@financialforcedev/orizuru
Version:
Streamlined communication between Heroku dynos / other worker processes
149 lines • 16.6 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 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