atom.io 0.6.9 → 0.8.0

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 (170) hide show
  1. package/README.md +21 -2
  2. package/dist/index.d.mts +34 -421
  3. package/dist/index.d.ts +34 -421
  4. package/dist/index.js +248 -23
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +209 -4
  7. package/dist/index.mjs.map +1 -1
  8. package/internal/dist/index.d.mts +364 -0
  9. package/internal/dist/index.d.ts +364 -0
  10. package/internal/dist/index.js +1906 -0
  11. package/internal/dist/index.js.map +1 -0
  12. package/internal/dist/index.mjs +1830 -0
  13. package/internal/dist/index.mjs.map +1 -0
  14. package/internal/package.json +15 -0
  15. package/internal/src/atom/create-atom.ts +75 -0
  16. package/internal/src/atom/delete-atom.ts +10 -0
  17. package/internal/src/atom/index.ts +3 -0
  18. package/internal/src/atom/is-default.ts +37 -0
  19. package/internal/src/caching.ts +38 -0
  20. package/internal/src/families/create-atom-family.ts +59 -0
  21. package/internal/src/families/create-readonly-selector-family.ts +45 -0
  22. package/internal/src/families/create-selector-family.ts +67 -0
  23. package/internal/src/families/index.ts +3 -0
  24. package/internal/src/future.ts +39 -0
  25. package/internal/src/get-state-internal.ts +23 -0
  26. package/internal/src/index.ts +14 -0
  27. package/internal/src/mutable/create-mutable-atom-family.ts +25 -0
  28. package/internal/src/mutable/create-mutable-atom.ts +49 -0
  29. package/internal/src/mutable/get-json-token.ts +22 -0
  30. package/internal/src/mutable/get-update-token.ts +20 -0
  31. package/internal/src/mutable/index.ts +17 -0
  32. package/internal/src/mutable/is-atom-token-mutable.ts +7 -0
  33. package/internal/src/mutable/tracker-family.ts +61 -0
  34. package/internal/src/mutable/tracker.ts +164 -0
  35. package/internal/src/mutable/transceiver.ts +110 -0
  36. package/internal/src/operation.ts +68 -0
  37. package/internal/src/selector/create-read-write-selector.ts +65 -0
  38. package/internal/src/selector/create-readonly-selector.ts +49 -0
  39. package/internal/src/selector/create-selector.ts +65 -0
  40. package/internal/src/selector/index.ts +5 -0
  41. package/internal/src/selector/lookup-selector-sources.ts +20 -0
  42. package/internal/src/selector/register-selector.ts +61 -0
  43. package/internal/src/selector/trace-selector-atoms.ts +45 -0
  44. package/internal/src/selector/update-selector-atoms.ts +34 -0
  45. package/internal/src/set-state/become.ts +10 -0
  46. package/internal/src/set-state/copy-mutable-if-needed.ts +23 -0
  47. package/internal/src/set-state/copy-mutable-in-transaction.ts +59 -0
  48. package/internal/src/set-state/copy-mutable-into-new-store.ts +34 -0
  49. package/internal/src/set-state/emit-update.ts +23 -0
  50. package/internal/src/set-state/evict-downstream.ts +39 -0
  51. package/internal/src/set-state/index.ts +2 -0
  52. package/internal/src/set-state/set-atom-state.ts +38 -0
  53. package/internal/src/set-state/set-selector-state.ts +19 -0
  54. package/internal/src/set-state/set-state-internal.ts +18 -0
  55. package/internal/src/set-state/stow-update.ts +42 -0
  56. package/internal/src/store/deposit.ts +43 -0
  57. package/internal/src/store/index.ts +5 -0
  58. package/internal/src/store/lookup.ts +26 -0
  59. package/internal/src/store/store.ts +154 -0
  60. package/internal/src/store/withdraw-new-family-member.ts +53 -0
  61. package/internal/src/store/withdraw.ts +113 -0
  62. package/internal/src/subject.ts +21 -0
  63. package/internal/src/subscribe/index.ts +1 -0
  64. package/internal/src/subscribe/recall-state.ts +19 -0
  65. package/internal/src/subscribe/subscribe-to-root-atoms.ts +47 -0
  66. package/internal/src/timeline/add-atom-to-timeline.ts +189 -0
  67. package/internal/src/timeline/index.ts +3 -0
  68. package/internal/src/timeline/time-travel-internal.ts +91 -0
  69. package/internal/src/timeline/timeline-internal.ts +115 -0
  70. package/internal/src/transaction/abort-transaction.ts +12 -0
  71. package/internal/src/transaction/apply-transaction.ts +64 -0
  72. package/internal/src/transaction/build-transaction.ts +39 -0
  73. package/internal/src/transaction/index.ts +26 -0
  74. package/internal/src/transaction/redo-transaction.ts +22 -0
  75. package/internal/src/transaction/transaction-internal.ts +64 -0
  76. package/internal/src/transaction/undo-transaction.ts +22 -0
  77. package/introspection/dist/index.d.mts +3 -197
  78. package/introspection/dist/index.d.ts +3 -197
  79. package/introspection/dist/index.js +329 -4
  80. package/introspection/dist/index.js.map +1 -1
  81. package/introspection/dist/index.mjs +310 -4
  82. package/introspection/dist/index.mjs.map +1 -1
  83. package/introspection/src/attach-atom-index.ts +84 -0
  84. package/introspection/src/attach-introspection-states.ts +38 -0
  85. package/introspection/src/attach-selector-index.ts +90 -0
  86. package/introspection/src/attach-timeline-family.ts +59 -0
  87. package/introspection/src/attach-timeline-index.ts +38 -0
  88. package/introspection/src/attach-transaction-index.ts +40 -0
  89. package/introspection/src/attach-transaction-logs.ts +43 -0
  90. package/introspection/src/index.ts +20 -0
  91. package/json/dist/index.d.mts +10 -2
  92. package/json/dist/index.d.ts +10 -2
  93. package/json/dist/index.js +83 -26
  94. package/json/dist/index.js.map +1 -1
  95. package/json/dist/index.mjs +74 -3
  96. package/json/dist/index.mjs.map +1 -1
  97. package/json/src/index.ts +5 -0
  98. package/json/src/select-json-family.ts +35 -0
  99. package/json/src/select-json.ts +22 -0
  100. package/package.json +103 -63
  101. package/react/dist/index.d.mts +9 -17
  102. package/react/dist/index.d.ts +9 -17
  103. package/react/dist/index.js +44 -27
  104. package/react/dist/index.js.map +1 -1
  105. package/react/dist/index.mjs +24 -4
  106. package/react/dist/index.mjs.map +1 -1
  107. package/react/src/index.ts +2 -0
  108. package/react/src/store-context.tsx +12 -0
  109. package/react/src/store-hooks.ts +36 -0
  110. package/react-devtools/dist/index.css +50 -1
  111. package/react-devtools/dist/index.css.map +1 -1
  112. package/react-devtools/dist/index.d.mts +104 -71
  113. package/react-devtools/dist/index.d.ts +104 -71
  114. package/react-devtools/dist/index.js +2821 -45
  115. package/react-devtools/dist/index.js.map +1 -1
  116. package/react-devtools/dist/index.mjs +2790 -11
  117. package/react-devtools/dist/index.mjs.map +1 -1
  118. package/react-devtools/src/AtomIODevtools.tsx +109 -0
  119. package/react-devtools/src/Button.tsx +23 -0
  120. package/react-devtools/src/StateEditor.tsx +75 -0
  121. package/react-devtools/src/StateIndex.tsx +159 -0
  122. package/react-devtools/src/TimelineIndex.tsx +88 -0
  123. package/react-devtools/src/TransactionIndex.tsx +70 -0
  124. package/react-devtools/src/Updates.tsx +150 -0
  125. package/react-devtools/src/devtools.scss +310 -0
  126. package/react-devtools/src/index.ts +72 -0
  127. package/realtime-react/dist/index.d.mts +8 -22
  128. package/realtime-react/dist/index.d.ts +8 -22
  129. package/realtime-react/dist/index.js +87 -32
  130. package/realtime-react/dist/index.js.map +1 -1
  131. package/realtime-react/dist/index.mjs +62 -6
  132. package/realtime-react/dist/index.mjs.map +1 -1
  133. package/realtime-react/src/index.ts +7 -0
  134. package/realtime-react/src/realtime-context.tsx +29 -0
  135. package/realtime-react/src/use-pull-family-member.ts +15 -0
  136. package/realtime-react/src/use-pull-mutable-family-member.ts +20 -0
  137. package/realtime-react/src/use-pull-mutable.ts +17 -0
  138. package/realtime-react/src/use-pull.ts +15 -0
  139. package/realtime-react/src/use-push.ts +19 -0
  140. package/realtime-react/src/use-server-action.ts +18 -0
  141. package/realtime-testing/dist/index.d.mts +49 -0
  142. package/realtime-testing/dist/index.d.ts +49 -0
  143. package/realtime-testing/dist/index.js +147 -0
  144. package/realtime-testing/dist/index.js.map +1 -0
  145. package/realtime-testing/dist/index.mjs +116 -0
  146. package/realtime-testing/dist/index.mjs.map +1 -0
  147. package/realtime-testing/src/index.ts +1 -0
  148. package/realtime-testing/src/setup-realtime-test.tsx +161 -0
  149. package/src/atom.ts +64 -9
  150. package/src/index.ts +29 -31
  151. package/src/logger.ts +3 -3
  152. package/src/selector.ts +3 -3
  153. package/src/silo.ts +29 -20
  154. package/src/subscribe.ts +3 -3
  155. package/src/timeline.ts +2 -2
  156. package/transceivers/set-rtx/dist/index.d.mts +39 -0
  157. package/transceivers/set-rtx/dist/index.d.ts +39 -0
  158. package/transceivers/set-rtx/dist/index.js +213 -0
  159. package/transceivers/set-rtx/dist/index.js.map +1 -0
  160. package/transceivers/set-rtx/dist/index.mjs +211 -0
  161. package/transceivers/set-rtx/dist/index.mjs.map +1 -0
  162. package/{realtime → transceivers/set-rtx}/package.json +1 -1
  163. package/transceivers/set-rtx/src/index.ts +1 -0
  164. package/transceivers/set-rtx/src/set-rtx.ts +242 -0
  165. package/realtime/dist/index.d.mts +0 -23
  166. package/realtime/dist/index.d.ts +0 -23
  167. package/realtime/dist/index.js +0 -32
  168. package/realtime/dist/index.js.map +0 -1
  169. package/realtime/dist/index.mjs +0 -7
  170. package/realtime/dist/index.mjs.map +0 -1
@@ -0,0 +1,242 @@
1
+ import type { Transceiver, TransceiverMode } from "atom.io/internal"
2
+ import { Subject } from "atom.io/internal"
3
+ import type { Json, Stringified, primitive } from "atom.io/json"
4
+ import { parseJson, stringifyJson } from "atom.io/json"
5
+
6
+ export type SetUpdate =
7
+ | `add:${string}`
8
+ | `clear:${string}`
9
+ | `del:${string}`
10
+ | `tx:${string}`
11
+ export type NumberedSetUpdate = `${number}=${SetUpdate}`
12
+
13
+ export interface SetRTXJson<P extends primitive> extends Json.Object {
14
+ members: P[]
15
+ cache: (NumberedSetUpdate | null)[]
16
+ cacheLimit: number
17
+ cacheIdx: number
18
+ cacheUpdateNumber: number
19
+ }
20
+ export class SetRTX<P extends primitive>
21
+ extends Set<P>
22
+ implements Transceiver<NumberedSetUpdate>
23
+ {
24
+ public mode: TransceiverMode = `record`
25
+ public readonly subject = new Subject<SetUpdate>()
26
+ public cacheLimit = 0
27
+ public cache: (NumberedSetUpdate | null)[] = []
28
+ public cacheIdx = -1
29
+ public cacheUpdateNumber = -1
30
+
31
+ public constructor(values?: Set<P> | readonly P[] | null, cacheLimit = 0) {
32
+ super(values)
33
+ if (values instanceof SetRTX) {
34
+ this.parent = values
35
+ this.cacheUpdateNumber = values.cacheUpdateNumber
36
+ }
37
+ if (cacheLimit) {
38
+ this.cacheLimit = cacheLimit
39
+ this.cache = new Array(cacheLimit)
40
+ this.subscribe(`auto cache`, (update) => {
41
+ this.cacheIdx++
42
+ this.cacheIdx %= this.cacheLimit
43
+ this.cache[this.cacheIdx] = update
44
+ })
45
+ }
46
+ }
47
+
48
+ public toJSON(): SetRTXJson<P> {
49
+ return {
50
+ members: [...this],
51
+ cache: this.cache,
52
+ cacheLimit: this.cacheLimit,
53
+ cacheIdx: this.cacheIdx,
54
+ cacheUpdateNumber: this.cacheUpdateNumber,
55
+ }
56
+ }
57
+
58
+ public static fromJSON<P extends primitive>(json: SetRTXJson<P>): SetRTX<P> {
59
+ const set = new SetRTX<P>(json.members, json.cacheLimit)
60
+ set.cache = json.cache
61
+ set.cacheIdx = json.cacheIdx
62
+ set.cacheUpdateNumber = json.cacheUpdateNumber
63
+ return set
64
+ }
65
+
66
+ public add(value: P): this {
67
+ if (this.mode === `record`) {
68
+ this.cacheUpdateNumber++
69
+ this.emit(`add:${stringifyJson<P>(value)}`)
70
+ }
71
+ return super.add(value)
72
+ }
73
+
74
+ public clear(): void {
75
+ if (this.mode === `record`) {
76
+ this.cacheUpdateNumber++
77
+ this.emit(`clear:${JSON.stringify([...this])}`)
78
+ }
79
+ super.clear()
80
+ }
81
+
82
+ public delete(value: P): boolean {
83
+ if (this.mode === `record`) {
84
+ this.cacheUpdateNumber++
85
+ this.emit(`del:${stringifyJson<P>(value)}`)
86
+ }
87
+ return super.delete(value)
88
+ }
89
+
90
+ public readonly parent: SetRTX<P> | null
91
+ public child: SetRTX<P> | null = null
92
+ public transactionUpdates: SetUpdate[] | null = null
93
+ public transaction(run: (child: SetRTX<P>) => boolean): void {
94
+ this.mode = `transaction`
95
+ this.transactionUpdates = []
96
+ this.child = new SetRTX(this)
97
+ const unsubscribe = this.child._subscribe(`transaction`, (update) => {
98
+ this.transactionUpdates?.push(update)
99
+ })
100
+ try {
101
+ const shouldCommit = run(this.child)
102
+ if (shouldCommit) {
103
+ this.cacheUpdateNumber++
104
+ this.emit(`tx:${this.transactionUpdates.join(`;`)}`)
105
+ for (const update of this.transactionUpdates) {
106
+ this.doStep(update)
107
+ }
108
+ }
109
+ } catch (thrown) {
110
+ console.error(`Failed to apply transaction: ${thrown}`)
111
+ } finally {
112
+ unsubscribe()
113
+ this.child = null
114
+ this.transactionUpdates = null
115
+ this.mode = `record`
116
+ }
117
+ }
118
+
119
+ protected _subscribe(
120
+ key: string,
121
+ fn: (update: SetUpdate) => void,
122
+ ): () => void {
123
+ return this.subject.subscribe(key, fn)
124
+ }
125
+ public subscribe(
126
+ key: string,
127
+ fn: (update: NumberedSetUpdate) => void,
128
+ ): () => void {
129
+ return this.subject.subscribe(key, (update) =>
130
+ fn(`${this.cacheUpdateNumber}=${update}`),
131
+ )
132
+ }
133
+
134
+ public emit(update: SetUpdate): void {
135
+ this.subject.next(update)
136
+ }
137
+
138
+ private doStep(update: SetUpdate): void {
139
+ const typeValueBreak = update.indexOf(`:`)
140
+ const type = update.substring(0, typeValueBreak)
141
+ const value = update.substring(typeValueBreak + 1)
142
+ switch (type) {
143
+ case `add`:
144
+ this.add(parseJson(value as Stringified<P>))
145
+ break
146
+ case `clear`:
147
+ this.clear()
148
+ break
149
+ case `del`:
150
+ this.delete(parseJson(value as Stringified<P>))
151
+ break
152
+ case `tx`:
153
+ for (const update of value.split(`;`)) {
154
+ this.doStep(update as SetUpdate)
155
+ }
156
+ }
157
+ }
158
+
159
+ public do(update: NumberedSetUpdate): number | `OUT_OF_RANGE` | null {
160
+ const breakpoint = update.indexOf(`=`)
161
+ const updateNumber = Number(update.substring(0, breakpoint))
162
+ const eventOffset = updateNumber - this.cacheUpdateNumber
163
+ const isFuture = eventOffset > 0
164
+ if (isFuture) {
165
+ if (eventOffset === 1) {
166
+ this.mode = `playback`
167
+ const innerUpdate = update.substring(breakpoint + 1) as SetUpdate
168
+ this.doStep(innerUpdate)
169
+ this.mode = `record`
170
+ this.cacheUpdateNumber = updateNumber
171
+ return null
172
+ }
173
+ return this.cacheUpdateNumber + 1
174
+ } else {
175
+ if (Math.abs(eventOffset) < this.cacheLimit) {
176
+ const eventIdx = this.cacheIdx + eventOffset
177
+ const cachedUpdate = this.cache[eventIdx]
178
+ if (cachedUpdate === update) {
179
+ return null
180
+ }
181
+ this.mode = `playback`
182
+ let done = false
183
+ while (!done) {
184
+ this.cacheIdx %= this.cacheLimit
185
+ const update = this.cache[this.cacheIdx]
186
+ this.cacheIdx--
187
+ if (!update) {
188
+ return `OUT_OF_RANGE`
189
+ }
190
+ const undoRes = this.undo(update)
191
+ done = this.cacheIdx === eventIdx - 1
192
+ }
193
+ const innerUpdate = update.substring(breakpoint + 1) as SetUpdate
194
+ this.doStep(innerUpdate)
195
+ this.mode = `record`
196
+ this.cacheUpdateNumber = updateNumber
197
+ return null
198
+ } else {
199
+ return `OUT_OF_RANGE`
200
+ }
201
+ }
202
+ }
203
+
204
+ public undoStep(update: SetUpdate): void {
205
+ const breakpoint = update.indexOf(`:`)
206
+ const type = update.substring(0, breakpoint)
207
+ const value = update.substring(breakpoint + 1)
208
+ switch (type) {
209
+ case `add`:
210
+ this.delete(parseJson(value as Stringified<P>))
211
+ break
212
+ case `del`:
213
+ this.add(parseJson(value as Stringified<P>))
214
+ break
215
+ case `clear`: {
216
+ const values = JSON.parse(value) as P[]
217
+ for (const value of values) this.add(value)
218
+ break
219
+ }
220
+ case `tx`: {
221
+ const updates = value.split(`;`) as SetUpdate[]
222
+ for (let i = updates.length - 1; i >= 0; i--) {
223
+ this.undoStep(updates[i])
224
+ }
225
+ }
226
+ }
227
+ }
228
+
229
+ public undo(update: NumberedSetUpdate): number | null {
230
+ const breakpoint = update.indexOf(`=`)
231
+ const updateNumber = Number(update.substring(0, breakpoint))
232
+ if (updateNumber === this.cacheUpdateNumber) {
233
+ this.mode = `playback`
234
+ const innerUpdate = update.substring(breakpoint + 1) as SetUpdate
235
+ this.undoStep(innerUpdate)
236
+ this.mode = `record`
237
+ this.cacheUpdateNumber--
238
+ return null
239
+ }
240
+ return this.cacheUpdateNumber
241
+ }
242
+ }
@@ -1,23 +0,0 @@
1
- import * as AtomIO from 'atom.io';
2
- import * as SocketIO from 'socket.io';
3
-
4
- type primitive = boolean | number | string | null;
5
-
6
- type Serializable = primitive | Readonly<{
7
- [key: string]: Serializable;
8
- }> | ReadonlyArray<Serializable>;
9
-
10
- declare const useExposeSingle: ({ socket, store }: ServerConfig) => <J extends Serializable>(token: AtomIO.StateToken<J>) => () => void;
11
-
12
- declare const useExposeFamily: ({ socket, store }: ServerConfig) => <J extends Serializable>(family: AtomIO.AtomFamily<J, Serializable> | AtomIO.SelectorFamily<J, Serializable>, index: AtomIO.StateToken<Set<string>>) => () => void;
13
-
14
- declare const useReceiveTransaction: ({ socket, store }: ServerConfig) => <ƒ extends AtomIO.ƒn>(tx: AtomIO.TransactionToken<ƒ>) => () => void;
15
-
16
- declare const useReceiveState: ({ socket, store }: ServerConfig) => <J extends Serializable>(token: AtomIO.StateToken<J>) => () => void;
17
-
18
- type ServerConfig = {
19
- socket: SocketIO.Socket;
20
- store?: AtomIO.__INTERNAL__.Store;
21
- };
22
-
23
- export { ServerConfig, useExposeFamily, useExposeSingle, useReceiveState, useReceiveTransaction };
@@ -1,23 +0,0 @@
1
- import * as AtomIO from 'atom.io';
2
- import * as SocketIO from 'socket.io';
3
-
4
- type primitive = boolean | number | string | null;
5
-
6
- type Serializable = primitive | Readonly<{
7
- [key: string]: Serializable;
8
- }> | ReadonlyArray<Serializable>;
9
-
10
- declare const useExposeSingle: ({ socket, store }: ServerConfig) => <J extends Serializable>(token: AtomIO.StateToken<J>) => () => void;
11
-
12
- declare const useExposeFamily: ({ socket, store }: ServerConfig) => <J extends Serializable>(family: AtomIO.AtomFamily<J, Serializable> | AtomIO.SelectorFamily<J, Serializable>, index: AtomIO.StateToken<Set<string>>) => () => void;
13
-
14
- declare const useReceiveTransaction: ({ socket, store }: ServerConfig) => <ƒ extends AtomIO.ƒn>(tx: AtomIO.TransactionToken<ƒ>) => () => void;
15
-
16
- declare const useReceiveState: ({ socket, store }: ServerConfig) => <J extends Serializable>(token: AtomIO.StateToken<J>) => () => void;
17
-
18
- type ServerConfig = {
19
- socket: SocketIO.Socket;
20
- store?: AtomIO.__INTERNAL__.Store;
21
- };
22
-
23
- export { ServerConfig, useExposeFamily, useExposeSingle, useReceiveState, useReceiveTransaction };
@@ -1,32 +0,0 @@
1
- 'use strict';
2
-
3
- var m = require('atom.io');
4
-
5
- function _interopNamespace(e) {
6
- if (e && e.__esModule) return e;
7
- var n = Object.create(null);
8
- if (e) {
9
- Object.keys(e).forEach(function (k) {
10
- if (k !== 'default') {
11
- var d = Object.getOwnPropertyDescriptor(e, k);
12
- Object.defineProperty(n, k, d.get ? d : {
13
- enumerable: true,
14
- get: function () { return e[k]; }
15
- });
16
- }
17
- });
18
- }
19
- n.default = e;
20
- return Object.freeze(n);
21
- }
22
-
23
- var m__namespace = /*#__PURE__*/_interopNamespace(m);
24
-
25
- var $=({socket:e,store:t})=>function(o){let n=null,r=()=>{e.off(`unsub:${o.key}`,r),n==null||n(),n=null;},i=()=>{e.emit(`serve:${o.key}`,m__namespace.getState(o,t)),n=m__namespace.subscribe(o,({newValue:f})=>{e.emit(`serve:${o.key}`,f);},`expose-single:${e.id}`,t),e.on(`unsub:${o.key}`,r);};return e.on(`sub:${o.key}`,i),()=>{e.off(`sub:${o.key}`,i),n==null||n();}};var S=e=>JSON.parse(e);var v=(e,t,l)=>(e.type==="atom_family",e.subject.subscribe(t,l)),E=({socket:e,store:t})=>function(o,n){let r=new Map,i=new Map,f=()=>{i.forEach(s=>s()),i.clear(),e.off(`unsub:${o.key}`,f);},J=s=>{e.off(`unsub:${s}`,J);let a=r.get(s);a&&(a(),r.delete(s));},g=s=>{if(s===void 0){m__namespace.getState(n,t).forEach(u=>{var b;let p=o(u);e.emit(`serve:${o.key}`,S(((b=p.family)==null?void 0:b.subKey)||"null"),m__namespace.getState(p,t));});let c=v(o,`expose-family:${e.id}`,u=>{let p=m__namespace.subscribe(u,({newValue:b})=>{var x;e.emit(`serve:${o.key}`,S(((x=u.family)==null?void 0:x.subKey)||"null"),b);},`expose-family:${o.key}:${e.id}`,t);i.set(u.key,p);});i.set(o.key,c),e.on(`unsub:${o.key}`,f);}else {let a=o(s);e.emit(`serve:${a.key}`,m__namespace.getState(a,t));let c=m__namespace.subscribe(a,({newValue:u})=>{e.emit(`serve:${a.key}`,u);},`expose-family:${o.key}:${e.id}`,t);r.set(a.key,c),e.on(`unsub:${a.key}`,()=>{J(a.key);});}};return e.on(`sub:${o.key}`,g),()=>{e.off(`sub:${o.key}`,g),i.forEach(s=>s()),r.forEach(s=>s()),i.clear(),r.clear();}};var j=({socket:e,store:t})=>function(o){let n=r=>m__namespace.runTransaction(o,t)(...r.params);return e.on(`tx:${o.key}`,n),()=>e.off(`tx:${o.key}`,n)};var R=({socket:e,store:t})=>function(o){let n=f=>m__namespace.setState(o,f,t),r=()=>{e.off(`pub:${o.key}`,n),e.off(`unclaim:${o.key}`,r);},i=()=>{e.on(`pub:${o.key}`,n),e.on(`unclaim:${o.key}`,r);};return e.on(`claim:${o.key}`,i),()=>{e.off(`claim:${o.key}`,i),e.off(`pub:${o.key}`,n);}};
26
-
27
- exports.useExposeFamily = E;
28
- exports.useExposeSingle = $;
29
- exports.useReceiveState = R;
30
- exports.useReceiveTransaction = j;
31
- //# sourceMappingURL=out.js.map
32
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hook-composition/expose-single.ts","../../../anvl/src/json/index.ts","../src/hook-composition/expose-family.ts","../src/hook-composition/receive-transaction.ts","../src/hook-composition/receive-state.ts"],"names":["AtomIO","useExposeSingle","socket","store","token","unsubscribeFromStateUpdates","fillUnsubRequest","fillSubRequest","newValue","parseJson","str","subscribeToTokenCreation","family","key","handleTokenCreation","useExposeFamily","index","unsubSingleCallbacksByKey","unsubFamilyCallbacksByKey","fillFamilyUnsubRequest","unsub","fillSingleUnsubRequest","subKey","_a","unsubscribeFromTokenCreation","unsubscribe","useReceiveTransaction","tx","fillTransactionRequest","update","useReceiveState","publish","fillPubUnclaim","fillPubClaim"],"mappings":"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","sourcesContent":["import type { Json } from \"anvl/json\"\nimport * as AtomIO from \"atom.io\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeSingle = ({ socket, store }: 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 = AtomIO.subscribe(\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","export * from \"./json-interface\"\nimport type * as Json from \"./json\"\nexport { Json }\n\nexport const parseJson = <S extends Stringified<Json.Serializable>>(\n\tstr: S | string,\n): S extends Stringified<infer J> ? J : Json.Serializable => JSON.parse(str)\n\nexport type Stringified<J extends Json.Serializable> = string & { __json: J }\n\nexport const stringifyJson = <J extends Json.Serializable>(\n\tjson: J,\n): Stringified<J> => JSON.stringify(json) as Stringified<J>\n\nexport type Empty = Record<string, never>\n\nexport const JSON_TYPE_NAMES = [\n\t`array`,\n\t`boolean`,\n\t`null`,\n\t`number`,\n\t`object`,\n\t`string`,\n] as const\n\nexport type JsonTypeName = typeof JSON_TYPE_NAMES[number]\n\nexport interface JsonTypes extends Record<JsonTypeName, Json.Serializable> {\n\tarray: Json.Array\n\tboolean: boolean\n\tnull: null\n\tnumber: number\n\tobject: Json.Object\n\tstring: string\n}\n\nexport const JSON_DEFAULTS: JsonTypes = {\n\tarray: [],\n\tboolean: false,\n\tnull: null,\n\tnumber: 0,\n\tobject: {},\n\tstring: ``,\n}\n","import type { Json } from \"anvl/json\"\nimport { parseJson } from \"anvl/json\"\nimport * as AtomIO from \"atom.io\"\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 = ({ socket, store }: 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\tunsubFamilyCallbacksByKey.forEach((unsub) => unsub())\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?: AtomIO.Json.Serializable) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tkeys.forEach((key) => {\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 = AtomIO.subscribe(\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 = AtomIO.subscribe(\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\tunsubFamilyCallbacksByKey.forEach((unsub) => unsub())\n\t\t\tunsubSingleCallbacksByKey.forEach((unsub) => unsub())\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\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\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","import type { Json } from \"anvl/json\"\nimport * as AtomIO from \"atom.io\"\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: AtomIO.StateToken<J>,\n\t): () => void {\n\t\tconst publish = (newValue: J) => AtomIO.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,7 +0,0 @@
1
- import * as m from 'atom.io';
2
-
3
- var $=({socket:e,store:t})=>function(o){let n=null,r=()=>{e.off(`unsub:${o.key}`,r),n==null||n(),n=null;},i=()=>{e.emit(`serve:${o.key}`,m.getState(o,t)),n=m.subscribe(o,({newValue:f})=>{e.emit(`serve:${o.key}`,f);},`expose-single:${e.id}`,t),e.on(`unsub:${o.key}`,r);};return e.on(`sub:${o.key}`,i),()=>{e.off(`sub:${o.key}`,i),n==null||n();}};var S=e=>JSON.parse(e);var v=(e,t,l)=>(e.type==="atom_family",e.subject.subscribe(t,l)),E=({socket:e,store:t})=>function(o,n){let r=new Map,i=new Map,f=()=>{i.forEach(s=>s()),i.clear(),e.off(`unsub:${o.key}`,f);},J=s=>{e.off(`unsub:${s}`,J);let a=r.get(s);a&&(a(),r.delete(s));},g=s=>{if(s===void 0){m.getState(n,t).forEach(u=>{var b;let p=o(u);e.emit(`serve:${o.key}`,S(((b=p.family)==null?void 0:b.subKey)||"null"),m.getState(p,t));});let c=v(o,`expose-family:${e.id}`,u=>{let p=m.subscribe(u,({newValue:b})=>{var x;e.emit(`serve:${o.key}`,S(((x=u.family)==null?void 0:x.subKey)||"null"),b);},`expose-family:${o.key}:${e.id}`,t);i.set(u.key,p);});i.set(o.key,c),e.on(`unsub:${o.key}`,f);}else {let a=o(s);e.emit(`serve:${a.key}`,m.getState(a,t));let c=m.subscribe(a,({newValue:u})=>{e.emit(`serve:${a.key}`,u);},`expose-family:${o.key}:${e.id}`,t);r.set(a.key,c),e.on(`unsub:${a.key}`,()=>{J(a.key);});}};return e.on(`sub:${o.key}`,g),()=>{e.off(`sub:${o.key}`,g),i.forEach(s=>s()),r.forEach(s=>s()),i.clear(),r.clear();}};var j=({socket:e,store:t})=>function(o){let n=r=>m.runTransaction(o,t)(...r.params);return e.on(`tx:${o.key}`,n),()=>e.off(`tx:${o.key}`,n)};var R=({socket:e,store:t})=>function(o){let n=f=>m.setState(o,f,t),r=()=>{e.off(`pub:${o.key}`,n),e.off(`unclaim:${o.key}`,r);},i=()=>{e.on(`pub:${o.key}`,n),e.on(`unclaim:${o.key}`,r);};return e.on(`claim:${o.key}`,i),()=>{e.off(`claim:${o.key}`,i),e.off(`pub:${o.key}`,n);}};
4
-
5
- export { E as useExposeFamily, $ as useExposeSingle, R as useReceiveState, j as useReceiveTransaction };
6
- //# sourceMappingURL=out.js.map
7
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hook-composition/expose-single.ts","../../../anvl/src/json/index.ts","../src/hook-composition/expose-family.ts","../src/hook-composition/receive-transaction.ts","../src/hook-composition/receive-state.ts"],"names":["AtomIO","useExposeSingle","socket","store","token","unsubscribeFromStateUpdates","fillUnsubRequest","fillSubRequest","newValue","parseJson","str","subscribeToTokenCreation","family","key","handleTokenCreation","useExposeFamily","index","unsubSingleCallbacksByKey","unsubFamilyCallbacksByKey","fillFamilyUnsubRequest","unsub","fillSingleUnsubRequest","subKey","_a","unsubscribeFromTokenCreation","unsubscribe","useReceiveTransaction","tx","fillTransactionRequest","update","useReceiveState","publish","fillPubUnclaim","fillPubClaim"],"mappings":"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","sourcesContent":["import type { Json } from \"anvl/json\"\nimport * as AtomIO from \"atom.io\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeSingle = ({ socket, store }: 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 = AtomIO.subscribe(\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","export * from \"./json-interface\"\nimport type * as Json from \"./json\"\nexport { Json }\n\nexport const parseJson = <S extends Stringified<Json.Serializable>>(\n\tstr: S | string,\n): S extends Stringified<infer J> ? J : Json.Serializable => JSON.parse(str)\n\nexport type Stringified<J extends Json.Serializable> = string & { __json: J }\n\nexport const stringifyJson = <J extends Json.Serializable>(\n\tjson: J,\n): Stringified<J> => JSON.stringify(json) as Stringified<J>\n\nexport type Empty = Record<string, never>\n\nexport const JSON_TYPE_NAMES = [\n\t`array`,\n\t`boolean`,\n\t`null`,\n\t`number`,\n\t`object`,\n\t`string`,\n] as const\n\nexport type JsonTypeName = typeof JSON_TYPE_NAMES[number]\n\nexport interface JsonTypes extends Record<JsonTypeName, Json.Serializable> {\n\tarray: Json.Array\n\tboolean: boolean\n\tnull: null\n\tnumber: number\n\tobject: Json.Object\n\tstring: string\n}\n\nexport const JSON_DEFAULTS: JsonTypes = {\n\tarray: [],\n\tboolean: false,\n\tnull: null,\n\tnumber: 0,\n\tobject: {},\n\tstring: ``,\n}\n","import type { Json } from \"anvl/json\"\nimport { parseJson } from \"anvl/json\"\nimport * as AtomIO from \"atom.io\"\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 = ({ socket, store }: 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\tunsubFamilyCallbacksByKey.forEach((unsub) => unsub())\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?: AtomIO.Json.Serializable) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tkeys.forEach((key) => {\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 = AtomIO.subscribe(\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 = AtomIO.subscribe(\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\tunsubFamilyCallbacksByKey.forEach((unsub) => unsub())\n\t\t\tunsubSingleCallbacksByKey.forEach((unsub) => unsub())\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\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\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","import type { Json } from \"anvl/json\"\nimport * as AtomIO from \"atom.io\"\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: AtomIO.StateToken<J>,\n\t): () => void {\n\t\tconst publish = (newValue: J) => AtomIO.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"]}