@graphrefly/graphrefly 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.
Files changed (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/dist/chunk-5X3LAO3B.js +1571 -0
  4. package/dist/chunk-5X3LAO3B.js.map +1 -0
  5. package/dist/chunk-6W5SGIGB.js +1793 -0
  6. package/dist/chunk-6W5SGIGB.js.map +1 -0
  7. package/dist/chunk-CP6MNKAA.js +97 -0
  8. package/dist/chunk-CP6MNKAA.js.map +1 -0
  9. package/dist/chunk-HP7OKEOE.js +107 -0
  10. package/dist/chunk-HP7OKEOE.js.map +1 -0
  11. package/dist/chunk-KWXPDASV.js +781 -0
  12. package/dist/chunk-KWXPDASV.js.map +1 -0
  13. package/dist/chunk-O3PI7W45.js +68 -0
  14. package/dist/chunk-O3PI7W45.js.map +1 -0
  15. package/dist/chunk-QW7H3ICI.js +1372 -0
  16. package/dist/chunk-QW7H3ICI.js.map +1 -0
  17. package/dist/chunk-VPS7L64N.js +4785 -0
  18. package/dist/chunk-VPS7L64N.js.map +1 -0
  19. package/dist/chunk-Z4Y4FMQN.js +1097 -0
  20. package/dist/chunk-Z4Y4FMQN.js.map +1 -0
  21. package/dist/compat/nestjs/index.cjs +4883 -0
  22. package/dist/compat/nestjs/index.cjs.map +1 -0
  23. package/dist/compat/nestjs/index.d.cts +7 -0
  24. package/dist/compat/nestjs/index.d.ts +7 -0
  25. package/dist/compat/nestjs/index.js +84 -0
  26. package/dist/compat/nestjs/index.js.map +1 -0
  27. package/dist/core/index.cjs +1632 -0
  28. package/dist/core/index.cjs.map +1 -0
  29. package/dist/core/index.d.cts +2 -0
  30. package/dist/core/index.d.ts +2 -0
  31. package/dist/core/index.js +90 -0
  32. package/dist/core/index.js.map +1 -0
  33. package/dist/extra/index.cjs +6885 -0
  34. package/dist/extra/index.cjs.map +1 -0
  35. package/dist/extra/index.d.cts +5 -0
  36. package/dist/extra/index.d.ts +5 -0
  37. package/dist/extra/index.js +290 -0
  38. package/dist/extra/index.js.map +1 -0
  39. package/dist/graph/index.cjs +3225 -0
  40. package/dist/graph/index.cjs.map +1 -0
  41. package/dist/graph/index.d.cts +3 -0
  42. package/dist/graph/index.d.ts +3 -0
  43. package/dist/graph/index.js +25 -0
  44. package/dist/graph/index.js.map +1 -0
  45. package/dist/graph-CL_ZDAj9.d.cts +605 -0
  46. package/dist/graph-D18qmsNm.d.ts +605 -0
  47. package/dist/index-B6SsZs2h.d.cts +3463 -0
  48. package/dist/index-B7eOdgEx.d.ts +449 -0
  49. package/dist/index-BHUvlQ3v.d.ts +3463 -0
  50. package/dist/index-BtK55IE2.d.ts +231 -0
  51. package/dist/index-BvhgZRHK.d.cts +231 -0
  52. package/dist/index-Bvy_6CaN.d.ts +452 -0
  53. package/dist/index-C3BMRmmp.d.cts +449 -0
  54. package/dist/index-C5mqLhMX.d.cts +452 -0
  55. package/dist/index-CP_QvbWu.d.ts +940 -0
  56. package/dist/index-D_geH2Bm.d.cts +940 -0
  57. package/dist/index.cjs +14843 -0
  58. package/dist/index.cjs.map +1 -0
  59. package/dist/index.d.cts +1517 -0
  60. package/dist/index.d.ts +1517 -0
  61. package/dist/index.js +3649 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/meta-BsF6Sag9.d.cts +607 -0
  64. package/dist/meta-BsF6Sag9.d.ts +607 -0
  65. package/dist/patterns/reactive-layout/index.cjs +4143 -0
  66. package/dist/patterns/reactive-layout/index.cjs.map +1 -0
  67. package/dist/patterns/reactive-layout/index.d.cts +3 -0
  68. package/dist/patterns/reactive-layout/index.d.ts +3 -0
  69. package/dist/patterns/reactive-layout/index.js +38 -0
  70. package/dist/patterns/reactive-layout/index.js.map +1 -0
  71. package/dist/reactive-log-BfvfNWQh.d.cts +137 -0
  72. package/dist/reactive-log-ohLmTXoZ.d.ts +137 -0
  73. package/package.json +256 -0
@@ -0,0 +1,4785 @@
1
+ import {
2
+ bumpVersion,
3
+ cached,
4
+ createWatermarkController,
5
+ empty,
6
+ escapeRegexChar,
7
+ firstValueFrom,
8
+ forEach,
9
+ fromAny,
10
+ fromAsyncIter,
11
+ fromCron,
12
+ fromEvent,
13
+ fromFSWatch,
14
+ fromIter,
15
+ fromPromise,
16
+ fromTimer,
17
+ globToRegExp,
18
+ logSlice,
19
+ matchesAnyPattern,
20
+ matchesCron,
21
+ never,
22
+ observeGraph$,
23
+ observeNode$,
24
+ of,
25
+ parseCron,
26
+ reactiveLog,
27
+ replay,
28
+ share,
29
+ shareReplay,
30
+ snapshotEqualsVersion,
31
+ throwError,
32
+ toArray,
33
+ toMessages$,
34
+ toObservable
35
+ } from "./chunk-KWXPDASV.js";
36
+ import {
37
+ COMPLETE,
38
+ DATA,
39
+ DIRTY,
40
+ ERROR,
41
+ INVALIDATE,
42
+ PAUSE,
43
+ RESOLVED,
44
+ RESUME,
45
+ TEARDOWN,
46
+ __export,
47
+ __require,
48
+ batch,
49
+ derived,
50
+ dynamicNode,
51
+ effect,
52
+ knownMessageTypes,
53
+ messageTier,
54
+ monotonicNs,
55
+ node,
56
+ producer,
57
+ state,
58
+ wallClockNs
59
+ } from "./chunk-5X3LAO3B.js";
60
+
61
+ // src/extra/index.ts
62
+ var extra_exports = {};
63
+ __export(extra_exports, {
64
+ CircuitOpenError: () => CircuitOpenError,
65
+ DictCheckpointAdapter: () => DictCheckpointAdapter,
66
+ FileCheckpointAdapter: () => FileCheckpointAdapter,
67
+ MemoryCheckpointAdapter: () => MemoryCheckpointAdapter,
68
+ NS_PER_MS: () => NS_PER_MS,
69
+ NS_PER_SEC: () => NS_PER_SEC,
70
+ SqliteCheckpointAdapter: () => SqliteCheckpointAdapter,
71
+ audit: () => audit,
72
+ buffer: () => buffer,
73
+ bufferCount: () => bufferCount,
74
+ bufferTime: () => bufferTime,
75
+ cached: () => cached,
76
+ catchError: () => catchError,
77
+ checkpointNodeValue: () => checkpointNodeValue,
78
+ circuitBreaker: () => circuitBreaker,
79
+ combine: () => combine,
80
+ combineLatest: () => combineLatest,
81
+ concat: () => concat,
82
+ concatMap: () => concatMap,
83
+ constant: () => constant,
84
+ createTransport: () => createTransport,
85
+ createWatermarkController: () => createWatermarkController,
86
+ debounce: () => debounce,
87
+ debounceTime: () => debounceTime,
88
+ decorrelatedJitter: () => decorrelatedJitter,
89
+ delay: () => delay,
90
+ deserializeError: () => deserializeError,
91
+ distill: () => distill,
92
+ distinctUntilChanged: () => distinctUntilChanged,
93
+ elementAt: () => elementAt,
94
+ empty: () => empty,
95
+ escapeRegexChar: () => escapeRegexChar,
96
+ exhaustMap: () => exhaustMap,
97
+ exponential: () => exponential,
98
+ fibonacci: () => fibonacci,
99
+ filter: () => filter,
100
+ find: () => find,
101
+ first: () => first,
102
+ firstValueFrom: () => firstValueFrom,
103
+ flatMap: () => flatMap,
104
+ forEach: () => forEach,
105
+ fromAny: () => fromAny,
106
+ fromAsyncIter: () => fromAsyncIter,
107
+ fromCSV: () => fromCSV,
108
+ fromClickHouseWatch: () => fromClickHouseWatch,
109
+ fromCron: () => fromCron,
110
+ fromEvent: () => fromEvent,
111
+ fromFSWatch: () => fromFSWatch,
112
+ fromGitHook: () => fromGitHook,
113
+ fromHTTP: () => fromHTTP,
114
+ fromIDBRequest: () => fromIDBRequest,
115
+ fromIDBTransaction: () => fromIDBTransaction,
116
+ fromIter: () => fromIter,
117
+ fromKafka: () => fromKafka,
118
+ fromMCP: () => fromMCP,
119
+ fromNDJSON: () => fromNDJSON,
120
+ fromOTel: () => fromOTel,
121
+ fromPrometheus: () => fromPrometheus,
122
+ fromPromise: () => fromPromise,
123
+ fromRedisStream: () => fromRedisStream,
124
+ fromStatsD: () => fromStatsD,
125
+ fromSyslog: () => fromSyslog,
126
+ fromTimer: () => fromTimer,
127
+ fromWebSocket: () => fromWebSocket,
128
+ fromWebhook: () => fromWebhook,
129
+ gate: () => gate,
130
+ globToRegExp: () => globToRegExp,
131
+ interval: () => interval,
132
+ last: () => last,
133
+ linear: () => linear,
134
+ logSlice: () => logSlice,
135
+ map: () => map,
136
+ matchesAnyPattern: () => matchesAnyPattern,
137
+ matchesCron: () => matchesCron,
138
+ merge: () => merge,
139
+ mergeMap: () => mergeMap,
140
+ nameToSignal: () => nameToSignal,
141
+ never: () => never,
142
+ observeGraph$: () => observeGraph$,
143
+ observeNode$: () => observeNode$,
144
+ of: () => of,
145
+ pairwise: () => pairwise,
146
+ parseCron: () => parseCron,
147
+ parsePrometheusText: () => parsePrometheusText,
148
+ parseStatsD: () => parseStatsD,
149
+ parseSyslog: () => parseSyslog,
150
+ pausable: () => pausable,
151
+ pubsub: () => pubsub,
152
+ race: () => race,
153
+ rateLimiter: () => rateLimiter,
154
+ reactiveIndex: () => reactiveIndex,
155
+ reactiveList: () => reactiveList,
156
+ reactiveLog: () => reactiveLog,
157
+ reactiveMap: () => reactiveMap,
158
+ reduce: () => reduce,
159
+ repeat: () => repeat,
160
+ replay: () => replay,
161
+ rescue: () => rescue,
162
+ resolveBackoffPreset: () => resolveBackoffPreset,
163
+ restoreGraphCheckpoint: () => restoreGraphCheckpoint,
164
+ restoreGraphCheckpointIndexedDb: () => restoreGraphCheckpointIndexedDb,
165
+ retry: () => retry,
166
+ sample: () => sample,
167
+ saveGraphCheckpoint: () => saveGraphCheckpoint,
168
+ saveGraphCheckpointIndexedDb: () => saveGraphCheckpointIndexedDb,
169
+ scan: () => scan,
170
+ serializeError: () => serializeError,
171
+ share: () => share,
172
+ shareReplay: () => shareReplay,
173
+ signalToName: () => signalToName,
174
+ skip: () => skip,
175
+ startWith: () => startWith,
176
+ switchMap: () => switchMap,
177
+ take: () => take,
178
+ takeUntil: () => takeUntil,
179
+ takeWhile: () => takeWhile,
180
+ tap: () => tap,
181
+ throttle: () => throttle,
182
+ throttleTime: () => throttleTime,
183
+ throwError: () => throwError,
184
+ timeout: () => timeout,
185
+ toArray: () => toArray,
186
+ toKafka: () => toKafka,
187
+ toMessages$: () => toMessages$,
188
+ toObservable: () => toObservable,
189
+ toRedisStream: () => toRedisStream,
190
+ toSSE: () => toSSE,
191
+ toWebSocket: () => toWebSocket,
192
+ tokenBucket: () => tokenBucket,
193
+ tokenTracker: () => tokenTracker,
194
+ verifiable: () => verifiable,
195
+ window: () => window,
196
+ windowCount: () => windowCount,
197
+ windowTime: () => windowTime,
198
+ withBreaker: () => withBreaker,
199
+ withLatestFrom: () => withLatestFrom,
200
+ withMaxAttempts: () => withMaxAttempts,
201
+ withStatus: () => withStatus,
202
+ workerBridge: () => workerBridge,
203
+ workerSelf: () => workerSelf,
204
+ zip: () => zip
205
+ });
206
+
207
+ // src/extra/backoff.ts
208
+ var NS_PER_MS = 1e6;
209
+ var NS_PER_SEC = 1e9;
210
+ function clampNonNegative(value) {
211
+ return value < 0 ? 0 : value;
212
+ }
213
+ function applyJitter(delay2, jitter) {
214
+ if (jitter === "none") return delay2;
215
+ if (jitter === "full") return Math.random() * delay2;
216
+ return delay2 / 2 + Math.random() * (delay2 / 2);
217
+ }
218
+ function randomBetween(min, max) {
219
+ return min + Math.random() * (max - min);
220
+ }
221
+ function constant(delayNs) {
222
+ const safe = clampNonNegative(delayNs);
223
+ return () => safe;
224
+ }
225
+ function linear(baseNs, stepNs) {
226
+ const safeBase = clampNonNegative(baseNs);
227
+ const safeStep = stepNs === void 0 ? safeBase : clampNonNegative(stepNs);
228
+ return (attempt) => safeBase + safeStep * Math.max(0, attempt);
229
+ }
230
+ function exponential(options) {
231
+ const baseNs = clampNonNegative(options?.baseNs ?? 100 * NS_PER_MS);
232
+ const factor = options?.factor !== void 0 && options.factor < 1 ? 1 : options?.factor ?? 2;
233
+ const maxDelayNs = clampNonNegative(options?.maxDelayNs ?? 30 * NS_PER_SEC);
234
+ const jitter = options?.jitter ?? "none";
235
+ return (attempt) => {
236
+ let delay2;
237
+ if (baseNs === 0) {
238
+ delay2 = 0;
239
+ } else if (factor === 1) {
240
+ delay2 = baseNs;
241
+ } else {
242
+ const capRatio = maxDelayNs / baseNs;
243
+ let growth = 1;
244
+ for (let i = 0; i < Math.max(0, attempt); i++) {
245
+ if (growth >= capRatio) {
246
+ growth = capRatio;
247
+ break;
248
+ }
249
+ growth *= factor;
250
+ }
251
+ delay2 = baseNs * growth;
252
+ if (delay2 > maxDelayNs) delay2 = maxDelayNs;
253
+ }
254
+ return applyJitter(delay2, jitter);
255
+ };
256
+ }
257
+ function fibonacci(baseNs = 100 * NS_PER_MS, maxDelayNs = 30 * NS_PER_SEC) {
258
+ const safeBase = clampNonNegative(baseNs);
259
+ const safeMax = clampNonNegative(maxDelayNs);
260
+ function fibUnit(attempt) {
261
+ if (attempt <= 0) return 1;
262
+ let prev = 1;
263
+ let cur = 2;
264
+ for (let i = 1; i < attempt; i++) {
265
+ const next = prev + cur;
266
+ prev = cur;
267
+ cur = next;
268
+ }
269
+ return cur;
270
+ }
271
+ return (attempt) => {
272
+ const raw = fibUnit(attempt) * safeBase;
273
+ return raw <= safeMax ? raw : safeMax;
274
+ };
275
+ }
276
+ function decorrelatedJitter(baseNs = 100 * NS_PER_MS, maxNs = 30 * NS_PER_SEC) {
277
+ return (_attempt, _error, prevDelayNs) => {
278
+ const last2 = prevDelayNs ?? baseNs;
279
+ const ceiling = Math.min(maxNs, last2 * 3);
280
+ return randomBetween(baseNs, ceiling);
281
+ };
282
+ }
283
+ function withMaxAttempts(strategy, maxAttempts) {
284
+ return (attempt, error, prevDelayNs) => {
285
+ if (attempt >= maxAttempts) return null;
286
+ return strategy(attempt, error, prevDelayNs);
287
+ };
288
+ }
289
+ function resolveBackoffPreset(name) {
290
+ if (name === "constant") return constant(1 * NS_PER_SEC);
291
+ if (name === "linear") return linear(1 * NS_PER_SEC);
292
+ if (name === "exponential") return exponential();
293
+ if (name === "fibonacci") return fibonacci();
294
+ if (name === "decorrelatedJitter") return decorrelatedJitter();
295
+ throw new Error(
296
+ `Unknown backoff preset: "${String(name)}". Use one of: constant, linear, exponential, fibonacci, decorrelatedJitter`
297
+ );
298
+ }
299
+
300
+ // src/extra/resilience.ts
301
+ function operatorOpts(opts) {
302
+ return { describeKind: "operator", ...opts };
303
+ }
304
+ function clampNonNegative2(value) {
305
+ return value < 0 ? 0 : value;
306
+ }
307
+ function msgVal(m) {
308
+ return m[1];
309
+ }
310
+ function coerceDelayNs(raw) {
311
+ if (raw === null) return 0;
312
+ if (typeof raw !== "number" || !Number.isFinite(raw)) {
313
+ throw new TypeError("backoff strategy must return a finite number or null");
314
+ }
315
+ return raw < 0 ? 0 : raw;
316
+ }
317
+ function retry(source, opts) {
318
+ const count = opts?.count;
319
+ const backoffOpt = opts?.backoff;
320
+ const maxRetries = count !== void 0 ? count : backoffOpt === void 0 ? 0 : 2147483647;
321
+ if (maxRetries < 0) throw new RangeError("retry count must be >= 0");
322
+ const strategy = backoffOpt === void 0 ? null : typeof backoffOpt === "string" ? resolveBackoffPreset(backoffOpt) : backoffOpt;
323
+ return producer(
324
+ (_d, a) => {
325
+ let attempt = 0;
326
+ let stopped = false;
327
+ let prevDelay = null;
328
+ let unsub;
329
+ let timer;
330
+ let timerGen = 0;
331
+ function cancelTimer() {
332
+ if (timer !== void 0) {
333
+ clearTimeout(timer);
334
+ timer = void 0;
335
+ }
336
+ }
337
+ function disconnectUpstream() {
338
+ unsub?.();
339
+ unsub = void 0;
340
+ }
341
+ function scheduleRetryOrFinish(err) {
342
+ if (stopped) return;
343
+ if (attempt >= maxRetries) {
344
+ disconnectUpstream();
345
+ a.down([[ERROR, err]]);
346
+ return;
347
+ }
348
+ const raw = strategy === null ? 0 : strategy(attempt, err, prevDelay);
349
+ const delayNs = coerceDelayNs(raw === void 0 ? null : raw);
350
+ prevDelay = delayNs;
351
+ attempt += 1;
352
+ timerGen += 1;
353
+ const gen = timerGen;
354
+ disconnectUpstream();
355
+ const delayMs = delayNs > 0 ? delayNs / NS_PER_MS : 1;
356
+ timer = setTimeout(() => {
357
+ timer = void 0;
358
+ if (stopped || gen !== timerGen) return;
359
+ connect();
360
+ }, delayMs);
361
+ }
362
+ function connect() {
363
+ cancelTimer();
364
+ disconnectUpstream();
365
+ unsub = source.subscribe((msgs) => {
366
+ for (const m of msgs) {
367
+ const t = m[0];
368
+ if (t === DIRTY) a.down([[DIRTY]]);
369
+ else if (t === DATA) {
370
+ attempt = 0;
371
+ prevDelay = null;
372
+ a.emit(m[1]);
373
+ } else if (t === RESOLVED) a.down([[RESOLVED]]);
374
+ else if (t === COMPLETE) {
375
+ disconnectUpstream();
376
+ a.down([[COMPLETE]]);
377
+ } else if (t === ERROR) {
378
+ scheduleRetryOrFinish(msgVal(m));
379
+ return;
380
+ } else a.down([m]);
381
+ }
382
+ });
383
+ }
384
+ connect();
385
+ return () => {
386
+ stopped = true;
387
+ timerGen += 1;
388
+ cancelTimer();
389
+ disconnectUpstream();
390
+ };
391
+ },
392
+ {
393
+ ...operatorOpts(),
394
+ initial: source.get()
395
+ }
396
+ );
397
+ }
398
+ var CircuitOpenError = class extends Error {
399
+ name = "CircuitOpenError";
400
+ constructor() {
401
+ super("Circuit breaker is open");
402
+ }
403
+ };
404
+ function circuitBreaker(options) {
405
+ const threshold = Math.max(1, options?.failureThreshold ?? 5);
406
+ const baseCooldownNs = clampNonNegative2(options?.cooldownNs ?? 30 * NS_PER_SEC);
407
+ const cooldownStrategy = options?.cooldown ?? null;
408
+ const halfOpenMax = Math.max(1, options?.halfOpenMax ?? 1);
409
+ const now = options?.now ?? monotonicNs;
410
+ let _state = "closed";
411
+ let _failureCount = 0;
412
+ let _openCycle = 0;
413
+ let _lastOpenedAt = 0;
414
+ let _lastCooldownNs = baseCooldownNs;
415
+ let _halfOpenAttempts = 0;
416
+ function getCooldownNs() {
417
+ if (!cooldownStrategy) return baseCooldownNs;
418
+ const delayNs = cooldownStrategy(_openCycle);
419
+ return delayNs !== null ? delayNs : baseCooldownNs;
420
+ }
421
+ function transitionToOpen() {
422
+ _state = "open";
423
+ _lastCooldownNs = getCooldownNs();
424
+ _lastOpenedAt = now();
425
+ _halfOpenAttempts = 0;
426
+ }
427
+ const breaker = {
428
+ canExecute() {
429
+ if (_state === "closed") return true;
430
+ if (_state === "open") {
431
+ const elapsed = now() - _lastOpenedAt;
432
+ if (elapsed >= _lastCooldownNs) {
433
+ _state = "half-open";
434
+ _halfOpenAttempts = 1;
435
+ return true;
436
+ }
437
+ return false;
438
+ }
439
+ if (_halfOpenAttempts < halfOpenMax) {
440
+ _halfOpenAttempts++;
441
+ return true;
442
+ }
443
+ return false;
444
+ },
445
+ recordSuccess() {
446
+ if (_state === "half-open") {
447
+ _state = "closed";
448
+ _failureCount = 0;
449
+ _openCycle = 0;
450
+ } else if (_state === "closed") {
451
+ _failureCount = 0;
452
+ }
453
+ },
454
+ recordFailure(_error) {
455
+ if (_state === "half-open") {
456
+ _openCycle++;
457
+ transitionToOpen();
458
+ return;
459
+ }
460
+ if (_state === "closed") {
461
+ _failureCount++;
462
+ if (_failureCount >= threshold) {
463
+ transitionToOpen();
464
+ }
465
+ }
466
+ },
467
+ get state() {
468
+ return _state;
469
+ },
470
+ get failureCount() {
471
+ return _failureCount;
472
+ },
473
+ reset() {
474
+ _state = "closed";
475
+ _failureCount = 0;
476
+ _openCycle = 0;
477
+ _halfOpenAttempts = 0;
478
+ }
479
+ };
480
+ return breaker;
481
+ }
482
+ function withBreaker(breaker, options) {
483
+ const onOpen = options?.onOpen ?? "skip";
484
+ return (source) => {
485
+ const wrapped = node(
486
+ [],
487
+ (_deps, a) => {
488
+ function syncState() {
489
+ wrapped.meta.breakerState.down([[DATA, breaker.state]]);
490
+ }
491
+ const unsub = source.subscribe((msgs) => {
492
+ for (const m of msgs) {
493
+ const t = m[0];
494
+ if (t === DIRTY) a.down([[DIRTY]]);
495
+ else if (t === DATA) {
496
+ if (breaker.canExecute()) {
497
+ syncState();
498
+ a.emit(m[1]);
499
+ } else {
500
+ syncState();
501
+ if (onOpen === "error") a.down([[ERROR, new CircuitOpenError()]]);
502
+ else a.down([[RESOLVED]]);
503
+ }
504
+ } else if (t === RESOLVED) a.down([[RESOLVED]]);
505
+ else if (t === COMPLETE) {
506
+ breaker.recordSuccess();
507
+ syncState();
508
+ a.down([[COMPLETE]]);
509
+ } else if (t === ERROR) {
510
+ breaker.recordFailure(msgVal(m));
511
+ syncState();
512
+ a.down([m]);
513
+ } else a.down([m]);
514
+ }
515
+ });
516
+ syncState();
517
+ return unsub;
518
+ },
519
+ {
520
+ ...operatorOpts(),
521
+ meta: { breakerState: breaker.state },
522
+ completeWhenDepsComplete: false,
523
+ initial: source.get()
524
+ }
525
+ );
526
+ return { node: wrapped, breakerState: wrapped.meta.breakerState };
527
+ };
528
+ }
529
+ function tokenBucket(capacity, refillPerSecond) {
530
+ if (capacity <= 0) throw new RangeError("capacity must be > 0");
531
+ if (refillPerSecond < 0) throw new RangeError("refillPerSecond must be >= 0");
532
+ let tokens = capacity;
533
+ let updatedAt = monotonicNs();
534
+ function refill(now) {
535
+ if (refillPerSecond > 0) {
536
+ const elapsedNs = now - updatedAt;
537
+ tokens = Math.min(capacity, tokens + elapsedNs / NS_PER_SEC * refillPerSecond);
538
+ }
539
+ updatedAt = now;
540
+ }
541
+ return {
542
+ available() {
543
+ refill(monotonicNs());
544
+ return tokens;
545
+ },
546
+ tryConsume(cost = 1) {
547
+ if (cost <= 0) return true;
548
+ const now = monotonicNs();
549
+ refill(now);
550
+ if (tokens >= cost) {
551
+ tokens -= cost;
552
+ return true;
553
+ }
554
+ return false;
555
+ }
556
+ };
557
+ }
558
+ function tokenTracker(capacity, refillPerSecond) {
559
+ return tokenBucket(capacity, refillPerSecond);
560
+ }
561
+ function rateLimiter(source, maxEvents, windowNs) {
562
+ if (maxEvents <= 0) throw new RangeError("maxEvents must be > 0");
563
+ if (windowNs <= 0) throw new RangeError("windowNs must be > 0");
564
+ return producer(
565
+ (_d, a) => {
566
+ const times = [];
567
+ const pending = [];
568
+ let timer;
569
+ let timerGen = 0;
570
+ function cancelTimer() {
571
+ if (timer !== void 0) {
572
+ clearTimeout(timer);
573
+ timer = void 0;
574
+ }
575
+ }
576
+ function prune(now) {
577
+ const boundary = now - windowNs;
578
+ while (times.length > 0 && times[0] <= boundary) times.shift();
579
+ }
580
+ function tryEmit() {
581
+ while (pending.length > 0) {
582
+ const now = monotonicNs();
583
+ prune(now);
584
+ if (times.length < maxEvents) {
585
+ times.push(now);
586
+ a.emit(pending.shift());
587
+ } else {
588
+ const oldest = times[0];
589
+ cancelTimer();
590
+ timerGen += 1;
591
+ const gen = timerGen;
592
+ const delayNs = Math.max(0, oldest + windowNs - monotonicNs());
593
+ timer = setTimeout(() => {
594
+ timer = void 0;
595
+ if (gen !== timerGen) return;
596
+ tryEmit();
597
+ }, delayNs / NS_PER_MS);
598
+ return;
599
+ }
600
+ }
601
+ }
602
+ const unsub = source.subscribe((msgs) => {
603
+ for (const m of msgs) {
604
+ const t = m[0];
605
+ if (t === DIRTY) a.down([[DIRTY]]);
606
+ else if (t === DATA) {
607
+ pending.push(m[1]);
608
+ tryEmit();
609
+ } else if (t === RESOLVED) a.down([[RESOLVED]]);
610
+ else if (t === COMPLETE) {
611
+ timerGen += 1;
612
+ cancelTimer();
613
+ pending.length = 0;
614
+ times.length = 0;
615
+ a.down([[COMPLETE]]);
616
+ } else if (t === ERROR) {
617
+ timerGen += 1;
618
+ cancelTimer();
619
+ pending.length = 0;
620
+ times.length = 0;
621
+ a.down([m]);
622
+ } else a.down([m]);
623
+ }
624
+ });
625
+ return () => {
626
+ timerGen += 1;
627
+ cancelTimer();
628
+ unsub();
629
+ };
630
+ },
631
+ {
632
+ ...operatorOpts(),
633
+ initial: source.get()
634
+ }
635
+ );
636
+ }
637
+ function withStatus(src, options) {
638
+ const initialStatus = options?.initialStatus ?? "pending";
639
+ const out = node(
640
+ [],
641
+ (_deps, a) => {
642
+ out.meta.status.down([[DATA, initialStatus]]);
643
+ out.meta.error.down([[DATA, null]]);
644
+ const unsub = src.subscribe((msgs) => {
645
+ for (const m of msgs) {
646
+ const t = m[0];
647
+ if (t === DIRTY) a.down([[DIRTY]]);
648
+ else if (t === DATA) {
649
+ if (out.meta.status.get() === "errored") {
650
+ batch(() => {
651
+ out.meta.error.down([[DATA, null]]);
652
+ out.meta.status.down([[DATA, "active"]]);
653
+ });
654
+ } else {
655
+ out.meta.status.down([[DATA, "active"]]);
656
+ }
657
+ a.emit(m[1]);
658
+ } else if (t === RESOLVED) a.down([[RESOLVED]]);
659
+ else if (t === COMPLETE) {
660
+ out.meta.status.down([[DATA, "completed"]]);
661
+ a.down([[COMPLETE]]);
662
+ } else if (t === ERROR) {
663
+ const err = msgVal(m);
664
+ batch(() => {
665
+ out.meta.error.down([[DATA, err]]);
666
+ out.meta.status.down([[DATA, "errored"]]);
667
+ });
668
+ a.down([m]);
669
+ } else a.down([m]);
670
+ }
671
+ });
672
+ return unsub;
673
+ },
674
+ {
675
+ ...operatorOpts(),
676
+ meta: { status: initialStatus, error: null },
677
+ completeWhenDepsComplete: false,
678
+ resubscribable: true,
679
+ initial: src.get()
680
+ }
681
+ );
682
+ return {
683
+ node: out,
684
+ status: out.meta.status,
685
+ error: out.meta.error
686
+ };
687
+ }
688
+
689
+ // src/extra/adapters.ts
690
+ function sourceOpts(opts) {
691
+ return { describeKind: "producer", ...opts };
692
+ }
693
+ function fromWebSocket(socketOrRegister, opts) {
694
+ const { parse, closeOnTeardown = false, ...rest } = opts ?? {};
695
+ return producer((_d, a) => {
696
+ let active = true;
697
+ let cleanup;
698
+ const runCleanup = () => {
699
+ const fn = cleanup;
700
+ cleanup = void 0;
701
+ fn?.();
702
+ };
703
+ const terminate = (message) => {
704
+ if (!active) return;
705
+ active = false;
706
+ a.down([message]);
707
+ runCleanup();
708
+ };
709
+ const emit = (raw, event = raw) => {
710
+ if (!active) return;
711
+ try {
712
+ const payload = raw !== null && typeof raw === "object" && "data" in raw ? raw.data : raw;
713
+ const parsed = parse ? parse(payload, event) : payload;
714
+ a.emit(parsed);
715
+ } catch (err) {
716
+ terminate([ERROR, err]);
717
+ }
718
+ };
719
+ const error = (err) => {
720
+ terminate([ERROR, err]);
721
+ };
722
+ const complete = () => {
723
+ terminate([COMPLETE]);
724
+ };
725
+ if (typeof socketOrRegister === "function") {
726
+ try {
727
+ cleanup = socketOrRegister(emit, error, complete);
728
+ if (typeof cleanup !== "function") {
729
+ throw new Error(
730
+ "fromWebSocket register contract violation: register must return cleanup callable"
731
+ );
732
+ }
733
+ } catch (err) {
734
+ terminate([ERROR, err]);
735
+ }
736
+ return () => {
737
+ active = false;
738
+ runCleanup();
739
+ };
740
+ }
741
+ const ws = socketOrRegister;
742
+ const onMessage = (event) => emit(event, event);
743
+ const onError = (event) => error(event);
744
+ const onClose = () => complete();
745
+ ws.addEventListener("message", onMessage);
746
+ ws.addEventListener("error", onError);
747
+ ws.addEventListener("close", onClose);
748
+ cleanup = () => {
749
+ ws.removeEventListener("message", onMessage);
750
+ ws.removeEventListener("error", onError);
751
+ ws.removeEventListener("close", onClose);
752
+ if (closeOnTeardown) ws.close();
753
+ };
754
+ return () => {
755
+ active = false;
756
+ runCleanup();
757
+ };
758
+ }, sourceOpts(rest));
759
+ }
760
+ function fromWebhook(register, opts) {
761
+ return producer((_d, a) => {
762
+ let active = true;
763
+ const emit = (payload) => {
764
+ if (!active) return;
765
+ a.emit(payload);
766
+ };
767
+ const error = (err) => {
768
+ if (!active) return;
769
+ active = false;
770
+ a.down([[ERROR, err]]);
771
+ };
772
+ const complete = () => {
773
+ if (!active) return;
774
+ active = false;
775
+ a.down([[COMPLETE]]);
776
+ };
777
+ try {
778
+ const cleanup = register({ emit, error, complete });
779
+ return () => {
780
+ active = false;
781
+ cleanup?.();
782
+ };
783
+ } catch (err) {
784
+ error(err);
785
+ return () => {
786
+ active = false;
787
+ };
788
+ }
789
+ }, sourceOpts(opts));
790
+ }
791
+ function fromHTTP(url, opts) {
792
+ const {
793
+ method = "GET",
794
+ headers,
795
+ body: bodyOpt,
796
+ transform = (r) => r.json(),
797
+ timeoutNs = 30 * NS_PER_SEC,
798
+ signal: externalSignal,
799
+ ...rest
800
+ } = opts ?? {};
801
+ const fetchCount = state(0, { name: `${rest.name ?? "http"}/fetchCount` });
802
+ const lastUpdated = state(0, { name: `${rest.name ?? "http"}/lastUpdated` });
803
+ const sourceNode = producer((_d, a) => {
804
+ let active = true;
805
+ const abort = new AbortController();
806
+ if (externalSignal?.aborted) {
807
+ a.down([[ERROR, externalSignal.reason ?? new Error("Aborted")]]);
808
+ return () => {
809
+ };
810
+ }
811
+ externalSignal?.addEventListener("abort", () => abort.abort(externalSignal.reason), {
812
+ once: true
813
+ });
814
+ const timeoutId = setTimeout(
815
+ () => abort.abort(new Error("Request timeout")),
816
+ Math.ceil(timeoutNs / NS_PER_MS)
817
+ );
818
+ const body = bodyOpt !== void 0 ? typeof bodyOpt === "string" ? bodyOpt : JSON.stringify(bodyOpt) : void 0;
819
+ fetch(url, { method, headers, body, signal: abort.signal }).then(async (res) => {
820
+ clearTimeout(timeoutId);
821
+ if (!active) return;
822
+ if (!res.ok) {
823
+ throw new Error(`HTTP ${res.status}: ${res.statusText}`);
824
+ }
825
+ const data = await transform(res);
826
+ if (!active) return;
827
+ batch(() => {
828
+ fetchCount.down([[DATA, (fetchCount.get() ?? 0) + 1]]);
829
+ lastUpdated.down([[DATA, wallClockNs()]]);
830
+ a.emit(data);
831
+ });
832
+ a.down([[COMPLETE]]);
833
+ }).catch((err) => {
834
+ clearTimeout(timeoutId);
835
+ if (!active) return;
836
+ if (err.name === "AbortError") return;
837
+ a.down([[ERROR, err]]);
838
+ });
839
+ return () => {
840
+ active = false;
841
+ abort.abort();
842
+ };
843
+ }, sourceOpts(rest));
844
+ const tracked = withStatus(sourceNode);
845
+ return {
846
+ ...tracked,
847
+ fetchCount,
848
+ lastUpdated
849
+ };
850
+ }
851
+ function messageTypeLabel(t) {
852
+ return Symbol.keyFor(t) ?? t.description ?? "message";
853
+ }
854
+ function serializeSseData(value, serialize) {
855
+ if (typeof value === "string") return value;
856
+ return serialize(value);
857
+ }
858
+ function sseFrame(event, data) {
859
+ let out = `event: ${event}
860
+ `;
861
+ if (data !== void 0) {
862
+ const lines = data.split(/\r?\n/);
863
+ for (const line of lines) {
864
+ out += `data: ${line}
865
+ `;
866
+ }
867
+ }
868
+ return `${out}
869
+ `;
870
+ }
871
+ function toSSE(source, opts) {
872
+ const {
873
+ serialize = (value) => {
874
+ if (value instanceof Error) return value.message;
875
+ try {
876
+ return JSON.stringify(value);
877
+ } catch {
878
+ return String(value);
879
+ }
880
+ },
881
+ dataEvent = "data",
882
+ errorEvent = "error",
883
+ completeEvent = "complete",
884
+ includeResolved = false,
885
+ includeDirty = false,
886
+ keepAliveMs,
887
+ signal,
888
+ eventNameResolver = messageTypeLabel
889
+ } = opts ?? {};
890
+ const encoder = new TextEncoder();
891
+ let stop;
892
+ return new ReadableStream({
893
+ start(controller) {
894
+ let closed = false;
895
+ let keepAlive;
896
+ let unsub = () => {
897
+ };
898
+ const close = () => {
899
+ if (closed) return;
900
+ closed = true;
901
+ if (keepAlive !== void 0) clearInterval(keepAlive);
902
+ signal?.removeEventListener("abort", onAbort);
903
+ unsub();
904
+ controller.close();
905
+ };
906
+ stop = close;
907
+ const write = (event, data) => {
908
+ if (closed) return;
909
+ controller.enqueue(encoder.encode(sseFrame(event, data)));
910
+ };
911
+ const onAbort = () => {
912
+ if (closed) return;
913
+ close();
914
+ };
915
+ unsub = source.subscribe((msgs) => {
916
+ for (const msg of msgs) {
917
+ const t = msg[0];
918
+ if (t === DATA) {
919
+ write(dataEvent, serializeSseData(msg[1], serialize));
920
+ continue;
921
+ }
922
+ if (t === ERROR) {
923
+ write(errorEvent, serializeSseData(msg[1], serialize));
924
+ close();
925
+ return;
926
+ }
927
+ if (t === COMPLETE) {
928
+ write(completeEvent);
929
+ close();
930
+ return;
931
+ }
932
+ if (!includeResolved && t === RESOLVED) continue;
933
+ if (!includeDirty && t === DIRTY) continue;
934
+ write(
935
+ eventNameResolver(t),
936
+ msg.length > 1 ? serializeSseData(msg[1], serialize) : void 0
937
+ );
938
+ }
939
+ });
940
+ if (keepAliveMs !== void 0 && keepAliveMs > 0) {
941
+ keepAlive = setInterval(() => {
942
+ if (closed) return;
943
+ controller.enqueue(encoder.encode(": keepalive\n\n"));
944
+ }, keepAliveMs);
945
+ }
946
+ if (signal?.aborted) onAbort();
947
+ else signal?.addEventListener("abort", onAbort, { once: true });
948
+ },
949
+ cancel() {
950
+ stop?.();
951
+ }
952
+ });
953
+ }
954
+ function toWebSocket(source, socket, opts) {
955
+ const {
956
+ serialize = (value) => {
957
+ if (typeof value === "string" || value instanceof Blob || value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {
958
+ return value;
959
+ }
960
+ try {
961
+ return JSON.stringify(value);
962
+ } catch {
963
+ return String(value);
964
+ }
965
+ },
966
+ closeOnComplete = true,
967
+ closeOnError = true,
968
+ closeCode,
969
+ closeReason,
970
+ onTransportError
971
+ } = opts ?? {};
972
+ let closed = false;
973
+ const toError = (err) => err instanceof Error ? err : new Error(String(err));
974
+ const reportTransportError = (stage, error, message) => {
975
+ if (!onTransportError) return;
976
+ try {
977
+ onTransportError({ stage, error: toError(error), message });
978
+ } catch {
979
+ }
980
+ };
981
+ const closeSocket = (message) => {
982
+ if (closed) return;
983
+ closed = true;
984
+ try {
985
+ socket.close(closeCode, closeReason);
986
+ } catch (err) {
987
+ reportTransportError("close", err, message);
988
+ }
989
+ };
990
+ const inner = node([source], () => void 0, {
991
+ describeKind: "effect",
992
+ onMessage(msg) {
993
+ if (msg[0] === DATA) {
994
+ let serialized;
995
+ try {
996
+ serialized = serialize(msg[1]);
997
+ } catch (err) {
998
+ reportTransportError("serialize", err, msg);
999
+ return true;
1000
+ }
1001
+ try {
1002
+ socket.send(serialized === void 0 ? String(msg[1]) : serialized);
1003
+ } catch (err) {
1004
+ reportTransportError("send", err, msg);
1005
+ return true;
1006
+ }
1007
+ return true;
1008
+ }
1009
+ if (msg[0] === COMPLETE && closeOnComplete) {
1010
+ closeSocket(msg);
1011
+ return true;
1012
+ }
1013
+ if (msg[0] === ERROR && closeOnError) {
1014
+ closeSocket(msg);
1015
+ return true;
1016
+ }
1017
+ return false;
1018
+ }
1019
+ });
1020
+ return inner.subscribe(() => {
1021
+ });
1022
+ }
1023
+ function fromMCP(client, opts) {
1024
+ const { method = "notifications/message", onDisconnect, ...rest } = opts ?? {};
1025
+ return producer((_d, a) => {
1026
+ let active = true;
1027
+ client.setNotificationHandler(method, (notification) => {
1028
+ if (!active) return;
1029
+ a.emit(notification);
1030
+ });
1031
+ if (onDisconnect) {
1032
+ onDisconnect((err) => {
1033
+ if (!active) return;
1034
+ active = false;
1035
+ a.down([[ERROR, err ?? new Error("MCP client disconnected")]]);
1036
+ });
1037
+ }
1038
+ return () => {
1039
+ active = false;
1040
+ client.setNotificationHandler(method, () => {
1041
+ });
1042
+ };
1043
+ }, sourceOpts(rest));
1044
+ }
1045
+ function fromGitHook(repoPath, opts) {
1046
+ const { pollMs = 5e3, include, exclude, ...rest } = opts ?? {};
1047
+ const includePatterns = include?.map(globToRegExp) ?? [];
1048
+ const excludePatterns = exclude?.map(globToRegExp) ?? [];
1049
+ return producer((_d, a) => {
1050
+ let active = true;
1051
+ let lastSeen;
1052
+ let timer;
1053
+ const { execFileSync } = __require("child_process");
1054
+ const git = (...args) => {
1055
+ try {
1056
+ return execFileSync("git", args, { cwd: repoPath, encoding: "utf-8" }).trim();
1057
+ } catch (err) {
1058
+ if (!active) return "";
1059
+ a.down([[ERROR, err]]);
1060
+ cleanup();
1061
+ return "";
1062
+ }
1063
+ };
1064
+ const cleanup = () => {
1065
+ active = false;
1066
+ if (timer !== void 0) clearTimeout(timer);
1067
+ timer = void 0;
1068
+ };
1069
+ lastSeen = git("rev-parse", "HEAD");
1070
+ if (!active) return () => {
1071
+ };
1072
+ const schedule = () => {
1073
+ if (!active) return;
1074
+ timer = setTimeout(check, pollMs);
1075
+ };
1076
+ const check = () => {
1077
+ if (!active) return;
1078
+ const head = git("rev-parse", "HEAD");
1079
+ if (!active || !head || head === lastSeen) {
1080
+ schedule();
1081
+ return;
1082
+ }
1083
+ let files = git("diff", "--name-only", `${lastSeen}..${head}`).split("\n").filter(Boolean);
1084
+ if (!active) {
1085
+ schedule();
1086
+ return;
1087
+ }
1088
+ if (includePatterns.length > 0) {
1089
+ files = files.filter((f) => matchesAnyPattern(f, includePatterns));
1090
+ }
1091
+ if (excludePatterns.length > 0) {
1092
+ files = files.filter((f) => !matchesAnyPattern(f, excludePatterns));
1093
+ }
1094
+ const message = git("log", "-1", "--format=%s", head);
1095
+ if (!active) {
1096
+ schedule();
1097
+ return;
1098
+ }
1099
+ const author = git("log", "-1", "--format=%an", head);
1100
+ if (!active) {
1101
+ schedule();
1102
+ return;
1103
+ }
1104
+ a.emit({
1105
+ hook: "post-commit",
1106
+ commit: head,
1107
+ files,
1108
+ message,
1109
+ author,
1110
+ timestamp_ns: wallClockNs()
1111
+ });
1112
+ lastSeen = head;
1113
+ schedule();
1114
+ };
1115
+ schedule();
1116
+ return cleanup;
1117
+ }, sourceOpts(rest));
1118
+ }
1119
+ function fromOTel(register, opts) {
1120
+ let registerCleanup;
1121
+ let active = true;
1122
+ let teardownCount = 0;
1123
+ const teardownOne = () => {
1124
+ teardownCount++;
1125
+ if (teardownCount >= 3 && registerCleanup) {
1126
+ registerCleanup();
1127
+ registerCleanup = void 0;
1128
+ }
1129
+ };
1130
+ const traces = producer(
1131
+ (_d, _a) => () => {
1132
+ active = false;
1133
+ teardownOne();
1134
+ },
1135
+ sourceOpts(opts)
1136
+ );
1137
+ const metrics = producer(
1138
+ (_d, _a) => () => {
1139
+ active = false;
1140
+ teardownOne();
1141
+ },
1142
+ sourceOpts(opts)
1143
+ );
1144
+ const logs = producer(
1145
+ (_d, _a) => () => {
1146
+ active = false;
1147
+ teardownOne();
1148
+ },
1149
+ sourceOpts(opts)
1150
+ );
1151
+ registerCleanup = register({
1152
+ onTraces: (spans) => {
1153
+ if (!active) return;
1154
+ batch(() => {
1155
+ for (const span of spans) traces.down([[DATA, span]]);
1156
+ });
1157
+ },
1158
+ onMetrics: (ms) => {
1159
+ if (!active) return;
1160
+ batch(() => {
1161
+ for (const m of ms) metrics.down([[DATA, m]]);
1162
+ });
1163
+ },
1164
+ onLogs: (ls) => {
1165
+ if (!active) return;
1166
+ batch(() => {
1167
+ for (const l of ls) logs.down([[DATA, l]]);
1168
+ });
1169
+ },
1170
+ onError: (err) => {
1171
+ if (!active) return;
1172
+ active = false;
1173
+ traces.down([[ERROR, err]]);
1174
+ metrics.down([[ERROR, err]]);
1175
+ logs.down([[ERROR, err]]);
1176
+ }
1177
+ }) ?? void 0;
1178
+ return { traces, metrics, logs };
1179
+ }
1180
+ function fromSyslog(register, opts) {
1181
+ return fromWebhook(register, opts);
1182
+ }
1183
+ function parseSyslog(raw) {
1184
+ const match = raw.match(/^<(\d{1,3})>\d?\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s*(.*)/s);
1185
+ if (!match) {
1186
+ const nowNs = wallClockNs();
1187
+ return {
1188
+ facility: 1,
1189
+ severity: 6,
1190
+ timestamp: new Date(Math.floor(nowNs / 1e6)).toISOString(),
1191
+ hostname: "-",
1192
+ appName: "-",
1193
+ procId: "-",
1194
+ msgId: "-",
1195
+ message: raw.trim(),
1196
+ timestampNs: nowNs
1197
+ };
1198
+ }
1199
+ const pri = Number(match[1]);
1200
+ return {
1201
+ facility: pri >> 3,
1202
+ severity: pri & 7,
1203
+ timestamp: match[2],
1204
+ hostname: match[3],
1205
+ appName: match[4],
1206
+ procId: match[5],
1207
+ msgId: match[6],
1208
+ message: (match[7] ?? "").trim(),
1209
+ timestampNs: wallClockNs()
1210
+ };
1211
+ }
1212
+ function fromStatsD(register, opts) {
1213
+ return fromWebhook(register, opts);
1214
+ }
1215
+ var STATSD_TYPES = {
1216
+ c: "counter",
1217
+ g: "gauge",
1218
+ ms: "timer",
1219
+ h: "histogram",
1220
+ s: "set",
1221
+ d: "distribution"
1222
+ };
1223
+ function parseStatsD(line) {
1224
+ const parts = line.split("|");
1225
+ const [name, valueStr] = (parts[0] ?? "").split(":");
1226
+ if (!name || valueStr === void 0) {
1227
+ throw new Error(`Invalid StatsD line: ${line}`);
1228
+ }
1229
+ const typeCode = parts[1]?.trim() ?? "c";
1230
+ const type = STATSD_TYPES[typeCode] ?? "counter";
1231
+ const value = type === "set" ? 0 : Number(valueStr);
1232
+ let sampleRate;
1233
+ const tags = {};
1234
+ for (let i = 2; i < parts.length; i++) {
1235
+ const part = parts[i].trim();
1236
+ if (part.startsWith("@")) {
1237
+ sampleRate = Number(part.slice(1));
1238
+ } else if (part.startsWith("#")) {
1239
+ for (const tag of part.slice(1).split(",")) {
1240
+ const [k, v] = tag.split(":");
1241
+ if (k) tags[k] = v ?? "";
1242
+ }
1243
+ }
1244
+ }
1245
+ return { name: name.trim(), value, type, sampleRate, tags, timestampNs: wallClockNs() };
1246
+ }
1247
+ function fromPrometheus(endpoint, opts) {
1248
+ const {
1249
+ intervalNs = 15 * NS_PER_SEC,
1250
+ headers,
1251
+ timeoutNs = 10 * NS_PER_SEC,
1252
+ signal: externalSignal,
1253
+ ...rest
1254
+ } = opts ?? {};
1255
+ const intervalMs = Math.ceil(intervalNs / NS_PER_MS);
1256
+ return producer((_d, a) => {
1257
+ let active = true;
1258
+ let running = false;
1259
+ let timer;
1260
+ const cleanup = () => {
1261
+ active = false;
1262
+ if (timer !== void 0) {
1263
+ clearInterval(timer);
1264
+ timer = void 0;
1265
+ }
1266
+ };
1267
+ const scrape = async () => {
1268
+ if (!active || running) return;
1269
+ running = true;
1270
+ const abort = new AbortController();
1271
+ const timeoutId = setTimeout(
1272
+ () => abort.abort(new Error("Scrape timeout")),
1273
+ Math.ceil(timeoutNs / NS_PER_MS)
1274
+ );
1275
+ try {
1276
+ const res = await fetch(endpoint, {
1277
+ headers: { Accept: "text/plain", ...headers },
1278
+ signal: abort.signal
1279
+ });
1280
+ clearTimeout(timeoutId);
1281
+ if (!active) return;
1282
+ if (!res.ok) throw new Error(`Prometheus scrape ${res.status}: ${res.statusText}`);
1283
+ const text = await res.text();
1284
+ if (!active) return;
1285
+ const metrics = parsePrometheusText(text);
1286
+ for (const m of metrics) a.emit(m);
1287
+ } catch (err) {
1288
+ clearTimeout(timeoutId);
1289
+ if (!active) return;
1290
+ if (err instanceof Error && err.name === "AbortError") return;
1291
+ cleanup();
1292
+ a.down([[ERROR, err]]);
1293
+ } finally {
1294
+ running = false;
1295
+ }
1296
+ };
1297
+ const onAbort = () => {
1298
+ if (!active) return;
1299
+ cleanup();
1300
+ a.down([[ERROR, externalSignal?.reason ?? new Error("Aborted")]]);
1301
+ };
1302
+ if (externalSignal?.aborted) {
1303
+ onAbort();
1304
+ return () => {
1305
+ };
1306
+ }
1307
+ externalSignal?.addEventListener("abort", onAbort, { once: true });
1308
+ void scrape();
1309
+ timer = setInterval(() => void scrape(), intervalMs);
1310
+ return () => {
1311
+ cleanup();
1312
+ externalSignal?.removeEventListener("abort", onAbort);
1313
+ };
1314
+ }, sourceOpts(rest));
1315
+ }
1316
+ function parsePrometheusText(text) {
1317
+ const results = [];
1318
+ const types = /* @__PURE__ */ new Map();
1319
+ const helps = /* @__PURE__ */ new Map();
1320
+ for (const rawLine of text.split("\n")) {
1321
+ const line = rawLine.trim();
1322
+ if (!line) continue;
1323
+ if (line.startsWith("# TYPE ")) {
1324
+ const rest = line.slice(7);
1325
+ const spaceIdx = rest.indexOf(" ");
1326
+ if (spaceIdx > 0) {
1327
+ types.set(rest.slice(0, spaceIdx), rest.slice(spaceIdx + 1).trim());
1328
+ }
1329
+ continue;
1330
+ }
1331
+ if (line.startsWith("# HELP ")) {
1332
+ const rest = line.slice(7);
1333
+ const spaceIdx = rest.indexOf(" ");
1334
+ if (spaceIdx > 0) {
1335
+ helps.set(rest.slice(0, spaceIdx), rest.slice(spaceIdx + 1).trim());
1336
+ }
1337
+ continue;
1338
+ }
1339
+ if (line.startsWith("#")) continue;
1340
+ let name;
1341
+ let labels = {};
1342
+ let valueStr;
1343
+ let tsStr;
1344
+ const braceIdx = line.indexOf("{");
1345
+ if (braceIdx >= 0) {
1346
+ name = line.slice(0, braceIdx);
1347
+ const closeBrace = line.indexOf("}", braceIdx);
1348
+ if (closeBrace < 0) continue;
1349
+ const labelStr = line.slice(braceIdx + 1, closeBrace);
1350
+ labels = parsePrometheusLabels(labelStr);
1351
+ const after = line.slice(closeBrace + 1).trim().split(/\s+/);
1352
+ valueStr = after[0] ?? "";
1353
+ tsStr = after[1];
1354
+ } else {
1355
+ const parts = line.split(/\s+/);
1356
+ name = parts[0] ?? "";
1357
+ valueStr = parts[1] ?? "";
1358
+ tsStr = parts[2];
1359
+ }
1360
+ if (!name || !valueStr) continue;
1361
+ const baseName = name.replace(/(_total|_count|_sum|_bucket|_created|_info)$/, "");
1362
+ results.push({
1363
+ name,
1364
+ labels,
1365
+ value: Number(valueStr),
1366
+ timestampMs: tsStr ? Number(tsStr) : void 0,
1367
+ type: types.get(baseName) ?? types.get(name),
1368
+ help: helps.get(baseName) ?? helps.get(name),
1369
+ timestampNs: wallClockNs()
1370
+ });
1371
+ }
1372
+ return results;
1373
+ }
1374
+ function parsePrometheusLabels(str) {
1375
+ const labels = {};
1376
+ const re = /(\w+)="((?:[^"\\]|\\.)*)"/g;
1377
+ let m = re.exec(str);
1378
+ while (m !== null) {
1379
+ labels[m[1]] = m[2].replace(/\\(.)/g, "$1");
1380
+ m = re.exec(str);
1381
+ }
1382
+ return labels;
1383
+ }
1384
+ function fromKafka(consumer, topic, opts) {
1385
+ const {
1386
+ fromBeginning = false,
1387
+ deserialize = (buf) => {
1388
+ if (buf === null) return null;
1389
+ try {
1390
+ return JSON.parse(buf.toString());
1391
+ } catch {
1392
+ return buf.toString();
1393
+ }
1394
+ },
1395
+ ...rest
1396
+ } = opts ?? {};
1397
+ return producer((_d, a) => {
1398
+ let active = true;
1399
+ const start = async () => {
1400
+ try {
1401
+ await consumer.subscribe({ topic, fromBeginning });
1402
+ await consumer.run({
1403
+ eachMessage: async ({ topic: t, partition, message: msg }) => {
1404
+ if (!active) return;
1405
+ const headers = {};
1406
+ if (msg.headers) {
1407
+ for (const [k, v] of Object.entries(msg.headers)) {
1408
+ if (v !== void 0) headers[k] = typeof v === "string" ? v : v.toString();
1409
+ }
1410
+ }
1411
+ a.emit({
1412
+ topic: t,
1413
+ partition,
1414
+ key: msg.key?.toString() ?? null,
1415
+ value: deserialize(msg.value),
1416
+ headers,
1417
+ offset: msg.offset,
1418
+ timestamp: msg.timestamp,
1419
+ timestampNs: wallClockNs()
1420
+ });
1421
+ }
1422
+ });
1423
+ } catch (err) {
1424
+ if (active) a.down([[ERROR, err]]);
1425
+ }
1426
+ };
1427
+ void start();
1428
+ return () => {
1429
+ active = false;
1430
+ };
1431
+ }, sourceOpts(rest));
1432
+ }
1433
+ function toKafka(source, kafkaProducer, topic, opts) {
1434
+ const {
1435
+ serialize = (v) => JSON.stringify(v),
1436
+ keyExtractor,
1437
+ onTransportError,
1438
+ ...rest
1439
+ } = opts ?? {};
1440
+ const inner = node([source], () => void 0, {
1441
+ describeKind: "effect",
1442
+ ...rest,
1443
+ onMessage(msg) {
1444
+ if (msg[0] === DATA) {
1445
+ const value = msg[1];
1446
+ const key = keyExtractor?.(value) ?? null;
1447
+ let serialized;
1448
+ try {
1449
+ serialized = serialize(value);
1450
+ } catch (err) {
1451
+ onTransportError?.({
1452
+ stage: "serialize",
1453
+ error: err instanceof Error ? err : new Error(String(err)),
1454
+ value
1455
+ });
1456
+ return true;
1457
+ }
1458
+ void kafkaProducer.send({
1459
+ topic,
1460
+ messages: [{ key, value: Buffer.from(serialized) }]
1461
+ }).catch((err) => {
1462
+ onTransportError?.({
1463
+ stage: "send",
1464
+ error: err instanceof Error ? err : new Error(String(err)),
1465
+ value
1466
+ });
1467
+ });
1468
+ return true;
1469
+ }
1470
+ return false;
1471
+ }
1472
+ });
1473
+ return inner.subscribe(() => {
1474
+ });
1475
+ }
1476
+ function fromRedisStream(client, key, opts) {
1477
+ const {
1478
+ blockMs = 5e3,
1479
+ startId = "$",
1480
+ parse = (fields) => {
1481
+ for (let i = 0; i < fields.length; i += 2) {
1482
+ if (fields[i] === "data") {
1483
+ try {
1484
+ return JSON.parse(fields[i + 1]);
1485
+ } catch {
1486
+ return fields[i + 1];
1487
+ }
1488
+ }
1489
+ }
1490
+ const obj = {};
1491
+ for (let i = 0; i < fields.length; i += 2) {
1492
+ obj[fields[i]] = fields[i + 1];
1493
+ }
1494
+ return obj;
1495
+ },
1496
+ ...rest
1497
+ } = opts ?? {};
1498
+ return producer((_d, a) => {
1499
+ let active = true;
1500
+ let lastId = startId;
1501
+ const poll = async () => {
1502
+ while (active) {
1503
+ try {
1504
+ const result = await client.xread("BLOCK", blockMs, "STREAMS", key, lastId);
1505
+ if (!active) return;
1506
+ if (result) {
1507
+ for (const [_streamKey, entries] of result) {
1508
+ for (const [id, fields] of entries) {
1509
+ lastId = id;
1510
+ a.emit({
1511
+ id,
1512
+ key,
1513
+ data: parse(fields),
1514
+ timestampNs: wallClockNs()
1515
+ });
1516
+ }
1517
+ }
1518
+ }
1519
+ } catch (err) {
1520
+ if (!active) return;
1521
+ a.down([[ERROR, err]]);
1522
+ return;
1523
+ }
1524
+ }
1525
+ };
1526
+ void poll();
1527
+ return () => {
1528
+ active = false;
1529
+ };
1530
+ }, sourceOpts(rest));
1531
+ }
1532
+ function toRedisStream(source, client, key, opts) {
1533
+ const {
1534
+ serialize = (v) => ["data", JSON.stringify(v)],
1535
+ maxLen,
1536
+ onTransportError,
1537
+ ...rest
1538
+ } = opts ?? {};
1539
+ const inner = node([source], () => void 0, {
1540
+ describeKind: "effect",
1541
+ ...rest,
1542
+ onMessage(msg) {
1543
+ if (msg[0] === DATA) {
1544
+ const value = msg[1];
1545
+ let fields;
1546
+ try {
1547
+ fields = serialize(value);
1548
+ } catch (err) {
1549
+ onTransportError?.({
1550
+ stage: "serialize",
1551
+ error: err instanceof Error ? err : new Error(String(err)),
1552
+ value
1553
+ });
1554
+ return true;
1555
+ }
1556
+ const send = maxLen !== void 0 ? client.xadd(key, "MAXLEN", "~", String(maxLen), "*", ...fields) : client.xadd(key, "*", ...fields);
1557
+ void send.catch((err) => {
1558
+ onTransportError?.({
1559
+ stage: "send",
1560
+ error: err instanceof Error ? err : new Error(String(err)),
1561
+ value
1562
+ });
1563
+ });
1564
+ return true;
1565
+ }
1566
+ return false;
1567
+ }
1568
+ });
1569
+ return inner.subscribe(() => {
1570
+ });
1571
+ }
1572
+ function fromCSV(source, opts) {
1573
+ const {
1574
+ delimiter = ",",
1575
+ hasHeader = true,
1576
+ columns: explicitColumns,
1577
+ parseLine,
1578
+ ...rest
1579
+ } = opts ?? {};
1580
+ const parse = parseLine ?? ((line) => parseCSVLine(line, delimiter));
1581
+ return producer((_d, a) => {
1582
+ let cancelled = false;
1583
+ const run = async () => {
1584
+ try {
1585
+ let headers = explicitColumns;
1586
+ let buffer2 = "";
1587
+ for await (const chunk of source) {
1588
+ if (cancelled) return;
1589
+ buffer2 += chunk;
1590
+ const lines = buffer2.split(/\r?\n/);
1591
+ buffer2 = lines.pop() ?? "";
1592
+ for (const line of lines) {
1593
+ if (cancelled) return;
1594
+ if (!line.trim()) continue;
1595
+ const values = parse(line);
1596
+ if (!headers && hasHeader) {
1597
+ headers = values;
1598
+ continue;
1599
+ }
1600
+ if (!headers) {
1601
+ headers = values.map((_, i) => `col${i}`);
1602
+ }
1603
+ const row = {};
1604
+ for (let i = 0; i < headers.length; i++) {
1605
+ row[headers[i]] = values[i] ?? "";
1606
+ }
1607
+ a.emit(row);
1608
+ }
1609
+ }
1610
+ if (!cancelled && buffer2.trim()) {
1611
+ const values = parse(buffer2);
1612
+ if (headers) {
1613
+ const row = {};
1614
+ for (let i = 0; i < headers.length; i++) {
1615
+ row[headers[i]] = values[i] ?? "";
1616
+ }
1617
+ a.emit(row);
1618
+ }
1619
+ }
1620
+ if (!cancelled) a.down([[COMPLETE]]);
1621
+ } catch (err) {
1622
+ if (!cancelled) a.down([[ERROR, err]]);
1623
+ }
1624
+ };
1625
+ void run();
1626
+ return () => {
1627
+ cancelled = true;
1628
+ };
1629
+ }, sourceOpts(rest));
1630
+ }
1631
+ function parseCSVLine(line, delimiter) {
1632
+ const values = [];
1633
+ let current = "";
1634
+ let inQuotes = false;
1635
+ for (let i = 0; i < line.length; i++) {
1636
+ const ch = line[i];
1637
+ if (inQuotes) {
1638
+ if (ch === '"') {
1639
+ if (line[i + 1] === '"') {
1640
+ current += '"';
1641
+ i++;
1642
+ } else {
1643
+ inQuotes = false;
1644
+ }
1645
+ } else {
1646
+ current += ch;
1647
+ }
1648
+ } else if (ch === '"') {
1649
+ inQuotes = true;
1650
+ } else if (ch === delimiter) {
1651
+ values.push(current);
1652
+ current = "";
1653
+ } else {
1654
+ current += ch;
1655
+ }
1656
+ }
1657
+ values.push(current);
1658
+ return values;
1659
+ }
1660
+ function fromNDJSON(source, opts) {
1661
+ return producer((_d, a) => {
1662
+ let cancelled = false;
1663
+ const run = async () => {
1664
+ try {
1665
+ let buffer2 = "";
1666
+ for await (const chunk of source) {
1667
+ if (cancelled) return;
1668
+ buffer2 += chunk;
1669
+ const lines = buffer2.split(/\r?\n/);
1670
+ buffer2 = lines.pop() ?? "";
1671
+ for (const line of lines) {
1672
+ if (cancelled) return;
1673
+ const trimmed = line.trim();
1674
+ if (!trimmed) continue;
1675
+ a.emit(JSON.parse(trimmed));
1676
+ }
1677
+ }
1678
+ if (!cancelled && buffer2.trim()) {
1679
+ a.emit(JSON.parse(buffer2.trim()));
1680
+ }
1681
+ if (!cancelled) a.down([[COMPLETE]]);
1682
+ } catch (err) {
1683
+ if (!cancelled) a.down([[ERROR, err]]);
1684
+ }
1685
+ };
1686
+ void run();
1687
+ return () => {
1688
+ cancelled = true;
1689
+ };
1690
+ }, sourceOpts(opts));
1691
+ }
1692
+ function fromClickHouseWatch(client, query, opts) {
1693
+ const {
1694
+ intervalNs = 5 * NS_PER_SEC,
1695
+ format = "JSONEachRow",
1696
+ signal: externalSignal,
1697
+ ...rest
1698
+ } = opts ?? {};
1699
+ const intervalMs = Math.ceil(intervalNs / NS_PER_MS);
1700
+ return producer((_d, a) => {
1701
+ let active = true;
1702
+ let running = false;
1703
+ let timer;
1704
+ const cleanup = () => {
1705
+ active = false;
1706
+ if (timer !== void 0) {
1707
+ clearInterval(timer);
1708
+ timer = void 0;
1709
+ }
1710
+ };
1711
+ const execute = async () => {
1712
+ if (!active || running) return;
1713
+ running = true;
1714
+ try {
1715
+ const result = await client.query({ query, format });
1716
+ if (!active) return;
1717
+ const rows = await result.json();
1718
+ if (!active) return;
1719
+ for (const row of rows) a.emit(row);
1720
+ } catch (err) {
1721
+ if (!active) return;
1722
+ cleanup();
1723
+ a.down([[ERROR, err]]);
1724
+ } finally {
1725
+ running = false;
1726
+ }
1727
+ };
1728
+ const onAbort = () => {
1729
+ if (!active) return;
1730
+ cleanup();
1731
+ a.down([[ERROR, externalSignal?.reason ?? new Error("Aborted")]]);
1732
+ };
1733
+ if (externalSignal?.aborted) {
1734
+ onAbort();
1735
+ return () => {
1736
+ };
1737
+ }
1738
+ externalSignal?.addEventListener("abort", onAbort, { once: true });
1739
+ void execute();
1740
+ timer = setInterval(() => void execute(), intervalMs);
1741
+ return () => {
1742
+ cleanup();
1743
+ externalSignal?.removeEventListener("abort", onAbort);
1744
+ };
1745
+ }, sourceOpts(rest));
1746
+ }
1747
+
1748
+ // src/extra/checkpoint.ts
1749
+ import { randomBytes } from "crypto";
1750
+ import { mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "fs";
1751
+ import { basename, dirname, join } from "path";
1752
+ import { DatabaseSync } from "sqlite";
1753
+ function sortJsonValue(value) {
1754
+ if (value === null || typeof value !== "object") {
1755
+ return value;
1756
+ }
1757
+ if (Array.isArray(value)) {
1758
+ return value.map(sortJsonValue);
1759
+ }
1760
+ const obj = value;
1761
+ const keys = Object.keys(obj).sort();
1762
+ const out = {};
1763
+ for (const k of keys) {
1764
+ out[k] = sortJsonValue(obj[k]);
1765
+ }
1766
+ return out;
1767
+ }
1768
+ function warnNonJsonValues(data) {
1769
+ for (const [path, node2] of Object.entries(data.nodes)) {
1770
+ const v = node2.value;
1771
+ if (v === void 0 || v === null) continue;
1772
+ if (typeof v === "function" || typeof v === "symbol" || typeof v === "bigint") {
1773
+ console.warn(
1774
+ `checkpoint: node "${path}" has non-JSON-serializable value (${typeof v}); it will be lost on round-trip`
1775
+ );
1776
+ }
1777
+ }
1778
+ }
1779
+ function stableSnapshotJson(data) {
1780
+ warnNonJsonValues(data);
1781
+ return `${JSON.stringify(sortJsonValue(data), void 0, 0)}
1782
+ `;
1783
+ }
1784
+ var MemoryCheckpointAdapter = class {
1785
+ #data = null;
1786
+ save(data) {
1787
+ this.#data = JSON.parse(JSON.stringify(data));
1788
+ }
1789
+ load() {
1790
+ return this.#data === null ? null : JSON.parse(JSON.stringify(this.#data));
1791
+ }
1792
+ };
1793
+ var DictCheckpointAdapter = class {
1794
+ #storage;
1795
+ #key;
1796
+ constructor(storage, key = "graphrefly_checkpoint") {
1797
+ this.#storage = storage;
1798
+ this.#key = key;
1799
+ }
1800
+ save(data) {
1801
+ this.#storage[this.#key] = JSON.parse(JSON.stringify(data));
1802
+ }
1803
+ load() {
1804
+ const raw = this.#storage[this.#key];
1805
+ return raw !== null && typeof raw === "object" && !Array.isArray(raw) ? JSON.parse(JSON.stringify(raw)) : null;
1806
+ }
1807
+ };
1808
+ var FileCheckpointAdapter = class {
1809
+ #path;
1810
+ constructor(path) {
1811
+ this.#path = path;
1812
+ }
1813
+ save(data) {
1814
+ const dir = dirname(this.#path);
1815
+ mkdirSync(dir, { recursive: true });
1816
+ const payload = stableSnapshotJson(data);
1817
+ const base = basename(this.#path);
1818
+ const tmp = join(dir, `.${base}.${randomBytes(8).toString("hex")}.tmp`);
1819
+ try {
1820
+ writeFileSync(tmp, payload, "utf8");
1821
+ renameSync(tmp, this.#path);
1822
+ } catch (e) {
1823
+ try {
1824
+ unlinkSync(tmp);
1825
+ } catch {
1826
+ }
1827
+ throw e;
1828
+ }
1829
+ }
1830
+ load() {
1831
+ try {
1832
+ const text = readFileSync(this.#path, "utf8").trim();
1833
+ if (!text) return null;
1834
+ const data = JSON.parse(text);
1835
+ return data !== null && typeof data === "object" && !Array.isArray(data) ? data : null;
1836
+ } catch {
1837
+ return null;
1838
+ }
1839
+ }
1840
+ };
1841
+ var SqliteCheckpointAdapter = class {
1842
+ #db;
1843
+ #key;
1844
+ constructor(path, key = "graphrefly_checkpoint") {
1845
+ this.#db = new DatabaseSync(path);
1846
+ this.#key = key;
1847
+ this.#db.exec(
1848
+ `CREATE TABLE IF NOT EXISTS graphrefly_checkpoint (k TEXT PRIMARY KEY, v TEXT NOT NULL)`
1849
+ );
1850
+ }
1851
+ save(data) {
1852
+ const payload = stableSnapshotJson(data).trimEnd();
1853
+ this.#db.prepare(`INSERT OR REPLACE INTO graphrefly_checkpoint (k, v) VALUES (?, ?)`).run(this.#key, payload);
1854
+ }
1855
+ load() {
1856
+ const row = this.#db.prepare(`SELECT v FROM graphrefly_checkpoint WHERE k = ?`).get(this.#key);
1857
+ if (row === void 0 || typeof row.v !== "string" || row.v.trim() === "") return null;
1858
+ const parsed = JSON.parse(row.v);
1859
+ return parsed !== null && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
1860
+ }
1861
+ /** Close the underlying SQLite connection (safe to call more than once). */
1862
+ close() {
1863
+ try {
1864
+ this.#db.close();
1865
+ } catch {
1866
+ }
1867
+ }
1868
+ };
1869
+ function saveGraphCheckpoint(graph, adapter) {
1870
+ adapter.save(graph.snapshot());
1871
+ }
1872
+ function restoreGraphCheckpoint(graph, adapter) {
1873
+ const data = adapter.load();
1874
+ if (data === null) return false;
1875
+ graph.restore(data);
1876
+ return true;
1877
+ }
1878
+ function checkpointNodeValue(n) {
1879
+ return { version: 1, value: n.get() };
1880
+ }
1881
+ function fromIDBRequest(req) {
1882
+ return producer((_d, a) => {
1883
+ let done = false;
1884
+ const clear = () => {
1885
+ req.onsuccess = null;
1886
+ req.onerror = null;
1887
+ };
1888
+ req.onsuccess = () => {
1889
+ if (done) return;
1890
+ done = true;
1891
+ clear();
1892
+ a.down([[DATA, req.result], [COMPLETE]]);
1893
+ };
1894
+ req.onerror = () => {
1895
+ if (done) return;
1896
+ done = true;
1897
+ clear();
1898
+ a.down([[ERROR, req.error ?? new Error("IndexedDB request failed")]]);
1899
+ };
1900
+ return () => {
1901
+ done = true;
1902
+ clear();
1903
+ };
1904
+ });
1905
+ }
1906
+ function fromIDBTransaction(tx) {
1907
+ return producer((_d, a) => {
1908
+ let done = false;
1909
+ const clear = () => {
1910
+ tx.oncomplete = null;
1911
+ tx.onerror = null;
1912
+ tx.onabort = null;
1913
+ };
1914
+ tx.oncomplete = () => {
1915
+ if (done) return;
1916
+ done = true;
1917
+ clear();
1918
+ a.down([[DATA, void 0], [COMPLETE]]);
1919
+ };
1920
+ tx.onerror = () => {
1921
+ if (done) return;
1922
+ done = true;
1923
+ clear();
1924
+ a.down([[ERROR, tx.error ?? new Error("IndexedDB transaction failed")]]);
1925
+ };
1926
+ tx.onabort = () => {
1927
+ if (done) return;
1928
+ done = true;
1929
+ clear();
1930
+ a.down([[ERROR, tx.error ?? new Error("IndexedDB transaction aborted")]]);
1931
+ };
1932
+ return () => {
1933
+ done = true;
1934
+ clear();
1935
+ };
1936
+ });
1937
+ }
1938
+ function openIdbNode(dbName, storeName, version) {
1939
+ return producer((_d, a) => {
1940
+ if (typeof indexedDB === "undefined") {
1941
+ a.down([[ERROR, new TypeError("indexedDB is not available in this environment")]]);
1942
+ return void 0;
1943
+ }
1944
+ const req = indexedDB.open(dbName, version);
1945
+ req.onupgradeneeded = () => {
1946
+ const db = req.result;
1947
+ if (!db.objectStoreNames.contains(storeName)) {
1948
+ db.createObjectStore(storeName);
1949
+ }
1950
+ };
1951
+ const unsub = fromIDBRequest(req).subscribe((msgs) => a.down(msgs));
1952
+ return () => {
1953
+ unsub();
1954
+ };
1955
+ });
1956
+ }
1957
+ function saveGraphCheckpointIndexedDb(graph, spec) {
1958
+ const key = spec.key ?? "graphrefly_checkpoint";
1959
+ return producer((_d, a) => {
1960
+ let db;
1961
+ let opUnsub;
1962
+ let done = false;
1963
+ const close = () => {
1964
+ if (db === void 0) return;
1965
+ db.close();
1966
+ db = void 0;
1967
+ };
1968
+ const finishWith = (msgs) => {
1969
+ if (done) return;
1970
+ done = true;
1971
+ a.down(msgs);
1972
+ opUnsub?.();
1973
+ opUnsub = void 0;
1974
+ openUnsub();
1975
+ close();
1976
+ };
1977
+ const startWrite = () => {
1978
+ if (db === void 0 || opUnsub !== void 0) return;
1979
+ const tx = db.transaction(spec.storeName, "readwrite");
1980
+ const store = tx.objectStore(spec.storeName);
1981
+ let reqDone = false;
1982
+ let txDone = false;
1983
+ let reqError;
1984
+ let unsubReq;
1985
+ let unsubTx;
1986
+ const maybeFinish = () => {
1987
+ if (reqError !== void 0) {
1988
+ finishWith([[ERROR, reqError]]);
1989
+ return;
1990
+ }
1991
+ if (!reqDone || !txDone) return;
1992
+ finishWith([[DATA, void 0], [COMPLETE]]);
1993
+ };
1994
+ unsubReq = fromIDBRequest(store.put(graph.snapshot(), key)).subscribe((msgs) => {
1995
+ for (const m of msgs) {
1996
+ if (m[0] === ERROR) reqError = m[1];
1997
+ if (m[0] === COMPLETE || m[0] === ERROR) reqDone = true;
1998
+ }
1999
+ maybeFinish();
2000
+ });
2001
+ unsubTx = fromIDBTransaction(tx).subscribe((msgs) => {
2002
+ for (const m of msgs) {
2003
+ if (m[0] === ERROR) {
2004
+ finishWith([[ERROR, m[1]]]);
2005
+ return;
2006
+ }
2007
+ if (m[0] === COMPLETE) txDone = true;
2008
+ }
2009
+ maybeFinish();
2010
+ });
2011
+ opUnsub = () => {
2012
+ unsubReq?.();
2013
+ unsubReq = void 0;
2014
+ unsubTx?.();
2015
+ unsubTx = void 0;
2016
+ };
2017
+ };
2018
+ const openUnsub = openIdbNode(spec.dbName, spec.storeName, spec.version ?? 1).subscribe(
2019
+ (msgs) => {
2020
+ for (const m of msgs) {
2021
+ if (m[0] === DATA) {
2022
+ db = m[1];
2023
+ startWrite();
2024
+ continue;
2025
+ }
2026
+ if (m[0] === ERROR) {
2027
+ finishWith([[ERROR, m[1]]]);
2028
+ return;
2029
+ }
2030
+ }
2031
+ }
2032
+ );
2033
+ return () => {
2034
+ opUnsub?.();
2035
+ opUnsub = void 0;
2036
+ openUnsub();
2037
+ close();
2038
+ };
2039
+ });
2040
+ }
2041
+ function restoreGraphCheckpointIndexedDb(graph, spec) {
2042
+ const key = spec.key ?? "graphrefly_checkpoint";
2043
+ return producer((_d, a) => {
2044
+ let db;
2045
+ let reqUnsub;
2046
+ let txUnsub;
2047
+ let done = false;
2048
+ let txDone = false;
2049
+ let requestDone = false;
2050
+ let requestValue;
2051
+ let requestError;
2052
+ const close = () => {
2053
+ if (db === void 0) return;
2054
+ db.close();
2055
+ db = void 0;
2056
+ };
2057
+ const finishWith = (msgs) => {
2058
+ if (done) return;
2059
+ done = true;
2060
+ a.down(msgs);
2061
+ reqUnsub?.();
2062
+ reqUnsub = void 0;
2063
+ txUnsub?.();
2064
+ txUnsub = void 0;
2065
+ openUnsub();
2066
+ close();
2067
+ };
2068
+ const maybeEmitResult = () => {
2069
+ if (!requestDone || !txDone) return;
2070
+ if (requestError !== void 0) {
2071
+ finishWith([[ERROR, requestError]]);
2072
+ return;
2073
+ }
2074
+ if (requestValue === void 0 || requestValue === null) {
2075
+ finishWith([[DATA, false], [COMPLETE]]);
2076
+ return;
2077
+ }
2078
+ if (typeof requestValue !== "object" || Array.isArray(requestValue)) {
2079
+ finishWith([[DATA, false], [COMPLETE]]);
2080
+ return;
2081
+ }
2082
+ graph.restore(requestValue);
2083
+ finishWith([[DATA, true], [COMPLETE]]);
2084
+ };
2085
+ const startRead = () => {
2086
+ if (db === void 0 || reqUnsub !== void 0 || txUnsub !== void 0) return;
2087
+ const tx = db.transaction(spec.storeName, "readonly");
2088
+ const store = tx.objectStore(spec.storeName);
2089
+ reqUnsub = fromIDBRequest(store.get(key)).subscribe((msgs) => {
2090
+ for (const m of msgs) {
2091
+ if (m[0] === DATA) requestValue = m[1];
2092
+ if (m[0] === ERROR) requestError = m[1];
2093
+ if (m[0] === COMPLETE || m[0] === ERROR) requestDone = true;
2094
+ }
2095
+ maybeEmitResult();
2096
+ });
2097
+ txUnsub = fromIDBTransaction(tx).subscribe((msgs) => {
2098
+ for (const m of msgs) {
2099
+ if (m[0] === ERROR) {
2100
+ finishWith([[ERROR, m[1]]]);
2101
+ return;
2102
+ }
2103
+ if (m[0] === COMPLETE) txDone = true;
2104
+ }
2105
+ maybeEmitResult();
2106
+ });
2107
+ };
2108
+ const openUnsub = openIdbNode(spec.dbName, spec.storeName, spec.version ?? 1).subscribe(
2109
+ (msgs) => {
2110
+ for (const m of msgs) {
2111
+ if (m[0] === DATA) {
2112
+ db = m[1];
2113
+ startRead();
2114
+ continue;
2115
+ }
2116
+ if (m[0] === ERROR) {
2117
+ finishWith([[ERROR, m[1]]]);
2118
+ return;
2119
+ }
2120
+ }
2121
+ }
2122
+ );
2123
+ return () => {
2124
+ reqUnsub?.();
2125
+ reqUnsub = void 0;
2126
+ txUnsub?.();
2127
+ txUnsub = void 0;
2128
+ openUnsub();
2129
+ close();
2130
+ };
2131
+ });
2132
+ }
2133
+
2134
+ // src/extra/operators.ts
2135
+ function operatorOpts2(opts) {
2136
+ return { describeKind: "operator", ...opts };
2137
+ }
2138
+ function map(source, project, opts) {
2139
+ return derived([source], ([v]) => project(v), operatorOpts2(opts));
2140
+ }
2141
+ function filter(source, predicate, opts) {
2142
+ return node(
2143
+ [source],
2144
+ ([v], a) => {
2145
+ if (predicate(v)) return v;
2146
+ a.down([[RESOLVED]]);
2147
+ return void 0;
2148
+ },
2149
+ operatorOpts2(opts)
2150
+ );
2151
+ }
2152
+ function scan(source, reducer, seed, opts) {
2153
+ let acc = seed;
2154
+ return node(
2155
+ [source],
2156
+ ([v]) => {
2157
+ acc = reducer(acc, v);
2158
+ return acc;
2159
+ },
2160
+ { ...operatorOpts2(opts), initial: seed, resetOnTeardown: true }
2161
+ );
2162
+ }
2163
+ function reduce(source, reducer, seed, opts) {
2164
+ let acc = seed;
2165
+ let sawData = false;
2166
+ return node(
2167
+ [source],
2168
+ ([v]) => {
2169
+ sawData = true;
2170
+ acc = reducer(acc, v);
2171
+ return void 0;
2172
+ },
2173
+ {
2174
+ ...operatorOpts2(opts),
2175
+ completeWhenDepsComplete: false,
2176
+ onResubscribe: opts?.resubscribable === true ? () => {
2177
+ acc = seed;
2178
+ sawData = false;
2179
+ } : void 0,
2180
+ onMessage(msg, _i, a) {
2181
+ if (msg[0] === COMPLETE) {
2182
+ if (!sawData) acc = seed;
2183
+ a.emit(acc);
2184
+ a.down([[COMPLETE]]);
2185
+ return true;
2186
+ }
2187
+ return false;
2188
+ }
2189
+ }
2190
+ );
2191
+ }
2192
+ function take(source, count, opts) {
2193
+ if (count <= 0) {
2194
+ return node(
2195
+ [source],
2196
+ (_d, a) => {
2197
+ a.down([[COMPLETE]]);
2198
+ return void 0;
2199
+ },
2200
+ {
2201
+ ...operatorOpts2(opts),
2202
+ completeWhenDepsComplete: false,
2203
+ onMessage(msg, _i, a) {
2204
+ if (msg[0] === COMPLETE) {
2205
+ a.down([[COMPLETE]]);
2206
+ }
2207
+ return true;
2208
+ }
2209
+ }
2210
+ );
2211
+ }
2212
+ let taken = 0;
2213
+ let done = false;
2214
+ return node(
2215
+ [source],
2216
+ ([v]) => {
2217
+ if (done) return void 0;
2218
+ return v;
2219
+ },
2220
+ {
2221
+ ...operatorOpts2(opts),
2222
+ completeWhenDepsComplete: false,
2223
+ onResubscribe: opts?.resubscribable === true ? () => {
2224
+ taken = 0;
2225
+ done = false;
2226
+ } : void 0,
2227
+ onMessage(msg, _i, a) {
2228
+ if (msg[0] === DIRTY) return false;
2229
+ if (done) {
2230
+ return true;
2231
+ }
2232
+ if (msg[0] === DATA) {
2233
+ taken += 1;
2234
+ if (taken >= count) {
2235
+ done = true;
2236
+ a.emit(source.get());
2237
+ a.down([[COMPLETE]]);
2238
+ return true;
2239
+ }
2240
+ return false;
2241
+ }
2242
+ if (msg[0] === RESOLVED) {
2243
+ return false;
2244
+ }
2245
+ if (msg[0] === COMPLETE) {
2246
+ done = true;
2247
+ a.down([[COMPLETE]]);
2248
+ return true;
2249
+ }
2250
+ if (msg[0] === ERROR) {
2251
+ a.down([msg]);
2252
+ return true;
2253
+ }
2254
+ a.down([msg]);
2255
+ return true;
2256
+ }
2257
+ }
2258
+ );
2259
+ }
2260
+ function skip(source, count, opts) {
2261
+ let skipped = 0;
2262
+ return node([source], () => void 0, {
2263
+ ...operatorOpts2(opts),
2264
+ onMessage(msg, _i, a) {
2265
+ const t = msg[0];
2266
+ if (t === DIRTY) {
2267
+ a.down([[DIRTY]]);
2268
+ return true;
2269
+ }
2270
+ if (t === RESOLVED) {
2271
+ a.down([[RESOLVED]]);
2272
+ return true;
2273
+ }
2274
+ if (t === DATA) {
2275
+ skipped += 1;
2276
+ if (skipped <= count) {
2277
+ a.down([[RESOLVED]]);
2278
+ } else {
2279
+ a.emit(msg[1]);
2280
+ }
2281
+ return true;
2282
+ }
2283
+ return false;
2284
+ }
2285
+ });
2286
+ }
2287
+ function takeWhile(source, predicate, opts) {
2288
+ let done = false;
2289
+ return node(
2290
+ [source],
2291
+ ([v], a) => {
2292
+ if (done) return void 0;
2293
+ if (!predicate(v)) {
2294
+ done = true;
2295
+ a.down([[COMPLETE]]);
2296
+ return void 0;
2297
+ }
2298
+ return v;
2299
+ },
2300
+ {
2301
+ ...operatorOpts2(opts),
2302
+ completeWhenDepsComplete: false,
2303
+ onMessage(msg, _i, a) {
2304
+ if (done) {
2305
+ if (msg[0] === COMPLETE) {
2306
+ a.down([[COMPLETE]]);
2307
+ }
2308
+ return true;
2309
+ }
2310
+ return false;
2311
+ }
2312
+ }
2313
+ );
2314
+ }
2315
+ function takeUntil(source, notifier, opts) {
2316
+ const pred = opts?.predicate ?? ((m) => m[0] === DATA);
2317
+ const { predicate: _, ...restOpts } = opts ?? {};
2318
+ let stopped = false;
2319
+ return node(
2320
+ [source, notifier],
2321
+ ([v]) => {
2322
+ if (stopped) return void 0;
2323
+ return v;
2324
+ },
2325
+ {
2326
+ ...operatorOpts2(restOpts),
2327
+ completeWhenDepsComplete: false,
2328
+ onMessage(msg, i, a) {
2329
+ if (stopped) {
2330
+ if (msg[0] === COMPLETE) {
2331
+ a.down([[COMPLETE]]);
2332
+ }
2333
+ return true;
2334
+ }
2335
+ if (i === 1) {
2336
+ if (pred(msg)) {
2337
+ stopped = true;
2338
+ a.down([[COMPLETE]]);
2339
+ return true;
2340
+ }
2341
+ return true;
2342
+ }
2343
+ return false;
2344
+ }
2345
+ }
2346
+ );
2347
+ }
2348
+ function first(source, opts) {
2349
+ return take(source, 1, opts);
2350
+ }
2351
+ function last(source, options) {
2352
+ const { defaultValue, ...rest } = options ?? {};
2353
+ const useDefault = options != null && Object.hasOwn(options, "defaultValue");
2354
+ let lastVal;
2355
+ let has = false;
2356
+ return node(
2357
+ [source],
2358
+ ([v]) => {
2359
+ lastVal = v;
2360
+ has = true;
2361
+ return void 0;
2362
+ },
2363
+ {
2364
+ ...operatorOpts2(rest),
2365
+ completeWhenDepsComplete: false,
2366
+ onMessage(msg, _i, a) {
2367
+ if (msg[0] === COMPLETE) {
2368
+ if (has) {
2369
+ a.emit(lastVal);
2370
+ } else if (useDefault) {
2371
+ a.emit(defaultValue);
2372
+ }
2373
+ a.down([[COMPLETE]]);
2374
+ return true;
2375
+ }
2376
+ return false;
2377
+ }
2378
+ }
2379
+ );
2380
+ }
2381
+ function find(source, predicate, opts) {
2382
+ return take(filter(source, predicate, opts), 1, opts);
2383
+ }
2384
+ function elementAt(source, index, opts) {
2385
+ return take(skip(source, index, opts), 1, opts);
2386
+ }
2387
+ function startWith(source, initial, opts) {
2388
+ let prepended = false;
2389
+ return node(
2390
+ [source],
2391
+ ([v], a) => {
2392
+ if (!prepended) {
2393
+ prepended = true;
2394
+ a.emit(initial);
2395
+ }
2396
+ a.emit(v);
2397
+ return void 0;
2398
+ },
2399
+ operatorOpts2(opts)
2400
+ );
2401
+ }
2402
+ function tap(source, fnOrObserver, opts) {
2403
+ if (typeof fnOrObserver === "function") {
2404
+ return derived(
2405
+ [source],
2406
+ ([v]) => {
2407
+ fnOrObserver(v);
2408
+ return v;
2409
+ },
2410
+ operatorOpts2(opts)
2411
+ );
2412
+ }
2413
+ const obs = fnOrObserver;
2414
+ return node(
2415
+ [source],
2416
+ ([v]) => {
2417
+ obs.data?.(v);
2418
+ return v;
2419
+ },
2420
+ {
2421
+ ...operatorOpts2(opts),
2422
+ completeWhenDepsComplete: false,
2423
+ onMessage(msg, _i, a) {
2424
+ const t = msg[0];
2425
+ if (t === ERROR) {
2426
+ obs.error?.(msg[1]);
2427
+ a.down([msg]);
2428
+ return true;
2429
+ }
2430
+ if (t === COMPLETE) {
2431
+ obs.complete?.();
2432
+ a.down([msg]);
2433
+ return true;
2434
+ }
2435
+ return false;
2436
+ }
2437
+ }
2438
+ );
2439
+ }
2440
+ function distinctUntilChanged(source, equals = Object.is, opts) {
2441
+ return node([source], ([v]) => v, {
2442
+ ...operatorOpts2(opts),
2443
+ equals
2444
+ });
2445
+ }
2446
+ function pairwise(source, opts) {
2447
+ let prev;
2448
+ let hasPrev = false;
2449
+ return node(
2450
+ [source],
2451
+ ([v], a) => {
2452
+ const x = v;
2453
+ if (!hasPrev) {
2454
+ prev = x;
2455
+ hasPrev = true;
2456
+ a.down([[RESOLVED]]);
2457
+ return void 0;
2458
+ }
2459
+ const pair = [prev, x];
2460
+ prev = x;
2461
+ return pair;
2462
+ },
2463
+ operatorOpts2(opts)
2464
+ );
2465
+ }
2466
+ function combine(...sources) {
2467
+ const deps = [...sources];
2468
+ return node(deps, (vals) => vals, operatorOpts2());
2469
+ }
2470
+ function withLatestFrom(primary, secondary, opts) {
2471
+ let latestB;
2472
+ let hasB = false;
2473
+ return node([primary, secondary], () => void 0, {
2474
+ ...operatorOpts2(opts),
2475
+ onMessage(msg, i, a) {
2476
+ if (i === 1 && (msg[0] === DATA || msg[0] === RESOLVED)) {
2477
+ latestB = secondary.get();
2478
+ hasB = true;
2479
+ return true;
2480
+ }
2481
+ if (i === 0 && (msg[0] === DATA || msg[0] === RESOLVED)) {
2482
+ if (!hasB) {
2483
+ latestB = secondary.get();
2484
+ hasB = true;
2485
+ }
2486
+ a.emit([primary.get(), latestB]);
2487
+ return true;
2488
+ }
2489
+ if (i === 0 && msg[0] === DIRTY) {
2490
+ a.down([[DIRTY]]);
2491
+ return true;
2492
+ }
2493
+ if (i === 1 && msg[0] === DIRTY) {
2494
+ return true;
2495
+ }
2496
+ if (msg[0] === COMPLETE || msg[0] === ERROR) {
2497
+ a.down([msg]);
2498
+ return true;
2499
+ }
2500
+ a.down([msg]);
2501
+ return true;
2502
+ }
2503
+ });
2504
+ }
2505
+ function merge(...sources) {
2506
+ if (sources.length === 0) {
2507
+ return producer((_d, a) => {
2508
+ a.down([[COMPLETE]]);
2509
+ return void 0;
2510
+ }, operatorOpts2());
2511
+ }
2512
+ const deps = sources;
2513
+ const n = deps.length;
2514
+ let completed = 0;
2515
+ let dirtyMask = 0n;
2516
+ let anyData = false;
2517
+ return node(deps, () => void 0, {
2518
+ ...operatorOpts2(),
2519
+ completeWhenDepsComplete: false,
2520
+ onMessage(msg, i, a) {
2521
+ const t = msg[0];
2522
+ const bit = 1n << BigInt(i);
2523
+ if (t === DIRTY) {
2524
+ const wasClean = dirtyMask === 0n;
2525
+ dirtyMask |= bit;
2526
+ if (wasClean) {
2527
+ anyData = false;
2528
+ a.down([[DIRTY]]);
2529
+ }
2530
+ return true;
2531
+ }
2532
+ if (t === RESOLVED) {
2533
+ if (dirtyMask & bit) {
2534
+ dirtyMask &= ~bit;
2535
+ if (dirtyMask === 0n && !anyData) {
2536
+ a.down([[RESOLVED]]);
2537
+ }
2538
+ }
2539
+ return true;
2540
+ }
2541
+ if (t === DATA) {
2542
+ dirtyMask &= ~bit;
2543
+ anyData = true;
2544
+ a.emit(msg[1]);
2545
+ return true;
2546
+ }
2547
+ if (t === COMPLETE) {
2548
+ dirtyMask &= ~bit;
2549
+ completed += 1;
2550
+ if (completed >= n) {
2551
+ a.down([[COMPLETE]]);
2552
+ }
2553
+ return true;
2554
+ }
2555
+ if (t === ERROR) {
2556
+ a.down([msg]);
2557
+ return true;
2558
+ }
2559
+ a.down([msg]);
2560
+ return true;
2561
+ }
2562
+ });
2563
+ }
2564
+ function zip(...sources) {
2565
+ const n = sources.length;
2566
+ if (n === 0) {
2567
+ return node([], () => [], operatorOpts2());
2568
+ }
2569
+ const deps = [...sources];
2570
+ const queues = Array.from({ length: n }, () => []);
2571
+ let dirtyMask = 0n;
2572
+ let anyData = false;
2573
+ let active = n;
2574
+ function tryEmit(a) {
2575
+ while (queues.every((q) => q.length > 0)) {
2576
+ const tuple = queues.map((q) => q.shift());
2577
+ a.emit(tuple);
2578
+ }
2579
+ }
2580
+ return node(deps, () => void 0, {
2581
+ ...operatorOpts2(),
2582
+ completeWhenDepsComplete: false,
2583
+ onMessage(msg, i, a) {
2584
+ const t = msg[0];
2585
+ const bit = 1n << BigInt(i);
2586
+ if (t === DIRTY) {
2587
+ const wasClean = dirtyMask === 0n;
2588
+ dirtyMask |= bit;
2589
+ if (wasClean) {
2590
+ anyData = false;
2591
+ a.down([[DIRTY]]);
2592
+ }
2593
+ return true;
2594
+ }
2595
+ if (t === RESOLVED) {
2596
+ if (dirtyMask & bit) {
2597
+ dirtyMask &= ~bit;
2598
+ if (dirtyMask === 0n) {
2599
+ if (anyData) {
2600
+ tryEmit(a);
2601
+ } else {
2602
+ a.down([[RESOLVED]]);
2603
+ }
2604
+ }
2605
+ }
2606
+ return true;
2607
+ }
2608
+ if (t === DATA) {
2609
+ dirtyMask &= ~bit;
2610
+ queues[i].push(msg[1]);
2611
+ anyData = true;
2612
+ if (dirtyMask === 0n) {
2613
+ tryEmit(a);
2614
+ }
2615
+ return true;
2616
+ }
2617
+ if (t === COMPLETE) {
2618
+ active -= 1;
2619
+ if (active === 0 || queues[i].length === 0) {
2620
+ a.down([[COMPLETE]]);
2621
+ }
2622
+ return true;
2623
+ }
2624
+ if (t === ERROR) {
2625
+ a.down([msg]);
2626
+ return true;
2627
+ }
2628
+ a.down([msg]);
2629
+ return true;
2630
+ }
2631
+ });
2632
+ }
2633
+ function concat(firstSrc, secondSrc, opts) {
2634
+ let phase = 0;
2635
+ const pending = [];
2636
+ return node([firstSrc, secondSrc], () => void 0, {
2637
+ ...operatorOpts2(opts),
2638
+ completeWhenDepsComplete: false,
2639
+ onMessage(msg, i, a) {
2640
+ const t = msg[0];
2641
+ if (phase === 0 && i === 1) {
2642
+ if (t === DATA) {
2643
+ pending.push(msg[1]);
2644
+ } else if (t === ERROR) {
2645
+ a.down([msg]);
2646
+ }
2647
+ return true;
2648
+ }
2649
+ if (phase === 0 && i === 0) {
2650
+ if (t === COMPLETE) {
2651
+ phase = 1;
2652
+ for (const v of pending) {
2653
+ a.emit(v);
2654
+ }
2655
+ pending.length = 0;
2656
+ return true;
2657
+ }
2658
+ a.down([msg]);
2659
+ return true;
2660
+ }
2661
+ if (phase === 1 && i === 0) {
2662
+ return true;
2663
+ }
2664
+ if (phase === 1 && i === 1) {
2665
+ a.down([msg]);
2666
+ return true;
2667
+ }
2668
+ return true;
2669
+ }
2670
+ });
2671
+ }
2672
+ function race(...sources) {
2673
+ if (sources.length === 0) {
2674
+ return producer((_d, a) => {
2675
+ a.down([[COMPLETE]]);
2676
+ return void 0;
2677
+ }, operatorOpts2());
2678
+ }
2679
+ if (sources.length === 1) {
2680
+ return node([sources[0]], ([v]) => v, operatorOpts2());
2681
+ }
2682
+ const deps = sources;
2683
+ let winner = null;
2684
+ return node(deps, () => void 0, {
2685
+ ...operatorOpts2(),
2686
+ completeWhenDepsComplete: false,
2687
+ onMessage(msg, i, a) {
2688
+ const t = msg[0];
2689
+ if (winner !== null && i !== winner) {
2690
+ return true;
2691
+ }
2692
+ if (t === DATA && winner === null) {
2693
+ winner = i;
2694
+ a.emit(msg[1]);
2695
+ return true;
2696
+ }
2697
+ if (winner !== null && i === winner) {
2698
+ if (t === DATA) {
2699
+ a.emit(msg[1]);
2700
+ return true;
2701
+ }
2702
+ a.down([msg]);
2703
+ return true;
2704
+ }
2705
+ if (winner === null) {
2706
+ if (t === DIRTY) {
2707
+ a.down([[DIRTY]]);
2708
+ return true;
2709
+ }
2710
+ if (t === RESOLVED) {
2711
+ a.down([[RESOLVED]]);
2712
+ return true;
2713
+ }
2714
+ if (t === COMPLETE || t === ERROR) {
2715
+ a.down([msg]);
2716
+ return true;
2717
+ }
2718
+ }
2719
+ return false;
2720
+ }
2721
+ });
2722
+ }
2723
+ function forwardInner(inner, a, onInnerComplete) {
2724
+ let unsub;
2725
+ let finished = false;
2726
+ let emitted = false;
2727
+ const finish = () => {
2728
+ if (finished) return;
2729
+ finished = true;
2730
+ onInnerComplete();
2731
+ };
2732
+ unsub = inner.subscribe((msgs) => {
2733
+ let sawComplete = false;
2734
+ let sawError = false;
2735
+ const out = [];
2736
+ for (const m of msgs) {
2737
+ if (m[0] === DATA) emitted = true;
2738
+ if (m[0] === COMPLETE) sawComplete = true;
2739
+ else {
2740
+ if (m[0] === ERROR) sawError = true;
2741
+ out.push(m);
2742
+ }
2743
+ }
2744
+ if (out.length > 0) a.down(out);
2745
+ if (sawError) {
2746
+ unsub?.();
2747
+ unsub = void 0;
2748
+ finish();
2749
+ } else if (sawComplete) {
2750
+ finish();
2751
+ }
2752
+ });
2753
+ if (!emitted && (inner.status === "settled" || inner.status === "resolved")) {
2754
+ a.emit(inner.get());
2755
+ }
2756
+ if (inner.status === "completed" || inner.status === "errored") {
2757
+ finish();
2758
+ }
2759
+ return () => {
2760
+ unsub?.();
2761
+ unsub = void 0;
2762
+ };
2763
+ }
2764
+ function switchMap(source, project, opts) {
2765
+ let innerUnsub;
2766
+ let sourceDone = false;
2767
+ let attached = false;
2768
+ function clearInner() {
2769
+ innerUnsub?.();
2770
+ innerUnsub = void 0;
2771
+ }
2772
+ function attach(v, a) {
2773
+ attached = true;
2774
+ clearInner();
2775
+ innerUnsub = forwardInner(fromAny(project(v)), a, () => {
2776
+ clearInner();
2777
+ if (sourceDone) a.down([[COMPLETE]]);
2778
+ });
2779
+ }
2780
+ return node(
2781
+ [source],
2782
+ ([v], a) => {
2783
+ if (!attached) attach(v, a);
2784
+ return clearInner;
2785
+ },
2786
+ {
2787
+ ...operatorOpts2(opts),
2788
+ completeWhenDepsComplete: false,
2789
+ onMessage(msg, _i, a) {
2790
+ const t = msg[0];
2791
+ if (t === ERROR) {
2792
+ clearInner();
2793
+ a.down([msg]);
2794
+ return true;
2795
+ }
2796
+ if (t === COMPLETE) {
2797
+ sourceDone = true;
2798
+ if (innerUnsub === void 0) a.down([[COMPLETE]]);
2799
+ return true;
2800
+ }
2801
+ if (t === DIRTY) {
2802
+ a.down([[DIRTY]]);
2803
+ return true;
2804
+ }
2805
+ if (t === RESOLVED) {
2806
+ a.down([[RESOLVED]]);
2807
+ return true;
2808
+ }
2809
+ if (t === DATA) {
2810
+ attach(msg[1], a);
2811
+ return true;
2812
+ }
2813
+ return false;
2814
+ }
2815
+ }
2816
+ );
2817
+ }
2818
+ function exhaustMap(source, project, opts) {
2819
+ let innerUnsub;
2820
+ let sourceDone = false;
2821
+ let attached = false;
2822
+ function clearInner() {
2823
+ innerUnsub?.();
2824
+ innerUnsub = void 0;
2825
+ }
2826
+ function attach(v, a) {
2827
+ attached = true;
2828
+ innerUnsub = forwardInner(fromAny(project(v)), a, () => {
2829
+ clearInner();
2830
+ if (sourceDone) a.down([[COMPLETE]]);
2831
+ });
2832
+ }
2833
+ return node(
2834
+ [source],
2835
+ ([v], a) => {
2836
+ if (!attached && innerUnsub === void 0) attach(v, a);
2837
+ return clearInner;
2838
+ },
2839
+ {
2840
+ ...operatorOpts2(opts),
2841
+ completeWhenDepsComplete: false,
2842
+ onMessage(msg, _i, a) {
2843
+ const t = msg[0];
2844
+ if (t === ERROR) {
2845
+ clearInner();
2846
+ a.down([msg]);
2847
+ return true;
2848
+ }
2849
+ if (t === COMPLETE) {
2850
+ sourceDone = true;
2851
+ if (innerUnsub === void 0) a.down([[COMPLETE]]);
2852
+ return true;
2853
+ }
2854
+ if (t === DIRTY) {
2855
+ a.down([[DIRTY]]);
2856
+ return true;
2857
+ }
2858
+ if (t === RESOLVED) {
2859
+ a.down([[RESOLVED]]);
2860
+ return true;
2861
+ }
2862
+ if (t === DATA) {
2863
+ if (innerUnsub !== void 0) {
2864
+ a.down([[RESOLVED]]);
2865
+ return true;
2866
+ }
2867
+ attach(msg[1], a);
2868
+ return true;
2869
+ }
2870
+ return false;
2871
+ }
2872
+ }
2873
+ );
2874
+ }
2875
+ function concatMap(source, project, opts) {
2876
+ const { maxBuffer: maxBuf, ...concatNodeOpts } = opts ?? {};
2877
+ const queue = [];
2878
+ let innerUnsub;
2879
+ let sourceDone = false;
2880
+ let attached = false;
2881
+ function clearInner() {
2882
+ innerUnsub?.();
2883
+ innerUnsub = void 0;
2884
+ }
2885
+ function tryPump(a) {
2886
+ if (innerUnsub !== void 0) return;
2887
+ if (queue.length === 0) {
2888
+ if (sourceDone) a.down([[COMPLETE]]);
2889
+ return;
2890
+ }
2891
+ const v = queue.shift();
2892
+ innerUnsub = forwardInner(fromAny(project(v)), a, () => {
2893
+ clearInner();
2894
+ tryPump(a);
2895
+ });
2896
+ }
2897
+ function enqueue(v, a) {
2898
+ attached = true;
2899
+ if (maxBuf && maxBuf > 0 && queue.length >= maxBuf) queue.shift();
2900
+ queue.push(v);
2901
+ tryPump(a);
2902
+ }
2903
+ return node(
2904
+ [source],
2905
+ ([v], a) => {
2906
+ if (!attached) enqueue(v, a);
2907
+ return clearInner;
2908
+ },
2909
+ {
2910
+ ...operatorOpts2(concatNodeOpts),
2911
+ completeWhenDepsComplete: false,
2912
+ onMessage(msg, _i, a) {
2913
+ const t = msg[0];
2914
+ if (t === ERROR) {
2915
+ clearInner();
2916
+ queue.length = 0;
2917
+ a.down([msg]);
2918
+ return true;
2919
+ }
2920
+ if (t === COMPLETE) {
2921
+ sourceDone = true;
2922
+ tryPump(a);
2923
+ return true;
2924
+ }
2925
+ if (t === DIRTY) {
2926
+ a.down([[DIRTY]]);
2927
+ return true;
2928
+ }
2929
+ if (t === RESOLVED) {
2930
+ a.down([[RESOLVED]]);
2931
+ return true;
2932
+ }
2933
+ if (t === DATA) {
2934
+ enqueue(msg[1], a);
2935
+ return true;
2936
+ }
2937
+ return false;
2938
+ }
2939
+ }
2940
+ );
2941
+ }
2942
+ function mergeMap(source, project, opts) {
2943
+ const { concurrent: concurrentOpt, ...mergeNodeOpts } = opts ?? {};
2944
+ const maxConcurrent = concurrentOpt != null && concurrentOpt > 0 ? concurrentOpt : Number.POSITIVE_INFINITY;
2945
+ let active = 0;
2946
+ let sourceDone = false;
2947
+ const innerStops = /* @__PURE__ */ new Set();
2948
+ const buffer2 = [];
2949
+ function tryComplete(a) {
2950
+ if (sourceDone && active === 0 && buffer2.length === 0) a.down([[COMPLETE]]);
2951
+ }
2952
+ function spawn(v, a) {
2953
+ active++;
2954
+ const inner = fromAny(project(v));
2955
+ let stop;
2956
+ const runStop = () => {
2957
+ stop?.();
2958
+ if (stop !== void 0) innerStops.delete(stop);
2959
+ stop = void 0;
2960
+ };
2961
+ stop = inner.subscribe((msgs) => {
2962
+ let sawComplete = false;
2963
+ const out = [];
2964
+ for (const m of msgs) {
2965
+ if (m[0] === COMPLETE) sawComplete = true;
2966
+ else out.push(m);
2967
+ }
2968
+ if (out.length > 0) a.down(out);
2969
+ if (sawComplete) {
2970
+ runStop();
2971
+ active--;
2972
+ drainBuffer(a);
2973
+ tryComplete(a);
2974
+ }
2975
+ });
2976
+ innerStops.add(stop);
2977
+ }
2978
+ function drainBuffer(a) {
2979
+ while (buffer2.length > 0 && active < maxConcurrent) {
2980
+ spawn(buffer2.shift(), a);
2981
+ }
2982
+ }
2983
+ function enqueue(v, a) {
2984
+ if (active < maxConcurrent) {
2985
+ spawn(v, a);
2986
+ } else {
2987
+ buffer2.push(v);
2988
+ }
2989
+ }
2990
+ function clearAll() {
2991
+ for (const u of innerStops) u();
2992
+ innerStops.clear();
2993
+ active = 0;
2994
+ buffer2.length = 0;
2995
+ }
2996
+ let attached = false;
2997
+ return node(
2998
+ [source],
2999
+ ([v], a) => {
3000
+ if (!attached) {
3001
+ attached = true;
3002
+ enqueue(v, a);
3003
+ }
3004
+ return clearAll;
3005
+ },
3006
+ {
3007
+ ...operatorOpts2(mergeNodeOpts),
3008
+ completeWhenDepsComplete: false,
3009
+ onMessage(msg, _i, a) {
3010
+ const t = msg[0];
3011
+ if (t === ERROR) {
3012
+ clearAll();
3013
+ a.down([msg]);
3014
+ return true;
3015
+ }
3016
+ if (t === COMPLETE) {
3017
+ sourceDone = true;
3018
+ tryComplete(a);
3019
+ return true;
3020
+ }
3021
+ if (t === DIRTY) {
3022
+ a.down([[DIRTY]]);
3023
+ return true;
3024
+ }
3025
+ if (t === RESOLVED) {
3026
+ a.down([[RESOLVED]]);
3027
+ return true;
3028
+ }
3029
+ if (t === DATA) {
3030
+ enqueue(msg[1], a);
3031
+ return true;
3032
+ }
3033
+ return false;
3034
+ }
3035
+ }
3036
+ );
3037
+ }
3038
+ var flatMap = mergeMap;
3039
+ function delay(source, ms, opts) {
3040
+ const timers = /* @__PURE__ */ new Set();
3041
+ function clearAll() {
3042
+ for (const id of timers) clearTimeout(id);
3043
+ timers.clear();
3044
+ }
3045
+ return node([source], () => clearAll, {
3046
+ ...operatorOpts2(opts),
3047
+ completeWhenDepsComplete: false,
3048
+ onMessage(msg, _i, a) {
3049
+ const t = msg[0];
3050
+ if (t === DIRTY || t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {
3051
+ if (t === COMPLETE) clearAll();
3052
+ a.down([msg]);
3053
+ return true;
3054
+ }
3055
+ if (t === RESOLVED) {
3056
+ a.down([msg]);
3057
+ return true;
3058
+ }
3059
+ if (t === DATA) {
3060
+ const id = setTimeout(() => {
3061
+ timers.delete(id);
3062
+ a.down([msg]);
3063
+ }, ms);
3064
+ timers.add(id);
3065
+ return true;
3066
+ }
3067
+ a.down([msg]);
3068
+ return true;
3069
+ }
3070
+ });
3071
+ }
3072
+ function debounce(source, ms, opts) {
3073
+ let timer;
3074
+ let pending;
3075
+ function clearTimer() {
3076
+ if (timer !== void 0) {
3077
+ clearTimeout(timer);
3078
+ timer = void 0;
3079
+ }
3080
+ }
3081
+ return node([source], () => clearTimer, {
3082
+ ...operatorOpts2(opts),
3083
+ completeWhenDepsComplete: false,
3084
+ onMessage(msg, _i, a) {
3085
+ const t = msg[0];
3086
+ if (t === ERROR || t === PAUSE || t === RESUME) {
3087
+ clearTimer();
3088
+ a.down([msg]);
3089
+ return true;
3090
+ }
3091
+ if (t === COMPLETE) {
3092
+ if (timer !== void 0) {
3093
+ clearTimer();
3094
+ a.emit(pending);
3095
+ }
3096
+ a.down([msg]);
3097
+ return true;
3098
+ }
3099
+ if (t === DIRTY) {
3100
+ a.down([[DIRTY]]);
3101
+ return true;
3102
+ }
3103
+ if (t === DATA) {
3104
+ clearTimer();
3105
+ pending = msg[1];
3106
+ timer = setTimeout(() => {
3107
+ timer = void 0;
3108
+ a.emit(pending);
3109
+ }, ms);
3110
+ return true;
3111
+ }
3112
+ if (t === RESOLVED) {
3113
+ a.down([[RESOLVED]]);
3114
+ return true;
3115
+ }
3116
+ a.down([msg]);
3117
+ return true;
3118
+ }
3119
+ });
3120
+ }
3121
+ function throttle(source, ms, opts) {
3122
+ const { leading: leadingOpt, trailing: trailingOpt, ...throttleNodeOpts } = opts ?? {};
3123
+ const leading = leadingOpt !== false;
3124
+ const trailing = trailingOpt === true;
3125
+ let timer;
3126
+ const windowNs = ms * NS_PER_MS;
3127
+ let lastEmitNs = -Infinity;
3128
+ let pending;
3129
+ let hasPending = false;
3130
+ function clearTimer() {
3131
+ if (timer !== void 0) {
3132
+ clearTimeout(timer);
3133
+ timer = void 0;
3134
+ }
3135
+ }
3136
+ return node(
3137
+ [source],
3138
+ () => {
3139
+ clearTimer();
3140
+ return void 0;
3141
+ },
3142
+ {
3143
+ ...operatorOpts2(throttleNodeOpts),
3144
+ completeWhenDepsComplete: false,
3145
+ onMessage(msg, _i, a) {
3146
+ const t = msg[0];
3147
+ if (t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {
3148
+ clearTimer();
3149
+ a.down([msg]);
3150
+ return true;
3151
+ }
3152
+ if (t === DIRTY) {
3153
+ a.down([[DIRTY]]);
3154
+ return true;
3155
+ }
3156
+ if (t === RESOLVED) {
3157
+ a.down([[RESOLVED]]);
3158
+ return true;
3159
+ }
3160
+ if (t === DATA) {
3161
+ const v = msg[1];
3162
+ const nowNs = monotonicNs();
3163
+ if (leading && nowNs - lastEmitNs >= windowNs) {
3164
+ lastEmitNs = nowNs;
3165
+ a.emit(v);
3166
+ clearTimer();
3167
+ if (trailing) {
3168
+ timer = setTimeout(() => {
3169
+ timer = void 0;
3170
+ if (hasPending) {
3171
+ lastEmitNs = monotonicNs();
3172
+ a.emit(pending);
3173
+ hasPending = false;
3174
+ }
3175
+ }, ms);
3176
+ }
3177
+ return true;
3178
+ }
3179
+ if (trailing) {
3180
+ pending = v;
3181
+ hasPending = true;
3182
+ if (timer === void 0) {
3183
+ const elapsedMs = (nowNs - lastEmitNs) / NS_PER_MS;
3184
+ timer = setTimeout(
3185
+ () => {
3186
+ timer = void 0;
3187
+ if (hasPending) {
3188
+ lastEmitNs = monotonicNs();
3189
+ a.emit(pending);
3190
+ hasPending = false;
3191
+ }
3192
+ },
3193
+ Math.max(0, ms - elapsedMs)
3194
+ );
3195
+ }
3196
+ }
3197
+ return true;
3198
+ }
3199
+ a.down([msg]);
3200
+ return true;
3201
+ }
3202
+ }
3203
+ );
3204
+ }
3205
+ function sample(source, notifier, opts) {
3206
+ return node([source, notifier], () => void 0, {
3207
+ ...operatorOpts2(opts),
3208
+ completeWhenDepsComplete: false,
3209
+ onMessage(msg, i, a) {
3210
+ const t = msg[0];
3211
+ if (t === ERROR) {
3212
+ a.down([msg]);
3213
+ return true;
3214
+ }
3215
+ if (t === COMPLETE) {
3216
+ a.down([msg]);
3217
+ return true;
3218
+ }
3219
+ if (i === 1 && t === DATA) {
3220
+ a.emit(source.get());
3221
+ return true;
3222
+ }
3223
+ if (i === 1 && t === RESOLVED) {
3224
+ return true;
3225
+ }
3226
+ if (i === 0) {
3227
+ return true;
3228
+ }
3229
+ return false;
3230
+ }
3231
+ });
3232
+ }
3233
+ function audit(source, ms, opts) {
3234
+ let timer;
3235
+ let latest;
3236
+ let has = false;
3237
+ function clearTimer() {
3238
+ if (timer !== void 0) {
3239
+ clearTimeout(timer);
3240
+ timer = void 0;
3241
+ }
3242
+ }
3243
+ return node([source], () => clearTimer, {
3244
+ ...operatorOpts2(opts),
3245
+ completeWhenDepsComplete: false,
3246
+ onMessage(msg, _i, a) {
3247
+ const t = msg[0];
3248
+ if (t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {
3249
+ clearTimer();
3250
+ a.down([msg]);
3251
+ return true;
3252
+ }
3253
+ if (t === DIRTY) {
3254
+ a.down([[DIRTY]]);
3255
+ return true;
3256
+ }
3257
+ if (t === RESOLVED) {
3258
+ a.down([[RESOLVED]]);
3259
+ return true;
3260
+ }
3261
+ if (t === DATA) {
3262
+ latest = msg[1];
3263
+ has = true;
3264
+ clearTimer();
3265
+ timer = setTimeout(() => {
3266
+ timer = void 0;
3267
+ if (has) {
3268
+ has = false;
3269
+ a.emit(latest);
3270
+ }
3271
+ }, ms);
3272
+ return true;
3273
+ }
3274
+ a.down([msg]);
3275
+ return true;
3276
+ }
3277
+ });
3278
+ }
3279
+ function timeout(source, ms, opts) {
3280
+ const { with: withPayload, ...timeoutNodeOpts } = opts ?? {};
3281
+ let timer;
3282
+ const err = withPayload ?? new Error("timeout");
3283
+ function arm(a) {
3284
+ clearTimeout(timer);
3285
+ timer = setTimeout(() => {
3286
+ timer = void 0;
3287
+ a.down([[ERROR, err]]);
3288
+ }, ms);
3289
+ }
3290
+ return node(
3291
+ [source],
3292
+ ([_v], a) => {
3293
+ arm(a);
3294
+ return () => clearTimeout(timer);
3295
+ },
3296
+ {
3297
+ ...operatorOpts2(timeoutNodeOpts),
3298
+ completeWhenDepsComplete: false,
3299
+ onMessage(msg, _i, a) {
3300
+ const t = msg[0];
3301
+ if (t === DATA) {
3302
+ arm(a);
3303
+ a.down([msg]);
3304
+ return true;
3305
+ }
3306
+ if (t === COMPLETE || t === ERROR) {
3307
+ clearTimeout(timer);
3308
+ a.down([msg]);
3309
+ return true;
3310
+ }
3311
+ if (t === DIRTY || t === RESOLVED) {
3312
+ a.down([msg]);
3313
+ return true;
3314
+ }
3315
+ a.down([msg]);
3316
+ return true;
3317
+ }
3318
+ }
3319
+ );
3320
+ }
3321
+ function buffer(source, notifier, opts) {
3322
+ const buf = [];
3323
+ return node([source, notifier], () => void 0, {
3324
+ ...operatorOpts2(opts),
3325
+ completeWhenDepsComplete: false,
3326
+ onMessage(msg, i, a) {
3327
+ const t = msg[0];
3328
+ if (t === ERROR) {
3329
+ a.down([msg]);
3330
+ return true;
3331
+ }
3332
+ if (t === COMPLETE && i === 0) {
3333
+ if (buf.length > 0) a.emit([...buf]);
3334
+ buf.length = 0;
3335
+ a.down([msg]);
3336
+ return true;
3337
+ }
3338
+ if (t === COMPLETE && i === 1) {
3339
+ a.down([msg]);
3340
+ return true;
3341
+ }
3342
+ if (i === 0 && t === DATA) {
3343
+ buf.push(msg[1]);
3344
+ return true;
3345
+ }
3346
+ if (i === 1 && t === DATA) {
3347
+ if (buf.length > 0) {
3348
+ a.emit([...buf]);
3349
+ buf.length = 0;
3350
+ } else {
3351
+ a.down([[RESOLVED]]);
3352
+ }
3353
+ return true;
3354
+ }
3355
+ if (i === 1 && t === RESOLVED) {
3356
+ return true;
3357
+ }
3358
+ if (i === 0 && (t === DIRTY || t === RESOLVED)) {
3359
+ return true;
3360
+ }
3361
+ return false;
3362
+ }
3363
+ });
3364
+ }
3365
+ function bufferCount(source, count, opts) {
3366
+ if (count <= 0) throw new RangeError("bufferCount expects count > 0");
3367
+ const buf = [];
3368
+ let started = false;
3369
+ return node(
3370
+ [source],
3371
+ ([v], a) => {
3372
+ if (!started) {
3373
+ started = true;
3374
+ buf.push(v);
3375
+ if (buf.length >= count) {
3376
+ a.emit(buf.splice(0, buf.length));
3377
+ }
3378
+ }
3379
+ return void 0;
3380
+ },
3381
+ {
3382
+ ...operatorOpts2(opts),
3383
+ completeWhenDepsComplete: false,
3384
+ onMessage(msg, _i, a) {
3385
+ const t = msg[0];
3386
+ if (t === ERROR) {
3387
+ a.down([msg]);
3388
+ return true;
3389
+ }
3390
+ if (t === COMPLETE) {
3391
+ if (buf.length > 0) a.emit([...buf]);
3392
+ buf.length = 0;
3393
+ a.down([[COMPLETE]]);
3394
+ return true;
3395
+ }
3396
+ if (t === DIRTY) {
3397
+ a.down([[DIRTY]]);
3398
+ return true;
3399
+ }
3400
+ if (t === RESOLVED) {
3401
+ a.down([[RESOLVED]]);
3402
+ return true;
3403
+ }
3404
+ if (t === DATA) {
3405
+ buf.push(msg[1]);
3406
+ if (buf.length >= count) {
3407
+ a.emit(buf.splice(0, buf.length));
3408
+ }
3409
+ return true;
3410
+ }
3411
+ return false;
3412
+ }
3413
+ }
3414
+ );
3415
+ }
3416
+ function windowCount(source, count, opts) {
3417
+ if (count <= 0) throw new RangeError("windowCount expects count > 0");
3418
+ let win;
3419
+ let winDown;
3420
+ let n = 0;
3421
+ function openWindow(a) {
3422
+ const s = producer((_d, actions) => {
3423
+ winDown = actions.down.bind(actions);
3424
+ return () => {
3425
+ winDown = void 0;
3426
+ };
3427
+ }, operatorOpts2());
3428
+ win = s;
3429
+ n = 0;
3430
+ a.emit(s);
3431
+ }
3432
+ return node([source], () => void 0, {
3433
+ ...operatorOpts2(opts),
3434
+ completeWhenDepsComplete: false,
3435
+ onMessage(msg, _i, a) {
3436
+ const t = msg[0];
3437
+ if (t === DATA) {
3438
+ if (!win) openWindow(a);
3439
+ winDown?.([[DATA, msg[1]]]);
3440
+ n += 1;
3441
+ if (n >= count) {
3442
+ winDown?.([[COMPLETE]]);
3443
+ win = void 0;
3444
+ winDown = void 0;
3445
+ }
3446
+ return true;
3447
+ }
3448
+ if (t === COMPLETE) {
3449
+ winDown?.([[COMPLETE]]);
3450
+ win = void 0;
3451
+ winDown = void 0;
3452
+ a.down([[COMPLETE]]);
3453
+ return true;
3454
+ }
3455
+ if (t === ERROR) {
3456
+ winDown?.([msg]);
3457
+ win = void 0;
3458
+ winDown = void 0;
3459
+ a.down([msg]);
3460
+ return true;
3461
+ }
3462
+ if (t === DIRTY) {
3463
+ a.down([[DIRTY]]);
3464
+ return true;
3465
+ }
3466
+ if (t === RESOLVED) {
3467
+ a.down([[RESOLVED]]);
3468
+ return true;
3469
+ }
3470
+ return false;
3471
+ }
3472
+ });
3473
+ }
3474
+ function bufferTime(source, ms, opts) {
3475
+ const buf = [];
3476
+ let iv;
3477
+ return node(
3478
+ [source],
3479
+ (_deps, a) => {
3480
+ iv = setInterval(() => {
3481
+ if (buf.length > 0) {
3482
+ a.emit([...buf]);
3483
+ buf.length = 0;
3484
+ }
3485
+ }, ms);
3486
+ return () => {
3487
+ if (iv !== void 0) clearInterval(iv);
3488
+ };
3489
+ },
3490
+ {
3491
+ ...operatorOpts2(opts),
3492
+ completeWhenDepsComplete: false,
3493
+ onMessage(msg, _i, a) {
3494
+ const t = msg[0];
3495
+ if (t === ERROR) {
3496
+ a.down([msg]);
3497
+ return true;
3498
+ }
3499
+ if (t === COMPLETE) {
3500
+ if (iv !== void 0) clearInterval(iv);
3501
+ if (buf.length > 0) a.emit([...buf]);
3502
+ buf.length = 0;
3503
+ a.down([[COMPLETE]]);
3504
+ return true;
3505
+ }
3506
+ if (t === DIRTY) {
3507
+ a.down([[DIRTY]]);
3508
+ return true;
3509
+ }
3510
+ if (t === RESOLVED) {
3511
+ a.down([[RESOLVED]]);
3512
+ return true;
3513
+ }
3514
+ if (t === DATA) {
3515
+ buf.push(msg[1]);
3516
+ return true;
3517
+ }
3518
+ return false;
3519
+ }
3520
+ }
3521
+ );
3522
+ }
3523
+ function windowTime(source, ms, opts) {
3524
+ let winDown;
3525
+ let iv;
3526
+ function closeWindow() {
3527
+ winDown?.([[COMPLETE]]);
3528
+ winDown = void 0;
3529
+ }
3530
+ return node(
3531
+ [source],
3532
+ (_deps, a) => {
3533
+ function openWindow() {
3534
+ const s = producer((_d, actions) => {
3535
+ winDown = actions.down.bind(actions);
3536
+ return () => {
3537
+ winDown = void 0;
3538
+ };
3539
+ }, operatorOpts2());
3540
+ a.emit(s);
3541
+ }
3542
+ openWindow();
3543
+ iv = setInterval(() => {
3544
+ closeWindow();
3545
+ openWindow();
3546
+ }, ms);
3547
+ return () => {
3548
+ if (iv !== void 0) clearInterval(iv);
3549
+ closeWindow();
3550
+ };
3551
+ },
3552
+ {
3553
+ ...operatorOpts2(opts),
3554
+ completeWhenDepsComplete: false,
3555
+ onMessage(msg, _i, a) {
3556
+ const t = msg[0];
3557
+ if (t === DATA) {
3558
+ winDown?.([[DATA, msg[1]]]);
3559
+ return true;
3560
+ }
3561
+ if (t === COMPLETE) {
3562
+ if (iv !== void 0) clearInterval(iv);
3563
+ closeWindow();
3564
+ a.down([[COMPLETE]]);
3565
+ return true;
3566
+ }
3567
+ if (t === ERROR) {
3568
+ if (iv !== void 0) clearInterval(iv);
3569
+ winDown?.([msg]);
3570
+ closeWindow();
3571
+ a.down([msg]);
3572
+ return true;
3573
+ }
3574
+ if (t === DIRTY) {
3575
+ a.down([[DIRTY]]);
3576
+ return true;
3577
+ }
3578
+ if (t === RESOLVED) {
3579
+ a.down([[RESOLVED]]);
3580
+ return true;
3581
+ }
3582
+ return false;
3583
+ }
3584
+ }
3585
+ );
3586
+ }
3587
+ function window(source, notifier, opts) {
3588
+ let win;
3589
+ let winDown;
3590
+ function closeWindow() {
3591
+ winDown?.([[COMPLETE]]);
3592
+ win = void 0;
3593
+ winDown = void 0;
3594
+ }
3595
+ return node([source, notifier], () => void 0, {
3596
+ ...operatorOpts2(opts),
3597
+ completeWhenDepsComplete: false,
3598
+ onMessage(msg, i, a) {
3599
+ const t = msg[0];
3600
+ if (i === 0 && t === DATA) {
3601
+ if (!win) {
3602
+ const s = producer((_d, actions) => {
3603
+ winDown = actions.down.bind(actions);
3604
+ return () => {
3605
+ winDown = void 0;
3606
+ };
3607
+ }, operatorOpts2());
3608
+ win = s;
3609
+ a.emit(s);
3610
+ }
3611
+ winDown?.([[DATA, msg[1]]]);
3612
+ return true;
3613
+ }
3614
+ if (i === 1 && t === DATA) {
3615
+ closeWindow();
3616
+ const s = producer((_d, actions) => {
3617
+ winDown = actions.down.bind(actions);
3618
+ return () => {
3619
+ winDown = void 0;
3620
+ };
3621
+ }, operatorOpts2());
3622
+ win = s;
3623
+ a.emit(s);
3624
+ return true;
3625
+ }
3626
+ if (t === COMPLETE && i === 0) {
3627
+ closeWindow();
3628
+ a.down([[COMPLETE]]);
3629
+ return true;
3630
+ }
3631
+ if (t === COMPLETE && i === 1) {
3632
+ return true;
3633
+ }
3634
+ if (t === ERROR) {
3635
+ winDown?.([msg]);
3636
+ win = void 0;
3637
+ winDown = void 0;
3638
+ a.down([msg]);
3639
+ return true;
3640
+ }
3641
+ if (i === 0 && (t === DIRTY || t === RESOLVED)) {
3642
+ return true;
3643
+ }
3644
+ if (i === 1 && t === RESOLVED) {
3645
+ return true;
3646
+ }
3647
+ return false;
3648
+ }
3649
+ });
3650
+ }
3651
+ function interval(periodMs, opts) {
3652
+ let n = 0;
3653
+ return producer((_d, a) => {
3654
+ const id = setInterval(() => {
3655
+ a.emit(n);
3656
+ n += 1;
3657
+ }, periodMs);
3658
+ return () => clearInterval(id);
3659
+ }, operatorOpts2(opts));
3660
+ }
3661
+ function repeat(source, count, opts) {
3662
+ if (count <= 0) throw new RangeError("repeat expects count > 0");
3663
+ return producer((_d, a) => {
3664
+ let remaining = count;
3665
+ let innerU;
3666
+ const start = () => {
3667
+ innerU?.();
3668
+ innerU = source.subscribe((msgs) => {
3669
+ let completed = false;
3670
+ const fwd = [];
3671
+ for (const m of msgs) {
3672
+ if (m[0] === COMPLETE) completed = true;
3673
+ else fwd.push(m);
3674
+ }
3675
+ if (fwd.length > 0) a.down(fwd);
3676
+ if (completed) {
3677
+ innerU?.();
3678
+ innerU = void 0;
3679
+ remaining -= 1;
3680
+ if (remaining > 0) start();
3681
+ else a.down([[COMPLETE]]);
3682
+ }
3683
+ });
3684
+ };
3685
+ start();
3686
+ return () => {
3687
+ innerU?.();
3688
+ };
3689
+ }, operatorOpts2(opts));
3690
+ }
3691
+ function pausable(source, opts) {
3692
+ let paused = false;
3693
+ const backlog = [];
3694
+ return node([source], () => void 0, {
3695
+ ...operatorOpts2(opts),
3696
+ completeWhenDepsComplete: false,
3697
+ onMessage(msg, _i, a) {
3698
+ const t = msg[0];
3699
+ if (t === PAUSE) {
3700
+ paused = true;
3701
+ a.down([msg]);
3702
+ return true;
3703
+ }
3704
+ if (t === RESUME) {
3705
+ paused = false;
3706
+ a.down([msg]);
3707
+ for (const m of backlog) a.down([m]);
3708
+ backlog.length = 0;
3709
+ return true;
3710
+ }
3711
+ if (paused && (t === DIRTY || t === DATA || t === RESOLVED)) {
3712
+ backlog.push(msg);
3713
+ return true;
3714
+ }
3715
+ a.down([msg]);
3716
+ return true;
3717
+ }
3718
+ });
3719
+ }
3720
+ function rescue(source, recover, opts) {
3721
+ return node([source], () => void 0, {
3722
+ ...operatorOpts2(opts),
3723
+ completeWhenDepsComplete: false,
3724
+ onMessage(msg, _i, a) {
3725
+ if (msg[0] === ERROR) {
3726
+ try {
3727
+ a.emit(recover(msg[1]));
3728
+ } catch (err) {
3729
+ a.down([[ERROR, err]]);
3730
+ }
3731
+ return true;
3732
+ }
3733
+ a.down([msg]);
3734
+ return true;
3735
+ }
3736
+ });
3737
+ }
3738
+ function gate(source, control, opts) {
3739
+ return node(
3740
+ [source, control],
3741
+ (_deps, a) => {
3742
+ const v = source.get();
3743
+ const c = control.get();
3744
+ if (!c) {
3745
+ a.down([[RESOLVED]]);
3746
+ return void 0;
3747
+ }
3748
+ return v;
3749
+ },
3750
+ operatorOpts2(opts)
3751
+ );
3752
+ }
3753
+ var combineLatest = combine;
3754
+ var debounceTime = debounce;
3755
+ var throttleTime = throttle;
3756
+ var catchError = rescue;
3757
+
3758
+ // src/extra/reactive-map.ts
3759
+ function emptySnapshot() {
3760
+ return { version: 0, value: { map: /* @__PURE__ */ new Map() } };
3761
+ }
3762
+ function isExpired(e, now) {
3763
+ return e.expiresAt !== void 0 && now >= e.expiresAt;
3764
+ }
3765
+ function buildMap(store, now) {
3766
+ const out = /* @__PURE__ */ new Map();
3767
+ for (const [k, e] of store) {
3768
+ if (!isExpired(e, now)) out.set(k, e.value);
3769
+ }
3770
+ return out;
3771
+ }
3772
+ function reactiveMap(options = {}) {
3773
+ const { name, maxSize, defaultTtl, ...nodeOpts } = options;
3774
+ const store = /* @__PURE__ */ new Map();
3775
+ let current = emptySnapshot();
3776
+ const n = state(current, {
3777
+ ...nodeOpts,
3778
+ name,
3779
+ describeKind: "state",
3780
+ equals: snapshotEqualsVersion
3781
+ });
3782
+ function pruneExpiredInternal() {
3783
+ const now = monotonicNs();
3784
+ let removed = false;
3785
+ for (const [k, e] of store) {
3786
+ if (isExpired(e, now)) {
3787
+ store.delete(k);
3788
+ removed = true;
3789
+ }
3790
+ }
3791
+ return removed;
3792
+ }
3793
+ function evictLruWhileOver() {
3794
+ if (maxSize === void 0 || maxSize < 1) return;
3795
+ while (store.size > maxSize) {
3796
+ const first2 = store.keys().next().value;
3797
+ if (first2 === void 0) break;
3798
+ store.delete(first2);
3799
+ }
3800
+ }
3801
+ function pushSnapshot() {
3802
+ pruneExpiredInternal();
3803
+ const now = monotonicNs();
3804
+ const map2 = buildMap(store, now);
3805
+ const nv = n.v;
3806
+ current = bumpVersion(current, { map: map2 }, nv ? { id: nv.id, version: nv.version } : void 0);
3807
+ batch(() => {
3808
+ n.down([[DIRTY]]);
3809
+ n.down([[DATA, current]]);
3810
+ });
3811
+ }
3812
+ function touchLru(key) {
3813
+ const e = store.get(key);
3814
+ if (e === void 0) return;
3815
+ store.delete(key);
3816
+ store.set(key, e);
3817
+ }
3818
+ const bundle = {
3819
+ node: n,
3820
+ get(key) {
3821
+ const now = monotonicNs();
3822
+ const e = store.get(key);
3823
+ if (e === void 0) return void 0;
3824
+ if (isExpired(e, now)) {
3825
+ store.delete(key);
3826
+ pushSnapshot();
3827
+ return void 0;
3828
+ }
3829
+ touchLru(key);
3830
+ return e.value;
3831
+ },
3832
+ set(key, value, setOpts) {
3833
+ pruneExpiredInternal();
3834
+ const ttlSec = setOpts?.ttl ?? defaultTtl;
3835
+ if (ttlSec !== void 0 && ttlSec <= 0) {
3836
+ throw new RangeError(`reactiveMap: ttl must be positive (got ${ttlSec})`);
3837
+ }
3838
+ const expiresAt = ttlSec !== void 0 ? monotonicNs() + ttlSec * 1e9 : void 0;
3839
+ if (store.has(key)) store.delete(key);
3840
+ store.set(key, { value, expiresAt });
3841
+ evictLruWhileOver();
3842
+ pushSnapshot();
3843
+ },
3844
+ delete(key) {
3845
+ if (!store.delete(key)) return;
3846
+ pushSnapshot();
3847
+ },
3848
+ clear() {
3849
+ if (store.size === 0) return;
3850
+ store.clear();
3851
+ pushSnapshot();
3852
+ },
3853
+ has(key) {
3854
+ const now = monotonicNs();
3855
+ const e = store.get(key);
3856
+ if (e === void 0) return false;
3857
+ if (isExpired(e, now)) {
3858
+ store.delete(key);
3859
+ pushSnapshot();
3860
+ return false;
3861
+ }
3862
+ touchLru(key);
3863
+ return true;
3864
+ },
3865
+ get size() {
3866
+ pruneExpiredInternal();
3867
+ return store.size;
3868
+ },
3869
+ pruneExpired() {
3870
+ if (!pruneExpiredInternal()) return;
3871
+ pushSnapshot();
3872
+ }
3873
+ };
3874
+ return bundle;
3875
+ }
3876
+
3877
+ // src/extra/composite.ts
3878
+ function isNodeLike(value) {
3879
+ return typeof value === "object" && value !== null && typeof value.get === "function" && typeof value.subscribe === "function";
3880
+ }
3881
+ function verifiable(source, verifyFn, opts) {
3882
+ const sourceNode = fromAny(source);
3883
+ const hasSourceVersioning = sourceNode.v != null;
3884
+ const verified = state(opts?.initialVerified ?? null, {
3885
+ ...hasSourceVersioning ? { meta: { sourceVersion: null } } : {}
3886
+ });
3887
+ const hasTrigger = opts?.trigger !== void 0 && opts.trigger !== null;
3888
+ let triggerNode = null;
3889
+ if (hasTrigger && opts?.autoVerify) {
3890
+ triggerNode = merge(fromAny(opts.trigger), sourceNode);
3891
+ } else if (hasTrigger) {
3892
+ triggerNode = fromAny(opts.trigger);
3893
+ } else if (opts?.autoVerify) {
3894
+ triggerNode = sourceNode;
3895
+ }
3896
+ if (triggerNode !== null) {
3897
+ const verifyStream = switchMap(triggerNode, () => verifyFn(sourceNode.get()));
3898
+ forEach(verifyStream, (value) => {
3899
+ batch(() => {
3900
+ verified.down([[DATA, value]]);
3901
+ if (hasSourceVersioning) {
3902
+ const sv = sourceNode.v;
3903
+ if (sv != null) {
3904
+ verified.meta.sourceVersion.down([[DATA, { id: sv.id, version: sv.version }]]);
3905
+ }
3906
+ }
3907
+ });
3908
+ });
3909
+ }
3910
+ return { node: sourceNode, verified, trigger: triggerNode };
3911
+ }
3912
+ function keepalive(node2) {
3913
+ node2.subscribe(() => void 0);
3914
+ }
3915
+ function mapFromSnapshot(snapshot) {
3916
+ if (typeof snapshot === "object" && snapshot !== null && "value" in snapshot && typeof snapshot.value === "object" && snapshot.value !== null && "map" in snapshot.value) {
3917
+ return snapshot.value.map ?? /* @__PURE__ */ new Map();
3918
+ }
3919
+ return /* @__PURE__ */ new Map();
3920
+ }
3921
+ function asReadonlyMap(store) {
3922
+ return mapFromSnapshot(store.node.get());
3923
+ }
3924
+ function applyExtraction(store, extraction) {
3925
+ if (!Array.isArray(extraction.upsert)) {
3926
+ throw new TypeError("distill extraction requires upsert: Array<{ key, value }>");
3927
+ }
3928
+ batch(() => {
3929
+ for (const { key, value } of extraction.upsert) {
3930
+ store.set(key, value);
3931
+ }
3932
+ for (const key of extraction.remove ?? []) {
3933
+ store.delete(key);
3934
+ }
3935
+ });
3936
+ }
3937
+ function distill(source, extractFn, opts) {
3938
+ const sourceNode = fromAny(source);
3939
+ const store = reactiveMap(opts.mapOptions ?? {});
3940
+ const budget = opts.budget ?? 2e3;
3941
+ const hasContext = opts.context !== void 0 && opts.context !== null;
3942
+ const contextNode = hasContext ? fromAny(opts.context) : state(null);
3943
+ const extractionStream = switchMap(sourceNode, (raw) => extractFn(raw, asReadonlyMap(store)));
3944
+ forEach(extractionStream, (extraction) => {
3945
+ applyExtraction(store, extraction);
3946
+ });
3947
+ if (opts.evict) {
3948
+ const evictionKeys = dynamicNode((get) => {
3949
+ const out = [];
3950
+ const snapshot = mapFromSnapshot(get(store.node));
3951
+ for (const [key, mem] of snapshot) {
3952
+ const verdict = opts.evict(key, mem);
3953
+ if (isNodeLike(verdict)) {
3954
+ if (get(verdict) === true) out.push(key);
3955
+ continue;
3956
+ }
3957
+ if (typeof verdict === "boolean") {
3958
+ if (verdict) out.push(key);
3959
+ continue;
3960
+ }
3961
+ throw new TypeError("distill evict() must return boolean or Node<boolean>");
3962
+ }
3963
+ return out;
3964
+ });
3965
+ forEach(evictionKeys, (keys) => {
3966
+ for (const key of keys) store.delete(key);
3967
+ });
3968
+ }
3969
+ const hasConsolidateTrigger = opts.consolidateTrigger !== void 0 && opts.consolidateTrigger !== null;
3970
+ if (opts.consolidate && hasConsolidateTrigger) {
3971
+ const consolidateTriggerNode = fromAny(opts.consolidateTrigger);
3972
+ const consolidationStream = switchMap(
3973
+ consolidateTriggerNode,
3974
+ () => opts.consolidate(asReadonlyMap(store))
3975
+ );
3976
+ forEach(consolidationStream, (extraction) => {
3977
+ applyExtraction(store, extraction);
3978
+ });
3979
+ }
3980
+ const compact = derived([store.node, contextNode], ([snapshot, context]) => {
3981
+ const entries = [...mapFromSnapshot(snapshot).entries()].map(([key, value]) => ({
3982
+ key,
3983
+ value,
3984
+ score: opts.score(value, context),
3985
+ cost: opts.cost(value)
3986
+ }));
3987
+ entries.sort((a, b) => b.score - a.score);
3988
+ const packed = [];
3989
+ let remaining = budget;
3990
+ for (const item of entries) {
3991
+ if (item.cost <= remaining) {
3992
+ packed.push({ key: item.key, value: item.value, score: item.score });
3993
+ remaining -= item.cost;
3994
+ }
3995
+ }
3996
+ return packed;
3997
+ });
3998
+ const size = derived([store.node], ([snapshot]) => mapFromSnapshot(snapshot).size);
3999
+ keepalive(compact);
4000
+ keepalive(size);
4001
+ return { store, compact, size };
4002
+ }
4003
+
4004
+ // src/extra/pubsub.ts
4005
+ var PubSubHubImpl = class {
4006
+ topics = /* @__PURE__ */ new Map();
4007
+ topic(name) {
4008
+ let n = this.topics.get(name);
4009
+ if (n === void 0) {
4010
+ n = state(void 0, { describeKind: "state" });
4011
+ this.topics.set(name, n);
4012
+ }
4013
+ return n;
4014
+ }
4015
+ publish(name, value) {
4016
+ const t = this.topic(name);
4017
+ batch(() => {
4018
+ t.down([[DIRTY]]);
4019
+ t.down([[DATA, value]]);
4020
+ });
4021
+ }
4022
+ removeTopic(name) {
4023
+ const n = this.topics.get(name);
4024
+ if (n === void 0) return false;
4025
+ n.down([[TEARDOWN]]);
4026
+ this.topics.delete(name);
4027
+ return true;
4028
+ }
4029
+ };
4030
+ function pubsub() {
4031
+ return new PubSubHubImpl();
4032
+ }
4033
+
4034
+ // src/extra/reactive-index.ts
4035
+ function emptySnapshot2() {
4036
+ return { version: 0, value: { rows: [] } };
4037
+ }
4038
+ function rowKey(row) {
4039
+ return [row.secondary, row.primary];
4040
+ }
4041
+ function cmpOrd(a, b) {
4042
+ if (a === b) return 0;
4043
+ const ta = typeof a;
4044
+ const tb = typeof b;
4045
+ if (ta === tb && (ta === "number" || ta === "string" || ta === "boolean" || ta === "bigint")) {
4046
+ const ax = a;
4047
+ const bx = b;
4048
+ if (ax < bx) return -1;
4049
+ if (ax > bx) return 1;
4050
+ return 0;
4051
+ }
4052
+ return String(a).localeCompare(String(b));
4053
+ }
4054
+ function compareKeys(a, b) {
4055
+ let c = cmpOrd(a[0], b[0]);
4056
+ if (c !== 0) return c;
4057
+ c = cmpOrd(a[1], b[1]);
4058
+ return c;
4059
+ }
4060
+ function bisectLeft(rows, row) {
4061
+ const k = rowKey(row);
4062
+ let lo = 0;
4063
+ let hi = rows.length;
4064
+ while (lo < hi) {
4065
+ const mid = lo + hi >> 1;
4066
+ if (compareKeys(k, rowKey(rows[mid])) > 0) lo = mid + 1;
4067
+ else hi = mid;
4068
+ }
4069
+ return lo;
4070
+ }
4071
+ function byPrimaryMap(rows) {
4072
+ const m = /* @__PURE__ */ new Map();
4073
+ for (const r of rows) m.set(r.primary, r.value);
4074
+ return m;
4075
+ }
4076
+ function keepaliveDerived(n) {
4077
+ void n.subscribe(() => {
4078
+ });
4079
+ }
4080
+ function reactiveIndex(options = {}) {
4081
+ const { name } = options;
4082
+ const buf = [];
4083
+ let current = emptySnapshot2();
4084
+ const ordered = state(current, {
4085
+ name,
4086
+ describeKind: "state",
4087
+ equals: snapshotEqualsVersion
4088
+ });
4089
+ const byPrimary = derived(
4090
+ [ordered],
4091
+ ([s]) => {
4092
+ const rows = s.value.rows;
4093
+ return byPrimaryMap(rows);
4094
+ },
4095
+ { initial: /* @__PURE__ */ new Map(), describeKind: "derived" }
4096
+ );
4097
+ keepaliveDerived(byPrimary);
4098
+ function pushSnapshot() {
4099
+ const ov = ordered.v;
4100
+ current = bumpVersion(
4101
+ current,
4102
+ { rows: [...buf] },
4103
+ ov ? { id: ov.id, version: ov.version } : void 0
4104
+ );
4105
+ batch(() => {
4106
+ ordered.down([[DIRTY]]);
4107
+ ordered.down([[DATA, current]]);
4108
+ });
4109
+ }
4110
+ return {
4111
+ ordered,
4112
+ byPrimary,
4113
+ upsert(primary, secondary, value) {
4114
+ const next = buf.filter((r) => r.primary !== primary);
4115
+ const row = { primary, secondary, value };
4116
+ const pos = bisectLeft(next, row);
4117
+ next.splice(pos, 0, row);
4118
+ buf.length = 0;
4119
+ buf.push(...next);
4120
+ pushSnapshot();
4121
+ },
4122
+ delete(primary) {
4123
+ const next = buf.filter((r) => r.primary !== primary);
4124
+ if (next.length === buf.length) return;
4125
+ buf.length = 0;
4126
+ buf.push(...next);
4127
+ pushSnapshot();
4128
+ },
4129
+ clear() {
4130
+ if (buf.length === 0) return;
4131
+ buf.length = 0;
4132
+ pushSnapshot();
4133
+ }
4134
+ };
4135
+ }
4136
+
4137
+ // src/extra/reactive-list.ts
4138
+ function emptySnapshot3() {
4139
+ return { version: 0, value: { items: [] } };
4140
+ }
4141
+ function reactiveList(initial, options = {}) {
4142
+ const { name } = options;
4143
+ const buf = initial ? [...initial] : [];
4144
+ let current = buf.length > 0 ? { version: 1, value: { items: [...buf] } } : emptySnapshot3();
4145
+ const items = state(current, {
4146
+ name,
4147
+ describeKind: "state",
4148
+ equals: snapshotEqualsVersion
4149
+ });
4150
+ function pushSnapshot() {
4151
+ const iv = items.v;
4152
+ current = bumpVersion(
4153
+ current,
4154
+ { items: [...buf] },
4155
+ iv ? { id: iv.id, version: iv.version } : void 0
4156
+ );
4157
+ batch(() => {
4158
+ items.down([[DIRTY]]);
4159
+ items.down([[DATA, current]]);
4160
+ });
4161
+ }
4162
+ return {
4163
+ items,
4164
+ append(value) {
4165
+ buf.push(value);
4166
+ pushSnapshot();
4167
+ },
4168
+ insert(index, value) {
4169
+ if (index < 0 || index > buf.length) {
4170
+ throw new RangeError("index out of range");
4171
+ }
4172
+ buf.splice(index, 0, value);
4173
+ pushSnapshot();
4174
+ },
4175
+ pop(index = -1) {
4176
+ if (buf.length === 0) {
4177
+ throw new RangeError("pop from empty list");
4178
+ }
4179
+ const i = index >= 0 ? index : buf.length + index;
4180
+ if (i < 0 || i >= buf.length) {
4181
+ throw new RangeError("index out of range");
4182
+ }
4183
+ const [v] = buf.splice(i, 1);
4184
+ pushSnapshot();
4185
+ return v;
4186
+ },
4187
+ clear() {
4188
+ if (buf.length === 0) return;
4189
+ buf.length = 0;
4190
+ pushSnapshot();
4191
+ }
4192
+ };
4193
+ }
4194
+
4195
+ // src/extra/worker/protocol.ts
4196
+ var signalToNameMap = /* @__PURE__ */ new Map([
4197
+ [INVALIDATE, "INVALIDATE"],
4198
+ [PAUSE, "PAUSE"],
4199
+ [RESUME, "RESUME"],
4200
+ [TEARDOWN, "TEARDOWN"],
4201
+ [COMPLETE, "COMPLETE"],
4202
+ [ERROR, "ERROR"]
4203
+ ]);
4204
+ var nameToSignalMap = /* @__PURE__ */ new Map([
4205
+ ["INVALIDATE", INVALIDATE],
4206
+ ["PAUSE", PAUSE],
4207
+ ["RESUME", RESUME],
4208
+ ["TEARDOWN", TEARDOWN],
4209
+ ["COMPLETE", COMPLETE],
4210
+ ["ERROR", ERROR]
4211
+ ]);
4212
+ function signalToName(s) {
4213
+ const known = signalToNameMap.get(s);
4214
+ if (known) return known;
4215
+ const key = Symbol.keyFor(s);
4216
+ return key ?? "UNKNOWN";
4217
+ }
4218
+ function nameToSignal(name) {
4219
+ const known = nameToSignalMap.get(name);
4220
+ if (known) return known;
4221
+ if (name && name !== "UNKNOWN") return Symbol.for(name);
4222
+ return void 0;
4223
+ }
4224
+ function serializeError(err) {
4225
+ if (err instanceof Error) {
4226
+ return { message: err.message, name: err.name, stack: err.stack };
4227
+ }
4228
+ return { message: String(err), name: "Error" };
4229
+ }
4230
+ function deserializeError(payload) {
4231
+ const err = new Error(payload.message);
4232
+ err.name = payload.name;
4233
+ if (payload.stack) err.stack = payload.stack;
4234
+ return err;
4235
+ }
4236
+
4237
+ // src/extra/worker/transport.ts
4238
+ function createTransport(target) {
4239
+ if (typeof MessagePort !== "undefined" && target instanceof MessagePort) {
4240
+ return {
4241
+ post(data, transfer) {
4242
+ target.postMessage(data, transfer ?? []);
4243
+ },
4244
+ listen(handler) {
4245
+ const h = (e) => handler(e.data);
4246
+ target.addEventListener("message", h);
4247
+ target.start();
4248
+ return () => target.removeEventListener("message", h);
4249
+ },
4250
+ terminate() {
4251
+ target.close();
4252
+ }
4253
+ };
4254
+ }
4255
+ if (typeof SharedWorker !== "undefined" && target instanceof SharedWorker) {
4256
+ return createTransport(target.port);
4257
+ }
4258
+ if (typeof Worker !== "undefined" && target instanceof Worker) {
4259
+ return {
4260
+ post(data, transfer) {
4261
+ target.postMessage(data, transfer ?? []);
4262
+ },
4263
+ listen(handler) {
4264
+ const h = (e) => handler(e.data);
4265
+ target.addEventListener("message", h);
4266
+ return () => target.removeEventListener("message", h);
4267
+ },
4268
+ terminate() {
4269
+ target.terminate();
4270
+ }
4271
+ };
4272
+ }
4273
+ if (typeof BroadcastChannel !== "undefined" && target instanceof BroadcastChannel) {
4274
+ return {
4275
+ post(data, transfer) {
4276
+ if (transfer && transfer.length > 0) {
4277
+ console.warn(
4278
+ "[graphrefly] WorkerTransport: BroadcastChannel does not support Transferable objects. The transfer argument is ignored and objects will be cloned instead."
4279
+ );
4280
+ }
4281
+ target.postMessage(data);
4282
+ },
4283
+ listen(handler) {
4284
+ const h = (e) => handler(e.data);
4285
+ target.addEventListener("message", h);
4286
+ return () => target.removeEventListener("message", h);
4287
+ },
4288
+ terminate() {
4289
+ target.close();
4290
+ }
4291
+ };
4292
+ }
4293
+ if (typeof ServiceWorker !== "undefined" && target instanceof ServiceWorker) {
4294
+ return {
4295
+ post(data, transfer) {
4296
+ target.postMessage(data, transfer ?? []);
4297
+ },
4298
+ listen(handler) {
4299
+ const h = (e) => {
4300
+ if (e.source === target) handler(e.data);
4301
+ };
4302
+ navigator.serviceWorker.addEventListener("message", h);
4303
+ return () => navigator.serviceWorker.removeEventListener("message", h);
4304
+ }
4305
+ };
4306
+ }
4307
+ throw new Error(
4308
+ "createTransport: unsupported target type. Expected Worker, SharedWorker, ServiceWorker, BroadcastChannel, or MessagePort."
4309
+ );
4310
+ }
4311
+
4312
+ // src/extra/worker/bridge.ts
4313
+ function isTransport(t) {
4314
+ return typeof t === "object" && t !== null && typeof t.post === "function" && typeof t.listen === "function";
4315
+ }
4316
+ function workerBridge(target, opts) {
4317
+ const transport = isTransport(target) ? target : createTransport(target);
4318
+ const bridgeName = opts.name ?? "workerBridge";
4319
+ const exposeEntries = Object.entries(opts.expose ?? {});
4320
+ const importNames = opts.import ?? [];
4321
+ const transferFns = opts.transfer ?? {};
4322
+ const statusNode = state("connecting", {
4323
+ name: `${bridgeName}::meta::status`
4324
+ });
4325
+ const errorNode = state(null, {
4326
+ name: `${bridgeName}::meta::error`
4327
+ });
4328
+ const proxyNodes = /* @__PURE__ */ new Map();
4329
+ const lastSeenImportVersions = /* @__PURE__ */ new Map();
4330
+ for (const name of importNames) {
4331
+ const proxy = state(void 0, { name: `${bridgeName}::${name}` });
4332
+ proxyNodes.set(name, proxy);
4333
+ }
4334
+ const lastSent = /* @__PURE__ */ new Map();
4335
+ let effectUnsub;
4336
+ if (exposeEntries.length > 0) {
4337
+ const exposedNodes = exposeEntries.map(([, n]) => n);
4338
+ const aggregated = derived(
4339
+ exposedNodes,
4340
+ () => {
4341
+ const updates = {};
4342
+ for (const [name, n] of exposeEntries) {
4343
+ const v = n.get();
4344
+ if (v !== lastSent.get(name)) {
4345
+ updates[name] = v;
4346
+ lastSent.set(name, v);
4347
+ }
4348
+ }
4349
+ return updates;
4350
+ },
4351
+ { equals: () => false, name: `${bridgeName}::aggregated` }
4352
+ );
4353
+ const effectNode = effect([aggregated], () => {
4354
+ const updates = aggregated.get();
4355
+ if (Object.keys(updates).length === 0) return;
4356
+ const transferList = [];
4357
+ for (const name of Object.keys(updates)) {
4358
+ const fn = transferFns[name];
4359
+ if (fn) transferList.push(...fn(updates[name]));
4360
+ }
4361
+ let versions;
4362
+ for (const [name, n] of exposeEntries) {
4363
+ if (name in updates && n.v != null) {
4364
+ if (versions == null) versions = {};
4365
+ versions[name] = n.v.version;
4366
+ }
4367
+ }
4368
+ const msg = { t: "b", u: updates, ...versions ? { v: versions } : {} };
4369
+ try {
4370
+ transport.post(msg, transferList.length > 0 ? transferList : void 0);
4371
+ } catch (err) {
4372
+ errorNode.down([[DATA, err instanceof Error ? err : new Error(String(err))]]);
4373
+ }
4374
+ });
4375
+ effectUnsub = effectNode.subscribe(() => {
4376
+ });
4377
+ }
4378
+ let destroyed = false;
4379
+ const unlisten = transport.listen((data) => {
4380
+ if (destroyed) return;
4381
+ const msg = data;
4382
+ switch (msg.t) {
4383
+ // Worker ready — set proxy nodes with initial values
4384
+ case "r": {
4385
+ if (handshakeTimer !== void 0) clearTimeout(handshakeTimer);
4386
+ batch(() => {
4387
+ for (const [name, value] of Object.entries(msg.stores)) {
4388
+ const proxy = proxyNodes.get(name);
4389
+ if (proxy) proxy.down([[DATA, value]]);
4390
+ }
4391
+ });
4392
+ statusNode.down([[DATA, "connected"]]);
4393
+ const initValues = {};
4394
+ for (const [name, n] of exposeEntries) {
4395
+ initValues[name] = n.get();
4396
+ lastSent.set(name, initValues[name]);
4397
+ }
4398
+ transport.post({ t: "i", stores: initValues });
4399
+ break;
4400
+ }
4401
+ // Single value update from worker
4402
+ case "v": {
4403
+ const proxy = proxyNodes.get(msg.s);
4404
+ if (proxy) proxy.down([[DATA, msg.d]]);
4405
+ break;
4406
+ }
4407
+ // Batch value update from worker
4408
+ case "b": {
4409
+ batch(() => {
4410
+ for (const [name, value] of Object.entries(msg.u)) {
4411
+ const incomingVersion = msg.v?.[name];
4412
+ if (incomingVersion != null) {
4413
+ const lastSeen = lastSeenImportVersions.get(name);
4414
+ if (lastSeen != null && incomingVersion <= lastSeen) continue;
4415
+ lastSeenImportVersions.set(name, incomingVersion);
4416
+ }
4417
+ const proxy = proxyNodes.get(name);
4418
+ if (proxy) proxy.down([[DATA, value]]);
4419
+ }
4420
+ });
4421
+ break;
4422
+ }
4423
+ // Error from worker node
4424
+ case "e": {
4425
+ const proxy = proxyNodes.get(msg.s);
4426
+ if (proxy) proxy.down([[ERROR, deserializeError(msg.err)]]);
4427
+ break;
4428
+ }
4429
+ // Lifecycle signal from worker
4430
+ case "s": {
4431
+ const sig = nameToSignal(msg.sig);
4432
+ if (!sig) break;
4433
+ const targets = msg.s === "*" ? [...proxyNodes.values()] : proxyNodes.has(msg.s) ? [proxyNodes.get(msg.s)] : [];
4434
+ for (const proxy of targets) {
4435
+ proxy.down(msg.d === void 0 ? [[sig]] : [[sig, msg.d]]);
4436
+ }
4437
+ break;
4438
+ }
4439
+ }
4440
+ });
4441
+ const exposeUnsubs = [];
4442
+ for (const [name, n] of exposeEntries) {
4443
+ const unsub = n.subscribe(((msgs) => {
4444
+ if (destroyed) return;
4445
+ for (const m of msgs) {
4446
+ const type = m[0];
4447
+ if (type === DATA) continue;
4448
+ if (knownMessageTypes.includes(type) && messageTier(type) < 2) continue;
4449
+ if (type === ERROR) {
4450
+ transport.post({
4451
+ t: "e",
4452
+ s: name,
4453
+ err: serializeError(m[1])
4454
+ });
4455
+ } else {
4456
+ transport.post({
4457
+ t: "s",
4458
+ s: name,
4459
+ sig: signalToName(type),
4460
+ d: m.length > 1 ? m[1] : void 0
4461
+ });
4462
+ }
4463
+ }
4464
+ }));
4465
+ exposeUnsubs.push(unsub);
4466
+ }
4467
+ let handshakeTimer;
4468
+ if (opts.timeoutMs != null && opts.timeoutMs > 0) {
4469
+ handshakeTimer = setTimeout(() => {
4470
+ if (statusNode.get() === "connecting") {
4471
+ errorNode.down([[DATA, new Error("Worker bridge handshake timeout")]]);
4472
+ destroy();
4473
+ }
4474
+ }, opts.timeoutMs);
4475
+ }
4476
+ function destroy() {
4477
+ if (destroyed) return;
4478
+ destroyed = true;
4479
+ if (handshakeTimer !== void 0) clearTimeout(handshakeTimer);
4480
+ transport.post({
4481
+ t: "s",
4482
+ s: "*",
4483
+ sig: signalToName(TEARDOWN)
4484
+ });
4485
+ if (effectUnsub) effectUnsub();
4486
+ for (const unsub of exposeUnsubs) unsub();
4487
+ exposeUnsubs.length = 0;
4488
+ unlisten();
4489
+ statusNode.down([[DATA, "closed"]]);
4490
+ lastSent.clear();
4491
+ lastSeenImportVersions.clear();
4492
+ proxyNodes.clear();
4493
+ }
4494
+ const result = {
4495
+ meta: { status: statusNode, error: errorNode },
4496
+ destroy
4497
+ };
4498
+ for (const [name, proxy] of proxyNodes) {
4499
+ result[name] = proxy;
4500
+ }
4501
+ return result;
4502
+ }
4503
+
4504
+ // src/extra/worker/self.ts
4505
+ function isTransport2(t) {
4506
+ return typeof t === "object" && t !== null && typeof t.post === "function" && typeof t.listen === "function";
4507
+ }
4508
+ function workerSelf(target, opts) {
4509
+ const transport = isTransport2(target) ? target : createTransport(target);
4510
+ const importNames = opts.import ?? [];
4511
+ const transferFns = opts.transfer ?? {};
4512
+ const proxyNodes = /* @__PURE__ */ new Map();
4513
+ const lastSeenImportVersions = /* @__PURE__ */ new Map();
4514
+ const importedObj = {};
4515
+ for (const name of importNames) {
4516
+ const s = state(void 0, { name: `worker::${name}` });
4517
+ proxyNodes.set(name, s);
4518
+ importedObj[name] = s;
4519
+ }
4520
+ const exposedNodes = opts.expose(importedObj);
4521
+ const exposeEntries = Object.entries(exposedNodes);
4522
+ const lastSent = /* @__PURE__ */ new Map();
4523
+ let effectUnsub;
4524
+ let destroyed = false;
4525
+ if (exposeEntries.length > 0) {
4526
+ const nodes = exposeEntries.map(([, n]) => n);
4527
+ const aggregated = derived(
4528
+ nodes,
4529
+ () => {
4530
+ const updates = {};
4531
+ for (const [name, n] of exposeEntries) {
4532
+ const v = n.get();
4533
+ if (v !== lastSent.get(name)) {
4534
+ updates[name] = v;
4535
+ lastSent.set(name, v);
4536
+ }
4537
+ }
4538
+ return updates;
4539
+ },
4540
+ { equals: () => false, name: "workerSelf::aggregated" }
4541
+ );
4542
+ const effectNode = effect([aggregated], () => {
4543
+ if (destroyed) return;
4544
+ const updates = aggregated.get();
4545
+ if (Object.keys(updates).length === 0) return;
4546
+ const transferList = [];
4547
+ for (const name of Object.keys(updates)) {
4548
+ const fn = transferFns[name];
4549
+ if (fn) transferList.push(...fn(updates[name]));
4550
+ }
4551
+ let versions;
4552
+ for (const [name, n] of exposeEntries) {
4553
+ if (name in updates && n.v != null) {
4554
+ if (versions == null) versions = {};
4555
+ versions[name] = n.v.version;
4556
+ }
4557
+ }
4558
+ const msg = { t: "b", u: updates, ...versions ? { v: versions } : {} };
4559
+ try {
4560
+ transport.post(msg, transferList.length > 0 ? transferList : void 0);
4561
+ } catch (_err) {
4562
+ }
4563
+ });
4564
+ effectUnsub = effectNode.subscribe(() => {
4565
+ });
4566
+ }
4567
+ const exposeUnsubs = [];
4568
+ for (const [name, n] of exposeEntries) {
4569
+ const unsub = n.subscribe(((msgs) => {
4570
+ if (destroyed) return;
4571
+ for (const m of msgs) {
4572
+ const type = m[0];
4573
+ if (type === DATA) continue;
4574
+ if (knownMessageTypes.includes(type) && messageTier(type) < 2) continue;
4575
+ if (type === ERROR) {
4576
+ transport.post({
4577
+ t: "e",
4578
+ s: name,
4579
+ err: serializeError(m[1])
4580
+ });
4581
+ } else {
4582
+ transport.post({
4583
+ t: "s",
4584
+ s: name,
4585
+ sig: signalToName(type),
4586
+ d: m.length > 1 ? m[1] : void 0
4587
+ });
4588
+ }
4589
+ }
4590
+ }));
4591
+ exposeUnsubs.push(unsub);
4592
+ }
4593
+ const unlisten = transport.listen((data) => {
4594
+ if (destroyed) return;
4595
+ const msg = data;
4596
+ switch (msg.t) {
4597
+ // Init from main — set proxy node values
4598
+ case "i": {
4599
+ batch(() => {
4600
+ for (const [name, value] of Object.entries(msg.stores)) {
4601
+ const proxy = proxyNodes.get(name);
4602
+ if (proxy) proxy.down([[DATA, value]]);
4603
+ }
4604
+ });
4605
+ break;
4606
+ }
4607
+ // Single value update from main
4608
+ case "v": {
4609
+ const proxy = proxyNodes.get(msg.s);
4610
+ if (proxy) proxy.down([[DATA, msg.d]]);
4611
+ break;
4612
+ }
4613
+ // Batch value update from main
4614
+ case "b": {
4615
+ batch(() => {
4616
+ for (const [name, value] of Object.entries(msg.u)) {
4617
+ const incomingVersion = msg.v?.[name];
4618
+ if (incomingVersion != null) {
4619
+ const lastSeen = lastSeenImportVersions.get(name);
4620
+ if (lastSeen != null && incomingVersion <= lastSeen) continue;
4621
+ lastSeenImportVersions.set(name, incomingVersion);
4622
+ }
4623
+ const proxy = proxyNodes.get(name);
4624
+ if (proxy) proxy.down([[DATA, value]]);
4625
+ }
4626
+ });
4627
+ break;
4628
+ }
4629
+ // Error from main node
4630
+ case "e": {
4631
+ const proxy = proxyNodes.get(msg.s);
4632
+ if (proxy) proxy.down([[ERROR, deserializeError(msg.err)]]);
4633
+ break;
4634
+ }
4635
+ // Lifecycle signal from main
4636
+ case "s": {
4637
+ const sig = nameToSignal(msg.sig);
4638
+ if (!sig) break;
4639
+ if (sig === TEARDOWN && msg.s === "*") {
4640
+ destroy();
4641
+ return;
4642
+ }
4643
+ const targets = msg.s === "*" ? [...proxyNodes.values()] : proxyNodes.has(msg.s) ? [proxyNodes.get(msg.s)] : [];
4644
+ for (const proxy of targets) {
4645
+ proxy.down(msg.d === void 0 ? [[sig]] : [[sig, msg.d]]);
4646
+ }
4647
+ break;
4648
+ }
4649
+ }
4650
+ });
4651
+ const readyValues = {};
4652
+ for (const [name, n] of exposeEntries) {
4653
+ readyValues[name] = n.get();
4654
+ lastSent.set(name, readyValues[name]);
4655
+ }
4656
+ transport.post({ t: "r", stores: readyValues });
4657
+ function destroy() {
4658
+ if (destroyed) return;
4659
+ destroyed = true;
4660
+ if (effectUnsub) effectUnsub();
4661
+ for (const unsub of exposeUnsubs) unsub();
4662
+ exposeUnsubs.length = 0;
4663
+ unlisten();
4664
+ transport.terminate?.();
4665
+ lastSent.clear();
4666
+ lastSeenImportVersions.clear();
4667
+ proxyNodes.clear();
4668
+ }
4669
+ return { destroy };
4670
+ }
4671
+
4672
+ export {
4673
+ NS_PER_MS,
4674
+ NS_PER_SEC,
4675
+ constant,
4676
+ linear,
4677
+ exponential,
4678
+ fibonacci,
4679
+ decorrelatedJitter,
4680
+ withMaxAttempts,
4681
+ resolveBackoffPreset,
4682
+ retry,
4683
+ CircuitOpenError,
4684
+ circuitBreaker,
4685
+ withBreaker,
4686
+ tokenBucket,
4687
+ tokenTracker,
4688
+ rateLimiter,
4689
+ withStatus,
4690
+ fromWebSocket,
4691
+ fromWebhook,
4692
+ fromHTTP,
4693
+ toSSE,
4694
+ toWebSocket,
4695
+ fromMCP,
4696
+ fromGitHook,
4697
+ fromOTel,
4698
+ fromSyslog,
4699
+ parseSyslog,
4700
+ fromStatsD,
4701
+ parseStatsD,
4702
+ fromPrometheus,
4703
+ parsePrometheusText,
4704
+ fromKafka,
4705
+ toKafka,
4706
+ fromRedisStream,
4707
+ toRedisStream,
4708
+ fromCSV,
4709
+ fromNDJSON,
4710
+ fromClickHouseWatch,
4711
+ MemoryCheckpointAdapter,
4712
+ DictCheckpointAdapter,
4713
+ FileCheckpointAdapter,
4714
+ SqliteCheckpointAdapter,
4715
+ saveGraphCheckpoint,
4716
+ restoreGraphCheckpoint,
4717
+ checkpointNodeValue,
4718
+ fromIDBRequest,
4719
+ fromIDBTransaction,
4720
+ saveGraphCheckpointIndexedDb,
4721
+ restoreGraphCheckpointIndexedDb,
4722
+ map,
4723
+ filter,
4724
+ scan,
4725
+ reduce,
4726
+ take,
4727
+ skip,
4728
+ takeWhile,
4729
+ takeUntil,
4730
+ first,
4731
+ last,
4732
+ find,
4733
+ elementAt,
4734
+ startWith,
4735
+ tap,
4736
+ distinctUntilChanged,
4737
+ pairwise,
4738
+ combine,
4739
+ withLatestFrom,
4740
+ merge,
4741
+ zip,
4742
+ concat,
4743
+ race,
4744
+ switchMap,
4745
+ exhaustMap,
4746
+ concatMap,
4747
+ mergeMap,
4748
+ flatMap,
4749
+ delay,
4750
+ debounce,
4751
+ throttle,
4752
+ sample,
4753
+ audit,
4754
+ timeout,
4755
+ buffer,
4756
+ bufferCount,
4757
+ windowCount,
4758
+ bufferTime,
4759
+ windowTime,
4760
+ window,
4761
+ interval,
4762
+ repeat,
4763
+ pausable,
4764
+ rescue,
4765
+ gate,
4766
+ combineLatest,
4767
+ debounceTime,
4768
+ throttleTime,
4769
+ catchError,
4770
+ reactiveMap,
4771
+ verifiable,
4772
+ distill,
4773
+ pubsub,
4774
+ reactiveIndex,
4775
+ reactiveList,
4776
+ signalToName,
4777
+ nameToSignal,
4778
+ serializeError,
4779
+ deserializeError,
4780
+ createTransport,
4781
+ workerBridge,
4782
+ workerSelf,
4783
+ extra_exports
4784
+ };
4785
+ //# sourceMappingURL=chunk-VPS7L64N.js.map