(options: {
url: string
method?: 'GET' | 'POST'
body?: unknown
signal?: AbortSignal
onProgress?: (data: unknown) => void
resultEvent?: string
})
| 79 | * 便捷方法:发起 SSE 请求,按 event type 分发解析后的 JSON。 |
| 80 | */ |
| 81 | export async function fetchSSEWithHandlers<TResult = unknown>(options: { |
| 82 | url: string |
| 83 | method?: 'GET' | 'POST' |
| 84 | body?: unknown |
| 85 | signal?: AbortSignal |
| 86 | onProgress?: (data: unknown) => void |
| 87 | resultEvent?: string |
| 88 | }): Promise<TResult> { |
| 89 | const { url, method, body, signal, onProgress, resultEvent = 'result' } = options |
| 90 | |
| 91 | return new Promise<TResult>((resolve, reject) => { |
| 92 | let resolved = false |
| 93 | |
| 94 | fetchSSE({ |
| 95 | url, |
| 96 | method, |
| 97 | body, |
| 98 | signal, |
| 99 | onEvent: ({ event, data }) => { |
| 100 | try { |
| 101 | const parsed = JSON.parse(data) |
| 102 | if (event === resultEvent) { |
| 103 | resolved = true |
| 104 | resolve(parsed as TResult) |
| 105 | } else if (event === 'progress' && onProgress) { |
| 106 | onProgress(parsed) |
| 107 | } |
| 108 | } catch { |
| 109 | // skip malformed JSON |
| 110 | } |
| 111 | }, |
| 112 | }) |
| 113 | .then(() => { |
| 114 | if (!resolved) reject(new Error('SSE stream ended without result event')) |
| 115 | }) |
| 116 | .catch(reject) |
| 117 | }) |
| 118 | } |
nothing calls this directly
no test coverage detected