@graphrefly/graphrefly 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-VPS7L64N.js → chunk-ZERWUCGK.js} +824 -1
- package/dist/chunk-ZERWUCGK.js.map +1 -0
- package/dist/compat/nestjs/index.js +1 -1
- package/dist/extra/index.cjs +823 -0
- package/dist/extra/index.cjs.map +1 -1
- package/dist/extra/index.d.cts +1 -1
- package/dist/extra/index.d.ts +1 -1
- package/dist/extra/index.js +33 -1
- package/dist/{index-BHUvlQ3v.d.ts → index-C3LRU4jB.d.ts} +625 -4
- package/dist/{index-B6SsZs2h.d.cts → index-Cz8og7-L.d.cts} +625 -4
- package/dist/index.cjs +839 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +41 -9
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
- package/dist/chunk-VPS7L64N.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/extra/index.ts","../src/extra/backoff.ts","../src/extra/resilience.ts","../src/extra/adapters.ts","../src/extra/checkpoint.ts","../src/extra/operators.ts","../src/extra/reactive-map.ts","../src/extra/composite.ts","../src/extra/pubsub.ts","../src/extra/reactive-index.ts","../src/extra/reactive-list.ts","../src/extra/worker/protocol.ts","../src/extra/worker/transport.ts","../src/extra/worker/bridge.ts","../src/extra/worker/self.ts"],"sourcesContent":["/**\n * Extra layer: operators, sources, sinks (Phase 2+).\n */\n\nexport * from \"./adapters.js\";\nexport * from \"./backoff.js\";\nexport * from \"./backpressure.js\";\nexport * from \"./checkpoint.js\";\nexport * from \"./composite.js\";\nexport * from \"./cron.js\";\nexport * from \"./observable.js\";\nexport * from \"./operators.js\";\nexport * from \"./pubsub.js\";\nexport * from \"./reactive-index.js\";\nexport * from \"./reactive-list.js\";\nexport * from \"./reactive-log.js\";\nexport * from \"./reactive-map.js\";\nexport * from \"./resilience.js\";\nexport * from \"./sources.js\";\nexport * from \"./worker/index.js\";\n","/**\n * Backoff strategies for {@link retry} (roadmap §3.1). Delays are in **nanoseconds**.\n *\n * Convention: all graphrefly-ts timestamps and durations use nanoseconds (`_ns` suffix).\n * 1 second = 1_000_000_000 ns, 1 ms = 1_000_000 ns.\n */\n\nexport const NS_PER_MS = 1_000_000;\nexport const NS_PER_SEC = 1_000_000_000;\n\nexport type JitterMode = \"none\" | \"full\" | \"equal\";\n\nexport type BackoffPreset =\n\t| \"constant\"\n\t| \"linear\"\n\t| \"exponential\"\n\t| \"fibonacci\"\n\t| \"decorrelatedJitter\";\n\n/** `(attempt, error?, previousDelayNs?) => delayNs | null` — `null` means zero delay. */\nexport type BackoffStrategy = (\n\tattempt: number,\n\terror?: unknown,\n\tprevDelayNs?: number | null,\n) => number | null;\n\nfunction clampNonNegative(value: number): number {\n\treturn value < 0 ? 0 : value;\n}\n\nfunction applyJitter(delay: number, jitter: JitterMode): number {\n\tif (jitter === \"none\") return delay;\n\tif (jitter === \"full\") return Math.random() * delay;\n\treturn delay / 2 + Math.random() * (delay / 2);\n}\n\nfunction randomBetween(min: number, max: number): number {\n\treturn min + Math.random() * (max - min);\n}\n\n/**\n * Builds a strategy that always returns the same delay in nanoseconds.\n *\n * @param delayNs - Non-negative delay in nanoseconds; values below zero are clamped to zero.\n * @returns `BackoffStrategy` for use with {@link retry} or custom timers.\n *\n * @example\n * ```ts\n * import { constant, retry, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const out = retry(source, { count: 3, backoff: constant(0.25 * NS_PER_SEC) });\n * ```\n *\n * @category extra\n */\nexport function constant(delayNs: number): BackoffStrategy {\n\tconst safe = clampNonNegative(delayNs);\n\treturn () => safe;\n}\n\n/**\n * Builds linear backoff: `baseNs + stepNs * attempt` (`stepNs` defaults to `baseNs`).\n *\n * @param baseNs - Base delay in nanoseconds (clamped non-negative).\n * @param stepNs - Added per retry attempt in nanoseconds (clamped non-negative).\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @example\n * ```ts\n * import { linear, retry, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * // Attempt 0 → 1 s, attempt 1 → 2 s, attempt 2 → 3 s …\n * const out = retry(source, { count: 4, backoff: linear(NS_PER_SEC) });\n * ```\n *\n * @category extra\n */\nexport function linear(baseNs: number, stepNs?: number): BackoffStrategy {\n\tconst safeBase = clampNonNegative(baseNs);\n\tconst safeStep = stepNs === undefined ? safeBase : clampNonNegative(stepNs);\n\treturn (attempt: number) => safeBase + safeStep * Math.max(0, attempt);\n}\n\nexport type ExponentialBackoffOptions = {\n\tbaseNs?: number;\n\tfactor?: number;\n\tmaxDelayNs?: number;\n\tjitter?: JitterMode;\n};\n\n/**\n * Builds exponential backoff in nanoseconds, capped by `maxDelayNs`, with optional jitter.\n *\n * @param options - Base, factor, cap, and jitter mode.\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @remarks\n * **Jitter:** `\"full\"` spreads delay across `[0, delay]`; `\"equal\"` uses `[delay/2, delay]`.\n *\n * @example\n * ```ts\n * import { exponential, retry, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * // 100 ms → 200 ms → 400 ms … capped at 30 s, with full jitter\n * const out = retry(source, {\n * count: 5,\n * backoff: exponential({ baseNs: 100 * NS_PER_SEC / 1000, jitter: \"full\" }),\n * });\n * ```\n *\n * @category extra\n */\nexport function exponential(options?: ExponentialBackoffOptions): BackoffStrategy {\n\tconst baseNs = clampNonNegative(options?.baseNs ?? 100 * NS_PER_MS);\n\tconst factor = options?.factor !== undefined && options.factor < 1 ? 1 : (options?.factor ?? 2);\n\tconst maxDelayNs = clampNonNegative(options?.maxDelayNs ?? 30 * NS_PER_SEC);\n\tconst jitter = options?.jitter ?? \"none\";\n\n\treturn (attempt: number) => {\n\t\tlet delay: number;\n\t\tif (baseNs === 0) {\n\t\t\tdelay = 0;\n\t\t} else if (factor === 1) {\n\t\t\tdelay = baseNs;\n\t\t} else {\n\t\t\tconst capRatio = maxDelayNs / baseNs;\n\t\t\tlet growth = 1;\n\t\t\tfor (let i = 0; i < Math.max(0, attempt); i++) {\n\t\t\t\tif (growth >= capRatio) {\n\t\t\t\t\tgrowth = capRatio;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tgrowth *= factor;\n\t\t\t}\n\t\t\tdelay = baseNs * growth;\n\t\t\tif (delay > maxDelayNs) delay = maxDelayNs;\n\t\t}\n\t\treturn applyJitter(delay, jitter);\n\t};\n}\n\n/**\n * Builds Fibonacci-scaled delays: `1, 2, 3, 5, … × baseNs`, capped at `maxDelayNs`.\n *\n * @param baseNs - Multiplier applied to the Fibonacci unit (default `100ms` in nanoseconds).\n * @param maxDelayNs - Upper bound in nanoseconds (default `30s`).\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @example\n * ```ts\n * import { fibonacci, retry, NS_PER_MS } from \"@graphrefly/graphrefly-ts\";\n *\n * // Delays: 100 ms, 200 ms, 300 ms, 500 ms, 800 ms … (× 100 ms base)\n * const out = retry(source, { count: 5, backoff: fibonacci(100 * NS_PER_MS) });\n * ```\n *\n * @category extra\n */\nexport function fibonacci(baseNs = 100 * NS_PER_MS, maxDelayNs = 30 * NS_PER_SEC): BackoffStrategy {\n\tconst safeBase = clampNonNegative(baseNs);\n\tconst safeMax = clampNonNegative(maxDelayNs);\n\n\tfunction fibUnit(attempt: number): number {\n\t\tif (attempt <= 0) return 1;\n\t\tlet prev = 1;\n\t\tlet cur = 2;\n\t\tfor (let i = 1; i < attempt; i++) {\n\t\t\tconst next = prev + cur;\n\t\t\tprev = cur;\n\t\t\tcur = next;\n\t\t}\n\t\treturn cur;\n\t}\n\n\treturn (attempt: number) => {\n\t\tconst raw = fibUnit(attempt) * safeBase;\n\t\treturn raw <= safeMax ? raw : safeMax;\n\t};\n}\n\n/**\n * Decorrelated jitter (AWS-recommended): `random(baseNs, min(maxNs, lastDelay * 3))`.\n *\n * Stateless — uses `prevDelayNs` (passed by the consumer) instead of closure state.\n * Safe to share across concurrent retry sequences.\n *\n * @param baseNs - Floor of the random range (default `100ms` in nanoseconds).\n * @param maxNs - Ceiling cap (default `30s` in nanoseconds).\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @example\n * ```ts\n * import { decorrelatedJitter, retry, NS_PER_MS, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const out = retry(source, {\n * count: 6,\n * backoff: decorrelatedJitter(100 * NS_PER_MS, 10 * NS_PER_SEC),\n * });\n * ```\n *\n * @category extra\n */\nexport function decorrelatedJitter(\n\tbaseNs = 100 * NS_PER_MS,\n\tmaxNs = 30 * NS_PER_SEC,\n): BackoffStrategy {\n\treturn (_attempt, _error, prevDelayNs) => {\n\t\tconst last = prevDelayNs ?? baseNs;\n\t\tconst ceiling = Math.min(maxNs, last * 3);\n\t\treturn randomBetween(baseNs, ceiling);\n\t};\n}\n\n/**\n * Decorator that caps any strategy at `maxAttempts`. Returns `null` (stop retrying) after the cap.\n *\n * @param strategy - Inner strategy to wrap.\n * @param maxAttempts - Maximum number of attempts (inclusive).\n * @returns Wrapped `BackoffStrategy`.\n *\n * @example\n * ```ts\n * import { withMaxAttempts, exponential } from \"@graphrefly/graphrefly-ts\";\n *\n * const capped = withMaxAttempts(exponential(), 3);\n * capped(3); // null — no more retries beyond attempt 3\n * ```\n *\n * @category extra\n */\nexport function withMaxAttempts(strategy: BackoffStrategy, maxAttempts: number): BackoffStrategy {\n\treturn (attempt, error, prevDelayNs) => {\n\t\tif (attempt >= maxAttempts) return null;\n\t\treturn strategy(attempt, error, prevDelayNs);\n\t};\n}\n\n/**\n * Maps a preset name to a concrete {@link BackoffStrategy} with library-default parameters.\n *\n * @param name - One of `constant`, `linear`, `exponential`, `fibonacci`, or `decorrelatedJitter`.\n * @returns Configured strategy with default parameters.\n * @throws Error when `name` is not a known preset.\n *\n * @example\n * ```ts\n * import { resolveBackoffPreset, retry } from \"@graphrefly/graphrefly-ts\";\n *\n * const out = retry(source, { count: 3, backoff: resolveBackoffPreset(\"exponential\") });\n * // Equivalent to retry(source, { count: 3, backoff: exponential() })\n * ```\n *\n * @category extra\n */\nexport function resolveBackoffPreset(name: BackoffPreset): BackoffStrategy {\n\tif (name === \"constant\") return constant(1 * NS_PER_SEC);\n\tif (name === \"linear\") return linear(1 * NS_PER_SEC);\n\tif (name === \"exponential\") return exponential();\n\tif (name === \"fibonacci\") return fibonacci();\n\tif (name === \"decorrelatedJitter\") return decorrelatedJitter();\n\tthrow new Error(\n\t\t`Unknown backoff preset: \"${String(name)}\". Use one of: constant, linear, exponential, fibonacci, decorrelatedJitter`,\n\t);\n}\n","/**\n * Resilience utilities — roadmap §3.1 (retry, breaker, rate limit, status companions).\n */\nimport { batch } from \"../core/batch.js\";\nimport { monotonicNs } from \"../core/clock.js\";\nimport { COMPLETE, DATA, DIRTY, ERROR, type Message, RESOLVED } from \"../core/messages.js\";\nimport { type Node, type NodeOptions, node } from \"../core/node.js\";\nimport { producer } from \"../core/sugar.js\";\nimport {\n\ttype BackoffPreset,\n\ttype BackoffStrategy,\n\tNS_PER_MS,\n\tNS_PER_SEC,\n\tresolveBackoffPreset,\n} from \"./backoff.js\";\n\ntype ExtraOpts = Omit<NodeOptions, \"describeKind\">;\n\nfunction operatorOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"operator\", ...opts };\n}\n\nfunction clampNonNegative(value: number): number {\n\treturn value < 0 ? 0 : value;\n}\n\nfunction msgVal(m: Message): unknown {\n\treturn m[1];\n}\n\nfunction coerceDelayNs(raw: number | null): number {\n\tif (raw === null) return 0;\n\tif (typeof raw !== \"number\" || !Number.isFinite(raw)) {\n\t\tthrow new TypeError(\"backoff strategy must return a finite number or null\");\n\t}\n\treturn raw < 0 ? 0 : raw;\n}\n\nexport type RetryOptions = {\n\t/** Max retry attempts after each terminal `ERROR` (not counting the first failure). */\n\tcount?: number;\n\t/** Delay between attempts; strategies use **nanoseconds**. */\n\tbackoff?: BackoffStrategy | BackoffPreset;\n};\n\n/**\n * Resubscribes to the upstream node after each terminal `ERROR`, after an optional delay.\n *\n * @param source - Upstream node (should use `resubscribable: true`).\n * @param opts - `count` caps attempts; `backoff` supplies delay in **nanoseconds** (or a preset name).\n * @returns Node that retries on error.\n *\n * @remarks\n * **Resubscribable sources:** The upstream should use `resubscribable: true` if it must emit again after `ERROR`.\n * **Protocol:** Forwards unknown message tuples unchanged; handles `DIRTY`, `DATA`, `RESOLVED`, `COMPLETE`, `ERROR`.\n *\n * @example\n * ```ts\n * import { ERROR, NS_PER_SEC, pipe, producer, retry, constant } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = producer(\n * (_d, a) => {\n * a.down([[ERROR, new Error(\"x\")]]);\n * },\n * { resubscribable: true },\n * );\n * const out = retry(src, { count: 2, backoff: constant(0.25 * NS_PER_SEC) });\n * ```\n *\n * @category extra\n */\nexport function retry<T>(source: Node<T>, opts?: RetryOptions): Node<T> {\n\tconst count = opts?.count;\n\tconst backoffOpt = opts?.backoff;\n\tconst maxRetries = count !== undefined ? count : backoffOpt === undefined ? 0 : 0x7fffffff;\n\tif (maxRetries < 0) throw new RangeError(\"retry count must be >= 0\");\n\n\tconst strategy: BackoffStrategy | null =\n\t\tbackoffOpt === undefined\n\t\t\t? null\n\t\t\t: typeof backoffOpt === \"string\"\n\t\t\t\t? resolveBackoffPreset(backoffOpt)\n\t\t\t\t: backoffOpt;\n\n\treturn producer<T>(\n\t\t(_d, a) => {\n\t\t\tlet attempt = 0;\n\t\t\tlet stopped = false;\n\t\t\tlet prevDelay: number | null = null;\n\t\t\tlet unsub: (() => void) | undefined;\n\t\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\t\tlet timerGen = 0;\n\n\t\t\tfunction cancelTimer(): void {\n\t\t\t\tif (timer !== undefined) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction disconnectUpstream(): void {\n\t\t\t\tunsub?.();\n\t\t\t\tunsub = undefined;\n\t\t\t}\n\n\t\t\tfunction scheduleRetryOrFinish(err: unknown): void {\n\t\t\t\tif (stopped) return;\n\t\t\t\tif (attempt >= maxRetries) {\n\t\t\t\t\tdisconnectUpstream();\n\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst raw = strategy === null ? 0 : strategy(attempt, err, prevDelay);\n\t\t\t\tconst delayNs = coerceDelayNs(raw === undefined ? null : raw);\n\t\t\t\tprevDelay = delayNs;\n\t\t\t\tattempt += 1;\n\t\t\t\ttimerGen += 1;\n\t\t\t\tconst gen = timerGen;\n\t\t\t\tdisconnectUpstream();\n\t\t\t\tconst delayMs = delayNs > 0 ? delayNs / NS_PER_MS : 1;\n\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t\tif (stopped || gen !== timerGen) return;\n\t\t\t\t\tconnect();\n\t\t\t\t}, delayMs);\n\t\t\t}\n\n\t\t\tfunction connect(): void {\n\t\t\t\tcancelTimer();\n\t\t\t\tdisconnectUpstream();\n\t\t\t\tunsub = source.subscribe((msgs) => {\n\t\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\t\tconst t = m[0];\n\t\t\t\t\t\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\t\tattempt = 0;\n\t\t\t\t\t\t\tprevDelay = null;\n\t\t\t\t\t\t\ta.emit(m[1] as T);\n\t\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\t\tdisconnectUpstream();\n\t\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\t\tscheduleRetryOrFinish(msgVal(m));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t} else a.down([m]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconnect();\n\n\t\t\treturn () => {\n\t\t\t\tstopped = true;\n\t\t\t\ttimerGen += 1;\n\t\t\t\tcancelTimer();\n\t\t\t\tdisconnectUpstream();\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(),\n\t\t\tinitial: source.get(),\n\t\t},\n\t);\n}\n\nexport type CircuitState = \"closed\" | \"open\" | \"half-open\";\n\n/**\n * Thrown when {@link withBreaker} is configured with `onOpen: \"error\"` and the breaker rejects work.\n *\n * @category extra\n */\nexport class CircuitOpenError extends Error {\n\toverride name = \"CircuitOpenError\";\n\tconstructor() {\n\t\tsuper(\"Circuit breaker is open\");\n\t}\n}\n\nexport interface CircuitBreakerOptions {\n\t/** Number of consecutive failures before opening. Default: 5. */\n\tfailureThreshold?: number;\n\t/** Base cooldown in nanoseconds before transitioning to half-open. Default: 30s. */\n\tcooldownNs?: number;\n\t/** Backoff strategy for cooldown escalation across consecutive open cycles. Overrides `cooldownNs` when provided. */\n\tcooldown?: BackoffStrategy;\n\t/** Max trial requests allowed in half-open state. Default: 1. */\n\thalfOpenMax?: number;\n\t/** Clock function returning nanoseconds (for testability). Default: `monotonicNs`. */\n\tnow?: () => number;\n}\n\nexport interface CircuitBreaker {\n\t/** Whether a request should be allowed through. Triggers open→half-open transition when cooldown expires. */\n\tcanExecute(): boolean;\n\t/** Record a successful execution. Resets to closed. */\n\trecordSuccess(): void;\n\t/** Record a failed execution. May transition to open. */\n\trecordFailure(error?: unknown): void;\n\t/** Current circuit state (read-only, does not trigger transitions). */\n\treadonly state: CircuitState;\n\t/** Number of consecutive failures in the current closed period. */\n\treadonly failureCount: number;\n\t/** Manually reset to closed state, clearing all counters. */\n\treset(): void;\n}\n\n/**\n * Factory for a synchronous circuit breaker with `closed`, `open`, and `half-open` states.\n *\n * Supports escalating cooldown via an optional {@link BackoffStrategy} — each consecutive\n * open→half-open→open cycle increments the backoff attempt.\n *\n * @param options - Threshold, cooldown, half-open limit, and optional clock override.\n * @returns {@link CircuitBreaker} instance.\n *\n * @remarks\n * **Timing:** Uses `monotonicNs()` by default (nanoseconds). Override `now` for tests.\n *\n * @example\n * ```ts\n * import { circuitBreaker, exponential, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const b = circuitBreaker({\n * failureThreshold: 3,\n * cooldown: exponential({ baseNs: 1 * NS_PER_SEC }),\n * });\n * ```\n *\n * @category extra\n */\nexport function circuitBreaker(options?: CircuitBreakerOptions): CircuitBreaker {\n\tconst threshold = Math.max(1, options?.failureThreshold ?? 5);\n\tconst baseCooldownNs = clampNonNegative(options?.cooldownNs ?? 30 * NS_PER_SEC);\n\tconst cooldownStrategy = options?.cooldown ?? null;\n\tconst halfOpenMax = Math.max(1, options?.halfOpenMax ?? 1);\n\tconst now = options?.now ?? monotonicNs;\n\n\tlet _state: CircuitState = \"closed\";\n\tlet _failureCount = 0;\n\tlet _openCycle = 0;\n\tlet _lastOpenedAt = 0;\n\tlet _lastCooldownNs = baseCooldownNs;\n\tlet _halfOpenAttempts = 0;\n\n\tfunction getCooldownNs(): number {\n\t\tif (!cooldownStrategy) return baseCooldownNs;\n\t\tconst delayNs = cooldownStrategy(_openCycle);\n\t\treturn delayNs !== null ? delayNs : baseCooldownNs;\n\t}\n\n\tfunction transitionToOpen(): void {\n\t\t_state = \"open\";\n\t\t_lastCooldownNs = getCooldownNs();\n\t\t_lastOpenedAt = now();\n\t\t_halfOpenAttempts = 0;\n\t}\n\n\tconst breaker: CircuitBreaker = {\n\t\tcanExecute(): boolean {\n\t\t\tif (_state === \"closed\") return true;\n\n\t\t\tif (_state === \"open\") {\n\t\t\t\tconst elapsed = now() - _lastOpenedAt;\n\t\t\t\tif (elapsed >= _lastCooldownNs) {\n\t\t\t\t\t_state = \"half-open\";\n\t\t\t\t\t_halfOpenAttempts = 1;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (_halfOpenAttempts < halfOpenMax) {\n\t\t\t\t_halfOpenAttempts++;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\trecordSuccess(): void {\n\t\t\tif (_state === \"half-open\") {\n\t\t\t\t_state = \"closed\";\n\t\t\t\t_failureCount = 0;\n\t\t\t\t_openCycle = 0;\n\t\t\t} else if (_state === \"closed\") {\n\t\t\t\t_failureCount = 0;\n\t\t\t}\n\t\t},\n\n\t\trecordFailure(_error?: unknown): void {\n\t\t\tif (_state === \"half-open\") {\n\t\t\t\t_openCycle++;\n\t\t\t\ttransitionToOpen();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (_state === \"closed\") {\n\t\t\t\t_failureCount++;\n\t\t\t\tif (_failureCount >= threshold) {\n\t\t\t\t\ttransitionToOpen();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tget state(): CircuitState {\n\t\t\treturn _state;\n\t\t},\n\n\t\tget failureCount(): number {\n\t\t\treturn _failureCount;\n\t\t},\n\n\t\treset(): void {\n\t\t\t_state = \"closed\";\n\t\t\t_failureCount = 0;\n\t\t\t_openCycle = 0;\n\t\t\t_halfOpenAttempts = 0;\n\t\t},\n\t};\n\n\treturn breaker;\n}\n\nexport type WithBreakerBundle<T> = {\n\tnode: Node<T>;\n\tbreakerState: Node<CircuitState>;\n};\n\n/**\n * Returns a unary wrapper that gates upstream `DATA` through a {@link CircuitBreaker}.\n *\n * @param breaker - Shared breaker instance (typically one per resource).\n * @param options - `onOpen: \"skip\"` emits `RESOLVED` when open; `\"error\"` emits {@link CircuitOpenError}.\n * @returns Function mapping `Node<T>` to `{ node, breakerState }` companion nodes.\n *\n * @remarks\n * **Success path:** `COMPLETE` calls {@link CircuitBreaker.recordSuccess}. **Failure path:** upstream `ERROR` calls {@link CircuitBreaker.recordFailure} and is forwarded.\n *\n * @example\n * ```ts\n * import { state, withBreaker, circuitBreaker } from \"@graphrefly/graphrefly-ts\";\n *\n * const b = circuitBreaker({ failureThreshold: 2 });\n * const s = state(1);\n * const { node, breakerState } = withBreaker(b)(s);\n * ```\n *\n * @category extra\n */\nexport function withBreaker<T>(\n\tbreaker: CircuitBreaker,\n\toptions?: { onOpen?: \"skip\" | \"error\" },\n): (source: Node<T>) => WithBreakerBundle<T> {\n\tconst onOpen = options?.onOpen ?? \"skip\";\n\n\treturn (source: Node<T>): WithBreakerBundle<T> => {\n\t\tconst wrapped = node<T>(\n\t\t\t[],\n\t\t\t(_deps, a) => {\n\t\t\t\tfunction syncState(): void {\n\t\t\t\t\twrapped.meta.breakerState.down([[DATA, breaker.state]]);\n\t\t\t\t}\n\n\t\t\t\tconst unsub = source.subscribe((msgs) => {\n\t\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\t\tconst t = m[0];\n\t\t\t\t\t\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\t\tif (breaker.canExecute()) {\n\t\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\t\ta.emit(m[1] as T);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\t\tif (onOpen === \"error\") a.down([[ERROR, new CircuitOpenError()]]);\n\t\t\t\t\t\t\t\telse a.down([[RESOLVED]]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\t\tbreaker.recordSuccess();\n\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\t\tbreaker.recordFailure(msgVal(m));\n\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\ta.down([m]);\n\t\t\t\t\t\t} else a.down([m]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tsyncState();\n\t\t\t\treturn unsub;\n\t\t\t},\n\t\t\t{\n\t\t\t\t...operatorOpts(),\n\t\t\t\tmeta: { breakerState: breaker.state },\n\t\t\t\tcompleteWhenDepsComplete: false,\n\t\t\t\tinitial: source.get(),\n\t\t\t},\n\t\t);\n\n\t\treturn { node: wrapped, breakerState: wrapped.meta.breakerState as Node<CircuitState> };\n\t};\n}\n\nexport interface TokenBucket {\n\t/** Number of tokens currently available (after refill). */\n\tavailable(): number;\n\t/** Try to consume `cost` tokens. Returns `true` if successful. */\n\ttryConsume(cost?: number): boolean;\n}\n\n/**\n * Token-bucket meter (capacity + refill rate per second). Use with {@link rateLimiter} or custom gates.\n *\n * @param capacity - Maximum tokens (must be positive).\n * @param refillPerSecond - Tokens added per elapsed second (non-negative).\n * @returns {@link TokenBucket} instance.\n *\n * @example\n * ```ts\n * import { tokenBucket } from \"@graphrefly/graphrefly-ts\";\n *\n * const bucket = tokenBucket(10, 2); // capacity 10, refill 2 tokens/sec\n * bucket.tryConsume(3); // true — 7 tokens remaining\n * bucket.available(); // ~7 (plus any elapsed refill)\n * ```\n *\n * @category extra\n */\nexport function tokenBucket(capacity: number, refillPerSecond: number): TokenBucket {\n\tif (capacity <= 0) throw new RangeError(\"capacity must be > 0\");\n\tif (refillPerSecond < 0) throw new RangeError(\"refillPerSecond must be >= 0\");\n\n\tlet tokens = capacity;\n\tlet updatedAt = monotonicNs();\n\n\tfunction refill(now: number): void {\n\t\tif (refillPerSecond > 0) {\n\t\t\tconst elapsedNs = now - updatedAt;\n\t\t\ttokens = Math.min(capacity, tokens + (elapsedNs / NS_PER_SEC) * refillPerSecond);\n\t\t}\n\t\tupdatedAt = now;\n\t}\n\n\treturn {\n\t\tavailable(): number {\n\t\t\trefill(monotonicNs());\n\t\t\treturn tokens;\n\t\t},\n\t\ttryConsume(cost = 1): boolean {\n\t\t\tif (cost <= 0) return true;\n\t\t\tconst now = monotonicNs();\n\t\t\trefill(now);\n\t\t\tif (tokens >= cost) {\n\t\t\t\ttokens -= cost;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t};\n}\n\n/**\n * Same behavior as {@link tokenBucket}. Exposed for naming parity with graphrefly-py (`token_tracker`).\n *\n * @param capacity - Maximum tokens (must be positive).\n * @param refillPerSecond - Tokens added per elapsed second (non-negative).\n * @returns A {@link TokenBucket} instance.\n *\n * @example\n * ```ts\n * import { tokenTracker } from \"@graphrefly/graphrefly-ts\";\n *\n * const tracker = tokenTracker(100, 10); // 100-token capacity, 10/sec refill\n * tracker.tryConsume(5); // true\n * ```\n *\n * @category extra\n */\nexport function tokenTracker(capacity: number, refillPerSecond: number): TokenBucket {\n\treturn tokenBucket(capacity, refillPerSecond);\n}\n\n/**\n * Enforces a sliding window: at most `maxEvents` `DATA` values per `windowNs`.\n *\n * @param source - Upstream node.\n * @param maxEvents - Maximum `DATA` emissions per window (must be positive).\n * @param windowNs - Window length in nanoseconds (must be positive).\n * @returns Node that queues excess values FIFO until a slot frees.\n *\n * @remarks\n * **Terminal:** `COMPLETE` / `ERROR` cancel timers, drop pending queue, and clear window state.\n *\n * @example\n * ```ts\n * import { rateLimiter, state, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state(0);\n * // Allow at most 5 DATA values per second\n * const limited = rateLimiter(src, 5, NS_PER_SEC);\n * limited.subscribe((msgs) => console.log(msgs));\n * ```\n *\n * @category extra\n */\nexport function rateLimiter<T>(source: Node<T>, maxEvents: number, windowNs: number): Node<T> {\n\tif (maxEvents <= 0) throw new RangeError(\"maxEvents must be > 0\");\n\tif (windowNs <= 0) throw new RangeError(\"windowNs must be > 0\");\n\treturn producer<T>(\n\t\t(_d, a) => {\n\t\t\tconst times: number[] = [];\n\t\t\tconst pending: T[] = [];\n\t\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\t\tlet timerGen = 0;\n\n\t\t\tfunction cancelTimer(): void {\n\t\t\t\tif (timer !== undefined) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction prune(now: number): void {\n\t\t\t\tconst boundary = now - windowNs;\n\t\t\t\twhile (times.length > 0 && times[0] <= boundary) times.shift();\n\t\t\t}\n\n\t\t\tfunction tryEmit(): void {\n\t\t\t\twhile (pending.length > 0) {\n\t\t\t\t\tconst now = monotonicNs();\n\t\t\t\t\tprune(now);\n\t\t\t\t\tif (times.length < maxEvents) {\n\t\t\t\t\t\ttimes.push(now);\n\t\t\t\t\t\ta.emit(pending.shift() as T);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst oldest = times[0];\n\t\t\t\t\t\tcancelTimer();\n\t\t\t\t\t\ttimerGen += 1;\n\t\t\t\t\t\tconst gen = timerGen;\n\t\t\t\t\t\tconst delayNs = Math.max(0, oldest + windowNs - monotonicNs());\n\t\t\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\t\t\ttimer = undefined;\n\t\t\t\t\t\t\tif (gen !== timerGen) return;\n\t\t\t\t\t\t\ttryEmit();\n\t\t\t\t\t\t}, delayNs / NS_PER_MS);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst unsub = source.subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tconst t = m[0];\n\t\t\t\t\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\tpending.push(m[1] as T);\n\t\t\t\t\t\ttryEmit();\n\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\ttimerGen += 1;\n\t\t\t\t\t\tcancelTimer();\n\t\t\t\t\t\tpending.length = 0;\n\t\t\t\t\t\ttimes.length = 0;\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\ttimerGen += 1;\n\t\t\t\t\t\tcancelTimer();\n\t\t\t\t\t\tpending.length = 0;\n\t\t\t\t\t\ttimes.length = 0;\n\t\t\t\t\t\ta.down([m]);\n\t\t\t\t\t} else a.down([m]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn () => {\n\t\t\t\ttimerGen += 1;\n\t\t\t\tcancelTimer();\n\t\t\t\tunsub();\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(),\n\t\t\tinitial: source.get(),\n\t\t},\n\t);\n}\n\nexport type StatusValue = \"pending\" | \"active\" | \"completed\" | \"errored\";\n\nexport type WithStatusBundle<T> = {\n\tnode: Node<T>;\n\tstatus: Node<StatusValue>;\n\terror: Node<unknown | null>;\n};\n\n/**\n * Wraps `src` with `status` and `error` {@link state} companions for UI or meta snapshots.\n *\n * @param src - Upstream node to mirror.\n * @param options - `initialStatus` defaults to `\"pending\"`.\n * @returns `{ node, status, error }` where `error` holds the last `ERROR` payload.\n *\n * @remarks\n * **Recovery:** After `errored`, the next `DATA` clears `error` and sets `active` inside {@link batch} (matches graphrefly-py).\n *\n * @example\n * ```ts\n * import { withStatus, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state<number>(0);\n * const { node, status, error } = withStatus(src);\n *\n * status.subscribe((msgs) => console.log(\"status:\", msgs));\n * src.down([[DATA, 42]]); // status → \"active\"\n * ```\n *\n * @category extra\n */\nexport function withStatus<T>(\n\tsrc: Node<T>,\n\toptions?: { initialStatus?: StatusValue },\n): WithStatusBundle<T> {\n\tconst initialStatus = options?.initialStatus ?? \"pending\";\n\n\tconst out = node<T>(\n\t\t[],\n\t\t(_deps, a) => {\n\t\t\tout.meta.status.down([[DATA, initialStatus]]);\n\t\t\tout.meta.error.down([[DATA, null]]);\n\n\t\t\tconst unsub = src.subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tconst t = m[0];\n\t\t\t\t\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\tif (out.meta.status.get() === \"errored\") {\n\t\t\t\t\t\t\tbatch(() => {\n\t\t\t\t\t\t\t\tout.meta.error.down([[DATA, null]]);\n\t\t\t\t\t\t\t\tout.meta.status.down([[DATA, \"active\"]]);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tout.meta.status.down([[DATA, \"active\"]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit(m[1] as T);\n\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\tout.meta.status.down([[DATA, \"completed\"]]);\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\tconst err = msgVal(m);\n\t\t\t\t\t\tbatch(() => {\n\t\t\t\t\t\t\tout.meta.error.down([[DATA, err]]);\n\t\t\t\t\t\t\tout.meta.status.down([[DATA, \"errored\"]]);\n\t\t\t\t\t\t});\n\t\t\t\t\t\ta.down([m]);\n\t\t\t\t\t} else a.down([m]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn unsub;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(),\n\t\t\tmeta: { status: initialStatus, error: null },\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tresubscribable: true,\n\t\t\tinitial: src.get(),\n\t\t},\n\t);\n\n\treturn {\n\t\tnode: out,\n\t\tstatus: out.meta.status as Node<StatusValue>,\n\t\terror: out.meta.error as Node<unknown | null>,\n\t};\n}\n","/**\n * Protocol, system, and ingest adapters (roadmap §5.2, §5.2c).\n *\n * Each adapter wraps an external protocol or system as a reactive {@link Node}\n * built on {@link producer} / {@link node} — no second protocol.\n *\n * **Moved from sources.ts:** fromHTTP, fromWebSocket/toWebSocket, fromWebhook,\n * toSSE, fromMCP, fromGitHook.\n *\n * **New (5.2c):** fromOTel, fromSyslog, fromStatsD, fromPrometheus,\n * fromKafka/toKafka, fromRedisStream/toRedisStream, fromCSV, fromNDJSON,\n * fromClickHouseWatch, fromPulsar/toPulsar, fromNATS/toNATS,\n * fromRabbitMQ/toRabbitMQ.\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { wallClockNs } from \"../core/clock.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\ttype Message,\n\tRESOLVED,\n\tTEARDOWN,\n} from \"../core/messages.js\";\nimport { type Node, type NodeOptions, node } from \"../core/node.js\";\nimport { producer, state } from \"../core/sugar.js\";\nimport { NS_PER_MS, NS_PER_SEC } from \"./backoff.js\";\nimport { type WithStatusBundle, withStatus } from \"./resilience.js\";\nimport type { AsyncSourceOpts } from \"./sources.js\";\nimport { globToRegExp, matchesAnyPattern } from \"./sources.js\";\n\n/** Structured callback for sink transport failures (Kafka, Redis, etc.). */\nexport type SinkTransportError = {\n\tstage: \"serialize\" | \"send\" | \"routing_key\";\n\terror: Error;\n\tvalue: unknown;\n};\n\ntype ExtraOpts = Omit<NodeOptions, \"describeKind\">;\n\nfunction sourceOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"producer\", ...opts };\n}\n\n// ——————————————————————————————————————————————————————————————\n// WebSocket adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** WebSocket-like transport accepted by {@link fromWebSocket} / {@link toWebSocket}. */\nexport type WebSocketLike = {\n\tsend(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;\n\tclose(code?: number, reason?: string): void;\n\taddEventListener(type: \"message\" | \"error\" | \"close\", listener: (ev: unknown) => void): void;\n\tremoveEventListener(type: \"message\" | \"error\" | \"close\", listener: (ev: unknown) => void): void;\n};\n\nexport type WebSocketMessageEventLike = { data: unknown };\nexport type WebSocketRegister<T> = (\n\temit: (payload: T) => void,\n\terror: (err: unknown) => void,\n\tcomplete: () => void,\n) => () => void;\n\n/**\n * Wraps a WebSocket as a GraphReFly producer source.\n *\n * Incoming socket messages are emitted as `DATA`; socket `error` emits `ERROR`; socket `close`\n * emits `COMPLETE`. Teardown detaches listeners and optionally closes the socket.\n *\n * @category extra\n */\nexport function fromWebSocket<T = unknown>(\n\tsocket: WebSocketLike,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T>;\nexport function fromWebSocket<T = unknown>(\n\tregister: WebSocketRegister<T>,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T>;\nexport function fromWebSocket<T = unknown>(\n\tsocketOrRegister: WebSocketLike | WebSocketRegister<T>,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T> {\n\tconst { parse, closeOnTeardown = false, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tlet cleanup: (() => void) | undefined;\n\t\tconst runCleanup = () => {\n\t\t\tconst fn = cleanup;\n\t\t\tcleanup = undefined;\n\t\t\tfn?.();\n\t\t};\n\t\tconst terminate = (message: Message) => {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\ta.down([message]);\n\t\t\trunCleanup();\n\t\t};\n\t\tconst emit = (raw: unknown, event: unknown = raw) => {\n\t\t\tif (!active) return;\n\t\t\ttry {\n\t\t\t\tconst payload =\n\t\t\t\t\traw !== null && typeof raw === \"object\" && \"data\" in (raw as Record<string, unknown>)\n\t\t\t\t\t\t? (raw as WebSocketMessageEventLike).data\n\t\t\t\t\t\t: raw;\n\t\t\t\tconst parsed = parse ? parse(payload, event) : (payload as T);\n\t\t\t\ta.emit(parsed);\n\t\t\t} catch (err) {\n\t\t\t\tterminate([ERROR, err]);\n\t\t\t}\n\t\t};\n\t\tconst error = (err: unknown) => {\n\t\t\tterminate([ERROR, err]);\n\t\t};\n\t\tconst complete = () => {\n\t\t\tterminate([COMPLETE]);\n\t\t};\n\t\tif (typeof socketOrRegister === \"function\") {\n\t\t\ttry {\n\t\t\t\tcleanup = socketOrRegister(emit, error, complete);\n\t\t\t\tif (typeof cleanup !== \"function\") {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"fromWebSocket register contract violation: register must return cleanup callable\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tterminate([ERROR, err]);\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\trunCleanup();\n\t\t\t};\n\t\t}\n\n\t\tconst ws = socketOrRegister;\n\t\tconst onMessage = (event: unknown) => emit(event, event);\n\t\tconst onError = (event: unknown) => error(event);\n\t\tconst onClose = () => complete();\n\t\tws.addEventListener(\"message\", onMessage);\n\t\tws.addEventListener(\"error\", onError);\n\t\tws.addEventListener(\"close\", onClose);\n\t\tcleanup = () => {\n\t\t\tws.removeEventListener(\"message\", onMessage);\n\t\t\tws.removeEventListener(\"error\", onError);\n\t\t\tws.removeEventListener(\"close\", onClose);\n\t\t\tif (closeOnTeardown) ws.close();\n\t\t};\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\trunCleanup();\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n// ——————————————————————————————————————————————————————————————\n// Webhook adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Registration callback for {@link fromWebhook}. */\nexport type WebhookRegister<T> = (handlers: {\n\t/** Push one webhook payload downstream as `[[DATA, payload]]`. */\n\temit: (payload: T) => void;\n\t/** Push terminal error as `[[ERROR, err]]`. */\n\terror: (err: unknown) => void;\n\t/** Push terminal completion as `[[COMPLETE]]`. */\n\tcomplete: () => void;\n}) => (() => void) | undefined;\n\n/**\n * Bridges HTTP webhook callbacks into a GraphReFly source.\n *\n * The `register` callback wires your runtime/framework callback to GraphReFly and may return a\n * cleanup function. This keeps the adapter runtime-agnostic while following the same producer\n * pattern as {@link fromEvent}.\n *\n * @param register - Registers webhook handlers (`emit`, `error`, `complete`) and optionally returns cleanup.\n * @param opts - Optional producer options.\n * @returns `Node<T>` — webhook payloads as `DATA`; teardown runs returned cleanup.\n *\n * @example\n * ```ts\n * import express from \"express\";\n * import { fromWebhook } from \"@graphrefly/graphrefly-ts\";\n *\n * type HookPayload = { event: string; data: unknown };\n * const app = express();\n * app.use(express.json());\n *\n * const hook$ = fromWebhook<HookPayload>(({ emit, error }) => {\n * const handler = (req: express.Request, res: express.Response) => {\n * try {\n * emit(req.body as HookPayload);\n * res.status(200).send(\"ok\");\n * } catch (e) {\n * error(e);\n * res.status(500).send(\"error\");\n * }\n * };\n * app.post(\"/webhook\", handler);\n * return () => {\n * // Express has no direct route-removal API in common use.\n * };\n * });\n * ```\n *\n * @example Fastify\n * ```ts\n * import Fastify from \"fastify\";\n * import { fromWebhook } from \"@graphrefly/graphrefly-ts\";\n *\n * const fastify = Fastify();\n * const hook$ = fromWebhook<any>(({ emit, error }) => {\n * const handler = async (req: any, reply: any) => {\n * try {\n * emit(req.body);\n * reply.code(200).send({ ok: true });\n * } catch (e) {\n * error(e);\n * reply.code(500).send({ ok: false });\n * }\n * };\n * fastify.post(\"/webhook\", handler);\n * return () => {};\n * });\n * ```\n *\n * @category extra\n */\nexport function fromWebhook<T = unknown>(register: WebhookRegister<T>, opts?: ExtraOpts): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tconst emit = (payload: T) => {\n\t\t\tif (!active) return;\n\t\t\ta.emit(payload);\n\t\t};\n\t\tconst error = (err: unknown) => {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\ta.down([[ERROR, err]]);\n\t\t};\n\t\tconst complete = () => {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\ta.down([[COMPLETE]]);\n\t\t};\n\n\t\ttry {\n\t\t\tconst cleanup = register({ emit, error, complete });\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\tcleanup?.();\n\t\t\t};\n\t\t} catch (err) {\n\t\t\terror(err);\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t}\n\t}, sourceOpts(opts));\n}\n\n// ——————————————————————————————————————————————————————————————\n// HTTP adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/**\n * Options for {@link fromHTTP}.\n *\n * @category extra\n */\nexport interface FromHTTPOptions extends AsyncSourceOpts {\n\t/** HTTP method. Default: `\"GET\"`. */\n\tmethod?: string;\n\t/** Request headers. */\n\theaders?: Record<string, string>;\n\t/** Request body (for POST/PUT/PATCH). */\n\tbody?: any;\n\t/** Transform the Response before emitting. Default: `response.json()`. */\n\ttransform?: (response: Response) => any | Promise<any>;\n\t/** Request timeout in **nanoseconds**. Default: `30s` (30 * NS_PER_SEC). */\n\ttimeoutNs?: number;\n}\n\n/**\n * Result of {@link fromHTTP}: main source plus status, error, and fetch count companions.\n *\n * @category extra\n */\nexport type HTTPBundle<T> = WithStatusBundle<T> & {\n\t/** Number of successful fetches. */\n\tfetchCount: Node<number>;\n\t/** Nanosecond wall-clock timestamp of the last successful fetch. */\n\tlastUpdated: Node<number>;\n};\n\n/**\n * Creates a one-shot fetch-based HTTP source with lifecycle tracking.\n *\n * @category extra\n */\nexport function fromHTTP<T = any>(url: string, opts?: FromHTTPOptions): HTTPBundle<T> {\n\tconst {\n\t\tmethod = \"GET\",\n\t\theaders,\n\t\tbody: bodyOpt,\n\t\ttransform = (r: Response) => r.json(),\n\t\ttimeoutNs = 30 * NS_PER_SEC,\n\t\tsignal: externalSignal,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst fetchCount = state(0, { name: `${rest.name ?? \"http\"}/fetchCount` });\n\tconst lastUpdated = state(0, { name: `${rest.name ?? \"http\"}/lastUpdated` });\n\n\tconst sourceNode = producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tconst abort = new AbortController();\n\n\t\tif (externalSignal?.aborted) {\n\t\t\ta.down([[ERROR, externalSignal.reason ?? new Error(\"Aborted\")]]);\n\t\t\treturn () => {};\n\t\t}\n\t\texternalSignal?.addEventListener(\"abort\", () => abort.abort(externalSignal.reason), {\n\t\t\tonce: true,\n\t\t});\n\n\t\tconst timeoutId = setTimeout(\n\t\t\t() => abort.abort(new Error(\"Request timeout\")),\n\t\t\tMath.ceil(timeoutNs / NS_PER_MS),\n\t\t);\n\n\t\tconst body =\n\t\t\tbodyOpt !== undefined\n\t\t\t\t? typeof bodyOpt === \"string\"\n\t\t\t\t\t? bodyOpt\n\t\t\t\t\t: JSON.stringify(bodyOpt)\n\t\t\t\t: undefined;\n\n\t\tfetch(url, { method, headers, body, signal: abort.signal })\n\t\t\t.then(async (res) => {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tthrow new Error(`HTTP ${res.status}: ${res.statusText}`);\n\t\t\t\t}\n\n\t\t\t\tconst data = await transform(res);\n\t\t\t\tif (!active) return;\n\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfetchCount.down([[DATA, (fetchCount.get() ?? 0) + 1]]);\n\t\t\t\t\tlastUpdated.down([[DATA, wallClockNs()]]);\n\t\t\t\t\ta.emit(data as T);\n\t\t\t\t});\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\t\t\t\tif (err.name === \"AbortError\") return;\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t});\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tabort.abort();\n\t\t};\n\t}, sourceOpts(rest));\n\n\tconst tracked = withStatus(sourceNode);\n\n\treturn {\n\t\t...tracked,\n\t\tfetchCount,\n\t\tlastUpdated,\n\t};\n}\n\n// ——————————————————————————————————————————————————————————————\n// SSE sink (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Options for {@link toSSE}. */\nexport type ToSSEOptions = {\n\t/** Custom payload serializer for non-string payloads. Default: `JSON.stringify` fallback to `String(value)`. */\n\tserialize?: (value: unknown) => string;\n\t/** Event name for DATA tuples. Default: `\"data\"`. */\n\tdataEvent?: string;\n\t/** Event name for ERROR tuples. Default: `\"error\"`. */\n\terrorEvent?: string;\n\t/** Event name for COMPLETE tuples. Default: `\"complete\"`. */\n\tcompleteEvent?: string;\n\t/** Emit `event: resolved` when RESOLVED arrives. Default: `false`. */\n\tincludeResolved?: boolean;\n\t/** Emit `event: dirty` when DIRTY arrives. Default: `false`. */\n\tincludeDirty?: boolean;\n\t/** Add SSE comment keepalive frames (`: keepalive`) on an interval. Disabled when unset. */\n\tkeepAliveMs?: number;\n\t/** Optional abort signal to terminate the stream early. */\n\tsignal?: AbortSignal;\n\t/** Maps custom message types to SSE event names. */\n\teventNameResolver?: (type: symbol) => string;\n};\n\nfunction messageTypeLabel(t: symbol): string {\n\treturn Symbol.keyFor(t) ?? t.description ?? \"message\";\n}\n\nfunction serializeSseData(value: unknown, serialize: (value: unknown) => string): string {\n\tif (typeof value === \"string\") return value;\n\treturn serialize(value);\n}\n\nfunction sseFrame(event: string, data?: string): string {\n\tlet out = `event: ${event}\\n`;\n\tif (data !== undefined) {\n\t\tconst lines = data.split(/\\r?\\n/);\n\t\tfor (const line of lines) {\n\t\t\tout += `data: ${line}\\n`;\n\t\t}\n\t}\n\treturn `${out}\\n`;\n}\n\n/**\n * Creates a standard Server-Sent Events stream from node messages.\n *\n * @category extra\n */\nexport function toSSE<T>(source: Node<T>, opts?: ToSSEOptions): ReadableStream<Uint8Array> {\n\tconst {\n\t\tserialize = (value: unknown) => {\n\t\t\tif (value instanceof Error) return value.message;\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(value);\n\t\t\t} catch {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t},\n\t\tdataEvent = \"data\",\n\t\terrorEvent = \"error\",\n\t\tcompleteEvent = \"complete\",\n\t\tincludeResolved = false,\n\t\tincludeDirty = false,\n\t\tkeepAliveMs,\n\t\tsignal,\n\t\teventNameResolver = messageTypeLabel,\n\t} = opts ?? {};\n\tconst encoder = new TextEncoder();\n\tlet stop: (() => void) | undefined;\n\n\treturn new ReadableStream<Uint8Array>({\n\t\tstart(controller) {\n\t\t\tlet closed = false;\n\t\t\tlet keepAlive: ReturnType<typeof setInterval> | undefined;\n\t\t\tlet unsub: () => void = () => {};\n\t\t\tconst close = () => {\n\t\t\t\tif (closed) return;\n\t\t\t\tclosed = true;\n\t\t\t\tif (keepAlive !== undefined) clearInterval(keepAlive);\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tunsub();\n\t\t\t\tcontroller.close();\n\t\t\t};\n\t\t\tstop = close;\n\t\t\tconst write = (event: string, data?: string) => {\n\t\t\t\tif (closed) return;\n\t\t\t\tcontroller.enqueue(encoder.encode(sseFrame(event, data)));\n\t\t\t};\n\t\t\tconst onAbort = () => {\n\t\t\t\tif (closed) return;\n\t\t\t\tclose();\n\t\t\t};\n\t\t\tunsub = source.subscribe((msgs) => {\n\t\t\t\tfor (const msg of msgs) {\n\t\t\t\t\tconst t = msg[0];\n\t\t\t\t\tif (t === DATA) {\n\t\t\t\t\t\twrite(dataEvent, serializeSseData(msg[1], serialize));\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === ERROR) {\n\t\t\t\t\t\twrite(errorEvent, serializeSseData(msg[1], serialize));\n\t\t\t\t\t\tclose();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\t\twrite(completeEvent);\n\t\t\t\t\t\tclose();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (!includeResolved && t === RESOLVED) continue;\n\t\t\t\t\tif (!includeDirty && t === DIRTY) continue;\n\t\t\t\t\twrite(\n\t\t\t\t\t\teventNameResolver(t),\n\t\t\t\t\t\tmsg.length > 1 ? serializeSseData(msg[1], serialize) : undefined,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (keepAliveMs !== undefined && keepAliveMs > 0) {\n\t\t\t\tkeepAlive = setInterval(() => {\n\t\t\t\t\tif (closed) return;\n\t\t\t\t\tcontroller.enqueue(encoder.encode(\": keepalive\\n\\n\"));\n\t\t\t\t}, keepAliveMs);\n\t\t\t}\n\t\t\tif (signal?.aborted) onAbort();\n\t\t\telse signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t},\n\t\tcancel() {\n\t\t\tstop?.();\n\t\t},\n\t});\n}\n\n// ——————————————————————————————————————————————————————————————\n// WebSocket sink (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Options for {@link toWebSocket}. */\nexport type ToWebSocketOptions<T> = {\n\t/** Serialize DATA payloads before `socket.send(...)`. */\n\tserialize?: (value: T) => string | ArrayBufferLike | Blob | ArrayBufferView;\n\t/** Close socket when upstream emits COMPLETE. Default: `true`. */\n\tcloseOnComplete?: boolean;\n\t/** Close socket when upstream emits ERROR. Default: `true`. */\n\tcloseOnError?: boolean;\n\t/** Optional close code used when close is triggered by terminal tuples. */\n\tcloseCode?: number;\n\t/** Optional close reason used when close is triggered by terminal tuples. */\n\tcloseReason?: string;\n\t/** Structured callback for serialize/send/close transport failures. */\n\tonTransportError?: (event: ToWebSocketTransportError) => void;\n};\n\nexport type ToWebSocketTransportError = {\n\tstage: \"serialize\" | \"send\" | \"close\";\n\terror: Error;\n\tmessage: Message | undefined;\n};\n\n/**\n * Forwards upstream `DATA` payloads to a WebSocket via `send`.\n *\n * @category extra\n */\nexport function toWebSocket<T>(\n\tsource: Node<T>,\n\tsocket: WebSocketLike,\n\topts?: ToWebSocketOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (value: T) => {\n\t\t\tif (\n\t\t\t\ttypeof value === \"string\" ||\n\t\t\t\tvalue instanceof Blob ||\n\t\t\t\tvalue instanceof ArrayBuffer ||\n\t\t\t\tArrayBuffer.isView(value)\n\t\t\t) {\n\t\t\t\treturn value as string | ArrayBufferLike | Blob | ArrayBufferView;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(value);\n\t\t\t} catch {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t},\n\t\tcloseOnComplete = true,\n\t\tcloseOnError = true,\n\t\tcloseCode,\n\t\tcloseReason,\n\t\tonTransportError,\n\t} = opts ?? {};\n\tlet closed = false;\n\tconst toError = (err: unknown): Error => (err instanceof Error ? err : new Error(String(err)));\n\tconst reportTransportError = (\n\t\tstage: \"serialize\" | \"send\" | \"close\",\n\t\terror: unknown,\n\t\tmessage: Message | undefined,\n\t) => {\n\t\tif (!onTransportError) return;\n\t\ttry {\n\t\t\tonTransportError({ stage, error: toError(error), message });\n\t\t} catch {\n\t\t\t/* user-provided hook should not throw into graph path */\n\t\t}\n\t};\n\tconst closeSocket = (message: Message) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\ttry {\n\t\t\tsocket.close(closeCode, closeReason);\n\t\t} catch (err) {\n\t\t\treportTransportError(\"close\", err, message);\n\t\t}\n\t};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tlet serialized: string | ArrayBufferLike | Blob | ArrayBufferView;\n\t\t\t\ttry {\n\t\t\t\t\tserialized = serialize(msg[1] as T);\n\t\t\t\t} catch (err) {\n\t\t\t\t\treportTransportError(\"serialize\", err, msg);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tsocket.send(serialized === undefined ? String(msg[1] as T) : serialized);\n\t\t\t\t} catch (err) {\n\t\t\t\t\treportTransportError(\"send\", err, msg);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE && closeOnComplete) {\n\t\t\t\tcloseSocket(msg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === ERROR && closeOnError) {\n\t\t\t\tcloseSocket(msg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——————————————————————————————————————————————————————————————\n// MCP adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/**\n * Duck-typed MCP (Model Context Protocol) client — only the notification\n * registration surface is required so callers are not coupled to a specific SDK.\n */\nexport type MCPClientLike = {\n\tsetNotificationHandler(method: string, handler: (notification: unknown) => void): void;\n};\n\n/** Options for {@link fromMCP}. */\nexport type FromMCPOptions = ExtraOpts & {\n\t/** MCP notification method to subscribe to. Default `\"notifications/message\"`. */\n\tmethod?: string;\n\tonDisconnect?: (cb: (err?: unknown) => void) => void;\n};\n\n/**\n * Wraps an MCP client's server-push notifications as a reactive source.\n *\n * @category extra\n */\nexport function fromMCP<T = unknown>(client: MCPClientLike, opts?: FromMCPOptions): Node<T> {\n\tconst { method = \"notifications/message\", onDisconnect, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tclient.setNotificationHandler(method, (notification) => {\n\t\t\tif (!active) return;\n\t\t\ta.emit(notification as T);\n\t\t});\n\t\tif (onDisconnect) {\n\t\t\tonDisconnect((err?: unknown) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tactive = false;\n\t\t\t\ta.down([[ERROR, err ?? new Error(\"MCP client disconnected\")]]);\n\t\t\t});\n\t\t}\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tclient.setNotificationHandler(method, () => {});\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n// ——————————————————————————————————————————————————————————————\n// Git adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Git hook type for {@link fromGitHook}. */\nexport type GitHookType = \"post-commit\" | \"post-merge\" | \"post-checkout\" | \"post-rewrite\";\n\n/** Structured git event emitted by {@link fromGitHook}. */\nexport type GitEvent = {\n\thook: GitHookType;\n\tcommit: string;\n\tfiles: string[];\n\tmessage: string;\n\tauthor: string;\n\ttimestamp_ns: number;\n};\n\n/** Options for {@link fromGitHook}. */\nexport type FromGitHookOptions = ExtraOpts & {\n\tpollMs?: number;\n\tinclude?: string[];\n\texclude?: string[];\n};\n\n// globToRegExp, matchesAnyPattern imported from ./sources.js\n\n/**\n * Git change detection as a reactive source.\n *\n * @category extra\n */\nexport function fromGitHook(repoPath: string, opts?: FromGitHookOptions): Node<GitEvent> {\n\tconst { pollMs = 5000, include, exclude, ...rest } = opts ?? {};\n\tconst includePatterns = include?.map(globToRegExp) ?? [];\n\tconst excludePatterns = exclude?.map(globToRegExp) ?? [];\n\n\treturn producer<GitEvent>((_d, a) => {\n\t\tlet active = true;\n\t\tlet lastSeen: string;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\t\tconst { execFileSync } = require(\"node:child_process\") as typeof import(\"node:child_process\");\n\n\t\tconst git = (...args: string[]): string => {\n\t\t\ttry {\n\t\t\t\treturn execFileSync(\"git\", args, { cwd: repoPath, encoding: \"utf-8\" }).trim();\n\t\t\t} catch (err) {\n\t\t\t\tif (!active) return \"\";\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\tcleanup();\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t};\n\n\t\tconst cleanup = () => {\n\t\t\tactive = false;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t};\n\n\t\tlastSeen = git(\"rev-parse\", \"HEAD\");\n\t\tif (!active) return () => {};\n\n\t\tconst schedule = () => {\n\t\t\tif (!active) return;\n\t\t\ttimer = setTimeout(check, pollMs);\n\t\t};\n\n\t\tconst check = () => {\n\t\t\tif (!active) return;\n\t\t\tconst head = git(\"rev-parse\", \"HEAD\");\n\t\t\tif (!active || !head || head === lastSeen) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet files = git(\"diff\", \"--name-only\", `${lastSeen}..${head}`).split(\"\\n\").filter(Boolean);\n\t\t\tif (!active) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (includePatterns.length > 0) {\n\t\t\t\tfiles = files.filter((f) => matchesAnyPattern(f, includePatterns));\n\t\t\t}\n\t\t\tif (excludePatterns.length > 0) {\n\t\t\t\tfiles = files.filter((f) => !matchesAnyPattern(f, excludePatterns));\n\t\t\t}\n\n\t\t\tconst message = git(\"log\", \"-1\", \"--format=%s\", head);\n\t\t\tif (!active) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst author = git(\"log\", \"-1\", \"--format=%an\", head);\n\t\t\tif (!active) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ta.emit({\n\t\t\t\thook: \"post-commit\" as GitHookType,\n\t\t\t\tcommit: head,\n\t\t\t\tfiles,\n\t\t\t\tmessage,\n\t\t\t\tauthor,\n\t\t\t\ttimestamp_ns: wallClockNs(),\n\t\t\t});\n\t\t\tlastSeen = head;\n\t\t\tschedule();\n\t\t};\n\n\t\tschedule();\n\t\treturn cleanup;\n\t}, sourceOpts(rest));\n}\n\n// ——————————————————————————————————————————————————————————————\n// 5.2c — Ingest adapters (universal source layer)\n// ——————————————————————————————————————————————————————————————\n\n// ——— Shared helpers ———\n\n/** Standard handler triple for adapters that accept injected registrations. */\nexport type AdapterHandlers<T> = {\n\temit: (payload: T) => void;\n\terror: (err: unknown) => void;\n\tcomplete: () => void;\n};\n\n// ——— OpenTelemetry (OTLP/HTTP) ———\n\n/** Structured OTel span. */\nexport type OTelSpan = {\n\ttraceId: string;\n\tspanId: string;\n\toperationName: string;\n\tserviceName: string;\n\tstartTimeNs: number;\n\tendTimeNs: number;\n\tstatus: \"OK\" | \"ERROR\" | \"UNSET\";\n\tattributes: Record<string, unknown>;\n\tevents: Array<{ name: string; timestampNs: number; attributes?: Record<string, unknown> }>;\n};\n\n/** Structured OTel metric data point. */\nexport type OTelMetric = {\n\tname: string;\n\tdescription?: string;\n\tunit?: string;\n\ttype: \"gauge\" | \"sum\" | \"histogram\" | \"summary\";\n\tvalue: number;\n\tattributes: Record<string, unknown>;\n\ttimestampNs: number;\n};\n\n/** Structured OTel log record. */\nexport type OTelLog = {\n\ttimestampNs: number;\n\tseverityNumber?: number;\n\tseverityText?: string;\n\tbody: unknown;\n\tattributes: Record<string, unknown>;\n\ttraceId?: string;\n\tspanId?: string;\n};\n\n/** Registration callback for the OTLP/HTTP receiver. */\nexport type OTelRegister = (handlers: {\n\tonTraces: (spans: OTelSpan[]) => void;\n\tonMetrics: (metrics: OTelMetric[]) => void;\n\tonLogs: (logs: OTelLog[]) => void;\n\tonError: (err: unknown) => void;\n}) => (() => void) | undefined;\n\n/** Options for {@link fromOTel}. */\nexport type FromOTelOptions = ExtraOpts & {};\n\n/** Bundle returned by {@link fromOTel}. */\nexport type OTelBundle = {\n\ttraces: Node<OTelSpan>;\n\tmetrics: Node<OTelMetric>;\n\tlogs: Node<OTelLog>;\n};\n\n/**\n * OTLP/HTTP receiver — accepts traces, metrics, and logs as separate reactive nodes.\n *\n * The caller owns the HTTP server. `fromOTel` receives a `register` callback that\n * wires OTLP POST endpoints to the three signal handlers. Each signal type gets\n * its own `Node` so downstream can subscribe selectively.\n *\n * @param register - Wires OTLP HTTP routes to `onTraces`, `onMetrics`, `onLogs` handlers.\n * @param opts - Optional producer options.\n * @returns {@link OTelBundle} — `{ traces, metrics, logs }` nodes.\n *\n * @example\n * ```ts\n * import express from \"express\";\n * import { fromOTel } from \"@graphrefly/graphrefly-ts\";\n *\n * const app = express();\n * app.use(express.json());\n *\n * const otel = fromOTel(({ onTraces, onMetrics, onLogs }) => {\n * app.post(\"/v1/traces\", (req, res) => { onTraces(req.body.resourceSpans ?? []); res.sendStatus(200); });\n * app.post(\"/v1/metrics\", (req, res) => { onMetrics(req.body.resourceMetrics ?? []); res.sendStatus(200); });\n * app.post(\"/v1/logs\", (req, res) => { onLogs(req.body.resourceLogs ?? []); res.sendStatus(200); });\n * return () => {};\n * });\n * ```\n *\n * @category extra\n */\nexport function fromOTel(register: OTelRegister, opts?: FromOTelOptions): OTelBundle {\n\tlet registerCleanup: (() => void) | undefined;\n\tlet active = true;\n\tlet teardownCount = 0;\n\n\tconst teardownOne = () => {\n\t\tteardownCount++;\n\t\tif (teardownCount >= 3 && registerCleanup) {\n\t\t\tregisterCleanup();\n\t\t\tregisterCleanup = undefined;\n\t\t}\n\t};\n\n\tconst traces = producer<OTelSpan>(\n\t\t(_d, _a) => () => {\n\t\t\tactive = false;\n\t\t\tteardownOne();\n\t\t},\n\t\tsourceOpts(opts),\n\t);\n\tconst metrics = producer<OTelMetric>(\n\t\t(_d, _a) => () => {\n\t\t\tactive = false;\n\t\t\tteardownOne();\n\t\t},\n\t\tsourceOpts(opts),\n\t);\n\tconst logs = producer<OTelLog>(\n\t\t(_d, _a) => () => {\n\t\t\tactive = false;\n\t\t\tteardownOne();\n\t\t},\n\t\tsourceOpts(opts),\n\t);\n\n\t// Wire registration — each handler batch-emits into the corresponding node.\n\tregisterCleanup =\n\t\tregister({\n\t\t\tonTraces: (spans) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const span of spans) traces.down([[DATA, span]]);\n\t\t\t\t});\n\t\t\t},\n\t\t\tonMetrics: (ms) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const m of ms) metrics.down([[DATA, m]]);\n\t\t\t\t});\n\t\t\t},\n\t\t\tonLogs: (ls) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const l of ls) logs.down([[DATA, l]]);\n\t\t\t\t});\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tactive = false;\n\t\t\t\ttraces.down([[ERROR, err]]);\n\t\t\t\tmetrics.down([[ERROR, err]]);\n\t\t\t\tlogs.down([[ERROR, err]]);\n\t\t\t},\n\t\t}) ?? undefined;\n\n\treturn { traces, metrics, logs };\n}\n\n// ——— Syslog (RFC 5424) ———\n\n/** Parsed syslog message (RFC 5424). */\nexport type SyslogMessage = {\n\tfacility: number;\n\tseverity: number;\n\ttimestamp: string;\n\thostname: string;\n\tappName: string;\n\tprocId: string;\n\tmsgId: string;\n\tmessage: string;\n\ttimestampNs: number;\n};\n\n/** Registration callback for syslog receiver. */\nexport type SyslogRegister = (handlers: AdapterHandlers<SyslogMessage>) => (() => void) | undefined;\n\n/** Options for {@link fromSyslog}. */\nexport type FromSyslogOptions = ExtraOpts & {};\n\n/**\n * RFC 5424 syslog receiver as a reactive source.\n *\n * The caller owns the UDP/TCP socket. `fromSyslog` receives a `register` callback\n * that wires socket data events to the `emit` handler with parsed syslog messages.\n *\n * @param register - Wires socket to emit/error/complete handlers.\n * @param opts - Optional producer options.\n * @returns `Node<SyslogMessage>` — one `DATA` per syslog message.\n *\n * @example\n * ```ts\n * import dgram from \"node:dgram\";\n * import { fromSyslog, parseSyslog } from \"@graphrefly/graphrefly-ts\";\n *\n * const server = dgram.createSocket(\"udp4\");\n * const syslog$ = fromSyslog(({ emit, error }) => {\n * server.on(\"message\", (buf) => {\n * try { emit(parseSyslog(buf.toString())); }\n * catch (e) { error(e); }\n * });\n * server.bind(514);\n * return () => server.close();\n * });\n * ```\n *\n * @category extra\n */\nexport function fromSyslog(\n\tregister: SyslogRegister,\n\topts?: FromSyslogOptions,\n): Node<SyslogMessage> {\n\treturn fromWebhook<SyslogMessage>(register as WebhookRegister<SyslogMessage>, opts);\n}\n\n/**\n * Parses a raw RFC 5424 syslog line into a structured {@link SyslogMessage}.\n *\n * Format: `<PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID MSG`\n *\n * @category extra\n */\nexport function parseSyslog(raw: string): SyslogMessage {\n\tconst match = raw.match(/^<(\\d{1,3})>\\d?\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s*(.*)/s);\n\tif (!match) {\n\t\tconst nowNs = wallClockNs();\n\t\treturn {\n\t\t\tfacility: 1,\n\t\t\tseverity: 6,\n\t\t\ttimestamp: new Date(Math.floor(nowNs / 1_000_000)).toISOString(),\n\t\t\thostname: \"-\",\n\t\t\tappName: \"-\",\n\t\t\tprocId: \"-\",\n\t\t\tmsgId: \"-\",\n\t\t\tmessage: raw.trim(),\n\t\t\ttimestampNs: nowNs,\n\t\t};\n\t}\n\tconst pri = Number(match[1]);\n\treturn {\n\t\tfacility: pri >> 3,\n\t\tseverity: pri & 7,\n\t\ttimestamp: match[2],\n\t\thostname: match[3],\n\t\tappName: match[4],\n\t\tprocId: match[5],\n\t\tmsgId: match[6],\n\t\tmessage: (match[7] ?? \"\").trim(),\n\t\ttimestampNs: wallClockNs(),\n\t};\n}\n\n// ——— StatsD / DogStatsD ———\n\n/** Parsed StatsD metric. */\nexport type StatsDMetric = {\n\tname: string;\n\tvalue: number;\n\ttype: \"counter\" | \"gauge\" | \"timer\" | \"histogram\" | \"set\" | \"distribution\";\n\tsampleRate?: number;\n\ttags: Record<string, string>;\n\ttimestampNs: number;\n};\n\n/** Registration callback for StatsD receiver. */\nexport type StatsDRegister = (handlers: AdapterHandlers<StatsDMetric>) => (() => void) | undefined;\n\n/** Options for {@link fromStatsD}. */\nexport type FromStatsDOptions = ExtraOpts & {};\n\n/**\n * StatsD/DogStatsD UDP receiver as a reactive source.\n *\n * The caller owns the UDP socket. `fromStatsD` receives a `register` callback\n * that wires datagrams to the `emit` handler with parsed metrics.\n *\n * @param register - Wires socket to emit/error/complete handlers.\n * @param opts - Optional producer options.\n * @returns `Node<StatsDMetric>` — one `DATA` per metric line.\n *\n * @example\n * ```ts\n * import dgram from \"node:dgram\";\n * import { fromStatsD, parseStatsD } from \"@graphrefly/graphrefly-ts\";\n *\n * const server = dgram.createSocket(\"udp4\");\n * const stats$ = fromStatsD(({ emit, error }) => {\n * server.on(\"message\", (buf) => {\n * for (const line of buf.toString().split(\"\\\\n\")) {\n * if (line.trim()) {\n * try { emit(parseStatsD(line)); }\n * catch (e) { error(e); }\n * }\n * }\n * });\n * server.bind(8125);\n * return () => server.close();\n * });\n * ```\n *\n * @category extra\n */\nexport function fromStatsD(register: StatsDRegister, opts?: FromStatsDOptions): Node<StatsDMetric> {\n\treturn fromWebhook<StatsDMetric>(register as WebhookRegister<StatsDMetric>, opts);\n}\n\nconst STATSD_TYPES: Record<string, StatsDMetric[\"type\"]> = {\n\tc: \"counter\",\n\tg: \"gauge\",\n\tms: \"timer\",\n\th: \"histogram\",\n\ts: \"set\",\n\td: \"distribution\",\n};\n\n/**\n * Parses a raw StatsD/DogStatsD line into a structured {@link StatsDMetric}.\n *\n * Format: `metric.name:value|type|@sampleRate|#tag1:val1,tag2:val2`\n *\n * @category extra\n */\nexport function parseStatsD(line: string): StatsDMetric {\n\tconst parts = line.split(\"|\");\n\tconst [name, valueStr] = (parts[0] ?? \"\").split(\":\");\n\tif (!name || valueStr === undefined) {\n\t\tthrow new Error(`Invalid StatsD line: ${line}`);\n\t}\n\tconst typeCode = parts[1]?.trim() ?? \"c\";\n\tconst type = STATSD_TYPES[typeCode] ?? \"counter\";\n\t// Set type uses string identifiers (e.g. unique user IDs), not numeric values.\n\tconst value = type === \"set\" ? 0 : Number(valueStr);\n\n\tlet sampleRate: number | undefined;\n\tconst tags: Record<string, string> = {};\n\n\tfor (let i = 2; i < parts.length; i++) {\n\t\tconst part = parts[i].trim();\n\t\tif (part.startsWith(\"@\")) {\n\t\t\tsampleRate = Number(part.slice(1));\n\t\t} else if (part.startsWith(\"#\")) {\n\t\t\tfor (const tag of part.slice(1).split(\",\")) {\n\t\t\t\tconst [k, v] = tag.split(\":\");\n\t\t\t\tif (k) tags[k] = v ?? \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { name: name.trim(), value, type, sampleRate, tags, timestampNs: wallClockNs() };\n}\n\n// ——— Prometheus scrape ———\n\n/** Parsed Prometheus metric. */\nexport type PrometheusMetric = {\n\tname: string;\n\tlabels: Record<string, string>;\n\tvalue: number;\n\ttimestampMs?: number;\n\ttype?: \"counter\" | \"gauge\" | \"histogram\" | \"summary\" | \"untyped\";\n\thelp?: string;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromPrometheus}. */\nexport type FromPrometheusOptions = AsyncSourceOpts & {\n\t/** Scrape interval in nanoseconds. Default `15 * NS_PER_SEC` (15s). */\n\tintervalNs?: number;\n\t/** Request headers for the scrape. */\n\theaders?: Record<string, string>;\n\t/** Request timeout in nanoseconds. Default `10 * NS_PER_SEC` (10s). */\n\ttimeoutNs?: number;\n};\n\n/**\n * Scrapes a Prometheus `/metrics` endpoint on a reactive timer interval.\n *\n * Each scrape parses the exposition format and emits one `DATA` per metric line.\n * Uses `fromTimer` semantics internally (reactive timer source, not polling).\n *\n * @param endpoint - URL of the Prometheus metrics endpoint.\n * @param opts - Scrape interval, headers, timeout.\n * @returns `Node<PrometheusMetric>` — one `DATA` per metric per scrape.\n *\n * @example\n * ```ts\n * import { fromPrometheus } from \"@graphrefly/graphrefly-ts\";\n *\n * const prom$ = fromPrometheus(\"http://localhost:9090/metrics\", { intervalNs: 30 * NS_PER_SEC });\n * ```\n *\n * @category extra\n */\nexport function fromPrometheus(\n\tendpoint: string,\n\topts?: FromPrometheusOptions,\n): Node<PrometheusMetric> {\n\tconst {\n\t\tintervalNs = 15 * NS_PER_SEC,\n\t\theaders,\n\t\ttimeoutNs = 10 * NS_PER_SEC,\n\t\tsignal: externalSignal,\n\t\t...rest\n\t} = opts ?? {};\n\tconst intervalMs = Math.ceil(intervalNs / NS_PER_MS);\n\n\treturn producer<PrometheusMetric>((_d, a) => {\n\t\tlet active = true;\n\t\tlet running = false;\n\t\tlet timer: ReturnType<typeof setInterval> | undefined;\n\n\t\tconst cleanup = () => {\n\t\t\tactive = false;\n\t\t\tif (timer !== undefined) {\n\t\t\t\tclearInterval(timer);\n\t\t\t\ttimer = undefined;\n\t\t\t}\n\t\t};\n\n\t\tconst scrape = async () => {\n\t\t\tif (!active || running) return;\n\t\t\trunning = true;\n\t\t\tconst abort = new AbortController();\n\t\t\tconst timeoutId = setTimeout(\n\t\t\t\t() => abort.abort(new Error(\"Scrape timeout\")),\n\t\t\t\tMath.ceil(timeoutNs / NS_PER_MS),\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(endpoint, {\n\t\t\t\t\theaders: { Accept: \"text/plain\", ...headers },\n\t\t\t\t\tsignal: abort.signal,\n\t\t\t\t});\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\t\t\t\tif (!res.ok) throw new Error(`Prometheus scrape ${res.status}: ${res.statusText}`);\n\n\t\t\t\tconst text = await res.text();\n\t\t\t\tif (!active) return;\n\n\t\t\t\tconst metrics = parsePrometheusText(text);\n\t\t\t\tfor (const m of metrics) a.emit(m);\n\t\t\t} catch (err) {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\t\t\t\tif (err instanceof Error && err.name === \"AbortError\") return;\n\t\t\t\tcleanup();\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t} finally {\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t};\n\n\t\tconst onAbort = () => {\n\t\t\tif (!active) return;\n\t\t\tcleanup();\n\t\t\ta.down([[ERROR, externalSignal?.reason ?? new Error(\"Aborted\")]]);\n\t\t};\n\n\t\tif (externalSignal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn () => {};\n\t\t}\n\t\texternalSignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t// Initial scrape + periodic.\n\t\tvoid scrape();\n\t\ttimer = setInterval(() => void scrape(), intervalMs);\n\n\t\treturn () => {\n\t\t\tcleanup();\n\t\t\texternalSignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/**\n * Parses Prometheus exposition format text into structured metrics.\n *\n * @category extra\n */\nexport function parsePrometheusText(text: string): PrometheusMetric[] {\n\tconst results: PrometheusMetric[] = [];\n\tconst types = new Map<string, string>();\n\tconst helps = new Map<string, string>();\n\n\tfor (const rawLine of text.split(\"\\n\")) {\n\t\tconst line = rawLine.trim();\n\t\tif (!line) continue;\n\n\t\tif (line.startsWith(\"# TYPE \")) {\n\t\t\tconst rest = line.slice(7);\n\t\t\tconst spaceIdx = rest.indexOf(\" \");\n\t\t\tif (spaceIdx > 0) {\n\t\t\t\ttypes.set(rest.slice(0, spaceIdx), rest.slice(spaceIdx + 1).trim());\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"# HELP \")) {\n\t\t\tconst rest = line.slice(7);\n\t\t\tconst spaceIdx = rest.indexOf(\" \");\n\t\t\tif (spaceIdx > 0) {\n\t\t\t\thelps.set(rest.slice(0, spaceIdx), rest.slice(spaceIdx + 1).trim());\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"#\")) continue;\n\n\t\t// metric_name{label=\"value\"} 123 timestamp?\n\t\tlet name: string;\n\t\tlet labels: Record<string, string> = {};\n\t\tlet valueStr: string;\n\t\tlet tsStr: string | undefined;\n\n\t\tconst braceIdx = line.indexOf(\"{\");\n\t\tif (braceIdx >= 0) {\n\t\t\tname = line.slice(0, braceIdx);\n\t\t\tconst closeBrace = line.indexOf(\"}\", braceIdx);\n\t\t\tif (closeBrace < 0) continue;\n\t\t\tconst labelStr = line.slice(braceIdx + 1, closeBrace);\n\t\t\tlabels = parsePrometheusLabels(labelStr);\n\t\t\tconst after = line\n\t\t\t\t.slice(closeBrace + 1)\n\t\t\t\t.trim()\n\t\t\t\t.split(/\\s+/);\n\t\t\tvalueStr = after[0] ?? \"\";\n\t\t\ttsStr = after[1];\n\t\t} else {\n\t\t\tconst parts = line.split(/\\s+/);\n\t\t\tname = parts[0] ?? \"\";\n\t\t\tvalueStr = parts[1] ?? \"\";\n\t\t\ttsStr = parts[2];\n\t\t}\n\n\t\tif (!name || !valueStr) continue;\n\n\t\tconst baseName = name.replace(/(_total|_count|_sum|_bucket|_created|_info)$/, \"\");\n\t\tresults.push({\n\t\t\tname,\n\t\t\tlabels,\n\t\t\tvalue: Number(valueStr),\n\t\t\ttimestampMs: tsStr ? Number(tsStr) : undefined,\n\t\t\ttype: (types.get(baseName) ?? types.get(name)) as PrometheusMetric[\"type\"],\n\t\t\thelp: helps.get(baseName) ?? helps.get(name),\n\t\t\ttimestampNs: wallClockNs(),\n\t\t});\n\t}\n\n\treturn results;\n}\n\nfunction parsePrometheusLabels(str: string): Record<string, string> {\n\tconst labels: Record<string, string> = {};\n\tconst re = /(\\w+)=\"((?:[^\"\\\\]|\\\\.)*)\"/g;\n\tlet m: RegExpExecArray | null = re.exec(str);\n\twhile (m !== null) {\n\t\tlabels[m[1]] = m[2].replace(/\\\\(.)/g, \"$1\");\n\t\tm = re.exec(str);\n\t}\n\treturn labels;\n}\n\n// ——— Kafka ———\n\n/** Duck-typed Kafka consumer (compatible with kafkajs, confluent-kafka, Pulsar KoP). */\nexport type KafkaConsumerLike = {\n\tsubscribe(opts: { topic: string; fromBeginning?: boolean }): Promise<void>;\n\trun(opts: {\n\t\teachMessage: (payload: {\n\t\t\ttopic: string;\n\t\t\tpartition: number;\n\t\t\tmessage: {\n\t\t\t\tkey: Buffer | null;\n\t\t\t\tvalue: Buffer | null;\n\t\t\t\theaders?: Record<string, Buffer | string | undefined>;\n\t\t\t\toffset: string;\n\t\t\t\ttimestamp: string;\n\t\t\t};\n\t\t}) => Promise<void>;\n\t}): Promise<void>;\n\tdisconnect(): Promise<void>;\n};\n\n/** Duck-typed Kafka producer. */\nexport type KafkaProducerLike = {\n\tsend(record: {\n\t\ttopic: string;\n\t\tmessages: Array<{\n\t\t\tkey?: string | Buffer | null;\n\t\t\tvalue: string | Buffer | null;\n\t\t\theaders?: Record<string, string | Buffer>;\n\t\t}>;\n\t}): Promise<void>;\n\tdisconnect(): Promise<void>;\n};\n\n/** Structured Kafka message. */\nexport type KafkaMessage<T = unknown> = {\n\ttopic: string;\n\tpartition: number;\n\tkey: string | null;\n\tvalue: T;\n\theaders: Record<string, string>;\n\toffset: string;\n\ttimestamp: string;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromKafka}. */\nexport type FromKafkaOptions = ExtraOpts & {\n\t/** Start from beginning of topic. Default: `false`. */\n\tfromBeginning?: boolean;\n\t/** Deserialize message value. Default: `JSON.parse(buffer.toString())`. */\n\tdeserialize?: (value: Buffer | null) => unknown;\n};\n\n/**\n * Kafka consumer as a reactive source.\n *\n * Wraps a KafkaJS-compatible consumer. Each message becomes a `DATA` emission.\n * Compatible with Pulsar via KoP (Kafka-on-Pulsar).\n *\n * @param consumer - KafkaJS-compatible consumer instance (caller owns connect/disconnect lifecycle).\n * @param topic - Topic to consume from.\n * @param opts - Deserialization and source options.\n * @returns `Node<KafkaMessage<T>>` — one `DATA` per Kafka message.\n *\n * @example\n * ```ts\n * import { Kafka } from \"kafkajs\";\n * import { fromKafka } from \"@graphrefly/graphrefly-ts\";\n *\n * const kafka = new Kafka({ brokers: [\"localhost:9092\"] });\n * const consumer = kafka.consumer({ groupId: \"my-group\" });\n * await consumer.connect();\n *\n * const events$ = fromKafka(consumer, \"events\", { deserialize: (buf) => JSON.parse(buf!.toString()) });\n * ```\n *\n * @category extra\n */\nexport function fromKafka<T = unknown>(\n\tconsumer: KafkaConsumerLike,\n\ttopic: string,\n\topts?: FromKafkaOptions,\n): Node<KafkaMessage<T>> {\n\tconst {\n\t\tfromBeginning = false,\n\t\tdeserialize = (buf: Buffer | null) => {\n\t\t\tif (buf === null) return null;\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buf.toString());\n\t\t\t} catch {\n\t\t\t\treturn buf.toString();\n\t\t\t}\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<KafkaMessage<T>>((_d, a) => {\n\t\tlet active = true;\n\n\t\tconst start = async () => {\n\t\t\ttry {\n\t\t\t\tawait consumer.subscribe({ topic, fromBeginning });\n\t\t\t\tawait consumer.run({\n\t\t\t\t\teachMessage: async ({ topic: t, partition, message: msg }) => {\n\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\tconst headers: Record<string, string> = {};\n\t\t\t\t\t\tif (msg.headers) {\n\t\t\t\t\t\t\tfor (const [k, v] of Object.entries(msg.headers)) {\n\t\t\t\t\t\t\t\tif (v !== undefined) headers[k] = typeof v === \"string\" ? v : v.toString();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit({\n\t\t\t\t\t\t\ttopic: t,\n\t\t\t\t\t\t\tpartition,\n\t\t\t\t\t\t\tkey: msg.key?.toString() ?? null,\n\t\t\t\t\t\t\tvalue: deserialize(msg.value) as T,\n\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\toffset: msg.offset,\n\t\t\t\t\t\t\ttimestamp: msg.timestamp,\n\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid start();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toKafka}. */\nexport type ToKafkaOptions<T> = ExtraOpts & {\n\t/** Serialize value for Kafka. Default: `JSON.stringify`. */\n\tserialize?: (value: T) => string | Buffer;\n\t/** Extract message key from value. Default: `null` (no key). */\n\tkeyExtractor?: (value: T) => string | null;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Kafka producer sink — forwards upstream `DATA` to a Kafka topic.\n *\n * @param source - Upstream node to forward.\n * @param kafkaProducer - KafkaJS-compatible producer instance.\n * @param topic - Target topic.\n * @param opts - Serialization and key extraction options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toKafka<T>(\n\tsource: Node<T>,\n\tkafkaProducer: KafkaProducerLike,\n\ttopic: string,\n\topts?: ToKafkaOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (v: T) => JSON.stringify(v),\n\t\tkeyExtractor,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tconst key = keyExtractor?.(value) ?? null;\n\t\t\t\tlet serialized: string | Buffer;\n\t\t\t\ttry {\n\t\t\t\t\tserialized = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvoid kafkaProducer\n\t\t\t\t\t.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ key, value: Buffer.from(serialized as string) }],\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— Redis Streams ———\n\n/** Duck-typed Redis client (compatible with ioredis, redis). */\nexport type RedisClientLike = {\n\txadd(key: string, id: string, ...fieldsAndValues: string[]): Promise<string>;\n\txread(\n\t\t...args: Array<string | number>\n\t): Promise<Array<[string, Array<[string, string[]]>]> | null>;\n\tdisconnect(): void;\n};\n\n/** Structured Redis Stream entry. */\nexport type RedisStreamEntry<T = unknown> = {\n\tid: string;\n\tkey: string;\n\tdata: T;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromRedisStream}. */\nexport type FromRedisStreamOptions = ExtraOpts & {\n\t/** Block timeout in ms for XREAD. Default: `5000`. */\n\tblockMs?: number;\n\t/** Start ID. Default: `\"$\"` (new entries only). */\n\tstartId?: string;\n\t/** Parse raw Redis hash fields to structured data. Default: parses `data` field as JSON. */\n\tparse?: (fields: string[]) => unknown;\n};\n\n/**\n * Redis Streams consumer as a reactive source.\n *\n * Uses XREAD with BLOCK to reactively consume stream entries.\n *\n * @param client - ioredis/redis-compatible client (caller owns connection).\n * @param key - Redis stream key.\n * @param opts - Block timeout, start ID, and parsing options.\n * @returns `Node<RedisStreamEntry<T>>` — one `DATA` per stream entry.\n *\n * @category extra\n */\nexport function fromRedisStream<T = unknown>(\n\tclient: RedisClientLike,\n\tkey: string,\n\topts?: FromRedisStreamOptions,\n): Node<RedisStreamEntry<T>> {\n\tconst {\n\t\tblockMs = 5000,\n\t\tstartId = \"$\",\n\t\tparse = (fields: string[]) => {\n\t\t\t// Redis returns flat [field, value, field, value, ...] arrays.\n\t\t\tfor (let i = 0; i < fields.length; i += 2) {\n\t\t\t\tif (fields[i] === \"data\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn JSON.parse(fields[i + 1]);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn fields[i + 1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Return as object if no \"data\" field.\n\t\t\tconst obj: Record<string, string> = {};\n\t\t\tfor (let i = 0; i < fields.length; i += 2) {\n\t\t\t\tobj[fields[i]] = fields[i + 1];\n\t\t\t}\n\t\t\treturn obj;\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<RedisStreamEntry<T>>((_d, a) => {\n\t\tlet active = true;\n\t\tlet lastId = startId;\n\n\t\tconst poll = async () => {\n\t\t\twhile (active) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await client.xread(\"BLOCK\", blockMs, \"STREAMS\", key, lastId);\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tfor (const [_streamKey, entries] of result) {\n\t\t\t\t\t\t\tfor (const [id, fields] of entries) {\n\t\t\t\t\t\t\t\tlastId = id;\n\t\t\t\t\t\t\t\ta.emit({\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\t\tdata: parse(fields) as T,\n\t\t\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvoid poll();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toRedisStream}. */\nexport type ToRedisStreamOptions<T> = ExtraOpts & {\n\t/** Serialize value to Redis hash fields. Default: `[\"data\", JSON.stringify(value)]`. */\n\tserialize?: (value: T) => string[];\n\t/** Max stream length (MAXLEN ~). Default: no trimming. */\n\tmaxLen?: number;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Redis Streams producer sink — forwards upstream `DATA` to a Redis stream.\n *\n * @param source - Upstream node to forward.\n * @param client - ioredis/redis-compatible client.\n * @param key - Redis stream key.\n * @param opts - Serialization options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toRedisStream<T>(\n\tsource: Node<T>,\n\tclient: RedisClientLike,\n\tkey: string,\n\topts?: ToRedisStreamOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (v: T) => [\"data\", JSON.stringify(v)],\n\t\tmaxLen,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet fields: string[];\n\t\t\t\ttry {\n\t\t\t\t\tfields = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tconst send =\n\t\t\t\t\tmaxLen !== undefined\n\t\t\t\t\t\t? client.xadd(key, \"MAXLEN\", \"~\", String(maxLen), \"*\", ...fields)\n\t\t\t\t\t\t: client.xadd(key, \"*\", ...fields);\n\t\t\t\tvoid send.catch((err: unknown) => {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— CSV ingest ———\n\n/** Parsed CSV row. */\nexport type CSVRow = Record<string, string>;\n\n/** Options for {@link fromCSV}. */\nexport type FromCSVOptions = ExtraOpts & {\n\t/** Column delimiter. Default: `\",\"`. */\n\tdelimiter?: string;\n\t/** Whether the first row is a header. Default: `true`. */\n\thasHeader?: boolean;\n\t/** Explicit column names (overrides header row). */\n\tcolumns?: string[];\n\t/** Custom line parser (e.g. wrapping a library like `csv-parse`). Overrides built-in parser + delimiter. */\n\tparseLine?: (line: string) => string[];\n};\n\n/**\n * CSV file/stream ingest for batch replay.\n *\n * Reads a CSV from a `ReadableStream<string>` or an `AsyncIterable<string>` of lines,\n * emitting one `DATA` per row. `COMPLETE` after all rows are emitted.\n *\n * @param source - Async iterable of CSV text chunks (lines or multi-line chunks).\n * @param opts - Delimiter, header, and column options.\n * @returns `Node<CSVRow>` — one `DATA` per parsed row.\n *\n * @example\n * ```ts\n * import { createReadStream } from \"node:fs\";\n * import { fromCSV } from \"@graphrefly/graphrefly-ts\";\n *\n * const csv$ = fromCSV(createReadStream(\"data.csv\", \"utf-8\"));\n * ```\n *\n * @category extra\n */\nexport function fromCSV(source: AsyncIterable<string>, opts?: FromCSVOptions): Node<CSVRow> {\n\tconst {\n\t\tdelimiter = \",\",\n\t\thasHeader = true,\n\t\tcolumns: explicitColumns,\n\t\tparseLine,\n\t\t...rest\n\t} = opts ?? {};\n\tconst parse = parseLine ?? ((line: string) => parseCSVLine(line, delimiter));\n\n\treturn producer<CSVRow>((_d, a) => {\n\t\tlet cancelled = false;\n\n\t\tconst run = async () => {\n\t\t\ttry {\n\t\t\t\tlet headers: string[] | undefined = explicitColumns;\n\t\t\t\tlet buffer = \"\";\n\n\t\t\t\tfor await (const chunk of source) {\n\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\tbuffer += chunk;\n\n\t\t\t\t\tconst lines = buffer.split(/\\r?\\n/);\n\t\t\t\t\t// Keep last partial line in buffer.\n\t\t\t\t\tbuffer = lines.pop() ?? \"\";\n\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\tif (!line.trim()) continue;\n\n\t\t\t\t\t\tconst values = parse(line);\n\n\t\t\t\t\t\tif (!headers && hasHeader) {\n\t\t\t\t\t\t\theaders = values;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!headers) {\n\t\t\t\t\t\t\theaders = values.map((_, i) => `col${i}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst row: CSVRow = {};\n\t\t\t\t\t\tfor (let i = 0; i < headers.length; i++) {\n\t\t\t\t\t\t\trow[headers[i]] = values[i] ?? \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit(row);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Process remaining buffer.\n\t\t\t\tif (!cancelled && buffer.trim()) {\n\t\t\t\t\tconst values = parse(buffer);\n\t\t\t\t\tif (headers) {\n\t\t\t\t\t\tconst row: CSVRow = {};\n\t\t\t\t\t\tfor (let i = 0; i < headers.length; i++) {\n\t\t\t\t\t\t\trow[headers[i]] = values[i] ?? \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit(row);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!cancelled) a.down([[COMPLETE]]);\n\t\t\t} catch (err) {\n\t\t\t\tif (!cancelled) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid run();\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\nfunction parseCSVLine(line: string, delimiter: string): string[] {\n\tconst values: string[] = [];\n\tlet current = \"\";\n\tlet inQuotes = false;\n\n\tfor (let i = 0; i < line.length; i++) {\n\t\tconst ch = line[i];\n\t\tif (inQuotes) {\n\t\t\tif (ch === '\"') {\n\t\t\t\tif (line[i + 1] === '\"') {\n\t\t\t\t\tcurrent += '\"';\n\t\t\t\t\ti++;\n\t\t\t\t} else {\n\t\t\t\t\tinQuotes = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcurrent += ch;\n\t\t\t}\n\t\t} else if (ch === '\"') {\n\t\t\tinQuotes = true;\n\t\t} else if (ch === delimiter) {\n\t\t\tvalues.push(current);\n\t\t\tcurrent = \"\";\n\t\t} else {\n\t\t\tcurrent += ch;\n\t\t}\n\t}\n\tvalues.push(current);\n\treturn values;\n}\n\n// ——— NDJSON ingest ———\n\n/** Options for {@link fromNDJSON}. */\nexport type FromNDJSONOptions = ExtraOpts & {};\n\n/**\n * Newline-delimited JSON stream ingest for batch replay.\n *\n * Reads an async iterable of text chunks, splits by newline, parses each line\n * as JSON, and emits one `DATA` per parsed object. `COMPLETE` after stream ends.\n *\n * @param source - Async iterable of NDJSON text chunks.\n * @param opts - Optional producer options.\n * @returns `Node<T>` — one `DATA` per JSON line.\n *\n * @example\n * ```ts\n * import { createReadStream } from \"node:fs\";\n * import { fromNDJSON } from \"@graphrefly/graphrefly-ts\";\n *\n * const logs$ = fromNDJSON(createReadStream(\"logs.ndjson\", \"utf-8\"));\n * ```\n *\n * @category extra\n */\nexport function fromNDJSON<T = unknown>(\n\tsource: AsyncIterable<string>,\n\topts?: FromNDJSONOptions,\n): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\tlet cancelled = false;\n\n\t\tconst run = async () => {\n\t\t\ttry {\n\t\t\t\tlet buffer = \"\";\n\n\t\t\t\tfor await (const chunk of source) {\n\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\tbuffer += chunk;\n\n\t\t\t\t\tconst lines = buffer.split(/\\r?\\n/);\n\t\t\t\t\tbuffer = lines.pop() ?? \"\";\n\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\tconst trimmed = line.trim();\n\t\t\t\t\t\tif (!trimmed) continue;\n\t\t\t\t\t\ta.emit(JSON.parse(trimmed) as T);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Process remaining buffer.\n\t\t\t\tif (!cancelled && buffer.trim()) {\n\t\t\t\t\ta.emit(JSON.parse(buffer.trim()) as T);\n\t\t\t\t}\n\n\t\t\t\tif (!cancelled) a.down([[COMPLETE]]);\n\t\t\t} catch (err) {\n\t\t\t\tif (!cancelled) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid run();\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, sourceOpts(opts));\n}\n\n// ——— ClickHouse live materialized view ———\n\n/** Structured ClickHouse query result row. */\nexport type ClickHouseRow = Record<string, unknown>;\n\n/** Duck-typed ClickHouse client. */\nexport type ClickHouseClientLike = {\n\tquery(opts: { query: string; format?: string }): Promise<{\n\t\tjson<T = unknown>(): Promise<T[]>;\n\t}>;\n};\n\n/** Options for {@link fromClickHouseWatch}. */\nexport type FromClickHouseWatchOptions = AsyncSourceOpts & {\n\t/** Polling interval in nanoseconds. Default: `5 * NS_PER_SEC` (5s). */\n\tintervalNs?: number;\n\t/** JSON format to request. Default: `\"JSONEachRow\"`. */\n\tformat?: string;\n};\n\n/**\n * ClickHouse live materialized view as a reactive source.\n *\n * Polls a ClickHouse query on a reactive timer interval and emits new/changed rows.\n * Uses a timer-driven approach (not busy-wait polling).\n *\n * @param client - ClickHouse client instance (caller owns connection).\n * @param query - SQL query to execute on each interval.\n * @param opts - Polling interval and format options.\n * @returns `Node<ClickHouseRow>` — one `DATA` per result row per scrape.\n *\n * @example\n * ```ts\n * import { createClient } from \"@clickhouse/client\";\n * import { fromClickHouseWatch } from \"@graphrefly/graphrefly-ts\";\n *\n * const client = createClient({ url: \"http://localhost:8123\" });\n * const rows$ = fromClickHouseWatch(client, \"SELECT * FROM errors_mv ORDER BY timestamp DESC LIMIT 100\");\n * ```\n *\n * @category extra\n */\nexport function fromClickHouseWatch(\n\tclient: ClickHouseClientLike,\n\tquery: string,\n\topts?: FromClickHouseWatchOptions,\n): Node<ClickHouseRow> {\n\tconst {\n\t\tintervalNs = 5 * NS_PER_SEC,\n\t\tformat = \"JSONEachRow\",\n\t\tsignal: externalSignal,\n\t\t...rest\n\t} = opts ?? {};\n\tconst intervalMs = Math.ceil(intervalNs / NS_PER_MS);\n\n\treturn producer<ClickHouseRow>((_d, a) => {\n\t\tlet active = true;\n\t\tlet running = false;\n\t\tlet timer: ReturnType<typeof setInterval> | undefined;\n\n\t\tconst cleanup = () => {\n\t\t\tactive = false;\n\t\t\tif (timer !== undefined) {\n\t\t\t\tclearInterval(timer);\n\t\t\t\ttimer = undefined;\n\t\t\t}\n\t\t};\n\n\t\tconst execute = async () => {\n\t\t\tif (!active || running) return;\n\t\t\trunning = true;\n\t\t\ttry {\n\t\t\t\tconst result = await client.query({ query, format });\n\t\t\t\tif (!active) return;\n\t\t\t\tconst rows = await result.json<ClickHouseRow>();\n\t\t\t\tif (!active) return;\n\t\t\t\tfor (const row of rows) a.emit(row);\n\t\t\t} catch (err) {\n\t\t\t\tif (!active) return;\n\t\t\t\tcleanup();\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t} finally {\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t};\n\n\t\tconst onAbort = () => {\n\t\t\tif (!active) return;\n\t\t\tcleanup();\n\t\t\ta.down([[ERROR, externalSignal?.reason ?? new Error(\"Aborted\")]]);\n\t\t};\n\n\t\tif (externalSignal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn () => {};\n\t\t}\n\t\texternalSignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tvoid execute();\n\t\ttimer = setInterval(() => void execute(), intervalMs);\n\n\t\treturn () => {\n\t\t\tcleanup();\n\t\t\texternalSignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n// ——— Apache Pulsar (native client) ———\n\n/** Duck-typed Pulsar consumer (compatible with pulsar-client). */\nexport type PulsarConsumerLike = {\n\treceive(): Promise<{\n\t\tgetData(): Buffer;\n\t\tgetMessageId(): { toString(): string };\n\t\tgetPartitionKey(): string;\n\t\tgetProperties(): Record<string, string>;\n\t\tgetPublishTimestamp(): number;\n\t\tgetEventTimestamp(): number;\n\t\tgetTopicName(): string;\n\t}>;\n\tacknowledge(msg: unknown): Promise<void>;\n\tclose(): Promise<void>;\n};\n\n/** Duck-typed Pulsar producer. */\nexport type PulsarProducerLike = {\n\tsend(msg: {\n\t\tdata: Buffer;\n\t\tpartitionKey?: string;\n\t\tproperties?: Record<string, string>;\n\t}): Promise<void>;\n\tclose(): Promise<void>;\n};\n\n/** Structured Pulsar message. */\nexport type PulsarMessage<T = unknown> = {\n\ttopic: string;\n\tmessageId: string;\n\tkey: string;\n\tvalue: T;\n\tproperties: Record<string, string>;\n\tpublishTime: number;\n\teventTime: number;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromPulsar}. */\nexport type FromPulsarOptions = ExtraOpts & {\n\t/** Deserialize message data. Default: `JSON.parse(buffer.toString())`. */\n\tdeserialize?: (data: Buffer) => unknown;\n\t/** Acknowledge messages automatically. Default: `true`. */\n\tautoAck?: boolean;\n};\n\n/**\n * Apache Pulsar consumer as a reactive source (native client).\n *\n * Wraps a `pulsar-client`-compatible consumer. Each message becomes a `DATA` emission.\n * For Kafka-on-Pulsar (KoP), use {@link fromKafka} instead.\n *\n * @param consumer - Pulsar consumer instance (caller owns create/close lifecycle).\n * @param opts - Deserialization and source options.\n * @returns `Node<PulsarMessage<T>>` — one `DATA` per Pulsar message.\n *\n * @remarks\n * Teardown sets an internal flag but cannot interrupt a pending `consumer.receive()`.\n * The loop exits on the next message or when the consumer is closed externally.\n * Callers should call `consumer.close()` after unsubscribing for prompt cleanup.\n *\n * @example\n * ```ts\n * import Pulsar from \"pulsar-client\";\n * import { fromPulsar } from \"@graphrefly/graphrefly-ts\";\n *\n * const client = new Pulsar.Client({ serviceUrl: \"pulsar://localhost:6650\" });\n * const consumer = await client.subscribe({ topic: \"events\", subscription: \"my-sub\" });\n * const events$ = fromPulsar(consumer);\n * ```\n *\n * @category extra\n */\nexport function fromPulsar<T = unknown>(\n\tconsumer: PulsarConsumerLike,\n\topts?: FromPulsarOptions,\n): Node<PulsarMessage<T>> {\n\tconst {\n\t\tautoAck = true,\n\t\tdeserialize = (buf: Buffer) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buf.toString());\n\t\t\t} catch {\n\t\t\t\treturn buf.toString();\n\t\t\t}\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<PulsarMessage<T>>((_d, a) => {\n\t\tlet active = true;\n\n\t\tconst loop = async () => {\n\t\t\twhile (active) {\n\t\t\t\ttry {\n\t\t\t\t\tconst msg = await consumer.receive();\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\ta.emit({\n\t\t\t\t\t\ttopic: msg.getTopicName(),\n\t\t\t\t\t\tmessageId: msg.getMessageId().toString(),\n\t\t\t\t\t\tkey: msg.getPartitionKey(),\n\t\t\t\t\t\tvalue: deserialize(msg.getData()) as T,\n\t\t\t\t\t\tproperties: msg.getProperties(),\n\t\t\t\t\t\tpublishTime: msg.getPublishTimestamp(),\n\t\t\t\t\t\teventTime: msg.getEventTimestamp(),\n\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t});\n\t\t\t\t\tif (autoAck) await consumer.acknowledge(msg);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvoid loop();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toPulsar}. */\nexport type ToPulsarOptions<T> = ExtraOpts & {\n\t/** Serialize value for Pulsar. Default: `JSON.stringify` → Buffer. */\n\tserialize?: (value: T) => Buffer;\n\t/** Extract partition key from value. Default: none. */\n\tkeyExtractor?: (value: T) => string | undefined;\n\t/** Extract properties from value. */\n\tpropertiesExtractor?: (value: T) => Record<string, string> | undefined;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Pulsar producer sink — forwards upstream `DATA` to a Pulsar topic.\n *\n * @param source - Upstream node to forward.\n * @param pulsarProducer - Pulsar producer instance (caller owns lifecycle).\n * @param opts - Serialization options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toPulsar<T>(\n\tsource: Node<T>,\n\tpulsarProducer: PulsarProducerLike,\n\topts?: ToPulsarOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (v: T) => Buffer.from(JSON.stringify(v)),\n\t\tkeyExtractor,\n\t\tpropertiesExtractor,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet data: Buffer;\n\t\t\t\ttry {\n\t\t\t\t\tdata = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvoid pulsarProducer\n\t\t\t\t\t.send({\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tpartitionKey: keyExtractor?.(value),\n\t\t\t\t\t\tproperties: propertiesExtractor?.(value),\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— NATS ———\n\n/** Duck-typed NATS subscription (compatible with nats.js). */\nexport type NATSSubscriptionLike = AsyncIterable<{\n\tsubject: string;\n\tdata: Uint8Array;\n\theaders?: { get(key: string): string; keys(): string[] };\n\treply?: string;\n\tsid: number;\n}>;\n\n/** Duck-typed NATS client (compatible with nats.js). */\nexport type NATSClientLike = {\n\tsubscribe(subject: string, opts?: { queue?: string }): NATSSubscriptionLike;\n\tpublish(subject: string, data?: Uint8Array, opts?: { headers?: unknown; reply?: string }): void;\n\tdrain(): Promise<void>;\n};\n\n/** Structured NATS message. */\nexport type NATSMessage<T = unknown> = {\n\tsubject: string;\n\tdata: T;\n\theaders: Record<string, string>;\n\treply: string | undefined;\n\tsid: number;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromNATS}. */\nexport type FromNATSOptions = ExtraOpts & {\n\t/** Queue group name for load balancing. */\n\tqueue?: string;\n\t/** Deserialize message data. Default: `JSON.parse(textDecoder.decode(data))`. */\n\tdeserialize?: (data: Uint8Array) => unknown;\n};\n\n/**\n * NATS consumer as a reactive source.\n *\n * Wraps a `nats.js`-compatible client subscription. Each message becomes a `DATA` emission.\n *\n * @param client - NATS client instance (caller owns connect/drain lifecycle).\n * @param subject - Subject to subscribe to (supports wildcards).\n * @param opts - Queue group, deserialization, and source options.\n * @returns `Node<NATSMessage<T>>` — one `DATA` per NATS message.\n *\n * @remarks\n * Teardown sets an internal flag but cannot break the async iterator. The loop\n * exits on the next message or when the subscription is drained/unsubscribed\n * externally. Call `client.drain()` after unsubscribing for prompt cleanup.\n *\n * @example\n * ```ts\n * import { connect } from \"nats\";\n * import { fromNATS } from \"@graphrefly/graphrefly-ts\";\n *\n * const nc = await connect({ servers: \"localhost:4222\" });\n * const events$ = fromNATS(nc, \"events.>\");\n * ```\n *\n * @category extra\n */\nexport function fromNATS<T = unknown>(\n\tclient: NATSClientLike,\n\tsubject: string,\n\topts?: FromNATSOptions,\n): Node<NATSMessage<T>> {\n\tconst decoder = new TextDecoder();\n\tconst {\n\t\tqueue,\n\t\tdeserialize = (data: Uint8Array) => {\n\t\t\tconst text = decoder.decode(data);\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(text);\n\t\t\t} catch {\n\t\t\t\treturn text;\n\t\t\t}\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<NATSMessage<T>>((_d, a) => {\n\t\tlet active = true;\n\t\tconst sub = client.subscribe(subject, queue ? { queue } : undefined);\n\n\t\tconst loop = async () => {\n\t\t\ttry {\n\t\t\t\tfor await (const msg of sub) {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tconst headers: Record<string, string> = {};\n\t\t\t\t\tif (msg.headers) {\n\t\t\t\t\t\tfor (const k of msg.headers.keys()) {\n\t\t\t\t\t\t\theaders[k] = msg.headers.get(k);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ta.emit({\n\t\t\t\t\t\tsubject: msg.subject,\n\t\t\t\t\t\tdata: deserialize(msg.data) as T,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\treply: msg.reply,\n\t\t\t\t\t\tsid: msg.sid,\n\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// Subscription closed (drain or unsubscribe) — complete.\n\t\t\t\tif (active) a.down([[COMPLETE]]);\n\t\t\t} catch (err) {\n\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid loop();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toNATS}. */\nexport type ToNATSOptions<T> = ExtraOpts & {\n\t/** Serialize value for NATS. Default: `JSON.stringify` → Uint8Array. */\n\tserialize?: (value: T) => Uint8Array;\n\t/** Called on serialization failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * NATS publisher sink — forwards upstream `DATA` to a NATS subject.\n *\n * @param source - Upstream node to forward.\n * @param client - NATS client instance.\n * @param subject - Target subject.\n * @param opts - Serialization options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toNATS<T>(\n\tsource: Node<T>,\n\tclient: NATSClientLike,\n\tsubject: string,\n\topts?: ToNATSOptions<T>,\n): () => void {\n\tconst encoder = new TextEncoder();\n\tconst {\n\t\tserialize = (v: T) => encoder.encode(JSON.stringify(v)),\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet data: Uint8Array;\n\t\t\t\ttry {\n\t\t\t\t\tdata = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tclient.publish(subject, data);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— RabbitMQ ———\n\n/** Duck-typed RabbitMQ channel (compatible with amqplib). */\nexport type RabbitMQChannelLike = {\n\tconsume(\n\t\tqueue: string,\n\t\tonMessage: (\n\t\t\tmsg: {\n\t\t\t\tcontent: Buffer;\n\t\t\t\tfields: {\n\t\t\t\t\troutingKey: string;\n\t\t\t\t\texchange: string;\n\t\t\t\t\tdeliveryTag: number;\n\t\t\t\t\tredelivered: boolean;\n\t\t\t\t};\n\t\t\t\tproperties: Record<string, unknown>;\n\t\t\t} | null,\n\t\t) => void,\n\t\topts?: { noAck?: boolean },\n\t): Promise<{ consumerTag: string }>;\n\tcancel(consumerTag: string): Promise<void>;\n\tack(msg: unknown): void;\n\tpublish(\n\t\texchange: string,\n\t\troutingKey: string,\n\t\tcontent: Buffer,\n\t\topts?: Record<string, unknown>,\n\t): boolean;\n\tsendToQueue(queue: string, content: Buffer, opts?: Record<string, unknown>): boolean;\n};\n\n/** Structured RabbitMQ message. */\nexport type RabbitMQMessage<T = unknown> = {\n\tqueue: string;\n\troutingKey: string;\n\texchange: string;\n\tcontent: T;\n\tproperties: Record<string, unknown>;\n\tdeliveryTag: number;\n\tredelivered: boolean;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromRabbitMQ}. */\nexport type FromRabbitMQOptions = ExtraOpts & {\n\t/** Deserialize message content. Default: `JSON.parse(buffer.toString())`. */\n\tdeserialize?: (content: Buffer) => unknown;\n\t/** Auto-acknowledge messages. Default: `true`. */\n\tautoAck?: boolean;\n};\n\n/**\n * RabbitMQ consumer as a reactive source.\n *\n * Wraps an `amqplib`-compatible channel. Each message becomes a `DATA` emission.\n *\n * @param channel - AMQP channel instance (caller owns connection/channel lifecycle).\n * @param queue - Queue to consume from.\n * @param opts - Deserialization and acknowledgment options.\n * @returns `Node<RabbitMQMessage<T>>` — one `DATA` per RabbitMQ message.\n *\n * @remarks\n * When `autoAck` is `false`, the adapter opens the channel with `noAck: false`\n * (broker requires acks) but does not call `channel.ack()`. The caller must ack\n * messages externally using the `deliveryTag` from the emitted {@link RabbitMQMessage}:\n * ```ts\n * channel.ack({ fields: { deliveryTag: msg.deliveryTag } } as any);\n * ```\n *\n * @example\n * ```ts\n * import amqplib from \"amqplib\";\n * import { fromRabbitMQ } from \"@graphrefly/graphrefly-ts\";\n *\n * const conn = await amqplib.connect(\"amqp://localhost\");\n * const ch = await conn.createChannel();\n * await ch.assertQueue(\"events\");\n * const events$ = fromRabbitMQ(ch, \"events\");\n * ```\n *\n * @category extra\n */\nexport function fromRabbitMQ<T = unknown>(\n\tchannel: RabbitMQChannelLike,\n\tqueue: string,\n\topts?: FromRabbitMQOptions,\n): Node<RabbitMQMessage<T>> {\n\tconst {\n\t\tautoAck = true,\n\t\tdeserialize = (buf: Buffer) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buf.toString());\n\t\t\t} catch {\n\t\t\t\treturn buf.toString();\n\t\t\t}\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<RabbitMQMessage<T>>((_d, a) => {\n\t\tlet active = true;\n\t\tlet consumerTag: string | undefined;\n\n\t\tconst start = async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await channel.consume(\n\t\t\t\t\tqueue,\n\t\t\t\t\t(msg) => {\n\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\tif (msg === null) {\n\t\t\t\t\t\t\t// Broker cancelled the consumer (queue deleted, etc.).\n\t\t\t\t\t\t\tif (active) a.down([[ERROR, new Error(\"Consumer cancelled by broker\")]]);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit({\n\t\t\t\t\t\t\tqueue,\n\t\t\t\t\t\t\troutingKey: msg.fields.routingKey,\n\t\t\t\t\t\t\texchange: msg.fields.exchange,\n\t\t\t\t\t\t\tcontent: deserialize(msg.content) as T,\n\t\t\t\t\t\t\tproperties: msg.properties,\n\t\t\t\t\t\t\tdeliveryTag: msg.fields.deliveryTag,\n\t\t\t\t\t\t\tredelivered: msg.fields.redelivered,\n\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (autoAck) channel.ack(msg);\n\t\t\t\t\t},\n\t\t\t\t\t{ noAck: false },\n\t\t\t\t);\n\t\t\t\tconsumerTag = result.consumerTag;\n\t\t\t} catch (err) {\n\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid start();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tif (consumerTag !== undefined) {\n\t\t\t\tvoid channel.cancel(consumerTag);\n\t\t\t}\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toRabbitMQ}. */\nexport type ToRabbitMQOptions<T> = ExtraOpts & {\n\t/** Serialize value for RabbitMQ. Default: `Buffer.from(JSON.stringify(value))`. */\n\tserialize?: (value: T) => Buffer;\n\t/** Extract routing key from value. Default: `\"\"`. */\n\troutingKeyExtractor?: (value: T) => string;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * RabbitMQ producer sink — forwards upstream `DATA` to a RabbitMQ exchange/queue.\n *\n * @param source - Upstream node to forward.\n * @param channel - AMQP channel instance.\n * @param exchange - Target exchange (use `\"\"` for default exchange + queue routing).\n * @param opts - Serialization and routing options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toRabbitMQ<T>(\n\tsource: Node<T>,\n\tchannel: RabbitMQChannelLike,\n\texchange: string,\n\topts?: ToRabbitMQOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (v: T) => Buffer.from(JSON.stringify(v)),\n\t\troutingKeyExtractor = () => \"\",\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet routingKey: string;\n\t\t\t\ttry {\n\t\t\t\t\troutingKey = routingKeyExtractor(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"routing_key\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tlet content: Buffer;\n\t\t\t\ttry {\n\t\t\t\t\tcontent = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tchannel.publish(exchange, routingKey, content);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——————————————————————————————————————————————————————————————\n// Phase 5.2d — Storage & sink adapters\n// ——————————————————————————————————————————————————————————————\n\n/** Handle returned by buffered sinks. `flush()` drains remaining buffer. */\nexport type BufferedSinkHandle = {\n\t/** Stop the sink and cancel the flush timer. */\n\tdispose: () => void;\n\t/** Manually drain the internal buffer. */\n\tflush: () => Promise<void>;\n};\n\n// ——— toFile ———\n\n/** Duck-typed writable file handle (compatible with `fs.createWriteStream`). */\nexport type FileWriterLike = {\n\twrite(data: string | Uint8Array): boolean | void;\n\tend(): void;\n};\n\n/** Options for {@link toFile}. */\nexport type ToFileOptions<T> = ExtraOpts & {\n\t/** Serialize a value to a string line. Default: `JSON.stringify(v) + \"\\n\"`. */\n\tserialize?: (value: T) => string;\n\t/** `\"append\"` (default) or `\"overwrite\"` — controls initial file behavior hint. */\n\tmode?: \"append\" | \"overwrite\";\n\t/** Flush interval in ms. `0` = write-through (no buffering). Default: `0`. */\n\tflushIntervalMs?: number;\n\t/** Buffer size (item count) before auto-flush. Default: `Infinity` (timer only). */\n\tbatchSize?: number;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * File sink — writes upstream `DATA` values to a file-like writable.\n *\n * When `flushIntervalMs > 0` or `batchSize` is set, values are buffered and\n * flushed in batches. Otherwise, each value is written immediately.\n *\n * @param source - Upstream node.\n * @param writer - Writable file handle (e.g. `fs.createWriteStream(path, { flags: \"a\" })`).\n * @param opts - Serialization, buffering, and mode options.\n * @returns `BufferedSinkHandle` with `dispose()` and `flush()`.\n *\n * @category extra\n */\nexport function toFile<T>(\n\tsource: Node<T>,\n\twriter: FileWriterLike,\n\topts?: ToFileOptions<T>,\n): BufferedSinkHandle {\n\tconst {\n\t\tserialize = (v: T) => `${JSON.stringify(v)}\\n`,\n\t\tflushIntervalMs = 0,\n\t\tbatchSize = Number.POSITIVE_INFINITY,\n\t\tonTransportError,\n\t\tmode: _mode,\n\t\t...rest\n\t} = opts ?? {};\n\n\tlet buffer: string[] = [];\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\tconst doFlush = () => {\n\t\tif (buffer.length === 0) return;\n\t\tconst chunk = buffer.join(\"\");\n\t\tbuffer = [];\n\t\ttry {\n\t\t\twriter.write(chunk);\n\t\t} catch (err) {\n\t\t\tonTransportError?.({\n\t\t\t\tstage: \"send\",\n\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\tvalue: chunk,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (flushIntervalMs > 0 && timer === undefined) {\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tdoFlush();\n\t\t\t}, flushIntervalMs);\n\t\t}\n\t};\n\n\tconst buffered = flushIntervalMs > 0 || batchSize < Number.POSITIVE_INFINITY;\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet line: string;\n\t\t\t\ttry {\n\t\t\t\t\tline = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (buffered) {\n\t\t\t\t\tbuffer.push(line);\n\t\t\t\t\tif (buffer.length >= batchSize) doFlush();\n\t\t\t\t\telse scheduleFlush();\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\twriter.write(line);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE || msg[0] === TEARDOWN) {\n\t\t\t\tdoFlush();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\n\tconst unsub = inner.subscribe(() => {});\n\n\tconst dispose = () => {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t\tdoFlush();\n\t\twriter.end();\n\t\tunsub();\n\t};\n\n\treturn {\n\t\tdispose,\n\t\tflush: async () => {\n\t\t\tdoFlush();\n\t\t},\n\t};\n}\n\n// ——— toCSV ———\n\n/** Options for {@link toCSV}. */\nexport type ToCSVOptions<T> = ExtraOpts & {\n\t/** Column names. Required — determines header row and field order. */\n\tcolumns: string[];\n\t/** Column delimiter. Default: `\",\"`. */\n\tdelimiter?: string;\n\t/** Whether to write a header row on first flush. Default: `true`. */\n\twriteHeader?: boolean;\n\t/** Extract a cell value from the row object. Default: `String(row[col] ?? \"\")`. */\n\tcellExtractor?: (row: T, column: string) => string;\n\t/** Flush interval in ms. Default: `0` (write-through). */\n\tflushIntervalMs?: number;\n\t/** Buffer size before auto-flush. Default: `Infinity`. */\n\tbatchSize?: number;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\nfunction escapeCSVField(value: string, delimiter: string): string {\n\tif (value.includes(delimiter) || value.includes('\"') || value.includes(\"\\n\")) {\n\t\treturn `\"${value.replace(/\"/g, '\"\"')}\"`;\n\t}\n\treturn value;\n}\n\n/**\n * CSV file sink — writes upstream `DATA` as CSV rows.\n *\n * @param source - Upstream node.\n * @param writer - Writable file handle.\n * @param opts - Column definition, delimiter, and buffering options.\n * @returns `BufferedSinkHandle`.\n *\n * @category extra\n */\nexport function toCSV<T>(\n\tsource: Node<T>,\n\twriter: FileWriterLike,\n\topts: ToCSVOptions<T>,\n): BufferedSinkHandle {\n\tconst {\n\t\tcolumns,\n\t\tdelimiter = \",\",\n\t\twriteHeader = true,\n\t\tcellExtractor = (row: T, col: string) => String((row as Record<string, unknown>)[col] ?? \"\"),\n\t\tflushIntervalMs = 0,\n\t\tbatchSize = Number.POSITIVE_INFINITY,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts;\n\n\tlet headerWritten = false;\n\n\tconst serializeRow = (row: T): string => {\n\t\tif (!headerWritten && writeHeader) {\n\t\t\theaderWritten = true;\n\t\t\tconst header = columns.map((c) => escapeCSVField(c, delimiter)).join(delimiter);\n\t\t\tconst data = columns\n\t\t\t\t.map((c) => escapeCSVField(cellExtractor(row, c), delimiter))\n\t\t\t\t.join(delimiter);\n\t\t\treturn `${header}\\n${data}\\n`;\n\t\t}\n\t\treturn `${columns.map((c) => escapeCSVField(cellExtractor(row, c), delimiter)).join(delimiter)}\\n`;\n\t};\n\n\treturn toFile<T>(source, writer, {\n\t\tserialize: serializeRow,\n\t\tflushIntervalMs,\n\t\tbatchSize,\n\t\tonTransportError,\n\t\t...rest,\n\t});\n}\n\n// ——— toClickHouse ———\n\n/** Duck-typed ClickHouse client for batch inserts. */\nexport type ClickHouseInsertClientLike = {\n\tinsert(params: { table: string; values: unknown[]; format?: string }): Promise<void>;\n};\n\n/** Options for {@link toClickHouse}. */\nexport type ToClickHouseOptions<T> = ExtraOpts & {\n\t/** Batch size before auto-flush. Default: `1000`. */\n\tbatchSize?: number;\n\t/** Flush interval in ms. Default: `5000`. */\n\tflushIntervalMs?: number;\n\t/** Insert format. Default: `\"JSONEachRow\"`. */\n\tformat?: string;\n\t/** Transform value before insert. Default: identity. */\n\ttransform?: (value: T) => unknown;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * ClickHouse buffered batch insert sink.\n *\n * Accumulates upstream `DATA` values and inserts in batches.\n *\n * @param source - Upstream node.\n * @param client - ClickHouse client with `insert()`.\n * @param table - Target table name.\n * @param opts - Batch size, flush interval, and transform options.\n * @returns `BufferedSinkHandle`.\n *\n * @category extra\n */\nexport function toClickHouse<T>(\n\tsource: Node<T>,\n\tclient: ClickHouseInsertClientLike,\n\ttable: string,\n\topts?: ToClickHouseOptions<T>,\n): BufferedSinkHandle {\n\tconst {\n\t\tbatchSize = 1000,\n\t\tflushIntervalMs = 5000,\n\t\tformat = \"JSONEachRow\",\n\t\ttransform = (v: T) => v,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tlet buffer: unknown[] = [];\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet lastFlush: Promise<void> = Promise.resolve();\n\n\tconst doFlush = (): Promise<void> => {\n\t\tif (buffer.length === 0) return Promise.resolve();\n\t\tconst batch = buffer;\n\t\tbuffer = [];\n\t\ttry {\n\t\t\tconst p = client.insert({ table, values: batch, format }).catch((err: unknown) => {\n\t\t\t\tonTransportError?.({\n\t\t\t\t\tstage: \"send\",\n\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\tvalue: batch,\n\t\t\t\t});\n\t\t\t});\n\t\t\tlastFlush = p;\n\t\t\treturn p;\n\t\t} catch (err) {\n\t\t\tonTransportError?.({\n\t\t\t\tstage: \"send\",\n\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\tvalue: batch,\n\t\t\t});\n\t\t\treturn Promise.resolve();\n\t\t}\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (timer === undefined) {\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tdoFlush();\n\t\t\t}, flushIntervalMs);\n\t\t}\n\t};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\ttry {\n\t\t\t\t\tbuffer.push(transform(value));\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (buffer.length >= batchSize) doFlush();\n\t\t\t\telse scheduleFlush();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE || msg[0] === TEARDOWN) {\n\t\t\t\tdoFlush();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\n\tconst unsub = inner.subscribe(() => {});\n\n\tconst dispose = () => {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t\tdoFlush();\n\t\tunsub();\n\t};\n\n\treturn {\n\t\tdispose,\n\t\tflush: () => doFlush().then(() => lastFlush),\n\t};\n}\n\n// ——— toS3 ———\n\n/** Duck-typed S3 client (compatible with AWS SDK v3 `S3Client.send(PutObjectCommand(...))`). */\nexport type S3ClientLike = {\n\tputObject(params: {\n\t\tBucket: string;\n\t\tKey: string;\n\t\tBody: string | Uint8Array;\n\t\tContentType?: string;\n\t}): Promise<unknown>;\n};\n\n/** Options for {@link toS3}. */\nexport type ToS3Options<T> = ExtraOpts & {\n\t/** Output format. Default: `\"ndjson\"`. */\n\tformat?: \"ndjson\" | \"json\";\n\t/** Generate the S3 key for each batch. Receives `(seq, wallClockNs)`. Default: ISO timestamp + sequence. */\n\tkeyGenerator?: (seq: number, timestampNs: number) => string;\n\t/** Batch size before auto-flush. Default: `1000`. */\n\tbatchSize?: number;\n\t/** Flush interval in ms. Default: `10000`. */\n\tflushIntervalMs?: number;\n\t/** Transform value before serialization. Default: identity. */\n\ttransform?: (value: T) => unknown;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * S3 object storage sink — buffers values and uploads as NDJSON or JSON objects.\n *\n * @param source - Upstream node.\n * @param client - S3-compatible client with `putObject()`.\n * @param bucket - S3 bucket name.\n * @param opts - Format, key generation, batching options.\n * @returns `BufferedSinkHandle`.\n *\n * @category extra\n */\nexport function toS3<T>(\n\tsource: Node<T>,\n\tclient: S3ClientLike,\n\tbucket: string,\n\topts?: ToS3Options<T>,\n): BufferedSinkHandle {\n\tconst {\n\t\tformat = \"ndjson\",\n\t\tkeyGenerator = (seq: number, timestampNs: number) => {\n\t\t\tconst ms = Math.floor(timestampNs / 1_000_000);\n\t\t\tconst ts = new Date(ms).toISOString().replace(/[:.]/g, \"-\");\n\t\t\treturn `data/${ts}-${seq}.${format === \"ndjson\" ? \"ndjson\" : \"json\"}`;\n\t\t},\n\t\tbatchSize = 1000,\n\t\tflushIntervalMs = 10000,\n\t\ttransform = (v: T) => v,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tlet buffer: unknown[] = [];\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet seq = 0;\n\tlet lastFlush: Promise<void> = Promise.resolve();\n\n\tconst doFlush = (): Promise<void> => {\n\t\tif (buffer.length === 0) return Promise.resolve();\n\t\tconst batch = buffer;\n\t\tbuffer = [];\n\t\tseq += 1;\n\t\tconst body =\n\t\t\tformat === \"ndjson\"\n\t\t\t\t? `${batch.map((v) => JSON.stringify(v)).join(\"\\n\")}\\n`\n\t\t\t\t: JSON.stringify(batch);\n\t\tconst contentType = format === \"ndjson\" ? \"application/x-ndjson\" : \"application/json\";\n\t\tconst key = keyGenerator(seq, wallClockNs());\n\t\ttry {\n\t\t\tconst p: Promise<void> = client\n\t\t\t\t.putObject({ Bucket: bucket, Key: key, Body: body, ContentType: contentType })\n\t\t\t\t.then(() => {})\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue: batch,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\tlastFlush = p;\n\t\t\treturn p;\n\t\t} catch (err) {\n\t\t\tonTransportError?.({\n\t\t\t\tstage: \"send\",\n\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\tvalue: batch,\n\t\t\t});\n\t\t\treturn Promise.resolve();\n\t\t}\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (timer === undefined) {\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tdoFlush();\n\t\t\t}, flushIntervalMs);\n\t\t}\n\t};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\ttry {\n\t\t\t\t\tbuffer.push(transform(value));\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (buffer.length >= batchSize) doFlush();\n\t\t\t\telse scheduleFlush();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE || msg[0] === TEARDOWN) {\n\t\t\t\tdoFlush();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\n\tconst unsub = inner.subscribe(() => {});\n\n\tconst dispose = () => {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t\tdoFlush();\n\t\tunsub();\n\t};\n\n\treturn {\n\t\tdispose,\n\t\tflush: () => doFlush().then(() => lastFlush),\n\t};\n}\n\n// ——— toPostgres ———\n\n/** Duck-typed Postgres client (compatible with `pg.Client` / `pg.Pool`). */\nexport type PostgresClientLike = {\n\tquery(sql: string, params?: unknown[]): Promise<unknown>;\n};\n\n/** Options for {@link toPostgres}. */\nexport type ToPostgresOptions<T> = ExtraOpts & {\n\t/** Build the SQL + params for an insert. Default: JSON insert into `table`. */\n\ttoSQL?: (value: T, table: string) => { sql: string; params: unknown[] };\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * PostgreSQL sink — inserts each upstream `DATA` value as a row.\n *\n * @param source - Upstream node.\n * @param client - Postgres client with `query()`.\n * @param table - Target table name.\n * @param opts - SQL builder and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toPostgres<T>(\n\tsource: Node<T>,\n\tclient: PostgresClientLike,\n\ttable: string,\n\topts?: ToPostgresOptions<T>,\n): () => void {\n\tconst {\n\t\ttoSQL = (v: T, t: string) => ({\n\t\t\tsql: `INSERT INTO \"${t.replace(/\"/g, '\"\"')}\" (data) VALUES ($1)`,\n\t\t\tparams: [JSON.stringify(v)],\n\t\t}),\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet query: { sql: string; params: unknown[] };\n\t\t\t\ttry {\n\t\t\t\t\tquery = toSQL(value, table);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvoid client.query(query.sql, query.params).catch((err: unknown) => {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— toMongo ———\n\n/** Duck-typed MongoDB collection (compatible with `mongodb` driver). */\nexport type MongoCollectionLike = {\n\tinsertOne(doc: unknown): Promise<unknown>;\n};\n\n/** Options for {@link toMongo}. */\nexport type ToMongoOptions<T> = ExtraOpts & {\n\t/** Transform value to a MongoDB document. Default: identity. */\n\ttoDocument?: (value: T) => unknown;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * MongoDB sink — inserts each upstream `DATA` value as a document.\n *\n * @param source - Upstream node.\n * @param collection - MongoDB collection with `insertOne()`.\n * @param opts - Document transform and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toMongo<T>(\n\tsource: Node<T>,\n\tcollection: MongoCollectionLike,\n\topts?: ToMongoOptions<T>,\n): () => void {\n\tconst { toDocument = (v: T) => v, onTransportError, ...rest } = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet doc: unknown;\n\t\t\t\ttry {\n\t\t\t\t\tdoc = toDocument(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvoid collection.insertOne(doc).catch((err: unknown) => {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— toLoki ———\n\n/** Loki log stream entry. */\nexport type LokiStream = {\n\tstream: Record<string, string>;\n\tvalues: [string, string][];\n};\n\n/** Duck-typed Loki push client (HTTP push API). */\nexport type LokiClientLike = {\n\tpush(streams: { streams: LokiStream[] }): Promise<unknown>;\n};\n\n/** Options for {@link toLoki}. */\nexport type ToLokiOptions<T> = ExtraOpts & {\n\t/** Static labels applied to every log entry. */\n\tlabels?: Record<string, string>;\n\t/** Extract the log line from a value. Default: `JSON.stringify(v)`. */\n\ttoLine?: (value: T) => string;\n\t/** Extract additional labels from a value. Default: none. */\n\ttoLabels?: (value: T) => Record<string, string>;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Grafana Loki sink — pushes upstream `DATA` values as log entries.\n *\n * @param source - Upstream node.\n * @param client - Loki-compatible client with `push()`.\n * @param opts - Label, serialization, and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toLoki<T>(\n\tsource: Node<T>,\n\tclient: LokiClientLike,\n\topts?: ToLokiOptions<T>,\n): () => void {\n\tconst {\n\t\tlabels = {},\n\t\ttoLine = (v: T) => JSON.stringify(v),\n\t\ttoLabels,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet line: string;\n\t\t\t\ttry {\n\t\t\t\t\tline = toLine(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tlet streamLabels: Record<string, string>;\n\t\t\t\ttry {\n\t\t\t\t\tstreamLabels = toLabels ? { ...labels, ...toLabels(value) } : labels;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tconst ts = `${wallClockNs()}`;\n\t\t\t\tvoid client\n\t\t\t\t\t.push({ streams: [{ stream: streamLabels, values: [[ts, line]] }] })\n\t\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— toTempo ———\n\n/** Duck-typed Tempo span push client (OTLP/HTTP shape). */\nexport type TempoClientLike = {\n\tpush(payload: { resourceSpans: unknown[] }): Promise<unknown>;\n};\n\n/** Options for {@link toTempo}. */\nexport type ToTempoOptions<T> = ExtraOpts & {\n\t/** Transform a value into OTLP resourceSpans entries. */\n\ttoResourceSpans?: (value: T) => unknown[];\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Grafana Tempo sink — pushes upstream `DATA` values as trace spans.\n *\n * @param source - Upstream node.\n * @param client - Tempo-compatible client with `push()`.\n * @param opts - Span transform and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toTempo<T>(\n\tsource: Node<T>,\n\tclient: TempoClientLike,\n\topts?: ToTempoOptions<T>,\n): () => void {\n\tconst { toResourceSpans = (v: T) => [v], onTransportError, ...rest } = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet spans: unknown[];\n\t\t\t\ttry {\n\t\t\t\t\tspans = toResourceSpans(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvoid client.push({ resourceSpans: spans }).catch((err: unknown) => {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— checkpointToS3 ———\n\n/** Options for {@link checkpointToS3}. */\nexport type CheckpointToS3Options = {\n\t/** S3 key prefix. Default: `\"checkpoints/\"`. */\n\tprefix?: string;\n\t/** Debounce ms for autoCheckpoint. Default: `500`. */\n\tdebounceMs?: number;\n\t/** Full snapshot compaction interval. Default: `10`. */\n\tcompactEvery?: number;\n\tonError?: (error: unknown) => void;\n};\n\n/**\n * Wires `graph.autoCheckpoint()` to persist snapshots to S3.\n *\n * @param graph - Graph instance to checkpoint.\n * @param client - S3-compatible client with `putObject()`.\n * @param bucket - S3 bucket name.\n * @param opts - Key prefix, debounce, and compaction options.\n * @returns Dispose handle.\n *\n * @category extra\n */\nexport function checkpointToS3(\n\tgraph: {\n\t\tautoCheckpoint: (adapter: { save(data: unknown): void }, opts?: unknown) => { dispose(): void };\n\t\tname: string;\n\t},\n\tclient: S3ClientLike,\n\tbucket: string,\n\topts?: CheckpointToS3Options,\n): { dispose(): void } {\n\tconst { prefix = \"checkpoints/\", debounceMs, compactEvery, onError } = opts ?? {};\n\tconst adapter = {\n\t\tsave(data: unknown) {\n\t\t\tconst ms = Math.floor(wallClockNs() / 1_000_000);\n\t\t\tconst key = `${prefix}${graph.name}/checkpoint-${ms}.json`;\n\t\t\tlet body: string;\n\t\t\ttry {\n\t\t\t\tbody = JSON.stringify(data);\n\t\t\t} catch (err) {\n\t\t\t\tonError?.(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvoid client\n\t\t\t\t.putObject({\n\t\t\t\t\tBucket: bucket,\n\t\t\t\t\tKey: key,\n\t\t\t\t\tBody: body,\n\t\t\t\t\tContentType: \"application/json\",\n\t\t\t\t})\n\t\t\t\t.catch((err) => onError?.(err));\n\t\t},\n\t};\n\treturn graph.autoCheckpoint(adapter, { debounceMs, compactEvery, onError });\n}\n\n// ——— checkpointToRedis ———\n\n/** Duck-typed Redis client for checkpoint storage. */\nexport type RedisCheckpointClientLike = {\n\tset(key: string, value: string): Promise<unknown>;\n\tget(key: string): Promise<string | null>;\n};\n\n/** Options for {@link checkpointToRedis}. */\nexport type CheckpointToRedisOptions = {\n\t/** Key prefix. Default: `\"graphrefly:checkpoint:\"`. */\n\tprefix?: string;\n\t/** Debounce ms for autoCheckpoint. Default: `500`. */\n\tdebounceMs?: number;\n\t/** Full snapshot compaction interval. Default: `10`. */\n\tcompactEvery?: number;\n\tonError?: (error: unknown) => void;\n};\n\n/**\n * Wires `graph.autoCheckpoint()` to persist snapshots to Redis.\n *\n * @param graph - Graph instance to checkpoint.\n * @param client - Redis client with `set()`/`get()`.\n * @param opts - Key prefix, debounce, and compaction options.\n * @returns Dispose handle.\n *\n * @category extra\n */\nexport function checkpointToRedis(\n\tgraph: {\n\t\tautoCheckpoint: (adapter: { save(data: unknown): void }, opts?: unknown) => { dispose(): void };\n\t\tname: string;\n\t},\n\tclient: RedisCheckpointClientLike,\n\topts?: CheckpointToRedisOptions,\n): { dispose(): void } {\n\tconst { prefix = \"graphrefly:checkpoint:\", debounceMs, compactEvery, onError } = opts ?? {};\n\tconst key = `${prefix}${graph.name}`;\n\tconst adapter = {\n\t\tsave(data: unknown) {\n\t\t\tlet body: string;\n\t\t\ttry {\n\t\t\t\tbody = JSON.stringify(data);\n\t\t\t} catch (err) {\n\t\t\t\tonError?.(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvoid client.set(key, body).catch((err) => onError?.(err));\n\t\t},\n\t};\n\treturn graph.autoCheckpoint(adapter, { debounceMs, compactEvery, onError });\n}\n","/**\n * Checkpoint adapters and {@link Graph} save/restore helpers (roadmap §3.1).\n */\n/// <reference lib=\"dom\" />\n\nimport { randomBytes } from \"node:crypto\";\nimport { mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { COMPLETE, DATA, ERROR } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { producer } from \"../core/sugar.js\";\nimport type { Graph, GraphPersistSnapshot } from \"../graph/graph.js\";\n\nfunction sortJsonValue(value: unknown): unknown {\n\tif (value === null || typeof value !== \"object\") {\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value.map(sortJsonValue);\n\t}\n\tconst obj = value as Record<string, unknown>;\n\tconst keys = Object.keys(obj).sort();\n\tconst out: Record<string, unknown> = {};\n\tfor (const k of keys) {\n\t\tout[k] = sortJsonValue(obj[k]);\n\t}\n\treturn out;\n}\n\nfunction warnNonJsonValues(data: GraphPersistSnapshot): void {\n\tfor (const [path, node] of Object.entries(data.nodes)) {\n\t\tconst v = node.value;\n\t\tif (v === undefined || v === null) continue;\n\t\tif (typeof v === \"function\" || typeof v === \"symbol\" || typeof v === \"bigint\") {\n\t\t\tconsole.warn(\n\t\t\t\t`checkpoint: node \"${path}\" has non-JSON-serializable value (${typeof v}); it will be lost on round-trip`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction stableSnapshotJson(data: GraphPersistSnapshot): string {\n\twarnNonJsonValues(data);\n\treturn `${JSON.stringify(sortJsonValue(data), undefined, 0)}\\n`;\n}\n\n/**\n * Persists {@link GraphPersistSnapshot} blobs (single save/load contract, roadmap §3.1).\n */\nexport interface CheckpointAdapter {\n\tsave(data: GraphPersistSnapshot): void;\n\tload(): GraphPersistSnapshot | null;\n}\n\n/**\n * In-memory adapter (process-local; useful for tests).\n *\n * @category extra\n */\nexport class MemoryCheckpointAdapter implements CheckpointAdapter {\n\t#data: GraphPersistSnapshot | null = null;\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tthis.#data = JSON.parse(JSON.stringify(data)) as GraphPersistSnapshot;\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\treturn this.#data === null\n\t\t\t? null\n\t\t\t: (JSON.parse(JSON.stringify(this.#data)) as GraphPersistSnapshot);\n\t}\n}\n\n/**\n * Stores JSON-cloned snapshots under a key inside a caller-owned record (tests / embedding).\n *\n * @category extra\n */\nexport class DictCheckpointAdapter implements CheckpointAdapter {\n\treadonly #storage: Record<string, unknown>;\n\treadonly #key: string;\n\n\tconstructor(storage: Record<string, unknown>, key = \"graphrefly_checkpoint\") {\n\t\tthis.#storage = storage;\n\t\tthis.#key = key;\n\t}\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tthis.#storage[this.#key] = JSON.parse(JSON.stringify(data)) as Record<string, unknown>;\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\tconst raw = this.#storage[this.#key];\n\t\treturn raw !== null && typeof raw === \"object\" && !Array.isArray(raw)\n\t\t\t? (JSON.parse(JSON.stringify(raw)) as GraphPersistSnapshot)\n\t\t\t: null;\n\t}\n}\n\n/**\n * Atomic JSON file persistence (temp file in the target directory, then `rename`).\n *\n * @remarks\n * **Errors:** `load()` returns `null` for missing files, empty files, or invalid JSON (no throw).\n *\n * @category extra\n */\nexport class FileCheckpointAdapter implements CheckpointAdapter {\n\treadonly #path: string;\n\n\tconstructor(path: string) {\n\t\tthis.#path = path;\n\t}\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tconst dir = dirname(this.#path);\n\t\tmkdirSync(dir, { recursive: true });\n\t\tconst payload = stableSnapshotJson(data);\n\t\tconst base = basename(this.#path);\n\t\tconst tmp = join(dir, `.${base}.${randomBytes(8).toString(\"hex\")}.tmp`);\n\t\ttry {\n\t\t\twriteFileSync(tmp, payload, \"utf8\");\n\t\t\trenameSync(tmp, this.#path);\n\t\t} catch (e) {\n\t\t\ttry {\n\t\t\t\tunlinkSync(tmp);\n\t\t\t} catch {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\ttry {\n\t\t\tconst text = readFileSync(this.#path, \"utf8\").trim();\n\t\t\tif (!text) return null;\n\t\t\tconst data = JSON.parse(text) as unknown;\n\t\t\treturn data !== null && typeof data === \"object\" && !Array.isArray(data)\n\t\t\t\t? (data as GraphPersistSnapshot)\n\t\t\t\t: null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n/**\n * Persists one JSON blob under a fixed key using Node.js `node:sqlite` ({@link DatabaseSync}).\n *\n * @remarks\n * **Runtime:** Requires Node 22.5+ with `node:sqlite` enabled (experimental in some releases). Call `close()` when discarding the adapter.\n *\n * @category extra\n */\nexport class SqliteCheckpointAdapter implements CheckpointAdapter {\n\treadonly #db: DatabaseSync;\n\treadonly #key: string;\n\n\tconstructor(path: string, key = \"graphrefly_checkpoint\") {\n\t\tthis.#db = new DatabaseSync(path);\n\t\tthis.#key = key;\n\t\tthis.#db.exec(\n\t\t\t`CREATE TABLE IF NOT EXISTS graphrefly_checkpoint (k TEXT PRIMARY KEY, v TEXT NOT NULL)`,\n\t\t);\n\t}\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tconst payload = stableSnapshotJson(data).trimEnd();\n\t\tthis.#db\n\t\t\t.prepare(`INSERT OR REPLACE INTO graphrefly_checkpoint (k, v) VALUES (?, ?)`)\n\t\t\t.run(this.#key, payload);\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\tconst row = this.#db\n\t\t\t.prepare(`SELECT v FROM graphrefly_checkpoint WHERE k = ?`)\n\t\t\t.get(this.#key) as { v: string } | undefined;\n\t\tif (row === undefined || typeof row.v !== \"string\" || row.v.trim() === \"\") return null;\n\t\tconst parsed = JSON.parse(row.v) as unknown;\n\t\treturn parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)\n\t\t\t? (parsed as GraphPersistSnapshot)\n\t\t\t: null;\n\t}\n\n\t/** Close the underlying SQLite connection (safe to call more than once). */\n\tclose(): void {\n\t\ttry {\n\t\t\tthis.#db.close();\n\t\t} catch {\n\t\t\t/* ignore if already closed */\n\t\t}\n\t}\n}\n\n/**\n * Writes {@link Graph.snapshot} through `adapter.save`.\n *\n * @param graph - Target graph instance.\n * @param adapter - Sync persistence backend.\n * @returns `void` — side-effect only; the snapshot is written to `adapter`.\n *\n * @example\n * ```ts\n * import { saveGraphCheckpoint, MemoryCheckpointAdapter, Graph } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const adapter = new MemoryCheckpointAdapter();\n * saveGraphCheckpoint(g, adapter);\n * ```\n *\n * @category extra\n */\nexport function saveGraphCheckpoint(graph: Graph, adapter: CheckpointAdapter): void {\n\tadapter.save(graph.snapshot());\n}\n\n/**\n * Loads a snapshot via `adapter.load` and applies {@link Graph.restore} when data exists.\n *\n * @param graph - Graph whose topology matches the snapshot.\n * @param adapter - Sync persistence backend.\n * @returns `true` if data was present and `restore` ran; `false` if `load()` returned `null`.\n *\n * @example\n * ```ts\n * import {\n * saveGraphCheckpoint,\n * restoreGraphCheckpoint,\n * MemoryCheckpointAdapter,\n * Graph,\n * } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const adapter = new MemoryCheckpointAdapter();\n * saveGraphCheckpoint(g, adapter);\n *\n * const g2 = new Graph(\"app\");\n * restoreGraphCheckpoint(g2, adapter); // true\n * ```\n *\n * @category extra\n */\nexport function restoreGraphCheckpoint(graph: Graph, adapter: CheckpointAdapter): boolean {\n\tconst data = adapter.load();\n\tif (data === null) return false;\n\tgraph.restore(data);\n\treturn true;\n}\n\n/**\n * Minimal JSON-shaped payload for a single node's cached value (custom adapters).\n *\n * @param n - Any {@link Node}.\n * @returns `{ version: 1, value }` from {@link Node.get}.\n *\n * @example\n * ```ts\n * import { checkpointNodeValue, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const s = state(42);\n * checkpointNodeValue(s); // { version: 1, value: 42 }\n * ```\n *\n * @category extra\n */\nexport function checkpointNodeValue<T>(n: Node<T>): { version: number; value: T | undefined } {\n\treturn { version: 1, value: n.get() };\n}\n\nexport type IndexedDbCheckpointSpec = {\n\tdbName: string;\n\tstoreName: string;\n\t/** @default \"graphrefly_checkpoint\" */\n\tkey?: string;\n\tversion?: number;\n};\n\n/**\n * Wraps an `IDBRequest` as a one-shot reactive source.\n *\n * @param req - Request whose callbacks are converted to protocol messages.\n * @returns `Node<T>` that emits `DATA` once on success, then `COMPLETE`; emits `ERROR` on failure.\n *\n * @example\n * ```ts\n * import { fromIDBRequest } from \"@graphrefly/graphrefly-ts\";\n *\n * const req = indexedDB.open(\"myDb\", 1);\n * fromIDBRequest(req).subscribe((msgs) => console.log(msgs));\n * // Emits [[DATA, IDBDatabase], [COMPLETE]] on success\n * ```\n *\n * @category extra\n */\nexport function fromIDBRequest<T>(req: IDBRequest<T>): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\tlet done = false;\n\t\tconst clear = () => {\n\t\t\treq.onsuccess = null;\n\t\t\treq.onerror = null;\n\t\t};\n\t\treq.onsuccess = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[DATA, req.result], [COMPLETE]]);\n\t\t};\n\t\treq.onerror = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[ERROR, req.error ?? new Error(\"IndexedDB request failed\")]]);\n\t\t};\n\t\treturn () => {\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t};\n\t});\n}\n\n/**\n * Wraps an `IDBTransaction` terminal lifecycle as a one-shot reactive source.\n *\n * @param tx - Transaction to observe.\n * @returns `Node<void>` that emits `DATA` (`undefined`) then `COMPLETE` on success; emits `ERROR` on `error`/`abort`.\n *\n * @example\n * ```ts\n * import { fromIDBTransaction } from \"@graphrefly/graphrefly-ts\";\n *\n * const db: IDBDatabase = ...; // obtained from indexedDB.open\n * const tx = db.transaction(\"store\", \"readwrite\");\n * fromIDBTransaction(tx).subscribe((msgs) => console.log(msgs));\n * // Emits [[DATA, undefined], [COMPLETE]] when the transaction commits\n * ```\n *\n * @category extra\n */\nexport function fromIDBTransaction(tx: IDBTransaction): Node<void> {\n\treturn producer<void>((_d, a) => {\n\t\tlet done = false;\n\t\tconst clear = () => {\n\t\t\ttx.oncomplete = null;\n\t\t\ttx.onerror = null;\n\t\t\ttx.onabort = null;\n\t\t};\n\t\ttx.oncomplete = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[DATA, undefined], [COMPLETE]]);\n\t\t};\n\t\ttx.onerror = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[ERROR, tx.error ?? new Error(\"IndexedDB transaction failed\")]]);\n\t\t};\n\t\ttx.onabort = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[ERROR, tx.error ?? new Error(\"IndexedDB transaction aborted\")]]);\n\t\t};\n\t\treturn () => {\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t};\n\t});\n}\n\nfunction openIdbNode(dbName: string, storeName: string, version: number): Node<IDBDatabase> {\n\treturn producer<IDBDatabase>((_d, a) => {\n\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\ta.down([[ERROR, new TypeError(\"indexedDB is not available in this environment\")]]);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst req = indexedDB.open(dbName, version);\n\t\treq.onupgradeneeded = () => {\n\t\t\tconst db = req.result;\n\t\t\tif (!db.objectStoreNames.contains(storeName)) {\n\t\t\t\tdb.createObjectStore(storeName);\n\t\t\t}\n\t\t};\n\t\tconst unsub = fromIDBRequest(req).subscribe((msgs) => a.down(msgs));\n\t\treturn () => {\n\t\t\tunsub();\n\t\t};\n\t});\n}\n\n/**\n * Persists {@link Graph.snapshot} under `spec.key` (browser IndexedDB).\n *\n * @param graph - Graph to snapshot.\n * @param spec - Database name, object store name, optional `key` and schema `version`.\n * @returns A reactive `Node<void>` that emits `DATA` (`undefined`) then `COMPLETE` on success, or `ERROR` on failure.\n *\n * @remarks\n * **Environment:** Emits `ERROR` if `indexedDB` is undefined (e.g. Node without a polyfill).\n *\n * @example\n * ```ts\n * import { saveGraphCheckpointIndexedDb, Graph } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const save$ = saveGraphCheckpointIndexedDb(g, {\n * dbName: \"myApp\",\n * storeName: \"checkpoints\",\n * });\n * save$.subscribe((msgs) => console.log(\"saved:\", msgs));\n * ```\n *\n * @category extra\n */\nexport function saveGraphCheckpointIndexedDb(\n\tgraph: Graph,\n\tspec: IndexedDbCheckpointSpec,\n): Node<void> {\n\tconst key = spec.key ?? \"graphrefly_checkpoint\";\n\treturn producer<void>((_d, a) => {\n\t\tlet db: IDBDatabase | undefined;\n\t\tlet opUnsub: (() => void) | undefined;\n\t\tlet done = false;\n\t\tconst close = () => {\n\t\t\tif (db === undefined) return;\n\t\t\tdb.close();\n\t\t\tdb = undefined;\n\t\t};\n\t\tconst finishWith = (msgs: [symbol, unknown?][]) => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\ta.down(msgs);\n\t\t\topUnsub?.();\n\t\t\topUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t\tconst startWrite = () => {\n\t\t\tif (db === undefined || opUnsub !== undefined) return;\n\t\t\tconst tx = db.transaction(spec.storeName, \"readwrite\");\n\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\tlet reqDone = false;\n\t\t\tlet txDone = false;\n\t\t\tlet reqError: unknown;\n\t\t\tlet unsubReq: (() => void) | undefined;\n\t\t\tlet unsubTx: (() => void) | undefined;\n\t\t\tconst maybeFinish = () => {\n\t\t\t\tif (reqError !== undefined) {\n\t\t\t\t\tfinishWith([[ERROR, reqError]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!reqDone || !txDone) return;\n\t\t\t\tfinishWith([[DATA, undefined], [COMPLETE]]);\n\t\t\t};\n\t\t\tunsubReq = fromIDBRequest(store.put(graph.snapshot(), key)).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === ERROR) reqError = m[1];\n\t\t\t\t\tif (m[0] === COMPLETE || m[0] === ERROR) reqDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeFinish();\n\t\t\t});\n\t\t\tunsubTx = fromIDBTransaction(tx).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === COMPLETE) txDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeFinish();\n\t\t\t});\n\t\t\topUnsub = () => {\n\t\t\t\tunsubReq?.();\n\t\t\t\tunsubReq = undefined;\n\t\t\t\tunsubTx?.();\n\t\t\t\tunsubTx = undefined;\n\t\t\t};\n\t\t};\n\t\tconst openUnsub = openIdbNode(spec.dbName, spec.storeName, spec.version ?? 1).subscribe(\n\t\t\t(msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\t\tdb = m[1] as IDBDatabase;\n\t\t\t\t\t\tstartWrite();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\topUnsub?.();\n\t\t\topUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t});\n}\n\n/**\n * Loads a snapshot from IndexedDB and applies {@link Graph.restore} when present.\n *\n * @param graph - Graph whose topology matches the stored snapshot.\n * @param spec - Same `dbName` / `storeName` / `key` / `version` as save.\n * @returns A reactive `Node<boolean>`: emits `true` if a snapshot was restored, `false` if missing or not a plain object, then `COMPLETE`; or `ERROR` on I/O failure.\n *\n * @example\n * ```ts\n * import { restoreGraphCheckpointIndexedDb, Graph } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const restore$ = restoreGraphCheckpointIndexedDb(g, {\n * dbName: \"myApp\",\n * storeName: \"checkpoints\",\n * });\n * restore$.subscribe((msgs) => console.log(\"restored:\", msgs));\n * // Emits [[DATA, true], [COMPLETE]] if a snapshot was found and applied\n * ```\n *\n * @category extra\n */\nexport function restoreGraphCheckpointIndexedDb(\n\tgraph: Graph,\n\tspec: IndexedDbCheckpointSpec,\n): Node<boolean> {\n\tconst key = spec.key ?? \"graphrefly_checkpoint\";\n\treturn producer<boolean>((_d, a) => {\n\t\tlet db: IDBDatabase | undefined;\n\t\tlet reqUnsub: (() => void) | undefined;\n\t\tlet txUnsub: (() => void) | undefined;\n\t\tlet done = false;\n\t\tlet txDone = false;\n\t\tlet requestDone = false;\n\t\tlet requestValue: unknown;\n\t\tlet requestError: unknown;\n\t\tconst close = () => {\n\t\t\tif (db === undefined) return;\n\t\t\tdb.close();\n\t\t\tdb = undefined;\n\t\t};\n\t\tconst finishWith = (msgs: [symbol, unknown?][]) => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\ta.down(msgs);\n\t\t\treqUnsub?.();\n\t\t\treqUnsub = undefined;\n\t\t\ttxUnsub?.();\n\t\t\ttxUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t\tconst maybeEmitResult = () => {\n\t\t\tif (!requestDone || !txDone) return;\n\t\t\tif (requestError !== undefined) {\n\t\t\t\tfinishWith([[ERROR, requestError]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (requestValue === undefined || requestValue === null) {\n\t\t\t\tfinishWith([[DATA, false], [COMPLETE]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof requestValue !== \"object\" || Array.isArray(requestValue)) {\n\t\t\t\tfinishWith([[DATA, false], [COMPLETE]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgraph.restore(requestValue as GraphPersistSnapshot);\n\t\t\tfinishWith([[DATA, true], [COMPLETE]]);\n\t\t};\n\t\tconst startRead = () => {\n\t\t\tif (db === undefined || reqUnsub !== undefined || txUnsub !== undefined) return;\n\t\t\tconst tx = db.transaction(spec.storeName, \"readonly\");\n\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\treqUnsub = fromIDBRequest(store.get(key)).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === DATA) requestValue = m[1];\n\t\t\t\t\tif (m[0] === ERROR) requestError = m[1];\n\t\t\t\t\tif (m[0] === COMPLETE || m[0] === ERROR) requestDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeEmitResult();\n\t\t\t});\n\t\t\ttxUnsub = fromIDBTransaction(tx).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === COMPLETE) txDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeEmitResult();\n\t\t\t});\n\t\t};\n\t\tconst openUnsub = openIdbNode(spec.dbName, spec.storeName, spec.version ?? 1).subscribe(\n\t\t\t(msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\t\tdb = m[1] as IDBDatabase;\n\t\t\t\t\t\tstartRead();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\treqUnsub?.();\n\t\t\treqUnsub = undefined;\n\t\t\ttxUnsub?.();\n\t\t\ttxUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t});\n}\n","/**\n * Tier 1 sync operators (roadmap §2.1) and Tier 2 async/dynamic operators (roadmap §2.2) —\n * each returns a {@link Node} built with {@link node} (or {@link producer} for cold sources).\n */\n\nimport { monotonicNs } from \"../core/clock.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\ttype Message,\n\ttype Messages,\n\tPAUSE,\n\tRESOLVED,\n\tRESUME,\n} from \"../core/messages.js\";\nimport { type Node, type NodeActions, type NodeOptions, node } from \"../core/node.js\";\nimport { derived, producer } from \"../core/sugar.js\";\nimport { NS_PER_MS } from \"./backoff.js\";\nimport { fromAny, type NodeInput } from \"./sources.js\";\n\ntype ExtraOpts = Omit<NodeOptions, \"describeKind\">;\n\nfunction operatorOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"operator\", ...opts };\n}\n\n/**\n * Maps each settled value from `source` through `project`.\n *\n * @param source - Upstream node.\n * @param project - Transform for each value.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Derived node emitting mapped values.\n *\n * @example\n * ```ts\n * import { map, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = map(state(2), (x) => x * 3);\n * ```\n *\n * @category extra\n */\nexport function map<T, R>(source: Node<T>, project: (value: T) => R, opts?: ExtraOpts): Node<R> {\n\treturn derived([source as Node], ([v]) => project(v as T), operatorOpts(opts));\n}\n\n/**\n * Forwards values that satisfy `predicate`; otherwise emits `RESOLVED` with no `DATA` (two-phase semantics).\n *\n * @param source - Upstream node.\n * @param predicate - Inclusion test.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Filtered node.\n *\n * @example\n * ```ts\n * import { filter, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = filter(state(1), (x) => x > 0);\n * ```\n *\n * @category extra\n */\nexport function filter<T>(\n\tsource: Node<T>,\n\tpredicate: (value: T) => boolean,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (predicate(v as T)) return v as T;\n\t\t\ta.down([[RESOLVED]]);\n\t\t\treturn undefined;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n/**\n * Folds each upstream value into an accumulator; emits the new accumulator every time.\n *\n * Unlike RxJS, `seed` is always required — there is no seedless mode where the first\n * value silently becomes the accumulator.\n *\n * @param source - Upstream node.\n * @param reducer - `(acc, value) => nextAcc`.\n * @param seed - Initial accumulator (required).\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Scan node.\n *\n * @example\n * ```ts\n * import { scan, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = scan(state(1), (a, x) => a + x, 0);\n * ```\n *\n * @category extra\n */\nexport function scan<T, R>(\n\tsource: Node<T>,\n\treducer: (acc: R, value: T) => R,\n\tseed: R,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet acc = seed;\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tacc = reducer(acc, v as T);\n\t\t\treturn acc;\n\t\t},\n\t\t{ ...operatorOpts(opts), initial: seed, resetOnTeardown: true },\n\t);\n}\n\n/**\n * Reduces to one value emitted when `source` completes; if no `DATA` arrived, emits `seed`.\n *\n * Unlike RxJS, `seed` is always required. If the source completes without emitting\n * DATA, the seed value is emitted (RxJS would throw without a seed).\n *\n * @param source - Upstream node.\n * @param reducer - `(acc, value) => nextAcc`.\n * @param seed - Empty-completion default and initial accumulator (required).\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Node that emits once on completion.\n *\n * @example\n * ```ts\n * import { reduce, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = reduce(state(1), (a, x) => a + x, 0);\n * ```\n *\n * @category extra\n */\nexport function reduce<T, R>(\n\tsource: Node<T>,\n\treducer: (acc: R, value: T) => R,\n\tseed: R,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet acc = seed;\n\tlet sawData = false;\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tsawData = true;\n\t\t\tacc = reducer(acc, v as T);\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonResubscribe:\n\t\t\t\topts?.resubscribable === true\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\tacc = seed;\n\t\t\t\t\t\t\tsawData = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\tonMessage(msg: Message, _i: number, a) {\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tif (!sawData) acc = seed;\n\t\t\t\t\ta.emit(acc);\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits at most `count` **`DATA`** values, then **`COMPLETE`**. `RESOLVED` does not advance the counter.\n *\n * @param source - Upstream node.\n * @param count - Maximum `DATA` emissions (≤0 completes immediately).\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Limited stream.\n *\n * @example\n * ```ts\n * import { take, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = take(state(0), 3);\n * ```\n *\n * @category extra\n */\nexport function take<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T> {\n\tif (count <= 0) {\n\t\treturn node<T>(\n\t\t\t[source as Node],\n\t\t\t(_d, a) => {\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\t\t{\n\t\t\t\t...operatorOpts(opts),\n\t\t\t\tcompleteWhenDepsComplete: false,\n\t\t\t\tonMessage(msg, _i, a) {\n\t\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t}\n\tlet taken = 0;\n\tlet done = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tif (done) return undefined;\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonResubscribe:\n\t\t\t\topts?.resubscribable === true\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\ttaken = 0;\n\t\t\t\t\t\t\tdone = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tif (msg[0] === DIRTY) return false;\n\t\t\t\tif (done) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === DATA) {\n\t\t\t\t\ttaken += 1;\n\t\t\t\t\tif (taken >= count) {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\ta.emit(source.get() as T);\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === RESOLVED) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tdone = true;\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Skips the first `count` **`DATA`** emissions. `RESOLVED` does not advance the counter.\n *\n * @param source - Upstream node.\n * @param count - Number of `DATA` values to drop.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Skipped stream.\n *\n * @example\n * ```ts\n * import { skip, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = skip(state(0), 2);\n * ```\n *\n * @category extra\n */\nexport function skip<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T> {\n\tlet skipped = 0;\n\treturn node<T>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tskipped += 1;\n\t\t\t\tif (skipped <= count) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t} else {\n\t\t\t\t\ta.emit(msg[1]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Emits while `predicate` holds; on first false, sends **`COMPLETE`**.\n *\n * @param source - Upstream node.\n * @param predicate - Continuation test.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Truncated stream.\n *\n * @example\n * ```ts\n * import { takeWhile, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = takeWhile(state(1), (x) => x < 10);\n * ```\n *\n * @category extra\n */\nexport function takeWhile<T>(\n\tsource: Node<T>,\n\tpredicate: (value: T) => boolean,\n\topts?: ExtraOpts,\n): Node<T> {\n\tlet done = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (done) return undefined;\n\t\t\tif (!predicate(v as T)) {\n\t\t\t\tdone = true;\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tif (done) {\n\t\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Forwards `source` until `notifier` matches `predicate` (default: notifier **`DATA`**), then **`COMPLETE`**.\n *\n * @param source - Main upstream.\n * @param notifier - Triggers completion when `predicate(msg)` is true.\n * @param opts - Optional {@link NodeOptions}, plus `predicate` for custom notifier matching.\n * @returns `Node<T>` - Truncated stream.\n *\n * @example\n * ```ts\n * import { producer, takeUntil, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state(1);\n * const stop = producer((_d, a) => a.emit(undefined));\n * const n = takeUntil(src, stop);\n * ```\n *\n * @category extra\n */\nexport function takeUntil<T>(\n\tsource: Node<T>,\n\tnotifier: Node,\n\topts?: ExtraOpts & { predicate?: (msg: Message) => boolean },\n): Node<T> {\n\tconst pred = opts?.predicate ?? ((m: Message) => m[0] === DATA);\n\tconst { predicate: _, ...restOpts } = opts ?? {};\n\tlet stopped = false;\n\treturn node<T>(\n\t\t[source as Node, notifier],\n\t\t([v]) => {\n\t\t\tif (stopped) return undefined;\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(restOpts as ExtraOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, i, a) {\n\t\t\t\tif (stopped) {\n\t\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tif (pred(msg)) {\n\t\t\t\t\t\tstopped = true;\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits the first **`DATA`** then **`COMPLETE`** (same as `take(source, 1)`).\n *\n * @param source - Upstream node.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Single-value stream.\n *\n * @example\n * ```ts\n * import { first, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = first(state(42));\n * ```\n *\n * @category extra\n */\nexport function first<T>(source: Node<T>, opts?: ExtraOpts): Node<T> {\n\treturn take(source, 1, opts);\n}\n\n/**\n * Buffers values and emits the last **`DATA`** on **`COMPLETE`**; optional `defaultValue` if none arrived.\n *\n * @param source - Upstream node.\n * @param options - Optional {@link NodeOptions} and `defaultValue` when empty.\n * @returns `Node<T>` - Last-or-default node.\n *\n * @example\n * ```ts\n * import { last, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = last(state(1), { defaultValue: 0 });\n * ```\n *\n * @category extra\n */\nexport function last<T>(source: Node<T>, options?: ExtraOpts & { defaultValue?: T }): Node<T> {\n\tconst { defaultValue, ...rest } = options ?? {};\n\tconst useDefault = options != null && Object.hasOwn(options, \"defaultValue\");\n\tlet lastVal: T | undefined;\n\tlet has = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tlastVal = v as T;\n\t\t\thas = true;\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(rest),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tif (has) {\n\t\t\t\t\t\ta.emit(lastVal as T);\n\t\t\t\t\t} else if (useDefault) {\n\t\t\t\t\t\ta.emit(defaultValue as T);\n\t\t\t\t\t}\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits the first value matching `predicate`, then **`COMPLETE`**.\n *\n * @param source - Upstream node.\n * @param predicate - Match test.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - First-match stream.\n *\n * @example\n * ```ts\n * import { find, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = find(state(1), (x) => x > 0);\n * ```\n *\n * @category extra\n */\nexport function find<T>(\n\tsource: Node<T>,\n\tpredicate: (value: T) => boolean,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn take(filter(source, predicate, opts), 1, opts);\n}\n\n/**\n * Emits the `index`th **`DATA`** (zero-based), then **`COMPLETE`**.\n *\n * @param source - Upstream node.\n * @param index - Zero-based emission index.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Single indexed value.\n *\n * @example\n * ```ts\n * import { elementAt, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = elementAt(state(0), 2);\n * ```\n *\n * @category extra\n */\nexport function elementAt<T>(source: Node<T>, index: number, opts?: ExtraOpts): Node<T> {\n\treturn take(skip(source, index, opts), 1, opts);\n}\n\n/**\n * Prepends `initial` as **`DATA`**, then forwards every value from `source`.\n *\n * @param source - Upstream node.\n * @param initial - Value emitted before upstream.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Prefixed stream.\n *\n * @example\n * ```ts\n * import { startWith, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = startWith(state(2), 0);\n * ```\n *\n * @category extra\n */\nexport function startWith<T>(source: Node<T>, initial: T, opts?: ExtraOpts): Node<T> {\n\tlet prepended = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!prepended) {\n\t\t\t\tprepended = true;\n\t\t\t\ta.emit(initial);\n\t\t\t}\n\t\t\ta.emit(v as T);\n\t\t\treturn undefined;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n/**\n * Observer shape for {@link tap} — side effects for data, error, and/or complete.\n */\nexport type TapObserver<T> = {\n\tdata?: (value: T) => void;\n\terror?: (err: unknown) => void;\n\tcomplete?: () => void;\n};\n\n/**\n * Invokes side effects; values pass through unchanged.\n *\n * Accepts either a function (called on each DATA) or an observer object\n * `{ data?, error?, complete? }` for lifecycle-aware side effects.\n *\n * @param source - Upstream node.\n * @param fnOrObserver - Side effect function or observer object.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Passthrough node.\n *\n * @example\n * ```ts\n * import { tap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * // Function form (DATA only)\n * tap(state(1), (x) => console.log(x));\n *\n * // Observer form (DATA + ERROR + COMPLETE)\n * tap(state(1), { data: console.log, error: console.error, complete: () => console.log(\"done\") });\n * ```\n *\n * @category extra\n */\nexport function tap<T>(\n\tsource: Node<T>,\n\tfnOrObserver: ((value: T) => void) | TapObserver<T>,\n\topts?: ExtraOpts,\n): Node<T> {\n\tif (typeof fnOrObserver === \"function\") {\n\t\treturn derived(\n\t\t\t[source as Node],\n\t\t\t([v]) => {\n\t\t\t\tfnOrObserver(v as T);\n\t\t\t\treturn v as T;\n\t\t\t},\n\t\t\toperatorOpts(opts),\n\t\t);\n\t}\n\tconst obs = fnOrObserver;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tobs.data?.(v as T);\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tobs.error?.(msg[1]);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tobs.complete?.();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Suppresses adjacent duplicates using `equals` (default `Object.is`).\n *\n * @param source - Upstream node.\n * @param equals - Optional equality for consecutive values.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Deduped stream.\n *\n * @example\n * ```ts\n * import { distinctUntilChanged, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = distinctUntilChanged(state(1));\n * ```\n *\n * @category extra\n */\nexport function distinctUntilChanged<T>(\n\tsource: Node<T>,\n\tequals: (a: T, b: T) => boolean = Object.is,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn node<T>([source as Node], ([v]) => v as T, {\n\t\t...operatorOpts(opts),\n\t\tequals: equals as (a: unknown, b: unknown) => boolean,\n\t});\n}\n\n/**\n * Emits `[previous, current]` pairs starting after the second value (first pair uses `RESOLVED` only).\n *\n * @param source - Upstream node.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<readonly [T, T]>` - Pair stream.\n *\n * @example\n * ```ts\n * import { pairwise, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = pairwise(state(0));\n * ```\n *\n * @category extra\n */\nexport function pairwise<T>(source: Node<T>, opts?: ExtraOpts): Node<readonly [T, T]> {\n\tlet prev: T | undefined;\n\tlet hasPrev = false;\n\treturn node<readonly [T, T]>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tconst x = v as T;\n\t\t\tif (!hasPrev) {\n\t\t\t\tprev = x;\n\t\t\t\thasPrev = true;\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst pair = [prev as T, x] as const;\n\t\t\tprev = x;\n\t\t\treturn pair;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n/**\n * Combines the latest value from each dependency whenever any dep settles (combineLatest).\n *\n * @param sources - Nodes to combine (variadic).\n * @returns `Node<T>` - Tuple of latest values.\n *\n * @example\n * ```ts\n * import { combine, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = combine(state(1), state(\"a\"));\n * ```\n *\n * @remarks\n * Unlike RxJS `combineLatest`, this is named `combine`. Use the {@link combineLatest} alias\n * if you prefer the RxJS name. Seed is always required for `scan`/`reduce` (no seedless mode).\n *\n * @category extra\n */\nexport function combine<const T extends readonly unknown[]>(\n\t...sources: { [K in keyof T]: Node<T[K]> }\n): Node<T> {\n\tconst deps = [...sources] as unknown as Node[];\n\treturn node<T>(deps, (vals) => vals as unknown as T, operatorOpts());\n}\n\n/**\n * When `primary` settles, emits `[primary, latestSecondary]`. `secondary` alone updates cache only.\n *\n * @param primary - Main stream.\n * @param secondary - Latest value is paired on each primary emission.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<readonly [A, B]>` - Paired stream.\n *\n * @example\n * ```ts\n * import { state, withLatestFrom } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = withLatestFrom(state(1), state(\"x\"));\n * ```\n *\n * @category extra\n */\nexport function withLatestFrom<A, B>(\n\tprimary: Node<A>,\n\tsecondary: Node<B>,\n\topts?: ExtraOpts,\n): Node<readonly [A, B]> {\n\tlet latestB: B | undefined;\n\tlet hasB = false;\n\treturn node<readonly [A, B]>([primary as Node, secondary as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tonMessage(msg, i, a) {\n\t\t\tif (i === 1 && (msg[0] === DATA || msg[0] === RESOLVED)) {\n\t\t\t\tlatestB = secondary.get() as B;\n\t\t\t\thasB = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && (msg[0] === DATA || msg[0] === RESOLVED)) {\n\t\t\t\tif (!hasB) {\n\t\t\t\t\tlatestB = secondary.get() as B;\n\t\t\t\t\thasB = true;\n\t\t\t\t}\n\t\t\t\ta.emit([primary.get() as A, latestB as B]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && msg[0] === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && msg[0] === DIRTY) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE || msg[0] === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Merges **`DATA`** from any source with correct two-phase dirty tracking. **`COMPLETE`** after **all** sources complete (spec §1.3.5).\n *\n * @param sources - Nodes to merge (variadic; empty completes immediately).\n * @returns `Node<T>` - Merged stream.\n *\n * @remarks\n * **Ordering:** DIRTY/RESOLVED rules follow multi-source semantics in `~/src/graphrefly/GRAPHREFLY-SPEC.md`.\n *\n * @example\n * ```ts\n * import { merge, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = merge(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function merge<T>(...sources: readonly Node<T>[]): Node<T> {\n\tif (sources.length === 0) {\n\t\treturn producer<T>((_d, a) => {\n\t\t\ta.down([[COMPLETE]]);\n\t\t\treturn undefined;\n\t\t}, operatorOpts());\n\t}\n\tconst deps = sources as unknown as Node[];\n\tconst n = deps.length;\n\tlet completed = 0;\n\tlet dirtyMask = 0n;\n\tlet anyData = false;\n\treturn node<T>(deps, () => undefined, {\n\t\t...operatorOpts(),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tconst bit = 1n << BigInt(i);\n\t\t\tif (t === DIRTY) {\n\t\t\t\tconst wasClean = dirtyMask === 0n;\n\t\t\t\tdirtyMask |= bit;\n\t\t\t\tif (wasClean) {\n\t\t\t\t\tanyData = false;\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\tif (dirtyMask & bit) {\n\t\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\t\tif (dirtyMask === 0n && !anyData) {\n\t\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\tanyData = true;\n\t\t\t\ta.emit(msg[1]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\tcompleted += 1;\n\t\t\t\tif (completed >= n) {\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Zips one **`DATA`** from each source per cycle into a tuple. Only **`DATA`** enqueues (spec §1.3.3).\n *\n * @param sources - Nodes to zip (variadic).\n * @returns `Node<T>` - Zipped tuples.\n *\n * @example\n * ```ts\n * import { state, zip } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = zip(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function zip<const T extends readonly unknown[]>(\n\t...sources: { [K in keyof T]: Node<T[K]> }\n): Node<T> {\n\tconst n = sources.length;\n\tif (n === 0) {\n\t\treturn node<T>([], () => [] as unknown as T, operatorOpts());\n\t}\n\tconst deps = [...sources] as unknown as Node[];\n\tconst queues: unknown[][] = Array.from({ length: n }, () => []);\n\tlet dirtyMask = 0n;\n\tlet anyData = false;\n\tlet active = n;\n\n\tfunction tryEmit(a: { emit(v: T): void }) {\n\t\twhile (queues.every((q) => q.length > 0)) {\n\t\t\tconst tuple = queues.map((q) => q.shift()!) as unknown as T;\n\t\t\ta.emit(tuple);\n\t\t}\n\t}\n\n\treturn node<T>(deps, () => undefined, {\n\t\t...operatorOpts(),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tconst bit = 1n << BigInt(i);\n\t\t\tif (t === DIRTY) {\n\t\t\t\tconst wasClean = dirtyMask === 0n;\n\t\t\t\tdirtyMask |= bit;\n\t\t\t\tif (wasClean) {\n\t\t\t\t\tanyData = false;\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\tif (dirtyMask & bit) {\n\t\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\t\tif (dirtyMask === 0n) {\n\t\t\t\t\t\tif (anyData) {\n\t\t\t\t\t\t\ttryEmit(a);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\tqueues[i].push(msg[1]);\n\t\t\t\tanyData = true;\n\t\t\t\tif (dirtyMask === 0n) {\n\t\t\t\t\ttryEmit(a);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tactive -= 1;\n\t\t\t\tif (active === 0 || queues[i].length === 0) {\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Plays all of `firstSrc`, then all of `secondSrc`. **`DATA`** from `secondSrc` during phase one is buffered until handoff.\n *\n * @param firstSrc - First segment.\n * @param secondSrc - Second segment.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Concatenated stream.\n *\n * @example\n * ```ts\n * import { concat, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = concat(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function concat<T>(firstSrc: Node<T>, secondSrc: Node<T>, opts?: ExtraOpts): Node<T> {\n\tlet phase: 0 | 1 = 0;\n\tconst pending: unknown[] = [];\n\treturn node<T>([firstSrc as Node, secondSrc as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (phase === 0 && i === 1) {\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tpending.push(msg[1]);\n\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (phase === 0 && i === 0) {\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tphase = 1;\n\t\t\t\t\tfor (const v of pending) {\n\t\t\t\t\t\ta.emit(v as T);\n\t\t\t\t\t}\n\t\t\t\t\tpending.length = 0;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (phase === 1 && i === 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (phase === 1 && i === 1) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * First source to emit **`DATA`** wins; later traffic follows only the winner (Rx-style `race`).\n *\n * @param sources - Contestants (variadic; empty completes immediately; one node is identity).\n * @returns `Node<T>` - Winning stream.\n *\n * @example\n * ```ts\n * import { race, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = race(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function race<T>(...sources: readonly Node<T>[]): Node<T> {\n\tif (sources.length === 0) {\n\t\treturn producer<T>((_d, a) => {\n\t\t\ta.down([[COMPLETE]]);\n\t\t\treturn undefined;\n\t\t}, operatorOpts());\n\t}\n\tif (sources.length === 1) {\n\t\treturn node<T>([sources[0] as Node], ([v]) => v as T, operatorOpts());\n\t}\n\tconst deps = sources as unknown as Node[];\n\tlet winner: number | null = null;\n\treturn node<T>(deps, () => undefined, {\n\t\t...operatorOpts(),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (winner !== null && i !== winner) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA && winner === null) {\n\t\t\t\twinner = i;\n\t\t\t\ta.emit(msg[1]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (winner !== null && i === winner) {\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\ta.emit(msg[1]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (winner === null) {\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n// --- Tier 2: async / dynamic (roadmap §2.2), all on `node` / `producer` ---\n\nfunction forwardInner<R>(inner: Node<R>, a: NodeActions, onInnerComplete: () => void): () => void {\n\tlet unsub: (() => void) | undefined;\n\tlet finished = false;\n\tlet emitted = false;\n\tconst finish = (): void => {\n\t\tif (finished) return;\n\t\tfinished = true;\n\t\tonInnerComplete();\n\t};\n\tunsub = inner.subscribe((msgs) => {\n\t\tlet sawComplete = false;\n\t\tlet sawError = false;\n\t\tconst out: Message[] = [];\n\t\tfor (const m of msgs) {\n\t\t\tif (m[0] === DATA) emitted = true;\n\t\t\tif (m[0] === COMPLETE) sawComplete = true;\n\t\t\telse {\n\t\t\t\tif (m[0] === ERROR) sawError = true;\n\t\t\t\tout.push(m);\n\t\t\t}\n\t\t}\n\t\tif (out.length > 0) a.down(out as unknown as Messages);\n\t\tif (sawError) {\n\t\t\tunsub?.();\n\t\t\tunsub = undefined;\n\t\t\tfinish();\n\t\t} else if (sawComplete) {\n\t\t\tfinish();\n\t\t}\n\t});\n\tif (!emitted && (inner.status === \"settled\" || inner.status === \"resolved\")) {\n\t\ta.emit(inner.get() as R);\n\t}\n\tif (inner.status === \"completed\" || inner.status === \"errored\") {\n\t\tfinish();\n\t}\n\treturn () => {\n\t\tunsub?.();\n\t\tunsub = undefined;\n\t};\n}\n\n/**\n * Maps each settled value to an inner node; unsubscribes the previous inner (Rx-style `switchMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Emissions from the active inner subscription.\n * @example\n * ```ts\n * import { switchMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state(0);\n * switchMap(src, (n) => state((n as number) * 2));\n * ```\n *\n * @category extra\n */\nexport function switchMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet innerUnsub: (() => void) | undefined;\n\tlet sourceDone = false;\n\tlet attached = false;\n\n\tfunction clearInner(): void {\n\t\tinnerUnsub?.();\n\t\tinnerUnsub = undefined;\n\t}\n\n\tfunction attach(v: T, a: NodeActions): void {\n\t\tattached = true;\n\t\tclearInner();\n\t\tinnerUnsub = forwardInner(fromAny(project(v)), a, () => {\n\t\t\tclearInner();\n\t\t\tif (sourceDone) a.down([[COMPLETE]]);\n\t\t});\n\t}\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\t// Skip if onMessage already handled the initial DATA during connect.\n\t\t\tif (!attached) attach(v as T, a);\n\t\t\treturn clearInner;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearInner();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\tif (innerUnsub === undefined) a.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tattach(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Like {@link switchMap}, but ignores outer `DATA` while an inner subscription is active (`exhaustMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Emissions from the active inner while it runs.\n * @example\n * ```ts\n * import { exhaustMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * exhaustMap(state(0), () => state(1));\n * ```\n *\n * @category extra\n */\nexport function exhaustMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet innerUnsub: (() => void) | undefined;\n\tlet sourceDone = false;\n\tlet attached = false;\n\n\tfunction clearInner(): void {\n\t\tinnerUnsub?.();\n\t\tinnerUnsub = undefined;\n\t}\n\n\tfunction attach(v: T, a: NodeActions): void {\n\t\tattached = true;\n\t\tinnerUnsub = forwardInner(fromAny(project(v)), a, () => {\n\t\t\tclearInner();\n\t\t\tif (sourceDone) a.down([[COMPLETE]]);\n\t\t});\n\t}\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!attached && innerUnsub === undefined) attach(v as T, a);\n\t\t\treturn clearInner;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearInner();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\tif (innerUnsub === undefined) a.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tif (innerUnsub !== undefined) {\n\t\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tattach(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Enqueues each outer value and subscribes to inners one at a time (`concatMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Sequential concatenation of inner streams.\n * @example\n * ```ts\n * import { concatMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * concatMap(state(0), (n) => state((n as number) + 1));\n * ```\n *\n * @category extra\n */\nexport function concatMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: ExtraOpts & { maxBuffer?: number },\n): Node<R> {\n\tconst { maxBuffer: maxBuf, ...concatNodeOpts } = opts ?? {};\n\tconst queue: T[] = [];\n\tlet innerUnsub: (() => void) | undefined;\n\tlet sourceDone = false;\n\tlet attached = false;\n\n\tfunction clearInner(): void {\n\t\tinnerUnsub?.();\n\t\tinnerUnsub = undefined;\n\t}\n\n\tfunction tryPump(a: NodeActions): void {\n\t\tif (innerUnsub !== undefined) return;\n\t\tif (queue.length === 0) {\n\t\t\tif (sourceDone) a.down([[COMPLETE]]);\n\t\t\treturn;\n\t\t}\n\t\tconst v = queue.shift()!;\n\t\tinnerUnsub = forwardInner(fromAny(project(v)), a, () => {\n\t\t\tclearInner();\n\t\t\ttryPump(a);\n\t\t});\n\t}\n\n\tfunction enqueue(v: T, a: NodeActions): void {\n\t\tattached = true;\n\t\tif (maxBuf && maxBuf > 0 && queue.length >= maxBuf) queue.shift();\n\t\tqueue.push(v);\n\t\ttryPump(a);\n\t}\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!attached) enqueue(v as T, a);\n\t\t\treturn clearInner;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(concatNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearInner();\n\t\t\t\t\tqueue.length = 0;\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\ttryPump(a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tenqueue(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/** Options for {@link mergeMap}. */\nexport type MergeMapOptions = ExtraOpts & {\n\t/** Maximum number of concurrent inner subscriptions. Default: `Infinity` (unbounded). */\n\tconcurrent?: number;\n};\n\n/**\n * Subscribes to inner nodes in parallel (up to `concurrent`) and merges outputs (`mergeMap` / `flatMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional options including `concurrent` limit.\n * @returns `Node<R>` - Merged output of all active inners; completes when the outer and every inner complete.\n * @example\n * ```ts\n * import { mergeMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * // Unbounded (default)\n * mergeMap(state(0), (n) => state((n as number) + 1));\n *\n * // Limited concurrency\n * mergeMap(state(0), (n) => state((n as number) + 1), { concurrent: 3 });\n * ```\n *\n * @category extra\n */\nexport function mergeMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: MergeMapOptions,\n): Node<R> {\n\tconst { concurrent: concurrentOpt, ...mergeNodeOpts } = opts ?? {};\n\tconst maxConcurrent =\n\t\tconcurrentOpt != null && concurrentOpt > 0 ? concurrentOpt : Number.POSITIVE_INFINITY;\n\tlet active = 0;\n\tlet sourceDone = false;\n\tconst innerStops = new Set<() => void>();\n\tconst buffer: T[] = [];\n\n\tfunction tryComplete(a: NodeActions): void {\n\t\tif (sourceDone && active === 0 && buffer.length === 0) a.down([[COMPLETE]]);\n\t}\n\n\tfunction spawn(v: T, a: NodeActions): void {\n\t\tactive++;\n\t\tconst inner = fromAny(project(v));\n\t\tlet stop: (() => void) | undefined;\n\t\tconst runStop = (): void => {\n\t\t\tstop?.();\n\t\t\tif (stop !== undefined) innerStops.delete(stop);\n\t\t\tstop = undefined;\n\t\t};\n\t\tstop = inner.subscribe((msgs) => {\n\t\t\tlet sawComplete = false;\n\t\t\tconst out: Message[] = [];\n\t\t\tfor (const m of msgs) {\n\t\t\t\tif (m[0] === COMPLETE) sawComplete = true;\n\t\t\t\telse out.push(m);\n\t\t\t}\n\t\t\tif (out.length > 0) a.down(out as unknown as Messages);\n\t\t\tif (sawComplete) {\n\t\t\t\trunStop();\n\t\t\t\tactive--;\n\t\t\t\tdrainBuffer(a);\n\t\t\t\ttryComplete(a);\n\t\t\t}\n\t\t});\n\t\tinnerStops.add(stop);\n\t}\n\n\tfunction drainBuffer(a: NodeActions): void {\n\t\twhile (buffer.length > 0 && active < maxConcurrent) {\n\t\t\tspawn(buffer.shift()!, a);\n\t\t}\n\t}\n\n\tfunction enqueue(v: T, a: NodeActions): void {\n\t\tif (active < maxConcurrent) {\n\t\t\tspawn(v, a);\n\t\t} else {\n\t\t\tbuffer.push(v);\n\t\t}\n\t}\n\n\tfunction clearAll(): void {\n\t\tfor (const u of innerStops) u();\n\t\tinnerStops.clear();\n\t\tactive = 0;\n\t\tbuffer.length = 0;\n\t}\n\n\tlet attached = false;\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!attached) {\n\t\t\t\tattached = true;\n\t\t\t\tenqueue(v as T, a);\n\t\t\t}\n\t\t\treturn clearAll;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(mergeNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearAll();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\ttryComplete(a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tenqueue(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * RxJS-named alias for {@link mergeMap} — projects each `DATA` to an inner node and merges outputs.\n *\n * @param source - Upstream node.\n * @param project - Returns an inner `Node<R>` per value.\n * @param opts - Optional concurrency cap and node options (excluding `describeKind`).\n * @returns Merged projection; behavior matches `mergeMap`.\n *\n * @example\n * ```ts\n * import { flatMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * flatMap(state(0), (n) => state(n));\n * ```\n *\n * @category extra\n */\nexport const flatMap = mergeMap;\n\n/**\n * Delays phase-2 emissions by `ms` (timers). `DIRTY` still forwards immediately.\n *\n * @param source - Upstream node.\n * @param ms - Delay in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Same values, shifted in time.\n * @example\n * ```ts\n * import { delay, state } from \"@graphrefly/graphrefly-ts\";\n *\n * delay(state(1), 100);\n * ```\n *\n * @category extra\n */\nexport function delay<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T> {\n\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\tfunction clearAll(): void {\n\t\tfor (const id of timers) clearTimeout(id);\n\t\ttimers.clear();\n\t}\n\treturn node<T>([source as Node], () => clearAll, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DIRTY || t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {\n\t\t\t\tif (t === COMPLETE) clearAll();\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tconst id = setTimeout(() => {\n\t\t\t\t\ttimers.delete(id);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t}, ms);\n\t\t\t\ttimers.add(id);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Emits the latest value only after `ms` quiet time since the last trigger (`debounce`).\n *\n * @param source - Upstream node.\n * @param ms - Quiet window in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Debounced stream.\n * @example\n * ```ts\n * import { debounce, state } from \"@graphrefly/graphrefly-ts\";\n *\n * debounce(state(0), 50);\n * ```\n *\n * @category extra\n */\nexport function debounce<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T> {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet pending: T | undefined;\n\tfunction clearTimer(): void {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t}\n\treturn node<T>([source as Node], () => clearTimer, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR || t === PAUSE || t === RESUME) {\n\t\t\t\tclearTimer();\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tif (timer !== undefined) {\n\t\t\t\t\tclearTimer();\n\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tclearTimer();\n\t\t\t\tpending = msg[1] as T;\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t}, ms);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\nexport type ThrottleOptions = { leading?: boolean; trailing?: boolean };\n\n/**\n * Rate-limits emissions to at most once per `ms` window (`throttleTime`).\n *\n * @param source - Upstream node.\n * @param ms - Minimum spacing in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`) plus `leading` / `trailing`.\n * @returns `Node<T>` - Throttled stream.\n * @example\n * ```ts\n * import { throttle, state } from \"@graphrefly/graphrefly-ts\";\n *\n * throttle(state(0), 1_000, { trailing: false });\n * ```\n *\n * @category extra\n */\nexport function throttle<T>(\n\tsource: Node<T>,\n\tms: number,\n\topts?: ExtraOpts & ThrottleOptions,\n): Node<T> {\n\tconst { leading: leadingOpt, trailing: trailingOpt, ...throttleNodeOpts } = opts ?? {};\n\tconst leading = leadingOpt !== false;\n\tconst trailing = trailingOpt === true;\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tconst windowNs = ms * NS_PER_MS;\n\tlet lastEmitNs = -Infinity;\n\tlet pending: T | undefined;\n\tlet hasPending = false;\n\n\tfunction clearTimer(): void {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t}\n\n\treturn node<T>(\n\t\t[source as Node],\n\t\t() => {\n\t\t\tclearTimer();\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(throttleNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {\n\t\t\t\t\tclearTimer();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tconst v = msg[1] as T;\n\t\t\t\t\tconst nowNs = monotonicNs();\n\t\t\t\t\tif (leading && nowNs - lastEmitNs >= windowNs) {\n\t\t\t\t\t\tlastEmitNs = nowNs;\n\t\t\t\t\t\ta.emit(v);\n\t\t\t\t\t\tclearTimer();\n\t\t\t\t\t\tif (trailing) {\n\t\t\t\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\t\t\t\ttimer = undefined;\n\t\t\t\t\t\t\t\tif (hasPending) {\n\t\t\t\t\t\t\t\t\tlastEmitNs = monotonicNs();\n\t\t\t\t\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t\t\t\t\t\thasPending = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, ms);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (trailing) {\n\t\t\t\t\t\tpending = v;\n\t\t\t\t\t\thasPending = true;\n\t\t\t\t\t\tif (timer === undefined) {\n\t\t\t\t\t\t\tconst elapsedMs = (nowNs - lastEmitNs) / NS_PER_MS;\n\t\t\t\t\t\t\ttimer = setTimeout(\n\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\ttimer = undefined;\n\t\t\t\t\t\t\t\t\tif (hasPending) {\n\t\t\t\t\t\t\t\t\t\tlastEmitNs = monotonicNs();\n\t\t\t\t\t\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t\t\t\t\t\t\thasPending = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tMath.max(0, ms - elapsedMs),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits the most recent source value whenever `notifier` settles (`sample`).\n *\n * @param source - Node whose latest value is sampled.\n * @param notifier - When this node settles (`DATA` / `RESOLVED`), a sample is taken.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Sampled snapshots of `source`.\n * @remarks **Undefined payload:** If `T` includes `undefined`, `get() === undefined` is treated as “no snapshot” and the operator emits `RESOLVED` instead of `DATA`.\n * @example\n * ```ts\n * import { sample, state } from \"@graphrefly/graphrefly-ts\";\n *\n * sample(state(1), state(0));\n * ```\n *\n * @category extra\n */\nexport function sample<T>(source: Node<T>, notifier: Node<unknown>, opts?: ExtraOpts): Node<T> {\n\treturn node<T>([source as Node, notifier as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === DATA) {\n\t\t\t\t// Emit the latest source value when notifier fires.\n\t\t\t\t// `undefined` is a valid value (Node<void>); always emit.\n\t\t\t\ta.emit((source as Node<T>).get() as T);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === RESOLVED) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * After each source `DATA`, waits `ms` then emits the latest value if another `DATA` has not arrived (`auditTime` / trailing window).\n *\n * @param source - Upstream node.\n * @param ms - Window in milliseconds after each `DATA`.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Trailing-edge sampled stream.\n * @example\n * ```ts\n * import { audit, state } from \"@graphrefly/graphrefly-ts\";\n *\n * audit(state(0), 100);\n * ```\n *\n * @category extra\n */\nexport function audit<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T> {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet latest: T | undefined;\n\tlet has = false;\n\n\tfunction clearTimer(): void {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t}\n\n\treturn node<T>([source as Node], () => clearTimer, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {\n\t\t\t\tclearTimer();\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tlatest = msg[1] as T;\n\t\t\t\thas = true;\n\t\t\t\tclearTimer();\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t\tif (has) {\n\t\t\t\t\t\thas = false;\n\t\t\t\t\t\ta.emit(latest as T);\n\t\t\t\t\t}\n\t\t\t\t}, ms);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Errors if no `DATA` arrives within `ms` after subscribe or after the previous `DATA`.\n *\n * @param source - Upstream node.\n * @param ms - Idle budget in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`) and `with` for a custom error payload.\n * @returns `Node<T>` - Pass-through with idle watchdog.\n * @example\n * ```ts\n * import { timeout, state } from \"@graphrefly/graphrefly-ts\";\n *\n * timeout(state(0), 5_000);\n * ```\n *\n * @category extra\n */\nexport function timeout<T>(\n\tsource: Node<T>,\n\tms: number,\n\topts?: ExtraOpts & { with?: unknown },\n): Node<T> {\n\tconst { with: withPayload, ...timeoutNodeOpts } = opts ?? {};\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tconst err = withPayload ?? new Error(\"timeout\");\n\n\tfunction arm(a: NodeActions): void {\n\t\tclearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = undefined;\n\t\t\ta.down([[ERROR, err]]);\n\t\t}, ms);\n\t}\n\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([_v], a) => {\n\t\t\tarm(a);\n\t\t\treturn () => clearTimeout(timer);\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(timeoutNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tarm(a);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY || t === RESOLVED) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Buffers source `DATA` values; flushes an array when `notifier` settles (`buffer`).\n *\n * @param source - Upstream node.\n * @param notifier - Flush trigger on each settlement.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T[]>` - Emits buffered arrays (may be empty-handled via `RESOLVED` when nothing buffered).\n * @example\n * ```ts\n * import { buffer, state } from \"@graphrefly/graphrefly-ts\";\n *\n * buffer(state(0), state(0));\n * ```\n *\n * @category extra\n */\nexport function buffer<T>(source: Node<T>, notifier: Node<unknown>, opts?: ExtraOpts): Node<T[]> {\n\tconst buf: T[] = [];\n\treturn node<T[]>([source as Node, notifier as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 0) {\n\t\t\t\tif (buf.length > 0) a.emit([...buf]);\n\t\t\t\tbuf.length = 0;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 1) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && t === DATA) {\n\t\t\t\tbuf.push(msg[1] as T);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === DATA) {\n\t\t\t\tif (buf.length > 0) {\n\t\t\t\t\ta.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t} else {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === RESOLVED) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && (t === DIRTY || t === RESOLVED)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Batches consecutive `DATA` values into arrays of length `count` (`bufferCount` / `windowCount`).\n *\n * @param source - Upstream node.\n * @param count - Buffer size before emit; must be > 0.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T[]>` - Emits fixed-size arrays; remainder flushes on `COMPLETE`.\n * @example\n * ```ts\n * import { bufferCount, state } from \"@graphrefly/graphrefly-ts\";\n *\n * bufferCount(state(0), 3);\n * ```\n *\n * @category extra\n */\nexport function bufferCount<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T[]> {\n\tif (count <= 0) throw new RangeError(\"bufferCount expects count > 0\");\n\tconst buf: T[] = [];\n\tlet started = false;\n\treturn node<T[]>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\t// onMessage intercepts subsequent DATA; compute fn only runs on initial connect.\n\t\t\tif (!started) {\n\t\t\t\tstarted = true;\n\t\t\t\tbuf.push(v as T);\n\t\t\t\tif (buf.length >= count) {\n\t\t\t\t\ta.emit(buf.splice(0, buf.length));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tif (buf.length > 0) a.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tbuf.push(msg[1] as T);\n\t\t\t\t\tif (buf.length >= count) {\n\t\t\t\t\t\ta.emit(buf.splice(0, buf.length));\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Splits source `DATA` into sub-nodes of `count` values each. Each sub-node completes after `count` items or when source completes.\n *\n * @param source - Upstream node.\n * @param count - Items per window.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<Node<T>>` - Each emission is a sub-node carrying that window's values.\n *\n * @example\n * ```ts\n * import { windowCount, state } from \"@graphrefly/graphrefly-ts\";\n *\n * windowCount(state(0), 3);\n * ```\n *\n * @category extra\n */\nexport function windowCount<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<Node<T>> {\n\tif (count <= 0) throw new RangeError(\"windowCount expects count > 0\");\n\tlet win: Node<T> | undefined;\n\tlet winDown: ((msgs: Messages) => void) | undefined;\n\tlet n = 0;\n\n\tfunction openWindow(a: NodeActions): void {\n\t\tconst s = producer<T>((_d, actions) => {\n\t\t\twinDown = actions.down.bind(actions);\n\t\t\treturn () => {\n\t\t\t\twinDown = undefined;\n\t\t\t};\n\t\t}, operatorOpts());\n\t\twin = s;\n\t\tn = 0;\n\t\ta.emit(s);\n\t}\n\n\treturn node<Node<T>>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DATA) {\n\t\t\t\tif (!win) openWindow(a);\n\t\t\t\twinDown?.([[DATA, msg[1]]]);\n\t\t\t\tn += 1;\n\t\t\t\tif (n >= count) {\n\t\t\t\t\twinDown?.([[COMPLETE]]);\n\t\t\t\t\twin = undefined;\n\t\t\t\t\twinDown = undefined;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\twinDown?.([[COMPLETE]]);\n\t\t\t\twin = undefined;\n\t\t\t\twinDown = undefined;\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\twinDown?.([msg]);\n\t\t\t\twin = undefined;\n\t\t\t\twinDown = undefined;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Flushes buffered `DATA` values every `ms` (`bufferTime` / `windowTime`).\n *\n * @param source - Upstream node.\n * @param ms - Flush interval in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T[]>` - Time-windowed batches.\n * @example\n * ```ts\n * import { bufferTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * bufferTime(state(0), 250);\n * ```\n *\n * @category extra\n */\nexport function bufferTime<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T[]> {\n\tconst buf: T[] = [];\n\tlet iv: ReturnType<typeof setInterval> | undefined;\n\treturn node<T[]>(\n\t\t[source as Node],\n\t\t(_deps, a) => {\n\t\t\tiv = setInterval(() => {\n\t\t\t\tif (buf.length > 0) {\n\t\t\t\t\ta.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t}\n\t\t\t}, ms);\n\t\t\treturn () => {\n\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\t\tif (buf.length > 0) a.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tbuf.push(msg[1] as T);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Splits source `DATA` into time-windowed sub-nodes; each window lasts `ms`.\n *\n * @param source - Upstream node.\n * @param ms - Window duration in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<Node<T>>` - Each emission is a sub-node carrying that window's values.\n *\n * @example\n * ```ts\n * import { windowTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * windowTime(state(0), 500);\n * ```\n *\n * @category extra\n */\nexport function windowTime<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<Node<T>> {\n\tlet winDown: ((msgs: Messages) => void) | undefined;\n\tlet iv: ReturnType<typeof setInterval> | undefined;\n\n\tfunction closeWindow(): void {\n\t\twinDown?.([[COMPLETE]]);\n\t\twinDown = undefined;\n\t}\n\n\treturn node<Node<T>>(\n\t\t[source as Node],\n\t\t(_deps, a) => {\n\t\t\tfunction openWindow(): void {\n\t\t\t\tconst s = producer<T>((_d, actions) => {\n\t\t\t\t\twinDown = actions.down.bind(actions);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\twinDown = undefined;\n\t\t\t\t\t};\n\t\t\t\t}, operatorOpts());\n\t\t\t\ta.emit(s);\n\t\t\t}\n\t\t\topenWindow();\n\t\t\tiv = setInterval(() => {\n\t\t\t\tcloseWindow();\n\t\t\t\topenWindow();\n\t\t\t}, ms);\n\t\t\treturn () => {\n\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\tcloseWindow();\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\twinDown?.([[DATA, msg[1]]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\t\tcloseWindow();\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\t\twinDown?.([msg]);\n\t\t\t\t\tcloseWindow();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Splits source `DATA` into sub-nodes, opening a new window each time `notifier` emits `DATA`.\n *\n * @param source - Upstream node.\n * @param notifier - Each `DATA` from `notifier` closes the current window and opens a new one.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<Node<T>>` - Each emission is a sub-node carrying that window's values.\n *\n * @example\n * ```ts\n * import { state, window } from \"@graphrefly/graphrefly-ts\";\n *\n * window(state(0), state(0));\n * ```\n *\n * @category extra\n */\nexport function window<T>(\n\tsource: Node<T>,\n\tnotifier: Node<unknown>,\n\topts?: ExtraOpts,\n): Node<Node<T>> {\n\tlet win: Node<T> | undefined;\n\tlet winDown: ((msgs: Messages) => void) | undefined;\n\n\tfunction closeWindow(): void {\n\t\twinDown?.([[COMPLETE]]);\n\t\twin = undefined;\n\t\twinDown = undefined;\n\t}\n\n\treturn node<Node<T>>([source as Node, notifier as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (i === 0 && t === DATA) {\n\t\t\t\tif (!win) {\n\t\t\t\t\tconst s = producer<T>((_d, actions) => {\n\t\t\t\t\t\twinDown = actions.down.bind(actions);\n\t\t\t\t\t\treturn () => {\n\t\t\t\t\t\t\twinDown = undefined;\n\t\t\t\t\t\t};\n\t\t\t\t\t}, operatorOpts());\n\t\t\t\t\twin = s;\n\t\t\t\t\ta.emit(s);\n\t\t\t\t}\n\t\t\t\twinDown?.([[DATA, msg[1]]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === DATA) {\n\t\t\t\tcloseWindow();\n\t\t\t\tconst s = producer<T>((_d, actions) => {\n\t\t\t\t\twinDown = actions.down.bind(actions);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\twinDown = undefined;\n\t\t\t\t\t};\n\t\t\t\t}, operatorOpts());\n\t\t\t\twin = s;\n\t\t\t\ta.emit(s);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 0) {\n\t\t\t\tcloseWindow();\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 1) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\twinDown?.([msg]);\n\t\t\t\twin = undefined;\n\t\t\t\twinDown = undefined;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && (t === DIRTY || t === RESOLVED)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === RESOLVED) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Increments on each tick (`interval`); uses `setInterval` via {@link producer}.\n *\n * @param periodMs - Time between ticks.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<number>` - Emits `0`, `1`, `2`, … while subscribed.\n * @example\n * ```ts\n * import { interval } from \"@graphrefly/graphrefly-ts\";\n *\n * interval(1_000);\n * ```\n *\n * @category extra\n */\nexport function interval(periodMs: number, opts?: ExtraOpts): Node<number> {\n\tlet n = 0;\n\treturn producer<number>((_d, a) => {\n\t\tconst id = setInterval(() => {\n\t\t\ta.emit(n);\n\t\t\tn += 1;\n\t\t}, periodMs);\n\t\treturn () => clearInterval(id);\n\t}, operatorOpts(opts));\n}\n\n/**\n * Subscribes to `source` repeatedly (`count` times, sequentially). Best with a fresh or `resubscribable` source.\n *\n * @param source - Upstream node to replay.\n * @param count - Number of subscription rounds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Forwards each round then completes after the last inner `COMPLETE`.\n * @example\n * ```ts\n * import { repeat, state } from \"@graphrefly/graphrefly-ts\";\n *\n * repeat(state(1, { resubscribable: true }), 2);\n * ```\n *\n * @category extra\n */\nexport function repeat<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T> {\n\tif (count <= 0) throw new RangeError(\"repeat expects count > 0\");\n\treturn producer<T>((_d, a) => {\n\t\tlet remaining = count;\n\t\tlet innerU: (() => void) | undefined;\n\n\t\tconst start = (): void => {\n\t\t\tinnerU?.();\n\t\t\tinnerU = source.subscribe((msgs) => {\n\t\t\t\tlet completed = false;\n\t\t\t\tconst fwd: Message[] = [];\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === COMPLETE) completed = true;\n\t\t\t\t\telse fwd.push(m);\n\t\t\t\t}\n\t\t\t\tif (fwd.length > 0) a.down(fwd as unknown as Messages);\n\t\t\t\tif (completed) {\n\t\t\t\t\tinnerU?.();\n\t\t\t\t\tinnerU = undefined;\n\t\t\t\t\tremaining -= 1;\n\t\t\t\t\tif (remaining > 0) start();\n\t\t\t\t\telse a.down([[COMPLETE]]);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tstart();\n\t\treturn () => {\n\t\t\tinnerU?.();\n\t\t};\n\t}, operatorOpts(opts));\n}\n\n/**\n * While `PAUSE` is in effect, buffers `DIRTY` / `DATA` / `RESOLVED`; flushes on `RESUME`.\n *\n * @param source - Upstream node.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Pass-through with pause buffering.\n * @example\n * ```ts\n * import { pausable, state, PAUSE, RESUME } from \"@graphrefly/graphrefly-ts\";\n *\n * const s = state(0);\n * pausable(s);\n * s.down([[PAUSE]]);\n * s.down([[RESUME]]);\n * ```\n *\n * @category extra\n */\nexport function pausable<T>(source: Node<T>, opts?: ExtraOpts): Node<T> {\n\tlet paused = false;\n\tconst backlog: Message[] = [];\n\n\treturn node<T>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === PAUSE) {\n\t\t\t\tpaused = true;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESUME) {\n\t\t\t\tpaused = false;\n\t\t\t\ta.down([msg]);\n\t\t\t\tfor (const m of backlog) a.down([m]);\n\t\t\t\tbacklog.length = 0;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (paused && (t === DIRTY || t === DATA || t === RESOLVED)) {\n\t\t\t\tbacklog.push(msg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Replaces an upstream `ERROR` with a recovered value (`catchError`-style).\n *\n * @param source - Upstream node.\n * @param recover - Maps the error payload to a replacement value; if it throws, `ERROR` is forwarded.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Recovered stream.\n * @example\n * ```ts\n * import { rescue, state } from \"@graphrefly/graphrefly-ts\";\n *\n * rescue(state(0), () => 0);\n * ```\n *\n * @category extra\n */\nexport function rescue<T>(\n\tsource: Node<T>,\n\trecover: (err: unknown) => T,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn node<T>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tif (msg[0] === ERROR) {\n\t\t\t\ttry {\n\t\t\t\t\ta.emit(recover(msg[1]));\n\t\t\t\t} catch (err) {\n\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Forwards upstream `DATA` only while `control.get()` is truthy; when closed, emits `RESOLVED`\n * instead of repeating the last value (value-level gate). For protocol pause/resume, use {@link pausable}.\n *\n * @param source - Upstream value node.\n * @param control - Boolean node; when falsy, output stays “closed” for that tick.\n * @param opts - Optional node options (excluding `describeKind`).\n * @returns `Node<T>` gated by `control`.\n *\n * @example\n * ```ts\n * import { gate, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const data = state(1);\n * const open = state(true);\n * gate(data, open);\n * ```\n *\n * @category extra\n */\nexport function gate<T>(source: Node<T>, control: Node<boolean>, opts?: ExtraOpts): Node<T> {\n\treturn node<T>(\n\t\t[source as Node, control as Node],\n\t\t(_deps, a) => {\n\t\t\tconst v = (source as Node).get();\n\t\t\tconst c = (control as Node).get();\n\t\t\tif (!c) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn v as T;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n// ——————————————————————————————————————————————————————————————\n// RxJS-compatible aliases — improve AI code-generation accuracy\n// ——————————————————————————————————————————————————————————————\n\n/**\n * RxJS-named alias for {@link combine} — emits when any dep updates with latest tuple of values.\n *\n * @param sources - Upstream nodes as separate arguments (same calling shape as `combine`).\n * @returns Combined node; signature matches `combine`.\n *\n * @example\n * ```ts\n * import { combineLatest, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = combineLatest(state(1), state(\"a\"));\n * ```\n *\n * @category extra\n */\nexport const combineLatest = combine;\n\n/**\n * RxJS-named alias for {@link debounce} — drops rapid `DATA` until `ms` of quiet.\n *\n * @param source - Upstream node.\n * @param ms - Quiet period in milliseconds.\n * @param opts - Optional node options (excluding `describeKind`).\n * @returns Debounced node; behavior matches `debounce`.\n *\n * @example\n * ```ts\n * import { debounceTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * debounceTime(state(0), 100);\n * ```\n *\n * @category extra\n */\nexport const debounceTime = debounce;\n\n/**\n * RxJS-named alias for {@link throttle} — emits on leading/trailing edges within `ms`.\n *\n * @param source - Upstream node.\n * @param ms - Minimum spacing in milliseconds.\n * @param opts - Optional throttle shape (`leading` / `trailing`) and node options.\n * @returns Throttled node; behavior matches `throttle`.\n *\n * @example\n * ```ts\n * import { throttleTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * throttleTime(state(0), 100);\n * ```\n *\n * @category extra\n */\nexport const throttleTime = throttle;\n\n/**\n * RxJS-named alias for {@link rescue} — replaces upstream `ERROR` with a recovered value.\n *\n * @param source - Upstream node.\n * @param recover - Maps error payload to replacement value.\n * @param opts - Optional node options (excluding `describeKind`).\n * @returns Recovered stream; behavior matches `rescue`.\n *\n * @example\n * ```ts\n * import { catchError, state } from \"@graphrefly/graphrefly-ts\";\n *\n * catchError(state(0), () => 0);\n * ```\n *\n * @category extra\n */\nexport const catchError = rescue;\n","/**\n * Reactive key–value map (roadmap §3.2) — versioned snapshots (`reactive-base`) and a manual\n * {@link state} node.\n */\nimport { batch } from \"../core/batch.js\";\nimport { monotonicNs } from \"../core/clock.js\";\nimport { DATA, DIRTY } from \"../core/messages.js\";\nimport type { Node, NodeOptions } from \"../core/node.js\";\nimport { state } from \"../core/sugar.js\";\nimport { bumpVersion, snapshotEqualsVersion, type Versioned } from \"./reactive-base.js\";\n\ntype MapEntry<V> = { value: V; expiresAt?: number };\n\nexport type ReactiveMapSnapshot<K, V> = Versioned<{ map: ReadonlyMap<K, V> }>;\n\nexport type ReactiveMapOptions = {\n\t/** Optional registry name for `describe()` / debugging. */\n\tname?: string;\n\t/** When set, evicts least-recently-used keys after inserts that exceed this size. */\n\tmaxSize?: number;\n\t/** Default TTL in seconds. Used when `set` omits per-call `ttl`. */\n\tdefaultTtl?: number;\n} & Omit<NodeOptions, \"initial\" | \"describeKind\" | \"equals\">;\n\nexport type ReactiveMapBundle<K, V> = {\n\t/** Emits {@link ReactiveMapSnapshot} on each structural change (two-phase). */\n\tnode: Node<ReactiveMapSnapshot<K, V>>;\n\tget: (key: K) => V | undefined;\n\tset: (key: K, value: V, opts?: { ttl?: number }) => void;\n\tdelete: (key: K) => void;\n\tclear: () => void;\n\thas: (key: K) => boolean;\n\treadonly size: number;\n\t/** Removes expired entries (monotonic clock), emitting if the visible map changes. */\n\tpruneExpired: () => void;\n};\n\nfunction emptySnapshot<K, V>(): ReactiveMapSnapshot<K, V> {\n\treturn { version: 0, value: { map: new Map() } };\n}\n\nfunction isExpired(e: MapEntry<unknown>, now: number): boolean {\n\treturn e.expiresAt !== undefined && now >= e.expiresAt;\n}\n\nfunction buildMap<K, V>(store: Map<K, MapEntry<V>>, now: number): Map<K, V> {\n\tconst out = new Map<K, V>();\n\tfor (const [k, e] of store) {\n\t\tif (!isExpired(e, now)) out.set(k, e.value);\n\t}\n\treturn out;\n}\n\n/**\n * Creates a reactive `Map` with optional per-key TTL and optional LRU max size.\n *\n * @param options - Node options plus `maxSize` / `defaultTtl` (seconds).\n * @returns `ReactiveMapBundle` — imperative `get` / `set` / `delete` / `clear` / `pruneExpired` and a `node` emitting versioned readonly map snapshots.\n *\n * @remarks\n * **TTL:** Expiry is checked on `get`, `has`, `size`, `pruneExpired`, and before each\n * snapshot emission (expired keys are pruned first). There is no\n * background timer; monotonic-clock–expired keys may still appear in the last-emitted\n * snapshot on `node` until a read or `pruneExpired` removes them.\n * Uses `monotonicNs()` — immune to wall-clock adjustments.\n *\n * **LRU:** Uses native `Map` insertion order — `get` / `has` refreshes position; under\n * `maxSize` pressure the first key in iteration order is evicted. When `maxSize` is\n * omitted or is less than 1, no size-based eviction runs.\n *\n * @example\n * ```ts\n * import { reactiveMap } from \"@graphrefly/graphrefly-ts\";\n *\n * const m = reactiveMap<string, number>({ name: \"cache\", maxSize: 100, defaultTtl: 60 });\n * m.set(\"x\", 1);\n * m.node.subscribe((msgs) => {\n * console.log(msgs);\n * });\n * ```\n *\n * @category extra\n */\nexport function reactiveMap<K, V>(options: ReactiveMapOptions = {}): ReactiveMapBundle<K, V> {\n\tconst { name, maxSize, defaultTtl, ...nodeOpts } = options;\n\tconst store = new Map<K, MapEntry<V>>();\n\n\tlet current = emptySnapshot<K, V>();\n\n\tconst n = state<ReactiveMapSnapshot<K, V>>(current, {\n\t\t...nodeOpts,\n\t\tname,\n\t\tdescribeKind: \"state\",\n\t\tequals: snapshotEqualsVersion,\n\t});\n\n\tfunction pruneExpiredInternal(): boolean {\n\t\tconst now = monotonicNs();\n\t\tlet removed = false;\n\t\tfor (const [k, e] of store) {\n\t\t\tif (isExpired(e, now)) {\n\t\t\t\tstore.delete(k);\n\t\t\t\tremoved = true;\n\t\t\t}\n\t\t}\n\t\treturn removed;\n\t}\n\n\tfunction evictLruWhileOver(): void {\n\t\tif (maxSize === undefined || maxSize < 1) return;\n\t\twhile (store.size > maxSize) {\n\t\t\tconst first = store.keys().next().value as K | undefined;\n\t\t\tif (first === undefined) break;\n\t\t\tstore.delete(first);\n\t\t}\n\t}\n\n\tfunction pushSnapshot(): void {\n\t\tpruneExpiredInternal();\n\t\tconst now = monotonicNs();\n\t\tconst map = buildMap(store, now) as ReadonlyMap<K, V>;\n\t\tconst nv = n.v;\n\t\tcurrent = bumpVersion(current, { map }, nv ? { id: nv.id, version: nv.version } : undefined);\n\t\tbatch(() => {\n\t\t\tn.down([[DIRTY]]);\n\t\t\tn.down([[DATA, current]]);\n\t\t});\n\t}\n\n\tfunction touchLru(key: K): void {\n\t\tconst e = store.get(key);\n\t\tif (e === undefined) return;\n\t\tstore.delete(key);\n\t\tstore.set(key, e);\n\t}\n\n\tconst bundle: ReactiveMapBundle<K, V> = {\n\t\tnode: n,\n\n\t\tget(key: K): V | undefined {\n\t\t\tconst now = monotonicNs();\n\t\t\tconst e = store.get(key);\n\t\t\tif (e === undefined) return undefined;\n\t\t\tif (isExpired(e, now)) {\n\t\t\t\tstore.delete(key);\n\t\t\t\tpushSnapshot();\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\ttouchLru(key);\n\t\t\treturn e.value;\n\t\t},\n\n\t\tset(key: K, value: V, setOpts?: { ttl?: number }): void {\n\t\t\tpruneExpiredInternal();\n\t\t\tconst ttlSec = setOpts?.ttl ?? defaultTtl;\n\t\t\tif (ttlSec !== undefined && ttlSec <= 0) {\n\t\t\t\tthrow new RangeError(`reactiveMap: ttl must be positive (got ${ttlSec})`);\n\t\t\t}\n\t\t\tconst expiresAt = ttlSec !== undefined ? monotonicNs() + ttlSec * 1_000_000_000 : undefined;\n\t\t\tif (store.has(key)) store.delete(key);\n\t\t\tstore.set(key, { value, expiresAt });\n\t\t\tevictLruWhileOver();\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tdelete(key: K): void {\n\t\t\tif (!store.delete(key)) return;\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (store.size === 0) return;\n\t\t\tstore.clear();\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\thas(key: K): boolean {\n\t\t\tconst now = monotonicNs();\n\t\t\tconst e = store.get(key);\n\t\t\tif (e === undefined) return false;\n\t\t\tif (isExpired(e, now)) {\n\t\t\t\tstore.delete(key);\n\t\t\t\tpushSnapshot();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttouchLru(key);\n\t\t\treturn true;\n\t\t},\n\n\t\tget size(): number {\n\t\t\tpruneExpiredInternal();\n\t\t\treturn store.size;\n\t\t},\n\n\t\tpruneExpired(): void {\n\t\t\tif (!pruneExpiredInternal()) return;\n\t\t\tpushSnapshot();\n\t\t},\n\t};\n\n\treturn bundle;\n}\n","/**\n * Composite data patterns (roadmap §3.2b).\n *\n * These helpers compose existing primitives (`node`, `switchMap`, `reactiveMap`,\n * `dynamicNode`, `fromAny`) without introducing new protocol semantics.\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { dynamicNode } from \"../core/dynamic-node.js\";\nimport { DATA } from \"../core/messages.js\";\nimport type { Node, NodeOptions } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { merge, switchMap } from \"./operators.js\";\nimport { type ReactiveMapBundle, type ReactiveMapOptions, reactiveMap } from \"./reactive-map.js\";\nimport { forEach, fromAny, type NodeInput } from \"./sources.js\";\n\nfunction isNodeLike<T>(value: unknown): value is Node<T> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\ttypeof (value as Node<T>).get === \"function\" &&\n\t\ttypeof (value as Node<T>).subscribe === \"function\"\n\t);\n}\n\n/**\n * Verification payload shape is intentionally user-defined.\n */\nexport type VerifyValue = unknown;\n\nexport type VerifiableOptions<TVerify = VerifyValue> = Omit<\n\tNodeOptions,\n\t\"describeKind\" | \"initial\"\n> & {\n\t/** Reactive re-verification trigger. */\n\ttrigger?: NodeInput<unknown>;\n\t/** Re-run verification whenever `source` settles. */\n\tautoVerify?: boolean;\n\t/** Initial verification companion value. */\n\tinitialVerified?: TVerify | null;\n};\n\nexport type VerifiableBundle<T, TVerify = VerifyValue> = {\n\t/** Coerced source node. */\n\tnode: Node<T>;\n\t/** Latest verification result (`null` before first verification). */\n\tverified: Node<TVerify | null>;\n\t/** Effective trigger node used for verification, if any. */\n\ttrigger: Node<unknown> | null;\n};\n\n/**\n * Composes a value node with a reactive verification companion.\n *\n * Uses `switchMap` so newer triggers cancel stale in-flight verification work.\n */\nexport function verifiable<T, TVerify = VerifyValue>(\n\tsource: NodeInput<T>,\n\tverifyFn: (value: T) => NodeInput<TVerify>,\n\topts?: VerifiableOptions<TVerify>,\n): VerifiableBundle<T, TVerify> {\n\tconst sourceNode = fromAny(source);\n\tconst hasSourceVersioning = sourceNode.v != null;\n\tconst verified = state<TVerify | null>(opts?.initialVerified ?? null, {\n\t\t...(hasSourceVersioning ? { meta: { sourceVersion: null } } : {}),\n\t});\n\tconst hasTrigger = opts?.trigger !== undefined && opts.trigger !== null;\n\n\tlet triggerNode: Node<unknown> | null = null;\n\tif (hasTrigger && opts?.autoVerify) {\n\t\ttriggerNode = merge(fromAny(opts.trigger) as Node<unknown>, sourceNode as Node<unknown>);\n\t} else if (hasTrigger) {\n\t\ttriggerNode = fromAny(opts.trigger);\n\t} else if (opts?.autoVerify) {\n\t\ttriggerNode = sourceNode as Node<unknown>;\n\t}\n\n\tif (triggerNode !== null) {\n\t\tconst verifyStream = switchMap(triggerNode, () => verifyFn(sourceNode.get() as T));\n\t\tforEach(verifyStream, (value) => {\n\t\t\tbatch(() => {\n\t\t\t\tverified.down([[DATA, value]]);\n\t\t\t\t// V0 backfill: stamp which source version was verified (§6.0b).\n\t\t\t\tif (hasSourceVersioning) {\n\t\t\t\t\tconst sv = sourceNode.v;\n\t\t\t\t\tif (sv != null) {\n\t\t\t\t\t\tverified.meta.sourceVersion.down([[DATA, { id: sv.id, version: sv.version }]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\treturn { node: sourceNode, verified, trigger: triggerNode };\n}\n\nexport type Extraction<TMem> = {\n\tupsert: Array<{ key: string; value: TMem }>;\n\tremove?: string[];\n};\n\nexport type DistillOptions<TMem> = {\n\tscore: (mem: TMem, context: unknown) => number;\n\tcost: (mem: TMem) => number;\n\tbudget?: number;\n\tevict?: (key: string, mem: TMem) => boolean | Node<boolean>;\n\tconsolidate?: (entries: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>;\n\tconsolidateTrigger?: NodeInput<unknown>;\n\tcontext?: NodeInput<unknown>;\n\tmapOptions?: ReactiveMapOptions;\n};\n\nexport type DistillBundle<TMem> = {\n\tstore: ReactiveMapBundle<string, TMem>;\n\tcompact: Node<Array<{ key: string; value: TMem; score: number }>>;\n\tsize: Node<number>;\n};\n\nfunction keepalive(node: Node): void {\n\tnode.subscribe(() => undefined);\n}\n\nfunction mapFromSnapshot<TMem>(snapshot: unknown): ReadonlyMap<string, TMem> {\n\tif (\n\t\ttypeof snapshot === \"object\" &&\n\t\tsnapshot !== null &&\n\t\t\"value\" in snapshot &&\n\t\ttypeof (snapshot as { value?: unknown }).value === \"object\" &&\n\t\t(snapshot as { value?: unknown }).value !== null &&\n\t\t\"map\" in ((snapshot as { value?: unknown }).value as object)\n\t) {\n\t\treturn ((snapshot as { value: { map: ReadonlyMap<string, TMem> } }).value.map ??\n\t\t\tnew Map<string, TMem>()) as ReadonlyMap<string, TMem>;\n\t}\n\treturn new Map<string, TMem>();\n}\n\nfunction asReadonlyMap<TMem>(store: ReactiveMapBundle<string, TMem>): ReadonlyMap<string, TMem> {\n\treturn mapFromSnapshot<TMem>(store.node.get());\n}\n\nfunction applyExtraction<TMem>(\n\tstore: ReactiveMapBundle<string, TMem>,\n\textraction: Extraction<TMem>,\n): void {\n\tif (!Array.isArray(extraction.upsert)) {\n\t\tthrow new TypeError(\"distill extraction requires upsert: Array<{ key, value }>\");\n\t}\n\tbatch(() => {\n\t\tfor (const { key, value } of extraction.upsert) {\n\t\t\tstore.set(key, value);\n\t\t}\n\t\tfor (const key of extraction.remove ?? []) {\n\t\t\tstore.delete(key);\n\t\t}\n\t});\n}\n\n/**\n * Budget-constrained reactive memory composition.\n */\nexport function distill<TRaw, TMem>(\n\tsource: NodeInput<TRaw>,\n\textractFn: (raw: TRaw, existing: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>,\n\topts: DistillOptions<TMem>,\n): DistillBundle<TMem> {\n\tconst sourceNode = fromAny(source);\n\tconst store = reactiveMap<string, TMem>(opts.mapOptions ?? {});\n\tconst budget = opts.budget ?? 2000;\n\tconst hasContext = opts.context !== undefined && opts.context !== null;\n\tconst contextNode = hasContext ? fromAny(opts.context) : state<unknown>(null);\n\n\tconst extractionStream = switchMap(sourceNode, (raw) => extractFn(raw, asReadonlyMap(store)));\n\tforEach(extractionStream, (extraction) => {\n\t\tapplyExtraction(store, extraction);\n\t});\n\n\tif (opts.evict) {\n\t\tconst evictionKeys = dynamicNode((get) => {\n\t\t\tconst out: string[] = [];\n\t\t\tconst snapshot = mapFromSnapshot<TMem>(get(store.node));\n\t\t\tfor (const [key, mem] of snapshot) {\n\t\t\t\tconst verdict = opts.evict!(key, mem);\n\t\t\t\tif (isNodeLike<boolean>(verdict)) {\n\t\t\t\t\tif (get(verdict) === true) out.push(key);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (typeof verdict === \"boolean\") {\n\t\t\t\t\tif (verdict) out.push(key);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthrow new TypeError(\"distill evict() must return boolean or Node<boolean>\");\n\t\t\t}\n\t\t\treturn out;\n\t\t});\n\t\tforEach(evictionKeys, (keys) => {\n\t\t\tfor (const key of keys) store.delete(key);\n\t\t});\n\t}\n\n\tconst hasConsolidateTrigger =\n\t\topts.consolidateTrigger !== undefined && opts.consolidateTrigger !== null;\n\tif (opts.consolidate && hasConsolidateTrigger) {\n\t\tconst consolidateTriggerNode = fromAny(opts.consolidateTrigger);\n\t\tconst consolidationStream = switchMap(consolidateTriggerNode, () =>\n\t\t\topts.consolidate!(asReadonlyMap(store)),\n\t\t);\n\t\tforEach(consolidationStream, (extraction) => {\n\t\t\tapplyExtraction(store, extraction);\n\t\t});\n\t}\n\n\tconst compact = derived([store.node, contextNode], ([snapshot, context]) => {\n\t\tconst entries = [...mapFromSnapshot<TMem>(snapshot).entries()].map(([key, value]) => ({\n\t\t\tkey,\n\t\t\tvalue,\n\t\t\tscore: opts.score(value, context),\n\t\t\tcost: opts.cost(value),\n\t\t}));\n\t\tentries.sort((a, b) => b.score - a.score);\n\n\t\tconst packed: Array<{ key: string; value: TMem; score: number }> = [];\n\t\tlet remaining = budget;\n\t\tfor (const item of entries) {\n\t\t\tif (item.cost <= remaining) {\n\t\t\t\tpacked.push({ key: item.key, value: item.value, score: item.score });\n\t\t\t\tremaining -= item.cost;\n\t\t\t}\n\t\t}\n\t\treturn packed;\n\t});\n\n\tconst size = derived([store.node], ([snapshot]) => mapFromSnapshot<TMem>(snapshot).size);\n\tkeepalive(compact);\n\tkeepalive(size);\n\n\treturn { store, compact, size };\n}\n","/**\n * Lazy per-topic manual nodes (roadmap §3.2) — create topics on first access, publish with two-phase push.\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { DATA, DIRTY, TEARDOWN } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { state } from \"../core/sugar.js\";\n\n/**\n * In-memory lazy topic registry: each topic is an independent {@link state} node.\n *\n * @category extra\n */\nexport interface PubSubHub {\n\t/**\n\t * Returns the topic node, creating it on first use.\n\t *\n\t * @param name - Topic key.\n\t * @returns `Node` whose value is the last published payload (initially `undefined`).\n\t */\n\ttopic(name: string): Node<unknown>;\n\n\t/**\n\t * Pushes a value to the topic (two-phase `DIRTY` then `DATA`, matching other manual sources here).\n\t *\n\t * @param name - Topic key.\n\t * @param value - Payload.\n\t */\n\tpublish(name: string, value: unknown): void;\n\n\t/**\n\t * Removes a topic and tears down its node. Returns `true` if the topic existed.\n\t *\n\t * @param name - Topic key.\n\t */\n\tremoveTopic(name: string): boolean;\n}\n\nclass PubSubHubImpl implements PubSubHub {\n\tprivate readonly topics = new Map<string, Node<unknown>>();\n\n\ttopic(name: string): Node<unknown> {\n\t\tlet n = this.topics.get(name);\n\t\tif (n === undefined) {\n\t\t\tn = state(undefined, { describeKind: \"state\" });\n\t\t\tthis.topics.set(name, n);\n\t\t}\n\t\treturn n;\n\t}\n\n\tpublish(name: string, value: unknown): void {\n\t\tconst t = this.topic(name);\n\t\tbatch(() => {\n\t\t\tt.down([[DIRTY]]);\n\t\t\tt.down([[DATA, value]]);\n\t\t});\n\t}\n\n\tremoveTopic(name: string): boolean {\n\t\tconst n = this.topics.get(name);\n\t\tif (n === undefined) return false;\n\t\tn.down([[TEARDOWN]]);\n\t\tthis.topics.delete(name);\n\t\treturn true;\n\t}\n}\n\n/**\n * Creates an empty {@link PubSubHub} for lazy topic nodes.\n *\n * @returns A new hub with no topics until {@link PubSubHub.topic} or {@link PubSubHub.publish} runs.\n *\n * @example\n * ```ts\n * import { pubsub } from \"@graphrefly/graphrefly-ts\";\n *\n * const hub = pubsub();\n * const t = hub.topic(\"events\");\n * t.subscribe((msgs) => console.log(msgs));\n * hub.publish(\"events\", { ok: true });\n * hub.removeTopic(\"events\"); // tears down the node\n * ```\n *\n * @category extra\n */\nexport function pubsub(): PubSubHub {\n\treturn new PubSubHubImpl();\n}\n","/**\n * Dual-key sorted index (roadmap §3.2) — unique primary key, rows ordered by `(secondary, primary)`.\n */\nimport { batch } from \"../core/batch.js\";\nimport { DATA, DIRTY } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { bumpVersion, snapshotEqualsVersion, type Versioned } from \"./reactive-base.js\";\n\nexport type IndexRow<K, V = unknown> = {\n\treadonly primary: K;\n\treadonly secondary: unknown;\n\treadonly value: V;\n};\n\nexport type ReactiveIndexSnapshot<K, V = unknown> = Versioned<{ rows: readonly IndexRow<K, V>[] }>;\n\nexport type ReactiveIndexOptions = {\n\tname?: string;\n};\n\nexport type ReactiveIndexBundle<K, V = unknown> = {\n\t/** Rows sorted by `(secondary, primary)`; versioned snapshots. */\n\treadonly ordered: Node<ReactiveIndexSnapshot<K, V>>;\n\t/** Map from primary key to stored value. */\n\treadonly byPrimary: Node<ReadonlyMap<K, V>>;\n\tupsert: (primary: K, secondary: unknown, value: V) => void;\n\tdelete: (primary: K) => void;\n\tclear: () => void;\n};\n\nfunction emptySnapshot<K, V>(): ReactiveIndexSnapshot<K, V> {\n\treturn { version: 0, value: { rows: [] } };\n}\n\nfunction rowKey<K, V>(row: IndexRow<K, V>): [unknown, K] {\n\treturn [row.secondary, row.primary];\n}\n\n/** Lexicographic ordering for index keys (mirrors Python tuple compare for typical primitives). */\nfunction cmpOrd(a: unknown, b: unknown): number {\n\tif (a === b) return 0;\n\tconst ta = typeof a;\n\tconst tb = typeof b;\n\tif (ta === tb && (ta === \"number\" || ta === \"string\" || ta === \"boolean\" || ta === \"bigint\")) {\n\t\tconst ax = a as number | string | boolean | bigint;\n\t\tconst bx = b as number | string | boolean | bigint;\n\t\tif (ax < bx) return -1;\n\t\tif (ax > bx) return 1;\n\t\treturn 0;\n\t}\n\treturn String(a).localeCompare(String(b));\n}\n\nfunction compareKeys<K>(a: [unknown, K], b: [unknown, K]): number {\n\tlet c = cmpOrd(a[0], b[0]);\n\tif (c !== 0) return c;\n\tc = cmpOrd(a[1], b[1]);\n\treturn c;\n}\n\nfunction bisectLeft<K, V>(rows: readonly IndexRow<K, V>[], row: IndexRow<K, V>): number {\n\tconst k = rowKey(row);\n\tlet lo = 0;\n\tlet hi = rows.length;\n\twhile (lo < hi) {\n\t\tconst mid = (lo + hi) >> 1;\n\t\tif (compareKeys(k, rowKey(rows[mid]!)) > 0) lo = mid + 1;\n\t\telse hi = mid;\n\t}\n\treturn lo;\n}\n\nfunction byPrimaryMap<K, V>(rows: readonly IndexRow<K, V>[]): Map<K, V> {\n\tconst m = new Map<K, V>();\n\tfor (const r of rows) m.set(r.primary, r.value);\n\treturn m;\n}\n\nfunction keepaliveDerived(n: Node<unknown>): void {\n\tvoid n.subscribe(() => {});\n}\n\n/**\n * Creates a reactive index: unique primary key per row, rows sorted by `(secondary, primary)` for ordered scans.\n *\n * @param options - Optional `name` for `describe()` / debugging.\n * @returns Bundle with `ordered` (versioned rows), `byPrimary` (map), and imperative `upsert` / `delete` / `clear`.\n *\n * @remarks\n * **Ordering:** `secondary` and `primary` are compared via a small total order: same primitive `typeof` uses\n * numeric/string/boolean/bigint comparison; mixed or object keys fall back to `String(a).localeCompare(String(b))`\n * (not identical to Python’s rich comparison for exotic types).\n *\n * @example\n * ```ts\n * import { reactiveIndex } from \"@graphrefly/graphrefly-ts\";\n *\n * const idx = reactiveIndex<string, string>();\n * idx.upsert(\"id1\", 10, \"row-a\");\n * idx.upsert(\"id2\", 5, \"row-b\");\n * ```\n *\n * @category extra\n */\nexport function reactiveIndex<K, V = unknown>(\n\toptions: ReactiveIndexOptions = {},\n): ReactiveIndexBundle<K, V> {\n\tconst { name } = options;\n\tconst buf: IndexRow<K, V>[] = [];\n\tlet current = emptySnapshot<K, V>();\n\n\tconst ordered = state<ReactiveIndexSnapshot<K, V>>(current, {\n\t\tname,\n\t\tdescribeKind: \"state\",\n\t\tequals: snapshotEqualsVersion,\n\t});\n\n\tconst byPrimary = derived(\n\t\t[ordered],\n\t\t([s]) => {\n\t\t\tconst rows = (s as ReactiveIndexSnapshot<K, V>).value.rows;\n\t\t\treturn byPrimaryMap(rows);\n\t\t},\n\t\t{ initial: new Map<K, V>(), describeKind: \"derived\" },\n\t);\n\tkeepaliveDerived(byPrimary);\n\n\tfunction pushSnapshot(): void {\n\t\tconst ov = ordered.v;\n\t\tcurrent = bumpVersion(\n\t\t\tcurrent,\n\t\t\t{ rows: [...buf] },\n\t\t\tov ? { id: ov.id, version: ov.version } : undefined,\n\t\t);\n\t\tbatch(() => {\n\t\t\tordered.down([[DIRTY]]);\n\t\t\tordered.down([[DATA, current]]);\n\t\t});\n\t}\n\n\treturn {\n\t\tordered,\n\t\tbyPrimary,\n\n\t\tupsert(primary: K, secondary: unknown, value: V): void {\n\t\t\tconst next = buf.filter((r) => r.primary !== primary);\n\t\t\tconst row: IndexRow<K, V> = { primary, secondary, value };\n\t\t\tconst pos = bisectLeft(next, row);\n\t\t\tnext.splice(pos, 0, row);\n\t\t\tbuf.length = 0;\n\t\t\tbuf.push(...next);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tdelete(primary: K): void {\n\t\t\tconst next = buf.filter((r) => r.primary !== primary);\n\t\t\tif (next.length === buf.length) return;\n\t\t\tbuf.length = 0;\n\t\t\tbuf.push(...next);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (buf.length === 0) return;\n\t\t\tbuf.length = 0;\n\t\t\tpushSnapshot();\n\t\t},\n\t};\n}\n","/**\n * Reactive positional list (roadmap §3.2) — tuple snapshot with append / insert / pop / clear.\n */\nimport { batch } from \"../core/batch.js\";\nimport { DATA, DIRTY } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { state } from \"../core/sugar.js\";\nimport { bumpVersion, snapshotEqualsVersion, type Versioned } from \"./reactive-base.js\";\n\nexport type ReactiveListSnapshot<T> = Versioned<{ items: readonly T[] }>;\n\nexport type ReactiveListOptions = {\n\tname?: string;\n};\n\nexport type ReactiveListBundle<T> = {\n\t/** Emits {@link ReactiveListSnapshot} on each structural change (two-phase). */\n\treadonly items: Node<ReactiveListSnapshot<T>>;\n\tappend: (value: T) => void;\n\tinsert: (index: number, value: T) => void;\n\tpop: (index?: number) => T;\n\tclear: () => void;\n};\n\nfunction emptySnapshot<T>(): ReactiveListSnapshot<T> {\n\treturn { version: 0, value: { items: [] } };\n}\n\n/**\n * Creates a reactive list with versioned immutable array snapshots.\n *\n * @param initial - Optional initial items (copied).\n * @param options - Optional `name` for `describe()` / debugging.\n * @returns Bundle with `items` (state node) and `append` / `insert` / `pop` / `clear`.\n *\n * @example\n * ```ts\n * import { reactiveList } from \"@graphrefly/graphrefly-ts\";\n *\n * const list = reactiveList<string>([\"a\"], { name: \"queue\" });\n * list.append(\"b\");\n * ```\n *\n * @category extra\n */\nexport function reactiveList<T>(\n\tinitial?: readonly T[],\n\toptions: ReactiveListOptions = {},\n): ReactiveListBundle<T> {\n\tconst { name } = options;\n\tconst buf: T[] = initial ? [...initial] : [];\n\tlet current: ReactiveListSnapshot<T> =\n\t\tbuf.length > 0 ? { version: 1, value: { items: [...buf] } } : emptySnapshot();\n\n\tconst items = state<ReactiveListSnapshot<T>>(current, {\n\t\tname,\n\t\tdescribeKind: \"state\",\n\t\tequals: snapshotEqualsVersion,\n\t});\n\n\tfunction pushSnapshot(): void {\n\t\tconst iv = items.v;\n\t\tcurrent = bumpVersion(\n\t\t\tcurrent,\n\t\t\t{ items: [...buf] },\n\t\t\tiv ? { id: iv.id, version: iv.version } : undefined,\n\t\t);\n\t\tbatch(() => {\n\t\t\titems.down([[DIRTY]]);\n\t\t\titems.down([[DATA, current]]);\n\t\t});\n\t}\n\n\treturn {\n\t\titems,\n\n\t\tappend(value: T): void {\n\t\t\tbuf.push(value);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tinsert(index: number, value: T): void {\n\t\t\tif (index < 0 || index > buf.length) {\n\t\t\t\tthrow new RangeError(\"index out of range\");\n\t\t\t}\n\t\t\tbuf.splice(index, 0, value);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tpop(index = -1): T {\n\t\t\tif (buf.length === 0) {\n\t\t\t\tthrow new RangeError(\"pop from empty list\");\n\t\t\t}\n\t\t\tconst i = index >= 0 ? index : buf.length + index;\n\t\t\tif (i < 0 || i >= buf.length) {\n\t\t\t\tthrow new RangeError(\"index out of range\");\n\t\t\t}\n\t\t\tconst [v] = buf.splice(i, 1);\n\t\t\tpushSnapshot();\n\t\t\treturn v as T;\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (buf.length === 0) return;\n\t\t\tbuf.length = 0;\n\t\t\tpushSnapshot();\n\t\t},\n\t};\n}\n","/**\n * Wire protocol for worker bridge communication.\n *\n * Messages with {@link messageTier} >= 2 cross the wire (DATA values via\n * coalescing, RESOLVED/COMPLETE/TEARDOWN as signals, ERROR as serialized\n * payloads). Tier 0–1 (DIRTY, INVALIDATE, PAUSE, RESUME) stay local to\n * each side's reactive graph.\n *\n * Lifecycle signals serialize as string names since Symbols can't survive\n * structured clone. Unknown {@link Symbol.for} symbols are round-tripped\n * via their registered key.\n */\n\nimport { COMPLETE, ERROR, INVALIDATE, PAUSE, RESUME, TEARDOWN } from \"../../core/messages.js\";\n\n// ---------------------------------------------------------------------------\n// Wire message types\n// ---------------------------------------------------------------------------\n\n/** Value update — one node changed. */\nexport interface ValueMessage {\n\tt: \"v\";\n\t/** Node name. */\n\ts: string;\n\t/** Serialized value. */\n\td: unknown;\n}\n\n/** Lifecycle signal — serialized symbol name. */\nexport interface SignalMessage {\n\tt: \"s\";\n\t/** Node name, or `\"*\"` for bridge-wide. */\n\ts: string;\n\t/** Signal name string (e.g. \"TEARDOWN\"). */\n\tsig: string;\n\t/** Optional payload for custom symbols (spec §1.3.6 forward unchanged). */\n\td?: unknown;\n}\n\n/** Ready — worker declares its exported nodes with initial values. */\nexport interface ReadyMessage {\n\tt: \"r\";\n\tstores: Record<string, unknown>;\n}\n\n/** Init — main sends initial values of its exposed nodes. */\nexport interface InitMessage {\n\tt: \"i\";\n\tstores: Record<string, unknown>;\n}\n\n/** Batch value update — multiple nodes changed in one reactive cycle. */\nexport interface BatchMessage {\n\tt: \"b\";\n\tu: Record<string, unknown>;\n\t/** V0 versions per node for delta sync — peer skips if version <= lastSeen (§6.0b). */\n\tv?: Record<string, number>;\n}\n\n/** Error payload — serialized since Error objects don't survive structured clone. */\nexport interface ErrorMessage {\n\tt: \"e\";\n\t/** Node name. */\n\ts: string;\n\t/** Serialized error. */\n\terr: { message: string; name: string; stack?: string };\n}\n\nexport type BridgeMessage =\n\t| ValueMessage\n\t| SignalMessage\n\t| ReadyMessage\n\t| InitMessage\n\t| BatchMessage\n\t| ErrorMessage;\n\n// ---------------------------------------------------------------------------\n// Signal serialization — Symbol <-> string for structured clone\n// ---------------------------------------------------------------------------\n\nconst signalToNameMap = new Map<symbol, string>([\n\t[INVALIDATE, \"INVALIDATE\"],\n\t[PAUSE, \"PAUSE\"],\n\t[RESUME, \"RESUME\"],\n\t[TEARDOWN, \"TEARDOWN\"],\n\t[COMPLETE, \"COMPLETE\"],\n\t[ERROR, \"ERROR\"],\n]);\n\nconst nameToSignalMap = new Map<string, symbol>([\n\t[\"INVALIDATE\", INVALIDATE],\n\t[\"PAUSE\", PAUSE],\n\t[\"RESUME\", RESUME],\n\t[\"TEARDOWN\", TEARDOWN],\n\t[\"COMPLETE\", COMPLETE],\n\t[\"ERROR\", ERROR],\n]);\n\n/**\n * Serialize a message type symbol to a string for structured clone transfer.\n *\n * Known GraphReFly symbols map to their canonical names. Unknown symbols\n * registered via {@link Symbol.for} use their registered key. Unregistered\n * symbols return `\"UNKNOWN\"`.\n */\nexport function signalToName(s: symbol): string {\n\tconst known = signalToNameMap.get(s);\n\tif (known) return known;\n\tconst key = Symbol.keyFor(s);\n\treturn key ?? \"UNKNOWN\";\n}\n\n/**\n * Deserialize a string back to a message type symbol.\n *\n * Known GraphReFly names map to their canonical symbols. Other non-empty\n * strings are reconstructed via {@link Symbol.for} (round-trip safe for\n * custom message types). Returns `undefined` for `\"UNKNOWN\"`.\n */\nexport function nameToSignal(name: string): symbol | undefined {\n\tconst known = nameToSignalMap.get(name);\n\tif (known) return known;\n\tif (name && name !== \"UNKNOWN\") return Symbol.for(name);\n\treturn undefined;\n}\n\n/** Serialize an error for structured clone transfer. */\nexport function serializeError(err: unknown): { message: string; name: string; stack?: string } {\n\tif (err instanceof Error) {\n\t\treturn { message: err.message, name: err.name, stack: err.stack };\n\t}\n\treturn { message: String(err), name: \"Error\" };\n}\n\n/** Deserialize an error payload back to an Error object. */\nexport function deserializeError(payload: {\n\tmessage: string;\n\tname: string;\n\tstack?: string;\n}): Error {\n\tconst err = new Error(payload.message);\n\terr.name = payload.name;\n\tif (payload.stack) err.stack = payload.stack;\n\treturn err;\n}\n","/**\n * WorkerTransport — normalized message channel for all worker types.\n *\n * Abstracts Worker, SharedWorker, ServiceWorker, BroadcastChannel, and\n * MessagePort behind a uniform post/listen/terminate interface.\n */\n\n/** Normalized bidirectional message channel. */\nexport interface WorkerTransport {\n\t/** Send data to the other side. Optional transferables for zero-copy. */\n\tpost(data: unknown, transfer?: Transferable[]): void;\n\t/** Listen for incoming messages. Returns unsubscribe function. */\n\tlisten(handler: (data: unknown) => void): () => void;\n\t/** Terminate the connection (if supported by the underlying transport). */\n\tterminate?(): void;\n}\n\n/**\n * Auto-detect transport type and create a normalized WorkerTransport.\n *\n * Supports:\n * - `Worker` — direct postMessage/onmessage\n * - `SharedWorker` — port-based postMessage/onmessage\n * - `ServiceWorker` — postMessage via controller, listen via navigator.serviceWorker\n * - `BroadcastChannel` — postMessage/onmessage (no Transferable support)\n * - `MessagePort` — direct postMessage/onmessage (worker-side SharedWorker port)\n */\nexport function createTransport(target: unknown): WorkerTransport {\n\t// MessagePort (SharedWorker port from inside the worker, or raw MessagePort)\n\tif (typeof MessagePort !== \"undefined\" && target instanceof MessagePort) {\n\t\treturn {\n\t\t\tpost(data, transfer) {\n\t\t\t\ttarget.postMessage(data, transfer ?? []);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => handler(e.data);\n\t\t\t\ttarget.addEventListener(\"message\", h);\n\t\t\t\ttarget.start();\n\t\t\t\treturn () => target.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t\tterminate() {\n\t\t\t\ttarget.close();\n\t\t\t},\n\t\t};\n\t}\n\n\t// SharedWorker — use its port\n\tif (typeof SharedWorker !== \"undefined\" && target instanceof SharedWorker) {\n\t\treturn createTransport(target.port);\n\t}\n\n\t// Web Worker\n\tif (typeof Worker !== \"undefined\" && target instanceof Worker) {\n\t\treturn {\n\t\t\tpost(data, transfer) {\n\t\t\t\ttarget.postMessage(data, transfer ?? []);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => handler(e.data);\n\t\t\t\ttarget.addEventListener(\"message\", h);\n\t\t\t\treturn () => target.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t\tterminate() {\n\t\t\t\ttarget.terminate();\n\t\t\t},\n\t\t};\n\t}\n\n\t// BroadcastChannel — no Transferable support\n\tif (typeof BroadcastChannel !== \"undefined\" && target instanceof BroadcastChannel) {\n\t\treturn {\n\t\t\tpost(data, transfer?) {\n\t\t\t\tif (transfer && transfer.length > 0) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\"[graphrefly] WorkerTransport: BroadcastChannel does not support Transferable objects. The transfer argument is ignored and objects will be cloned instead.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttarget.postMessage(data);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => handler(e.data);\n\t\t\t\ttarget.addEventListener(\"message\", h);\n\t\t\t\treturn () => target.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t\tterminate() {\n\t\t\t\ttarget.close();\n\t\t\t},\n\t\t};\n\t}\n\n\t// ServiceWorker\n\tif (typeof ServiceWorker !== \"undefined\" && target instanceof ServiceWorker) {\n\t\treturn {\n\t\t\tpost(data, transfer) {\n\t\t\t\ttarget.postMessage(data, transfer ?? []);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => {\n\t\t\t\t\tif (e.source === target) handler(e.data);\n\t\t\t\t};\n\t\t\t\tnavigator.serviceWorker.addEventListener(\"message\", h);\n\t\t\t\treturn () => navigator.serviceWorker.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t};\n\t}\n\n\tthrow new Error(\n\t\t\"createTransport: unsupported target type. Expected Worker, SharedWorker, ServiceWorker, BroadcastChannel, or MessagePort.\",\n\t);\n}\n","/**\n * workerBridge — main-thread reactive node bridge to a worker.\n *\n * Creates proxy nodes for imported worker nodes, subscribes to exposed\n * nodes and sends values across the wire. Uses derived() + effect() for\n * natural batch coalescing via two-phase push + bitmask resolution.\n *\n * Wire filtering: messages with {@link messageTier} >= 2 cross the wire.\n * DATA values go through the coalescing path; RESOLVED, COMPLETE, ERROR,\n * TEARDOWN, and unknown {@link Symbol.for} types go through the signal\n * subscription. Tier 0–1 (DIRTY, INVALIDATE, PAUSE, RESUME) stay local.\n *\n * Handshake:\n * 1. Main creates bridge, starts listening\n * 2. Worker sends { t: 'r', stores: { name: initialValue, ... } }\n * 3. Main creates proxy nodes, marks meta.status \"connected\"\n * 4. Main sends { t: 'i', stores: { name: currentValue, ... } }\n * 5. Bidirectional value flow begins\n */\n\nimport { batch } from \"../../core/batch.js\";\nimport {\n\tDATA,\n\tERROR,\n\tknownMessageTypes,\n\ttype Messages,\n\tmessageTier,\n\tTEARDOWN,\n} from \"../../core/messages.js\";\nimport type { Node, NodeSink } from \"../../core/node.js\";\nimport { derived, effect, state } from \"../../core/sugar.js\";\nimport type { BatchMessage, BridgeMessage } from \"./protocol.js\";\nimport { deserializeError, nameToSignal, serializeError, signalToName } from \"./protocol.js\";\nimport type { WorkerTransport } from \"./transport.js\";\nimport { createTransport } from \"./transport.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface WorkerBridgeOptions<\n\tTExpose extends Record<string, Node<any>>,\n\tTImport extends readonly string[],\n> {\n\t/** Nodes to send to the worker. */\n\texpose?: TExpose;\n\t/** Node names the worker will provide. */\n\timport?: TImport;\n\t/** Per-node transferable extractors for zero-copy ArrayBuffer passing. */\n\ttransfer?: Partial<Record<keyof TExpose, (value: any) => Transferable[]>>;\n\t/** Debug name. */\n\tname?: string;\n\t/**\n\t * Handshake timeout in milliseconds. If the worker doesn't send READY\n\t * within this window, `meta.status` transitions to `\"closed\"` and\n\t * `meta.error` is set. Default: no timeout.\n\t */\n\ttimeoutMs?: number;\n}\n\n/** Proxy nodes created from imported worker node names. */\ntype ImportedNodes<T extends readonly string[]> = {\n\treadonly [K in T[number]]: Node<any>;\n};\n\nexport type WorkerBridge<\n\t_TExpose extends Record<string, Node<any>>,\n\tTImport extends readonly string[],\n> = ImportedNodes<TImport> & {\n\t/** Connection status meta node. */\n\tmeta: {\n\t\tstatus: Node<\"connecting\" | \"connected\" | \"closed\">;\n\t\terror: Node<Error | null>;\n\t};\n\t/** Destroy the bridge: sends TEARDOWN, disconnects, terminates worker. */\n\tdestroy(): void;\n};\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nfunction isTransport(t: unknown): t is WorkerTransport {\n\treturn (\n\t\ttypeof t === \"object\" &&\n\t\tt !== null &&\n\t\ttypeof (t as any).post === \"function\" &&\n\t\ttypeof (t as any).listen === \"function\"\n\t);\n}\n\nexport function workerBridge<\n\tTExpose extends Record<string, Node<any>>,\n\tTImport extends readonly string[],\n>(\n\ttarget: unknown | WorkerTransport,\n\topts: WorkerBridgeOptions<TExpose, TImport>,\n): WorkerBridge<TExpose, TImport> {\n\tconst transport = isTransport(target) ? target : createTransport(target);\n\tconst bridgeName = opts.name ?? \"workerBridge\";\n\tconst exposeEntries = Object.entries(opts.expose ?? {});\n\tconst importNames = (opts.import ?? []) as readonly string[];\n\tconst transferFns = opts.transfer ?? {};\n\n\t// -- Meta: connection status -----------------------------------------------\n\tconst statusNode = state<\"connecting\" | \"connected\" | \"closed\">(\"connecting\", {\n\t\tname: `${bridgeName}::meta::status`,\n\t});\n\tconst errorNode = state<Error | null>(null, {\n\t\tname: `${bridgeName}::meta::error`,\n\t});\n\n\t// -- Proxy nodes for imports (worker -> main) ------------------------------\n\tconst proxyNodes = new Map<string, Node<any>>();\n\tconst lastSeenImportVersions = new Map<string, number>();\n\tfor (const name of importNames) {\n\t\tconst proxy = state(undefined, { name: `${bridgeName}::${name}` });\n\t\tproxyNodes.set(name, proxy);\n\t}\n\n\t// -- Send coalescing via derived + effect ----------------------------------\n\tconst lastSent = new Map<string, unknown>();\n\tlet effectUnsub: (() => void) | undefined;\n\n\tif (exposeEntries.length > 0) {\n\t\tconst exposedNodes = exposeEntries.map(([, n]) => n);\n\n\t\tconst aggregated = derived(\n\t\t\texposedNodes,\n\t\t\t() => {\n\t\t\t\tconst updates: Record<string, unknown> = {};\n\t\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\t\tconst v = n.get();\n\t\t\t\t\tif (v !== lastSent.get(name)) {\n\t\t\t\t\t\tupdates[name] = v;\n\t\t\t\t\t\tlastSent.set(name, v);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn updates;\n\t\t\t},\n\t\t\t{ equals: () => false, name: `${bridgeName}::aggregated` },\n\t\t);\n\n\t\tconst effectNode = effect([aggregated], () => {\n\t\t\tconst updates = aggregated.get() as Record<string, unknown>;\n\t\t\tif (Object.keys(updates).length === 0) return;\n\n\t\t\tconst transferList: Transferable[] = [];\n\t\t\tfor (const name of Object.keys(updates)) {\n\t\t\t\tconst fn = (transferFns as any)[name];\n\t\t\t\tif (fn) transferList.push(...fn(updates[name]));\n\t\t\t}\n\n\t\t\t// V0 delta sync: include version counters when available (§6.0b).\n\t\t\tlet versions: Record<string, number> | undefined;\n\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\tif (name in updates && n.v != null) {\n\t\t\t\t\tif (versions == null) versions = {};\n\t\t\t\t\tversions[name] = n.v.version;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst msg: BatchMessage = { t: \"b\", u: updates, ...(versions ? { v: versions } : {}) };\n\t\t\ttry {\n\t\t\t\ttransport.post(msg, transferList.length > 0 ? transferList : undefined);\n\t\t\t} catch (err) {\n\t\t\t\terrorNode.down([[DATA, err instanceof Error ? err : new Error(String(err))]]);\n\t\t\t}\n\t\t});\n\t\t// Effect nodes are lazy — subscribe to activate the chain\n\t\teffectUnsub = effectNode.subscribe(() => {});\n\t}\n\n\t// -- Receive handler -------------------------------------------------------\n\tlet destroyed = false;\n\n\tconst unlisten = transport.listen((data) => {\n\t\tif (destroyed) return;\n\t\tconst msg = data as BridgeMessage;\n\n\t\tswitch (msg.t) {\n\t\t\t// Worker ready — set proxy nodes with initial values\n\t\t\tcase \"r\": {\n\t\t\t\tif (handshakeTimer !== undefined) clearTimeout(handshakeTimer);\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.stores)) {\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tstatusNode.down([[DATA, \"connected\"]]);\n\n\t\t\t\t// Send initial values of exposed nodes\n\t\t\t\tconst initValues: Record<string, unknown> = {};\n\t\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\t\tinitValues[name] = n.get();\n\t\t\t\t\tlastSent.set(name, initValues[name]);\n\t\t\t\t}\n\t\t\t\ttransport.post({ t: \"i\", stores: initValues } satisfies BridgeMessage);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Single value update from worker\n\t\t\tcase \"v\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[DATA, msg.d]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Batch value update from worker\n\t\t\tcase \"b\": {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.u)) {\n\t\t\t\t\t\tconst incomingVersion = msg.v?.[name];\n\t\t\t\t\t\tif (incomingVersion != null) {\n\t\t\t\t\t\t\tconst lastSeen = lastSeenImportVersions.get(name);\n\t\t\t\t\t\t\tif (lastSeen != null && incomingVersion <= lastSeen) continue;\n\t\t\t\t\t\t\tlastSeenImportVersions.set(name, incomingVersion);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Error from worker node\n\t\t\tcase \"e\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[ERROR, deserializeError(msg.err)]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Lifecycle signal from worker\n\t\t\tcase \"s\": {\n\t\t\t\tconst sig = nameToSignal(msg.sig);\n\t\t\t\tif (!sig) break;\n\n\t\t\t\tconst targets: Node<any>[] =\n\t\t\t\t\tmsg.s === \"*\"\n\t\t\t\t\t\t? [...proxyNodes.values()]\n\t\t\t\t\t\t: proxyNodes.has(msg.s)\n\t\t\t\t\t\t\t? [proxyNodes.get(msg.s)!]\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\tfor (const proxy of targets) {\n\t\t\t\t\tproxy.down((msg.d === undefined ? [[sig]] : [[sig, msg.d]]) as Messages);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n\n\t// -- Subscribe to exposed nodes: forward tier >= 2 messages -----------------\n\tconst exposeUnsubs: Array<() => void> = [];\n\tfor (const [name, n] of exposeEntries) {\n\t\tconst unsub = n.subscribe(((msgs: Messages) => {\n\t\t\tif (destroyed) return;\n\t\t\tfor (const m of msgs) {\n\t\t\t\tconst type = m[0] as symbol;\n\t\t\t\t// DATA goes through the coalescing path — skip here\n\t\t\t\tif (type === DATA) continue;\n\t\t\t\t// Block known tier 0/1 (DIRTY, INVALIDATE, PAUSE, RESUME) — local only.\n\t\t\t\t// Unknown types (not in knownMessageTypes) always forward (spec §1.3.6).\n\t\t\t\tif (knownMessageTypes.includes(type) && messageTier(type) < 2) continue;\n\t\t\t\t// ERROR: serialize payload\n\t\t\t\tif (type === ERROR) {\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"e\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\terr: serializeError(m[1]),\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t} else {\n\t\t\t\t\t// RESOLVED, COMPLETE, TEARDOWN, and unknown Symbol.for types\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"s\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\tsig: signalToName(type),\n\t\t\t\t\t\td: m.length > 1 ? m[1] : undefined,\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t}\n\t\t\t}\n\t\t}) as NodeSink);\n\t\texposeUnsubs.push(unsub);\n\t}\n\n\t// -- Handshake timeout -----------------------------------------------------\n\tlet handshakeTimer: ReturnType<typeof setTimeout> | undefined;\n\tif (opts.timeoutMs != null && opts.timeoutMs > 0) {\n\t\thandshakeTimer = setTimeout(() => {\n\t\t\tif (statusNode.get() === \"connecting\") {\n\t\t\t\terrorNode.down([[DATA, new Error(\"Worker bridge handshake timeout\")]]);\n\t\t\t\tdestroy();\n\t\t\t}\n\t\t}, opts.timeoutMs);\n\t}\n\n\t// -- Build result object ---------------------------------------------------\n\tfunction destroy() {\n\t\tif (destroyed) return;\n\t\tdestroyed = true;\n\n\t\tif (handshakeTimer !== undefined) clearTimeout(handshakeTimer);\n\n\t\t// Send bridge-level TEARDOWN to worker\n\t\ttransport.post({\n\t\t\tt: \"s\",\n\t\t\ts: \"*\",\n\t\t\tsig: signalToName(TEARDOWN),\n\t\t} satisfies BridgeMessage);\n\n\t\t// Cleanup: unsub effect first (stops sending), then unsub expose\n\t\t// listeners, then unlisten on transport\n\t\tif (effectUnsub) effectUnsub();\n\t\tfor (const unsub of exposeUnsubs) unsub();\n\t\texposeUnsubs.length = 0;\n\t\tunlisten();\n\n\t\tstatusNode.down([[DATA, \"closed\"]]);\n\n\t\tlastSent.clear();\n\t\tlastSeenImportVersions.clear();\n\t\tproxyNodes.clear();\n\t}\n\n\tconst result: any = {\n\t\tmeta: { status: statusNode, error: errorNode },\n\t\tdestroy,\n\t};\n\n\t// Attach proxy nodes as properties\n\tfor (const [name, proxy] of proxyNodes) {\n\t\tresult[name] = proxy;\n\t}\n\n\treturn result as WorkerBridge<TExpose, TImport>;\n}\n","/**\n * workerSelf — worker-side reactive node bridge.\n *\n * Mirror of workerBridge() for the worker side. Creates proxy nodes for\n * imports from main thread, exposes local nodes via the same wire protocol.\n * Uses derived() + effect() for batch coalescing.\n *\n * Wire filtering: messages with {@link messageTier} >= 2 cross the wire.\n * DATA values go through the coalescing path; RESOLVED, COMPLETE, ERROR,\n * TEARDOWN, and unknown {@link Symbol.for} types go through the signal\n * subscription. Tier 0–1 (DIRTY, INVALIDATE, PAUSE, RESUME) stay local.\n *\n * Handshake (worker perspective):\n * 1. workerSelf() called — creates proxy nodes for imports\n * 2. Runs expose factory with proxy nodes -> gets nodes to expose\n * 3. Sends { t: 'r', stores: { name: initialValue, ... } } to main\n * 4. Receives { t: 'i', stores: { name: value, ... } } from main\n * 5. Updates proxy nodes -> triggers local effects\n */\n\nimport { batch } from \"../../core/batch.js\";\nimport {\n\tDATA,\n\tERROR,\n\tknownMessageTypes,\n\ttype Messages,\n\tmessageTier,\n\tTEARDOWN,\n} from \"../../core/messages.js\";\nimport type { Node, NodeSink } from \"../../core/node.js\";\nimport { derived, effect, state } from \"../../core/sugar.js\";\nimport type { BatchMessage, BridgeMessage } from \"./protocol.js\";\nimport { deserializeError, nameToSignal, serializeError, signalToName } from \"./protocol.js\";\nimport type { WorkerTransport } from \"./transport.js\";\nimport { createTransport } from \"./transport.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface WorkerSelfOptions<TImport extends readonly string[]> {\n\t/** Node names that the main thread will provide. */\n\timport?: TImport;\n\t/** Factory that receives imported proxy nodes and returns nodes to expose. */\n\texpose: (imported: WorkerImported<TImport>) => Record<string, Node<any>>;\n\t/** Per-node transferable extractors for zero-copy ArrayBuffer passing. */\n\ttransfer?: Record<string, (value: any) => Transferable[]>;\n}\n\n/** Proxy nodes available inside the worker from main-thread exposed nodes. */\ntype WorkerImported<T extends readonly string[]> = {\n\treadonly [K in T[number]]: Node<any>;\n};\n\nexport interface WorkerSelfHandle {\n\t/** Dispose all subscriptions and stop the bridge. */\n\tdestroy(): void;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nfunction isTransport(t: unknown): t is WorkerTransport {\n\treturn (\n\t\ttypeof t === \"object\" &&\n\t\tt !== null &&\n\t\ttypeof (t as any).post === \"function\" &&\n\t\ttypeof (t as any).listen === \"function\"\n\t);\n}\n\nexport function workerSelf<TImport extends readonly string[]>(\n\ttarget: unknown | WorkerTransport,\n\topts: WorkerSelfOptions<TImport>,\n): WorkerSelfHandle {\n\tconst transport = isTransport(target) ? target : createTransport(target);\n\tconst importNames = (opts.import ?? []) as readonly string[];\n\tconst transferFns = opts.transfer ?? {};\n\n\t// -- Proxy nodes for imports (main -> worker) ------------------------------\n\tconst proxyNodes = new Map<string, Node<any>>();\n\tconst lastSeenImportVersions = new Map<string, number>();\n\tconst importedObj: any = {};\n\tfor (const name of importNames) {\n\t\tconst s = state(undefined, { name: `worker::${name}` });\n\t\tproxyNodes.set(name, s);\n\t\timportedObj[name] = s;\n\t}\n\n\t// -- Run expose factory ----------------------------------------------------\n\tconst exposedNodes = opts.expose(importedObj as WorkerImported<TImport>);\n\tconst exposeEntries = Object.entries(exposedNodes);\n\n\t// -- Send coalescing via derived + effect ----------------------------------\n\tconst lastSent = new Map<string, unknown>();\n\tlet effectUnsub: (() => void) | undefined;\n\tlet destroyed = false;\n\n\tif (exposeEntries.length > 0) {\n\t\tconst nodes = exposeEntries.map(([, n]) => n);\n\n\t\tconst aggregated = derived(\n\t\t\tnodes,\n\t\t\t() => {\n\t\t\t\tconst updates: Record<string, unknown> = {};\n\t\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\t\tconst v = n.get();\n\t\t\t\t\tif (v !== lastSent.get(name)) {\n\t\t\t\t\t\tupdates[name] = v;\n\t\t\t\t\t\tlastSent.set(name, v);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn updates;\n\t\t\t},\n\t\t\t{ equals: () => false, name: \"workerSelf::aggregated\" },\n\t\t);\n\n\t\tconst effectNode = effect([aggregated], () => {\n\t\t\tif (destroyed) return;\n\t\t\tconst updates = aggregated.get() as Record<string, unknown>;\n\t\t\tif (Object.keys(updates).length === 0) return;\n\n\t\t\tconst transferList: Transferable[] = [];\n\t\t\tfor (const name of Object.keys(updates)) {\n\t\t\t\tconst fn = (transferFns as any)[name];\n\t\t\t\tif (fn) transferList.push(...fn(updates[name]));\n\t\t\t}\n\n\t\t\t// V0 delta sync: include version counters when available (§6.0b).\n\t\t\tlet versions: Record<string, number> | undefined;\n\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\tif (name in updates && n.v != null) {\n\t\t\t\t\tif (versions == null) versions = {};\n\t\t\t\t\tversions[name] = n.v.version;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst msg: BatchMessage = { t: \"b\", u: updates, ...(versions ? { v: versions } : {}) };\n\t\t\ttry {\n\t\t\t\ttransport.post(msg, transferList.length > 0 ? transferList : undefined);\n\t\t\t} catch (_err) {\n\t\t\t\t// Transport failure — bridge is likely destroyed; swallow\n\t\t\t}\n\t\t});\n\t\t// Effect nodes are lazy — subscribe to activate the chain\n\t\teffectUnsub = effectNode.subscribe(() => {});\n\t}\n\n\t// -- Subscribe to exposed nodes: forward tier >= 2 messages -----------------\n\tconst exposeUnsubs: Array<() => void> = [];\n\tfor (const [name, n] of exposeEntries) {\n\t\tconst unsub = n.subscribe(((msgs: Messages) => {\n\t\t\tif (destroyed) return;\n\t\t\tfor (const m of msgs) {\n\t\t\t\tconst type = m[0] as symbol;\n\t\t\t\t// DATA goes through the coalescing path — skip here\n\t\t\t\tif (type === DATA) continue;\n\t\t\t\t// Block known tier 0/1 (DIRTY, INVALIDATE, PAUSE, RESUME) — local only.\n\t\t\t\t// Unknown types (not in knownMessageTypes) always forward (spec §1.3.6).\n\t\t\t\tif (knownMessageTypes.includes(type) && messageTier(type) < 2) continue;\n\t\t\t\t// ERROR: serialize payload\n\t\t\t\tif (type === ERROR) {\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"e\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\terr: serializeError(m[1]),\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t} else {\n\t\t\t\t\t// RESOLVED, COMPLETE, TEARDOWN, and unknown Symbol.for types\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"s\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\tsig: signalToName(type),\n\t\t\t\t\t\td: m.length > 1 ? m[1] : undefined,\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t}\n\t\t\t}\n\t\t}) as NodeSink);\n\t\texposeUnsubs.push(unsub);\n\t}\n\n\t// -- Receive handler -------------------------------------------------------\n\tconst unlisten = transport.listen((data) => {\n\t\tif (destroyed) return;\n\t\tconst msg = data as BridgeMessage;\n\n\t\tswitch (msg.t) {\n\t\t\t// Init from main — set proxy node values\n\t\t\tcase \"i\": {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.stores)) {\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Single value update from main\n\t\t\tcase \"v\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[DATA, msg.d]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Batch value update from main\n\t\t\tcase \"b\": {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.u)) {\n\t\t\t\t\t\tconst incomingVersion = msg.v?.[name];\n\t\t\t\t\t\tif (incomingVersion != null) {\n\t\t\t\t\t\t\tconst lastSeen = lastSeenImportVersions.get(name);\n\t\t\t\t\t\t\tif (lastSeen != null && incomingVersion <= lastSeen) continue;\n\t\t\t\t\t\t\tlastSeenImportVersions.set(name, incomingVersion);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Error from main node\n\t\t\tcase \"e\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[ERROR, deserializeError(msg.err)]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Lifecycle signal from main\n\t\t\tcase \"s\": {\n\t\t\t\tconst sig = nameToSignal(msg.sig);\n\t\t\t\tif (!sig) break;\n\n\t\t\t\tif (sig === TEARDOWN && msg.s === \"*\") {\n\t\t\t\t\tdestroy();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst targets: Node<any>[] =\n\t\t\t\t\tmsg.s === \"*\"\n\t\t\t\t\t\t? [...proxyNodes.values()]\n\t\t\t\t\t\t: proxyNodes.has(msg.s)\n\t\t\t\t\t\t\t? [proxyNodes.get(msg.s)!]\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\tfor (const proxy of targets) {\n\t\t\t\t\tproxy.down((msg.d === undefined ? [[sig]] : [[sig, msg.d]]) as Messages);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n\n\t// -- Send ready message ----------------------------------------------------\n\tconst readyValues: Record<string, unknown> = {};\n\tfor (const [name, n] of exposeEntries) {\n\t\treadyValues[name] = n.get();\n\t\tlastSent.set(name, readyValues[name]);\n\t}\n\ttransport.post({ t: \"r\", stores: readyValues } satisfies BridgeMessage);\n\n\t// -- Destroy ---------------------------------------------------------------\n\tfunction destroy() {\n\t\tif (destroyed) return;\n\t\tdestroyed = true;\n\n\t\t// Cleanup: unsub effect first (stops sending), then expose listeners,\n\t\t// then unlisten on transport\n\t\tif (effectUnsub) effectUnsub();\n\t\tfor (const unsub of exposeUnsubs) unsub();\n\t\texposeUnsubs.length = 0;\n\t\tunlisten();\n\t\ttransport.terminate?.();\n\n\t\tlastSent.clear();\n\t\tlastSeenImportVersions.clear();\n\t\tproxyNodes.clear();\n\t}\n\n\treturn { destroy };\n}\n"],"mappings":"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","names":["delay","last","clampNonNegative","buffer","batch","seq","node","operatorOpts","buffer","first","map","node","emptySnapshot","emptySnapshot","isTransport"]}
|