@derivation/rpc 0.3.5 → 0.5.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/dist/client-DJZfuakf.d.cts +27 -0
- package/dist/{client.d.ts → client-TPsVZH_B.d.ts} +7 -4
- package/dist/index.cjs +335 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +55 -0
- package/dist/index.d.ts +55 -7
- package/dist/index.js +305 -6
- package/dist/index.js.map +1 -0
- package/dist/iso.cjs +151 -0
- package/dist/iso.cjs.map +1 -0
- package/dist/iso.d.cts +52 -0
- package/dist/iso.d.ts +35 -19
- package/dist/iso.js +99 -101
- package/dist/iso.js.map +1 -0
- package/dist/{presence-manager.d.ts → presence-manager-4LlEyuGp.d.cts} +3 -1
- package/dist/presence-manager-4LlEyuGp.d.ts +7 -0
- package/dist/shared-worker-client.cjs +271 -0
- package/dist/shared-worker-client.cjs.map +1 -0
- package/dist/shared-worker-client.d.cts +26 -0
- package/dist/shared-worker-client.d.ts +8 -4
- package/dist/shared-worker-client.js +243 -24
- package/dist/shared-worker-client.js.map +1 -0
- package/dist/shared-worker-server.cjs +363 -0
- package/dist/shared-worker-server.cjs.map +1 -0
- package/dist/shared-worker-server.d.cts +31 -0
- package/dist/shared-worker-server.d.ts +9 -6
- package/dist/shared-worker-server.js +332 -58
- package/dist/shared-worker-server.js.map +1 -0
- package/dist/stream-types-Q_EqNLtO.d.cts +46 -0
- package/dist/stream-types-Q_EqNLtO.d.ts +46 -0
- package/dist/transport.cjs +19 -0
- package/dist/transport.cjs.map +1 -0
- package/dist/transport.d.cts +29 -0
- package/dist/transport.d.ts +3 -1
- package/dist/transport.js +1 -1
- package/dist/transport.js.map +1 -0
- package/dist/web-socket-server.cjs +469 -0
- package/dist/web-socket-server.cjs.map +1 -0
- package/dist/web-socket-server.d.cts +14 -0
- package/dist/web-socket-server.d.ts +10 -7
- package/dist/web-socket-server.js +437 -52
- package/dist/web-socket-server.js.map +1 -0
- package/dist/web-socket-transport.cjs +52 -0
- package/dist/web-socket-transport.cjs.map +1 -0
- package/dist/web-socket-transport.d.cts +16 -0
- package/dist/web-socket-transport.d.ts +5 -2
- package/dist/web-socket-transport.js +27 -25
- package/dist/web-socket-transport.js.map +1 -0
- package/package.json +26 -17
- package/dist/client-handler.d.ts +0 -27
- package/dist/client-handler.js +0 -187
- package/dist/client-message.d.ts +0 -57
- package/dist/client-message.js +0 -59
- package/dist/client.js +0 -133
- package/dist/messageport-transport.d.ts +0 -13
- package/dist/messageport-transport.js +0 -28
- package/dist/node-web-socket-transport.d.ts +0 -16
- package/dist/node-web-socket-transport.js +0 -33
- package/dist/presence-manager.js +0 -1
- package/dist/queue.d.ts +0 -9
- package/dist/queue.js +0 -32
- package/dist/rate-limiter.d.ts +0 -7
- package/dist/rate-limiter.js +0 -24
- package/dist/reactive-map-adapter.d.ts +0 -24
- package/dist/reactive-map-adapter.js +0 -43
- package/dist/reactive-set-adapter.d.ts +0 -24
- package/dist/reactive-set-adapter.js +0 -41
- package/dist/server-message.d.ts +0 -48
- package/dist/server-message.js +0 -52
- package/dist/shared-worker-client-handler.d.ts +0 -27
- package/dist/shared-worker-client-handler.js +0 -149
- package/dist/stream-adapter.d.ts +0 -23
- package/dist/stream-adapter.js +0 -35
- package/dist/stream-types.d.ts +0 -44
- package/dist/stream-types.js +0 -1
- package/dist/tests/context.test.d.ts +0 -1
- package/dist/tests/context.test.js +0 -252
- package/dist/tests/iso.test.d.ts +0 -1
- package/dist/tests/iso.test.js +0 -186
- package/dist/tests/messages.test.d.ts +0 -1
- package/dist/tests/messages.test.js +0 -152
- package/dist/tests/mutations.test.d.ts +0 -1
- package/dist/tests/mutations.test.js +0 -122
- package/dist/tests/queue.test.d.ts +0 -1
- package/dist/tests/queue.test.js +0 -84
- package/dist/tests/reactive-map-adapter.test.d.ts +0 -1
- package/dist/tests/reactive-map-adapter.test.js +0 -190
- package/dist/tests/reactive-set-adapter.test.d.ts +0 -1
- package/dist/tests/reactive-set-adapter.test.js +0 -157
- package/dist/tests/stream-adapter.test.d.ts +0 -1
- package/dist/tests/stream-adapter.test.js +0 -119
- package/dist/tests/weak-list.test.d.ts +0 -1
- package/dist/tests/weak-list.test.js +0 -100
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/weak-list.d.ts +0 -5
- package/dist/weak-list.js +0 -19
package/dist/iso.js
CHANGED
|
@@ -1,115 +1,113 @@
|
|
|
1
|
+
// src/iso.ts
|
|
1
2
|
import { Record as ImmutableRecord } from "immutable";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
import { List, Set as ImmutableSet, Map as ImmutableMap } from "immutable";
|
|
4
|
+
function id() {
|
|
5
|
+
return {
|
|
6
|
+
to: (x) => x,
|
|
7
|
+
from: (x) => x
|
|
8
|
+
};
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
function unknown() {
|
|
11
|
+
return {
|
|
12
|
+
to: (x) => x,
|
|
13
|
+
from: (x) => x
|
|
14
|
+
};
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
function flip(iso) {
|
|
17
|
+
return {
|
|
18
|
+
to: (x) => iso.from(x),
|
|
19
|
+
from: (x) => iso.to(x)
|
|
20
|
+
};
|
|
20
21
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
function compose(first, second) {
|
|
23
|
+
return {
|
|
24
|
+
to: (x) => second.to(first.to(x)),
|
|
25
|
+
from: (x) => first.from(second.from(x))
|
|
26
|
+
};
|
|
26
27
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
function array(itemIso) {
|
|
29
|
+
return {
|
|
30
|
+
to: (xs) => xs.map(itemIso.to),
|
|
31
|
+
from: (xs) => xs.map(itemIso.from)
|
|
32
|
+
};
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
34
|
+
function object(spec) {
|
|
35
|
+
return {
|
|
36
|
+
to: (x) => {
|
|
37
|
+
const result = {};
|
|
38
|
+
for (const key in spec) {
|
|
39
|
+
result[key] = spec[key].to(x[key]);
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
},
|
|
43
|
+
from: (x) => {
|
|
44
|
+
const result = {};
|
|
45
|
+
for (const key in spec) {
|
|
46
|
+
result[key] = spec[key].from(x[key]);
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
50
51
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
for (const [item, weight] of xs) {
|
|
57
|
-
zset = zset.add(item, weight);
|
|
58
|
-
}
|
|
59
|
-
return zset;
|
|
60
|
-
},
|
|
61
|
-
};
|
|
52
|
+
function shallowRecord() {
|
|
53
|
+
return {
|
|
54
|
+
to: (x) => x.toObject(),
|
|
55
|
+
from: (x) => ImmutableRecord(x)(x)
|
|
56
|
+
};
|
|
62
57
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
to: (x) => {
|
|
66
|
-
const result = {};
|
|
67
|
-
for (const key in spec) {
|
|
68
|
-
result[key] = spec[key].to(x[key]);
|
|
69
|
-
}
|
|
70
|
-
return result;
|
|
71
|
-
},
|
|
72
|
-
from: (x) => {
|
|
73
|
-
const result = {};
|
|
74
|
-
for (const key in spec) {
|
|
75
|
-
result[key] = spec[key].from(x[key]);
|
|
76
|
-
}
|
|
77
|
-
return result;
|
|
78
|
-
},
|
|
79
|
-
};
|
|
58
|
+
function record(spec) {
|
|
59
|
+
return compose(shallowRecord(), object(spec));
|
|
80
60
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
61
|
+
function tuple(...isos) {
|
|
62
|
+
return {
|
|
63
|
+
to: (x) => x.map((xi, i) => isos[i].to(xi)),
|
|
64
|
+
from: (x) => x.map((xi, i) => isos[i].from(xi))
|
|
65
|
+
};
|
|
86
66
|
}
|
|
87
|
-
|
|
88
|
-
|
|
67
|
+
function map(keyIso, valueIso) {
|
|
68
|
+
return {
|
|
69
|
+
to: (m) => [...m.entries()].map(([k, v]) => [keyIso.to(k), valueIso.to(v)]),
|
|
70
|
+
from: (entries) => new Map(entries.map(([k, v]) => [keyIso.from(k), valueIso.from(v)]))
|
|
71
|
+
};
|
|
89
72
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
73
|
+
function shallowList() {
|
|
74
|
+
return {
|
|
75
|
+
to: (x) => x.toArray(),
|
|
76
|
+
from: (x) => List(x)
|
|
77
|
+
};
|
|
95
78
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
to: (m) => [...m.entries()].map(([k, v]) => [keyIso.to(k), valueIso.to(v)]),
|
|
99
|
-
from: (entries) => new Map(entries.map(([k, v]) => [keyIso.from(k), valueIso.from(v)])),
|
|
100
|
-
};
|
|
79
|
+
function list(itemIso) {
|
|
80
|
+
return compose(shallowList(), array(itemIso));
|
|
101
81
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
let zmap = new ZMap();
|
|
108
|
-
for (const e of entries) {
|
|
109
|
-
const [k, v, w] = entryIso.from(e);
|
|
110
|
-
zmap = zmap.add(k, v, w);
|
|
111
|
-
}
|
|
112
|
-
return zmap;
|
|
113
|
-
},
|
|
114
|
-
};
|
|
82
|
+
function immutableSet(itemIso) {
|
|
83
|
+
return {
|
|
84
|
+
to: (xs) => xs.toArray().map(itemIso.to),
|
|
85
|
+
from: (xs) => ImmutableSet(xs.map(itemIso.from))
|
|
86
|
+
};
|
|
115
87
|
}
|
|
88
|
+
function immutableMap(keyIso, valueIso) {
|
|
89
|
+
const entryIso = tuple(keyIso, valueIso);
|
|
90
|
+
return {
|
|
91
|
+
to: (m) => m.entrySeq().toArray().map((e) => entryIso.to([...e])),
|
|
92
|
+
from: (entries) => {
|
|
93
|
+
return ImmutableMap(entries.map((e) => entryIso.from(e)));
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export {
|
|
98
|
+
array,
|
|
99
|
+
compose,
|
|
100
|
+
flip,
|
|
101
|
+
id,
|
|
102
|
+
immutableMap,
|
|
103
|
+
immutableSet,
|
|
104
|
+
list,
|
|
105
|
+
map,
|
|
106
|
+
object,
|
|
107
|
+
record,
|
|
108
|
+
shallowList,
|
|
109
|
+
shallowRecord,
|
|
110
|
+
tuple,
|
|
111
|
+
unknown
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=iso.js.map
|
package/dist/iso.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/iso.ts"],"sourcesContent":["import { Record as ImmutableRecord, RecordOf } from \"immutable\";\nimport { List, Set as ImmutableSet, Map as ImmutableMap } from \"immutable\";\n\nexport interface Iso<In, Out> {\n to(x: In): Out;\n from(x: Out): In;\n}\n\nexport function id<A>(): Iso<A, A> {\n return {\n to: (x: A) => x,\n from: (x: A) => x,\n };\n}\n\nexport function unknown<A>(): Iso<A, unknown> {\n return {\n to: (x: A) => x,\n from: (x: unknown) => x as A,\n };\n}\n\nexport function flip<A, B>(iso: Iso<A, B>): Iso<B, A> {\n return {\n to: (x: B) => iso.from(x),\n from: (x: A) => iso.to(x),\n };\n}\n\nexport function compose<A, B, C>(\n first: Iso<A, B>,\n second: Iso<B, C>,\n): Iso<A, C> {\n return {\n to: (x: A) => second.to(first.to(x)),\n from: (x: C) => first.from(second.from(x)),\n };\n}\n\nexport function array<A, B>(itemIso: Iso<A, B>): Iso<Array<A>, Array<B>> {\n return {\n to: (xs: Array<A>) => xs.map(itemIso.to),\n from: (xs: Array<B>) => xs.map(itemIso.from),\n };\n}\n\n\nexport type IsoIn<T> = T extends Iso<infer A, unknown> ? A : never;\nexport type IsoOut<T> = T extends Iso<unknown, infer B> ? B : never;\n\ntype ObjectIsos = Record<string, Iso<unknown, unknown>>;\ntype ObjectIn<T extends ObjectIsos> = { [K in keyof T]: IsoIn<T[K]> };\ntype ObjectOut<T extends ObjectIsos> = { [K in keyof T]: IsoOut<T[K]> };\n\nexport function object<T extends ObjectIsos>(\n spec: T,\n): Iso<ObjectIn<T>, ObjectOut<T>> {\n return {\n to: (x) => {\n const result = {} as ObjectOut<T>;\n for (const key in spec) {\n result[key] = spec[key].to(x[key]) as IsoOut<\n T[Extract<keyof T, string>]\n >;\n }\n return result;\n },\n from: (x) => {\n const result = {} as ObjectIn<T>;\n for (const key in spec) {\n result[key] = spec[key].from(x[key]) as IsoIn<\n T[Extract<keyof T, string>]\n >;\n }\n return result;\n },\n };\n}\n\nexport function shallowRecord<T extends Record<string, unknown>>(): Iso<\n RecordOf<T>,\n T\n> {\n return {\n to: (x: RecordOf<T>): T => x.toObject(),\n from: (x: T): RecordOf<T> => ImmutableRecord<T>(x)(x),\n };\n}\n\nexport function record<T extends ObjectIsos>(\n spec: T,\n): Iso<RecordOf<ObjectIn<T>>, ObjectOut<T>> {\n return compose(shallowRecord(), object(spec));\n}\n\ntype TupleIsos = Array<Iso<unknown, unknown>>;\ntype TupleIn<T extends TupleIsos> = { [K in keyof T]: IsoIn<T[K]> };\ntype TupleOut<T extends TupleIsos> = { [K in keyof T]: IsoOut<T[K]> };\n\nexport function tuple<T extends TupleIsos>(\n ...isos: T\n): Iso<TupleIn<T>, TupleOut<T>> {\n return {\n to: (x) => x.map((xi, i) => isos[i].to(xi)) as TupleOut<T>,\n from: (x) => x.map((xi, i) => isos[i].from(xi)) as TupleIn<T>,\n };\n}\n\nexport function map<K, V, K2, V2>(\n keyIso: Iso<K, K2>,\n valueIso: Iso<V, V2>,\n): Iso<Map<K, V>, Array<[K2, V2]>> {\n return {\n to: (m) => [...m.entries()].map(([k, v]) => [keyIso.to(k), valueIso.to(v)]),\n from: (entries) =>\n new Map(entries.map(([k, v]) => [keyIso.from(k), valueIso.from(v)])),\n };\n}\n\n\n/**\n * A shallow isomorphism between an Immutable.js List and a standard Array.\n */\nexport function shallowList<A>(): Iso<List<A>, Array<A>> {\n return {\n to: (x: List<A>): Array<A> => x.toArray(),\n from: (x: Array<A>): List<A> => List(x),\n };\n}\n\n/**\n * A deep isomorphism that converts a List to an Array and\n * applies an itemIso to every element.\n */\nexport function list<A, B>(itemIso: Iso<A, B>): Iso<List<A>, Array<B>> {\n return compose(shallowList<A>(), array(itemIso));\n}\n\n/**\n * Deep conversion: ImmutableSet<A> <-> Array<B>\n * Note: Converting to Array is usually safer for serialization than native Set.\n */\nexport function immutableSet<A, B>(\n itemIso: Iso<A, B>,\n): Iso<ImmutableSet<A>, Array<B>> {\n return {\n to: (xs: ImmutableSet<A>) => xs.toArray().map(itemIso.to),\n from: (xs: Array<B>) => ImmutableSet(xs.map(itemIso.from)),\n };\n}\n\n/**\n * Deep conversion: ImmutableMap<K, V> <-> Array<[K2, V2]>\n */\nexport function immutableMap<K, V, K2, V2>(\n keyIso: Iso<K, K2>,\n valueIso: Iso<V, V2>,\n): Iso<ImmutableMap<K, V>, Array<[K2, V2]>> {\n const entryIso = tuple(keyIso, valueIso);\n return {\n to: (m) =>\n m\n .entrySeq()\n .toArray()\n .map((e) => entryIso.to([...e] as [K, V])),\n from: (entries) => {\n return ImmutableMap(entries.map((e) => entryIso.from(e)));\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
interface PresenceHandler {
|
|
2
2
|
add(value: Record<string, unknown>): void;
|
|
3
3
|
remove(value: Record<string, unknown>): void;
|
|
4
4
|
update(oldValue: Record<string, unknown>, newValue: Record<string, unknown>): void;
|
|
5
5
|
}
|
|
6
|
+
|
|
7
|
+
export type { PresenceHandler as P };
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/shared-worker-client.ts
|
|
21
|
+
var shared_worker_client_exports = {};
|
|
22
|
+
__export(shared_worker_client_exports, {
|
|
23
|
+
createSharedWorkerClient: () => createSharedWorkerClient
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(shared_worker_client_exports);
|
|
26
|
+
|
|
27
|
+
// src/client-message.ts
|
|
28
|
+
var import_zod = require("zod");
|
|
29
|
+
var SubscribeMessageSchema = import_zod.z.object({
|
|
30
|
+
type: import_zod.z.literal("subscribe"),
|
|
31
|
+
id: import_zod.z.number(),
|
|
32
|
+
name: import_zod.z.string(),
|
|
33
|
+
args: import_zod.z.looseObject({})
|
|
34
|
+
});
|
|
35
|
+
var UnsubscribeMessageSchema = import_zod.z.object({
|
|
36
|
+
type: import_zod.z.literal("unsubscribe"),
|
|
37
|
+
id: import_zod.z.number()
|
|
38
|
+
});
|
|
39
|
+
var HeartbeatMessageSchema = import_zod.z.object({
|
|
40
|
+
type: import_zod.z.literal("heartbeat")
|
|
41
|
+
});
|
|
42
|
+
var CallMessageSchema = import_zod.z.object({
|
|
43
|
+
type: import_zod.z.literal("call"),
|
|
44
|
+
id: import_zod.z.number(),
|
|
45
|
+
name: import_zod.z.string(),
|
|
46
|
+
args: import_zod.z.looseObject({})
|
|
47
|
+
});
|
|
48
|
+
var PresenceMessageSchema = import_zod.z.object({
|
|
49
|
+
type: import_zod.z.literal("presence"),
|
|
50
|
+
data: import_zod.z.looseObject({})
|
|
51
|
+
});
|
|
52
|
+
var ClientMessageSchema = import_zod.z.discriminatedUnion("type", [
|
|
53
|
+
SubscribeMessageSchema,
|
|
54
|
+
UnsubscribeMessageSchema,
|
|
55
|
+
HeartbeatMessageSchema,
|
|
56
|
+
CallMessageSchema,
|
|
57
|
+
PresenceMessageSchema
|
|
58
|
+
]);
|
|
59
|
+
var ClientMessage = {
|
|
60
|
+
subscribe: (id, name, args) => ({
|
|
61
|
+
type: "subscribe",
|
|
62
|
+
id,
|
|
63
|
+
name,
|
|
64
|
+
args
|
|
65
|
+
}),
|
|
66
|
+
unsubscribe: (id) => ({
|
|
67
|
+
type: "unsubscribe",
|
|
68
|
+
id
|
|
69
|
+
}),
|
|
70
|
+
call: (id, name, args) => ({
|
|
71
|
+
type: "call",
|
|
72
|
+
id,
|
|
73
|
+
name,
|
|
74
|
+
args
|
|
75
|
+
}),
|
|
76
|
+
heartbeat: () => ({
|
|
77
|
+
type: "heartbeat"
|
|
78
|
+
}),
|
|
79
|
+
presence: (data) => ({
|
|
80
|
+
type: "presence",
|
|
81
|
+
data
|
|
82
|
+
})
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// src/client.ts
|
|
86
|
+
function changer(sink, input) {
|
|
87
|
+
return (change) => {
|
|
88
|
+
const i = input.deref();
|
|
89
|
+
if (i) {
|
|
90
|
+
sink.apply(change, i);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
var Client = class {
|
|
95
|
+
constructor(transport, sinks, graph) {
|
|
96
|
+
this.transport = transport;
|
|
97
|
+
this.sinks = sinks;
|
|
98
|
+
this.graph = graph;
|
|
99
|
+
this.nextId = 1;
|
|
100
|
+
this.pendingStreams = /* @__PURE__ */ new Map();
|
|
101
|
+
this.pendingMutations = /* @__PURE__ */ new Map();
|
|
102
|
+
this.activeStreams = /* @__PURE__ */ new Map();
|
|
103
|
+
this.registry = new FinalizationRegistry(
|
|
104
|
+
([id, name]) => {
|
|
105
|
+
console.log(`\u{1F9F9} Stream ${id} (${name}) collected \u2014 unsubscribing`);
|
|
106
|
+
this.sendMessage(ClientMessage.unsubscribe(id));
|
|
107
|
+
this.activeStreams.delete(id);
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
this.transport.onMessage((data) => {
|
|
111
|
+
const message = JSON.parse(data);
|
|
112
|
+
this.handleMessage(message);
|
|
113
|
+
});
|
|
114
|
+
this.resetHeartbeat();
|
|
115
|
+
this.resetInactivity();
|
|
116
|
+
}
|
|
117
|
+
resetHeartbeat() {
|
|
118
|
+
if (this.heartbeatTimeout) {
|
|
119
|
+
clearTimeout(this.heartbeatTimeout);
|
|
120
|
+
}
|
|
121
|
+
this.heartbeatTimeout = setTimeout(() => {
|
|
122
|
+
this.sendMessage(ClientMessage.heartbeat());
|
|
123
|
+
}, 1e4);
|
|
124
|
+
}
|
|
125
|
+
resetInactivity() {
|
|
126
|
+
if (this.inactivityTimeout) {
|
|
127
|
+
clearTimeout(this.inactivityTimeout);
|
|
128
|
+
}
|
|
129
|
+
this.inactivityTimeout = setTimeout(() => {
|
|
130
|
+
this.close();
|
|
131
|
+
}, 3e4);
|
|
132
|
+
}
|
|
133
|
+
handleMessage(message) {
|
|
134
|
+
this.resetInactivity();
|
|
135
|
+
switch (message.type) {
|
|
136
|
+
case "snapshot": {
|
|
137
|
+
console.log(`[Client] Received snapshot for stream ${message.id}`);
|
|
138
|
+
const resolve = this.pendingStreams.get(message.id);
|
|
139
|
+
if (resolve) {
|
|
140
|
+
resolve(message.snapshot);
|
|
141
|
+
this.pendingStreams.delete(message.id);
|
|
142
|
+
}
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
case "delta": {
|
|
146
|
+
const changeCount = Object.keys(message.changes).length;
|
|
147
|
+
console.log(`[Client] Received delta with ${changeCount} changes for streams: ${Object.keys(message.changes).join(", ")}`);
|
|
148
|
+
for (const [idStr, change] of Object.entries(message.changes)) {
|
|
149
|
+
const id = Number(idStr);
|
|
150
|
+
const sink = this.activeStreams.get(id);
|
|
151
|
+
if (sink && change && typeof change === "object") {
|
|
152
|
+
sink(change);
|
|
153
|
+
} else if (!sink) {
|
|
154
|
+
console.log(`\u{1F9F9} Sink ${id} GC'd \u2014 auto-unsubscribing`);
|
|
155
|
+
this.sendMessage(ClientMessage.unsubscribe(id));
|
|
156
|
+
this.activeStreams.delete(id);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
console.log("[Client] Stepping graph");
|
|
160
|
+
this.graph.step();
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
case "result": {
|
|
164
|
+
console.log(`[Client] Received mutation result for call ${message.id}:`, message.success ? "success" : "error");
|
|
165
|
+
const resolve = this.pendingMutations.get(message.id);
|
|
166
|
+
if (resolve) {
|
|
167
|
+
if (message.success) {
|
|
168
|
+
resolve({ success: true, value: message.value });
|
|
169
|
+
} else {
|
|
170
|
+
resolve({
|
|
171
|
+
success: false,
|
|
172
|
+
error: message.error || "Unknown error"
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
this.pendingMutations.delete(message.id);
|
|
176
|
+
}
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
case "heartbeat":
|
|
180
|
+
console.log("[Client] Received heartbeat");
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
sendMessage(message) {
|
|
185
|
+
this.resetHeartbeat();
|
|
186
|
+
this.transport.send(JSON.stringify(message));
|
|
187
|
+
}
|
|
188
|
+
async run(key, args) {
|
|
189
|
+
console.log(
|
|
190
|
+
`Running stream ${String(key)} with args ${JSON.stringify(args)}`
|
|
191
|
+
);
|
|
192
|
+
const id = this.nextId++;
|
|
193
|
+
this.sendMessage(ClientMessage.subscribe(id, String(key), args));
|
|
194
|
+
const snapshot = await new Promise((resolve) => {
|
|
195
|
+
this.pendingStreams.set(id, resolve);
|
|
196
|
+
});
|
|
197
|
+
const endpoint = this.sinks[key];
|
|
198
|
+
const sinkAdapter = endpoint(snapshot);
|
|
199
|
+
const { stream, input } = sinkAdapter.build();
|
|
200
|
+
const inputRef = new WeakRef(input);
|
|
201
|
+
this.activeStreams.set(id, changer(sinkAdapter, inputRef));
|
|
202
|
+
this.registry.register(input, [id, String(key)]);
|
|
203
|
+
return stream;
|
|
204
|
+
}
|
|
205
|
+
async call(key, args) {
|
|
206
|
+
console.log(
|
|
207
|
+
`Calling mutation ${String(key)} with args ${JSON.stringify(args)}`
|
|
208
|
+
);
|
|
209
|
+
const id = this.nextId++;
|
|
210
|
+
this.sendMessage(
|
|
211
|
+
ClientMessage.call(id, String(key), args)
|
|
212
|
+
);
|
|
213
|
+
const result = await new Promise((resolve) => {
|
|
214
|
+
this.pendingMutations.set(
|
|
215
|
+
id,
|
|
216
|
+
resolve
|
|
217
|
+
);
|
|
218
|
+
});
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
close() {
|
|
222
|
+
clearTimeout(this.heartbeatTimeout);
|
|
223
|
+
clearTimeout(this.inactivityTimeout);
|
|
224
|
+
try {
|
|
225
|
+
this.transport.close();
|
|
226
|
+
} catch (e) {
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
setPresence(value) {
|
|
230
|
+
this.sendMessage(ClientMessage.presence(value));
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
// src/messageport-transport.ts
|
|
235
|
+
var MessagePortTransport = class {
|
|
236
|
+
constructor(port) {
|
|
237
|
+
this.port = port;
|
|
238
|
+
}
|
|
239
|
+
send(data) {
|
|
240
|
+
console.log("[MessagePortTransport] Sending:", data.substring(0, 100) + (data.length > 100 ? "..." : ""));
|
|
241
|
+
this.port.postMessage(data);
|
|
242
|
+
}
|
|
243
|
+
onMessage(handler) {
|
|
244
|
+
this.port.onmessage = (event) => {
|
|
245
|
+
console.log("[MessagePortTransport] Received:", event.data.substring(0, 100) + (event.data.length > 100 ? "..." : ""));
|
|
246
|
+
handler(event.data);
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
onClose(handler) {
|
|
250
|
+
this.port.onmessageerror = handler;
|
|
251
|
+
}
|
|
252
|
+
close() {
|
|
253
|
+
this.port.close();
|
|
254
|
+
}
|
|
255
|
+
// MessagePort doesn't provide bufferedAmount
|
|
256
|
+
get bufferedAmount() {
|
|
257
|
+
return void 0;
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
// src/shared-worker-client.ts
|
|
262
|
+
function createSharedWorkerClient(port, sinks, graph) {
|
|
263
|
+
const transport = new MessagePortTransport(port);
|
|
264
|
+
port.start();
|
|
265
|
+
return new Client(transport, sinks, graph);
|
|
266
|
+
}
|
|
267
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
268
|
+
0 && (module.exports = {
|
|
269
|
+
createSharedWorkerClient
|
|
270
|
+
});
|
|
271
|
+
//# sourceMappingURL=shared-worker-client.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared-worker-client.ts","../src/client-message.ts","../src/client.ts","../src/messageport-transport.ts"],"sourcesContent":["import { Graph } from \"derivation\";\nimport { Client } from \"./client.js\";\nimport { MessagePortTransport } from \"./messageport-transport.js\";\nimport { StreamSinks, RPCDefinition } from \"./stream-types.js\";\n\n/**\n * Create a client connected to a SharedWorker.\n *\n * @example\n * ```typescript\n * // main.ts\n * const graph = new Graph();\n * const worker = new SharedWorker('/worker.js');\n *\n * const client = createSharedWorkerClient(worker.port, {\n * streams: {\n * todos: setSink(graph, todoIso),\n * },\n * }, graph);\n *\n * const todos = await client.run('todos', { filter: 'active' });\n * ```\n */\nexport function createSharedWorkerClient<Defs extends RPCDefinition>(\n port: MessagePort,\n sinks: StreamSinks<Defs[\"streams\"]>,\n graph: Graph,\n): Client<Defs> {\n const transport = new MessagePortTransport(port);\n port.start();\n return new Client<Defs>(transport, sinks, graph);\n}\n","import { z } from \"zod\";\n\nexport const SubscribeMessageSchema = z.object({\n type: z.literal(\"subscribe\"),\n id: z.number(),\n name: z.string(),\n args: z.looseObject({}),\n});\nexport type SubscribeMessage = z.infer<typeof SubscribeMessageSchema>;\n\nexport const UnsubscribeMessageSchema = z.object({\n type: z.literal(\"unsubscribe\"),\n id: z.number(),\n});\nexport type UnsubscribeMessage = z.infer<typeof UnsubscribeMessageSchema>;\n\nexport const HeartbeatMessageSchema = z.object({\n type: z.literal(\"heartbeat\"),\n});\nexport type HeartbeatMessage = z.infer<typeof HeartbeatMessageSchema>;\n\nexport const CallMessageSchema = z.object({\n type: z.literal(\"call\"),\n id: z.number(),\n name: z.string(),\n args: z.looseObject({}),\n});\nexport type CallMessage = z.infer<typeof CallMessageSchema>;\n\nexport const PresenceMessageSchema = z.object({\n type: z.literal(\"presence\"),\n data: z.looseObject({}),\n});\nexport type PresenceMessage = z.infer<typeof PresenceMessageSchema>;\n\nexport const ClientMessageSchema = z.discriminatedUnion(\"type\", [\n SubscribeMessageSchema,\n UnsubscribeMessageSchema,\n HeartbeatMessageSchema,\n CallMessageSchema,\n PresenceMessageSchema,\n]);\nexport type ClientMessage = z.infer<typeof ClientMessageSchema>;\n\nexport function parseClientMessage(data: unknown): ClientMessage {\n return ClientMessageSchema.parse(data);\n}\n\nexport const ClientMessage = {\n subscribe: (\n id: number,\n name: string,\n args: object,\n ): SubscribeMessage => ({\n type: \"subscribe\",\n id,\n name,\n args: args as Record<string, unknown>,\n }),\n unsubscribe: (id: number): UnsubscribeMessage => ({\n type: \"unsubscribe\",\n id,\n }),\n call: (\n id: number,\n name: string,\n args: object,\n ): CallMessage => ({\n type: \"call\",\n id,\n name,\n args: args as Record<string, unknown>,\n }),\n heartbeat: (): HeartbeatMessage => ({\n type: \"heartbeat\",\n }),\n presence: (data: object): PresenceMessage => ({\n type: \"presence\",\n data: data as Record<string, unknown>,\n }),\n};\n","import { ClientMessage } from \"./client-message.js\";\nimport { ServerMessage } from \"./server-message.js\";\nimport type { Graph } from \"derivation\";\nimport type {\n Sink,\n StreamSinks,\n RPCDefinition,\n MutationResult,\n} from \"./stream-types.js\";\nimport { Transport } from \"./transport.js\";\n\nfunction changer<T extends object, I extends object>(\n sink: Sink<T, I>,\n input: WeakRef<I>,\n): (change: object) => void {\n return (change) => {\n const i = input.deref();\n if (i) {\n sink.apply(change, i);\n }\n };\n}\n\nexport class Client<Defs extends RPCDefinition> {\n private nextId = 1;\n private pendingStreams = new Map<number, (snapshot: object) => void>();\n private pendingMutations = new Map<\n number,\n (result: MutationResult<unknown>) => void\n >();\n private activeStreams = new Map<number, (change: object) => void>();\n private heartbeatTimeout: NodeJS.Timeout | undefined;\n private inactivityTimeout: NodeJS.Timeout | undefined;\n\n private registry = new FinalizationRegistry<[number, string]>(\n ([id, name]) => {\n console.log(`🧹 Stream ${id} (${name}) collected — unsubscribing`);\n this.sendMessage(ClientMessage.unsubscribe(id));\n this.activeStreams.delete(id);\n },\n );\n\n private resetHeartbeat() {\n if (this.heartbeatTimeout) {\n clearTimeout(this.heartbeatTimeout);\n }\n\n this.heartbeatTimeout = setTimeout(() => {\n this.sendMessage(ClientMessage.heartbeat());\n }, 10_000);\n }\n\n private resetInactivity() {\n if (this.inactivityTimeout) {\n clearTimeout(this.inactivityTimeout);\n }\n\n this.inactivityTimeout = setTimeout(() => {\n this.close();\n }, 30_000);\n }\n\n constructor(\n private transport: Transport,\n private sinks: StreamSinks<Defs[\"streams\"]>,\n private graph: Graph,\n ) {\n this.transport.onMessage((data: string) => {\n const message = JSON.parse(data) as ServerMessage;\n this.handleMessage(message);\n });\n this.resetHeartbeat();\n this.resetInactivity();\n }\n\n private handleMessage(message: ServerMessage) {\n this.resetInactivity();\n\n switch (message.type) {\n case \"snapshot\": {\n console.log(`[Client] Received snapshot for stream ${message.id}`);\n const resolve = this.pendingStreams.get(message.id);\n if (resolve) {\n resolve(message.snapshot as object);\n this.pendingStreams.delete(message.id);\n }\n break;\n }\n case \"delta\": {\n const changeCount = Object.keys(message.changes).length;\n console.log(`[Client] Received delta with ${changeCount} changes for streams: ${Object.keys(message.changes).join(\", \")}`);\n for (const [idStr, change] of Object.entries(message.changes)) {\n const id = Number(idStr);\n const sink = this.activeStreams.get(id);\n\n if (sink && change && typeof change === \"object\") {\n sink(change);\n } else if (!sink) {\n console.log(`🧹 Sink ${id} GC'd — auto-unsubscribing`);\n this.sendMessage(ClientMessage.unsubscribe(id));\n this.activeStreams.delete(id);\n }\n }\n console.log(\"[Client] Stepping graph\");\n this.graph.step();\n break;\n }\n case \"result\": {\n console.log(`[Client] Received mutation result for call ${message.id}:`, message.success ? \"success\" : \"error\");\n const resolve = this.pendingMutations.get(message.id);\n if (resolve) {\n if (message.success) {\n resolve({ success: true, value: message.value });\n } else {\n resolve({\n success: false,\n error: message.error || \"Unknown error\",\n });\n }\n this.pendingMutations.delete(message.id);\n }\n break;\n }\n case \"heartbeat\":\n console.log(\"[Client] Received heartbeat\");\n break;\n }\n }\n\n private sendMessage(message: ClientMessage) {\n this.resetHeartbeat();\n this.transport.send(JSON.stringify(message));\n }\n\n async run<Key extends keyof Defs[\"streams\"]>(\n key: Key,\n args: Defs[\"streams\"][Key][\"args\"],\n ): Promise<Defs[\"streams\"][Key][\"returnType\"]> {\n console.log(\n `Running stream ${String(key)} with args ${JSON.stringify(args)}`,\n );\n const id = this.nextId++;\n\n this.sendMessage(ClientMessage.subscribe(id, String(key), args));\n\n const snapshot = await new Promise<object>((resolve) => {\n this.pendingStreams.set(id, resolve);\n });\n\n const endpoint = this.sinks[key];\n const sinkAdapter = endpoint(snapshot);\n const { stream, input } = sinkAdapter.build();\n const inputRef = new WeakRef(input);\n this.activeStreams.set(id, changer(sinkAdapter, inputRef));\n this.registry.register(input, [id, String(key)]);\n\n return stream;\n }\n\n async call<Key extends keyof Defs[\"mutations\"]>(\n key: Key,\n args: Defs[\"mutations\"][Key][\"args\"],\n ): Promise<MutationResult<Defs[\"mutations\"][Key][\"result\"]>> {\n console.log(\n `Calling mutation ${String(key)} with args ${JSON.stringify(args)}`,\n );\n const id = this.nextId++;\n\n this.sendMessage(\n ClientMessage.call(id, String(key), args as Record<string, unknown>),\n );\n\n const result = await new Promise<\n MutationResult<Defs[\"mutations\"][Key][\"result\"]>\n >((resolve) => {\n this.pendingMutations.set(\n id,\n resolve as (result: MutationResult<unknown>) => void,\n );\n });\n\n return result;\n }\n\n close() {\n clearTimeout(this.heartbeatTimeout);\n clearTimeout(this.inactivityTimeout);\n try {\n this.transport.close();\n } catch {}\n }\n\n setPresence(value: Record<string, unknown>): void {\n this.sendMessage(ClientMessage.presence(value));\n }\n}\n","import { Transport } from \"./transport.js\";\n\n/**\n * Transport implementation for MessagePort (SharedWorker communication).\n */\nexport class MessagePortTransport implements Transport {\n constructor(private port: MessagePort) {}\n\n send(data: string): void {\n console.log(\"[MessagePortTransport] Sending:\", data.substring(0, 100) + (data.length > 100 ? \"...\" : \"\"));\n this.port.postMessage(data);\n }\n\n onMessage(handler: (data: string) => void): void {\n this.port.onmessage = (event: MessageEvent) => {\n console.log(\"[MessagePortTransport] Received:\", event.data.substring(0, 100) + (event.data.length > 100 ? \"...\" : \"\"));\n handler(event.data);\n };\n }\n\n onClose(handler: () => void): void {\n // MessagePort doesn't have a reliable close event\n // We'll use messageerror as a signal, though it's not perfect\n this.port.onmessageerror = handler;\n }\n\n close(): void {\n this.port.close();\n }\n\n // MessagePort doesn't provide bufferedAmount\n get bufferedAmount(): undefined {\n return undefined;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Graph } from 'derivation';
|
|
2
|
+
import { C as Client } from './client-DJZfuakf.cjs';
|
|
3
|
+
import { R as RPCDefinition, h as StreamSinks } from './stream-types-Q_EqNLtO.cjs';
|
|
4
|
+
import './transport.cjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Create a client connected to a SharedWorker.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* // main.ts
|
|
12
|
+
* const graph = new Graph();
|
|
13
|
+
* const worker = new SharedWorker('/worker.js');
|
|
14
|
+
*
|
|
15
|
+
* const client = createSharedWorkerClient(worker.port, {
|
|
16
|
+
* streams: {
|
|
17
|
+
* todos: setSink(graph, todoIso),
|
|
18
|
+
* },
|
|
19
|
+
* }, graph);
|
|
20
|
+
*
|
|
21
|
+
* const todos = await client.run('todos', { filter: 'active' });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
declare function createSharedWorkerClient<Defs extends RPCDefinition>(port: MessagePort, sinks: StreamSinks<Defs["streams"]>, graph: Graph): Client<Defs>;
|
|
25
|
+
|
|
26
|
+
export { createSharedWorkerClient };
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { Graph } from
|
|
2
|
-
import { Client } from
|
|
3
|
-
import {
|
|
1
|
+
import { Graph } from 'derivation';
|
|
2
|
+
import { C as Client } from './client-TPsVZH_B.js';
|
|
3
|
+
import { R as RPCDefinition, h as StreamSinks } from './stream-types-Q_EqNLtO.js';
|
|
4
|
+
import './transport.js';
|
|
5
|
+
|
|
4
6
|
/**
|
|
5
7
|
* Create a client connected to a SharedWorker.
|
|
6
8
|
*
|
|
@@ -19,4 +21,6 @@ import { StreamSinks, RPCDefinition } from "./stream-types.js";
|
|
|
19
21
|
* const todos = await client.run('todos', { filter: 'active' });
|
|
20
22
|
* ```
|
|
21
23
|
*/
|
|
22
|
-
|
|
24
|
+
declare function createSharedWorkerClient<Defs extends RPCDefinition>(port: MessagePort, sinks: StreamSinks<Defs["streams"]>, graph: Graph): Client<Defs>;
|
|
25
|
+
|
|
26
|
+
export { createSharedWorkerClient };
|