@decaf-ts/for-fabric 0.0.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 +22 -0
- package/README.md +647 -0
- package/dist/for-fabric.cjs +6223 -0
- package/dist/for-fabric.esm.cjs +6180 -0
- package/lib/client/FabricClientAdapter.cjs +760 -0
- package/lib/client/FabricClientAdapter.d.ts +381 -0
- package/lib/client/FabricClientDispatch.cjs +186 -0
- package/lib/client/FabricClientDispatch.d.ts +125 -0
- package/lib/client/FabricClientRepository.cjs +131 -0
- package/lib/client/FabricClientRepository.d.ts +100 -0
- package/lib/client/erc20/erc20ClientRepository.cjs +343 -0
- package/lib/client/erc20/erc20ClientRepository.d.ts +254 -0
- package/lib/client/fabric-fs.cjs +234 -0
- package/lib/client/fabric-fs.d.ts +92 -0
- package/lib/client/index.cjs +30 -0
- package/lib/client/index.d.ts +13 -0
- package/lib/client/logging.cjs +102 -0
- package/lib/client/logging.d.ts +60 -0
- package/lib/client/services/LoggedService.cjs +47 -0
- package/lib/client/services/LoggedService.d.ts +42 -0
- package/lib/client/services/constants.cjs +3 -0
- package/lib/client/services/constants.d.ts +15 -0
- package/lib/client/services/enrollementService.cjs +344 -0
- package/lib/client/services/enrollementService.d.ts +176 -0
- package/lib/client/services/index.cjs +18 -0
- package/lib/client/services/index.d.ts +1 -0
- package/lib/contracts/ContractAdapter.cjs +730 -0
- package/lib/contracts/ContractAdapter.d.ts +296 -0
- package/lib/contracts/ContractContext.cjs +85 -0
- package/lib/contracts/ContractContext.d.ts +64 -0
- package/lib/contracts/ContractPrivateDataAdapter.cjs +281 -0
- package/lib/contracts/ContractPrivateDataAdapter.d.ts +74 -0
- package/lib/contracts/FabricConstruction.cjs +441 -0
- package/lib/contracts/FabricConstruction.d.ts +304 -0
- package/lib/contracts/FabricContractRepository.cjs +306 -0
- package/lib/contracts/FabricContractRepository.d.ts +162 -0
- package/lib/contracts/FabricContractRepositoryObservableHandler.cjs +85 -0
- package/lib/contracts/FabricContractRepositoryObservableHandler.d.ts +62 -0
- package/lib/contracts/FabricContractSequence.cjs +139 -0
- package/lib/contracts/FabricContractSequence.d.ts +61 -0
- package/lib/contracts/FabricContractStatement.cjs +119 -0
- package/lib/contracts/FabricContractStatement.d.ts +34 -0
- package/lib/contracts/PrivateSequence.cjs +36 -0
- package/lib/contracts/PrivateSequence.d.ts +15 -0
- package/lib/contracts/crud/crud-contract.cjs +257 -0
- package/lib/contracts/crud/crud-contract.d.ts +168 -0
- package/lib/contracts/crud/index.cjs +19 -0
- package/lib/contracts/crud/index.d.ts +2 -0
- package/lib/contracts/crud/serialized-crud-contract.cjs +172 -0
- package/lib/contracts/crud/serialized-crud-contract.d.ts +37 -0
- package/lib/contracts/erc20/erc20contract.cjs +569 -0
- package/lib/contracts/erc20/erc20contract.d.ts +151 -0
- package/lib/contracts/erc20/index.cjs +21 -0
- package/lib/contracts/erc20/index.d.ts +2 -0
- package/lib/contracts/erc20/models.cjs +209 -0
- package/lib/contracts/erc20/models.d.ts +114 -0
- package/lib/contracts/index.cjs +32 -0
- package/lib/contracts/index.d.ts +15 -0
- package/lib/contracts/logging.cjs +96 -0
- package/lib/contracts/logging.d.ts +49 -0
- package/lib/contracts/private-data.cjs +121 -0
- package/lib/contracts/private-data.d.ts +16 -0
- package/lib/contracts/types.cjs +3 -0
- package/lib/contracts/types.d.ts +26 -0
- package/lib/esm/client/FabricClientAdapter.d.ts +381 -0
- package/lib/esm/client/FabricClientAdapter.js +723 -0
- package/lib/esm/client/FabricClientDispatch.d.ts +125 -0
- package/lib/esm/client/FabricClientDispatch.js +182 -0
- package/lib/esm/client/FabricClientRepository.d.ts +100 -0
- package/lib/esm/client/FabricClientRepository.js +127 -0
- package/lib/esm/client/erc20/erc20ClientRepository.d.ts +254 -0
- package/lib/esm/client/erc20/erc20ClientRepository.js +339 -0
- package/lib/esm/client/fabric-fs.d.ts +92 -0
- package/lib/esm/client/fabric-fs.js +191 -0
- package/lib/esm/client/index.d.ts +13 -0
- package/lib/esm/client/index.js +14 -0
- package/lib/esm/client/logging.d.ts +60 -0
- package/lib/esm/client/logging.js +98 -0
- package/lib/esm/client/services/LoggedService.d.ts +42 -0
- package/lib/esm/client/services/LoggedService.js +43 -0
- package/lib/esm/client/services/constants.d.ts +15 -0
- package/lib/esm/client/services/constants.js +2 -0
- package/lib/esm/client/services/enrollementService.d.ts +176 -0
- package/lib/esm/client/services/enrollementService.js +337 -0
- package/lib/esm/client/services/index.d.ts +1 -0
- package/lib/esm/client/services/index.js +2 -0
- package/lib/esm/contracts/ContractAdapter.d.ts +296 -0
- package/lib/esm/contracts/ContractAdapter.js +724 -0
- package/lib/esm/contracts/ContractContext.d.ts +64 -0
- package/lib/esm/contracts/ContractContext.js +81 -0
- package/lib/esm/contracts/ContractPrivateDataAdapter.d.ts +74 -0
- package/lib/esm/contracts/ContractPrivateDataAdapter.js +277 -0
- package/lib/esm/contracts/FabricConstruction.d.ts +304 -0
- package/lib/esm/contracts/FabricConstruction.js +433 -0
- package/lib/esm/contracts/FabricContractRepository.d.ts +162 -0
- package/lib/esm/contracts/FabricContractRepository.js +302 -0
- package/lib/esm/contracts/FabricContractRepositoryObservableHandler.d.ts +62 -0
- package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js +81 -0
- package/lib/esm/contracts/FabricContractSequence.d.ts +61 -0
- package/lib/esm/contracts/FabricContractSequence.js +135 -0
- package/lib/esm/contracts/FabricContractStatement.d.ts +34 -0
- package/lib/esm/contracts/FabricContractStatement.js +115 -0
- package/lib/esm/contracts/PrivateSequence.d.ts +15 -0
- package/lib/esm/contracts/PrivateSequence.js +33 -0
- package/lib/esm/contracts/crud/crud-contract.d.ts +168 -0
- package/lib/esm/contracts/crud/crud-contract.js +253 -0
- package/lib/esm/contracts/crud/index.d.ts +2 -0
- package/lib/esm/contracts/crud/index.js +3 -0
- package/lib/esm/contracts/crud/serialized-crud-contract.d.ts +37 -0
- package/lib/esm/contracts/crud/serialized-crud-contract.js +168 -0
- package/lib/esm/contracts/erc20/erc20contract.d.ts +151 -0
- package/lib/esm/contracts/erc20/erc20contract.js +565 -0
- package/lib/esm/contracts/erc20/index.d.ts +2 -0
- package/lib/esm/contracts/erc20/index.js +4 -0
- package/lib/esm/contracts/erc20/models.d.ts +114 -0
- package/lib/esm/contracts/erc20/models.js +206 -0
- package/lib/esm/contracts/index.d.ts +15 -0
- package/lib/esm/contracts/index.js +16 -0
- package/lib/esm/contracts/logging.d.ts +49 -0
- package/lib/esm/contracts/logging.js +92 -0
- package/lib/esm/contracts/private-data.d.ts +16 -0
- package/lib/esm/contracts/private-data.js +113 -0
- package/lib/esm/contracts/types.d.ts +26 -0
- package/lib/esm/contracts/types.js +2 -0
- package/lib/esm/index.d.ts +8 -0
- package/lib/esm/index.js +9 -0
- package/lib/esm/shared/ClientSerializer.d.ts +52 -0
- package/lib/esm/shared/ClientSerializer.js +80 -0
- package/lib/esm/shared/DeterministicSerializer.d.ts +40 -0
- package/lib/esm/shared/DeterministicSerializer.js +50 -0
- package/lib/esm/shared/SimpleDeterministicSerializer.d.ts +7 -0
- package/lib/esm/shared/SimpleDeterministicSerializer.js +42 -0
- package/lib/esm/shared/constants.d.ts +39 -0
- package/lib/esm/shared/constants.js +42 -0
- package/lib/esm/shared/crypto.d.ts +107 -0
- package/lib/esm/shared/crypto.js +331 -0
- package/lib/esm/shared/decorators.d.ts +24 -0
- package/lib/esm/shared/decorators.js +98 -0
- package/lib/esm/shared/erc20/erc20-constants.d.ts +25 -0
- package/lib/esm/shared/erc20/erc20-constants.js +27 -0
- package/lib/esm/shared/errors.d.ts +116 -0
- package/lib/esm/shared/errors.js +132 -0
- package/lib/esm/shared/events.d.ts +39 -0
- package/lib/esm/shared/events.js +47 -0
- package/lib/esm/shared/fabric-types.d.ts +33 -0
- package/lib/esm/shared/fabric-types.js +2 -0
- package/lib/esm/shared/index.d.ts +13 -0
- package/lib/esm/shared/index.js +14 -0
- package/lib/esm/shared/interfaces/Checkable.d.ts +21 -0
- package/lib/esm/shared/interfaces/Checkable.js +2 -0
- package/lib/esm/shared/math.d.ts +34 -0
- package/lib/esm/shared/math.js +61 -0
- package/lib/esm/shared/model/Identity.d.ts +42 -0
- package/lib/esm/shared/model/Identity.js +78 -0
- package/lib/esm/shared/model/IdentityCredentials.d.ts +41 -0
- package/lib/esm/shared/model/IdentityCredentials.js +74 -0
- package/lib/esm/shared/model/index.d.ts +1 -0
- package/lib/esm/shared/model/index.js +2 -0
- package/lib/esm/shared/model/utils.d.ts +60 -0
- package/lib/esm/shared/model/utils.js +108 -0
- package/lib/esm/shared/types.d.ts +79 -0
- package/lib/esm/shared/types.js +2 -0
- package/lib/esm/shared/utils.d.ts +55 -0
- package/lib/esm/shared/utils.js +148 -0
- package/lib/index.cjs +25 -0
- package/lib/index.d.ts +8 -0
- package/lib/shared/ClientSerializer.cjs +84 -0
- package/lib/shared/ClientSerializer.d.ts +52 -0
- package/lib/shared/DeterministicSerializer.cjs +54 -0
- package/lib/shared/DeterministicSerializer.d.ts +40 -0
- package/lib/shared/SimpleDeterministicSerializer.cjs +46 -0
- package/lib/shared/SimpleDeterministicSerializer.d.ts +7 -0
- package/lib/shared/constants.cjs +45 -0
- package/lib/shared/constants.d.ts +39 -0
- package/lib/shared/crypto.cjs +369 -0
- package/lib/shared/crypto.d.ts +107 -0
- package/lib/shared/decorators.cjs +105 -0
- package/lib/shared/decorators.d.ts +24 -0
- package/lib/shared/erc20/erc20-constants.cjs +30 -0
- package/lib/shared/erc20/erc20-constants.d.ts +25 -0
- package/lib/shared/errors.cjs +142 -0
- package/lib/shared/errors.d.ts +116 -0
- package/lib/shared/events.cjs +51 -0
- package/lib/shared/events.d.ts +39 -0
- package/lib/shared/fabric-types.cjs +4 -0
- package/lib/shared/fabric-types.d.ts +33 -0
- package/lib/shared/index.cjs +30 -0
- package/lib/shared/index.d.ts +13 -0
- package/lib/shared/interfaces/Checkable.cjs +3 -0
- package/lib/shared/interfaces/Checkable.d.ts +21 -0
- package/lib/shared/math.cjs +66 -0
- package/lib/shared/math.d.ts +34 -0
- package/lib/shared/model/Identity.cjs +81 -0
- package/lib/shared/model/Identity.d.ts +42 -0
- package/lib/shared/model/IdentityCredentials.cjs +77 -0
- package/lib/shared/model/IdentityCredentials.d.ts +41 -0
- package/lib/shared/model/index.cjs +18 -0
- package/lib/shared/model/index.d.ts +1 -0
- package/lib/shared/model/utils.cjs +114 -0
- package/lib/shared/model/utils.d.ts +60 -0
- package/lib/shared/types.cjs +3 -0
- package/lib/shared/types.d.ts +79 -0
- package/lib/shared/utils.cjs +185 -0
- package/lib/shared/utils.d.ts +55 -0
- package/package.json +166 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FabricCrudContract = void 0;
|
|
4
|
+
const ContractAdapter_1 = require("./../ContractAdapter.cjs");
|
|
5
|
+
const fabric_contract_api_1 = require("fabric-contract-api");
|
|
6
|
+
const core_1 = require("@decaf-ts/core");
|
|
7
|
+
const DeterministicSerializer_1 = require("./../../shared/DeterministicSerializer.cjs");
|
|
8
|
+
const logging_1 = require("@decaf-ts/logging");
|
|
9
|
+
const private_data_1 = require("./../private-data.cjs");
|
|
10
|
+
const ContractPrivateDataAdapter_1 = require("./../ContractPrivateDataAdapter.cjs");
|
|
11
|
+
/**
|
|
12
|
+
* @description Base contract class for CRUD operations in Fabric chaincode
|
|
13
|
+
* @summary Provides standard create, read, update, and delete operations for models in Fabric chaincode
|
|
14
|
+
* @template M - Type extending Model
|
|
15
|
+
* @class FabricCrudContract
|
|
16
|
+
* @extends {Contract}
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Define a model
|
|
20
|
+
* @table('assets')
|
|
21
|
+
* class Asset extends Model {
|
|
22
|
+
* @id()
|
|
23
|
+
* id: string;
|
|
24
|
+
*
|
|
25
|
+
* @property()
|
|
26
|
+
* data: string;
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* // Create a contract that extends FabricCrudContract
|
|
30
|
+
* export class AssetContract extends FabricCrudContract<Asset> {
|
|
31
|
+
* constructor() {
|
|
32
|
+
* super('AssetContract', Asset);
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* // Add custom methods as needed
|
|
36
|
+
* async getAssetHistory(ctx: Context, id: string): Promise<any[]> {
|
|
37
|
+
* // Custom implementation
|
|
38
|
+
* }
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
* @mermaid
|
|
42
|
+
* sequenceDiagram
|
|
43
|
+
* participant Client
|
|
44
|
+
* participant Contract
|
|
45
|
+
* participant Repository
|
|
46
|
+
* participant Adapter
|
|
47
|
+
* participant StateDB
|
|
48
|
+
*
|
|
49
|
+
* Client->>Contract: create(ctx, model)
|
|
50
|
+
* Contract->>Repository: repository(ctx)
|
|
51
|
+
* Contract->>Repository: create(model, ctx)
|
|
52
|
+
* Repository->>Adapter: create(tableName, id, record, transient, ctx)
|
|
53
|
+
* Adapter->>StateDB: putState(id, serializedData)
|
|
54
|
+
* StateDB-->>Adapter: Success
|
|
55
|
+
* Adapter-->>Repository: record
|
|
56
|
+
* Repository-->>Contract: model
|
|
57
|
+
* Contract-->>Client: model
|
|
58
|
+
*/
|
|
59
|
+
class FabricCrudContract extends fabric_contract_api_1.Contract {
|
|
60
|
+
static { this.serializer = new DeterministicSerializer_1.DeterministicSerializer(); }
|
|
61
|
+
/**
|
|
62
|
+
* @description Creates a new FabricCrudContract instance
|
|
63
|
+
* @summary Initializes a contract with a name and model class
|
|
64
|
+
* @param {string} name - The name of the contract
|
|
65
|
+
* @param {Constructor<M>} clazz - The model constructor
|
|
66
|
+
*/
|
|
67
|
+
constructor(name, clazz) {
|
|
68
|
+
super(name);
|
|
69
|
+
this.clazz = clazz;
|
|
70
|
+
this.initialized = false;
|
|
71
|
+
FabricCrudContract.adapter = this.getAdapter(clazz);
|
|
72
|
+
this.repo = core_1.Repository.forModel(clazz, FabricCrudContract.adapter.alias);
|
|
73
|
+
}
|
|
74
|
+
getAdapter(clazz) {
|
|
75
|
+
const instance = new clazz();
|
|
76
|
+
if ((0, private_data_1.isModelPrivate)(instance)) {
|
|
77
|
+
const pvt = (0, private_data_1.modelToPrivate)(instance);
|
|
78
|
+
const collections = Object.keys(pvt.private);
|
|
79
|
+
return new ContractPrivateDataAdapter_1.FabricContractPrivateDataAdapter(undefined, "fabric-private-data-adapter", collections);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return new ContractAdapter_1.FabricContractAdapter(undefined, "fabric-public-data-adapter");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* @description Creates a logger for a specific chaincode context
|
|
87
|
+
* @summary Returns a ContractLogger instance configured for the current context
|
|
88
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
89
|
+
* @return {ContractLogger} The logger instance
|
|
90
|
+
*/
|
|
91
|
+
logFor(ctx) {
|
|
92
|
+
return logging_1.Logging.for(FabricCrudContract.name, {}, ctx);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @description Creates a single model in the state database
|
|
96
|
+
* @summary Delegates to the repository's create method
|
|
97
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
98
|
+
* @param {M} model - The model to create
|
|
99
|
+
* @param {...any[]} args - Additional arguments
|
|
100
|
+
* @return {Promise<M>} Promise resolving to the created model
|
|
101
|
+
*/
|
|
102
|
+
async create(ctx, model, ...args) {
|
|
103
|
+
const log = this.logFor(ctx).for(this.create);
|
|
104
|
+
if (typeof model === "string")
|
|
105
|
+
model = this.deserialize(model);
|
|
106
|
+
log.info(`Creating model: ${JSON.stringify(model)}`);
|
|
107
|
+
const transient = this.getTransientData(ctx);
|
|
108
|
+
log.info(`Merging transient data...`);
|
|
109
|
+
model = this.repo.merge(model, transient);
|
|
110
|
+
return this.repo.create(model, ctx, ...args);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* @description Reads a single model from the state database
|
|
114
|
+
* @summary Delegates to the repository's read method
|
|
115
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
116
|
+
* @param {string | number} key - The key of the model to read
|
|
117
|
+
* @param {...any[]} args - Additional arguments
|
|
118
|
+
* @return {Promise<M>} Promise resolving to the retrieved model
|
|
119
|
+
*/
|
|
120
|
+
async read(ctx, key, ...args) {
|
|
121
|
+
const log = this.logFor(ctx).for(this.read);
|
|
122
|
+
log.info(`reading entry with pk ${key} `);
|
|
123
|
+
return this.repo.read(key, ctx, ...args);
|
|
124
|
+
}
|
|
125
|
+
getTransientData(ctx) {
|
|
126
|
+
const transientMap = ctx.stub.getTransient();
|
|
127
|
+
let transient = {};
|
|
128
|
+
if (transientMap.has(this.repo.tableName)) {
|
|
129
|
+
transient = JSON.parse(transientMap.get(this.repo.tableName)?.toString("utf8"));
|
|
130
|
+
}
|
|
131
|
+
return transient;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* @description Updates a single model in the state database
|
|
135
|
+
* @summary Delegates to the repository's update method
|
|
136
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
137
|
+
* @param {M} model - The model to update
|
|
138
|
+
* @param {...any[]} args - Additional arguments
|
|
139
|
+
* @return {Promise<M>} Promise resolving to the updated model
|
|
140
|
+
*/
|
|
141
|
+
async update(ctx, model, ...args) {
|
|
142
|
+
const log = this.logFor(ctx).for(this.update);
|
|
143
|
+
if (typeof model === "string")
|
|
144
|
+
model = this.deserialize(model);
|
|
145
|
+
log.info(`Updating model: ${JSON.stringify(model)}`);
|
|
146
|
+
const transient = this.getTransientData(ctx);
|
|
147
|
+
log.info(`Merging transient data...`);
|
|
148
|
+
model = this.repo.merge(model, transient);
|
|
149
|
+
return this.repo.update(model, ctx, ...args);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* @description Deletes a single model from the state database
|
|
153
|
+
* @summary Delegates to the repository's delete method
|
|
154
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
155
|
+
* @param {string | number} key - The key of the model to delete
|
|
156
|
+
* @param {...any[]} args - Additional arguments
|
|
157
|
+
* @return {Promise<M>} Promise resolving to the deleted model
|
|
158
|
+
*/
|
|
159
|
+
async delete(ctx, key, ...args) {
|
|
160
|
+
const log = this.logFor(ctx).for(this.delete);
|
|
161
|
+
log.info(`deleting entry with pk ${key} `);
|
|
162
|
+
return this.repo.delete(String(key), ctx, ...args);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* @description Deletes multiple models from the state database
|
|
166
|
+
* @summary Delegates to the repository's deleteAll method
|
|
167
|
+
* @param {string[] | number[]} keys - The keys of the models to delete
|
|
168
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
169
|
+
* @param {...any[]} args - Additional arguments
|
|
170
|
+
* @return {Promise<M[]>} Promise resolving to the deleted models
|
|
171
|
+
*/
|
|
172
|
+
async deleteAll(ctx, keys, ...args) {
|
|
173
|
+
if (typeof keys === "string")
|
|
174
|
+
keys = JSON.parse(keys);
|
|
175
|
+
return this.repo.deleteAll(keys, ctx, ...args);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* @description Reads multiple models from the state database
|
|
179
|
+
* @summary Delegates to the repository's readAll method
|
|
180
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
181
|
+
* @param {string[] | number[]} keys - The keys of the models to read
|
|
182
|
+
* @param {...any[]} args - Additional arguments
|
|
183
|
+
* @return {Promise<M[]>} Promise resolving to the retrieved models
|
|
184
|
+
*/
|
|
185
|
+
async readAll(ctx, keys, ...args) {
|
|
186
|
+
if (typeof keys === "string")
|
|
187
|
+
keys = JSON.parse(keys);
|
|
188
|
+
return this.repo.readAll(keys, ctx, ...args);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* @description Updates multiple models in the state database
|
|
192
|
+
* @summary Delegates to the repository's updateAll method
|
|
193
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
194
|
+
* @param {M[]} models - The models to update
|
|
195
|
+
* @param {...any[]} args - Additional arguments
|
|
196
|
+
* @return {Promise<M[]>} Promise resolving to the updated models
|
|
197
|
+
*/
|
|
198
|
+
async updateAll(ctx, models, ...args) {
|
|
199
|
+
const log = this.logFor(ctx).for(this.updateAll);
|
|
200
|
+
if (typeof models === "string")
|
|
201
|
+
models = JSON.parse(models)
|
|
202
|
+
.map((m) => this.deserialize(m))
|
|
203
|
+
.map((m) => new this.clazz(m));
|
|
204
|
+
log.info(`updating ${models.length} entries to the table`);
|
|
205
|
+
return this.repo.updateAll(models, ctx, ...args);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* @description Executes a raw query against the state database
|
|
209
|
+
* @summary Delegates to the repository's raw method
|
|
210
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
211
|
+
* @param {any} rawInput - The query to execute
|
|
212
|
+
* @param {boolean} docsOnly - Whether to return only documents
|
|
213
|
+
* @param {...any[]} args - Additional arguments
|
|
214
|
+
* @return {Promise<any>} Promise resolving to the query results
|
|
215
|
+
*/
|
|
216
|
+
async raw(ctx, rawInput, docsOnly, ...args) {
|
|
217
|
+
if (typeof rawInput === "string")
|
|
218
|
+
rawInput = JSON.parse(rawInput);
|
|
219
|
+
return this.repo.raw(rawInput, docsOnly, ctx, ...args);
|
|
220
|
+
}
|
|
221
|
+
serialize(model) {
|
|
222
|
+
return FabricCrudContract.serializer.serialize(model);
|
|
223
|
+
}
|
|
224
|
+
deserialize(str) {
|
|
225
|
+
return FabricCrudContract.serializer.deserialize(str);
|
|
226
|
+
}
|
|
227
|
+
async init(ctx) {
|
|
228
|
+
const log = this.logFor(ctx).for(this.init);
|
|
229
|
+
log.info(`Running contract initialization...`);
|
|
230
|
+
this.initialized = true;
|
|
231
|
+
log.info(`Contract initialization completed.`);
|
|
232
|
+
}
|
|
233
|
+
async healthcheck(ctx) {
|
|
234
|
+
const log = this.logFor(ctx).for(this.healthcheck);
|
|
235
|
+
log.info(`Running Healthcheck: ${this.initialized}...`);
|
|
236
|
+
return { healthcheck: this.initialized };
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* @description Creates multiple models in the state database
|
|
240
|
+
* @summary Delegates to the repository's createAll method
|
|
241
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
242
|
+
* @param {M[]} models - The models to create
|
|
243
|
+
* @param {...any[]} args - Additional arguments
|
|
244
|
+
* @return {Promise<M[]>} Promise resolving to the created models
|
|
245
|
+
*/
|
|
246
|
+
async createAll(ctx, models, ...args) {
|
|
247
|
+
const log = this.logFor(ctx).for(this.createAll);
|
|
248
|
+
if (typeof models === "string")
|
|
249
|
+
models = JSON.parse(models)
|
|
250
|
+
.map((m) => this.deserialize(m))
|
|
251
|
+
.map((m) => new this.clazz(m));
|
|
252
|
+
log.info(`adding ${models.length} entries to the table`);
|
|
253
|
+
return this.repo.createAll(models, ctx, ...args);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.FabricCrudContract = FabricCrudContract;
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1jb250cmFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250cmFjdHMvY3J1ZC9jcnVkLWNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDhEQUEyRDtBQUMzRCw2REFBd0U7QUFFeEUseUNBQTRDO0FBRTVDLHdGQUErRTtBQUkvRSwrQ0FBNEM7QUFDNUMsd0RBQWlFO0FBQ2pFLG9GQUFpRjtBQUVqRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQ0c7QUFDSCxNQUFzQixrQkFDcEIsU0FBUSw4QkFBUTthQVVVLGVBQVUsR0FBRyxJQUFJLGlEQUF1QixFQUFFLEFBQWhDLENBQWlDO0lBSXJFOzs7OztPQUtHO0lBQ0gsWUFDRSxJQUFZLEVBQ08sS0FBcUI7UUFFeEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRk8sVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFWaEMsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFhckMsa0JBQWtCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFUyxVQUFVLENBQUMsS0FBcUI7UUFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUU3QixJQUFJLElBQUEsNkJBQWMsRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUEsNkJBQWMsRUFBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFRLENBQUMsQ0FBQztZQUU5QyxPQUFPLElBQUksNkRBQWdDLENBQ3pDLFNBQVMsRUFDVCw2QkFBNkIsRUFDN0IsV0FBVyxDQUNaLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSx1Q0FBcUIsQ0FBQyxTQUFTLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztRQUM1RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEdBQVk7UUFDeEIsT0FBTyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBbUIsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQ1YsR0FBUSxFQUNSLEtBQWlCLEVBQ2pCLEdBQUcsSUFBVztRQUVkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBSSxLQUFLLENBQVEsQ0FBQztRQUV6RSxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0MsR0FBRyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3RDLEtBQUssR0FBSSxJQUFJLENBQUMsSUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFeEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFxQixFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FDUixHQUFRLEVBQ1IsR0FBb0IsRUFDcEIsR0FBRyxJQUFXO1FBRWQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVDLEdBQUcsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFFMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVTLGdCQUFnQixDQUFDLEdBQVE7UUFDakMsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QyxJQUFJLFNBQVMsR0FBUSxFQUFFLENBQUM7UUFFeEIsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFFLElBQUksQ0FBQyxJQUFZLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDbkIsWUFBWSxDQUFDLEdBQUcsQ0FBRSxJQUFJLENBQUMsSUFBWSxDQUFDLFNBQVMsQ0FBWSxFQUFFLFFBQVEsQ0FDbEUsTUFBTSxDQUNHLENBQ1osQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQ1YsR0FBUSxFQUNSLEtBQWlCLEVBQ2pCLEdBQUcsSUFBVztRQUVkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBSSxLQUFLLENBQVEsQ0FBQztRQUV6RSxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0MsR0FBRyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3RDLEtBQUssR0FBSSxJQUFJLENBQUMsSUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFeEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFxQixFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FDVixHQUFRLEVBQ1IsR0FBb0IsRUFDcEIsR0FBRyxJQUFXO1FBRWQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUNiLEdBQVEsRUFDUixJQUFrQyxFQUNsQyxHQUFHLElBQVc7UUFFZCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7WUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQWEsQ0FBQztRQUNsRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQ1gsR0FBUSxFQUNSLElBQWtDLEVBQ2xDLEdBQUcsSUFBVztRQUVkLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtZQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBYSxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FDYixHQUFRLEVBQ1IsTUFBb0IsRUFDcEIsR0FBRyxJQUFXO1FBRWQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtZQUM1QixNQUFNLEdBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQVE7aUJBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQVEsQ0FBQztRQUUxQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksTUFBTSxDQUFDLE1BQU0sdUJBQXVCLENBQUMsQ0FBQztRQUMzRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQXdCLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FDUCxHQUFRLEVBQ1IsUUFBNkIsRUFDN0IsUUFBaUIsRUFDakIsR0FBRyxJQUFXO1FBRWQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRO1lBQzlCLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBZSxDQUFDO1FBQ2hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRVMsU0FBUyxDQUFDLEtBQVE7UUFDMUIsT0FBTyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFUyxXQUFXLENBQWtCLEdBQVc7UUFDaEQsT0FDRSxrQkFBa0IsQ0FBQyxVQUNwQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRVMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFRO1FBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQVE7UUFDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELEdBQUcsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxDQUFDO1FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FDYixHQUFRLEVBQ1IsTUFBb0IsRUFDcEIsR0FBRyxJQUFXO1FBRWQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWpELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtZQUM1QixNQUFNLEdBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQVE7aUJBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQVEsQ0FBQztRQUUxQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLENBQUMsQ0FBQztRQUN6RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQXdCLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDckUsQ0FBQzs7QUE5UkgsZ0RBK1JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmFicmljQ29udHJhY3RBZGFwdGVyIH0gZnJvbSBcIi4uL0NvbnRyYWN0QWRhcHRlclwiO1xuaW1wb3J0IHsgQ29udGV4dCwgQ29udHJhY3QsIENvbnRleHQgYXMgQ3R4IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCwgU2VyaWFsaXplciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeSB9IGZyb20gXCIuLi9GYWJyaWNDb250cmFjdFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IERldGVybWluaXN0aWNTZXJpYWxpemVyIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplclwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IENoZWNrYWJsZSwgaGVhbHRoY2hlY2sgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2ludGVyZmFjZXMvQ2hlY2thYmxlXCI7XG5pbXBvcnQgeyBDb250cmFjdExvZ2dlciB9IGZyb20gXCIuLi9sb2dnaW5nXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBpc01vZGVsUHJpdmF0ZSwgbW9kZWxUb1ByaXZhdGUgfSBmcm9tIFwiLi4vcHJpdmF0ZS1kYXRhXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdFByaXZhdGVEYXRhQWRhcHRlciB9IGZyb20gXCIuLi9Db250cmFjdFByaXZhdGVEYXRhQWRhcHRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGNvbnRyYWN0IGNsYXNzIGZvciBDUlVEIG9wZXJhdGlvbnMgaW4gRmFicmljIGNoYWluY29kZVxuICogQHN1bW1hcnkgUHJvdmlkZXMgc3RhbmRhcmQgY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUgb3BlcmF0aW9ucyBmb3IgbW9kZWxzIGluIEZhYnJpYyBjaGFpbmNvZGVcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBjbGFzcyBGYWJyaWNDcnVkQ29udHJhY3RcbiAqIEBleHRlbmRzIHtDb250cmFjdH1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBEZWZpbmUgYSBtb2RlbFxuICogQHRhYmxlKCdhc3NldHMnKVxuICogY2xhc3MgQXNzZXQgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBpZCgpXG4gKiAgIGlkOiBzdHJpbmc7XG4gKlxuICogICBAcHJvcGVydHkoKVxuICogICBkYXRhOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gQ3JlYXRlIGEgY29udHJhY3QgdGhhdCBleHRlbmRzIEZhYnJpY0NydWRDb250cmFjdFxuICogZXhwb3J0IGNsYXNzIEFzc2V0Q29udHJhY3QgZXh0ZW5kcyBGYWJyaWNDcnVkQ29udHJhY3Q8QXNzZXQ+IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoJ0Fzc2V0Q29udHJhY3QnLCBBc3NldCk7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIEFkZCBjdXN0b20gbWV0aG9kcyBhcyBuZWVkZWRcbiAqICAgYXN5bmMgZ2V0QXNzZXRIaXN0b3J5KGN0eDogQ29udGV4dCwgaWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcbiAqICAgICAvLyBDdXN0b20gaW1wbGVtZW50YXRpb25cbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgU3RhdGVEQlxuICpcbiAqICAgQ2xpZW50LT4+Q29udHJhY3Q6IGNyZWF0ZShjdHgsIG1vZGVsKVxuICogICBDb250cmFjdC0+PlJlcG9zaXRvcnk6IHJlcG9zaXRvcnkoY3R4KVxuICogICBDb250cmFjdC0+PlJlcG9zaXRvcnk6IGNyZWF0ZShtb2RlbCwgY3R4KVxuICogICBSZXBvc2l0b3J5LT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIHJlY29yZCwgdHJhbnNpZW50LCBjdHgpXG4gKiAgIEFkYXB0ZXItPj5TdGF0ZURCOiBwdXRTdGF0ZShpZCwgc2VyaWFsaXplZERhdGEpXG4gKiAgIFN0YXRlREItLT4+QWRhcHRlcjogU3VjY2Vzc1xuICogICBBZGFwdGVyLS0+PlJlcG9zaXRvcnk6IHJlY29yZFxuICogICBSZXBvc2l0b3J5LS0+PkNvbnRyYWN0OiBtb2RlbFxuICogICBDb250cmFjdC0tPj5DbGllbnQ6IG1vZGVsXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGYWJyaWNDcnVkQ29udHJhY3Q8TSBleHRlbmRzIE1vZGVsPlxuICBleHRlbmRzIENvbnRyYWN0XG4gIGltcGxlbWVudHMgQ2hlY2thYmxlXG57XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2hhcmVkIGFkYXB0ZXIgaW5zdGFuY2UgZm9yIGFsbCBjb250cmFjdCBpbnN0YW5jZXNcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgYWRhcHRlcjogRmFicmljQ29udHJhY3RBZGFwdGVyO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSByZXBvOiBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8TT47XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBzZXJpYWxpemVyID0gbmV3IERldGVybWluaXN0aWNTZXJpYWxpemVyKCk7XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0NydWRDb250cmFjdCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNvbnRyYWN0IHdpdGggYSBuYW1lIGFuZCBtb2RlbCBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb250cmFjdFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIEZhYnJpY0NydWRDb250cmFjdC5hZGFwdGVyID0gdGhpcy5nZXRBZGFwdGVyKGNsYXp6KTtcbiAgICB0aGlzLnJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKGNsYXp6LCBGYWJyaWNDcnVkQ29udHJhY3QuYWRhcHRlci5hbGlhcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QWRhcHRlcihjbGF6ejogQ29uc3RydWN0b3I8TT4pOiBGYWJyaWNDb250cmFjdEFkYXB0ZXIge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNsYXp6KCk7XG5cbiAgICBpZiAoaXNNb2RlbFByaXZhdGUoaW5zdGFuY2UpKSB7XG4gICAgICBjb25zdCBwdnQgPSBtb2RlbFRvUHJpdmF0ZShpbnN0YW5jZSk7XG4gICAgICBjb25zdCBjb2xsZWN0aW9ucyA9IE9iamVjdC5rZXlzKHB2dC5wcml2YXRlISk7XG5cbiAgICAgIHJldHVybiBuZXcgRmFicmljQ29udHJhY3RQcml2YXRlRGF0YUFkYXB0ZXIoXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgXCJmYWJyaWMtcHJpdmF0ZS1kYXRhLWFkYXB0ZXJcIixcbiAgICAgICAgY29sbGVjdGlvbnNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyKHVuZGVmaW5lZCwgXCJmYWJyaWMtcHVibGljLWRhdGEtYWRhcHRlclwiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBsb2dnZXIgZm9yIGEgc3BlY2lmaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIENvbnRyYWN0TG9nZ2VyIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHJldHVybiB7Q29udHJhY3RMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBsb2dGb3IoY3R4OiBDb250ZXh0KTogQ29udHJhY3RMb2dnZXIge1xuICAgIHJldHVybiBMb2dnaW5nLmZvcihGYWJyaWNDcnVkQ29udHJhY3QubmFtZSwge30sIGN0eCkgYXMgQ29udHJhY3RMb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzaW5nbGUgbW9kZWwgaW4gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgcmVwb3NpdG9yeSdzIGNyZWF0ZSBtZXRob2RcbiAgICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIG1vZGVsXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgY3R4OiBDdHgsXG4gICAgbW9kZWw6IHN0cmluZyB8IE0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBNPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2dGb3IoY3R4KS5mb3IodGhpcy5jcmVhdGUpO1xuXG4gICAgaWYgKHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIikgbW9kZWwgPSB0aGlzLmRlc2VyaWFsaXplPE0+KG1vZGVsKSBhcyBhbnk7XG5cbiAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgbW9kZWw6ICR7SlNPTi5zdHJpbmdpZnkobW9kZWwpfWApO1xuXG4gICAgY29uc3QgdHJhbnNpZW50ID0gdGhpcy5nZXRUcmFuc2llbnREYXRhKGN0eCk7XG5cbiAgICBsb2cuaW5mbyhgTWVyZ2luZyB0cmFuc2llbnQgZGF0YS4uLmApO1xuICAgIG1vZGVsID0gKHRoaXMucmVwbyBhcyBhbnkpLm1lcmdlKG1vZGVsIGFzIE0sIHRyYW5zaWVudCk7XG5cbiAgICByZXR1cm4gdGhpcy5yZXBvLmNyZWF0ZShtb2RlbCBhcyB1bmtub3duIGFzIE0sIGN0eCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgc2luZ2xlIG1vZGVsIGZyb20gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgcmVwb3NpdG9yeSdzIHJlYWQgbWV0aG9kXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIG1vZGVsXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIGN0eDogQ3R4LFxuICAgIGtleTogc3RyaW5nIHwgbnVtYmVyLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TSB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nRm9yKGN0eCkuZm9yKHRoaXMucmVhZCk7XG5cbiAgICBsb2cuaW5mbyhgcmVhZGluZyBlbnRyeSB3aXRoIHBrICR7a2V5fSBgKTtcblxuICAgIHJldHVybiB0aGlzLnJlcG8ucmVhZChrZXksIGN0eCwgLi4uYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNpZW50RGF0YShjdHg6IEN0eCk6IGFueSB7XG4gICAgY29uc3QgdHJhbnNpZW50TWFwID0gY3R4LnN0dWIuZ2V0VHJhbnNpZW50KCk7XG4gICAgbGV0IHRyYW5zaWVudDogYW55ID0ge307XG5cbiAgICBpZiAodHJhbnNpZW50TWFwLmhhcygodGhpcy5yZXBvIGFzIGFueSkudGFibGVOYW1lKSkge1xuICAgICAgdHJhbnNpZW50ID0gSlNPTi5wYXJzZShcbiAgICAgICAgKHRyYW5zaWVudE1hcC5nZXQoKHRoaXMucmVwbyBhcyBhbnkpLnRhYmxlTmFtZSkgYXMgQnVmZmVyKT8udG9TdHJpbmcoXG4gICAgICAgICAgXCJ1dGY4XCJcbiAgICAgICAgKSBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHNpbmdsZSBtb2RlbCBpbiB0aGUgc3RhdGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRvIHRoZSByZXBvc2l0b3J5J3MgdXBkYXRlIG1ldGhvZFxuICAgKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgbW9kZWxcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBjdHg6IEN0eCxcbiAgICBtb2RlbDogc3RyaW5nIHwgTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHN0cmluZyB8IE0+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZ0ZvcihjdHgpLmZvcih0aGlzLnVwZGF0ZSk7XG5cbiAgICBpZiAodHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiKSBtb2RlbCA9IHRoaXMuZGVzZXJpYWxpemU8TT4obW9kZWwpIGFzIGFueTtcblxuICAgIGxvZy5pbmZvKGBVcGRhdGluZyBtb2RlbDogJHtKU09OLnN0cmluZ2lmeShtb2RlbCl9YCk7XG5cbiAgICBjb25zdCB0cmFuc2llbnQgPSB0aGlzLmdldFRyYW5zaWVudERhdGEoY3R4KTtcblxuICAgIGxvZy5pbmZvKGBNZXJnaW5nIHRyYW5zaWVudCBkYXRhLi4uYCk7XG4gICAgbW9kZWwgPSAodGhpcy5yZXBvIGFzIGFueSkubWVyZ2UobW9kZWwgYXMgTSwgdHJhbnNpZW50KTtcblxuICAgIHJldHVybiB0aGlzLnJlcG8udXBkYXRlKG1vZGVsIGFzIHVua25vd24gYXMgTSwgY3R4LCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHNpbmdsZSBtb2RlbCBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyBkZWxldGUgbWV0aG9kXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIG1vZGVsXG4gICAqL1xuICBhc3luYyBkZWxldGUoXG4gICAgY3R4OiBDdHgsXG4gICAga2V5OiBzdHJpbmcgfCBudW1iZXIsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNIHwgc3RyaW5nPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2dGb3IoY3R4KS5mb3IodGhpcy5kZWxldGUpO1xuICAgIGxvZy5pbmZvKGBkZWxldGluZyBlbnRyeSB3aXRoIHBrICR7a2V5fSBgKTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmRlbGV0ZShTdHJpbmcoa2V5KSwgY3R4LCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSBtb2RlbHMgZnJvbSB0aGUgc3RhdGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRvIHRoZSByZXBvc2l0b3J5J3MgZGVsZXRlQWxsIG1ldGhvZFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGtleXMgLSBUaGUga2V5cyBvZiB0aGUgbW9kZWxzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCBtb2RlbHNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBjdHg6IEN0eCxcbiAgICBrZXlzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdIHwgc3RyaW5nPiB7XG4gICAgaWYgKHR5cGVvZiBrZXlzID09PSBcInN0cmluZ1wiKSBrZXlzID0gSlNPTi5wYXJzZShrZXlzKSBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmRlbGV0ZUFsbChrZXlzLCBjdHgsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgZnJvbSB0aGUgc3RhdGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRvIHRoZSByZXBvc2l0b3J5J3MgcmVhZEFsbCBtZXRob2RcbiAgICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBrZXlzIC0gVGhlIGtleXMgb2YgdGhlIG1vZGVscyB0byByZWFkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgbW9kZWxzXG4gICAqL1xuICBhc3luYyByZWFkQWxsKFxuICAgIGN0eDogQ3R4LFxuICAgIGtleXM6IHN0cmluZyB8IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10gfCBzdHJpbmc+IHtcbiAgICBpZiAodHlwZW9mIGtleXMgPT09IFwic3RyaW5nXCIpIGtleXMgPSBKU09OLnBhcnNlKGtleXMpIGFzIHN0cmluZ1tdO1xuICAgIHJldHVybiB0aGlzLnJlcG8ucmVhZEFsbChrZXlzLCBjdHgsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVscyBpbiB0aGUgc3RhdGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRvIHRoZSByZXBvc2l0b3J5J3MgdXBkYXRlQWxsIG1ldGhvZFxuICAgKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byB1cGRhdGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgbW9kZWxzXG4gICAqL1xuICBhc3luYyB1cGRhdGVBbGwoXG4gICAgY3R4OiBDdHgsXG4gICAgbW9kZWxzOiBzdHJpbmcgfCBNW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBNW10+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZ0ZvcihjdHgpLmZvcih0aGlzLnVwZGF0ZUFsbCk7XG4gICAgaWYgKHR5cGVvZiBtb2RlbHMgPT09IFwic3RyaW5nXCIpXG4gICAgICBtb2RlbHMgPSAoSlNPTi5wYXJzZShtb2RlbHMpIGFzIFtdKVxuICAgICAgICAubWFwKChtKSA9PiB0aGlzLmRlc2VyaWFsaXplKG0pKVxuICAgICAgICAubWFwKChtKSA9PiBuZXcgdGhpcy5jbGF6eihtKSkgYXMgYW55O1xuXG4gICAgbG9nLmluZm8oYHVwZGF0aW5nICR7bW9kZWxzLmxlbmd0aH0gZW50cmllcyB0byB0aGUgdGFibGVgKTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnVwZGF0ZUFsbChtb2RlbHMgYXMgdW5rbm93biBhcyBNW10sIGN0eCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgcmVwb3NpdG9yeSdzIHJhdyBtZXRob2RcbiAgICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHBhcmFtIHthbnl9IHJhd0lucHV0IC0gVGhlIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBkb2NzT25seSAtIFdoZXRoZXIgdG8gcmV0dXJuIG9ubHkgZG9jdW1lbnRzXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBxdWVyeSByZXN1bHRzXG4gICAqL1xuICBhc3luYyByYXcoXG4gICAgY3R4OiBDdHgsXG4gICAgcmF3SW5wdXQ6IE1hbmdvUXVlcnkgfCBzdHJpbmcsXG4gICAgZG9jc09ubHk6IGJvb2xlYW4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxhbnkgfCBzdHJpbmc+IHtcbiAgICBpZiAodHlwZW9mIHJhd0lucHV0ID09PSBcInN0cmluZ1wiKVxuICAgICAgcmF3SW5wdXQgPSBKU09OLnBhcnNlKHJhd0lucHV0KSBhcyBNYW5nb1F1ZXJ5O1xuICAgIHJldHVybiB0aGlzLnJlcG8ucmF3KHJhd0lucHV0LCBkb2NzT25seSwgY3R4LCAuLi5hcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXJpYWxpemUobW9kZWw6IE0pOiBzdHJpbmcge1xuICAgIHJldHVybiBGYWJyaWNDcnVkQ29udHJhY3Quc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc2VyaWFsaXplPE0gZXh0ZW5kcyBNb2RlbD4oc3RyOiBzdHJpbmcpOiBNIHtcbiAgICByZXR1cm4gKFxuICAgICAgRmFicmljQ3J1ZENvbnRyYWN0LnNlcmlhbGl6ZXIgYXMgdW5rbm93biBhcyBTZXJpYWxpemVyPE0+XG4gICAgKS5kZXNlcmlhbGl6ZShzdHIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXQoY3R4OiBDdHgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZ0ZvcihjdHgpLmZvcih0aGlzLmluaXQpO1xuICAgIGxvZy5pbmZvKGBSdW5uaW5nIGNvbnRyYWN0IGluaXRpYWxpemF0aW9uLi4uYCk7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgbG9nLmluZm8oYENvbnRyYWN0IGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZC5gKTtcbiAgfVxuXG4gIGFzeW5jIGhlYWx0aGNoZWNrKGN0eDogQ3R4KTogUHJvbWlzZTxzdHJpbmcgfCBoZWFsdGhjaGVjaz4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nRm9yKGN0eCkuZm9yKHRoaXMuaGVhbHRoY2hlY2spO1xuICAgIGxvZy5pbmZvKGBSdW5uaW5nIEhlYWx0aGNoZWNrOiAke3RoaXMuaW5pdGlhbGl6ZWR9Li4uYCk7XG4gICAgcmV0dXJuIHsgaGVhbHRoY2hlY2s6IHRoaXMuaW5pdGlhbGl6ZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgaW4gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgcmVwb3NpdG9yeSdzIGNyZWF0ZUFsbCBtZXRob2RcbiAgICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIG1vZGVsc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQWxsKFxuICAgIGN0eDogQ3R4LFxuICAgIG1vZGVsczogc3RyaW5nIHwgTVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8c3RyaW5nIHwgTVtdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2dGb3IoY3R4KS5mb3IodGhpcy5jcmVhdGVBbGwpO1xuXG4gICAgaWYgKHR5cGVvZiBtb2RlbHMgPT09IFwic3RyaW5nXCIpXG4gICAgICBtb2RlbHMgPSAoSlNPTi5wYXJzZShtb2RlbHMpIGFzIFtdKVxuICAgICAgICAubWFwKChtKSA9PiB0aGlzLmRlc2VyaWFsaXplKG0pKVxuICAgICAgICAubWFwKChtKSA9PiBuZXcgdGhpcy5jbGF6eihtKSkgYXMgYW55O1xuXG4gICAgbG9nLmluZm8oYGFkZGluZyAke21vZGVscy5sZW5ndGh9IGVudHJpZXMgdG8gdGhlIHRhYmxlYCk7XG4gICAgcmV0dXJuIHRoaXMucmVwby5jcmVhdGVBbGwobW9kZWxzIGFzIHVua25vd24gYXMgTVtdLCBjdHgsIC4uLmFyZ3MpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { FabricContractAdapter } from "../ContractAdapter";
|
|
2
|
+
import { Context, Contract, Context as Ctx } from "fabric-contract-api";
|
|
3
|
+
import { Constructor, Model } from "@decaf-ts/decorator-validation";
|
|
4
|
+
import { FabricContractRepository } from "../FabricContractRepository";
|
|
5
|
+
import { DeterministicSerializer } from "../../shared/DeterministicSerializer";
|
|
6
|
+
import { MangoQuery } from "@decaf-ts/for-couchdb";
|
|
7
|
+
import { Checkable, healthcheck } from "../../shared/interfaces/Checkable";
|
|
8
|
+
import { ContractLogger } from "../logging";
|
|
9
|
+
/**
|
|
10
|
+
* @description Base contract class for CRUD operations in Fabric chaincode
|
|
11
|
+
* @summary Provides standard create, read, update, and delete operations for models in Fabric chaincode
|
|
12
|
+
* @template M - Type extending Model
|
|
13
|
+
* @class FabricCrudContract
|
|
14
|
+
* @extends {Contract}
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // Define a model
|
|
18
|
+
* @table('assets')
|
|
19
|
+
* class Asset extends Model {
|
|
20
|
+
* @id()
|
|
21
|
+
* id: string;
|
|
22
|
+
*
|
|
23
|
+
* @property()
|
|
24
|
+
* data: string;
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* // Create a contract that extends FabricCrudContract
|
|
28
|
+
* export class AssetContract extends FabricCrudContract<Asset> {
|
|
29
|
+
* constructor() {
|
|
30
|
+
* super('AssetContract', Asset);
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* // Add custom methods as needed
|
|
34
|
+
* async getAssetHistory(ctx: Context, id: string): Promise<any[]> {
|
|
35
|
+
* // Custom implementation
|
|
36
|
+
* }
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
* @mermaid
|
|
40
|
+
* sequenceDiagram
|
|
41
|
+
* participant Client
|
|
42
|
+
* participant Contract
|
|
43
|
+
* participant Repository
|
|
44
|
+
* participant Adapter
|
|
45
|
+
* participant StateDB
|
|
46
|
+
*
|
|
47
|
+
* Client->>Contract: create(ctx, model)
|
|
48
|
+
* Contract->>Repository: repository(ctx)
|
|
49
|
+
* Contract->>Repository: create(model, ctx)
|
|
50
|
+
* Repository->>Adapter: create(tableName, id, record, transient, ctx)
|
|
51
|
+
* Adapter->>StateDB: putState(id, serializedData)
|
|
52
|
+
* StateDB-->>Adapter: Success
|
|
53
|
+
* Adapter-->>Repository: record
|
|
54
|
+
* Repository-->>Contract: model
|
|
55
|
+
* Contract-->>Client: model
|
|
56
|
+
*/
|
|
57
|
+
export declare abstract class FabricCrudContract<M extends Model> extends Contract implements Checkable {
|
|
58
|
+
protected readonly clazz: Constructor<M>;
|
|
59
|
+
/**
|
|
60
|
+
* @description Shared adapter instance for all contract instances
|
|
61
|
+
*/
|
|
62
|
+
protected static adapter: FabricContractAdapter;
|
|
63
|
+
protected readonly repo: FabricContractRepository<M>;
|
|
64
|
+
protected static readonly serializer: DeterministicSerializer<Model<false>>;
|
|
65
|
+
protected initialized: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* @description Creates a new FabricCrudContract instance
|
|
68
|
+
* @summary Initializes a contract with a name and model class
|
|
69
|
+
* @param {string} name - The name of the contract
|
|
70
|
+
* @param {Constructor<M>} clazz - The model constructor
|
|
71
|
+
*/
|
|
72
|
+
protected constructor(name: string, clazz: Constructor<M>);
|
|
73
|
+
protected getAdapter(clazz: Constructor<M>): FabricContractAdapter;
|
|
74
|
+
/**
|
|
75
|
+
* @description Creates a logger for a specific chaincode context
|
|
76
|
+
* @summary Returns a ContractLogger instance configured for the current context
|
|
77
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
78
|
+
* @return {ContractLogger} The logger instance
|
|
79
|
+
*/
|
|
80
|
+
logFor(ctx: Context): ContractLogger;
|
|
81
|
+
/**
|
|
82
|
+
* @description Creates a single model in the state database
|
|
83
|
+
* @summary Delegates to the repository's create method
|
|
84
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
85
|
+
* @param {M} model - The model to create
|
|
86
|
+
* @param {...any[]} args - Additional arguments
|
|
87
|
+
* @return {Promise<M>} Promise resolving to the created model
|
|
88
|
+
*/
|
|
89
|
+
create(ctx: Ctx, model: string | M, ...args: any[]): Promise<string | M>;
|
|
90
|
+
/**
|
|
91
|
+
* @description Reads a single model from the state database
|
|
92
|
+
* @summary Delegates to the repository's read method
|
|
93
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
94
|
+
* @param {string | number} key - The key of the model to read
|
|
95
|
+
* @param {...any[]} args - Additional arguments
|
|
96
|
+
* @return {Promise<M>} Promise resolving to the retrieved model
|
|
97
|
+
*/
|
|
98
|
+
read(ctx: Ctx, key: string | number, ...args: any[]): Promise<M | string>;
|
|
99
|
+
protected getTransientData(ctx: Ctx): any;
|
|
100
|
+
/**
|
|
101
|
+
* @description Updates a single model in the state database
|
|
102
|
+
* @summary Delegates to the repository's update method
|
|
103
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
104
|
+
* @param {M} model - The model to update
|
|
105
|
+
* @param {...any[]} args - Additional arguments
|
|
106
|
+
* @return {Promise<M>} Promise resolving to the updated model
|
|
107
|
+
*/
|
|
108
|
+
update(ctx: Ctx, model: string | M, ...args: any[]): Promise<string | M>;
|
|
109
|
+
/**
|
|
110
|
+
* @description Deletes a single model from the state database
|
|
111
|
+
* @summary Delegates to the repository's delete method
|
|
112
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
113
|
+
* @param {string | number} key - The key of the model to delete
|
|
114
|
+
* @param {...any[]} args - Additional arguments
|
|
115
|
+
* @return {Promise<M>} Promise resolving to the deleted model
|
|
116
|
+
*/
|
|
117
|
+
delete(ctx: Ctx, key: string | number, ...args: any[]): Promise<M | string>;
|
|
118
|
+
/**
|
|
119
|
+
* @description Deletes multiple models from the state database
|
|
120
|
+
* @summary Delegates to the repository's deleteAll method
|
|
121
|
+
* @param {string[] | number[]} keys - The keys of the models to delete
|
|
122
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
123
|
+
* @param {...any[]} args - Additional arguments
|
|
124
|
+
* @return {Promise<M[]>} Promise resolving to the deleted models
|
|
125
|
+
*/
|
|
126
|
+
deleteAll(ctx: Ctx, keys: string | string[] | number[], ...args: any[]): Promise<M[] | string>;
|
|
127
|
+
/**
|
|
128
|
+
* @description Reads multiple models from the state database
|
|
129
|
+
* @summary Delegates to the repository's readAll method
|
|
130
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
131
|
+
* @param {string[] | number[]} keys - The keys of the models to read
|
|
132
|
+
* @param {...any[]} args - Additional arguments
|
|
133
|
+
* @return {Promise<M[]>} Promise resolving to the retrieved models
|
|
134
|
+
*/
|
|
135
|
+
readAll(ctx: Ctx, keys: string | string[] | number[], ...args: any[]): Promise<M[] | string>;
|
|
136
|
+
/**
|
|
137
|
+
* @description Updates multiple models in the state database
|
|
138
|
+
* @summary Delegates to the repository's updateAll method
|
|
139
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
140
|
+
* @param {M[]} models - The models to update
|
|
141
|
+
* @param {...any[]} args - Additional arguments
|
|
142
|
+
* @return {Promise<M[]>} Promise resolving to the updated models
|
|
143
|
+
*/
|
|
144
|
+
updateAll(ctx: Ctx, models: string | M[], ...args: any[]): Promise<string | M[]>;
|
|
145
|
+
/**
|
|
146
|
+
* @description Executes a raw query against the state database
|
|
147
|
+
* @summary Delegates to the repository's raw method
|
|
148
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
149
|
+
* @param {any} rawInput - The query to execute
|
|
150
|
+
* @param {boolean} docsOnly - Whether to return only documents
|
|
151
|
+
* @param {...any[]} args - Additional arguments
|
|
152
|
+
* @return {Promise<any>} Promise resolving to the query results
|
|
153
|
+
*/
|
|
154
|
+
raw(ctx: Ctx, rawInput: MangoQuery | string, docsOnly: boolean, ...args: any[]): Promise<any | string>;
|
|
155
|
+
protected serialize(model: M): string;
|
|
156
|
+
protected deserialize<M extends Model>(str: string): M;
|
|
157
|
+
protected init(ctx: Ctx): Promise<void>;
|
|
158
|
+
healthcheck(ctx: Ctx): Promise<string | healthcheck>;
|
|
159
|
+
/**
|
|
160
|
+
* @description Creates multiple models in the state database
|
|
161
|
+
* @summary Delegates to the repository's createAll method
|
|
162
|
+
* @param {Ctx} ctx - The Fabric chaincode context
|
|
163
|
+
* @param {M[]} models - The models to create
|
|
164
|
+
* @param {...any[]} args - Additional arguments
|
|
165
|
+
* @return {Promise<M[]>} Promise resolving to the created models
|
|
166
|
+
*/
|
|
167
|
+
createAll(ctx: Ctx, models: string | M[], ...args: any[]): Promise<string | M[]>;
|
|
168
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./crud-contract.cjs"), exports);
|
|
18
|
+
__exportStar(require("./serialized-crud-contract.cjs"), exports);
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udHJhY3RzL2NydWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFnQztBQUNoQyxpRUFBMkMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9jcnVkLWNvbnRyYWN0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXJpYWxpemVkLWNydWQtY29udHJhY3RcIjtcbiJdfQ==
|