@polymorfa/store 0.1.0-dev.20260922094209

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.
@@ -0,0 +1,510 @@
1
+ import { BUILT_IN_REDUCERS } from "./reducers.js";
2
+ /**
3
+ * Feeds `source` into `store`, resuming from the saved checkpoint and
4
+ * saving the cursor after each committed batch.
5
+ */
6
+ export function connectEventSource(store, source, options = {}) {
7
+ const checkpoint = options.checkpoint ?? "default";
8
+ const maxBatch = Math.max(1, options.maxBatch ?? 500);
9
+ const pending = [];
10
+ let cursor;
11
+ let closed = false;
12
+ let unsubscribe;
13
+ let draining = Promise.resolve();
14
+ let running = false;
15
+ // A failed write stops the connection so the checkpoint never moves past
16
+ // events that were not stored. Close and reconnect to resume from it.
17
+ let failed = false;
18
+ const report = (error) => options.onError?.(error);
19
+ const drain = async () => {
20
+ running = true;
21
+ try {
22
+ while (pending.length > 0 && !closed && !failed) {
23
+ const batch = pending.splice(0, maxBatch);
24
+ try {
25
+ await store.ingest(batch.map(({ event }) => event));
26
+ }
27
+ catch (error) {
28
+ failed = true;
29
+ pending.unshift(...batch);
30
+ throw error;
31
+ }
32
+ let last;
33
+ for (const entry of batch)
34
+ last = entry.cursor ?? last;
35
+ if (last !== undefined && !closed) {
36
+ await store.checkpoints.set(checkpoint, last);
37
+ cursor = last;
38
+ }
39
+ }
40
+ }
41
+ catch (error) {
42
+ report(error);
43
+ }
44
+ finally {
45
+ running = false;
46
+ }
47
+ };
48
+ const listener = (events, meta) => {
49
+ if (closed || failed)
50
+ return;
51
+ const list = Array.isArray(events)
52
+ ? events
53
+ : [events];
54
+ list.forEach((event, index) => pending.push({
55
+ event,
56
+ ...(index === list.length - 1 && meta?.cursor !== undefined
57
+ ? { cursor: meta.cursor }
58
+ : {}),
59
+ }));
60
+ if (!running)
61
+ draining = drain();
62
+ };
63
+ const started = store.checkpoints.get(checkpoint).then((saved) => {
64
+ if (closed)
65
+ return;
66
+ cursor = saved?.cursor;
67
+ unsubscribe = source.subscribe(listener, {
68
+ ...(cursor === undefined ? {} : { cursor }),
69
+ onError: report,
70
+ });
71
+ }, (error) => report(error));
72
+ return {
73
+ async idle() {
74
+ await started;
75
+ while (running || (pending.length > 0 && !failed)) {
76
+ if (!running)
77
+ draining = drain();
78
+ await draining;
79
+ }
80
+ },
81
+ get cursor() {
82
+ return cursor;
83
+ },
84
+ close() {
85
+ closed = true;
86
+ unsubscribe?.();
87
+ unsubscribe = undefined;
88
+ },
89
+ };
90
+ }
91
+ /** Longest line `SseParser` accepts by default: 1 MiB of characters. */
92
+ export const DEFAULT_SSE_MAX_LINE_LENGTH = 1024 * 1024;
93
+ /** Incremental `text/event-stream` parser. */
94
+ export class SseParser {
95
+ #maxLineLength;
96
+ #buffer = "";
97
+ #event = "";
98
+ #data = [];
99
+ #id;
100
+ #retry;
101
+ #sawBom = false;
102
+ #pendingCarriageReturn = false;
103
+ /** The last event ID seen, kept across frames as the spec requires. */
104
+ lastEventId;
105
+ constructor(options = {}) {
106
+ this.#maxLineLength = options.maxLineLength ?? DEFAULT_SSE_MAX_LINE_LENGTH;
107
+ }
108
+ /**
109
+ * Parses `chunk` and returns every frame it completes. Throws when one
110
+ * line grows past `maxLineLength`; the parser is then reset.
111
+ */
112
+ feed(chunk) {
113
+ if (this.#pendingCarriageReturn && chunk.startsWith("\n"))
114
+ chunk = chunk.slice(1);
115
+ this.#pendingCarriageReturn = chunk.endsWith("\r");
116
+ let text = this.#buffer + chunk;
117
+ if (!this.#sawBom && text.length > 0) {
118
+ this.#sawBom = true;
119
+ if (text.charCodeAt(0) === 0xfeff)
120
+ text = text.slice(1);
121
+ }
122
+ const frames = [];
123
+ const lines = text.split(/\r\n|\r|\n/);
124
+ // The last piece is an unterminated line; `\r\n` split across chunks
125
+ // is handled by `#pendingCarriageReturn`.
126
+ this.#buffer = lines.pop() ?? "";
127
+ if (this.#buffer.length > this.#maxLineLength ||
128
+ lines.some((line) => line.length > this.#maxLineLength)) {
129
+ this.#buffer = "";
130
+ this.#event = "";
131
+ this.#data = [];
132
+ this.#id = undefined;
133
+ this.#retry = undefined;
134
+ throw new Error(`An event stream line exceeded ${this.#maxLineLength} characters.`);
135
+ }
136
+ for (const line of lines) {
137
+ const frame = this.#line(line);
138
+ if (frame !== undefined)
139
+ frames.push(frame);
140
+ }
141
+ return frames;
142
+ }
143
+ /** Flushes a final unterminated line; an unfinished frame is dropped. */
144
+ end() {
145
+ const frames = this.#buffer === "" ? [] : this.feed("\n");
146
+ this.#buffer = "";
147
+ this.#event = "";
148
+ this.#data = [];
149
+ this.#id = undefined;
150
+ this.#retry = undefined;
151
+ this.#pendingCarriageReturn = false;
152
+ return frames;
153
+ }
154
+ #line(line) {
155
+ if (line === "")
156
+ return this.#dispatch();
157
+ if (line.startsWith(":"))
158
+ return undefined;
159
+ const colon = line.indexOf(":");
160
+ const field = colon < 0 ? line : line.slice(0, colon);
161
+ let value = colon < 0 ? "" : line.slice(colon + 1);
162
+ if (value.startsWith(" "))
163
+ value = value.slice(1);
164
+ if (field === "event")
165
+ this.#event = value;
166
+ else if (field === "data")
167
+ this.#data.push(value);
168
+ else if (field === "id" && !value.includes("\u0000"))
169
+ this.#id = value;
170
+ else if (field === "retry" && /^\d+$/.test(value))
171
+ this.#retry = Number(value);
172
+ return undefined;
173
+ }
174
+ #dispatch() {
175
+ if (this.#id !== undefined)
176
+ this.lastEventId = this.#id;
177
+ const hasData = this.#data.length > 0;
178
+ const frame = {
179
+ event: this.#event === "" ? "message" : this.#event,
180
+ data: this.#data.join("\n"),
181
+ ...(this.lastEventId === undefined ? {} : { id: this.lastEventId }),
182
+ ...(this.#retry === undefined ? {} : { retry: this.#retry }),
183
+ };
184
+ this.#event = "";
185
+ this.#data = [];
186
+ this.#id = undefined;
187
+ this.#retry = undefined;
188
+ return hasData ? frame : undefined;
189
+ }
190
+ }
191
+ /**
192
+ * Turns an SSE `data` payload into events. The data is one event envelope
193
+ * or an array of them. A frame without an `event` field takes the SSE
194
+ * event name, and one without an `id` takes the SSE event ID.
195
+ */
196
+ export function eventsFromFrame(frame) {
197
+ const parsed = JSON.parse(frame.data);
198
+ const list = Array.isArray(parsed) ? parsed : [parsed];
199
+ return list.map((entry) => {
200
+ if (typeof entry !== "object" || entry === null)
201
+ throw new TypeError("An event frame must contain a JSON object.");
202
+ const record = entry;
203
+ return {
204
+ ...record,
205
+ ...(typeof record.event !== "string" && frame.event !== "message"
206
+ ? { event: frame.event }
207
+ : {}),
208
+ ...(typeof record.id !== "string" && frame.id !== undefined
209
+ ? { id: frame.id }
210
+ : {}),
211
+ };
212
+ });
213
+ }
214
+ /**
215
+ * Every event type a built-in reducer handles; pass `eventTypes` to follow
216
+ * others by name.
217
+ */
218
+ export const DEFAULT_SSE_EVENT_TYPES = Object.keys(BUILT_IN_REDUCERS);
219
+ /**
220
+ * Follows a server-sent event stream. The browser's `EventSource` resumes
221
+ * within a page with `Last-Event-ID`; across page loads the saved cursor is
222
+ * sent as the `resumeParam` query parameter.
223
+ */
224
+ export function fromEventSource(input, options = {}) {
225
+ return {
226
+ subscribe(listener, subscribeOptions = {}) {
227
+ let source;
228
+ if (typeof input === "string" || input instanceof URL) {
229
+ const Constructor = options.EventSource ??
230
+ globalThis.EventSource;
231
+ if (Constructor === undefined)
232
+ throw new Error("EventSource is not available in this environment.");
233
+ const url = new URL(String(input), globalThis.location?.href);
234
+ if (subscribeOptions.cursor !== undefined)
235
+ url.searchParams.set(options.resumeParam ?? "lastEventId", subscribeOptions.cursor);
236
+ source = new Constructor(url.toString(), options.withCredentials === undefined
237
+ ? undefined
238
+ : { withCredentials: options.withCredentials });
239
+ }
240
+ else
241
+ source = input;
242
+ const handle = (message) => {
243
+ try {
244
+ const id = message.lastEventId === "" ? undefined : message.lastEventId;
245
+ const events = eventsFromFrame({
246
+ event: message.type,
247
+ data: message.data,
248
+ ...(id === undefined ? {} : { id }),
249
+ });
250
+ listener(events, id === undefined ? undefined : { cursor: id });
251
+ }
252
+ catch (error) {
253
+ subscribeOptions.onError?.(error);
254
+ }
255
+ };
256
+ const types = [
257
+ "message",
258
+ ...(options.eventTypes ?? DEFAULT_SSE_EVENT_TYPES),
259
+ ];
260
+ for (const type of types)
261
+ source.addEventListener(type, handle);
262
+ source.onerror = (event) => subscribeOptions.onError?.(event);
263
+ return () => {
264
+ for (const type of types)
265
+ source.removeEventListener(type, handle);
266
+ source.onerror = null;
267
+ if (typeof input === "string" || input instanceof URL)
268
+ source.close();
269
+ };
270
+ },
271
+ };
272
+ }
273
+ /** Shortest delay between reconnect attempts, whatever the server sends. */
274
+ export const MIN_EVENT_STREAM_RETRY_MS = 250;
275
+ function decodeBase64Json(data) {
276
+ const bytes = Uint8Array.from(atob(data), (char) => char.charCodeAt(0));
277
+ return JSON.parse(new TextDecoder().decode(bytes));
278
+ }
279
+ /**
280
+ * Reads one `data` payload from the Polymorfa project event stream. `event`
281
+ * frames yield the decoded webhook body and the cursor to resume after it;
282
+ * `expiry`, `dropped`, and a non-retention `gap` ask for a reconnect;
283
+ * `revoked` ends the stream; `ready`, `heartbeat`, and unknown frames are
284
+ * ignored.
285
+ */
286
+ export function readProjectStreamFrame(data) {
287
+ const frame = JSON.parse(data);
288
+ if (typeof frame !== "object" || frame === null)
289
+ throw new TypeError("An event stream frame must be a JSON object.");
290
+ const record = frame;
291
+ switch (record.type) {
292
+ case "event": {
293
+ if (typeof record.cursor !== "string")
294
+ throw new TypeError("An event frame must carry a cursor.");
295
+ const event = record.event;
296
+ const payload = event?.payload;
297
+ if (payload === null || payload === undefined)
298
+ return { kind: "event", events: [], cursor: record.cursor };
299
+ if (payload.encoding !== "base64" || typeof payload.data !== "string")
300
+ throw new TypeError("An event payload must be base64 encoded.");
301
+ return {
302
+ kind: "event",
303
+ events: eventsFromFrame({
304
+ event: "message",
305
+ data: JSON.stringify(decodeBase64Json(payload.data)),
306
+ }),
307
+ cursor: record.cursor,
308
+ };
309
+ }
310
+ case "gap":
311
+ return record.reason === "retention_exceeded"
312
+ ? { kind: "ignore" }
313
+ : { kind: "reconnect", reason: `gap_${String(record.reason)}` };
314
+ case "expiry":
315
+ case "dropped":
316
+ return { kind: "reconnect", reason: record.type };
317
+ case "revoked":
318
+ return { kind: "revoked" };
319
+ default:
320
+ return { kind: "ignore" };
321
+ }
322
+ }
323
+ class ReconnectRequested extends Error {
324
+ }
325
+ /**
326
+ * Follows an event stream with `fetch`, which can send headers that
327
+ * `EventSource` cannot. Reconnects with `Last-Event-ID`.
328
+ */
329
+ export function fromEventStream(options) {
330
+ const project = options.format === "project";
331
+ return {
332
+ subscribe(listener, subscribeOptions = {}) {
333
+ const controller = new AbortController();
334
+ const request = options.fetch ?? globalThis.fetch.bind(globalThis);
335
+ let lastEventId = subscribeOptions.cursor;
336
+ let retry = options.retryMs ?? 3_000;
337
+ const connect = async () => {
338
+ const headers = new Headers(await options.headers?.());
339
+ headers.set("Accept", "text/event-stream");
340
+ if (lastEventId !== undefined)
341
+ headers.set("Last-Event-ID", lastEventId);
342
+ const response = await request(String(options.url), {
343
+ headers,
344
+ signal: controller.signal,
345
+ ...(options.credentials === undefined
346
+ ? {}
347
+ : { credentials: options.credentials }),
348
+ });
349
+ const type = response.headers.get("content-type") ?? "";
350
+ if (!response.ok || !type.includes("text/event-stream"))
351
+ throw new Error(`Event stream request failed with status ${response.status}.`);
352
+ if (response.body === null)
353
+ return;
354
+ const parser = new SseParser(options.maxLineLength === undefined
355
+ ? {}
356
+ : { maxLineLength: options.maxLineLength });
357
+ const reader = response.body
358
+ .pipeThrough(new TextDecoderStream())
359
+ .getReader();
360
+ const deliverProject = (frame) => {
361
+ let result;
362
+ try {
363
+ result = readProjectStreamFrame(frame.data);
364
+ }
365
+ catch (error) {
366
+ subscribeOptions.onError?.(error);
367
+ return;
368
+ }
369
+ if (result.kind === "reconnect")
370
+ throw new ReconnectRequested(result.reason);
371
+ if (result.kind === "revoked") {
372
+ controller.abort();
373
+ subscribeOptions.onError?.(new Error("The event stream was revoked."));
374
+ return;
375
+ }
376
+ if (result.kind !== "event")
377
+ return;
378
+ lastEventId = result.cursor;
379
+ if (result.events.length > 0)
380
+ listener(result.events, { cursor: result.cursor });
381
+ };
382
+ const deliver = (frames) => {
383
+ for (const frame of frames) {
384
+ if (controller.signal.aborted)
385
+ return;
386
+ if (frame.retry !== undefined)
387
+ retry = frame.retry;
388
+ if (project) {
389
+ deliverProject(frame);
390
+ continue;
391
+ }
392
+ if (frame.id !== undefined)
393
+ lastEventId = frame.id;
394
+ try {
395
+ listener(eventsFromFrame(frame), frame.id === undefined ? undefined : { cursor: frame.id });
396
+ }
397
+ catch (error) {
398
+ subscribeOptions.onError?.(error);
399
+ }
400
+ }
401
+ };
402
+ try {
403
+ for (;;) {
404
+ const { value, done } = await reader.read();
405
+ if (done)
406
+ break;
407
+ deliver(parser.feed(value));
408
+ }
409
+ deliver(parser.end());
410
+ }
411
+ finally {
412
+ void reader.cancel().catch(() => undefined);
413
+ }
414
+ };
415
+ const wait = (ms) => new Promise((resolve) => {
416
+ const finish = () => {
417
+ clearTimeout(timer);
418
+ controller.signal.removeEventListener("abort", finish);
419
+ resolve();
420
+ };
421
+ const timer = setTimeout(finish, ms);
422
+ controller.signal.addEventListener("abort", finish, { once: true });
423
+ });
424
+ void (async () => {
425
+ while (!controller.signal.aborted) {
426
+ try {
427
+ await connect();
428
+ }
429
+ catch (error) {
430
+ if (controller.signal.aborted)
431
+ return;
432
+ if (!(error instanceof ReconnectRequested))
433
+ subscribeOptions.onError?.(error);
434
+ }
435
+ if (controller.signal.aborted)
436
+ return;
437
+ await wait(Math.max(MIN_EVENT_STREAM_RETRY_MS, retry));
438
+ }
439
+ })();
440
+ return () => controller.abort();
441
+ },
442
+ };
443
+ }
444
+ /** Follows JSON event frames on a WebSocket. */
445
+ export function fromWebSocket(input, options = {}) {
446
+ return {
447
+ subscribe(listener, subscribeOptions = {}) {
448
+ const socket = typeof input === "string" || input instanceof URL
449
+ ? new WebSocket(input, options.protocols)
450
+ : input;
451
+ const handle = (message) => {
452
+ try {
453
+ if (typeof message.data !== "string")
454
+ throw new TypeError("Event frames must be text.");
455
+ const events = eventsFromFrame({
456
+ event: "message",
457
+ data: message.data,
458
+ });
459
+ const last = events.at(-1);
460
+ listener(events, last === undefined ? undefined : { cursor: last.id });
461
+ }
462
+ catch (error) {
463
+ subscribeOptions.onError?.(error);
464
+ }
465
+ };
466
+ socket.addEventListener("message", handle);
467
+ return () => {
468
+ socket.removeEventListener("message", handle);
469
+ if (typeof input === "string" || input instanceof URL)
470
+ socket.close();
471
+ };
472
+ },
473
+ };
474
+ }
475
+ /** Replays a list or async iterable, for example a backend backfill. */
476
+ export function fromIterable(events, options = {}) {
477
+ const batchSize = Math.max(1, options.batchSize ?? 500);
478
+ let completed = Promise.resolve();
479
+ return {
480
+ get completed() {
481
+ return completed;
482
+ },
483
+ subscribe(listener, subscribeOptions = {}) {
484
+ let stopped = false;
485
+ completed = (async () => {
486
+ let batch = [];
487
+ try {
488
+ for await (const event of events) {
489
+ if (stopped)
490
+ return;
491
+ batch.push(event);
492
+ if (batch.length >= batchSize) {
493
+ listener(batch);
494
+ batch = [];
495
+ }
496
+ }
497
+ if (!stopped && batch.length > 0)
498
+ listener(batch);
499
+ }
500
+ catch (error) {
501
+ subscribeOptions.onError?.(error);
502
+ }
503
+ })();
504
+ return () => {
505
+ stopped = true;
506
+ };
507
+ },
508
+ };
509
+ }
510
+ //# sourceMappingURL=sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../src/sources.ts"],"names":[],"mappings":"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"}