@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,102 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { ActiveContext, ApiContext, ErrorCapture, Registry, registerClassConstructor, broadcastErrorThrown, } from '../registry-state.js';
|
|
3
|
+
import { extractParamNames, extractApiReturnLabels, getFunctionBody, extractReturnLabels, extractThrowLabels, } from '../source-utils.js';
|
|
4
|
+
export function Cat(target, key, descriptor) {
|
|
5
|
+
const fn = descriptor.value;
|
|
6
|
+
const ctor = target.constructor;
|
|
7
|
+
const className = ctor.name ?? '';
|
|
8
|
+
const fnKey = `${className}.${key}`;
|
|
9
|
+
if (className)
|
|
10
|
+
registerClassConstructor(className, ctor);
|
|
11
|
+
const body = getFunctionBody(fn);
|
|
12
|
+
const paramMeta = Reflect.getMetadata('design:paramtypes', target, key) ?? [];
|
|
13
|
+
const returnMeta = Reflect.getMetadata('design:returntype', target, key);
|
|
14
|
+
const staticLabels = extractReturnLabels(body);
|
|
15
|
+
const staticThrowLabels = extractThrowLabels(body);
|
|
16
|
+
const staticApiReturnLabels = extractApiReturnLabels(body);
|
|
17
|
+
const paramTypeNames = paramMeta.map((t) => t?.name ?? 'unknown');
|
|
18
|
+
const isApiCandidate = paramTypeNames.includes('Request') && paramTypeNames.includes('Response');
|
|
19
|
+
Registry.set(fnKey, {
|
|
20
|
+
mode: isApiCandidate ? 'api_candidate' : 'service',
|
|
21
|
+
className,
|
|
22
|
+
method: key,
|
|
23
|
+
style: 'class',
|
|
24
|
+
body,
|
|
25
|
+
params: extractParamNames(fn).map((name, i) => ({
|
|
26
|
+
name,
|
|
27
|
+
type: paramMeta[i]?.name ?? 'unknown',
|
|
28
|
+
})),
|
|
29
|
+
declaredReturn: returnMeta?.name ?? 'void',
|
|
30
|
+
returns: staticLabels.map((label) => ({
|
|
31
|
+
label,
|
|
32
|
+
type: null,
|
|
33
|
+
status: 'pending',
|
|
34
|
+
})),
|
|
35
|
+
errors: staticThrowLabels.map((label) => ({
|
|
36
|
+
label,
|
|
37
|
+
type: null,
|
|
38
|
+
message: null,
|
|
39
|
+
status: 'pending',
|
|
40
|
+
})),
|
|
41
|
+
children: [],
|
|
42
|
+
parents: [],
|
|
43
|
+
route: null,
|
|
44
|
+
httpMethod: null,
|
|
45
|
+
apiResponses: staticApiReturnLabels.map((label) => ({
|
|
46
|
+
label,
|
|
47
|
+
statusCode: null,
|
|
48
|
+
bodyShape: null,
|
|
49
|
+
status: 'pending',
|
|
50
|
+
})),
|
|
51
|
+
serviceLinks: [],
|
|
52
|
+
pipelineId: null,
|
|
53
|
+
pipelineIndex: null,
|
|
54
|
+
originalFn: fn,
|
|
55
|
+
});
|
|
56
|
+
const original = fn;
|
|
57
|
+
const isThenable = (v) => Boolean(v && typeof v.then === 'function');
|
|
58
|
+
const wrapped = function (...args) {
|
|
59
|
+
const entry = Registry.get(fnKey);
|
|
60
|
+
const isApi = entry?.mode === 'api';
|
|
61
|
+
const clearContext = () => {
|
|
62
|
+
if (isApi)
|
|
63
|
+
ApiContext.clear();
|
|
64
|
+
else
|
|
65
|
+
ActiveContext.pop();
|
|
66
|
+
};
|
|
67
|
+
if (isApi)
|
|
68
|
+
ApiContext.set(fnKey);
|
|
69
|
+
else
|
|
70
|
+
ActiveContext.push(fnKey);
|
|
71
|
+
let out;
|
|
72
|
+
try {
|
|
73
|
+
out = original.apply(this, args);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (err instanceof Error && !ErrorCapture.hasCurrent()) {
|
|
77
|
+
ErrorCapture.capture('UNEXPECTED_ERROR', err);
|
|
78
|
+
broadcastErrorThrown({
|
|
79
|
+
event: 'ERROR_THROWN',
|
|
80
|
+
fnKey,
|
|
81
|
+
label: 'UNEXPECTED_ERROR',
|
|
82
|
+
layer: 'unexpected',
|
|
83
|
+
message: err.message,
|
|
84
|
+
stack: err.stack ?? null,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
clearContext();
|
|
88
|
+
throw err;
|
|
89
|
+
}
|
|
90
|
+
if (isThenable(out)) {
|
|
91
|
+
return Promise.resolve(out).finally(clearContext);
|
|
92
|
+
}
|
|
93
|
+
clearContext();
|
|
94
|
+
return out;
|
|
95
|
+
};
|
|
96
|
+
descriptor.value = wrapped;
|
|
97
|
+
const entry = Registry.get(fnKey);
|
|
98
|
+
if (entry)
|
|
99
|
+
entry.originalFn = wrapped;
|
|
100
|
+
return descriptor;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=cat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cat.js","sourceRoot":"","sources":["../../src/decorators/cat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RequestHandler } from 'express';
|
|
2
|
+
import type { InspectorBroadcastSource } from './registry-state.js';
|
|
3
|
+
/**
|
|
4
|
+
* Non-enumerable request metadata so HTTP inspector broadcasts stay correlated when
|
|
5
|
+
* middleware defers `next()` (multipart parsers, microtasks, etc.) and AsyncLocalStorage
|
|
6
|
+
* from an outer scope is no longer active.
|
|
7
|
+
*/
|
|
8
|
+
export declare const INSPECTOR_HTTP_META: unique symbol;
|
|
9
|
+
export type InspectorHttpRequestMeta = {
|
|
10
|
+
socketId: string;
|
|
11
|
+
correlationId: string;
|
|
12
|
+
source: Extract<InspectorBroadcastSource, 'http'>;
|
|
13
|
+
};
|
|
14
|
+
export declare function attachInspectorHttpMeta(req: object, meta: InspectorHttpRequestMeta): void;
|
|
15
|
+
/** Read metadata attached by {@link createInspectorCorrelationMiddleware}. */
|
|
16
|
+
export declare function readInspectorHttpMeta(req: unknown): InspectorHttpRequestMeta | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* When `X-Socket-Id` is present, attaches per-request inspector metadata on `req` so
|
|
19
|
+
* {@link registerCatPipeline} can re-enter `runWithInspectorBroadcastTarget` for each
|
|
20
|
+
* wrapped handler (survives deferred `next()` and async gaps). Does not wrap `next()` in ALS.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createInspectorCorrelationMiddleware(): RequestHandler;
|
|
23
|
+
//# sourceMappingURL=express-inspector-correlation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-inspector-correlation.d.ts","sourceRoot":"","sources":["../src/express-inspector-correlation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,SAAS,CAAA;AAItD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAGnE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,eAA4C,CAAA;AAE5E,MAAM,MAAM,wBAAwB,GAAG;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAA;CACjD,CAAA;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAOzF;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,GAAG,SAAS,CAUxF;AAED;;;;GAIG;AACH,wBAAgB,oCAAoC,IAAI,cAAc,CAWrE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { readInspectorSocketIdFromHeaders } from './registry-state.js';
|
|
3
|
+
/**
|
|
4
|
+
* Non-enumerable request metadata so HTTP inspector broadcasts stay correlated when
|
|
5
|
+
* middleware defers `next()` (multipart parsers, microtasks, etc.) and AsyncLocalStorage
|
|
6
|
+
* from an outer scope is no longer active.
|
|
7
|
+
*/
|
|
8
|
+
export const INSPECTOR_HTTP_META = Symbol.for('@gloocan/cat-inspector-http');
|
|
9
|
+
export function attachInspectorHttpMeta(req, meta) {
|
|
10
|
+
Object.defineProperty(req, INSPECTOR_HTTP_META, {
|
|
11
|
+
value: meta,
|
|
12
|
+
enumerable: false,
|
|
13
|
+
writable: true,
|
|
14
|
+
configurable: true,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/** Read metadata attached by {@link createInspectorCorrelationMiddleware}. */
|
|
18
|
+
export function readInspectorHttpMeta(req) {
|
|
19
|
+
if (!req || typeof req !== 'object')
|
|
20
|
+
return undefined;
|
|
21
|
+
const v = req[INSPECTOR_HTTP_META];
|
|
22
|
+
if (!v || typeof v !== 'object')
|
|
23
|
+
return undefined;
|
|
24
|
+
const o = v;
|
|
25
|
+
const socketId = typeof o.socketId === 'string' ? o.socketId : '';
|
|
26
|
+
const correlationId = typeof o.correlationId === 'string' ? o.correlationId : '';
|
|
27
|
+
if (!socketId.trim() || !correlationId.trim())
|
|
28
|
+
return undefined;
|
|
29
|
+
if (o.source !== 'http')
|
|
30
|
+
return undefined;
|
|
31
|
+
return { socketId, correlationId, source: 'http' };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* When `X-Socket-Id` is present, attaches per-request inspector metadata on `req` so
|
|
35
|
+
* {@link registerCatPipeline} can re-enter `runWithInspectorBroadcastTarget` for each
|
|
36
|
+
* wrapped handler (survives deferred `next()` and async gaps). Does not wrap `next()` in ALS.
|
|
37
|
+
*/
|
|
38
|
+
export function createInspectorCorrelationMiddleware() {
|
|
39
|
+
return (req, _res, next) => {
|
|
40
|
+
const id = readInspectorSocketIdFromHeaders(req.headers);
|
|
41
|
+
if (!id) {
|
|
42
|
+
next();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const correlationId = randomUUID();
|
|
46
|
+
attachInspectorHttpMeta(req, { socketId: id, correlationId, source: 'http' });
|
|
47
|
+
next();
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=express-inspector-correlation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-inspector-correlation.js","sourceRoot":"","sources":["../src/express-inspector-correlation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC,OAAO,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAA;AAEtE;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;AAQ5E,MAAM,UAAU,uBAAuB,CAAC,GAAW,EAAE,IAA8B;IAClF,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,mBAAmB,EAAE;QAC/C,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,IAAI;KAClB,CAAC,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,qBAAqB,CAAC,GAAY;IACjD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IACrD,MAAM,CAAC,GAAI,GAA+B,CAAC,mBAAmB,CAAC,CAAA;IAC/D,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IACjD,MAAM,CAAC,GAAG,CAA4B,CAAA;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;IACjE,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAA;IAChF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;QAAE,OAAO,SAAS,CAAA;IAC/D,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,SAAS,CAAA;IACzC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oCAAoC;IACnD,OAAO,CAAC,GAAY,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACnC,MAAM,EAAE,GAAG,gCAAgC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACxD,IAAI,CAAC,EAAE,EAAE,CAAC;YACT,IAAI,EAAE,CAAA;YACN,OAAM;QACP,CAAC;QACD,MAAM,aAAa,GAAG,UAAU,EAAE,CAAA;QAClC,uBAAuB,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QAC7E,IAAI,EAAE,CAAA;IACP,CAAC,CAAA;AACF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { NextFunction, Request, Response } from 'express';
|
|
2
|
+
export type ExpressPlaygroundPayload = {
|
|
3
|
+
headers?: Record<string, string>;
|
|
4
|
+
body?: unknown;
|
|
5
|
+
method?: string;
|
|
6
|
+
path?: string;
|
|
7
|
+
/** Optional: attach a single file (multer-like) */
|
|
8
|
+
file?: unknown;
|
|
9
|
+
/** Optional: attach multiple files by field name (multer-like) */
|
|
10
|
+
files?: unknown;
|
|
11
|
+
};
|
|
12
|
+
export type ExpressPlaygroundCapture = {
|
|
13
|
+
statusCode: number | null;
|
|
14
|
+
body: unknown;
|
|
15
|
+
nextCalled: boolean;
|
|
16
|
+
nextError: unknown | null;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Minimal req/res/next for exercising Cat Express handlers over Socket.IO.
|
|
20
|
+
* Headers should use lower-case keys where possible (Express normalizes).
|
|
21
|
+
*/
|
|
22
|
+
export declare function createExpressPlaygroundMocks(payload: ExpressPlaygroundPayload): {
|
|
23
|
+
req: Request;
|
|
24
|
+
res: Response;
|
|
25
|
+
next: NextFunction;
|
|
26
|
+
getCapture: () => ExpressPlaygroundCapture;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=express-playground-mocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-playground-mocks.d.ts","sourceRoot":"","sources":["../src/express-playground-mocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAE9D,MAAM,MAAM,wBAAwB,GAAG;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,kEAAkE;IAClE,KAAK,CAAC,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACtC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAA;CACzB,CAAA;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC3C,OAAO,EAAE,wBAAwB,GAC/B;IACF,GAAG,EAAE,OAAO,CAAA;IACZ,GAAG,EAAE,QAAQ,CAAA;IACb,IAAI,EAAE,YAAY,CAAA;IAClB,UAAU,EAAE,MAAM,wBAAwB,CAAA;CAC1C,CAsDA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal req/res/next for exercising Cat Express handlers over Socket.IO.
|
|
3
|
+
* Headers should use lower-case keys where possible (Express normalizes).
|
|
4
|
+
*/
|
|
5
|
+
export function createExpressPlaygroundMocks(payload) {
|
|
6
|
+
const headers = {};
|
|
7
|
+
for (const [k, v] of Object.entries(payload.headers ?? {})) {
|
|
8
|
+
headers[k.toLowerCase()] = String(v);
|
|
9
|
+
}
|
|
10
|
+
let statusCode = null;
|
|
11
|
+
let body = undefined;
|
|
12
|
+
const res = {
|
|
13
|
+
status(code) {
|
|
14
|
+
statusCode = code;
|
|
15
|
+
return res;
|
|
16
|
+
},
|
|
17
|
+
json(obj) {
|
|
18
|
+
body = obj;
|
|
19
|
+
return res;
|
|
20
|
+
},
|
|
21
|
+
send(data) {
|
|
22
|
+
body = data;
|
|
23
|
+
return res;
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
let nextCalled = false;
|
|
27
|
+
let nextError = null;
|
|
28
|
+
const next = ((err) => {
|
|
29
|
+
nextCalled = true;
|
|
30
|
+
nextError = err === undefined ? null : err;
|
|
31
|
+
});
|
|
32
|
+
const req = {
|
|
33
|
+
headers,
|
|
34
|
+
body: payload.body,
|
|
35
|
+
file: payload.file,
|
|
36
|
+
files: payload.files,
|
|
37
|
+
method: payload.method ?? 'POST',
|
|
38
|
+
path: payload.path ?? '/api/run',
|
|
39
|
+
header(name) {
|
|
40
|
+
return headers[name.toLowerCase()];
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
return {
|
|
44
|
+
req,
|
|
45
|
+
res,
|
|
46
|
+
next,
|
|
47
|
+
getCapture: () => ({
|
|
48
|
+
statusCode,
|
|
49
|
+
body,
|
|
50
|
+
nextCalled,
|
|
51
|
+
nextError,
|
|
52
|
+
}),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=express-playground-mocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-playground-mocks.js","sourceRoot":"","sources":["../src/express-playground-mocks.ts"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC3C,OAAiC;IAOjC,MAAM,OAAO,GAA2B,EAAE,CAAA;IAC1C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC;IAED,IAAI,UAAU,GAAkB,IAAI,CAAA;IACpC,IAAI,IAAI,GAAY,SAAS,CAAA;IAE7B,MAAM,GAAG,GAAG;QACX,MAAM,CAAC,IAAY;YAClB,UAAU,GAAG,IAAI,CAAA;YACjB,OAAO,GAAG,CAAA;QACX,CAAC;QACD,IAAI,CAAC,GAAY;YAChB,IAAI,GAAG,GAAG,CAAA;YACV,OAAO,GAAG,CAAA;QACX,CAAC;QACD,IAAI,CAAC,IAAa;YACjB,IAAI,GAAG,IAAI,CAAA;YACX,OAAO,GAAG,CAAA;QACX,CAAC;KACsB,CAAA;IAExB,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,IAAI,SAAS,GAAY,IAAI,CAAA;IAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAa,EAAE,EAAE;QAC/B,UAAU,GAAG,IAAI,CAAA;QACjB,SAAS,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;IAC3C,CAAC,CAAiB,CAAA;IAElB,MAAM,GAAG,GAAG;QACX,OAAO;QACP,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,UAAU;QAChC,MAAM,CAAC,IAAY;YAClB,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACnC,CAAC;KACqB,CAAA;IAEvB,OAAO;QACN,GAAG;QACH,GAAG;QACH,IAAI;QACJ,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YAClB,UAAU;YACV,IAAI;YACJ,UAAU;YACV,SAAS;SACT,CAAC;KACF,CAAA;AACF,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import type { HostMinioOptions } from './bootstrap.js';
|
|
3
|
+
export { parseHostMinioEndpoint } from './upload/host-minio-client.js';
|
|
4
|
+
export type CreateQaHostMinioUploadRouterOptions = {
|
|
5
|
+
maxFileBytes?: number;
|
|
6
|
+
/** POST path relative to where the router is mounted (default `/upload`). */
|
|
7
|
+
uploadPath?: string;
|
|
8
|
+
getUrlExpirySeconds?: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Express router: `POST` multipart field `file` → Minio `putObject` + `presignedGetObject` → JSON `{ getUrl }`.
|
|
12
|
+
* Mount with `app.use('/api/qa-host-media', router)` and set bootstrap `qaMediaUploadHostUploadUrl` to
|
|
13
|
+
* `http(s)://<public-host>:<port>/api/qa-host-media/upload` (match `uploadPath`).
|
|
14
|
+
*/
|
|
15
|
+
export declare function createQaHostMinioUploadRouter(hostMinio: HostMinioOptions, opts?: CreateQaHostMinioUploadRouterOptions): Router;
|
|
16
|
+
//# sourceMappingURL=express-qa-host-minio-upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-qa-host-minio-upload.d.ts","sourceRoot":"","sources":["../src/express-qa-host-minio-upload.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAGhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAGtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAEtE,MAAM,MAAM,oCAAoC,GAAG;IAClD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC5C,SAAS,EAAE,gBAAgB,EAC3B,IAAI,GAAE,oCAAyC,GAC7C,MAAM,CAqDR"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { Router } from 'express';
|
|
3
|
+
import multer from 'multer';
|
|
4
|
+
import { createMinioClientFromHostMinio } from './upload/host-minio-client.js';
|
|
5
|
+
export { parseHostMinioEndpoint } from './upload/host-minio-client.js';
|
|
6
|
+
/**
|
|
7
|
+
* Express router: `POST` multipart field `file` → Minio `putObject` + `presignedGetObject` → JSON `{ getUrl }`.
|
|
8
|
+
* Mount with `app.use('/api/qa-host-media', router)` and set bootstrap `qaMediaUploadHostUploadUrl` to
|
|
9
|
+
* `http(s)://<public-host>:<port>/api/qa-host-media/upload` (match `uploadPath`).
|
|
10
|
+
*/
|
|
11
|
+
export function createQaHostMinioUploadRouter(hostMinio, opts = {}) {
|
|
12
|
+
const maxFileBytes = opts.maxFileBytes ?? 50 * 1024 * 1024;
|
|
13
|
+
const rawPath = opts.uploadPath ?? '/upload';
|
|
14
|
+
const uploadPath = rawPath.startsWith('/') ? rawPath : `/${rawPath}`;
|
|
15
|
+
const getExp = opts.getUrlExpirySeconds ?? 24 * 60 * 60;
|
|
16
|
+
const upload = multer({
|
|
17
|
+
storage: multer.memoryStorage(),
|
|
18
|
+
limits: { fileSize: maxFileBytes },
|
|
19
|
+
});
|
|
20
|
+
const router = Router();
|
|
21
|
+
router.post(uploadPath, (req, res, next) => {
|
|
22
|
+
upload.single('file')(req, res, (err) => {
|
|
23
|
+
if (err instanceof multer.MulterError &&
|
|
24
|
+
err.code === 'LIMIT_FILE_SIZE') {
|
|
25
|
+
res.status(413).json({ error: 'file too large' });
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
next(err);
|
|
29
|
+
});
|
|
30
|
+
}, async (req, res, next) => {
|
|
31
|
+
try {
|
|
32
|
+
const file = req.file;
|
|
33
|
+
if (!file?.buffer) {
|
|
34
|
+
res.status(400).json({ error: 'missing file' });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const client = createMinioClientFromHostMinio(hostMinio);
|
|
38
|
+
const objectKey = `qa/${Date.now()}-${randomUUID()}`;
|
|
39
|
+
const contentType = file.mimetype || 'application/octet-stream';
|
|
40
|
+
await client.putObject(hostMinio.bucket, objectKey, file.buffer, file.size, {
|
|
41
|
+
'Content-Type': contentType,
|
|
42
|
+
});
|
|
43
|
+
const getUrl = await client.presignedGetObject(hostMinio.bucket, objectKey, getExp);
|
|
44
|
+
res.json({ getUrl });
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
next(e);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
router.use((err, _req, res, _next) => {
|
|
51
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
52
|
+
res.status(503).json({ error: msg });
|
|
53
|
+
});
|
|
54
|
+
return router;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=express-qa-host-minio-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-qa-host-minio-upload.js","sourceRoot":"","sources":["../src/express-qa-host-minio-upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Express, NextFunction, Request, Response, Router } from 'express';
|
|
2
|
+
export type HttpMethod = 'get' | 'post' | 'put' | 'delete' | 'patch';
|
|
3
|
+
export declare function pipelineIdForRoute(method: string, route: string): string;
|
|
4
|
+
export declare function registerCatPipeline(router: Router, method: HttpMethod, route: string, handlers: readonly ((...args: any[]) => any)[]): void;
|
|
5
|
+
export declare function createCorrelationMiddleware(): (req: Request, res: Response, next: NextFunction) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Run one in-process HTTP request against an Express `app` (local `127.0.0.1` ephemeral port).
|
|
8
|
+
* Useful for QA / tests that need real `req`/`res` middleware without deploying.
|
|
9
|
+
*/
|
|
10
|
+
export declare function invokeExpressSynthetic(app: Express, opts: {
|
|
11
|
+
method: HttpMethod;
|
|
12
|
+
path: string;
|
|
13
|
+
headers?: Record<string, string>;
|
|
14
|
+
body?: unknown;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
statusCode: number;
|
|
17
|
+
headers: Record<string, string>;
|
|
18
|
+
bodyText: string;
|
|
19
|
+
bodyJson: unknown;
|
|
20
|
+
}>;
|
|
21
|
+
//# sourceMappingURL=express.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAS/E,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,GAC5C,IAAI,CA0FN;AAED,wBAAgB,2BAA2B,IAAI,CAC9C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,KACd,IAAI,CAmBR;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC3C,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE;IACL,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,GACC,OAAO,CAAC;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CACjB,CAAC,CA6CD"}
|
package/dist/express.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import { readInspectorHttpMeta } from './express-inspector-correlation.js';
|
|
3
|
+
import { ApiContext, Registry, runWithInspectorBroadcastTarget, runWithProducerFnKey } from './registry-state.js';
|
|
4
|
+
function isThenable(v) {
|
|
5
|
+
return Boolean(v && typeof v.then === 'function');
|
|
6
|
+
}
|
|
7
|
+
export function pipelineIdForRoute(method, route) {
|
|
8
|
+
return `${method.toUpperCase()} ${route}`;
|
|
9
|
+
}
|
|
10
|
+
export function registerCatPipeline(router, method, route, handlers) {
|
|
11
|
+
const pid = pipelineIdForRoute(method, route);
|
|
12
|
+
const endpointHandler = handlers[handlers.length - 1];
|
|
13
|
+
let endpointFnKey = null;
|
|
14
|
+
handlers.forEach((handler, index) => {
|
|
15
|
+
if (typeof handler !== 'function')
|
|
16
|
+
return;
|
|
17
|
+
const isLast = index === handlers.length - 1;
|
|
18
|
+
Registry.forEach((entry) => {
|
|
19
|
+
if (entry.originalFn === handler &&
|
|
20
|
+
(entry.mode === 'api_candidate' || entry.mode === 'api')) {
|
|
21
|
+
entry.route = route;
|
|
22
|
+
entry.httpMethod = method.toUpperCase();
|
|
23
|
+
entry.pipelineId = pid;
|
|
24
|
+
entry.pipelineIndex = index;
|
|
25
|
+
// In a pipeline, treat the final handler as the endpoint ("api"),
|
|
26
|
+
// and prior handlers as middleware ("api_candidate").
|
|
27
|
+
entry.mode = isLast ? 'api' : 'api_candidate';
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
if (handler === endpointHandler) {
|
|
31
|
+
for (const [k, e] of Registry.entries()) {
|
|
32
|
+
if (e.originalFn === handler) {
|
|
33
|
+
endpointFnKey = k;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
const wrapped = handlers.map((handler) => {
|
|
40
|
+
if (typeof handler !== 'function')
|
|
41
|
+
return handler;
|
|
42
|
+
let fnKey = null;
|
|
43
|
+
for (const [k, e] of Registry.entries()) {
|
|
44
|
+
if (e.originalFn === handler) {
|
|
45
|
+
fnKey = k;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return function wrappedPipelineHandler(...args) {
|
|
50
|
+
const req = args[0];
|
|
51
|
+
const res = args[1];
|
|
52
|
+
const next = args[2];
|
|
53
|
+
const runInner = () => {
|
|
54
|
+
// Ensure ApiReturn broadcasts are correlated to the endpoint for HTTP requests.
|
|
55
|
+
if (endpointFnKey)
|
|
56
|
+
ApiContext.set(endpointFnKey);
|
|
57
|
+
return runWithProducerFnKey(fnKey, () => {
|
|
58
|
+
if (typeof next !== 'function') {
|
|
59
|
+
// Express route handler (req,res) style
|
|
60
|
+
return handler.apply(this, args);
|
|
61
|
+
}
|
|
62
|
+
const wrappedNext = (...nextArgs) => {
|
|
63
|
+
return next(...nextArgs);
|
|
64
|
+
};
|
|
65
|
+
return handler.call(this, req, res, wrappedNext);
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
const runWithHttpInspector = () => {
|
|
69
|
+
const meta = req ? readInspectorHttpMeta(req) : undefined;
|
|
70
|
+
if (meta) {
|
|
71
|
+
return runWithInspectorBroadcastTarget(meta.socketId, runInner, {
|
|
72
|
+
source: 'http',
|
|
73
|
+
correlationId: meta.correlationId,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return runInner();
|
|
77
|
+
};
|
|
78
|
+
try {
|
|
79
|
+
const out = runWithHttpInspector();
|
|
80
|
+
if (isThenable(out)) {
|
|
81
|
+
return Promise.resolve(out).finally(() => {
|
|
82
|
+
ApiContext.clear();
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
ApiContext.clear();
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
ApiContext.clear();
|
|
90
|
+
throw err;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
router[method](route, ...wrapped);
|
|
95
|
+
}
|
|
96
|
+
export function createCorrelationMiddleware() {
|
|
97
|
+
return function correlationMiddleware(req, res, next) {
|
|
98
|
+
const header = req.header('x-correlation-id') ?? req.header('x-request-id') ?? undefined;
|
|
99
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
100
|
+
const r = req;
|
|
101
|
+
if (r.correlationId === undefined)
|
|
102
|
+
r.correlationId = header ?? `${Date.now()}`;
|
|
103
|
+
if (!res.headersSent) {
|
|
104
|
+
try {
|
|
105
|
+
res.setHeader('X-Correlation-Id', String(r.correlationId));
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// ignore
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
next();
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Run one in-process HTTP request against an Express `app` (local `127.0.0.1` ephemeral port).
|
|
116
|
+
* Useful for QA / tests that need real `req`/`res` middleware without deploying.
|
|
117
|
+
*/
|
|
118
|
+
export async function invokeExpressSynthetic(app, opts) {
|
|
119
|
+
const server = http.createServer(app);
|
|
120
|
+
await new Promise((resolve, reject) => {
|
|
121
|
+
server.once('error', reject);
|
|
122
|
+
server.listen(0, '127.0.0.1', () => resolve());
|
|
123
|
+
});
|
|
124
|
+
const addr = server.address();
|
|
125
|
+
const port = addr.port;
|
|
126
|
+
const path = opts.path.startsWith('/') ? opts.path : `/${opts.path}`;
|
|
127
|
+
const url = `http://127.0.0.1:${port}${path}`;
|
|
128
|
+
try {
|
|
129
|
+
const method = opts.method.toUpperCase();
|
|
130
|
+
const headers = new Headers();
|
|
131
|
+
for (const [k, v] of Object.entries(opts.headers ?? {})) {
|
|
132
|
+
headers.set(k, v);
|
|
133
|
+
}
|
|
134
|
+
const init = { method, headers };
|
|
135
|
+
if (opts.body !== undefined && method !== 'GET' && method !== 'HEAD') {
|
|
136
|
+
if (!headers.has('content-type')) {
|
|
137
|
+
headers.set('content-type', 'application/json');
|
|
138
|
+
}
|
|
139
|
+
init.body = JSON.stringify(opts.body);
|
|
140
|
+
}
|
|
141
|
+
const resp = await fetch(url, init);
|
|
142
|
+
const bodyText = await resp.text();
|
|
143
|
+
let bodyJson = bodyText;
|
|
144
|
+
if (bodyText) {
|
|
145
|
+
try {
|
|
146
|
+
bodyJson = JSON.parse(bodyText);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
bodyJson = bodyText;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
bodyJson = null;
|
|
154
|
+
}
|
|
155
|
+
const outHeaders = {};
|
|
156
|
+
resp.headers.forEach((v, k) => {
|
|
157
|
+
outHeaders[k] = v;
|
|
158
|
+
});
|
|
159
|
+
return { statusCode: resp.status, headers: outHeaders, bodyText, bodyJson };
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
await new Promise((resolve, reject) => {
|
|
163
|
+
server.close((err) => (err ? reject(err) : resolve()));
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface CatFunctionOptions {
|
|
2
|
+
method?: string;
|
|
3
|
+
route?: string;
|
|
4
|
+
/**
|
|
5
|
+
* Optional manual type hints (fallback when AST scan isn't run).
|
|
6
|
+
* If provided, overrides default 'unknown' registration types.
|
|
7
|
+
*/
|
|
8
|
+
params?: import('./types.js').RegistryParam[];
|
|
9
|
+
declaredReturn?: string;
|
|
10
|
+
/** Optional JSON Schema (draft-07 subset) for the entire positional args array when `validateParamsJsonSchema` is enabled. */
|
|
11
|
+
paramsJsonSchema?: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export declare function cat<T extends (...args: any[]) => any>(fnKey: string, fn: T, options?: CatFunctionOptions): T;
|
|
14
|
+
export declare function catModule<T extends Record<string, (...args: any[]) => any>>(moduleName: string, fns: T, options?: Record<string, Pick<CatFunctionOptions, 'params' | 'declaredReturn' | 'paramsJsonSchema'>>): T;
|
|
15
|
+
//# sourceMappingURL=functional.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functional.d.ts","sourceRoot":"","sources":["../src/functional.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,kBAAkB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,YAAY,EAAE,aAAa,EAAE,CAAA;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,8HAA8H;IAC9H,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C;AAyID,wBAAgB,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACpD,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,EACL,OAAO,CAAC,EAAE,kBAAkB,GAC1B,CAAC,CA6BH;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAC1E,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,CAAC,EACN,OAAO,CAAC,EAAE,MAAM,CACf,MAAM,EACN,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,gBAAgB,GAAG,kBAAkB,CAAC,CAC1E,GACC,CAAC,CA6BH"}
|