procsi 0.2.6
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/LICENSE +665 -0
- package/README.md +587 -0
- package/dist/cli/commands/clear.d.ts +3 -0
- package/dist/cli/commands/clear.d.ts.map +1 -0
- package/dist/cli/commands/clear.js +30 -0
- package/dist/cli/commands/clear.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +3 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +59 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/debug-dump.d.ts +27 -0
- package/dist/cli/commands/debug-dump.d.ts.map +1 -0
- package/dist/cli/commands/debug-dump.js +102 -0
- package/dist/cli/commands/debug-dump.js.map +1 -0
- package/dist/cli/commands/helpers.d.ts +18 -0
- package/dist/cli/commands/helpers.d.ts.map +1 -0
- package/dist/cli/commands/helpers.js +34 -0
- package/dist/cli/commands/helpers.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +28 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/intercept.d.ts +9 -0
- package/dist/cli/commands/intercept.d.ts.map +1 -0
- package/dist/cli/commands/intercept.js +121 -0
- package/dist/cli/commands/intercept.js.map +1 -0
- package/dist/cli/commands/interceptors.d.ts +3 -0
- package/dist/cli/commands/interceptors.d.ts.map +1 -0
- package/dist/cli/commands/interceptors.js +163 -0
- package/dist/cli/commands/interceptors.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +3 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +24 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/off.d.ts +8 -0
- package/dist/cli/commands/off.d.ts.map +1 -0
- package/dist/cli/commands/off.js +34 -0
- package/dist/cli/commands/off.js.map +1 -0
- package/dist/cli/commands/on.d.ts +9 -0
- package/dist/cli/commands/on.d.ts.map +1 -0
- package/dist/cli/commands/on.js +121 -0
- package/dist/cli/commands/on.js.map +1 -0
- package/dist/cli/commands/project.d.ts +3 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +15 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/restart.d.ts +3 -0
- package/dist/cli/commands/restart.d.ts.map +1 -0
- package/dist/cli/commands/restart.js +35 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +66 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +24 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/tui.d.ts +3 -0
- package/dist/cli/commands/tui.d.ts.map +1 -0
- package/dist/cli/commands/tui.js +36 -0
- package/dist/cli/commands/tui.js.map +1 -0
- package/dist/cli/commands/vars.d.ts +36 -0
- package/dist/cli/commands/vars.d.ts.map +1 -0
- package/dist/cli/commands/vars.js +207 -0
- package/dist/cli/commands/vars.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +37 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/tui/App.d.ts +15 -0
- package/dist/cli/tui/App.d.ts.map +1 -0
- package/dist/cli/tui/App.js +544 -0
- package/dist/cli/tui/App.js.map +1 -0
- package/dist/cli/tui/components/AccordionContent.d.ts +28 -0
- package/dist/cli/tui/components/AccordionContent.d.ts.map +1 -0
- package/dist/cli/tui/components/AccordionContent.js +87 -0
- package/dist/cli/tui/components/AccordionContent.js.map +1 -0
- package/dist/cli/tui/components/AccordionPanel.d.ts +38 -0
- package/dist/cli/tui/components/AccordionPanel.d.ts.map +1 -0
- package/dist/cli/tui/components/AccordionPanel.js +110 -0
- package/dist/cli/tui/components/AccordionPanel.js.map +1 -0
- package/dist/cli/tui/components/AccordionSection.d.ts +32 -0
- package/dist/cli/tui/components/AccordionSection.d.ts.map +1 -0
- package/dist/cli/tui/components/AccordionSection.js +41 -0
- package/dist/cli/tui/components/AccordionSection.js.map +1 -0
- package/dist/cli/tui/components/BodyView.d.ts +14 -0
- package/dist/cli/tui/components/BodyView.d.ts.map +1 -0
- package/dist/cli/tui/components/BodyView.js +39 -0
- package/dist/cli/tui/components/BodyView.js.map +1 -0
- package/dist/cli/tui/components/ExportModal.d.ts +34 -0
- package/dist/cli/tui/components/ExportModal.d.ts.map +1 -0
- package/dist/cli/tui/components/ExportModal.js +109 -0
- package/dist/cli/tui/components/ExportModal.js.map +1 -0
- package/dist/cli/tui/components/FilterBar.d.ts +21 -0
- package/dist/cli/tui/components/FilterBar.d.ts.map +1 -0
- package/dist/cli/tui/components/FilterBar.js +155 -0
- package/dist/cli/tui/components/FilterBar.js.map +1 -0
- package/dist/cli/tui/components/HeadersView.d.ts +13 -0
- package/dist/cli/tui/components/HeadersView.d.ts.map +1 -0
- package/dist/cli/tui/components/HeadersView.js +8 -0
- package/dist/cli/tui/components/HeadersView.js.map +1 -0
- package/dist/cli/tui/components/HelpModal.d.ts +13 -0
- package/dist/cli/tui/components/HelpModal.d.ts.map +1 -0
- package/dist/cli/tui/components/HelpModal.js +78 -0
- package/dist/cli/tui/components/HelpModal.js.map +1 -0
- package/dist/cli/tui/components/HintContent.d.ts +25 -0
- package/dist/cli/tui/components/HintContent.d.ts.map +1 -0
- package/dist/cli/tui/components/HintContent.js +44 -0
- package/dist/cli/tui/components/HintContent.js.map +1 -0
- package/dist/cli/tui/components/InfoModal.d.ts +15 -0
- package/dist/cli/tui/components/InfoModal.d.ts.map +1 -0
- package/dist/cli/tui/components/InfoModal.js +17 -0
- package/dist/cli/tui/components/InfoModal.js.map +1 -0
- package/dist/cli/tui/components/JsonExplorerModal.d.ts +24 -0
- package/dist/cli/tui/components/JsonExplorerModal.d.ts.map +1 -0
- package/dist/cli/tui/components/JsonExplorerModal.js +311 -0
- package/dist/cli/tui/components/JsonExplorerModal.js.map +1 -0
- package/dist/cli/tui/components/Modal.d.ts +26 -0
- package/dist/cli/tui/components/Modal.d.ts.map +1 -0
- package/dist/cli/tui/components/Modal.js +15 -0
- package/dist/cli/tui/components/Modal.js.map +1 -0
- package/dist/cli/tui/components/Panel.d.ts +19 -0
- package/dist/cli/tui/components/Panel.d.ts.map +1 -0
- package/dist/cli/tui/components/Panel.js +37 -0
- package/dist/cli/tui/components/Panel.js.map +1 -0
- package/dist/cli/tui/components/RequestDetails.d.ts +16 -0
- package/dist/cli/tui/components/RequestDetails.d.ts.map +1 -0
- package/dist/cli/tui/components/RequestDetails.js +23 -0
- package/dist/cli/tui/components/RequestDetails.js.map +1 -0
- package/dist/cli/tui/components/RequestList.d.ts +21 -0
- package/dist/cli/tui/components/RequestList.d.ts.map +1 -0
- package/dist/cli/tui/components/RequestList.js +30 -0
- package/dist/cli/tui/components/RequestList.js.map +1 -0
- package/dist/cli/tui/components/RequestListItem.d.ts +36 -0
- package/dist/cli/tui/components/RequestListItem.d.ts.map +1 -0
- package/dist/cli/tui/components/RequestListItem.js +130 -0
- package/dist/cli/tui/components/RequestListItem.js.map +1 -0
- package/dist/cli/tui/components/SaveModal.d.ts +30 -0
- package/dist/cli/tui/components/SaveModal.d.ts.map +1 -0
- package/dist/cli/tui/components/SaveModal.js +95 -0
- package/dist/cli/tui/components/SaveModal.js.map +1 -0
- package/dist/cli/tui/components/StatusBar.d.ts +39 -0
- package/dist/cli/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/cli/tui/components/StatusBar.js +53 -0
- package/dist/cli/tui/components/StatusBar.js.map +1 -0
- package/dist/cli/tui/components/TextViewerModal.d.ts +19 -0
- package/dist/cli/tui/components/TextViewerModal.d.ts.map +1 -0
- package/dist/cli/tui/components/TextViewerModal.js +227 -0
- package/dist/cli/tui/components/TextViewerModal.js.map +1 -0
- package/dist/cli/tui/hooks/useBodyExport.d.ts +26 -0
- package/dist/cli/tui/hooks/useBodyExport.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useBodyExport.js +173 -0
- package/dist/cli/tui/hooks/useBodyExport.js.map +1 -0
- package/dist/cli/tui/hooks/useExport.d.ts +29 -0
- package/dist/cli/tui/hooks/useExport.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useExport.js +64 -0
- package/dist/cli/tui/hooks/useExport.js.map +1 -0
- package/dist/cli/tui/hooks/useRequests.d.ts +26 -0
- package/dist/cli/tui/hooks/useRequests.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useRequests.js +131 -0
- package/dist/cli/tui/hooks/useRequests.js.map +1 -0
- package/dist/cli/tui/hooks/useSaveBinary.d.ts +26 -0
- package/dist/cli/tui/hooks/useSaveBinary.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useSaveBinary.js +165 -0
- package/dist/cli/tui/hooks/useSaveBinary.js.map +1 -0
- package/dist/cli/tui/hooks/useSpinner.d.ts +5 -0
- package/dist/cli/tui/hooks/useSpinner.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useSpinner.js +25 -0
- package/dist/cli/tui/hooks/useSpinner.js.map +1 -0
- package/dist/cli/tui/hooks/useStdoutDimensions.d.ts +11 -0
- package/dist/cli/tui/hooks/useStdoutDimensions.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useStdoutDimensions.js +29 -0
- package/dist/cli/tui/hooks/useStdoutDimensions.js.map +1 -0
- package/dist/cli/tui/utils/binary.d.ts +24 -0
- package/dist/cli/tui/utils/binary.d.ts.map +1 -0
- package/dist/cli/tui/utils/binary.js +152 -0
- package/dist/cli/tui/utils/binary.js.map +1 -0
- package/dist/cli/tui/utils/clipboard.d.ts +9 -0
- package/dist/cli/tui/utils/clipboard.d.ts.map +1 -0
- package/dist/cli/tui/utils/clipboard.js +58 -0
- package/dist/cli/tui/utils/clipboard.js.map +1 -0
- package/dist/cli/tui/utils/content-type.d.ts +8 -0
- package/dist/cli/tui/utils/content-type.d.ts.map +1 -0
- package/dist/cli/tui/utils/content-type.js +10 -0
- package/dist/cli/tui/utils/content-type.js.map +1 -0
- package/dist/cli/tui/utils/curl.d.ts +9 -0
- package/dist/cli/tui/utils/curl.d.ts.map +1 -0
- package/dist/cli/tui/utils/curl.js +54 -0
- package/dist/cli/tui/utils/curl.js.map +1 -0
- package/dist/cli/tui/utils/filters.d.ts +6 -0
- package/dist/cli/tui/utils/filters.d.ts.map +1 -0
- package/dist/cli/tui/utils/filters.js +13 -0
- package/dist/cli/tui/utils/filters.js.map +1 -0
- package/dist/cli/tui/utils/formatters.d.ts +49 -0
- package/dist/cli/tui/utils/formatters.d.ts.map +1 -0
- package/dist/cli/tui/utils/formatters.js +200 -0
- package/dist/cli/tui/utils/formatters.js.map +1 -0
- package/dist/cli/tui/utils/har.d.ts +75 -0
- package/dist/cli/tui/utils/har.d.ts.map +1 -0
- package/dist/cli/tui/utils/har.js +117 -0
- package/dist/cli/tui/utils/har.js.map +1 -0
- package/dist/cli/tui/utils/json-tree.d.ts +69 -0
- package/dist/cli/tui/utils/json-tree.d.ts.map +1 -0
- package/dist/cli/tui/utils/json-tree.js +339 -0
- package/dist/cli/tui/utils/json-tree.js.map +1 -0
- package/dist/cli/tui/utils/open-external.d.ts +17 -0
- package/dist/cli/tui/utils/open-external.d.ts.map +1 -0
- package/dist/cli/tui/utils/open-external.js +57 -0
- package/dist/cli/tui/utils/open-external.js.map +1 -0
- package/dist/cli/tui/utils/syntax-highlight.d.ts +16 -0
- package/dist/cli/tui/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/cli/tui/utils/syntax-highlight.js +64 -0
- package/dist/cli/tui/utils/syntax-highlight.js.map +1 -0
- package/dist/daemon/control.d.ts +21 -0
- package/dist/daemon/control.d.ts.map +1 -0
- package/dist/daemon/control.js +311 -0
- package/dist/daemon/control.js.map +1 -0
- package/dist/daemon/htpx-client.d.ts +8 -0
- package/dist/daemon/htpx-client.d.ts.map +1 -0
- package/dist/daemon/htpx-client.js +25 -0
- package/dist/daemon/htpx-client.js.map +1 -0
- package/dist/daemon/index.d.ts +3 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +178 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/interceptor-loader.d.ts +30 -0
- package/dist/daemon/interceptor-loader.d.ts.map +1 -0
- package/dist/daemon/interceptor-loader.js +249 -0
- package/dist/daemon/interceptor-loader.js.map +1 -0
- package/dist/daemon/interceptor-runner.d.ts +39 -0
- package/dist/daemon/interceptor-runner.d.ts.map +1 -0
- package/dist/daemon/interceptor-runner.js +312 -0
- package/dist/daemon/interceptor-runner.js.map +1 -0
- package/dist/daemon/procsi-client.d.ts +8 -0
- package/dist/daemon/procsi-client.d.ts.map +1 -0
- package/dist/daemon/procsi-client.js +25 -0
- package/dist/daemon/procsi-client.js.map +1 -0
- package/dist/daemon/proxy.d.ts +34 -0
- package/dist/daemon/proxy.d.ts.map +1 -0
- package/dist/daemon/proxy.js +213 -0
- package/dist/daemon/proxy.js.map +1 -0
- package/dist/daemon/storage.d.ts +130 -0
- package/dist/daemon/storage.d.ts.map +1 -0
- package/dist/daemon/storage.js +761 -0
- package/dist/daemon/storage.js.map +1 -0
- package/dist/interceptors.d.ts +2 -0
- package/dist/interceptors.d.ts.map +1 -0
- package/dist/interceptors.js +2 -0
- package/dist/interceptors.js.map +1 -0
- package/dist/mcp/server.d.ts +110 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +806 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/overrides/node.d.ts +30 -0
- package/dist/overrides/node.d.ts.map +1 -0
- package/dist/overrides/node.js +66 -0
- package/dist/overrides/node.js.map +1 -0
- package/dist/shared/config.d.ts +21 -0
- package/dist/shared/config.d.ts.map +1 -0
- package/dist/shared/config.js +83 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/content-type.d.ts +64 -0
- package/dist/shared/content-type.d.ts.map +1 -0
- package/dist/shared/content-type.js +145 -0
- package/dist/shared/content-type.js.map +1 -0
- package/dist/shared/control-client.d.ts +144 -0
- package/dist/shared/control-client.d.ts.map +1 -0
- package/dist/shared/control-client.js +272 -0
- package/dist/shared/control-client.js.map +1 -0
- package/dist/shared/daemon.d.ts +33 -0
- package/dist/shared/daemon.d.ts.map +1 -0
- package/dist/shared/daemon.js +231 -0
- package/dist/shared/daemon.js.map +1 -0
- package/dist/shared/logger.d.ts +47 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +200 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/project.d.ts +76 -0
- package/dist/shared/project.d.ts.map +1 -0
- package/dist/shared/project.js +185 -0
- package/dist/shared/project.js.map +1 -0
- package/dist/shared/proxy-info.d.ts +10 -0
- package/dist/shared/proxy-info.d.ts.map +1 -0
- package/dist/shared/proxy-info.js +15 -0
- package/dist/shared/proxy-info.js.map +1 -0
- package/dist/shared/types.d.ts +128 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +5 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/shared/version.d.ts +5 -0
- package/dist/shared/version.d.ts.map +1 -0
- package/dist/shared/version.js +21 -0
- package/dist/shared/version.js.map +1 -0
- package/package.json +113 -0
- package/skills/procsi/SKILL.md +228 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as fsp from "node:fs/promises";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { createJiti } from "jiti";
|
|
5
|
+
import { createLogger } from "../shared/logger.js";
|
|
6
|
+
/** Debounce delay for file-watcher reload triggers */
|
|
7
|
+
const WATCH_DEBOUNCE_MS = 300;
|
|
8
|
+
/**
|
|
9
|
+
* Runtime type guard for interceptor exports.
|
|
10
|
+
* Validates that the value is an object with a `handler` function,
|
|
11
|
+
* and that optional fields have the correct types if present.
|
|
12
|
+
*/
|
|
13
|
+
export function isValidInterceptor(value) {
|
|
14
|
+
if (typeof value !== "object" || value === null) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const obj = value;
|
|
18
|
+
if (typeof obj["handler"] !== "function") {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if ("name" in obj && typeof obj["name"] !== "string") {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if ("match" in obj && typeof obj["match"] !== "function") {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Scan the interceptors directory for `.ts` files, sorted alphabetically.
|
|
31
|
+
* Returns an empty array if the directory does not exist.
|
|
32
|
+
*/
|
|
33
|
+
async function listInterceptorFiles(dir) {
|
|
34
|
+
try {
|
|
35
|
+
const entries = await fsp.readdir(dir, { withFileTypes: true });
|
|
36
|
+
return entries
|
|
37
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith(".ts"))
|
|
38
|
+
.map((entry) => entry.name)
|
|
39
|
+
.sort()
|
|
40
|
+
.map((name) => path.join(dir, name));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Extract loaded interceptors from a module's default export.
|
|
48
|
+
* Handles both single interceptor objects and arrays of interceptors.
|
|
49
|
+
*/
|
|
50
|
+
function extractInterceptors(mod, filePath, logger) {
|
|
51
|
+
const interceptors = [];
|
|
52
|
+
const errors = [];
|
|
53
|
+
// Unwrap `default` export if present
|
|
54
|
+
const exported = typeof mod === "object" && mod !== null && "default" in mod
|
|
55
|
+
? mod["default"]
|
|
56
|
+
: mod;
|
|
57
|
+
const candidates = Array.isArray(exported) ? exported : [exported];
|
|
58
|
+
for (const candidate of candidates) {
|
|
59
|
+
if (isValidInterceptor(candidate)) {
|
|
60
|
+
interceptors.push({ ...candidate, sourceFile: filePath });
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const desc = typeof candidate === "object" && candidate !== null
|
|
64
|
+
? "object missing valid handler"
|
|
65
|
+
: `unexpected export type: ${typeof candidate}`;
|
|
66
|
+
const msg = `Invalid interceptor export in ${path.basename(filePath)}: ${desc}`;
|
|
67
|
+
errors.push(msg);
|
|
68
|
+
logger.warn(msg);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { interceptors, errors };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Warn about duplicate interceptor names across all loaded interceptors.
|
|
75
|
+
*/
|
|
76
|
+
function warnDuplicateNames(interceptors, logger) {
|
|
77
|
+
const seen = new Map();
|
|
78
|
+
for (const interceptor of interceptors) {
|
|
79
|
+
if (interceptor.name === undefined)
|
|
80
|
+
continue;
|
|
81
|
+
const previousFile = seen.get(interceptor.name);
|
|
82
|
+
if (previousFile !== undefined) {
|
|
83
|
+
logger.warn(`Duplicate interceptor name "${interceptor.name}" in ${path.basename(interceptor.sourceFile)} ` +
|
|
84
|
+
`(already defined in ${path.basename(previousFile)})`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
seen.set(interceptor.name, interceptor.sourceFile);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create an interceptor loader that loads TypeScript interceptor files
|
|
93
|
+
* from the given directory using jiti, validates them, and watches
|
|
94
|
+
* for changes to trigger hot reloads.
|
|
95
|
+
*/
|
|
96
|
+
export async function createInterceptorLoader(options) {
|
|
97
|
+
const { interceptorsDir, projectRoot, logLevel, onReload } = options;
|
|
98
|
+
const logger = createLogger("interceptor", projectRoot, logLevel);
|
|
99
|
+
let interceptors = [];
|
|
100
|
+
let infoEntries = [];
|
|
101
|
+
let watcher = null;
|
|
102
|
+
let debounceTimer = null;
|
|
103
|
+
let closed = false;
|
|
104
|
+
/**
|
|
105
|
+
* Load all interceptor files from the directory and replace the
|
|
106
|
+
* current interceptor set atomically.
|
|
107
|
+
*/
|
|
108
|
+
async function loadAll() {
|
|
109
|
+
const files = await listInterceptorFiles(interceptorsDir);
|
|
110
|
+
if (files.length === 0) {
|
|
111
|
+
interceptors = [];
|
|
112
|
+
infoEntries = [];
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
logger.info(`Loading ${files.length} interceptor file(s) from ${interceptorsDir}`);
|
|
116
|
+
// Fresh jiti instance each load to avoid serving stale cached modules on reload
|
|
117
|
+
const jiti = createJiti(import.meta.url, { interopDefault: true });
|
|
118
|
+
const nextInterceptors = [];
|
|
119
|
+
const nextInfo = [];
|
|
120
|
+
for (const filePath of files) {
|
|
121
|
+
const fileName = path.basename(filePath);
|
|
122
|
+
try {
|
|
123
|
+
const mod = await jiti.import(filePath);
|
|
124
|
+
const { interceptors: extracted, errors } = extractInterceptors(mod, filePath, logger);
|
|
125
|
+
if (extracted.length === 0) {
|
|
126
|
+
// File loaded but produced no valid interceptors
|
|
127
|
+
const errorMsg = errors.length > 0 ? errors.join("; ") : "No valid interceptor exports found";
|
|
128
|
+
nextInfo.push({
|
|
129
|
+
name: fileName,
|
|
130
|
+
hasMatch: false,
|
|
131
|
+
sourceFile: filePath,
|
|
132
|
+
error: errorMsg,
|
|
133
|
+
});
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
for (const interceptor of extracted) {
|
|
137
|
+
const name = interceptor.name ?? fileName;
|
|
138
|
+
nextInterceptors.push(interceptor);
|
|
139
|
+
nextInfo.push({
|
|
140
|
+
name,
|
|
141
|
+
hasMatch: interceptor.match !== undefined,
|
|
142
|
+
sourceFile: filePath,
|
|
143
|
+
});
|
|
144
|
+
logger.info(`Loaded interceptor "${name}" from ${fileName}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
149
|
+
logger.warn(`Failed to load interceptor file ${fileName}: ${errorMsg}`);
|
|
150
|
+
nextInfo.push({
|
|
151
|
+
name: fileName,
|
|
152
|
+
hasMatch: false,
|
|
153
|
+
sourceFile: filePath,
|
|
154
|
+
error: errorMsg,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
warnDuplicateNames(nextInterceptors, logger);
|
|
159
|
+
// Atomic replacement
|
|
160
|
+
interceptors = nextInterceptors;
|
|
161
|
+
infoEntries = nextInfo;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Start watching the interceptors directory for changes.
|
|
165
|
+
*/
|
|
166
|
+
async function startWatching() {
|
|
167
|
+
try {
|
|
168
|
+
await fsp.access(interceptorsDir);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
watcher = fs.watch(interceptorsDir, (_eventType, filename) => {
|
|
175
|
+
// Only react to TypeScript file changes
|
|
176
|
+
if (typeof filename !== "string" || !filename.endsWith(".ts")) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Debounce rapid successive changes (e.g. atomic save-rename patterns)
|
|
180
|
+
if (debounceTimer !== null) {
|
|
181
|
+
clearTimeout(debounceTimer);
|
|
182
|
+
}
|
|
183
|
+
debounceTimer = setTimeout(() => {
|
|
184
|
+
debounceTimer = null;
|
|
185
|
+
if (closed)
|
|
186
|
+
return;
|
|
187
|
+
logger.info("Interceptor file change detected, reloading");
|
|
188
|
+
loadAll()
|
|
189
|
+
.then(() => {
|
|
190
|
+
logger.info(`Hot-reload complete, ${interceptors.length} interceptor(s) active`);
|
|
191
|
+
onReload?.();
|
|
192
|
+
})
|
|
193
|
+
.catch((err) => {
|
|
194
|
+
logger.warn(`Hot-reload failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
195
|
+
});
|
|
196
|
+
}, WATCH_DEBOUNCE_MS);
|
|
197
|
+
});
|
|
198
|
+
watcher.on("error", (err) => {
|
|
199
|
+
logger.warn(`Interceptor directory watcher error: ${err.message}`);
|
|
200
|
+
interceptors = [];
|
|
201
|
+
infoEntries = [];
|
|
202
|
+
stopWatching();
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
logger.warn(`Failed to watch interceptors directory: ${err instanceof Error ? err.message : String(err)}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function stopWatching() {
|
|
210
|
+
if (debounceTimer !== null) {
|
|
211
|
+
clearTimeout(debounceTimer);
|
|
212
|
+
debounceTimer = null;
|
|
213
|
+
}
|
|
214
|
+
if (watcher !== null) {
|
|
215
|
+
watcher.close();
|
|
216
|
+
watcher = null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Perform initial load
|
|
220
|
+
try {
|
|
221
|
+
await fsp.access(interceptorsDir);
|
|
222
|
+
logger.info(`Interceptors directory found: ${interceptorsDir}`);
|
|
223
|
+
await loadAll();
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// Directory does not exist — interceptors are opt-in
|
|
227
|
+
}
|
|
228
|
+
await startWatching();
|
|
229
|
+
return {
|
|
230
|
+
getInterceptors() {
|
|
231
|
+
return interceptors;
|
|
232
|
+
},
|
|
233
|
+
getInterceptorInfo() {
|
|
234
|
+
return infoEntries;
|
|
235
|
+
},
|
|
236
|
+
async reload() {
|
|
237
|
+
logger.info("Manual reload triggered");
|
|
238
|
+
await loadAll();
|
|
239
|
+
logger.info(`Reload complete, ${interceptors.length} interceptor(s) active`);
|
|
240
|
+
onReload?.();
|
|
241
|
+
},
|
|
242
|
+
close() {
|
|
243
|
+
closed = true;
|
|
244
|
+
stopWatching();
|
|
245
|
+
logger.close();
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=interceptor-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor-loader.js","sourceRoot":"","sources":["../../src/daemon/interceptor-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type LogLevel } from "../shared/logger.js";
|
|
2
|
+
import type { InterceptorRequest, InterceptorResponse, InterceptionType, ProcsiClient } from "../shared/types.js";
|
|
3
|
+
import type { InterceptorLoader } from "./interceptor-loader.js";
|
|
4
|
+
export declare const HANDLER_TIMEOUT_MS = 30000;
|
|
5
|
+
export declare const MATCH_TIMEOUT_MS = 5000;
|
|
6
|
+
export declare const STALE_CLEANUP_INTERVAL_MS = 60000;
|
|
7
|
+
export interface HandleRequestResult {
|
|
8
|
+
mockResponse?: InterceptorResponse;
|
|
9
|
+
interception?: {
|
|
10
|
+
name: string;
|
|
11
|
+
type: InterceptionType;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export interface HandleResponseResult {
|
|
15
|
+
responseOverride?: InterceptorResponse;
|
|
16
|
+
interception?: {
|
|
17
|
+
name: string;
|
|
18
|
+
type: InterceptionType;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface InterceptorRunner {
|
|
22
|
+
handleRequest(requestId: string, request: InterceptorRequest): Promise<HandleRequestResult | undefined>;
|
|
23
|
+
handleResponse(requestId: string, upstreamResponse: InterceptorResponse): Promise<HandleResponseResult | undefined>;
|
|
24
|
+
cleanup(requestId: string): void;
|
|
25
|
+
}
|
|
26
|
+
interface InterceptorRunnerOptions {
|
|
27
|
+
loader: InterceptorLoader;
|
|
28
|
+
procsiClient: ProcsiClient;
|
|
29
|
+
projectRoot: string;
|
|
30
|
+
logLevel?: LogLevel;
|
|
31
|
+
/** Override handler timeout for testing */
|
|
32
|
+
handlerTimeoutMs?: number;
|
|
33
|
+
/** Override match timeout for testing */
|
|
34
|
+
matchTimeoutMs?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare function isValidInterceptorResponse(value: unknown): value is InterceptorResponse;
|
|
37
|
+
export declare function createInterceptorRunner(options: InterceptorRunnerOptions): InterceptorRunner;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=interceptor-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor-runner.d.ts","sourceRoot":"","sources":["../../src/daemon/interceptor-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAEnB,gBAAgB,EAChB,YAAY,EACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,yBAAyB,CAAC;AAIpF,eAAO,MAAM,kBAAkB,QAAS,CAAC;AACzC,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AACtC,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAMhD,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC;CACzD;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC;CACzD;AAID,MAAM,WAAW,iBAAiB;IAChC,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAC5C,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,mBAAmB,GACpC,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AA+BD,UAAU,wBAAwB;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAOD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CA2BvF;AAiCD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAqT5F"}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { createLogger } from "../shared/logger.js";
|
|
2
|
+
// --- Constants (exported for testing) ---
|
|
3
|
+
export const HANDLER_TIMEOUT_MS = 30_000;
|
|
4
|
+
export const MATCH_TIMEOUT_MS = 5_000;
|
|
5
|
+
export const STALE_CLEANUP_INTERVAL_MS = 60_000;
|
|
6
|
+
/** Warn if total match evaluation across all interceptors exceeds this threshold */
|
|
7
|
+
const SLOW_MATCH_TOTAL_MS = 1_000;
|
|
8
|
+
function createDeferred() {
|
|
9
|
+
let resolve;
|
|
10
|
+
let reject;
|
|
11
|
+
const promise = new Promise((res, rej) => {
|
|
12
|
+
resolve = res;
|
|
13
|
+
reject = rej;
|
|
14
|
+
});
|
|
15
|
+
return { promise, resolve, reject };
|
|
16
|
+
}
|
|
17
|
+
// --- Response validation ---
|
|
18
|
+
const MIN_HTTP_STATUS = 100;
|
|
19
|
+
const MAX_HTTP_STATUS = 599;
|
|
20
|
+
export function isValidInterceptorResponse(value) {
|
|
21
|
+
if (value === null || value === undefined || typeof value !== "object") {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const candidate = value;
|
|
25
|
+
if (typeof candidate["status"] !== "number") {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
if (candidate["status"] < MIN_HTTP_STATUS || candidate["status"] > MAX_HTTP_STATUS) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
if (candidate["headers"] !== undefined) {
|
|
32
|
+
if (candidate["headers"] === null || typeof candidate["headers"] !== "object") {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (candidate["body"] !== undefined) {
|
|
37
|
+
if (typeof candidate["body"] !== "string" && !Buffer.isBuffer(candidate["body"])) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
// --- Timeout helper ---
|
|
44
|
+
/**
|
|
45
|
+
* Race a promise against a timeout. Resolves to `{ result }` on success
|
|
46
|
+
* or `{ timedOut: true }` if the deadline is exceeded.
|
|
47
|
+
*/
|
|
48
|
+
function withTimeout(promise, ms) {
|
|
49
|
+
return new Promise((resolve) => {
|
|
50
|
+
const timer = setTimeout(() => {
|
|
51
|
+
resolve({ timedOut: true });
|
|
52
|
+
}, ms);
|
|
53
|
+
promise.then((result) => {
|
|
54
|
+
clearTimeout(timer);
|
|
55
|
+
resolve({ result });
|
|
56
|
+
}, () => {
|
|
57
|
+
clearTimeout(timer);
|
|
58
|
+
// The caller handles errors separately; treat rejection as a timeout-like bail-out
|
|
59
|
+
resolve({ timedOut: true });
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
// --- Factory ---
|
|
64
|
+
export function createInterceptorRunner(options) {
|
|
65
|
+
const { loader, procsiClient, projectRoot, logLevel } = options;
|
|
66
|
+
const handlerTimeoutMs = options.handlerTimeoutMs ?? HANDLER_TIMEOUT_MS;
|
|
67
|
+
const matchTimeoutMs = options.matchTimeoutMs ?? MATCH_TIMEOUT_MS;
|
|
68
|
+
const logger = createLogger("interceptor", projectRoot, logLevel);
|
|
69
|
+
// Tracks requests where forward() was called and we are waiting for the upstream response
|
|
70
|
+
const pending = new Map();
|
|
71
|
+
// Periodic cleanup of stale entries where completion never fired
|
|
72
|
+
const staleThreshold = handlerTimeoutMs * 2;
|
|
73
|
+
const cleanupInterval = setInterval(() => {
|
|
74
|
+
const now = Date.now();
|
|
75
|
+
for (const [requestId, entry] of pending) {
|
|
76
|
+
if (now - entry.createdAt > staleThreshold) {
|
|
77
|
+
logger.trace("Cleaning up stale pending entry", {
|
|
78
|
+
requestId,
|
|
79
|
+
interceptor: entry.interceptorName,
|
|
80
|
+
});
|
|
81
|
+
pending.delete(requestId);
|
|
82
|
+
entry.rejectUpstream(new Error("Stale pending entry cleaned up"));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}, STALE_CLEANUP_INTERVAL_MS);
|
|
86
|
+
// Prevent the interval from keeping the process alive
|
|
87
|
+
cleanupInterval.unref();
|
|
88
|
+
/**
|
|
89
|
+
* Find the first interceptor whose match predicate returns true for the request.
|
|
90
|
+
* If an interceptor has no match function it matches everything.
|
|
91
|
+
*/
|
|
92
|
+
async function findMatchingInterceptor(interceptors, request) {
|
|
93
|
+
const matchStart = Date.now();
|
|
94
|
+
for (const interceptor of interceptors) {
|
|
95
|
+
if (!interceptor.match) {
|
|
96
|
+
return interceptor;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const outcome = await withTimeout(Promise.resolve(interceptor.match(request)), matchTimeoutMs);
|
|
100
|
+
if (outcome.timedOut) {
|
|
101
|
+
logger.warn("Match function timed out", {
|
|
102
|
+
interceptor: interceptor.name ?? interceptor.sourceFile,
|
|
103
|
+
});
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (outcome.result) {
|
|
107
|
+
return interceptor;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
logger.warn("Match function threw", {
|
|
112
|
+
interceptor: interceptor.name ?? interceptor.sourceFile,
|
|
113
|
+
error: err instanceof Error ? err.message : String(err),
|
|
114
|
+
});
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const totalMs = Date.now() - matchStart;
|
|
119
|
+
if (totalMs > SLOW_MATCH_TOTAL_MS) {
|
|
120
|
+
logger.warn("Slow match evaluation — keep match functions synchronous and fast", {
|
|
121
|
+
totalMs,
|
|
122
|
+
interceptorCount: interceptors.length,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
async function handleRequest(requestId, request) {
|
|
128
|
+
const interceptors = loader.getInterceptors();
|
|
129
|
+
if (interceptors.length === 0) {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
const interceptor = await findMatchingInterceptor(interceptors, request);
|
|
133
|
+
if (!interceptor) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
const interceptorName = interceptor.name ?? interceptor.sourceFile;
|
|
137
|
+
logger.debug("Request matched interceptor", {
|
|
138
|
+
requestId,
|
|
139
|
+
interceptor: interceptorName,
|
|
140
|
+
method: request.method,
|
|
141
|
+
url: request.url,
|
|
142
|
+
});
|
|
143
|
+
// Defensive copy of body buffer so handlers cannot mutate the original
|
|
144
|
+
if (request.body) {
|
|
145
|
+
request = { ...request, body: Buffer.from(request.body) };
|
|
146
|
+
}
|
|
147
|
+
// Freeze the request so handlers cannot mutate it
|
|
148
|
+
Object.freeze(request.headers);
|
|
149
|
+
Object.freeze(request);
|
|
150
|
+
// Deferred for the upstream response that forward() will await
|
|
151
|
+
const upstreamDeferred = createDeferred();
|
|
152
|
+
// Signal deferred that resolves when forward() is called
|
|
153
|
+
const forwardCalledDeferred = createDeferred();
|
|
154
|
+
let forwardCalled = false;
|
|
155
|
+
let completed = false;
|
|
156
|
+
const forward = () => {
|
|
157
|
+
if (completed) {
|
|
158
|
+
const msg = "forward() called after handler completed";
|
|
159
|
+
logger.warn(msg, { requestId, interceptor: interceptorName });
|
|
160
|
+
return Promise.reject(new Error(msg));
|
|
161
|
+
}
|
|
162
|
+
if (forwardCalled) {
|
|
163
|
+
logger.debug("forward() called again (idempotent)", {
|
|
164
|
+
requestId,
|
|
165
|
+
interceptor: interceptorName,
|
|
166
|
+
});
|
|
167
|
+
return upstreamDeferred.promise;
|
|
168
|
+
}
|
|
169
|
+
forwardCalled = true;
|
|
170
|
+
forwardCalledDeferred.resolve(undefined);
|
|
171
|
+
return upstreamDeferred.promise;
|
|
172
|
+
};
|
|
173
|
+
const ctxLog = (message) => {
|
|
174
|
+
logger.info(`[${interceptorName}] ${message}`, { requestId });
|
|
175
|
+
};
|
|
176
|
+
const ctx = {
|
|
177
|
+
request,
|
|
178
|
+
forward,
|
|
179
|
+
procsi: procsiClient,
|
|
180
|
+
log: ctxLog,
|
|
181
|
+
};
|
|
182
|
+
// Start the handler
|
|
183
|
+
const handlerPromise = interceptor.handler(ctx);
|
|
184
|
+
// Race: handler completes first (mock) vs forward() called first (modify/observe)
|
|
185
|
+
try {
|
|
186
|
+
const raceOutcome = await withTimeout(Promise.race([
|
|
187
|
+
handlerPromise.then((result) => ({ kind: "handlerDone", result })),
|
|
188
|
+
forwardCalledDeferred.promise.then(() => ({
|
|
189
|
+
kind: "forwardCalled",
|
|
190
|
+
result: undefined,
|
|
191
|
+
})),
|
|
192
|
+
]), handlerTimeoutMs);
|
|
193
|
+
if (raceOutcome.timedOut) {
|
|
194
|
+
logger.warn("Handler timed out during request phase", {
|
|
195
|
+
requestId,
|
|
196
|
+
interceptor: interceptorName,
|
|
197
|
+
});
|
|
198
|
+
completed = true;
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
const raceResult = raceOutcome.result;
|
|
202
|
+
if (raceResult.kind === "handlerDone") {
|
|
203
|
+
// Handler returned before calling forward() - this is a mock or pass-through
|
|
204
|
+
completed = true;
|
|
205
|
+
if (raceResult.result === undefined || raceResult.result === null) {
|
|
206
|
+
// Handler returned nothing - pass through
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
if (!isValidInterceptorResponse(raceResult.result)) {
|
|
210
|
+
logger.warn("Handler returned invalid response", {
|
|
211
|
+
requestId,
|
|
212
|
+
interceptor: interceptorName,
|
|
213
|
+
});
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
logger.debug("Mock response returned", {
|
|
217
|
+
requestId,
|
|
218
|
+
interceptor: interceptorName,
|
|
219
|
+
status: raceResult.result.status,
|
|
220
|
+
});
|
|
221
|
+
return {
|
|
222
|
+
mockResponse: raceResult.result,
|
|
223
|
+
interception: { name: interceptorName, type: "mocked" },
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
// forward() was called - store state and let the proxy forward the request
|
|
227
|
+
const interception = { name: interceptorName, type: "modified" };
|
|
228
|
+
pending.set(requestId, {
|
|
229
|
+
resolveUpstream: upstreamDeferred.resolve,
|
|
230
|
+
rejectUpstream: upstreamDeferred.reject,
|
|
231
|
+
handlerPromise,
|
|
232
|
+
interceptorName,
|
|
233
|
+
interception,
|
|
234
|
+
completed: false,
|
|
235
|
+
createdAt: Date.now(),
|
|
236
|
+
});
|
|
237
|
+
return { interception };
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
logger.warn("Handler threw during request phase", {
|
|
241
|
+
requestId,
|
|
242
|
+
interceptor: interceptorName,
|
|
243
|
+
error: err instanceof Error ? err.message : String(err),
|
|
244
|
+
});
|
|
245
|
+
completed = true;
|
|
246
|
+
return undefined;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async function handleResponse(requestId, upstreamResponse) {
|
|
250
|
+
const entry = pending.get(requestId);
|
|
251
|
+
if (!entry) {
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
pending.delete(requestId);
|
|
255
|
+
// Resolve the upstream promise so the handler's forward() call returns
|
|
256
|
+
entry.resolveUpstream(upstreamResponse);
|
|
257
|
+
// Calculate remaining time budget from when the handler started
|
|
258
|
+
const elapsed = Date.now() - entry.createdAt;
|
|
259
|
+
const remaining = Math.max(0, handlerTimeoutMs - elapsed);
|
|
260
|
+
try {
|
|
261
|
+
const outcome = await withTimeout(entry.handlerPromise, remaining);
|
|
262
|
+
entry.completed = true;
|
|
263
|
+
if (outcome.timedOut) {
|
|
264
|
+
logger.warn("Handler timed out during response phase", {
|
|
265
|
+
requestId,
|
|
266
|
+
interceptor: entry.interceptorName,
|
|
267
|
+
});
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
const result = outcome.result;
|
|
271
|
+
if (result === undefined || result === null) {
|
|
272
|
+
// Handler did not return a response override (observe mode)
|
|
273
|
+
return { interception: entry.interception };
|
|
274
|
+
}
|
|
275
|
+
if (!isValidInterceptorResponse(result)) {
|
|
276
|
+
logger.warn("Handler returned invalid response after forward()", {
|
|
277
|
+
requestId,
|
|
278
|
+
interceptor: entry.interceptorName,
|
|
279
|
+
});
|
|
280
|
+
return { interception: entry.interception };
|
|
281
|
+
}
|
|
282
|
+
logger.debug("Response modified after forward()", {
|
|
283
|
+
requestId,
|
|
284
|
+
interceptor: entry.interceptorName,
|
|
285
|
+
status: result.status,
|
|
286
|
+
});
|
|
287
|
+
return {
|
|
288
|
+
responseOverride: result,
|
|
289
|
+
interception: entry.interception,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
entry.completed = true;
|
|
294
|
+
logger.warn("Handler threw during response phase", {
|
|
295
|
+
requestId,
|
|
296
|
+
interceptor: entry.interceptorName,
|
|
297
|
+
error: err instanceof Error ? err.message : String(err),
|
|
298
|
+
});
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
function cleanup(requestId) {
|
|
303
|
+
const entry = pending.get(requestId);
|
|
304
|
+
if (!entry) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
pending.delete(requestId);
|
|
308
|
+
entry.rejectUpstream(new Error("Request aborted"));
|
|
309
|
+
}
|
|
310
|
+
return { handleRequest, handleResponse, cleanup };
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=interceptor-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor-runner.js","sourceRoot":"","sources":["../../src/daemon/interceptor-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RequestRepository } from "./storage.js";
|
|
2
|
+
import type { ProcsiClient } from "../shared/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Create an in-process ProcsiClient that wraps RequestRepository directly.
|
|
5
|
+
* Used by interceptors running inside the daemon process.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createProcsiClient(storage: RequestRepository): ProcsiClient;
|
|
8
|
+
//# sourceMappingURL=procsi-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procsi-client.d.ts","sourceRoot":"","sources":["../../src/daemon/procsi-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,YAAY,CAsB3E"}
|