@hashgraphonline/standards-sdk 0.1.170 → 0.1.172

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 (159) hide show
  1. package/README.md +2 -2
  2. package/dist/browser/services/registry-broker/client/base-client.d.ts +3 -2
  3. package/dist/browser/services/registry-broker/client/base-client.d.ts.map +1 -1
  4. package/dist/browser/services/registry-broker/client/search.d.ts +2 -1
  5. package/dist/browser/services/registry-broker/client/search.d.ts.map +1 -1
  6. package/dist/browser/services/registry-broker/client.d.ts +1 -0
  7. package/dist/browser/services/registry-broker/client.d.ts.map +1 -1
  8. package/dist/browser/services/registry-broker/schemas.d.ts +17723 -58
  9. package/dist/browser/services/registry-broker/schemas.d.ts.map +1 -1
  10. package/dist/browser/services/registry-broker/types.d.ts +36 -1
  11. package/dist/browser/services/registry-broker/types.d.ts.map +1 -1
  12. package/dist/browser/standards-sdk.browser.js +64 -1
  13. package/dist/browser/standards-sdk.browser.js.map +1 -1
  14. package/dist/cjs/services/registry-broker/client/base-client.d.ts +3 -2
  15. package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
  16. package/dist/cjs/services/registry-broker/client/search.d.ts +2 -1
  17. package/dist/cjs/services/registry-broker/client/search.d.ts.map +1 -1
  18. package/dist/cjs/services/registry-broker/client.d.ts +1 -0
  19. package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
  20. package/dist/cjs/services/registry-broker/schemas.d.ts +17814 -149
  21. package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
  22. package/dist/cjs/services/registry-broker/types.d.ts +36 -1
  23. package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
  24. package/dist/cjs/standards-sdk.cjs +3 -3
  25. package/dist/cjs/standards-sdk.cjs.map +1 -1
  26. package/dist/es/services/registry-broker/client/base-client.d.ts +3 -2
  27. package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
  28. package/dist/es/services/registry-broker/client/search.d.ts +2 -1
  29. package/dist/es/services/registry-broker/client/search.d.ts.map +1 -1
  30. package/dist/es/services/registry-broker/client.d.ts +1 -0
  31. package/dist/es/services/registry-broker/client.d.ts.map +1 -1
  32. package/dist/es/services/registry-broker/schemas.d.ts +17814 -149
  33. package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
  34. package/dist/es/services/registry-broker/types.d.ts +36 -1
  35. package/dist/es/services/registry-broker/types.d.ts.map +1 -1
  36. package/dist/es/standards-sdk.es.js +20 -9
  37. package/dist/es/standards-sdk.es.js.map +1 -1
  38. package/dist/es/standards-sdk.es104.js +1 -1
  39. package/dist/es/standards-sdk.es106.js +1 -1
  40. package/dist/es/standards-sdk.es108.js +1 -1
  41. package/dist/es/standards-sdk.es11.js +1 -1
  42. package/dist/es/standards-sdk.es110.js +1 -1
  43. package/dist/es/standards-sdk.es116.js +2 -2
  44. package/dist/es/standards-sdk.es12.js +1 -1
  45. package/dist/es/standards-sdk.es121.js +1 -1
  46. package/dist/es/standards-sdk.es127.js +1 -1
  47. package/dist/es/standards-sdk.es128.js +5 -5
  48. package/dist/es/standards-sdk.es138.js +1 -1
  49. package/dist/es/standards-sdk.es139.js +1 -1
  50. package/dist/es/standards-sdk.es140.js +5 -5
  51. package/dist/es/standards-sdk.es142.js +2 -2
  52. package/dist/es/standards-sdk.es143.js +1 -1
  53. package/dist/es/standards-sdk.es145.js +65 -1
  54. package/dist/es/standards-sdk.es145.js.map +1 -1
  55. package/dist/es/standards-sdk.es147.js +250 -78
  56. package/dist/es/standards-sdk.es147.js.map +1 -1
  57. package/dist/es/standards-sdk.es148.js +77 -71
  58. package/dist/es/standards-sdk.es148.js.map +1 -1
  59. package/dist/es/standards-sdk.es149.js +79 -936
  60. package/dist/es/standards-sdk.es149.js.map +1 -1
  61. package/dist/es/standards-sdk.es150.js +934 -53
  62. package/dist/es/standards-sdk.es150.js.map +1 -1
  63. package/dist/es/standards-sdk.es151.js +53 -152
  64. package/dist/es/standards-sdk.es151.js.map +1 -1
  65. package/dist/es/standards-sdk.es152.js +159 -7
  66. package/dist/es/standards-sdk.es152.js.map +1 -1
  67. package/dist/es/standards-sdk.es153.js +7 -86
  68. package/dist/es/standards-sdk.es153.js.map +1 -1
  69. package/dist/es/standards-sdk.es154.js +64 -43
  70. package/dist/es/standards-sdk.es154.js.map +1 -1
  71. package/dist/es/standards-sdk.es155.js +65 -30
  72. package/dist/es/standards-sdk.es155.js.map +1 -1
  73. package/dist/es/standards-sdk.es156.js +30 -34
  74. package/dist/es/standards-sdk.es156.js.map +1 -1
  75. package/dist/es/standards-sdk.es157.js +34 -48
  76. package/dist/es/standards-sdk.es157.js.map +1 -1
  77. package/dist/es/standards-sdk.es158.js +48 -138
  78. package/dist/es/standards-sdk.es158.js.map +1 -1
  79. package/dist/es/standards-sdk.es159.js +133 -37
  80. package/dist/es/standards-sdk.es159.js.map +1 -1
  81. package/dist/es/standards-sdk.es16.js +1 -1
  82. package/dist/es/standards-sdk.es160.js +34 -12474
  83. package/dist/es/standards-sdk.es160.js.map +1 -1
  84. package/dist/es/standards-sdk.es161.js +12479 -53
  85. package/dist/es/standards-sdk.es161.js.map +1 -1
  86. package/dist/es/standards-sdk.es162.js +48 -76
  87. package/dist/es/standards-sdk.es162.js.map +1 -1
  88. package/dist/es/standards-sdk.es163.js +69 -66
  89. package/dist/es/standards-sdk.es163.js.map +1 -1
  90. package/dist/es/standards-sdk.es164.js +61 -180
  91. package/dist/es/standards-sdk.es164.js.map +1 -1
  92. package/dist/es/standards-sdk.es165.js +197 -14
  93. package/dist/es/standards-sdk.es165.js.map +1 -1
  94. package/dist/es/standards-sdk.es166.js +15 -548
  95. package/dist/es/standards-sdk.es166.js.map +1 -1
  96. package/dist/es/standards-sdk.es167.js +66 -165
  97. package/dist/es/standards-sdk.es167.js.map +1 -1
  98. package/dist/es/standards-sdk.es168.js +535 -307
  99. package/dist/es/standards-sdk.es168.js.map +1 -1
  100. package/dist/es/standards-sdk.es169.js +120 -294
  101. package/dist/es/standards-sdk.es169.js.map +1 -1
  102. package/dist/es/standards-sdk.es170.js +191 -322
  103. package/dist/es/standards-sdk.es170.js.map +1 -1
  104. package/dist/es/standards-sdk.es171.js +294 -279
  105. package/dist/es/standards-sdk.es171.js.map +1 -1
  106. package/dist/es/standards-sdk.es172.js +440 -63
  107. package/dist/es/standards-sdk.es172.js.map +1 -1
  108. package/dist/es/standards-sdk.es173.js +323 -65
  109. package/dist/es/standards-sdk.es173.js.map +1 -1
  110. package/dist/es/standards-sdk.es174.js +61 -157
  111. package/dist/es/standards-sdk.es174.js.map +1 -1
  112. package/dist/es/standards-sdk.es175.js +152 -202
  113. package/dist/es/standards-sdk.es175.js.map +1 -1
  114. package/dist/es/standards-sdk.es176.js +219 -223
  115. package/dist/es/standards-sdk.es176.js.map +1 -1
  116. package/dist/es/standards-sdk.es177.js +227 -107
  117. package/dist/es/standards-sdk.es177.js.map +1 -1
  118. package/dist/es/standards-sdk.es178.js +98 -105
  119. package/dist/es/standards-sdk.es178.js.map +1 -1
  120. package/dist/es/standards-sdk.es179.js +105 -140
  121. package/dist/es/standards-sdk.es179.js.map +1 -1
  122. package/dist/es/standards-sdk.es18.js +4 -4
  123. package/dist/es/standards-sdk.es180.js +2 -2
  124. package/dist/es/standards-sdk.es182.js +1 -1
  125. package/dist/es/standards-sdk.es19.js +2 -2
  126. package/dist/es/standards-sdk.es22.js +1 -1
  127. package/dist/es/standards-sdk.es27.js +4 -4
  128. package/dist/es/standards-sdk.es30.js +1 -1
  129. package/dist/es/standards-sdk.es31.js +1 -1
  130. package/dist/es/standards-sdk.es35.js +2 -2
  131. package/dist/es/standards-sdk.es36.js +3 -3
  132. package/dist/es/standards-sdk.es37.js +1 -1
  133. package/dist/es/standards-sdk.es4.js +1 -1
  134. package/dist/es/standards-sdk.es53.js +1 -1
  135. package/dist/es/standards-sdk.es56.js +1 -1
  136. package/dist/es/standards-sdk.es59.js +1 -1
  137. package/dist/es/standards-sdk.es60.js +1 -1
  138. package/dist/es/standards-sdk.es62.js +1 -1
  139. package/dist/es/standards-sdk.es63.js +2 -2
  140. package/dist/es/standards-sdk.es64.js +1 -1
  141. package/dist/es/standards-sdk.es65.js +1 -1
  142. package/dist/es/standards-sdk.es66.js +1 -1
  143. package/dist/es/standards-sdk.es67.js +2 -2
  144. package/dist/es/standards-sdk.es69.js +1 -1
  145. package/dist/es/standards-sdk.es7.js +1 -1
  146. package/dist/es/standards-sdk.es71.js +1 -1
  147. package/dist/es/standards-sdk.es72.js +2 -2
  148. package/dist/es/standards-sdk.es75.js +3 -3
  149. package/dist/es/standards-sdk.es76.js +1 -1
  150. package/dist/es/standards-sdk.es78.js +1 -1
  151. package/dist/es/standards-sdk.es83.js +1 -1
  152. package/dist/es/standards-sdk.es84.js +1 -1
  153. package/dist/es/standards-sdk.es85.js +1 -1
  154. package/dist/es/standards-sdk.es88.js +1 -1
  155. package/dist/es/standards-sdk.es90.js +1 -1
  156. package/dist/es/standards-sdk.es94.js +3 -3
  157. package/dist/es/standards-sdk.es98.js +1 -1
  158. package/dist/es/standards-sdk.es99.js +1 -1
  159. package/package.json +1 -1
@@ -1,175 +1,79 @@
1
- import * as path from "path";
1
+ import { proto } from "@hashgraph/proto";
2
+ import { ContractId } from "@hashgraph/sdk";
2
3
  import { Buffer } from "buffer";
3
- import { randomBytes } from "crypto";
4
- import { secp256k1 } from "@noble/curves/secp256k1.js";
5
- import { registerEncryptionKeyResponseSchema } from "./standards-sdk.es145.js";
6
- import { optionalImport } from "./standards-sdk.es162.js";
7
- const getFs = async () => {
8
- const fsModule = await optionalImport("node:fs");
9
- if (fsModule && typeof fsModule.existsSync === "function" && typeof fsModule.readFileSync === "function" && typeof fsModule.writeFileSync === "function" && typeof fsModule.appendFileSync === "function") {
10
- return fsModule;
4
+ function parseKey(key) {
5
+ if (!key) {
6
+ return void 0;
11
7
  }
12
- return null;
13
- };
14
- async function registerEncryptionKey(client, payload) {
15
- const raw = await client.requestJson("/encryption/keys", {
16
- method: "POST",
17
- headers: { "content-type": "application/json" },
18
- body: payload
19
- });
20
- return client.parseWithSchema(
21
- raw,
22
- registerEncryptionKeyResponseSchema,
23
- "register encryption key response"
24
- );
25
- }
26
- function normalizeAutoRegisterIdentity(config) {
27
- const identity = {};
28
- if (config.uaid) {
29
- identity.uaid = config.uaid;
30
- }
31
- if (config.ledgerAccountId) {
32
- identity.ledgerAccountId = config.ledgerAccountId;
33
- if (config.ledgerNetwork) {
34
- identity.ledgerNetwork = config.ledgerNetwork;
35
- }
8
+ if (key.contractID) {
9
+ return `ContractID: ${new ContractId(
10
+ key.contractID.shardNum ?? 0,
11
+ key.contractID.realmNum ?? 0,
12
+ key.contractID.contractNum ?? 0
13
+ ).toString()}`;
36
14
  }
37
- if (config.email) {
38
- identity.email = config.email;
15
+ if (key.ed25519) {
16
+ return `ED25519: ${Buffer.from(key.ed25519).toString("hex")}`;
39
17
  }
40
- if (identity.uaid || identity.ledgerAccountId || identity.email) {
41
- return identity;
18
+ if (key.ECDSASecp256k1) {
19
+ return `ECDSA_secp256k1: ${Buffer.from(key.ECDSASecp256k1).toString(
20
+ "hex"
21
+ )}`;
42
22
  }
43
- return null;
44
- }
45
- function derivePublicKeyFromPrivateKey(client, privateKey) {
46
- const normalized = client.hexToBuffer(privateKey);
47
- const publicKey = secp256k1.getPublicKey(normalized, true);
48
- return Buffer.from(publicKey).toString("hex");
49
- }
50
- async function resolveAutoRegisterKeyMaterial(client, config) {
51
- if (config.publicKey?.trim()) {
52
- return { publicKey: config.publicKey.trim() };
23
+ if (key?.keyList?.keys?.length > 0) {
24
+ const keys = key.keyList.keys.map((k) => parseKey(k)).filter(Boolean);
25
+ return `KeyList (${keys.length} keys): [${keys.join(", ")}]`;
53
26
  }
54
- let privateKey = config.privateKey?.trim();
55
- const envVar = config.envVar ?? "RB_ENCRYPTION_PRIVATE_KEY";
56
- if (!privateKey && envVar && process?.env?.[envVar]?.trim()) {
57
- privateKey = process.env[envVar]?.trim();
27
+ if (key?.thresholdKey?.keys?.keys?.length > 0) {
28
+ const keys = key.thresholdKey.keys.keys.map((k) => parseKey(k)).filter(Boolean);
29
+ return `ThresholdKey (${key.thresholdKey.threshold} of ${keys.length}): [${keys.join(", ")}]`;
58
30
  }
59
- if (!privateKey && config.generateIfMissing) {
60
- const pair = await client.generateEncryptionKeyPair({
61
- keyType: config.keyType ?? "secp256k1",
62
- envVar,
63
- envPath: config.envPath,
64
- overwrite: config.overwriteEnv
65
- });
66
- return { publicKey: pair.publicKey, privateKey: pair.privateKey };
31
+ if (key.delegatableContractId) {
32
+ return `DelegatableContractID: ${new ContractId(
33
+ key.delegatableContractId.shardNum ?? 0,
34
+ key.delegatableContractId.realmNum ?? 0,
35
+ key.delegatableContractId.contractNum ?? 0
36
+ ).toString()}`;
67
37
  }
68
- if (privateKey) {
69
- const publicKey = derivePublicKeyFromPrivateKey(client, privateKey);
70
- return { publicKey, privateKey };
71
- }
72
- return null;
73
- }
74
- async function autoRegisterEncryptionKey(client, config) {
75
- const identity = normalizeAutoRegisterIdentity(config);
76
- if (!identity) {
77
- throw new Error(
78
- "Auto-registration requires uaid, ledgerAccountId, or email"
79
- );
80
- }
81
- const material = await resolveAutoRegisterKeyMaterial(client, config);
82
- if (!material) {
83
- throw new Error(
84
- "Unable to resolve encryption public key for auto-registration"
85
- );
86
- }
87
- await registerEncryptionKey(client, {
88
- keyType: config.keyType ?? "secp256k1",
89
- publicKey: material.publicKey,
90
- ...identity
91
- });
92
- return material;
93
- }
94
- async function ensureAgentEncryptionKey(client, options) {
95
- return autoRegisterEncryptionKey(client, {
96
- ...options,
97
- uaid: options.uaid
98
- });
99
- }
100
- function createEncryptionApi(client) {
101
- return {
102
- registerKey: (payload) => registerEncryptionKey(client, payload),
103
- generateEphemeralKeyPair: () => client.createEphemeralKeyPair(),
104
- deriveSharedSecret: (options) => client.deriveSharedSecret(options),
105
- encryptCipherEnvelope: (options) => client.buildCipherEnvelope(options),
106
- decryptCipherEnvelope: (options) => client.openCipherEnvelope(options),
107
- ensureAgentKey: (options) => ensureAgentEncryptionKey(client, options)
108
- };
109
- }
110
- async function bootstrapEncryptionOptions(client, options) {
111
- if (!options?.autoRegister || options.autoRegister.enabled === false) {
112
- return null;
38
+ if (Object.keys(key).length === 0) {
39
+ return "Empty Key Structure";
113
40
  }
114
- return autoRegisterEncryptionKey(client, options.autoRegister);
41
+ return "Unknown or Unset Key Type";
115
42
  }
116
- async function generateEncryptionKeyPair(client, options = {}) {
117
- client.assertNodeRuntime("generateEncryptionKeyPair");
118
- const keyType = options.keyType ?? "secp256k1";
119
- if (keyType !== "secp256k1") {
120
- throw new Error("Only secp256k1 key generation is supported currently");
121
- }
122
- const privateKeyBytes = randomBytes(32);
123
- const privateKey = Buffer.from(privateKeyBytes).toString("hex");
124
- const publicKeyBytes = secp256k1.getPublicKey(privateKeyBytes, true);
125
- const publicKey = Buffer.from(publicKeyBytes).toString("hex");
126
- const envVar = options.envVar ?? "RB_ENCRYPTION_PRIVATE_KEY";
127
- const resolvedPath = options.envPath ? path.resolve(options.envPath) : void 0;
128
- if (resolvedPath) {
129
- const fsModule = await getFs();
130
- if (!fsModule) {
131
- throw new Error(
132
- "File system module is not available; cannot write encryption key env file"
133
- );
43
+ function extractTransactionBody(transaction) {
44
+ try {
45
+ const bytes = transaction.toBytes ? transaction.toBytes() : void 0;
46
+ if (!bytes) {
47
+ return null;
48
+ }
49
+ const decoded = proto.TransactionList.decode(bytes);
50
+ if (!decoded.transactionList || decoded.transactionList.length === 0) {
51
+ return null;
134
52
  }
135
- const envLine = `${envVar}=${privateKey}`;
136
- if (fsModule.existsSync(resolvedPath)) {
137
- const content = fsModule.readFileSync(resolvedPath, "utf-8");
138
- const lineRegex = new RegExp(`^${envVar}=.*$`, "m");
139
- if (lineRegex.test(content)) {
140
- if (!options.overwrite) {
141
- throw new Error(
142
- `${envVar} already exists in ${resolvedPath}; set overwrite=true to replace it`
143
- );
144
- }
145
- const updated = content.replace(lineRegex, envLine);
146
- fsModule.writeFileSync(resolvedPath, updated);
147
- } else {
148
- const needsNewline = !content.endsWith("\n");
149
- fsModule.appendFileSync(
150
- resolvedPath,
151
- `${needsNewline ? "\n" : ""}${envLine}
152
- `
153
- );
53
+ const tx = decoded.transactionList[0];
54
+ if (tx.bodyBytes && tx.bodyBytes.length > 0) {
55
+ return proto.TransactionBody.decode(tx.bodyBytes);
56
+ }
57
+ if (tx.signedTransactionBytes && tx.signedTransactionBytes.length > 0) {
58
+ const signedTx = proto.SignedTransaction.decode(
59
+ tx.signedTransactionBytes
60
+ );
61
+ if (signedTx.bodyBytes) {
62
+ return proto.TransactionBody.decode(signedTx.bodyBytes);
154
63
  }
155
- } else {
156
- fsModule.writeFileSync(resolvedPath, `${envLine}
157
- `);
158
64
  }
65
+ return null;
66
+ } catch (error) {
67
+ return null;
159
68
  }
160
- return {
161
- privateKey,
162
- publicKey,
163
- envPath: resolvedPath,
164
- envVar
165
- };
69
+ }
70
+ function hasTransactionType(transaction, transactionField) {
71
+ const txBody = extractTransactionBody(transaction);
72
+ return !!(txBody && txBody[transactionField]);
166
73
  }
167
74
  export {
168
- autoRegisterEncryptionKey,
169
- bootstrapEncryptionOptions,
170
- createEncryptionApi,
171
- ensureAgentEncryptionKey,
172
- generateEncryptionKeyPair,
173
- registerEncryptionKey
75
+ extractTransactionBody,
76
+ hasTransactionType,
77
+ parseKey
174
78
  };
175
79
  //# sourceMappingURL=standards-sdk.es174.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es174.js","sources":["../../src/services/registry-broker/client/encryption.ts"],"sourcesContent":["import * as path from 'path';\nimport { Buffer } from 'buffer';\nimport { randomBytes } from 'crypto';\nimport { secp256k1 } from '@noble/curves/secp256k1.js';\nimport type {\n AutoRegisterEncryptionKeyOptions,\n CipherEnvelope,\n ClientEncryptionOptions,\n DecryptCipherEnvelopeOptions,\n DeriveSharedSecretOptions,\n EncryptCipherEnvelopeOptions,\n EphemeralKeyPair,\n EnsureAgentKeyOptions,\n RegisterEncryptionKeyPayload,\n RegisterEncryptionKeyResponse,\n SharedSecretInput,\n} from '../types';\nimport { registerEncryptionKeyResponseSchema } from '../schemas';\nimport { optionalImport } from '../../../utils/dynamic-import';\nimport type {\n RegistryBrokerClient,\n GenerateEncryptionKeyPairOptions,\n} from './base-client';\n\ntype FsModule = {\n existsSync: (path: string) => boolean;\n readFileSync: (path: string, encoding: BufferEncoding) => string;\n writeFileSync: (path: string, data: string) => void;\n appendFileSync: (path: string, data: string) => void;\n};\n\nconst getFs = async (): Promise<FsModule | null> => {\n const fsModule = await optionalImport<Partial<FsModule>>('node:fs');\n\n if (\n fsModule &&\n typeof fsModule.existsSync === 'function' &&\n typeof fsModule.readFileSync === 'function' &&\n typeof fsModule.writeFileSync === 'function' &&\n typeof fsModule.appendFileSync === 'function'\n ) {\n return fsModule as FsModule;\n }\n\n return null;\n};\n\nexport interface RegistryBrokerEncryptionApi {\n registerKey: (\n payload: RegisterEncryptionKeyPayload,\n ) => Promise<RegisterEncryptionKeyResponse>;\n generateEphemeralKeyPair: () => EphemeralKeyPair;\n deriveSharedSecret: (options: DeriveSharedSecretOptions) => Buffer;\n encryptCipherEnvelope: (\n options: EncryptCipherEnvelopeOptions,\n ) => CipherEnvelope;\n decryptCipherEnvelope: (options: DecryptCipherEnvelopeOptions) => string;\n ensureAgentKey: (\n options: EnsureAgentKeyOptions,\n ) => Promise<{ publicKey: string; privateKey?: string }>;\n}\n\nexport async function registerEncryptionKey(\n client: RegistryBrokerClient,\n payload: RegisterEncryptionKeyPayload,\n): Promise<RegisterEncryptionKeyResponse> {\n const raw = await client.requestJson('/encryption/keys', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: payload,\n });\n return client.parseWithSchema(\n raw,\n registerEncryptionKeyResponseSchema,\n 'register encryption key response',\n );\n}\n\nfunction normalizeAutoRegisterIdentity(\n config: AutoRegisterEncryptionKeyOptions,\n): Pick<\n RegisterEncryptionKeyPayload,\n 'uaid' | 'ledgerAccountId' | 'ledgerNetwork' | 'email'\n> | null {\n const identity: Pick<\n RegisterEncryptionKeyPayload,\n 'uaid' | 'ledgerAccountId' | 'ledgerNetwork' | 'email'\n > = {};\n if (config.uaid) {\n identity.uaid = config.uaid;\n }\n if (config.ledgerAccountId) {\n identity.ledgerAccountId = config.ledgerAccountId;\n if (config.ledgerNetwork) {\n identity.ledgerNetwork = config.ledgerNetwork;\n }\n }\n if (config.email) {\n identity.email = config.email;\n }\n if (identity.uaid || identity.ledgerAccountId || identity.email) {\n return identity;\n }\n return null;\n}\n\nfunction derivePublicKeyFromPrivateKey(\n client: RegistryBrokerClient,\n privateKey: string,\n): string {\n const normalized = client.hexToBuffer(privateKey);\n const publicKey = secp256k1.getPublicKey(normalized, true);\n return Buffer.from(publicKey).toString('hex');\n}\n\nasync function resolveAutoRegisterKeyMaterial(\n client: RegistryBrokerClient,\n config: AutoRegisterEncryptionKeyOptions,\n): Promise<{ publicKey: string; privateKey?: string } | null> {\n if (config.publicKey?.trim()) {\n return { publicKey: config.publicKey.trim() };\n }\n let privateKey = config.privateKey?.trim();\n const envVar = config.envVar ?? 'RB_ENCRYPTION_PRIVATE_KEY';\n if (!privateKey && envVar && process?.env?.[envVar]?.trim()) {\n privateKey = process.env[envVar]?.trim();\n }\n if (!privateKey && config.generateIfMissing) {\n const pair = await client.generateEncryptionKeyPair({\n keyType: config.keyType ?? 'secp256k1',\n envVar,\n envPath: config.envPath,\n overwrite: config.overwriteEnv,\n });\n return { publicKey: pair.publicKey, privateKey: pair.privateKey };\n }\n if (privateKey) {\n const publicKey = derivePublicKeyFromPrivateKey(client, privateKey);\n return { publicKey, privateKey };\n }\n return null;\n}\n\nexport async function autoRegisterEncryptionKey(\n client: RegistryBrokerClient,\n config: AutoRegisterEncryptionKeyOptions,\n): Promise<{ publicKey: string; privateKey?: string }> {\n const identity = normalizeAutoRegisterIdentity(config);\n if (!identity) {\n throw new Error(\n 'Auto-registration requires uaid, ledgerAccountId, or email',\n );\n }\n const material = await resolveAutoRegisterKeyMaterial(client, config);\n if (!material) {\n throw new Error(\n 'Unable to resolve encryption public key for auto-registration',\n );\n }\n await registerEncryptionKey(client, {\n keyType: config.keyType ?? 'secp256k1',\n publicKey: material.publicKey,\n ...identity,\n });\n return material;\n}\n\nexport async function ensureAgentEncryptionKey(\n client: RegistryBrokerClient,\n options: EnsureAgentKeyOptions,\n): Promise<{ publicKey: string; privateKey?: string }> {\n return autoRegisterEncryptionKey(client, {\n ...options,\n uaid: options.uaid,\n enabled: true,\n });\n}\n\nexport function createEncryptionApi(\n client: RegistryBrokerClient,\n): RegistryBrokerEncryptionApi {\n return {\n registerKey: (payload: RegisterEncryptionKeyPayload) =>\n registerEncryptionKey(client, payload),\n generateEphemeralKeyPair: () => client.createEphemeralKeyPair(),\n deriveSharedSecret: (options: DeriveSharedSecretOptions) =>\n client.deriveSharedSecret(options),\n encryptCipherEnvelope: (options: EncryptCipherEnvelopeOptions) =>\n client.buildCipherEnvelope(options),\n decryptCipherEnvelope: (options: DecryptCipherEnvelopeOptions) =>\n client.openCipherEnvelope(options),\n ensureAgentKey: (options: EnsureAgentKeyOptions) =>\n ensureAgentEncryptionKey(client, options),\n };\n}\n\nexport async function bootstrapEncryptionOptions(\n client: RegistryBrokerClient,\n options?: ClientEncryptionOptions,\n): Promise<{ publicKey: string; privateKey?: string } | null> {\n if (!options?.autoRegister || options.autoRegister.enabled === false) {\n return null;\n }\n return autoRegisterEncryptionKey(client, options.autoRegister);\n}\n\nexport async function generateEncryptionKeyPair(\n client: RegistryBrokerClient,\n options: GenerateEncryptionKeyPairOptions = {},\n): Promise<{\n privateKey: string;\n publicKey: string;\n envPath?: string;\n envVar: string;\n}> {\n client.assertNodeRuntime('generateEncryptionKeyPair');\n\n const keyType = options.keyType ?? 'secp256k1';\n if (keyType !== 'secp256k1') {\n throw new Error('Only secp256k1 key generation is supported currently');\n }\n\n const privateKeyBytes = randomBytes(32);\n const privateKey = Buffer.from(privateKeyBytes).toString('hex');\n const publicKeyBytes = secp256k1.getPublicKey(privateKeyBytes, true);\n const publicKey = Buffer.from(publicKeyBytes).toString('hex');\n\n const envVar = options.envVar ?? 'RB_ENCRYPTION_PRIVATE_KEY';\n const resolvedPath = options.envPath\n ? path.resolve(options.envPath)\n : undefined;\n\n if (resolvedPath) {\n const fsModule = await getFs();\n\n if (!fsModule) {\n throw new Error(\n 'File system module is not available; cannot write encryption key env file',\n );\n }\n\n const envLine = `${envVar}=${privateKey}`;\n if (fsModule.existsSync(resolvedPath)) {\n const content = fsModule.readFileSync(resolvedPath, 'utf-8');\n const lineRegex = new RegExp(`^${envVar}=.*$`, 'm');\n if (lineRegex.test(content)) {\n if (!options.overwrite) {\n throw new Error(\n `${envVar} already exists in ${resolvedPath}; set overwrite=true to replace it`,\n );\n }\n const updated = content.replace(lineRegex, envLine);\n fsModule.writeFileSync(resolvedPath, updated);\n } else {\n const needsNewline = !content.endsWith('\\n');\n fsModule.appendFileSync(\n resolvedPath,\n `${needsNewline ? '\\n' : ''}${envLine}\\n`,\n );\n }\n } else {\n fsModule.writeFileSync(resolvedPath, `${envLine}\\n`);\n }\n }\n\n return {\n privateKey,\n publicKey,\n envPath: resolvedPath,\n envVar,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es174.js","sources":["../../src/utils/parsers/parser-utils.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport { ContractId, Transaction } from '@hashgraph/sdk';\nimport { Buffer } from 'buffer';\n\nexport function parseKey(\n key: proto.IKey | null | undefined,\n): string | undefined {\n if (!key) {\n return undefined;\n }\n\n if (key.contractID) {\n return `ContractID: ${new ContractId(\n key.contractID.shardNum ?? 0,\n key.contractID.realmNum ?? 0,\n key.contractID.contractNum ?? 0,\n ).toString()}`;\n }\n if (key.ed25519) {\n return `ED25519: ${Buffer.from(key.ed25519).toString('hex')}`;\n }\n if (key.ECDSASecp256k1) {\n return `ECDSA_secp256k1: ${Buffer.from(key.ECDSASecp256k1).toString(\n 'hex',\n )}`;\n }\n if (key?.keyList?.keys?.length > 0) {\n const keys = key.keyList.keys.map(k => parseKey(k)).filter(Boolean);\n return `KeyList (${keys.length} keys): [${keys.join(', ')}]`;\n }\n if (key?.thresholdKey?.keys?.keys?.length > 0) {\n const keys = key.thresholdKey.keys.keys\n .map(k => parseKey(k))\n .filter(Boolean);\n return `ThresholdKey (${key.thresholdKey.threshold} of ${\n keys.length\n }): [${keys.join(', ')}]`;\n }\n if (key.delegatableContractId) {\n return `DelegatableContractID: ${new ContractId(\n key.delegatableContractId.shardNum ?? 0,\n key.delegatableContractId.realmNum ?? 0,\n key.delegatableContractId.contractNum ?? 0,\n ).toString()}`;\n }\n if (Object.keys(key).length === 0) {\n return 'Empty Key Structure';\n }\n\n return 'Unknown or Unset Key Type';\n}\n\n/**\n * Extract TransactionBody from Transaction object using protobuf parsing\n * This replaces fragile constructor name checking with reliable protobuf data\n */\nexport function extractTransactionBody(\n transaction: Transaction,\n): proto.ITransactionBody | null {\n try {\n const bytes = transaction.toBytes ? transaction.toBytes() : undefined;\n if (!bytes) {\n return null;\n }\n\n const decoded = proto.TransactionList.decode(bytes);\n if (!decoded.transactionList || decoded.transactionList.length === 0) {\n return null;\n }\n\n const tx = decoded.transactionList[0];\n\n if (tx.bodyBytes && tx.bodyBytes.length > 0) {\n return proto.TransactionBody.decode(tx.bodyBytes);\n }\n\n if (tx.signedTransactionBytes && tx.signedTransactionBytes.length > 0) {\n const signedTx = proto.SignedTransaction.decode(\n tx.signedTransactionBytes,\n );\n if (signedTx.bodyBytes) {\n return proto.TransactionBody.decode(signedTx.bodyBytes);\n }\n }\n\n return null;\n } catch (error) {\n return null;\n }\n}\n\n/**\n * Check if transaction has specific transaction type using protobuf data\n * This replaces constructor name checking with reliable protobuf field detection\n */\nexport function hasTransactionType(\n transaction: Transaction,\n transactionField: keyof proto.ITransactionBody,\n): boolean {\n const txBody = extractTransactionBody(transaction);\n return !!(txBody && txBody[transactionField]);\n}\n"],"names":[],"mappings":";;;AAIO,SAAS,SACd,KACoB;AACpB,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,YAAY;AAClB,WAAO,eAAe,IAAI;AAAA,MACxB,IAAI,WAAW,YAAY;AAAA,MAC3B,IAAI,WAAW,YAAY;AAAA,MAC3B,IAAI,WAAW,eAAe;AAAA,IAAA,EAC9B,UAAU;AAAA,EACd;AACA,MAAI,IAAI,SAAS;AACf,WAAO,YAAY,OAAO,KAAK,IAAI,OAAO,EAAE,SAAS,KAAK,CAAC;AAAA,EAC7D;AACA,MAAI,IAAI,gBAAgB;AACtB,WAAO,oBAAoB,OAAO,KAAK,IAAI,cAAc,EAAE;AAAA,MACzD;AAAA,IAAA,CACD;AAAA,EACH;AACA,MAAI,KAAK,SAAS,MAAM,SAAS,GAAG;AAClC,UAAM,OAAO,IAAI,QAAQ,KAAK,IAAI,CAAA,MAAK,SAAS,CAAC,CAAC,EAAE,OAAO,OAAO;AAClE,WAAO,YAAY,KAAK,MAAM,YAAY,KAAK,KAAK,IAAI,CAAC;AAAA,EAC3D;AACA,MAAI,KAAK,cAAc,MAAM,MAAM,SAAS,GAAG;AAC7C,UAAM,OAAO,IAAI,aAAa,KAAK,KAChC,IAAI,CAAA,MAAK,SAAS,CAAC,CAAC,EACpB,OAAO,OAAO;AACjB,WAAO,iBAAiB,IAAI,aAAa,SAAS,OAChD,KAAK,MACP,OAAO,KAAK,KAAK,IAAI,CAAC;AAAA,EACxB;AACA,MAAI,IAAI,uBAAuB;AAC7B,WAAO,0BAA0B,IAAI;AAAA,MACnC,IAAI,sBAAsB,YAAY;AAAA,MACtC,IAAI,sBAAsB,YAAY;AAAA,MACtC,IAAI,sBAAsB,eAAe;AAAA,IAAA,EACzC,UAAU;AAAA,EACd;AACA,MAAI,OAAO,KAAK,GAAG,EAAE,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAMO,SAAS,uBACd,aAC+B;AAC/B,MAAI;AACF,UAAM,QAAQ,YAAY,UAAU,YAAY,YAAY;AAC5D,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,MAAM,gBAAgB,OAAO,KAAK;AAClD,QAAI,CAAC,QAAQ,mBAAmB,QAAQ,gBAAgB,WAAW,GAAG;AACpE,aAAO;AAAA,IACT;AAEA,UAAM,KAAK,QAAQ,gBAAgB,CAAC;AAEpC,QAAI,GAAG,aAAa,GAAG,UAAU,SAAS,GAAG;AAC3C,aAAO,MAAM,gBAAgB,OAAO,GAAG,SAAS;AAAA,IAClD;AAEA,QAAI,GAAG,0BAA0B,GAAG,uBAAuB,SAAS,GAAG;AACrE,YAAM,WAAW,MAAM,kBAAkB;AAAA,QACvC,GAAG;AAAA,MAAA;AAEL,UAAI,SAAS,WAAW;AACtB,eAAO,MAAM,gBAAgB,OAAO,SAAS,SAAS;AAAA,MACxD;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;AAMO,SAAS,mBACd,aACA,kBACS;AACT,QAAM,SAAS,uBAAuB,WAAW;AACjD,SAAO,CAAC,EAAE,UAAU,OAAO,gBAAgB;AAC7C;"}
@@ -1,225 +1,175 @@
1
- import { searchResponseSchema, statsResponseSchema, registriesResponseSchema, additionalRegistryCatalogResponseSchema, popularResponseSchema, protocolsResponseSchema, detectProtocolResponseSchema, registrySearchByNamespaceSchema, vectorSearchResponseSchema, searchStatusResponseSchema, websocketStatsResponseSchema, metricsSummaryResponseSchema, searchFacetsResponseSchema } from "./standards-sdk.es145.js";
2
- import { buildSearchQuery } from "./standards-sdk.es176.js";
3
- import { RegistryBrokerError } from "./standards-sdk.es146.js";
4
- function buildVectorFallbackSearchParams(request) {
5
- const params = {
6
- q: request.query
7
- };
8
- let effectiveLimit;
9
- if (typeof request.limit === "number" && Number.isFinite(request.limit)) {
10
- effectiveLimit = request.limit;
11
- params.limit = request.limit;
12
- }
13
- if (typeof request.offset === "number" && Number.isFinite(request.offset) && request.offset > 0) {
14
- const limit = effectiveLimit && effectiveLimit > 0 ? effectiveLimit : 20;
15
- params.limit = limit;
16
- params.page = Math.floor(request.offset / limit) + 1;
17
- }
18
- if (request.filter?.registry) {
19
- params.registry = request.filter.registry;
20
- }
21
- if (request.filter?.protocols?.length) {
22
- params.protocols = [...request.filter.protocols];
23
- }
24
- if (request.filter?.adapter?.length) {
25
- params.adapters = [...request.filter.adapter];
1
+ import * as path from "path";
2
+ import { Buffer } from "buffer";
3
+ import { randomBytes } from "crypto";
4
+ import { secp256k1 } from "@noble/curves/secp256k1.js";
5
+ import { registerEncryptionKeyResponseSchema } from "./standards-sdk.es145.js";
6
+ import { optionalImport } from "./standards-sdk.es163.js";
7
+ const getFs = async () => {
8
+ const fsModule = await optionalImport("node:fs");
9
+ if (fsModule && typeof fsModule.existsSync === "function" && typeof fsModule.readFileSync === "function" && typeof fsModule.writeFileSync === "function" && typeof fsModule.appendFileSync === "function") {
10
+ return fsModule;
26
11
  }
27
- if (request.filter?.capabilities?.length) {
28
- params.capabilities = request.filter.capabilities.map(
29
- (value) => typeof value === "number" ? value.toString(10) : value
30
- );
31
- }
32
- if (request.filter?.type) {
33
- params.type = request.filter.type;
34
- }
35
- return params;
36
- }
37
- function convertSearchResultToVectorResponse(result) {
38
- const hits = result.hits.map((agent) => ({
39
- agent,
40
- score: 0,
41
- highlights: {}
42
- }));
43
- const total = result.total;
44
- const limit = result.limit;
45
- const page = result.page;
46
- const totalVisible = page * limit;
47
- const limited = total > totalVisible || page > 1;
48
- return {
49
- hits,
50
- total,
51
- took: 0,
52
- totalAvailable: total,
53
- visible: hits.length,
54
- limited,
55
- credits_used: 0
56
- };
57
- }
58
- async function search(client, params = {}) {
59
- const query = buildSearchQuery(params);
60
- const raw = await client.requestJson(`/search${query}`, {
61
- method: "GET"
62
- });
63
- return client.parseWithSchema(raw, searchResponseSchema, "search response");
64
- }
65
- async function stats(client) {
66
- const raw = await client.requestJson("/stats", { method: "GET" });
67
- return client.parseWithSchema(raw, statsResponseSchema, "stats response");
68
- }
69
- async function registries(client) {
70
- const raw = await client.requestJson("/registries", {
71
- method: "GET"
72
- });
73
- return client.parseWithSchema(
74
- raw,
75
- registriesResponseSchema,
76
- "registries response"
77
- );
78
- }
79
- async function getAdditionalRegistries(client) {
80
- const raw = await client.requestJson(
81
- "/register/additional-registries",
82
- {
83
- method: "GET"
84
- }
85
- );
86
- return client.parseWithSchema(
87
- raw,
88
- additionalRegistryCatalogResponseSchema,
89
- "additional registry catalog response"
90
- );
91
- }
92
- async function popularSearches(client) {
93
- const raw = await client.requestJson("/popular", {
94
- method: "GET"
95
- });
96
- return client.parseWithSchema(
97
- raw,
98
- popularResponseSchema,
99
- "popular searches response"
100
- );
101
- }
102
- async function listProtocols(client) {
103
- const raw = await client.requestJson("/protocols", {
104
- method: "GET"
105
- });
106
- return client.parseWithSchema(
107
- raw,
108
- protocolsResponseSchema,
109
- "protocols response"
110
- );
111
- }
112
- async function detectProtocol(client, message) {
113
- const raw = await client.requestJson("/detect-protocol", {
12
+ return null;
13
+ };
14
+ async function registerEncryptionKey(client, payload) {
15
+ const raw = await client.requestJson("/encryption/keys", {
114
16
  method: "POST",
115
- body: { message },
116
- headers: { "content-type": "application/json" }
17
+ headers: { "content-type": "application/json" },
18
+ body: payload
117
19
  });
118
20
  return client.parseWithSchema(
119
21
  raw,
120
- detectProtocolResponseSchema,
121
- "detect protocol response"
22
+ registerEncryptionKeyResponseSchema,
23
+ "register encryption key response"
122
24
  );
123
25
  }
124
- async function registrySearchByNamespace(client, registry, query) {
125
- const params = new URLSearchParams();
126
- if (query) {
127
- params.set("q", query);
26
+ function normalizeAutoRegisterIdentity(config) {
27
+ const identity = {};
28
+ if (config.uaid) {
29
+ identity.uaid = config.uaid;
128
30
  }
129
- const suffix = params.size > 0 ? `?${params.toString()}` : "";
130
- const raw = await client.requestJson(
131
- `/registries/${encodeURIComponent(registry)}/search${suffix}`,
132
- {
133
- method: "GET"
31
+ if (config.ledgerAccountId) {
32
+ identity.ledgerAccountId = config.ledgerAccountId;
33
+ if (config.ledgerNetwork) {
34
+ identity.ledgerNetwork = config.ledgerNetwork;
134
35
  }
135
- );
136
- return client.parseWithSchema(
137
- raw,
138
- registrySearchByNamespaceSchema,
139
- "registry search response"
140
- );
36
+ }
37
+ if (config.email) {
38
+ identity.email = config.email;
39
+ }
40
+ if (identity.uaid || identity.ledgerAccountId || identity.email) {
41
+ return identity;
42
+ }
43
+ return null;
44
+ }
45
+ function derivePublicKeyFromPrivateKey(client, privateKey) {
46
+ const normalized = client.hexToBuffer(privateKey);
47
+ const publicKey = secp256k1.getPublicKey(normalized, true);
48
+ return Buffer.from(publicKey).toString("hex");
141
49
  }
142
- async function vectorSearch(client, request) {
143
- try {
144
- const raw = await client.requestJson("/search", {
145
- method: "POST",
146
- body: request,
147
- headers: { "content-type": "application/json" }
50
+ async function resolveAutoRegisterKeyMaterial(client, config) {
51
+ if (config.publicKey?.trim()) {
52
+ return { publicKey: config.publicKey.trim() };
53
+ }
54
+ let privateKey = config.privateKey?.trim();
55
+ const envVar = config.envVar ?? "RB_ENCRYPTION_PRIVATE_KEY";
56
+ if (!privateKey && envVar && process?.env?.[envVar]?.trim()) {
57
+ privateKey = process.env[envVar]?.trim();
58
+ }
59
+ if (!privateKey && config.generateIfMissing) {
60
+ const pair = await client.generateEncryptionKeyPair({
61
+ keyType: config.keyType ?? "secp256k1",
62
+ envVar,
63
+ envPath: config.envPath,
64
+ overwrite: config.overwriteEnv
148
65
  });
149
- return client.parseWithSchema(
150
- raw,
151
- vectorSearchResponseSchema,
152
- "vector search response"
153
- );
154
- } catch (error) {
155
- if (error instanceof RegistryBrokerError && error.status === 501) {
156
- const fallback = await search(
157
- client,
158
- buildVectorFallbackSearchParams(request)
159
- );
160
- return convertSearchResultToVectorResponse(fallback);
161
- }
162
- throw error;
66
+ return { publicKey: pair.publicKey, privateKey: pair.privateKey };
163
67
  }
68
+ if (privateKey) {
69
+ const publicKey = derivePublicKeyFromPrivateKey(client, privateKey);
70
+ return { publicKey, privateKey };
71
+ }
72
+ return null;
164
73
  }
165
- async function searchStatus(client) {
166
- const raw = await client.requestJson("/search/status", {
167
- method: "GET"
74
+ async function autoRegisterEncryptionKey(client, config) {
75
+ const identity = normalizeAutoRegisterIdentity(config);
76
+ if (!identity) {
77
+ throw new Error(
78
+ "Auto-registration requires uaid, ledgerAccountId, or email"
79
+ );
80
+ }
81
+ const material = await resolveAutoRegisterKeyMaterial(client, config);
82
+ if (!material) {
83
+ throw new Error(
84
+ "Unable to resolve encryption public key for auto-registration"
85
+ );
86
+ }
87
+ await registerEncryptionKey(client, {
88
+ keyType: config.keyType ?? "secp256k1",
89
+ publicKey: material.publicKey,
90
+ ...identity
168
91
  });
169
- return client.parseWithSchema(
170
- raw,
171
- searchStatusResponseSchema,
172
- "search status response"
173
- );
92
+ return material;
174
93
  }
175
- async function websocketStats(client) {
176
- const raw = await client.requestJson("/websocket/stats", {
177
- method: "GET"
94
+ async function ensureAgentEncryptionKey(client, options) {
95
+ return autoRegisterEncryptionKey(client, {
96
+ ...options,
97
+ uaid: options.uaid
178
98
  });
179
- return client.parseWithSchema(
180
- raw,
181
- websocketStatsResponseSchema,
182
- "websocket stats response"
183
- );
184
99
  }
185
- async function metricsSummary(client) {
186
- const raw = await client.requestJson("/metrics", {
187
- method: "GET"
188
- });
189
- return client.parseWithSchema(
190
- raw,
191
- metricsSummaryResponseSchema,
192
- "metrics summary response"
193
- );
100
+ function createEncryptionApi(client) {
101
+ return {
102
+ registerKey: (payload) => registerEncryptionKey(client, payload),
103
+ generateEphemeralKeyPair: () => client.createEphemeralKeyPair(),
104
+ deriveSharedSecret: (options) => client.deriveSharedSecret(options),
105
+ encryptCipherEnvelope: (options) => client.buildCipherEnvelope(options),
106
+ decryptCipherEnvelope: (options) => client.openCipherEnvelope(options),
107
+ ensureAgentKey: (options) => ensureAgentEncryptionKey(client, options)
108
+ };
194
109
  }
195
- async function facets(client, adapter) {
196
- const params = new URLSearchParams();
197
- if (adapter) {
198
- params.set("adapter", adapter);
110
+ async function bootstrapEncryptionOptions(client, options) {
111
+ if (!options?.autoRegister || options.autoRegister.enabled === false) {
112
+ return null;
199
113
  }
200
- const suffix = params.size > 0 ? `?${params.toString()}` : "";
201
- const raw = await client.requestJson(`/search/facets${suffix}`, {
202
- method: "GET"
203
- });
204
- return client.parseWithSchema(
205
- raw,
206
- searchFacetsResponseSchema,
207
- "search facets response"
208
- );
114
+ return autoRegisterEncryptionKey(client, options.autoRegister);
115
+ }
116
+ async function generateEncryptionKeyPair(client, options = {}) {
117
+ client.assertNodeRuntime("generateEncryptionKeyPair");
118
+ const keyType = options.keyType ?? "secp256k1";
119
+ if (keyType !== "secp256k1") {
120
+ throw new Error("Only secp256k1 key generation is supported currently");
121
+ }
122
+ const privateKeyBytes = randomBytes(32);
123
+ const privateKey = Buffer.from(privateKeyBytes).toString("hex");
124
+ const publicKeyBytes = secp256k1.getPublicKey(privateKeyBytes, true);
125
+ const publicKey = Buffer.from(publicKeyBytes).toString("hex");
126
+ const envVar = options.envVar ?? "RB_ENCRYPTION_PRIVATE_KEY";
127
+ const resolvedPath = options.envPath ? path.resolve(options.envPath) : void 0;
128
+ if (resolvedPath) {
129
+ const fsModule = await getFs();
130
+ if (!fsModule) {
131
+ throw new Error(
132
+ "File system module is not available; cannot write encryption key env file"
133
+ );
134
+ }
135
+ const envLine = `${envVar}=${privateKey}`;
136
+ if (fsModule.existsSync(resolvedPath)) {
137
+ const content = fsModule.readFileSync(resolvedPath, "utf-8");
138
+ const lineRegex = new RegExp(`^${envVar}=.*$`, "m");
139
+ if (lineRegex.test(content)) {
140
+ if (!options.overwrite) {
141
+ throw new Error(
142
+ `${envVar} already exists in ${resolvedPath}; set overwrite=true to replace it`
143
+ );
144
+ }
145
+ const updated = content.replace(lineRegex, envLine);
146
+ fsModule.writeFileSync(resolvedPath, updated);
147
+ } else {
148
+ const needsNewline = !content.endsWith("\n");
149
+ fsModule.appendFileSync(
150
+ resolvedPath,
151
+ `${needsNewline ? "\n" : ""}${envLine}
152
+ `
153
+ );
154
+ }
155
+ } else {
156
+ fsModule.writeFileSync(resolvedPath, `${envLine}
157
+ `);
158
+ }
159
+ }
160
+ return {
161
+ privateKey,
162
+ publicKey,
163
+ envPath: resolvedPath,
164
+ envVar
165
+ };
209
166
  }
210
167
  export {
211
- detectProtocol,
212
- facets,
213
- getAdditionalRegistries,
214
- listProtocols,
215
- metricsSummary,
216
- popularSearches,
217
- registries,
218
- registrySearchByNamespace,
219
- search,
220
- searchStatus,
221
- stats,
222
- vectorSearch,
223
- websocketStats
168
+ autoRegisterEncryptionKey,
169
+ bootstrapEncryptionOptions,
170
+ createEncryptionApi,
171
+ ensureAgentEncryptionKey,
172
+ generateEncryptionKeyPair,
173
+ registerEncryptionKey
224
174
  };
225
175
  //# sourceMappingURL=standards-sdk.es175.js.map