@comake/skl-js-engine
Version:
Standard Knowledge Language Javascript Engine
84 lines (73 loc) • 2.48 kB
text/typescript
import { EventEmitter } from 'node:events';
import { Logger } from '../../../logger';
import type { MessageHandler, Transport, TransportConfig, TransportEvents } from '../Transport';
import { TransportStatus } from '../Transport';
/**
* Base transport class providing common functionality for all transport implementations
*/
export abstract class BaseTransport extends EventEmitter implements Transport {
protected internalStatus: TransportStatus = TransportStatus.disconnected;
protected messageHandler?: MessageHandler;
protected name?: string;
public readonly logger = Logger.getInstance();
public constructor() {
super();
}
/**
* Set a name for this transport (used in logging)
*/
public setName(name: string): void {
this.name = name;
this.logger.setMetadata({ name, transport: this.constructor.name });
}
/**
* Get current transport status
*/
public get status(): TransportStatus {
return this.internalStatus;
}
/**
* Register a message handler for incoming messages
*/
public onMessage<T>(handler: MessageHandler<T>): void {
this.messageHandler = handler;
}
/**
* Register an event listener
*/
public on<TKey extends keyof TransportEvents>(event: TKey, handler: TransportEvents[TKey]): this {
return super.on(event, handler);
}
/**
* Remove an event listener
*/
public off<TKey extends keyof TransportEvents>(event: TKey, handler: TransportEvents[TKey]): this {
return super.off(event, handler);
}
/**
* Set transport status and emit event
*/
protected setStatus(status: TransportStatus): void {
if (this.internalStatus !== status) {
const previousStatus = this.internalStatus;
this.internalStatus = status;
this.logger.log(`Transport status changed: ${previousStatus} -> ${status}`);
this.emit('statusChange', status);
}
}
/**
* Handle errors and emit error events
*/
public handleError(error: Error, context?: string): void {
const errorMessage = context ? `${context}: ${error.message}` : error.message;
this.logger.error(errorMessage, error);
this.emit('error', error);
}
/**
* Abstract methods to be implemented by concrete transport classes
*/
public abstract initialize(config?: TransportConfig): Promise<void>;
public abstract send<TRequest, TResponse>(message: TRequest): Promise<TResponse>;
public abstract close(): Promise<void>;
public abstract isReady(): boolean;
}