@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.
Files changed (205) hide show
  1. package/LICENSE.md +22 -0
  2. package/README.md +647 -0
  3. package/dist/for-fabric.cjs +6223 -0
  4. package/dist/for-fabric.esm.cjs +6180 -0
  5. package/lib/client/FabricClientAdapter.cjs +760 -0
  6. package/lib/client/FabricClientAdapter.d.ts +381 -0
  7. package/lib/client/FabricClientDispatch.cjs +186 -0
  8. package/lib/client/FabricClientDispatch.d.ts +125 -0
  9. package/lib/client/FabricClientRepository.cjs +131 -0
  10. package/lib/client/FabricClientRepository.d.ts +100 -0
  11. package/lib/client/erc20/erc20ClientRepository.cjs +343 -0
  12. package/lib/client/erc20/erc20ClientRepository.d.ts +254 -0
  13. package/lib/client/fabric-fs.cjs +234 -0
  14. package/lib/client/fabric-fs.d.ts +92 -0
  15. package/lib/client/index.cjs +30 -0
  16. package/lib/client/index.d.ts +13 -0
  17. package/lib/client/logging.cjs +102 -0
  18. package/lib/client/logging.d.ts +60 -0
  19. package/lib/client/services/LoggedService.cjs +47 -0
  20. package/lib/client/services/LoggedService.d.ts +42 -0
  21. package/lib/client/services/constants.cjs +3 -0
  22. package/lib/client/services/constants.d.ts +15 -0
  23. package/lib/client/services/enrollementService.cjs +344 -0
  24. package/lib/client/services/enrollementService.d.ts +176 -0
  25. package/lib/client/services/index.cjs +18 -0
  26. package/lib/client/services/index.d.ts +1 -0
  27. package/lib/contracts/ContractAdapter.cjs +730 -0
  28. package/lib/contracts/ContractAdapter.d.ts +296 -0
  29. package/lib/contracts/ContractContext.cjs +85 -0
  30. package/lib/contracts/ContractContext.d.ts +64 -0
  31. package/lib/contracts/ContractPrivateDataAdapter.cjs +281 -0
  32. package/lib/contracts/ContractPrivateDataAdapter.d.ts +74 -0
  33. package/lib/contracts/FabricConstruction.cjs +441 -0
  34. package/lib/contracts/FabricConstruction.d.ts +304 -0
  35. package/lib/contracts/FabricContractRepository.cjs +306 -0
  36. package/lib/contracts/FabricContractRepository.d.ts +162 -0
  37. package/lib/contracts/FabricContractRepositoryObservableHandler.cjs +85 -0
  38. package/lib/contracts/FabricContractRepositoryObservableHandler.d.ts +62 -0
  39. package/lib/contracts/FabricContractSequence.cjs +139 -0
  40. package/lib/contracts/FabricContractSequence.d.ts +61 -0
  41. package/lib/contracts/FabricContractStatement.cjs +119 -0
  42. package/lib/contracts/FabricContractStatement.d.ts +34 -0
  43. package/lib/contracts/PrivateSequence.cjs +36 -0
  44. package/lib/contracts/PrivateSequence.d.ts +15 -0
  45. package/lib/contracts/crud/crud-contract.cjs +257 -0
  46. package/lib/contracts/crud/crud-contract.d.ts +168 -0
  47. package/lib/contracts/crud/index.cjs +19 -0
  48. package/lib/contracts/crud/index.d.ts +2 -0
  49. package/lib/contracts/crud/serialized-crud-contract.cjs +172 -0
  50. package/lib/contracts/crud/serialized-crud-contract.d.ts +37 -0
  51. package/lib/contracts/erc20/erc20contract.cjs +569 -0
  52. package/lib/contracts/erc20/erc20contract.d.ts +151 -0
  53. package/lib/contracts/erc20/index.cjs +21 -0
  54. package/lib/contracts/erc20/index.d.ts +2 -0
  55. package/lib/contracts/erc20/models.cjs +209 -0
  56. package/lib/contracts/erc20/models.d.ts +114 -0
  57. package/lib/contracts/index.cjs +32 -0
  58. package/lib/contracts/index.d.ts +15 -0
  59. package/lib/contracts/logging.cjs +96 -0
  60. package/lib/contracts/logging.d.ts +49 -0
  61. package/lib/contracts/private-data.cjs +121 -0
  62. package/lib/contracts/private-data.d.ts +16 -0
  63. package/lib/contracts/types.cjs +3 -0
  64. package/lib/contracts/types.d.ts +26 -0
  65. package/lib/esm/client/FabricClientAdapter.d.ts +381 -0
  66. package/lib/esm/client/FabricClientAdapter.js +723 -0
  67. package/lib/esm/client/FabricClientDispatch.d.ts +125 -0
  68. package/lib/esm/client/FabricClientDispatch.js +182 -0
  69. package/lib/esm/client/FabricClientRepository.d.ts +100 -0
  70. package/lib/esm/client/FabricClientRepository.js +127 -0
  71. package/lib/esm/client/erc20/erc20ClientRepository.d.ts +254 -0
  72. package/lib/esm/client/erc20/erc20ClientRepository.js +339 -0
  73. package/lib/esm/client/fabric-fs.d.ts +92 -0
  74. package/lib/esm/client/fabric-fs.js +191 -0
  75. package/lib/esm/client/index.d.ts +13 -0
  76. package/lib/esm/client/index.js +14 -0
  77. package/lib/esm/client/logging.d.ts +60 -0
  78. package/lib/esm/client/logging.js +98 -0
  79. package/lib/esm/client/services/LoggedService.d.ts +42 -0
  80. package/lib/esm/client/services/LoggedService.js +43 -0
  81. package/lib/esm/client/services/constants.d.ts +15 -0
  82. package/lib/esm/client/services/constants.js +2 -0
  83. package/lib/esm/client/services/enrollementService.d.ts +176 -0
  84. package/lib/esm/client/services/enrollementService.js +337 -0
  85. package/lib/esm/client/services/index.d.ts +1 -0
  86. package/lib/esm/client/services/index.js +2 -0
  87. package/lib/esm/contracts/ContractAdapter.d.ts +296 -0
  88. package/lib/esm/contracts/ContractAdapter.js +724 -0
  89. package/lib/esm/contracts/ContractContext.d.ts +64 -0
  90. package/lib/esm/contracts/ContractContext.js +81 -0
  91. package/lib/esm/contracts/ContractPrivateDataAdapter.d.ts +74 -0
  92. package/lib/esm/contracts/ContractPrivateDataAdapter.js +277 -0
  93. package/lib/esm/contracts/FabricConstruction.d.ts +304 -0
  94. package/lib/esm/contracts/FabricConstruction.js +433 -0
  95. package/lib/esm/contracts/FabricContractRepository.d.ts +162 -0
  96. package/lib/esm/contracts/FabricContractRepository.js +302 -0
  97. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.d.ts +62 -0
  98. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js +81 -0
  99. package/lib/esm/contracts/FabricContractSequence.d.ts +61 -0
  100. package/lib/esm/contracts/FabricContractSequence.js +135 -0
  101. package/lib/esm/contracts/FabricContractStatement.d.ts +34 -0
  102. package/lib/esm/contracts/FabricContractStatement.js +115 -0
  103. package/lib/esm/contracts/PrivateSequence.d.ts +15 -0
  104. package/lib/esm/contracts/PrivateSequence.js +33 -0
  105. package/lib/esm/contracts/crud/crud-contract.d.ts +168 -0
  106. package/lib/esm/contracts/crud/crud-contract.js +253 -0
  107. package/lib/esm/contracts/crud/index.d.ts +2 -0
  108. package/lib/esm/contracts/crud/index.js +3 -0
  109. package/lib/esm/contracts/crud/serialized-crud-contract.d.ts +37 -0
  110. package/lib/esm/contracts/crud/serialized-crud-contract.js +168 -0
  111. package/lib/esm/contracts/erc20/erc20contract.d.ts +151 -0
  112. package/lib/esm/contracts/erc20/erc20contract.js +565 -0
  113. package/lib/esm/contracts/erc20/index.d.ts +2 -0
  114. package/lib/esm/contracts/erc20/index.js +4 -0
  115. package/lib/esm/contracts/erc20/models.d.ts +114 -0
  116. package/lib/esm/contracts/erc20/models.js +206 -0
  117. package/lib/esm/contracts/index.d.ts +15 -0
  118. package/lib/esm/contracts/index.js +16 -0
  119. package/lib/esm/contracts/logging.d.ts +49 -0
  120. package/lib/esm/contracts/logging.js +92 -0
  121. package/lib/esm/contracts/private-data.d.ts +16 -0
  122. package/lib/esm/contracts/private-data.js +113 -0
  123. package/lib/esm/contracts/types.d.ts +26 -0
  124. package/lib/esm/contracts/types.js +2 -0
  125. package/lib/esm/index.d.ts +8 -0
  126. package/lib/esm/index.js +9 -0
  127. package/lib/esm/shared/ClientSerializer.d.ts +52 -0
  128. package/lib/esm/shared/ClientSerializer.js +80 -0
  129. package/lib/esm/shared/DeterministicSerializer.d.ts +40 -0
  130. package/lib/esm/shared/DeterministicSerializer.js +50 -0
  131. package/lib/esm/shared/SimpleDeterministicSerializer.d.ts +7 -0
  132. package/lib/esm/shared/SimpleDeterministicSerializer.js +42 -0
  133. package/lib/esm/shared/constants.d.ts +39 -0
  134. package/lib/esm/shared/constants.js +42 -0
  135. package/lib/esm/shared/crypto.d.ts +107 -0
  136. package/lib/esm/shared/crypto.js +331 -0
  137. package/lib/esm/shared/decorators.d.ts +24 -0
  138. package/lib/esm/shared/decorators.js +98 -0
  139. package/lib/esm/shared/erc20/erc20-constants.d.ts +25 -0
  140. package/lib/esm/shared/erc20/erc20-constants.js +27 -0
  141. package/lib/esm/shared/errors.d.ts +116 -0
  142. package/lib/esm/shared/errors.js +132 -0
  143. package/lib/esm/shared/events.d.ts +39 -0
  144. package/lib/esm/shared/events.js +47 -0
  145. package/lib/esm/shared/fabric-types.d.ts +33 -0
  146. package/lib/esm/shared/fabric-types.js +2 -0
  147. package/lib/esm/shared/index.d.ts +13 -0
  148. package/lib/esm/shared/index.js +14 -0
  149. package/lib/esm/shared/interfaces/Checkable.d.ts +21 -0
  150. package/lib/esm/shared/interfaces/Checkable.js +2 -0
  151. package/lib/esm/shared/math.d.ts +34 -0
  152. package/lib/esm/shared/math.js +61 -0
  153. package/lib/esm/shared/model/Identity.d.ts +42 -0
  154. package/lib/esm/shared/model/Identity.js +78 -0
  155. package/lib/esm/shared/model/IdentityCredentials.d.ts +41 -0
  156. package/lib/esm/shared/model/IdentityCredentials.js +74 -0
  157. package/lib/esm/shared/model/index.d.ts +1 -0
  158. package/lib/esm/shared/model/index.js +2 -0
  159. package/lib/esm/shared/model/utils.d.ts +60 -0
  160. package/lib/esm/shared/model/utils.js +108 -0
  161. package/lib/esm/shared/types.d.ts +79 -0
  162. package/lib/esm/shared/types.js +2 -0
  163. package/lib/esm/shared/utils.d.ts +55 -0
  164. package/lib/esm/shared/utils.js +148 -0
  165. package/lib/index.cjs +25 -0
  166. package/lib/index.d.ts +8 -0
  167. package/lib/shared/ClientSerializer.cjs +84 -0
  168. package/lib/shared/ClientSerializer.d.ts +52 -0
  169. package/lib/shared/DeterministicSerializer.cjs +54 -0
  170. package/lib/shared/DeterministicSerializer.d.ts +40 -0
  171. package/lib/shared/SimpleDeterministicSerializer.cjs +46 -0
  172. package/lib/shared/SimpleDeterministicSerializer.d.ts +7 -0
  173. package/lib/shared/constants.cjs +45 -0
  174. package/lib/shared/constants.d.ts +39 -0
  175. package/lib/shared/crypto.cjs +369 -0
  176. package/lib/shared/crypto.d.ts +107 -0
  177. package/lib/shared/decorators.cjs +105 -0
  178. package/lib/shared/decorators.d.ts +24 -0
  179. package/lib/shared/erc20/erc20-constants.cjs +30 -0
  180. package/lib/shared/erc20/erc20-constants.d.ts +25 -0
  181. package/lib/shared/errors.cjs +142 -0
  182. package/lib/shared/errors.d.ts +116 -0
  183. package/lib/shared/events.cjs +51 -0
  184. package/lib/shared/events.d.ts +39 -0
  185. package/lib/shared/fabric-types.cjs +4 -0
  186. package/lib/shared/fabric-types.d.ts +33 -0
  187. package/lib/shared/index.cjs +30 -0
  188. package/lib/shared/index.d.ts +13 -0
  189. package/lib/shared/interfaces/Checkable.cjs +3 -0
  190. package/lib/shared/interfaces/Checkable.d.ts +21 -0
  191. package/lib/shared/math.cjs +66 -0
  192. package/lib/shared/math.d.ts +34 -0
  193. package/lib/shared/model/Identity.cjs +81 -0
  194. package/lib/shared/model/Identity.d.ts +42 -0
  195. package/lib/shared/model/IdentityCredentials.cjs +77 -0
  196. package/lib/shared/model/IdentityCredentials.d.ts +41 -0
  197. package/lib/shared/model/index.cjs +18 -0
  198. package/lib/shared/model/index.d.ts +1 -0
  199. package/lib/shared/model/utils.cjs +114 -0
  200. package/lib/shared/model/utils.d.ts +60 -0
  201. package/lib/shared/types.cjs +3 -0
  202. package/lib/shared/types.d.ts +79 -0
  203. package/lib/shared/utils.cjs +185 -0
  204. package/lib/shared/utils.d.ts +55 -0
  205. package/package.json +166 -0
@@ -0,0 +1,185 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CoreUtils = void 0;
37
+ const decorator_validation_1 = require("@decaf-ts/decorator-validation");
38
+ const logging_1 = require("@decaf-ts/logging");
39
+ const utils_1 = require("@decaf-ts/utils");
40
+ const fabric_gateway_1 = require("@hyperledger/fabric-gateway");
41
+ const fabric_common_1 = require("fabric-common");
42
+ /**
43
+ * @description Core utilities for interacting with files, crypto identities, and Fabric SDK helpers
44
+ * @summary Provides static helper methods to read credentials and keys from disk or raw content, construct Fabric gateway Identities and Signers, and perform common filesystem operations used by the Fabric client tooling.
45
+ * @class CoreUtils
46
+ * @example
47
+ * // Read an identity and signer from directories
48
+ * const identity = await CoreUtils.getIdentity('Org1MSP', '/msp/signcerts');
49
+ * const signer = await CoreUtils.getSigner('/msp/keystore');
50
+ * // Build a CA user
51
+ * const user = await CoreUtils.getCAUser('appUser', pemKey, pemCert, 'Org1MSP');
52
+ */
53
+ class CoreUtils {
54
+ static { this.logger = logging_1.Logging.for(CoreUtils.name); }
55
+ constructor() { }
56
+ /**
57
+ * @description Resolve file content from a path or return provided raw content
58
+ * @summary If the input is a Uint8Array or PEM content, returns it as-is; otherwise uses a provided async fileReader to load the content from disk.
59
+ * @param {string|Uint8Array} contentOrPath - Either a raw content buffer/string or a filesystem path
60
+ * @param {function(string): Promise<string|Uint8Array|Buffer>} fileReader - Async function to read file content when a path is provided
61
+ * @return {Promise<string|Uint8Array|Buffer>} The content to be used downstream
62
+ */
63
+ static async contentOfLoadFile(contentOrPath, fileReader) {
64
+ if (contentOrPath instanceof Uint8Array)
65
+ return contentOrPath;
66
+ if (contentOrPath.match(/-----BEGIN (CERTIFICATE|KEY|PRIVATE KEY)-----.+?-----END \1-----$/gms))
67
+ return contentOrPath;
68
+ return await fileReader(contentOrPath);
69
+ }
70
+ /**
71
+ * @description Read file content from a path or return provided Buffer
72
+ * @summary Convenience wrapper that loads a file using fs.promises when a path string is provided; otherwise returns the given Buffer directly.
73
+ * @param {string|Buffer} contentOrPath - Path to a file on disk or an already-loaded Buffer
74
+ * @return {Promise<string|Uint8Array|Buffer>} The file content as a Buffer/string depending on reader
75
+ */
76
+ static async readFile(contentOrPath) {
77
+ if (typeof contentOrPath !== "string")
78
+ return contentOrPath;
79
+ const fileReader = async (path) => {
80
+ const { promises } = await (0, utils_1.normalizeImport)(Promise.resolve().then(() => __importStar(require("fs"))));
81
+ return await promises.readFile(path);
82
+ };
83
+ return await fileReader(contentOrPath);
84
+ }
85
+ /**
86
+ * @description Create a Fabric CA User object with enrollment
87
+ * @summary Constructs a fabric-common User, sets a crypto suite, imports the provided private key, and sets enrollment with certificate and MSP ID.
88
+ * @param {string} userName - The user name for the CA user
89
+ * @param {string} privateKey - PEM-encoded private key
90
+ * @param {string} certificate - PEM-encoded X.509 certificate
91
+ * @param {string} mspId - Membership Service Provider identifier
92
+ * @return {Promise<User>} The enrolled Fabric User instance
93
+ */
94
+ static async getCAUser(userName, privateKey, certificate, mspId) {
95
+ this.logger.debug((0, decorator_validation_1.stringFormat)("Creating CA {0} user {1} with certificate {2}", mspId, userName, certificate));
96
+ const user = new fabric_common_1.User(userName);
97
+ const cryptoSuite = fabric_common_1.User.newCryptoSuite();
98
+ user.setCryptoSuite(cryptoSuite);
99
+ const importedKey = cryptoSuite.createKeyFromRaw(privateKey);
100
+ await user.setEnrollment(importedKey, certificate, mspId);
101
+ return user;
102
+ }
103
+ /**
104
+ * @description Build a Fabric Gateway Identity from an MSP ID and certificate
105
+ * @summary Reads a certificate from a directory path or accepts raw content and returns an Identity object suitable for the Fabric Gateway.
106
+ * @param {string} mspId - Membership Service Provider ID
107
+ * @param {string} certDirectoryPath - Path to a directory containing the certificate file, or PEM content
108
+ * @return {Promise<Identity>} The identity containing mspId and certificate credentials
109
+ */
110
+ static async getIdentity(mspId, certDirectoryPath) {
111
+ const identityFileReader = async (path) => {
112
+ const { promises } = await (0, utils_1.normalizeImport)(Promise.resolve().then(() => __importStar(require("fs"))));
113
+ const certPath = await this.getFirstDirFileName(path);
114
+ const credentials = await promises.readFile(certPath);
115
+ return credentials;
116
+ };
117
+ const credentials = (await this.contentOfLoadFile(certDirectoryPath, identityFileReader));
118
+ return { mspId, credentials };
119
+ }
120
+ static async getFirstDirFileName(dirPath) {
121
+ const { promises } = await (0, utils_1.normalizeImport)(Promise.resolve().then(() => __importStar(require("fs"))));
122
+ const { join } = await (0, utils_1.normalizeImport)(Promise.resolve().then(() => __importStar(require("path"))));
123
+ const files = await promises.readdir(dirPath);
124
+ return join(dirPath, files[0]);
125
+ }
126
+ static async getFirstDirFileNameContent(dirPath) {
127
+ const { promises } = await (0, utils_1.normalizeImport)(Promise.resolve().then(() => __importStar(require("fs"))));
128
+ const { join } = await (0, utils_1.normalizeImport)(Promise.resolve().then(() => __importStar(require("path"))));
129
+ const files = await promises.readdir(dirPath);
130
+ return (await promises.readFile(join(dirPath, files[0]))).toString();
131
+ }
132
+ static async getFileContent(filePath) {
133
+ const { promises } = await (0, utils_1.normalizeImport)(Promise.resolve().then(() => __importStar(require("fs"))));
134
+ return (await promises.readFile(filePath)).toString();
135
+ }
136
+ static async getSigner(keyDirectoryPath) {
137
+ const signerFileReader = async (path) => {
138
+ const { promises } = await (0, utils_1.normalizeImport)(Promise.resolve().then(() => __importStar(require("fs"))));
139
+ const keyPath = await this.getFirstDirFileName(path);
140
+ return await promises.readFile(keyPath);
141
+ };
142
+ const privateKeyPem = (await this.contentOfLoadFile(keyDirectoryPath, signerFileReader));
143
+ const privateKey = await this.extractPrivateKey(privateKeyPem);
144
+ const keys = Object.getOwnPropertySymbols(privateKey);
145
+ const k = privateKey[keys[0]];
146
+ // --
147
+ return fabric_gateway_1.signers.newPrivateKeySigner(k);
148
+ }
149
+ static async extractPrivateKey(pem) {
150
+ const libName = "crypto";
151
+ let subtle;
152
+ if (globalThis.window &&
153
+ globalThis.window.Crypto) {
154
+ subtle = globalThis.Crypto.subtle;
155
+ }
156
+ else {
157
+ const lib = (await (0, utils_1.normalizeImport)(Promise.resolve(`${libName}`).then(s => __importStar(require(s)))));
158
+ subtle = lib.subtle || lib.webcrypto.subtle;
159
+ }
160
+ if (!subtle)
161
+ throw new Error("Could not load SubtleCrypto module");
162
+ function str2ab(str) {
163
+ const buf = new ArrayBuffer(str.length);
164
+ const bufView = new Uint8Array(buf);
165
+ for (let i = 0, strLen = str.length; i < strLen; i++) {
166
+ bufView[i] = str.charCodeAt(i);
167
+ }
168
+ return buf;
169
+ }
170
+ const str = pem
171
+ .toString("utf8")
172
+ .replace("-----BEGIN PRIVATE KEY-----", "")
173
+ .replaceAll("\n", "")
174
+ .replace("-----END PRIVATE KEY-----", "");
175
+ const decoded = Buffer.from(str, "base64").toString("binary");
176
+ const binaryDer = str2ab(decoded);
177
+ const key = await subtle.importKey("pkcs8", binaryDer, {
178
+ name: "ECDSA",
179
+ namedCurve: "P-256",
180
+ }, true, ["sign"]);
181
+ return key;
182
+ }
183
+ }
184
+ exports.CoreUtils = CoreUtils;
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlFQUE4RDtBQUM5RCwrQ0FBb0Q7QUFDcEQsMkNBQWtEO0FBQ2xELGdFQUF3RTtBQUN4RSxpREFBcUM7QUFFckM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsU0FBUzthQUNMLFdBQU0sR0FBVyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFNUQsZ0JBQXVCLENBQUM7SUFFeEI7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FDcEMsYUFBa0MsRUFDbEMsVUFBbUU7UUFFbkUsSUFBSSxhQUFhLFlBQVksVUFBVTtZQUFFLE9BQU8sYUFBYSxDQUFDO1FBQzlELElBQ0UsYUFBYSxDQUFDLEtBQUssQ0FDakIsc0VBQXNFLENBQ3ZFO1lBRUQsT0FBTyxhQUFhLENBQUM7UUFDdkIsT0FBTyxNQUFNLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUE4QjtRQUNsRCxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVE7WUFBRSxPQUFPLGFBQWEsQ0FBQztRQUU1RCxNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFFLEVBQUU7WUFDeEMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sSUFBQSx1QkFBZSxvREFBUSxJQUFJLElBQUUsQ0FBQztZQUN6RCxPQUFPLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUM7UUFFRixPQUFPLE1BQU0sVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFF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QU0sQ0FBQyxTQUFTLENBQ2hDLE9BQU8sRUFDUCxTQUFTLEVBQ1Q7WUFDRSxJQUFJLEVBQUUsT0FBTztZQUNiLFVBQVUsRUFBRSxPQUFPO1NBQ3BCLEVBQ0QsSUFBSSxFQUNKLENBQUMsTUFBTSxDQUFDLENBQ1QsQ0FBQztRQUVGLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7QUFyTEgsOEJBc0xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaW5nRm9ybWF0IH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL3V0aWxzXCI7XG5pbXBvcnQgeyBJZGVudGl0eSwgU2lnbmVyLCBzaWduZXJzIH0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCJmYWJyaWMtY29tbW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvcmUgdXRpbGl0aWVzIGZvciBpbnRlcmFjdGluZyB3aXRoIGZpbGVzLCBjcnlwdG8gaWRlbnRpdGllcywgYW5kIEZhYnJpYyBTREsgaGVscGVyc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgc3RhdGljIGhlbHBlciBtZXRob2RzIHRvIHJlYWQgY3JlZGVudGlhbHMgYW5kIGtleXMgZnJvbSBkaXNrIG9yIHJhdyBjb250ZW50LCBjb25zdHJ1Y3QgRmFicmljIGdhdGV3YXkgSWRlbnRpdGllcyBhbmQgU2lnbmVycywgYW5kIHBlcmZvcm0gY29tbW9uIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyB1c2VkIGJ5IHRoZSBGYWJyaWMgY2xpZW50IHRvb2xpbmcuXG4gKiBAY2xhc3MgQ29yZVV0aWxzXG4gKiBAZXhhbXBsZVxuICogLy8gUmVhZCBhbiBpZGVudGl0eSBhbmQgc2lnbmVyIGZyb20gZGlyZWN0b3JpZXNcbiAqIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgQ29yZVV0aWxzLmdldElkZW50aXR5KCdPcmcxTVNQJywgJy9tc3Avc2lnbmNlcnRzJyk7XG4gKiBjb25zdCBzaWduZXIgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0U2lnbmVyKCcvbXNwL2tleXN0b3JlJyk7XG4gKiAvLyBCdWlsZCBhIENBIHVzZXJcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0Q0FVc2VyKCdhcHBVc2VyJywgcGVtS2V5LCBwZW1DZXJ0LCAnT3JnMU1TUCcpO1xuICovXG5leHBvcnQgY2xhc3MgQ29yZVV0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbG9nZ2VyOiBMb2dnZXIgPSBMb2dnaW5nLmZvcihDb3JlVXRpbHMubmFtZSk7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlIGZpbGUgY29udGVudCBmcm9tIGEgcGF0aCBvciByZXR1cm4gcHJvdmlkZWQgcmF3IGNvbnRlbnRcbiAgICogQHN1bW1hcnkgSWYgdGhlIGlucHV0IGlzIGEgVWludDhBcnJheSBvciBQRU0gY29udGVudCwgcmV0dXJucyBpdCBhcy1pczsgb3RoZXJ3aXNlIHVzZXMgYSBwcm92aWRlZCBhc3luYyBmaWxlUmVhZGVyIHRvIGxvYWQgdGhlIGNvbnRlbnQgZnJvbSBkaXNrLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xVaW50OEFycmF5fSBjb250ZW50T3JQYXRoIC0gRWl0aGVyIGEgcmF3IGNvbnRlbnQgYnVmZmVyL3N0cmluZyBvciBhIGZpbGVzeXN0ZW0gcGF0aFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6IFByb21pc2U8c3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyPn0gZmlsZVJlYWRlciAtIEFzeW5jIGZ1bmN0aW9uIHRvIHJlYWQgZmlsZSBjb250ZW50IHdoZW4gYSBwYXRoIGlzIHByb3ZpZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyPn0gVGhlIGNvbnRlbnQgdG8gYmUgdXNlZCBkb3duc3RyZWFtXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBhc3luYyBjb250ZW50T2ZMb2FkRmlsZShcbiAgICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICAgIGZpbGVSZWFkZXI6IChwYXRoOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj5cbiAgKSB7XG4gICAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICBpZiAoXG4gICAgICBjb250ZW50T3JQYXRoLm1hdGNoKFxuICAgICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgICAgKVxuICAgIClcbiAgICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICAgIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGZpbGUgY29udGVudCBmcm9tIGEgcGF0aCBvciByZXR1cm4gcHJvdmlkZWQgQnVmZmVyXG4gICAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgdGhhdCBsb2FkcyBhIGZpbGUgdXNpbmcgZnMucHJvbWlzZXMgd2hlbiBhIHBhdGggc3RyaW5nIGlzIHByb3ZpZGVkOyBvdGhlcndpc2UgcmV0dXJucyB0aGUgZ2l2ZW4gQnVmZmVyIGRpcmVjdGx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xCdWZmZXJ9IGNvbnRlbnRPclBhdGggLSBQYXRoIHRvIGEgZmlsZSBvbiBkaXNrIG9yIGFuIGFscmVhZHktbG9hZGVkIEJ1ZmZlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBmaWxlIGNvbnRlbnQgYXMgYSBCdWZmZXIvc3RyaW5nIGRlcGVuZGluZyBvbiByZWFkZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyByZWFkRmlsZShjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gICAgY29uc3QgZmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBGYWJyaWMgQ0EgVXNlciBvYmplY3Qgd2l0aCBlbnJvbGxtZW50XG4gICAqIEBzdW1tYXJ5IENvbnN0cnVjdHMgYSBmYWJyaWMtY29tbW9uIFVzZXIsIHNldHMgYSBjcnlwdG8gc3VpdGUsIGltcG9ydHMgdGhlIHByb3ZpZGVkIHByaXZhdGUga2V5LCBhbmQgc2V0cyBlbnJvbGxtZW50IHdpdGggY2VydGlmaWNhdGUgYW5kIE1TUCBJRC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJOYW1lIC0gVGhlIHVzZXIgbmFtZSBmb3IgdGhlIENBIHVzZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByaXZhdGVLZXkgLSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2VydGlmaWNhdGUgLSBQRU0tZW5jb2RlZCBYLjUwOSBjZXJ0aWZpY2F0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgaWRlbnRpZmllclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBUaGUgZW5yb2xsZWQgRmFicmljIFVzZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDQVVzZXIoXG4gICAgdXNlck5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlS2V5OiBzdHJpbmcsXG4gICAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgICBtc3BJZDogc3RyaW5nXG4gICk6IFByb21pc2U8VXNlcj4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgc3RyaW5nRm9ybWF0KFxuICAgICAgICBcIkNyZWF0aW5nIENBIHswfSB1c2VyIHsxfSB3aXRoIGNlcnRpZmljYXRlIHsyfVwiLFxuICAgICAgICBtc3BJZCxcbiAgICAgICAgdXNlck5hbWUsXG4gICAgICAgIGNlcnRpZmljYXRlXG4gICAgICApXG4gICAgKTtcbiAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIodXNlck5hbWUpO1xuICAgIGNvbnN0IGNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICAgIHVzZXIuc2V0Q3J5cHRvU3VpdGUoY3J5cHRvU3VpdGUpO1xuICAgIGNvbnN0IGltcG9ydGVkS2V5ID0gY3J5cHRvU3VpdGUuY3JlYXRlS2V5RnJvbVJhdyhwcml2YXRlS2V5KTtcbiAgICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoaW1wb3J0ZWRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGEgRmFicmljIEdhdGV3YXkgSWRlbnRpdHkgZnJvbSBhbiBNU1AgSUQgYW5kIGNlcnRpZmljYXRlXG4gICAqIEBzdW1tYXJ5IFJlYWRzIGEgY2VydGlmaWNhdGUgZnJvbSBhIGRpcmVjdG9yeSBwYXRoIG9yIGFjY2VwdHMgcmF3IGNvbnRlbnQgYW5kIHJldHVybnMgYW4gSWRlbnRpdHkgb2JqZWN0IHN1aXRhYmxlIGZvciB0aGUgRmFicmljIEdhdGV3YXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2VydERpcmVjdG9yeVBhdGggLSBQYXRoIHRvIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNlcnRpZmljYXRlIGZpbGUsIG9yIFBFTSBjb250ZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgaWRlbnRpdHkgY29udGFpbmluZyBtc3BJZCBhbmQgY2VydGlmaWNhdGUgY3JlZGVudGlhbHNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRJZGVudGl0eShcbiAgICBtc3BJZDogc3RyaW5nLFxuICAgIGNlcnREaXJlY3RvcnlQYXRoOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IGlkZW50aXR5RmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgICBjb25zdCBjZXJ0UGF0aCA9IGF3YWl0IHRoaXMuZ2V0Rmlyc3REaXJGaWxlTmFtZShwYXRoKTtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoY2VydFBhdGgpO1xuICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICAgIH07XG5cbiAgICBjb25zdCBjcmVkZW50aWFsczogVWludDhBcnJheSA9IChhd2FpdCB0aGlzLmNvbnRlbnRPZkxvYWRGaWxlKFxuICAgICAgY2VydERpcmVjdG9yeVBhdGgsXG4gICAgICBpZGVudGl0eUZpbGVSZWFkZXJcbiAgICApKSBhcyBVaW50OEFycmF5O1xuXG4gICAgcmV0dXJuIHsgbXNwSWQsIGNyZWRlbnRpYWxzIH07XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0Rmlyc3REaXJGaWxlTmFtZShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3QgeyBqb2luIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwicGF0aFwiKSk7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBqb2luKGRpclBhdGgsIGZpbGVzWzBdKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3QgeyBqb2luIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwicGF0aFwiKSk7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoam9pbihkaXJQYXRoLCBmaWxlc1swXSkpKS50b1N0cmluZygpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpbGVDb250ZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0U2lnbmVyKGtleURpcmVjdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8U2lnbmVyPiB7XG4gICAgY29uc3Qgc2lnbmVyRmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgICBjb25zdCBrZXlQYXRoID0gYXdhaXQgdGhpcy5nZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGtleVBhdGgpO1xuICAgIH07XG5cbiAgICBjb25zdCBwcml2YXRlS2V5UGVtID0gKGF3YWl0IHRoaXMuY29udGVudE9mTG9hZEZpbGUoXG4gICAgICBrZXlEaXJlY3RvcnlQYXRoLFxuICAgICAgc2lnbmVyRmlsZVJlYWRlclxuICAgICkpIGFzIEJ1ZmZlcjtcbiAgICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhwcml2YXRlS2V5KTtcbiAgICBjb25zdCBrID0gKHByaXZhdGVLZXkgYXMgYW55KVtrZXlzWzBdXTtcbiAgICAvLyAtLVxuXG4gICAgcmV0dXJuIHNpZ25lcnMubmV3UHJpdmF0ZUtleVNpZ25lcihrIGFzIGFueSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBleHRyYWN0UHJpdmF0ZUtleShwZW06IEJ1ZmZlcikge1xuICAgIGNvbnN0IGxpYk5hbWUgPSBcImNyeXB0b1wiO1xuICAgIGxldCBzdWJ0bGU6IGFueTtcbiAgICBpZiAoXG4gICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpLndpbmRvdyAmJlxuICAgICAgKChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93IGFzIHsgQ3J5cHRvOiBhbnkgfSkuQ3J5cHRvXG4gICAgKSB7XG4gICAgICBzdWJ0bGUgPSAoKGdsb2JhbFRoaXMgYXMgYW55KS5DcnlwdG8gYXMgYW55KS5zdWJ0bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxpYiA9IChhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KGxpYk5hbWUpKSkgYXMgYW55O1xuICAgICAgc3VidGxlID0gbGliLnN1YnRsZSB8fCBsaWIud2ViY3J5cHRvLnN1YnRsZTtcbiAgICB9XG5cbiAgICBpZiAoIXN1YnRsZSkgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGxvYWQgU3VidGxlQ3J5cHRvIG1vZHVsZVwiKTtcblxuICAgIGZ1bmN0aW9uIHN0cjJhYihzdHI6IHN0cmluZykge1xuICAgICAgY29uc3QgYnVmID0gbmV3IEFycmF5QnVmZmVyKHN0ci5sZW5ndGgpO1xuICAgICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgICBmb3IgKGxldCBpID0gMCwgc3RyTGVuID0gc3RyLmxlbmd0aDsgaSA8IHN0ckxlbjsgaSsrKSB7XG4gICAgICAgIGJ1ZlZpZXdbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyID0gcGVtXG4gICAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgICAucmVwbGFjZShcIi0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFwiLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKTtcbiAgICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oc3RyLCBcImJhc2U2NFwiKS50b1N0cmluZyhcImJpbmFyeVwiKTtcbiAgICBjb25zdCBiaW5hcnlEZXIgPSBzdHIyYWIoZGVjb2RlZCk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgc3VidGxlLmltcG9ydEtleShcbiAgICAgIFwicGtjczhcIixcbiAgICAgIGJpbmFyeURlcixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBuYW1lZEN1cnZlOiBcIlAtMjU2XCIsXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICAgIFtcInNpZ25cIl1cbiAgICApO1xuXG4gICAgcmV0dXJuIGtleTtcbiAgfVxufVxuIl19
@@ -0,0 +1,55 @@
1
+ import { Identity, Signer } from "@hyperledger/fabric-gateway";
2
+ import { User } from "fabric-common";
3
+ /**
4
+ * @description Core utilities for interacting with files, crypto identities, and Fabric SDK helpers
5
+ * @summary Provides static helper methods to read credentials and keys from disk or raw content, construct Fabric gateway Identities and Signers, and perform common filesystem operations used by the Fabric client tooling.
6
+ * @class CoreUtils
7
+ * @example
8
+ * // Read an identity and signer from directories
9
+ * const identity = await CoreUtils.getIdentity('Org1MSP', '/msp/signcerts');
10
+ * const signer = await CoreUtils.getSigner('/msp/keystore');
11
+ * // Build a CA user
12
+ * const user = await CoreUtils.getCAUser('appUser', pemKey, pemCert, 'Org1MSP');
13
+ */
14
+ export declare class CoreUtils {
15
+ private static logger;
16
+ private constructor();
17
+ /**
18
+ * @description Resolve file content from a path or return provided raw content
19
+ * @summary If the input is a Uint8Array or PEM content, returns it as-is; otherwise uses a provided async fileReader to load the content from disk.
20
+ * @param {string|Uint8Array} contentOrPath - Either a raw content buffer/string or a filesystem path
21
+ * @param {function(string): Promise<string|Uint8Array|Buffer>} fileReader - Async function to read file content when a path is provided
22
+ * @return {Promise<string|Uint8Array|Buffer>} The content to be used downstream
23
+ */
24
+ private static contentOfLoadFile;
25
+ /**
26
+ * @description Read file content from a path or return provided Buffer
27
+ * @summary Convenience wrapper that loads a file using fs.promises when a path string is provided; otherwise returns the given Buffer directly.
28
+ * @param {string|Buffer} contentOrPath - Path to a file on disk or an already-loaded Buffer
29
+ * @return {Promise<string|Uint8Array|Buffer>} The file content as a Buffer/string depending on reader
30
+ */
31
+ static readFile(contentOrPath: string | Buffer): Promise<Buffer<ArrayBufferLike>>;
32
+ /**
33
+ * @description Create a Fabric CA User object with enrollment
34
+ * @summary Constructs a fabric-common User, sets a crypto suite, imports the provided private key, and sets enrollment with certificate and MSP ID.
35
+ * @param {string} userName - The user name for the CA user
36
+ * @param {string} privateKey - PEM-encoded private key
37
+ * @param {string} certificate - PEM-encoded X.509 certificate
38
+ * @param {string} mspId - Membership Service Provider identifier
39
+ * @return {Promise<User>} The enrolled Fabric User instance
40
+ */
41
+ static getCAUser(userName: string, privateKey: string, certificate: string, mspId: string): Promise<User>;
42
+ /**
43
+ * @description Build a Fabric Gateway Identity from an MSP ID and certificate
44
+ * @summary Reads a certificate from a directory path or accepts raw content and returns an Identity object suitable for the Fabric Gateway.
45
+ * @param {string} mspId - Membership Service Provider ID
46
+ * @param {string} certDirectoryPath - Path to a directory containing the certificate file, or PEM content
47
+ * @return {Promise<Identity>} The identity containing mspId and certificate credentials
48
+ */
49
+ static getIdentity(mspId: string, certDirectoryPath: string): Promise<Identity>;
50
+ static getFirstDirFileName(dirPath: string): Promise<string>;
51
+ static getFirstDirFileNameContent(dirPath: string): Promise<string>;
52
+ static getFileContent(filePath: string): Promise<string>;
53
+ static getSigner(keyDirectoryPath: string): Promise<Signer>;
54
+ private static extractPrivateKey;
55
+ }
package/package.json ADDED
@@ -0,0 +1,166 @@
1
+ {
2
+ "name": "@decaf-ts/for-fabric",
3
+ "version": "0.0.2",
4
+ "description": "template for ts projects",
5
+ "type": "module",
6
+ "exports": {
7
+ "./client": {
8
+ "require": "./lib/client/index.cjs",
9
+ "import": "./lib/esm/client/index.js"
10
+ },
11
+ "./contracts": {
12
+ "require": "./lib/contracts/index.cjs",
13
+ "import": "./lib/esm/contracts/index.js"
14
+ },
15
+ "./shared": {
16
+ "require": "./lib/shared/index.cjs",
17
+ "import": "./lib/esm/shared/index.js"
18
+ }
19
+ },
20
+ "types": "lib/index.d.ts",
21
+ "scripts": {
22
+ "do-install": "NPM_TOKEN=$(cat .npmtoken) npm install",
23
+ "update-dependencies": "PREFIX=\"decaf-ts\"; npm ls | grep \"$PREFIX\" | awk -F/ '{print $NF}' | sed 's/@.*//' | xargs -I package npm update @\"$PREFIX\"/package",
24
+ "update-scripts": "npx update-scripts",
25
+ "on-first-run": "npx update-scripts --boot",
26
+ "set-git-auth": "git config url.\"https://api:$(cat .token)@github.com/\".insteadOf \"https://github.com/\" && git config url.\"https://ssh:$(cat .token)@github.com/\".insteadOf \"ssh://git@github.com/\" && git config url.\"https://git:$(cat .token)@github.com/\".insteadOf \"git@github.com:\"",
27
+ "flash-forward": "npx npm-check-updates -u && npm run do-install",
28
+ "reset": "rm -rf * && git checkout . && git pull && npm run do-install",
29
+ "build": "npx build-scripts --dev",
30
+ "build:prod": "npx build-scripts --prod",
31
+ "test": "jest --runInBand --coverage --detectOpenHandles",
32
+ "test:unit": "jest --testPathPattern=\"/tests/unit\" --passWithNoTests --detectOpenHandles",
33
+ "test:integration": "jest --testPathPattern=\"/tests/(integration)\" --passWithNoTests --detectOpenHandles",
34
+ "test:all": "jest --testPathPattern=\"/tests\" --passWithNoTests --detectOpenHandles",
35
+ "test:circular": "dpdm -T --no-warning --no-tree ./src/index.ts",
36
+ "coverage": "rimraf ./workdocs/reports/data/*.json && npm run test:all -- --coverage --config=./workdocs/reports/jest.coverage.config.ts",
37
+ "lint": "eslint .",
38
+ "lint-fix": "eslint --fix .",
39
+ "prepare-pr": "npm run lint-fix && npm run build:prod && npm run coverage && npm run docs",
40
+ "prepare-release": "npm run lint-fix && npm run build:prod && npm run docs",
41
+ "release": "./bin/tag-release.sh",
42
+ "clean-publish": "npx clean-publish",
43
+ "drawings": "for FILE in workdocs/drawings/*.drawio; do echo \"converting $FILE to image...\" && docker run --rm -v $(pwd):/data rlespinasse/drawio-export --format png $FILE; done && cp -rf workdocs/drawings/export/* workdocs/resources/",
44
+ "uml": "cd workdocs/uml && for FILE in ./*.puml; do docker run --rm -v $(pwd):/work -w /work miy4/plantuml -DPLANTUML_LIMIT_SIZE=8192 -tpng $FILE; done && cd ../.. && cp -fr workdocs/uml/*.png workdocs/resources/",
45
+ "docs": "npx rimraf ./docs && mkdir docs && npx build-scripts --docs",
46
+ "infrastructure:up": "docker compose -f ./docker/infrastructure/docker-compose.yaml up -d",
47
+ "infrastructure:down": "docker compose -f ./docker/infrastructure/docker-compose.yaml down --rmi local -v",
48
+ "publish-docs": "docker run -it --rm --user $(id -u):$(id -g) -v \"$(pwd)/workdocs/confluence:/content\" -e ATLASSIAN_API_TOKEN=$(cat .confluence-token) ghcr.io/markdown-confluence/publish:latest",
49
+ "copy-storage": "sudo cp -R docker/infrastructure/storage docker/docker-data/ && sudo chmod -R 755 docker/docker-data",
50
+ "repo:init": "codex exec \"$(cat ./.codex/prompts/repo-setup.md)\nbase_path is `./`, initialize the repository\"",
51
+ "repo:setup": "codex exec \"$(cat ./.codex/prompts/repo-setup.md)\nbase_path is ./\"",
52
+ "repo:doc": "codex exec \"$(cat ./.codex/prompts/doc.md) $(cat ./.codex/prompts/bulk-docs.md)\nbase_path is ./\"",
53
+ "repo:tests": "codex exec \"$(cat ./.codex/prompts/bulk-tests.md)\nbase_path is ./ and coverage is 95%\" -s workspace-write",
54
+ "repo:readme": "codex exec \"$(cat ./.codex/prompts/update-readme.md)\nbase_path is ./\"",
55
+ "repo:pr": "npm run repo:doc && npm run repo:tests && npm run repo:readme",
56
+ "sync-codex": "./bin/sync-codex.sh"
57
+ },
58
+ "repository": {
59
+ "type": "git",
60
+ "url": "git+https://github.com/decaf-ts/ts-workspace.git"
61
+ },
62
+ "engines": {
63
+ "node": ">=20.0.0",
64
+ "npm": ">=10.0.0"
65
+ },
66
+ "files": [
67
+ "lib",
68
+ "dist"
69
+ ],
70
+ "keywords": [
71
+ "plantuml",
72
+ "mermaid",
73
+ "uml",
74
+ "drawio",
75
+ "mddocs",
76
+ "md",
77
+ "jsdoc",
78
+ "doc",
79
+ "docs",
80
+ "documentation",
81
+ "test",
82
+ "reports",
83
+ "confluence",
84
+ "ci/cd",
85
+ "ci",
86
+ "cd",
87
+ "template",
88
+ "typescript",
89
+ "ts"
90
+ ],
91
+ "author": "Tiago Venceslau and Contributors",
92
+ "license": "MIT",
93
+ "bugs": {
94
+ "url": "https://github.com/decaf-ts/ts-workspace/issues"
95
+ },
96
+ "homepage": "https://github.com/decaf-ts/ts-workspace#readme",
97
+ "devDependencies": {
98
+ "@decaf-ts/fabric-weaver": "latest",
99
+ "@decaf-ts/utils": "latest",
100
+ "@eslint/js": "^9.25.1",
101
+ "@rollup/plugin-commonjs": "^28.0.3",
102
+ "@rollup/plugin-json": "^6.1.0",
103
+ "@rollup/plugin-node-resolve": "^16.0.1",
104
+ "@rollup/plugin-typescript": "^12.1.2",
105
+ "@stylistic/eslint-plugin": "^4.2.0",
106
+ "@types/jest": "^29.5.14",
107
+ "clean-publish": "^5.1.0",
108
+ "dpdm": "^3.14.0",
109
+ "eslint": "^9.25.1",
110
+ "eslint-config-prettier": "^10.1.2",
111
+ "eslint-plugin-prettier": "^5.2.6",
112
+ "globals": "^16.0.0",
113
+ "jest": "^29.7.0",
114
+ "jest-html-reporters": "^3.1.7",
115
+ "jest-junit": "^16.0.0",
116
+ "jsdoc": "^4.0.4",
117
+ "jsdoc-mermaid": "^1.0.0",
118
+ "markdown-include": "^0.4.3",
119
+ "minimist": "^1.2.8",
120
+ "nodemon": "^3.1.9",
121
+ "npm-check-updates": "^18.0.0",
122
+ "prettier": "3.5.3",
123
+ "rimraf": "^6.0.1",
124
+ "rollup": "^4.40.0",
125
+ "ts-jest": "^29.3.2",
126
+ "ts-loader": "^9.5.2",
127
+ "ts-node": "^10.9.2",
128
+ "typescript": "^5.8.3",
129
+ "typescript-eslint": "^8.31.0"
130
+ },
131
+ "peerDependencies": {
132
+ "@decaf-ts/core": "latest",
133
+ "@decaf-ts/db-decorators": "latest",
134
+ "@decaf-ts/decorator-validation": "latest",
135
+ "@decaf-ts/for-couchdb": "latest",
136
+ "@decaf-ts/injectable-decorators": "latest",
137
+ "@decaf-ts/logging": "latest",
138
+ "@decaf-ts/reflection": "latest",
139
+ "@decaf-ts/transactional-decorators": "latest",
140
+ "reflect-metadata": "^0.2.1"
141
+ },
142
+ "dependencies": {
143
+ "@grpc/grpc-js": "^1.13.3",
144
+ "@hyperledger/fabric-gateway": "^1.7.1",
145
+ "@peculiar/webcrypto": "^1.5.0",
146
+ "@peculiar/x509": "^1.13.0",
147
+ "fabric-ca-client": "^2.2.20",
148
+ "fabric-common": "^2.2.20",
149
+ "fabric-contract-api": "^2.5.8",
150
+ "fabric-network": "^2.2.20",
151
+ "fabric-shim": "^2.5.8",
152
+ "json-stringify-deterministic": "^1.0.12",
153
+ "jsrsasign": "^11.1.0",
154
+ "jsrsasign-util": "^1.0.5",
155
+ "rollup-plugin-ts": "^3.4.5",
156
+ "sort-keys-recursive": "^2.1.10"
157
+ },
158
+ "overrides": {
159
+ "fabric-common": {
160
+ "jsrsasign": "^11.1.0"
161
+ },
162
+ "fabric-ca-client": {
163
+ "jsrsasign": "^11.1.0"
164
+ }
165
+ }
166
+ }