@hashgraphonline/standards-sdk 0.0.157-canary.2 → 0.0.157-canary.4

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 (178) hide show
  1. package/dist/cjs/hcs-10/base-client.d.ts +1 -1
  2. package/dist/cjs/hcs-10/base-client.d.ts.map +1 -1
  3. package/dist/cjs/hcs-10/sdk.d.ts +1 -1
  4. package/dist/cjs/hcs-10/sdk.d.ts.map +1 -1
  5. package/dist/cjs/hcs-11/agent-builder.d.ts +2 -0
  6. package/dist/cjs/hcs-11/agent-builder.d.ts.map +1 -1
  7. package/dist/cjs/hcs-11/client.d.ts +2 -0
  8. package/dist/cjs/hcs-11/client.d.ts.map +1 -1
  9. package/dist/cjs/hcs-11/types.d.ts +4 -2
  10. package/dist/cjs/hcs-11/types.d.ts.map +1 -1
  11. package/dist/cjs/hcs-15/index.d.ts +3 -0
  12. package/dist/cjs/hcs-15/index.d.ts.map +1 -0
  13. package/dist/cjs/hcs-15/petal-manager.d.ts +27 -0
  14. package/dist/cjs/hcs-15/petal-manager.d.ts.map +1 -0
  15. package/dist/cjs/hcs-15/types.d.ts +41 -0
  16. package/dist/cjs/hcs-15/types.d.ts.map +1 -0
  17. package/dist/cjs/hcs-16/flora-account-manager.d.ts.map +1 -1
  18. package/dist/cjs/hcs-16/types.d.ts +3 -5
  19. package/dist/cjs/hcs-16/types.d.ts.map +1 -1
  20. package/dist/cjs/hcs-18/discovery.d.ts +1 -0
  21. package/dist/cjs/hcs-18/discovery.d.ts.map +1 -1
  22. package/dist/cjs/hcs-18/types.d.ts +1 -0
  23. package/dist/cjs/hcs-18/types.d.ts.map +1 -1
  24. package/dist/cjs/hcs-20/sdk.d.ts.map +1 -1
  25. package/dist/cjs/hcs-7/evm-bridge.d.ts.map +1 -1
  26. package/dist/cjs/hcs-7/redis-cache.d.ts.map +1 -1
  27. package/dist/cjs/hcs-7/wasm-bridge.d.ts.map +1 -1
  28. package/dist/cjs/{index-xZmk-HBD.cjs → index-CJsmyij2.cjs} +12 -12
  29. package/dist/cjs/index-CJsmyij2.cjs.map +1 -0
  30. package/dist/cjs/{index-CyAbgH2f-Cv8mxAhS.cjs → index-CyAbgH2f-Dn5WQtPx.cjs} +2 -2
  31. package/dist/cjs/{index-CyAbgH2f-Cv8mxAhS.cjs.map → index-CyAbgH2f-Dn5WQtPx.cjs.map} +1 -1
  32. package/dist/cjs/index.d.ts +1 -1
  33. package/dist/cjs/services/types.d.ts +1 -1
  34. package/dist/cjs/services/types.d.ts.map +1 -1
  35. package/dist/cjs/standards-sdk.cjs +1 -1
  36. package/dist/cjs/{standards-sdk.es45-BxAtDqsy-ELd4REyl.cjs → standards-sdk.es45-BxAtDqsy-CiMtsDbD.cjs} +2 -2
  37. package/dist/cjs/{standards-sdk.es45-BxAtDqsy-ELd4REyl.cjs.map → standards-sdk.es45-BxAtDqsy-CiMtsDbD.cjs.map} +1 -1
  38. package/dist/cjs/{standards-sdk.es46-BI8ACeLM-DRmcgoN0.cjs → standards-sdk.es46-BI8ACeLM-DFYgO-fP.cjs} +2 -2
  39. package/dist/cjs/{standards-sdk.es46-BI8ACeLM-DRmcgoN0.cjs.map → standards-sdk.es46-BI8ACeLM-DFYgO-fP.cjs.map} +1 -1
  40. package/dist/cjs/{standards-sdk.es47-DbkY3FlD-DfMpZygD.cjs → standards-sdk.es47-DbkY3FlD-2qTWs2BD.cjs} +2 -2
  41. package/dist/cjs/{standards-sdk.es47-DbkY3FlD-DfMpZygD.cjs.map → standards-sdk.es47-DbkY3FlD-2qTWs2BD.cjs.map} +1 -1
  42. package/dist/cjs/{standards-sdk.es48-DzT9Qc3F-CmCkJl3x.cjs → standards-sdk.es48-DzT9Qc3F-Byz0fQnW.cjs} +2 -2
  43. package/dist/cjs/{standards-sdk.es48-DzT9Qc3F-CmCkJl3x.cjs.map → standards-sdk.es48-DzT9Qc3F-Byz0fQnW.cjs.map} +1 -1
  44. package/dist/cjs/utils/logger.d.ts.map +1 -1
  45. package/dist/es/hcs-10/base-client.d.ts +1 -1
  46. package/dist/es/hcs-10/base-client.d.ts.map +1 -1
  47. package/dist/es/hcs-10/sdk.d.ts +1 -1
  48. package/dist/es/hcs-10/sdk.d.ts.map +1 -1
  49. package/dist/es/hcs-11/agent-builder.d.ts +2 -0
  50. package/dist/es/hcs-11/agent-builder.d.ts.map +1 -1
  51. package/dist/es/hcs-11/client.d.ts +2 -0
  52. package/dist/es/hcs-11/client.d.ts.map +1 -1
  53. package/dist/es/hcs-11/types.d.ts +4 -2
  54. package/dist/es/hcs-11/types.d.ts.map +1 -1
  55. package/dist/es/hcs-15/index.d.ts +3 -0
  56. package/dist/es/hcs-15/index.d.ts.map +1 -0
  57. package/dist/es/hcs-15/petal-manager.d.ts +27 -0
  58. package/dist/es/hcs-15/petal-manager.d.ts.map +1 -0
  59. package/dist/es/hcs-15/types.d.ts +41 -0
  60. package/dist/es/hcs-15/types.d.ts.map +1 -0
  61. package/dist/es/hcs-16/flora-account-manager.d.ts.map +1 -1
  62. package/dist/es/hcs-16/types.d.ts +3 -5
  63. package/dist/es/hcs-16/types.d.ts.map +1 -1
  64. package/dist/es/hcs-18/discovery.d.ts +1 -0
  65. package/dist/es/hcs-18/discovery.d.ts.map +1 -1
  66. package/dist/es/hcs-18/types.d.ts +1 -0
  67. package/dist/es/hcs-18/types.d.ts.map +1 -1
  68. package/dist/es/hcs-20/sdk.d.ts.map +1 -1
  69. package/dist/es/hcs-7/evm-bridge.d.ts.map +1 -1
  70. package/dist/es/hcs-7/redis-cache.d.ts.map +1 -1
  71. package/dist/es/hcs-7/wasm-bridge.d.ts.map +1 -1
  72. package/dist/es/index.d.ts +1 -1
  73. package/dist/es/services/types.d.ts +1 -1
  74. package/dist/es/services/types.d.ts.map +1 -1
  75. package/dist/es/standards-sdk.es.js +19 -22
  76. package/dist/es/standards-sdk.es.js.map +1 -1
  77. package/dist/es/standards-sdk.es10.js +1 -1
  78. package/dist/es/standards-sdk.es11.js +10 -2
  79. package/dist/es/standards-sdk.es11.js.map +1 -1
  80. package/dist/es/standards-sdk.es12.js +1 -1
  81. package/dist/es/standards-sdk.es13.js +1 -1
  82. package/dist/es/standards-sdk.es13.js.map +1 -1
  83. package/dist/es/standards-sdk.es14.js +1 -1
  84. package/dist/es/standards-sdk.es15.js +39 -9
  85. package/dist/es/standards-sdk.es15.js.map +1 -1
  86. package/dist/es/standards-sdk.es16.js +1 -0
  87. package/dist/es/standards-sdk.es16.js.map +1 -1
  88. package/dist/es/standards-sdk.es18.js +1 -1
  89. package/dist/es/standards-sdk.es19.js +1 -1
  90. package/dist/es/standards-sdk.es2.js +1 -1
  91. package/dist/es/standards-sdk.es20.js +2 -2
  92. package/dist/es/standards-sdk.es23.js +2 -2
  93. package/dist/es/standards-sdk.es25.js +4 -2
  94. package/dist/es/standards-sdk.es25.js.map +1 -1
  95. package/dist/es/standards-sdk.es26.js +2 -2
  96. package/dist/es/standards-sdk.es27.js +152 -6
  97. package/dist/es/standards-sdk.es27.js.map +1 -1
  98. package/dist/es/standards-sdk.es28.js +26 -189
  99. package/dist/es/standards-sdk.es28.js.map +1 -1
  100. package/dist/es/standards-sdk.es29.js +446 -26
  101. package/dist/es/standards-sdk.es29.js.map +1 -1
  102. package/dist/es/standards-sdk.es3.js +1 -1
  103. package/dist/es/standards-sdk.es3.js.map +1 -1
  104. package/dist/es/standards-sdk.es30.js +6 -342
  105. package/dist/es/standards-sdk.es30.js.map +1 -1
  106. package/dist/es/standards-sdk.es31.js +202 -6
  107. package/dist/es/standards-sdk.es31.js.map +1 -1
  108. package/dist/es/standards-sdk.es32.js +34 -202
  109. package/dist/es/standards-sdk.es32.js.map +1 -1
  110. package/dist/es/standards-sdk.es33.js +529 -34
  111. package/dist/es/standards-sdk.es33.js.map +1 -1
  112. package/dist/es/standards-sdk.es34.js +87 -501
  113. package/dist/es/standards-sdk.es34.js.map +1 -1
  114. package/dist/es/standards-sdk.es35.js +19 -98
  115. package/dist/es/standards-sdk.es35.js.map +1 -1
  116. package/dist/es/standards-sdk.es36.js +156 -18
  117. package/dist/es/standards-sdk.es36.js.map +1 -1
  118. package/dist/es/standards-sdk.es37.js +146 -150
  119. package/dist/es/standards-sdk.es37.js.map +1 -1
  120. package/dist/es/standards-sdk.es38.js +561 -134
  121. package/dist/es/standards-sdk.es38.js.map +1 -1
  122. package/dist/es/standards-sdk.es39.js +562 -543
  123. package/dist/es/standards-sdk.es39.js.map +1 -1
  124. package/dist/es/standards-sdk.es4.js +6 -4
  125. package/dist/es/standards-sdk.es4.js.map +1 -1
  126. package/dist/es/standards-sdk.es40.js +4 -601
  127. package/dist/es/standards-sdk.es40.js.map +1 -1
  128. package/dist/es/standards-sdk.es41.js +415 -4
  129. package/dist/es/standards-sdk.es41.js.map +1 -1
  130. package/dist/es/standards-sdk.es42.js +1536 -389
  131. package/dist/es/standards-sdk.es42.js.map +1 -1
  132. package/dist/es/standards-sdk.es43.js +133 -1541
  133. package/dist/es/standards-sdk.es43.js.map +1 -1
  134. package/dist/es/standards-sdk.es44.js +7 -155
  135. package/dist/es/standards-sdk.es44.js.map +1 -1
  136. package/dist/es/standards-sdk.es45.js +2 -7
  137. package/dist/es/standards-sdk.es45.js.map +1 -1
  138. package/dist/es/standards-sdk.es46.js +5 -5
  139. package/dist/es/standards-sdk.es48.js +1 -1
  140. package/dist/es/standards-sdk.es49.js +1 -1
  141. package/dist/es/standards-sdk.es5.js +4 -6
  142. package/dist/es/standards-sdk.es5.js.map +1 -1
  143. package/dist/es/standards-sdk.es50.js +1 -1
  144. package/dist/es/standards-sdk.es51.js +1 -1
  145. package/dist/es/standards-sdk.es52.js +1 -1
  146. package/dist/es/standards-sdk.es54.js +7135 -2
  147. package/dist/es/standards-sdk.es54.js.map +1 -1
  148. package/dist/es/standards-sdk.es55.js +7134 -41
  149. package/dist/es/standards-sdk.es55.js.map +1 -1
  150. package/dist/es/standards-sdk.es56.js +37 -37
  151. package/dist/es/standards-sdk.es56.js.map +1 -1
  152. package/dist/es/standards-sdk.es57.js +37 -37
  153. package/dist/es/standards-sdk.es57.js.map +1 -1
  154. package/dist/es/standards-sdk.es58.js +78 -72
  155. package/dist/es/standards-sdk.es58.js.map +1 -1
  156. package/dist/es/standards-sdk.es59.js +41 -7134
  157. package/dist/es/standards-sdk.es59.js.map +1 -1
  158. package/dist/es/standards-sdk.es6.js.map +1 -1
  159. package/dist/es/standards-sdk.es7.js +28 -22
  160. package/dist/es/standards-sdk.es7.js.map +1 -1
  161. package/dist/es/standards-sdk.es8.js +5 -5
  162. package/dist/es/utils/logger.d.ts.map +1 -1
  163. package/package.json +37 -35
  164. package/dist/cjs/hcs-21/index.d.ts +0 -4
  165. package/dist/cjs/hcs-21/index.d.ts.map +0 -1
  166. package/dist/cjs/hcs-21/petal-account-manager.d.ts +0 -52
  167. package/dist/cjs/hcs-21/petal-account-manager.d.ts.map +0 -1
  168. package/dist/cjs/hcs-21/types.d.ts +0 -44
  169. package/dist/cjs/hcs-21/types.d.ts.map +0 -1
  170. package/dist/cjs/index-xZmk-HBD.cjs.map +0 -1
  171. package/dist/es/hcs-21/index.d.ts +0 -4
  172. package/dist/es/hcs-21/index.d.ts.map +0 -1
  173. package/dist/es/hcs-21/petal-account-manager.d.ts +0 -52
  174. package/dist/es/hcs-21/petal-account-manager.d.ts.map +0 -1
  175. package/dist/es/hcs-21/types.d.ts +0 -44
  176. package/dist/es/hcs-21/types.d.ts.map +0 -1
  177. package/dist/es/standards-sdk.es60.js +0 -7144
  178. package/dist/es/standards-sdk.es60.js.map +0 -1
@@ -1,163 +1,159 @@
1
- import { Logger } from "./standards-sdk.es35.js";
2
- class ProgressReporter {
3
- constructor(options = {}) {
4
- this.module = options.module || "Progress";
5
- this.callback = options.callback;
6
- this.logger = options.logger || new Logger({
7
- level: "info",
8
- module: "ProgressReporter"
1
+ import axios from "axios";
2
+ import { Logger } from "./standards-sdk.es34.js";
3
+ class HRLResolver {
4
+ constructor(logLevel = "info") {
5
+ this.defaultEndpoint = "https://kiloscribe.com/api/inscription-cdn";
6
+ this.logger = Logger.getInstance({
7
+ level: logLevel,
8
+ module: "HRLResolver"
9
9
  });
10
- this.logProgress = options.logProgress ?? true;
11
- this.minPercent = options.minPercent ?? 0;
12
- this.maxPercent = options.maxPercent ?? 100;
13
- this.lastReportedPercent = -1;
14
- this.lastReportedTime = 0;
15
- this.throttleMs = 100;
16
10
  }
17
- static getInstance(options = {}) {
18
- if (!ProgressReporter.instance) {
19
- ProgressReporter.instance = new ProgressReporter(options);
20
- } else {
21
- if (options.callback) {
22
- ProgressReporter.instance.setCallback(options.callback);
23
- }
24
- if (options.module) {
25
- ProgressReporter.instance.setModule(options.module);
26
- }
27
- if (options.logger) {
28
- ProgressReporter.instance.setLogger(options.logger);
29
- }
30
- if (options.minPercent !== void 0) {
31
- ProgressReporter.instance.setMinPercent(options.minPercent);
32
- }
33
- if (options.maxPercent !== void 0) {
34
- ProgressReporter.instance.setMaxPercent(options.maxPercent);
35
- }
11
+ /**
12
+ * Determines if a MIME type represents binary content
13
+ */
14
+ isBinaryContentType(mimeType) {
15
+ const binaryTypes = [
16
+ "image/",
17
+ "audio/",
18
+ "video/",
19
+ "application/octet-stream",
20
+ "application/pdf",
21
+ "application/zip",
22
+ "application/gzip",
23
+ "application/x-binary",
24
+ "application/vnd.ms-",
25
+ "application/x-msdownload",
26
+ "application/x-shockwave-flash",
27
+ "font/",
28
+ "application/wasm"
29
+ ];
30
+ return binaryTypes.some((prefix) => mimeType.startsWith(prefix));
31
+ }
32
+ /**
33
+ * Parses an HRL string into its components
34
+ */
35
+ parseHRL(hrl) {
36
+ if (!hrl) {
37
+ return null;
36
38
  }
37
- return ProgressReporter.instance;
38
- }
39
- setCallback(callback) {
40
- this.callback = callback;
41
- }
42
- setModule(module) {
43
- this.module = module;
44
- }
45
- setLogger(logger) {
46
- this.logger = logger;
47
- }
48
- setMinPercent(minPercent) {
49
- this.minPercent = minPercent;
50
- }
51
- setMaxPercent(maxPercent) {
52
- this.maxPercent = maxPercent;
53
- }
54
- createSubProgress(options) {
55
- const subReporter = new ProgressReporter({
56
- module: this.module,
57
- logger: this.logger,
58
- logProgress: this.logProgress,
59
- minPercent: options.minPercent,
60
- maxPercent: options.maxPercent
61
- });
62
- const logPrefix = options.logPrefix || "";
63
- subReporter.setCallback((data) => {
64
- const scaledPercent = this.scalePercent(
65
- data.progressPercent,
66
- options.minPercent,
67
- options.maxPercent
68
- );
69
- let formattedMessage = data.message;
70
- if (logPrefix && !formattedMessage.startsWith(logPrefix)) {
71
- formattedMessage = `${logPrefix}: ${formattedMessage}`;
72
- }
73
- this.report({
74
- stage: data.stage,
75
- message: formattedMessage,
76
- progressPercent: scaledPercent,
77
- details: data.details
78
- });
79
- });
80
- return subReporter;
81
- }
82
- report(data) {
83
- const rawPercent = data.progressPercent;
84
- const percent = Math.max(0, Math.min(100, rawPercent));
85
- const scaledPercent = this.scalePercent(percent, 0, 100);
86
- const now = Date.now();
87
- if (scaledPercent === this.lastReportedPercent && now - this.lastReportedTime < this.throttleMs && data.stage !== "completed" && data.stage !== "failed") {
88
- return;
39
+ const hrlPattern = /^hcs:\/\/(\d+)\/([0-9]+\.[0-9]+\.[0-9]+)$/;
40
+ const match = hrl.match(hrlPattern);
41
+ if (!match) {
42
+ return null;
89
43
  }
90
- this.lastReportedPercent = scaledPercent;
91
- this.lastReportedTime = now;
92
- const progressData = {
93
- ...data,
94
- progressPercent: scaledPercent
44
+ return {
45
+ standard: match[1],
46
+ topicId: match[2]
95
47
  };
96
- if (this.logProgress) {
97
- this.logger.debug(
98
- `[${this.module}] [${data.stage.toUpperCase()}] ${data.message} (${scaledPercent.toFixed(1)}%)`,
99
- data.details
100
- );
48
+ }
49
+ /**
50
+ * Validates if a string is a valid HRL
51
+ */
52
+ isValidHRL(hrl) {
53
+ if (!hrl || typeof hrl !== "string") {
54
+ return false;
101
55
  }
102
- if (this.callback) {
103
- try {
104
- this.callback(progressData);
105
- } catch (err) {
106
- this.logger.warn(`Error in progress callback: ${err}`);
107
- }
56
+ const parsed = this.parseHRL(hrl);
57
+ if (!parsed) {
58
+ return false;
59
+ }
60
+ const topicIdPattern = /^[0-9]+\.[0-9]+\.[0-9]+$/;
61
+ if (!topicIdPattern.test(parsed.topicId)) {
62
+ return false;
63
+ }
64
+ return true;
65
+ }
66
+ async getContentWithType(hrl, options) {
67
+ if (!this.isValidHRL(hrl)) {
68
+ return {
69
+ content: hrl,
70
+ contentType: "text/plain",
71
+ isBinary: false
72
+ };
73
+ }
74
+ try {
75
+ const result = await this.resolveHRL(hrl, options);
76
+ return {
77
+ content: result.content,
78
+ contentType: result.contentType,
79
+ isBinary: result.isBinary
80
+ };
81
+ } catch (e) {
82
+ const error = e;
83
+ const logMessage = `Error resolving HRL for content and type: ${error.message}`;
84
+ this.logger.error(logMessage);
85
+ throw new Error(logMessage);
108
86
  }
109
87
  }
110
- scalePercent(percent, sourceMin, sourceMax) {
111
- const range = this.maxPercent - this.minPercent;
112
- const sourceRange = sourceMax - sourceMin;
113
- const scaleFactor = range / sourceRange;
114
- return this.minPercent + (percent - sourceMin) * scaleFactor;
115
- }
116
- preparing(message, percent, details) {
117
- this.report({
118
- stage: "preparing",
119
- message,
120
- progressPercent: percent,
121
- details
122
- });
123
- }
124
- submitting(message, percent, details) {
125
- this.report({
126
- stage: "submitting",
127
- message,
128
- progressPercent: percent,
129
- details
130
- });
131
- }
132
- confirming(message, percent, details) {
133
- this.report({
134
- stage: "confirming",
135
- message,
136
- progressPercent: percent,
137
- details
138
- });
139
- }
140
- verifying(message, percent, details) {
141
- this.report({
142
- stage: "verifying",
143
- message,
144
- progressPercent: percent,
145
- details
146
- });
147
- }
148
- completed(message, details) {
149
- this.report({ stage: "completed", message, progressPercent: 100, details });
150
- }
151
- failed(message, details) {
152
- this.report({
153
- stage: "failed",
154
- message,
155
- progressPercent: this.lastReportedPercent,
156
- details
157
- });
88
+ /**
89
+ * Resolves HRL content with proper content type detection
90
+ */
91
+ async resolveHRL(hrl, options) {
92
+ const parsed = this.parseHRL(hrl);
93
+ if (!parsed) {
94
+ throw new Error(`Invalid HRL format: ${hrl}`);
95
+ }
96
+ const { standard, topicId } = parsed;
97
+ this.logger.debug(
98
+ `Resolving HRL reference: standard=${standard}, topicId=${topicId}`
99
+ );
100
+ try {
101
+ const cdnEndpoint = options.cdnEndpoint || this.defaultEndpoint;
102
+ const cdnUrl = `${cdnEndpoint}/${topicId}?network=${options.network}`;
103
+ this.logger.debug(`Fetching content from CDN: ${cdnUrl}`);
104
+ const headResponse = await axios.head(cdnUrl);
105
+ const contentType = headResponse.headers["content-type"] || "";
106
+ const isBinary = this.isBinaryContentType(contentType);
107
+ if (isBinary || options.returnRaw) {
108
+ const response2 = await axios.get(cdnUrl, {
109
+ responseType: "arraybuffer"
110
+ });
111
+ return {
112
+ content: response2.data,
113
+ contentType,
114
+ topicId,
115
+ isBinary: true
116
+ };
117
+ }
118
+ if (contentType === "application/json") {
119
+ const response2 = await axios.get(cdnUrl, {
120
+ responseType: "json"
121
+ });
122
+ if (!response2.data) {
123
+ throw new Error(`Failed to fetch content from topic: ${topicId}`);
124
+ }
125
+ return {
126
+ content: response2.data,
127
+ contentType,
128
+ topicId,
129
+ isBinary: false
130
+ };
131
+ }
132
+ const response = await axios.get(cdnUrl);
133
+ if (!response.data) {
134
+ throw new Error(`Failed to fetch content from topic: ${topicId}`);
135
+ }
136
+ let content;
137
+ if (typeof response.data === "object") {
138
+ content = response.data.content || response.data.text || JSON.stringify(response.data);
139
+ } else {
140
+ content = response.data;
141
+ }
142
+ return {
143
+ content,
144
+ contentType,
145
+ topicId,
146
+ isBinary: false
147
+ };
148
+ } catch (e) {
149
+ const error = e;
150
+ const logMessage = `Error resolving HRL reference: ${error.message}`;
151
+ this.logger.error(logMessage);
152
+ throw new Error(logMessage);
153
+ }
158
154
  }
159
155
  }
160
156
  export {
161
- ProgressReporter
157
+ HRLResolver
162
158
  };
163
159
  //# sourceMappingURL=standards-sdk.es37.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es37.js","sources":["../../src/utils/progress-reporter.ts"],"sourcesContent":["import { Logger } from './logger';\n\nexport type ProgressStage =\n | 'preparing'\n | 'submitting'\n | 'confirming'\n | 'verifying'\n | 'completed'\n | 'failed';\n\nexport interface ProgressData {\n stage: ProgressStage;\n message: string;\n progressPercent: number;\n details?: Record<string, any>;\n}\n\nexport type ProgressCallback = (data: ProgressData) => void;\n\nexport interface ProgressReporterOptions {\n module?: string;\n callback?: ProgressCallback;\n logger?: Logger;\n logProgress?: boolean;\n minPercent?: number;\n maxPercent?: number;\n}\n\n/**\n * ProgressReporter is a singleton class that reports progress of a task.\n * Can be used in a generalized fashion.\n */\nexport class ProgressReporter {\n private static instance: ProgressReporter;\n private module: string;\n private callback?: ProgressCallback;\n private logger: Logger;\n private logProgress: boolean;\n private minPercent: number;\n private maxPercent: number;\n private lastReportedPercent: number;\n private lastReportedTime: number;\n private throttleMs: number;\n\n constructor(options: ProgressReporterOptions = {}) {\n this.module = options.module || 'Progress';\n this.callback = options.callback;\n this.logger =\n options.logger ||\n new Logger({\n level: 'info',\n module: 'ProgressReporter',\n });\n this.logProgress = options.logProgress ?? true;\n this.minPercent = options.minPercent ?? 0;\n this.maxPercent = options.maxPercent ?? 100;\n this.lastReportedPercent = -1;\n this.lastReportedTime = 0;\n this.throttleMs = 100;\n }\n\n static getInstance(options: ProgressReporterOptions = {}): ProgressReporter {\n if (!ProgressReporter.instance) {\n ProgressReporter.instance = new ProgressReporter(options);\n } else {\n if (options.callback) {\n ProgressReporter.instance.setCallback(options.callback);\n }\n if (options.module) {\n ProgressReporter.instance.setModule(options.module);\n }\n if (options.logger) {\n ProgressReporter.instance.setLogger(options.logger);\n }\n if (options.minPercent !== undefined) {\n ProgressReporter.instance.setMinPercent(options.minPercent);\n }\n if (options.maxPercent !== undefined) {\n ProgressReporter.instance.setMaxPercent(options.maxPercent);\n }\n }\n return ProgressReporter.instance;\n }\n\n setCallback(callback: ProgressCallback): void {\n this.callback = callback;\n }\n\n setModule(module: string): void {\n this.module = module;\n }\n\n setLogger(logger: Logger): void {\n this.logger = logger;\n }\n\n setMinPercent(minPercent: number): void {\n this.minPercent = minPercent;\n }\n\n setMaxPercent(maxPercent: number): void {\n this.maxPercent = maxPercent;\n }\n\n createSubProgress(options: {\n minPercent: number;\n maxPercent: number;\n logPrefix?: string;\n }): ProgressReporter {\n const subReporter = new ProgressReporter({\n module: this.module,\n logger: this.logger,\n logProgress: this.logProgress,\n minPercent: options.minPercent,\n maxPercent: options.maxPercent,\n });\n\n const logPrefix = options.logPrefix || '';\n\n subReporter.setCallback(data => {\n const scaledPercent = this.scalePercent(\n data.progressPercent,\n options.minPercent,\n options.maxPercent,\n );\n\n let formattedMessage = data.message;\n if (logPrefix && !formattedMessage.startsWith(logPrefix)) {\n formattedMessage = `${logPrefix}: ${formattedMessage}`;\n }\n\n this.report({\n stage: data.stage,\n message: formattedMessage,\n progressPercent: scaledPercent,\n details: data.details,\n });\n });\n\n return subReporter;\n }\n\n report(data: ProgressData): void {\n const rawPercent = data.progressPercent;\n const percent = Math.max(0, Math.min(100, rawPercent));\n\n const scaledPercent = this.scalePercent(percent, 0, 100);\n\n const now = Date.now();\n if (\n scaledPercent === this.lastReportedPercent &&\n now - this.lastReportedTime < this.throttleMs &&\n data.stage !== 'completed' &&\n data.stage !== 'failed'\n ) {\n return;\n }\n\n this.lastReportedPercent = scaledPercent;\n this.lastReportedTime = now;\n\n const progressData = {\n ...data,\n progressPercent: scaledPercent,\n };\n\n if (this.logProgress) {\n this.logger.debug(\n `[${this.module}] [${data.stage.toUpperCase()}] ${\n data.message\n } (${scaledPercent.toFixed(1)}%)`,\n data.details,\n );\n }\n\n if (this.callback) {\n try {\n this.callback(progressData);\n } catch (err) {\n this.logger.warn(`Error in progress callback: ${err}`);\n }\n }\n }\n\n private scalePercent(\n percent: number,\n sourceMin: number,\n sourceMax: number,\n ): number {\n const range = this.maxPercent - this.minPercent;\n const sourceRange = sourceMax - sourceMin;\n const scaleFactor = range / sourceRange;\n\n return this.minPercent + (percent - sourceMin) * scaleFactor;\n }\n\n preparing(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'preparing',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n submitting(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'submitting',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n confirming(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'confirming',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n verifying(\n message: string,\n percent: number,\n details?: Record<string, any>,\n ): void {\n this.report({\n stage: 'verifying',\n message,\n progressPercent: percent,\n details,\n });\n }\n\n completed(message: string, details?: Record<string, any>): void {\n this.report({ stage: 'completed', message, progressPercent: 100, details });\n }\n\n failed(message: string, details?: Record<string, any>): void {\n this.report({\n stage: 'failed',\n message,\n progressPercent: this.lastReportedPercent,\n details,\n });\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es37.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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"}