agent-comms 2.21.16 → 2.21.18

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-protocol-admission.test.js","sourceRoot":"","sources":["../../src/test/room-protocol-admission.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=room-protocol.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-protocol.test.d.ts","sourceRoot":"","sources":["../../src/test/room-protocol.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,580 @@
1
+ /**
2
+ * Direct, DI-based unit tests for RoomProtocol -- the receiving/responding half of the room wire protocol, split across two files to stay under this repo's max-lines cap: this file covers handleRoomSend, handleRoomRead, handleRoomMembers, and sendRoomMessageDirected. See room-protocol-admission.test.ts for sendRoomRequestToMember/flushPendingRoomRequests, handleRoomJoin/admitRoomJoin, acceptRoomJoin/rejectRoomJoin, handleRoomInvite, and handleRoomLeave, and its own copy of this file's header comment for the full rationale (real identities/tokens, not opaque placeholders, since this side genuinely verifies tokens cryptographically).
3
+ */
4
+ import { beforeEach, describe, expect, it, vi } from "vitest";
5
+ import * as fs from "node:fs";
6
+ import * as path from "node:path";
7
+ import { tmpdir } from "node:os";
8
+ import { bytesToHex, deviceIdFromHex } from "wire-mesh-core/domain/device-id";
9
+ import { mintCapabilityToken } from "wire-mesh-core/domain/tokens";
10
+ import { createSystemClock } from "wire-mesh-core/adapters/system-clock";
11
+ import { createRevocationView } from "wire-mesh-core/domain/revocation-view";
12
+ import { generateIdentity } from "../core/identity.js";
13
+ import { loadOrCreateIdentity, saveRoomToken, } from "../core/identity-store.js";
14
+ import { toIdentityPort } from "../core/wire-mesh-identity.js";
15
+ import { dmRoomPath, ownerNamedRoomPath } from "../core/room-path.js";
16
+ import { RoomProtocol } from "../core/room-protocol.js";
17
+ import { randomId } from "../core/random-id.js";
18
+ const TOKEN_TTL_MS = 60_000;
19
+ const MAX_QUEUED_DELIVERIES_PER_AGENT = 100;
20
+ /** A device-id is a 64-character lowercase hex SHA-256 digest; room-path.ts's assertDeviceIdHex rejects anything shorter. */
21
+ const DEVICE_ID_HEX_LENGTH = 64;
22
+ /** Distinct, real random ids for fixture message/ref/token ids -- randomId() is the exact utility production code (admitRoomJoin, sendRoomMessageDirected) uses for the identical purpose, so these fixtures need no arbitrary literal bytes of their own. */
23
+ const SAMPLE_MESSAGE_ID = randomId();
24
+ /** A message-id this store will never recognise, standing in for "already expired from history". */
25
+ const UNRECOGNISED_MESSAGE_ID = randomId();
26
+ /** Arbitrary, distinctive placeholder bytes for a message-ref's own id. */
27
+ const SAMPLE_REF_ID = randomId();
28
+ const SAMPLE_TOKEN_ID = randomId();
29
+ function room(overrides = {}) {
30
+ return {
31
+ id: "room-1",
32
+ version: 1,
33
+ name: "room-name",
34
+ type: "public",
35
+ owner: "",
36
+ createdAt: "2026-01-01T00:00:00.000Z",
37
+ description: "a room",
38
+ members: [],
39
+ invited: [],
40
+ memberJoins: {},
41
+ memberLeaves: {},
42
+ invitedJoins: {},
43
+ invitedLeaves: {},
44
+ ...overrides,
45
+ };
46
+ }
47
+ function agent(overrides = {}) {
48
+ return {
49
+ id: "",
50
+ version: 1,
51
+ name: "agent-name",
52
+ harness: "pi",
53
+ cwd: "/tmp/agent",
54
+ pid: 1,
55
+ startedAt: "2026-01-01T00:00:00.000Z",
56
+ visibility: "visible",
57
+ status: "active",
58
+ tags: [],
59
+ subscribedRooms: [],
60
+ ...overrides,
61
+ };
62
+ }
63
+ async function makeIdentities() {
64
+ const owner = generateIdentity();
65
+ const member = generateIdentity();
66
+ return {
67
+ ownerId: bytesToHex(Uint8Array.from(owner.deviceId)),
68
+ ownerPort: await toIdentityPort(owner),
69
+ memberId: bytesToHex(Uint8Array.from(member.deviceId)),
70
+ };
71
+ }
72
+ async function mintRoomToken(issuerPort, bearerHex, roomPath) {
73
+ const clock = createSystemClock();
74
+ const verdict = await mintCapabilityToken({
75
+ identity: issuerPort,
76
+ clock,
77
+ tokenId: SAMPLE_TOKEN_ID,
78
+ bearer: deviceIdFromHex(bearerHex),
79
+ capability: "room:member",
80
+ scope: { kind: "room", path: roomPath },
81
+ expires: clock.now() + TOKEN_TTL_MS,
82
+ delegationsRemaining: 0,
83
+ });
84
+ if (!verdict.ok)
85
+ throw new Error("expected the fixture token to mint successfully");
86
+ return verdict.token;
87
+ }
88
+ async function makeHarness() {
89
+ const ids = await makeIdentities();
90
+ const slotDir = fs.mkdtempSync(path.join(tmpdir(), "room-protocol-test-"));
91
+ const slot = { harness: "test", cwd: "room-protocol", dir: slotDir };
92
+ // saveRoomToken/saveIssuedRoomGrant write into this slot's own persisted identity file, which must already exist on disk -- unrelated to which crypto identity requireIdentity() uses for minting/verifying, purely a filesystem bookkeeping precondition.
93
+ loadOrCreateIdentity(slot);
94
+ const queueDelivery = vi.fn();
95
+ const fireLocalDelivery = vi.fn();
96
+ const bump = vi.fn();
97
+ const recordMemberOp = vi.fn();
98
+ const refreshMembership = vi.fn();
99
+ const broadcastPatch = vi.fn().mockResolvedValue(undefined);
100
+ const deliverToRoom = vi.fn().mockResolvedValue(undefined);
101
+ const revokeMemberGrant = vi.fn().mockResolvedValue(undefined);
102
+ const sendRoomRequest = vi
103
+ .fn()
104
+ .mockResolvedValue({ result: "ok" });
105
+ const deps = {
106
+ rooms: new Map(),
107
+ messages: new Map(),
108
+ dms: new Map(),
109
+ agents: new Map(),
110
+ dmRequestsInitiatedByMe: new Set(),
111
+ getPeerId: () => ids.ownerId,
112
+ requireIdentity: () => ({
113
+ identity: ids.ownerPort,
114
+ clock: createSystemClock(),
115
+ slot,
116
+ revocation: createRevocationView(),
117
+ }),
118
+ requireTransport: () => ({ sendRoomRequest }),
119
+ deliveryEngine: {
120
+ queueDelivery,
121
+ fireLocalDelivery,
122
+ bump,
123
+ recordMemberOp,
124
+ refreshMembership,
125
+ broadcastPatch,
126
+ deliverToRoom,
127
+ },
128
+ revokeMemberGrant,
129
+ };
130
+ return {
131
+ deps,
132
+ protocol: new RoomProtocol(deps),
133
+ ids,
134
+ slotDir,
135
+ queueDelivery,
136
+ fireLocalDelivery,
137
+ bump,
138
+ recordMemberOp,
139
+ refreshMembership,
140
+ broadcastPatch,
141
+ deliverToRoom,
142
+ revokeMemberGrant,
143
+ sendRoomRequest,
144
+ };
145
+ }
146
+ function handle(deviceHex) {
147
+ return { id: deviceHex };
148
+ }
149
+ function manageRequest(overrides = {}) {
150
+ return {
151
+ requestId: 1,
152
+ command: { verb: "room:member", params: overrides.params ?? {} },
153
+ scope: overrides.scope ?? { kind: "room", path: "room-1" },
154
+ token: overrides.token,
155
+ respond: vi.fn().mockResolvedValue(undefined),
156
+ };
157
+ }
158
+ describe("RoomProtocol — handleRoomSend", () => {
159
+ let h;
160
+ let ownerNamedRoom;
161
+ beforeEach(async () => {
162
+ h = await makeHarness();
163
+ ownerNamedRoom = ownerNamedRoomPath(h.ids.ownerId, "general");
164
+ h.deps.rooms.set(ownerNamedRoom, room({
165
+ id: ownerNamedRoom,
166
+ owner: h.ids.ownerId,
167
+ members: [h.ids.ownerId, h.ids.memberId],
168
+ }));
169
+ });
170
+ async function send(params, token) {
171
+ const handler = h.protocol.roomVerbHandlers["room.send"];
172
+ if (handler === undefined)
173
+ throw new Error("expected room.send handler");
174
+ return handler(manageRequest({
175
+ scope: { kind: "room", path: ownerNamedRoom },
176
+ token,
177
+ params,
178
+ }), handle(h.ids.memberId));
179
+ }
180
+ it("returns missing_scope_path when the request carries no room path", async () => {
181
+ const handler = h.protocol.roomVerbHandlers["room.send"];
182
+ if (handler === undefined)
183
+ throw new Error("expected room.send handler");
184
+ const outcome = await handler(manageRequest({ scope: { kind: "room" } }), handle(h.ids.memberId));
185
+ expect(outcome).toEqual({ result: "error", code: "missing_scope_path" });
186
+ });
187
+ it("returns unauthorized when no token is presented", async () => {
188
+ const outcome = await send({}, undefined);
189
+ expect(outcome).toEqual({ result: "error", code: "unauthorized" });
190
+ });
191
+ it("returns unauthorized for a token that fails verification (wrong bearer)", async () => {
192
+ const wrongBearerToken = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, ownerNamedRoom);
193
+ const outcome = await send({}, wrongBearerToken);
194
+ expect(outcome).toEqual({ result: "error", code: "unauthorized" });
195
+ });
196
+ it("returns malformed_params for params that don't satisfy the room.send schema", async () => {
197
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
198
+ const outcome = await send({ verb: "room.send" }, token);
199
+ expect(outcome).toEqual({ result: "error", code: "malformed_params" });
200
+ });
201
+ it("stores the message in this room's own history and returns ok", async () => {
202
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
203
+ const outcome = await send({
204
+ verb: "room.send",
205
+ "message-id": SAMPLE_MESSAGE_ID,
206
+ "sent-at": Date.now(),
207
+ text: "hi there",
208
+ }, token);
209
+ expect(outcome).toEqual({ result: "ok" });
210
+ const history = h.deps.messages.get(ownerNamedRoom);
211
+ expect(history).toHaveLength(1);
212
+ expect(history?.[0]?.content).toBe("hi there");
213
+ expect(history?.[0]?.from).toBe(h.ids.memberId);
214
+ expect(history?.[0]?.readBy).toEqual([h.ids.memberId]);
215
+ });
216
+ it('includes replyTo only when a refs entry has relation "reply"', async () => {
217
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
218
+ await send({
219
+ verb: "room.send",
220
+ "message-id": SAMPLE_MESSAGE_ID,
221
+ "sent-at": Date.now(),
222
+ text: "reply",
223
+ refs: [
224
+ { id: SAMPLE_REF_ID, relation: "forward" },
225
+ { id: SAMPLE_REF_ID, relation: "reply" },
226
+ ],
227
+ }, token);
228
+ const stored = h.deps.messages.get(ownerNamedRoom)?.[0];
229
+ expect(stored?.replyTo).toBe(Buffer.from(SAMPLE_REF_ID).toString("hex"));
230
+ });
231
+ it('omits replyTo when no refs entry has relation "reply"', async () => {
232
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
233
+ await send({
234
+ verb: "room.send",
235
+ "message-id": SAMPLE_MESSAGE_ID,
236
+ "sent-at": Date.now(),
237
+ text: "no reply",
238
+ refs: [{ id: SAMPLE_REF_ID, relation: "forward" }],
239
+ }, token);
240
+ const stored = h.deps.messages.get(ownerNamedRoom)?.[0];
241
+ expect(stored).not.toHaveProperty("replyTo");
242
+ });
243
+ it("includes streamingBehavior only when a valid value is present", async () => {
244
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
245
+ await send({
246
+ verb: "room.send",
247
+ "message-id": SAMPLE_MESSAGE_ID,
248
+ "sent-at": Date.now(),
249
+ text: "steer",
250
+ "streaming-behavior": "steer",
251
+ }, token);
252
+ const stored = h.deps.messages.get(ownerNamedRoom)?.[0];
253
+ expect(stored?.streamingBehavior).toBe("steer");
254
+ });
255
+ it("drops an unrecognised streamingBehavior value rather than rejecting the whole send", async () => {
256
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
257
+ const outcome = await send({
258
+ verb: "room.send",
259
+ "message-id": SAMPLE_MESSAGE_ID,
260
+ "sent-at": Date.now(),
261
+ text: "bad behavior",
262
+ "streaming-behavior": "not-a-real-behavior",
263
+ }, token);
264
+ expect(outcome).toEqual({ result: "ok" });
265
+ const stored = h.deps.messages.get(ownerNamedRoom)?.[0];
266
+ expect(stored).not.toHaveProperty("streamingBehavior");
267
+ });
268
+ it("delivers the message locally and queues it, for the owner's own peer id", async () => {
269
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
270
+ await send({
271
+ verb: "room.send",
272
+ "message-id": SAMPLE_MESSAGE_ID,
273
+ "sent-at": Date.now(),
274
+ text: "hi",
275
+ }, token);
276
+ expect(h.queueDelivery).toHaveBeenCalledWith(h.ids.ownerId, expect.objectContaining({ type: "room_message" }));
277
+ expect(h.fireLocalDelivery).toHaveBeenCalledWith(h.ids.ownerId, expect.objectContaining({ type: "room_message" }));
278
+ });
279
+ it("stores a DM-path send as a DmMessage keyed by the dm path, self-issued and bearer as the sender", async () => {
280
+ const h2 = await makeHarness();
281
+ const dmPath = dmRoomPath(h2.ids.ownerId, h2.ids.memberId);
282
+ // Obligation 1 for a DM: the chain root must be the verifying identity itself.
283
+ const token = await mintRoomToken(h2.ids.ownerPort, h2.ids.memberId, dmPath);
284
+ const handler = h2.protocol.roomVerbHandlers["room.send"];
285
+ if (handler === undefined)
286
+ throw new Error("expected room.send handler");
287
+ const outcome = await handler(manageRequest({
288
+ scope: { kind: "room", path: dmPath },
289
+ token,
290
+ params: {
291
+ verb: "room.send",
292
+ "message-id": SAMPLE_MESSAGE_ID,
293
+ "sent-at": Date.now(),
294
+ text: "dm hello",
295
+ },
296
+ }), handle(h2.ids.memberId));
297
+ expect(outcome).toEqual({ result: "ok" });
298
+ const dmHistory = h2.deps.dms.get(dmPath);
299
+ expect(dmHistory).toHaveLength(1);
300
+ expect(dmHistory?.[0]?.to).toBe(h2.ids.ownerId);
301
+ expect(dmHistory?.[0]?.from).toBe(h2.ids.memberId);
302
+ expect(h2.deps.messages.has(dmPath)).toBe(false);
303
+ });
304
+ it("includes streamingBehavior on a DM-path send only when a valid value is present", async () => {
305
+ const h2 = await makeHarness();
306
+ const dmPath = dmRoomPath(h2.ids.ownerId, h2.ids.memberId);
307
+ const token = await mintRoomToken(h2.ids.ownerPort, h2.ids.memberId, dmPath);
308
+ const handler = h2.protocol.roomVerbHandlers["room.send"];
309
+ if (handler === undefined)
310
+ throw new Error("expected room.send handler");
311
+ await handler(manageRequest({
312
+ scope: { kind: "room", path: dmPath },
313
+ token,
314
+ params: {
315
+ verb: "room.send",
316
+ "message-id": SAMPLE_MESSAGE_ID,
317
+ "sent-at": Date.now(),
318
+ text: "dm steer",
319
+ "streaming-behavior": "steer",
320
+ },
321
+ }), handle(h2.ids.memberId));
322
+ expect(h2.deps.dms.get(dmPath)?.[0]?.streamingBehavior).toBe("steer");
323
+ const h3 = await makeHarness();
324
+ const dmPath2 = dmRoomPath(h3.ids.ownerId, h3.ids.memberId);
325
+ const token2 = await mintRoomToken(h3.ids.ownerPort, h3.ids.memberId, dmPath2);
326
+ const handler2 = h3.protocol.roomVerbHandlers["room.send"];
327
+ if (handler2 === undefined)
328
+ throw new Error("expected room.send handler");
329
+ await handler2(manageRequest({
330
+ scope: { kind: "room", path: dmPath2 },
331
+ token: token2,
332
+ params: {
333
+ verb: "room.send",
334
+ "message-id": SAMPLE_MESSAGE_ID,
335
+ "sent-at": Date.now(),
336
+ text: "dm no behavior",
337
+ },
338
+ }), handle(h3.ids.memberId));
339
+ expect(h3.deps.dms.get(dmPath2)?.[0]).not.toHaveProperty("streamingBehavior");
340
+ });
341
+ });
342
+ describe("RoomProtocol — handleRoomRead", () => {
343
+ let h;
344
+ let ownerNamedRoom;
345
+ beforeEach(async () => {
346
+ h = await makeHarness();
347
+ ownerNamedRoom = ownerNamedRoomPath(h.ids.ownerId, "general");
348
+ h.deps.rooms.set(ownerNamedRoom, room({
349
+ id: ownerNamedRoom,
350
+ owner: h.ids.ownerId,
351
+ members: [h.ids.ownerId, h.ids.memberId],
352
+ }));
353
+ });
354
+ async function read(params, token) {
355
+ const handlerFn = h.protocol.roomVerbHandlers["room.read"];
356
+ if (handlerFn === undefined)
357
+ throw new Error("expected room.read handler");
358
+ return handlerFn(manageRequest({
359
+ scope: { kind: "room", path: ownerNamedRoom },
360
+ token,
361
+ params,
362
+ }), handle(h.ids.memberId));
363
+ }
364
+ it("returns missing_scope_path when the request carries no room path", async () => {
365
+ const handlerFn = h.protocol.roomVerbHandlers["room.read"];
366
+ if (handlerFn === undefined)
367
+ throw new Error("expected room.read handler");
368
+ const outcome = await handlerFn(manageRequest({ scope: { kind: "room" } }), handle(h.ids.memberId));
369
+ expect(outcome).toEqual({ result: "error", code: "missing_scope_path" });
370
+ });
371
+ it("returns unauthorized when no token is presented", async () => {
372
+ expect(await read({}, undefined)).toEqual({
373
+ result: "error",
374
+ code: "unauthorized",
375
+ });
376
+ });
377
+ it("returns unauthorized for a token that fails verification", async () => {
378
+ const wrongBearerToken = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, ownerNamedRoom);
379
+ expect(await read({}, wrongBearerToken)).toEqual({
380
+ result: "error",
381
+ code: "unauthorized",
382
+ });
383
+ });
384
+ it("returns malformed_params for params that don't satisfy the room.read schema", async () => {
385
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
386
+ expect(await read({ verb: "room.read" }, token)).toEqual({
387
+ result: "error",
388
+ code: "malformed_params",
389
+ });
390
+ });
391
+ it("silently skips a message-id this store doesn't recognise, rather than erroring", async () => {
392
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
393
+ const outcome = await read({
394
+ verb: "room.read",
395
+ messages: [UNRECOGNISED_MESSAGE_ID],
396
+ at: Date.now(),
397
+ }, token);
398
+ expect(outcome).toEqual({ result: "ok" });
399
+ expect(h.queueDelivery).not.toHaveBeenCalled();
400
+ });
401
+ it("marks a recognised message read and fires a delivery_status event, only once even if already read", async () => {
402
+ const messageId = "aa";
403
+ h.deps.messages.set(ownerNamedRoom, [
404
+ {
405
+ id: messageId,
406
+ from: h.ids.ownerId,
407
+ room: ownerNamedRoom,
408
+ content: "hi",
409
+ timestamp: "2026-01-01T00:00:00.000Z",
410
+ readBy: [h.ids.ownerId],
411
+ },
412
+ ]);
413
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
414
+ await read({
415
+ verb: "room.read",
416
+ messages: [Buffer.from(messageId, "hex")],
417
+ at: Date.now(),
418
+ }, token);
419
+ const stored = h.deps.messages.get(ownerNamedRoom)?.[0];
420
+ expect(stored?.readBy).toEqual([h.ids.ownerId, h.ids.memberId]);
421
+ expect(h.queueDelivery).toHaveBeenCalledWith(h.ids.ownerId, expect.objectContaining({
422
+ type: "delivery_status",
423
+ room: ownerNamedRoom,
424
+ }));
425
+ // Reading it again must not duplicate the readBy entry.
426
+ h.queueDelivery.mockClear();
427
+ await read({
428
+ verb: "room.read",
429
+ messages: [Buffer.from(messageId, "hex")],
430
+ at: Date.now(),
431
+ }, token);
432
+ expect(stored?.readBy).toEqual([h.ids.ownerId, h.ids.memberId]);
433
+ });
434
+ it("reads against the dm history, not the room history, for a dm path, and omits room from the event", async () => {
435
+ const h2 = await makeHarness();
436
+ const dmPath = dmRoomPath(h2.ids.ownerId, h2.ids.memberId);
437
+ const messageId = "bb";
438
+ h2.deps.dms.set(dmPath, [
439
+ {
440
+ id: messageId,
441
+ from: h2.ids.ownerId,
442
+ to: h2.ids.memberId,
443
+ content: "hi",
444
+ timestamp: "2026-01-01T00:00:00.000Z",
445
+ readBy: [],
446
+ },
447
+ ]);
448
+ const token = await mintRoomToken(h2.ids.ownerPort, h2.ids.memberId, dmPath);
449
+ const handlerFn = h2.protocol.roomVerbHandlers["room.read"];
450
+ if (handlerFn === undefined)
451
+ throw new Error("expected room.read handler");
452
+ await handlerFn(manageRequest({
453
+ scope: { kind: "room", path: dmPath },
454
+ token,
455
+ params: {
456
+ verb: "room.read",
457
+ messages: [Buffer.from(messageId, "hex")],
458
+ at: Date.now(),
459
+ },
460
+ }), handle(h2.ids.memberId));
461
+ expect(h2.deps.dms.get(dmPath)?.[0]?.readBy).toEqual([h2.ids.memberId]);
462
+ const call = h2.queueDelivery.mock.calls[0];
463
+ expect(call?.[1]).not.toHaveProperty("room");
464
+ });
465
+ });
466
+ describe("RoomProtocol — handleRoomMembers", () => {
467
+ let h;
468
+ let ownerNamedRoom;
469
+ beforeEach(async () => {
470
+ h = await makeHarness();
471
+ ownerNamedRoom = ownerNamedRoomPath(h.ids.ownerId, "general");
472
+ });
473
+ it("returns missing_scope_path when the request carries no room path", async () => {
474
+ const handlerFn = h.protocol.roomVerbHandlers["room.members"];
475
+ if (handlerFn === undefined)
476
+ throw new Error("expected room.members handler");
477
+ const outcome = await handlerFn(manageRequest({ scope: { kind: "room" } }), handle(h.ids.memberId));
478
+ expect(outcome).toEqual({ result: "error", code: "missing_scope_path" });
479
+ });
480
+ it("returns unauthorized when no token is presented", async () => {
481
+ const handlerFn = h.protocol.roomVerbHandlers["room.members"];
482
+ if (handlerFn === undefined)
483
+ throw new Error("expected room.members handler");
484
+ const outcome = await handlerFn(manageRequest({ scope: { kind: "room", path: ownerNamedRoom } }), handle(h.ids.memberId));
485
+ expect(outcome).toEqual({ result: "error", code: "unauthorized" });
486
+ });
487
+ it("returns unauthorized for a token that fails verification", async () => {
488
+ const wrongBearerToken = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, ownerNamedRoom);
489
+ const handlerFn = h.protocol.roomVerbHandlers["room.members"];
490
+ if (handlerFn === undefined)
491
+ throw new Error("expected room.members handler");
492
+ const outcome = await handlerFn(manageRequest({
493
+ scope: { kind: "room", path: ownerNamedRoom },
494
+ token: wrongBearerToken,
495
+ }), handle(h.ids.memberId));
496
+ expect(outcome).toEqual({ result: "error", code: "unauthorized" });
497
+ });
498
+ it("returns an empty members list for a room this store has no local record of", async () => {
499
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
500
+ const handlerFn = h.protocol.roomVerbHandlers["room.members"];
501
+ if (handlerFn === undefined)
502
+ throw new Error("expected room.members handler");
503
+ const outcome = await handlerFn(manageRequest({ scope: { kind: "room", path: ownerNamedRoom }, token }), handle(h.ids.memberId));
504
+ expect(outcome).toMatchObject({ result: "ok", members: [] });
505
+ });
506
+ it("maps a named room's real member list to device objects", async () => {
507
+ h.deps.rooms.set(ownerNamedRoom, room({
508
+ id: ownerNamedRoom,
509
+ owner: h.ids.ownerId,
510
+ members: [h.ids.ownerId, h.ids.memberId],
511
+ }));
512
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.memberId, ownerNamedRoom);
513
+ const handlerFn = h.protocol.roomVerbHandlers["room.members"];
514
+ if (handlerFn === undefined)
515
+ throw new Error("expected room.members handler");
516
+ const outcome = await handlerFn(manageRequest({ scope: { kind: "room", path: ownerNamedRoom }, token }), handle(h.ids.memberId));
517
+ expect(outcome).toMatchObject({
518
+ result: "ok",
519
+ members: [
520
+ { device: deviceIdFromHex(h.ids.ownerId) },
521
+ { device: deviceIdFromHex(h.ids.memberId) },
522
+ ],
523
+ });
524
+ });
525
+ it("derives a dm path's members directly from its own two participants, with no Room record", async () => {
526
+ const h2 = await makeHarness();
527
+ const dmPath = dmRoomPath(h2.ids.ownerId, h2.ids.memberId);
528
+ const token = await mintRoomToken(h2.ids.ownerPort, h2.ids.memberId, dmPath);
529
+ const handlerFn = h2.protocol.roomVerbHandlers["room.members"];
530
+ if (handlerFn === undefined)
531
+ throw new Error("expected room.members handler");
532
+ const outcome = await handlerFn(manageRequest({ scope: { kind: "room", path: dmPath }, token }), handle(h2.ids.memberId));
533
+ // dmRoomPath sorts its two participants lexicographically, so the resulting member order isn't [owner, member] -- it's whichever hex string sorts first.
534
+ const [first, second] = h2.ids.ownerId < h2.ids.memberId
535
+ ? [h2.ids.ownerId, h2.ids.memberId]
536
+ : [h2.ids.memberId, h2.ids.ownerId];
537
+ expect(outcome).toMatchObject({
538
+ result: "ok",
539
+ members: [
540
+ { device: deviceIdFromHex(first) },
541
+ { device: deviceIdFromHex(second) },
542
+ ],
543
+ });
544
+ });
545
+ });
546
+ describe("RoomProtocol — sendRoomMessageDirected", () => {
547
+ it("throws NOT_A_MEMBER naming the exact room path when no token is persisted for it", async () => {
548
+ const h = await makeHarness();
549
+ await expect(h.protocol.sendRoomMessageDirected("no-token-room", h.ids.memberId, "hi")).rejects.toMatchObject({
550
+ message: "No room:member token for no-token-room",
551
+ code: "NOT_A_MEMBER",
552
+ });
553
+ });
554
+ it("throws SEND_FAILED naming the member, room, and failure code when the transport reports a non-ok outcome", async () => {
555
+ const h = await makeHarness();
556
+ const roomPath = ownerNamedRoomPath(h.ids.ownerId, "general");
557
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
558
+ saveRoomToken({ harness: "test", cwd: "room-protocol", dir: h.slotDir }, roomPath, token);
559
+ h.sendRoomRequest.mockResolvedValue({
560
+ result: "error",
561
+ code: "not_connected",
562
+ });
563
+ await expect(h.protocol.sendRoomMessageDirected(roomPath, h.ids.memberId, "hi")).rejects.toMatchObject({
564
+ message: `room.send to ${h.ids.memberId} for ${roomPath} failed (not_connected)`,
565
+ code: "SEND_FAILED",
566
+ });
567
+ });
568
+ it("succeeds and sends via the transport with the persisted token when one exists", async () => {
569
+ const h = await makeHarness();
570
+ const roomPath = ownerNamedRoomPath(h.ids.ownerId, "general");
571
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
572
+ saveRoomToken({ harness: "test", cwd: "room-protocol", dir: h.slotDir }, roomPath, token);
573
+ await h.protocol.sendRoomMessageDirected(roomPath, h.ids.memberId, "hi");
574
+ expect(h.sendRoomRequest).toHaveBeenCalledTimes(1);
575
+ const call = h.sendRoomRequest.mock.calls[0];
576
+ expect(call?.[0]).toBe(h.ids.memberId);
577
+ expect(call?.[2]).toEqual({ kind: "room", path: roomPath });
578
+ });
579
+ });
580
+ //# sourceMappingURL=room-protocol.test.js.map