@hashgraphonline/standards-sdk 0.0.182 → 0.0.184
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/dist/cjs/hcs-12/assembly/assembly-engine.d.ts +2 -2
- package/dist/cjs/hcs-12/assembly/assembly-engine.d.ts.map +1 -1
- package/dist/cjs/hcs-12/base-client.d.ts +3 -3
- package/dist/cjs/hcs-12/base-client.d.ts.map +1 -1
- package/dist/cjs/hcs-12/browser.d.ts.map +1 -1
- package/dist/cjs/hcs-12/builders/action-builder.d.ts +5 -0
- package/dist/cjs/hcs-12/builders/action-builder.d.ts.map +1 -1
- package/dist/cjs/hcs-12/registries/action-registry.d.ts +7 -2
- package/dist/cjs/hcs-12/registries/action-registry.d.ts.map +1 -1
- package/dist/cjs/hcs-12/registries/assembly-registry.d.ts +2 -2
- package/dist/cjs/hcs-12/registries/assembly-registry.d.ts.map +1 -1
- package/dist/cjs/hcs-12/registries/base-registry.d.ts +3 -3
- package/dist/cjs/hcs-12/registries/base-registry.d.ts.map +1 -1
- package/dist/cjs/hcs-12/registries/block-loader.d.ts +2 -2
- package/dist/cjs/hcs-12/registries/block-loader.d.ts.map +1 -1
- package/dist/cjs/hcs-12/registries/hashlinks-registry.d.ts +2 -2
- package/dist/cjs/hcs-12/registries/hashlinks-registry.d.ts.map +1 -1
- package/dist/cjs/hcs-12/rendering/resource-manager.d.ts.map +1 -1
- package/dist/cjs/hcs-12/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-12/security/hash-verifier.d.ts +13 -0
- package/dist/cjs/hcs-12/security/hash-verifier.d.ts.map +1 -1
- package/dist/cjs/hcs-12/security/permission-system.d.ts +5 -5
- package/dist/cjs/hcs-12/security/permission-system.d.ts.map +1 -1
- package/dist/cjs/hcs-12/security/signature-verifier.d.ts +5 -0
- package/dist/cjs/hcs-12/security/signature-verifier.d.ts.map +1 -1
- package/dist/cjs/hcs-12/validation/wasm-validator.d.ts +9 -4
- package/dist/cjs/hcs-12/validation/wasm-validator.d.ts.map +1 -1
- package/dist/cjs/{index-5G8lx2OC.cjs → index-DH8JqKpL.cjs} +21 -21
- package/dist/cjs/{index-5G8lx2OC.cjs.map → index-DH8JqKpL.cjs.map} +1 -1
- package/dist/cjs/{index-DNOBUKZd-ByWVn3_3.cjs → index-DNOBUKZd-DP8GdiGA.cjs} +2 -2
- package/dist/cjs/{index-DNOBUKZd-ByWVn3_3.cjs.map → index-DNOBUKZd-DP8GdiGA.cjs.map} +1 -1
- package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +1 -1
- package/dist/cjs/{standards-sdk.es47-LpJXpYet-BcMEbzeg.cjs → standards-sdk.es47-LpJXpYet-BEh9hyjN.cjs} +2 -2
- package/dist/cjs/{standards-sdk.es47-LpJXpYet-BcMEbzeg.cjs.map → standards-sdk.es47-LpJXpYet-BEh9hyjN.cjs.map} +1 -1
- package/dist/cjs/{standards-sdk.es48-PT6ZHlCU-DeVBWhj9.cjs → standards-sdk.es48-PT6ZHlCU-AWU0EkFj.cjs} +2 -2
- package/dist/cjs/{standards-sdk.es48-PT6ZHlCU-DeVBWhj9.cjs.map → standards-sdk.es48-PT6ZHlCU-AWU0EkFj.cjs.map} +1 -1
- package/dist/cjs/{standards-sdk.es49-BoFc-ELK-C2EmnXa-.cjs → standards-sdk.es49-BoFc-ELK-Bz7Gd2qu.cjs} +2 -2
- package/dist/cjs/{standards-sdk.es49-BoFc-ELK-C2EmnXa-.cjs.map → standards-sdk.es49-BoFc-ELK-Bz7Gd2qu.cjs.map} +1 -1
- package/dist/cjs/{standards-sdk.es50-miBtNmtl-2L3nQXPh.cjs → standards-sdk.es50-miBtNmtl-DcjyhGyg.cjs} +2 -2
- package/dist/cjs/{standards-sdk.es50-miBtNmtl-2L3nQXPh.cjs.map → standards-sdk.es50-miBtNmtl-DcjyhGyg.cjs.map} +1 -1
- package/dist/cjs/{standards-sdk.es51-rS2UvvV5-D0SR8-Nc.cjs → standards-sdk.es51-rS2UvvV5-Bmyu85K4.cjs} +2 -2
- package/dist/cjs/{standards-sdk.es51-rS2UvvV5-D0SR8-Nc.cjs.map → standards-sdk.es51-rS2UvvV5-Bmyu85K4.cjs.map} +1 -1
- package/dist/cjs/{standards-sdk.es52-D-lvSMBY-DgGZRneG.cjs → standards-sdk.es52-D-lvSMBY-t0dhVZEE.cjs} +2 -2
- package/dist/cjs/{standards-sdk.es52-D-lvSMBY-DgGZRneG.cjs.map → standards-sdk.es52-D-lvSMBY-t0dhVZEE.cjs.map} +1 -1
- package/dist/cjs/utils/crypto-abstraction.d.ts +89 -0
- package/dist/cjs/utils/crypto-abstraction.d.ts.map +1 -0
- package/dist/cjs/utils/crypto-env.d.ts +25 -0
- package/dist/cjs/utils/crypto-env.d.ts.map +1 -0
- package/dist/cjs/utils/hash-adapter.d.ts +46 -0
- package/dist/cjs/utils/hash-adapter.d.ts.map +1 -0
- package/dist/es/hcs-12/assembly/assembly-engine.d.ts +2 -2
- package/dist/es/hcs-12/assembly/assembly-engine.d.ts.map +1 -1
- package/dist/es/hcs-12/base-client.d.ts +3 -3
- package/dist/es/hcs-12/base-client.d.ts.map +1 -1
- package/dist/es/hcs-12/browser.d.ts.map +1 -1
- package/dist/es/hcs-12/builders/action-builder.d.ts +5 -0
- package/dist/es/hcs-12/builders/action-builder.d.ts.map +1 -1
- package/dist/es/hcs-12/registries/action-registry.d.ts +7 -2
- package/dist/es/hcs-12/registries/action-registry.d.ts.map +1 -1
- package/dist/es/hcs-12/registries/assembly-registry.d.ts +2 -2
- package/dist/es/hcs-12/registries/assembly-registry.d.ts.map +1 -1
- package/dist/es/hcs-12/registries/base-registry.d.ts +3 -3
- package/dist/es/hcs-12/registries/base-registry.d.ts.map +1 -1
- package/dist/es/hcs-12/registries/block-loader.d.ts +2 -2
- package/dist/es/hcs-12/registries/block-loader.d.ts.map +1 -1
- package/dist/es/hcs-12/registries/hashlinks-registry.d.ts +2 -2
- package/dist/es/hcs-12/registries/hashlinks-registry.d.ts.map +1 -1
- package/dist/es/hcs-12/rendering/resource-manager.d.ts.map +1 -1
- package/dist/es/hcs-12/sdk.d.ts.map +1 -1
- package/dist/es/hcs-12/security/hash-verifier.d.ts +13 -0
- package/dist/es/hcs-12/security/hash-verifier.d.ts.map +1 -1
- package/dist/es/hcs-12/security/permission-system.d.ts +5 -5
- package/dist/es/hcs-12/security/permission-system.d.ts.map +1 -1
- package/dist/es/hcs-12/security/signature-verifier.d.ts +5 -0
- package/dist/es/hcs-12/security/signature-verifier.d.ts.map +1 -1
- package/dist/es/hcs-12/validation/wasm-validator.d.ts +9 -4
- package/dist/es/hcs-12/validation/wasm-validator.d.ts.map +1 -1
- package/dist/es/inscribe/inscriber.d.ts.map +1 -1
- package/dist/es/standards-sdk.es11.js +1 -1
- package/dist/es/standards-sdk.es12.js +1 -1
- package/dist/es/standards-sdk.es13.js +1 -1
- package/dist/es/standards-sdk.es18.js +1 -1
- package/dist/es/standards-sdk.es21.js.map +1 -1
- package/dist/es/standards-sdk.es22.js +49 -6
- package/dist/es/standards-sdk.es22.js.map +1 -1
- package/dist/es/standards-sdk.es23.js.map +1 -1
- package/dist/es/standards-sdk.es24.js.map +1 -1
- package/dist/es/standards-sdk.es25.js +0 -1
- package/dist/es/standards-sdk.es25.js.map +1 -1
- package/dist/es/standards-sdk.es26.js +1 -4
- package/dist/es/standards-sdk.es26.js.map +1 -1
- package/dist/es/standards-sdk.es27.js +1 -1
- package/dist/es/standards-sdk.es27.js.map +1 -1
- package/dist/es/standards-sdk.es28.js +1 -3
- package/dist/es/standards-sdk.es28.js.map +1 -1
- package/dist/es/standards-sdk.es29.js +36 -10
- package/dist/es/standards-sdk.es29.js.map +1 -1
- package/dist/es/standards-sdk.es32.js +20 -4
- package/dist/es/standards-sdk.es32.js.map +1 -1
- package/dist/es/standards-sdk.es34.js.map +1 -1
- package/dist/es/standards-sdk.es37.js +9 -0
- package/dist/es/standards-sdk.es37.js.map +1 -1
- package/dist/es/standards-sdk.es46.js +1 -1
- package/dist/es/standards-sdk.es52.js +1 -1
- package/dist/es/standards-sdk.es59.js +7 -7
- package/dist/es/standards-sdk.es64.js +1 -1
- package/dist/es/standards-sdk.es65.js +1 -1
- package/dist/es/standards-sdk.es66.js +35 -7
- package/dist/es/standards-sdk.es66.js.map +1 -1
- package/dist/es/standards-sdk.es72.js +2 -410
- package/dist/es/standards-sdk.es72.js.map +1 -1
- package/dist/es/standards-sdk.es74.js +409 -203
- package/dist/es/standards-sdk.es74.js.map +1 -1
- package/dist/es/standards-sdk.es75.js +2 -172
- package/dist/es/standards-sdk.es75.js.map +1 -1
- package/dist/es/standards-sdk.es76.js +181 -299
- package/dist/es/standards-sdk.es76.js.map +1 -1
- package/dist/es/standards-sdk.es77.js +120 -294
- package/dist/es/standards-sdk.es77.js.map +1 -1
- package/dist/es/standards-sdk.es78.js +191 -322
- package/dist/es/standards-sdk.es78.js.map +1 -1
- package/dist/es/standards-sdk.es79.js +294 -279
- package/dist/es/standards-sdk.es79.js.map +1 -1
- package/dist/es/standards-sdk.es80.js +450 -303
- package/dist/es/standards-sdk.es80.js.map +1 -1
- package/dist/es/standards-sdk.es81.js +319 -64
- package/dist/es/standards-sdk.es81.js.map +1 -1
- package/dist/es/standards-sdk.es82.js +306 -2
- package/dist/es/standards-sdk.es82.js.map +1 -1
- package/dist/es/standards-sdk.es83.js +76 -2
- package/dist/es/standards-sdk.es83.js.map +1 -1
- package/dist/es/standards-sdk.es91.js +202 -0
- package/dist/es/standards-sdk.es91.js.map +1 -0
- package/dist/es/standards-sdk.es92.js +37 -0
- package/dist/es/standards-sdk.es92.js.map +1 -0
- package/dist/es/standards-sdk.es93.js +81 -0
- package/dist/es/standards-sdk.es93.js.map +1 -0
- package/dist/es/utils/crypto-abstraction.d.ts +89 -0
- package/dist/es/utils/crypto-abstraction.d.ts.map +1 -0
- package/dist/es/utils/crypto-env.d.ts +25 -0
- package/dist/es/utils/crypto-env.d.ts.map +1 -0
- package/dist/es/utils/hash-adapter.d.ts +46 -0
- package/dist/es/utils/hash-adapter.d.ts.map +1 -0
- package/package.json +2 -1
|
@@ -1,325 +1,207 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { I as InscriptionSDK } from "./standards-sdk.es73.js";
|
|
2
|
+
class QuoteCache {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
5
|
+
this.maxSize = 100;
|
|
6
|
+
this.defaultTtlMs = 5 * 60 * 1e3;
|
|
7
|
+
}
|
|
8
|
+
// 5 minutes
|
|
6
9
|
/**
|
|
7
|
-
*
|
|
8
|
-
* This handles both regular transactions and signed transaction variants
|
|
10
|
+
* Generate cache key from input parameters
|
|
9
11
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (originalBytes || transaction.toBytes) {
|
|
13
|
-
try {
|
|
14
|
-
const bytesToParse = originalBytes || transaction.toBytes();
|
|
15
|
-
const decoded = proto.TransactionList.decode(bytesToParse);
|
|
16
|
-
if (decoded.transactionList && decoded.transactionList.length > 0) {
|
|
17
|
-
const tx = decoded.transactionList[0];
|
|
18
|
-
let txBody = null;
|
|
19
|
-
if (tx.bodyBytes && tx.bodyBytes.length > 0) {
|
|
20
|
-
txBody = proto.TransactionBody.decode(tx.bodyBytes);
|
|
21
|
-
} else if (tx.signedTransactionBytes && tx.signedTransactionBytes.length > 0) {
|
|
22
|
-
const signedTx = proto.SignedTransaction.decode(
|
|
23
|
-
tx.signedTransactionBytes
|
|
24
|
-
);
|
|
25
|
-
if (signedTx.bodyBytes) {
|
|
26
|
-
txBody = proto.TransactionBody.decode(signedTx.bodyBytes);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
if (txBody) {
|
|
30
|
-
const protoResult = this.parseFromProtobufTxBody(txBody);
|
|
31
|
-
if (protoResult.type && protoResult.type !== "UNKNOWN") {
|
|
32
|
-
return protoResult;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
} catch (protoError) {
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return this.parseFromTransactionInternals(transaction);
|
|
40
|
-
} catch (error) {
|
|
41
|
-
return { type: "UNKNOWN", humanReadableType: "Unknown File Transaction" };
|
|
42
|
-
}
|
|
12
|
+
generateKey(key) {
|
|
13
|
+
return `${key.inputHash}-${key.clientConfigHash}-${key.optionsHash}`;
|
|
43
14
|
}
|
|
44
15
|
/**
|
|
45
|
-
*
|
|
46
|
-
* Handles all file operations from decoded protobuf data
|
|
16
|
+
* Hash object to string for cache key
|
|
47
17
|
*/
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const fileCreate = this.parseFileCreate(txBody.fileCreate);
|
|
51
|
-
if (fileCreate) {
|
|
52
|
-
return {
|
|
53
|
-
type: "FILECREATE",
|
|
54
|
-
humanReadableType: "File Create",
|
|
55
|
-
fileCreate
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (txBody.fileAppend) {
|
|
60
|
-
const fileAppend = this.parseFileAppend(txBody.fileAppend);
|
|
61
|
-
if (fileAppend) {
|
|
62
|
-
return {
|
|
63
|
-
type: "FILEAPPEND",
|
|
64
|
-
humanReadableType: "File Append",
|
|
65
|
-
fileAppend
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
if (txBody.fileUpdate) {
|
|
70
|
-
const fileUpdate = this.parseFileUpdate(txBody.fileUpdate);
|
|
71
|
-
if (fileUpdate) {
|
|
72
|
-
return {
|
|
73
|
-
type: "FILEUPDATE",
|
|
74
|
-
humanReadableType: "File Update",
|
|
75
|
-
fileUpdate
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
if (txBody.fileDelete) {
|
|
80
|
-
const fileDelete = this.parseFileDelete(txBody.fileDelete);
|
|
81
|
-
if (fileDelete) {
|
|
82
|
-
return {
|
|
83
|
-
type: "FILEDELETE",
|
|
84
|
-
humanReadableType: "File Delete",
|
|
85
|
-
fileDelete
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return {};
|
|
18
|
+
hashObject(obj) {
|
|
19
|
+
return Buffer.from(JSON.stringify(obj)).toString("base64").slice(0, 16);
|
|
90
20
|
}
|
|
91
21
|
/**
|
|
92
|
-
*
|
|
93
|
-
* This handles cases where data is stored in Transaction object internals
|
|
22
|
+
* Create cache key from parameters
|
|
94
23
|
*/
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
if (tx._keys && tx._keys.length > 0) {
|
|
111
|
-
const keyList = {
|
|
112
|
-
keys: tx._keys
|
|
113
|
-
};
|
|
114
|
-
fileCreate.keys = parseKey({ keyList });
|
|
115
|
-
}
|
|
116
|
-
if (tx._expirationTime) {
|
|
117
|
-
fileCreate.expirationTime = tx._expirationTime.toString();
|
|
118
|
-
}
|
|
119
|
-
if (tx._memo) {
|
|
120
|
-
fileCreate.memo = tx._memo;
|
|
121
|
-
}
|
|
122
|
-
return {
|
|
123
|
-
type: "FILECREATE",
|
|
124
|
-
humanReadableType: "File Create",
|
|
125
|
-
fileCreate
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
if (hasTransactionType(transaction, "fileAppend")) {
|
|
129
|
-
const fileAppend = {
|
|
130
|
-
fileId: tx._fileId.toString()
|
|
131
|
-
};
|
|
132
|
-
if (tx._contents) {
|
|
133
|
-
const contentInfo = this.analyzeContent(tx._contents);
|
|
134
|
-
fileAppend.contents = contentInfo.encoded;
|
|
135
|
-
if (contentInfo.size) {
|
|
136
|
-
fileAppend.contentSize = contentInfo.size;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return {
|
|
140
|
-
type: "FILEAPPEND",
|
|
141
|
-
humanReadableType: "File Append",
|
|
142
|
-
fileAppend
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
if (hasTransactionType(transaction, "fileUpdate")) {
|
|
146
|
-
const fileUpdate = {
|
|
147
|
-
fileId: tx._fileId.toString()
|
|
148
|
-
};
|
|
149
|
-
if (tx._contents) {
|
|
150
|
-
const contentInfo = this.analyzeContent(tx._contents);
|
|
151
|
-
fileUpdate.contents = contentInfo.encoded;
|
|
152
|
-
if (contentInfo.size) {
|
|
153
|
-
fileUpdate.contentSize = contentInfo.size;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
if (tx._keys && tx._keys.length > 0) {
|
|
157
|
-
const keyList = {
|
|
158
|
-
keys: tx._keys
|
|
159
|
-
};
|
|
160
|
-
fileUpdate.keys = parseKey({ keyList });
|
|
161
|
-
}
|
|
162
|
-
if (tx._expirationTime) {
|
|
163
|
-
fileUpdate.expirationTime = tx._expirationTime.toString();
|
|
164
|
-
}
|
|
165
|
-
if (tx._memo) {
|
|
166
|
-
fileUpdate.memo = tx._memo;
|
|
167
|
-
}
|
|
168
|
-
return {
|
|
169
|
-
type: "FILEUPDATE",
|
|
170
|
-
humanReadableType: "File Update",
|
|
171
|
-
fileUpdate
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
if (hasTransactionType(transaction, "fileDelete")) {
|
|
175
|
-
const fileDelete = {
|
|
176
|
-
fileId: tx._fileId.toString()
|
|
177
|
-
};
|
|
178
|
-
return {
|
|
179
|
-
type: "FILEDELETE",
|
|
180
|
-
humanReadableType: "File Delete",
|
|
181
|
-
fileDelete
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
return {};
|
|
185
|
-
} catch (error) {
|
|
186
|
-
return {};
|
|
187
|
-
}
|
|
24
|
+
createCacheKey(input, clientConfig, options) {
|
|
25
|
+
return {
|
|
26
|
+
inputHash: this.hashObject(input),
|
|
27
|
+
clientConfigHash: this.hashObject({
|
|
28
|
+
accountId: clientConfig.accountId,
|
|
29
|
+
network: clientConfig.network
|
|
30
|
+
}),
|
|
31
|
+
optionsHash: this.hashObject({
|
|
32
|
+
mode: options.mode,
|
|
33
|
+
apiKey: options.apiKey ? "present" : "absent",
|
|
34
|
+
network: options.network,
|
|
35
|
+
metadata: options.metadata
|
|
36
|
+
})
|
|
37
|
+
};
|
|
188
38
|
}
|
|
189
39
|
/**
|
|
190
|
-
*
|
|
40
|
+
* Get cached quote if available and not expired
|
|
191
41
|
*/
|
|
192
|
-
|
|
193
|
-
const
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
);
|
|
217
|
-
const hasReplacementChars = textContent.includes("�");
|
|
218
|
-
if (!hasControlChars && !hasReplacementChars) {
|
|
219
|
-
if (textContent.trim().startsWith("{") && textContent.trim().endsWith("}")) {
|
|
220
|
-
contentType = "application/json";
|
|
221
|
-
} else if (textContent.includes("<?xml") || textContent.includes("<html")) {
|
|
222
|
-
contentType = "text/xml";
|
|
223
|
-
} else if (textContent.includes("<!DOCTYPE html")) {
|
|
224
|
-
contentType = "text/html";
|
|
225
|
-
} else {
|
|
226
|
-
contentType = "text/plain";
|
|
227
|
-
}
|
|
228
|
-
} else {
|
|
229
|
-
contentType = "application/octet-stream";
|
|
230
|
-
}
|
|
231
|
-
} catch {
|
|
232
|
-
contentType = "application/octet-stream";
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
let encoded;
|
|
236
|
-
if (contentType?.startsWith("text/") || contentType === "application/json") {
|
|
237
|
-
try {
|
|
238
|
-
encoded = contentBuffer.toString("utf8");
|
|
239
|
-
if (encoded.includes("�") || /[\x00-\x08\x0B\x0E-\x1F\x7F]/.test(encoded)) {
|
|
240
|
-
encoded = contentBuffer.toString("base64");
|
|
241
|
-
}
|
|
242
|
-
} catch {
|
|
243
|
-
encoded = contentBuffer.toString("base64");
|
|
42
|
+
get(key) {
|
|
43
|
+
const cacheKey = this.generateKey(key);
|
|
44
|
+
const entry = this.cache.get(cacheKey);
|
|
45
|
+
if (!entry) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
if (now - entry.timestamp > entry.ttlMs) {
|
|
50
|
+
this.cache.delete(cacheKey);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
this.cache.delete(cacheKey);
|
|
54
|
+
this.cache.set(cacheKey, entry);
|
|
55
|
+
return entry.quote;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Store quote in cache
|
|
59
|
+
*/
|
|
60
|
+
set(key, quote, ttlMs = this.defaultTtlMs) {
|
|
61
|
+
const cacheKey = this.generateKey(key);
|
|
62
|
+
if (this.cache.size >= this.maxSize) {
|
|
63
|
+
const firstKey = this.cache.keys().next().value;
|
|
64
|
+
if (firstKey) {
|
|
65
|
+
this.cache.delete(firstKey);
|
|
244
66
|
}
|
|
245
|
-
} else {
|
|
246
|
-
encoded = contentBuffer.toString("base64");
|
|
247
67
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
};
|
|
68
|
+
this.cache.set(cacheKey, {
|
|
69
|
+
quote,
|
|
70
|
+
timestamp: Date.now(),
|
|
71
|
+
ttlMs
|
|
72
|
+
});
|
|
253
73
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
body.expirationTime.seconds
|
|
260
|
-
).toString()}.${body.expirationTime.nanos}`;
|
|
261
|
-
}
|
|
262
|
-
if (body.keys) {
|
|
263
|
-
data.keys = parseKey({ keyList: body.keys });
|
|
264
|
-
}
|
|
265
|
-
if (body.contents) {
|
|
266
|
-
data.contents = Buffer.from(body.contents).toString("base64");
|
|
267
|
-
}
|
|
268
|
-
if (body.memo) {
|
|
269
|
-
data.memo = body.memo;
|
|
270
|
-
}
|
|
271
|
-
return data;
|
|
74
|
+
/**
|
|
75
|
+
* Clear all cached entries
|
|
76
|
+
*/
|
|
77
|
+
clear() {
|
|
78
|
+
this.cache.clear();
|
|
272
79
|
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
if (body.contents) {
|
|
280
|
-
data.contents = Buffer.from(body.contents).toString("base64");
|
|
281
|
-
}
|
|
282
|
-
return data;
|
|
80
|
+
}
|
|
81
|
+
class SDKCache {
|
|
82
|
+
constructor() {
|
|
83
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
84
|
+
this.maxSize = 10;
|
|
85
|
+
this.defaultTtlMs = 30 * 60 * 1e3;
|
|
283
86
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
if (
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
87
|
+
// 30 minutes
|
|
88
|
+
/**
|
|
89
|
+
* Generate config key for SDK instance
|
|
90
|
+
*/
|
|
91
|
+
generateConfigKey(config) {
|
|
92
|
+
return Buffer.from(JSON.stringify(config)).toString("base64");
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get cached SDK instance
|
|
96
|
+
*/
|
|
97
|
+
get(config) {
|
|
98
|
+
const configKey = this.generateConfigKey(config);
|
|
99
|
+
const entry = this.cache.get(configKey);
|
|
100
|
+
if (!entry) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const now = Date.now();
|
|
104
|
+
if (now - entry.timestamp > this.defaultTtlMs) {
|
|
105
|
+
this.cache.delete(configKey);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
return entry.sdk;
|
|
305
109
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
110
|
+
/**
|
|
111
|
+
* Store SDK instance in cache
|
|
112
|
+
*/
|
|
113
|
+
set(config, sdk) {
|
|
114
|
+
const configKey = this.generateConfigKey(config);
|
|
115
|
+
if (this.cache.size >= this.maxSize) {
|
|
116
|
+
const firstKey = this.cache.keys().next().value;
|
|
117
|
+
if (firstKey) {
|
|
118
|
+
this.cache.delete(firstKey);
|
|
119
|
+
}
|
|
311
120
|
}
|
|
312
|
-
|
|
121
|
+
this.cache.set(configKey, {
|
|
122
|
+
sdk,
|
|
123
|
+
timestamp: Date.now(),
|
|
124
|
+
config: configKey
|
|
125
|
+
});
|
|
313
126
|
}
|
|
314
127
|
/**
|
|
315
|
-
*
|
|
316
|
-
* This is the unified entry point that delegates to the comprehensive parsing logic
|
|
128
|
+
* Clear all cached SDK instances
|
|
317
129
|
*/
|
|
318
|
-
|
|
319
|
-
|
|
130
|
+
clear() {
|
|
131
|
+
this.cache.clear();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const quoteCache = new QuoteCache();
|
|
135
|
+
const sdkCache = new SDKCache();
|
|
136
|
+
async function getOrCreateSDK(clientConfig, options, existingSDK) {
|
|
137
|
+
if (existingSDK) {
|
|
138
|
+
return existingSDK;
|
|
139
|
+
}
|
|
140
|
+
const cacheConfig = {
|
|
141
|
+
apiKey: options.apiKey,
|
|
142
|
+
accountId: clientConfig.accountId,
|
|
143
|
+
network: clientConfig.network || "mainnet",
|
|
144
|
+
authType: options.apiKey ? "api" : "server"
|
|
145
|
+
};
|
|
146
|
+
const cachedSDK = sdkCache.get(cacheConfig);
|
|
147
|
+
if (cachedSDK) {
|
|
148
|
+
return cachedSDK;
|
|
149
|
+
}
|
|
150
|
+
let sdk;
|
|
151
|
+
if (options.apiKey) {
|
|
152
|
+
sdk = new InscriptionSDK({
|
|
153
|
+
apiKey: options.apiKey,
|
|
154
|
+
network: clientConfig.network || "mainnet"
|
|
155
|
+
});
|
|
156
|
+
} else {
|
|
157
|
+
sdk = await InscriptionSDK.createWithAuth({
|
|
158
|
+
type: "server",
|
|
159
|
+
accountId: clientConfig.accountId,
|
|
160
|
+
privateKey: clientConfig.privateKey,
|
|
161
|
+
network: clientConfig.network || "mainnet"
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
sdkCache.set(cacheConfig, sdk);
|
|
165
|
+
return sdk;
|
|
166
|
+
}
|
|
167
|
+
function getCachedQuote(input, clientConfig, options) {
|
|
168
|
+
const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);
|
|
169
|
+
return quoteCache.get(cacheKey);
|
|
170
|
+
}
|
|
171
|
+
function cacheQuote(input, clientConfig, options, quote) {
|
|
172
|
+
const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);
|
|
173
|
+
const quoteTtlMs = 10 * 60 * 1e3;
|
|
174
|
+
quoteCache.set(cacheKey, quote, quoteTtlMs);
|
|
175
|
+
}
|
|
176
|
+
function validateQuoteParameters(input, clientConfig, options) {
|
|
177
|
+
if (!input || typeof input !== "object" || !("type" in input)) {
|
|
178
|
+
throw new Error("Invalid inscription input: type is required");
|
|
179
|
+
}
|
|
180
|
+
if (!clientConfig || !clientConfig.accountId) {
|
|
181
|
+
throw new Error("Invalid client config: accountId is required");
|
|
182
|
+
}
|
|
183
|
+
if (!options) {
|
|
184
|
+
throw new Error("Options are required");
|
|
185
|
+
}
|
|
186
|
+
if (options.mode === "hashinal") {
|
|
187
|
+
if (!options.metadata) {
|
|
188
|
+
throw new Error("Hashinal mode requires metadata");
|
|
189
|
+
}
|
|
190
|
+
const requiredFields = ["name", "creator", "description", "type"];
|
|
191
|
+
const missingFields = requiredFields.filter(
|
|
192
|
+
(field) => !options.metadata || !options.metadata[field]
|
|
193
|
+
);
|
|
194
|
+
if (missingFields.length > 0) {
|
|
195
|
+
throw new Error(
|
|
196
|
+
`Missing required Hashinal metadata fields: ${missingFields.join(", ")}`
|
|
197
|
+
);
|
|
198
|
+
}
|
|
320
199
|
}
|
|
321
200
|
}
|
|
322
201
|
export {
|
|
323
|
-
|
|
202
|
+
cacheQuote,
|
|
203
|
+
getCachedQuote,
|
|
204
|
+
getOrCreateSDK,
|
|
205
|
+
validateQuoteParameters
|
|
324
206
|
};
|
|
325
207
|
//# sourceMappingURL=standards-sdk.es76.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es76.js","sources":["../../src/utils/parsers/file-parser.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport { Long, Transaction } from '@hashgraph/sdk';\nimport {\n FileCreateData,\n FileAppendData,\n FileUpdateData,\n FileDeleteData,\n} from '../transaction-parser-types';\nimport {\n parseKey,\n extractTransactionBody,\n hasTransactionType,\n} from './parser-utils';\nimport { Buffer } from 'buffer';\nimport { FileId } from '@hashgraph/sdk';\n\n/**\n * File Service Parser\n *\n * Handles parsing for all file-related transaction types including:\n * - File creation, updates, append, and deletion\n * - Proper dual-branch parsing (regular vs signed transactions)\n * - Comprehensive protobuf extraction\n * - Enhanced content handling with type detection\n */\nexport class FileParser {\n /**\n * Parse File Service transaction using unified dual-branch approach\n * This handles both regular transactions and signed transaction variants\n */\n static parseFileTransaction(\n transaction: Transaction,\n originalBytes?: Uint8Array,\n ): {\n type?: string;\n humanReadableType?: string;\n fileCreate?: FileCreateData;\n fileAppend?: FileAppendData;\n fileUpdate?: FileUpdateData;\n fileDelete?: FileDeleteData;\n [key: string]: unknown;\n } {\n try {\n if (originalBytes || transaction.toBytes) {\n try {\n const bytesToParse = originalBytes || transaction.toBytes();\n const decoded = proto.TransactionList.decode(bytesToParse);\n\n if (decoded.transactionList && decoded.transactionList.length > 0) {\n const tx = decoded.transactionList[0];\n let txBody: proto.ITransactionBody | null = null;\n\n if (tx.bodyBytes && tx.bodyBytes.length > 0) {\n txBody = proto.TransactionBody.decode(tx.bodyBytes);\n } else if (\n tx.signedTransactionBytes &&\n tx.signedTransactionBytes.length > 0\n ) {\n const signedTx = proto.SignedTransaction.decode(\n tx.signedTransactionBytes,\n );\n if (signedTx.bodyBytes) {\n txBody = proto.TransactionBody.decode(signedTx.bodyBytes);\n }\n }\n\n if (txBody) {\n const protoResult = this.parseFromProtobufTxBody(txBody);\n if (protoResult.type && protoResult.type !== 'UNKNOWN') {\n return protoResult;\n }\n }\n }\n } catch (protoError) {}\n }\n\n return this.parseFromTransactionInternals(transaction);\n } catch (error) {\n return { type: 'UNKNOWN', humanReadableType: 'Unknown File Transaction' };\n }\n }\n\n /**\n * Parse file transaction from protobuf TransactionBody\n * Handles all file operations from decoded protobuf data\n */\n private static parseFromProtobufTxBody(txBody: proto.ITransactionBody): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n if (txBody.fileCreate) {\n const fileCreate = this.parseFileCreate(txBody.fileCreate);\n if (fileCreate) {\n return {\n type: 'FILECREATE',\n humanReadableType: 'File Create',\n fileCreate,\n };\n }\n }\n\n if (txBody.fileAppend) {\n const fileAppend = this.parseFileAppend(txBody.fileAppend);\n if (fileAppend) {\n return {\n type: 'FILEAPPEND',\n humanReadableType: 'File Append',\n fileAppend,\n };\n }\n }\n\n if (txBody.fileUpdate) {\n const fileUpdate = this.parseFileUpdate(txBody.fileUpdate);\n if (fileUpdate) {\n return {\n type: 'FILEUPDATE',\n humanReadableType: 'File Update',\n fileUpdate,\n };\n }\n }\n\n if (txBody.fileDelete) {\n const fileDelete = this.parseFileDelete(txBody.fileDelete);\n if (fileDelete) {\n return {\n type: 'FILEDELETE',\n humanReadableType: 'File Delete',\n fileDelete,\n };\n }\n }\n\n return {};\n }\n\n /**\n * Extract file data from Transaction internal fields\n * This handles cases where data is stored in Transaction object internals\n */\n private static parseFromTransactionInternals(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n try {\n const tx = transaction as unknown as {\n _fileId?: { toString(): string };\n _contents?: Uint8Array;\n _keys?: unknown[];\n _expirationTime?: { toString(): string };\n _memo?: string;\n constructor?: { name?: string };\n };\n\n if (hasTransactionType(transaction, 'fileCreate')) {\n const fileCreate: FileCreateData = {};\n\n if (tx._contents) {\n const contentInfo = this.analyzeContent(tx._contents);\n fileCreate.contents = contentInfo.encoded;\n if (contentInfo.contentType) {\n fileCreate.contentType = contentInfo.contentType;\n }\n if (contentInfo.size) {\n fileCreate.contentSize = contentInfo.size;\n }\n }\n\n if (tx._keys && tx._keys.length > 0) {\n const keyList: proto.IKeyList = {\n keys: tx._keys as unknown as proto.IKey[],\n };\n fileCreate.keys = parseKey({ keyList });\n }\n\n if (tx._expirationTime) {\n fileCreate.expirationTime = tx._expirationTime.toString();\n }\n\n if (tx._memo) {\n fileCreate.memo = tx._memo;\n }\n\n return {\n type: 'FILECREATE',\n humanReadableType: 'File Create',\n fileCreate,\n };\n }\n\n if (hasTransactionType(transaction, 'fileAppend')) {\n const fileAppend: FileAppendData = {\n fileId: tx._fileId.toString(),\n };\n\n if (tx._contents) {\n const contentInfo = this.analyzeContent(tx._contents);\n fileAppend.contents = contentInfo.encoded;\n if (contentInfo.size) {\n fileAppend.contentSize = contentInfo.size;\n }\n }\n\n return {\n type: 'FILEAPPEND',\n humanReadableType: 'File Append',\n fileAppend,\n };\n }\n\n if (hasTransactionType(transaction, 'fileUpdate')) {\n const fileUpdate: FileUpdateData = {\n fileId: tx._fileId.toString(),\n };\n\n if (tx._contents) {\n const contentInfo = this.analyzeContent(tx._contents);\n fileUpdate.contents = contentInfo.encoded;\n if (contentInfo.size) {\n fileUpdate.contentSize = contentInfo.size;\n }\n }\n\n if (tx._keys && tx._keys.length > 0) {\n const keyList: proto.IKeyList = {\n keys: tx._keys as unknown as proto.IKey[],\n };\n fileUpdate.keys = parseKey({ keyList });\n }\n\n if (tx._expirationTime) {\n fileUpdate.expirationTime = tx._expirationTime.toString();\n }\n\n if (tx._memo) {\n fileUpdate.memo = tx._memo;\n }\n\n return {\n type: 'FILEUPDATE',\n humanReadableType: 'File Update',\n fileUpdate,\n };\n }\n\n if (hasTransactionType(transaction, 'fileDelete')) {\n const fileDelete: FileDeleteData = {\n fileId: tx._fileId.toString(),\n };\n\n return {\n type: 'FILEDELETE',\n humanReadableType: 'File Delete',\n fileDelete,\n };\n }\n\n return {};\n } catch (error) {\n return {};\n }\n }\n\n /**\n * Enhanced content analysis with type detection and metadata\n */\n private static analyzeContent(contents: Uint8Array): {\n encoded: string;\n contentType?: string;\n size: number;\n } {\n const size = contents.length;\n const contentBuffer = Buffer.from(contents);\n\n let contentType: string | undefined;\n\n if (size >= 4) {\n const header = contentBuffer.subarray(0, 4);\n const headerHex = header.toString('hex');\n\n const signatures: Record<string, string> = {\n '89504e47': 'image/png',\n ffd8ffe0: 'image/jpeg',\n ffd8ffe1: 'image/jpeg',\n '47494638': 'image/gif',\n '25504446': 'application/pdf',\n '504b0304': 'application/zip',\n '7f454c46': 'application/x-executable',\n d0cf11e0: 'application/msoffice',\n };\n\n contentType = signatures[headerHex.toLowerCase()];\n }\n\n if (!contentType) {\n try {\n const textContent = contentBuffer.toString('utf8');\n const hasControlChars = /[\\x00-\\x08\\x0B\\x0E-\\x1F\\x7F]/.test(\n textContent,\n );\n const hasReplacementChars = textContent.includes('\\uFFFD');\n\n if (!hasControlChars && !hasReplacementChars) {\n if (\n textContent.trim().startsWith('{') &&\n textContent.trim().endsWith('}')\n ) {\n contentType = 'application/json';\n } else if (\n textContent.includes('<?xml') ||\n textContent.includes('<html')\n ) {\n contentType = 'text/xml';\n } else if (textContent.includes('<!DOCTYPE html')) {\n contentType = 'text/html';\n } else {\n contentType = 'text/plain';\n }\n } else {\n contentType = 'application/octet-stream';\n }\n } catch {\n contentType = 'application/octet-stream';\n }\n }\n\n let encoded: string;\n if (\n contentType?.startsWith('text/') ||\n contentType === 'application/json'\n ) {\n try {\n encoded = contentBuffer.toString('utf8');\n if (\n encoded.includes('\\uFFFD') ||\n /[\\x00-\\x08\\x0B\\x0E-\\x1F\\x7F]/.test(encoded)\n ) {\n encoded = contentBuffer.toString('base64');\n }\n } catch {\n encoded = contentBuffer.toString('base64');\n }\n } else {\n encoded = contentBuffer.toString('base64');\n }\n\n return {\n encoded,\n contentType,\n size,\n };\n }\n static parseFileCreate(\n body: proto.IFileCreateTransactionBody,\n ): FileCreateData | undefined {\n if (!body) return undefined;\n const data: FileCreateData = {};\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.keys) {\n data.keys = parseKey({ keyList: body.keys });\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n if (body.memo) {\n data.memo = body.memo;\n }\n return data;\n }\n\n static parseFileAppend(\n body: proto.IFileAppendTransactionBody,\n ): FileAppendData | undefined {\n if (!body) return undefined;\n const data: FileAppendData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n return data;\n }\n\n static parseFileUpdate(\n body: proto.IFileUpdateTransactionBody,\n ): FileUpdateData | undefined {\n if (!body) return undefined;\n const data: FileUpdateData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.keys) {\n data.keys = parseKey({ keyList: body.keys });\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n if (body.memo?.value !== undefined) {\n data.memo = body.memo.value;\n }\n return data;\n }\n\n static parseFileDelete(\n body: proto.IFileDeleteTransactionBody,\n ): FileDeleteData | undefined {\n if (!body) return undefined;\n const data: FileDeleteData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n return data;\n }\n\n /**\n * Parse File Service transaction from Transaction object\n * This is the unified entry point that delegates to the comprehensive parsing logic\n */\n static parseFromTransactionObject(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n return this.parseFileTransaction(transaction);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es76.js","sources":["../../src/inscribe/quote-cache.ts"],"sourcesContent":["/**\n * Performance optimization utilities for quote generation\n */\n\nimport { InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport { HederaClientConfig, InscriptionOptions, QuoteResult } from './types';\n\ninterface CacheKey {\n inputHash: string;\n clientConfigHash: string;\n optionsHash: string;\n}\n\ninterface CacheEntry {\n quote: QuoteResult;\n timestamp: number;\n ttlMs: number;\n}\n\ninterface SDKCacheEntry {\n sdk: InscriptionSDK;\n timestamp: number;\n config: string;\n}\n\n/**\n * LRU Cache for quote results to improve performance\n */\nclass QuoteCache {\n private cache = new Map<string, CacheEntry>();\n private maxSize = 100;\n private defaultTtlMs = 5 * 60 * 1000; // 5 minutes\n\n /**\n * Generate cache key from input parameters\n */\n private generateKey(key: CacheKey): string {\n return `${key.inputHash}-${key.clientConfigHash}-${key.optionsHash}`;\n }\n\n /**\n * Hash object to string for cache key\n */\n private hashObject(obj: unknown): string {\n return Buffer.from(JSON.stringify(obj)).toString('base64').slice(0, 16);\n }\n\n /**\n * Create cache key from parameters\n */\n createCacheKey(\n input: unknown,\n clientConfig: HederaClientConfig,\n options: InscriptionOptions,\n ): CacheKey {\n return {\n inputHash: this.hashObject(input),\n clientConfigHash: this.hashObject({\n accountId: clientConfig.accountId,\n network: clientConfig.network,\n }),\n optionsHash: this.hashObject({\n mode: options.mode,\n apiKey: options.apiKey ? 'present' : 'absent',\n network: options.network,\n metadata: options.metadata,\n }),\n };\n }\n\n /**\n * Get cached quote if available and not expired\n */\n get(key: CacheKey): QuoteResult | null {\n const cacheKey = this.generateKey(key);\n const entry = this.cache.get(cacheKey);\n\n if (!entry) {\n return null;\n }\n\n const now = Date.now();\n if (now - entry.timestamp > entry.ttlMs) {\n this.cache.delete(cacheKey);\n return null;\n }\n\n this.cache.delete(cacheKey);\n this.cache.set(cacheKey, entry);\n\n return entry.quote;\n }\n\n /**\n * Store quote in cache\n */\n set(\n key: CacheKey,\n quote: QuoteResult,\n ttlMs: number = this.defaultTtlMs,\n ): void {\n const cacheKey = this.generateKey(key);\n\n // Evict oldest entries if cache is full\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(cacheKey, {\n quote,\n timestamp: Date.now(),\n ttlMs,\n });\n }\n\n /**\n * Clear all cached entries\n */\n clear(): void {\n this.cache.clear();\n }\n}\n\n/**\n * SDK instance cache for reuse\n */\nclass SDKCache {\n private cache = new Map<string, SDKCacheEntry>();\n private maxSize = 10;\n private defaultTtlMs = 30 * 60 * 1000; // 30 minutes\n\n /**\n * Generate config key for SDK instance\n */\n private generateConfigKey(config: unknown): string {\n return Buffer.from(JSON.stringify(config)).toString('base64');\n }\n\n /**\n * Get cached SDK instance\n */\n get(config: Record<string, unknown>): InscriptionSDK | null {\n const configKey = this.generateConfigKey(config);\n const entry = this.cache.get(configKey);\n\n if (!entry) {\n return null;\n }\n\n const now = Date.now();\n if (now - entry.timestamp > this.defaultTtlMs) {\n this.cache.delete(configKey);\n return null;\n }\n\n return entry.sdk;\n }\n\n /**\n * Store SDK instance in cache\n */\n set(config: Record<string, unknown>, sdk: InscriptionSDK): void {\n const configKey = this.generateConfigKey(config);\n\n // Evict oldest entries if cache is full\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(configKey, {\n sdk,\n timestamp: Date.now(),\n config: configKey,\n });\n }\n\n /**\n * Clear all cached SDK instances\n */\n clear(): void {\n this.cache.clear();\n }\n}\n\n// Global cache instances\nconst quoteCache = new QuoteCache();\nconst sdkCache = new SDKCache();\n\n/**\n * Get or create SDK instance with caching\n */\nexport async function getOrCreateSDK(\n clientConfig: HederaClientConfig,\n options: InscriptionOptions,\n existingSDK?: InscriptionSDK,\n): Promise<InscriptionSDK> {\n if (existingSDK) {\n return existingSDK;\n }\n\n const cacheConfig = {\n apiKey: options.apiKey,\n accountId: clientConfig.accountId,\n network: clientConfig.network || 'mainnet',\n authType: options.apiKey ? 'api' : 'server',\n };\n\n const cachedSDK = sdkCache.get(cacheConfig);\n if (cachedSDK) {\n return cachedSDK;\n }\n\n let sdk: InscriptionSDK;\n\n if (options.apiKey) {\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: clientConfig.network || 'mainnet',\n });\n } else {\n sdk = await InscriptionSDK.createWithAuth({\n type: 'server',\n accountId: clientConfig.accountId,\n privateKey: clientConfig.privateKey,\n network: clientConfig.network || 'mainnet',\n });\n }\n\n sdkCache.set(cacheConfig, sdk);\n return sdk;\n}\n\n/**\n * Check if quote is cached and return it if valid\n */\nexport function getCachedQuote(\n input: unknown,\n clientConfig: HederaClientConfig,\n options: InscriptionOptions,\n): QuoteResult | null {\n const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);\n return quoteCache.get(cacheKey);\n}\n\n/**\n * Cache a generated quote\n */\nexport function cacheQuote(\n input: unknown,\n clientConfig: HederaClientConfig,\n options: InscriptionOptions,\n quote: QuoteResult,\n): void {\n const cacheKey = quoteCache.createCacheKey(input, clientConfig, options);\n const quoteTtlMs = 10 * 60 * 1000;\n quoteCache.set(cacheKey, quote, quoteTtlMs);\n}\n\n/**\n * Pre-validate parameters for early error detection\n */\nexport function validateQuoteParameters(\n input: unknown,\n clientConfig: HederaClientConfig,\n options: InscriptionOptions,\n): void {\n if (!input || typeof input !== 'object' || !('type' in input)) {\n throw new Error('Invalid inscription input: type is required');\n }\n\n if (!clientConfig || !clientConfig.accountId) {\n throw new Error('Invalid client config: accountId is required');\n }\n\n if (!options) {\n throw new Error('Options are required');\n }\n\n if (options.mode === 'hashinal') {\n if (!options.metadata) {\n throw new Error('Hashinal mode requires metadata');\n }\n\n const requiredFields = ['name', 'creator', 'description', 'type'];\n const missingFields = requiredFields.filter(\n field => !options.metadata || !options.metadata[field],\n );\n\n if (missingFields.length > 0) {\n throw new Error(\n `Missing required Hashinal metadata fields: ${missingFields.join(', ')}`,\n );\n }\n }\n}\n\n/**\n * Clear all caches (useful for testing or memory management)\n */\nexport function clearAllCaches(): void {\n quoteCache.clear();\n sdkCache.clear();\n}\n"],"names":[],"mappings":"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"}
|