io-syncify
Version:
跨进程、跨服务器之间通信同步化
52 lines (47 loc) • 1.98 kB
text/typescript
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()));
}
});
}
}