@hashgraphonline/standards-sdk 0.1.143 → 0.1.144

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 (185) hide show
  1. package/dist/cjs/hcs-12/validation/schemas.d.ts +8 -8
  2. package/dist/cjs/hcs-21/types.d.ts +75 -75
  3. package/dist/cjs/services/registry-broker/client/adapters.d.ts +20 -0
  4. package/dist/cjs/services/registry-broker/client/adapters.d.ts.map +1 -0
  5. package/dist/cjs/services/registry-broker/client/agents.d.ts +16 -0
  6. package/dist/cjs/services/registry-broker/client/agents.d.ts.map +1 -0
  7. package/dist/cjs/services/registry-broker/client/base-client.d.ts +57 -0
  8. package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -0
  9. package/dist/cjs/services/registry-broker/client/chat-history.d.ts +23 -0
  10. package/dist/cjs/services/registry-broker/client/chat-history.d.ts.map +1 -0
  11. package/dist/cjs/services/registry-broker/client/chat.d.ts +33 -0
  12. package/dist/cjs/services/registry-broker/client/chat.d.ts.map +1 -0
  13. package/dist/cjs/services/registry-broker/client/credits.d.ts +40 -0
  14. package/dist/cjs/services/registry-broker/client/credits.d.ts.map +1 -0
  15. package/dist/cjs/services/registry-broker/client/encrypted-chat-manager.d.ts +35 -0
  16. package/dist/cjs/services/registry-broker/client/encrypted-chat-manager.d.ts.map +1 -0
  17. package/dist/cjs/services/registry-broker/client/encryption.d.ts +33 -0
  18. package/dist/cjs/services/registry-broker/client/encryption.d.ts.map +1 -0
  19. package/dist/cjs/services/registry-broker/client/errors.d.ts +19 -0
  20. package/dist/cjs/services/registry-broker/client/errors.d.ts.map +1 -0
  21. package/dist/cjs/services/registry-broker/client/ledger-auth.d.ts +10 -0
  22. package/dist/cjs/services/registry-broker/client/ledger-auth.d.ts.map +1 -0
  23. package/dist/cjs/services/registry-broker/client/search.d.ts +19 -0
  24. package/dist/cjs/services/registry-broker/client/search.d.ts.map +1 -0
  25. package/dist/cjs/services/registry-broker/client/utils.d.ts +21 -0
  26. package/dist/cjs/services/registry-broker/client/utils.d.ts.map +1 -0
  27. package/dist/cjs/services/registry-broker/client.d.ts +2 -205
  28. package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
  29. package/dist/cjs/services/registry-broker/schemas.d.ts +1426 -154
  30. package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
  31. package/dist/cjs/services/registry-broker/types.d.ts +45 -2
  32. package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
  33. package/dist/cjs/standards-sdk.cjs +3 -3
  34. package/dist/cjs/standards-sdk.cjs.map +1 -1
  35. package/dist/es/hcs-12/validation/schemas.d.ts +8 -8
  36. package/dist/es/hcs-21/types.d.ts +75 -75
  37. package/dist/es/services/registry-broker/client/adapters.d.ts +20 -0
  38. package/dist/es/services/registry-broker/client/adapters.d.ts.map +1 -0
  39. package/dist/es/services/registry-broker/client/agents.d.ts +16 -0
  40. package/dist/es/services/registry-broker/client/agents.d.ts.map +1 -0
  41. package/dist/es/services/registry-broker/client/base-client.d.ts +57 -0
  42. package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -0
  43. package/dist/es/services/registry-broker/client/chat-history.d.ts +23 -0
  44. package/dist/es/services/registry-broker/client/chat-history.d.ts.map +1 -0
  45. package/dist/es/services/registry-broker/client/chat.d.ts +33 -0
  46. package/dist/es/services/registry-broker/client/chat.d.ts.map +1 -0
  47. package/dist/es/services/registry-broker/client/credits.d.ts +40 -0
  48. package/dist/es/services/registry-broker/client/credits.d.ts.map +1 -0
  49. package/dist/es/services/registry-broker/client/encrypted-chat-manager.d.ts +35 -0
  50. package/dist/es/services/registry-broker/client/encrypted-chat-manager.d.ts.map +1 -0
  51. package/dist/es/services/registry-broker/client/encryption.d.ts +33 -0
  52. package/dist/es/services/registry-broker/client/encryption.d.ts.map +1 -0
  53. package/dist/es/services/registry-broker/client/errors.d.ts +19 -0
  54. package/dist/es/services/registry-broker/client/errors.d.ts.map +1 -0
  55. package/dist/es/services/registry-broker/client/ledger-auth.d.ts +10 -0
  56. package/dist/es/services/registry-broker/client/ledger-auth.d.ts.map +1 -0
  57. package/dist/es/services/registry-broker/client/search.d.ts +19 -0
  58. package/dist/es/services/registry-broker/client/search.d.ts.map +1 -0
  59. package/dist/es/services/registry-broker/client/utils.d.ts +21 -0
  60. package/dist/es/services/registry-broker/client/utils.d.ts.map +1 -0
  61. package/dist/es/services/registry-broker/client.d.ts +2 -205
  62. package/dist/es/services/registry-broker/client.d.ts.map +1 -1
  63. package/dist/es/services/registry-broker/schemas.d.ts +1426 -154
  64. package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
  65. package/dist/es/services/registry-broker/types.d.ts +45 -2
  66. package/dist/es/services/registry-broker/types.d.ts.map +1 -1
  67. package/dist/es/standards-sdk.es.js +16 -7
  68. package/dist/es/standards-sdk.es.js.map +1 -1
  69. package/dist/es/standards-sdk.es100.js +1 -1
  70. package/dist/es/standards-sdk.es102.js +1 -1
  71. package/dist/es/standards-sdk.es104.js +1 -1
  72. package/dist/es/standards-sdk.es110.js +11 -5
  73. package/dist/es/standards-sdk.es110.js.map +1 -1
  74. package/dist/es/standards-sdk.es111.js +5 -5
  75. package/dist/es/standards-sdk.es12.js +1 -1
  76. package/dist/es/standards-sdk.es121.js +1 -1
  77. package/dist/es/standards-sdk.es122.js +1 -1
  78. package/dist/es/standards-sdk.es123.js +5 -5
  79. package/dist/es/standards-sdk.es125.js +1 -1
  80. package/dist/es/standards-sdk.es126.js +1 -1
  81. package/dist/es/standards-sdk.es128.js +140 -2176
  82. package/dist/es/standards-sdk.es128.js.map +1 -1
  83. package/dist/es/standards-sdk.es129.js +200 -60
  84. package/dist/es/standards-sdk.es129.js.map +1 -1
  85. package/dist/es/standards-sdk.es13.js +1 -1
  86. package/dist/es/standards-sdk.es130.js +96 -79
  87. package/dist/es/standards-sdk.es130.js.map +1 -1
  88. package/dist/es/standards-sdk.es131.js +115 -153
  89. package/dist/es/standards-sdk.es131.js.map +1 -1
  90. package/dist/es/standards-sdk.es132.js +248 -8
  91. package/dist/es/standards-sdk.es132.js.map +1 -1
  92. package/dist/es/standards-sdk.es133.js +169 -75
  93. package/dist/es/standards-sdk.es133.js.map +1 -1
  94. package/dist/es/standards-sdk.es134.js +118 -61
  95. package/dist/es/standards-sdk.es134.js.map +1 -1
  96. package/dist/es/standards-sdk.es135.js +327 -29
  97. package/dist/es/standards-sdk.es135.js.map +1 -1
  98. package/dist/es/standards-sdk.es136.js +352 -124
  99. package/dist/es/standards-sdk.es136.js.map +1 -1
  100. package/dist/es/standards-sdk.es137.js +13 -38
  101. package/dist/es/standards-sdk.es137.js.map +1 -1
  102. package/dist/es/standards-sdk.es138.js +66 -765
  103. package/dist/es/standards-sdk.es138.js.map +1 -1
  104. package/dist/es/standards-sdk.es139.js +74 -12261
  105. package/dist/es/standards-sdk.es139.js.map +1 -1
  106. package/dist/es/standards-sdk.es140.js +152 -49
  107. package/dist/es/standards-sdk.es140.js.map +1 -1
  108. package/dist/es/standards-sdk.es141.js +7 -82
  109. package/dist/es/standards-sdk.es141.js.map +1 -1
  110. package/dist/es/standards-sdk.es142.js +81 -12
  111. package/dist/es/standards-sdk.es142.js.map +1 -1
  112. package/dist/es/standards-sdk.es143.js +55 -162
  113. package/dist/es/standards-sdk.es143.js.map +1 -1
  114. package/dist/es/standards-sdk.es144.js +28 -322
  115. package/dist/es/standards-sdk.es144.js.map +1 -1
  116. package/dist/es/standards-sdk.es145.js +120 -328
  117. package/dist/es/standards-sdk.es145.js.map +1 -1
  118. package/dist/es/standards-sdk.es146.js +40 -451
  119. package/dist/es/standards-sdk.es146.js.map +1 -1
  120. package/dist/es/standards-sdk.es147.js +12225 -267
  121. package/dist/es/standards-sdk.es147.js.map +1 -1
  122. package/dist/es/standards-sdk.es148.js +15 -74
  123. package/dist/es/standards-sdk.es148.js.map +1 -1
  124. package/dist/es/standards-sdk.es149.js +59 -0
  125. package/dist/es/standards-sdk.es149.js.map +1 -0
  126. package/dist/es/standards-sdk.es150.js +85 -0
  127. package/dist/es/standards-sdk.es150.js.map +1 -0
  128. package/dist/es/standards-sdk.es151.js +175 -0
  129. package/dist/es/standards-sdk.es151.js.map +1 -0
  130. package/dist/es/standards-sdk.es152.js +325 -0
  131. package/dist/es/standards-sdk.es152.js.map +1 -0
  132. package/dist/es/standards-sdk.es153.js +349 -0
  133. package/dist/es/standards-sdk.es153.js.map +1 -0
  134. package/dist/es/standards-sdk.es154.js +456 -0
  135. package/dist/es/standards-sdk.es154.js.map +1 -0
  136. package/dist/es/standards-sdk.es155.js +334 -0
  137. package/dist/es/standards-sdk.es155.js.map +1 -0
  138. package/dist/es/standards-sdk.es156.js +79 -0
  139. package/dist/es/standards-sdk.es156.js.map +1 -0
  140. package/dist/es/standards-sdk.es157.js +874 -0
  141. package/dist/es/standards-sdk.es157.js.map +1 -0
  142. package/dist/es/standards-sdk.es158.js +242 -0
  143. package/dist/es/standards-sdk.es158.js.map +1 -0
  144. package/dist/es/standards-sdk.es159.js +247 -0
  145. package/dist/es/standards-sdk.es159.js.map +1 -0
  146. package/dist/es/standards-sdk.es17.js +11 -5
  147. package/dist/es/standards-sdk.es17.js.map +1 -1
  148. package/dist/es/standards-sdk.es19.js +14 -9
  149. package/dist/es/standards-sdk.es19.js.map +1 -1
  150. package/dist/es/standards-sdk.es20.js +12 -7
  151. package/dist/es/standards-sdk.es20.js.map +1 -1
  152. package/dist/es/standards-sdk.es23.js +1 -1
  153. package/dist/es/standards-sdk.es28.js +14 -9
  154. package/dist/es/standards-sdk.es28.js.map +1 -1
  155. package/dist/es/standards-sdk.es31.js +1 -1
  156. package/dist/es/standards-sdk.es32.js +1 -1
  157. package/dist/es/standards-sdk.es36.js +11 -6
  158. package/dist/es/standards-sdk.es36.js.map +1 -1
  159. package/dist/es/standards-sdk.es37.js +3 -3
  160. package/dist/es/standards-sdk.es38.js +1 -1
  161. package/dist/es/standards-sdk.es5.js +1 -1
  162. package/dist/es/standards-sdk.es54.js +1 -1
  163. package/dist/es/standards-sdk.es57.js +1 -1
  164. package/dist/es/standards-sdk.es59.js +1 -1
  165. package/dist/es/standards-sdk.es60.js +1 -1
  166. package/dist/es/standards-sdk.es61.js +12 -7
  167. package/dist/es/standards-sdk.es61.js.map +1 -1
  168. package/dist/es/standards-sdk.es63.js +1 -1
  169. package/dist/es/standards-sdk.es65.js +1 -1
  170. package/dist/es/standards-sdk.es66.js +2 -2
  171. package/dist/es/standards-sdk.es69.js +2 -2
  172. package/dist/es/standards-sdk.es70.js +1 -1
  173. package/dist/es/standards-sdk.es72.js +1 -1
  174. package/dist/es/standards-sdk.es77.js +1 -1
  175. package/dist/es/standards-sdk.es78.js +11 -5
  176. package/dist/es/standards-sdk.es78.js.map +1 -1
  177. package/dist/es/standards-sdk.es79.js +1 -1
  178. package/dist/es/standards-sdk.es8.js +1 -1
  179. package/dist/es/standards-sdk.es82.js +1 -1
  180. package/dist/es/standards-sdk.es84.js +1 -1
  181. package/dist/es/standards-sdk.es88.js +1 -1
  182. package/dist/es/standards-sdk.es92.js +1 -1
  183. package/dist/es/standards-sdk.es93.js +1 -1
  184. package/dist/es/standards-sdk.es98.js +1 -1
  185. package/package.json +11 -12
@@ -1,141 +1,369 @@
1
- import { AccountId, Client, PrivateKey } from "@hashgraph/sdk";
2
- import { detectKeyTypeFromString } from "./standards-sdk.es114.js";
3
- class NodeOperatorResolver {
4
- constructor(params) {
5
- this.mirror = params.mirrorNode;
6
- this.logger = params.logger;
7
- }
8
- /**
9
- * Best-guess parsing for an operator key without network calls.
10
- * - If PrivateKey: returns immediately with provided or fallback type.
11
- * - If string with explicitType: parse directly.
12
- * - If string without type: detect format; fallback to ECDSA.
13
- */
14
- bestGuessOperatorKey(operatorKeyInput, explicitType) {
15
- if (typeof operatorKeyInput !== "string") {
16
- return { keyType: explicitType || "ecdsa", privateKey: operatorKeyInput };
17
- }
18
- if (explicitType) {
19
- const pk = explicitType === "ed25519" ? PrivateKey.fromStringED25519(operatorKeyInput) : PrivateKey.fromStringECDSA(operatorKeyInput);
20
- return { keyType: explicitType, privateKey: pk };
1
+ import { Buffer } from "buffer";
2
+ import { randomBytes, createHash, createCipheriv, createDecipheriv } from "crypto";
3
+ import { secp256k1 } from "@noble/curves/secp256k1.js";
4
+ import { ZodError } from "zod";
5
+ import { DEFAULT_BASE_URL, normaliseBaseUrl, normaliseHeaderName, isBrowserRuntime, DEFAULT_USER_AGENT, JSON_CONTENT_TYPE, createAbortError, isJsonObject, DEFAULT_HISTORY_TOP_UP_HBAR } from "./standards-sdk.es158.js";
6
+ import { RegistryBrokerError, RegistryBrokerParseError } from "./standards-sdk.es137.js";
7
+ class RegistryBrokerClient {
8
+ constructor(options = {}) {
9
+ this.encryptionBootstrapPromise = null;
10
+ const {
11
+ baseUrl = DEFAULT_BASE_URL,
12
+ fetchImplementation,
13
+ defaultHeaders,
14
+ apiKey,
15
+ ledgerApiKey,
16
+ registrationAutoTopUp,
17
+ historyAutoTopUp,
18
+ encryption
19
+ } = options;
20
+ this.baseUrl = normaliseBaseUrl(baseUrl);
21
+ this.fetchImpl = fetchImplementation ?? fetch;
22
+ this.defaultHeaders = {
23
+ ...defaultHeaders ?? {}
24
+ };
25
+ Object.entries(this.defaultHeaders).forEach(([key, value]) => {
26
+ const headerName = normaliseHeaderName(key);
27
+ if (headerName !== key) {
28
+ delete this.defaultHeaders[key];
29
+ this.defaultHeaders[headerName] = value;
30
+ }
31
+ });
32
+ if (apiKey) {
33
+ this.defaultHeaders["x-api-key"] = apiKey;
21
34
  }
22
- try {
23
- const detected = detectKeyTypeFromString(operatorKeyInput);
24
- return {
25
- keyType: detected.detectedType,
26
- privateKey: detected.privateKey
27
- };
28
- } catch {
29
- return {
30
- keyType: "ecdsa",
31
- privateKey: PrivateKey.fromStringECDSA(operatorKeyInput)
32
- };
35
+ if (ledgerApiKey) {
36
+ this.defaultHeaders["x-ledger-api-key"] = ledgerApiKey;
37
+ }
38
+ this.registrationAutoTopUp = registrationAutoTopUp;
39
+ this.historyAutoTopUp = historyAutoTopUp;
40
+ this.encryptionOptions = encryption;
41
+ if (this.encryptionOptions) {
42
+ this.encryptionBootstrapPromise = this.initializeEncryptionBootstrap(
43
+ this.encryptionOptions
44
+ );
33
45
  }
34
46
  }
35
- /**
36
- * Resolve an operator key using Mirror Node for key type when possible.
37
- * - If PrivateKey: return immediately.
38
- * - If explicitType: parse directly.
39
- * - Else: query Mirror Node; fallback to local detection.
40
- */
41
- async resolveOperatorKey(operatorId, operatorKeyInput, explicitType) {
42
- if (typeof operatorKeyInput !== "string") {
43
- return { keyType: explicitType || "ecdsa", privateKey: operatorKeyInput };
47
+ static async initializeAgent(options) {
48
+ const { uaid, ensureEncryptionKey = true, ...clientOptions } = options;
49
+ const client = new RegistryBrokerClient(clientOptions);
50
+ let encryption = null;
51
+ if (ensureEncryptionKey) {
52
+ const ensureOptions = typeof ensureEncryptionKey === "object" ? ensureEncryptionKey : { generateIfMissing: true };
53
+ encryption = await client.encryption.ensureAgentKey({
54
+ uaid,
55
+ ...ensureOptions
56
+ });
44
57
  }
45
- if (explicitType) {
46
- const pk = explicitType === "ed25519" ? PrivateKey.fromStringED25519(operatorKeyInput) : PrivateKey.fromStringECDSA(operatorKeyInput);
47
- return { keyType: explicitType, privateKey: pk };
58
+ return { client, encryption };
59
+ }
60
+ setApiKey(apiKey) {
61
+ this.setDefaultHeader("x-api-key", apiKey);
62
+ }
63
+ setLedgerApiKey(apiKey) {
64
+ this.setDefaultHeader("x-ledger-api-key", apiKey);
65
+ }
66
+ setDefaultHeader(name, value) {
67
+ if (!name || name.trim().length === 0) {
68
+ return;
48
69
  }
49
- const account = typeof operatorId === "string" ? operatorId : operatorId.toString();
50
- try {
51
- const info = await this.mirror.requestAccount(account);
52
- const t = info?.key?._type || "";
53
- const keyType = t.includes("ED25519") ? "ed25519" : "ecdsa";
54
- const privateKey = keyType === "ed25519" ? PrivateKey.fromStringED25519(operatorKeyInput) : PrivateKey.fromStringECDSA(operatorKeyInput);
55
- return { keyType, privateKey };
56
- } catch {
57
- this.logger.warn(
58
- "Mirror node key detection failed; using local detection or default ECDSA"
59
- );
60
- return this.bestGuessOperatorKey(operatorKeyInput);
70
+ const headerName = normaliseHeaderName(name);
71
+ if (!value || value.trim().length === 0) {
72
+ delete this.defaultHeaders[headerName];
73
+ return;
61
74
  }
75
+ this.defaultHeaders[headerName] = value.trim();
62
76
  }
63
- /**
64
- * Resolve a supply key for the given token using Mirror Node token supply_key._type when possible.
65
- */
66
- async resolveSupplyKey(tokenId, keyInput, fallbackType, explicitType) {
67
- try {
68
- const info = await this.mirror.getTokenInfo(tokenId);
69
- const t = info?.supply_key?._type || "";
70
- if (typeof keyInput !== "string") {
71
- return keyInput;
72
- }
73
- if (explicitType) {
74
- return explicitType === "ed25519" ? PrivateKey.fromStringED25519(keyInput) : PrivateKey.fromStringECDSA(keyInput);
75
- }
76
- if (t.includes("ED25519")) {
77
- return PrivateKey.fromStringED25519(keyInput);
78
- }
79
- if (t.includes("ECDSA")) {
80
- return PrivateKey.fromStringECDSA(keyInput);
81
- }
82
- return fallbackType === "ed25519" ? PrivateKey.fromStringED25519(keyInput) : PrivateKey.fromStringECDSA(keyInput);
83
- } catch {
84
- if (typeof keyInput !== "string") {
85
- return keyInput;
77
+ getDefaultHeaders() {
78
+ return { ...this.defaultHeaders };
79
+ }
80
+ async encryptionReady() {
81
+ if (!this.encryptionBootstrapPromise) {
82
+ return;
83
+ }
84
+ await this.encryptionBootstrapPromise;
85
+ }
86
+ buildUrl(path) {
87
+ const normalisedPath = path.startsWith("/") ? path : `/${path}`;
88
+ return `${this.baseUrl}${normalisedPath}`;
89
+ }
90
+ async request(path, config) {
91
+ const headers = new Headers();
92
+ Object.entries(this.defaultHeaders).forEach(([key, value]) => {
93
+ headers.set(key, value);
94
+ });
95
+ if (config.headers) {
96
+ Object.entries(config.headers).forEach(([key, value]) => {
97
+ headers.set(key, value);
98
+ });
99
+ }
100
+ if (!headers.has("accept")) {
101
+ headers.set("accept", "application/json");
102
+ }
103
+ if (!headers.has("user-agent") && !isBrowserRuntime()) {
104
+ headers.set("user-agent", DEFAULT_USER_AGENT);
105
+ }
106
+ const init = {
107
+ method: config.method ?? "GET",
108
+ headers
109
+ };
110
+ if (config.body !== void 0) {
111
+ init.body = JSON.stringify(config.body);
112
+ if (!headers.has("content-type")) {
113
+ headers.set("content-type", "application/json");
86
114
  }
87
- if (explicitType) {
88
- return explicitType === "ed25519" ? PrivateKey.fromStringED25519(keyInput) : PrivateKey.fromStringECDSA(keyInput);
115
+ }
116
+ const response = await this.fetchImpl(this.buildUrl(path), init);
117
+ if (response.ok) {
118
+ return response;
119
+ }
120
+ const errorBody = await this.extractErrorBody(response);
121
+ throw new RegistryBrokerError("Registry broker request failed", {
122
+ status: response.status,
123
+ statusText: response.statusText,
124
+ body: errorBody
125
+ });
126
+ }
127
+ async requestJson(path, config) {
128
+ const response = await this.request(path, config);
129
+ const contentType = response.headers?.get("content-type") ?? "";
130
+ if (!JSON_CONTENT_TYPE.test(contentType)) {
131
+ const body = await response.text();
132
+ throw new RegistryBrokerParseError(
133
+ "Expected JSON response from registry broker",
134
+ body
135
+ );
136
+ }
137
+ return await response.json();
138
+ }
139
+ async extractErrorBody(response) {
140
+ const contentType = response.headers?.get("content-type") ?? "";
141
+ if (JSON_CONTENT_TYPE.test(contentType)) {
142
+ try {
143
+ return await response.json();
144
+ } catch (error) {
145
+ return { parseError: String(error) };
89
146
  }
90
- return fallbackType === "ed25519" ? PrivateKey.fromStringED25519(keyInput) : PrivateKey.fromStringECDSA(keyInput);
147
+ }
148
+ try {
149
+ return await response.text();
150
+ } catch (error) {
151
+ return { parseError: String(error) };
91
152
  }
92
153
  }
93
- }
94
- function createNodeOperatorContext(params) {
95
- const operatorId = typeof params.operatorId === "string" ? AccountId.fromString(params.operatorId) : params.operatorId;
96
- const client = params.client ? params.client : params.network === "mainnet" ? Client.forMainnet() : Client.forTestnet();
97
- const resolver = new NodeOperatorResolver({
98
- mirrorNode: params.mirrorNode,
99
- logger: params.logger
100
- });
101
- let currentKeyType;
102
- let currentPrivateKey;
103
- const guess = resolver.bestGuessOperatorKey(
104
- params.operatorKey,
105
- params.keyType
106
- );
107
- currentKeyType = guess.keyType;
108
- currentPrivateKey = guess.privateKey;
109
- client.setOperator(operatorId.toString(), currentPrivateKey);
110
- const initPromise = (async () => {
154
+ parseWithSchema(value, schema, context) {
111
155
  try {
112
- const resolved = await resolver.resolveOperatorKey(
113
- operatorId,
114
- params.operatorKey,
115
- params.keyType
156
+ return schema.parse(value);
157
+ } catch (error) {
158
+ throw new RegistryBrokerParseError(
159
+ `Failed to parse ${context}`,
160
+ error instanceof ZodError || error instanceof Error ? error : String(error),
161
+ value
116
162
  );
117
- currentKeyType = resolved.keyType;
118
- currentPrivateKey = resolved.privateKey;
119
- client.setOperator(operatorId.toString(), currentPrivateKey);
120
- } catch {
121
- }
122
- })();
123
- return {
124
- client,
125
- operatorId,
126
- get operatorKey() {
127
- return currentPrivateKey;
128
- },
129
- get keyType() {
130
- return currentKeyType;
131
- },
132
- ensureInitialized: async () => {
133
- await initPromise;
134
- }
135
- };
163
+ }
164
+ }
165
+ async delay(ms, signal) {
166
+ if (ms <= 0) {
167
+ if (signal?.aborted) {
168
+ throw createAbortError();
169
+ }
170
+ return;
171
+ }
172
+ await new Promise((resolve, reject) => {
173
+ const timer = setTimeout(() => {
174
+ if (signal) {
175
+ signal.removeEventListener("abort", onAbort);
176
+ }
177
+ resolve();
178
+ }, ms);
179
+ const onAbort = () => {
180
+ clearTimeout(timer);
181
+ signal?.removeEventListener("abort", onAbort);
182
+ reject(createAbortError());
183
+ };
184
+ if (signal) {
185
+ if (signal.aborted) {
186
+ clearTimeout(timer);
187
+ reject(createAbortError());
188
+ return;
189
+ }
190
+ signal.addEventListener("abort", onAbort, { once: true });
191
+ }
192
+ });
193
+ }
194
+ assertNodeRuntime(feature) {
195
+ if (typeof process === "undefined" || !process.versions?.node) {
196
+ throw new Error(`${feature} is only available in Node.js environments`);
197
+ }
198
+ }
199
+ createEphemeralKeyPair() {
200
+ this.assertNodeRuntime("generateEphemeralKeyPair");
201
+ const privateKeyBytes = randomBytes(32);
202
+ const publicKey = secp256k1.getPublicKey(privateKeyBytes, true);
203
+ return {
204
+ privateKey: Buffer.from(privateKeyBytes).toString("hex"),
205
+ publicKey: Buffer.from(publicKey).toString("hex")
206
+ };
207
+ }
208
+ deriveSharedSecret(options) {
209
+ this.assertNodeRuntime("deriveSharedSecret");
210
+ const privateKey = this.hexToBuffer(options.privateKey);
211
+ const peerPublicKey = this.hexToBuffer(options.peerPublicKey);
212
+ const shared = secp256k1.getSharedSecret(privateKey, peerPublicKey, true);
213
+ return createHash("sha256").update(Buffer.from(shared)).digest();
214
+ }
215
+ buildCipherEnvelope(options) {
216
+ this.assertNodeRuntime("encryptCipherEnvelope");
217
+ const sharedSecret = this.normalizeSharedSecret(options.sharedSecret);
218
+ const iv = randomBytes(12);
219
+ const cipher = createCipheriv("aes-256-gcm", sharedSecret, iv);
220
+ const aadSource = options.associatedData ?? options.sessionId;
221
+ const associatedDataEncoded = aadSource ? Buffer.from(aadSource, "utf8").toString("base64") : void 0;
222
+ if (aadSource) {
223
+ cipher.setAAD(Buffer.from(aadSource, "utf8"));
224
+ }
225
+ const ciphertext = Buffer.concat([
226
+ cipher.update(Buffer.from(options.plaintext, "utf8")),
227
+ cipher.final()
228
+ ]);
229
+ const tag = cipher.getAuthTag();
230
+ const payload = Buffer.concat([ciphertext, tag]);
231
+ return {
232
+ algorithm: "aes-256-gcm",
233
+ ciphertext: payload.toString("base64"),
234
+ nonce: iv.toString("base64"),
235
+ associatedData: associatedDataEncoded,
236
+ keyLocator: {
237
+ sessionId: options.sessionId,
238
+ revision: options.revision ?? 1
239
+ },
240
+ recipients: options.recipients.map((recipient) => ({
241
+ ...recipient,
242
+ encryptedShare: ""
243
+ }))
244
+ };
245
+ }
246
+ openCipherEnvelope(options) {
247
+ this.assertNodeRuntime("decryptCipherEnvelope");
248
+ const sharedSecret = this.normalizeSharedSecret(options.sharedSecret);
249
+ const payload = Buffer.from(options.envelope.ciphertext, "base64");
250
+ const nonce = Buffer.from(options.envelope.nonce, "base64");
251
+ const ciphertext = payload.slice(0, payload.length - 16);
252
+ const tag = payload.slice(payload.length - 16);
253
+ const decipher = createDecipheriv("aes-256-gcm", sharedSecret, nonce);
254
+ if (options.envelope.associatedData) {
255
+ decipher.setAAD(Buffer.from(options.envelope.associatedData, "base64"));
256
+ }
257
+ decipher.setAuthTag(tag);
258
+ const plaintext = Buffer.concat([
259
+ decipher.update(ciphertext),
260
+ decipher.final()
261
+ ]);
262
+ return plaintext.toString(options.encoding ?? "utf8");
263
+ }
264
+ normalizeSharedSecret(input) {
265
+ if (Buffer.isBuffer(input)) {
266
+ return Buffer.from(input);
267
+ }
268
+ if (input instanceof Uint8Array) {
269
+ return Buffer.from(input);
270
+ }
271
+ if (typeof input === "string") {
272
+ return this.bufferFromString(input);
273
+ }
274
+ throw new Error("Unsupported shared secret input");
275
+ }
276
+ bufferFromString(value) {
277
+ const trimmed = value.trim();
278
+ if (!trimmed) {
279
+ throw new Error("sharedSecret string cannot be empty");
280
+ }
281
+ const normalized = trimmed.startsWith("0x") ? trimmed.slice(2) : trimmed;
282
+ if (/^[0-9a-fA-F]+$/.test(normalized) && normalized.length % 2 === 0) {
283
+ return Buffer.from(normalized, "hex");
284
+ }
285
+ return Buffer.from(trimmed, "base64");
286
+ }
287
+ hexToBuffer(value) {
288
+ const normalized = value.startsWith("0x") ? value.slice(2) : value;
289
+ if (!/^[0-9a-fA-F]+$/.test(normalized) || normalized.length % 2 !== 0) {
290
+ throw new Error("Expected hex-encoded value");
291
+ }
292
+ return Buffer.from(normalized, "hex");
293
+ }
294
+ extractInsufficientCreditsDetails(error) {
295
+ if (!(error instanceof RegistryBrokerError) || error.status !== 402) {
296
+ return null;
297
+ }
298
+ const body = error.body;
299
+ if (!body || typeof body !== "object" || Array.isArray(body)) {
300
+ return null;
301
+ }
302
+ const maybeShortfall = body["shortfallCredits"];
303
+ if (typeof maybeShortfall !== "number" || maybeShortfall <= 0) {
304
+ return null;
305
+ }
306
+ return { shortfallCredits: maybeShortfall };
307
+ }
308
+ extractErrorMessage(body) {
309
+ if (typeof body === "string") {
310
+ return body;
311
+ }
312
+ if (isJsonObject(body) && typeof body.error === "string") {
313
+ return body.error;
314
+ }
315
+ if (isJsonObject(body) && typeof body.message === "string") {
316
+ return body.message;
317
+ }
318
+ return void 0;
319
+ }
320
+ shouldAutoTopUpHistory(payload, error) {
321
+ if (!this.historyAutoTopUp || payload.historyTtlSeconds === void 0) {
322
+ return false;
323
+ }
324
+ if (!(error instanceof RegistryBrokerError)) {
325
+ return false;
326
+ }
327
+ if (error.status !== 402) {
328
+ return false;
329
+ }
330
+ const message = this.extractErrorMessage(error.body);
331
+ if (!message) {
332
+ return true;
333
+ }
334
+ const normalised = message.toLowerCase();
335
+ return normalised.includes("history") || normalised.includes("chat history");
336
+ }
337
+ async executeHistoryAutoTopUp(reason) {
338
+ if (!this.historyAutoTopUp) {
339
+ return;
340
+ }
341
+ const hbarAmount = this.historyAutoTopUp.hbarAmount && this.historyAutoTopUp.hbarAmount > 0 ? this.historyAutoTopUp.hbarAmount : DEFAULT_HISTORY_TOP_UP_HBAR;
342
+ await this.purchaseCreditsWithHbar({
343
+ accountId: this.historyAutoTopUp.accountId,
344
+ privateKey: this.historyAutoTopUp.privateKey,
345
+ hbarAmount,
346
+ memo: this.historyAutoTopUp.memo ?? "registry-broker-client:chat-history-topup",
347
+ metadata: {
348
+ purpose: "chat-history",
349
+ reason
350
+ }
351
+ });
352
+ }
353
+ initializeEncryptionBootstrap(options) {
354
+ return this.bootstrapEncryptionOptions(options).then(() => void 0);
355
+ }
356
+ bootstrapEncryptionOptions(_options) {
357
+ return Promise.resolve(null);
358
+ }
136
359
  }
360
+ const isPendingRegisterAgentResponse = (response) => response.status === "pending";
361
+ const isPartialRegisterAgentResponse = (response) => response.status === "partial" && response.success === false;
362
+ const isSuccessRegisterAgentResponse = (response) => response.success === true && response.status !== "pending";
137
363
  export {
138
- NodeOperatorResolver,
139
- createNodeOperatorContext
364
+ RegistryBrokerClient,
365
+ isPartialRegisterAgentResponse,
366
+ isPendingRegisterAgentResponse,
367
+ isSuccessRegisterAgentResponse
140
368
  };
141
369
  //# sourceMappingURL=standards-sdk.es136.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es136.js","sources":["../../src/common/node-operator-resolver.ts"],"sourcesContent":["import { AccountId, Client, PrivateKey } from '@hashgraph/sdk';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { ILogger } from '../utils/logger';\nimport { detectKeyTypeFromString } from '../utils/key-type-detector';\nimport { NetworkType } from '../utils/types';\n\n/**\n * Resolves operator and supply private keys using Mirror Node as source of truth\n * with format-detection fallbacks for string keys.\n */\nexport class NodeOperatorResolver {\n private readonly mirror: HederaMirrorNode;\n private readonly logger: ILogger;\n\n constructor(params: { mirrorNode: HederaMirrorNode; logger: ILogger }) {\n this.mirror = params.mirrorNode;\n this.logger = params.logger;\n }\n\n /**\n * Best-guess parsing for an operator key without network calls.\n * - If PrivateKey: returns immediately with provided or fallback type.\n * - If string with explicitType: parse directly.\n * - If string without type: detect format; fallback to ECDSA.\n */\n bestGuessOperatorKey(\n operatorKeyInput: string | PrivateKey,\n explicitType?: 'ed25519' | 'ecdsa',\n ): { keyType: 'ed25519' | 'ecdsa'; privateKey: PrivateKey } {\n if (typeof operatorKeyInput !== 'string') {\n return { keyType: explicitType || 'ecdsa', privateKey: operatorKeyInput };\n }\n if (explicitType) {\n const pk =\n explicitType === 'ed25519'\n ? PrivateKey.fromStringED25519(operatorKeyInput)\n : PrivateKey.fromStringECDSA(operatorKeyInput);\n return { keyType: explicitType, privateKey: pk };\n }\n try {\n const detected = detectKeyTypeFromString(operatorKeyInput);\n return {\n keyType: detected.detectedType,\n privateKey: detected.privateKey,\n };\n } catch {\n return {\n keyType: 'ecdsa',\n privateKey: PrivateKey.fromStringECDSA(operatorKeyInput),\n };\n }\n }\n\n /**\n * Resolve an operator key using Mirror Node for key type when possible.\n * - If PrivateKey: return immediately.\n * - If explicitType: parse directly.\n * - Else: query Mirror Node; fallback to local detection.\n */\n async resolveOperatorKey(\n operatorId: string | AccountId,\n operatorKeyInput: string | PrivateKey,\n explicitType?: 'ed25519' | 'ecdsa',\n ): Promise<{ keyType: 'ed25519' | 'ecdsa'; privateKey: PrivateKey }> {\n if (typeof operatorKeyInput !== 'string') {\n return { keyType: explicitType || 'ecdsa', privateKey: operatorKeyInput };\n }\n if (explicitType) {\n const pk =\n explicitType === 'ed25519'\n ? PrivateKey.fromStringED25519(operatorKeyInput)\n : PrivateKey.fromStringECDSA(operatorKeyInput);\n return { keyType: explicitType, privateKey: pk };\n }\n const account =\n typeof operatorId === 'string' ? operatorId : operatorId.toString();\n try {\n const info = await this.mirror.requestAccount(account);\n const t = info?.key?._type || '';\n const keyType: 'ed25519' | 'ecdsa' = t.includes('ED25519')\n ? 'ed25519'\n : 'ecdsa';\n const privateKey =\n keyType === 'ed25519'\n ? PrivateKey.fromStringED25519(operatorKeyInput)\n : PrivateKey.fromStringECDSA(operatorKeyInput);\n return { keyType, privateKey };\n } catch {\n this.logger.warn(\n 'Mirror node key detection failed; using local detection or default ECDSA',\n );\n return this.bestGuessOperatorKey(operatorKeyInput);\n }\n }\n\n /**\n * Resolve a supply key for the given token using Mirror Node token supply_key._type when possible.\n */\n async resolveSupplyKey(\n tokenId: string,\n keyInput: string | PrivateKey,\n fallbackType: 'ed25519' | 'ecdsa',\n explicitType?: 'ed25519' | 'ecdsa',\n ): Promise<PrivateKey> {\n try {\n const info = await this.mirror.getTokenInfo(tokenId);\n const t = info?.supply_key?._type || '';\n if (typeof keyInput !== 'string') {\n return keyInput;\n }\n if (explicitType) {\n return explicitType === 'ed25519'\n ? PrivateKey.fromStringED25519(keyInput)\n : PrivateKey.fromStringECDSA(keyInput);\n }\n if (t.includes('ED25519')) {\n return PrivateKey.fromStringED25519(keyInput);\n }\n if (t.includes('ECDSA')) {\n return PrivateKey.fromStringECDSA(keyInput);\n }\n return fallbackType === 'ed25519'\n ? PrivateKey.fromStringED25519(keyInput)\n : PrivateKey.fromStringECDSA(keyInput);\n } catch {\n if (typeof keyInput !== 'string') {\n return keyInput;\n }\n if (explicitType) {\n return explicitType === 'ed25519'\n ? PrivateKey.fromStringED25519(keyInput)\n : PrivateKey.fromStringECDSA(keyInput);\n }\n return fallbackType === 'ed25519'\n ? PrivateKey.fromStringED25519(keyInput)\n : PrivateKey.fromStringECDSA(keyInput);\n }\n }\n}\n\nexport interface NodeOperatorInitParams {\n network: NetworkType;\n operatorId: string | AccountId;\n operatorKey: string | PrivateKey;\n keyType?: 'ed25519' | 'ecdsa';\n mirrorNode: HederaMirrorNode;\n logger: ILogger;\n client?: Client;\n}\n\nexport interface NodeOperatorContext {\n client: Client;\n operatorId: AccountId;\n readonly operatorKey: PrivateKey;\n readonly keyType: 'ed25519' | 'ecdsa';\n ensureInitialized(): Promise<void>;\n}\n\nexport function createNodeOperatorContext(\n params: NodeOperatorInitParams,\n): NodeOperatorContext {\n const operatorId: AccountId =\n typeof params.operatorId === 'string'\n ? AccountId.fromString(params.operatorId)\n : params.operatorId;\n\n const client: Client = params.client\n ? params.client\n : params.network === 'mainnet'\n ? Client.forMainnet()\n : Client.forTestnet();\n\n const resolver = new NodeOperatorResolver({\n mirrorNode: params.mirrorNode,\n logger: params.logger,\n });\n\n let currentKeyType: 'ed25519' | 'ecdsa';\n let currentPrivateKey: PrivateKey;\n\n const guess = resolver.bestGuessOperatorKey(\n params.operatorKey,\n params.keyType,\n );\n currentKeyType = guess.keyType;\n currentPrivateKey = guess.privateKey;\n client.setOperator(operatorId.toString(), currentPrivateKey);\n\n const initPromise = (async () => {\n try {\n const resolved = await resolver.resolveOperatorKey(\n operatorId,\n params.operatorKey,\n params.keyType,\n );\n currentKeyType = resolved.keyType;\n currentPrivateKey = resolved.privateKey;\n client.setOperator(operatorId.toString(), currentPrivateKey);\n } catch {}\n })();\n\n return {\n client,\n operatorId,\n get operatorKey() {\n return currentPrivateKey;\n },\n get keyType() {\n return currentKeyType;\n },\n ensureInitialized: async () => {\n await initPromise;\n },\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es136.js","sources":["../../src/services/registry-broker/client/base-client.ts"],"sourcesContent":["import { Buffer } from 'buffer';\nimport {\n createCipheriv,\n createDecipheriv,\n createHash,\n randomBytes,\n} from 'crypto';\nimport { secp256k1 } from '@noble/curves/secp256k1.js';\nimport { ZodError, z } from 'zod';\nimport type {\n AutoTopUpOptions,\n ClientEncryptionOptions,\n CreateSessionRequestPayload,\n DeriveSharedSecretOptions,\n DecryptCipherEnvelopeOptions,\n EncryptCipherEnvelopeOptions,\n EphemeralKeyPair,\n HistoryAutoTopUpOptions,\n InitializeAgentClientOptions,\n JsonObject,\n JsonValue,\n RegisterAgentResponse,\n RegisterAgentPartialResponse,\n RegisterAgentPendingResponse,\n RegisterAgentSuccessResponse,\n RegistryBrokerClientOptions,\n SharedSecretInput,\n} from '../types';\nimport {\n createAbortError,\n DEFAULT_BASE_URL,\n DEFAULT_HISTORY_TOP_UP_HBAR,\n DEFAULT_USER_AGENT,\n JSON_CONTENT_TYPE,\n isJsonObject,\n isBrowserRuntime,\n normaliseBaseUrl,\n normaliseHeaderName,\n} from './utils';\nimport {\n RegistryBrokerError,\n RegistryBrokerParseError,\n type ErrorDetails,\n} from './errors';\nexport interface InitializedAgentClient {\n client: RegistryBrokerClient;\n encryption?: { publicKey: string; privateKey?: string } | null;\n}\nexport interface GenerateEncryptionKeyPairOptions {\n keyType?: 'secp256k1';\n envVar?: string;\n envPath?: string;\n overwrite?: boolean;\n}\nexport interface RequestConfig {\n method?: string;\n body?: unknown;\n headers?: Record<string, string>;\n}\nexport class RegistryBrokerClient {\n static async initializeAgent(\n options: InitializeAgentClientOptions,\n ): Promise<InitializedAgentClient> {\n const { uaid, ensureEncryptionKey = true, ...clientOptions } = options;\n const client = new RegistryBrokerClient(clientOptions);\n let encryption: { publicKey: string; privateKey?: string } | null = null;\n if (ensureEncryptionKey) {\n const ensureOptions =\n typeof ensureEncryptionKey === 'object'\n ? ensureEncryptionKey\n : { generateIfMissing: true };\n encryption = await client.encryption.ensureAgentKey({\n uaid,\n ...ensureOptions,\n });\n }\n return { client, encryption };\n }\n readonly baseUrl: string;\n readonly fetchImpl: typeof fetch;\n readonly defaultHeaders: Record<string, string>;\n readonly registrationAutoTopUp?: AutoTopUpOptions;\n readonly historyAutoTopUp?: HistoryAutoTopUpOptions;\n readonly encryptionOptions?: ClientEncryptionOptions;\n encryptionBootstrapPromise: Promise<void> | null = null;\n constructor(options: RegistryBrokerClientOptions = {}) {\n const {\n baseUrl = DEFAULT_BASE_URL,\n fetchImplementation,\n defaultHeaders,\n apiKey,\n ledgerApiKey,\n registrationAutoTopUp,\n historyAutoTopUp,\n encryption,\n } = options;\n this.baseUrl = normaliseBaseUrl(baseUrl);\n this.fetchImpl = fetchImplementation ?? fetch;\n this.defaultHeaders = {\n ...(defaultHeaders ?? {}),\n };\n Object.entries(this.defaultHeaders).forEach(([key, value]) => {\n const headerName = normaliseHeaderName(key);\n if (headerName !== key) {\n delete this.defaultHeaders[key];\n this.defaultHeaders[headerName] = value;\n }\n });\n if (apiKey) {\n this.defaultHeaders['x-api-key'] = apiKey;\n }\n if (ledgerApiKey) {\n this.defaultHeaders['x-ledger-api-key'] = ledgerApiKey;\n }\n this.registrationAutoTopUp = registrationAutoTopUp;\n this.historyAutoTopUp = historyAutoTopUp;\n this.encryptionOptions = encryption;\n\n if (this.encryptionOptions) {\n this.encryptionBootstrapPromise = this.initializeEncryptionBootstrap(\n this.encryptionOptions,\n );\n }\n }\n\n setApiKey(apiKey?: string): void {\n this.setDefaultHeader('x-api-key', apiKey);\n }\n\n setLedgerApiKey(apiKey?: string): void {\n this.setDefaultHeader('x-ledger-api-key', apiKey);\n }\n\n setDefaultHeader(name: string, value?: string | null): void {\n if (!name || name.trim().length === 0) {\n return;\n }\n const headerName = normaliseHeaderName(name);\n if (!value || value.trim().length === 0) {\n delete this.defaultHeaders[headerName];\n return;\n }\n this.defaultHeaders[headerName] = value.trim();\n }\n\n getDefaultHeaders(): Record<string, string> {\n return { ...this.defaultHeaders };\n }\n\n async encryptionReady(): Promise<void> {\n if (!this.encryptionBootstrapPromise) {\n return;\n }\n await this.encryptionBootstrapPromise;\n }\n\n buildUrl(path: string): string {\n const normalisedPath = path.startsWith('/') ? path : `/${path}`;\n return `${this.baseUrl}${normalisedPath}`;\n }\n\n async request(path: string, config: RequestConfig): Promise<Response> {\n const headers = new Headers();\n Object.entries(this.defaultHeaders).forEach(([key, value]) => {\n headers.set(key, value);\n });\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers.set(key, value);\n });\n }\n if (!headers.has('accept')) {\n headers.set('accept', 'application/json');\n }\n if (!headers.has('user-agent') && !isBrowserRuntime()) {\n headers.set('user-agent', DEFAULT_USER_AGENT);\n }\n\n const init: RequestInit = {\n method: config.method ?? 'GET',\n headers,\n };\n\n if (config.body !== undefined) {\n init.body = JSON.stringify(config.body);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n }\n\n const response = await this.fetchImpl(this.buildUrl(path), init);\n if (response.ok) {\n return response;\n }\n const errorBody = await this.extractErrorBody(response);\n throw new RegistryBrokerError('Registry broker request failed', {\n status: response.status,\n statusText: response.statusText,\n body: errorBody,\n });\n }\n\n async requestJson<T extends JsonValue = JsonValue>(\n path: string,\n config: RequestConfig,\n ): Promise<T> {\n const response = await this.request(path, config);\n const contentType = response.headers?.get('content-type') ?? '';\n if (!JSON_CONTENT_TYPE.test(contentType)) {\n const body = await response.text();\n throw new RegistryBrokerParseError(\n 'Expected JSON response from registry broker',\n body,\n );\n }\n return (await response.json()) as T;\n }\n\n private async extractErrorBody(response: Response): Promise<JsonValue> {\n const contentType = response.headers?.get('content-type') ?? '';\n if (JSON_CONTENT_TYPE.test(contentType)) {\n try {\n return (await response.json()) as JsonValue;\n } catch (error) {\n return { parseError: String(error) };\n }\n }\n try {\n return await response.text();\n } catch (error) {\n return { parseError: String(error) };\n }\n }\n\n parseWithSchema<T>(\n value: JsonValue,\n schema: z.ZodSchema<T>,\n context: string,\n ): T {\n try {\n return schema.parse(value);\n } catch (error) {\n throw new RegistryBrokerParseError(\n `Failed to parse ${context}`,\n error instanceof ZodError || error instanceof Error\n ? error\n : String(error),\n value,\n );\n }\n }\n\n async delay(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve();\n }, ms);\n\n const onAbort = (): void => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n reject(createAbortError());\n };\n\n if (signal) {\n if (signal.aborted) {\n clearTimeout(timer);\n reject(createAbortError());\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n\n assertNodeRuntime(feature: string): void {\n if (typeof process === 'undefined' || !process.versions?.node) {\n throw new Error(`${feature} is only available in Node.js environments`);\n }\n }\n\n createEphemeralKeyPair(): EphemeralKeyPair {\n this.assertNodeRuntime('generateEphemeralKeyPair');\n const privateKeyBytes = randomBytes(32);\n const publicKey = secp256k1.getPublicKey(privateKeyBytes, true);\n return {\n privateKey: Buffer.from(privateKeyBytes).toString('hex'),\n publicKey: Buffer.from(publicKey).toString('hex'),\n };\n }\n\n deriveSharedSecret(options: DeriveSharedSecretOptions): Buffer {\n this.assertNodeRuntime('deriveSharedSecret');\n const privateKey = this.hexToBuffer(options.privateKey);\n const peerPublicKey = this.hexToBuffer(options.peerPublicKey);\n const shared = secp256k1.getSharedSecret(privateKey, peerPublicKey, true);\n return createHash('sha256').update(Buffer.from(shared)).digest();\n }\n\n buildCipherEnvelope(options: EncryptCipherEnvelopeOptions) {\n this.assertNodeRuntime('encryptCipherEnvelope');\n const sharedSecret = this.normalizeSharedSecret(options.sharedSecret);\n const iv = randomBytes(12);\n const cipher = createCipheriv('aes-256-gcm', sharedSecret, iv);\n const aadSource = options.associatedData ?? options.sessionId;\n const associatedDataEncoded = aadSource\n ? Buffer.from(aadSource, 'utf8').toString('base64')\n : undefined;\n if (aadSource) {\n cipher.setAAD(Buffer.from(aadSource, 'utf8'));\n }\n const ciphertext = Buffer.concat([\n cipher.update(Buffer.from(options.plaintext, 'utf8')),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n const payload = Buffer.concat([ciphertext, tag]);\n\n return {\n algorithm: 'aes-256-gcm',\n ciphertext: payload.toString('base64'),\n nonce: iv.toString('base64'),\n associatedData: associatedDataEncoded,\n keyLocator: {\n sessionId: options.sessionId,\n revision: options.revision ?? 1,\n },\n recipients: options.recipients.map(recipient => ({\n ...recipient,\n encryptedShare: '',\n })),\n };\n }\n\n openCipherEnvelope(options: DecryptCipherEnvelopeOptions): string {\n this.assertNodeRuntime('decryptCipherEnvelope');\n const sharedSecret = this.normalizeSharedSecret(options.sharedSecret);\n const payload = Buffer.from(options.envelope.ciphertext, 'base64');\n const nonce = Buffer.from(options.envelope.nonce, 'base64');\n const ciphertext = payload.slice(0, payload.length - 16);\n const tag = payload.slice(payload.length - 16);\n const decipher = createDecipheriv('aes-256-gcm', sharedSecret, nonce);\n if (options.envelope.associatedData) {\n decipher.setAAD(Buffer.from(options.envelope.associatedData, 'base64'));\n }\n decipher.setAuthTag(tag);\n const plaintext = Buffer.concat([\n decipher.update(ciphertext),\n decipher.final(),\n ]);\n return plaintext.toString(options.encoding ?? 'utf8');\n }\n\n normalizeSharedSecret(input: SharedSecretInput): Buffer {\n if (Buffer.isBuffer(input)) {\n return Buffer.from(input);\n }\n if (input instanceof Uint8Array) {\n return Buffer.from(input);\n }\n if (typeof input === 'string') {\n return this.bufferFromString(input);\n }\n throw new Error('Unsupported shared secret input');\n }\n\n bufferFromString(value: string): Buffer {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error('sharedSecret string cannot be empty');\n }\n const normalized = trimmed.startsWith('0x') ? trimmed.slice(2) : trimmed;\n if (/^[0-9a-fA-F]+$/.test(normalized) && normalized.length % 2 === 0) {\n return Buffer.from(normalized, 'hex');\n }\n return Buffer.from(trimmed, 'base64');\n }\n\n hexToBuffer(value: string): Uint8Array {\n const normalized = value.startsWith('0x') ? value.slice(2) : value;\n if (!/^[0-9a-fA-F]+$/.test(normalized) || normalized.length % 2 !== 0) {\n throw new Error('Expected hex-encoded value');\n }\n return Buffer.from(normalized, 'hex');\n }\n\n extractInsufficientCreditsDetails(error: unknown): {\n shortfallCredits: number;\n } | null {\n if (!(error instanceof RegistryBrokerError) || error.status !== 402) {\n return null;\n }\n\n const body = error.body;\n if (!body || typeof body !== 'object' || Array.isArray(body)) {\n return null;\n }\n\n const maybeShortfall = (body as JsonObject)['shortfallCredits'];\n if (typeof maybeShortfall !== 'number' || maybeShortfall <= 0) {\n return null;\n }\n\n return { shortfallCredits: maybeShortfall };\n }\n\n private extractErrorMessage(body: JsonValue): string | undefined {\n if (typeof body === 'string') {\n return body;\n }\n if (isJsonObject(body) && typeof body.error === 'string') {\n return body.error;\n }\n if (isJsonObject(body) && typeof body.message === 'string') {\n return body.message;\n }\n return undefined;\n }\n\n shouldAutoTopUpHistory(\n payload: CreateSessionRequestPayload,\n error: Error | null,\n ): boolean {\n if (!this.historyAutoTopUp || payload.historyTtlSeconds === undefined) {\n return false;\n }\n if (!(error instanceof RegistryBrokerError)) {\n return false;\n }\n if (error.status !== 402) {\n return false;\n }\n const message = this.extractErrorMessage(error.body);\n if (!message) {\n return true;\n }\n const normalised = message.toLowerCase();\n return (\n normalised.includes('history') || normalised.includes('chat history')\n );\n }\n\n async executeHistoryAutoTopUp(reason: string): Promise<void> {\n if (!this.historyAutoTopUp) {\n return;\n }\n const hbarAmount =\n this.historyAutoTopUp.hbarAmount && this.historyAutoTopUp.hbarAmount > 0\n ? this.historyAutoTopUp.hbarAmount\n : DEFAULT_HISTORY_TOP_UP_HBAR;\n await this.purchaseCreditsWithHbar({\n accountId: this.historyAutoTopUp.accountId,\n privateKey: this.historyAutoTopUp.privateKey,\n hbarAmount,\n memo:\n this.historyAutoTopUp.memo ??\n 'registry-broker-client:chat-history-topup',\n metadata: {\n purpose: 'chat-history',\n reason,\n },\n });\n }\n\n initializeEncryptionBootstrap(\n options: ClientEncryptionOptions,\n ): Promise<void> {\n return this.bootstrapEncryptionOptions(options).then((): void => undefined);\n }\n\n bootstrapEncryptionOptions(\n _options?: ClientEncryptionOptions,\n ): Promise<{ publicKey: string; privateKey?: string } | null> {\n return Promise.resolve(null);\n }\n}\n\nexport const isPendingRegisterAgentResponse = (\n response: RegisterAgentResponse,\n): response is RegisterAgentPendingResponse => response.status === 'pending';\n\nexport const isPartialRegisterAgentResponse = (\n response: RegisterAgentResponse,\n): response is RegisterAgentPartialResponse =>\n response.status === 'partial' && response.success === false;\n\nexport const isSuccessRegisterAgentResponse = (\n response: RegisterAgentResponse,\n): response is RegisterAgentSuccessResponse =>\n response.success === true && response.status !== 'pending';\n"],"names":[],"mappings":"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"}
@@ -1,45 +1,20 @@
1
- import { TopicMessageSubmitTransaction, TopicId, TopicCreateTransaction, PublicKey, KeyList } from "@hashgraph/sdk";
2
- function encodeHcs2RegistryMemo(indexedFlag, ttl) {
3
- return `hcs-2:${indexedFlag}:${ttl}`;
4
- }
5
- function buildTopicCreateTx(params) {
6
- const { memo, adminKey, submitKey, operatorPublicKey } = params;
7
- const tx = new TopicCreateTransaction().setTopicMemo(memo);
8
- const coerceKey = (k) => {
9
- if (!k) return void 0;
10
- if (k instanceof PublicKey || k instanceof KeyList) return k;
11
- if (typeof k === "boolean") {
12
- return k ? operatorPublicKey : void 0;
13
- }
14
- if (typeof k === "string") {
15
- try {
16
- return PublicKey.fromString(k);
17
- } catch {
18
- return void 0;
19
- }
20
- }
21
- return void 0;
22
- };
23
- const admin = coerceKey(adminKey);
24
- if (admin) {
25
- tx.setAdminKey(admin);
26
- }
27
- const submit = coerceKey(submitKey);
28
- if (submit) {
29
- tx.setSubmitKey(submit);
1
+ class RegistryBrokerError extends Error {
2
+ constructor(message, details) {
3
+ super(message);
4
+ this.status = details.status;
5
+ this.statusText = details.statusText;
6
+ this.body = details.body;
30
7
  }
31
- return tx;
32
8
  }
33
- function buildMessageTx(params) {
34
- const tx = new TopicMessageSubmitTransaction().setTopicId(TopicId.fromString(params.topicId)).setMessage(params.message);
35
- if (params.transactionMemo) {
36
- tx.setTransactionMemo(params.transactionMemo);
9
+ class RegistryBrokerParseError extends Error {
10
+ constructor(message, cause, rawValue) {
11
+ super(message);
12
+ this.cause = cause;
13
+ this.rawValue = rawValue;
37
14
  }
38
- return tx;
39
15
  }
40
16
  export {
41
- buildMessageTx,
42
- buildTopicCreateTx,
43
- encodeHcs2RegistryMemo
17
+ RegistryBrokerError,
18
+ RegistryBrokerParseError
44
19
  };
45
20
  //# sourceMappingURL=standards-sdk.es137.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es137.js","sources":["../../src/common/tx/tx-utils.ts"],"sourcesContent":["import {\n TopicCreateTransaction,\n TopicMessageSubmitTransaction,\n PublicKey,\n KeyList,\n TopicId,\n} from '@hashgraph/sdk';\n\nexport type MaybeKey = boolean | string | PublicKey | KeyList | undefined;\n\nexport function encodeHcs2RegistryMemo(\n indexedFlag: 0 | 1,\n ttl: number,\n): string {\n return `hcs-2:${indexedFlag}:${ttl}`;\n}\n\nexport function buildTopicCreateTx(params: {\n memo: string;\n adminKey?: MaybeKey;\n submitKey?: MaybeKey;\n operatorPublicKey?: PublicKey;\n}): TopicCreateTransaction {\n const { memo, adminKey, submitKey, operatorPublicKey } = params;\n const tx = new TopicCreateTransaction().setTopicMemo(memo);\n\n const coerceKey = (k?: MaybeKey): PublicKey | KeyList | undefined => {\n if (!k) return undefined;\n if (k instanceof PublicKey || k instanceof KeyList) return k;\n if (typeof k === 'boolean') {\n return k ? operatorPublicKey : undefined;\n }\n if (typeof k === 'string') {\n try {\n return PublicKey.fromString(k);\n } catch {\n return undefined;\n }\n }\n return undefined;\n };\n\n const admin = coerceKey(adminKey);\n if (admin) {\n tx.setAdminKey(admin);\n }\n\n const submit = coerceKey(submitKey);\n if (submit) {\n tx.setSubmitKey(submit);\n }\n\n return tx;\n}\n\nexport function buildMessageTx(params: {\n topicId: string;\n message: string | Uint8Array;\n transactionMemo?: string;\n}): TopicMessageSubmitTransaction {\n const tx = new TopicMessageSubmitTransaction()\n .setTopicId(TopicId.fromString(params.topicId))\n .setMessage(params.message);\n if (params.transactionMemo) {\n tx.setTransactionMemo(params.transactionMemo);\n }\n return tx;\n}\n"],"names":[],"mappings":";AAUO,SAAS,uBACd,aACA,KACQ;AACR,SAAO,SAAS,WAAW,IAAI,GAAG;AACpC;AAEO,SAAS,mBAAmB,QAKR;AACzB,QAAM,EAAE,MAAM,UAAU,WAAW,sBAAsB;AACzD,QAAM,KAAK,IAAI,yBAAyB,aAAa,IAAI;AAEzD,QAAM,YAAY,CAAC,MAAkD;AACnE,QAAI,CAAC,EAAG,QAAO;AACf,QAAI,aAAa,aAAa,aAAa,QAAS,QAAO;AAC3D,QAAI,OAAO,MAAM,WAAW;AAC1B,aAAO,IAAI,oBAAoB;AAAA,IACjC;AACA,QAAI,OAAO,MAAM,UAAU;AACzB,UAAI;AACF,eAAO,UAAU,WAAW,CAAC;AAAA,MAC/B,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,UAAU,QAAQ;AAChC,MAAI,OAAO;AACT,OAAG,YAAY,KAAK;AAAA,EACtB;AAEA,QAAM,SAAS,UAAU,SAAS;AAClC,MAAI,QAAQ;AACV,OAAG,aAAa,MAAM;AAAA,EACxB;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,QAIG;AAChC,QAAM,KAAK,IAAI,gCACZ,WAAW,QAAQ,WAAW,OAAO,OAAO,CAAC,EAC7C,WAAW,OAAO,OAAO;AAC5B,MAAI,OAAO,iBAAiB;AAC1B,OAAG,mBAAmB,OAAO,eAAe;AAAA,EAC9C;AACA,SAAO;AACT;"}
1
+ {"version":3,"file":"standards-sdk.es137.js","sources":["../../src/services/registry-broker/client/errors.ts"],"sourcesContent":["import type { JsonValue } from '../types';\nimport { ZodError } from 'zod';\n\nexport interface ErrorDetails {\n status: number;\n statusText: string;\n body: JsonValue;\n}\n\nexport class RegistryBrokerError extends Error {\n readonly status: number;\n readonly statusText: string;\n readonly body: JsonValue;\n\n constructor(message: string, details: ErrorDetails) {\n super(message);\n this.status = details.status;\n this.statusText = details.statusText;\n this.body = details.body;\n }\n}\n\nexport class RegistryBrokerParseError extends Error {\n readonly cause: ZodError | Error | string;\n readonly rawValue?: JsonValue;\n\n constructor(\n message: string,\n cause: ZodError | Error | string,\n rawValue?: JsonValue,\n ) {\n super(message);\n this.cause = cause;\n this.rawValue = rawValue;\n }\n}\n"],"names":[],"mappings":"AASO,MAAM,4BAA4B,MAAM;AAAA,EAK7C,YAAY,SAAiB,SAAuB;AAClD,UAAM,OAAO;AACb,SAAK,SAAS,QAAQ;AACtB,SAAK,aAAa,QAAQ;AAC1B,SAAK,OAAO,QAAQ;AAAA,EACtB;AACF;AAEO,MAAM,iCAAiC,MAAM;AAAA,EAIlD,YACE,SACA,OACA,UACA;AACA,UAAM,OAAO;AACb,SAAK,QAAQ;AACb,SAAK,WAAW;AAAA,EAClB;AACF;"}