@derivation/rpc 0.3.5 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/client-DJZfuakf.d.cts +27 -0
  2. package/dist/{client.d.ts → client-TPsVZH_B.d.ts} +7 -4
  3. package/dist/index.cjs +335 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +55 -0
  6. package/dist/index.d.ts +55 -7
  7. package/dist/index.js +306 -6
  8. package/dist/index.js.map +1 -0
  9. package/dist/iso.cjs +151 -0
  10. package/dist/iso.cjs.map +1 -0
  11. package/dist/iso.d.cts +52 -0
  12. package/dist/iso.d.ts +35 -19
  13. package/dist/iso.js +99 -101
  14. package/dist/iso.js.map +1 -0
  15. package/dist/{presence-manager.d.ts → presence-manager-4LlEyuGp.d.cts} +3 -1
  16. package/dist/presence-manager-4LlEyuGp.d.ts +7 -0
  17. package/dist/shared-worker-client.cjs +271 -0
  18. package/dist/shared-worker-client.cjs.map +1 -0
  19. package/dist/shared-worker-client.d.cts +26 -0
  20. package/dist/shared-worker-client.d.ts +8 -4
  21. package/dist/shared-worker-client.js +243 -24
  22. package/dist/shared-worker-client.js.map +1 -0
  23. package/dist/shared-worker-server.cjs +363 -0
  24. package/dist/shared-worker-server.cjs.map +1 -0
  25. package/dist/shared-worker-server.d.cts +31 -0
  26. package/dist/shared-worker-server.d.ts +9 -6
  27. package/dist/shared-worker-server.js +332 -58
  28. package/dist/shared-worker-server.js.map +1 -0
  29. package/dist/stream-types-Q_EqNLtO.d.cts +46 -0
  30. package/dist/stream-types-Q_EqNLtO.d.ts +46 -0
  31. package/dist/transport.cjs +19 -0
  32. package/dist/transport.cjs.map +1 -0
  33. package/dist/transport.d.cts +29 -0
  34. package/dist/transport.d.ts +3 -1
  35. package/dist/transport.js +1 -1
  36. package/dist/transport.js.map +1 -0
  37. package/dist/web-socket-server.cjs +469 -0
  38. package/dist/web-socket-server.cjs.map +1 -0
  39. package/dist/web-socket-server.d.cts +14 -0
  40. package/dist/web-socket-server.d.ts +10 -7
  41. package/dist/web-socket-server.js +437 -52
  42. package/dist/web-socket-server.js.map +1 -0
  43. package/dist/web-socket-transport.cjs +52 -0
  44. package/dist/web-socket-transport.cjs.map +1 -0
  45. package/dist/web-socket-transport.d.cts +16 -0
  46. package/dist/web-socket-transport.d.ts +5 -2
  47. package/dist/web-socket-transport.js +27 -25
  48. package/dist/web-socket-transport.js.map +1 -0
  49. package/package.json +24 -15
  50. package/dist/client-handler.d.ts +0 -27
  51. package/dist/client-handler.js +0 -187
  52. package/dist/client-message.d.ts +0 -57
  53. package/dist/client-message.js +0 -59
  54. package/dist/client.js +0 -133
  55. package/dist/messageport-transport.d.ts +0 -13
  56. package/dist/messageport-transport.js +0 -28
  57. package/dist/node-web-socket-transport.d.ts +0 -16
  58. package/dist/node-web-socket-transport.js +0 -33
  59. package/dist/presence-manager.js +0 -1
  60. package/dist/queue.d.ts +0 -9
  61. package/dist/queue.js +0 -32
  62. package/dist/rate-limiter.d.ts +0 -7
  63. package/dist/rate-limiter.js +0 -24
  64. package/dist/reactive-map-adapter.d.ts +0 -24
  65. package/dist/reactive-map-adapter.js +0 -43
  66. package/dist/reactive-set-adapter.d.ts +0 -24
  67. package/dist/reactive-set-adapter.js +0 -41
  68. package/dist/server-message.d.ts +0 -48
  69. package/dist/server-message.js +0 -52
  70. package/dist/shared-worker-client-handler.d.ts +0 -27
  71. package/dist/shared-worker-client-handler.js +0 -149
  72. package/dist/stream-adapter.d.ts +0 -23
  73. package/dist/stream-adapter.js +0 -35
  74. package/dist/stream-types.d.ts +0 -44
  75. package/dist/stream-types.js +0 -1
  76. package/dist/tests/context.test.d.ts +0 -1
  77. package/dist/tests/context.test.js +0 -252
  78. package/dist/tests/iso.test.d.ts +0 -1
  79. package/dist/tests/iso.test.js +0 -186
  80. package/dist/tests/messages.test.d.ts +0 -1
  81. package/dist/tests/messages.test.js +0 -152
  82. package/dist/tests/mutations.test.d.ts +0 -1
  83. package/dist/tests/mutations.test.js +0 -122
  84. package/dist/tests/queue.test.d.ts +0 -1
  85. package/dist/tests/queue.test.js +0 -84
  86. package/dist/tests/reactive-map-adapter.test.d.ts +0 -1
  87. package/dist/tests/reactive-map-adapter.test.js +0 -190
  88. package/dist/tests/reactive-set-adapter.test.d.ts +0 -1
  89. package/dist/tests/reactive-set-adapter.test.js +0 -157
  90. package/dist/tests/stream-adapter.test.d.ts +0 -1
  91. package/dist/tests/stream-adapter.test.js +0 -119
  92. package/dist/tests/weak-list.test.d.ts +0 -1
  93. package/dist/tests/weak-list.test.js +0 -100
  94. package/dist/tsconfig.tsbuildinfo +0 -1
  95. package/dist/weak-list.d.ts +0 -5
  96. package/dist/weak-list.js +0 -19
@@ -0,0 +1,27 @@
1
+ import { Graph } from 'derivation';
2
+ import { R as RPCDefinition, h as StreamSinks, d as MutationResult } from './stream-types-Q_EqNLtO.cjs';
3
+ import { Transport } from './transport.cjs';
4
+
5
+ declare class Client<Defs extends RPCDefinition> {
6
+ private transport;
7
+ private sinks;
8
+ private graph;
9
+ private nextId;
10
+ private pendingStreams;
11
+ private pendingMutations;
12
+ private activeStreams;
13
+ private heartbeatTimeout;
14
+ private inactivityTimeout;
15
+ private registry;
16
+ private resetHeartbeat;
17
+ private resetInactivity;
18
+ constructor(transport: Transport, sinks: StreamSinks<Defs["streams"]>, graph: Graph);
19
+ private handleMessage;
20
+ private sendMessage;
21
+ run<Key extends keyof Defs["streams"]>(key: Key, args: Defs["streams"][Key]["args"]): Promise<Defs["streams"][Key]["returnType"]>;
22
+ call<Key extends keyof Defs["mutations"]>(key: Key, args: Defs["mutations"][Key]["args"]): Promise<MutationResult<Defs["mutations"][Key]["result"]>>;
23
+ close(): void;
24
+ setPresence(value: Record<string, unknown>): void;
25
+ }
26
+
27
+ export { Client as C };
@@ -1,7 +1,8 @@
1
- import type { Graph } from "derivation";
2
- import type { StreamSinks, RPCDefinition, MutationResult } from "./stream-types.js";
3
- import { Transport } from "./transport.js";
4
- export declare class Client<Defs extends RPCDefinition> {
1
+ import { Graph } from 'derivation';
2
+ import { R as RPCDefinition, h as StreamSinks, d as MutationResult } from './stream-types-Q_EqNLtO.js';
3
+ import { Transport } from './transport.js';
4
+
5
+ declare class Client<Defs extends RPCDefinition> {
5
6
  private transport;
6
7
  private sinks;
7
8
  private graph;
@@ -22,3 +23,5 @@ export declare class Client<Defs extends RPCDefinition> {
22
23
  close(): void;
23
24
  setPresence(value: Record<string, unknown>): void;
24
25
  }
26
+
27
+ export { Client as C };
package/dist/index.cjs ADDED
@@ -0,0 +1,335 @@
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/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ Client: () => Client,
24
+ ReactiveSinkAdapter: () => ReactiveSinkAdapter,
25
+ ReactiveSourceAdapter: () => ReactiveSourceAdapter,
26
+ StreamSinkAdapter: () => StreamSinkAdapter,
27
+ StreamSourceAdapter: () => StreamSourceAdapter,
28
+ reactiveSink: () => sink,
29
+ streamSink: () => sink2
30
+ });
31
+ module.exports = __toCommonJS(src_exports);
32
+
33
+ // src/client-message.ts
34
+ var import_zod = require("zod");
35
+ var SubscribeMessageSchema = import_zod.z.object({
36
+ type: import_zod.z.literal("subscribe"),
37
+ id: import_zod.z.number(),
38
+ name: import_zod.z.string(),
39
+ args: import_zod.z.looseObject({})
40
+ });
41
+ var UnsubscribeMessageSchema = import_zod.z.object({
42
+ type: import_zod.z.literal("unsubscribe"),
43
+ id: import_zod.z.number()
44
+ });
45
+ var HeartbeatMessageSchema = import_zod.z.object({
46
+ type: import_zod.z.literal("heartbeat")
47
+ });
48
+ var CallMessageSchema = import_zod.z.object({
49
+ type: import_zod.z.literal("call"),
50
+ id: import_zod.z.number(),
51
+ name: import_zod.z.string(),
52
+ args: import_zod.z.looseObject({})
53
+ });
54
+ var PresenceMessageSchema = import_zod.z.object({
55
+ type: import_zod.z.literal("presence"),
56
+ data: import_zod.z.looseObject({})
57
+ });
58
+ var ClientMessageSchema = import_zod.z.discriminatedUnion("type", [
59
+ SubscribeMessageSchema,
60
+ UnsubscribeMessageSchema,
61
+ HeartbeatMessageSchema,
62
+ CallMessageSchema,
63
+ PresenceMessageSchema
64
+ ]);
65
+ var ClientMessage = {
66
+ subscribe: (id, name, args) => ({
67
+ type: "subscribe",
68
+ id,
69
+ name,
70
+ args
71
+ }),
72
+ unsubscribe: (id) => ({
73
+ type: "unsubscribe",
74
+ id
75
+ }),
76
+ call: (id, name, args) => ({
77
+ type: "call",
78
+ id,
79
+ name,
80
+ args
81
+ }),
82
+ heartbeat: () => ({
83
+ type: "heartbeat"
84
+ }),
85
+ presence: (data) => ({
86
+ type: "presence",
87
+ data
88
+ })
89
+ };
90
+
91
+ // src/client.ts
92
+ function changer(sink3, input) {
93
+ return (change) => {
94
+ const i = input.deref();
95
+ if (i) {
96
+ sink3.apply(change, i);
97
+ }
98
+ };
99
+ }
100
+ var Client = class {
101
+ constructor(transport, sinks, graph) {
102
+ this.transport = transport;
103
+ this.sinks = sinks;
104
+ this.graph = graph;
105
+ this.nextId = 1;
106
+ this.pendingStreams = /* @__PURE__ */ new Map();
107
+ this.pendingMutations = /* @__PURE__ */ new Map();
108
+ this.activeStreams = /* @__PURE__ */ new Map();
109
+ this.registry = new FinalizationRegistry(
110
+ ([id, name]) => {
111
+ console.log(`\u{1F9F9} Stream ${id} (${name}) collected \u2014 unsubscribing`);
112
+ this.sendMessage(ClientMessage.unsubscribe(id));
113
+ this.activeStreams.delete(id);
114
+ }
115
+ );
116
+ this.transport.onMessage((data) => {
117
+ const message = JSON.parse(data);
118
+ this.handleMessage(message);
119
+ });
120
+ this.resetHeartbeat();
121
+ this.resetInactivity();
122
+ }
123
+ resetHeartbeat() {
124
+ if (this.heartbeatTimeout) {
125
+ clearTimeout(this.heartbeatTimeout);
126
+ }
127
+ this.heartbeatTimeout = setTimeout(() => {
128
+ this.sendMessage(ClientMessage.heartbeat());
129
+ }, 1e4);
130
+ }
131
+ resetInactivity() {
132
+ if (this.inactivityTimeout) {
133
+ clearTimeout(this.inactivityTimeout);
134
+ }
135
+ this.inactivityTimeout = setTimeout(() => {
136
+ this.close();
137
+ }, 3e4);
138
+ }
139
+ handleMessage(message) {
140
+ this.resetInactivity();
141
+ switch (message.type) {
142
+ case "snapshot": {
143
+ console.log(`[Client] Received snapshot for stream ${message.id}`);
144
+ const resolve = this.pendingStreams.get(message.id);
145
+ if (resolve) {
146
+ resolve(message.snapshot);
147
+ this.pendingStreams.delete(message.id);
148
+ }
149
+ break;
150
+ }
151
+ case "delta": {
152
+ const changeCount = Object.keys(message.changes).length;
153
+ console.log(`[Client] Received delta with ${changeCount} changes for streams: ${Object.keys(message.changes).join(", ")}`);
154
+ for (const [idStr, change] of Object.entries(message.changes)) {
155
+ const id = Number(idStr);
156
+ const sink3 = this.activeStreams.get(id);
157
+ if (sink3 && change && typeof change === "object") {
158
+ sink3(change);
159
+ } else if (!sink3) {
160
+ console.log(`\u{1F9F9} Sink ${id} GC'd \u2014 auto-unsubscribing`);
161
+ this.sendMessage(ClientMessage.unsubscribe(id));
162
+ this.activeStreams.delete(id);
163
+ }
164
+ }
165
+ console.log("[Client] Stepping graph");
166
+ this.graph.step();
167
+ break;
168
+ }
169
+ case "result": {
170
+ console.log(`[Client] Received mutation result for call ${message.id}:`, message.success ? "success" : "error");
171
+ const resolve = this.pendingMutations.get(message.id);
172
+ if (resolve) {
173
+ if (message.success) {
174
+ resolve({ success: true, value: message.value });
175
+ } else {
176
+ resolve({
177
+ success: false,
178
+ error: message.error || "Unknown error"
179
+ });
180
+ }
181
+ this.pendingMutations.delete(message.id);
182
+ }
183
+ break;
184
+ }
185
+ case "heartbeat":
186
+ console.log("[Client] Received heartbeat");
187
+ break;
188
+ }
189
+ }
190
+ sendMessage(message) {
191
+ this.resetHeartbeat();
192
+ this.transport.send(JSON.stringify(message));
193
+ }
194
+ async run(key, args) {
195
+ console.log(
196
+ `Running stream ${String(key)} with args ${JSON.stringify(args)}`
197
+ );
198
+ const id = this.nextId++;
199
+ this.sendMessage(ClientMessage.subscribe(id, String(key), args));
200
+ const snapshot = await new Promise((resolve) => {
201
+ this.pendingStreams.set(id, resolve);
202
+ });
203
+ const endpoint = this.sinks[key];
204
+ const sinkAdapter = endpoint(snapshot);
205
+ const { stream, input } = sinkAdapter.build();
206
+ const inputRef = new WeakRef(input);
207
+ this.activeStreams.set(id, changer(sinkAdapter, inputRef));
208
+ this.registry.register(input, [id, String(key)]);
209
+ return stream;
210
+ }
211
+ async call(key, args) {
212
+ console.log(
213
+ `Calling mutation ${String(key)} with args ${JSON.stringify(args)}`
214
+ );
215
+ const id = this.nextId++;
216
+ this.sendMessage(
217
+ ClientMessage.call(id, String(key), args)
218
+ );
219
+ const result = await new Promise((resolve) => {
220
+ this.pendingMutations.set(
221
+ id,
222
+ resolve
223
+ );
224
+ });
225
+ return result;
226
+ }
227
+ close() {
228
+ clearTimeout(this.heartbeatTimeout);
229
+ clearTimeout(this.inactivityTimeout);
230
+ try {
231
+ this.transport.close();
232
+ } catch (e) {
233
+ }
234
+ }
235
+ setPresence(value) {
236
+ this.sendMessage(ClientMessage.presence(value));
237
+ }
238
+ };
239
+
240
+ // src/reactive-adapter.ts
241
+ var import_composable = require("@derivation/composable");
242
+ var ReactiveSourceAdapter = class {
243
+ constructor(stream, snapshotIso, changeIso) {
244
+ this.stream = stream;
245
+ this.snapshotIso = snapshotIso;
246
+ this.changeIso = changeIso;
247
+ }
248
+ get Snapshot() {
249
+ return this.snapshotIso.to(this.stream.snapshot);
250
+ }
251
+ get LastChange() {
252
+ const change = this.stream.changes.value;
253
+ if ((0, import_composable.asBase)(this.stream.operations).isEmpty(change)) return null;
254
+ return this.changeIso.to(change);
255
+ }
256
+ get Stream() {
257
+ return this.stream;
258
+ }
259
+ };
260
+ var ReactiveSinkAdapter = class {
261
+ constructor(graph, snapshotIso, changeIso, ops, snapshot) {
262
+ this.graph = graph;
263
+ this.changeIso = changeIso;
264
+ this.ops = ops;
265
+ this.initialValue = snapshotIso.from(snapshot);
266
+ }
267
+ apply(change, input) {
268
+ input.push(this.changeIso.from(change));
269
+ }
270
+ build() {
271
+ const ops = this.ops;
272
+ const input = new import_composable.ChangeInput(this.graph, ops);
273
+ const stream = import_composable.Reactive.create(this.graph, ops, input, this.initialValue);
274
+ return { stream, input };
275
+ }
276
+ };
277
+ function sink(graph, snapshotIso, changeIso, ops) {
278
+ return (snapshot) => {
279
+ return new ReactiveSinkAdapter(
280
+ graph,
281
+ snapshotIso,
282
+ changeIso,
283
+ ops,
284
+ snapshot
285
+ );
286
+ };
287
+ }
288
+
289
+ // src/stream-adapter.ts
290
+ var import_derivation = require("derivation");
291
+ var StreamSourceAdapter = class {
292
+ constructor(stream, iso) {
293
+ this.stream = stream;
294
+ this.iso = iso;
295
+ }
296
+ get Snapshot() {
297
+ return this.iso.to(this.stream.value);
298
+ }
299
+ get LastChange() {
300
+ return this.iso.to(this.stream.value);
301
+ }
302
+ get Stream() {
303
+ return this.stream;
304
+ }
305
+ };
306
+ var StreamSinkAdapter = class {
307
+ constructor(graph, iso, snapshot) {
308
+ this.graph = graph;
309
+ this.iso = iso;
310
+ this.initialValue = iso.from(snapshot);
311
+ }
312
+ apply(change, input) {
313
+ input.push(this.iso.from(change));
314
+ }
315
+ build() {
316
+ const stream = (0, import_derivation.inputValue)(this.graph, this.initialValue);
317
+ return { stream, input: stream };
318
+ }
319
+ };
320
+ function sink2(graph, iso) {
321
+ return (snapshot) => {
322
+ return new StreamSinkAdapter(graph, iso, snapshot);
323
+ };
324
+ }
325
+ // Annotate the CommonJS export names for ESM import in node:
326
+ 0 && (module.exports = {
327
+ Client,
328
+ ReactiveSinkAdapter,
329
+ ReactiveSourceAdapter,
330
+ StreamSinkAdapter,
331
+ StreamSourceAdapter,
332
+ reactiveSink,
333
+ streamSink
334
+ });
335
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/client-message.ts","../src/client.ts","../src/reactive-adapter.ts","../src/stream-adapter.ts"],"sourcesContent":["// Main index only exports isomorphic code that works in both browser and Node.js\nexport * from \"./client.js\";\nexport * from \"./stream-types.js\";\nexport {\n ReactiveSourceAdapter,\n ReactiveSinkAdapter,\n sink as reactiveSink,\n} from \"./reactive-adapter.js\";\nexport {\n StreamSourceAdapter,\n StreamSinkAdapter,\n sink as streamSink,\n} from \"./stream-adapter.js\";\nexport type { Transport } from \"./transport.js\";\nexport type { PresenceHandler } from \"./presence-manager.js\";\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 { Graph } from \"derivation\";\nimport {\n Reactive,\n ChangeInput,\n Changes,\n OperationsBase,\n Operations,\n asBase,\n} from \"@derivation/composable\";\nimport { Source, Sink } from \"./stream-types.js\";\nimport { Iso } from \"./iso.js\";\n\nexport class ReactiveSourceAdapter<T> implements Source<Reactive<T>> {\n constructor(\n private readonly stream: Reactive<T>,\n private readonly snapshotIso: Iso<T, object>,\n private readonly changeIso: Iso<Changes<T>, object>,\n ) {}\n\n get Snapshot(): object {\n return this.snapshotIso.to(this.stream.snapshot);\n }\n\n get LastChange(): object | null {\n const change = this.stream.changes.value;\n if (asBase(this.stream.operations).isEmpty(change)) return null;\n return this.changeIso.to(change);\n }\n\n get Stream(): Reactive<T> {\n return this.stream;\n }\n}\n\nexport class ReactiveSinkAdapter<T>\n implements Sink<Reactive<T>, ChangeInput<T>>\n{\n private readonly initialValue: T;\n\n constructor(\n private readonly graph: Graph,\n snapshotIso: Iso<T, object>,\n private readonly changeIso: Iso<Changes<T>, object>,\n private readonly ops: Operations<T>,\n snapshot: object,\n ) {\n this.initialValue = snapshotIso.from(snapshot);\n }\n\n apply(change: object, input: ChangeInput<T>): void {\n input.push(this.changeIso.from(change));\n }\n\n build(): { stream: Reactive<T>; input: ChangeInput<T> } {\n const ops = this.ops;\n const input = new ChangeInput<T>(this.graph, ops);\n const stream = Reactive.create(this.graph, ops, input, this.initialValue);\n return { stream, input };\n }\n}\n\nexport function sink<T>(\n graph: Graph,\n snapshotIso: Iso<T, object>,\n changeIso: Iso<Changes<T>, object>,\n ops: Operations<T>,\n): (snapshot: object) => Sink<Reactive<T>, ChangeInput<T>> {\n return (snapshot: object) => {\n return new ReactiveSinkAdapter<T>(\n graph,\n snapshotIso,\n changeIso,\n ops,\n snapshot,\n );\n };\n}\n","import { Graph, ReactiveValue, Input, inputValue } from \"derivation\";\nimport { Source, Sink } from \"./stream-types.js\";\nimport { Iso } from \"./iso.js\";\n\nexport class StreamSourceAdapter<T extends object> implements Source<ReactiveValue<T>> {\n private readonly iso: Iso<T, object>;\n\n constructor(private readonly stream: ReactiveValue<T>, iso: Iso<T, object>) {\n this.iso = iso;\n }\n\n get Snapshot(): object {\n return this.iso.to(this.stream.value);\n }\n\n get LastChange(): object | null {\n return this.iso.to(this.stream.value);\n }\n\n get Stream(): ReactiveValue<T> {\n return this.stream;\n }\n}\n\nexport class StreamSinkAdapter<T extends object> implements Sink<Input<T>, Input<T>> {\n private readonly graph: Graph;\n private readonly iso: Iso<T, object>;\n private readonly initialValue: T;\n\n constructor(graph: Graph, iso: Iso<T, object>, snapshot: object) {\n this.graph = graph;\n this.iso = iso;\n this.initialValue = iso.from(snapshot);\n }\n\n apply(change: object, input: Input<T>): void {\n input.push(this.iso.from(change));\n }\n\n build(): { stream: Input<T>; input: Input<T> } {\n const stream = inputValue(this.graph, this.initialValue);\n return { stream, input: stream };\n }\n}\n\nexport function sink<T extends object>(graph: Graph, iso: Iso<T, object>): (snapshot: object) => Sink<Input<T>, Input<T>> {\n return (snapshot: object) => {\n return new StreamSinkAdapter<T>(graph, iso, snapshot);\n };\n}\n"],"mappings":"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","names":["sink","sink","sink"]}
@@ -0,0 +1,55 @@
1
+ export { C as Client } from './client-DJZfuakf.cjs';
2
+ import { S as Sink, a as Source } from './stream-types-Q_EqNLtO.cjs';
3
+ export { M as MutationDefinition, b as MutationDefinitions, c as MutationEndpoints, d as MutationResult, R as RPCDefinition, e as StreamDefinition, f as StreamDefinitions, g as StreamEndpoints, h as StreamSinks } from './stream-types-Q_EqNLtO.cjs';
4
+ import { Graph, Input, ReactiveValue } from 'derivation';
5
+ import { Reactive, ChangeInput, Changes, Operations } from '@derivation/composable';
6
+ import { Iso } from './iso.cjs';
7
+ export { Transport } from './transport.cjs';
8
+ export { P as PresenceHandler } from './presence-manager-4LlEyuGp.cjs';
9
+ import 'immutable';
10
+
11
+ declare class ReactiveSourceAdapter<T> implements Source<Reactive<T>> {
12
+ private readonly stream;
13
+ private readonly snapshotIso;
14
+ private readonly changeIso;
15
+ constructor(stream: Reactive<T>, snapshotIso: Iso<T, object>, changeIso: Iso<Changes<T>, object>);
16
+ get Snapshot(): object;
17
+ get LastChange(): object | null;
18
+ get Stream(): Reactive<T>;
19
+ }
20
+ declare class ReactiveSinkAdapter<T> implements Sink<Reactive<T>, ChangeInput<T>> {
21
+ private readonly graph;
22
+ private readonly changeIso;
23
+ private readonly ops;
24
+ private readonly initialValue;
25
+ constructor(graph: Graph, snapshotIso: Iso<T, object>, changeIso: Iso<Changes<T>, object>, ops: Operations<T>, snapshot: object);
26
+ apply(change: object, input: ChangeInput<T>): void;
27
+ build(): {
28
+ stream: Reactive<T>;
29
+ input: ChangeInput<T>;
30
+ };
31
+ }
32
+ declare function sink$1<T>(graph: Graph, snapshotIso: Iso<T, object>, changeIso: Iso<Changes<T>, object>, ops: Operations<T>): (snapshot: object) => Sink<Reactive<T>, ChangeInput<T>>;
33
+
34
+ declare class StreamSourceAdapter<T extends object> implements Source<ReactiveValue<T>> {
35
+ private readonly stream;
36
+ private readonly iso;
37
+ constructor(stream: ReactiveValue<T>, iso: Iso<T, object>);
38
+ get Snapshot(): object;
39
+ get LastChange(): object | null;
40
+ get Stream(): ReactiveValue<T>;
41
+ }
42
+ declare class StreamSinkAdapter<T extends object> implements Sink<Input<T>, Input<T>> {
43
+ private readonly graph;
44
+ private readonly iso;
45
+ private readonly initialValue;
46
+ constructor(graph: Graph, iso: Iso<T, object>, snapshot: object);
47
+ apply(change: object, input: Input<T>): void;
48
+ build(): {
49
+ stream: Input<T>;
50
+ input: Input<T>;
51
+ };
52
+ }
53
+ declare function sink<T extends object>(graph: Graph, iso: Iso<T, object>): (snapshot: object) => Sink<Input<T>, Input<T>>;
54
+
55
+ export { ReactiveSinkAdapter, ReactiveSourceAdapter, Sink, Source, StreamSinkAdapter, StreamSourceAdapter, sink$1 as reactiveSink, sink as streamSink };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,55 @@
1
- export * from "./client.js";
2
- export * from "./stream-types.js";
3
- export { ReactiveSetSourceAdapter, ReactiveSetSinkAdapter, sink as setSink, } from "./reactive-set-adapter.js";
4
- export { ReactiveMapSourceAdapter, ReactiveMapSinkAdapter, sink as mapSink, } from "./reactive-map-adapter.js";
5
- export { StreamSourceAdapter, StreamSinkAdapter, sink as streamSink, } from "./stream-adapter.js";
6
- export type { Transport } from "./transport.js";
7
- export type { PresenceHandler } from "./presence-manager.js";
1
+ export { C as Client } from './client-TPsVZH_B.js';
2
+ import { S as Sink, a as Source } from './stream-types-Q_EqNLtO.js';
3
+ export { M as MutationDefinition, b as MutationDefinitions, c as MutationEndpoints, d as MutationResult, R as RPCDefinition, e as StreamDefinition, f as StreamDefinitions, g as StreamEndpoints, h as StreamSinks } from './stream-types-Q_EqNLtO.js';
4
+ import { Graph, Input, ReactiveValue } from 'derivation';
5
+ import { Reactive, ChangeInput, Changes, Operations } from '@derivation/composable';
6
+ import { Iso } from './iso.js';
7
+ export { Transport } from './transport.js';
8
+ export { P as PresenceHandler } from './presence-manager-4LlEyuGp.js';
9
+ import 'immutable';
10
+
11
+ declare class ReactiveSourceAdapter<T> implements Source<Reactive<T>> {
12
+ private readonly stream;
13
+ private readonly snapshotIso;
14
+ private readonly changeIso;
15
+ constructor(stream: Reactive<T>, snapshotIso: Iso<T, object>, changeIso: Iso<Changes<T>, object>);
16
+ get Snapshot(): object;
17
+ get LastChange(): object | null;
18
+ get Stream(): Reactive<T>;
19
+ }
20
+ declare class ReactiveSinkAdapter<T> implements Sink<Reactive<T>, ChangeInput<T>> {
21
+ private readonly graph;
22
+ private readonly changeIso;
23
+ private readonly ops;
24
+ private readonly initialValue;
25
+ constructor(graph: Graph, snapshotIso: Iso<T, object>, changeIso: Iso<Changes<T>, object>, ops: Operations<T>, snapshot: object);
26
+ apply(change: object, input: ChangeInput<T>): void;
27
+ build(): {
28
+ stream: Reactive<T>;
29
+ input: ChangeInput<T>;
30
+ };
31
+ }
32
+ declare function sink$1<T>(graph: Graph, snapshotIso: Iso<T, object>, changeIso: Iso<Changes<T>, object>, ops: Operations<T>): (snapshot: object) => Sink<Reactive<T>, ChangeInput<T>>;
33
+
34
+ declare class StreamSourceAdapter<T extends object> implements Source<ReactiveValue<T>> {
35
+ private readonly stream;
36
+ private readonly iso;
37
+ constructor(stream: ReactiveValue<T>, iso: Iso<T, object>);
38
+ get Snapshot(): object;
39
+ get LastChange(): object | null;
40
+ get Stream(): ReactiveValue<T>;
41
+ }
42
+ declare class StreamSinkAdapter<T extends object> implements Sink<Input<T>, Input<T>> {
43
+ private readonly graph;
44
+ private readonly iso;
45
+ private readonly initialValue;
46
+ constructor(graph: Graph, iso: Iso<T, object>, snapshot: object);
47
+ apply(change: object, input: Input<T>): void;
48
+ build(): {
49
+ stream: Input<T>;
50
+ input: Input<T>;
51
+ };
52
+ }
53
+ declare function sink<T extends object>(graph: Graph, iso: Iso<T, object>): (snapshot: object) => Sink<Input<T>, Input<T>>;
54
+
55
+ export { ReactiveSinkAdapter, ReactiveSourceAdapter, Sink, Source, StreamSinkAdapter, StreamSourceAdapter, sink$1 as reactiveSink, sink as streamSink };