@cloudamqp/amqp-client
Version:
AMQP 0-9-1 client, both for browsers (WebSocket) and node (TCP Socket)
104 lines • 3.07 kB
JavaScript
import { AMQPError } from "./amqp-error.js";
export 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 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();
}
}
}
export 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);
}
}
}
//# sourceMappingURL=amqp-consumer.js.map