UNPKG

@cloudamqp/amqp-client

Version:

AMQP 0-9-1 client, both for browsers (WebSocket) and node (TCP Socket)

109 lines 3.31 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AMQPGeneratorConsumer = exports.AMQPConsumer = void 0; const amqp_error_js_1 = require("./amqp-error.js"); class AMQPConsumer { constructor(channel, tag, onMessage) { this.closed = false; this.channel = channel; this.tag = tag; this.onMessage = onMessage; } wait(timeout) { if (this.closedError) return Promise.reject(this.closedError); if (this.closed) return Promise.resolve(); return new Promise((resolve, reject) => { this.resolveWait = resolve; this.rejectWait = reject; if (timeout) { const onTimeout = () => reject(new amqp_error_js_1.AMQPError("Timeout", this.channel.connection)); this.timeoutId = setTimeout(onTimeout, timeout); } }); } cancel() { if (this.channel.closed) return Promise.resolve(this.channel); if (!this.cancelPromise) { this.cancelPromise = this.channel.basicCancel(this.tag); } return this.cancelPromise; } setClosed(err) { this.closed = true; if (err) this.closedError = err; if (this.timeoutId) clearTimeout(this.timeoutId); if (err) { if (this.rejectWait) this.rejectWait(err); } else { if (this.resolveWait) this.resolveWait(); } } } exports.AMQPConsumer = AMQPConsumer; class AMQPGeneratorConsumer extends AMQPConsumer { constructor(channel, tag) { super(channel, tag, (msg) => { if (this.messageResolver) { this.messageResolver(msg); this.messageResolver = null; } else if (this.messageQueue) { this.messageQueue.push(msg); } }); this.messageQueue = []; this.messageResolver = null; } get messages() { if (this.generator) { return this.generator; } this.generator = this.generateMessages(); return this.generator; } async *generateMessages() { try { while (!this.closedError && !this.closed) { const msg = this.messageQueue.shift(); if (msg) { yield msg; } else { const msg = await new Promise((resolve) => { this.messageResolver = resolve; }); if (this.closedError || this.closed) break; yield msg; } } if (this.closedError) throw this.closedError; } finally { try { await this.cancel(); } catch { } } } setClosed(err) { super.setClosed(err); if (this.messageResolver) { const resolver = this.messageResolver; this.messageResolver = null; resolver(undefined); } } } exports.AMQPGeneratorConsumer = AMQPGeneratorConsumer; //# sourceMappingURL=amqp-consumer.js.map