ipink-util
Version:
util.js
80 lines (77 loc) • 2.13 kB
JavaScript
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 };