157 lines
5.2 KiB
JavaScript
157 lines
5.2 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.QueueBase = void 0;
|
|
const events_1 = require("events");
|
|
const utils_1 = require("../utils");
|
|
const create_scripts_1 = require("../utils/create-scripts");
|
|
const redis_connection_1 = require("./redis-connection");
|
|
const job_1 = require("./job");
|
|
const queue_keys_1 = require("./queue-keys");
|
|
/**
|
|
* Base class for all classes that need to interact with queues.
|
|
* This class is normally not used directly, but extended by the other classes.
|
|
*
|
|
*/
|
|
class QueueBase extends events_1.EventEmitter {
|
|
/**
|
|
*
|
|
* @param name - The name of the queue.
|
|
* @param opts - Options for the queue.
|
|
* @param Connection - An optional "Connection" class used to instantiate a Connection. This is useful for
|
|
* testing with mockups and/or extending the Connection class and passing an alternate implementation.
|
|
*/
|
|
constructor(name, opts = { connection: {} }, Connection = redis_connection_1.RedisConnection, hasBlockingConnection = false) {
|
|
super();
|
|
this.name = name;
|
|
this.opts = opts;
|
|
this.closed = false;
|
|
this.hasBlockingConnection = false;
|
|
this.hasBlockingConnection = hasBlockingConnection;
|
|
this.opts = Object.assign({ prefix: 'bull' }, opts);
|
|
if (!name) {
|
|
throw new Error('Queue name must be provided');
|
|
}
|
|
if (name.includes(':')) {
|
|
throw new Error('Queue name cannot contain :');
|
|
}
|
|
this.connection = new Connection(opts.connection, {
|
|
shared: (0, utils_1.isRedisInstance)(opts.connection),
|
|
blocking: hasBlockingConnection,
|
|
skipVersionCheck: opts.skipVersionCheck,
|
|
skipWaitingForReady: opts.skipWaitingForReady,
|
|
});
|
|
this.connection.on('error', (error) => this.emit('error', error));
|
|
this.connection.on('close', () => {
|
|
if (!this.closing) {
|
|
this.emit('ioredis:close');
|
|
}
|
|
});
|
|
const queueKeys = new queue_keys_1.QueueKeys(opts.prefix);
|
|
this.qualifiedName = queueKeys.getQueueQualifiedName(name);
|
|
this.keys = queueKeys.getKeys(name);
|
|
this.toKey = (type) => queueKeys.toKey(name, type);
|
|
this.createScripts();
|
|
}
|
|
/**
|
|
* Returns a promise that resolves to a redis client. Normally used only by subclasses.
|
|
*/
|
|
get client() {
|
|
return this.connection.client;
|
|
}
|
|
createScripts() {
|
|
this.scripts = (0, create_scripts_1.createScripts)(this);
|
|
}
|
|
/**
|
|
* Returns the version of the Redis instance the client is connected to,
|
|
*/
|
|
get redisVersion() {
|
|
return this.connection.redisVersion;
|
|
}
|
|
/**
|
|
* Helper to easily extend Job class calls.
|
|
*/
|
|
get Job() {
|
|
return job_1.Job;
|
|
}
|
|
/**
|
|
* Emits an event. Normally used by subclasses to emit events.
|
|
*
|
|
* @param event - The emitted event.
|
|
* @param args -
|
|
* @returns
|
|
*/
|
|
emit(event, ...args) {
|
|
try {
|
|
return super.emit(event, ...args);
|
|
}
|
|
catch (err) {
|
|
try {
|
|
return super.emit('error', err);
|
|
}
|
|
catch (err) {
|
|
// We give up if the error event also throws an exception.
|
|
console.error(err);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
waitUntilReady() {
|
|
return this.client;
|
|
}
|
|
base64Name() {
|
|
return Buffer.from(this.name).toString('base64');
|
|
}
|
|
clientName(suffix = '') {
|
|
const queueNameBase64 = this.base64Name();
|
|
return `${this.opts.prefix}:${queueNameBase64}${suffix}`;
|
|
}
|
|
/**
|
|
*
|
|
* Closes the connection and returns a promise that resolves when the connection is closed.
|
|
*/
|
|
async close() {
|
|
if (!this.closing) {
|
|
this.closing = this.connection.close();
|
|
}
|
|
await this.closing;
|
|
this.closed = true;
|
|
}
|
|
/**
|
|
*
|
|
* Force disconnects a connection.
|
|
*/
|
|
disconnect() {
|
|
return this.connection.disconnect();
|
|
}
|
|
async checkConnectionError(fn, delayInMs = utils_1.DELAY_TIME_5) {
|
|
try {
|
|
return await fn();
|
|
}
|
|
catch (error) {
|
|
if ((0, utils_1.isNotConnectionError)(error)) {
|
|
this.emit('error', error);
|
|
}
|
|
if (!this.closing && delayInMs) {
|
|
await (0, utils_1.delay)(delayInMs);
|
|
}
|
|
else {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Wraps the code with telemetry and provides a span for configuration.
|
|
*
|
|
* @param spanKind - kind of the span: Producer, Consumer, Internal
|
|
* @param operation - operation name (such as add, process, etc)
|
|
* @param destination - destination name (normally the queue name)
|
|
* @param callback - code to wrap with telemetry
|
|
* @param srcPropagationMedatada -
|
|
* @returns
|
|
*/
|
|
trace(spanKind, operation, destination, callback, srcPropagationMetadata) {
|
|
return (0, utils_1.trace)(this.opts.telemetry, spanKind, this.name, operation, destination, callback, srcPropagationMetadata);
|
|
}
|
|
}
|
|
exports.QueueBase = QueueBase;
|
|
//# sourceMappingURL=queue-base.js.map
|