UNPKG

io-syncify

Version:

跨进程、跨服务器之间通信同步化

52 lines (47 loc) 1.98 kB
import {Message} from "./Message"; import {sleep} from "./sleep"; import {OutputMessageReceiver} from "./OutputMessageReceiver"; import {MessageSender} from "./MessageSender"; /** * 输入输出同步化 */ export class IOSyncify { /** * 输入消息发送器 * @private */ private inputMessageSender: MessageSender; /** * 输出消息接收器 * @private */ private outputMessageReceiver: OutputMessageReceiver; constructor(outputMessageReceiver: OutputMessageReceiver, inputMessageSender: MessageSender) { this.inputMessageSender = inputMessageSender; this.outputMessageReceiver = outputMessageReceiver; this.outputMessageReceiver.receive(); } /** * 输入消息 * @param {Message} message 消息 * @param {number} timeout 超时时长,默认60000毫秒 */ async input(message: Message, timeout?: number): Promise<Message> { return new Promise<Message>(async (resolve) => { try { // console.log(Date.now(), 'output message receive once', message.id, this.outputMessageReceiver.eventEmitter.listenerCount(message.id), this.outputMessageReceiver.eventEmitter.eventNames()); this.outputMessageReceiver.eventEmitter.once(message.id, function (response: Message) { // console.log(Date.now(), 'receive output message', response.toJsonArrayString()); resolve(response); }); // console.log(Date.now(), 'send input message', message.toJsonArrayString()); await this.inputMessageSender.send(message); await sleep(timeout ?? 60000); this.outputMessageReceiver.eventEmitter.removeAllListeners(message.id); resolve(new Message(message.id, 'TIMEOUT', Date.now())); } catch { resolve(new Message(message.id, 'ERROR', Date.now())); } }); } }