@oimdb/core 3.8.0 → 3.10.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/README.md +23 -4
- package/dist/index.cjs +238 -251
- package/dist/index.d.cts +153 -183
- package/dist/index.d.ts +153 -183
- package/dist/index.js +236 -247
- package/llms.txt +43 -1
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -550,7 +550,7 @@ var OIMIndexArrayBased = class extends OIMIndex {
|
|
|
550
550
|
|
|
551
551
|
// src/core/OIMCarrierKeyedEmitter.ts
|
|
552
552
|
var OIMCarrierKeyedEmitter = class {
|
|
553
|
-
constructor(queue,
|
|
553
|
+
constructor(queue, carrierProvider) {
|
|
554
554
|
// Carriers with at least one subscriber — for markAllUpdated / metrics.
|
|
555
555
|
this.subscribedCarriers = /* @__PURE__ */ new Set();
|
|
556
556
|
// Pending flush batch. A plain array + a `carrier.dirty` flag for dedup —
|
|
@@ -575,17 +575,17 @@ var OIMCarrierKeyedEmitter = class {
|
|
|
575
575
|
}
|
|
576
576
|
};
|
|
577
577
|
this.queue = queue;
|
|
578
|
-
this.
|
|
578
|
+
this.carrierProvider = carrierProvider;
|
|
579
579
|
}
|
|
580
580
|
subscribeOnKey(key, handler) {
|
|
581
|
-
const carrier = this.
|
|
581
|
+
const carrier = this.carrierProvider.getOrReserveCarrier(key);
|
|
582
582
|
this.addHandler(carrier, handler);
|
|
583
583
|
return () => this.removeHandler(carrier, handler);
|
|
584
584
|
}
|
|
585
585
|
subscribeOnKeys(keys, handler) {
|
|
586
586
|
const carriers = [];
|
|
587
587
|
for (let i = 0; i < keys.length; i++) {
|
|
588
|
-
const carrier = this.
|
|
588
|
+
const carrier = this.carrierProvider.getOrReserveCarrier(keys[i]);
|
|
589
589
|
this.addHandler(carrier, handler);
|
|
590
590
|
carriers.push(carrier);
|
|
591
591
|
}
|
|
@@ -596,7 +596,7 @@ var OIMCarrierKeyedEmitter = class {
|
|
|
596
596
|
};
|
|
597
597
|
}
|
|
598
598
|
unsubscribeFromKey(key, handler) {
|
|
599
|
-
const carrier = this.
|
|
599
|
+
const carrier = this.carrierProvider.findCarrier(key);
|
|
600
600
|
if (carrier) this.removeHandler(carrier, handler);
|
|
601
601
|
}
|
|
602
602
|
unsubscribeFromKeys(keys, handler) {
|
|
@@ -619,7 +619,7 @@ var OIMCarrierKeyedEmitter = class {
|
|
|
619
619
|
subscribers.delete(handler);
|
|
620
620
|
if (subscribers.size === 0) {
|
|
621
621
|
this.subscribedCarriers.delete(carrier);
|
|
622
|
-
this.
|
|
622
|
+
this.carrierProvider.onCarrierEmptied?.(carrier);
|
|
623
623
|
}
|
|
624
624
|
}
|
|
625
625
|
/** Fast path: the writer already holds the carrier. */
|
|
@@ -637,7 +637,7 @@ var OIMCarrierKeyedEmitter = class {
|
|
|
637
637
|
this.assertNotInFlush();
|
|
638
638
|
return;
|
|
639
639
|
}
|
|
640
|
-
const carrier = this.
|
|
640
|
+
const carrier = this.carrierProvider.findCarrier(key);
|
|
641
641
|
if (carrier) this.markUpdatedCarrier(carrier);
|
|
642
642
|
else this.assertNotInFlush();
|
|
643
643
|
}
|
|
@@ -662,7 +662,7 @@ var OIMCarrierKeyedEmitter = class {
|
|
|
662
662
|
return this.subscribedCarriers.size > 0;
|
|
663
663
|
}
|
|
664
664
|
getHandlerCount(key) {
|
|
665
|
-
return this.
|
|
665
|
+
return this.carrierProvider.findCarrier(key)?.subscribers?.size ?? 0;
|
|
666
666
|
}
|
|
667
667
|
getMetrics() {
|
|
668
668
|
let totalHandlers = 0;
|
|
@@ -722,8 +722,8 @@ var OIMCarrierKeyedEmitter = class {
|
|
|
722
722
|
}
|
|
723
723
|
};
|
|
724
724
|
|
|
725
|
-
// src/core/
|
|
726
|
-
var
|
|
725
|
+
// src/core/OIMKeyedCarrierProvider.ts
|
|
726
|
+
var OIMKeyedCarrierProvider = class {
|
|
727
727
|
constructor() {
|
|
728
728
|
this.carriers = /* @__PURE__ */ new Map();
|
|
729
729
|
}
|
|
@@ -745,8 +745,8 @@ var OIMKeyedCarrierResolver = class {
|
|
|
745
745
|
|
|
746
746
|
// src/abstract/OIMReactiveIndex.ts
|
|
747
747
|
var OIMReactiveIndex = class {
|
|
748
|
-
constructor(queue, createIndex,
|
|
749
|
-
this.updateEmitter = new OIMCarrierKeyedEmitter(queue,
|
|
748
|
+
constructor(queue, createIndex, createCarrierProvider = () => new OIMKeyedCarrierProvider()) {
|
|
749
|
+
this.updateEmitter = new OIMCarrierKeyedEmitter(queue, createCarrierProvider());
|
|
750
750
|
this.index = createIndex(this.updateEmitter);
|
|
751
751
|
}
|
|
752
752
|
getEntitiesByKey(key) {
|
|
@@ -802,8 +802,8 @@ var OIMReactiveIndex = class {
|
|
|
802
802
|
|
|
803
803
|
// src/abstract/OIMReactiveIndexSetBased.ts
|
|
804
804
|
var OIMReactiveIndexSetBased = class extends OIMReactiveIndex {
|
|
805
|
-
constructor(queue, createIndex,
|
|
806
|
-
super(queue, createIndex,
|
|
805
|
+
constructor(queue, createIndex, createCarrierProvider) {
|
|
806
|
+
super(queue, createIndex, createCarrierProvider);
|
|
807
807
|
}
|
|
808
808
|
getPksByKey(key) {
|
|
809
809
|
return this.index.getPksByKey(key);
|
|
@@ -821,8 +821,8 @@ var OIMReactiveIndexSetBased = class extends OIMReactiveIndex {
|
|
|
821
821
|
|
|
822
822
|
// src/abstract/OIMReactiveIndexArrayBased.ts
|
|
823
823
|
var OIMReactiveIndexArrayBased = class extends OIMReactiveIndex {
|
|
824
|
-
constructor(queue, createIndex,
|
|
825
|
-
super(queue, createIndex,
|
|
824
|
+
constructor(queue, createIndex, createCarrierProvider) {
|
|
825
|
+
super(queue, createIndex, createCarrierProvider);
|
|
826
826
|
}
|
|
827
827
|
getPksByKey(key) {
|
|
828
828
|
return this.index.getPksByKey(key);
|
|
@@ -1097,24 +1097,10 @@ var OIMPkSelectorFactory = class {
|
|
|
1097
1097
|
}
|
|
1098
1098
|
};
|
|
1099
1099
|
|
|
1100
|
-
// src/core/OIMKeyDomainNative.ts
|
|
1101
|
-
var OIMKeyDomainNative = class {
|
|
1102
|
-
createMap() {
|
|
1103
|
-
return /* @__PURE__ */ new Map();
|
|
1104
|
-
}
|
|
1105
|
-
createSet() {
|
|
1106
|
-
return /* @__PURE__ */ new Set();
|
|
1107
|
-
}
|
|
1108
|
-
canonicalize(key) {
|
|
1109
|
-
return key;
|
|
1110
|
-
}
|
|
1111
|
-
};
|
|
1112
|
-
|
|
1113
1100
|
// src/core/OIMCollectionStoreMapDriven.ts
|
|
1114
1101
|
var OIMCollectionStoreMapDriven = class extends OIMCollectionStore {
|
|
1115
1102
|
constructor() {
|
|
1116
1103
|
super(...arguments);
|
|
1117
|
-
this.keyDomain = new OIMKeyDomainNative();
|
|
1118
1104
|
this.slots = /* @__PURE__ */ new Map();
|
|
1119
1105
|
// Slots reserved by indexes for PKs whose entity has not arrived yet.
|
|
1120
1106
|
// They carry `item: undefined` and live apart from `slots` so they do not
|
|
@@ -1287,10 +1273,6 @@ var OIMCollection = class {
|
|
|
1287
1273
|
this.store = opts?.store ?? new OIMCollectionStoreMapDriven();
|
|
1288
1274
|
this.updateEntity = opts?.updateEntity ?? new OIMEntityUpdaterFactory().createMergeEntityUpdater();
|
|
1289
1275
|
}
|
|
1290
|
-
/** The collection's PK keying strategy — read by indexes and wrappers. */
|
|
1291
|
-
get keyDomain() {
|
|
1292
|
-
return this.store.keyDomain;
|
|
1293
|
-
}
|
|
1294
1276
|
getOneByPk(pk) {
|
|
1295
1277
|
return this.store.getOneByPk(pk);
|
|
1296
1278
|
}
|
|
@@ -1303,6 +1285,14 @@ var OIMCollection = class {
|
|
|
1303
1285
|
getOrReserveSlotByPk(pk) {
|
|
1304
1286
|
return this.store.getOrReserveSlotByPk(pk);
|
|
1305
1287
|
}
|
|
1288
|
+
/**
|
|
1289
|
+
* The existing slot for `pk` (live or reserved) WITHOUT creating one — used
|
|
1290
|
+
* by indexes to resolve a pk to its canonical slot for removal (delete by
|
|
1291
|
+
* reference), with no side effect for a pk that is not present.
|
|
1292
|
+
*/
|
|
1293
|
+
findSlotByPk(pk) {
|
|
1294
|
+
return this.store.findSlotByPk(pk);
|
|
1295
|
+
}
|
|
1306
1296
|
getSlotsByPks(pks) {
|
|
1307
1297
|
return this.store.getSlotsByPks(pks);
|
|
1308
1298
|
}
|
|
@@ -1389,7 +1379,9 @@ var OIMReactiveCollection = class extends OIMCollection {
|
|
|
1389
1379
|
constructor(queue, opts) {
|
|
1390
1380
|
super(opts);
|
|
1391
1381
|
this.anyUpdateHandlers = /* @__PURE__ */ new Set();
|
|
1392
|
-
|
|
1382
|
+
// Only ever holds `slot.pk` (one canonical reference per logical key), so a
|
|
1383
|
+
// native `Set` dedups correctly by reference even for composite pks.
|
|
1384
|
+
this.pendingAnyUpdatePks = /* @__PURE__ */ new Set();
|
|
1393
1385
|
this.isAnyUpdateClearPending = false;
|
|
1394
1386
|
this.isAnyUpdateScheduled = false;
|
|
1395
1387
|
this.runAnyUpdate = () => {
|
|
@@ -1665,16 +1657,16 @@ var OIMIndexManualOrderedArrayBased = class extends OIMIndexArrayBased {
|
|
|
1665
1657
|
var OIMCollectionIndexManualOrderedArrayBased = class extends OIMIndexManualOrderedArrayBased {
|
|
1666
1658
|
constructor(opts) {
|
|
1667
1659
|
super();
|
|
1668
|
-
this.
|
|
1660
|
+
this.getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getSlotByPk(pk) : opts.getSlot;
|
|
1669
1661
|
}
|
|
1670
1662
|
push(key, pk) {
|
|
1671
|
-
return this.pushSlot(key, this.
|
|
1663
|
+
return this.pushSlot(key, this.getRequiredSlot(pk));
|
|
1672
1664
|
}
|
|
1673
1665
|
insertAt(key, index, pk) {
|
|
1674
|
-
return this.insertSlotAt(key, index, this.
|
|
1666
|
+
return this.insertSlotAt(key, index, this.getRequiredSlot(pk));
|
|
1675
1667
|
}
|
|
1676
1668
|
reset(key, pks) {
|
|
1677
|
-
this.resetSlots(key, this.
|
|
1669
|
+
this.resetSlots(key, this.getRequiredSlots(pks));
|
|
1678
1670
|
}
|
|
1679
1671
|
getEntitiesByKey(key) {
|
|
1680
1672
|
return super.getEntitiesByKey(key);
|
|
@@ -1682,32 +1674,32 @@ var OIMCollectionIndexManualOrderedArrayBased = class extends OIMIndexManualOrde
|
|
|
1682
1674
|
getEntitiesByKeys(keys) {
|
|
1683
1675
|
return super.getEntitiesByKeys(keys);
|
|
1684
1676
|
}
|
|
1685
|
-
|
|
1686
|
-
|
|
1677
|
+
// Gets the slot for a pk, throwing if the (custom) getter has none — this
|
|
1678
|
+
// ordered index requires a real slot to place in order.
|
|
1679
|
+
getRequiredSlot(pk) {
|
|
1680
|
+
const slot = this.getSlot(pk);
|
|
1681
|
+
if (!slot) {
|
|
1682
|
+
throw new Error(
|
|
1683
|
+
`[OIMCollectionIndexManualOrderedArrayBased]: no slot for PK "${String(pk)}".`
|
|
1684
|
+
);
|
|
1685
|
+
}
|
|
1686
|
+
return slot;
|
|
1687
1687
|
}
|
|
1688
|
-
|
|
1688
|
+
getRequiredSlots(pks) {
|
|
1689
1689
|
const slots = [];
|
|
1690
1690
|
slots.length = pks.length;
|
|
1691
1691
|
for (let i = 0; i < pks.length; i++) {
|
|
1692
|
-
slots[i] = this.
|
|
1692
|
+
slots[i] = this.getRequiredSlot(pks[i]);
|
|
1693
1693
|
}
|
|
1694
1694
|
return slots;
|
|
1695
1695
|
}
|
|
1696
|
-
resolveRequiredSlot(pk) {
|
|
1697
|
-
const slot = this.resolveSlot(pk);
|
|
1698
|
-
if (!slot) {
|
|
1699
|
-
throw new Error(
|
|
1700
|
-
`[OIMCollectionIndexManualOrderedArrayBased]: Unable to resolve slot for PK "${String(pk)}".`
|
|
1701
|
-
);
|
|
1702
|
-
}
|
|
1703
|
-
return slot;
|
|
1704
|
-
}
|
|
1705
1696
|
};
|
|
1706
1697
|
|
|
1707
1698
|
// src/enums/EOIMEventQueueEventType.ts
|
|
1708
1699
|
var EOIMEventQueueEventType = /* @__PURE__ */ ((EOIMEventQueueEventType2) => {
|
|
1709
1700
|
EOIMEventQueueEventType2[EOIMEventQueueEventType2["AFTER_FLUSH"] = 0] = "AFTER_FLUSH";
|
|
1710
1701
|
EOIMEventQueueEventType2[EOIMEventQueueEventType2["BEFORE_FLUSH"] = 1] = "BEFORE_FLUSH";
|
|
1702
|
+
EOIMEventQueueEventType2[EOIMEventQueueEventType2["FLUSH_ERROR"] = 2] = "FLUSH_ERROR";
|
|
1711
1703
|
return EOIMEventQueueEventType2;
|
|
1712
1704
|
})(EOIMEventQueueEventType || {});
|
|
1713
1705
|
|
|
@@ -2120,18 +2112,18 @@ var OIMOrderedListCommandStream = class extends OIMOrderedListCommandBuffer {
|
|
|
2120
2112
|
var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandStream {
|
|
2121
2113
|
constructor(queue, opts) {
|
|
2122
2114
|
const index = opts.index ?? new OIMCollectionIndexManualOrderedArrayBased(
|
|
2123
|
-
opts.collection !== void 0 ? { collection: opts.collection } : {
|
|
2115
|
+
opts.collection !== void 0 ? { collection: opts.collection } : { getSlot: opts.getSlot }
|
|
2124
2116
|
);
|
|
2125
2117
|
super(queue, index);
|
|
2126
2118
|
this.index = index;
|
|
2127
2119
|
}
|
|
2128
2120
|
push(key, pk) {
|
|
2129
|
-
const slot = this.
|
|
2121
|
+
const slot = this.getRequiredSlot(pk);
|
|
2130
2122
|
const index = this.index.pushSlot(key, slot);
|
|
2131
2123
|
this.appendCommand(key, { type: "insert", index, item: slot });
|
|
2132
2124
|
}
|
|
2133
2125
|
insertAt(key, index, pk) {
|
|
2134
|
-
const slot = this.
|
|
2126
|
+
const slot = this.getRequiredSlot(pk);
|
|
2135
2127
|
const safeIndex = this.index.insertSlotAt(key, index, slot);
|
|
2136
2128
|
this.appendCommand(key, {
|
|
2137
2129
|
type: "insert",
|
|
@@ -2141,7 +2133,7 @@ var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandS
|
|
|
2141
2133
|
}
|
|
2142
2134
|
/** Replace the element at `index` with the slot for `pk`, in place. */
|
|
2143
2135
|
setAt(key, index, pk) {
|
|
2144
|
-
const slot = this.
|
|
2136
|
+
const slot = this.getRequiredSlot(pk);
|
|
2145
2137
|
const safeIndex = this.index.setSlotAt(key, index, slot);
|
|
2146
2138
|
if (safeIndex < 0) return;
|
|
2147
2139
|
this.appendCommand(key, {
|
|
@@ -2151,7 +2143,7 @@ var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandS
|
|
|
2151
2143
|
});
|
|
2152
2144
|
}
|
|
2153
2145
|
set(key, pks) {
|
|
2154
|
-
const slots = pks.map((pk) => this.
|
|
2146
|
+
const slots = pks.map((pk) => this.getRequiredSlot(pk));
|
|
2155
2147
|
this.index.resetSlots(key, slots);
|
|
2156
2148
|
this.appendResetCommand(key, slots);
|
|
2157
2149
|
}
|
|
@@ -2163,8 +2155,8 @@ var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandS
|
|
|
2163
2155
|
getEntitiesByKey(key) {
|
|
2164
2156
|
return this.index.getEntitiesByKey(key);
|
|
2165
2157
|
}
|
|
2166
|
-
|
|
2167
|
-
return this.index.
|
|
2158
|
+
getRequiredSlot(pk) {
|
|
2159
|
+
return this.index.getRequiredSlot(
|
|
2168
2160
|
pk
|
|
2169
2161
|
);
|
|
2170
2162
|
}
|
|
@@ -2224,8 +2216,8 @@ var OIMIndexManualArrayBased = class extends OIMIndexArrayBased {
|
|
|
2224
2216
|
}
|
|
2225
2217
|
};
|
|
2226
2218
|
|
|
2227
|
-
// src/core/
|
|
2228
|
-
var
|
|
2219
|
+
// src/core/OIMBucketCarrierProvider.ts
|
|
2220
|
+
var OIMBucketCarrierProvider = class {
|
|
2229
2221
|
constructor(store) {
|
|
2230
2222
|
this.store = store;
|
|
2231
2223
|
}
|
|
@@ -2266,7 +2258,7 @@ var OIMReactiveIndexManualArrayBased = class extends OIMReactiveIndexArrayBased
|
|
|
2266
2258
|
comparePks: opts?.indexOptions?.comparePks,
|
|
2267
2259
|
store
|
|
2268
2260
|
}),
|
|
2269
|
-
() => new
|
|
2261
|
+
() => new OIMBucketCarrierProvider(store)
|
|
2270
2262
|
);
|
|
2271
2263
|
}
|
|
2272
2264
|
setSlots(key, slots) {
|
|
@@ -2283,52 +2275,61 @@ var OIMReactiveIndexManualArrayBased = class extends OIMReactiveIndexArrayBased
|
|
|
2283
2275
|
// src/core/OIMReactiveCollectionIndexManualArrayBased.ts
|
|
2284
2276
|
var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexManualArrayBased {
|
|
2285
2277
|
constructor(queue, opts) {
|
|
2286
|
-
const
|
|
2287
|
-
const pkDomain = opts.collection?.keyDomain ?? new OIMKeyDomainNative();
|
|
2278
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
2288
2279
|
super(queue, {
|
|
2289
2280
|
indexOptions: opts.indexOptions
|
|
2290
2281
|
});
|
|
2291
|
-
// Persistent per-key
|
|
2292
|
-
//
|
|
2293
|
-
|
|
2294
|
-
this.
|
|
2295
|
-
this.
|
|
2282
|
+
// Persistent per-key membership for O(1) `addPks` dedup, keyed by the
|
|
2283
|
+
// canonical slot reference (correct for composite pks with a native Set — no
|
|
2284
|
+
// content-addressing needed, since slots are one reference per logical key).
|
|
2285
|
+
this.slotsByKey = /* @__PURE__ */ new Map();
|
|
2286
|
+
this.getSlot = getSlot;
|
|
2287
|
+
this.findSlotForRemoval = opts.collection !== void 0 ? (pk) => opts.collection.findSlotByPk(pk) : opts.getSlot;
|
|
2296
2288
|
}
|
|
2297
2289
|
setPks(key, pks) {
|
|
2298
|
-
const
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
super.setSlots(key, this.resolveSlots(pks));
|
|
2290
|
+
const slots = this.getSlotsOrTransient(pks);
|
|
2291
|
+
this.slotsByKey.set(key, new Set(slots));
|
|
2292
|
+
super.setSlots(key, slots);
|
|
2302
2293
|
}
|
|
2303
2294
|
addPks(key, pks) {
|
|
2304
2295
|
if (pks.length === 0) return;
|
|
2305
|
-
const
|
|
2296
|
+
const slotSet = this.membershipOf(key);
|
|
2306
2297
|
const newSlots = [];
|
|
2307
2298
|
for (const pk of pks) {
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2299
|
+
const slot = this.getSlotOrTransient(pk);
|
|
2300
|
+
if (slotSet.has(slot)) continue;
|
|
2301
|
+
slotSet.add(slot);
|
|
2302
|
+
newSlots.push(slot);
|
|
2311
2303
|
}
|
|
2312
2304
|
if (newSlots.length > 0) this.appendSlots(key, newSlots);
|
|
2313
2305
|
}
|
|
2314
2306
|
removePks(key, pks) {
|
|
2315
2307
|
if (pks.length === 0) return;
|
|
2316
|
-
const
|
|
2308
|
+
const slotsToRemove = /* @__PURE__ */ new Set();
|
|
2309
|
+
const pksToRemove = /* @__PURE__ */ new Set();
|
|
2310
|
+
for (let i = 0; i < pks.length; i++) {
|
|
2311
|
+
const slot = this.findSlotForRemoval(pks[i]);
|
|
2312
|
+
if (slot) slotsToRemove.add(slot);
|
|
2313
|
+
else pksToRemove.add(pks[i]);
|
|
2314
|
+
}
|
|
2317
2315
|
const existingSlots = this.index.getSlotsByKey(key);
|
|
2318
|
-
const
|
|
2319
|
-
|
|
2320
|
-
)
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2316
|
+
const slotSet = this.slotsByKey.get(key);
|
|
2317
|
+
const nextSlots = [];
|
|
2318
|
+
for (let i = 0; i < existingSlots.length; i++) {
|
|
2319
|
+
const slot = existingSlots[i];
|
|
2320
|
+
if (slotsToRemove.has(slot) || pksToRemove.has(slot.pk)) {
|
|
2321
|
+
slotSet?.delete(slot);
|
|
2322
|
+
} else {
|
|
2323
|
+
nextSlots.push(slot);
|
|
2324
|
+
}
|
|
2325
2325
|
}
|
|
2326
|
+
if (nextSlots.length === existingSlots.length) return;
|
|
2326
2327
|
if (nextSlots.length === 0) this.clear(key);
|
|
2327
2328
|
else super.setSlots(key, nextSlots);
|
|
2328
2329
|
}
|
|
2329
2330
|
clear(key) {
|
|
2330
|
-
if (key === void 0) this.
|
|
2331
|
-
else this.
|
|
2331
|
+
if (key === void 0) this.slotsByKey.clear();
|
|
2332
|
+
else this.slotsByKey.delete(key);
|
|
2332
2333
|
super.clear(key);
|
|
2333
2334
|
}
|
|
2334
2335
|
/**
|
|
@@ -2336,16 +2337,12 @@ var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexM
|
|
|
2336
2337
|
* stays correct even if slots were set through a lower-level path.
|
|
2337
2338
|
*/
|
|
2338
2339
|
membershipOf(key) {
|
|
2339
|
-
let
|
|
2340
|
-
if (!
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
for (let i = 0; i < existing.length; i++) {
|
|
2344
|
-
pkSet.add(existing[i].pk);
|
|
2345
|
-
}
|
|
2346
|
-
this.pksByKey.set(key, pkSet);
|
|
2340
|
+
let slotSet = this.slotsByKey.get(key);
|
|
2341
|
+
if (!slotSet) {
|
|
2342
|
+
slotSet = new Set(this.index.getSlotsByKey(key));
|
|
2343
|
+
this.slotsByKey.set(key, slotSet);
|
|
2347
2344
|
}
|
|
2348
|
-
return
|
|
2345
|
+
return slotSet;
|
|
2349
2346
|
}
|
|
2350
2347
|
getEntitiesByKey(key) {
|
|
2351
2348
|
return super.getEntitiesByKey(key);
|
|
@@ -2353,16 +2350,16 @@ var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexM
|
|
|
2353
2350
|
getEntitiesByKeys(keys) {
|
|
2354
2351
|
return super.getEntitiesByKeys(keys);
|
|
2355
2352
|
}
|
|
2356
|
-
|
|
2353
|
+
getSlotsOrTransient(pks) {
|
|
2357
2354
|
const slots = [];
|
|
2358
2355
|
slots.length = pks.length;
|
|
2359
2356
|
for (let i = 0; i < pks.length; i++) {
|
|
2360
|
-
slots[i] = this.
|
|
2357
|
+
slots[i] = this.getSlotOrTransient(pks[i]);
|
|
2361
2358
|
}
|
|
2362
2359
|
return slots;
|
|
2363
2360
|
}
|
|
2364
|
-
|
|
2365
|
-
const slot = this.
|
|
2361
|
+
getSlotOrTransient(pk) {
|
|
2362
|
+
const slot = this.getSlot(pk);
|
|
2366
2363
|
if (!slot) return { pk, item: void 0 };
|
|
2367
2364
|
return slot;
|
|
2368
2365
|
}
|
|
@@ -2372,7 +2369,6 @@ var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexM
|
|
|
2372
2369
|
var OIMIndexManualSetBased = class extends OIMIndexSetBased {
|
|
2373
2370
|
constructor(options = {}) {
|
|
2374
2371
|
super(options);
|
|
2375
|
-
this.pkDomain = options.pkDomain ?? new OIMKeyDomainNative();
|
|
2376
2372
|
}
|
|
2377
2373
|
setSlots(key, slots) {
|
|
2378
2374
|
const bucket = this.setStore.getOrReserveBucket(key);
|
|
@@ -2381,27 +2377,28 @@ var OIMIndexManualSetBased = class extends OIMIndexSetBased {
|
|
|
2381
2377
|
// --- pk-oriented writes: resolve the bucket ONCE and use its own membership
|
|
2382
2378
|
// (pk → slot) for dedup/removal, so a composite (trie) key is walked a single
|
|
2383
2379
|
// time instead of once for the bucket and once for a separate membership map.
|
|
2384
|
-
setPks(key, pks,
|
|
2380
|
+
setPks(key, pks, getSlot) {
|
|
2385
2381
|
const bucket = this.setStore.getOrReserveBucket(key);
|
|
2386
2382
|
const slots = [];
|
|
2387
|
-
for (let i = 0; i < pks.length; i++) slots.push(
|
|
2383
|
+
for (let i = 0; i < pks.length; i++) slots.push(getSlot(pks[i]));
|
|
2388
2384
|
this.replaceBucketContents(bucket, slots);
|
|
2389
|
-
const membership = bucket.membership ?? (bucket.membership =
|
|
2385
|
+
const membership = bucket.membership ?? (bucket.membership = /* @__PURE__ */ new Map());
|
|
2390
2386
|
membership.clear();
|
|
2391
|
-
for (let i = 0; i <
|
|
2392
|
-
if (!membership.has(
|
|
2387
|
+
for (let i = 0; i < slots.length; i++) {
|
|
2388
|
+
if (!membership.has(slots[i].pk)) {
|
|
2389
|
+
membership.set(slots[i].pk, slots[i]);
|
|
2390
|
+
}
|
|
2393
2391
|
}
|
|
2394
2392
|
}
|
|
2395
|
-
addPks(key, pks,
|
|
2393
|
+
addPks(key, pks, getSlot) {
|
|
2396
2394
|
if (pks.length === 0) return;
|
|
2397
2395
|
const bucket = this.setStore.getOrReserveBucket(key);
|
|
2398
2396
|
const membership = this.membershipOf(bucket);
|
|
2399
2397
|
let changed = false;
|
|
2400
2398
|
for (let i = 0; i < pks.length; i++) {
|
|
2401
|
-
const
|
|
2402
|
-
if (membership.has(pk)) continue;
|
|
2403
|
-
|
|
2404
|
-
membership.set(pk, slot);
|
|
2399
|
+
const slot = getSlot(pks[i]);
|
|
2400
|
+
if (membership.has(slot.pk)) continue;
|
|
2401
|
+
membership.set(slot.pk, slot);
|
|
2405
2402
|
if (!bucket.has(slot)) {
|
|
2406
2403
|
bucket.add(slot);
|
|
2407
2404
|
changed = true;
|
|
@@ -2411,6 +2408,11 @@ var OIMIndexManualSetBased = class extends OIMIndexSetBased {
|
|
|
2411
2408
|
this.setStore.retainBucket(bucket);
|
|
2412
2409
|
this.emitBucketChanged(bucket);
|
|
2413
2410
|
}
|
|
2411
|
+
/**
|
|
2412
|
+
* Removes by pk. `pks` must be canonical `slot.pk` references (membership is
|
|
2413
|
+
* keyed by them): for primitive pks that is just the pk; a collection-bound
|
|
2414
|
+
* composite index canonicalizes raw pks to `slot.pk` before calling this.
|
|
2415
|
+
*/
|
|
2414
2416
|
removePks(key, pks) {
|
|
2415
2417
|
if (pks.length === 0) return;
|
|
2416
2418
|
const bucket = this.setStore.findBucket(key);
|
|
@@ -2436,7 +2438,7 @@ var OIMIndexManualSetBased = class extends OIMIndexSetBased {
|
|
|
2436
2438
|
membershipOf(bucket) {
|
|
2437
2439
|
let membership = bucket.membership;
|
|
2438
2440
|
if (!membership) {
|
|
2439
|
-
membership =
|
|
2441
|
+
membership = /* @__PURE__ */ new Map();
|
|
2440
2442
|
bucket.membership = membership;
|
|
2441
2443
|
}
|
|
2442
2444
|
if (membership.size === 0 && bucket.size > 0) {
|
|
@@ -2545,10 +2547,9 @@ var OIMReactiveIndexManualSetBased = class extends OIMReactiveIndexSetBased {
|
|
|
2545
2547
|
queue,
|
|
2546
2548
|
(updateEmitter) => new OIMIndexManualSetBasedReactive(updateEmitter, {
|
|
2547
2549
|
comparePks: opts?.indexOptions?.comparePks,
|
|
2548
|
-
store
|
|
2549
|
-
pkDomain: opts?.pkDomain
|
|
2550
|
+
store
|
|
2550
2551
|
}),
|
|
2551
|
-
() => new
|
|
2552
|
+
() => new OIMBucketCarrierProvider(store)
|
|
2552
2553
|
);
|
|
2553
2554
|
}
|
|
2554
2555
|
setSlots(key, slots) {
|
|
@@ -2568,28 +2569,33 @@ var OIMReactiveIndexManualSetBased = class extends OIMReactiveIndexSetBased {
|
|
|
2568
2569
|
// src/core/OIMReactiveCollectionIndexManualSetBased.ts
|
|
2569
2570
|
var OIMReactiveCollectionIndexManualSetBased = class extends OIMReactiveIndexManualSetBased {
|
|
2570
2571
|
constructor(queue, opts) {
|
|
2571
|
-
const
|
|
2572
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
2572
2573
|
super(queue, {
|
|
2573
|
-
indexOptions: opts.indexOptions
|
|
2574
|
-
pkDomain: opts.collection?.keyDomain
|
|
2574
|
+
indexOptions: opts.indexOptions
|
|
2575
2575
|
});
|
|
2576
2576
|
// Bound once so the hot pk-write path passes a stable function (no per-call
|
|
2577
2577
|
// closure allocation).
|
|
2578
|
-
this.
|
|
2579
|
-
const slot = this.
|
|
2578
|
+
this.getSlotOrTransient = (pk) => {
|
|
2579
|
+
const slot = this.getSlot(pk);
|
|
2580
2580
|
if (!slot) return { pk, item: void 0 };
|
|
2581
2581
|
return slot;
|
|
2582
2582
|
};
|
|
2583
|
-
this.
|
|
2583
|
+
this.getSlot = getSlot;
|
|
2584
|
+
this.findSlotForRemoval = opts.collection !== void 0 ? (pk) => opts.collection.findSlotByPk(pk) : opts.getSlot;
|
|
2584
2585
|
}
|
|
2585
2586
|
setPks(key, pks) {
|
|
2586
|
-
this.index.setPks(key, pks, this.
|
|
2587
|
+
this.index.setPks(key, pks, this.getSlotOrTransient);
|
|
2587
2588
|
}
|
|
2588
2589
|
addPks(key, pks) {
|
|
2589
|
-
this.index.addPks(key, pks, this.
|
|
2590
|
+
this.index.addPks(key, pks, this.getSlotOrTransient);
|
|
2590
2591
|
}
|
|
2591
2592
|
removePks(key, pks) {
|
|
2592
|
-
|
|
2593
|
+
const canonical = [];
|
|
2594
|
+
for (let i = 0; i < pks.length; i++) {
|
|
2595
|
+
const slot = this.findSlotForRemoval(pks[i]);
|
|
2596
|
+
canonical.push(slot ? slot.pk : pks[i]);
|
|
2597
|
+
}
|
|
2598
|
+
this.index.removePks(key, canonical);
|
|
2593
2599
|
}
|
|
2594
2600
|
getEntitiesByKey(key) {
|
|
2595
2601
|
return super.getEntitiesByKey(key);
|
|
@@ -2798,29 +2804,34 @@ var OIMIndexStoreTrieDrivenSetBased = class extends OIMIndexStoreSetBased {
|
|
|
2798
2804
|
// src/core/OIMReactiveCollectionIndexCompositeTrieSetBased.ts
|
|
2799
2805
|
var OIMReactiveCollectionIndexCompositeTrieSetBased = class extends OIMReactiveIndexManualSetBased {
|
|
2800
2806
|
constructor(queue, opts) {
|
|
2801
|
-
const
|
|
2807
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
2802
2808
|
super(queue, {
|
|
2803
2809
|
indexOptions: {
|
|
2804
2810
|
comparePks: opts.indexOptions?.comparePks,
|
|
2805
2811
|
store: opts.indexOptions?.store ?? new OIMIndexStoreTrieDrivenSetBased()
|
|
2806
|
-
}
|
|
2807
|
-
pkDomain: opts.collection?.keyDomain
|
|
2812
|
+
}
|
|
2808
2813
|
});
|
|
2809
|
-
this.
|
|
2810
|
-
const slot = this.
|
|
2814
|
+
this.getSlotOrTransient = (pk) => {
|
|
2815
|
+
const slot = this.getSlot(pk);
|
|
2811
2816
|
if (!slot) return { pk, item: void 0 };
|
|
2812
2817
|
return slot;
|
|
2813
2818
|
};
|
|
2814
|
-
this.
|
|
2819
|
+
this.getSlot = getSlot;
|
|
2820
|
+
this.findSlotForRemoval = opts.collection !== void 0 ? (pk) => opts.collection.findSlotByPk(pk) : opts.getSlot;
|
|
2815
2821
|
}
|
|
2816
2822
|
setPks(key, pks) {
|
|
2817
|
-
this.index.setPks(key, pks, this.
|
|
2823
|
+
this.index.setPks(key, pks, this.getSlotOrTransient);
|
|
2818
2824
|
}
|
|
2819
2825
|
addPks(key, pks) {
|
|
2820
|
-
this.index.addPks(key, pks, this.
|
|
2826
|
+
this.index.addPks(key, pks, this.getSlotOrTransient);
|
|
2821
2827
|
}
|
|
2822
2828
|
removePks(key, pks) {
|
|
2823
|
-
|
|
2829
|
+
const canonical = [];
|
|
2830
|
+
for (let i = 0; i < pks.length; i++) {
|
|
2831
|
+
const slot = this.findSlotForRemoval(pks[i]);
|
|
2832
|
+
canonical.push(slot ? slot.pk : pks[i]);
|
|
2833
|
+
}
|
|
2834
|
+
this.index.removePks(key, canonical);
|
|
2824
2835
|
}
|
|
2825
2836
|
getEntitiesByKey(key) {
|
|
2826
2837
|
return super.getEntitiesByKey(key);
|
|
@@ -2927,7 +2938,7 @@ var OIMIndexStoreTrieDrivenArrayBased = class extends OIMIndexStoreArrayBased {
|
|
|
2927
2938
|
// src/core/OIMReactiveCollectionIndexCompositeTrieArrayBased.ts
|
|
2928
2939
|
var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiveIndexManualArrayBased {
|
|
2929
2940
|
constructor(queue, opts) {
|
|
2930
|
-
const
|
|
2941
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
2931
2942
|
super(queue, {
|
|
2932
2943
|
indexOptions: {
|
|
2933
2944
|
comparePks: opts.indexOptions?.comparePks,
|
|
@@ -2937,13 +2948,13 @@ var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiv
|
|
|
2937
2948
|
// Persistent per-key-path pk membership for O(1) `addPks` dedup. Trie-keyed
|
|
2938
2949
|
// so a rebuilt key path matches by content.
|
|
2939
2950
|
this.pksByKey = new OIMTrieMap();
|
|
2940
|
-
this.
|
|
2951
|
+
this.getSlot = getSlot;
|
|
2941
2952
|
}
|
|
2942
2953
|
setPks(key, pks) {
|
|
2943
2954
|
const pkSet = /* @__PURE__ */ new Set();
|
|
2944
2955
|
for (let i = 0; i < pks.length; i++) pkSet.add(pks[i]);
|
|
2945
2956
|
this.pksByKey.set(key, pkSet);
|
|
2946
|
-
super.setSlots(key, this.
|
|
2957
|
+
super.setSlots(key, this.getSlotsOrTransient(pks));
|
|
2947
2958
|
}
|
|
2948
2959
|
addPks(key, pks) {
|
|
2949
2960
|
if (pks.length === 0) return;
|
|
@@ -2952,7 +2963,7 @@ var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiv
|
|
|
2952
2963
|
for (const pk of pks) {
|
|
2953
2964
|
if (pkSet.has(pk)) continue;
|
|
2954
2965
|
pkSet.add(pk);
|
|
2955
|
-
newSlots.push(this.
|
|
2966
|
+
newSlots.push(this.getSlotOrTransient(pk));
|
|
2956
2967
|
}
|
|
2957
2968
|
if (newSlots.length > 0) this.appendSlots(key, newSlots);
|
|
2958
2969
|
}
|
|
@@ -2998,16 +3009,16 @@ var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiv
|
|
|
2998
3009
|
getEntitiesByKeys(keys) {
|
|
2999
3010
|
return super.getEntitiesByKeys(keys);
|
|
3000
3011
|
}
|
|
3001
|
-
|
|
3012
|
+
getSlotsOrTransient(pks) {
|
|
3002
3013
|
const slots = [];
|
|
3003
3014
|
slots.length = pks.length;
|
|
3004
3015
|
for (let i = 0; i < pks.length; i++) {
|
|
3005
|
-
slots[i] = this.
|
|
3016
|
+
slots[i] = this.getSlotOrTransient(pks[i]);
|
|
3006
3017
|
}
|
|
3007
3018
|
return slots;
|
|
3008
3019
|
}
|
|
3009
|
-
|
|
3010
|
-
const slot = this.
|
|
3020
|
+
getSlotOrTransient(pk) {
|
|
3021
|
+
const slot = this.getSlot(pk);
|
|
3011
3022
|
if (!slot) return { pk, item: void 0 };
|
|
3012
3023
|
return slot;
|
|
3013
3024
|
}
|
|
@@ -3320,20 +3331,20 @@ var OIMReactiveGlobalIndexManualArrayBased = class extends OIMReactiveGlobalInde
|
|
|
3320
3331
|
// src/core/OIMReactiveCollectionGlobalIndexManualArrayBased.ts
|
|
3321
3332
|
var OIMReactiveCollectionGlobalIndexManualArrayBased = class extends OIMReactiveGlobalIndexManualArrayBased {
|
|
3322
3333
|
constructor(queue, opts) {
|
|
3323
|
-
const
|
|
3334
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
3324
3335
|
super(queue, { indexOptions: opts.indexOptions });
|
|
3325
3336
|
// Single pk membership set for O(1) `addPks` dedup. Lazily seeded from the
|
|
3326
3337
|
// bucket so it stays correct even after a raw `setSlots` (e.g. derived
|
|
3327
3338
|
// rebuild), matching the keyed index's `membershipOf`.
|
|
3328
3339
|
this.membership = /* @__PURE__ */ new Set();
|
|
3329
3340
|
this.membershipSeeded = false;
|
|
3330
|
-
this.
|
|
3341
|
+
this.getSlot = getSlot;
|
|
3331
3342
|
}
|
|
3332
3343
|
setPks(pks) {
|
|
3333
3344
|
this.membership.clear();
|
|
3334
3345
|
for (let i = 0; i < pks.length; i++) this.membership.add(pks[i]);
|
|
3335
3346
|
this.membershipSeeded = true;
|
|
3336
|
-
super.setSlots(this.
|
|
3347
|
+
super.setSlots(this.getSlotsOrTransient(pks));
|
|
3337
3348
|
}
|
|
3338
3349
|
addPks(pks) {
|
|
3339
3350
|
if (pks.length === 0) return;
|
|
@@ -3342,7 +3353,7 @@ var OIMReactiveCollectionGlobalIndexManualArrayBased = class extends OIMReactive
|
|
|
3342
3353
|
for (const pk of pks) {
|
|
3343
3354
|
if (membership.has(pk)) continue;
|
|
3344
3355
|
membership.add(pk);
|
|
3345
|
-
newSlots.push(this.
|
|
3356
|
+
newSlots.push(this.getSlotOrTransient(pk));
|
|
3346
3357
|
}
|
|
3347
3358
|
if (newSlots.length > 0) super.appendSlots(newSlots);
|
|
3348
3359
|
}
|
|
@@ -3379,16 +3390,16 @@ var OIMReactiveCollectionGlobalIndexManualArrayBased = class extends OIMReactive
|
|
|
3379
3390
|
getEntities() {
|
|
3380
3391
|
return super.getEntities();
|
|
3381
3392
|
}
|
|
3382
|
-
|
|
3393
|
+
getSlotsOrTransient(pks) {
|
|
3383
3394
|
const slots = [];
|
|
3384
3395
|
slots.length = pks.length;
|
|
3385
3396
|
for (let i = 0; i < pks.length; i++) {
|
|
3386
|
-
slots[i] = this.
|
|
3397
|
+
slots[i] = this.getSlotOrTransient(pks[i]);
|
|
3387
3398
|
}
|
|
3388
3399
|
return slots;
|
|
3389
3400
|
}
|
|
3390
|
-
|
|
3391
|
-
const slot = this.
|
|
3401
|
+
getSlotOrTransient(pk) {
|
|
3402
|
+
const slot = this.getSlot(pk);
|
|
3392
3403
|
if (!slot) return { pk, item: void 0 };
|
|
3393
3404
|
return slot;
|
|
3394
3405
|
}
|
|
@@ -3468,18 +3479,18 @@ var OIMReactiveGlobalIndexManualSetBased = class extends OIMReactiveGlobalIndexS
|
|
|
3468
3479
|
// src/core/OIMReactiveCollectionGlobalIndexManualSetBased.ts
|
|
3469
3480
|
var OIMReactiveCollectionGlobalIndexManualSetBased = class extends OIMReactiveGlobalIndexManualSetBased {
|
|
3470
3481
|
constructor(queue, opts) {
|
|
3471
|
-
const
|
|
3482
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
3472
3483
|
super(queue, { indexOptions: opts.indexOptions });
|
|
3473
3484
|
this.membership = /* @__PURE__ */ new Map();
|
|
3474
3485
|
this.membershipSeeded = false;
|
|
3475
|
-
this.
|
|
3486
|
+
this.getSlot = getSlot;
|
|
3476
3487
|
}
|
|
3477
3488
|
setPks(pks) {
|
|
3478
3489
|
this.membership.clear();
|
|
3479
3490
|
const slots = [];
|
|
3480
3491
|
for (let i = 0; i < pks.length; i++) {
|
|
3481
3492
|
const pk = pks[i];
|
|
3482
|
-
const slot = this.
|
|
3493
|
+
const slot = this.getSlotOrTransient(pk);
|
|
3483
3494
|
if (!this.membership.has(pk)) this.membership.set(pk, slot);
|
|
3484
3495
|
slots.push(slot);
|
|
3485
3496
|
}
|
|
@@ -3492,7 +3503,7 @@ var OIMReactiveCollectionGlobalIndexManualSetBased = class extends OIMReactiveGl
|
|
|
3492
3503
|
const newSlots = [];
|
|
3493
3504
|
for (const pk of pks) {
|
|
3494
3505
|
if (membership.has(pk)) continue;
|
|
3495
|
-
const slot = this.
|
|
3506
|
+
const slot = this.getSlotOrTransient(pk);
|
|
3496
3507
|
membership.set(pk, slot);
|
|
3497
3508
|
newSlots.push(slot);
|
|
3498
3509
|
}
|
|
@@ -3531,8 +3542,8 @@ var OIMReactiveCollectionGlobalIndexManualSetBased = class extends OIMReactiveGl
|
|
|
3531
3542
|
getEntities() {
|
|
3532
3543
|
return super.getEntities();
|
|
3533
3544
|
}
|
|
3534
|
-
|
|
3535
|
-
const slot = this.
|
|
3545
|
+
getSlotOrTransient(pk) {
|
|
3546
|
+
const slot = this.getSlot(pk);
|
|
3536
3547
|
if (!slot) return { pk, item: void 0 };
|
|
3537
3548
|
return slot;
|
|
3538
3549
|
}
|
|
@@ -3941,7 +3952,7 @@ var OIMObject = class {
|
|
|
3941
3952
|
var OIMReactiveObject = class extends OIMObject {
|
|
3942
3953
|
constructor(queue, opts) {
|
|
3943
3954
|
super(opts);
|
|
3944
|
-
this.updateEmitter = new OIMCarrierKeyedEmitter(queue, new
|
|
3955
|
+
this.updateEmitter = new OIMCarrierKeyedEmitter(queue, new OIMKeyedCarrierProvider());
|
|
3945
3956
|
}
|
|
3946
3957
|
/**
|
|
3947
3958
|
* Mark the written key(s) on the keyed emitter directly — no general-event
|
|
@@ -3983,57 +3994,10 @@ var OIMReactiveObject = class extends OIMObject {
|
|
|
3983
3994
|
}
|
|
3984
3995
|
};
|
|
3985
3996
|
|
|
3986
|
-
// src/core/OIMTrieSet.ts
|
|
3987
|
-
var OIMTrieSet = class {
|
|
3988
|
-
constructor() {
|
|
3989
|
-
this.map = new OIMTrieMap();
|
|
3990
|
-
}
|
|
3991
|
-
get size() {
|
|
3992
|
-
return this.map.size;
|
|
3993
|
-
}
|
|
3994
|
-
add(key) {
|
|
3995
|
-
this.map.set(key, true);
|
|
3996
|
-
}
|
|
3997
|
-
has(key) {
|
|
3998
|
-
return this.map.has(key);
|
|
3999
|
-
}
|
|
4000
|
-
delete(key) {
|
|
4001
|
-
return this.map.delete(key);
|
|
4002
|
-
}
|
|
4003
|
-
*values() {
|
|
4004
|
-
yield* this.map.keys();
|
|
4005
|
-
}
|
|
4006
|
-
clear() {
|
|
4007
|
-
this.map.clear();
|
|
4008
|
-
}
|
|
4009
|
-
};
|
|
4010
|
-
|
|
4011
|
-
// src/core/OIMKeyDomainTrie.ts
|
|
4012
|
-
var OIMKeyDomainTrie = class {
|
|
4013
|
-
constructor() {
|
|
4014
|
-
// Interning pool: logical key (by content) → the one canonical reference.
|
|
4015
|
-
this.pool = new OIMTrieMap();
|
|
4016
|
-
}
|
|
4017
|
-
createMap() {
|
|
4018
|
-
return new OIMTrieMap();
|
|
4019
|
-
}
|
|
4020
|
-
createSet() {
|
|
4021
|
-
return new OIMTrieSet();
|
|
4022
|
-
}
|
|
4023
|
-
canonicalize(key) {
|
|
4024
|
-
const existing = this.pool.get(key);
|
|
4025
|
-
if (existing !== void 0) return existing;
|
|
4026
|
-
const canonical = Object.freeze(key.slice());
|
|
4027
|
-
this.pool.set(canonical, canonical);
|
|
4028
|
-
return canonical;
|
|
4029
|
-
}
|
|
4030
|
-
};
|
|
4031
|
-
|
|
4032
3997
|
// src/core/OIMCollectionStoreTrieDriven.ts
|
|
4033
3998
|
var OIMCollectionStoreTrieDriven = class extends OIMCollectionStore {
|
|
4034
|
-
constructor(
|
|
4035
|
-
super();
|
|
4036
|
-
this.keyDomain = keyDomain;
|
|
3999
|
+
constructor() {
|
|
4000
|
+
super(...arguments);
|
|
4037
4001
|
this.slots = new OIMTrieMap();
|
|
4038
4002
|
this.reservedSlots = new OIMTrieMap();
|
|
4039
4003
|
}
|
|
@@ -4051,7 +4015,7 @@ var OIMCollectionStoreTrieDriven = class extends OIMCollectionStore {
|
|
|
4051
4015
|
return reserved;
|
|
4052
4016
|
}
|
|
4053
4017
|
const nextSlot = {
|
|
4054
|
-
pk
|
|
4018
|
+
pk,
|
|
4055
4019
|
item: entity
|
|
4056
4020
|
};
|
|
4057
4021
|
this.slots.set(pk, nextSlot);
|
|
@@ -4062,7 +4026,7 @@ var OIMCollectionStoreTrieDriven = class extends OIMCollectionStore {
|
|
|
4062
4026
|
if (slot) return slot;
|
|
4063
4027
|
let reserved = this.reservedSlots.get(pk);
|
|
4064
4028
|
if (!reserved) {
|
|
4065
|
-
reserved = { pk
|
|
4029
|
+
reserved = { pk, item: void 0 };
|
|
4066
4030
|
this.reservedSlots.set(pk, reserved);
|
|
4067
4031
|
}
|
|
4068
4032
|
return reserved;
|
|
@@ -4219,8 +4183,8 @@ var OIMObjectStoreMapDriven = class extends OIMObjectStore {
|
|
|
4219
4183
|
}
|
|
4220
4184
|
};
|
|
4221
4185
|
|
|
4222
|
-
// src/core/
|
|
4223
|
-
var
|
|
4186
|
+
// src/core/OIMKeyPathCarrierProvider.ts
|
|
4187
|
+
var OIMKeyPathCarrierProvider = class {
|
|
4224
4188
|
constructor() {
|
|
4225
4189
|
this.carriers = new OIMTrieMap();
|
|
4226
4190
|
}
|
|
@@ -4273,6 +4237,7 @@ var OIMEventQueue = class {
|
|
|
4273
4237
|
this.tasksSpare = /* @__PURE__ */ new Set();
|
|
4274
4238
|
this.isFlushing = false;
|
|
4275
4239
|
this.scheduler = options.scheduler;
|
|
4240
|
+
this.onError = options.onError;
|
|
4276
4241
|
if (this.scheduler) {
|
|
4277
4242
|
this.flushBound = () => this.flush();
|
|
4278
4243
|
this.scheduler.on(
|
|
@@ -4312,12 +4277,34 @@ var OIMEventQueue = class {
|
|
|
4312
4277
|
const flushing = this.tasks;
|
|
4313
4278
|
this.tasks = this.tasksSpare;
|
|
4314
4279
|
this.flushing = flushing;
|
|
4315
|
-
|
|
4316
|
-
|
|
4317
|
-
|
|
4318
|
-
|
|
4319
|
-
|
|
4280
|
+
let errors;
|
|
4281
|
+
try {
|
|
4282
|
+
for (const task of flushing) {
|
|
4283
|
+
try {
|
|
4284
|
+
task();
|
|
4285
|
+
} catch (error) {
|
|
4286
|
+
(errors ?? (errors = [])).push(error);
|
|
4287
|
+
this.emitter.emit(2 /* FLUSH_ERROR */, {
|
|
4288
|
+
error
|
|
4289
|
+
});
|
|
4290
|
+
this.onError?.(error);
|
|
4291
|
+
}
|
|
4292
|
+
}
|
|
4293
|
+
} finally {
|
|
4294
|
+
flushing.clear();
|
|
4295
|
+
this.tasksSpare = flushing;
|
|
4296
|
+
this.flushing = void 0;
|
|
4297
|
+
this.isFlushing = false;
|
|
4298
|
+
}
|
|
4320
4299
|
this.emitter.emit(0 /* AFTER_FLUSH */, void 0);
|
|
4300
|
+
if (errors && this.onError === void 0) {
|
|
4301
|
+
if (errors.length === 1) throw errors[0];
|
|
4302
|
+
const AggregateErrorCtor = globalThis.AggregateError;
|
|
4303
|
+
throw AggregateErrorCtor ? new AggregateErrorCtor(
|
|
4304
|
+
errors,
|
|
4305
|
+
"Errors thrown during queue flush"
|
|
4306
|
+
) : errors[0];
|
|
4307
|
+
}
|
|
4321
4308
|
}
|
|
4322
4309
|
/**
|
|
4323
4310
|
* Get the current number of queued functions.
|
|
@@ -4520,6 +4507,31 @@ function createOIMDisposeScope() {
|
|
|
4520
4507
|
return new OIMDisposeScope();
|
|
4521
4508
|
}
|
|
4522
4509
|
|
|
4510
|
+
// src/core/OIMTrieSet.ts
|
|
4511
|
+
var OIMTrieSet = class {
|
|
4512
|
+
constructor() {
|
|
4513
|
+
this.map = new OIMTrieMap();
|
|
4514
|
+
}
|
|
4515
|
+
get size() {
|
|
4516
|
+
return this.map.size;
|
|
4517
|
+
}
|
|
4518
|
+
add(key) {
|
|
4519
|
+
this.map.set(key, true);
|
|
4520
|
+
}
|
|
4521
|
+
has(key) {
|
|
4522
|
+
return this.map.has(key);
|
|
4523
|
+
}
|
|
4524
|
+
delete(key) {
|
|
4525
|
+
return this.map.delete(key);
|
|
4526
|
+
}
|
|
4527
|
+
*values() {
|
|
4528
|
+
yield* this.map.keys();
|
|
4529
|
+
}
|
|
4530
|
+
clear() {
|
|
4531
|
+
this.map.clear();
|
|
4532
|
+
}
|
|
4533
|
+
};
|
|
4534
|
+
|
|
4523
4535
|
// src/core/OIMPkCodecKeyPath.ts
|
|
4524
4536
|
var OIMPkCodecKeyPath = class {
|
|
4525
4537
|
encode(pk) {
|
|
@@ -6167,35 +6179,20 @@ var OIMComputed = class {
|
|
|
6167
6179
|
};
|
|
6168
6180
|
|
|
6169
6181
|
// src/modules/effect/core/OIMEffectDependencyKeyed.ts
|
|
6170
|
-
function isReadonlyArray(value) {
|
|
6171
|
-
return Array.isArray(value);
|
|
6172
|
-
}
|
|
6173
6182
|
var OIMEffectDependencyKeyed = class {
|
|
6174
|
-
constructor(source,
|
|
6183
|
+
constructor(source, key) {
|
|
6175
6184
|
this.source = source;
|
|
6176
|
-
|
|
6177
|
-
this.keys = keyOrKeys;
|
|
6178
|
-
} else {
|
|
6179
|
-
this.key = keyOrKeys;
|
|
6180
|
-
}
|
|
6185
|
+
this.key = key;
|
|
6181
6186
|
}
|
|
6182
6187
|
subscribe(onUpdate) {
|
|
6183
|
-
if (this.keys !== void 0) {
|
|
6184
|
-
return this.source.subscribeOnKeys(this.keys, onUpdate);
|
|
6185
|
-
}
|
|
6186
|
-
if (this.key === void 0) return () => {
|
|
6187
|
-
};
|
|
6188
6188
|
return this.source.subscribeOnKey(this.key, onUpdate);
|
|
6189
6189
|
}
|
|
6190
6190
|
};
|
|
6191
6191
|
|
|
6192
6192
|
// src/modules/effect/core/OIMEffectDependencyKeyedObject.ts
|
|
6193
6193
|
var OIMEffectDependencyKeyedObject = class {
|
|
6194
|
-
constructor(object,
|
|
6195
|
-
this.dep = new OIMEffectDependencyKeyed(
|
|
6196
|
-
object,
|
|
6197
|
-
keyOrKeys
|
|
6198
|
-
);
|
|
6194
|
+
constructor(object, key) {
|
|
6195
|
+
this.dep = new OIMEffectDependencyKeyed(object, key);
|
|
6199
6196
|
}
|
|
6200
6197
|
get source() {
|
|
6201
6198
|
return this.dep.source;
|
|
@@ -6207,11 +6204,8 @@ var OIMEffectDependencyKeyedObject = class {
|
|
|
6207
6204
|
|
|
6208
6205
|
// src/modules/effect/core/OIMEffectDependencyKeyedCollection.ts
|
|
6209
6206
|
var OIMEffectDependencyKeyedCollection = class {
|
|
6210
|
-
constructor(collection,
|
|
6211
|
-
this.dep = new OIMEffectDependencyKeyed(
|
|
6212
|
-
collection,
|
|
6213
|
-
pkOrPks
|
|
6214
|
-
);
|
|
6207
|
+
constructor(collection, pk) {
|
|
6208
|
+
this.dep = new OIMEffectDependencyKeyed(collection, pk);
|
|
6215
6209
|
}
|
|
6216
6210
|
get source() {
|
|
6217
6211
|
return this.dep.source;
|
|
@@ -6223,11 +6217,8 @@ var OIMEffectDependencyKeyedCollection = class {
|
|
|
6223
6217
|
|
|
6224
6218
|
// src/modules/effect/core/OIMEffectDependencyKeyedIndex.ts
|
|
6225
6219
|
var OIMEffectDependencyKeyedIndex = class {
|
|
6226
|
-
constructor(index,
|
|
6227
|
-
this.dep = new OIMEffectDependencyKeyed(
|
|
6228
|
-
index,
|
|
6229
|
-
keyOrKeys
|
|
6230
|
-
);
|
|
6220
|
+
constructor(index, key) {
|
|
6221
|
+
this.dep = new OIMEffectDependencyKeyed(index, key);
|
|
6231
6222
|
}
|
|
6232
6223
|
get source() {
|
|
6233
6224
|
return this.dep.source;
|
|
@@ -6374,7 +6365,7 @@ export {
|
|
|
6374
6365
|
EOIMEventQueueSchedulerEventType,
|
|
6375
6366
|
EOIMIndexEventType,
|
|
6376
6367
|
EOIMObjectEventType,
|
|
6377
|
-
|
|
6368
|
+
OIMBucketCarrierProvider,
|
|
6378
6369
|
OIMCarrierKeyedEmitter,
|
|
6379
6370
|
OIMCarrierSingleEmitter,
|
|
6380
6371
|
OIMCollection,
|
|
@@ -6441,9 +6432,7 @@ export {
|
|
|
6441
6432
|
OIMIndexStoreSetBased,
|
|
6442
6433
|
OIMIndexStoreTrieDrivenArrayBased,
|
|
6443
6434
|
OIMIndexStoreTrieDrivenSetBased,
|
|
6444
|
-
|
|
6445
|
-
OIMKeyDomainTrie,
|
|
6446
|
-
OIMKeyPathCarrierResolver,
|
|
6435
|
+
OIMKeyPathCarrierProvider,
|
|
6447
6436
|
OIMKeyedBucketArrayBased,
|
|
6448
6437
|
OIMKeyedBucketSetBased,
|
|
6449
6438
|
OIMMap2Keys,
|