fix(ui): распознавать CRLF и комментарии в потоке SSE
This commit is contained in:
1 parent
f50a29f116
commit
ed491c313f
8 files changed
+38
-15
No files matched your search
@@ -8,7 +8,7 @@ import { flowQuery } from "@/shared/api/traffic-flow"
|
||||
function parseSseBlock(block: string): { event: string; data: string } {
|
||||
let event = "message"
|
||||
const dataLines: string[] = []
|
||||
for (const line of block.split("\n")) {
|
||||
for (const line of block.split(/\r?\n/)) {
|
||||
if (line.startsWith("event:")) event = line.slice(6).trim()
|
||||
else if (line.startsWith("data:")) dataLines.push(line.slice(5).trim())
|
||||
}
|
||||
@@ -81,10 +81,10 @@ export function useFlowLive(opts: {
|
||||
if (ac.signal.aborted) return
|
||||
if (done) { setError("Поток live завершён"); break }
|
||||
buf += decoder.decode(value, { stream: true })
|
||||
const parts = buf.split("\n\n")
|
||||
const parts = buf.split(/\r?\n\r?\n/)
|
||||
buf = parts.pop() ?? ""
|
||||
for (const raw of parts) {
|
||||
if (!raw.trim() || raw.trim().startsWith(":")) continue
|
||||
if (!raw.trim()) continue
|
||||
const ev = parseSseBlock(raw)
|
||||
if (ev.event === "sample" && ev.data) {
|
||||
const parsed = JSON.parse(ev.data) as unknown
|
||||
|
||||
@@ -12,7 +12,7 @@ export interface TrafficLiveSample {
|
||||
function parseSseBlock(block: string): { event: string; data: string } {
|
||||
let event = "message"
|
||||
const dataLines: string[] = []
|
||||
for (const line of block.split("\n")) {
|
||||
for (const line of block.split(/\r?\n/)) {
|
||||
if (line.startsWith("event:")) event = line.slice(6).trim()
|
||||
else if (line.startsWith("data:")) dataLines.push(line.slice(5).trim())
|
||||
}
|
||||
@@ -74,10 +74,10 @@ export function useTrafficLive(opts: {
|
||||
break
|
||||
}
|
||||
buf += decoder.decode(value, { stream: true })
|
||||
const parts = buf.split("\n\n")
|
||||
const parts = buf.split(/\r?\n\r?\n/)
|
||||
buf = parts.pop() ?? ""
|
||||
for (const raw of parts) {
|
||||
if (!raw.trim() || raw.trim().startsWith(":")) continue
|
||||
if (!raw.trim()) continue
|
||||
const ev = parseSseBlock(raw)
|
||||
if (ev.event === "sample" && ev.data) {
|
||||
const parsed = JSON.parse(ev.data) as TrafficLiveSample
|
||||
|
||||
Reference in new issue
Block a user