@qorejs/qore 0.7.0 → 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.
Files changed (86) hide show
  1. package/README.md +170 -52
  2. package/dist/src/core/iterable.d.ts +1 -0
  3. package/dist/src/core/iterable.js +17 -0
  4. package/dist/src/core/response-runtime.d.ts +2 -0
  5. package/dist/src/core/response-runtime.js +233 -0
  6. package/dist/src/core/response-state.d.ts +3 -0
  7. package/dist/src/core/response-state.js +37 -0
  8. package/dist/src/core/response-types.d.ts +73 -0
  9. package/dist/src/core/response-types.js +1 -0
  10. package/dist/src/core/response.d.ts +4 -0
  11. package/dist/src/core/response.js +26 -0
  12. package/dist/src/core/signal-context.d.ts +10 -0
  13. package/dist/src/core/signal-context.js +69 -0
  14. package/dist/src/core/signal-nodes.d.ts +45 -0
  15. package/dist/src/core/signal-nodes.js +197 -0
  16. package/dist/src/core/signal-scheduler.d.ts +2 -0
  17. package/dist/src/core/signal-scheduler.js +19 -0
  18. package/dist/src/core/signal-types.d.ts +19 -0
  19. package/dist/src/core/signal-types.js +1 -0
  20. package/dist/src/core/signal.d.ts +19 -0
  21. package/dist/src/core/signal.js +41 -0
  22. package/dist/src/core/stream-backpressure.d.ts +3 -0
  23. package/dist/src/core/stream-backpressure.js +36 -0
  24. package/dist/src/core/stream-buffer.d.ts +17 -0
  25. package/dist/src/core/stream-buffer.js +162 -0
  26. package/dist/src/core/stream-iterator.d.ts +6 -0
  27. package/dist/src/core/stream-iterator.js +14 -0
  28. package/dist/src/core/stream-lifecycle.d.ts +10 -0
  29. package/dist/src/core/stream-lifecycle.js +28 -0
  30. package/dist/src/core/stream-queue.d.ts +17 -0
  31. package/dist/src/core/stream-queue.js +62 -0
  32. package/dist/src/core/stream-runtime.d.ts +2 -0
  33. package/dist/src/core/stream-runtime.js +127 -0
  34. package/dist/src/core/stream-source.d.ts +2 -0
  35. package/dist/src/core/stream-source.js +28 -0
  36. package/dist/src/core/stream-state.d.ts +4 -0
  37. package/dist/src/core/stream-state.js +20 -0
  38. package/dist/src/core/stream-types.d.ts +61 -0
  39. package/dist/src/core/stream-types.js +1 -0
  40. package/dist/src/core/stream.d.ts +11 -0
  41. package/dist/src/core/stream.js +90 -0
  42. package/dist/src/dom/app.d.ts +38 -0
  43. package/dist/src/dom/app.js +102 -0
  44. package/dist/src/dom/dom.d.ts +13 -0
  45. package/dist/src/dom/dom.js +197 -0
  46. package/dist/src/dom/properties.d.ts +3 -0
  47. package/dist/src/dom/properties.js +147 -0
  48. package/dist/src/dom/reactive.d.ts +6 -0
  49. package/dist/src/dom/reactive.js +14 -0
  50. package/dist/src/dom/response-view.d.ts +4 -0
  51. package/dist/src/dom/response-view.js +37 -0
  52. package/dist/src/dom/scope.d.ts +10 -0
  53. package/dist/src/dom/scope.js +49 -0
  54. package/dist/src/dom/types.d.ts +34 -0
  55. package/dist/src/dom/types.js +1 -0
  56. package/dist/src/index.d.ts +16 -0
  57. package/dist/src/index.js +10 -0
  58. package/dist/src/providers/anthropic.d.ts +2 -0
  59. package/dist/src/providers/anthropic.js +102 -0
  60. package/dist/src/providers/openai.d.ts +2 -0
  61. package/dist/src/providers/openai.js +96 -0
  62. package/dist/src/providers/sse-adapter.d.ts +2 -0
  63. package/dist/src/providers/sse-adapter.js +83 -0
  64. package/dist/src/providers/sse-env.d.ts +4 -0
  65. package/dist/src/providers/sse-env.js +33 -0
  66. package/dist/src/providers/sse-parser.d.ts +5 -0
  67. package/dist/src/providers/sse-parser.js +99 -0
  68. package/dist/src/providers/sse.d.ts +4 -0
  69. package/dist/src/providers/sse.js +3 -0
  70. package/dist/src/providers/types.d.ts +94 -0
  71. package/dist/src/providers/types.js +1 -0
  72. package/dist/src/shared/utils.d.ts +2 -0
  73. package/dist/src/shared/utils.js +32 -0
  74. package/package.json +25 -11
  75. package/src/anthropic.js +0 -122
  76. package/src/app.js +0 -123
  77. package/src/dom.js +0 -527
  78. package/src/index.d.ts +0 -405
  79. package/src/index.js +0 -10
  80. package/src/iterable.js +0 -20
  81. package/src/openai.js +0 -112
  82. package/src/response.js +0 -312
  83. package/src/signal.js +0 -328
  84. package/src/sse.js +0 -264
  85. package/src/stream.js +0 -582
  86. 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
- }