Fork Horse repository, listed by its owner. Publisher snapshot.
packages/forkhorse-gatekeeper/test/host-connection.test.ts
Snapshot at 34e3175
1import assert from "node:assert/strict";
2import { test } from "node:test";
3import { hostConnection } from "../src/host-connection.ts";
4import type { SidebarUi } from "../src/ui-types.ts";
5
6test("host getter reacquires on a healthy port and replaces only a failed host session", async () => {
7 let connects = 0,
8 disposed = 0,
9 failed = false;
10 const ui = {} as SidebarUi;
11 const connection = hostConnection(() => {
12 connects++;
13 const generation = connects;
14 return {
15 host: {
16 get ui() {
17 if (generation === 1 && failed)
18 return Promise.reject(new Error("Peer closed MessagePort connection."));
19 return Promise.resolve(ui);
20 },
21 },
22 dispose() {
23 disposed++;
24 },
25 };
26 });
27 assert.equal(await connection.acquireUi(), ui);
28 assert.equal(await connection.acquireUi(), ui);
29 assert.equal(connects, 1);
30 failed = true;
31 assert.equal(await connection.acquireUi(), ui);
32 assert.equal(connects, 2);
33 assert.equal(disposed, 1);
34 assert.equal(await connection.acquireUi(), ui);
35 assert.equal(connects, 2);
36 connection.dispose();
37 assert.equal(disposed, 2);
38});
39
40for (const dispose of [false, true])
41 test(`a late getter rejection cannot renew a ${dispose ? "disposed" : "retired"} connection`, async () => {
42 let connects = 0,
43 active = true,
44 reject!: (error: Error) => void;
45 const pending = new Promise<SidebarUi>((_resolve, fail) => {
46 reject = fail;
47 });
48 const connection = hostConnection(() => {
49 connects++;
50 return { host: { ui: pending }, dispose() {} };
51 });
52 const acquiring = connection.acquireUi(() => active);
53 if (dispose) connection.dispose();
54 else active = false;
55 reject(new Error("Late closed port"));
56 await assert.rejects(acquiring, /Late closed port/);
57 assert.equal(connects, 1);
58 });
59