@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.
- package/LICENSE.md +21 -157
- package/dist/transactional-decorators.cjs +166 -67
- package/dist/transactional-decorators.esm.cjs +166 -67
- package/lib/Transaction.cjs +87 -39
- package/lib/Transaction.d.ts +86 -38
- package/lib/constants.cjs +14 -1
- package/lib/constants.d.ts +13 -0
- package/lib/decorators.cjs +35 -11
- package/lib/decorators.d.ts +34 -10
- package/lib/esm/Transaction.d.ts +86 -38
- package/lib/esm/Transaction.js +90 -42
- package/lib/esm/constants.d.ts +13 -0
- package/lib/esm/constants.js +14 -1
- package/lib/esm/decorators.d.ts +34 -10
- package/lib/esm/decorators.js +37 -13
- package/lib/esm/index.d.ts +7 -13
- package/lib/esm/index.js +14 -20
- package/lib/esm/interfaces/TransactionLock.d.ts +13 -11
- package/lib/esm/interfaces/TransactionLock.js +1 -1
- package/lib/esm/interfaces/index.d.ts +5 -0
- package/lib/esm/interfaces/index.js +7 -2
- package/lib/esm/locks/Lock.d.ts +13 -5
- package/lib/esm/locks/Lock.js +14 -6
- package/lib/esm/locks/SyncronousLock.d.ts +3 -4
- package/lib/esm/locks/SyncronousLock.js +14 -2
- package/lib/esm/locks/index.d.ts +5 -0
- package/lib/esm/locks/index.js +8 -3
- package/lib/esm/types.d.ts +13 -3
- package/lib/esm/types.js +1 -1
- package/lib/index.cjs +8 -14
- package/lib/index.d.ts +7 -13
- package/lib/interfaces/TransactionLock.cjs +1 -1
- package/lib/interfaces/TransactionLock.d.ts +13 -11
- package/lib/interfaces/index.cjs +6 -1
- package/lib/interfaces/index.d.ts +5 -0
- package/lib/locks/Lock.cjs +14 -6
- package/lib/locks/Lock.d.ts +13 -5
- package/lib/locks/SyncronousLock.cjs +13 -1
- package/lib/locks/SyncronousLock.d.ts +3 -4
- package/lib/locks/index.cjs +6 -1
- package/lib/locks/index.d.ts +5 -0
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +13 -3
- package/package.json +2 -2
package/lib/Transaction.cjs
CHANGED
|
@@ -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
|
-
* @
|
|
11
|
-
*
|
|
12
|
-
* @param {string} source
|
|
13
|
-
* @param {string} [method]
|
|
14
|
-
* @param {function():
|
|
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
|
-
*
|
|
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
|
-
* @
|
|
32
|
-
*
|
|
33
|
-
* @param {any} issuer
|
|
34
|
-
* @param {Function} callbackMethod
|
|
35
|
-
* @param {any[]} args
|
|
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
|
-
* @
|
|
53
|
-
* @
|
|
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
|
-
* @
|
|
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
|
-
* @
|
|
68
|
-
* @
|
|
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
|
-
* @
|
|
75
|
-
* @
|
|
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
|
-
* @
|
|
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
|
-
* @
|
|
88
|
-
* @
|
|
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
|
-
* @
|
|
99
|
-
* @
|
|
100
|
-
*
|
|
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
|
-
* @
|
|
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
|
-
* @
|
|
146
|
-
* @
|
|
147
|
-
* @param {boolean} [
|
|
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
|
-
* @
|
|
154
|
-
* @
|
|
155
|
-
* @param {string} key
|
|
156
|
-
* @
|
|
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
|
package/lib/Transaction.d.ts
CHANGED
|
@@ -1,16 +1,48 @@
|
|
|
1
1
|
import { TransactionLock } from "./interfaces/TransactionLock";
|
|
2
2
|
import { Callback } from "./types";
|
|
3
3
|
/**
|
|
4
|
-
* @
|
|
5
|
-
*
|
|
6
|
-
* @param {string} source
|
|
7
|
-
* @param {string} [method]
|
|
8
|
-
* @param {function():
|
|
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
|
-
*
|
|
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
|
-
* @
|
|
26
|
-
*
|
|
27
|
-
* @param {any} issuer
|
|
28
|
-
* @param {Function} callbackMethod
|
|
29
|
-
* @param {any[]} args
|
|
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
|
-
* @
|
|
34
|
-
* @
|
|
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
|
-
* @
|
|
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
|
-
* @
|
|
43
|
-
* @
|
|
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
|
-
* @
|
|
48
|
-
* @
|
|
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
|
-
* @
|
|
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
|
-
* @
|
|
57
|
-
* @
|
|
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
|
-
* @
|
|
62
|
-
* @
|
|
63
|
-
*
|
|
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
|
-
* @
|
|
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
|
-
* @
|
|
75
|
-
* @
|
|
76
|
-
* @param {boolean} [
|
|
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
|
-
* @
|
|
81
|
-
* @
|
|
82
|
-
* @param {string} key
|
|
83
|
-
* @
|
|
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,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7OztBQUVIOzs7Ozs7R0FNRztBQUNVLFFBQUEsaUJBQWlCLEdBQTJCO0lBQ3ZELE9BQU8sRUFBRSxzQkFBc0I7SUFDL0IsYUFBYSxFQUFFLGVBQWU7Q0FDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJhbnNhY3Rpb25hbEtleXNUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCAtIEtleSB1c2VkIGZvciByZWZsZWN0aW9uIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdHJhbnNhY3Rpb25hbCBtb2RlbHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUUkFOU0FDVElPTkFMIC0gS2V5IHVzZWQgdG8gaWRlbnRpZnkgdHJhbnNhY3Rpb25hbCBwcm9wZXJ0aWVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnRyYW5zYWN0aW9uc1xuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleXMgdXNlZCBmb3IgdHJhbnNhY3Rpb25hbCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBDb25zdGFudCBvYmplY3QgY29udGFpbmluZyBzdHJpbmcga2V5cyB1c2VkIHRocm91Z2hvdXQgdGhlIHRyYW5zYWN0aW9uYWwgc3lzdGVtIGZvciByZWZsZWN0aW9uIGFuZCBpZGVudGlmaWNhdGlvblxuICogQHR5cGUge1RyYW5zYWN0aW9uYWxLZXlzVHlwZX1cbiAqIEBjb25zdCBUcmFuc2FjdGlvbmFsS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTp0cmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IFRyYW5zYWN0aW9uYWxLZXlzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBSRUZMRUNUOiBcIm1vZGVsLnRyYW5zYWN0aW9uYWwuXCIsXG4gIFRSQU5TQUNUSU9OQUw6IFwidHJhbnNhY3Rpb25hbFwiLFxufTtcbiJdfQ==
|
package/lib/constants.d.ts
CHANGED
|
@@ -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>;
|
package/lib/decorators.cjs
CHANGED
|
@@ -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
|
-
* @
|
|
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
|
-
*
|
|
23
|
+
* C->>D: Call decorated method
|
|
24
|
+
* D->>D: Check if transaction exists in args
|
|
13
25
|
*
|
|
14
|
-
*
|
|
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
|
-
*
|
|
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
|
-
* @
|
|
156
|
-
*
|
|
157
|
-
* @param {Function} method
|
|
158
|
-
* @param {any[]} args
|
|
159
|
-
*
|
|
160
|
-
* @
|
|
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
|