velocious 1.0.557 → 1.0.559
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/README.md +17 -3
- package/build/background-jobs/main.js +35 -12
- package/build/background-jobs/store.js +262 -16
- package/build/background-jobs/web/authorization.js +5 -4
- package/build/background-jobs/web/controller.js +13 -16
- package/build/background-jobs/web/counts-channel.js +79 -0
- package/build/background-jobs/web/index.js +2 -0
- package/build/background-jobs/web/registry.js +1 -1
- package/build/background-jobs/worker.js +53 -28
- package/build/database/record/index.js +12 -0
- package/build/frontend-models/base.js +192 -41
- package/build/http-client/websocket-client.js +48 -0
- package/build/src/background-jobs/main.d.ts +14 -1
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +37 -14
- package/build/src/background-jobs/store.d.ts +79 -0
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +235 -17
- package/build/src/background-jobs/web/authorization.d.ts +5 -3
- package/build/src/background-jobs/web/authorization.d.ts.map +1 -1
- package/build/src/background-jobs/web/authorization.js +6 -5
- package/build/src/background-jobs/web/controller.d.ts.map +1 -1
- package/build/src/background-jobs/web/controller.js +14 -15
- package/build/src/background-jobs/web/counts-channel.d.ts +31 -0
- package/build/src/background-jobs/web/counts-channel.d.ts.map +1 -0
- package/build/src/background-jobs/web/counts-channel.js +71 -0
- package/build/src/background-jobs/web/index.d.ts.map +1 -1
- package/build/src/background-jobs/web/index.js +3 -1
- package/build/src/background-jobs/web/registry.d.ts +1 -1
- package/build/src/background-jobs/web/registry.d.ts.map +1 -1
- package/build/src/background-jobs/web/registry.js +2 -2
- package/build/src/background-jobs/worker.d.ts +18 -1
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +55 -31
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +9 -1
- package/build/src/frontend-models/base.d.ts +13 -4
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +173 -44
- package/build/src/http-client/websocket-client.d.ts +3 -0
- package/build/src/http-client/websocket-client.d.ts.map +1 -1
- package/build/src/http-client/websocket-client.js +42 -1
- package/build/src/tenants/tenant.d.ts +20 -9
- package/build/src/tenants/tenant.d.ts.map +1 -1
- package/build/src/tenants/tenant.js +47 -12
- package/build/src/testing/factory/factory-registry.d.ts +22 -3
- package/build/src/testing/factory/factory-registry.d.ts.map +1 -1
- package/build/src/testing/factory/factory-registry.js +32 -9
- package/build/src/testing/factory/factory-runner.d.ts +16 -4
- package/build/src/testing/factory/factory-runner.d.ts.map +1 -1
- package/build/src/testing/factory/factory-runner.js +33 -10
- package/build/src/utils/shutdown-lifecycle.d.ts +12 -0
- package/build/src/utils/shutdown-lifecycle.d.ts.map +1 -0
- package/build/src/utils/shutdown-lifecycle.js +36 -0
- package/build/tenants/tenant.js +51 -11
- package/build/testing/factory/factory-registry.js +33 -8
- package/build/testing/factory/factory-runner.js +38 -12
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/shutdown-lifecycle.js +41 -0
- package/package.json +3 -2
- package/src/background-jobs/main.js +35 -12
- package/src/background-jobs/store.js +262 -16
- package/src/background-jobs/web/authorization.js +5 -4
- package/src/background-jobs/web/controller.js +13 -16
- package/src/background-jobs/web/counts-channel.js +79 -0
- package/src/background-jobs/web/index.js +2 -0
- package/src/background-jobs/web/registry.js +1 -1
- package/src/background-jobs/worker.js +53 -28
- package/src/database/record/index.js +12 -0
- package/src/frontend-models/base.js +192 -41
- package/src/http-client/websocket-client.js +48 -0
- package/src/tenants/tenant.js +51 -11
- package/src/testing/factory/factory-registry.js +33 -8
- package/src/testing/factory/factory-runner.js +38 -12
- package/src/utils/shutdown-lifecycle.js +41 -0
|
@@ -11,6 +11,9 @@ export default class VelociousWebsocketClient extends SnapReqWebSocketClient {
|
|
|
11
11
|
* @param {Partial<ConstructorParameters<typeof SnapReqWebSocketClient>[0]>} [args] - Options forwarded to `SnapReqWebSocketClient`.
|
|
12
12
|
*/
|
|
13
13
|
constructor(args?: Partial<ConstructorParameters<typeof SnapReqWebSocketClient>[0]>);
|
|
14
|
+
reconnectGeneration: number;
|
|
15
|
+
/** @type {Set<Promise<void>>} */
|
|
16
|
+
runningReconnectTasks: Set<Promise<void>>;
|
|
14
17
|
}
|
|
15
18
|
import SnapReqWebSocketClient from "snapreq/websocket";
|
|
16
19
|
//# sourceMappingURL=websocket-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../../src/http-client/websocket-client.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH;IACE;;;OAGG;IACH,mBAFW,OAAO,CAAC,qBAAqB,CAAC,OAAO,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../../src/http-client/websocket-client.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH;IACE;;;OAGG;IACH,mBAFW,OAAO,CAAC,qBAAqB,CAAC,OAAO,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,EAW1E;IAHC,4BAA4B;IAC5B,iCAAiC;IACjC,uBADW,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACS;CA+CzC;mCAxEkC,mBAAmB"}
|
|
@@ -20,6 +20,47 @@ export default class VelociousWebsocketClient extends SnapReqWebSocketClient {
|
|
|
20
20
|
url: args.url ?? DEFAULT_URL,
|
|
21
21
|
deserialize: args.deserialize ?? deserializeFrontendModelTransportValue
|
|
22
22
|
});
|
|
23
|
+
this.reconnectGeneration = 0;
|
|
24
|
+
/** @type {Set<Promise<void>>} */
|
|
25
|
+
this.runningReconnectTasks = new Set();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Ignores an online result resolved after reconnect teardown began.
|
|
29
|
+
* @returns {Promise<boolean>} - Whether this client generation is online.
|
|
30
|
+
*/
|
|
31
|
+
async _isOnline() {
|
|
32
|
+
const generation = this.reconnectGeneration;
|
|
33
|
+
const isOnline = await super._isOnline();
|
|
34
|
+
return generation === this.reconnectGeneration && isOnline;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Tracks automatic reconnect work so teardown can drain stale attempts.
|
|
38
|
+
* @returns {Promise<void>} - Resolves after the reconnect attempt settles.
|
|
39
|
+
*/
|
|
40
|
+
async _attemptReconnect() {
|
|
41
|
+
const reconnectTask = super._attemptReconnect();
|
|
42
|
+
this.runningReconnectTasks.add(reconnectTask);
|
|
43
|
+
try {
|
|
44
|
+
await reconnectTask;
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
this.runningReconnectTasks.delete(reconnectTask);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Stops reconnect, drains work that already passed SnapReq's reconnect guard,
|
|
52
|
+
* and clears state changed by a stale attempt while it settled.
|
|
53
|
+
* @returns {Promise<void>} - Resolves once no reconnect can resurrect a socket.
|
|
54
|
+
*/
|
|
55
|
+
async disconnectAndStopReconnect() {
|
|
56
|
+
this.reconnectGeneration += 1;
|
|
57
|
+
await super.disconnectAndStopReconnect();
|
|
58
|
+
if (this.runningReconnectTasks.size === 0)
|
|
59
|
+
return;
|
|
60
|
+
while (this.runningReconnectTasks.size > 0) {
|
|
61
|
+
await Promise.all(this.runningReconnectTasks);
|
|
62
|
+
}
|
|
63
|
+
await super.disconnectAndStopReconnect();
|
|
23
64
|
}
|
|
24
65
|
}
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLHNCQUFzQixNQUFNLG1CQUFtQixDQUFBO0FBQ3RELE9BQU8sRUFBQyxzQ0FBc0MsRUFBQyxNQUFNLCtDQUErQyxDQUFBO0FBRXBHLE1BQU0sV0FBVyxHQUFHLCtCQUErQixDQUFBO0FBRW5EOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sd0JBQXlCLFNBQVEsc0JBQXNCO0lBQzFFOzs7T0FHRztJQUNILFlBQVksSUFBSSxHQUFHLEVBQUU7UUFDbkIsS0FBSyxDQUFDO1lBQ0osR0FBRyxJQUFJO1lBQ1AsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksV0FBVztZQUM1QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxzQ0FBc0M7U0FDeEUsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtRQUM1QixpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxTQUFTO1FBQ2IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFBO1FBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBRXhDLE9BQU8sVUFBVSxLQUFLLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxRQUFRLENBQUE7SUFDNUQsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFL0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUU3QyxJQUFJLENBQUM7WUFDSCxNQUFNLGFBQWEsQ0FBQTtRQUNyQixDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQywwQkFBMEI7UUFDOUIsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsQ0FBQTtRQUM3QixNQUFNLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxDQUFBO1FBRXhDLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTTtRQUVqRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0MsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBQy9DLENBQUM7UUFFRCxNQUFNLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxDQUFBO0lBQzFDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgU25hcFJlcVdlYlNvY2tldENsaWVudCBmcm9tIFwic25hcHJlcS93ZWJzb2NrZXRcIlxuaW1wb3J0IHtkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZX0gZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVscy90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiXG5cbmNvbnN0IERFRkFVTFRfVVJMID0gXCJ3czovLzEyNy4wLjAuMTozMDA2L3dlYnNvY2tldFwiXG5cbi8qKlxuICogVmVsb2Npb3VzJ3MgV2ViU29ja2V0IGNsaWVudC4gVGhlIGNyb3NzLXBsYXRmb3JtIGNvbm5lY3Rpb24vc2Vzc2lvbi9jaGFubmVsXG4gKiBtYWNoaW5lcnkgbGl2ZXMgaW4gc25hcHJlcSdzIGBTbmFwUmVxV2ViU29ja2V0Q2xpZW50YDsgdGhpcyB0aGluIHN1YmNsYXNzIG9ubHlcbiAqIHByZS13aXJlcyB0aGUgdHdvIFZlbG9jaW91cy1zcGVjaWZpYyBkZWZhdWx0czogdGhlIGxvY2FsIGRldmVsb3BtZW50IHdlYnNvY2tldFxuICogVVJMIGFuZCBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgZGVzZXJpYWxpemF0aW9uIGluc2lkZSBgcmVzcG9uc2UuanNvbigpYC5cbiAqIEBhdWdtZW50cyBTbmFwUmVxV2ViU29ja2V0Q2xpZW50XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c1dlYnNvY2tldENsaWVudCBleHRlbmRzIFNuYXBSZXFXZWJTb2NrZXRDbGllbnQge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtQYXJ0aWFsPENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgU25hcFJlcVdlYlNvY2tldENsaWVudD5bMF0+fSBbYXJnc10gLSBPcHRpb25zIGZvcndhcmRlZCB0byBgU25hcFJlcVdlYlNvY2tldENsaWVudGAuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhcmdzID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5hcmdzLFxuICAgICAgdXJsOiBhcmdzLnVybCA/PyBERUZBVUxUX1VSTCxcbiAgICAgIGRlc2VyaWFsaXplOiBhcmdzLmRlc2VyaWFsaXplID8/IGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXG4gICAgfSlcbiAgICB0aGlzLnJlY29ubmVjdEdlbmVyYXRpb24gPSAwXG4gICAgLyoqIEB0eXBlIHtTZXQ8UHJvbWlzZTx2b2lkPj59ICovXG4gICAgdGhpcy5ydW5uaW5nUmVjb25uZWN0VGFza3MgPSBuZXcgU2V0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBJZ25vcmVzIGFuIG9ubGluZSByZXN1bHQgcmVzb2x2ZWQgYWZ0ZXIgcmVjb25uZWN0IHRlYXJkb3duIGJlZ2FuLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoaXMgY2xpZW50IGdlbmVyYXRpb24gaXMgb25saW5lLlxuICAgKi9cbiAgYXN5bmMgX2lzT25saW5lKCkge1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLnJlY29ubmVjdEdlbmVyYXRpb25cbiAgICBjb25zdCBpc09ubGluZSA9IGF3YWl0IHN1cGVyLl9pc09ubGluZSgpXG5cbiAgICByZXR1cm4gZ2VuZXJhdGlvbiA9PT0gdGhpcy5yZWNvbm5lY3RHZW5lcmF0aW9uICYmIGlzT25saW5lXG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGF1dG9tYXRpYyByZWNvbm5lY3Qgd29yayBzbyB0ZWFyZG93biBjYW4gZHJhaW4gc3RhbGUgYXR0ZW1wdHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHRoZSByZWNvbm5lY3QgYXR0ZW1wdCBzZXR0bGVzLlxuICAgKi9cbiAgYXN5bmMgX2F0dGVtcHRSZWNvbm5lY3QoKSB7XG4gICAgY29uc3QgcmVjb25uZWN0VGFzayA9IHN1cGVyLl9hdHRlbXB0UmVjb25uZWN0KClcblxuICAgIHRoaXMucnVubmluZ1JlY29ubmVjdFRhc2tzLmFkZChyZWNvbm5lY3RUYXNrKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlY29ubmVjdFRhc2tcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5ydW5uaW5nUmVjb25uZWN0VGFza3MuZGVsZXRlKHJlY29ubmVjdFRhc2spXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHJlY29ubmVjdCwgZHJhaW5zIHdvcmsgdGhhdCBhbHJlYWR5IHBhc3NlZCBTbmFwUmVxJ3MgcmVjb25uZWN0IGd1YXJkLFxuICAgKiBhbmQgY2xlYXJzIHN0YXRlIGNoYW5nZWQgYnkgYSBzdGFsZSBhdHRlbXB0IHdoaWxlIGl0IHNldHRsZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIG9uY2Ugbm8gcmVjb25uZWN0IGNhbiByZXN1cnJlY3QgYSBzb2NrZXQuXG4gICAqL1xuICBhc3luYyBkaXNjb25uZWN0QW5kU3RvcFJlY29ubmVjdCgpIHtcbiAgICB0aGlzLnJlY29ubmVjdEdlbmVyYXRpb24gKz0gMVxuICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RBbmRTdG9wUmVjb25uZWN0KClcblxuICAgIGlmICh0aGlzLnJ1bm5pbmdSZWNvbm5lY3RUYXNrcy5zaXplID09PSAwKSByZXR1cm5cblxuICAgIHdoaWxlICh0aGlzLnJ1bm5pbmdSZWNvbm5lY3RUYXNrcy5zaXplID4gMCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5ydW5uaW5nUmVjb25uZWN0VGFza3MpXG4gICAgfVxuXG4gICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdEFuZFN0b3BSZWNvbm5lY3QoKVxuICB9XG59XG4iXX0=
|
|
@@ -4,19 +4,21 @@
|
|
|
4
4
|
* class is the single discoverable home for switching into a tenant's context, reading the
|
|
5
5
|
* current one, iterating every tenant of a database identifier, and dropping a tenant's
|
|
6
6
|
* database. Switching delegates to {@link Current} (which owns the async-context tenant
|
|
7
|
-
* state) and additionally runs the callback inside `ensureConnections`,
|
|
7
|
+
* state) and additionally runs the callback inside `ensureConnections`, initializing registered
|
|
8
|
+
* tenant-switched models whose tables exist before the callback runs. Entering a tenant therefore
|
|
8
9
|
* makes its database immediately queryable — the apartment-style "switch" semantics — without
|
|
9
|
-
* the caller establishing connections itself; iteration and drop drive the
|
|
10
|
-
* database provider hooks.
|
|
10
|
+
* the caller establishing connections or model metadata itself; iteration and drop drive the
|
|
11
|
+
* app's tenant database provider hooks.
|
|
11
12
|
*/
|
|
12
13
|
export default class Tenant {
|
|
13
14
|
/**
|
|
14
15
|
* Runs `callback` with `tenant` as the current tenant, restoring the previous tenant after.
|
|
15
16
|
* The callback runs inside `ensureConnections`, so every database identifier the tenant
|
|
16
17
|
* activates (the global database plus the tenant's database) has a checked-out connection
|
|
17
|
-
* available for the callback's duration
|
|
18
|
-
* the
|
|
19
|
-
*
|
|
18
|
+
* available for the callback's duration. Registered tenant-switched models whose tables exist
|
|
19
|
+
* are initialized before the callback runs, so switching into a tenant makes it queryable
|
|
20
|
+
* without the caller wiring up connections or model metadata. Already-checked-out connections
|
|
21
|
+
* and in-progress model initialization promises are reused. The callback receives the active
|
|
20
22
|
* connections keyed by identifier, the same as `ensureConnections`.
|
|
21
23
|
* @template T
|
|
22
24
|
* @param {object} tenant Descriptor understood by the app's tenantDatabaseResolver.
|
|
@@ -24,6 +26,14 @@ export default class Tenant {
|
|
|
24
26
|
* @returns {Promise<T>} - Callback result from within the tenant context.
|
|
25
27
|
*/
|
|
26
28
|
static with<T>(tenant: object, callback: (connections: Record<string, import("../database/drivers/base.js").default>) => Promise<T>): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* Initializes registered tenant-switched models whose tables exist in the
|
|
31
|
+
* current tenant before runtime callbacks can build synchronous query scopes.
|
|
32
|
+
* Models for absent optional tables remain deferred until they are used.
|
|
33
|
+
* @param {import("../configuration.js").default} configuration - Current configuration.
|
|
34
|
+
* @returns {Promise<void>} - Resolves when available tenant models are initialized.
|
|
35
|
+
*/
|
|
36
|
+
static _ensureCurrentTenantModelsInitialized(configuration: import("../configuration.js").default): Promise<void>;
|
|
27
37
|
/**
|
|
28
38
|
* The current tenant descriptor, or undefined when running outside any tenant context.
|
|
29
39
|
* @returns {Record<string, unknown> | undefined} - Current async-context tenant descriptor, if any.
|
|
@@ -32,9 +42,10 @@ export default class Tenant {
|
|
|
32
42
|
/**
|
|
33
43
|
* Lists the tenants for a database identifier through the provider and runs `callback`
|
|
34
44
|
* within each tenant's context, optionally filtered and several at a time. Like
|
|
35
|
-
* {@link Tenant.with}, the callback runs inside `ensureConnections`
|
|
36
|
-
*
|
|
37
|
-
*
|
|
45
|
+
* {@link Tenant.with}, the callback runs inside `ensureConnections` after available
|
|
46
|
+
* tenant-switched models are initialized, so each tenant's database is queryable without the
|
|
47
|
+
* caller wiring up connections or model metadata. Returns how many tenants the callback ran
|
|
48
|
+
* for (after filtering).
|
|
38
49
|
* @param {{identifier: string, callback: function({databaseConfiguration: import("../configuration-types.js").DatabaseConfigurationType, tenant: ?}) : Promise<void>, parallel?: number, filter?: (tenant: ?) => boolean, configuration?: import("../configuration.js").default}} args - Tenant database identifier, per-tenant operation, filtering, and concurrency settings.
|
|
39
50
|
* @returns {Promise<number>} - Number of processed tenants.
|
|
40
51
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../../src/tenants/tenant.js"],"names":[],"mappings":"AAOA
|
|
1
|
+
{"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../../src/tenants/tenant.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;GAWG;AACH;IACE;;;;;;;;;;;;;OAaG;IACH,YALa,CAAC,UACH,MAAM,YACN,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GACxF,OAAO,CAAC,CAAC,CAAC,CAUtB;IAED;;;;;;OAMG;IACH,4DAHW,OAAO,qBAAqB,EAAE,OAAO,GACnC,OAAO,CAAC,IAAI,CAAC,CAuBzB;IAED;;;OAGG;IACH,kBAFa,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAI/C;IAED;;;;;;;;;OASG;IACH,uEAHW;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,CAAS,IAAiG,EAAjG;YAAC,qBAAqB,EAAE,OAAO,2BAA2B,EAAE,yBAAyB,CAAC;YAAC,MAAM,EAAE,OAAC,CAAA;SAAC,KAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAC,KAAK,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;KAAC,GACpQ,OAAO,CAAC,MAAM,CAAC,CAyB3B;IAED;;;;;;;;;;;OAWG;IACH,gCAHW,OAAO,wBAAwB,EAAE,sBAAsB,GACrD,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAAC,CAI7C;IAED;;;;OAIG;IACH,mDAHW;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;KAAC,GACzF,OAAO,CAAC,IAAI,CAAC,CAwBzB;CACF"}
|
|
@@ -9,19 +9,21 @@ import TenantIterator from "./tenant-iterator.js";
|
|
|
9
9
|
* class is the single discoverable home for switching into a tenant's context, reading the
|
|
10
10
|
* current one, iterating every tenant of a database identifier, and dropping a tenant's
|
|
11
11
|
* database. Switching delegates to {@link Current} (which owns the async-context tenant
|
|
12
|
-
* state) and additionally runs the callback inside `ensureConnections`,
|
|
12
|
+
* state) and additionally runs the callback inside `ensureConnections`, initializing registered
|
|
13
|
+
* tenant-switched models whose tables exist before the callback runs. Entering a tenant therefore
|
|
13
14
|
* makes its database immediately queryable — the apartment-style "switch" semantics — without
|
|
14
|
-
* the caller establishing connections itself; iteration and drop drive the
|
|
15
|
-
* database provider hooks.
|
|
15
|
+
* the caller establishing connections or model metadata itself; iteration and drop drive the
|
|
16
|
+
* app's tenant database provider hooks.
|
|
16
17
|
*/
|
|
17
18
|
export default class Tenant {
|
|
18
19
|
/**
|
|
19
20
|
* Runs `callback` with `tenant` as the current tenant, restoring the previous tenant after.
|
|
20
21
|
* The callback runs inside `ensureConnections`, so every database identifier the tenant
|
|
21
22
|
* activates (the global database plus the tenant's database) has a checked-out connection
|
|
22
|
-
* available for the callback's duration
|
|
23
|
-
* the
|
|
24
|
-
*
|
|
23
|
+
* available for the callback's duration. Registered tenant-switched models whose tables exist
|
|
24
|
+
* are initialized before the callback runs, so switching into a tenant makes it queryable
|
|
25
|
+
* without the caller wiring up connections or model metadata. Already-checked-out connections
|
|
26
|
+
* and in-progress model initialization promises are reused. The callback receives the active
|
|
25
27
|
* connections keyed by identifier, the same as `ensureConnections`.
|
|
26
28
|
* @template T
|
|
27
29
|
* @param {object} tenant Descriptor understood by the app's tenantDatabaseResolver.
|
|
@@ -30,7 +32,36 @@ export default class Tenant {
|
|
|
30
32
|
*/
|
|
31
33
|
static async with(tenant, callback) {
|
|
32
34
|
const configuration = Current.configuration();
|
|
33
|
-
return await Current.withTenant(tenant, async () => await configuration.ensureConnections(
|
|
35
|
+
return await Current.withTenant(tenant, async () => await configuration.ensureConnections(async (connections) => {
|
|
36
|
+
await this._ensureCurrentTenantModelsInitialized(configuration);
|
|
37
|
+
return await callback(connections);
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Initializes registered tenant-switched models whose tables exist in the
|
|
42
|
+
* current tenant before runtime callbacks can build synchronous query scopes.
|
|
43
|
+
* Models for absent optional tables remain deferred until they are used.
|
|
44
|
+
* @param {import("../configuration.js").default} configuration - Current configuration.
|
|
45
|
+
* @returns {Promise<void>} - Resolves when available tenant models are initialized.
|
|
46
|
+
*/
|
|
47
|
+
static async _ensureCurrentTenantModelsInitialized(configuration) {
|
|
48
|
+
for (const modelClass of Object.values(configuration.getModelClasses())) {
|
|
49
|
+
if (modelClass.isInitialized() || !modelClass.hasTenantDatabaseIdentifierResolver())
|
|
50
|
+
continue;
|
|
51
|
+
const databaseIdentifier = modelClass.getTenantDatabaseIdentifier();
|
|
52
|
+
if (!databaseIdentifier || !configuration.isDatabaseIdentifierActive(databaseIdentifier))
|
|
53
|
+
continue;
|
|
54
|
+
const connection = modelClass.connection();
|
|
55
|
+
const table = await connection.getTableByName(modelClass.tableName(), { throwError: false });
|
|
56
|
+
if (!table)
|
|
57
|
+
continue;
|
|
58
|
+
if (Object.keys(modelClass.getTranslationsMap()).length > 0) {
|
|
59
|
+
const translationsTable = await connection.getTableByName(modelClass.getTranslationsTableName(), { throwError: false });
|
|
60
|
+
if (!translationsTable)
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
await modelClass.ensureInitialized({ configuration });
|
|
64
|
+
}
|
|
34
65
|
}
|
|
35
66
|
/**
|
|
36
67
|
* The current tenant descriptor, or undefined when running outside any tenant context.
|
|
@@ -42,9 +73,10 @@ export default class Tenant {
|
|
|
42
73
|
/**
|
|
43
74
|
* Lists the tenants for a database identifier through the provider and runs `callback`
|
|
44
75
|
* within each tenant's context, optionally filtered and several at a time. Like
|
|
45
|
-
* {@link Tenant.with}, the callback runs inside `ensureConnections`
|
|
46
|
-
*
|
|
47
|
-
*
|
|
76
|
+
* {@link Tenant.with}, the callback runs inside `ensureConnections` after available
|
|
77
|
+
* tenant-switched models are initialized, so each tenant's database is queryable without the
|
|
78
|
+
* caller wiring up connections or model metadata. Returns how many tenants the callback ran
|
|
79
|
+
* for (after filtering).
|
|
48
80
|
* @param {{identifier: string, callback: function({databaseConfiguration: import("../configuration-types.js").DatabaseConfigurationType, tenant: ?}) : Promise<void>, parallel?: number, filter?: (tenant: ?) => boolean, configuration?: import("../configuration.js").default}} args - Tenant database identifier, per-tenant operation, filtering, and concurrency settings.
|
|
49
81
|
* @returns {Promise<number>} - Number of processed tenants.
|
|
50
82
|
*/
|
|
@@ -63,7 +95,10 @@ export default class Tenant {
|
|
|
63
95
|
// their callbacks, such as create, before the tenant database exists) while runtime
|
|
64
96
|
// iteration here gets the tenant's connections established the same way Tenant.with does.
|
|
65
97
|
return await iterator.run(tenants, async (callbackArgs) => {
|
|
66
|
-
await configuration.ensureConnections({ name: `Tenant.each: ${identifier}` }, async () =>
|
|
98
|
+
await configuration.ensureConnections({ name: `Tenant.each: ${identifier}` }, async () => {
|
|
99
|
+
await this._ensureCurrentTenantModelsInitialized(configuration);
|
|
100
|
+
await callback(callbackArgs);
|
|
101
|
+
});
|
|
67
102
|
});
|
|
68
103
|
}
|
|
69
104
|
/**
|
|
@@ -108,4 +143,4 @@ export default class Tenant {
|
|
|
108
143
|
});
|
|
109
144
|
}
|
|
110
145
|
}
|
|
111
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbmFudHMvdGVuYW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFDNUUsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUNyRCxPQUFPLGNBQWMsTUFBTSxzQkFBc0IsQ0FBQTtBQUVqRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxNQUFNO0lBQ3pCOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRO1FBQ2hDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUU3QyxPQUFPLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0lBQ3RHLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsT0FBTztRQUNaLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFDO1FBQ3JHLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNwRSxNQUFNLGFBQWEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLElBQUksRUFBRSxnQkFBZ0IsVUFBVSxFQUFFLEVBQUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMzRyxPQUFPLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO1FBQ2hFLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxVQUFVLHdDQUF3QyxDQUFDLENBQUE7UUFDckcsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFBO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUV6Riw0RUFBNEU7UUFDNUUsdUZBQXVGO1FBQ3ZGLG9GQUFvRjtRQUNwRiwwRkFBMEY7UUFDMUYsT0FBTyxNQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFBRTtZQUN4RCxNQUFNLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLElBQUksRUFBRSxnQkFBZ0IsVUFBVSxFQUFFLEVBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7UUFDdkgsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPO1FBQ2xDLE9BQU8sTUFBTSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ2xELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUM7UUFDN0UsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3BFLE1BQU0sWUFBWSxHQUFHLE9BQU8sUUFBUSxDQUFDLFlBQVksS0FBSyxVQUFVO1lBQzlELENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDdEMsQ0FBQyxDQUFDLGtCQUFrQixDQUFBO1FBRXRCLE1BQU0sYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkQscUZBQXFGO1lBQ3JGLHFGQUFxRjtZQUNyRix3RkFBd0Y7WUFDeEYsd0VBQXdFO1lBQ3hFLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsVUFBVSw0QkFBNEIsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDM0gsQ0FBQztZQUVELE1BQU0sWUFBWSxDQUFDO2dCQUNqQixhQUFhO2dCQUNiLHFCQUFxQixFQUFFLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQUM7Z0JBQzdFLFVBQVU7Z0JBQ1YsTUFBTTthQUNQLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDdXJyZW50IGZyb20gXCIuLi9jdXJyZW50LmpzXCJcbmltcG9ydCB7ZHJvcFRlbmFudERhdGFiYXNlfSBmcm9tIFwiLi9kZWZhdWx0LXRlbmFudC1kYXRhYmFzZS1wcm92aXNpb25pbmcuanNcIlxuaW1wb3J0IFRlbmFudEFnZ3JlZ2F0b3IgZnJvbSBcIi4vdGVuYW50LWFnZ3JlZ2F0b3IuanNcIlxuaW1wb3J0IFRlbmFudEl0ZXJhdG9yIGZyb20gXCIuL3RlbmFudC1pdGVyYXRvci5qc1wiXG5cbi8qKlxuICogQXBhcnRtZW50LXN0eWxlIHJ1bnRpbWUgZmHDp2FkZSBmb3IgbXVsdGktdGVuYW50IGFwcHMuIEEgXCJ0ZW5hbnRcIiBpcyB3aGF0ZXZlciBkZXNjcmlwdG9yXG4gKiBvYmplY3QgdGhlIGFwcCdzIGB0ZW5hbnREYXRhYmFzZVJlc29sdmVyYCB1bmRlcnN0YW5kcyAoYW4gYWNjb3VudCwgYSBwcm9qZWN0LCDigKYpOyB0aGlzXG4gKiBjbGFzcyBpcyB0aGUgc2luZ2xlIGRpc2NvdmVyYWJsZSBob21lIGZvciBzd2l0Y2hpbmcgaW50byBhIHRlbmFudCdzIGNvbnRleHQsIHJlYWRpbmcgdGhlXG4gKiBjdXJyZW50IG9uZSwgaXRlcmF0aW5nIGV2ZXJ5IHRlbmFudCBvZiBhIGRhdGFiYXNlIGlkZW50aWZpZXIsIGFuZCBkcm9wcGluZyBhIHRlbmFudCdzXG4gKiBkYXRhYmFzZS4gU3dpdGNoaW5nIGRlbGVnYXRlcyB0byB7QGxpbmsgQ3VycmVudH0gKHdoaWNoIG93bnMgdGhlIGFzeW5jLWNvbnRleHQgdGVuYW50XG4gKiBzdGF0ZSkgYW5kIGFkZGl0aW9uYWxseSBydW5zIHRoZSBjYWxsYmFjayBpbnNpZGUgYGVuc3VyZUNvbm5lY3Rpb25zYCwgc28gZW50ZXJpbmcgYSB0ZW5hbnRcbiAqIG1ha2VzIGl0cyBkYXRhYmFzZSBpbW1lZGlhdGVseSBxdWVyeWFibGUg4oCUIHRoZSBhcGFydG1lbnQtc3R5bGUgXCJzd2l0Y2hcIiBzZW1hbnRpY3Mg4oCUIHdpdGhvdXRcbiAqIHRoZSBjYWxsZXIgZXN0YWJsaXNoaW5nIGNvbm5lY3Rpb25zIGl0c2VsZjsgaXRlcmF0aW9uIGFuZCBkcm9wIGRyaXZlIHRoZSBhcHAncyB0ZW5hbnRcbiAqIGRhdGFiYXNlIHByb3ZpZGVyIGhvb2tzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZW5hbnQge1xuICAvKipcbiAgICogUnVucyBgY2FsbGJhY2tgIHdpdGggYHRlbmFudGAgYXMgdGhlIGN1cnJlbnQgdGVuYW50LCByZXN0b3JpbmcgdGhlIHByZXZpb3VzIHRlbmFudCBhZnRlci5cbiAgICogVGhlIGNhbGxiYWNrIHJ1bnMgaW5zaWRlIGBlbnN1cmVDb25uZWN0aW9uc2AsIHNvIGV2ZXJ5IGRhdGFiYXNlIGlkZW50aWZpZXIgdGhlIHRlbmFudFxuICAgKiBhY3RpdmF0ZXMgKHRoZSBnbG9iYWwgZGF0YWJhc2UgcGx1cyB0aGUgdGVuYW50J3MgZGF0YWJhc2UpIGhhcyBhIGNoZWNrZWQtb3V0IGNvbm5lY3Rpb25cbiAgICogYXZhaWxhYmxlIGZvciB0aGUgY2FsbGJhY2sncyBkdXJhdGlvbjogc3dpdGNoaW5nIGludG8gYSB0ZW5hbnQgbWFrZXMgaXQgcXVlcnlhYmxlIHdpdGhvdXRcbiAgICogdGhlIGNhbGxlciB3aXJpbmcgdXAgY29ubmVjdGlvbnMuIEFscmVhZHktY2hlY2tlZC1vdXQgY29ubmVjdGlvbnMgYXJlIHJldXNlZCwgc28gbmVzdGluZ1xuICAgKiBgVGVuYW50LndpdGhgIGNhbGxzIGRvZXMgbm90IG9wZW4gcmVkdW5kYW50IGNvbm5lY3Rpb25zLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIGFjdGl2ZVxuICAgKiBjb25uZWN0aW9ucyBrZXllZCBieSBpZGVudGlmaWVyLCB0aGUgc2FtZSBhcyBgZW5zdXJlQ29ubmVjdGlvbnNgLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge29iamVjdH0gdGVuYW50IERlc2NyaXB0b3IgdW5kZXJzdG9vZCBieSB0aGUgYXBwJ3MgdGVuYW50RGF0YWJhc2VSZXNvbHZlci5cbiAgICogQHBhcmFtIHsoY29ubmVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0PikgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPcGVyYXRpb24gdG8gcnVuIHdpdGggdGhlIHRlbmFudCdzIGFjdGl2ZSBjb25uZWN0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0IGZyb20gd2l0aGluIHRoZSB0ZW5hbnQgY29udGV4dC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyB3aXRoKHRlbmFudCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gQ3VycmVudC5jb25maWd1cmF0aW9uKClcblxuICAgIHJldHVybiBhd2FpdCBDdXJyZW50LndpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKGNhbGxiYWNrKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB0ZW5hbnQgZGVzY3JpcHRvciwgb3IgdW5kZWZpbmVkIHdoZW4gcnVubmluZyBvdXRzaWRlIGFueSB0ZW5hbnQgY29udGV4dC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkfSAtIEN1cnJlbnQgYXN5bmMtY29udGV4dCB0ZW5hbnQgZGVzY3JpcHRvciwgaWYgYW55LlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIEN1cnJlbnQudGVuYW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgdGVuYW50cyBmb3IgYSBkYXRhYmFzZSBpZGVudGlmaWVyIHRocm91Z2ggdGhlIHByb3ZpZGVyIGFuZCBydW5zIGBjYWxsYmFja2BcbiAgICogd2l0aGluIGVhY2ggdGVuYW50J3MgY29udGV4dCwgb3B0aW9uYWxseSBmaWx0ZXJlZCBhbmQgc2V2ZXJhbCBhdCBhIHRpbWUuIExpa2VcbiAgICoge0BsaW5rIFRlbmFudC53aXRofSwgdGhlIGNhbGxiYWNrIHJ1bnMgaW5zaWRlIGBlbnN1cmVDb25uZWN0aW9uc2Agc28gZWFjaCB0ZW5hbnQnc1xuICAgKiBkYXRhYmFzZSBpcyBxdWVyeWFibGUgd2l0aG91dCB0aGUgY2FsbGVyIHdpcmluZyB1cCBjb25uZWN0aW9ucy4gUmV0dXJucyBob3cgbWFueSB0ZW5hbnRzXG4gICAqIHRoZSBjYWxsYmFjayByYW4gZm9yIChhZnRlciBmaWx0ZXJpbmcpLlxuICAgKiBAcGFyYW0ge3tpZGVudGlmaWVyOiBzdHJpbmcsIGNhbGxiYWNrOiBmdW5jdGlvbih7ZGF0YWJhc2VDb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIHRlbmFudDogP30pIDogUHJvbWlzZTx2b2lkPiwgcGFyYWxsZWw/OiBudW1iZXIsIGZpbHRlcj86ICh0ZW5hbnQ6ID8pID0+IGJvb2xlYW4sIGNvbmZpZ3VyYXRpb24/OiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9fSBhcmdzIC0gVGVuYW50IGRhdGFiYXNlIGlkZW50aWZpZXIsIHBlci10ZW5hbnQgb3BlcmF0aW9uLCBmaWx0ZXJpbmcsIGFuZCBjb25jdXJyZW5jeSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gLSBOdW1iZXIgb2YgcHJvY2Vzc2VkIHRlbmFudHMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZWFjaCh7aWRlbnRpZmllciwgY2FsbGJhY2ssIHBhcmFsbGVsID0gMSwgZmlsdGVyLCBjb25maWd1cmF0aW9uID0gQ3VycmVudC5jb25maWd1cmF0aW9uKCl9KSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldFRlbmFudERhdGFiYXNlUHJvdmlkZXIoaWRlbnRpZmllcilcbiAgICBjb25zdCBsaXN0ZWRUZW5hbnRzID0gYXdhaXQgY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogYFRlbmFudC5lYWNoOiAke2lkZW50aWZpZXJ9YH0sIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCBwcm92aWRlci5saXN0VGVuYW50cyh7Y29uZmlndXJhdGlvbiwgaWRlbnRpZmllcn0pXG4gICAgfSlcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShsaXN0ZWRUZW5hbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5hbnQgZGF0YWJhc2UgcHJvdmlkZXIgZm9yICR7aWRlbnRpZmllcn0gbXVzdCByZXR1cm4gYW4gYXJyYXkgZnJvbSBsaXN0VGVuYW50c2ApXG4gICAgfVxuXG4gICAgY29uc3QgdGVuYW50cyA9IGZpbHRlciA/IGxpc3RlZFRlbmFudHMuZmlsdGVyKGZpbHRlcikgOiBsaXN0ZWRUZW5hbnRzXG4gICAgY29uc3QgaXRlcmF0b3IgPSBuZXcgVGVuYW50SXRlcmF0b3Ioe2NvbmZpZ3VyYXRpb24sIGlkZW50aWZpZXIsIHBhcmFsbGVsQ291bnQ6IHBhcmFsbGVsfSlcblxuICAgIC8vIFJ1biBlYWNoIHRlbmFudCdzIGNhbGxiYWNrIGluc2lkZSBlbnN1cmVDb25uZWN0aW9ucyBzbyB0aGUgaXRlcmF0b3Igc3RheXNcbiAgICAvLyBjb25uZWN0aW9uLWFnbm9zdGljICh0aGUgZGI6dGVuYW50czoqIENMSSBjb21tYW5kcyBzaGFyZSBUZW5hbnRJdGVyYXRvciBhbmQgbXVzdCBydW5cbiAgICAvLyB0aGVpciBjYWxsYmFja3MsIHN1Y2ggYXMgY3JlYXRlLCBiZWZvcmUgdGhlIHRlbmFudCBkYXRhYmFzZSBleGlzdHMpIHdoaWxlIHJ1bnRpbWVcbiAgICAvLyBpdGVyYXRpb24gaGVyZSBnZXRzIHRoZSB0ZW5hbnQncyBjb25uZWN0aW9ucyBlc3RhYmxpc2hlZCB0aGUgc2FtZSB3YXkgVGVuYW50LndpdGggZG9lcy5cbiAgICByZXR1cm4gYXdhaXQgaXRlcmF0b3IucnVuKHRlbmFudHMsIGFzeW5jIChjYWxsYmFja0FyZ3MpID0+IHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IGBUZW5hbnQuZWFjaDogJHtpZGVudGlmaWVyfWB9LCBhc3luYyAoKSA9PiBhd2FpdCBjYWxsYmFjayhjYWxsYmFja0FyZ3MpKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBvbmUgYWdncmVnYXRlIHF1ZXJ5IGFjcm9zcyBtYW55IHRlbmFudCBkYXRhYmFzZXMgYW5kIHJldHVybnMgdGhlIG1lcmdlZCByZXN1bHQuIFRoZVxuICAgKiB0ZW5hbnRzIG1heSBiZSBjby1sb2NhdGVkIG9uIHRoZSBkZWZhdWx0IHNlcnZlciBvciBzcHJlYWQgYWNyb3NzIG90aGVyIHNlcnZlcnMsIGFuZCBjYW4gYmVcbiAgICogY3JlYXRlZCBvciBkcm9wcGVkIGF0IHJ1bnRpbWU7IHRoZSBsaXZlIHRlbmFudCBsaXN0IGlzIHJlc29sdmVkIChmcm9tIGB0ZW5hbnRzYCBvciB0aGVcbiAgICogcHJvdmlkZXIncyBgbGlzdFRlbmFudHNgKSwgZ3JvdXBlZCBieSBzZXJ2ZXIsIGFnZ3JlZ2F0ZWQgd2l0aCBhIHNpbmdsZSBjcm9zcy1kYXRhYmFzZVxuICAgKiBgVU5JT04gQUxMYCB3aGVyZSB0aGUgZHJpdmVyIHN1cHBvcnRzIGl0IChNeVNRTC9NU1NRTCkgb3Igb25lIHF1ZXJ5IHBlciB0ZW5hbnQgb3RoZXJ3aXNlXG4gICAqIChQb3N0Z3JlU1FML1NRTGl0ZSksIGFuZCBtZXJnZWQgd2l0aCBlYWNoIGFnZ3JlZ2F0ZSdzIG93biBvcGVyYXRpb24uIFRoZSBjYWxsZXIgd3JpdGVzIG9ubHkgb25lXG4gICAqIHBlci10ZW5hbnQgc3VicXVlcnkgYW5kIGRlY2xhcmVzIHRoZSBrZXkgY29sdW1ucyBhbmQgYWdncmVnYXRlczsgc2VlXG4gICAqIHtAbGluayBpbXBvcnQoXCIuL3RlbmFudC1hZ2dyZWdhdG9yLmpzXCIpLlRlbmFudEFnZ3JlZ2F0ZU9wdGlvbnN9LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdGVuYW50LWFnZ3JlZ2F0b3IuanNcIikuVGVuYW50QWdncmVnYXRlT3B0aW9uc30gb3B0aW9ucyAtIEFnZ3JlZ2F0ZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCA/Pj4+fSAtIE9uZSBtZXJnZWQgcm93IHBlciBkaXN0aW5jdCBrZXktY29sdW1uIGNvbWJpbmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFnZ3JlZ2F0ZUFjcm9zcyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBUZW5hbnRBZ2dyZWdhdG9yKG9wdGlvbnMpLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgb25lIHRlbmFudCdzIGRhdGFiYXNlL3NjaGVtYSB0aHJvdWdoIHRoZSBwcm92aWRlcidzIGBkcm9wRGF0YWJhc2VgIGhvb2suXG4gICAqIEBwYXJhbSB7e2lkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiBvYmplY3QsIGNvbmZpZ3VyYXRpb24/OiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9fSBhcmdzIC0gVGVuYW50IGRlc2NyaXB0b3IgYW5kIGRhdGFiYXNlIGlkZW50aWZpZXIgdG8gZHJvcC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZHJvcCh7aWRlbnRpZmllciwgdGVuYW50LCBjb25maWd1cmF0aW9uID0gQ3VycmVudC5jb25maWd1cmF0aW9uKCl9KSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldFRlbmFudERhdGFiYXNlUHJvdmlkZXIoaWRlbnRpZmllcilcbiAgICBjb25zdCBkcm9wRGF0YWJhc2UgPSB0eXBlb2YgcHJvdmlkZXIuZHJvcERhdGFiYXNlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gcHJvdmlkZXIuZHJvcERhdGFiYXNlLmJpbmQocHJvdmlkZXIpXG4gICAgICA6IGRyb3BUZW5hbnREYXRhYmFzZVxuXG4gICAgYXdhaXQgY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gR3VhcmQgYWdhaW5zdCBhbiB1bnJlc29sdmVkIHRlbmFudC4gcmVzb2x2ZURhdGFiYXNlQ29uZmlndXJhdGlvbiBmYWxscyBiYWNrIHRvIHRoZVxuICAgICAgLy8gYmFzZSAodGVtcGxhdGUvZGVmYXVsdCkgdGVuYW50IGRhdGFiYXNlIHdoZW4gdGhlIHJlc29sdmVyIHJldHVybnMgbm90aGluZyBmb3IgdGhpc1xuICAgICAgLy8gZGVzY3JpcHRvciwgc28gd2l0aG91dCB0aGlzIGNoZWNrIGEgcHJvdmlkZXIgdGhhdCBkcm9wcyBieSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24ubmFtZVxuICAgICAgLy8gd291bGQgZHJvcCB0aGUgdGVtcGxhdGUgZGF0YWJhc2UgaW5zdGVhZCBvZiByZWplY3RpbmcgdGhlIGJhZCB0ZW5hbnQuXG4gICAgICBpZiAoIWNvbmZpZ3VyYXRpb24uaXNEYXRhYmFzZUlkZW50aWZpZXJBY3RpdmUoaWRlbnRpZmllcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5hbnQgZGF0YWJhc2UgaWRlbnRpZmllciAke2lkZW50aWZpZXJ9IGlzIGluYWN0aXZlIGZvciB0ZW5hbnQ6ICR7VGVuYW50SXRlcmF0b3IudGVuYW50TGFiZWwodGVuYW50KX1gKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBkcm9wRGF0YWJhc2Uoe1xuICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZURhdGFiYXNlQ29uZmlndXJhdGlvbihpZGVudGlmaWVyKSxcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgdGVuYW50XG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbmFudHMvdGVuYW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFDNUUsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUNyRCxPQUFPLGNBQWMsTUFBTSxzQkFBc0IsQ0FBQTtBQUVqRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sTUFBTTtJQUN6Qjs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVE7UUFDaEMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBRTdDLE9BQU8sTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sYUFBYSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRTtZQUM5RyxNQUFNLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUUvRCxPQUFPLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3BDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxhQUFhO1FBQzlELEtBQUssTUFBTSxVQUFVLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3hFLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxFQUFFO2dCQUFFLFNBQVE7WUFFN0Ys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SyxDQUFDLGVBQWUsQ0FBQyxPQUFPO1FBQ2xDLE9BQU8sTUFBTSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ2xELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUM7UUFDN0UsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3BFLE1BQU0sWUFBWSxHQUFHLE9BQU8sUUFBUSxDQUFDLFlBQVksS0FBSyxVQUFVO1lBQzlELENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDdEMsQ0FBQyxDQUFDLGtCQUFrQixDQUFBO1FBRXRCLE1BQU0sYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkQscUZBQXFGO1lBQ3JGLHFGQUFxRjtZQUNyRix3RkFBd0Y7WUFDeEYsd0VBQXdFO1lBQ3hFLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsVUFBVSw0QkFBNEIsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDM0gsQ0FBQztZQUVELE1BQU0sWUFBWSxDQUFDO2dCQUNqQixhQUFhO2dCQUNiLHFCQUFxQixFQUFFLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQUM7Z0JBQzdFLFVBQVU7Z0JBQ1YsTUFBTTthQUNQLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDdXJyZW50IGZyb20gXCIuLi9jdXJyZW50LmpzXCJcbmltcG9ydCB7ZHJvcFRlbmFudERhdGFiYXNlfSBmcm9tIFwiLi9kZWZhdWx0LXRlbmFudC1kYXRhYmFzZS1wcm92aXNpb25pbmcuanNcIlxuaW1wb3J0IFRlbmFudEFnZ3JlZ2F0b3IgZnJvbSBcIi4vdGVuYW50LWFnZ3JlZ2F0b3IuanNcIlxuaW1wb3J0IFRlbmFudEl0ZXJhdG9yIGZyb20gXCIuL3RlbmFudC1pdGVyYXRvci5qc1wiXG5cbi8qKlxuICogQXBhcnRtZW50LXN0eWxlIHJ1bnRpbWUgZmHDp2FkZSBmb3IgbXVsdGktdGVuYW50IGFwcHMuIEEgXCJ0ZW5hbnRcIiBpcyB3aGF0ZXZlciBkZXNjcmlwdG9yXG4gKiBvYmplY3QgdGhlIGFwcCdzIGB0ZW5hbnREYXRhYmFzZVJlc29sdmVyYCB1bmRlcnN0YW5kcyAoYW4gYWNjb3VudCwgYSBwcm9qZWN0LCDigKYpOyB0aGlzXG4gKiBjbGFzcyBpcyB0aGUgc2luZ2xlIGRpc2NvdmVyYWJsZSBob21lIGZvciBzd2l0Y2hpbmcgaW50byBhIHRlbmFudCdzIGNvbnRleHQsIHJlYWRpbmcgdGhlXG4gKiBjdXJyZW50IG9uZSwgaXRlcmF0aW5nIGV2ZXJ5IHRlbmFudCBvZiBhIGRhdGFiYXNlIGlkZW50aWZpZXIsIGFuZCBkcm9wcGluZyBhIHRlbmFudCdzXG4gKiBkYXRhYmFzZS4gU3dpdGNoaW5nIGRlbGVnYXRlcyB0byB7QGxpbmsgQ3VycmVudH0gKHdoaWNoIG93bnMgdGhlIGFzeW5jLWNvbnRleHQgdGVuYW50XG4gKiBzdGF0ZSkgYW5kIGFkZGl0aW9uYWxseSBydW5zIHRoZSBjYWxsYmFjayBpbnNpZGUgYGVuc3VyZUNvbm5lY3Rpb25zYCwgaW5pdGlhbGl6aW5nIHJlZ2lzdGVyZWRcbiAqIHRlbmFudC1zd2l0Y2hlZCBtb2RlbHMgd2hvc2UgdGFibGVzIGV4aXN0IGJlZm9yZSB0aGUgY2FsbGJhY2sgcnVucy4gRW50ZXJpbmcgYSB0ZW5hbnQgdGhlcmVmb3JlXG4gKiBtYWtlcyBpdHMgZGF0YWJhc2UgaW1tZWRpYXRlbHkgcXVlcnlhYmxlIOKAlCB0aGUgYXBhcnRtZW50LXN0eWxlIFwic3dpdGNoXCIgc2VtYW50aWNzIOKAlCB3aXRob3V0XG4gKiB0aGUgY2FsbGVyIGVzdGFibGlzaGluZyBjb25uZWN0aW9ucyBvciBtb2RlbCBtZXRhZGF0YSBpdHNlbGY7IGl0ZXJhdGlvbiBhbmQgZHJvcCBkcml2ZSB0aGVcbiAqIGFwcCdzIHRlbmFudCBkYXRhYmFzZSBwcm92aWRlciBob29rcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVuYW50IHtcbiAgLyoqXG4gICAqIFJ1bnMgYGNhbGxiYWNrYCB3aXRoIGB0ZW5hbnRgIGFzIHRoZSBjdXJyZW50IHRlbmFudCwgcmVzdG9yaW5nIHRoZSBwcmV2aW91cyB0ZW5hbnQgYWZ0ZXIuXG4gICAqIFRoZSBjYWxsYmFjayBydW5zIGluc2lkZSBgZW5zdXJlQ29ubmVjdGlvbnNgLCBzbyBldmVyeSBkYXRhYmFzZSBpZGVudGlmaWVyIHRoZSB0ZW5hbnRcbiAgICogYWN0aXZhdGVzICh0aGUgZ2xvYmFsIGRhdGFiYXNlIHBsdXMgdGhlIHRlbmFudCdzIGRhdGFiYXNlKSBoYXMgYSBjaGVja2VkLW91dCBjb25uZWN0aW9uXG4gICAqIGF2YWlsYWJsZSBmb3IgdGhlIGNhbGxiYWNrJ3MgZHVyYXRpb24uIFJlZ2lzdGVyZWQgdGVuYW50LXN3aXRjaGVkIG1vZGVscyB3aG9zZSB0YWJsZXMgZXhpc3RcbiAgICogYXJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgY2FsbGJhY2sgcnVucywgc28gc3dpdGNoaW5nIGludG8gYSB0ZW5hbnQgbWFrZXMgaXQgcXVlcnlhYmxlXG4gICAqIHdpdGhvdXQgdGhlIGNhbGxlciB3aXJpbmcgdXAgY29ubmVjdGlvbnMgb3IgbW9kZWwgbWV0YWRhdGEuIEFscmVhZHktY2hlY2tlZC1vdXQgY29ubmVjdGlvbnNcbiAgICogYW5kIGluLXByb2dyZXNzIG1vZGVsIGluaXRpYWxpemF0aW9uIHByb21pc2VzIGFyZSByZXVzZWQuIFRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgYWN0aXZlXG4gICAqIGNvbm5lY3Rpb25zIGtleWVkIGJ5IGlkZW50aWZpZXIsIHRoZSBzYW1lIGFzIGBlbnN1cmVDb25uZWN0aW9uc2AuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB0ZW5hbnQgRGVzY3JpcHRvciB1bmRlcnN0b29kIGJ5IHRoZSBhcHAncyB0ZW5hbnREYXRhYmFzZVJlc29sdmVyLlxuICAgKiBAcGFyYW0geyhjb25uZWN0aW9uczogUmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+KSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIE9wZXJhdGlvbiB0byBydW4gd2l0aCB0aGUgdGVuYW50J3MgYWN0aXZlIGNvbm5lY3Rpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQgZnJvbSB3aXRoaW4gdGhlIHRlbmFudCBjb250ZXh0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHdpdGgodGVuYW50LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBDdXJyZW50LmNvbmZpZ3VyYXRpb24oKVxuXG4gICAgcmV0dXJuIGF3YWl0IEN1cnJlbnQud2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IGF3YWl0IGNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoYXN5bmMgKGNvbm5lY3Rpb25zKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLl9lbnN1cmVDdXJyZW50VGVuYW50TW9kZWxzSW5pdGlhbGl6ZWQoY29uZmlndXJhdGlvbilcblxuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGNvbm5lY3Rpb25zKVxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHJlZ2lzdGVyZWQgdGVuYW50LXN3aXRjaGVkIG1vZGVscyB3aG9zZSB0YWJsZXMgZXhpc3QgaW4gdGhlXG4gICAqIGN1cnJlbnQgdGVuYW50IGJlZm9yZSBydW50aW1lIGNhbGxiYWNrcyBjYW4gYnVpbGQgc3luY2hyb25vdXMgcXVlcnkgc2NvcGVzLlxuICAgKiBNb2RlbHMgZm9yIGFic2VudCBvcHRpb25hbCB0YWJsZXMgcmVtYWluIGRlZmVycmVkIHVudGlsIHRoZXkgYXJlIHVzZWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGF2YWlsYWJsZSB0ZW5hbnQgbW9kZWxzIGFyZSBpbml0aWFsaXplZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBfZW5zdXJlQ3VycmVudFRlbmFudE1vZGVsc0luaXRpYWxpemVkKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpKSkge1xuICAgICAgaWYgKG1vZGVsQ2xhc3MuaXNJbml0aWFsaXplZCgpIHx8ICFtb2RlbENsYXNzLmhhc1RlbmFudERhdGFiYXNlSWRlbnRpZmllclJlc29sdmVyKCkpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGRhdGFiYXNlSWRlbnRpZmllciA9IG1vZGVsQ2xhc3MuZ2V0VGVuYW50RGF0YWJhc2VJZGVudGlmaWVyKClcblxuICAgICAgaWYgKCFkYXRhYmFzZUlkZW50aWZpZXIgfHwgIWNvbmZpZ3VyYXRpb24uaXNEYXRhYmFzZUlkZW50aWZpZXJBY3RpdmUoZGF0YWJhc2VJZGVudGlmaWVyKSkgY29udGludWVcblxuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IG1vZGVsQ2xhc3MuY29ubmVjdGlvbigpXG4gICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0VGFibGVCeU5hbWUobW9kZWxDbGFzcy50YWJsZU5hbWUoKSwge3Rocm93RXJyb3I6IGZhbHNlfSlcblxuICAgICAgaWYgKCF0YWJsZSkgY29udGludWVcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKG1vZGVsQ2xhc3MuZ2V0VHJhbnNsYXRpb25zTWFwKCkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zVGFibGUgPSBhd2FpdCBjb25uZWN0aW9uLmdldFRhYmxlQnlOYW1lKG1vZGVsQ2xhc3MuZ2V0VHJhbnNsYXRpb25zVGFibGVOYW1lKCksIHt0aHJvd0Vycm9yOiBmYWxzZX0pXG5cbiAgICAgICAgaWYgKCF0cmFuc2xhdGlvbnNUYWJsZSkgY29udGludWVcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbW9kZWxDbGFzcy5lbnN1cmVJbml0aWFsaXplZCh7Y29uZmlndXJhdGlvbn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHRlbmFudCBkZXNjcmlwdG9yLCBvciB1bmRlZmluZWQgd2hlbiBydW5uaW5nIG91dHNpZGUgYW55IHRlbmFudCBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWR9IC0gQ3VycmVudCBhc3luYy1jb250ZXh0IHRlbmFudCBkZXNjcmlwdG9yLCBpZiBhbnkuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpIHtcbiAgICByZXR1cm4gQ3VycmVudC50ZW5hbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSB0ZW5hbnRzIGZvciBhIGRhdGFiYXNlIGlkZW50aWZpZXIgdGhyb3VnaCB0aGUgcHJvdmlkZXIgYW5kIHJ1bnMgYGNhbGxiYWNrYFxuICAgKiB3aXRoaW4gZWFjaCB0ZW5hbnQncyBjb250ZXh0LCBvcHRpb25hbGx5IGZpbHRlcmVkIGFuZCBzZXZlcmFsIGF0IGEgdGltZS4gTGlrZVxuICAgKiB7QGxpbmsgVGVuYW50LndpdGh9LCB0aGUgY2FsbGJhY2sgcnVucyBpbnNpZGUgYGVuc3VyZUNvbm5lY3Rpb25zYCBhZnRlciBhdmFpbGFibGVcbiAgICogdGVuYW50LXN3aXRjaGVkIG1vZGVscyBhcmUgaW5pdGlhbGl6ZWQsIHNvIGVhY2ggdGVuYW50J3MgZGF0YWJhc2UgaXMgcXVlcnlhYmxlIHdpdGhvdXQgdGhlXG4gICAqIGNhbGxlciB3aXJpbmcgdXAgY29ubmVjdGlvbnMgb3IgbW9kZWwgbWV0YWRhdGEuIFJldHVybnMgaG93IG1hbnkgdGVuYW50cyB0aGUgY2FsbGJhY2sgcmFuXG4gICAqIGZvciAoYWZ0ZXIgZmlsdGVyaW5nKS5cbiAgICogQHBhcmFtIHt7aWRlbnRpZmllcjogc3RyaW5nLCBjYWxsYmFjazogZnVuY3Rpb24oe2RhdGFiYXNlQ29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCB0ZW5hbnQ6ID99KSA6IFByb21pc2U8dm9pZD4sIHBhcmFsbGVsPzogbnVtYmVyLCBmaWx0ZXI/OiAodGVuYW50OiA/KSA9PiBib29sZWFuLCBjb25maWd1cmF0aW9uPzogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fX0gYXJncyAtIFRlbmFudCBkYXRhYmFzZSBpZGVudGlmaWVyLCBwZXItdGVuYW50IG9wZXJhdGlvbiwgZmlsdGVyaW5nLCBhbmQgY29uY3VycmVuY3kgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gTnVtYmVyIG9mIHByb2Nlc3NlZCB0ZW5hbnRzLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVhY2goe2lkZW50aWZpZXIsIGNhbGxiYWNrLCBwYXJhbGxlbCA9IDEsIGZpbHRlciwgY29uZmlndXJhdGlvbiA9IEN1cnJlbnQuY29uZmlndXJhdGlvbigpfSkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXRUZW5hbnREYXRhYmFzZVByb3ZpZGVyKGlkZW50aWZpZXIpXG4gICAgY29uc3QgbGlzdGVkVGVuYW50cyA9IGF3YWl0IGNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IGBUZW5hbnQuZWFjaDogJHtpZGVudGlmaWVyfWB9LCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvdmlkZXIubGlzdFRlbmFudHMoe2NvbmZpZ3VyYXRpb24sIGlkZW50aWZpZXJ9KVxuICAgIH0pXG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdGVkVGVuYW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuYW50IGRhdGFiYXNlIHByb3ZpZGVyIGZvciAke2lkZW50aWZpZXJ9IG11c3QgcmV0dXJuIGFuIGFycmF5IGZyb20gbGlzdFRlbmFudHNgKVxuICAgIH1cblxuICAgIGNvbnN0IHRlbmFudHMgPSBmaWx0ZXIgPyBsaXN0ZWRUZW5hbnRzLmZpbHRlcihmaWx0ZXIpIDogbGlzdGVkVGVuYW50c1xuICAgIGNvbnN0IGl0ZXJhdG9yID0gbmV3IFRlbmFudEl0ZXJhdG9yKHtjb25maWd1cmF0aW9uLCBpZGVudGlmaWVyLCBwYXJhbGxlbENvdW50OiBwYXJhbGxlbH0pXG5cbiAgICAvLyBSdW4gZWFjaCB0ZW5hbnQncyBjYWxsYmFjayBpbnNpZGUgZW5zdXJlQ29ubmVjdGlvbnMgc28gdGhlIGl0ZXJhdG9yIHN0YXlzXG4gICAgLy8gY29ubmVjdGlvbi1hZ25vc3RpYyAodGhlIGRiOnRlbmFudHM6KiBDTEkgY29tbWFuZHMgc2hhcmUgVGVuYW50SXRlcmF0b3IgYW5kIG11c3QgcnVuXG4gICAgLy8gdGhlaXIgY2FsbGJhY2tzLCBzdWNoIGFzIGNyZWF0ZSwgYmVmb3JlIHRoZSB0ZW5hbnQgZGF0YWJhc2UgZXhpc3RzKSB3aGlsZSBydW50aW1lXG4gICAgLy8gaXRlcmF0aW9uIGhlcmUgZ2V0cyB0aGUgdGVuYW50J3MgY29ubmVjdGlvbnMgZXN0YWJsaXNoZWQgdGhlIHNhbWUgd2F5IFRlbmFudC53aXRoIGRvZXMuXG4gICAgcmV0dXJuIGF3YWl0IGl0ZXJhdG9yLnJ1bih0ZW5hbnRzLCBhc3luYyAoY2FsbGJhY2tBcmdzKSA9PiB7XG4gICAgICBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgVGVuYW50LmVhY2g6ICR7aWRlbnRpZmllcn1gfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9lbnN1cmVDdXJyZW50VGVuYW50TW9kZWxzSW5pdGlhbGl6ZWQoY29uZmlndXJhdGlvbilcbiAgICAgICAgYXdhaXQgY2FsbGJhY2soY2FsbGJhY2tBcmdzKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb25lIGFnZ3JlZ2F0ZSBxdWVyeSBhY3Jvc3MgbWFueSB0ZW5hbnQgZGF0YWJhc2VzIGFuZCByZXR1cm5zIHRoZSBtZXJnZWQgcmVzdWx0LiBUaGVcbiAgICogdGVuYW50cyBtYXkgYmUgY28tbG9jYXRlZCBvbiB0aGUgZGVmYXVsdCBzZXJ2ZXIgb3Igc3ByZWFkIGFjcm9zcyBvdGhlciBzZXJ2ZXJzLCBhbmQgY2FuIGJlXG4gICAqIGNyZWF0ZWQgb3IgZHJvcHBlZCBhdCBydW50aW1lOyB0aGUgbGl2ZSB0ZW5hbnQgbGlzdCBpcyByZXNvbHZlZCAoZnJvbSBgdGVuYW50c2Agb3IgdGhlXG4gICAqIHByb3ZpZGVyJ3MgYGxpc3RUZW5hbnRzYCksIGdyb3VwZWQgYnkgc2VydmVyLCBhZ2dyZWdhdGVkIHdpdGggYSBzaW5nbGUgY3Jvc3MtZGF0YWJhc2VcbiAgICogYFVOSU9OIEFMTGAgd2hlcmUgdGhlIGRyaXZlciBzdXBwb3J0cyBpdCAoTXlTUUwvTVNTUUwpIG9yIG9uZSBxdWVyeSBwZXIgdGVuYW50IG90aGVyd2lzZVxuICAgKiAoUG9zdGdyZVNRTC9TUUxpdGUpLCBhbmQgbWVyZ2VkIHdpdGggZWFjaCBhZ2dyZWdhdGUncyBvd24gb3BlcmF0aW9uLiBUaGUgY2FsbGVyIHdyaXRlcyBvbmx5IG9uZVxuICAgKiBwZXItdGVuYW50IHN1YnF1ZXJ5IGFuZCBkZWNsYXJlcyB0aGUga2V5IGNvbHVtbnMgYW5kIGFnZ3JlZ2F0ZXM7IHNlZVxuICAgKiB7QGxpbmsgaW1wb3J0KFwiLi90ZW5hbnQtYWdncmVnYXRvci5qc1wiKS5UZW5hbnRBZ2dyZWdhdGVPcHRpb25zfS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3RlbmFudC1hZ2dyZWdhdG9yLmpzXCIpLlRlbmFudEFnZ3JlZ2F0ZU9wdGlvbnN9IG9wdGlvbnMgLSBBZ2dyZWdhdGUgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgPz4+Pn0gLSBPbmUgbWVyZ2VkIHJvdyBwZXIgZGlzdGluY3Qga2V5LWNvbHVtbiBjb21iaW5hdGlvbi5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBhZ2dyZWdhdGVBY3Jvc3Mob3B0aW9ucykge1xuICAgIHJldHVybiBhd2FpdCBuZXcgVGVuYW50QWdncmVnYXRvcihvcHRpb25zKS5ydW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIG9uZSB0ZW5hbnQncyBkYXRhYmFzZS9zY2hlbWEgdGhyb3VnaCB0aGUgcHJvdmlkZXIncyBgZHJvcERhdGFiYXNlYCBob29rLlxuICAgKiBAcGFyYW0ge3tpZGVudGlmaWVyOiBzdHJpbmcsIHRlbmFudDogb2JqZWN0LCBjb25maWd1cmF0aW9uPzogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fX0gYXJncyAtIFRlbmFudCBkZXNjcmlwdG9yIGFuZCBkYXRhYmFzZSBpZGVudGlmaWVyIHRvIGRyb3AuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRyb3Aoe2lkZW50aWZpZXIsIHRlbmFudCwgY29uZmlndXJhdGlvbiA9IEN1cnJlbnQuY29uZmlndXJhdGlvbigpfSkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXRUZW5hbnREYXRhYmFzZVByb3ZpZGVyKGlkZW50aWZpZXIpXG4gICAgY29uc3QgZHJvcERhdGFiYXNlID0gdHlwZW9mIHByb3ZpZGVyLmRyb3BEYXRhYmFzZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHByb3ZpZGVyLmRyb3BEYXRhYmFzZS5iaW5kKHByb3ZpZGVyKVxuICAgICAgOiBkcm9wVGVuYW50RGF0YWJhc2VcblxuICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEd1YXJkIGFnYWluc3QgYW4gdW5yZXNvbHZlZCB0ZW5hbnQuIHJlc29sdmVEYXRhYmFzZUNvbmZpZ3VyYXRpb24gZmFsbHMgYmFjayB0byB0aGVcbiAgICAgIC8vIGJhc2UgKHRlbXBsYXRlL2RlZmF1bHQpIHRlbmFudCBkYXRhYmFzZSB3aGVuIHRoZSByZXNvbHZlciByZXR1cm5zIG5vdGhpbmcgZm9yIHRoaXNcbiAgICAgIC8vIGRlc2NyaXB0b3IsIHNvIHdpdGhvdXQgdGhpcyBjaGVjayBhIHByb3ZpZGVyIHRoYXQgZHJvcHMgYnkgZGF0YWJhc2VDb25maWd1cmF0aW9uLm5hbWVcbiAgICAgIC8vIHdvdWxkIGRyb3AgdGhlIHRlbXBsYXRlIGRhdGFiYXNlIGluc3RlYWQgb2YgcmVqZWN0aW5nIHRoZSBiYWQgdGVuYW50LlxuICAgICAgaWYgKCFjb25maWd1cmF0aW9uLmlzRGF0YWJhc2VJZGVudGlmaWVyQWN0aXZlKGlkZW50aWZpZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuYW50IGRhdGFiYXNlIGlkZW50aWZpZXIgJHtpZGVudGlmaWVyfSBpcyBpbmFjdGl2ZSBmb3IgdGVuYW50OiAke1RlbmFudEl0ZXJhdG9yLnRlbmFudExhYmVsKHRlbmFudCl9YClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZHJvcERhdGFiYXNlKHtcbiAgICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgICAgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLnJlc29sdmVEYXRhYmFzZUNvbmZpZ3VyYXRpb24oaWRlbnRpZmllciksXG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIHRlbmFudFxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG4iXX0=
|
|
@@ -187,8 +187,7 @@ export default class FactoryRegistry {
|
|
|
187
187
|
*/
|
|
188
188
|
_runList(strategy: "attributesFor" | "build" | "create", factoryName: string, count: number, args: Array<unknown>): Promise<Array<unknown>>;
|
|
189
189
|
/**
|
|
190
|
-
* Compiles and runs a factory invocation under a strategy
|
|
191
|
-
* evaluations for the mutation guard.
|
|
190
|
+
* Compiles and runs a factory invocation under a strategy.
|
|
192
191
|
* @param {object} args - Options.
|
|
193
192
|
* @param {string} args.factoryName - Factory name.
|
|
194
193
|
* @param {string[]} args.traits - Ordered traits.
|
|
@@ -196,12 +195,32 @@ export default class FactoryRegistry {
|
|
|
196
195
|
* @param {"attributesFor" | "build" | "create"} args.strategy - Strategy name.
|
|
197
196
|
* @returns {Promise<?>} - The strategy result.
|
|
198
197
|
*/
|
|
199
|
-
_runFactory(
|
|
198
|
+
_runFactory(args: {
|
|
200
199
|
factoryName: string;
|
|
201
200
|
traits: string[];
|
|
202
201
|
overrides: Record<string, unknown>;
|
|
203
202
|
strategy: "attributesFor" | "build" | "create";
|
|
204
203
|
}): Promise<unknown>;
|
|
204
|
+
/**
|
|
205
|
+
* Runs one event-tracked invocation, optionally reusing declaration planning.
|
|
206
|
+
* @param {object} args - Options.
|
|
207
|
+
* @param {string} args.factoryName - Factory name.
|
|
208
|
+
* @param {string[]} args.traits - Ordered traits.
|
|
209
|
+
* @param {Record<string, ?>} args.overrides - Overrides.
|
|
210
|
+
* @param {"attributesFor" | "build" | "create"} args.strategy - Strategy name.
|
|
211
|
+
* @param {import("./factory-runner.js").CompiledPlan} [args.planTemplate] - Reusable declaration plan.
|
|
212
|
+
* @returns {Promise<{result: ?, planTemplate: import("./factory-runner.js").CompiledPlan}>} - Result and declaration plan.
|
|
213
|
+
*/
|
|
214
|
+
_runFactoryInvocation({ factoryName, traits, overrides, strategy, planTemplate }: {
|
|
215
|
+
factoryName: string;
|
|
216
|
+
traits: string[];
|
|
217
|
+
overrides: Record<string, unknown>;
|
|
218
|
+
strategy: "attributesFor" | "build" | "create";
|
|
219
|
+
planTemplate?: import("./factory-runner.js").CompiledPlan | undefined;
|
|
220
|
+
}): Promise<{
|
|
221
|
+
result: unknown;
|
|
222
|
+
planTemplate: import("./factory-runner.js").CompiledPlan;
|
|
223
|
+
}>;
|
|
205
224
|
/**
|
|
206
225
|
* Registers an immutable factory definition and its aliases.
|
|
207
226
|
* @param {import("./factory-definition.js").default} definition - Compiled factory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory-registry.d.ts","sourceRoot":"","sources":["../../../../src/testing/factory/factory-registry.js"],"names":[],"mappings":"AAuCA;;;;GAIG;AACH;IAGI,8FAA8F;IAC9F,YADW,GAAG,CAAC,MAAM,EAAE,OAAO,yBAAyB,EAAE,OAAO,CAAC,CACtC;IAE3B,oFAAoF;IACpF,eADW,GAAG,CAAC,MAAM,EAAE,OAAO,uBAAuB,EAAE,OAAO,CAAC,CACjC;IAE9B,2FAA2F;IAC3F,YADW,GAAG,CAAC,MAAM,EAAE,OAAO,eAAe,EAAE,OAAO,CAAC,CAC5B;IAE3B,oGAAoG;IACpG,mBADW,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,eAAe,EAAE,OAAO,CAAC,CAAC,CAClC;IAElC,+FAA+F;IAC/F,qBADW,OAAO,mBAAmB,EAAE,WAAW,EAAE,CACvB;IAE7B,oEAAoE;IACpE,oBADW,MAAM,CACU;IAE3B,6CAA6C;IAC7C,SADW,aAAa,CACc;IAEtC,qEAAqE;IACrE,SADW,mBAAmB,CACU;IAExC,2HAA2H;IAC3H,aADW;QAAC,aAAa,EAAE,qBAAqB,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAC,CAK9F;IAGH;;;;OAIG;IACH,iBAHW,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACvB,IAAI,CAOhB;IAED;;;;;OAKG;IACH,iBAHW,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACvB,IAAI,CAOhB;IAED;;;;;OAKG;IACH,eAHW,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;;OAKG;IACH,UAJW,MAAM,WACN,CAAC,OAAO,EAAE;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAC,CAAA;KAAC,KAAK,IAAI,GAC5H,IAAI,CAMhB;IAED;;;;;OAKG;IACH,WAJW,MAAM,WACN,CAAC,OAAO,EAAE,OAAC,KAAK,IAAI,GAClB,IAAI,CAMhB;IAED;;;;;OAKG;IACH,2BAJW,MAAM,WACN,KAAK,CAAC,OAAC,CAAC,GACN,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAMtC;IAED;;;;;OAKG;IACH,mBAJW,MAAM,WACN,KAAK,CAAC,OAAC,CAAC,GACN,OAAO,CAAC,OAAC,CAAC,CAMtB;IAED;;;;;OAKG;IACH,oBAJW,MAAM,WACN,KAAK,CAAC,OAAC,CAAC,GACN,OAAO,CAAC,OAAC,CAAC,CAMtB;IAED;;;;;;OAMG;IACH,+BALW,MAAM,SACN,MAAM,WACN,KAAK,CAAC,OAAC,CAAC,GACN,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAAC,CAI7C;IAED;;;;;;OAMG;IACH,uBALW,MAAM,SACN,MAAM,WACN,KAAK,CAAC,OAAC,CAAC,GACN,OAAO,CAAC,KAAK,CAAC,OAAC,CAAC,CAAC,CAI7B;IAED;;;;;;OAMG;IACH,wBALW,MAAM,SACN,MAAM,WACN,KAAK,CAAC,OAAC,CAAC,GACN,OAAO,CAAC,KAAK,CAAC,OAAC,CAAC,CAAC,CAI7B;IAED;;;;;OAKG;IACH,+BAJW,MAAM,WACN,KAAK,CAAC,OAAC,CAAC,GACN,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAAC,CAI7C;IAED;;;;;OAKG;IACH,uBAJW,MAAM,WACN,KAAK,CAAC,OAAC,CAAC,GACN,OAAO,CAAC,KAAK,CAAC,OAAC,CAAC,CAAC,CAI7B;IAED;;;;;OAKG;IACH,wBAJW,MAAM,WACN,KAAK,CAAC,OAAC,CAAC,GACN,OAAO,CAAC,KAAK,CAAC,OAAC,CAAC,CAAC,CAI7B;IAED;;;;OAIG;IACH,uBAHW,MAAM,GACJ,OAAO,CAAC,OAAC,CAAC,CAItB;IAED;;;;;OAKG;IACH,2BAJW,MAAM,SACN,MAAM,GACJ,OAAO,CAAC,KAAK,CAAC,OAAC,CAAC,CAAC,CAW7B;IAED;;;;OAIG;IACH,2BAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;OAKG;IACH,0BAJW,MAAM,SACN,MAAM,GACJ,IAAI,CAKhB;IAED;;;;OAIG;IACH,6BAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;;OAIG;IACH,mBAFa,IAAI,CAUhB;IAED;;;;OAIG;IACH,SAFa,IAAI,CAUhB;IAED;;;;;;;OAOG;IACH,mBANW,eAAe,GAAG,OAAO,GAAG,QAAQ,eACpC,MAAM,SACN,MAAM,QACN,KAAK,CAAC,OAAC,CAAC,GACN,OAAO,CAAC,KAAK,CAAC,OAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"factory-registry.d.ts","sourceRoot":"","sources":["../../../../src/testing/factory/factory-registry.js"],"names":[],"mappings":"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"}
|