@classcad/mcp 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -87
- package/dist/app/SOURCE.txt +4 -0
- package/dist/app/assets/index-54a14bc0.css +8 -0
- package/dist/app/assets/index-c650c783.js +11257 -0
- package/dist/app/assets/troika-three-text.esm-188d86b5.js +220 -0
- package/dist/app/favicon.svg +98 -0
- package/dist/app/index.html +19 -0
- package/dist/app/manifest.json +14 -0
- package/dist/auth.d.ts +8 -0
- package/dist/auth.js +49 -10
- package/dist/auth.js.map +1 -1
- package/dist/backend.d.ts +8 -0
- package/dist/backend.js +39 -0
- package/dist/backend.js.map +1 -0
- package/dist/client.d.ts +48 -11
- package/dist/client.js +152 -167
- package/dist/client.js.map +1 -1
- package/dist/daemon.d.ts +0 -2
- package/dist/daemon.js +77 -62
- package/dist/daemon.js.map +1 -1
- package/dist/engine/key.d.ts +29 -0
- package/dist/engine/key.js +145 -0
- package/dist/engine/key.js.map +1 -0
- package/dist/engine/wasm-worker.js +7 -7
- package/dist/engine/wasm-worker.js.map +1 -1
- package/dist/engine/wasm.d.ts +16 -14
- package/dist/engine/wasm.js +22 -30
- package/dist/engine/wasm.js.map +1 -1
- package/dist/mcp-server.d.ts +4 -4
- package/dist/mcp-server.js +72 -28
- package/dist/mcp-server.js.map +1 -1
- package/dist/queue.js +1 -1
- package/dist/queue.js.map +1 -1
- package/dist/server.js +69 -36
- package/dist/server.js.map +1 -1
- package/dist/share/hub.d.ts +70 -0
- package/dist/share/hub.js +494 -0
- package/dist/share/hub.js.map +1 -0
- package/dist/share/protocol.d.ts +87 -0
- package/dist/share/protocol.js +54 -0
- package/dist/share/protocol.js.map +1 -0
- package/dist/share/relay.d.ts +45 -0
- package/dist/share/relay.js +230 -0
- package/dist/share/relay.js.map +1 -0
- package/dist/share/server.d.ts +27 -0
- package/dist/share/server.js +399 -0
- package/dist/share/server.js.map +1 -0
- package/dist/share/session.d.ts +120 -0
- package/dist/share/session.js +336 -0
- package/dist/share/session.js.map +1 -0
- package/dist/tools/auth.js +1 -1
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/docs.js +3 -2
- package/dist/tools/docs.js.map +1 -1
- package/dist/tools/lifecycle.js +36 -9
- package/dist/tools/lifecycle.js.map +1 -1
- package/dist/tools/share.d.ts +18 -0
- package/dist/tools/share.js +277 -0
- package/dist/tools/share.js.map +1 -0
- package/dist/tools/viewer.d.ts +1 -1
- package/dist/tools/viewer.js +11 -6
- package/dist/tools/viewer.js.map +1 -1
- package/dist/viewer-page/viewer.js +19 -2
- package/package.json +4 -3
- package/dist/bridge/protocol.d.ts +0 -87
- package/dist/bridge/protocol.js +0 -14
- package/dist/bridge/protocol.js.map +0 -1
- package/dist/bridge/server.d.ts +0 -35
- package/dist/bridge/server.js +0 -236
- package/dist/bridge/server.js.map +0 -1
- package/dist/tools/bridge.d.ts +0 -4
- package/dist/tools/bridge.js +0 -115
- package/dist/tools/bridge.js.map +0 -1
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
import { type Client } from '../client.js';
|
|
3
|
+
import type { EngineExecuteResult } from '../engine/wasm.js';
|
|
4
|
+
import { type Role, type SessionFrame } from './protocol.js';
|
|
5
|
+
/** An invite to this session: the token a guest joins with, what it may do, and a name to show for it. */
|
|
6
|
+
export type Invite = {
|
|
7
|
+
invite: string;
|
|
8
|
+
role: Role;
|
|
9
|
+
name: string;
|
|
10
|
+
};
|
|
11
|
+
/** What a hub is given by its session. */
|
|
12
|
+
export type HubOptions = {
|
|
13
|
+
/** The session's engine client: its replies are fanned out, guests' commands run on it. */
|
|
14
|
+
client: Client;
|
|
15
|
+
/** Runs work in the session's tool queue. */
|
|
16
|
+
queue: <T>(work: () => Promise<T>) => Promise<T>;
|
|
17
|
+
/** The frames a server would send the host: PeerJoined, PeerLeft, Presence. */
|
|
18
|
+
toHost: (frame: SessionFrame) => void;
|
|
19
|
+
log?: (msg: string) => void;
|
|
20
|
+
};
|
|
21
|
+
/** A session's sharing, as the host uses it. */
|
|
22
|
+
export type SessionHub = {
|
|
23
|
+
/** The host's peer id, as guests see it on presence frames. */
|
|
24
|
+
readonly hostId: string;
|
|
25
|
+
/** Mints an invite. It stays good for the life of the session, across engines. */
|
|
26
|
+
createInvite: (role?: Role, name?: string) => Invite;
|
|
27
|
+
/** Takes an invite back; whoever joined with it is closed (`kicked`). */
|
|
28
|
+
revokeInvite: (token: string) => {
|
|
29
|
+
invite: string;
|
|
30
|
+
revoked: boolean;
|
|
31
|
+
kicked: number;
|
|
32
|
+
};
|
|
33
|
+
/** The invite behind a token, if this session minted it. */
|
|
34
|
+
invite: (token: string) => Invite | undefined;
|
|
35
|
+
/** A guest's socket; `token` is a known invite. */
|
|
36
|
+
join: (ws: WebSocket, token: string) => void;
|
|
37
|
+
/** Presence from the host to every guest (kept for those who join later). */
|
|
38
|
+
sendPresence: (channel: string, data: Record<string, any>) => void;
|
|
39
|
+
/** Sends every guest the whole model again: after the engine was replaced, or when in doubt. */
|
|
40
|
+
resync: () => Promise<void>;
|
|
41
|
+
/** Closes every guest (the engine behind the session is another one now); invites stay. */
|
|
42
|
+
kick: (reason: string) => void;
|
|
43
|
+
/** How many guests are in the session, served here or piped through to a server. */
|
|
44
|
+
readonly guests: number;
|
|
45
|
+
/** The session is over: every guest is closed, every invite forgotten. */
|
|
46
|
+
close: () => void;
|
|
47
|
+
};
|
|
48
|
+
/** One engine reply, taken apart. */
|
|
49
|
+
type Pieces = {
|
|
50
|
+
/** The command the reply answers, and its transaction id: every frame of the reply carries both. */
|
|
51
|
+
from: string;
|
|
52
|
+
tx: unknown;
|
|
53
|
+
/** JSON-Patch blocks against the structure, in emission order. */
|
|
54
|
+
patches: unknown[][];
|
|
55
|
+
/** Graphic packages (the containers the command changed). */
|
|
56
|
+
packages: Record<string, any>[];
|
|
57
|
+
/** GetTree/Sync: the structure. */
|
|
58
|
+
structure?: unknown;
|
|
59
|
+
/** The Result frame without structure and graphic. */
|
|
60
|
+
result: Record<string, any>;
|
|
61
|
+
};
|
|
62
|
+
/** Translates one reply of the engine into what a server's frames are made of. */
|
|
63
|
+
export declare function pieces(req: Record<string, any>, res: EngineExecuteResult): Pieces;
|
|
64
|
+
/**
|
|
65
|
+
* The sharing of one MCP session. Created with the session, before any engine
|
|
66
|
+
* runs: an invite is good from then on, and the first guest that joins with it
|
|
67
|
+
* starts the engine if nothing else has.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createSessionHub(opts: HubOptions): SessionHub;
|
|
70
|
+
export {};
|
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
// share/hub.ts — a ClassCAD server's session layer, for the MCP's own engine.
|
|
2
|
+
//
|
|
3
|
+
// On a server a session is shared by invite: guests connect with
|
|
4
|
+
// ?invite=<token>, the server fans every command's frames out to everyone and
|
|
5
|
+
// relays presence. The MCP's own engine (engine/wasm.ts) has no server around
|
|
6
|
+
// it — this module is that part of one. The MCP session is the host; apps
|
|
7
|
+
// (buerli's WSClient, unchanged) and other agents are guests.
|
|
8
|
+
//
|
|
9
|
+
// A guest sends what it would send a server and gets a server's frames back:
|
|
10
|
+
// SessionJoined, then the presence snapshot
|
|
11
|
+
// per command StructurePatch · Graphic · Result (streaming connections)
|
|
12
|
+
// Result with the graphic on it (bundled connections)
|
|
13
|
+
// Presence from the other guests and from the host
|
|
14
|
+
// The engine itself speaks an older dialect (Patch/ops, binary packages, the
|
|
15
|
+
// value nested in `result`); pieces() translates it.
|
|
16
|
+
//
|
|
17
|
+
// Where this differs from a server, and why:
|
|
18
|
+
// • Emission. A server generates per command what the ORIGINATOR's
|
|
19
|
+
// connection asked for, so a client that suppresses its emission starves
|
|
20
|
+
// the others until someone pulls. The published engine always generates
|
|
21
|
+
// everything, so here every participant gets every change, in the form its
|
|
22
|
+
// own connection asked for. Get/SetEmissionConfig are answered here and
|
|
23
|
+
// only decide that form.
|
|
24
|
+
// • Order. A guest's command waits for the session's tool queue: it never
|
|
25
|
+
// lands in the middle of an agent's script. Pulls (GetTree) do not wait.
|
|
26
|
+
// • Database settings are the engine's, shared by all: the ones the MCP's
|
|
27
|
+
// renders need stay on, whatever a guest sets.
|
|
28
|
+
//
|
|
29
|
+
// A session that runs on a ClassCAD worker needs none of this: the server
|
|
30
|
+
// speaks the protocol itself. Guests of such a session are piped through to
|
|
31
|
+
// it (pipe()), so the app's link is the same for both engines.
|
|
32
|
+
//
|
|
33
|
+
// An engine that runs in the page of an app is served the same way by that
|
|
34
|
+
// page: session/host.ts in @buerli.io/classcad is this module's twin (the same
|
|
35
|
+
// translation, the same forms). Keep the two in step.
|
|
36
|
+
import WebSocket from 'ws';
|
|
37
|
+
import { randomUUID } from 'node:crypto';
|
|
38
|
+
import { deflateRawSync } from 'node:zlib';
|
|
39
|
+
import { GRAPHIC_SETTINGS } from '../client.js';
|
|
40
|
+
import { DEFAULT_EMISSION, HOST_CHANNELS, PRESENCE_MAX_BYTES, SERVER_CHANNELS } from './protocol.js';
|
|
41
|
+
/** Pulls: they change nothing, so they concern only the one who asked and need not wait for the tool queue. */
|
|
42
|
+
const READS = new Set(['GetTree', 'Sync']);
|
|
43
|
+
/** The engine's message level for an error; a Result at this level rejects in the client. */
|
|
44
|
+
const ERROR = 51;
|
|
45
|
+
/** How often a guest is pinged; one that misses a beat is closed. */
|
|
46
|
+
const HEARTBEAT_MS = 30_000;
|
|
47
|
+
/** A Result frame that fails `req`, the way a server words an error. */
|
|
48
|
+
const errorResult = (req, message, code = 0) => ({
|
|
49
|
+
command: 'Result',
|
|
50
|
+
_from_: String(req.command),
|
|
51
|
+
_transactionID_: req.transactionID,
|
|
52
|
+
maxLevel: ERROR,
|
|
53
|
+
messages: [{ message, level: ERROR, levelStr: 'ERROR', code, timestamp: Date.now() }],
|
|
54
|
+
});
|
|
55
|
+
/** A streaming connection (buerli's WSClient) takes patches and graphics as frames of their own. */
|
|
56
|
+
const streams = (cfg) => cfg.sendStructure_Patch === true;
|
|
57
|
+
/** Translates one reply of the engine into what a server's frames are made of. */
|
|
58
|
+
export function pieces(req, res) {
|
|
59
|
+
const from = String(req.command);
|
|
60
|
+
const tx = req.transactionID;
|
|
61
|
+
const out = { from, tx, patches: [], packages: res.binaryMessages ?? [], result: { command: 'Result', _from_: from, _transactionID_: tx } };
|
|
62
|
+
// Errors the engine reported on the side (errorState 2 and up).
|
|
63
|
+
const side = [];
|
|
64
|
+
let answer;
|
|
65
|
+
for (const m of res.messages ?? []) {
|
|
66
|
+
if (m?.command === 'Patch' && Array.isArray(m.ops) && m.ops.length)
|
|
67
|
+
out.patches.push(m.ops);
|
|
68
|
+
else if (m?.command === 'ErrorMessage' && Number(m.attributes?.errorState) >= 2)
|
|
69
|
+
side.push({ level: ERROR, levelStr: 'ERROR', code: m.attributes?.errorCode ?? 0, message: String(m.attributes?.errorMessage ?? 'engine error') });
|
|
70
|
+
else if (m?.command === 'Result')
|
|
71
|
+
answer ??= m;
|
|
72
|
+
}
|
|
73
|
+
if (!answer) {
|
|
74
|
+
out.result = errorResult(req, side.length ? side.map(e => e.message).join('; ') : `the engine returned no result for ${from}`);
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
if (READS.has(from)) {
|
|
78
|
+
out.structure = answer.structure ?? answer.result;
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
let value = answer.result;
|
|
82
|
+
let maxLevel = typeof answer.maxLevel === 'number' ? answer.maxLevel : undefined;
|
|
83
|
+
let messages = Array.isArray(answer.messages) ? answer.messages : undefined;
|
|
84
|
+
let streamData = answer.streamData;
|
|
85
|
+
// The engine nests an Execute's value next to its level and messages: { result, maxLevel, messages }.
|
|
86
|
+
if (from === 'Execute' && value && typeof value === 'object' && !Array.isArray(value) && 'result' in value) {
|
|
87
|
+
if (typeof value.maxLevel === 'number')
|
|
88
|
+
maxLevel = Math.max(maxLevel ?? 0, value.maxLevel);
|
|
89
|
+
if (Array.isArray(value.messages))
|
|
90
|
+
messages = [...(messages ?? []), ...value.messages];
|
|
91
|
+
streamData ??= value.streamData;
|
|
92
|
+
value = value.result;
|
|
93
|
+
}
|
|
94
|
+
// An error reported only on the side must not pass as an empty success.
|
|
95
|
+
if (from === 'Execute' && side.length && (maxLevel ?? 0) < ERROR && value == null) {
|
|
96
|
+
maxLevel = ERROR;
|
|
97
|
+
messages = [...(messages ?? []), ...side];
|
|
98
|
+
}
|
|
99
|
+
out.result.result = value;
|
|
100
|
+
if (maxLevel !== undefined)
|
|
101
|
+
out.result.maxLevel = maxLevel;
|
|
102
|
+
if (messages?.length)
|
|
103
|
+
out.result.messages = messages;
|
|
104
|
+
if (streamData)
|
|
105
|
+
out.result.streamData = streamData;
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
/** Keeps the settings the MCP's renders need switched on in a guest's setDatabaseSettings. */
|
|
109
|
+
function keepGraphicSettings(req) {
|
|
110
|
+
if (!Array.isArray(req.task))
|
|
111
|
+
return;
|
|
112
|
+
for (const task of req.task) {
|
|
113
|
+
if (!task || typeof task !== 'object' || !('v1.common.setDatabaseSettings' in task))
|
|
114
|
+
continue;
|
|
115
|
+
const args = task['v1.common.setDatabaseSettings'];
|
|
116
|
+
const params = Array.isArray(args) ? args[0] : args;
|
|
117
|
+
if (params && typeof params === 'object')
|
|
118
|
+
Object.assign(params, GRAPHIC_SETTINGS);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The sharing of one MCP session. Created with the session, before any engine
|
|
123
|
+
* runs: an invite is good from then on, and the first guest that joins with it
|
|
124
|
+
* starts the engine if nothing else has.
|
|
125
|
+
*/
|
|
126
|
+
export function createSessionHub(opts) {
|
|
127
|
+
const { client, queue, toHost } = opts;
|
|
128
|
+
const log = opts.log ?? (() => { });
|
|
129
|
+
const hostId = randomUUID();
|
|
130
|
+
const invites = new Map();
|
|
131
|
+
const guests = new Set();
|
|
132
|
+
const hostPresence = new Map();
|
|
133
|
+
/** Who asked for what: a guest's request, until its reply went out. */
|
|
134
|
+
const askedBy = new WeakMap();
|
|
135
|
+
let closed = false;
|
|
136
|
+
const raw = (guest, frame) => {
|
|
137
|
+
if (guest.ws.readyState === WebSocket.OPEN)
|
|
138
|
+
guest.ws.send(frame, { binary: typeof frame !== 'string' });
|
|
139
|
+
};
|
|
140
|
+
const send = (guest, frame) => raw(guest, JSON.stringify(frame));
|
|
141
|
+
/** The complete graphic, as a server puts it on a GetTree Result. */
|
|
142
|
+
const completeGraphic = () => ({ containers: client.engineContainers(), properties: { version: 11 } });
|
|
143
|
+
/** One engine reply, to everyone it concerns, each in the form its connection asked for. */
|
|
144
|
+
function deliver(req, res, origin) {
|
|
145
|
+
const read = READS.has(String(req.command));
|
|
146
|
+
// A pull concerns only the one who asked; the host's own are its own.
|
|
147
|
+
const recipients = read ? (origin && guests.has(origin) ? [origin] : []) : [...guests];
|
|
148
|
+
if (!recipients.length)
|
|
149
|
+
return;
|
|
150
|
+
const p = pieces(req, res);
|
|
151
|
+
const head = { _from_: p.from, _transactionID_: p.tx };
|
|
152
|
+
// Built once per form, whoever needs it.
|
|
153
|
+
let patchFrames = null;
|
|
154
|
+
let graphicBinary = null;
|
|
155
|
+
let graphicText = null;
|
|
156
|
+
for (const guest of recipients) {
|
|
157
|
+
const cfg = guest.config;
|
|
158
|
+
const result = { ...p.result };
|
|
159
|
+
if (read) {
|
|
160
|
+
result.structure = p.structure;
|
|
161
|
+
if (cfg.sendGraphic_Kernel !== false)
|
|
162
|
+
result.graphic = completeGraphic();
|
|
163
|
+
}
|
|
164
|
+
else if (streams(cfg)) {
|
|
165
|
+
if (cfg.sendStructure !== false) {
|
|
166
|
+
patchFrames ??= p.patches.map(ops => JSON.stringify({ command: 'StructurePatch', ...head, structurePatch: ops }));
|
|
167
|
+
for (const frame of patchFrames)
|
|
168
|
+
raw(guest, frame);
|
|
169
|
+
}
|
|
170
|
+
if (cfg.sendGraphic_Kernel !== false && p.packages.length) {
|
|
171
|
+
if (cfg.sendGraphic_ImmediatelyBinary === true) {
|
|
172
|
+
graphicBinary ??= p.packages.map(pkg => deflateRawSync(JSON.stringify({ command: 'Graphic', ...head, graphic: pkg })));
|
|
173
|
+
for (const frame of graphicBinary)
|
|
174
|
+
raw(guest, frame);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
graphicText ??= p.packages.map(pkg => JSON.stringify({ command: 'Graphic', ...head, graphic: pkg }));
|
|
178
|
+
for (const frame of graphicText)
|
|
179
|
+
raw(guest, frame);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else if (cfg.sendGraphic_Kernel !== false && p.packages.length) {
|
|
184
|
+
// Bundled: what the command changed rides on its Result. The structure
|
|
185
|
+
// does not (it would cost a pull per command): GetTree returns it.
|
|
186
|
+
result.graphic = { containers: p.packages.flatMap(pkg => pkg?.containers ?? []), properties: { version: 11 } };
|
|
187
|
+
}
|
|
188
|
+
if (cfg.sendMessages === false)
|
|
189
|
+
delete result.messages;
|
|
190
|
+
send(guest, result);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const unsubReply = client.onEngineReply((req, res, origin) => {
|
|
194
|
+
if (closed || !guests.size)
|
|
195
|
+
return;
|
|
196
|
+
const guest = origin === 'guest' ? askedBy.get(req) ?? null : null;
|
|
197
|
+
try {
|
|
198
|
+
deliver(req, res, guest);
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
log(`share: could not deliver ${String(req.command)} (${err?.message ?? err})`);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
// A new engine has an empty drawing: what the guests hold is of the old one.
|
|
205
|
+
const unsubStart = client.onEngineStart(() => {
|
|
206
|
+
if (!closed && guests.size)
|
|
207
|
+
void resync();
|
|
208
|
+
});
|
|
209
|
+
/** Sends every guest the whole model, as the Result of a GetTree nobody asked: the clients replace what they hold. */
|
|
210
|
+
async function resync() {
|
|
211
|
+
if (closed || !guests.size || client.transport !== 'wasm')
|
|
212
|
+
return;
|
|
213
|
+
const req = { command: 'GetTree', commandVersion: 'v1', transactionID: `resync-${randomUUID()}` };
|
|
214
|
+
try {
|
|
215
|
+
const res = await client.relay(req);
|
|
216
|
+
const p = pieces(req, res);
|
|
217
|
+
const frame = JSON.stringify({ ...p.result, structure: p.structure, graphic: completeGraphic() });
|
|
218
|
+
for (const guest of guests)
|
|
219
|
+
raw(guest, frame);
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
log(`share: resync failed (${err?.message ?? err})`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/** A guest's presence frame: kept for those who join later and relayed to everyone else, as a server does. */
|
|
226
|
+
function presence(guest, frame, bytes) {
|
|
227
|
+
const channel = typeof frame.channel === 'string' ? frame.channel : '';
|
|
228
|
+
const data = frame.data;
|
|
229
|
+
if (!channel || bytes > PRESENCE_MAX_BYTES || !data || typeof data !== 'object' || Array.isArray(data))
|
|
230
|
+
return;
|
|
231
|
+
if (HOST_CHANNELS.has(channel) || SERVER_CHANNELS.has(channel))
|
|
232
|
+
return;
|
|
233
|
+
guest.presence.set(channel, data);
|
|
234
|
+
const out = { command: 'Presence', channel, peerId: guest.peerId, data };
|
|
235
|
+
for (const other of guests)
|
|
236
|
+
if (other !== guest)
|
|
237
|
+
send(other, out);
|
|
238
|
+
toHost(out);
|
|
239
|
+
}
|
|
240
|
+
/** A guest's command: answered here (emission config, what only a host may do), or run on the engine. */
|
|
241
|
+
async function command(guest, req) {
|
|
242
|
+
const name = req.command;
|
|
243
|
+
if (name === 'GetEmissionConfig')
|
|
244
|
+
return send(guest, { command: 'Result', _from_: name, _transactionID_: req.transactionID, result: { ...guest.config } });
|
|
245
|
+
if (name === 'SetEmissionConfig') {
|
|
246
|
+
const wanted = req.config && typeof req.config === 'object' ? req.config : {};
|
|
247
|
+
for (const [key, value] of Object.entries(wanted)) {
|
|
248
|
+
if (key in DEFAULT_EMISSION && typeof value === typeof DEFAULT_EMISSION[key])
|
|
249
|
+
guest.config[key] = value;
|
|
250
|
+
}
|
|
251
|
+
return send(guest, { command: 'Result', _from_: name, _transactionID_: req.transactionID, result: { ...guest.config } });
|
|
252
|
+
}
|
|
253
|
+
if (name === 'CreateInvite' || name === 'RevokeInvite')
|
|
254
|
+
return send(guest, errorResult(req, `${name}: only the host of a session can do that, and this connection joined it by invite.`));
|
|
255
|
+
keepGraphicSettings(req);
|
|
256
|
+
askedBy.set(req, guest);
|
|
257
|
+
const t0 = Date.now();
|
|
258
|
+
let t1 = t0;
|
|
259
|
+
try {
|
|
260
|
+
// The reply goes out through onEngineReply → deliver().
|
|
261
|
+
if (READS.has(name))
|
|
262
|
+
await client.relay(req);
|
|
263
|
+
else
|
|
264
|
+
await queue(() => {
|
|
265
|
+
t1 = Date.now();
|
|
266
|
+
return client.relay(req);
|
|
267
|
+
});
|
|
268
|
+
if (process.env.CLASSCAD_SHARE_DEBUG)
|
|
269
|
+
log(`share: ${name} waited ${t1 - t0} ms, ran ${Date.now() - t1} ms: ${JSON.stringify({ task: req.task, options: req.options }).slice(0, 700)}`);
|
|
270
|
+
}
|
|
271
|
+
catch (err) {
|
|
272
|
+
send(guest, errorResult(req, err?.message ?? String(err)));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/** A guest is gone: the others and the host are told. */
|
|
276
|
+
function leave(guest) {
|
|
277
|
+
if (!guests.delete(guest))
|
|
278
|
+
return;
|
|
279
|
+
const left = { command: 'Presence', channel: 'leave', peerId: guest.peerId, data: {} };
|
|
280
|
+
for (const other of guests)
|
|
281
|
+
send(other, left);
|
|
282
|
+
toHost({ command: 'PeerLeft', peerId: guest.peerId, invite: guest.invite.invite, inviteName: guest.invite.name });
|
|
283
|
+
toHost(left);
|
|
284
|
+
log(`share: ${guest.invite.name || 'a guest'} left (${guests.size} docked)`);
|
|
285
|
+
}
|
|
286
|
+
/** Takes a guest in on the MCP's own engine: the handshake a server gives, then its commands and presence. */
|
|
287
|
+
function serve(ws, invite, early) {
|
|
288
|
+
const guest = { peerId: randomUUID(), ws, invite, config: { ...DEFAULT_EMISSION }, presence: new Map() };
|
|
289
|
+
send(guest, { command: 'SessionJoined', role: invite.role, inviteName: invite.name });
|
|
290
|
+
// The snapshot: what everyone already here last said, per channel.
|
|
291
|
+
for (const [channel, data] of hostPresence)
|
|
292
|
+
send(guest, { command: 'Presence', channel, peerId: hostId, data });
|
|
293
|
+
for (const other of guests)
|
|
294
|
+
for (const [channel, data] of other.presence)
|
|
295
|
+
send(guest, { command: 'Presence', channel, peerId: other.peerId, data });
|
|
296
|
+
guests.add(guest);
|
|
297
|
+
toHost({ command: 'PeerJoined', peerId: guest.peerId, invite: invite.invite, inviteName: invite.name, role: invite.role });
|
|
298
|
+
log(`share: ${invite.name || 'a guest'} joined (${invite.role}; ${guests.size} docked)`);
|
|
299
|
+
const onMessage = (data, isBinary) => {
|
|
300
|
+
if (isBinary || closed)
|
|
301
|
+
return;
|
|
302
|
+
const text = data.toString();
|
|
303
|
+
let req;
|
|
304
|
+
try {
|
|
305
|
+
req = JSON.parse(text);
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
if (!req || typeof req !== 'object' || typeof req.command !== 'string')
|
|
311
|
+
return;
|
|
312
|
+
if (req.command === 'Presence')
|
|
313
|
+
return presence(guest, req, Buffer.byteLength(text));
|
|
314
|
+
void command(guest, req);
|
|
315
|
+
};
|
|
316
|
+
for (const m of early)
|
|
317
|
+
onMessage(m.data, m.isBinary);
|
|
318
|
+
ws.on('message', onMessage);
|
|
319
|
+
// A guest that went away without a word (a closed laptop) must not stay docked.
|
|
320
|
+
let alive = true;
|
|
321
|
+
ws.on('pong', () => (alive = true));
|
|
322
|
+
const beat = setInterval(() => {
|
|
323
|
+
if (!alive)
|
|
324
|
+
return ws.terminate();
|
|
325
|
+
alive = false;
|
|
326
|
+
ws.ping();
|
|
327
|
+
}, HEARTBEAT_MS);
|
|
328
|
+
beat.unref();
|
|
329
|
+
const gone = () => {
|
|
330
|
+
clearInterval(beat);
|
|
331
|
+
leave(guest);
|
|
332
|
+
};
|
|
333
|
+
ws.on('close', gone);
|
|
334
|
+
ws.on('error', gone);
|
|
335
|
+
}
|
|
336
|
+
// ── A session on a ClassCAD worker ──
|
|
337
|
+
// The server speaks the protocol; a guest is piped through to it with an
|
|
338
|
+
// invite of the server's own.
|
|
339
|
+
/** Guests that are piped through, with the invite they joined with. */
|
|
340
|
+
const piped = new Map();
|
|
341
|
+
/** The server's invite for each of ours, minted on first use and again after a reconnect (a new server session). */
|
|
342
|
+
const serverInvites = new Map();
|
|
343
|
+
function serverInvite(invite) {
|
|
344
|
+
const known = serverInvites.get(invite.invite);
|
|
345
|
+
if (known && known.generation === client.generation)
|
|
346
|
+
return known.token;
|
|
347
|
+
const token = client
|
|
348
|
+
.request('CreateInvite', { role: invite.role, name: invite.name }, { track: false })
|
|
349
|
+
.then(r => {
|
|
350
|
+
if (!r.result?.invite)
|
|
351
|
+
throw new Error(r.messages?.[0]?.message ?? 'the server minted no invite');
|
|
352
|
+
return r.result.invite;
|
|
353
|
+
});
|
|
354
|
+
serverInvites.set(invite.invite, { generation: client.generation, token });
|
|
355
|
+
token.catch(() => serverInvites.delete(invite.invite));
|
|
356
|
+
return token;
|
|
357
|
+
}
|
|
358
|
+
/** Joins a guest to the server's session and passes the frames both ways. */
|
|
359
|
+
async function pipe(ws, invite, early) {
|
|
360
|
+
// What the guest sends before the server is reached must not be lost.
|
|
361
|
+
const buffer = (data, isBinary) => void early.push({ data, isBinary });
|
|
362
|
+
ws.on('message', buffer);
|
|
363
|
+
let token;
|
|
364
|
+
try {
|
|
365
|
+
token = await serverInvite(invite);
|
|
366
|
+
}
|
|
367
|
+
catch (err) {
|
|
368
|
+
log(`share: no invite from the ClassCAD server (${err?.message ?? err})`);
|
|
369
|
+
// An invited connection cannot invite: another app hosts this session.
|
|
370
|
+
return ws.close(1008, 'this session is hosted elsewhere: join it with its own share link');
|
|
371
|
+
}
|
|
372
|
+
const base = client.url.split('?')[0].replace(/\/+$/, '');
|
|
373
|
+
const upstream = new WebSocket(`${base}/?invite=${encodeURIComponent(token)}`);
|
|
374
|
+
const forward = (data, isBinary) => {
|
|
375
|
+
if (upstream.readyState === WebSocket.OPEN)
|
|
376
|
+
upstream.send(data, { binary: isBinary });
|
|
377
|
+
};
|
|
378
|
+
upstream.on('open', () => {
|
|
379
|
+
ws.off('message', buffer);
|
|
380
|
+
for (const m of early)
|
|
381
|
+
forward(m.data, m.isBinary);
|
|
382
|
+
ws.on('message', forward);
|
|
383
|
+
});
|
|
384
|
+
upstream.on('message', (data, isBinary) => {
|
|
385
|
+
if (ws.readyState === WebSocket.OPEN)
|
|
386
|
+
ws.send(data, { binary: isBinary });
|
|
387
|
+
});
|
|
388
|
+
const end = () => {
|
|
389
|
+
piped.delete(ws);
|
|
390
|
+
if (upstream.readyState <= WebSocket.OPEN)
|
|
391
|
+
upstream.close();
|
|
392
|
+
if (ws.readyState <= WebSocket.OPEN)
|
|
393
|
+
ws.close();
|
|
394
|
+
};
|
|
395
|
+
piped.set(ws, invite);
|
|
396
|
+
upstream.on('close', end);
|
|
397
|
+
upstream.on('error', end);
|
|
398
|
+
ws.on('close', end);
|
|
399
|
+
ws.on('error', end);
|
|
400
|
+
log(`share: ${invite.name || 'a guest'} joined through the ClassCAD server (${invite.role})`);
|
|
401
|
+
}
|
|
402
|
+
/** Closes every guest, served here or piped. */
|
|
403
|
+
const closeAll = (code, reason) => {
|
|
404
|
+
for (const guest of [...guests]) {
|
|
405
|
+
try {
|
|
406
|
+
guest.ws.close(code, reason);
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
/* already closing */
|
|
410
|
+
}
|
|
411
|
+
leave(guest);
|
|
412
|
+
}
|
|
413
|
+
for (const ws of [...piped.keys()]) {
|
|
414
|
+
try {
|
|
415
|
+
ws.close(code, reason);
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
/* already closing */
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
return {
|
|
423
|
+
hostId,
|
|
424
|
+
createInvite: (role = 'edit', name = '') => {
|
|
425
|
+
const invite = { invite: randomUUID(), role, name };
|
|
426
|
+
invites.set(invite.invite, invite);
|
|
427
|
+
return invite;
|
|
428
|
+
},
|
|
429
|
+
revokeInvite: token => {
|
|
430
|
+
const known = invites.delete(token);
|
|
431
|
+
let kicked = 0;
|
|
432
|
+
for (const guest of [...guests]) {
|
|
433
|
+
if (guest.invite.invite !== token)
|
|
434
|
+
continue;
|
|
435
|
+
guest.ws.close(1008, 'invite revoked');
|
|
436
|
+
leave(guest);
|
|
437
|
+
kicked++;
|
|
438
|
+
}
|
|
439
|
+
for (const [ws, invite] of [...piped]) {
|
|
440
|
+
if (invite.invite !== token)
|
|
441
|
+
continue;
|
|
442
|
+
ws.close(1008, 'invite revoked');
|
|
443
|
+
kicked++;
|
|
444
|
+
}
|
|
445
|
+
return { invite: token, revoked: known, kicked };
|
|
446
|
+
},
|
|
447
|
+
invite: token => invites.get(token),
|
|
448
|
+
join: (ws, token) => {
|
|
449
|
+
const invite = invites.get(token);
|
|
450
|
+
if (closed || !invite)
|
|
451
|
+
return ws.close(1008, 'unknown invite');
|
|
452
|
+
// What the guest sends before the engine is up must not be lost.
|
|
453
|
+
const early = [];
|
|
454
|
+
const buffer = (data, isBinary) => void early.push({ data, isBinary });
|
|
455
|
+
ws.on('message', buffer);
|
|
456
|
+
// Which engine this session runs on is decided by its first use: that is now.
|
|
457
|
+
client.open().then(() => {
|
|
458
|
+
ws.off('message', buffer);
|
|
459
|
+
if (ws.readyState !== WebSocket.OPEN)
|
|
460
|
+
return;
|
|
461
|
+
if (client.transport === 'wasm')
|
|
462
|
+
serve(ws, invite, early);
|
|
463
|
+
else
|
|
464
|
+
void pipe(ws, invite, early);
|
|
465
|
+
}, err => {
|
|
466
|
+
log(`share: the engine did not start for a guest (${err?.message ?? err})`);
|
|
467
|
+
ws.close(1011, 'the engine did not start');
|
|
468
|
+
});
|
|
469
|
+
},
|
|
470
|
+
sendPresence: (channel, data) => {
|
|
471
|
+
if (SERVER_CHANNELS.has(channel))
|
|
472
|
+
return;
|
|
473
|
+
hostPresence.set(channel, data);
|
|
474
|
+
const out = { command: 'Presence', channel, peerId: hostId, data };
|
|
475
|
+
for (const guest of guests)
|
|
476
|
+
send(guest, out);
|
|
477
|
+
},
|
|
478
|
+
resync,
|
|
479
|
+
kick: reason => closeAll(1012, reason),
|
|
480
|
+
get guests() {
|
|
481
|
+
return guests.size + piped.size;
|
|
482
|
+
},
|
|
483
|
+
close: () => {
|
|
484
|
+
if (closed)
|
|
485
|
+
return;
|
|
486
|
+
closeAll(1001, 'the session is over');
|
|
487
|
+
closed = true;
|
|
488
|
+
unsubReply();
|
|
489
|
+
unsubStart();
|
|
490
|
+
invites.clear();
|
|
491
|
+
},
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
//# sourceMappingURL=hub.js.map
|