@hashgraphonline/standards-sdk 0.0.92 → 0.0.94

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 (235) hide show
  1. package/dist/es/hcs-10/base-client.d.ts +14 -2
  2. package/dist/es/hcs-10/base-client.d.ts.map +1 -1
  3. package/dist/es/hcs-10/registrations.d.ts.map +1 -1
  4. package/dist/es/hcs-10/types.d.ts +1 -6
  5. package/dist/es/hcs-10/types.d.ts.map +1 -1
  6. package/dist/es/standards-sdk.es.js +6 -4
  7. package/dist/es/standards-sdk.es.js.map +1 -1
  8. package/dist/es/standards-sdk.es100.js +32 -13
  9. package/dist/es/standards-sdk.es100.js.map +1 -1
  10. package/dist/es/standards-sdk.es101.js +5 -31
  11. package/dist/es/standards-sdk.es101.js.map +1 -1
  12. package/dist/es/standards-sdk.es102.js +157 -13
  13. package/dist/es/standards-sdk.es102.js.map +1 -1
  14. package/dist/es/standards-sdk.es103.js +22 -3
  15. package/dist/es/standards-sdk.es103.js.map +1 -1
  16. package/dist/es/standards-sdk.es104.js +792 -3
  17. package/dist/es/standards-sdk.es104.js.map +1 -1
  18. package/dist/es/standards-sdk.es105.js +2282 -16
  19. package/dist/es/standards-sdk.es105.js.map +1 -1
  20. package/dist/es/standards-sdk.es106.js +173 -4
  21. package/dist/es/standards-sdk.es106.js.map +1 -1
  22. package/dist/es/standards-sdk.es107.js +143 -39
  23. package/dist/es/standards-sdk.es107.js.map +1 -1
  24. package/dist/es/standards-sdk.es108.js +3 -40
  25. package/dist/es/standards-sdk.es108.js.map +1 -1
  26. package/dist/es/standards-sdk.es109.js +2 -37
  27. package/dist/es/standards-sdk.es109.js.map +1 -1
  28. package/dist/es/standards-sdk.es110.js +2 -78
  29. package/dist/es/standards-sdk.es110.js.map +1 -1
  30. package/dist/es/standards-sdk.es111.js +34 -3
  31. package/dist/es/standards-sdk.es111.js.map +1 -1
  32. package/dist/es/standards-sdk.es112.js +33 -2
  33. package/dist/es/standards-sdk.es112.js.map +1 -1
  34. package/dist/es/standards-sdk.es113.js +9 -2
  35. package/dist/es/standards-sdk.es113.js.map +1 -1
  36. package/dist/es/standards-sdk.es114.js +32 -32
  37. package/dist/es/standards-sdk.es114.js.map +1 -1
  38. package/dist/es/standards-sdk.es115.js +20 -32
  39. package/dist/es/standards-sdk.es115.js.map +1 -1
  40. package/dist/es/standards-sdk.es116.js +27 -9
  41. package/dist/es/standards-sdk.es116.js.map +1 -1
  42. package/dist/es/standards-sdk.es117.js +25 -33
  43. package/dist/es/standards-sdk.es117.js.map +1 -1
  44. package/dist/es/standards-sdk.es118.js +41 -0
  45. package/dist/es/standards-sdk.es118.js.map +1 -0
  46. package/dist/es/standards-sdk.es13.js +5 -5
  47. package/dist/es/standards-sdk.es15.js +1 -1
  48. package/dist/es/standards-sdk.es16.js +1 -1
  49. package/dist/es/standards-sdk.es18.js +134 -384
  50. package/dist/es/standards-sdk.es18.js.map +1 -1
  51. package/dist/es/standards-sdk.es19.js +385 -315
  52. package/dist/es/standards-sdk.es19.js.map +1 -1
  53. package/dist/es/standards-sdk.es20.js +310 -128
  54. package/dist/es/standards-sdk.es20.js.map +1 -1
  55. package/dist/es/standards-sdk.es21.js +155 -7
  56. package/dist/es/standards-sdk.es21.js.map +1 -1
  57. package/dist/es/standards-sdk.es22.js +7 -5
  58. package/dist/es/standards-sdk.es22.js.map +1 -1
  59. package/dist/es/standards-sdk.es23.js +5 -1767
  60. package/dist/es/standards-sdk.es23.js.map +1 -1
  61. package/dist/es/standards-sdk.es24.js +36 -7190
  62. package/dist/es/standards-sdk.es24.js.map +1 -1
  63. package/dist/es/standards-sdk.es25.js +46 -1039
  64. package/dist/es/standards-sdk.es25.js.map +1 -1
  65. package/dist/es/standards-sdk.es26.js +1767 -36
  66. package/dist/es/standards-sdk.es26.js.map +1 -1
  67. package/dist/es/standards-sdk.es27.js +7163 -21
  68. package/dist/es/standards-sdk.es27.js.map +1 -1
  69. package/dist/es/standards-sdk.es28.js +1041 -3
  70. package/dist/es/standards-sdk.es28.js.map +1 -1
  71. package/dist/es/standards-sdk.es29.js +3 -2
  72. package/dist/es/standards-sdk.es29.js.map +1 -1
  73. package/dist/es/standards-sdk.es30.js +2 -4167
  74. package/dist/es/standards-sdk.es30.js.map +1 -1
  75. package/dist/es/standards-sdk.es31.js +4122 -374
  76. package/dist/es/standards-sdk.es31.js.map +1 -1
  77. package/dist/es/standards-sdk.es32.js +419 -2
  78. package/dist/es/standards-sdk.es32.js.map +1 -1
  79. package/dist/es/standards-sdk.es33.js +2 -120
  80. package/dist/es/standards-sdk.es33.js.map +1 -1
  81. package/dist/es/standards-sdk.es34.js +119 -3
  82. package/dist/es/standards-sdk.es34.js.map +1 -1
  83. package/dist/es/standards-sdk.es35.js +1 -7133
  84. package/dist/es/standards-sdk.es35.js.map +1 -1
  85. package/dist/es/standards-sdk.es36.js +364 -2
  86. package/dist/es/standards-sdk.es36.js.map +1 -1
  87. package/dist/es/standards-sdk.es37.js +6 -3
  88. package/dist/es/standards-sdk.es37.js.map +1 -1
  89. package/dist/es/standards-sdk.es38.js +172 -77
  90. package/dist/es/standards-sdk.es38.js.map +1 -1
  91. package/dist/es/standards-sdk.es39.js +80 -22
  92. package/dist/es/standards-sdk.es39.js.map +1 -1
  93. package/dist/es/standards-sdk.es4.js +1 -1
  94. package/dist/es/standards-sdk.es40.js +102 -136
  95. package/dist/es/standards-sdk.es40.js.map +1 -1
  96. package/dist/es/standards-sdk.es41.js +46 -85
  97. package/dist/es/standards-sdk.es41.js.map +1 -1
  98. package/dist/es/standards-sdk.es42.js +10 -364
  99. package/dist/es/standards-sdk.es42.js.map +1 -1
  100. package/dist/es/standards-sdk.es43.js +96 -5
  101. package/dist/es/standards-sdk.es43.js.map +1 -1
  102. package/dist/es/standards-sdk.es44.js +3 -178
  103. package/dist/es/standards-sdk.es44.js.map +1 -1
  104. package/dist/es/standards-sdk.es45.js +2 -81
  105. package/dist/es/standards-sdk.es45.js.map +1 -1
  106. package/dist/es/standards-sdk.es46.js +103 -104
  107. package/dist/es/standards-sdk.es46.js.map +1 -1
  108. package/dist/es/standards-sdk.es47.js +71 -49
  109. package/dist/es/standards-sdk.es47.js.map +1 -1
  110. package/dist/es/standards-sdk.es48.js +5 -9
  111. package/dist/es/standards-sdk.es48.js.map +1 -1
  112. package/dist/es/standards-sdk.es49.js +4 -96
  113. package/dist/es/standards-sdk.es49.js.map +1 -1
  114. package/dist/es/standards-sdk.es5.js +42 -18
  115. package/dist/es/standards-sdk.es5.js.map +1 -1
  116. package/dist/es/standards-sdk.es50.js +220 -3
  117. package/dist/es/standards-sdk.es50.js.map +1 -1
  118. package/dist/es/standards-sdk.es51.js +58 -2
  119. package/dist/es/standards-sdk.es51.js.map +1 -1
  120. package/dist/es/standards-sdk.es52.js +68 -112
  121. package/dist/es/standards-sdk.es52.js.map +1 -1
  122. package/dist/es/standards-sdk.es53.js +7131 -69
  123. package/dist/es/standards-sdk.es53.js.map +1 -1
  124. package/dist/es/standards-sdk.es54.js +3 -6
  125. package/dist/es/standards-sdk.es54.js.map +1 -1
  126. package/dist/es/standards-sdk.es55.js +163 -4
  127. package/dist/es/standards-sdk.es55.js.map +1 -1
  128. package/dist/es/standards-sdk.es56.js +26 -215
  129. package/dist/es/standards-sdk.es56.js.map +1 -1
  130. package/dist/es/standards-sdk.es57.js +60 -55
  131. package/dist/es/standards-sdk.es57.js.map +1 -1
  132. package/dist/es/standards-sdk.es58.js +50 -69
  133. package/dist/es/standards-sdk.es58.js.map +1 -1
  134. package/dist/es/standards-sdk.es59.js +9 -194
  135. package/dist/es/standards-sdk.es59.js.map +1 -1
  136. package/dist/es/standards-sdk.es60.js +58 -431
  137. package/dist/es/standards-sdk.es60.js.map +1 -1
  138. package/dist/es/standards-sdk.es61.js +6 -25
  139. package/dist/es/standards-sdk.es61.js.map +1 -1
  140. package/dist/es/standards-sdk.es62.js +12 -136
  141. package/dist/es/standards-sdk.es62.js.map +1 -1
  142. package/dist/es/standards-sdk.es63.js +7 -18
  143. package/dist/es/standards-sdk.es63.js.map +1 -1
  144. package/dist/es/standards-sdk.es64.js +45 -29
  145. package/dist/es/standards-sdk.es64.js.map +1 -1
  146. package/dist/es/standards-sdk.es65.js +2 -29
  147. package/dist/es/standards-sdk.es65.js.map +1 -1
  148. package/dist/es/standards-sdk.es66.js +136 -21
  149. package/dist/es/standards-sdk.es66.js.map +1 -1
  150. package/dist/es/standards-sdk.es67.js +166 -38
  151. package/dist/es/standards-sdk.es67.js.map +1 -1
  152. package/dist/es/standards-sdk.es68.js +2 -18
  153. package/dist/es/standards-sdk.es68.js.map +1 -1
  154. package/dist/es/standards-sdk.es69.js +95 -55
  155. package/dist/es/standards-sdk.es69.js.map +1 -1
  156. package/dist/es/standards-sdk.es7.js +4 -4
  157. package/dist/es/standards-sdk.es70.js +2 -1289
  158. package/dist/es/standards-sdk.es70.js.map +1 -1
  159. package/dist/es/standards-sdk.es71.js +15 -31
  160. package/dist/es/standards-sdk.es71.js.map +1 -1
  161. package/dist/es/standards-sdk.es72.js +408 -5
  162. package/dist/es/standards-sdk.es72.js.map +1 -1
  163. package/dist/es/standards-sdk.es73.js +13 -159
  164. package/dist/es/standards-sdk.es73.js.map +1 -1
  165. package/dist/es/standards-sdk.es74.js +13 -793
  166. package/dist/es/standards-sdk.es74.js.map +1 -1
  167. package/dist/es/standards-sdk.es75.js +31 -100
  168. package/dist/es/standards-sdk.es75.js.map +1 -1
  169. package/dist/es/standards-sdk.es76.js +15 -2
  170. package/dist/es/standards-sdk.es76.js.map +1 -1
  171. package/dist/es/standards-sdk.es77.js +3 -15
  172. package/dist/es/standards-sdk.es77.js.map +1 -1
  173. package/dist/es/standards-sdk.es78.js +3 -408
  174. package/dist/es/standards-sdk.es78.js.map +1 -1
  175. package/dist/es/standards-sdk.es79.js +14 -172
  176. package/dist/es/standards-sdk.es79.js.map +1 -1
  177. package/dist/es/standards-sdk.es8.js +4 -4
  178. package/dist/es/standards-sdk.es80.js +4 -142
  179. package/dist/es/standards-sdk.es80.js.map +1 -1
  180. package/dist/es/standards-sdk.es81.js +38 -2281
  181. package/dist/es/standards-sdk.es81.js.map +1 -1
  182. package/dist/es/standards-sdk.es82.js +34 -158
  183. package/dist/es/standards-sdk.es82.js.map +1 -1
  184. package/dist/es/standards-sdk.es83.js +35 -30
  185. package/dist/es/standards-sdk.es83.js.map +1 -1
  186. package/dist/es/standards-sdk.es84.js +72 -57
  187. package/dist/es/standards-sdk.es84.js.map +1 -1
  188. package/dist/es/standards-sdk.es85.js +191 -46
  189. package/dist/es/standards-sdk.es85.js.map +1 -1
  190. package/dist/es/standards-sdk.es86.js +436 -8
  191. package/dist/es/standards-sdk.es86.js.map +1 -1
  192. package/dist/es/standards-sdk.es87.js +20 -60
  193. package/dist/es/standards-sdk.es87.js.map +1 -1
  194. package/dist/es/standards-sdk.es88.js +139 -6
  195. package/dist/es/standards-sdk.es88.js.map +1 -1
  196. package/dist/es/standards-sdk.es89.js +17 -14
  197. package/dist/es/standards-sdk.es89.js.map +1 -1
  198. package/dist/es/standards-sdk.es9.js +4 -2
  199. package/dist/es/standards-sdk.es9.js.map +1 -1
  200. package/dist/es/standards-sdk.es90.js +29 -7
  201. package/dist/es/standards-sdk.es90.js.map +1 -1
  202. package/dist/es/standards-sdk.es91.js +28 -44
  203. package/dist/es/standards-sdk.es91.js.map +1 -1
  204. package/dist/es/standards-sdk.es92.js +21 -2
  205. package/dist/es/standards-sdk.es92.js.map +1 -1
  206. package/dist/es/standards-sdk.es93.js +43 -135
  207. package/dist/es/standards-sdk.es93.js.map +1 -1
  208. package/dist/es/standards-sdk.es94.js +14 -168
  209. package/dist/es/standards-sdk.es94.js.map +1 -1
  210. package/dist/es/standards-sdk.es95.js +51 -11
  211. package/dist/es/standards-sdk.es95.js.map +1 -1
  212. package/dist/es/standards-sdk.es96.js +1284 -22
  213. package/dist/es/standards-sdk.es96.js.map +1 -1
  214. package/dist/es/standards-sdk.es97.js +146 -24
  215. package/dist/es/standards-sdk.es97.js.map +1 -1
  216. package/dist/es/standards-sdk.es98.js +90 -37
  217. package/dist/es/standards-sdk.es98.js.map +1 -1
  218. package/dist/es/standards-sdk.es99.js +84 -13
  219. package/dist/es/standards-sdk.es99.js.map +1 -1
  220. package/dist/es/utils/hrl-resolver.d.ts +53 -0
  221. package/dist/es/utils/hrl-resolver.d.ts.map +1 -0
  222. package/dist/es/utils/index.d.ts +1 -0
  223. package/dist/es/utils/index.d.ts.map +1 -1
  224. package/dist/umd/hcs-10/base-client.d.ts +14 -2
  225. package/dist/umd/hcs-10/base-client.d.ts.map +1 -1
  226. package/dist/umd/hcs-10/registrations.d.ts.map +1 -1
  227. package/dist/umd/hcs-10/types.d.ts +1 -6
  228. package/dist/umd/hcs-10/types.d.ts.map +1 -1
  229. package/dist/umd/standards-sdk.umd.js +2 -2
  230. package/dist/umd/standards-sdk.umd.js.map +1 -1
  231. package/dist/umd/utils/hrl-resolver.d.ts +53 -0
  232. package/dist/umd/utils/hrl-resolver.d.ts.map +1 -0
  233. package/dist/umd/utils/index.d.ts +1 -0
  234. package/dist/umd/utils/index.d.ts.map +1 -1
  235. package/package.json +2 -1
@@ -1,410 +1,160 @@
1
- import Buffer from "./standards-sdk.es23.js";
2
- import { I as InscriptionSDK } from "./standards-sdk.es24.js";
1
+ import "./standards-sdk.es24.js";
3
2
  import { Logger } from "./standards-sdk.es15.js";
4
- import { ProgressReporter } from "./standards-sdk.es17.js";
5
- async function inscribe(input, clientConfig, options, existingSDK) {
6
- const logger = Logger.getInstance({
7
- module: "Inscriber",
8
- ...options.logging
9
- });
10
- logger.info("Starting inscription process", {
11
- type: input.type,
12
- mode: options.mode || "file",
13
- ...input.type === "url" ? { url: input.url } : {},
14
- ...input.type === "file" ? { path: input.path } : {},
15
- ...input.type === "buffer" ? { fileName: input.fileName, bufferSize: input.buffer.byteLength } : {}
16
- });
17
- try {
18
- if (options.mode === "hashinal" && options.metadata) {
19
- validateHashinalMetadata(options.metadata, logger);
20
- }
21
- let sdk;
22
- if (existingSDK) {
23
- logger.debug("Using existing InscriptionSDK instance");
24
- sdk = existingSDK;
25
- } else if (options.apiKey) {
26
- logger.debug("Initializing InscriptionSDK with API key");
27
- sdk = new InscriptionSDK({
28
- apiKey: options.apiKey,
29
- network: clientConfig.network || "mainnet"
30
- });
31
- } else {
32
- logger.debug("Initializing InscriptionSDK with server auth");
33
- sdk = await InscriptionSDK.createWithAuth({
34
- type: "server",
35
- accountId: clientConfig.accountId,
36
- privateKey: clientConfig.privateKey,
37
- network: clientConfig.network || "mainnet"
38
- });
39
- }
40
- const baseRequest = {
41
- holderId: clientConfig.accountId,
42
- metadata: options.metadata || {},
43
- tags: options.tags || [],
44
- mode: options.mode || "file",
45
- chunkSize: options.chunkSize
46
- };
47
- let request;
48
- switch (input.type) {
49
- case "url":
50
- request = {
51
- ...baseRequest,
52
- file: {
53
- type: "url",
54
- url: input.url
55
- }
56
- };
57
- break;
58
- case "file":
59
- request = {
60
- ...baseRequest,
61
- file: {
62
- type: "path",
63
- path: input.path
64
- }
65
- };
66
- break;
67
- case "buffer":
68
- request = {
69
- ...baseRequest,
70
- file: {
71
- type: "base64",
72
- base64: Buffer.from(input.buffer).toString("base64"),
73
- fileName: input.fileName,
74
- mimeType: input.mimeType
75
- }
76
- };
77
- break;
78
- }
79
- if (options.mode === "hashinal") {
80
- request.metadataObject = options.metadata;
81
- request.creator = options.metadata?.creator || clientConfig.accountId;
82
- request.description = options.metadata?.description;
83
- if (options.jsonFileURL) {
84
- request.jsonFileURL = options.jsonFileURL;
85
- }
86
- }
87
- logger.debug("Preparing to inscribe content", {
88
- type: input.type,
89
- mode: options.mode || "file",
90
- holderId: clientConfig.accountId
91
- });
92
- const result = await sdk.inscribeAndExecute(request, clientConfig);
93
- logger.info("Starting to inscribe.", {
94
- type: input.type,
95
- mode: options.mode || "file",
96
- transactionId: result.jobId
3
+ import axios from "./standards-sdk.es25.js";
4
+ class HRLResolver {
5
+ constructor(logLevel = "info") {
6
+ this.defaultEndpoint = "https://kiloscribe.com/api/inscription-cdn";
7
+ this.logger = Logger.getInstance({
8
+ level: logLevel,
9
+ module: "HRLResolver"
97
10
  });
98
- if (options.waitForConfirmation) {
99
- logger.debug("Waiting for inscription confirmation", {
100
- transactionId: result.jobId,
101
- maxAttempts: options.waitMaxAttempts,
102
- intervalMs: options.waitIntervalMs
103
- });
104
- const inscription = await waitForInscriptionConfirmation(
105
- sdk,
106
- result.jobId,
107
- options.waitMaxAttempts,
108
- options.waitIntervalMs,
109
- options.progressCallback
110
- );
111
- logger.info("Inscription confirmation received", {
112
- transactionId: result.jobId
113
- });
114
- return {
115
- confirmed: true,
116
- result,
117
- inscription,
118
- sdk
119
- };
11
+ }
12
+ /**
13
+ * Determines if a MIME type represents binary content
14
+ */
15
+ isBinaryContentType(mimeType) {
16
+ const binaryTypes = [
17
+ "image/",
18
+ "audio/",
19
+ "video/",
20
+ "application/octet-stream",
21
+ "application/pdf",
22
+ "application/zip",
23
+ "application/gzip",
24
+ "application/x-binary",
25
+ "application/vnd.ms-",
26
+ "application/x-msdownload",
27
+ "application/x-shockwave-flash",
28
+ "font/",
29
+ "application/wasm"
30
+ ];
31
+ return binaryTypes.some((prefix) => mimeType.startsWith(prefix));
32
+ }
33
+ /**
34
+ * Parses an HRL string into its components
35
+ */
36
+ parseHRL(hrl) {
37
+ if (!hrl) {
38
+ return null;
39
+ }
40
+ const hrlPattern = /^hcs:\/\/(\d+)\/([0-9]+\.[0-9]+\.[0-9]+)$/;
41
+ const match = hrl.match(hrlPattern);
42
+ if (!match) {
43
+ return null;
120
44
  }
121
45
  return {
122
- confirmed: false,
123
- result,
124
- sdk
46
+ standard: match[1],
47
+ topicId: match[2]
125
48
  };
126
- } catch (error) {
127
- logger.error("Error during inscription process", error);
128
- throw error;
129
49
  }
130
- }
131
- async function inscribeWithSigner(input, signer, options, existingSDK) {
132
- const logger = Logger.getInstance({
133
- module: "Inscriber",
134
- ...options.logging
135
- });
136
- logger.info("Starting inscription process with signer", {
137
- type: input.type,
138
- mode: options.mode || "file",
139
- ...input.type === "url" ? { url: input.url } : {},
140
- ...input.type === "file" ? { path: input.path } : {},
141
- ...input.type === "buffer" ? { fileName: input.fileName, bufferSize: input.buffer.byteLength } : {}
142
- });
143
- try {
144
- if (options.mode === "hashinal" && options.metadata) {
145
- validateHashinalMetadata(options.metadata, logger);
50
+ /**
51
+ * Validates if a string is a valid HRL
52
+ */
53
+ isValidHRL(hrl) {
54
+ if (!hrl || typeof hrl !== "string") {
55
+ return false;
146
56
  }
147
- const accountId = signer.getAccountId().toString();
148
- logger.debug("Using account ID from signer", { accountId });
149
- let sdk;
150
- if (existingSDK) {
151
- logger.debug("Using existing InscriptionSDK instance");
152
- sdk = existingSDK;
153
- } else if (options.apiKey) {
154
- logger.debug("Initializing InscriptionSDK with API key");
155
- sdk = new InscriptionSDK({
156
- apiKey: options.apiKey,
157
- network: options.network || "mainnet"
158
- });
159
- } else {
160
- logger.debug("Initializing InscriptionSDK with client auth");
161
- sdk = await InscriptionSDK.createWithAuth({
162
- type: "client",
163
- accountId,
164
- signer,
165
- network: options.network || "mainnet"
166
- });
57
+ const parsed = this.parseHRL(hrl);
58
+ if (!parsed) {
59
+ return false;
167
60
  }
168
- const baseRequest = {
169
- holderId: accountId,
170
- metadata: options.metadata || {},
171
- tags: options.tags || [],
172
- mode: options.mode || "file",
173
- chunkSize: options.chunkSize
174
- };
175
- let request;
176
- switch (input.type) {
177
- case "url":
178
- request = {
179
- ...baseRequest,
180
- file: {
181
- type: "url",
182
- url: input.url
183
- }
184
- };
185
- break;
186
- case "file":
187
- request = {
188
- ...baseRequest,
189
- file: {
190
- type: "path",
191
- path: input.path
192
- }
193
- };
194
- break;
195
- case "buffer":
196
- request = {
197
- ...baseRequest,
198
- file: {
199
- type: "base64",
200
- base64: Buffer.from(input.buffer).toString("base64"),
201
- fileName: input.fileName,
202
- mimeType: input.mimeType
203
- }
204
- };
205
- break;
61
+ const topicIdPattern = /^[0-9]+\.[0-9]+\.[0-9]+$/;
62
+ if (!topicIdPattern.test(parsed.topicId)) {
63
+ return false;
206
64
  }
207
- if (options.mode === "hashinal") {
208
- request.metadataObject = options.metadata;
209
- request.creator = options.metadata?.creator || accountId;
210
- request.description = options.metadata?.description;
211
- if (options.jsonFileURL) {
212
- request.jsonFileURL = options.jsonFileURL;
213
- }
65
+ return true;
66
+ }
67
+ async getContentWithType(hrl, options) {
68
+ if (!this.isValidHRL(hrl)) {
69
+ return {
70
+ content: hrl,
71
+ contentType: "text/plain",
72
+ isBinary: false
73
+ };
214
74
  }
215
- logger.debug("Preparing to inscribe content with signer", {
216
- type: input.type,
217
- mode: options.mode || "file",
218
- holderId: accountId
219
- });
220
- const result = await sdk.inscribe(
221
- {
222
- ...request,
223
- holderId: accountId
224
- },
225
- signer
226
- );
227
- logger.info("Inscription started", {
228
- type: input.type,
229
- mode: options.mode || "file",
230
- transactionId: result.jobId
231
- });
232
- if (options.waitForConfirmation) {
233
- logger.debug("Waiting for inscription confirmation", {
234
- transactionId: result.jobId,
235
- maxAttempts: options.waitMaxAttempts,
236
- intervalMs: options.waitIntervalMs
237
- });
238
- const inscription = await waitForInscriptionConfirmation(
239
- sdk,
240
- result.jobId,
241
- options.waitMaxAttempts,
242
- options.waitIntervalMs,
243
- options.progressCallback
244
- );
245
- logger.info("Inscription confirmation received", {
246
- transactionId: result.jobId
247
- });
75
+ try {
76
+ const result = await this.resolveHRL(hrl, options);
248
77
  return {
249
- confirmed: true,
250
- result,
251
- inscription,
252
- sdk
78
+ content: result.content,
79
+ contentType: result.contentType,
80
+ isBinary: result.isBinary
253
81
  };
82
+ } catch (e) {
83
+ const error = e;
84
+ const logMessage = `Error resolving HRL for content and type: ${error.message}`;
85
+ this.logger.error(logMessage);
86
+ throw new Error(logMessage);
254
87
  }
255
- return {
256
- confirmed: false,
257
- result,
258
- sdk
259
- };
260
- } catch (error) {
261
- logger.error("Error during inscription process", error);
262
- throw error;
263
88
  }
264
- }
265
- async function retrieveInscription(transactionId, options) {
266
- const logger = Logger.getInstance({
267
- module: "Inscriber",
268
- ...options?.logging || {}
269
- });
270
- const formattedTransactionId = transactionId.includes("@") ? `${transactionId.split("@")[0]}-${transactionId.split("@")[1].replace(/\./g, "-")}` : transactionId;
271
- logger.info("Retrieving inscription", {
272
- originalTransactionId: transactionId,
273
- formattedTransactionId
274
- });
275
- try {
276
- let sdk;
277
- if (options?.apiKey) {
278
- logger.debug("Initializing InscriptionSDK with API key");
279
- sdk = new InscriptionSDK({
280
- apiKey: options.apiKey,
281
- network: options.network || "mainnet"
282
- });
283
- } else if (options?.accountId && options?.privateKey) {
284
- logger.debug("Initializing InscriptionSDK with server auth");
285
- sdk = await InscriptionSDK.createWithAuth({
286
- type: "server",
287
- accountId: options.accountId,
288
- privateKey: options.privateKey,
289
- network: options.network || "mainnet"
290
- });
291
- } else {
292
- const error = new Error(
293
- "Either API key or account ID and private key are required for retrieving inscriptions"
294
- );
295
- logger.error("Missing authentication credentials", {
296
- hasApiKey: Boolean(options?.apiKey),
297
- hasAccountId: Boolean(options?.accountId),
298
- hasPrivateKey: Boolean(options?.privateKey)
299
- });
300
- throw error;
89
+ /**
90
+ * Resolves HRL content with proper content type detection
91
+ */
92
+ async resolveHRL(hrl, options) {
93
+ const parsed = this.parseHRL(hrl);
94
+ if (!parsed) {
95
+ throw new Error(`Invalid HRL format: ${hrl}`);
301
96
  }
302
- logger.debug("Initialized SDK for inscription retrieval", {
303
- formattedTransactionId,
304
- network: options.network || "mainnet"
305
- });
306
- const result = await sdk.retrieveInscription(formattedTransactionId);
307
- logger.info("Successfully retrieved inscription", {
308
- formattedTransactionId
309
- });
310
- return result;
311
- } catch (error) {
312
- logger.error("Error retrieving inscription", {
313
- formattedTransactionId,
314
- error
315
- });
316
- throw error;
317
- }
318
- }
319
- function validateHashinalMetadata(metadata, logger) {
320
- const requiredFields = ["name", "creator", "description", "type"];
321
- const missingFields = requiredFields.filter((field) => !metadata[field]);
322
- if (missingFields.length > 0) {
323
- const error = new Error(
324
- `Missing required Hashinal metadata fields: ${missingFields.join(", ")}`
97
+ const { standard, topicId } = parsed;
98
+ this.logger.debug(
99
+ `Resolving HRL reference: standard=${standard}, topicId=${topicId}`
325
100
  );
326
- logger.error("Hashinal metadata validation failed", { missingFields });
327
- throw error;
328
- }
329
- logger.debug("Hashinal metadata validation passed", {
330
- name: metadata.name,
331
- creator: metadata.creator,
332
- description: metadata.description,
333
- type: metadata.type,
334
- hasAttributes: !!metadata.attributes,
335
- hasProperties: !!metadata.properties
336
- });
337
- }
338
- async function waitForInscriptionConfirmation(sdk, transactionId, maxAttempts = 30, intervalMs = 4e3, progressCallback) {
339
- const logger = Logger.getInstance({ module: "Inscriber" });
340
- const progressReporter = new ProgressReporter({
341
- module: "Inscriber",
342
- logger,
343
- callback: progressCallback
344
- });
345
- try {
346
- logger.debug("Waiting for inscription confirmation", {
347
- transactionId,
348
- maxAttempts,
349
- intervalMs
350
- });
351
- progressReporter.preparing("Preparing for inscription confirmation", 5, {
352
- transactionId,
353
- maxAttempts,
354
- intervalMs
355
- });
356
101
  try {
357
- const waitMethod = sdk.waitForInscription.bind(sdk);
358
- const wrappedCallback = (data) => {
359
- const stage = data.stage || "confirming";
360
- const message = data.message || "Processing inscription";
361
- const percent = data.progressPercent || 50;
362
- progressReporter.report({
363
- stage,
364
- message,
365
- progressPercent: percent,
366
- details: {}
102
+ const cdnEndpoint = options.cdnEndpoint || this.defaultEndpoint;
103
+ const cdnUrl = `${cdnEndpoint}/${topicId}?network=${options.network}`;
104
+ this.logger.debug(`Fetching content from CDN: ${cdnUrl}`);
105
+ const headResponse = await axios.head(cdnUrl);
106
+ const contentType = headResponse.headers["content-type"] || "";
107
+ const isBinary = this.isBinaryContentType(contentType);
108
+ if (isBinary || options.returnRaw) {
109
+ const response2 = await axios.get(cdnUrl, {
110
+ responseType: "arraybuffer"
111
+ });
112
+ return {
113
+ content: response2.data,
114
+ contentType,
115
+ topicId,
116
+ isBinary: true
117
+ };
118
+ }
119
+ if (contentType === "application/json") {
120
+ const response2 = await axios.get(cdnUrl, {
121
+ responseType: "json"
367
122
  });
123
+ if (!response2.data) {
124
+ throw new Error(`Failed to fetch content from topic: ${topicId}`);
125
+ }
126
+ return {
127
+ content: response2.data,
128
+ contentType,
129
+ topicId,
130
+ isBinary: false
131
+ };
132
+ }
133
+ const response = await axios.get(cdnUrl);
134
+ if (!response.data) {
135
+ throw new Error(`Failed to fetch content from topic: ${topicId}`);
136
+ }
137
+ let content;
138
+ if (typeof response.data === "object") {
139
+ content = response.data.content || response.data.text || JSON.stringify(response.data);
140
+ } else {
141
+ content = response.data;
142
+ }
143
+ return {
144
+ content,
145
+ contentType,
146
+ topicId,
147
+ isBinary: false
368
148
  };
369
- return await waitMethod(
370
- transactionId,
371
- maxAttempts,
372
- intervalMs,
373
- true,
374
- wrappedCallback
375
- );
376
149
  } catch (e) {
377
- console.log(e);
378
- logger.debug("Falling back to standard waitForInscription method", {
379
- error: e
380
- });
381
- progressReporter.verifying("Verifying inscription status", 50, {
382
- error: e
383
- });
384
- return await sdk.waitForInscription(
385
- transactionId,
386
- maxAttempts,
387
- intervalMs,
388
- true
389
- );
150
+ const error = e;
151
+ const logMessage = `Error resolving HRL reference: ${error.message}`;
152
+ this.logger.error(logMessage);
153
+ throw new Error(logMessage);
390
154
  }
391
- } catch (error) {
392
- logger.error("Error waiting for inscription confirmation", {
393
- transactionId,
394
- maxAttempts,
395
- intervalMs,
396
- error
397
- });
398
- progressReporter.failed("Inscription confirmation failed", {
399
- transactionId,
400
- error
401
- });
402
- throw error;
403
155
  }
404
156
  }
405
157
  export {
406
- inscribe,
407
- inscribeWithSigner,
408
- retrieveInscription
158
+ HRLResolver
409
159
  };
410
160
  //# sourceMappingURL=standards-sdk.es18.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es18.js","sources":["../../src/inscribe/inscriber.ts"],"sourcesContent":["import { InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport {\n InscriptionOptions,\n InscriptionResult,\n RetrievedInscriptionResult,\n HederaClientConfig,\n} from './types';\nimport type { DAppSigner } from '@hashgraph/hedera-wallet-connect';\nimport { Logger } from '../utils/logger';\nimport { ProgressCallback, ProgressReporter } from '../utils/progress-reporter';\n\nexport type InscriptionInput =\n | { type: 'url'; url: string }\n | { type: 'file'; path: string }\n | {\n type: 'buffer';\n buffer: ArrayBuffer | Buffer;\n fileName: string;\n mimeType?: string;\n };\n\nexport type InscriptionResponse =\n | { confirmed: false; result: InscriptionResult; sdk: InscriptionSDK }\n | {\n confirmed: true;\n result: InscriptionResult;\n inscription: RetrievedInscriptionResult;\n sdk: InscriptionSDK;\n };\n\nexport async function inscribe(\n input: InscriptionInput,\n clientConfig: HederaClientConfig,\n options: InscriptionOptions,\n existingSDK?: InscriptionSDK\n): Promise<InscriptionResponse> {\n const logger = Logger.getInstance({\n module: 'Inscriber',\n ...options.logging,\n });\n\n logger.info('Starting inscription process', {\n type: input.type,\n mode: options.mode || 'file',\n ...(input.type === 'url' ? { url: input.url } : {}),\n ...(input.type === 'file' ? { path: input.path } : {}),\n ...(input.type === 'buffer'\n ? { fileName: input.fileName, bufferSize: input.buffer.byteLength }\n : {}),\n });\n\n try {\n if (options.mode === 'hashinal' && options.metadata) {\n validateHashinalMetadata(options.metadata, logger);\n }\n\n let sdk: InscriptionSDK;\n\n if (existingSDK) {\n logger.debug('Using existing InscriptionSDK instance');\n sdk = existingSDK;\n } else if (options.apiKey) {\n logger.debug('Initializing InscriptionSDK with API key');\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: clientConfig.network || 'mainnet',\n });\n } else {\n logger.debug('Initializing InscriptionSDK with server auth');\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 const baseRequest = {\n holderId: clientConfig.accountId,\n metadata: options.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n chunkSize: options.chunkSize,\n };\n\n let request: any;\n switch (input.type) {\n case 'url':\n request = {\n ...baseRequest,\n file: {\n type: 'url',\n url: input.url,\n },\n };\n break;\n\n case 'file':\n request = {\n ...baseRequest,\n file: {\n type: 'path',\n path: input.path,\n },\n };\n break;\n\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(input.buffer).toString('base64'),\n fileName: input.fileName,\n mimeType: input.mimeType,\n },\n };\n break;\n }\n\n if (options.mode === 'hashinal') {\n request.metadataObject = options.metadata;\n request.creator = options.metadata?.creator || clientConfig.accountId;\n request.description = options.metadata?.description;\n\n if (options.jsonFileURL) {\n request.jsonFileURL = options.jsonFileURL;\n }\n }\n\n logger.debug('Preparing to inscribe content', {\n type: input.type,\n mode: options.mode || 'file',\n holderId: clientConfig.accountId,\n });\n\n const result = await sdk.inscribeAndExecute(request, clientConfig);\n logger.info('Starting to inscribe.', {\n type: input.type,\n mode: options.mode || 'file',\n transactionId: result.jobId,\n });\n\n if (options.waitForConfirmation) {\n logger.debug('Waiting for inscription confirmation', {\n transactionId: result.jobId,\n maxAttempts: options.waitMaxAttempts,\n intervalMs: options.waitIntervalMs,\n });\n\n const inscription = await waitForInscriptionConfirmation(\n sdk,\n result.jobId,\n options.waitMaxAttempts,\n options.waitIntervalMs,\n options.progressCallback\n );\n\n logger.info('Inscription confirmation received', {\n transactionId: result.jobId,\n });\n\n return {\n confirmed: true,\n result,\n inscription,\n sdk,\n };\n }\n\n return {\n confirmed: false,\n result,\n sdk,\n };\n } catch (error) {\n logger.error('Error during inscription process', error);\n throw error;\n }\n}\n\nexport async function inscribeWithSigner(\n input: InscriptionInput,\n signer: DAppSigner,\n options: InscriptionOptions,\n existingSDK?: InscriptionSDK\n): Promise<InscriptionResponse> {\n const logger = Logger.getInstance({\n module: 'Inscriber',\n ...options.logging,\n });\n\n logger.info('Starting inscription process with signer', {\n type: input.type,\n mode: options.mode || 'file',\n ...(input.type === 'url' ? { url: input.url } : {}),\n ...(input.type === 'file' ? { path: input.path } : {}),\n ...(input.type === 'buffer'\n ? { fileName: input.fileName, bufferSize: input.buffer.byteLength }\n : {}),\n });\n\n try {\n if (options.mode === 'hashinal' && options.metadata) {\n validateHashinalMetadata(options.metadata, logger);\n }\n\n const accountId = signer.getAccountId().toString();\n logger.debug('Using account ID from signer', { accountId });\n\n let sdk: InscriptionSDK;\n\n if (existingSDK) {\n logger.debug('Using existing InscriptionSDK instance');\n sdk = existingSDK;\n } else if (options.apiKey) {\n logger.debug('Initializing InscriptionSDK with API key');\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: options.network || 'mainnet',\n });\n } else {\n logger.debug('Initializing InscriptionSDK with client auth');\n sdk = await InscriptionSDK.createWithAuth({\n type: 'client',\n accountId,\n signer: signer,\n network: options.network || 'mainnet',\n });\n }\n\n const baseRequest = {\n holderId: accountId,\n metadata: options.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n chunkSize: options.chunkSize,\n };\n\n let request: any;\n switch (input.type) {\n case 'url':\n request = {\n ...baseRequest,\n file: {\n type: 'url',\n url: input.url,\n },\n };\n break;\n\n case 'file':\n request = {\n ...baseRequest,\n file: {\n type: 'path',\n path: input.path,\n },\n };\n break;\n\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(input.buffer).toString('base64'),\n fileName: input.fileName,\n mimeType: input.mimeType,\n },\n };\n break;\n }\n\n if (options.mode === 'hashinal') {\n request.metadataObject = options.metadata;\n request.creator = options.metadata?.creator || accountId;\n request.description = options.metadata?.description;\n\n if (options.jsonFileURL) {\n request.jsonFileURL = options.jsonFileURL;\n }\n }\n\n logger.debug('Preparing to inscribe content with signer', {\n type: input.type,\n mode: options.mode || 'file',\n holderId: accountId,\n });\n\n const result = await sdk.inscribe(\n {\n ...request,\n holderId: accountId,\n },\n signer\n );\n logger.info('Inscription started', {\n type: input.type,\n mode: options.mode || 'file',\n transactionId: result.jobId,\n });\n\n if (options.waitForConfirmation) {\n logger.debug('Waiting for inscription confirmation', {\n transactionId: result.jobId,\n maxAttempts: options.waitMaxAttempts,\n intervalMs: options.waitIntervalMs,\n });\n\n const inscription = await waitForInscriptionConfirmation(\n sdk,\n result.jobId,\n options.waitMaxAttempts,\n options.waitIntervalMs,\n options.progressCallback\n );\n\n logger.info('Inscription confirmation received', {\n transactionId: result.jobId,\n });\n\n return {\n confirmed: true,\n result,\n inscription,\n sdk,\n };\n }\n\n return {\n confirmed: false,\n result,\n sdk,\n };\n } catch (error) {\n logger.error('Error during inscription process', error);\n throw error;\n }\n}\n\nexport async function retrieveInscription(\n transactionId: string,\n options: InscriptionOptions & { accountId?: string; privateKey?: string }\n): Promise<RetrievedInscriptionResult> {\n const logger = Logger.getInstance({\n module: 'Inscriber',\n ...options?.logging || {},\n });\n\n const formattedTransactionId = transactionId.includes('@')\n ? `${transactionId.split('@')[0]}-${transactionId\n .split('@')[1]\n .replace(/\\./g, '-')}`\n : transactionId;\n\n logger.info('Retrieving inscription', {\n originalTransactionId: transactionId,\n formattedTransactionId,\n });\n\n try {\n let sdk: InscriptionSDK;\n\n if (options?.apiKey) {\n logger.debug('Initializing InscriptionSDK with API key');\n sdk = new InscriptionSDK({\n apiKey: options.apiKey,\n network: options.network || 'mainnet',\n });\n } else if (options?.accountId && options?.privateKey) {\n logger.debug('Initializing InscriptionSDK with server auth');\n sdk = await InscriptionSDK.createWithAuth({\n type: 'server',\n accountId: options.accountId,\n privateKey: options.privateKey,\n network: options.network || 'mainnet',\n });\n } else {\n const error = new Error(\n 'Either API key or account ID and private key are required for retrieving inscriptions'\n );\n logger.error('Missing authentication credentials', {\n hasApiKey: Boolean(options?.apiKey),\n hasAccountId: Boolean(options?.accountId),\n hasPrivateKey: Boolean(options?.privateKey),\n });\n throw error;\n }\n\n logger.debug('Initialized SDK for inscription retrieval', {\n formattedTransactionId,\n network: options.network || 'mainnet',\n });\n\n const result = await sdk.retrieveInscription(formattedTransactionId);\n logger.info('Successfully retrieved inscription', {\n formattedTransactionId,\n });\n\n return result;\n } catch (error) {\n logger.error('Error retrieving inscription', {\n formattedTransactionId,\n error,\n });\n throw error;\n }\n}\n\nfunction validateHashinalMetadata(metadata: any, logger: any): void {\n const requiredFields = ['name', 'creator', 'description', 'type'];\n const missingFields = requiredFields.filter((field) => !metadata[field]);\n\n if (missingFields.length > 0) {\n const error = new Error(\n `Missing required Hashinal metadata fields: ${missingFields.join(', ')}`\n );\n logger.error('Hashinal metadata validation failed', { missingFields });\n throw error;\n }\n\n logger.debug('Hashinal metadata validation passed', {\n name: metadata.name,\n creator: metadata.creator,\n description: metadata.description,\n type: metadata.type,\n hasAttributes: !!metadata.attributes,\n hasProperties: !!metadata.properties,\n });\n}\n\nasync function waitForInscriptionConfirmation(\n sdk: InscriptionSDK,\n transactionId: string,\n maxAttempts: number = 30,\n intervalMs: number = 4000,\n progressCallback?: ProgressCallback\n): Promise<RetrievedInscriptionResult> {\n const logger = Logger.getInstance({ module: 'Inscriber' });\n const progressReporter = new ProgressReporter({\n module: 'Inscriber',\n logger,\n callback: progressCallback,\n });\n\n try {\n logger.debug('Waiting for inscription confirmation', {\n transactionId,\n maxAttempts,\n intervalMs,\n });\n\n progressReporter.preparing('Preparing for inscription confirmation', 5, {\n transactionId,\n maxAttempts,\n intervalMs,\n });\n\n try {\n const waitMethod = sdk.waitForInscription.bind(sdk) as (\n txId: string,\n maxAttempts: number,\n intervalMs: number,\n checkCompletion: boolean,\n progressCallback?: Function\n ) => Promise<RetrievedInscriptionResult>;\n\n const wrappedCallback = (data: any) => {\n const stage = data.stage || 'confirming';\n const message = data.message || 'Processing inscription';\n const percent = data.progressPercent || 50;\n\n progressReporter.report({\n stage: stage,\n message: message,\n progressPercent: percent,\n details: {},\n });\n };\n\n return await waitMethod(\n transactionId,\n maxAttempts,\n intervalMs,\n true,\n wrappedCallback\n );\n } catch (e) {\n console.log(e);\n // Fall back to standard method if progress callback fails\n logger.debug('Falling back to standard waitForInscription method', {\n error: e,\n });\n progressReporter.verifying('Verifying inscription status', 50, {\n error: e,\n });\n\n return await sdk.waitForInscription(\n transactionId,\n maxAttempts,\n intervalMs,\n true\n );\n }\n } catch (error) {\n logger.error('Error waiting for inscription confirmation', {\n transactionId,\n maxAttempts,\n intervalMs,\n error,\n });\n\n progressReporter.failed('Inscription confirmation failed', {\n transactionId,\n error,\n });\n\n throw error;\n }\n}\n"],"names":[],"mappings":";;;;AA8BA,eAAsB,SACpB,OACA,cACA,SACA,aAC8B;AACxB,QAAA,SAAS,OAAO,YAAY;AAAA,IAChC,QAAQ;AAAA,IACR,GAAG,QAAQ;AAAA,EAAA,CACZ;AAED,SAAO,KAAK,gCAAgC;AAAA,IAC1C,MAAM,MAAM;AAAA,IACZ,MAAM,QAAQ,QAAQ;AAAA,IACtB,GAAI,MAAM,SAAS,QAAQ,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,IACjD,GAAI,MAAM,SAAS,SAAS,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,IACpD,GAAI,MAAM,SAAS,WACf,EAAE,UAAU,MAAM,UAAU,YAAY,MAAM,OAAO,WAAA,IACrD,CAAA;AAAA,EAAC,CACN;AAEG,MAAA;AACF,QAAI,QAAQ,SAAS,cAAc,QAAQ,UAAU;AAC1B,+BAAA,QAAQ,UAAU,MAAM;AAAA,IAAA;AAG/C,QAAA;AAEJ,QAAI,aAAa;AACf,aAAO,MAAM,wCAAwC;AAC/C,YAAA;AAAA,IAAA,WACG,QAAQ,QAAQ;AACzB,aAAO,MAAM,0CAA0C;AACvD,YAAM,IAAI,eAAe;AAAA,QACvB,QAAQ,QAAQ;AAAA,QAChB,SAAS,aAAa,WAAW;AAAA,MAAA,CAClC;AAAA,IAAA,OACI;AACL,aAAO,MAAM,8CAA8C;AACrD,YAAA,MAAM,eAAe,eAAe;AAAA,QACxC,MAAM;AAAA,QACN,WAAW,aAAa;AAAA,QACxB,YAAY,aAAa;AAAA,QACzB,SAAS,aAAa,WAAW;AAAA,MAAA,CAClC;AAAA,IAAA;AAGH,UAAM,cAAc;AAAA,MAClB,UAAU,aAAa;AAAA,MACvB,UAAU,QAAQ,YAAY,CAAC;AAAA,MAC/B,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACvB,MAAM,QAAQ,QAAQ;AAAA,MACtB,WAAW,QAAQ;AAAA,IACrB;AAEI,QAAA;AACJ,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACO,kBAAA;AAAA,UACR,GAAG;AAAA,UACH,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,KAAK,MAAM;AAAA,UAAA;AAAA,QAEf;AACA;AAAA,MAEF,KAAK;AACO,kBAAA;AAAA,UACR,GAAG;AAAA,UACH,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,UAAA;AAAA,QAEhB;AACA;AAAA,MAEF,KAAK;AACO,kBAAA;AAAA,UACR,GAAG;AAAA,UACH,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,OAAO,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ;AAAA,YACnD,UAAU,MAAM;AAAA,YAChB,UAAU,MAAM;AAAA,UAAA;AAAA,QAEpB;AACA;AAAA,IAAA;AAGA,QAAA,QAAQ,SAAS,YAAY;AAC/B,cAAQ,iBAAiB,QAAQ;AACjC,cAAQ,UAAU,QAAQ,UAAU,WAAW,aAAa;AACpD,cAAA,cAAc,QAAQ,UAAU;AAExC,UAAI,QAAQ,aAAa;AACvB,gBAAQ,cAAc,QAAQ;AAAA,MAAA;AAAA,IAChC;AAGF,WAAO,MAAM,iCAAiC;AAAA,MAC5C,MAAM,MAAM;AAAA,MACZ,MAAM,QAAQ,QAAQ;AAAA,MACtB,UAAU,aAAa;AAAA,IAAA,CACxB;AAED,UAAM,SAAS,MAAM,IAAI,mBAAmB,SAAS,YAAY;AACjE,WAAO,KAAK,yBAAyB;AAAA,MACnC,MAAM,MAAM;AAAA,MACZ,MAAM,QAAQ,QAAQ;AAAA,MACtB,eAAe,OAAO;AAAA,IAAA,CACvB;AAED,QAAI,QAAQ,qBAAqB;AAC/B,aAAO,MAAM,wCAAwC;AAAA,QACnD,eAAe,OAAO;AAAA,QACtB,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ;AAAA,MAAA,CACrB;AAED,YAAM,cAAc,MAAM;AAAA,QACxB;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAEA,aAAO,KAAK,qCAAqC;AAAA,QAC/C,eAAe,OAAO;AAAA,MAAA,CACvB;AAEM,aAAA;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IAAA;AAGK,WAAA;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAAA,WACO,OAAO;AACP,WAAA,MAAM,oCAAoC,KAAK;AAChD,UAAA;AAAA,EAAA;AAEV;AAEA,eAAsB,mBACpB,OACA,QACA,SACA,aAC8B;AACxB,QAAA,SAAS,OAAO,YAAY;AAAA,IAChC,QAAQ;AAAA,IACR,GAAG,QAAQ;AAAA,EAAA,CACZ;AAED,SAAO,KAAK,4CAA4C;AAAA,IACtD,MAAM,MAAM;AAAA,IACZ,MAAM,QAAQ,QAAQ;AAAA,IACtB,GAAI,MAAM,SAAS,QAAQ,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,IACjD,GAAI,MAAM,SAAS,SAAS,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,IACpD,GAAI,MAAM,SAAS,WACf,EAAE,UAAU,MAAM,UAAU,YAAY,MAAM,OAAO,WAAA,IACrD,CAAA;AAAA,EAAC,CACN;AAEG,MAAA;AACF,QAAI,QAAQ,SAAS,cAAc,QAAQ,UAAU;AAC1B,+BAAA,QAAQ,UAAU,MAAM;AAAA,IAAA;AAGnD,UAAM,YAAY,OAAO,aAAa,EAAE,SAAS;AACjD,WAAO,MAAM,gCAAgC,EAAE,UAAA,CAAW;AAEtD,QAAA;AAEJ,QAAI,aAAa;AACf,aAAO,MAAM,wCAAwC;AAC/C,YAAA;AAAA,IAAA,WACG,QAAQ,QAAQ;AACzB,aAAO,MAAM,0CAA0C;AACvD,YAAM,IAAI,eAAe;AAAA,QACvB,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ,WAAW;AAAA,MAAA,CAC7B;AAAA,IAAA,OACI;AACL,aAAO,MAAM,8CAA8C;AACrD,YAAA,MAAM,eAAe,eAAe;AAAA,QACxC,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,SAAS,QAAQ,WAAW;AAAA,MAAA,CAC7B;AAAA,IAAA;AAGH,UAAM,cAAc;AAAA,MAClB,UAAU;AAAA,MACV,UAAU,QAAQ,YAAY,CAAC;AAAA,MAC/B,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACvB,MAAM,QAAQ,QAAQ;AAAA,MACtB,WAAW,QAAQ;AAAA,IACrB;AAEI,QAAA;AACJ,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACO,kBAAA;AAAA,UACR,GAAG;AAAA,UACH,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,KAAK,MAAM;AAAA,UAAA;AAAA,QAEf;AACA;AAAA,MAEF,KAAK;AACO,kBAAA;AAAA,UACR,GAAG;AAAA,UACH,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,UAAA;AAAA,QAEhB;AACA;AAAA,MAEF,KAAK;AACO,kBAAA;AAAA,UACR,GAAG;AAAA,UACH,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,QAAQ,OAAO,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ;AAAA,YACnD,UAAU,MAAM;AAAA,YAChB,UAAU,MAAM;AAAA,UAAA;AAAA,QAEpB;AACA;AAAA,IAAA;AAGA,QAAA,QAAQ,SAAS,YAAY;AAC/B,cAAQ,iBAAiB,QAAQ;AACzB,cAAA,UAAU,QAAQ,UAAU,WAAW;AACvC,cAAA,cAAc,QAAQ,UAAU;AAExC,UAAI,QAAQ,aAAa;AACvB,gBAAQ,cAAc,QAAQ;AAAA,MAAA;AAAA,IAChC;AAGF,WAAO,MAAM,6CAA6C;AAAA,MACxD,MAAM,MAAM;AAAA,MACZ,MAAM,QAAQ,QAAQ;AAAA,MACtB,UAAU;AAAA,IAAA,CACX;AAEK,UAAA,SAAS,MAAM,IAAI;AAAA,MACvB;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AACA,WAAO,KAAK,uBAAuB;AAAA,MACjC,MAAM,MAAM;AAAA,MACZ,MAAM,QAAQ,QAAQ;AAAA,MACtB,eAAe,OAAO;AAAA,IAAA,CACvB;AAED,QAAI,QAAQ,qBAAqB;AAC/B,aAAO,MAAM,wCAAwC;AAAA,QACnD,eAAe,OAAO;AAAA,QACtB,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ;AAAA,MAAA,CACrB;AAED,YAAM,cAAc,MAAM;AAAA,QACxB;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAEA,aAAO,KAAK,qCAAqC;AAAA,QAC/C,eAAe,OAAO;AAAA,MAAA,CACvB;AAEM,aAAA;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IAAA;AAGK,WAAA;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAAA,WACO,OAAO;AACP,WAAA,MAAM,oCAAoC,KAAK;AAChD,UAAA;AAAA,EAAA;AAEV;AAEsB,eAAA,oBACpB,eACA,SACqC;AAC/B,QAAA,SAAS,OAAO,YAAY;AAAA,IAChC,QAAQ;AAAA,IACR,GAAG,SAAS,WAAW,CAAA;AAAA,EAAC,CACzB;AAEK,QAAA,yBAAyB,cAAc,SAAS,GAAG,IACrD,GAAG,cAAc,MAAM,GAAG,EAAE,CAAC,CAAC,IAAI,cAC/B,MAAM,GAAG,EAAE,CAAC,EACZ,QAAQ,OAAO,GAAG,CAAC,KACtB;AAEJ,SAAO,KAAK,0BAA0B;AAAA,IACpC,uBAAuB;AAAA,IACvB;AAAA,EAAA,CACD;AAEG,MAAA;AACE,QAAA;AAEJ,QAAI,SAAS,QAAQ;AACnB,aAAO,MAAM,0CAA0C;AACvD,YAAM,IAAI,eAAe;AAAA,QACvB,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ,WAAW;AAAA,MAAA,CAC7B;AAAA,IACQ,WAAA,SAAS,aAAa,SAAS,YAAY;AACpD,aAAO,MAAM,8CAA8C;AACrD,YAAA,MAAM,eAAe,eAAe;AAAA,QACxC,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,YAAY,QAAQ;AAAA,QACpB,SAAS,QAAQ,WAAW;AAAA,MAAA,CAC7B;AAAA,IAAA,OACI;AACL,YAAM,QAAQ,IAAI;AAAA,QAChB;AAAA,MACF;AACA,aAAO,MAAM,sCAAsC;AAAA,QACjD,WAAW,QAAQ,SAAS,MAAM;AAAA,QAClC,cAAc,QAAQ,SAAS,SAAS;AAAA,QACxC,eAAe,QAAQ,SAAS,UAAU;AAAA,MAAA,CAC3C;AACK,YAAA;AAAA,IAAA;AAGR,WAAO,MAAM,6CAA6C;AAAA,MACxD;AAAA,MACA,SAAS,QAAQ,WAAW;AAAA,IAAA,CAC7B;AAED,UAAM,SAAS,MAAM,IAAI,oBAAoB,sBAAsB;AACnE,WAAO,KAAK,sCAAsC;AAAA,MAChD;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,WACA,OAAO;AACd,WAAO,MAAM,gCAAgC;AAAA,MAC3C;AAAA,MACA;AAAA,IAAA,CACD;AACK,UAAA;AAAA,EAAA;AAEV;AAEA,SAAS,yBAAyB,UAAe,QAAmB;AAClE,QAAM,iBAAiB,CAAC,QAAQ,WAAW,eAAe,MAAM;AAC1D,QAAA,gBAAgB,eAAe,OAAO,CAAC,UAAU,CAAC,SAAS,KAAK,CAAC;AAEnE,MAAA,cAAc,SAAS,GAAG;AAC5B,UAAM,QAAQ,IAAI;AAAA,MAChB,8CAA8C,cAAc,KAAK,IAAI,CAAC;AAAA,IACxE;AACA,WAAO,MAAM,uCAAuC,EAAE,cAAA,CAAe;AAC/D,UAAA;AAAA,EAAA;AAGR,SAAO,MAAM,uCAAuC;AAAA,IAClD,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,IACf,eAAe,CAAC,CAAC,SAAS;AAAA,IAC1B,eAAe,CAAC,CAAC,SAAS;AAAA,EAAA,CAC3B;AACH;AAEA,eAAe,+BACb,KACA,eACA,cAAsB,IACtB,aAAqB,KACrB,kBACqC;AACrC,QAAM,SAAS,OAAO,YAAY,EAAE,QAAQ,aAAa;AACnD,QAAA,mBAAmB,IAAI,iBAAiB;AAAA,IAC5C,QAAQ;AAAA,IACR;AAAA,IACA,UAAU;AAAA,EAAA,CACX;AAEG,MAAA;AACF,WAAO,MAAM,wCAAwC;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAEgB,qBAAA,UAAU,0CAA0C,GAAG;AAAA,MACtE;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAEG,QAAA;AACF,YAAM,aAAa,IAAI,mBAAmB,KAAK,GAAG;AAQ5C,YAAA,kBAAkB,CAAC,SAAc;AAC/B,cAAA,QAAQ,KAAK,SAAS;AACtB,cAAA,UAAU,KAAK,WAAW;AAC1B,cAAA,UAAU,KAAK,mBAAmB;AAExC,yBAAiB,OAAO;AAAA,UACtB;AAAA,UACA;AAAA,UACA,iBAAiB;AAAA,UACjB,SAAS,CAAA;AAAA,QAAC,CACX;AAAA,MACH;AAEA,aAAO,MAAM;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,aACO,GAAG;AACV,cAAQ,IAAI,CAAC;AAEb,aAAO,MAAM,sDAAsD;AAAA,QACjE,OAAO;AAAA,MAAA,CACR;AACgB,uBAAA,UAAU,gCAAgC,IAAI;AAAA,QAC7D,OAAO;AAAA,MAAA,CACR;AAED,aAAO,MAAM,IAAI;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IAAA;AAAA,WAEK,OAAO;AACd,WAAO,MAAM,8CAA8C;AAAA,MACzD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAED,qBAAiB,OAAO,mCAAmC;AAAA,MACzD;AAAA,MACA;AAAA,IAAA,CACD;AAEK,UAAA;AAAA,EAAA;AAEV;"}
1
+ {"version":3,"file":"standards-sdk.es18.js","sources":["../../src/utils/hrl-resolver.ts"],"sourcesContent":["import axios from 'axios';\nimport { Logger, LogLevel } from './logger';\nimport { NetworkType } from './types';\n\n/**\n * Options for HRL resolution\n */\nexport interface HRLResolutionOptions {\n network: NetworkType;\n returnRaw?: boolean;\n cdnEndpoint?: string;\n}\n\n/**\n * Result of an HRL resolution operation\n */\nexport interface HRLResolutionResult {\n content: string | ArrayBuffer;\n contentType: string;\n topicId: string;\n isBinary: boolean;\n}\n\nexport interface ContentWithType {\n content: string | ArrayBuffer;\n contentType: string;\n isBinary: boolean;\n}\n\n/**\n * Utility class for resolving Hedera Resource Locators across the SDK\n */\nexport class HRLResolver {\n private logger: Logger;\n private defaultEndpoint = 'https://kiloscribe.com/api/inscription-cdn';\n\n constructor(logLevel: LogLevel = 'info') {\n this.logger = Logger.getInstance({\n level: logLevel,\n module: 'HRLResolver',\n });\n }\n\n /**\n * Determines if a MIME type represents binary content\n */\n private isBinaryContentType(mimeType: string): boolean {\n const binaryTypes = [\n 'image/',\n 'audio/',\n 'video/',\n 'application/octet-stream',\n 'application/pdf',\n 'application/zip',\n 'application/gzip',\n 'application/x-binary',\n 'application/vnd.ms-',\n 'application/x-msdownload',\n 'application/x-shockwave-flash',\n 'font/',\n 'application/wasm',\n ];\n\n return binaryTypes.some((prefix) => mimeType.startsWith(prefix));\n }\n\n /**\n * Parses an HRL string into its components\n */\n public parseHRL(hrl: string): { standard: string; topicId: string } | null {\n if (!hrl) {\n return null;\n }\n\n const hrlPattern = /^hcs:\\/\\/(\\d+)\\/([0-9]+\\.[0-9]+\\.[0-9]+)$/;\n const match = hrl.match(hrlPattern);\n\n if (!match) {\n return null;\n }\n\n return {\n standard: match[1],\n topicId: match[2],\n };\n }\n\n /**\n * Validates if a string is a valid HRL\n */\n public isValidHRL(hrl: string): boolean {\n if (!hrl || typeof hrl !== 'string') {\n return false;\n }\n\n const parsed = this.parseHRL(hrl);\n if (!parsed) {\n return false;\n }\n\n const topicIdPattern = /^[0-9]+\\.[0-9]+\\.[0-9]+$/;\n if (!topicIdPattern.test(parsed.topicId)) {\n return false;\n }\n\n return true;\n }\n\n public async getContentWithType(\n hrl: string,\n options: HRLResolutionOptions\n ): Promise<ContentWithType> {\n if (!this.isValidHRL(hrl)) {\n return {\n content: hrl,\n contentType: 'text/plain',\n isBinary: false,\n };\n }\n\n try {\n const result = await this.resolveHRL(hrl, options);\n return {\n content: result.content,\n contentType: result.contentType,\n isBinary: result.isBinary,\n };\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error resolving HRL for content and type: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n\n /**\n * Resolves HRL content with proper content type detection\n */\n public async resolveHRL(\n hrl: string,\n options: HRLResolutionOptions\n ): Promise<HRLResolutionResult> {\n const parsed = this.parseHRL(hrl);\n\n if (!parsed) {\n throw new Error(`Invalid HRL format: ${hrl}`);\n }\n\n const { standard, topicId } = parsed;\n\n this.logger.debug(\n `Resolving HRL reference: standard=${standard}, topicId=${topicId}`\n );\n\n try {\n const cdnEndpoint = options.cdnEndpoint || this.defaultEndpoint;\n const cdnUrl = `${cdnEndpoint}/${topicId}?network=${options.network}`;\n\n this.logger.debug(`Fetching content from CDN: ${cdnUrl}`);\n const headResponse = await axios.head(cdnUrl);\n const contentType = headResponse.headers['content-type'] || '';\n const isBinary = this.isBinaryContentType(contentType);\n\n if (isBinary || options.returnRaw) {\n const response = await axios.get(cdnUrl, {\n responseType: 'arraybuffer',\n });\n\n return {\n content: response.data,\n contentType,\n topicId,\n isBinary: true,\n };\n }\n\n if (contentType === 'application/json') {\n const response = await axios.get(cdnUrl, {\n responseType: 'json',\n });\n\n if (!response.data) {\n throw new Error(`Failed to fetch content from topic: ${topicId}`);\n }\n\n return {\n content: response.data,\n contentType,\n topicId,\n isBinary: false,\n };\n }\n\n const response = await axios.get(cdnUrl);\n\n if (!response.data) {\n throw new Error(`Failed to fetch content from topic: ${topicId}`);\n }\n\n let content: string;\n\n if (typeof response.data === 'object') {\n content =\n response.data.content ||\n response.data.text ||\n JSON.stringify(response.data);\n } else {\n content = response.data;\n }\n\n return {\n content,\n contentType,\n topicId,\n isBinary: false,\n };\n } catch (e: any) {\n const error = e as Error;\n const logMessage = `Error resolving HRL reference: ${error.message}`;\n this.logger.error(logMessage);\n throw new Error(logMessage);\n }\n }\n}\n"],"names":["response"],"mappings":"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"}