atom.io 0.28.2 → 0.29.1
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/dist/{chunk-D3ZPRYEW.js → chunk-4WXELLFT.js} +40 -49
- package/dist/index.d.ts +15 -15
- package/ephemeral/dist/index.d.ts +6 -6
- package/ephemeral/src/find-state.ts +6 -6
- package/immortal/dist/index.d.ts +6 -6
- package/immortal/src/seek-state.ts +6 -6
- package/internal/dist/index.d.ts +27 -27
- package/internal/dist/index.js +1 -1
- package/internal/src/atom/dispose-atom.ts +0 -11
- package/internal/src/families/find-in-store.ts +8 -8
- package/internal/src/families/get-family-of-token.ts +64 -0
- package/internal/src/families/init-family-member.ts +9 -10
- package/internal/src/families/seek-in-store.ts +8 -8
- package/internal/src/get-state/get-from-store.ts +18 -4
- package/internal/src/ingest-updates/ingest-creation-disposal.ts +16 -25
- package/internal/src/selector/dispose-selector.ts +0 -13
- package/internal/src/set-state/set-into-store.ts +13 -5
- package/json/dist/index.d.ts +3 -3
- package/json/dist/index.js +1 -1
- package/json/src/entries.ts +1 -1
- package/json/src/index.ts +13 -1
- package/package.json +13 -13
- package/realtime-server/dist/index.d.ts +8 -10
- package/realtime-server/src/ipc-sockets/child-socket.ts +1 -5
- package/realtime-server/src/ipc-sockets/custom-socket.ts +7 -7
- package/realtime-server/src/ipc-sockets/parent-socket.ts +4 -4
- package/src/index.ts +25 -17
- package/transceivers/set-rtx/dist/index.js +5 -5
- package/transceivers/set-rtx/src/set-rtx.ts +6 -6
|
@@ -33,57 +33,56 @@ export function initFamilyMemberInStore<
|
|
|
33
33
|
store: Store,
|
|
34
34
|
token: MutableAtomFamilyToken<T, J, K>,
|
|
35
35
|
key: Key,
|
|
36
|
-
): MutableAtomToken<T, J>
|
|
36
|
+
): MutableAtomToken<T, J, K>
|
|
37
37
|
|
|
38
38
|
export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
|
|
39
39
|
store: Store,
|
|
40
40
|
token: RegularAtomFamilyToken<T, K>,
|
|
41
41
|
key: Key,
|
|
42
|
-
): RegularAtomToken<T>
|
|
42
|
+
): RegularAtomToken<T, K>
|
|
43
43
|
|
|
44
44
|
export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
|
|
45
45
|
store: Store,
|
|
46
46
|
token: AtomFamilyToken<T, K>,
|
|
47
47
|
key: Key,
|
|
48
|
-
): AtomToken<T>
|
|
48
|
+
): AtomToken<T, K>
|
|
49
49
|
|
|
50
50
|
export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
|
|
51
51
|
store: Store,
|
|
52
52
|
token: WritableSelectorFamilyToken<T, K>,
|
|
53
53
|
key: Key,
|
|
54
|
-
): WritableSelectorToken<T>
|
|
54
|
+
): WritableSelectorToken<T, K>
|
|
55
55
|
|
|
56
56
|
export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
|
|
57
57
|
store: Store,
|
|
58
58
|
token: ReadonlySelectorFamilyToken<T, K>,
|
|
59
59
|
key: Key,
|
|
60
|
-
): ReadonlySelectorToken<T>
|
|
60
|
+
): ReadonlySelectorToken<T, K>
|
|
61
61
|
|
|
62
62
|
export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
|
|
63
63
|
store: Store,
|
|
64
64
|
token: SelectorFamilyToken<T, K>,
|
|
65
65
|
key: Key,
|
|
66
|
-
): SelectorToken<T>
|
|
66
|
+
): SelectorToken<T, K>
|
|
67
67
|
|
|
68
68
|
export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
|
|
69
69
|
store: Store,
|
|
70
70
|
token: WritableFamilyToken<T, K>,
|
|
71
71
|
key: Key,
|
|
72
|
-
): WritableToken<T>
|
|
72
|
+
): WritableToken<T, K>
|
|
73
73
|
|
|
74
74
|
export function initFamilyMemberInStore<T, K extends Canonical, Key extends K>(
|
|
75
75
|
store: Store,
|
|
76
76
|
token: ReadableFamilyToken<T, K>,
|
|
77
77
|
key: Key,
|
|
78
|
-
): ReadableToken<T>
|
|
78
|
+
): ReadableToken<T, K>
|
|
79
79
|
|
|
80
80
|
export function initFamilyMemberInStore(
|
|
81
81
|
store: Store,
|
|
82
82
|
token: ReadableFamilyToken<any, any>,
|
|
83
83
|
key: Json.Serializable,
|
|
84
84
|
): ReadableToken<any> {
|
|
85
|
-
const
|
|
86
|
-
const family = store.families.get(familyKey)
|
|
85
|
+
const family = store.families.get(token.key)
|
|
87
86
|
if (family === undefined) {
|
|
88
87
|
throw new NotFoundError(token, store)
|
|
89
88
|
}
|
|
@@ -37,49 +37,49 @@ export function seekInStore<
|
|
|
37
37
|
store: Store,
|
|
38
38
|
token: MutableAtomFamilyToken<T, J, K>,
|
|
39
39
|
key: Key,
|
|
40
|
-
): MutableAtomToken<T, J> | undefined
|
|
40
|
+
): MutableAtomToken<T, J, K> | undefined
|
|
41
41
|
|
|
42
42
|
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
43
43
|
store: Store,
|
|
44
44
|
token: RegularAtomFamilyToken<T, K>,
|
|
45
45
|
key: Key,
|
|
46
|
-
): RegularAtomToken<T> | undefined
|
|
46
|
+
): RegularAtomToken<T, K> | undefined
|
|
47
47
|
|
|
48
48
|
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
49
49
|
store: Store,
|
|
50
50
|
token: AtomFamilyToken<T, K>,
|
|
51
51
|
key: Key,
|
|
52
|
-
): AtomToken<T> | undefined
|
|
52
|
+
): AtomToken<T, K> | undefined
|
|
53
53
|
|
|
54
54
|
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
55
55
|
store: Store,
|
|
56
56
|
token: WritableSelectorFamilyToken<T, K>,
|
|
57
57
|
key: Key,
|
|
58
|
-
): WritableSelectorToken<T> | undefined
|
|
58
|
+
): WritableSelectorToken<T, K> | undefined
|
|
59
59
|
|
|
60
60
|
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
61
61
|
store: Store,
|
|
62
62
|
token: ReadonlySelectorFamilyToken<T, K>,
|
|
63
63
|
key: Key,
|
|
64
|
-
): ReadonlySelectorToken<T> | undefined
|
|
64
|
+
): ReadonlySelectorToken<T, K> | undefined
|
|
65
65
|
|
|
66
66
|
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
67
67
|
store: Store,
|
|
68
68
|
token: SelectorFamilyToken<T, K>,
|
|
69
69
|
key: Key,
|
|
70
|
-
): SelectorToken<T> | undefined
|
|
70
|
+
): SelectorToken<T, K> | undefined
|
|
71
71
|
|
|
72
72
|
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
73
73
|
store: Store,
|
|
74
74
|
token: WritableFamilyToken<T, K>,
|
|
75
75
|
key: Key,
|
|
76
|
-
): WritableToken<T> | undefined
|
|
76
|
+
): WritableToken<T, K> | undefined
|
|
77
77
|
|
|
78
78
|
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
79
79
|
store: Store,
|
|
80
80
|
token: ReadableFamilyToken<T, K>,
|
|
81
81
|
key: Key,
|
|
82
|
-
): ReadableToken<T> | undefined
|
|
82
|
+
): ReadableToken<T, K> | undefined
|
|
83
83
|
|
|
84
84
|
export function seekInStore<M extends MoleculeConstructor>(
|
|
85
85
|
store: Store,
|
|
@@ -6,9 +6,11 @@ import type {
|
|
|
6
6
|
ReadableFamilyToken,
|
|
7
7
|
ReadableToken,
|
|
8
8
|
} from "atom.io"
|
|
9
|
-
import { type Canonical,
|
|
9
|
+
import { type Canonical, parseJson } from "atom.io/json"
|
|
10
|
+
import { M } from "vitest/dist/chunks/environment.0M5R1SX_.js"
|
|
10
11
|
|
|
11
12
|
import { findInStore, seekInStore } from "../families"
|
|
13
|
+
import { getFamilyOfToken } from "../families/get-family-of-token"
|
|
12
14
|
import { NotFoundError } from "../not-found-error"
|
|
13
15
|
import type { Store } from "../store"
|
|
14
16
|
import { counterfeit, withdraw } from "../store"
|
|
@@ -58,11 +60,23 @@ export function getFromStore(
|
|
|
58
60
|
| [token: ReadableToken<any>]
|
|
59
61
|
): any {
|
|
60
62
|
let token: MoleculeToken<any> | ReadableToken<any>
|
|
63
|
+
let family:
|
|
64
|
+
| MoleculeFamilyToken<any>
|
|
65
|
+
| ReadableFamilyToken<any, Canonical>
|
|
66
|
+
| null
|
|
67
|
+
let key: Canonical | null
|
|
61
68
|
if (params.length === 1) {
|
|
62
69
|
token = params[0]
|
|
70
|
+
if (token.type !== `molecule`) {
|
|
71
|
+
family = getFamilyOfToken(store, token) ?? null
|
|
72
|
+
if (family) {
|
|
73
|
+
key = token.family ? parseJson(token.family.subKey) : null
|
|
74
|
+
token = findInStore(store, family, key)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
63
77
|
} else {
|
|
64
|
-
|
|
65
|
-
|
|
78
|
+
family = params[0]
|
|
79
|
+
key = params[1]
|
|
66
80
|
let maybeToken: MoleculeToken<any> | ReadableToken<any>
|
|
67
81
|
if (family.type === `molecule_family`) {
|
|
68
82
|
maybeToken = seekInStore(store, family, key) ?? counterfeit(family, key)
|
|
@@ -72,7 +86,7 @@ export function getFromStore(
|
|
|
72
86
|
token = maybeToken
|
|
73
87
|
}
|
|
74
88
|
if (`counterfeit` in token && `family` in token) {
|
|
75
|
-
|
|
89
|
+
family =
|
|
76
90
|
token.type === `molecule`
|
|
77
91
|
? withdraw(token.family, store)
|
|
78
92
|
: // biome-ignore lint/style/noNonNullAssertion: family must be present
|
|
@@ -7,7 +7,11 @@ import type {
|
|
|
7
7
|
} from "atom.io"
|
|
8
8
|
import { parseJson, stringifyJson } from "atom.io/json"
|
|
9
9
|
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
disposeFromStore,
|
|
12
|
+
findInStore,
|
|
13
|
+
initFamilyMemberInStore,
|
|
14
|
+
} from "../families"
|
|
11
15
|
import { growMoleculeInStore, makeMoleculeInStore } from "../molecule"
|
|
12
16
|
import { type Store, withdraw } from "../store"
|
|
13
17
|
|
|
@@ -18,7 +22,7 @@ export function ingestCreationEvent(
|
|
|
18
22
|
): void {
|
|
19
23
|
switch (applying) {
|
|
20
24
|
case `newValue`: {
|
|
21
|
-
createInStore(update
|
|
25
|
+
createInStore(update, store)
|
|
22
26
|
break
|
|
23
27
|
}
|
|
24
28
|
case `oldValue`: {
|
|
@@ -29,7 +33,7 @@ export function ingestCreationEvent(
|
|
|
29
33
|
}
|
|
30
34
|
|
|
31
35
|
export function ingestDisposalEvent(
|
|
32
|
-
update: StateDisposal<any
|
|
36
|
+
update: StateDisposal<ReadableToken<any>>,
|
|
33
37
|
applying: `newValue` | `oldValue`,
|
|
34
38
|
store: Store,
|
|
35
39
|
): void {
|
|
@@ -39,35 +43,22 @@ export function ingestDisposalEvent(
|
|
|
39
43
|
break
|
|
40
44
|
}
|
|
41
45
|
case `oldValue`: {
|
|
42
|
-
createInStore(update
|
|
46
|
+
createInStore(update, store)
|
|
43
47
|
store.valueMap.set(update.token.key, update.value)
|
|
44
48
|
break
|
|
45
49
|
}
|
|
46
50
|
}
|
|
47
51
|
}
|
|
48
52
|
|
|
49
|
-
function createInStore(
|
|
50
|
-
|
|
51
|
-
|
|
53
|
+
function createInStore(
|
|
54
|
+
update: StateCreation<any> | StateDisposal<any>,
|
|
55
|
+
store: Store,
|
|
56
|
+
): void {
|
|
57
|
+
const { family: familyMeta } = update.token
|
|
58
|
+
if (familyMeta) {
|
|
59
|
+
const family = store.families.get(familyMeta.key)
|
|
52
60
|
if (family) {
|
|
53
|
-
|
|
54
|
-
if (molecule) {
|
|
55
|
-
growMoleculeInStore(molecule, family, store)
|
|
56
|
-
return
|
|
57
|
-
}
|
|
58
|
-
if (store.config.lifespan === `immortal`) {
|
|
59
|
-
store.logger.error(
|
|
60
|
-
`🐞`,
|
|
61
|
-
`atom`,
|
|
62
|
-
token.family.key,
|
|
63
|
-
`tried to create member`,
|
|
64
|
-
`"${token.family.subKey}"`,
|
|
65
|
-
`but a molecule with that key was not found in store`,
|
|
66
|
-
`"${store.config.name}"`,
|
|
67
|
-
)
|
|
68
|
-
return
|
|
69
|
-
}
|
|
70
|
-
initFamilyMemberInStore(store, family, parseJson(token.family.subKey))
|
|
61
|
+
findInStore(store, family, parseJson(familyMeta.subKey))
|
|
71
62
|
}
|
|
72
63
|
}
|
|
73
64
|
}
|
|
@@ -52,19 +52,6 @@ export function disposeSelector(
|
|
|
52
52
|
}
|
|
53
53
|
target.valueMap.delete(key)
|
|
54
54
|
target.selectorAtoms.delete(key)
|
|
55
|
-
const downstreamTokens = target.selectorGraph
|
|
56
|
-
.getRelationEntries({ upstreamSelectorKey: key })
|
|
57
|
-
.filter(([_, { source }]) => source === key)
|
|
58
|
-
.map(
|
|
59
|
-
([downstreamSelectorKey]) =>
|
|
60
|
-
target.selectors.get(downstreamSelectorKey) ??
|
|
61
|
-
target.readonlySelectors.get(downstreamSelectorKey),
|
|
62
|
-
)
|
|
63
|
-
for (const downstreamToken of downstreamTokens) {
|
|
64
|
-
if (downstreamToken) {
|
|
65
|
-
disposeSelector(downstreamToken, store)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
55
|
target.selectorGraph.delete(key)
|
|
69
56
|
store.logger.info(`🔥`, selectorToken.type, key, `deleted`)
|
|
70
57
|
if (isChildStore(target) && target.transactionMeta.phase === `building`) {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { WritableFamilyToken, WritableToken } from "atom.io"
|
|
2
|
-
import { type Canonical, stringifyJson } from "atom.io/json"
|
|
2
|
+
import { type Canonical, parseJson, stringifyJson } from "atom.io/json"
|
|
3
3
|
|
|
4
4
|
import { findInStore } from "../families"
|
|
5
|
+
import { getFamilyOfToken } from "../families/get-family-of-token"
|
|
5
6
|
import { closeOperation, openOperation } from "../operation"
|
|
6
7
|
import type { Store } from "../store"
|
|
7
8
|
import { withdraw } from "../store"
|
|
@@ -31,17 +32,24 @@ export function setIntoStore<T, New extends T>(
|
|
|
31
32
|
| [token: WritableToken<T>, value: New | ((oldValue: T) => New)]
|
|
32
33
|
): void {
|
|
33
34
|
let token: WritableToken<T>
|
|
35
|
+
let family: WritableFamilyToken<T, Canonical> | null
|
|
36
|
+
let key: Canonical | null
|
|
34
37
|
let value: New | ((oldValue: T) => New)
|
|
35
38
|
if (params.length === 2) {
|
|
36
39
|
token = params[0]
|
|
37
40
|
value = params[1]
|
|
41
|
+
family = getFamilyOfToken(store, token) ?? null
|
|
42
|
+
if (family) {
|
|
43
|
+
key = token.family ? parseJson(token.family.subKey) : null
|
|
44
|
+
token = findInStore(store, family, key)
|
|
45
|
+
}
|
|
38
46
|
} else {
|
|
39
|
-
|
|
40
|
-
|
|
47
|
+
family = params[0]
|
|
48
|
+
key = params[1]
|
|
41
49
|
value = params[2]
|
|
42
|
-
|
|
43
|
-
token = maybeToken
|
|
50
|
+
token = findInStore(store, family, key)
|
|
44
51
|
}
|
|
52
|
+
|
|
45
53
|
if (`counterfeit` in token) {
|
|
46
54
|
const disposal = store.disposalTraces.buffer.find(
|
|
47
55
|
(item) => item?.key === token.key,
|
package/json/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Range, Flat, Store, Transceiver } from 'atom.io/internal';
|
|
2
2
|
import * as AtomIO from 'atom.io';
|
|
3
3
|
|
|
4
|
-
type Entries<K extends
|
|
4
|
+
type Entries<K extends PropertyKey = keyof any, V = any> = [K, V][];
|
|
5
5
|
type KeyOfEntries<E extends Entries> = E extends [infer K, any][] ? K : never;
|
|
6
6
|
type ValueOfEntry<E extends Entries, K extends KeyOfEntries<E>> = {
|
|
7
7
|
[P in Range<E[`length`]>]: E[P] extends [K, infer V] ? V : never;
|
|
@@ -32,8 +32,8 @@ declare namespace Json {
|
|
|
32
32
|
type Object<Key extends string = string, Value extends Serializable = Serializable> = Record<Key, Value>;
|
|
33
33
|
type Array<Element extends Serializable = Serializable> = ReadonlyArray<Element>;
|
|
34
34
|
}
|
|
35
|
-
type stringified<J extends Json.Serializable> = string & {
|
|
36
|
-
__json
|
|
35
|
+
type stringified<J extends Json.Serializable> = J extends string ? `"${J}"` : J extends number ? `${J}` : J extends true ? `true` : J extends false ? `false` : J extends boolean ? `false` | `true` : J extends null ? `null` : string & {
|
|
36
|
+
__json?: J;
|
|
37
37
|
};
|
|
38
38
|
declare const parseJson: <S extends stringified<Json.Serializable>>(str: S | string) => S extends stringified<infer J> ? J : Json.Serializable;
|
|
39
39
|
declare const stringifyJson: <J extends Json.Serializable>(json: J) => stringified<J>;
|
package/json/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createWritableSelectorFamily } from '../../dist/chunk-
|
|
1
|
+
import { createWritableSelectorFamily } from '../../dist/chunk-4WXELLFT.js';
|
|
2
2
|
import '../../dist/chunk-IBTHB2PI.js';
|
|
3
3
|
import '../../dist/chunk-XWL6SNVU.js';
|
|
4
4
|
import { createStandaloneSelector, IMPLICIT, growMoleculeInStore, initFamilyMemberInStore, withdraw, seekInStore } from 'atom.io/internal';
|
package/json/src/entries.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Flat, Range } from "atom.io/internal"
|
|
2
2
|
|
|
3
|
-
export type Entries<K extends
|
|
3
|
+
export type Entries<K extends PropertyKey = keyof any, V = any> = [K, V][]
|
|
4
4
|
|
|
5
5
|
export type KeyOfEntries<E extends Entries> = E extends [infer K, any][]
|
|
6
6
|
? K
|
package/json/src/index.ts
CHANGED
|
@@ -27,7 +27,19 @@ export namespace Json {
|
|
|
27
27
|
ReadonlyArray<Element>
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
export type stringified<J extends Json.Serializable> =
|
|
30
|
+
export type stringified<J extends Json.Serializable> = J extends string
|
|
31
|
+
? `"${J}"`
|
|
32
|
+
: J extends number
|
|
33
|
+
? `${J}`
|
|
34
|
+
: J extends true
|
|
35
|
+
? `true`
|
|
36
|
+
: J extends false
|
|
37
|
+
? `false`
|
|
38
|
+
: J extends boolean
|
|
39
|
+
? `false` | `true`
|
|
40
|
+
: J extends null
|
|
41
|
+
? `null`
|
|
42
|
+
: string & { __json?: J }
|
|
31
43
|
|
|
32
44
|
export const parseJson = <S extends stringified<Json.Serializable>>(
|
|
33
45
|
str: S | string,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atom.io",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.1",
|
|
4
4
|
"description": "Composable and testable reactive data library.",
|
|
5
5
|
"homepage": "https://atom.io.fyi",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -52,37 +52,37 @@
|
|
|
52
52
|
}
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@testing-library/react": "16.0.
|
|
55
|
+
"@testing-library/react": "16.0.1",
|
|
56
56
|
"@types/eslint": "9.6.1",
|
|
57
57
|
"@types/estree": "1.0.5",
|
|
58
58
|
"@types/http-proxy": "1.17.15",
|
|
59
59
|
"@types/npmlog": "7.0.0",
|
|
60
|
-
"@types/react": "18.3.
|
|
60
|
+
"@types/react": "18.3.5",
|
|
61
61
|
"@types/tmp": "0.2.6",
|
|
62
|
-
"@typescript-eslint/parser": "8.
|
|
63
|
-
"@typescript-eslint/rule-tester": "8.
|
|
62
|
+
"@typescript-eslint/parser": "8.5.0",
|
|
63
|
+
"@typescript-eslint/rule-tester": "8.5.0",
|
|
64
64
|
"@vitest/coverage-v8": "2.0.5",
|
|
65
65
|
"@vitest/ui": "2.0.5",
|
|
66
|
-
"concurrently": "
|
|
66
|
+
"concurrently": "9.0.1",
|
|
67
67
|
"drizzle-kit": "0.24.2",
|
|
68
68
|
"drizzle-orm": "0.33.0",
|
|
69
|
-
"eslint": "9.
|
|
70
|
-
"framer-motion": "11.
|
|
71
|
-
"happy-dom": "15.
|
|
69
|
+
"eslint": "9.10.0",
|
|
70
|
+
"framer-motion": "11.5.4",
|
|
71
|
+
"happy-dom": "15.7.4",
|
|
72
72
|
"http-proxy": "1.18.1",
|
|
73
73
|
"npmlog": "7.0.1",
|
|
74
74
|
"postgres": "3.4.4",
|
|
75
75
|
"preact": "10.23.2",
|
|
76
76
|
"react": "18.3.1",
|
|
77
77
|
"react-dom": "18.3.1",
|
|
78
|
-
"react-router-dom": "6.26.
|
|
78
|
+
"react-router-dom": "6.26.2",
|
|
79
79
|
"socket.io": "4.7.5",
|
|
80
80
|
"socket.io-client": "4.7.5",
|
|
81
81
|
"tmp": "0.2.3",
|
|
82
82
|
"tsup": "8.2.4",
|
|
83
|
-
"tsx": "4.19.
|
|
84
|
-
"typescript": "5.
|
|
85
|
-
"vite": "5.4.
|
|
83
|
+
"tsx": "4.19.1",
|
|
84
|
+
"typescript": "5.6.2",
|
|
85
|
+
"vite": "5.4.4",
|
|
86
86
|
"vite-tsconfig-paths": "5.0.1",
|
|
87
87
|
"vitest": "2.0.5"
|
|
88
88
|
},
|
|
@@ -14,21 +14,19 @@ interface EventBuffer<Key extends string, Params extends Json.Serializable[]> ex
|
|
|
14
14
|
toString(): StringifiedEvent<Key, Params>;
|
|
15
15
|
}
|
|
16
16
|
declare class CustomSocket<I extends Events, O extends Events> implements Socket {
|
|
17
|
-
emit: <Event extends keyof
|
|
18
|
-
protected listeners: Map<keyof
|
|
17
|
+
emit: <Event extends keyof I>(event: Event, ...args: I[Event]) => CustomSocket<I, O>;
|
|
18
|
+
protected listeners: Map<keyof O, Set<(...args: Json.Array) => void>>;
|
|
19
19
|
protected globalListeners: Set<(event: string, ...args: Json.Array) => void>;
|
|
20
20
|
protected handleEvent<Event extends keyof I>(event: string, ...args: I[Event]): void;
|
|
21
21
|
id: string;
|
|
22
|
-
constructor(emit: <Event extends keyof
|
|
23
|
-
on<Event extends keyof
|
|
22
|
+
constructor(emit: <Event extends keyof I>(event: Event, ...args: I[Event]) => CustomSocket<I, O>);
|
|
23
|
+
on<Event extends keyof O>(event: Event, listener: (...args: O[Event]) => void): this;
|
|
24
24
|
onAny(listener: (event: string, ...args: Json.Array) => void): this;
|
|
25
|
-
off<Event extends keyof
|
|
25
|
+
off<Event extends keyof O>(event: Event, listener?: (...args: O[Event]) => void): this;
|
|
26
26
|
offAny(listener: (event: string, ...args: Json.Array) => void): this;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
declare class ChildSocket<I extends Events, O extends Events
|
|
30
|
-
"setup-relay": [string];
|
|
31
|
-
}> extends CustomSocket<I, O> {
|
|
29
|
+
declare class ChildSocket<I extends Events, O extends Events> extends CustomSocket<I, O> {
|
|
32
30
|
process: ChildProcessWithoutNullStreams;
|
|
33
31
|
key: string;
|
|
34
32
|
logger: {
|
|
@@ -58,12 +56,12 @@ declare class SubjectSocket<I extends Events, O extends Events> extends CustomSo
|
|
|
58
56
|
dispose(): void;
|
|
59
57
|
}
|
|
60
58
|
declare class ParentSocket<I extends Events & {
|
|
59
|
+
[id in string as `relay:${id}`]: [string, ...Json.Serializable[]];
|
|
60
|
+
}, O extends Events & {
|
|
61
61
|
[id in string as `user:${id}`]: [string, ...Json.Serializable[]];
|
|
62
62
|
} & {
|
|
63
63
|
"user-joins": [string];
|
|
64
64
|
"user-leaves": [string];
|
|
65
|
-
}, O extends Events & {
|
|
66
|
-
[id in string as `relay:${id}`]: [string, ...Json.Serializable[]];
|
|
67
65
|
}> extends CustomSocket<I, O> {
|
|
68
66
|
protected incompleteData: string;
|
|
69
67
|
protected unprocessedEvents: string[];
|
|
@@ -10,11 +10,7 @@ import { CustomSocket } from "./custom-socket"
|
|
|
10
10
|
|
|
11
11
|
export class ChildSocket<
|
|
12
12
|
I extends Events,
|
|
13
|
-
O extends Events
|
|
14
|
-
/* eslint-disable quotes */
|
|
15
|
-
"setup-relay": [string]
|
|
16
|
-
/* eslint-enable quotes */
|
|
17
|
-
},
|
|
13
|
+
O extends Events,
|
|
18
14
|
> extends CustomSocket<I, O> {
|
|
19
15
|
protected incompleteData = ``
|
|
20
16
|
protected unprocessedEvents: string[] = []
|
|
@@ -17,7 +17,7 @@ export interface EventBuffer<
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export class CustomSocket<I extends Events, O extends Events> implements Socket {
|
|
20
|
-
protected listeners: Map<keyof
|
|
20
|
+
protected listeners: Map<keyof O, Set<(...args: Json.Array) => void>>
|
|
21
21
|
protected globalListeners: Set<(event: string, ...args: Json.Array) => void>
|
|
22
22
|
protected handleEvent<Event extends keyof I>(
|
|
23
23
|
event: string,
|
|
@@ -37,18 +37,18 @@ export class CustomSocket<I extends Events, O extends Events> implements Socket
|
|
|
37
37
|
public id = `no_id_retrieved`
|
|
38
38
|
|
|
39
39
|
public constructor(
|
|
40
|
-
public emit: <Event extends keyof
|
|
40
|
+
public emit: <Event extends keyof I>(
|
|
41
41
|
event: Event,
|
|
42
|
-
...args:
|
|
42
|
+
...args: I[Event]
|
|
43
43
|
) => CustomSocket<I, O>,
|
|
44
44
|
) {
|
|
45
45
|
this.listeners = new Map()
|
|
46
46
|
this.globalListeners = new Set()
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
public on<Event extends keyof
|
|
49
|
+
public on<Event extends keyof O>(
|
|
50
50
|
event: Event,
|
|
51
|
-
listener: (...args:
|
|
51
|
+
listener: (...args: O[Event]) => void,
|
|
52
52
|
): this {
|
|
53
53
|
const listeners = this.listeners.get(event)
|
|
54
54
|
if (listeners) {
|
|
@@ -64,9 +64,9 @@ export class CustomSocket<I extends Events, O extends Events> implements Socket
|
|
|
64
64
|
return this
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
public off<Event extends keyof
|
|
67
|
+
public off<Event extends keyof O>(
|
|
68
68
|
event: Event,
|
|
69
|
-
listener?: (...args:
|
|
69
|
+
listener?: (...args: O[Event]) => void,
|
|
70
70
|
): this {
|
|
71
71
|
const listeners = this.listeners.get(event)
|
|
72
72
|
if (listeners) {
|
|
@@ -37,6 +37,9 @@ export class SubjectSocket<
|
|
|
37
37
|
|
|
38
38
|
export class ParentSocket<
|
|
39
39
|
I extends Events & {
|
|
40
|
+
[id in string as `relay:${id}`]: [string, ...Json.Serializable[]]
|
|
41
|
+
},
|
|
42
|
+
O extends Events & {
|
|
40
43
|
[id in string as `user:${id}`]: [string, ...Json.Serializable[]]
|
|
41
44
|
} & {
|
|
42
45
|
/* eslint-disable quotes */
|
|
@@ -44,9 +47,6 @@ export class ParentSocket<
|
|
|
44
47
|
"user-leaves": [string]
|
|
45
48
|
/* eslint-enable quotes */
|
|
46
49
|
},
|
|
47
|
-
O extends Events & {
|
|
48
|
-
[id in string as `relay:${id}`]: [string, ...Json.Serializable[]]
|
|
49
|
-
},
|
|
50
50
|
> extends CustomSocket<I, O> {
|
|
51
51
|
protected incompleteData = ``
|
|
52
52
|
protected unprocessedEvents: string[] = []
|
|
@@ -167,7 +167,7 @@ export class ParentSocket<
|
|
|
167
167
|
relay.in.next(data)
|
|
168
168
|
})
|
|
169
169
|
relay.out.subscribe(`socket`, (data) => {
|
|
170
|
-
this.emit(...(data as [string, ...
|
|
170
|
+
this.emit(...(data as [string, ...I[keyof I]]))
|
|
171
171
|
})
|
|
172
172
|
})
|
|
173
173
|
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Transceiver } from "atom.io/internal"
|
|
2
|
-
import type { Canonical, Json } from "atom.io/json"
|
|
2
|
+
import type { Canonical, Json, stringified } from "atom.io/json"
|
|
3
3
|
|
|
4
4
|
import type { AtomFamilyToken } from "./atom"
|
|
5
5
|
import type {
|
|
@@ -20,44 +20,49 @@ export * from "./timeline"
|
|
|
20
20
|
export * from "./transaction"
|
|
21
21
|
export * from "./validators"
|
|
22
22
|
|
|
23
|
-
export type RegularAtomToken<T> = {
|
|
23
|
+
export type RegularAtomToken<T, K extends Canonical = any> = {
|
|
24
24
|
key: string
|
|
25
25
|
type: `atom`
|
|
26
|
-
family?: FamilyMetadata
|
|
26
|
+
family?: FamilyMetadata<K>
|
|
27
27
|
__T?: T
|
|
28
28
|
}
|
|
29
29
|
export type MutableAtomToken<
|
|
30
30
|
T extends Transceiver<any>,
|
|
31
31
|
J extends Json.Serializable,
|
|
32
|
+
K extends Canonical = any,
|
|
32
33
|
> = {
|
|
33
34
|
key: string
|
|
34
35
|
type: `mutable_atom`
|
|
35
|
-
family?: FamilyMetadata
|
|
36
|
+
family?: FamilyMetadata<K>
|
|
36
37
|
__J?: J
|
|
37
38
|
__U?: T extends Transceiver<infer Update> ? Update : never
|
|
38
39
|
}
|
|
39
|
-
export type AtomToken<T> =
|
|
40
|
-
| MutableAtomToken<T extends Transceiver<any> ? T : never, any>
|
|
41
|
-
| RegularAtomToken<T>
|
|
40
|
+
export type AtomToken<T, K extends Canonical = any> =
|
|
41
|
+
| MutableAtomToken<T extends Transceiver<any> ? T : never, any, K>
|
|
42
|
+
| RegularAtomToken<T, K>
|
|
42
43
|
|
|
43
|
-
export type WritableSelectorToken<T> = {
|
|
44
|
+
export type WritableSelectorToken<T, K extends Canonical = any> = {
|
|
44
45
|
key: string
|
|
45
46
|
type: `selector`
|
|
46
|
-
family?: FamilyMetadata
|
|
47
|
+
family?: FamilyMetadata<K>
|
|
47
48
|
__T?: T
|
|
48
49
|
}
|
|
49
|
-
export type ReadonlySelectorToken<T> = {
|
|
50
|
+
export type ReadonlySelectorToken<T, K extends Canonical = any> = {
|
|
50
51
|
key: string
|
|
51
52
|
type: `readonly_selector`
|
|
52
|
-
family?: FamilyMetadata
|
|
53
|
+
family?: FamilyMetadata<K>
|
|
53
54
|
__T?: T
|
|
54
55
|
}
|
|
55
|
-
export type SelectorToken<T> =
|
|
56
|
-
| ReadonlySelectorToken<T>
|
|
57
|
-
| WritableSelectorToken<T>
|
|
56
|
+
export type SelectorToken<T, K extends Canonical = any> =
|
|
57
|
+
| ReadonlySelectorToken<T, K>
|
|
58
|
+
| WritableSelectorToken<T, K>
|
|
58
59
|
|
|
59
|
-
export type WritableToken<T
|
|
60
|
-
|
|
60
|
+
export type WritableToken<T, K extends Canonical = any> =
|
|
61
|
+
| AtomToken<T, K>
|
|
62
|
+
| WritableSelectorToken<T, K>
|
|
63
|
+
export type ReadableToken<T, K extends Canonical = any> =
|
|
64
|
+
| AtomToken<T, K>
|
|
65
|
+
| SelectorToken<T, K>
|
|
61
66
|
|
|
62
67
|
export type WritableFamilyToken<T, K extends Canonical> =
|
|
63
68
|
| AtomFamilyToken<T, K>
|
|
@@ -66,4 +71,7 @@ export type ReadableFamilyToken<T, K extends Canonical> =
|
|
|
66
71
|
| AtomFamilyToken<T, K>
|
|
67
72
|
| SelectorFamilyToken<T, K>
|
|
68
73
|
|
|
69
|
-
export type FamilyMetadata
|
|
74
|
+
export type FamilyMetadata<K extends Canonical = any> = {
|
|
75
|
+
key: string
|
|
76
|
+
subKey: stringified<K>
|
|
77
|
+
}
|