portprism 2.0.1 → 2.0.3
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/dist/__tests__/inspector.test.d.ts +2 -0
- package/dist/__tests__/inspector.test.d.ts.map +1 -0
- package/dist/__tests__/inspector.test.js +80 -0
- package/dist/__tests__/inspector.test.js.map +1 -0
- package/dist/index.js +7912 -4651
- package/dist/inspector.d.ts +58 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/inspector.js +328 -0
- package/dist/inspector.js.map +1 -0
- package/package.json +5 -3
- package/README.md +0 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/inspector.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, it, before, after } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { Inspector } from "../inspector.js";
|
|
4
|
+
describe("Inspector", () => {
|
|
5
|
+
let insp;
|
|
6
|
+
let base;
|
|
7
|
+
before(async () => {
|
|
8
|
+
insp = new Inspector();
|
|
9
|
+
const url = await insp.start(0); // ephemeral port
|
|
10
|
+
assert.ok(url, "inspector should bind an ephemeral port");
|
|
11
|
+
base = url;
|
|
12
|
+
});
|
|
13
|
+
after(() => insp.stop());
|
|
14
|
+
const b64 = (s) => Buffer.from(s).toString("base64");
|
|
15
|
+
it("records a request, splits the query, and merges the response phase", async () => {
|
|
16
|
+
insp.record({
|
|
17
|
+
phase: "request",
|
|
18
|
+
id: "req-1",
|
|
19
|
+
ts: Date.now(),
|
|
20
|
+
method: "POST",
|
|
21
|
+
path: "/api/items?q=hello&limit=5",
|
|
22
|
+
headers: { "content-type": "application/json" },
|
|
23
|
+
body: b64('{"hello":"world"}'),
|
|
24
|
+
});
|
|
25
|
+
insp.record({
|
|
26
|
+
phase: "response",
|
|
27
|
+
id: "req-1",
|
|
28
|
+
status: 201,
|
|
29
|
+
headers: { "content-type": "application/json" },
|
|
30
|
+
body: b64('{"ok":true}'),
|
|
31
|
+
durationMs: 42,
|
|
32
|
+
});
|
|
33
|
+
const detail = (await (await fetch(`${base}/__pp/requests/req-1`)).json());
|
|
34
|
+
assert.equal(detail.method, "POST");
|
|
35
|
+
assert.equal(detail.path, "/api/items", "query must be split off the path");
|
|
36
|
+
assert.deepEqual(detail.query, { q: "hello", limit: "5" });
|
|
37
|
+
assert.equal(detail.reqBody.text, '{"hello":"world"}', "text body decoded, not base64");
|
|
38
|
+
assert.equal(detail.reqBody.binary, false);
|
|
39
|
+
assert.equal(detail.status, 201);
|
|
40
|
+
assert.equal(detail.resBody?.text, '{"ok":true}');
|
|
41
|
+
assert.equal(detail.durationMs, 42);
|
|
42
|
+
assert.equal(detail.pending, false, "record is no longer pending after response");
|
|
43
|
+
});
|
|
44
|
+
it("flags binary payloads and keeps them base64", async () => {
|
|
45
|
+
insp.record({
|
|
46
|
+
phase: "request",
|
|
47
|
+
id: "req-bin",
|
|
48
|
+
method: "PUT",
|
|
49
|
+
path: "/upload",
|
|
50
|
+
headers: { "content-type": "application/octet-stream" },
|
|
51
|
+
body: Buffer.from([0x00, 0x01, 0x02, 0xff]).toString("base64"),
|
|
52
|
+
});
|
|
53
|
+
const detail = (await (await fetch(`${base}/__pp/requests/req-bin`)).json());
|
|
54
|
+
assert.equal(detail.reqBody.binary, true);
|
|
55
|
+
assert.equal(detail.reqBody.text, Buffer.from([0x00, 0x01, 0x02, 0xff]).toString("base64"));
|
|
56
|
+
});
|
|
57
|
+
it("caps the ledger at 200 records (ring buffer)", async () => {
|
|
58
|
+
for (let i = 0; i < 250; i++) {
|
|
59
|
+
insp.record({
|
|
60
|
+
phase: "request",
|
|
61
|
+
id: `bulk-${i}`,
|
|
62
|
+
method: "GET",
|
|
63
|
+
path: `/x/${i}`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const list = (await (await fetch(`${base}/__pp/requests`)).json());
|
|
67
|
+
assert.ok(list.length <= 200, `expected <=200 records, got ${list.length}`);
|
|
68
|
+
// Oldest bulk entry should have been evicted.
|
|
69
|
+
const gone = await fetch(`${base}/__pp/requests/bulk-0`);
|
|
70
|
+
assert.equal(gone.status, 404, "oldest record should be evicted");
|
|
71
|
+
});
|
|
72
|
+
it("serves the web UI and returns 404 for unknown ids", async () => {
|
|
73
|
+
const html = await fetch(`${base}/`);
|
|
74
|
+
assert.equal(html.status, 200);
|
|
75
|
+
assert.match(await html.text(), /PortPrism/);
|
|
76
|
+
const missing = await fetch(`${base}/__pp/requests/does-not-exist`);
|
|
77
|
+
assert.equal(missing.status, 404);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=inspector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector.test.js","sourceRoot":"","sources":["../../src/__tests__/inspector.test.ts"],"names":[],"mappings":"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"}
|