atom.io 0.33.5 → 0.33.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data/index.d.ts +2 -4
- package/dist/data/index.d.ts.map +1 -1
- package/dist/eslint-plugin/index.d.ts +0 -1
- package/dist/eslint-plugin/index.d.ts.map +1 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +2 -2
- package/dist/internal/index.js.map +1 -1
- package/dist/introspection/index.js +1 -1
- package/dist/introspection/index.js.map +1 -1
- package/dist/json/index.d.ts +1 -2
- package/dist/json/index.d.ts.map +1 -1
- package/dist/main/index.d.ts.map +1 -1
- package/dist/main/index.js +4 -6
- package/dist/main/index.js.map +1 -1
- package/dist/react/index.js +7 -11
- package/dist/react/index.js.map +1 -1
- package/dist/react-devtools/index.css +9 -7
- package/dist/react-devtools/index.css.map +1 -1
- package/dist/react-devtools/index.d.ts +1 -1
- package/dist/react-devtools/index.d.ts.map +1 -1
- package/dist/react-devtools/index.js +2 -2
- package/dist/react-devtools/index.js.map +1 -1
- package/dist/realtime/index.d.ts.map +1 -1
- package/dist/realtime/index.js.map +1 -1
- package/dist/realtime-client/index.d.ts +13 -24
- package/dist/realtime-client/index.d.ts.map +1 -1
- package/dist/realtime-client/index.js +4 -6
- package/dist/realtime-client/index.js.map +1 -1
- package/dist/realtime-react/index.d.ts +7 -14
- package/dist/realtime-react/index.d.ts.map +1 -1
- package/dist/realtime-react/index.js +23 -42
- package/dist/realtime-react/index.js.map +1 -1
- package/dist/realtime-server/index.d.ts +11 -16
- package/dist/realtime-server/index.d.ts.map +1 -1
- package/dist/realtime-server/index.js +1 -1
- package/dist/realtime-server/index.js.map +1 -1
- package/dist/realtime-testing/index.js +1 -1
- package/dist/realtime-testing/index.js.map +1 -1
- package/package.json +25 -16
- package/src/internal/families/dispose-from-store.ts +1 -1
- package/src/internal/mutable/create-mutable-atom.ts +2 -6
- package/src/internal/set-state/set-into-store.ts +1 -1
- package/src/internal/timeline/time-travel.ts +0 -2
- package/src/introspection/attach-type-selectors.ts +1 -1
- package/src/main/index.ts +2 -8
- package/src/react-devtools/StateEditor.tsx +1 -5
- package/src/react-devtools/Updates.tsx +3 -5
- package/src/react-devtools/devtools.css +9 -7
- package/src/react-devtools/elastic-input/NumberInput.tsx +1 -1
- package/src/react-devtools/error-boundary/ReactErrorBoundary.tsx +1 -1
- package/src/react-devtools/json-editor/developer-interface.tsx +1 -1
- package/src/react-devtools/json-editor/editors-by-type/utilities/cast-json.ts +1 -1
- package/src/realtime/shared-room-store.ts +0 -3
- package/src/realtime-react/use-pull-selector.ts +0 -1
- package/src/realtime-react/use-single-effect.ts +2 -0
- package/src/realtime-server/continuity/prepare-to-sync-realtime-continuity.ts +1 -1
- package/src/realtime-server/continuity/subscribe-to-continuity-actions.ts +0 -2
- package/src/realtime-server/ipc-sockets/parent-socket.ts +1 -1
|
@@ -1,17 +1,6 @@
|
|
|
1
|
-
import * as Internal$1 from "atom.io/internal";
|
|
2
1
|
import * as Internal from "atom.io/internal";
|
|
3
2
|
import { Func, Store, Transceiver } from "atom.io/internal";
|
|
4
3
|
import { Json } from "atom.io/json";
|
|
5
|
-
import * as AtomIO$10 from "atom.io";
|
|
6
|
-
import * as AtomIO$9 from "atom.io";
|
|
7
|
-
import * as AtomIO$8 from "atom.io";
|
|
8
|
-
import * as AtomIO$7 from "atom.io";
|
|
9
|
-
import * as AtomIO$6 from "atom.io";
|
|
10
|
-
import * as AtomIO$5 from "atom.io";
|
|
11
|
-
import * as AtomIO$4 from "atom.io";
|
|
12
|
-
import * as AtomIO$3 from "atom.io";
|
|
13
|
-
import * as AtomIO$2 from "atom.io";
|
|
14
|
-
import * as AtomIO$1 from "atom.io";
|
|
15
4
|
import * as AtomIO from "atom.io";
|
|
16
5
|
import { AtomToken } from "atom.io";
|
|
17
6
|
import { ContinuityToken } from "atom.io/realtime";
|
|
@@ -19,7 +8,7 @@ import { Socket } from "atom.io/realtime-server";
|
|
|
19
8
|
import { Socket as Socket$1 } from "socket.io-client";
|
|
20
9
|
|
|
21
10
|
//#region src/realtime-client/continuity/register-and-attempt-confirmed-update.d.ts
|
|
22
|
-
declare const useRegisterAndAttemptConfirmedUpdate: (store: Store, continuityKey: string, socket: Socket, optimisticUpdates: AtomIO
|
|
11
|
+
declare const useRegisterAndAttemptConfirmedUpdate: (store: Store, continuityKey: string, socket: Socket, optimisticUpdates: AtomIO.TransactionUpdate<any>[], confirmedUpdates: AtomIO.TransactionUpdate<any>[]) => (confirmed: AtomIO.TransactionUpdate<Func>) => void;
|
|
23
12
|
//#endregion
|
|
24
13
|
//#region src/realtime-client/continuity/use-conceal-state.d.ts
|
|
25
14
|
declare function useConcealState(store: Store): (concealed: AtomToken<unknown>[]) => void;
|
|
@@ -28,37 +17,37 @@ declare function useConcealState(store: Store): (concealed: AtomToken<unknown>[]
|
|
|
28
17
|
declare function useRevealState(store: Store): (revealed: Json.Array) => void;
|
|
29
18
|
//#endregion
|
|
30
19
|
//#region src/realtime-client/pull-atom.d.ts
|
|
31
|
-
declare function pullAtom<J extends Json.Serializable>(store: Store, socket: Socket$1, token: AtomIO
|
|
20
|
+
declare function pullAtom<J extends Json.Serializable>(store: Store, socket: Socket$1, token: AtomIO.RegularAtomToken<J>): () => void;
|
|
32
21
|
//#endregion
|
|
33
22
|
//#region src/realtime-client/pull-atom-family-member.d.ts
|
|
34
23
|
/* eslint-disable no-console */
|
|
35
|
-
declare function pullAtomFamilyMember<J extends Json.Serializable>(store: Store, socket: Socket$1, token: AtomIO
|
|
24
|
+
declare function pullAtomFamilyMember<J extends Json.Serializable>(store: Store, socket: Socket$1, token: AtomIO.RegularAtomToken<J>): () => void;
|
|
36
25
|
//#endregion
|
|
37
26
|
//#region src/realtime-client/pull-mutable-atom.d.ts
|
|
38
|
-
declare function pullMutableAtom<T extends Transceiver<any>, J extends Json.Serializable>(store: Store, socket: Socket$1, token: AtomIO
|
|
27
|
+
declare function pullMutableAtom<T extends Transceiver<any>, J extends Json.Serializable>(store: Store, socket: Socket$1, token: AtomIO.MutableAtomToken<T, J>): () => void;
|
|
39
28
|
//#endregion
|
|
40
29
|
//#region src/realtime-client/pull-mutable-atom-family-member.d.ts
|
|
41
30
|
/* eslint-disable no-console */
|
|
42
|
-
declare function pullMutableAtomFamilyMember<T extends Transceiver<any>, J extends Json.Serializable>(store: Store, socket: Socket$1, token: AtomIO
|
|
31
|
+
declare function pullMutableAtomFamilyMember<T extends Transceiver<any>, J extends Json.Serializable>(store: Store, socket: Socket$1, token: AtomIO.MutableAtomToken<T, J>): () => void;
|
|
43
32
|
//#endregion
|
|
44
33
|
//#region src/realtime-client/pull-selector.d.ts
|
|
45
|
-
declare function pullSelector<T>(store: Store, socket: Socket$1, token: AtomIO
|
|
34
|
+
declare function pullSelector<T>(store: Store, socket: Socket$1, token: AtomIO.SelectorToken<T>): () => void;
|
|
46
35
|
//#endregion
|
|
47
36
|
//#region src/realtime-client/pull-selector-family-member.d.ts
|
|
48
37
|
/* eslint-disable no-console */
|
|
49
|
-
declare function pullSelectorFamilyMember<T>(store: Store, socket: Socket$1, token: AtomIO
|
|
38
|
+
declare function pullSelectorFamilyMember<T>(store: Store, socket: Socket$1, token: AtomIO.SelectorToken<T>): () => void;
|
|
50
39
|
//#endregion
|
|
51
40
|
//#region src/realtime-client/push-state.d.ts
|
|
52
|
-
declare function pushState<J extends Json.Serializable>(store: Internal
|
|
41
|
+
declare function pushState<J extends Json.Serializable>(store: Internal.Store, socket: Socket$1, token: AtomIO.WritableToken<J>): () => void;
|
|
53
42
|
//#endregion
|
|
54
43
|
//#region src/realtime-client/realtime-client-stores/client-main-store.d.ts
|
|
55
|
-
declare const myIdState__INTERNAL: AtomIO
|
|
56
|
-
declare const myIdState: AtomIO
|
|
57
|
-
declare const myUsernameState: AtomIO
|
|
44
|
+
declare const myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined>;
|
|
45
|
+
declare const myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined>;
|
|
46
|
+
declare const myUsernameState: AtomIO.RegularAtomToken<string | null>;
|
|
58
47
|
//#endregion
|
|
59
48
|
//#region src/realtime-client/realtime-client-stores/client-sync-store.d.ts
|
|
60
|
-
declare const optimisticUpdateQueue: AtomIO
|
|
61
|
-
declare const confirmedUpdateQueue: AtomIO
|
|
49
|
+
declare const optimisticUpdateQueue: AtomIO.RegularAtomToken<AtomIO.TransactionUpdate<any>[]>;
|
|
50
|
+
declare const confirmedUpdateQueue: AtomIO.RegularAtomToken<AtomIO.TransactionUpdate<any>[]>;
|
|
62
51
|
//#endregion
|
|
63
52
|
//#region src/realtime-client/server-action.d.ts
|
|
64
53
|
declare function serverAction<F extends Internal.Func>(store: Internal.Store, socket: Socket$1, token: AtomIO.TransactionToken<F>): () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["store: Store","continuityKey: string","socket: Socket","optimisticUpdates: AtomIO.TransactionUpdate<any>[]","confirmedUpdates: AtomIO.TransactionUpdate<any>[]","confirmed: AtomIO.TransactionUpdate<Func>","store: Store","concealed: AtomToken<unknown>[]","store: Store","revealed: Json.Array","store: Store","socket: Socket","token: AtomIO.RegularAtomToken<J>","store: Store","socket: Socket","token: AtomIO.RegularAtomToken<J>","store: Store","socket: Socket","token: AtomIO.MutableAtomToken<T, J>","store: Store","socket: Socket","token: AtomIO.MutableAtomToken<T, J>","store: Store","socket: Socket","token: AtomIO.SelectorToken<T>","store: Store","socket: Socket","token: AtomIO.SelectorToken<T>","store: Internal.Store","socket: Socket","token: AtomIO.WritableToken<J>","myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined>","myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined>","myUsernameState: AtomIO.RegularAtomToken<string | null>","optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n>","confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n>","store: Internal.Store","socket: Socket","token: AtomIO.TransactionToken<F>","store: Store","socket: Socket","continuity: ContinuityToken"],"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/server-action.ts","../../src/realtime-client/sync-continuity.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["store: Store","continuityKey: string","socket: Socket","optimisticUpdates: AtomIO.TransactionUpdate<any>[]","confirmedUpdates: AtomIO.TransactionUpdate<any>[]","confirmed: AtomIO.TransactionUpdate<Func>","store: Store","concealed: AtomToken<unknown>[]","store: Store","revealed: Json.Array","store: Store","socket: Socket","token: AtomIO.RegularAtomToken<J>","store: Store","socket: Socket","token: AtomIO.RegularAtomToken<J>","store: Store","socket: Socket","token: AtomIO.MutableAtomToken<T, J>","store: Store","socket: Socket","token: AtomIO.MutableAtomToken<T, J>","store: Store","socket: Socket","token: AtomIO.SelectorToken<T>","store: Store","socket: Socket","token: AtomIO.SelectorToken<T>","store: Internal.Store","socket: Socket","token: AtomIO.WritableToken<J>","myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined>","myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined>","myUsernameState: AtomIO.RegularAtomToken<string | null>","optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n>","confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n>","store: Internal.Store","socket: Socket","token: AtomIO.TransactionToken<F>","store: Store","socket: Socket","continuity: ContinuityToken"],"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/server-action.ts","../../src/realtime-client/sync-continuity.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;cAgBa,8CAEJ,sCAEC,2BACW,MAAA,CAAO,4CACR,MAAA,CAAO,yCAEd,MAAA,CAAO,kBAAkB;;;iBCpBtB,eAAA,QAAuB,oBACnB;;;iBCFJ,cAAA,QAAsB,mBACnB,IAAA,CAAK;;;iBCCR,mBAAmB,IAAA,CAAK,qBAChC,eACC,iBACD,MAAA,CAAO,iBAAiB;;;;iBCAhB,+BAA+B,IAAA,CAAK,qBAC5C,eACC,iBACD,MAAA,CAAO,iBAAiB;;;iBCLhB,0BACL,4BACA,IAAA,CAAK,qBAER,eACC,iBACD,MAAA,CAAO,iBAAiB,GAAG;;;;iBCHnB,sCACL,4BACA,IAAA,CAAK,qBAER,eACC,iBACD,MAAA,CAAO,iBAAiB,GAAG;;;iBCRnB,uBACR,eACC,iBACD,MAAA,CAAO,cAAc;;;;iBCDb,mCACR,eACC,iBACD,MAAA,CAAO,cAAc;;;iBCPb,oBAAoB,IAAA,CAAK,qBACjC,QAAA,CAAS,eACR,iBACD,MAAA,CAAO,cAAc;;;cCLhB+B,qBAAqB,MAAA,CAAO;cAK5BC,WAAW,MAAA,CAAO;cAMlBC,iBAAiB,MAAA,CAAO;;;cCZxBC,uBAAuB,MAAA,CAAO,iBAC1C,MAAA,CAAO;cAMKC,sBAAsB,MAAA,CAAO,iBACzC,MAAA,CAAO;;;iBCNQ,uBAAuB,QAAA,CAAS,aACxC,QAAA,CAAS,eACR,iBACD,MAAA,CAAO,iBAAiB;;;iBCchB,cAAA,QACR,eACC,sBACI"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import * as Internal$1 from "atom.io/internal";
|
|
2
1
|
import * as Internal from "atom.io/internal";
|
|
3
2
|
import { actUponStore, assignTransactionToContinuity, disposeAtom, getEpochNumberOfContinuity, getFromStore, getJsonToken, getUpdateToken, ingestTransactionUpdate, isRootStore, setEpochNumberOfContinuity, setIntoStore, subscribeToTransaction } from "atom.io/internal";
|
|
4
3
|
import { parseJson } from "atom.io/json";
|
|
5
|
-
import * as AtomIO$1 from "atom.io";
|
|
6
4
|
import * as AtomIO from "atom.io";
|
|
7
5
|
import { persistSync } from "atom.io/web";
|
|
8
6
|
import { confirmedUpdateQueue as confirmedUpdateQueue$1, optimisticUpdateQueue as optimisticUpdateQueue$1 } from "atom.io/realtime-client";
|
|
@@ -258,7 +256,7 @@ function pullSelectorFamilyMember(store, socket, token) {
|
|
|
258
256
|
//#region src/realtime-client/push-state.ts
|
|
259
257
|
function pushState(store, socket, token) {
|
|
260
258
|
socket.emit(`claim:${token.key}`);
|
|
261
|
-
Internal
|
|
259
|
+
Internal.subscribeToState(store, token, `push`, ({ newValue }) => {
|
|
262
260
|
socket.emit(`pub:${token.key}`, newValue);
|
|
263
261
|
});
|
|
264
262
|
return () => {
|
|
@@ -269,15 +267,15 @@ function pushState(store, socket, token) {
|
|
|
269
267
|
|
|
270
268
|
//#endregion
|
|
271
269
|
//#region src/realtime-client/realtime-client-stores/client-main-store.ts
|
|
272
|
-
const myIdState__INTERNAL = AtomIO
|
|
270
|
+
const myIdState__INTERNAL = AtomIO.atom({
|
|
273
271
|
key: `mySocketId__INTERNAL`,
|
|
274
272
|
default: void 0
|
|
275
273
|
});
|
|
276
|
-
const myIdState = AtomIO
|
|
274
|
+
const myIdState = AtomIO.selector({
|
|
277
275
|
key: `mySocketId`,
|
|
278
276
|
get: ({ get }) => get(myIdState__INTERNAL)
|
|
279
277
|
});
|
|
280
|
-
const myUsernameState = AtomIO
|
|
278
|
+
const myUsernameState = AtomIO.atom({
|
|
281
279
|
key: `myName`,
|
|
282
280
|
default: null,
|
|
283
281
|
effects: typeof window === `undefined` ? [] : [persistSync(window.localStorage, JSON, `myUsername`)]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["store: Store","continuityKey: string","socket: Socket","optimisticUpdates: AtomIO.TransactionUpdate<any>[]","confirmedUpdates: AtomIO.TransactionUpdate<any>[]","confirmed: AtomIO.TransactionUpdate<Func>","optimisticUpdate: AtomIO.TransactionUpdate<any>","confirmedUpdate: AtomIO.TransactionUpdate<any>","optimisticUpdateQueue","confirmedUpdateQueue","continuityEpoch: number | undefined","store: Store","concealed: AtomToken<unknown>[]","store: Store","revealed: Json.Array","k: any","v: any","store: Store","socket: Socket","token: AtomIO.RegularAtomToken<J>","data: J","store: Store","socket: Socket","token: AtomIO.RegularAtomToken<J>","data: J","store: Store","socket: Socket","token: AtomIO.MutableAtomToken<T, J>","data: J","data: T extends Transceiver<infer Update> ? Update : never","store: Store","socket: Socket","token: AtomIO.MutableAtomToken<T, J>","data: J","data: T extends Transceiver<infer Signal> ? Signal : never","store: Store","socket: Socket","token: AtomIO.SelectorToken<T>","unsubscribes: Array<() => void>","atom","store: Store","socket: Socket","token: AtomIO.SelectorToken<T>","unsubscribes: Array<() => void>","atom","store: Internal.Store","socket: Socket","token: AtomIO.WritableToken<J>","myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined>","myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined>","myUsernameState: AtomIO.RegularAtomToken<string | null>","optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n>","confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n>","store: Internal.Store","socket: Socket","token: AtomIO.TransactionToken<F>","store: Store","socket: Socket","continuity: ContinuityToken","optimisticUpdateQueue","confirmedUpdateQueue","epoch: number","payload: Json.Array","k: any","v: any"],"sources":["../../src/realtime-client/continuity/register-and-attempt-confirmed-update.ts","../../src/realtime-client/continuity/use-conceal-state.ts","../../src/realtime-client/continuity/use-reveal-state.ts","../../src/realtime-client/pull-atom.ts","../../src/realtime-client/pull-atom-family-member.ts","../../src/realtime-client/pull-mutable-atom.ts","../../src/realtime-client/pull-mutable-atom-family-member.ts","../../src/realtime-client/pull-selector.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/server-action.ts","../../src/realtime-client/sync-continuity.ts"],"sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Func, Store } from \"atom.io/internal\"\nimport {\n\tactUponStore,\n\tgetEpochNumberOfContinuity,\n\tingestTransactionUpdate,\n\tisRootStore,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n} from \"atom.io/internal\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"atom.io/realtime-server\"\n\nexport const useRegisterAndAttemptConfirmedUpdate =\n\t(\n\t\tstore: Store,\n\t\tcontinuityKey: string,\n\t\tsocket: Socket,\n\t\toptimisticUpdates: AtomIO.TransactionUpdate<any>[],\n\t\tconfirmedUpdates: AtomIO.TransactionUpdate<any>[],\n\t) =>\n\t(confirmed: AtomIO.TransactionUpdate<Func>): void => {\n\t\tfunction reconcileEpoch(\n\t\t\toptimisticUpdate: AtomIO.TransactionUpdate<any>,\n\t\t\tconfirmedUpdate: AtomIO.TransactionUpdate<any>,\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, optimisticUpdateQueue, (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.updates)\n\t\t\t\tconst serverResult = JSON.stringify(confirmedUpdate.updates)\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.key}:${optimisticUpdate.id}, but it was actually ${confirmedUpdate.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\tingestTransactionUpdate(`oldValue`, subsequentOptimistic, store)\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\tingestTransactionUpdate(`oldValue`, optimisticUpdate, store)\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\tingestTransactionUpdate(`newValue`, confirmedUpdate, store)\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.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, confirmedUpdateQueue, (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\tconst isRoot = isRootStore(store)\n\t\t\tlet continuityEpoch: number | undefined\n\t\t\tif (isRoot) {\n\t\t\t\tcontinuityEpoch = getEpochNumberOfContinuity(store, continuityKey)\n\t\t\t}\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.key} ${confirmed.id})`,\n\t\t\t\t)\n\t\t\t\tingestTransactionUpdate(`newValue`, confirmed, store)\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 (isRoot && 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, confirmedUpdateQueue, (queue) => {\n\t\t\t\t\t\tqueue.push(confirmed)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n","import type { AtomToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { disposeAtom } from \"atom.io/internal\"\n\nexport function useConcealState(store: Store) {\n\treturn (concealed: AtomToken<unknown>[]): void => {\n\t\tfor (const token of concealed) {\n\t\t\tdisposeAtom(store, token)\n\t\t}\n\t}\n}\n","import { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport function useRevealState(store: Store) {\n\treturn (revealed: Json.Array): void => {\n\t\tlet i = 0\n\t\tlet k: any\n\t\tlet v: any\n\t\tfor (const x of revealed) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tsetIntoStore(store, k, v)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtom<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J>,\n): () => void {\n\tconst setServedValue = (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t}\n\tsocket.on(`serve:${token.key}`, setServedValue)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`, setServedValue)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\n/* eslint-disable no-console */\n\nexport function pullAtomFamilyMember<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J>,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket?.on(`serve:${token.key}`, (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t})\n\tsocket?.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket?.off(`serve:${token.key}`)\n\t\tsocket?.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtom<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.MutableAtomToken<T, J>,\n): () => void {\n\tconst jsonToken = getJsonToken(store, token)\n\tconst updateToken = getUpdateToken(token)\n\tsocket.on(`init:${token.key}`, (data: J) => {\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(\n\t\t`next:${token.key}`,\n\t\t(data: T extends Transceiver<infer Update> ? Update : never) => {\n\t\t\tsetIntoStore(store, updateToken, data)\n\t\t},\n\t)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`init:${token.key}`)\n\t\tsocket.off(`next:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\n/* eslint-disable no-console */\n\nexport function pullMutableAtomFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.MutableAtomToken<T, J>,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket.on(`init:${token.key}`, (data: J) => {\n\t\tconst jsonToken = getJsonToken(store, token)\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(\n\t\t`next:${token.key}`,\n\t\t(data: T extends Transceiver<infer Signal> ? Signal : never) => {\n\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\tsetIntoStore(store, trackerToken, data)\n\t\t},\n\t)\n\tsocket.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtom } from \"./pull-atom\"\nimport { pullMutableAtom } from \"./pull-mutable-atom\"\n\nexport function pullSelector<T>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.SelectorToken<T>,\n): () => void {\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtom(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtom(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtomFamilyMember } from \"./pull-atom-family-member\"\nimport { pullMutableAtomFamilyMember } from \"./pull-mutable-atom-family-member\"\n\n/* eslint-disable no-console */\n\nexport function pullSelectorFamilyMember<T>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.SelectorToken<T>,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtomFamilyMember(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtomFamilyMember(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pushState<J extends Json.Serializable>(\n\tstore: Internal.Store,\n\tsocket: Socket,\n\ttoken: AtomIO.WritableToken<J>,\n): () => void {\n\tsocket.emit(`claim:${token.key}`)\n\tInternal.subscribeToState(store, token, `push`, ({ newValue }) => {\n\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t})\n\treturn () => {\n\t\tsocket.off(`pub:${token.key}`)\n\t\tsocket.emit(`unclaim:${token.key}`)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { persistSync } from \"atom.io/web\"\n\nexport const myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined> =\n\tAtomIO.atom<string | undefined>({\n\t\tkey: `mySocketId__INTERNAL`,\n\t\tdefault: undefined,\n\t})\nexport const myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined> =\n\tAtomIO.selector<string | undefined>({\n\t\tkey: `mySocketId`,\n\t\tget: ({ get }) => get(myIdState__INTERNAL),\n\t})\n\nexport const myUsernameState: AtomIO.RegularAtomToken<string | null> =\n\tAtomIO.atom<string | null>({\n\t\tkey: `myName`,\n\t\tdefault: null,\n\t\teffects:\n\t\t\ttypeof window === `undefined`\n\t\t\t\t? []\n\t\t\t\t: [persistSync(window.localStorage, JSON, `myUsername`)],\n\t})\n","import * as AtomIO from \"atom.io\"\n\nexport const optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n> = AtomIO.atom<AtomIO.TransactionUpdate<any>[]>({\n\tkey: `updateQueue`,\n\tdefault: [],\n})\n\nexport const confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n> = AtomIO.atom<AtomIO.TransactionUpdate<any>[]>({\n\tkey: `serverConfirmedUpdateQueue`,\n\tdefault: [],\n})\n","import type * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function serverAction<F extends Internal.Func>(\n\tstore: Internal.Store,\n\tsocket: Socket,\n\ttoken: AtomIO.TransactionToken<F>,\n): () => void {\n\tconst unsubscribeFromLocalUpdates = Internal.subscribeToTransaction(\n\t\tstore,\n\t\ttoken,\n\t\t`tx-run:${token.key}:${socket.id}`,\n\t\t(clientUpdate) => {\n\t\t\tsocket.emit(`tx-run:${token.key}`, clientUpdate)\n\t\t},\n\t)\n\n\treturn () => {\n\t\tunsubscribeFromLocalUpdates()\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tassignTransactionToContinuity,\n\tgetFromStore,\n\tgetJsonToken,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { useRegisterAndAttemptConfirmedUpdate } from \"./continuity/register-and-attempt-confirmed-update\"\nimport { useConcealState } from \"./continuity/use-conceal-state\"\nimport { useRevealState } from \"./continuity/use-reveal-state\"\n\nexport function syncContinuity(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst optimisticUpdates = getFromStore(store, optimisticUpdateQueue)\n\tconst confirmedUpdates = getFromStore(store, confirmedUpdateQueue)\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, optimisticUpdateQueue, (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, optimisticUpdateQueue, (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\tkey: transaction.key,\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":["store: Store","continuityKey: string","socket: Socket","optimisticUpdates: AtomIO.TransactionUpdate<any>[]","confirmedUpdates: AtomIO.TransactionUpdate<any>[]","confirmed: AtomIO.TransactionUpdate<Func>","optimisticUpdate: AtomIO.TransactionUpdate<any>","confirmedUpdate: AtomIO.TransactionUpdate<any>","optimisticUpdateQueue","confirmedUpdateQueue","continuityEpoch: number | undefined","store: Store","concealed: AtomToken<unknown>[]","store: Store","revealed: Json.Array","k: any","v: any","store: Store","socket: Socket","token: AtomIO.RegularAtomToken<J>","data: J","store: Store","socket: Socket","token: AtomIO.RegularAtomToken<J>","data: J","store: Store","socket: Socket","token: AtomIO.MutableAtomToken<T, J>","data: J","data: T extends Transceiver<infer Update> ? Update : never","store: Store","socket: Socket","token: AtomIO.MutableAtomToken<T, J>","data: J","data: T extends Transceiver<infer Signal> ? Signal : never","store: Store","socket: Socket","token: AtomIO.SelectorToken<T>","unsubscribes: Array<() => void>","atom","store: Store","socket: Socket","token: AtomIO.SelectorToken<T>","unsubscribes: Array<() => void>","atom","store: Internal.Store","socket: Socket","token: AtomIO.WritableToken<J>","myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined>","myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined>","myUsernameState: AtomIO.RegularAtomToken<string | null>","optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n>","confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n>","store: Internal.Store","socket: Socket","token: AtomIO.TransactionToken<F>","store: Store","socket: Socket","continuity: ContinuityToken","optimisticUpdateQueue","confirmedUpdateQueue","epoch: number","payload: Json.Array","k: any","v: any"],"sources":["../../src/realtime-client/continuity/register-and-attempt-confirmed-update.ts","../../src/realtime-client/continuity/use-conceal-state.ts","../../src/realtime-client/continuity/use-reveal-state.ts","../../src/realtime-client/pull-atom.ts","../../src/realtime-client/pull-atom-family-member.ts","../../src/realtime-client/pull-mutable-atom.ts","../../src/realtime-client/pull-mutable-atom-family-member.ts","../../src/realtime-client/pull-selector.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/server-action.ts","../../src/realtime-client/sync-continuity.ts"],"sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Func, Store } from \"atom.io/internal\"\nimport {\n\tactUponStore,\n\tgetEpochNumberOfContinuity,\n\tingestTransactionUpdate,\n\tisRootStore,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n} from \"atom.io/internal\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"atom.io/realtime-server\"\n\nexport const useRegisterAndAttemptConfirmedUpdate =\n\t(\n\t\tstore: Store,\n\t\tcontinuityKey: string,\n\t\tsocket: Socket,\n\t\toptimisticUpdates: AtomIO.TransactionUpdate<any>[],\n\t\tconfirmedUpdates: AtomIO.TransactionUpdate<any>[],\n\t) =>\n\t(confirmed: AtomIO.TransactionUpdate<Func>): void => {\n\t\tfunction reconcileEpoch(\n\t\t\toptimisticUpdate: AtomIO.TransactionUpdate<any>,\n\t\t\tconfirmedUpdate: AtomIO.TransactionUpdate<any>,\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, optimisticUpdateQueue, (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.updates)\n\t\t\t\tconst serverResult = JSON.stringify(confirmedUpdate.updates)\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.key}:${optimisticUpdate.id}, but it was actually ${confirmedUpdate.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\tingestTransactionUpdate(`oldValue`, subsequentOptimistic, store)\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\tingestTransactionUpdate(`oldValue`, optimisticUpdate, store)\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\tingestTransactionUpdate(`newValue`, confirmedUpdate, store)\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.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, confirmedUpdateQueue, (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\tconst isRoot = isRootStore(store)\n\t\t\tlet continuityEpoch: number | undefined\n\t\t\tif (isRoot) {\n\t\t\t\tcontinuityEpoch = getEpochNumberOfContinuity(store, continuityKey)\n\t\t\t}\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.key} ${confirmed.id})`,\n\t\t\t\t)\n\t\t\t\tingestTransactionUpdate(`newValue`, confirmed, store)\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 (isRoot && 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, confirmedUpdateQueue, (queue) => {\n\t\t\t\t\t\tqueue.push(confirmed)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n","import type { AtomToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { disposeAtom } from \"atom.io/internal\"\n\nexport function useConcealState(store: Store) {\n\treturn (concealed: AtomToken<unknown>[]): void => {\n\t\tfor (const token of concealed) {\n\t\t\tdisposeAtom(store, token)\n\t\t}\n\t}\n}\n","import { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport function useRevealState(store: Store) {\n\treturn (revealed: Json.Array): void => {\n\t\tlet i = 0\n\t\tlet k: any\n\t\tlet v: any\n\t\tfor (const x of revealed) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tsetIntoStore(store, k, v)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtom<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J>,\n): () => void {\n\tconst setServedValue = (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t}\n\tsocket.on(`serve:${token.key}`, setServedValue)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`, setServedValue)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\n/* eslint-disable no-console */\n\nexport function pullAtomFamilyMember<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J>,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket?.on(`serve:${token.key}`, (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t})\n\tsocket?.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket?.off(`serve:${token.key}`)\n\t\tsocket?.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtom<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.MutableAtomToken<T, J>,\n): () => void {\n\tconst jsonToken = getJsonToken(store, token)\n\tconst updateToken = getUpdateToken(token)\n\tsocket.on(`init:${token.key}`, (data: J) => {\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(\n\t\t`next:${token.key}`,\n\t\t(data: T extends Transceiver<infer Update> ? Update : never) => {\n\t\t\tsetIntoStore(store, updateToken, data)\n\t\t},\n\t)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`init:${token.key}`)\n\t\tsocket.off(`next:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\n/* eslint-disable no-console */\n\nexport function pullMutableAtomFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.MutableAtomToken<T, J>,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket.on(`init:${token.key}`, (data: J) => {\n\t\tconst jsonToken = getJsonToken(store, token)\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(\n\t\t`next:${token.key}`,\n\t\t(data: T extends Transceiver<infer Signal> ? Signal : never) => {\n\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\tsetIntoStore(store, trackerToken, data)\n\t\t},\n\t)\n\tsocket.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtom } from \"./pull-atom\"\nimport { pullMutableAtom } from \"./pull-mutable-atom\"\n\nexport function pullSelector<T>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.SelectorToken<T>,\n): () => void {\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtom(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtom(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtomFamilyMember } from \"./pull-atom-family-member\"\nimport { pullMutableAtomFamilyMember } from \"./pull-mutable-atom-family-member\"\n\n/* eslint-disable no-console */\n\nexport function pullSelectorFamilyMember<T>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.SelectorToken<T>,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtomFamilyMember(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtomFamilyMember(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pushState<J extends Json.Serializable>(\n\tstore: Internal.Store,\n\tsocket: Socket,\n\ttoken: AtomIO.WritableToken<J>,\n): () => void {\n\tsocket.emit(`claim:${token.key}`)\n\tInternal.subscribeToState(store, token, `push`, ({ newValue }) => {\n\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t})\n\treturn () => {\n\t\tsocket.off(`pub:${token.key}`)\n\t\tsocket.emit(`unclaim:${token.key}`)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { persistSync } from \"atom.io/web\"\n\nexport const myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined> =\n\tAtomIO.atom<string | undefined>({\n\t\tkey: `mySocketId__INTERNAL`,\n\t\tdefault: undefined,\n\t})\nexport const myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined> =\n\tAtomIO.selector<string | undefined>({\n\t\tkey: `mySocketId`,\n\t\tget: ({ get }) => get(myIdState__INTERNAL),\n\t})\n\nexport const myUsernameState: AtomIO.RegularAtomToken<string | null> =\n\tAtomIO.atom<string | null>({\n\t\tkey: `myName`,\n\t\tdefault: null,\n\t\teffects:\n\t\t\ttypeof window === `undefined`\n\t\t\t\t? []\n\t\t\t\t: [persistSync(window.localStorage, JSON, `myUsername`)],\n\t})\n","import * as AtomIO from \"atom.io\"\n\nexport const optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n> = AtomIO.atom<AtomIO.TransactionUpdate<any>[]>({\n\tkey: `updateQueue`,\n\tdefault: [],\n})\n\nexport const confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionUpdate<any>[]\n> = AtomIO.atom<AtomIO.TransactionUpdate<any>[]>({\n\tkey: `serverConfirmedUpdateQueue`,\n\tdefault: [],\n})\n","import type * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function serverAction<F extends Internal.Func>(\n\tstore: Internal.Store,\n\tsocket: Socket,\n\ttoken: AtomIO.TransactionToken<F>,\n): () => void {\n\tconst unsubscribeFromLocalUpdates = Internal.subscribeToTransaction(\n\t\tstore,\n\t\ttoken,\n\t\t`tx-run:${token.key}:${socket.id}`,\n\t\t(clientUpdate) => {\n\t\t\tsocket.emit(`tx-run:${token.key}`, clientUpdate)\n\t\t},\n\t)\n\n\treturn () => {\n\t\tunsubscribeFromLocalUpdates()\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tassignTransactionToContinuity,\n\tgetFromStore,\n\tgetJsonToken,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { useRegisterAndAttemptConfirmedUpdate } from \"./continuity/register-and-attempt-confirmed-update\"\nimport { useConcealState } from \"./continuity/use-conceal-state\"\nimport { useRevealState } from \"./continuity/use-reveal-state\"\n\nexport function syncContinuity(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst optimisticUpdates = getFromStore(store, optimisticUpdateQueue)\n\tconst confirmedUpdates = getFromStore(store, confirmedUpdateQueue)\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, optimisticUpdateQueue, (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, optimisticUpdateQueue, (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\tkey: transaction.key,\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":";;;;;;;;AAgBA,MAAa,uCACZ,CACCA,OACAC,eACAC,QACAC,mBACAC,qBAED,CAACC,cAAoD;CACpD,SAAS,eACRC,kBACAC,iBACO;AACP,QAAM,OAAO,MACX,SACA,aACD,gBACC,qBACD;AACD,eAAa,OAAOC,yBAAuB,CAAC,UAAU;AACrD,SAAM,OAAO;AACb,UAAO;EACP,EAAC;AACF,MAAI,iBAAiB,OAAO,gBAAgB,IAAI;GAC/C,MAAM,eAAe,KAAK,UAAU,iBAAiB,QAAQ;GAC7D,MAAM,eAAe,KAAK,UAAU,gBAAgB,QAAQ;AAC5D,OAAI,iBAAiB,cAAc;AAClC,UAAM,OAAO,MACX,KACA,aACD,gBACC,cAAc,iBAAiB,GAAG,kCACnC;AACD,WAAO,MAAM,MAAM,cAAc,GAAG,gBAAgB,MAAM;AAC1D;GACA;EACD,MAEA,OAAM,OAAO,MACX,KACA,aACD,gBACC,kBAAkB,gBAAgB,MAAM,OAAO,iBAAiB,IAAI,GAAG,iBAAiB,GAAG,wBAAwB,gBAAgB,IAAI,GAAG,gBAAgB,GAAG,EAC9J;AAEF,QAAM,OAAO,MACX,SACA,aACD,gBACC,uBACD,kBACA,gBACA;EACD,MAAM,4BAA4B,kBAAkB,YAAY;AAChE,OAAK,MAAM,wBAAwB,0BAClC,0BAAyB,WAAW,sBAAsB,MAAM;AAEjE,QAAM,OAAO,MACX,KACA,aACD,gBACC,4BACD,0BACA;AACD,2BAAyB,WAAW,kBAAkB,MAAM;AAC5D,QAAM,OAAO,MACX,KACA,aACD,gBACC,iCACD,iBACA;AACD,2BAAyB,WAAW,iBAAiB,MAAM;AAC3D,QAAM,OAAO,MACX,KACA,aACD,gBACC,2BACD,gBACA;AACD,SAAO,MAAM,MAAM,cAAc,GAAG,gBAAgB,MAAM;AAE1D,OAAK,MAAM,wBAAwB,mBAAmB;GACrD,MAAM,QAAQ;IACb,OAAO;IACP,KAAK,qBAAqB;GAC1B;GACD,MAAM,EAAE,IAAI,QAAQ,GAAG;AACvB,gBAAa,OAAO,OAAO,GAAG,CAAC,GAAG,OAAO;EACzC;AACD,QAAM,OAAO,MACX,KACA,aACD,gBACC,2CACD,kBACA;CACD;AAED,OAAM,OAAO,MACX,SACA,aACD,gBACC,+BACD;EAAE,iBAAiB;EAAW;EAAkB;CAAmB,EACnE;CACD,MAAM,yBAAyB,kBAAkB;AACjD,KAAI,wBAAwB;AAC3B,QAAM,OAAO,MACX,SACA,aACD,gBACC,qCACD;AACD,MAAI,UAAU,UAAU,uBAAuB,OAAO;AACrD,SAAM,OAAO,MACX,SACA,aACD,gBACC,6BAA6B,UAAU,MAAM,mCAC9C;AACD,kBAAe,wBAAwB,UAAU;AACjD,QAAK,MAAM,iBAAiB,kBAAkB;IAC7C,MAAM,iBAAiB,kBAAkB;AACzC,QAAI,cAAc,UAAU,gBAAgB,MAC3C,gBAAe,gBAAgB,cAAc;QAE7C;GAED;EACD,OAAM;AAEN,SAAM,OAAO,MACX,SACA,aACD,gBACC,6BAA6B,UAAU,MAAM,4CAA4C,uBAAuB,MAAM,EACvH;GACD,MAAM,mCAAmC,iBAAiB,KACzD,CAAC,WAAW,OAAO,UAAU,UAAU,MACvC;AACD,QAAK,kCAAkC;AACtC,UAAM,OAAO,MACX,MACA,aACD,gBACC,oCACD,UACA;AACD,iBAAa,OAAOC,wBAAsB,CAAC,UAAU;AACpD,WAAM,KAAK,UAAU;AACrB,WAAM,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM;AACvC,YAAO;IACP,EAAC;GACF;EACD;CACD,OAAM;AACN,QAAM,OAAO,MACX,SACA,aACD,gBACC,wCACD;EACD,MAAM,SAAS,YAAY,MAAM;EACjC,IAAIC;AACJ,MAAI,OACH,mBAAkB,2BAA2B,OAAO,cAAc;AAGnE,MAAI,oBAAoB,UAAU,QAAQ,GAAG;AAC5C,SAAM,OAAO,MACX,KACA,aACD,gBACC,sBAAsB,UAAU,MAAM,IAAI,UAAU,IAAI,GAAG,UAAU,GAAG,GACzE;AACD,4BAAyB,WAAW,WAAW,MAAM;AACrD,UAAO,MAAM,MAAM,cAAc,GAAG,UAAU,MAAM;AACpD,8BAA2B,OAAO,eAAe,UAAU,MAAM;EACjE,WAAU,UAAU,4BAA+B;AACnD,SAAM,OAAO,MACX,SACA,aACD,gBACC,mBAAmB,UAAU,MAAM,iCACnC,kBAAkB,EAClB,GACD;IACC,aAAa;IACb,aAAa,UAAU;GACvB,EACD;GACD,MAAM,mCAAmC,iBAAiB,KACzD,CAAC,WAAW,OAAO,UAAU,UAAU,MACvC;AACD,OAAI,iCACH,OAAM,OAAO,MACX,MACA,aACD,gBACC,oBAAoB,UAAU,MAAM,sBACrC;QACK;AACN,UAAM,OAAO,MACX,MACA,aACD,gBACC,4BAA4B,UAAU,MAAM,WAC7C;AACD,iBAAa,OAAOD,wBAAsB,CAAC,UAAU;AACpD,WAAM,KAAK,UAAU;AACrB,WAAM,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM;AACvC,YAAO;IACP,EAAC;GACF;EACD;CACD;AACD;;;;ACrOF,SAAgB,gBAAgBE,OAAc;AAC7C,QAAO,CAACC,cAA0C;AACjD,OAAK,MAAM,SAAS,UACnB,aAAY,OAAO,MAAM;CAE1B;AACD;;;;ACPD,SAAgB,eAAeC,OAAc;AAC5C,QAAO,CAACC,aAA+B;EACtC,IAAI,IAAI;EACR,IAAIC;EACJ,IAAIC;AACJ,OAAK,MAAM,KAAK,UAAU;AACzB,OAAI,IAAI,MAAM,EACb,KAAI;QACE;AACN,QAAI;AACJ,iBAAa,OAAO,GAAG,EAAE;GACzB;AACD;EACA;CACD;AACD;;;;ACbD,SAAgB,SACfC,OACAC,QACAC,OACa;CACb,MAAM,iBAAiB,CAACC,SAAY;AACnC,eAAa,OAAO,OAAO,KAAK;CAChC;AACD,QAAO,IAAI,QAAQ,MAAM,IAAI,GAAG,eAAe;AAC/C,QAAO,MAAM,MAAM,MAAM,IAAI,EAAE;AAC/B,QAAO,MAAM;AACZ,SAAO,KAAK,QAAQ,MAAM,IAAI,GAAG,eAAe;AAChD,SAAO,MAAM,QAAQ,MAAM,IAAI,EAAE;CACjC;AACD;;;;ACXD,SAAgB,qBACfC,OACAC,QACAC,OACa;AACb,QAAO,WAAW,QAAQ;AACzB,UAAQ,OAAO,gCAAgC,MAAM;AACrD,SAAO,MAAM,CAAE;CACf;CACD,MAAM,EAAE,KAAK,WAAW,QAAQ,kBAAkB,GAAG,MAAM;CAC3D,MAAM,SAAS,UAAU,iBAAiB;AAC1C,SAAQ,IAAI,QAAQ,MAAM,IAAI,GAAG,CAACC,SAAY;AAC7C,eAAa,OAAO,OAAO,KAAK;CAChC,EAAC;AACF,SAAQ,MAAM,MAAM,UAAU,GAAG,OAAO;AACxC,QAAO,MAAM;AACZ,UAAQ,KAAK,QAAQ,MAAM,IAAI,EAAE;AACjC,UAAQ,MAAM,QAAQ,MAAM,IAAI,EAAE;CAClC;AACD;;;;ACrBD,SAAgB,gBAIfC,OACAC,QACAC,OACa;CACb,MAAM,YAAY,aAAa,OAAO,MAAM;CAC5C,MAAM,cAAc,eAAe,MAAM;AACzC,QAAO,IAAI,OAAO,MAAM,IAAI,GAAG,CAACC,SAAY;AAC3C,eAAa,OAAO,WAAW,KAAK;CACpC,EAAC;AACF,QAAO,IACL,OAAO,MAAM,IAAI,GAClB,CAACC,SAA+D;AAC/D,eAAa,OAAO,aAAa,KAAK;CACtC,EACD;AACD,QAAO,MAAM,MAAM,MAAM,IAAI,EAAE;AAC/B,QAAO,MAAM;AACZ,SAAO,KAAK,OAAO,MAAM,IAAI,EAAE;AAC/B,SAAO,KAAK,OAAO,MAAM,IAAI,EAAE;AAC/B,SAAO,MAAM,QAAQ,MAAM,IAAI,EAAE;CACjC;AACD;;;;ACtBD,SAAgB,4BAIfC,OACAC,QACAC,OACa;AACb,QAAO,WAAW,QAAQ;AACzB,UAAQ,OAAO,gCAAgC,MAAM;AACrD,SAAO,MAAM,CAAE;CACf;CACD,MAAM,EAAE,KAAK,WAAW,QAAQ,kBAAkB,GAAG,MAAM;CAC3D,MAAM,SAAS,UAAU,iBAAiB;AAC1C,QAAO,IAAI,OAAO,MAAM,IAAI,GAAG,CAACC,SAAY;EAC3C,MAAM,YAAY,aAAa,OAAO,MAAM;AAC5C,eAAa,OAAO,WAAW,KAAK;CACpC,EAAC;AACF,QAAO,IACL,OAAO,MAAM,IAAI,GAClB,CAACC,SAA+D;EAC/D,MAAM,eAAe,eAAe,MAAM;AAC1C,eAAa,OAAO,cAAc,KAAK;CACvC,EACD;AACD,QAAO,MAAM,MAAM,UAAU,GAAG,OAAO;AACvC,QAAO,MAAM;AACZ,SAAO,KAAK,QAAQ,MAAM,IAAI,EAAE;AAChC,SAAO,MAAM,QAAQ,MAAM,IAAI,EAAE;CACjC;AACD;;;;AChCD,SAAgB,aACfC,OACAC,QACAC,OACa;CACb,MAAM,WAAW,MAAM,cAAc,eAAe,MAAM,IAAI;CAC9D,MAAMC,eAAkC,CAAE;AAC1C,KAAI,SACH,MAAK,MAAM,WAAW,UAAU;EAC/B,MAAMC,SAAO,MAAM,MAAM,IAAI,QAAQ;AACrC,OAAKA,OACJ;AAED,UAAQA,OAAK,MAAb;GACC,MAAM,OAAO;AACZ,iBAAa,KAAK,SAAS,OAAO,QAAQA,OAAK,CAAC;AAChD;GACA;GACD,MAAM,eAAe;AACpB,iBAAa,KAAK,gBAAgB,OAAO,QAAQA,OAAK,CAAC;AACvD;GACA;EACD;CACD;AAEF,QAAO,MAAM;AACZ,OAAK,MAAM,eAAe,aACzB,cAAa;CAEd;AACD;;;;AC5BD,SAAgB,yBACfC,OACAC,QACAC,OACa;AACb,QAAO,WAAW,QAAQ;AACzB,UAAQ,OAAO,gCAAgC,MAAM;AACrD,SAAO,MAAM,CAAE;CACf;CACD,MAAM,WAAW,MAAM,cAAc,eAAe,MAAM,IAAI;CAC9D,MAAMC,eAAkC,CAAE;AAC1C,KAAI,SACH,MAAK,MAAM,WAAW,UAAU;EAC/B,MAAMC,SAAO,MAAM,MAAM,IAAI,QAAQ;AACrC,OAAKA,OACJ;AAED,UAAQA,OAAK,MAAb;GACC,MAAM,OAAO;AACZ,iBAAa,KAAK,qBAAqB,OAAO,QAAQA,OAAK,CAAC;AAC5D;GACA;GACD,MAAM,eAAe;AACpB,iBAAa,KAAK,4BAA4B,OAAO,QAAQA,OAAK,CAAC;AACnE;GACA;EACD;CACD;AAEF,QAAO,MAAM;AACZ,OAAK,MAAM,eAAe,aACzB,cAAa;CAEd;AACD;;;;ACtCD,SAAgB,UACfC,OACAC,QACAC,OACa;AACb,QAAO,MAAM,QAAQ,MAAM,IAAI,EAAE;AACjC,UAAS,iBAAiB,OAAO,QAAQ,OAAO,CAAC,EAAE,UAAU,KAAK;AACjE,SAAO,MAAM,MAAM,MAAM,IAAI,GAAG,SAAS;CACzC,EAAC;AACF,QAAO,MAAM;AACZ,SAAO,KAAK,MAAM,MAAM,IAAI,EAAE;AAC9B,SAAO,MAAM,UAAU,MAAM,IAAI,EAAE;CACnC;AACD;;;;ACfD,MAAaC,sBACZ,OAAO,KAAyB;CAC/B,MAAM;CACN;AACA,EAAC;AACH,MAAaC,YACZ,OAAO,SAA6B;CACnC,MAAM;CACN,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,oBAAoB;AAC1C,EAAC;AAEH,MAAaC,kBACZ,OAAO,KAAoB;CAC1B,MAAM;CACN,SAAS;CACT,gBACQ,YAAY,aAChB,CAAE,IACF,CAAC,YAAY,OAAO,cAAc,OAAO,YAAY,AAAC;AAC1D,EAAC;;;;ACpBH,MAAaC,wBAET,OAAO,KAAsC;CAChD,MAAM;CACN,SAAS,CAAE;AACX,EAAC;AAEF,MAAaC,uBAET,OAAO,KAAsC;CAChD,MAAM;CACN,SAAS,CAAE;AACX,EAAC;;;;ACVF,SAAgB,aACfC,OACAC,QACAC,OACa;CACb,MAAM,8BAA8B,SAAS,uBAC5C,OACA,QACC,SAAS,MAAM,IAAI,GAAG,OAAO,GAAG,GACjC,CAAC,iBAAiB;AACjB,SAAO,MAAM,SAAS,MAAM,IAAI,GAAG,aAAa;CAChD,EACD;AAED,QAAO,MAAM;AACZ,+BAA6B;CAC7B;AACD;;;;ACAD,SAAgB,eACfC,OACAC,QACAC,YACa;CACb,MAAM,gBAAgB,WAAW;CACjC,MAAM,oBAAoB,aAAa,OAAOC,wBAAsB;CACpE,MAAM,mBAAmB,aAAa,OAAOC,uBAAqB;CAElE,MAAM,uBAAuB,CAACC,OAAeC,YAAwB;AACpE,SAAO,KAAK,kBAAkB,cAAc,GAAG,qBAAqB;EACpE,IAAI,IAAI;EACR,IAAIC;EACJ,IAAIC;AACJ,OAAK,MAAM,KAAK,SAAS;AACxB,OAAI,IAAI,MAAM,EACb,KAAI;QACE;AACN,QAAI;AACJ,SAAK,SAAS,KAAK,EAAE,UAAU,cAC9B,KAAI,aAAa,OAAO,EAAE;AAE3B,iBAAa,OAAO,GAAG,EAAE;GACzB;AACD;EACA;AACD,6BAA2B,OAAO,eAAe,MAAM;CACvD;AACD,QAAO,KAAK,kBAAkB,cAAc,EAAE;AAC9C,QAAO,IAAI,kBAAkB,cAAc,GAAG,qBAAqB;CAEnE,MAAM,oCAAoC,qCACzC,OACA,eACA,QACA,mBACA,iBACA;AACD,QAAO,KAAK,SAAS,cAAc,EAAE;AACrC,QAAO,IAAI,SAAS,cAAc,GAAG,kCAAkC;CAEvE,MAAM,uBAAuB,WAAW,QAAQ,IAAI,CAAC,gBAAgB;AACpE,gCAA8B,OAAO,eAAe,YAAY,IAAI;EACpE,MAAM,oCAAoC,uBACzC,OACA,cACC,SAAS,cAAc,GACxB,CAAC,iBAAiB;AACjB,SAAM,OAAO,MACX,MACA,aACD,gBACC,6BACD;GACD,MAAM,wBAAwB,kBAAkB,UAC/C,CAAC,WAAW,OAAO,OAAO,aAAa,GACvC;AACD,OAAI,0BAA0B,IAAI;AACjC,UAAM,OAAO,MACX,MACA,aACD,gBACC,iCACD;AACD,iBAAa,OAAOL,yBAAuB,CAAC,UAAU;AACrD,WAAM,KAAK,aAAa;AACxB,WAAM,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM;AACvC,YAAO;IACP,EAAC;GACF,OAAM;AACN,UAAM,OAAO,MACX,MACA,aACD,gBACC,gDAAgD,sBAAsB,EACvE;AACD,iBAAa,OAAOA,yBAAuB,CAAC,UAAU;AACrD,WAAM,yBAAyB;AAC/B,YAAO;IACP,EAAC;GACF;AACD,UAAO,MAAM,SAAS,cAAc,GAAG;IACtC,IAAI,aAAa;IACjB,KAAK,YAAY;IACjB,QAAQ,aAAa;GACrB,EAAC;EACF,EACD;AACD,SAAO;CACP,EAAC;CAEF,MAAM,cAAc,eAAe,MAAM;CACzC,MAAM,eAAe,gBAAgB,MAAM;AAC3C,QAAO,IAAI,SAAS,cAAc,GAAG,YAAY;AACjD,QAAO,IAAI,UAAU,cAAc,GAAG,aAAa;AAEnD,QAAO,MAAM,MAAM,cAAc,EAAE;AACnC,QAAO,MAAM;AACZ,SAAO,KAAK,kBAAkB,cAAc,EAAE;AAC9C,SAAO,KAAK,SAAS,cAAc,EAAE;AACrC,OAAK,MAAM,eAAe,qBAAsB,cAAa;CAE7D;AACD"}
|
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
import { Func, Transceiver } from "atom.io/internal";
|
|
2
2
|
import { Canonical, Json } from "atom.io/json";
|
|
3
|
-
import * as AtomIO$7 from "atom.io";
|
|
4
|
-
import * as AtomIO$6 from "atom.io";
|
|
5
|
-
import * as AtomIO$5 from "atom.io";
|
|
6
|
-
import * as AtomIO$4 from "atom.io";
|
|
7
|
-
import * as AtomIO$3 from "atom.io";
|
|
8
|
-
import * as AtomIO$2 from "atom.io";
|
|
9
|
-
import * as AtomIO$1 from "atom.io";
|
|
10
3
|
import * as AtomIO from "atom.io";
|
|
11
4
|
import * as React from "react";
|
|
12
5
|
import { ContinuityToken } from "atom.io/realtime";
|
|
@@ -27,25 +20,25 @@ declare const RealtimeProvider: React.FC<{
|
|
|
27
20
|
}>;
|
|
28
21
|
//#endregion
|
|
29
22
|
//#region src/realtime-react/use-pull-atom.d.ts
|
|
30
|
-
declare function usePullAtom<J extends Json.Serializable>(token: AtomIO
|
|
23
|
+
declare function usePullAtom<J extends Json.Serializable>(token: AtomIO.RegularAtomToken<J>): J;
|
|
31
24
|
//#endregion
|
|
32
25
|
//#region src/realtime-react/use-pull-atom-family-member.d.ts
|
|
33
|
-
declare function usePullAtomFamilyMember<J extends Json.Serializable, K extends Canonical, Key extends K>(family: AtomIO
|
|
26
|
+
declare function usePullAtomFamilyMember<J extends Json.Serializable, K extends Canonical, Key extends K>(family: AtomIO.RegularAtomFamilyToken<J, K>, subKey: Key): J;
|
|
34
27
|
//#endregion
|
|
35
28
|
//#region src/realtime-react/use-pull-mutable-atom.d.ts
|
|
36
|
-
declare function usePullMutable<T extends Transceiver<any>, J extends Json.Serializable>(token: AtomIO
|
|
29
|
+
declare function usePullMutable<T extends Transceiver<any>, J extends Json.Serializable>(token: AtomIO.MutableAtomToken<T, J>): T;
|
|
37
30
|
//#endregion
|
|
38
31
|
//#region src/realtime-react/use-pull-mutable-family-member.d.ts
|
|
39
|
-
declare function usePullMutableAtomFamilyMember<T extends Transceiver<any>, J extends Json.Serializable, K extends Canonical, Key extends K>(familyToken: AtomIO
|
|
32
|
+
declare function usePullMutableAtomFamilyMember<T extends Transceiver<any>, J extends Json.Serializable, K extends Canonical, Key extends K>(familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>, key: Key): T;
|
|
40
33
|
//#endregion
|
|
41
34
|
//#region src/realtime-react/use-pull-selector.d.ts
|
|
42
|
-
declare function usePullSelector<J extends Json.Serializable>(token: AtomIO
|
|
35
|
+
declare function usePullSelector<J extends Json.Serializable>(token: AtomIO.SelectorToken<J>): J;
|
|
43
36
|
//#endregion
|
|
44
37
|
//#region src/realtime-react/use-pull-selector-family-member.d.ts
|
|
45
|
-
declare function usePullSelectorFamilyMember<T, K extends Canonical, Key extends K>(familyToken: AtomIO
|
|
38
|
+
declare function usePullSelectorFamilyMember<T, K extends Canonical, Key extends K>(familyToken: AtomIO.SelectorFamilyToken<T, K>, key: Key): T;
|
|
46
39
|
//#endregion
|
|
47
40
|
//#region src/realtime-react/use-push.d.ts
|
|
48
|
-
declare function usePush<J extends Json.Serializable>(token: AtomIO
|
|
41
|
+
declare function usePush<J extends Json.Serializable>(token: AtomIO.WritableToken<J>): <New extends J>(next: New | ((old: J) => New)) => void;
|
|
49
42
|
//#endregion
|
|
50
43
|
//#region src/realtime-react/use-server-action.d.ts
|
|
51
44
|
declare function useServerAction<F extends Func>(token: AtomIO.TransactionToken<F>): (...parameters: Parameters<F>) => ReturnType<F>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["effect: () => (() => void) | undefined | void","RealtimeContext: React.Context<RealtimeReactStore>","RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}>","token: AtomIO.RegularAtomToken<J>","family: AtomIO.RegularAtomFamilyToken<J, K>","subKey: Key","token: AtomIO.MutableAtomToken<T, J>","familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>","key: Key","token: AtomIO.SelectorToken<J>","familyToken: AtomIO.SelectorFamilyToken<T, K>","key: Key","token: AtomIO.WritableToken<J>","next: New | ((old: J) => New)","old: J","token: AtomIO.TransactionToken<F>","token: ContinuityToken"],"sources":["../../src/realtime-react/on-mount.ts","../../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-server-action.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["effect: () => (() => void) | undefined | void","RealtimeContext: React.Context<RealtimeReactStore>","RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}>","token: AtomIO.RegularAtomToken<J>","family: AtomIO.RegularAtomFamilyToken<J, K>","subKey: Key","token: AtomIO.MutableAtomToken<T, J>","familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>","key: Key","token: AtomIO.SelectorToken<J>","familyToken: AtomIO.SelectorFamilyToken<T, K>","key: Key","token: AtomIO.WritableToken<J>","next: New | ((old: J) => New)","old: J","token: AtomIO.TransactionToken<F>","token: ContinuityToken"],"sources":["../../src/realtime-react/on-mount.ts","../../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-server-action.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":[],"mappings":";;;;;;;;iBAEgB,OAAA;;;KCGJ,kBAAA;UACH;YACE;;cAMEC,iBAAiB,KAAA,CAAM,QAAQ;cAM/BC,kBAAkB,KAAA,CAAM;EDjBrC,QAAgB,ECkBL,KAAA,CAAM,SDlBD;UCmBP;;;;iBCbO,sBAAsB,IAAA,CAAK,qBACnC,MAAA,CAAO,iBAAiB,KAC7B;;;iBCDa,kCACL,IAAA,CAAK,wBACL,uBACE,WACH,MAAA,CAAO,uBAAuB,GAAG,YAAY,MAAM;;;iBCJ7C,yBACL,4BACA,IAAA,CAAK,qBACP,MAAA,CAAO,iBAAiB,GAAG,KAAK;;;iBCFzB,yCACL,4BACA,IAAA,CAAK,wBACL,uBACE,ELZb,CAAA,WAAgB,EKaD,MAAA,CAAO,sBLbN,CKa6B,CLb7B,EKagC,CLbhC,EKamC,CLbnC,CAAA,EAAA,GAAA,EKa4C,GLb5C,CAAA,EKakD,CLblD;;;iBMMA,0BAA0B,IAAA,CAAK,qBACvC,MAAA,CAAO,cAAc,KAC1B;;;iBCDa,yCAEL,uBACE,gBACE,MAAA,CAAO,oBAAoB,GAAG,SAAS,MAAM;;;iBCL5C,kBAAkB,IAAA,CAAK,qBAC/B,MAAA,CAAO,cAAc,kBACb,SAAS,aAAa,MAAM;;;iBCD5B,0BAA0B,aAClC,MAAA,CAAO,iBAAiB,qBACb,WAAW,OAAO,WAAW;;;iBCJhC,iBAAA,QAAyB"}
|
|
@@ -1,26 +1,7 @@
|
|
|
1
1
|
import { actUponStore, arbitrary, findInStore } from "atom.io/internal";
|
|
2
|
-
import * as React$11 from "react";
|
|
3
|
-
import * as React$10 from "react";
|
|
4
|
-
import * as React$9 from "react";
|
|
5
|
-
import * as React$8 from "react";
|
|
6
|
-
import * as React$7 from "react";
|
|
7
|
-
import * as React$6 from "react";
|
|
8
|
-
import * as React$5 from "react";
|
|
9
|
-
import * as React$4 from "react";
|
|
10
|
-
import * as React$3 from "react";
|
|
11
|
-
import * as React$2 from "react";
|
|
12
|
-
import * as React$1 from "react";
|
|
13
2
|
import * as React from "react";
|
|
14
3
|
import { jsx } from "react/jsx-runtime";
|
|
15
4
|
import { StoreContext, useI, useO } from "atom.io/react";
|
|
16
|
-
import * as RTC$8 from "atom.io/realtime-client";
|
|
17
|
-
import * as RTC$7 from "atom.io/realtime-client";
|
|
18
|
-
import * as RTC$6 from "atom.io/realtime-client";
|
|
19
|
-
import * as RTC$5 from "atom.io/realtime-client";
|
|
20
|
-
import * as RTC$4 from "atom.io/realtime-client";
|
|
21
|
-
import * as RTC$3 from "atom.io/realtime-client";
|
|
22
|
-
import * as RTC$2 from "atom.io/realtime-client";
|
|
23
|
-
import * as RTC$1 from "atom.io/realtime-client";
|
|
24
5
|
import * as RTC from "atom.io/realtime-client";
|
|
25
6
|
import { syncContinuity } from "atom.io/realtime-client";
|
|
26
7
|
|
|
@@ -30,8 +11,8 @@ const IN_DEV = NODE_ENV === `development`;
|
|
|
30
11
|
function noop() {}
|
|
31
12
|
function useSingleEffect(effect, deps) {
|
|
32
13
|
if (IN_DEV) {
|
|
33
|
-
const cleanup = React
|
|
34
|
-
React
|
|
14
|
+
const cleanup = React.useRef(noop);
|
|
15
|
+
React.useEffect(() => {
|
|
35
16
|
let dispose = cleanup.current;
|
|
36
17
|
if (dispose === noop) {
|
|
37
18
|
dispose = effect() ?? noop;
|
|
@@ -41,7 +22,7 @@ function useSingleEffect(effect, deps) {
|
|
|
41
22
|
cleanup.current = noop;
|
|
42
23
|
};
|
|
43
24
|
}, deps);
|
|
44
|
-
} else React
|
|
25
|
+
} else React.useEffect(effect, deps);
|
|
45
26
|
}
|
|
46
27
|
|
|
47
28
|
//#endregion
|
|
@@ -52,14 +33,14 @@ function onMount(effect) {
|
|
|
52
33
|
|
|
53
34
|
//#endregion
|
|
54
35
|
//#region src/realtime-react/realtime-context.tsx
|
|
55
|
-
const RealtimeContext = React
|
|
36
|
+
const RealtimeContext = React.createContext({
|
|
56
37
|
socket: null,
|
|
57
38
|
services: null
|
|
58
39
|
});
|
|
59
40
|
const RealtimeProvider = ({ children, socket }) => {
|
|
60
|
-
const services = React
|
|
61
|
-
const setMyId = useI(RTC
|
|
62
|
-
React
|
|
41
|
+
const services = React.useRef(/* @__PURE__ */ new Map()).current;
|
|
42
|
+
const setMyId = useI(RTC.myIdState__INTERNAL);
|
|
43
|
+
React.useEffect(() => {
|
|
63
44
|
setMyId(socket?.id);
|
|
64
45
|
socket?.on(`connect`, () => {
|
|
65
46
|
setMyId(socket.id);
|
|
@@ -80,7 +61,7 @@ const RealtimeProvider = ({ children, socket }) => {
|
|
|
80
61
|
//#endregion
|
|
81
62
|
//#region src/realtime-react/use-realtime-service.ts
|
|
82
63
|
function useRealtimeService(key, create) {
|
|
83
|
-
const { socket, services } = React
|
|
64
|
+
const { socket, services } = React.useContext(RealtimeContext);
|
|
84
65
|
onMount(() => {
|
|
85
66
|
let service = services?.get(key);
|
|
86
67
|
if (service) service[0]++;
|
|
@@ -104,66 +85,66 @@ function useRealtimeService(key, create) {
|
|
|
104
85
|
//#endregion
|
|
105
86
|
//#region src/realtime-react/use-pull-atom.ts
|
|
106
87
|
function usePullAtom(token) {
|
|
107
|
-
const store = React
|
|
108
|
-
useRealtimeService(`pull:${token.key}`, (socket) => RTC
|
|
88
|
+
const store = React.useContext(StoreContext);
|
|
89
|
+
useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullAtom(store, socket, token));
|
|
109
90
|
return useO(token);
|
|
110
91
|
}
|
|
111
92
|
|
|
112
93
|
//#endregion
|
|
113
94
|
//#region src/realtime-react/use-pull-atom-family-member.ts
|
|
114
95
|
function usePullAtomFamilyMember(family, subKey) {
|
|
115
|
-
const store = React
|
|
96
|
+
const store = React.useContext(StoreContext);
|
|
116
97
|
const token = findInStore(store, family, subKey);
|
|
117
|
-
useRealtimeService(`pull:${token.key}`, (socket) => RTC
|
|
98
|
+
useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullAtomFamilyMember(store, socket, token));
|
|
118
99
|
return useO(token);
|
|
119
100
|
}
|
|
120
101
|
|
|
121
102
|
//#endregion
|
|
122
103
|
//#region src/realtime-react/use-pull-mutable-atom.ts
|
|
123
104
|
function usePullMutable(token) {
|
|
124
|
-
const store = React
|
|
125
|
-
useRealtimeService(`pull:${token.key}`, (socket) => RTC
|
|
105
|
+
const store = React.useContext(StoreContext);
|
|
106
|
+
useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullMutableAtom(store, socket, token));
|
|
126
107
|
return useO(token);
|
|
127
108
|
}
|
|
128
109
|
|
|
129
110
|
//#endregion
|
|
130
111
|
//#region src/realtime-react/use-pull-mutable-family-member.ts
|
|
131
112
|
function usePullMutableAtomFamilyMember(familyToken, key) {
|
|
132
|
-
const store = React
|
|
113
|
+
const store = React.useContext(StoreContext);
|
|
133
114
|
const token = findInStore(store, familyToken, key);
|
|
134
|
-
useRealtimeService(`pull:${token.key}`, (socket) => RTC
|
|
115
|
+
useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullMutableAtomFamilyMember(store, socket, token));
|
|
135
116
|
return useO(token);
|
|
136
117
|
}
|
|
137
118
|
|
|
138
119
|
//#endregion
|
|
139
120
|
//#region src/realtime-react/use-pull-selector.ts
|
|
140
121
|
function usePullSelector(token) {
|
|
141
|
-
const store = React
|
|
142
|
-
useRealtimeService(`pull:${token.key}`, (socket) => RTC
|
|
122
|
+
const store = React.useContext(StoreContext);
|
|
123
|
+
useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullSelector(store, socket, token));
|
|
143
124
|
return useO(token);
|
|
144
125
|
}
|
|
145
126
|
|
|
146
127
|
//#endregion
|
|
147
128
|
//#region src/realtime-react/use-pull-selector-family-member.ts
|
|
148
129
|
function usePullSelectorFamilyMember(familyToken, key) {
|
|
149
|
-
const store = React
|
|
130
|
+
const store = React.useContext(StoreContext);
|
|
150
131
|
const token = findInStore(store, familyToken, key);
|
|
151
|
-
useRealtimeService(`pull:${token.key}`, (socket) => RTC
|
|
132
|
+
useRealtimeService(`pull:${token.key}`, (socket) => RTC.pullSelectorFamilyMember(store, socket, token));
|
|
152
133
|
return useO(token);
|
|
153
134
|
}
|
|
154
135
|
|
|
155
136
|
//#endregion
|
|
156
137
|
//#region src/realtime-react/use-push.ts
|
|
157
138
|
function usePush(token) {
|
|
158
|
-
const store = React
|
|
159
|
-
useRealtimeService(`push:${token.key}`, (socket) => RTC
|
|
139
|
+
const store = React.useContext(StoreContext);
|
|
140
|
+
useRealtimeService(`push:${token.key}`, (socket) => RTC.pushState(store, socket, token));
|
|
160
141
|
return useI(token);
|
|
161
142
|
}
|
|
162
143
|
|
|
163
144
|
//#endregion
|
|
164
145
|
//#region src/realtime-react/use-server-action.ts
|
|
165
146
|
function useServerAction(token) {
|
|
166
|
-
const store = React
|
|
147
|
+
const store = React.useContext(StoreContext);
|
|
167
148
|
useRealtimeService(`tx:${token.key}`, (socket) => RTC.serverAction(store, socket, token));
|
|
168
149
|
return actUponStore(store, token, arbitrary());
|
|
169
150
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["effect: () => (() => void) | undefined | void","deps: unknown[]","effect: () => (() => void) | undefined | void","RealtimeContext: React.Context<RealtimeReactStore>","RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}>","RTC","key: string","create: (socket: Socket) => (() => void) | undefined","token: AtomIO.RegularAtomToken<J>","family: AtomIO.RegularAtomFamilyToken<J, K>","subKey: Key","token: AtomIO.MutableAtomToken<T, J>","familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>","key: Key","token: AtomIO.SelectorToken<J>","familyToken: AtomIO.SelectorFamilyToken<T, K>","key: Key","token: AtomIO.WritableToken<J>","token: AtomIO.TransactionToken<F>","token: ContinuityToken"],"sources":["../../src/realtime-react/use-single-effect.ts","../../src/realtime-react/on-mount.ts","../../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-server-action.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":["import * as React from \"react\"\n\n// @ts-expect-error this is a safe way to check a property on the global object\nconst { NODE_ENV } = globalThis[`env`] ?? {}\nconst IN_DEV = NODE_ENV === `development`\n\nfunction noop() {}\n\nexport function useSingleEffect(\n\teffect: () => (() => void) | undefined | void,\n\tdeps: unknown[],\n): void {\n\tif (IN_DEV) {\n\t\tconst cleanup = React.useRef<() => void>(noop)\n\t\tReact.useEffect(() => {\n\t\t\tlet dispose = cleanup.current\n\t\t\tif (dispose === noop) {\n\t\t\t\tdispose = effect() ?? noop\n\t\t\t\tcleanup.current = dispose\n\t\t\t} else {\n\t\t\t\treturn () => {\n\t\t\t\t\tdispose()\n\t\t\t\t\tcleanup.current = noop\n\t\t\t\t}\n\t\t\t}\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import { useSingleEffect } from \"./use-single-effect\"\n\nexport function onMount(effect: () => (() => void) | undefined | void): void {\n\tuseSingleEffect(effect, [])\n}\n","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 RealtimeReactStore = {\n\tsocket: Socket | null\n\tservices: Map<\n\t\tstring,\n\t\t[consumerCount: number, dispose: (() => void) | undefined]\n\t> | 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(new Map<string, [number, () => void]>()).current\n\tconst setMyId = useI(RTC.myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsetMyId(socket?.id)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMyId(undefined)\n\t\t})\n\t}, [socket, setMyId])\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 * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { onMount } from \"./on-mount\"\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useRealtimeService(\n\tkey: string,\n\tcreate: (socket: Socket) => (() => void) | undefined,\n): void {\n\tconst { socket, services } = React.useContext(RealtimeContext)\n\tonMount(() => {\n\t\tlet service = services?.get(key)\n\t\tif (service) {\n\t\t\tservice[0]++\n\t\t} else {\n\t\t\tconst dispose = socket ? create(socket) : undefined\n\t\t\tservice = [1, dispose]\n\t\t\tservices?.set(key, service)\n\t\t}\n\t\treturn () => {\n\t\t\tif (service) {\n\t\t\t\tservice[0]--\n\t\t\t\tif (service[0] === 0) {\n\t\t\t\t\tservice[1]?.()\n\t\t\t\t\tservices?.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\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): 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\tKey extends K,\n>(family: AtomIO.RegularAtomFamilyToken<J, K>, subKey: Key): 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, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\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 usePullMutable<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): 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, 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 usePullMutableAtomFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Canonical,\n\tKey extends K,\n>(familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, familyToken, key)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtomFamilyMember(store, socket, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\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): 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<\n\tT,\n\tK extends Canonical,\n\tKey extends K,\n>(familyToken: AtomIO.SelectorFamilyToken<T, K>, key: Key): 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, token),\n\t)\n\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useI } 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 usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): <New extends J>(next: New | ((old: J) => New)) => void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`push:${token.key}`, (socket) =>\n\t\tRTC.pushState(store, socket, token),\n\t)\n\treturn useI(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Func } from \"atom.io/internal\"\nimport { actUponStore, arbitrary } from \"atom.io/internal\"\nimport { StoreContext } 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 useServerAction<F extends Func>(\n\ttoken: AtomIO.TransactionToken<F>,\n): (...parameters: Parameters<F>) => ReturnType<F> {\n\tconst store = React.useContext(StoreContext)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.serverAction(store, socket, token),\n\t)\n\treturn actUponStore(store, token, arbitrary())\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":["effect: () => (() => void) | undefined | void","deps: unknown[]","effect: () => (() => void) | undefined | void","RealtimeContext: React.Context<RealtimeReactStore>","RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}>","key: string","create: (socket: Socket) => (() => void) | undefined","token: AtomIO.RegularAtomToken<J>","family: AtomIO.RegularAtomFamilyToken<J, K>","subKey: Key","token: AtomIO.MutableAtomToken<T, J>","familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>","key: Key","token: AtomIO.SelectorToken<J>","familyToken: AtomIO.SelectorFamilyToken<T, K>","key: Key","token: AtomIO.WritableToken<J>","token: AtomIO.TransactionToken<F>","token: ContinuityToken"],"sources":["../../src/realtime-react/use-single-effect.ts","../../src/realtime-react/on-mount.ts","../../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-server-action.ts","../../src/realtime-react/use-sync-continuity.ts"],"sourcesContent":["/** biome-ignore-all lint/correctness/useHookAtTopLevel: intentional */\n\nimport * as React from \"react\"\n\n// @ts-expect-error this is a safe way to check a property on the global object\nconst { NODE_ENV } = globalThis[`env`] ?? {}\nconst IN_DEV = NODE_ENV === `development`\n\nfunction noop() {}\n\nexport function useSingleEffect(\n\teffect: () => (() => void) | undefined | void,\n\tdeps: unknown[],\n): void {\n\tif (IN_DEV) {\n\t\tconst cleanup = React.useRef<() => void>(noop)\n\t\tReact.useEffect(() => {\n\t\t\tlet dispose = cleanup.current\n\t\t\tif (dispose === noop) {\n\t\t\t\tdispose = effect() ?? noop\n\t\t\t\tcleanup.current = dispose\n\t\t\t} else {\n\t\t\t\treturn () => {\n\t\t\t\t\tdispose()\n\t\t\t\t\tcleanup.current = noop\n\t\t\t\t}\n\t\t\t}\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import { useSingleEffect } from \"./use-single-effect\"\n\nexport function onMount(effect: () => (() => void) | undefined | void): void {\n\tuseSingleEffect(effect, [])\n}\n","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 RealtimeReactStore = {\n\tsocket: Socket | null\n\tservices: Map<\n\t\tstring,\n\t\t[consumerCount: number, dispose: (() => void) | undefined]\n\t> | 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(new Map<string, [number, () => void]>()).current\n\tconst setMyId = useI(RTC.myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsetMyId(socket?.id)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMyId(undefined)\n\t\t})\n\t}, [socket, setMyId])\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 * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { onMount } from \"./on-mount\"\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useRealtimeService(\n\tkey: string,\n\tcreate: (socket: Socket) => (() => void) | undefined,\n): void {\n\tconst { socket, services } = React.useContext(RealtimeContext)\n\tonMount(() => {\n\t\tlet service = services?.get(key)\n\t\tif (service) {\n\t\t\tservice[0]++\n\t\t} else {\n\t\t\tconst dispose = socket ? create(socket) : undefined\n\t\t\tservice = [1, dispose]\n\t\t\tservices?.set(key, service)\n\t\t}\n\t\treturn () => {\n\t\t\tif (service) {\n\t\t\t\tservice[0]--\n\t\t\t\tif (service[0] === 0) {\n\t\t\t\t\tservice[1]?.()\n\t\t\t\t\tservices?.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\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): 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\tKey extends K,\n>(family: AtomIO.RegularAtomFamilyToken<J, K>, subKey: Key): 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, token),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\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 usePullMutable<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): 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, 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 usePullMutableAtomFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Canonical,\n\tKey extends K,\n>(familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(store, familyToken, key)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtomFamilyMember(store, socket, token),\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): 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<\n\tT,\n\tK extends Canonical,\n\tKey extends K,\n>(familyToken: AtomIO.SelectorFamilyToken<T, K>, key: Key): 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, token),\n\t)\n\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useI } 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 usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): <New extends J>(next: New | ((old: J) => New)) => void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`push:${token.key}`, (socket) =>\n\t\tRTC.pushState(store, socket, token),\n\t)\n\treturn useI(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Func } from \"atom.io/internal\"\nimport { actUponStore, arbitrary } from \"atom.io/internal\"\nimport { StoreContext } 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 useServerAction<F extends Func>(\n\ttoken: AtomIO.TransactionToken<F>,\n): (...parameters: Parameters<F>) => ReturnType<F> {\n\tconst store = React.useContext(StoreContext)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.serverAction(store, socket, token),\n\t)\n\treturn actUponStore(store, token, arbitrary())\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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"}
|