atom.io 0.14.3 → 0.14.5

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.
Files changed (92) hide show
  1. package/data/dist/index.cjs +47 -1416
  2. package/data/dist/index.cjs.map +1 -1
  3. package/data/dist/index.d.cts +8 -134
  4. package/data/dist/index.d.ts +8 -134
  5. package/data/dist/index.js +4 -6
  6. package/data/dist/index.js.map +1 -1
  7. package/dist/chunk-NYTGCPHB.js +261 -0
  8. package/dist/chunk-NYTGCPHB.js.map +1 -0
  9. package/dist/chunk-PZLG2HP3.js +36 -0
  10. package/dist/chunk-PZLG2HP3.js.map +1 -0
  11. package/dist/chunk-XACXFU3B.js +46 -0
  12. package/dist/chunk-XACXFU3B.js.map +1 -0
  13. package/dist/index.cjs +55 -2330
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.js +152 -1
  16. package/dist/index.js.map +1 -1
  17. package/internal/dist/index.cjs +30 -159
  18. package/internal/dist/index.cjs.map +1 -1
  19. package/internal/dist/index.d.cts +8 -211
  20. package/internal/dist/index.d.ts +8 -211
  21. package/internal/dist/index.js +2027 -1
  22. package/internal/dist/index.js.map +1 -1
  23. package/introspection/dist/index.cjs +45 -1565
  24. package/introspection/dist/index.cjs.map +1 -1
  25. package/introspection/dist/index.d.cts +2 -129
  26. package/introspection/dist/index.d.ts +2 -129
  27. package/introspection/dist/index.js +298 -2
  28. package/introspection/dist/index.js.map +1 -1
  29. package/json/dist/index.cjs +5 -1502
  30. package/json/dist/index.cjs.map +1 -1
  31. package/json/dist/index.d.cts +5 -131
  32. package/json/dist/index.d.ts +5 -131
  33. package/json/dist/index.js +37 -1
  34. package/json/dist/index.js.map +1 -1
  35. package/package.json +1 -2
  36. package/react/dist/index.cjs +30 -1571
  37. package/react/dist/index.cjs.map +1 -1
  38. package/react/dist/index.d.cts +8 -136
  39. package/react/dist/index.d.ts +8 -136
  40. package/react/dist/index.js +62 -2
  41. package/react/dist/index.js.map +1 -1
  42. package/react/src/store-hooks.ts +18 -20
  43. package/react-devtools/dist/index.cjs +135 -2153
  44. package/react-devtools/dist/index.cjs.map +1 -1
  45. package/react-devtools/dist/index.d.cts +20 -146
  46. package/react-devtools/dist/index.d.ts +20 -146
  47. package/react-devtools/dist/index.js +5 -3
  48. package/react-devtools/dist/index.js.map +1 -1
  49. package/realtime-client/dist/index.cjs +34 -1529
  50. package/realtime-client/dist/index.cjs.map +1 -1
  51. package/realtime-client/dist/index.d.cts +11 -138
  52. package/realtime-client/dist/index.d.ts +11 -138
  53. package/realtime-client/dist/index.js +165 -2
  54. package/realtime-client/dist/index.js.map +1 -1
  55. package/realtime-react/dist/index.cjs +35 -1727
  56. package/realtime-react/dist/index.cjs.map +1 -1
  57. package/realtime-react/dist/index.d.cts +7 -35
  58. package/realtime-react/dist/index.d.ts +7 -35
  59. package/realtime-react/dist/index.js +66 -4
  60. package/realtime-react/dist/index.js.map +1 -1
  61. package/realtime-server/dist/index.cjs +57 -1548
  62. package/realtime-server/dist/index.cjs.map +1 -1
  63. package/realtime-server/dist/index.d.cts +15 -153
  64. package/realtime-server/dist/index.d.ts +15 -153
  65. package/realtime-server/dist/index.js +21 -27
  66. package/realtime-server/dist/index.js.map +1 -1
  67. package/realtime-testing/dist/index.cjs +15 -2376
  68. package/realtime-testing/dist/index.cjs.map +1 -1
  69. package/realtime-testing/dist/index.d.cts +3 -489
  70. package/realtime-testing/dist/index.d.ts +3 -489
  71. package/realtime-testing/dist/index.js +10 -9
  72. package/realtime-testing/dist/index.js.map +1 -1
  73. package/transceivers/set-rtx/dist/index.cjs +9 -31
  74. package/transceivers/set-rtx/dist/index.cjs.map +1 -1
  75. package/transceivers/set-rtx/dist/index.d.cts +7 -7
  76. package/transceivers/set-rtx/dist/index.d.ts +7 -7
  77. package/transceivers/set-rtx/dist/index.js +3 -2
  78. package/transceivers/set-rtx/dist/index.js.map +1 -1
  79. package/dist/chunk-C4YZZNRH.js +0 -67
  80. package/dist/chunk-C4YZZNRH.js.map +0 -1
  81. package/dist/chunk-CWKKQKVQ.js +0 -68
  82. package/dist/chunk-CWKKQKVQ.js.map +0 -1
  83. package/dist/chunk-GMN5KH6A.js +0 -309
  84. package/dist/chunk-GMN5KH6A.js.map +0 -1
  85. package/dist/chunk-N7ADBQJG.js +0 -176
  86. package/dist/chunk-N7ADBQJG.js.map +0 -1
  87. package/dist/chunk-PURABO5G.js +0 -2581
  88. package/dist/chunk-PURABO5G.js.map +0 -1
  89. package/dist/index.d.cts +0 -493
  90. package/dist/index.d.ts +0 -493
  91. package/dist/metafile-cjs.json +0 -1
  92. package/dist/metafile-esm.json +0 -1
@@ -1,5 +1,10 @@
1
+ import * as AtomIO from 'atom.io';
2
+ import { FamilyMetadata, ƒn, TransactionUpdate, MutableAtomToken, AtomToken, StateToken, TimelineUpdate, StateUpdate, AtomFamily, ReadonlySelectorFamily, SelectorFamily, ReadonlySelectorToken, SelectorToken, TransactionToken, TimelineToken, AtomIOLogger, Logger } from 'atom.io';
1
3
  import { Socket } from 'socket.io-client';
2
4
 
5
+ declare const myIdState__INTERNAL: AtomIO.AtomToken<string | null>;
6
+ declare const myIdState: AtomIO.ReadonlySelectorToken<string | null>;
7
+
3
8
  declare class Subject<T> {
4
9
  Subscriber: (value: T) => void;
5
10
  subscribers: Map<string, this[`Subscriber`]>;
@@ -247,148 +252,16 @@ type Atom<T> = {
247
252
  cleanup?: () => void;
248
253
  };
249
254
 
250
- type AtomFamily<T, K extends Serializable = Serializable> = ((key: K) => AtomToken<T>) & {
251
- key: string;
252
- type: `atom_family`;
253
- subject: Subject<AtomToken<T>>;
254
- mutable?: boolean;
255
- };
256
-
257
- declare const LoggerIconDictionary: {
258
- readonly "\u231B": "Timeline event fully captured";
259
- readonly "\u23E9": "Timeline redo";
260
- readonly "\u23EA": "Timeline undo";
261
- readonly "\u23ED\uFE0F": "Transaction redo";
262
- readonly "\u23EE\uFE0F": "Transaction undo";
263
- readonly "\u23F3": "Timeline event partially captured";
264
- readonly "\u23F9\uFE0F": "Time-travel complete";
265
- readonly "\uD83D\uDC81": "Notice";
266
- readonly "\uD83D\uDD04": "Realtime transaction synchronized";
267
- readonly "\u2705": "Realtime transaction success";
268
- readonly "\u2728": "Computation complete";
269
- readonly "\u274C": "Conflict prevents attempted action";
270
- readonly "\u2B55": "Operation start";
271
- readonly "\uD83D\uDC1E": "Possible bug in AtomIO";
272
- readonly "\uD83D\uDC40": "Subscription added";
273
- readonly "\uD83D\uDC6A": "Family member added";
274
- readonly "\uD83D\uDCC1": "Stow update";
275
- readonly "\uD83D\uDCC3": "Copy mutable";
276
- readonly "\uD83D\uDCD6": "Read state";
277
- readonly "\uD83D\uDCDD": "Write state";
278
- readonly "\uD83D\uDCE2": "Notify subscribers";
279
- readonly "\uD83D\uDD0C": "Register dependency";
280
- readonly "\uD83D\uDD0D": "Discover root";
281
- readonly "\uD83D\uDD25": "Delete state";
282
- readonly "\uD83D\uDD27": "Create mutable atom";
283
- readonly "\uD83D\uDD28": "Create immutable atom";
284
- readonly "\uD83D\uDD34": "Operation complete";
285
- readonly "\uD83D\uDDD1": "Evict cached value";
286
- readonly "\uD83D\uDCA5": "Caught";
287
- readonly "\uD83D\uDE48": "Subscription canceled";
288
- readonly "\uD83D\uDEC4": "Apply transaction";
289
- readonly "\uD83D\uDEE0\uFE0F": "Install atom into store";
290
- readonly "\uD83D\uDEEB": "Begin transaction";
291
- readonly "\uD83D\uDEEC": "Complete transaction";
292
- readonly "\uD83E\uDDEE": "Computing selector";
293
- readonly "\uD83E\uDDF9": "Prepare to evict";
294
- readonly "\uD83E\uDE82": "Abort transaction";
295
- };
296
- type LoggerIcon = keyof typeof LoggerIconDictionary;
297
- declare const LOG_LEVELS: readonly ["info", "warn", "error"];
298
- type LogLevel = (typeof LOG_LEVELS)[number];
299
- type LogFn = (icon: LoggerIcon, tokenType: `atom` | `readonly_selector` | `selector` | `state` | `timeline` | `transaction` | `unknown`, tokenKey: string, message: string, ...rest: unknown[]) => void;
300
- type LogFilter = (...params: Parameters<LogFn>) => boolean;
301
- type Logger = Record<LogLevel, LogFn>;
302
- declare class AtomIOLogger implements Logger {
303
- logLevel: `error` | `info` | `warn` | null;
304
- private readonly filter?;
305
- private readonly logger;
306
- constructor(logLevel: `error` | `info` | `warn` | null, filter?: LogFilter | undefined, logger?: Logger);
307
- error: LogFn;
308
- info: LogFn;
309
- warn: LogFn;
310
- }
311
-
312
- type TransactionToken<_> = {
313
- key: string;
314
- type: `transaction`;
315
- __brand?: _;
316
- };
317
- type TransactionUpdate<ƒ extends ƒn> = {
318
- key: string;
319
- updates: (KeyedStateUpdate<unknown> | TransactionUpdate<ƒn>)[];
320
- params: Parameters<ƒ>;
321
- output: ReturnType<ƒ>;
322
- };
323
-
324
- type SelectorFamily<T, K extends Serializable = Serializable> = ((key: K) => SelectorToken<T>) & {
325
- key: string;
326
- type: `selector_family`;
327
- subject: Subject<SelectorToken<T>>;
328
- };
329
- type ReadonlySelectorFamily<T, K extends Serializable = Serializable> = ((key: K) => ReadonlySelectorToken<T>) & {
330
- key: string;
331
- type: `readonly_selector_family`;
332
- subject: Subject<ReadonlySelectorToken<T>>;
333
- };
334
-
335
- type StateUpdate<T> = {
336
- newValue: T;
337
- oldValue: T;
338
- };
339
- type KeyedStateUpdate<T> = StateUpdate<T> & {
340
- key: string;
341
- family?: FamilyMetadata;
342
- };
343
-
344
- type TimelineToken = {
345
- key: string;
346
- type: `timeline`;
347
- };
348
- type TimelineUpdate = TimelineAtomUpdate | TimelineSelectorUpdate | TimelineTransactionUpdate;
349
-
350
- type ƒn = (...parameters: any[]) => any;
351
- type AtomToken<_> = {
352
- key: string;
353
- type: `atom`;
354
- family?: FamilyMetadata;
355
- __brand?: _;
356
- };
357
- interface MutableAtomToken<T extends Transceiver<any>, J extends Serializable> extends AtomToken<T> {
358
- __asJSON?: J;
359
- __update?: T extends Transceiver<infer Update> ? Update : never;
360
- }
361
- type SelectorToken<_> = {
362
- key: string;
363
- type: `selector`;
364
- family?: FamilyMetadata;
365
- __brand?: _;
366
- };
367
- type StateToken<T> = AtomToken<T> | SelectorToken<T>;
368
- type ReadonlySelectorToken<_> = {
369
- key: string;
370
- type: `readonly_selector`;
371
- family?: FamilyMetadata;
372
- __brand?: _;
373
- };
374
- type FamilyMetadata = {
375
- key: string;
376
- subKey: string;
377
- };
378
-
379
- declare const myIdState__INTERNAL: AtomToken<string | null>;
380
- declare const myIdState: ReadonlySelectorToken<string | null>;
381
-
382
- declare function pullState<J extends Serializable>(token: StateToken<J>, socket: Socket, store: Store): () => void;
255
+ declare function pullState<J extends Serializable>(token: AtomIO.StateToken<J>, socket: Socket, store: Store): () => void;
383
256
 
384
- declare function pullFamilyMember<J extends Serializable>(token: AtomToken<J>, socket: Socket, store: Store): () => void;
257
+ declare function pullFamilyMember<J extends Serializable>(token: AtomIO.AtomToken<J>, socket: Socket, store: Store): () => void;
385
258
 
386
- declare function pullMutableState<T extends Transceiver<Serializable>, J extends Serializable>(token: MutableAtomToken<T, J>, socket: Socket, store: Store): () => void;
259
+ declare function pullMutableState<T extends Transceiver<Serializable>, J extends Serializable>(token: AtomIO.MutableAtomToken<T, J>, socket: Socket, store: Store): () => void;
387
260
 
388
- declare function pullMutableFamilyMember<T extends Transceiver<Serializable>, J extends Serializable>(token: MutableAtomToken<T, J>, socket: Socket, store: Store): () => void;
261
+ declare function pullMutableFamilyMember<T extends Transceiver<Serializable>, J extends Serializable>(token: AtomIO.MutableAtomToken<T, J>, socket: Socket, store: Store): () => void;
389
262
 
390
- declare function pushState<J extends Serializable>(token: StateToken<J>, socket: Socket, subscriptionKey: string, store: Store): () => void;
263
+ declare function pushState<J extends Serializable>(token: AtomIO.StateToken<J>, socket: Socket, subscriptionKey: string, store: Store): () => void;
391
264
 
392
- declare function synchronizeTransactionResults(token: TransactionToken<any>, socket: Socket, store: Store): () => void;
265
+ declare function synchronizeTransactionResults(token: AtomIO.TransactionToken<any>, socket: Socket, store: Store): () => void;
393
266
 
394
267
  export { myIdState, myIdState__INTERNAL, pullFamilyMember, pullMutableFamilyMember, pullMutableState, pullState, pushState, synchronizeTransactionResults };
@@ -1,4 +1,167 @@
1
- export { myIdState, myIdState__INTERNAL, pullFamilyMember, pullMutableFamilyMember, pullMutableState, pullState, pushState, synchronizeTransactionResults } from '../../dist/chunk-N7ADBQJG.js';
2
- import '../../dist/chunk-PURABO5G.js';
1
+ import '../../dist/chunk-PZLG2HP3.js';
2
+ import * as AtomIO from 'atom.io';
3
+ import { parseJson } from 'atom.io/json';
4
+ import * as Internal from 'atom.io/internal';
5
+ import { getJsonToken, getUpdateToken } from 'atom.io/internal';
6
+
7
+ var myIdState__INTERNAL = AtomIO.atom({
8
+ key: `myId__INTERNAL`,
9
+ default: null
10
+ });
11
+ var myIdState = AtomIO.selector({
12
+ key: `myId`,
13
+ get: ({ get }) => get(myIdState__INTERNAL)
14
+ });
15
+ function pullState(token, socket, store) {
16
+ socket.on(`serve:${token.key}`, (data) => {
17
+ AtomIO.setState(token, data, store);
18
+ });
19
+ socket.emit(`sub:${token.key}`);
20
+ return () => {
21
+ socket.off(`serve:${token.key}`);
22
+ socket.emit(`unsub:${token.key}`);
23
+ };
24
+ }
25
+ function pullFamilyMember(token, socket, store) {
26
+ if (!(`family` in token)) {
27
+ console.error(`Token is not a family member:`, token);
28
+ return () => {
29
+ };
30
+ }
31
+ const { key: familyKey, subKey: serializedSubKey } = token.family;
32
+ const subKey = parseJson(serializedSubKey);
33
+ socket == null ? void 0 : socket.on(`serve:${token.key}`, (data) => {
34
+ AtomIO.setState(token, data, store);
35
+ });
36
+ socket == null ? void 0 : socket.emit(`sub:${familyKey}`, subKey);
37
+ return () => {
38
+ socket == null ? void 0 : socket.off(`serve:${token.key}`);
39
+ socket == null ? void 0 : socket.emit(`unsub:${token.key}`);
40
+ };
41
+ }
42
+ function pullMutableState(token, socket, store) {
43
+ const jsonToken = getJsonToken(token);
44
+ const updateToken = getUpdateToken(token);
45
+ socket.on(`init:${token.key}`, (data) => {
46
+ AtomIO.setState(jsonToken, data, store);
47
+ });
48
+ socket.on(
49
+ `next:${token.key}`,
50
+ (data) => {
51
+ AtomIO.setState(updateToken, data, store);
52
+ }
53
+ );
54
+ socket.emit(`sub:${token.key}`);
55
+ return () => {
56
+ socket.off(`init:${token.key}`);
57
+ socket.off(`next:${token.key}`);
58
+ socket.emit(`unsub:${token.key}`);
59
+ };
60
+ }
61
+ function pullMutableFamilyMember(token, socket, store) {
62
+ if (!(`family` in token)) {
63
+ console.error(`Token is not a family member:`, token);
64
+ return () => {
65
+ };
66
+ }
67
+ const { key: familyKey, subKey: serializedSubKey } = token.family;
68
+ const subKey = parseJson(serializedSubKey);
69
+ socket == null ? void 0 : socket.on(`init:${token.key}`, (data) => {
70
+ const jsonToken = getJsonToken(token);
71
+ AtomIO.setState(jsonToken, data, store);
72
+ });
73
+ socket == null ? void 0 : socket.on(
74
+ `next:${token.key}`,
75
+ (data) => {
76
+ const trackerToken = getUpdateToken(token);
77
+ AtomIO.setState(trackerToken, data, store);
78
+ }
79
+ );
80
+ socket == null ? void 0 : socket.emit(`sub:${familyKey}`, subKey);
81
+ return () => {
82
+ socket == null ? void 0 : socket.off(`serve:${token.key}`);
83
+ socket == null ? void 0 : socket.emit(`unsub:${token.key}`);
84
+ };
85
+ }
86
+ function pushState(token, socket, subscriptionKey, store) {
87
+ socket.emit(`claim:${token.key}`);
88
+ Internal.subscribeToState(
89
+ token,
90
+ ({ newValue }) => {
91
+ socket.emit(`pub:${token.key}`, newValue);
92
+ },
93
+ subscriptionKey,
94
+ store
95
+ );
96
+ return () => {
97
+ socket.off(`pub:${token.key}`);
98
+ socket.emit(`unclaim:${token.key}`);
99
+ };
100
+ }
101
+ var TX_SUBS = /* @__PURE__ */ new Map();
102
+ function synchronizeTransactionResults(token, socket, store) {
103
+ var _a;
104
+ const count = (_a = TX_SUBS.get(token.key)) != null ? _a : 0;
105
+ TX_SUBS.set(token.key, count + 1);
106
+ const unsubscribe = count === 0 ? Internal.subscribeToTransaction(
107
+ token,
108
+ (clientUpdate) => {
109
+ const transactionId = Math.random().toString(36).slice(2);
110
+ const clientResult = JSON.stringify(clientUpdate);
111
+ const topic = `tx:sync:${transactionId}`;
112
+ const sync = (serverUpdate) => {
113
+ store.logger.info(
114
+ `\u{1F504}`,
115
+ `transaction`,
116
+ token.key,
117
+ `syncing client and server`
118
+ );
119
+ socket.off(topic, sync);
120
+ const serverResult = JSON.stringify(serverUpdate);
121
+ if (clientResult !== serverResult) {
122
+ store.logger.error(
123
+ `\u274C`,
124
+ `transaction`,
125
+ token.key,
126
+ `results do not match between client and server`
127
+ );
128
+ store.logger.error(
129
+ `\u274C`,
130
+ `transaction`,
131
+ token.key,
132
+ `client:`,
133
+ clientResult
134
+ );
135
+ store.logger.error(
136
+ `\u274C`,
137
+ `transaction`,
138
+ token.key,
139
+ `server:`,
140
+ serverResult
141
+ );
142
+ } else {
143
+ store.logger.info(
144
+ `\u2705`,
145
+ `transaction`,
146
+ token.key,
147
+ `results match between client and server`
148
+ );
149
+ }
150
+ };
151
+ socket.on(topic, sync);
152
+ socket.emit(`tx:${token.key}`, clientUpdate, transactionId);
153
+ },
154
+ `use-server-action`,
155
+ store
156
+ ) : () => null;
157
+ return () => {
158
+ var _a2;
159
+ const newCount = (_a2 = TX_SUBS.get(token.key)) != null ? _a2 : 0;
160
+ TX_SUBS.set(token.key, newCount - 1);
161
+ unsubscribe();
162
+ };
163
+ }
164
+
165
+ export { myIdState, myIdState__INTERNAL, pullFamilyMember, pullMutableFamilyMember, pullMutableState, pullState, pushState, synchronizeTransactionResults };
3
166
  //# sourceMappingURL=out.js.map
4
167
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":""}
1
+ {"version":3,"sources":["../src/realtime-state.ts","../src/use-pull.ts","../src/use-pull-family-member.ts","../src/use-pull-mutable.ts","../src/use-pull-mutable-family-member.ts","../src/use-push.ts","../src/use-server-action.ts"],"names":["AtomIO","getJsonToken","getUpdateToken","parseJson","Internal","_a"],"mappings":"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","sourcesContent":["import * as AtomIO from \"atom.io\"\n\nexport const myIdState__INTERNAL = AtomIO.atom<string | null>({\n\tkey: `myId__INTERNAL`,\n\tdefault: null,\n})\nexport const myIdState = AtomIO.selector<string | null>({\n\tkey: `myId`,\n\tget: ({ get }) => get(myIdState__INTERNAL),\n})\n","import * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullState<J extends Json.Serializable>(\n\ttoken: AtomIO.StateToken<J>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tsocket.on(`serve:${token.key}`, (data) => {\n\t\tAtomIO.setState(token, data, store)\n\t})\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport 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\nexport function pullFamilyMember<J extends Json.Serializable>(\n\ttoken: AtomIO.AtomToken<J>,\n\tsocket: Socket,\n\tstore: Store,\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\tAtomIO.setState(token, data, store)\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 * as AtomIO from \"atom.io\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableState<\n\tT extends Transceiver<Json.Serializable>,\n\tJ extends Json.Serializable,\n>(\n\ttoken: AtomIO.MutableAtomToken<T, J>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tconst jsonToken = getJsonToken(token)\n\tconst updateToken = getUpdateToken(token)\n\tsocket.on(`init:${token.key}`, (data: J) => {\n\t\tAtomIO.setState(jsonToken, data, store)\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\tAtomIO.setState(updateToken, data, store)\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 * as AtomIO from \"atom.io\"\nimport { getJsonToken, getUpdateToken } from \"atom.io/internal\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableFamilyMember<\n\tT extends Transceiver<Json.Serializable>,\n\tJ extends Json.Serializable,\n>(\n\ttoken: AtomIO.MutableAtomToken<T, J>,\n\tsocket: Socket,\n\tstore: Store,\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(token)\n\t\tAtomIO.setState(jsonToken, data, store)\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\tAtomIO.setState(trackerToken, data, store)\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 * 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\ttoken: AtomIO.StateToken<J>,\n\tsocket: Socket,\n\tsubscriptionKey: string,\n\tstore: Internal.Store,\n): () => void {\n\tsocket.emit(`claim:${token.key}`)\n\tInternal.subscribeToState(\n\t\ttoken,\n\t\t({ newValue }) => {\n\t\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t\t},\n\t\tsubscriptionKey,\n\t\tstore,\n\t)\n\treturn () => {\n\t\tsocket.off(`pub:${token.key}`)\n\t\tsocket.emit(`unclaim:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nconst TX_SUBS = new Map<string, number>()\nexport function synchronizeTransactionResults(\n\ttoken: AtomIO.TransactionToken<any>,\n\tsocket: Socket,\n\tstore: Internal.Store,\n): () => void {\n\tconst count = TX_SUBS.get(token.key) ?? 0\n\tTX_SUBS.set(token.key, count + 1)\n\tconst unsubscribe =\n\t\tcount === 0\n\t\t\t? Internal.subscribeToTransaction(\n\t\t\t\t\ttoken,\n\t\t\t\t\t(clientUpdate) => {\n\t\t\t\t\t\tconst transactionId = Math.random().toString(36).slice(2)\n\t\t\t\t\t\tconst clientResult = JSON.stringify(clientUpdate)\n\t\t\t\t\t\tconst topic = `tx:sync:${transactionId}`\n\t\t\t\t\t\tconst sync = (serverUpdate: typeof clientUpdate) => {\n\t\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t\t`🔄`,\n\t\t\t\t\t\t\t\t`transaction`,\n\t\t\t\t\t\t\t\ttoken.key,\n\t\t\t\t\t\t\t\t`syncing client and server`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tsocket.off(topic, sync)\n\t\t\t\t\t\t\tconst serverResult = JSON.stringify(serverUpdate)\n\t\t\t\t\t\t\tif (clientResult !== serverResult) {\n\t\t\t\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t\t\t\t`transaction`,\n\t\t\t\t\t\t\t\t\ttoken.key,\n\t\t\t\t\t\t\t\t\t`results do not match between client and server`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t\t\t\t`transaction`,\n\t\t\t\t\t\t\t\t\ttoken.key,\n\t\t\t\t\t\t\t\t\t`client:`,\n\t\t\t\t\t\t\t\t\tclientResult,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t\t\t\t`transaction`,\n\t\t\t\t\t\t\t\t\ttoken.key,\n\t\t\t\t\t\t\t\t\t`server:`,\n\t\t\t\t\t\t\t\t\tserverResult,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t\t\t`✅`,\n\t\t\t\t\t\t\t\t\t`transaction`,\n\t\t\t\t\t\t\t\t\ttoken.key,\n\t\t\t\t\t\t\t\t\t`results match between client and server`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsocket.on(topic, sync)\n\t\t\t\t\t\tsocket.emit(`tx:${token.key}`, clientUpdate, transactionId)\n\t\t\t\t\t},\n\t\t\t\t\t`use-server-action`,\n\t\t\t\t\tstore,\n\t\t\t )\n\t\t\t: () => null\n\treturn () => {\n\t\tconst newCount = TX_SUBS.get(token.key) ?? 0\n\t\tTX_SUBS.set(token.key, newCount - 1)\n\t\tunsubscribe()\n\t}\n}\n"]}