@qorejs/qore 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +120 -3
- package/dist/src/core/iterable.d.ts +1 -0
- package/dist/src/core/iterable.js +17 -0
- package/dist/src/core/response-runtime.d.ts +2 -0
- package/dist/src/core/response-runtime.js +233 -0
- package/dist/src/core/response-state.d.ts +3 -0
- package/dist/src/core/response-state.js +37 -0
- package/dist/src/core/response-types.d.ts +73 -0
- package/dist/src/core/response-types.js +1 -0
- package/dist/src/core/response.d.ts +4 -0
- package/dist/src/core/response.js +26 -0
- package/dist/src/core/signal-context.d.ts +10 -0
- package/dist/src/core/signal-context.js +69 -0
- package/dist/src/core/signal-nodes.d.ts +45 -0
- package/dist/src/core/signal-nodes.js +197 -0
- package/dist/src/core/signal-scheduler.d.ts +2 -0
- package/dist/src/core/signal-scheduler.js +19 -0
- package/dist/src/core/signal-types.d.ts +19 -0
- package/dist/src/core/signal-types.js +1 -0
- package/dist/src/core/signal.d.ts +19 -0
- package/dist/src/core/signal.js +41 -0
- package/dist/src/core/stream-backpressure.d.ts +3 -0
- package/dist/src/core/stream-backpressure.js +36 -0
- package/dist/src/core/stream-buffer.d.ts +17 -0
- package/dist/src/core/stream-buffer.js +162 -0
- package/dist/src/core/stream-iterator.d.ts +6 -0
- package/dist/src/core/stream-iterator.js +14 -0
- package/dist/src/core/stream-lifecycle.d.ts +10 -0
- package/dist/src/core/stream-lifecycle.js +28 -0
- package/dist/src/core/stream-queue.d.ts +17 -0
- package/dist/src/core/stream-queue.js +62 -0
- package/dist/src/core/stream-runtime.d.ts +2 -0
- package/dist/src/core/stream-runtime.js +127 -0
- package/dist/src/core/stream-source.d.ts +2 -0
- package/dist/src/core/stream-source.js +28 -0
- package/dist/src/core/stream-state.d.ts +4 -0
- package/dist/src/core/stream-state.js +20 -0
- package/dist/src/core/stream-types.d.ts +61 -0
- package/dist/src/core/stream-types.js +1 -0
- package/dist/src/core/stream.d.ts +11 -0
- package/dist/src/core/stream.js +90 -0
- package/dist/src/dom/app.d.ts +38 -0
- package/dist/src/dom/app.js +102 -0
- package/dist/src/dom/dom.d.ts +13 -0
- package/dist/src/dom/dom.js +197 -0
- package/dist/src/dom/properties.d.ts +3 -0
- package/dist/src/dom/properties.js +147 -0
- package/dist/src/dom/reactive.d.ts +6 -0
- package/dist/src/dom/reactive.js +14 -0
- package/dist/src/dom/response-view.d.ts +4 -0
- package/dist/src/dom/response-view.js +37 -0
- package/dist/src/dom/scope.d.ts +10 -0
- package/dist/src/dom/scope.js +49 -0
- package/dist/src/dom/types.d.ts +34 -0
- package/dist/src/dom/types.js +1 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.js +10 -0
- package/dist/src/providers/anthropic.d.ts +2 -0
- package/dist/src/providers/anthropic.js +102 -0
- package/dist/src/providers/openai.d.ts +2 -0
- package/dist/src/providers/openai.js +96 -0
- package/dist/src/providers/sse-adapter.d.ts +2 -0
- package/dist/src/providers/sse-adapter.js +83 -0
- package/dist/src/providers/sse-env.d.ts +4 -0
- package/dist/src/providers/sse-env.js +33 -0
- package/dist/src/providers/sse-parser.d.ts +5 -0
- package/dist/src/providers/sse-parser.js +99 -0
- package/dist/src/providers/sse.d.ts +4 -0
- package/dist/src/providers/sse.js +3 -0
- package/dist/src/providers/types.d.ts +94 -0
- package/dist/src/providers/types.js +1 -0
- package/dist/src/shared/utils.d.ts +2 -0
- package/dist/src/shared/utils.js +32 -0
- package/package.json +25 -11
- package/src/anthropic.js +0 -122
- package/src/app.js +0 -123
- package/src/dom.js +0 -527
- package/src/index.d.ts +0 -405
- package/src/index.js +0 -10
- package/src/iterable.js +0 -20
- package/src/openai.js +0 -112
- package/src/response.js +0 -312
- package/src/signal.js +0 -328
- package/src/sse.js +0 -264
- package/src/stream.js +0 -582
- package/src/utils.js +0 -39
package/src/sse.js
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
import { normalizeError } from './utils.js';
|
|
2
|
-
|
|
3
|
-
// Read environment variables without assuming a Node-only runtime.
|
|
4
|
-
export function readEnv(name) {
|
|
5
|
-
return typeof process !== 'undefined' && process?.env
|
|
6
|
-
? process.env[name]
|
|
7
|
-
: undefined;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
// Read one JSON or text error body so adapter failures surface clearly.
|
|
11
|
-
export async function readErrorBody(response) {
|
|
12
|
-
const contentType = response.headers.get('content-type') ?? '';
|
|
13
|
-
|
|
14
|
-
if (contentType.includes('application/json')) {
|
|
15
|
-
try {
|
|
16
|
-
const body = await response.json();
|
|
17
|
-
return body?.error?.message ?? body?.message ?? JSON.stringify(body);
|
|
18
|
-
} catch {
|
|
19
|
-
return `${response.status} ${response.statusText}`.trim();
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
try {
|
|
24
|
-
const text = await response.text();
|
|
25
|
-
return text || `${response.status} ${response.statusText}`.trim();
|
|
26
|
-
} catch {
|
|
27
|
-
return `${response.status} ${response.statusText}`.trim();
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Merge headers while allowing per-request overrides.
|
|
32
|
-
export function mergeHeaders(baseHeaders = {}, nextHeaders = {}) {
|
|
33
|
-
return {
|
|
34
|
-
...baseHeaders,
|
|
35
|
-
...nextHeaders
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Parse server-sent events without adding any transport dependency.
|
|
40
|
-
export async function* readSSE(body) {
|
|
41
|
-
const reader = body.getReader();
|
|
42
|
-
const decoder = new TextDecoder();
|
|
43
|
-
let buffer = '';
|
|
44
|
-
let eventName = 'message';
|
|
45
|
-
let eventId = null;
|
|
46
|
-
let retry = null;
|
|
47
|
-
let data = [];
|
|
48
|
-
|
|
49
|
-
const flushEvent = () => {
|
|
50
|
-
if (data.length === 0) {
|
|
51
|
-
eventName = 'message';
|
|
52
|
-
eventId = null;
|
|
53
|
-
retry = null;
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const nextEvent = {
|
|
58
|
-
event: eventName,
|
|
59
|
-
id: eventId,
|
|
60
|
-
retry,
|
|
61
|
-
data: data.join('\n')
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
eventName = 'message';
|
|
65
|
-
eventId = null;
|
|
66
|
-
retry = null;
|
|
67
|
-
data = [];
|
|
68
|
-
|
|
69
|
-
return nextEvent;
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
while (true) {
|
|
73
|
-
const { value, done } = await reader.read();
|
|
74
|
-
buffer += decoder.decode(value ?? new Uint8Array(), { stream: !done });
|
|
75
|
-
|
|
76
|
-
const lines = buffer.split(/\r?\n/);
|
|
77
|
-
buffer = lines.pop() ?? '';
|
|
78
|
-
|
|
79
|
-
for (const line of lines) {
|
|
80
|
-
if (!line) {
|
|
81
|
-
const nextEvent = flushEvent();
|
|
82
|
-
|
|
83
|
-
if (nextEvent) {
|
|
84
|
-
yield nextEvent;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
continue;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (line.startsWith(':')) {
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const separator = line.indexOf(':');
|
|
95
|
-
const field = separator === -1 ? line : line.slice(0, separator);
|
|
96
|
-
const rawValue = separator === -1 ? '' : line.slice(separator + 1).replace(/^ /, '');
|
|
97
|
-
|
|
98
|
-
switch (field) {
|
|
99
|
-
case 'event':
|
|
100
|
-
eventName = rawValue || 'message';
|
|
101
|
-
break;
|
|
102
|
-
case 'data':
|
|
103
|
-
data.push(rawValue);
|
|
104
|
-
break;
|
|
105
|
-
case 'id':
|
|
106
|
-
eventId = rawValue;
|
|
107
|
-
break;
|
|
108
|
-
case 'retry': {
|
|
109
|
-
const parsedRetry = Number.parseInt(rawValue, 10);
|
|
110
|
-
retry = Number.isNaN(parsedRetry) ? null : parsedRetry;
|
|
111
|
-
break;
|
|
112
|
-
}
|
|
113
|
-
default:
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
if (done) {
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const finalEvent = flushEvent();
|
|
124
|
-
|
|
125
|
-
if (finalEvent) {
|
|
126
|
-
yield finalEvent;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Default to JSON payloads when possible, otherwise preserve the raw text event body.
|
|
131
|
-
function parseEventData(data) {
|
|
132
|
-
try {
|
|
133
|
-
return JSON.parse(data);
|
|
134
|
-
} catch {
|
|
135
|
-
return data;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Surface provider-side SSE error objects through one shared fallback.
|
|
140
|
-
function isErrorEvent(event) {
|
|
141
|
-
return Boolean(event.data && typeof event.data === 'object' && event.data.type === 'error');
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Pull a human-readable message from common SSE error shapes.
|
|
145
|
-
function getErrorMessage(event, name) {
|
|
146
|
-
if (event.data && typeof event.data === 'object') {
|
|
147
|
-
return event.data.error?.message ?? event.data.message ?? `${name} streaming error`;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return `${name} streaming error`;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Expose a generic SSE adapter so Qore can integrate with any token-streaming endpoint.
|
|
154
|
-
export function createSSEAdapter(options = {}) {
|
|
155
|
-
const {
|
|
156
|
-
name = 'SSE',
|
|
157
|
-
url: defaultURL,
|
|
158
|
-
method: defaultMethod = 'POST',
|
|
159
|
-
headers: defaultHeaders = {},
|
|
160
|
-
fetch: fetchImpl = globalThis.fetch,
|
|
161
|
-
buildRequest = null,
|
|
162
|
-
buildChatRequest = null,
|
|
163
|
-
parse = parseEventData,
|
|
164
|
-
isError = isErrorEvent,
|
|
165
|
-
getError = getErrorMessage,
|
|
166
|
-
eventToText = (event) => typeof event.data === 'string' ? event.data : undefined
|
|
167
|
-
} = options;
|
|
168
|
-
|
|
169
|
-
if (typeof fetchImpl !== 'function') {
|
|
170
|
-
throw new Error(`Qore ${name} adapter requires fetch in the current runtime`);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
async function* stream(request = {}, requestOptions = {}) {
|
|
174
|
-
const builtRequest = buildRequest
|
|
175
|
-
? await buildRequest(request, requestOptions)
|
|
176
|
-
: request;
|
|
177
|
-
|
|
178
|
-
const requestConfig = builtRequest && typeof builtRequest === 'object' && !Array.isArray(builtRequest)
|
|
179
|
-
? builtRequest
|
|
180
|
-
: { body: builtRequest };
|
|
181
|
-
const {
|
|
182
|
-
url = defaultURL,
|
|
183
|
-
method = defaultMethod,
|
|
184
|
-
headers: requestHeaders = {},
|
|
185
|
-
signal: requestSignal,
|
|
186
|
-
...init
|
|
187
|
-
} = requestConfig;
|
|
188
|
-
const {
|
|
189
|
-
signal: overrideSignal,
|
|
190
|
-
headers: overrideHeaders = {}
|
|
191
|
-
} = requestOptions;
|
|
192
|
-
|
|
193
|
-
if (!url) {
|
|
194
|
-
throw new Error(`Qore ${name} adapter requires a request URL`);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
const response = await fetchImpl(url, {
|
|
198
|
-
method,
|
|
199
|
-
signal: requestSignal ?? overrideSignal,
|
|
200
|
-
headers: mergeHeaders(defaultHeaders, mergeHeaders(requestHeaders, overrideHeaders)),
|
|
201
|
-
...init
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
if (!response.ok) {
|
|
205
|
-
throw new Error(await readErrorBody(response));
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
if (!response.body) {
|
|
209
|
-
throw new Error(`${name} streaming response did not include a readable body`);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
for await (const rawEvent of readSSE(response.body)) {
|
|
213
|
-
if (!rawEvent.data || rawEvent.data === '[DONE]') {
|
|
214
|
-
continue;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
let parsedEvent;
|
|
218
|
-
|
|
219
|
-
try {
|
|
220
|
-
parsedEvent = await parse(rawEvent.data, rawEvent);
|
|
221
|
-
} catch (error) {
|
|
222
|
-
throw normalizeError(error);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const nextEvent = {
|
|
226
|
-
...rawEvent,
|
|
227
|
-
data: parsedEvent
|
|
228
|
-
};
|
|
229
|
-
|
|
230
|
-
if (await isError(nextEvent)) {
|
|
231
|
-
throw new Error(await getError(nextEvent, name));
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
yield nextEvent;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
async function* streamText(request = {}, requestOptions = {}) {
|
|
239
|
-
for await (const event of stream(request, requestOptions)) {
|
|
240
|
-
const nextText = await eventToText(event, request, requestOptions);
|
|
241
|
-
|
|
242
|
-
if (typeof nextText === 'string') {
|
|
243
|
-
yield nextText;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
return {
|
|
249
|
-
// Stream parsed SSE events from an arbitrary HTTP endpoint.
|
|
250
|
-
stream,
|
|
251
|
-
|
|
252
|
-
// Stream only the text payload selected by the adapter's eventToText mapping.
|
|
253
|
-
streamText,
|
|
254
|
-
|
|
255
|
-
// Offer the same narrative shape as provider SDKs when buildChatRequest is supplied.
|
|
256
|
-
chat(input, requestOptions = {}) {
|
|
257
|
-
if (typeof buildChatRequest !== 'function') {
|
|
258
|
-
throw new Error(`Qore ${name} adapter does not define chat(). Use stream() or streamText() instead.`);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
return streamText(buildChatRequest(input, requestOptions), requestOptions);
|
|
262
|
-
}
|
|
263
|
-
};
|
|
264
|
-
}
|