@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.
- package/README.md +2 -2
- package/dist/browser/services/registry-broker/client/base-client.d.ts +3 -2
- package/dist/browser/services/registry-broker/client/base-client.d.ts.map +1 -1
- package/dist/browser/services/registry-broker/client/search.d.ts +2 -1
- package/dist/browser/services/registry-broker/client/search.d.ts.map +1 -1
- package/dist/browser/services/registry-broker/client.d.ts +1 -0
- package/dist/browser/services/registry-broker/client.d.ts.map +1 -1
- package/dist/browser/services/registry-broker/schemas.d.ts +17723 -58
- package/dist/browser/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/browser/services/registry-broker/types.d.ts +36 -1
- package/dist/browser/services/registry-broker/types.d.ts.map +1 -1
- package/dist/browser/standards-sdk.browser.js +64 -1
- package/dist/browser/standards-sdk.browser.js.map +1 -1
- package/dist/cjs/services/registry-broker/client/base-client.d.ts +3 -2
- package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/search.d.ts +2 -1
- package/dist/cjs/services/registry-broker/client/search.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client.d.ts +1 -0
- package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/schemas.d.ts +17814 -149
- package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/types.d.ts +36 -1
- package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +3 -3
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/es/services/registry-broker/client/base-client.d.ts +3 -2
- package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/search.d.ts +2 -1
- package/dist/es/services/registry-broker/client/search.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client.d.ts +1 -0
- package/dist/es/services/registry-broker/client.d.ts.map +1 -1
- package/dist/es/services/registry-broker/schemas.d.ts +17814 -149
- package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/es/services/registry-broker/types.d.ts +36 -1
- package/dist/es/services/registry-broker/types.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +20 -9
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es104.js +1 -1
- package/dist/es/standards-sdk.es106.js +1 -1
- package/dist/es/standards-sdk.es108.js +1 -1
- package/dist/es/standards-sdk.es11.js +1 -1
- package/dist/es/standards-sdk.es110.js +1 -1
- package/dist/es/standards-sdk.es116.js +2 -2
- package/dist/es/standards-sdk.es12.js +1 -1
- package/dist/es/standards-sdk.es121.js +1 -1
- package/dist/es/standards-sdk.es127.js +1 -1
- package/dist/es/standards-sdk.es128.js +5 -5
- package/dist/es/standards-sdk.es138.js +1 -1
- package/dist/es/standards-sdk.es139.js +1 -1
- package/dist/es/standards-sdk.es140.js +5 -5
- package/dist/es/standards-sdk.es142.js +2 -2
- package/dist/es/standards-sdk.es143.js +1 -1
- package/dist/es/standards-sdk.es145.js +65 -1
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +250 -78
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +77 -71
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +79 -936
- package/dist/es/standards-sdk.es149.js.map +1 -1
- package/dist/es/standards-sdk.es150.js +934 -53
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +53 -152
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +159 -7
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +7 -86
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +64 -43
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +65 -30
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +30 -34
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +34 -48
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +48 -138
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +133 -37
- package/dist/es/standards-sdk.es159.js.map +1 -1
- package/dist/es/standards-sdk.es16.js +1 -1
- package/dist/es/standards-sdk.es160.js +34 -12474
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +12479 -53
- package/dist/es/standards-sdk.es161.js.map +1 -1
- package/dist/es/standards-sdk.es162.js +48 -76
- package/dist/es/standards-sdk.es162.js.map +1 -1
- package/dist/es/standards-sdk.es163.js +69 -66
- package/dist/es/standards-sdk.es163.js.map +1 -1
- package/dist/es/standards-sdk.es164.js +61 -180
- package/dist/es/standards-sdk.es164.js.map +1 -1
- package/dist/es/standards-sdk.es165.js +197 -14
- package/dist/es/standards-sdk.es165.js.map +1 -1
- package/dist/es/standards-sdk.es166.js +15 -548
- package/dist/es/standards-sdk.es166.js.map +1 -1
- package/dist/es/standards-sdk.es167.js +66 -165
- package/dist/es/standards-sdk.es167.js.map +1 -1
- package/dist/es/standards-sdk.es168.js +535 -307
- package/dist/es/standards-sdk.es168.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +120 -294
- package/dist/es/standards-sdk.es169.js.map +1 -1
- package/dist/es/standards-sdk.es170.js +191 -322
- package/dist/es/standards-sdk.es170.js.map +1 -1
- package/dist/es/standards-sdk.es171.js +294 -279
- package/dist/es/standards-sdk.es171.js.map +1 -1
- package/dist/es/standards-sdk.es172.js +440 -63
- package/dist/es/standards-sdk.es172.js.map +1 -1
- package/dist/es/standards-sdk.es173.js +323 -65
- package/dist/es/standards-sdk.es173.js.map +1 -1
- package/dist/es/standards-sdk.es174.js +61 -157
- package/dist/es/standards-sdk.es174.js.map +1 -1
- package/dist/es/standards-sdk.es175.js +152 -202
- package/dist/es/standards-sdk.es175.js.map +1 -1
- package/dist/es/standards-sdk.es176.js +219 -223
- package/dist/es/standards-sdk.es176.js.map +1 -1
- package/dist/es/standards-sdk.es177.js +227 -107
- package/dist/es/standards-sdk.es177.js.map +1 -1
- package/dist/es/standards-sdk.es178.js +98 -105
- package/dist/es/standards-sdk.es178.js.map +1 -1
- package/dist/es/standards-sdk.es179.js +105 -140
- package/dist/es/standards-sdk.es179.js.map +1 -1
- package/dist/es/standards-sdk.es18.js +4 -4
- package/dist/es/standards-sdk.es180.js +2 -2
- package/dist/es/standards-sdk.es182.js +1 -1
- package/dist/es/standards-sdk.es19.js +2 -2
- package/dist/es/standards-sdk.es22.js +1 -1
- package/dist/es/standards-sdk.es27.js +4 -4
- package/dist/es/standards-sdk.es30.js +1 -1
- package/dist/es/standards-sdk.es31.js +1 -1
- package/dist/es/standards-sdk.es35.js +2 -2
- package/dist/es/standards-sdk.es36.js +3 -3
- package/dist/es/standards-sdk.es37.js +1 -1
- package/dist/es/standards-sdk.es4.js +1 -1
- package/dist/es/standards-sdk.es53.js +1 -1
- package/dist/es/standards-sdk.es56.js +1 -1
- package/dist/es/standards-sdk.es59.js +1 -1
- package/dist/es/standards-sdk.es60.js +1 -1
- package/dist/es/standards-sdk.es62.js +1 -1
- package/dist/es/standards-sdk.es63.js +2 -2
- package/dist/es/standards-sdk.es64.js +1 -1
- package/dist/es/standards-sdk.es65.js +1 -1
- package/dist/es/standards-sdk.es66.js +1 -1
- package/dist/es/standards-sdk.es67.js +2 -2
- package/dist/es/standards-sdk.es69.js +1 -1
- package/dist/es/standards-sdk.es7.js +1 -1
- package/dist/es/standards-sdk.es71.js +1 -1
- package/dist/es/standards-sdk.es72.js +2 -2
- package/dist/es/standards-sdk.es75.js +3 -3
- package/dist/es/standards-sdk.es76.js +1 -1
- package/dist/es/standards-sdk.es78.js +1 -1
- package/dist/es/standards-sdk.es83.js +1 -1
- package/dist/es/standards-sdk.es84.js +1 -1
- package/dist/es/standards-sdk.es85.js +1 -1
- package/dist/es/standards-sdk.es88.js +1 -1
- package/dist/es/standards-sdk.es90.js +1 -1
- package/dist/es/standards-sdk.es94.js +3 -3
- package/dist/es/standards-sdk.es98.js +1 -1
- package/dist/es/standards-sdk.es99.js +1 -1
- package/package.json +1 -1
|
@@ -1,175 +1,79 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { proto } from "@hashgraph/proto";
|
|
2
|
+
import { ContractId } from "@hashgraph/sdk";
|
|
2
3
|
import { Buffer } from "buffer";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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 (
|
|
38
|
-
|
|
15
|
+
if (key.ed25519) {
|
|
16
|
+
return `ED25519: ${Buffer.from(key.ed25519).toString("hex")}`;
|
|
39
17
|
}
|
|
40
|
-
if (
|
|
41
|
-
return
|
|
18
|
+
if (key.ECDSASecp256k1) {
|
|
19
|
+
return `ECDSA_secp256k1: ${Buffer.from(key.ECDSASecp256k1).toString(
|
|
20
|
+
"hex"
|
|
21
|
+
)}`;
|
|
42
22
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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 (
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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 (
|
|
69
|
-
|
|
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
|
|
41
|
+
return "Unknown or Unset Key Type";
|
|
115
42
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
|
136
|
-
if (
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
if (typeof
|
|
10
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
116
|
-
|
|
17
|
+
headers: { "content-type": "application/json" },
|
|
18
|
+
body: payload
|
|
117
19
|
});
|
|
118
20
|
return client.parseWithSchema(
|
|
119
21
|
raw,
|
|
120
|
-
|
|
121
|
-
"
|
|
22
|
+
registerEncryptionKeyResponseSchema,
|
|
23
|
+
"register encryption key response"
|
|
122
24
|
);
|
|
123
25
|
}
|
|
124
|
-
|
|
125
|
-
const
|
|
126
|
-
if (
|
|
127
|
-
|
|
26
|
+
function normalizeAutoRegisterIdentity(config) {
|
|
27
|
+
const identity = {};
|
|
28
|
+
if (config.uaid) {
|
|
29
|
+
identity.uaid = config.uaid;
|
|
128
30
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
|
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
|
|
166
|
-
const
|
|
167
|
-
|
|
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
|
|
170
|
-
raw,
|
|
171
|
-
searchStatusResponseSchema,
|
|
172
|
-
"search status response"
|
|
173
|
-
);
|
|
92
|
+
return material;
|
|
174
93
|
}
|
|
175
|
-
async function
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|