atom.io 0.46.10 → 0.46.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-CKcAJnC7.js → chunk-Dms8e946.js} +2 -2
- package/dist/eslint-plugin/index.js +2 -2
- package/dist/internal/index.js +60 -60
- package/dist/internal/index.js.map +1 -1
- package/dist/realtime-client/index.d.ts +4 -4
- package/dist/realtime-client/index.d.ts.map +1 -1
- package/dist/realtime-client/index.js +17 -15
- package/dist/realtime-client/index.js.map +1 -1
- package/dist/realtime-server/index.d.ts +1 -1
- package/dist/realtime-server/index.d.ts.map +1 -1
- package/dist/realtime-server/index.js +23 -11
- package/dist/realtime-server/index.js.map +1 -1
- package/package.json +3 -3
- package/src/realtime-client/realtime-client-stores/client-main-store.ts +30 -38
- package/src/realtime-server/ipc-sockets/parent-socket.ts +17 -4
- package/src/realtime-server/provide-rooms.ts +10 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fn, RootStore, Store, Transceiver } from "atom.io/internal";
|
|
2
2
|
import * as AtomIO from "atom.io";
|
|
3
|
-
import { AtomToken, WritableToken } from "atom.io";
|
|
3
|
+
import { AtomToken, ReadonlyPureSelectorToken, RegularAtomToken, WritableToken } from "atom.io";
|
|
4
4
|
import { Canonical, Json } from "atom.io/json";
|
|
5
5
|
import { ContinuityToken, RoomKey, Socket, SocketKey, UserKey } from "atom.io/realtime";
|
|
6
6
|
|
|
@@ -35,9 +35,9 @@ declare function pullSelectorFamilyMember<T, K extends Canonical>(store: Store,
|
|
|
35
35
|
declare function pushState<J extends Json.Serializable>(store: Store, socket: Socket, token: WritableToken<J>): () => void;
|
|
36
36
|
//#endregion
|
|
37
37
|
//#region src/realtime-client/realtime-client-stores/client-main-store.d.ts
|
|
38
|
-
declare const mySocketKeyAtom:
|
|
39
|
-
declare const myUserKeyAtom:
|
|
40
|
-
declare const myRoomKeySelector:
|
|
38
|
+
declare const mySocketKeyAtom: RegularAtomToken<SocketKey | undefined>;
|
|
39
|
+
declare const myUserKeyAtom: RegularAtomToken<UserKey | null>;
|
|
40
|
+
declare const myRoomKeySelector: ReadonlyPureSelectorToken<RoomKey | null>;
|
|
41
41
|
//#endregion
|
|
42
42
|
//#region src/realtime-client/realtime-client-stores/client-sync-store.d.ts
|
|
43
43
|
declare const optimisticUpdateQueueAtom: AtomIO.RegularAtomToken<AtomIO.TransactionOutcomeEvent<any>[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["mySocketKeyAtom:
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["mySocketKeyAtom: RegularAtomToken<SocketKey | undefined>","myUserKeyAtom: RegularAtomToken<UserKey | null>","myRoomKeySelector: ReadonlyPureSelectorToken<RoomKey | null>","optimisticUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","confirmedUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>"],"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.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":[],"mappings":";;;;;;;cAiBa,8CAEJ,0CAEC,oCACoB,MAAA,CAAO,wBAClC,MAAA,CAAO,iBAAiB,mCAEE,MAAA,CAAO,wBACjC,MAAA,CAAO,iBAAiB,uBAId,MAAA,CAAO,wBAAwB,MAAA,CAAO,iBAAiB,OACjE,IAAA,CAAK;;;iBC1BQ,eAAA,QAAuB,oBACnB,UAAU,IAAA,CAAK;;;iBCHnB,cAAA,QAAsB,mBACnB,IAAA,CAAK;;;iBCGR,mBAAmB,IAAA,CAAK,qBAChC,eACC,eACD,MAAA,CAAO,iBAAiB;;;iBCHhB,+BACL,IAAA,CAAK,wBACL,UJQX,CAAA,KAAa,EINL,KJMK,EAAA,MAAA,EILJ,MJKI,EAAA,MAAA,EIJJ,MAAA,CAAO,eJkBR,CIlBwB,CJkBxB,EIlB2B,CJkB3B,EAAA,GAAA,CAAA,EAAA,GAAA,EIjBF,OJiBE,CIjBM,CJiBN,CAAA,CAAA,EAAA,GAAA,GAAA,IAAA;;;iBKxBQ,0BAA0B,mCAClC,eACC,eACD,MAAA,CAAO,iBAAiB;;;iBCGhB,sCACL,sCACA,UNEX,CAAA,KAAa,EMAL,KNAK,EAAA,MAAA,EMCJ,MNDI,EAAA,MAAA,EMEJ,MAAA,CAAO,sBNYR,CMZ+B,CNY/B,EMZkC,CNYlC,CAAA,EAAA,GAAA,EMXF,ONWE,CMXM,CNWN,CAAA,CAAA,EAAA,GAAA,GAAA,IAAA;;;iBOzBQ,uBACR,eACC,eACD,MAAA,CAAO,cAAc;;;iBCDb,sCAAsC,URStD,CAAA,KAAa,EQRL,KRQK,EAAA,MAAA,EQPJ,MROI,EAAA,WAcL,EQpBM,MAAA,CAAO,mBRoBb,CQpBiC,CRoBjC,EQpBoC,CRoBpC,CAAA,EAAA,GAAA,EQnBF,ORmBE,CQnBM,CRmBN,CAAA,CAAA,EAAA,GAAA,GAAA,IAAA;;;iBStBQ,oBAAoB,IAAA,CAAK,qBACjC,eACC,eACD,cAAc;;;cCPTA,iBAAiB,iBAAiB;cAKlCC,eAAe,iBAAiB;cAchCC,mBAAmB,0BAA0B;;;cCtB7CC,2BAA2B,MAAA,CAAO,iBAC9C,MAAA,CAAO;cAMKC,0BAA0B,MAAA,CAAO,iBAC7C,MAAA,CAAO;;;iBCUQ,cAAA,QACR,mBACC,oBACI"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { Future, actUponStore, assignTransactionToContinuity, disposeAtom, findInStore, getEpochNumberOfContinuity, getFamilyOfToken, getFromStore, getJsonToken, getUpdateToken, ingestTransactionOutcomeEvent, setEpochNumberOfContinuity, setIntoStore, subscribeToState, subscribeToTransaction } from "atom.io/internal";
|
|
2
2
|
import * as AtomIO from "atom.io";
|
|
3
|
+
import { atom, getInternalRelations, selector } from "atom.io";
|
|
3
4
|
import { parseJson } from "atom.io/json";
|
|
4
5
|
import { employSocket, mutexAtoms, usersInRooms } from "atom.io/realtime";
|
|
5
6
|
|
|
6
7
|
//#region src/realtime-client/realtime-client-stores/client-main-store.ts
|
|
7
|
-
const mySocketKeyAtom =
|
|
8
|
+
const mySocketKeyAtom = atom({
|
|
8
9
|
key: `mySocketKey`,
|
|
9
10
|
default: void 0
|
|
10
11
|
});
|
|
11
|
-
const myUserKeyAtom =
|
|
12
|
+
const myUserKeyAtom = atom({
|
|
12
13
|
key: `myUserKey`,
|
|
13
14
|
default: null,
|
|
14
15
|
effects: [(userKey) => {
|
|
@@ -17,15 +18,16 @@ const myUserKeyAtom = AtomIO.atom({
|
|
|
17
18
|
});
|
|
18
19
|
}]
|
|
19
20
|
});
|
|
20
|
-
const myRoomKeySelector =
|
|
21
|
+
const myRoomKeySelector = selector({
|
|
21
22
|
key: `myRoomKey`,
|
|
22
23
|
get: ({ get }) => {
|
|
23
|
-
if (`
|
|
24
|
+
if (`process` in globalThis && `env` in process && `REALTIME_ROOM_KEY` in process.env) return process.env[`REALTIME_ROOM_KEY`];
|
|
24
25
|
const myUserKey = get(myUserKeyAtom);
|
|
25
26
|
if (!myUserKey) return null;
|
|
26
|
-
const [, usersInRoomsAtoms] =
|
|
27
|
+
const [, usersInRoomsAtoms] = getInternalRelations(usersInRooms, `split`);
|
|
27
28
|
const roomKeys = get(usersInRoomsAtoms, myUserKey);
|
|
28
29
|
for (const roomKey of roomKeys) return roomKey;
|
|
30
|
+
return null;
|
|
29
31
|
}
|
|
30
32
|
});
|
|
31
33
|
|
|
@@ -279,23 +281,23 @@ function pullSelectorRoots(store, socket, selectorToken) {
|
|
|
279
281
|
}
|
|
280
282
|
for (const atomKey of atomKeys) {
|
|
281
283
|
if (atomSubscriptions.has(atomKey)) continue;
|
|
282
|
-
const atom = store.atoms.get(atomKey);
|
|
283
|
-
switch (atom.type) {
|
|
284
|
+
const atom$1 = store.atoms.get(atomKey);
|
|
285
|
+
switch (atom$1.type) {
|
|
284
286
|
case `atom`:
|
|
285
|
-
if (atom.family) {
|
|
286
|
-
const { subKey: serializedSubKey } = atom.family;
|
|
287
|
+
if (atom$1.family) {
|
|
288
|
+
const { subKey: serializedSubKey } = atom$1.family;
|
|
287
289
|
const subKey = parseJson(serializedSubKey);
|
|
288
|
-
const family = getFamilyOfToken(store, atom);
|
|
290
|
+
const family = getFamilyOfToken(store, atom$1);
|
|
289
291
|
atomSubscriptions.set(atomKey, pullAtomFamilyMember(store, socket, family, subKey));
|
|
290
|
-
} else atomSubscriptions.set(atomKey, pullAtom(store, socket, atom));
|
|
292
|
+
} else atomSubscriptions.set(atomKey, pullAtom(store, socket, atom$1));
|
|
291
293
|
break;
|
|
292
294
|
case `mutable_atom`:
|
|
293
|
-
if (atom.family) {
|
|
294
|
-
const { subKey: serializedSubKey } = atom.family;
|
|
295
|
+
if (atom$1.family) {
|
|
296
|
+
const { subKey: serializedSubKey } = atom$1.family;
|
|
295
297
|
const subKey = parseJson(serializedSubKey);
|
|
296
|
-
const family = getFamilyOfToken(store, atom);
|
|
298
|
+
const family = getFamilyOfToken(store, atom$1);
|
|
297
299
|
atomSubscriptions.set(atomKey, pullMutableAtomFamilyMember(store, socket, family, subKey));
|
|
298
|
-
} else atomSubscriptions.set(atomKey, pullMutableAtom(store, socket, atom));
|
|
300
|
+
} else atomSubscriptions.set(atomKey, pullMutableAtom(store, socket, atom$1));
|
|
299
301
|
break;
|
|
300
302
|
}
|
|
301
303
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["mySocketKeyAtom: AtomIO.RegularAtomToken<SocketKey | undefined>","myUserKeyAtom: AtomIO.RegularAtomToken<UserKey | null>","myRoomKeySelector: AtomIO.ReadonlyPureSelectorToken<RoomKey | null>","optimisticUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","confirmedUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","continuityEpoch: number | undefined","k: any","v: any","subscriptions: WeakMap<Socket, Map<string, Future<void>>>","socketIds: WeakMap<Socket, string | undefined>","k: any","v: any"],"sources":["../../src/realtime-client/realtime-client-stores/client-main-store.ts","../../src/realtime-client/realtime-client-stores/client-sync-store.ts","../../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/create-subscriber.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/sync-continuity.ts"],"sourcesContent":["import * as AtomIO from \"atom.io\"\nimport {\n\ttype RoomKey,\n\ttype SocketKey,\n\ttype UserKey,\n\tusersInRooms,\n} from \"atom.io/realtime\"\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: [\n\t\t\t(userKey) => {\n\t\t\t\tif (typeof window !== `undefined`) {\n\t\t\t\t\tvoid import(`atom.io/web`).then(({ storageSync }) => {\n\t\t\t\t\t\tstorageSync(globalThis.localStorage, JSON, `myUserKey`)(userKey)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t],\n\t})\n\nexport const myRoomKeySelector: AtomIO.ReadonlyPureSelectorToken<RoomKey | null> =\n\tAtomIO.selector<RoomKey | null>({\n\t\tkey: `myRoomKey`,\n\t\tget: ({ get }) => {\n\t\t\tif (\n\t\t\t\t`env` in globalThis &&\n\t\t\t\t`REALTIME_ROOM_KEY` in (globalThis as any).env\n\t\t\t) {\n\t\t\t\t// if a room running server-side wants its own key, this is where it lives\n\t\t\t\treturn (globalThis as any).env[`REALTIME_ROOM_KEY`]\n\t\t\t}\n\t\t\tconst myUserKey = get(myUserKeyAtom)\n\t\t\tif (!myUserKey) return null\n\t\t\tconst [, usersInRoomsAtoms] = AtomIO.getInternalRelations(\n\t\t\t\tusersInRooms,\n\t\t\t\t`split`,\n\t\t\t)\n\t\t\tconst roomKeys = get(usersInRoomsAtoms, myUserKey)\n\t\t\tfor (const roomKey of roomKeys) {\n\t\t\t\treturn roomKey\n\t\t\t}\n\t\t},\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 * 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 { Json } from \"atom.io/json\"\nimport type { Socket } from \"atom.io/realtime\"\n\nimport {\n\tconfirmedUpdateQueueAtom,\n\toptimisticUpdateQueueAtom,\n} from \"../realtime-client-stores\"\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\t\tJson.Serializable,\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\"\nimport type { Json } from \"atom.io/json\"\n\nexport function useConcealState(store: Store) {\n\treturn (concealed: AtomToken<Json.Serializable>[]): 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 { Future } from \"atom.io/internal\"\nimport type { Socket } from \"atom.io/realtime\"\n\nconst subscriptions: WeakMap<Socket, Map<string, Future<void>>> = new WeakMap()\nconst socketIds: WeakMap<Socket, string | undefined> = new WeakMap()\n\nfunction getSubMap(socket: Socket): Map<string, Future<void>> {\n\tlet subMap = subscriptions.get(socket)\n\tif (subMap === undefined) {\n\t\tsubMap = new Map()\n\t\tsubscriptions.set(socket, subMap)\n\t}\n\treturn subMap\n}\n\nexport function createSubscriber<K extends string>(\n\tsocket: Socket,\n\tkey: K,\n\topen: (key: K) => () => void,\n): () => void {\n\tconst knownSocketId = socketIds.get(socket)\n\tif (knownSocketId !== socket.id) {\n\t\tsocketIds.set(socket, socket.id)\n\t\tsubscriptions.delete(socket)\n\t}\n\tconst unsubTimers = getSubMap(socket)\n\tlet timer = unsubTimers.get(key)\n\tif (timer) {\n\t\ttimer.use(new Promise<void>(() => {}))\n\t} else {\n\t\ttimer = new Future<void>(() => {})\n\t\tunsubTimers.set(key, timer)\n\t\tconst close = open(key)\n\t\tvoid timer.then(() => {\n\t\t\tclose()\n\t\t\tunsubTimers.delete(key)\n\t\t})\n\t}\n\treturn () => {\n\t\tconst timeout = new Promise<void>((resolve) => {\n\t\t\tsetTimeout(resolve, 25)\n\t\t})\n\t\ttimer.use(timeout)\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 { employSocket, type Socket } from \"atom.io/realtime\"\n\nimport { createSubscriber } from \"./create-subscriber\"\n\nexport function pullAtom<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J, any, any>,\n): () => void {\n\treturn createSubscriber(socket, token.key, (key) => {\n\t\tconst stopWatching = employSocket(socket, `serve:${key}`, (data: J) => {\n\t\t\tsetIntoStore(store, token, data)\n\t\t})\n\t\tsocket.emit(`sub:${token.key}`)\n\t\treturn () => {\n\t\t\tsocket.emit(`unsub:${key}`)\n\t\t\tstopWatching()\n\t\t}\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 { employSocket, type Socket } from \"atom.io/realtime\"\n\nimport { createSubscriber } from \"./create-subscriber\"\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\treturn createSubscriber(socket, token.key, () => {\n\t\tconst stopWatching = employSocket(\n\t\t\tsocket,\n\t\t\t`serve:${token.key}`,\n\t\t\t(data: J) => {\n\t\t\t\tsetIntoStore(store, token, data)\n\t\t\t},\n\t\t)\n\t\tsocket.emit(`sub:${family.key}`, key)\n\t\treturn () => {\n\t\t\tsocket.emit(`unsub:${token.key}`)\n\t\t\tstopWatching()\n\t\t}\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 { employSocket, type Socket } from \"atom.io/realtime\"\n\nimport { createSubscriber } from \"./create-subscriber\"\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\treturn createSubscriber(socket, token.key, () => {\n\t\tconst stopWatchingForInit = employSocket(\n\t\t\tsocket,\n\t\t\t`init:${token.key}`,\n\t\t\t(data: AsJSON<T>) => {\n\t\t\t\tsetIntoStore(store, jsonToken, data)\n\t\t\t},\n\t\t)\n\t\tconst stopWatchingForUpdate = employSocket(\n\t\t\tsocket,\n\t\t\t`next:${token.key}`,\n\t\t\t(data: SignalFrom<T>) => {\n\t\t\t\tsetIntoStore(store, updateToken, data)\n\t\t\t},\n\t\t)\n\t\tsocket.emit(`sub:${token.key}`)\n\t\treturn () => {\n\t\t\tsocket.emit(`unsub:${token.key}`)\n\t\t\tstopWatchingForInit()\n\t\t\tstopWatchingForUpdate()\n\t\t}\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 { employSocket, type Socket } from \"atom.io/realtime\"\n\nimport { createSubscriber } from \"./create-subscriber\"\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\tconst jsonToken = getJsonToken(store, token)\n\tconst trackerToken = getUpdateToken(token)\n\treturn createSubscriber(socket, token.key, () => {\n\t\tconst stopWatchingForInit = employSocket(\n\t\t\tsocket,\n\t\t\t`init:${token.key}`,\n\t\t\t(data: AsJSON<T>) => {\n\t\t\t\tsetIntoStore(store, jsonToken, data)\n\t\t\t},\n\t\t)\n\t\tconst stopWatchingForUpdate = employSocket(\n\t\t\tsocket,\n\t\t\t`next:${token.key}`,\n\t\t\t(data: SignalFrom<T>) => {\n\t\t\t\tsetIntoStore(store, trackerToken, data)\n\t\t\t},\n\t\t)\n\t\tsocket.emit(`sub:${family.key}`, key)\n\t\treturn () => {\n\t\t\tsocket.emit(`unsub:${token.key}`)\n\t\t\tstopWatchingForInit()\n\t\t\tstopWatchingForUpdate()\n\t\t}\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 \"atom.io/realtime\"\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\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\tfor (const [, unsub] of atomSubscriptions) unsub()\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 \"atom.io/realtime\"\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 \"atom.io/realtime\"\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 type { Socket } from \"atom.io/realtime\"\nimport { employSocket, mutexAtoms } from \"atom.io/realtime\"\n\nimport { createSubscriber } from \"./create-subscriber\"\n\nexport function pushState<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: WritableToken<J>,\n): () => void {\n\treturn createSubscriber(socket, `push:${token.key}`, () => {\n\t\tlet stopWatching = employSocket(\n\t\t\tsocket,\n\t\t\t`claim-result:${token.key}`,\n\t\t\t(success: boolean) => {\n\t\t\t\tif (!success) return\n\t\t\t\tstopWatching()\n\t\t\t\tsetIntoStore(store, mutexAtoms, token.key, true)\n\t\t\t\tstopWatching = subscribeToState(store, token, `push`, ({ newValue }) => {\n\t\t\t\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t\t\t\t})\n\t\t\t},\n\t\t)\n\n\t\tsocket.emit(`claim:${token.key}`)\n\n\t\treturn () => {\n\t\t\tsocket.emit(`unclaim:${token.key}`)\n\t\t\tstopWatching()\n\t\t}\n\t})\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, Socket } from \"atom.io/realtime\"\n\nimport { useRegisterAndAttemptConfirmedUpdate } from \"./continuity/register-and-attempt-confirmed-update\"\nimport { useConcealState } from \"./continuity/use-conceal-state\"\nimport { useRevealState } from \"./continuity/use-reveal-state\"\nimport {\n\tconfirmedUpdateQueueAtom,\n\toptimisticUpdateQueueAtom,\n} from \"./realtime-client-stores\"\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":["mySocketKeyAtom: RegularAtomToken<SocketKey | undefined>","myUserKeyAtom: RegularAtomToken<UserKey | null>","myRoomKeySelector: ReadonlyPureSelectorToken<RoomKey | null>","optimisticUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","confirmedUpdateQueueAtom: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","continuityEpoch: number | undefined","k: any","v: any","subscriptions: WeakMap<Socket, Map<string, Future<void>>>","socketIds: WeakMap<Socket, string | undefined>","atom","k: any","v: any"],"sources":["../../src/realtime-client/realtime-client-stores/client-main-store.ts","../../src/realtime-client/realtime-client-stores/client-sync-store.ts","../../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/create-subscriber.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/sync-continuity.ts"],"sourcesContent":["import type { ReadonlyPureSelectorToken, RegularAtomToken } from \"atom.io\"\nimport { atom, getInternalRelations, selector } from \"atom.io\"\nimport type { RoomKey, SocketKey, UserKey } from \"atom.io/realtime\"\nimport { usersInRooms } from \"atom.io/realtime\"\n\nexport const mySocketKeyAtom: RegularAtomToken<SocketKey | undefined> = atom({\n\tkey: `mySocketKey`,\n\tdefault: undefined,\n})\n\nexport const myUserKeyAtom: RegularAtomToken<UserKey | null> = atom({\n\tkey: `myUserKey`,\n\tdefault: null,\n\teffects: [\n\t\t(userKey) => {\n\t\t\tif (typeof window !== `undefined`) {\n\t\t\t\tvoid import(`atom.io/web`).then(({ storageSync }) => {\n\t\t\t\t\tstorageSync(globalThis.localStorage, JSON, `myUserKey`)(userKey)\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t],\n})\n\nexport const myRoomKeySelector: ReadonlyPureSelectorToken<RoomKey | null> =\n\tselector({\n\t\tkey: `myRoomKey`,\n\t\tget: ({ get }) => {\n\t\t\tif (\n\t\t\t\t`process` in globalThis &&\n\t\t\t\t`env` in process &&\n\t\t\t\t`REALTIME_ROOM_KEY` in process.env\n\t\t\t) {\n\t\t\t\t// if a room running server-side wants its own key, this is where it lives\n\t\t\t\treturn process.env[`REALTIME_ROOM_KEY`] as RoomKey\n\t\t\t}\n\t\t\tconst myUserKey = get(myUserKeyAtom)\n\t\t\tif (!myUserKey) return null\n\t\t\tconst [, usersInRoomsAtoms] = getInternalRelations(usersInRooms, `split`)\n\t\t\tconst roomKeys = get(usersInRoomsAtoms, myUserKey)\n\t\t\tfor (const roomKey of roomKeys) return roomKey\n\t\t\treturn null\n\t\t},\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 * 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 { Json } from \"atom.io/json\"\nimport type { Socket } from \"atom.io/realtime\"\n\nimport {\n\tconfirmedUpdateQueueAtom,\n\toptimisticUpdateQueueAtom,\n} from \"../realtime-client-stores\"\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\t\tJson.Serializable,\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\"\nimport type { Json } from \"atom.io/json\"\n\nexport function useConcealState(store: Store) {\n\treturn (concealed: AtomToken<Json.Serializable>[]): 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 { Future } from \"atom.io/internal\"\nimport type { Socket } from \"atom.io/realtime\"\n\nconst subscriptions: WeakMap<Socket, Map<string, Future<void>>> = new WeakMap()\nconst socketIds: WeakMap<Socket, string | undefined> = new WeakMap()\n\nfunction getSubMap(socket: Socket): Map<string, Future<void>> {\n\tlet subMap = subscriptions.get(socket)\n\tif (subMap === undefined) {\n\t\tsubMap = new Map()\n\t\tsubscriptions.set(socket, subMap)\n\t}\n\treturn subMap\n}\n\nexport function createSubscriber<K extends string>(\n\tsocket: Socket,\n\tkey: K,\n\topen: (key: K) => () => void,\n): () => void {\n\tconst knownSocketId = socketIds.get(socket)\n\tif (knownSocketId !== socket.id) {\n\t\tsocketIds.set(socket, socket.id)\n\t\tsubscriptions.delete(socket)\n\t}\n\tconst unsubTimers = getSubMap(socket)\n\tlet timer = unsubTimers.get(key)\n\tif (timer) {\n\t\ttimer.use(new Promise<void>(() => {}))\n\t} else {\n\t\ttimer = new Future<void>(() => {})\n\t\tunsubTimers.set(key, timer)\n\t\tconst close = open(key)\n\t\tvoid timer.then(() => {\n\t\t\tclose()\n\t\t\tunsubTimers.delete(key)\n\t\t})\n\t}\n\treturn () => {\n\t\tconst timeout = new Promise<void>((resolve) => {\n\t\t\tsetTimeout(resolve, 25)\n\t\t})\n\t\ttimer.use(timeout)\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 { employSocket, type Socket } from \"atom.io/realtime\"\n\nimport { createSubscriber } from \"./create-subscriber\"\n\nexport function pullAtom<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J, any, any>,\n): () => void {\n\treturn createSubscriber(socket, token.key, (key) => {\n\t\tconst stopWatching = employSocket(socket, `serve:${key}`, (data: J) => {\n\t\t\tsetIntoStore(store, token, data)\n\t\t})\n\t\tsocket.emit(`sub:${token.key}`)\n\t\treturn () => {\n\t\t\tsocket.emit(`unsub:${key}`)\n\t\t\tstopWatching()\n\t\t}\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 { employSocket, type Socket } from \"atom.io/realtime\"\n\nimport { createSubscriber } from \"./create-subscriber\"\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\treturn createSubscriber(socket, token.key, () => {\n\t\tconst stopWatching = employSocket(\n\t\t\tsocket,\n\t\t\t`serve:${token.key}`,\n\t\t\t(data: J) => {\n\t\t\t\tsetIntoStore(store, token, data)\n\t\t\t},\n\t\t)\n\t\tsocket.emit(`sub:${family.key}`, key)\n\t\treturn () => {\n\t\t\tsocket.emit(`unsub:${token.key}`)\n\t\t\tstopWatching()\n\t\t}\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 { employSocket, type Socket } from \"atom.io/realtime\"\n\nimport { createSubscriber } from \"./create-subscriber\"\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\treturn createSubscriber(socket, token.key, () => {\n\t\tconst stopWatchingForInit = employSocket(\n\t\t\tsocket,\n\t\t\t`init:${token.key}`,\n\t\t\t(data: AsJSON<T>) => {\n\t\t\t\tsetIntoStore(store, jsonToken, data)\n\t\t\t},\n\t\t)\n\t\tconst stopWatchingForUpdate = employSocket(\n\t\t\tsocket,\n\t\t\t`next:${token.key}`,\n\t\t\t(data: SignalFrom<T>) => {\n\t\t\t\tsetIntoStore(store, updateToken, data)\n\t\t\t},\n\t\t)\n\t\tsocket.emit(`sub:${token.key}`)\n\t\treturn () => {\n\t\t\tsocket.emit(`unsub:${token.key}`)\n\t\t\tstopWatchingForInit()\n\t\t\tstopWatchingForUpdate()\n\t\t}\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 { employSocket, type Socket } from \"atom.io/realtime\"\n\nimport { createSubscriber } from \"./create-subscriber\"\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\tconst jsonToken = getJsonToken(store, token)\n\tconst trackerToken = getUpdateToken(token)\n\treturn createSubscriber(socket, token.key, () => {\n\t\tconst stopWatchingForInit = employSocket(\n\t\t\tsocket,\n\t\t\t`init:${token.key}`,\n\t\t\t(data: AsJSON<T>) => {\n\t\t\t\tsetIntoStore(store, jsonToken, data)\n\t\t\t},\n\t\t)\n\t\tconst stopWatchingForUpdate = employSocket(\n\t\t\tsocket,\n\t\t\t`next:${token.key}`,\n\t\t\t(data: SignalFrom<T>) => {\n\t\t\t\tsetIntoStore(store, trackerToken, data)\n\t\t\t},\n\t\t)\n\t\tsocket.emit(`sub:${family.key}`, key)\n\t\treturn () => {\n\t\t\tsocket.emit(`unsub:${token.key}`)\n\t\t\tstopWatchingForInit()\n\t\t\tstopWatchingForUpdate()\n\t\t}\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 \"atom.io/realtime\"\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\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\tfor (const [, unsub] of atomSubscriptions) unsub()\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 \"atom.io/realtime\"\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 \"atom.io/realtime\"\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 type { Socket } from \"atom.io/realtime\"\nimport { employSocket, mutexAtoms } from \"atom.io/realtime\"\n\nimport { createSubscriber } from \"./create-subscriber\"\n\nexport function pushState<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: WritableToken<J>,\n): () => void {\n\treturn createSubscriber(socket, `push:${token.key}`, () => {\n\t\tlet stopWatching = employSocket(\n\t\t\tsocket,\n\t\t\t`claim-result:${token.key}`,\n\t\t\t(success: boolean) => {\n\t\t\t\tif (!success) return\n\t\t\t\tstopWatching()\n\t\t\t\tsetIntoStore(store, mutexAtoms, token.key, true)\n\t\t\t\tstopWatching = subscribeToState(store, token, `push`, ({ newValue }) => {\n\t\t\t\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t\t\t\t})\n\t\t\t},\n\t\t)\n\n\t\tsocket.emit(`claim:${token.key}`)\n\n\t\treturn () => {\n\t\t\tsocket.emit(`unclaim:${token.key}`)\n\t\t\tstopWatching()\n\t\t}\n\t})\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, Socket } from \"atom.io/realtime\"\n\nimport { useRegisterAndAttemptConfirmedUpdate } from \"./continuity/register-and-attempt-confirmed-update\"\nimport { useConcealState } from \"./continuity/use-conceal-state\"\nimport { useRevealState } from \"./continuity/use-reveal-state\"\nimport {\n\tconfirmedUpdateQueueAtom,\n\toptimisticUpdateQueueAtom,\n} from \"./realtime-client-stores\"\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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"}
|
|
@@ -65,7 +65,7 @@ declare class SubjectSocket<I extends Events, O extends Events> extends CustomSo
|
|
|
65
65
|
in: Subject<EventPayload<I>>;
|
|
66
66
|
out: Subject<EventPayload<O>>;
|
|
67
67
|
id: string;
|
|
68
|
-
|
|
68
|
+
disposalEffects: (() => void)[];
|
|
69
69
|
constructor(id: string);
|
|
70
70
|
dispose(): void;
|
|
71
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["ATOM_IO_REALTIME_SERVER_ROOMS: RoomMap","ROOMS: RoomMap","roomMeta: { count: number }","socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey>","socketKeysAtom: MutableAtomToken<UList<SocketKey>>","onlineUsersAtom: MutableAtomToken<UList<UserKey>>","usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n>"],"sources":["../../src/realtime-server/continuity/provide-continuity.ts","../../src/realtime-server/ipc-sockets/custom-socket.ts","../../src/realtime-server/ipc-sockets/child-socket.ts","../../src/realtime-server/ipc-sockets/parent-socket.ts","../../src/realtime-server/provide-rooms.ts","../../src/realtime-server/realtime-family-provider.ts","../../src/realtime-server/realtime-mutable-family-provider.ts","../../src/realtime-server/realtime-mutable-provider.ts","../../src/realtime-server/realtime-state-provider.ts","../../src/realtime-server/realtime-state-receiver.ts","../../src/realtime-server/server-config.ts","../../src/realtime-server/server-socket-state.ts"],"sourcesContent":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["ATOM_IO_REALTIME_SERVER_ROOMS: RoomMap","ROOMS: RoomMap","roomMeta: { count: number }","socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey>","socketKeysAtom: MutableAtomToken<UList<SocketKey>>","onlineUsersAtom: MutableAtomToken<UList<UserKey>>","usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n>"],"sources":["../../src/realtime-server/continuity/provide-continuity.ts","../../src/realtime-server/ipc-sockets/custom-socket.ts","../../src/realtime-server/ipc-sockets/child-socket.ts","../../src/realtime-server/ipc-sockets/parent-socket.ts","../../src/realtime-server/provide-rooms.ts","../../src/realtime-server/realtime-family-provider.ts","../../src/realtime-server/realtime-mutable-family-provider.ts","../../src/realtime-server/realtime-mutable-provider.ts","../../src/realtime-server/realtime-state-provider.ts","../../src/realtime-server/realtime-state-receiver.ts","../../src/realtime-server/server-config.ts","../../src/realtime-server/server-socket-state.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -53,9 +53,9 @@ function provideOutcomes(store, socket, continuity, userKey) {
|
|
|
53
53
|
for (const transaction of continuity.actions) {
|
|
54
54
|
const unsubscribeFromTransaction = subscribeToTransaction(store, transaction, `sync-continuity:${continuityKey}:${userKey}`, (outcomes) => {
|
|
55
55
|
try {
|
|
56
|
-
const redactedUpdates = redactTransactionUpdateContent(continuity.globals.map((atom) => {
|
|
57
|
-
if (atom.type === `atom`) return atom.key;
|
|
58
|
-
return getUpdateToken(atom).key;
|
|
56
|
+
const redactedUpdates = redactTransactionUpdateContent(continuity.globals.map((atom$1) => {
|
|
57
|
+
if (atom$1.type === `atom`) return atom$1.key;
|
|
58
|
+
return getUpdateToken(atom$1).key;
|
|
59
59
|
}).concat(continuity.perspectives.flatMap((perspective) => {
|
|
60
60
|
const { viewAtoms } = perspective;
|
|
61
61
|
return getFromStore(store, findInStore(store, viewAtoms, userKey)).map((token) => {
|
|
@@ -123,8 +123,8 @@ function provideStartupPayloads(store, socket, continuity, userKey) {
|
|
|
123
123
|
const continuityKey = continuity.key;
|
|
124
124
|
function sendInitialPayload() {
|
|
125
125
|
const initialPayload = [];
|
|
126
|
-
for (const atom of continuity.globals) {
|
|
127
|
-
const resourceToken = atom.type === `mutable_atom` ? getJsonToken(store, atom) : atom;
|
|
126
|
+
for (const atom$1 of continuity.globals) {
|
|
127
|
+
const resourceToken = atom$1.type === `mutable_atom` ? getJsonToken(store, atom$1) : atom$1;
|
|
128
128
|
const resource = getFromStore(store, resourceToken);
|
|
129
129
|
initialPayload.push(resourceToken, resource);
|
|
130
130
|
}
|
|
@@ -267,7 +267,7 @@ var SubjectSocket = class extends CustomSocket {
|
|
|
267
267
|
in;
|
|
268
268
|
out;
|
|
269
269
|
id = `no_id_retrieved`;
|
|
270
|
-
|
|
270
|
+
disposalEffects = [];
|
|
271
271
|
constructor(id) {
|
|
272
272
|
super((...args) => {
|
|
273
273
|
this.out.next(args);
|
|
@@ -281,7 +281,7 @@ var SubjectSocket = class extends CustomSocket {
|
|
|
281
281
|
});
|
|
282
282
|
}
|
|
283
283
|
dispose() {
|
|
284
|
-
for (const dispose of this.
|
|
284
|
+
for (const dispose of this.disposalEffects) dispose();
|
|
285
285
|
}
|
|
286
286
|
};
|
|
287
287
|
var ParentSocket = class extends CustomSocket {
|
|
@@ -365,16 +365,28 @@ var ParentSocket = class extends CustomSocket {
|
|
|
365
365
|
if (this.proc.pid) this.id = this.proc.pid?.toString();
|
|
366
366
|
this.on(`user-joins`, (userKey) => {
|
|
367
367
|
this.logger.info(`👤`, userKey, `joined`);
|
|
368
|
-
|
|
368
|
+
const existingRelay = this.relays.get(userKey);
|
|
369
|
+
if (existingRelay) {
|
|
370
|
+
this.logger.info(`🔗`, `reattaching relay services for`, userKey);
|
|
371
|
+
const cleanupRelay$1 = this.initRelay(existingRelay, userKey);
|
|
372
|
+
if (cleanupRelay$1) existingRelay.disposalEffects.push(cleanupRelay$1);
|
|
373
|
+
this.on(userKey, (...data) => {
|
|
374
|
+
relay.in.next(data);
|
|
375
|
+
});
|
|
376
|
+
existingRelay.disposalEffects.push(existingRelay.out.subscribe(`socket`, (data) => {
|
|
377
|
+
this.emit(userKey, ...data);
|
|
378
|
+
}));
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
369
381
|
const relay = new SubjectSocket(userKey);
|
|
370
382
|
this.relays.set(userKey, relay);
|
|
371
383
|
this.logger.info(`🔗`, `attaching relay services for`, userKey);
|
|
372
384
|
const cleanupRelay = this.initRelay(relay, userKey);
|
|
373
|
-
if (cleanupRelay) relay.
|
|
385
|
+
if (cleanupRelay) relay.disposalEffects.push(cleanupRelay);
|
|
374
386
|
this.on(userKey, (...data) => {
|
|
375
387
|
relay.in.next(data);
|
|
376
388
|
});
|
|
377
|
-
relay.
|
|
389
|
+
relay.disposalEffects.push(relay.out.subscribe(`socket`, (data) => {
|
|
378
390
|
this.emit(userKey, ...data);
|
|
379
391
|
}));
|
|
380
392
|
});
|
|
@@ -734,7 +746,7 @@ function provideEnterAndExit({ store, socket, roomSocket, userKey }) {
|
|
|
734
746
|
roomSocket.off(`leaveRoom`, exitRoom);
|
|
735
747
|
roomSocket.on(`joinRoom`, enterRoom);
|
|
736
748
|
};
|
|
737
|
-
editRelationsInStore(store, usersInRooms, (relations) => {
|
|
749
|
+
if (!getFromStore(store, getInternalRelationsFromStore(store, usersInRooms), roomKey).has(userKey)) editRelationsInStore(store, usersInRooms, (relations) => {
|
|
738
750
|
relations.set({
|
|
739
751
|
room: roomKey,
|
|
740
752
|
user: userKey
|