feat(typedrouter): Add request/response hooks and monitoring to TypedRouter; emit hooks from TypedRequest; improve VirtualStream encoding/decoding; re-export hook types

This commit is contained in:
2025-12-04 21:37:08 +00:00
parent 1adb5629e4
commit 94ba38b4d4
5 changed files with 173 additions and 3 deletions

View File

@@ -1,11 +1,25 @@
import * as plugins from './plugins.js';
import { VirtualStream } from './classes.virtualstream.js';
import { TypedResponseError } from './classes.typedresponseerror.js';
import { TypedRouter } from './classes.typedrouter.js';
import { TypedRouter, type ITypedRequestLogEntry } from './classes.typedrouter.js';
import { TypedTarget } from './classes.typedtarget.js';
const webrequestInstance = new plugins.webrequest.WebRequest();
/**
* Helper to call global hooks from TypedRequest
*/
function callGlobalHook(
hookName: keyof typeof TypedRouter.globalHooks,
entry: ITypedRequestLogEntry
): void {
try {
TypedRouter.globalHooks[hookName]?.(entry);
} catch (err) {
console.error(`TypedRequest hook error (${hookName}):`, err);
}
}
export class TypedRequest<T extends plugins.typedRequestInterfaces.ITypedRequest> {
/**
* in case we post against a url endpoint
@@ -36,6 +50,8 @@ export class TypedRequest<T extends plugins.typedRequestInterfaces.ITypedRequest
* fires the request
*/
public async fire(fireArg: T['request'], useCacheArg: boolean = false): Promise<T['response']> {
const requestStartTime = Date.now();
let payloadSending: plugins.typedRequestInterfaces.ITypedRequest = {
method: this.method,
request: fireArg,
@@ -53,6 +69,16 @@ export class TypedRequest<T extends plugins.typedRequestInterfaces.ITypedRequest
}
});
// Hook: outgoing request
callGlobalHook('onOutgoingRequest', {
correlationId: payloadSending.correlation.id,
method: this.method,
direction: 'outgoing',
phase: 'request',
timestamp: requestStartTime,
payload: fireArg,
});
let payloadReceiving: plugins.typedRequestInterfaces.ITypedRequest;
payloadReceiving = await this.postTrObject(payloadSending, useCacheArg);
@@ -62,6 +88,19 @@ export class TypedRequest<T extends plugins.typedRequestInterfaces.ITypedRequest
return this.postTrObject(payloadArg) as Promise<plugins.typedRequestInterfaces.IStreamRequest>;
}
});
// Hook: incoming response (for this outgoing request)
callGlobalHook('onIncomingResponse', {
correlationId: payloadSending.correlation.id,
method: this.method,
direction: 'incoming',
phase: 'response',
timestamp: Date.now(),
durationMs: Date.now() - requestStartTime,
payload: payloadReceiving?.response,
error: payloadReceiving?.error?.text,
});
return payloadReceiving.response;
}