@derivation/rpc 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +18 -0
- package/README.md +17 -0
- package/dist/client-handler.d.ts +19 -0
- package/dist/client-handler.js +108 -0
- package/dist/client-message.d.ts +35 -0
- package/dist/client-message.js +37 -0
- package/dist/client.d.ts +15 -0
- package/dist/client.js +76 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/iso.d.ts +36 -0
- package/dist/iso.js +115 -0
- package/dist/reactive-map-adapter.d.ts +19 -0
- package/dist/reactive-map-adapter.js +45 -0
- package/dist/reactive-set-adapter.d.ts +19 -0
- package/dist/reactive-set-adapter.js +42 -0
- package/dist/server-message.d.ts +32 -0
- package/dist/server-message.js +32 -0
- package/dist/stream-adapter.d.ts +19 -0
- package/dist/stream-adapter.js +39 -0
- package/dist/stream-types.d.ts +21 -0
- package/dist/stream-types.js +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/weak-list.d.ts +5 -0
- package/dist/weak-list.js +19 -0
- package/dist/websocket-server.d.ts +4 -0
- package/dist/websocket-server.js +35 -0
- package/package.json +43 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
Copyright 2026 Daniel Waterworth
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
4
|
+
this software and associated documentation files (the “Software”), to deal in
|
|
5
|
+
the Software without restriction, including without limitation the rights to
|
|
6
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
7
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
8
|
+
subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
15
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
16
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
17
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
18
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Derivation RPC
|
|
2
|
+
|
|
3
|
+
> This is a work in progress. Don't use this for anything you care about yet.
|
|
4
|
+
|
|
5
|
+
A TypeScript library for building **reactive, incremental, and type-safe data
|
|
6
|
+
streams** between a server and browser clients — powered by the
|
|
7
|
+
[`derivation`](https://www.npmjs.com/package/derivation) library.
|
|
8
|
+
|
|
9
|
+
This library provides a clean abstraction for synchronizing **reactive data
|
|
10
|
+
graphs** over WebSockets with automatically issued unsubscriptions when reactive
|
|
11
|
+
values are garbage-collected.
|
|
12
|
+
|
|
13
|
+
## 🚀 Installation
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
npm install @derivation/rpc
|
|
17
|
+
```
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { RawData, WebSocket } from "ws";
|
|
2
|
+
import { ClientMessage } from "./client-message";
|
|
3
|
+
import { ServerMessage } from "./server-message";
|
|
4
|
+
import { StreamEndpoints, StreamDefinitions } from "./stream-types";
|
|
5
|
+
export declare class ClientHandler<Defs extends StreamDefinitions> {
|
|
6
|
+
private readonly ws;
|
|
7
|
+
private readonly endpoints;
|
|
8
|
+
private closed;
|
|
9
|
+
private readonly streams;
|
|
10
|
+
private interval;
|
|
11
|
+
constructor(ws: WebSocket, endpoints: StreamEndpoints<Defs>);
|
|
12
|
+
private resetHeartbeat;
|
|
13
|
+
handleMessage(message: RawData): void;
|
|
14
|
+
handleClientMessage(message: ClientMessage): void;
|
|
15
|
+
handleStep(): void;
|
|
16
|
+
sendMessage(message: ServerMessage): void;
|
|
17
|
+
handleDisconnect(): void;
|
|
18
|
+
close(): void;
|
|
19
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { parseClientMessage } from "./client-message";
|
|
2
|
+
import { ServerMessage } from "./server-message";
|
|
3
|
+
export class ClientHandler {
|
|
4
|
+
constructor(ws, endpoints) {
|
|
5
|
+
this.closed = false;
|
|
6
|
+
this.streams = new Map();
|
|
7
|
+
this.ws = ws;
|
|
8
|
+
this.endpoints = endpoints;
|
|
9
|
+
console.log("new client connected");
|
|
10
|
+
this.resetHeartbeat();
|
|
11
|
+
}
|
|
12
|
+
resetHeartbeat() {
|
|
13
|
+
if (this.interval) {
|
|
14
|
+
clearInterval(this.interval);
|
|
15
|
+
}
|
|
16
|
+
this.interval = setInterval(() => {
|
|
17
|
+
this.sendMessage(ServerMessage.heartbeat());
|
|
18
|
+
}, 10000);
|
|
19
|
+
}
|
|
20
|
+
handleMessage(message) {
|
|
21
|
+
let data;
|
|
22
|
+
try {
|
|
23
|
+
data = JSON.parse(message.toString());
|
|
24
|
+
}
|
|
25
|
+
catch (_a) {
|
|
26
|
+
console.error("Invalid JSON received:", message.toString());
|
|
27
|
+
return this.close();
|
|
28
|
+
}
|
|
29
|
+
let parsed;
|
|
30
|
+
try {
|
|
31
|
+
parsed = parseClientMessage(data);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
console.error("Invalid client message:", err);
|
|
35
|
+
return this.close();
|
|
36
|
+
}
|
|
37
|
+
this.handleClientMessage(parsed);
|
|
38
|
+
}
|
|
39
|
+
handleClientMessage(message) {
|
|
40
|
+
switch (message.type) {
|
|
41
|
+
case "subscribe": {
|
|
42
|
+
const { id, name, args } = message;
|
|
43
|
+
if (!(name in this.endpoints)) {
|
|
44
|
+
console.error(`Unknown stream: ${name}`);
|
|
45
|
+
this.close();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const endpoint = this.endpoints[name];
|
|
49
|
+
try {
|
|
50
|
+
const source = endpoint(args);
|
|
51
|
+
this.streams.set(id, source);
|
|
52
|
+
this.sendMessage(ServerMessage.subscribed(id, source.Snapshot));
|
|
53
|
+
console.log(`Client subscribed to \"${name}\" (${id})`);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
console.error(`Error building stream ${name}:`, err);
|
|
57
|
+
this.close();
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case "unsubscribe": {
|
|
62
|
+
const { id } = message;
|
|
63
|
+
this.streams.delete(id);
|
|
64
|
+
console.log(`Client unsubscribed from ${id}`);
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case "heartbeat":
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
handleStep() {
|
|
72
|
+
if (this.closed)
|
|
73
|
+
return;
|
|
74
|
+
const changes = {};
|
|
75
|
+
for (const [id, source] of this.streams) {
|
|
76
|
+
changes[id] = source.LastChange;
|
|
77
|
+
}
|
|
78
|
+
if (Object.keys(changes).length > 0) {
|
|
79
|
+
this.sendMessage(ServerMessage.delta(changes));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
sendMessage(message) {
|
|
83
|
+
this.resetHeartbeat();
|
|
84
|
+
if (!this.closed) {
|
|
85
|
+
try {
|
|
86
|
+
this.ws.send(JSON.stringify(message));
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
console.error("Failed to send message:", err);
|
|
90
|
+
this.close();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
handleDisconnect() {
|
|
95
|
+
console.log("client disconnected");
|
|
96
|
+
this.close();
|
|
97
|
+
}
|
|
98
|
+
close() {
|
|
99
|
+
if (this.closed)
|
|
100
|
+
return;
|
|
101
|
+
this.closed = true;
|
|
102
|
+
clearInterval(this.interval);
|
|
103
|
+
try {
|
|
104
|
+
this.ws.close();
|
|
105
|
+
}
|
|
106
|
+
catch (_a) { }
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const SubscribeMessageSchema: z.ZodObject<{
|
|
3
|
+
type: z.ZodLiteral<"subscribe">;
|
|
4
|
+
id: z.ZodNumber;
|
|
5
|
+
name: z.ZodString;
|
|
6
|
+
args: z.ZodObject<{}, z.core.$loose>;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
export type SubscribeMessage = z.infer<typeof SubscribeMessageSchema>;
|
|
9
|
+
export declare const UnsubscribeMessageSchema: z.ZodObject<{
|
|
10
|
+
type: z.ZodLiteral<"unsubscribe">;
|
|
11
|
+
id: z.ZodNumber;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
export type UnsubscribeMessage = z.infer<typeof UnsubscribeMessageSchema>;
|
|
14
|
+
export declare const HeartbeatMessageSchema: z.ZodObject<{
|
|
15
|
+
type: z.ZodLiteral<"heartbeat">;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
export type HeartbeatMessage = z.infer<typeof HeartbeatMessageSchema>;
|
|
18
|
+
export declare const ClientMessageSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
19
|
+
type: z.ZodLiteral<"subscribe">;
|
|
20
|
+
id: z.ZodNumber;
|
|
21
|
+
name: z.ZodString;
|
|
22
|
+
args: z.ZodObject<{}, z.core.$loose>;
|
|
23
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
24
|
+
type: z.ZodLiteral<"unsubscribe">;
|
|
25
|
+
id: z.ZodNumber;
|
|
26
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
27
|
+
type: z.ZodLiteral<"heartbeat">;
|
|
28
|
+
}, z.core.$strip>], "type">;
|
|
29
|
+
export type ClientMessage = z.infer<typeof ClientMessageSchema>;
|
|
30
|
+
export declare function parseClientMessage(data: unknown): ClientMessage;
|
|
31
|
+
export declare const ClientMessage: {
|
|
32
|
+
subscribe: (id: number, name: string, args: Record<string, unknown>) => SubscribeMessage;
|
|
33
|
+
unsubscribe: (id: number) => UnsubscribeMessage;
|
|
34
|
+
heartbeat: () => HeartbeatMessage;
|
|
35
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SubscribeMessageSchema = z.object({
|
|
3
|
+
type: z.literal("subscribe"),
|
|
4
|
+
id: z.number(),
|
|
5
|
+
name: z.string(),
|
|
6
|
+
args: z.looseObject({}),
|
|
7
|
+
});
|
|
8
|
+
export const UnsubscribeMessageSchema = z.object({
|
|
9
|
+
type: z.literal("unsubscribe"),
|
|
10
|
+
id: z.number(),
|
|
11
|
+
});
|
|
12
|
+
export const HeartbeatMessageSchema = z.object({
|
|
13
|
+
type: z.literal("heartbeat"),
|
|
14
|
+
});
|
|
15
|
+
export const ClientMessageSchema = z.discriminatedUnion("type", [
|
|
16
|
+
SubscribeMessageSchema,
|
|
17
|
+
UnsubscribeMessageSchema,
|
|
18
|
+
HeartbeatMessageSchema,
|
|
19
|
+
]);
|
|
20
|
+
export function parseClientMessage(data) {
|
|
21
|
+
return ClientMessageSchema.parse(data);
|
|
22
|
+
}
|
|
23
|
+
export const ClientMessage = {
|
|
24
|
+
subscribe: (id, name, args) => ({
|
|
25
|
+
type: "subscribe",
|
|
26
|
+
id,
|
|
27
|
+
name,
|
|
28
|
+
args,
|
|
29
|
+
}),
|
|
30
|
+
unsubscribe: (id) => ({
|
|
31
|
+
type: "unsubscribe",
|
|
32
|
+
id,
|
|
33
|
+
}),
|
|
34
|
+
heartbeat: () => ({
|
|
35
|
+
type: "heartbeat",
|
|
36
|
+
}),
|
|
37
|
+
};
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Graph } from "derivation";
|
|
2
|
+
import type { StreamDefinitions, StreamSinks } from "./stream-types";
|
|
3
|
+
export declare class Client<Defs extends StreamDefinitions> {
|
|
4
|
+
private ws;
|
|
5
|
+
private sinks;
|
|
6
|
+
private graph;
|
|
7
|
+
private nextId;
|
|
8
|
+
private pending;
|
|
9
|
+
private activeStreams;
|
|
10
|
+
private registry;
|
|
11
|
+
constructor(ws: WebSocket, sinks: StreamSinks<Defs>, graph: Graph);
|
|
12
|
+
private handleMessage;
|
|
13
|
+
private send;
|
|
14
|
+
run<Key extends keyof Defs>(key: Key, args: Defs[Key]["args"]): Promise<Defs[Key]["returnType"]>;
|
|
15
|
+
}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { ClientMessage } from "./client-message";
|
|
2
|
+
function changer(sink, stream) {
|
|
3
|
+
return (change) => {
|
|
4
|
+
const s = stream.deref();
|
|
5
|
+
if (s) {
|
|
6
|
+
sink.apply(change, s);
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export class Client {
|
|
11
|
+
constructor(ws, sinks, graph) {
|
|
12
|
+
this.ws = ws;
|
|
13
|
+
this.sinks = sinks;
|
|
14
|
+
this.graph = graph;
|
|
15
|
+
this.nextId = 1;
|
|
16
|
+
this.pending = new Map();
|
|
17
|
+
this.activeStreams = new Map();
|
|
18
|
+
this.registry = new FinalizationRegistry(([id, name]) => {
|
|
19
|
+
console.log(`🧹 Stream ${id} (${name}) collected — unsubscribing`);
|
|
20
|
+
this.send(ClientMessage.unsubscribe(id));
|
|
21
|
+
this.activeStreams.delete(id);
|
|
22
|
+
});
|
|
23
|
+
this.ws.onmessage = (event) => {
|
|
24
|
+
const message = JSON.parse(event.data);
|
|
25
|
+
this.handleMessage(message);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
handleMessage(message) {
|
|
29
|
+
switch (message.type) {
|
|
30
|
+
case "snapshot": {
|
|
31
|
+
const resolve = this.pending.get(message.id);
|
|
32
|
+
if (resolve) {
|
|
33
|
+
resolve(message.snapshot);
|
|
34
|
+
this.pending.delete(message.id);
|
|
35
|
+
}
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case "delta": {
|
|
39
|
+
for (const [idStr, change] of Object.entries(message.changes)) {
|
|
40
|
+
const id = Number(idStr);
|
|
41
|
+
const sink = this.activeStreams.get(id);
|
|
42
|
+
if (sink && change && typeof change === "object") {
|
|
43
|
+
sink(change);
|
|
44
|
+
}
|
|
45
|
+
else if (!sink) {
|
|
46
|
+
console.log(`🧹 Sink ${id} GC’d — auto-unsubscribing`);
|
|
47
|
+
this.send(ClientMessage.unsubscribe(id));
|
|
48
|
+
this.activeStreams.delete(id);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
this.graph.step();
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
case "heartbeat":
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
send(message) {
|
|
59
|
+
this.ws.send(JSON.stringify(message));
|
|
60
|
+
}
|
|
61
|
+
async run(key, args) {
|
|
62
|
+
console.log(`Running stream ${String(key)} with args ${JSON.stringify(args)}`);
|
|
63
|
+
const id = this.nextId++;
|
|
64
|
+
this.send(ClientMessage.subscribe(id, String(key), args));
|
|
65
|
+
const snapshot = await new Promise((resolve) => {
|
|
66
|
+
this.pending.set(id, resolve);
|
|
67
|
+
});
|
|
68
|
+
const endpoint = this.sinks[key];
|
|
69
|
+
const sink = endpoint(snapshot);
|
|
70
|
+
const stream = sink.build();
|
|
71
|
+
const ref = new WeakRef(stream);
|
|
72
|
+
this.activeStreams.set(id, changer(sink, ref));
|
|
73
|
+
this.registry.register(stream, [id, String(key)]);
|
|
74
|
+
return stream;
|
|
75
|
+
}
|
|
76
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from "./client";
|
|
2
|
+
export * from "./stream-types";
|
|
3
|
+
export { ReactiveSetSourceAdapter, ReactiveSetSinkAdapter, sink as setSink } from "./reactive-set-adapter";
|
|
4
|
+
export { ReactiveMapSourceAdapter, ReactiveMapSinkAdapter, sink as mapSink } from "./reactive-map-adapter";
|
|
5
|
+
export { StreamSourceAdapter, StreamSinkAdapter, sink as streamSink } from "./stream-adapter";
|
|
6
|
+
export { setupWebSocketServer } from "./websocket-server";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from "./client";
|
|
2
|
+
export * from "./stream-types";
|
|
3
|
+
export { ReactiveSetSourceAdapter, ReactiveSetSinkAdapter, sink as setSink } from "./reactive-set-adapter";
|
|
4
|
+
export { ReactiveMapSourceAdapter, ReactiveMapSinkAdapter, sink as mapSink } from "./reactive-map-adapter";
|
|
5
|
+
export { StreamSourceAdapter, StreamSinkAdapter, sink as streamSink } from "./stream-adapter";
|
|
6
|
+
export { setupWebSocketServer } from "./websocket-server";
|
package/dist/iso.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { RecordOf } from "immutable";
|
|
2
|
+
import { ZSet, ZMap } from "derivation";
|
|
3
|
+
export interface Iso<In, Out> {
|
|
4
|
+
to(x: In): Out;
|
|
5
|
+
from(x: Out): In;
|
|
6
|
+
}
|
|
7
|
+
export declare function id<A>(): Iso<A, A>;
|
|
8
|
+
export declare function unknown<A>(): Iso<A, unknown>;
|
|
9
|
+
export declare function flip<A, B>(iso: Iso<A, B>): Iso<B, A>;
|
|
10
|
+
export declare function compose<A, B, C>(first: Iso<A, B>, second: Iso<B, C>): Iso<A, C>;
|
|
11
|
+
export declare function array<A, B>(itemIso: Iso<A, B>): Iso<Array<A>, Array<B>>;
|
|
12
|
+
export declare function zset<A, B>(iso: Iso<A, B>): Iso<ZSet<A>, ZSet<B>>;
|
|
13
|
+
export declare function zsetToArray<A>(): Iso<ZSet<A>, Array<[A, number]>>;
|
|
14
|
+
export type IsoIn<T> = T extends Iso<infer A, unknown> ? A : never;
|
|
15
|
+
export type IsoOut<T> = T extends Iso<unknown, infer B> ? B : never;
|
|
16
|
+
type ObjectIsos = Record<string, Iso<unknown, unknown>>;
|
|
17
|
+
type ObjectIn<T extends ObjectIsos> = {
|
|
18
|
+
[K in keyof T]: IsoIn<T[K]>;
|
|
19
|
+
};
|
|
20
|
+
type ObjectOut<T extends ObjectIsos> = {
|
|
21
|
+
[K in keyof T]: IsoOut<T[K]>;
|
|
22
|
+
};
|
|
23
|
+
export declare function object<T extends ObjectIsos>(spec: T): Iso<ObjectIn<T>, ObjectOut<T>>;
|
|
24
|
+
export declare function shallowRecord<T extends Record<string, unknown>>(): Iso<RecordOf<T>, T>;
|
|
25
|
+
export declare function record<T extends ObjectIsos>(spec: T): Iso<RecordOf<ObjectIn<T>>, ObjectOut<T>>;
|
|
26
|
+
type TupleIsos = Array<Iso<unknown, unknown>>;
|
|
27
|
+
type TupleIn<T extends TupleIsos> = {
|
|
28
|
+
[K in keyof T]: IsoIn<T[K]>;
|
|
29
|
+
};
|
|
30
|
+
type TupleOut<T extends TupleIsos> = {
|
|
31
|
+
[K in keyof T]: IsoOut<T[K]>;
|
|
32
|
+
};
|
|
33
|
+
export declare function tuple<T extends TupleIsos>(...isos: T): Iso<TupleIn<T>, TupleOut<T>>;
|
|
34
|
+
export declare function map<K, V, K2, V2>(keyIso: Iso<K, K2>, valueIso: Iso<V, V2>): Iso<Map<K, V>, Array<[K2, V2]>>;
|
|
35
|
+
export declare function zmap<K, V, K2, V2>(keyIso: Iso<K, K2>, valueIso: Iso<V, V2>): Iso<ZMap<K, V>, Array<[K2, V2, number]>>;
|
|
36
|
+
export {};
|
package/dist/iso.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Record as ImmutableRecord } from "immutable";
|
|
2
|
+
import { ZSet, ZMap } from "derivation";
|
|
3
|
+
export function id() {
|
|
4
|
+
return {
|
|
5
|
+
to: (x) => x,
|
|
6
|
+
from: (x) => x,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function unknown() {
|
|
10
|
+
return {
|
|
11
|
+
to: (x) => x,
|
|
12
|
+
from: (x) => x,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function flip(iso) {
|
|
16
|
+
return {
|
|
17
|
+
to: (x) => iso.from(x),
|
|
18
|
+
from: (x) => iso.to(x),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function compose(first, second) {
|
|
22
|
+
return {
|
|
23
|
+
to: (x) => second.to(first.to(x)),
|
|
24
|
+
from: (x) => first.from(second.from(x)),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function array(itemIso) {
|
|
28
|
+
return {
|
|
29
|
+
to: (xs) => xs.map(itemIso.to),
|
|
30
|
+
from: (xs) => xs.map(itemIso.from),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function zset(iso) {
|
|
34
|
+
return {
|
|
35
|
+
to: (xs) => {
|
|
36
|
+
let zset = new ZSet();
|
|
37
|
+
for (const [item, weight] of xs.getEntries()) {
|
|
38
|
+
zset = zset.add(iso.to(item), weight);
|
|
39
|
+
}
|
|
40
|
+
return zset;
|
|
41
|
+
},
|
|
42
|
+
from: (xs) => {
|
|
43
|
+
let zset = new ZSet();
|
|
44
|
+
for (const [item, weight] of xs.getEntries()) {
|
|
45
|
+
zset = zset.add(iso.from(item), weight);
|
|
46
|
+
}
|
|
47
|
+
return zset;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function zsetToArray() {
|
|
52
|
+
return {
|
|
53
|
+
to: (xs) => [...xs.getEntries()].map(([item, weight]) => [item, weight]),
|
|
54
|
+
from: (xs) => {
|
|
55
|
+
let zset = new ZSet();
|
|
56
|
+
for (const [item, weight] of xs) {
|
|
57
|
+
zset = zset.add(item, weight);
|
|
58
|
+
}
|
|
59
|
+
return zset;
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function object(spec) {
|
|
64
|
+
return {
|
|
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
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export function shallowRecord() {
|
|
82
|
+
return {
|
|
83
|
+
to: (x) => x.toObject(),
|
|
84
|
+
from: (x) => ImmutableRecord(x)(x),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function record(spec) {
|
|
88
|
+
return compose(shallowRecord(), object(spec));
|
|
89
|
+
}
|
|
90
|
+
export function tuple(...isos) {
|
|
91
|
+
return {
|
|
92
|
+
to: (x) => x.map((xi, i) => isos[i].to(xi)),
|
|
93
|
+
from: (x) => x.map((xi, i) => isos[i].from(xi)),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export function map(keyIso, valueIso) {
|
|
97
|
+
return {
|
|
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
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export function zmap(keyIso, valueIso) {
|
|
103
|
+
const entryIso = tuple(keyIso, valueIso, id());
|
|
104
|
+
return {
|
|
105
|
+
to: (zm) => [...zm.getEntries()].map((x) => entryIso.to([...x])),
|
|
106
|
+
from: (entries) => {
|
|
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
|
+
};
|
|
115
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Graph, ReactiveMap, ReactiveMapSource } from "derivation";
|
|
2
|
+
import { Source, Sink } from "./stream-types";
|
|
3
|
+
import { Iso } from "./iso";
|
|
4
|
+
export declare class ReactiveMapSourceAdapter<K, V> implements Source<ReactiveMap<K, V>> {
|
|
5
|
+
private readonly map;
|
|
6
|
+
private readonly iso;
|
|
7
|
+
constructor(map: ReactiveMap<K, V>, keyIso: Iso<K, unknown>, valueIso: Iso<V, unknown>);
|
|
8
|
+
get Snapshot(): object;
|
|
9
|
+
get LastChange(): object;
|
|
10
|
+
get Stream(): ReactiveMap<K, V>;
|
|
11
|
+
}
|
|
12
|
+
export declare class ReactiveMapSinkAdapter<K, V> implements Sink<ReactiveMapSource<K, V>> {
|
|
13
|
+
private readonly graph;
|
|
14
|
+
private readonly iso;
|
|
15
|
+
constructor(graph: Graph, keyIso: Iso<K, unknown>, valueIso: Iso<V, unknown>);
|
|
16
|
+
apply(change: object, stream: ReactiveMapSource<K, V>): void;
|
|
17
|
+
build(): ReactiveMapSource<K, V>;
|
|
18
|
+
}
|
|
19
|
+
export declare function sink<K, V>(graph: Graph, keyIso: Iso<K, unknown>, valueIso: Iso<V, unknown>): (snapshot: object) => Sink<ReactiveMapSource<K, V>>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ZMap } from "derivation";
|
|
2
|
+
import { zmap } from "./iso";
|
|
3
|
+
export class ReactiveMapSourceAdapter {
|
|
4
|
+
constructor(map, keyIso, valueIso) {
|
|
5
|
+
this.map = map;
|
|
6
|
+
this.iso = zmap(keyIso, valueIso);
|
|
7
|
+
}
|
|
8
|
+
get Snapshot() {
|
|
9
|
+
return this.iso.to(this.map.snapshot);
|
|
10
|
+
}
|
|
11
|
+
get LastChange() {
|
|
12
|
+
return this.iso.to(this.map.changes.value);
|
|
13
|
+
}
|
|
14
|
+
get Stream() {
|
|
15
|
+
return this.map;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class ReactiveMapSinkAdapter {
|
|
19
|
+
constructor(graph, keyIso, valueIso) {
|
|
20
|
+
this.graph = graph;
|
|
21
|
+
this.iso = zmap(keyIso, valueIso);
|
|
22
|
+
}
|
|
23
|
+
apply(change, stream) {
|
|
24
|
+
const zmapChange = this.iso.from(change);
|
|
25
|
+
for (const [key, value, weight] of zmapChange.getEntries()) {
|
|
26
|
+
stream.add(key, value, weight);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
build() {
|
|
30
|
+
return this.graph.inputMap(new ZMap());
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function sink(graph, keyIso, valueIso) {
|
|
34
|
+
const wholeIso = zmap(keyIso, valueIso);
|
|
35
|
+
return (snapshot) => {
|
|
36
|
+
const initial = wholeIso.from(snapshot);
|
|
37
|
+
const g = graph;
|
|
38
|
+
const adapter = new ReactiveMapSinkAdapter(g, keyIso, valueIso);
|
|
39
|
+
const stream = g.inputMap(initial);
|
|
40
|
+
return {
|
|
41
|
+
apply: adapter.apply.bind(adapter),
|
|
42
|
+
build: () => stream,
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ZSet, Graph, ReactiveSet, ReactiveSetSource } from "derivation";
|
|
2
|
+
import { Source, Sink } from "./stream-types";
|
|
3
|
+
import { Iso } from "./iso";
|
|
4
|
+
export declare class ReactiveSetSourceAdapter<T> implements Source<ReactiveSet<T>> {
|
|
5
|
+
private readonly set;
|
|
6
|
+
private readonly iso;
|
|
7
|
+
constructor(set: ReactiveSet<T>, iso: Iso<T, unknown>);
|
|
8
|
+
get Snapshot(): object;
|
|
9
|
+
get LastChange(): object;
|
|
10
|
+
get Stream(): ReactiveSet<T>;
|
|
11
|
+
}
|
|
12
|
+
export declare class ReactiveSetSinkAdapter<T> implements Sink<ReactiveSetSource<T>> {
|
|
13
|
+
private readonly graph;
|
|
14
|
+
private readonly iso;
|
|
15
|
+
constructor(graph: Graph, iso: Iso<ZSet<T>, unknown>);
|
|
16
|
+
apply(change: object, stream: ReactiveSetSource<T>): void;
|
|
17
|
+
build(): ReactiveSetSource<T>;
|
|
18
|
+
}
|
|
19
|
+
export declare function sink<T>(graph: Graph, iso: Iso<T, unknown>): (snapshot: object) => Sink<ReactiveSetSource<T>>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ZSet } from "derivation";
|
|
2
|
+
import { zset, zsetToArray, compose } from "./iso";
|
|
3
|
+
export class ReactiveSetSourceAdapter {
|
|
4
|
+
constructor(set, iso) {
|
|
5
|
+
this.set = set;
|
|
6
|
+
this.iso = compose(zset(iso), zsetToArray());
|
|
7
|
+
}
|
|
8
|
+
get Snapshot() {
|
|
9
|
+
return this.iso.to(this.set.snapshot);
|
|
10
|
+
}
|
|
11
|
+
get LastChange() {
|
|
12
|
+
return this.iso.to(this.set.changes.value);
|
|
13
|
+
}
|
|
14
|
+
get Stream() {
|
|
15
|
+
return this.set;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class ReactiveSetSinkAdapter {
|
|
19
|
+
constructor(graph, iso) {
|
|
20
|
+
this.graph = graph;
|
|
21
|
+
this.iso = iso;
|
|
22
|
+
}
|
|
23
|
+
apply(change, stream) {
|
|
24
|
+
stream.push(this.iso.from(change));
|
|
25
|
+
}
|
|
26
|
+
build() {
|
|
27
|
+
return this.graph.inputSet(new ZSet([]));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function sink(graph, iso) {
|
|
31
|
+
const wholeIso = compose(zset(iso), zsetToArray());
|
|
32
|
+
return (snapshot) => {
|
|
33
|
+
const set = wholeIso.from(snapshot);
|
|
34
|
+
const g = graph;
|
|
35
|
+
const adapter = new ReactiveSetSinkAdapter(g, wholeIso);
|
|
36
|
+
const stream = g.inputSet(set);
|
|
37
|
+
return {
|
|
38
|
+
apply: adapter.apply.bind(adapter),
|
|
39
|
+
build: () => stream,
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const HeartbeatMessageSchema: z.ZodObject<{
|
|
3
|
+
type: z.ZodLiteral<"heartbeat">;
|
|
4
|
+
}, z.core.$strip>;
|
|
5
|
+
export type HeartbeatMessage = z.infer<typeof HeartbeatMessageSchema>;
|
|
6
|
+
export declare const SubscribedSchema: z.ZodObject<{
|
|
7
|
+
type: z.ZodLiteral<"snapshot">;
|
|
8
|
+
id: z.ZodNumber;
|
|
9
|
+
snapshot: z.ZodUnknown;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export type SubscribedMessage = z.infer<typeof SubscribedSchema>;
|
|
12
|
+
export declare const DeltaMessageSchema: z.ZodObject<{
|
|
13
|
+
type: z.ZodLiteral<"delta">;
|
|
14
|
+
changes: z.ZodRecord<z.ZodNumber, z.ZodUnknown>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
export type DeltaMessage = z.infer<typeof DeltaMessageSchema>;
|
|
17
|
+
export declare const ServerMessageSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
18
|
+
type: z.ZodLiteral<"heartbeat">;
|
|
19
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
20
|
+
type: z.ZodLiteral<"snapshot">;
|
|
21
|
+
id: z.ZodNumber;
|
|
22
|
+
snapshot: z.ZodUnknown;
|
|
23
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
24
|
+
type: z.ZodLiteral<"delta">;
|
|
25
|
+
changes: z.ZodRecord<z.ZodNumber, z.ZodUnknown>;
|
|
26
|
+
}, z.core.$strip>], "type">;
|
|
27
|
+
export type ServerMessage = z.infer<typeof ServerMessageSchema>;
|
|
28
|
+
export declare const ServerMessage: {
|
|
29
|
+
heartbeat: () => HeartbeatMessage;
|
|
30
|
+
subscribed: (id: number, snapshot: unknown) => SubscribedMessage;
|
|
31
|
+
delta: (changes: Record<string, unknown>) => DeltaMessage;
|
|
32
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const HeartbeatMessageSchema = z.object({
|
|
3
|
+
type: z.literal("heartbeat"),
|
|
4
|
+
});
|
|
5
|
+
export const SubscribedSchema = z.object({
|
|
6
|
+
type: z.literal("snapshot"),
|
|
7
|
+
id: z.number(),
|
|
8
|
+
snapshot: z.unknown(),
|
|
9
|
+
});
|
|
10
|
+
export const DeltaMessageSchema = z.object({
|
|
11
|
+
type: z.literal("delta"),
|
|
12
|
+
changes: z.record(z.number(), z.unknown()),
|
|
13
|
+
});
|
|
14
|
+
export const ServerMessageSchema = z.discriminatedUnion("type", [
|
|
15
|
+
HeartbeatMessageSchema,
|
|
16
|
+
SubscribedSchema,
|
|
17
|
+
DeltaMessageSchema,
|
|
18
|
+
]);
|
|
19
|
+
export const ServerMessage = {
|
|
20
|
+
heartbeat: () => ({
|
|
21
|
+
type: "heartbeat",
|
|
22
|
+
}),
|
|
23
|
+
subscribed: (id, snapshot) => ({
|
|
24
|
+
type: "snapshot",
|
|
25
|
+
id,
|
|
26
|
+
snapshot,
|
|
27
|
+
}),
|
|
28
|
+
delta: (changes) => ({
|
|
29
|
+
type: "delta",
|
|
30
|
+
changes: changes,
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Graph, ReactiveValue, Input } from "derivation";
|
|
2
|
+
import { Source, Sink } from "./stream-types";
|
|
3
|
+
import { Iso } from "./iso";
|
|
4
|
+
export declare class StreamSourceAdapter<T extends object> implements Source<ReactiveValue<T>> {
|
|
5
|
+
private readonly stream;
|
|
6
|
+
private readonly iso;
|
|
7
|
+
constructor(stream: ReactiveValue<T>, iso: Iso<T, object>);
|
|
8
|
+
get Snapshot(): object;
|
|
9
|
+
get LastChange(): object;
|
|
10
|
+
get Stream(): ReactiveValue<T>;
|
|
11
|
+
}
|
|
12
|
+
export declare class StreamSinkAdapter<T extends object> implements Sink<Input<T>> {
|
|
13
|
+
private readonly graph;
|
|
14
|
+
private readonly iso;
|
|
15
|
+
constructor(graph: Graph, iso: Iso<T, object>);
|
|
16
|
+
apply(change: object, stream: Input<T>): void;
|
|
17
|
+
build(): Input<T>;
|
|
18
|
+
}
|
|
19
|
+
export declare function sink<T extends object>(graph: Graph, iso: Iso<T, object>): (snapshot: object) => Sink<Input<T>>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export class StreamSourceAdapter {
|
|
2
|
+
constructor(stream, iso) {
|
|
3
|
+
this.stream = stream;
|
|
4
|
+
this.iso = iso;
|
|
5
|
+
}
|
|
6
|
+
get Snapshot() {
|
|
7
|
+
return this.iso.to(this.stream.value);
|
|
8
|
+
}
|
|
9
|
+
get LastChange() {
|
|
10
|
+
return this.iso.to(this.stream.value);
|
|
11
|
+
}
|
|
12
|
+
get Stream() {
|
|
13
|
+
return this.stream;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class StreamSinkAdapter {
|
|
17
|
+
constructor(graph, iso) {
|
|
18
|
+
this.graph = graph;
|
|
19
|
+
this.iso = iso;
|
|
20
|
+
}
|
|
21
|
+
apply(change, stream) {
|
|
22
|
+
stream.push(this.iso.from(change));
|
|
23
|
+
}
|
|
24
|
+
build() {
|
|
25
|
+
return this.graph.inputValue({});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function sink(graph, iso) {
|
|
29
|
+
return (snapshot) => {
|
|
30
|
+
const g = graph;
|
|
31
|
+
const adapter = new StreamSinkAdapter(g, iso);
|
|
32
|
+
const initialValue = iso.from(snapshot);
|
|
33
|
+
const input = g.inputValue(initialValue);
|
|
34
|
+
return {
|
|
35
|
+
apply: adapter.apply.bind(adapter),
|
|
36
|
+
build: () => input,
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface Source<ReturnType> {
|
|
2
|
+
get Snapshot(): object;
|
|
3
|
+
get LastChange(): object;
|
|
4
|
+
get Stream(): ReturnType;
|
|
5
|
+
}
|
|
6
|
+
export interface Sink<SinkType> {
|
|
7
|
+
apply(change: object, stream: SinkType): void;
|
|
8
|
+
build(): SinkType;
|
|
9
|
+
}
|
|
10
|
+
export type StreamDefinition<ReturnType extends object, SinkType extends ReturnType> = {
|
|
11
|
+
args: Record<string, unknown>;
|
|
12
|
+
returnType: ReturnType;
|
|
13
|
+
sinkType: SinkType;
|
|
14
|
+
};
|
|
15
|
+
export type StreamDefinitions = Record<string, StreamDefinition<object, object>>;
|
|
16
|
+
export type StreamEndpoints<Definitions extends StreamDefinitions> = {
|
|
17
|
+
[K in keyof Definitions]: (args: Definitions[K]["args"]) => Source<Definitions[K]["returnType"]>;
|
|
18
|
+
};
|
|
19
|
+
export type StreamSinks<Definitions extends StreamDefinitions> = {
|
|
20
|
+
[K in keyof Definitions]: ((snapshot: object) => Sink<Definitions[K]["sinkType"]>);
|
|
21
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.es2021.d.ts","../node_modules/typescript/lib/lib.es2022.d.ts","../node_modules/typescript/lib/lib.es2023.d.ts","../node_modules/typescript/lib/lib.es2024.d.ts","../node_modules/typescript/lib/lib.esnext.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.es2021.promise.d.ts","../node_modules/typescript/lib/lib.es2021.string.d.ts","../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../node_modules/typescript/lib/lib.es2021.intl.d.ts","../node_modules/typescript/lib/lib.es2022.array.d.ts","../node_modules/typescript/lib/lib.es2022.error.d.ts","../node_modules/typescript/lib/lib.es2022.intl.d.ts","../node_modules/typescript/lib/lib.es2022.object.d.ts","../node_modules/typescript/lib/lib.es2022.string.d.ts","../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../node_modules/typescript/lib/lib.es2023.array.d.ts","../node_modules/typescript/lib/lib.es2023.collection.d.ts","../node_modules/typescript/lib/lib.es2023.intl.d.ts","../node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2024.collection.d.ts","../node_modules/typescript/lib/lib.es2024.object.d.ts","../node_modules/typescript/lib/lib.es2024.promise.d.ts","../node_modules/typescript/lib/lib.es2024.regexp.d.ts","../node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2024.string.d.ts","../node_modules/typescript/lib/lib.esnext.array.d.ts","../node_modules/typescript/lib/lib.esnext.collection.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../node_modules/typescript/lib/lib.esnext.promise.d.ts","../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../node_modules/typescript/lib/lib.esnext.iterator.d.ts","../node_modules/typescript/lib/lib.esnext.float16.d.ts","../node_modules/typescript/lib/lib.esnext.error.d.ts","../node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/@types/node/web-globals/blob.d.ts","../node_modules/@types/node/web-globals/console.d.ts","../node_modules/@types/node/web-globals/crypto.d.ts","../node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/@types/node/web-globals/encoding.d.ts","../node_modules/@types/node/web-globals/events.d.ts","../node_modules/undici-types/utility.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client-stats.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/h2c-client.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-call-history.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/snapshot-agent.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/cache-interceptor.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/@types/node/web-globals/importmeta.d.ts","../node_modules/@types/node/web-globals/messaging.d.ts","../node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/@types/node/web-globals/performance.d.ts","../node_modules/@types/node/web-globals/storage.d.ts","../node_modules/@types/node/web-globals/streams.d.ts","../node_modules/@types/node/web-globals/timers.d.ts","../node_modules/@types/node/web-globals/url.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/inspector.generated.d.ts","../node_modules/@types/node/inspector/promises.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/path/posix.d.ts","../node_modules/@types/node/path/win32.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/quic.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/test/reporters.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/util/types.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/ws/index.d.mts","../node_modules/zod/v4/core/json-schema.d.cts","../node_modules/zod/v4/core/standard-schema.d.cts","../node_modules/zod/v4/core/registries.d.cts","../node_modules/zod/v4/core/to-json-schema.d.cts","../node_modules/zod/v4/core/util.d.cts","../node_modules/zod/v4/core/versions.d.cts","../node_modules/zod/v4/core/schemas.d.cts","../node_modules/zod/v4/core/checks.d.cts","../node_modules/zod/v4/core/errors.d.cts","../node_modules/zod/v4/core/core.d.cts","../node_modules/zod/v4/core/parse.d.cts","../node_modules/zod/v4/core/regexes.d.cts","../node_modules/zod/v4/locales/ar.d.cts","../node_modules/zod/v4/locales/az.d.cts","../node_modules/zod/v4/locales/be.d.cts","../node_modules/zod/v4/locales/bg.d.cts","../node_modules/zod/v4/locales/ca.d.cts","../node_modules/zod/v4/locales/cs.d.cts","../node_modules/zod/v4/locales/da.d.cts","../node_modules/zod/v4/locales/de.d.cts","../node_modules/zod/v4/locales/en.d.cts","../node_modules/zod/v4/locales/eo.d.cts","../node_modules/zod/v4/locales/es.d.cts","../node_modules/zod/v4/locales/fa.d.cts","../node_modules/zod/v4/locales/fi.d.cts","../node_modules/zod/v4/locales/fr.d.cts","../node_modules/zod/v4/locales/fr-CA.d.cts","../node_modules/zod/v4/locales/he.d.cts","../node_modules/zod/v4/locales/hu.d.cts","../node_modules/zod/v4/locales/hy.d.cts","../node_modules/zod/v4/locales/id.d.cts","../node_modules/zod/v4/locales/is.d.cts","../node_modules/zod/v4/locales/it.d.cts","../node_modules/zod/v4/locales/ja.d.cts","../node_modules/zod/v4/locales/ka.d.cts","../node_modules/zod/v4/locales/kh.d.cts","../node_modules/zod/v4/locales/km.d.cts","../node_modules/zod/v4/locales/ko.d.cts","../node_modules/zod/v4/locales/lt.d.cts","../node_modules/zod/v4/locales/mk.d.cts","../node_modules/zod/v4/locales/ms.d.cts","../node_modules/zod/v4/locales/nl.d.cts","../node_modules/zod/v4/locales/no.d.cts","../node_modules/zod/v4/locales/ota.d.cts","../node_modules/zod/v4/locales/ps.d.cts","../node_modules/zod/v4/locales/pl.d.cts","../node_modules/zod/v4/locales/pt.d.cts","../node_modules/zod/v4/locales/ru.d.cts","../node_modules/zod/v4/locales/sl.d.cts","../node_modules/zod/v4/locales/sv.d.cts","../node_modules/zod/v4/locales/ta.d.cts","../node_modules/zod/v4/locales/th.d.cts","../node_modules/zod/v4/locales/tr.d.cts","../node_modules/zod/v4/locales/ua.d.cts","../node_modules/zod/v4/locales/uk.d.cts","../node_modules/zod/v4/locales/ur.d.cts","../node_modules/zod/v4/locales/uz.d.cts","../node_modules/zod/v4/locales/vi.d.cts","../node_modules/zod/v4/locales/zh-CN.d.cts","../node_modules/zod/v4/locales/zh-TW.d.cts","../node_modules/zod/v4/locales/yo.d.cts","../node_modules/zod/v4/locales/index.d.cts","../node_modules/zod/v4/core/doc.d.cts","../node_modules/zod/v4/core/api.d.cts","../node_modules/zod/v4/core/json-schema-processors.d.cts","../node_modules/zod/v4/core/json-schema-generator.d.cts","../node_modules/zod/v4/core/index.d.cts","../node_modules/zod/v4/classic/errors.d.cts","../node_modules/zod/v4/classic/parse.d.cts","../node_modules/zod/v4/classic/schemas.d.cts","../node_modules/zod/v4/classic/checks.d.cts","../node_modules/zod/v4/classic/compat.d.cts","../node_modules/zod/v4/classic/from-json-schema.d.cts","../node_modules/zod/v4/classic/iso.d.cts","../node_modules/zod/v4/classic/coerce.d.cts","../node_modules/zod/v4/classic/external.d.cts","../node_modules/zod/index.d.cts","../src/client-message.ts","../src/server-message.ts","../src/stream-types.ts","../src/client-handler.ts","../node_modules/derivation/dist/streaming.d.ts","../node_modules/derivation/dist/input.d.ts","../node_modules/immutable/dist/immutable.d.ts","../node_modules/derivation/dist/z-set.d.ts","../node_modules/derivation/dist/z-map.d.ts","../node_modules/derivation/dist/reactive-set.d.ts","../node_modules/derivation/dist/reactive-map.d.ts","../node_modules/derivation/dist/reactive-map-source.d.ts","../node_modules/derivation/dist/reactive-set-source.d.ts","../node_modules/derivation/dist/index.d.ts","../src/client.ts","../src/iso.ts","../src/reactive-set-adapter.ts","../src/reactive-map-adapter.ts","../src/stream-adapter.ts","../src/weak-list.ts","../src/websocket-server.ts","../src/index.ts","../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[83,142,143,145,153,157,160,162,163,164,176],[83,144,145,153,157,160,162,163,164,176],[145,153,157,160,162,163,164,176],[83,145,153,157,160,162,163,164,176,184],[83,145,146,151,153,156,157,160,162,163,164,166,176,181,193],[83,145,146,147,153,156,157,160,162,163,164,176],[83,145,153,157,160,162,163,164,176],[83,145,148,153,157,160,162,163,164,176,194],[83,145,149,150,153,157,160,162,163,164,167,176],[83,145,150,153,157,160,162,163,164,176,181,190],[83,145,151,153,156,157,160,162,163,164,166,176],[83,144,145,152,153,157,160,162,163,164,176],[83,145,153,154,157,160,162,163,164,176],[83,145,153,155,156,157,160,162,163,164,176],[83,144,145,153,156,157,160,162,163,164,176],[83,145,153,156,157,158,160,162,163,164,176,181,193],[83,145,153,156,157,158,160,162,163,164,176,181,184],[83,132,145,153,156,157,159,160,162,163,164,166,176,181,193],[83,145,153,156,157,159,160,162,163,164,166,176,181,190,193],[83,145,153,157,159,160,161,162,163,164,176,181,190,193],[81,82,83,84,85,86,87,88,89,90,91,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200],[83,145,153,156,157,160,162,163,164,176],[83,145,153,157,160,162,164,176],[83,145,153,157,160,162,163,164,165,176,193],[83,145,153,156,157,160,162,163,164,166,176,181],[83,145,153,157,160,162,163,164,167,176],[83,145,153,157,160,162,163,164,168,176],[83,145,153,156,157,160,162,163,164,171,176],[83,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200],[83,145,153,157,160,162,163,164,173,176],[83,145,153,157,160,162,163,164,174,176],[83,145,150,153,157,160,162,163,164,166,176,184],[83,145,153,156,157,160,162,163,164,176,177],[83,145,153,157,160,162,163,164,176,178,194,197],[83,145,153,156,157,160,162,163,164,176,181,183,184],[83,145,153,157,160,162,163,164,176,182,184],[83,145,153,157,160,162,163,164,176,184,194],[83,145,153,157,160,162,163,164,176,185],[83,142,145,153,157,160,162,163,164,176,181,187],[83,145,153,157,160,162,163,164,176,181,186],[83,145,153,156,157,160,162,163,164,176,188,189],[83,145,153,157,160,162,163,164,176,188,189],[83,145,150,153,157,160,162,163,164,166,176,181,190],[83,145,153,157,160,162,163,164,176,191],[83,145,153,157,160,162,163,164,166,176,192],[83,145,153,157,159,160,162,163,164,174,176,193],[83,145,153,157,160,162,163,164,176,194,195],[83,145,150,153,157,160,162,163,164,176,195],[83,145,153,157,160,162,163,164,176,181,196],[83,145,153,157,160,162,163,164,165,176,197],[83,145,153,157,160,162,163,164,176,198],[83,145,148,153,157,160,162,163,164,176],[83,145,150,153,157,160,162,163,164,176],[83,145,153,157,160,162,163,164,176,194],[83,132,145,153,157,160,162,163,164,176],[83,145,153,157,160,162,163,164,176,193],[83,145,153,157,160,162,163,164,176,199],[83,145,153,157,160,162,163,164,171,176],[83,145,153,157,160,162,163,164,176,189],[83,132,145,153,156,157,158,160,162,163,164,171,176,181,184,193,196,197,199],[83,145,153,157,160,162,163,164,176,181,200],[83,145,153,156,157,159,160,161,162,163,164,166,176,181,190,193,200,201],[83,145,153,157,160,162,163,164,176,284,285,287,288,289,290,291,292],[83,145,153,157,160,162,163,164,176,284],[83,145,153,157,160,162,163,164,176,284,288,290],[83,145,153,157,160,162,163,164,176,284,288,289],[83,145,153,157,160,162,163,164,176,284,287,289],[83,145,153,157,160,162,163,164,176,284,287,290],[83,145,153,157,160,162,163,164,176,286,287],[83,145,153,157,160,162,163,164,176,286,288],[83,98,101,104,105,145,153,157,160,162,163,164,176,193],[83,101,145,153,157,160,162,163,164,176,181,193],[83,101,105,145,153,157,160,162,163,164,176,193],[83,145,153,157,160,162,163,164,176,181],[83,95,145,153,157,160,162,163,164,176],[83,99,145,153,157,160,162,163,164,176],[83,97,98,101,145,153,157,160,162,163,164,176,193],[83,145,153,157,160,162,163,164,166,176,190],[83,145,153,157,160,162,163,164,176,201],[83,95,145,153,157,160,162,163,164,176,201],[83,97,101,145,153,157,160,162,163,164,166,176,193],[83,92,93,94,96,100,145,153,156,157,160,162,163,164,176,181,193],[83,101,109,117,145,153,157,160,162,163,164,176],[83,93,99,145,153,157,160,162,163,164,176],[83,101,126,127,145,153,157,160,162,163,164,176],[83,93,96,101,145,153,157,160,162,163,164,176,184,193,201],[83,101,145,153,157,160,162,163,164,176],[83,97,101,145,153,157,160,162,163,164,176,193],[83,92,145,153,157,160,162,163,164,176],[83,95,96,97,99,100,101,102,103,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,127,128,129,130,131,145,153,157,160,162,163,164,176],[83,101,119,122,145,153,157,160,162,163,164,176],[83,101,109,110,111,145,153,157,160,162,163,164,176],[83,99,101,110,112,145,153,157,160,162,163,164,176],[83,100,145,153,157,160,162,163,164,176],[83,93,95,101,145,153,157,160,162,163,164,176],[83,101,105,110,112,145,153,157,160,162,163,164,176],[83,105,145,153,157,160,162,163,164,176],[83,99,101,104,145,153,157,160,162,163,164,176,193],[83,93,97,101,109,145,153,157,160,162,163,164,176],[83,101,119,145,153,157,160,162,163,164,176],[83,112,145,153,157,160,162,163,164,176],[83,95,101,126,145,153,157,160,162,163,164,176,184,199,201],[83,145,153,157,160,162,163,164,176,278],[83,145,153,157,160,162,163,164,176,269],[83,145,153,157,160,162,163,164,176,269,272],[83,145,153,157,160,162,163,164,176,264,267,269,270,271,272,273,274,275,276,277],[83,145,153,157,160,162,163,164,176,203,205,272],[83,145,153,157,160,162,163,164,176,269,270],[83,145,153,157,160,162,163,164,176,204,269,271],[83,145,153,157,160,162,163,164,176,205,207,209,210,211,212],[83,145,153,157,160,162,163,164,176,207,209,211,212],[83,145,153,157,160,162,163,164,176,207,209,211],[83,145,153,157,160,162,163,164,176,204,207,209,210,212],[83,145,153,157,160,162,163,164,176,203,205,206,207,208,209,210,211,212,213,214,264,265,266,267,268],[83,145,153,157,160,162,163,164,176,203,205,206,209],[83,145,153,157,160,162,163,164,176,205,206,209],[83,145,153,157,160,162,163,164,176,209,212],[83,145,153,157,160,162,163,164,176,203,204,206,207,208,210,211,212],[83,145,153,157,160,162,163,164,176,203,204,205,209,269],[83,145,153,157,160,162,163,164,176,209,210,211,212],[83,145,153,157,160,162,163,164,176,211],[83,145,153,157,160,162,163,164,176,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263],[83,145,153,157,160,162,163,164,176,202,280,281,282],[83,145,153,157,160,162,163,164,176,279],[83,145,153,157,160,162,163,164,176,280,281,282,293],[83,145,153,157,160,162,163,164,176,282,294,296,297,298,300],[83,145,153,157,160,162,163,164,176,286,293],[83,145,153,157,160,162,163,164,176,282,293,295],[83,145,153,157,159,160,162,163,164,176,193,202,282,283,293,299]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"dd0109710de4cd93e245121ab86d8c66d20f3ead80074b68e9c3e349c4f53342","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"cf83d90d5faf27b994c2e79af02e32b555dbfe42cd9bd1571445f2168d1f4e2d","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"0e28335ac43f4d94dd2fe6d9e6fa6813570640839addd10d309d7985f33a6308","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"961cf7535b9c521cd634055b1b6ac49b94d055f0b573ce7fdc4cfaddab080b7c","impliedFormat":1},{"version":"806a8c6daae69e5695e7200d9eca6bc1e4298f38d90edda3ce67a794da31a24f","impliedFormat":1},{"version":"ac86245c2f31335bfd52cbe7fc760f9fc4f165387875869a478a6d9616a95e72","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"9d96a7ce809392ff2cb99691acf7c62e632fe56897356ba013b689277aca3619","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"27c0a08e343c6a0ae17bd13ba6d44a9758236dc904cd5e4b43456996cd51f520","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"6f80e51ba310608cd71bcdc09a171d7bbfb3b316048601c9ec215ce16a8dcfbc","impliedFormat":1},{"version":"a3bdc774995d56caaac759a424831091bb22450ca3590f34dae53d98323be191","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"2ca2bca6845a7234eff5c3d192727a068fca72ac565f3c819c6b04ccc83dadc0","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"6c00f77f0335ae0c18bd45a6c7c9c97c9625fb7e5dd6d5936eadf70718bce52e","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"586eaf66bace2e731cee0ddfbfac326ad74a83c1acfeac4afb2db85ad23226c7","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"d1a14d87cedcf4f0b8173720d6eb29cc02878bf2b6dabf9c9d9cee742f275368","impliedFormat":1},{"version":"e60efae9fe48a2955f66bf4cbf0f082516185b877daf50d9c5e2a009660a7714","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"cd9189eacf0f9143b8830e9d6769335aa6d902c04195f04145bcbf19e7f26fcb","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"316f1486e15cbf7896425f0a16dfe12d447dd57cfb3244b8b119c77df870858f","impliedFormat":99},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"82919acbb38870fcf5786ec1292f0f5afe490f9b3060123e48675831bd947192","impliedFormat":1},{"version":"e222701788ec77bd57c28facbbd142eadf5c749a74d586bc2f317db7e33544b1","impliedFormat":1},{"version":"09154713fae0ed7befacdad783e5bd1970c06fc41a5f866f7f933b96312ce764","impliedFormat":1},{"version":"8d67b13da77316a8a2fabc21d340866ddf8a4b99e76a6c951cc45189142df652","impliedFormat":1},{"version":"a91c8d28d10fee7fe717ddf3743f287b68770c813c98f796b6e38d5d164bd459","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"f6f827cd43e92685f194002d6b52a9408309cda1cec46fb7ca8489a95cbd2fd4","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"a270a1a893d1aee5a3c1c8c276cd2778aa970a2741ee2ccf29cc3210d7da80f5","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8926594ee895917e90701d8cbb5fdf77fc238b266ac540f929c7253f8ad6233d","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"ed8763205f02fb65e84eff7432155258df7f93b7d938f01785cb447d043d53f3","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"d4a5b1d2ff02c37643e18db302488cd64c342b00e2786e65caac4e12bda9219b","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},{"version":"75e2155ab7787c098fdf04f5161363d3612863afbf793e73c99875cdf1c33e3b","signature":"08acdba2da9da90736cf77d5c8b17c696a90d1e97683d0506ae597e283b7f4f0"},{"version":"c7b84625548501dfd4093f2c0494c3ee746e486d667bff5749fe00cb3339e0fa","signature":"13a856984d1ae0d08d151cb36286f626e2cb22f1556b073c9d2319574151a826"},{"version":"a146105a9dabac5875b609a8b4780e1eb99cb097cf55a10d5bca46e2e5e1e45f","signature":"ad7feb41aeb620fb909db554a6ace2bc7c52559ef8ff4114ca565c01aa511c8a"},{"version":"16a11af6ac64b3daf5e0d3b455bf911cddb61fcaf324d66edfbc091e7ba897c7","signature":"3350108ee134f7fd5dd43f1c242a18361b5d8d59ee7d220aae4b8eff0d3443c3"},{"version":"01ac81b7e520fc48e2d4e3f36924c7382d28b998c32a778162b39ec585f50402","impliedFormat":99},{"version":"af4b7e94b434c88dfb8ddaa1e4974aac553359ebdad4fb9cced334d201318cef","impliedFormat":99},{"version":"2cee3ea4c39a53326148e6e78109affd48fa69eae386871c1f440315a6120f40","impliedFormat":1},{"version":"648875e9b92c6859be3b6a5bd87da774fa8f0da290484f3809a7f7c3e64aad60","impliedFormat":99},{"version":"26d18d11348e4b369e0d617b9ef68abb599125e5c3e9928672e9d943e4f73ca3","impliedFormat":99},{"version":"93efa81d8c37a262ac3a753edee786c802371287bf2fa8626860e61b98c7f671","impliedFormat":99},{"version":"412f0253962e71bae8e2ac99a940a05ed5460e0f71211d232bf6375d890b4f0a","impliedFormat":99},{"version":"7946ae27a233f6c320f0a467469f764534e385a34f2e9f4b3fbe0a7b9e71c55d","impliedFormat":99},{"version":"09a87949c6e04e4785e810ecf6881834397e8d16bffb7573a1729e2fd8efc797","impliedFormat":99},{"version":"a7c5ceca7506ceb8dce9285c8015578777e265ecf75c2f4e9137ca635ed72bd6","impliedFormat":99},{"version":"31dd74e827b4b2e0c4ab52eb57cb1b69c4f644b6764cec4ea51f7f9b941463e9","signature":"bf634ad744c088f07bc071c879d6ee215aaeb6a84b2c9501c6cef34f6684b1f7"},{"version":"1127500de20db21b21d778951606f0df011e956c591d6d8b100570455247a2e3","signature":"fefbb26c133866b33bd122746395b719b6ad5bc3a0f2067ffc45ac44c5615b35"},{"version":"8de19e455f0fb252953fd1f548fb0849fdb370ea7b08ae51f00c7e09fc4f0c31","signature":"94704cdadf2e655845778ee136285dd5dbbf479bc313b5e9390fd99543ae4ef5"},{"version":"40084d65a3bb5a0452457c80f4dd27b2f7b8f19f1abdc3de79b9cb49e337465a","signature":"49f600f7654d0d80063b2acfafeaca33d9563e2be9bc7f6abd3d1875fe662656"},{"version":"38f32a3ec491844c08932edcd448bd9ed594ac7a18c07c9dcb431a612206c396","signature":"b440b398820983eae961abecb68d10ac4b45b042cc6dc3e36fce1faa89499a2b"},{"version":"bf9c76682da1bb38a8e7808221edc1f12616bcc3c66dc8037b6a1a211a047832","signature":"0ef9115f919ad333c78d38cd3ceac3685978b51edd05668f15ef8aee695f1975"},{"version":"5199123621a0e305463136766e5682154b1b325b8eb0e6ea3b3af37152a3c5ad","signature":"5c31bb97b024b80d259026f07c439ef508537e4acc9c19287cdba092b74dad30"},{"version":"7e0a1137d1c2f4548a543b820c393e4369b6a37de36ca913b7c046f3532f002e","signature":"7dac7319b0c8f7889298e5a253c6f988415fb5500a3811800b83179c6a9089b3"},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[280,283],[294,301]],"options":{"allowJs":true,"declaration":true,"emitDeclarationOnly":false,"esModuleInterop":true,"module":99,"outDir":"./","skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[142,1],[143,1],[144,2],[83,3],[145,4],[146,5],[147,6],[81,7],[148,8],[149,9],[150,10],[151,11],[152,12],[153,13],[154,13],[155,14],[156,15],[157,16],[158,17],[84,7],[82,7],[159,18],[160,19],[161,20],[201,21],[162,22],[163,23],[164,22],[165,24],[166,25],[167,26],[168,27],[169,27],[170,27],[171,28],[172,29],[173,30],[174,31],[175,32],[176,33],[177,33],[178,34],[179,7],[180,7],[181,35],[182,36],[183,35],[184,37],[185,38],[186,39],[187,40],[188,41],[189,42],[190,43],[191,44],[192,45],[193,46],[194,47],[195,48],[196,49],[197,50],[198,51],[85,22],[86,7],[87,52],[88,53],[89,7],[90,54],[91,7],[133,55],[134,56],[135,57],[136,57],[137,58],[138,7],[139,4],[140,59],[141,56],[199,60],[200,61],[202,62],[302,62],[293,63],[285,64],[291,65],[290,66],[292,67],[289,68],[284,7],[288,69],[287,70],[286,7],[79,7],[80,7],[14,7],[13,7],[2,7],[15,7],[16,7],[17,7],[18,7],[19,7],[20,7],[21,7],[22,7],[3,7],[23,7],[24,7],[4,7],[25,7],[29,7],[26,7],[27,7],[28,7],[30,7],[31,7],[32,7],[5,7],[33,7],[34,7],[35,7],[36,7],[6,7],[40,7],[37,7],[38,7],[39,7],[41,7],[7,7],[42,7],[47,7],[48,7],[43,7],[44,7],[45,7],[46,7],[8,7],[52,7],[49,7],[50,7],[51,7],[53,7],[9,7],[54,7],[55,7],[56,7],[58,7],[57,7],[59,7],[60,7],[10,7],[61,7],[62,7],[63,7],[11,7],[64,7],[65,7],[66,7],[67,7],[68,7],[1,7],[69,7],[70,7],[12,7],[74,7],[72,7],[77,7],[76,7],[71,7],[75,7],[73,7],[78,7],[109,71],[121,72],[107,73],[122,74],[131,75],[98,76],[99,77],[97,78],[130,79],[125,80],[129,81],[101,82],[118,83],[100,84],[128,85],[95,86],[96,80],[102,87],[103,7],[108,88],[106,87],[93,89],[132,90],[123,91],[112,92],[111,87],[113,93],[116,94],[110,95],[114,96],[126,79],[104,97],[105,98],[117,99],[94,74],[120,100],[119,87],[115,101],[124,7],[92,7],[127,102],[279,103],[273,104],[277,105],[274,105],[270,104],[278,106],[275,107],[276,105],[271,108],[272,109],[266,110],[210,111],[212,112],[265,7],[211,113],[269,114],[268,115],[267,116],[203,7],[213,111],[214,7],[205,117],[209,118],[204,7],[206,119],[207,120],[208,7],[215,121],[216,121],[217,121],[218,121],[219,121],[220,121],[221,121],[222,121],[223,121],[224,121],[225,121],[226,121],[227,121],[229,121],[228,121],[230,121],[231,121],[232,121],[233,121],[264,122],[234,121],[235,121],[236,121],[237,121],[238,121],[239,121],[240,121],[241,121],[242,121],[243,121],[244,121],[245,121],[246,121],[248,121],[247,121],[249,121],[250,121],[251,121],[252,121],[253,121],[254,121],[255,121],[256,121],[257,121],[258,121],[259,121],[260,121],[263,121],[261,121],[262,121],[283,123],[280,124],[294,125],[301,126],[295,127],[297,128],[296,128],[281,124],[298,128],[282,7],[299,7],[300,129]],"version":"5.9.3"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export default class WeakList {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.items = [];
|
|
4
|
+
}
|
|
5
|
+
add(value) {
|
|
6
|
+
this.items.push(new WeakRef(value));
|
|
7
|
+
}
|
|
8
|
+
*[Symbol.iterator]() {
|
|
9
|
+
const newItems = [];
|
|
10
|
+
for (const ref of this.items) {
|
|
11
|
+
const value = ref.deref();
|
|
12
|
+
if (value !== undefined) {
|
|
13
|
+
yield value;
|
|
14
|
+
newItems.push(ref);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
this.items = newItems;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Server } from "http";
|
|
2
|
+
import { StreamEndpoints, StreamDefinitions } from "./stream-types";
|
|
3
|
+
import { Graph } from "derivation";
|
|
4
|
+
export declare function setupWebSocketServer<Defs extends StreamDefinitions>(graph: Graph, server: Server, endpoints: StreamEndpoints<Defs>, path?: string): void;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { parse } from "url";
|
|
2
|
+
import { WebSocketServer } from "ws";
|
|
3
|
+
import { ClientHandler } from "./client-handler";
|
|
4
|
+
import WeakList from "./weak-list";
|
|
5
|
+
export function setupWebSocketServer(graph, server, endpoints, path = "/api/ws") {
|
|
6
|
+
const clients = new WeakList();
|
|
7
|
+
graph.afterStep(() => {
|
|
8
|
+
for (const client of clients) {
|
|
9
|
+
client.handleStep();
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
const wss = new WebSocketServer({ noServer: true });
|
|
13
|
+
// Handle WebSocket connections for reactive streams
|
|
14
|
+
wss.on("connection", (ws, req) => {
|
|
15
|
+
const { pathname } = parse(req.url || "/", true);
|
|
16
|
+
if (pathname === path) {
|
|
17
|
+
const client = new ClientHandler(ws, endpoints);
|
|
18
|
+
clients.add(client);
|
|
19
|
+
ws.on("message", (msg) => client.handleMessage(msg));
|
|
20
|
+
ws.on("close", () => client.handleDisconnect());
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
// Handle HTTP upgrade (for /api/ws)
|
|
24
|
+
server.on("upgrade", (req, socket, head) => {
|
|
25
|
+
const { pathname } = parse(req.url || "/", true);
|
|
26
|
+
if (pathname === "/api/ws") {
|
|
27
|
+
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
28
|
+
wss.emit("connection", ws, req);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
socket.destroy();
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@derivation/rpc",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"homepage": "https://github.com/derivationjs/rpc",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/derivationjs/rpc.git"
|
|
8
|
+
},
|
|
9
|
+
"description": "An RPC library for derivation.",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"author": "Daniel Waterworth",
|
|
12
|
+
"main": "dist/index.js",
|
|
13
|
+
"types": "dist/index.d.ts",
|
|
14
|
+
"type": "module",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./iso": {
|
|
21
|
+
"types": "./dist/iso.d.ts",
|
|
22
|
+
"import": "./dist/iso.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"prepare": "tsc -p tsconfig.json",
|
|
30
|
+
"build": "tsc -p tsconfig.json"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@types/node": "^25.0.3",
|
|
34
|
+
"@types/ws": "^8.18.1",
|
|
35
|
+
"derivation": "^0.1.1",
|
|
36
|
+
"immutable": "^5.1.4",
|
|
37
|
+
"ws": "^8.18.3",
|
|
38
|
+
"zod": "^4.3.3"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"typescript": "^5.9.3"
|
|
42
|
+
}
|
|
43
|
+
}
|