@gloocan/cat-inspector 0.1.1
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/artifact-helpers.d.ts +4 -0
- package/dist/artifact-helpers.d.ts.map +1 -0
- package/dist/artifact-helpers.js +21 -0
- package/dist/artifact-helpers.js.map +1 -0
- package/dist/ast/get-all-ts-files.d.ts +5 -0
- package/dist/ast/get-all-ts-files.d.ts.map +1 -0
- package/dist/ast/get-all-ts-files.js +36 -0
- package/dist/ast/get-all-ts-files.js.map +1 -0
- package/dist/ast/merge-ast.d.ts +3 -0
- package/dist/ast/merge-ast.d.ts.map +1 -0
- package/dist/ast/merge-ast.js +40 -0
- package/dist/ast/merge-ast.js.map +1 -0
- package/dist/ast/run-ast-scanner.d.ts +15 -0
- package/dist/ast/run-ast-scanner.d.ts.map +1 -0
- package/dist/ast/run-ast-scanner.js +44 -0
- package/dist/ast/run-ast-scanner.js.map +1 -0
- package/dist/ast/scan-for-labels.d.ts +20 -0
- package/dist/ast/scan-for-labels.d.ts.map +1 -0
- package/dist/ast/scan-for-labels.js +88 -0
- package/dist/ast/scan-for-labels.js.map +1 -0
- package/dist/ast/scan-for-returns.d.ts +13 -0
- package/dist/ast/scan-for-returns.d.ts.map +1 -0
- package/dist/ast/scan-for-returns.js +48 -0
- package/dist/ast/scan-for-returns.js.map +1 -0
- package/dist/ast/type-expand.d.ts +16 -0
- package/dist/ast/type-expand.d.ts.map +1 -0
- package/dist/ast/type-expand.js +118 -0
- package/dist/ast/type-expand.js.map +1 -0
- package/dist/ast/visit-node.d.ts +31 -0
- package/dist/ast/visit-node.d.ts.map +1 -0
- package/dist/ast/visit-node.js +298 -0
- package/dist/ast/visit-node.js.map +1 -0
- package/dist/bootstrap.d.ts +105 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +121 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/catalog-bootstrap-cache.d.ts +23 -0
- package/dist/catalog-bootstrap-cache.d.ts.map +1 -0
- package/dist/catalog-bootstrap-cache.js +54 -0
- package/dist/catalog-bootstrap-cache.js.map +1 -0
- package/dist/catalog-fingerprint.d.ts +20 -0
- package/dist/catalog-fingerprint.d.ts.map +1 -0
- package/dist/catalog-fingerprint.js +57 -0
- package/dist/catalog-fingerprint.js.map +1 -0
- package/dist/coverage/compute-coverage.d.ts +41 -0
- package/dist/coverage/compute-coverage.d.ts.map +1 -0
- package/dist/coverage/compute-coverage.js +229 -0
- package/dist/coverage/compute-coverage.js.map +1 -0
- package/dist/coverage/scan-all-service-candidates.d.ts +15 -0
- package/dist/coverage/scan-all-service-candidates.d.ts.map +1 -0
- package/dist/coverage/scan-all-service-candidates.js +73 -0
- package/dist/coverage/scan-all-service-candidates.js.map +1 -0
- package/dist/coverage/scan-express-candidates.d.ts +17 -0
- package/dist/coverage/scan-express-candidates.d.ts.map +1 -0
- package/dist/coverage/scan-express-candidates.js +300 -0
- package/dist/coverage/scan-express-candidates.js.map +1 -0
- package/dist/coverage/scan-reachable-services.d.ts +13 -0
- package/dist/coverage/scan-reachable-services.d.ts.map +1 -0
- package/dist/coverage/scan-reachable-services.js +469 -0
- package/dist/coverage/scan-reachable-services.js.map +1 -0
- package/dist/coverage/types.d.ts +32 -0
- package/dist/coverage/types.d.ts.map +1 -0
- package/dist/coverage/types.js +2 -0
- package/dist/coverage/types.js.map +1 -0
- package/dist/decorators/cat-class.d.ts +11 -0
- package/dist/decorators/cat-class.d.ts.map +1 -0
- package/dist/decorators/cat-class.js +20 -0
- package/dist/decorators/cat-class.js.map +1 -0
- package/dist/decorators/cat.d.ts +3 -0
- package/dist/decorators/cat.d.ts.map +1 -0
- package/dist/decorators/cat.js +102 -0
- package/dist/decorators/cat.js.map +1 -0
- package/dist/express-inspector-correlation.d.ts +23 -0
- package/dist/express-inspector-correlation.d.ts.map +1 -0
- package/dist/express-inspector-correlation.js +50 -0
- package/dist/express-inspector-correlation.js.map +1 -0
- package/dist/express-playground-mocks.d.ts +28 -0
- package/dist/express-playground-mocks.d.ts.map +1 -0
- package/dist/express-playground-mocks.js +55 -0
- package/dist/express-playground-mocks.js.map +1 -0
- package/dist/express-qa-host-minio-upload.d.ts +16 -0
- package/dist/express-qa-host-minio-upload.d.ts.map +1 -0
- package/dist/express-qa-host-minio-upload.js +56 -0
- package/dist/express-qa-host-minio-upload.js.map +1 -0
- package/dist/express.d.ts +21 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +167 -0
- package/dist/express.js.map +1 -0
- package/dist/functional.d.ts +15 -0
- package/dist/functional.d.ts.map +1 -0
- package/dist/functional.js +165 -0
- package/dist/functional.js.map +1 -0
- package/dist/graph/relationships.d.ts +9 -0
- package/dist/graph/relationships.d.ts.map +1 -0
- package/dist/graph/relationships.js +92 -0
- package/dist/graph/relationships.js.map +1 -0
- package/dist/http-bridge-registry.d.ts +26 -0
- package/dist/http-bridge-registry.d.ts.map +1 -0
- package/dist/http-bridge-registry.js +39 -0
- package/dist/http-bridge-registry.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/invoke-policy.d.ts +34 -0
- package/dist/invoke-policy.d.ts.map +1 -0
- package/dist/invoke-policy.js +72 -0
- package/dist/invoke-policy.js.map +1 -0
- package/dist/invoke-runtime-config.d.ts +4 -0
- package/dist/invoke-runtime-config.d.ts.map +1 -0
- package/dist/invoke-runtime-config.js +15 -0
- package/dist/invoke-runtime-config.js.map +1 -0
- package/dist/jobs/in-memory-job-registry.d.ts +21 -0
- package/dist/jobs/in-memory-job-registry.d.ts.map +1 -0
- package/dist/jobs/in-memory-job-registry.js +44 -0
- package/dist/jobs/in-memory-job-registry.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +17 -0
- package/dist/logger.js.map +1 -0
- package/dist/openapi/registry-to-openapi.d.ts +11 -0
- package/dist/openapi/registry-to-openapi.d.ts.map +1 -0
- package/dist/openapi/registry-to-openapi.js +61 -0
- package/dist/openapi/registry-to-openapi.js.map +1 -0
- package/dist/registry-state.d.ts +107 -0
- package/dist/registry-state.d.ts.map +1 -0
- package/dist/registry-state.js +302 -0
- package/dist/registry-state.js.map +1 -0
- package/dist/return.d.ts +14 -0
- package/dist/return.d.ts.map +1 -0
- package/dist/return.js +107 -0
- package/dist/return.js.map +1 -0
- package/dist/rpc.d.ts +7 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +287 -0
- package/dist/rpc.js.map +1 -0
- package/dist/serialize-rpc-result.d.ts +38 -0
- package/dist/serialize-rpc-result.d.ts.map +1 -0
- package/dist/serialize-rpc-result.js +132 -0
- package/dist/serialize-rpc-result.js.map +1 -0
- package/dist/session-store.d.ts +9 -0
- package/dist/session-store.d.ts.map +1 -0
- package/dist/session-store.js +19 -0
- package/dist/session-store.js.map +1 -0
- package/dist/source-utils.d.ts +19 -0
- package/dist/source-utils.d.ts.map +1 -0
- package/dist/source-utils.js +65 -0
- package/dist/source-utils.js.map +1 -0
- package/dist/transport/remote-bridge-cli.d.ts +2 -0
- package/dist/transport/remote-bridge-cli.d.ts.map +1 -0
- package/dist/transport/remote-bridge-cli.js +12 -0
- package/dist/transport/remote-bridge-cli.js.map +1 -0
- package/dist/transport/remote-inspector-bridge.d.ts +18 -0
- package/dist/transport/remote-inspector-bridge.d.ts.map +1 -0
- package/dist/transport/remote-inspector-bridge.js +71 -0
- package/dist/transport/remote-inspector-bridge.js.map +1 -0
- package/dist/transport/socket-io-playground.d.ts +78 -0
- package/dist/transport/socket-io-playground.d.ts.map +1 -0
- package/dist/transport/socket-io-playground.js +875 -0
- package/dist/transport/socket-io-playground.js.map +1 -0
- package/dist/transport/socket-io.d.ts +4 -0
- package/dist/transport/socket-io.d.ts.map +1 -0
- package/dist/transport/socket-io.js +4 -0
- package/dist/transport/socket-io.js.map +1 -0
- package/dist/transport/ws-server.d.ts +42 -0
- package/dist/transport/ws-server.d.ts.map +1 -0
- package/dist/transport/ws-server.js +429 -0
- package/dist/transport/ws-server.js.map +1 -0
- package/dist/type-string-normalize.d.ts +24 -0
- package/dist/type-string-normalize.d.ts.map +1 -0
- package/dist/type-string-normalize.js +178 -0
- package/dist/type-string-normalize.js.map +1 -0
- package/dist/types.d.ts +218 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/upload/fetch-file-url.d.ts +24 -0
- package/dist/upload/fetch-file-url.d.ts.map +1 -0
- package/dist/upload/fetch-file-url.js +130 -0
- package/dist/upload/fetch-file-url.js.map +1 -0
- package/dist/upload/host-minio-client.d.ts +30 -0
- package/dist/upload/host-minio-client.d.ts.map +1 -0
- package/dist/upload/host-minio-client.js +56 -0
- package/dist/upload/host-minio-client.js.map +1 -0
- package/dist/upload/materialize.d.ts +110 -0
- package/dist/upload/materialize.d.ts.map +1 -0
- package/dist/upload/materialize.js +466 -0
- package/dist/upload/materialize.js.map +1 -0
- package/dist/upload/upload-store.d.ts +44 -0
- package/dist/upload/upload-store.d.ts.map +1 -0
- package/dist/upload/upload-store.js +86 -0
- package/dist/upload/upload-store.js.map +1 -0
- package/dist/validate-params-json-schema.d.ts +13 -0
- package/dist/validate-params-json-schema.d.ts.map +1 -0
- package/dist/validate-params-json-schema.js +37 -0
- package/dist/validate-params-json-schema.js.map +1 -0
- package/dist/validate-return-json-schema.d.ts +9 -0
- package/dist/validate-return-json-schema.d.ts.map +1 -0
- package/dist/validate-return-json-schema.js +33 -0
- package/dist/validate-return-json-schema.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Parameter names from Function#toString — no execution */
|
|
2
|
+
export declare function extractParamNames(fn: Function): string[];
|
|
3
|
+
export declare function getFunctionBody(fn: Function): string;
|
|
4
|
+
/**
|
|
5
|
+
* Regex scan for Return("LABEL", ...) — no execution.
|
|
6
|
+
* Supports direct `Return("L", v)` and bundler comma form `(0,Return)("L", v)`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractReturnLabels(body: string): string[];
|
|
9
|
+
/**
|
|
10
|
+
* Regex scan for Throw("LABEL", ...) — no execution.
|
|
11
|
+
* Supports direct `Throw("L", err)` and bundler comma form `(0,Throw)("L", err)`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function extractThrowLabels(body: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Regex scan for ApiReturn("LABEL", ...) — no execution.
|
|
16
|
+
* Supports direct `ApiReturn("L", ...)` and bundler comma form `(0,ApiReturn)("L", ...)`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractApiReturnLabels(body: string): string[];
|
|
19
|
+
//# sourceMappingURL=source-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-utils.d.ts","sourceRoot":"","sources":["../src/source-utils.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,EAAE,CASxD;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAMpD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ1D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQzD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ7D"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Parameter names from Function#toString — no execution */
|
|
2
|
+
export function extractParamNames(fn) {
|
|
3
|
+
const src = fn.toString();
|
|
4
|
+
const match = /\(([^)]*)\)/.exec(src);
|
|
5
|
+
if (!match || !match[1].trim())
|
|
6
|
+
return [];
|
|
7
|
+
return match[1]
|
|
8
|
+
.split(',')
|
|
9
|
+
.map((p) => p.trim().split(':')[0]?.replace(/=.+/, '').trim())
|
|
10
|
+
.filter((p) => Boolean(p));
|
|
11
|
+
}
|
|
12
|
+
export function getFunctionBody(fn) {
|
|
13
|
+
const src = fn.toString();
|
|
14
|
+
const start = src.indexOf('{');
|
|
15
|
+
const end = src.lastIndexOf('}');
|
|
16
|
+
if (start === -1 || end === -1)
|
|
17
|
+
return '';
|
|
18
|
+
return src.slice(start + 1, end).trim();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Regex scan for Return("LABEL", ...) — no execution.
|
|
22
|
+
* Supports direct `Return("L", v)` and bundler comma form `(0,Return)("L", v)`.
|
|
23
|
+
*/
|
|
24
|
+
export function extractReturnLabels(body) {
|
|
25
|
+
const labels = [];
|
|
26
|
+
const direct = /Return\w*\(\s*["'`](\w+)["'`]/g;
|
|
27
|
+
const commaCallee = /Return\w*\)\s*\(\s*["'`](\w+)["'`]/g;
|
|
28
|
+
let match;
|
|
29
|
+
while ((match = direct.exec(body)) !== null)
|
|
30
|
+
labels.push(match[1]);
|
|
31
|
+
while ((match = commaCallee.exec(body)) !== null)
|
|
32
|
+
labels.push(match[1]);
|
|
33
|
+
return labels;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Regex scan for Throw("LABEL", ...) — no execution.
|
|
37
|
+
* Supports direct `Throw("L", err)` and bundler comma form `(0,Throw)("L", err)`.
|
|
38
|
+
*/
|
|
39
|
+
export function extractThrowLabels(body) {
|
|
40
|
+
const labels = [];
|
|
41
|
+
const direct = /Throw\w*\(\s*["'`](\w+)["'`]/g;
|
|
42
|
+
const commaCallee = /Throw\w*\)\s*\(\s*["'`](\w+)["'`]/g;
|
|
43
|
+
let match;
|
|
44
|
+
while ((match = direct.exec(body)) !== null)
|
|
45
|
+
labels.push(match[1]);
|
|
46
|
+
while ((match = commaCallee.exec(body)) !== null)
|
|
47
|
+
labels.push(match[1]);
|
|
48
|
+
return labels;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Regex scan for ApiReturn("LABEL", ...) — no execution.
|
|
52
|
+
* Supports direct `ApiReturn("L", ...)` and bundler comma form `(0,ApiReturn)("L", ...)`.
|
|
53
|
+
*/
|
|
54
|
+
export function extractApiReturnLabels(body) {
|
|
55
|
+
const labels = [];
|
|
56
|
+
const direct = /ApiReturn\w*\(\s*["'`](\w+)["'`]/g;
|
|
57
|
+
const commaCallee = /ApiReturn\w*\)\s*\(\s*["'`](\w+)["'`]/g;
|
|
58
|
+
let match;
|
|
59
|
+
while ((match = direct.exec(body)) !== null)
|
|
60
|
+
labels.push(match[1]);
|
|
61
|
+
while ((match = commaCallee.exec(body)) !== null)
|
|
62
|
+
labels.push(match[1]);
|
|
63
|
+
return labels;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=source-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-utils.js","sourceRoot":"","sources":["../src/source-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-bridge-cli.d.ts","sourceRoot":"","sources":["../../src/transport/remote-bridge-cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone bridge: `TARGET_WS_URL` → listen on `BRIDGE_PORT` (default 9339).
|
|
3
|
+
* Run after `npm run build` from package root:
|
|
4
|
+
* `node dist/transport/remote-bridge-cli.js`
|
|
5
|
+
*/
|
|
6
|
+
import { startRemoteInspectorBridge } from './remote-inspector-bridge.js';
|
|
7
|
+
const listenPort = Number(process.env.BRIDGE_PORT ?? '9339');
|
|
8
|
+
const targetWsUrl = process.env.TARGET_WS_URL ?? 'ws://127.0.0.1:9234';
|
|
9
|
+
const handle = await startRemoteInspectorBridge({ listenPort, targetWsUrl });
|
|
10
|
+
// eslint-disable-next-line no-console
|
|
11
|
+
console.log(`cat-inspector remote bridge listening ws://127.0.0.1:${handle.port} → ${targetWsUrl}`);
|
|
12
|
+
//# sourceMappingURL=remote-bridge-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-bridge-cli.js","sourceRoot":"","sources":["../../src/transport/remote-bridge-cli.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AAEzE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,CAAA;AAC5D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,qBAAqB,CAAA;AAEtE,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAA;AAC5E,sCAAsC;AACtC,OAAO,CAAC,GAAG,CACV,wDAAwD,MAAM,CAAC,IAAI,MAAM,WAAW,EAAE,CACtF,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface RemoteInspectorBridgeOptions {
|
|
2
|
+
/** Local port QA WebSocket clients connect to. */
|
|
3
|
+
listenPort: number;
|
|
4
|
+
listenHost?: string;
|
|
5
|
+
/** Target embedded inspector, e.g. `ws://127.0.0.1:9234?token=secret` */
|
|
6
|
+
targetWsUrl: string;
|
|
7
|
+
}
|
|
8
|
+
export interface RemoteInspectorBridgeHandle {
|
|
9
|
+
readonly port: number;
|
|
10
|
+
close(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Minimal WebSocket **duplex proxy** between a QA client and an existing
|
|
14
|
+
* `startInspectorWebSocket` endpoint. Forwards JSON frames as-is (`BOOTSTRAP`,
|
|
15
|
+
* `RPC_CALL` / `RPC_RESPONSE`, `QA_UPLOAD_*`, sessions, coverage, etc.).
|
|
16
|
+
*/
|
|
17
|
+
export declare function startRemoteInspectorBridge(options: RemoteInspectorBridgeOptions): Promise<RemoteInspectorBridgeHandle>;
|
|
18
|
+
//# sourceMappingURL=remote-inspector-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-inspector-bridge.d.ts","sourceRoot":"","sources":["../../src/transport/remote-inspector-bridge.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,4BAA4B;IAC5C,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACzC,OAAO,EAAE,4BAA4B,GACnC,OAAO,CAAC,2BAA2B,CAAC,CA+DtC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import WebSocket, { WebSocketServer } from 'ws';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal WebSocket **duplex proxy** between a QA client and an existing
|
|
4
|
+
* `startInspectorWebSocket` endpoint. Forwards JSON frames as-is (`BOOTSTRAP`,
|
|
5
|
+
* `RPC_CALL` / `RPC_RESPONSE`, `QA_UPLOAD_*`, sessions, coverage, etc.).
|
|
6
|
+
*/
|
|
7
|
+
export function startRemoteInspectorBridge(options) {
|
|
8
|
+
const host = options.listenHost ?? '127.0.0.1';
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
const wss = new WebSocketServer({ host, port: options.listenPort });
|
|
11
|
+
wss.on('connection', (client) => {
|
|
12
|
+
const upstream = new WebSocket(options.targetWsUrl);
|
|
13
|
+
const pending = [];
|
|
14
|
+
const flushPending = () => {
|
|
15
|
+
if (upstream.readyState !== WebSocket.OPEN)
|
|
16
|
+
return;
|
|
17
|
+
for (const chunk of pending)
|
|
18
|
+
upstream.send(chunk);
|
|
19
|
+
pending.length = 0;
|
|
20
|
+
};
|
|
21
|
+
client.on('message', (data) => {
|
|
22
|
+
const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
|
|
23
|
+
if (upstream.readyState === WebSocket.OPEN)
|
|
24
|
+
upstream.send(buf);
|
|
25
|
+
else
|
|
26
|
+
pending.push(buf);
|
|
27
|
+
});
|
|
28
|
+
upstream.on('open', () => {
|
|
29
|
+
flushPending();
|
|
30
|
+
upstream.on('message', (data) => {
|
|
31
|
+
if (client.readyState === WebSocket.OPEN)
|
|
32
|
+
client.send(data);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
const shutdownPair = () => {
|
|
36
|
+
try {
|
|
37
|
+
client.close();
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
/* ignore */
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
upstream.close();
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
/* ignore */
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
client.on('close', shutdownPair);
|
|
50
|
+
client.on('error', shutdownPair);
|
|
51
|
+
upstream.on('close', shutdownPair);
|
|
52
|
+
upstream.on('error', shutdownPair);
|
|
53
|
+
});
|
|
54
|
+
wss.on('listening', () => {
|
|
55
|
+
const addr = wss.address();
|
|
56
|
+
resolve({
|
|
57
|
+
port: addr.port,
|
|
58
|
+
close: () => new Promise((res, rej) => {
|
|
59
|
+
wss.close((err) => {
|
|
60
|
+
if (err)
|
|
61
|
+
rej(err);
|
|
62
|
+
else
|
|
63
|
+
res();
|
|
64
|
+
});
|
|
65
|
+
}),
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
wss.on('error', reject);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=remote-inspector-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-inspector-bridge.js","sourceRoot":"","sources":["../../src/transport/remote-inspector-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { Server, Socket } from 'socket.io';
|
|
2
|
+
import { type BootstrapOptions } from '../bootstrap.js';
|
|
3
|
+
import { createExpressPlaygroundMocks, type ExpressPlaygroundPayload } from '../express-playground-mocks.js';
|
|
4
|
+
import { type BootstrapStorageOptions } from '../bootstrap.js';
|
|
5
|
+
import type { RpcSerializationOptions } from '../serialize-rpc-result.js';
|
|
6
|
+
import { type QaFileWireMode, type QaMediaUploadTarget, type RegistryEntry, type RpcResponse } from '../types.js';
|
|
7
|
+
import type { FetchFileUrlOptions } from '../upload/fetch-file-url.js';
|
|
8
|
+
export declare const INSPECTOR_BROADCAST_EVENT = "inspector:broadcast";
|
|
9
|
+
export { INSPECTOR_SOCKET_ID_HEADER } from '../registry-state.js';
|
|
10
|
+
export type AttachCatRPCOptions = {
|
|
11
|
+
scanRoots: string[];
|
|
12
|
+
bootstrap?: Partial<Pick<BootstrapOptions, 'importEntryUrls' | 'getAllTsFilesOptions' | 'compilerOptions' | 'logLevel' | 'redactBodies' | 'expandParamTypes' | 'expandParamTypesOptions' | 'rpcSerialization' | 'storage' | 'invokeTimeoutMs' | 'qaFileWire' | 'qaMediaUpload' | 'fileUrl' | 'qaMediaUploadHostUploadUrl' | 'hostMinio' | 'upload'>>;
|
|
13
|
+
/** Merged into `bootstrap({ ... })` for catalog build; validated with `artifactThresholdBytes`. */
|
|
14
|
+
storage?: BootstrapStorageOptions;
|
|
15
|
+
/** Token bucket per Socket.IO `socket.id`. */
|
|
16
|
+
invokeRateLimit?: {
|
|
17
|
+
maxInvokesPerWindow: number;
|
|
18
|
+
windowMs: number;
|
|
19
|
+
};
|
|
20
|
+
/** Applied with catalog `bootstrap()` merge (same as `bootstrap.rpcSerialization`). */
|
|
21
|
+
rpcSerialization?: RpcSerializationOptions;
|
|
22
|
+
/** Same as `bootstrap.invokeTimeoutMs` when using embedded catalog bootstrap. */
|
|
23
|
+
invokeTimeoutMs?: number;
|
|
24
|
+
serverId?: string;
|
|
25
|
+
/** When false, HTTP-sourced inspector never reaches Socket.IO */
|
|
26
|
+
isDevelopment?: boolean;
|
|
27
|
+
forwardBroadcast?: boolean;
|
|
28
|
+
emitUnscopedBroadcasts?: boolean;
|
|
29
|
+
createExpressMocks?: typeof createExpressPlaygroundMocks;
|
|
30
|
+
hooks?: AttachCatRPCHooks;
|
|
31
|
+
upload?: {
|
|
32
|
+
enabled?: boolean;
|
|
33
|
+
maxSizeBytes?: number;
|
|
34
|
+
idleTimeoutMs?: number;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* When set and `isDevelopment` is false, RPC invokes require Socket.IO
|
|
38
|
+
* `auth.token` to match this string (see protocol-client / cat-demo web profiles).
|
|
39
|
+
*/
|
|
40
|
+
rpcAuth?: {
|
|
41
|
+
token: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* When set, merged into each emitted `catalog:bootstrap` (not part of AST fingerprint cache).
|
|
45
|
+
* Host should pass from env; never read env inside the SDK.
|
|
46
|
+
*/
|
|
47
|
+
secretApiKey?: string;
|
|
48
|
+
/** Overrides / supplements `bootstrap` for catalog + RPC materialize (same semantics as embedded WS). */
|
|
49
|
+
qaFileWire?: {
|
|
50
|
+
mode?: QaFileWireMode;
|
|
51
|
+
};
|
|
52
|
+
qaMediaUpload?: {
|
|
53
|
+
target: QaMediaUploadTarget;
|
|
54
|
+
};
|
|
55
|
+
fileUrl?: FetchFileUrlOptions;
|
|
56
|
+
qaMediaUploadHostUploadUrl?: string;
|
|
57
|
+
};
|
|
58
|
+
export type AttachCatRPCHooks = {
|
|
59
|
+
onConnection?: (socket: Socket) => void | Promise<void>;
|
|
60
|
+
onBeforeRpc?: (socket: Socket, raw: unknown) => Promise<RpcResponse | undefined>;
|
|
61
|
+
onAfterRpc?: (socket: Socket, requestId: string, response: RpcResponse) => void;
|
|
62
|
+
onCatalogError?: (socket: Socket, error: unknown) => void;
|
|
63
|
+
};
|
|
64
|
+
export type AttachCatRPCHandle = {
|
|
65
|
+
detach: () => void;
|
|
66
|
+
};
|
|
67
|
+
export declare function invokeExpressPlayground(requestId: string, fnKey: string, expressPayload: ExpressPlaygroundPayload, createMocks: typeof createExpressPlaygroundMocks): Promise<RpcResponse>;
|
|
68
|
+
export declare function resolveExpressCallableForInvoke(requestId: string, fnKey: string, entry: RegistryEntry, start: number): {
|
|
69
|
+
callable: (...args: unknown[]) => unknown;
|
|
70
|
+
callThis: unknown;
|
|
71
|
+
} | {
|
|
72
|
+
error: RpcResponse;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Register Socket.IO catalog + RPC playground handlers and optional broadcast bridge.
|
|
76
|
+
*/
|
|
77
|
+
export declare function attachCatRPC(io: Server, options: AttachCatRPCOptions): AttachCatRPCHandle;
|
|
78
|
+
//# sourceMappingURL=socket-io-playground.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-io-playground.d.ts","sourceRoot":"","sources":["../../src/transport/socket-io-playground.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAE/C,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElE,OAAO,EACN,4BAA4B,EAC5B,KAAK,wBAAwB,EAC7B,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAEN,KAAK,uBAAuB,EAC5B,MAAM,iBAAiB,CAAA;AAGxB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AA4BzE,OAAO,EAEN,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAElB,KAAK,WAAW,EAChB,MAAM,aAAa,CAAA;AAGpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAWtE,eAAO,MAAM,yBAAyB,wBAAwB,CAAA;AAE9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AAkBjE,MAAM,MAAM,mBAAmB,GAAG;IACjC,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAClB,IAAI,CACH,gBAAgB,EACd,iBAAiB,GACjB,sBAAsB,GACtB,iBAAiB,GACjB,UAAU,GACV,cAAc,GACd,kBAAkB,GAClB,yBAAyB,GACzB,kBAAkB,GAClB,SAAS,GACT,iBAAiB,GACjB,YAAY,GACZ,eAAe,GACf,SAAS,GACT,4BAA4B,GAC5B,WAAW,GACX,QAAQ,CACV,CACD,CAAA;IACD,mGAAmG;IACnG,OAAO,CAAC,EAAE,uBAAuB,CAAA;IACjC,8CAA8C;IAC9C,eAAe,CAAC,EAAE;QAAE,mBAAmB,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IACnE,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,uBAAuB,CAAA;IAC1C,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,kBAAkB,CAAC,EAAE,OAAO,4BAA4B,CAAA;IACxD,KAAK,CAAC,EAAE,iBAAiB,CAAA;IACzB,MAAM,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,aAAa,CAAC,EAAE,MAAM,CAAA;KACtB,CAAA;IACD;;;OAGG;IACH,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,yGAAyG;IACzG,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,cAAc,CAAA;KAAE,CAAA;IACtC,aAAa,CAAC,EAAE;QAAE,MAAM,EAAE,mBAAmB,CAAA;KAAE,CAAA;IAC/C,OAAO,CAAC,EAAE,mBAAmB,CAAA;IAC7B,0BAA0B,CAAC,EAAE,MAAM,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC/B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAA;IAChF,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAA;IAC/E,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACzD,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAChC,MAAM,EAAE,MAAM,IAAI,CAAA;CAClB,CAAA;AAwDD,wBAAsB,uBAAuB,CAC5C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,wBAAwB,EACxC,WAAW,EAAE,OAAO,4BAA4B,GAC9C,OAAO,CAAC,WAAW,CAAC,CAkItB;AAED,wBAAgB,+BAA+B,CAC9C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,MAAM,GAEX;IAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAChE;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CA+CxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CA2xBzF"}
|