UNPKG

@financialforcedev/orizuru

Version:

Streamlined communication between Heroku dynos / other worker processes

149 lines 16.6 kB
"use strict"; /* * 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 publisher */ const events_1 = require("events"); const transport_1 = require("./transport/transport"); const message_1 = require("./validator/message"); const publisher_1 = require("./validator/publisher"); const publishFunction_1 = require("./validator/publishFunction"); /** * The Publisher for publishing messages based on Avro schemas. * @extends EventEmitter */ class Publisher extends events_1.EventEmitter { /** * Constructs a new 'Publisher'. */ constructor(options) { super(); this.options = options; try { // Validate the config new publisher_1.PublisherValidator(options); // Define the transport this.transport = new transport_1.Transport(); this.transportImpl = options.transport; // Define the publish function validator this.validator = new publishFunction_1.PublishFunctionValidator(); // Define the message validator this.messageValidator = new message_1.MessageValidator(); } catch (err) { this.error(err); throw err; } } /** * Initializes the publisher. */ async init() { await this.transportImpl.connect(); } /** * Publishes an incoming message to the transport layer. * @param options The publish function options. * * @example * // publishes a message * publisher.publish({ schema, message }); */ async publish(options) { let validatedOptions; // Validate the arguments. try { validatedOptions = this.validator.validate(options); } catch (err) { this.error(err); throw err; } // Validate the message try { this.messageValidator.validate(validatedOptions.schema, validatedOptions.message.message); } catch (err) { this.error(err); throw err; } // Generate transport buffer. const schema = validatedOptions.schema; const message = options.message; const eventName = schema.name; const publishOptions = options.publishOptions || { eventName }; publishOptions.context = options.message.context; publishOptions.message = options.message.message; publishOptions.schema = schema; let buffer; try { buffer = this.transport.encode(schema, message); } catch (error) { const errorMessage = `Error encoding message for schema (${schema.name}): ${error.message}`; this.error(errorMessage); throw new Error(errorMessage); } // publish buffer on transport return this.transportImpl.publish(buffer, publishOptions) .then((result) => { this.info(`Published ${schema.name} event.`); return result; }) .catch((err) => { this.error('Error publishing message on transport.'); throw err; }); } /** * Emit an error event. * @param event The error event. */ error(event) { this.emit(Publisher.ERROR, event); } /** * Emit an info event. * @param event The info event. */ info(event) { this.emit(Publisher.INFO, event); } } /** * The error event name. */ Publisher.ERROR = Symbol(); /** * The info event name. */ Publisher.INFO = Symbol(); exports.Publisher = Publisher; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2luZGV4L3B1Ymxpc2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRzs7QUFFSDs7R0FFRztBQUVILG1DQUFzQztBQUd0QyxxREFBa0Q7QUFDbEQsaURBQXVEO0FBQ3ZELHFEQUEyRDtBQUMzRCxpRUFBd0c7QUFFeEc7OztHQUdHO0FBQ0gsTUFBYSxTQUFVLFNBQVEscUJBQVk7SUFxQzFDOztPQUVHO0lBQ0gsWUFBWSxPQUEyQjtRQUV0QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRXZCLElBQUk7WUFFSCxzQkFBc0I7WUFDdEIsSUFBSSw4QkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVoQyx1QkFBdUI7WUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFFdkMsd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSwwQ0FBd0IsRUFBRSxDQUFDO1lBRWhELCtCQUErQjtZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSwwQkFBZ0IsRUFBRSxDQUFDO1NBRS9DO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDYixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLE1BQU0sR0FBRyxDQUFDO1NBQ1Y7SUFFRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSTtRQUNoQixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUF1RCxPQUF1QztRQUVqSCxJQUFJLGdCQUF1RCxDQUFDO1FBRTVELDBCQUEwQjtRQUMxQixJQUFJO1lBQ0gsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEQ7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsTUFBTSxHQUFHLENBQUM7U0FDVjtRQUVELHVCQUF1QjtRQUN2QixJQUFJO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzFGO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDYixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLE1BQU0sR0FBRyxDQUFDO1NBQ1Y7UUFFRCw2QkFBNkI7UUFDN0IsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDaEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUU5QixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxJQUFJO1lBQ2hELFNBQVM7U0FDVCxDQUFDO1FBQ0YsY0FBYyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNqRCxjQUFjLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2pELGNBQWMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBRS9CLElBQUksTUFBYyxDQUFDO1FBRW5CLElBQUk7WUFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ2hEO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZixNQUFNLFlBQVksR0FBRyxzQ0FBc0MsTUFBTSxDQUFDLElBQUksTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzlCO1FBRUQsOEJBQThCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQzthQUN2RCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUM7WUFDN0MsT0FBTyxNQUFNLENBQUM7UUFDZixDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztZQUNyRCxNQUFNLEdBQUcsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxLQUFVO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSSxDQUFDLEtBQVU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7O0FBdEpEOztHQUVHO0FBQ29CLGVBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUV4Qzs7R0FFRztBQUNvQixjQUFJLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFWeEMsOEJBMEpDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNy0yMDE5LCBGaW5hbmNpYWxGb3JjZS5jb20sIGluY1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuICogICBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRmluYW5jaWFsRm9yY2UuY29tLCBpbmMgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4gKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0XG4gKiAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbiAqICBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXG4gKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTExcbiAqICBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCxcbiAqICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFNcbiAqICBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUllcbiAqICBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiAqICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4vKipcbiAqIEBtb2R1bGUgcHVibGlzaGVyXG4gKi9cblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcblxuaW1wb3J0IHsgSVRyYW5zcG9ydCwgT3B0aW9ucyB9IGZyb20gJy4uJztcbmltcG9ydCB7IFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0L3RyYW5zcG9ydCc7XG5pbXBvcnQgeyBNZXNzYWdlVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3IvbWVzc2FnZSc7XG5pbXBvcnQgeyBQdWJsaXNoZXJWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvci9wdWJsaXNoZXInO1xuaW1wb3J0IHsgUHVibGlzaEZ1bmN0aW9uVmFsaWRhdG9yLCBWYWxpZGF0ZWRQdWJsaXNoRnVuY3Rpb25PcHRpb25zIH0gZnJvbSAnLi92YWxpZGF0b3IvcHVibGlzaEZ1bmN0aW9uJztcblxuLyoqXG4gKiBUaGUgUHVibGlzaGVyIGZvciBwdWJsaXNoaW5nIG1lc3NhZ2VzIGJhc2VkIG9uIEF2cm8gc2NoZW1hcy5cbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5leHBvcnQgY2xhc3MgUHVibGlzaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcblxuXHQvKipcblx0ICogVGhlIGVycm9yIGV2ZW50IG5hbWUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVSUk9SID0gU3ltYm9sKCk7XG5cblx0LyoqXG5cdCAqIFRoZSBpbmZvIGV2ZW50IG5hbWUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElORk8gPSBTeW1ib2woKTtcblxuXHQvKipcblx0ICogVGhlIE9yaXp1cnUgUHVibGlzaGVyIE9wdGlvbnMuXG5cdCAqL1xuXHRwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogT3B0aW9ucy5JUHVibGlzaGVyO1xuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdGhhdCBjb21iaW5lcyB0aGUgbWVzc2FnZSBhbmQgY29udGV4dC5cblx0ICovXG5cdHByaXZhdGUgcmVhZG9ubHkgdHJhbnNwb3J0OiBUcmFuc3BvcnQ7XG5cblx0LyoqXG5cdCAqIFRoZSB0cmFuc3BvcnQgbGF5ZXIgZm9yIHRoZSBwdWJsaXNoZXIuXG5cdCAqL1xuXHRwcml2YXRlIHJlYWRvbmx5IHRyYW5zcG9ydEltcGw6IElUcmFuc3BvcnQ7XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBQdWJsaXNoZXIgZnVuY3Rpb24gb3B0aW9ucy5cblx0ICovXG5cdHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9yOiBQdWJsaXNoRnVuY3Rpb25WYWxpZGF0b3I7XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIG1lc3NhZ2UgYWdhaW5zdCB0aGUgW0FwYWNoZSBBdnJvXShodHRwczovL2F2cm8uYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvKSBzY2hlbWEuXG5cdCAqL1xuXHRwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VWYWxpZGF0b3I6IE1lc3NhZ2VWYWxpZGF0b3I7XG5cblx0LyoqXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgJ1B1Ymxpc2hlcicuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zLklQdWJsaXNoZXIpIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0dHJ5IHtcblxuXHRcdFx0Ly8gVmFsaWRhdGUgdGhlIGNvbmZpZ1xuXHRcdFx0bmV3IFB1Ymxpc2hlclZhbGlkYXRvcihvcHRpb25zKTtcblxuXHRcdFx0Ly8gRGVmaW5lIHRoZSB0cmFuc3BvcnRcblx0XHRcdHRoaXMudHJhbnNwb3J0ID0gbmV3IFRyYW5zcG9ydCgpO1xuXHRcdFx0dGhpcy50cmFuc3BvcnRJbXBsID0gb3B0aW9ucy50cmFuc3BvcnQ7XG5cblx0XHRcdC8vIERlZmluZSB0aGUgcHVibGlzaCBmdW5jdGlvbiB2YWxpZGF0b3Jcblx0XHRcdHRoaXMudmFsaWRhdG9yID0gbmV3IFB1Ymxpc2hGdW5jdGlvblZhbGlkYXRvcigpO1xuXG5cdFx0XHQvLyBEZWZpbmUgdGhlIG1lc3NhZ2UgdmFsaWRhdG9yXG5cdFx0XHR0aGlzLm1lc3NhZ2VWYWxpZGF0b3IgPSBuZXcgTWVzc2FnZVZhbGlkYXRvcigpO1xuXG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHR0aGlzLmVycm9yKGVycik7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXG5cdH1cblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgdGhlIHB1Ymxpc2hlci5cblx0ICovXG5cdHB1YmxpYyBhc3luYyBpbml0KCkge1xuXHRcdGF3YWl0IHRoaXMudHJhbnNwb3J0SW1wbC5jb25uZWN0KCk7XG5cdH1cblxuXHQvKipcblx0ICogUHVibGlzaGVzIGFuIGluY29taW5nIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cblx0ICogQHBhcmFtIG9wdGlvbnMgVGhlIHB1Ymxpc2ggZnVuY3Rpb24gb3B0aW9ucy5cblx0ICpcblx0ICogQGV4YW1wbGVcblx0ICogLy8gcHVibGlzaGVzIGEgbWVzc2FnZVxuXHQgKiBwdWJsaXNoZXIucHVibGlzaCh7IHNjaGVtYSwgbWVzc2FnZSB9KTtcblx0ICovXG5cdHB1YmxpYyBhc3luYyBwdWJsaXNoPEMgZXh0ZW5kcyBPcml6dXJ1LkNvbnRleHQsIE0gZXh0ZW5kcyBPcml6dXJ1Lk1lc3NhZ2U+KG9wdGlvbnM6IE9wdGlvbnMuSVB1Ymxpc2hGdW5jdGlvbjxDLCBNPikge1xuXG5cdFx0bGV0IHZhbGlkYXRlZE9wdGlvbnM6IFZhbGlkYXRlZFB1Ymxpc2hGdW5jdGlvbk9wdGlvbnM8QywgTT47XG5cblx0XHQvLyBWYWxpZGF0ZSB0aGUgYXJndW1lbnRzLlxuXHRcdHRyeSB7XG5cdFx0XHR2YWxpZGF0ZWRPcHRpb25zID0gdGhpcy52YWxpZGF0b3IudmFsaWRhdGUob3B0aW9ucyk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHR0aGlzLmVycm9yKGVycik7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXG5cdFx0Ly8gVmFsaWRhdGUgdGhlIG1lc3NhZ2Vcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5tZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlKHZhbGlkYXRlZE9wdGlvbnMuc2NoZW1hLCB2YWxpZGF0ZWRPcHRpb25zLm1lc3NhZ2UubWVzc2FnZSk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHR0aGlzLmVycm9yKGVycik7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXG5cdFx0Ly8gR2VuZXJhdGUgdHJhbnNwb3J0IGJ1ZmZlci5cblx0XHRjb25zdCBzY2hlbWEgPSB2YWxpZGF0ZWRPcHRpb25zLnNjaGVtYTtcblx0XHRjb25zdCBtZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlO1xuXHRcdGNvbnN0IGV2ZW50TmFtZSA9IHNjaGVtYS5uYW1lO1xuXG5cdFx0Y29uc3QgcHVibGlzaE9wdGlvbnMgPSBvcHRpb25zLnB1Ymxpc2hPcHRpb25zIHx8IHtcblx0XHRcdGV2ZW50TmFtZVxuXHRcdH07XG5cdFx0cHVibGlzaE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMubWVzc2FnZS5jb250ZXh0O1xuXHRcdHB1Ymxpc2hPcHRpb25zLm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2UubWVzc2FnZTtcblx0XHRwdWJsaXNoT3B0aW9ucy5zY2hlbWEgPSBzY2hlbWE7XG5cblx0XHRsZXQgYnVmZmVyOiBCdWZmZXI7XG5cblx0XHR0cnkge1xuXHRcdFx0YnVmZmVyID0gdGhpcy50cmFuc3BvcnQuZW5jb2RlKHNjaGVtYSwgbWVzc2FnZSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9IGBFcnJvciBlbmNvZGluZyBtZXNzYWdlIGZvciBzY2hlbWEgKCR7c2NoZW1hLm5hbWV9KTogJHtlcnJvci5tZXNzYWdlfWA7XG5cdFx0XHR0aGlzLmVycm9yKGVycm9yTWVzc2FnZSk7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcblx0XHR9XG5cblx0XHQvLyBwdWJsaXNoIGJ1ZmZlciBvbiB0cmFuc3BvcnRcblx0XHRyZXR1cm4gdGhpcy50cmFuc3BvcnRJbXBsLnB1Ymxpc2goYnVmZmVyLCBwdWJsaXNoT3B0aW9ucylcblx0XHRcdC50aGVuKChyZXN1bHQpID0+IHtcblx0XHRcdFx0dGhpcy5pbmZvKGBQdWJsaXNoZWQgJHtzY2hlbWEubmFtZX0gZXZlbnQuYCk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0dGhpcy5lcnJvcignRXJyb3IgcHVibGlzaGluZyBtZXNzYWdlIG9uIHRyYW5zcG9ydC4nKTtcblx0XHRcdFx0dGhyb3cgZXJyO1xuXHRcdFx0fSk7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBFbWl0IGFuIGVycm9yIGV2ZW50LlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGVycm9yIGV2ZW50LlxuXHQgKi9cblx0cHVibGljIGVycm9yKGV2ZW50OiBhbnkpIHtcblx0XHR0aGlzLmVtaXQoUHVibGlzaGVyLkVSUk9SLCBldmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogRW1pdCBhbiBpbmZvIGV2ZW50LlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGluZm8gZXZlbnQuXG5cdCAqL1xuXHRwdWJsaWMgaW5mbyhldmVudDogYW55KSB7XG5cdFx0dGhpcy5lbWl0KFB1Ymxpc2hlci5JTkZPLCBldmVudCk7XG5cdH1cblxufVxuIl19