UNPKG

@tsailab/xai

Version:

The loto-xai is an openai nodejs sdk compatible extension library.

75 lines 2.53 kB
"use strict"; 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