@versatiledatakit/shared
Version:
Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.
113 lines • 16.5 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
/* eslint-disable @typescript-eslint/no-explicit-any */
import { CollectionsUtil } from '../../../utils';
import { SE_ALL_EVENTS, SystemEventComparable } from '../event';
import { SystemEventHandlerRegistry } from './registry';
/**
* ** System Event Dispatcher.
*
* - This Class is start point to trigger SystemEvent.
* - SystemEvent identifier is in string format, and would be nice those string to be assigned to constant for easier usage.
* - Payload could be any format but preferable is Literal Object.
* - SystemEvents could be dispatched in two ways using implemented behavior:
*
* 1) POST - this is NON-BLOCKING execution that leverages `setTimeout(handler, 0)` to avoid blocking main JavaScript thread.
*
* 2) SEND - this is BLOCKING execution that leverages `Promise` mechanism to chain Handlers execution. At the end returns
* flow of execution to Invoker.
*
* - Handlers and their usage read at Decorators JSDoc {@link SystemEventHandlerClass} {@link SystemEventHandler}.
*
* @see SystemEventDispatcher.post
* @see SystemEventDispatcher.send
*
* @example
* // void
* SystemEventDispatcher
* .post('SE_Send_Email', { email: 'taurus-shared@vmware.com });
*
* // returns Promise
* SystemEventDispatcher
* .send('SE_Create_Job', { jobName: 'Test', jobCreator: 'System' })
* .then((v) => {
* // Do something
* });
*/
export class SystemEventDispatcher {
/**
* ** Method to post System Event.
*
* - NON-BLOCKING execution.
* - Execution is non-blocking, e.g. it is executed in queue using setTimeout of 0.
* - If third parameters is provided it will execute as many handlers as it is request.
* - e.g. 1 or 2 or N and will skip the others.
*/
static post(eventId, payload, handlersToExecute = null) {
const preparedHandlers = SystemEventHandlerRegistry.getPreparedArrayOfHandlers(eventId);
let executedHandlers = 0;
for (const handlerRecord of preparedHandlers) {
if (!SystemEventDispatcher.executeExpressionFilter(handlerRecord, eventId, payload)) {
return;
}
executedHandlers++;
const isHandlerActive = (e) => SystemEventHandlerRegistry.findHandlerByReference(e, handlerRecord.handlerRef, handlerRecord.handlerClassInstance).active;
setTimeout(() => {
if (!isHandlerActive(eventId) && !isHandlerActive(SE_ALL_EVENTS)) {
return;
}
handlerRecord.handlerRef.call(handlerRecord.handlerClassInstance, payload, eventId);
}, 0);
if (CollectionsUtil.isNumber(handlersToExecute) && executedHandlers >= handlersToExecute) {
break;
}
}
}
/**
* ** Method to send System Event.
*
* - BLOCKING execution.
* - Execution is blocking, e.g. it is achieved using Promises, and every handler must return Promise.
* - If third parameters is provided it will execute as many handlers as it is request.
* - e.g. 1 or 2 or N and will return the flow to the invoker.
*/
static send(eventId, payload, handlersToExecute = null) {
const preparedHandlers = SystemEventHandlerRegistry.getPreparedArrayOfHandlers(eventId, true);
return SystemEventDispatcher.executeSendCommand(preparedHandlers, eventId, payload, handlersToExecute);
}
/**
* ** Execute send command and handle Promises from handlers.
*/
static executeSendCommand(handlers, eventId, payload, handlersToExecute = null, executedHandlers = 0) {
if (!handlers.length) {
return Promise.resolve(true);
}
if (CollectionsUtil.isNumber(handlersToExecute) && handlersToExecute === executedHandlers) {
return Promise.resolve(true);
}
const handlerForExecution = handlers.pop();
if (!SystemEventDispatcher.executeExpressionFilter(handlerForExecution, eventId, payload)) {
return SystemEventDispatcher.executeSendCommand(handlers, eventId, payload, handlersToExecute, executedHandlers);
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return
return handlerForExecution.handlerRef
.call(handlerForExecution.handlerClassInstance, payload, eventId)
.then(() => SystemEventDispatcher.executeSendCommand(handlers, eventId, payload, handlersToExecute, executedHandlers + 1))
.catch(() => Promise.reject(false));
}
/**
* ** Execute Expression filter for Handler before execution.
*/
static executeExpressionFilter(handlerRecord, eventId, payload) {
const filterExpression = handlerRecord.handlerFilterExpression;
if (CollectionsUtil.isNil(filterExpression)) {
return true;
}
return handlerRecord.handlerFilterExpression.evaluate(
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
SystemEventComparable.of({ eventId, payload }));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQuZGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvcmUvc3lzdGVtLWV2ZW50cy9kaXNwYXRjaGVyL2V2ZW50LmRpc3BhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsdURBQXVEO0FBRXZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsYUFBYSxFQUFlLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUd4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBQzlCOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLG9CQUE0QixJQUFJO1FBQzVFLE1BQU0sZ0JBQWdCLEdBQUcsMEJBQTBCLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEYsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFFekIsS0FBSyxNQUFNLGFBQWEsSUFBSSxnQkFBZ0IsRUFBRTtZQUMxQyxJQUFJLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDakYsT0FBTzthQUNWO1lBRUQsZ0JBQWdCLEVBQUUsQ0FBQztZQUVuQixNQUFNLGVBQWUsR0FBRyxDQUFDLENBQWMsRUFBRSxFQUFFLENBQ3ZDLDBCQUEwQixDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUU5SCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEVBQUU7b0JBQzlELE9BQU87aUJBQ1Y7Z0JBRUQsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN4RixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFTixJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxnQkFBZ0IsSUFBSSxpQkFBaUIsRUFBRTtnQkFDdEYsTUFBTTthQUNUO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsb0JBQTRCLElBQUk7UUFDNUUsTUFBTSxnQkFBZ0IsR0FBRywwQkFBMEIsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFOUYsT0FBTyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDM0csQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLGtCQUFrQixDQUM3QixRQUFvQyxFQUNwQyxPQUFvQixFQUNwQixPQUFZLEVBQ1osb0JBQTRCLElBQUksRUFDaEMsZ0JBQWdCLEdBQUcsQ0FBQztRQUVwQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNsQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEM7UUFFRCxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxpQkFBaUIsS0FBSyxnQkFBZ0IsRUFBRTtZQUN2RixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEM7UUFFRCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUUzQyxJQUFJLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZGLE9BQU8scUJBQXFCLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztTQUNwSDtRQUVELDRJQUE0STtRQUM1SSxPQUFPLG1CQUFtQixDQUFDLFVBQVU7YUFDaEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7YUFDaEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3pILEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLHVCQUF1QixDQUFDLGFBQXVDLEVBQUUsT0FBb0IsRUFBRSxPQUFZO1FBQzlHLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLHVCQUF1QixDQUFDO1FBRS9ELElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3pDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRO1FBQ2pELG1FQUFtRTtRQUNuRSxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FDakQsQ0FBQztJQUNOLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgQ29sbGVjdGlvbnNVdGlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgeyBTRV9BTExfRVZFTlRTLCBTeXN0ZW1FdmVudCwgU3lzdGVtRXZlbnRDb21wYXJhYmxlIH0gZnJvbSAnLi4vZXZlbnQnO1xuaW1wb3J0IHsgU3lzdGVtRXZlbnRIYW5kbGVyUmVnaXN0cnkgfSBmcm9tICcuL3JlZ2lzdHJ5JztcbmltcG9ydCB7IFN5c3RlbUV2ZW50SGFuZGxlclJlY29yZCB9IGZyb20gJy4vbW9kZWxzJztcblxuLyoqXG4gKiAqKiBTeXN0ZW0gRXZlbnQgRGlzcGF0Y2hlci5cbiAqXG4gKiAgIC0gVGhpcyBDbGFzcyBpcyBzdGFydCBwb2ludCB0byB0cmlnZ2VyIFN5c3RlbUV2ZW50LlxuICogICAtIFN5c3RlbUV2ZW50IGlkZW50aWZpZXIgaXMgaW4gc3RyaW5nIGZvcm1hdCwgYW5kIHdvdWxkIGJlIG5pY2UgdGhvc2Ugc3RyaW5nIHRvIGJlIGFzc2lnbmVkIHRvIGNvbnN0YW50IGZvciBlYXNpZXIgdXNhZ2UuXG4gKiAgIC0gUGF5bG9hZCBjb3VsZCBiZSBhbnkgZm9ybWF0IGJ1dCBwcmVmZXJhYmxlIGlzIExpdGVyYWwgT2JqZWN0LlxuICogICAtIFN5c3RlbUV2ZW50cyBjb3VsZCBiZSBkaXNwYXRjaGVkIGluIHR3byB3YXlzIHVzaW5nIGltcGxlbWVudGVkIGJlaGF2aW9yOlxuICpcbiAqICAgMSkgUE9TVCAtIHRoaXMgaXMgTk9OLUJMT0NLSU5HIGV4ZWN1dGlvbiB0aGF0IGxldmVyYWdlcyBgc2V0VGltZW91dChoYW5kbGVyLCAwKWAgdG8gYXZvaWQgYmxvY2tpbmcgbWFpbiBKYXZhU2NyaXB0IHRocmVhZC5cbiAqXG4gKiAgIDIpIFNFTkQgLSB0aGlzIGlzIEJMT0NLSU5HIGV4ZWN1dGlvbiB0aGF0IGxldmVyYWdlcyBgUHJvbWlzZWAgbWVjaGFuaXNtIHRvIGNoYWluIEhhbmRsZXJzIGV4ZWN1dGlvbi4gQXQgdGhlIGVuZCByZXR1cm5zXG4gKiAgICAgICAgICAgICAgIGZsb3cgb2YgZXhlY3V0aW9uIHRvIEludm9rZXIuXG4gKlxuICogICAtIEhhbmRsZXJzIGFuZCB0aGVpciB1c2FnZSByZWFkIGF0IERlY29yYXRvcnMgSlNEb2Mge0BsaW5rIFN5c3RlbUV2ZW50SGFuZGxlckNsYXNzfSB7QGxpbmsgU3lzdGVtRXZlbnRIYW5kbGVyfS5cbiAqXG4gKiBAc2VlIFN5c3RlbUV2ZW50RGlzcGF0Y2hlci5wb3N0XG4gKiBAc2VlIFN5c3RlbUV2ZW50RGlzcGF0Y2hlci5zZW5kXG4gKlxuICogQGV4YW1wbGVcbiAqICAgIC8vIHZvaWRcbiAqICAgIFN5c3RlbUV2ZW50RGlzcGF0Y2hlclxuICogICAgICAgIC5wb3N0KCdTRV9TZW5kX0VtYWlsJywgeyBlbWFpbDogJ3RhdXJ1cy1zaGFyZWRAdm13YXJlLmNvbSB9KTtcbiAqXG4gKiAgICAvLyByZXR1cm5zIFByb21pc2VcbiAqICAgIFN5c3RlbUV2ZW50RGlzcGF0Y2hlclxuICogICAgICAgIC5zZW5kKCdTRV9DcmVhdGVfSm9iJywgeyBqb2JOYW1lOiAnVGVzdCcsIGpvYkNyZWF0b3I6ICdTeXN0ZW0nIH0pXG4gKiAgICAgICAgLnRoZW4oKHYpID0+IHtcbiAqICAgICAgICAgIC8vIERvIHNvbWV0aGluZ1xuICogICAgICAgIH0pO1xuICovXG5leHBvcnQgY2xhc3MgU3lzdGVtRXZlbnREaXNwYXRjaGVyIHtcbiAgICAvKipcbiAgICAgKiAqKiBNZXRob2QgdG8gcG9zdCBTeXN0ZW0gRXZlbnQuXG4gICAgICpcbiAgICAgKiAgIC0gTk9OLUJMT0NLSU5HIGV4ZWN1dGlvbi5cbiAgICAgKiAgIC0gRXhlY3V0aW9uIGlzIG5vbi1ibG9ja2luZywgZS5nLiBpdCBpcyBleGVjdXRlZCBpbiBxdWV1ZSB1c2luZyBzZXRUaW1lb3V0IG9mIDAuXG4gICAgICogICAtIElmIHRoaXJkIHBhcmFtZXRlcnMgaXMgcHJvdmlkZWQgaXQgd2lsbCBleGVjdXRlIGFzIG1hbnkgaGFuZGxlcnMgYXMgaXQgaXMgcmVxdWVzdC5cbiAgICAgKiAgICAgIC0gZS5nLiAxIG9yIDIgb3IgTiBhbmQgd2lsbCBza2lwIHRoZSBvdGhlcnMuXG4gICAgICovXG4gICAgc3RhdGljIHBvc3QoZXZlbnRJZDogU3lzdGVtRXZlbnQsIHBheWxvYWQ6IGFueSwgaGFuZGxlcnNUb0V4ZWN1dGU6IG51bWJlciA9IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJlcGFyZWRIYW5kbGVycyA9IFN5c3RlbUV2ZW50SGFuZGxlclJlZ2lzdHJ5LmdldFByZXBhcmVkQXJyYXlPZkhhbmRsZXJzKGV2ZW50SWQpO1xuXG4gICAgICAgIGxldCBleGVjdXRlZEhhbmRsZXJzID0gMDtcblxuICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXJSZWNvcmQgb2YgcHJlcGFyZWRIYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKCFTeXN0ZW1FdmVudERpc3BhdGNoZXIuZXhlY3V0ZUV4cHJlc3Npb25GaWx0ZXIoaGFuZGxlclJlY29yZCwgZXZlbnRJZCwgcGF5bG9hZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4ZWN1dGVkSGFuZGxlcnMrKztcblxuICAgICAgICAgICAgY29uc3QgaXNIYW5kbGVyQWN0aXZlID0gKGU6IFN5c3RlbUV2ZW50KSA9PlxuICAgICAgICAgICAgICAgIFN5c3RlbUV2ZW50SGFuZGxlclJlZ2lzdHJ5LmZpbmRIYW5kbGVyQnlSZWZlcmVuY2UoZSwgaGFuZGxlclJlY29yZC5oYW5kbGVyUmVmLCBoYW5kbGVyUmVjb3JkLmhhbmRsZXJDbGFzc0luc3RhbmNlKS5hY3RpdmU7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghaXNIYW5kbGVyQWN0aXZlKGV2ZW50SWQpICYmICFpc0hhbmRsZXJBY3RpdmUoU0VfQUxMX0VWRU5UUykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGhhbmRsZXJSZWNvcmQuaGFuZGxlclJlZi5jYWxsKGhhbmRsZXJSZWNvcmQuaGFuZGxlckNsYXNzSW5zdGFuY2UsIHBheWxvYWQsIGV2ZW50SWQpO1xuICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgICAgIGlmIChDb2xsZWN0aW9uc1V0aWwuaXNOdW1iZXIoaGFuZGxlcnNUb0V4ZWN1dGUpICYmIGV4ZWN1dGVkSGFuZGxlcnMgPj0gaGFuZGxlcnNUb0V4ZWN1dGUpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIE1ldGhvZCB0byBzZW5kIFN5c3RlbSBFdmVudC5cbiAgICAgKlxuICAgICAqICAgLSBCTE9DS0lORyBleGVjdXRpb24uXG4gICAgICogICAtIEV4ZWN1dGlvbiBpcyBibG9ja2luZywgZS5nLiBpdCBpcyBhY2hpZXZlZCB1c2luZyBQcm9taXNlcywgYW5kIGV2ZXJ5IGhhbmRsZXIgbXVzdCByZXR1cm4gUHJvbWlzZS5cbiAgICAgKiAgIC0gSWYgdGhpcmQgcGFyYW1ldGVycyBpcyBwcm92aWRlZCBpdCB3aWxsIGV4ZWN1dGUgYXMgbWFueSBoYW5kbGVycyBhcyBpdCBpcyByZXF1ZXN0LlxuICAgICAqICAgICAgLSBlLmcuIDEgb3IgMiBvciBOIGFuZCB3aWxsIHJldHVybiB0aGUgZmxvdyB0byB0aGUgaW52b2tlci5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2VuZChldmVudElkOiBTeXN0ZW1FdmVudCwgcGF5bG9hZDogYW55LCBoYW5kbGVyc1RvRXhlY3V0ZTogbnVtYmVyID0gbnVsbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBwcmVwYXJlZEhhbmRsZXJzID0gU3lzdGVtRXZlbnRIYW5kbGVyUmVnaXN0cnkuZ2V0UHJlcGFyZWRBcnJheU9mSGFuZGxlcnMoZXZlbnRJZCwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIFN5c3RlbUV2ZW50RGlzcGF0Y2hlci5leGVjdXRlU2VuZENvbW1hbmQocHJlcGFyZWRIYW5kbGVycywgZXZlbnRJZCwgcGF5bG9hZCwgaGFuZGxlcnNUb0V4ZWN1dGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEV4ZWN1dGUgc2VuZCBjb21tYW5kIGFuZCBoYW5kbGUgUHJvbWlzZXMgZnJvbSBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBleGVjdXRlU2VuZENvbW1hbmQoXG4gICAgICAgIGhhbmRsZXJzOiBTeXN0ZW1FdmVudEhhbmRsZXJSZWNvcmRbXSxcbiAgICAgICAgZXZlbnRJZDogU3lzdGVtRXZlbnQsXG4gICAgICAgIHBheWxvYWQ6IGFueSxcbiAgICAgICAgaGFuZGxlcnNUb0V4ZWN1dGU6IG51bWJlciA9IG51bGwsXG4gICAgICAgIGV4ZWN1dGVkSGFuZGxlcnMgPSAwXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKENvbGxlY3Rpb25zVXRpbC5pc051bWJlcihoYW5kbGVyc1RvRXhlY3V0ZSkgJiYgaGFuZGxlcnNUb0V4ZWN1dGUgPT09IGV4ZWN1dGVkSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVyRm9yRXhlY3V0aW9uID0gaGFuZGxlcnMucG9wKCk7XG5cbiAgICAgICAgaWYgKCFTeXN0ZW1FdmVudERpc3BhdGNoZXIuZXhlY3V0ZUV4cHJlc3Npb25GaWx0ZXIoaGFuZGxlckZvckV4ZWN1dGlvbiwgZXZlbnRJZCwgcGF5bG9hZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBTeXN0ZW1FdmVudERpc3BhdGNoZXIuZXhlY3V0ZVNlbmRDb21tYW5kKGhhbmRsZXJzLCBldmVudElkLCBwYXlsb2FkLCBoYW5kbGVyc1RvRXhlY3V0ZSwgZXhlY3V0ZWRIYW5kbGVycyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLXJldHVyblxuICAgICAgICByZXR1cm4gaGFuZGxlckZvckV4ZWN1dGlvbi5oYW5kbGVyUmVmXG4gICAgICAgICAgICAuY2FsbChoYW5kbGVyRm9yRXhlY3V0aW9uLmhhbmRsZXJDbGFzc0luc3RhbmNlLCBwYXlsb2FkLCBldmVudElkKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gU3lzdGVtRXZlbnREaXNwYXRjaGVyLmV4ZWN1dGVTZW5kQ29tbWFuZChoYW5kbGVycywgZXZlbnRJZCwgcGF5bG9hZCwgaGFuZGxlcnNUb0V4ZWN1dGUsIGV4ZWN1dGVkSGFuZGxlcnMgKyAxKSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBQcm9taXNlLnJlamVjdChmYWxzZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEV4ZWN1dGUgRXhwcmVzc2lvbiBmaWx0ZXIgZm9yIEhhbmRsZXIgYmVmb3JlIGV4ZWN1dGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBleGVjdXRlRXhwcmVzc2lvbkZpbHRlcihoYW5kbGVyUmVjb3JkOiBTeXN0ZW1FdmVudEhhbmRsZXJSZWNvcmQsIGV2ZW50SWQ6IFN5c3RlbUV2ZW50LCBwYXlsb2FkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZmlsdGVyRXhwcmVzc2lvbiA9IGhhbmRsZXJSZWNvcmQuaGFuZGxlckZpbHRlckV4cHJlc3Npb247XG5cbiAgICAgICAgaWYgKENvbGxlY3Rpb25zVXRpbC5pc05pbChmaWx0ZXJFeHByZXNzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlclJlY29yZC5oYW5kbGVyRmlsdGVyRXhwcmVzc2lvbi5ldmFsdWF0ZShcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcbiAgICAgICAgICAgIFN5c3RlbUV2ZW50Q29tcGFyYWJsZS5vZih7IGV2ZW50SWQsIHBheWxvYWQgfSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=