@hashgraphonline/standards-sdk 0.1.162 → 0.1.164

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 (239) hide show
  1. package/README.md +59 -0
  2. package/dist/cjs/common/node-operator-resolver.d.ts +1 -1
  3. package/dist/cjs/common/tx/tx-utils.d.ts +1 -1
  4. package/dist/cjs/hcs-10/base-client.d.ts +1 -1
  5. package/dist/cjs/hcs-10/browser.d.ts +1 -1
  6. package/dist/cjs/hcs-10/sdk.d.ts +1 -1
  7. package/dist/cjs/hcs-10/tx.d.ts +1 -1
  8. package/dist/cjs/hcs-10/types.d.ts +1 -1
  9. package/dist/cjs/hcs-11/client.d.ts +51 -51
  10. package/dist/cjs/hcs-11/types.d.ts +1 -1
  11. package/dist/cjs/hcs-12/base-client.d.ts +1 -1
  12. package/dist/cjs/hcs-12/browser.d.ts +1 -1
  13. package/dist/cjs/hcs-12/sdk.d.ts +1 -1
  14. package/dist/cjs/hcs-12/security/signature-verifier.d.ts +1 -1
  15. package/dist/cjs/hcs-12/tx.d.ts +1 -1
  16. package/dist/cjs/hcs-14/issuers/types.d.ts +1 -1
  17. package/dist/cjs/hcs-14/sdk.d.ts +1 -1
  18. package/dist/cjs/hcs-15/browser.d.ts +1 -1
  19. package/dist/cjs/hcs-15/sdk.d.ts +1 -1
  20. package/dist/cjs/hcs-15/tx.d.ts +1 -1
  21. package/dist/cjs/hcs-15/types.d.ts +1 -1
  22. package/dist/cjs/hcs-16/base-client.d.ts +1 -1
  23. package/dist/cjs/hcs-16/browser.d.ts +1 -1
  24. package/dist/cjs/hcs-16/sdk.d.ts +1 -1
  25. package/dist/cjs/hcs-16/tx.d.ts +1 -1
  26. package/dist/cjs/hcs-16/types.d.ts +1 -1
  27. package/dist/cjs/hcs-17/base-client.d.ts +1 -1
  28. package/dist/cjs/hcs-17/browser.d.ts +1 -1
  29. package/dist/cjs/hcs-17/sdk.d.ts +1 -1
  30. package/dist/cjs/hcs-17/tx.d.ts +1 -1
  31. package/dist/cjs/hcs-17/types.d.ts +1 -1
  32. package/dist/cjs/hcs-18/browser.d.ts +1 -1
  33. package/dist/cjs/hcs-18/sdk.d.ts +2 -2
  34. package/dist/cjs/hcs-18/tx.d.ts +1 -1
  35. package/dist/cjs/hcs-18/types.d.ts +1 -1
  36. package/dist/cjs/hcs-2/base-client.d.ts +1 -1
  37. package/dist/cjs/hcs-2/browser.d.ts +1 -1
  38. package/dist/cjs/hcs-2/client.d.ts +8 -2
  39. package/dist/cjs/hcs-2/client.d.ts.map +1 -1
  40. package/dist/cjs/hcs-2/tx.d.ts +1 -1
  41. package/dist/cjs/hcs-2/types.d.ts +3 -1
  42. package/dist/cjs/hcs-2/types.d.ts.map +1 -1
  43. package/dist/cjs/hcs-20/base-client.d.ts +1 -1
  44. package/dist/cjs/hcs-20/tx.d.ts +1 -1
  45. package/dist/cjs/hcs-20/types.d.ts +1 -1
  46. package/dist/cjs/hcs-21/sdk.d.ts +1 -1
  47. package/dist/cjs/hcs-21/tx.d.ts +1 -1
  48. package/dist/cjs/hcs-5/tx.d.ts +1 -1
  49. package/dist/cjs/hcs-5/types.d.ts +1 -1
  50. package/dist/cjs/hcs-6/base-client.d.ts +1 -1
  51. package/dist/cjs/hcs-6/browser.d.ts +1 -1
  52. package/dist/cjs/hcs-6/sdk.d.ts +1 -1
  53. package/dist/cjs/hcs-6/tx.d.ts +1 -1
  54. package/dist/cjs/hcs-6/types.d.ts +1 -1
  55. package/dist/cjs/hcs-7/evm-bridge.d.ts +1 -1
  56. package/dist/cjs/hcs-7/tx.d.ts +1 -1
  57. package/dist/cjs/hcs-7/types.d.ts +1 -1
  58. package/dist/cjs/inscribe/types.d.ts +1 -1
  59. package/dist/cjs/services/mirror-node.d.ts +1 -1
  60. package/dist/cjs/services/registry-broker/client/base-client.d.ts +22 -9
  61. package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
  62. package/dist/cjs/services/registry-broker/client/skills.d.ts +19 -9
  63. package/dist/cjs/services/registry-broker/client/skills.d.ts.map +1 -1
  64. package/dist/cjs/services/registry-broker/client/verification.d.ts +3 -1
  65. package/dist/cjs/services/registry-broker/client/verification.d.ts.map +1 -1
  66. package/dist/cjs/services/registry-broker/private-key-signer.d.ts +1 -1
  67. package/dist/cjs/services/registry-broker/schemas.d.ts +12879 -167
  68. package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
  69. package/dist/cjs/services/registry-broker/types.d.ts +80 -2
  70. package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
  71. package/dist/cjs/standards-sdk.cjs +1 -1
  72. package/dist/cjs/standards-sdk.cjs.map +1 -1
  73. package/dist/cjs/utils/key-type-detector.d.ts +1 -1
  74. package/dist/cjs/utils/parsers/crypto-parser.d.ts +1 -1
  75. package/dist/cjs/utils/parsers/file-parser.d.ts +1 -1
  76. package/dist/cjs/utils/parsers/hcs-parser.d.ts +1 -1
  77. package/dist/cjs/utils/parsers/hts-parser.d.ts +1 -1
  78. package/dist/cjs/utils/parsers/parser-utils.d.ts +1 -1
  79. package/dist/cjs/utils/parsers/schedule-parser.d.ts +1 -1
  80. package/dist/cjs/utils/parsers/scs-parser.d.ts +1 -1
  81. package/dist/cjs/utils/parsers/util-parser.d.ts +1 -1
  82. package/dist/cjs/utils/topic-fee-utils.d.ts +1 -1
  83. package/dist/cjs/utils/transaction-parser.d.ts +1 -1
  84. package/dist/es/common/node-operator-resolver.d.ts +1 -1
  85. package/dist/es/common/tx/tx-utils.d.ts +1 -1
  86. package/dist/es/hcs-10/base-client.d.ts +1 -1
  87. package/dist/es/hcs-10/browser.d.ts +1 -1
  88. package/dist/es/hcs-10/sdk.d.ts +1 -1
  89. package/dist/es/hcs-10/tx.d.ts +1 -1
  90. package/dist/es/hcs-10/types.d.ts +1 -1
  91. package/dist/es/hcs-11/client.d.ts +51 -51
  92. package/dist/es/hcs-11/types.d.ts +1 -1
  93. package/dist/es/hcs-12/base-client.d.ts +1 -1
  94. package/dist/es/hcs-12/browser.d.ts +1 -1
  95. package/dist/es/hcs-12/sdk.d.ts +1 -1
  96. package/dist/es/hcs-12/security/signature-verifier.d.ts +1 -1
  97. package/dist/es/hcs-12/tx.d.ts +1 -1
  98. package/dist/es/hcs-14/issuers/types.d.ts +1 -1
  99. package/dist/es/hcs-14/sdk.d.ts +1 -1
  100. package/dist/es/hcs-15/browser.d.ts +1 -1
  101. package/dist/es/hcs-15/sdk.d.ts +1 -1
  102. package/dist/es/hcs-15/tx.d.ts +1 -1
  103. package/dist/es/hcs-15/types.d.ts +1 -1
  104. package/dist/es/hcs-16/base-client.d.ts +1 -1
  105. package/dist/es/hcs-16/browser.d.ts +1 -1
  106. package/dist/es/hcs-16/sdk.d.ts +1 -1
  107. package/dist/es/hcs-16/tx.d.ts +1 -1
  108. package/dist/es/hcs-16/types.d.ts +1 -1
  109. package/dist/es/hcs-17/base-client.d.ts +1 -1
  110. package/dist/es/hcs-17/browser.d.ts +1 -1
  111. package/dist/es/hcs-17/sdk.d.ts +1 -1
  112. package/dist/es/hcs-17/tx.d.ts +1 -1
  113. package/dist/es/hcs-17/types.d.ts +1 -1
  114. package/dist/es/hcs-18/browser.d.ts +1 -1
  115. package/dist/es/hcs-18/sdk.d.ts +2 -2
  116. package/dist/es/hcs-18/tx.d.ts +1 -1
  117. package/dist/es/hcs-18/types.d.ts +1 -1
  118. package/dist/es/hcs-2/base-client.d.ts +1 -1
  119. package/dist/es/hcs-2/browser.d.ts +1 -1
  120. package/dist/es/hcs-2/client.d.ts +8 -2
  121. package/dist/es/hcs-2/client.d.ts.map +1 -1
  122. package/dist/es/hcs-2/tx.d.ts +1 -1
  123. package/dist/es/hcs-2/types.d.ts +3 -1
  124. package/dist/es/hcs-2/types.d.ts.map +1 -1
  125. package/dist/es/hcs-20/base-client.d.ts +1 -1
  126. package/dist/es/hcs-20/tx.d.ts +1 -1
  127. package/dist/es/hcs-20/types.d.ts +1 -1
  128. package/dist/es/hcs-21/sdk.d.ts +1 -1
  129. package/dist/es/hcs-21/tx.d.ts +1 -1
  130. package/dist/es/hcs-5/tx.d.ts +1 -1
  131. package/dist/es/hcs-5/types.d.ts +1 -1
  132. package/dist/es/hcs-6/base-client.d.ts +1 -1
  133. package/dist/es/hcs-6/browser.d.ts +1 -1
  134. package/dist/es/hcs-6/sdk.d.ts +1 -1
  135. package/dist/es/hcs-6/tx.d.ts +1 -1
  136. package/dist/es/hcs-6/types.d.ts +1 -1
  137. package/dist/es/hcs-7/evm-bridge.d.ts +1 -1
  138. package/dist/es/hcs-7/tx.d.ts +1 -1
  139. package/dist/es/hcs-7/types.d.ts +1 -1
  140. package/dist/es/inscribe/types.d.ts +1 -1
  141. package/dist/es/services/mirror-node.d.ts +1 -1
  142. package/dist/es/services/registry-broker/client/base-client.d.ts +22 -9
  143. package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
  144. package/dist/es/services/registry-broker/client/skills.d.ts +19 -9
  145. package/dist/es/services/registry-broker/client/skills.d.ts.map +1 -1
  146. package/dist/es/services/registry-broker/client/verification.d.ts +3 -1
  147. package/dist/es/services/registry-broker/client/verification.d.ts.map +1 -1
  148. package/dist/es/services/registry-broker/private-key-signer.d.ts +1 -1
  149. package/dist/es/services/registry-broker/schemas.d.ts +12879 -167
  150. package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
  151. package/dist/es/services/registry-broker/types.d.ts +80 -2
  152. package/dist/es/services/registry-broker/types.d.ts.map +1 -1
  153. package/dist/es/standards-sdk.es104.js +1 -1
  154. package/dist/es/standards-sdk.es106.js +1 -1
  155. package/dist/es/standards-sdk.es108.js +1 -1
  156. package/dist/es/standards-sdk.es11.js +1 -1
  157. package/dist/es/standards-sdk.es110.js +1 -1
  158. package/dist/es/standards-sdk.es116.js +1 -1
  159. package/dist/es/standards-sdk.es12.js +1 -1
  160. package/dist/es/standards-sdk.es132.js +1 -1
  161. package/dist/es/standards-sdk.es137.js +1 -1
  162. package/dist/es/standards-sdk.es138.js +1 -1
  163. package/dist/es/standards-sdk.es140.js +234 -0
  164. package/dist/es/standards-sdk.es140.js.map +1 -1
  165. package/dist/es/standards-sdk.es143.js +1 -1
  166. package/dist/es/standards-sdk.es144.js +45 -3
  167. package/dist/es/standards-sdk.es144.js.map +1 -1
  168. package/dist/es/standards-sdk.es153.js +12450 -106
  169. package/dist/es/standards-sdk.es153.js.map +1 -1
  170. package/dist/es/standards-sdk.es154.js +133 -37
  171. package/dist/es/standards-sdk.es154.js.map +1 -1
  172. package/dist/es/standards-sdk.es155.js +34 -12474
  173. package/dist/es/standards-sdk.es155.js.map +1 -1
  174. package/dist/es/standards-sdk.es156.js +54 -15
  175. package/dist/es/standards-sdk.es156.js.map +1 -1
  176. package/dist/es/standards-sdk.es157.js +76 -48
  177. package/dist/es/standards-sdk.es157.js.map +1 -1
  178. package/dist/es/standards-sdk.es158.js +66 -69
  179. package/dist/es/standards-sdk.es158.js.map +1 -1
  180. package/dist/es/standards-sdk.es159.js +180 -61
  181. package/dist/es/standards-sdk.es159.js.map +1 -1
  182. package/dist/es/standards-sdk.es160.js +521 -187
  183. package/dist/es/standards-sdk.es160.js.map +1 -1
  184. package/dist/es/standards-sdk.es162.js +15 -240
  185. package/dist/es/standards-sdk.es162.js.map +1 -1
  186. package/dist/es/standards-sdk.es169.js +1 -1
  187. package/dist/es/standards-sdk.es173.js +1 -1
  188. package/dist/es/standards-sdk.es179.js +37 -1
  189. package/dist/es/standards-sdk.es179.js.map +1 -1
  190. package/dist/es/standards-sdk.es18.js +3 -3
  191. package/dist/es/standards-sdk.es19.js +1 -1
  192. package/dist/es/standards-sdk.es22.js +1 -1
  193. package/dist/es/standards-sdk.es27.js +2 -2
  194. package/dist/es/standards-sdk.es30.js +1 -1
  195. package/dist/es/standards-sdk.es31.js +1 -1
  196. package/dist/es/standards-sdk.es35.js +1 -1
  197. package/dist/es/standards-sdk.es36.js +3 -3
  198. package/dist/es/standards-sdk.es37.js +1 -1
  199. package/dist/es/standards-sdk.es4.js +1 -1
  200. package/dist/es/standards-sdk.es41.js +7 -7
  201. package/dist/es/standards-sdk.es41.js.map +1 -1
  202. package/dist/es/standards-sdk.es53.js +1 -1
  203. package/dist/es/standards-sdk.es56.js +1 -1
  204. package/dist/es/standards-sdk.es59.js +1 -1
  205. package/dist/es/standards-sdk.es60.js +1 -1
  206. package/dist/es/standards-sdk.es62.js +1 -1
  207. package/dist/es/standards-sdk.es63.js +2 -2
  208. package/dist/es/standards-sdk.es64.js +1 -1
  209. package/dist/es/standards-sdk.es65.js +1 -1
  210. package/dist/es/standards-sdk.es66.js +1 -1
  211. package/dist/es/standards-sdk.es67.js +1 -1
  212. package/dist/es/standards-sdk.es69.js +1 -1
  213. package/dist/es/standards-sdk.es7.js +1 -1
  214. package/dist/es/standards-sdk.es71.js +1 -1
  215. package/dist/es/standards-sdk.es72.js +2 -2
  216. package/dist/es/standards-sdk.es74.js.map +1 -1
  217. package/dist/es/standards-sdk.es75.js +97 -6
  218. package/dist/es/standards-sdk.es75.js.map +1 -1
  219. package/dist/es/standards-sdk.es76.js +1 -1
  220. package/dist/es/standards-sdk.es78.js +1 -1
  221. package/dist/es/standards-sdk.es83.js +1 -1
  222. package/dist/es/standards-sdk.es85.js +1 -1
  223. package/dist/es/standards-sdk.es88.js +2 -2
  224. package/dist/es/standards-sdk.es90.js +1 -1
  225. package/dist/es/standards-sdk.es94.js +1 -1
  226. package/dist/es/standards-sdk.es98.js +2 -2
  227. package/dist/es/standards-sdk.es99.js +1 -1
  228. package/dist/es/utils/key-type-detector.d.ts +1 -1
  229. package/dist/es/utils/parsers/crypto-parser.d.ts +1 -1
  230. package/dist/es/utils/parsers/file-parser.d.ts +1 -1
  231. package/dist/es/utils/parsers/hcs-parser.d.ts +1 -1
  232. package/dist/es/utils/parsers/hts-parser.d.ts +1 -1
  233. package/dist/es/utils/parsers/parser-utils.d.ts +1 -1
  234. package/dist/es/utils/parsers/schedule-parser.d.ts +1 -1
  235. package/dist/es/utils/parsers/scs-parser.d.ts +1 -1
  236. package/dist/es/utils/parsers/util-parser.d.ts +1 -1
  237. package/dist/es/utils/topic-fee-utils.d.ts +1 -1
  238. package/dist/es/utils/transaction-parser.d.ts +1 -1
  239. package/package.json +7 -6
@@ -1,84 +1,203 @@
1
- const orderedParamKeys = [
2
- "uid",
3
- "registry",
4
- "proto",
5
- "nativeId",
6
- "domain",
7
- "src"
8
- ];
9
- const fqdnLabelRegex = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;
10
- function uaidTargetFromParsed(parsed) {
11
- return parsed.method === "aid" ? "aid" : "did";
1
+ import { parseSemicolonFields } from "./standards-sdk.es158.js";
2
+ const ANS_HCS27_REGISTRY = "ans";
3
+ function isObjectRecord(value) {
4
+ return typeof value === "object" && value !== null;
12
5
  }
13
- function normalizeDomain(value) {
14
- return value.trim().replace(/\.$/, "").toLowerCase();
6
+ function asString(value) {
7
+ if (typeof value !== "string") {
8
+ return null;
9
+ }
10
+ const trimmed = value.trim();
11
+ if (!trimmed) {
12
+ return null;
13
+ }
14
+ return trimmed;
15
15
  }
16
- function isFqdn(value) {
17
- const normalized = normalizeDomain(value);
18
- if (!normalized || normalized.length > 253 || !normalized.includes(".")) {
19
- return false;
16
+ function isSemver(value) {
17
+ return /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.test(
18
+ value
19
+ );
20
+ }
21
+ function normalizeAnsVersion(value) {
22
+ const trimmed = value.trim();
23
+ if (!trimmed) {
24
+ return null;
20
25
  }
21
- const labels = normalized.split(".");
22
- for (const label of labels) {
23
- if (!label || label.length > 63 || !fqdnLabelRegex.test(label)) {
24
- return false;
26
+ const withoutPrefix = trimmed.startsWith("v") || trimmed.startsWith("V") ? trimmed.slice(1) : trimmed;
27
+ if (!isSemver(withoutPrefix)) {
28
+ return null;
29
+ }
30
+ return withoutPrefix;
31
+ }
32
+ function parseAnsDnsTxtRecord(rawRecord) {
33
+ const fields = parseSemicolonFields(rawRecord);
34
+ const version = fields["v"];
35
+ const urlValue = fields["url"];
36
+ if (!version || !urlValue || version.toLowerCase() !== "ans1") {
37
+ return null;
38
+ }
39
+ let parsedUrl;
40
+ try {
41
+ parsedUrl = new URL(urlValue);
42
+ } catch {
43
+ return null;
44
+ }
45
+ if (parsedUrl.protocol.toLowerCase() !== "https:") {
46
+ return null;
47
+ }
48
+ const rawAnsVersion = fields["version"];
49
+ let normalizedAnsVersion;
50
+ if (rawAnsVersion !== void 0) {
51
+ const parsedVersion = normalizeAnsVersion(rawAnsVersion);
52
+ if (!parsedVersion) {
53
+ return null;
25
54
  }
55
+ normalizedAnsVersion = parsedVersion;
26
56
  }
27
- return true;
57
+ return {
58
+ version: normalizedAnsVersion,
59
+ url: parsedUrl.toString()
60
+ };
28
61
  }
29
- function normalizeTxtValue(value) {
30
- const trimmed = value.trim();
31
- if (trimmed.length >= 2 && trimmed.startsWith('"') && trimmed.endsWith('"')) {
32
- return trimmed.slice(1, -1);
62
+ function isValidAnsProfileVersion(value) {
63
+ return !!value && normalizeAnsVersion(value) !== null;
64
+ }
65
+ function hasProtocolPathSegment(pathname, protocol) {
66
+ const normalizedProtocol = protocol.trim().toLowerCase();
67
+ if (!normalizedProtocol) {
68
+ return false;
33
69
  }
34
- const markdownLinkMatch = trimmed.match(/^\[(.+)\]\((.+)\)$/);
35
- if (markdownLinkMatch) {
36
- return markdownLinkMatch[2].trim();
70
+ const pathSegments = pathname.split("/").map((segment) => segment.trim()).filter((segment) => segment.length > 0);
71
+ for (const segment of pathSegments) {
72
+ if (segment.toLowerCase() === normalizedProtocol) {
73
+ return true;
74
+ }
37
75
  }
38
- return trimmed;
76
+ return false;
39
77
  }
40
- function parseSemicolonFields(input) {
41
- const fields = {};
42
- for (const part of input.split(";")) {
43
- const trimmed = part.trim();
44
- if (!trimmed) {
78
+ function extractEndpointCandidates(endpoints, supportedSchemes) {
79
+ const candidates = [];
80
+ for (const [key, value] of Object.entries(endpoints)) {
81
+ if (!isObjectRecord(value)) {
45
82
  continue;
46
83
  }
47
- const equalsIndex = trimmed.indexOf("=");
48
- if (equalsIndex <= 0) {
84
+ const endpoint = asString(value["url"]);
85
+ if (!endpoint) {
49
86
  continue;
50
87
  }
51
- const key = trimmed.slice(0, equalsIndex).trim();
52
- const value = normalizeTxtValue(trimmed.slice(equalsIndex + 1));
53
- if (!key || !value) {
88
+ let parsedUrl;
89
+ try {
90
+ parsedUrl = new URL(endpoint);
91
+ } catch {
54
92
  continue;
55
93
  }
56
- fields[key] = value;
94
+ const scheme = parsedUrl.protocol.replace(/:$/, "").toLowerCase();
95
+ if (!supportedSchemes.has(scheme)) {
96
+ continue;
97
+ }
98
+ candidates.push({
99
+ key,
100
+ endpointUrl: parsedUrl.toString(),
101
+ parsedUrl
102
+ });
57
103
  }
58
- return fields;
104
+ return candidates;
59
105
  }
60
- function buildCanonicalUaid(target, id, params) {
61
- const entries = [];
62
- const usedKeys = /* @__PURE__ */ new Set();
63
- for (const key of orderedParamKeys) {
64
- const value = params[key];
65
- if (value) {
66
- entries.push(`${key}=${value}`);
67
- usedKeys.add(key);
68
- }
106
+ function validateAnsHcs27Hints(input) {
107
+ if (!isObjectRecord(input)) {
108
+ return void 0;
109
+ }
110
+ const checkpointTopicId = asString(input["checkpoint_topic_id"]);
111
+ const registry = asString(input["registry"]);
112
+ const logId = asString(input["log_id"]);
113
+ if (!checkpointTopicId || !registry || !logId || registry !== ANS_HCS27_REGISTRY) {
114
+ return void 0;
115
+ }
116
+ const checkpointUri = asString(input["checkpoint_uri"]) ?? void 0;
117
+ const viewerUri = asString(input["viewer_uri"]) ?? void 0;
118
+ return {
119
+ checkpointTopicId,
120
+ registry,
121
+ logId,
122
+ checkpointUri,
123
+ viewerUri
124
+ };
125
+ }
126
+ function validateHcs28Hints(input) {
127
+ if (!isObjectRecord(input)) {
128
+ return void 0;
129
+ }
130
+ const directoryTopicId = asString(input["directory_topic_id"]);
131
+ const tId = asString(input["t_id"]);
132
+ const agentId = asString(input["agent_id"]);
133
+ if (!directoryTopicId || !tId || !agentId) {
134
+ return void 0;
135
+ }
136
+ const proofProfile = asString(input["proof_profile"]) ?? void 0;
137
+ return {
138
+ directoryTopicId,
139
+ tId,
140
+ agentId,
141
+ proofProfile
142
+ };
143
+ }
144
+ function parseTransparencyHints(input) {
145
+ if (!isObjectRecord(input)) {
146
+ return void 0;
69
147
  }
70
- const extraKeys = Object.keys(params).filter((key) => !usedKeys.has(key) && params[key]).sort((a, b) => a.localeCompare(b));
71
- for (const key of extraKeys) {
72
- entries.push(`${key}=${params[key]}`);
148
+ const hcs27 = validateAnsHcs27Hints(input["hcs27"]);
149
+ const hcs28 = validateHcs28Hints(input["hcs28"]);
150
+ if (!hcs27 && !hcs28) {
151
+ return void 0;
152
+ }
153
+ return {
154
+ hcs27,
155
+ hcs28
156
+ };
157
+ }
158
+ function parseAnsAgentCard(input) {
159
+ if (!isObjectRecord(input)) {
160
+ return null;
161
+ }
162
+ const ansName = asString(input["ansName"]);
163
+ const endpoints = input["endpoints"];
164
+ if (!ansName || !isObjectRecord(endpoints)) {
165
+ return null;
166
+ }
167
+ return {
168
+ ansName,
169
+ endpoints,
170
+ transparencyHints: parseTransparencyHints(input["transparency"])
171
+ };
172
+ }
173
+ function selectPreferredEndpoint(candidates, protocol) {
174
+ if (candidates.length === 0) {
175
+ return null;
176
+ }
177
+ const sortedCandidates = [...candidates].sort(
178
+ (a, b) => a.key.localeCompare(b.key)
179
+ );
180
+ const protocolMatches = sortedCandidates.filter(
181
+ (candidate) => hasProtocolPathSegment(candidate.parsedUrl.pathname, protocol)
182
+ );
183
+ if (protocolMatches.length > 0) {
184
+ return protocolMatches[0];
185
+ }
186
+ return sortedCandidates[0];
187
+ }
188
+ function toErrorMessage(error) {
189
+ if (error instanceof Error && error.message) {
190
+ return error.message;
73
191
  }
74
- return entries.length > 0 ? `uaid:${target}:${id};${entries.join(";")}` : `uaid:${target}:${id}`;
192
+ return null;
75
193
  }
76
194
  export {
77
- buildCanonicalUaid,
78
- isFqdn,
79
- normalizeDomain,
80
- normalizeTxtValue,
81
- parseSemicolonFields,
82
- uaidTargetFromParsed
195
+ extractEndpointCandidates,
196
+ isValidAnsProfileVersion,
197
+ normalizeAnsVersion,
198
+ parseAnsAgentCard,
199
+ parseAnsDnsTxtRecord,
200
+ selectPreferredEndpoint,
201
+ toErrorMessage
83
202
  };
84
203
  //# sourceMappingURL=standards-sdk.es159.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es159.js","sources":["../../src/hcs-14/resolvers/profile-utils.ts"],"sourcesContent":["import type { ParsedHcs14Did } from '../types';\n\nconst orderedParamKeys = [\n 'uid',\n 'registry',\n 'proto',\n 'nativeId',\n 'domain',\n 'src',\n] as const;\n\nconst fqdnLabelRegex = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;\n\nexport function uaidTargetFromParsed(parsed: ParsedHcs14Did): 'aid' | 'did' {\n return parsed.method === 'aid' ? 'aid' : 'did';\n}\n\nexport function normalizeDomain(value: string): string {\n return value.trim().replace(/\\.$/, '').toLowerCase();\n}\n\nexport function isFqdn(value: string): boolean {\n const normalized = normalizeDomain(value);\n if (!normalized || normalized.length > 253 || !normalized.includes('.')) {\n return false;\n }\n const labels = normalized.split('.');\n for (const label of labels) {\n if (!label || label.length > 63 || !fqdnLabelRegex.test(label)) {\n return false;\n }\n }\n return true;\n}\n\nexport function normalizeTxtValue(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length >= 2 && trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1);\n }\n const markdownLinkMatch = trimmed.match(/^\\[(.+)\\]\\((.+)\\)$/);\n if (markdownLinkMatch) {\n return markdownLinkMatch[2].trim();\n }\n return trimmed;\n}\n\nexport function parseSemicolonFields(input: string): Record<string, string> {\n const fields: Record<string, string> = {};\n for (const part of input.split(';')) {\n const trimmed = part.trim();\n if (!trimmed) {\n continue;\n }\n const equalsIndex = trimmed.indexOf('=');\n if (equalsIndex <= 0) {\n continue;\n }\n const key = trimmed.slice(0, equalsIndex).trim();\n const value = normalizeTxtValue(trimmed.slice(equalsIndex + 1));\n if (!key || !value) {\n continue;\n }\n fields[key] = value;\n }\n return fields;\n}\n\nexport function buildCanonicalUaid(\n target: 'aid' | 'did',\n id: string,\n params: Record<string, string>,\n): string {\n const entries: string[] = [];\n const usedKeys = new Set<string>();\n\n for (const key of orderedParamKeys) {\n const value = params[key];\n if (value) {\n entries.push(`${key}=${value}`);\n usedKeys.add(key);\n }\n }\n\n const extraKeys = Object.keys(params)\n .filter(key => !usedKeys.has(key) && params[key])\n .sort((a, b) => a.localeCompare(b));\n\n for (const key of extraKeys) {\n entries.push(`${key}=${params[key]}`);\n }\n\n return entries.length > 0\n ? `uaid:${target}:${id};${entries.join(';')}`\n : `uaid:${target}:${id}`;\n}\n\nexport function canonicalizeUaidFromParsed(parsed: ParsedHcs14Did): string {\n return buildCanonicalUaid(\n uaidTargetFromParsed(parsed),\n parsed.id,\n parsed.params,\n );\n}\n"],"names":[],"mappings":"AAEA,MAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,iBAAiB;AAEhB,SAAS,qBAAqB,QAAuC;AAC1E,SAAO,OAAO,WAAW,QAAQ,QAAQ;AAC3C;AAEO,SAAS,gBAAgB,OAAuB;AACrD,SAAO,MAAM,OAAO,QAAQ,OAAO,EAAE,EAAE,YAAA;AACzC;AAEO,SAAS,OAAO,OAAwB;AAC7C,QAAM,aAAa,gBAAgB,KAAK;AACxC,MAAI,CAAC,cAAc,WAAW,SAAS,OAAO,CAAC,WAAW,SAAS,GAAG,GAAG;AACvE,WAAO;AAAA,EACT;AACA,QAAM,SAAS,WAAW,MAAM,GAAG;AACnC,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,SAAS,MAAM,SAAS,MAAM,CAAC,eAAe,KAAK,KAAK,GAAG;AAC9D,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAuB;AACvD,QAAM,UAAU,MAAM,KAAA;AACtB,MAAI,QAAQ,UAAU,KAAK,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AAC3E,WAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC5B;AACA,QAAM,oBAAoB,QAAQ,MAAM,oBAAoB;AAC5D,MAAI,mBAAmB;AACrB,WAAO,kBAAkB,CAAC,EAAE,KAAA;AAAA,EAC9B;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAuC;AAC1E,QAAM,SAAiC,CAAA;AACvC,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAG;AACnC,UAAM,UAAU,KAAK,KAAA;AACrB,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,cAAc,QAAQ,QAAQ,GAAG;AACvC,QAAI,eAAe,GAAG;AACpB;AAAA,IACF;AACA,UAAM,MAAM,QAAQ,MAAM,GAAG,WAAW,EAAE,KAAA;AAC1C,UAAM,QAAQ,kBAAkB,QAAQ,MAAM,cAAc,CAAC,CAAC;AAC9D,QAAI,CAAC,OAAO,CAAC,OAAO;AAClB;AAAA,IACF;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AAEO,SAAS,mBACd,QACA,IACA,QACQ;AACR,QAAM,UAAoB,CAAA;AAC1B,QAAM,+BAAe,IAAA;AAErB,aAAW,OAAO,kBAAkB;AAClC,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,OAAO;AACT,cAAQ,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE;AAC9B,eAAS,IAAI,GAAG;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,KAAK,MAAM,EACjC,OAAO,CAAA,QAAO,CAAC,SAAS,IAAI,GAAG,KAAK,OAAO,GAAG,CAAC,EAC/C,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAEpC,aAAW,OAAO,WAAW;AAC3B,YAAQ,KAAK,GAAG,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE;AAAA,EACtC;AAEA,SAAO,QAAQ,SAAS,IACpB,QAAQ,MAAM,IAAI,EAAE,IAAI,QAAQ,KAAK,GAAG,CAAC,KACzC,QAAQ,MAAM,IAAI,EAAE;AAC1B;"}
1
+ {"version":3,"file":"standards-sdk.es159.js","sources":["../../src/hcs-14/resolvers/ans-dns-web-profile-utils.ts"],"sourcesContent":["import type {\n ProfileResolutionHcs27TransparencyHints,\n ProfileResolutionHcs28TransparencyHints,\n ProfileResolutionTransparencyHints,\n} from './types';\nimport { parseSemicolonFields } from './profile-utils';\n\nexport interface AnsDnsTxtRecord {\n version?: string;\n url: string;\n}\n\nexport interface AnsEndpointCandidate {\n key: string;\n endpointUrl: string;\n parsedUrl: URL;\n}\n\nexport interface ParsedAnsAgentCard {\n ansName: string;\n endpoints: Record<string, unknown>;\n transparencyHints?: ProfileResolutionTransparencyHints;\n}\n\nconst ANS_HCS27_REGISTRY = 'ans';\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction asString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed;\n}\n\nfunction isSemver(value: string): boolean {\n return /^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/.test(\n value,\n );\n}\n\nexport function normalizeAnsVersion(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const withoutPrefix =\n trimmed.startsWith('v') || trimmed.startsWith('V')\n ? trimmed.slice(1)\n : trimmed;\n if (!isSemver(withoutPrefix)) {\n return null;\n }\n return withoutPrefix;\n}\n\nexport function parseAnsDnsTxtRecord(\n rawRecord: string,\n): AnsDnsTxtRecord | null {\n const fields = parseSemicolonFields(rawRecord);\n const version = fields['v'];\n const urlValue = fields['url'];\n if (!version || !urlValue || version.toLowerCase() !== 'ans1') {\n return null;\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(urlValue);\n } catch {\n return null;\n }\n\n if (parsedUrl.protocol.toLowerCase() !== 'https:') {\n return null;\n }\n\n const rawAnsVersion = fields['version'];\n let normalizedAnsVersion: string | undefined;\n if (rawAnsVersion !== undefined) {\n const parsedVersion = normalizeAnsVersion(rawAnsVersion);\n if (!parsedVersion) {\n return null;\n }\n normalizedAnsVersion = parsedVersion;\n }\n\n return {\n version: normalizedAnsVersion,\n url: parsedUrl.toString(),\n };\n}\n\nexport function isValidAnsProfileVersion(value: string | undefined): boolean {\n return !!value && normalizeAnsVersion(value) !== null;\n}\n\nfunction hasProtocolPathSegment(pathname: string, protocol: string): boolean {\n const normalizedProtocol = protocol.trim().toLowerCase();\n if (!normalizedProtocol) {\n return false;\n }\n\n const pathSegments = pathname\n .split('/')\n .map(segment => segment.trim())\n .filter(segment => segment.length > 0);\n for (const segment of pathSegments) {\n if (segment.toLowerCase() === normalizedProtocol) {\n return true;\n }\n }\n return false;\n}\n\nexport function extractEndpointCandidates(\n endpoints: Record<string, unknown>,\n supportedSchemes: Set<string>,\n): AnsEndpointCandidate[] {\n const candidates: AnsEndpointCandidate[] = [];\n for (const [key, value] of Object.entries(endpoints)) {\n if (!isObjectRecord(value)) {\n continue;\n }\n const endpoint = asString(value['url']);\n if (!endpoint) {\n continue;\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(endpoint);\n } catch {\n continue;\n }\n\n const scheme = parsedUrl.protocol.replace(/:$/, '').toLowerCase();\n if (!supportedSchemes.has(scheme)) {\n continue;\n }\n\n candidates.push({\n key,\n endpointUrl: parsedUrl.toString(),\n parsedUrl,\n });\n }\n\n return candidates;\n}\n\nfunction validateAnsHcs27Hints(\n input: unknown,\n): ProfileResolutionHcs27TransparencyHints | undefined {\n if (!isObjectRecord(input)) {\n return undefined;\n }\n const checkpointTopicId = asString(input['checkpoint_topic_id']);\n const registry = asString(input['registry']);\n const logId = asString(input['log_id']);\n if (\n !checkpointTopicId ||\n !registry ||\n !logId ||\n registry !== ANS_HCS27_REGISTRY\n ) {\n return undefined;\n }\n const checkpointUri = asString(input['checkpoint_uri']) ?? undefined;\n const viewerUri = asString(input['viewer_uri']) ?? undefined;\n return {\n checkpointTopicId,\n registry,\n logId,\n checkpointUri,\n viewerUri,\n };\n}\n\nfunction validateHcs28Hints(\n input: unknown,\n): ProfileResolutionHcs28TransparencyHints | undefined {\n if (!isObjectRecord(input)) {\n return undefined;\n }\n const directoryTopicId = asString(input['directory_topic_id']);\n const tId = asString(input['t_id']);\n const agentId = asString(input['agent_id']);\n if (!directoryTopicId || !tId || !agentId) {\n return undefined;\n }\n const proofProfile = asString(input['proof_profile']) ?? undefined;\n return {\n directoryTopicId,\n tId,\n agentId,\n proofProfile,\n };\n}\n\nfunction parseTransparencyHints(\n input: unknown,\n): ProfileResolutionTransparencyHints | undefined {\n if (!isObjectRecord(input)) {\n return undefined;\n }\n const hcs27 = validateAnsHcs27Hints(input['hcs27']);\n const hcs28 = validateHcs28Hints(input['hcs28']);\n if (!hcs27 && !hcs28) {\n return undefined;\n }\n return {\n hcs27,\n hcs28,\n };\n}\n\nexport function parseAnsAgentCard(input: unknown): ParsedAnsAgentCard | null {\n if (!isObjectRecord(input)) {\n return null;\n }\n const ansName = asString(input['ansName']);\n const endpoints = input['endpoints'];\n if (!ansName || !isObjectRecord(endpoints)) {\n return null;\n }\n return {\n ansName,\n endpoints,\n transparencyHints: parseTransparencyHints(input['transparency']),\n };\n}\n\nexport function selectPreferredEndpoint(\n candidates: AnsEndpointCandidate[],\n protocol: string,\n): AnsEndpointCandidate | null {\n if (candidates.length === 0) {\n return null;\n }\n\n const sortedCandidates = [...candidates].sort((a, b) =>\n a.key.localeCompare(b.key),\n );\n const protocolMatches = sortedCandidates.filter(candidate =>\n hasProtocolPathSegment(candidate.parsedUrl.pathname, protocol),\n );\n if (protocolMatches.length > 0) {\n return protocolMatches[0];\n }\n return sortedCandidates[0];\n}\n\nexport function toErrorMessage(error: unknown): string | null {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return null;\n}\n"],"names":[],"mappings":"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"}