velocious 1.0.618 → 1.0.620

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.
Files changed (61) hide show
  1. package/README.md +4 -2
  2. package/build/configuration.js +1 -1
  3. package/build/database/pool/async-tracked-multi-connection.js +25 -5
  4. package/build/database/pool/base.js +20 -10
  5. package/build/environment-handlers/base.js +9 -1
  6. package/build/environment-handlers/node.js +22 -4
  7. package/build/src/configuration.js +2 -2
  8. package/build/src/database/pool/async-tracked-multi-connection.d.ts +19 -1
  9. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  10. package/build/src/database/pool/async-tracked-multi-connection.js +26 -4
  11. package/build/src/database/pool/base.d.ts +12 -1
  12. package/build/src/database/pool/base.d.ts.map +1 -1
  13. package/build/src/database/pool/base.js +20 -11
  14. package/build/src/environment-handlers/base.d.ts +9 -1
  15. package/build/src/environment-handlers/base.d.ts.map +1 -1
  16. package/build/src/environment-handlers/base.js +9 -2
  17. package/build/src/environment-handlers/node.d.ts +10 -2
  18. package/build/src/environment-handlers/node.d.ts.map +1 -1
  19. package/build/src/environment-handlers/node.js +24 -5
  20. package/build/src/testing/shared-transaction-broker-client.d.ts +4 -2
  21. package/build/src/testing/shared-transaction-broker-client.d.ts.map +1 -1
  22. package/build/src/testing/shared-transaction-broker-client.js +5 -3
  23. package/build/src/testing/shared-transaction-broker.d.ts +21 -0
  24. package/build/src/testing/shared-transaction-broker.d.ts.map +1 -1
  25. package/build/src/testing/shared-transaction-broker.js +61 -18
  26. package/build/src/testing/shared-transaction-connection-coordinator.d.ts +2 -0
  27. package/build/src/testing/shared-transaction-connection-coordinator.d.ts.map +1 -1
  28. package/build/src/testing/shared-transaction-connection-coordinator.js +79 -12
  29. package/build/src/testing/shared-transaction-proxy-driver.d.ts +22 -3
  30. package/build/src/testing/shared-transaction-proxy-driver.d.ts.map +1 -1
  31. package/build/src/testing/shared-transaction-proxy-driver.js +51 -14
  32. package/build/src/testing/test-transaction-session.d.ts +129 -0
  33. package/build/src/testing/test-transaction-session.d.ts.map +1 -0
  34. package/build/src/testing/test-transaction-session.js +255 -0
  35. package/build/src/testing/test.d.ts +1 -1
  36. package/build/src/testing/test.d.ts.map +1 -1
  37. package/build/src/testing/test.js +2 -2
  38. package/build/testing/shared-transaction-broker-client.js +4 -2
  39. package/build/testing/shared-transaction-broker.js +58 -16
  40. package/build/testing/shared-transaction-connection-coordinator.js +83 -10
  41. package/build/testing/shared-transaction-proxy-driver.js +52 -13
  42. package/build/testing/test-transaction-session.js +240 -0
  43. package/build/testing/test.js +1 -1
  44. package/build/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +2 -1
  46. package/src/configuration.js +1 -1
  47. package/src/database/pool/async-tracked-multi-connection.js +25 -5
  48. package/src/database/pool/base.js +20 -10
  49. package/src/environment-handlers/base.js +9 -1
  50. package/src/environment-handlers/node.js +22 -4
  51. package/src/testing/shared-transaction-broker-client.js +4 -2
  52. package/src/testing/shared-transaction-broker.js +58 -16
  53. package/src/testing/shared-transaction-connection-coordinator.js +83 -10
  54. package/src/testing/shared-transaction-proxy-driver.js +52 -13
  55. package/src/testing/test-transaction-session.js +240 -0
  56. package/src/testing/test.js +1 -1
  57. package/build/src/testing/wait-for-event.d.ts +0 -46
  58. package/build/src/testing/wait-for-event.d.ts.map +0 -1
  59. package/build/src/testing/wait-for-event.js +0 -64
  60. package/build/testing/wait-for-event.js +0 -72
  61. package/src/testing/wait-for-event.js +0 -72
@@ -1,15 +1,26 @@
1
1
  // @ts-check
2
- /** @typedef {{coordinator: (callback: () => Promise<unknown>) => Promise<unknown>, ownedQueue: Promise<void>, owner: symbol}} CoordinatorRegistration */
2
+ /** @typedef {{coordinator: (callback: () => Promise<unknown>) => Promise<unknown>, ownedQueue: Promise<void>, owner: symbol, reentrantOwners: Set<symbol>, rootOwners: Set<symbol>}} CoordinatorRegistration */
3
3
  /** @type {WeakMap<object, CoordinatorRegistration>} */
4
4
  const coordinators = new WeakMap();
5
+ /** @type {WeakMap<object, CoordinatorRegistration>} */
6
+ const connectionRegistrations = new WeakMap();
7
+ /**
8
+ * Runs work directly when only the connection-local queue remains registered.
9
+ * @param {() => Promise<unknown>} callback - Serialized operation.
10
+ * @returns {Promise<unknown>} - Operation result.
11
+ */
12
+ async function inactiveCoordinator(callback) {
13
+ return await callback();
14
+ }
5
15
  /**
6
16
  * Serializes sibling work that inherited one coordinator owner without re-entering the broker queue.
7
17
  * @template T
18
+ * @param {import("../database/drivers/base.js").default} connection - Parent physical connection.
8
19
  * @param {CoordinatorRegistration} registration - Physical connection registration.
9
20
  * @param {() => Promise<T>} callback - Owned operation.
10
21
  * @returns {Promise<T>} - Operation result.
11
22
  */
12
- async function coordinateOwnedSharedTransactionConnection(registration, callback) {
23
+ async function coordinateOwnedSharedTransactionConnection(connection, registration, callback) {
13
24
  const previous = registration.ownedQueue;
14
25
  /**
15
26
  * Releases the next owned sibling operation.
@@ -18,13 +29,50 @@ async function coordinateOwnedSharedTransactionConnection(registration, callback
18
29
  let release = () => { };
19
30
  registration.ownedQueue = new Promise((resolve) => { release = resolve; });
20
31
  await previous;
32
+ const operationOwner = Symbol("shared-transaction-owned-operation");
33
+ const environmentHandler = connection.configuration.getEnvironmentHandler();
34
+ registration.reentrantOwners.add(operationOwner);
21
35
  try {
22
- return await callback();
36
+ return await environmentHandler.runWithSharedTransactionCoordinatorOwner(connection, operationOwner, callback);
23
37
  }
24
38
  finally {
39
+ registration.reentrantOwners.delete(operationOwner);
25
40
  release();
26
41
  }
27
42
  }
43
+ /**
44
+ * Drains all inherited operations admitted before the root owner is revoked.
45
+ * @param {CoordinatorRegistration} registration - Physical connection registration.
46
+ * @returns {Promise<void>} - Resolves when the owned queue stops advancing.
47
+ */
48
+ async function drainOwnedSharedTransactionConnections(registration) {
49
+ let tail;
50
+ do {
51
+ tail = registration.ownedQueue;
52
+ await tail;
53
+ } while (tail !== registration.ownedQueue);
54
+ }
55
+ /**
56
+ * Runs one broker-serialized root while tracking and draining its inherited work.
57
+ * @template T
58
+ * @param {import("../database/drivers/base.js").default} connection - Parent physical connection.
59
+ * @param {CoordinatorRegistration} registration - Physical connection registration.
60
+ * @param {() => Promise<T>} callback - Root operation.
61
+ * @returns {Promise<T>} - Operation result.
62
+ */
63
+ async function coordinateRootSharedTransactionConnection(connection, registration, callback) {
64
+ await drainOwnedSharedTransactionConnections(registration);
65
+ const rootOwner = Symbol("shared-transaction-root-operation");
66
+ const environmentHandler = connection.configuration.getEnvironmentHandler();
67
+ registration.rootOwners.add(rootOwner);
68
+ try {
69
+ return await environmentHandler.runWithSharedTransactionCoordinatorOwner(connection, rootOwner, callback);
70
+ }
71
+ finally {
72
+ await drainOwnedSharedTransactionConnections(registration);
73
+ registration.rootOwners.delete(rootOwner);
74
+ }
75
+ }
28
76
  /**
29
77
  * Registers test-only serialization owned by the active broker.
30
78
  * @param {object} connection - Parent physical connection.
@@ -33,7 +81,16 @@ async function coordinateOwnedSharedTransactionConnection(registration, callback
33
81
  */
34
82
  export function setSharedTransactionCoordinator(connection, coordinator) {
35
83
  const owner = Symbol("shared-transaction-coordinator");
36
- coordinators.set(connection, { coordinator, ownedQueue: Promise.resolve(), owner });
84
+ let registration = connectionRegistrations.get(connection);
85
+ if (registration) {
86
+ registration.coordinator = coordinator;
87
+ registration.owner = owner;
88
+ }
89
+ else {
90
+ registration = { coordinator, ownedQueue: Promise.resolve(), owner, reentrantOwners: new Set(), rootOwners: new Set() };
91
+ connectionRegistrations.set(connection, registration);
92
+ }
93
+ coordinators.set(connection, registration);
37
94
  return owner;
38
95
  }
39
96
  /**
@@ -43,8 +100,11 @@ export function setSharedTransactionCoordinator(connection, coordinator) {
43
100
  * @returns {void}
44
101
  */
45
102
  export function clearSharedTransactionCoordinator(connection, coordinator) {
46
- if (coordinators.get(connection)?.coordinator === coordinator)
103
+ const registration = coordinators.get(connection);
104
+ if (registration?.coordinator === coordinator) {
47
105
  coordinators.delete(connection);
106
+ registration.coordinator = inactiveCoordinator;
107
+ }
48
108
  }
49
109
  /**
50
110
  * Runs parent work through broker serialization when registered.
@@ -55,17 +115,24 @@ export function clearSharedTransactionCoordinator(connection, coordinator) {
55
115
  * @returns {Promise<T>} - Operation result.
56
116
  */
57
117
  export async function coordinateSharedTransactionConnection(connection, callback, operationOwner) {
58
- const registration = coordinators.get(connection);
118
+ const activeRegistration = coordinators.get(connection);
119
+ const registration = activeRegistration || connectionRegistrations.get(connection);
59
120
  if (!registration)
60
121
  return await callback();
61
- if (operationOwner === registration.owner)
62
- return await callback();
63
122
  const environmentHandler = connection.configuration.getEnvironmentHandler();
64
- if (environmentHandler.getSharedTransactionCoordinatorOwner(connection) === registration.owner) {
65
- return await coordinateOwnedSharedTransactionConnection(registration, callback);
123
+ const currentOwner = environmentHandler.getSharedTransactionCoordinatorOwner(connection);
124
+ if (currentOwner && registration.reentrantOwners.has(currentOwner))
125
+ return await callback();
126
+ if (currentOwner && registration.rootOwners.has(currentOwner)) {
127
+ return await coordinateOwnedSharedTransactionConnection(connection, registration, callback);
128
+ }
129
+ if (!activeRegistration)
130
+ return await coordinateOwnedSharedTransactionConnection(connection, registration, callback);
131
+ if (operationOwner === registration.owner) {
132
+ return await coordinateRootSharedTransactionConnection(connection, registration, callback);
66
133
  }
67
134
  return /** @type {T} */ (await registration.coordinator(async () => {
68
- return await environmentHandler.runWithSharedTransactionCoordinatorOwner(connection, registration.owner, callback);
135
+ return await coordinateRootSharedTransactionConnection(connection, registration, callback);
69
136
  }));
70
137
  }
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLWNvbm5lY3Rpb24tY29vcmRpbmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9zaGFyZWQtdHJhbnNhY3Rpb24tY29ubmVjdGlvbi1jb29yZGluYXRvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVoseUpBQXlKO0FBRXpKLHVEQUF1RDtBQUN2RCxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRWxDOzs7Ozs7R0FNRztBQUNILEtBQUssVUFBVSwwQ0FBMEMsQ0FBQyxZQUFZLEVBQUUsUUFBUTtJQUM5RSxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFBO0lBQ3hDOzs7T0FHRztJQUNILElBQUksT0FBTyxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQTtJQUV0QixZQUFZLENBQUMsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDekUsTUFBTSxRQUFRLENBQUE7SUFDZCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sUUFBUSxFQUFFLENBQUE7SUFDekIsQ0FBQztZQUFTLENBQUM7UUFDVCxPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsK0JBQStCLENBQUMsVUFBVSxFQUFFLFdBQVc7SUFDckUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGdDQUFnQyxDQUFDLENBQUE7SUFFdEQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0lBQ2pGLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGlDQUFpQyxDQUFDLFVBQVUsRUFBRSxXQUFXO0lBQ3ZFLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLEtBQUssV0FBVztRQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDaEcsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHFDQUFxQyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsY0FBYztJQUM5RixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRWpELElBQUksQ0FBQyxZQUFZO1FBQUUsT0FBTyxNQUFNLFFBQVEsRUFBRSxDQUFBO0lBQzFDLElBQUksY0FBYyxLQUFLLFlBQVksQ0FBQyxLQUFLO1FBQUUsT0FBTyxNQUFNLFFBQVEsRUFBRSxDQUFBO0lBRWxFLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO0lBRTNFLElBQUksa0JBQWtCLENBQUMsb0NBQW9DLENBQUMsVUFBVSxDQUFDLEtBQUssWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9GLE9BQU8sTUFBTSwwQ0FBMEMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDakYsQ0FBQztJQUVELE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakUsT0FBTyxNQUFNLGtCQUFrQixDQUFDLHdDQUF3QyxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3BILENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZWRlZiB7e2Nvb3JkaW5hdG9yOiAoY2FsbGJhY2s6ICgpID0+IFByb21pc2U8dW5rbm93bj4pID0+IFByb21pc2U8dW5rbm93bj4sIG93bmVkUXVldWU6IFByb21pc2U8dm9pZD4sIG93bmVyOiBzeW1ib2x9fSBDb29yZGluYXRvclJlZ2lzdHJhdGlvbiAqL1xuXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBDb29yZGluYXRvclJlZ2lzdHJhdGlvbj59ICovXG5jb25zdCBjb29yZGluYXRvcnMgPSBuZXcgV2Vha01hcCgpXG5cbi8qKlxuICogU2VyaWFsaXplcyBzaWJsaW5nIHdvcmsgdGhhdCBpbmhlcml0ZWQgb25lIGNvb3JkaW5hdG9yIG93bmVyIHdpdGhvdXQgcmUtZW50ZXJpbmcgdGhlIGJyb2tlciBxdWV1ZS5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdG9yUmVnaXN0cmF0aW9ufSByZWdpc3RyYXRpb24gLSBQaHlzaWNhbCBjb25uZWN0aW9uIHJlZ2lzdHJhdGlvbi5cbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPd25lZCBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBPcGVyYXRpb24gcmVzdWx0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb29yZGluYXRlT3duZWRTaGFyZWRUcmFuc2FjdGlvbkNvbm5lY3Rpb24ocmVnaXN0cmF0aW9uLCBjYWxsYmFjaykge1xuICBjb25zdCBwcmV2aW91cyA9IHJlZ2lzdHJhdGlvbi5vd25lZFF1ZXVlXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgbmV4dCBvd25lZCBzaWJsaW5nIG9wZXJhdGlvbi5cbiAgICogQHR5cGUgeygpID0+IHZvaWR9XG4gICAqL1xuICBsZXQgcmVsZWFzZSA9ICgpID0+IHt9XG5cbiAgcmVnaXN0cmF0aW9uLm93bmVkUXVldWUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4geyByZWxlYXNlID0gcmVzb2x2ZSB9KVxuICBhd2FpdCBwcmV2aW91c1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gIH0gZmluYWxseSB7XG4gICAgcmVsZWFzZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGVzdC1vbmx5IHNlcmlhbGl6YXRpb24gb3duZWQgYnkgdGhlIGFjdGl2ZSBicm9rZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gY29ubmVjdGlvbiAtIFBhcmVudCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICogQHBhcmFtIHsoY2FsbGJhY2s6ICgpID0+IFByb21pc2U8dW5rbm93bj4pID0+IFByb21pc2U8dW5rbm93bj59IGNvb3JkaW5hdG9yIC0gU2VyaWFsaXplci5cbiAqIEByZXR1cm5zIHtzeW1ib2x9IC0gT3BhcXVlIG93bmVyIGZvciBicm9rZXItaW50ZXJuYWwgY29ubmVjdGlvbiBjYWxscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbiwgY29vcmRpbmF0b3IpIHtcbiAgY29uc3Qgb3duZXIgPSBTeW1ib2woXCJzaGFyZWQtdHJhbnNhY3Rpb24tY29vcmRpbmF0b3JcIilcblxuICBjb29yZGluYXRvcnMuc2V0KGNvbm5lY3Rpb24sIHtjb29yZGluYXRvciwgb3duZWRRdWV1ZTogUHJvbWlzZS5yZXNvbHZlKCksIG93bmVyfSlcbiAgcmV0dXJuIG93bmVyXG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIGJyb2tlci1vd25lZCBjb29yZGluYXRvciB3aXRob3V0IGRpc3R1cmJpbmcgYSByZXBsYWNlbWVudC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25uZWN0aW9uIC0gUGFyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0geyhjYWxsYmFjazogKCkgPT4gUHJvbWlzZTx1bmtub3duPikgPT4gUHJvbWlzZTx1bmtub3duPn0gY29vcmRpbmF0b3IgLSBFeHBlY3RlZCBzZXJpYWxpemVyLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbiwgY29vcmRpbmF0b3IpIHtcbiAgaWYgKGNvb3JkaW5hdG9ycy5nZXQoY29ubmVjdGlvbik/LmNvb3JkaW5hdG9yID09PSBjb29yZGluYXRvcikgY29vcmRpbmF0b3JzLmRlbGV0ZShjb25uZWN0aW9uKVxufVxuXG4vKipcbiAqIFJ1bnMgcGFyZW50IHdvcmsgdGhyb3VnaCBicm9rZXIgc2VyaWFsaXphdGlvbiB3aGVuIHJlZ2lzdGVyZWQuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIFBhcmVudCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIFBhcmVudCBvcGVyYXRpb24uXG4gKiBAcGFyYW0ge3N5bWJvbH0gW29wZXJhdGlvbk93bmVyXSAtIEJyb2tlciBvd25lciBmb3IgYW4gYWxyZWFkeS1jb29yZGluYXRlZCBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBPcGVyYXRpb24gcmVzdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29vcmRpbmF0ZVNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbihjb25uZWN0aW9uLCBjYWxsYmFjaywgb3BlcmF0aW9uT3duZXIpIHtcbiAgY29uc3QgcmVnaXN0cmF0aW9uID0gY29vcmRpbmF0b3JzLmdldChjb25uZWN0aW9uKVxuXG4gIGlmICghcmVnaXN0cmF0aW9uKSByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICBpZiAob3BlcmF0aW9uT3duZXIgPT09IHJlZ2lzdHJhdGlvbi5vd25lcikgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcblxuICBjb25zdCBlbnZpcm9ubWVudEhhbmRsZXIgPSBjb25uZWN0aW9uLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRIYW5kbGVyKClcblxuICBpZiAoZW52aXJvbm1lbnRIYW5kbGVyLmdldFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3JPd25lcihjb25uZWN0aW9uKSA9PT0gcmVnaXN0cmF0aW9uLm93bmVyKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNvb3JkaW5hdGVPd25lZFNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbihyZWdpc3RyYXRpb24sIGNhbGxiYWNrKVxuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGF3YWl0IHJlZ2lzdHJhdGlvbi5jb29yZGluYXRvcihhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGVudmlyb25tZW50SGFuZGxlci5ydW5XaXRoU2hhcmVkVHJhbnNhY3Rpb25Db29yZGluYXRvck93bmVyKGNvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbi5vd25lciwgY2FsbGJhY2spXG4gIH0pKVxufVxuIl19
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLWNvbm5lY3Rpb24tY29vcmRpbmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9zaGFyZWQtdHJhbnNhY3Rpb24tY29ubmVjdGlvbi1jb29yZGluYXRvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosZ05BQWdOO0FBRWhOLHVEQUF1RDtBQUN2RCxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBQ2xDLHVEQUF1RDtBQUN2RCxNQUFNLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFN0M7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxRQUFRO0lBQ3pDLE9BQU8sTUFBTSxRQUFRLEVBQUUsQ0FBQTtBQUN6QixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILEtBQUssVUFBVSwwQ0FBMEMsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFFBQVE7SUFDMUYsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQTtJQUN4Qzs7O09BR0c7SUFDSCxJQUFJLE9BQU8sR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUE7SUFFdEIsWUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3pFLE1BQU0sUUFBUSxDQUFBO0lBQ2QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLG9DQUFvQyxDQUFDLENBQUE7SUFDbkUsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUE7SUFFM0UsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUE7SUFDaEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLGtCQUFrQixDQUFD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ZGluYXRvcjogKGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHVua25vd24+KSA9PiBQcm9taXNlPHVua25vd24+LCBvd25lZFF1ZXVlOiBQcm9taXNlPHZvaWQ+LCBvd25lcjogc3ltYm9sLCByZWVudHJhbnRPd25lcnM6IFNldDxzeW1ib2w+LCByb290T3duZXJzOiBTZXQ8c3ltYm9sPn19IENvb3JkaW5hdG9yUmVnaXN0cmF0aW9uICovXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIENvb3JkaW5hdG9yUmVnaXN0cmF0aW9uPn0gKi9cbmNvbnN0IGNvb3JkaW5hdG9ycyA9IG5ldyBXZWFrTWFwKClcbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIENvb3JkaW5hdG9yUmVnaXN0cmF0aW9uPn0gKi9cbmNvbnN0IGNvbm5lY3Rpb25SZWdpc3RyYXRpb25zID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIFJ1bnMgd29yayBkaXJlY3RseSB3aGVuIG9ubHkgdGhlIGNvbm5lY3Rpb24tbG9jYWwgcXVldWUgcmVtYWlucyByZWdpc3RlcmVkLlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHVua25vd24+fSBjYWxsYmFjayAtIFNlcmlhbGl6ZWQgb3BlcmF0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59IC0gT3BlcmF0aW9uIHJlc3VsdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5hY3RpdmVDb29yZGluYXRvcihjYWxsYmFjaykge1xuICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgc2libGluZyB3b3JrIHRoYXQgaW5oZXJpdGVkIG9uZSBjb29yZGluYXRvciBvd25lciB3aXRob3V0IHJlLWVudGVyaW5nIHRoZSBicm9rZXIgcXVldWUuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIFBhcmVudCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICogQHBhcmFtIHtDb29yZGluYXRvclJlZ2lzdHJhdGlvbn0gcmVnaXN0cmF0aW9uIC0gUGh5c2ljYWwgY29ubmVjdGlvbiByZWdpc3RyYXRpb24uXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gT3duZWQgb3BlcmF0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8VD59IC0gT3BlcmF0aW9uIHJlc3VsdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29vcmRpbmF0ZU93bmVkU2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbiwgY2FsbGJhY2spIHtcbiAgY29uc3QgcHJldmlvdXMgPSByZWdpc3RyYXRpb24ub3duZWRRdWV1ZVxuICAvKipcbiAgICogUmVsZWFzZXMgdGhlIG5leHQgb3duZWQgc2libGluZyBvcGVyYXRpb24uXG4gICAqIEB0eXBlIHsoKSA9PiB2b2lkfVxuICAgKi9cbiAgbGV0IHJlbGVhc2UgPSAoKSA9PiB7fVxuXG4gIHJlZ2lzdHJhdGlvbi5vd25lZFF1ZXVlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgcmVsZWFzZSA9IHJlc29sdmUgfSlcbiAgYXdhaXQgcHJldmlvdXNcbiAgY29uc3Qgb3BlcmF0aW9uT3duZXIgPSBTeW1ib2woXCJzaGFyZWQtdHJhbnNhY3Rpb24tb3duZWQtb3BlcmF0aW9uXCIpXG4gIGNvbnN0IGVudmlyb25tZW50SGFuZGxlciA9IGNvbm5lY3Rpb24uY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudEhhbmRsZXIoKVxuXG4gIHJlZ2lzdHJhdGlvbi5yZWVudHJhbnRPd25lcnMuYWRkKG9wZXJhdGlvbk93bmVyKVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBlbnZpcm9ubWVudEhhbmRsZXIucnVuV2l0aFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3JPd25lcihjb25uZWN0aW9uLCBvcGVyYXRpb25Pd25lciwgY2FsbGJhY2spXG4gIH0gZmluYWxseSB7XG4gICAgcmVnaXN0cmF0aW9uLnJlZW50cmFudE93bmVycy5kZWxldGUob3BlcmF0aW9uT3duZXIpXG4gICAgcmVsZWFzZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBEcmFpbnMgYWxsIGluaGVyaXRlZCBvcGVyYXRpb25zIGFkbWl0dGVkIGJlZm9yZSB0aGUgcm9vdCBvd25lciBpcyByZXZva2VkLlxuICogQHBhcmFtIHtDb29yZGluYXRvclJlZ2lzdHJhdGlvbn0gcmVnaXN0cmF0aW9uIC0gUGh5c2ljYWwgY29ubmVjdGlvbiByZWdpc3RyYXRpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBvd25lZCBxdWV1ZSBzdG9wcyBhZHZhbmNpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRyYWluT3duZWRTaGFyZWRUcmFuc2FjdGlvbkNvbm5lY3Rpb25zKHJlZ2lzdHJhdGlvbikge1xuICBsZXQgdGFpbFxuXG4gIGRvIHtcbiAgICB0YWlsID0gcmVnaXN0cmF0aW9uLm93bmVkUXVldWVcbiAgICBhd2FpdCB0YWlsXG4gIH0gd2hpbGUgKHRhaWwgIT09IHJlZ2lzdHJhdGlvbi5vd25lZFF1ZXVlKVxufVxuXG4vKipcbiAqIFJ1bnMgb25lIGJyb2tlci1zZXJpYWxpemVkIHJvb3Qgd2hpbGUgdHJhY2tpbmcgYW5kIGRyYWluaW5nIGl0cyBpbmhlcml0ZWQgd29yay5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gUGFyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdG9yUmVnaXN0cmF0aW9ufSByZWdpc3RyYXRpb24gLSBQaHlzaWNhbCBjb25uZWN0aW9uIHJlZ2lzdHJhdGlvbi5cbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBSb290IG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIE9wZXJhdGlvbiByZXN1bHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvb3JkaW5hdGVSb290U2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbiwgY2FsbGJhY2spIHtcbiAgYXdhaXQgZHJhaW5Pd25lZFNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbnMocmVnaXN0cmF0aW9uKVxuICBjb25zdCByb290T3duZXIgPSBTeW1ib2woXCJzaGFyZWQtdHJhbnNhY3Rpb24tcm9vdC1vcGVyYXRpb25cIilcbiAgY29uc3QgZW52aXJvbm1lbnRIYW5kbGVyID0gY29ubmVjdGlvbi5jb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50SGFuZGxlcigpXG5cbiAgcmVnaXN0cmF0aW9uLnJvb3RPd25lcnMuYWRkKHJvb3RPd25lcilcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZW52aXJvbm1lbnRIYW5kbGVyLnJ1bldpdGhTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yT3duZXIoY29ubmVjdGlvbiwgcm9vdE93bmVyLCBjYWxsYmFjaylcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBkcmFpbk93bmVkU2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9ucyhyZWdpc3RyYXRpb24pXG4gICAgcmVnaXN0cmF0aW9uLnJvb3RPd25lcnMuZGVsZXRlKHJvb3RPd25lcilcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0ZXN0LW9ubHkgc2VyaWFsaXphdGlvbiBvd25lZCBieSB0aGUgYWN0aXZlIGJyb2tlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25uZWN0aW9uIC0gUGFyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0geyhjYWxsYmFjazogKCkgPT4gUHJvbWlzZTx1bmtub3duPikgPT4gUHJvbWlzZTx1bmtub3duPn0gY29vcmRpbmF0b3IgLSBTZXJpYWxpemVyLlxuICogQHJldHVybnMge3N5bWJvbH0gLSBPcGFxdWUgb3duZXIgZm9yIGJyb2tlci1pbnRlcm5hbCBjb25uZWN0aW9uIGNhbGxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2hhcmVkVHJhbnNhY3Rpb25Db29yZGluYXRvcihjb25uZWN0aW9uLCBjb29yZGluYXRvcikge1xuICBjb25zdCBvd25lciA9IFN5bWJvbChcInNoYXJlZC10cmFuc2FjdGlvbi1jb29yZGluYXRvclwiKVxuICBsZXQgcmVnaXN0cmF0aW9uID0gY29ubmVjdGlvblJlZ2lzdHJhdGlvbnMuZ2V0KGNvbm5lY3Rpb24pXG5cbiAgaWYgKHJlZ2lzdHJhdGlvbikge1xuICAgIHJlZ2lzdHJhdGlvbi5jb29yZGluYXRvciA9IGNvb3JkaW5hdG9yXG4gICAgcmVnaXN0cmF0aW9uLm93bmVyID0gb3duZXJcbiAgfSBlbHNlIHtcbiAgICByZWdpc3RyYXRpb24gPSB7Y29vcmRpbmF0b3IsIG93bmVkUXVldWU6IFByb21pc2UucmVzb2x2ZSgpLCBvd25lciwgcmVlbnRyYW50T3duZXJzOiBuZXcgU2V0KCksIHJvb3RPd25lcnM6IG5ldyBTZXQoKX1cbiAgICBjb25uZWN0aW9uUmVnaXN0cmF0aW9ucy5zZXQoY29ubmVjdGlvbiwgcmVnaXN0cmF0aW9uKVxuICB9XG5cbiAgY29vcmRpbmF0b3JzLnNldChjb25uZWN0aW9uLCByZWdpc3RyYXRpb24pXG4gIHJldHVybiBvd25lclxufVxuXG4vKipcbiAqIFJlbW92ZXMgYSBicm9rZXItb3duZWQgY29vcmRpbmF0b3Igd2l0aG91dCBkaXN0dXJiaW5nIGEgcmVwbGFjZW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gY29ubmVjdGlvbiAtIFBhcmVudCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICogQHBhcmFtIHsoY2FsbGJhY2s6ICgpID0+IFByb21pc2U8dW5rbm93bj4pID0+IFByb21pc2U8dW5rbm93bj59IGNvb3JkaW5hdG9yIC0gRXhwZWN0ZWQgc2VyaWFsaXplci5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yKGNvbm5lY3Rpb24sIGNvb3JkaW5hdG9yKSB7XG4gIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGNvb3JkaW5hdG9ycy5nZXQoY29ubmVjdGlvbilcblxuICBpZiAocmVnaXN0cmF0aW9uPy5jb29yZGluYXRvciA9PT0gY29vcmRpbmF0b3IpIHtcbiAgICBjb29yZGluYXRvcnMuZGVsZXRlKGNvbm5lY3Rpb24pXG4gICAgcmVnaXN0cmF0aW9uLmNvb3JkaW5hdG9yID0gaW5hY3RpdmVDb29yZGluYXRvclxuICB9XG59XG5cbi8qKlxuICogUnVucyBwYXJlbnQgd29yayB0aHJvdWdoIGJyb2tlciBzZXJpYWxpemF0aW9uIHdoZW4gcmVnaXN0ZXJlZC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gUGFyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gUGFyZW50IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB7c3ltYm9sfSBbb3BlcmF0aW9uT3duZXJdIC0gQnJva2VyIG93bmVyIGZvciBhbiBhbHJlYWR5LWNvb3JkaW5hdGVkIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIE9wZXJhdGlvbiByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb29yZGluYXRlU2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKGNvbm5lY3Rpb24sIGNhbGxiYWNrLCBvcGVyYXRpb25Pd25lcikge1xuICBjb25zdCBhY3RpdmVSZWdpc3RyYXRpb24gPSBjb29yZGluYXRvcnMuZ2V0KGNvbm5lY3Rpb24pXG4gIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGFjdGl2ZVJlZ2lzdHJhdGlvbiB8fCBjb25uZWN0aW9uUmVnaXN0cmF0aW9ucy5nZXQoY29ubmVjdGlvbilcblxuICBpZiAoIXJlZ2lzdHJhdGlvbikgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcblxuICBjb25zdCBlbnZpcm9ubWVudEhhbmRsZXIgPSBjb25uZWN0aW9uLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRIYW5kbGVyKClcbiAgY29uc3QgY3VycmVudE93bmVyID0gZW52aXJvbm1lbnRIYW5kbGVyLmdldFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3JPd25lcihjb25uZWN0aW9uKVxuXG4gIGlmIChjdXJyZW50T3duZXIgJiYgcmVnaXN0cmF0aW9uLnJlZW50cmFudE93bmVycy5oYXMoY3VycmVudE93bmVyKSkgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgaWYgKGN1cnJlbnRPd25lciAmJiByZWdpc3RyYXRpb24ucm9vdE93bmVycy5oYXMoY3VycmVudE93bmVyKSkge1xuICAgIHJldHVybiBhd2FpdCBjb29yZGluYXRlT3duZWRTaGFyZWRUcmFuc2FjdGlvbkNvbm5lY3Rpb24oY29ubmVjdGlvbiwgcmVnaXN0cmF0aW9uLCBjYWxsYmFjaylcbiAgfVxuICBpZiAoIWFjdGl2ZVJlZ2lzdHJhdGlvbikgcmV0dXJuIGF3YWl0IGNvb3JkaW5hdGVPd25lZFNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbihjb25uZWN0aW9uLCByZWdpc3RyYXRpb24sIGNhbGxiYWNrKVxuICBpZiAob3BlcmF0aW9uT3duZXIgPT09IHJlZ2lzdHJhdGlvbi5vd25lcikge1xuICAgIHJldHVybiBhd2FpdCBjb29yZGluYXRlUm9vdFNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbihjb25uZWN0aW9uLCByZWdpc3RyYXRpb24sIGNhbGxiYWNrKVxuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGF3YWl0IHJlZ2lzdHJhdGlvbi5jb29yZGluYXRvcihhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGNvb3JkaW5hdGVSb290U2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbiwgY2FsbGJhY2spXG4gIH0pKVxufVxuIl19
@@ -1,6 +1,7 @@
1
- /** @typedef {{address?: string, capability?: string, databaseIdentifiers?: string[], expected: boolean}} SharedTransactionBrokerJobConfig */
1
+ /** @typedef {{address?: string, allowDynamicIdentities?: boolean, capability?: string, databaseIdentifiers?: string[], expected: boolean}} SharedTransactionBrokerJobConfig */
2
2
  export type SharedTransactionBrokerJobConfig = {
3
3
  address?: string;
4
+ allowDynamicIdentities?: boolean;
4
5
  capability?: string;
5
6
  databaseIdentifiers?: string[];
6
7
  expected: boolean;
@@ -15,14 +16,31 @@ export declare const BACKGROUND_JOB_CHILD_ENV = "VELOCIOUS_BACKGROUND_JOB_CHILD"
15
16
  * @returns {T} - Callback result.
16
17
  */
17
18
  export declare function runWithSharedTransactionBrokerConfig<T>(config: SharedTransactionBrokerJobConfig, callback: () => T): T;
19
+ /**
20
+ * Checks whether the current live join selects one exact session capability.
21
+ * @param {{address: string, capability: string}} identity - Session control-message identity.
22
+ * @returns {boolean} - Whether this async context belongs to that session.
23
+ */
24
+ export declare function sharedTransactionBrokerContextMatches(identity: {
25
+ address: string;
26
+ capability: string;
27
+ }): boolean;
28
+ /**
29
+ * Preserves legacy real tenant connections omitted by automatic TestRunner mode.
30
+ * Explicit dynamic sessions never permit this fallback.
31
+ * @param {string} databaseIdentifier - Logical database identifier.
32
+ * @returns {boolean} - Whether an omitted automatic route stays independent.
33
+ */
34
+ export declare function automaticSharedTransactionBrokerOmits(databaseIdentifier: string): boolean;
18
35
  /**
19
36
  * Parses the test-runner-owned child transport configuration when this logical
20
37
  * database is registered for the active attempt.
21
38
  * @param {string} databaseIdentifier - Logical database identifier.
22
- * @returns {{address: string, capability: string} | undefined} - Broker coordinates.
39
+ * @returns {{address: string, allowDynamicIdentities?: boolean, capability: string} | undefined} - Broker coordinates.
23
40
  */
24
41
  export declare function sharedTransactionBrokerConfig(databaseIdentifier: string): {
25
42
  address: string;
43
+ allowDynamicIdentities?: boolean;
26
44
  capability: string;
27
45
  } | undefined;
28
46
  /**
@@ -32,11 +50,12 @@ export declare function sharedTransactionBrokerConfig(databaseIdentifier: string
32
50
  * @param {import("../configuration-types.js").DatabaseConfigurationType} config - Database configuration.
33
51
  * @param {import("../configuration.js").default} configuration - Child configuration.
34
52
  * @param {string} databaseIdentifier - Logical identifier.
35
- * @param {{address: string, capability: string}} brokerConfig - Broker coordinates.
53
+ * @param {{address: string, capability: string, reuseKey?: string}} brokerConfig - Broker coordinates.
36
54
  * @returns {import("../database/drivers/base.js").default} - Unconnected physical proxy.
37
55
  */
38
56
  export declare function createSharedTransactionProxyDriver(DriverClass: typeof import("../database/drivers/base.js").default, config: import("../configuration-types.js").DatabaseConfigurationType, configuration: import("../configuration.js").default, databaseIdentifier: string, brokerConfig: {
39
57
  address: string;
40
58
  capability: string;
59
+ reuseKey?: string;
41
60
  }): import("../database/drivers/base.js").default;
42
61
  //# sourceMappingURL=shared-transaction-proxy-driver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared-transaction-proxy-driver.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-proxy-driver.js"],"names":[],"mappings":"AAAA,6IAA6I;AAAzI,YAAsG,gCAAgC,GAA5H;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,CAAkC;AAO1I,eAAO,MAAM,6BAA6B,6CAA6C,CAAA;AACvF,eAAO,MAAM,wBAAwB,mCAAmC,CAAA;AAKxE;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CALvC,CAAC,EAKuC,MAAM,EAJhD,gCAIgD,EAAE,QAAQ,EAH1D,MAAM,CAGoD,GAFxD,CAAC,CAIb;AAyBD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,kBAAkB,EAHrD,MAGqD,GAFnD;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,CAW7D;AAuBD;;;;;;;;;GASG;AACH,wBAAgB,kCAAkC,CAAC,WAAW,EAPnD,cAAc,6BAA6B,EAAE,OAOM,EAAE,MAAM,EAN3D,OAAO,2BAA2B,EAAE,yBAMuB,EAAE,aAAa,EAL1E,OAAO,qBAAqB,EAAE,OAK4C,EAAE,kBAAkB,EAJ9F,MAI8F,EAAE,YAAY,EAH5G;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAGwE,GAF1G,OAAO,6BAA6B,EAAE,OAAO,CA+GzD"}
1
+ {"version":3,"file":"shared-transaction-proxy-driver.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-proxy-driver.js"],"names":[],"mappings":"AAAA,+KAA+K;AAA3K,YAAwI,gCAAgC,GAA9J;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,CAAkC;AAO5K,eAAO,MAAM,6BAA6B,6CAA6C,CAAA;AACvF,eAAO,MAAM,wBAAwB,mCAAmC,CAAA;AAkBxE;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CALvC,CAAC,EAKuC,MAAM,EAJhD,gCAIgD,EAAE,QAAQ,EAH1D,MAAM,CAGoD,GAFxD,CAAC,CAIb;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CAAC,QAAQ,EAHnD;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAGe,GAFjD,OAAO,CAKnB;AAED;;;;;GAKG;AACH,wBAAgB,qCAAqC,CAAC,kBAAkB,EAH7D,MAG6D,GAF3D,OAAO,CAYnB;AAyBD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,kBAAkB,EAHrD,MAGqD,GAFnD;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,CAM/F;AA0BD;;;;;;;;;GASG;AACH,wBAAgB,kCAAkC,CAAC,WAAW,EAPnD,cAAc,6BAA6B,EAAE,OAOM,EAAE,MAAM,EAN3D,OAAO,2BAA2B,EAAE,yBAMuB,EAAE,aAAa,EAL1E,OAAO,qBAAqB,EAAE,OAK4C,EAAE,kBAAkB,EAJ9F,MAI8F,EAAE,YAAY,EAH5G;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAGqD,GAF1G,OAAO,6BAA6B,EAAE,OAAO,CA+GzD"}
@@ -1,4 +1,4 @@
1
- /** @typedef {{address?: string, capability?: string, databaseIdentifiers?: string[], expected: boolean}} SharedTransactionBrokerJobConfig */
1
+ /** @typedef {{address?: string, allowDynamicIdentities?: boolean, capability?: string, databaseIdentifiers?: string[], expected: boolean}} SharedTransactionBrokerJobConfig */
2
2
  // @ts-check
3
3
  import SharedTransactionBrokerClient from "./shared-transaction-broker-client.js";
4
4
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -6,6 +6,21 @@ export const SHARED_TRANSACTION_BROKER_ENV = "VELOCIOUS_TEST_SHARED_TRANSACTION_
6
6
  export const BACKGROUND_JOB_CHILD_ENV = "VELOCIOUS_BACKGROUND_JOB_CHILD";
7
7
  /** @type {AsyncLocalStorage<SharedTransactionBrokerJobConfig>} */
8
8
  const pooledJobBrokerConfig = new AsyncLocalStorage();
9
+ /**
10
+ * Returns the active live broker configuration without validating one database route.
11
+ * @returns {SharedTransactionBrokerJobConfig | undefined} - Active live or child configuration.
12
+ */
13
+ function activeSharedTransactionBrokerConfig() {
14
+ const contextualConfig = pooledJobBrokerConfig.getStore();
15
+ if (contextualConfig)
16
+ return contextualConfig;
17
+ if (process.env[BACKGROUND_JOB_CHILD_ENV] !== "1")
18
+ return undefined;
19
+ const serialized = process.env[SHARED_TRANSACTION_BROKER_ENV];
20
+ if (!serialized)
21
+ return undefined;
22
+ return JSON.parse(Buffer.from(serialized, "base64url").toString("utf8"));
23
+ }
9
24
  /**
10
25
  * Runs one pooled job with dispatch-time broker configuration.
11
26
  * @template T
@@ -16,6 +31,30 @@ const pooledJobBrokerConfig = new AsyncLocalStorage();
16
31
  export function runWithSharedTransactionBrokerConfig(config, callback) {
17
32
  return pooledJobBrokerConfig.run(config, callback);
18
33
  }
34
+ /**
35
+ * Checks whether the current live join selects one exact session capability.
36
+ * @param {{address: string, capability: string}} identity - Session control-message identity.
37
+ * @returns {boolean} - Whether this async context belongs to that session.
38
+ */
39
+ export function sharedTransactionBrokerContextMatches(identity) {
40
+ const config = pooledJobBrokerConfig.getStore();
41
+ return config?.expected === true && config.address === identity.address && config.capability === identity.capability;
42
+ }
43
+ /**
44
+ * Preserves legacy real tenant connections omitted by automatic TestRunner mode.
45
+ * Explicit dynamic sessions never permit this fallback.
46
+ * @param {string} databaseIdentifier - Logical database identifier.
47
+ * @returns {boolean} - Whether an omitted automatic route stays independent.
48
+ */
49
+ export function automaticSharedTransactionBrokerOmits(databaseIdentifier) {
50
+ const config = activeSharedTransactionBrokerConfig();
51
+ return Boolean(config?.expected === true &&
52
+ !config.allowDynamicIdentities &&
53
+ typeof config.address === "string" &&
54
+ typeof config.capability === "string" &&
55
+ Array.isArray(config.databaseIdentifiers) &&
56
+ !config.databaseIdentifiers.includes(databaseIdentifier));
57
+ }
19
58
  /**
20
59
  * Escapes a PostgreSQL literal without requiring a live child connection.
21
60
  * @param {ReturnType<typeof JSON.parse>} value - PostgreSQL literal value.
@@ -41,24 +80,19 @@ function pgEscapeLiteral(value) {
41
80
  * Parses the test-runner-owned child transport configuration when this logical
42
81
  * database is registered for the active attempt.
43
82
  * @param {string} databaseIdentifier - Logical database identifier.
44
- * @returns {{address: string, capability: string} | undefined} - Broker coordinates.
83
+ * @returns {{address: string, allowDynamicIdentities?: boolean, capability: string} | undefined} - Broker coordinates.
45
84
  */
46
85
  export function sharedTransactionBrokerConfig(databaseIdentifier) {
47
- const contextualConfig = pooledJobBrokerConfig.getStore();
48
- if (contextualConfig)
49
- return validatedBrokerConfig(contextualConfig, databaseIdentifier);
50
- if (process.env[BACKGROUND_JOB_CHILD_ENV] !== "1")
51
- return undefined;
52
- const serialized = process.env[SHARED_TRANSACTION_BROKER_ENV];
53
- if (!serialized)
86
+ const config = activeSharedTransactionBrokerConfig();
87
+ if (!config)
54
88
  return undefined;
55
- return validatedBrokerConfig(JSON.parse(Buffer.from(serialized, "base64url").toString("utf8")), databaseIdentifier);
89
+ return validatedBrokerConfig(config, databaseIdentifier);
56
90
  }
57
91
  /**
58
92
  * Validates dispatch-time broker configuration and fails closed when expected.
59
93
  * @param {SharedTransactionBrokerJobConfig} config - Candidate configuration.
60
94
  * @param {string} databaseIdentifier - Logical database identifier.
61
- * @returns {{address: string, capability: string} | undefined} - Broker coordinates.
95
+ * @returns {{address: string, allowDynamicIdentities?: boolean, capability: string} | undefined} - Broker coordinates.
62
96
  */
63
97
  function validatedBrokerConfig(config, databaseIdentifier) {
64
98
  if (config.expected && (!config.address || !config.capability || !config.databaseIdentifiers)) {
@@ -69,9 +103,12 @@ function validatedBrokerConfig(config, databaseIdentifier) {
69
103
  if (typeof config.address !== "string" || typeof config.capability !== "string" || !Array.isArray(config.databaseIdentifiers)) {
70
104
  throw new Error("Invalid shared transaction broker child configuration");
71
105
  }
72
- if (!config.databaseIdentifiers.includes(databaseIdentifier)) {
106
+ if (!config.allowDynamicIdentities && !config.databaseIdentifiers.includes(databaseIdentifier)) {
73
107
  throw new Error(`Transactional pooled job expected broker database identifier: ${databaseIdentifier}`);
74
108
  }
109
+ if (config.allowDynamicIdentities) {
110
+ return { address: config.address, allowDynamicIdentities: true, capability: config.capability };
111
+ }
75
112
  return { address: config.address, capability: config.capability };
76
113
  }
77
114
  /**
@@ -81,7 +118,7 @@ function validatedBrokerConfig(config, databaseIdentifier) {
81
118
  * @param {import("../configuration-types.js").DatabaseConfigurationType} config - Database configuration.
82
119
  * @param {import("../configuration.js").default} configuration - Child configuration.
83
120
  * @param {string} databaseIdentifier - Logical identifier.
84
- * @param {{address: string, capability: string}} brokerConfig - Broker coordinates.
121
+ * @param {{address: string, capability: string, reuseKey?: string}} brokerConfig - Broker coordinates.
85
122
  * @returns {import("../database/drivers/base.js").default} - Unconnected physical proxy.
86
123
  */
87
124
  export function createSharedTransactionProxyDriver(DriverClass, config, configuration, databaseIdentifier, brokerConfig) {
@@ -192,4 +229,4 @@ export function createSharedTransactionProxyDriver(DriverClass, config, configur
192
229
  }
193
230
  return new SharedTransactionProxyDriver();
194
231
  }
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLXByb3h5LWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3NoYXJlZC10cmFuc2FjdGlvbi1wcm94eS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNklBQTZJO0FBRTdJLFlBQVk7QUFFWixPQUFPLDZCQUE2QixNQUFNLHVDQUF1QyxDQUFBO0FBQ2pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRXBELE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLDBDQUEwQyxDQUFBO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLGdDQUFnQyxDQUFBO0FBRXhFLGtFQUFrRTtBQUNsRSxNQUFNLHFCQUFxQixHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQTtBQUVyRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsb0NBQW9DLENBQUMsTUFBTSxFQUFFLFFBQVE7SUFDbkUsT0FBTyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0FBQ3BELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBSztJQUM1QixNQUFNLE1BQU0sR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQTtJQUNqQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUE7SUFFeEIsS0FBSyxNQUFNLFNBQVMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMvQixJQUFJLFNBQVMsS0FBSyxHQUFHO1lBQUUsT0FBTyxJQUFJLFNBQVMsQ0FBQTtRQUMzQyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN2QixPQUFPLElBQUksU0FBUyxDQUFBO1lB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QkFBRSxNQUFNLEdBQUcsQ0FBQTtRQUNuQyxDQUFDO1FBRUQ7OztXQUdHO1FBQ0gsS0FBSyxDQUFDLG1CQUFtQixLQUFLLE9BQU8sS0FBSyxDQUFBLENBQUMsQ0FBQztLQUM3QztJQUVELE9BQU8sSUFBSSw0QkFBNEIsRUFBRSxDQUFBO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQHR5cGVkZWYge3thZGRyZXNzPzogc3RyaW5nLCBjYXBhYmlsaXR5Pzogc3RyaW5nLCBkYXRhYmFzZUlkZW50aWZpZXJzPzogc3RyaW5nW10sIGV4cGVjdGVkOiBib29sZWFufX0gU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJKb2JDb25maWcgKi9cblxuLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBTaGFyZWRUcmFuc2FjdGlvbkJyb2tlckNsaWVudCBmcm9tIFwiLi9zaGFyZWQtdHJhbnNhY3Rpb24tYnJva2VyLWNsaWVudC5qc1wiXG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJub2RlOmFzeW5jX2hvb2tzXCJcblxuZXhwb3J0IGNvbnN0IFNIQVJFRF9UUkFOU0FDVElPTl9CUk9LRVJfRU5WID0gXCJWRUxPQ0lPVVNfVEVTVF9TSEFSRURfVFJBTlNBQ1RJT05fQlJPS0VSXCJcbmV4cG9ydCBjb25zdCBCQUNLR1JPVU5EX0pPQl9DSElMRF9FTlYgPSBcIlZFTE9DSU9VU19CQUNLR1JPVU5EX0pPQl9DSElMRFwiXG5cbi8qKiBAdHlwZSB7QXN5bmNMb2NhbFN0b3JhZ2U8U2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJKb2JDb25maWc+fSAqL1xuY29uc3QgcG9vbGVkSm9iQnJva2VyQ29uZmlnID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKClcblxuLyoqXG4gKiBSdW5zIG9uZSBwb29sZWQgam9iIHdpdGggZGlzcGF0Y2gtdGltZSBicm9rZXIgY29uZmlndXJhdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1NoYXJlZFRyYW5zYWN0aW9uQnJva2VySm9iQ29uZmlnfSBjb25maWcgLSBQZXItam9iIGJyb2tlciBtb2RlIGFuZCBjb29yZGluYXRlcy5cbiAqIEBwYXJhbSB7KCkgPT4gVH0gY2FsbGJhY2sgLSBKb2IgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7VH0gLSBDYWxsYmFjayByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJDb25maWcoY29uZmlnLCBjYWxsYmFjaykge1xuICByZXR1cm4gcG9vbGVkSm9iQnJva2VyQ29uZmlnLnJ1bihjb25maWcsIGNhbGxiYWNrKVxufVxuXG4vKipcbiAqIEVzY2FwZXMgYSBQb3N0Z3JlU1FMIGxpdGVyYWwgd2l0aG91dCByZXF1aXJpbmcgYSBsaXZlIGNoaWxkIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFBvc3RncmVTUUwgbGl0ZXJhbCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUXVvdGVkIGxpdGVyYWwuXG4gKi9cbmZ1bmN0aW9uIHBnRXNjYXBlTGl0ZXJhbCh2YWx1ZSkge1xuICBjb25zdCBzdHJpbmcgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSlcbiAgbGV0IGVzY2FwZWQgPSBcIidcIlxuICBsZXQgaGFzQmFja3NsYXNoID0gZmFsc2VcblxuICBmb3IgKGNvbnN0IGNoYXJhY3RlciBvZiBzdHJpbmcpIHtcbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIikgZXNjYXBlZCArPSBjaGFyYWN0ZXJcbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIlxcXFxcIikge1xuICAgICAgZXNjYXBlZCArPSBjaGFyYWN0ZXJcbiAgICAgIGhhc0JhY2tzbGFzaCA9IHRydWVcbiAgICB9XG4gICAgZXNjYXBlZCArPSBjaGFyYWN0ZXJcbiAgfVxuXG4gIGVzY2FwZWQgKz0gXCInXCJcbiAgcmV0dXJuIGhhc0JhY2tzbGFzaCA/IGAgRSR7ZXNjYXBlZH1gIDogZXNjYXBlZFxufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgdGVzdC1ydW5uZXItb3duZWQgY2hpbGQgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gd2hlbiB0aGlzIGxvZ2ljYWxcbiAqIGRhdGFiYXNlIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBhY3RpdmUgYXR0ZW1wdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkZW50aWZpZXIgLSBMb2dpY2FsIGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gKiBAcmV0dXJucyB7e2FkZHJlc3M6IHN0cmluZywgY2FwYWJpbGl0eTogc3RyaW5nfSB8IHVuZGVmaW5lZH0gLSBCcm9rZXIgY29vcmRpbmF0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWRUcmFuc2FjdGlvbkJyb2tlckNvbmZpZyhkYXRhYmFzZUlkZW50aWZpZXIpIHtcbiAgY29uc3QgY29udGV4dHVhbENvbmZpZyA9IHBvb2xlZEpvYkJyb2tlckNvbmZpZy5nZXRTdG9yZSgpXG4gIGlmIChjb250ZXh0dWFsQ29uZmlnKSByZXR1cm4gdmFsaWRhdGVkQnJva2VyQ29uZmlnKGNvbnRleHR1YWxDb25maWcsIGRhdGFiYXNlSWRlbnRpZmllcilcbiAgaWYgKHByb2Nlc3MuZW52W0JBQ0tHUk9VTkRfSk9CX0NISUxEX0VOVl0gIT09IFwiMVwiKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3Qgc2VyaWFsaXplZCA9IHByb2Nlc3MuZW52W1NIQVJFRF9UUkFOU0FDVElPTl9CUk9LRVJfRU5WXVxuICBpZiAoIXNlcmlhbGl6ZWQpIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4gdmFsaWRhdGVkQnJva2VyQ29uZmlnKEpTT04ucGFyc2UoQnVmZmVyLmZyb20oc2VyaWFsaXplZCwgXCJiYXNlNjR1cmxcIikudG9TdHJpbmcoXCJ1dGY4XCIpKSwgZGF0YWJhc2VJZGVudGlmaWVyKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBkaXNwYXRjaC10aW1lIGJyb2tlciBjb25maWd1cmF0aW9uIGFuZCBmYWlscyBjbG9zZWQgd2hlbiBleHBlY3RlZC5cbiAqIEBwYXJhbSB7U2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJKb2JDb25maWd9IGNvbmZpZyAtIENhbmRpZGF0ZSBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRlbnRpZmllciAtIExvZ2ljYWwgZGF0YWJhc2UgaWRlbnRpZmllci5cbiAqIEByZXR1cm5zIHt7YWRkcmVzczogc3RyaW5nLCBjYXBhYmlsaXR5OiBzdHJpbmd9IHwgdW5kZWZpbmVkfSAtIEJyb2tlciBjb29yZGluYXRlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVkQnJva2VyQ29uZmlnKGNvbmZpZywgZGF0YWJhc2VJZGVudGlmaWVyKSB7XG4gIGlmIChjb25maWcuZXhwZWN0ZWQgJiYgKCFjb25maWcuYWRkcmVzcyB8fCAhY29uZmlnLmNhcGFiaWxpdHkgfHwgIWNvbmZpZy5kYXRhYmFzZUlkZW50aWZpZXJzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRyYW5zYWN0aW9uYWwgcG9vbGVkIGpvYiBleHBlY3RlZCBzaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNvb3JkaW5hdGVzXCIpXG4gIH1cbiAgaWYgKCFjb25maWcuZXhwZWN0ZWQpIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKHR5cGVvZiBjb25maWcuYWRkcmVzcyAhPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgY29uZmlnLmNhcGFiaWxpdHkgIT09IFwic3RyaW5nXCIgfHwgIUFycmF5LmlzQXJyYXkoY29uZmlnLmRhdGFiYXNlSWRlbnRpZmllcnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNoaWxkIGNvbmZpZ3VyYXRpb25cIilcbiAgfVxuICBpZiAoIWNvbmZpZy5kYXRhYmFzZUlkZW50aWZpZXJzLmluY2x1ZGVzKGRhdGFiYXNlSWRlbnRpZmllcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zYWN0aW9uYWwgcG9vbGVkIGpvYiBleHBlY3RlZCBicm9rZXIgZGF0YWJhc2UgaWRlbnRpZmllcjogJHtkYXRhYmFzZUlkZW50aWZpZXJ9YClcbiAgfVxuXG4gIHJldHVybiB7YWRkcmVzczogY29uZmlnLmFkZHJlc3MsIGNhcGFiaWxpdHk6IGNvbmZpZy5jYXBhYmlsaXR5fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjb25jcmV0ZS1kcml2ZXIgc3ViY2xhc3MgdGhhdCByZXRhaW5zIGFsbCBsb2NhbCBTUUwvcXVlcnkvbW9kZWxcbiAqIGJ1aWxkZXJzIHdoaWxlIGZvcndhcmRpbmcgb25seSBwaHlzaWNhbCBjb25uZWN0aW9uIGFjdGlvbnMgdG8gdGhlIHBhcmVudC5cbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBEcml2ZXJDbGFzcyAtIENvbmZpZ3VyZWQgY29uY3JldGUgZHJpdmVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGNvbmZpZyAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENoaWxkIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZGVudGlmaWVyIC0gTG9naWNhbCBpZGVudGlmaWVyLlxuICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBjYXBhYmlsaXR5OiBzdHJpbmd9fSBicm9rZXJDb25maWcgLSBCcm9rZXIgY29vcmRpbmF0ZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IC0gVW5jb25uZWN0ZWQgcGh5c2ljYWwgcHJveHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaGFyZWRUcmFuc2FjdGlvblByb3h5RHJpdmVyKERyaXZlckNsYXNzLCBjb25maWcsIGNvbmZpZ3VyYXRpb24sIGRhdGFiYXNlSWRlbnRpZmllciwgYnJva2VyQ29uZmlnKSB7XG4gIGNsYXNzIFNoYXJlZFRyYW5zYWN0aW9uUHJveHlEcml2ZXIgZXh0ZW5kcyBEcml2ZXJDbGFzcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBzdXBlcihjb25maWcsIGNvbmZpZ3VyYXRpb24pXG4gICAgICB0aGlzLnNoYXJlZFRyYW5zYWN0aW9uQ2xpZW50ID0gbmV3IFNoYXJlZFRyYW5zYWN0aW9uQnJva2VyQ2xpZW50KHsuLi5icm9rZXJDb25maWcsIGRhdGFiYXNlSWRlbnRpZmllcn0pXG4gICAgICAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIHRoaXMuc2hhcmVkVHJhbnNhY3Rpb25Sb290U2F2ZVBvaW50ID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29ubmVjdHMgdGhlIHByb3h5IHRyYW5zcG9ydC5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbm5lY3RlZC5cbiAgICAgKi9cbiAgICBhc3luYyBjb25uZWN0KCkgeyBhd2FpdCB0aGlzLnNoYXJlZFRyYW5zYWN0aW9uQ2xpZW50LmNvbm5lY3RlZCgpIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgb25seSB0aGUgcHJveHkgdHJhbnNwb3J0LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xvc2VkLlxuICAgICAqL1xuICAgIGFzeW5jIF9jbG9zZSgpIHsgYXdhaXQgdGhpcy5zaGFyZWRUcmFuc2FjdGlvbkNsaWVudC5jbG9zZSgpIH1cbiAgICAvKipcbiAgICAgKiBLZWVwcyBhIGJyb2tlciBwcm94eSB0cmFuc3BvcnQgYWxpdmUgYWNyb3NzIGxvZ2ljYWwgTXlTUUwgY2hlY2tvdXRzLlxuICAgICAqIFBhcmVudCBUZXN0UnVubmVyIG93bnMgcGh5c2ljYWwgc2Vzc2lvbiBjbGVhbnVwIGFuZCByb2xsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aXRob3V0IGNsb3NpbmcgdGhlIHRyYW5zcG9ydC5cbiAgICAgKi9cbiAgICBhc3luYyBjbGVhbnVwU2Vzc2lvblN0YXRlQWZ0ZXJDaGVja291dCgpIHt9XG4gICAgLyoqXG4gICAgICogUm91dGVzIGEgcGh5c2ljYWwgcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIFNRTCBzdGF0ZW1lbnQuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gUm93cy5cbiAgICAgKi9cbiAgICBhc3luYyBfcXVlcnlBY3R1YWwoc3FsKSB7IHJldHVybiBhd2FpdCB0aGlzLnNoYXJlZFRyYW5zYWN0aW9uQ2xpZW50LmNhbGwoXCJfcXVlcnlBY3R1YWxcIiwgW3NxbF0pIH1cbiAgICAvKipcbiAgICAgKiBSb3V0ZXMgYW4gYWZmZWN0ZWQtcm93IHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RhdGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gQWZmZWN0ZWQgcm93cy5cbiAgICAgKi9cbiAgICBhc3luYyBfYWZmZWN0ZWRSb3dzQWN0dWFsKHNxbCkgeyByZXR1cm4gYXdhaXQgdGhpcy5zaGFyZWRUcmFuc2FjdGlvbkNsaWVudC5jYWxsKFwiX2FmZmVjdGVkUm93c0FjdHVhbFwiLCBbc3FsXSkgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIGEgY2hpbGQgdHJhbnNhY3Rpb24gYXMgYSBwYXJlbnQgc2F2ZXBvaW50LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gc3RhcnRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBfc3RhcnRUcmFuc2FjdGlvbkFjdGlvbigpIHtcbiAgICAgIHRoaXMuc2hhcmVkVHJhbnNhY3Rpb25Sb290U2F2ZVBvaW50ID0gdGhpcy5nZW5lcmF0ZVNhdmVQb2ludE5hbWUoKVxuICAgICAgYXdhaXQgdGhpcy5zaGFyZWRUcmFuc2FjdGlvbkNsaWVudC5jYWxsKFwicm9vdFRyYW5zYWN0aW9uU3RhcnRcIiwgW3RoaXMuc2hhcmVkVHJhbnNhY3Rpb25Sb290U2F2ZVBvaW50XSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyB0aGUgY2hpbGQgdHJhbnNhY3Rpb24gc2F2ZXBvaW50LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcmVsZWFzZWQuXG4gICAgICovXG4gICAgYXN5bmMgX2NvbW1pdFRyYW5zYWN0aW9uQWN0aW9uKCkge1xuICAgICAgaWYgKCF0aGlzLnNoYXJlZFRyYW5zYWN0aW9uUm9vdFNhdmVQb2ludCkgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIHByb3h5IGhhcyBubyByb290IHNhdmVwb2ludFwiKVxuICAgICAgYXdhaXQgdGhpcy5zaGFyZWRUcmFuc2FjdGlvbkNsaWVudC5jYWxsKFwicm9vdFRyYW5zYWN0aW9uUmVsZWFzZVwiLCBbdGhpcy5zaGFyZWRUcmFuc2FjdGlvblJvb3RTYXZlUG9pbnRdKVxuICAgICAgdGhpcy5zaGFyZWRUcmFuc2FjdGlvblJvb3RTYXZlUG9pbnQgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb2xscyBiYWNrIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiBzYXZlcG9pbnQuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiByb2xsZWQgYmFjay5cbiAgICAgKi9cbiAgICBhc3luYyBfcm9sbGJhY2tUcmFuc2FjdGlvbkFjdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5zaGFyZWRUcmFuc2FjdGlvblJvb3RTYXZlUG9pbnQpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBwcm94eSBoYXMgbm8gcm9vdCBzYXZlcG9pbnRcIilcbiAgICAgIGF3YWl0IHRoaXMuc2hhcmVkVHJhbnNhY3Rpb25DbGllbnQuY2FsbChcInJvb3RUcmFuc2FjdGlvblJvbGxiYWNrXCIsIFt0aGlzLnNoYXJlZFRyYW5zYWN0aW9uUm9vdFNhdmVQb2ludF0pXG4gICAgICB0aGlzLnNoYXJlZFRyYW5zYWN0aW9uUm9vdFNhdmVQb2ludCA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgYSBsb2NhbCBTUUwgdmFsdWUuXG4gICAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBTUUwgdmFsdWUuXG4gICAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIEVzY2FwZWQgdmFsdWUuXG4gICAgICovXG4gICAgZXNjYXBlKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5nZXRUeXBlKCkgIT09IFwicGdzcWxcIikgcmV0dXJuIHN1cGVyLmVzY2FwZSh2YWx1ZSlcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZVxuICAgICAgY29uc3QgZXNjYXBlZCA9IHBnRXNjYXBlTGl0ZXJhbCh0aGlzLl9jb252ZXJ0VmFsdWUodmFsdWUpKVxuICAgICAgcmV0dXJuIGVzY2FwZWQuc2xpY2UoMSwgLTEpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVvdGVzIGEgbG9jYWwgU1FMIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gU1FMIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXJ9IC0gUXVvdGVkIHZhbHVlLlxuICAgICAqL1xuICAgIHF1b3RlKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5nZXRUeXBlKCkgIT09IFwicGdzcWxcIikgcmV0dXJuIHN1cGVyLnF1b3RlKHZhbHVlKVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlXG4gICAgICByZXR1cm4gcGdFc2NhcGVMaXRlcmFsKHRoaXMuX2NvbnZlcnRWYWx1ZSh2YWx1ZSkpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyZWFtcyBicm9rZXJlZCByb3dzIHRocm91Z2ggdGhlIGRyaXZlcidzIGJ1ZmZlcmVkIGZhbGxiYWNrLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RhdGVtZW50LlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9uc30gW29wdGlvbnNdIC0gUXVlcnkgb3B0aW9ucy5cbiAgICAgKiBAeWllbGRzIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzdWx0IHJvd3MuXG4gICAgICovXG4gICAgYXN5bmMgKnF1ZXJ5U3RyZWFtKHNxbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5xdWVyeShzcWwsIG9wdGlvbnMpXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB5aWVsZCByb3dcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBLZWVwcyBzdHJ1Y3R1cmUgU1FMIG9uIG5vcm1hbCBicm9rZXJlZCBzdGF0ZW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIEFsd2F5cyBmYWxzZS5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjU3RydWN0dXJlU2NyaXB0KCkgeyByZXR1cm4gZmFsc2UgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTaGFyZWRUcmFuc2FjdGlvblByb3h5RHJpdmVyKClcbn1cbiJdfQ==
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLXByb3h5LWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3NoYXJlZC10cmFuc2FjdGlvbi1wcm94eS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0tBQStLO0FBRS9LLFlBQVk7QUFFWixPQUFPLDZCQUE2QixNQUFNLHVDQUF1QyxDQUFBO0FBQ2pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRXBELE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLDBDQUEwQyxDQUFBO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLGdDQUFnQyxDQUFBO0FBRXhFLGtFQUFrRTtBQUNsRSxNQUFNLHFCQUFxQixHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQTtBQUVyRDs7O0dBR0c7QUFDSCxTQUFTLG1DQUFtQztJQUMxQyxNQUFNLGdCQUFnQixHQUFHLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ3pELElBQUksZ0JBQWdCO1FBQUUsT0FBTyxnQkFBZ0IsQ0FBQTtJQUM3QyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsS0FBSyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFDbkUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO0lBQzdELElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFDakMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0FBQzFFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsb0NBQW9DLENBQUMsTUFBTSxFQUFFLFFBQVE7SUFDbkUsT0FBTyxxQkFBcUIs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O1FBRUQ7OztXQUdHO1FBQ0gsS0FBSyxDQUFDLG1CQUFtQixLQUFLLE9BQU8sS0FBSyxDQUFBLENBQUMsQ0FBQztLQUM3QztJQUVELE9BQU8sSUFBSSw0QkFBNEIsRUFBRSxDQUFBO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQHR5cGVkZWYge3thZGRyZXNzPzogc3RyaW5nLCBhbGxvd0R5bmFtaWNJZGVudGl0aWVzPzogYm9vbGVhbiwgY2FwYWJpbGl0eT86IHN0cmluZywgZGF0YWJhc2VJZGVudGlmaWVycz86IHN0cmluZ1tdLCBleHBlY3RlZDogYm9vbGVhbn19IFNoYXJlZFRyYW5zYWN0aW9uQnJva2VySm9iQ29uZmlnICovXG5cbi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJDbGllbnQgZnJvbSBcIi4vc2hhcmVkLXRyYW5zYWN0aW9uLWJyb2tlci1jbGllbnQuanNcIlxuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwibm9kZTphc3luY19ob29rc1wiXG5cbmV4cG9ydCBjb25zdCBTSEFSRURfVFJBTlNBQ1RJT05fQlJPS0VSX0VOViA9IFwiVkVMT0NJT1VTX1RFU1RfU0hBUkVEX1RSQU5TQUNUSU9OX0JST0tFUlwiXG5leHBvcnQgY29uc3QgQkFDS0dST1VORF9KT0JfQ0hJTERfRU5WID0gXCJWRUxPQ0lPVVNfQkFDS0dST1VORF9KT0JfQ0hJTERcIlxuXG4vKiogQHR5cGUge0FzeW5jTG9jYWxTdG9yYWdlPFNoYXJlZFRyYW5zYWN0aW9uQnJva2VySm9iQ29uZmlnPn0gKi9cbmNvbnN0IHBvb2xlZEpvYkJyb2tlckNvbmZpZyA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZSgpXG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWN0aXZlIGxpdmUgYnJva2VyIGNvbmZpZ3VyYXRpb24gd2l0aG91dCB2YWxpZGF0aW5nIG9uZSBkYXRhYmFzZSByb3V0ZS5cbiAqIEByZXR1cm5zIHtTaGFyZWRUcmFuc2FjdGlvbkJyb2tlckpvYkNvbmZpZyB8IHVuZGVmaW5lZH0gLSBBY3RpdmUgbGl2ZSBvciBjaGlsZCBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBhY3RpdmVTaGFyZWRUcmFuc2FjdGlvbkJyb2tlckNvbmZpZygpIHtcbiAgY29uc3QgY29udGV4dHVhbENvbmZpZyA9IHBvb2xlZEpvYkJyb2tlckNvbmZpZy5nZXRTdG9yZSgpXG4gIGlmIChjb250ZXh0dWFsQ29uZmlnKSByZXR1cm4gY29udGV4dHVhbENvbmZpZ1xuICBpZiAocHJvY2Vzcy5lbnZbQkFDS0dST1VORF9KT0JfQ0hJTERfRU5WXSAhPT0gXCIxXCIpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3Qgc2VyaWFsaXplZCA9IHByb2Nlc3MuZW52W1NIQVJFRF9UUkFOU0FDVElPTl9CUk9LRVJfRU5WXVxuICBpZiAoIXNlcmlhbGl6ZWQpIHJldHVybiB1bmRlZmluZWRcbiAgcmV0dXJuIEpTT04ucGFyc2UoQnVmZmVyLmZyb20oc2VyaWFsaXplZCwgXCJiYXNlNjR1cmxcIikudG9TdHJpbmcoXCJ1dGY4XCIpKVxufVxuXG4vKipcbiAqIFJ1bnMgb25lIHBvb2xlZCBqb2Igd2l0aCBkaXNwYXRjaC10aW1lIGJyb2tlciBjb25maWd1cmF0aW9uLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJKb2JDb25maWd9IGNvbmZpZyAtIFBlci1qb2IgYnJva2VyIG1vZGUgYW5kIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHsoKSA9PiBUfSBjYWxsYmFjayAtIEpvYiBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHtUfSAtIENhbGxiYWNrIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTaGFyZWRUcmFuc2FjdGlvbkJyb2tlckNvbmZpZyhjb25maWcsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBwb29sZWRKb2JCcm9rZXJDb25maWcucnVuKGNvbmZpZywgY2FsbGJhY2spXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgbGl2ZSBqb2luIHNlbGVjdHMgb25lIGV4YWN0IHNlc3Npb24gY2FwYWJpbGl0eS5cbiAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgY2FwYWJpbGl0eTogc3RyaW5nfX0gaWRlbnRpdHkgLSBTZXNzaW9uIGNvbnRyb2wtbWVzc2FnZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhpcyBhc3luYyBjb250ZXh0IGJlbG9uZ3MgdG8gdGhhdCBzZXNzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJDb250ZXh0TWF0Y2hlcyhpZGVudGl0eSkge1xuICBjb25zdCBjb25maWcgPSBwb29sZWRKb2JCcm9rZXJDb25maWcuZ2V0U3RvcmUoKVxuICByZXR1cm4gY29uZmlnPy5leHBlY3RlZCA9PT0gdHJ1ZSAmJiBjb25maWcuYWRkcmVzcyA9PT0gaWRlbnRpdHkuYWRkcmVzcyAmJiBjb25maWcuY2FwYWJpbGl0eSA9PT0gaWRlbnRpdHkuY2FwYWJpbGl0eVxufVxuXG4vKipcbiAqIFByZXNlcnZlcyBsZWdhY3kgcmVhbCB0ZW5hbnQgY29ubmVjdGlvbnMgb21pdHRlZCBieSBhdXRvbWF0aWMgVGVzdFJ1bm5lciBtb2RlLlxuICogRXhwbGljaXQgZHluYW1pYyBzZXNzaW9ucyBuZXZlciBwZXJtaXQgdGhpcyBmYWxsYmFjay5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkZW50aWZpZXIgLSBMb2dpY2FsIGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGFuIG9taXR0ZWQgYXV0b21hdGljIHJvdXRlIHN0YXlzIGluZGVwZW5kZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXV0b21hdGljU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJPbWl0cyhkYXRhYmFzZUlkZW50aWZpZXIpIHtcbiAgY29uc3QgY29uZmlnID0gYWN0aXZlU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJDb25maWcoKVxuICByZXR1cm4gQm9vbGVhbihcbiAgICBjb25maWc/LmV4cGVjdGVkID09PSB0cnVlICYmXG4gICAgIWNvbmZpZy5hbGxvd0R5bmFtaWNJZGVudGl0aWVzICYmXG4gICAgdHlwZW9mIGNvbmZpZy5hZGRyZXNzID09PSBcInN0cmluZ1wiICYmXG4gICAgdHlwZW9mIGNvbmZpZy5jYXBhYmlsaXR5ID09PSBcInN0cmluZ1wiICYmXG4gICAgQXJyYXkuaXNBcnJheShjb25maWcuZGF0YWJhc2VJZGVudGlmaWVycykgJiZcbiAgICAhY29uZmlnLmRhdGFiYXNlSWRlbnRpZmllcnMuaW5jbHVkZXMoZGF0YWJhc2VJZGVudGlmaWVyKVxuICApXG59XG5cbi8qKlxuICogRXNjYXBlcyBhIFBvc3RncmVTUUwgbGl0ZXJhbCB3aXRob3V0IHJlcXVpcmluZyBhIGxpdmUgY2hpbGQgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gUG9zdGdyZVNRTCBsaXRlcmFsIHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBRdW90ZWQgbGl0ZXJhbC5cbiAqL1xuZnVuY3Rpb24gcGdFc2NhcGVMaXRlcmFsKHZhbHVlKSB7XG4gIGNvbnN0IHN0cmluZyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKVxuICBsZXQgZXNjYXBlZCA9IFwiJ1wiXG4gIGxldCBoYXNCYWNrc2xhc2ggPSBmYWxzZVxuXG4gIGZvciAoY29uc3QgY2hhcmFjdGVyIG9mIHN0cmluZykge1xuICAgIGlmIChjaGFyYWN0ZXIgPT09IFwiJ1wiKSBlc2NhcGVkICs9IGNoYXJhY3RlclxuICAgIGlmIChjaGFyYWN0ZXIgPT09IFwiXFxcXFwiKSB7XG4gICAgICBlc2NhcGVkICs9IGNoYXJhY3RlclxuICAgICAgaGFzQmFja3NsYXNoID0gdHJ1ZVxuICAgIH1cbiAgICBlc2NhcGVkICs9IGNoYXJhY3RlclxuICB9XG5cbiAgZXNjYXBlZCArPSBcIidcIlxuICByZXR1cm4gaGFzQmFja3NsYXNoID8gYCBFJHtlc2NhcGVkfWAgOiBlc2NhcGVkXG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSB0ZXN0LXJ1bm5lci1vd25lZCBjaGlsZCB0cmFuc3BvcnQgY29uZmlndXJhdGlvbiB3aGVuIHRoaXMgbG9naWNhbFxuICogZGF0YWJhc2UgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIGFjdGl2ZSBhdHRlbXB0LlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRlbnRpZmllciAtIExvZ2ljYWwgZGF0YWJhc2UgaWRlbnRpZmllci5cbiAqIEByZXR1cm5zIHt7YWRkcmVzczogc3RyaW5nLCBhbGxvd0R5bmFtaWNJZGVudGl0aWVzPzogYm9vbGVhbiwgY2FwYWJpbGl0eTogc3RyaW5nfSB8IHVuZGVmaW5lZH0gLSBCcm9rZXIgY29vcmRpbmF0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWRUcmFuc2FjdGlvbkJyb2tlckNvbmZpZyhkYXRhYmFzZUlkZW50aWZpZXIpIHtcbiAgY29uc3QgY29uZmlnID0gYWN0aXZlU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJDb25maWcoKVxuICBpZiAoIWNvbmZpZykgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gdmFsaWRhdGVkQnJva2VyQ29uZmlnKGNvbmZpZywgZGF0YWJhc2VJZGVudGlmaWVyKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBkaXNwYXRjaC10aW1lIGJyb2tlciBjb25maWd1cmF0aW9uIGFuZCBmYWlscyBjbG9zZWQgd2hlbiBleHBlY3RlZC5cbiAqIEBwYXJhbSB7U2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJKb2JDb25maWd9IGNvbmZpZyAtIENhbmRpZGF0ZSBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRlbnRpZmllciAtIExvZ2ljYWwgZGF0YWJhc2UgaWRlbnRpZmllci5cbiAqIEByZXR1cm5zIHt7YWRkcmVzczogc3RyaW5nLCBhbGxvd0R5bmFtaWNJZGVudGl0aWVzPzogYm9vbGVhbiwgY2FwYWJpbGl0eTogc3RyaW5nfSB8IHVuZGVmaW5lZH0gLSBCcm9rZXIgY29vcmRpbmF0ZXMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlZEJyb2tlckNvbmZpZyhjb25maWcsIGRhdGFiYXNlSWRlbnRpZmllcikge1xuICBpZiAoY29uZmlnLmV4cGVjdGVkICYmICghY29uZmlnLmFkZHJlc3MgfHwgIWNvbmZpZy5jYXBhYmlsaXR5IHx8ICFjb25maWcuZGF0YWJhc2VJZGVudGlmaWVycykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmFuc2FjdGlvbmFsIHBvb2xlZCBqb2IgZXhwZWN0ZWQgc2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjb29yZGluYXRlc1wiKVxuICB9XG4gIGlmICghY29uZmlnLmV4cGVjdGVkKSByZXR1cm4gdW5kZWZpbmVkXG4gIGlmICh0eXBlb2YgY29uZmlnLmFkZHJlc3MgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGNvbmZpZy5jYXBhYmlsaXR5ICE9PSBcInN0cmluZ1wiIHx8ICFBcnJheS5pc0FycmF5KGNvbmZpZy5kYXRhYmFzZUlkZW50aWZpZXJzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjaGlsZCBjb25maWd1cmF0aW9uXCIpXG4gIH1cbiAgaWYgKCFjb25maWcuYWxsb3dEeW5hbWljSWRlbnRpdGllcyAmJiAhY29uZmlnLmRhdGFiYXNlSWRlbnRpZmllcnMuaW5jbHVkZXMoZGF0YWJhc2VJZGVudGlmaWVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb25hbCBwb29sZWQgam9iIGV4cGVjdGVkIGJyb2tlciBkYXRhYmFzZSBpZGVudGlmaWVyOiAke2RhdGFiYXNlSWRlbnRpZmllcn1gKVxuICB9XG5cbiAgaWYgKGNvbmZpZy5hbGxvd0R5bmFtaWNJZGVudGl0aWVzKSB7XG4gICAgcmV0dXJuIHthZGRyZXNzOiBjb25maWcuYWRkcmVzcywgYWxsb3dEeW5hbWljSWRlbnRpdGllczogdHJ1ZSwgY2FwYWJpbGl0eTogY29uZmlnLmNhcGFiaWxpdHl9XG4gIH1cbiAgcmV0dXJuIHthZGRyZXNzOiBjb25maWcuYWRkcmVzcywgY2FwYWJpbGl0eTogY29uZmlnLmNhcGFiaWxpdHl9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbmNyZXRlLWRyaXZlciBzdWJjbGFzcyB0aGF0IHJldGFpbnMgYWxsIGxvY2FsIFNRTC9xdWVyeS9tb2RlbFxuICogYnVpbGRlcnMgd2hpbGUgZm9yd2FyZGluZyBvbmx5IHBoeXNpY2FsIGNvbm5lY3Rpb24gYWN0aW9ucyB0byB0aGUgcGFyZW50LlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IERyaXZlckNsYXNzIC0gQ29uZmlndXJlZCBjb25jcmV0ZSBkcml2ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gY29uZmlnIC0gRGF0YWJhc2UgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ2hpbGQgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkZW50aWZpZXIgLSBMb2dpY2FsIGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3thZGRyZXNzOiBzdHJpbmcsIGNhcGFiaWxpdHk6IHN0cmluZywgcmV1c2VLZXk/OiBzdHJpbmd9fSBicm9rZXJDb25maWcgLSBCcm9rZXIgY29vcmRpbmF0ZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IC0gVW5jb25uZWN0ZWQgcGh5c2ljYWwgcHJveHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaGFyZWRUcmFuc2FjdGlvblByb3h5RHJpdmVyKERyaXZlckNsYXNzLCBjb25maWcsIGNvbmZpZ3VyYXRpb24sIGRhdGFiYXNlSWRlbnRpZmllciwgYnJva2VyQ29uZmlnKSB7XG4gIGNsYXNzIFNoYXJlZFRyYW5zYWN0aW9uUHJveHlEcml2ZXIgZXh0ZW5kcyBEcml2ZXJDbGFzcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBzdXBlcihjb25maWcsIGNvbmZpZ3VyYXRpb24pXG4gICAgICB0aGlzLnNoYXJlZFRyYW5zYWN0aW9uQ2xpZW50ID0gbmV3IFNoYXJlZFRyYW5zYWN0aW9uQnJva2VyQ2xpZW50KHsuLi5icm9rZXJDb25maWcsIGRhdGFiYXNlSWRlbnRpZmllcn0pXG4gICAgICAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIHRoaXMuc2hhcmVkVHJhbnNhY3Rpb25Sb290U2F2ZVBvaW50ID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29ubmVjdHMgdGhlIHByb3h5IHRyYW5zcG9ydC5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbm5lY3RlZC5cbiAgICAgKi9cbiAgICBhc3luYyBjb25uZWN0KCkgeyBhd2FpdCB0aGlzLnNoYXJlZFRyYW5zYWN0aW9uQ2xpZW50LmNvbm5lY3RlZCgpIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgb25seSB0aGUgcHJveHkgdHJhbnNwb3J0LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xvc2VkLlxuICAgICAqL1xuICAgIGFzeW5jIF9jbG9zZSgpIHsgYXdhaXQgdGhpcy5zaGFyZWRUcmFuc2FjdGlvbkNsaWVudC5jbG9zZSgpIH1cbiAgICAvKipcbiAgICAgKiBLZWVwcyBhIGJyb2tlciBwcm94eSB0cmFuc3BvcnQgYWxpdmUgYWNyb3NzIGxvZ2ljYWwgTXlTUUwgY2hlY2tvdXRzLlxuICAgICAqIFBhcmVudCBUZXN0UnVubmVyIG93bnMgcGh5c2ljYWwgc2Vzc2lvbiBjbGVhbnVwIGFuZCByb2xsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aXRob3V0IGNsb3NpbmcgdGhlIHRyYW5zcG9ydC5cbiAgICAgKi9cbiAgICBhc3luYyBjbGVhbnVwU2Vzc2lvblN0YXRlQWZ0ZXJDaGVja291dCgpIHt9XG4gICAgLyoqXG4gICAgICogUm91dGVzIGEgcGh5c2ljYWwgcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIFNRTCBzdGF0ZW1lbnQuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gUm93cy5cbiAgICAgKi9cbiAgICBhc3luYyBfcXVlcnlBY3R1YWwoc3FsKSB7IHJldHVybiBhd2FpdCB0aGlzLnNoYXJlZFRyYW5zYWN0aW9uQ2xpZW50LmNhbGwoXCJfcXVlcnlBY3R1YWxcIiwgW3NxbF0pIH1cbiAgICAvKipcbiAgICAgKiBSb3V0ZXMgYW4gYWZmZWN0ZWQtcm93IHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RhdGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gQWZmZWN0ZWQgcm93cy5cbiAgICAgKi9cbiAgICBhc3luYyBfYWZmZWN0ZWRSb3dzQWN0dWFsKHNxbCkgeyByZXR1cm4gYXdhaXQgdGhpcy5zaGFyZWRUcmFuc2FjdGlvbkNsaWVudC5jYWxsKFwiX2FmZmVjdGVkUm93c0FjdHVhbFwiLCBbc3FsXSkgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIGEgY2hpbGQgdHJhbnNhY3Rpb24gYXMgYSBwYXJlbnQgc2F2ZXBvaW50LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gc3RhcnRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBfc3RhcnRUcmFuc2FjdGlvbkFjdGlvbigpIHtcbiAgICAgIHRoaXMuc2hhcmVkVHJhbnNhY3Rpb25Sb290U2F2ZVBvaW50ID0gdGhpcy5nZW5lcmF0ZVNhdmVQb2ludE5hbWUoKVxuICAgICAgYXdhaXQgdGhpcy5zaGFyZWRUcmFuc2FjdGlvbkNsaWVudC5jYWxsKFwicm9vdFRyYW5zYWN0aW9uU3RhcnRcIiwgW3RoaXMuc2hhcmVkVHJhbnNhY3Rpb25Sb290U2F2ZVBvaW50XSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyB0aGUgY2hpbGQgdHJhbnNhY3Rpb24gc2F2ZXBvaW50LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcmVsZWFzZWQuXG4gICAgICovXG4gICAgYXN5bmMgX2NvbW1pdFRyYW5zYWN0aW9uQWN0aW9uKCkge1xuICAgICAgaWYgKCF0aGlzLnNoYXJlZFRyYW5zYWN0aW9uUm9vdFNhdmVQb2ludCkgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIHByb3h5IGhhcyBubyByb290IHNhdmVwb2ludFwiKVxuICAgICAgYXdhaXQgdGhpcy5zaGFyZWRUcmFuc2FjdGlvbkNsaWVudC5jYWxsKFwicm9vdFRyYW5zYWN0aW9uUmVsZWFzZVwiLCBbdGhpcy5zaGFyZWRUcmFuc2FjdGlvblJvb3RTYXZlUG9pbnRdKVxuICAgICAgdGhpcy5zaGFyZWRUcmFuc2FjdGlvblJvb3RTYXZlUG9pbnQgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb2xscyBiYWNrIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiBzYXZlcG9pbnQuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiByb2xsZWQgYmFjay5cbiAgICAgKi9cbiAgICBhc3luYyBfcm9sbGJhY2tUcmFuc2FjdGlvbkFjdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5zaGFyZWRUcmFuc2FjdGlvblJvb3RTYXZlUG9pbnQpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBwcm94eSBoYXMgbm8gcm9vdCBzYXZlcG9pbnRcIilcbiAgICAgIGF3YWl0IHRoaXMuc2hhcmVkVHJhbnNhY3Rpb25DbGllbnQuY2FsbChcInJvb3RUcmFuc2FjdGlvblJvbGxiYWNrXCIsIFt0aGlzLnNoYXJlZFRyYW5zYWN0aW9uUm9vdFNhdmVQb2ludF0pXG4gICAgICB0aGlzLnNoYXJlZFRyYW5zYWN0aW9uUm9vdFNhdmVQb2ludCA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgYSBsb2NhbCBTUUwgdmFsdWUuXG4gICAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBTUUwgdmFsdWUuXG4gICAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIEVzY2FwZWQgdmFsdWUuXG4gICAgICovXG4gICAgZXNjYXBlKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5nZXRUeXBlKCkgIT09IFwicGdzcWxcIikgcmV0dXJuIHN1cGVyLmVzY2FwZSh2YWx1ZSlcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZVxuICAgICAgY29uc3QgZXNjYXBlZCA9IHBnRXNjYXBlTGl0ZXJhbCh0aGlzLl9jb252ZXJ0VmFsdWUodmFsdWUpKVxuICAgICAgcmV0dXJuIGVzY2FwZWQuc2xpY2UoMSwgLTEpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVvdGVzIGEgbG9jYWwgU1FMIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gU1FMIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXJ9IC0gUXVvdGVkIHZhbHVlLlxuICAgICAqL1xuICAgIHF1b3RlKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5nZXRUeXBlKCkgIT09IFwicGdzcWxcIikgcmV0dXJuIHN1cGVyLnF1b3RlKHZhbHVlKVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlXG4gICAgICByZXR1cm4gcGdFc2NhcGVMaXRlcmFsKHRoaXMuX2NvbnZlcnRWYWx1ZSh2YWx1ZSkpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyZWFtcyBicm9rZXJlZCByb3dzIHRocm91Z2ggdGhlIGRyaXZlcidzIGJ1ZmZlcmVkIGZhbGxiYWNrLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RhdGVtZW50LlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9uc30gW29wdGlvbnNdIC0gUXVlcnkgb3B0aW9ucy5cbiAgICAgKiBAeWllbGRzIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzdWx0IHJvd3MuXG4gICAgICovXG4gICAgYXN5bmMgKnF1ZXJ5U3RyZWFtKHNxbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5xdWVyeShzcWwsIG9wdGlvbnMpXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB5aWVsZCByb3dcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBLZWVwcyBzdHJ1Y3R1cmUgU1FMIG9uIG5vcm1hbCBicm9rZXJlZCBzdGF0ZW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIEFsd2F5cyBmYWxzZS5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjU3RydWN0dXJlU2NyaXB0KCkgeyByZXR1cm4gZmFsc2UgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTaGFyZWRUcmFuc2FjdGlvblByb3h5RHJpdmVyKClcbn1cbiJdfQ==
@@ -0,0 +1,129 @@
1
+ import SharedTransactionBroker from "./shared-transaction-broker.js";
2
+ export type Enrollment = {
3
+ connection: import("../database/drivers/base.js").default;
4
+ databaseIdentifier: string;
5
+ release: () => Promise<void>;
6
+ reuseKey: string;
7
+ };
8
+ /** @typedef {{connection: import("../database/drivers/base.js").default, databaseIdentifier: string, release: () => Promise<void>, reuseKey: string}} Enrollment */
9
+ /**
10
+ * Backend-owned, capability-scoped transaction set for long-lived test services.
11
+ * Join coordinates are intentionally obtainable only as a live control message.
12
+ */
13
+ export default class TestTransactionSession {
14
+ configuration: import("../configuration.js").default | undefined;
15
+ /** @type {SharedTransactionBroker | undefined} */
16
+ broker: SharedTransactionBroker | undefined;
17
+ /** @type {Map<string, Enrollment>} */
18
+ enrollments: Map<string, Enrollment>;
19
+ /** @type {Map<string, {pool: import("../database/pool/base.js").default, registration: import("../database/pool/base.js").TestSharedConnectionRegistration}>} */
20
+ sharedConnectionRegistrations: Map<string, {
21
+ pool: import("../database/pool/base.js").default;
22
+ registration: import("../database/pool/base.js").TestSharedConnectionRegistration;
23
+ }>;
24
+ /** @type {Promise<void> | undefined} */
25
+ cleanupPromise: Promise<void> | undefined;
26
+ /** @type {Promise<void> | undefined} */
27
+ rollbackPromise: Promise<void> | undefined;
28
+ /**
29
+ * Creates an unstarted transaction session.
30
+ * @param {import("../configuration.js").default} [configuration] - Backend configuration owning enrolled pools.
31
+ */
32
+ constructor(configuration?: import("../configuration.js").default);
33
+ /**
34
+ * Begins a test transaction session.
35
+ * @param {{configuration?: import("../configuration.js").default}} [args] - Backend owner.
36
+ * @returns {Promise<TestTransactionSession>} - Begun session.
37
+ */
38
+ static begin({ configuration }?: {
39
+ configuration?: import("../configuration.js").default;
40
+ }): Promise<TestTransactionSession>;
41
+ /**
42
+ * Joins one request/job callback from a live backend control message.
43
+ * @template T
44
+ * @param {{address: string, capability: string}} message - Ephemeral coordinates received over live IPC.
45
+ * @param {() => T} callback - Backend request or worker work.
46
+ * @returns {T} - Callback result.
47
+ */
48
+ static join<T>(message: {
49
+ address: string;
50
+ capability: string;
51
+ }, callback: () => T): T;
52
+ /**
53
+ * Lazily adds an exact physical connection to the common rollback set.
54
+ * @param {Enrollment} enrollment - Checked-out physical connection and owner release hook.
55
+ */
56
+ enroll(enrollment: Enrollment): Promise<void>;
57
+ /**
58
+ * Lazily checks out and enrolls the physical database selected by a tenant descriptor.
59
+ * @param {{databaseIdentifier: string, tenant?: object}} args - Logical and tenant identity.
60
+ */
61
+ enrollDatabase({ databaseIdentifier, tenant }: {
62
+ databaseIdentifier: string;
63
+ tenant?: object;
64
+ }): Promise<void>;
65
+ /**
66
+ * Makes in-process request/Scoundrel checkouts resolve by current physical identity.
67
+ * @param {string} databaseIdentifier - Logical database identifier.
68
+ * @param {import("../database/pool/base.js").default} pool - Owning pool.
69
+ */
70
+ installSharedConnectionProvider(databaseIdentifier: string, pool: import("../database/pool/base.js").default): void;
71
+ /**
72
+ * Returns ephemeral coordinates for one live IPC/control message.
73
+ * @returns {{address: string, capability: string}} - Non-durable join coordinates.
74
+ */
75
+ joinMessage(): {
76
+ address: string;
77
+ capability: string;
78
+ };
79
+ /** Stops admission to the capability. */
80
+ revoke(): void;
81
+ /** Drains work accepted before revocation. */
82
+ drain(): Promise<void>;
83
+ /**
84
+ * Rolls back and releases the complete enrolled set after admission stops.
85
+ * @returns {Promise<void>} - Resolves after rollback and release.
86
+ */
87
+ rollback(): Promise<void>;
88
+ /**
89
+ * Performs rollback and release once.
90
+ * @returns {Promise<void>} - Resolves after actual rollback and release.
91
+ */
92
+ rollbackActual(): Promise<void>;
93
+ /**
94
+ * Revokes, drains, rolls back, and releases every enrolled physical connection exactly once.
95
+ * @returns {Promise<void>} - Resolves after idempotent cleanup.
96
+ */
97
+ cleanup(): Promise<void>;
98
+ /**
99
+ * Performs idempotent cleanup once.
100
+ * @returns {Promise<void>} - Resolves after actual cleanup.
101
+ */
102
+ cleanupActual(): Promise<void>;
103
+ /**
104
+ * Returns capability-free session diagnostics.
105
+ * @returns {{accepting: boolean, enrollmentCount: number}} - Capability-free diagnostics.
106
+ */
107
+ debugSnapshot(): {
108
+ accepting: boolean;
109
+ enrollmentCount: number;
110
+ };
111
+ /**
112
+ * Returns the begun broker.
113
+ * @returns {SharedTransactionBroker} - Begun broker.
114
+ */
115
+ requiredBroker(): SharedTransactionBroker;
116
+ /**
117
+ * Rolls back and releases one owned physical connection.
118
+ * @param {Enrollment} enrollment - Owned physical connection.
119
+ * @returns {Promise<void>} - Resolves after rollback and release.
120
+ */
121
+ rollbackAndRelease(enrollment: Enrollment): Promise<void>;
122
+ /**
123
+ * Normalizes a thrown cleanup value.
124
+ * @param {unknown} error - Opaque thrown cleanup value narrowed at this boundary.
125
+ * @returns {Error} - Error instance.
126
+ */
127
+ normalizeError(error: unknown): Error;
128
+ }
129
+ //# sourceMappingURL=test-transaction-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-transaction-session.d.ts","sourceRoot":"","sources":["../../../src/testing/test-transaction-session.js"],"names":[],"mappings":"AAEA,OAAO,uBAAuB,MAAM,gCAAgC,CAAA;AAGhE,YAAmJ,UAAU,GAAnJ;IAAC,UAAU,EAAE,OAAO,6BAA6B,EAAE,OAAO,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAAY;AAAjK,oKAAoK;AAEpK;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAsB;IAMlC,aAAa;IAClB,kDAAkD;IAC7C,MAAM,EADA,uBAAuB,GAAG,SAAS;IAE9C,sCAAsC;IACjC,WAAW,EADL,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAElC,iKAAiK;IAC5J,6BAA6B,EADvB,GAAG,CAAC,MAAM,EAAE;QAAC,IAAI,EAAE,OAAO,0BAA0B,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,0BAA0B,EAAE,gCAAgC,CAAA;KAAC,CAAC;IAE7J,wCAAwC;IACnC,cAAc,EADR,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS;IAEpC,wCAAwC;IACnC,eAAe,EADT,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS;IAdtC;;;OAGG;IACH,YAAY,aAAa,AAFtB,CACF,EADU,OAAO,qBAAqB,EAAE,OAEhB,EAYxB;IAED;;;;OAIG;IACH,OAAa,KAAK,CAAC,EAAC,aAAa,EAAC,AAH/B,CACA,EADQ;QAAC,aAAa,CAAC,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;KAG1B,GAF1B,OAAO,CAAC,sBAAsB,CAAC,CAM3C;IAED;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,CALE,CAAC,EAKF,OAAO,EAJR;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAI5B,EAAE,QAAQ,EAHlB,MAAM,CAGY,GAFhB,CAAC,CAIb;IAED;;;OAGG;IACG,MAAM,CAAC,UAAU,EAFZ,UAEY,iBAkCtB;IAED;;;OAGG;IACG,cAAc,CAAC,EAAC,kBAAkB,EAAE,MAAM,EAAC,EAFtC;QAAC,kBAAkB,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAEN,iBAiBhD;IAED;;;;OAIG;IACH,+BAA+B,CAAC,kBAAkB,EAHvC,MAGuC,EAAE,IAAI,EAF7C,OAAO,0BAA0B,EAAE,OAEU,QAevD;IAED;;;OAGG;IACH,WAAW,IAFE;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAMjD;IAED,yCAAyC;IACzC,MAAM,SAAqC;IAE3C,8CAA8C;IACxC,KAAK,kBAA0C;IAErD;;;OAGG;IACG,QAAQ,IAFD,OAAO,CAAC,IAAI,CAAC,CAMzB;IAED;;;OAGG;IACG,cAAc,IAFP,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;OAGG;IACG,OAAO,IAFA,OAAO,CAAC,IAAI,CAAC,CAMzB;IAED;;;OAGG;IACG,aAAa,IAFN,OAAO,CAAC,IAAI,CAAC,CAKzB;IAED;;;OAGG;IACH,aAAa,IAFA;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAC,CAIzD;IAED;;;OAGG;IACH,cAAc,IAFD,uBAAuB,CAKnC;IAED;;;;OAIG;IACG,kBAAkB,CAAC,UAAU,EAHxB,UAGwB,GAFtB,OAAO,CAAC,IAAI,CAAC,CAQzB;IAED;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAHT,OAGS,GAFP,KAAK,CAEwE;CAC3F"}