nest-nsq-transport
Version:
NestJS microservice transport for NSQ
78 lines • 2.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.NSQClient = void 0;
const common_1 = require("@nestjs/common");
const microservices_1 = require("@nestjs/microservices");
const nsqjs_1 = require("nsqjs");
const errors_1 = require("./errors");
const invariant_1 = require("./invariant");
const serialization_1 = require("./serialization");
class NSQClient extends microservices_1.ClientProxy {
opts;
writer;
logger = new common_1.Logger(NSQClient.name);
connected;
constructor(opts) {
super();
this.opts = opts;
if ('nsqdURL' in opts) {
const { nsqdURL, serializer: _, ...rest } = opts;
const [hostname, port] = opts.nsqdURL.split(':');
if (!hostname || !port)
throw new Error('Invalid nsqdURL');
this.writer = new nsqjs_1.Writer(hostname, Number(port), rest);
}
else {
const { nsqdHost, nsqdPort, serializer: _, ...rest } = opts;
this.writer = new nsqjs_1.Writer(nsqdHost, nsqdPort, rest);
}
this.serializer = opts.serializer ?? new serialization_1.StringSerializer();
}
connect() {
if (this.connected)
return this.connected;
this.connected = new Promise((resolve, reject) => {
this.writer
.on('ready', () => {
this.logger.debug('NSQ client connected');
resolve();
})
.on('error', (err) => {
this.logger.error(`NSQ client connection error: ${err}`);
reject();
});
this.writer.connect();
});
return this.connected;
}
close() {
return new Promise((resolve, reject) => {
this.writer
.on('closed', () => {
this.logger.debug('NSQ client closed');
resolve();
})
.on('error', (err) => {
this.logger.error(`NSQ client closing error: ${err}`);
reject();
});
this.writer.close();
});
}
publish(_packet, _callback) {
throw new errors_1.RPCNotSupported();
}
// something with types, unable to set void
// eslint-disable-next-line @typescript-eslint/no-explicit-any
async dispatchEvent(packet) {
(0, invariant_1.invariant)(typeof packet.pattern === 'string', 'pattern must be a valid topic name');
const data = await this.serializer.serialize(packet);
return new Promise((resolve, reject) => this.writer.publish(packet.pattern, data, (err) => err ? reject(err) : resolve()));
}
// we have multiple underlying writers, so we return all of them
unwrap() {
return this.writer;
}
}
exports.NSQClient = NSQClient;
//# sourceMappingURL=client.js.map