ali-mns-sdk
Version:
The nodejs SDK for aliyun mns service
133 lines • 10.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const events_1 = require("events");
const GA_1 = require("./GA");
const MQ_1 = require("./MQ");
const Debug_1 = require("./utils/Debug");
class NotifyRecv {
constructor(mq) {
this._signalSTOP = true;
this._evStopped = 'AliMNS_MQ_NOTIFY_STOPPED';
// 连续timeout计数器
// 在某种未知的原因下,网络底层链接断了
// 这时在程序内部的重试无法促使网络重连,以后的重试都是徒劳的
// 如果连续发生反复重试都依然timeout,那么极有可能已经发生此种情况了
// 这时抛出NetworkBroken异常
this._timeoutCount = 0;
this._timeoutMax = 128;
this._ga = null;
this._mq = mq;
// emitter
this._emitter = new events_1.EventEmitter();
// Google Analytics
if (mq instanceof MQ_1.MQ) {
const account = mq.getAccount();
this._ga = new GA_1.GA(account.getAccountId());
this._ga.disableGA(!account.getGA());
}
}
// 消息通知.每当有消息收到时,都调用cb回调函数
// 如果cb返回true,那么将删除消息,否则保留消息
notifyRecv(cb, waitSeconds, numOfMessages) {
this._signalSTOP = false;
this._timeoutCount = 0;
this.notifyRecvInternal(cb, waitSeconds, numOfMessages);
// Google Analytics
if (this._ga)
this._ga.send('NotifyRecv.notifyRecv', 0, '');
}
// 停止消息通知
notifyStopP() {
if (this._signalSTOP)
return Promise.resolve(this._evStopped);
// Google Analytics
if (this._ga)
this._ga.send('NotifyRecv.notifyStopP', 0, '');
this._signalSTOP = true;
return new Promise(resolve => {
this._emitter.once(this._evStopped, () => {
resolve(this._evStopped);
});
});
}
notifyRecvInternal(cb, waitSeconds, numOfMessages) {
// This signal will be triggered by notifyStopP()
if (this._signalSTOP) {
Debug_1.default('notifyStopped');
this._emitter.emit(this._evStopped);
return;
}
Debug_1.default('notifyRecvInternal()');
try {
const mqBatch = this._mq;
mqBatch.recvP(waitSeconds, numOfMessages).then(async (dataRecv) => {
try {
Debug_1.default(dataRecv);
this._timeoutCount = 0;
if (await cb(null, dataRecv)) {
this.deleteP(dataRecv).then(null, ex => {
console.log(ex);
});
}
}
catch (ex) {
// ignore any ex throw from cb
console.warn(ex);
}
this.notifyRecvInternal(cb, waitSeconds, numOfMessages);
}, ex => {
Debug_1.default(ex);
if (!ex.Error || ex.Error.Code !== 'MessageNotExist') {
cb(ex, null);
}
if (ex) {
if (ex.message === 'timeout') {
this._timeoutCount++;
if (this._timeoutCount > this._timeoutMax) {
// 极度可能网络底层断了
cb(new Error('NetworkBroken'), null);
}
}
else if (ex.Error && ex.Error.Code === 'MessageNotExist') {
this._timeoutCount = 0;
}
}
process.nextTick(() => {
this.notifyRecvInternal(cb, waitSeconds, numOfMessages);
});
});
}
catch (ex) {
// ignore any ex
console.warn(ex);
// 过5秒重试
Debug_1.default('Retry after 5 seconds');
setTimeout(() => {
this.notifyRecvInternal(cb, waitSeconds, numOfMessages);
}, 5000);
}
}
deleteP(dataRecv) {
if (dataRecv) {
if (dataRecv.Message) {
return this._mq.deleteP(dataRecv.Message.ReceiptHandle);
}
else if (dataRecv.Messages && dataRecv.Messages.Message) {
const rhs = [];
for (const msg of dataRecv.Messages.Message) {
rhs.push(msg.ReceiptHandle);
}
const mqBatch = this._mq;
return mqBatch.deleteP(rhs);
}
else {
return Promise.resolve(dataRecv);
}
}
else {
return Promise.resolve(dataRecv);
}
}
}
exports.NotifyRecv = NotifyRecv;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm90aWZ5UmVjdi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Ob3RpZnlSZWN2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQXNDO0FBQ3RDLDZCQUEwQjtBQUUxQiw2QkFBMEI7QUFDMUIseUNBQWtDO0FBRWxDLE1BQWEsVUFBVTtJQUNyQixZQUFtQixFQUFPO1FBd0hsQixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQixlQUFVLEdBQUcsMEJBQTBCLENBQUM7UUFHaEQsZUFBZTtRQUNmLHFCQUFxQjtRQUNyQixnQ0FBZ0M7UUFDaEMsdUNBQXVDO1FBQ3ZDLHNCQUFzQjtRQUNkLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGdCQUFXLEdBQUcsR0FBRyxDQUFDO1FBRWxCLFFBQUcsR0FBTyxJQUFJLENBQUM7UUFwSXJCLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBRWQsVUFBVTtRQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxxQkFBWSxFQUFFLENBQUM7UUFFbkMsbUJBQW1CO1FBQ25CLElBQUksRUFBRSxZQUFZLE9BQUUsRUFBRTtZQUNwQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLE9BQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVELDBCQUEwQjtJQUMxQiw0QkFBNEI7SUFDckIsVUFBVSxDQUFDLEVBQTZDLEVBQUUsV0FBb0IsRUFBRSxhQUFzQjtRQUMzRyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsa0JBQWtCLENB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