UNPKG

@sentool/fetch-event-source

Version:

Using the Fetch API to request an SSE endpoint.

1 lines 8.02 kB
{"version":3,"file":"index.cjs","sources":["../src/parse.js","../src/fetch.js"],"sourcesContent":["/**\n * SSE 文本解析\n * @param {string} chunk - decode 后的 SSE 格式数据块\n * @param {Function} callback\n * @param {Object} instance\n */\nfunction eventsourceParser(chunk, callback, options = {}) {\n let message = {};\n const {\n instance = eventsourceParser,\n parseJson = true\n } = options;\n const buffer = (instance.buffer || '') + chunk;\n const lines = buffer.split('\\n');\n const onMessage = (message) => callback?.(message);\n\n // SSE 规范要求每个事件使用空行即 \\n\\n 进行分割\n // 移除最后一行,若事件完整则为空行,若事件不完整则留作下次处理\n instance.buffer = lines.pop();\n\n // 若数据为空则直接返回\n if (lines.length === 0) {\n return onMessage(message, 0);\n }\n\n // 解析原始数据\n lines.forEach((item) => {\n // 空行表示一个完整事件的结束\n if (item.trim() === '') {\n // 是否自动解析 JSON\n if (parseJson) {\n try {\n message.data = JSON.parse(message.data);\n } catch(e) {}\n }\n onMessage(message); // 返回数据\n message = {}; // 重置事件返回的数据\n } else {\n const fieleLength = item.indexOf(':');\n const field = item.substring(0, fieleLength).trim();\n const value = item.substring(fieleLength + 1).trim();\n\n // 处理数据\n if (field) {\n switch (field) {\n case 'data':\n message.data = value;\n break;\n default: // id, event, retry\n message[field] = /^\\d+$/.test(value) ? parseInt(value) : value;\n }\n }\n }\n });\n};\n\nexport default eventsourceParser;\n","import eventsourceParser from './parse.js';\n\nclass FetchEventSource {\n constructor() {\n this.controller = new AbortController();\n }\n\n /**\n * 发起请求\n * @param {string} url\n * @param {Object} options\n */\n async fetch( url, options = {} ) {\n const {\n headers,\n signal = this.controller.signal,\n parseJson = true\n } = options;\n\n // 默认 headers\n options.headers = {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"text/event-stream\",\n ...headers,\n };\n\n try {\n const response = await fetch(url, {\n signal,\n ...options,\n });\n\n await options.onopen?.(response);\n\n // 响应异常\n if (!response.ok) {\n const contentType = response.headers.get('content-type');\n const ACCEPT = options.headers['Accept'];\n if (!String(contentType).startsWith(ACCEPT)) {\n console.error(`Expected content-type to be ${ACCEPT}, Actual: ${contentType}`);\n }\n throw new Error(`HTTP ${response.status}`);\n }\n\n // 读取流\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n async function readStream() {\n const { done, value } = await reader.read();\n\n // DONE\n if (done) return options.done?.(response);\n\n const chunk = decoder.decode(value); // 解码 Uint8Array\n eventsourceParser(chunk, options.onmessage, { instance: this, parseJson }); // 解析 SSE 数据格式\n\n await readStream();\n }\n await readStream();\n } catch(error) {\n this.abort();\n delete this.buffer;\n options.onerror?.(error);\n }\n }\n\n // 中断请求\n abort() {\n this.controller.abort();\n }\n}\n\n// 创建实例\nexport async function fetchEventSource(...args) {\n const eventSource = new FetchEventSource();\n await eventSource.fetch(...args);\n return eventSource;\n};\n\nexport { eventsourceParser };\n"],"names":["eventsourceParser","chunk","callback","options","message","instance","parseJson","buffer","lines","split","onMessage","pop","length","forEach","item","trim","data","JSON","parse","e","fieleLength","indexOf","field","substring","value","test","parseInt","FetchEventSource","constructor","controller","AbortController","fetch","url","headers","signal","response","onopen","ok","contentType","get","ACCEPT","String","startsWith","console","error","Error","status","reader","body","getReader","decoder","TextDecoder","readStream","done","read","decode","onmessage","abort","onerror","fetchEventSource","args","eventSource"],"mappings":"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"}