@financialforcedev/orizuru
Version:
Streamlined communication between Heroku dynos / other worker processes
122 lines • 12.4 kB
JavaScript
;
/*
* Copyright (c) 2017-2019, FinancialForce.com, inc
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the FinancialForce.com, inc nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
Object.defineProperty(exports, "__esModule", { value: true });
/**
* @module handler
*/
const events_1 = require("events");
const lodash_1 = require("lodash");
const messageHandler_1 = require("./handler/messageHandler");
const handler_1 = require("./validator/handler");
const handlerFunction_1 = require("./validator/handlerFunction");
/**
* The Handler for consuming messages in a worker dyno created by {@link Server}.
* @extends EventEmitter
*/
class Handler extends events_1.EventEmitter {
/**
* Constructs a new 'Handler'.
*/
constructor(options) {
super();
this.options = options;
try {
// Validate the config
new handler_1.HandlerValidator(options);
// Define the transport
this.transport = options.transport;
// Define the handler function validator
this.validator = new handlerFunction_1.HandlerFunctionValidator();
}
catch (err) {
this.error(err);
throw err;
}
}
/**
* Initializes the handler.
*/
async init() {
await this.transport.connect();
}
/**
* Handles an incoming message from the transport layer.
*
* @param options The handle function options.
*
* @example
* ```typescript
*
* handler.handle({ schema, handler: ({ message, context }) => {
* console.log(message);
* console.log(context);
* }});
* ```
*/
async handle(options) {
try {
this.validator.validate(options);
}
catch (err) {
this.error(err);
throw err;
}
const eventName = lodash_1.get(options, 'subscribeOptions.eventName') || lodash_1.get(options, 'schema.name');
const handler = messageHandler_1.messageHandler(this, options);
const subscribeOptions = options.subscribeOptions || {
eventName
};
this.info(`Installing handler for ${eventName} events.`);
return this.transport.subscribe(handler, subscribeOptions);
}
/**
* Emit an error event.
*
* @param event The error event.
*/
error(event) {
this.emit(Handler.ERROR, event);
}
/**
* Emit an info event.
*
* @param event The info event.
*/
info(event) {
this.emit(Handler.INFO, event);
}
}
/**
* The error event name.
*/
Handler.ERROR = Symbol();
/**
* The info event name.
*/
Handler.INFO = Symbol();
exports.Handler = Handler;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbmRleC9oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHOztBQUVIOztHQUVHO0FBRUgsbUNBQXNDO0FBQ3RDLG1DQUE2QjtBQUc3Qiw2REFBMEQ7QUFDMUQsaURBQXVEO0FBQ3ZELGlFQUF1RTtBQUV2RTs7O0dBR0c7QUFDSCxNQUFhLE9BQVEsU0FBUSxxQkFBWTtJQTJCeEM7O09BRUc7SUFDSCxZQUFZLE9BQXlCO1FBRXBDLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdkIsSUFBSTtZQUVILHNCQUFzQjtZQUN0QixJQUFJLDBCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTlCLHVCQUF1QjtZQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFFbkMsd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSwwQ0FBd0IsRUFBRSxDQUFDO1NBRWhEO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDYixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLE1BQU0sR0FBRyxDQUFDO1NBQ1Y7SUFFRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSTtRQUNoQixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSSxLQUFLLENBQUMsTUFBTSxDQUF1RCxPQUF1QztRQUVoSCxJQUFJO1lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDakM7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsTUFBTSxHQUFHLENBQUM7U0FDVjtRQUVELE1BQU0sU0FBUyxHQUFHLFlBQUcsQ0FBQyxPQUFPLEVBQUUsNEJBQTRCLENBQUMsSUFBSSxZQUFHLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sT0FBTyxHQUFHLCtCQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixJQUFJO1lBQ3BELFNBQVM7U0FDVCxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsU0FBUyxVQUFVLENBQUMsQ0FBQztRQUV6RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTVELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLEtBQVU7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksSUFBSSxDQUFDLEtBQVU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7O0FBOUdEOztHQUVHO0FBQ29CLGFBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUV4Qzs7R0FFRztBQUNvQixZQUFJLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFWeEMsMEJBa0hDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNy0yMDE5LCBGaW5hbmNpYWxGb3JjZS5jb20sIGluY1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuICogICBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRmluYW5jaWFsRm9yY2UuY29tLCBpbmMgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4gKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0XG4gKiAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbiAqICBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXG4gKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTExcbiAqICBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCxcbiAqICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFNcbiAqICBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUllcbiAqICBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiAqICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4vKipcbiAqIEBtb2R1bGUgaGFuZGxlclxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBnZXQgfSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBJVHJhbnNwb3J0LCBPcHRpb25zIH0gZnJvbSAnLi4nO1xuaW1wb3J0IHsgbWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL2hhbmRsZXIvbWVzc2FnZUhhbmRsZXInO1xuaW1wb3J0IHsgSGFuZGxlclZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9yL2hhbmRsZXInO1xuaW1wb3J0IHsgSGFuZGxlckZ1bmN0aW9uVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3IvaGFuZGxlckZ1bmN0aW9uJztcblxuLyoqXG4gKiBUaGUgSGFuZGxlciBmb3IgY29uc3VtaW5nIG1lc3NhZ2VzIGluIGEgd29ya2VyIGR5bm8gY3JlYXRlZCBieSB7QGxpbmsgU2VydmVyfS5cbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5leHBvcnQgY2xhc3MgSGFuZGxlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG5cblx0LyoqXG5cdCAqIFRoZSBlcnJvciBldmVudCBuYW1lLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyByZWFkb25seSBFUlJPUiA9IFN5bWJvbCgpO1xuXG5cdC8qKlxuXHQgKiBUaGUgaW5mbyBldmVudCBuYW1lLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyByZWFkb25seSBJTkZPID0gU3ltYm9sKCk7XG5cblx0LyoqXG5cdCAqIFRoZSBPcml6dXJ1IEhhbmRsZXIgT3B0aW9ucy5cblx0ICovXG5cdHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBPcHRpb25zLklIYW5kbGVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgdHJhbnNwb3J0IGxheWVyIGZvciB0aGUgaGFuZGxlci5cblx0ICovXG5cdHByaXZhdGUgcmVhZG9ubHkgdHJhbnNwb3J0OiBJVHJhbnNwb3J0O1xuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgSGFuZGxlciBmdW5jdGlvbiBvcHRpb25zLlxuXHQgKi9cblx0cHJpdmF0ZSByZWFkb25seSB2YWxpZGF0b3I6IEhhbmRsZXJGdW5jdGlvblZhbGlkYXRvcjtcblxuXHQvKipcblx0ICogQ29uc3RydWN0cyBhIG5ldyAnSGFuZGxlcicuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zLklIYW5kbGVyKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuXHRcdHRyeSB7XG5cblx0XHRcdC8vIFZhbGlkYXRlIHRoZSBjb25maWdcblx0XHRcdG5ldyBIYW5kbGVyVmFsaWRhdG9yKG9wdGlvbnMpO1xuXG5cdFx0XHQvLyBEZWZpbmUgdGhlIHRyYW5zcG9ydFxuXHRcdFx0dGhpcy50cmFuc3BvcnQgPSBvcHRpb25zLnRyYW5zcG9ydDtcblxuXHRcdFx0Ly8gRGVmaW5lIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHZhbGlkYXRvclxuXHRcdFx0dGhpcy52YWxpZGF0b3IgPSBuZXcgSGFuZGxlckZ1bmN0aW9uVmFsaWRhdG9yKCk7XG5cblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHRoaXMuZXJyb3IoZXJyKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgaGFuZGxlci5cblx0ICovXG5cdHB1YmxpYyBhc3luYyBpbml0KCkge1xuXHRcdGF3YWl0IHRoaXMudHJhbnNwb3J0LmNvbm5lY3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIGFuIGluY29taW5nIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuXHQgKlxuXHQgKiBAcGFyYW0gb3B0aW9ucyBUaGUgaGFuZGxlIGZ1bmN0aW9uIG9wdGlvbnMuXG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYHR5cGVzY3JpcHRcblx0ICpcblx0ICogaGFuZGxlci5oYW5kbGUoeyBzY2hlbWEsIGhhbmRsZXI6ICh7IG1lc3NhZ2UsIGNvbnRleHQgfSkgPT4ge1xuXHQgKiBcdGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuXHQgKiBcdGNvbnNvbGUubG9nKGNvbnRleHQpO1xuXHQgKiB9fSk7XG5cdCAqIGBgYFxuXHQgKi9cblx0cHVibGljIGFzeW5jIGhhbmRsZTxDIGV4dGVuZHMgT3JpenVydS5Db250ZXh0LCBNIGV4dGVuZHMgT3JpenVydS5NZXNzYWdlPihvcHRpb25zOiBPcHRpb25zLklIYW5kbGVyRnVuY3Rpb248QywgTT4pIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLnZhbGlkYXRvci52YWxpZGF0ZShvcHRpb25zKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHRoaXMuZXJyb3IoZXJyKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cblx0XHRjb25zdCBldmVudE5hbWUgPSBnZXQob3B0aW9ucywgJ3N1YnNjcmliZU9wdGlvbnMuZXZlbnROYW1lJykgfHwgZ2V0KG9wdGlvbnMsICdzY2hlbWEubmFtZScpO1xuXHRcdGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcih0aGlzLCBvcHRpb25zKTtcblx0XHRjb25zdCBzdWJzY3JpYmVPcHRpb25zID0gb3B0aW9ucy5zdWJzY3JpYmVPcHRpb25zIHx8IHtcblx0XHRcdGV2ZW50TmFtZVxuXHRcdH07XG5cblx0XHR0aGlzLmluZm8oYEluc3RhbGxpbmcgaGFuZGxlciBmb3IgJHtldmVudE5hbWV9IGV2ZW50cy5gKTtcblxuXHRcdHJldHVybiB0aGlzLnRyYW5zcG9ydC5zdWJzY3JpYmUoaGFuZGxlciwgc3Vic2NyaWJlT3B0aW9ucyk7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBFbWl0IGFuIGVycm9yIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGVycm9yIGV2ZW50LlxuXHQgKi9cblx0cHVibGljIGVycm9yKGV2ZW50OiBhbnkpIHtcblx0XHR0aGlzLmVtaXQoSGFuZGxlci5FUlJPUiwgZXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVtaXQgYW4gaW5mbyBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBpbmZvIGV2ZW50LlxuXHQgKi9cblx0cHVibGljIGluZm8oZXZlbnQ6IGFueSkge1xuXHRcdHRoaXMuZW1pdChIYW5kbGVyLklORk8sIGV2ZW50KTtcblx0fVxuXG59XG4iXX0=