@ones-op/node-host
Version:
ONES Open Platform Node.js plugin host
114 lines (113 loc) • 4.14 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MessageQueue = void 0;
const config_1 = require("../config");
const logger_1 = require("../logger");
const protocol_1 = require("../protocol");
const api_1 = require("@opentelemetry/api");
const zeromq_1 = require("zeromq");
const message_pool_1 = require("./message-pool");
class MessageQueue {
constructor(address, receiveTimeout) {
this.dealer = new zeromq_1.Dealer({
receiveTimeout: receiveTimeout,
});
this.dealer.events.on('connect', () => {
this.connected = true;
logger_1.logger.debug(`Platform MessageQueue connected`);
});
this.dealer.events.on('disconnect', () => {
this.connected = false;
logger_1.logger.debug(`Platform MessageQueue disconnected`);
});
this.address = address;
this.sendLoopSign = true;
this.loopSign = true;
this.connected = false;
this.tracer = api_1.trace.getTracer('message-queue', '1.0.0');
}
async start() {
if (this.messageHandler == undefined) {
throw new Error('messageHandler is not assigned');
}
this.dealer.routingId = config_1.config.host.id;
this.dealer.probeRouter = true;
this.dealer.connect(this.address);
this.loopReceive();
this.loopSend();
}
AssignMessageHandler(messageHandler) {
this.messageHandler = messageHandler;
}
async sendMessage(message) {
message_pool_1.SendMessagePool.push(message);
if (!this.sendLoopSign) {
this.sendLoopSign = true;
this.loopSend();
}
}
async loopSend() {
while (this.sendLoopSign) {
if (!this.connected) {
this.sendLoopSign = false;
return;
}
const message = message_pool_1.SendMessagePool.shift();
if (message == undefined) {
this.sendLoopSign = false;
return;
}
try {
const buff = protocol_1.protocol.PlatformMessage.encode(message).finish();
await this.send(buff);
logger_1.logger.debug(`SeqNo:[${message.Header?.SeqNo}] send success`);
}
catch (error) {
logger_1.logger.info(`Platform MessageQueue send error:`, error);
}
}
}
async loopReceive() {
while (this.loopSign) {
let platformMessage;
try {
const [msg] = await this.dealer.receive();
platformMessage = protocol_1.protocol.PlatformMessage.decode(msg);
logger_1.logger.debug(`SeqNo:[${platformMessage.Header?.SeqNo}] receive success`);
}
catch {
logger_1.logger.debug(`MessageQueue no message`);
}
if (platformMessage) {
const activeContext = api_1.propagation.extract(api_1.context.active(), platformMessage.Header?.Headers || {});
const message = platformMessage;
this.tracer.startActiveSpan('message-queue', {
attributes: {
'message-queue.seqno': platformMessage.Header?.SeqNo?.toString() ?? '',
},
}, activeContext, (span) => {
try {
this.messageHandler.onMessage(message);
}
catch (error) {
span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: String(error) });
throw error;
}
finally {
span.end();
}
});
}
}
}
async send(byteArray) {
try {
return await this.dealer.send(byteArray);
}
catch (error) {
// 发送失败不处理
logger_1.logger.error('Platform zeromq send err', error);
}
}
}
exports.MessageQueue = MessageQueue;