UNPKG

ipink-util

Version:

util.js

80 lines (77 loc) 2.13 kB
import { HttpConfig } from './config.mjs'; import { genRequestUrl } from './request.mjs'; function createSSEConnection(options) { const { api, url, data = {}, headers, prefix = HttpConfig.api_prefix, // 前缀 success, fail, complete } = options || {}; const reqUrl = genRequestUrl(url || HttpConfig.base_url, api, prefix); const xhr = new XMLHttpRequest(); xhr.open("POST", reqUrl, true); xhr.setRequestHeader("Accept", "text/event-stream"); xhr.setRequestHeader("Cache-Control", "no-cache"); Object.keys(headers || {}).forEach((key) => { xhr.setRequestHeader(key, headers[key]); }); xhr.responseType = "text"; let buffer = ""; xhr.onprogress = function(e) { const newData = xhr.responseText.substring(buffer.length); if (newData) { buffer += newData; const lines = newData.split("\n"); for (const line of lines) { if (line.startsWith("data:")) { const eventData = line.substring(5).trim(); const data2 = handleSSEData(eventData); if (data2.event != "message_end") { success && success(data2); } else { success && success(data2); complete && complete(buffer); xhr && xhr.abort && xhr.abort(); } } } } else { success && success({}); complete && complete(buffer); } }; xhr.onerror = function(e) { console.error("SSE连接错误:"); fail && fail(e); complete && complete(); }; xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { console.log("SSE连接完成"); } else { console.log("SSE连接失败", xhr.status); fail && fail({ statusCode: xhr.status, errMsg: xhr.responseXML || xhr.responseText }); complete && complete(); } } }; xhr.send(JSON.stringify(data)); return xhr; } function handleSSEData(data) { try { return JSON.parse(data); } catch (e) { return { answer: "", event: "message" }; } } export { createSSEConnection };