@tsailab/xai
Version:
The loto-xai is an openai nodejs sdk compatible extension library.
75 lines • 2.53 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.xnodeSseFetchProxy = xnodeSseFetchProxy;
const eventsource_parser_1 = require("eventsource-parser");
const xnode_sse_error_1 = require("./xnode.sse.error");
const xnode_sse_types_1 = require("./xnode.sse.types");
const xnode_sse_util_1 = require("./xnode.sse.util");
async function xnodeSseFetchProxy(url, options, fetch = xnode_sse_types_1.fetch) {
const { eventType = 'message', onconnected, onend, onerror, onmessage, logwarn, ...fetchOptions } = options;
if (!url?.length) {
throw xnode_sse_error_1.XSseProxyError.createError(`Illegal parameter of url.`);
}
const res = await fetch(url, fetchOptions);
// error catched
if (!res.ok) {
let reason = '';
try {
reason = await res.text();
}
catch (err) {
reason = err?.message ?? res.statusText;
logwarn?.(err, reason);
}
const e = xnode_sse_error_1.XSseProxyError.createError(reason, res);
if (onerror) {
onerror(e);
}
else {
throw xnode_sse_error_1.XSseProxyError.createError(reason, res);
}
}
const parser = (0, eventsource_parser_1.createParser)({
onEvent: (em) => {
if (em.event === eventType && em.data) {
onmessage(em.data);
}
else {
// ignore
logwarn?.(em);
}
},
onError: (err) => {
logwarn?.(err);
onerror?.(err);
},
onComment: (comment) => {
logwarn?.(comment);
onend?.(comment);
},
});
const feed = (chunk) => {
parser.feed(chunk);
};
if (!res.body?.getReader) {
// Vercel polyfills `fetch` with `node-fetch`, which doesn't conform to
// web standards, so this is a workaround...
const body = res.body;
if (!body.on || !body.read) {
throw new xnode_sse_error_1.XSseProxyError(`Unsupport 'fetch' implemention`);
}
body.on('readable', () => {
let chunk;
while (null !== (chunk = body.read())) {
feed(chunk.toString());
}
});
}
else {
for await (const chunk of (0, xnode_sse_util_1.asyncStreamIterable)(res.body)) {
const str = new TextDecoder().decode(chunk);
feed(str);
}
}
}
//# sourceMappingURL=xnode.sse.fetch.js.map