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,310 @@
1
+ main.atom_io_devtools {
2
+ --fg-color: #eee;
3
+ --bg-color: #111;
4
+ --bg-tint1: #222;
5
+ --fg-border: 1px solid var(--fg-color);
6
+ @media (prefers-color-scheme: light) {
7
+ --fg-color: #444;
8
+ --bg-color: #ddd;
9
+ --bg-tint1: #e3e3e3;
10
+ }
11
+ box-sizing: border-box;
12
+ color: var(--fg-color);
13
+ background-color: var(--bg-color);
14
+ border: 2px solid var(--fg-color);
15
+ position: fixed;
16
+ right: 0;
17
+ bottom: 0;
18
+ height: 100%;
19
+ display: flex;
20
+ flex-flow: column;
21
+ max-height: 800px;
22
+ width: 100%;
23
+ max-width: 500px;
24
+ overflow-y: scroll;
25
+ * {
26
+ font-size: 16px;
27
+ font-family: theia, monospace;
28
+ }
29
+ > header {
30
+ padding: 5px;
31
+ padding-left: 10px;
32
+ padding-bottom: 0;
33
+ display: flex;
34
+ justify-content: space-between;
35
+ h1 {
36
+ font-size: inherit;
37
+ margin: 0;
38
+ font-size: 24px;
39
+ font-family: charter;
40
+ }
41
+ nav {
42
+ display: flex;
43
+ flex-flow: row nowrap;
44
+ button {
45
+ cursor: pointer;
46
+ background: none;
47
+ border: none;
48
+ padding: none;
49
+ margin-bottom: -2px;
50
+ z-index: 1000;
51
+ &:disabled {
52
+ cursor: default;
53
+ background-color: var(--bg-tint1);
54
+ color: var(--fg-color);
55
+ border: var(--fg-border);
56
+ border-bottom: none;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ > main {
62
+ background: var(--bg-tint1);
63
+ }
64
+ main {
65
+ overflow-y: scroll;
66
+ flex-grow: 1;
67
+ display: flex;
68
+ flex-flow: column;
69
+ gap: 0;
70
+ article.index {
71
+ .node .node {
72
+ border-right: var(--fg-border);
73
+ padding-right: 0;
74
+ background: #fff3;
75
+ }
76
+ .node > .node {
77
+ margin: 5px 0;
78
+ margin-left: 12px;
79
+ border-left: var(--fg-border);
80
+ }
81
+ .node {
82
+ border-top: var(--fg-border);
83
+ overflow-x: scroll;
84
+ padding: 5px;
85
+ &:last-of-type {
86
+ border-bottom: var(--fg-border);
87
+ }
88
+ &.transaction_update {
89
+ padding: 0;
90
+ }
91
+ header {
92
+ display: flex;
93
+ flex-flow: row;
94
+ gap: 5px;
95
+ position: sticky;
96
+ z-index: 999;
97
+ top: 0;
98
+ button.carat {
99
+ cursor: pointer;
100
+ background: none;
101
+ border: none;
102
+ width: 20px;
103
+ &.open {
104
+ transform: rotate(90deg);
105
+ }
106
+ &:disabled {
107
+ cursor: default;
108
+ }
109
+ }
110
+ label {
111
+ display: flex;
112
+ flex-flow: row;
113
+ gap: 5px;
114
+ cursor: help;
115
+ h2 {
116
+ display: inline-block;
117
+ margin: 0;
118
+ }
119
+ .detail {
120
+ color: #777;
121
+ @media (prefers-color-scheme: light) {
122
+ color: #999;
123
+ }
124
+ }
125
+ }
126
+ }
127
+ main {
128
+ margin-left: 15px;
129
+ }
130
+ }
131
+ section.transaction_log {
132
+ margin-top: 0;
133
+ header: {
134
+ padding: 5px;
135
+ }
136
+ main {
137
+ display: flex;
138
+ flex-flow: row wrap;
139
+ gap: 5px;
140
+ .transaction_update {
141
+ width: 100%;
142
+ display: flex;
143
+ flex-flow: row;
144
+ align-items: flex-start;
145
+ justify-content: flex-start;
146
+ justify-items: flex-start;
147
+ align-content: flex-start;
148
+ border-left: var(--fg-border);
149
+ border-top: var(--fg-border);
150
+ header {
151
+ padding: 5px;
152
+ h4 {
153
+ margin: 0;
154
+ padding: 0;
155
+ font-size: inherit;
156
+ }
157
+ }
158
+ main {
159
+ margin-left: 0;
160
+ display: flex;
161
+ flex-flow: column;
162
+ gap: 0px;
163
+ border-left: 1px solid #333;
164
+ section ~ section {
165
+ border-top: 1px solid #333;
166
+ }
167
+ section {
168
+ padding: 5px;
169
+ &.transaction_output {
170
+ border-right: none;
171
+ }
172
+ &.transaction_impact {
173
+ padding: 5px;
174
+ }
175
+ margin: 0;
176
+ article {
177
+ border-left: var(--fg-border);
178
+ border-right: var(--fg-border);
179
+ .summary {
180
+ white-space: nowrap;
181
+ }
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ section.timeline_log {
189
+ header {
190
+ display: flex;
191
+ label {
192
+ display: flex;
193
+ width: 100%;
194
+ flex-grow: 1;
195
+ .gap {
196
+ flex-grow: 1;
197
+ }
198
+ nav {
199
+ display: flex;
200
+ flex-flow: row nowrap;
201
+ gap: 5px;
202
+ }
203
+ }
204
+ }
205
+ .timeline_update {
206
+ padding: 5px;
207
+ border-left: var(--fg-border);
208
+ h4 {
209
+ margin: 0;
210
+ padding: 0;
211
+ font-size: inherit;
212
+ }
213
+ main {
214
+ margin: 0;
215
+ .node.atom_update {
216
+ border-left: var(--fg-border);
217
+ }
218
+ }
219
+ }
220
+ .you_are_here {
221
+ background: var(--fg-color);
222
+ color: var(--bg-color);
223
+ text-align: center;
224
+ }
225
+ }
226
+ }
227
+ }
228
+ footer {
229
+ display: flex;
230
+ justify-content: flex-end;
231
+ button {
232
+ cursor: pointer;
233
+ background: none;
234
+ border: none;
235
+ padding: none;
236
+ position: absolute;
237
+ right: 0;
238
+ bottom: 0;
239
+ }
240
+ }
241
+
242
+ .json_editor {
243
+ input {
244
+ font-family: theia;
245
+ border: none;
246
+ border-bottom: 1px solid;
247
+ background: none;
248
+ &:disabled {
249
+ border: none;
250
+ }
251
+ }
252
+ button {
253
+ background: none;
254
+ margin-left: auto;
255
+ color: #777;
256
+ border: none;
257
+ font-family: theia;
258
+ font-size: 14px;
259
+ margin: none;
260
+ padding: 4px;
261
+ padding-bottom: 6px;
262
+ cursor: pointer;
263
+ &:hover {
264
+ color: #333;
265
+ background-color: #aaa;
266
+ }
267
+ }
268
+ select {
269
+ font-family: theia;
270
+ font-size: 14px;
271
+ background: none;
272
+ border: none;
273
+ color: #777;
274
+ @media (prefers-color-scheme: light) {
275
+ color: #999;
276
+ }
277
+ }
278
+ .json_editor_unofficial {
279
+ background-color: #777;
280
+ button {
281
+ color: #333;
282
+ }
283
+ }
284
+ .json_editor_missing {
285
+ background-color: #f055;
286
+ }
287
+ .json_editor_key {
288
+ padding-right: 10px;
289
+ input {
290
+ color: #999;
291
+ @media (prefers-color-scheme: light) {
292
+ color: #777;
293
+ }
294
+ }
295
+ }
296
+ .json_editor_object {
297
+ border-left: 2px solid #333;
298
+ padding-left: 20px;
299
+ @media (prefers-color-scheme: light) {
300
+ border-color: #ccc;
301
+ }
302
+ .json_editor_properties {
303
+ > * {
304
+ border-bottom: var(--fg-border);
305
+ margin-bottom: 2px;
306
+ }
307
+ }
308
+ }
309
+ }
310
+ }
@@ -0,0 +1,72 @@
1
+ import { atom, atomFamily } from "atom.io"
2
+ import { attachIntrospectionStates } from "atom.io/introspection"
3
+ import { lazyLocalStorageEffect } from "~/packages/atom.io/__unstable__/web-effects/src"
4
+
5
+ import { isPlainObject } from "~/packages/anvl/src/object"
6
+ import { Refinery } from "~/packages/anvl/src/refinement/refinery"
7
+ import {
8
+ Differ,
9
+ diffArray,
10
+ diffBoolean,
11
+ diffNumber,
12
+ diffObject,
13
+ diffString,
14
+ } from "~/packages/anvl/src/tree/differ"
15
+
16
+ export * from "./AtomIODevtools"
17
+
18
+ export const {
19
+ atomIndex,
20
+ selectorIndex,
21
+ transactionIndex,
22
+ findTransactionLogState,
23
+ timelineIndex,
24
+ findTimelineState,
25
+ } = attachIntrospectionStates()
26
+
27
+ export const devtoolsAreOpenState = atom<boolean>({
28
+ key: `👁‍🗨 Devtools Are Open`,
29
+ default: true,
30
+ effects: [lazyLocalStorageEffect(`👁‍🗨 Devtools Are Open`)],
31
+ })
32
+
33
+ type DevtoolsView = `atoms` | `selectors` | `timelines` | `transactions`
34
+
35
+ export const devtoolsViewSelectionState = atom<DevtoolsView>({
36
+ key: `👁‍🗨 Devtools View Selection`,
37
+ default: `atoms`,
38
+ effects: [lazyLocalStorageEffect(`👁‍🗨 Devtools View`)],
39
+ })
40
+
41
+ export const devtoolsViewOptionsState = atom<DevtoolsView[]>({
42
+ key: `👁‍🗨 Devtools View Options`,
43
+ default: [`atoms`, `selectors`, `transactions`, `timelines`],
44
+ effects: [lazyLocalStorageEffect(`👁‍🗨 Devtools View Options`)],
45
+ })
46
+
47
+ export const findViewIsOpenState = atomFamily<boolean, string>({
48
+ key: `👁‍🗨 Devtools View Is Open`,
49
+ default: false,
50
+ effects: (key) => [lazyLocalStorageEffect(key + `:view-is-open`)],
51
+ })
52
+
53
+ export const primitiveRefinery = new Refinery({
54
+ number: (input: unknown): input is number => typeof input === `number`,
55
+ string: (input: unknown): input is string => typeof input === `string`,
56
+ boolean: (input: unknown): input is boolean => typeof input === `boolean`,
57
+ null: (input: unknown): input is null => input === null,
58
+ })
59
+
60
+ export const jsonTreeRefinery = new Refinery({
61
+ object: isPlainObject,
62
+ array: (input: unknown): input is unknown[] => Array.isArray(input),
63
+ })
64
+
65
+ export const prettyJson = new Differ(primitiveRefinery, jsonTreeRefinery, {
66
+ number: diffNumber,
67
+ string: diffString,
68
+ boolean: diffBoolean,
69
+ null: () => ({ summary: `No Change` }),
70
+ object: diffObject,
71
+ array: diffArray,
72
+ })
@@ -1,6 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { Socket } from 'socket.io-client';
3
3
  import * as AtomIO from 'atom.io';
4
+ import { Json } from 'atom.io/json';
5
+ import { Transceiver } from 'atom.io/internal';
4
6
 
5
7
  declare const RealtimeContext: React.Context<{
6
8
  socket: Socket;
@@ -10,32 +12,16 @@ declare const RealtimeProvider: React.FC<{
10
12
  socket: Socket;
11
13
  }>;
12
14
 
13
- type primitive = boolean | number | string | null;
15
+ declare function usePull<J extends Json.Serializable>(token: AtomIO.StateToken<J>): void;
14
16
 
15
- type Serializable = primitive | Readonly<{
16
- [key: string]: Serializable;
17
- }> | ReadonlyArray<Serializable>;
17
+ declare function usePullFamilyMember<J extends Json.Serializable>(token: AtomIO.AtomToken<J>): void;
18
18
 
19
- declare function usePull<J extends Serializable>(token: AtomIO.StateToken<J>): void;
19
+ declare function usePullMutable<T extends Transceiver<Json.Serializable>, J extends Json.Serializable>(token: AtomIO.MutableAtomToken<T, J>): void;
20
20
 
21
- declare function usePullFamily<J extends Serializable>(family: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>): void;
21
+ declare function usePullMutableFamilyMember<T extends Transceiver<Json.Serializable>, J extends Json.Serializable>(token: AtomIO.MutableAtomToken<T, J>): void;
22
22
 
23
- declare function usePullFamilyMember<J extends Serializable>(family: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>, subKey: AtomIO.Json.Serializable): void;
24
-
25
- declare function usePush<J extends Serializable>(token: AtomIO.StateToken<J>): void;
23
+ declare function usePush<J extends Json.Serializable>(token: AtomIO.StateToken<J>): void;
26
24
 
27
25
  declare function useServerAction<ƒ extends AtomIO.ƒn>(token: AtomIO.TransactionToken<ƒ>): (...parameters: Parameters<ƒ>) => ReturnType<ƒ>;
28
26
 
29
- type RealtimeHooks = {
30
- usePull: <J extends Serializable>(token: AtomIO.StateToken<J>) => void;
31
- usePullFamily: <J extends Serializable>(family: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>) => void;
32
- usePullFamilyMember: <J extends Serializable>(family: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>, subKey: string) => void;
33
- usePush: <J extends Serializable>(token: AtomIO.StateToken<J>) => void;
34
- useServerAction: <ƒ extends AtomIO.ƒn>(token: AtomIO.TransactionToken<ƒ>) => (...parameters: Parameters<ƒ>) => ReturnType<ƒ>;
35
- };
36
- declare const realtimeHooks: RealtimeHooks;
37
-
38
- declare const myIdState__INTERNAL: AtomIO.AtomToken<string | null>;
39
- declare const myIdState: AtomIO.ReadonlySelectorToken<string | null>;
40
-
41
- export { RealtimeContext, RealtimeHooks, RealtimeProvider, myIdState, myIdState__INTERNAL, realtimeHooks, usePull, usePullFamily, usePullFamilyMember, usePush, useServerAction };
27
+ export { RealtimeContext, RealtimeProvider, usePull, usePullFamilyMember, usePullMutable, usePullMutableFamilyMember, usePush, useServerAction };
@@ -1,6 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { Socket } from 'socket.io-client';
3
3
  import * as AtomIO from 'atom.io';
4
+ import { Json } from 'atom.io/json';
5
+ import { Transceiver } from 'atom.io/internal';
4
6
 
5
7
  declare const RealtimeContext: React.Context<{
6
8
  socket: Socket;
@@ -10,32 +12,16 @@ declare const RealtimeProvider: React.FC<{
10
12
  socket: Socket;
11
13
  }>;
12
14
 
13
- type primitive = boolean | number | string | null;
15
+ declare function usePull<J extends Json.Serializable>(token: AtomIO.StateToken<J>): void;
14
16
 
15
- type Serializable = primitive | Readonly<{
16
- [key: string]: Serializable;
17
- }> | ReadonlyArray<Serializable>;
17
+ declare function usePullFamilyMember<J extends Json.Serializable>(token: AtomIO.AtomToken<J>): void;
18
18
 
19
- declare function usePull<J extends Serializable>(token: AtomIO.StateToken<J>): void;
19
+ declare function usePullMutable<T extends Transceiver<Json.Serializable>, J extends Json.Serializable>(token: AtomIO.MutableAtomToken<T, J>): void;
20
20
 
21
- declare function usePullFamily<J extends Serializable>(family: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>): void;
21
+ declare function usePullMutableFamilyMember<T extends Transceiver<Json.Serializable>, J extends Json.Serializable>(token: AtomIO.MutableAtomToken<T, J>): void;
22
22
 
23
- declare function usePullFamilyMember<J extends Serializable>(family: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>, subKey: AtomIO.Json.Serializable): void;
24
-
25
- declare function usePush<J extends Serializable>(token: AtomIO.StateToken<J>): void;
23
+ declare function usePush<J extends Json.Serializable>(token: AtomIO.StateToken<J>): void;
26
24
 
27
25
  declare function useServerAction<ƒ extends AtomIO.ƒn>(token: AtomIO.TransactionToken<ƒ>): (...parameters: Parameters<ƒ>) => ReturnType<ƒ>;
28
26
 
29
- type RealtimeHooks = {
30
- usePull: <J extends Serializable>(token: AtomIO.StateToken<J>) => void;
31
- usePullFamily: <J extends Serializable>(family: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>) => void;
32
- usePullFamilyMember: <J extends Serializable>(family: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>, subKey: string) => void;
33
- usePush: <J extends Serializable>(token: AtomIO.StateToken<J>) => void;
34
- useServerAction: <ƒ extends AtomIO.ƒn>(token: AtomIO.TransactionToken<ƒ>) => (...parameters: Parameters<ƒ>) => ReturnType<ƒ>;
35
- };
36
- declare const realtimeHooks: RealtimeHooks;
37
-
38
- declare const myIdState__INTERNAL: AtomIO.AtomToken<string | null>;
39
- declare const myIdState: AtomIO.ReadonlySelectorToken<string | null>;
40
-
41
- export { RealtimeContext, RealtimeHooks, RealtimeProvider, myIdState, myIdState__INTERNAL, realtimeHooks, usePull, usePullFamily, usePullFamilyMember, usePush, useServerAction };
27
+ export { RealtimeContext, RealtimeProvider, usePull, usePullFamilyMember, usePullMutable, usePullMutableFamilyMember, usePush, useServerAction };
@@ -1,44 +1,99 @@
1
1
  'use strict';
2
2
 
3
- var J = require('atom.io/react');
4
- var n = require('react');
3
+ var react = require('atom.io/react');
4
+ var RTC = require('atom.io/realtime-client');
5
+ var React6 = require('react');
5
6
  var socket_ioClient = require('socket.io-client');
6
- var p = require('atom.io');
7
7
  var jsxRuntime = require('react/jsx-runtime');
8
+ var AtomIO = require('atom.io');
8
9
 
9
10
  function _interopNamespace(e) {
10
- if (e && e.__esModule) return e;
11
- var n = Object.create(null);
12
- if (e) {
13
- Object.keys(e).forEach(function (k) {
14
- if (k !== 'default') {
15
- var d = Object.getOwnPropertyDescriptor(e, k);
16
- Object.defineProperty(n, k, d.get ? d : {
17
- enumerable: true,
18
- get: function () { return e[k]; }
19
- });
20
- }
21
- });
22
- }
23
- n.default = e;
24
- return Object.freeze(n);
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
25
26
  }
26
27
 
27
- var J__namespace = /*#__PURE__*/_interopNamespace(J);
28
- var n__namespace = /*#__PURE__*/_interopNamespace(n);
29
- var p__namespace = /*#__PURE__*/_interopNamespace(p);
28
+ var RTC__namespace = /*#__PURE__*/_interopNamespace(RTC);
29
+ var React6__namespace = /*#__PURE__*/_interopNamespace(React6);
30
+ var AtomIO__namespace = /*#__PURE__*/_interopNamespace(AtomIO);
30
31
 
31
- var R=p__namespace.atom({key:"myId__INTERNAL",default:null}),h=p__namespace.selector({key:"myId",get:({get:e})=>e(R)});var m=n__namespace.createContext({socket:socket_ioClient.io()}),L=({children:e,socket:t})=>{let r=J__namespace.useI(R);return n__namespace.useEffect(()=>{t.on("connect",()=>{r(t.id);}),t.on("disconnect",()=>{r(null);});},[t,r]),jsxRuntime.jsx(m.Provider,{value:{socket:t},children:e})};function d(e){let{socket:t}=n__namespace.useContext(m),r=n__namespace.useContext(J.StoreContext);n__namespace.useEffect(()=>(t.on(`serve:${e.key}`,o=>{p__namespace.setState(e,o,r);}),t.emit(`sub:${e.key}`),()=>{t.off(`serve:${e.key}`),t.emit(`unsub:${e.key}`);}),[e.key]);}function b(e){let{socket:t}=n__namespace.useContext(m),r=n__namespace.useContext(J.StoreContext);n__namespace.useEffect(()=>(t.on(`serve:${e.key}`,(o,s)=>{p__namespace.setState(e(o),s,r);}),t==null||t.emit(`sub:${e.key}`),()=>{t==null||t.off(`serve:${e.key}`),t==null||t.emit(`unsub:${e.key}`);}),[e.key]);}function v(e,t){let r=e(t),{socket:o}=n__namespace.useContext(m),s=n__namespace.useContext(J.StoreContext);n__namespace.useEffect(()=>(o==null||o.on(`serve:${r.key}`,l=>{p__namespace.setState(e(t),l,s);}),o==null||o.emit(`sub:${e.key}`,t),()=>{o==null||o.off(`serve:${r.key}`),o==null||o.emit(`unsub:${r.key}`);}),[e.key]);}function P(e){let{socket:t}=n__namespace.useContext(m),r=n__namespace.useContext(J.StoreContext),o=n__namespace.useId();n__namespace.useEffect(()=>(t.emit(`claim:${e.key}`),p__namespace.subscribe(e,({newValue:s})=>{t.emit(`pub:${e.key}`,s);},`use-push:${o}`,r),()=>{t.emit(`unclaim:${e.key}`);}),[e.key]);}var x=new Map;function T(e){let t=n__namespace.useContext(J.StoreContext),{socket:r}=n__namespace.useContext(m);return n__namespace.useEffect(()=>{var l;let o=(l=x.get(e.key))!=null?l:0;x.set(e.key,o+1);let s=o===0?p__namespace.subscribeToTransaction(e,A=>r.emit(`tx:${e.key}`,A),"use-server-action",t):()=>null;return ()=>{var I;let A=(I=x.get(e.key))!=null?I:0;x.set(e.key,A-1),s();}},[e.key]),p__namespace.runTransaction(e,t)}var ue={usePull:d,usePullFamily:b,usePullFamilyMember:v,usePush:P,useServerAction:T};
32
+ // src/realtime-context.tsx
33
+ var RealtimeContext = React6__namespace.createContext({
34
+ socket: socket_ioClient.io()
35
+ });
36
+ var RealtimeProvider = ({ children, socket }) => {
37
+ const setMyId = react.useI(RTC__namespace.myIdState__INTERNAL);
38
+ React6__namespace.useEffect(() => {
39
+ socket.on(`connect`, () => {
40
+ setMyId(socket.id);
41
+ });
42
+ socket.on(`disconnect`, () => {
43
+ setMyId(null);
44
+ });
45
+ }, [socket, setMyId]);
46
+ return /* @__PURE__ */ jsxRuntime.jsx(RealtimeContext.Provider, { value: { socket }, children });
47
+ };
48
+ function usePull(token) {
49
+ const { socket } = React6__namespace.useContext(RealtimeContext);
50
+ const store = React6__namespace.useContext(react.StoreContext);
51
+ React6__namespace.useEffect(() => RTC__namespace.pullState(token, socket, store), [token.key]);
52
+ }
53
+ function usePullFamilyMember(token) {
54
+ const { socket } = React6__namespace.useContext(RealtimeContext);
55
+ const store = React6__namespace.useContext(react.StoreContext);
56
+ React6__namespace.useEffect(() => RTC__namespace.pullFamilyMember(token, socket, store), [token.key]);
57
+ }
58
+ function usePullMutable(token) {
59
+ const { socket } = React6__namespace.useContext(RealtimeContext);
60
+ const store = React6__namespace.useContext(react.StoreContext);
61
+ React6__namespace.useEffect(() => RTC__namespace.pullMutableState(token, socket, store), [token.key]);
62
+ }
63
+ function usePullMutableFamilyMember(token) {
64
+ const { socket } = React6__namespace.useContext(RealtimeContext);
65
+ const store = React6__namespace.useContext(react.StoreContext);
66
+ React6__namespace.useEffect(
67
+ () => RTC__namespace.pullMutableFamilyMember(token, socket, store),
68
+ [token.key]
69
+ );
70
+ }
71
+ function usePush(token) {
72
+ const { socket } = React6__namespace.useContext(RealtimeContext);
73
+ const store = React6__namespace.useContext(react.StoreContext);
74
+ const id = React6__namespace.useId();
75
+ React6__namespace.useEffect(
76
+ () => RTC__namespace.pushState(token, socket, `use-push:${id}`, store),
77
+ [token.key]
78
+ );
79
+ }
80
+ function useServerAction(token) {
81
+ const store = React6__namespace.useContext(react.StoreContext);
82
+ const { socket } = React6__namespace.useContext(RealtimeContext);
83
+ React6__namespace.useEffect(
84
+ () => RTC__namespace.synchronizeTransactionResults(token, socket, store),
85
+ [token.key]
86
+ );
87
+ return AtomIO__namespace.runTransaction(token, store);
88
+ }
32
89
 
33
- exports.RealtimeContext = m;
34
- exports.RealtimeProvider = L;
35
- exports.myIdState = h;
36
- exports.myIdState__INTERNAL = R;
37
- exports.realtimeHooks = ue;
38
- exports.usePull = d;
39
- exports.usePullFamily = b;
40
- exports.usePullFamilyMember = v;
41
- exports.usePush = P;
42
- exports.useServerAction = T;
90
+ exports.RealtimeContext = RealtimeContext;
91
+ exports.RealtimeProvider = RealtimeProvider;
92
+ exports.usePull = usePull;
93
+ exports.usePullFamilyMember = usePullFamilyMember;
94
+ exports.usePullMutable = usePullMutable;
95
+ exports.usePullMutableFamilyMember = usePullMutableFamilyMember;
96
+ exports.usePush = usePush;
97
+ exports.useServerAction = useServerAction;
43
98
  //# sourceMappingURL=out.js.map
44
99
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/realtime-context.tsx","../src/realtime-state.ts","../src/use-pull.ts","../src/use-pull-family.ts","../src/use-pull-family-member.ts","../src/use-push.ts","../src/use-server-action.ts","../src/realtime-hooks.ts"],"names":["AR","React","io","AtomIO","myIdState__INTERNAL","myIdState","get","jsx","RealtimeContext","RealtimeProvider","children","socket","setMyId","StoreContext","usePull","token","store","data","usePullFamily","family","key","usePullFamilyMember","subKey","usePush","id","newValue","TX_SUBS","useServerAction","_a","count","unsubscribe","update","newCount","realtimeHooks"],"mappings":"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","sourcesContent":["import * as AR from \"atom.io/react\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\nimport { io } from \"socket.io-client\"\n\nimport { myIdState__INTERNAL } from \"./realtime-state\"\n\nexport const RealtimeContext = React.createContext<{ socket: Socket }>({\n\tsocket: io(),\n})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket\n}> = ({ children, socket }) => {\n\tconst setMyId = AR.useI(myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsocket.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket.on(`disconnect`, () => {\n\t\t\tsetMyId(null)\n\t\t})\n\t}, [socket, setMyId])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","import * as AtomIO from \"atom.io\"\n\nexport const myIdState__INTERNAL = AtomIO.atom<string | null>({\n\tkey: `myId__INTERNAL`,\n\tdefault: null,\n})\nexport const myIdState = AtomIO.selector<string | null>({\n\tkey: `myId`,\n\tget: ({ get }) => get(myIdState__INTERNAL),\n})\n","import * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePull<J extends Json.Serializable>(\n\ttoken: AtomIO.StateToken<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => {\n\t\tsocket.on(`serve:${token.key}`, (data: J) => {\n\t\t\tAtomIO.setState(token, data, store)\n\t\t})\n\t\tsocket.emit(`sub:${token.key}`)\n\t\treturn () => {\n\t\t\tsocket.off(`serve:${token.key}`)\n\t\t\tsocket.emit(`unsub:${token.key}`)\n\t\t}\n\t}, [token.key])\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePullFamily<J extends Json.Serializable>(\n\tfamily: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => {\n\t\tsocket.on(`serve:${family.key}`, (key: Json.Serializable, data: J) => {\n\t\t\tAtomIO.setState(family(key), data, store)\n\t\t})\n\t\tsocket?.emit(`sub:${family.key}`)\n\t\treturn () => {\n\t\t\tsocket?.off(`serve:${family.key}`)\n\t\t\tsocket?.emit(`unsub:${family.key}`)\n\t\t}\n\t}, [family.key])\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePullFamilyMember<J extends Json.Serializable>(\n\tfamily: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,\n\tsubKey: AtomIO.Json.Serializable,\n): void {\n\tconst token = family(subKey)\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => {\n\t\tsocket?.on(`serve:${token.key}`, (data: J) => {\n\t\t\tAtomIO.setState(family(subKey), data, store)\n\t\t})\n\t\tsocket?.emit(`sub:${family.key}`, subKey)\n\t\treturn () => {\n\t\t\tsocket?.off(`serve:${token.key}`)\n\t\t\tsocket?.emit(`unsub:${token.key}`)\n\t\t}\n\t}, [family.key])\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.StateToken<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tconst id = React.useId()\n\tReact.useEffect(() => {\n\t\tsocket.emit(`claim:${token.key}`)\n\t\tAtomIO.subscribe(\n\t\t\ttoken,\n\t\t\t({ newValue }) => {\n\t\t\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t\t\t},\n\t\t\t`use-push:${id}`,\n\t\t\tstore,\n\t\t)\n\t\treturn () => {\n\t\t\tsocket.emit(`unclaim:${token.key}`)\n\t\t}\n\t}, [token.key])\n}\n","import * as AtomIO from \"atom.io\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nconst TX_SUBS = new Map<string, number>()\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\tconst { socket } = React.useContext(RealtimeContext)\n\tReact.useEffect(() => {\n\t\tconst count = TX_SUBS.get(token.key) ?? 0\n\t\tTX_SUBS.set(token.key, count + 1)\n\t\tconst unsubscribe =\n\t\t\tcount === 0\n\t\t\t\t? AtomIO.subscribeToTransaction(\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t(update) => socket.emit(`tx:${token.key}`, update),\n\t\t\t\t\t\t`use-server-action`,\n\t\t\t\t\t\tstore,\n\t\t\t\t )\n\t\t\t\t: () => null\n\t\treturn () => {\n\t\t\tconst newCount = TX_SUBS.get(token.key) ?? 0\n\t\t\tTX_SUBS.set(token.key, newCount - 1)\n\t\t\tunsubscribe()\n\t\t}\n\t}, [token.key])\n\treturn AtomIO.runTransaction(token, store)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport { usePull } from \"./use-pull\"\nimport { usePullFamily } from \"./use-pull-family\"\nimport { usePullFamilyMember } from \"./use-pull-family-member\"\nimport { usePush } from \"./use-push\"\nimport { useServerAction } from \"./use-server-action\"\n\nexport type RealtimeHooks = {\n\tusePull: <J extends Json.Serializable>(token: AtomIO.StateToken<J>) => void\n\tusePullFamily: <J extends Json.Serializable>(\n\t\tfamily: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,\n\t) => void\n\tusePullFamilyMember: <J extends Json.Serializable>(\n\t\tfamily: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,\n\t\tsubKey: string,\n\t) => void\n\tusePush: <J extends Json.Serializable>(token: AtomIO.StateToken<J>) => void\n\tuseServerAction: <ƒ extends AtomIO.ƒn>(\n\t\ttoken: AtomIO.TransactionToken<ƒ>,\n\t) => (...parameters: Parameters<ƒ>) => ReturnType<ƒ>\n}\n\nexport const realtimeHooks: RealtimeHooks = {\n\tusePull,\n\tusePullFamily,\n\tusePullFamilyMember,\n\tusePush,\n\tuseServerAction,\n}\n\nexport * from \"./use-pull\"\nexport * from \"./use-pull-family\"\nexport * from \"./use-pull-family-member\"\nexport * from \"./use-push\"\nexport * from \"./use-server-action\"\n"]}
1
+ {"version":3,"sources":["../src/realtime-context.tsx","../src/use-pull.ts","../src/use-pull-family-member.ts","../src/use-pull-mutable.ts","../src/use-pull-mutable-family-member.ts","../src/use-push.ts","../src/use-server-action.ts"],"names":["RTC","React","StoreContext"],"mappings":";AAAA,SAAS,YAAY;AACrB,YAAY,SAAS;AACrB,YAAY,WAAW;AAEvB,SAAS,UAAU;AAoBjB;AAlBK,IAAM,kBAAwB,oBAAkC;AAAA,EACtE,QAAQ,GAAG;AACZ,CAAC;AAEM,IAAM,mBAGR,CAAC,EAAE,UAAU,OAAO,MAAM;AAC9B,QAAM,UAAU,KAAS,uBAAmB;AAC5C,EAAM,gBAAU,MAAM;AACrB,WAAO,GAAG,WAAW,MAAM;AAC1B,cAAQ,OAAO,EAAE;AAAA,IAClB,CAAC;AACD,WAAO,GAAG,cAAc,MAAM;AAC7B,cAAQ,IAAI;AAAA,IACb,CAAC;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,CAAC;AACpB,SACC,oBAAC,gBAAgB,UAAhB,EAAyB,OAAO,EAAE,OAAO,GACxC,UACF;AAEF;;;AC1BA,SAAS,oBAAoB;AAC7B,YAAYA,UAAS;AACrB,YAAYC,YAAW;AAIhB,SAAS,QACf,OACO;AACP,QAAM,EAAE,OAAO,IAAU,kBAAW,eAAe;AACnD,QAAM,QAAc,kBAAW,YAAY;AAC3C,EAAM,iBAAU,MAAU,eAAU,OAAO,QAAQ,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;AACvE;;;ACZA,SAAS,gBAAAC,qBAAoB;AAC7B,YAAYF,UAAS;AACrB,YAAYC,YAAW;AAIhB,SAAS,oBACf,OACO;AACP,QAAM,EAAE,OAAO,IAAU,kBAAW,eAAe;AACnD,QAAM,QAAc,kBAAWC,aAAY;AAC3C,EAAM,iBAAU,MAAU,sBAAiB,OAAO,QAAQ,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;AAC9E;;;ACXA,SAAS,gBAAAA,qBAAoB;AAC7B,YAAYF,UAAS;AACrB,YAAYC,YAAW;AAIhB,SAAS,eAGd,OAA4C;AAC7C,QAAM,EAAE,OAAO,IAAU,kBAAW,eAAe;AACnD,QAAM,QAAc,kBAAWC,aAAY;AAC3C,EAAM,iBAAU,MAAU,sBAAiB,OAAO,QAAQ,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;AAC9E;;;ACbA,SAAS,gBAAAA,qBAAoB;AAC7B,YAAYF,UAAS;AACrB,YAAYC,YAAW;AAIhB,SAAS,2BAGd,OAA4C;AAC7C,QAAM,EAAE,OAAO,IAAU,kBAAW,eAAe;AACnD,QAAM,QAAc,kBAAWC,aAAY;AAC3C,EAAM;AAAA,IACL,MAAU,6BAAwB,OAAO,QAAQ,KAAK;AAAA,IACtD,CAAC,MAAM,GAAG;AAAA,EACX;AACD;;;ACjBA,SAAS,gBAAAA,qBAAoB;AAC7B,YAAYF,UAAS;AACrB,YAAYC,YAAW;AAIhB,SAAS,QACf,OACO;AACP,QAAM,EAAE,OAAO,IAAU,kBAAW,eAAe;AACnD,QAAM,QAAc,kBAAWC,aAAY;AAC3C,QAAM,KAAW,aAAM;AACvB,EAAM;AAAA,IACL,MAAU,eAAU,OAAO,QAAQ,YAAY,EAAE,IAAI,KAAK;AAAA,IAC1D,CAAC,MAAM,GAAG;AAAA,EACX;AACD;;;AClBA,YAAY,YAAY;AACxB,SAAS,gBAAAA,qBAAoB;AAC7B,YAAYF,UAAS;AACrB,YAAYC,YAAW;AAIhB,SAAS,gBACf,OACkD;AAClD,QAAM,QAAc,kBAAWC,aAAY;AAC3C,QAAM,EAAE,OAAO,IAAU,kBAAW,eAAe;AACnD,EAAM;AAAA,IACL,MAAU,mCAA8B,OAAO,QAAQ,KAAK;AAAA,IAC5D,CAAC,MAAM,GAAG;AAAA,EACX;AACA,SAAc,sBAAe,OAAO,KAAK;AAC1C","sourcesContent":["import { useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\nimport { io } from \"socket.io-client\"\n\nexport const RealtimeContext = React.createContext<{ socket: Socket }>({\n\tsocket: io(),\n})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket\n}> = ({ children, socket }) => {\n\tconst setMyId = useI(RTC.myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsocket.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket.on(`disconnect`, () => {\n\t\t\tsetMyId(null)\n\t\t})\n\t}, [socket, setMyId])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePull<J extends Json.Serializable>(\n\ttoken: AtomIO.StateToken<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => RTC.pullState(token, socket, store), [token.key])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePullFamilyMember<J extends Json.Serializable>(\n\ttoken: AtomIO.AtomToken<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => RTC.pullFamilyMember(token, socket, store), [token.key])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePullMutable<\n\tT extends Transceiver<Json.Serializable>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => RTC.pullMutableState(token, socket, store), [token.key])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePullMutableFamilyMember<\n\tT extends Transceiver<Json.Serializable>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(\n\t\t() => RTC.pullMutableFamilyMember(token, socket, store),\n\t\t[token.key],\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.StateToken<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tconst id = React.useId()\n\tReact.useEffect(\n\t\t() => RTC.pushState(token, socket, `use-push:${id}`, store),\n\t\t[token.key],\n\t)\n}\n","import * as AtomIO from \"atom.io\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\tconst { socket } = React.useContext(RealtimeContext)\n\tReact.useEffect(\n\t\t() => RTC.synchronizeTransactionResults(token, socket, store),\n\t\t[token.key],\n\t)\n\treturn AtomIO.runTransaction(token, store)\n}\n"]}