velocious 1.0.423 → 1.0.424
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/src/configuration.d.ts +2 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +59 -1
- package/build/src/http-server/client/websocket-session.d.ts +5 -0
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +15 -21
- package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts +19 -0
- package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts.map +1 -0
- package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +26 -0
- package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/in-process.js +3 -13
- package/build/src/http-server/worker-handler/worker-thread.d.ts +58 -0
- package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/worker-thread.js +108 -66
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} args - Dispatch arguments.
|
|
3
|
+
* @param {string} args.channel - Channel name.
|
|
4
|
+
* @param {string | undefined} args.createdAt - Event creation timestamp.
|
|
5
|
+
* @param {string | undefined} args.eventId - Event identifier.
|
|
6
|
+
* @param {import("../../configuration.js").default} args.configuration - Configuration instance.
|
|
7
|
+
* @param {import("../../logger.js").default} args.logger - Logger for isolated subscriber failures.
|
|
8
|
+
* @param {any} args.payload - Broadcast payload.
|
|
9
|
+
* @returns {Promise<void>} Resolves after subscribers have been attempted.
|
|
10
|
+
*/
|
|
11
|
+
export default function dispatchChannelSubscribers({ channel, configuration, createdAt, eventId, logger, payload }: {
|
|
12
|
+
channel: string;
|
|
13
|
+
createdAt: string | undefined;
|
|
14
|
+
eventId: string | undefined;
|
|
15
|
+
configuration: import("../../configuration.js").default;
|
|
16
|
+
logger: import("../../logger.js").default;
|
|
17
|
+
payload: any;
|
|
18
|
+
}): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=channel-subscriber-dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-subscriber-dispatch.d.ts","sourceRoot":"","sources":["../../../../src/http-server/worker-handler/channel-subscriber-dispatch.js"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,oHARG;IAAqB,OAAO,EAApB,MAAM;IACmB,SAAS,EAAlC,MAAM,GAAG,SAAS;IACO,OAAO,EAAhC,MAAM,GAAG,SAAS;IAC6B,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;IACA,MAAM,EAA9C,OAAO,iBAAiB,EAAE,OAAO;IACvB,OAAO,EAAjB,GAAG;CACX,GAAU,OAAO,CAAC,IAAI,CAAC,CAgBzB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* @param {object} args - Dispatch arguments.
|
|
4
|
+
* @param {string} args.channel - Channel name.
|
|
5
|
+
* @param {string | undefined} args.createdAt - Event creation timestamp.
|
|
6
|
+
* @param {string | undefined} args.eventId - Event identifier.
|
|
7
|
+
* @param {import("../../configuration.js").default} args.configuration - Configuration instance.
|
|
8
|
+
* @param {import("../../logger.js").default} args.logger - Logger for isolated subscriber failures.
|
|
9
|
+
* @param {any} args.payload - Broadcast payload.
|
|
10
|
+
* @returns {Promise<void>} Resolves after subscribers have been attempted.
|
|
11
|
+
*/
|
|
12
|
+
export default async function dispatchChannelSubscribers({ channel, configuration, createdAt, eventId, logger, payload }) {
|
|
13
|
+
try {
|
|
14
|
+
await configuration.getWebsocketChannelSubscribers().dispatch({ channel, createdAt, eventId, payload });
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
logger.error(() => [`Channel subscriber dispatch failed for ${channel}`, error]);
|
|
18
|
+
const errorPayload = {
|
|
19
|
+
context: { channel, createdAt, eventId, source: "websocket-channel-subscribers" },
|
|
20
|
+
error
|
|
21
|
+
};
|
|
22
|
+
configuration.getErrorEvents().emit("framework-error", errorPayload);
|
|
23
|
+
configuration.getErrorEvents().emit("all-error", { ...errorPayload, errorType: "framework-error" });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC1zdWJzY3JpYmVyLWRpc3BhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2h0dHAtc2VydmVyL3dvcmtlci1oYW5kbGVyL2NoYW5uZWwtc3Vic2NyaWJlci1kaXNwYXRjaC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQUMsRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBQztJQUNwSCxJQUFJLENBQUM7UUFDSCxNQUFNLGFBQWEsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7SUFDdkcsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsMENBQTBDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFFaEYsTUFBTSxZQUFZLEdBQUc7WUFDbkIsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLCtCQUErQixFQUFDO1lBQy9FLEtBQUs7U0FDTixDQUFBO1FBRUQsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUNwRSxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFDLEdBQUcsWUFBWSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBQyxDQUFDLENBQUE7SUFDbkcsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIERpc3BhdGNoIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gYXJncy5jcmVhdGVkQXQgLSBFdmVudCBjcmVhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gYXJncy5ldmVudElkIC0gRXZlbnQgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9sb2dnZXIuanNcIikuZGVmYXVsdH0gYXJncy5sb2dnZXIgLSBMb2dnZXIgZm9yIGlzb2xhdGVkIHN1YnNjcmliZXIgZmFpbHVyZXMuXG4gKiBAcGFyYW0ge2FueX0gYXJncy5wYXlsb2FkIC0gQnJvYWRjYXN0IHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgc3Vic2NyaWJlcnMgaGF2ZSBiZWVuIGF0dGVtcHRlZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZGlzcGF0Y2hDaGFubmVsU3Vic2NyaWJlcnMoe2NoYW5uZWwsIGNvbmZpZ3VyYXRpb24sIGNyZWF0ZWRBdCwgZXZlbnRJZCwgbG9nZ2VyLCBwYXlsb2FkfSkge1xuICB0cnkge1xuICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q2hhbm5lbFN1YnNjcmliZXJzKCkuZGlzcGF0Y2goe2NoYW5uZWwsIGNyZWF0ZWRBdCwgZXZlbnRJZCwgcGF5bG9hZH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKCgpID0+IFtgQ2hhbm5lbCBzdWJzY3JpYmVyIGRpc3BhdGNoIGZhaWxlZCBmb3IgJHtjaGFubmVsfWAsIGVycm9yXSlcblxuICAgIGNvbnN0IGVycm9yUGF5bG9hZCA9IHtcbiAgICAgIGNvbnRleHQ6IHtjaGFubmVsLCBjcmVhdGVkQXQsIGV2ZW50SWQsIHNvdXJjZTogXCJ3ZWJzb2NrZXQtY2hhbm5lbC1zdWJzY3JpYmVyc1wifSxcbiAgICAgIGVycm9yXG4gICAgfVxuXG4gICAgY29uZmlndXJhdGlvbi5nZXRFcnJvckV2ZW50cygpLmVtaXQoXCJmcmFtZXdvcmstZXJyb3JcIiwgZXJyb3JQYXlsb2FkKVxuICAgIGNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKS5lbWl0KFwiYWxsLWVycm9yXCIsIHsuLi5lcnJvclBheWxvYWQsIGVycm9yVHlwZTogXCJmcmFtZXdvcmstZXJyb3JcIn0pXG4gIH1cbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-process.d.ts","sourceRoot":"","sources":["../../../../src/http-server/worker-handler/in-process.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"in-process.d.ts","sourceRoot":"","sources":["../../../../src/http-server/worker-handler/in-process.js"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH;IACE;;;;OAIG;IACH,4CAHG;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;QAC3B,WAAW,EAAxB,MAAM;KAChB,EAWA;IATC,wDAAkC;IAElC,wGAAwG;IACxG,SADW,MAAM,CAAC,MAAM,EAAE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;KAAC,CAAC,CACnF;IAEjB,eAA8B;IAC9B,oBAA8B;IAC9B,qCAAuF;IACvF,mBAAsB;IAGxB,+BAA+B;IAC/B,SADc,OAAO,CAAC,IAAI,CAAC,CAG1B;IAED;;;OAGG;IACH,kCAHW,OAAO,qBAAqB,EAAE,OAAO,GACnC,IAAI,CAwChB;IAED,+BAA+B;IAC/B,QADc,OAAO,CAAC,IAAI,CAAC,CAc1B;IAED;;;;;;;OAOG;IACH;;;;;;;;;;;OAWG;IACH,0EANG;QAAqB,OAAO,EAApB,MAAM;QACoB,eAAe,EAAzC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;QACT,IAAI,EAAd,GAAG;QACW,OAAO;KAC7B,GAAU,IAAI,CAMhB;IAED;;;;;;;OAOG;IACH,iEANG;QAAqB,OAAO,EAApB,MAAM;QACQ,SAAS;QACT,OAAO;QACX,OAAO,EAAjB,GAAG;KACX,GAAU,IAAI,CAiBhB;CACF;mBAhJkB,oBAAoB;mBAEpB,iBAAiB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import Client from "../client/index.js";
|
|
3
|
+
import dispatchChannelSubscribers from "./channel-subscriber-dispatch.js";
|
|
3
4
|
import Logger from "../../logger.js";
|
|
4
5
|
import websocketEventsHost from "../websocket-events-host.js";
|
|
5
6
|
/**
|
|
@@ -118,22 +119,11 @@ export default class VelociousHttpServerInProcessHandler {
|
|
|
118
119
|
void session.sendEvent(channel, payload, { createdAt, eventId });
|
|
119
120
|
}
|
|
120
121
|
if (this.configuration) {
|
|
121
|
-
const configuration = this.configuration;
|
|
122
122
|
// Isolate subscriber failures from breaking the in-process handler,
|
|
123
123
|
// but still surface them to the framework error events so bug
|
|
124
124
|
// reporters can pick them up.
|
|
125
|
-
void configuration.
|
|
126
|
-
.dispatch({ channel, createdAt, eventId, payload })
|
|
127
|
-
.catch((error) => {
|
|
128
|
-
this.logger.error(() => [`Channel subscriber dispatch failed for ${channel}`, error]);
|
|
129
|
-
const errorPayload = {
|
|
130
|
-
context: { channel, createdAt, eventId, source: "websocket-channel-subscribers" },
|
|
131
|
-
error
|
|
132
|
-
};
|
|
133
|
-
configuration.getErrorEvents().emit("framework-error", errorPayload);
|
|
134
|
-
configuration.getErrorEvents().emit("all-error", { ...errorPayload, errorType: "framework-error" });
|
|
135
|
-
});
|
|
125
|
+
void dispatchChannelSubscribers({ channel, configuration: this.configuration, createdAt, eventId, logger: this.logger, payload });
|
|
136
126
|
}
|
|
137
127
|
}
|
|
138
128
|
}
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW4tcHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci93b3JrZXItaGFuZGxlci9pbi1wcm9jZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQTtBQUN2QyxPQUFPLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQTtBQUNwQyxPQUFPLG1CQUFtQixNQUFNLDZCQUE2QixDQUFBO0FBRTdEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxtQ0FBbUM7SUFDdEQ7Ozs7T0FJRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFDO1FBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBRWxDLHdHQUF3RztRQUN4RyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUVqQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3ZGLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO0lBQ3hCLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLHNCQUFzQixJQUFJLENBQUMsV0FBVyxVQUFVLENBQUMsQ0FBQTtJQUNqRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsbUJBQW1CLENBQUMsWUFBWTtRQUM5QixNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFBO1FBRTVDLE1BQU0sVUFBVSxHQUFHLElBQUks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Q0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLENBQUE7Z0JBQ3BFLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUMsR0FBRyxZQUFZLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFDLENBQUMsQ0FBQTtZQUNuRyxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IENsaWVudCBmcm9tIFwiLi4vY2xpZW50L2luZGV4LmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgd2Vic29ja2V0RXZlbnRzSG9zdCBmcm9tIFwiLi4vd2Vic29ja2V0LWV2ZW50cy1ob3N0LmpzXCJcblxuLyoqXG4gKiBJbi1wcm9jZXNzIHdvcmtlciBoYW5kbGVyIHRoYXQgcHJvY2Vzc2VzIEhUVFAgcmVxdWVzdHMgaW4gdGhlIG1haW4gdGhyZWFkXG4gKiBpbnN0ZWFkIG9mIHNwYXduaW5nIGEgV29ya2VyIHRocmVhZC4gVGhpcyBhbGxvd3MgdGhlIHRlc3QgcnVubmVyJ3MgZGF0YWJhc2VcbiAqIGNvbm5lY3Rpb24gY29udGV4dCB0byBiZSBzaGFyZWQgd2l0aCBIVFRQIHJlcXVlc3QgaGFuZGxlcnMsIHNvIG1vZGVsLWNyZWF0ZWRcbiAqIHJlY29yZHMgaW4gdGVzdHMgYXJlIHZpc2libGUgdG8gSFRUUCBlbmRwb2ludHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0h0dHBTZXJ2ZXJJblByb2Nlc3NIYW5kbGVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy53b3JrZXJDb3VudCAtIFdvcmtlciBjb3VudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCB3b3JrZXJDb3VudH0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIHtodHRwQ2xpZW50OiBDbGllbnQsIHNlcnZlckNsaWVudDogaW1wb3J0KFwiLi4vc2VydmVyLWNsaWVudC5qc1wiKS5kZWZhdWx0fT59ICovXG4gICAgdGhpcy5jbGllbnRzID0ge31cblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMud29ya2VyQ291bnQgPSB3b3JrZXJDb3VudFxuICAgIHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0ID0gd2Vic29ja2V0RXZlbnRzSG9zdC5yZWdpc3RlcigvKiogQHR5cGUge2FueX0gKi8gKHRoaXMpKVxuICAgIHRoaXMuX3N0b3BwaW5nID0gZmFsc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgYXdhaXQgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gYEluLXByb2Nlc3MgaGFuZGxlciAke3RoaXMud29ya2VyQ291bnR9IHN0YXJ0ZWRgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VydmVyLWNsaWVudC5qc1wiKS5kZWZhdWx0fSBzZXJ2ZXJDbGllbnQgLSBTZXJ2ZXIgY2xpZW50IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFkZFNvY2tldENvbm5lY3Rpb24oc2VydmVyQ2xpZW50KSB7XG4gICAgY29uc3QgY2xpZW50Q291bnQgPSBzZXJ2ZXJDbGllbnQuY2xpZW50Q291bnRcblxuICAgIGNvbnN0IGh0dHBDbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAgIGNsaWVudENvdW50LFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgcmVtb3RlQWRkcmVzczogc2VydmVyQ2xpZW50LnJlbW90ZUFkZHJlc3NcbiAgICB9KVxuXG4gICAgaHR0cENsaWVudC5ldmVudHMub24oXCJvdXRwdXRcIiwgKG91dHB1dCkgPT4ge1xuICAgICAgaWYgKG91dHB1dCAhPT0gbnVsbCAmJiBvdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2b2lkIHNlcnZlckNsaWVudC5zZW5kKG91dHB1dCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiRmFpbGVkIHRvIGRlbGl2ZXIgY2xpZW50IG91dHB1dFwiLCB7Y2xpZW50Q291bnR9LCBlcnJvcl0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIGh0dHBDbGllbnQuZXZlbnRzLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgdm9pZCBzZXJ2ZXJDbGllbnQuZW5kKClcbiAgICAgIGRlbGV0ZSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdXG4gICAgfSlcblxuICAgIHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF0gPSB7aHR0cENsaWVudCwgc2VydmVyQ2xpZW50fVxuXG4gICAgLy8gQ3JlYXRlIGEgbWVzc2FnZS1wb3J0IHNoaW0gc28gU2VydmVyQ2xpZW50Lm9uU29ja2V0RGF0YSBjYW4gcm91dGUgZGF0YVxuICAgIC8vIHRvIHRoZSBpbi1wcm9jZXNzIEhUVFAgQ2xpZW50IHdpdGhvdXQgbmVlZGluZyBhIHJlYWwgd29ya2VyIHRocmVhZC5cbiAgICBjb25zdCBtZXNzYWdlUG9ydFNoaW0gPSAvKiogQHR5cGUge2ltcG9ydChcIndvcmtlcl90aHJlYWRzXCIpLldvcmtlcn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHtcbiAgICAgIHBvc3RNZXNzYWdlOiAoLyoqIEB0eXBlIHt7Y29tbWFuZDogc3RyaW5nLCBjaHVuaz86IEJ1ZmZlciB8IFVpbnQ4QXJyYXkgfCBzdHJpbmcsIGNsaWVudENvdW50PzogbnVtYmVyfX0gKi8gZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZGF0YS5jb21tYW5kID09PSBcImNsaWVudFdyaXRlXCIgJiYgZGF0YS5jaHVuaykge1xuICAgICAgICAgIGNvbnN0IGNodW5rID0gdHlwZW9mIGRhdGEuY2h1bmsgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLmNodW5rKSA6IEJ1ZmZlci5mcm9tKGRhdGEuY2h1bmspXG5cbiAgICAgICAgICBodHRwQ2xpZW50Lm9uV3JpdGUoY2h1bmspXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSlcblxuICAgIHNlcnZlckNsaWVudC5zZXRXb3JrZXIobWVzc2FnZVBvcnRTaGltKVxuICAgIHNlcnZlckNsaWVudC5saXN0ZW4oKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIHRoaXMuX3N0b3BwaW5nID0gdHJ1ZVxuXG4gICAgZm9yIChjb25zdCB7c2VydmVyQ2xpZW50fSBvZiBPYmplY3QudmFsdWVzKHRoaXMuY2xpZW50cykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZvaWQgc2VydmVyQ2xpZW50LmVuZCgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGNsb3NlIGNsaWVudCBkdXJpbmcgc2h1dGRvd25cIiwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jbGllbnRzID0ge31cbiAgICB0aGlzLnVucmVnaXN0ZXJGcm9tRXZlbnRzSG9zdD8uKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuY3JlYXRlZEF0XSAtIEV2ZW50IGNyZWF0aW9uIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5ldmVudElkXSAtIEV2ZW50IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7YW55fSBhcmdzLnBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgLyoqXG4gICAqIEluLXByb2Nlc3MgaGFuZGxlciBwYXRoIGZvciBWMiBjaGFubmVsIGJyb2FkY2FzdHMuIE5vIHdvcmtlclxuICAgKiBib3VuZGFyeSB0byBjcm9zcyDigJQgZGlzcGF0Y2ggZGlyZWN0bHkgdG8gYW55IG1hdGNoaW5nIGxpdmVcbiAgICogc3Vic2NyaXB0aW9ucyBvbiB0aGUgc2hhcmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5icm9hZGNhc3RQYXJhbXMgLSBSb3V0aW5nIGZpbHRlciBwYXJhbXMuXG4gICAqIEBwYXJhbSB7YW55fSBhcmdzLmJvZHkgLSBNZXNzYWdlIGJvZHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5ldmVudElkXSAtIFBlcnNpc3RlZCBldmVudCBpZCBmb3IgcmVwbGF5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGRpc3BhdGNoV2Vic29ja2V0VjJCcm9hZGNhc3Qoe2JvZHksIGJyb2FkY2FzdFBhcmFtcywgY2hhbm5lbCwgZXZlbnRJZH0pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikgcmV0dXJuXG5cbiAgICAvKiogQHR5cGUge2FueX0gKi8gKHRoaXMuY29uZmlndXJhdGlvbikuX2Jyb2FkY2FzdFRvQ2hhbm5lbExvY2FsKGNoYW5uZWwsIGJyb2FkY2FzdFBhcmFtcywgYm9keSwge2V2ZW50SWR9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jcmVhdGVkQXRdIC0gRXZlbnQgY3JlYXRpb24gdGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmV2ZW50SWRdIC0gRXZlbnQgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHthbnl9IGFyZ3MucGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkaXNwYXRjaFdlYnNvY2tldEV2ZW50KHtjaGFubmVsLCBjcmVhdGVkQXQsIGV2ZW50SWQsIHBheWxvYWR9KSB7XG4gICAgZm9yIChjb25zdCB7aHR0cENsaWVudH0gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmNsaWVudHMpKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gaHR0cENsaWVudC53ZWJzb2NrZXRTZXNzaW9uXG5cbiAgICAgIGlmICghc2Vzc2lvbikgY29udGludWVcblxuICAgICAgdm9pZCBzZXNzaW9uLnNlbmRFdmVudChjaGFubmVsLCBwYXlsb2FkLCB7Y3JlYXRlZEF0LCBldmVudElkfSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uKSB7XG4gICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5jb25maWd1cmF0aW9uXG5cbiAgICAgIC8vIElzb2xhdGUgc3Vic2NyaWJlciBmYWlsdXJlcyBmcm9tIGJyZWFraW5nIHRoZSBpbi1wcm9jZXNzIGhhbmRsZXIsXG4gICAgICAvLyBidXQgc3RpbGwgc3VyZmFjZSB0aGVtIHRvIHRoZSBmcmFtZXdvcmsgZXJyb3IgZXZlbnRzIHNvIGJ1Z1xuICAgICAgLy8gcmVwb3J0ZXJzIGNhbiBwaWNrIHRoZW0gdXAuXG4gICAgICB2b2lkIGNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q2hhbm5lbFN1YnNjcmliZXJzKClcbiAgICAgICAgLmRpc3BhdGNoKHtjaGFubmVsLCBjcmVhdGVkQXQsIGV2ZW50SWQsIHBheWxvYWR9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BDaGFubmVsIHN1YnNjcmliZXIgZGlzcGF0Y2ggZmFpbGVkIGZvciAke2NoYW5uZWx9YCwgZXJyb3JdKVxuXG4gICAgICAgICAgY29uc3QgZXJyb3JQYXlsb2FkID0ge1xuICAgICAgICAgICAgY29udGV4dDoge2NoYW5uZWwsIGNyZWF0ZWRBdCwgZXZlbnRJZCwgc291cmNlOiBcIndlYnNvY2tldC1jaGFubmVsLXN1YnNjcmliZXJzXCJ9LFxuICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKCkuZW1pdChcImZyYW1ld29yay1lcnJvclwiLCBlcnJvclBheWxvYWQpXG4gICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRFcnJvckV2ZW50cygpLmVtaXQoXCJhbGwtZXJyb3JcIiwgey4uLmVycm9yUGF5bG9hZCwgZXJyb3JUeXBlOiBcImZyYW1ld29yay1lcnJvclwifSlcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW4tcHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci93b3JrZXItaGFuZGxlci9pbi1wcm9jZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQTtBQUN2QyxPQUFPLDBCQUEwQixNQUFNLGtDQUFrQyxDQUFBO0FBQ3pFLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sbUJBQW1CLE1BQU0sNkJBQTZCLENBQUE7QUFFN0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLG1DQUFtQztJQUN0RDs7OztPQUlHO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUM7UUFDdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFFbEMsd0dBQXdHO1FBQ3hHLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO1FBRWpCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7UUFDOUIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDdkYsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7SUFDeEIsQ0FBQztJQUVELCtCQUErQjtJQUMvQixLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsc0JBQXNCLElBQUksQ0FBQyxXQUFXLFVBQVUsQ0FBQyxDQUFBO0lBQ2pGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxtQkFBbUIsQ0FBQyxZQUFZO1FBQzlCLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxX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QkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUE7SUFDN0csQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxzQkFBc0IsQ0FBQyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQztRQUMzRCxLQUFLLE1BQU0sRUFBQyxVQUFVLEVBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQTtZQUUzQyxJQUFJLENBQUMsT0FBTztnQkFBRSxTQUFRO1lBRXRCLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7UUFDaEUsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLG9FQUFvRTtZQUNwRSw4REFBOEQ7WUFDOUQsOEJBQThCO1lBQzlCLEtBQUssMEJBQTBCLENBQUMsRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1FBQ2pJLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IENsaWVudCBmcm9tIFwiLi4vY2xpZW50L2luZGV4LmpzXCJcbmltcG9ydCBkaXNwYXRjaENoYW5uZWxTdWJzY3JpYmVycyBmcm9tIFwiLi9jaGFubmVsLXN1YnNjcmliZXItZGlzcGF0Y2guanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCB3ZWJzb2NrZXRFdmVudHNIb3N0IGZyb20gXCIuLi93ZWJzb2NrZXQtZXZlbnRzLWhvc3QuanNcIlxuXG4vKipcbiAqIEluLXByb2Nlc3Mgd29ya2VyIGhhbmRsZXIgdGhhdCBwcm9jZXNzZXMgSFRUUCByZXF1ZXN0cyBpbiB0aGUgbWFpbiB0aHJlYWRcbiAqIGluc3RlYWQgb2Ygc3Bhd25pbmcgYSBXb3JrZXIgdGhyZWFkLiBUaGlzIGFsbG93cyB0aGUgdGVzdCBydW5uZXIncyBkYXRhYmFzZVxuICogY29ubmVjdGlvbiBjb250ZXh0IHRvIGJlIHNoYXJlZCB3aXRoIEhUVFAgcmVxdWVzdCBoYW5kbGVycywgc28gbW9kZWwtY3JlYXRlZFxuICogcmVjb3JkcyBpbiB0ZXN0cyBhcmUgdmlzaWJsZSB0byBIVFRQIGVuZHBvaW50cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckluUHJvY2Vzc0hhbmRsZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLndvcmtlckNvdW50IC0gV29ya2VyIGNvdW50LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHdvcmtlckNvdW50fSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwge2h0dHBDbGllbnQ6IENsaWVudCwgc2VydmVyQ2xpZW50OiBpbXBvcnQoXCIuLi9zZXJ2ZXItY2xpZW50LmpzXCIpLmRlZmF1bHR9Pn0gKi9cbiAgICB0aGlzLmNsaWVudHMgPSB7fVxuXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG4gICAgdGhpcy53b3JrZXJDb3VudCA9IHdvcmtlckNvdW50XG4gICAgdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3QgPSB3ZWJzb2NrZXRFdmVudHNIb3N0LnJlZ2lzdGVyKC8qKiBAdHlwZSB7YW55fSAqLyAodGhpcykpXG4gICAgdGhpcy5fc3RvcHBpbmcgPSBmYWxzZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBgSW4tcHJvY2VzcyBoYW5kbGVyICR7dGhpcy53b3JrZXJDb3VudH0gc3RhcnRlZGApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZXJ2ZXItY2xpZW50LmpzXCIpLmRlZmF1bHR9IHNlcnZlckNsaWVudCAtIFNlcnZlciBjbGllbnQgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkU29ja2V0Q29ubmVjdGlvbihzZXJ2ZXJDbGllbnQpIHtcbiAgICBjb25zdCBjbGllbnRDb3VudCA9IHNlcnZlckNsaWVudC5jbGllbnRDb3VudFxuXG4gICAgY29uc3QgaHR0cENsaWVudCA9IG5ldyBDbGllbnQoe1xuICAgICAgY2xpZW50Q291bnQsXG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICByZW1vdGVBZGRyZXNzOiBzZXJ2ZXJDbGllbnQucmVtb3RlQWRkcmVzc1xuICAgIH0pXG5cbiAgICBodHRwQ2xpZW50LmV2ZW50cy5vbihcIm91dHB1dFwiLCAob3V0cHV0KSA9PiB7XG4gICAgICBpZiAob3V0cHV0ICE9PSBudWxsICYmIG91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZvaWQgc2VydmVyQ2xpZW50LnNlbmQob3V0cHV0KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gZGVsaXZlciBjbGllbnQgb3V0cHV0XCIsIHtjbGllbnRDb3VudH0sIGVycm9yXSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaHR0cENsaWVudC5ldmVudHMub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICB2b2lkIHNlcnZlckNsaWVudC5lbmQoKVxuICAgICAgZGVsZXRlIHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF1cbiAgICB9KVxuXG4gICAgdGhpcy5jbGllbnRzW2NsaWVudENvdW50XSA9IHtodHRwQ2xpZW50LCBzZXJ2ZXJDbGllbnR9XG5cbiAgICAvLyBDcmVhdGUgYSBtZXNzYWdlLXBvcnQgc2hpbSBzbyBTZXJ2ZXJDbGllbnQub25Tb2NrZXREYXRhIGNhbiByb3V0ZSBkYXRhXG4gICAgLy8gdG8gdGhlIGluLXByb2Nlc3MgSFRUUCBDbGllbnQgd2l0aG91dCBuZWVkaW5nIGEgcmVhbCB3b3JrZXIgdGhyZWFkLlxuICAgIGNvbnN0IG1lc3NhZ2VQb3J0U2hpbSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwid29ya2VyX3RocmVhZHNcIikuV29ya2VyfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoe1xuICAgICAgcG9zdE1lc3NhZ2U6ICgvKiogQHR5cGUge3tjb21tYW5kOiBzdHJpbmcsIGNodW5rPzogQnVmZmVyIHwgVWludDhBcnJheSB8IHN0cmluZywgY2xpZW50Q291bnQ/OiBudW1iZXJ9fSAqLyBkYXRhKSA9PiB7XG4gICAgICAgIGlmIChkYXRhLmNvbW1hbmQgPT09IFwiY2xpZW50V3JpdGVcIiAmJiBkYXRhLmNodW5rKSB7XG4gICAgICAgICAgY29uc3QgY2h1bmsgPSB0eXBlb2YgZGF0YS5jaHVuayA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEuY2h1bmspIDogQnVmZmVyLmZyb20oZGF0YS5jaHVuaylcblxuICAgICAgICAgIGh0dHBDbGllbnQub25Xcml0ZShjaHVuaylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKVxuXG4gICAgc2VydmVyQ2xpZW50LnNldFdvcmtlcihtZXNzYWdlUG9ydFNoaW0pXG4gICAgc2VydmVyQ2xpZW50Lmxpc3RlbigpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5fc3RvcHBpbmcgPSB0cnVlXG5cbiAgICBmb3IgKGNvbnN0IHtzZXJ2ZXJDbGllbnR9IG9mIE9iamVjdC52YWx1ZXModGhpcy5jbGllbnRzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdm9pZCBzZXJ2ZXJDbGllbnQuZW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJGYWlsZWQgdG8gY2xvc2UgY2xpZW50IGR1cmluZyBzaHV0ZG93blwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudHMgPSB7fVxuICAgIHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0Py4oKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jcmVhdGVkQXRdIC0gRXZlbnQgY3JlYXRpb24gdGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmV2ZW50SWRdIC0gRXZlbnQgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHthbnl9IGFyZ3MucGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICAvKipcbiAgICogSW4tcHJvY2VzcyBoYW5kbGVyIHBhdGggZm9yIFYyIGNoYW5uZWwgYnJvYWRjYXN0cy4gTm8gd29ya2VyXG4gICAqIGJvdW5kYXJ5IHRvIGNyb3NzIOKAlCBkaXNwYXRjaCBkaXJlY3RseSB0byBhbnkgbWF0Y2hpbmcgbGl2ZVxuICAgKiBzdWJzY3JpcHRpb25zIG9uIHRoZSBzaGFyZWQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzLmJyb2FkY2FzdFBhcmFtcyAtIFJvdXRpbmcgZmlsdGVyIHBhcmFtcy5cbiAgICogQHBhcmFtIHthbnl9IGFyZ3MuYm9keSAtIE1lc3NhZ2UgYm9keS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmV2ZW50SWRdIC0gUGVyc2lzdGVkIGV2ZW50IGlkIGZvciByZXBsYXkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGlzcGF0Y2hXZWJzb2NrZXRWMkJyb2FkY2FzdCh7Ym9keSwgYnJvYWRjYXN0UGFyYW1zLCBjaGFubmVsLCBldmVudElkfSkge1xuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uKSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7YW55fSAqLyAodGhpcy5jb25maWd1cmF0aW9uKS5fYnJvYWRjYXN0VG9DaGFubmVsTG9jYWwoY2hhbm5lbCwgYnJvYWRjYXN0UGFyYW1zLCBib2R5LCB7ZXZlbnRJZH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNyZWF0ZWRBdF0gLSBFdmVudCBjcmVhdGlvbiB0aW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXZlbnRJZF0gLSBFdmVudCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge2FueX0gYXJncy5wYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGRpc3BhdGNoV2Vic29ja2V0RXZlbnQoe2NoYW5uZWwsIGNyZWF0ZWRBdCwgZXZlbnRJZCwgcGF5bG9hZH0pIHtcbiAgICBmb3IgKGNvbnN0IHtodHRwQ2xpZW50fSBvZiBPYmplY3QudmFsdWVzKHRoaXMuY2xpZW50cykpIHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBodHRwQ2xpZW50LndlYnNvY2tldFNlc3Npb25cblxuICAgICAgaWYgKCFzZXNzaW9uKSBjb250aW51ZVxuXG4gICAgICB2b2lkIHNlc3Npb24uc2VuZEV2ZW50KGNoYW5uZWwsIHBheWxvYWQsIHtjcmVhdGVkQXQsIGV2ZW50SWR9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIC8vIElzb2xhdGUgc3Vic2NyaWJlciBmYWlsdXJlcyBmcm9tIGJyZWFraW5nIHRoZSBpbi1wcm9jZXNzIGhhbmRsZXIsXG4gICAgICAvLyBidXQgc3RpbGwgc3VyZmFjZSB0aGVtIHRvIHRoZSBmcmFtZXdvcmsgZXJyb3IgZXZlbnRzIHNvIGJ1Z1xuICAgICAgLy8gcmVwb3J0ZXJzIGNhbiBwaWNrIHRoZW0gdXAuXG4gICAgICB2b2lkIGRpc3BhdGNoQ2hhbm5lbFN1YnNjcmliZXJzKHtjaGFubmVsLCBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sIGNyZWF0ZWRBdCwgZXZlbnRJZCwgbG9nZ2VyOiB0aGlzLmxvZ2dlciwgcGF5bG9hZH0pXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -59,6 +59,64 @@ export default class VelociousHttpServerWorkerHandlerWorkerThread {
|
|
|
59
59
|
broadcastParams?: Record<string, any> | undefined;
|
|
60
60
|
body?: any;
|
|
61
61
|
}) => Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* @param {object} data - Data payload.
|
|
64
|
+
* @param {number} [data.clientCount] - Client count.
|
|
65
|
+
* @param {string} [data.remoteAddress] - Remote address.
|
|
66
|
+
* @returns {void}
|
|
67
|
+
*/
|
|
68
|
+
handleNewClient(data: {
|
|
69
|
+
clientCount?: number | undefined;
|
|
70
|
+
remoteAddress?: string | undefined;
|
|
71
|
+
}): void;
|
|
72
|
+
/**
|
|
73
|
+
* @param {object} data - Data payload.
|
|
74
|
+
* @param {Buffer | Uint8Array | string} [data.chunk] - Chunk.
|
|
75
|
+
* @param {number} [data.clientCount] - Client count.
|
|
76
|
+
* @returns {Promise<void>} Resolves when the client write is dispatched.
|
|
77
|
+
*/
|
|
78
|
+
handleClientWrite(data: {
|
|
79
|
+
chunk?: string | Buffer<ArrayBufferLike> | Uint8Array<ArrayBufferLike> | undefined;
|
|
80
|
+
clientCount?: number | undefined;
|
|
81
|
+
}): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* @param {object} data - Data payload.
|
|
84
|
+
* @param {string} [data.channel] - Channel name.
|
|
85
|
+
* @param {string} [data.createdAt] - Event creation time.
|
|
86
|
+
* @param {string} [data.eventId] - Event identifier.
|
|
87
|
+
* @param {any} [data.payload] - Payload data.
|
|
88
|
+
* @returns {Promise<void>} Resolves when the websocket event is dispatched.
|
|
89
|
+
*/
|
|
90
|
+
handleWebsocketEvent(data: {
|
|
91
|
+
channel?: string | undefined;
|
|
92
|
+
createdAt?: string | undefined;
|
|
93
|
+
eventId?: string | undefined;
|
|
94
|
+
payload?: any;
|
|
95
|
+
}): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* @param {object} data - Data payload.
|
|
98
|
+
* @param {Record<string, any>} [data.broadcastParams] - V2 broadcast filter params.
|
|
99
|
+
* @param {any} [data.body] - V2 broadcast body.
|
|
100
|
+
* @param {string} [data.channel] - Channel name.
|
|
101
|
+
* @param {string} [data.eventId] - Event identifier.
|
|
102
|
+
* @returns {void}
|
|
103
|
+
*/
|
|
104
|
+
handleWebsocketV2Broadcast(data: {
|
|
105
|
+
broadcastParams?: Record<string, any> | undefined;
|
|
106
|
+
body?: any;
|
|
107
|
+
channel?: string | undefined;
|
|
108
|
+
eventId?: string | undefined;
|
|
109
|
+
}): void;
|
|
110
|
+
/**
|
|
111
|
+
* @param {object} data - Data payload.
|
|
112
|
+
* @param {number} [data.requestId] - Debug request id.
|
|
113
|
+
* @returns {void}
|
|
114
|
+
*/
|
|
115
|
+
handleDebugSnapshot(data: {
|
|
116
|
+
requestId?: number | undefined;
|
|
117
|
+
}): void;
|
|
118
|
+
/** @returns {Promise<void>} Resolves after worker shutdown has been requested. */
|
|
119
|
+
handleShutdown(): Promise<void>;
|
|
62
120
|
/**
|
|
63
121
|
* @param {object} args - Options object.
|
|
64
122
|
* @param {string} args.channel - Channel name.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-thread.d.ts","sourceRoot":"","sources":["../../../../src/http-server/worker-handler/worker-thread.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worker-thread.d.ts","sourceRoot":"","sources":["../../../../src/http-server/worker-handler/worker-thread.js"],"names":[],"mappings":"AAsBA;IACE;;;;OAIG;IACH,wCAHG;QAAkD,UAAU,EAApD,gDAAmC;QACiD,UAAU,EAA9F;YAAC,KAAK,EAAE,OAAO,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAC;KACvF,EAwBA;IAlBC,qCAAqC;IACrC,SADW,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAChB;IAEjB,eAA8B;IAC9B,sDAA4B;IAC5B;eAZiB,OAAO;mBAAa,MAAM;qBAAe,MAAM;qBAAe,MAAM;MAYzD;IAC5B,oBAA8B;IAchC;;OAEG;IACH,cAFa,OAAO,CAAC,IAAI,CAAC,CA0BzB;IAnBC,uDAAuD;IACvD,oEAAgD;IAUhD,6CAAwG;IAGxG,qCAA2E;IAO7E;;;;;;;;;;;;;OAaG;IACH,YAAmB,MAZhB;QAAqB,OAAO,EAApB,MAAM;QAC8B,KAAK;QAC3B,aAAa;QACb,WAAW;QACX,OAAO;QACP,SAAS;QACT,OAAO;QACP,SAAS;QACZ,OAAO,GAAlB,GAAG;QACwB,eAAe;QAC/B,IAAI,GAAf,GAAG;KAES,mBAoBtB;IAED;;;;;OAKG;IACH,sBAJG;QAAsB,WAAW;QACX,aAAa;KACnC,GAAU,IAAI,CAyBhB;IAED;;;;;OAKG;IACH,wBAJG;QAA4C,KAAK;QAC3B,WAAW;KACjC,GAAU,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;;;;;OAOG;IACH,2BANG;QAAsB,OAAO;QACP,SAAS;QACT,OAAO;QACV,OAAO,GAAlB,GAAG;KACX,GAAU,OAAO,CAAC,IAAI,CAAC,CAQzB;IAED;;;;;;;OAOG;IACH,iCANG;QAAmC,eAAe;QAC/B,IAAI,GAAf,GAAG;QACW,OAAO;QACP,OAAO;KAC7B,GAAU,IAAI,CAShB;IAED;;;;OAIG;IACH,0BAHG;QAAsB,SAAS;KAC/B,GAAU,IAAI,CAahB;IAED,kFAAkF;IAClF,kBADc,OAAO,CAAC,IAAI,CAAC,CAQ1B;IAED;;;;;;;OAOG;IACH,kEANG;QAAqB,OAAO,EAApB,MAAM;QACmB,SAAS,EAAlC,MAAM,GAAG,SAAS;QACO,OAAO,EAAhC,MAAM,GAAG,SAAS;QACR,OAAO,EAAjB,GAAG;KACX,GAAU,OAAO,CAAC,IAAI,CAAC,CA2BzB;CACF;mBAvQkB,oBAAoB;mBAIpB,iBAAiB;4BAER,wBAAwB;wBAP5B,sBAAsB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import Application from "../../application.js";
|
|
3
3
|
import Client from "../client/index.js";
|
|
4
|
+
import dispatchChannelSubscribers from "./channel-subscriber-dispatch.js";
|
|
4
5
|
import { digg } from "diggerize";
|
|
5
6
|
import errorLogger from "../../error-logger.js";
|
|
6
7
|
import Logger from "../../logger.js";
|
|
@@ -82,74 +83,126 @@ export default class VelociousHttpServerWorkerHandlerWorkerThread {
|
|
|
82
83
|
await this.logger.debugLowLevel(() => [`Worker ${this.workerCount} received command`, data]);
|
|
83
84
|
const command = data.command;
|
|
84
85
|
if (command == "newClient") {
|
|
85
|
-
|
|
86
|
-
throw new Error("Configuration not initialized");
|
|
87
|
-
const { clientCount, remoteAddress } = data;
|
|
88
|
-
if (typeof clientCount !== "number")
|
|
89
|
-
throw new Error("clientCount must be a number");
|
|
90
|
-
const client = new Client({
|
|
91
|
-
clientCount,
|
|
92
|
-
configuration: this.configuration,
|
|
93
|
-
remoteAddress
|
|
94
|
-
});
|
|
95
|
-
client.events.on("output", (output) => {
|
|
96
|
-
this.parentPort.postMessage({ command: "clientOutput", clientCount, output });
|
|
97
|
-
});
|
|
98
|
-
client.events.on("close", (output) => {
|
|
99
|
-
this.logger.debugLowLevel(() => "Close received from client in worker - forwarding to worker parent");
|
|
100
|
-
this.parentPort.postMessage({ command: "clientClose", clientCount, output });
|
|
101
|
-
});
|
|
102
|
-
this.clients[clientCount] = client;
|
|
86
|
+
this.handleNewClient(data);
|
|
103
87
|
}
|
|
104
88
|
else if (command == "clientWrite") {
|
|
105
|
-
await this.
|
|
106
|
-
const { chunk, clientCount } = data;
|
|
107
|
-
if (!chunk)
|
|
108
|
-
throw new Error("No chunk given");
|
|
109
|
-
const client = /** @type {Client | undefined} */ (digg(this.clients, clientCount));
|
|
110
|
-
if (!client)
|
|
111
|
-
throw new Error(`Client not found for clientWrite: ${clientCount}`);
|
|
112
|
-
const clientChunk = typeof chunk === "string" ? Buffer.from(chunk) : Buffer.from(chunk);
|
|
113
|
-
await this.logger.debug(() => ["Sending clientWrite to parser", { clientCount, ...summarizeClientWriteChunk(clientChunk) }]);
|
|
114
|
-
client.onWrite(clientChunk);
|
|
89
|
+
await this.handleClientWrite(data);
|
|
115
90
|
}
|
|
116
91
|
else if (command == "websocketEvent") {
|
|
117
|
-
|
|
118
|
-
if (typeof channel !== "string")
|
|
119
|
-
throw new Error("No channel given");
|
|
120
|
-
await this.broadcastWebsocketEvent({ channel, createdAt, eventId, payload });
|
|
92
|
+
await this.handleWebsocketEvent(data);
|
|
121
93
|
}
|
|
122
94
|
else if (command == "websocketV2Broadcast") {
|
|
123
|
-
|
|
124
|
-
if (typeof channel !== "string")
|
|
125
|
-
throw new Error("No channel given");
|
|
126
|
-
if (!this.configuration)
|
|
127
|
-
throw new Error("Configuration not initialized");
|
|
128
|
-
this.configuration._broadcastToChannelLocal(channel, broadcastParams || {}, body, { eventId });
|
|
95
|
+
this.handleWebsocketV2Broadcast(data);
|
|
129
96
|
}
|
|
130
97
|
else if (command == "debugSnapshot") {
|
|
131
|
-
|
|
132
|
-
if (typeof requestId !== "number")
|
|
133
|
-
throw new Error("debugSnapshot requestId must be a number");
|
|
134
|
-
if (!this.configuration)
|
|
135
|
-
throw new Error("Configuration not initialized");
|
|
136
|
-
this.parentPort.postMessage({
|
|
137
|
-
command: "debugSnapshot",
|
|
138
|
-
requestId,
|
|
139
|
-
snapshot: this.configuration.getLocalDebugSnapshot()
|
|
140
|
-
});
|
|
98
|
+
this.handleDebugSnapshot(data);
|
|
141
99
|
}
|
|
142
100
|
else if (command == "shutdown") {
|
|
143
|
-
|
|
144
|
-
await this.configuration.closeDatabaseConnections();
|
|
145
|
-
}
|
|
146
|
-
this.parentPort.postMessage({ command: "shutdownComplete" });
|
|
147
|
-
process.exit(0);
|
|
101
|
+
await this.handleShutdown();
|
|
148
102
|
}
|
|
149
103
|
else {
|
|
150
104
|
throw new Error(`Unknown command: ${command}`);
|
|
151
105
|
}
|
|
152
106
|
};
|
|
107
|
+
/**
|
|
108
|
+
* @param {object} data - Data payload.
|
|
109
|
+
* @param {number} [data.clientCount] - Client count.
|
|
110
|
+
* @param {string} [data.remoteAddress] - Remote address.
|
|
111
|
+
* @returns {void}
|
|
112
|
+
*/
|
|
113
|
+
handleNewClient(data) {
|
|
114
|
+
if (!this.configuration)
|
|
115
|
+
throw new Error("Configuration not initialized");
|
|
116
|
+
const { clientCount, remoteAddress } = data;
|
|
117
|
+
if (typeof clientCount !== "number")
|
|
118
|
+
throw new Error("clientCount must be a number");
|
|
119
|
+
const client = new Client({
|
|
120
|
+
clientCount,
|
|
121
|
+
configuration: this.configuration,
|
|
122
|
+
remoteAddress
|
|
123
|
+
});
|
|
124
|
+
client.events.on("output", (output) => {
|
|
125
|
+
this.parentPort.postMessage({ command: "clientOutput", clientCount, output });
|
|
126
|
+
});
|
|
127
|
+
client.events.on("close", (output) => {
|
|
128
|
+
this.logger.debugLowLevel(() => "Close received from client in worker - forwarding to worker parent");
|
|
129
|
+
this.parentPort.postMessage({ command: "clientClose", clientCount, output });
|
|
130
|
+
});
|
|
131
|
+
this.clients[clientCount] = client;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* @param {object} data - Data payload.
|
|
135
|
+
* @param {Buffer | Uint8Array | string} [data.chunk] - Chunk.
|
|
136
|
+
* @param {number} [data.clientCount] - Client count.
|
|
137
|
+
* @returns {Promise<void>} Resolves when the client write is dispatched.
|
|
138
|
+
*/
|
|
139
|
+
async handleClientWrite(data) {
|
|
140
|
+
await this.logger.debugLowLevel("Looking up client");
|
|
141
|
+
const { chunk, clientCount } = data;
|
|
142
|
+
if (!chunk)
|
|
143
|
+
throw new Error("No chunk given");
|
|
144
|
+
const client = /** @type {Client | undefined} */ (digg(this.clients, clientCount));
|
|
145
|
+
if (!client)
|
|
146
|
+
throw new Error(`Client not found for clientWrite: ${clientCount}`);
|
|
147
|
+
const clientChunk = typeof chunk === "string" ? Buffer.from(chunk) : Buffer.from(chunk);
|
|
148
|
+
await this.logger.debug(() => ["Sending clientWrite to parser", { clientCount, ...summarizeClientWriteChunk(clientChunk) }]);
|
|
149
|
+
client.onWrite(clientChunk);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* @param {object} data - Data payload.
|
|
153
|
+
* @param {string} [data.channel] - Channel name.
|
|
154
|
+
* @param {string} [data.createdAt] - Event creation time.
|
|
155
|
+
* @param {string} [data.eventId] - Event identifier.
|
|
156
|
+
* @param {any} [data.payload] - Payload data.
|
|
157
|
+
* @returns {Promise<void>} Resolves when the websocket event is dispatched.
|
|
158
|
+
*/
|
|
159
|
+
async handleWebsocketEvent(data) {
|
|
160
|
+
const { channel, createdAt, eventId, payload } = data;
|
|
161
|
+
if (typeof channel !== "string")
|
|
162
|
+
throw new Error("No channel given");
|
|
163
|
+
await this.broadcastWebsocketEvent({ channel, createdAt, eventId, payload });
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* @param {object} data - Data payload.
|
|
167
|
+
* @param {Record<string, any>} [data.broadcastParams] - V2 broadcast filter params.
|
|
168
|
+
* @param {any} [data.body] - V2 broadcast body.
|
|
169
|
+
* @param {string} [data.channel] - Channel name.
|
|
170
|
+
* @param {string} [data.eventId] - Event identifier.
|
|
171
|
+
* @returns {void}
|
|
172
|
+
*/
|
|
173
|
+
handleWebsocketV2Broadcast(data) {
|
|
174
|
+
const { body, broadcastParams, channel, eventId } = data;
|
|
175
|
+
if (typeof channel !== "string")
|
|
176
|
+
throw new Error("No channel given");
|
|
177
|
+
if (!this.configuration)
|
|
178
|
+
throw new Error("Configuration not initialized");
|
|
179
|
+
this.configuration._broadcastToChannelLocal(channel, broadcastParams || {}, body, { eventId });
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* @param {object} data - Data payload.
|
|
183
|
+
* @param {number} [data.requestId] - Debug request id.
|
|
184
|
+
* @returns {void}
|
|
185
|
+
*/
|
|
186
|
+
handleDebugSnapshot(data) {
|
|
187
|
+
const { requestId } = data;
|
|
188
|
+
if (typeof requestId !== "number")
|
|
189
|
+
throw new Error("debugSnapshot requestId must be a number");
|
|
190
|
+
if (!this.configuration)
|
|
191
|
+
throw new Error("Configuration not initialized");
|
|
192
|
+
this.parentPort.postMessage({
|
|
193
|
+
command: "debugSnapshot",
|
|
194
|
+
requestId,
|
|
195
|
+
snapshot: this.configuration.getLocalDebugSnapshot()
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
/** @returns {Promise<void>} Resolves after worker shutdown has been requested. */
|
|
199
|
+
async handleShutdown() {
|
|
200
|
+
if (this.configuration?.closeDatabaseConnections) {
|
|
201
|
+
await this.configuration.closeDatabaseConnections();
|
|
202
|
+
}
|
|
203
|
+
this.parentPort.postMessage({ command: "shutdownComplete" });
|
|
204
|
+
process.exit(0);
|
|
205
|
+
}
|
|
153
206
|
/**
|
|
154
207
|
* @param {object} args - Options object.
|
|
155
208
|
* @param {string} args.channel - Channel name.
|
|
@@ -173,24 +226,13 @@ export default class VelociousHttpServerWorkerHandlerWorkerThread {
|
|
|
173
226
|
}));
|
|
174
227
|
}
|
|
175
228
|
if (this.configuration) {
|
|
176
|
-
const configuration = this.configuration;
|
|
177
229
|
// Isolate channel subscriber failures so a buggy in-process callback
|
|
178
230
|
// cannot reject this command and crash the worker thread, but still
|
|
179
231
|
// surface the error to the framework error events so bug reporters
|
|
180
232
|
// can pick it up.
|
|
181
|
-
sendTasks.push(configuration.
|
|
182
|
-
.dispatch({ channel, createdAt, eventId, payload })
|
|
183
|
-
.catch((error) => {
|
|
184
|
-
this.logger.error(() => [`Channel subscriber dispatch failed for ${channel}`, error]);
|
|
185
|
-
const errorPayload = {
|
|
186
|
-
context: { channel, createdAt, eventId, source: "websocket-channel-subscribers" },
|
|
187
|
-
error
|
|
188
|
-
};
|
|
189
|
-
configuration.getErrorEvents().emit("framework-error", errorPayload);
|
|
190
|
-
configuration.getErrorEvents().emit("all-error", { ...errorPayload, errorType: "framework-error" });
|
|
191
|
-
}));
|
|
233
|
+
sendTasks.push(dispatchChannelSubscribers({ channel, configuration: this.configuration, createdAt, eventId, logger: this.logger, payload }));
|
|
192
234
|
}
|
|
193
235
|
await Promise.all(sendTasks);
|
|
194
236
|
}
|
|
195
237
|
}
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLXRocmVhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci93b3JrZXItaGFuZGxlci93b3JrZXItdGhyZWFkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQTtBQUN2QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8saUJBQWlCLE1BQU0sb0NBQW9DLENBQUE7QUFDbEUsT0FBTyxlQUFlLE1BQU0sd0JBQXdCLENBQUE7QUFFcEQ7OztHQUdHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxLQUFLO0lBQ3RDLE1BQU0sZUFBZSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMzRixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRTVJLE9BQU8sRUFBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQTtBQUNsRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyw0Q0FBNEM7SUFDL0Q7Ozs7T0FJRztJQUNILFlBQVksRUFB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QU8sRUFBRTtnQkFDakQsU0FBUztnQkFDVCxPQUFPO2FBQ1IsQ0FBQyxDQUFDLENBQUE7UUFDTCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQTtZQUV4QyxxRUFBcUU7WUFDckUsb0VBQW9FO1lBQ3BFLG1FQUFtRTtZQUNuRSxrQkFBa0I7WUFDbEIsU0FBUyxDQUFDLElBQUksQ0FDWixhQUFhLENBQUMsOEJBQThCLEVBQUU7aUJBQzNDLFFBQVEsQ0FBQyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQyxDQUFDO2lCQUNoRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDBDQUEwQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO2dCQUVyRixNQUFNLFlBQVksR0FBRztvQkFDbkIsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLCtCQUErQixFQUFDO29CQUMvRSxLQUFLO2lCQUNOLENBQUE7Z0JBRUQsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLENBQUMsQ0FBQTtnQkFDcEUsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBQyxHQUFHLFlBQVksRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUMsQ0FBQyxDQUFBO1lBQ25HLENBQUMsQ0FBQyxDQUNMLENBQUE7UUFDSCxDQUFDO1FBRUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQXBwbGljYXRpb24gZnJvbSBcIi4uLy4uL2FwcGxpY2F0aW9uLmpzXCJcbmltcG9ydCBDbGllbnQgZnJvbSBcIi4uL2NsaWVudC9pbmRleC5qc1wiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IGVycm9yTG9nZ2VyIGZyb20gXCIuLi8uLi9lcnJvci1sb2dnZXIuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCB0b0ltcG9ydFNwZWNpZmllciBmcm9tIFwiLi4vLi4vdXRpbHMvdG8taW1wb3J0LXNwZWNpZmllci5qc1wiXG5pbXBvcnQgV2Vic29ja2V0RXZlbnRzIGZyb20gXCIuLi93ZWJzb2NrZXQtZXZlbnRzLmpzXCJcblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlciB8IFVpbnQ4QXJyYXkgfCBzdHJpbmd9IGNodW5rIC0gQ2xpZW50IGlucHV0IHBheWxvYWQuXG4gKiBAcmV0dXJucyB7e2xlbmd0aDogbnVtYmVyLCBwcmV2aWV3OiBzdHJpbmd9fSAtIENodW5rIHN1bW1hcnkgZm9yIGxvZ2dpbmcuXG4gKi9cbmZ1bmN0aW9uIHN1bW1hcml6ZUNsaWVudFdyaXRlQ2h1bmsoY2h1bmspIHtcbiAgY29uc3Qgbm9ybWFsaXplZENodW5rID0gdHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiID8gQnVmZmVyLmZyb20oY2h1bmspIDogQnVmZmVyLmZyb20oY2h1bmspXG4gIGNvbnN0IHByZXZpZXcgPSBub3JtYWxpemVkQ2h1bmsudG9TdHJpbmcoXCJsYXRpbjFcIiwgMCwgTWF0aC5taW4obm9ybWFsaXplZENodW5rLmxlbmd0aCwgMTYwKSkucmVwbGFjZUFsbChcIlxcclwiLCBcIlxcXFxyXCIpLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcXFxcblwiKVxuXG4gIHJldHVybiB7bGVuZ3RoOiBub3JtYWxpemVkQ2h1bmsubGVuZ3RoLCBwcmV2aWV3fVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyV29ya2VySGFuZGxlcldvcmtlclRocmVhZCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIndvcmtlcl90aHJlYWRzXCIpLnBhcmVudFBvcnR9IGFyZ3MucGFyZW50UG9ydCAtIFBhcmVudCBwb3J0LlxuICAgKiBAcGFyYW0ge3tkZWJ1ZzogYm9vbGVhbiwgZGlyZWN0b3J5OiBzdHJpbmcsIGVudmlyb25tZW50OiBzdHJpbmcsIHdvcmtlckNvdW50OiBudW1iZXJ9fSBhcmdzLndvcmtlckRhdGEgLSBXb3JrZXIgY29uZmlndXJhdGlvbiBkZXRhaWxzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe3BhcmVudFBvcnQsIHdvcmtlckRhdGF9KSB7XG4gICAgaWYgKCFwYXJlbnRQb3J0KSB0aHJvdyBuZXcgRXJyb3IoXCJwYXJlbnRQb3J0IGlzIHJlcXVpcmVkXCIpXG5cbiAgICBjb25zdCB7d29ya2VyQ291bnR9ID0gd29ya2VyRGF0YVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBDbGllbnQ+fSAqL1xuICAgIHRoaXMuY2xpZW50cyA9IHt9XG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLnBhcmVudFBvcnQgPSBwYXJlbnRQb3J0XG4gICAgdGhpcy53b3JrZXJEYXRhID0gd29ya2VyRGF0YVxuICAgIHRoaXMud29ya2VyQ291bnQgPSB3b3JrZXJDb3VudFxuXG4gICAgcGFyZW50UG9ydC5vbihcIm1lc3NhZ2VcIiwgZXJyb3JMb2dnZXIodGhpcy5vbkNvbW1hbmQpKVxuXG4gICAgdGhpcy5pbml0aWFsaXplKCkudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXBwbGljYXRpb24pIHRocm93IG5ldyBFcnJvcihcIkFwcGxpY2F0aW9uIG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgICB0aGlzLmFwcGxpY2F0aW9uLmluaXRpYWxpemUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBgV29ya2VyICR7d29ya2VyQ291bnR9IHN0YXJ0ZWRgKVxuICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcInN0YXJ0ZWRcIn0pXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKSB7XG4gICAgY29uc3Qge2RlYnVnLCBkaXJlY3RvcnksIGVudmlyb25tZW50fSA9IHRoaXMud29ya2VyRGF0YVxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25QYXRoID0gYCR7ZGlyZWN0b3J5fS9zcmMvY29uZmlnL2NvbmZpZ3VyYXRpb24uanNgXG4gICAgY29uc3QgY29uZmlndXJhdGlvbkltcG9ydCA9IGF3YWl0IGltcG9ydCh0b0ltcG9ydFNwZWNpZmllcihjb25maWd1cmF0aW9uUGF0aCkpXG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gKi9cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uSW1wb3J0LmRlZmF1bHRcblxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZ3VyYXRpb24gY291bGRuJ3QgYmUgbG9hZGVkIGZyb206ICR7Y29uZmlndXJhdGlvblBhdGh9YClcblxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmNvbmZpZ3VyYXRpb25cblxuICAgIGNvbmZpZ3VyYXRpb24uZGVidWcgPSBkZWJ1ZyA9PT0gdHJ1ZVxuICAgIGNvbmZpZ3VyYXRpb24uc2V0RW52aXJvbm1lbnQoZW52aXJvbm1lbnQpXG4gICAgY29uZmlndXJhdGlvbi5zZXRDdXJyZW50KClcbiAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJXb3JrZXIgdGhyZWFkIGNvbmZpZ3VyYXRpb24gbG9hZGVkXCIsIHtkZWJ1ZzogY29uZmlndXJhdGlvbi5kZWJ1Zywgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnR9XSlcbiAgICB0aGlzLndlYnNvY2tldEV2ZW50cyA9IG5ldyBXZWJzb2NrZXRFdmVudHMoe3BhcmVudFBvcnQ6IHRoaXMucGFyZW50UG9ydCwgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnR9KVxuICAgIGNvbmZpZ3VyYXRpb24uc2V0V2Vic29ja2V0RXZlbnRzKHRoaXMud2Vic29ja2V0RXZlbnRzKVxuXG4gICAgdGhpcy5hcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbih7Y29uZmlndXJhdGlvbiwgdHlwZTogXCJ3b3JrZXItaGFuZGxlclwifSlcblxuICAgIGlmICghY29uZmlndXJhdGlvbi5pc0luaXRpYWxpemVkKCkpIHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uaW5pdGlhbGl6ZSh7dHlwZTogXCJ3b3JrZXItaGFuZGxlclwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhLmNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcGFyYW0ge0J1ZmZlciB8IFVpbnQ4QXJyYXkgfCBzdHJpbmd9IFtkYXRhLmNodW5rXSAtIENodW5rLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEucmVtb3RlQWRkcmVzc10gLSBSZW1vdGUgYWRkcmVzcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLmNsaWVudENvdW50XSAtIENsaWVudCBjb3VudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmNoYW5uZWxdIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuY3JlYXRlZEF0XSAtIEV2ZW50IGNyZWF0aW9uIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5ldmVudElkXSAtIEV2ZW50IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5yZXF1ZXN0SWRdIC0gRGVidWcgcmVxdWVzdCBpZC5cbiAgICogQHBhcmFtIHthbnl9IFtkYXRhLnBheWxvYWRdIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtkYXRhLmJyb2FkY2FzdFBhcmFtc10gLSBWMiBicm9hZGNhc3QgZmlsdGVyIHBhcmFtcy5cbiAgICogQHBhcmFtIHthbnl9IFtkYXRhLmJvZHldIC0gVjIgYnJvYWRjYXN0IGJvZHkuXG4gICAqL1xuICBvbkNvbW1hbmQgPSBhc3luYyAoZGF0YSkgPT4ge1xuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gW2BXb3JrZXIgJHt0aGlzLndvcmtlckNvdW50fSByZWNlaXZlZCBjb21tYW5kYCwgZGF0YV0pXG5cbiAgICBjb25zdCBjb21tYW5kID0gZGF0YS5jb21tYW5kXG5cbiAgICBpZiAoY29tbWFuZCA9PSBcIm5ld0NsaWVudFwiKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgICAgY29uc3Qge2NsaWVudENvdW50LCByZW1vdGVBZGRyZXNzfSA9IGRhdGFcblxuICAgICAgaWYgKHR5cGVvZiBjbGllbnRDb3VudCAhPT0gXCJudW1iZXJcIikgdGhyb3cgbmV3IEVycm9yKFwiY2xpZW50Q291bnQgbXVzdCBiZSBhIG51bWJlclwiKVxuXG4gICAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAgICAgY2xpZW50Q291bnQsXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgcmVtb3RlQWRkcmVzc1xuICAgICAgfSlcblxuICAgICAgY2xpZW50LmV2ZW50cy5vbihcIm91dHB1dFwiLCAob3V0cHV0KSA9PiB7XG4gICAgICAgIHRoaXMucGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJjbGllbnRPdXRwdXRcIiwgY2xpZW50Q291bnQsIG91dHB1dH0pXG4gICAgICB9KVxuXG4gICAgICBjbGllbnQuZXZlbnRzLm9uKFwiY2xvc2VcIiwgKG91dHB1dCkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IFwiQ2xvc2UgcmVjZWl2ZWQgZnJvbSBjbGllbnQgaW4gd29ya2VyIC0gZm9yd2FyZGluZyB0byB3b3JrZXIgcGFyZW50XCIpXG4gICAgICAgIHRoaXMucGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJjbGllbnRDbG9zZVwiLCBjbGllbnRDb3VudCwgb3V0cHV0fSlcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF0gPSBjbGllbnRcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjbGllbnRXcml0ZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKFwiTG9va2luZyB1cCBjbGllbnRcIilcblxuICAgICAgY29uc3Qge2NodW5rLCBjbGllbnRDb3VudH0gPSBkYXRhXG4gICAgICBpZiAoIWNodW5rKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaHVuayBnaXZlblwiKVxuICAgICAgY29uc3QgY2xpZW50ID0gLyoqIEB0eXBlIHtDbGllbnQgfCB1bmRlZmluZWR9ICovIChkaWdnKHRoaXMuY2xpZW50cywgY2xpZW50Q291bnQpKVxuXG4gICAgICBpZiAoIWNsaWVudCkgdGhyb3cgbmV3IEVycm9yKGBDbGllbnQgbm90IGZvdW5kIGZvciBjbGllbnRXcml0ZTogJHtjbGllbnRDb3VudH1gKVxuXG4gICAgICBjb25zdCBjbGllbnRDaHVuayA9IHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGNodW5rKSA6IEJ1ZmZlci5mcm9tKGNodW5rKVxuXG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJTZW5kaW5nIGNsaWVudFdyaXRlIHRvIHBhcnNlclwiLCB7Y2xpZW50Q291bnQsIC4uLnN1bW1hcml6ZUNsaWVudFdyaXRlQ2h1bmsoY2xpZW50Q2h1bmspfV0pXG5cbiAgICAgIGNsaWVudC5vbldyaXRlKGNsaWVudENodW5rKVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcIndlYnNvY2tldEV2ZW50XCIpIHtcbiAgICAgIGNvbnN0IHtjaGFubmVsLCBjcmVhdGVkQXQsIGV2ZW50SWQsIHBheWxvYWR9ID0gZGF0YVxuXG4gICAgICBpZiAodHlwZW9mIGNoYW5uZWwgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIk5vIGNoYW5uZWwgZ2l2ZW5cIilcblxuICAgICAgYXdhaXQgdGhpcy5icm9hZGNhc3RXZWJzb2NrZXRFdmVudCh7Y2hhbm5lbCwgY3JlYXRlZEF0LCBldmVudElkLCBwYXlsb2FkfSlcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJ3ZWJzb2NrZXRWMkJyb2FkY2FzdFwiKSB7XG4gICAgICBjb25zdCB7Ym9keSwgYnJvYWRjYXN0UGFyYW1zLCBjaGFubmVsLCBldmVudElkfSA9IGRhdGFcblxuICAgICAgaWYgKHR5cGVvZiBjaGFubmVsICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaGFubmVsIGdpdmVuXCIpXG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl9icm9hZGNhc3RUb0NoYW5uZWxMb2NhbChjaGFubmVsLCBicm9hZGNhc3RQYXJhbXMgfHwge30sIGJvZHksIHtldmVudElkfSlcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJkZWJ1Z1NuYXBzaG90XCIpIHtcbiAgICAgIGNvbnN0IHtyZXF1ZXN0SWR9ID0gZGF0YVxuXG4gICAgICBpZiAodHlwZW9mIHJlcXVlc3RJZCAhPT0gXCJudW1iZXJcIikgdGhyb3cgbmV3IEVycm9yKFwiZGVidWdTbmFwc2hvdCByZXF1ZXN0SWQgbXVzdCBiZSBhIG51bWJlclwiKVxuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIkNvbmZpZ3VyYXRpb24gbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICAgIHRoaXMucGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGNvbW1hbmQ6IFwiZGVidWdTbmFwc2hvdFwiLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHNuYXBzaG90OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0TG9jYWxEZWJ1Z1NuYXBzaG90KClcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwic2h1dGRvd25cIikge1xuICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbj8uY2xvc2VEYXRhYmFzZUNvbm5lY3Rpb25zKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5jbG9zZURhdGFiYXNlQ29ubmVjdGlvbnMoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnBhcmVudFBvcnQucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwic2h1dGRvd25Db21wbGV0ZVwifSlcbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBhcmdzLmNyZWF0ZWRBdCAtIEV2ZW50IGNyZWF0aW9uIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBhcmdzLmV2ZW50SWQgLSBFdmVudCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge2FueX0gYXJncy5wYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYnJvYWRjYXN0V2Vic29ja2V0RXZlbnQoe2NoYW5uZWwsIGNyZWF0ZWRBdCwgZXZlbnRJZCwgcGF5bG9hZH0pIHtcbiAgICBjb25zdCBzZW5kVGFza3MgPSBbXVxuXG4gICAgZm9yIChjb25zdCBjbGllbnRLZXkgb2YgT2JqZWN0LmtleXModGhpcy5jbGllbnRzKSkge1xuICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRzW051bWJlcihjbGllbnRLZXkpXVxuICAgICAgaWYgKCFjbGllbnQpIGNvbnRpbnVlXG4gICAgICBjb25zdCBzZXNzaW9uID0gY2xpZW50LndlYnNvY2tldFNlc3Npb25cblxuICAgICAgaWYgKCFzZXNzaW9uKSBjb250aW51ZVxuXG4gICAgICBzZW5kVGFza3MucHVzaChzZXNzaW9uLnNlbmRFdmVudChjaGFubmVsLCBwYXlsb2FkLCB7XG4gICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgZXZlbnRJZFxuICAgICAgfSkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbikge1xuICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuY29uZmlndXJhdGlvblxuXG4gICAgICAvLyBJc29sYXRlIGNoYW5uZWwgc3Vic2NyaWJlciBmYWlsdXJlcyBzbyBhIGJ1Z2d5IGluLXByb2Nlc3MgY2FsbGJhY2tcbiAgICAgIC8vIGNhbm5vdCByZWplY3QgdGhpcyBjb21tYW5kIGFuZCBjcmFzaCB0aGUgd29ya2VyIHRocmVhZCwgYnV0IHN0aWxsXG4gICAgICAvLyBzdXJmYWNlIHRoZSBlcnJvciB0byB0aGUgZnJhbWV3b3JrIGVycm9yIGV2ZW50cyBzbyBidWcgcmVwb3J0ZXJzXG4gICAgICAvLyBjYW4gcGljayBpdCB1cC5cbiAgICAgIHNlbmRUYXNrcy5wdXNoKFxuICAgICAgICBjb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxTdWJzY3JpYmVycygpXG4gICAgICAgICAgLmRpc3BhdGNoKHtjaGFubmVsLCBjcmVhdGVkQXQsIGV2ZW50SWQsIHBheWxvYWR9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgQ2hhbm5lbCBzdWJzY3JpYmVyIGRpc3BhdGNoIGZhaWxlZCBmb3IgJHtjaGFubmVsfWAsIGVycm9yXSlcblxuICAgICAgICAgICAgY29uc3QgZXJyb3JQYXlsb2FkID0ge1xuICAgICAgICAgICAgICBjb250ZXh0OiB7Y2hhbm5lbCwgY3JlYXRlZEF0LCBldmVudElkLCBzb3VyY2U6IFwid2Vic29ja2V0LWNoYW5uZWwtc3Vic2NyaWJlcnNcIn0sXG4gICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKS5lbWl0KFwiZnJhbWV3b3JrLWVycm9yXCIsIGVycm9yUGF5bG9hZClcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKS5lbWl0KFwiYWxsLWVycm9yXCIsIHsuLi5lcnJvclBheWxvYWQsIGVycm9yVHlwZTogXCJmcmFtZXdvcmstZXJyb3JcIn0pXG4gICAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChzZW5kVGFza3MpXG4gIH1cbn1cbiJdfQ==
|
|
238
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLXRocmVhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci93b3JrZXItaGFuZGxlci93b3JrZXItdGhyZWFkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQTtBQUN2QyxPQUFPLDBCQUEwQixNQUFNLGtDQUFrQyxDQUFBO0FBQ3pFLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxXQUFXLE1BQU0sdUJBQXVCLENBQUE7QUFDL0MsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxpQkFBaUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUNsRSxPQUFPLGVBQWUsTUFBTSx3QkFBd0IsQ0FBQTtBQUVwRDs7O0dBR0c7QUFDSCxTQUFTLHlCQUF5QixDQUFDLEtBQUs7SUFDdEMsTUFBTSxlQUFlLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNGLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFFNUksT0FBTyxFQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxDQUFBO0FBQ2xELENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFP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TSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQXBwbGljYXRpb24gZnJvbSBcIi4uLy4uL2FwcGxpY2F0aW9uLmpzXCJcbmltcG9ydCBDbGllbnQgZnJvbSBcIi4uL2NsaWVudC9pbmRleC5qc1wiXG5pbXBvcnQgZGlzcGF0Y2hDaGFubmVsU3Vic2NyaWJlcnMgZnJvbSBcIi4vY2hhbm5lbC1zdWJzY3JpYmVyLWRpc3BhdGNoLmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgZXJyb3JMb2dnZXIgZnJvbSBcIi4uLy4uL2Vycm9yLWxvZ2dlci5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IHRvSW1wb3J0U3BlY2lmaWVyIGZyb20gXCIuLi8uLi91dGlscy90by1pbXBvcnQtc3BlY2lmaWVyLmpzXCJcbmltcG9ydCBXZWJzb2NrZXRFdmVudHMgZnJvbSBcIi4uL3dlYnNvY2tldC1ldmVudHMuanNcIlxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyIHwgVWludDhBcnJheSB8IHN0cmluZ30gY2h1bmsgLSBDbGllbnQgaW5wdXQgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHt7bGVuZ3RoOiBudW1iZXIsIHByZXZpZXc6IHN0cmluZ319IC0gQ2h1bmsgc3VtbWFyeSBmb3IgbG9nZ2luZy5cbiAqL1xuZnVuY3Rpb24gc3VtbWFyaXplQ2xpZW50V3JpdGVDaHVuayhjaHVuaykge1xuICBjb25zdCBub3JtYWxpemVkQ2h1bmsgPSB0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShjaHVuaykgOiBCdWZmZXIuZnJvbShjaHVuaylcbiAgY29uc3QgcHJldmlldyA9IG5vcm1hbGl6ZWRDaHVuay50b1N0cmluZyhcImxhdGluMVwiLCAwLCBNYXRoLm1pbihub3JtYWxpemVkQ2h1bmsubGVuZ3RoLCAxNjApKS5yZXBsYWNlQWxsKFwiXFxyXCIsIFwiXFxcXHJcIikucmVwbGFjZUFsbChcIlxcblwiLCBcIlxcXFxuXCIpXG5cbiAgcmV0dXJuIHtsZW5ndGg6IG5vcm1hbGl6ZWRDaHVuay5sZW5ndGgsIHByZXZpZXd9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0h0dHBTZXJ2ZXJXb3JrZXJIYW5kbGVyV29ya2VyVGhyZWFkIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwid29ya2VyX3RocmVhZHNcIikucGFyZW50UG9ydH0gYXJncy5wYXJlbnRQb3J0IC0gUGFyZW50IHBvcnQuXG4gICAqIEBwYXJhbSB7e2RlYnVnOiBib29sZWFuLCBkaXJlY3Rvcnk6IHN0cmluZywgZW52aXJvbm1lbnQ6IHN0cmluZywgd29ya2VyQ291bnQ6IG51bWJlcn19IGFyZ3Mud29ya2VyRGF0YSAtIFdvcmtlciBjb25maWd1cmF0aW9uIGRldGFpbHMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7cGFyZW50UG9ydCwgd29ya2VyRGF0YX0pIHtcbiAgICBpZiAoIXBhcmVudFBvcnQpIHRocm93IG5ldyBFcnJvcihcInBhcmVudFBvcnQgaXMgcmVxdWlyZWRcIilcblxuICAgIGNvbnN0IHt3b3JrZXJDb3VudH0gPSB3b3JrZXJEYXRhXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIENsaWVudD59ICovXG4gICAgdGhpcy5jbGllbnRzID0ge31cblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMucGFyZW50UG9ydCA9IHBhcmVudFBvcnRcbiAgICB0aGlzLndvcmtlckRhdGEgPSB3b3JrZXJEYXRhXG4gICAgdGhpcy53b3JrZXJDb3VudCA9IHdvcmtlckNvdW50XG5cbiAgICBwYXJlbnRQb3J0Lm9uKFwibWVzc2FnZVwiLCBlcnJvckxvZ2dlcih0aGlzLm9uQ29tbWFuZCkpXG5cbiAgICB0aGlzLmluaXRpYWxpemUoKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcHBsaWNhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQXBwbGljYXRpb24gbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICAgIHRoaXMuYXBwbGljYXRpb24uaW5pdGlhbGl6ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IGBXb3JrZXIgJHt3b3JrZXJDb3VudH0gc3RhcnRlZGApXG4gICAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwic3RhcnRlZFwifSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAgICBjb25zdCB7ZGVidWcsIGRpcmVjdG9yeSwgZW52aXJvbm1lbnR9ID0gdGhpcy53b3JrZXJEYXRhXG4gICAgY29uc3QgY29uZmlndXJhdGlvblBhdGggPSBgJHtkaXJlY3Rvcnl9L3NyYy9jb25maWcvY29uZmlndXJhdGlvbi5qc2BcbiAgICBjb25zdCBjb25maWd1cmF0aW9uSW1wb3J0ID0gYXdhaXQgaW1wb3J0KHRvSW1wb3J0U3BlY2lmaWVyKGNvbmZpZ3VyYXRpb25QYXRoKSlcblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSAqL1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25JbXBvcnQuZGVmYXVsdFxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihgQ29uZmlndXJhdGlvbiBjb3VsZG4ndCBiZSBsb2FkZWQgZnJvbTogJHtjb25maWd1cmF0aW9uUGF0aH1gKVxuXG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuY29uZmlndXJhdGlvblxuXG4gICAgY29uZmlndXJhdGlvbi5kZWJ1ZyA9IGRlYnVnID09PSB0cnVlXG4gICAgY29uZmlndXJhdGlvbi5zZXRFbnZpcm9ubWVudChlbnZpcm9ubWVudClcbiAgICBjb25maWd1cmF0aW9uLnNldEN1cnJlbnQoKVxuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIldvcmtlciB0aHJlYWQgY29uZmlndXJhdGlvbiBsb2FkZWRcIiwge2RlYnVnOiBjb25maWd1cmF0aW9uLmRlYnVnLCB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudH1dKVxuICAgIHRoaXMud2Vic29ja2V0RXZlbnRzID0gbmV3IFdlYnNvY2tldEV2ZW50cyh7cGFyZW50UG9ydDogdGhpcy5wYXJlbnRQb3J0LCB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudH0pXG4gICAgY29uZmlndXJhdGlvbi5zZXRXZWJzb2NrZXRFdmVudHModGhpcy53ZWJzb2NrZXRFdmVudHMpXG5cbiAgICB0aGlzLmFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uKHtjb25maWd1cmF0aW9uLCB0eXBlOiBcIndvcmtlci1oYW5kbGVyXCJ9KVxuXG4gICAgaWYgKCFjb25maWd1cmF0aW9uLmlzSW5pdGlhbGl6ZWQoKSkge1xuICAgICAgYXdhaXQgY29uZmlndXJhdGlvbi5pbml0aWFsaXplKHt0eXBlOiBcIndvcmtlci1oYW5kbGVyXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEuY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEBwYXJhbSB7QnVmZmVyIHwgVWludDhBcnJheSB8IHN0cmluZ30gW2RhdGEuY2h1bmtdIC0gQ2h1bmsuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5yZW1vdGVBZGRyZXNzXSAtIFJlbW90ZSBhZGRyZXNzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGEuY2xpZW50Q291bnRdIC0gQ2xpZW50IGNvdW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuY2hhbm5lbF0gLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5jcmVhdGVkQXRdIC0gRXZlbnQgY3JlYXRpb24gdGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmV2ZW50SWRdIC0gRXZlbnQgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLnJlcXVlc3RJZF0gLSBEZWJ1ZyByZXF1ZXN0IGlkLlxuICAgKiBAcGFyYW0ge2FueX0gW2RhdGEucGF5bG9hZF0gLSBQYXlsb2FkIGRhdGEuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2RhdGEuYnJvYWRjYXN0UGFyYW1zXSAtIFYyIGJyb2FkY2FzdCBmaWx0ZXIgcGFyYW1zLlxuICAgKiBAcGFyYW0ge2FueX0gW2RhdGEuYm9keV0gLSBWMiBicm9hZGNhc3QgYm9keS5cbiAgICovXG4gIG9uQ29tbWFuZCA9IGFzeW5jIChkYXRhKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBbYFdvcmtlciAke3RoaXMud29ya2VyQ291bnR9IHJlY2VpdmVkIGNvbW1hbmRgLCBkYXRhXSlcblxuICAgIGNvbnN0IGNvbW1hbmQgPSBkYXRhLmNvbW1hbmRcblxuICAgIGlmIChjb21tYW5kID09IFwibmV3Q2xpZW50XCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlTmV3Q2xpZW50KGRhdGEpXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiY2xpZW50V3JpdGVcIikge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDbGllbnRXcml0ZShkYXRhKVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcIndlYnNvY2tldEV2ZW50XCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlV2Vic29ja2V0RXZlbnQoZGF0YSlcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJ3ZWJzb2NrZXRWMkJyb2FkY2FzdFwiKSB7XG4gICAgICB0aGlzLmhhbmRsZVdlYnNvY2tldFYyQnJvYWRjYXN0KGRhdGEpXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiZGVidWdTbmFwc2hvdFwiKSB7XG4gICAgICB0aGlzLmhhbmRsZURlYnVnU25hcHNob3QoZGF0YSlcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJzaHV0ZG93blwiKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVNodXRkb3duKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLmNsaWVudENvdW50XSAtIENsaWVudCBjb3VudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLnJlbW90ZUFkZHJlc3NdIC0gUmVtb3RlIGFkZHJlc3MuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgaGFuZGxlTmV3Q2xpZW50KGRhdGEpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgIGNvbnN0IHtjbGllbnRDb3VudCwgcmVtb3RlQWRkcmVzc30gPSBkYXRhXG5cbiAgICBpZiAodHlwZW9mIGNsaWVudENvdW50ICE9PSBcIm51bWJlclwiKSB0aHJvdyBuZXcgRXJyb3IoXCJjbGllbnRDb3VudCBtdXN0IGJlIGEgbnVtYmVyXCIpXG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAgIGNsaWVudENvdW50LFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgcmVtb3RlQWRkcmVzc1xuICAgIH0pXG5cbiAgICBjbGllbnQuZXZlbnRzLm9uKFwib3V0cHV0XCIsIChvdXRwdXQpID0+IHtcbiAgICAgIHRoaXMucGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJjbGllbnRPdXRwdXRcIiwgY2xpZW50Q291bnQsIG91dHB1dH0pXG4gICAgfSlcblxuICAgIGNsaWVudC5ldmVudHMub24oXCJjbG9zZVwiLCAob3V0cHV0KSA9PiB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IFwiQ2xvc2UgcmVjZWl2ZWQgZnJvbSBjbGllbnQgaW4gd29ya2VyIC0gZm9yd2FyZGluZyB0byB3b3JrZXIgcGFyZW50XCIpXG4gICAgICB0aGlzLnBhcmVudFBvcnQucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwiY2xpZW50Q2xvc2VcIiwgY2xpZW50Q291bnQsIG91dHB1dH0pXG4gICAgfSlcblxuICAgIHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF0gPSBjbGllbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtCdWZmZXIgfCBVaW50OEFycmF5IHwgc3RyaW5nfSBbZGF0YS5jaHVua10gLSBDaHVuay5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLmNsaWVudENvdW50XSAtIENsaWVudCBjb3VudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gdGhlIGNsaWVudCB3cml0ZSBpcyBkaXNwYXRjaGVkLlxuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ2xpZW50V3JpdGUoZGF0YSkge1xuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoXCJMb29raW5nIHVwIGNsaWVudFwiKVxuXG4gICAgY29uc3Qge2NodW5rLCBjbGllbnRDb3VudH0gPSBkYXRhXG4gICAgaWYgKCFjaHVuaykgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2h1bmsgZ2l2ZW5cIilcbiAgICBjb25zdCBjbGllbnQgPSAvKiogQHR5cGUge0NsaWVudCB8IHVuZGVmaW5lZH0gKi8gKGRpZ2codGhpcy5jbGllbnRzLCBjbGllbnRDb3VudCkpXG5cbiAgICBpZiAoIWNsaWVudCkgdGhyb3cgbmV3IEVycm9yKGBDbGllbnQgbm90IGZvdW5kIGZvciBjbGllbnRXcml0ZTogJHtjbGllbnRDb3VudH1gKVxuXG4gICAgY29uc3QgY2xpZW50Q2h1bmsgPSB0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShjaHVuaykgOiBCdWZmZXIuZnJvbShjaHVuaylcblxuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlNlbmRpbmcgY2xpZW50V3JpdGUgdG8gcGFyc2VyXCIsIHtjbGllbnRDb3VudCwgLi4uc3VtbWFyaXplQ2xpZW50V3JpdGVDaHVuayhjbGllbnRDaHVuayl9XSlcblxuICAgIGNsaWVudC5vbldyaXRlKGNsaWVudENodW5rKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuY2hhbm5lbF0gLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5jcmVhdGVkQXRdIC0gRXZlbnQgY3JlYXRpb24gdGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmV2ZW50SWRdIC0gRXZlbnQgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHthbnl9IFtkYXRhLnBheWxvYWRdIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiB0aGUgd2Vic29ja2V0IGV2ZW50IGlzIGRpc3BhdGNoZWQuXG4gICAqL1xuICBhc3luYyBoYW5kbGVXZWJzb2NrZXRFdmVudChkYXRhKSB7XG4gICAgY29uc3Qge2NoYW5uZWwsIGNyZWF0ZWRBdCwgZXZlbnRJZCwgcGF5bG9hZH0gPSBkYXRhXG5cbiAgICBpZiAodHlwZW9mIGNoYW5uZWwgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIk5vIGNoYW5uZWwgZ2l2ZW5cIilcblxuICAgIGF3YWl0IHRoaXMuYnJvYWRjYXN0V2Vic29ja2V0RXZlbnQoe2NoYW5uZWwsIGNyZWF0ZWRBdCwgZXZlbnRJZCwgcGF5bG9hZH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2RhdGEuYnJvYWRjYXN0UGFyYW1zXSAtIFYyIGJyb2FkY2FzdCBmaWx0ZXIgcGFyYW1zLlxuICAgKiBAcGFyYW0ge2FueX0gW2RhdGEuYm9keV0gLSBWMiBicm9hZGNhc3QgYm9keS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmNoYW5uZWxdIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuZXZlbnRJZF0gLSBFdmVudCBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGhhbmRsZVdlYnNvY2tldFYyQnJvYWRjYXN0KGRhdGEpIHtcbiAgICBjb25zdCB7Ym9keSwgYnJvYWRjYXN0UGFyYW1zLCBjaGFubmVsLCBldmVudElkfSA9IGRhdGFcblxuICAgIGlmICh0eXBlb2YgY2hhbm5lbCAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2hhbm5lbCBnaXZlblwiKVxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJDb25maWd1cmF0aW9uIG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl9icm9hZGNhc3RUb0NoYW5uZWxMb2NhbChjaGFubmVsLCBicm9hZGNhc3RQYXJhbXMgfHwge30sIGJvZHksIHtldmVudElkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLnJlcXVlc3RJZF0gLSBEZWJ1ZyByZXF1ZXN0IGlkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGhhbmRsZURlYnVnU25hcHNob3QoZGF0YSkge1xuICAgIGNvbnN0IHtyZXF1ZXN0SWR9ID0gZGF0YVxuXG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0SWQgIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcImRlYnVnU25hcHNob3QgcmVxdWVzdElkIG11c3QgYmUgYSBudW1iZXJcIilcbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgIHRoaXMucGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICBjb21tYW5kOiBcImRlYnVnU25hcHNob3RcIixcbiAgICAgIHJlcXVlc3RJZCxcbiAgICAgIHNuYXBzaG90OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0TG9jYWxEZWJ1Z1NuYXBzaG90KClcbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciB3b3JrZXIgc2h1dGRvd24gaGFzIGJlZW4gcmVxdWVzdGVkLiAqL1xuICBhc3luYyBoYW5kbGVTaHV0ZG93bigpIHtcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uPy5jbG9zZURhdGFiYXNlQ29ubmVjdGlvbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5jbG9zZURhdGFiYXNlQ29ubmVjdGlvbnMoKVxuICAgIH1cblxuICAgIHRoaXMucGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJzaHV0ZG93bkNvbXBsZXRlXCJ9KVxuICAgIHByb2Nlc3MuZXhpdCgwKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBhcmdzLmNyZWF0ZWRBdCAtIEV2ZW50IGNyZWF0aW9uIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBhcmdzLmV2ZW50SWQgLSBFdmVudCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge2FueX0gYXJncy5wYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYnJvYWRjYXN0V2Vic29ja2V0RXZlbnQoe2NoYW5uZWwsIGNyZWF0ZWRBdCwgZXZlbnRJZCwgcGF5bG9hZH0pIHtcbiAgICBjb25zdCBzZW5kVGFza3MgPSBbXVxuXG4gICAgZm9yIChjb25zdCBjbGllbnRLZXkgb2YgT2JqZWN0LmtleXModGhpcy5jbGllbnRzKSkge1xuICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRzW051bWJlcihjbGllbnRLZXkpXVxuICAgICAgaWYgKCFjbGllbnQpIGNvbnRpbnVlXG4gICAgICBjb25zdCBzZXNzaW9uID0gY2xpZW50LndlYnNvY2tldFNlc3Npb25cblxuICAgICAgaWYgKCFzZXNzaW9uKSBjb250aW51ZVxuXG4gICAgICBzZW5kVGFza3MucHVzaChzZXNzaW9uLnNlbmRFdmVudChjaGFubmVsLCBwYXlsb2FkLCB7XG4gICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgZXZlbnRJZFxuICAgICAgfSkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbikge1xuICAgICAgLy8gSXNvbGF0ZSBjaGFubmVsIHN1YnNjcmliZXIgZmFpbHVyZXMgc28gYSBidWdneSBpbi1wcm9jZXNzIGNhbGxiYWNrXG4gICAgICAvLyBjYW5ub3QgcmVqZWN0IHRoaXMgY29tbWFuZCBhbmQgY3Jhc2ggdGhlIHdvcmtlciB0aHJlYWQsIGJ1dCBzdGlsbFxuICAgICAgLy8gc3VyZmFjZSB0aGUgZXJyb3IgdG8gdGhlIGZyYW1ld29yayBlcnJvciBldmVudHMgc28gYnVnIHJlcG9ydGVyc1xuICAgICAgLy8gY2FuIHBpY2sgaXQgdXAuXG4gICAgICBzZW5kVGFza3MucHVzaChkaXNwYXRjaENoYW5uZWxTdWJzY3JpYmVycyh7Y2hhbm5lbCwgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLCBjcmVhdGVkQXQsIGV2ZW50SWQsIGxvZ2dlcjogdGhpcy5sb2dnZXIsIHBheWxvYWR9KSlcbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChzZW5kVGFza3MpXG4gIH1cbn1cbiJdfQ==
|