@browsercore/testing 0.2.0 → 0.2.2
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/README.md +1 -1
- package/bin/coverage-md.mjs +99 -0
- package/captures/test-malformed/http2/settings.bin +0 -0
- package/captures/test-malformed/http2/settings.meta.json +9 -0
- package/captures/test-no-extensions/tls/client_hello.bin +0 -0
- package/captures/test-no-extensions/tls/client_hello.meta.json +9 -0
- package/captures/test-wrong-type/http2/settings.bin +0 -0
- package/captures/test-wrong-type/http2/settings.meta.json +9 -0
- package/dist/bench/bench.d.ts +2 -0
- package/dist/bench/bench.d.ts.map +1 -1
- package/dist/bench/bench.js +12 -7
- package/dist/bench/bench.js.map +1 -1
- package/dist/captures/manifest.d.ts.map +1 -1
- package/dist/captures/manifest.js +6 -5
- package/dist/captures/manifest.js.map +1 -1
- package/dist/categories/compression.d.ts +6 -4
- package/dist/categories/compression.d.ts.map +1 -1
- package/dist/categories/compression.js +56 -6
- package/dist/categories/compression.js.map +1 -1
- package/dist/categories/cookies.js +0 -12
- package/dist/categories/cookies.js.map +1 -1
- package/dist/e2e/cert-gen.d.ts +1 -0
- package/dist/e2e/cert-gen.d.ts.map +1 -1
- package/dist/e2e/cert-gen.js +1 -1
- package/dist/e2e/cert-gen.js.map +1 -1
- package/dist/e2e/traffic-server.d.ts +48 -0
- package/dist/e2e/traffic-server.d.ts.map +1 -0
- package/dist/e2e/traffic-server.js +162 -0
- package/dist/e2e/traffic-server.js.map +1 -0
- package/dist/golden/golden.d.ts.map +1 -1
- package/dist/golden/golden.js +8 -7
- package/dist/golden/golden.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/node-provider.d.ts +42 -0
- package/dist/node-provider.d.ts.map +1 -0
- package/dist/node-provider.js +53 -0
- package/dist/node-provider.js.map +1 -0
- package/dist/provider.d.ts +52 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +14 -0
- package/dist/provider.js.map +1 -0
- package/dist/reference/browser-provider.d.ts.map +1 -1
- package/dist/reference/browser-provider.js +4 -3
- package/dist/reference/browser-provider.js.map +1 -1
- package/dist/reference/node-crypto-provider.d.ts +31 -0
- package/dist/reference/node-crypto-provider.d.ts.map +1 -0
- package/dist/reference/node-crypto-provider.js +199 -0
- package/dist/reference/node-crypto-provider.js.map +1 -0
- package/package.json +17 -13
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E traffic server for Bug 6 (AES-128-GCM record decryption) regression.
|
|
3
|
+
*
|
|
4
|
+
* Extends the sink-server pattern: performs a **real** TLS 1.3 handshake
|
|
5
|
+
* against the @browsercore/tls client stack, then serves an encrypted HTTP
|
|
6
|
+
* response. The client must decrypt the full server flight (handshake +
|
|
7
|
+
* application data) — if AEAD key derivation, nonce construction, or record
|
|
8
|
+
* parsing is wrong, decryption fails and the fetch throws.
|
|
9
|
+
*
|
|
10
|
+
* This is the deterministic, network-free reproduction for Bug 6: the same
|
|
11
|
+
* TLS code path that fails against example.com fails here, but without a
|
|
12
|
+
* network dependency.
|
|
13
|
+
*/
|
|
14
|
+
import { createServer } from "node:net";
|
|
15
|
+
import { createSecureContext, TLSSocket } from "node:tls";
|
|
16
|
+
import { generateSelfSignedCert } from "./cert-gen.js";
|
|
17
|
+
/** HTTP response the server sends after a successful handshake. */
|
|
18
|
+
const HTTP_RESPONSE = [
|
|
19
|
+
"HTTP/1.1 200 OK",
|
|
20
|
+
"Content-Type: text/plain",
|
|
21
|
+
"X-Traffic-Gate: bug6",
|
|
22
|
+
"Content-Length: 19",
|
|
23
|
+
"",
|
|
24
|
+
"TRAFFIC_GATE_OK_BUG6",
|
|
25
|
+
].join("\r\n");
|
|
26
|
+
/**
|
|
27
|
+
* Single-shot TLS 1.3 traffic server. Performs a real handshake, then sends
|
|
28
|
+
* an encrypted HTTP response the client must decrypt.
|
|
29
|
+
*/
|
|
30
|
+
export class TrafficServer {
|
|
31
|
+
server;
|
|
32
|
+
ctx;
|
|
33
|
+
state = { state: "idle" };
|
|
34
|
+
waiters = [];
|
|
35
|
+
failers = [];
|
|
36
|
+
host;
|
|
37
|
+
port;
|
|
38
|
+
constructor(server, ctx, host, port) {
|
|
39
|
+
this.server = server;
|
|
40
|
+
this.ctx = ctx;
|
|
41
|
+
this.host = host;
|
|
42
|
+
this.port = port;
|
|
43
|
+
}
|
|
44
|
+
/** Start listening on an ephemeral port on 127.0.0.1. */
|
|
45
|
+
static start() {
|
|
46
|
+
const { certDer, keyPem } = generateSelfSignedCert(["localhost"], ["127.0.0.1"], 1);
|
|
47
|
+
const ctx = createSecureContext({
|
|
48
|
+
key: keyPem,
|
|
49
|
+
cert: derToPem(certDer, "CERTIFICATE"),
|
|
50
|
+
});
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
const server = createServer({ allowHalfOpen: false });
|
|
53
|
+
server.maxConnections = 1;
|
|
54
|
+
server.on("error", reject);
|
|
55
|
+
server.listen(0, "127.0.0.1", () => {
|
|
56
|
+
const addr = server.address();
|
|
57
|
+
if (addr === null || typeof addr === "string") {
|
|
58
|
+
reject(new Error("traffic server did not bind"));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const traffic = new TrafficServer(server, ctx, addr.address, addr.port);
|
|
62
|
+
traffic.attach();
|
|
63
|
+
resolve(traffic);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
attach() {
|
|
68
|
+
this.server.on("connection", (socket) => this.onConnection(socket));
|
|
69
|
+
}
|
|
70
|
+
onConnection(rawSocket) {
|
|
71
|
+
if (this.state.state !== "idle") {
|
|
72
|
+
rawSocket.destroy();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const startedAt = Date.now();
|
|
76
|
+
this.state = { state: "handshaking", startedAt };
|
|
77
|
+
const tlsSocket = new TLSSocket(rawSocket, {
|
|
78
|
+
isServer: true,
|
|
79
|
+
secureContext: this.ctx,
|
|
80
|
+
requestCert: false,
|
|
81
|
+
ALPNProtocols: ["h2", "http/1.1"],
|
|
82
|
+
});
|
|
83
|
+
tlsSocket.on("secure", () => {
|
|
84
|
+
// Handshake completed. Now send the encrypted HTTP response.
|
|
85
|
+
// The client must decrypt this to read the body — this is what
|
|
86
|
+
// exercises the Bug 6 path.
|
|
87
|
+
tlsSocket.write(HTTP_RESPONSE, () => {
|
|
88
|
+
const result = {
|
|
89
|
+
protocolVersion: tlsSocket.getProtocol() ?? "unknown",
|
|
90
|
+
cipherSuite: tlsSocket.getCipher().name,
|
|
91
|
+
alpnProtocol: narrowServerName(tlsSocket.alpnProtocol),
|
|
92
|
+
handshakeDurationMs: Date.now() - startedAt,
|
|
93
|
+
};
|
|
94
|
+
this.done(result);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
tlsSocket.on("error", (err) => {
|
|
98
|
+
this.fail(new Error(`TLS handshake failed: ${err.message}`, { cause: err }));
|
|
99
|
+
});
|
|
100
|
+
tlsSocket.on("close", () => {
|
|
101
|
+
if (this.state.state !== "done") {
|
|
102
|
+
this.fail(new Error("socket closed before handshake completed"));
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
done(result) {
|
|
107
|
+
if (this.state.state === "done")
|
|
108
|
+
return;
|
|
109
|
+
this.state = { state: "done", result };
|
|
110
|
+
const w = this.waiters;
|
|
111
|
+
this.waiters = [];
|
|
112
|
+
this.failers = [];
|
|
113
|
+
for (const resolve of w)
|
|
114
|
+
resolve(result);
|
|
115
|
+
}
|
|
116
|
+
fail(error) {
|
|
117
|
+
if (this.state.state === "done")
|
|
118
|
+
return;
|
|
119
|
+
this.state = { state: "failed", error };
|
|
120
|
+
const f = this.failers;
|
|
121
|
+
this.failers = [];
|
|
122
|
+
this.waiters = [];
|
|
123
|
+
for (const reject of f)
|
|
124
|
+
reject(error);
|
|
125
|
+
}
|
|
126
|
+
/** Resolve once handshake completes. */
|
|
127
|
+
waitForHandshake(timeoutMs = 5000) {
|
|
128
|
+
if (this.state.state === "done")
|
|
129
|
+
return Promise.resolve(this.state.result);
|
|
130
|
+
if (this.state.state === "failed")
|
|
131
|
+
return Promise.reject(this.state.error);
|
|
132
|
+
return new Promise((resolve, reject) => {
|
|
133
|
+
let timer;
|
|
134
|
+
this.waiters.push((r) => { if (timer)
|
|
135
|
+
clearTimeout(timer); resolve(r); });
|
|
136
|
+
this.failers.push((e) => { if (timer)
|
|
137
|
+
clearTimeout(timer); reject(e); });
|
|
138
|
+
timer = setTimeout(() => this.fail(new Error("waitForHandshake timed out")), timeoutMs);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
stop() {
|
|
142
|
+
this.fail(new Error("traffic server stopped"));
|
|
143
|
+
return new Promise((resolve, reject) => {
|
|
144
|
+
this.server.close((err) => { if (err)
|
|
145
|
+
reject(err);
|
|
146
|
+
else
|
|
147
|
+
resolve(); });
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function narrowServerName(value) {
|
|
152
|
+
return typeof value === "string" ? value : null;
|
|
153
|
+
}
|
|
154
|
+
function derToPem(der, label) {
|
|
155
|
+
const b64 = Buffer.from(der).toString("base64");
|
|
156
|
+
const lines = [`-----BEGIN ${label}-----`];
|
|
157
|
+
for (let i = 0; i < b64.length; i += 64)
|
|
158
|
+
lines.push(b64.slice(i, i + 64));
|
|
159
|
+
lines.push(`-----END ${label}-----`);
|
|
160
|
+
return lines.join("\n");
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=traffic-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traffic-server.js","sourceRoot":"","sources":["../../src/e2e/traffic-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"golden.d.ts","sourceRoot":"","sources":["../../src/golden/golden.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"golden.d.ts","sourceRoot":"","sources":["../../src/golden/golden.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACR,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,0BAA0B,EAC1B,aAAa,EACb,eAAe,EAClB,MAAM,aAAa,CAAC;AAkCrB;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAgD7E;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,eAAe,EAAE,CA+BjG;AAYD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,aAAa,CA2B9D;AAoBD,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,CAUjE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,gBAAgB,CAa/F;AAED;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAC1C,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,SAAS,GACrB,0BAA0B,CAe5B"}
|
package/dist/golden/golden.js
CHANGED
|
@@ -11,13 +11,14 @@
|
|
|
11
11
|
* (e.g. `chrome-140/tls/client_hello`) that maps directly onto the
|
|
12
12
|
* `captures/<profile>/<protocol>/<record>.{bin,meta.json}` layout.
|
|
13
13
|
*/
|
|
14
|
-
import { readFileSync } from "node:fs";
|
|
15
|
-
import { join } from "node:path";
|
|
16
14
|
import { compareBytes, compareBytesWithIgnore } from "../utils.js";
|
|
17
15
|
import { GoldenMismatchError, TestingError } from "../errors.js";
|
|
16
|
+
import { createFileSystem, createPath } from "../node-provider.js";
|
|
17
|
+
const fileSystem = createFileSystem();
|
|
18
|
+
const path = createPath();
|
|
18
19
|
const here = import.meta.dirname;
|
|
19
20
|
// src/golden -> package root -> captures/
|
|
20
|
-
const capturesDir = join(here, "..", "..", "captures");
|
|
21
|
+
const capturesDir = path.join(here, "..", "..", "captures");
|
|
21
22
|
/** Parse a CaptureId of the form `${profile}/${protocol}/${record}`. */
|
|
22
23
|
function parseCaptureId(captureId) {
|
|
23
24
|
const EXPECTED_FORMAT = `\${profile}/\${protocol}/\${record}`;
|
|
@@ -109,7 +110,7 @@ export function parseRandomizedFields(raw, captureId) {
|
|
|
109
110
|
/** Resolve a CaptureId to its on-disk `.bin` + `.meta.json` paths. */
|
|
110
111
|
function resolveCapturePaths(captureId) {
|
|
111
112
|
const { profile, protocol, record } = parseCaptureId(captureId);
|
|
112
|
-
const base = join(capturesDir, profile, protocol, record);
|
|
113
|
+
const base = path.join(capturesDir, profile, protocol, record);
|
|
113
114
|
return { binPath: `${base}.bin`, metaPath: `${base}.meta.json` };
|
|
114
115
|
}
|
|
115
116
|
/**
|
|
@@ -124,7 +125,7 @@ export function loadGolden(captureId) {
|
|
|
124
125
|
const { binPath, metaPath } = resolveCapturePaths(captureId);
|
|
125
126
|
let bytes;
|
|
126
127
|
try {
|
|
127
|
-
bytes = readFileSync(binPath);
|
|
128
|
+
bytes = fileSystem.readFileSync(binPath);
|
|
128
129
|
}
|
|
129
130
|
catch (e) {
|
|
130
131
|
const cause = e instanceof Error ? e : new Error(String(e));
|
|
@@ -132,7 +133,7 @@ export function loadGolden(captureId) {
|
|
|
132
133
|
}
|
|
133
134
|
let meta;
|
|
134
135
|
try {
|
|
135
|
-
meta = JSON.parse(
|
|
136
|
+
meta = JSON.parse(fileSystem.readFileText(metaPath));
|
|
136
137
|
}
|
|
137
138
|
catch (e) {
|
|
138
139
|
const cause = e instanceof Error ? e : new Error(String(e));
|
|
@@ -169,7 +170,7 @@ export function loadCaptureMeta(captureId) {
|
|
|
169
170
|
const { metaPath } = resolveCapturePaths(captureId);
|
|
170
171
|
let raw;
|
|
171
172
|
try {
|
|
172
|
-
raw = JSON.parse(
|
|
173
|
+
raw = JSON.parse(fileSystem.readFileText(metaPath));
|
|
173
174
|
}
|
|
174
175
|
catch (e) {
|
|
175
176
|
const cause = e instanceof Error ? e : new Error(String(e));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"golden.js","sourceRoot":"","sources":["../../src/golden/golden.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"golden.js","sourceRoot":"","sources":["../../src/golden/golden.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -36,6 +36,10 @@ export { TlsSinkServer } from "./e2e/sink-server.js";
|
|
|
36
36
|
export type { ClientHelloCapture, HandshakeResult } from "./e2e/sink-server.js";
|
|
37
37
|
export { generateSelfSignedCert } from "./e2e/cert-gen.js";
|
|
38
38
|
export type { SelfSignedCert } from "./e2e/cert-gen.js";
|
|
39
|
+
export { TrafficServer } from "./e2e/traffic-server.js";
|
|
40
|
+
export type { TrafficResult } from "./e2e/traffic-server.js";
|
|
39
41
|
export { parseClientHelloWire, peekRecordHeader, findExtension, parseSniHostname, parseAlpnProtocols, parseSupportedVersions, decodeSni, decodeAlpn, decodeSupportedVersions, isGrease, nonGreaseCipherSuites, nonGreaseExtensionTypes, EXT, GREASE_SENTINELS, ClientHelloParseError, } from "./e2e/parse-clienthello.js";
|
|
40
42
|
export type { ParsedClientHello, ParsedExtension, ExtensionTypeValue, } from "./e2e/parse-clienthello.js";
|
|
43
|
+
export { createFileSystem, createPath, NodeFileSystemProvider, NodePathProvider } from "./node-provider.js";
|
|
44
|
+
export type { FileSystemProvider, PathProvider } from "./provider.js";
|
|
41
45
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhE,YAAY,EACR,UAAU,EACV,SAAS,EACT,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG7E,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3F,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAGrE;AAGD,OAAO,EACH,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACR,sBAAsB,EACtB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,GACxB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACjG,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,OAAO,EACH,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,mBAAmB,GACtB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAOnF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOxD,OAAO,EACH,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,SAAS,EACT,UAAU,EACV,uBAAuB,EACvB,QAAQ,EACR,qBAAqB,EACrB,uBAAuB,EACvB,GAAG,EACH,gBAAgB,EAChB,qBAAqB,GACxB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACR,iBAAiB,EACjB,eAAe,EACf,kBAAkB,GACrB,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhE,YAAY,EACR,UAAU,EACV,SAAS,EACT,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG7E,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3F,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAGrE;AAGD,OAAO,EACH,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACR,sBAAsB,EACtB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,GACxB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACjG,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,OAAO,EACH,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,mBAAmB,GACtB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAOnF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAO7D,OAAO,EACH,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,SAAS,EACT,UAAU,EACV,uBAAuB,EACvB,QAAQ,EACR,qBAAqB,EACrB,uBAAuB,EACvB,GAAG,EACH,gBAAgB,EAChB,qBAAqB,GACxB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACR,iBAAiB,EACjB,eAAe,EACf,kBAAkB,GACrB,MAAM,4BAA4B,CAAC;AAKpC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5G,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -41,10 +41,20 @@ export { nodeCrypto, nodeDns, nodeZlib, nodeHttp, toError, compareBytesOutcome,
|
|
|
41
41
|
export { TlsSinkServer } from "./e2e/sink-server.js";
|
|
42
42
|
// Self-signed ECDSA P-256 certificate generator (runtime, no openssl).
|
|
43
43
|
export { generateSelfSignedCert } from "./e2e/cert-gen.js";
|
|
44
|
+
// E2E HTTPS traffic server — local TLS termination oracle for the traffic
|
|
45
|
+
// gate. Spins up a real HTTPS server with a throwaway self-signed cert and
|
|
46
|
+
// returns a known body + marker header so a client test can assert the full
|
|
47
|
+
// request path (TCP → TLS → HTTP) worked. Reusable by any package that wants
|
|
48
|
+
// to verify its HTTP stack against a real local server.
|
|
49
|
+
export { TrafficServer } from "./e2e/traffic-server.js";
|
|
44
50
|
// Minimal ClientHello wire parser — structural assertions for the e2e matrix.
|
|
45
51
|
// (Distinct from the JA3 `parseClientHello` re-exported from fingerprint.)
|
|
46
52
|
// Note: `parseClientHello` is intentionally NOT re-exported here to avoid
|
|
47
53
|
// colliding with the JA3 `parseClientHello` from ./fingerprint/index.js.
|
|
48
54
|
// Consumers of the e2e parser import it directly from ./e2e/parse-clienthello.js.
|
|
49
55
|
export { parseClientHelloWire, peekRecordHeader, findExtension, parseSniHostname, parseAlpnProtocols, parseSupportedVersions, decodeSni, decodeAlpn, decodeSupportedVersions, isGrease, nonGreaseCipherSuites, nonGreaseExtensionTypes, EXT, GREASE_SENTINELS, ClientHelloParseError, } from "./e2e/parse-clienthello.js";
|
|
56
|
+
// Provider interfaces + Node-backed factories (Rule 21 — runtime independence).
|
|
57
|
+
// Higher layers depend on the interfaces; the factories return the production
|
|
58
|
+
// defaults. Tests inject fakes through the interfaces.
|
|
59
|
+
export { createFileSystem, createPath, NodeFileSystemProvider, NodePathProvider } from "./node-provider.js";
|
|
50
60
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAchE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7E,sEAAsE;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AAEpD,gEAAgE;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAIpD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAC9B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,QAAQ,CAAC;AAC7B,CAAC;AAED,wCAAwC;AACxC,OAAO,EACH,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,0BAA0B,CAAC;AASlC,iDAAiD;AACjD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAGjG,+EAA+E;AAC/E,gFAAgF;AAChF,OAAO,EACH,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,mBAAmB,GACtB,MAAM,+BAA+B,CAAC;AAGvC,iEAAiE;AACjE,yEAAyE;AACzE,8EAA8E;AAC9E,yEAAyE;AACzE,uDAAuD;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,uEAAuE;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,8EAA8E;AAC9E,2EAA2E;AAC3E,0EAA0E;AAC1E,yEAAyE;AACzE,kFAAkF;AAClF,OAAO,EACH,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,SAAS,EACT,UAAU,EACV,uBAAuB,EACvB,QAAQ,EACR,qBAAqB,EACrB,uBAAuB,EACvB,GAAG,EACH,gBAAgB,EAChB,qBAAqB,GACxB,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAchE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7E,sEAAsE;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AAEpD,gEAAgE;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAIpD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAC9B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,QAAQ,CAAC;AAC7B,CAAC;AAED,wCAAwC;AACxC,OAAO,EACH,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,0BAA0B,CAAC;AASlC,iDAAiD;AACjD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAGjG,+EAA+E;AAC/E,gFAAgF;AAChF,OAAO,EACH,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,mBAAmB,GACtB,MAAM,+BAA+B,CAAC;AAGvC,iEAAiE;AACjE,yEAAyE;AACzE,8EAA8E;AAC9E,yEAAyE;AACzE,uDAAuD;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,uEAAuE;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,0EAA0E;AAC1E,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,wDAAwD;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,8EAA8E;AAC9E,2EAA2E;AAC3E,0EAA0E;AAC1E,yEAAyE;AACzE,kFAAkF;AAClF,OAAO,EACH,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,SAAS,EACT,UAAU,EACV,uBAAuB,EACvB,QAAQ,EACR,qBAAqB,EACrB,uBAAuB,EACvB,GAAG,EACH,gBAAgB,EAChB,qBAAqB,GACxB,MAAM,4BAA4B,CAAC;AAOpC,gFAAgF;AAChF,8EAA8E;AAC9E,uDAAuD;AACvD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js-backed implementations of the testing package's provider interfaces.
|
|
3
|
+
*
|
|
4
|
+
* This is the ONLY module in @browsercore/testing that may import `node:fs`
|
|
5
|
+
* and `node:path` directly — the provider boundary that isolates the runtime
|
|
6
|
+
* per Rule 21 (CODING_STANDARDS.md "Runtime independence & dependency
|
|
7
|
+
* injection"). Every other module depends on the
|
|
8
|
+
* {@link FileSystemProvider}/{@link PathProvider} interfaces and never touches
|
|
9
|
+
* the runtime built-ins.
|
|
10
|
+
*
|
|
11
|
+
* Higher layers call the provider methods here, never `node:fs`/`node:path`
|
|
12
|
+
* directly, so the backend stays replaceable. Factories return a fresh
|
|
13
|
+
* instance so consumers can call `createFileSystem().readFileSync(...)` without
|
|
14
|
+
* threading a provider through every constructor.
|
|
15
|
+
*/
|
|
16
|
+
import type { FileSystemProvider, PathProvider } from "./provider.js";
|
|
17
|
+
/**
|
|
18
|
+
* `node:fs`-backed implementation of {@link FileSystemProvider}.
|
|
19
|
+
*
|
|
20
|
+
* Production code calls the factory (`createFileSystem()`) — it never
|
|
21
|
+
* constructs this class directly. Tests inject a fake provider through the
|
|
22
|
+
* `FileSystemProvider` interface.
|
|
23
|
+
*/
|
|
24
|
+
export declare class NodeFileSystemProvider implements FileSystemProvider {
|
|
25
|
+
readFileSync(path: string): Uint8Array;
|
|
26
|
+
readFileText(path: string): string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* `node:path`-backed implementation of {@link PathProvider}.
|
|
30
|
+
*
|
|
31
|
+
* Production code calls the factory (`createPath()`) — it never constructs
|
|
32
|
+
* this class directly. Tests inject a fake provider through the
|
|
33
|
+
* `PathProvider` interface.
|
|
34
|
+
*/
|
|
35
|
+
export declare class NodePathProvider implements PathProvider {
|
|
36
|
+
join(...parts: string[]): string;
|
|
37
|
+
}
|
|
38
|
+
/** Factory that returns the default {@link FileSystemProvider}. */
|
|
39
|
+
export declare function createFileSystem(): FileSystemProvider;
|
|
40
|
+
/** Factory that returns the default {@link PathProvider}. */
|
|
41
|
+
export declare function createPath(): PathProvider;
|
|
42
|
+
//# sourceMappingURL=node-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-provider.d.ts","sourceRoot":"","sources":["../src/node-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEtE;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,kBAAkB;IACtD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAE5C;IAEM,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;CACJ;AAED;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IAC1C,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtC;CACJ;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,IAAI,kBAAkB,CAErD;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,IAAI,YAAY,CAEzC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js-backed implementations of the testing package's provider interfaces.
|
|
3
|
+
*
|
|
4
|
+
* This is the ONLY module in @browsercore/testing that may import `node:fs`
|
|
5
|
+
* and `node:path` directly — the provider boundary that isolates the runtime
|
|
6
|
+
* per Rule 21 (CODING_STANDARDS.md "Runtime independence & dependency
|
|
7
|
+
* injection"). Every other module depends on the
|
|
8
|
+
* {@link FileSystemProvider}/{@link PathProvider} interfaces and never touches
|
|
9
|
+
* the runtime built-ins.
|
|
10
|
+
*
|
|
11
|
+
* Higher layers call the provider methods here, never `node:fs`/`node:path`
|
|
12
|
+
* directly, so the backend stays replaceable. Factories return a fresh
|
|
13
|
+
* instance so consumers can call `createFileSystem().readFileSync(...)` without
|
|
14
|
+
* threading a provider through every constructor.
|
|
15
|
+
*/
|
|
16
|
+
import { readFileSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
/**
|
|
19
|
+
* `node:fs`-backed implementation of {@link FileSystemProvider}.
|
|
20
|
+
*
|
|
21
|
+
* Production code calls the factory (`createFileSystem()`) — it never
|
|
22
|
+
* constructs this class directly. Tests inject a fake provider through the
|
|
23
|
+
* `FileSystemProvider` interface.
|
|
24
|
+
*/
|
|
25
|
+
export class NodeFileSystemProvider {
|
|
26
|
+
readFileSync(path) {
|
|
27
|
+
return readFileSync(path);
|
|
28
|
+
}
|
|
29
|
+
readFileText(path) {
|
|
30
|
+
return readFileSync(path, "utf8");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* `node:path`-backed implementation of {@link PathProvider}.
|
|
35
|
+
*
|
|
36
|
+
* Production code calls the factory (`createPath()`) — it never constructs
|
|
37
|
+
* this class directly. Tests inject a fake provider through the
|
|
38
|
+
* `PathProvider` interface.
|
|
39
|
+
*/
|
|
40
|
+
export class NodePathProvider {
|
|
41
|
+
join(...parts) {
|
|
42
|
+
return join(...parts);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Factory that returns the default {@link FileSystemProvider}. */
|
|
46
|
+
export function createFileSystem() {
|
|
47
|
+
return new NodeFileSystemProvider();
|
|
48
|
+
}
|
|
49
|
+
/** Factory that returns the default {@link PathProvider}. */
|
|
50
|
+
export function createPath() {
|
|
51
|
+
return new NodePathProvider();
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=node-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-provider.js","sourceRoot":"","sources":["../src/node-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;;;;;GAMG;AACH,MAAM,OAAO,sBAAsB;IACxB,YAAY,CAAC,IAAY;QAC5B,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAEM,YAAY,CAAC,IAAY;QAC5B,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;CACJ;AAED;;;;;;GAMG;AACH,MAAM,OAAO,gBAAgB;IAClB,IAAI,CAAC,GAAG,KAAe;QAC1B,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,CAAC;CACJ;AAED,mEAAmE;AACnE,MAAM,UAAU,gBAAgB;IAC5B,OAAO,IAAI,sBAAsB,EAAE,CAAC;AACxC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,UAAU;IACtB,OAAO,IAAI,gBAAgB,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider interfaces for the @browsercore/testing package.
|
|
3
|
+
*
|
|
4
|
+
* Protocol/test infrastructure layers isolate runtime-specific dependencies
|
|
5
|
+
* (node:fs, node:path) behind these interfaces per Rule 21
|
|
6
|
+
* (CODING_STANDARDS.md "Runtime independence & dependency injection").
|
|
7
|
+
* Higher layers depend on the interfaces — never on a concrete provider — so
|
|
8
|
+
* the backend is replaceable (in-memory fake for tests, Deno/Bun, ...).
|
|
9
|
+
*
|
|
10
|
+
* @see {@link NodeFileSystemProvider} for the default `node:fs` backend.
|
|
11
|
+
* @see {@link NodePathProvider} for the default `node:path` backend.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* File-system read operations.
|
|
15
|
+
*
|
|
16
|
+
* Higher layers depend on this interface, never on `node:fs` directly, so the
|
|
17
|
+
* backend is replaceable. All methods take and return `Uint8Array` or
|
|
18
|
+
* `string` — never Node `Buffer` — so the interface is portable across
|
|
19
|
+
* runtimes.
|
|
20
|
+
*/
|
|
21
|
+
export interface FileSystemProvider {
|
|
22
|
+
/**
|
|
23
|
+
* Read a file's raw bytes.
|
|
24
|
+
*
|
|
25
|
+
* @param path Absolute or relative file path.
|
|
26
|
+
* @returns The file's contents as raw bytes.
|
|
27
|
+
*/
|
|
28
|
+
readFileSync(path: string): Uint8Array;
|
|
29
|
+
/**
|
|
30
|
+
* Read a file's text content (utf8).
|
|
31
|
+
*
|
|
32
|
+
* @param path Absolute or relative file path.
|
|
33
|
+
* @returns The file's contents as a utf8 string.
|
|
34
|
+
*/
|
|
35
|
+
readFileText(path: string): string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Path manipulation operations.
|
|
39
|
+
*
|
|
40
|
+
* Higher layers depend on this interface, never on `node:path` directly, so
|
|
41
|
+
* path resolution is replaceable and testable against synthetic layouts.
|
|
42
|
+
*/
|
|
43
|
+
export interface PathProvider {
|
|
44
|
+
/**
|
|
45
|
+
* Join path segments into a single path.
|
|
46
|
+
*
|
|
47
|
+
* @param parts Path segments to join.
|
|
48
|
+
* @returns The joined path.
|
|
49
|
+
*/
|
|
50
|
+
join(...parts: string[]): string;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAEvC;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACtC;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IACzB;;;;;OAKG;IACH,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;CACpC"}
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider interfaces for the @browsercore/testing package.
|
|
3
|
+
*
|
|
4
|
+
* Protocol/test infrastructure layers isolate runtime-specific dependencies
|
|
5
|
+
* (node:fs, node:path) behind these interfaces per Rule 21
|
|
6
|
+
* (CODING_STANDARDS.md "Runtime independence & dependency injection").
|
|
7
|
+
* Higher layers depend on the interfaces — never on a concrete provider — so
|
|
8
|
+
* the backend is replaceable (in-memory fake for tests, Deno/Bun, ...).
|
|
9
|
+
*
|
|
10
|
+
* @see {@link NodeFileSystemProvider} for the default `node:fs` backend.
|
|
11
|
+
* @see {@link NodePathProvider} for the default `node:path` backend.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-provider.d.ts","sourceRoot":"","sources":["../../src/reference/browser-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-provider.d.ts","sourceRoot":"","sources":["../../src/reference/browser-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAOlG,oEAAoE;AACpE,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;;GAMG;AACH,qBAAa,0BAA2B,YAAW,iBAAiB;IAChE,SAAgB,IAAI,EAAE,qBAAqB,CAAqC;IAChF,SAAgB,WAAW,EAAE,MAAM,CAAC;IAEpC,YAAY,OAAO,CAAC,EAAE,kBAAkB,EAEvC;IAED,iBAAiB,IAAI,SAAS,EAAE,CAM/B;IAEK,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgBtE;IAEK,WAAW,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAQ1D;CACJ"}
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { ReferenceError } from "./reference-errors.js";
|
|
10
10
|
import { fingerprintFromTlsCapture, profileToSource } from "./dump.js";
|
|
11
|
+
import { createPath } from "../node-provider.js";
|
|
12
|
+
const path = createPath();
|
|
11
13
|
/**
|
|
12
14
|
* SECONDARY provider — loads pre-recorded captures from the `captures/` dir.
|
|
13
15
|
*
|
|
@@ -53,8 +55,7 @@ export class RealBrowserCaptureProvider {
|
|
|
53
55
|
}
|
|
54
56
|
// Default captures dir resolved from this module's location. Computed at module
|
|
55
57
|
// load (not per-instance) since import.meta.dirname is static.
|
|
56
|
-
import { join } from "node:path";
|
|
57
58
|
const here = import.meta.dirname;
|
|
58
|
-
const packageRoot = join(here, "..", "..");
|
|
59
|
-
const defaultCapturesDir = join(packageRoot, "captures");
|
|
59
|
+
const packageRoot = path.join(here, "..", "..");
|
|
60
|
+
const defaultCapturesDir = path.join(packageRoot, "captures");
|
|
60
61
|
//# sourceMappingURL=browser-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-provider.js","sourceRoot":"","sources":["../../src/reference/browser-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-provider.js","sourceRoot":"","sources":["../../src/reference/browser-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;AAS1B;;;;;;GAMG;AACH,MAAM,OAAO,0BAA0B;IACnB,IAAI,GAA0B,EAAE,IAAI,EAAE,cAAc,EAAW,CAAC;IAChE,WAAW,CAAS;IAEpC,YAAY,OAA4B;QACpC,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,kBAAkB,CAAC;IAClE,CAAC;IAED,iBAAiB;QACb,uEAAuE;QACvE,OAAO;YACH,YAAyB;YACzB,aAA0B;SAC7B,CAAC;IACN,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAkB,EAAE,IAAY;QAC1C,KAAK,IAAI,CAAC;QACV,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QACxE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,cAAc,CACpB,uCAAuC,MAAM,CAAC,OAAO,CAAC,EAAE,CAC3D,CAAC;QACN,CAAC;QACD,OAAO;YACH,EAAE,EAAE,GAAG,OAAO,mBAA0C;YACxD,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC;YAChC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;YAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW;SACtC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAkB;QAChC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;QACnE,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,cAAc,CACpB,iDAAiD,OAAO,CAAC,QAAQ,EAAE,CACtE,CAAC;QACN,CAAC;QACD,OAAO,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;CACJ;AAED,gFAAgF;AAChF,+DAA+D;AAC/D,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC;AACjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAChD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Node-backed CryptoProvider double.
|
|
3
|
+
*
|
|
4
|
+
* @browsercore/crypto 0.2.2 exports only types, errors, and utilities — the
|
|
5
|
+
* runtime NodeCryptoProvider implementation lives in
|
|
6
|
+
* `browsersmith/src/platform/crypto/node/`. This repo (Layer 4) cannot depend
|
|
7
|
+
* on browsersmith (Layer 5), so we provide a local Node-backed implementation
|
|
8
|
+
* of the `CryptoProvider` contract for tests and e2e harnesses.
|
|
9
|
+
*
|
|
10
|
+
* This double mirrors the production NodeCryptoProvider behavior:
|
|
11
|
+
* - Hashing via node:crypto (sha256, sha384)
|
|
12
|
+
* - HKDF via node:crypto.hkdfSync
|
|
13
|
+
* - HMAC via node:crypto.createHmac
|
|
14
|
+
* - AEAD via node:crypto.createCipheriv/createDecipheriv (GCM, CCM, ChaCha20)
|
|
15
|
+
* - X25519 via NobleX25519Backend (pure JS, no native binding)
|
|
16
|
+
* - ECDH via node:crypto.ECDH
|
|
17
|
+
* - Signatures via node:crypto.createVerify
|
|
18
|
+
* - Random bytes via node:crypto.randomBytes
|
|
19
|
+
*
|
|
20
|
+
* The production provider uses the same primitives — this double exists only
|
|
21
|
+
* because the package boundary moved the implementation to a higher layer.
|
|
22
|
+
*/
|
|
23
|
+
import type { CryptoProvider } from "@browsercore/crypto";
|
|
24
|
+
/**
|
|
25
|
+
* Node-backed CryptoProvider implementation.
|
|
26
|
+
*
|
|
27
|
+
* Satisfies the full `CryptoProvider` contract using node:crypto + noble-curves.
|
|
28
|
+
* Safe for tests and e2e harnesses — never imported by production protocol code.
|
|
29
|
+
*/
|
|
30
|
+
export declare const nodeCryptoProvider: CryptoProvider;
|
|
31
|
+
//# sourceMappingURL=node-crypto-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-crypto-provider.d.ts","sourceRoot":"","sources":["../../src/reference/node-crypto-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAYH,OAAO,KAAK,EACR,cAAc,EAKjB,MAAM,qBAAqB,CAAC;AAgC7B;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,cAsJhC,CAAC"}
|