@restless-stream/core 0.1.0
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/dist/index.cjs +539 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +361 -0
- package/dist/index.d.ts +361 -0
- package/dist/index.js +498 -0
- package/dist/index.js.map +1 -0
- package/package.json +31 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
// src/websocket.ts
|
|
2
|
+
var CLOSED = 3;
|
|
3
|
+
var getGlobalWebSocket = () => typeof globalThis.WebSocket === "function" ? globalThis.WebSocket : void 0;
|
|
4
|
+
async function* streamWebSocket(options) {
|
|
5
|
+
const WebSocketCtor = options.WebSocket ?? getGlobalWebSocket();
|
|
6
|
+
if (WebSocketCtor === void 0) throw new Error("WebSocket is not available in this environment.");
|
|
7
|
+
if (options.signal?.aborted) return;
|
|
8
|
+
const socket = new WebSocketCtor(options.url, options.protocols);
|
|
9
|
+
const queue = [];
|
|
10
|
+
const waiters = [];
|
|
11
|
+
let closed = false;
|
|
12
|
+
let failure;
|
|
13
|
+
const wake = () => waiters.shift()?.();
|
|
14
|
+
const waitForMessage = async () => new Promise((resolve) => waiters.push(resolve));
|
|
15
|
+
socket.onmessage = (event) => {
|
|
16
|
+
queue.push(parseMessage(event.data));
|
|
17
|
+
wake();
|
|
18
|
+
};
|
|
19
|
+
socket.onerror = (event) => {
|
|
20
|
+
failure = event;
|
|
21
|
+
closed = true;
|
|
22
|
+
wake();
|
|
23
|
+
};
|
|
24
|
+
socket.onclose = () => {
|
|
25
|
+
closed = true;
|
|
26
|
+
wake();
|
|
27
|
+
};
|
|
28
|
+
const abort = () => {
|
|
29
|
+
closed = true;
|
|
30
|
+
if (socket.readyState !== CLOSED) socket.close();
|
|
31
|
+
wake();
|
|
32
|
+
};
|
|
33
|
+
options.signal?.addEventListener("abort", abort, { once: true });
|
|
34
|
+
try {
|
|
35
|
+
while (!closed || queue.length > 0) {
|
|
36
|
+
const next = queue.shift();
|
|
37
|
+
if (next !== void 0) {
|
|
38
|
+
yield next;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (closed) break;
|
|
42
|
+
await waitForMessage();
|
|
43
|
+
}
|
|
44
|
+
if (failure !== void 0 && !options.signal?.aborted) throw failure;
|
|
45
|
+
} finally {
|
|
46
|
+
options.signal?.removeEventListener("abort", abort);
|
|
47
|
+
if (socket.readyState !== CLOSED) socket.close();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
var parseMessage = (data) => {
|
|
51
|
+
if (typeof data !== "string") return String(data);
|
|
52
|
+
try {
|
|
53
|
+
return JSON.parse(data);
|
|
54
|
+
} catch {
|
|
55
|
+
return data;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// src/client-utils.ts
|
|
60
|
+
var appendApiKeyQueryParam = (url, apiKey) => {
|
|
61
|
+
const trimmedApiKey = apiKey?.trim();
|
|
62
|
+
if (trimmedApiKey === void 0 || trimmedApiKey === "") return url;
|
|
63
|
+
const parsed = new URL(url);
|
|
64
|
+
parsed.searchParams.set("apiKey", trimmedApiKey);
|
|
65
|
+
return parsed.toString();
|
|
66
|
+
};
|
|
67
|
+
var toRuntimeOptions = (cursor, since) => {
|
|
68
|
+
const options = {};
|
|
69
|
+
if (cursor !== void 0) options.cursor = cursor;
|
|
70
|
+
if (since !== void 0) options.since = since;
|
|
71
|
+
return options;
|
|
72
|
+
};
|
|
73
|
+
var toQuery = (input) => {
|
|
74
|
+
const params = new URLSearchParams();
|
|
75
|
+
if (input.limit !== void 0) params.set("limit", String(input.limit));
|
|
76
|
+
if (input.offset !== void 0) params.set("offset", String(input.offset));
|
|
77
|
+
const query = params.toString();
|
|
78
|
+
return query === "" ? "" : `?${query}`;
|
|
79
|
+
};
|
|
80
|
+
var readResponseBody = async (response) => {
|
|
81
|
+
const text = await response.text();
|
|
82
|
+
if (text === "") return void 0;
|
|
83
|
+
try {
|
|
84
|
+
return JSON.parse(text);
|
|
85
|
+
} catch {
|
|
86
|
+
return text;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
var extractErrorMessage = (body) => {
|
|
90
|
+
if (body === null || body === void 0 || typeof body !== "object") return void 0;
|
|
91
|
+
const maybeMessage = body.message;
|
|
92
|
+
if (typeof maybeMessage === "string") return maybeMessage;
|
|
93
|
+
if (Array.isArray(maybeMessage)) return maybeMessage.join(", ");
|
|
94
|
+
const maybeError = body.error;
|
|
95
|
+
return typeof maybeError === "string" ? maybeError : void 0;
|
|
96
|
+
};
|
|
97
|
+
var subscribeWebSocketUrl = (url, iterableOptions = {}) => streamWebSocket({ ...iterableOptions, url });
|
|
98
|
+
|
|
99
|
+
// src/errors.ts
|
|
100
|
+
var RestlessApiError = class extends Error {
|
|
101
|
+
status;
|
|
102
|
+
statusText;
|
|
103
|
+
body;
|
|
104
|
+
headers;
|
|
105
|
+
constructor(response, body, message) {
|
|
106
|
+
super(message ?? `Restless API request failed with HTTP ${response.status}`);
|
|
107
|
+
this.name = "RestlessApiError";
|
|
108
|
+
this.status = response.status;
|
|
109
|
+
this.statusText = response.statusText;
|
|
110
|
+
this.body = body;
|
|
111
|
+
this.headers = response.headers;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// src/urls.ts
|
|
116
|
+
var DEFAULT_STREAM_BASE_URL = "https://stream.restlessapi.stream";
|
|
117
|
+
var normalizeBaseUrl = (baseUrl) => {
|
|
118
|
+
const trimmed = baseUrl.trim();
|
|
119
|
+
return trimmed.endsWith("/") ? trimmed.slice(0, -1) : trimmed;
|
|
120
|
+
};
|
|
121
|
+
var toWebSocketStreamUrl = (sseUrl) => {
|
|
122
|
+
const trimmedUrl = sseUrl.trim();
|
|
123
|
+
if (trimmedUrl === "") return "";
|
|
124
|
+
const parsed = new URL(trimmedUrl);
|
|
125
|
+
if (parsed.protocol === "http:") parsed.protocol = "ws:";
|
|
126
|
+
if (parsed.protocol === "https:") parsed.protocol = "wss:";
|
|
127
|
+
const pathname = parsed.pathname.endsWith("/") ? parsed.pathname.slice(0, -1) : parsed.pathname;
|
|
128
|
+
parsed.pathname = pathname.endsWith("/ws") ? pathname : `${pathname}/ws`;
|
|
129
|
+
return parsed.toString();
|
|
130
|
+
};
|
|
131
|
+
var buildSseUrl = (baseUrl, identifier, options = {}) => {
|
|
132
|
+
const url = new URL(normalizeBaseUrl(baseUrl ?? DEFAULT_STREAM_BASE_URL));
|
|
133
|
+
if ("streamId" in identifier) {
|
|
134
|
+
url.searchParams.set("streamId", identifier.streamId);
|
|
135
|
+
} else {
|
|
136
|
+
url.searchParams.set("sessionId", identifier.sessionId);
|
|
137
|
+
}
|
|
138
|
+
appendCursorParams(url.searchParams, options);
|
|
139
|
+
return url.toString();
|
|
140
|
+
};
|
|
141
|
+
var buildWebSocketUrl = (baseUrl, identifier, options = {}) => toWebSocketStreamUrl(buildSseUrl(baseUrl, identifier, options));
|
|
142
|
+
var buildDirectSseUrl = (baseUrl, input, options = {}) => {
|
|
143
|
+
const url = new URL(normalizeBaseUrl(baseUrl ?? DEFAULT_STREAM_BASE_URL));
|
|
144
|
+
url.searchParams.set("url", input.url.trim());
|
|
145
|
+
appendDirectQueryParams(url.searchParams, input);
|
|
146
|
+
appendCursorParams(url.searchParams, options);
|
|
147
|
+
return url.toString();
|
|
148
|
+
};
|
|
149
|
+
var buildDirectWebSocketUrl = (baseUrl, input, options = {}) => toWebSocketStreamUrl(buildDirectSseUrl(baseUrl, input, options));
|
|
150
|
+
var appendDirectQueryParams = (params, input) => {
|
|
151
|
+
const method = input.method?.trim().toUpperCase();
|
|
152
|
+
if (method !== void 0 && method !== "" && method !== "GET") params.set("method", method);
|
|
153
|
+
appendJsonParam(params, "headers", input.headers);
|
|
154
|
+
appendJsonParam(params, "body", input.body);
|
|
155
|
+
appendTrimmedParam(params, "jq", input.jqFilter);
|
|
156
|
+
appendNumberParam(params, "pollingInterval", input.pollingInterval);
|
|
157
|
+
if (input.pollingStrategies !== void 0 && input.pollingStrategies.length > 0) {
|
|
158
|
+
params.set("pollingStrategies", JSON.stringify(input.pollingStrategies));
|
|
159
|
+
}
|
|
160
|
+
const payloadMode = input.payloadMode?.trim().toUpperCase();
|
|
161
|
+
if (payloadMode !== void 0 && payloadMode !== "" && payloadMode !== "FULL_DATA")
|
|
162
|
+
params.set("payloadMode", payloadMode);
|
|
163
|
+
appendTrimmedParam(params, "apiKey", input.apiKey);
|
|
164
|
+
};
|
|
165
|
+
var withRuntimeCursor = (url, options) => {
|
|
166
|
+
const parsed = new URL(url);
|
|
167
|
+
appendCursorParams(parsed.searchParams, options);
|
|
168
|
+
return parsed.toString();
|
|
169
|
+
};
|
|
170
|
+
var appendCursorParams = (params, options) => {
|
|
171
|
+
appendTrimmedParam(params, "cursor", options.cursor);
|
|
172
|
+
appendTrimmedParam(params, "since", options.since);
|
|
173
|
+
};
|
|
174
|
+
var appendJsonParam = (params, key, value) => {
|
|
175
|
+
if (value !== void 0 && Object.keys(value).length > 0) params.set(key, JSON.stringify(value));
|
|
176
|
+
};
|
|
177
|
+
var appendNumberParam = (params, key, value) => {
|
|
178
|
+
if (value !== void 0 && Number.isFinite(value) && value > 0) params.set(key, String(Math.floor(value)));
|
|
179
|
+
};
|
|
180
|
+
var appendTrimmedParam = (params, key, value) => {
|
|
181
|
+
const trimmed = value?.toString().trim();
|
|
182
|
+
if (trimmed !== void 0 && trimmed !== "") params.set(key, trimmed);
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
// src/sse.ts
|
|
186
|
+
var DEFAULT_RECONNECT_DELAY_MS = 1e3;
|
|
187
|
+
var DEFAULT_MAX_RECONNECT_DELAY_MS = 3e4;
|
|
188
|
+
async function* streamSse(options) {
|
|
189
|
+
const fetchImpl = options.fetch ?? getGlobalFetch();
|
|
190
|
+
if (fetchImpl === void 0) throw new Error("fetch is not available in this environment.");
|
|
191
|
+
let url = withRuntimeCursor(options.url, cursorOptions(options));
|
|
192
|
+
let lastEventId;
|
|
193
|
+
let reconnectDelayMs = options.reconnectDelayMs ?? DEFAULT_RECONNECT_DELAY_MS;
|
|
194
|
+
const maxReconnectDelayMs = options.maxReconnectDelayMs ?? DEFAULT_MAX_RECONNECT_DELAY_MS;
|
|
195
|
+
while (!options.signal?.aborted) {
|
|
196
|
+
try {
|
|
197
|
+
const headers = new Headers(options.headers);
|
|
198
|
+
headers.set("Accept", "text/event-stream");
|
|
199
|
+
if (hasText(lastEventId)) headers.set("Last-Event-ID", lastEventId);
|
|
200
|
+
const init = { headers };
|
|
201
|
+
if (options.signal) init.signal = options.signal;
|
|
202
|
+
const response = await fetchImpl(url, init);
|
|
203
|
+
if (!response.ok) throw new Error(`SSE request failed with HTTP ${response.status}.`);
|
|
204
|
+
if (!response.body) throw new Error("SSE response body is not readable.");
|
|
205
|
+
for await (const message of parseSseStream(response.body)) {
|
|
206
|
+
if (hasText(message.id)) {
|
|
207
|
+
lastEventId = message.id;
|
|
208
|
+
url = withRuntimeCursor(options.url, { cursor: lastEventId });
|
|
209
|
+
}
|
|
210
|
+
if (message.retry !== void 0) reconnectDelayMs = message.retry;
|
|
211
|
+
if (message.data !== "") yield message;
|
|
212
|
+
}
|
|
213
|
+
} catch (error) {
|
|
214
|
+
if (options.signal?.aborted) return;
|
|
215
|
+
if (options.reconnect === false) throw error;
|
|
216
|
+
}
|
|
217
|
+
if (options.reconnect === false) return;
|
|
218
|
+
await wait(Math.min(reconnectDelayMs, maxReconnectDelayMs), options.signal);
|
|
219
|
+
reconnectDelayMs = Math.min(reconnectDelayMs * 2, maxReconnectDelayMs);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
async function* parseSseStream(body) {
|
|
223
|
+
const reader = body.getReader();
|
|
224
|
+
const decoder = new TextDecoder();
|
|
225
|
+
let buffer = "";
|
|
226
|
+
let event = emptySseEvent();
|
|
227
|
+
try {
|
|
228
|
+
while (true) {
|
|
229
|
+
const { done, value } = await reader.read();
|
|
230
|
+
if (done) break;
|
|
231
|
+
buffer += decoder.decode(value, { stream: true });
|
|
232
|
+
let lineEnd = findLineEnd(buffer);
|
|
233
|
+
while (lineEnd !== void 0) {
|
|
234
|
+
const rawLine = buffer.slice(0, lineEnd.index);
|
|
235
|
+
buffer = buffer.slice(lineEnd.nextIndex);
|
|
236
|
+
const message = processSseLine(rawLine, event);
|
|
237
|
+
if (message) {
|
|
238
|
+
yield message;
|
|
239
|
+
event = emptySseEvent();
|
|
240
|
+
}
|
|
241
|
+
lineEnd = findLineEnd(buffer);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
buffer += decoder.decode();
|
|
245
|
+
if (buffer !== "") {
|
|
246
|
+
const message = processSseLine(buffer, event);
|
|
247
|
+
if (message) {
|
|
248
|
+
yield message;
|
|
249
|
+
event = emptySseEvent();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (event.data.length > 0) yield toSseMessage(event);
|
|
253
|
+
} finally {
|
|
254
|
+
reader.releaseLock();
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
var emptySseEvent = () => ({ data: [] });
|
|
258
|
+
var getGlobalFetch = () => typeof globalThis.fetch === "function" ? globalThis.fetch : void 0;
|
|
259
|
+
var hasText = (value) => value !== void 0 && value !== "";
|
|
260
|
+
var processSseLine = (line, event) => {
|
|
261
|
+
if (line === "") {
|
|
262
|
+
if (event.data.length === 0) return void 0;
|
|
263
|
+
return toSseMessage(event);
|
|
264
|
+
}
|
|
265
|
+
if (line.startsWith(":")) return void 0;
|
|
266
|
+
const separatorIndex = line.indexOf(":");
|
|
267
|
+
const field = separatorIndex === -1 ? line : line.slice(0, separatorIndex);
|
|
268
|
+
const value = separatorIndex === -1 ? "" : line.slice(separatorIndex + 1).replace(/^ /, "");
|
|
269
|
+
switch (field) {
|
|
270
|
+
case "data": {
|
|
271
|
+
event.data.push(value);
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
case "event": {
|
|
275
|
+
event.event = value;
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
case "id": {
|
|
279
|
+
event.id = value;
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
case "retry": {
|
|
283
|
+
const retry = Number.parseInt(value, 10);
|
|
284
|
+
if (Number.isFinite(retry) && retry >= 0) event.retry = retry;
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return void 0;
|
|
289
|
+
};
|
|
290
|
+
var toSseMessage = (event) => {
|
|
291
|
+
const data = event.data.join("\n");
|
|
292
|
+
const message = { data };
|
|
293
|
+
if (event.id !== void 0) message.id = event.id;
|
|
294
|
+
if (event.event !== void 0) message.event = event.event;
|
|
295
|
+
if (event.retry !== void 0) message.retry = event.retry;
|
|
296
|
+
const parsed = parseJson(data);
|
|
297
|
+
if (parsed !== void 0) message.parsed = parsed;
|
|
298
|
+
return message;
|
|
299
|
+
};
|
|
300
|
+
var cursorOptions = (options) => {
|
|
301
|
+
const result = {};
|
|
302
|
+
if (options.cursor !== void 0) result.cursor = options.cursor;
|
|
303
|
+
if (options.since !== void 0) result.since = options.since;
|
|
304
|
+
return result;
|
|
305
|
+
};
|
|
306
|
+
var parseJson = (data) => {
|
|
307
|
+
try {
|
|
308
|
+
return JSON.parse(data);
|
|
309
|
+
} catch {
|
|
310
|
+
return void 0;
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
var findLineEnd = (input) => {
|
|
314
|
+
const lf = input.indexOf("\n");
|
|
315
|
+
const cr = input.indexOf("\r");
|
|
316
|
+
if (lf === -1 && cr === -1) return void 0;
|
|
317
|
+
if (cr !== -1 && (lf === -1 || cr < lf)) {
|
|
318
|
+
return { index: cr, nextIndex: input[cr + 1] === "\n" ? cr + 2 : cr + 1 };
|
|
319
|
+
}
|
|
320
|
+
return { index: lf, nextIndex: lf + 1 };
|
|
321
|
+
};
|
|
322
|
+
var wait = async (delayMs, signal) => new Promise((resolve) => {
|
|
323
|
+
if (signal?.aborted) {
|
|
324
|
+
resolve();
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
const timeout = setTimeout(resolve, delayMs);
|
|
328
|
+
signal?.addEventListener(
|
|
329
|
+
"abort",
|
|
330
|
+
() => {
|
|
331
|
+
clearTimeout(timeout);
|
|
332
|
+
resolve();
|
|
333
|
+
},
|
|
334
|
+
{ once: true }
|
|
335
|
+
);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// src/client.ts
|
|
339
|
+
var DEFAULT_API_BASE_URL = "https://api.restlessapi.stream";
|
|
340
|
+
var DEFAULT_STREAM_BASE_URL2 = "https://stream.restlessapi.stream";
|
|
341
|
+
var createRestlessClient = (options = {}) => {
|
|
342
|
+
const apiBaseUrl = normalizeBaseUrl(options.apiBaseUrl ?? DEFAULT_API_BASE_URL);
|
|
343
|
+
const streamBaseUrl = normalizeBaseUrl(options.streamBaseUrl ?? DEFAULT_STREAM_BASE_URL2);
|
|
344
|
+
const fetchImpl = options.fetch ?? getGlobalFetch2();
|
|
345
|
+
const defaultHeaders = options.headers ?? {};
|
|
346
|
+
const apiKey = normalizeOptionalText(options.apiKey);
|
|
347
|
+
if (fetchImpl === void 0) throw new Error("fetch is not available in this environment.");
|
|
348
|
+
const request = async (path, init = {}) => {
|
|
349
|
+
const headers = new Headers(defaultHeaders);
|
|
350
|
+
for (const [key, value] of new Headers(init.headers).entries()) headers.set(key, value);
|
|
351
|
+
if (apiKey !== void 0) headers.set("x-api-key", apiKey);
|
|
352
|
+
if (init.body !== void 0 && !headers.has("Content-Type")) headers.set("Content-Type", "application/json");
|
|
353
|
+
const response = await fetchImpl(`${apiBaseUrl}${path}`, {
|
|
354
|
+
...init,
|
|
355
|
+
headers
|
|
356
|
+
});
|
|
357
|
+
const body = await readResponseBody(response);
|
|
358
|
+
if (!response.ok) throw new RestlessApiError(response, body, extractErrorMessage(body));
|
|
359
|
+
return body;
|
|
360
|
+
};
|
|
361
|
+
const post = async (path, body) => request(path, { method: "POST", body: JSON.stringify(body) });
|
|
362
|
+
const withApiKey = (input) => {
|
|
363
|
+
if (apiKey === void 0 || normalizeOptionalText(input.apiKey) !== void 0) return input;
|
|
364
|
+
return { ...input, apiKey };
|
|
365
|
+
};
|
|
366
|
+
const runtimeHeaders = (overrideApiKey) => {
|
|
367
|
+
const token = normalizeOptionalText(overrideApiKey) ?? apiKey;
|
|
368
|
+
return token === void 0 ? {} : { Authorization: `Bearer ${token}` };
|
|
369
|
+
};
|
|
370
|
+
const subscribeSse = async function* ({
|
|
371
|
+
allowApiKeyInUrl,
|
|
372
|
+
headers,
|
|
373
|
+
sseUrl,
|
|
374
|
+
...iterableOptions
|
|
375
|
+
}) {
|
|
376
|
+
const runtimeUrl = allowApiKeyInUrl ? appendApiKeyQueryParam(sseUrl, apiKey) : sseUrl;
|
|
377
|
+
for await (const message of streamSse({
|
|
378
|
+
...iterableOptions,
|
|
379
|
+
fetch: fetchImpl,
|
|
380
|
+
headers: { ...runtimeHeaders(), ...headers },
|
|
381
|
+
url: runtimeUrl
|
|
382
|
+
})) {
|
|
383
|
+
if (message.parsed) {
|
|
384
|
+
yield message.parsed;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
const subscribeWebSocket = subscribeWebSocketUrl;
|
|
389
|
+
const listStreams = async (input = {}) => request(`/streams${toQuery(input)}`);
|
|
390
|
+
const getStream = async (id) => request(`/streams/${encodeURIComponent(id)}`);
|
|
391
|
+
const createStream = async (input) => post("/streams", withApiKey(input));
|
|
392
|
+
const updateStream = async (id, input) => request(`/streams/${encodeURIComponent(id)}`, {
|
|
393
|
+
method: "PATCH",
|
|
394
|
+
body: JSON.stringify(withApiKey(input))
|
|
395
|
+
});
|
|
396
|
+
const startStream = async (id) => post(`/streams/${encodeURIComponent(id)}/start`, {});
|
|
397
|
+
const stopStream = async (id) => post(`/streams/${encodeURIComponent(id)}/stop`, {});
|
|
398
|
+
const deleteStream = async (id) => request(`/streams/${encodeURIComponent(id)}`, {
|
|
399
|
+
method: "DELETE"
|
|
400
|
+
});
|
|
401
|
+
const validateApiKey = async (inputApiKey) => post("/streams/validate-api-key", {
|
|
402
|
+
apiKey: inputApiKey ?? apiKey
|
|
403
|
+
});
|
|
404
|
+
const creditUsageStats = async (id) => request(`/streams/${encodeURIComponent(id)}/credit-usage-stats`);
|
|
405
|
+
const connectionSnippets = async (input) => post("/streams/connection-snippets", input);
|
|
406
|
+
const streams = {
|
|
407
|
+
list: listStreams,
|
|
408
|
+
get: getStream,
|
|
409
|
+
create: createStream,
|
|
410
|
+
update: updateStream,
|
|
411
|
+
start: startStream,
|
|
412
|
+
stop: stopStream,
|
|
413
|
+
delete: deleteStream,
|
|
414
|
+
validateApiKey,
|
|
415
|
+
creditUsageStats,
|
|
416
|
+
connectionSnippets,
|
|
417
|
+
subscribeSse,
|
|
418
|
+
subscribeWebSocket
|
|
419
|
+
};
|
|
420
|
+
return {
|
|
421
|
+
apiBaseUrl,
|
|
422
|
+
streamBaseUrl,
|
|
423
|
+
apiKey,
|
|
424
|
+
listStreams,
|
|
425
|
+
getStream,
|
|
426
|
+
createStream,
|
|
427
|
+
updateStream,
|
|
428
|
+
startStream,
|
|
429
|
+
stopStream,
|
|
430
|
+
deleteStream,
|
|
431
|
+
validateApiKey,
|
|
432
|
+
creditUsageStats,
|
|
433
|
+
connectionSnippets,
|
|
434
|
+
streams,
|
|
435
|
+
direct: {
|
|
436
|
+
setup: async (input) => post("/streams/direct/setup", input),
|
|
437
|
+
createSession: async (input) => post("/streams/direct/sessions", input),
|
|
438
|
+
subscribeSse(input, directOptions = {}) {
|
|
439
|
+
const { allowApiKeyInUrl, headers, cursor, since, ...iterableOptions } = directOptions;
|
|
440
|
+
const subscribeOptions = {
|
|
441
|
+
...iterableOptions,
|
|
442
|
+
sseUrl: buildDirectSseUrl(streamBaseUrl, input, toRuntimeOptions(cursor, since))
|
|
443
|
+
};
|
|
444
|
+
if (allowApiKeyInUrl !== void 0) subscribeOptions.allowApiKeyInUrl = allowApiKeyInUrl;
|
|
445
|
+
if (headers !== void 0) subscribeOptions.headers = headers;
|
|
446
|
+
if (cursor !== void 0) subscribeOptions.cursor = cursor;
|
|
447
|
+
if (since !== void 0) subscribeOptions.since = since;
|
|
448
|
+
return subscribeSse(subscribeOptions);
|
|
449
|
+
},
|
|
450
|
+
subscribeWebSocket(input, directOptions = {}) {
|
|
451
|
+
const { cursor, since, ...websocketOptions } = directOptions;
|
|
452
|
+
return subscribeWebSocket(
|
|
453
|
+
buildDirectWebSocketUrl(streamBaseUrl, input, toRuntimeOptions(cursor, since)),
|
|
454
|
+
websocketOptions
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
},
|
|
458
|
+
urls: {
|
|
459
|
+
sse: (identifier, urlOptions = {}) => buildSseUrl(streamBaseUrl, identifier, urlOptions),
|
|
460
|
+
websocket: (identifier, urlOptions = {}) => buildWebSocketUrl(streamBaseUrl, identifier, urlOptions),
|
|
461
|
+
directSse: (input, urlOptions = {}) => buildDirectSseUrl(streamBaseUrl, input, urlOptions),
|
|
462
|
+
directWebSocket: (input, urlOptions = {}) => buildDirectWebSocketUrl(streamBaseUrl, input, urlOptions)
|
|
463
|
+
},
|
|
464
|
+
runtimeHeaders,
|
|
465
|
+
sse: (url, iterableOptions = {}) => streamSse({
|
|
466
|
+
...iterableOptions,
|
|
467
|
+
fetch: fetchImpl,
|
|
468
|
+
headers: runtimeHeaders(),
|
|
469
|
+
url
|
|
470
|
+
}),
|
|
471
|
+
subscribeSse,
|
|
472
|
+
websocket: (url, iterableOptions = {}) => subscribeWebSocket(url, iterableOptions),
|
|
473
|
+
subscribeWebSocket
|
|
474
|
+
};
|
|
475
|
+
};
|
|
476
|
+
var getGlobalFetch2 = () => typeof globalThis.fetch === "function" ? globalThis.fetch : void 0;
|
|
477
|
+
var normalizeOptionalText = (value) => {
|
|
478
|
+
const trimmed = value?.trim();
|
|
479
|
+
return trimmed === void 0 || trimmed === "" ? void 0 : trimmed;
|
|
480
|
+
};
|
|
481
|
+
export {
|
|
482
|
+
DEFAULT_API_BASE_URL,
|
|
483
|
+
DEFAULT_STREAM_BASE_URL2 as DEFAULT_STREAM_BASE_URL,
|
|
484
|
+
RestlessApiError,
|
|
485
|
+
appendDirectQueryParams,
|
|
486
|
+
buildDirectSseUrl,
|
|
487
|
+
buildDirectWebSocketUrl,
|
|
488
|
+
buildSseUrl,
|
|
489
|
+
buildWebSocketUrl,
|
|
490
|
+
createRestlessClient,
|
|
491
|
+
normalizeBaseUrl,
|
|
492
|
+
parseSseStream,
|
|
493
|
+
streamSse,
|
|
494
|
+
streamWebSocket,
|
|
495
|
+
toWebSocketStreamUrl,
|
|
496
|
+
withRuntimeCursor
|
|
497
|
+
};
|
|
498
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/websocket.ts","../src/client-utils.ts","../src/errors.ts","../src/urls.ts","../src/sse.ts","../src/client.ts"],"sourcesContent":["import type { WebSocketConstructor, WebSocketIterableOptions } from './types.js';\n\nconst CLOSED = 3;\n\nconst getGlobalWebSocket = (): WebSocketConstructor | undefined =>\n typeof globalThis.WebSocket === 'function' ? globalThis.WebSocket : undefined;\n\nexport async function* streamWebSocket<TData = unknown>(\n options: WebSocketIterableOptions,\n): AsyncIterable<TData | string> {\n const WebSocketCtor = options.WebSocket ?? getGlobalWebSocket();\n if (WebSocketCtor === undefined) throw new Error('WebSocket is not available in this environment.');\n if (options.signal?.aborted) return;\n\n const socket = new WebSocketCtor(options.url, options.protocols);\n const queue: Array<TData | string> = [];\n const waiters: Array<() => void> = [];\n let closed = false;\n let failure: unknown;\n\n const wake = (): void => waiters.shift()?.();\n const waitForMessage = async (): Promise<void> => new Promise((resolve) => waiters.push(resolve));\n\n socket.onmessage = (event) => {\n queue.push(parseMessage<TData>(event.data));\n wake();\n };\n\n socket.onerror = (event) => {\n failure = event;\n closed = true;\n wake();\n };\n\n socket.onclose = () => {\n closed = true;\n wake();\n };\n\n const abort = (): void => {\n closed = true;\n if (socket.readyState !== CLOSED) socket.close();\n wake();\n };\n\n options.signal?.addEventListener('abort', abort, { once: true });\n\n try {\n while (!closed || queue.length > 0) {\n const next = queue.shift();\n if (next !== undefined) {\n yield next;\n continue;\n }\n\n if (closed) break;\n await waitForMessage();\n }\n\n if (failure !== undefined && !options.signal?.aborted) throw failure;\n } finally {\n options.signal?.removeEventListener('abort', abort);\n if (socket.readyState !== CLOSED) socket.close();\n }\n}\n\nconst parseMessage = <TData>(data: unknown): TData | string => {\n if (typeof data !== 'string') return String(data);\n try {\n return JSON.parse(data) as TData;\n } catch {\n return data;\n }\n};\n","import type { ListStreamsInput, RuntimeUrlOptions, StreamEvent, WebSocketIterableOptions } from './types.js';\n\nimport { streamWebSocket } from './websocket.js';\n\nexport const appendApiKeyQueryParam = (url: string, apiKey: string | undefined): string => {\n const trimmedApiKey = apiKey?.trim();\n if (trimmedApiKey === undefined || trimmedApiKey === '') return url;\n const parsed = new URL(url);\n parsed.searchParams.set('apiKey', trimmedApiKey);\n return parsed.toString();\n};\n\nexport const toRuntimeOptions = (\n cursor: RuntimeUrlOptions['cursor'] | undefined,\n since: RuntimeUrlOptions['since'] | undefined,\n): RuntimeUrlOptions => {\n const options: RuntimeUrlOptions = {};\n if (cursor !== undefined) options.cursor = cursor;\n if (since !== undefined) options.since = since;\n return options;\n};\n\nexport const toQuery = (input: ListStreamsInput): string => {\n const params = new URLSearchParams();\n if (input.limit !== undefined) params.set('limit', String(input.limit));\n if (input.offset !== undefined) params.set('offset', String(input.offset));\n const query = params.toString();\n return query === '' ? '' : `?${query}`;\n};\n\nexport const readResponseBody = async (response: Response): Promise<unknown> => {\n const text = await response.text();\n if (text === '') return undefined;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n};\n\nexport const extractErrorMessage = (body: unknown): string | undefined => {\n if (body === null || body === undefined || typeof body !== 'object') return undefined;\n const maybeMessage = (body as { message?: unknown }).message;\n if (typeof maybeMessage === 'string') return maybeMessage;\n if (Array.isArray(maybeMessage)) return maybeMessage.join(', ');\n const maybeError = (body as { error?: unknown }).error;\n return typeof maybeError === 'string' ? maybeError : undefined;\n};\n\nexport const subscribeWebSocketUrl = <TData = StreamEvent>(\n url: string,\n iterableOptions: Omit<WebSocketIterableOptions, 'url'> = {},\n) => streamWebSocket<TData>({ ...iterableOptions, url });\n","export class RestlessApiError extends Error {\n readonly status: number;\n readonly statusText: string;\n readonly body: unknown;\n readonly headers: Headers;\n\n constructor(response: Response, body: unknown, message?: string) {\n super(message ?? `Restless API request failed with HTTP ${response.status}`);\n this.name = 'RestlessApiError';\n this.status = response.status;\n this.statusText = response.statusText;\n this.body = body;\n this.headers = response.headers;\n }\n}\n","import type { DirectRuntimeUrlInput, JsonObject, RuntimeIdentifier, RuntimeUrlOptions } from './types.js';\n\nconst DEFAULT_STREAM_BASE_URL = 'https://stream.restlessapi.stream';\n\nexport const normalizeBaseUrl = (baseUrl: string): string => {\n const trimmed = baseUrl.trim();\n return trimmed.endsWith('/') ? trimmed.slice(0, -1) : trimmed;\n};\n\nexport const toWebSocketStreamUrl = (sseUrl: string): string => {\n const trimmedUrl = sseUrl.trim();\n if (trimmedUrl === '') return '';\n\n const parsed = new URL(trimmedUrl);\n if (parsed.protocol === 'http:') parsed.protocol = 'ws:';\n if (parsed.protocol === 'https:') parsed.protocol = 'wss:';\n const pathname = parsed.pathname.endsWith('/') ? parsed.pathname.slice(0, -1) : parsed.pathname;\n parsed.pathname = pathname.endsWith('/ws') ? pathname : `${pathname}/ws`;\n return parsed.toString();\n};\n\nexport const buildSseUrl = (\n baseUrl: string | undefined,\n identifier: RuntimeIdentifier,\n options: RuntimeUrlOptions = {},\n): string => {\n const url = new URL(normalizeBaseUrl(baseUrl ?? DEFAULT_STREAM_BASE_URL));\n if ('streamId' in identifier) {\n url.searchParams.set('streamId', identifier.streamId);\n } else {\n url.searchParams.set('sessionId', identifier.sessionId);\n }\n\n appendCursorParams(url.searchParams, options);\n return url.toString();\n};\n\nexport const buildWebSocketUrl = (\n baseUrl: string | undefined,\n identifier: RuntimeIdentifier,\n options: RuntimeUrlOptions = {},\n): string => toWebSocketStreamUrl(buildSseUrl(baseUrl, identifier, options));\n\nexport const buildDirectSseUrl = (\n baseUrl: string | undefined,\n input: DirectRuntimeUrlInput,\n options: RuntimeUrlOptions = {},\n): string => {\n const url = new URL(normalizeBaseUrl(baseUrl ?? DEFAULT_STREAM_BASE_URL));\n url.searchParams.set('url', input.url.trim());\n appendDirectQueryParams(url.searchParams, input);\n appendCursorParams(url.searchParams, options);\n return url.toString();\n};\n\nexport const buildDirectWebSocketUrl = (\n baseUrl: string | undefined,\n input: DirectRuntimeUrlInput,\n options: RuntimeUrlOptions = {},\n): string => toWebSocketStreamUrl(buildDirectSseUrl(baseUrl, input, options));\n\nexport const appendDirectQueryParams = (params: URLSearchParams, input: DirectRuntimeUrlInput): void => {\n const method = input.method?.trim().toUpperCase();\n if (method !== undefined && method !== '' && method !== 'GET') params.set('method', method);\n appendJsonParam(params, 'headers', input.headers);\n appendJsonParam(params, 'body', input.body);\n appendTrimmedParam(params, 'jq', input.jqFilter);\n appendNumberParam(params, 'pollingInterval', input.pollingInterval);\n if (input.pollingStrategies !== undefined && input.pollingStrategies.length > 0) {\n params.set('pollingStrategies', JSON.stringify(input.pollingStrategies));\n }\n\n const payloadMode = input.payloadMode?.trim().toUpperCase();\n if (payloadMode !== undefined && payloadMode !== '' && payloadMode !== 'FULL_DATA')\n params.set('payloadMode', payloadMode);\n appendTrimmedParam(params, 'apiKey', input.apiKey);\n};\n\nexport const withRuntimeCursor = (url: string, options: RuntimeUrlOptions): string => {\n const parsed = new URL(url);\n appendCursorParams(parsed.searchParams, options);\n return parsed.toString();\n};\n\nconst appendCursorParams = (params: URLSearchParams, options: RuntimeUrlOptions): void => {\n appendTrimmedParam(params, 'cursor', options.cursor);\n appendTrimmedParam(params, 'since', options.since);\n};\n\nconst appendJsonParam = (params: URLSearchParams, key: string, value: JsonObject | undefined): void => {\n if (value !== undefined && Object.keys(value).length > 0) params.set(key, JSON.stringify(value));\n};\n\nconst appendNumberParam = (params: URLSearchParams, key: string, value: number | undefined): void => {\n if (value !== undefined && Number.isFinite(value) && value > 0) params.set(key, String(Math.floor(value)));\n};\n\nconst appendTrimmedParam = (params: URLSearchParams, key: string, value: number | string | undefined): void => {\n const trimmed = value?.toString().trim();\n if (trimmed !== undefined && trimmed !== '') params.set(key, trimmed);\n};\n","import type { SseIterableOptions, SseMessage } from './types.js';\n\nimport { withRuntimeCursor } from './urls.js';\n\nconst DEFAULT_RECONNECT_DELAY_MS = 1000;\nconst DEFAULT_MAX_RECONNECT_DELAY_MS = 30_000;\n\nexport async function* streamSse<TData = unknown>(options: SseIterableOptions): AsyncIterable<SseMessage<TData>> {\n const fetchImpl = options.fetch ?? getGlobalFetch();\n if (fetchImpl === undefined) throw new Error('fetch is not available in this environment.');\n\n let url = withRuntimeCursor(options.url, cursorOptions(options));\n let lastEventId: string | undefined;\n let reconnectDelayMs = options.reconnectDelayMs ?? DEFAULT_RECONNECT_DELAY_MS;\n const maxReconnectDelayMs = options.maxReconnectDelayMs ?? DEFAULT_MAX_RECONNECT_DELAY_MS;\n\n while (!options.signal?.aborted) {\n try {\n const headers = new Headers(options.headers);\n headers.set('Accept', 'text/event-stream');\n if (hasText(lastEventId)) headers.set('Last-Event-ID', lastEventId);\n\n const init: RequestInit = { headers };\n if (options.signal) init.signal = options.signal;\n const response = await fetchImpl(url, init);\n if (!response.ok) throw new Error(`SSE request failed with HTTP ${response.status}.`);\n if (!response.body) throw new Error('SSE response body is not readable.');\n\n for await (const message of parseSseStream<TData>(response.body)) {\n if (hasText(message.id)) {\n lastEventId = message.id;\n url = withRuntimeCursor(options.url, { cursor: lastEventId });\n }\n\n if (message.retry !== undefined) reconnectDelayMs = message.retry;\n if (message.data !== '') yield message;\n }\n } catch (error) {\n if (options.signal?.aborted) return;\n if (options.reconnect === false) throw error;\n }\n\n if (options.reconnect === false) return;\n await wait(Math.min(reconnectDelayMs, maxReconnectDelayMs), options.signal);\n reconnectDelayMs = Math.min(reconnectDelayMs * 2, maxReconnectDelayMs);\n }\n}\n\nexport async function* parseSseStream<TData = unknown>(\n body: ReadableStream<Uint8Array>,\n): AsyncIterable<SseMessage<TData>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let event = emptySseEvent();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let lineEnd = findLineEnd(buffer);\n while (lineEnd !== undefined) {\n const rawLine = buffer.slice(0, lineEnd.index);\n buffer = buffer.slice(lineEnd.nextIndex);\n const message = processSseLine<TData>(rawLine, event);\n if (message) {\n yield message;\n event = emptySseEvent();\n }\n\n lineEnd = findLineEnd(buffer);\n }\n }\n\n buffer += decoder.decode();\n if (buffer !== '') {\n const message = processSseLine<TData>(buffer, event);\n if (message) {\n yield message;\n event = emptySseEvent();\n }\n }\n\n if (event.data.length > 0) yield toSseMessage<TData>(event);\n } finally {\n reader.releaseLock();\n }\n}\n\ninterface SseEventBuffer {\n id?: string;\n event?: string;\n retry?: number;\n data: string[];\n}\n\nconst emptySseEvent = (): SseEventBuffer => ({ data: [] });\n\nconst getGlobalFetch = (): typeof fetch | undefined =>\n typeof globalThis.fetch === 'function' ? globalThis.fetch : undefined;\n\nconst hasText = (value: string | undefined): value is string => value !== undefined && value !== '';\n\nconst processSseLine = <TData>(line: string, event: SseEventBuffer): SseMessage<TData> | undefined => {\n if (line === '') {\n if (event.data.length === 0) return undefined;\n return toSseMessage<TData>(event);\n }\n\n if (line.startsWith(':')) return undefined;\n\n const separatorIndex = line.indexOf(':');\n const field = separatorIndex === -1 ? line : line.slice(0, separatorIndex);\n const value = separatorIndex === -1 ? '' : line.slice(separatorIndex + 1).replace(/^ /, '');\n\n switch (field) {\n case 'data': {\n event.data.push(value);\n break;\n }\n\n case 'event': {\n event.event = value;\n break;\n }\n\n case 'id': {\n event.id = value;\n break;\n }\n\n case 'retry': {\n const retry = Number.parseInt(value, 10);\n if (Number.isFinite(retry) && retry >= 0) event.retry = retry;\n break;\n }\n }\n\n return undefined;\n};\n\nconst toSseMessage = <TData>(event: SseEventBuffer): SseMessage<TData> => {\n const data = event.data.join('\\n');\n const message: SseMessage<TData> = { data };\n if (event.id !== undefined) message.id = event.id;\n if (event.event !== undefined) message.event = event.event;\n if (event.retry !== undefined) message.retry = event.retry;\n const parsed = parseJson<TData>(data);\n if (parsed !== undefined) message.parsed = parsed;\n return message;\n};\n\nconst cursorOptions = (options: Pick<SseIterableOptions, 'cursor' | 'since'>) => {\n const result: { cursor?: number | string; since?: number | string } = {};\n if (options.cursor !== undefined) result.cursor = options.cursor;\n if (options.since !== undefined) result.since = options.since;\n return result;\n};\n\nconst parseJson = <TData>(data: string): TData | undefined => {\n try {\n return JSON.parse(data) as TData;\n } catch {\n return undefined;\n }\n};\n\nconst findLineEnd = (input: string): { index: number; nextIndex: number } | undefined => {\n const lf = input.indexOf('\\n');\n const cr = input.indexOf('\\r');\n if (lf === -1 && cr === -1) return undefined;\n if (cr !== -1 && (lf === -1 || cr < lf)) {\n return { index: cr, nextIndex: input[cr + 1] === '\\n' ? cr + 2 : cr + 1 };\n }\n\n return { index: lf, nextIndex: lf + 1 };\n};\n\nconst wait = async (delayMs: number, signal: AbortSignal | undefined): Promise<void> =>\n new Promise((resolve) => {\n if (signal?.aborted) {\n resolve();\n return;\n }\n\n const timeout = setTimeout(resolve, delayMs);\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeout);\n resolve();\n },\n { once: true },\n );\n });\n","import type { RestlessClient, RestlessStreamsClient } from './client-types.js';\nimport type {\n BaseActionResponse,\n ConnectionSnippetsResponse,\n DirectRuntimeUrlInput,\n DirectSessionResponse,\n DirectSubscribeSseOptions,\n DirectSubscribeWebSocketOptions,\n DirectSetupResponse,\n ListStreamsInput,\n RestlessClientOptions,\n SseIterableOptions,\n SubscribeSseOptions,\n Stream,\n StreamCreditUsageStats,\n StreamEvent,\n StreamConnectionSnippetsInput,\n StreamUpdateInput,\n StreamWriteInput,\n StreamsResponse,\n WebSocketIterableOptions,\n} from './types.js';\n\nimport {\n appendApiKeyQueryParam,\n extractErrorMessage,\n readResponseBody,\n subscribeWebSocketUrl,\n toQuery,\n toRuntimeOptions,\n} from './client-utils.js';\nimport { RestlessApiError } from './errors.js';\nimport { streamSse } from './sse.js';\nimport {\n buildDirectSseUrl,\n buildDirectWebSocketUrl,\n buildSseUrl,\n buildWebSocketUrl,\n normalizeBaseUrl,\n} from './urls.js';\n\nexport const DEFAULT_API_BASE_URL = 'https://api.restlessapi.stream';\nexport const DEFAULT_STREAM_BASE_URL = 'https://stream.restlessapi.stream';\n\nexport const createRestlessClient = (options: RestlessClientOptions = {}): RestlessClient => {\n const apiBaseUrl = normalizeBaseUrl(options.apiBaseUrl ?? DEFAULT_API_BASE_URL);\n const streamBaseUrl = normalizeBaseUrl(options.streamBaseUrl ?? DEFAULT_STREAM_BASE_URL);\n const fetchImpl = options.fetch ?? getGlobalFetch();\n const defaultHeaders = options.headers ?? {};\n const apiKey = normalizeOptionalText(options.apiKey);\n\n if (fetchImpl === undefined) throw new Error('fetch is not available in this environment.');\n\n const request = async <TResponse>(path: string, init: RequestInit = {}): Promise<TResponse> => {\n const headers = new Headers(defaultHeaders);\n for (const [key, value] of new Headers(init.headers).entries()) headers.set(key, value);\n if (apiKey !== undefined) headers.set('x-api-key', apiKey);\n if (init.body !== undefined && !headers.has('Content-Type')) headers.set('Content-Type', 'application/json');\n\n const response = await fetchImpl(`${apiBaseUrl}${path}`, {\n ...init,\n headers,\n });\n const body = await readResponseBody(response);\n if (!response.ok) throw new RestlessApiError(response, body, extractErrorMessage(body));\n return body as TResponse;\n };\n\n const post = async <TResponse>(path: string, body: unknown): Promise<TResponse> =>\n request<TResponse>(path, { method: 'POST', body: JSON.stringify(body) });\n\n const withApiKey = <TInput extends { apiKey?: string }>(input: TInput): TInput => {\n if (apiKey === undefined || normalizeOptionalText(input.apiKey) !== undefined) return input;\n return { ...input, apiKey };\n };\n\n const runtimeHeaders = (overrideApiKey?: string): Record<string, string> => {\n const token = normalizeOptionalText(overrideApiKey) ?? apiKey;\n return token === undefined ? {} : { Authorization: `Bearer ${token}` };\n };\n\n const subscribeSse = async function* <TData = unknown>({\n allowApiKeyInUrl,\n headers,\n sseUrl,\n ...iterableOptions\n }: SubscribeSseOptions): AsyncIterable<StreamEvent<TData>> {\n const runtimeUrl = allowApiKeyInUrl ? appendApiKeyQueryParam(sseUrl, apiKey) : sseUrl;\n for await (const message of streamSse<StreamEvent<TData>>({\n ...iterableOptions,\n fetch: fetchImpl,\n headers: { ...runtimeHeaders(), ...headers },\n url: runtimeUrl,\n })) {\n if (message.parsed) {\n yield message.parsed;\n }\n }\n };\n\n const subscribeWebSocket = subscribeWebSocketUrl;\n\n const listStreams = async (input: ListStreamsInput = {}) => request<StreamsResponse>(`/streams${toQuery(input)}`);\n const getStream = async (id: string) => request<Stream>(`/streams/${encodeURIComponent(id)}`);\n const createStream = async (input: StreamWriteInput) => post<Stream>('/streams', withApiKey(input));\n const updateStream = async (id: string, input: StreamUpdateInput) =>\n request<Stream>(`/streams/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(withApiKey(input)),\n });\n const startStream = async (id: string) => post<Stream>(`/streams/${encodeURIComponent(id)}/start`, {});\n const stopStream = async (id: string) => post<Stream>(`/streams/${encodeURIComponent(id)}/stop`, {});\n const deleteStream = async (id: string) =>\n request<BaseActionResponse>(`/streams/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const validateApiKey = async (inputApiKey?: string) =>\n post<BaseActionResponse>('/streams/validate-api-key', {\n apiKey: inputApiKey ?? apiKey,\n });\n const creditUsageStats = async (id: string) =>\n request<StreamCreditUsageStats>(`/streams/${encodeURIComponent(id)}/credit-usage-stats`);\n const connectionSnippets = async (input: StreamConnectionSnippetsInput) =>\n post<ConnectionSnippetsResponse>('/streams/connection-snippets', input);\n\n const streams: RestlessStreamsClient = {\n list: listStreams,\n get: getStream,\n create: createStream,\n update: updateStream,\n start: startStream,\n stop: stopStream,\n delete: deleteStream,\n validateApiKey,\n creditUsageStats,\n connectionSnippets,\n subscribeSse,\n subscribeWebSocket,\n };\n\n return {\n apiBaseUrl,\n streamBaseUrl,\n apiKey,\n listStreams,\n getStream,\n createStream,\n updateStream,\n startStream,\n stopStream,\n deleteStream,\n validateApiKey,\n creditUsageStats,\n connectionSnippets,\n streams,\n direct: {\n setup: async (input) => post<DirectSetupResponse>('/streams/direct/setup', input),\n createSession: async (input) => post<DirectSessionResponse>('/streams/direct/sessions', input),\n subscribeSse<TData = unknown>(input: DirectRuntimeUrlInput, directOptions: DirectSubscribeSseOptions = {}) {\n const { allowApiKeyInUrl, headers, cursor, since, ...iterableOptions } = directOptions;\n const subscribeOptions: SubscribeSseOptions = {\n ...iterableOptions,\n sseUrl: buildDirectSseUrl(streamBaseUrl, input, toRuntimeOptions(cursor, since)),\n };\n if (allowApiKeyInUrl !== undefined) subscribeOptions.allowApiKeyInUrl = allowApiKeyInUrl;\n if (headers !== undefined) subscribeOptions.headers = headers;\n if (cursor !== undefined) subscribeOptions.cursor = cursor;\n if (since !== undefined) subscribeOptions.since = since;\n return subscribeSse<TData>(subscribeOptions);\n },\n subscribeWebSocket<TData = StreamEvent>(\n input: DirectRuntimeUrlInput,\n directOptions: DirectSubscribeWebSocketOptions = {},\n ) {\n const { cursor, since, ...websocketOptions } = directOptions;\n return subscribeWebSocket<TData>(\n buildDirectWebSocketUrl(streamBaseUrl, input, toRuntimeOptions(cursor, since)),\n websocketOptions,\n );\n },\n },\n urls: {\n sse: (identifier, urlOptions = {}) => buildSseUrl(streamBaseUrl, identifier, urlOptions),\n websocket: (identifier, urlOptions = {}) => buildWebSocketUrl(streamBaseUrl, identifier, urlOptions),\n directSse: (input, urlOptions = {}) => buildDirectSseUrl(streamBaseUrl, input, urlOptions),\n directWebSocket: (input, urlOptions = {}) => buildDirectWebSocketUrl(streamBaseUrl, input, urlOptions),\n },\n runtimeHeaders,\n sse: <TData = StreamEvent>(\n url: string,\n iterableOptions: Omit<SseIterableOptions, 'url' | 'headers' | 'fetch'> = {},\n ) =>\n streamSse<TData>({\n ...iterableOptions,\n fetch: fetchImpl,\n headers: runtimeHeaders(),\n url,\n }),\n subscribeSse,\n websocket: <TData = StreamEvent>(url: string, iterableOptions: Omit<WebSocketIterableOptions, 'url'> = {}) =>\n subscribeWebSocket<TData>(url, iterableOptions),\n subscribeWebSocket,\n };\n};\n\nconst getGlobalFetch = (): typeof fetch | undefined =>\n typeof globalThis.fetch === 'function' ? globalThis.fetch : undefined;\n\nconst normalizeOptionalText = (value: string | undefined): string | undefined => {\n const trimmed = value?.trim();\n return trimmed === undefined || trimmed === '' ? undefined : trimmed;\n};\n"],"mappings":";AAEA,IAAM,SAAS;AAEf,IAAM,qBAAqB,MACzB,OAAO,WAAW,cAAc,aAAa,WAAW,YAAY;AAEtE,gBAAuB,gBACrB,SAC+B;AAC/B,QAAM,gBAAgB,QAAQ,aAAa,mBAAmB;AAC9D,MAAI,kBAAkB,OAAW,OAAM,IAAI,MAAM,iDAAiD;AAClG,MAAI,QAAQ,QAAQ,QAAS;AAE7B,QAAM,SAAS,IAAI,cAAc,QAAQ,KAAK,QAAQ,SAAS;AAC/D,QAAM,QAA+B,CAAC;AACtC,QAAM,UAA6B,CAAC;AACpC,MAAI,SAAS;AACb,MAAI;AAEJ,QAAM,OAAO,MAAY,QAAQ,MAAM,IAAI;AAC3C,QAAM,iBAAiB,YAA2B,IAAI,QAAQ,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC;AAEhG,SAAO,YAAY,CAAC,UAAU;AAC5B,UAAM,KAAK,aAAoB,MAAM,IAAI,CAAC;AAC1C,SAAK;AAAA,EACP;AAEA,SAAO,UAAU,CAAC,UAAU;AAC1B,cAAU;AACV,aAAS;AACT,SAAK;AAAA,EACP;AAEA,SAAO,UAAU,MAAM;AACrB,aAAS;AACT,SAAK;AAAA,EACP;AAEA,QAAM,QAAQ,MAAY;AACxB,aAAS;AACT,QAAI,OAAO,eAAe,OAAQ,QAAO,MAAM;AAC/C,SAAK;AAAA,EACP;AAEA,UAAQ,QAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAE/D,MAAI;AACF,WAAO,CAAC,UAAU,MAAM,SAAS,GAAG;AAClC,YAAM,OAAO,MAAM,MAAM;AACzB,UAAI,SAAS,QAAW;AACtB,cAAM;AACN;AAAA,MACF;AAEA,UAAI,OAAQ;AACZ,YAAM,eAAe;AAAA,IACvB;AAEA,QAAI,YAAY,UAAa,CAAC,QAAQ,QAAQ,QAAS,OAAM;AAAA,EAC/D,UAAE;AACA,YAAQ,QAAQ,oBAAoB,SAAS,KAAK;AAClD,QAAI,OAAO,eAAe,OAAQ,QAAO,MAAM;AAAA,EACjD;AACF;AAEA,IAAM,eAAe,CAAQ,SAAkC;AAC7D,MAAI,OAAO,SAAS,SAAU,QAAO,OAAO,IAAI;AAChD,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACrEO,IAAM,yBAAyB,CAAC,KAAa,WAAuC;AACzF,QAAM,gBAAgB,QAAQ,KAAK;AACnC,MAAI,kBAAkB,UAAa,kBAAkB,GAAI,QAAO;AAChE,QAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,SAAO,aAAa,IAAI,UAAU,aAAa;AAC/C,SAAO,OAAO,SAAS;AACzB;AAEO,IAAM,mBAAmB,CAC9B,QACA,UACsB;AACtB,QAAM,UAA6B,CAAC;AACpC,MAAI,WAAW,OAAW,SAAQ,SAAS;AAC3C,MAAI,UAAU,OAAW,SAAQ,QAAQ;AACzC,SAAO;AACT;AAEO,IAAM,UAAU,CAAC,UAAoC;AAC1D,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,MAAM,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,MAAM,KAAK,CAAC;AACtE,MAAI,MAAM,WAAW,OAAW,QAAO,IAAI,UAAU,OAAO,MAAM,MAAM,CAAC;AACzE,QAAM,QAAQ,OAAO,SAAS;AAC9B,SAAO,UAAU,KAAK,KAAK,IAAI,KAAK;AACtC;AAEO,IAAM,mBAAmB,OAAO,aAAyC;AAC9E,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,sBAAsB,CAAC,SAAsC;AACxE,MAAI,SAAS,QAAQ,SAAS,UAAa,OAAO,SAAS,SAAU,QAAO;AAC5E,QAAM,eAAgB,KAA+B;AACrD,MAAI,OAAO,iBAAiB,SAAU,QAAO;AAC7C,MAAI,MAAM,QAAQ,YAAY,EAAG,QAAO,aAAa,KAAK,IAAI;AAC9D,QAAM,aAAc,KAA6B;AACjD,SAAO,OAAO,eAAe,WAAW,aAAa;AACvD;AAEO,IAAM,wBAAwB,CACnC,KACA,kBAAyD,CAAC,MACvD,gBAAuB,EAAE,GAAG,iBAAiB,IAAI,CAAC;;;ACpDhD,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,UAAoB,MAAe,SAAkB;AAC/D,UAAM,WAAW,yCAAyC,SAAS,MAAM,EAAE;AAC3E,SAAK,OAAO;AACZ,SAAK,SAAS,SAAS;AACvB,SAAK,aAAa,SAAS;AAC3B,SAAK,OAAO;AACZ,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;;;ACZA,IAAM,0BAA0B;AAEzB,IAAM,mBAAmB,CAAC,YAA4B;AAC3D,QAAM,UAAU,QAAQ,KAAK;AAC7B,SAAO,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AACxD;AAEO,IAAM,uBAAuB,CAAC,WAA2B;AAC9D,QAAM,aAAa,OAAO,KAAK;AAC/B,MAAI,eAAe,GAAI,QAAO;AAE9B,QAAM,SAAS,IAAI,IAAI,UAAU;AACjC,MAAI,OAAO,aAAa,QAAS,QAAO,WAAW;AACnD,MAAI,OAAO,aAAa,SAAU,QAAO,WAAW;AACpD,QAAM,WAAW,OAAO,SAAS,SAAS,GAAG,IAAI,OAAO,SAAS,MAAM,GAAG,EAAE,IAAI,OAAO;AACvF,SAAO,WAAW,SAAS,SAAS,KAAK,IAAI,WAAW,GAAG,QAAQ;AACnE,SAAO,OAAO,SAAS;AACzB;AAEO,IAAM,cAAc,CACzB,SACA,YACA,UAA6B,CAAC,MACnB;AACX,QAAM,MAAM,IAAI,IAAI,iBAAiB,WAAW,uBAAuB,CAAC;AACxE,MAAI,cAAc,YAAY;AAC5B,QAAI,aAAa,IAAI,YAAY,WAAW,QAAQ;AAAA,EACtD,OAAO;AACL,QAAI,aAAa,IAAI,aAAa,WAAW,SAAS;AAAA,EACxD;AAEA,qBAAmB,IAAI,cAAc,OAAO;AAC5C,SAAO,IAAI,SAAS;AACtB;AAEO,IAAM,oBAAoB,CAC/B,SACA,YACA,UAA6B,CAAC,MACnB,qBAAqB,YAAY,SAAS,YAAY,OAAO,CAAC;AAEpE,IAAM,oBAAoB,CAC/B,SACA,OACA,UAA6B,CAAC,MACnB;AACX,QAAM,MAAM,IAAI,IAAI,iBAAiB,WAAW,uBAAuB,CAAC;AACxE,MAAI,aAAa,IAAI,OAAO,MAAM,IAAI,KAAK,CAAC;AAC5C,0BAAwB,IAAI,cAAc,KAAK;AAC/C,qBAAmB,IAAI,cAAc,OAAO;AAC5C,SAAO,IAAI,SAAS;AACtB;AAEO,IAAM,0BAA0B,CACrC,SACA,OACA,UAA6B,CAAC,MACnB,qBAAqB,kBAAkB,SAAS,OAAO,OAAO,CAAC;AAErE,IAAM,0BAA0B,CAAC,QAAyB,UAAuC;AACtG,QAAM,SAAS,MAAM,QAAQ,KAAK,EAAE,YAAY;AAChD,MAAI,WAAW,UAAa,WAAW,MAAM,WAAW,MAAO,QAAO,IAAI,UAAU,MAAM;AAC1F,kBAAgB,QAAQ,WAAW,MAAM,OAAO;AAChD,kBAAgB,QAAQ,QAAQ,MAAM,IAAI;AAC1C,qBAAmB,QAAQ,MAAM,MAAM,QAAQ;AAC/C,oBAAkB,QAAQ,mBAAmB,MAAM,eAAe;AAClE,MAAI,MAAM,sBAAsB,UAAa,MAAM,kBAAkB,SAAS,GAAG;AAC/E,WAAO,IAAI,qBAAqB,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAAA,EACzE;AAEA,QAAM,cAAc,MAAM,aAAa,KAAK,EAAE,YAAY;AAC1D,MAAI,gBAAgB,UAAa,gBAAgB,MAAM,gBAAgB;AACrE,WAAO,IAAI,eAAe,WAAW;AACvC,qBAAmB,QAAQ,UAAU,MAAM,MAAM;AACnD;AAEO,IAAM,oBAAoB,CAAC,KAAa,YAAuC;AACpF,QAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,qBAAmB,OAAO,cAAc,OAAO;AAC/C,SAAO,OAAO,SAAS;AACzB;AAEA,IAAM,qBAAqB,CAAC,QAAyB,YAAqC;AACxF,qBAAmB,QAAQ,UAAU,QAAQ,MAAM;AACnD,qBAAmB,QAAQ,SAAS,QAAQ,KAAK;AACnD;AAEA,IAAM,kBAAkB,CAAC,QAAyB,KAAa,UAAwC;AACrG,MAAI,UAAU,UAAa,OAAO,KAAK,KAAK,EAAE,SAAS,EAAG,QAAO,IAAI,KAAK,KAAK,UAAU,KAAK,CAAC;AACjG;AAEA,IAAM,oBAAoB,CAAC,QAAyB,KAAa,UAAoC;AACnG,MAAI,UAAU,UAAa,OAAO,SAAS,KAAK,KAAK,QAAQ,EAAG,QAAO,IAAI,KAAK,OAAO,KAAK,MAAM,KAAK,CAAC,CAAC;AAC3G;AAEA,IAAM,qBAAqB,CAAC,QAAyB,KAAa,UAA6C;AAC7G,QAAM,UAAU,OAAO,SAAS,EAAE,KAAK;AACvC,MAAI,YAAY,UAAa,YAAY,GAAI,QAAO,IAAI,KAAK,OAAO;AACtE;;;AChGA,IAAM,6BAA6B;AACnC,IAAM,iCAAiC;AAEvC,gBAAuB,UAA2B,SAA+D;AAC/G,QAAM,YAAY,QAAQ,SAAS,eAAe;AAClD,MAAI,cAAc,OAAW,OAAM,IAAI,MAAM,6CAA6C;AAE1F,MAAI,MAAM,kBAAkB,QAAQ,KAAK,cAAc,OAAO,CAAC;AAC/D,MAAI;AACJ,MAAI,mBAAmB,QAAQ,oBAAoB;AACnD,QAAM,sBAAsB,QAAQ,uBAAuB;AAE3D,SAAO,CAAC,QAAQ,QAAQ,SAAS;AAC/B,QAAI;AACF,YAAM,UAAU,IAAI,QAAQ,QAAQ,OAAO;AAC3C,cAAQ,IAAI,UAAU,mBAAmB;AACzC,UAAI,QAAQ,WAAW,EAAG,SAAQ,IAAI,iBAAiB,WAAW;AAElE,YAAM,OAAoB,EAAE,QAAQ;AACpC,UAAI,QAAQ,OAAQ,MAAK,SAAS,QAAQ;AAC1C,YAAM,WAAW,MAAM,UAAU,KAAK,IAAI;AAC1C,UAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,gCAAgC,SAAS,MAAM,GAAG;AACpF,UAAI,CAAC,SAAS,KAAM,OAAM,IAAI,MAAM,oCAAoC;AAExE,uBAAiB,WAAW,eAAsB,SAAS,IAAI,GAAG;AAChE,YAAI,QAAQ,QAAQ,EAAE,GAAG;AACvB,wBAAc,QAAQ;AACtB,gBAAM,kBAAkB,QAAQ,KAAK,EAAE,QAAQ,YAAY,CAAC;AAAA,QAC9D;AAEA,YAAI,QAAQ,UAAU,OAAW,oBAAmB,QAAQ;AAC5D,YAAI,QAAQ,SAAS,GAAI,OAAM;AAAA,MACjC;AAAA,IACF,SAAS,OAAO;AACd,UAAI,QAAQ,QAAQ,QAAS;AAC7B,UAAI,QAAQ,cAAc,MAAO,OAAM;AAAA,IACzC;AAEA,QAAI,QAAQ,cAAc,MAAO;AACjC,UAAM,KAAK,KAAK,IAAI,kBAAkB,mBAAmB,GAAG,QAAQ,MAAM;AAC1E,uBAAmB,KAAK,IAAI,mBAAmB,GAAG,mBAAmB;AAAA,EACvE;AACF;AAEA,gBAAuB,eACrB,MACkC;AAClC,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AACb,MAAI,QAAQ,cAAc;AAE1B,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAEhD,UAAI,UAAU,YAAY,MAAM;AAChC,aAAO,YAAY,QAAW;AAC5B,cAAM,UAAU,OAAO,MAAM,GAAG,QAAQ,KAAK;AAC7C,iBAAS,OAAO,MAAM,QAAQ,SAAS;AACvC,cAAM,UAAU,eAAsB,SAAS,KAAK;AACpD,YAAI,SAAS;AACX,gBAAM;AACN,kBAAQ,cAAc;AAAA,QACxB;AAEA,kBAAU,YAAY,MAAM;AAAA,MAC9B;AAAA,IACF;AAEA,cAAU,QAAQ,OAAO;AACzB,QAAI,WAAW,IAAI;AACjB,YAAM,UAAU,eAAsB,QAAQ,KAAK;AACnD,UAAI,SAAS;AACX,cAAM;AACN,gBAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AAEA,QAAI,MAAM,KAAK,SAAS,EAAG,OAAM,aAAoB,KAAK;AAAA,EAC5D,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;AASA,IAAM,gBAAgB,OAAuB,EAAE,MAAM,CAAC,EAAE;AAExD,IAAM,iBAAiB,MACrB,OAAO,WAAW,UAAU,aAAa,WAAW,QAAQ;AAE9D,IAAM,UAAU,CAAC,UAA+C,UAAU,UAAa,UAAU;AAEjG,IAAM,iBAAiB,CAAQ,MAAc,UAAyD;AACpG,MAAI,SAAS,IAAI;AACf,QAAI,MAAM,KAAK,WAAW,EAAG,QAAO;AACpC,WAAO,aAAoB,KAAK;AAAA,EAClC;AAEA,MAAI,KAAK,WAAW,GAAG,EAAG,QAAO;AAEjC,QAAM,iBAAiB,KAAK,QAAQ,GAAG;AACvC,QAAM,QAAQ,mBAAmB,KAAK,OAAO,KAAK,MAAM,GAAG,cAAc;AACzE,QAAM,QAAQ,mBAAmB,KAAK,KAAK,KAAK,MAAM,iBAAiB,CAAC,EAAE,QAAQ,MAAM,EAAE;AAE1F,UAAQ,OAAO;AAAA,IACb,KAAK,QAAQ;AACX,YAAM,KAAK,KAAK,KAAK;AACrB;AAAA,IACF;AAAA,IAEA,KAAK,SAAS;AACZ,YAAM,QAAQ;AACd;AAAA,IACF;AAAA,IAEA,KAAK,MAAM;AACT,YAAM,KAAK;AACX;AAAA,IACF;AAAA,IAEA,KAAK,SAAS;AACZ,YAAM,QAAQ,OAAO,SAAS,OAAO,EAAE;AACvC,UAAI,OAAO,SAAS,KAAK,KAAK,SAAS,EAAG,OAAM,QAAQ;AACxD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,eAAe,CAAQ,UAA6C;AACxE,QAAM,OAAO,MAAM,KAAK,KAAK,IAAI;AACjC,QAAM,UAA6B,EAAE,KAAK;AAC1C,MAAI,MAAM,OAAO,OAAW,SAAQ,KAAK,MAAM;AAC/C,MAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,MAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,QAAM,SAAS,UAAiB,IAAI;AACpC,MAAI,WAAW,OAAW,SAAQ,SAAS;AAC3C,SAAO;AACT;AAEA,IAAM,gBAAgB,CAAC,YAA0D;AAC/E,QAAM,SAAgE,CAAC;AACvE,MAAI,QAAQ,WAAW,OAAW,QAAO,SAAS,QAAQ;AAC1D,MAAI,QAAQ,UAAU,OAAW,QAAO,QAAQ,QAAQ;AACxD,SAAO;AACT;AAEA,IAAM,YAAY,CAAQ,SAAoC;AAC5D,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,cAAc,CAAC,UAAoE;AACvF,QAAM,KAAK,MAAM,QAAQ,IAAI;AAC7B,QAAM,KAAK,MAAM,QAAQ,IAAI;AAC7B,MAAI,OAAO,MAAM,OAAO,GAAI,QAAO;AACnC,MAAI,OAAO,OAAO,OAAO,MAAM,KAAK,KAAK;AACvC,WAAO,EAAE,OAAO,IAAI,WAAW,MAAM,KAAK,CAAC,MAAM,OAAO,KAAK,IAAI,KAAK,EAAE;AAAA,EAC1E;AAEA,SAAO,EAAE,OAAO,IAAI,WAAW,KAAK,EAAE;AACxC;AAEA,IAAM,OAAO,OAAO,SAAiB,WACnC,IAAI,QAAQ,CAAC,YAAY;AACvB,MAAI,QAAQ,SAAS;AACnB,YAAQ;AACR;AAAA,EACF;AAEA,QAAM,UAAU,WAAW,SAAS,OAAO;AAC3C,UAAQ;AAAA,IACN;AAAA,IACA,MAAM;AACJ,mBAAa,OAAO;AACpB,cAAQ;AAAA,IACV;AAAA,IACA,EAAE,MAAM,KAAK;AAAA,EACf;AACF,CAAC;;;AC3JI,IAAM,uBAAuB;AAC7B,IAAMA,2BAA0B;AAEhC,IAAM,uBAAuB,CAAC,UAAiC,CAAC,MAAsB;AAC3F,QAAM,aAAa,iBAAiB,QAAQ,cAAc,oBAAoB;AAC9E,QAAM,gBAAgB,iBAAiB,QAAQ,iBAAiBA,wBAAuB;AACvF,QAAM,YAAY,QAAQ,SAASC,gBAAe;AAClD,QAAM,iBAAiB,QAAQ,WAAW,CAAC;AAC3C,QAAM,SAAS,sBAAsB,QAAQ,MAAM;AAEnD,MAAI,cAAc,OAAW,OAAM,IAAI,MAAM,6CAA6C;AAE1F,QAAM,UAAU,OAAkB,MAAc,OAAoB,CAAC,MAA0B;AAC7F,UAAM,UAAU,IAAI,QAAQ,cAAc;AAC1C,eAAW,CAAC,KAAK,KAAK,KAAK,IAAI,QAAQ,KAAK,OAAO,EAAE,QAAQ,EAAG,SAAQ,IAAI,KAAK,KAAK;AACtF,QAAI,WAAW,OAAW,SAAQ,IAAI,aAAa,MAAM;AACzD,QAAI,KAAK,SAAS,UAAa,CAAC,QAAQ,IAAI,cAAc,EAAG,SAAQ,IAAI,gBAAgB,kBAAkB;AAE3G,UAAM,WAAW,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,IAAI;AAAA,MACvD,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AACD,UAAM,OAAO,MAAM,iBAAiB,QAAQ;AAC5C,QAAI,CAAC,SAAS,GAAI,OAAM,IAAI,iBAAiB,UAAU,MAAM,oBAAoB,IAAI,CAAC;AACtF,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAkB,MAAc,SAC3C,QAAmB,MAAM,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC;AAEzE,QAAM,aAAa,CAAqC,UAA0B;AAChF,QAAI,WAAW,UAAa,sBAAsB,MAAM,MAAM,MAAM,OAAW,QAAO;AACtF,WAAO,EAAE,GAAG,OAAO,OAAO;AAAA,EAC5B;AAEA,QAAM,iBAAiB,CAAC,mBAAoD;AAC1E,UAAM,QAAQ,sBAAsB,cAAc,KAAK;AACvD,WAAO,UAAU,SAAY,CAAC,IAAI,EAAE,eAAe,UAAU,KAAK,GAAG;AAAA,EACvE;AAEA,QAAM,eAAe,iBAAkC;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GAA2D;AACzD,UAAM,aAAa,mBAAmB,uBAAuB,QAAQ,MAAM,IAAI;AAC/E,qBAAiB,WAAW,UAA8B;AAAA,MACxD,GAAG;AAAA,MACH,OAAO;AAAA,MACP,SAAS,EAAE,GAAG,eAAe,GAAG,GAAG,QAAQ;AAAA,MAC3C,KAAK;AAAA,IACP,CAAC,GAAG;AACF,UAAI,QAAQ,QAAQ;AAClB,cAAM,QAAQ;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAqB;AAE3B,QAAM,cAAc,OAAO,QAA0B,CAAC,MAAM,QAAyB,WAAW,QAAQ,KAAK,CAAC,EAAE;AAChH,QAAM,YAAY,OAAO,OAAe,QAAgB,YAAY,mBAAmB,EAAE,CAAC,EAAE;AAC5F,QAAM,eAAe,OAAO,UAA4B,KAAa,YAAY,WAAW,KAAK,CAAC;AAClG,QAAM,eAAe,OAAO,IAAY,UACtC,QAAgB,YAAY,mBAAmB,EAAE,CAAC,IAAI;AAAA,IACpD,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,WAAW,KAAK,CAAC;AAAA,EACxC,CAAC;AACH,QAAM,cAAc,OAAO,OAAe,KAAa,YAAY,mBAAmB,EAAE,CAAC,UAAU,CAAC,CAAC;AACrG,QAAM,aAAa,OAAO,OAAe,KAAa,YAAY,mBAAmB,EAAE,CAAC,SAAS,CAAC,CAAC;AACnG,QAAM,eAAe,OAAO,OAC1B,QAA4B,YAAY,mBAAmB,EAAE,CAAC,IAAI;AAAA,IAChE,QAAQ;AAAA,EACV,CAAC;AACH,QAAM,iBAAiB,OAAO,gBAC5B,KAAyB,6BAA6B;AAAA,IACpD,QAAQ,eAAe;AAAA,EACzB,CAAC;AACH,QAAM,mBAAmB,OAAO,OAC9B,QAAgC,YAAY,mBAAmB,EAAE,CAAC,qBAAqB;AACzF,QAAM,qBAAqB,OAAO,UAChC,KAAiC,gCAAgC,KAAK;AAExE,QAAM,UAAiC;AAAA,IACrC,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN,OAAO,OAAO,UAAU,KAA0B,yBAAyB,KAAK;AAAA,MAChF,eAAe,OAAO,UAAU,KAA4B,4BAA4B,KAAK;AAAA,MAC7F,aAA8B,OAA8B,gBAA2C,CAAC,GAAG;AACzG,cAAM,EAAE,kBAAkB,SAAS,QAAQ,OAAO,GAAG,gBAAgB,IAAI;AACzE,cAAM,mBAAwC;AAAA,UAC5C,GAAG;AAAA,UACH,QAAQ,kBAAkB,eAAe,OAAO,iBAAiB,QAAQ,KAAK,CAAC;AAAA,QACjF;AACA,YAAI,qBAAqB,OAAW,kBAAiB,mBAAmB;AACxE,YAAI,YAAY,OAAW,kBAAiB,UAAU;AACtD,YAAI,WAAW,OAAW,kBAAiB,SAAS;AACpD,YAAI,UAAU,OAAW,kBAAiB,QAAQ;AAClD,eAAO,aAAoB,gBAAgB;AAAA,MAC7C;AAAA,MACA,mBACE,OACA,gBAAiD,CAAC,GAClD;AACA,cAAM,EAAE,QAAQ,OAAO,GAAG,iBAAiB,IAAI;AAC/C,eAAO;AAAA,UACL,wBAAwB,eAAe,OAAO,iBAAiB,QAAQ,KAAK,CAAC;AAAA,UAC7E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,KAAK,CAAC,YAAY,aAAa,CAAC,MAAM,YAAY,eAAe,YAAY,UAAU;AAAA,MACvF,WAAW,CAAC,YAAY,aAAa,CAAC,MAAM,kBAAkB,eAAe,YAAY,UAAU;AAAA,MACnG,WAAW,CAAC,OAAO,aAAa,CAAC,MAAM,kBAAkB,eAAe,OAAO,UAAU;AAAA,MACzF,iBAAiB,CAAC,OAAO,aAAa,CAAC,MAAM,wBAAwB,eAAe,OAAO,UAAU;AAAA,IACvG;AAAA,IACA;AAAA,IACA,KAAK,CACH,KACA,kBAAyE,CAAC,MAE1E,UAAiB;AAAA,MACf,GAAG;AAAA,MACH,OAAO;AAAA,MACP,SAAS,eAAe;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,IACH;AAAA,IACA,WAAW,CAAsB,KAAa,kBAAyD,CAAC,MACtG,mBAA0B,KAAK,eAAe;AAAA,IAChD;AAAA,EACF;AACF;AAEA,IAAMA,kBAAiB,MACrB,OAAO,WAAW,UAAU,aAAa,WAAW,QAAQ;AAE9D,IAAM,wBAAwB,CAAC,UAAkD;AAC/E,QAAM,UAAU,OAAO,KAAK;AAC5B,SAAO,YAAY,UAAa,YAAY,KAAK,SAAY;AAC/D;","names":["DEFAULT_STREAM_BASE_URL","getGlobalFetch"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@restless-stream/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TypeScript SDK for Restless Stream.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"tsup": "^8.5.1",
|
|
22
|
+
"typescript": "^6.0.3",
|
|
23
|
+
"vitest": "^4.0.15"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:live": "vitest run test/live.test.ts --config vitest.live.config.ts",
|
|
29
|
+
"typecheck": "tsc --noEmit"
|
|
30
|
+
}
|
|
31
|
+
}
|