import { MessageListenerCallback, PersonaAgentContext, PersonaPacket, PersonaProtocol, PersonaTransaction, ProtocolStatus, Session, StatusChangeCallback, } from '../types'; abstract class PersonaProtocolBase implements PersonaProtocol { abstract status: ProtocolStatus; abstract session: Session; abstract autostart: boolean; private statusChangeCallbacks: StatusChangeCallback[] = []; private messageCallbacks: MessageListenerCallback[] = []; public addStatusChangeListener(callback: StatusChangeCallback) { this.statusChangeCallbacks.push(callback); } public addPacketListener(callback: MessageListenerCallback) { this.messageCallbacks.push(callback); } public async syncSession(session: Session): Promise { this.session = session; } public async notifyPacket(message: PersonaPacket): Promise { this.messageCallbacks.forEach((callback) => callback(message)); } public async notifyPackets(messages: PersonaPacket[]): Promise { messages.forEach((message) => { this.messageCallbacks.forEach((callback) => callback(message)); }); } public async setSession(session: Session): Promise { this.session = session; } public async setStatus(status: ProtocolStatus): Promise { const notify = this.status !== status; this.status = status; if (!notify) { return; } this.statusChangeCallbacks.forEach((callback) => callback(status)); } public clearListeners(): void { this.statusChangeCallbacks = []; this.messageCallbacks = []; } public setAgentContext(context: PersonaAgentContext): Promise { return this.sendPacket({ type: 'command', payload: { command: 'set_initial_context', arguments: context }, }); } abstract getName(): string; abstract getPriority(): number; abstract connect(session?: Session): Promise; abstract disconnect(): Promise; abstract sendPacket(packet: PersonaPacket): Promise; // eslint-disable-next-line @typescript-eslint/no-unused-vars public onTransaction(_transaction: PersonaTransaction) {} } export { PersonaProtocolBase };