atom.io 0.15.4 → 0.15.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.
Files changed (108) hide show
  1. package/data/dist/index.cjs +20 -16
  2. package/data/dist/index.cjs.map +1 -1
  3. package/data/dist/index.js +21 -17
  4. package/data/dist/index.js.map +1 -1
  5. package/data/src/join.ts +6 -2
  6. package/dist/index.cjs +21 -6
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.ts +69 -18
  9. package/dist/index.js +157 -1
  10. package/dist/index.js.map +1 -1
  11. package/internal/dist/index.cjs +88 -146
  12. package/internal/dist/index.cjs.map +1 -1
  13. package/internal/dist/index.d.ts +29 -17
  14. package/internal/dist/index.js +79 -92
  15. package/internal/dist/index.js.map +1 -1
  16. package/internal/src/get-environment-data.ts +18 -0
  17. package/internal/src/index.ts +2 -0
  18. package/internal/src/ingest-updates/index.ts +3 -0
  19. package/internal/src/ingest-updates/ingest-atom-update.ts +14 -0
  20. package/internal/src/ingest-updates/ingest-selector-update.ts +17 -0
  21. package/internal/src/ingest-updates/ingest-transaction-update.ts +22 -0
  22. package/internal/src/mutable/tracker.ts +1 -1
  23. package/internal/src/not-found-error.ts +3 -8
  24. package/internal/src/operation.ts +3 -3
  25. package/internal/src/selector/create-read-write-selector.ts +5 -3
  26. package/internal/src/selector/create-readonly-selector.ts +2 -2
  27. package/internal/src/selector/register-selector.ts +6 -4
  28. package/internal/src/selector/update-selector-atoms.ts +2 -2
  29. package/internal/src/set-state/set-atom.ts +8 -3
  30. package/internal/src/store/deposit.ts +5 -5
  31. package/internal/src/store/withdraw-new-family-member.ts +8 -11
  32. package/internal/src/store/withdraw.ts +4 -3
  33. package/internal/src/subscribe/subscribe-to-state.ts +2 -2
  34. package/internal/src/timeline/time-travel.ts +18 -44
  35. package/internal/src/transaction/apply-transaction.ts +3 -49
  36. package/internal/src/transaction/build-transaction.ts +8 -1
  37. package/internal/src/transaction/create-transaction.ts +3 -3
  38. package/internal/src/transaction/index.ts +2 -2
  39. package/introspection/dist/index.cjs.map +1 -1
  40. package/introspection/dist/index.d.ts +4 -4
  41. package/introspection/dist/index.js.map +1 -1
  42. package/introspection/src/attach-atom-index.ts +2 -2
  43. package/introspection/src/attach-selector-index.ts +2 -2
  44. package/introspection/src/index.ts +1 -1
  45. package/package.json +8 -8
  46. package/react/dist/index.cjs.map +1 -1
  47. package/react/dist/index.d.ts +3 -3
  48. package/react/dist/index.js.map +1 -1
  49. package/react/src/store-hooks.ts +4 -4
  50. package/react-devtools/dist/index.cjs.map +1 -1
  51. package/react-devtools/dist/index.d.ts +3 -3
  52. package/react-devtools/dist/index.js.map +1 -1
  53. package/react-devtools/src/StateEditor.tsx +3 -3
  54. package/react-devtools/src/StateIndex.tsx +3 -3
  55. package/realtime-client/dist/index.cjs +67 -65
  56. package/realtime-client/dist/index.cjs.map +1 -1
  57. package/realtime-client/dist/index.d.ts +6 -5
  58. package/realtime-client/dist/index.js +62 -61
  59. package/realtime-client/dist/index.js.map +1 -1
  60. package/realtime-client/src/pull-family-member.ts +1 -1
  61. package/realtime-client/src/pull.ts +1 -1
  62. package/realtime-client/src/push.ts +2 -3
  63. package/realtime-client/src/realtime-state.ts +8 -0
  64. package/realtime-client/src/server-action.ts +65 -65
  65. package/realtime-react/dist/index.cjs +88 -52
  66. package/realtime-react/dist/index.cjs.map +1 -1
  67. package/realtime-react/dist/index.d.ts +11 -6
  68. package/realtime-react/dist/index.js +87 -51
  69. package/realtime-react/dist/index.js.map +1 -1
  70. package/realtime-react/src/on-mount.ts +23 -0
  71. package/realtime-react/src/realtime-context.tsx +12 -2
  72. package/realtime-react/src/use-pull-family-member.ts +5 -8
  73. package/realtime-react/src/use-pull-mutable-family-member.ts +4 -7
  74. package/realtime-react/src/use-pull-mutable.ts +4 -7
  75. package/realtime-react/src/use-pull.ts +5 -8
  76. package/realtime-react/src/use-push.ts +5 -9
  77. package/realtime-react/src/use-realtime-service.ts +30 -0
  78. package/realtime-react/src/use-server-action.ts +8 -8
  79. package/realtime-server/dist/index.cjs +109 -40
  80. package/realtime-server/dist/index.cjs.map +1 -1
  81. package/realtime-server/dist/index.d.ts +7 -6
  82. package/realtime-server/dist/index.js +90 -39
  83. package/realtime-server/dist/index.js.map +1 -1
  84. package/realtime-server/src/hook-composition/expose-family.ts +2 -2
  85. package/realtime-server/src/hook-composition/expose-mutable-family.ts +1 -1
  86. package/realtime-server/src/hook-composition/expose-single.ts +1 -1
  87. package/realtime-server/src/hook-composition/index.ts +2 -1
  88. package/realtime-server/src/hook-composition/receive-state.ts +2 -2
  89. package/realtime-server/src/hook-composition/receive-transaction.ts +13 -32
  90. package/realtime-server/src/hook-composition/sync-transaction.ts +92 -0
  91. package/realtime-testing/dist/index.cjs +3 -3
  92. package/realtime-testing/dist/index.cjs.map +1 -1
  93. package/realtime-testing/dist/index.js +2 -2
  94. package/realtime-testing/dist/index.js.map +1 -1
  95. package/realtime-testing/src/setup-realtime-test.tsx +4 -3
  96. package/src/atom.ts +30 -7
  97. package/src/dispose.ts +2 -2
  98. package/src/find-state.ts +64 -0
  99. package/src/get-state.ts +2 -2
  100. package/src/index.ts +15 -2
  101. package/src/logger.ts +1 -0
  102. package/src/selector.ts +16 -0
  103. package/src/set-state.ts +2 -2
  104. package/src/silo.ts +2 -2
  105. package/src/timeline.ts +2 -2
  106. package/src/transaction.ts +31 -12
  107. package/dist/chunk-RLZQ6IIY.js +0 -147
  108. package/dist/chunk-RLZQ6IIY.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import '../../dist/chunk-PZLG2HP3.js';
2
- import * as AtomIO4 from 'atom.io';
1
+ import { __spreadProps, __spreadValues } from '../../dist/chunk-PZLG2HP3.js';
2
+ import * as AtomIO6 from 'atom.io';
3
3
  import { setState } from 'atom.io';
4
4
  import * as Internal from 'atom.io/internal';
5
5
  import { IMPLICIT, getJsonToken, getUpdateToken, subscribeToState } from 'atom.io/internal';
@@ -17,7 +17,7 @@ var useExposeSingle = ({
17
17
  unsubscribeFromStateUpdates = null;
18
18
  };
19
19
  const fillSubRequest = () => {
20
- socket.emit(`serve:${token.key}`, AtomIO4.getState(token, store));
20
+ socket.emit(`serve:${token.key}`, AtomIO6.getState(token, store));
21
21
  unsubscribeFromStateUpdates = Internal.subscribeToState(
22
22
  token,
23
23
  ({ newValue }) => {
@@ -64,13 +64,13 @@ var useExposeFamily = ({
64
64
  const fillSubRequest = (subKey) => {
65
65
  var _a;
66
66
  if (subKey === void 0) {
67
- const keys = AtomIO4.getState(index, store);
67
+ const keys = AtomIO6.getState(index, store);
68
68
  for (const key of keys) {
69
69
  const token = family(key);
70
70
  socket.emit(
71
71
  `serve:${family.key}`,
72
72
  parseJson(((_a = token.family) == null ? void 0 : _a.subKey) || `null`),
73
- AtomIO4.getState(token, store)
73
+ AtomIO6.getState(token, store)
74
74
  );
75
75
  }
76
76
  const unsubscribeFromTokenCreation = subscribeToTokenCreation(
@@ -97,7 +97,7 @@ var useExposeFamily = ({
97
97
  socket.on(`unsub:${family.key}`, fillFamilyUnsubRequest);
98
98
  } else {
99
99
  const token = family(subKey);
100
- socket.emit(`serve:${token.key}`, AtomIO4.getState(token, store));
100
+ socket.emit(`serve:${token.key}`, AtomIO6.getState(token, store));
101
101
  const unsubscribe = subscribeToState(
102
102
  token,
103
103
  ({ newValue }) => {
@@ -140,7 +140,7 @@ var useExposeMutable = ({
140
140
  unsubscribeFromStateUpdates = null;
141
141
  };
142
142
  const fillSubRequest = () => {
143
- socket.emit(`init:${token.key}`, AtomIO4.getState(jsonToken, store));
143
+ socket.emit(`init:${token.key}`, AtomIO6.getState(jsonToken, store));
144
144
  unsubscribeFromStateUpdates = subscribeToState(
145
145
  trackerToken,
146
146
  ({ newValue }) => {
@@ -183,7 +183,7 @@ var useExposeMutableFamily = ({
183
183
  const fillSubRequest = (subKey) => {
184
184
  var _a;
185
185
  if (subKey === void 0) {
186
- const keys = AtomIO4.getState(index, store);
186
+ const keys = AtomIO6.getState(index, store);
187
187
  for (const key of keys) {
188
188
  const token = family(key);
189
189
  const jsonToken = getJsonToken(token);
@@ -191,7 +191,7 @@ var useExposeMutableFamily = ({
191
191
  socket.emit(
192
192
  `init:${family.key}`,
193
193
  parseJson(((_a = jsonToken.family) == null ? void 0 : _a.subKey) || `null`),
194
- AtomIO4.getState(jsonToken, store)
194
+ AtomIO6.getState(jsonToken, store)
195
195
  );
196
196
  const unsubFromUpdates = subscribeToState(
197
197
  trackerToken,
@@ -217,7 +217,7 @@ var useExposeMutableFamily = ({
217
217
  socket.emit(
218
218
  `init:${family.key}`,
219
219
  parseJson(((_a2 = jsonToken.family) == null ? void 0 : _a2.subKey) || `null`),
220
- AtomIO4.getState(jsonToken, store)
220
+ AtomIO6.getState(jsonToken, store)
221
221
  );
222
222
  const unsubFromUpdates = subscribeToState(
223
223
  trackerToken,
@@ -241,7 +241,7 @@ var useExposeMutableFamily = ({
241
241
  const token = family(subKey);
242
242
  const jsonToken = getJsonToken(token);
243
243
  const updateToken = getUpdateToken(token);
244
- socket.emit(`init:${token.key}`, AtomIO4.getState(jsonToken, store));
244
+ socket.emit(`init:${token.key}`, AtomIO6.getState(jsonToken, store));
245
245
  const unsubscribe = subscribeToState(
246
246
  updateToken,
247
247
  ({ newValue }) => {
@@ -270,34 +270,6 @@ var useExposeMutableFamily = ({
270
270
  };
271
271
  };
272
272
  };
273
- var useReceiveTransaction = ({ socket, store }) => {
274
- return function receiveTransaction(tx) {
275
- const fillTransactionRequest = (update) => AtomIO4.runTransaction(tx, store)(...update.params);
276
- socket.on(`tx:${tx.key}`, fillTransactionRequest);
277
- return () => socket.off(`tx:${tx.key}`, fillTransactionRequest);
278
- };
279
- };
280
- function useSyncTransaction({
281
- socket,
282
- store = Internal.IMPLICIT.STORE
283
- }) {
284
- return function receiveTransaction(tx) {
285
- const fillTransactionRequest = (update, transactionId) => {
286
- const unsubscribe = Internal.subscribeToTransaction(
287
- tx,
288
- (update2) => {
289
- unsubscribe();
290
- socket.emit(`tx:sync:${transactionId}`, update2);
291
- },
292
- `sync:${transactionId}`,
293
- store
294
- );
295
- AtomIO4.runTransaction(tx, store)(...update.params);
296
- };
297
- socket.on(`tx:${tx.key}`, fillTransactionRequest);
298
- return () => socket.off(`tx:${tx.key}`, fillTransactionRequest);
299
- };
300
- }
301
273
  var useReceiveState = ({ socket, store }) => {
302
274
  return function receiveState(token) {
303
275
  const publish = (newValue) => setState(token, newValue, store);
@@ -316,6 +288,85 @@ var useReceiveState = ({ socket, store }) => {
316
288
  };
317
289
  };
318
290
  };
291
+ var useReceiveTransaction = ({ socket, store }) => {
292
+ return function receiveTransaction(tx) {
293
+ const fillTransactionRequest = (update) => {
294
+ const performanceKey = `tx-run:${tx.key}:${update.id}`;
295
+ const performanceKeyStart = `${performanceKey}:start`;
296
+ const performanceKeyEnd = `${performanceKey}:end`;
297
+ performance.mark(performanceKeyStart);
298
+ AtomIO6.runTransaction(tx, store)(...update.params);
299
+ performance.mark(performanceKeyEnd);
300
+ const metric = performance.measure(
301
+ performanceKey,
302
+ performanceKeyStart,
303
+ performanceKeyEnd
304
+ );
305
+ store == null ? void 0 : store.logger.info(`\u{1F680}`, `transaction`, tx.key, update.id, metric.duration);
306
+ };
307
+ socket.on(`tx-run:${tx.key}`, fillTransactionRequest);
308
+ return () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest);
309
+ };
310
+ };
311
+ var completeUpdateAtoms = AtomIO6.atomFamily({
312
+ key: `completeUpdate`,
313
+ default: null
314
+ });
315
+ var transactionRedactorAtoms = AtomIO6.atomFamily({
316
+ key: `transactionRedactor`,
317
+ default: { filter: (updates) => updates }
318
+ });
319
+ var redactedUpdateSelectors = AtomIO6.selectorFamily({
320
+ key: `redactedUpdate`,
321
+ get: ([transactionKey, updateId]) => ({ get, find }) => {
322
+ const update = get(find(completeUpdateAtoms, updateId));
323
+ const { filter } = get(find(transactionRedactorAtoms, transactionKey));
324
+ if (update && filter) {
325
+ return __spreadProps(__spreadValues({}, update), { updates: filter(update.updates) });
326
+ }
327
+ return null;
328
+ }
329
+ });
330
+ function useSyncTransaction({
331
+ socket,
332
+ store = Internal.IMPLICIT.STORE
333
+ }) {
334
+ return function syncTransaction(tx, filter) {
335
+ if (filter) {
336
+ AtomIO6.setState(
337
+ AtomIO6.findState(transactionRedactorAtoms, tx.key),
338
+ { filter },
339
+ store
340
+ );
341
+ }
342
+ const fillTransactionRequest = (update) => {
343
+ AtomIO6.runTransaction(tx, store, update.id)(...update.params);
344
+ };
345
+ socket.on(`tx-run:${tx.key}`, fillTransactionRequest);
346
+ const fillTransactionSubscriptionRequest = () => {
347
+ const unsubscribe = Internal.subscribeToTransaction(
348
+ tx,
349
+ (update) => {
350
+ unsubscribe();
351
+ const updateState = AtomIO6.findState(completeUpdateAtoms, update.id);
352
+ AtomIO6.setState(updateState, update, store);
353
+ const toEmit = filter ? AtomIO6.getState(
354
+ AtomIO6.findState(redactedUpdateSelectors, [tx.key, update.id]),
355
+ store
356
+ ) : update;
357
+ socket.emit(`tx-new:${tx.key}`, toEmit);
358
+ },
359
+ `tx-sub:${tx.key}:${socket.id}`,
360
+ store
361
+ );
362
+ socket.on(`tx-unsub:${tx.key}`, unsubscribe);
363
+ };
364
+ socket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest);
365
+ return () => {
366
+ socket.off(`tx-run:${tx.key}`, fillTransactionRequest);
367
+ };
368
+ };
369
+ }
319
370
 
320
371
  export { useExposeFamily, useExposeMutable, useExposeMutableFamily, useExposeSingle, useReceiveState, useReceiveTransaction, useSyncTransaction };
321
372
  //# sourceMappingURL=out.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hook-composition/expose-single.ts","../src/hook-composition/expose-family.ts","../src/hook-composition/expose-mutable.ts","../src/hook-composition/expose-mutable-family.ts","../src/hook-composition/receive-transaction.ts","../src/hook-composition/receive-state.ts"],"names":["AtomIO","IMPLICIT","subscribeToState","_a","getJsonToken","getUpdateToken","parseJson","Internal","update"],"mappings":"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","sourcesContent":["import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeSingle = ({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeSingle<J extends Json.Serializable>(\n\t\ttoken: AtomIO.StateToken<J>,\n\t): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\tunsubscribeFromStateUpdates = Internal.subscribeToState(\n\t\t\t\ttoken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nconst subscribeToTokenCreation = <T>(\n\tfamily: AtomIO.AtomFamily<T> | AtomIO.SelectorFamily<T>,\n\tkey: string,\n\thandleTokenCreation: (token: AtomIO.StateToken<T>) => void,\n): (() => void) => {\n\tconst unsubscribe =\n\t\tfamily.type === `atom_family`\n\t\t\t? family.subject.subscribe(key, handleTokenCreation)\n\t\t\t: family.subject.subscribe(key, handleTokenCreation)\n\treturn unsubscribe\n}\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeFamily<J extends Json.Serializable>(\n\t\tfamily: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,\n\t\tindex: AtomIO.StateToken<Set<string>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: Json.Serializable) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(token, store),\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst unsubscribeFromTokenCreation = subscribeToTokenCreation(\n\t\t\t\t\tfamily,\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst unsub = subscribeToState(\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsub)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\ttoken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeMutable = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutable<\n\t\tCore extends Transceiver<Json.Serializable>,\n\t\tSerializableCore extends Json.Serializable,\n\t>(token: AtomIO.MutableAtomToken<Core, SerializableCore>): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst jsonToken = getJsonToken(token)\n\t\tconst trackerToken = getUpdateToken(token)\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttrackerToken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nexport const useExposeMutableFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutableFamily<\n\t\tFamily extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<Json.Serializable>,\n\t\t\tJson.Serializable,\n\t\t\tJson.Serializable\n\t\t>,\n\t>(family: Family, index: AtomIO.StateToken<Set<string>>): () => void {\n\t\ttype FamilyKey = Family extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<any>,\n\t\t\tany,\n\t\t\tinfer Key\n\t\t>\n\t\t\t? Key\n\t\t\t: never\n\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: FamilyKey) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t)\n\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t}\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\n\nexport const useReceiveTransaction = ({ socket, store }: ServerConfig) => {\n\treturn function receiveTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) =>\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\n\t\tsocket.on(`tx:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx:${tx.key}`, fillTransactionRequest)\n\t}\n}\n\nexport function useSyncTransaction({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function receiveTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (\n\t\t\tupdate: AtomIO.TransactionUpdate<ƒ>,\n\t\t\ttransactionId: string,\n\t\t) => {\n\t\t\tconst unsubscribe = Internal.subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tunsubscribe()\n\t\t\t\t\tsocket.emit(`tx:sync:${transactionId}`, update)\n\t\t\t\t},\n\t\t\t\t`sync:${transactionId}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\t\t}\n\n\t\tsocket.on(`tx:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { StateToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useReceiveState = ({ socket, store }: ServerConfig) => {\n\treturn function receiveState<J extends Json.Serializable>(\n\t\ttoken: StateToken<J>,\n\t): () => void {\n\t\tconst publish = (newValue: J) => setState(token, newValue, store)\n\n\t\tconst fillPubUnclaim = () => {\n\t\t\tsocket.off(`pub:${token.key}`, publish)\n\t\t\tsocket.off(`unclaim:${token.key}`, fillPubUnclaim)\n\t\t}\n\t\tconst fillPubClaim = () => {\n\t\t\tsocket.on(`pub:${token.key}`, publish)\n\t\t\tsocket.on(`unclaim:${token.key}`, fillPubUnclaim)\n\t\t}\n\n\t\tsocket.on(`claim:${token.key}`, fillPubClaim)\n\n\t\treturn () => {\n\t\t\tsocket.off(`claim:${token.key}`, fillPubClaim)\n\t\t\tsocket.off(`pub:${token.key}`, publish)\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../src/hook-composition/expose-single.ts","../src/hook-composition/expose-family.ts","../src/hook-composition/expose-mutable.ts","../src/hook-composition/expose-mutable-family.ts","../src/hook-composition/receive-state.ts","../src/hook-composition/receive-transaction.ts","../src/hook-composition/sync-transaction.ts"],"names":["AtomIO","IMPLICIT","subscribeToState","_a","getJsonToken","getUpdateToken","parseJson","Internal"],"mappings":"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","sourcesContent":["import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeSingle = ({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeSingle<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<J>,\n\t): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\tunsubscribeFromStateUpdates = Internal.subscribeToState(\n\t\t\t\ttoken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nconst subscribeToTokenCreation = <T>(\n\tfamily: AtomIO.AtomFamily<T> | AtomIO.SelectorFamily<T>,\n\tkey: string,\n\thandleTokenCreation: (token: AtomIO.WritableToken<T>) => void,\n): (() => void) => {\n\tconst unsubscribe =\n\t\tfamily.type === `atom_family`\n\t\t\t? family.subject.subscribe(key, handleTokenCreation)\n\t\t\t: family.subject.subscribe(key, handleTokenCreation)\n\treturn unsubscribe\n}\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeFamily<J extends Json.Serializable>(\n\t\tfamily: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,\n\t\tindex: AtomIO.WritableToken<Set<string>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: Json.Serializable) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(token, store),\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst unsubscribeFromTokenCreation = subscribeToTokenCreation(\n\t\t\t\t\tfamily,\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst unsub = subscribeToState(\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsub)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\ttoken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeMutable = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutable<\n\t\tCore extends Transceiver<Json.Serializable>,\n\t\tSerializableCore extends Json.Serializable,\n\t>(token: AtomIO.MutableAtomToken<Core, SerializableCore>): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst jsonToken = getJsonToken(token)\n\t\tconst trackerToken = getUpdateToken(token)\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttrackerToken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nexport const useExposeMutableFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutableFamily<\n\t\tFamily extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<Json.Serializable>,\n\t\t\tJson.Serializable,\n\t\t\tJson.Serializable\n\t\t>,\n\t>(family: Family, index: AtomIO.WritableToken<Set<string>>): () => void {\n\t\ttype FamilyKey = Family extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<any>,\n\t\t\tany,\n\t\t\tinfer Key\n\t\t>\n\t\t\t? Key\n\t\t\t: never\n\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: FamilyKey) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t)\n\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t}\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { WritableToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useReceiveState = ({ socket, store }: ServerConfig) => {\n\treturn function receiveState<J extends Json.Serializable>(\n\t\ttoken: WritableToken<J>,\n\t): () => void {\n\t\tconst publish = (newValue: J) => setState(token, newValue, store)\n\n\t\tconst fillPubUnclaim = () => {\n\t\t\tsocket.off(`pub:${token.key}`, publish)\n\t\t\tsocket.off(`unclaim:${token.key}`, fillPubUnclaim)\n\t\t}\n\t\tconst fillPubClaim = () => {\n\t\t\tsocket.on(`pub:${token.key}`, publish)\n\t\t\tsocket.on(`unclaim:${token.key}`, fillPubUnclaim)\n\t\t}\n\n\t\tsocket.on(`claim:${token.key}`, fillPubClaim)\n\n\t\treturn () => {\n\t\t\tsocket.off(`claim:${token.key}`, fillPubClaim)\n\t\t\tsocket.off(`pub:${token.key}`, publish)\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\n\nimport type { ServerConfig } from \".\"\n\nexport const useReceiveTransaction = ({ socket, store }: ServerConfig) => {\n\treturn function receiveTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tconst performanceKey = `tx-run:${tx.key}:${update.id}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\t\t\tperformance.mark(performanceKeyEnd)\n\t\t\tconst metric = performance.measure(\n\t\t\t\tperformanceKey,\n\t\t\t\tperformanceKeyStart,\n\t\t\t\tperformanceKeyEnd,\n\t\t\t)\n\t\t\tstore?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\n\nconst completeUpdateAtoms = AtomIO.atomFamily<\n\tAtomIO.TransactionUpdate<any> | null,\n\tstring\n>({\n\tkey: `completeUpdate`,\n\tdefault: null,\n})\n\nconst transactionRedactorAtoms = AtomIO.atomFamily<\n\t{\n\t\tfilter: (\n\t\t\tupdates: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[]\n\t},\n\tstring\n>({\n\tkey: `transactionRedactor`,\n\tdefault: { filter: (updates) => updates },\n})\n\nconst redactedUpdateSelectors = AtomIO.selectorFamily<\n\tAtomIO.TransactionUpdate<any> | null,\n\t[transactionKey: string, updateId: string]\n>({\n\tkey: `redactedUpdate`,\n\tget:\n\t\t([transactionKey, updateId]) =>\n\t\t({ get, find }) => {\n\t\t\tconst update = get(find(completeUpdateAtoms, updateId))\n\t\t\tconst { filter } = get(find(transactionRedactorAtoms, transactionKey))\n\n\t\t\tif (update && filter) {\n\t\t\t\treturn { ...update, updates: filter(update.updates) }\n\t\t\t}\n\t\t\treturn null\n\t\t},\n})\n\nexport function useSyncTransaction({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function syncTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t\tfilter?: (\n\t\t\tupdate: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[],\n\t): () => void {\n\t\tif (filter) {\n\t\t\tAtomIO.setState(\n\t\t\t\tAtomIO.findState(transactionRedactorAtoms, tx.key),\n\t\t\t\t{ filter },\n\t\t\t\tstore,\n\t\t\t)\n\t\t}\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store, update.id)(...update.params)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\tconst fillTransactionSubscriptionRequest = () => {\n\t\t\tconst unsubscribe = Internal.subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tunsubscribe()\n\t\t\t\t\tconst updateState = AtomIO.findState(completeUpdateAtoms, update.id)\n\t\t\t\t\tAtomIO.setState(updateState, update, store)\n\t\t\t\t\tconst toEmit = filter\n\t\t\t\t\t\t? AtomIO.getState(\n\t\t\t\t\t\t\t\tAtomIO.findState(redactedUpdateSelectors, [tx.key, update.id]),\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: update\n\t\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit)\n\t\t\t\t},\n\t\t\t\t`tx-sub:${tx.key}:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`tx-unsub:${tx.key}`, unsubscribe)\n\t\t}\n\t\tsocket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\t}\n\t}\n}\n"]}
@@ -8,7 +8,7 @@ import type { ServerConfig } from ".."
8
8
  const subscribeToTokenCreation = <T>(
9
9
  family: AtomIO.AtomFamily<T> | AtomIO.SelectorFamily<T>,
10
10
  key: string,
11
- handleTokenCreation: (token: AtomIO.StateToken<T>) => void,
11
+ handleTokenCreation: (token: AtomIO.WritableToken<T>) => void,
12
12
  ): (() => void) => {
13
13
  const unsubscribe =
14
14
  family.type === `atom_family`
@@ -24,7 +24,7 @@ export const useExposeFamily = ({
24
24
  }: ServerConfig) => {
25
25
  return function exposeFamily<J extends Json.Serializable>(
26
26
  family: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,
27
- index: AtomIO.StateToken<Set<string>>,
27
+ index: AtomIO.WritableToken<Set<string>>,
28
28
  ): () => void {
29
29
  const unsubSingleCallbacksByKey = new Map<string, () => void>()
30
30
  const unsubFamilyCallbacksByKey = new Map<string, () => void>()
@@ -21,7 +21,7 @@ export const useExposeMutableFamily = ({
21
21
  Json.Serializable,
22
22
  Json.Serializable
23
23
  >,
24
- >(family: Family, index: AtomIO.StateToken<Set<string>>): () => void {
24
+ >(family: Family, index: AtomIO.WritableToken<Set<string>>): () => void {
25
25
  type FamilyKey = Family extends AtomIO.MutableAtomFamily<
26
26
  Transceiver<any>,
27
27
  any,
@@ -10,7 +10,7 @@ export const useExposeSingle = ({
10
10
  store = Internal.IMPLICIT.STORE,
11
11
  }: ServerConfig) => {
12
12
  return function exposeSingle<J extends Json.Serializable>(
13
- token: AtomIO.StateToken<J>,
13
+ token: AtomIO.WritableToken<J>,
14
14
  ): () => void {
15
15
  let unsubscribeFromStateUpdates: (() => void) | null = null
16
16
 
@@ -5,8 +5,9 @@ export * from "./expose-single"
5
5
  export * from "./expose-family"
6
6
  export * from "./expose-mutable"
7
7
  export * from "./expose-mutable-family"
8
- export * from "./receive-transaction"
9
8
  export * from "./receive-state"
9
+ export * from "./receive-transaction"
10
+ export * from "./sync-transaction"
10
11
 
11
12
  export type ServerConfig = {
12
13
  socket: SocketIO.Socket
@@ -1,5 +1,5 @@
1
1
  import { setState } from "atom.io"
2
- import type { StateToken } from "atom.io"
2
+ import type { WritableToken } from "atom.io"
3
3
  import type { Json } from "atom.io/json"
4
4
 
5
5
  import type { ServerConfig } from ".."
@@ -7,7 +7,7 @@ import type { ServerConfig } from ".."
7
7
  /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
8
8
  export const useReceiveState = ({ socket, store }: ServerConfig) => {
9
9
  return function receiveState<J extends Json.Serializable>(
10
- token: StateToken<J>,
10
+ token: WritableToken<J>,
11
11
  ): () => void {
12
12
  const publish = (newValue: J) => setState(token, newValue, store)
13
13
 
@@ -1,5 +1,4 @@
1
1
  import * as AtomIO from "atom.io"
2
- import * as Internal from "atom.io/internal"
3
2
 
4
3
  import type { ServerConfig } from "."
5
4
 
@@ -7,40 +6,22 @@ export const useReceiveTransaction = ({ socket, store }: ServerConfig) => {
7
6
  return function receiveTransaction<ƒ extends AtomIO.ƒn>(
8
7
  tx: AtomIO.TransactionToken<ƒ>,
9
8
  ): () => void {
10
- const fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) =>
9
+ const fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {
10
+ const performanceKey = `tx-run:${tx.key}:${update.id}`
11
+ const performanceKeyStart = `${performanceKey}:start`
12
+ const performanceKeyEnd = `${performanceKey}:end`
13
+ performance.mark(performanceKeyStart)
11
14
  AtomIO.runTransaction<ƒ>(tx, store)(...update.params)
12
-
13
- socket.on(`tx:${tx.key}`, fillTransactionRequest)
14
-
15
- return () => socket.off(`tx:${tx.key}`, fillTransactionRequest)
16
- }
17
- }
18
-
19
- export function useSyncTransaction({
20
- socket,
21
- store = Internal.IMPLICIT.STORE,
22
- }: ServerConfig) {
23
- return function receiveTransaction<ƒ extends AtomIO.ƒn>(
24
- tx: AtomIO.TransactionToken<ƒ>,
25
- ): () => void {
26
- const fillTransactionRequest = (
27
- update: AtomIO.TransactionUpdate<ƒ>,
28
- transactionId: string,
29
- ) => {
30
- const unsubscribe = Internal.subscribeToTransaction(
31
- tx,
32
- (update) => {
33
- unsubscribe()
34
- socket.emit(`tx:sync:${transactionId}`, update)
35
- },
36
- `sync:${transactionId}`,
37
- store,
15
+ performance.mark(performanceKeyEnd)
16
+ const metric = performance.measure(
17
+ performanceKey,
18
+ performanceKeyStart,
19
+ performanceKeyEnd,
38
20
  )
39
- AtomIO.runTransaction<ƒ>(tx, store)(...update.params)
21
+ store?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)
40
22
  }
23
+ socket.on(`tx-run:${tx.key}`, fillTransactionRequest)
41
24
 
42
- socket.on(`tx:${tx.key}`, fillTransactionRequest)
43
-
44
- return () => socket.off(`tx:${tx.key}`, fillTransactionRequest)
25
+ return () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest)
45
26
  }
46
27
  }
@@ -0,0 +1,92 @@
1
+ import * as AtomIO from "atom.io"
2
+ import * as Internal from "atom.io/internal"
3
+
4
+ import type { ServerConfig } from "."
5
+
6
+ const completeUpdateAtoms = AtomIO.atomFamily<
7
+ AtomIO.TransactionUpdate<any> | null,
8
+ string
9
+ >({
10
+ key: `completeUpdate`,
11
+ default: null,
12
+ })
13
+
14
+ const transactionRedactorAtoms = AtomIO.atomFamily<
15
+ {
16
+ filter: (
17
+ updates: AtomIO.TransactionUpdateContent[],
18
+ ) => AtomIO.TransactionUpdateContent[]
19
+ },
20
+ string
21
+ >({
22
+ key: `transactionRedactor`,
23
+ default: { filter: (updates) => updates },
24
+ })
25
+
26
+ const redactedUpdateSelectors = AtomIO.selectorFamily<
27
+ AtomIO.TransactionUpdate<any> | null,
28
+ [transactionKey: string, updateId: string]
29
+ >({
30
+ key: `redactedUpdate`,
31
+ get:
32
+ ([transactionKey, updateId]) =>
33
+ ({ get, find }) => {
34
+ const update = get(find(completeUpdateAtoms, updateId))
35
+ const { filter } = get(find(transactionRedactorAtoms, transactionKey))
36
+
37
+ if (update && filter) {
38
+ return { ...update, updates: filter(update.updates) }
39
+ }
40
+ return null
41
+ },
42
+ })
43
+
44
+ export function useSyncTransaction({
45
+ socket,
46
+ store = Internal.IMPLICIT.STORE,
47
+ }: ServerConfig) {
48
+ return function syncTransaction<ƒ extends AtomIO.ƒn>(
49
+ tx: AtomIO.TransactionToken<ƒ>,
50
+ filter?: (
51
+ update: AtomIO.TransactionUpdateContent[],
52
+ ) => AtomIO.TransactionUpdateContent[],
53
+ ): () => void {
54
+ if (filter) {
55
+ AtomIO.setState(
56
+ AtomIO.findState(transactionRedactorAtoms, tx.key),
57
+ { filter },
58
+ store,
59
+ )
60
+ }
61
+ const fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {
62
+ AtomIO.runTransaction<ƒ>(tx, store, update.id)(...update.params)
63
+ }
64
+ socket.on(`tx-run:${tx.key}`, fillTransactionRequest)
65
+
66
+ const fillTransactionSubscriptionRequest = () => {
67
+ const unsubscribe = Internal.subscribeToTransaction(
68
+ tx,
69
+ (update) => {
70
+ unsubscribe()
71
+ const updateState = AtomIO.findState(completeUpdateAtoms, update.id)
72
+ AtomIO.setState(updateState, update, store)
73
+ const toEmit = filter
74
+ ? AtomIO.getState(
75
+ AtomIO.findState(redactedUpdateSelectors, [tx.key, update.id]),
76
+ store,
77
+ )
78
+ : update
79
+ socket.emit(`tx-new:${tx.key}`, toEmit)
80
+ },
81
+ `tx-sub:${tx.key}:${socket.id}`,
82
+ store,
83
+ )
84
+ socket.on(`tx-unsub:${tx.key}`, unsubscribe)
85
+ }
86
+ socket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)
87
+
88
+ return () => {
89
+ socket.off(`tx-run:${tx.key}`, fillTransactionRequest)
90
+ }
91
+ }
92
+ }
@@ -5,7 +5,7 @@ var react = require('@testing-library/react');
5
5
  var AtomIO = require('atom.io');
6
6
  var Internal = require('atom.io/internal');
7
7
  var AR = require('atom.io/react');
8
- var RTC = require('atom.io/realtime-react');
8
+ var RTR = require('atom.io/realtime-react');
9
9
  var Happy = require('happy-dom');
10
10
  var SocketIO = require('socket.io');
11
11
  var socket_ioClient = require('socket.io-client');
@@ -33,7 +33,7 @@ var http__namespace = /*#__PURE__*/_interopNamespace(http);
33
33
  var AtomIO__namespace = /*#__PURE__*/_interopNamespace(AtomIO);
34
34
  var Internal__namespace = /*#__PURE__*/_interopNamespace(Internal);
35
35
  var AR__namespace = /*#__PURE__*/_interopNamespace(AR);
36
- var RTC__namespace = /*#__PURE__*/_interopNamespace(RTC);
36
+ var RTR__namespace = /*#__PURE__*/_interopNamespace(RTR);
37
37
  var Happy__namespace = /*#__PURE__*/_interopNamespace(Happy);
38
38
  var SocketIO__namespace = /*#__PURE__*/_interopNamespace(SocketIO);
39
39
 
@@ -87,7 +87,7 @@ var setupRealtimeTestClient = (options, name, port) => {
87
87
  const { document } = new Happy__namespace.Window();
88
88
  document.body.innerHTML = `<div id="app"></div>`;
89
89
  const renderResult = react.render(
90
- /* @__PURE__ */ jsxRuntime.jsx(AR__namespace.StoreProvider, { store: silo.store, children: /* @__PURE__ */ jsxRuntime.jsx(RTC__namespace.RealtimeProvider, { socket, children: /* @__PURE__ */ jsxRuntime.jsx(options.client, {}) }) }),
90
+ /* @__PURE__ */ jsxRuntime.jsx(AR__namespace.StoreProvider, { store: silo.store, children: /* @__PURE__ */ jsxRuntime.jsx(RTR__namespace.RealtimeProvider, { socket, children: /* @__PURE__ */ jsxRuntime.jsx(options.client, {}) }) }),
91
91
  {
92
92
  container: document.querySelector(`#app`)
93
93
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/setup-realtime-test.tsx","../../../anvl/src/object/entries.ts"],"names":["clients"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,YAAY,UAAU;AAEtB,SAA4B,WAAW,cAAc;AACrD,YAAY,YAAY;AACxB,YAAY,cAAc;AAC1B,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,YAAY,WAAW;AAEvB,YAAY,cAAc;AAE1B,SAAS,UAAU;;;ACTZ,IAAM,kBAAkB,CAC9B,QACmB,OAAO,QAAQ,GAAG;;;AD2FlC;AAxCG,IAAM,0BAA0B,CACtC,YACwB;AACxB,QAAM,aAAkB,kBAAa,CAAC,GAAG,QAAQ,IAAI,IAAI,cAAc,CAAC;AACxE,QAAM,UAAU,WAAW,OAAO,EAAE,QAAQ;AAC5C,QAAM,OACL,OAAO,YAAY,WAAW,KAAK,YAAY,OAAO,OAAO,QAAQ;AACtE,MAAI,SAAS;AAAM,UAAM,IAAI,MAAM,0CAA0C;AAC7E,QAAM,SAAS,IAAa,gBAAO,UAAU;AAC7C,QAAM,OAAO,IAAW,YAAK,UAAmB,kBAAS,KAAK;AAE9D,SAAO,GAAG,cAAc,CAAC,WAA4B;AACpD,YAAQ,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,EAChC,CAAC;AAED,QAAM,UAAU,MAAM;AACrB,WAAO,MAAM;AACb,IAAS,oBAAW,KAAK,KAAK;AAAA,EAC/B;AAEA,SAAO;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AACO,IAAM,0BAA0B,CACtC,SACA,MACA,SACwB;AACxB,QAAM,SAAuB,GAAG,oBAAoB,IAAI,GAAG;AAC3D,QAAM,OAAO,IAAW,YAAK,MAAe,kBAAS,KAAK;AAE1D,QAAM,EAAE,SAAS,IAAI,IAAU,aAAO;AACtC,WAAS,KAAK,YAAY;AAC1B,QAAM,eAAe;AAAA,IACpB,oBAAI,kBAAH,EAAiB,OAAO,KAAK,OAC7B,8BAAK,sBAAJ,EAAqB,QACrB,8BAAC,QAAQ,QAAR,EAAe,GACjB,GACD;AAAA,IACA;AAAA,MACC,WAAW,SAAS,cAAc,MAAM;AAAA,IACzC;AAAA,EACD;AAEA,QAAM,cAAc,MAAM,QAAQ,IAAI,UAAU,aAAa,SAAS,CAAC;AAEvE,QAAM,aAAa,MAAM,OAAO,WAAW;AAC3C,QAAM,YAAY,MAAM,OAAO,QAAQ;AAEvC,QAAM,UAAU,MAAM;AACrB,WAAO,WAAW;AAClB,IAAS,oBAAW,KAAK,KAAK;AAAA,EAC/B;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAEO,IAAM,eAAe,CAC3B,YACmC;AACnC,QAAM,SAAS,wBAAwB,OAAO;AAC9C,QAAM,SAAS,wBAAwB,SAAS,UAAU,OAAO,IAAI;AAErE,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU,MAAM;AACf,aAAO,QAAQ;AACf,aAAO,QAAQ;AAAA,IAChB;AAAA,EACD;AACD;AAEO,IAAM,cAAc,CAC1B,YAC+C;AAC/C,QAAM,SAAS,wBAAwB,OAAO;AAC9C,QAAM,UAAU,gBAAgB,QAAQ,OAAO,EAAE;AAAA,IAChD,CAACA,UAAS,CAAC,MAAM,MAAM,MAAM;AAC5B,MAAAA,SAAQ,IAAI,IAAI;AAAA,QACf,iCAAK,UAAL,EAAc,OAAO;AAAA,QACrB;AAAA,QACA,OAAO;AAAA,MACR;AACA,aAAOA;AAAA,IACR;AAAA,IACA,CAAC;AAAA,EACF;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU,MAAM;AACf,iBAAW,CAAC,EAAE,MAAM,KAAK,gBAAgB,OAAO,GAAG;AAClD,eAAO,QAAQ;AAAA,MAChB;AACA,aAAO,QAAQ;AAAA,IAChB;AAAA,EACD;AACD","sourcesContent":["import * as http from \"http\"\n\nimport { type RenderResult, prettyDOM, render } from \"@testing-library/react\"\nimport * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport * as AR from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-react\"\nimport * as Happy from \"happy-dom\"\nimport * as React from \"react\"\nimport * as SocketIO from \"socket.io\"\nimport type { Socket as ClientSocket } from \"socket.io-client\"\nimport { io } from \"socket.io-client\"\n\nimport { recordToEntries } from \"~/packages/anvl/src/object\"\n\nexport type TestSetupOptions = {\n\tserver: (tools: { socket: SocketIO.Socket; silo: AtomIO.Silo }) => void\n}\nexport type TestSetupOptions__SingleClient = TestSetupOptions & {\n\tclient: React.FC\n}\nexport type TestSetupOptions__MultiClient<ClientNames extends string> =\n\tTestSetupOptions & {\n\t\tclients: {\n\t\t\t[K in ClientNames]: React.FC\n\t\t}\n\t}\n\nexport type RealtimeTestTools = {\n\tname: string\n\tsilo: AtomIO.Silo\n\tdispose: () => void\n}\nexport type RealtimeTestClient = RealtimeTestTools & {\n\trenderResult: RenderResult\n\tprettyPrint: () => void\n\treconnect: () => void\n\tdisconnect: () => void\n}\nexport type RealtimeTestServer = RealtimeTestTools & {\n\tport: number\n}\n\nexport type RealtimeTestAPI = {\n\tserver: RealtimeTestServer\n\tteardown: () => void\n}\nexport type RealtimeTestAPI__SingleClient = RealtimeTestAPI & {\n\tclient: RealtimeTestClient\n}\nexport type RealtimeTestAPI__MultiClient<ClientNames extends string> =\n\tRealtimeTestAPI & {\n\t\tclients: Record<ClientNames, RealtimeTestClient>\n\t}\n\nexport const setupRealtimeTestServer = (\n\toptions: TestSetupOptions,\n): RealtimeTestServer => {\n\tconst httpServer = http.createServer((_, res) => res.end(`Hello World!`))\n\tconst address = httpServer.listen().address()\n\tconst port =\n\t\ttypeof address === `string` ? 80 : address === null ? null : address.port\n\tif (port === null) throw new Error(`Could not determine port for test server`)\n\tconst server = new SocketIO.Server(httpServer)\n\tconst silo = new AtomIO.Silo(`SERVER`, Internal.IMPLICIT.STORE)\n\n\tserver.on(`connection`, (socket: SocketIO.Socket) => {\n\t\toptions.server({ socket, silo })\n\t})\n\n\tconst dispose = () => {\n\t\tserver.close()\n\t\tInternal.clearStore(silo.store)\n\t}\n\n\treturn {\n\t\tname: `SERVER`,\n\t\tsilo,\n\t\tdispose,\n\t\tport,\n\t}\n}\nexport const setupRealtimeTestClient = (\n\toptions: TestSetupOptions__SingleClient,\n\tname: string,\n\tport: number,\n): RealtimeTestClient => {\n\tconst socket: ClientSocket = io(`http://localhost:${port}/`)\n\tconst silo = new AtomIO.Silo(name, Internal.IMPLICIT.STORE)\n\n\tconst { document } = new Happy.Window()\n\tdocument.body.innerHTML = `<div id=\"app\"></div>`\n\tconst renderResult = render(\n\t\t<AR.StoreProvider store={silo.store}>\n\t\t\t<RTC.RealtimeProvider socket={socket}>\n\t\t\t\t<options.client />\n\t\t\t</RTC.RealtimeProvider>\n\t\t</AR.StoreProvider>,\n\t\t{\n\t\t\tcontainer: document.querySelector(`#app`) as unknown as HTMLElement,\n\t\t},\n\t)\n\n\tconst prettyPrint = () => console.log(prettyDOM(renderResult.container))\n\n\tconst disconnect = () => socket.disconnect()\n\tconst reconnect = () => socket.connect()\n\n\tconst dispose = () => {\n\t\tsocket.disconnect()\n\t\tInternal.clearStore(silo.store)\n\t}\n\n\treturn {\n\t\tname,\n\t\tsilo,\n\t\trenderResult,\n\t\tprettyPrint,\n\t\tdisconnect,\n\t\treconnect,\n\t\tdispose,\n\t}\n}\n\nexport const singleClient = (\n\toptions: TestSetupOptions__SingleClient,\n): RealtimeTestAPI__SingleClient => {\n\tconst server = setupRealtimeTestServer(options)\n\tconst client = setupRealtimeTestClient(options, `CLIENT`, server.port)\n\n\treturn {\n\t\tclient,\n\t\tserver,\n\t\tteardown: () => {\n\t\t\tclient.dispose()\n\t\t\tserver.dispose()\n\t\t},\n\t}\n}\n\nexport const multiClient = <ClientNames extends string>(\n\toptions: TestSetupOptions__MultiClient<ClientNames>,\n): RealtimeTestAPI__MultiClient<ClientNames> => {\n\tconst server = setupRealtimeTestServer(options)\n\tconst clients = recordToEntries(options.clients).reduce(\n\t\t(clients, [name, client]) => {\n\t\t\tclients[name] = setupRealtimeTestClient(\n\t\t\t\t{ ...options, client },\n\t\t\t\tname,\n\t\t\t\tserver.port,\n\t\t\t)\n\t\t\treturn clients\n\t\t},\n\t\t{} as Record<ClientNames, RealtimeTestClient>,\n\t)\n\n\treturn {\n\t\tclients,\n\t\tserver,\n\t\tteardown: () => {\n\t\t\tfor (const [, client] of recordToEntries(clients)) {\n\t\t\t\tclient.dispose()\n\t\t\t}\n\t\t\tserver.dispose()\n\t\t},\n\t}\n}\n","export type Entries<K extends keyof any, V> = [key: K, value: V][]\n\nexport const recordToEntries = <K extends keyof any, V>(\n\tobj: Record<K, V>,\n): Entries<K, V> => Object.entries(obj) as Entries<K, V>\n\nexport const entriesToRecord = <K extends keyof any, V>(\n\tentries: Entries<K, V>,\n): Record<K, V> => Object.fromEntries(entries) as Record<K, V>\n"]}
1
+ {"version":3,"sources":["../src/setup-realtime-test.tsx","../../../anvl/src/object/entries.ts"],"names":["clients"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,YAAY,UAAU;AAEtB,SAA4B,WAAW,cAAc;AACrD,YAAY,YAAY;AACxB,YAAY,cAAc;AAC1B,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,YAAY,WAAW;AAEvB,YAAY,cAAc;AAE1B,SAAS,UAAU;;;ACTZ,IAAM,kBAAkB,CAC9B,QACmB,OAAO,QAAQ,GAAG;;;AD4FlC;AAzCG,IAAM,0BAA0B,CACtC,YACwB;AACxB,QAAM,aAAkB,kBAAa,CAAC,GAAG,QAAQ,IAAI,IAAI,cAAc,CAAC;AACxE,QAAM,UAAU,WAAW,OAAO,EAAE,QAAQ;AAC5C,QAAM,OACL,OAAO,YAAY,WAAW,KAAK,YAAY,OAAO,OAAO,QAAQ;AACtE,MAAI,SAAS;AAAM,UAAM,IAAI,MAAM,0CAA0C;AAC7E,QAAM,SAAS,IAAa,gBAAO,UAAU;AAE7C,QAAM,OAAO,IAAW,YAAK,UAAmB,kBAAS,KAAK;AAE9D,SAAO,GAAG,cAAc,CAAC,WAA4B;AACpD,YAAQ,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,EAChC,CAAC;AAED,QAAM,UAAU,MAAM;AACrB,WAAO,MAAM;AACb,IAAS,oBAAW,KAAK,KAAK;AAAA,EAC/B;AAEA,SAAO;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AACO,IAAM,0BAA0B,CACtC,SACA,MACA,SACwB;AACxB,QAAM,SAAuB,GAAG,oBAAoB,IAAI,GAAG;AAC3D,QAAM,OAAO,IAAW,YAAK,MAAe,kBAAS,KAAK;AAE1D,QAAM,EAAE,SAAS,IAAI,IAAU,aAAO;AACtC,WAAS,KAAK,YAAY;AAC1B,QAAM,eAAe;AAAA,IACpB,oBAAI,kBAAH,EAAiB,OAAO,KAAK,OAC7B,8BAAK,sBAAJ,EAAqB,QACrB,8BAAC,QAAQ,QAAR,EAAe,GACjB,GACD;AAAA,IACA;AAAA,MACC,WAAW,SAAS,cAAc,MAAM;AAAA,IACzC;AAAA,EACD;AAEA,QAAM,cAAc,MAAM,QAAQ,IAAI,UAAU,aAAa,SAAS,CAAC;AAEvE,QAAM,aAAa,MAAM,OAAO,WAAW;AAC3C,QAAM,YAAY,MAAM,OAAO,QAAQ;AAEvC,QAAM,UAAU,MAAM;AACrB,WAAO,WAAW;AAClB,IAAS,oBAAW,KAAK,KAAK;AAAA,EAC/B;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAEO,IAAM,eAAe,CAC3B,YACmC;AACnC,QAAM,SAAS,wBAAwB,OAAO;AAC9C,QAAM,SAAS,wBAAwB,SAAS,UAAU,OAAO,IAAI;AAErE,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU,MAAM;AACf,aAAO,QAAQ;AACf,aAAO,QAAQ;AAAA,IAChB;AAAA,EACD;AACD;AAEO,IAAM,cAAc,CAC1B,YAC+C;AAC/C,QAAM,SAAS,wBAAwB,OAAO;AAC9C,QAAM,UAAU,gBAAgB,QAAQ,OAAO,EAAE;AAAA,IAChD,CAACA,UAAS,CAAC,MAAM,MAAM,MAAM;AAC5B,MAAAA,SAAQ,IAAI,IAAI;AAAA,QACf,iCAAK,UAAL,EAAc,OAAO;AAAA,QACrB;AAAA,QACA,OAAO;AAAA,MACR;AACA,aAAOA;AAAA,IACR;AAAA,IACA,CAAC;AAAA,EACF;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU,MAAM;AACf,iBAAW,CAAC,EAAE,MAAM,KAAK,gBAAgB,OAAO,GAAG;AAClD,eAAO,QAAQ;AAAA,MAChB;AACA,aAAO,QAAQ;AAAA,IAChB;AAAA,EACD;AACD","sourcesContent":["import * as http from \"http\"\n\nimport { type RenderResult, prettyDOM, render } from \"@testing-library/react\"\nimport * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport * as AR from \"atom.io/react\"\nimport * as RTR from \"atom.io/realtime-react\"\nimport * as Happy from \"happy-dom\"\nimport * as React from \"react\"\nimport * as SocketIO from \"socket.io\"\nimport type { Socket as ClientSocket } from \"socket.io-client\"\nimport { io } from \"socket.io-client\"\n\nimport { recordToEntries } from \"~/packages/anvl/src/object\"\n\nexport type TestSetupOptions = {\n\tserver: (tools: { socket: SocketIO.Socket; silo: AtomIO.Silo }) => void\n}\nexport type TestSetupOptions__SingleClient = TestSetupOptions & {\n\tclient: React.FC\n}\nexport type TestSetupOptions__MultiClient<ClientNames extends string> =\n\tTestSetupOptions & {\n\t\tclients: {\n\t\t\t[K in ClientNames]: React.FC\n\t\t}\n\t}\n\nexport type RealtimeTestTools = {\n\tname: string\n\tsilo: AtomIO.Silo\n\tdispose: () => void\n}\nexport type RealtimeTestClient = RealtimeTestTools & {\n\trenderResult: RenderResult\n\tprettyPrint: () => void\n\treconnect: () => void\n\tdisconnect: () => void\n}\nexport type RealtimeTestServer = RealtimeTestTools & {\n\tport: number\n}\n\nexport type RealtimeTestAPI = {\n\tserver: RealtimeTestServer\n\tteardown: () => void\n}\nexport type RealtimeTestAPI__SingleClient = RealtimeTestAPI & {\n\tclient: RealtimeTestClient\n}\nexport type RealtimeTestAPI__MultiClient<ClientNames extends string> =\n\tRealtimeTestAPI & {\n\t\tclients: Record<ClientNames, RealtimeTestClient>\n\t}\n\nexport const setupRealtimeTestServer = (\n\toptions: TestSetupOptions,\n): RealtimeTestServer => {\n\tconst httpServer = http.createServer((_, res) => res.end(`Hello World!`))\n\tconst address = httpServer.listen().address()\n\tconst port =\n\t\ttypeof address === `string` ? 80 : address === null ? null : address.port\n\tif (port === null) throw new Error(`Could not determine port for test server`)\n\tconst server = new SocketIO.Server(httpServer)\n\n\tconst silo = new AtomIO.Silo(`SERVER`, Internal.IMPLICIT.STORE)\n\n\tserver.on(`connection`, (socket: SocketIO.Socket) => {\n\t\toptions.server({ socket, silo })\n\t})\n\n\tconst dispose = () => {\n\t\tserver.close()\n\t\tInternal.clearStore(silo.store)\n\t}\n\n\treturn {\n\t\tname: `SERVER`,\n\t\tsilo,\n\t\tdispose,\n\t\tport,\n\t}\n}\nexport const setupRealtimeTestClient = (\n\toptions: TestSetupOptions__SingleClient,\n\tname: string,\n\tport: number,\n): RealtimeTestClient => {\n\tconst socket: ClientSocket = io(`http://localhost:${port}/`)\n\tconst silo = new AtomIO.Silo(name, Internal.IMPLICIT.STORE)\n\n\tconst { document } = new Happy.Window()\n\tdocument.body.innerHTML = `<div id=\"app\"></div>`\n\tconst renderResult = render(\n\t\t<AR.StoreProvider store={silo.store}>\n\t\t\t<RTR.RealtimeProvider socket={socket}>\n\t\t\t\t<options.client />\n\t\t\t</RTR.RealtimeProvider>\n\t\t</AR.StoreProvider>,\n\t\t{\n\t\t\tcontainer: document.querySelector(`#app`) as unknown as HTMLElement,\n\t\t},\n\t)\n\n\tconst prettyPrint = () => console.log(prettyDOM(renderResult.container))\n\n\tconst disconnect = () => socket.disconnect()\n\tconst reconnect = () => socket.connect()\n\n\tconst dispose = () => {\n\t\tsocket.disconnect()\n\t\tInternal.clearStore(silo.store)\n\t}\n\n\treturn {\n\t\tname,\n\t\tsilo,\n\t\trenderResult,\n\t\tprettyPrint,\n\t\tdisconnect,\n\t\treconnect,\n\t\tdispose,\n\t}\n}\n\nexport const singleClient = (\n\toptions: TestSetupOptions__SingleClient,\n): RealtimeTestAPI__SingleClient => {\n\tconst server = setupRealtimeTestServer(options)\n\tconst client = setupRealtimeTestClient(options, `CLIENT`, server.port)\n\n\treturn {\n\t\tclient,\n\t\tserver,\n\t\tteardown: () => {\n\t\t\tclient.dispose()\n\t\t\tserver.dispose()\n\t\t},\n\t}\n}\n\nexport const multiClient = <ClientNames extends string>(\n\toptions: TestSetupOptions__MultiClient<ClientNames>,\n): RealtimeTestAPI__MultiClient<ClientNames> => {\n\tconst server = setupRealtimeTestServer(options)\n\tconst clients = recordToEntries(options.clients).reduce(\n\t\t(clients, [name, client]) => {\n\t\t\tclients[name] = setupRealtimeTestClient(\n\t\t\t\t{ ...options, client },\n\t\t\t\tname,\n\t\t\t\tserver.port,\n\t\t\t)\n\t\t\treturn clients\n\t\t},\n\t\t{} as Record<ClientNames, RealtimeTestClient>,\n\t)\n\n\treturn {\n\t\tclients,\n\t\tserver,\n\t\tteardown: () => {\n\t\t\tfor (const [, client] of recordToEntries(clients)) {\n\t\t\t\tclient.dispose()\n\t\t\t}\n\t\t\tserver.dispose()\n\t\t},\n\t}\n}\n","export type Entries<K extends keyof any, V> = [key: K, value: V][]\n\nexport const recordToEntries = <K extends keyof any, V>(\n\tobj: Record<K, V>,\n): Entries<K, V> => Object.entries(obj) as Entries<K, V>\n\nexport const entriesToRecord = <K extends keyof any, V>(\n\tentries: Entries<K, V>,\n): Record<K, V> => Object.fromEntries(entries) as Record<K, V>\n"]}
@@ -5,7 +5,7 @@ import { render, prettyDOM } from '@testing-library/react';
5
5
  import * as AtomIO from 'atom.io';
6
6
  import * as Internal from 'atom.io/internal';
7
7
  import * as AR from 'atom.io/react';
8
- import * as RTC from 'atom.io/realtime-react';
8
+ import * as RTR from 'atom.io/realtime-react';
9
9
  import * as Happy from 'happy-dom';
10
10
  import * as SocketIO from 'socket.io';
11
11
  import { io } from 'socket.io-client';
@@ -39,7 +39,7 @@ var setupRealtimeTestClient = (options, name, port) => {
39
39
  const { document } = new Happy.Window();
40
40
  document.body.innerHTML = `<div id="app"></div>`;
41
41
  const renderResult = render(
42
- /* @__PURE__ */ jsx(AR.StoreProvider, { store: silo.store, children: /* @__PURE__ */ jsx(RTC.RealtimeProvider, { socket, children: /* @__PURE__ */ jsx(options.client, {}) }) }),
42
+ /* @__PURE__ */ jsx(AR.StoreProvider, { store: silo.store, children: /* @__PURE__ */ jsx(RTR.RealtimeProvider, { socket, children: /* @__PURE__ */ jsx(options.client, {}) }) }),
43
43
  {
44
44
  container: document.querySelector(`#app`)
45
45
  }