marifold 0.69.0 → 0.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/bridge-template/.env.example +6 -0
  2. package/dist/bridge-template/HOSTING.md +477 -0
  3. package/dist/bridge-template/README.md +176 -0
  4. package/dist/bridge-template/api/bridge.ts +5 -0
  5. package/dist/bridge-template/dist/Store.d.ts +51 -0
  6. package/dist/bridge-template/dist/Store.d.ts.map +1 -0
  7. package/dist/bridge-template/dist/Store.js +170 -0
  8. package/dist/bridge-template/dist/Store.js.map +1 -0
  9. package/dist/bridge-template/dist/index.d.ts +4 -0
  10. package/dist/bridge-template/dist/index.d.ts.map +1 -0
  11. package/dist/bridge-template/dist/index.js +189 -0
  12. package/dist/bridge-template/dist/index.js.map +1 -0
  13. package/dist/bridge-template/dist/serve.d.ts +2 -0
  14. package/dist/bridge-template/dist/serve.d.ts.map +1 -0
  15. package/dist/bridge-template/dist/serve.js +18 -0
  16. package/dist/bridge-template/dist/serve.js.map +1 -0
  17. package/dist/bridge-template/package.json +16 -0
  18. package/dist/bridge-template/setup/setup.py +319 -0
  19. package/dist/bridge-template/setup.sh +8 -0
  20. package/dist/bridge-template/vendor/workspace-protocol/dist/identity.d.ts +15 -0
  21. package/dist/bridge-template/vendor/workspace-protocol/dist/identity.d.ts.map +1 -0
  22. package/dist/bridge-template/vendor/workspace-protocol/dist/identity.js +93 -0
  23. package/dist/bridge-template/vendor/workspace-protocol/dist/identity.js.map +1 -0
  24. package/dist/bridge-template/vendor/workspace-protocol/dist/index.d.ts +3 -0
  25. package/dist/bridge-template/vendor/workspace-protocol/dist/index.d.ts.map +1 -0
  26. package/dist/bridge-template/vendor/workspace-protocol/dist/index.js +19 -0
  27. package/dist/bridge-template/vendor/workspace-protocol/dist/index.js.map +1 -0
  28. package/dist/bridge-template/vendor/workspace-protocol/dist/types.d.ts +97 -0
  29. package/dist/bridge-template/vendor/workspace-protocol/dist/types.d.ts.map +1 -0
  30. package/dist/bridge-template/vendor/workspace-protocol/dist/types.js +55 -0
  31. package/dist/bridge-template/vendor/workspace-protocol/dist/types.js.map +1 -0
  32. package/dist/bridge-template/vendor/workspace-protocol/package.json +9 -0
  33. package/dist/bridge-template/vercel.json +16 -0
  34. package/dist/commands/WorkspaceClient.d.ts +6 -0
  35. package/dist/commands/WorkspaceClient.d.ts.map +1 -0
  36. package/dist/commands/WorkspaceClient.js +72 -0
  37. package/dist/commands/WorkspaceClient.js.map +1 -0
  38. package/dist/commands/agent.d.ts.map +1 -1
  39. package/dist/commands/agent.js +9 -3
  40. package/dist/commands/agent.js.map +1 -1
  41. package/dist/commands/ask.d.ts.map +1 -1
  42. package/dist/commands/ask.js +10 -5
  43. package/dist/commands/ask.js.map +1 -1
  44. package/dist/commands/config.js +11 -8
  45. package/dist/commands/config.js.map +1 -1
  46. package/dist/commands/init.d.ts.map +1 -1
  47. package/dist/commands/init.js +10 -20
  48. package/dist/commands/init.js.map +1 -1
  49. package/dist/commands/schedule.d.ts.map +1 -1
  50. package/dist/commands/schedule.js +20 -8
  51. package/dist/commands/schedule.js.map +1 -1
  52. package/dist/commands/workspace.d.ts +9 -0
  53. package/dist/commands/workspace.d.ts.map +1 -0
  54. package/dist/commands/workspace.js +223 -0
  55. package/dist/commands/workspace.js.map +1 -0
  56. package/dist/index.js +9 -1
  57. package/dist/index.js.map +1 -1
  58. package/package.json +8 -6
@@ -0,0 +1,51 @@
1
+ import type { PublicIdentity } from '@marifold/workspace-protocol';
2
+ export interface HostRegistration {
3
+ workspaceId: string;
4
+ hostDeviceId: string;
5
+ host: PublicIdentity;
6
+ }
7
+ export interface RelayStore {
8
+ host(id: string): Promise<HostRegistration | undefined>;
9
+ register(host: HostRegistration): Promise<void>;
10
+ revoked(workspace: string, device: string): Promise<boolean>;
11
+ revoke(workspace: string, device: string): Promise<void>;
12
+ connect(workspace: string, device: string, generation: string): Promise<void>;
13
+ current(workspace: string, device: string, generation: string): Promise<boolean>;
14
+ publish(workspace: string, device: string, packet: string): Promise<void>;
15
+ receive(workspace: string, device: string, deliver: (id: string, packet: string) => void): Promise<() => void>;
16
+ ack(workspace: string, device: string, id: string): Promise<void>;
17
+ close(): Promise<void>;
18
+ }
19
+ export declare class MemoryRelayStore implements RelayStore {
20
+ private hosts;
21
+ private revocations;
22
+ private generations;
23
+ private messages;
24
+ private listeners;
25
+ host(id: string): Promise<HostRegistration | undefined>;
26
+ register(host: HostRegistration): Promise<void>;
27
+ revoked(w: string, d: string): Promise<boolean>;
28
+ revoke(w: string, d: string): Promise<void>;
29
+ connect(w: string, d: string, g: string): Promise<void>;
30
+ current(w: string, d: string, g: string): Promise<boolean>;
31
+ publish(w: string, d: string, packet: string): Promise<void>;
32
+ receive(w: string, d: string, deliver: (id: string, packet: string) => void): Promise<() => void>;
33
+ ack(w: string, d: string, id: string): Promise<void>;
34
+ close(): Promise<void>;
35
+ }
36
+ export declare class RedisRelayStore implements RelayStore {
37
+ private redis;
38
+ constructor(url: string);
39
+ private key;
40
+ host(id: string): Promise<HostRegistration | undefined>;
41
+ register(host: HostRegistration): Promise<void>;
42
+ revoked(w: string, d: string): Promise<boolean>;
43
+ revoke(w: string, d: string): Promise<void>;
44
+ connect(w: string, d: string, g: string): Promise<void>;
45
+ current(w: string, d: string, g: string): Promise<boolean>;
46
+ publish(w: string, d: string, packet: string): Promise<void>;
47
+ receive(w: string, d: string, deliver: (id: string, packet: string) => void): Promise<() => void>;
48
+ ack(w: string, d: string, id: string): Promise<void>;
49
+ close(): Promise<void>;
50
+ }
51
+ //# sourceMappingURL=Store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../src/Store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RedisRelayStore = exports.MemoryRelayStore = void 0;
7
+ const ioredis_1 = __importDefault(require("ioredis"));
8
+ const workspace_protocol_1 = require("@marifold/workspace-protocol");
9
+ class MemoryRelayStore {
10
+ hosts = new Map();
11
+ revocations = new Set();
12
+ generations = new Map();
13
+ messages = new Map();
14
+ listeners = new Map();
15
+ async host(id) {
16
+ return this.hosts.get(id);
17
+ }
18
+ async register(host) {
19
+ const old = this.hosts.get(host.workspaceId);
20
+ if (old && JSON.stringify(old) !== JSON.stringify(host))
21
+ throw new Error('Workspace already registered.');
22
+ this.hosts.set(host.workspaceId, host);
23
+ }
24
+ async revoked(w, d) {
25
+ return this.revocations.has(`${w}:${d}`);
26
+ }
27
+ async revoke(w, d) {
28
+ this.revocations.add(`${w}:${d}`);
29
+ }
30
+ async connect(w, d, g) {
31
+ this.generations.set(`${w}:${d}`, g);
32
+ }
33
+ async current(w, d, g) {
34
+ return this.generations.get(`${w}:${d}`) === g;
35
+ }
36
+ async publish(w, d, packet) {
37
+ const key = `${w}:${d}`;
38
+ const queue = this.messages.get(key) ?? new Map();
39
+ for (const [id, m] of queue)
40
+ if (m.expires < Date.now())
41
+ queue.delete(id);
42
+ if (queue.size >= 128)
43
+ throw new Error('Recipient inbox is full.');
44
+ const id = (0, workspace_protocol_1.randomId)();
45
+ queue.set(id, { text: packet, expires: Date.now() + workspace_protocol_1.RELAY_RETENTION_MS });
46
+ this.messages.set(key, queue);
47
+ for (const listener of this.listeners.get(key) ?? [])
48
+ listener(id, packet);
49
+ }
50
+ async receive(w, d, deliver) {
51
+ const key = `${w}:${d}`;
52
+ const listeners = this.listeners.get(key) ?? new Set();
53
+ listeners.add(deliver);
54
+ this.listeners.set(key, listeners);
55
+ for (const [id, m] of this.messages.get(key) ?? [])
56
+ if (m.expires > Date.now())
57
+ deliver(id, m.text);
58
+ return () => {
59
+ listeners.delete(deliver);
60
+ };
61
+ }
62
+ async ack(w, d, id) {
63
+ this.messages.get(`${w}:${d}`)?.delete(id);
64
+ }
65
+ async close() {
66
+ this.listeners.clear();
67
+ }
68
+ }
69
+ exports.MemoryRelayStore = MemoryRelayStore;
70
+ class RedisRelayStore {
71
+ redis;
72
+ constructor(url) {
73
+ this.redis = new ioredis_1.default(url, { maxRetriesPerRequest: 2, enableReadyCheck: true });
74
+ this.redis.on('error', () => undefined);
75
+ }
76
+ key(w, d = '') {
77
+ return `marifold:v1:${w}:${d}`;
78
+ }
79
+ async host(id) {
80
+ const data = await this.redis.get(this.key(id, 'host'));
81
+ return data ? JSON.parse(data) : undefined;
82
+ }
83
+ async register(host) {
84
+ const key = this.key(host.workspaceId, 'host');
85
+ const text = JSON.stringify(host);
86
+ const accepted = await this.redis.set(key, text, 'NX');
87
+ if (!accepted && (await this.redis.get(key)) !== text)
88
+ throw new Error('Workspace already registered.');
89
+ }
90
+ async revoked(w, d) {
91
+ return Boolean(await this.redis.sismember(this.key(w, 'revoked'), d));
92
+ }
93
+ async revoke(w, d) {
94
+ await this.redis.sadd(this.key(w, 'revoked'), d);
95
+ }
96
+ async connect(w, d, g) {
97
+ await this.redis.set(this.key(w, `${d}:connection`), g, 'PX', workspace_protocol_1.RELAY_RETENTION_MS);
98
+ }
99
+ async current(w, d, g) {
100
+ return (await this.redis.get(this.key(w, `${d}:connection`))) === g;
101
+ }
102
+ async publish(w, d, packet) {
103
+ const key = this.key(w, `${d}:inbox`);
104
+ const result = await this.redis.eval(`redis.call('XTRIM',KEYS[1],'MINID',ARGV[3]); if redis.call('XLEN',KEYS[1])>=128 then return 0 end redis.call('XADD',KEYS[1],'*','packet',ARGV[1]); redis.call('PEXPIRE',KEYS[1],ARGV[2]); redis.call('PUBLISH',KEYS[1],'new'); return 1`, 1, key, packet, workspace_protocol_1.RELAY_RETENTION_MS, `${Date.now() - workspace_protocol_1.RELAY_RETENTION_MS}-0`);
105
+ if (!result)
106
+ throw new Error('Recipient inbox is full.');
107
+ }
108
+ async receive(w, d, deliver) {
109
+ const key = this.key(w, `${d}:inbox`);
110
+ const subscriber = this.redis.duplicate();
111
+ let closed = false;
112
+ let reading = false;
113
+ let again = false;
114
+ let deliveredThrough;
115
+ const read = async () => {
116
+ if (closed)
117
+ return;
118
+ if (reading) {
119
+ again = true;
120
+ return;
121
+ }
122
+ reading = true;
123
+ try {
124
+ do {
125
+ again = false;
126
+ const rows = await this.redis.xrange(key, deliveredThrough ?? `${Date.now() - workspace_protocol_1.RELAY_RETENTION_MS}-0`, '+', 'COUNT', 128);
127
+ // WebSockets already deliver reliably within one connection. Replaying
128
+ // every unacknowledged row on each publish amplifies bulk traffic.
129
+ // A new receiver starts without a cursor and replays retained rows.
130
+ for (const [id, fields] of rows) {
131
+ if (closed)
132
+ break;
133
+ if (id === deliveredThrough)
134
+ continue;
135
+ deliver(id, fields[1]);
136
+ deliveredThrough = id;
137
+ }
138
+ } while (again && !closed);
139
+ }
140
+ finally {
141
+ reading = false;
142
+ }
143
+ };
144
+ subscriber.on('error', () => undefined);
145
+ subscriber.on('message', () => {
146
+ void read().catch(() => undefined);
147
+ });
148
+ try {
149
+ await subscriber.subscribe(key);
150
+ await read();
151
+ }
152
+ catch (error) {
153
+ closed = true;
154
+ subscriber.disconnect();
155
+ throw error;
156
+ }
157
+ return () => {
158
+ closed = true;
159
+ subscriber.disconnect();
160
+ };
161
+ }
162
+ async ack(w, d, id) {
163
+ await this.redis.xdel(this.key(w, `${d}:inbox`), id);
164
+ }
165
+ async close() {
166
+ this.redis.disconnect();
167
+ }
168
+ }
169
+ exports.RedisRelayStore = RedisRelayStore;
170
+ //# sourceMappingURL=Store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Store.js","sourceRoot":"","sources":["../src/Store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RelayStore } from './Store';
2
+ export { MemoryRelayStore, RedisRelayStore } from './Store';
3
+ export declare function createBridge(store: RelayStore, registrationToken: string): import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE5D,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sGAmLxE"}
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedisRelayStore = exports.MemoryRelayStore = void 0;
4
+ exports.createBridge = createBridge;
5
+ const node_http_1 = require("node:http");
6
+ const node_crypto_1 = require("node:crypto");
7
+ const ws_1 = require("ws");
8
+ const workspace_protocol_1 = require("@marifold/workspace-protocol");
9
+ var Store_1 = require("./Store");
10
+ Object.defineProperty(exports, "MemoryRelayStore", { enumerable: true, get: function () { return Store_1.MemoryRelayStore; } });
11
+ Object.defineProperty(exports, "RedisRelayStore", { enumerable: true, get: function () { return Store_1.RedisRelayStore; } });
12
+ function createBridge(store, registrationToken) {
13
+ if (registrationToken.length < 32)
14
+ throw new Error('Bridge registration token must contain at least 32 characters.');
15
+ const server = (0, node_http_1.createServer)(async (req, res) => {
16
+ res.setHeader('content-type', 'application/json');
17
+ res.setHeader('cache-control', 'no-store');
18
+ // Accept the Vercel function entry as well as the original rewritten URL.
19
+ const route = req.url === '/api/bridge' ? (req.method === 'POST' ? '/v1/hosts' : '/health') : req.url;
20
+ if (req.method === 'GET' && route === '/health') {
21
+ res.end(JSON.stringify({ service: 'marifold-bridge', version: 1, deliveryReplay: 'on-reconnect' }));
22
+ return;
23
+ }
24
+ if (req.method !== 'POST' || route !== '/v1/hosts') {
25
+ res.writeHead(404);
26
+ res.end('{}');
27
+ return;
28
+ }
29
+ const token = req.headers.authorization?.replace(/^Bearer /, '') ?? '';
30
+ if (!(0, node_crypto_1.timingSafeEqual)(Buffer.from((0, workspace_protocol_1.digest)(token)), Buffer.from((0, workspace_protocol_1.digest)(registrationToken)))) {
31
+ res.writeHead(401);
32
+ res.end('{}');
33
+ return;
34
+ }
35
+ try {
36
+ let body = '';
37
+ for await (const chunk of req) {
38
+ body += chunk;
39
+ if (body.length > 16384)
40
+ throw new Error('Body too large.');
41
+ }
42
+ const b = (0, workspace_protocol_1.record)(JSON.parse(body));
43
+ const host = (0, workspace_protocol_1.record)(b.host);
44
+ if (typeof host.signingKey !== 'string' || !host.encryptionKey)
45
+ throw new Error('Invalid host identity.');
46
+ await store.register({ workspaceId: (0, workspace_protocol_1.identifier)(b.workspaceId), hostDeviceId: (0, workspace_protocol_1.identifier)(b.hostDeviceId), host });
47
+ res.end('{"ok":true}');
48
+ }
49
+ catch {
50
+ res.writeHead(400);
51
+ res.end('{"error":"Registration rejected."}');
52
+ }
53
+ });
54
+ const wss = new ws_1.WebSocketServer({ noServer: true, maxPayload: workspace_protocol_1.MAX_FRAME_BYTES, perMessageDeflate: false });
55
+ server.on('upgrade', (request, socket, head) => {
56
+ if (wss.clients.size >= 128 || !['/v1/connect', '/api/bridge'].includes(request.url ?? '')) {
57
+ socket.destroy();
58
+ return;
59
+ }
60
+ wss.handleUpgrade(request, socket, head, (ws) => wss.emit('connection', ws));
61
+ });
62
+ wss.on('connection', (ws) => {
63
+ const nonce = (0, workspace_protocol_1.randomId)();
64
+ const generation = (0, workspace_protocol_1.randomId)();
65
+ let auth;
66
+ let stop;
67
+ let chain = Promise.resolve();
68
+ let count = 0;
69
+ let window = Date.now();
70
+ let queued = 0;
71
+ const timer = setTimeout(() => ws.close(1008, 'Authentication timeout'), 10000);
72
+ ws.send(JSON.stringify({ type: 'challenge', nonce }));
73
+ ws.on('message', (bytes) => {
74
+ if (++queued > 128) {
75
+ ws.close(1008, 'Pending frame limit');
76
+ return;
77
+ }
78
+ chain = chain
79
+ .then(async () => {
80
+ if (Date.now() - window > 1000) {
81
+ window = Date.now();
82
+ count = 0;
83
+ }
84
+ if (++count > 512)
85
+ throw new Error('Rate limit.');
86
+ if (ws.readyState !== ws_1.WebSocket.OPEN)
87
+ return;
88
+ const data = (0, workspace_protocol_1.record)(JSON.parse(bytes.toString()));
89
+ if (!auth) {
90
+ if (data.type !== 'auth')
91
+ throw new Error('Authentication required.');
92
+ const workspace = (0, workspace_protocol_1.identifier)(data.workspaceId);
93
+ const device = (0, workspace_protocol_1.identifier)(data.deviceId);
94
+ const host = await store.host(workspace);
95
+ if (!host || (await store.revoked(workspace, device)))
96
+ throw new Error('Unknown or revoked workspace membership.');
97
+ const certificate = data.certificate;
98
+ let identity;
99
+ if (certificate) {
100
+ if (!(0, workspace_protocol_1.validMembership)(certificate, host.host) ||
101
+ certificate.membership.workspaceId !== workspace ||
102
+ certificate.membership.deviceId !== device)
103
+ throw new Error('Invalid membership.');
104
+ identity = certificate.membership.identity;
105
+ }
106
+ else {
107
+ if (!device.startsWith('pending_'))
108
+ throw new Error('Invalid pairing identity.');
109
+ identity = data.identity;
110
+ }
111
+ if (!(0, workspace_protocol_1.verifyText)(identity, nonce, String(data.signature)))
112
+ throw new Error('Invalid proof of possession.');
113
+ auth = { workspace, device, identity, certificate, hostDevice: host.hostDeviceId };
114
+ await store.connect(workspace, device, generation);
115
+ stop = await store.receive(workspace, device, (id, packet) => {
116
+ void Promise.all([store.current(workspace, device, generation), store.revoked(workspace, device)])
117
+ .then(([current, revoked]) => {
118
+ if (!current || revoked) {
119
+ ws.close(1008, 'Membership or connection replaced');
120
+ return;
121
+ }
122
+ if (ws.readyState === ws_1.WebSocket.OPEN && ws.bufferedAmount < workspace_protocol_1.MAX_FRAME_BYTES * 8)
123
+ ws.send(JSON.stringify({ type: 'delivery', deliveryId: id, packet: JSON.parse(packet) }));
124
+ else
125
+ ws.close(1013, 'Slow consumer');
126
+ })
127
+ .catch(() => ws.close(1011, 'Relay unavailable'));
128
+ });
129
+ if (ws.readyState !== ws_1.WebSocket.OPEN) {
130
+ stop();
131
+ return;
132
+ }
133
+ clearTimeout(timer);
134
+ ws.send(JSON.stringify({ type: 'ready', hostDeviceId: host.hostDeviceId, deliveryReplay: 'on-reconnect' }));
135
+ return;
136
+ }
137
+ if ((await store.revoked(auth.workspace, auth.device)) ||
138
+ !(await store.current(auth.workspace, auth.device, generation)))
139
+ throw new Error('Membership or connection replaced.');
140
+ if (data.type === 'ping') {
141
+ await store.connect(auth.workspace, auth.device, generation);
142
+ ws.send('{"type":"pong"}');
143
+ return;
144
+ }
145
+ if (data.type === 'ack') {
146
+ if (typeof data.deliveryId !== 'string' || data.deliveryId.length > 100)
147
+ throw new Error('Invalid acknowledgment.');
148
+ await store.ack(auth.workspace, auth.device, data.deliveryId);
149
+ return;
150
+ }
151
+ if (data.type === 'revoke' && auth.device === auth.hostDevice) {
152
+ await store.revoke(auth.workspace, (0, workspace_protocol_1.identifier)(data.deviceId));
153
+ ws.send(JSON.stringify({ type: 'revoked', id: (0, workspace_protocol_1.identifier)(data.id) }));
154
+ return;
155
+ }
156
+ if (data.type !== 'send')
157
+ throw new Error('Unknown message.');
158
+ const message = (0, workspace_protocol_1.record)(data.message);
159
+ const h = (0, workspace_protocol_1.parseHeader)(message.header);
160
+ if (h.workspaceId !== auth.workspace ||
161
+ h.sender !== auth.device ||
162
+ (auth.device !== auth.hostDevice && h.recipient !== auth.hostDevice))
163
+ throw new Error('Routing denied.');
164
+ if (h.expiresAt < Date.now() || h.expiresAt > Date.now() + 65000)
165
+ throw new Error('Message expired.');
166
+ if (await store.revoked(auth.workspace, h.recipient))
167
+ return;
168
+ await store.publish(auth.workspace, h.recipient, JSON.stringify({ message, identity: auth.identity, certificate: auth.certificate }));
169
+ })
170
+ .catch(() => ws.close(1008, 'Bridge request rejected'))
171
+ .finally(() => {
172
+ queued--;
173
+ });
174
+ });
175
+ ws.on('close', () => {
176
+ clearTimeout(timer);
177
+ stop?.();
178
+ });
179
+ ws.on('error', () => undefined);
180
+ });
181
+ server.on('close', () => {
182
+ for (const ws of wss.clients)
183
+ ws.terminate();
184
+ wss.close();
185
+ void store.close();
186
+ });
187
+ return server;
188
+ }
189
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("./index");
4
+ const redisUrl = process.env.MARIFOLD_BRIDGE_REDIS_URL;
5
+ const token = process.env.MARIFOLD_BRIDGE_REGISTRATION_TOKEN;
6
+ if (!redisUrl || !token)
7
+ throw new Error('Set MARIFOLD_BRIDGE_REDIS_URL and MARIFOLD_BRIDGE_REGISTRATION_TOKEN.');
8
+ const port = Number(process.env.PORT ?? 32143);
9
+ if (!Number.isSafeInteger(port) || port < 1 || port > 65535)
10
+ throw new Error('Invalid PORT.');
11
+ const server = (0, index_1.createBridge)(new index_1.RedisRelayStore(redisUrl), token);
12
+ server.listen(port, process.env.HOST ?? '127.0.0.1', () => process.stdout.write(`Marifold bridge listening on port ${port}.\n`));
13
+ for (const signal of ['SIGTERM', 'SIGINT'])
14
+ process.once(signal, () => {
15
+ server.close();
16
+ server.closeAllConnections();
17
+ });
18
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":";;AAAA,mCAAwD;AACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;AACvD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC;AAC7D,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK;IAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;AAClH,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;AAC/C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK;IAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AAC9F,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,IAAI,uBAAe,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,GAAG,EAAE,CACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,IAAI,KAAK,CAAC,CACrE,CAAC;AACF,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAU;IACjD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "marifold-personal-bridge",
3
+ "version": "0.71.0",
4
+ "private": true,
5
+ "engines": {
6
+ "node": "24.x"
7
+ },
8
+ "scripts": {
9
+ "start": "node dist/serve.js"
10
+ },
11
+ "dependencies": {
12
+ "@marifold/workspace-protocol": "file:vendor/workspace-protocol",
13
+ "ws": "8.21.0",
14
+ "ioredis": "5.11.1"
15
+ }
16
+ }