@decaf-ts/for-http 0.2.1 → 0.2.2
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/for-http.cjs +310 -12
- package/dist/for-http.esm.cjs +310 -12
- package/lib/RestRepository.cjs +30 -1
- package/lib/RestRepository.d.ts +29 -0
- package/lib/RestService.cjs +154 -11
- package/lib/RestService.d.ts +153 -10
- package/lib/adapter.cjs +114 -1
- package/lib/adapter.d.ts +159 -0
- package/lib/axios/axios.cjs +95 -1
- package/lib/axios/axios.d.ts +94 -0
- package/lib/axios/constants.cjs +7 -1
- package/lib/axios/constants.d.ts +6 -0
- package/lib/axios/index.cjs +10 -1
- package/lib/axios/types.cjs +1 -1
- package/lib/axios/types.d.ts +6 -0
- package/lib/esm/RestRepository.d.ts +29 -0
- package/lib/esm/RestRepository.js +30 -1
- package/lib/esm/RestService.d.ts +153 -10
- package/lib/esm/RestService.js +154 -11
- package/lib/esm/adapter.d.ts +159 -0
- package/lib/esm/adapter.js +115 -2
- package/lib/esm/axios/axios.d.ts +94 -0
- package/lib/esm/axios/axios.js +97 -3
- package/lib/esm/axios/constants.d.ts +6 -0
- package/lib/esm/axios/constants.js +7 -1
- package/lib/esm/axios/index.js +14 -5
- package/lib/esm/axios/types.d.ts +6 -0
- package/lib/esm/axios/types.js +1 -1
- package/lib/esm/index.d.ts +14 -1
- package/lib/esm/index.js +19 -6
- package/lib/esm/types.d.ts +15 -0
- package/lib/esm/types.js +1 -1
- package/lib/index.cjs +15 -2
- package/lib/index.d.ts +14 -1
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +15 -0
- package/package.json +2 -2
package/lib/RestRepository.cjs
CHANGED
|
@@ -2,10 +2,39 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RestRepository = void 0;
|
|
4
4
|
const core_1 = require("@decaf-ts/core");
|
|
5
|
+
/**
|
|
6
|
+
* @description Repository for REST API interactions
|
|
7
|
+
* @summary A specialized repository implementation for interacting with REST APIs.
|
|
8
|
+
* This class extends the core Repository class and works with HTTP adapters to
|
|
9
|
+
* provide CRUD operations for models via REST endpoints.
|
|
10
|
+
* This Is NOT the default repository for the HTTP adapter. That would be {@link RestService}.
|
|
11
|
+
* Use this only in the specific case of needing to run the CURD model logic (decoration) before submitting to the backend
|
|
12
|
+
* @template M - The model type, extending Model
|
|
13
|
+
* @template Q - The query type used by the adapter
|
|
14
|
+
* @template A - The HTTP adapter type, extending HttpAdapter
|
|
15
|
+
* @template F - The HTTP flags type, extending HttpFlags
|
|
16
|
+
* @template C - The context type, extending Context<F>
|
|
17
|
+
* @param {A} adapter - The HTTP adapter instance
|
|
18
|
+
* @param {Constructor<M>} [clazz] - Optional constructor for the model class
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* // Create a repository for User model with Axios adapter
|
|
22
|
+
* const axiosAdapter = new AxiosAdapter({
|
|
23
|
+
* protocol: 'https',
|
|
24
|
+
* host: 'api.example.com'
|
|
25
|
+
* });
|
|
26
|
+
* const userRepository = new RestRepository(axiosAdapter, User);
|
|
27
|
+
*
|
|
28
|
+
* // Use the repository for CRUD operations
|
|
29
|
+
* const user = await userRepository.findById('123');
|
|
30
|
+
* ```
|
|
31
|
+
* @class RestRepository
|
|
32
|
+
* @see {@link RestService}
|
|
33
|
+
*/
|
|
5
34
|
class RestRepository extends core_1.Repository {
|
|
6
35
|
constructor(adapter, clazz) {
|
|
7
36
|
super(adapter, clazz);
|
|
8
37
|
}
|
|
9
38
|
}
|
|
10
39
|
exports.RestRepository = RestRepository;
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzdFJlcG9zaXRvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUmVzdFJlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQTRDO0FBTTVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsTUFBYSxjQU1YLFNBQVEsaUJBQW1CO0lBQzNCLFlBQVksT0FBVSxFQUFFLEtBQXNCO1FBQzVDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBVkQsd0NBVUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIdHRwQWRhcHRlciB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEh0dHBGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgZm9yIFJFU1QgQVBJIGludGVyYWN0aW9uc1xuICogQHN1bW1hcnkgQSBzcGVjaWFsaXplZCByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGZvciBpbnRlcmFjdGluZyB3aXRoIFJFU1QgQVBJcy5cbiAqIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgY29yZSBSZXBvc2l0b3J5IGNsYXNzIGFuZCB3b3JrcyB3aXRoIEhUVFAgYWRhcHRlcnMgdG9cbiAqIHByb3ZpZGUgQ1JVRCBvcGVyYXRpb25zIGZvciBtb2RlbHMgdmlhIFJFU1QgZW5kcG9pbnRzLlxuICogVGhpcyBJcyBOT1QgdGhlIGRlZmF1bHQgcmVwb3NpdG9yeSBmb3IgdGhlIEhUVFAgYWRhcHRlci4gVGhhdCB3b3VsZCBiZSB7QGxpbmsgUmVzdFNlcnZpY2V9LlxuICogVXNlIHRoaXMgb25seSBpbiB0aGUgc3BlY2lmaWMgY2FzZSBvZiBuZWVkaW5nIHRvIHJ1biB0aGUgQ1VSRCBtb2RlbCBsb2dpYyAoZGVjb3JhdGlvbikgYmVmb3JlIHN1Ym1pdHRpbmcgdG8gdGhlIGJhY2tlbmRcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUsIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZSB1c2VkIGJ5IHRoZSBhZGFwdGVyXG4gKiBAdGVtcGxhdGUgQSAtIFRoZSBIVFRQIGFkYXB0ZXIgdHlwZSwgZXh0ZW5kaW5nIEh0dHBBZGFwdGVyXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSBIVFRQIGZsYWdzIHR5cGUsIGV4dGVuZGluZyBIdHRwRmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSwgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7QX0gYWRhcHRlciAtIFRoZSBIVFRQIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBPcHRpb25hbCBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIGNsYXNzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgcmVwb3NpdG9yeSBmb3IgVXNlciBtb2RlbCB3aXRoIEF4aW9zIGFkYXB0ZXJcbiAqIGNvbnN0IGF4aW9zQWRhcHRlciA9IG5ldyBBeGlvc0FkYXB0ZXIoe1xuICogICBwcm90b2NvbDogJ2h0dHBzJyxcbiAqICAgaG9zdDogJ2FwaS5leGFtcGxlLmNvbSdcbiAqIH0pO1xuICogY29uc3QgdXNlclJlcG9zaXRvcnkgPSBuZXcgUmVzdFJlcG9zaXRvcnkoYXhpb3NBZGFwdGVyLCBVc2VyKTtcbiAqXG4gKiAvLyBVc2UgdGhlIHJlcG9zaXRvcnkgZm9yIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IGF3YWl0IHVzZXJSZXBvc2l0b3J5LmZpbmRCeUlkKCcxMjMnKTtcbiAqIGBgYFxuICogQGNsYXNzIFJlc3RSZXBvc2l0b3J5XG4gKiBAc2VlIHtAbGluayBSZXN0U2VydmljZX1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3RSZXBvc2l0b3J5PFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFEsXG4gIEEgZXh0ZW5kcyBIdHRwQWRhcHRlcjxhbnksIFEsIEYsIEM+LFxuICBGIGV4dGVuZHMgSHR0cEZsYWdzID0gSHR0cEZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+IGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBRLCBBPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBjbGF6eik7XG4gIH1cbn1cbiJdfQ==
|
package/lib/RestRepository.d.ts
CHANGED
|
@@ -3,6 +3,35 @@ import { Constructor, Model } from "@decaf-ts/decorator-validation";
|
|
|
3
3
|
import { HttpAdapter } from "./adapter";
|
|
4
4
|
import { Context } from "@decaf-ts/db-decorators";
|
|
5
5
|
import { HttpFlags } from "./types";
|
|
6
|
+
/**
|
|
7
|
+
* @description Repository for REST API interactions
|
|
8
|
+
* @summary A specialized repository implementation for interacting with REST APIs.
|
|
9
|
+
* This class extends the core Repository class and works with HTTP adapters to
|
|
10
|
+
* provide CRUD operations for models via REST endpoints.
|
|
11
|
+
* This Is NOT the default repository for the HTTP adapter. That would be {@link RestService}.
|
|
12
|
+
* Use this only in the specific case of needing to run the CURD model logic (decoration) before submitting to the backend
|
|
13
|
+
* @template M - The model type, extending Model
|
|
14
|
+
* @template Q - The query type used by the adapter
|
|
15
|
+
* @template A - The HTTP adapter type, extending HttpAdapter
|
|
16
|
+
* @template F - The HTTP flags type, extending HttpFlags
|
|
17
|
+
* @template C - The context type, extending Context<F>
|
|
18
|
+
* @param {A} adapter - The HTTP adapter instance
|
|
19
|
+
* @param {Constructor<M>} [clazz] - Optional constructor for the model class
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // Create a repository for User model with Axios adapter
|
|
23
|
+
* const axiosAdapter = new AxiosAdapter({
|
|
24
|
+
* protocol: 'https',
|
|
25
|
+
* host: 'api.example.com'
|
|
26
|
+
* });
|
|
27
|
+
* const userRepository = new RestRepository(axiosAdapter, User);
|
|
28
|
+
*
|
|
29
|
+
* // Use the repository for CRUD operations
|
|
30
|
+
* const user = await userRepository.findById('123');
|
|
31
|
+
* ```
|
|
32
|
+
* @class RestRepository
|
|
33
|
+
* @see {@link RestService}
|
|
34
|
+
*/
|
|
6
35
|
export declare class RestRepository<M extends Model, Q, A extends HttpAdapter<any, Q, F, C>, F extends HttpFlags = HttpFlags, C extends Context<F> = Context<F>> extends Repository<M, Q, A> {
|
|
7
36
|
constructor(adapter: A, clazz?: Constructor<M>);
|
|
8
37
|
}
|
package/lib/RestService.cjs
CHANGED
|
@@ -3,53 +3,164 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.RestService = void 0;
|
|
4
4
|
const db_decorators_1 = require("@decaf-ts/db-decorators");
|
|
5
5
|
const core_1 = require("@decaf-ts/core");
|
|
6
|
+
/**
|
|
7
|
+
* @description Service class for REST API operations
|
|
8
|
+
* @summary Provides a comprehensive implementation for interacting with REST APIs.
|
|
9
|
+
* This class implements CRUD operations for single and bulk operations, as well as
|
|
10
|
+
* the Observable pattern to notify observers of changes. It works with HTTP adapters
|
|
11
|
+
* to perform the actual API requests and handles model conversion.
|
|
12
|
+
* @template M - The model type, extending Model
|
|
13
|
+
* @template Q - The query type used by the adapter
|
|
14
|
+
* @template A - The HTTP adapter type, extending HttpAdapter
|
|
15
|
+
* @template F - The HTTP flags type, extending HttpFlags
|
|
16
|
+
* @template C - The context type, extending Context<F>
|
|
17
|
+
* @param {A} adapter - The HTTP adapter instance
|
|
18
|
+
* @param {Constructor<M>} [clazz] - Optional constructor for the model class
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* // Create a service for User model with Axios adapter
|
|
22
|
+
* const axiosAdapter = new AxiosAdapter({
|
|
23
|
+
* protocol: 'https',
|
|
24
|
+
* host: 'api.example.com'
|
|
25
|
+
* });
|
|
26
|
+
* const userService = new RestService(axiosAdapter, User);
|
|
27
|
+
*
|
|
28
|
+
* // Create a new user
|
|
29
|
+
* const user = new User({ name: 'John Doe', email: 'john@example.com' });
|
|
30
|
+
* const createdUser = await userService.create(user);
|
|
31
|
+
*
|
|
32
|
+
* // Update a user
|
|
33
|
+
* createdUser.name = 'Jane Doe';
|
|
34
|
+
* const updatedUser = await userService.update(createdUser);
|
|
35
|
+
*
|
|
36
|
+
* // Delete a user
|
|
37
|
+
* await userService.delete(updatedUser.id);
|
|
38
|
+
* ```
|
|
39
|
+
* @class
|
|
40
|
+
*/
|
|
6
41
|
class RestService {
|
|
42
|
+
/**
|
|
43
|
+
* @description Gets the model class constructor
|
|
44
|
+
* @summary Retrieves the model class constructor associated with this service.
|
|
45
|
+
* Throws an error if no class definition is found.
|
|
46
|
+
* @return {Constructor<M>} The model class constructor
|
|
47
|
+
* @throws {InternalError} If no class definition is found
|
|
48
|
+
*/
|
|
7
49
|
get class() {
|
|
8
50
|
if (!this._class)
|
|
9
51
|
throw new db_decorators_1.InternalError("No class definition found for this repository");
|
|
10
52
|
return this._class;
|
|
11
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* @description Gets the primary key property name
|
|
56
|
+
* @summary Retrieves the name of the primary key property for the model.
|
|
57
|
+
* If not already determined, it finds the primary key using the model class.
|
|
58
|
+
* @return The primary key property name
|
|
59
|
+
*/
|
|
12
60
|
get pk() {
|
|
13
61
|
if (!this._pk)
|
|
14
62
|
this._pk = (0, db_decorators_1.findPrimaryKey)(new this.class()).id;
|
|
15
63
|
return this._pk;
|
|
16
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* @description Gets the HTTP adapter
|
|
67
|
+
* @summary Retrieves the HTTP adapter associated with this service.
|
|
68
|
+
* Throws an error if no adapter is found.
|
|
69
|
+
* @return {A} The HTTP adapter instance
|
|
70
|
+
* @throws {InternalError} If no adapter is found
|
|
71
|
+
*/
|
|
17
72
|
get adapter() {
|
|
18
73
|
if (!this._adapter)
|
|
19
74
|
throw new db_decorators_1.InternalError("No adapter found for this repository. did you use the @uses decorator or pass it in the constructor?");
|
|
20
75
|
return this._adapter;
|
|
21
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* @description Gets the table name for the model
|
|
79
|
+
* @summary Retrieves the table name associated with the model class.
|
|
80
|
+
* If not already determined, it gets the table name from the Repository utility.
|
|
81
|
+
* @return {string} The table name
|
|
82
|
+
*/
|
|
22
83
|
get tableName() {
|
|
23
84
|
if (!this._tableName)
|
|
24
85
|
this._tableName = core_1.Repository.table(this.class);
|
|
25
86
|
return this._tableName;
|
|
26
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* @description Initializes a new RestService instance
|
|
90
|
+
* @summary Creates a new service instance with the specified adapter and optional model class.
|
|
91
|
+
* The constructor stores the adapter and model class for later use in CRUD operations.
|
|
92
|
+
* @param {A} adapter - The HTTP adapter instance to use for API requests
|
|
93
|
+
* @param {Constructor<M>} [clazz] - Optional constructor for the model class
|
|
94
|
+
*/
|
|
27
95
|
constructor(adapter, clazz) {
|
|
28
96
|
this.observers = [];
|
|
29
97
|
this._adapter = adapter;
|
|
30
98
|
if (clazz)
|
|
31
99
|
this._class = clazz;
|
|
32
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* @description Creates a new resource
|
|
103
|
+
* @summary Creates a new resource in the REST API using the provided model.
|
|
104
|
+
* The method prepares the model for the adapter, sends the create request,
|
|
105
|
+
* and then converts the response back to a model instance.
|
|
106
|
+
* @param {M} model - The model instance to create
|
|
107
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
108
|
+
* @return {Promise<M>} A promise that resolves with the created model instance
|
|
109
|
+
*/
|
|
33
110
|
async create(model, ...args) {
|
|
34
111
|
// eslint-disable-next-line prefer-const
|
|
35
112
|
let { record, id } = this.adapter.prepare(model, this.pk);
|
|
36
113
|
record = await this.adapter.create(this.tableName, id, record, ...args);
|
|
37
114
|
return this.adapter.revert(record, this.class, this.pk, id);
|
|
38
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* @description Retrieves a resource by ID
|
|
118
|
+
* @summary Fetches a resource from the REST API using the provided ID.
|
|
119
|
+
* The method sends the read request and converts the response to a model instance.
|
|
120
|
+
* @param {string|number} id - The identifier of the resource to retrieve
|
|
121
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
122
|
+
* @return {Promise<M>} A promise that resolves with the retrieved model instance
|
|
123
|
+
*/
|
|
39
124
|
async read(id, ...args) {
|
|
40
125
|
const m = await this.adapter.read(this.tableName, id, ...args);
|
|
41
126
|
return this.adapter.revert(m, this.class, this.pk, id);
|
|
42
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* @description Updates an existing resource
|
|
130
|
+
* @summary Updates an existing resource in the REST API using the provided model.
|
|
131
|
+
* The method prepares the model for the adapter, sends the update request,
|
|
132
|
+
* and then converts the response back to a model instance.
|
|
133
|
+
* @param {M} model - The model instance with updated data
|
|
134
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
135
|
+
* @return {Promise<M>} A promise that resolves with the updated model instance
|
|
136
|
+
*/
|
|
43
137
|
async update(model, ...args) {
|
|
44
138
|
// eslint-disable-next-line prefer-const
|
|
45
139
|
let { record, id } = this.adapter.prepare(model, this.pk);
|
|
46
140
|
record = await this.adapter.update(this.tableName, id, record, ...args);
|
|
47
141
|
return this.adapter.revert(record, this.class, this.pk, id);
|
|
48
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* @description Deletes a resource by ID
|
|
145
|
+
* @summary Removes a resource from the REST API using the provided ID.
|
|
146
|
+
* The method sends the delete request and converts the response to a model instance.
|
|
147
|
+
* @param {string|number} id - The identifier of the resource to delete
|
|
148
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
149
|
+
* @return {Promise<M>} A promise that resolves with the deleted model instance
|
|
150
|
+
*/
|
|
49
151
|
async delete(id, ...args) {
|
|
50
152
|
const m = await this.adapter.delete(this.tableName, id, ...args);
|
|
51
153
|
return this.adapter.revert(m, this.class, this.pk, id);
|
|
52
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* @description Creates multiple resources
|
|
157
|
+
* @summary Creates multiple resources in the REST API using the provided models.
|
|
158
|
+
* The method prepares each model for the adapter, sends a bulk create request,
|
|
159
|
+
* and then converts the responses back to model instances.
|
|
160
|
+
* @param {M[]} models - The model instances to create
|
|
161
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
162
|
+
* @return {Promise<M[]>} A promise that resolves with an array of created model instances
|
|
163
|
+
*/
|
|
53
164
|
async createAll(models, ...args) {
|
|
54
165
|
if (!models.length)
|
|
55
166
|
return models;
|
|
@@ -59,24 +170,51 @@ class RestService {
|
|
|
59
170
|
records = await this.adapter.createAll(this.tableName, ids, records, ...args);
|
|
60
171
|
return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, ids[i]));
|
|
61
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* @description Deletes multiple resources by IDs
|
|
175
|
+
* @summary Removes multiple resources from the REST API using the provided IDs.
|
|
176
|
+
* The method sends a bulk delete request and converts the responses to model instances.
|
|
177
|
+
* @param {string[]|number[]} keys - The identifiers of the resources to delete
|
|
178
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
179
|
+
* @return {Promise<M[]>} A promise that resolves with an array of deleted model instances
|
|
180
|
+
*/
|
|
62
181
|
async deleteAll(keys, ...args) {
|
|
63
182
|
const results = await this.adapter.deleteAll(this.tableName, keys, ...args);
|
|
64
183
|
return results.map((r, i) => this.adapter.revert(r, this.class, this.pk, keys[i]));
|
|
65
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* @description Retrieves multiple resources by IDs
|
|
187
|
+
* @summary Fetches multiple resources from the REST API using the provided IDs.
|
|
188
|
+
* The method sends a bulk read request and converts the responses to model instances.
|
|
189
|
+
* @param {string[]|number[]} keys - The identifiers of the resources to retrieve
|
|
190
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
191
|
+
* @return {Promise<M[]>} A promise that resolves with an array of retrieved model instances
|
|
192
|
+
*/
|
|
66
193
|
async readAll(keys, ...args) {
|
|
67
194
|
const records = await this.adapter.readAll(this.tableName, keys, ...args);
|
|
68
195
|
return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, keys[i]));
|
|
69
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* @description Updates multiple resources
|
|
199
|
+
* @summary Updates multiple resources in the REST API using the provided models.
|
|
200
|
+
* The method prepares each model for the adapter, sends a bulk update request,
|
|
201
|
+
* and then converts the responses back to model instances.
|
|
202
|
+
* @param {M[]} models - The model instances with updated data
|
|
203
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
204
|
+
* @return {Promise<M[]>} A promise that resolves with an array of updated model instances
|
|
205
|
+
*/
|
|
70
206
|
async updateAll(models, ...args) {
|
|
71
207
|
const records = models.map((m) => this.adapter.prepare(m, this.pk));
|
|
72
208
|
const updated = await this.adapter.updateAll(this.tableName, records.map((r) => r.id), records.map((r) => r.record), ...args);
|
|
73
209
|
return updated.map((u, i) => this.adapter.revert(u, this.class, this.pk, records[i].id));
|
|
74
210
|
}
|
|
75
211
|
/**
|
|
76
|
-
* @
|
|
77
|
-
* @
|
|
78
|
-
*
|
|
79
|
-
* @
|
|
212
|
+
* @description Registers an observer
|
|
213
|
+
* @summary Adds an observer to the list of observers that will be notified of changes.
|
|
214
|
+
* Throws an error if the observer is already registered.
|
|
215
|
+
* @param {Observer} observer - The observer to register
|
|
216
|
+
* @return {void}
|
|
217
|
+
* @throws {InternalError} If the observer is already registered
|
|
80
218
|
*/
|
|
81
219
|
observe(observer) {
|
|
82
220
|
const index = this.observers.indexOf(observer);
|
|
@@ -85,10 +223,12 @@ class RestService {
|
|
|
85
223
|
this.observers.push(observer);
|
|
86
224
|
}
|
|
87
225
|
/**
|
|
88
|
-
* @
|
|
89
|
-
* @
|
|
90
|
-
*
|
|
91
|
-
* @
|
|
226
|
+
* @description Unregisters an observer
|
|
227
|
+
* @summary Removes an observer from the list of observers.
|
|
228
|
+
* Throws an error if the observer is not found.
|
|
229
|
+
* @param {Observer} observer - The observer to unregister
|
|
230
|
+
* @return {void}
|
|
231
|
+
* @throws {InternalError} If the observer is not found
|
|
92
232
|
*/
|
|
93
233
|
unObserve(observer) {
|
|
94
234
|
const index = this.observers.indexOf(observer);
|
|
@@ -97,8 +237,11 @@ class RestService {
|
|
|
97
237
|
this.observers.splice(index, 1);
|
|
98
238
|
}
|
|
99
239
|
/**
|
|
100
|
-
* @
|
|
101
|
-
* @
|
|
240
|
+
* @description Notifies all registered observers
|
|
241
|
+
* @summary Calls the refresh method on all registered observers to update themselves.
|
|
242
|
+
* Any errors during observer refresh are logged as warnings but don't stop the process.
|
|
243
|
+
* @param {...any[]} [args] - Optional arguments to pass to the observer refresh method
|
|
244
|
+
* @return {Promise<void>} A promise that resolves when all observers have been updated
|
|
102
245
|
*/
|
|
103
246
|
async updateObservers(...args) {
|
|
104
247
|
const results = await Promise.allSettled(this.observers.map((o) => o.refresh(...args)));
|
|
@@ -109,4 +252,4 @@ class RestService {
|
|
|
109
252
|
}
|
|
110
253
|
}
|
|
111
254
|
exports.RestService = RestService;
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzdFNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUmVzdFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBTWlDO0FBRWpDLHlDQUFrRTtBQUlsRSxNQUFhLFdBQVc7SUFZdEIsSUFBSSxLQUFLO1FBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQ2QsTUFBTSxJQUFJLDZCQUFhLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUMzRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksRUFBRTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztZQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBQSw4QkFBYyxFQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBT0QsSUFBYyxPQUFPO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUNoQixNQUFNLElBQUksNkJBQWEsQ0FDckIsc0dBQXNHLENBQ3ZHLENBQUM7UUFDSixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQWMsU0FBUztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLGlCQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELFlBQVksT0FBVSxFQUFFLEtBQXNCO1FBbEJwQyxjQUFTLEdBQWUsRUFBRSxDQUFDO1FBbUJuQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLEtBQUs7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNqQyxD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QyxTQUFTLEVBQ2QsR0FBMEIsRUFDMUIsT0FBTyxFQUNQLEdBQUcsSUFBSSxDQUNSLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFvQixDQUFDLENBQ3ZFLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUF5QixFQUFFLEdBQUcsSUFBVztRQUN2RCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDNUUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JELENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUF5QixFQUFFLEdBQUcsSUFBVztRQUNyRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDMUUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JELENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFXLEVBQUUsR0FBRyxJQUFXO1FBQ3pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUMxQyxJQUFJLENBQUMsU0FBUyxFQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUM1QixHQUFHLElBQUksQ0FDUixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUMzRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLFFBQWtCO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUFFLE1BQU0sSUFBSSw2QkFBYSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLFFBQWtCO1FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUFFLE1BQU0sSUFBSSw2QkFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBVztRQUNsQyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FDOUMsQ0FBQztRQUNGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsK0JBQStCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUNyRSxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF4SkQsa0NBd0pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRvcixcbiAgQ29udGV4dCxcbiAgQ3J1ZE9wZXJhdG9yLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciwgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSHR0cEFkYXB0ZXIgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgeyBIdHRwRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzdFNlcnZpY2U8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIFEsXG4gICAgQSBleHRlbmRzIEh0dHBBZGFwdGVyPGFueSwgUSwgRiwgQz4sXG4gICAgRiBleHRlbmRzIEh0dHBGbGFncyA9IEh0dHBGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gID5cbiAgaW1wbGVtZW50cyBDcnVkT3BlcmF0b3I8TT4sIEJ1bGtDcnVkT3BlcmF0b3I8TT4sIE9ic2VydmFibGVcbntcbiAgcHJpdmF0ZSByZWFkb25seSBfY2xhc3MhOiBDb25zdHJ1Y3RvcjxNPjtcbiAgcHJpdmF0ZSBfcGshOiBrZXlvZiBNO1xuXG4gIGdldCBjbGFzcygpIHtcbiAgICBpZiAoIXRoaXMuX2NsYXNzKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJObyBjbGFzcyBkZWZpbml0aW9uIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnlcIik7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzO1xuICB9XG5cbiAgZ2V0IHBrKCkge1xuICAgIGlmICghdGhpcy5fcGspIHRoaXMuX3BrID0gZmluZFByaW1hcnlLZXkobmV3IHRoaXMuY2xhc3MoKSkuaWQ7XG4gICAgcmV0dXJuIHRoaXMuX3BrO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9ic2VydmVyczogT2JzZXJ2ZXJbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkYXB0ZXIhOiBBO1xuICBwcml2YXRlIF90YWJsZU5hbWUhOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIGdldCBhZGFwdGVyKCk6IEEge1xuICAgIGlmICghdGhpcy5fYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk5vIGFkYXB0ZXIgZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeS4gZGlkIHlvdSB1c2UgdGhlIEB1c2VzIGRlY29yYXRvciBvciBwYXNzIGl0IGluIHRoZSBjb25zdHJ1Y3Rvcj9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdGFibGVOYW1lKCkge1xuICAgIGlmICghdGhpcy5fdGFibGVOYW1lKSB0aGlzLl90YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgdGhpcy5fYWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgaWYgKGNsYXp6KSB0aGlzLl9jbGFzcyA9IGNsYXp6O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkIH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBhc3luYyByZWFkKGlkOiBzdHJpbmcgfCBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQobSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkIH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZyB8IG51bWJlciwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIG1vZGVscztcbiAgICBjb25zdCBwcmVwYXJlZCA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGxldCByZWNvcmRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIGlkcyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgICAgcmVjb3JkcyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQWxsKGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZUFsbCh0aGlzLnRhYmxlTmFtZSwga2V5cywgLi4uYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cblxuICBhc3luYyByZWFkQWxsKGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWRBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIucmVjb3JkKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB1cGRhdGVkLm1hcCgodSwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjb2JzZXJ2ZX1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk9ic2VydmVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5wdXNoKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVbnJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGNhbGxzIGFsbCByZWdpc3RlcmVkIHtAbGluayBPYnNlcnZlcn1zIHRvIHVwZGF0ZSB0aGVtc2VsdmVzXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSBvcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgT2JzZXJ2ZXIjcmVmcmVzaH0gbWV0aG9kXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLnJlZnJlc2goLi4uYXJncykpXG4gICAgKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIG9ic2VydmFibGUgJHt0aGlzLm9ic2VydmVyc1tpXX06ICR7cmVzdWx0LnJlYXNvbn1gXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzdFNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUmVzdFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBTWlDO0FBRWpDLHlDQUFrRTtBQUlsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRztBQUNILE1BQWEsV0FBVztJQVl0Qjs7Ozs7O09BTUc7SUFDSCxJQUFJLEtBQUs7UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDZCxNQUFNLElBQUksNkJBQWEsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJLEVBQUU7UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUEsOEJBQWMsRUFBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQU9EOzs7Ozs7T0FNRztJQUNILElBQWMsT0FBTztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDaEIsTUFBTSxJQUFJLDZCQUFhLENBQ3JCLHNHQUFzRyxDQUN2RyxDQUFDO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQWMsU0FBUztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLGlCQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFlBQVksT0FBVSxFQUFFLEtBQXNCO1FBdENw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Q0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBcFFELGtDQW9RQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0b3IsXG4gIENvbnRleHQsXG4gIENydWRPcGVyYXRvcixcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEh0dHBBZGFwdGVyIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHsgSHR0cEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2VydmljZSBjbGFzcyBmb3IgUkVTVCBBUEkgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIGltcGxlbWVudGF0aW9uIGZvciBpbnRlcmFjdGluZyB3aXRoIFJFU1QgQVBJcy5cbiAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBDUlVEIG9wZXJhdGlvbnMgZm9yIHNpbmdsZSBhbmQgYnVsayBvcGVyYXRpb25zLCBhcyB3ZWxsIGFzXG4gKiB0aGUgT2JzZXJ2YWJsZSBwYXR0ZXJuIHRvIG5vdGlmeSBvYnNlcnZlcnMgb2YgY2hhbmdlcy4gSXQgd29ya3Mgd2l0aCBIVFRQIGFkYXB0ZXJzXG4gKiB0byBwZXJmb3JtIHRoZSBhY3R1YWwgQVBJIHJlcXVlc3RzIGFuZCBoYW5kbGVzIG1vZGVsIGNvbnZlcnNpb24uXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlLCBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUgdXNlZCBieSB0aGUgYWRhcHRlclxuICogQHRlbXBsYXRlIEEgLSBUaGUgSFRUUCBhZGFwdGVyIHR5cGUsIGV4dGVuZGluZyBIdHRwQWRhcHRlclxuICogQHRlbXBsYXRlIEYgLSBUaGUgSFRUUCBmbGFncyB0eXBlLCBleHRlbmRpbmcgSHR0cEZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUsIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge0F9IGFkYXB0ZXIgLSBUaGUgSFRUUCBhZGFwdGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCBjbGFzc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHNlcnZpY2UgZm9yIFVzZXIgbW9kZWwgd2l0aCBBeGlvcyBhZGFwdGVyXG4gKiBjb25zdCBheGlvc0FkYXB0ZXIgPSBuZXcgQXhpb3NBZGFwdGVyKHtcbiAqICAgcHJvdG9jb2w6ICdodHRwcycsXG4gKiAgIGhvc3Q6ICdhcGkuZXhhbXBsZS5jb20nXG4gKiB9KTtcbiAqIGNvbnN0IHVzZXJTZXJ2aWNlID0gbmV3IFJlc3RTZXJ2aWNlKGF4aW9zQWRhcHRlciwgVXNlcik7XG4gKlxuICogLy8gQ3JlYXRlIGEgbmV3IHVzZXJcbiAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih7IG5hbWU6ICdKb2huIERvZScsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBjb25zdCBjcmVhdGVkVXNlciA9IGF3YWl0IHVzZXJTZXJ2aWNlLmNyZWF0ZSh1c2VyKTtcbiAqXG4gKiAvLyBVcGRhdGUgYSB1c2VyXG4gKiBjcmVhdGVkVXNlci5uYW1lID0gJ0phbmUgRG9lJztcbiAqIGNvbnN0IHVwZGF0ZWRVc2VyID0gYXdhaXQgdXNlclNlcnZpY2UudXBkYXRlKGNyZWF0ZWRVc2VyKTtcbiAqXG4gKiAvLyBEZWxldGUgYSB1c2VyXG4gKiBhd2FpdCB1c2VyU2VydmljZS5kZWxldGUodXBkYXRlZFVzZXIuaWQpO1xuICogYGBgXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3RTZXJ2aWNlPFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBRLFxuICAgIEEgZXh0ZW5kcyBIdHRwQWRhcHRlcjxhbnksIFEsIEYsIEM+LFxuICAgIEYgZXh0ZW5kcyBIdHRwRmxhZ3MgPSBIdHRwRmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuICA+XG4gIGltcGxlbWVudHMgQ3J1ZE9wZXJhdG9yPE0+LCBCdWxrQ3J1ZE9wZXJhdG9yPE0+LCBPYnNlcnZhYmxlXG57XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsYXNzITogQ29uc3RydWN0b3I8TT47XG4gIHByaXZhdGUgX3BrIToga2V5b2YgTTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG1vZGVsIGNsYXNzIGNvbnN0cnVjdG9yXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbW9kZWwgY2xhc3MgY29uc3RydWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZS5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIG5vIGNsYXNzIGRlZmluaXRpb24gaXMgZm91bmQuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPE0+fSBUaGUgbW9kZWwgY2xhc3MgY29uc3RydWN0b3JcbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gY2xhc3MgZGVmaW5pdGlvbiBpcyBmb3VuZFxuICAgKi9cbiAgZ2V0IGNsYXNzKCkge1xuICAgIGlmICghdGhpcy5fY2xhc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vIGNsYXNzIGRlZmluaXRpb24gZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeVwiKTtcbiAgICByZXR1cm4gdGhpcy5fY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBmb3IgdGhlIG1vZGVsLlxuICAgKiBJZiBub3QgYWxyZWFkeSBkZXRlcm1pbmVkLCBpdCBmaW5kcyB0aGUgcHJpbWFyeSBrZXkgdXNpbmcgdGhlIG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJuIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqL1xuICBnZXQgcGsoKSB7XG4gICAgaWYgKCF0aGlzLl9waykgdGhpcy5fcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGFzcygpKS5pZDtcbiAgICByZXR1cm4gdGhpcy5fcGs7XG4gIH1cblxuICBwcm90ZWN0ZWQgb2JzZXJ2ZXJzOiBPYnNlcnZlcltdID0gW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWRhcHRlciE6IEE7XG4gIHByaXZhdGUgX3RhYmxlTmFtZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIEhUVFAgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIEhUVFAgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlLlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgbm8gYWRhcHRlciBpcyBmb3VuZC5cbiAgICogQHJldHVybiB7QX0gVGhlIEhUVFAgYWRhcHRlciBpbnN0YW5jZVxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBhZGFwdGVyIGlzIGZvdW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFkYXB0ZXIoKTogQSB7XG4gICAgaWYgKCF0aGlzLl9hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiTm8gYWRhcHRlciBmb3VuZCBmb3IgdGhpcyByZXBvc2l0b3J5LiBkaWQgeW91IHVzZSB0aGUgQHVzZXMgZGVjb3JhdG9yIG9yIHBhc3MgaXQgaW4gdGhlIGNvbnN0cnVjdG9yP1wiXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWxcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwgY2xhc3MuXG4gICAqIElmIG5vdCBhbHJlYWR5IGRldGVybWluZWQsIGl0IGdldHMgdGhlIHRhYmxlIG5hbWUgZnJvbSB0aGUgUmVwb3NpdG9yeSB1dGlsaXR5LlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICBpZiAoIXRoaXMuX3RhYmxlTmFtZSkgdGhpcy5fdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZSh0aGlzLmNsYXNzKTtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyBhIG5ldyBSZXN0U2VydmljZSBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IHNlcnZpY2UgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgYW5kIG9wdGlvbmFsIG1vZGVsIGNsYXNzLlxuICAgKiBUaGUgY29uc3RydWN0b3Igc3RvcmVzIHRoZSBhZGFwdGVyIGFuZCBtb2RlbCBjbGFzcyBmb3IgbGF0ZXIgdXNlIGluIENSVUQgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIHtBfSBhZGFwdGVyIC0gVGhlIEhUVFAgYWRhcHRlciBpbnN0YW5jZSB0byB1c2UgZm9yIEFQSSByZXF1ZXN0c1xuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCBjbGFzc1xuICAgKi9cbiAgY29uc3RydWN0b3IoYWRhcHRlcjogQSwgY2xheno/OiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHRoaXMuX2FkYXB0ZXIgPSBhZGFwdGVyO1xuICAgIGlmIChjbGF6eikgdGhpcy5fY2xhc3MgPSBjbGF6ejtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyByZXNvdXJjZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IHJlc291cmNlIGluIHRoZSBSRVNUIEFQSSB1c2luZyB0aGUgcHJvdmlkZWQgbW9kZWwuXG4gICAqIFRoZSBtZXRob2QgcHJlcGFyZXMgdGhlIG1vZGVsIGZvciB0aGUgYWRhcHRlciwgc2VuZHMgdGhlIGNyZWF0ZSByZXF1ZXN0LFxuICAgKiBhbmQgdGhlbiBjb252ZXJ0cyB0aGUgcmVzcG9uc2UgYmFjayB0byBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNyZWF0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjcmVhdGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBjcmVhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVzb3VyY2UgYnkgSURcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJlc291cmNlIGZyb20gdGhlIFJFU1QgQVBJIHVzaW5nIHRoZSBwcm92aWRlZCBJRC5cbiAgICogVGhlIG1ldGhvZCBzZW5kcyB0aGUgcmVhZCByZXF1ZXN0IGFuZCBjb252ZXJ0cyB0aGUgcmVzcG9uc2UgdG8gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZSB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIHJlYWQoaWQ6IHN0cmluZyB8IG51bWJlciwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW4gZXhpc3RpbmcgcmVzb3VyY2VcbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbiBleGlzdGluZyByZXNvdXJjZSBpbiB0aGUgUkVTVCBBUEkgdXNpbmcgdGhlIHByb3ZpZGVkIG1vZGVsLlxuICAgKiBUaGUgbWV0aG9kIHByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdGhlIGFkYXB0ZXIsIHNlbmRzIHRoZSB1cGRhdGUgcmVxdWVzdCxcbiAgICogYW5kIHRoZW4gY29udmVydHMgdGhlIHJlc3BvbnNlIGJhY2sgdG8gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB3aXRoIHVwZGF0ZWQgZGF0YVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB1cGRhdGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBhc3luYyB1cGRhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlc291cmNlIGJ5IElEXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSByZXNvdXJjZSBmcm9tIHRoZSBSRVNUIEFQSSB1c2luZyB0aGUgcHJvdmlkZWQgSUQuXG4gICAqIFRoZSBtZXRob2Qgc2VuZHMgdGhlIGRlbGV0ZSByZXF1ZXN0IGFuZCBjb252ZXJ0cyB0aGUgcmVzcG9uc2UgdG8gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZSB0byBkZWxldGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcgfCBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGUodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgcmVzb3VyY2VzXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgbXVsdGlwbGUgcmVzb3VyY2VzIGluIHRoZSBSRVNUIEFQSSB1c2luZyB0aGUgcHJvdmlkZWQgbW9kZWxzLlxuICAgKiBUaGUgbWV0aG9kIHByZXBhcmVzIGVhY2ggbW9kZWwgZm9yIHRoZSBhZGFwdGVyLCBzZW5kcyBhIGJ1bGsgY3JlYXRlIHJlcXVlc3QsXG4gICAqIGFuZCB0aGVuIGNvbnZlcnRzIHRoZSByZXNwb25zZXMgYmFjayB0byBtb2RlbCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWwgaW5zdGFuY2VzIHRvIGNyZWF0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgY3JlYXRlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIG1vZGVscztcbiAgICBjb25zdCBwcmVwYXJlZCA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGxldCByZWNvcmRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIGlkcyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgICAgcmVjb3JkcyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIHJlc291cmNlcyBieSBJRHNcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSByZXNvdXJjZXMgZnJvbSB0aGUgUkVTVCBBUEkgdXNpbmcgdGhlIHByb3ZpZGVkIElEcy5cbiAgICogVGhlIG1ldGhvZCBzZW5kcyBhIGJ1bGsgZGVsZXRlIHJlcXVlc3QgYW5kIGNvbnZlcnRzIHRoZSByZXNwb25zZXMgdG8gbW9kZWwgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSByZXNvdXJjZXMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBhZGFwdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiBkZWxldGVkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsKGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZUFsbCh0aGlzLnRhYmxlTmFtZSwga2V5cywgLi4uYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSByZXNvdXJjZXMgYnkgSURzXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgcmVzb3VyY2VzIGZyb20gdGhlIFJFU1QgQVBJIHVzaW5nIHRoZSBwcm92aWRlZCBJRHMuXG4gICAqIFRoZSBtZXRob2Qgc2VuZHMgYSBidWxrIHJlYWQgcmVxdWVzdCBhbmQgY29udmVydHMgdGhlIHJlc3BvbnNlcyB0byBtb2RlbCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGtleXMgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlc291cmNlcyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgYXN5bmMgcmVhZEFsbChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKHRoaXMudGFibGVOYW1lLCBrZXlzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZXNvdXJjZXNcbiAgICogQHN1bW1hcnkgVXBkYXRlcyBtdWx0aXBsZSByZXNvdXJjZXMgaW4gdGhlIFJFU1QgQVBJIHVzaW5nIHRoZSBwcm92aWRlZCBtb2RlbHMuXG4gICAqIFRoZSBtZXRob2QgcHJlcGFyZXMgZWFjaCBtb2RlbCBmb3IgdGhlIGFkYXB0ZXIsIHNlbmRzIGEgYnVsayB1cGRhdGUgcmVxdWVzdCxcbiAgICogYW5kIHRoZW4gY29udmVydHMgdGhlIHJlc3BvbnNlcyBiYWNrIHRvIG1vZGVsIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbCBpbnN0YW5jZXMgd2l0aCB1cGRhdGVkIGRhdGFcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHVwZGF0ZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBhc3luYyB1cGRhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICByZWNvcmRzLm1hcCgocikgPT4gci5pZCksXG4gICAgICByZWNvcmRzLm1hcCgocikgPT4gci5yZWNvcmQpLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHVwZGF0ZWQubWFwKCh1LCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydCh1LCB0aGlzLmNsYXNzLCB0aGlzLnBrLCByZWNvcmRzW2ldLmlkKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvYnNlcnZlclxuICAgKiBAc3VtbWFyeSBBZGRzIGFuIG9ic2VydmVyIHRvIHRoZSBsaXN0IG9mIG9ic2VydmVycyB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgY2hhbmdlcy5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBvYnNlcnZlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHJlZ2lzdGVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk9ic2VydmVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5wdXNoKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhbiBvYnNlcnZlciBmcm9tIHRoZSBsaXN0IG9mIG9ic2VydmVycy5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBvYnNlcnZlciBpcyBub3QgZm91bmQuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIG9ic2VydmVyIGlzIG5vdCBmb3VuZFxuICAgKi9cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIHJlZnJlc2ggbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyB0byB1cGRhdGUgdGhlbXNlbHZlcy5cbiAgICogQW55IGVycm9ycyBkdXJpbmcgb2JzZXJ2ZXIgcmVmcmVzaCBhcmUgbG9nZ2VkIGFzIHdhcm5pbmdzIGJ1dCBkb24ndCBzdG9wIHRoZSBwcm9jZXNzLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb2JzZXJ2ZXIgcmVmcmVzaCBtZXRob2RcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiB1cGRhdGVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLnJlZnJlc2goLi4uYXJncykpXG4gICAgKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIG9ic2VydmFibGUgJHt0aGlzLm9ic2VydmVyc1tpXX06ICR7cmVzdWx0LnJlYXNvbn1gXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
package/lib/RestService.d.ts
CHANGED
|
@@ -3,42 +3,185 @@ import { Constructor, Model } from "@decaf-ts/decorator-validation";
|
|
|
3
3
|
import { Observable, Observer } from "@decaf-ts/core";
|
|
4
4
|
import { HttpAdapter } from "./adapter";
|
|
5
5
|
import { HttpFlags } from "./types";
|
|
6
|
+
/**
|
|
7
|
+
* @description Service class for REST API operations
|
|
8
|
+
* @summary Provides a comprehensive implementation for interacting with REST APIs.
|
|
9
|
+
* This class implements CRUD operations for single and bulk operations, as well as
|
|
10
|
+
* the Observable pattern to notify observers of changes. It works with HTTP adapters
|
|
11
|
+
* to perform the actual API requests and handles model conversion.
|
|
12
|
+
* @template M - The model type, extending Model
|
|
13
|
+
* @template Q - The query type used by the adapter
|
|
14
|
+
* @template A - The HTTP adapter type, extending HttpAdapter
|
|
15
|
+
* @template F - The HTTP flags type, extending HttpFlags
|
|
16
|
+
* @template C - The context type, extending Context<F>
|
|
17
|
+
* @param {A} adapter - The HTTP adapter instance
|
|
18
|
+
* @param {Constructor<M>} [clazz] - Optional constructor for the model class
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* // Create a service for User model with Axios adapter
|
|
22
|
+
* const axiosAdapter = new AxiosAdapter({
|
|
23
|
+
* protocol: 'https',
|
|
24
|
+
* host: 'api.example.com'
|
|
25
|
+
* });
|
|
26
|
+
* const userService = new RestService(axiosAdapter, User);
|
|
27
|
+
*
|
|
28
|
+
* // Create a new user
|
|
29
|
+
* const user = new User({ name: 'John Doe', email: 'john@example.com' });
|
|
30
|
+
* const createdUser = await userService.create(user);
|
|
31
|
+
*
|
|
32
|
+
* // Update a user
|
|
33
|
+
* createdUser.name = 'Jane Doe';
|
|
34
|
+
* const updatedUser = await userService.update(createdUser);
|
|
35
|
+
*
|
|
36
|
+
* // Delete a user
|
|
37
|
+
* await userService.delete(updatedUser.id);
|
|
38
|
+
* ```
|
|
39
|
+
* @class
|
|
40
|
+
*/
|
|
6
41
|
export declare class RestService<M extends Model, Q, A extends HttpAdapter<any, Q, F, C>, F extends HttpFlags = HttpFlags, C extends Context<F> = Context<F>> implements CrudOperator<M>, BulkCrudOperator<M>, Observable {
|
|
7
42
|
private readonly _class;
|
|
8
43
|
private _pk;
|
|
44
|
+
/**
|
|
45
|
+
* @description Gets the model class constructor
|
|
46
|
+
* @summary Retrieves the model class constructor associated with this service.
|
|
47
|
+
* Throws an error if no class definition is found.
|
|
48
|
+
* @return {Constructor<M>} The model class constructor
|
|
49
|
+
* @throws {InternalError} If no class definition is found
|
|
50
|
+
*/
|
|
9
51
|
get class(): Constructor<M>;
|
|
52
|
+
/**
|
|
53
|
+
* @description Gets the primary key property name
|
|
54
|
+
* @summary Retrieves the name of the primary key property for the model.
|
|
55
|
+
* If not already determined, it finds the primary key using the model class.
|
|
56
|
+
* @return The primary key property name
|
|
57
|
+
*/
|
|
10
58
|
get pk(): keyof M;
|
|
11
59
|
protected observers: Observer[];
|
|
12
60
|
private readonly _adapter;
|
|
13
61
|
private _tableName;
|
|
62
|
+
/**
|
|
63
|
+
* @description Gets the HTTP adapter
|
|
64
|
+
* @summary Retrieves the HTTP adapter associated with this service.
|
|
65
|
+
* Throws an error if no adapter is found.
|
|
66
|
+
* @return {A} The HTTP adapter instance
|
|
67
|
+
* @throws {InternalError} If no adapter is found
|
|
68
|
+
*/
|
|
14
69
|
protected get adapter(): A;
|
|
70
|
+
/**
|
|
71
|
+
* @description Gets the table name for the model
|
|
72
|
+
* @summary Retrieves the table name associated with the model class.
|
|
73
|
+
* If not already determined, it gets the table name from the Repository utility.
|
|
74
|
+
* @return {string} The table name
|
|
75
|
+
*/
|
|
15
76
|
protected get tableName(): string;
|
|
77
|
+
/**
|
|
78
|
+
* @description Initializes a new RestService instance
|
|
79
|
+
* @summary Creates a new service instance with the specified adapter and optional model class.
|
|
80
|
+
* The constructor stores the adapter and model class for later use in CRUD operations.
|
|
81
|
+
* @param {A} adapter - The HTTP adapter instance to use for API requests
|
|
82
|
+
* @param {Constructor<M>} [clazz] - Optional constructor for the model class
|
|
83
|
+
*/
|
|
16
84
|
constructor(adapter: A, clazz?: Constructor<M>);
|
|
85
|
+
/**
|
|
86
|
+
* @description Creates a new resource
|
|
87
|
+
* @summary Creates a new resource in the REST API using the provided model.
|
|
88
|
+
* The method prepares the model for the adapter, sends the create request,
|
|
89
|
+
* and then converts the response back to a model instance.
|
|
90
|
+
* @param {M} model - The model instance to create
|
|
91
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
92
|
+
* @return {Promise<M>} A promise that resolves with the created model instance
|
|
93
|
+
*/
|
|
17
94
|
create(model: M, ...args: any[]): Promise<M>;
|
|
95
|
+
/**
|
|
96
|
+
* @description Retrieves a resource by ID
|
|
97
|
+
* @summary Fetches a resource from the REST API using the provided ID.
|
|
98
|
+
* The method sends the read request and converts the response to a model instance.
|
|
99
|
+
* @param {string|number} id - The identifier of the resource to retrieve
|
|
100
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
101
|
+
* @return {Promise<M>} A promise that resolves with the retrieved model instance
|
|
102
|
+
*/
|
|
18
103
|
read(id: string | number, ...args: any[]): Promise<M>;
|
|
104
|
+
/**
|
|
105
|
+
* @description Updates an existing resource
|
|
106
|
+
* @summary Updates an existing resource in the REST API using the provided model.
|
|
107
|
+
* The method prepares the model for the adapter, sends the update request,
|
|
108
|
+
* and then converts the response back to a model instance.
|
|
109
|
+
* @param {M} model - The model instance with updated data
|
|
110
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
111
|
+
* @return {Promise<M>} A promise that resolves with the updated model instance
|
|
112
|
+
*/
|
|
19
113
|
update(model: M, ...args: any[]): Promise<M>;
|
|
114
|
+
/**
|
|
115
|
+
* @description Deletes a resource by ID
|
|
116
|
+
* @summary Removes a resource from the REST API using the provided ID.
|
|
117
|
+
* The method sends the delete request and converts the response to a model instance.
|
|
118
|
+
* @param {string|number} id - The identifier of the resource to delete
|
|
119
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
120
|
+
* @return {Promise<M>} A promise that resolves with the deleted model instance
|
|
121
|
+
*/
|
|
20
122
|
delete(id: string | number, ...args: any[]): Promise<M>;
|
|
123
|
+
/**
|
|
124
|
+
* @description Creates multiple resources
|
|
125
|
+
* @summary Creates multiple resources in the REST API using the provided models.
|
|
126
|
+
* The method prepares each model for the adapter, sends a bulk create request,
|
|
127
|
+
* and then converts the responses back to model instances.
|
|
128
|
+
* @param {M[]} models - The model instances to create
|
|
129
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
130
|
+
* @return {Promise<M[]>} A promise that resolves with an array of created model instances
|
|
131
|
+
*/
|
|
21
132
|
createAll(models: M[], ...args: any[]): Promise<M[]>;
|
|
133
|
+
/**
|
|
134
|
+
* @description Deletes multiple resources by IDs
|
|
135
|
+
* @summary Removes multiple resources from the REST API using the provided IDs.
|
|
136
|
+
* The method sends a bulk delete request and converts the responses to model instances.
|
|
137
|
+
* @param {string[]|number[]} keys - The identifiers of the resources to delete
|
|
138
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
139
|
+
* @return {Promise<M[]>} A promise that resolves with an array of deleted model instances
|
|
140
|
+
*/
|
|
22
141
|
deleteAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
|
|
142
|
+
/**
|
|
143
|
+
* @description Retrieves multiple resources by IDs
|
|
144
|
+
* @summary Fetches multiple resources from the REST API using the provided IDs.
|
|
145
|
+
* The method sends a bulk read request and converts the responses to model instances.
|
|
146
|
+
* @param {string[]|number[]} keys - The identifiers of the resources to retrieve
|
|
147
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
148
|
+
* @return {Promise<M[]>} A promise that resolves with an array of retrieved model instances
|
|
149
|
+
*/
|
|
23
150
|
readAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
|
|
151
|
+
/**
|
|
152
|
+
* @description Updates multiple resources
|
|
153
|
+
* @summary Updates multiple resources in the REST API using the provided models.
|
|
154
|
+
* The method prepares each model for the adapter, sends a bulk update request,
|
|
155
|
+
* and then converts the responses back to model instances.
|
|
156
|
+
* @param {M[]} models - The model instances with updated data
|
|
157
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
158
|
+
* @return {Promise<M[]>} A promise that resolves with an array of updated model instances
|
|
159
|
+
*/
|
|
24
160
|
updateAll(models: M[], ...args: any[]): Promise<M[]>;
|
|
25
161
|
/**
|
|
26
|
-
* @
|
|
27
|
-
* @
|
|
28
|
-
*
|
|
29
|
-
* @
|
|
162
|
+
* @description Registers an observer
|
|
163
|
+
* @summary Adds an observer to the list of observers that will be notified of changes.
|
|
164
|
+
* Throws an error if the observer is already registered.
|
|
165
|
+
* @param {Observer} observer - The observer to register
|
|
166
|
+
* @return {void}
|
|
167
|
+
* @throws {InternalError} If the observer is already registered
|
|
30
168
|
*/
|
|
31
169
|
observe(observer: Observer): void;
|
|
32
170
|
/**
|
|
33
|
-
* @
|
|
34
|
-
* @
|
|
35
|
-
*
|
|
36
|
-
* @
|
|
171
|
+
* @description Unregisters an observer
|
|
172
|
+
* @summary Removes an observer from the list of observers.
|
|
173
|
+
* Throws an error if the observer is not found.
|
|
174
|
+
* @param {Observer} observer - The observer to unregister
|
|
175
|
+
* @return {void}
|
|
176
|
+
* @throws {InternalError} If the observer is not found
|
|
37
177
|
*/
|
|
38
178
|
unObserve(observer: Observer): void;
|
|
39
179
|
/**
|
|
40
|
-
* @
|
|
41
|
-
* @
|
|
180
|
+
* @description Notifies all registered observers
|
|
181
|
+
* @summary Calls the refresh method on all registered observers to update themselves.
|
|
182
|
+
* Any errors during observer refresh are logged as warnings but don't stop the process.
|
|
183
|
+
* @param {...any[]} [args] - Optional arguments to pass to the observer refresh method
|
|
184
|
+
* @return {Promise<void>} A promise that resolves when all observers have been updated
|
|
42
185
|
*/
|
|
43
186
|
updateObservers(...args: any[]): Promise<void>;
|
|
44
187
|
}
|