velocious 1.0.620 → 1.0.621

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.
@@ -1,9 +1,11 @@
1
+ export type CoordinatorOwnerScope = {
2
+ ownedQueue: Promise<void>;
3
+ };
1
4
  export type CoordinatorRegistration = {
5
+ connectionScope: CoordinatorOwnerScope;
2
6
  coordinator: (callback: () => Promise<unknown>) => Promise<unknown>;
3
- ownedQueue: Promise<void>;
4
7
  owner: symbol;
5
- reentrantOwners: Set<symbol>;
6
- rootOwners: Set<symbol>;
8
+ ownerScopes: Map<symbol, CoordinatorOwnerScope>;
7
9
  };
8
10
  /**
9
11
  * Registers test-only serialization owned by the active broker.
@@ -1 +1 @@
1
- {"version":3,"file":"shared-transaction-connection-coordinator.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-connection-coordinator.js"],"names":[],"mappings":"AAEI,YAAkL,uBAAuB,GAA/L;IAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAC,CAAyB;AAkF7M;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAJ/C,MAI+C,EAAE,WAAW,EAH5D,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAGO,GAF1D,MAAM,CAgBlB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,UAAU,EAJjD,MAIiD,EAAE,WAAW,EAH9D,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAGS,GAF5D,IAAI,CAShB;AAED;;;;;;;GAOG;AACH,wBAAsB,qCAAqC,CAN9C,CAAC,EAM8C,UAAU,EAL3D,OAAO,6BAA6B,EAAE,OAKqB,EAAE,QAAQ,EAJrE,MAAM,OAAO,CAAC,CAAC,CAIsD,EAAE,cAAc,AAH7F,CACA,EADQ,MAGqF,GAFnF,OAAO,CAAC,CAAC,CAAC,CAuBtB"}
1
+ {"version":3,"file":"shared-transaction-connection-coordinator.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-connection-coordinator.js"],"names":[],"mappings":"AAEI,YAAuC,qBAAqB,GAAlD;IAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAC,CAAuB;AAC5D,YAAyL,uBAAuB,GAAtM;IAAC,eAAe,EAAE,qBAAqB,CAAC;IAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAA;CAAC,CAAyB;AAkFpN;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAJ/C,MAI+C,EAAE,WAAW,EAH5D,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAGO,GAF1D,MAAM,CAqBlB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,UAAU,EAJjD,MAIiD,EAAE,WAAW,EAH9D,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAGS,GAF5D,IAAI,CAShB;AAED;;;;;;;GAOG;AACH,wBAAsB,qCAAqC,CAN9C,CAAC,EAM8C,UAAU,EAL3D,OAAO,6BAA6B,EAAE,OAKqB,EAAE,QAAQ,EAJrE,MAAM,OAAO,CAAC,CAAC,CAIsD,EAAE,cAAc,AAH7F,CACA,EADQ,MAGqF,GAFnF,OAAO,CAAC,CAAC,CAAC,CAyBtB"}
@@ -1,5 +1,6 @@
1
1
  // @ts-check
2
- /** @typedef {{coordinator: (callback: () => Promise<unknown>) => Promise<unknown>, ownedQueue: Promise<void>, owner: symbol, reentrantOwners: Set<symbol>, rootOwners: Set<symbol>}} CoordinatorRegistration */
2
+ /** @typedef {{ownedQueue: Promise<void>}} CoordinatorOwnerScope */
3
+ /** @typedef {{connectionScope: CoordinatorOwnerScope, coordinator: (callback: () => Promise<unknown>) => Promise<unknown>, owner: symbol, ownerScopes: Map<symbol, CoordinatorOwnerScope>}} CoordinatorRegistration */
3
4
  /** @type {WeakMap<object, CoordinatorRegistration>} */
4
5
  const coordinators = new WeakMap();
5
6
  /** @type {WeakMap<object, CoordinatorRegistration>} */
@@ -17,40 +18,44 @@ async function inactiveCoordinator(callback) {
17
18
  * @template T
18
19
  * @param {import("../database/drivers/base.js").default} connection - Parent physical connection.
19
20
  * @param {CoordinatorRegistration} registration - Physical connection registration.
21
+ * @param {CoordinatorOwnerScope} ownerScope - Queue inherited from the current owner.
20
22
  * @param {() => Promise<T>} callback - Owned operation.
23
+ * @param {string} [ownerDescription] - Async owner description.
21
24
  * @returns {Promise<T>} - Operation result.
22
25
  */
23
- async function coordinateOwnedSharedTransactionConnection(connection, registration, callback) {
24
- const previous = registration.ownedQueue;
26
+ async function coordinateOwnedSharedTransactionConnection(connection, registration, ownerScope, callback, ownerDescription = "shared-transaction-owned-operation") {
27
+ const previous = ownerScope.ownedQueue;
25
28
  /**
26
29
  * Releases the next owned sibling operation.
27
30
  * @type {() => void}
28
31
  */
29
32
  let release = () => { };
30
- registration.ownedQueue = new Promise((resolve) => { release = resolve; });
33
+ ownerScope.ownedQueue = new Promise((resolve) => { release = resolve; });
31
34
  await previous;
32
- const operationOwner = Symbol("shared-transaction-owned-operation");
35
+ const operationOwner = Symbol(ownerDescription);
33
36
  const environmentHandler = connection.configuration.getEnvironmentHandler();
34
- registration.reentrantOwners.add(operationOwner);
37
+ const operationScope = { ownedQueue: Promise.resolve() };
38
+ registration.ownerScopes.set(operationOwner, operationScope);
35
39
  try {
36
40
  return await environmentHandler.runWithSharedTransactionCoordinatorOwner(connection, operationOwner, callback);
37
41
  }
38
42
  finally {
39
- registration.reentrantOwners.delete(operationOwner);
43
+ await drainOwnedSharedTransactionConnections(operationScope);
44
+ registration.ownerScopes.delete(operationOwner);
40
45
  release();
41
46
  }
42
47
  }
43
48
  /**
44
49
  * Drains all inherited operations admitted before the root owner is revoked.
45
- * @param {CoordinatorRegistration} registration - Physical connection registration.
50
+ * @param {CoordinatorOwnerScope} ownerScope - Owner scope to drain.
46
51
  * @returns {Promise<void>} - Resolves when the owned queue stops advancing.
47
52
  */
48
- async function drainOwnedSharedTransactionConnections(registration) {
53
+ async function drainOwnedSharedTransactionConnections(ownerScope) {
49
54
  let tail;
50
55
  do {
51
- tail = registration.ownedQueue;
56
+ tail = ownerScope.ownedQueue;
52
57
  await tail;
53
- } while (tail !== registration.ownedQueue);
58
+ } while (tail !== ownerScope.ownedQueue);
54
59
  }
55
60
  /**
56
61
  * Runs one broker-serialized root while tracking and draining its inherited work.
@@ -61,17 +66,7 @@ async function drainOwnedSharedTransactionConnections(registration) {
61
66
  * @returns {Promise<T>} - Operation result.
62
67
  */
63
68
  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
- }
69
+ return await coordinateOwnedSharedTransactionConnection(connection, registration, registration.connectionScope, callback, "shared-transaction-root-operation");
75
70
  }
76
71
  /**
77
72
  * Registers test-only serialization owned by the active broker.
@@ -87,7 +82,12 @@ export function setSharedTransactionCoordinator(connection, coordinator) {
87
82
  registration.owner = owner;
88
83
  }
89
84
  else {
90
- registration = { coordinator, ownedQueue: Promise.resolve(), owner, reentrantOwners: new Set(), rootOwners: new Set() };
85
+ registration = {
86
+ connectionScope: { ownedQueue: Promise.resolve() },
87
+ coordinator,
88
+ owner,
89
+ ownerScopes: new Map()
90
+ };
91
91
  connectionRegistrations.set(connection, registration);
92
92
  }
93
93
  coordinators.set(connection, registration);
@@ -121,13 +121,13 @@ export async function coordinateSharedTransactionConnection(connection, callback
121
121
  return await callback();
122
122
  const environmentHandler = connection.configuration.getEnvironmentHandler();
123
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);
124
+ const currentOwnerScope = currentOwner ? registration.ownerScopes.get(currentOwner) : undefined;
125
+ if (currentOwnerScope) {
126
+ return await coordinateOwnedSharedTransactionConnection(connection, registration, currentOwnerScope, callback);
127
+ }
128
+ if (!activeRegistration) {
129
+ return await coordinateOwnedSharedTransactionConnection(connection, registration, registration.connectionScope, callback);
128
130
  }
129
- if (!activeRegistration)
130
- return await coordinateOwnedSharedTransactionConnection(connection, registration, callback);
131
131
  if (operationOwner === registration.owner) {
132
132
  return await coordinateRootSharedTransactionConnection(connection, registration, callback);
133
133
  }
@@ -135,4 +135,4 @@ export async function coordinateSharedTransactionConnection(connection, callback
135
135
  return await coordinateRootSharedTransactionConnection(connection, registration, callback);
136
136
  }));
137
137
  }
138
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLWNvbm5lY3Rpb24tY29vcmRpbmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9zaGFyZWQtdHJhbnNhY3Rpb24tY29ubmVjdGlvbi1jb29yZGluYXRvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosZ05BQWdOO0FBRWhOLHVEQUF1RDtBQUN2RCxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBQ2xDLHVEQUF1RDtBQUN2RCxNQUFNLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFN0M7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxRQUFRO0lBQ3pDLE9BQU8sTUFBTSxRQUFRLEVBQUUsQ0FBQTtBQUN6QixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILEtBQUssVUFBVSwwQ0FBMEMsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFFBQVE7SUFDMUYsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQTtJQUN4Qzs7O09BR0c7SUFDSCxJQUFJLE9BQU8sR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUE7SUFFdEIsWUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3pFLE1BQU0sUUFBUSxDQUFBO0lBQ2QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLG9DQUFvQyxDQUFDLENBQUE7SUFDbkUsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUE7SUFFM0UsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUE7SUFDaEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLGtCQUFrQixDQUFD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ZGluYXRvcjogKGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHVua25vd24+KSA9PiBQcm9taXNlPHVua25vd24+LCBvd25lZFF1ZXVlOiBQcm9taXNlPHZvaWQ+LCBvd25lcjogc3ltYm9sLCByZWVudHJhbnRPd25lcnM6IFNldDxzeW1ib2w+LCByb290T3duZXJzOiBTZXQ8c3ltYm9sPn19IENvb3JkaW5hdG9yUmVnaXN0cmF0aW9uICovXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIENvb3JkaW5hdG9yUmVnaXN0cmF0aW9uPn0gKi9cbmNvbnN0IGNvb3JkaW5hdG9ycyA9IG5ldyBXZWFrTWFwKClcbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIENvb3JkaW5hdG9yUmVnaXN0cmF0aW9uPn0gKi9cbmNvbnN0IGNvbm5lY3Rpb25SZWdpc3RyYXRpb25zID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIFJ1bnMgd29yayBkaXJlY3RseSB3aGVuIG9ubHkgdGhlIGNvbm5lY3Rpb24tbG9jYWwgcXVldWUgcmVtYWlucyByZWdpc3RlcmVkLlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHVua25vd24+fSBjYWxsYmFjayAtIFNlcmlhbGl6ZWQgb3BlcmF0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59IC0gT3BlcmF0aW9uIHJlc3VsdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5hY3RpdmVDb29yZGluYXRvcihjYWxsYmFjaykge1xuICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgc2libGluZyB3b3JrIHRoYXQgaW5oZXJpdGVkIG9uZSBjb29yZGluYXRvciBvd25lciB3aXRob3V0IHJlLWVudGVyaW5nIHRoZSBicm9rZXIgcXVldWUuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIFBhcmVudCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICogQHBhcmFtIHtDb29yZGluYXRvclJlZ2lzdHJhdGlvbn0gcmVnaXN0cmF0aW9uIC0gUGh5c2ljYWwgY29ubmVjdGlvbiByZWdpc3RyYXRpb24uXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gT3duZWQgb3BlcmF0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8VD59IC0gT3BlcmF0aW9uIHJlc3VsdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29vcmRpbmF0ZU93bmVkU2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbiwgY2FsbGJhY2spIHtcbiAgY29uc3QgcHJldmlvdXMgPSByZWdpc3RyYXRpb24ub3duZWRRdWV1ZVxuICAvKipcbiAgICogUmVsZWFzZXMgdGhlIG5leHQgb3duZWQgc2libGluZyBvcGVyYXRpb24uXG4gICAqIEB0eXBlIHsoKSA9PiB2b2lkfVxuICAgKi9cbiAgbGV0IHJlbGVhc2UgPSAoKSA9PiB7fVxuXG4gIHJlZ2lzdHJhdGlvbi5vd25lZFF1ZXVlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgcmVsZWFzZSA9IHJlc29sdmUgfSlcbiAgYXdhaXQgcHJldmlvdXNcbiAgY29uc3Qgb3BlcmF0aW9uT3duZXIgPSBTeW1ib2woXCJzaGFyZWQtdHJhbnNhY3Rpb24tb3duZWQtb3BlcmF0aW9uXCIpXG4gIGNvbnN0IGVudmlyb25tZW50SGFuZGxlciA9IGNvbm5lY3Rpb24uY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudEhhbmRsZXIoKVxuXG4gIHJlZ2lzdHJhdGlvbi5yZWVudHJhbnRPd25lcnMuYWRkKG9wZXJhdGlvbk93bmVyKVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBlbnZpcm9ubWVudEhhbmRsZXIucnVuV2l0aFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3JPd25lcihjb25uZWN0aW9uLCBvcGVyYXRpb25Pd25lciwgY2FsbGJhY2spXG4gIH0gZmluYWxseSB7XG4gICAgcmVnaXN0cmF0aW9uLnJlZW50cmFudE93bmVycy5kZWxldGUob3BlcmF0aW9uT3duZXIpXG4gICAgcmVsZWFzZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBEcmFpbnMgYWxsIGluaGVyaXRlZCBvcGVyYXRpb25zIGFkbWl0dGVkIGJlZm9yZSB0aGUgcm9vdCBvd25lciBpcyByZXZva2VkLlxuICogQHBhcmFtIHtDb29yZGluYXRvclJlZ2lzdHJhdGlvbn0gcmVnaXN0cmF0aW9uIC0gUGh5c2ljYWwgY29ubmVjdGlvbiByZWdpc3RyYXRpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBvd25lZCBxdWV1ZSBzdG9wcyBhZHZhbmNpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRyYWluT3duZWRTaGFyZWRUcmFuc2FjdGlvbkNvbm5lY3Rpb25zKHJlZ2lzdHJhdGlvbikge1xuICBsZXQgdGFpbFxuXG4gIGRvIHtcbiAgICB0YWlsID0gcmVnaXN0cmF0aW9uLm93bmVkUXVldWVcbiAgICBhd2FpdCB0YWlsXG4gIH0gd2hpbGUgKHRhaWwgIT09IHJlZ2lzdHJhdGlvbi5vd25lZFF1ZXVlKVxufVxuXG4vKipcbiAqIFJ1bnMgb25lIGJyb2tlci1zZXJpYWxpemVkIHJvb3Qgd2hpbGUgdHJhY2tpbmcgYW5kIGRyYWluaW5nIGl0cyBpbmhlcml0ZWQgd29yay5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gUGFyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdG9yUmVnaXN0cmF0aW9ufSByZWdpc3RyYXRpb24gLSBQaHlzaWNhbCBjb25uZWN0aW9uIHJlZ2lzdHJhdGlvbi5cbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBSb290IG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIE9wZXJhdGlvbiByZXN1bHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvb3JkaW5hdGVSb290U2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbiwgY2FsbGJhY2spIHtcbiAgYXdhaXQgZHJhaW5Pd25lZFNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbnMocmVnaXN0cmF0aW9uKVxuICBjb25zdCByb290T3duZXIgPSBTeW1ib2woXCJzaGFyZWQtdHJhbnNhY3Rpb24tcm9vdC1vcGVyYXRpb25cIilcbiAgY29uc3QgZW52aXJvbm1lbnRIYW5kbGVyID0gY29ubmVjdGlvbi5jb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50SGFuZGxlcigpXG5cbiAgcmVnaXN0cmF0aW9uLnJvb3RPd25lcnMuYWRkKHJvb3RPd25lcilcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZW52aXJvbm1lbnRIYW5kbGVyLnJ1bldpdGhTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yT3duZXIoY29ubmVjdGlvbiwgcm9vdE93bmVyLCBjYWxsYmFjaylcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBkcmFpbk93bmVkU2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9ucyhyZWdpc3RyYXRpb24pXG4gICAgcmVnaXN0cmF0aW9uLnJvb3RPd25lcnMuZGVsZXRlKHJvb3RPd25lcilcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0ZXN0LW9ubHkgc2VyaWFsaXphdGlvbiBvd25lZCBieSB0aGUgYWN0aXZlIGJyb2tlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25uZWN0aW9uIC0gUGFyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0geyhjYWxsYmFjazogKCkgPT4gUHJvbWlzZTx1bmtub3duPikgPT4gUHJvbWlzZTx1bmtub3duPn0gY29vcmRpbmF0b3IgLSBTZXJpYWxpemVyLlxuICogQHJldHVybnMge3N5bWJvbH0gLSBPcGFxdWUgb3duZXIgZm9yIGJyb2tlci1pbnRlcm5hbCBjb25uZWN0aW9uIGNhbGxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2hhcmVkVHJhbnNhY3Rpb25Db29yZGluYXRvcihjb25uZWN0aW9uLCBjb29yZGluYXRvcikge1xuICBjb25zdCBvd25lciA9IFN5bWJvbChcInNoYXJlZC10cmFuc2FjdGlvbi1jb29yZGluYXRvclwiKVxuICBsZXQgcmVnaXN0cmF0aW9uID0gY29ubmVjdGlvblJlZ2lzdHJhdGlvbnMuZ2V0KGNvbm5lY3Rpb24pXG5cbiAgaWYgKHJlZ2lzdHJhdGlvbikge1xuICAgIHJlZ2lzdHJhdGlvbi5jb29yZGluYXRvciA9IGNvb3JkaW5hdG9yXG4gICAgcmVnaXN0cmF0aW9uLm93bmVyID0gb3duZXJcbiAgfSBlbHNlIHtcbiAgICByZWdpc3RyYXRpb24gPSB7Y29vcmRpbmF0b3IsIG93bmVkUXVldWU6IFByb21pc2UucmVzb2x2ZSgpLCBvd25lciwgcmVlbnRyYW50T3duZXJzOiBuZXcgU2V0KCksIHJvb3RPd25lcnM6IG5ldyBTZXQoKX1cbiAgICBjb25uZWN0aW9uUmVnaXN0cmF0aW9ucy5zZXQoY29ubmVjdGlvbiwgcmVnaXN0cmF0aW9uKVxuICB9XG5cbiAgY29vcmRpbmF0b3JzLnNldChjb25uZWN0aW9uLCByZWdpc3RyYXRpb24pXG4gIHJldHVybiBvd25lclxufVxuXG4vKipcbiAqIFJlbW92ZXMgYSBicm9rZXItb3duZWQgY29vcmRpbmF0b3Igd2l0aG91dCBkaXN0dXJiaW5nIGEgcmVwbGFjZW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gY29ubmVjdGlvbiAtIFBhcmVudCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICogQHBhcmFtIHsoY2FsbGJhY2s6ICgpID0+IFByb21pc2U8dW5rbm93bj4pID0+IFByb21pc2U8dW5rbm93bj59IGNvb3JkaW5hdG9yIC0gRXhwZWN0ZWQgc2VyaWFsaXplci5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yKGNvbm5lY3Rpb24sIGNvb3JkaW5hdG9yKSB7XG4gIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGNvb3JkaW5hdG9ycy5nZXQoY29ubmVjdGlvbilcblxuICBpZiAocmVnaXN0cmF0aW9uPy5jb29yZGluYXRvciA9PT0gY29vcmRpbmF0b3IpIHtcbiAgICBjb29yZGluYXRvcnMuZGVsZXRlKGNvbm5lY3Rpb24pXG4gICAgcmVnaXN0cmF0aW9uLmNvb3JkaW5hdG9yID0gaW5hY3RpdmVDb29yZGluYXRvclxuICB9XG59XG5cbi8qKlxuICogUnVucyBwYXJlbnQgd29yayB0aHJvdWdoIGJyb2tlciBzZXJpYWxpemF0aW9uIHdoZW4gcmVnaXN0ZXJlZC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gUGFyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gUGFyZW50IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB7c3ltYm9sfSBbb3BlcmF0aW9uT3duZXJdIC0gQnJva2VyIG93bmVyIGZvciBhbiBhbHJlYWR5LWNvb3JkaW5hdGVkIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIE9wZXJhdGlvbiByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb29yZGluYXRlU2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKGNvbm5lY3Rpb24sIGNhbGxiYWNrLCBvcGVyYXRpb25Pd25lcikge1xuICBjb25zdCBhY3RpdmVSZWdpc3RyYXRpb24gPSBjb29yZGluYXRvcnMuZ2V0KGNvbm5lY3Rpb24pXG4gIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGFjdGl2ZVJlZ2lzdHJhdGlvbiB8fCBjb25uZWN0aW9uUmVnaXN0cmF0aW9ucy5nZXQoY29ubmVjdGlvbilcblxuICBpZiAoIXJlZ2lzdHJhdGlvbikgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcblxuICBjb25zdCBlbnZpcm9ubWVudEhhbmRsZXIgPSBjb25uZWN0aW9uLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRIYW5kbGVyKClcbiAgY29uc3QgY3VycmVudE93bmVyID0gZW52aXJvbm1lbnRIYW5kbGVyLmdldFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3JPd25lcihjb25uZWN0aW9uKVxuXG4gIGlmIChjdXJyZW50T3duZXIgJiYgcmVnaXN0cmF0aW9uLnJlZW50cmFudE93bmVycy5oYXMoY3VycmVudE93bmVyKSkgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgaWYgKGN1cnJlbnRPd25lciAmJiByZWdpc3RyYXRpb24ucm9vdE93bmVycy5oYXMoY3VycmVudE93bmVyKSkge1xuICAgIHJldHVybiBhd2FpdCBjb29yZGluYXRlT3duZWRTaGFyZWRUcmFuc2FjdGlvbkNvbm5lY3Rpb24oY29ubmVjdGlvbiwgcmVnaXN0cmF0aW9uLCBjYWxsYmFjaylcbiAgfVxuICBpZiAoIWFjdGl2ZVJlZ2lzdHJhdGlvbikgcmV0dXJuIGF3YWl0IGNvb3JkaW5hdGVPd25lZFNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbihjb25uZWN0aW9uLCByZWdpc3RyYXRpb24sIGNhbGxiYWNrKVxuICBpZiAob3BlcmF0aW9uT3duZXIgPT09IHJlZ2lzdHJhdGlvbi5vd25lcikge1xuICAgIHJldHVybiBhd2FpdCBjb29yZGluYXRlUm9vdFNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbihjb25uZWN0aW9uLCByZWdpc3RyYXRpb24sIGNhbGxiYWNrKVxuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGF3YWl0IHJlZ2lzdHJhdGlvbi5jb29yZGluYXRvcihhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGNvb3JkaW5hdGVSb290U2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbiwgY2FsbGJhY2spXG4gIH0pKVxufVxuIl19
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLWNvbm5lY3Rpb24tY29vcmRpbmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9zaGFyZWQtdHJhbnNhY3Rpb24tY29ubmVjdGlvbi1jb29yZGluYXRvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosbUVBQW1FO0FBQ25FLHVOQUF1TjtBQUV2Tix1REFBdUQ7QUFDdkQsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUNsQyx1REFBdUQ7QUFDdkQsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRTdDOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsbUJBQW1CLENBQUMsUUFBUTtJQUN6QyxPQUFPLE1BQU0sUUFBUSxFQUFFLENBQUE7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILEtBQUssVUFBVSwwQ0FBMEMsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEdBQUcsb0NBQW9DO0lBQy9KLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUE7SUFDdEM7OztPQUdHO0lBQ0gsSUFBSSxPQUFPLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFBO0lBRXRCLFVBQVUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN2RSxNQUFNLFFBQVEsQ0FBQTtJQUNkLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQy9DLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO0lBQzNFLE1BQU0sY0FBYyxHQUFHLEVBQUMsVUFBVSxFQUFFLE9BQU8sQ0FB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YSxDQUFDLHFCQUFxQixFQUFFLENBQUE7SUFDM0UsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsb0NBQW9DLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDeEYsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFFL0YsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sTUFBTSwwQ0FBMEMsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ2hILENBQUM7SUFDRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4QixPQUFPLE1BQU0sMENBQTBDLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzNILENBQUM7SUFDRCxJQUFJLGNBQWMsS0FBSyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsT0FBTyxNQUFNLHlDQUF5QyxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDNUYsQ0FBQztJQUVELE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakUsT0FBTyxNQUFNLHlDQUF5QyxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDNUYsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEB0eXBlZGVmIHt7b3duZWRRdWV1ZTogUHJvbWlzZTx2b2lkPn19IENvb3JkaW5hdG9yT3duZXJTY29wZSAqL1xuLyoqIEB0eXBlZGVmIHt7Y29ubmVjdGlvblNjb3BlOiBDb29yZGluYXRvck93bmVyU2NvcGUsIGNvb3JkaW5hdG9yOiAoY2FsbGJhY2s6ICgpID0+IFByb21pc2U8dW5rbm93bj4pID0+IFByb21pc2U8dW5rbm93bj4sIG93bmVyOiBzeW1ib2wsIG93bmVyU2NvcGVzOiBNYXA8c3ltYm9sLCBDb29yZGluYXRvck93bmVyU2NvcGU+fX0gQ29vcmRpbmF0b3JSZWdpc3RyYXRpb24gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgQ29vcmRpbmF0b3JSZWdpc3RyYXRpb24+fSAqL1xuY29uc3QgY29vcmRpbmF0b3JzID0gbmV3IFdlYWtNYXAoKVxuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgQ29vcmRpbmF0b3JSZWdpc3RyYXRpb24+fSAqL1xuY29uc3QgY29ubmVjdGlvblJlZ2lzdHJhdGlvbnMgPSBuZXcgV2Vha01hcCgpXG5cbi8qKlxuICogUnVucyB3b3JrIGRpcmVjdGx5IHdoZW4gb25seSB0aGUgY29ubmVjdGlvbi1sb2NhbCBxdWV1ZSByZW1haW5zIHJlZ2lzdGVyZWQuXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8dW5rbm93bj59IGNhbGxiYWNrIC0gU2VyaWFsaXplZCBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn0gLSBPcGVyYXRpb24gcmVzdWx0LlxuICovXG5hc3luYyBmdW5jdGlvbiBpbmFjdGl2ZUNvb3JkaW5hdG9yKGNhbGxiYWNrKSB7XG4gIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG59XG5cbi8qKlxuICogU2VyaWFsaXplcyBzaWJsaW5nIHdvcmsgdGhhdCBpbmhlcml0ZWQgb25lIGNvb3JkaW5hdG9yIG93bmVyIHdpdGhvdXQgcmUtZW50ZXJpbmcgdGhlIGJyb2tlciBxdWV1ZS5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gUGFyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdG9yUmVnaXN0cmF0aW9ufSByZWdpc3RyYXRpb24gLSBQaHlzaWNhbCBjb25uZWN0aW9uIHJlZ2lzdHJhdGlvbi5cbiAqIEBwYXJhbSB7Q29vcmRpbmF0b3JPd25lclNjb3BlfSBvd25lclNjb3BlIC0gUXVldWUgaW5oZXJpdGVkIGZyb20gdGhlIGN1cnJlbnQgb3duZXIuXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gT3duZWQgb3BlcmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvd25lckRlc2NyaXB0aW9uXSAtIEFzeW5jIG93bmVyIGRlc2NyaXB0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8VD59IC0gT3BlcmF0aW9uIHJlc3VsdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29vcmRpbmF0ZU93bmVkU2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbiwgb3duZXJTY29wZSwgY2FsbGJhY2ssIG93bmVyRGVzY3JpcHRpb24gPSBcInNoYXJlZC10cmFuc2FjdGlvbi1vd25lZC1vcGVyYXRpb25cIikge1xuICBjb25zdCBwcmV2aW91cyA9IG93bmVyU2NvcGUub3duZWRRdWV1ZVxuICAvKipcbiAgICogUmVsZWFzZXMgdGhlIG5leHQgb3duZWQgc2libGluZyBvcGVyYXRpb24uXG4gICAqIEB0eXBlIHsoKSA9PiB2b2lkfVxuICAgKi9cbiAgbGV0IHJlbGVhc2UgPSAoKSA9PiB7fVxuXG4gIG93bmVyU2NvcGUub3duZWRRdWV1ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2UgPSByZXNvbHZlIH0pXG4gIGF3YWl0IHByZXZpb3VzXG4gIGNvbnN0IG9wZXJhdGlvbk93bmVyID0gU3ltYm9sKG93bmVyRGVzY3JpcHRpb24pXG4gIGNvbnN0IGVudmlyb25tZW50SGFuZGxlciA9IGNvbm5lY3Rpb24uY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudEhhbmRsZXIoKVxuICBjb25zdCBvcGVyYXRpb25TY29wZSA9IHtvd25lZFF1ZXVlOiBQcm9taXNlLnJlc29sdmUoKX1cblxuICByZWdpc3RyYXRpb24ub3duZXJTY29wZXMuc2V0KG9wZXJhdGlvbk93bmVyLCBvcGVyYXRpb25TY29wZSlcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZW52aXJvbm1lbnRIYW5kbGVyLnJ1bldpdGhTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yT3duZXIoY29ubmVjdGlvbiwgb3BlcmF0aW9uT3duZXIsIGNhbGxiYWNrKVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGRyYWluT3duZWRTaGFyZWRUcmFuc2FjdGlvbkNvbm5lY3Rpb25zKG9wZXJhdGlvblNjb3BlKVxuICAgIHJlZ2lzdHJhdGlvbi5vd25lclNjb3Blcy5kZWxldGUob3BlcmF0aW9uT3duZXIpXG4gICAgcmVsZWFzZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBEcmFpbnMgYWxsIGluaGVyaXRlZCBvcGVyYXRpb25zIGFkbWl0dGVkIGJlZm9yZSB0aGUgcm9vdCBvd25lciBpcyByZXZva2VkLlxuICogQHBhcmFtIHtDb29yZGluYXRvck93bmVyU2NvcGV9IG93bmVyU2NvcGUgLSBPd25lciBzY29wZSB0byBkcmFpbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIG93bmVkIHF1ZXVlIHN0b3BzIGFkdmFuY2luZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZHJhaW5Pd25lZFNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbnMob3duZXJTY29wZSkge1xuICBsZXQgdGFpbFxuXG4gIGRvIHtcbiAgICB0YWlsID0gb3duZXJTY29wZS5vd25lZFF1ZXVlXG4gICAgYXdhaXQgdGFpbFxuICB9IHdoaWxlICh0YWlsICE9PSBvd25lclNjb3BlLm93bmVkUXVldWUpXG59XG5cbi8qKlxuICogUnVucyBvbmUgYnJva2VyLXNlcmlhbGl6ZWQgcm9vdCB3aGlsZSB0cmFja2luZyBhbmQgZHJhaW5pbmcgaXRzIGluaGVyaXRlZCB3b3JrLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBQYXJlbnQgcGh5c2ljYWwgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSB7Q29vcmRpbmF0b3JSZWdpc3RyYXRpb259IHJlZ2lzdHJhdGlvbiAtIFBoeXNpY2FsIGNvbm5lY3Rpb24gcmVnaXN0cmF0aW9uLlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIFJvb3Qgb3BlcmF0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8VD59IC0gT3BlcmF0aW9uIHJlc3VsdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29vcmRpbmF0ZVJvb3RTaGFyZWRUcmFuc2FjdGlvbkNvbm5lY3Rpb24oY29ubmVjdGlvbiwgcmVnaXN0cmF0aW9uLCBjYWxsYmFjaykge1xuICByZXR1cm4gYXdhaXQgY29vcmRpbmF0ZU93bmVkU2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKFxuICAgIGNvbm5lY3Rpb24sXG4gICAgcmVnaXN0cmF0aW9uLFxuICAgIHJlZ2lzdHJhdGlvbi5jb25uZWN0aW9uU2NvcGUsXG4gICAgY2FsbGJhY2ssXG4gICAgXCJzaGFyZWQtdHJhbnNhY3Rpb24tcm9vdC1vcGVyYXRpb25cIlxuICApXG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRlc3Qtb25seSBzZXJpYWxpemF0aW9uIG93bmVkIGJ5IHRoZSBhY3RpdmUgYnJva2VyLlxuICogQHBhcmFtIHtvYmplY3R9IGNvbm5lY3Rpb24gLSBQYXJlbnQgcGh5c2ljYWwgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSB7KGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHVua25vd24+KSA9PiBQcm9taXNlPHVua25vd24+fSBjb29yZGluYXRvciAtIFNlcmlhbGl6ZXIuXG4gKiBAcmV0dXJucyB7c3ltYm9sfSAtIE9wYXF1ZSBvd25lciBmb3IgYnJva2VyLWludGVybmFsIGNvbm5lY3Rpb24gY2FsbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yKGNvbm5lY3Rpb24sIGNvb3JkaW5hdG9yKSB7XG4gIGNvbnN0IG93bmVyID0gU3ltYm9sKFwic2hhcmVkLXRyYW5zYWN0aW9uLWNvb3JkaW5hdG9yXCIpXG4gIGxldCByZWdpc3RyYXRpb24gPSBjb25uZWN0aW9uUmVnaXN0cmF0aW9ucy5nZXQoY29ubmVjdGlvbilcblxuICBpZiAocmVnaXN0cmF0aW9uKSB7XG4gICAgcmVnaXN0cmF0aW9uLmNvb3JkaW5hdG9yID0gY29vcmRpbmF0b3JcbiAgICByZWdpc3RyYXRpb24ub3duZXIgPSBvd25lclxuICB9IGVsc2Uge1xuICAgIHJlZ2lzdHJhdGlvbiA9IHtcbiAgICAgIGNvbm5lY3Rpb25TY29wZToge293bmVkUXVldWU6IFByb21pc2UucmVzb2x2ZSgpfSxcbiAgICAgIGNvb3JkaW5hdG9yLFxuICAgICAgb3duZXIsXG4gICAgICBvd25lclNjb3BlczogbmV3IE1hcCgpXG4gICAgfVxuICAgIGNvbm5lY3Rpb25SZWdpc3RyYXRpb25zLnNldChjb25uZWN0aW9uLCByZWdpc3RyYXRpb24pXG4gIH1cblxuICBjb29yZGluYXRvcnMuc2V0KGNvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbilcbiAgcmV0dXJuIG93bmVyXG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIGJyb2tlci1vd25lZCBjb29yZGluYXRvciB3aXRob3V0IGRpc3R1cmJpbmcgYSByZXBsYWNlbWVudC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25uZWN0aW9uIC0gUGFyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0geyhjYWxsYmFjazogKCkgPT4gUHJvbWlzZTx1bmtub3duPikgPT4gUHJvbWlzZTx1bmtub3duPn0gY29vcmRpbmF0b3IgLSBFeHBlY3RlZCBzZXJpYWxpemVyLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbiwgY29vcmRpbmF0b3IpIHtcbiAgY29uc3QgcmVnaXN0cmF0aW9uID0gY29vcmRpbmF0b3JzLmdldChjb25uZWN0aW9uKVxuXG4gIGlmIChyZWdpc3RyYXRpb24/LmNvb3JkaW5hdG9yID09PSBjb29yZGluYXRvcikge1xuICAgIGNvb3JkaW5hdG9ycy5kZWxldGUoY29ubmVjdGlvbilcbiAgICByZWdpc3RyYXRpb24uY29vcmRpbmF0b3IgPSBpbmFjdGl2ZUNvb3JkaW5hdG9yXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIHBhcmVudCB3b3JrIHRocm91Z2ggYnJva2VyIHNlcmlhbGl6YXRpb24gd2hlbiByZWdpc3RlcmVkLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBQYXJlbnQgcGh5c2ljYWwgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBQYXJlbnQgb3BlcmF0aW9uLlxuICogQHBhcmFtIHtzeW1ib2x9IFtvcGVyYXRpb25Pd25lcl0gLSBCcm9rZXIgb3duZXIgZm9yIGFuIGFscmVhZHktY29vcmRpbmF0ZWQgb3BlcmF0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8VD59IC0gT3BlcmF0aW9uIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvb3JkaW5hdGVTaGFyZWRUcmFuc2FjdGlvbkNvbm5lY3Rpb24oY29ubmVjdGlvbiwgY2FsbGJhY2ssIG9wZXJhdGlvbk93bmVyKSB7XG4gIGNvbnN0IGFjdGl2ZVJlZ2lzdHJhdGlvbiA9IGNvb3JkaW5hdG9ycy5nZXQoY29ubmVjdGlvbilcbiAgY29uc3QgcmVnaXN0cmF0aW9uID0gYWN0aXZlUmVnaXN0cmF0aW9uIHx8IGNvbm5lY3Rpb25SZWdpc3RyYXRpb25zLmdldChjb25uZWN0aW9uKVxuXG4gIGlmICghcmVnaXN0cmF0aW9uKSByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuXG4gIGNvbnN0IGVudmlyb25tZW50SGFuZGxlciA9IGNvbm5lY3Rpb24uY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudEhhbmRsZXIoKVxuICBjb25zdCBjdXJyZW50T3duZXIgPSBlbnZpcm9ubWVudEhhbmRsZXIuZ2V0U2hhcmVkVHJhbnNhY3Rpb25Db29yZGluYXRvck93bmVyKGNvbm5lY3Rpb24pXG4gIGNvbnN0IGN1cnJlbnRPd25lclNjb3BlID0gY3VycmVudE93bmVyID8gcmVnaXN0cmF0aW9uLm93bmVyU2NvcGVzLmdldChjdXJyZW50T3duZXIpIDogdW5kZWZpbmVkXG5cbiAgaWYgKGN1cnJlbnRPd25lclNjb3BlKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNvb3JkaW5hdGVPd25lZFNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbihjb25uZWN0aW9uLCByZWdpc3RyYXRpb24sIGN1cnJlbnRPd25lclNjb3BlLCBjYWxsYmFjaylcbiAgfVxuICBpZiAoIWFjdGl2ZVJlZ2lzdHJhdGlvbikge1xuICAgIHJldHVybiBhd2FpdCBjb29yZGluYXRlT3duZWRTaGFyZWRUcmFuc2FjdGlvbkNvbm5lY3Rpb24oY29ubmVjdGlvbiwgcmVnaXN0cmF0aW9uLCByZWdpc3RyYXRpb24uY29ubmVjdGlvblNjb3BlLCBjYWxsYmFjaylcbiAgfVxuICBpZiAob3BlcmF0aW9uT3duZXIgPT09IHJlZ2lzdHJhdGlvbi5vd25lcikge1xuICAgIHJldHVybiBhd2FpdCBjb29yZGluYXRlUm9vdFNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbihjb25uZWN0aW9uLCByZWdpc3RyYXRpb24sIGNhbGxiYWNrKVxuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGF3YWl0IHJlZ2lzdHJhdGlvbi5jb29yZGluYXRvcihhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGNvb3JkaW5hdGVSb290U2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbiwgY2FsbGJhY2spXG4gIH0pKVxufVxuIl19
@@ -1,6 +1,7 @@
1
1
  // @ts-check
2
2
 
3
- /** @typedef {{coordinator: (callback: () => Promise<unknown>) => Promise<unknown>, ownedQueue: Promise<void>, owner: symbol, reentrantOwners: Set<symbol>, rootOwners: Set<symbol>}} CoordinatorRegistration */
3
+ /** @typedef {{ownedQueue: Promise<void>}} CoordinatorOwnerScope */
4
+ /** @typedef {{connectionScope: CoordinatorOwnerScope, coordinator: (callback: () => Promise<unknown>) => Promise<unknown>, owner: symbol, ownerScopes: Map<symbol, CoordinatorOwnerScope>}} CoordinatorRegistration */
4
5
 
5
6
  /** @type {WeakMap<object, CoordinatorRegistration>} */
6
7
  const coordinators = new WeakMap()
@@ -21,43 +22,47 @@ async function inactiveCoordinator(callback) {
21
22
  * @template T
22
23
  * @param {import("../database/drivers/base.js").default} connection - Parent physical connection.
23
24
  * @param {CoordinatorRegistration} registration - Physical connection registration.
25
+ * @param {CoordinatorOwnerScope} ownerScope - Queue inherited from the current owner.
24
26
  * @param {() => Promise<T>} callback - Owned operation.
27
+ * @param {string} [ownerDescription] - Async owner description.
25
28
  * @returns {Promise<T>} - Operation result.
26
29
  */
27
- async function coordinateOwnedSharedTransactionConnection(connection, registration, callback) {
28
- const previous = registration.ownedQueue
30
+ async function coordinateOwnedSharedTransactionConnection(connection, registration, ownerScope, callback, ownerDescription = "shared-transaction-owned-operation") {
31
+ const previous = ownerScope.ownedQueue
29
32
  /**
30
33
  * Releases the next owned sibling operation.
31
34
  * @type {() => void}
32
35
  */
33
36
  let release = () => {}
34
37
 
35
- registration.ownedQueue = new Promise((resolve) => { release = resolve })
38
+ ownerScope.ownedQueue = new Promise((resolve) => { release = resolve })
36
39
  await previous
37
- const operationOwner = Symbol("shared-transaction-owned-operation")
40
+ const operationOwner = Symbol(ownerDescription)
38
41
  const environmentHandler = connection.configuration.getEnvironmentHandler()
42
+ const operationScope = {ownedQueue: Promise.resolve()}
39
43
 
40
- registration.reentrantOwners.add(operationOwner)
44
+ registration.ownerScopes.set(operationOwner, operationScope)
41
45
  try {
42
46
  return await environmentHandler.runWithSharedTransactionCoordinatorOwner(connection, operationOwner, callback)
43
47
  } finally {
44
- registration.reentrantOwners.delete(operationOwner)
48
+ await drainOwnedSharedTransactionConnections(operationScope)
49
+ registration.ownerScopes.delete(operationOwner)
45
50
  release()
46
51
  }
47
52
  }
48
53
 
49
54
  /**
50
55
  * Drains all inherited operations admitted before the root owner is revoked.
51
- * @param {CoordinatorRegistration} registration - Physical connection registration.
56
+ * @param {CoordinatorOwnerScope} ownerScope - Owner scope to drain.
52
57
  * @returns {Promise<void>} - Resolves when the owned queue stops advancing.
53
58
  */
54
- async function drainOwnedSharedTransactionConnections(registration) {
59
+ async function drainOwnedSharedTransactionConnections(ownerScope) {
55
60
  let tail
56
61
 
57
62
  do {
58
- tail = registration.ownedQueue
63
+ tail = ownerScope.ownedQueue
59
64
  await tail
60
- } while (tail !== registration.ownedQueue)
65
+ } while (tail !== ownerScope.ownedQueue)
61
66
  }
62
67
 
63
68
  /**
@@ -69,17 +74,13 @@ async function drainOwnedSharedTransactionConnections(registration) {
69
74
  * @returns {Promise<T>} - Operation result.
70
75
  */
71
76
  async function coordinateRootSharedTransactionConnection(connection, registration, callback) {
72
- await drainOwnedSharedTransactionConnections(registration)
73
- const rootOwner = Symbol("shared-transaction-root-operation")
74
- const environmentHandler = connection.configuration.getEnvironmentHandler()
75
-
76
- registration.rootOwners.add(rootOwner)
77
- try {
78
- return await environmentHandler.runWithSharedTransactionCoordinatorOwner(connection, rootOwner, callback)
79
- } finally {
80
- await drainOwnedSharedTransactionConnections(registration)
81
- registration.rootOwners.delete(rootOwner)
82
- }
77
+ return await coordinateOwnedSharedTransactionConnection(
78
+ connection,
79
+ registration,
80
+ registration.connectionScope,
81
+ callback,
82
+ "shared-transaction-root-operation"
83
+ )
83
84
  }
84
85
 
85
86
  /**
@@ -96,7 +97,12 @@ export function setSharedTransactionCoordinator(connection, coordinator) {
96
97
  registration.coordinator = coordinator
97
98
  registration.owner = owner
98
99
  } else {
99
- registration = {coordinator, ownedQueue: Promise.resolve(), owner, reentrantOwners: new Set(), rootOwners: new Set()}
100
+ registration = {
101
+ connectionScope: {ownedQueue: Promise.resolve()},
102
+ coordinator,
103
+ owner,
104
+ ownerScopes: new Map()
105
+ }
100
106
  connectionRegistrations.set(connection, registration)
101
107
  }
102
108
 
@@ -135,12 +141,14 @@ export async function coordinateSharedTransactionConnection(connection, callback
135
141
 
136
142
  const environmentHandler = connection.configuration.getEnvironmentHandler()
137
143
  const currentOwner = environmentHandler.getSharedTransactionCoordinatorOwner(connection)
144
+ const currentOwnerScope = currentOwner ? registration.ownerScopes.get(currentOwner) : undefined
138
145
 
139
- if (currentOwner && registration.reentrantOwners.has(currentOwner)) return await callback()
140
- if (currentOwner && registration.rootOwners.has(currentOwner)) {
141
- return await coordinateOwnedSharedTransactionConnection(connection, registration, callback)
146
+ if (currentOwnerScope) {
147
+ return await coordinateOwnedSharedTransactionConnection(connection, registration, currentOwnerScope, callback)
148
+ }
149
+ if (!activeRegistration) {
150
+ return await coordinateOwnedSharedTransactionConnection(connection, registration, registration.connectionScope, callback)
142
151
  }
143
- if (!activeRegistration) return await coordinateOwnedSharedTransactionConnection(connection, registration, callback)
144
152
  if (operationOwner === registration.owner) {
145
153
  return await coordinateRootSharedTransactionConnection(connection, registration, callback)
146
154
  }
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.620",
6
+ "version": "1.0.621",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -7,7 +7,7 @@ import TableData from "../database/table-data/index.js"
7
7
  import VelociousError from "../velocious-error.js"
8
8
  import BackgroundJobRecord from "./job-record.js"
9
9
  import normalizeBackgroundJobError from "./normalize-error.js"
10
- import {coordinateSharedTransactionConnection} from "../testing/shared-transaction-connection-coordinator.js"
10
+ import { coordinateSharedTransactionConnection } from "../testing/shared-transaction-connection-coordinator.js"
11
11
  import stableJsonStringify from "../utils/stable-json.js"
12
12
  import {
13
13
  BACKGROUND_JOB_EXECUTION_MODES,
@@ -1,6 +1,7 @@
1
1
  // @ts-check
2
2
 
3
- /** @typedef {{coordinator: (callback: () => Promise<unknown>) => Promise<unknown>, ownedQueue: Promise<void>, owner: symbol, reentrantOwners: Set<symbol>, rootOwners: Set<symbol>}} CoordinatorRegistration */
3
+ /** @typedef {{ownedQueue: Promise<void>}} CoordinatorOwnerScope */
4
+ /** @typedef {{connectionScope: CoordinatorOwnerScope, coordinator: (callback: () => Promise<unknown>) => Promise<unknown>, owner: symbol, ownerScopes: Map<symbol, CoordinatorOwnerScope>}} CoordinatorRegistration */
4
5
 
5
6
  /** @type {WeakMap<object, CoordinatorRegistration>} */
6
7
  const coordinators = new WeakMap()
@@ -21,43 +22,47 @@ async function inactiveCoordinator(callback) {
21
22
  * @template T
22
23
  * @param {import("../database/drivers/base.js").default} connection - Parent physical connection.
23
24
  * @param {CoordinatorRegistration} registration - Physical connection registration.
25
+ * @param {CoordinatorOwnerScope} ownerScope - Queue inherited from the current owner.
24
26
  * @param {() => Promise<T>} callback - Owned operation.
27
+ * @param {string} [ownerDescription] - Async owner description.
25
28
  * @returns {Promise<T>} - Operation result.
26
29
  */
27
- async function coordinateOwnedSharedTransactionConnection(connection, registration, callback) {
28
- const previous = registration.ownedQueue
30
+ async function coordinateOwnedSharedTransactionConnection(connection, registration, ownerScope, callback, ownerDescription = "shared-transaction-owned-operation") {
31
+ const previous = ownerScope.ownedQueue
29
32
  /**
30
33
  * Releases the next owned sibling operation.
31
34
  * @type {() => void}
32
35
  */
33
36
  let release = () => {}
34
37
 
35
- registration.ownedQueue = new Promise((resolve) => { release = resolve })
38
+ ownerScope.ownedQueue = new Promise((resolve) => { release = resolve })
36
39
  await previous
37
- const operationOwner = Symbol("shared-transaction-owned-operation")
40
+ const operationOwner = Symbol(ownerDescription)
38
41
  const environmentHandler = connection.configuration.getEnvironmentHandler()
42
+ const operationScope = {ownedQueue: Promise.resolve()}
39
43
 
40
- registration.reentrantOwners.add(operationOwner)
44
+ registration.ownerScopes.set(operationOwner, operationScope)
41
45
  try {
42
46
  return await environmentHandler.runWithSharedTransactionCoordinatorOwner(connection, operationOwner, callback)
43
47
  } finally {
44
- registration.reentrantOwners.delete(operationOwner)
48
+ await drainOwnedSharedTransactionConnections(operationScope)
49
+ registration.ownerScopes.delete(operationOwner)
45
50
  release()
46
51
  }
47
52
  }
48
53
 
49
54
  /**
50
55
  * Drains all inherited operations admitted before the root owner is revoked.
51
- * @param {CoordinatorRegistration} registration - Physical connection registration.
56
+ * @param {CoordinatorOwnerScope} ownerScope - Owner scope to drain.
52
57
  * @returns {Promise<void>} - Resolves when the owned queue stops advancing.
53
58
  */
54
- async function drainOwnedSharedTransactionConnections(registration) {
59
+ async function drainOwnedSharedTransactionConnections(ownerScope) {
55
60
  let tail
56
61
 
57
62
  do {
58
- tail = registration.ownedQueue
63
+ tail = ownerScope.ownedQueue
59
64
  await tail
60
- } while (tail !== registration.ownedQueue)
65
+ } while (tail !== ownerScope.ownedQueue)
61
66
  }
62
67
 
63
68
  /**
@@ -69,17 +74,13 @@ async function drainOwnedSharedTransactionConnections(registration) {
69
74
  * @returns {Promise<T>} - Operation result.
70
75
  */
71
76
  async function coordinateRootSharedTransactionConnection(connection, registration, callback) {
72
- await drainOwnedSharedTransactionConnections(registration)
73
- const rootOwner = Symbol("shared-transaction-root-operation")
74
- const environmentHandler = connection.configuration.getEnvironmentHandler()
75
-
76
- registration.rootOwners.add(rootOwner)
77
- try {
78
- return await environmentHandler.runWithSharedTransactionCoordinatorOwner(connection, rootOwner, callback)
79
- } finally {
80
- await drainOwnedSharedTransactionConnections(registration)
81
- registration.rootOwners.delete(rootOwner)
82
- }
77
+ return await coordinateOwnedSharedTransactionConnection(
78
+ connection,
79
+ registration,
80
+ registration.connectionScope,
81
+ callback,
82
+ "shared-transaction-root-operation"
83
+ )
83
84
  }
84
85
 
85
86
  /**
@@ -96,7 +97,12 @@ export function setSharedTransactionCoordinator(connection, coordinator) {
96
97
  registration.coordinator = coordinator
97
98
  registration.owner = owner
98
99
  } else {
99
- registration = {coordinator, ownedQueue: Promise.resolve(), owner, reentrantOwners: new Set(), rootOwners: new Set()}
100
+ registration = {
101
+ connectionScope: {ownedQueue: Promise.resolve()},
102
+ coordinator,
103
+ owner,
104
+ ownerScopes: new Map()
105
+ }
100
106
  connectionRegistrations.set(connection, registration)
101
107
  }
102
108
 
@@ -135,12 +141,14 @@ export async function coordinateSharedTransactionConnection(connection, callback
135
141
 
136
142
  const environmentHandler = connection.configuration.getEnvironmentHandler()
137
143
  const currentOwner = environmentHandler.getSharedTransactionCoordinatorOwner(connection)
144
+ const currentOwnerScope = currentOwner ? registration.ownerScopes.get(currentOwner) : undefined
138
145
 
139
- if (currentOwner && registration.reentrantOwners.has(currentOwner)) return await callback()
140
- if (currentOwner && registration.rootOwners.has(currentOwner)) {
141
- return await coordinateOwnedSharedTransactionConnection(connection, registration, callback)
146
+ if (currentOwnerScope) {
147
+ return await coordinateOwnedSharedTransactionConnection(connection, registration, currentOwnerScope, callback)
148
+ }
149
+ if (!activeRegistration) {
150
+ return await coordinateOwnedSharedTransactionConnection(connection, registration, registration.connectionScope, callback)
142
151
  }
143
- if (!activeRegistration) return await coordinateOwnedSharedTransactionConnection(connection, registration, callback)
144
152
  if (operationOwner === registration.owner) {
145
153
  return await coordinateRootSharedTransactionConnection(connection, registration, callback)
146
154
  }