@evolu/common 6.0.1-preview.3 → 6.0.1-preview.31
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/src/Array.d.ts +69 -5
- package/dist/src/Array.d.ts.map +1 -1
- package/dist/src/Array.js +64 -5
- package/dist/src/Assert.d.ts +6 -16
- package/dist/src/Assert.d.ts.map +1 -1
- package/dist/src/Assert.js +6 -18
- package/dist/src/Brand.d.ts +75 -0
- package/dist/src/Brand.d.ts.map +1 -0
- package/dist/src/Brand.js +1 -0
- package/dist/src/Buffer.d.ts +1 -1
- package/dist/src/Buffer.d.ts.map +1 -1
- package/dist/src/Buffer.js +8 -7
- package/dist/src/Cache.d.ts +44 -0
- package/dist/src/Cache.d.ts.map +1 -0
- package/dist/src/Cache.js +52 -0
- package/dist/src/Callbacks.d.ts +45 -12
- package/dist/src/Callbacks.d.ts.map +1 -1
- package/dist/src/Callbacks.js +14 -7
- package/dist/src/Console.d.ts +31 -6
- package/dist/src/Console.d.ts.map +1 -1
- package/dist/src/Console.js +72 -9
- package/dist/src/Crypto.d.ts +61 -34
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Crypto.js +32 -45
- package/dist/src/Evolu/Db.d.ts +161 -65
- package/dist/src/Evolu/Db.d.ts.map +1 -1
- package/dist/src/Evolu/Db.js +286 -694
- package/dist/src/Evolu/Diff.d.ts +3 -3
- package/dist/src/Evolu/Diff.d.ts.map +1 -1
- package/dist/src/Evolu/Diff.js +7 -5
- package/dist/src/Evolu/Evolu.d.ts +208 -133
- package/dist/src/Evolu/Evolu.d.ts.map +1 -1
- package/dist/src/Evolu/Evolu.js +188 -183
- package/dist/src/Evolu/Internal.d.ts +0 -2
- package/dist/src/Evolu/Internal.d.ts.map +1 -1
- package/dist/src/Evolu/Internal.js +0 -2
- package/dist/src/Evolu/LocalAuth.d.ts +150 -0
- package/dist/src/Evolu/LocalAuth.d.ts.map +1 -0
- package/dist/src/Evolu/LocalAuth.js +174 -0
- package/dist/src/Evolu/Owner.d.ts +273 -120
- package/dist/src/Evolu/Owner.d.ts.map +1 -1
- package/dist/src/Evolu/Owner.js +130 -104
- package/dist/src/Evolu/Platform.d.ts +9 -7
- package/dist/src/Evolu/Platform.d.ts.map +1 -1
- package/dist/src/Evolu/Protocol.d.ts +277 -232
- package/dist/src/Evolu/Protocol.d.ts.map +1 -1
- package/dist/src/Evolu/Protocol.js +603 -378
- package/dist/src/Evolu/Public.d.ts +6 -8
- package/dist/src/Evolu/Public.d.ts.map +1 -1
- package/dist/src/Evolu/Public.js +2 -3
- package/dist/src/Evolu/PublicKysely.js +3 -3
- package/dist/src/Evolu/Query.d.ts +2 -1
- package/dist/src/Evolu/Query.d.ts.map +1 -1
- package/dist/src/Evolu/Relay.d.ts +92 -7
- package/dist/src/Evolu/Relay.d.ts.map +1 -1
- package/dist/src/Evolu/Relay.js +238 -76
- package/dist/src/Evolu/Schema.d.ts +129 -73
- package/dist/src/Evolu/Schema.d.ts.map +1 -1
- package/dist/src/Evolu/Schema.js +169 -89
- package/dist/src/Evolu/Storage.d.ts +240 -26
- package/dist/src/Evolu/Storage.d.ts.map +1 -1
- package/dist/src/Evolu/Storage.js +189 -91
- package/dist/src/Evolu/Sync.d.ts +67 -13
- package/dist/src/Evolu/Sync.d.ts.map +1 -1
- package/dist/src/Evolu/Sync.js +441 -20
- package/dist/src/Evolu/Timestamp.d.ts +85 -27
- package/dist/src/Evolu/Timestamp.d.ts.map +1 -1
- package/dist/src/Evolu/Timestamp.js +77 -18
- package/dist/src/Identicon.d.ts +35 -0
- package/dist/src/Identicon.d.ts.map +1 -0
- package/dist/src/Identicon.js +143 -0
- package/dist/src/Instances.d.ts +34 -0
- package/dist/src/Instances.d.ts.map +1 -0
- package/dist/src/Instances.js +44 -0
- package/dist/src/ManyToManyMap.d.ts +71 -10
- package/dist/src/ManyToManyMap.d.ts.map +1 -1
- package/dist/src/ManyToManyMap.js +41 -6
- package/dist/src/Number.d.ts +4 -3
- package/dist/src/Number.d.ts.map +1 -1
- package/dist/src/Number.js +5 -4
- package/dist/src/Platform.d.ts +20 -0
- package/dist/src/Platform.d.ts.map +1 -0
- package/dist/src/Platform.js +22 -0
- package/dist/src/Random.d.ts +3 -2
- package/dist/src/Random.d.ts.map +1 -1
- package/dist/src/Resources.d.ts +118 -0
- package/dist/src/Resources.d.ts.map +1 -0
- package/dist/src/Resources.js +197 -0
- package/dist/src/Result.d.ts +184 -52
- package/dist/src/Result.d.ts.map +1 -1
- package/dist/src/Result.js +30 -241
- package/dist/src/Skiplist.js +2 -1
- package/dist/src/Sqlite.d.ts +63 -5
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +110 -9
- package/dist/src/Task.d.ts +586 -0
- package/dist/src/Task.d.ts.map +1 -0
- package/dist/src/Task.js +469 -0
- package/dist/src/Time.d.ts +66 -1
- package/dist/src/Time.d.ts.map +1 -1
- package/dist/src/Time.js +99 -5
- package/dist/src/Type.d.ts +622 -340
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +666 -464
- package/dist/src/Types.d.ts +1 -75
- package/dist/src/Types.d.ts.map +1 -1
- package/dist/src/WebSocket.d.ts +5 -2
- package/dist/src/WebSocket.d.ts.map +1 -1
- package/dist/src/WebSocket.js +12 -18
- package/dist/src/Worker.d.ts +39 -11
- package/dist/src/Worker.d.ts.map +1 -1
- package/dist/src/Worker.js +22 -4
- package/dist/src/index.d.ts +7 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/package.json +14 -13
- package/src/Array.ts +90 -11
- package/src/Assert.ts +6 -24
- package/src/Brand.ts +75 -0
- package/src/Buffer.ts +7 -7
- package/src/Cache.ts +85 -0
- package/src/Callbacks.ts +62 -22
- package/src/Console.ts +91 -11
- package/src/Crypto.ts +97 -82
- package/src/Evolu/Db.ts +517 -1020
- package/src/Evolu/Diff.ts +7 -5
- package/src/Evolu/Evolu.ts +464 -355
- package/src/Evolu/Internal.ts +0 -2
- package/src/Evolu/LocalAuth.ts +463 -0
- package/src/Evolu/Owner.ts +355 -228
- package/src/Evolu/Platform.ts +9 -9
- package/src/Evolu/Protocol.ts +859 -676
- package/src/Evolu/Public.ts +7 -14
- package/src/Evolu/PublicKysely.ts +3 -3
- package/src/Evolu/Query.ts +2 -1
- package/src/Evolu/Relay.ts +437 -93
- package/src/Evolu/Schema.ts +391 -191
- package/src/Evolu/Storage.ts +532 -135
- package/src/Evolu/Sync.ts +766 -37
- package/src/Evolu/Timestamp.ts +88 -35
- package/src/Identicon.ts +197 -0
- package/src/Instances.ts +90 -0
- package/src/ManyToManyMap.ts +124 -24
- package/src/Number.ts +6 -10
- package/src/Platform.ts +26 -0
- package/src/Random.ts +3 -2
- package/src/Resources.ts +367 -0
- package/src/Result.ts +191 -54
- package/src/Skiplist.ts +1 -1
- package/src/Sqlite.ts +122 -17
- package/src/Task.ts +901 -0
- package/src/Time.ts +180 -5
- package/src/Type.ts +1084 -727
- package/src/Types.ts +1 -77
- package/src/WebSocket.ts +27 -25
- package/src/Worker.ts +72 -23
- package/src/index.ts +7 -2
- package/dist/src/Evolu/Config.d.ts +0 -69
- package/dist/src/Evolu/Config.d.ts.map +0 -1
- package/dist/src/Evolu/Config.js +0 -9
- package/dist/src/Evolu/Kysely.d.ts +0 -6
- package/dist/src/Evolu/Kysely.d.ts.map +0 -1
- package/dist/src/Evolu/Kysely.js +0 -21
- package/dist/src/NanoId.d.ts +0 -27
- package/dist/src/NanoId.d.ts.map +0 -1
- package/dist/src/NanoId.js +0 -6
- package/dist/src/Promise.d.ts +0 -180
- package/dist/src/Promise.d.ts.map +0 -1
- package/dist/src/Promise.js +0 -176
- package/src/Evolu/Config.ts +0 -83
- package/src/Evolu/Kysely.ts +0 -38
- package/src/NanoId.ts +0 -39
- package/src/Promise.ts +0 -295
package/dist/src/Array.d.ts
CHANGED
|
@@ -1,3 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔒 Immutable, type-safe array operations
|
|
3
|
+
*
|
|
4
|
+
* Helpers that preserve immutability through the type system. Native array
|
|
5
|
+
* methods return mutable arrays even when called on readonly arrays. These
|
|
6
|
+
* helpers ensure transformations return readonly types.
|
|
7
|
+
*
|
|
8
|
+
* {@link NonEmptyArray} and {@link NonEmptyReadonlyArray} types represent arrays
|
|
9
|
+
* with at least one element, eliminating runtime length checks and making
|
|
10
|
+
* function requirements explicit.
|
|
11
|
+
*
|
|
12
|
+
* ### Example
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* // ❌ Native methods return mutable arrays
|
|
16
|
+
* const readonly: ReadonlyArray<number> = [1, 2, 3];
|
|
17
|
+
* const mapped = readonly.map((x) => x * 2); // Array<number> (mutable!)
|
|
18
|
+
*
|
|
19
|
+
* // ✅ Helpers preserve immutability
|
|
20
|
+
* const filtered = filterArray(readonly, (x) => x > 1); // ReadonlyArray<number>
|
|
21
|
+
*
|
|
22
|
+
* // ✅ NonEmptyArray enforces non-emptiness
|
|
23
|
+
* const value = firstInArray(["a", "b"]); // "a"
|
|
24
|
+
* firstInArray([]); // ❌ Compiler error
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @module
|
|
28
|
+
*/
|
|
1
29
|
/** An array with at least one element. */
|
|
2
30
|
export type NonEmptyArray<T> = [T, ...Array<T>];
|
|
3
31
|
/** Checks if an array is non-empty. */
|
|
@@ -6,12 +34,48 @@ export declare const isNonEmptyArray: <T>(array: Array<T>) => array is NonEmptyA
|
|
|
6
34
|
export type NonEmptyReadonlyArray<T> = readonly [T, ...ReadonlyArray<T>];
|
|
7
35
|
/** Checks if an array is non-empty. */
|
|
8
36
|
export declare const isNonEmptyReadonlyArray: <T>(array: ReadonlyArray<T>) => array is NonEmptyReadonlyArray<T>;
|
|
9
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Appends an item to an array, returning a new non-empty readonly array.
|
|
39
|
+
*
|
|
40
|
+
* Accepts both mutable and readonly arrays. Does not mutate the original array.
|
|
41
|
+
*/
|
|
10
42
|
export declare const appendToArray: <T>(item: T, array: ReadonlyArray<T>) => NonEmptyReadonlyArray<T>;
|
|
11
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* Prepends an item to an array, returning a new non-empty readonly array.
|
|
45
|
+
*
|
|
46
|
+
* Accepts both mutable and readonly arrays. Does not mutate the original array.
|
|
47
|
+
*/
|
|
12
48
|
export declare const prependToArray: <T>(item: T, array: ReadonlyArray<T>) => NonEmptyReadonlyArray<T>;
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Maps an array using a mapper function, preserving non-emptiness when
|
|
51
|
+
* applicable.
|
|
52
|
+
*
|
|
53
|
+
* Accepts both mutable and readonly arrays. Does not mutate the original array.
|
|
54
|
+
*/
|
|
55
|
+
export declare function mapArray<T, U>(array: NonEmptyReadonlyArray<T> | NonEmptyArray<T>, mapper: (item: T, index: number) => U): NonEmptyReadonlyArray<U>;
|
|
56
|
+
export declare function mapArray<T, U>(array: ReadonlyArray<T> | Array<T>, mapper: (item: T, index: number) => U): ReadonlyArray<U>;
|
|
57
|
+
/**
|
|
58
|
+
* Filters an array using a predicate function, returning a new readonly array.
|
|
59
|
+
*
|
|
60
|
+
* Accepts both mutable and readonly arrays. Does not mutate the original array.
|
|
61
|
+
*/
|
|
62
|
+
export declare const filterArray: <T>(array: ReadonlyArray<T>, predicate: (item: T, index: number) => boolean) => ReadonlyArray<T>;
|
|
63
|
+
/**
|
|
64
|
+
* Shifts an item from a non-empty mutable array, guaranteed to return T.
|
|
65
|
+
*
|
|
66
|
+
* **Mutates** the original array. Use only with mutable arrays.
|
|
67
|
+
*/
|
|
16
68
|
export declare const shiftArray: <T>(array: NonEmptyArray<T>) => T;
|
|
69
|
+
/**
|
|
70
|
+
* Returns the first element of a non-empty readonly array.
|
|
71
|
+
*
|
|
72
|
+
* Does not mutate the original array.
|
|
73
|
+
*/
|
|
74
|
+
export declare const firstInArray: <T>(array: NonEmptyReadonlyArray<T>) => T;
|
|
75
|
+
/**
|
|
76
|
+
* Returns the last element of a non-empty readonly array.
|
|
77
|
+
*
|
|
78
|
+
* Does not mutate the original array.
|
|
79
|
+
*/
|
|
80
|
+
export declare const lastInArray: <T>(array: NonEmptyReadonlyArray<T>) => T;
|
|
17
81
|
//# sourceMappingURL=Array.d.ts.map
|
package/dist/src/Array.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Array.d.ts","sourceRoot":"","sources":["../../src/Array.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhD,uCAAuC;AACvC,eAAO,MAAM,eAAe,GAAI,CAAC,EAC/B,OAAO,KAAK,CAAC,CAAC,CAAC,KACd,KAAK,IAAI,aAAa,CAAC,CAAC,CAAqB,CAAC;AAEjD,kDAAkD;AAClD,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzE,uCAAuC;AACvC,eAAO,MAAM,uBAAuB,GAAI,CAAC,EACvC,OAAO,aAAa,CAAC,CAAC,CAAC,KACtB,KAAK,IAAI,qBAAqB,CAAC,CAAC,CAAqB,CAAC;AAEzD
|
|
1
|
+
{"version":3,"file":"Array.d.ts","sourceRoot":"","sources":["../../src/Array.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,0CAA0C;AAC1C,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhD,uCAAuC;AACvC,eAAO,MAAM,eAAe,GAAI,CAAC,EAC/B,OAAO,KAAK,CAAC,CAAC,CAAC,KACd,KAAK,IAAI,aAAa,CAAC,CAAC,CAAqB,CAAC;AAEjD,kDAAkD;AAClD,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzE,uCAAuC;AACvC,eAAO,MAAM,uBAAuB,GAAI,CAAC,EACvC,OAAO,aAAa,CAAC,CAAC,CAAC,KACtB,KAAK,IAAI,qBAAqB,CAAC,CAAC,CAAqB,CAAC;AAEzD;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAC7B,MAAM,CAAC,EACP,OAAO,aAAa,CAAC,CAAC,CAAC,KACtB,qBAAqB,CAAC,CAAC,CACwC,CAAC;AAEnE;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,EAC9B,MAAM,CAAC,EACP,OAAO,aAAa,CAAC,CAAC,CAAC,KACtB,qBAAqB,CAAC,CAAC,CAAiD,CAAC;AAE5E;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAC3B,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,EAClD,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,GACpC,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAC5B,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAC3B,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAClC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,GACpC,aAAa,CAAC,CAAC,CAAC,CAAC;AAQpB;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EAC3B,OAAO,aAAa,CAAC,CAAC,CAAC,EACvB,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,KAC7C,aAAa,CAAC,CAAC,CAAgD,CAAC;AAEnE;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,OAAO,aAAa,CAAC,CAAC,CAAC,KAAG,CAAuB,CAAC;AAEhF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,OAAO,qBAAqB,CAAC,CAAC,CAAC,KAAG,CAAa,CAAC;AAEhF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,OAAO,qBAAqB,CAAC,CAAC,CAAC,KAAG,CACxC,CAAC"}
|
package/dist/src/Array.js
CHANGED
|
@@ -1,12 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔒 Immutable, type-safe array operations
|
|
3
|
+
*
|
|
4
|
+
* Helpers that preserve immutability through the type system. Native array
|
|
5
|
+
* methods return mutable arrays even when called on readonly arrays. These
|
|
6
|
+
* helpers ensure transformations return readonly types.
|
|
7
|
+
*
|
|
8
|
+
* {@link NonEmptyArray} and {@link NonEmptyReadonlyArray} types represent arrays
|
|
9
|
+
* with at least one element, eliminating runtime length checks and making
|
|
10
|
+
* function requirements explicit.
|
|
11
|
+
*
|
|
12
|
+
* ### Example
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* // ❌ Native methods return mutable arrays
|
|
16
|
+
* const readonly: ReadonlyArray<number> = [1, 2, 3];
|
|
17
|
+
* const mapped = readonly.map((x) => x * 2); // Array<number> (mutable!)
|
|
18
|
+
*
|
|
19
|
+
* // ✅ Helpers preserve immutability
|
|
20
|
+
* const filtered = filterArray(readonly, (x) => x > 1); // ReadonlyArray<number>
|
|
21
|
+
*
|
|
22
|
+
* // ✅ NonEmptyArray enforces non-emptiness
|
|
23
|
+
* const value = firstInArray(["a", "b"]); // "a"
|
|
24
|
+
* firstInArray([]); // ❌ Compiler error
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @module
|
|
28
|
+
*/
|
|
1
29
|
/** Checks if an array is non-empty. */
|
|
2
30
|
export const isNonEmptyArray = (array) => array.length > 0;
|
|
3
31
|
/** Checks if an array is non-empty. */
|
|
4
32
|
export const isNonEmptyReadonlyArray = (array) => array.length > 0;
|
|
5
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Appends an item to an array, returning a new non-empty readonly array.
|
|
35
|
+
*
|
|
36
|
+
* Accepts both mutable and readonly arrays. Does not mutate the original array.
|
|
37
|
+
*/
|
|
6
38
|
export const appendToArray = (item, array) => [...array, item];
|
|
7
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Prepends an item to an array, returning a new non-empty readonly array.
|
|
41
|
+
*
|
|
42
|
+
* Accepts both mutable and readonly arrays. Does not mutate the original array.
|
|
43
|
+
*/
|
|
8
44
|
export const prependToArray = (item, array) => [item, ...array];
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
45
|
+
export function mapArray(array, mapper) {
|
|
46
|
+
return array.map(mapper);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Filters an array using a predicate function, returning a new readonly array.
|
|
50
|
+
*
|
|
51
|
+
* Accepts both mutable and readonly arrays. Does not mutate the original array.
|
|
52
|
+
*/
|
|
53
|
+
export const filterArray = (array, predicate) => array.filter(predicate);
|
|
54
|
+
/**
|
|
55
|
+
* Shifts an item from a non-empty mutable array, guaranteed to return T.
|
|
56
|
+
*
|
|
57
|
+
* **Mutates** the original array. Use only with mutable arrays.
|
|
58
|
+
*/
|
|
12
59
|
export const shiftArray = (array) => array.shift();
|
|
60
|
+
/**
|
|
61
|
+
* Returns the first element of a non-empty readonly array.
|
|
62
|
+
*
|
|
63
|
+
* Does not mutate the original array.
|
|
64
|
+
*/
|
|
65
|
+
export const firstInArray = (array) => array[0];
|
|
66
|
+
/**
|
|
67
|
+
* Returns the last element of a non-empty readonly array.
|
|
68
|
+
*
|
|
69
|
+
* Does not mutate the original array.
|
|
70
|
+
*/
|
|
71
|
+
export const lastInArray = (array) => array[array.length - 1];
|
package/dist/src/Assert.d.ts
CHANGED
|
@@ -16,9 +16,12 @@
|
|
|
16
16
|
* assert(true, "true is not true"); // no-op
|
|
17
17
|
* assert(false, "true is not true"); // throws Error
|
|
18
18
|
*
|
|
19
|
-
* const
|
|
20
|
-
* //
|
|
21
|
-
* assert(
|
|
19
|
+
* const length = buffer.getLength();
|
|
20
|
+
* // We know length is logically non-negative, but TypeScript doesn't
|
|
21
|
+
* assert(
|
|
22
|
+
* NonNegativeInt.is(length),
|
|
23
|
+
* "buffer length should be non-negative",
|
|
24
|
+
* );
|
|
22
25
|
* ```
|
|
23
26
|
*/
|
|
24
27
|
export declare const assert: (condition: unknown, message: string) => asserts condition;
|
|
@@ -52,17 +55,4 @@ export declare const assertNonEmptyArray: <T>(arr: Array<T>, message?: string) =
|
|
|
52
55
|
* ```
|
|
53
56
|
*/
|
|
54
57
|
export declare const assertNonEmptyReadonlyArray: <T>(arr: ReadonlyArray<T>, message?: string) => asserts arr is readonly [T, ...Array<T>];
|
|
55
|
-
/**
|
|
56
|
-
* Asserts no error reaches a `.catch` block, throwing a developer error if it
|
|
57
|
-
* does. Used in Promise chains where errors indicate bugs to be fixed.
|
|
58
|
-
*
|
|
59
|
-
* ### Example
|
|
60
|
-
*
|
|
61
|
-
* ```ts
|
|
62
|
-
* Promise.reject("test").catch((e) =>
|
|
63
|
-
* assertNoErrorInCatch("WebSocket retry", e),
|
|
64
|
-
* );
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
|
-
export declare function assertNoErrorInCatch(context: string, error: unknown): never;
|
|
68
58
|
//# sourceMappingURL=Assert.d.ts.map
|
package/dist/src/Assert.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Assert.d.ts","sourceRoot":"","sources":["../../src/Assert.ts"],"names":[],"mappings":"AAgBA
|
|
1
|
+
{"version":3,"file":"Assert.d.ts","sourceRoot":"","sources":["../../src/Assert.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,MAAM,EAAE,CACnB,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,SAIZ,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB,EAAE,CAAC,CAAC,EAClC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EACb,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAKlC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,2BAA2B,EAAE,CAAC,CAAC,EAC1C,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EACrB,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAK3C,CAAC"}
|
package/dist/src/Assert.js
CHANGED
|
@@ -16,9 +16,12 @@
|
|
|
16
16
|
* assert(true, "true is not true"); // no-op
|
|
17
17
|
* assert(false, "true is not true"); // throws Error
|
|
18
18
|
*
|
|
19
|
-
* const
|
|
20
|
-
* //
|
|
21
|
-
* assert(
|
|
19
|
+
* const length = buffer.getLength();
|
|
20
|
+
* // We know length is logically non-negative, but TypeScript doesn't
|
|
21
|
+
* assert(
|
|
22
|
+
* NonNegativeInt.is(length),
|
|
23
|
+
* "buffer length should be non-negative",
|
|
24
|
+
* );
|
|
22
25
|
* ```
|
|
23
26
|
*/
|
|
24
27
|
export const assert = (condition, message) => {
|
|
@@ -60,18 +63,3 @@ export const assertNonEmptyArray = (arr, message = "Expected a non-empty array."
|
|
|
60
63
|
export const assertNonEmptyReadonlyArray = (arr, message = "Expected a non-empty readonly array.") => {
|
|
61
64
|
assert(arr.length > 0, message);
|
|
62
65
|
};
|
|
63
|
-
/**
|
|
64
|
-
* Asserts no error reaches a `.catch` block, throwing a developer error if it
|
|
65
|
-
* does. Used in Promise chains where errors indicate bugs to be fixed.
|
|
66
|
-
*
|
|
67
|
-
* ### Example
|
|
68
|
-
*
|
|
69
|
-
* ```ts
|
|
70
|
-
* Promise.reject("test").catch((e) =>
|
|
71
|
-
* assertNoErrorInCatch("WebSocket retry", e),
|
|
72
|
-
* );
|
|
73
|
-
* ```
|
|
74
|
-
*/
|
|
75
|
-
export function assertNoErrorInCatch(context, error) {
|
|
76
|
-
throw Object.assign(new Error(`Error in ${context}: an unexpected error reached a catch block and requires a fix`), { cause: error });
|
|
77
|
-
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A utility interface for creating branded types.
|
|
3
|
+
*
|
|
4
|
+
* Branded types enhance type safety by differentiating otherwise identical base
|
|
5
|
+
* types, such as `number` or `string`, to enforce stricter type checks.
|
|
6
|
+
*
|
|
7
|
+
* Supports multiple brands, allowing types to act like flags.
|
|
8
|
+
*
|
|
9
|
+
* ### Example 1: Single Brand
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* // A branded type definition
|
|
13
|
+
* type UserId = number & Brand<"UserId">;
|
|
14
|
+
*
|
|
15
|
+
* // A function that creates `UserId` values.
|
|
16
|
+
* // Casting with `as UserId` is unsafe, so `createUserId` must be unit-tested.
|
|
17
|
+
* const createUserId = (): UserId => {
|
|
18
|
+
* return 123 as UserId; // Unsafe casting
|
|
19
|
+
* };
|
|
20
|
+
*
|
|
21
|
+
* const userId = createUserId();
|
|
22
|
+
*
|
|
23
|
+
* // A function that accepts only `UserId`.
|
|
24
|
+
* const getUser = (id: UserId) => {
|
|
25
|
+
* // Implementation
|
|
26
|
+
* };
|
|
27
|
+
*
|
|
28
|
+
* getUser(userId); // ✅ Valid
|
|
29
|
+
* getUser(123); // ❌ TypeScript error
|
|
30
|
+
* getUser("123"); // ❌ TypeScript error
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* ### Example 2: Multiple Brands
|
|
34
|
+
*
|
|
35
|
+
* ```ts
|
|
36
|
+
* // Define branded types
|
|
37
|
+
* type Min1 = string & Brand<"Min1">;
|
|
38
|
+
* type Max100 = string & Brand<"Max100">;
|
|
39
|
+
* type Min1Max100 = string & Brand<"Min1" | "Max100">;
|
|
40
|
+
*
|
|
41
|
+
* // Functions requiring specific brands
|
|
42
|
+
* const requiresMin1 = (value: Min1): void => {};
|
|
43
|
+
* const requiresMax100 = (value: Max100): void => {};
|
|
44
|
+
*
|
|
45
|
+
* // Values with single brands
|
|
46
|
+
* const min1Value: Min1 = "hello" as Min1;
|
|
47
|
+
* const max100Value: Max100 = "world" as Max100;
|
|
48
|
+
*
|
|
49
|
+
* // Value with multiple brands
|
|
50
|
+
* const min1Max100Value: Min1Max100 = "typescript" as Min1Max100;
|
|
51
|
+
*
|
|
52
|
+
* // Valid cases
|
|
53
|
+
* requiresMin1(min1Value); // ✅ Valid
|
|
54
|
+
* requiresMax100(max100Value); // ✅ Valid
|
|
55
|
+
* requiresMin1(min1Max100Value); // ✅ Valid: Min1Max100 satisfies Min1
|
|
56
|
+
* requiresMax100(min1Max100Value); // ✅ Valid: Min1Max100 satisfies Max100
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export interface Brand<B extends string> {
|
|
60
|
+
readonly [__brand]: Readonly<Record<B, true>>;
|
|
61
|
+
}
|
|
62
|
+
declare const __brand: unique symbol;
|
|
63
|
+
/**
|
|
64
|
+
* Determines whether a type `T` is a branded type.
|
|
65
|
+
*
|
|
66
|
+
* Works with any base type intersected with a `Brand`.
|
|
67
|
+
*
|
|
68
|
+
* ### Examples
|
|
69
|
+
*
|
|
70
|
+
* - `IsBranded<string>` -> false
|
|
71
|
+
* - `IsBranded<string & Brand<"X">>` -> true
|
|
72
|
+
*/
|
|
73
|
+
export type IsBranded<T> = T extends Brand<string> ? true : false;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=Brand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Brand.d.ts","sourceRoot":"","sources":["../../src/Brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,MAAM,WAAW,KAAK,CAAC,CAAC,SAAS,MAAM;IACrC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CAC/C;AAED,OAAO,CAAC,MAAM,OAAO,EAAE,OAAO,MAAM,CAAC;AAErC;;;;;;;;;GASG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/src/Buffer.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NonNegativeInt } from "./Type.js";
|
|
2
|
-
export { bytesToHex, bytesToUtf8, concatBytes, hexToBytes, utf8ToBytes, } from "@noble/ciphers/utils";
|
|
2
|
+
export { bytesToHex, bytesToUtf8, concatBytes, hexToBytes, utf8ToBytes, } from "@noble/ciphers/utils.js";
|
|
3
3
|
/**
|
|
4
4
|
* Custom error for {@link Buffer}-related failures like premature end of data.
|
|
5
5
|
* Provides better stack traces for debugging binary protocol issues.
|
package/dist/src/Buffer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Buffer.d.ts","sourceRoot":"","sources":["../../src/Buffer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAW,GACZ,MAAM,
|
|
1
|
+
{"version":3,"file":"Buffer.d.ts","sourceRoot":"","sources":["../../src/Buffer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAM5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,WAAW,MAAM;IACrB,sDAAsD;IACtD,WAAW,EAAE,MAAM,cAAc,CAAC;IAElC,gEAAgE;IAChE,SAAS,EAAE,MAAM,cAAc,CAAC;IAEhC;;;OAGG;IACH,MAAM,EAAE,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAEtD;;;OAGG;IACH,KAAK,EAAE,MAAM,cAAc,CAAC;IAE5B;;;OAGG;IACH,MAAM,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,UAAU,CAAC;IAE1C;;;OAGG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAE3C;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB;;;;OAIG;IACH,MAAM,EAAE,MAAM,UAAU,CAAC;CAC1B;AAED,eAAO,MAAM,YAAY,GACvB,YAAY,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,KACzC,MA4DF,CAAC"}
|
package/dist/src/Buffer.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { NonNegativeInt } from "./Type.js";
|
|
2
|
+
export { bytesToHex, bytesToUtf8, concatBytes, hexToBytes, utf8ToBytes, } from "@noble/ciphers/utils.js";
|
|
2
3
|
/**
|
|
3
4
|
* Custom error for {@link Buffer}-related failures like premature end of data.
|
|
4
5
|
* Provides better stack traces for debugging binary protocol issues.
|
|
@@ -14,9 +15,9 @@ export const createBuffer = (arrayLike) => {
|
|
|
14
15
|
let value = arrayLike
|
|
15
16
|
? new globalThis.Uint8Array(arrayLike)
|
|
16
17
|
: new globalThis.Uint8Array(512);
|
|
17
|
-
let length = (arrayLike ? arrayLike.length : 0);
|
|
18
|
+
let length = NonNegativeInt.orThrow(arrayLike ? arrayLike.length : 0);
|
|
18
19
|
const buffer = {
|
|
19
|
-
getCapacity: () => value.length,
|
|
20
|
+
getCapacity: () => NonNegativeInt.orThrow(value.length),
|
|
20
21
|
getLength: () => length,
|
|
21
22
|
extend: (arg) => {
|
|
22
23
|
const targetSize = length + arg.length;
|
|
@@ -27,7 +28,7 @@ export const createBuffer = (arrayLike) => {
|
|
|
27
28
|
value.set(oldValue);
|
|
28
29
|
}
|
|
29
30
|
value.set(arg, length);
|
|
30
|
-
length = (length + arg.length);
|
|
31
|
+
length = NonNegativeInt.orThrow(length + arg.length);
|
|
31
32
|
},
|
|
32
33
|
shift: () => {
|
|
33
34
|
if (length === 0) {
|
|
@@ -36,7 +37,7 @@ export const createBuffer = (arrayLike) => {
|
|
|
36
37
|
const first = value[0];
|
|
37
38
|
value = value.subarray(1);
|
|
38
39
|
length--;
|
|
39
|
-
return first;
|
|
40
|
+
return NonNegativeInt.orThrow(first);
|
|
40
41
|
},
|
|
41
42
|
shiftN: (n) => {
|
|
42
43
|
if (length < n) {
|
|
@@ -44,7 +45,7 @@ export const createBuffer = (arrayLike) => {
|
|
|
44
45
|
}
|
|
45
46
|
const subarray = value.subarray(0, n);
|
|
46
47
|
value = value.subarray(n);
|
|
47
|
-
length = (length - n);
|
|
48
|
+
length = NonNegativeInt.orThrow(length - n);
|
|
48
49
|
return subarray;
|
|
49
50
|
},
|
|
50
51
|
truncate: (newLength) => {
|
|
@@ -54,7 +55,7 @@ export const createBuffer = (arrayLike) => {
|
|
|
54
55
|
length = newLength;
|
|
55
56
|
},
|
|
56
57
|
reset: () => {
|
|
57
|
-
length = 0;
|
|
58
|
+
length = NonNegativeInt.orThrow(0);
|
|
58
59
|
},
|
|
59
60
|
unwrap: () => value.subarray(0, length),
|
|
60
61
|
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🗄️ Generic cache interface and LRU cache implementation.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { PositiveInt } from "./Type.js";
|
|
7
|
+
/**
|
|
8
|
+
* Generic cache interface providing basic key-value storage operations.
|
|
9
|
+
*
|
|
10
|
+
* Keys are compared by reference (standard Map semantics).
|
|
11
|
+
*
|
|
12
|
+
* Note: Cache does not extend Map because eviction policies (like in LRU)
|
|
13
|
+
* violate the Liskov Substitution Principle.
|
|
14
|
+
*/
|
|
15
|
+
export interface Cache<K, V> {
|
|
16
|
+
/** Checks if a key exists in the cache. */
|
|
17
|
+
has: (key: K) => boolean;
|
|
18
|
+
/** Retrieves the value for a key, or undefined if not present. */
|
|
19
|
+
get: (key: K) => V | undefined;
|
|
20
|
+
/** Stores a key-value pair in the cache. */
|
|
21
|
+
set: (key: K, val: V) => void;
|
|
22
|
+
/** Removes a key from the cache. */
|
|
23
|
+
delete: (key: K) => void;
|
|
24
|
+
/** Returns a readonly view of the internal Map. */
|
|
25
|
+
readonly map: ReadonlyMap<K, V>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Creates a Least Recently Used (LRU) cache with a maximum capacity.
|
|
29
|
+
*
|
|
30
|
+
* When the cache reaches capacity, the least recently used entry is evicted.
|
|
31
|
+
* Both `get` and `set` operations update the access order.
|
|
32
|
+
*
|
|
33
|
+
* ### Example
|
|
34
|
+
*
|
|
35
|
+
* ```ts
|
|
36
|
+
* const cache = createLruCache<string, number>(2);
|
|
37
|
+
* cache.set("a", 1);
|
|
38
|
+
* cache.set("b", 2);
|
|
39
|
+
* cache.set("c", 3); // Evicts "a"
|
|
40
|
+
* cache.has("a"); // false
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare const createLruCache: <K, V>(capacity: PositiveInt) => Cache<K, V>;
|
|
44
|
+
//# sourceMappingURL=Cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../src/Cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;;;;;;GAOG;AACH,MAAM,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;IACzB,2CAA2C;IAC3C,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;IAEzB,kEAAkE;IAClE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAE/B,4CAA4C;IAC5C,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAE9B,oCAAoC;IACpC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAEzB,mDAAmD;IACnD,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,EAAE,UAAU,WAAW,KAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAmCtE,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🗄️ Generic cache interface and LRU cache implementation.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Creates a Least Recently Used (LRU) cache with a maximum capacity.
|
|
8
|
+
*
|
|
9
|
+
* When the cache reaches capacity, the least recently used entry is evicted.
|
|
10
|
+
* Both `get` and `set` operations update the access order.
|
|
11
|
+
*
|
|
12
|
+
* ### Example
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* const cache = createLruCache<string, number>(2);
|
|
16
|
+
* cache.set("a", 1);
|
|
17
|
+
* cache.set("b", 2);
|
|
18
|
+
* cache.set("c", 3); // Evicts "a"
|
|
19
|
+
* cache.has("a"); // false
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export const createLruCache = (capacity) => {
|
|
23
|
+
const internalMap = new Map();
|
|
24
|
+
return {
|
|
25
|
+
has: (key) => internalMap.has(key),
|
|
26
|
+
get: (key) => {
|
|
27
|
+
const value = internalMap.get(key);
|
|
28
|
+
if (value === undefined)
|
|
29
|
+
return undefined;
|
|
30
|
+
// Move to end (most recently used)
|
|
31
|
+
internalMap.delete(key);
|
|
32
|
+
internalMap.set(key, value);
|
|
33
|
+
return value;
|
|
34
|
+
},
|
|
35
|
+
set: (key, val) => {
|
|
36
|
+
// If key exists, delete it first to update order
|
|
37
|
+
if (internalMap.has(key)) {
|
|
38
|
+
internalMap.delete(key);
|
|
39
|
+
}
|
|
40
|
+
else if (internalMap.size === capacity) {
|
|
41
|
+
// Evict least recently used (first entry)
|
|
42
|
+
const firstKey = internalMap.keys().next().value;
|
|
43
|
+
internalMap.delete(firstKey);
|
|
44
|
+
}
|
|
45
|
+
internalMap.set(key, val);
|
|
46
|
+
},
|
|
47
|
+
delete: (key) => {
|
|
48
|
+
internalMap.delete(key);
|
|
49
|
+
},
|
|
50
|
+
map: internalMap,
|
|
51
|
+
};
|
|
52
|
+
};
|
package/dist/src/Callbacks.d.ts
CHANGED
|
@@ -1,20 +1,53 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Brand } from "./Brand.js";
|
|
2
|
+
import { RandomBytesDep } from "./Crypto.js";
|
|
3
|
+
import { Id } from "./Type.js";
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
+
* Request-response correlation for callbacks across boundaries.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
7
|
+
* Stores callbacks with unique IDs and executes them once with an optional
|
|
8
|
+
* argument. Executed callbacks are automatically removed.
|
|
8
9
|
*
|
|
9
|
-
* This is useful for
|
|
10
|
-
*
|
|
10
|
+
* This is useful for correlating asynchronous request-response operations
|
|
11
|
+
* across boundaries where callback functions cannot be passed directly (e.g.,
|
|
12
|
+
* web workers, message queues).
|
|
13
|
+
*
|
|
14
|
+
* The `execute` method intentionally does not use try-catch or {@link Result}
|
|
15
|
+
* because it's the callback's responsibility to handle its own errors.
|
|
16
|
+
*
|
|
17
|
+
* ### Example
|
|
18
|
+
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* // No-argument callbacks
|
|
21
|
+
* const callbacks = createCallbacks(deps);
|
|
22
|
+
* const id = callbacks.register(() => console.log("called"));
|
|
23
|
+
* callbacks.execute(id);
|
|
24
|
+
*
|
|
25
|
+
* // With argument callbacks
|
|
26
|
+
* const stringCallbacks = createCallbacks<string>(deps);
|
|
27
|
+
* const id = stringCallbacks.register((value) => {
|
|
28
|
+
* console.log(value);
|
|
29
|
+
* });
|
|
30
|
+
* stringCallbacks.execute(id, "hello");
|
|
31
|
+
*
|
|
32
|
+
* // Promise.withResolvers pattern
|
|
33
|
+
* const promiseCallbacks = createCallbacks<string>(deps);
|
|
34
|
+
* const { promise, resolve } = Promise.withResolvers<string>();
|
|
35
|
+
* const id = promiseCallbacks.register(resolve);
|
|
36
|
+
* promiseCallbacks.execute(id, "resolved value");
|
|
37
|
+
* await promise; // "resolved value"
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @template T - The type of argument passed to callbacks (defaults to undefined
|
|
41
|
+
* for no-argument callbacks)
|
|
11
42
|
*/
|
|
12
|
-
export interface Callbacks {
|
|
43
|
+
export interface Callbacks<T = undefined> {
|
|
13
44
|
/** Registers a callback function and returns a unique ID. */
|
|
14
|
-
readonly register: (callback: (arg
|
|
45
|
+
readonly register: (callback: (arg: T) => void) => CallbackId;
|
|
15
46
|
/** Executes and removes a callback associated with the given ID. */
|
|
16
|
-
readonly execute: (id: CallbackId, arg
|
|
47
|
+
readonly execute: T extends undefined ? (id: CallbackId) => undefined : (id: CallbackId, arg: T) => undefined;
|
|
17
48
|
}
|
|
18
|
-
|
|
19
|
-
export
|
|
49
|
+
/** Unique identifier for a callback in {@link Callbacks}. */
|
|
50
|
+
export type CallbackId = Id & Brand<"Callback">;
|
|
51
|
+
/** Creates a new {@link Callbacks}. */
|
|
52
|
+
export declare const createCallbacks: <T = undefined>(deps: RandomBytesDep) => Callbacks<T>;
|
|
20
53
|
//# sourceMappingURL=Callbacks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Callbacks.d.ts","sourceRoot":"","sources":["../../src/Callbacks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Callbacks.d.ts","sourceRoot":"","sources":["../../src/Callbacks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAY,EAAE,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,SAAS;IACtC,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,KAAK,UAAU,CAAC;IAE9D,oEAAoE;IACpE,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,SAAS,GACjC,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,GAC7B,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC;CAC3C;AAED,6DAA6D;AAC7D,MAAM,MAAM,UAAU,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;AAEhD,uCAAuC;AACvC,eAAO,MAAM,eAAe,GAAI,CAAC,GAAG,SAAS,EAC3C,MAAM,cAAc,KACnB,SAAS,CAAC,CAAC,CAsBb,CAAC"}
|
package/dist/src/Callbacks.js
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
|
+
import { createId } from "./Type.js";
|
|
2
|
+
/** Creates a new {@link Callbacks}. */
|
|
1
3
|
export const createCallbacks = (deps) => {
|
|
2
4
|
const callbackMap = new Map();
|
|
3
|
-
|
|
5
|
+
return {
|
|
4
6
|
register: (callback) => {
|
|
5
|
-
const id = deps
|
|
7
|
+
const id = createId(deps);
|
|
6
8
|
callbackMap.set(id, callback);
|
|
7
9
|
return id;
|
|
8
10
|
},
|
|
9
|
-
execute: (id,
|
|
11
|
+
execute: (id, ...args) => {
|
|
10
12
|
const callback = callbackMap.get(id);
|
|
11
|
-
if (callback)
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
if (!callback)
|
|
14
|
+
return;
|
|
15
|
+
callbackMap.delete(id);
|
|
16
|
+
if (args.length === 0) {
|
|
17
|
+
// Called without argument (undefined case)
|
|
18
|
+
callback();
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
callback(args[0]);
|
|
14
22
|
}
|
|
15
23
|
},
|
|
16
24
|
};
|
|
17
|
-
return callbacks;
|
|
18
25
|
};
|