atom.io 0.44.15 → 0.45.1
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/eslint-plugin/index.js +1 -1
- package/dist/introspection/index.d.ts +3 -2
- package/dist/introspection/index.d.ts.map +1 -1
- package/dist/introspection/index.js.map +1 -1
- package/dist/json/index.d.ts +34 -20
- package/dist/json/index.d.ts.map +1 -1
- package/dist/json/index.js +40 -2
- package/dist/json/index.js.map +1 -1
- package/dist/main/index.d.ts +1 -1
- package/dist/main/index.d.ts.map +1 -1
- package/dist/react/index.d.ts +4 -4
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +13 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react-devtools/index.d.ts.map +1 -1
- package/dist/react-devtools/index.js.map +1 -1
- package/dist/realtime-client/index.d.ts +1 -1
- package/dist/realtime-client/index.d.ts.map +1 -1
- package/dist/realtime-client/index.js.map +1 -1
- package/dist/realtime-react/index.js.map +1 -1
- package/dist/realtime-testing/index.js +1 -1
- package/dist/transceivers/o-list/index.d.ts +1 -2
- package/dist/transceivers/o-list/index.d.ts.map +1 -1
- package/dist/transceivers/o-list/index.js +23 -24
- package/dist/transceivers/o-list/index.js.map +1 -1
- package/dist/transceivers/u-list/index.d.ts +1 -2
- package/dist/transceivers/u-list/index.d.ts.map +1 -1
- package/dist/transceivers/u-list/index.js +5 -6
- package/dist/transceivers/u-list/index.js.map +1 -1
- package/package.json +4 -12
- package/src/introspection/attach-introspection-states.ts +1 -1
- package/src/introspection/attach-transaction-logs.ts +2 -2
- package/src/introspection/index.ts +3 -0
- package/src/json/canonical.ts +42 -0
- package/src/json/enumeration.ts +36 -0
- package/src/json/index.ts +3 -132
- package/src/json/json.ts +128 -0
- package/src/main/index.ts +9 -2
- package/src/react/use-loadable.ts +10 -5
- package/src/react/use-o.ts +33 -1
- package/src/react-devtools/TransactionIndex.tsx +1 -1
- package/src/react-devtools/store.ts +3 -3
- package/src/realtime-client/continuity/register-and-attempt-confirmed-update.ts +2 -2
- package/src/realtime-react/use-pull-selector-family-member.ts +0 -1
- package/src/transceivers/o-list/o-list.ts +27 -28
- package/src/transceivers/u-list/u-list.ts +7 -8
- package/dist/data/index.d.ts +0 -23
- package/dist/data/index.d.ts.map +0 -1
- package/dist/data/index.js +0 -63
- package/dist/data/index.js.map +0 -1
- package/dist/struct/index.d.ts +0 -14
- package/dist/struct/index.d.ts.map +0 -1
- package/dist/struct/index.js +0 -37
- package/dist/struct/index.js.map +0 -1
- package/src/data/dict.ts +0 -31
- package/src/data/index.ts +0 -3
- package/src/data/struct-family.ts +0 -53
- package/src/data/struct.ts +0 -54
- package/src/struct/index.ts +0 -1
- package/src/struct/micro.ts +0 -72
- /package/dist/{chunk-D8lmAICg.js → chunk-CKcAJnC7.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["optimisticUpdateQueueAtom","confirmedUpdateQueueAtom","continuityEpoch: number | undefined","k: any","v: any","mySocketKeyAtom: AtomIO.RegularAtomToken<SocketKey | undefined>","myUserKeyAtom: AtomIO.RegularAtomToken<UserKey | null>","optimisticUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","confirmedUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","optimisticUpdateQueueAtom","confirmedUpdateQueueAtom","k: any","v: any"],"sources":["../../src/realtime-client/continuity/register-and-attempt-confirmed-update.ts","../../src/realtime-client/continuity/use-conceal-state.ts","../../src/realtime-client/continuity/use-reveal-state.ts","../../src/realtime-client/pull-atom.ts","../../src/realtime-client/pull-atom-family-member.ts","../../src/realtime-client/pull-mutable-atom.ts","../../src/realtime-client/pull-mutable-atom-family-member.ts","../../src/realtime-client/pull-selector-roots.ts","../../src/realtime-client/pull-selector.ts","../../src/realtime-client/pull-selector-family-member.ts","../../src/realtime-client/push-state.ts","../../src/realtime-client/realtime-client-stores/client-main-store.ts","../../src/realtime-client/realtime-client-stores/client-sync-store.ts","../../src/realtime-client/sync-continuity.ts"],"sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Fn, RootStore } from \"atom.io/internal\"\nimport {\n\tactUponStore,\n\tgetEpochNumberOfContinuity,\n\tingestTransactionOutcomeEvent,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n} from \"atom.io/internal\"\nimport type { Socket } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueueAtom,\n\toptimisticUpdateQueueAtom,\n} from \"atom.io/realtime-client\"\n\nexport const useRegisterAndAttemptConfirmedUpdate =\n\t(\n\t\tstore: RootStore,\n\t\tcontinuityKey: string,\n\t\tsocket: Socket,\n\t\toptimisticUpdates: AtomIO.TransactionOutcomeEvent<\n\t\t\tAtomIO.TransactionToken<Fn>\n\t\t>[],\n\t\tconfirmedUpdates: AtomIO.TransactionOutcomeEvent<\n\t\t\tAtomIO.TransactionToken<Fn>\n\t\t>[],\n\t) =>\n\t(\n\t\tconfirmed: AtomIO.TransactionOutcomeEvent<AtomIO.TransactionToken<Fn>>,\n\t): void => {\n\t\tfunction reconcileEpoch(\n\t\t\toptimisticUpdate: AtomIO.TransactionOutcomeEvent<\n\t\t\t\tAtomIO.TransactionToken<Fn>\n\t\t\t>,\n\t\t\tconfirmedUpdate: AtomIO.TransactionOutcomeEvent<\n\t\t\t\tAtomIO.TransactionToken<Fn>\n\t\t\t>,\n\t\t): void {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reconciling updates`,\n\t\t\t)\n\t\t\tsetIntoStore(store, optimisticUpdateQueueAtom, (queue) => {\n\t\t\t\tqueue.shift()\n\t\t\t\treturn queue\n\t\t\t})\n\t\t\tif (optimisticUpdate.id === confirmedUpdate.id) {\n\t\t\t\tconst clientResult = JSON.stringify(optimisticUpdate.subEvents)\n\t\t\t\tconst serverResult = JSON.stringify(confirmedUpdate.subEvents)\n\t\t\t\tif (clientResult === serverResult) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`✅`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`results for ${optimisticUpdate.id} match between client and server`,\n\t\t\t\t\t)\n\t\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// id mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`❌`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`thought update #${confirmedUpdate.epoch} was ${optimisticUpdate.token.key}:${optimisticUpdate.id}, but it was actually ${confirmedUpdate.token.key}:${confirmedUpdate.id}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`updates do not match`,\n\t\t\t\toptimisticUpdate,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tconst reversedOptimisticUpdates = optimisticUpdates.toReversed()\n\t\t\tfor (const subsequentOptimistic of reversedOptimisticUpdates) {\n\t\t\t\tingestTransactionOutcomeEvent(store, subsequentOptimistic, `oldValue`)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid optimistic updates:`,\n\t\t\t\treversedOptimisticUpdates,\n\t\t\t)\n\t\t\tingestTransactionOutcomeEvent(store, optimisticUpdate, `oldValue`)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid zeroth optimistic update`,\n\t\t\t\toptimisticUpdate,\n\t\t\t)\n\t\t\tingestTransactionOutcomeEvent(store, confirmedUpdate, `newValue`)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`applied confirmed update`,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\n\t\t\tfor (const subsequentOptimistic of optimisticUpdates) {\n\t\t\t\tconst token = {\n\t\t\t\t\ttype: `transaction`,\n\t\t\t\t\tkey: subsequentOptimistic.token.key,\n\t\t\t\t} as const\n\t\t\t\tconst { id, params } = subsequentOptimistic\n\t\t\t\tactUponStore(store, token, id)(...params)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reapplied subsequent optimistic updates:`,\n\t\t\t\toptimisticUpdates,\n\t\t\t)\n\t\t}\n\n\t\tstore.logger.info(\n\t\t\t`🧑⚖️`,\n\t\t\t`continuity`,\n\t\t\tcontinuityKey,\n\t\t\t`integrating confirmed update`,\n\t\t\t{ confirmedUpdate: confirmed, confirmedUpdates, optimisticUpdates },\n\t\t)\n\t\tconst zerothOptimisticUpdate = optimisticUpdates[0]\n\t\tif (zerothOptimisticUpdate) {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has optimistic updates to reconcile`,\n\t\t\t)\n\t\t\tif (confirmed.epoch === zerothOptimisticUpdate.epoch) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmed.epoch} matches zeroth optimistic update`,\n\t\t\t\t)\n\t\t\t\treconcileEpoch(zerothOptimisticUpdate, confirmed)\n\t\t\t\tfor (const nextConfirmed of confirmedUpdates) {\n\t\t\t\t\tconst nextOptimistic = optimisticUpdates[0]\n\t\t\t\t\tif (nextConfirmed.epoch === nextOptimistic?.epoch) {\n\t\t\t\t\t\treconcileEpoch(nextOptimistic, nextConfirmed)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// epoch mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmed.epoch} does not match zeroth optimistic update #${zerothOptimisticUpdate.epoch}`,\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmed.epoch,\n\t\t\t\t)\n\t\t\t\tif (!confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update to queue`,\n\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, confirmedUpdateQueueAtom, (queue) => {\n\t\t\t\t\t\tqueue.push(confirmed)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has no optimistic updates to deal with`,\n\t\t\t)\n\t\t\tlet continuityEpoch: number | undefined\n\t\t\tcontinuityEpoch = getEpochNumberOfContinuity(store, continuityKey)\n\n\t\t\tif (continuityEpoch === confirmed.epoch - 1) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`✅`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`integrating update #${confirmed.epoch} (${confirmed.token.key} ${confirmed.id})`,\n\t\t\t\t)\n\t\t\t\tingestTransactionOutcomeEvent(store, confirmed, `newValue`)\n\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmed.epoch)\n\t\t\t\tsetEpochNumberOfContinuity(store, continuityKey, confirmed.epoch)\n\t\t\t} else if (continuityEpoch !== undefined) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`received update #${confirmed.epoch} but still waiting for update #${\n\t\t\t\t\t\tcontinuityEpoch + 1\n\t\t\t\t\t}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tclientEpoch: continuityEpoch,\n\t\t\t\t\t\tserverEpoch: confirmed.epoch,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmed.epoch,\n\t\t\t\t)\n\t\t\t\tif (confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👍`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`confirmed update #${confirmed.epoch} is already enqueued`,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update #${confirmed.epoch} to queue`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, confirmedUpdateQueueAtom, (queue) => {\n\t\t\t\t\t\tqueue.push(confirmed)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n","import type { AtomToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { disposeAtom } from \"atom.io/internal\"\n\nexport function useConcealState(store: Store) {\n\treturn (concealed: AtomToken<unknown>[]): void => {\n\t\tfor (const token of concealed) {\n\t\t\tdisposeAtom(store, token)\n\t\t}\n\t}\n}\n","import { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport function useRevealState(store: Store) {\n\treturn (revealed: Json.Array): void => {\n\t\tlet i = 0\n\t\tlet k: any\n\t\tlet v: any\n\t\tfor (const x of revealed) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tsetIntoStore(store, k, v)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtom<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J, any, any>,\n): () => void {\n\tconst setServedValue = (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t}\n\tsocket.on(`serve:${token.key}`, setServedValue)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`, setServedValue)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore, setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtomFamilyMember<\n\tJ extends Json.Serializable,\n\tK extends Canonical,\n>(\n\tstore: Store,\n\tsocket: Socket,\n\tfamily: AtomIO.AtomFamilyToken<J, K, any>,\n\tkey: NoInfer<K>,\n): () => void {\n\tconst token = findInStore(store, family, key)\n\tconst setServedValue = (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t}\n\tsocket?.on(`serve:${token.key}`, setServedValue)\n\tsocket?.emit(`sub:${family.key}`, key)\n\treturn () => {\n\t\tsocket?.off(`serve:${token.key}`, setServedValue)\n\t\tsocket?.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { AsJSON, SignalFrom, Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtom<T extends Transceiver<any, any, any>>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.MutableAtomToken<T>,\n): () => void {\n\tconst jsonToken = getJsonToken(store, token)\n\tconst updateToken = getUpdateToken(token)\n\tsocket.on(`init:${token.key}`, (data: AsJSON<T>) => {\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(`next:${token.key}`, (data: SignalFrom<T>) => {\n\t\tsetIntoStore(store, updateToken, data)\n\t})\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`init:${token.key}`)\n\t\tsocket.off(`next:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { AsJSON, SignalFrom, Store, Transceiver } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsetIntoStore,\n} from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtomFamilyMember<\n\tT extends Transceiver<any, any, any>,\n\tK extends Canonical,\n>(\n\tstore: Store,\n\tsocket: Socket,\n\tfamily: AtomIO.MutableAtomFamilyToken<T, K>,\n\tkey: NoInfer<K>,\n): () => void {\n\tconst token = findInStore(store, family, key)\n\tsocket.on(`init:${token.key}`, (data: AsJSON<T>) => {\n\t\tconst jsonToken = getJsonToken(store, token)\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(`next:${token.key}`, (data: SignalFrom<T>) => {\n\t\tconst trackerToken = getUpdateToken(token)\n\t\tsetIntoStore(store, trackerToken, data)\n\t})\n\tsocket.emit(`sub:${family.key}`, key)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type { AtomToken, SelectorToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { getFamilyOfToken, subscribeToState } from \"atom.io/internal\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtom } from \"./pull-atom\"\nimport { pullAtomFamilyMember } from \"./pull-atom-family-member\"\nimport { pullMutableAtom } from \"./pull-mutable-atom\"\nimport { pullMutableAtomFamilyMember } from \"./pull-mutable-atom-family-member\"\n\nexport function pullSelectorRoots(\n\tstore: Store,\n\tsocket: Socket,\n\tselectorToken: SelectorToken<any>,\n): () => void {\n\tconst atomSubscriptions = new Map<string, () => void>()\n\tconst clearAtomSubscriptions = () => {\n\t\tfor (const [, unsub] of atomSubscriptions) unsub()\n\t\tatomSubscriptions.clear()\n\t}\n\n\tconst start = () => {\n\t\tconst atomKeys = store.selectorAtoms.getRelatedKeys(selectorToken.key)\n\t\tif (atomKeys) {\n\t\t\tfor (const [atomKey, unsub] of atomSubscriptions) {\n\t\t\t\tif (!atomKeys.has(atomKey)) {\n\t\t\t\t\tunsub()\n\t\t\t\t\tatomSubscriptions.delete(atomKey)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const atomKey of atomKeys) {\n\t\t\t\tif (atomSubscriptions.has(atomKey)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst atom = store.atoms.get(atomKey) as AtomToken<any, any>\n\t\t\t\tswitch (atom.type) {\n\t\t\t\t\tcase `atom`: {\n\t\t\t\t\t\tif (atom.family) {\n\t\t\t\t\t\t\tconst { subKey: serializedSubKey } = atom.family\n\t\t\t\t\t\t\tconst subKey = parseJson(serializedSubKey)\n\t\t\t\t\t\t\tconst family = getFamilyOfToken(store, atom)\n\t\t\t\t\t\t\tatomSubscriptions.set(\n\t\t\t\t\t\t\t\tatomKey,\n\t\t\t\t\t\t\t\tpullAtomFamilyMember(store, socket, family, subKey),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tatomSubscriptions.set(atomKey, pullAtom(store, socket, atom))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\t\tif (atom.family) {\n\t\t\t\t\t\t\tconst { subKey: serializedSubKey } = atom.family\n\t\t\t\t\t\t\tconst subKey = parseJson(serializedSubKey)\n\t\t\t\t\t\t\tconst family = getFamilyOfToken(store, atom)\n\t\t\t\t\t\t\tatomSubscriptions.set(\n\t\t\t\t\t\t\t\tatomKey,\n\t\t\t\t\t\t\t\tpullMutableAtomFamilyMember(store, socket, family, subKey),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tatomSubscriptions.set(\n\t\t\t\t\t\t\t\tatomKey,\n\t\t\t\t\t\t\t\tpullMutableAtom(store, socket, atom),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst unsubFromSelector = subscribeToState(\n\t\tstore,\n\t\tselectorToken,\n\t\t`pull-watches-dependencies`,\n\t\t() => {\n\t\t\tstart()\n\t\t},\n\t)\n\n\tstart()\n\n\treturn () => {\n\t\tclearAtomSubscriptions()\n\t\tunsubFromSelector()\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullSelectorRoots } from \"./pull-selector-roots\"\n\nexport function pullSelector<T>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.SelectorToken<T>,\n): () => void {\n\treturn pullSelectorRoots(store, socket, token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullSelectorRoots } from \"./pull-selector-roots\"\n\nexport function pullSelectorFamilyMember<T, K extends Canonical>(\n\tstore: Store,\n\tsocket: Socket,\n\tfamilyToken: AtomIO.SelectorFamilyToken<T, K>,\n\tkey: NoInfer<K>,\n): () => void {\n\tconst token = findInStore(store, familyToken, key)\n\treturn pullSelectorRoots(store, socket, token)\n}\n","import type { WritableToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { setIntoStore, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { employSocket, mutexAtoms } from \"atom.io/realtime\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pushState<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: WritableToken<J>,\n): () => void {\n\tconst publish = (newValue: J) => {\n\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t}\n\n\tconst subscriptions = new Set<() => void>()\n\tconst clearSubscriptions = () => {\n\t\tfor (const unsub of subscriptions) unsub()\n\t\tsubscriptions.clear()\n\t}\n\n\tconst init = () => {\n\t\tsubscriptions.add(\n\t\t\temploySocket(socket, `claim-result:${token.key}`, (success: boolean) => {\n\t\t\t\tif (!success) return\n\n\t\t\t\tclearSubscriptions()\n\t\t\t\tsetIntoStore(store, mutexAtoms, token.key, true)\n\t\t\t\tsubscriptions.add(\n\t\t\t\t\tsubscribeToState(store, token, `push`, ({ newValue }) => {\n\t\t\t\t\t\tpublish(newValue)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}),\n\t\t)\n\n\t\tsocket.emit(`claim:${token.key}`)\n\t}\n\n\tinit()\n\n\treturn () => {\n\t\tclearSubscriptions()\n\t\tsocket.emit(`unclaim:${token.key}`)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport type { SocketKey, UserKey } from \"atom.io/realtime\"\nimport { storageSync } from \"atom.io/web\"\n\nexport const mySocketKeyAtom: AtomIO.RegularAtomToken<SocketKey | undefined> =\n\tAtomIO.atom<SocketKey | undefined>({\n\t\tkey: `mySocketKey`,\n\t\tdefault: undefined,\n\t})\n\nexport const myUserKeyAtom: AtomIO.RegularAtomToken<UserKey | null> =\n\tAtomIO.atom<UserKey | null>({\n\t\tkey: `myUserKey`,\n\t\tdefault: null,\n\t\teffects: [storageSync(globalThis.localStorage, JSON, `myUserKey`)],\n\t})\n","import * as AtomIO from \"atom.io\"\n\nexport const optimisticUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n> = AtomIO.atom<AtomIO.TransactionOutcomeEvent<any>[]>({\n\tkey: `optimisticUpdateQueue`,\n\tdefault: () => [],\n})\n\nexport const confirmedUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n> = AtomIO.atom<AtomIO.TransactionOutcomeEvent<any>[]>({\n\tkey: `confirmedUpdateQueue`,\n\tdefault: () => [],\n})\n","import type { RootStore } from \"atom.io/internal\"\nimport {\n\tassignTransactionToContinuity,\n\tgetFromStore,\n\tgetJsonToken,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueueAtom,\n\toptimisticUpdateQueueAtom,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { useRegisterAndAttemptConfirmedUpdate } from \"./continuity/register-and-attempt-confirmed-update\"\nimport { useConcealState } from \"./continuity/use-conceal-state\"\nimport { useRevealState } from \"./continuity/use-reveal-state\"\n\nexport function syncContinuity(\n\tstore: RootStore,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst optimisticUpdates = getFromStore(store, optimisticUpdateQueueAtom)\n\tconst confirmedUpdates = getFromStore(store, confirmedUpdateQueueAtom)\n\n\tconst initializeContinuity = (epoch: number, payload: Json.Array) => {\n\t\tsocket.off(`continuity-init:${continuityKey}`, initializeContinuity)\n\t\tlet i = 0\n\t\tlet k: any\n\t\tlet v: any\n\t\tfor (const x of payload) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tif (`type` in k && k.type === `mutable_atom`) {\n\t\t\t\t\tk = getJsonToken(store, k)\n\t\t\t\t}\n\t\t\t\tsetIntoStore(store, k, v)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t\tsetEpochNumberOfContinuity(store, continuityKey, epoch)\n\t}\n\tsocket.off(`continuity-init:${continuityKey}`)\n\tsocket.on(`continuity-init:${continuityKey}`, initializeContinuity)\n\n\tconst registerAndAttemptConfirmedUpdate = useRegisterAndAttemptConfirmedUpdate(\n\t\tstore,\n\t\tcontinuityKey,\n\t\tsocket,\n\t\toptimisticUpdates,\n\t\tconfirmedUpdates,\n\t)\n\tsocket.off(`tx-new:${continuityKey}`)\n\tsocket.on(`tx-new:${continuityKey}`, registerAndAttemptConfirmedUpdate)\n\n\tconst unsubscribeFunctions = continuity.actions.map((transaction) => {\n\t\tassignTransactionToContinuity(store, continuityKey, transaction.key)\n\t\tconst unsubscribeFromTransactionUpdates = subscribeToTransaction(\n\t\t\tstore,\n\t\t\ttransaction,\n\t\t\t`tx-run:${continuityKey}`,\n\t\t\t(clientUpdate) => {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🤞`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`enqueuing optimistic update`,\n\t\t\t\t)\n\t\t\t\tconst optimisticUpdateIndex = optimisticUpdates.findIndex(\n\t\t\t\t\t(update) => update.id === clientUpdate.id,\n\t\t\t\t)\n\t\t\t\tif (optimisticUpdateIndex === -1) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`enqueuing new optimistic update`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, optimisticUpdateQueueAtom, (queue) => {\n\t\t\t\t\t\tqueue.push(clientUpdate)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`replacing existing optimistic update at index ${optimisticUpdateIndex}`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, optimisticUpdateQueueAtom, (queue) => {\n\t\t\t\t\t\tqueue[optimisticUpdateIndex] = clientUpdate\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tsocket.emit(`tx-run:${continuityKey}`, {\n\t\t\t\t\tid: clientUpdate.id,\n\t\t\t\t\ttoken: transaction,\n\t\t\t\t\tparams: clientUpdate.params,\n\t\t\t\t})\n\t\t\t},\n\t\t)\n\t\treturn unsubscribeFromTransactionUpdates\n\t})\n\n\tconst revealState = useRevealState(store)\n\tconst concealState = useConcealState(store)\n\tsocket.on(`reveal:${continuityKey}`, revealState)\n\tsocket.on(`conceal:${continuityKey}`, concealState)\n\n\tsocket.emit(`get:${continuityKey}`)\n\treturn () => {\n\t\tsocket.off(`continuity-init:${continuityKey}`)\n\t\tsocket.off(`tx-new:${continuityKey}`)\n\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t// socket.emit(`unsub:${continuityKey}`)\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["optimisticUpdateQueueAtom","confirmedUpdateQueueAtom","continuityEpoch: number | undefined","k: any","v: any","mySocketKeyAtom: AtomIO.RegularAtomToken<SocketKey | undefined>","myUserKeyAtom: AtomIO.RegularAtomToken<UserKey | null>","optimisticUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","confirmedUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","optimisticUpdateQueueAtom","confirmedUpdateQueueAtom","k: any","v: any"],"sources":["../../src/realtime-client/continuity/register-and-attempt-confirmed-update.ts","../../src/realtime-client/continuity/use-conceal-state.ts","../../src/realtime-client/continuity/use-reveal-state.ts","../../src/realtime-client/pull-atom.ts","../../src/realtime-client/pull-atom-family-member.ts","../../src/realtime-client/pull-mutable-atom.ts","../../src/realtime-client/pull-mutable-atom-family-member.ts","../../src/realtime-client/pull-selector-roots.ts","../../src/realtime-client/pull-selector.ts","../../src/realtime-client/pull-selector-family-member.ts","../../src/realtime-client/push-state.ts","../../src/realtime-client/realtime-client-stores/client-main-store.ts","../../src/realtime-client/realtime-client-stores/client-sync-store.ts","../../src/realtime-client/sync-continuity.ts"],"sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Fn, RootStore } from \"atom.io/internal\"\nimport {\n\tactUponStore,\n\tgetEpochNumberOfContinuity,\n\tingestTransactionOutcomeEvent,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n} from \"atom.io/internal\"\nimport type { Socket } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueueAtom,\n\toptimisticUpdateQueueAtom,\n} from \"atom.io/realtime-client\"\n\nexport const useRegisterAndAttemptConfirmedUpdate =\n\t(\n\t\tstore: RootStore,\n\t\tcontinuityKey: string,\n\t\tsocket: Socket,\n\t\toptimisticUpdates: readonly AtomIO.TransactionOutcomeEvent<\n\t\t\tAtomIO.TransactionToken<Fn>\n\t\t>[],\n\t\tconfirmedUpdates: readonly AtomIO.TransactionOutcomeEvent<\n\t\t\tAtomIO.TransactionToken<Fn>\n\t\t>[],\n\t) =>\n\t(\n\t\tconfirmed: AtomIO.TransactionOutcomeEvent<AtomIO.TransactionToken<Fn>>,\n\t): void => {\n\t\tfunction reconcileEpoch(\n\t\t\toptimisticUpdate: AtomIO.TransactionOutcomeEvent<\n\t\t\t\tAtomIO.TransactionToken<Fn>\n\t\t\t>,\n\t\t\tconfirmedUpdate: AtomIO.TransactionOutcomeEvent<\n\t\t\t\tAtomIO.TransactionToken<Fn>\n\t\t\t>,\n\t\t): void {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reconciling updates`,\n\t\t\t)\n\t\t\tsetIntoStore(store, optimisticUpdateQueueAtom, (queue) => {\n\t\t\t\tqueue.shift()\n\t\t\t\treturn queue\n\t\t\t})\n\t\t\tif (optimisticUpdate.id === confirmedUpdate.id) {\n\t\t\t\tconst clientResult = JSON.stringify(optimisticUpdate.subEvents)\n\t\t\t\tconst serverResult = JSON.stringify(confirmedUpdate.subEvents)\n\t\t\t\tif (clientResult === serverResult) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`✅`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`results for ${optimisticUpdate.id} match between client and server`,\n\t\t\t\t\t)\n\t\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// id mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`❌`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`thought update #${confirmedUpdate.epoch} was ${optimisticUpdate.token.key}:${optimisticUpdate.id}, but it was actually ${confirmedUpdate.token.key}:${confirmedUpdate.id}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`updates do not match`,\n\t\t\t\toptimisticUpdate,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tconst reversedOptimisticUpdates = optimisticUpdates.toReversed()\n\t\t\tfor (const subsequentOptimistic of reversedOptimisticUpdates) {\n\t\t\t\tingestTransactionOutcomeEvent(store, subsequentOptimistic, `oldValue`)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid optimistic updates:`,\n\t\t\t\treversedOptimisticUpdates,\n\t\t\t)\n\t\t\tingestTransactionOutcomeEvent(store, optimisticUpdate, `oldValue`)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid zeroth optimistic update`,\n\t\t\t\toptimisticUpdate,\n\t\t\t)\n\t\t\tingestTransactionOutcomeEvent(store, confirmedUpdate, `newValue`)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`applied confirmed update`,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\n\t\t\tfor (const subsequentOptimistic of optimisticUpdates) {\n\t\t\t\tconst token = {\n\t\t\t\t\ttype: `transaction`,\n\t\t\t\t\tkey: subsequentOptimistic.token.key,\n\t\t\t\t} as const\n\t\t\t\tconst { id, params } = subsequentOptimistic\n\t\t\t\tactUponStore(store, token, id)(...params)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reapplied subsequent optimistic updates:`,\n\t\t\t\toptimisticUpdates,\n\t\t\t)\n\t\t}\n\n\t\tstore.logger.info(\n\t\t\t`🧑⚖️`,\n\t\t\t`continuity`,\n\t\t\tcontinuityKey,\n\t\t\t`integrating confirmed update`,\n\t\t\t{ confirmedUpdate: confirmed, confirmedUpdates, optimisticUpdates },\n\t\t)\n\t\tconst zerothOptimisticUpdate = optimisticUpdates[0]\n\t\tif (zerothOptimisticUpdate) {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has optimistic updates to reconcile`,\n\t\t\t)\n\t\t\tif (confirmed.epoch === zerothOptimisticUpdate.epoch) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmed.epoch} matches zeroth optimistic update`,\n\t\t\t\t)\n\t\t\t\treconcileEpoch(zerothOptimisticUpdate, confirmed)\n\t\t\t\tfor (const nextConfirmed of confirmedUpdates) {\n\t\t\t\t\tconst nextOptimistic = optimisticUpdates[0]\n\t\t\t\t\tif (nextConfirmed.epoch === nextOptimistic?.epoch) {\n\t\t\t\t\t\treconcileEpoch(nextOptimistic, nextConfirmed)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// epoch mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmed.epoch} does not match zeroth optimistic update #${zerothOptimisticUpdate.epoch}`,\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmed.epoch,\n\t\t\t\t)\n\t\t\t\tif (!confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update to queue`,\n\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, confirmedUpdateQueueAtom, (queue) => {\n\t\t\t\t\t\tqueue.push(confirmed)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has no optimistic updates to deal with`,\n\t\t\t)\n\t\t\tlet continuityEpoch: number | undefined\n\t\t\tcontinuityEpoch = getEpochNumberOfContinuity(store, continuityKey)\n\n\t\t\tif (continuityEpoch === confirmed.epoch - 1) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`✅`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`integrating update #${confirmed.epoch} (${confirmed.token.key} ${confirmed.id})`,\n\t\t\t\t)\n\t\t\t\tingestTransactionOutcomeEvent(store, confirmed, `newValue`)\n\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmed.epoch)\n\t\t\t\tsetEpochNumberOfContinuity(store, continuityKey, confirmed.epoch)\n\t\t\t} else if (continuityEpoch !== undefined) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`received update #${confirmed.epoch} but still waiting for update #${\n\t\t\t\t\t\tcontinuityEpoch + 1\n\t\t\t\t\t}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tclientEpoch: continuityEpoch,\n\t\t\t\t\t\tserverEpoch: confirmed.epoch,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmed.epoch,\n\t\t\t\t)\n\t\t\t\tif (confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👍`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`confirmed update #${confirmed.epoch} is already enqueued`,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update #${confirmed.epoch} to queue`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, confirmedUpdateQueueAtom, (queue) => {\n\t\t\t\t\t\tqueue.push(confirmed)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n","import type { AtomToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { disposeAtom } from \"atom.io/internal\"\n\nexport function useConcealState(store: Store) {\n\treturn (concealed: AtomToken<unknown>[]): void => {\n\t\tfor (const token of concealed) {\n\t\t\tdisposeAtom(store, token)\n\t\t}\n\t}\n}\n","import { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport function useRevealState(store: Store) {\n\treturn (revealed: Json.Array): void => {\n\t\tlet i = 0\n\t\tlet k: any\n\t\tlet v: any\n\t\tfor (const x of revealed) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tsetIntoStore(store, k, v)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtom<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J, any, any>,\n): () => void {\n\tconst setServedValue = (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t}\n\tsocket.on(`serve:${token.key}`, setServedValue)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`, setServedValue)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore, setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtomFamilyMember<\n\tJ extends Json.Serializable,\n\tK extends Canonical,\n>(\n\tstore: Store,\n\tsocket: Socket,\n\tfamily: AtomIO.AtomFamilyToken<J, K, any>,\n\tkey: NoInfer<K>,\n): () => void {\n\tconst token = findInStore(store, family, key)\n\tconst setServedValue = (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t}\n\tsocket?.on(`serve:${token.key}`, setServedValue)\n\tsocket?.emit(`sub:${family.key}`, key)\n\treturn () => {\n\t\tsocket?.off(`serve:${token.key}`, setServedValue)\n\t\tsocket?.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { AsJSON, SignalFrom, Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtom<T extends Transceiver<any, any, any>>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.MutableAtomToken<T>,\n): () => void {\n\tconst jsonToken = getJsonToken(store, token)\n\tconst updateToken = getUpdateToken(token)\n\tsocket.on(`init:${token.key}`, (data: AsJSON<T>) => {\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(`next:${token.key}`, (data: SignalFrom<T>) => {\n\t\tsetIntoStore(store, updateToken, data)\n\t})\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`init:${token.key}`)\n\t\tsocket.off(`next:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { AsJSON, SignalFrom, Store, Transceiver } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsetIntoStore,\n} from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtomFamilyMember<\n\tT extends Transceiver<any, any, any>,\n\tK extends Canonical,\n>(\n\tstore: Store,\n\tsocket: Socket,\n\tfamily: AtomIO.MutableAtomFamilyToken<T, K>,\n\tkey: NoInfer<K>,\n): () => void {\n\tconst token = findInStore(store, family, key)\n\tsocket.on(`init:${token.key}`, (data: AsJSON<T>) => {\n\t\tconst jsonToken = getJsonToken(store, token)\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(`next:${token.key}`, (data: SignalFrom<T>) => {\n\t\tconst trackerToken = getUpdateToken(token)\n\t\tsetIntoStore(store, trackerToken, data)\n\t})\n\tsocket.emit(`sub:${family.key}`, key)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type { AtomToken, SelectorToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { getFamilyOfToken, subscribeToState } from \"atom.io/internal\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtom } from \"./pull-atom\"\nimport { pullAtomFamilyMember } from \"./pull-atom-family-member\"\nimport { pullMutableAtom } from \"./pull-mutable-atom\"\nimport { pullMutableAtomFamilyMember } from \"./pull-mutable-atom-family-member\"\n\nexport function pullSelectorRoots(\n\tstore: Store,\n\tsocket: Socket,\n\tselectorToken: SelectorToken<any>,\n): () => void {\n\tconst atomSubscriptions = new Map<string, () => void>()\n\tconst clearAtomSubscriptions = () => {\n\t\tfor (const [, unsub] of atomSubscriptions) unsub()\n\t\tatomSubscriptions.clear()\n\t}\n\n\tconst start = () => {\n\t\tconst atomKeys = store.selectorAtoms.getRelatedKeys(selectorToken.key)\n\t\tif (atomKeys) {\n\t\t\tfor (const [atomKey, unsub] of atomSubscriptions) {\n\t\t\t\tif (!atomKeys.has(atomKey)) {\n\t\t\t\t\tunsub()\n\t\t\t\t\tatomSubscriptions.delete(atomKey)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const atomKey of atomKeys) {\n\t\t\t\tif (atomSubscriptions.has(atomKey)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst atom = store.atoms.get(atomKey) as AtomToken<any, any>\n\t\t\t\tswitch (atom.type) {\n\t\t\t\t\tcase `atom`: {\n\t\t\t\t\t\tif (atom.family) {\n\t\t\t\t\t\t\tconst { subKey: serializedSubKey } = atom.family\n\t\t\t\t\t\t\tconst subKey = parseJson(serializedSubKey)\n\t\t\t\t\t\t\tconst family = getFamilyOfToken(store, atom)\n\t\t\t\t\t\t\tatomSubscriptions.set(\n\t\t\t\t\t\t\t\tatomKey,\n\t\t\t\t\t\t\t\tpullAtomFamilyMember(store, socket, family, subKey),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tatomSubscriptions.set(atomKey, pullAtom(store, socket, atom))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\t\tif (atom.family) {\n\t\t\t\t\t\t\tconst { subKey: serializedSubKey } = atom.family\n\t\t\t\t\t\t\tconst subKey = parseJson(serializedSubKey)\n\t\t\t\t\t\t\tconst family = getFamilyOfToken(store, atom)\n\t\t\t\t\t\t\tatomSubscriptions.set(\n\t\t\t\t\t\t\t\tatomKey,\n\t\t\t\t\t\t\t\tpullMutableAtomFamilyMember(store, socket, family, subKey),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tatomSubscriptions.set(\n\t\t\t\t\t\t\t\tatomKey,\n\t\t\t\t\t\t\t\tpullMutableAtom(store, socket, atom),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst unsubFromSelector = subscribeToState(\n\t\tstore,\n\t\tselectorToken,\n\t\t`pull-watches-dependencies`,\n\t\t() => {\n\t\t\tstart()\n\t\t},\n\t)\n\n\tstart()\n\n\treturn () => {\n\t\tclearAtomSubscriptions()\n\t\tunsubFromSelector()\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullSelectorRoots } from \"./pull-selector-roots\"\n\nexport function pullSelector<T>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.SelectorToken<T>,\n): () => void {\n\treturn pullSelectorRoots(store, socket, token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullSelectorRoots } from \"./pull-selector-roots\"\n\nexport function pullSelectorFamilyMember<T, K extends Canonical>(\n\tstore: Store,\n\tsocket: Socket,\n\tfamilyToken: AtomIO.SelectorFamilyToken<T, K>,\n\tkey: NoInfer<K>,\n): () => void {\n\tconst token = findInStore(store, familyToken, key)\n\treturn pullSelectorRoots(store, socket, token)\n}\n","import type { WritableToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { setIntoStore, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { employSocket, mutexAtoms } from \"atom.io/realtime\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pushState<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: WritableToken<J>,\n): () => void {\n\tconst publish = (newValue: J) => {\n\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t}\n\n\tconst subscriptions = new Set<() => void>()\n\tconst clearSubscriptions = () => {\n\t\tfor (const unsub of subscriptions) unsub()\n\t\tsubscriptions.clear()\n\t}\n\n\tconst init = () => {\n\t\tsubscriptions.add(\n\t\t\temploySocket(socket, `claim-result:${token.key}`, (success: boolean) => {\n\t\t\t\tif (!success) return\n\n\t\t\t\tclearSubscriptions()\n\t\t\t\tsetIntoStore(store, mutexAtoms, token.key, true)\n\t\t\t\tsubscriptions.add(\n\t\t\t\t\tsubscribeToState(store, token, `push`, ({ newValue }) => {\n\t\t\t\t\t\tpublish(newValue)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}),\n\t\t)\n\n\t\tsocket.emit(`claim:${token.key}`)\n\t}\n\n\tinit()\n\n\treturn () => {\n\t\tclearSubscriptions()\n\t\tsocket.emit(`unclaim:${token.key}`)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport type { SocketKey, UserKey } from \"atom.io/realtime\"\nimport { storageSync } from \"atom.io/web\"\n\nexport const mySocketKeyAtom: AtomIO.RegularAtomToken<SocketKey | undefined> =\n\tAtomIO.atom<SocketKey | undefined>({\n\t\tkey: `mySocketKey`,\n\t\tdefault: undefined,\n\t})\n\nexport const myUserKeyAtom: AtomIO.RegularAtomToken<UserKey | null> =\n\tAtomIO.atom<UserKey | null>({\n\t\tkey: `myUserKey`,\n\t\tdefault: null,\n\t\teffects: [storageSync(globalThis.localStorage, JSON, `myUserKey`)],\n\t})\n","import * as AtomIO from \"atom.io\"\n\nexport const optimisticUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n> = AtomIO.atom<AtomIO.TransactionOutcomeEvent<any>[]>({\n\tkey: `optimisticUpdateQueue`,\n\tdefault: () => [],\n})\n\nexport const confirmedUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n> = AtomIO.atom<AtomIO.TransactionOutcomeEvent<any>[]>({\n\tkey: `confirmedUpdateQueue`,\n\tdefault: () => [],\n})\n","import type { RootStore } from \"atom.io/internal\"\nimport {\n\tassignTransactionToContinuity,\n\tgetFromStore,\n\tgetJsonToken,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueueAtom,\n\toptimisticUpdateQueueAtom,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { useRegisterAndAttemptConfirmedUpdate } from \"./continuity/register-and-attempt-confirmed-update\"\nimport { useConcealState } from \"./continuity/use-conceal-state\"\nimport { useRevealState } from \"./continuity/use-reveal-state\"\n\nexport function syncContinuity(\n\tstore: RootStore,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst optimisticUpdates = getFromStore(store, optimisticUpdateQueueAtom)\n\tconst confirmedUpdates = getFromStore(store, confirmedUpdateQueueAtom)\n\n\tconst initializeContinuity = (epoch: number, payload: Json.Array) => {\n\t\tsocket.off(`continuity-init:${continuityKey}`, initializeContinuity)\n\t\tlet i = 0\n\t\tlet k: any\n\t\tlet v: any\n\t\tfor (const x of payload) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tif (`type` in k && k.type === `mutable_atom`) {\n\t\t\t\t\tk = getJsonToken(store, k)\n\t\t\t\t}\n\t\t\t\tsetIntoStore(store, k, v)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t\tsetEpochNumberOfContinuity(store, continuityKey, epoch)\n\t}\n\tsocket.off(`continuity-init:${continuityKey}`)\n\tsocket.on(`continuity-init:${continuityKey}`, initializeContinuity)\n\n\tconst registerAndAttemptConfirmedUpdate = useRegisterAndAttemptConfirmedUpdate(\n\t\tstore,\n\t\tcontinuityKey,\n\t\tsocket,\n\t\toptimisticUpdates,\n\t\tconfirmedUpdates,\n\t)\n\tsocket.off(`tx-new:${continuityKey}`)\n\tsocket.on(`tx-new:${continuityKey}`, registerAndAttemptConfirmedUpdate)\n\n\tconst unsubscribeFunctions = continuity.actions.map((transaction) => {\n\t\tassignTransactionToContinuity(store, continuityKey, transaction.key)\n\t\tconst unsubscribeFromTransactionUpdates = subscribeToTransaction(\n\t\t\tstore,\n\t\t\ttransaction,\n\t\t\t`tx-run:${continuityKey}`,\n\t\t\t(clientUpdate) => {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🤞`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`enqueuing optimistic update`,\n\t\t\t\t)\n\t\t\t\tconst optimisticUpdateIndex = optimisticUpdates.findIndex(\n\t\t\t\t\t(update) => update.id === clientUpdate.id,\n\t\t\t\t)\n\t\t\t\tif (optimisticUpdateIndex === -1) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`enqueuing new optimistic update`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, optimisticUpdateQueueAtom, (queue) => {\n\t\t\t\t\t\tqueue.push(clientUpdate)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`replacing existing optimistic update at index ${optimisticUpdateIndex}`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, optimisticUpdateQueueAtom, (queue) => {\n\t\t\t\t\t\tqueue[optimisticUpdateIndex] = clientUpdate\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tsocket.emit(`tx-run:${continuityKey}`, {\n\t\t\t\t\tid: clientUpdate.id,\n\t\t\t\t\ttoken: transaction,\n\t\t\t\t\tparams: clientUpdate.params,\n\t\t\t\t})\n\t\t\t},\n\t\t)\n\t\treturn unsubscribeFromTransactionUpdates\n\t})\n\n\tconst revealState = useRevealState(store)\n\tconst concealState = useConcealState(store)\n\tsocket.on(`reveal:${continuityKey}`, revealState)\n\tsocket.on(`conceal:${continuityKey}`, concealState)\n\n\tsocket.emit(`get:${continuityKey}`)\n\treturn () => {\n\t\tsocket.off(`continuity-init:${continuityKey}`)\n\t\tsocket.off(`tx-new:${continuityKey}`)\n\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t// socket.emit(`unsub:${continuityKey}`)\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["RealtimeContext: React.Context<RealtimeReactStore>","RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}>"],"sources":["../../src/realtime-react/realtime-context.tsx","../../src/realtime-react/use-single-effect.ts","../../src/realtime-react/use-realtime-service.ts","../../src/realtime-react/use-pull-atom.ts","../../src/realtime-react/use-pull-atom-family-member.ts","../../src/realtime-react/use-pull-mutable-atom.ts","../../src/realtime-react/use-pull-mutable-family-member.ts","../../src/realtime-react/use-pull-selector.ts","../../src/realtime-react/use-pull-selector-family-member.ts","../../src/realtime-react/use-push.ts","../../src/realtime-react/use-realtime-rooms.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":["import { useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nexport type RealtimeServiceCounter = {\n\tconsumerCount: number\n\tdispose: () => void\n}\n\nexport type RealtimeReactStore = {\n\tsocket: Socket | null\n\tservices: Map<string, RealtimeServiceCounter> | null\n}\n\nexport const RealtimeContext: React.Context<RealtimeReactStore> =\n\tReact.createContext({\n\t\tsocket: null,\n\t\tservices: null,\n\t})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}> = ({ children, socket }) => {\n\tconst services = React.useRef(\n\t\tnew Map<string, RealtimeServiceCounter>(),\n\t).current\n\tconst setMySocketKey = useI(RTC.mySocketKeyAtom)\n\tReact.useEffect(() => {\n\t\tsetMySocketKey(socket?.id ? `socket::${socket.id}` : undefined)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMySocketKey(socket?.id ? `socket::${socket.id}` : undefined)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMySocketKey(undefined)\n\t\t})\n\t}, [socket, setMySocketKey])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket, services }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","/** biome-ignore-all lint/correctness/useHookAtTopLevel: intentional */\n\nimport { isFn } from \"atom.io/internal\"\nimport * as React from \"react\"\n\nexport function useSingleEffect(\n\teffect: () => (() => void) | undefined | void,\n\tdeps: unknown[],\n): void {\n\tconst globalEnv = (globalThis as unknown as { env: any })[`env`]\n\tconst isInDev = globalEnv?.NODE_ENV === `development`\n\tif (isInDev) {\n\t\tconst cleanupRef = React.useRef<boolean | (() => void)>(false)\n\t\tReact.useEffect(() => {\n\t\t\tlet cleanupFn = cleanupRef.current\n\t\t\tif (cleanupFn === false) {\n\t\t\t\tcleanupFn = effect() ?? true\n\t\t\t\tcleanupRef.current = cleanupFn\n\t\t\t} else {\n\t\t\t\treturn () => {\n\t\t\t\t\tif (isFn(cleanupFn)) cleanupFn()\n\t\t\t\t\tcleanupRef.current = false\n\t\t\t\t}\n\t\t\t}\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { RealtimeContext } from \"./realtime-context\"\nimport { useSingleEffect } from \"./use-single-effect\"\n\nexport function useRealtimeService(\n\tkey: string,\n\tcreate: (socket: Socket) => () => void,\n): void {\n\tconst { socket, services } = React.useContext(RealtimeContext)\n\tuseSingleEffect(() => {\n\t\tlet service = services?.get(key)\n\t\tif (service) {\n\t\t\t++service.consumerCount\n\t\t} else if (socket) {\n\t\t\tconst dispose = create(socket)\n\t\t\tservice = { consumerCount: 1, dispose }\n\t\t\tservices?.set(key, service)\n\t\t}\n\t\treturn () => {\n\t\t\tif (service) {\n\t\t\t\t--service.consumerCount\n\t\t\t\tif (service.consumerCount === 0) {\n\t\t\t\t\tservice.dispose?.()\n\t\t\t\t\tservices?.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [socket, key])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtom<J extends Json.Serializable>(\n\ttoken: AtomIO.RegularAtomToken<J>,\n): AtomIO.ViewOf<J> {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtom(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtomFamilyMember<\n\tJ extends Json.Serializable,\n\tK extends Canonical,\n>(\n\tfamily: AtomIO.RegularAtomFamilyToken<J, K>,\n\tsubKey: NoInfer<K>,\n): AtomIO.ViewOf<J> {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, family, subKey)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtomFamilyMember(store, socket, family, subKey),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutable<T extends Transceiver<any, any, any>>(\n\ttoken: AtomIO.MutableAtomToken<T>,\n): T {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtom(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutableAtomFamilyMember<\n\tT extends Transceiver<any, any, any>,\n\tK extends Canonical,\n>(familyToken: AtomIO.MutableAtomFamilyToken<T, K>, key: NoInfer<K>): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, familyToken, key)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtomFamilyMember(store, socket, familyToken, key),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelector<J extends Json.Serializable>(\n\ttoken: AtomIO.SelectorToken<J>,\n): AtomIO.ViewOf<J> {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelector(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelectorFamilyMember<T, K extends Canonical>(\n\tfamilyToken: AtomIO.SelectorFamilyToken<T, K>,\n\tkey: NoInfer<K>,\n): AtomIO.ViewOf<T> {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, familyToken, key)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelectorFamilyMember(store, socket, familyToken, key),\n\t)\n\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useI, useO } from \"atom.io/react\"\nimport * as RT from \"atom.io/realtime\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): (<New extends J>(next: New | ((old: J) => New)) => void) | null {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`push:${token.key}`, (socket) =>\n\t\tRTC.pushState(store, socket, token),\n\t)\n\tconst mutex = useO(RT.mutexAtoms, token.key)\n\tconst setter = useI(token)\n\n\treturn mutex ? setter : null\n}\n","import type { RoomSocketInterface } from \"atom.io/realtime\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useRealtimeRooms<RoomNames extends string>(): Socket<\n\t{},\n\tRoomSocketInterface<RoomNames>\n> {\n\tconst { socket } = React.useContext(RealtimeContext)\n\treturn socket as Socket<{}, RoomSocketInterface<RoomNames>>\n}\n","import { StoreContext } from \"atom.io/react\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport { syncContinuity } from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useSyncContinuity(token: ContinuityToken): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`tx-sync:${token.key}`, (socket) => {\n\t\treturn syncContinuity(store, socket, token)\n\t})\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["RealtimeContext: React.Context<RealtimeReactStore>","RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}>"],"sources":["../../src/realtime-react/realtime-context.tsx","../../src/realtime-react/use-single-effect.ts","../../src/realtime-react/use-realtime-service.ts","../../src/realtime-react/use-pull-atom.ts","../../src/realtime-react/use-pull-atom-family-member.ts","../../src/realtime-react/use-pull-mutable-atom.ts","../../src/realtime-react/use-pull-mutable-family-member.ts","../../src/realtime-react/use-pull-selector.ts","../../src/realtime-react/use-pull-selector-family-member.ts","../../src/realtime-react/use-push.ts","../../src/realtime-react/use-realtime-rooms.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":["import { useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nexport type RealtimeServiceCounter = {\n\tconsumerCount: number\n\tdispose: () => void\n}\n\nexport type RealtimeReactStore = {\n\tsocket: Socket | null\n\tservices: Map<string, RealtimeServiceCounter> | null\n}\n\nexport const RealtimeContext: React.Context<RealtimeReactStore> =\n\tReact.createContext({\n\t\tsocket: null,\n\t\tservices: null,\n\t})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}> = ({ children, socket }) => {\n\tconst services = React.useRef(\n\t\tnew Map<string, RealtimeServiceCounter>(),\n\t).current\n\tconst setMySocketKey = useI(RTC.mySocketKeyAtom)\n\tReact.useEffect(() => {\n\t\tsetMySocketKey(socket?.id ? `socket::${socket.id}` : undefined)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMySocketKey(socket?.id ? `socket::${socket.id}` : undefined)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMySocketKey(undefined)\n\t\t})\n\t}, [socket, setMySocketKey])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket, services }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","/** biome-ignore-all lint/correctness/useHookAtTopLevel: intentional */\n\nimport { isFn } from \"atom.io/internal\"\nimport * as React from \"react\"\n\nexport function useSingleEffect(\n\teffect: () => (() => void) | undefined | void,\n\tdeps: unknown[],\n): void {\n\tconst globalEnv = (globalThis as unknown as { env: any })[`env`]\n\tconst isInDev = globalEnv?.NODE_ENV === `development`\n\tif (isInDev) {\n\t\tconst cleanupRef = React.useRef<boolean | (() => void)>(false)\n\t\tReact.useEffect(() => {\n\t\t\tlet cleanupFn = cleanupRef.current\n\t\t\tif (cleanupFn === false) {\n\t\t\t\tcleanupFn = effect() ?? true\n\t\t\t\tcleanupRef.current = cleanupFn\n\t\t\t} else {\n\t\t\t\treturn () => {\n\t\t\t\t\tif (isFn(cleanupFn)) cleanupFn()\n\t\t\t\t\tcleanupRef.current = false\n\t\t\t\t}\n\t\t\t}\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { RealtimeContext } from \"./realtime-context\"\nimport { useSingleEffect } from \"./use-single-effect\"\n\nexport function useRealtimeService(\n\tkey: string,\n\tcreate: (socket: Socket) => () => void,\n): void {\n\tconst { socket, services } = React.useContext(RealtimeContext)\n\tuseSingleEffect(() => {\n\t\tlet service = services?.get(key)\n\t\tif (service) {\n\t\t\t++service.consumerCount\n\t\t} else if (socket) {\n\t\t\tconst dispose = create(socket)\n\t\t\tservice = { consumerCount: 1, dispose }\n\t\t\tservices?.set(key, service)\n\t\t}\n\t\treturn () => {\n\t\t\tif (service) {\n\t\t\t\t--service.consumerCount\n\t\t\t\tif (service.consumerCount === 0) {\n\t\t\t\t\tservice.dispose?.()\n\t\t\t\t\tservices?.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [socket, key])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtom<J extends Json.Serializable>(\n\ttoken: AtomIO.RegularAtomToken<J>,\n): AtomIO.ViewOf<J> {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtom(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtomFamilyMember<\n\tJ extends Json.Serializable,\n\tK extends Canonical,\n>(\n\tfamily: AtomIO.RegularAtomFamilyToken<J, K>,\n\tsubKey: NoInfer<K>,\n): AtomIO.ViewOf<J> {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, family, subKey)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtomFamilyMember(store, socket, family, subKey),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutable<T extends Transceiver<any, any, any>>(\n\ttoken: AtomIO.MutableAtomToken<T>,\n): T {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtom(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutableAtomFamilyMember<\n\tT extends Transceiver<any, any, any>,\n\tK extends Canonical,\n>(familyToken: AtomIO.MutableAtomFamilyToken<T, K>, key: NoInfer<K>): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, familyToken, key)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtomFamilyMember(store, socket, familyToken, key),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelector<J extends Json.Serializable>(\n\ttoken: AtomIO.SelectorToken<J>,\n): AtomIO.ViewOf<J> {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelector(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Canonical } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelectorFamilyMember<T, K extends Canonical>(\n\tfamilyToken: AtomIO.SelectorFamilyToken<T, K>,\n\tkey: NoInfer<K>,\n): AtomIO.ViewOf<T> {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, familyToken, key)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelectorFamilyMember(store, socket, familyToken, key),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useI, useO } from \"atom.io/react\"\nimport * as RT from \"atom.io/realtime\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): (<New extends J>(next: New | ((old: J) => New)) => void) | null {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`push:${token.key}`, (socket) =>\n\t\tRTC.pushState(store, socket, token),\n\t)\n\tconst mutex = useO(RT.mutexAtoms, token.key)\n\tconst setter = useI(token)\n\n\treturn mutex ? setter : null\n}\n","import type { RoomSocketInterface } from \"atom.io/realtime\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useRealtimeRooms<RoomNames extends string>(): Socket<\n\t{},\n\tRoomSocketInterface<RoomNames>\n> {\n\tconst { socket } = React.useContext(RealtimeContext)\n\treturn socket as Socket<{}, RoomSocketInterface<RoomNames>>\n}\n","import { StoreContext } from \"atom.io/react\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport { syncContinuity } from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useSyncContinuity(token: ContinuityToken): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`tx-sync:${token.key}`, (socket) => {\n\t\treturn syncContinuity(store, socket, token)\n\t})\n}\n"],"mappings":"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"}
|
|
@@ -4,12 +4,12 @@ import { toEntries } from "atom.io/json";
|
|
|
4
4
|
import { UList } from "atom.io/transceivers/u-list";
|
|
5
5
|
import "react";
|
|
6
6
|
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
import * as RTR from "atom.io/realtime-react";
|
|
7
8
|
import * as AR from "atom.io/react";
|
|
8
9
|
import * as RTC from "atom.io/realtime-client";
|
|
9
10
|
import { ChildProcess } from "node:child_process";
|
|
10
11
|
import * as http from "node:http";
|
|
11
12
|
import { prettyDOM, render } from "@testing-library/react";
|
|
12
|
-
import * as RTR from "atom.io/realtime-react";
|
|
13
13
|
import * as RTS from "atom.io/realtime-server";
|
|
14
14
|
import * as Happy from "happy-dom";
|
|
15
15
|
import * as SocketIO from "socket.io";
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Fn, Subject, Transceiver, TransceiverMode } from "atom.io/internal";
|
|
2
2
|
import { AtomEffect } from "atom.io";
|
|
3
|
-
import { primitive } from "atom.io/json";
|
|
4
|
-
import { Enumeration } from "atom.io/struct";
|
|
3
|
+
import { Enumeration, primitive } from "atom.io/json";
|
|
5
4
|
|
|
6
5
|
//#region src/transceivers/o-list/o-list.d.ts
|
|
7
6
|
type ArrayMutations = Exclude<keyof Array<any>, keyof ReadonlyArray<any>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES>","oListDisposedKeyCleanupEffect: AtomEffect<OList<primitive>>"],"sources":["../../../src/transceivers/o-list/o-list.ts","../../../src/transceivers/o-list/o-list-disposed-key-cleanup-effect.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES>","oListDisposedKeyCleanupEffect: AtomEffect<OList<primitive>>"],"sources":["../../../src/transceivers/o-list/o-list.ts","../../../src/transceivers/o-list/o-list-disposed-key-cleanup-effect.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Subject, getFromStore, getUpdateToken, subscribeInStore } from "atom.io/internal";
|
|
2
|
-
import { stringifyJson } from "atom.io/json";
|
|
3
|
-
import { enumeration, packValue, unpackValue } from "atom.io/struct";
|
|
2
|
+
import { enumeration, packCanonical, stringifyJson, unpackCanonical } from "atom.io/json";
|
|
4
3
|
|
|
5
4
|
//#region src/transceivers/o-list/o-list.ts
|
|
6
5
|
const ARRAY_UPDATES = [
|
|
@@ -348,31 +347,31 @@ var OList = class OList extends Array {
|
|
|
348
347
|
let packed = ARRAY_UPDATE_ENUM[update.type] + `\u001F`;
|
|
349
348
|
switch (update.type) {
|
|
350
349
|
case `set`:
|
|
351
|
-
packed += update.index + `\u001E` +
|
|
352
|
-
if (update.prev !== void 0) packed += `\u001E` +
|
|
350
|
+
packed += update.index + `\u001E` + packCanonical(update.next);
|
|
351
|
+
if (update.prev !== void 0) packed += `\u001E` + packCanonical(update.prev);
|
|
353
352
|
return packed;
|
|
354
|
-
case `truncate`: return packed + update.length + `\u001E` + update.items.map(
|
|
353
|
+
case `truncate`: return packed + update.length + `\u001E` + update.items.map(packCanonical).join(`\u001E`);
|
|
355
354
|
case `extend`: return packed + update.next + `\u001E` + update.prev;
|
|
356
355
|
case `pop`:
|
|
357
356
|
case `shift`:
|
|
358
|
-
if (update.value !== void 0) packed +=
|
|
357
|
+
if (update.value !== void 0) packed += packCanonical(update.value);
|
|
359
358
|
return packed;
|
|
360
359
|
case `push`:
|
|
361
|
-
case `unshift`: return packed + update.items.map(
|
|
360
|
+
case `unshift`: return packed + update.items.map(packCanonical).join(`\u001E`);
|
|
362
361
|
case `copyWithin`:
|
|
363
362
|
packed += update.target + `\u001E` + update.start;
|
|
364
363
|
if (update.end !== void 0) packed += `\u001E` + update.end;
|
|
365
|
-
packed += `\u001E\u001E` + update.prev.map(
|
|
364
|
+
packed += `\u001E\u001E` + update.prev.map(packCanonical).join(`\u001E`);
|
|
366
365
|
return packed;
|
|
367
366
|
case `fill`:
|
|
368
|
-
packed +=
|
|
367
|
+
packed += packCanonical(update.value);
|
|
369
368
|
if (update.start !== void 0) packed += `\u001E` + update.start;
|
|
370
369
|
if (update.end !== void 0) packed += `\u001E` + update.end;
|
|
371
|
-
packed += `\u001E\u001E` + update.prev.map(
|
|
370
|
+
packed += `\u001E\u001E` + update.prev.map(packCanonical).join(`\u001E`);
|
|
372
371
|
return packed;
|
|
373
|
-
case `splice`: return packed + update.start + `\u001E\u001E` + update.deleteCount + `\u001E\u001E` + update.items.map(
|
|
372
|
+
case `splice`: return packed + update.start + `\u001E\u001E` + update.deleteCount + `\u001E\u001E` + update.items.map(packCanonical).join(`\u001E`) + `\u001E\u001E` + update.deleted.map(packCanonical).join(`\u001E`);
|
|
374
373
|
case `reverse`: return packed;
|
|
375
|
-
case `sort`: return packed + update.next.map(
|
|
374
|
+
case `sort`: return packed + update.next.map(packCanonical).join(`\u001E`) + `\u001E\u001E` + update.prev.map(packCanonical).join(`\u001E`);
|
|
376
375
|
}
|
|
377
376
|
}
|
|
378
377
|
static unpackUpdate(packed) {
|
|
@@ -382,7 +381,7 @@ var OList = class OList extends Array {
|
|
|
382
381
|
case `set`: {
|
|
383
382
|
const [i, n, p] = tail.split(`\u001E`);
|
|
384
383
|
const index = +i;
|
|
385
|
-
const next =
|
|
384
|
+
const next = unpackCanonical(n);
|
|
386
385
|
if (p === void 0) return {
|
|
387
386
|
type,
|
|
388
387
|
index,
|
|
@@ -392,7 +391,7 @@ var OList = class OList extends Array {
|
|
|
392
391
|
type,
|
|
393
392
|
index,
|
|
394
393
|
next,
|
|
395
|
-
prev:
|
|
394
|
+
prev: unpackCanonical(p)
|
|
396
395
|
};
|
|
397
396
|
}
|
|
398
397
|
case `truncate`: {
|
|
@@ -400,7 +399,7 @@ var OList = class OList extends Array {
|
|
|
400
399
|
return {
|
|
401
400
|
type,
|
|
402
401
|
length: +l,
|
|
403
|
-
items: i.map(
|
|
402
|
+
items: i.map(unpackCanonical)
|
|
404
403
|
};
|
|
405
404
|
}
|
|
406
405
|
case `extend`: {
|
|
@@ -415,17 +414,17 @@ var OList = class OList extends Array {
|
|
|
415
414
|
case `shift`:
|
|
416
415
|
if (tail !== ``) return {
|
|
417
416
|
type,
|
|
418
|
-
value:
|
|
417
|
+
value: unpackCanonical(tail)
|
|
419
418
|
};
|
|
420
419
|
return { type };
|
|
421
420
|
case `push`:
|
|
422
421
|
case `unshift`: return {
|
|
423
422
|
type,
|
|
424
|
-
items: tail.split(`\u001E`).map(
|
|
423
|
+
items: tail.split(`\u001E`).map(unpackCanonical)
|
|
425
424
|
};
|
|
426
425
|
case `copyWithin`: {
|
|
427
426
|
const [numbers, data] = tail.split(`\u001E\u001E`);
|
|
428
|
-
const prev = data ? data.split(`\u001E`).map(
|
|
427
|
+
const prev = data ? data.split(`\u001E`).map(unpackCanonical) : [];
|
|
429
428
|
const [t, s, e] = numbers.split(`\u001E`);
|
|
430
429
|
const target = +t;
|
|
431
430
|
const start = +s;
|
|
@@ -445,9 +444,9 @@ var OList = class OList extends Array {
|
|
|
445
444
|
}
|
|
446
445
|
case `fill`: {
|
|
447
446
|
const [numbers, data] = tail.split(`\u001E\u001E`);
|
|
448
|
-
const prev = data ? data.split(`\u001E`).map(
|
|
447
|
+
const prev = data ? data.split(`\u001E`).map(unpackCanonical) : [];
|
|
449
448
|
const [v, s, e] = numbers.split(`\u001E`);
|
|
450
|
-
const value =
|
|
449
|
+
const value = unpackCanonical(v);
|
|
451
450
|
if (s === void 0 && e === void 0) return {
|
|
452
451
|
type,
|
|
453
452
|
value,
|
|
@@ -474,8 +473,8 @@ var OList = class OList extends Array {
|
|
|
474
473
|
type,
|
|
475
474
|
start: +s,
|
|
476
475
|
deleteCount: +c,
|
|
477
|
-
items: i ? i.split(`\u001E`).map(
|
|
478
|
-
deleted: d ? d.split(`\u001E`).map(
|
|
476
|
+
items: i ? i.split(`\u001E`).map(unpackCanonical) : [],
|
|
477
|
+
deleted: d ? d.split(`\u001E`).map(unpackCanonical) : []
|
|
479
478
|
};
|
|
480
479
|
}
|
|
481
480
|
case `reverse`: return { type };
|
|
@@ -483,8 +482,8 @@ var OList = class OList extends Array {
|
|
|
483
482
|
const [n, p] = tail.split(`\u001E\u001E`);
|
|
484
483
|
return {
|
|
485
484
|
type,
|
|
486
|
-
next: n ? n.split(`\u001E`).map(
|
|
487
|
-
prev: p ? p.split(`\u001E`).map(
|
|
485
|
+
next: n ? n.split(`\u001E`).map(unpackCanonical) : [],
|
|
486
|
+
prev: p ? p.split(`\u001E`).map(unpackCanonical) : []
|
|
488
487
|
};
|
|
489
488
|
}
|
|
490
489
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES>","prev: P | undefined","result: number","value: P | undefined","prev: P[] | undefined","oListDisposedKeyCleanupEffect: AtomEffect<OList<primitive>>"],"sources":["../../../src/transceivers/o-list/o-list.ts","../../../src/transceivers/o-list/o-list-disposed-key-cleanup-effect.ts"],"sourcesContent":["import type { Fn, Transceiver, TransceiverMode } from \"atom.io/internal\"\nimport { Subject } from \"atom.io/internal\"\nimport type { primitive } from \"atom.io/json\"\nimport type { Enumeration } from \"atom.io/struct\"\nimport { enumeration, packValue, unpackValue } from \"atom.io/struct\"\n\nexport type ArrayMutations = Exclude<keyof Array<any>, keyof ReadonlyArray<any>>\nexport type ArrayUpdate<P extends primitive> =\n\t| {\n\t\t\ttype: `copyWithin`\n\t\t\ttarget: number\n\t\t\tstart: number\n\t\t\tend?: number\n\t\t\tprev: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `extend`\n\t\t\tnext: number\n\t\t\tprev: number\n\t }\n\t| {\n\t\t\ttype: `fill`\n\t\t\tvalue: P\n\t\t\tstart?: number\n\t\t\tend?: number\n\t\t\tprev: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `pop` | `shift`\n\t\t\tvalue?: P\n\t }\n\t| {\n\t\t\ttype: `push` | `unshift`\n\t\t\titems: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `reverse`\n\t }\n\t| {\n\t\t\ttype: `set`\n\t\t\tnext: P\n\t\t\tprev?: P\n\t\t\tindex: number\n\t }\n\t| {\n\t\t\ttype: `sort`\n\t\t\tnext: readonly P[]\n\t\t\tprev: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `splice`\n\t\t\tstart: number\n\t\t\tdeleteCount: number\n\t\t\titems: readonly P[]\n\t\t\tdeleted: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `truncate`\n\t\t\tlength: number\n\t\t\titems: readonly P[]\n\t }\nexport type OListUpdateType = ArrayUpdate<any>[`type`]\ntrue satisfies ArrayMutations extends OListUpdateType\n\t? true\n\t: Exclude<ArrayMutations, OListUpdateType>\n\nexport type PackedArrayUpdate<P extends primitive> = string & {\n\tupdate?: ArrayUpdate<P>\n\ttype?: P\n}\n\nconst ARRAY_UPDATES = [\n\t// virtual methods\n\t`set`,\n\t`truncate`,\n\t`extend`,\n\t// actual methods\n\t`pop`,\n\t`push`,\n\t`shift`,\n\t`unshift`,\n\t`copyWithin`,\n\t`fill`,\n\t`splice`,\n\t`reverse`,\n\t`sort`,\n] as const\ntrue satisfies ArrayUpdate<any>[`type`] extends (typeof ARRAY_UPDATES)[number]\n\t? true\n\t: Exclude<ArrayUpdate<any>[`type`], (typeof ARRAY_UPDATES)[number]>\n\nexport const ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES> =\n\tenumeration(ARRAY_UPDATES)\n\nexport type ArrayMutationHandler = {\n\t[K in Exclude<OListUpdateType, `extend` | `set` | `truncate`>]: Fn\n}\n\nexport type OListView<P extends primitive> = ReadonlyArray<P> & {\n\tsubscribe: (\n\t\tkey: string,\n\t\tfn: (update: PackedArrayUpdate<P>) => void,\n\t) => () => void\n}\n\nexport class OList<P extends primitive>\n\textends Array<P>\n\timplements\n\t\tTransceiver<OListView<P>, PackedArrayUpdate<P>, ReadonlyArray<P>>,\n\t\tArrayMutationHandler\n{\n\tpublic mode: TransceiverMode = `record`\n\tpublic readonly subject: Subject<PackedArrayUpdate<P>> = new Subject()\n\n\tpublic readonly READONLY_VIEW: OListView<P> = this\n\n\tpublic constructor(arrayLength?: number)\n\tpublic constructor(...items: P[])\n\tpublic constructor(...items: P[]) {\n\t\tsuper(...items)\n\t\t// biome-ignore lint/correctness/noConstructorReturn: this is chill\n\t\treturn new Proxy(this, {\n\t\t\tset: (target, prop, value, receiver) => {\n\t\t\t\tif (\n\t\t\t\t\ttypeof prop === `string` &&\n\t\t\t\t\t!Number.isNaN(Number.parseInt(prop, 10))\n\t\t\t\t) {\n\t\t\t\t\tconst index = Number(prop)\n\t\t\t\t\tlet prev: P | undefined\n\t\t\t\t\tif (this.mode === `record`) {\n\t\t\t\t\t\tprev = target[index]\n\t\t\t\t\t}\n\t\t\t\t\ttarget[index] = value\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tthis.emit({ type: `set`, index, next: value, prev })\n\t\t\t\t\t} else if (this.mode === `record`) {\n\t\t\t\t\t\tthis.emit({ type: `set`, index, next: value })\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tif (prop === `length`) {\n\t\t\t\t\tif (this.mode === `record`) {\n\t\t\t\t\t\tconst prevLength = target.length\n\t\t\t\t\t\tif (prevLength === value) return true\n\t\t\t\t\t\tif (prevLength > value) {\n\t\t\t\t\t\t\tconst dropped = target.slice(value)\n\t\t\t\t\t\t\ttarget.length = value\n\t\t\t\t\t\t\tthis.emit({ type: `truncate`, length: value, items: dropped })\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttarget.length = value\n\t\t\t\t\t\t\tthis.emit({ type: `extend`, next: value, prev: prevLength })\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.length = value\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn Reflect.set(target, prop, value, receiver)\n\t\t\t},\n\t\t})\n\t}\n\n\tpublic toJSON(): ReadonlyArray<P> {\n\t\treturn [...this]\n\t}\n\n\tpublic static fromJSON<P extends primitive>(json: ReadonlyArray<P>): OList<P> {\n\t\treturn new OList<P>(...json)\n\t}\n\n\tpublic push(...items: P[]): number {\n\t\tlet result: number\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tresult = super.push(...items)\n\t\t\tthis.mode = `record`\n\t\t\tthis.emit({ type: `push`, items })\n\t\t} else {\n\t\t\tresult = super.push(...items)\n\t\t}\n\t\treturn result\n\t}\n\tpublic pop(): P | undefined {\n\t\tlet value: P | undefined\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tvalue = super.pop()\n\t\t\tif (value === undefined) {\n\t\t\t\tthis.emit({ type: `pop` })\n\t\t\t} else {\n\t\t\t\tthis.emit({ type: `pop`, value })\n\t\t\t}\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tvalue = super.pop()\n\t\t}\n\t\treturn value\n\t}\n\tpublic shift(): P | undefined {\n\t\tlet value: P | undefined\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tvalue = super.shift()\n\t\t\tif (value === undefined) {\n\t\t\t\tthis.emit({ type: `shift` })\n\t\t\t} else {\n\t\t\t\tthis.emit({ type: `shift`, value })\n\t\t\t}\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tvalue = super.shift()\n\t\t}\n\t\treturn value\n\t}\n\tpublic unshift(...items: P[]): number {\n\t\tlet result: number\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tresult = super.unshift(...items)\n\t\t\tthis.emit({ type: `unshift`, items })\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tresult = super.unshift(...items)\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic reverse(): this {\n\t\tsuper.reverse()\n\t\tif (this.mode === `record`) {\n\t\t\tthis.emit({ type: `reverse` })\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic fill(value: P, start?: number, end?: number): this {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tconst prev = this.slice(start, end)\n\t\t\tsuper.fill(value, start, end)\n\t\t\tif (start === undefined) {\n\t\t\t\tthis.emit({ type: `fill`, value, prev })\n\t\t\t} else {\n\t\t\t\tif (end === undefined) {\n\t\t\t\t\tthis.emit({ type: `fill`, value, start, prev })\n\t\t\t\t} else {\n\t\t\t\t\tthis.emit({ type: `fill`, value, start, end, prev })\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tsuper.fill(value, start, end)\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic sort(compareFn?: (a: P, b: P) => number): this {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tconst prev = [...this]\n\t\t\tsuper.sort(compareFn)\n\t\t\tconst next = [...this]\n\t\t\tthis.emit({ type: `sort`, next, prev })\n\t\t\tthis.mode = `record`\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic splice(start: number, deleteCount?: number): P[]\n\tpublic splice(start: number, deleteCount: number, ...items: P[]): P[]\n\tpublic splice(\n\t\t...params: [start: number, deleteCount?: number, ...items: P[]]\n\t): P[] {\n\t\tconst [start, deleteCount, ...items] = params\n\t\tconst originalMode = this.mode\n\t\tif (originalMode === `record`) this.mode = `playback`\n\t\tconst deleted = super.splice(...(params as [number, number, ...P[]]))\n\t\tif (originalMode === `record`) this.mode = `record`\n\t\tif (deleteCount === undefined) {\n\t\t\tthis.emit({\n\t\t\t\ttype: `splice`,\n\t\t\t\tstart,\n\t\t\t\titems,\n\t\t\t\tdeleted,\n\t\t\t\tdeleteCount: deleted.length,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.emit({ type: `splice`, start, items, deleted, deleteCount })\n\t\t}\n\n\t\treturn deleted\n\t}\n\n\tpublic copyWithin(target: number, start: number, end?: number): this {\n\t\tconst originalMode = this.mode\n\t\tlet prev: P[] | undefined\n\t\tif (originalMode === `record`) {\n\t\t\tprev = this.slice(target)\n\t\t\tthis.mode = `playback`\n\t\t}\n\t\tsuper.copyWithin(target, start, end)\n\t\tif (originalMode === `record`) this.mode = `record`\n\t\tif (prev) {\n\t\t\tif (end === undefined) {\n\t\t\t\tthis.emit({ type: `copyWithin`, prev, target, start })\n\t\t\t} else {\n\t\t\t\tthis.emit({ type: `copyWithin`, prev, target, start, end })\n\t\t\t}\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic subscribe(\n\t\tkey: string,\n\t\tfn: (update: PackedArrayUpdate<P>) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, fn)\n\t}\n\n\tpublic emit(update: ArrayUpdate<P>): void {\n\t\tthis.subject.next(OList.packUpdate(update))\n\t}\n\n\tprivate doStep(update: ArrayUpdate<P>): void {\n\t\tconst type = update.type\n\t\tswitch (type) {\n\t\t\tcase `copyWithin`:\n\t\t\t\tthis.copyWithin(update.target, update.start, update.end)\n\t\t\t\tbreak\n\t\t\tcase `extend`:\n\t\t\t\tthis.length = update.next\n\t\t\t\tbreak\n\t\t\tcase `fill`:\n\t\t\t\tthis.fill(update.value, update.start, update.end)\n\t\t\t\tbreak\n\t\t\tcase `pop`:\n\t\t\t\tthis.pop()\n\t\t\t\tbreak\n\t\t\tcase `push`:\n\t\t\t\tthis.push(...update.items)\n\t\t\t\tbreak\n\t\t\tcase `reverse`:\n\t\t\t\tthis.reverse()\n\t\t\t\tbreak\n\t\t\tcase `shift`:\n\t\t\t\tthis.shift()\n\t\t\t\tbreak\n\t\t\tcase `sort`:\n\t\t\t\tfor (let i = 0; i < update.next.length; i++) {\n\t\t\t\t\tthis[i] = update.next[i]\n\t\t\t\t}\n\t\t\t\tthis.length = update.next.length\n\t\t\t\tbreak\n\t\t\tcase `splice`:\n\t\t\t\tthis.splice(update.start, update.deleteCount, ...update.items)\n\t\t\t\tbreak\n\t\t\tcase `truncate`:\n\t\t\t\tthis.length = update.length\n\t\t\t\tbreak\n\t\t\tcase `set`:\n\t\t\t\tthis[update.index] = update.next\n\t\t\t\tbreak\n\t\t\tcase `unshift`:\n\t\t\t\tthis.unshift(...update.items)\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tpublic do(update: PackedArrayUpdate<P>): null {\n\t\tthis.mode = `playback`\n\t\tconst unpacked = OList.unpackUpdate(update)\n\t\tthis.doStep(unpacked)\n\t\tthis.mode = `record`\n\t\treturn null\n\t}\n\n\tpublic undoStep(update: ArrayUpdate<P>): void {\n\t\tswitch (update.type) {\n\t\t\tcase `copyWithin`:\n\t\t\t\tfor (let i = 0; i < update.prev.length; i++) {\n\t\t\t\t\tthis[i + update.target] = update.prev[i]\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `extend`:\n\t\t\t\tthis.length = update.prev\n\t\t\t\tbreak\n\t\t\tcase `fill`:\n\t\t\t\t{\n\t\t\t\t\tconst start = update.start ?? 0\n\t\t\t\t\tfor (let i = 0; i < update.prev.length; i++) {\n\t\t\t\t\t\tthis[i + start] = update.prev[i]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `pop`:\n\t\t\t\tif (update.value) this.push(update.value)\n\t\t\t\tbreak\n\t\t\tcase `push`:\n\t\t\t\t{\n\t\t\t\t\tlet i = update.items.length - 1\n\t\t\t\t\twhile (i >= 0) {\n\t\t\t\t\t\tthis.pop()\n\t\t\t\t\t\t--i\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `reverse`:\n\t\t\t\tthis.reverse()\n\t\t\t\tbreak\n\t\t\tcase `shift`:\n\t\t\t\tif (update.value) this.unshift(update.value)\n\t\t\t\tbreak\n\t\t\tcase `sort`:\n\t\t\t\tfor (let i = 0; i < update.prev.length; i++) {\n\t\t\t\t\tthis[i] = update.prev[i]\n\t\t\t\t}\n\t\t\t\tthis.length = update.prev.length\n\t\t\t\tbreak\n\t\t\tcase `set`:\n\t\t\t\tif (update.prev) {\n\t\t\t\t\tthis[update.index] = update.prev\n\t\t\t\t} else {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\t\tdelete this[update.index]\n\t\t\t\t\tconst firstEmptyIndex = this.findIndex(\n\t\t\t\t\t\t(_, i) => !Object.hasOwn(this, i),\n\t\t\t\t\t)\n\t\t\t\t\tif (firstEmptyIndex !== -1) {\n\t\t\t\t\t\tthis.length = firstEmptyIndex\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `splice`:\n\t\t\t\tthis.splice(update.start, update.items.length, ...update.deleted)\n\t\t\t\tbreak\n\t\t\tcase `truncate`:\n\t\t\t\tthis.push(...update.items)\n\t\t\t\tbreak\n\t\t\tcase `unshift`:\n\t\t\t\t{\n\t\t\t\t\tlet i = update.items.length - 1\n\t\t\t\t\twhile (i >= 0) {\n\t\t\t\t\t\tthis.shift()\n\t\t\t\t\t\t--i\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tpublic undo(update: PackedArrayUpdate<P>): number | null {\n\t\tthis.mode = `playback`\n\t\tconst unpacked = OList.unpackUpdate(update)\n\t\tthis.undoStep(unpacked)\n\t\tthis.mode = `record`\n\t\treturn null\n\t}\n\n\tpublic static packUpdate<P extends primitive>(\n\t\tupdate: ArrayUpdate<P>,\n\t): PackedArrayUpdate<P> {\n\t\tlet packed = ARRAY_UPDATE_ENUM[update.type] + `\\u001F`\n\t\tswitch (update.type) {\n\t\t\tcase `set`:\n\t\t\t\tpacked += update.index + `\\u001E` + packValue(update.next)\n\t\t\t\tif (update.prev !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + packValue(update.prev)\n\t\t\t\t}\n\t\t\t\treturn packed\n\t\t\tcase `truncate`:\n\t\t\t\treturn (\n\t\t\t\t\tpacked +\n\t\t\t\t\tupdate.length +\n\t\t\t\t\t`\\u001E` +\n\t\t\t\t\tupdate.items.map(packValue).join(`\\u001E`)\n\t\t\t\t)\n\t\t\tcase `extend`:\n\t\t\t\treturn packed + update.next + `\\u001E` + update.prev\n\t\t\tcase `pop`:\n\t\t\tcase `shift`:\n\t\t\t\tif (update.value !== undefined) {\n\t\t\t\t\tpacked += packValue(update.value)\n\t\t\t\t}\n\t\t\t\treturn packed\n\t\t\tcase `push`:\n\t\t\tcase `unshift`:\n\t\t\t\treturn packed + update.items.map(packValue).join(`\\u001E`)\n\t\t\tcase `copyWithin`:\n\t\t\t\tpacked += update.target + `\\u001E` + update.start\n\t\t\t\tif (update.end !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + update.end\n\t\t\t\t}\n\t\t\t\tpacked += `\\u001E\\u001E` + update.prev.map(packValue).join(`\\u001E`)\n\t\t\t\treturn packed\n\t\t\tcase `fill`:\n\t\t\t\tpacked += packValue(update.value)\n\t\t\t\tif (update.start !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + update.start\n\t\t\t\t}\n\t\t\t\tif (update.end !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + update.end\n\t\t\t\t}\n\t\t\t\tpacked += `\\u001E\\u001E` + update.prev.map(packValue).join(`\\u001E`)\n\t\t\t\treturn packed\n\t\t\tcase `splice`:\n\t\t\t\treturn (\n\t\t\t\t\tpacked +\n\t\t\t\t\tupdate.start +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.deleteCount +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.items.map(packValue).join(`\\u001E`) +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.deleted.map(packValue).join(`\\u001E`)\n\t\t\t\t)\n\t\t\tcase `reverse`:\n\t\t\t\treturn packed\n\t\t\tcase `sort`:\n\t\t\t\treturn (\n\t\t\t\t\tpacked +\n\t\t\t\t\tupdate.next.map(packValue).join(`\\u001E`) +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.prev.map(packValue).join(`\\u001E`)\n\t\t\t\t)\n\t\t}\n\t}\n\n\tpublic static unpackUpdate<P extends primitive>(\n\t\tpacked: PackedArrayUpdate<P>,\n\t): ArrayUpdate<P> {\n\t\tconst [head, tail] = packed.split(`\\u001F`) as [\n\t\t\tExtract<keyof typeof ARRAY_UPDATE_ENUM, number>,\n\t\t\tstring,\n\t\t]\n\t\tconst type = ARRAY_UPDATE_ENUM[head]\n\t\tswitch (type) {\n\t\t\tcase `set`: {\n\t\t\t\tconst [i, n, p] = tail.split(`\\u001E`)\n\t\t\t\tconst index = +i\n\t\t\t\tconst next = unpackValue(n) as P\n\t\t\t\tif (p === undefined) {\n\t\t\t\t\treturn { type, index, next }\n\t\t\t\t}\n\t\t\t\tconst prev = unpackValue(p) as P\n\t\t\t\treturn { type, index, next, prev }\n\t\t\t}\n\t\t\tcase `truncate`: {\n\t\t\t\tconst [l, ...i] = tail.split(`\\u001E`)\n\t\t\t\tconst length = +l\n\t\t\t\tconst items = i.map(unpackValue) as P[]\n\t\t\t\treturn { type, length, items }\n\t\t\t}\n\t\t\tcase `extend`: {\n\t\t\t\tconst [n, p] = tail.split(`\\u001E`)\n\t\t\t\tconst next = +n\n\t\t\t\tconst prev = +p\n\t\t\t\treturn { type, next, prev }\n\t\t\t}\n\t\t\tcase `pop`:\n\t\t\tcase `shift`:\n\t\t\t\tif (tail !== ``) {\n\t\t\t\t\tconst value = unpackValue(tail) as P\n\t\t\t\t\treturn { type, value }\n\t\t\t\t}\n\t\t\t\treturn { type }\n\t\t\tcase `push`:\n\t\t\tcase `unshift`: {\n\t\t\t\tconst items = tail.split(`\\u001E`).map(unpackValue) as P[]\n\t\t\t\treturn { type, items }\n\t\t\t}\n\t\t\tcase `copyWithin`: {\n\t\t\t\tconst [numbers, data] = tail.split(`\\u001E\\u001E`)\n\t\t\t\tconst prev = data ? (data.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\tconst [t, s, e] = numbers.split(`\\u001E`)\n\t\t\t\tconst target = +t\n\t\t\t\tconst start = +s\n\t\t\t\tif (e === undefined) {\n\t\t\t\t\treturn { type, target, start, prev }\n\t\t\t\t}\n\t\t\t\tconst end = +e\n\t\t\t\treturn { type, target, start, prev, end }\n\t\t\t}\n\t\t\tcase `fill`: {\n\t\t\t\tconst [numbers, data] = tail.split(`\\u001E\\u001E`)\n\t\t\t\tconst prev = data ? (data.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\tconst [v, s, e] = numbers.split(`\\u001E`)\n\t\t\t\tconst value = unpackValue(v) as P\n\t\t\t\tif (s === undefined && e === undefined) {\n\t\t\t\t\treturn { type, value, prev }\n\t\t\t\t}\n\t\t\t\tconst start = +s\n\t\t\t\tif (e === undefined) {\n\t\t\t\t\treturn { type, value, prev, start }\n\t\t\t\t}\n\t\t\t\tconst end = +e\n\t\t\t\treturn { type, value, prev, start, end }\n\t\t\t}\n\t\t\tcase `splice`: {\n\t\t\t\tconst [s, c, i, d] = tail.split(`\\u001E\\u001E`)\n\n\t\t\t\tconst start = +s\n\t\t\t\tconst deleteCount = +c\n\t\t\t\tconst items = i ? (i.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\tconst deleted = d ? (d.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\treturn { type, start, deleteCount, items, deleted }\n\t\t\t}\n\t\t\tcase `reverse`:\n\t\t\t\treturn { type }\n\t\t\tcase `sort`: {\n\t\t\t\tconst [n, p] = tail.split(`\\u001E\\u001E`)\n\t\t\t\tconst next = n ? (n.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\tconst prev = p ? (p.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\treturn { type, next, prev }\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { AtomEffect } from \"atom.io\"\nimport { getFromStore, getUpdateToken, subscribeInStore } from \"atom.io/internal\"\nimport { type primitive, stringifyJson } from \"atom.io/json\"\n\nimport { OList } from \"./o-list\"\n\nexport function filterOutInPlace<T>(arr: T[], toRemove: T): T[] {\n\tlet writeIndex = 0\n\n\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\tfor (let readIndex = 0; readIndex < arr.length; readIndex++) {\n\t\tif (toRemove !== arr[readIndex]) {\n\t\t\tarr[writeIndex] = arr[readIndex]\n\t\t\twriteIndex++\n\t\t}\n\t}\n\n\tarr.length = writeIndex\n\treturn arr\n}\n\nexport const oListDisposedKeyCleanupEffect: AtomEffect<OList<primitive>> = ({\n\ttoken,\n\tsetSelf,\n\tstore,\n}) => {\n\tconst disposalSubscriptions = new Map<primitive, () => void>()\n\tconst updateToken = getUpdateToken(token)\n\n\tconst addedValues = new Set<primitive>()\n\tconst removedValues = new Set<primitive>()\n\tfunction updateSubscriptions() {\n\t\tfor (const addedValue of addedValues) {\n\t\t\tconst molecule = store.molecules.get(stringifyJson(addedValue))\n\t\t\tif (molecule) {\n\t\t\t\tdisposalSubscriptions.set(\n\t\t\t\t\taddedValue,\n\t\t\t\t\tmolecule.subject.subscribe(token.key, () => {\n\t\t\t\t\t\tdisposalSubscriptions.get(addedValue)?.()\n\t\t\t\t\t\tdisposalSubscriptions.delete(addedValue)\n\t\t\t\t\t\tsetSelf((self) => {\n\t\t\t\t\t\t\tfilterOutInPlace(self, addedValue)\n\t\t\t\t\t\t\treturn self\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tstore.logger.warn(\n\t\t\t\t\t`❌`,\n\t\t\t\t\ttoken.type,\n\t\t\t\t\ttoken.key,\n\t\t\t\t\t`Added \"${addedValue}\" to ${token.key} but it has not been allocated.`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tfor (const removedValue of removedValues) {\n\t\t\tif (disposalSubscriptions.has(removedValue)) {\n\t\t\t\tdisposalSubscriptions.get(removedValue)?.()\n\t\t\t\tdisposalSubscriptions.delete(removedValue)\n\t\t\t}\n\t\t}\n\t}\n\tsubscribeInStore(\n\t\tstore,\n\t\tupdateToken,\n\t\tfunction manageAutoDeletionTriggers({ newValue }) {\n\t\t\tconst currentList = getFromStore(store, token)\n\t\t\tconst unpacked = OList.unpackUpdate(newValue)\n\t\t\tswitch (unpacked.type) {\n\t\t\t\tcase `extend`:\n\t\t\t\tcase `reverse`:\n\t\t\t\tcase `sort`:\n\t\t\t\t\tbreak // these don't change what values are present in the list\n\n\t\t\t\tcase `set`:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst { next } = unpacked\n\t\t\t\t\t\tif (`prev` in unpacked && !currentList.includes(unpacked.prev)) {\n\t\t\t\t\t\t\tremovedValues.add(unpacked.prev)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!disposalSubscriptions.has(next)) {\n\t\t\t\t\t\t\taddedValues.add(next)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `truncate`:\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (const item of unpacked.items) {\n\t\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\t\tremovedValues.add(item)\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\tbreak\n\t\t\t\tcase `shift`:\n\t\t\t\tcase `pop`:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst { value } = unpacked\n\t\t\t\t\t\tif (value !== undefined && !currentList.includes(value)) {\n\t\t\t\t\t\t\tremovedValues.add(value)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `push`:\n\t\t\t\tcase `unshift`:\n\t\t\t\t\tfor (const item of unpacked.items) {\n\t\t\t\t\t\tif (!disposalSubscriptions.has(item)) {\n\t\t\t\t\t\t\taddedValues.add(item)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `copyWithin`:\n\t\t\t\t\tfor (const item of unpacked.prev) {\n\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\tremovedValues.add(item)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `fill`:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst { value } = unpacked\n\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\tif (!disposalSubscriptions.has(value)) {\n\t\t\t\t\t\t\t\taddedValues.add(value)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const item of unpacked.prev) {\n\t\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\t\tremovedValues.add(item)\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\tbreak\n\t\t\t\tcase `splice`:\n\t\t\t\t\tfor (const item of unpacked.deleted) {\n\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\tremovedValues.add(item)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const addedItem of unpacked.items) {\n\t\t\t\t\t\tif (!disposalSubscriptions.has(addedItem)) {\n\t\t\t\t\t\t\taddedValues.add(addedItem)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t\tupdateSubscriptions()\n\t\t\taddedValues.clear()\n\t\t\tremovedValues.clear()\n\t\t},\n\t\t`set-auto-deletion-triggers`,\n\t)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES>","prev: P | undefined","result: number","value: P | undefined","prev: P[] | undefined","oListDisposedKeyCleanupEffect: AtomEffect<OList<primitive>>"],"sources":["../../../src/transceivers/o-list/o-list.ts","../../../src/transceivers/o-list/o-list-disposed-key-cleanup-effect.ts"],"sourcesContent":["import type { Fn, Transceiver, TransceiverMode } from \"atom.io/internal\"\nimport { Subject } from \"atom.io/internal\"\nimport type { Enumeration, packed, primitive } from \"atom.io/json\"\nimport { enumeration, packCanonical, unpackCanonical } from \"atom.io/json\"\n\nexport type ArrayMutations = Exclude<keyof Array<any>, keyof ReadonlyArray<any>>\nexport type ArrayUpdate<P extends primitive> =\n\t| {\n\t\t\ttype: `copyWithin`\n\t\t\ttarget: number\n\t\t\tstart: number\n\t\t\tend?: number\n\t\t\tprev: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `extend`\n\t\t\tnext: number\n\t\t\tprev: number\n\t }\n\t| {\n\t\t\ttype: `fill`\n\t\t\tvalue: P\n\t\t\tstart?: number\n\t\t\tend?: number\n\t\t\tprev: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `pop` | `shift`\n\t\t\tvalue?: P\n\t }\n\t| {\n\t\t\ttype: `push` | `unshift`\n\t\t\titems: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `reverse`\n\t }\n\t| {\n\t\t\ttype: `set`\n\t\t\tnext: P\n\t\t\tprev?: P\n\t\t\tindex: number\n\t }\n\t| {\n\t\t\ttype: `sort`\n\t\t\tnext: readonly P[]\n\t\t\tprev: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `splice`\n\t\t\tstart: number\n\t\t\tdeleteCount: number\n\t\t\titems: readonly P[]\n\t\t\tdeleted: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `truncate`\n\t\t\tlength: number\n\t\t\titems: readonly P[]\n\t }\nexport type OListUpdateType = ArrayUpdate<any>[`type`]\ntrue satisfies ArrayMutations extends OListUpdateType\n\t? true\n\t: Exclude<ArrayMutations, OListUpdateType>\n\nexport type PackedArrayUpdate<P extends primitive> = string & {\n\tupdate?: ArrayUpdate<P>\n\ttype?: P\n}\n\nconst ARRAY_UPDATES = [\n\t// virtual methods\n\t`set`,\n\t`truncate`,\n\t`extend`,\n\t// actual methods\n\t`pop`,\n\t`push`,\n\t`shift`,\n\t`unshift`,\n\t`copyWithin`,\n\t`fill`,\n\t`splice`,\n\t`reverse`,\n\t`sort`,\n] as const\ntrue satisfies ArrayUpdate<any>[`type`] extends (typeof ARRAY_UPDATES)[number]\n\t? true\n\t: Exclude<ArrayUpdate<any>[`type`], (typeof ARRAY_UPDATES)[number]>\n\nexport const ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES> =\n\tenumeration(ARRAY_UPDATES)\n\nexport type ArrayMutationHandler = {\n\t[K in Exclude<OListUpdateType, `extend` | `set` | `truncate`>]: Fn\n}\n\nexport type OListView<P extends primitive> = ReadonlyArray<P> & {\n\tsubscribe: (\n\t\tkey: string,\n\t\tfn: (update: PackedArrayUpdate<P>) => void,\n\t) => () => void\n}\n\nexport class OList<P extends primitive>\n\textends Array<P>\n\timplements\n\t\tTransceiver<OListView<P>, PackedArrayUpdate<P>, ReadonlyArray<P>>,\n\t\tArrayMutationHandler\n{\n\tpublic mode: TransceiverMode = `record`\n\tpublic readonly subject: Subject<PackedArrayUpdate<P>> = new Subject()\n\n\tpublic readonly READONLY_VIEW: OListView<P> = this\n\n\tpublic constructor(arrayLength?: number)\n\tpublic constructor(...items: P[])\n\tpublic constructor(...items: P[]) {\n\t\tsuper(...items)\n\t\t// biome-ignore lint/correctness/noConstructorReturn: this is chill\n\t\treturn new Proxy(this, {\n\t\t\tset: (target, prop, value, receiver) => {\n\t\t\t\tif (\n\t\t\t\t\ttypeof prop === `string` &&\n\t\t\t\t\t!Number.isNaN(Number.parseInt(prop, 10))\n\t\t\t\t) {\n\t\t\t\t\tconst index = Number(prop)\n\t\t\t\t\tlet prev: P | undefined\n\t\t\t\t\tif (this.mode === `record`) {\n\t\t\t\t\t\tprev = target[index]\n\t\t\t\t\t}\n\t\t\t\t\ttarget[index] = value\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tthis.emit({ type: `set`, index, next: value, prev })\n\t\t\t\t\t} else if (this.mode === `record`) {\n\t\t\t\t\t\tthis.emit({ type: `set`, index, next: value })\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tif (prop === `length`) {\n\t\t\t\t\tif (this.mode === `record`) {\n\t\t\t\t\t\tconst prevLength = target.length\n\t\t\t\t\t\tif (prevLength === value) return true\n\t\t\t\t\t\tif (prevLength > value) {\n\t\t\t\t\t\t\tconst dropped = target.slice(value)\n\t\t\t\t\t\t\ttarget.length = value\n\t\t\t\t\t\t\tthis.emit({ type: `truncate`, length: value, items: dropped })\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttarget.length = value\n\t\t\t\t\t\t\tthis.emit({ type: `extend`, next: value, prev: prevLength })\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.length = value\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn Reflect.set(target, prop, value, receiver)\n\t\t\t},\n\t\t})\n\t}\n\n\tpublic toJSON(): ReadonlyArray<P> {\n\t\treturn [...this]\n\t}\n\n\tpublic static fromJSON<P extends primitive>(json: ReadonlyArray<P>): OList<P> {\n\t\treturn new OList<P>(...json)\n\t}\n\n\tpublic push(...items: P[]): number {\n\t\tlet result: number\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tresult = super.push(...items)\n\t\t\tthis.mode = `record`\n\t\t\tthis.emit({ type: `push`, items })\n\t\t} else {\n\t\t\tresult = super.push(...items)\n\t\t}\n\t\treturn result\n\t}\n\tpublic pop(): P | undefined {\n\t\tlet value: P | undefined\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tvalue = super.pop()\n\t\t\tif (value === undefined) {\n\t\t\t\tthis.emit({ type: `pop` })\n\t\t\t} else {\n\t\t\t\tthis.emit({ type: `pop`, value })\n\t\t\t}\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tvalue = super.pop()\n\t\t}\n\t\treturn value\n\t}\n\tpublic shift(): P | undefined {\n\t\tlet value: P | undefined\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tvalue = super.shift()\n\t\t\tif (value === undefined) {\n\t\t\t\tthis.emit({ type: `shift` })\n\t\t\t} else {\n\t\t\t\tthis.emit({ type: `shift`, value })\n\t\t\t}\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tvalue = super.shift()\n\t\t}\n\t\treturn value\n\t}\n\tpublic unshift(...items: P[]): number {\n\t\tlet result: number\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tresult = super.unshift(...items)\n\t\t\tthis.emit({ type: `unshift`, items })\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tresult = super.unshift(...items)\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic reverse(): this {\n\t\tsuper.reverse()\n\t\tif (this.mode === `record`) {\n\t\t\tthis.emit({ type: `reverse` })\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic fill(value: P, start?: number, end?: number): this {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tconst prev = this.slice(start, end)\n\t\t\tsuper.fill(value, start, end)\n\t\t\tif (start === undefined) {\n\t\t\t\tthis.emit({ type: `fill`, value, prev })\n\t\t\t} else {\n\t\t\t\tif (end === undefined) {\n\t\t\t\t\tthis.emit({ type: `fill`, value, start, prev })\n\t\t\t\t} else {\n\t\t\t\t\tthis.emit({ type: `fill`, value, start, end, prev })\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tsuper.fill(value, start, end)\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic sort(compareFn?: (a: P, b: P) => number): this {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tconst prev = [...this]\n\t\t\tsuper.sort(compareFn)\n\t\t\tconst next = [...this]\n\t\t\tthis.emit({ type: `sort`, next, prev })\n\t\t\tthis.mode = `record`\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic splice(start: number, deleteCount?: number): P[]\n\tpublic splice(start: number, deleteCount: number, ...items: P[]): P[]\n\tpublic splice(\n\t\t...params: [start: number, deleteCount?: number, ...items: P[]]\n\t): P[] {\n\t\tconst [start, deleteCount, ...items] = params\n\t\tconst originalMode = this.mode\n\t\tif (originalMode === `record`) this.mode = `playback`\n\t\tconst deleted = super.splice(...(params as [number, number, ...P[]]))\n\t\tif (originalMode === `record`) this.mode = `record`\n\t\tif (deleteCount === undefined) {\n\t\t\tthis.emit({\n\t\t\t\ttype: `splice`,\n\t\t\t\tstart,\n\t\t\t\titems,\n\t\t\t\tdeleted,\n\t\t\t\tdeleteCount: deleted.length,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.emit({ type: `splice`, start, items, deleted, deleteCount })\n\t\t}\n\n\t\treturn deleted\n\t}\n\n\tpublic copyWithin(target: number, start: number, end?: number): this {\n\t\tconst originalMode = this.mode\n\t\tlet prev: P[] | undefined\n\t\tif (originalMode === `record`) {\n\t\t\tprev = this.slice(target)\n\t\t\tthis.mode = `playback`\n\t\t}\n\t\tsuper.copyWithin(target, start, end)\n\t\tif (originalMode === `record`) this.mode = `record`\n\t\tif (prev) {\n\t\t\tif (end === undefined) {\n\t\t\t\tthis.emit({ type: `copyWithin`, prev, target, start })\n\t\t\t} else {\n\t\t\t\tthis.emit({ type: `copyWithin`, prev, target, start, end })\n\t\t\t}\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic subscribe(\n\t\tkey: string,\n\t\tfn: (update: PackedArrayUpdate<P>) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, fn)\n\t}\n\n\tpublic emit(update: ArrayUpdate<P>): void {\n\t\tthis.subject.next(OList.packUpdate(update))\n\t}\n\n\tprivate doStep(update: ArrayUpdate<P>): void {\n\t\tconst type = update.type\n\t\tswitch (type) {\n\t\t\tcase `copyWithin`:\n\t\t\t\tthis.copyWithin(update.target, update.start, update.end)\n\t\t\t\tbreak\n\t\t\tcase `extend`:\n\t\t\t\tthis.length = update.next\n\t\t\t\tbreak\n\t\t\tcase `fill`:\n\t\t\t\tthis.fill(update.value, update.start, update.end)\n\t\t\t\tbreak\n\t\t\tcase `pop`:\n\t\t\t\tthis.pop()\n\t\t\t\tbreak\n\t\t\tcase `push`:\n\t\t\t\tthis.push(...update.items)\n\t\t\t\tbreak\n\t\t\tcase `reverse`:\n\t\t\t\tthis.reverse()\n\t\t\t\tbreak\n\t\t\tcase `shift`:\n\t\t\t\tthis.shift()\n\t\t\t\tbreak\n\t\t\tcase `sort`:\n\t\t\t\tfor (let i = 0; i < update.next.length; i++) {\n\t\t\t\t\tthis[i] = update.next[i]\n\t\t\t\t}\n\t\t\t\tthis.length = update.next.length\n\t\t\t\tbreak\n\t\t\tcase `splice`:\n\t\t\t\tthis.splice(update.start, update.deleteCount, ...update.items)\n\t\t\t\tbreak\n\t\t\tcase `truncate`:\n\t\t\t\tthis.length = update.length\n\t\t\t\tbreak\n\t\t\tcase `set`:\n\t\t\t\tthis[update.index] = update.next\n\t\t\t\tbreak\n\t\t\tcase `unshift`:\n\t\t\t\tthis.unshift(...update.items)\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tpublic do(update: PackedArrayUpdate<P>): null {\n\t\tthis.mode = `playback`\n\t\tconst unpacked = OList.unpackUpdate(update)\n\t\tthis.doStep(unpacked)\n\t\tthis.mode = `record`\n\t\treturn null\n\t}\n\n\tpublic undoStep(update: ArrayUpdate<P>): void {\n\t\tswitch (update.type) {\n\t\t\tcase `copyWithin`:\n\t\t\t\tfor (let i = 0; i < update.prev.length; i++) {\n\t\t\t\t\tthis[i + update.target] = update.prev[i]\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `extend`:\n\t\t\t\tthis.length = update.prev\n\t\t\t\tbreak\n\t\t\tcase `fill`:\n\t\t\t\t{\n\t\t\t\t\tconst start = update.start ?? 0\n\t\t\t\t\tfor (let i = 0; i < update.prev.length; i++) {\n\t\t\t\t\t\tthis[i + start] = update.prev[i]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `pop`:\n\t\t\t\tif (update.value) this.push(update.value)\n\t\t\t\tbreak\n\t\t\tcase `push`:\n\t\t\t\t{\n\t\t\t\t\tlet i = update.items.length - 1\n\t\t\t\t\twhile (i >= 0) {\n\t\t\t\t\t\tthis.pop()\n\t\t\t\t\t\t--i\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `reverse`:\n\t\t\t\tthis.reverse()\n\t\t\t\tbreak\n\t\t\tcase `shift`:\n\t\t\t\tif (update.value) this.unshift(update.value)\n\t\t\t\tbreak\n\t\t\tcase `sort`:\n\t\t\t\tfor (let i = 0; i < update.prev.length; i++) {\n\t\t\t\t\tthis[i] = update.prev[i]\n\t\t\t\t}\n\t\t\t\tthis.length = update.prev.length\n\t\t\t\tbreak\n\t\t\tcase `set`:\n\t\t\t\tif (update.prev) {\n\t\t\t\t\tthis[update.index] = update.prev\n\t\t\t\t} else {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\t\tdelete this[update.index]\n\t\t\t\t\tconst firstEmptyIndex = this.findIndex(\n\t\t\t\t\t\t(_, i) => !Object.hasOwn(this, i),\n\t\t\t\t\t)\n\t\t\t\t\tif (firstEmptyIndex !== -1) {\n\t\t\t\t\t\tthis.length = firstEmptyIndex\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `splice`:\n\t\t\t\tthis.splice(update.start, update.items.length, ...update.deleted)\n\t\t\t\tbreak\n\t\t\tcase `truncate`:\n\t\t\t\tthis.push(...update.items)\n\t\t\t\tbreak\n\t\t\tcase `unshift`:\n\t\t\t\t{\n\t\t\t\t\tlet i = update.items.length - 1\n\t\t\t\t\twhile (i >= 0) {\n\t\t\t\t\t\tthis.shift()\n\t\t\t\t\t\t--i\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tpublic undo(update: PackedArrayUpdate<P>): number | null {\n\t\tthis.mode = `playback`\n\t\tconst unpacked = OList.unpackUpdate(update)\n\t\tthis.undoStep(unpacked)\n\t\tthis.mode = `record`\n\t\treturn null\n\t}\n\n\tpublic static packUpdate<P extends primitive>(\n\t\tupdate: ArrayUpdate<P>,\n\t): PackedArrayUpdate<P> {\n\t\tlet packed = ARRAY_UPDATE_ENUM[update.type] + `\\u001F`\n\t\tswitch (update.type) {\n\t\t\tcase `set`:\n\t\t\t\tpacked += update.index + `\\u001E` + packCanonical(update.next)\n\t\t\t\tif (update.prev !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + packCanonical(update.prev)\n\t\t\t\t}\n\t\t\t\treturn packed\n\t\t\tcase `truncate`:\n\t\t\t\treturn (\n\t\t\t\t\tpacked +\n\t\t\t\t\tupdate.length +\n\t\t\t\t\t`\\u001E` +\n\t\t\t\t\tupdate.items.map(packCanonical).join(`\\u001E`)\n\t\t\t\t)\n\t\t\tcase `extend`:\n\t\t\t\treturn packed + update.next + `\\u001E` + update.prev\n\t\t\tcase `pop`:\n\t\t\tcase `shift`:\n\t\t\t\tif (update.value !== undefined) {\n\t\t\t\t\tpacked += packCanonical(update.value)\n\t\t\t\t}\n\t\t\t\treturn packed\n\t\t\tcase `push`:\n\t\t\tcase `unshift`:\n\t\t\t\treturn packed + update.items.map(packCanonical).join(`\\u001E`)\n\t\t\tcase `copyWithin`:\n\t\t\t\tpacked += update.target + `\\u001E` + update.start\n\t\t\t\tif (update.end !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + update.end\n\t\t\t\t}\n\t\t\t\tpacked += `\\u001E\\u001E` + update.prev.map(packCanonical).join(`\\u001E`)\n\t\t\t\treturn packed\n\t\t\tcase `fill`:\n\t\t\t\tpacked += packCanonical(update.value)\n\t\t\t\tif (update.start !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + update.start\n\t\t\t\t}\n\t\t\t\tif (update.end !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + update.end\n\t\t\t\t}\n\t\t\t\tpacked += `\\u001E\\u001E` + update.prev.map(packCanonical).join(`\\u001E`)\n\t\t\t\treturn packed\n\t\t\tcase `splice`:\n\t\t\t\treturn (\n\t\t\t\t\tpacked +\n\t\t\t\t\tupdate.start +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.deleteCount +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.items.map(packCanonical).join(`\\u001E`) +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.deleted.map(packCanonical).join(`\\u001E`)\n\t\t\t\t)\n\t\t\tcase `reverse`:\n\t\t\t\treturn packed\n\t\t\tcase `sort`:\n\t\t\t\treturn (\n\t\t\t\t\tpacked +\n\t\t\t\t\tupdate.next.map(packCanonical).join(`\\u001E`) +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.prev.map(packCanonical).join(`\\u001E`)\n\t\t\t\t)\n\t\t}\n\t}\n\n\tpublic static unpackUpdate<P extends primitive>(\n\t\tpacked: PackedArrayUpdate<P>,\n\t): ArrayUpdate<P> {\n\t\tconst [head, tail] = packed.split(`\\u001F`) as [\n\t\t\tExtract<keyof typeof ARRAY_UPDATE_ENUM, number>,\n\t\t\tpacked<P>,\n\t\t]\n\t\tconst type = ARRAY_UPDATE_ENUM[head]\n\t\tswitch (type) {\n\t\t\tcase `set`: {\n\t\t\t\tconst [i, n, p] = tail.split(`\\u001E`)\n\t\t\t\tconst index = +i\n\t\t\t\tconst next = unpackCanonical<P>(n)\n\t\t\t\tif (p === undefined) {\n\t\t\t\t\treturn { type, index, next }\n\t\t\t\t}\n\t\t\t\tconst prev = unpackCanonical<P>(p)\n\t\t\t\treturn { type, index, next, prev }\n\t\t\t}\n\t\t\tcase `truncate`: {\n\t\t\t\tconst [l, ...i] = tail.split(`\\u001E`)\n\t\t\t\tconst length = +l\n\t\t\t\tconst items = i.map<P>(unpackCanonical)\n\t\t\t\treturn { type, length, items }\n\t\t\t}\n\t\t\tcase `extend`: {\n\t\t\t\tconst [n, p] = tail.split(`\\u001E`)\n\t\t\t\tconst next = +n\n\t\t\t\tconst prev = +p\n\t\t\t\treturn { type, next, prev }\n\t\t\t}\n\t\t\tcase `pop`:\n\t\t\tcase `shift`:\n\t\t\t\tif (tail !== ``) {\n\t\t\t\t\tconst value = unpackCanonical(tail)\n\t\t\t\t\treturn { type, value }\n\t\t\t\t}\n\t\t\t\treturn { type }\n\t\t\tcase `push`:\n\t\t\tcase `unshift`: {\n\t\t\t\tconst items = tail.split(`\\u001E`).map<P>(unpackCanonical)\n\t\t\t\treturn { type, items }\n\t\t\t}\n\t\t\tcase `copyWithin`: {\n\t\t\t\tconst [numbers, data] = tail.split(`\\u001E\\u001E`)\n\t\t\t\tconst prev = data ? data.split(`\\u001E`).map<P>(unpackCanonical) : []\n\t\t\t\tconst [t, s, e] = numbers.split(`\\u001E`)\n\t\t\t\tconst target = +t\n\t\t\t\tconst start = +s\n\t\t\t\tif (e === undefined) {\n\t\t\t\t\treturn { type, target, start, prev }\n\t\t\t\t}\n\t\t\t\tconst end = +e\n\t\t\t\treturn { type, target, start, prev, end }\n\t\t\t}\n\t\t\tcase `fill`: {\n\t\t\t\tconst [numbers, data] = tail.split(`\\u001E\\u001E`)\n\t\t\t\tconst prev = data ? data.split(`\\u001E`).map<P>(unpackCanonical) : []\n\t\t\t\tconst [v, s, e] = numbers.split(`\\u001E`)\n\t\t\t\tconst value = unpackCanonical<P>(v)\n\t\t\t\tif (s === undefined && e === undefined) {\n\t\t\t\t\treturn { type, value, prev }\n\t\t\t\t}\n\t\t\t\tconst start = +s\n\t\t\t\tif (e === undefined) {\n\t\t\t\t\treturn { type, value, prev, start }\n\t\t\t\t}\n\t\t\t\tconst end = +e\n\t\t\t\treturn { type, value, prev, start, end }\n\t\t\t}\n\t\t\tcase `splice`: {\n\t\t\t\tconst [s, c, i, d] = tail.split(`\\u001E\\u001E`)\n\n\t\t\t\tconst start = +s\n\t\t\t\tconst deleteCount = +c\n\t\t\t\tconst items = i ? i.split(`\\u001E`).map<P>(unpackCanonical) : []\n\t\t\t\tconst deleted = d ? d.split(`\\u001E`).map<P>(unpackCanonical) : []\n\t\t\t\treturn { type, start, deleteCount, items, deleted }\n\t\t\t}\n\t\t\tcase `reverse`:\n\t\t\t\treturn { type }\n\t\t\tcase `sort`: {\n\t\t\t\tconst [n, p] = tail.split(`\\u001E\\u001E`)\n\t\t\t\tconst next = n ? n.split(`\\u001E`).map<P>(unpackCanonical) : []\n\t\t\t\tconst prev = p ? p.split(`\\u001E`).map<P>(unpackCanonical) : []\n\t\t\t\treturn { type, next, prev }\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { AtomEffect } from \"atom.io\"\nimport { getFromStore, getUpdateToken, subscribeInStore } from \"atom.io/internal\"\nimport { type primitive, stringifyJson } from \"atom.io/json\"\n\nimport { OList } from \"./o-list\"\n\nexport function filterOutInPlace<T>(arr: T[], toRemove: T): T[] {\n\tlet writeIndex = 0\n\n\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\tfor (let readIndex = 0; readIndex < arr.length; readIndex++) {\n\t\tif (toRemove !== arr[readIndex]) {\n\t\t\tarr[writeIndex] = arr[readIndex]\n\t\t\twriteIndex++\n\t\t}\n\t}\n\n\tarr.length = writeIndex\n\treturn arr\n}\n\nexport const oListDisposedKeyCleanupEffect: AtomEffect<OList<primitive>> = ({\n\ttoken,\n\tsetSelf,\n\tstore,\n}) => {\n\tconst disposalSubscriptions = new Map<primitive, () => void>()\n\tconst updateToken = getUpdateToken(token)\n\n\tconst addedValues = new Set<primitive>()\n\tconst removedValues = new Set<primitive>()\n\tfunction updateSubscriptions() {\n\t\tfor (const addedValue of addedValues) {\n\t\t\tconst molecule = store.molecules.get(stringifyJson(addedValue))\n\t\t\tif (molecule) {\n\t\t\t\tdisposalSubscriptions.set(\n\t\t\t\t\taddedValue,\n\t\t\t\t\tmolecule.subject.subscribe(token.key, () => {\n\t\t\t\t\t\tdisposalSubscriptions.get(addedValue)?.()\n\t\t\t\t\t\tdisposalSubscriptions.delete(addedValue)\n\t\t\t\t\t\tsetSelf((self) => {\n\t\t\t\t\t\t\tfilterOutInPlace(self, addedValue)\n\t\t\t\t\t\t\treturn self\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tstore.logger.warn(\n\t\t\t\t\t`❌`,\n\t\t\t\t\ttoken.type,\n\t\t\t\t\ttoken.key,\n\t\t\t\t\t`Added \"${addedValue}\" to ${token.key} but it has not been allocated.`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tfor (const removedValue of removedValues) {\n\t\t\tif (disposalSubscriptions.has(removedValue)) {\n\t\t\t\tdisposalSubscriptions.get(removedValue)?.()\n\t\t\t\tdisposalSubscriptions.delete(removedValue)\n\t\t\t}\n\t\t}\n\t}\n\tsubscribeInStore(\n\t\tstore,\n\t\tupdateToken,\n\t\tfunction manageAutoDeletionTriggers({ newValue }) {\n\t\t\tconst currentList = getFromStore(store, token)\n\t\t\tconst unpacked = OList.unpackUpdate(newValue)\n\t\t\tswitch (unpacked.type) {\n\t\t\t\tcase `extend`:\n\t\t\t\tcase `reverse`:\n\t\t\t\tcase `sort`:\n\t\t\t\t\tbreak // these don't change what values are present in the list\n\n\t\t\t\tcase `set`:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst { next } = unpacked\n\t\t\t\t\t\tif (`prev` in unpacked && !currentList.includes(unpacked.prev)) {\n\t\t\t\t\t\t\tremovedValues.add(unpacked.prev)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!disposalSubscriptions.has(next)) {\n\t\t\t\t\t\t\taddedValues.add(next)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `truncate`:\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (const item of unpacked.items) {\n\t\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\t\tremovedValues.add(item)\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\tbreak\n\t\t\t\tcase `shift`:\n\t\t\t\tcase `pop`:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst { value } = unpacked\n\t\t\t\t\t\tif (value !== undefined && !currentList.includes(value)) {\n\t\t\t\t\t\t\tremovedValues.add(value)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `push`:\n\t\t\t\tcase `unshift`:\n\t\t\t\t\tfor (const item of unpacked.items) {\n\t\t\t\t\t\tif (!disposalSubscriptions.has(item)) {\n\t\t\t\t\t\t\taddedValues.add(item)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `copyWithin`:\n\t\t\t\t\tfor (const item of unpacked.prev) {\n\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\tremovedValues.add(item)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `fill`:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst { value } = unpacked\n\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\tif (!disposalSubscriptions.has(value)) {\n\t\t\t\t\t\t\t\taddedValues.add(value)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const item of unpacked.prev) {\n\t\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\t\tremovedValues.add(item)\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\tbreak\n\t\t\t\tcase `splice`:\n\t\t\t\t\tfor (const item of unpacked.deleted) {\n\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\tremovedValues.add(item)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const addedItem of unpacked.items) {\n\t\t\t\t\t\tif (!disposalSubscriptions.has(addedItem)) {\n\t\t\t\t\t\t\taddedValues.add(addedItem)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t\tupdateSubscriptions()\n\t\t\taddedValues.clear()\n\t\t\tremovedValues.clear()\n\t\t},\n\t\t`set-auto-deletion-triggers`,\n\t)\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Fn, Subject, Transceiver, TransceiverMode } from "atom.io/internal";
|
|
2
2
|
import { AtomEffect } from "atom.io";
|
|
3
|
-
import { primitive } from "atom.io/json";
|
|
4
|
-
import { Enumeration } from "atom.io/struct";
|
|
3
|
+
import { Enumeration, primitive } from "atom.io/json";
|
|
5
4
|
|
|
6
5
|
//#region src/transceivers/u-list/u-list.d.ts
|
|
7
6
|
type SetMutations = Exclude<keyof Set<any>, symbol | keyof ReadonlySet<any>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["SET_UPDATE_ENUM: Enumeration<[`add`, `delete`, `clear`]>","uListDisposedKeyCleanupEffect: AtomEffect<UList<primitive>>"],"sources":["../../../src/transceivers/u-list/u-list.ts","../../../src/transceivers/u-list/u-list-disposed-key-cleanup-effect.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["SET_UPDATE_ENUM: Enumeration<[`add`, `delete`, `clear`]>","uListDisposedKeyCleanupEffect: AtomEffect<UList<primitive>>"],"sources":["../../../src/transceivers/u-list/u-list.ts","../../../src/transceivers/u-list/u-list-disposed-key-cleanup-effect.ts"],"sourcesContent":[],"mappings":";;;;;KAKY,YAAA,GAAe,cACpB,yBACS;KAEJ,oBAAoB;EAJhC,IAAY,EAAA,KAAA,GAAA,QAAA;EACL,KAAA,EAMG,CANH;CACS,GAAA;EAFW,IAAA,EAAA,OAAA;EAAA,MAAA,EAWhB,CAXgB,EAAA;AAI3B,CAAA;AAAgC,KASpB,eAAA,GAAkB,SATE,CAAA,GAAA,CAAA,CAAA,MAAA,CAAA;AAGtB,KAWE,eAXF,CAAA,UAW4B,SAX5B,CAAA,GAAA,MAAA,GAAA;EAIC,MAAA,CAAA,EAQD,SARC,CAQS,CART,CAAA;CAAA;AAEC,cASCA,eATiB,EASA,WATA,CAAA,CAAA,KAAA,EAAA,QAAA,EAAA,OAAA,CAAA,CAAA;AAKlB,KAOA,kBAAA,GAPA,QAO6B,eAP7B,GAO+C,EAP/C,EAAA;AAA0B,KAS1B,SAT0B,CAAA,UASN,SATM,CAAA,GASO,WATP,CASmB,CATnB,CAAA,GAAA;EAClB,SAAA,EAAA,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EAWL,eAXK,CAWW,CAXX,CAAA,EAAA,GAAA,IAAA,EAAA,GAAA,GAAA,GAAA,IAAA;CAAV;AAAA,cAeG,KAfH,CAAA,UAemB,SAfnB,CAAA,SAgBD,GAhBC,CAgBG,CAhBH,CAAA,YAkBR,WAlBQ,CAkBI,SAlBJ,CAkBc,CAlBd,CAAA,EAkBkB,eAlBlB,CAkBkC,CAlBlC,CAAA,EAkBsC,aAlBtC,CAkBoD,CAlBpD,CAAA,CAAA,EAmBR,kBAnBQ,CAAA;EAGV,IAAaA,EAkBC,eAlB8C;EAG5D,SAAY,OAAA,EAgBc,OAhBd,CAgBsB,eAhBO,CAgBS,CAhBT,CAAA,CAAA;EAEzC,WAAY,CAAA,MAAA,CAAA,EAgBiB,QAhBjB,CAgB0B,CAhB1B,CAAA;EAAoB,SAAA,aAAA,EAsBA,SAtBA,CAsBU,CAtBV,CAAA;EAAyB,MAAA,CAAA,CAAA,EAwBvC,aAxBuC,CAwBzB,CAxByB,CAAA;EAAZ,OAAA,QAAA,CAAA,UA4BX,SA5BW,CAAA,CAAA,IAAA,EA4BM,aA5BN,CA4BoB,CA5BpB,CAAA,CAAA,EA4ByB,KA5BzB,CA4B+B,CA5B/B,CAAA;EAGd,GAAA,CAAA,KAAA,EA6BZ,CA7BY,CAAA,EAAA,IAAA;EAAhB,KAAA,CAAA,CAAA,EAAA,IAAA;EAAA,MAAA,CAAA,KAAA,EA6CO,CA7CP,CAAA,EAAA,OAAA;EAIf,SAAa,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EAmDE,eAnDF,CAmDkB,CAnDlB,CAAA,EAAA,GAAA,IAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAAgB,IAAA,CAAA,MAAA,EAwDR,SAxDQ,CAwDE,CAxDF,CAAA,CAAA,EAAA,IAAA;EAChB,EAAA,CAAA,MAAA,EA2DM,eA3DN,CA2DsB,CA3DtB,CAAA,CAAA,EAAA,IAAA;EAEW,IAAA,CAAA,MAAA,EA0EH,eA1EG,CA0Ea,CA1Eb,CAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAV,OAAA,UAAA,CAAA,UA6FsB,SA7FtB,CAAA,CAAA,MAAA,EA8FJ,SA9FI,CA8FM,CA9FN,CAAA,CAAA,EA+FV,eA/FU,CA+FM,CA/FN,CAAA;EAA8B,OAAA,YAAA,CAAA,UAsGN,SAtGM,CAAA,CAAA,MAAA,EAuGlC,eAvGkC,CAuGlB,CAvGkB,CAAA,CAAA,EAwGxC,SAxGwC,CAwG9B,CAxG8B,CAAA;;;;cCpC/BC,+BAA+B,WAAW,MAAM"}
|