atom.io 0.6.8 → 0.7.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.
- package/README.md +21 -2
- package/dist/index.d.mts +42 -461
- package/dist/index.d.ts +42 -461
- package/dist/index.js +128 -1792
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +75 -1742
- package/dist/index.mjs.map +1 -1
- package/internal/dist/index.d.mts +342 -0
- package/internal/dist/index.d.ts +342 -0
- package/internal/dist/index.js +1873 -0
- package/internal/dist/index.js.map +1 -0
- package/internal/dist/index.mjs +1798 -0
- package/internal/dist/index.mjs.map +1 -0
- package/internal/package.json +15 -0
- package/internal/src/atom/create-atom.ts +75 -0
- package/internal/src/atom/delete-atom.ts +10 -0
- package/internal/src/atom/index.ts +3 -0
- package/{src/internal → internal/src/atom}/is-default.ts +4 -2
- package/internal/src/caching.ts +21 -0
- package/internal/src/families/create-atom-family.ts +59 -0
- package/internal/src/families/create-readonly-selector-family.ts +45 -0
- package/internal/src/families/create-selector-family.ts +67 -0
- package/internal/src/families/index.ts +3 -0
- package/internal/src/get-state-internal.ts +23 -0
- package/internal/src/index.ts +13 -0
- package/internal/src/mutable/create-mutable-atom-family.ts +25 -0
- package/internal/src/mutable/create-mutable-atom.ts +49 -0
- package/internal/src/mutable/get-json-token.ts +22 -0
- package/internal/src/mutable/get-update-token.ts +20 -0
- package/internal/src/mutable/index.ts +17 -0
- package/internal/src/mutable/is-atom-token-mutable.ts +7 -0
- package/internal/src/mutable/tracker-family.ts +61 -0
- package/internal/src/mutable/tracker.ts +164 -0
- package/internal/src/mutable/transceiver.ts +110 -0
- package/internal/src/operation.ts +68 -0
- package/{src/internal → internal/src}/selector/create-read-write-selector.ts +10 -13
- package/{src/internal → internal/src}/selector/create-readonly-selector.ts +9 -8
- package/internal/src/selector/create-selector.ts +65 -0
- package/{src/internal → internal/src}/selector/index.ts +1 -0
- package/internal/src/selector/lookup-selector-sources.ts +20 -0
- package/{src/internal → internal/src}/selector/register-selector.ts +13 -9
- package/{src/internal → internal/src}/selector/trace-selector-atoms.ts +4 -2
- package/{src/internal → internal/src}/selector/update-selector-atoms.ts +4 -3
- package/internal/src/set-state/become.ts +10 -0
- package/internal/src/set-state/copy-mutable-if-needed.ts +23 -0
- package/internal/src/set-state/copy-mutable-in-transaction.ts +59 -0
- package/internal/src/set-state/copy-mutable-into-new-store.ts +34 -0
- package/internal/src/set-state/emit-update.ts +23 -0
- package/internal/src/set-state/evict-downstream.ts +39 -0
- package/internal/src/set-state/index.ts +2 -0
- package/internal/src/set-state/set-atom-state.ts +38 -0
- package/internal/src/set-state/set-selector-state.ts +19 -0
- package/internal/src/set-state/set-state-internal.ts +18 -0
- package/internal/src/set-state/stow-update.ts +42 -0
- package/internal/src/store/deposit.ts +43 -0
- package/internal/src/store/index.ts +5 -0
- package/internal/src/store/lookup.ts +26 -0
- package/internal/src/store/store.ts +154 -0
- package/internal/src/store/withdraw-new-family-member.ts +53 -0
- package/internal/src/store/withdraw.ts +113 -0
- package/internal/src/subject.ts +21 -0
- package/internal/src/subscribe/index.ts +1 -0
- package/internal/src/subscribe/recall-state.ts +19 -0
- package/internal/src/subscribe/subscribe-to-root-atoms.ts +47 -0
- package/{src/internal → internal/src}/timeline/add-atom-to-timeline.ts +50 -29
- package/internal/src/timeline/index.ts +3 -0
- package/{src/internal → internal/src/timeline}/time-travel-internal.ts +6 -6
- package/{src/internal → internal/src/timeline}/timeline-internal.ts +20 -12
- package/{src/internal → internal/src}/transaction/abort-transaction.ts +1 -1
- package/{src/internal → internal/src}/transaction/apply-transaction.ts +25 -18
- package/{src/internal → internal/src}/transaction/build-transaction.ts +12 -6
- package/{src/internal → internal/src}/transaction/index.ts +3 -2
- package/{src/internal → internal/src}/transaction/redo-transaction.ts +4 -5
- package/{src/internal → internal/src/transaction}/transaction-internal.ts +16 -13
- package/{src/internal → internal/src}/transaction/undo-transaction.ts +4 -5
- package/introspection/dist/index.d.mts +12 -260
- package/introspection/dist/index.d.ts +12 -260
- package/introspection/dist/index.js +125 -140
- package/introspection/dist/index.js.map +1 -1
- package/introspection/dist/index.mjs +103 -116
- package/introspection/dist/index.mjs.map +1 -1
- package/{src/introspection → introspection/src}/attach-atom-index.ts +41 -30
- package/{src/introspection → introspection/src}/attach-introspection-states.ts +6 -10
- package/introspection/src/attach-selector-index.ts +90 -0
- package/{src/introspection → introspection/src}/attach-timeline-family.ts +16 -16
- package/introspection/src/attach-timeline-index.ts +38 -0
- package/introspection/src/attach-transaction-index.ts +40 -0
- package/{src/introspection → introspection/src}/attach-transaction-logs.ts +11 -8
- package/json/dist/index.d.mts +41 -2
- package/json/dist/index.d.ts +41 -2
- package/json/dist/index.js +88 -48
- package/json/dist/index.js.map +1 -1
- package/json/dist/index.mjs +76 -13
- package/json/dist/index.mjs.map +1 -1
- package/json/src/index.ts +5 -0
- package/json/src/select-json-family.ts +35 -0
- package/json/src/select-json.ts +22 -0
- package/package.json +105 -57
- package/react/dist/index.d.mts +9 -17
- package/react/dist/index.d.ts +9 -17
- package/react/dist/index.js +45 -77
- package/react/dist/index.js.map +1 -1
- package/react/dist/index.mjs +18 -34
- package/react/dist/index.mjs.map +1 -1
- package/react/src/store-context.tsx +12 -0
- package/react/src/store-hooks.ts +36 -0
- package/react-devtools/dist/index.css +1 -1
- package/react-devtools/dist/index.css.map +1 -1
- package/react-devtools/dist/index.d.mts +199 -230
- package/react-devtools/dist/index.d.ts +199 -230
- package/react-devtools/dist/index.js +610 -2466
- package/react-devtools/dist/index.js.map +1 -1
- package/react-devtools/dist/index.mjs +543 -2401
- package/react-devtools/dist/index.mjs.map +1 -1
- package/{src/react-devtools → react-devtools/src}/AtomIODevtools.tsx +5 -3
- package/{src/react-devtools → react-devtools/src}/Button.tsx +2 -3
- package/{src/react-devtools → react-devtools/src}/StateEditor.tsx +3 -2
- package/{src/react-devtools → react-devtools/src}/StateIndex.tsx +7 -4
- package/{src/react-devtools → react-devtools/src}/TimelineIndex.tsx +7 -11
- package/{src/react-devtools → react-devtools/src}/TransactionIndex.tsx +4 -4
- package/{src/react-devtools → react-devtools/src}/Updates.tsx +9 -4
- package/{src/react-devtools → react-devtools/src}/index.ts +5 -5
- package/realtime-react/dist/index.d.mts +9 -25
- package/realtime-react/dist/index.d.ts +9 -25
- package/realtime-react/dist/index.js +75 -193
- package/realtime-react/dist/index.js.map +1 -1
- package/realtime-react/dist/index.mjs +44 -148
- package/realtime-react/dist/index.mjs.map +1 -1
- package/realtime-react/src/index.ts +7 -0
- package/{src/realtime-react → realtime-react/src}/realtime-context.tsx +3 -4
- package/realtime-react/src/use-pull-family-member.ts +15 -0
- package/realtime-react/src/use-pull-mutable-family-member.ts +20 -0
- package/realtime-react/src/use-pull-mutable.ts +17 -0
- package/realtime-react/src/use-pull.ts +15 -0
- package/realtime-react/src/use-push.ts +19 -0
- package/realtime-react/src/use-server-action.ts +18 -0
- package/realtime-testing/dist/index.d.mts +49 -0
- package/realtime-testing/dist/index.d.ts +49 -0
- package/realtime-testing/dist/index.js +147 -0
- package/realtime-testing/dist/index.js.map +1 -0
- package/realtime-testing/dist/index.mjs +116 -0
- package/realtime-testing/dist/index.mjs.map +1 -0
- package/{src/realtime-testing → realtime-testing/src}/setup-realtime-test.tsx +10 -8
- package/src/atom.ts +64 -8
- package/src/index.ts +36 -29
- package/src/logger.ts +7 -7
- package/src/selector.ts +5 -5
- package/src/silo.ts +49 -43
- package/src/subscribe.ts +27 -22
- package/src/timeline.ts +9 -4
- package/src/transaction.ts +3 -4
- package/transceivers/set-rtx/dist/index.d.mts +39 -0
- package/transceivers/set-rtx/dist/index.d.ts +39 -0
- package/transceivers/set-rtx/dist/index.js +213 -0
- package/transceivers/set-rtx/dist/index.js.map +1 -0
- package/transceivers/set-rtx/dist/index.mjs +211 -0
- package/transceivers/set-rtx/dist/index.mjs.map +1 -0
- package/{realtime → transceivers/set-rtx}/package.json +1 -1
- package/transceivers/set-rtx/src/index.ts +1 -0
- package/transceivers/set-rtx/src/set-rtx.ts +242 -0
- package/realtime/dist/index.d.mts +0 -25
- package/realtime/dist/index.d.ts +0 -25
- package/realtime/dist/index.js +0 -190
- package/realtime/dist/index.js.map +0 -1
- package/realtime/dist/index.mjs +0 -151
- package/realtime/dist/index.mjs.map +0 -1
- package/src/internal/atom-internal.ts +0 -54
- package/src/internal/families-internal.ts +0 -144
- package/src/internal/get.ts +0 -129
- package/src/internal/index.ts +0 -15
- package/src/internal/operation.ts +0 -139
- package/src/internal/selector/lookup-selector-sources.ts +0 -16
- package/src/internal/selector-internal.ts +0 -58
- package/src/internal/set.ts +0 -99
- package/src/internal/store.ts +0 -151
- package/src/internal/subscribe-internal.ts +0 -88
- package/src/internal/timeline/index.ts +0 -1
- package/src/introspection/attach-selector-index.ts +0 -77
- package/src/introspection/attach-timeline-index.ts +0 -36
- package/src/introspection/attach-transaction-index.ts +0 -38
- package/src/json/index.ts +0 -1
- package/src/json/select-json.ts +0 -18
- package/src/react/store-context.tsx +0 -13
- package/src/react/store-hooks.ts +0 -47
- package/src/react-explorer/AtomIOExplorer.tsx +0 -218
- package/src/react-explorer/explorer-effects.ts +0 -20
- package/src/react-explorer/explorer-states.ts +0 -217
- package/src/react-explorer/index.ts +0 -23
- package/src/react-explorer/space-states.ts +0 -72
- package/src/react-explorer/view-states.ts +0 -41
- package/src/realtime/README.md +0 -33
- package/src/realtime/hook-composition/expose-family.ts +0 -101
- package/src/realtime/hook-composition/expose-single.ts +0 -38
- package/src/realtime/hook-composition/expose-timeline.ts +0 -60
- package/src/realtime/hook-composition/index.ts +0 -12
- package/src/realtime/hook-composition/receive-state.ts +0 -29
- package/src/realtime/hook-composition/receive-transaction.ts +0 -18
- package/src/realtime/index.ts +0 -1
- package/src/realtime-react/index.ts +0 -3
- package/src/realtime-react/realtime-hooks.ts +0 -39
- package/src/realtime-react/realtime-state.ts +0 -10
- package/src/realtime-react/use-pull-family-member.ts +0 -26
- package/src/realtime-react/use-pull-family.ts +0 -24
- package/src/realtime-react/use-pull.ts +0 -24
- package/src/realtime-react/use-push.ts +0 -27
- package/src/realtime-react/use-server-action.ts +0 -33
- package/src/tracker/index.ts +0 -3
- package/src/tracker/tracker.ts +0 -61
- package/src/web-effects/index.ts +0 -1
- package/src/web-effects/storage.ts +0 -30
- /package/{src/introspection → introspection/src}/index.ts +0 -0
- /package/{src/react → react/src}/index.ts +0 -0
- /package/{src/react-devtools → react-devtools/src}/devtools.scss +0 -0
- /package/{src/realtime-testing → realtime-testing/src}/index.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/set-rtx.ts"],"names":["update","value"],"mappings":"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","sourcesContent":["import type { Transceiver, TransceiverMode } from \"atom.io/internal\"\nimport { Subject } from \"atom.io/internal\"\nimport type { Json, Stringified, primitive } from \"atom.io/json\"\nimport { parseJson, stringifyJson } from \"atom.io/json\"\n\nexport type SetUpdate =\n\t| `add:${string}`\n\t| `clear:${string}`\n\t| `del:${string}`\n\t| `tx:${string}`\nexport type NumberedSetUpdate = `${number}=${SetUpdate}`\n\nexport interface SetRTXJson<P extends primitive> extends Json.Object {\n\tmembers: P[]\n\tcache: (NumberedSetUpdate | null)[]\n\tcacheLimit: number\n\tcacheIdx: number\n\tcacheUpdateNumber: number\n}\nexport class SetRTX<P extends primitive>\n\textends Set<P>\n\timplements Transceiver<NumberedSetUpdate>\n{\n\tpublic mode: TransceiverMode = `record`\n\tpublic readonly subject = new Subject<SetUpdate>()\n\tpublic cacheLimit = 0\n\tpublic cache: (NumberedSetUpdate | null)[] = []\n\tpublic cacheIdx = -1\n\tpublic cacheUpdateNumber = -1\n\n\tpublic constructor(values?: Set<P> | readonly P[] | null, cacheLimit = 0) {\n\t\tsuper(values)\n\t\tif (values instanceof SetRTX) {\n\t\t\tthis.parent = values\n\t\t\tthis.cacheUpdateNumber = values.cacheUpdateNumber\n\t\t}\n\t\tif (cacheLimit) {\n\t\t\tthis.cacheLimit = cacheLimit\n\t\t\tthis.cache = new Array(cacheLimit)\n\t\t\tthis.subscribe(`auto cache`, (update) => {\n\t\t\t\tthis.cacheIdx++\n\t\t\t\tthis.cacheIdx %= this.cacheLimit\n\t\t\t\tthis.cache[this.cacheIdx] = update\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic toJSON(): SetRTXJson<P> {\n\t\treturn {\n\t\t\tmembers: [...this],\n\t\t\tcache: this.cache,\n\t\t\tcacheLimit: this.cacheLimit,\n\t\t\tcacheIdx: this.cacheIdx,\n\t\t\tcacheUpdateNumber: this.cacheUpdateNumber,\n\t\t}\n\t}\n\n\tpublic static fromJSON<P extends primitive>(json: SetRTXJson<P>): SetRTX<P> {\n\t\tconst set = new SetRTX<P>(json.members, json.cacheLimit)\n\t\tset.cache = json.cache\n\t\tset.cacheIdx = json.cacheIdx\n\t\tset.cacheUpdateNumber = json.cacheUpdateNumber\n\t\treturn set\n\t}\n\n\tpublic add(value: P): this {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`add:${stringifyJson<P>(value)}`)\n\t\t}\n\t\treturn super.add(value)\n\t}\n\n\tpublic clear(): void {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`clear:${JSON.stringify([...this])}`)\n\t\t}\n\t\tsuper.clear()\n\t}\n\n\tpublic delete(value: P): boolean {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`del:${stringifyJson<P>(value)}`)\n\t\t}\n\t\treturn super.delete(value)\n\t}\n\n\tpublic readonly parent: SetRTX<P> | null\n\tpublic child: SetRTX<P> | null = null\n\tpublic transactionUpdates: SetUpdate[] | null = null\n\tpublic transaction(run: (child: SetRTX<P>) => boolean): void {\n\t\tthis.mode = `transaction`\n\t\tthis.transactionUpdates = []\n\t\tthis.child = new SetRTX(this)\n\t\tconst unsubscribe = this.child._subscribe(`transaction`, (update) => {\n\t\t\tthis.transactionUpdates?.push(update)\n\t\t})\n\t\ttry {\n\t\t\tconst shouldCommit = run(this.child)\n\t\t\tif (shouldCommit) {\n\t\t\t\tthis.cacheUpdateNumber++\n\t\t\t\tthis.emit(`tx:${this.transactionUpdates.join(`;`)}`)\n\t\t\t\tfor (const update of this.transactionUpdates) {\n\t\t\t\t\tthis.doStep(update)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (thrown) {\n\t\t\tconsole.error(`Failed to apply transaction: ${thrown}`)\n\t\t} finally {\n\t\t\tunsubscribe()\n\t\t\tthis.child = null\n\t\t\tthis.transactionUpdates = null\n\t\t\tthis.mode = `record`\n\t\t}\n\t}\n\n\tprotected _subscribe(\n\t\tkey: string,\n\t\tfn: (update: SetUpdate) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, fn)\n\t}\n\tpublic subscribe(\n\t\tkey: string,\n\t\tfn: (update: NumberedSetUpdate) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, (update) =>\n\t\t\tfn(`${this.cacheUpdateNumber}=${update}`),\n\t\t)\n\t}\n\n\tpublic emit(update: SetUpdate): void {\n\t\tthis.subject.next(update)\n\t}\n\n\tprivate doStep(update: SetUpdate): void {\n\t\tconst typeValueBreak = update.indexOf(`:`)\n\t\tconst type = update.substring(0, typeValueBreak)\n\t\tconst value = update.substring(typeValueBreak + 1)\n\t\tswitch (type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.add(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `clear`:\n\t\t\t\tthis.clear()\n\t\t\t\tbreak\n\t\t\tcase `del`:\n\t\t\t\tthis.delete(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `tx`:\n\t\t\t\tfor (const update of value.split(`;`)) {\n\t\t\t\t\tthis.doStep(update as SetUpdate)\n\t\t\t\t}\n\t\t}\n\t}\n\n\tpublic do(update: NumberedSetUpdate): number | `OUT_OF_RANGE` | null {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\tconst updateNumber = Number(update.substring(0, breakpoint))\n\t\tconst eventOffset = updateNumber - this.cacheUpdateNumber\n\t\tconst isFuture = eventOffset > 0\n\t\tif (isFuture) {\n\t\t\tif (eventOffset === 1) {\n\t\t\t\tthis.mode = `playback`\n\t\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdate\n\t\t\t\tthis.doStep(innerUpdate)\n\t\t\t\tthis.mode = `record`\n\t\t\t\tthis.cacheUpdateNumber = updateNumber\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.cacheUpdateNumber + 1\n\t\t} else {\n\t\t\tif (Math.abs(eventOffset) < this.cacheLimit) {\n\t\t\t\tconst eventIdx = this.cacheIdx + eventOffset\n\t\t\t\tconst cachedUpdate = this.cache[eventIdx]\n\t\t\t\tif (cachedUpdate === update) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tthis.mode = `playback`\n\t\t\t\tlet done = false\n\t\t\t\twhile (!done) {\n\t\t\t\t\tthis.cacheIdx %= this.cacheLimit\n\t\t\t\t\tconst update = this.cache[this.cacheIdx]\n\t\t\t\t\tthis.cacheIdx--\n\t\t\t\t\tif (!update) {\n\t\t\t\t\t\treturn `OUT_OF_RANGE`\n\t\t\t\t\t}\n\t\t\t\t\tconst undoRes = this.undo(update)\n\t\t\t\t\tdone = this.cacheIdx === eventIdx - 1\n\t\t\t\t}\n\t\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdate\n\t\t\t\tthis.doStep(innerUpdate)\n\t\t\t\tthis.mode = `record`\n\t\t\t\tthis.cacheUpdateNumber = updateNumber\n\t\t\t\treturn null\n\t\t\t} else {\n\t\t\t\treturn `OUT_OF_RANGE`\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic undoStep(update: SetUpdate): void {\n\t\tconst breakpoint = update.indexOf(`:`)\n\t\tconst type = update.substring(0, breakpoint)\n\t\tconst value = update.substring(breakpoint + 1)\n\t\tswitch (type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.delete(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `del`:\n\t\t\t\tthis.add(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `clear`: {\n\t\t\t\tconst values = JSON.parse(value) as P[]\n\t\t\t\tfor (const value of values) this.add(value)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase `tx`: {\n\t\t\t\tconst updates = value.split(`;`) as SetUpdate[]\n\t\t\t\tfor (let i = updates.length - 1; i >= 0; i--) {\n\t\t\t\t\tthis.undoStep(updates[i])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic undo(update: NumberedSetUpdate): number | null {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\tconst updateNumber = Number(update.substring(0, breakpoint))\n\t\tif (updateNumber === this.cacheUpdateNumber) {\n\t\t\tthis.mode = `playback`\n\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdate\n\t\t\tthis.undoStep(innerUpdate)\n\t\t\tthis.mode = `record`\n\t\t\tthis.cacheUpdateNumber--\n\t\t\treturn null\n\t\t}\n\t\treturn this.cacheUpdateNumber\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./set-rtx"
|
|
@@ -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,25 +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
|
-
type ƒn = (...parameters: any[]) => any;
|
|
15
|
-
|
|
16
|
-
declare const useReceiveTransaction: ({ socket, store }: ServerConfig) => <ƒ extends ƒn>(tx: AtomIO.TransactionToken<ƒ>) => () => void;
|
|
17
|
-
|
|
18
|
-
declare const useReceiveState: ({ socket, store }: ServerConfig) => <J extends Serializable>(token: AtomIO.StateToken<J>) => () => void;
|
|
19
|
-
|
|
20
|
-
type ServerConfig = {
|
|
21
|
-
socket: SocketIO.Socket;
|
|
22
|
-
store?: AtomIO.__INTERNAL__.Store;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export { ServerConfig, useExposeFamily, useExposeSingle, useReceiveState, useReceiveTransaction };
|
package/realtime/dist/index.d.ts
DELETED
|
@@ -1,25 +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
|
-
type ƒn = (...parameters: any[]) => any;
|
|
15
|
-
|
|
16
|
-
declare const useReceiveTransaction: ({ socket, store }: ServerConfig) => <ƒ extends ƒn>(tx: AtomIO.TransactionToken<ƒ>) => () => void;
|
|
17
|
-
|
|
18
|
-
declare const useReceiveState: ({ socket, store }: ServerConfig) => <J extends Serializable>(token: AtomIO.StateToken<J>) => () => void;
|
|
19
|
-
|
|
20
|
-
type ServerConfig = {
|
|
21
|
-
socket: SocketIO.Socket;
|
|
22
|
-
store?: AtomIO.__INTERNAL__.Store;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export { ServerConfig, useExposeFamily, useExposeSingle, useReceiveState, useReceiveTransaction };
|
package/realtime/dist/index.js
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
var __create = Object.create;
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
-
mod
|
|
26
|
-
));
|
|
27
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
-
|
|
29
|
-
// ../src/realtime/index.ts
|
|
30
|
-
var realtime_exports = {};
|
|
31
|
-
__export(realtime_exports, {
|
|
32
|
-
useExposeFamily: () => useExposeFamily,
|
|
33
|
-
useExposeSingle: () => useExposeSingle,
|
|
34
|
-
useReceiveState: () => useReceiveState,
|
|
35
|
-
useReceiveTransaction: () => useReceiveTransaction
|
|
36
|
-
});
|
|
37
|
-
module.exports = __toCommonJS(realtime_exports);
|
|
38
|
-
|
|
39
|
-
// ../src/realtime/hook-composition/expose-single.ts
|
|
40
|
-
var AtomIO = __toESM(require("atom.io"));
|
|
41
|
-
var useExposeSingle = ({ socket, store }) => {
|
|
42
|
-
return function exposeSingle(token) {
|
|
43
|
-
let unsubscribeFromStateUpdates = null;
|
|
44
|
-
const fillUnsubRequest = () => {
|
|
45
|
-
socket.off(`unsub:${token.key}`, fillUnsubRequest);
|
|
46
|
-
unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
|
|
47
|
-
unsubscribeFromStateUpdates = null;
|
|
48
|
-
};
|
|
49
|
-
const fillSubRequest = () => {
|
|
50
|
-
socket.emit(`serve:${token.key}`, AtomIO.getState(token, store));
|
|
51
|
-
unsubscribeFromStateUpdates = AtomIO.subscribe(
|
|
52
|
-
token,
|
|
53
|
-
({ newValue }) => {
|
|
54
|
-
socket.emit(`serve:${token.key}`, newValue);
|
|
55
|
-
},
|
|
56
|
-
store
|
|
57
|
-
);
|
|
58
|
-
socket.on(`unsub:${token.key}`, fillUnsubRequest);
|
|
59
|
-
};
|
|
60
|
-
socket.on(`sub:${token.key}`, fillSubRequest);
|
|
61
|
-
return () => {
|
|
62
|
-
socket.off(`sub:${token.key}`, fillSubRequest);
|
|
63
|
-
unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
// ../../anvl/src/json/index.ts
|
|
69
|
-
var parseJson = (str) => JSON.parse(str);
|
|
70
|
-
|
|
71
|
-
// ../src/realtime/hook-composition/expose-family.ts
|
|
72
|
-
var AtomIO2 = __toESM(require("atom.io"));
|
|
73
|
-
var subscribeToTokenCreation = (family, handleTokenCreation) => {
|
|
74
|
-
const subscription = family.type === `atom_family` ? family.subject.subscribe(handleTokenCreation) : family.subject.subscribe(handleTokenCreation);
|
|
75
|
-
return () => subscription.unsubscribe();
|
|
76
|
-
};
|
|
77
|
-
var useExposeFamily = ({ socket, store }) => {
|
|
78
|
-
return function exposeFamily(family, index) {
|
|
79
|
-
const unsubSingleCallbacksByKey = /* @__PURE__ */ new Map();
|
|
80
|
-
const unsubFamilyCallbacksByKey = /* @__PURE__ */ new Map();
|
|
81
|
-
const fillFamilyUnsubRequest = () => {
|
|
82
|
-
unsubFamilyCallbacksByKey.forEach((unsub) => unsub());
|
|
83
|
-
unsubFamilyCallbacksByKey.clear();
|
|
84
|
-
socket.off(`unsub:${family.key}`, fillFamilyUnsubRequest);
|
|
85
|
-
};
|
|
86
|
-
const fillSingleUnsubRequest = (key) => {
|
|
87
|
-
socket.off(`unsub:${key}`, fillSingleUnsubRequest);
|
|
88
|
-
const unsub = unsubSingleCallbacksByKey.get(key);
|
|
89
|
-
if (unsub) {
|
|
90
|
-
unsub();
|
|
91
|
-
unsubSingleCallbacksByKey.delete(key);
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
const fillSubRequest = (subKey) => {
|
|
95
|
-
if (subKey === void 0) {
|
|
96
|
-
const keys = AtomIO2.getState(index, store);
|
|
97
|
-
keys.forEach((key) => {
|
|
98
|
-
var _a;
|
|
99
|
-
const token = family(key);
|
|
100
|
-
socket.emit(
|
|
101
|
-
`serve:${family.key}`,
|
|
102
|
-
parseJson(((_a = token.family) == null ? void 0 : _a.subKey) || `null`),
|
|
103
|
-
AtomIO2.getState(token, store)
|
|
104
|
-
);
|
|
105
|
-
});
|
|
106
|
-
const unsubscribeFromTokenCreation = subscribeToTokenCreation(
|
|
107
|
-
family,
|
|
108
|
-
(token) => {
|
|
109
|
-
const unsub = AtomIO2.subscribe(
|
|
110
|
-
token,
|
|
111
|
-
({ newValue }) => {
|
|
112
|
-
var _a;
|
|
113
|
-
socket.emit(
|
|
114
|
-
`serve:${family.key}`,
|
|
115
|
-
parseJson(((_a = token.family) == null ? void 0 : _a.subKey) || `null`),
|
|
116
|
-
newValue
|
|
117
|
-
);
|
|
118
|
-
},
|
|
119
|
-
store
|
|
120
|
-
);
|
|
121
|
-
unsubFamilyCallbacksByKey.set(token.key, unsub);
|
|
122
|
-
}
|
|
123
|
-
);
|
|
124
|
-
unsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation);
|
|
125
|
-
socket.on(`unsub:${family.key}`, fillFamilyUnsubRequest);
|
|
126
|
-
} else {
|
|
127
|
-
const token = family(subKey);
|
|
128
|
-
socket.emit(`serve:${token.key}`, AtomIO2.getState(token, store));
|
|
129
|
-
const unsubscribe = AtomIO2.subscribe(
|
|
130
|
-
token,
|
|
131
|
-
({ newValue }) => {
|
|
132
|
-
socket.emit(`serve:${token.key}`, newValue);
|
|
133
|
-
},
|
|
134
|
-
store
|
|
135
|
-
);
|
|
136
|
-
unsubSingleCallbacksByKey.set(token.key, unsubscribe);
|
|
137
|
-
socket.on(`unsub:${token.key}`, () => {
|
|
138
|
-
fillSingleUnsubRequest(token.key);
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
socket.on(`sub:${family.key}`, fillSubRequest);
|
|
143
|
-
return () => {
|
|
144
|
-
socket.off(`sub:${family.key}`, fillSubRequest);
|
|
145
|
-
unsubFamilyCallbacksByKey.forEach((unsub) => unsub());
|
|
146
|
-
unsubSingleCallbacksByKey.forEach((unsub) => unsub());
|
|
147
|
-
unsubFamilyCallbacksByKey.clear();
|
|
148
|
-
unsubSingleCallbacksByKey.clear();
|
|
149
|
-
};
|
|
150
|
-
};
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
// ../src/realtime/hook-composition/receive-transaction.ts
|
|
154
|
-
var AtomIO3 = __toESM(require("atom.io"));
|
|
155
|
-
var useReceiveTransaction = ({ socket, store }) => {
|
|
156
|
-
return function receiveTransaction(tx) {
|
|
157
|
-
const fillTransactionRequest = (update) => AtomIO3.runTransaction(tx, store)(...update.params);
|
|
158
|
-
socket.on(`tx:${tx.key}`, fillTransactionRequest);
|
|
159
|
-
return () => socket.off(`tx:${tx.key}`, fillTransactionRequest);
|
|
160
|
-
};
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
// ../src/realtime/hook-composition/receive-state.ts
|
|
164
|
-
var AtomIO4 = __toESM(require("atom.io"));
|
|
165
|
-
var useReceiveState = ({ socket, store }) => {
|
|
166
|
-
return function receiveState(token) {
|
|
167
|
-
const publish = (newValue) => AtomIO4.setState(token, newValue, store);
|
|
168
|
-
const fillPubUnclaim = () => {
|
|
169
|
-
socket.off(`pub:${token.key}`, publish);
|
|
170
|
-
socket.off(`unclaim:${token.key}`, fillPubUnclaim);
|
|
171
|
-
};
|
|
172
|
-
const fillPubClaim = () => {
|
|
173
|
-
socket.on(`pub:${token.key}`, publish);
|
|
174
|
-
socket.on(`unclaim:${token.key}`, fillPubUnclaim);
|
|
175
|
-
};
|
|
176
|
-
socket.on(`claim:${token.key}`, fillPubClaim);
|
|
177
|
-
return () => {
|
|
178
|
-
socket.off(`claim:${token.key}`, fillPubClaim);
|
|
179
|
-
socket.off(`pub:${token.key}`, publish);
|
|
180
|
-
};
|
|
181
|
-
};
|
|
182
|
-
};
|
|
183
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
184
|
-
0 && (module.exports = {
|
|
185
|
-
useExposeFamily,
|
|
186
|
-
useExposeSingle,
|
|
187
|
-
useReceiveState,
|
|
188
|
-
useReceiveTransaction
|
|
189
|
-
});
|
|
190
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/realtime/index.ts","../../src/realtime/hook-composition/expose-single.ts","../../../anvl/src/json/index.ts","../../src/realtime/hook-composition/expose-family.ts","../../src/realtime/hook-composition/receive-transaction.ts","../../src/realtime/hook-composition/receive-state.ts"],"sourcesContent":["export * from \"./hook-composition\"\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 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\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\thandleTokenCreation: (token: AtomIO.StateToken<T>) => void,\n): (() => void) => {\n\tconst subscription =\n\t\tfamily.type === `atom_family`\n\t\t\t? family.subject.subscribe(handleTokenCreation)\n\t\t\t: family.subject.subscribe(handleTokenCreation)\n\treturn () => subscription.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(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\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\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 { ƒn } from \"~/packages/anvl/src/function\"\n\nimport type { ServerConfig } from \".\"\n\nexport const useReceiveTransaction = ({ socket, store }: ServerConfig) => {\n\treturn function receiveTransaction<ƒ extends ƒ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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,aAAwB;AAKjB,IAAM,kBAAkB,CAAC,EAAE,QAAQ,MAAM,MAAoB;AACnE,SAAO,SAAS,aACf,OACa;AACb,QAAI,8BAAmD;AAEvD,UAAM,mBAAmB,MAAM;AAC9B,aAAO,IAAI,SAAS,MAAM,GAAG,IAAI,gBAAgB;AACjD;AACA,oCAA8B;AAAA,IAC/B;AAEA,UAAM,iBAAiB,MAAM;AAC5B,aAAO,KAAK,SAAS,MAAM,GAAG,IAAW,gBAAS,OAAO,KAAK,CAAC;AAC/D,oCAAqC;AAAA,QACpC;AAAA,QACA,CAAC,EAAE,SAAS,MAAM;AACjB,iBAAO,KAAK,SAAS,MAAM,GAAG,IAAI,QAAQ;AAAA,QAC3C;AAAA,QACA;AAAA,MACD;AACA,aAAO,GAAG,SAAS,MAAM,GAAG,IAAI,gBAAgB;AAAA,IACjD;AAEA,WAAO,GAAG,OAAO,MAAM,GAAG,IAAI,cAAc;AAE5C,WAAO,MAAM;AACZ,aAAO,IAAI,OAAO,MAAM,GAAG,IAAI,cAAc;AAC7C;AAAA,IACD;AAAA,EACD;AACD;;;ACjCO,IAAM,YAAY,CACxB,QAC4D,KAAK,MAAM,GAAG;;;ACJ3E,IAAAA,UAAwB;AAIxB,IAAM,2BAA2B,CAChC,QACA,wBACkB;AAClB,QAAM,eACL,OAAO,SAAS,gBACb,OAAO,QAAQ,UAAU,mBAAmB,IAC5C,OAAO,QAAQ,UAAU,mBAAmB;AAChD,SAAO,MAAM,aAAa,YAAY;AACvC;AAGO,IAAM,kBAAkB,CAAC,EAAE,QAAQ,MAAM,MAAoB;AACnE,SAAO,SAAS,aACf,QACA,OACa;AACb,UAAM,4BAA4B,oBAAI,IAAwB;AAC9D,UAAM,4BAA4B,oBAAI,IAAwB;AAE9D,UAAM,yBAAyB,MAAM;AACpC,gCAA0B,QAAQ,CAAC,UAAU,MAAM,CAAC;AACpD,gCAA0B,MAAM;AAChC,aAAO,IAAI,SAAS,OAAO,GAAG,IAAI,sBAAsB;AAAA,IACzD;AAEA,UAAM,yBAAyB,CAAC,QAAgB;AAC/C,aAAO,IAAI,SAAS,GAAG,IAAI,sBAAsB;AACjD,YAAM,QAAQ,0BAA0B,IAAI,GAAG;AAC/C,UAAI,OAAO;AACV,cAAM;AACN,kCAA0B,OAAO,GAAG;AAAA,MACrC;AAAA,IACD;AAEA,UAAM,iBAAiB,CAAC,WAAsC;AAC7D,UAAI,WAAW,QAAW;AACzB,cAAM,OAAc,iBAAS,OAAO,KAAK;AACzC,aAAK,QAAQ,CAAC,QAAQ;AA5C1B;AA6CK,gBAAM,QAAQ,OAAO,GAAG;AACxB,iBAAO;AAAA,YACN,SAAS,OAAO,GAAG;AAAA,YACnB,YAAU,WAAM,WAAN,mBAAc,WAAU,MAAM;AAAA,YACjC,iBAAS,OAAO,KAAK;AAAA,UAC7B;AAAA,QACD,CAAC;AAED,cAAM,+BAA+B;AAAA,UACpC;AAAA,UACA,CAAC,UAAU;AACV,kBAAM,QAAe;AAAA,cACpB;AAAA,cACA,CAAC,EAAE,SAAS,MAAM;AA1DzB;AA2DQ,uBAAO;AAAA,kBACN,SAAS,OAAO,GAAG;AAAA,kBACnB,YAAU,WAAM,WAAN,mBAAc,WAAU,MAAM;AAAA,kBACxC;AAAA,gBACD;AAAA,cACD;AAAA,cACA;AAAA,YACD;AACA,sCAA0B,IAAI,MAAM,KAAK,KAAK;AAAA,UAC/C;AAAA,QACD;AACA,kCAA0B,IAAI,OAAO,KAAK,4BAA4B;AAEtE,eAAO,GAAG,SAAS,OAAO,GAAG,IAAI,sBAAsB;AAAA,MACxD,OAAO;AACN,cAAM,QAAQ,OAAO,MAAM;AAC3B,eAAO,KAAK,SAAS,MAAM,GAAG,IAAW,iBAAS,OAAO,KAAK,CAAC;AAC/D,cAAM,cAAqB;AAAA,UAC1B;AAAA,UACA,CAAC,EAAE,SAAS,MAAM;AACjB,mBAAO,KAAK,SAAS,MAAM,GAAG,IAAI,QAAQ;AAAA,UAC3C;AAAA,UACA;AAAA,QACD;AACA,kCAA0B,IAAI,MAAM,KAAK,WAAW;AACpD,eAAO,GAAG,SAAS,MAAM,GAAG,IAAI,MAAM;AACrC,iCAAuB,MAAM,GAAG;AAAA,QACjC,CAAC;AAAA,MACF;AAAA,IACD;AAEA,WAAO,GAAG,OAAO,OAAO,GAAG,IAAI,cAAc;AAE7C,WAAO,MAAM;AACZ,aAAO,IAAI,OAAO,OAAO,GAAG,IAAI,cAAc;AAC9C,gCAA0B,QAAQ,CAAC,UAAU,MAAM,CAAC;AACpD,gCAA0B,QAAQ,CAAC,UAAU,MAAM,CAAC;AACpD,gCAA0B,MAAM;AAChC,gCAA0B,MAAM;AAAA,IACjC;AAAA,EACD;AACD;;;ACpGA,IAAAC,UAAwB;AAMjB,IAAM,wBAAwB,CAAC,EAAE,QAAQ,MAAM,MAAoB;AACzE,SAAO,SAAS,mBACf,IACa;AACb,UAAM,yBAAyB,CAAC,WACxB,uBAAkB,IAAI,KAAK,EAAE,GAAG,OAAO,MAAM;AAErD,WAAO,GAAG,MAAM,GAAG,GAAG,IAAI,sBAAsB;AAEhD,WAAO,MAAM,OAAO,IAAI,MAAM,GAAG,GAAG,IAAI,sBAAsB;AAAA,EAC/D;AACD;;;AChBA,IAAAC,UAAwB;AAKjB,IAAM,kBAAkB,CAAC,EAAE,QAAQ,MAAM,MAAoB;AACnE,SAAO,SAAS,aACf,OACa;AACb,UAAM,UAAU,CAAC,aAAuB,iBAAS,OAAO,UAAU,KAAK;AAEvE,UAAM,iBAAiB,MAAM;AAC5B,aAAO,IAAI,OAAO,MAAM,GAAG,IAAI,OAAO;AACtC,aAAO,IAAI,WAAW,MAAM,GAAG,IAAI,cAAc;AAAA,IAClD;AACA,UAAM,eAAe,MAAM;AAC1B,aAAO,GAAG,OAAO,MAAM,GAAG,IAAI,OAAO;AACrC,aAAO,GAAG,WAAW,MAAM,GAAG,IAAI,cAAc;AAAA,IACjD;AAEA,WAAO,GAAG,SAAS,MAAM,GAAG,IAAI,YAAY;AAE5C,WAAO,MAAM;AACZ,aAAO,IAAI,SAAS,MAAM,GAAG,IAAI,YAAY;AAC7C,aAAO,IAAI,OAAO,MAAM,GAAG,IAAI,OAAO;AAAA,IACvC;AAAA,EACD;AACD;","names":["AtomIO","AtomIO","AtomIO"]}
|