@hashgraphonline/standards-sdk 0.1.146-chore-jsr-improvements.canary.6bc8731.90 → 0.1.146-chore-jsr-improvements.canary.01d3174.92

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 (142) hide show
  1. package/dist/cjs/jsr-entry.d.ts +30 -10
  2. package/dist/cjs/jsr-entry.d.ts.map +1 -1
  3. package/dist/cjs/services/registry-broker/client/base-client.d.ts +14 -1
  4. package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
  5. package/dist/cjs/services/registry-broker/client/search-helpers.d.ts +16 -0
  6. package/dist/cjs/services/registry-broker/client/search-helpers.d.ts.map +1 -0
  7. package/dist/cjs/services/registry-broker/client/search.d.ts +5 -18
  8. package/dist/cjs/services/registry-broker/client/search.d.ts.map +1 -1
  9. package/dist/cjs/standards-sdk.cjs +1 -1
  10. package/dist/cjs/standards-sdk.cjs.map +1 -1
  11. package/dist/es/jsr-entry.d.ts +30 -10
  12. package/dist/es/jsr-entry.d.ts.map +1 -1
  13. package/dist/es/services/registry-broker/client/base-client.d.ts +14 -1
  14. package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
  15. package/dist/es/services/registry-broker/client/search-helpers.d.ts +16 -0
  16. package/dist/es/services/registry-broker/client/search-helpers.d.ts.map +1 -0
  17. package/dist/es/services/registry-broker/client/search.d.ts +5 -18
  18. package/dist/es/services/registry-broker/client/search.d.ts.map +1 -1
  19. package/dist/es/standards-sdk.es.js +9 -10
  20. package/dist/es/standards-sdk.es.js.map +1 -1
  21. package/dist/es/standards-sdk.es101.js +1 -1
  22. package/dist/es/standards-sdk.es103.js +1 -1
  23. package/dist/es/standards-sdk.es109.js +2 -3
  24. package/dist/es/standards-sdk.es109.js.map +1 -1
  25. package/dist/es/standards-sdk.es11.js +1 -1
  26. package/dist/es/standards-sdk.es110.js +5 -5
  27. package/dist/es/standards-sdk.es12.js +1 -1
  28. package/dist/es/standards-sdk.es120.js +1 -1
  29. package/dist/es/standards-sdk.es121.js +1 -1
  30. package/dist/es/standards-sdk.es122.js +5 -5
  31. package/dist/es/standards-sdk.es124.js +1 -1
  32. package/dist/es/standards-sdk.es125.js +1 -1
  33. package/dist/es/standards-sdk.es127.js +3 -3
  34. package/dist/es/standards-sdk.es128.js +61 -164
  35. package/dist/es/standards-sdk.es128.js.map +1 -1
  36. package/dist/es/standards-sdk.es129.js +102 -85
  37. package/dist/es/standards-sdk.es129.js.map +1 -1
  38. package/dist/es/standards-sdk.es130.js +222 -96
  39. package/dist/es/standards-sdk.es130.js.map +1 -1
  40. package/dist/es/standards-sdk.es131.js +153 -220
  41. package/dist/es/standards-sdk.es131.js.map +1 -1
  42. package/dist/es/standards-sdk.es132.js +104 -162
  43. package/dist/es/standards-sdk.es132.js.map +1 -1
  44. package/dist/es/standards-sdk.es133.js +296 -92
  45. package/dist/es/standards-sdk.es133.js.map +1 -1
  46. package/dist/es/standards-sdk.es134.js +587 -288
  47. package/dist/es/standards-sdk.es134.js.map +1 -1
  48. package/dist/es/standards-sdk.es135.js +14 -461
  49. package/dist/es/standards-sdk.es135.js.map +1 -1
  50. package/dist/es/standards-sdk.es136.js +79 -15
  51. package/dist/es/standards-sdk.es136.js.map +1 -1
  52. package/dist/es/standards-sdk.es137.js +77 -71
  53. package/dist/es/standards-sdk.es137.js.map +1 -1
  54. package/dist/es/standards-sdk.es138.js +53 -80
  55. package/dist/es/standards-sdk.es138.js.map +1 -1
  56. package/dist/es/standards-sdk.es139.js +152 -53
  57. package/dist/es/standards-sdk.es139.js.map +1 -1
  58. package/dist/es/standards-sdk.es140.js +7 -159
  59. package/dist/es/standards-sdk.es140.js.map +1 -1
  60. package/dist/es/standards-sdk.es141.js +86 -7
  61. package/dist/es/standards-sdk.es141.js.map +1 -1
  62. package/dist/es/standards-sdk.es142.js +43 -64
  63. package/dist/es/standards-sdk.es142.js.map +1 -1
  64. package/dist/es/standards-sdk.es143.js +30 -65
  65. package/dist/es/standards-sdk.es143.js.map +1 -1
  66. package/dist/es/standards-sdk.es144.js +34 -30
  67. package/dist/es/standards-sdk.es144.js.map +1 -1
  68. package/dist/es/standards-sdk.es145.js +28 -34
  69. package/dist/es/standards-sdk.es145.js.map +1 -1
  70. package/dist/es/standards-sdk.es146.js +138 -28
  71. package/dist/es/standards-sdk.es146.js.map +1 -1
  72. package/dist/es/standards-sdk.es147.js +34 -12281
  73. package/dist/es/standards-sdk.es147.js.map +1 -1
  74. package/dist/es/standards-sdk.es148.js +17 -959
  75. package/dist/es/standards-sdk.es148.js.map +1 -1
  76. package/dist/es/standards-sdk.es149.js +12256 -105
  77. package/dist/es/standards-sdk.es149.js.map +1 -1
  78. package/dist/es/standards-sdk.es150.js +959 -42
  79. package/dist/es/standards-sdk.es150.js.map +1 -1
  80. package/dist/es/standards-sdk.es151.js +54 -15
  81. package/dist/es/standards-sdk.es151.js.map +1 -1
  82. package/dist/es/standards-sdk.es152.js +76 -48
  83. package/dist/es/standards-sdk.es152.js.map +1 -1
  84. package/dist/es/standards-sdk.es153.js +160 -72
  85. package/dist/es/standards-sdk.es153.js.map +1 -1
  86. package/dist/es/standards-sdk.es154.js +289 -139
  87. package/dist/es/standards-sdk.es154.js.map +1 -1
  88. package/dist/es/standards-sdk.es155.js +298 -274
  89. package/dist/es/standards-sdk.es155.js.map +1 -1
  90. package/dist/es/standards-sdk.es156.js +369 -262
  91. package/dist/es/standards-sdk.es156.js.map +1 -1
  92. package/dist/es/standards-sdk.es157.js +194 -316
  93. package/dist/es/standards-sdk.es157.js.map +1 -1
  94. package/dist/es/standards-sdk.es158.js +64 -319
  95. package/dist/es/standards-sdk.es158.js.map +1 -1
  96. package/dist/es/standards-sdk.es159.js +231 -68
  97. package/dist/es/standards-sdk.es159.js.map +1 -1
  98. package/dist/es/standards-sdk.es16.js +2 -3
  99. package/dist/es/standards-sdk.es16.js.map +1 -1
  100. package/dist/es/standards-sdk.es160.js +223 -218
  101. package/dist/es/standards-sdk.es160.js.map +1 -1
  102. package/dist/es/standards-sdk.es18.js +5 -6
  103. package/dist/es/standards-sdk.es18.js.map +1 -1
  104. package/dist/es/standards-sdk.es19.js +3 -4
  105. package/dist/es/standards-sdk.es19.js.map +1 -1
  106. package/dist/es/standards-sdk.es22.js +1 -1
  107. package/dist/es/standards-sdk.es27.js +5 -6
  108. package/dist/es/standards-sdk.es27.js.map +1 -1
  109. package/dist/es/standards-sdk.es30.js +1 -1
  110. package/dist/es/standards-sdk.es31.js +1 -1
  111. package/dist/es/standards-sdk.es35.js +3 -4
  112. package/dist/es/standards-sdk.es35.js.map +1 -1
  113. package/dist/es/standards-sdk.es36.js +3 -3
  114. package/dist/es/standards-sdk.es37.js +1 -1
  115. package/dist/es/standards-sdk.es4.js +1 -1
  116. package/dist/es/standards-sdk.es53.js +1 -1
  117. package/dist/es/standards-sdk.es56.js +1 -1
  118. package/dist/es/standards-sdk.es58.js +1 -1
  119. package/dist/es/standards-sdk.es59.js +1 -1
  120. package/dist/es/standards-sdk.es60.js +3 -4
  121. package/dist/es/standards-sdk.es60.js.map +1 -1
  122. package/dist/es/standards-sdk.es62.js +1 -1
  123. package/dist/es/standards-sdk.es64.js +1 -1
  124. package/dist/es/standards-sdk.es65.js +2 -2
  125. package/dist/es/standards-sdk.es68.js +2 -2
  126. package/dist/es/standards-sdk.es69.js +1 -1
  127. package/dist/es/standards-sdk.es7.js +1 -1
  128. package/dist/es/standards-sdk.es71.js +1 -1
  129. package/dist/es/standards-sdk.es76.js +1 -1
  130. package/dist/es/standards-sdk.es77.js +2 -3
  131. package/dist/es/standards-sdk.es77.js.map +1 -1
  132. package/dist/es/standards-sdk.es78.js +1 -1
  133. package/dist/es/standards-sdk.es81.js +1 -1
  134. package/dist/es/standards-sdk.es83.js +1 -1
  135. package/dist/es/standards-sdk.es87.js +3 -3
  136. package/dist/es/standards-sdk.es91.js +1 -1
  137. package/dist/es/standards-sdk.es92.js +1 -1
  138. package/dist/es/standards-sdk.es97.js +1 -1
  139. package/dist/es/standards-sdk.es99.js +1 -1
  140. package/package.json +1 -1
  141. package/dist/es/standards-sdk.es161.js +0 -247
  142. package/dist/es/standards-sdk.es161.js.map +0 -1
@@ -1,242 +1,247 @@
1
- const DEFAULT_USER_AGENT = "@hol-org/rb-client";
2
- const DEFAULT_PROGRESS_INTERVAL_MS = 1500;
3
- const DEFAULT_PROGRESS_TIMEOUT_MS = 5 * 60 * 1e3;
4
- const DEFAULT_BASE_URL = "https://hol.org/registry/api/v1";
5
- const JSON_CONTENT_TYPE = /application\/json/i;
6
- const DEFAULT_HISTORY_TOP_UP_HBAR = 0.25;
7
- const MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS = 1;
8
- const stripTrailingSlashes = (value) => {
9
- let end = value.length;
10
- while (end > 0 && value.charCodeAt(end - 1) === 47) {
11
- end -= 1;
1
+ class EncryptionUnavailableError extends Error {
2
+ constructor(sessionId, summary) {
3
+ super("Encryption is not enabled for this session");
4
+ this.sessionId = sessionId;
5
+ this.summary = summary;
12
6
  }
13
- return end === value.length ? value : value.slice(0, end);
14
- };
15
- const createAbortError = () => typeof DOMException === "function" ? new DOMException("Aborted", "AbortError") : new Error("The operation was aborted");
16
- const normaliseHeaderName = (name) => name.trim().toLowerCase();
17
- const isBrowserRuntime = () => typeof window !== "undefined" && typeof window.fetch === "function";
18
- const toJsonValue = (value) => {
19
- if (value === null) {
20
- return null;
21
- }
22
- if (value instanceof Date) {
23
- return value.toISOString();
24
- }
25
- if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
26
- return value;
27
- }
28
- if (Array.isArray(value)) {
29
- return value.map((item) => item === void 0 ? null : toJsonValue(item));
30
- }
31
- if (typeof value === "object") {
32
- const result = {};
33
- Object.entries(value).forEach(
34
- ([key, entryValue]) => {
35
- if (entryValue !== void 0) {
36
- result[key] = toJsonValue(entryValue);
37
- }
38
- }
39
- );
40
- return result;
41
- }
42
- throw new TypeError("Only JSON-compatible values are supported");
43
- };
44
- const isJsonObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
45
- const toJsonObject = (value) => {
46
- const normalised = toJsonValue(value);
47
- if (isJsonObject(normalised)) {
48
- return normalised;
49
- }
50
- throw new TypeError("Expected JSON object value");
51
- };
52
- const serialiseAuthConfig = (auth) => {
53
- const authPayload = {};
54
- if (auth.type) {
55
- authPayload.type = auth.type;
56
- }
57
- if (auth.token) {
58
- authPayload.token = auth.token;
59
- }
60
- if (auth.username) {
61
- authPayload.username = auth.username;
62
- }
63
- if (auth.password) {
64
- authPayload.password = auth.password;
65
- }
66
- if (auth.headerName) {
67
- authPayload.headerName = auth.headerName;
68
- }
69
- if (auth.headerValue) {
70
- authPayload.headerValue = auth.headerValue;
71
- }
72
- if (auth.headers) {
73
- authPayload.headers = { ...auth.headers };
74
- }
75
- return authPayload;
76
- };
77
- const serialiseAgentRegistrationRequest = (payload) => {
78
- const body = {
79
- profile: toJsonObject(payload.profile)
80
- };
81
- if (payload.endpoint !== void 0) {
82
- body.endpoint = payload.endpoint;
83
- }
84
- if (payload.protocol !== void 0) {
85
- body.protocol = payload.protocol;
86
- }
87
- if (payload.communicationProtocol !== void 0) {
88
- body.communicationProtocol = payload.communicationProtocol;
89
- }
90
- if (payload.registry !== void 0) {
91
- body.registry = payload.registry;
92
- }
93
- if (payload.additionalRegistries !== void 0) {
94
- body.additionalRegistries = payload.additionalRegistries;
95
- }
96
- if (payload.metadata !== void 0) {
97
- body.metadata = toJsonObject(payload.metadata);
98
- }
99
- return body;
100
- };
101
- const normalizeHexPrivateKey = (value) => {
102
- const trimmed = value.trim();
103
- if (!trimmed) {
104
- throw new Error("evmPrivateKey is required");
105
- }
106
- return trimmed.startsWith("0x") ? trimmed : `0x${trimmed}`;
107
- };
108
- function normaliseBaseUrl(input) {
109
- const trimmed = input?.trim();
110
- let baseCandidate = trimmed && trimmed.length > 0 ? trimmed : DEFAULT_BASE_URL;
111
- try {
112
- const url = new URL(stripTrailingSlashes(baseCandidate));
113
- const hostname = url.hostname.toLowerCase();
114
- const ensureRegistryPrefix = () => {
115
- if (!url.pathname.startsWith("/registry")) {
116
- url.pathname = url.pathname === "/" ? "/registry" : `/registry${url.pathname}`;
117
- }
118
- };
119
- if (hostname === "hol.org") {
120
- ensureRegistryPrefix();
121
- baseCandidate = url.toString();
122
- } else if (hostname === "registry.hashgraphonline.com" || hostname === "hashgraphonline.com") {
123
- ensureRegistryPrefix();
124
- url.hostname = "hol.org";
125
- baseCandidate = url.toString();
126
- }
127
- } catch {
128
- }
129
- const withoutTrailing = stripTrailingSlashes(baseCandidate);
130
- if (/\/api\/v\d+$/i.test(withoutTrailing)) {
131
- return withoutTrailing;
132
- }
133
- if (/\/api$/i.test(withoutTrailing)) {
134
- return `${withoutTrailing}/v1`;
135
- }
136
- return `${withoutTrailing}/api/v1`;
137
7
  }
138
- function buildSearchQuery(params) {
139
- const query = new URLSearchParams();
140
- const appendList = (key, values) => {
141
- if (!values) {
142
- return;
8
+ class EncryptedChatManager {
9
+ constructor(client) {
10
+ this.client = client;
11
+ }
12
+ registerConversationContext(context) {
13
+ this.client.registerConversationContextForEncryption(context);
14
+ }
15
+ async startSession(options) {
16
+ await this.client.encryptionReady();
17
+ const session = await this.client.chat.createSession({
18
+ uaid: options.uaid,
19
+ senderUaid: options.senderUaid,
20
+ encryptionRequested: true,
21
+ historyTtlSeconds: options.historyTtlSeconds,
22
+ auth: options.auth
23
+ });
24
+ options.onSessionCreated?.(session.sessionId);
25
+ const summary = session.encryption;
26
+ if (!summary?.enabled) {
27
+ throw new EncryptionUnavailableError(
28
+ session.sessionId,
29
+ session.encryption ?? null
30
+ );
143
31
  }
144
- values.forEach((value) => {
145
- if (typeof value === "string") {
146
- const trimmed = value.trim();
147
- if (trimmed.length > 0) {
148
- query.append(key, trimmed);
149
- }
150
- }
32
+ const handle = await this.establishRequesterContext({
33
+ sessionId: session.sessionId,
34
+ summary,
35
+ senderUaid: options.senderUaid,
36
+ handshakeTimeoutMs: options.handshakeTimeoutMs,
37
+ pollIntervalMs: options.pollIntervalMs
151
38
  });
152
- };
153
- if (params.q) {
154
- const trimmed = params.q.trim();
155
- if (trimmed.length > 0) {
156
- query.set("q", trimmed);
39
+ return handle;
40
+ }
41
+ async acceptSession(options) {
42
+ await this.client.encryptionReady();
43
+ const summary = await this.waitForEncryptionSummary(
44
+ options.sessionId,
45
+ options.handshakeTimeoutMs,
46
+ options.pollIntervalMs
47
+ );
48
+ const handle = await this.establishResponderContext({
49
+ sessionId: options.sessionId,
50
+ summary,
51
+ responderUaid: options.responderUaid,
52
+ handshakeTimeoutMs: options.handshakeTimeoutMs,
53
+ pollIntervalMs: options.pollIntervalMs
54
+ });
55
+ return handle;
56
+ }
57
+ async establishRequesterContext(params) {
58
+ const keyPair = this.client.encryption.generateEphemeralKeyPair();
59
+ await this.client.chat.submitEncryptionHandshake(params.sessionId, {
60
+ role: "requester",
61
+ keyType: "secp256k1",
62
+ ephemeralPublicKey: keyPair.publicKey,
63
+ uaid: params.senderUaid ?? params.summary.requester?.uaid ?? void 0
64
+ });
65
+ const { summary, record } = await this.waitForHandshakeCompletion(
66
+ params.sessionId,
67
+ params.handshakeTimeoutMs,
68
+ params.pollIntervalMs
69
+ );
70
+ const responderKey = record.responder?.ephemeralPublicKey;
71
+ if (!responderKey) {
72
+ throw new Error("Responder handshake was not completed in time");
157
73
  }
74
+ const sharedSecret = this.client.encryption.deriveSharedSecret({
75
+ privateKey: keyPair.privateKey,
76
+ peerPublicKey: responderKey
77
+ }).subarray();
78
+ const recipients = this.buildRecipients(summary);
79
+ return this.createHandle({
80
+ sessionId: params.sessionId,
81
+ sharedSecret,
82
+ summary,
83
+ recipients,
84
+ identity: summary.requester ?? void 0
85
+ });
158
86
  }
159
- if (typeof params.page === "number") {
160
- query.set("page", params.page.toString());
161
- }
162
- if (typeof params.limit === "number") {
163
- query.set("limit", params.limit.toString());
87
+ async establishResponderContext(params) {
88
+ const keyPair = this.client.encryption.generateEphemeralKeyPair();
89
+ await this.client.chat.submitEncryptionHandshake(params.sessionId, {
90
+ role: "responder",
91
+ keyType: "secp256k1",
92
+ ephemeralPublicKey: keyPair.publicKey,
93
+ uaid: params.responderUaid ?? params.summary.responder?.uaid ?? void 0
94
+ });
95
+ const { summary, record } = await this.waitForHandshakeCompletion(
96
+ params.sessionId,
97
+ params.handshakeTimeoutMs,
98
+ params.pollIntervalMs
99
+ );
100
+ const requesterKey = record.requester?.ephemeralPublicKey;
101
+ if (!requesterKey) {
102
+ throw new Error("Requester handshake was not detected in time");
103
+ }
104
+ const sharedSecret = this.client.encryption.deriveSharedSecret({
105
+ privateKey: keyPair.privateKey,
106
+ peerPublicKey: requesterKey
107
+ }).subarray();
108
+ const recipients = this.buildRecipients(summary);
109
+ return this.createHandle({
110
+ sessionId: params.sessionId,
111
+ sharedSecret,
112
+ summary,
113
+ recipients,
114
+ identity: summary.responder ?? void 0
115
+ });
164
116
  }
165
- if (params.registry) {
166
- const trimmed = params.registry.trim();
167
- if (trimmed.length > 0) {
168
- query.set("registry", trimmed);
117
+ async waitForHandshakeCompletion(sessionId, timeoutMs = 3e4, pollIntervalMs = 1e3) {
118
+ const deadline = Date.now() + timeoutMs;
119
+ while (true) {
120
+ const status = await this.client.chat.getEncryptionStatus(sessionId);
121
+ const summary = status.encryption;
122
+ const record = summary?.handshake;
123
+ if (summary && record && record.status === "complete") {
124
+ return { summary, record };
125
+ }
126
+ if (Date.now() >= deadline) {
127
+ throw new Error("Timed out waiting for encrypted handshake completion");
128
+ }
129
+ await this.delay(pollIntervalMs);
169
130
  }
170
131
  }
171
- appendList("registries", params.registries);
172
- if (typeof params.minTrust === "number") {
173
- query.set("minTrust", params.minTrust.toString());
132
+ async waitForEncryptionSummary(sessionId, _timeoutMs = 3e4, _pollIntervalMs = 1e3) {
133
+ const status = await this.client.chat.getEncryptionStatus(sessionId);
134
+ if (!status.encryption?.enabled) {
135
+ throw new EncryptionUnavailableError(
136
+ sessionId,
137
+ status.encryption ?? null
138
+ );
139
+ }
140
+ return status.encryption;
174
141
  }
175
- appendList("capabilities", params.capabilities);
176
- appendList("protocols", params.protocols);
177
- appendList("adapters", params.adapters);
178
- if (params.metadata) {
179
- Object.entries(params.metadata).forEach(([key, values]) => {
180
- if (!key || !Array.isArray(values) || values.length === 0) {
181
- return;
142
+ buildRecipients(summary) {
143
+ const candidates = [summary.requester, summary.responder].filter(Boolean);
144
+ const normalized = candidates.map((candidate) => {
145
+ if (!candidate) {
146
+ return null;
182
147
  }
183
- const trimmedKey = key.trim();
184
- if (trimmedKey.length === 0) {
185
- return;
148
+ const recipient = {};
149
+ if (candidate.uaid) {
150
+ recipient.uaid = candidate.uaid;
186
151
  }
187
- values.forEach((value) => {
188
- if (value === void 0 || value === null) {
189
- return;
190
- }
191
- query.append(`metadata.${trimmedKey}`, String(value));
192
- });
152
+ if (candidate.ledgerAccountId) {
153
+ recipient.ledgerAccountId = candidate.ledgerAccountId;
154
+ }
155
+ if (candidate.userId) {
156
+ recipient.userId = candidate.userId;
157
+ }
158
+ if (candidate.email) {
159
+ recipient.email = candidate.email;
160
+ }
161
+ return recipient;
162
+ }).filter(
163
+ (entry) => Boolean(
164
+ entry?.uaid || entry?.ledgerAccountId || entry?.userId || entry?.email
165
+ )
166
+ );
167
+ if (normalized.length > 0) {
168
+ return normalized;
169
+ }
170
+ if (summary.responder?.uaid) {
171
+ return [{ uaid: summary.responder.uaid }];
172
+ }
173
+ return [];
174
+ }
175
+ createHandle(context) {
176
+ const sharedSecret = context.sharedSecret;
177
+ const uaid = context.summary.requester?.uaid ?? context.summary.responder?.uaid ?? context.identity?.uaid;
178
+ const handle = {
179
+ sessionId: context.sessionId,
180
+ mode: "encrypted",
181
+ summary: context.summary,
182
+ send: async (options) => {
183
+ const recipients = options.recipients ?? context.recipients;
184
+ return this.client.chat.sendMessage({
185
+ sessionId: context.sessionId,
186
+ message: options.message ?? "[ciphertext omitted]",
187
+ streaming: options.streaming,
188
+ auth: options.auth,
189
+ uaid,
190
+ encryption: {
191
+ plaintext: options.plaintext,
192
+ sharedSecret: Buffer.from(sharedSecret),
193
+ recipients
194
+ }
195
+ });
196
+ },
197
+ decryptHistoryEntry: (entry) => this.decryptEntry(entry, context.identity, sharedSecret)
198
+ };
199
+ this.registerConversationContext({
200
+ sessionId: context.sessionId,
201
+ sharedSecret,
202
+ identity: context.identity
193
203
  });
204
+ return handle;
194
205
  }
195
- if (params.type) {
196
- const trimmedType = params.type.trim();
197
- if (trimmedType.length > 0 && trimmedType.toLowerCase() !== "all") {
198
- query.set("type", trimmedType);
206
+ decryptEntry(entry, identity, fallbackSecret) {
207
+ const envelope = entry.cipherEnvelope;
208
+ if (!envelope) {
209
+ return null;
210
+ }
211
+ const secret = Buffer.from(fallbackSecret);
212
+ try {
213
+ return this.client.encryption.decryptCipherEnvelope({
214
+ envelope,
215
+ sharedSecret: secret
216
+ });
217
+ } catch (_error) {
218
+ return null;
199
219
  }
200
220
  }
201
- if (params.verified === true) {
202
- query.set("verified", "true");
203
- }
204
- if (params.online === true) {
205
- query.set("online", "true");
206
- }
207
- if (params.sortBy) {
208
- const trimmedSort = params.sortBy.trim();
209
- if (trimmedSort.length > 0) {
210
- query.set("sortBy", trimmedSort);
221
+ recipientMatches(candidate, target) {
222
+ if (target.uaid && candidate.uaid?.toLowerCase() === target.uaid.toLowerCase()) {
223
+ return true;
211
224
  }
225
+ if (target.ledgerAccountId && candidate.ledgerAccountId?.toLowerCase() === target.ledgerAccountId.toLowerCase()) {
226
+ return true;
227
+ }
228
+ if (target.userId && candidate.userId === target.userId) {
229
+ return true;
230
+ }
231
+ if (target.email && candidate.email?.toLowerCase() === target.email.toLowerCase()) {
232
+ return true;
233
+ }
234
+ return false;
212
235
  }
213
- if (params.sortOrder) {
214
- const lowered = params.sortOrder.toLowerCase();
215
- if (lowered === "asc" || lowered === "desc") {
216
- query.set("sortOrder", lowered);
236
+ async delay(ms) {
237
+ if (ms <= 0) {
238
+ return;
217
239
  }
240
+ await new Promise((resolve) => setTimeout(resolve, ms));
218
241
  }
219
- const queryString = query.toString();
220
- return queryString.length > 0 ? `?${queryString}` : "";
221
242
  }
222
243
  export {
223
- DEFAULT_BASE_URL,
224
- DEFAULT_HISTORY_TOP_UP_HBAR,
225
- DEFAULT_PROGRESS_INTERVAL_MS,
226
- DEFAULT_PROGRESS_TIMEOUT_MS,
227
- DEFAULT_USER_AGENT,
228
- JSON_CONTENT_TYPE,
229
- MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS,
230
- buildSearchQuery,
231
- createAbortError,
232
- isBrowserRuntime,
233
- isJsonObject,
234
- normaliseBaseUrl,
235
- normaliseHeaderName,
236
- normalizeHexPrivateKey,
237
- serialiseAgentRegistrationRequest,
238
- serialiseAuthConfig,
239
- toJsonObject,
240
- toJsonValue
244
+ EncryptedChatManager,
245
+ EncryptionUnavailableError
241
246
  };
242
247
  //# sourceMappingURL=standards-sdk.es160.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es160.js","sources":["../../src/services/registry-broker/client/utils.ts"],"sourcesContent":["import type {\n AgentAuthConfig,\n AgentRegistrationRequest,\n JsonObject,\n JsonValue,\n SearchParams,\n} from '../types';\n\nexport const DEFAULT_USER_AGENT = '@hol-org/rb-client';\nexport const DEFAULT_PROGRESS_INTERVAL_MS = 1_500;\nexport const DEFAULT_PROGRESS_TIMEOUT_MS = 5 * 60 * 1_000;\nexport const DEFAULT_BASE_URL = 'https://hol.org/registry/api/v1';\nexport const JSON_CONTENT_TYPE = /application\\/json/i;\nexport const DEFAULT_HISTORY_TOP_UP_HBAR = 0.25;\nexport const MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS = 1;\n\nconst stripTrailingSlashes = (value: string): string => {\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end -= 1;\n }\n return end === value.length ? value : value.slice(0, end);\n};\n\nexport const createAbortError = (): Error =>\n typeof DOMException === 'function'\n ? new DOMException('Aborted', 'AbortError')\n : new Error('The operation was aborted');\n\nexport const normaliseHeaderName = (name: string): string =>\n name.trim().toLowerCase();\n\nexport const isBrowserRuntime = (): boolean =>\n typeof window !== 'undefined' && typeof window.fetch === 'function';\n\nexport const toJsonValue = (value: unknown): JsonValue => {\n if (value === null) {\n return null;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(item => (item === undefined ? null : toJsonValue(item)));\n }\n if (typeof value === 'object') {\n const result: JsonObject = {};\n Object.entries(value as Record<string, unknown>).forEach(\n ([key, entryValue]) => {\n if (entryValue !== undefined) {\n result[key] = toJsonValue(entryValue);\n }\n },\n );\n return result;\n }\n throw new TypeError('Only JSON-compatible values are supported');\n};\n\nexport const isJsonObject = (value: JsonValue): value is JsonObject =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const toJsonObject = (value: unknown): JsonObject => {\n const normalised = toJsonValue(value);\n if (isJsonObject(normalised)) {\n return normalised;\n }\n throw new TypeError('Expected JSON object value');\n};\n\nexport const serialiseAuthConfig = (auth: AgentAuthConfig): JsonObject => {\n const authPayload: JsonObject = {};\n if (auth.type) {\n authPayload.type = auth.type;\n }\n if (auth.token) {\n authPayload.token = auth.token;\n }\n if (auth.username) {\n authPayload.username = auth.username;\n }\n if (auth.password) {\n authPayload.password = auth.password;\n }\n if (auth.headerName) {\n authPayload.headerName = auth.headerName;\n }\n if (auth.headerValue) {\n authPayload.headerValue = auth.headerValue;\n }\n if (auth.headers) {\n authPayload.headers = { ...auth.headers };\n }\n return authPayload;\n};\n\nexport const serialiseAgentRegistrationRequest = (\n payload: AgentRegistrationRequest,\n): JsonObject => {\n const body: JsonObject = {\n profile: toJsonObject(payload.profile),\n };\n if (payload.endpoint !== undefined) {\n body.endpoint = payload.endpoint;\n }\n if (payload.protocol !== undefined) {\n body.protocol = payload.protocol;\n }\n if (payload.communicationProtocol !== undefined) {\n body.communicationProtocol = payload.communicationProtocol;\n }\n if (payload.registry !== undefined) {\n body.registry = payload.registry;\n }\n if (payload.additionalRegistries !== undefined) {\n body.additionalRegistries = payload.additionalRegistries;\n }\n if (payload.metadata !== undefined) {\n body.metadata = toJsonObject(payload.metadata);\n }\n return body;\n};\n\nexport type X402NetworkId = 'base' | 'base-sepolia';\n\nexport const normalizeHexPrivateKey = (value: string): `0x${string}` => {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error('evmPrivateKey is required');\n }\n return trimmed.startsWith('0x')\n ? (trimmed as `0x${string}`)\n : (`0x${trimmed}` as `0x${string}`);\n};\n\nexport function normaliseBaseUrl(input?: string): string {\n const trimmed = input?.trim();\n let baseCandidate =\n trimmed && trimmed.length > 0 ? trimmed : DEFAULT_BASE_URL;\n\n try {\n const url = new URL(stripTrailingSlashes(baseCandidate));\n const hostname = url.hostname.toLowerCase();\n const ensureRegistryPrefix = (): void => {\n if (!url.pathname.startsWith('/registry')) {\n url.pathname =\n url.pathname === '/' ? '/registry' : `/registry${url.pathname}`;\n }\n };\n\n if (hostname === 'hol.org') {\n ensureRegistryPrefix();\n baseCandidate = url.toString();\n } else if (\n hostname === 'registry.hashgraphonline.com' ||\n hostname === 'hashgraphonline.com'\n ) {\n ensureRegistryPrefix();\n url.hostname = 'hol.org';\n baseCandidate = url.toString();\n }\n } catch {}\n\n const withoutTrailing = stripTrailingSlashes(baseCandidate);\n if (/\\/api\\/v\\d+$/i.test(withoutTrailing)) {\n return withoutTrailing;\n }\n if (/\\/api$/i.test(withoutTrailing)) {\n return `${withoutTrailing}/v1`;\n }\n return `${withoutTrailing}/api/v1`;\n}\n\nexport function buildSearchQuery(params: SearchParams): string {\n const query = new URLSearchParams();\n const appendList = (key: string, values?: string[]) => {\n if (!values) {\n return;\n }\n values.forEach(value => {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.length > 0) {\n query.append(key, trimmed);\n }\n }\n });\n };\n\n if (params.q) {\n const trimmed = params.q.trim();\n if (trimmed.length > 0) {\n query.set('q', trimmed);\n }\n }\n if (typeof params.page === 'number') {\n query.set('page', params.page.toString());\n }\n if (typeof params.limit === 'number') {\n query.set('limit', params.limit.toString());\n }\n if (params.registry) {\n const trimmed = params.registry.trim();\n if (trimmed.length > 0) {\n query.set('registry', trimmed);\n }\n }\n appendList('registries', params.registries);\n if (typeof params.minTrust === 'number') {\n query.set('minTrust', params.minTrust.toString());\n }\n appendList('capabilities', params.capabilities);\n appendList('protocols', params.protocols);\n appendList('adapters', params.adapters);\n\n if (params.metadata) {\n Object.entries(params.metadata).forEach(([key, values]) => {\n if (!key || !Array.isArray(values) || values.length === 0) {\n return;\n }\n const trimmedKey = key.trim();\n if (trimmedKey.length === 0) {\n return;\n }\n values.forEach(value => {\n if (value === undefined || value === null) {\n return;\n }\n query.append(`metadata.${trimmedKey}`, String(value));\n });\n });\n }\n\n if (params.type) {\n const trimmedType = params.type.trim();\n if (trimmedType.length > 0 && trimmedType.toLowerCase() !== 'all') {\n query.set('type', trimmedType);\n }\n }\n\n if (params.verified === true) {\n query.set('verified', 'true');\n }\n\n if (params.online === true) {\n query.set('online', 'true');\n }\n\n if (params.sortBy) {\n const trimmedSort = params.sortBy.trim();\n if (trimmedSort.length > 0) {\n query.set('sortBy', trimmedSort);\n }\n }\n\n if (params.sortOrder) {\n const lowered = params.sortOrder.toLowerCase();\n if (lowered === 'asc' || lowered === 'desc') {\n query.set('sortOrder', lowered);\n }\n }\n const queryString = query.toString();\n return queryString.length > 0 ? `?${queryString}` : '';\n}\n"],"names":[],"mappings":"AAQO,MAAM,qBAAqB;AAC3B,MAAM,+BAA+B;AACrC,MAAM,8BAA8B,IAAI,KAAK;AAC7C,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;AAC1B,MAAM,8BAA8B;AACpC,MAAM,2CAA2C;AAExD,MAAM,uBAAuB,CAAC,UAA0B;AACtD,MAAI,MAAM,MAAM;AAChB,SAAO,MAAM,KAAK,MAAM,WAAW,MAAM,CAAC,MAAM,IAAI;AAClD,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,MAAM,SAAS,QAAQ,MAAM,MAAM,GAAG,GAAG;AAC1D;AAEO,MAAM,mBAAmB,MAC9B,OAAO,iBAAiB,aACpB,IAAI,aAAa,WAAW,YAAY,IACxC,IAAI,MAAM,2BAA2B;AAEpC,MAAM,sBAAsB,CAAC,SAClC,KAAK,KAAA,EAAO,YAAA;AAEP,MAAM,mBAAmB,MAC9B,OAAO,WAAW,eAAe,OAAO,OAAO,UAAU;AAEpD,MAAM,cAAc,CAAC,UAA8B;AACxD,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,MAAM;AACzB,WAAO,MAAM,YAAA;AAAA,EACf;AACA,MACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAA,SAAS,SAAS,SAAY,OAAO,YAAY,IAAI,CAAE;AAAA,EAC1E;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,SAAqB,CAAA;AAC3B,WAAO,QAAQ,KAAgC,EAAE;AAAA,MAC/C,CAAC,CAAC,KAAK,UAAU,MAAM;AACrB,YAAI,eAAe,QAAW;AAC5B,iBAAO,GAAG,IAAI,YAAY,UAAU;AAAA,QACtC;AAAA,MACF;AAAA,IAAA;AAEF,WAAO;AAAA,EACT;AACA,QAAM,IAAI,UAAU,2CAA2C;AACjE;AAEO,MAAM,eAAe,CAAC,UAC3B,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAE9D,MAAM,eAAe,CAAC,UAA+B;AAC1D,QAAM,aAAa,YAAY,KAAK;AACpC,MAAI,aAAa,UAAU,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,IAAI,UAAU,4BAA4B;AAClD;AAEO,MAAM,sBAAsB,CAAC,SAAsC;AACxE,QAAM,cAA0B,CAAA;AAChC,MAAI,KAAK,MAAM;AACb,gBAAY,OAAO,KAAK;AAAA,EAC1B;AACA,MAAI,KAAK,OAAO;AACd,gBAAY,QAAQ,KAAK;AAAA,EAC3B;AACA,MAAI,KAAK,UAAU;AACjB,gBAAY,WAAW,KAAK;AAAA,EAC9B;AACA,MAAI,KAAK,UAAU;AACjB,gBAAY,WAAW,KAAK;AAAA,EAC9B;AACA,MAAI,KAAK,YAAY;AACnB,gBAAY,aAAa,KAAK;AAAA,EAChC;AACA,MAAI,KAAK,aAAa;AACpB,gBAAY,cAAc,KAAK;AAAA,EACjC;AACA,MAAI,KAAK,SAAS;AAChB,gBAAY,UAAU,EAAE,GAAG,KAAK,QAAA;AAAA,EAClC;AACA,SAAO;AACT;AAEO,MAAM,oCAAoC,CAC/C,YACe;AACf,QAAM,OAAmB;AAAA,IACvB,SAAS,aAAa,QAAQ,OAAO;AAAA,EAAA;AAEvC,MAAI,QAAQ,aAAa,QAAW;AAClC,SAAK,WAAW,QAAQ;AAAA,EAC1B;AACA,MAAI,QAAQ,aAAa,QAAW;AAClC,SAAK,WAAW,QAAQ;AAAA,EAC1B;AACA,MAAI,QAAQ,0BAA0B,QAAW;AAC/C,SAAK,wBAAwB,QAAQ;AAAA,EACvC;AACA,MAAI,QAAQ,aAAa,QAAW;AAClC,SAAK,WAAW,QAAQ;AAAA,EAC1B;AACA,MAAI,QAAQ,yBAAyB,QAAW;AAC9C,SAAK,uBAAuB,QAAQ;AAAA,EACtC;AACA,MAAI,QAAQ,aAAa,QAAW;AAClC,SAAK,WAAW,aAAa,QAAQ,QAAQ;AAAA,EAC/C;AACA,SAAO;AACT;AAIO,MAAM,yBAAyB,CAAC,UAAiC;AACtE,QAAM,UAAU,MAAM,KAAA;AACtB,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,SAAO,QAAQ,WAAW,IAAI,IACzB,UACA,KAAK,OAAO;AACnB;AAEO,SAAS,iBAAiB,OAAwB;AACvD,QAAM,UAAU,OAAO,KAAA;AACvB,MAAI,gBACF,WAAW,QAAQ,SAAS,IAAI,UAAU;AAE5C,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,qBAAqB,aAAa,CAAC;AACvD,UAAM,WAAW,IAAI,SAAS,YAAA;AAC9B,UAAM,uBAAuB,MAAY;AACvC,UAAI,CAAC,IAAI,SAAS,WAAW,WAAW,GAAG;AACzC,YAAI,WACF,IAAI,aAAa,MAAM,cAAc,YAAY,IAAI,QAAQ;AAAA,MACjE;AAAA,IACF;AAEA,QAAI,aAAa,WAAW;AAC1B,2BAAA;AACA,sBAAgB,IAAI,SAAA;AAAA,IACtB,WACE,aAAa,kCACb,aAAa,uBACb;AACA,2BAAA;AACA,UAAI,WAAW;AACf,sBAAgB,IAAI,SAAA;AAAA,IACtB;AAAA,EACF,QAAQ;AAAA,EAAC;AAET,QAAM,kBAAkB,qBAAqB,aAAa;AAC1D,MAAI,gBAAgB,KAAK,eAAe,GAAG;AACzC,WAAO;AAAA,EACT;AACA,MAAI,UAAU,KAAK,eAAe,GAAG;AACnC,WAAO,GAAG,eAAe;AAAA,EAC3B;AACA,SAAO,GAAG,eAAe;AAC3B;AAEO,SAAS,iBAAiB,QAA8B;AAC7D,QAAM,QAAQ,IAAI,gBAAA;AAClB,QAAM,aAAa,CAAC,KAAa,WAAsB;AACrD,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,WAAO,QAAQ,CAAA,UAAS;AACtB,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,UAAU,MAAM,KAAA;AACtB,YAAI,QAAQ,SAAS,GAAG;AACtB,gBAAM,OAAO,KAAK,OAAO;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,GAAG;AACZ,UAAM,UAAU,OAAO,EAAE,KAAA;AACzB,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,IAAI,KAAK,OAAO;AAAA,IACxB;AAAA,EACF;AACA,MAAI,OAAO,OAAO,SAAS,UAAU;AACnC,UAAM,IAAI,QAAQ,OAAO,KAAK,UAAU;AAAA,EAC1C;AACA,MAAI,OAAO,OAAO,UAAU,UAAU;AACpC,UAAM,IAAI,SAAS,OAAO,MAAM,UAAU;AAAA,EAC5C;AACA,MAAI,OAAO,UAAU;AACnB,UAAM,UAAU,OAAO,SAAS,KAAA;AAChC,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,IAAI,YAAY,OAAO;AAAA,IAC/B;AAAA,EACF;AACA,aAAW,cAAc,OAAO,UAAU;AAC1C,MAAI,OAAO,OAAO,aAAa,UAAU;AACvC,UAAM,IAAI,YAAY,OAAO,SAAS,UAAU;AAAA,EAClD;AACA,aAAW,gBAAgB,OAAO,YAAY;AAC9C,aAAW,aAAa,OAAO,SAAS;AACxC,aAAW,YAAY,OAAO,QAAQ;AAEtC,MAAI,OAAO,UAAU;AACnB,WAAO,QAAQ,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,MAAM,MAAM;AACzD,UAAI,CAAC,OAAO,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACzD;AAAA,MACF;AACA,YAAM,aAAa,IAAI,KAAA;AACvB,UAAI,WAAW,WAAW,GAAG;AAC3B;AAAA,MACF;AACA,aAAO,QAAQ,CAAA,UAAS;AACtB,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,QACF;AACA,cAAM,OAAO,YAAY,UAAU,IAAI,OAAO,KAAK,CAAC;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,MAAM;AACf,UAAM,cAAc,OAAO,KAAK,KAAA;AAChC,QAAI,YAAY,SAAS,KAAK,YAAY,YAAA,MAAkB,OAAO;AACjE,YAAM,IAAI,QAAQ,WAAW;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,OAAO,aAAa,MAAM;AAC5B,UAAM,IAAI,YAAY,MAAM;AAAA,EAC9B;AAEA,MAAI,OAAO,WAAW,MAAM;AAC1B,UAAM,IAAI,UAAU,MAAM;AAAA,EAC5B;AAEA,MAAI,OAAO,QAAQ;AACjB,UAAM,cAAc,OAAO,OAAO,KAAA;AAClC,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,IAAI,UAAU,WAAW;AAAA,IACjC;AAAA,EACF;AAEA,MAAI,OAAO,WAAW;AACpB,UAAM,UAAU,OAAO,UAAU,YAAA;AACjC,QAAI,YAAY,SAAS,YAAY,QAAQ;AAC3C,YAAM,IAAI,aAAa,OAAO;AAAA,IAChC;AAAA,EACF;AACA,QAAM,cAAc,MAAM,SAAA;AAC1B,SAAO,YAAY,SAAS,IAAI,IAAI,WAAW,KAAK;AACtD;"}
1
+ {"version":3,"file":"standards-sdk.es160.js","sources":["../../src/services/registry-broker/client/encrypted-chat-manager.ts"],"sourcesContent":["import type {\n AcceptEncryptedChatSessionOptions,\n ChatHistoryEntry,\n CipherEnvelopeRecipient,\n EncryptedChatSessionHandle,\n EncryptionHandshakeRecord,\n RecipientIdentity,\n SessionEncryptionSummary,\n SharedSecretInput,\n StartEncryptedChatSessionOptions,\n} from '../types';\nimport { RegistryBrokerClient } from './base-client';\n\ninterface EncryptedSessionContext {\n sessionId: string;\n sharedSecret: Uint8Array;\n summary: SessionEncryptionSummary;\n recipients: RecipientIdentity[];\n identity?: RecipientIdentity;\n}\n\ninterface ConversationContextInput {\n sessionId: string;\n sharedSecret: Uint8Array | Buffer;\n identity?: RecipientIdentity;\n}\n\ndeclare module './base-client' {\n interface RegistryBrokerClient {\n registerConversationContextForEncryption(\n context: ConversationContextInput,\n ): void;\n }\n}\n\nexport class EncryptionUnavailableError extends Error {\n constructor(\n readonly sessionId: string,\n readonly summary?: SessionEncryptionSummary | null,\n ) {\n super('Encryption is not enabled for this session');\n }\n}\n\nexport class EncryptedChatManager {\n constructor(private readonly client: RegistryBrokerClient) {}\n\n registerConversationContext(context: ConversationContextInput): void {\n this.client.registerConversationContextForEncryption(context);\n }\n\n async startSession(\n options: StartEncryptedChatSessionOptions,\n ): Promise<EncryptedChatSessionHandle> {\n await this.client.encryptionReady();\n const session = await this.client.chat.createSession({\n uaid: options.uaid,\n senderUaid: options.senderUaid,\n encryptionRequested: true,\n historyTtlSeconds: options.historyTtlSeconds,\n auth: options.auth,\n });\n options.onSessionCreated?.(session.sessionId);\n const summary = session.encryption;\n if (!summary?.enabled) {\n throw new EncryptionUnavailableError(\n session.sessionId,\n session.encryption ?? null,\n );\n }\n const handle = await this.establishRequesterContext({\n sessionId: session.sessionId,\n summary,\n senderUaid: options.senderUaid,\n handshakeTimeoutMs: options.handshakeTimeoutMs,\n pollIntervalMs: options.pollIntervalMs,\n });\n return handle;\n }\n\n async acceptSession(\n options: AcceptEncryptedChatSessionOptions,\n ): Promise<EncryptedChatSessionHandle> {\n await this.client.encryptionReady();\n const summary = await this.waitForEncryptionSummary(\n options.sessionId,\n options.handshakeTimeoutMs,\n options.pollIntervalMs,\n );\n const handle = await this.establishResponderContext({\n sessionId: options.sessionId,\n summary,\n responderUaid: options.responderUaid,\n handshakeTimeoutMs: options.handshakeTimeoutMs,\n pollIntervalMs: options.pollIntervalMs,\n });\n return handle;\n }\n\n private async establishRequesterContext(params: {\n sessionId: string;\n summary: SessionEncryptionSummary;\n senderUaid?: string;\n handshakeTimeoutMs?: number;\n pollIntervalMs?: number;\n }): Promise<EncryptedChatSessionHandle> {\n const keyPair = this.client.encryption.generateEphemeralKeyPair();\n await this.client.chat.submitEncryptionHandshake(params.sessionId, {\n role: 'requester',\n keyType: 'secp256k1',\n ephemeralPublicKey: keyPair.publicKey,\n uaid: params.senderUaid ?? params.summary.requester?.uaid ?? undefined,\n });\n const { summary, record } = await this.waitForHandshakeCompletion(\n params.sessionId,\n params.handshakeTimeoutMs,\n params.pollIntervalMs,\n );\n const responderKey = record.responder?.ephemeralPublicKey;\n if (!responderKey) {\n throw new Error('Responder handshake was not completed in time');\n }\n const sharedSecret = this.client.encryption\n .deriveSharedSecret({\n privateKey: keyPair.privateKey,\n peerPublicKey: responderKey,\n })\n .subarray();\n const recipients = this.buildRecipients(summary);\n return this.createHandle({\n sessionId: params.sessionId,\n sharedSecret,\n summary,\n recipients,\n identity: summary.requester ?? undefined,\n });\n }\n\n private async establishResponderContext(params: {\n sessionId: string;\n summary: SessionEncryptionSummary;\n responderUaid?: string;\n handshakeTimeoutMs?: number;\n pollIntervalMs?: number;\n }): Promise<EncryptedChatSessionHandle> {\n const keyPair = this.client.encryption.generateEphemeralKeyPair();\n await this.client.chat.submitEncryptionHandshake(params.sessionId, {\n role: 'responder',\n keyType: 'secp256k1',\n ephemeralPublicKey: keyPair.publicKey,\n uaid: params.responderUaid ?? params.summary.responder?.uaid ?? undefined,\n });\n const { summary, record } = await this.waitForHandshakeCompletion(\n params.sessionId,\n params.handshakeTimeoutMs,\n params.pollIntervalMs,\n );\n const requesterKey = record.requester?.ephemeralPublicKey;\n if (!requesterKey) {\n throw new Error('Requester handshake was not detected in time');\n }\n const sharedSecret = this.client.encryption\n .deriveSharedSecret({\n privateKey: keyPair.privateKey,\n peerPublicKey: requesterKey,\n })\n .subarray();\n const recipients = this.buildRecipients(summary);\n return this.createHandle({\n sessionId: params.sessionId,\n sharedSecret,\n summary,\n recipients,\n identity: summary.responder ?? undefined,\n });\n }\n\n private async waitForHandshakeCompletion(\n sessionId: string,\n timeoutMs = 30_000,\n pollIntervalMs = 1_000,\n ): Promise<{\n summary: SessionEncryptionSummary;\n record: EncryptionHandshakeRecord;\n }> {\n const deadline = Date.now() + timeoutMs;\n while (true) {\n const status = await this.client.chat.getEncryptionStatus(sessionId);\n const summary = status.encryption;\n const record = summary?.handshake;\n if (summary && record && record.status === 'complete') {\n return { summary, record };\n }\n if (Date.now() >= deadline) {\n throw new Error('Timed out waiting for encrypted handshake completion');\n }\n await this.delay(pollIntervalMs);\n }\n }\n\n private async waitForEncryptionSummary(\n sessionId: string,\n _timeoutMs = 30_000,\n _pollIntervalMs = 1_000,\n ): Promise<SessionEncryptionSummary> {\n const status = await this.client.chat.getEncryptionStatus(sessionId);\n if (!status.encryption?.enabled) {\n throw new EncryptionUnavailableError(\n sessionId,\n status.encryption ?? null,\n );\n }\n return status.encryption;\n }\n\n private buildRecipients(\n summary: SessionEncryptionSummary,\n ): RecipientIdentity[] {\n const candidates = [summary.requester, summary.responder].filter(Boolean);\n const normalized = candidates\n .map(candidate => {\n if (!candidate) {\n return null;\n }\n const recipient: RecipientIdentity = {};\n if (candidate.uaid) {\n recipient.uaid = candidate.uaid;\n }\n if (candidate.ledgerAccountId) {\n recipient.ledgerAccountId = candidate.ledgerAccountId;\n }\n if (candidate.userId) {\n recipient.userId = candidate.userId;\n }\n if (candidate.email) {\n recipient.email = candidate.email;\n }\n return recipient;\n })\n .filter((entry): entry is RecipientIdentity =>\n Boolean(\n entry?.uaid ||\n entry?.ledgerAccountId ||\n entry?.userId ||\n entry?.email,\n ),\n );\n if (normalized.length > 0) {\n return normalized;\n }\n if (summary.responder?.uaid) {\n return [{ uaid: summary.responder.uaid }];\n }\n return [];\n }\n\n private createHandle(\n context: EncryptedSessionContext,\n ): EncryptedChatSessionHandle {\n const sharedSecret = context.sharedSecret;\n const uaid =\n context.summary.requester?.uaid ??\n context.summary.responder?.uaid ??\n context.identity?.uaid;\n const handle: EncryptedChatSessionHandle = {\n sessionId: context.sessionId,\n mode: 'encrypted',\n summary: context.summary,\n send: async options => {\n const recipients = options.recipients ?? context.recipients;\n return this.client.chat.sendMessage({\n sessionId: context.sessionId,\n message: options.message ?? '[ciphertext omitted]',\n streaming: options.streaming,\n auth: options.auth,\n uaid,\n encryption: {\n plaintext: options.plaintext,\n sharedSecret: Buffer.from(sharedSecret),\n recipients,\n },\n });\n },\n decryptHistoryEntry: entry =>\n this.decryptEntry(entry, context.identity, sharedSecret),\n };\n this.registerConversationContext({\n sessionId: context.sessionId,\n sharedSecret,\n identity: context.identity,\n });\n return handle;\n }\n\n private decryptEntry(\n entry: ChatHistoryEntry,\n identity: RecipientIdentity | undefined,\n fallbackSecret: Uint8Array,\n ): string | null {\n const envelope = entry.cipherEnvelope;\n if (!envelope) {\n return null;\n }\n const secret: SharedSecretInput = Buffer.from(fallbackSecret);\n try {\n return this.client.encryption.decryptCipherEnvelope({\n envelope,\n sharedSecret: secret,\n });\n } catch (_error) {\n return null;\n }\n }\n\n private recipientMatches(\n candidate: CipherEnvelopeRecipient,\n target: RecipientIdentity,\n ): boolean {\n if (\n target.uaid &&\n candidate.uaid?.toLowerCase() === target.uaid.toLowerCase()\n ) {\n return true;\n }\n if (\n target.ledgerAccountId &&\n candidate.ledgerAccountId?.toLowerCase() ===\n target.ledgerAccountId.toLowerCase()\n ) {\n return true;\n }\n if (target.userId && candidate.userId === target.userId) {\n return true;\n }\n if (\n target.email &&\n candidate.email?.toLowerCase() === target.email.toLowerCase()\n ) {\n return true;\n }\n return false;\n }\n\n private async delay(ms: number): Promise<void> {\n if (ms <= 0) {\n return;\n }\n await new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Client, PrivateKey, AccountCreateTransaction, Hbar, CustomFixedFee, AccountId, TokenId, KeyList, TopicMessageSubmitTransaction, Transaction, ScheduleCreateTransaction, Timestamp } from "@hashgraph/sdk";
2
2
  import { AccountCreationError, TopicCreationError, ConnectionConfirmationError, PayloadSizeError } from "./standards-sdk.es17.js";
3
- import { InscriptionSDK } from "./standards-sdk.es147.js";
3
+ import { InscriptionSDK } from "./standards-sdk.es149.js";
4
4
  import { Logger } from "./standards-sdk.es105.js";
5
5
  import { accountIdsToExemptKeys } from "./standards-sdk.es107.js";
6
6
  import { ProgressReporter } from "./standards-sdk.es108.js";
@@ -13,18 +13,17 @@ import "./standards-sdk.es130.js";
13
13
  import "./standards-sdk.es131.js";
14
14
  import "./standards-sdk.es132.js";
15
15
  import "./standards-sdk.es133.js";
16
- import "./standards-sdk.es134.js";
17
16
  import "buffer";
18
17
  import "crypto";
19
18
  import "@noble/curves/secp256k1.js";
20
19
  import "zod";
21
- import "./standards-sdk.es148.js";
22
- import "./standards-sdk.es138.js";
20
+ import "./standards-sdk.es150.js";
21
+ import "./standards-sdk.es137.js";
23
22
  import "ethers";
24
23
  import "./standards-sdk.es122.js";
25
24
  import { detectKeyTypeFromString } from "./standards-sdk.es113.js";
26
25
  import { getTopicId } from "./standards-sdk.es114.js";
27
- import { createNodeOperatorContext, NodeOperatorResolver } from "./standards-sdk.es149.js";
26
+ import { createNodeOperatorContext, NodeOperatorResolver } from "./standards-sdk.es146.js";
28
27
  import { HCS10BaseClient, Hcs10MemoType } from "./standards-sdk.es16.js";
29
28
  import * as mime from "mime-types";
30
29
  import { AgentBuilder } from "./standards-sdk.es23.js";
@@ -32,7 +31,7 @@ import { InboundTopicType } from "./standards-sdk.es28.js";
32
31
  import { HCS11Client } from "./standards-sdk.es27.js";
33
32
  import { inscribe } from "./standards-sdk.es124.js";
34
33
  import { addSeconds } from "date-fns";
35
- import { buildTopicCreateTx, buildMessageTx } from "./standards-sdk.es150.js";
34
+ import { buildTopicCreateTx, buildMessageTx } from "./standards-sdk.es147.js";
36
35
  import { buildHcs10CreateInboundTopicTx, buildHcs10CreateConnectionTopicTx, buildHcs10ConfirmConnectionTx, buildHcs10SendMessageTx, buildHcs10RegistryRegisterTx, buildHcs10CreateOutboundTopicTx, buildHcs10CreateRegistryTopicTx } from "./standards-sdk.es22.js";
37
36
  class HCS10Client extends HCS10BaseClient {
38
37
  constructor(config) {