atom.io 0.46.9 → 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.
@@ -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: AtomIO.RegularAtomToken<SocketKey | undefined>;
39
- declare const myUserKeyAtom: AtomIO.RegularAtomToken<UserKey | null>;
40
- declare const myRoomKeySelector: AtomIO.ReadonlyPureSelectorToken<RoomKey | null>;
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: 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>"],"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;;;cCJTA,iBAAiB,MAAA,CAAO,iBAAiB;cAMzCC,eAAe,MAAA,CAAO,iBAAiB;cAevCC,mBAAmB,MAAA,CAAO,0BAA0B;;;cC3BpDC,2BAA2B,MAAA,CAAO,iBAC9C,MAAA,CAAO;cAMKC,0BAA0B,MAAA,CAAO,iBAC7C,MAAA,CAAO;;;iBCUQ,cAAA,QACR,mBACC,oBACI"}
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 = AtomIO.atom({
8
+ const mySocketKeyAtom = atom({
8
9
  key: `mySocketKey`,
9
10
  default: void 0
10
11
  });
11
- const myUserKeyAtom = AtomIO.atom({
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 = AtomIO.selector({
21
+ const myRoomKeySelector = selector({
21
22
  key: `myRoomKey`,
22
23
  get: ({ get }) => {
23
- if (`env` in globalThis && `REALTIME_ROOM_KEY` in globalThis.env) return globalThis.env[`REALTIME_ROOM_KEY`];
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] = AtomIO.getInternalRelations(usersInRooms, `split`);
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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"}
@@ -45,13 +45,13 @@ declare function usePush<J extends Json.Serializable>(token: AtomIO.WritableToke
45
45
  //#endregion
46
46
  //#region src/realtime-react/use-realtime-rooms.d.ts
47
47
  type RealtimeRoomsTools = {
48
- socket: Socket$1<{}, RoomSocketInterface<string>>;
48
+ roomSocket: Socket$1<{}, RoomSocketInterface<string>>;
49
49
  myRoomKey: RoomKey | undefined;
50
50
  myMutualsAtom: MutableAtomToken<UList<UserKey>>;
51
51
  myOwnedRoomsAtom: MutableAtomToken<UList<RoomKey>>;
52
52
  allRoomKeysAtom: MutableAtomToken<UList<RoomKey>>;
53
53
  };
54
- declare function useRealtimeRooms<RoomNames extends string>(userKey: UserKey): RealtimeRoomsTools;
54
+ declare function useRealtimeRooms<RoomNames extends string>(): RealtimeRoomsTools;
55
55
  //#endregion
56
56
  //#region src/realtime-react/use-realtime-service.d.ts
57
57
  declare function useRealtimeService(key: string, create: (socket: Socket$1) => () => void): void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","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-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-realtime-service.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;KAKY,sBAAA;;;;KAKA,kBAAA;UACH;YACE,YAAY;;AAPX,cAUCA,eAVD,EAUkB,KAAA,CAAM,OAVxB,CAUgC,kBAVhC,CAAA;AAKA,cAWCC,gBAXD,EAWmB,KAAA,CAAM,EAXzB,CAAA;EACH,QAAA,EAWE,KAAA,CAAM,SAXR;EACc,MAAA,EAWd,QAXc,GAAA,IAAA;CAAZ,CAAA;;;iBCJK,sBAAsB,IAAA,CAAK,qBACnC,MAAA,CAAO,iBAAiB,KAC7B,MAAA,CAAO,OAAO;;;iBCDD,kCACL,IAAA,CAAK,wBACL,mBAEF,MAAA,CAAO,uBAAuB,GAAG,YACjC,QAAQ,KACd,MAAA,CAAO,OAAO;;;iBCPD,yBAAyB,mCACjC,MAAA,CAAO,iBAAiB,KAC7B;;;iBCAa,yCACL,sCACA,wBACI,MAAA,CAAO,uBAAuB,GAAG,SAAS,QAAQ,KAAK;;;iBCLtD,0BAA0B,IAAA,CAAK,qBACvC,MAAA,CAAO,cAAc,KAC1B,MAAA,CAAO,OAAO;;;iBCDD,yCAAyC,wBAC3C,MAAA,CAAO,oBAAoB,GAAG,SACtC,QAAQ,KACX,MAAA,CAAO,OAAO;;;iBCHD,kBAAkB,IAAA,CAAK,qBAC/B,MAAA,CAAO,cAAc,mBACZ,SAAS,aAAa,MAAM;;;KCEjC,kBAAA;UACH,aAAW;aACR;iBACI,iBAAiB,MAAM;oBACpB,iBAAiB,MAAM;mBACxB,iBAAiB,MAAM;ARbzC,CAAA;AAKY,iBQUI,gBRVJ,CAAA,kBAAA,MAAA,CAAA,CAAA,OAAA,EQWF,ORXE,CAAA,EQYT,kBRZS;;;iBSJI,kBAAA,+BAEE;;;iBCDF,iBAAA,QAAyB"}
1
+ {"version":3,"file":"index.d.ts","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-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-realtime-service.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;KAKY,sBAAA;;;;KAKA,kBAAA;UACH;YACE,YAAY;;AAPX,cAUCA,eAVD,EAUkB,KAAA,CAAM,OAVxB,CAUgC,kBAVhC,CAAA;AAKA,cAWCC,gBAXD,EAWmB,KAAA,CAAM,EAXzB,CAAA;EACH,QAAA,EAWE,KAAA,CAAM,SAXR;EACc,MAAA,EAWd,QAXc,GAAA,IAAA;CAAZ,CAAA;;;iBCJK,sBAAsB,IAAA,CAAK,qBACnC,MAAA,CAAO,iBAAiB,KAC7B,MAAA,CAAO,OAAO;;;iBCDD,kCACL,IAAA,CAAK,wBACL,mBAEF,MAAA,CAAO,uBAAuB,GAAG,YACjC,QAAQ,KACd,MAAA,CAAO,OAAO;;;iBCPD,yBAAyB,mCACjC,MAAA,CAAO,iBAAiB,KAC7B;;;iBCAa,yCACL,sCACA,wBACI,MAAA,CAAO,uBAAuB,GAAG,SAAS,QAAQ,KAAK;;;iBCLtD,0BAA0B,IAAA,CAAK,qBACvC,MAAA,CAAO,cAAc,KAC1B,MAAA,CAAO,OAAO;;;iBCDD,yCAAyC,wBAC3C,MAAA,CAAO,oBAAoB,GAAG,SACtC,QAAQ,KACX,MAAA,CAAO,OAAO;;;iBCHD,kBAAkB,IAAA,CAAK,qBAC/B,MAAA,CAAO,cAAc,mBACZ,SAAS,aAAa,MAAM;;;KCIjC,kBAAA;cACC,aAAW;aACZ;iBACI,iBAAiB,MAAM;oBACpB,iBAAiB,MAAM;mBACxB,iBAAiB,MAAM;ARfzC,CAAA;AAKY,iBQYI,gBRZJ,CAAA,kBAAA,MAAA,CAAA,CAAA,CAAA,EQcP,kBRdO;;;iBSJI,kBAAA,+BAEE;;;iBCDF,iBAAA,QAAyB"}
@@ -5,7 +5,7 @@ import { StoreContext, useI, useO, useSingleEffect } from "atom.io/react";
5
5
  import * as RT from "atom.io/realtime";
6
6
  import { ownersOfRooms, roomKeysAtom, usersInRooms } from "atom.io/realtime";
7
7
  import * as RTC from "atom.io/realtime-client";
8
- import { syncContinuity } from "atom.io/realtime-client";
8
+ import { myUserKeyAtom, syncContinuity } from "atom.io/realtime-client";
9
9
 
10
10
  //#region src/realtime-react/realtime-context.tsx
11
11
  const RealtimeContext = React.createContext({
@@ -90,7 +90,6 @@ function usePullMutableAtomFamilyMember(familyToken, key) {
90
90
  const store = React.useContext(StoreContext);
91
91
  const token = findInStore(store, familyToken, key);
92
92
  useRealtimeService(`pull:${token.key}`, (socket) => {
93
- if (familyToken.key === `usersInRooms/relatedKeys`) {}
94
93
  return RTC.pullMutableAtomFamilyMember(store, socket, familyToken, key);
95
94
  });
96
95
  return useO(token);
@@ -125,10 +124,11 @@ function usePush(token) {
125
124
 
126
125
  //#endregion
127
126
  //#region src/realtime-react/use-realtime-rooms.ts
128
- function useRealtimeRooms(userKey) {
127
+ function useRealtimeRooms() {
129
128
  const store = React.useContext(StoreContext);
130
129
  const { socket } = React.useContext(RealtimeContext);
131
130
  usePullMutable(roomKeysAtom);
131
+ const userKey = usePullAtom(myUserKeyAtom) ?? `user::$_NONE_$`;
132
132
  const [userKeysFamily, roomKeysFamily] = getInternalRelationsFromStore(store, usersInRooms, `split`);
133
133
  usePullMutableAtomFamilyMember(roomKeysFamily, userKey);
134
134
  const myJoinedRoomKeys = useO(roomKeysFamily, userKey);
@@ -140,11 +140,12 @@ function useRealtimeRooms(userKey) {
140
140
  const roomKey = myRoomKey ?? `room::$_NONE_$`;
141
141
  const myMutualsAtom = findInStore(store, userKeysFamily, roomKey);
142
142
  usePullMutableAtomFamilyMember(userKeysFamily, roomKey);
143
- const [ownedRoomsFamily] = getInternalRelationsFromStore(store, ownersOfRooms, `split`);
143
+ const [ownedRoomsFamily, roomOwnersFamily] = getInternalRelationsFromStore(store, ownersOfRooms, `split`);
144
144
  const myOwnedRoomsAtom = findInStore(store, ownedRoomsFamily, userKey);
145
145
  usePullMutableAtomFamilyMember(ownedRoomsFamily, userKey);
146
+ usePullMutableAtomFamilyMember(roomOwnersFamily, roomKey);
146
147
  return {
147
- socket,
148
+ roomSocket: socket,
148
149
  myRoomKey,
149
150
  allRoomKeysAtom: roomKeysAtom,
150
151
  myMutualsAtom,
@@ -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}>","myRoomKey: RoomKey | undefined","roomKey"],"sources":["../../src/realtime-react/realtime-context.tsx","../../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","import { useSingleEffect } from \"atom.io/react\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { RealtimeContext } from \"./realtime-context\"\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\tif (familyToken.key === `usersInRooms/relatedKeys`) {\n\t\t}\n\t\treturn RTC.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 { MutableAtomToken } from \"atom.io\"\nimport { findInStore, getInternalRelationsFromStore } from \"atom.io/internal\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport type { RoomKey, RoomSocketInterface, UserKey } from \"atom.io/realtime\"\nimport { ownersOfRooms, roomKeysAtom, usersInRooms } from \"atom.io/realtime\"\nimport type { UList } from \"atom.io/transceivers/u-list\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { RealtimeContext } from \"./realtime-context\"\nimport { usePullMutable } from \"./use-pull-mutable-atom\"\nimport { usePullMutableAtomFamilyMember } from \"./use-pull-mutable-family-member\"\n\nexport type RealtimeRoomsTools = {\n\tsocket: Socket<{}, RoomSocketInterface<string>>\n\tmyRoomKey: RoomKey | undefined\n\tmyMutualsAtom: MutableAtomToken<UList<UserKey>>\n\tmyOwnedRoomsAtom: MutableAtomToken<UList<RoomKey>>\n\tallRoomKeysAtom: MutableAtomToken<UList<RoomKey>>\n}\nexport function useRealtimeRooms<RoomNames extends string>(\n\tuserKey: UserKey,\n): RealtimeRoomsTools {\n\tconst store = React.useContext(StoreContext)\n\tconst { socket } = React.useContext(RealtimeContext)\n\tusePullMutable(roomKeysAtom)\n\n\tconst [userKeysFamily, roomKeysFamily] = getInternalRelationsFromStore(\n\t\tstore,\n\t\tusersInRooms,\n\t\t`split`,\n\t)\n\n\tusePullMutableAtomFamilyMember(roomKeysFamily, userKey)\n\tconst myJoinedRoomKeys = useO(roomKeysFamily, userKey)\n\tlet myRoomKey: RoomKey | undefined\n\tfor (const roomKey of myJoinedRoomKeys) {\n\t\tmyRoomKey = roomKey\n\t\tbreak\n\t}\n\n\tconst roomKey = myRoomKey ?? `room::$_NONE_$`\n\tconst myMutualsAtom = findInStore(store, userKeysFamily, roomKey)\n\tusePullMutableAtomFamilyMember(userKeysFamily, roomKey)\n\n\tconst [ownedRoomsFamily] = getInternalRelationsFromStore(\n\t\tstore,\n\t\townersOfRooms,\n\t\t`split`,\n\t)\n\tconst myOwnedRoomsAtom = findInStore(store, ownedRoomsFamily, userKey)\n\tusePullMutableAtomFamilyMember(ownedRoomsFamily, userKey)\n\n\treturn {\n\t\tsocket: socket as Socket<{}, RoomSocketInterface<RoomNames>>,\n\t\tmyRoomKey,\n\t\tallRoomKeysAtom: roomKeysAtom,\n\t\tmyMutualsAtom,\n\t\tmyOwnedRoomsAtom,\n\t}\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}>","myRoomKey: RoomKey | undefined","roomKey"],"sources":["../../src/realtime-react/realtime-context.tsx","../../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","import { useSingleEffect } from \"atom.io/react\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { RealtimeContext } from \"./realtime-context\"\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\treturn RTC.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 { MutableAtomToken } from \"atom.io\"\nimport { findInStore, getInternalRelationsFromStore } from \"atom.io/internal\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport type { RoomKey, RoomSocketInterface, UserKey } from \"atom.io/realtime\"\nimport { ownersOfRooms, roomKeysAtom, usersInRooms } from \"atom.io/realtime\"\nimport { myUserKeyAtom } from \"atom.io/realtime-client\"\nimport type { UList } from \"atom.io/transceivers/u-list\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { RealtimeContext } from \"./realtime-context\"\nimport { usePullAtom } from \"./use-pull-atom\"\nimport { usePullMutable } from \"./use-pull-mutable-atom\"\nimport { usePullMutableAtomFamilyMember } from \"./use-pull-mutable-family-member\"\n\nexport type RealtimeRoomsTools = {\n\troomSocket: Socket<{}, RoomSocketInterface<string>>\n\tmyRoomKey: RoomKey | undefined\n\tmyMutualsAtom: MutableAtomToken<UList<UserKey>>\n\tmyOwnedRoomsAtom: MutableAtomToken<UList<RoomKey>>\n\tallRoomKeysAtom: MutableAtomToken<UList<RoomKey>>\n}\nexport function useRealtimeRooms<\n\tRoomNames extends string,\n>(): RealtimeRoomsTools {\n\tconst store = React.useContext(StoreContext)\n\tconst { socket } = React.useContext(RealtimeContext)\n\tusePullMutable(roomKeysAtom)\n\tconst userKey = usePullAtom(myUserKeyAtom) ?? `user::$_NONE_$`\n\n\tconst [userKeysFamily, roomKeysFamily] = getInternalRelationsFromStore(\n\t\tstore,\n\t\tusersInRooms,\n\t\t`split`,\n\t)\n\tusePullMutableAtomFamilyMember(roomKeysFamily, userKey)\n\n\tconst myJoinedRoomKeys = useO(roomKeysFamily, userKey)\n\tlet myRoomKey: RoomKey | undefined\n\tfor (const roomKey of myJoinedRoomKeys) {\n\t\tmyRoomKey = roomKey\n\t\tbreak\n\t}\n\tconst roomKey = myRoomKey ?? `room::$_NONE_$`\n\tconst myMutualsAtom = findInStore(store, userKeysFamily, roomKey)\n\tusePullMutableAtomFamilyMember(userKeysFamily, roomKey)\n\n\tconst [ownedRoomsFamily, roomOwnersFamily] = getInternalRelationsFromStore(\n\t\tstore,\n\t\townersOfRooms,\n\t\t`split`,\n\t)\n\tconst myOwnedRoomsAtom = findInStore(store, ownedRoomsFamily, userKey)\n\tusePullMutableAtomFamilyMember(ownedRoomsFamily, userKey)\n\tusePullMutableAtomFamilyMember(roomOwnersFamily, roomKey)\n\n\treturn {\n\t\troomSocket: socket as Socket<{}, RoomSocketInterface<RoomNames>>,\n\t\tmyRoomKey,\n\t\tallRoomKeysAtom: roomKeysAtom,\n\t\tmyMutualsAtom,\n\t\tmyOwnedRoomsAtom,\n\t}\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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"}
@@ -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
- disposalFunctions: (() => void)[];
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":";;;;;;;;;;;;;KAYY,iBAAA,gBACC,0BACH;iBAEM,0BAAA;;;GAGb,eAAe;;;KChBN,MAAA,GAAS,IAAA,CAAK,eAAe,IAAA,CAAK;KAElC,kCACU,iCACI,8BAA8B,4BACxC,aAAa;UAEZ,sBACN,iCACe,mBAAmB,WACnC;cACG,YAAY,aAAa,GAAG;;ADF7B,uBCKU,YDJT,CAGb,UCC6C,MDD7B,EACf,UCA8D,MDA9D,CACA,YCAW,MDAX,CAAA;EACE,UAAA,SAAA,ECCmB,GDDnB,CAAA,MCC6B,CDD7B,ECCgC,GDDhC,CAAA,CAAA,GAAA,IAAA,ECC8C,IAAA,CAAK,KDDnD,EAAA,GAAA,IAAA,CAAA,CAAA;EAAe,UAAA,eAAA,ECEU,GDFV,CAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,IAAA,ECEuC,IAAA,CAAK,KDF5C,EAAA,GAAA,IAAA,CAAA;EAAA,UAAA,uBAAA,ECGkB,GDHlB,CAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,IAAA,ECIS,IAAA,CAAK,KDJd,EAAA,GAAA,IAAA,CAAA;iDCM8B,YACrC,aAAa,GAAG;;sCAeiB,UACnC,gBACE,EAAE,WACP,aAAa,GAAG;EAzCtB,WAAY,CAAA,IAAA,EAAA,CAAA,cAAkC,MA4CjB,CA5CiB,CAAA,CAAA,KAAzB,EA6CX,KA7CgB,EAAA,GAAA,IAAA,EA8Cd,CA9Cc,CA8CZ,KA9CY,CAAA,EAAA,GA+CnB,YA/CmB,CA+CN,CA/CM,EA+CH,CA/CG,CAAA;EAE1B,EAAA,CAAY,cAAA,MA0DmB,CA1DnB,CAAA,CAAA,KAAA,EA2DH,KA3DG,EAAA,QAAA,EAAA,CAAA,GAAA,IAAA,EA4DU,CA5DV,CA4DY,KA5DZ,CAAA,EAAA,GAAA,IAAA,CAAA,EAAA,IAAA;EACU,KAAA,CAAA,QAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,IAAA,EAsE2B,IAAA,CAAK,KAtEhC,EAAA,GAAA,IAAA,CAAA,EAAA,IAAA;EACI,aAAA,CAAA,QAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,IAAA,EA2EW,IAAA,CAAK,KA3EhB,EAAA,GAAA,IAAA,CAAA,EAAA,IAAA;EAA8B,GAAA,CAAA,cAAA,MAiFxB,CAjFwB,CAAA,CAAA,KAAA,EAkF/C,KAlF+C,EAAA,QAAA,CAAA,EAAA,CAAA,GAAA,IAAA,EAmFjC,CAnFiC,CAmF/B,KAnF+B,CAAA,EAAA,GAAA,IAAA,CAAA,EAAA,IAAA;EACxC,MAAA,CAAA,QAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,IAAA,EA+FkC,IAAA,CAAK,KA/FvC,EAAA,GAAA,IAAA,CAAA,EAAA,IAAA;;;;KCGJ,YAAA;;SAEJ;UACC;UACA;;KAGG,SAAA,wBAAiC,IAAA,CAAK;cAErC,sBACF,QFTX,UEUW,MFVC,EAIZ,UEOW,YFPK,GEOU,YFPV,CACf,SEOS,YFPT,CEOsB,CFPtB,EEOyB,CFPzB,CAAA,CAAA;EACA,UAAA,cAAA,EAAA,MAAA;EACE,UAAA,iBAAA,EAAA,MAAA,EAAA;EAAe,UAAA,aAAA,EAAA,MAAA;EAAA,UAAA,eAAA,EAAA,MAAA,EAAA;;QEaJ;;ED7Bd,MAAY,EC+BI,ID/BJ,CC+BS,OD/BT,EAAA,OAA6B,GAAK,MAAA,GAAA,MAAzB,CAAA;EAErB,UAAY,SAAA,CAAA,GAAA,EC+Bc,SD/Bd,CAAA,EAAA,IAAA;EACU,WAAA,CAAA,IAAA,ECgDd,CDhDc,EAAA,GAAA,EAAA,MAAA,EAAA,MAAA,CAAA,ECkDX,IDlDW,CCkDN,ODlDM,EAAA,OAAA,GAAA,MAAA,GAAA,MAAA,CAAA;;;;cEMT,oBAAA;cAEA,wBACF,kBACA,gBACD,aAAa,GAAG;MACd,QAAQ,aAAa;EHNjC,GAAY,EGOC,OHPD,CGOS,YHPT,CGOsB,CHPtB,CAAA,CAAA;EAIZ,EAAA,EAAgB,MAAA;EACf,iBAAA,EAAA,CAAA,GAAA,GAAA,IAAA,CAAA,EAAA;EACA,WAAA,CAAA,EAAA,EAAA,MAAA;EACE,OAAA,CAAA,CAAA,EAAA,IAAA;;AAAe,KGwBN,aAAA,GHxBM;;SG0BV;UACC;EF3CT,MAAY,EE4CH,QF5CG;EAEZ,IAAY,EAAA,CAAA,IAAA,CAAA,EAAA,MAAA,EAAA,GAAA,IAAA;CACU;AACI,cE4Cb,YF5Ca,CAA8B,UE6C7C,MF7C6C,GAAA;EACxC,CAAA,IAAA,EE6CP,OF7CO,CAAA,EAAA,CAAA,MAAA,EAAA,GE6Ce,IAAA,CAAK,KF7CpB,EAAA,CAAA;AAAa,CAAA,EAAA,UE+ClB,MF/CkB,GAAA,SAAA,MAAA,IAAA,SEgDD,EFhDC,EAAA,GAAA,CAAA,MAAA,EAAA,GEgDkB,IAAA,CAAK,KFhDvB,EAAA,CAAA,EAAA,GAAA;EAE7B,YAAiB,EAAA,CAAA,GAAA,EEiDK,OFjDL,CAAA;EACN,aAAA,EAAA,CAAA,GAAA,EEiDY,OFjDZ,CAAA;AACe,CAAA,EAAmB,UEmDlC,aFnDkC,GEmDlB,aFnDkB,CAEP,SEkD5B,YFlD4B,CEkDf,CFlDe,EEkDZ,CFlDY,CAAA,CAAA;EAAG,UAAA,cAAA,EAAA,MAAA;EAAhB,UAAA,iBAAA,EAAA,MAAA,EAAA;EAAZ,UAAA,MAAA,EEqDM,GFrDN,CEqDU,OFrDV,EEqDmB,aFrDnB,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA;EADH,UAAA,SAAA,EAAA,CAAA,MAAA,EEwDA,aFxDA,CAAA,GAAA,EAAA,GAAA,CAAA,EAAA,OAAA,EEyDC,OFzDD,EAAA,GAAA,CAAA,GAAA,GAAA,IAAA,CAAA,GAAA,IAAA;EAAA,IAAA,EE2DI,CF3DJ;EAIV,EAAA,EAAsB,MAAA;EAAuB,UAAA,GAAA,CAAA,GAAA,IAAA,EE2DrB,SF3DqB,CAAA,EAAA,IAAA;EAAkB,MAAA,EAAA;IAG/B,IAAA,EAAA,CAAA,GAAA,IAAA,EEkEd,IAAA,CAAK,KFlES,EAAA,GAAA,IAAA;IAAiB,IAAK,EAAA,CAAA,GAAA,IAAA,EEqEpC,IAAA,CAAK,KFrE+B,EAAA,GAAA,IAAA;IAAnB,KAAA,EAAA,CAAA,GAAA,IAAA,EEwEhB,IAAA,CAAK,KFxEW,EAAA,GAAA,IAAA;EAAb,CAAA;EACmC,WAAK,CAAA,IAAA,EE4EpC,CF5EoC;EAAlC,YAAA,CAAA,cAAA,EAAA,CAAA,MAAA,EEiMjB,aFjMiB,CAAA,GAAA,EAAA,GAAA,CAAA,EAAA,OAAA,EEkMhB,OFlMgB,EAAA,GAAA,CAAA,GAAA,GAAA,IAAA,CAAA,GAAA,IAAA,CAAA,EAAA,IAAA;;;;KGkBhB,OAAA,GAAU,YAErB,sBAAsB;;qCAIa;;cAEvBC,OAAO;cAIPC;;;KAED;EJzCZ,KAAY,EI0CJ,SJ1CI;EAIZ,MAAgB,EIuCP,MJvCO;EACf,OAAA,EIuCS,OJvCT;EACA,iBAAA,EAAA,CAAA,QAAA,EIuC8B,SJvC9B,EAAA,GAAA,CAAA,MAAA,EAAA,MAAA,EAAA,CAAA;CACE;AAAe,iBIwCF,SJxCE,CAAA,kBAAA,MAAA,CAAA,CAAA;EAAA,KAAA;EAAA,MAAA;EAAA,OAAA;EAAA;AAAA,CAAA,EI6Cf,eJ7Ce,CI6CC,SJ7CD,CAAA,CAAA,EAAA,CAAA,QAAA,EI8CP,SJ9CO,EAAA,GI+Cb,OJ/Ca,CI+CL,WJ/CK,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA;AAAA,KI6GN,yBAAA,GJ7GM;SI8GV;UACC;cACI,YAAY;EHhIzB,OAAY,EGiIF,OHjIE;AAEZ,CAAA;AACsB,iBGgIN,mBAAA,CHhIM;EAAA,KAAA;EAAA,MAAA;EAAA,UAAA;EAAA;AAAA,CAAA,EGqInB,yBHrImB,CAAA,EAAA,CAAA,OAAA,EGqImB,OHrInB,EAAA,GAAA,IAAA;AACI,KGgNd,iBAAA,GHhNc;EAA8B,KAAA,EGiNhD,SHjNgD;EACxC,MAAA,EGiNP,MHjNO;EAAa,OAAA,EGkNnB,OHlNmB;CAAA;AAEZ,iBGkND,WAAA,CHlNC;EAAA,KAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EGsNd,iBHtNc,CAAA,EAAA,CAAA,OAAA,EGsNgB,OHtNhB,EAAA,GAAA,IAAA;AACN,KG4PC,kBH5PD,CAAA,kBAAA,MAAA,CAAA,GAAA;EACe,iBAAA,EAAA,CAAA,IAAA,EG4PC,SH5PD,EAAA,GAAA,CAAA,MAAA,EAAA,MAAA,EAAA,CAAA;EAAmB,SAAA,EG6PjC,SH7PiC,EAAA;EAEP,aAAA,CAAA,EAAA,MAAA;EAAG,OAAA,EG6P/B,OH7P+B;EAAhB,KAAA,EG8PjB,SH9PiB;EAAZ,MAAA,EG+PJ,MH/PI;CADH;AAAA,iBGkQM,YHlQN,CAAA,kBAAA,MAAA,CAAA,CAAA;EAAA,KAAA;EAAA,MAAA;EAAA,iBAAA;EAAA,SAAA;EAAA;AAAA,CAAA,EGwQP,kBHxQO,CGwQY,SHxQZ,CAAA,CAAA,EAAA,GAAA,GAAA,IAAA;;;KIAE,cAAA,GAAiB,kBAAkB;iBAC/B,0BAAA;;;;GAIb,0BAES,IAAA,CAAK,wBACL,mBAEF,MAAA,CAAO,uBAAuB,GAAG,WAClC,MAAA,CAAO,cAAc,SAAS,QAAQ,OAAO,SAAS,QAAQ;;;KCI3D,qBAAA,GAAwB,kBAC5B;iBAEQ,6BAAA;;;;GAIb,0BAES,sCACA,mBAEF,MAAA,CAAO,uBAAuB,GAAG,WAClC,MAAA,CAAO,cAAc,SAAS,QAAQ,OAAO,SAAS,QAAQ;;;KC3B3D,eAAA,GAAkB,kBAAkB;iBAChC,uBAAA;;;;GAIb,6BAEY,iBAAiB,IAAA,CAAK,cAAc,IAAA,CAAK,sBAC9C,MAAA,CAAO,iBAAiB;;;KCNtB,aAAA,GAAgB,kBAAkB;iBAC9B,qBAAA;;;;GAIb,0BAEsC,IAAA,CAAK,wBAAwB,gBACvD,MAAA,CAAO,cAAc,iBAE/B,MAAA,CAAO,cAAc,KACrB;;;KCXO,aAAA,GAAgB,kBAAkB;iBAC9B,qBAAA;;;;GAIb,0BACsC,IAAA,CAAK,wBAAwB,WAC5D,0BAA0B,iBACrB,cAAc,kBACd,cAAc;;;KCEjB,YAAA;UACH;YACE,UAAU;UACZ;;KAEG,gBAAA;UACH;EVrBT,QAAY,EUsBD,OVtBC;EAIZ,KAAgB,CAAA,EUmBP,SVnBO;CACf;;AAEE,KUoBS,SAAA,GVpBT;EAAe;EAAA,OAAA,EUsBR,mBVtBQ;;;;EChBlB,OAAY,EAAA,MAAA;EAEZ;EACsB,OAAA,EAAA,OAAA;EACI;EAA8B,MAAA,EAAA,OAAA;EACxC;EAAa,MAAA,EAAA,MAAA;EAAA;EAE7B,GAAiB,EAAA,MAAA;EACN;EACe,KAAA,ES2ClB,cT3CkB;EAAmB;EAEP,IAAA,EAAA;IAAG,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,GAAA;EAAhB,CAAA;CAAZ;AADH,iBSiDM,QAAA,CTjDN,MAAA,ESkDD,MTlDC,EAAA,IAAA,EAAA,CAAA,SAAA,ESmDS,STnDT,EAAA,GSmDuB,QTnDvB,CSmDgC,KTnDhC,GSmDwC,OTnDxC,CAAA,EAAA,SAAA,EAAA,CAAA,MAAA,ESoDW,gBTpDX,EAAA,GSoDgC,QTpDhC,CAAA,GAAA,GSoD+C,QTpD/C,CAAA,IAAA,CAAA,CAAA,EAAA,KAAA,CAAA,ESqDF,STrDE,CAAA,EAAA,GAAA,GSsDD,OTtDC,CAAA,IAAA,CAAA;;;KUFE,qBAAA,GAAwB;;UAIzB,SAAS,WAAW;;cAKlBC,aAAa,uBAAuB,eAAe;cAMnDC,gBAAgB,iBAAiB,MAAM;cAIvCC,iBAAiB,iBAAiB,MAAM;cAIxCC,gBAAgB,kBAE5B,mBAEA"}
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
- disposalFunctions = [];
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.disposalFunctions) dispose();
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
- if (this.relays.get(userKey)) return;
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.disposalFunctions.push(cleanupRelay);
385
+ if (cleanupRelay) relay.disposalEffects.push(cleanupRelay);
374
386
  this.on(userKey, (...data) => {
375
387
  relay.in.next(data);
376
388
  });
377
- relay.disposalFunctions.push(relay.out.subscribe(`socket`, (data) => {
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