agent-comms 2.18.3 → 2.18.4
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/bridges/user/web/dist/bundle.js +1 -1
- package/dist/bridges/user/web/frontend/project-tree.js +3 -3
- package/dist/bridges/user/web/frontend/project-tree.js.map +1 -1
- package/dist/bridges/user/web/test/port-discovery.unit.test.js +10 -11
- package/dist/bridges/user/web/test/port-discovery.unit.test.js.map +1 -1
- package/dist/bridges/user/web/test/web-server.integration.test.js +12 -13
- package/dist/bridges/user/web/test/web-server.integration.test.js.map +1 -1
- package/dist/core/test/bridge.unit.test.js +11 -12
- package/dist/core/test/bridge.unit.test.js.map +1 -1
- package/dist/core/test/identity.unit.test.js +21 -22
- package/dist/core/test/identity.unit.test.js.map +1 -1
- package/dist/test/approval.integration.test.js +52 -45
- package/dist/test/approval.integration.test.js.map +1 -1
- package/dist/test/become-coordinator-actual-port.integration.test.d.ts +0 -2
- package/dist/test/become-coordinator-actual-port.integration.test.d.ts.map +1 -1
- package/dist/test/become-coordinator-actual-port.integration.test.js +14 -39
- package/dist/test/become-coordinator-actual-port.integration.test.js.map +1 -1
- package/dist/test/bridge-mesh.test.js +9 -10
- package/dist/test/bridge-mesh.test.js.map +1 -1
- package/dist/test/broadcast-window.integration.test.js +4 -7
- package/dist/test/broadcast-window.integration.test.js.map +1 -1
- package/dist/test/coordinator-socket-error.integration.test.js +3 -4
- package/dist/test/coordinator-socket-error.integration.test.js.map +1 -1
- package/dist/test/create-room-mints-owner-grant.test.js +9 -8
- package/dist/test/create-room-mints-owner-grant.test.js.map +1 -1
- package/dist/test/create-room-name-sanitisation.test.js +6 -7
- package/dist/test/create-room-name-sanitisation.test.js.map +1 -1
- package/dist/test/dm-admission.integration.test.js +10 -11
- package/dist/test/dm-admission.integration.test.js.map +1 -1
- package/dist/test/federation.integration.test.js +21 -20
- package/dist/test/federation.integration.test.js.map +1 -1
- package/dist/test/filestore.test.js +16 -17
- package/dist/test/filestore.test.js.map +1 -1
- package/dist/test/handshake.test.js +26 -27
- package/dist/test/handshake.test.js.map +1 -1
- package/dist/test/identity-cert.test.js +3 -4
- package/dist/test/identity-cert.test.js.map +1 -1
- package/dist/test/identity-device-id.test.js +6 -7
- package/dist/test/identity-device-id.test.js.map +1 -1
- package/dist/test/identity-restart.integration.test.js +9 -10
- package/dist/test/identity-restart.integration.test.js.map +1 -1
- package/dist/test/identity-store.test.js +27 -24
- package/dist/test/identity-store.test.js.map +1 -1
- package/dist/test/listener-policy.integration.test.js +63 -56
- package/dist/test/listener-policy.integration.test.js.map +1 -1
- package/dist/test/mcp-registry-retry.test.js +10 -11
- package/dist/test/mcp-registry-retry.test.js.map +1 -1
- package/dist/test/mesh-e2e.integration.test.js +26 -19
- package/dist/test/mesh-e2e.integration.test.js.map +1 -1
- package/dist/test/presence-readvertise.integration.test.js +5 -6
- package/dist/test/presence-readvertise.integration.test.js.map +1 -1
- package/dist/test/random-id.test.js +3 -4
- package/dist/test/random-id.test.js.map +1 -1
- package/dist/test/room-admission-tool-actions.test.js +20 -15
- package/dist/test/room-admission-tool-actions.test.js.map +1 -1
- package/dist/test/room-destroy-revocation.integration.test.js +3 -4
- package/dist/test/room-destroy-revocation.integration.test.js.map +1 -1
- package/dist/test/room-invite-directed.integration.test.js +13 -12
- package/dist/test/room-invite-directed.integration.test.js.map +1 -1
- package/dist/test/room-join-admission.test.js +31 -24
- package/dist/test/room-join-admission.test.js.map +1 -1
- package/dist/test/room-kick-revocation.integration.test.js +5 -6
- package/dist/test/room-kick-revocation.integration.test.js.map +1 -1
- package/dist/test/room-leave-revocation.integration.test.js +10 -9
- package/dist/test/room-leave-revocation.integration.test.js.map +1 -1
- package/dist/test/room-path.test.js +16 -17
- package/dist/test/room-path.test.js.map +1 -1
- package/dist/test/room-read-directed.integration.test.js +14 -11
- package/dist/test/room-read-directed.integration.test.js.map +1 -1
- package/dist/test/room-router.test.js +27 -29
- package/dist/test/room-router.test.js.map +1 -1
- package/dist/test/room-send-directed.integration.test.js +11 -12
- package/dist/test/room-send-directed.integration.test.js.map +1 -1
- package/dist/test/room-send-retry-queue.test.js +10 -11
- package/dist/test/room-send-retry-queue.test.js.map +1 -1
- package/dist/test/room-send-retry.integration.test.js +5 -8
- package/dist/test/room-send-retry.integration.test.js.map +1 -1
- package/dist/test/room-state-sync.integration.test.js +18 -15
- package/dist/test/room-state-sync.integration.test.js.map +1 -1
- package/dist/test/room-token-store.test.js +21 -22
- package/dist/test/room-token-store.test.js.map +1 -1
- package/dist/test/room-token-verification.test.js +19 -20
- package/dist/test/room-token-verification.test.js.map +1 -1
- package/dist/test/state-sync-convergence.test.js +25 -26
- package/dist/test/state-sync-convergence.test.js.map +1 -1
- package/dist/test/visibility.integration.test.js +48 -49
- package/dist/test/visibility.integration.test.js.map +1 -1
- package/dist/test/wire-mesh-identity.test.js +7 -8
- package/dist/test/wire-mesh-identity.test.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presence-readvertise.integration.test.js","sourceRoot":"","sources":["../../src/test/presence-readvertise.integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"presence-readvertise.integration.test.js","sourceRoot":"","sources":["../../src/test/presence-readvertise.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { describe, it } from "
|
|
2
|
-
import assert from "node:assert/strict";
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
3
2
|
import { randomId } from "../core/random-id.js";
|
|
4
3
|
describe("randomId", () => {
|
|
5
4
|
it("returns 16 bytes", () => {
|
|
6
5
|
const id = randomId();
|
|
7
|
-
|
|
6
|
+
expect(id.length).toBe(16);
|
|
8
7
|
});
|
|
9
8
|
it("returns a different value on each call", () => {
|
|
10
9
|
const a = randomId();
|
|
11
10
|
const b = randomId();
|
|
12
|
-
|
|
11
|
+
expect(a).not.toEqual(b);
|
|
13
12
|
});
|
|
14
13
|
});
|
|
15
14
|
//# sourceMappingURL=random-id.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random-id.test.js","sourceRoot":"","sources":["../../src/test/random-id.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"random-id.test.js","sourceRoot":"","sources":["../../src/test/random-id.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;QACtB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unit tests for the room_accept/room_reject/room_pending CommsTool actions -- the human-facing wrapper around MeshStore's own acceptRoomJoin/rejectRoomJoin/listPendingRoomJoins, additive alongside (never replacing) the existing mesh_accept/mesh_reject/mesh_pending connection-level actions.
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
5
|
-
import { describe, it } from "node:test";
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
6
5
|
import { MeshStore } from "../core/mesh-store.js";
|
|
7
6
|
import { CommsTool } from "../core/tool.js";
|
|
8
7
|
import { buildAction } from "../core/bridge.js";
|
|
@@ -35,7 +34,9 @@ describe("room admission CommsTool actions", () => {
|
|
|
35
34
|
description: "",
|
|
36
35
|
});
|
|
37
36
|
const handler = store.roomVerbHandlers["room.join"];
|
|
38
|
-
|
|
37
|
+
expect(handler).toBeTruthy();
|
|
38
|
+
if (handler === undefined)
|
|
39
|
+
throw new Error("expected a room.join handler to be registered");
|
|
39
40
|
void handler(fakeJoinRequest(room.id), { id: REQUESTER_ID });
|
|
40
41
|
const tool = new CommsTool(store);
|
|
41
42
|
const ctx = {
|
|
@@ -45,9 +46,9 @@ describe("room admission CommsTool actions", () => {
|
|
|
45
46
|
pid: process.pid,
|
|
46
47
|
};
|
|
47
48
|
const pendingResult = await tool.handle(ctx, buildAction({ action: "room_pending" }));
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
expect(pendingResult.isError).toBe(false);
|
|
50
|
+
expect(pendingResult.content.includes(room.id)).toBeTruthy();
|
|
51
|
+
expect(pendingResult.content.includes(REQUESTER_ID)).toBeTruthy();
|
|
51
52
|
});
|
|
52
53
|
it("room_accept grants the pending request", async () => {
|
|
53
54
|
const store = new MeshStore();
|
|
@@ -67,7 +68,9 @@ describe("room admission CommsTool actions", () => {
|
|
|
67
68
|
description: "",
|
|
68
69
|
});
|
|
69
70
|
const handler = store.roomVerbHandlers["room.join"];
|
|
70
|
-
|
|
71
|
+
expect(handler).toBeTruthy();
|
|
72
|
+
if (handler === undefined)
|
|
73
|
+
throw new Error("expected a room.join handler to be registered");
|
|
71
74
|
const outcomePromise = handler(fakeJoinRequest(room.id), {
|
|
72
75
|
id: REQUESTER_ID,
|
|
73
76
|
});
|
|
@@ -83,11 +86,11 @@ describe("room admission CommsTool actions", () => {
|
|
|
83
86
|
room: room.id,
|
|
84
87
|
requesterId: REQUESTER_ID,
|
|
85
88
|
}));
|
|
86
|
-
|
|
89
|
+
expect(acceptResult.isError).toBe(false);
|
|
87
90
|
const outcome = await outcomePromise;
|
|
88
|
-
|
|
91
|
+
expect(outcome.result).toBe("ok");
|
|
89
92
|
const pendingAfter = await tool.handle(ctx, buildAction({ action: "room_pending" }));
|
|
90
|
-
|
|
93
|
+
expect(pendingAfter.content).toBe("No pending room join requests.");
|
|
91
94
|
});
|
|
92
95
|
it("room_reject denies the pending request with an optional reason", async () => {
|
|
93
96
|
const store = new MeshStore();
|
|
@@ -107,7 +110,9 @@ describe("room admission CommsTool actions", () => {
|
|
|
107
110
|
description: "",
|
|
108
111
|
});
|
|
109
112
|
const handler = store.roomVerbHandlers["room.join"];
|
|
110
|
-
|
|
113
|
+
expect(handler).toBeTruthy();
|
|
114
|
+
if (handler === undefined)
|
|
115
|
+
throw new Error("expected a room.join handler to be registered");
|
|
111
116
|
const outcomePromise = handler(fakeJoinRequest(room.id), {
|
|
112
117
|
id: REQUESTER_ID,
|
|
113
118
|
});
|
|
@@ -124,11 +129,11 @@ describe("room admission CommsTool actions", () => {
|
|
|
124
129
|
requesterId: REQUESTER_ID,
|
|
125
130
|
reason: "not now",
|
|
126
131
|
}));
|
|
127
|
-
|
|
132
|
+
expect(rejectResult.isError).toBe(false);
|
|
128
133
|
const outcome = await outcomePromise;
|
|
129
|
-
|
|
134
|
+
expect(outcome.result).toBe("error");
|
|
130
135
|
if (outcome.result === "error") {
|
|
131
|
-
|
|
136
|
+
expect(outcome.message).toBe("not now");
|
|
132
137
|
}
|
|
133
138
|
});
|
|
134
139
|
it("room_accept on a store with no matching pending request reports failure, not a crash", async () => {
|
|
@@ -154,7 +159,7 @@ describe("room admission CommsTool actions", () => {
|
|
|
154
159
|
room: "not-a-real-room",
|
|
155
160
|
requesterId: REQUESTER_ID,
|
|
156
161
|
}));
|
|
157
|
-
|
|
162
|
+
expect(result.isError).toBe(true);
|
|
158
163
|
});
|
|
159
164
|
});
|
|
160
165
|
//# sourceMappingURL=room-admission-tool-actions.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-admission-tool-actions.test.js","sourceRoot":"","sources":["../../src/test/room-admission-tool-actions.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"room-admission-tool-actions.test.js","sourceRoot":"","sources":["../../src/test/room-admission-tool-actions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Integration test for destroy-via-revocation (P3.8): destroying a room revokes every member's own room:member grant for real, the same way kicking one member already does, so a fellow member's own independent token verification rejects a former member's message even after the room itself is gone from the owner's own bookkeeping.
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
5
|
-
import { test } from "node:test";
|
|
4
|
+
import { test, expect } from "vitest";
|
|
6
5
|
import { MeshStore } from "../core/mesh-store.js";
|
|
7
6
|
import { waitFor, wireTestTransport } from "./test-transport.js";
|
|
8
7
|
let nextPort = 21_410;
|
|
@@ -32,7 +31,7 @@ async function joinAndAccept(owner, member, roomId) {
|
|
|
32
31
|
owner.acceptRoomJoin(roomId, member.peerId);
|
|
33
32
|
await joinPromise;
|
|
34
33
|
}
|
|
35
|
-
|
|
34
|
+
test("destroying a room revokes every member's own grant for every peer, not just the owner", async () => {
|
|
36
35
|
const port = freshPort();
|
|
37
36
|
const owner = await makeRegisteredStore(port, "owner");
|
|
38
37
|
const memberA = await makeRegisteredStore(port, "member-a");
|
|
@@ -53,7 +52,7 @@ void test("destroying a room revokes every member's own grant for every peer, no
|
|
|
53
52
|
await owner.destroyRoom(room.id, owner.peerId);
|
|
54
53
|
// Settles the revocation-announce destroyRoom just broadcast for every member: B's own drain loop processes it asynchronously off the wire, with no observable side effect from outside B's own store to wait on affirmatively.
|
|
55
54
|
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
56
|
-
await
|
|
55
|
+
await expect(memberA.sendRoomMessageDirected(room.id, memberB.peerId, "still here?"), "B must reject a room.send sent under a grant the owner already revoked by destroying the room").rejects.toThrow(/unauthorized/);
|
|
57
56
|
}
|
|
58
57
|
finally {
|
|
59
58
|
await memberB.shutdown();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-destroy-revocation.integration.test.js","sourceRoot":"","sources":["../../src/test/room-destroy-revocation.integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"room-destroy-revocation.integration.test.js","sourceRoot":"","sources":["../../src/test/room-destroy-revocation.integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,IAAI,QAAQ,GAAG,MAAM,CAAC;AACtB,SAAS,SAAS;IAChB,QAAQ,IAAI,CAAC,CAAC;IACd,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,IAAY,EACZ,IAAY;IAEZ,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,KAAK,CAAC,aAAa,CAAC;QACxB,IAAI;QACJ,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,SAAS,IAAI,EAAE;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,KAAgB,EAChB,MAAiB,EACjB,MAAc;IAEd,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,OAAO,CACX,GAAG,EAAE,CACH,KAAK;SACF,oBAAoB,EAAE;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,EAC1E,4CAA4C,CAC7C,CAAC;IACF,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,WAAW,CAAC;AACpB,CAAC;AAED,IAAI,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;IACvG,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,OAAO,CACX,GAAG,EAAE,CACH,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS;YACtD,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS;YACtD,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS;YACxD,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,EAC1D,wCAAwC,CACzC,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;YAClC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAE7C,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/C,gOAAgO;QAChO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEzD,MAAM,MAAM,CACV,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,EACvE,+FAA+F,CAChG,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Integration test for room.invite's real wire-level path (P3.8): the room owner pushes an already-minted room:member grant to a target directly, over a real, wire-authenticated room.invite -- replacing the legacy broadcastPatch/deliverLocallyAndBroadcast fan-out (which reached every mesh-connected peer with a "delivery" patch, not just the intended target) with a directed request the target itself verifies before persisting the token.
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
5
|
-
import { test } from "node:test";
|
|
4
|
+
import { test, expect } from "vitest";
|
|
6
5
|
import { MeshStore } from "../core/mesh-store.js";
|
|
7
6
|
import { loadRoomTokens } from "../core/identity-store.js";
|
|
8
7
|
import { waitFor, wireTestTransport } from "./test-transport.js";
|
|
@@ -37,7 +36,7 @@ async function makeConnectedPair(port) {
|
|
|
37
36
|
await waitFor(() => owner.serialise().agents[target.peerId] !== undefined, "owner sees the target agent");
|
|
38
37
|
return { owner, target, targetSlot };
|
|
39
38
|
}
|
|
40
|
-
|
|
39
|
+
test("inviting a target delivers a real room_invite carrying the room's own name/description and the inviter's own name/cwd", async () => {
|
|
41
40
|
const { owner, target, targetSlot } = await makeConnectedPair(freshPort());
|
|
42
41
|
try {
|
|
43
42
|
const room = await owner.createRoom({
|
|
@@ -53,21 +52,23 @@ void test("inviting a target delivers a real room_invite carrying the room's own
|
|
|
53
52
|
await owner.inviteToRoom(room.id, target.peerId, owner.peerId);
|
|
54
53
|
await waitFor(() => targetDeliveries.some((event) => event.type === "room_invite"), "target receives the invite");
|
|
55
54
|
const invite = targetDeliveries.find((event) => event.type === "room_invite");
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
expect(invite).toBeTruthy();
|
|
56
|
+
if (invite === undefined)
|
|
57
|
+
throw new Error("expected a room_invite delivery event");
|
|
58
|
+
expect(invite.room).toBe(room.id);
|
|
59
|
+
expect(invite.roomDescription).toBe("the main room");
|
|
60
|
+
expect(invite.from).toBe(owner.peerId);
|
|
61
|
+
expect(invite.fromName).toBe("owner");
|
|
62
|
+
expect(invite.fromCwd).toBe("/test/owner");
|
|
62
63
|
// The pushed grant is usable, not just delivered: the target holds a real, persisted room:member token for the room now.
|
|
63
|
-
|
|
64
|
+
expect(loadRoomTokens(targetSlot)[room.id]).toBeTruthy();
|
|
64
65
|
}
|
|
65
66
|
finally {
|
|
66
67
|
await target.shutdown();
|
|
67
68
|
await owner.shutdown();
|
|
68
69
|
}
|
|
69
70
|
});
|
|
70
|
-
|
|
71
|
+
test("inviting an unreachable target throws rather than silently dropping the invite", async () => {
|
|
71
72
|
const owner = new MeshStore(freshPort());
|
|
72
73
|
await wireTestTransport(owner);
|
|
73
74
|
await owner.init();
|
|
@@ -87,7 +88,7 @@ void test("inviting an unreachable target throws rather than silently dropping t
|
|
|
87
88
|
description: "",
|
|
88
89
|
});
|
|
89
90
|
const strangerId = "b".repeat(64);
|
|
90
|
-
await
|
|
91
|
+
await expect(owner.inviteToRoom(room.id, strangerId, owner.peerId)).rejects.toMatchObject({ code: "INVITE_FAILED" });
|
|
91
92
|
}
|
|
92
93
|
finally {
|
|
93
94
|
await owner.shutdown();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-invite-directed.integration.test.js","sourceRoot":"","sources":["../../src/test/room-invite-directed.integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"room-invite-directed.integration.test.js","sourceRoot":"","sources":["../../src/test/room-invite-directed.integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,IAAI,QAAQ,GAAG,MAAM,CAAC;AACtB,SAAS,SAAS;IAChB,QAAQ,IAAI,CAAC,CAAC;IACd,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAK3C,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,KAAK,CAAC,aAAa,CAAC;QACxB,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACpB,MAAM,MAAM,CAAC,aAAa,CAAC;QACzB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,cAAc;QACnB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,MAAM,OAAO,CACX,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS,EAC3D,6BAA6B,CAC9B,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAED,IAAI,CAAC,uHAAuH,EAAE,KAAK,IAAI,EAAE;IACvI,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC;IAE3E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;YAClC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,WAAW,EAAE,eAAe;SAC7B,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAoB,EAAE,CAAC;QAC7C,MAAM,CAAC,UAAU,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YACtC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAE/D,MAAM,OAAO,CACX,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,EACpE,4BAA4B,CAC7B,CAAC;QACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAClC,CAAC,KAAK,EAA4D,EAAE,CAClE,KAAK,CAAC,IAAI,KAAK,aAAa,CAC/B,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;QAC5B,IAAI,MAAM,KAAK,SAAS;YACtB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE3C,yHAAyH;QACzH,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAC3D,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;IAChG,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;IACzC,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,KAAK,CAAC,aAAa,CAAC;QACxB,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;YAClC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,MAAM,CACV,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CACtD,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACrD,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
import * as fs from "node:fs";
|
|
7
7
|
import * as path from "node:path";
|
|
8
8
|
import { tmpdir } from "node:os";
|
|
9
|
-
import
|
|
10
|
-
import { describe, it } from "node:test";
|
|
9
|
+
import { describe, it, expect } from "vitest";
|
|
11
10
|
import { deviceIdFromHex, deviceIdToHex, } from "wire-mesh-core/domain/device-id";
|
|
12
11
|
import { createSystemClock } from "wire-mesh-core/adapters/system-clock";
|
|
13
12
|
import { createRevocationView } from "wire-mesh-core/domain/revocation-view";
|
|
@@ -49,23 +48,25 @@ describe("handleRoomJoin (owner side)", () => {
|
|
|
49
48
|
description: "",
|
|
50
49
|
});
|
|
51
50
|
const handler = store.roomVerbHandlers["room.join"];
|
|
52
|
-
|
|
51
|
+
expect(handler, "expected a registered room.join handler").toBeTruthy();
|
|
52
|
+
if (handler === undefined)
|
|
53
|
+
throw new Error("expected a registered room.join handler");
|
|
53
54
|
const handle = { id: REQUESTER_ID };
|
|
54
55
|
const { request } = fakeRequest(room.id);
|
|
55
56
|
const outcomePromise = handler(request, handle);
|
|
56
|
-
|
|
57
|
+
expect(store.listPendingRoomJoins()).toEqual([
|
|
57
58
|
{ roomPath: room.id, requesterId: REQUESTER_ID },
|
|
58
59
|
]);
|
|
59
60
|
store.acceptRoomJoin(room.id, REQUESTER_ID);
|
|
60
61
|
const outcome = await outcomePromise;
|
|
61
|
-
|
|
62
|
+
expect(outcome.result).toBe("ok");
|
|
62
63
|
if (outcome.result !== "ok")
|
|
63
64
|
return;
|
|
64
|
-
|
|
65
|
+
expect(store.listPendingRoomJoins()).toEqual([]);
|
|
65
66
|
const token = outcome["granted-token"];
|
|
66
|
-
|
|
67
|
+
expect(token, "expected a granted-token in the outcome").toBeDefined();
|
|
67
68
|
const roomAfterJoin = await store.getRoom(room.id);
|
|
68
|
-
|
|
69
|
+
expect(roomAfterJoin?.members.includes(REQUESTER_ID)).toBeTruthy();
|
|
69
70
|
});
|
|
70
71
|
it("denies the request without minting anything on rejection", async () => {
|
|
71
72
|
const store = new MeshStore();
|
|
@@ -85,15 +86,17 @@ describe("handleRoomJoin (owner side)", () => {
|
|
|
85
86
|
description: "",
|
|
86
87
|
});
|
|
87
88
|
const handler = store.roomVerbHandlers["room.join"];
|
|
88
|
-
|
|
89
|
+
expect(handler).toBeTruthy();
|
|
90
|
+
if (handler === undefined)
|
|
91
|
+
throw new Error("expected a room.join handler to be registered");
|
|
89
92
|
const handle = { id: REQUESTER_ID };
|
|
90
93
|
const { request } = fakeRequest(room.id);
|
|
91
94
|
const outcomePromise = handler(request, handle);
|
|
92
95
|
store.rejectRoomJoin(room.id, REQUESTER_ID);
|
|
93
96
|
const outcome = await outcomePromise;
|
|
94
|
-
|
|
97
|
+
expect(outcome.result).toBe("error");
|
|
95
98
|
const roomAfterReject = await store.getRoom(room.id);
|
|
96
|
-
|
|
99
|
+
expect(roomAfterReject?.members.includes(REQUESTER_ID)).toBe(false);
|
|
97
100
|
});
|
|
98
101
|
it("refuses a DM path naming neither of its own device as a participant, with no pending entry created", async () => {
|
|
99
102
|
const store = new MeshStore();
|
|
@@ -101,12 +104,14 @@ describe("handleRoomJoin (owner side)", () => {
|
|
|
101
104
|
// Neither "c"x64 nor "d"x64 is this store's own peerId, so this DM path names a conversation the store has no part in -- the dm-admission integration tests cover the genuinely-a-participant case end to end.
|
|
102
105
|
const dmPath = `${deviceIdToHex(deviceIdFromHex("c".repeat(64)))}+${deviceIdToHex(deviceIdFromHex("d".repeat(64)))}`;
|
|
103
106
|
const handler = store.roomVerbHandlers["room.join"];
|
|
104
|
-
|
|
107
|
+
expect(handler).toBeTruthy();
|
|
108
|
+
if (handler === undefined)
|
|
109
|
+
throw new Error("expected a room.join handler to be registered");
|
|
105
110
|
const handle = { id: REQUESTER_ID };
|
|
106
111
|
const { request } = fakeRequest(dmPath);
|
|
107
112
|
const outcome = await handler(request, handle);
|
|
108
|
-
|
|
109
|
-
|
|
113
|
+
expect(outcome.result).toBe("error");
|
|
114
|
+
expect(store.listPendingRoomJoins()).toEqual([]);
|
|
110
115
|
});
|
|
111
116
|
it("refuses a named room this store doesn't own", async () => {
|
|
112
117
|
const store = new MeshStore();
|
|
@@ -114,12 +119,14 @@ describe("handleRoomJoin (owner side)", () => {
|
|
|
114
119
|
const someoneElse = "e".repeat(64);
|
|
115
120
|
const roomPath = ownerNamedRoomPath(someoneElse, "general");
|
|
116
121
|
const handler = store.roomVerbHandlers["room.join"];
|
|
117
|
-
|
|
122
|
+
expect(handler).toBeTruthy();
|
|
123
|
+
if (handler === undefined)
|
|
124
|
+
throw new Error("expected a room.join handler to be registered");
|
|
118
125
|
const handle = { id: REQUESTER_ID };
|
|
119
126
|
const { request } = fakeRequest(roomPath);
|
|
120
127
|
const outcome = await handler(request, handle);
|
|
121
|
-
|
|
122
|
-
|
|
128
|
+
expect(outcome.result).toBe("error");
|
|
129
|
+
expect(store.listPendingRoomJoins()).toEqual([]);
|
|
123
130
|
});
|
|
124
131
|
});
|
|
125
132
|
describe("joinRoom (requester side, remote path)", () => {
|
|
@@ -152,7 +159,7 @@ describe("joinRoom (requester side, remote path)", () => {
|
|
|
152
159
|
expires: Date.now() + 60_000,
|
|
153
160
|
delegationsRemaining: 0,
|
|
154
161
|
});
|
|
155
|
-
|
|
162
|
+
expect(grantedTokenVerdict.ok, "expected the fixture token to mint successfully").toBeTruthy();
|
|
156
163
|
if (!grantedTokenVerdict.ok)
|
|
157
164
|
return;
|
|
158
165
|
const grantedToken = grantedTokenVerdict.token;
|
|
@@ -173,7 +180,7 @@ describe("joinRoom (requester side, remote path)", () => {
|
|
|
173
180
|
broadcastRevocation: async () => { },
|
|
174
181
|
sendRoomRequest: async (_memberId, command, scope) => {
|
|
175
182
|
capturedRoomPath = scope.path;
|
|
176
|
-
|
|
183
|
+
expect(command.params).toEqual({ verb: "room.join" });
|
|
177
184
|
return {
|
|
178
185
|
result: "ok",
|
|
179
186
|
"granted-token": grantedToken,
|
|
@@ -187,13 +194,13 @@ describe("joinRoom (requester side, remote path)", () => {
|
|
|
187
194
|
unref: () => { },
|
|
188
195
|
};
|
|
189
196
|
store.setTransport(fakeTransport);
|
|
190
|
-
|
|
197
|
+
expect(await store.getRoom(roomPath)).toBe(undefined);
|
|
191
198
|
const joined = await store.joinRoom(roomPath, store.peerId);
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
199
|
+
expect(joined.id).toBe(roomPath);
|
|
200
|
+
expect(capturedRoomPath).toBe(roomPath);
|
|
201
|
+
expect(joined.members.includes(store.peerId)).toBeTruthy();
|
|
195
202
|
const tokens = loadRoomTokens(slot);
|
|
196
|
-
|
|
203
|
+
expect(tokens[roomPath], "expected the granted token to be persisted").toBeDefined();
|
|
197
204
|
});
|
|
198
205
|
});
|
|
199
206
|
//# sourceMappingURL=room-join-admission.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-join-admission.test.js","sourceRoot":"","sources":["../../src/test/room-join-admission.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"room-join-admission.test.js","sourceRoot":"","sources":["../../src/test/room-join-admission.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Three real peers: owner (mints and later revokes A's grant), A (the member being kicked), and B (a fellow member who never talks to A about the kick directly -- B's own rejection of A's post-kick message is what proves the revocation-announce genuinely propagated over the wire, not merely that owner's own local view updated).
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
7
|
-
import { test } from "node:test";
|
|
6
|
+
import { test, expect } from "vitest";
|
|
8
7
|
import { MeshStore } from "../core/mesh-store.js";
|
|
9
8
|
import { waitFor, wireTestTransport } from "./test-transport.js";
|
|
10
9
|
let nextPort = 21_110;
|
|
@@ -35,7 +34,7 @@ async function joinAndAccept(owner, member, roomId) {
|
|
|
35
34
|
owner.acceptRoomJoin(roomId, member.peerId);
|
|
36
35
|
await joinPromise;
|
|
37
36
|
}
|
|
38
|
-
|
|
37
|
+
test("kicking a member revokes their room:member token for every peer, not just the owner", async () => {
|
|
39
38
|
const port = freshPort();
|
|
40
39
|
const owner = await makeRegisteredStore(port, "owner");
|
|
41
40
|
const memberA = await makeRegisteredStore(port, "member-a");
|
|
@@ -66,9 +65,9 @@ void test("kicking a member revokes their room:member token for every peer, not
|
|
|
66
65
|
// Settles the revocation-announce this kick just broadcast: B's own drain loop processes it asynchronously off the wire, with no observable side effect from outside B's own store to wait on affirmatively.
|
|
67
66
|
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
68
67
|
// sendRoomMessage (not used here) re-checks this store's own local CRDT room.members list, which the kick's own legacy room_upsert patch has by now also reached A through -- that would mask exactly what this test needs to isolate. sendRoomMessageDirected instead only ever consults A's own persisted bearer token (never revoked by kickFromRoom, which revokes the OWNER's own record of having issued it, not A's own copy), so it genuinely simulates a still-token-holding A trying to reach B directly -- the real scenario a token-side revocation exists to stop, independent of whatever A's own CRDT view happens to already know. B's own handleRoomSend rejects it with "unauthorized" (the announced revocation now verifies as revoked on B's own independent check), which sendRoomMessageDirected surfaces as a thrown error rather than swallowing it the way the fan-out path does.
|
|
69
|
-
await
|
|
70
|
-
|
|
71
|
-
event.message.content === "after the kick"),
|
|
68
|
+
await expect(memberA.sendRoomMessageDirected(room.id, memberB.peerId, "after the kick"), "B must reject a room.send sent under a token its owner already revoked").rejects.toThrow(/unauthorized/);
|
|
69
|
+
expect(bDeliveries.some((event) => event.type === "room_message" &&
|
|
70
|
+
event.message.content === "after the kick"), "B must not have delivered a message sent under a revoked token").toBe(false);
|
|
72
71
|
}
|
|
73
72
|
finally {
|
|
74
73
|
await memberB.shutdown();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-kick-revocation.integration.test.js","sourceRoot":"","sources":["../../src/test/room-kick-revocation.integration.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"room-kick-revocation.integration.test.js","sourceRoot":"","sources":["../../src/test/room-kick-revocation.integration.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,IAAI,QAAQ,GAAG,MAAM,CAAC;AACtB,SAAS,SAAS;IAChB,QAAQ,IAAI,CAAC,CAAC;IACd,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,IAAY,EACZ,IAAY;IAEZ,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,KAAK,CAAC,aAAa,CAAC;QACxB,IAAI;QACJ,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,SAAS,IAAI,EAAE;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6JAA6J;AAC7J,KAAK,UAAU,aAAa,CAC1B,KAAgB,EAChB,MAAiB,EACjB,MAAc;IAEd,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,OAAO,CACX,GAAG,EAAE,CACH,KAAK;SACF,oBAAoB,EAAE;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,EAC1E,4CAA4C,CAC7C,CAAC;IACF,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,WAAW,CAAC;AACpB,CAAC;AAED,IAAI,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;IACrG,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,qNAAqN;QACrN,MAAM,OAAO,CACX,GAAG,EAAE,CACH,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS;YACtD,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS;YACtD,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS;YACxD,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,EAC1D,wCAAwC,CACzC,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;YAClC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,iXAAiX;QACjX,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAE7C,MAAM,WAAW,GAAoB,EAAE,CAAC;QACxC,OAAO,CAAC,UAAU,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YACvC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC;QAEF,MAAM,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAC1E,MAAM,OAAO,CACX,GAAG,EAAE,CACH,WAAW,CAAC,IAAI,CACd,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,cAAc;YAC7B,KAAK,CAAC,OAAO,CAAC,OAAO,KAAK,iBAAiB,CAC9C,EACH,kDAAkD,CACnD,CAAC;QAEF,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAChE,6MAA6M;QAC7M,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEzD,42BAA42B;QAC52B,MAAM,MAAM,CACV,OAAO,CAAC,uBAAuB,CAC7B,IAAI,CAAC,EAAE,EACP,OAAO,CAAC,MAAM,EACd,gBAAgB,CACjB,EACD,wEAAwE,CACzE,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAElC,MAAM,CACJ,WAAW,CAAC,IAAI,CACd,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,cAAc;YAC7B,KAAK,CAAC,OAAO,CAAC,OAAO,KAAK,gBAAgB,CAC7C,EACD,gEAAgE,CACjE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Integration tests for room.leave's real wire-level path (P3.8): a member leaving, or a target declining an invite it never joined, both tell the room's own owner over a real, wire-authenticated room.leave -- the owner revokes the sender's own grant for real (the same revocation machinery kickFromRoom already uses) and notifies accordingly (member_left for a real leave, invite_declined for a decline), rather than each mutating a local Room record nobody else reads.
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
5
|
-
import { test } from "node:test";
|
|
4
|
+
import { test, expect } from "vitest";
|
|
6
5
|
import { MeshStore } from "../core/mesh-store.js";
|
|
7
6
|
import { loadRoomTokens } from "../core/identity-store.js";
|
|
8
7
|
import { waitFor, wireTestTransport } from "./test-transport.js";
|
|
@@ -33,7 +32,7 @@ async function joinAndAccept(owner, member, roomId) {
|
|
|
33
32
|
owner.acceptRoomJoin(roomId, member.peerId);
|
|
34
33
|
await joinPromise;
|
|
35
34
|
}
|
|
36
|
-
|
|
35
|
+
test("a member leaving revokes its own grant and notifies the other members", async () => {
|
|
37
36
|
const port = freshPort();
|
|
38
37
|
const { store: owner } = await makeRegisteredStore(port, "owner");
|
|
39
38
|
const { store: memberA, slot: aSlot } = await makeRegisteredStore(port, "member-a");
|
|
@@ -56,8 +55,8 @@ void test("a member leaving revokes its own grant and notifies the other members
|
|
|
56
55
|
await memberA.leaveRoom(room.id, memberA.peerId);
|
|
57
56
|
await waitFor(() => ownerDeliveries.some((event) => event.type === "member_left" && event.agent === memberA.peerId), "owner is notified that A left");
|
|
58
57
|
// A's own local token is gone, and A can no longer act as a member.
|
|
59
|
-
|
|
60
|
-
await
|
|
58
|
+
expect(loadRoomTokens(aSlot)[room.id]).toBe(undefined);
|
|
59
|
+
await expect(memberA.sendRoomMessageDirected(room.id, owner.peerId, "still here?")).rejects.toMatchObject({ code: "NOT_A_MEMBER" });
|
|
61
60
|
}
|
|
62
61
|
finally {
|
|
63
62
|
await memberB.shutdown();
|
|
@@ -65,7 +64,7 @@ void test("a member leaving revokes its own grant and notifies the other members
|
|
|
65
64
|
await owner.shutdown();
|
|
66
65
|
}
|
|
67
66
|
});
|
|
68
|
-
|
|
67
|
+
test("declining an invite before ever joining revokes the pushed grant and notifies the owner", async () => {
|
|
69
68
|
const port = freshPort();
|
|
70
69
|
const { store: owner } = await makeRegisteredStore(port, "owner");
|
|
71
70
|
const { store: target, slot: targetSlot } = await makeRegisteredStore(port, "target");
|
|
@@ -86,9 +85,11 @@ void test("declining an invite before ever joining revokes the pushed grant and
|
|
|
86
85
|
await target.declineInvite(room.id, target.peerId, "not right now");
|
|
87
86
|
await waitFor(() => ownerDeliveries.some((event) => event.type === "invite_declined" && event.agent === target.peerId), "owner is notified of the decline");
|
|
88
87
|
const declined = ownerDeliveries.find((event) => event.type === "invite_declined");
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
88
|
+
expect(declined).toBeTruthy();
|
|
89
|
+
if (declined === undefined)
|
|
90
|
+
throw new Error("expected an invite_declined delivery event");
|
|
91
|
+
expect(declined.reason).toBe("not right now");
|
|
92
|
+
expect(loadRoomTokens(targetSlot)[room.id]).toBe(undefined);
|
|
92
93
|
}
|
|
93
94
|
finally {
|
|
94
95
|
await target.shutdown();
|