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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user