@blxzer/cursor-trellis-core 0.3.3 → 0.3.5

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 (46) hide show
  1. package/LICENSE +235 -235
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +3 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/rpc/broker/audit.d.ts +16 -0
  7. package/dist/rpc/broker/audit.d.ts.map +1 -0
  8. package/dist/rpc/broker/audit.js +33 -0
  9. package/dist/rpc/broker/audit.js.map +1 -0
  10. package/dist/rpc/broker/in-process.d.ts +62 -0
  11. package/dist/rpc/broker/in-process.d.ts.map +1 -0
  12. package/dist/rpc/broker/in-process.js +490 -0
  13. package/dist/rpc/broker/in-process.js.map +1 -0
  14. package/dist/rpc/broker/journal.d.ts +11 -0
  15. package/dist/rpc/broker/journal.d.ts.map +1 -0
  16. package/dist/rpc/broker/journal.js +17 -0
  17. package/dist/rpc/broker/journal.js.map +1 -0
  18. package/dist/rpc/contract/errors.d.ts +18 -0
  19. package/dist/rpc/contract/errors.d.ts.map +1 -0
  20. package/dist/rpc/contract/errors.js +55 -0
  21. package/dist/rpc/contract/errors.js.map +1 -0
  22. package/dist/rpc/contract/parse.d.ts +9 -0
  23. package/dist/rpc/contract/parse.d.ts.map +1 -0
  24. package/dist/rpc/contract/parse.js +144 -0
  25. package/dist/rpc/contract/parse.js.map +1 -0
  26. package/dist/rpc/contract/topics.d.ts +11 -0
  27. package/dist/rpc/contract/topics.d.ts.map +1 -0
  28. package/dist/rpc/contract/topics.js +42 -0
  29. package/dist/rpc/contract/topics.js.map +1 -0
  30. package/dist/rpc/contract/types.d.ts +54 -0
  31. package/dist/rpc/contract/types.d.ts.map +1 -0
  32. package/dist/rpc/contract/types.js +39 -0
  33. package/dist/rpc/contract/types.js.map +1 -0
  34. package/dist/rpc/index.d.ts +10 -0
  35. package/dist/rpc/index.d.ts.map +1 -0
  36. package/dist/rpc/index.js +11 -0
  37. package/dist/rpc/index.js.map +1 -0
  38. package/dist/rpc/transport/localhost-server.d.ts +36 -0
  39. package/dist/rpc/transport/localhost-server.d.ts.map +1 -0
  40. package/dist/rpc/transport/localhost-server.js +275 -0
  41. package/dist/rpc/transport/localhost-server.js.map +1 -0
  42. package/dist/rpc/transport/websocket.d.ts +20 -0
  43. package/dist/rpc/transport/websocket.d.ts.map +1 -0
  44. package/dist/rpc/transport/websocket.js +156 -0
  45. package/dist/rpc/transport/websocket.js.map +1 -0
  46. package/package.json +6 -1
@@ -0,0 +1,33 @@
1
+ export class RpcAuditLog {
2
+ seq = 0;
3
+ entries = [];
4
+ append(kind, detail = {}) {
5
+ const entry = {
6
+ seq: ++this.seq,
7
+ ts: new Date().toISOString(),
8
+ kind,
9
+ detail,
10
+ };
11
+ this.entries.push(entry);
12
+ return entry;
13
+ }
14
+ appendEnvelope(kind, envelope) {
15
+ return this.append(kind, {
16
+ id: envelope.id,
17
+ type: envelope.type,
18
+ method: envelope.method ?? null,
19
+ event: envelope.event ?? null,
20
+ from: envelope.from,
21
+ to: envelope.to ?? null,
22
+ correlationId: envelope.correlationId ?? null,
23
+ topic: envelope.topic ?? null,
24
+ });
25
+ }
26
+ list() {
27
+ return this.entries;
28
+ }
29
+ get size() {
30
+ return this.entries.length;
31
+ }
32
+ }
33
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/rpc/broker/audit.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,WAAW;IACd,GAAG,GAAG,CAAC,CAAC;IACC,OAAO,GAAoB,EAAE,CAAC;IAE/C,MAAM,CAAC,IAAY,EAAE,SAAkC,EAAE;QACvD,MAAM,KAAK,GAAkB;YAC3B,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG;YACf,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI;YACJ,MAAM;SACP,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,cAAc,CAAC,IAAY,EAAE,QAAqB;QAChD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YACvB,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI;YAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;YAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,EAAE,EAAE,QAAQ,CAAC,EAAE,IAAI,IAAI;YACvB,aAAa,EAAE,QAAQ,CAAC,aAAa,IAAI,IAAI;YAC7C,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,62 @@
1
+ import { RpcAuditLog } from "./audit.js";
2
+ import type { RpcJournal } from "./journal.js";
3
+ import { RpcError } from "../contract/errors.js";
4
+ import { type RpcAddress, type RpcEnvelope, type RpcEventName, type RpcStatusSnapshot } from "../contract/types.js";
5
+ export type RpcDeliveryListener = (address: RpcAddress, envelope: RpcEnvelope) => void;
6
+ export interface InProcessBrokerOptions {
7
+ token?: string;
8
+ requestTimeoutMs?: number;
9
+ /** Drop clients that miss heartbeats; `0` disables. Default `30_000`. */
10
+ heartbeatTimeoutMs?: number;
11
+ heartbeatSweepIntervalMs?: number;
12
+ }
13
+ /** In-process RPC-FULL CORE broker (transport lives outside). */
14
+ export declare class InProcessBroker {
15
+ readonly audit: RpcAuditLog;
16
+ private readonly clients;
17
+ private readonly waiters;
18
+ private readonly deliveryListeners;
19
+ private readonly token;
20
+ private readonly requestTimeoutMs;
21
+ private readonly heartbeatTimeoutMs;
22
+ private readonly heartbeatSweepIntervalMs;
23
+ private journal;
24
+ private sweeper;
25
+ constructor(options?: InProcessBrokerOptions);
26
+ attachJournal(journal: RpcJournal): void;
27
+ onDeliver(listener: RpcDeliveryListener): () => void;
28
+ startHeartbeatSweeper(): void;
29
+ stopHeartbeatSweeper(): void;
30
+ sweepExpired(nowMs?: number): string[];
31
+ requireRegistered(address: RpcAddress): void;
32
+ emitAdvisory(from: RpcAddress, event: RpcEventName, payload: Record<string, unknown>, options?: {
33
+ to?: RpcAddress;
34
+ topic?: string;
35
+ campaignId?: string;
36
+ }): RpcEnvelope;
37
+ status(): RpcStatusSnapshot;
38
+ handle(raw: unknown): RpcEnvelope;
39
+ poll(address: RpcAddress): RpcEnvelope | undefined;
40
+ drain(address: RpcAddress): RpcEnvelope[];
41
+ request(from: RpcAddress, to: RpcAddress, peerMethod: string, payload?: Record<string, unknown>, timeoutMs?: number): Promise<RpcEnvelope>;
42
+ respond(from: RpcAddress, to: RpcAddress, correlationId: string, payload?: Record<string, unknown>, error?: RpcError): RpcEnvelope;
43
+ private handleRequest;
44
+ private register;
45
+ private handleHeartbeat;
46
+ private routeSend;
47
+ private routeRequest;
48
+ private handleResponse;
49
+ private handleAck;
50
+ private subscribe;
51
+ private publish;
52
+ private handleEvent;
53
+ private statusResponse;
54
+ private assertAuthorized;
55
+ private requireClient;
56
+ private enqueue;
57
+ private recordAudit;
58
+ private recordAuditEnvelope;
59
+ private okResponse;
60
+ private errorResponse;
61
+ }
62
+ //# sourceMappingURL=in-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-process.d.ts","sourceRoot":"","sources":["../../../src/rpc/broker/in-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,490 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { RpcAuditLog } from "./audit.js";
3
+ import { RpcError } from "../contract/errors.js";
4
+ import { addressKey, assertMethodAllowed, isHitlForbiddenMethod, parseRpcAddress, parseRpcEnvelope, } from "../contract/parse.js";
5
+ import { parseCampaignTopic } from "../contract/topics.js";
6
+ import { RPC_PROTOCOL_VERSION, } from "../contract/types.js";
7
+ function brokerAddress() {
8
+ return { kind: "broker", id: "local" };
9
+ }
10
+ function nowIso() {
11
+ return new Date().toISOString();
12
+ }
13
+ function newId() {
14
+ return randomUUID();
15
+ }
16
+ /** In-process RPC-FULL CORE broker (transport lives outside). */
17
+ export class InProcessBroker {
18
+ audit = new RpcAuditLog();
19
+ clients = new Map();
20
+ waiters = new Map();
21
+ deliveryListeners = new Set();
22
+ token;
23
+ requestTimeoutMs;
24
+ heartbeatTimeoutMs;
25
+ heartbeatSweepIntervalMs;
26
+ journal;
27
+ sweeper = null;
28
+ constructor(options = {}) {
29
+ this.token = options.token;
30
+ this.requestTimeoutMs = options.requestTimeoutMs ?? 2_000;
31
+ this.heartbeatTimeoutMs = options.heartbeatTimeoutMs ?? 30_000;
32
+ this.heartbeatSweepIntervalMs = options.heartbeatSweepIntervalMs ?? 1_000;
33
+ }
34
+ attachJournal(journal) {
35
+ this.journal = journal;
36
+ }
37
+ onDeliver(listener) {
38
+ this.deliveryListeners.add(listener);
39
+ return () => this.deliveryListeners.delete(listener);
40
+ }
41
+ startHeartbeatSweeper() {
42
+ if (this.sweeper || this.heartbeatTimeoutMs <= 0)
43
+ return;
44
+ this.sweeper = setInterval(() => {
45
+ this.sweepExpired();
46
+ }, this.heartbeatSweepIntervalMs);
47
+ this.sweeper.unref?.();
48
+ }
49
+ stopHeartbeatSweeper() {
50
+ if (!this.sweeper)
51
+ return;
52
+ clearInterval(this.sweeper);
53
+ this.sweeper = null;
54
+ }
55
+ sweepExpired(nowMs = Date.now()) {
56
+ if (this.heartbeatTimeoutMs <= 0)
57
+ return [];
58
+ const removed = [];
59
+ for (const [key, client] of this.clients) {
60
+ const last = Date.parse(client.lastSeenAt);
61
+ if (Number.isNaN(last) || nowMs - last <= this.heartbeatTimeoutMs) {
62
+ continue;
63
+ }
64
+ this.clients.delete(key);
65
+ removed.push(key);
66
+ this.recordAudit("expire", {
67
+ address: client.address,
68
+ lastSeenAt: client.lastSeenAt,
69
+ });
70
+ }
71
+ return removed;
72
+ }
73
+ requireRegistered(address) {
74
+ this.requireClient(address);
75
+ }
76
+ emitAdvisory(from, event, payload, options = {}) {
77
+ return this.handle({
78
+ v: RPC_PROTOCOL_VERSION,
79
+ id: newId(),
80
+ type: "event",
81
+ event,
82
+ from,
83
+ to: options.to ?? null,
84
+ topic: options.topic ?? null,
85
+ campaignId: options.campaignId ?? null,
86
+ ts: nowIso(),
87
+ payload,
88
+ });
89
+ }
90
+ status() {
91
+ return {
92
+ protocolVersion: RPC_PROTOCOL_VERSION,
93
+ clients: [...this.clients.values()].map((c) => ({
94
+ address: c.address,
95
+ ...(c.campaignId !== undefined ? { campaignId: c.campaignId } : {}),
96
+ lastSeenAt: c.lastSeenAt,
97
+ })),
98
+ topics: [
99
+ ...new Set([...this.clients.values()].flatMap((c) => [...c.topics])),
100
+ ].sort(),
101
+ auditCount: this.audit.size,
102
+ };
103
+ }
104
+ handle(raw) {
105
+ let envelope;
106
+ try {
107
+ envelope = parseRpcEnvelope(raw);
108
+ }
109
+ catch (error) {
110
+ return this.errorResponse(raw, error);
111
+ }
112
+ try {
113
+ if (envelope.method && isHitlForbiddenMethod(envelope.method)) {
114
+ assertMethodAllowed(envelope.method);
115
+ }
116
+ switch (envelope.type) {
117
+ case "req":
118
+ return this.handleRequest(envelope);
119
+ case "res":
120
+ return this.handleResponse(envelope);
121
+ case "ack":
122
+ return this.handleAck(envelope);
123
+ case "heartbeat":
124
+ return this.handleHeartbeat(envelope);
125
+ case "event":
126
+ return this.handleEvent(envelope);
127
+ default:
128
+ throw new RpcError("RPC_BAD_ENVELOPE", `Unsupported message type: ${envelope.type}`);
129
+ }
130
+ }
131
+ catch (error) {
132
+ return this.errorResponse(envelope, error);
133
+ }
134
+ }
135
+ poll(address) {
136
+ return this.requireClient(address).inbox.shift();
137
+ }
138
+ drain(address) {
139
+ const client = this.requireClient(address);
140
+ const out = [...client.inbox];
141
+ client.inbox.length = 0;
142
+ return out;
143
+ }
144
+ async request(from, to, peerMethod, payload = {}, timeoutMs = this.requestTimeoutMs) {
145
+ assertMethodAllowed(peerMethod);
146
+ const correlationId = newId();
147
+ const req = {
148
+ v: RPC_PROTOCOL_VERSION,
149
+ id: newId(),
150
+ type: "req",
151
+ method: "request",
152
+ from,
153
+ to,
154
+ correlationId,
155
+ ts: nowIso(),
156
+ payload: { peerMethod, ...payload },
157
+ };
158
+ const responsePromise = new Promise((resolve, reject) => {
159
+ const timer = setTimeout(() => {
160
+ this.waiters.delete(correlationId);
161
+ reject(new RpcError("RPC_TIMEOUT", `Timed out waiting for correlationId ${correlationId}`, { correlationId }));
162
+ }, timeoutMs);
163
+ this.waiters.set(correlationId, { resolve, reject, timer });
164
+ });
165
+ const ackOrErr = this.handle(req);
166
+ if (ackOrErr.error) {
167
+ const waiter = this.waiters.get(correlationId);
168
+ if (waiter) {
169
+ clearTimeout(waiter.timer);
170
+ this.waiters.delete(correlationId);
171
+ }
172
+ throw new RpcError(ackOrErr.error.code, ackOrErr.error.message, {
173
+ ...(ackOrErr.error.details ?? {}),
174
+ });
175
+ }
176
+ return responsePromise;
177
+ }
178
+ respond(from, to, correlationId, payload = {}, error) {
179
+ return this.handle({
180
+ v: RPC_PROTOCOL_VERSION,
181
+ id: newId(),
182
+ type: "res",
183
+ method: "request",
184
+ from,
185
+ to,
186
+ correlationId,
187
+ ts: nowIso(),
188
+ payload,
189
+ ...(error ? { error: error.toBody() } : { error: null }),
190
+ });
191
+ }
192
+ handleRequest(envelope) {
193
+ const method = envelope.method;
194
+ if (!method) {
195
+ throw new RpcError("RPC_BAD_ENVELOPE", "req messages require method");
196
+ }
197
+ assertMethodAllowed(method);
198
+ switch (method) {
199
+ case "register":
200
+ return this.register(envelope);
201
+ case "heartbeat":
202
+ return this.handleHeartbeat(envelope);
203
+ case "send":
204
+ return this.routeSend(envelope);
205
+ case "request":
206
+ return this.routeRequest(envelope);
207
+ case "ack":
208
+ return this.handleAck(envelope);
209
+ case "subscribe":
210
+ return this.subscribe(envelope);
211
+ case "publish":
212
+ return this.publish(envelope);
213
+ case "status":
214
+ return this.statusResponse(envelope);
215
+ default:
216
+ throw new RpcError("RPC_UNKNOWN_METHOD", `Unknown RPC method: ${method}`, { method });
217
+ }
218
+ }
219
+ register(envelope) {
220
+ this.assertAuthorized(envelope);
221
+ const address = parseRpcAddress({
222
+ kind: envelope.payload.kind,
223
+ id: envelope.payload.id,
224
+ });
225
+ const campaignId = typeof envelope.payload.campaignId === "string"
226
+ ? envelope.payload.campaignId
227
+ : typeof envelope.campaignId === "string"
228
+ ? envelope.campaignId
229
+ : undefined;
230
+ const key = addressKey(address);
231
+ const existing = this.clients.get(key);
232
+ const client = existing ?? {
233
+ address,
234
+ inbox: [],
235
+ topics: new Set(),
236
+ lastSeenAt: nowIso(),
237
+ };
238
+ client.lastSeenAt = nowIso();
239
+ if (campaignId !== undefined)
240
+ client.campaignId = campaignId;
241
+ this.clients.set(key, client);
242
+ this.recordAudit("register", { address, campaignId: campaignId ?? null });
243
+ return this.okResponse(envelope, {
244
+ address,
245
+ ...(campaignId !== undefined ? { campaignId } : {}),
246
+ });
247
+ }
248
+ handleHeartbeat(envelope) {
249
+ this.assertAuthorized(envelope);
250
+ const client = this.requireClient(envelope.from);
251
+ client.lastSeenAt = nowIso();
252
+ this.recordAuditEnvelope("heartbeat", envelope);
253
+ return this.okResponse(envelope, {
254
+ ok: true,
255
+ lastSeenAt: client.lastSeenAt,
256
+ });
257
+ }
258
+ routeSend(envelope) {
259
+ this.assertAuthorized(envelope);
260
+ this.requireClient(envelope.from);
261
+ if (!envelope.to) {
262
+ throw new RpcError("RPC_BAD_ENVELOPE", "send requires to");
263
+ }
264
+ const target = this.requireClient(envelope.to);
265
+ const inboxMsg = {
266
+ v: RPC_PROTOCOL_VERSION,
267
+ id: newId(),
268
+ type: "req",
269
+ method: "send",
270
+ from: envelope.from,
271
+ to: envelope.to,
272
+ correlationId: envelope.correlationId ?? null,
273
+ campaignId: envelope.campaignId ?? null,
274
+ ts: nowIso(),
275
+ payload: envelope.payload,
276
+ };
277
+ this.enqueue(target, inboxMsg);
278
+ this.recordAuditEnvelope("send", inboxMsg);
279
+ return this.okResponse(envelope, {
280
+ delivered: true,
281
+ messageId: inboxMsg.id,
282
+ });
283
+ }
284
+ routeRequest(envelope) {
285
+ this.assertAuthorized(envelope);
286
+ this.requireClient(envelope.from);
287
+ if (!envelope.to) {
288
+ throw new RpcError("RPC_BAD_ENVELOPE", "request requires to");
289
+ }
290
+ if (!envelope.correlationId) {
291
+ throw new RpcError("RPC_BAD_ENVELOPE", "request requires correlationId");
292
+ }
293
+ const peerMethod = envelope.payload.peerMethod;
294
+ if (typeof peerMethod === "string") {
295
+ assertMethodAllowed(peerMethod);
296
+ }
297
+ this.enqueue(this.requireClient(envelope.to), envelope);
298
+ this.recordAuditEnvelope("request", envelope);
299
+ return this.okResponse(envelope, { queued: true });
300
+ }
301
+ handleResponse(envelope) {
302
+ this.assertAuthorized(envelope);
303
+ this.requireClient(envelope.from);
304
+ if (!envelope.correlationId) {
305
+ throw new RpcError("RPC_BAD_ENVELOPE", "res requires correlationId");
306
+ }
307
+ const waiter = this.waiters.get(envelope.correlationId);
308
+ if (waiter) {
309
+ clearTimeout(waiter.timer);
310
+ this.waiters.delete(envelope.correlationId);
311
+ waiter.resolve(envelope);
312
+ }
313
+ else if (envelope.to) {
314
+ const target = this.clients.get(addressKey(envelope.to));
315
+ if (target)
316
+ this.enqueue(target, envelope);
317
+ }
318
+ this.recordAuditEnvelope("res", envelope);
319
+ return this.okResponse(envelope, { accepted: true });
320
+ }
321
+ handleAck(envelope) {
322
+ this.assertAuthorized(envelope);
323
+ this.requireClient(envelope.from);
324
+ this.recordAuditEnvelope("ack", envelope);
325
+ return this.okResponse(envelope, { ok: true });
326
+ }
327
+ subscribe(envelope) {
328
+ this.assertAuthorized(envelope);
329
+ const client = this.requireClient(envelope.from);
330
+ const topic = typeof envelope.topic === "string"
331
+ ? envelope.topic
332
+ : typeof envelope.payload.topic === "string"
333
+ ? envelope.payload.topic
334
+ : null;
335
+ if (!topic) {
336
+ throw new RpcError("RPC_BAD_ENVELOPE", "subscribe requires topic");
337
+ }
338
+ parseCampaignTopic(topic);
339
+ client.topics.add(topic);
340
+ this.recordAudit("subscribe", { address: client.address, topic });
341
+ return this.okResponse(envelope, { topic, subscribed: true });
342
+ }
343
+ publish(envelope) {
344
+ this.assertAuthorized(envelope);
345
+ this.requireClient(envelope.from);
346
+ const topic = typeof envelope.topic === "string"
347
+ ? envelope.topic
348
+ : typeof envelope.payload.topic === "string"
349
+ ? envelope.payload.topic
350
+ : null;
351
+ if (!topic) {
352
+ throw new RpcError("RPC_BAD_ENVELOPE", "publish requires topic");
353
+ }
354
+ parseCampaignTopic(topic);
355
+ const event = {
356
+ v: RPC_PROTOCOL_VERSION,
357
+ id: newId(),
358
+ type: "event",
359
+ event: "trellis.campaign.topic",
360
+ from: envelope.from,
361
+ to: null,
362
+ campaignId: envelope.campaignId ?? null,
363
+ topic,
364
+ correlationId: envelope.correlationId ?? null,
365
+ ts: nowIso(),
366
+ payload: envelope.payload.body
367
+ ? { body: envelope.payload.body }
368
+ : { ...envelope.payload, topic },
369
+ };
370
+ let delivered = 0;
371
+ for (const client of this.clients.values()) {
372
+ if (!client.topics.has(topic))
373
+ continue;
374
+ if (addressKey(client.address) === addressKey(envelope.from))
375
+ continue;
376
+ this.enqueue(client, event);
377
+ delivered += 1;
378
+ }
379
+ this.recordAudit("publish", { topic, delivered, from: envelope.from });
380
+ return this.okResponse(envelope, { topic, delivered });
381
+ }
382
+ handleEvent(envelope) {
383
+ this.assertAuthorized(envelope);
384
+ this.requireClient(envelope.from);
385
+ if (envelope.to) {
386
+ this.enqueue(this.requireClient(envelope.to), envelope);
387
+ }
388
+ else if (envelope.topic) {
389
+ parseCampaignTopic(envelope.topic);
390
+ for (const client of this.clients.values()) {
391
+ if (!client.topics.has(envelope.topic))
392
+ continue;
393
+ if (addressKey(client.address) === addressKey(envelope.from))
394
+ continue;
395
+ this.enqueue(client, envelope);
396
+ }
397
+ }
398
+ this.recordAuditEnvelope("event", envelope);
399
+ return this.okResponse(envelope, { accepted: true });
400
+ }
401
+ statusResponse(envelope) {
402
+ this.assertAuthorized(envelope);
403
+ this.requireClient(envelope.from);
404
+ return this.okResponse(envelope, this.status());
405
+ }
406
+ assertAuthorized(envelope) {
407
+ if (this.token === undefined)
408
+ return;
409
+ const provided = typeof envelope.payload.token === "string"
410
+ ? envelope.payload.token
411
+ : undefined;
412
+ if (provided !== this.token) {
413
+ throw new RpcError("RPC_UNAUTHORIZED", "Invalid or missing local RPC token");
414
+ }
415
+ }
416
+ requireClient(address) {
417
+ const client = this.clients.get(addressKey(address));
418
+ if (!client) {
419
+ throw new RpcError("RPC_NOT_REGISTERED", `Client not registered: ${addressKey(address)}`);
420
+ }
421
+ return client;
422
+ }
423
+ enqueue(client, envelope) {
424
+ client.inbox.push(envelope);
425
+ for (const listener of this.deliveryListeners) {
426
+ listener(client.address, envelope);
427
+ }
428
+ }
429
+ recordAudit(kind, detail) {
430
+ const entry = this.audit.append(kind, detail);
431
+ this.journal?.append(entry);
432
+ }
433
+ recordAuditEnvelope(kind, envelope) {
434
+ const entry = this.audit.appendEnvelope(kind, envelope);
435
+ this.journal?.append(entry);
436
+ }
437
+ okResponse(request, payload) {
438
+ return {
439
+ v: RPC_PROTOCOL_VERSION,
440
+ id: newId(),
441
+ type: "res",
442
+ method: request.method ?? "status",
443
+ from: brokerAddress(),
444
+ to: request.from,
445
+ correlationId: request.correlationId ?? request.id,
446
+ campaignId: request.campaignId ?? null,
447
+ ts: nowIso(),
448
+ payload,
449
+ error: null,
450
+ };
451
+ }
452
+ errorResponse(raw, error) {
453
+ const rpcError = error instanceof RpcError
454
+ ? error
455
+ : new RpcError("RPC_INTERNAL", error instanceof Error ? error.message : String(error));
456
+ this.recordAudit("error", { ...rpcError.toBody() });
457
+ let to = brokerAddress();
458
+ let correlationId = null;
459
+ let method = "status";
460
+ if (raw && typeof raw === "object" && !Array.isArray(raw)) {
461
+ const r = raw;
462
+ try {
463
+ if (r.from)
464
+ to = parseRpcAddress(r.from);
465
+ }
466
+ catch {
467
+ // keep broker address
468
+ }
469
+ if (typeof r.correlationId === "string")
470
+ correlationId = r.correlationId;
471
+ else if (typeof r.id === "string")
472
+ correlationId = r.id;
473
+ if (typeof r.method === "string")
474
+ method = r.method;
475
+ }
476
+ return {
477
+ v: RPC_PROTOCOL_VERSION,
478
+ id: newId(),
479
+ type: "res",
480
+ method,
481
+ from: brokerAddress(),
482
+ to,
483
+ correlationId,
484
+ ts: nowIso(),
485
+ payload: {},
486
+ error: rpcError.toBody(),
487
+ };
488
+ }
489
+ }
490
+ //# sourceMappingURL=in-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-process.js","sourceRoot":"","sources":["../../../src/rpc/broker/in-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { RpcAuditEntry } from "./audit.js";
2
+ /**
3
+ * Optional append-only journal under a directory (callers use
4
+ * `~/.cstl/rpc/` or a test temp dir). Separate from `~/.cstl/channels/`.
5
+ */
6
+ export declare class RpcJournal {
7
+ readonly filePath: string;
8
+ constructor(dir: string, fileName?: string);
9
+ append(entry: RpcAuditEntry): void;
10
+ }
11
+ //# sourceMappingURL=journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../../src/rpc/broker/journal.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;GAGG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAgB;IAKjD,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;CAGnC"}
@@ -0,0 +1,17 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ /**
4
+ * Optional append-only journal under a directory (callers use
5
+ * `~/.cstl/rpc/` or a test temp dir). Separate from `~/.cstl/channels/`.
6
+ */
7
+ export class RpcJournal {
8
+ filePath;
9
+ constructor(dir, fileName = "audit.jsonl") {
10
+ fs.mkdirSync(dir, { recursive: true });
11
+ this.filePath = path.join(dir, fileName);
12
+ }
13
+ append(entry) {
14
+ fs.appendFileSync(this.filePath, `${JSON.stringify(entry)}\n`, "utf8");
15
+ }
16
+ }
17
+ //# sourceMappingURL=journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.js","sourceRoot":"","sources":["../../../src/rpc/broker/journal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B;;;GAGG;AACH,MAAM,OAAO,UAAU;IACZ,QAAQ,CAAS;IAE1B,YAAY,GAAW,EAAE,QAAQ,GAAG,aAAa;QAC/C,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,KAAoB;QACzB,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;CACF"}