agent-comms 9.0.2 → 9.0.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 +6 -0
- package/dist/bridges/claude-code/channel.d.ts.map +1 -1
- package/dist/bridges/claude-code/channel.js +3 -1
- package/dist/bridges/claude-code/channel.js.map +1 -1
- package/dist/bridges/codex/tool.d.ts +2 -1
- package/dist/bridges/codex/tool.d.ts.map +1 -1
- package/dist/bridges/codex/tool.js +4 -2
- package/dist/bridges/codex/tool.js.map +1 -1
- package/dist/bridges/mcp/server.d.ts.map +1 -1
- package/dist/bridges/mcp/server.js +3 -1
- package/dist/bridges/mcp/server.js.map +1 -1
- package/dist/bridges/user/web/bridge-port-range.d.ts +52 -0
- package/dist/bridges/user/web/bridge-port-range.d.ts.map +1 -0
- package/dist/bridges/user/web/bridge-port-range.js +90 -0
- package/dist/bridges/user/web/bridge-port-range.js.map +1 -0
- package/dist/bridges/user/web/dist/bundle.js +1 -1
- package/dist/bridges/user/web/dist/sw.js +1 -1
- package/dist/bridges/user/web/frontend/mesh-client.d.ts +6 -2
- package/dist/bridges/user/web/frontend/mesh-client.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/mesh-client.js +13 -27
- package/dist/bridges/user/web/frontend/mesh-client.js.map +1 -1
- package/dist/bridges/user/web/server.d.ts +11 -5
- package/dist/bridges/user/web/server.d.ts.map +1 -1
- package/dist/bridges/user/web/server.js +78 -21
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/bridges/user/web/test/bridge-port-range.integration.test.d.ts +2 -0
- package/dist/bridges/user/web/test/bridge-port-range.integration.test.d.ts.map +1 -0
- package/dist/bridges/user/web/test/bridge-port-range.integration.test.js +281 -0
- package/dist/bridges/user/web/test/bridge-port-range.integration.test.js.map +1 -0
- package/dist/bridges/user/web/test/bridge-web-server.helper.d.ts +13 -0
- package/dist/bridges/user/web/test/bridge-web-server.helper.d.ts.map +1 -0
- package/dist/bridges/user/web/test/bridge-web-server.helper.js +46 -0
- package/dist/bridges/user/web/test/bridge-web-server.helper.js.map +1 -0
- package/dist/bridges/user/web/test/bridge-web-server.integration.test.js +4 -2
- package/dist/bridges/user/web/test/bridge-web-server.integration.test.js.map +1 -1
- package/dist/bridges/user/web/test/lan-web-server.integration.test.js +1 -0
- package/dist/bridges/user/web/test/lan-web-server.integration.test.js.map +1 -1
- package/dist/bridges/user/web/test/orpc-router.integration.test.js +1 -0
- package/dist/bridges/user/web/test/orpc-router.integration.test.js.map +1 -1
- package/dist/bridges/user/web/test/web-access.unit.test.d.ts +1 -1
- package/dist/bridges/user/web/test/web-access.unit.test.js +19 -375
- package/dist/bridges/user/web/test/web-access.unit.test.js.map +1 -1
- package/dist/bridges/user/web/test/web-console-route.integration.test.js +1 -0
- package/dist/bridges/user/web/test/web-console-route.integration.test.js.map +1 -1
- package/dist/bridges/user/web/test/web-server-unbuilt-frontend.integration.test.js +4 -2
- package/dist/bridges/user/web/test/web-server-unbuilt-frontend.integration.test.js.map +1 -1
- package/dist/bridges/user/web/test/web-server.integration.test.js +1 -0
- package/dist/bridges/user/web/test/web-server.integration.test.js.map +1 -1
- package/dist/core/bridge-mesh.d.ts +2 -0
- package/dist/core/bridge-mesh.d.ts.map +1 -1
- package/dist/core/bridge-mesh.js.map +1 -1
- package/dist/core/bridge.d.ts +11 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +17 -2
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/test/build-action.unit.test.d.ts +2 -0
- package/dist/core/test/build-action.unit.test.d.ts.map +1 -0
- package/dist/core/test/build-action.unit.test.js +28 -0
- package/dist/core/test/build-action.unit.test.js.map +1 -0
- package/dist/core/tool.d.ts +1 -1
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/test/bridge-stdout.runner.js +5 -0
- package/dist/test/bridge-stdout.runner.js.map +1 -1
- package/dist/test/ci-required-checks.unit.test.d.ts +2 -0
- package/dist/test/ci-required-checks.unit.test.d.ts.map +1 -0
- package/dist/test/ci-required-checks.unit.test.js +137 -0
- package/dist/test/ci-required-checks.unit.test.js.map +1 -0
- package/dist/test/claude-command.unit.test.js +2 -21
- package/dist/test/claude-command.unit.test.js.map +1 -1
- package/dist/test/conformance/corpus-files.d.ts +11 -0
- package/dist/test/conformance/corpus-files.d.ts.map +1 -0
- package/dist/test/conformance/corpus-files.js +71 -0
- package/dist/test/conformance/corpus-files.js.map +1 -0
- package/dist/test/conformance/corpus-types.d.ts +62 -0
- package/dist/test/conformance/corpus-types.d.ts.map +1 -0
- package/dist/test/conformance/corpus-types.js +8 -0
- package/dist/test/conformance/corpus-types.js.map +1 -0
- package/dist/test/conformance/corpus.d.ts +34 -0
- package/dist/test/conformance/corpus.d.ts.map +1 -0
- package/dist/test/conformance/corpus.js +134 -0
- package/dist/test/conformance/corpus.js.map +1 -0
- package/dist/test/conformance/read-json.d.ts +2 -0
- package/dist/test/conformance/read-json.d.ts.map +1 -0
- package/dist/test/conformance/read-json.js +7 -0
- package/dist/test/conformance/read-json.js.map +1 -0
- package/dist/test/conformance/text.d.ts +10 -0
- package/dist/test/conformance/text.d.ts.map +1 -0
- package/dist/test/conformance/text.js +64 -0
- package/dist/test/conformance/text.js.map +1 -0
- package/dist/test/conformance/validate.d.ts +14 -0
- package/dist/test/conformance/validate.d.ts.map +1 -0
- package/dist/test/conformance/validate.js +85 -0
- package/dist/test/conformance/validate.js.map +1 -0
- package/dist/test/conformance-functions.helper.d.ts +19 -0
- package/dist/test/conformance-functions.helper.d.ts.map +1 -0
- package/dist/test/conformance-functions.helper.js +583 -0
- package/dist/test/conformance-functions.helper.js.map +1 -0
- package/dist/test/conformance.unit.test.d.ts +2 -0
- package/dist/test/conformance.unit.test.d.ts.map +1 -0
- package/dist/test/conformance.unit.test.js +358 -0
- package/dist/test/conformance.unit.test.js.map +1 -0
- package/dist/test/error-reporting.unit.test.js +2 -90
- package/dist/test/error-reporting.unit.test.js.map +1 -1
- package/dist/test/hub-helpers.d.ts +6 -0
- package/dist/test/hub-helpers.d.ts.map +1 -1
- package/dist/test/hub-helpers.js +17 -0
- package/dist/test/hub-helpers.js.map +1 -1
- package/dist/test/mcp-stdout-channel.integration.test.js +2 -1
- package/dist/test/mcp-stdout-channel.integration.test.js.map +1 -1
- package/dist/test/version-report-actions.unit.test.d.ts +1 -1
- package/dist/test/version-report-actions.unit.test.js +2 -55
- package/dist/test/version-report-actions.unit.test.js.map +1 -1
- package/package.json +4 -2
- package/src/bridges/claude-code/channel.ts +3 -1
- package/src/bridges/codex/tool.ts +5 -2
- package/src/bridges/mcp/server.ts +3 -1
- package/src/bridges/user/web/bridge-port-range.ts +130 -0
- package/src/bridges/user/web/dist/bundle.js +1 -1
- package/src/bridges/user/web/dist/sw.js +1 -1
- package/src/bridges/user/web/server.ts +104 -29
- package/src/bridges/user/web/test/bridge-web-server.helper.ts +54 -0
- package/src/core/bridge-mesh.ts +2 -0
- package/src/core/bridge.ts +30 -1
- package/src/core/index.ts +1 -0
- package/src/core/tool.ts +1 -1
- package/dist/bridges/user/web/port-discovery.d.ts +0 -14
- package/dist/bridges/user/web/port-discovery.d.ts.map +0 -1
- package/dist/bridges/user/web/port-discovery.js +0 -40
- package/dist/bridges/user/web/port-discovery.js.map +0 -1
- package/dist/bridges/user/web/test/port-discovery.unit.test.d.ts +0 -5
- package/dist/bridges/user/web/test/port-discovery.unit.test.d.ts.map +0 -1
- package/dist/bridges/user/web/test/port-discovery.unit.test.js +0 -180
- package/dist/bridges/user/web/test/port-discovery.unit.test.js.map +0 -1
- package/dist/core/test/bridge.unit.test.d.ts +0 -5
- package/dist/core/test/bridge.unit.test.d.ts.map +0 -1
- package/dist/core/test/bridge.unit.test.js +0 -119
- package/dist/core/test/bridge.unit.test.js.map +0 -1
- package/dist/test/agent-table.unit.test.d.ts +0 -5
- package/dist/test/agent-table.unit.test.d.ts.map +0 -1
- package/dist/test/agent-table.unit.test.js +0 -53
- package/dist/test/agent-table.unit.test.js.map +0 -1
- package/dist/test/bind-retry.unit.test.d.ts +0 -2
- package/dist/test/bind-retry.unit.test.d.ts.map +0 -1
- package/dist/test/bind-retry.unit.test.js +0 -42
- package/dist/test/bind-retry.unit.test.js.map +0 -1
- package/dist/test/default-command.unit.test.d.ts +0 -2
- package/dist/test/default-command.unit.test.d.ts.map +0 -1
- package/dist/test/default-command.unit.test.js +0 -26
- package/dist/test/default-command.unit.test.js.map +0 -1
- package/dist/test/delegation-policy.unit.test.d.ts +0 -5
- package/dist/test/delegation-policy.unit.test.d.ts.map +0 -1
- package/dist/test/delegation-policy.unit.test.js +0 -52
- package/dist/test/delegation-policy.unit.test.js.map +0 -1
- package/dist/test/display-name.unit.test.d.ts +0 -5
- package/dist/test/display-name.unit.test.d.ts.map +0 -1
- package/dist/test/display-name.unit.test.js +0 -65
- package/dist/test/display-name.unit.test.js.map +0 -1
- package/dist/test/machine-list-groups.unit.test.d.ts +0 -5
- package/dist/test/machine-list-groups.unit.test.d.ts.map +0 -1
- package/dist/test/machine-list-groups.unit.test.js +0 -61
- package/dist/test/machine-list-groups.unit.test.js.map +0 -1
- package/dist/test/relay-selection.unit.test.d.ts +0 -5
- package/dist/test/relay-selection.unit.test.d.ts.map +0 -1
- package/dist/test/relay-selection.unit.test.js +0 -103
- package/dist/test/relay-selection.unit.test.js.map +0 -1
- package/dist/test/request-timeouts.unit.test.d.ts +0 -2
- package/dist/test/request-timeouts.unit.test.d.ts.map +0 -1
- package/dist/test/request-timeouts.unit.test.js +0 -28
- package/dist/test/request-timeouts.unit.test.js.map +0 -1
- package/dist/test/room-discovery.unit.test.d.ts +0 -2
- package/dist/test/room-discovery.unit.test.d.ts.map +0 -1
- package/dist/test/room-discovery.unit.test.js +0 -29
- package/dist/test/room-discovery.unit.test.js.map +0 -1
- package/dist/test/room-lookup.unit.test.d.ts +0 -2
- package/dist/test/room-lookup.unit.test.d.ts.map +0 -1
- package/dist/test/room-lookup.unit.test.js +0 -59
- package/dist/test/room-lookup.unit.test.js.map +0 -1
- package/dist/test/room-path.unit.test.d.ts +0 -2
- package/dist/test/room-path.unit.test.d.ts.map +0 -1
- package/dist/test/room-path.unit.test.js +0 -54
- package/dist/test/room-path.unit.test.js.map +0 -1
- package/dist/test/send-outcome.unit.test.d.ts +0 -2
- package/dist/test/send-outcome.unit.test.d.ts.map +0 -1
- package/dist/test/send-outcome.unit.test.js +0 -52
- package/dist/test/send-outcome.unit.test.js.map +0 -1
- package/src/bridges/user/web/port-discovery.ts +0 -49
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import { readdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { checkCorpus, runCompletenessProblems, } from "./conformance/corpus.js";
|
|
6
|
+
import { selectCorpusFiles } from "./conformance/corpus-files.js";
|
|
7
|
+
import { KINDS, SKIP_VALUES } from "./conformance/corpus-types.js";
|
|
8
|
+
import { readJson } from "./conformance/read-json.js";
|
|
9
|
+
import { decodeValue, textToCodeUnits, specialNumberName, textToString, } from "./conformance/text.js";
|
|
10
|
+
import { validateCorpusFile, validateManifest, } from "./conformance/validate.js";
|
|
11
|
+
import { errorCode, FUNCTIONS, SCHEMAS, } from "./conformance-functions.helper.js";
|
|
12
|
+
/**
|
|
13
|
+
* Runs the TypeScript implementation's share of the language-neutral conformance corpus (`conformance/` at the repository root). The format, the file selection rule and the matching rules are in `conformance/README.md`; `conformance/case.schema.json` is the schema every file is validated against before anything runs.
|
|
14
|
+
*
|
|
15
|
+
* Nothing about the corpus is trusted: a file that does not match the format, an unexpected entry in the tree, a corpus that differs from `conformance/manifest.json` and a case this runner cannot execute all fail the run rather than being skipped, since a skipped case reads as a case that passes.
|
|
16
|
+
*/
|
|
17
|
+
const CORPUS_ROOT = fileURLToPath(new URL("../../conformance/", import.meta.url));
|
|
18
|
+
const FIXTURES = join(CORPUS_ROOT, "fixtures");
|
|
19
|
+
function isRecord(value) {
|
|
20
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
function isTextPair(value) {
|
|
23
|
+
return (isRecord(value) &&
|
|
24
|
+
typeof value.text === "string" &&
|
|
25
|
+
Array.isArray(value.codeUnits) &&
|
|
26
|
+
value.codeUnits.every((unit) => typeof unit === "number"));
|
|
27
|
+
}
|
|
28
|
+
function stringList(value, where) {
|
|
29
|
+
if (!Array.isArray(value)) {
|
|
30
|
+
throw new Error(`${where}: expected a list`);
|
|
31
|
+
}
|
|
32
|
+
return value.map((item) => {
|
|
33
|
+
if (typeof item !== "string") {
|
|
34
|
+
throw new Error(`${where}: expected a list of strings`);
|
|
35
|
+
}
|
|
36
|
+
return item;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/** Whether every fragment occurs in `text`, each after the end of the one before. */
|
|
40
|
+
function containsInOrder(text, fragments) {
|
|
41
|
+
let from = 0;
|
|
42
|
+
for (const fragment of fragments) {
|
|
43
|
+
const wanted = textToString(fragment);
|
|
44
|
+
const at = text.indexOf(wanted, from);
|
|
45
|
+
if (at === -1) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
from = at + wanted.length;
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
/** An object matches when every key `expected` gives matches; an array matches element by element at the same length; any other value must be equal. */
|
|
53
|
+
function subsetMatches(actual, expected) {
|
|
54
|
+
if (Array.isArray(expected)) {
|
|
55
|
+
return (Array.isArray(actual) &&
|
|
56
|
+
actual.length === expected.length &&
|
|
57
|
+
expected.every((item, position) => subsetMatches(actual[position], item)));
|
|
58
|
+
}
|
|
59
|
+
if (isRecord(expected)) {
|
|
60
|
+
return (isRecord(actual) &&
|
|
61
|
+
Object.entries(expected).every(([key, value]) => subsetMatches(actual[key], value)));
|
|
62
|
+
}
|
|
63
|
+
return Object.is(actual, expected);
|
|
64
|
+
}
|
|
65
|
+
/** What a function returned, as the value a case expects: an `undefined` stays one, anything else is what `JSON.stringify` makes of it, except that a number the JSON form cannot hold (a negative zero, an infinity, NaN) is kept as the number. */
|
|
66
|
+
function toJson(value) {
|
|
67
|
+
if (value === undefined) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const text = JSON.stringify(value, (_key, item) => {
|
|
71
|
+
const name = typeof item === "number" ? specialNumberName(item) : undefined;
|
|
72
|
+
return name === undefined ? item : { $number: name };
|
|
73
|
+
});
|
|
74
|
+
if (text === undefined) {
|
|
75
|
+
throw new Error("the function returned a value JSON cannot hold");
|
|
76
|
+
}
|
|
77
|
+
return decodeValue(JSON.parse(text));
|
|
78
|
+
}
|
|
79
|
+
async function runFunctionCase(testCase) {
|
|
80
|
+
const implementation = FUNCTIONS[testCase.function];
|
|
81
|
+
if (implementation === undefined) {
|
|
82
|
+
throw new Error(`no function named ${testCase.function} in the call table`);
|
|
83
|
+
}
|
|
84
|
+
const args = testCase.args.map((arg) => decodeValue(arg));
|
|
85
|
+
if (testCase.throws !== undefined) {
|
|
86
|
+
let thrown;
|
|
87
|
+
try {
|
|
88
|
+
await implementation(...args);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
thrown = error;
|
|
92
|
+
}
|
|
93
|
+
expect(thrown, "the call must throw").toBeInstanceOf(Error);
|
|
94
|
+
const message = thrown instanceof Error ? thrown.message : "";
|
|
95
|
+
const { code, message: fragments } = testCase.throws;
|
|
96
|
+
if (code !== undefined) {
|
|
97
|
+
expect(errorCode(thrown)).toBe(code);
|
|
98
|
+
}
|
|
99
|
+
if (fragments !== undefined) {
|
|
100
|
+
expect(containsInOrder(message, fragments), `message ${JSON.stringify(message)} lacks, in order, ${JSON.stringify(fragments)}`).toBe(true);
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const actual = toJson(await implementation(...args));
|
|
105
|
+
if (testCase.expectUndefined === true) {
|
|
106
|
+
expect(actual).toBeUndefined();
|
|
107
|
+
}
|
|
108
|
+
else if (testCase.expectSubset !== undefined) {
|
|
109
|
+
expect(subsetMatches(actual, decodeValue(testCase.expectSubset)), `${JSON.stringify(actual)} does not hold ${JSON.stringify(testCase.expectSubset)}`).toBe(true);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
expect(actual).toEqual(decodeValue(testCase.expect));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function runValidateCase(testCase) {
|
|
116
|
+
const validate = SCHEMAS[testCase.schema];
|
|
117
|
+
if (validate === undefined) {
|
|
118
|
+
throw new Error(`no schema named ${testCase.schema} in the call table`);
|
|
119
|
+
}
|
|
120
|
+
const result = validate(decodeValue(testCase.input));
|
|
121
|
+
const { expect: expectation } = testCase;
|
|
122
|
+
if (expectation.ok) {
|
|
123
|
+
expect(result.ok, `rejected: ${JSON.stringify(result)}`).toBe(true);
|
|
124
|
+
if (expectation.value !== undefined && result.ok) {
|
|
125
|
+
expect(toJson(result.value)).toEqual(decodeValue(expectation.value));
|
|
126
|
+
}
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
expect(result.ok, "must be rejected").toBe(false);
|
|
130
|
+
if (result.ok) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
expect(result.issues.map((issue) => issue.path)).toEqual(expectation.issues.map((issue) => issue.path));
|
|
134
|
+
expectation.issues.forEach((issue, position) => {
|
|
135
|
+
if (issue.code !== undefined) {
|
|
136
|
+
expect(result.issues[position]?.code).toBe(issue.code);
|
|
137
|
+
}
|
|
138
|
+
const fragments = issue.message;
|
|
139
|
+
const actualMessage = result.issues[position]?.message ?? "";
|
|
140
|
+
if (fragments !== undefined) {
|
|
141
|
+
expect(containsInOrder(actualMessage, fragments), `message ${JSON.stringify(actualMessage)} lacks, in order, ${JSON.stringify(fragments)}`).toBe(true);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/** The names of the entries in a fixture directory, which must hold at least one. */
|
|
146
|
+
function fixtureNames(directory) {
|
|
147
|
+
const names = readdirSync(join(FIXTURES, directory)).sort();
|
|
148
|
+
expect(names.length, `${directory} holds no fixtures`).toBeGreaterThan(0);
|
|
149
|
+
return names;
|
|
150
|
+
}
|
|
151
|
+
/** Whether a loader rejects the file: a file that cannot be parsed is rejected too. */
|
|
152
|
+
function rejects(path, validate) {
|
|
153
|
+
try {
|
|
154
|
+
return !validate(readJson(path)).ok;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* A negative fixture must fail for the rule it exists for. Each file in `invalid` has a file of the same name in `repaired` that differs by that one defect and is valid, so the invalid one cannot stay rejected for another reason.
|
|
162
|
+
*/
|
|
163
|
+
function expectPairs(invalid, repaired, validate) {
|
|
164
|
+
const names = fixtureNames(invalid);
|
|
165
|
+
expect(fixtureNames(repaired), "every fixture has a repaired twin").toEqual(names);
|
|
166
|
+
const accepted = names.filter((name) => !rejects(join(FIXTURES, invalid, name), validate));
|
|
167
|
+
expect(accepted, `${invalid} fixtures that validate`).toEqual([]);
|
|
168
|
+
for (const name of names) {
|
|
169
|
+
const result = validate(readJson(join(FIXTURES, repaired, name)));
|
|
170
|
+
expect(result.ok ? [] : result.problems, `${repaired}/${name}`).toEqual([]);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/** The value at a path of keys, or undefined. */
|
|
174
|
+
function dig(value, ...keys) {
|
|
175
|
+
let current = value;
|
|
176
|
+
for (const key of keys) {
|
|
177
|
+
if (!isRecord(current)) {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
current = current[key];
|
|
181
|
+
}
|
|
182
|
+
return current;
|
|
183
|
+
}
|
|
184
|
+
describe("corpus loading", () => {
|
|
185
|
+
it("selects the files the README's rule selects, over the shared fixture tree", () => {
|
|
186
|
+
const expected = readJson(join(FIXTURES, "loader-selection", "expected.json"));
|
|
187
|
+
if (!isRecord(expected)) {
|
|
188
|
+
throw new Error("expected.json must be an object");
|
|
189
|
+
}
|
|
190
|
+
const selection = selectCorpusFiles(join(FIXTURES, "loader-selection", "tree"));
|
|
191
|
+
expect({
|
|
192
|
+
problems: selection.problems,
|
|
193
|
+
selected: selection.selected,
|
|
194
|
+
}).toEqual({
|
|
195
|
+
problems: stringList(expected.problems, "problems"),
|
|
196
|
+
selected: stringList(expected.selected, "selected"),
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
it("finds nothing wrong with the real corpus", () => {
|
|
200
|
+
expect(checkCorpus(CORPUS_ROOT).problems).toEqual([]);
|
|
201
|
+
});
|
|
202
|
+
it("rejects every invalid-case fixture, each for its one defect", () => {
|
|
203
|
+
expectPairs("invalid-cases", "repaired-cases", validateCorpusFile);
|
|
204
|
+
});
|
|
205
|
+
it("rejects every invalid manifest fixture, each for its one defect", () => {
|
|
206
|
+
expectPairs("manifests/invalid", "manifests/repaired", validateManifest);
|
|
207
|
+
});
|
|
208
|
+
it("rejects every invalid corpus fixture, each for its one defect", () => {
|
|
209
|
+
const names = fixtureNames("corpora/invalid");
|
|
210
|
+
expect(fixtureNames("corpora/repaired")).toEqual(names);
|
|
211
|
+
for (const name of names) {
|
|
212
|
+
expect(checkCorpus(join(FIXTURES, "corpora", "invalid", name)).problems.length, `corpora/invalid/${name} must have a problem`).toBeGreaterThan(0);
|
|
213
|
+
expect(checkCorpus(join(FIXTURES, "corpora", "repaired", name)).problems, `corpora/repaired/${name}`).toEqual([]);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
it("accepts every valid fixture", () => {
|
|
217
|
+
for (const name of fixtureNames("valid-cases")) {
|
|
218
|
+
const result = validateCorpusFile(readJson(join(FIXTURES, "valid-cases", name)));
|
|
219
|
+
expect(result.ok ? [] : result.problems, name).toEqual([]);
|
|
220
|
+
}
|
|
221
|
+
for (const name of fixtureNames("manifests/valid")) {
|
|
222
|
+
const result = validateManifest(readJson(join(FIXTURES, "manifests", "valid", name)));
|
|
223
|
+
expect(result.ok ? [] : result.problems, name).toEqual([]);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
it("reads the four special numbers as the numbers they name, and nothing else", () => {
|
|
227
|
+
const decoded = decodeValue([
|
|
228
|
+
{ $number: "-0" },
|
|
229
|
+
{ $number: "Infinity" },
|
|
230
|
+
{ $number: "-Infinity" },
|
|
231
|
+
{ $number: "NaN" },
|
|
232
|
+
{ a: { $number: "-0" } },
|
|
233
|
+
]);
|
|
234
|
+
expect(decoded).toEqual([
|
|
235
|
+
-0,
|
|
236
|
+
Number.POSITIVE_INFINITY,
|
|
237
|
+
Number.NEGATIVE_INFINITY,
|
|
238
|
+
Number.NaN,
|
|
239
|
+
{ a: -0 },
|
|
240
|
+
]);
|
|
241
|
+
expect(Object.is(decoded[0], -0)).toBe(true);
|
|
242
|
+
expect(() => decodeValue({ $number: "1" })).toThrow("$number");
|
|
243
|
+
expect(specialNumberName(-0)).toBe("-0");
|
|
244
|
+
expect(specialNumberName(0)).toBeUndefined();
|
|
245
|
+
});
|
|
246
|
+
it("reads both forms of a text as the same UTF-16 code units", () => {
|
|
247
|
+
const document = readJson(join(FIXTURES, "text-forms", "pairs.json"));
|
|
248
|
+
const list = isRecord(document) ? document.pairs : undefined;
|
|
249
|
+
if (!Array.isArray(list) || list.length === 0) {
|
|
250
|
+
throw new Error("pairs.json must hold a non-empty list of pairs");
|
|
251
|
+
}
|
|
252
|
+
for (const pair of list) {
|
|
253
|
+
if (!isTextPair(pair)) {
|
|
254
|
+
throw new Error("a pair holds a text and its code units");
|
|
255
|
+
}
|
|
256
|
+
expect(textToCodeUnits(pair.text)).toEqual(pair.codeUnits);
|
|
257
|
+
expect(textToCodeUnits({ codeUnits: pair.codeUnits })).toEqual(pair.codeUnits);
|
|
258
|
+
expect(textToString({ codeUnits: pair.codeUnits })).toBe(pair.text);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
it("types the case kinds and the skip values the schema defines, and no others", () => {
|
|
262
|
+
const schema = readJson(join(CORPUS_ROOT, "case.schema.json"));
|
|
263
|
+
const refs = dig(schema, "$defs", "case", "oneOf");
|
|
264
|
+
if (!Array.isArray(refs)) {
|
|
265
|
+
throw new Error("the schema's $defs.case.oneOf must be a list");
|
|
266
|
+
}
|
|
267
|
+
const kinds = refs.map((reference) => {
|
|
268
|
+
const target = dig(reference, "$ref");
|
|
269
|
+
const name = typeof target === "string" ? target.split("/").pop() : "";
|
|
270
|
+
const kind = dig(schema, "$defs", name ?? "", "properties", "kind", "const");
|
|
271
|
+
if (typeof kind !== "string") {
|
|
272
|
+
throw new Error(`no kind constant behind ${JSON.stringify(target)}`);
|
|
273
|
+
}
|
|
274
|
+
return kind;
|
|
275
|
+
});
|
|
276
|
+
expect([...kinds].sort()).toEqual([...KINDS].sort());
|
|
277
|
+
expect(dig(schema, "$defs", "skip", "enum")).toEqual([...SKIP_VALUES]);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
const checked = checkCorpus(CORPUS_ROOT);
|
|
281
|
+
if (checked.problems.length > 0) {
|
|
282
|
+
throw new Error(`the corpus is malformed:\n${checked.problems.join("\n")}`);
|
|
283
|
+
}
|
|
284
|
+
const corpus = checked.files;
|
|
285
|
+
// Each case is recorded where it is registered, and again where its body starts, so the completeness check at the end reads what this run did and not what the corpus says: a loop that skips, filters or mis-keys cases, or a framework option that skips them, shows as a failure there. A run that selects tests by name or stops early fails it too, so the whole file is run.
|
|
286
|
+
const registrations = [];
|
|
287
|
+
const ran = new Set();
|
|
288
|
+
for (const { name, file } of corpus) {
|
|
289
|
+
describe(`conformance ${name}`, () => {
|
|
290
|
+
for (const testCase of file.cases) {
|
|
291
|
+
registrations.push({ file: name, id: testCase.id, skip: testCase.skip });
|
|
292
|
+
const register = testCase.skip === "ts" ? it.skip : it;
|
|
293
|
+
register(`${testCase.id} (${testCase.from})`, async () => {
|
|
294
|
+
ran.add(testCase.id);
|
|
295
|
+
// A body that returns without asserting would still count as having run.
|
|
296
|
+
expect.hasAssertions();
|
|
297
|
+
if (testCase.kind === "function") {
|
|
298
|
+
await runFunctionCase(testCase);
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
runValidateCase(testCase);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
describe("corpus completeness", () => {
|
|
308
|
+
const manifest = validateManifest(readJson(join(CORPUS_ROOT, "manifest.json")));
|
|
309
|
+
it("ran every case the manifest holds that this implementation does not skip", () => {
|
|
310
|
+
if (!manifest.ok) {
|
|
311
|
+
throw new Error(manifest.problems.join("\n"));
|
|
312
|
+
}
|
|
313
|
+
expect(runCompletenessProblems(manifest.value, registrations, ran)).toEqual([]);
|
|
314
|
+
});
|
|
315
|
+
describe("fails for a run that did not do what the manifest says", () => {
|
|
316
|
+
const held = {
|
|
317
|
+
files: {
|
|
318
|
+
"function/a.json": { cases: 2, skip: ["b"] },
|
|
319
|
+
"function/c.json": { cases: 1, skip: [] },
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
const full = [
|
|
323
|
+
{ file: "function/a.json", id: "a", skip: undefined },
|
|
324
|
+
{ file: "function/a.json", id: "b", skip: "ts" },
|
|
325
|
+
{ file: "function/c.json", id: "c", skip: undefined },
|
|
326
|
+
];
|
|
327
|
+
it("passes when every case is registered and each one not skipped ran", () => {
|
|
328
|
+
expect(runCompletenessProblems(held, full, new Set(["a", "c"]))).toEqual([]);
|
|
329
|
+
});
|
|
330
|
+
it("fails when the framework skipped every case", () => {
|
|
331
|
+
expect(runCompletenessProblems(held, full, new Set())).toEqual([
|
|
332
|
+
"a was registered and did not run",
|
|
333
|
+
"c was registered and did not run",
|
|
334
|
+
]);
|
|
335
|
+
});
|
|
336
|
+
it("fails when a case was never registered", () => {
|
|
337
|
+
expect(runCompletenessProblems(held, full.slice(1), new Set(["c"]))).toContain("function/a.json: 1 cases registered, the manifest has 2");
|
|
338
|
+
});
|
|
339
|
+
it("fails when a case is registered under another file", () => {
|
|
340
|
+
const moved = full.map((entry) => entry.id === "c" ? { ...entry, file: "function/a.json" } : entry);
|
|
341
|
+
expect(runCompletenessProblems(held, moved, new Set(["a", "c"]))).toEqual([
|
|
342
|
+
"function/a.json: 3 cases registered, the manifest has 2",
|
|
343
|
+
"function/c.json: 0 cases registered, the manifest has 1",
|
|
344
|
+
]);
|
|
345
|
+
});
|
|
346
|
+
it("fails when a case is skipped here and the manifest does not list it", () => {
|
|
347
|
+
const unlisted = full.map((entry) => entry.id === "a" ? { ...entry, skip: "ts" } : entry);
|
|
348
|
+
expect(runCompletenessProblems(held, unlisted, new Set(["c"]))).toEqual([
|
|
349
|
+
"a is skipped here and not listed in the manifest",
|
|
350
|
+
]);
|
|
351
|
+
});
|
|
352
|
+
it("does not need a case that skips the other implementation to be skipped here", () => {
|
|
353
|
+
const other = full.map((entry) => entry.id === "a" ? { ...entry, skip: "rust" } : entry);
|
|
354
|
+
expect(runCompletenessProblems(held, other, new Set(["a", "c"]))).toEqual([]);
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
//# sourceMappingURL=conformance.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.unit.test.js","sourceRoot":"","sources":["../../src/test/conformance.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,74 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The mesh error reporter's default sink. Everything else about error reporting is in the conformance corpus (conformance/function/error-reporting.json); this stays here because it observes the real process stderr.
|
|
3
3
|
*/
|
|
4
4
|
import { describe, expect, it, vi } from "vitest";
|
|
5
|
-
import { createMeshErrorReporter
|
|
6
|
-
import { shortId } from "../core/display-name.js";
|
|
7
|
-
import { PeerLinkError } from "../core/peer-link-error.js";
|
|
8
|
-
const PEER_ID = "7d5bb622d5890adc2c4b63e8fd95fb27319be5f3876657b072f1a8a38f2cdbee";
|
|
9
|
-
const OTHER_PEER_ID = "a".repeat(PEER_ID.length);
|
|
10
|
-
// An arbitrary data port, named so the assertions read as the dialled address.
|
|
11
|
-
const DATA_PORT = 41001;
|
|
12
|
-
/** An error shaped like the ones Node's sockets raise, with the errno code on the error itself. */
|
|
13
|
-
function errno(code, message) {
|
|
14
|
-
const error = new Error(message);
|
|
15
|
-
error.code = code;
|
|
16
|
-
return error;
|
|
17
|
-
}
|
|
18
|
-
describe("formatMeshError", () => {
|
|
19
|
-
it("reports an error as one prefixed, newline-terminated line", () => {
|
|
20
|
-
expect(formatMeshError(new Error("listen EADDRINUSE"))).toBe("agent-comms: listen EADDRINUSE\n");
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
describe("describeMeshError", () => {
|
|
24
|
-
it("explains a refused dial as a stale peer address, naming the peer and port", () => {
|
|
25
|
-
const error = new PeerLinkError("dial", PEER_ID, DATA_PORT, errno("ECONNREFUSED", "connect ECONNREFUSED 127.0.0.1:41001"));
|
|
26
|
-
const described = describeMeshError(error);
|
|
27
|
-
expect(described?.message).toContain(shortId(PEER_ID));
|
|
28
|
-
expect(described?.message).toContain(String(DATA_PORT));
|
|
29
|
-
expect(described?.message).toContain("most likely exited or restarted");
|
|
30
|
-
});
|
|
31
|
-
it("treats a reset dial like a refused one", () => {
|
|
32
|
-
const error = new PeerLinkError("dial", PEER_ID, DATA_PORT, errno("ECONNRESET", "read ECONNRESET"));
|
|
33
|
-
expect(describeMeshError(error)?.message).toContain("stale address");
|
|
34
|
-
});
|
|
35
|
-
it("keeps the transport's own reason for a dial failure it has no explanation for", () => {
|
|
36
|
-
const error = new PeerLinkError("dial", PEER_ID, DATA_PORT, errno("ETIMEDOUT", "connect ETIMEDOUT 127.0.0.1:41001"));
|
|
37
|
-
const described = describeMeshError(error);
|
|
38
|
-
expect(described?.message).toContain("connect ETIMEDOUT 127.0.0.1:41001");
|
|
39
|
-
expect(described?.message).not.toContain("stale address");
|
|
40
|
-
});
|
|
41
|
-
it("explains a send cut off by a disconnect, naming the peer", () => {
|
|
42
|
-
const error = new PeerLinkError("send", PEER_ID, undefined, new Error("disconnected before a response arrived"));
|
|
43
|
-
const described = describeMeshError(error);
|
|
44
|
-
expect(described?.message).toContain(shortId(PEER_ID));
|
|
45
|
-
expect(described?.message).toContain("disconnected before a response arrived");
|
|
46
|
-
});
|
|
47
|
-
it("explains a broadcast with nowhere to go as a missing network", () => {
|
|
48
|
-
const described = describeMeshError(errno("ENETUNREACH", "send ENETUNREACH 255.255.255.255:19877"));
|
|
49
|
-
expect(described?.message).toContain("ENETUNREACH");
|
|
50
|
-
expect(described?.message).toContain("network");
|
|
51
|
-
});
|
|
52
|
-
it("recognises nothing in an error it has no meaning for", () => {
|
|
53
|
-
expect(describeMeshError(new Error("listen EADDRINUSE"))).toBeUndefined();
|
|
54
|
-
});
|
|
55
|
-
it("keys a condition by the peer it is about", () => {
|
|
56
|
-
const refused = (peerId, port) => describeMeshError(new PeerLinkError("dial", peerId, port, errno("ECONNREFUSED", "x")))?.key;
|
|
57
|
-
expect(refused(PEER_ID, DATA_PORT)).toBe(refused(PEER_ID, DATA_PORT + 1));
|
|
58
|
-
expect(refused(PEER_ID, DATA_PORT)).not.toBe(refused(OTHER_PEER_ID, DATA_PORT));
|
|
59
|
-
});
|
|
60
|
-
});
|
|
5
|
+
import { createMeshErrorReporter } from "../core/error-reporting.js";
|
|
61
6
|
describe("createMeshErrorReporter", () => {
|
|
62
|
-
it("writes each error to the sink as one prefixed line", () => {
|
|
63
|
-
const write = vi.fn();
|
|
64
|
-
const report = createMeshErrorReporter(write);
|
|
65
|
-
report(new Error("listen EADDRINUSE"));
|
|
66
|
-
report(new Error("hub unreachable"));
|
|
67
|
-
expect(write.mock.calls).toEqual([
|
|
68
|
-
["agent-comms: listen EADDRINUSE\n"],
|
|
69
|
-
["agent-comms: hub unreachable\n"],
|
|
70
|
-
]);
|
|
71
|
-
});
|
|
72
7
|
it("writes to the real process stderr by default", () => {
|
|
73
8
|
const stderr = vi
|
|
74
9
|
.spyOn(process.stderr, "write")
|
|
@@ -81,28 +16,5 @@ describe("createMeshErrorReporter", () => {
|
|
|
81
16
|
stderr.mockRestore();
|
|
82
17
|
}
|
|
83
18
|
});
|
|
84
|
-
it("writes a recognised condition once however often it repeats, even when the port changes", () => {
|
|
85
|
-
const write = vi.fn();
|
|
86
|
-
const report = createMeshErrorReporter(write);
|
|
87
|
-
const refused = (port) => new PeerLinkError("dial", PEER_ID, port, errno("ECONNREFUSED", "x"));
|
|
88
|
-
report(refused(DATA_PORT));
|
|
89
|
-
report(refused(DATA_PORT + 1));
|
|
90
|
-
report(refused(DATA_PORT + 2));
|
|
91
|
-
expect(write).toHaveBeenCalledTimes(1);
|
|
92
|
-
});
|
|
93
|
-
it("writes the same condition for a different peer", () => {
|
|
94
|
-
const write = vi.fn();
|
|
95
|
-
const report = createMeshErrorReporter(write);
|
|
96
|
-
report(new PeerLinkError("dial", PEER_ID, DATA_PORT, errno("ECONNREFUSED", "x")));
|
|
97
|
-
report(new PeerLinkError("dial", OTHER_PEER_ID, DATA_PORT, errno("ECONNREFUSED", "x")));
|
|
98
|
-
expect(write).toHaveBeenCalledTimes(2);
|
|
99
|
-
});
|
|
100
|
-
it("writes every error it has no meaning for", () => {
|
|
101
|
-
const write = vi.fn();
|
|
102
|
-
const report = createMeshErrorReporter(write);
|
|
103
|
-
report(new Error("hub unreachable"));
|
|
104
|
-
report(new Error("hub unreachable"));
|
|
105
|
-
expect(write).toHaveBeenCalledTimes(2);
|
|
106
|
-
});
|
|
107
19
|
});
|
|
108
20
|
//# sourceMappingURL=error-reporting.unit.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-reporting.unit.test.js","sourceRoot":"","sources":["../../src/test/error-reporting.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"error-reporting.unit.test.js","sourceRoot":"","sources":["../../src/test/error-reporting.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,EAAE;aACd,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;aAC9B,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,uBAAuB,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -34,6 +34,12 @@ export interface HubObserver {
|
|
|
34
34
|
* Connects a bare client to the hub that never gossips, presents no identity and trusts nobody, and records every advert the hub broadcasts to it. This is the view of anyone connected to a public hub, which is what a test about what a store puts on the hub has to look at: asserting on another store's directory only shows what that store chose to accept.
|
|
35
35
|
*/
|
|
36
36
|
export declare function observeHub(url: string): Promise<HubObserver>;
|
|
37
|
+
/**
|
|
38
|
+
* The base of a bridge port range reserved for the calling test worker, for a test that starts bridges and must not bind the range a bridge on the machine holds.
|
|
39
|
+
*
|
|
40
|
+
* Each vitest worker of a run has its own pool id, and the base is that id times a stride wider than the range, so two workers of one run cannot share a base, and no worker's range is the production one. It is a reservation by construction, not a check that the ports are free: a test that asserts exact ports relies on nothing else on the machine using this worker's slot, which holds unless a second vitest run is going at the same time.
|
|
41
|
+
*/
|
|
42
|
+
export declare function testBridgePortBase(): number;
|
|
37
43
|
/** A localhost TCP port nothing is listening on right now, for a test that must not collide with whatever else runs on the machine: a fixed port can already belong to another process, and a store that connects to one that accepts but never answers as a coordinator waits for it indefinitely. */
|
|
38
44
|
export declare function freeLocalPort(): Promise<number>;
|
|
39
45
|
//# sourceMappingURL=hub-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-helpers.d.ts","sourceRoot":"","sources":["../../src/test/hub-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hub-helpers.d.ts","sourceRoot":"","sources":["../../src/test/hub-helpers.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAS3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAErD;AA0FD,+WAA+W;AAC/W,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC,CAmCD;AAED,ipBAAipB;AACjpB,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAiBzD;AAED,6PAA6P;AAC7P,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,OAAO,EACxB,SAAS,SAA+B,GACvC,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IAErD,IAAI,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIrC,qGAAqG;IAC/F,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAK3B;AAED,mJAAmJ;AACnJ,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,OAAO,EAAE,MAAM,SAAS,UAAU,EAAE,CAAC;IACrC,0DAA0D;IAC1D,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,UAAU,EAAE,CAAC;IACzD,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAclE;AAQD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAM3C;AAED,uSAAuS;AACvS,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAiBrD"}
|
package/dist/test/hub-helpers.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Shared helpers for hub-mode integration tests: a real wire-mesh relay hub (createRelayHub -- the same domain logic the production mesh.exadev.io Durable Object runs) served over local WebSockets, canonical-CBOR framing for the ws bridge, and a condition-polling helper for the async discovery/gossip timing these tests exercise.
|
|
2
2
|
import { createServer } from "node:http";
|
|
3
3
|
import net from "node:net";
|
|
4
|
+
import { BRIDGE_PORT_COUNT } from "../bridges/user/web/bridge-port-range.js";
|
|
4
5
|
import { WebSocketServer } from "ws";
|
|
5
6
|
import { cdeDecodeOptions, cdeEncodeOptions, decode, encode } from "cbor2";
|
|
6
7
|
import { frameSchema } from "wire-mesh-core/generated/protocol";
|
|
@@ -206,6 +207,22 @@ export async function observeHub(url) {
|
|
|
206
207
|
close: async () => connection.close(),
|
|
207
208
|
};
|
|
208
209
|
}
|
|
210
|
+
/** The first port of the test slots, above the bridge port range and below every operating system's ephemeral range, so a test's bridge ports collide with neither a bridge running on the machine nor a port the operating system hands out. */
|
|
211
|
+
const TEST_BRIDGE_PORT_FLOOR = 21_000;
|
|
212
|
+
/** Ports between two slots' bases: wider than the bridge port range, so neighbouring slots never overlap. */
|
|
213
|
+
const TEST_BRIDGE_SLOT_STRIDE = BRIDGE_PORT_COUNT * 2;
|
|
214
|
+
/**
|
|
215
|
+
* The base of a bridge port range reserved for the calling test worker, for a test that starts bridges and must not bind the range a bridge on the machine holds.
|
|
216
|
+
*
|
|
217
|
+
* Each vitest worker of a run has its own pool id, and the base is that id times a stride wider than the range, so two workers of one run cannot share a base, and no worker's range is the production one. It is a reservation by construction, not a check that the ports are free: a test that asserts exact ports relies on nothing else on the machine using this worker's slot, which holds unless a second vitest run is going at the same time.
|
|
218
|
+
*/
|
|
219
|
+
export function testBridgePortBase() {
|
|
220
|
+
const poolId = Number(process.env.VITEST_POOL_ID);
|
|
221
|
+
if (!Number.isInteger(poolId) || poolId < 1) {
|
|
222
|
+
throw new Error("testBridgePortBase needs to run inside a vitest worker");
|
|
223
|
+
}
|
|
224
|
+
return TEST_BRIDGE_PORT_FLOOR + (poolId - 1) * TEST_BRIDGE_SLOT_STRIDE;
|
|
225
|
+
}
|
|
209
226
|
/** A localhost TCP port nothing is listening on right now, for a test that must not collide with whatever else runs on the machine: a fixed port can already belong to another process, and a store that connects to one that accepts but never answers as a coordinator waits for it indefinitely. */
|
|
210
227
|
export async function freeLocalPort() {
|
|
211
228
|
return new Promise((resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-helpers.js","sourceRoot":"","sources":["../../src/test/hub-helpers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hub-helpers.js","sourceRoot":"","sources":["../../src/test/hub-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import * as path from "node:path";
|
|
|
8
8
|
import * as readline from "node:readline";
|
|
9
9
|
import { fileURLToPath } from "node:url";
|
|
10
10
|
import { LATEST_PROTOCOL_VERSION } from "@modelcontextprotocol/sdk/types.js";
|
|
11
|
-
import { freeLocalPort, TeardownStack, unreachableHubUrl, } from "./hub-helpers.js";
|
|
11
|
+
import { freeLocalPort, TeardownStack, testBridgePortBase, unreachableHubUrl, } from "./hub-helpers.js";
|
|
12
12
|
import { scratchDirectory } from "./scratch-directory.helper.js";
|
|
13
13
|
const cleanups = new TeardownStack();
|
|
14
14
|
afterEach(async () => {
|
|
@@ -44,6 +44,7 @@ it.each(ENTRIES)("writes only JSON-RPC messages to stdout and puts the web UI ba
|
|
|
44
44
|
firstContactPort: await freeLocalPort(),
|
|
45
45
|
hubUrl: await unreachableHubUrl(),
|
|
46
46
|
slotDir,
|
|
47
|
+
webPortBase: testBridgePortBase(),
|
|
47
48
|
}),
|
|
48
49
|
], {
|
|
49
50
|
stdio: ["pipe", "pipe", "pipe"],
|