@decaf-ts/transactional-decorators 0.1.2 → 0.1.3

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 (44) hide show
  1. package/LICENSE.md +21 -157
  2. package/dist/transactional-decorators.cjs +166 -67
  3. package/dist/transactional-decorators.esm.cjs +166 -67
  4. package/lib/Transaction.cjs +87 -39
  5. package/lib/Transaction.d.ts +86 -38
  6. package/lib/constants.cjs +14 -1
  7. package/lib/constants.d.ts +13 -0
  8. package/lib/decorators.cjs +35 -11
  9. package/lib/decorators.d.ts +34 -10
  10. package/lib/esm/Transaction.d.ts +86 -38
  11. package/lib/esm/Transaction.js +90 -42
  12. package/lib/esm/constants.d.ts +13 -0
  13. package/lib/esm/constants.js +14 -1
  14. package/lib/esm/decorators.d.ts +34 -10
  15. package/lib/esm/decorators.js +37 -13
  16. package/lib/esm/index.d.ts +7 -13
  17. package/lib/esm/index.js +14 -20
  18. package/lib/esm/interfaces/TransactionLock.d.ts +13 -11
  19. package/lib/esm/interfaces/TransactionLock.js +1 -1
  20. package/lib/esm/interfaces/index.d.ts +5 -0
  21. package/lib/esm/interfaces/index.js +7 -2
  22. package/lib/esm/locks/Lock.d.ts +13 -5
  23. package/lib/esm/locks/Lock.js +14 -6
  24. package/lib/esm/locks/SyncronousLock.d.ts +3 -4
  25. package/lib/esm/locks/SyncronousLock.js +14 -2
  26. package/lib/esm/locks/index.d.ts +5 -0
  27. package/lib/esm/locks/index.js +8 -3
  28. package/lib/esm/types.d.ts +13 -3
  29. package/lib/esm/types.js +1 -1
  30. package/lib/index.cjs +8 -14
  31. package/lib/index.d.ts +7 -13
  32. package/lib/interfaces/TransactionLock.cjs +1 -1
  33. package/lib/interfaces/TransactionLock.d.ts +13 -11
  34. package/lib/interfaces/index.cjs +6 -1
  35. package/lib/interfaces/index.d.ts +5 -0
  36. package/lib/locks/Lock.cjs +14 -6
  37. package/lib/locks/Lock.d.ts +13 -5
  38. package/lib/locks/SyncronousLock.cjs +13 -1
  39. package/lib/locks/SyncronousLock.d.ts +3 -4
  40. package/lib/locks/index.cjs +6 -1
  41. package/lib/locks/index.d.ts +5 -0
  42. package/lib/types.cjs +1 -1
  43. package/lib/types.d.ts +13 -3
  44. package/package.json +2 -2
@@ -7,16 +7,48 @@ const db_decorators_1 = require("@decaf-ts/db-decorators");
7
7
  const utils_1 = require("./utils.cjs");
8
8
  const constants_1 = require("./constants.cjs");
9
9
  /**
10
- * @summary Transaction Class
11
- *
12
- * @param {string} source
13
- * @param {string} [method]
14
- * @param {function(): void} [action]
15
- * @param {any[]} [metadata]
16
- *
10
+ * @description Core transaction management class
11
+ * @summary Manages transaction lifecycle, including creation, execution, and cleanup. Provides mechanisms for binding transactions to objects and methods, ensuring proper transaction context propagation.
12
+ * @param {string} source - The source/origin of the transaction (typically a class name)
13
+ * @param {string} [method] - The method name associated with the transaction
14
+ * @param {function(): any} [action] - The function to execute within the transaction
15
+ * @param {any[]} [metadata] - Additional metadata to associate with the transaction
17
16
  * @class Transaction
17
+ * @example
18
+ * // Creating and submitting a transaction
19
+ * const transaction = new Transaction(
20
+ * 'UserService',
21
+ * 'createUser',
22
+ * async () => {
23
+ * // Transaction logic here
24
+ * await db.insert('users', { name: 'John' });
25
+ * }
26
+ * );
27
+ * Transaction.submit(transaction);
18
28
  *
19
- * @category Transactions
29
+ * // Using the transactional decorator
30
+ * class UserService {
31
+ * @transactional()
32
+ * async createUser(data) {
33
+ * // Method will be executed within a transaction
34
+ * return await db.insert('users', data);
35
+ * }
36
+ * }
37
+ * @mermaid
38
+ * sequenceDiagram
39
+ * participant C as Client Code
40
+ * participant T as Transaction
41
+ * participant L as TransactionLock
42
+ * participant O as Original Method
43
+ *
44
+ * C->>T: new Transaction(source, method, action)
45
+ * C->>T: Transaction.submit(transaction)
46
+ * T->>L: submit(transaction)
47
+ * L->>T: fire()
48
+ * T->>O: Execute action()
49
+ * O-->>T: Return result/error
50
+ * T->>L: release(error?)
51
+ * L-->>C: Return result/error
20
52
  */
21
53
  class Transaction {
22
54
  constructor(source, method, action, metadata) {
@@ -28,11 +60,12 @@ class Transaction {
28
60
  this.metadata = metadata;
29
61
  }
30
62
  /**
31
- * @summary Pushes a transaction to que queue and waits its resolution
32
- *
33
- * @param {any} issuer any class. will be used as this when calling the callbackMethod
34
- * @param {Function} callbackMethod callback function containing the transaction. will be called with the issuear as this
35
- * @param {any[]} args arguments to pass to the method. Last one must be the callback
63
+ * @description Queues a transaction for execution
64
+ * @summary Pushes a transaction to the queue and waits for its resolution. Creates a new transaction with the provided issuer and callback method, then submits it to the transaction lock.
65
+ * @param {any} issuer - Any class instance that will be used as 'this' when calling the callbackMethod
66
+ * @param {Function} callbackMethod - Callback function containing the transaction logic, will be called with the issuer as 'this'
67
+ * @param {any[]} args - Arguments to pass to the method. Last one must be the callback function
68
+ * @return {void}
36
69
  */
37
70
  static push(issuer, callbackMethod, ...args) {
38
71
  const callback = args.pop();
@@ -49,14 +82,18 @@ class Transaction {
49
82
  Transaction.getLock().submit(transaction);
50
83
  }
51
84
  /**
52
- * @summary Sets the lock to be used
53
- * @param lock
85
+ * @description Configures the transaction lock implementation
86
+ * @summary Sets the lock implementation to be used for transaction management, allowing customization of the transaction behavior
87
+ * @param {TransactionLock} lock - The lock implementation to use for managing transactions
88
+ * @return {void}
54
89
  */
55
90
  static setLock(lock) {
56
91
  this.lock = lock;
57
92
  }
58
93
  /**
59
- * @summary gets the lock
94
+ * @description Retrieves the current transaction lock
95
+ * @summary Gets the current transaction lock instance, creating a default SyncronousLock if none exists
96
+ * @return {TransactionLock} The current transaction lock implementation
60
97
  */
61
98
  static getLock() {
62
99
  if (!this.lock)
@@ -64,28 +101,36 @@ class Transaction {
64
101
  return this.lock;
65
102
  }
66
103
  /**
67
- * @summary submits a transaction
68
- * @param {Transaction} transaction
104
+ * @description Submits a transaction for processing
105
+ * @summary Submits a transaction to the current transaction lock for processing and execution
106
+ * @param {Transaction} transaction - The transaction to submit for processing
107
+ * @return {void}
69
108
  */
70
109
  static submit(transaction) {
71
110
  Transaction.getLock().submit(transaction);
72
111
  }
73
112
  /**
74
- * @summary releases the lock
75
- * @param {Err} err
113
+ * @description Releases the transaction lock
114
+ * @summary Releases the current transaction lock, optionally with an error, allowing the next transaction to proceed
115
+ * @param {Error} [err] - Optional error that occurred during transaction execution
116
+ * @return {Promise<void>} A promise that resolves when the lock has been released
76
117
  */
77
118
  static async release(err) {
78
119
  return Transaction.getLock().release(err);
79
120
  }
80
121
  /**
81
- * @summary retrieves the metadata for the transaction
122
+ * @description Retrieves transaction metadata
123
+ * @summary Returns a copy of the metadata associated with this transaction, ensuring the original metadata remains unmodified
124
+ * @return {any[] | undefined} A copy of the transaction metadata or undefined if no metadata exists
82
125
  */
83
126
  getMetadata() {
84
127
  return this.metadata ? [...this.metadata] : undefined;
85
128
  }
86
129
  /**
87
- * @summary Binds a new operation to the current transaction
88
- * @param {Transaction} nextTransaction
130
+ * @description Links a new transaction to the current one
131
+ * @summary Binds a new transaction operation to the current transaction, transferring logs and binding methods to maintain transaction context
132
+ * @param {Transaction} nextTransaction - The new transaction to bind to the current one
133
+ * @return {void}
89
134
  */
90
135
  bindTransaction(nextTransaction) {
91
136
  // all(`Binding the {0} to {1}`, nextTransaction, this);
@@ -95,12 +140,10 @@ class Transaction {
95
140
  this.action = nextTransaction.action;
96
141
  }
97
142
  /**
98
- * @summary Binds the Transactional Decorated Object to the transaction
99
- * @description by having all {@link transactional} decorated
100
- * methods always pass the current Transaction as an argument
101
- *
102
- * @param {any} obj
103
- * @return {any} the bound {@param obj}
143
+ * @description Binds an object to the current transaction context
144
+ * @summary Binds a transactional decorated object to the transaction by ensuring all transactional methods automatically receive the current transaction as their first argument
145
+ * @param {any} obj - The object to bind to the transaction
146
+ * @return {any} The bound object with transaction-aware method wrappers
104
147
  */
105
148
  bindToTransaction(obj) {
106
149
  const transactionalMethods = (0, db_decorators_1.getAllPropertyDecoratorsRecursive)(obj, undefined, constants_1.TransactionalKeys.REFLECT);
@@ -134,7 +177,9 @@ class Transaction {
134
177
  return boundObj;
135
178
  }
136
179
  /**
137
- * @summary Fires the Transaction
180
+ * @description Executes the transaction action
181
+ * @summary Fires the transaction by executing its associated action function, throwing an error if no action is defined
182
+ * @return {any} The result of the transaction action
138
183
  */
139
184
  fire() {
140
185
  if (!this.action)
@@ -142,22 +187,25 @@ class Transaction {
142
187
  return this.action();
143
188
  }
144
189
  /**
145
- * @summary toString override
146
- * @param {boolean} [withId] defaults to true
147
- * @param {boolean} [withLog] defaults to true
190
+ * @description Provides a string representation of the transaction
191
+ * @summary Overrides the default toString method to provide a formatted string representation of the transaction, optionally including the transaction ID and log
192
+ * @param {boolean} [withId=true] - Whether to include the transaction ID in the output
193
+ * @param {boolean} [withLog=false] - Whether to include the transaction log in the output
194
+ * @return {string} A string representation of the transaction
148
195
  */
149
196
  toString(withId = true, withLog = false) {
150
197
  return `${withId ? `[${this.id}]` : ""}[Transaction][${this.source}.${this.method}${withLog ? `]\nTransaction Log:\n${this.log.join("\n")}` : "]"}`;
151
198
  }
152
199
  /**
153
- * @summary gets the transactions reflections key
154
- * @function getRepoKey
155
- * @param {string} key
156
- * @memberOf module:db-decorators.Transactions
157
- * */
200
+ * @description Generates a reflection metadata key for transactions
201
+ * @summary Creates a prefixed reflection key for transaction-related metadata, ensuring proper namespacing
202
+ * @param {string} key - The base key to prefix with the transaction reflection namespace
203
+ * @return {string} The complete reflection key for transaction metadata
204
+ * @function key
205
+ */
158
206
  static key(key) {
159
207
  return constants_1.TransactionalKeys.REFLECT + key;
160
208
  }
161
209
  }
162
210
  exports.Transaction = Transaction;
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQWtEO0FBRWxELCtEQUF3RDtBQUN4RCwyREFHaUM7QUFDakMsdUNBQXdDO0FBQ3hDLCtDQUFnRDtBQUVoRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEsV0FBVztJQVV0QixZQUNFLE1BQWMsRUFDZCxNQUFlLEVBQ2YsTUFBa0IsRUFDbEIsUUFBZ0I7UUFFaEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQ1QsTUFBVyxFQUNYLGNBQXNELEVBQ3RELEdBQUcsSUFBd0I7UUFFM0IsTUFBTSxRQUFRLEdBQWEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssVUFBVTtZQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRTtZQUN6QyxXQUFXLENBQUMsT0FBTyxFQUFFO2lCQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDO2lC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QUM7SUFDekMsQ0FBQztDQUNGO0FBaE1ELGtDQWdNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zYWN0aW9uTG9jayB9IGZyb20gXCIuL2ludGVyZmFjZXMvVHJhbnNhY3Rpb25Mb2NrXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDYWxsYmFjayB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBTeW5jcm9ub3VzTG9jayB9IGZyb20gXCIuL2xvY2tzL1N5bmNyb25vdXNMb2NrXCI7XG5pbXBvcnQge1xuICBEQktleXMsXG4gIGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBnZXRPYmplY3ROYW1lIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uYWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgVHJhbnNhY3Rpb24gQ2xhc3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21ldGhvZF1cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogdm9pZH0gW2FjdGlvbl1cbiAqIEBwYXJhbSB7YW55W119IFttZXRhZGF0YV1cbiAqXG4gKiBAY2xhc3MgVHJhbnNhY3Rpb25cbiAqXG4gKiBAY2F0ZWdvcnkgVHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiB7XG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhY3Rpb24/OiAoKSA9PiBhbnk7XG4gIHJlYWRvbmx5IG1ldGhvZD86IHN0cmluZztcbiAgcmVhZG9ubHkgc291cmNlPzogc3RyaW5nO1xuICByZWFkb25seSBsb2c6IHN0cmluZ1tdO1xuICBwcml2YXRlIHJlYWRvbmx5IG1ldGFkYXRhPzogYW55W107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbG9jazogVHJhbnNhY3Rpb25Mb2NrO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIG1ldGhvZD86IHN0cmluZyxcbiAgICBhY3Rpb24/OiAoKSA9PiBhbnksXG4gICAgbWV0YWRhdGE/OiBhbnlbXVxuICApIHtcbiAgICB0aGlzLmlkID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICB0aGlzLmxvZyA9IFtbdGhpcy5pZCwgc291cmNlLCBtZXRob2RdLmpvaW4oXCIgfCBcIildO1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBQdXNoZXMgYSB0cmFuc2FjdGlvbiB0byBxdWUgcXVldWUgYW5kIHdhaXRzIGl0cyByZXNvbHV0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7YW55fSBpc3N1ZXIgYW55IGNsYXNzLiB3aWxsIGJlIHVzZWQgYXMgdGhpcyB3aGVuIGNhbGxpbmcgdGhlIGNhbGxiYWNrTWV0aG9kXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrTWV0aG9kIGNhbGxiYWNrIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uLiB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBpc3N1ZWFyIGFzIHRoaXNcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLiBMYXN0IG9uZSBtdXN0IGJlIHRoZSBjYWxsYmFja1xuICAgKi9cbiAgc3RhdGljIHB1c2goXG4gICAgaXNzdWVyOiBhbnksXG4gICAgY2FsbGJhY2tNZXRob2Q6ICguLi5hcmd6ejogKGFueSB8IENhbGxiYWNrKVtdKSA9PiB2b2lkLFxuICAgIC4uLmFyZ3M6IChhbnkgfCBDYWxsYmFjaylbXVxuICApIHtcbiAgICBjb25zdCBjYWxsYmFjazogQ2FsbGJhY2sgPSBhcmdzLnBvcCgpO1xuICAgIGlmICghY2FsbGJhY2sgfHwgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGNhbGxiYWNrXCIpO1xuICAgIGNvbnN0IGNiID0gKGVycj86IEVycm9yLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgVHJhbnNhY3Rpb24uZ2V0TG9jaygpXG4gICAgICAgIC5yZWxlYXNlKGVycilcbiAgICAgICAgLnRoZW4oKCkgPT4gY2FsbGJhY2soZXJyLCAuLi5hcmdzKSk7XG4gICAgfTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oXG4gICAgICBpc3N1ZXIuY29uc3RydWN0b3IubmFtZSxcbiAgICAgIGNhbGxiYWNrTWV0aG9kLm5hbWUgPyBnZXRPYmplY3ROYW1lKGNhbGxiYWNrTWV0aG9kKSA6IFwiQW5vbnltb3VzXCIsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjYWxsYmFja01ldGhvZC5jYWxsKFxuICAgICAgICAgIHRyYW5zYWN0aW9uLmJpbmRUb1RyYW5zYWN0aW9uKGlzc3VlciksXG4gICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICBjYlxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG4gICAgVHJhbnNhY3Rpb24uZ2V0TG9jaygpLnN1Ym1pdCh0cmFuc2FjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgbG9jayB0byBiZSB1c2VkXG4gICAqIEBwYXJhbSBsb2NrXG4gICAqL1xuICBzdGF0aWMgc2V0TG9jayhsb2NrOiBUcmFuc2FjdGlvbkxvY2spIHtcbiAgICB0aGlzLmxvY2sgPSBsb2NrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGdldHMgdGhlIGxvY2tcbiAgICovXG4gIHN0YXRpYyBnZXRMb2NrKCk6IFRyYW5zYWN0aW9uTG9jayB7XG4gICAgaWYgKCF0aGlzLmxvY2spIHRoaXMubG9jayA9IG5ldyBTeW5jcm9ub3VzTG9jaygpO1xuICAgIHJldHVybiB0aGlzLmxvY2s7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgc3VibWl0cyBhIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqL1xuICBzdGF0aWMgc3VibWl0KHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIFRyYW5zYWN0aW9uLmdldExvY2soKS5zdWJtaXQodHJhbnNhY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHJlbGVhc2VzIHRoZSBsb2NrXG4gICAqIEBwYXJhbSB7RXJyfSBlcnJcbiAgICovXG4gIHN0YXRpYyBhc3luYyByZWxlYXNlKGVycj86IEVycm9yKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uLmdldExvY2soKS5yZWxlYXNlKGVycik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcmV0cmlldmVzIHRoZSBtZXRhZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YSA/IFsuLi50aGlzLm1ldGFkYXRhXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBCaW5kcyBhIG5ldyBvcGVyYXRpb24gdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbn0gbmV4dFRyYW5zYWN0aW9uXG4gICAqL1xuICBiaW5kVHJhbnNhY3Rpb24obmV4dFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIC8vIGFsbChgQmluZGluZyB0aGUgezB9IHRvIHsxfWAsIG5leHRUcmFuc2FjdGlvbiwgdGhpcyk7XG4gICAgdGhpcy5sb2cucHVzaCguLi5uZXh0VHJhbnNhY3Rpb24ubG9nKTtcbiAgICBuZXh0VHJhbnNhY3Rpb24uYmluZFRyYW5zYWN0aW9uID0gdGhpcy5iaW5kVG9UcmFuc2FjdGlvbi5iaW5kKHRoaXMpO1xuICAgIG5leHRUcmFuc2FjdGlvbi5iaW5kVG9UcmFuc2FjdGlvbiA9IHRoaXMuYmluZFRvVHJhbnNhY3Rpb24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmFjdGlvbiA9IG5leHRUcmFuc2FjdGlvbi5hY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgQmluZHMgdGhlIFRyYW5zYWN0aW9uYWwgRGVjb3JhdGVkIE9iamVjdCB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uIGJ5IGhhdmluZyBhbGwge0BsaW5rIHRyYW5zYWN0aW9uYWx9IGRlY29yYXRlZFxuICAgKiBtZXRob2RzIGFsd2F5cyBwYXNzIHRoZSBjdXJyZW50IFRyYW5zYWN0aW9uIGFzIGFuIGFyZ3VtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7YW55fSBvYmpcbiAgICogQHJldHVybiB7YW55fSB0aGUgYm91bmQge0BwYXJhbSBvYmp9XG4gICAqL1xuICBiaW5kVG9UcmFuc2FjdGlvbihvYmo6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25hbE1ldGhvZHMgPSBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUoXG4gICAgICBvYmosXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBUcmFuc2FjdGlvbmFsS2V5cy5SRUZMRUNUXG4gICAgKTtcbiAgICBpZiAoIXRyYW5zYWN0aW9uYWxNZXRob2RzKSByZXR1cm4gb2JqO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgY29uc3QgYm91bmRPYmogPSBSZWZsZWN0aW9uLmdldEFsbFByb3BlcnRpZXMob2JqKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IGFueSwgazogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBPYmplY3Qua2V5cyh0cmFuc2FjdGlvbmFsTWV0aG9kcykuaW5kZXhPZihrKSAhPT0gLTEgJiZcbiAgICAgICAgICB0cmFuc2FjdGlvbmFsTWV0aG9kc1trXS5maW5kKFxuICAgICAgICAgICAgKG8pID0+IG8ua2V5ID09PSBUcmFuc2FjdGlvbmFsS2V5cy5UUkFOU0FDVElPTkFMXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgYWNjdW1ba10gPSAoLi4uYXJnczogYW55W10pID0+XG4gICAgICAgICAgICBvYmpba10uY2FsbChvYmouX19vcmlnaW5hbE9iaiB8fCBvYmosIHNlbGYsIC4uLmFyZ3MpO1xuICAgICAgICBlbHNlIGlmIChrID09PSBcImNsYXp6XCIgfHwgayA9PT0gXCJjb25zdHJ1Y3RvclwiKSBhY2N1bVtrXSA9IG9ialtrXTtcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9ialtrXSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIGFjY3VtW2tdID0gb2JqW2tdLmJpbmQob2JqLl9fb3JpZ2luYWxPYmogfHwgb2JqKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9ialtrXSA9PT0gXCJvYmplY3RcIiAmJiBvYmpba10uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBkZWNzID0gUmVmbGVjdGlvbi5nZXRDbGFzc0RlY29yYXRvcnMoXG4gICAgICAgICAgICBUcmFuc2FjdGlvbmFsS2V5cy5SRUZMRUNULFxuICAgICAgICAgICAgb2JqW2tdXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZGVjcy5maW5kKChlOiBhbnkpID0+IGUua2V5ID09PSBUcmFuc2FjdGlvbmFsS2V5cy5UUkFOU0FDVElPTkFMKSlcbiAgICAgICAgICAgIGFjY3VtW2tdID0gc2VsZi5iaW5kVG9UcmFuc2FjdGlvbihvYmpba10pO1xuICAgICAgICAgIGVsc2UgYWNjdW1ba10gPSBvYmpba107XG4gICAgICAgIH0gZWxzZSBhY2N1bVtrXSA9IG9ialtrXTtcblxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gICAgYm91bmRPYmpbREJLZXlzLk9SSUdJTkFMXSA9IG9ialtEQktleXMuT1JJR0lOQUxdIHx8IG9iajtcbiAgICBib3VuZE9iai50b1N0cmluZyA9ICgpID0+XG4gICAgICBnZXRPYmplY3ROYW1lKGJvdW5kT2JqW0RCS2V5cy5PUklHSU5BTF0pICtcbiAgICAgIFwiIHByb3h5IGZvciB0cmFuc2FjdGlvbiBcIiArXG4gICAgICB0aGlzLmlkO1xuXG4gICAgcmV0dXJuIGJvdW5kT2JqO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEZpcmVzIHRoZSBUcmFuc2FjdGlvblxuICAgKi9cbiAgZmlyZSgpIHtcbiAgICBpZiAoIXRoaXMuYWN0aW9uKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdGhlIG1ldGhvZGApO1xuICAgIHJldHVybiB0aGlzLmFjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHRvU3RyaW5nIG92ZXJyaWRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dpdGhJZF0gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoTG9nXSBkZWZhdWx0cyB0byB0cnVlXG4gICAqL1xuICB0b1N0cmluZyh3aXRoSWQgPSB0cnVlLCB3aXRoTG9nID0gZmFsc2UpIHtcbiAgICByZXR1cm4gYCR7d2l0aElkID8gYFske3RoaXMuaWR9XWAgOiBcIlwifVtUcmFuc2FjdGlvbl1bJHt0aGlzLnNvdXJjZX0uJHt0aGlzLm1ldGhvZH0ke1xuICAgICAgd2l0aExvZyA/IGBdXFxuVHJhbnNhY3Rpb24gTG9nOlxcbiR7dGhpcy5sb2cuam9pbihcIlxcblwiKX1gIDogXCJdXCJcbiAgICB9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBnZXRzIHRoZSB0cmFuc2FjdGlvbnMgcmVmbGVjdGlvbnMga2V5XG4gICAqIEBmdW5jdGlvbiBnZXRSZXBvS2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzLlRyYW5zYWN0aW9uc1xuICAgKiAqL1xuICBzdGF0aWMga2V5KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uYWxLZXlzLlJFRkxFQ1QgKyBrZXk7XG4gIH1cbn1cbiJdfQ==
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQWtEO0FBRWxELCtEQUF3RDtBQUN4RCwyREFHaUM7QUFDakMsdUNBQXdDO0FBQ3hDLCtDQUFnRDtBQUVoRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJDRztBQUNILE1BQWEsV0FBVztJQVV0QixZQUNFLE1BQWMsRUFDZCxNQUFlLEVBQ2YsTUFBa0IsRUFDbEIsUUFBZ0I7UUFFaEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUNULE1BQVcsRUFDWCxjQUFzRCxFQUN0RCxHQUFHLElBQXdCO1FBRTNCLE1BQU0sUUFBUSxHQUFhLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVU7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVyxFQUFFLEVBQUU7WUFDekMsV0FBVyxDQUFDLE9BQU8s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QUFDLEdBQVc7UUFDcEIsT0FBTyw2QkFBaUIsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3pDLENBQUM7Q0FDRjtBQWhORCxrQ0FnTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc2FjdGlvbkxvY2sgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL1RyYW5zYWN0aW9uTG9ja1wiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQ2FsbGJhY2sgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgU3luY3Jvbm91c0xvY2sgfSBmcm9tIFwiLi9sb2Nrcy9TeW5jcm9ub3VzTG9ja1wiO1xuaW1wb3J0IHtcbiAgREJLZXlzLFxuICBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0T2JqZWN0TmFtZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbmFsS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgY2xhc3NcbiAqIEBzdW1tYXJ5IE1hbmFnZXMgdHJhbnNhY3Rpb24gbGlmZWN5Y2xlLCBpbmNsdWRpbmcgY3JlYXRpb24sIGV4ZWN1dGlvbiwgYW5kIGNsZWFudXAuIFByb3ZpZGVzIG1lY2hhbmlzbXMgZm9yIGJpbmRpbmcgdHJhbnNhY3Rpb25zIHRvIG9iamVjdHMgYW5kIG1ldGhvZHMsIGVuc3VyaW5nIHByb3BlciB0cmFuc2FjdGlvbiBjb250ZXh0IHByb3BhZ2F0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIFRoZSBzb3VyY2Uvb3JpZ2luIG9mIHRoZSB0cmFuc2FjdGlvbiAodHlwaWNhbGx5IGEgY2xhc3MgbmFtZSlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWV0aG9kXSAtIFRoZSBtZXRob2QgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IGFueX0gW2FjdGlvbl0gLSBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge2FueVtdfSBbbWV0YWRhdGFdIC0gQWRkaXRpb25hbCBtZXRhZGF0YSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdHJhbnNhY3Rpb25cbiAqIEBjbGFzcyBUcmFuc2FjdGlvblxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0aW5nIGFuZCBzdWJtaXR0aW5nIGEgdHJhbnNhY3Rpb25cbiAqIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKFxuICogICAnVXNlclNlcnZpY2UnLFxuICogICAnY3JlYXRlVXNlcicsXG4gKiAgIGFzeW5jICgpID0+IHtcbiAqICAgICAvLyBUcmFuc2FjdGlvbiBsb2dpYyBoZXJlXG4gKiAgICAgYXdhaXQgZGIuaW5zZXJ0KCd1c2VycycsIHsgbmFtZTogJ0pvaG4nIH0pO1xuICogICB9XG4gKiApO1xuICogVHJhbnNhY3Rpb24uc3VibWl0KHRyYW5zYWN0aW9uKTtcbiAqIFxuICogLy8gVXNpbmcgdGhlIHRyYW5zYWN0aW9uYWwgZGVjb3JhdG9yXG4gKiBjbGFzcyBVc2VyU2VydmljZSB7XG4gKiAgIEB0cmFuc2FjdGlvbmFsKClcbiAqICAgYXN5bmMgY3JlYXRlVXNlcihkYXRhKSB7XG4gKiAgICAgLy8gTWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2l0aGluIGEgdHJhbnNhY3Rpb25cbiAqICAgICByZXR1cm4gYXdhaXQgZGIuaW5zZXJ0KCd1c2VycycsIGRhdGEpO1xuICogICB9XG4gKiB9XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50IENvZGVcbiAqICAgcGFydGljaXBhbnQgVCBhcyBUcmFuc2FjdGlvblxuICogICBwYXJ0aWNpcGFudCBMIGFzIFRyYW5zYWN0aW9uTG9ja1xuICogICBwYXJ0aWNpcGFudCBPIGFzIE9yaWdpbmFsIE1ldGhvZFxuICogICBcbiAqICAgQy0+PlQ6IG5ldyBUcmFuc2FjdGlvbihzb3VyY2UsIG1ldGhvZCwgYWN0aW9uKVxuICogICBDLT4+VDogVHJhbnNhY3Rpb24uc3VibWl0KHRyYW5zYWN0aW9uKVxuICogICBULT4+TDogc3VibWl0KHRyYW5zYWN0aW9uKVxuICogICBMLT4+VDogZmlyZSgpXG4gKiAgIFQtPj5POiBFeGVjdXRlIGFjdGlvbigpXG4gKiAgIE8tLT4+VDogUmV0dXJuIHJlc3VsdC9lcnJvclxuICogICBULT4+TDogcmVsZWFzZShlcnJvcj8pXG4gKiAgIEwtLT4+QzogUmV0dXJuIHJlc3VsdC9lcnJvclxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24ge1xuICByZWFkb25seSBpZDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWN0aW9uPzogKCkgPT4gYW55O1xuICByZWFkb25seSBtZXRob2Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZT86IHN0cmluZztcbiAgcmVhZG9ubHkgbG9nOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YT86IGFueVtdO1xuXG4gIHByaXZhdGUgc3RhdGljIGxvY2s6IFRyYW5zYWN0aW9uTG9jaztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBtZXRob2Q/OiBzdHJpbmcsXG4gICAgYWN0aW9uPzogKCkgPT4gYW55LFxuICAgIG1ldGFkYXRhPzogYW55W11cbiAgKSB7XG4gICAgdGhpcy5pZCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247XG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgdGhpcy5sb2cgPSBbW3RoaXMuaWQsIHNvdXJjZSwgbWV0aG9kXS5qb2luKFwiIHwgXCIpXTtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFF1ZXVlcyBhIHRyYW5zYWN0aW9uIGZvciBleGVjdXRpb25cbiAgICogQHN1bW1hcnkgUHVzaGVzIGEgdHJhbnNhY3Rpb24gdG8gdGhlIHF1ZXVlIGFuZCB3YWl0cyBmb3IgaXRzIHJlc29sdXRpb24uIENyZWF0ZXMgYSBuZXcgdHJhbnNhY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgaXNzdWVyIGFuZCBjYWxsYmFjayBtZXRob2QsIHRoZW4gc3VibWl0cyBpdCB0byB0aGUgdHJhbnNhY3Rpb24gbG9jay5cbiAgICogQHBhcmFtIHthbnl9IGlzc3VlciAtIEFueSBjbGFzcyBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZCBhcyAndGhpcycgd2hlbiBjYWxsaW5nIHRoZSBjYWxsYmFja01ldGhvZFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja01ldGhvZCAtIENhbGxiYWNrIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGxvZ2ljLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBpc3N1ZXIgYXMgJ3RoaXMnXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLiBMYXN0IG9uZSBtdXN0IGJlIHRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHB1c2goXG4gICAgaXNzdWVyOiBhbnksXG4gICAgY2FsbGJhY2tNZXRob2Q6ICguLi5hcmd6ejogKGFueSB8IENhbGxiYWNrKVtdKSA9PiB2b2lkLFxuICAgIC4uLmFyZ3M6IChhbnkgfCBDYWxsYmFjaylbXVxuICApIHtcbiAgICBjb25zdCBjYWxsYmFjazogQ2FsbGJhY2sgPSBhcmdzLnBvcCgpO1xuICAgIGlmICghY2FsbGJhY2sgfHwgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGNhbGxiYWNrXCIpO1xuICAgIGNvbnN0IGNiID0gKGVycj86IEVycm9yLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgVHJhbnNhY3Rpb24uZ2V0TG9jaygpXG4gICAgICAgIC5yZWxlYXNlKGVycilcbiAgICAgICAgLnRoZW4oKCkgPT4gY2FsbGJhY2soZXJyLCAuLi5hcmdzKSk7XG4gICAgfTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oXG4gICAgICBpc3N1ZXIuY29uc3RydWN0b3IubmFtZSxcbiAgICAgIGNhbGxiYWNrTWV0aG9kLm5hbWUgPyBnZXRPYmplY3ROYW1lKGNhbGxiYWNrTWV0aG9kKSA6IFwiQW5vbnltb3VzXCIsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjYWxsYmFja01ldGhvZC5jYWxsKFxuICAgICAgICAgIHRyYW5zYWN0aW9uLmJpbmRUb1RyYW5zYWN0aW9uKGlzc3VlciksXG4gICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICBjYlxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG4gICAgVHJhbnNhY3Rpb24uZ2V0TG9jaygpLnN1Ym1pdCh0cmFuc2FjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyZXMgdGhlIHRyYW5zYWN0aW9uIGxvY2sgaW1wbGVtZW50YXRpb25cbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgbG9jayBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIGZvciB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50LCBhbGxvd2luZyBjdXN0b21pemF0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBiZWhhdmlvclxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uTG9ja30gbG9jayAtIFRoZSBsb2NrIGltcGxlbWVudGF0aW9uIHRvIHVzZSBmb3IgbWFuYWdpbmcgdHJhbnNhY3Rpb25zXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0TG9jayhsb2NrOiBUcmFuc2FjdGlvbkxvY2spIHtcbiAgICB0aGlzLmxvY2sgPSBsb2NrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gbG9ja1xuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGxvY2sgaW5zdGFuY2UsIGNyZWF0aW5nIGEgZGVmYXVsdCBTeW5jcm9ub3VzTG9jayBpZiBub25lIGV4aXN0c1xuICAgKiBAcmV0dXJuIHtUcmFuc2FjdGlvbkxvY2t9IFRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGxvY2sgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIHN0YXRpYyBnZXRMb2NrKCk6IFRyYW5zYWN0aW9uTG9jayB7XG4gICAgaWYgKCF0aGlzLmxvY2spIHRoaXMubG9jayA9IG5ldyBTeW5jcm9ub3VzTG9jaygpO1xuICAgIHJldHVybiB0aGlzLmxvY2s7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiBmb3IgcHJvY2Vzc2luZ1xuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gbG9jayBmb3IgcHJvY2Vzc2luZyBhbmQgZXhlY3V0aW9uXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIHRvIHN1Ym1pdCBmb3IgcHJvY2Vzc2luZ1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHN1Ym1pdCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pIHtcbiAgICBUcmFuc2FjdGlvbi5nZXRMb2NrKCkuc3VibWl0KHRyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVsZWFzZXMgdGhlIHRyYW5zYWN0aW9uIGxvY2tcbiAgICogQHN1bW1hcnkgUmVsZWFzZXMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gbG9jaywgb3B0aW9uYWxseSB3aXRoIGFuIGVycm9yLCBhbGxvd2luZyB0aGUgbmV4dCB0cmFuc2FjdGlvbiB0byBwcm9jZWVkXG4gICAqIEBwYXJhbSB7RXJyb3J9IFtlcnJdIC0gT3B0aW9uYWwgZXJyb3IgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdHJhbnNhY3Rpb24gZXhlY3V0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxvY2sgaGFzIGJlZW4gcmVsZWFzZWRcbiAgICovXG4gIHN0YXRpYyBhc3luYyByZWxlYXNlKGVycj86IEVycm9yKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uLmdldExvY2soKS5yZWxlYXNlKGVycik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0cmFuc2FjdGlvbiBtZXRhZGF0YVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY29weSBvZiB0aGUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGVuc3VyaW5nIHRoZSBvcmlnaW5hbCBtZXRhZGF0YSByZW1haW5zIHVubW9kaWZpZWRcbiAgICogQHJldHVybiB7YW55W10gfCB1bmRlZmluZWR9IEEgY29weSBvZiB0aGUgdHJhbnNhY3Rpb24gbWV0YWRhdGEgb3IgdW5kZWZpbmVkIGlmIG5vIG1ldGFkYXRhIGV4aXN0c1xuICAgKi9cbiAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGEgPyBbLi4udGhpcy5tZXRhZGF0YV0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpbmtzIGEgbmV3IHRyYW5zYWN0aW9uIHRvIHRoZSBjdXJyZW50IG9uZVxuICAgKiBAc3VtbWFyeSBCaW5kcyBhIG5ldyB0cmFuc2FjdGlvbiBvcGVyYXRpb24gdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIHRyYW5zZmVycmluZyBsb2dzIGFuZCBiaW5kaW5nIG1ldGhvZHMgdG8gbWFpbnRhaW4gdHJhbnNhY3Rpb24gY29udGV4dFxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSBuZXh0VHJhbnNhY3Rpb24gLSBUaGUgbmV3IHRyYW5zYWN0aW9uIHRvIGJpbmQgdG8gdGhlIGN1cnJlbnQgb25lXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBiaW5kVHJhbnNhY3Rpb24obmV4dFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIC8vIGFsbChgQmluZGluZyB0aGUgezB9IHRvIHsxfWAsIG5leHRUcmFuc2FjdGlvbiwgdGhpcyk7XG4gICAgdGhpcy5sb2cucHVzaCguLi5uZXh0VHJhbnNhY3Rpb24ubG9nKTtcbiAgICBuZXh0VHJhbnNhY3Rpb24uYmluZFRyYW5zYWN0aW9uID0gdGhpcy5iaW5kVG9UcmFuc2FjdGlvbi5iaW5kKHRoaXMpO1xuICAgIG5leHRUcmFuc2FjdGlvbi5iaW5kVG9UcmFuc2FjdGlvbiA9IHRoaXMuYmluZFRvVHJhbnNhY3Rpb24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmFjdGlvbiA9IG5leHRUcmFuc2FjdGlvbi5hY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJpbmRzIGFuIG9iamVjdCB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IEJpbmRzIGEgdHJhbnNhY3Rpb25hbCBkZWNvcmF0ZWQgb2JqZWN0IHRvIHRoZSB0cmFuc2FjdGlvbiBieSBlbnN1cmluZyBhbGwgdHJhbnNhY3Rpb25hbCBtZXRob2RzIGF1dG9tYXRpY2FsbHkgcmVjZWl2ZSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBhcyB0aGVpciBmaXJzdCBhcmd1bWVudFxuICAgKiBAcGFyYW0ge2FueX0gb2JqIC0gVGhlIG9iamVjdCB0byBiaW5kIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHthbnl9IFRoZSBib3VuZCBvYmplY3Qgd2l0aCB0cmFuc2FjdGlvbi1hd2FyZSBtZXRob2Qgd3JhcHBlcnNcbiAgICovXG4gIGJpbmRUb1RyYW5zYWN0aW9uKG9iajogYW55KTogYW55IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbmFsTWV0aG9kcyA9IGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZShcbiAgICAgIG9iaixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFRyYW5zYWN0aW9uYWxLZXlzLlJFRkxFQ1RcbiAgICApO1xuICAgIGlmICghdHJhbnNhY3Rpb25hbE1ldGhvZHMpIHJldHVybiBvYmo7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBjb25zdCBib3VuZE9iaiA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydGllcyhvYmopLnJlZHVjZShcbiAgICAgIChhY2N1bTogYW55LCBrOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIE9iamVjdC5rZXlzKHRyYW5zYWN0aW9uYWxNZXRob2RzKS5pbmRleE9mKGspICE9PSAtMSAmJlxuICAgICAgICAgIHRyYW5zYWN0aW9uYWxNZXRob2RzW2tdLmZpbmQoXG4gICAgICAgICAgICAobykgPT4gby5rZXkgPT09IFRyYW5zYWN0aW9uYWxLZXlzLlRSQU5TQUNUSU9OQUxcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICBhY2N1bVtrXSA9ICguLi5hcmdzOiBhbnlbXSkgPT5cbiAgICAgICAgICAgIG9ialtrXS5jYWxsKG9iai5fX29yaWdpbmFsT2JqIHx8IG9iaiwgc2VsZiwgLi4uYXJncyk7XG4gICAgICAgIGVsc2UgaWYgKGsgPT09IFwiY2xhenpcIiB8fCBrID09PSBcImNvbnN0cnVjdG9yXCIpIGFjY3VtW2tdID0gb2JqW2tdO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqW2tdID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgYWNjdW1ba10gPSBvYmpba10uYmluZChvYmouX19vcmlnaW5hbE9iaiB8fCBvYmopO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqW2tdID09PSBcIm9iamVjdFwiICYmIG9ialtrXS5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldENsYXNzRGVjb3JhdG9ycyhcbiAgICAgICAgICAgIFRyYW5zYWN0aW9uYWxLZXlzLlJFRkxFQ1QsXG4gICAgICAgICAgICBvYmpba11cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChkZWNzLmZpbmQoKGU6IGFueSkgPT4gZS5rZXkgPT09IFRyYW5zYWN0aW9uYWxLZXlzLlRSQU5TQUNUSU9OQUwpKVxuICAgICAgICAgICAgYWNjdW1ba10gPSBzZWxmLmJpbmRUb1RyYW5zYWN0aW9uKG9ialtrXSk7XG4gICAgICAgICAgZWxzZSBhY2N1bVtrXSA9IG9ialtrXTtcbiAgICAgICAgfSBlbHNlIGFjY3VtW2tdID0gb2JqW2tdO1xuXG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG5cbiAgICBib3VuZE9ialtEQktleXMuT1JJR0lOQUxdID0gb2JqW0RCS2V5cy5PUklHSU5BTF0gfHwgb2JqO1xuICAgIGJvdW5kT2JqLnRvU3RyaW5nID0gKCkgPT5cbiAgICAgIGdldE9iamVjdE5hbWUoYm91bmRPYmpbREJLZXlzLk9SSUdJTkFMXSkgK1xuICAgICAgXCIgcHJveHkgZm9yIHRyYW5zYWN0aW9uIFwiICtcbiAgICAgIHRoaXMuaWQ7XG5cbiAgICByZXR1cm4gYm91bmRPYmo7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIHRoZSB0cmFuc2FjdGlvbiBhY3Rpb25cbiAgICogQHN1bW1hcnkgRmlyZXMgdGhlIHRyYW5zYWN0aW9uIGJ5IGV4ZWN1dGluZyBpdHMgYXNzb2NpYXRlZCBhY3Rpb24gZnVuY3Rpb24sIHRocm93aW5nIGFuIGVycm9yIGlmIG5vIGFjdGlvbiBpcyBkZWZpbmVkXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHJlc3VsdCBvZiB0aGUgdHJhbnNhY3Rpb24gYWN0aW9uXG4gICAqL1xuICBmaXJlKCkge1xuICAgIGlmICghdGhpcy5hY3Rpb24pIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB0aGUgbWV0aG9kYCk7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMgdGhlIGRlZmF1bHQgdG9TdHJpbmcgbWV0aG9kIHRvIHByb3ZpZGUgYSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiwgb3B0aW9uYWxseSBpbmNsdWRpbmcgdGhlIHRyYW5zYWN0aW9uIElEIGFuZCBsb2dcbiAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aElkPXRydWVdIC0gV2hldGhlciB0byBpbmNsdWRlIHRoZSB0cmFuc2FjdGlvbiBJRCBpbiB0aGUgb3V0cHV0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dpdGhMb2c9ZmFsc2VdIC0gV2hldGhlciB0byBpbmNsdWRlIHRoZSB0cmFuc2FjdGlvbiBsb2cgaW4gdGhlIG91dHB1dFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgdG9TdHJpbmcod2l0aElkID0gdHJ1ZSwgd2l0aExvZyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIGAke3dpdGhJZCA/IGBbJHt0aGlzLmlkfV1gIDogXCJcIn1bVHJhbnNhY3Rpb25dWyR7dGhpcy5zb3VyY2V9LiR7dGhpcy5tZXRob2R9JHtcbiAgICAgIHdpdGhMb2cgPyBgXVxcblRyYW5zYWN0aW9uIExvZzpcXG4ke3RoaXMubG9nLmpvaW4oXCJcXG5cIil9YCA6IFwiXVwiXG4gICAgfWA7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHJlZmxlY3Rpb24gbWV0YWRhdGEga2V5IGZvciB0cmFuc2FjdGlvbnNcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIHByZWZpeGVkIHJlZmxlY3Rpb24ga2V5IGZvciB0cmFuc2FjdGlvbi1yZWxhdGVkIG1ldGFkYXRhLCBlbnN1cmluZyBwcm9wZXIgbmFtZXNwYWNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBiYXNlIGtleSB0byBwcmVmaXggd2l0aCB0aGUgdHJhbnNhY3Rpb24gcmVmbGVjdGlvbiBuYW1lc3BhY2VcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29tcGxldGUgcmVmbGVjdGlvbiBrZXkgZm9yIHRyYW5zYWN0aW9uIG1ldGFkYXRhXG4gICAqIEBmdW5jdGlvbiBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25hbEtleXMuUkVGTEVDVCArIGtleTtcbiAgfVxufVxuIl19
@@ -1,16 +1,48 @@
1
1
  import { TransactionLock } from "./interfaces/TransactionLock";
2
2
  import { Callback } from "./types";
3
3
  /**
4
- * @summary Transaction Class
5
- *
6
- * @param {string} source
7
- * @param {string} [method]
8
- * @param {function(): void} [action]
9
- * @param {any[]} [metadata]
10
- *
4
+ * @description Core transaction management class
5
+ * @summary Manages transaction lifecycle, including creation, execution, and cleanup. Provides mechanisms for binding transactions to objects and methods, ensuring proper transaction context propagation.
6
+ * @param {string} source - The source/origin of the transaction (typically a class name)
7
+ * @param {string} [method] - The method name associated with the transaction
8
+ * @param {function(): any} [action] - The function to execute within the transaction
9
+ * @param {any[]} [metadata] - Additional metadata to associate with the transaction
11
10
  * @class Transaction
11
+ * @example
12
+ * // Creating and submitting a transaction
13
+ * const transaction = new Transaction(
14
+ * 'UserService',
15
+ * 'createUser',
16
+ * async () => {
17
+ * // Transaction logic here
18
+ * await db.insert('users', { name: 'John' });
19
+ * }
20
+ * );
21
+ * Transaction.submit(transaction);
12
22
  *
13
- * @category Transactions
23
+ * // Using the transactional decorator
24
+ * class UserService {
25
+ * @transactional()
26
+ * async createUser(data) {
27
+ * // Method will be executed within a transaction
28
+ * return await db.insert('users', data);
29
+ * }
30
+ * }
31
+ * @mermaid
32
+ * sequenceDiagram
33
+ * participant C as Client Code
34
+ * participant T as Transaction
35
+ * participant L as TransactionLock
36
+ * participant O as Original Method
37
+ *
38
+ * C->>T: new Transaction(source, method, action)
39
+ * C->>T: Transaction.submit(transaction)
40
+ * T->>L: submit(transaction)
41
+ * L->>T: fire()
42
+ * T->>O: Execute action()
43
+ * O-->>T: Return result/error
44
+ * T->>L: release(error?)
45
+ * L-->>C: Return result/error
14
46
  */
15
47
  export declare class Transaction {
16
48
  readonly id: number;
@@ -22,65 +54,81 @@ export declare class Transaction {
22
54
  private static lock;
23
55
  constructor(source: string, method?: string, action?: () => any, metadata?: any[]);
24
56
  /**
25
- * @summary Pushes a transaction to que queue and waits its resolution
26
- *
27
- * @param {any} issuer any class. will be used as this when calling the callbackMethod
28
- * @param {Function} callbackMethod callback function containing the transaction. will be called with the issuear as this
29
- * @param {any[]} args arguments to pass to the method. Last one must be the callback
57
+ * @description Queues a transaction for execution
58
+ * @summary Pushes a transaction to the queue and waits for its resolution. Creates a new transaction with the provided issuer and callback method, then submits it to the transaction lock.
59
+ * @param {any} issuer - Any class instance that will be used as 'this' when calling the callbackMethod
60
+ * @param {Function} callbackMethod - Callback function containing the transaction logic, will be called with the issuer as 'this'
61
+ * @param {any[]} args - Arguments to pass to the method. Last one must be the callback function
62
+ * @return {void}
30
63
  */
31
64
  static push(issuer: any, callbackMethod: (...argzz: (any | Callback)[]) => void, ...args: (any | Callback)[]): void;
32
65
  /**
33
- * @summary Sets the lock to be used
34
- * @param lock
66
+ * @description Configures the transaction lock implementation
67
+ * @summary Sets the lock implementation to be used for transaction management, allowing customization of the transaction behavior
68
+ * @param {TransactionLock} lock - The lock implementation to use for managing transactions
69
+ * @return {void}
35
70
  */
36
71
  static setLock(lock: TransactionLock): void;
37
72
  /**
38
- * @summary gets the lock
73
+ * @description Retrieves the current transaction lock
74
+ * @summary Gets the current transaction lock instance, creating a default SyncronousLock if none exists
75
+ * @return {TransactionLock} The current transaction lock implementation
39
76
  */
40
77
  static getLock(): TransactionLock;
41
78
  /**
42
- * @summary submits a transaction
43
- * @param {Transaction} transaction
79
+ * @description Submits a transaction for processing
80
+ * @summary Submits a transaction to the current transaction lock for processing and execution
81
+ * @param {Transaction} transaction - The transaction to submit for processing
82
+ * @return {void}
44
83
  */
45
84
  static submit(transaction: Transaction): void;
46
85
  /**
47
- * @summary releases the lock
48
- * @param {Err} err
86
+ * @description Releases the transaction lock
87
+ * @summary Releases the current transaction lock, optionally with an error, allowing the next transaction to proceed
88
+ * @param {Error} [err] - Optional error that occurred during transaction execution
89
+ * @return {Promise<void>} A promise that resolves when the lock has been released
49
90
  */
50
91
  static release(err?: Error): Promise<void>;
51
92
  /**
52
- * @summary retrieves the metadata for the transaction
93
+ * @description Retrieves transaction metadata
94
+ * @summary Returns a copy of the metadata associated with this transaction, ensuring the original metadata remains unmodified
95
+ * @return {any[] | undefined} A copy of the transaction metadata or undefined if no metadata exists
53
96
  */
54
97
  getMetadata(): any[] | undefined;
55
98
  /**
56
- * @summary Binds a new operation to the current transaction
57
- * @param {Transaction} nextTransaction
99
+ * @description Links a new transaction to the current one
100
+ * @summary Binds a new transaction operation to the current transaction, transferring logs and binding methods to maintain transaction context
101
+ * @param {Transaction} nextTransaction - The new transaction to bind to the current one
102
+ * @return {void}
58
103
  */
59
104
  bindTransaction(nextTransaction: Transaction): void;
60
105
  /**
61
- * @summary Binds the Transactional Decorated Object to the transaction
62
- * @description by having all {@link transactional} decorated
63
- * methods always pass the current Transaction as an argument
64
- *
65
- * @param {any} obj
66
- * @return {any} the bound {@param obj}
106
+ * @description Binds an object to the current transaction context
107
+ * @summary Binds a transactional decorated object to the transaction by ensuring all transactional methods automatically receive the current transaction as their first argument
108
+ * @param {any} obj - The object to bind to the transaction
109
+ * @return {any} The bound object with transaction-aware method wrappers
67
110
  */
68
111
  bindToTransaction(obj: any): any;
69
112
  /**
70
- * @summary Fires the Transaction
113
+ * @description Executes the transaction action
114
+ * @summary Fires the transaction by executing its associated action function, throwing an error if no action is defined
115
+ * @return {any} The result of the transaction action
71
116
  */
72
117
  fire(): any;
73
118
  /**
74
- * @summary toString override
75
- * @param {boolean} [withId] defaults to true
76
- * @param {boolean} [withLog] defaults to true
119
+ * @description Provides a string representation of the transaction
120
+ * @summary Overrides the default toString method to provide a formatted string representation of the transaction, optionally including the transaction ID and log
121
+ * @param {boolean} [withId=true] - Whether to include the transaction ID in the output
122
+ * @param {boolean} [withLog=false] - Whether to include the transaction log in the output
123
+ * @return {string} A string representation of the transaction
77
124
  */
78
125
  toString(withId?: boolean, withLog?: boolean): string;
79
126
  /**
80
- * @summary gets the transactions reflections key
81
- * @function getRepoKey
82
- * @param {string} key
83
- * @memberOf module:db-decorators.Transactions
84
- * */
127
+ * @description Generates a reflection metadata key for transactions
128
+ * @summary Creates a prefixed reflection key for transaction-related metadata, ensuring proper namespacing
129
+ * @param {string} key - The base key to prefix with the transaction reflection namespace
130
+ * @return {string} The complete reflection key for transaction metadata
131
+ * @function key
132
+ */
85
133
  static key(key: string): string;
86
134
  }
package/lib/constants.cjs CHANGED
@@ -1,8 +1,21 @@
1
1
  "use strict";
2
+ /**
3
+ * @typedef {Object} TransactionalKeysType
4
+ * @property {string} REFLECT - Key used for reflection metadata related to transactional models
5
+ * @property {string} TRANSACTIONAL - Key used to identify transactional properties
6
+ * @memberOf module:transactions
7
+ */
2
8
  Object.defineProperty(exports, "__esModule", { value: true });
3
9
  exports.TransactionalKeys = void 0;
10
+ /**
11
+ * @description Keys used for transactional operations
12
+ * @summary Constant object containing string keys used throughout the transactional system for reflection and identification
13
+ * @type {TransactionalKeysType}
14
+ * @const TransactionalKeys
15
+ * @memberOf module:transactions
16
+ */
4
17
  exports.TransactionalKeys = {
5
18
  REFLECT: "model.transactional.",
6
19
  TRANSACTIONAL: "transactional",
7
20
  };
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLGlCQUFpQixHQUEyQjtJQUN2RCxPQUFPLEVBQUUsc0JBQXNCO0lBQy9CLGFBQWEsRUFBRSxlQUFlO0NBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgVHJhbnNhY3Rpb25hbEtleXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIFJFRkxFQ1Q6IFwibW9kZWwudHJhbnNhY3Rpb25hbC5cIixcbiAgVFJBTlNBQ1RJT05BTDogXCJ0cmFuc2FjdGlvbmFsXCIsXG59O1xuIl19
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7OztBQUVIOzs7Ozs7R0FNRztBQUNVLFFBQUEsaUJBQWlCLEdBQTJCO0lBQ3ZELE9BQU8sRUFBRSxzQkFBc0I7SUFDL0IsYUFBYSxFQUFFLGVBQWU7Q0FDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJhbnNhY3Rpb25hbEtleXNUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCAtIEtleSB1c2VkIGZvciByZWZsZWN0aW9uIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdHJhbnNhY3Rpb25hbCBtb2RlbHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUUkFOU0FDVElPTkFMIC0gS2V5IHVzZWQgdG8gaWRlbnRpZnkgdHJhbnNhY3Rpb25hbCBwcm9wZXJ0aWVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnRyYW5zYWN0aW9uc1xuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleXMgdXNlZCBmb3IgdHJhbnNhY3Rpb25hbCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBDb25zdGFudCBvYmplY3QgY29udGFpbmluZyBzdHJpbmcga2V5cyB1c2VkIHRocm91Z2hvdXQgdGhlIHRyYW5zYWN0aW9uYWwgc3lzdGVtIGZvciByZWZsZWN0aW9uIGFuZCBpZGVudGlmaWNhdGlvblxuICogQHR5cGUge1RyYW5zYWN0aW9uYWxLZXlzVHlwZX1cbiAqIEBjb25zdCBUcmFuc2FjdGlvbmFsS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTp0cmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IFRyYW5zYWN0aW9uYWxLZXlzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBSRUZMRUNUOiBcIm1vZGVsLnRyYW5zYWN0aW9uYWwuXCIsXG4gIFRSQU5TQUNUSU9OQUw6IFwidHJhbnNhY3Rpb25hbFwiLFxufTtcbiJdfQ==
@@ -1 +1,14 @@
1
+ /**
2
+ * @typedef {Object} TransactionalKeysType
3
+ * @property {string} REFLECT - Key used for reflection metadata related to transactional models
4
+ * @property {string} TRANSACTIONAL - Key used to identify transactional properties
5
+ * @memberOf module:transactions
6
+ */
7
+ /**
8
+ * @description Keys used for transactional operations
9
+ * @summary Constant object containing string keys used throughout the transactional system for reflection and identification
10
+ * @type {TransactionalKeysType}
11
+ * @const TransactionalKeys
12
+ * @memberOf module:transactions
13
+ */
1
14
  export declare const TransactionalKeys: Record<string, string>;
@@ -7,13 +7,36 @@ const reflection_1 = require("@decaf-ts/reflection");
7
7
  const Transaction_1 = require("./Transaction.cjs");
8
8
  const db_decorators_1 = require("@decaf-ts/db-decorators");
9
9
  /**
10
- * @summary Sets a class Async method as transactional
10
+ * @description Method decorator that enables transactional behavior
11
+ * @summary Sets a class async method as transactional, wrapping it in a transaction context that can be managed by the transaction system. This decorator handles transaction creation, binding, and error handling.
12
+ * @param {any[]} [data] - Optional metadata available to the {@link TransactionLock} implementation
13
+ * @return {Function} A decorator function that wraps the original method with transactional behavior
14
+ * @function transactional
15
+ * @category Method Decorators
16
+ * @mermaid
17
+ * sequenceDiagram
18
+ * participant C as Client Code
19
+ * participant D as Decorator
20
+ * participant T as Transaction
21
+ * participant O as Original Method
11
22
  *
12
- * @param {any[]} [data] option metadata available to the {@link TransactionLock}
23
+ * C->>D: Call decorated method
24
+ * D->>D: Check if transaction exists in args
13
25
  *
14
- * @function transactional
26
+ * alt Transaction exists in args
27
+ * D->>T: Create updated transaction
28
+ * T->>T: Bind to original transaction
29
+ * T->>T: Fire transaction
30
+ * else No transaction
31
+ * D->>T: Create new transaction
32
+ * T->>T: Submit transaction
33
+ * end
15
34
  *
16
- * @memberOf module:db-decorators.Decorators.transactions
35
+ * T->>O: Execute original method
36
+ * O-->>T: Return result/error
37
+ * T->>T: Release transaction
38
+ * T-->>C: Return result/error
39
+ * @category Decorators
17
40
  */
18
41
  function transactional(...data) {
19
42
  return function (target, propertyKey, descriptor) {
@@ -152,16 +175,17 @@ function transactional(...data) {
152
175
  // };
153
176
  // }
154
177
  /**
155
- * @summary Util function to wrap super calls with the transaction when the super's method is also transactional
156
- *
157
- * @param {Function} method the super method (must be bound to the proper this), eg: super.create.bind(this)
158
- * @param {any[]} args the arguments to call the method with
159
- *
160
- * @memberOf module:db-decorators.Transaction
178
+ * @description Utility for handling super calls in transactional methods
179
+ * @summary Wraps super method calls with the current transaction context when the super's method is also transactional, ensuring transaction continuity through the inheritance chain
180
+ * @param {Function} method - The super method (must be bound to the proper this), e.g., super.create.bind(this)
181
+ * @param {any[]} args - The arguments to call the method with
182
+ * @return {any} The result of the super method call
183
+ * @function transactionalSuperCall
184
+ * @memberOf module:transactions
161
185
  */
162
186
  function transactionalSuperCall(method, ...args) {
163
187
  const lock = Transaction_1.Transaction.getLock();
164
188
  const currentTransaction = lock.currentTransaction;
165
189
  return method(currentTransaction, ...args);
166
190
  }
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBY0Esc0NBaUVDO0FBb0dELHdEQUlDO0FBdkxELCtDQUFnRDtBQUNoRCxxREFBZ0Q7QUFDaEQsbURBQTRDO0FBQzVDLDJEQUF3RDtBQUV4RDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxHQUFHLElBQVc7SUFDMUMsT0FBTyxVQUNMLE1BQVcsRUFDWCxXQUFpQixFQUNqQixVQUErQjtRQUUvQixJQUFJLENBQUMsVUFBVTtZQUNiLE1BQU0sSUFBSSw2QkFBYSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDdEUsSUFBQSxxQkFBUSxFQUFDLHlCQUFXLENBQUMsR0FBRyxDQUFDLDZCQUFpQixDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUM5RCxNQUFNLEVBQ04sV0FBVyxDQUNaLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBRXhDLE1BQU0sYUFBYSxHQUFHLFVBQXFCLEdBQUcsSUFBVztZQUN2RCw0REFBNEQ7WUFDNUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxPQUFPLENBQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQzFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBVyxFQUFFLE1BQVksRUFBRSxFQUFFO29CQUN2Qyx5QkFBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO3dCQUNqQyxJQUFJLEdBQUc7NEJBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDO2dCQUVGLElBQUksV0FBVyxHQUFHLElBQUksQ0FB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O0FBQ2IsRUFBRTtBQUNGLDJEQUEyRDtBQUMzRCw4QkFBOEI7QUFDOUIsaUJBQWlCO0FBQ2pCLHFDQUFxQztBQUNyQyxtQ0FBbUM7QUFDbkMseUNBQXlDO0FBQ3pDLG1DQUFtQztBQUNuQyx5QkFBeUI7QUFDekIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQiw0Q0FBNEM7QUFDNUMsdURBQXVEO0FBQ3ZELDJCQUEyQjtBQUMzQixzQkFBc0I7QUFDdEIsbUJBQW1CO0FBQ25CLGlDQUFpQztBQUNqQyw4QkFBOEI7QUFDOUIsZ0JBQWdCO0FBQ2hCLGVBQWU7QUFDZixvREFBb0Q7QUFDcEQsYUFBYTtBQUNiLDJDQUEyQztBQUMzQyxVQUFVO0FBQ1YsU0FBUztBQUNULEVBQUU7QUFDRixxREFBcUQ7QUFDckQsNEJBQTRCO0FBQzVCLFVBQVU7QUFDVix3Q0FBd0M7QUFDeEMsT0FBTztBQUNQLElBQUk7QUFFSjs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsTUFBVyxFQUFFLEdBQUcsSUFBUztJQUM5RCxNQUFNLElBQUksR0FBRyx5QkFBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25DLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ25ELE9BQU8sTUFBTSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zYWN0aW9uYWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tIFwiLi9UcmFuc2FjdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFNldHMgYSBjbGFzcyBBc3luYyBtZXRob2QgYXMgdHJhbnNhY3Rpb25hbFxuICpcbiAqIEBwYXJhbSB7YW55W119ICBbZGF0YV0gb3B0aW9uIG1ldGFkYXRhIGF2YWlsYWJsZSB0byB0aGUge0BsaW5rIFRyYW5zYWN0aW9uTG9ja31cbiAqXG4gKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25hbFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5EZWNvcmF0b3JzLnRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25hbCguLi5kYXRhOiBhbnlbXSkge1xuICByZXR1cm4gZnVuY3Rpb24gKFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgaWYgKCFkZXNjcmlwdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIGRlc2NyaXB0b3IuIFNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgIG1ldGFkYXRhKFRyYW5zYWN0aW9uLmtleShUcmFuc2FjdGlvbmFsS2V5cy5UUkFOU0FDVElPTkFMKSwgZGF0YSkoXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG5cbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBjb25zdCBtZXRob2RXcmFwcGVyID0gZnVuY3Rpb24gKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2IgPSAoZXJyPzogRXJyb3IsIHJlc3VsdD86IGFueSkgPT4ge1xuICAgICAgICAgIFRyYW5zYWN0aW9uLnJlbGVhc2UoZXJyKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgdHJhbnNhY3Rpb24gPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihcbiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBvcmlnaW5hbE1ldGhvZFxuICAgICAgICAgICAgICAgIC5jYWxsKHVwZGF0ZWRUcmFuc2FjdGlvbi5iaW5kVG9UcmFuc2FjdGlvbihzZWxmKSwgLi4uYXJncylcbiAgICAgICAgICAgICAgICAudGhlbihyZXNvbHZlKVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGEubGVuZ3RoID8gZGF0YSA6IHVuZGVmaW5lZFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0cmFuc2FjdGlvbi5iaW5kVHJhbnNhY3Rpb24odXBkYXRlZFRyYW5zYWN0aW9uKTtcbiAgICAgICAgICB0cmFuc2FjdGlvbi5maXJlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXJncy51bnNoaWZ0KHRyYW5zYWN0aW9uKTtcbiAgICAgICAgICB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihcbiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICBvcmlnaW5hbE1ldGhvZFxuICAgICAgICAgICAgICAgIC5jYWxsKHRyYW5zYWN0aW9uLmJpbmRUb1RyYW5zYWN0aW9uKHNlbGYpLCAuLi5hcmdzKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IGFueSkgPT4gY2IodW5kZWZpbmVkLCByZXN1bHQpKVxuICAgICAgICAgICAgICAgIC5jYXRjaChjYik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0YS5sZW5ndGggPyBkYXRhIDogdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBUcmFuc2FjdGlvbi5zdWJtaXQodHJhbnNhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1ldGhvZFdyYXBwZXIsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogcHJvcGVydHlLZXksXG4gICAgfSk7XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IG1ldGhvZFdyYXBwZXI7XG4gIH07XG59XG4vL1xuLy8gLyoqXG4vLyAgKiBAc3VtbWFyeSBTZXRzIGEgY2xhc3MgQXN5bmMgbWV0aG9kIGFzIHRyYW5zYWN0aW9uYWxcbi8vICAqXG4vLyAgKiBAcGFyYW0ge2FueVtdfSAgW21ldGFkYXRhXSBvcHRpb24gbWV0YWRhdGEgYXZhaWxhYmxlIHRvIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25Mb2NrfVxuLy8gICpcbi8vICAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvbmFsQXN5bmNcbi8vICAqXG4vLyAgKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnMuRGVjb3JhdG9ycy50cmFuc2FjdGlvbnNcbi8vICAqL1xuLy8gZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uYWxBc3luYyguLi5tZXRhZGF0YTogYW55W10pIHtcbi8vICAgcmV0dXJuIGZ1bmN0aW9uIChcbi8vICAgICB0YXJnZXQ6IGFueSxcbi8vICAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuLy8gICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcixcbi8vICAgKSB7XG4vLyAgICAgbWV0YWRhc3RhKGdldFRyYW5zYWN0aW9uYWxLZXkoVHJhbnNhY3Rpb25hbEtleXMuVFJBTlNBQ1RJT05BTCkpXG4vLyAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbi8vICAgICAgICxcbi8vICAgICAgIHtcbi8vICAgICAgICAgdHlwZTogXCJhc3luY1wiLFxuLy8gICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEubGVuZ3RoID8gbWV0YWRhdGEgOiB1bmRlZmluZWQsXG4vLyAgICAgICB9IGFzIFRyYW5zYWN0aW9uYWxNZXRhZGF0YSxcbi8vICAgICAgIHRhcmdldCxcbi8vICAgICAgIHByb3BlcnR5S2V5LFxuLy8gICAgICk7XG4vL1xuLy8gICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbi8vXG4vLyAgICAgY29uc3QgbWV0aG9kV3JhcHBlciA9IGZ1bmN0aW9uICh0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4vLyAgICAgICBjb25zdCBjYWxsYmFjazogQ2FsbGJhY2sgPSBhcmdzLnBvcCgpO1xuLy8gICAgICAgaWYgKCFjYWxsYmFjayB8fCB0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIilcbi8vICAgICAgICAgdGhyb3cgbmV3IENyaXRpY2FsRXJyb3IoYE1pc3NpbmcgQ2FsbGJhY2tgKTtcbi8vXG4vLyAgICAgICBjb25zdCBjYiA9IChlcnI/OiBFcnIsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4vLyAgICAgICAgIFRyYW5zYWN0aW9uLnJlbGVhc2UoZXJyKS50aGVuKChfKSA9PiBjYWxsYmFjayhlcnIsIC4uLmFyZ3MpKTtcbi8vICAgICAgIH07XG4vL1xuLy8gICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4vL1xuLy8gICAgICAgbGV0IHRyYW5zYWN0aW9uID0gYXJncy5zaGlmdCgpO1xuLy8gICAgICAgaWYgKHRyYW5zYWN0aW9uIGluc3RhbmNlb2YgVHJhbnNhY3Rpb24pIHtcbi8vICAgICAgICAgY29uc3QgdXBkYXRlZFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihcbi8vICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsXG4vLyAgICAgICAgICAgcHJvcGVydHlLZXksXG4vLyAgICAgICAgICAgKCkgPT4ge1xuLy8gICAgICAgICAgICAgdHJ5IHtcbi8vICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmNhbGwoXG4vLyAgICAgICAgICAgICAgICAgdXBkYXRlZFRyYW5zYWN0aW9uLmJpbmRUb1RyYW5zYWN0aW9uKHNlbGYpLFxuLy8gICAgICAgICAgICAgICAgIC4uLmFyZ3MsXG4vLyAgICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4vLyAgICAgICAgICAgICAgICk7XG4vLyAgICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbi8vICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGUpO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgbWV0YWRhdGEubGVuZ3RoID8gbWV0YWRhdGEgOiB1bmRlZmluZWQsXG4vLyAgICAgICAgICk7XG4vL1xuLy8gICAgICAgICB0cmFuc2FjdGlvbi5iaW5kVHJhbnNhY3Rpb24odXBkYXRlZFRyYW5zYWN0aW9uKTtcbi8vICAgICAgICAgdHJhbnNhY3Rpb24uZmlyZSgpO1xuLy8gICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgYXJncy51bnNoaWZ0KHRyYW5zYWN0aW9uKTtcbi8vICAgICAgICAgdHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4vLyAgICAgICAgIHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKFxuLy8gICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IubmFtZSxcbi8vICAgICAgICAgICBwcm9wZXJ0eUtleSxcbi8vICAgICAgICAgICAoKSA9PiB7XG4vLyAgICAgICAgICAgICB0cnkge1xuLy8gICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuY2FsbChcbi8vICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5iaW5kVG9UcmFuc2FjdGlvbihzZWxmKSxcbi8vICAgICAgICAgICAgICAgICAuLi5hcmdzLFxuLy8gICAgICAgICAgICAgICAgIGNiLFxuLy8gICAgICAgICAgICAgICApO1xuLy8gICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4vLyAgICAgICAgICAgICAgIHJldHVybiBjYihlKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICB9LFxuLy8gICAgICAgICAgIG1ldGFkYXRhLmxlbmd0aCA/IG1ldGFkYXRhIDogdW5kZWZpbmVkLFxuLy8gICAgICAgICApO1xuLy8gICAgICAgICBUcmFuc2FjdGlvbi5zdWJtaXQodHJhbnNhY3Rpb24pO1xuLy8gICAgICAgfVxuLy8gICAgIH07XG4vL1xuLy8gICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXRob2RXcmFwcGVyLCBcIm5hbWVcIiwge1xuLy8gICAgICAgdmFsdWU6IHByb3BlcnR5S2V5LFxuLy8gICAgIH0pO1xuLy8gICAgIGRlc2NyaXB0b3IudmFsdWUgPSBtZXRob2RXcmFwcGVyO1xuLy8gICB9O1xuLy8gfVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gd3JhcCBzdXBlciBjYWxscyB3aXRoIHRoZSB0cmFuc2FjdGlvbiB3aGVuIHRoZSBzdXBlcidzIG1ldGhvZCBpcyBhbHNvIHRyYW5zYWN0aW9uYWxcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgdGhlIHN1cGVyIG1ldGhvZCAobXVzdCBiZSBib3VuZCB0byB0aGUgcHJvcGVyIHRoaXMpLCBlZzogc3VwZXIuY3JlYXRlLmJpbmQodGhpcylcbiAqIEBwYXJhbSB7YW55W119IGFyZ3MgdGhlIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5UcmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25hbFN1cGVyQ2FsbChtZXRob2Q6IGFueSwgLi4uYXJnczogYW55KSB7XG4gIGNvbnN0IGxvY2sgPSBUcmFuc2FjdGlvbi5nZXRMb2NrKCk7XG4gIGNvbnN0IGN1cnJlbnRUcmFuc2FjdGlvbiA9IGxvY2suY3VycmVudFRyYW5zYWN0aW9uO1xuICByZXR1cm4gbWV0aG9kKGN1cnJlbnRUcmFuc2FjdGlvbiwgLi4uYXJncyk7XG59XG4iXX0=
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBcUNBLHNDQWlFQztBQXFHRCx3REFJQztBQS9NRCwrQ0FBZ0Q7QUFDaEQscURBQWdEO0FBQ2hELG1EQUE0QztBQUM1QywyREFBd0Q7QUFFeEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxTQUFnQixhQUFhLENBQUMsR0FBRyxJQUFXO0lBQzFDLE9BQU8sVUFDTCxNQUFXLEVBQ1gsV0FBaUIsRUFDakIsVUFBK0I7UUFFL0IsSUFBSSxDQUFDLFVBQVU7WUFDYixNQUFNLElBQUksNkJBQWEsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQ3RFLElBQUEscUJBQVEsRUFBQyx5QkFBVyxDQUFDLEdBQUcsQ0FBQyw2QkFBaUIsQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FDOUQsTUFBTSxFQUNOLFdBQVcsQ0FDWixDQUFDO1FBRUYsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUV4QyxNQUFNLGFBQWEsR0FBRyxVQUFxQixHQUFHLElBQVc7WUFDdkQsNERBQTREO1lBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztZQUNsQixPQUFPLElBQUksT0FBTyxDQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUMxQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQVcsRUFBRSxNQUFZLEVBQUUsRUFBRTtvQkFDdkMseUJBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTt3QkFDakMsSUFBSSxHQUFHOzRCQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUM1QixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2xCLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQztnQkFF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QWU7QUFDZixvREFBb0Q7QUFDcEQsYUFBYTtBQUNiLEVBQUU7QUFDRiwyREFBMkQ7QUFDM0QsOEJBQThCO0FBQzlCLGlCQUFpQjtBQUNqQixxQ0FBcUM7QUFDckMsbUNBQW1DO0FBQ25DLHlDQUF5QztBQUN6QyxtQ0FBbUM7QUFDbkMseUJBQXlCO0FBQ3pCLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsNENBQTRDO0FBQzVDLHVEQUF1RDtBQUN2RCwyQkFBMkI7QUFDM0Isc0JBQXNCO0FBQ3RCLG1CQUFtQjtBQUNuQixpQ0FBaUM7QUFDakMsOEJBQThCO0FBQzlCLGdCQUFnQjtBQUNoQixlQUFlO0FBQ2Ysb0RBQW9EO0FBQ3BELGFBQWE7QUFDYiwyQ0FBMkM7QUFDM0MsVUFBVTtBQUNWLFNBQVM7QUFDVCxFQUFFO0FBQ0YscURBQXFEO0FBQ3JELDRCQUE0QjtBQUM1QixVQUFVO0FBQ1Ysd0NBQXdDO0FBQ3hDLE9BQU87QUFDUCxJQUFJO0FBRUo7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxNQUFXLEVBQUUsR0FBRyxJQUFTO0lBQzlELE1BQU0sSUFBSSxHQUFHLHlCQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDbkQsT0FBTyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb25hbEtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gXCIuL1RyYW5zYWN0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgdGhhdCBlbmFibGVzIHRyYW5zYWN0aW9uYWwgYmVoYXZpb3JcbiAqIEBzdW1tYXJ5IFNldHMgYSBjbGFzcyBhc3luYyBtZXRob2QgYXMgdHJhbnNhY3Rpb25hbCwgd3JhcHBpbmcgaXQgaW4gYSB0cmFuc2FjdGlvbiBjb250ZXh0IHRoYXQgY2FuIGJlIG1hbmFnZWQgYnkgdGhlIHRyYW5zYWN0aW9uIHN5c3RlbS4gVGhpcyBkZWNvcmF0b3IgaGFuZGxlcyB0cmFuc2FjdGlvbiBjcmVhdGlvbiwgYmluZGluZywgYW5kIGVycm9yIGhhbmRsaW5nLlxuICogQHBhcmFtIHthbnlbXX0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgYXZhaWxhYmxlIHRvIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25Mb2NrfSBpbXBsZW1lbnRhdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIG1ldGhvZCB3aXRoIHRyYW5zYWN0aW9uYWwgYmVoYXZpb3JcbiAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvbmFsXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnQgQ29kZVxuICogICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBUIGFzIFRyYW5zYWN0aW9uXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT3JpZ2luYWwgTWV0aG9kXG4gKlxuICogICBDLT4+RDogQ2FsbCBkZWNvcmF0ZWQgbWV0aG9kXG4gKiAgIEQtPj5EOiBDaGVjayBpZiB0cmFuc2FjdGlvbiBleGlzdHMgaW4gYXJnc1xuICpcbiAqICAgYWx0IFRyYW5zYWN0aW9uIGV4aXN0cyBpbiBhcmdzXG4gKiAgICAgRC0+PlQ6IENyZWF0ZSB1cGRhdGVkIHRyYW5zYWN0aW9uXG4gKiAgICAgVC0+PlQ6IEJpbmQgdG8gb3JpZ2luYWwgdHJhbnNhY3Rpb25cbiAqICAgICBULT4+VDogRmlyZSB0cmFuc2FjdGlvblxuICogICBlbHNlIE5vIHRyYW5zYWN0aW9uXG4gKiAgICAgRC0+PlQ6IENyZWF0ZSBuZXcgdHJhbnNhY3Rpb25cbiAqICAgICBULT4+VDogU3VibWl0IHRyYW5zYWN0aW9uXG4gKiAgIGVuZFxuICpcbiAqICAgVC0+Pk86IEV4ZWN1dGUgb3JpZ2luYWwgbWV0aG9kXG4gKiAgIE8tLT4+VDogUmV0dXJuIHJlc3VsdC9lcnJvclxuICogICBULT4+VDogUmVsZWFzZSB0cmFuc2FjdGlvblxuICogICBULS0+PkM6IFJldHVybiByZXN1bHQvZXJyb3JcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbmFsKC4uLmRhdGE6IGFueVtdKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBpZiAoIWRlc2NyaXB0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgZGVzY3JpcHRvci4gU2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgbWV0YWRhdGEoVHJhbnNhY3Rpb24ua2V5KFRyYW5zYWN0aW9uYWxLZXlzLlRSQU5TQUNUSU9OQUwpLCBkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcblxuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgIGNvbnN0IG1ldGhvZFdyYXBwZXIgPSBmdW5jdGlvbiAodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8YW55PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBjYiA9IChlcnI/OiBFcnJvciwgcmVzdWx0PzogYW55KSA9PiB7XG4gICAgICAgICAgVHJhbnNhY3Rpb24ucmVsZWFzZShlcnIpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uIGluc3RhbmNlb2YgVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKFxuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kXG4gICAgICAgICAgICAgICAgLmNhbGwodXBkYXRlZFRyYW5zYWN0aW9uLmJpbmRUb1RyYW5zYWN0aW9uKHNlbGYpLCAuLi5hcmdzKVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0YS5sZW5ndGggPyBkYXRhIDogdW5kZWZpbmVkXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRyYW5zYWN0aW9uLmJpbmRUcmFuc2FjdGlvbih1cGRhdGVkVHJhbnNhY3Rpb24pO1xuICAgICAgICAgIHRyYW5zYWN0aW9uLmZpcmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcmdzLnVuc2hpZnQodHJhbnNhY3Rpb24pO1xuICAgICAgICAgIHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKFxuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kXG4gICAgICAgICAgICAgICAgLmNhbGwodHJhbnNhY3Rpb24uYmluZFRvVHJhbnNhY3Rpb24oc2VsZiksIC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogYW55KSA9PiBjYih1bmRlZmluZWQsIHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGNiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRhLmxlbmd0aCA/IGRhdGEgOiB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIFRyYW5zYWN0aW9uLnN1Ym1pdCh0cmFuc2FjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobWV0aG9kV3JhcHBlciwgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBwcm9wZXJ0eUtleSxcbiAgICB9KTtcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gbWV0aG9kV3JhcHBlcjtcbiAgfTtcbn1cbi8vXG4vLyAvKipcbi8vICAqIEBzdW1tYXJ5IFNldHMgYSBjbGFzcyBBc3luYyBtZXRob2QgYXMgdHJhbnNhY3Rpb25hbFxuLy8gICpcbi8vICAqIEBwYXJhbSB7YW55W119ICBbbWV0YWRhdGFdIG9wdGlvbiBtZXRhZGF0YSBhdmFpbGFibGUgdG8gdGhlIHtAbGluayBUcmFuc2FjdGlvbkxvY2t9XG4vLyAgKlxuLy8gICogQGZ1bmN0aW9uIHRyYW5zYWN0aW9uYWxBc3luY1xuLy8gICpcbi8vICAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5EZWNvcmF0b3JzLnRyYW5zYWN0aW9uc1xuLy8gICovXG4vLyBleHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25hbEFzeW5jKC4uLm1ldGFkYXRhOiBhbnlbXSkge1xuLy8gICByZXR1cm4gZnVuY3Rpb24gKFxuLy8gICAgIHRhcmdldDogYW55LFxuLy8gICAgIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4vLyAgICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yLFxuLy8gICApIHtcbi8vICAgICBtZXRhZGFzdGEoZ2V0VHJhbnNhY3Rpb25hbEtleShUcmFuc2FjdGlvbmFsS2V5cy5UUkFOU0FDVElPTkFMKSlcbi8vICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuLy8gICAgICAgLFxuLy8gICAgICAge1xuLy8gICAgICAgICB0eXBlOiBcImFzeW5jXCIsXG4vLyAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YS5sZW5ndGggPyBtZXRhZGF0YSA6IHVuZGVmaW5lZCxcbi8vICAgICAgIH0gYXMgVHJhbnNhY3Rpb25hbE1ldGFkYXRhLFxuLy8gICAgICAgdGFyZ2V0LFxuLy8gICAgICAgcHJvcGVydHlLZXksXG4vLyAgICAgKTtcbi8vXG4vLyAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuLy9cbi8vICAgICBjb25zdCBtZXRob2RXcmFwcGVyID0gZnVuY3Rpb24gKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pIHtcbi8vICAgICAgIGNvbnN0IGNhbGxiYWNrOiBDYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4vLyAgICAgICBpZiAoIWNhbGxiYWNrIHx8IHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKVxuLy8gICAgICAgICB0aHJvdyBuZXcgQ3JpdGljYWxFcnJvcihgTWlzc2luZyBDYWxsYmFja2ApO1xuLy9cbi8vICAgICAgIGNvbnN0IGNiID0gKGVycj86IEVyciwgLi4uYXJnczogYW55W10pID0+IHtcbi8vICAgICAgICAgVHJhbnNhY3Rpb24ucmVsZWFzZShlcnIpLnRoZW4oKF8pID0+IGNhbGxiYWNrKGVyciwgLi4uYXJncykpO1xuLy8gICAgICAgfTtcbi8vXG4vLyAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbi8vXG4vLyAgICAgICBsZXQgdHJhbnNhY3Rpb24gPSBhcmdzLnNoaWZ0KCk7XG4vLyAgICAgICBpZiAodHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbikge1xuLy8gICAgICAgICBjb25zdCB1cGRhdGVkVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKFxuLy8gICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IubmFtZSxcbi8vICAgICAgICAgICBwcm9wZXJ0eUtleSxcbi8vICAgICAgICAgICAoKSA9PiB7XG4vLyAgICAgICAgICAgICB0cnkge1xuLy8gICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuY2FsbChcbi8vICAgICAgICAgICAgICAgICB1cGRhdGVkVHJhbnNhY3Rpb24uYmluZFRvVHJhbnNhY3Rpb24oc2VsZiksXG4vLyAgICAgICAgICAgICAgICAgLi4uYXJncyxcbi8vICAgICAgICAgICAgICAgICBjYWxsYmFjayxcbi8vICAgICAgICAgICAgICAgKTtcbi8vICAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuLy8gICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgfSxcbi8vICAgICAgICAgICBtZXRhZGF0YS5sZW5ndGggPyBtZXRhZGF0YSA6IHVuZGVmaW5lZCxcbi8vICAgICAgICAgKTtcbi8vXG4vLyAgICAgICAgIHRyYW5zYWN0aW9uLmJpbmRUcmFuc2FjdGlvbih1cGRhdGVkVHJhbnNhY3Rpb24pO1xuLy8gICAgICAgICB0cmFuc2FjdGlvbi5maXJlKCk7XG4vLyAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICBhcmdzLnVuc2hpZnQodHJhbnNhY3Rpb24pO1xuLy8gICAgICAgICB0cmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbi8vICAgICAgICAgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oXG4vLyAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuLy8gICAgICAgICAgIHByb3BlcnR5S2V5LFxuLy8gICAgICAgICAgICgpID0+IHtcbi8vICAgICAgICAgICAgIHRyeSB7XG4vLyAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5jYWxsKFxuLy8gICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLmJpbmRUb1RyYW5zYWN0aW9uKHNlbGYpLFxuLy8gICAgICAgICAgICAgICAgIC4uLmFyZ3MsXG4vLyAgICAgICAgICAgICAgICAgY2IsXG4vLyAgICAgICAgICAgICAgICk7XG4vLyAgICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbi8vICAgICAgICAgICAgICAgcmV0dXJuIGNiKGUpO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgbWV0YWRhdGEubGVuZ3RoID8gbWV0YWRhdGEgOiB1bmRlZmluZWQsXG4vLyAgICAgICAgICk7XG4vLyAgICAgICAgIFRyYW5zYWN0aW9uLnN1Ym1pdCh0cmFuc2FjdGlvbik7XG4vLyAgICAgICB9XG4vLyAgICAgfTtcbi8vXG4vLyAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1ldGhvZFdyYXBwZXIsIFwibmFtZVwiLCB7XG4vLyAgICAgICB2YWx1ZTogcHJvcGVydHlLZXksXG4vLyAgICAgfSk7XG4vLyAgICAgZGVzY3JpcHRvci52YWx1ZSA9IG1ldGhvZFdyYXBwZXI7XG4vLyAgIH07XG4vLyB9XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFV0aWxpdHkgZm9yIGhhbmRsaW5nIHN1cGVyIGNhbGxzIGluIHRyYW5zYWN0aW9uYWwgbWV0aG9kc1xuICogQHN1bW1hcnkgV3JhcHMgc3VwZXIgbWV0aG9kIGNhbGxzIHdpdGggdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gY29udGV4dCB3aGVuIHRoZSBzdXBlcidzIG1ldGhvZCBpcyBhbHNvIHRyYW5zYWN0aW9uYWwsIGVuc3VyaW5nIHRyYW5zYWN0aW9uIGNvbnRpbnVpdHkgdGhyb3VnaCB0aGUgaW5oZXJpdGFuY2UgY2hhaW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCAtIFRoZSBzdXBlciBtZXRob2QgKG11c3QgYmUgYm91bmQgdG8gdGhlIHByb3BlciB0aGlzKSwgZS5nLiwgc3VwZXIuY3JlYXRlLmJpbmQodGhpcylcbiAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIGNhbGwgdGhlIG1ldGhvZCB3aXRoXG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZXN1bHQgb2YgdGhlIHN1cGVyIG1ldGhvZCBjYWxsXG4gKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25hbFN1cGVyQ2FsbFxuICogQG1lbWJlck9mIG1vZHVsZTp0cmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uYWxTdXBlckNhbGwobWV0aG9kOiBhbnksIC4uLmFyZ3M6IGFueSkge1xuICBjb25zdCBsb2NrID0gVHJhbnNhY3Rpb24uZ2V0TG9jaygpO1xuICBjb25zdCBjdXJyZW50VHJhbnNhY3Rpb24gPSBsb2NrLmN1cnJlbnRUcmFuc2FjdGlvbjtcbiAgcmV0dXJuIG1ldGhvZChjdXJyZW50VHJhbnNhY3Rpb24sIC4uLmFyZ3MpO1xufVxuIl19