@oimdb/core 3.9.0 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -90,9 +90,9 @@ declare class OIMEventEmitter<T extends Record<string, unknown>> {
90
90
 
91
91
  /**
92
92
  * Payload for index update events containing the keys that were modified */
93
- interface TOIMIndexUpdatePayload<TKey> {
93
+ type TOIMIndexUpdatePayload<TKey> = {
94
94
  keys: readonly TKey[];
95
- }
95
+ };
96
96
 
97
97
  /**
98
98
  * Comparator function for index primary key arrays.
@@ -297,6 +297,19 @@ declare abstract class OIMEventQueueScheduler {
297
297
  * Trigger a flush event. Should be called by subclasses when they execute the scheduled flush.
298
298
  */
299
299
  protected flush(): void;
300
+ /**
301
+ * Detach a Node timer handle from the event loop, returning it unchanged.
302
+ *
303
+ * A pending flush must never be a reason for a process to stay alive: if
304
+ * nothing else is running there is no UI left to update, and the flush is
305
+ * moot. Without this a scheduled-but-not-yet-run flush keeps Node awake —
306
+ * which is why a test suite that leaves a queue scheduled reports
307
+ * "a worker process has failed to exit gracefully".
308
+ *
309
+ * In the browser `setTimeout` returns a number, which has no `unref`, so the
310
+ * call is guarded and the handle passes straight through.
311
+ */
312
+ protected unref<THandle>(handle: THandle): THandle;
300
313
  }
301
314
 
302
315
  declare abstract class OIMIndexSetBased<TKey extends TOIMKey, TPk extends TOIMKey> extends OIMIndex<TKey, TPk, Set<TOIMAnyEntitySlot<TPk>>> {
@@ -384,18 +397,34 @@ type TOIMEventQueueOptions = {
384
397
  * If not provided, flush() must be called manually.
385
398
  */
386
399
  scheduler?: OIMEventQueueScheduler;
400
+ /**
401
+ * Handler for an error thrown by a task during flush. When set, the queue
402
+ * treats the error as handled — it is NOT re-raised out of `flush()`. When
403
+ * NOT set, the error propagates (loud by default: uncaught in async/scheduled
404
+ * mode, thrown to the caller of a manual `flush()`).
405
+ *
406
+ * Either way the queue's own state is always restored (one failing task never
407
+ * wedges the queue) and a `FLUSH_ERROR` event is emitted for tooling.
408
+ */
409
+ onError?: (error: unknown) => void;
387
410
  };
388
411
 
389
- declare enum EOIMEventQueueEventType {
390
- AFTER_FLUSH = 0,
391
- BEFORE_FLUSH = 1
392
- }
412
+ /** Payload of the `EOIMEventQueueEventType.FLUSH_ERROR` event. */
413
+ type TOIMFlushError = {
414
+ /** The value a queue task threw (not necessarily an `Error`). */
415
+ error: unknown;
416
+ };
393
417
 
394
418
  /**
395
419
  * Event queue that can optionally integrate with a scheduler for automatic flushing.
396
420
  */
397
421
  declare class OIMEventQueue {
398
- readonly emitter: OIMEventEmitter<Record<EOIMEventQueueEventType, void>>;
422
+ readonly emitter: OIMEventEmitter<{
423
+ 1: void;
424
+ 0: void;
425
+ 2: TOIMFlushError;
426
+ }>;
427
+ protected readonly onError?: (error: unknown) => void;
399
428
  protected tasks: Set<() => void>;
400
429
  protected tasksSpare: Set<() => void>;
401
430
  protected flushing?: Set<() => void>;
@@ -414,10 +443,14 @@ declare class OIMEventQueue {
414
443
  cancel(fn: () => void): void;
415
444
  get isInFlush(): boolean;
416
445
  /**
417
- * Execute all pending tasks.
446
+ * Execute the tasks pending at the moment the flush starts — a single pass,
447
+ * not a drain-to-empty.
418
448
  *
419
- * This flush drains until the queue is empty. If tasks enqueue more tasks, they will be
420
- * executed within the same flush.
449
+ * The pending set is swapped out for an empty spare up front and the flush
450
+ * iterates that captured set. Tasks enqueued during the flush land in the
451
+ * fresh set and run on the NEXT flush, not this one. (Contrast
452
+ * `OIMComputeRuntime.flush()`, which re-reads its bucket per level and so
453
+ * does drain same-level tasks scheduled mid-flush.)
421
454
  */
422
455
  flush(): void;
423
456
  /**
@@ -476,6 +509,8 @@ declare class OIMCarrierKeyedEmitter<TKey extends TOIMKey, TCarrier extends IOIM
476
509
  private readonly subscribedCarriers;
477
510
  private dirtyCarriers;
478
511
  private isFlushEnqueued;
512
+ private multiCarrierSubscriptions;
513
+ private deliveredPool?;
479
514
  constructor(queue: OIMEventQueue, carrierProvider: IOIMCarrierProvider<TKey, TCarrier>);
480
515
  subscribeOnKey(key: TKey, handler: TOIMEventHandler<void>): () => void;
481
516
  subscribeOnKeys(keys: readonly TKey[], handler: TOIMEventHandler<void>): () => void;
@@ -771,7 +806,6 @@ declare class OIMReactiveCollection<TEntity extends object, TPk extends TOIMKey>
771
806
  protected readonly updateEmitter: OIMCarrierKeyedEmitter<TPk, TOIMEntitySlot<TEntity, TPk>>;
772
807
  private readonly anyUpdateHandlers;
773
808
  private readonly pendingAnyUpdatePks;
774
- private isAnyUpdateClearPending;
775
809
  private isAnyUpdateScheduled;
776
810
  constructor(queue: OIMEventQueue, opts?: TOIMCollectionOptions<TEntity, TPk>);
777
811
  subscribeOnKey(pk: TPk, handler: TOIMEventHandler<void>): () => void;
@@ -788,8 +822,8 @@ declare class OIMReactiveCollection<TEntity extends object, TPk extends TOIMKey>
788
822
  queueLength: number;
789
823
  };
790
824
  subscribeOnAnyUpdate(handler: (pks: readonly TPk[]) => void): () => void;
791
- private notifyLegacy;
792
- private notifyLegacyMany;
825
+ private notifyBatch;
826
+ private notifyBatchMany;
793
827
  upsertOneByPk(pk: TPk, entity: Partial<TEntity>): TOIMEntitySlot<TEntity, TPk>;
794
828
  upsertOne(entity: TEntity | Partial<TEntity>): TOIMEntitySlot<TEntity, TPk>;
795
829
  upsertMany(entities: (TEntity | Partial<TEntity>)[]): TOIMEntitySlot<TEntity, TPk>[];
@@ -800,7 +834,6 @@ declare class OIMReactiveCollection<TEntity extends object, TPk extends TOIMKey>
800
834
  clear(): void;
801
835
  private trackAnyUpdatePk;
802
836
  private trackAnyUpdatePks;
803
- private trackAnyUpdateClear;
804
837
  private ensureAnyUpdateEnqueued;
805
838
  private readonly runAnyUpdate;
806
839
  destroy(): void;
@@ -1135,6 +1168,7 @@ declare abstract class OIMOrderedListCommandBuffer<TKey extends TOIMKey, TItem>
1135
1168
  readonly commandsEventEmitter: OIMUpdateEventEmitter<TKey>;
1136
1169
  private readonly unsubscribeAfterFlush;
1137
1170
  protected readonly commandsByKey: Map<TKey, TOIMOrderedListCommand<TItem>[]>;
1171
+ private readonly staleResetKeys;
1138
1172
  constructor(queue: OIMEventQueue);
1139
1173
  /** Current ordered items for `key` (the driver's backing order). */
1140
1174
  abstract getItemsByKey(key: TKey): readonly TItem[];
@@ -1143,6 +1177,13 @@ declare abstract class OIMOrderedListCommandBuffer<TKey extends TOIMKey, TItem>
1143
1177
  consumeCommands(key: TKey): TOIMOrderedListCommand<TItem>[];
1144
1178
  destroy(): void;
1145
1179
  private readonly onAfterFlush;
1180
+ /**
1181
+ * Rebuild a deferred leading `reset` from the current order, once, at read
1182
+ * time. All the post-reset edits that were folded in are already reflected
1183
+ * in the driver's backing order, so a single rebuild here is equivalent to
1184
+ * having recomputed the reset on each of those edits.
1185
+ */
1186
+ private materializeStaleReset;
1146
1187
  protected appendCommand(key: TKey, cmd: TOIMOrderedListCommand<TItem>): void;
1147
1188
  protected appendResetCommand(key: TKey, items: readonly TItem[]): void;
1148
1189
  protected createResetCommand(items: readonly TItem[]): TOIMOrderedListCommand<TItem>;
@@ -1725,6 +1766,45 @@ declare class OIMCollectionIndexFactory<TEntity extends object, TPk extends TOIM
1725
1766
  }
1726
1767
  declare function createOIMCollectionIndexFactory<TEntity extends object, TPk extends TOIMKey>(queue: OIMEventQueue, collection: OIMReactiveCollection<TEntity, TPk>): OIMCollectionIndexFactory<TEntity, TPk>;
1727
1768
 
1769
+ type TOIMDerivedCollectionOptions<TDerived extends object, TPk extends TOIMKey> = {
1770
+ /**
1771
+ * Skip a downstream update when a source change leaves the re-derived entity
1772
+ * equal. Default `Object.is` (a fresh object each derive → always different,
1773
+ * so it propagates every source change; pass a shallow/field compare to
1774
+ * memoize finer).
1775
+ */
1776
+ compare?: (a: TDerived, b: TDerived) => boolean;
1777
+ /** Custom store — pass a trie-driven store when the source PK is composite. */
1778
+ store?: OIMCollectionStore<TDerived, TPk>;
1779
+ /** Build from the source's current contents at construction (default true). */
1780
+ buildInitial?: boolean;
1781
+ };
1782
+ /**
1783
+ * A reactive collection whose entities are derived one-to-one from a source
1784
+ * collection: `derived[pk] = derive(source[pk])`, keyed by the SOURCE pk. It
1785
+ * listens to the source and keeps itself in sync — add / update / remove.
1786
+ *
1787
+ * It is a first-class `OIMReactiveCollection`, so it can be indexed, selected,
1788
+ * and derived-from again (join → join). Maintenance runs on the source's
1789
+ * synchronous UPDATE channel, so a chain of derivations stays consistent within
1790
+ * the same flush; delivery to keyed subscribers is batched on flush as usual.
1791
+ *
1792
+ * Parallels `OIMDerivedCollectionIndex*`: the source stays the single source of
1793
+ * truth, and this needs no compute runtime — it is driven purely by the source's
1794
+ * update events.
1795
+ */
1796
+ declare class OIMDerivedCollection<TSource extends object, TDerived extends object, TPk extends TOIMKey> extends OIMReactiveCollection<TDerived, TPk> {
1797
+ private readonly source;
1798
+ private readonly derive;
1799
+ private readonly compareDerived;
1800
+ private readonly unsubscribeFromSource;
1801
+ constructor(queue: OIMEventQueue, source: OIMReactiveCollection<TSource, TPk>, derive: (entity: TSource, pk: TPk) => TDerived, opts?: TOIMDerivedCollectionOptions<TDerived, TPk>);
1802
+ rebuildFromSource(): void;
1803
+ destroy(): void;
1804
+ private readonly onSourceUpdate;
1805
+ private syncPk;
1806
+ }
1807
+
1728
1808
  /**
1729
1809
  * Payload type for update events that contain keys */
1730
1810
  type TOIMUpdatePayload<TKey> = {
@@ -2285,9 +2365,18 @@ declare class OIMPkSelectorFactory<TEntity extends object, TPk extends TOIMKey>
2285
2365
  }, TPk>;
2286
2366
  }
2287
2367
 
2368
+ interface IOIMEffectDependency {
2369
+ subscribe(onUpdate: () => void): () => void;
2370
+ }
2371
+
2288
2372
  /**
2289
2373
  * Computative runtime that schedules derived computations by levels and runs them
2290
2374
  * on `queue.flush()` boundary (AFTER_FLUSH).
2375
+ *
2376
+ * Buckets are held in an array indexed by topological level (levels are dense
2377
+ * small non-negative ints), not a `Map` — so the hot schedule/drain path indexes
2378
+ * directly with no hashing. The per-level `Set`s are POOLED: kept in their slot
2379
+ * and `.clear()`ed between flushes rather than re-allocated.
2291
2380
  */
2292
2381
  declare class OIMComputeRuntime {
2293
2382
  readonly queue: OIMEventQueue;
@@ -2297,7 +2386,36 @@ declare class OIMComputeRuntime {
2297
2386
  private maxLevel;
2298
2387
  private readonly dirtyByLevel;
2299
2388
  private readonly afterFlushTasks;
2389
+ private readonly levelByComputed;
2390
+ private readonly unsubscribeFromQueue;
2391
+ private _isDestroyed;
2300
2392
  constructor(queue: OIMEventQueue);
2393
+ /**
2394
+ * Whether {@link destroy} has run. A destroyed runtime is detached from its
2395
+ * queue and must not be reused — `getOIMComputeRuntime` reads this to hand
2396
+ * out a fresh runtime instead of a dead one.
2397
+ */
2398
+ get isDestroyed(): boolean;
2399
+ /**
2400
+ * Detach from the queue and drop everything pending.
2401
+ *
2402
+ * Without this the AFTER_FLUSH subscription lives as long as the queue does,
2403
+ * even once every computed / effect on this runtime is gone — harmless (the
2404
+ * handler early-returns) but impossible to unwind. Destroying does NOT
2405
+ * destroy the nodes scheduled on it; destroy them first, then the runtime.
2406
+ * Idempotent.
2407
+ */
2408
+ destroy(): void;
2409
+ /**
2410
+ * Topological depth for a node with these dependencies: one above the deepest
2411
+ * computed dependency (source-only → 0). The engine owns this — callers pass
2412
+ * their dependencies and get back a level, they never compute it themselves.
2413
+ */
2414
+ computeLevel(deps: readonly IOIMEffectDependency[]): number;
2415
+ /** Record a computed's depth so its dependents can look it up. */
2416
+ registerLevel(computed: object, level: number): void;
2417
+ /** The recorded topological depth of a computed (0 if unknown). Introspection. */
2418
+ getLevel(computed: object): number;
2301
2419
  /**
2302
2420
  * Schedule a one-shot task to run on the next `queue.flush()` (AFTER_FLUSH),
2303
2421
  * ordered by `level` ascending.
@@ -2309,6 +2427,7 @@ declare class OIMComputeRuntime {
2309
2427
  */
2310
2428
  scheduleAfterFlush(task: () => void): () => void;
2311
2429
  private flush;
2430
+ private recomputePendingRange;
2312
2431
  }
2313
2432
 
2314
2433
  interface IOIMSelectorComputedDependency {
@@ -2377,12 +2496,160 @@ declare class OIMCollectionSelectors<TEntity extends object, TPk extends TOIMKey
2377
2496
  entitiesBySetGlobalIndex<TIndex extends OIMGlobalIndexSetBased<TPk>>(index: OIMReactiveGlobalIndexSetBased<TPk, TIndex>): TOIMCollectionEntitiesSelector<TEntity>;
2378
2497
  }
2379
2498
 
2499
+ type TOIMComputedOptions<TValue> = {
2500
+ compute: () => TValue;
2501
+ deps?: readonly IOIMEffectDependency[];
2502
+ compare?: (a: TValue, b: TValue) => boolean;
2503
+ };
2504
+
2505
+ type TOIMComputedUpdatePayload<TKey extends TOIMKey> = {
2506
+ keys: readonly TKey[];
2507
+ };
2508
+
2509
+ type TOIMComputedKey$2 = 'value';
2510
+ declare class OIMComputed<TValue> {
2511
+ readonly emitter: OIMEventEmitter<{
2512
+ update: TOIMComputedUpdatePayload<TOIMComputedKey$2>;
2513
+ }>;
2514
+ readonly updateEventEmitter: OIMUpdateEventEmitter<TOIMComputedKey$2>;
2515
+ private readonly runtime;
2516
+ private readonly compute;
2517
+ private readonly compare;
2518
+ private readonly _deps;
2519
+ private value;
2520
+ private hasValue;
2521
+ private isDirty;
2522
+ private readonly effect;
2523
+ constructor(runtime: OIMComputeRuntime, opts: TOIMComputedOptions<TValue>);
2524
+ get needsRecompute(): boolean;
2525
+ get isReady(): boolean;
2526
+ get deps(): readonly IOIMEffectDependency[];
2527
+ get(): TValue;
2528
+ getIfReady(): TValue | undefined;
2529
+ destroy(): void;
2530
+ private recomputeAndEmitIfChanged;
2531
+ }
2532
+
2533
+ declare class OIMEffectDependencyKeyedCollection<TEntity extends object, TPk extends TOIMKey> implements IOIMEffectDependency {
2534
+ private readonly dep;
2535
+ constructor(collection: OIMReactiveCollection<TEntity, TPk>, pk: TPk);
2536
+ get source(): OIMReactiveCollection<TEntity, TPk>;
2537
+ subscribe(onUpdate: () => void): () => void;
2538
+ }
2539
+
2540
+ declare class OIMEffectDependencyKeyedIndex<TKey extends TOIMKey> implements IOIMEffectDependency {
2541
+ private readonly dep;
2542
+ constructor(index: IOIMKeyedSubscription<TKey>, key: TKey);
2543
+ get source(): IOIMKeyedSubscription<TKey>;
2544
+ subscribe(onUpdate: () => void): () => void;
2545
+ }
2546
+
2547
+ declare class OIMEffectDependencyKeyedObject<TKey extends string, TValue> implements IOIMEffectDependency {
2548
+ private readonly dep;
2549
+ constructor(object: OIMReactiveObject<TKey, TValue>, key: TKey);
2550
+ get source(): OIMReactiveObject<TKey, TValue>;
2551
+ subscribe(onUpdate: () => void): () => void;
2552
+ }
2553
+
2554
+ type TOIMComputedKey$1 = 'value';
2555
+ type TOIMComputedLike = {
2556
+ emitter: OIMEventEmitter<{
2557
+ update: TOIMComputedUpdatePayload<TOIMComputedKey$1>;
2558
+ }>;
2559
+ updateEventEmitter: OIMUpdateEventEmitter<TOIMComputedKey$1>;
2560
+ };
2561
+ /**
2562
+ * Effect dependency on a computed. Carries the computed itself (`source`) so the
2563
+ * runtime can look up its topological depth — the level lives in the runtime,
2564
+ * not on this dependency.
2565
+ */
2566
+ declare class OIMEffectDependencyComputed implements IOIMEffectDependency {
2567
+ readonly source: TOIMComputedLike;
2568
+ constructor(source: TOIMComputedLike);
2569
+ subscribe(onUpdate: () => void): () => void;
2570
+ }
2571
+
2572
+ /**
2573
+ * Dependency builders for `computed` / `effect`. They pick the right wrapper for
2574
+ * each source type so you never instantiate `OIMEffectDependency…` by hand:
2575
+ *
2576
+ * ```ts
2577
+ * kit.computed(
2578
+ * [on.collection(users, 'u1'), on.index(byRole, 'admin'), on.computed(orderCount)],
2579
+ * () => …,
2580
+ * );
2581
+ * ```
2582
+ */
2583
+ declare const on: {
2584
+ /** Depend on one PK of a collection. */
2585
+ collection: <TEntity extends object, TPk extends TOIMKey>(collection: OIMReactiveCollection<TEntity, TPk>, pk: TPk) => OIMEffectDependencyKeyedCollection<TEntity, TPk>;
2586
+ /** Depend on one key of an index. */
2587
+ index: <TKey extends TOIMKey>(index: IOIMKeyedSubscription<TKey>, key: TKey) => OIMEffectDependencyKeyedIndex<TKey>;
2588
+ /** Depend on one key of a reactive object. */
2589
+ object: <TKey extends string, TValue>(object: OIMReactiveObject<TKey, TValue>, key: TKey) => OIMEffectDependencyKeyedObject<TKey, TValue>;
2590
+ /** Depend on another computed. */
2591
+ computed: <TValue>(computed: OIMComputed<TValue>) => OIMEffectDependencyComputed;
2592
+ };
2593
+
2594
+ type TOIMEffectOptions = {
2595
+ deps?: readonly IOIMEffectDependency[];
2596
+ onUpdate?: () => void;
2597
+ run: () => void;
2598
+ };
2599
+
2600
+ declare class OIMEffect {
2601
+ private readonly runtime;
2602
+ private readonly onUpdate?;
2603
+ private readonly run;
2604
+ private readonly deps;
2605
+ /**
2606
+ * Topological depth, owned by the runtime — one above the deepest computed
2607
+ * dependency (source-only effects are `0`). Passed to `runtime.schedule` so
2608
+ * this node runs only after everything it depends on. Internal: nodes never
2609
+ * expose their own level.
2610
+ */
2611
+ private readonly level;
2612
+ private readonly sourceDeps;
2613
+ private readonly computedDeps;
2614
+ private sourceUnsubscribers;
2615
+ private computedUnsubscribers;
2616
+ private dequeueResubscribe?;
2617
+ private isResubscribeEnqueued;
2618
+ private isTemporarilyUnsubscribedForFlush;
2619
+ private isScheduled;
2620
+ private dequeueScheduled?;
2621
+ private readonly runTask;
2622
+ constructor(runtime: OIMComputeRuntime, opts: TOIMEffectOptions, level?: number);
2623
+ destroy(): void;
2624
+ private onSourceInvalidate;
2625
+ private onComputedInvalidate;
2626
+ private runOnce;
2627
+ private subscribeToDeps;
2628
+ private unsubscribeFromSourceDeps;
2629
+ private unsubscribeFromAllDeps;
2630
+ private ensureResubscribeAfterFlush;
2631
+ private readonly onAfterFlush;
2632
+ }
2633
+
2380
2634
  type TOIMReactiveCollectionFactoryOptions<TEntity extends object, TPk extends TOIMKey> = TOIMCollectionOptions<TEntity, TPk>;
2381
2635
  type TOIMCollectionKit<TEntity extends object, TPk extends TOIMKey> = {
2382
2636
  queue: OIMEventQueue;
2383
2637
  collection: OIMReactiveCollection<TEntity, TPk>;
2384
2638
  indexFactory: OIMCollectionIndexFactory<TEntity, TPk>;
2385
2639
  select: OIMCollectionSelectors<TEntity, TPk>;
2640
+ /** Dependency builders for `computed` / `effect` (no manual wrapper classes). */
2641
+ on: typeof on;
2642
+ /**
2643
+ * Create a computed on the queue's shared runtime and add it to `scope`.
2644
+ * Deps come from `on.*` and may reference any source sharing the queue.
2645
+ */
2646
+ computed: <TValue>(deps: readonly IOIMEffectDependency[], compute: () => TValue, options?: {
2647
+ compare?: (a: TValue, b: TValue) => boolean;
2648
+ }) => OIMComputed<TValue>;
2649
+ /** Create an effect on the queue's shared runtime and add it to `scope`. */
2650
+ effect: (deps: readonly IOIMEffectDependency[], run: () => void, options?: {
2651
+ onUpdate?: () => void;
2652
+ }) => OIMEffect;
2386
2653
  /**
2387
2654
  * Dispose scope owning the kit's collection. `add()` indexes/streams/
2388
2655
  * subscriptions you create off the kit, then `destroy()` tears them all down
@@ -2396,6 +2663,51 @@ type TOIMCollectionKit<TEntity extends object, TPk extends TOIMKey> = {
2396
2663
 
2397
2664
  declare function createOIMCollectionKit<TEntity extends object, TPk extends TOIMKey>(queue: OIMEventQueue, opts?: TOIMReactiveCollectionFactoryOptions<TEntity, TPk>): TOIMCollectionKit<TEntity, TPk>;
2398
2665
 
2666
+ /**
2667
+ * The ONE compute runtime for a queue. Every computed / effect / selector that
2668
+ * shares a queue must share a runtime — they form one dependency graph, and
2669
+ * levels + scheduling live per-runtime. Created lazily on first use and cached
2670
+ * (per queue, garbage-collected with it), so cross-collection computeds all
2671
+ * schedule on the same topological pass.
2672
+ *
2673
+ * A runtime that was destroyed is replaced rather than handed back: it is
2674
+ * detached from the queue and would never drain again.
2675
+ *
2676
+ * See `peekOIMComputeRuntime` to read without creating, and
2677
+ * `setOIMComputeRuntime` to install your own.
2678
+ */
2679
+ declare function getOIMComputeRuntime(queue: OIMEventQueue): OIMComputeRuntime;
2680
+
2681
+ /**
2682
+ * The runtime already attached to `queue`, or `undefined` — WITHOUT creating one.
2683
+ *
2684
+ * The read-only counterpart of `getOIMComputeRuntime`, for code that must not
2685
+ * change what it observes: devtools asking "does this queue even have a compute
2686
+ * graph", teardown checking whether there is anything to destroy, assertions in
2687
+ * tests. A runtime that has been destroyed reads as `undefined`, matching what
2688
+ * `getOIMComputeRuntime` would then replace — so a caller cannot get hold of a
2689
+ * detached runtime through this door either.
2690
+ */
2691
+ declare function peekOIMComputeRuntime(queue: OIMEventQueue): OIMComputeRuntime | undefined;
2692
+
2693
+ /**
2694
+ * Install `runtime` as the one runtime for `queue`, replacing whatever was there.
2695
+ *
2696
+ * The injection seam for a subclassed runtime — an instrumented one that records
2697
+ * levels and drain order, a profiling one, a test double. Call it BEFORE anything
2698
+ * touches the queue's compute graph: nodes capture their runtime at construction,
2699
+ * so swapping afterwards leaves the existing ones on the old instance and splits
2700
+ * the dependency graph in two, which is exactly the glitch the one-runtime-per-
2701
+ * queue rule exists to prevent.
2702
+ *
2703
+ * `runtime.queue` must be `queue` — a runtime drains on its own queue's
2704
+ * AFTER_FLUSH, so a mismatched pair would never run.
2705
+ *
2706
+ * Replacing does NOT destroy the previous runtime: whoever installs a replacement
2707
+ * decides whether the old one still has live nodes on it.
2708
+ */
2709
+ declare function setOIMComputeRuntime(queue: OIMEventQueue, runtime: OIMComputeRuntime): void;
2710
+
2399
2711
  type TOIMFieldKey<TEntity extends object> = keyof TEntity & string;
2400
2712
  /**
2401
2713
  * Tracks changed fields per entity PK for an `OIMCollection`.
@@ -2894,6 +3206,18 @@ declare enum EOIMIndexEventType {
2894
3206
  UPDATE = 0
2895
3207
  }
2896
3208
 
3209
+ declare enum EOIMEventQueueEventType {
3210
+ AFTER_FLUSH = 0,
3211
+ BEFORE_FLUSH = 1,
3212
+ /**
3213
+ * A task threw during flush. Emitted once per failing task, ALWAYS (whether
3214
+ * or not an `onError` handler is installed) — an observation channel for
3215
+ * tooling (devtools / MCP). It does not replace the error being raised: with
3216
+ * no `onError` handler the error still propagates out of `flush()`.
3217
+ */
3218
+ FLUSH_ERROR = 2
3219
+ }
3220
+
2897
3221
  declare enum EOIMObjectEventType {
2898
3222
  UPDATE = 0
2899
3223
  }
@@ -2931,88 +3255,17 @@ declare class OIMDBSettings {
2931
3255
  static readonly FLUSHING_KEYS_INDEX_KEY: "__flushingKeys__";
2932
3256
  }
2933
3257
 
2934
- interface IOIMEffectDependency {
2935
- subscribe(onUpdate: () => void): () => void;
2936
- }
2937
-
2938
- type TOIMComputedOptions<TValue> = {
2939
- compute: () => TValue;
2940
- deps?: readonly IOIMEffectDependency[];
2941
- compare?: (a: TValue, b: TValue) => boolean;
2942
- };
2943
-
2944
- type TOIMComputedUpdatePayload<TKey extends TOIMKey> = {
2945
- keys: readonly TKey[];
2946
- };
2947
-
2948
- type TOIMComputedKey$2 = 'value';
2949
- declare class OIMComputed<TValue> {
2950
- readonly emitter: OIMEventEmitter<{
2951
- update: TOIMComputedUpdatePayload<TOIMComputedKey$2>;
2952
- }>;
2953
- readonly updateEventEmitter: OIMUpdateEventEmitter<TOIMComputedKey$2>;
2954
- private readonly runtime;
2955
- private readonly compute;
2956
- private readonly compare;
2957
- private readonly _deps;
2958
- private value;
2959
- private hasValue;
2960
- private isDirty;
2961
- private readonly effect;
2962
- constructor(runtime: OIMComputeRuntime, opts: TOIMComputedOptions<TValue>);
2963
- get needsRecompute(): boolean;
2964
- get isReady(): boolean;
2965
- get deps(): readonly IOIMEffectDependency[];
2966
- get(): TValue;
2967
- getIfReady(): TValue | undefined;
2968
- destroy(): void;
2969
- private recomputeAndEmitIfChanged;
2970
- }
2971
-
2972
3258
  declare enum EOIMComputedEventType {
2973
3259
  UPDATE = "update"
2974
3260
  }
2975
3261
 
2976
- type TOIMComputedKey$1 = 'value';
3262
+ type TOIMComputedKey = 'value';
2977
3263
  interface IOIMComputedEventSource {
2978
3264
  emitter: OIMEventEmitter<{
2979
- [EOIMComputedEventType.UPDATE]: TOIMComputedUpdatePayload<TOIMComputedKey$1>;
3265
+ [EOIMComputedEventType.UPDATE]: TOIMComputedUpdatePayload<TOIMComputedKey>;
2980
3266
  }>;
2981
3267
  }
2982
3268
 
2983
- type TOIMEffectOptions = {
2984
- deps?: readonly IOIMEffectDependency[];
2985
- onUpdate?: () => void;
2986
- run: () => void;
2987
- };
2988
-
2989
- declare class OIMEffect {
2990
- private readonly runtime;
2991
- private readonly onUpdate?;
2992
- private readonly run;
2993
- private readonly deps;
2994
- private readonly sourceDeps;
2995
- private readonly computedDeps;
2996
- private sourceUnsubscribers;
2997
- private computedUnsubscribers;
2998
- private dequeueResubscribe?;
2999
- private isResubscribeEnqueued;
3000
- private isTemporarilyUnsubscribedForFlush;
3001
- private isScheduled;
3002
- private dequeueScheduled?;
3003
- private readonly runTask;
3004
- constructor(runtime: OIMComputeRuntime, opts: TOIMEffectOptions);
3005
- destroy(): void;
3006
- private onSourceInvalidate;
3007
- private onComputedInvalidate;
3008
- private runOnce;
3009
- private subscribeToDeps;
3010
- private unsubscribeFromSourceDeps;
3011
- private unsubscribeFromAllDeps;
3012
- private ensureResubscribeAfterFlush;
3013
- private readonly onAfterFlush;
3014
- }
3015
-
3016
3269
  /**
3017
3270
  * Depends on updates to ONE key of a keyed source. The key argument is the whole
3018
3271
  * key — a composite key `[a, b]` is one key, never split — so there is no
@@ -3026,43 +3279,6 @@ declare class OIMEffectDependencyKeyed<TKey extends TOIMKey> implements IOIMEffe
3026
3279
  subscribe(onUpdate: () => void): () => void;
3027
3280
  }
3028
3281
 
3029
- declare class OIMEffectDependencyKeyedObject<TKey extends string, TValue> implements IOIMEffectDependency {
3030
- private readonly dep;
3031
- constructor(object: OIMReactiveObject<TKey, TValue>, key: TKey);
3032
- get source(): OIMReactiveObject<TKey, TValue>;
3033
- subscribe(onUpdate: () => void): () => void;
3034
- }
3035
-
3036
- declare class OIMEffectDependencyKeyedCollection<TEntity extends object, TPk extends TOIMKey> implements IOIMEffectDependency {
3037
- private readonly dep;
3038
- constructor(collection: OIMReactiveCollection<TEntity, TPk>, pk: TPk);
3039
- get source(): OIMReactiveCollection<TEntity, TPk>;
3040
- subscribe(onUpdate: () => void): () => void;
3041
- }
3042
-
3043
- declare class OIMEffectDependencyKeyedIndex<TKey extends TOIMKey> implements IOIMEffectDependency {
3044
- private readonly dep;
3045
- constructor(index: IOIMKeyedSubscription<TKey>, key: TKey);
3046
- get source(): IOIMKeyedSubscription<TKey>;
3047
- subscribe(onUpdate: () => void): () => void;
3048
- }
3049
-
3050
- type TOIMComputedKey = 'value';
3051
- type TOIMComputedLike = {
3052
- emitter: OIMEventEmitter<{
3053
- update: TOIMComputedUpdatePayload<TOIMComputedKey>;
3054
- }>;
3055
- updateEventEmitter: OIMUpdateEventEmitter<TOIMComputedKey>;
3056
- };
3057
- /**
3058
- * Effect dependency on a computed.
3059
- */
3060
- declare class OIMEffectDependencyComputed implements IOIMEffectDependency {
3061
- readonly source: TOIMComputedLike;
3062
- constructor(source: TOIMComputedLike);
3063
- subscribe(onUpdate: () => void): () => void;
3064
- }
3065
-
3066
3282
  declare class OIMCollectionByPkSelector<TEntity extends object, TPk extends TOIMKey> extends OIMSelector<TEntity | undefined> {
3067
3283
  private readonly collection;
3068
3284
  private readonly pk;
@@ -3158,4 +3374,4 @@ declare class OIMEntitiesByGlobalIndexArrayBasedSelector<TEntity extends object,
3158
3374
  protected areEqual(prev: readonly (TEntity | undefined)[], next: readonly (TEntity | undefined)[]): boolean;
3159
3375
  }
3160
3376
 
3161
- export { EOIMCollectionEventType, EOIMComputedEventType, EOIMEventQueueEventType, EOIMEventQueueSchedulerEventType, EOIMIndexEventType, EOIMObjectEventType, type IOIMCarrierBucketStore, type IOIMCarrierProvider, type IOIMComputedEventSource, type IOIMDisposable, type IOIMEffectDependency, type IOIMEventQueueSchedulerEvents, type IOIMGlobalIndexSlotSource, type IOIMIndexSlotSource, type IOIMIndexStore, type IOIMKeyedMap, type IOIMKeyedSet, type IOIMKeyedUpdateEmitter, type IOIMOrderedListCommandSource, type IOIMPkCodec, type IOIMSingleUpdateEmitter, type IOIMSubscribable, type IOIMSubscription, OIMBucketCarrierProvider, OIMCarrierKeyedEmitter, OIMCarrierSingleEmitter, OIMCollection, OIMCollectionByPkSelector, OIMCollectionByPksSelector, OIMCollectionChangedFields, OIMCollectionIndexFactory, OIMCollectionIndexManualOrderedArrayBased, OIMCollectionOrderedListCommandStream, OIMCollectionSelectors, OIMCollectionStore, OIMCollectionStoreMapDriven, OIMCollectionStoreTrieDriven, OIMComparatorFactory, OIMComputeRuntime, OIMComputed, OIMDBSettings, OIMDerivedCollectionGlobalIndexArrayBased, OIMDerivedCollectionGlobalIndexSetBased, OIMDerivedCollectionIndexArrayBased, OIMDerivedCollectionIndexSetBased, OIMDisposeScope, OIMEffect, OIMEffectDependencyComputed, OIMEffectDependencyKeyed, OIMEffectDependencyKeyedCollection, OIMEffectDependencyKeyedIndex, OIMEffectDependencyKeyedObject, OIMEntitiesByGlobalIndexArrayBasedSelector, OIMEntitiesByGlobalIndexSetBasedSelector, OIMEntitiesByIndexKeyArrayBasedSelector, OIMEntitiesByIndexKeySetBasedSelector, OIMEntityUpdaterFactory, OIMEventEmitter, OIMEventQueue, OIMEventQueueScheduler, OIMEventQueueSchedulerAnimationFrame, OIMEventQueueSchedulerFactory, OIMEventQueueSchedulerImmediate, OIMEventQueueSchedulerMicrotask, OIMEventQueueSchedulerSync, OIMEventQueueSchedulerTimeout, OIMGlobalIndex, OIMGlobalIndexArrayBased, OIMGlobalIndexManualArrayBased, OIMGlobalIndexManualSetBased, OIMGlobalIndexSetBased, OIMGlobalIndexSlotMap, OIMIndex, OIMIndexArrayBased, OIMIndexComparatorFactory, OIMIndexManualArrayBased, OIMIndexManualOrderedArrayBased, OIMIndexManualSetBased, OIMIndexPksByKeyArrayBasedSelector, OIMIndexPksByKeySetBasedSelector, OIMIndexPksByKeysArrayBasedSelector, OIMIndexPksByKeysSetBasedSelector, OIMIndexSetBased, OIMIndexSlotMap, OIMIndexStoreArrayBased, OIMIndexStoreMapDrivenArrayBased, OIMIndexStoreMapDrivenSetBased, OIMIndexStoreSetBased, OIMIndexStoreTrieDrivenArrayBased, OIMIndexStoreTrieDrivenSetBased, OIMKeyPathCarrierProvider, OIMKeyedBucketArrayBased, OIMKeyedBucketSetBased, OIMMap2Keys, OIMObject, OIMObjectStore, OIMObjectStoreMapDriven, OIMObjectStoreRecordDriven, OIMObjectValueByKeySelector, OIMObjectValuesByKeysSelector, OIMOrderedListCommandBuffer, OIMOrderedListCommandStream, OIMOrderedListCommandStreamDiffDriven, OIMOrderedListMappedCommandStream, OIMPkCodecKeyPath, OIMPkSelectorFactory, OIMReactiveCollection, OIMReactiveCollectionGlobalIndexManualArrayBased, OIMReactiveCollectionGlobalIndexManualSetBased, OIMReactiveCollectionIndexCompositeTrieArrayBased, OIMReactiveCollectionIndexCompositeTrieSetBased, OIMReactiveCollectionIndexManualArrayBased, OIMReactiveCollectionIndexManualSetBased, OIMReactiveGlobalIndex, OIMReactiveGlobalIndexArrayBased, OIMReactiveGlobalIndexManualArrayBased, OIMReactiveGlobalIndexManualSetBased, OIMReactiveGlobalIndexSetBased, OIMReactiveIndex, OIMReactiveIndexArrayBased, OIMReactiveIndexManualArrayBased, OIMReactiveIndexManualSetBased, OIMReactiveIndexSetBased, OIMReactiveObject, OIMSelector, OIMTrieMap, OIMTrieSet, type TOIMAnyEntitySlot, type TOIMCollectionEntitiesSelector, type TOIMCollectionEntitySelector, type TOIMCollectionGlobalIndexArrayBasedOptions, type TOIMCollectionGlobalIndexSetBasedOptions, type TOIMCollectionIndexArrayBasedOptions, type TOIMCollectionIndexCompositeArrayBasedOptions, type TOIMCollectionIndexCompositeSetBasedOptions, type TOIMCollectionIndexSetBasedOptions, type TOIMCollectionKit, type TOIMCollectionOptions, type TOIMCollectionOrderedIndexOptions, type TOIMCollectionOrderedListCommandStreamOptions, type TOIMCollectionUpdatePayload, type TOIMComparator, type TOIMComputedOptions, type TOIMComputedUpdatePayload, type TOIMDerivedCollectionGlobalIndexArrayBasedOptions, type TOIMDerivedCollectionGlobalIndexSetBasedOptions, type TOIMDerivedCollectionIndexArrayBasedOptions, type TOIMDerivedCollectionIndexSetBasedOptions, type TOIMDerivedEntityComparator, type TOIMDerivedEntityOrderSelector, type TOIMDerivedEntityOrderValue, type TOIMDerivedIndexKeySelector, type TOIMDisposable, type TOIMEffectOptions, type TOIMEntitySlot, type TOIMEntitySlotGetter, type TOIMEntityUpdater, type TOIMEventHandler, type TOIMEventQueueOptions, type TOIMGlobalIndexFilter, type TOIMIndexComparator, type TOIMIndexKey, type TOIMIndexOptionsArrayBased, type TOIMIndexOptionsSetBased, type TOIMIndexPksUpdatePayload, type TOIMIndexUpdatePayload, type TOIMKey, type TOIMKeyPath, type TOIMObjectOptions, type TOIMOrderedListCommand, type TOIMOrderedListDiffOptions, type TOIMPk, type TOIMPkSelector, type TOIMReactiveCollectionFactoryOptions, type TOIMRelationsArrayIndexOptions, type TOIMRelationsCompositeArrayIndexOptions, type TOIMRelationsCompositeSetIndexOptions, type TOIMRelationsDerivedArrayIndexOptions, type TOIMRelationsDerivedGlobalArrayIndexOptions, type TOIMRelationsDerivedGlobalSetIndexOptions, type TOIMRelationsDerivedSetIndexOptions, type TOIMRelationsGlobalArrayIndexOptions, type TOIMRelationsGlobalSetIndexOptions, type TOIMRelationsOrderedListOptions, type TOIMRelationsSetIndexOptions, type TOIMSchedulerOptions, type TOIMSchedulerType, type TOIMUpdatePayload, createInPlaceEntityUpdater, createMergeEntityUpdater, createOIMCollectionIndexFactory, createOIMCollectionKit, createOIMDisposeScope, createOIMGlobalIndexSlotMap, createOIMIndexSlotMap, createOIMOrderedListCommandStreamDiffDriven, createOIMOrderedListMappedCommandStream, diffOrderedListByPk };
3377
+ export { EOIMCollectionEventType, EOIMComputedEventType, EOIMEventQueueEventType, EOIMEventQueueSchedulerEventType, EOIMIndexEventType, EOIMObjectEventType, type IOIMCarrierBucketStore, type IOIMCarrierProvider, type IOIMComputedEventSource, type IOIMDisposable, type IOIMEffectDependency, type IOIMEventQueueSchedulerEvents, type IOIMGlobalIndexSlotSource, type IOIMIndexSlotSource, type IOIMIndexStore, type IOIMKeyedMap, type IOIMKeyedSet, type IOIMKeyedUpdateEmitter, type IOIMOrderedListCommandSource, type IOIMPkCodec, type IOIMSingleUpdateEmitter, type IOIMSubscribable, type IOIMSubscription, OIMBucketCarrierProvider, OIMCarrierKeyedEmitter, OIMCarrierSingleEmitter, OIMCollection, OIMCollectionByPkSelector, OIMCollectionByPksSelector, OIMCollectionChangedFields, OIMCollectionIndexFactory, OIMCollectionIndexManualOrderedArrayBased, OIMCollectionOrderedListCommandStream, OIMCollectionSelectors, OIMCollectionStore, OIMCollectionStoreMapDriven, OIMCollectionStoreTrieDriven, OIMComparatorFactory, OIMComputeRuntime, OIMComputed, OIMDBSettings, OIMDerivedCollection, OIMDerivedCollectionGlobalIndexArrayBased, OIMDerivedCollectionGlobalIndexSetBased, OIMDerivedCollectionIndexArrayBased, OIMDerivedCollectionIndexSetBased, OIMDisposeScope, OIMEffect, OIMEffectDependencyComputed, OIMEffectDependencyKeyed, OIMEffectDependencyKeyedCollection, OIMEffectDependencyKeyedIndex, OIMEffectDependencyKeyedObject, OIMEntitiesByGlobalIndexArrayBasedSelector, OIMEntitiesByGlobalIndexSetBasedSelector, OIMEntitiesByIndexKeyArrayBasedSelector, OIMEntitiesByIndexKeySetBasedSelector, OIMEntityUpdaterFactory, OIMEventEmitter, OIMEventQueue, OIMEventQueueScheduler, OIMEventQueueSchedulerAnimationFrame, OIMEventQueueSchedulerFactory, OIMEventQueueSchedulerImmediate, OIMEventQueueSchedulerMicrotask, OIMEventQueueSchedulerSync, OIMEventQueueSchedulerTimeout, OIMGlobalIndex, OIMGlobalIndexArrayBased, OIMGlobalIndexManualArrayBased, OIMGlobalIndexManualSetBased, OIMGlobalIndexSetBased, OIMGlobalIndexSlotMap, OIMIndex, OIMIndexArrayBased, OIMIndexComparatorFactory, OIMIndexManualArrayBased, OIMIndexManualOrderedArrayBased, OIMIndexManualSetBased, OIMIndexPksByKeyArrayBasedSelector, OIMIndexPksByKeySetBasedSelector, OIMIndexPksByKeysArrayBasedSelector, OIMIndexPksByKeysSetBasedSelector, OIMIndexSetBased, OIMIndexSlotMap, OIMIndexStoreArrayBased, OIMIndexStoreMapDrivenArrayBased, OIMIndexStoreMapDrivenSetBased, OIMIndexStoreSetBased, OIMIndexStoreTrieDrivenArrayBased, OIMIndexStoreTrieDrivenSetBased, OIMKeyPathCarrierProvider, OIMKeyedBucketArrayBased, OIMKeyedBucketSetBased, OIMMap2Keys, OIMObject, OIMObjectStore, OIMObjectStoreMapDriven, OIMObjectStoreRecordDriven, OIMObjectValueByKeySelector, OIMObjectValuesByKeysSelector, OIMOrderedListCommandBuffer, OIMOrderedListCommandStream, OIMOrderedListCommandStreamDiffDriven, OIMOrderedListMappedCommandStream, OIMPkCodecKeyPath, OIMPkSelectorFactory, OIMReactiveCollection, OIMReactiveCollectionGlobalIndexManualArrayBased, OIMReactiveCollectionGlobalIndexManualSetBased, OIMReactiveCollectionIndexCompositeTrieArrayBased, OIMReactiveCollectionIndexCompositeTrieSetBased, OIMReactiveCollectionIndexManualArrayBased, OIMReactiveCollectionIndexManualSetBased, OIMReactiveGlobalIndex, OIMReactiveGlobalIndexArrayBased, OIMReactiveGlobalIndexManualArrayBased, OIMReactiveGlobalIndexManualSetBased, OIMReactiveGlobalIndexSetBased, OIMReactiveIndex, OIMReactiveIndexArrayBased, OIMReactiveIndexManualArrayBased, OIMReactiveIndexManualSetBased, OIMReactiveIndexSetBased, OIMReactiveObject, OIMSelector, OIMTrieMap, OIMTrieSet, type TOIMAnyEntitySlot, type TOIMCollectionEntitiesSelector, type TOIMCollectionEntitySelector, type TOIMCollectionGlobalIndexArrayBasedOptions, type TOIMCollectionGlobalIndexSetBasedOptions, type TOIMCollectionIndexArrayBasedOptions, type TOIMCollectionIndexCompositeArrayBasedOptions, type TOIMCollectionIndexCompositeSetBasedOptions, type TOIMCollectionIndexSetBasedOptions, type TOIMCollectionKit, type TOIMCollectionOptions, type TOIMCollectionOrderedIndexOptions, type TOIMCollectionOrderedListCommandStreamOptions, type TOIMCollectionUpdatePayload, type TOIMComparator, type TOIMComputedOptions, type TOIMComputedUpdatePayload, type TOIMDerivedCollectionGlobalIndexArrayBasedOptions, type TOIMDerivedCollectionGlobalIndexSetBasedOptions, type TOIMDerivedCollectionIndexArrayBasedOptions, type TOIMDerivedCollectionIndexSetBasedOptions, type TOIMDerivedCollectionOptions, type TOIMDerivedEntityComparator, type TOIMDerivedEntityOrderSelector, type TOIMDerivedEntityOrderValue, type TOIMDerivedIndexKeySelector, type TOIMDisposable, type TOIMEffectOptions, type TOIMEntitySlot, type TOIMEntitySlotGetter, type TOIMEntityUpdater, type TOIMEventHandler, type TOIMEventQueueOptions, type TOIMFlushError, type TOIMGlobalIndexFilter, type TOIMIndexComparator, type TOIMIndexKey, type TOIMIndexOptionsArrayBased, type TOIMIndexOptionsSetBased, type TOIMIndexPksUpdatePayload, type TOIMIndexUpdatePayload, type TOIMKey, type TOIMKeyPath, type TOIMObjectOptions, type TOIMOrderedListCommand, type TOIMOrderedListDiffOptions, type TOIMPk, type TOIMPkSelector, type TOIMReactiveCollectionFactoryOptions, type TOIMRelationsArrayIndexOptions, type TOIMRelationsCompositeArrayIndexOptions, type TOIMRelationsCompositeSetIndexOptions, type TOIMRelationsDerivedArrayIndexOptions, type TOIMRelationsDerivedGlobalArrayIndexOptions, type TOIMRelationsDerivedGlobalSetIndexOptions, type TOIMRelationsDerivedSetIndexOptions, type TOIMRelationsGlobalArrayIndexOptions, type TOIMRelationsGlobalSetIndexOptions, type TOIMRelationsOrderedListOptions, type TOIMRelationsSetIndexOptions, type TOIMSchedulerOptions, type TOIMSchedulerType, type TOIMUpdatePayload, createInPlaceEntityUpdater, createMergeEntityUpdater, createOIMCollectionIndexFactory, createOIMCollectionKit, createOIMDisposeScope, createOIMGlobalIndexSlotMap, createOIMIndexSlotMap, createOIMOrderedListCommandStreamDiffDriven, createOIMOrderedListMappedCommandStream, diffOrderedListByPk, getOIMComputeRuntime, on, peekOIMComputeRuntime, setOIMComputeRuntime };