@cubist-labs/cubesigner-sdk 0.4.241 → 0.4.246
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/dist/package.json +1 -1
- package/dist/spec/env/gamma.json +5 -0
- package/dist/src/audit_log.d.ts +5 -5
- package/dist/src/audit_log.js +1 -1
- package/dist/src/client/api_client.d.ts +22 -7
- package/dist/src/client/api_client.d.ts.map +1 -1
- package/dist/src/client/api_client.js +43 -13
- package/dist/src/client/base_client.d.ts +5 -1
- package/dist/src/client/base_client.d.ts.map +1 -1
- package/dist/src/client/base_client.js +16 -10
- package/dist/src/client/session.d.ts +3 -1
- package/dist/src/client/session.d.ts.map +1 -1
- package/dist/src/client/session.js +7 -3
- package/dist/src/client.d.ts +12 -5
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +15 -4
- package/dist/src/diffie_hellman.js +2 -2
- package/dist/src/env.d.ts +7 -0
- package/dist/src/env.d.ts.map +1 -1
- package/dist/src/env.js +14 -1
- package/dist/src/fetch.d.ts.map +1 -1
- package/dist/src/fetch.js +2 -3
- package/dist/src/key.d.ts +17 -1
- package/dist/src/key.d.ts.map +1 -1
- package/dist/src/key.js +19 -3
- package/dist/src/policy.d.ts +24 -7
- package/dist/src/policy.d.ts.map +1 -1
- package/dist/src/policy.js +34 -16
- package/dist/src/response.d.ts +29 -5
- package/dist/src/response.d.ts.map +1 -1
- package/dist/src/response.js +62 -24
- package/dist/src/schema.d.ts +975 -84
- package/dist/src/schema.d.ts.map +1 -1
- package/dist/src/schema.js +1 -1
- package/dist/src/schema_types.d.ts +10 -1
- package/dist/src/schema_types.d.ts.map +1 -1
- package/dist/src/schema_types.js +2 -1
- package/dist/src/scopes.d.ts.map +1 -1
- package/dist/src/scopes.js +23 -3
- package/dist/src/user_export.d.ts +1 -1
- package/dist/src/user_export.js +3 -3
- package/dist/src/util.d.ts +7 -0
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +30 -7
- package/package.json +1 -1
- package/src/audit_log.ts +3 -5
- package/src/client/api_client.ts +54 -14
- package/src/client/base_client.ts +13 -3
- package/src/client/session.ts +10 -3
- package/src/client.ts +17 -4
- package/src/diffie_hellman.ts +1 -1
- package/src/env.ts +17 -0
- package/src/fetch.ts +1 -2
- package/src/key.ts +26 -2
- package/src/policy.ts +34 -16
- package/src/response.ts +72 -25
- package/src/schema.ts +1034 -92
- package/src/schema_types.ts +12 -1
- package/src/scopes.ts +22 -2
- package/src/user_export.ts +2 -2
- package/src/util.ts +34 -8
package/dist/src/user_export.js
CHANGED
|
@@ -30,7 +30,7 @@ async function userExportKeygen() {
|
|
|
30
30
|
return (await userExportCipherSuite()).kem.generateKeyPair();
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
|
-
* Get the ArrayBuffer slice represented by a
|
|
33
|
+
* Get the ArrayBuffer slice represented by a Uint8Array
|
|
34
34
|
*
|
|
35
35
|
* @param b The buffer to convert
|
|
36
36
|
* @returns The resulting ArrayBuffer
|
|
@@ -50,7 +50,7 @@ async function userExportDecrypt(recipientKey, response) {
|
|
|
50
50
|
const suite = await userExportCipherSuite();
|
|
51
51
|
// decrypt the export ciphertext using the HPKE one-shot API
|
|
52
52
|
const tenc = new TextEncoder();
|
|
53
|
-
const tdec = new TextDecoder();
|
|
53
|
+
const tdec = new TextDecoder("utf-8");
|
|
54
54
|
const info = toArrayBuffer(tenc.encode(`cubist-signer::UserExportOwner::${response.user_id}`));
|
|
55
55
|
const public_key = toArrayBuffer((0, util_1.decodeBase64)(response.ephemeral_public_key));
|
|
56
56
|
const ctxt = toArrayBuffer((0, util_1.decodeBase64)(response.encrypted_key_material));
|
|
@@ -122,4 +122,4 @@ async function loadCrypto() {
|
|
|
122
122
|
throw new Error("subtle crypto not supported");
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcl9leHBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXNlcl9leHBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSxzREFRQztBQU9ELDRDQUVDO0FBUUQsc0NBRUM7QUFTRCw4Q0EyQkM7QUFvQ0QsNENBT0M7QUFPRCxnQ0FZQztBQXJJRCxpQ0FBc0M7QUFHdEM7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxxQkFBcUI7SUFDekMsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2pDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtRQUNuQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQzFCLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7S0FDM0IsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxLQUErQixDQUFDO0FBQ3pDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLGdCQUFnQjtJQUNwQyxPQUFPLENBQUMsTUFBTSxxQkFBcUIsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQy9ELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxDQUFhO0lBQ3pDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0ksS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxZQUF1QixFQUN2QixRQUFvQztJQUVwQyx3Q0FBd0M7SUFDeEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsRUFBRSxDQUFDO0lBRTVDLDREQUE0RDtJQUM1RCxNQUFNLElBQUksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9GLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFBLG1CQUFZLEVBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUM5RSxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsSUFBQSxtQkFBWSxFQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7SUFDMUUsTUFBTSxTQUFTLEdBQTBCLElBQUksQ0FBQyxLQUFLLENBQ2pELElBQUksQ0FBQyxNQUFNLENBQ1QsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUNkO1FBQ0UsWUFBWTtRQUNaLEdBQUcsRUFBRSxVQUFVO1FBQ2YsSUFBSSxFQUFFLElBQUk7S0FDWCxFQUNELElBQUksQ0FDTCxDQUNGLENBQ0YsQ0FBQztJQUVGLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBRUg7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxnQkFBZ0I7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLEVBQUUsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUFDLE9BQU8sRUFBVyxFQUFFLENBQUM7UUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ2pELENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxVQUFVO0lBQzlCLElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hFLDBEQUEwRDtRQUMxRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUNELGlCQUFpQjtJQUNqQixJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxjQUFjO1FBQzVELE9BQU8sU0FBOEIsQ0FBQztJQUN4QyxDQUFDO0lBQUMsT0FBTyxFQUFXLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDakQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFVzZXJFeHBvcnRDb21wbGV0ZVJlc3BvbnNlLCBVc2VyRXhwb3J0S2V5TWF0ZXJpYWwgfSBmcm9tIFwiLi9zY2hlbWFfdHlwZXNcIjtcbmltcG9ydCB7IGRlY29kZUJhc2U2NCB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB0eXBlIHsgQ2lwaGVyU3VpdGUgfSBmcm9tIFwiQGhwa2UvY29yZVwiO1xuXG4vKipcbiAqIEdldCB0aGUgSFBLRSBjaXBoZXJzdWl0ZSBmb3IgdXNlci1leHBvcnQgZGVjcnlwdGlvbi5cbiAqXG4gKiBAcmV0dXJucyBUaGUgSFBLRSBjaXBoZXJzdWl0ZSBmb3IgdXNlciBleHBvcnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1c2VyRXhwb3J0Q2lwaGVyU3VpdGUoKTogUHJvbWlzZTxDaXBoZXJTdWl0ZT4ge1xuICBjb25zdCBocGtlID0gYXdhaXQgaW1wb3J0KFwiQGhwa2UvY29yZVwiKTtcbiAgY29uc3Qgc3VpdGUgPSBuZXcgaHBrZS5DaXBoZXJTdWl0ZSh7XG4gICAga2VtOiBuZXcgaHBrZS5EaGtlbVAyNTZIa2RmU2hhMjU2KCksXG4gICAga2RmOiBuZXcgaHBrZS5Ia2RmU2hhMjU2KCksXG4gICAgYWVhZDogbmV3IGhwa2UuQWVzMjU2R2NtKCksXG4gIH0pO1xuICByZXR1cm4gc3VpdGUgYXMgdW5rbm93biBhcyBDaXBoZXJTdWl0ZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBwYWlyIGZvciB1c2VyIGV4cG9ydC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3bHkgZ2VuZXJhdGVkIGtleSBwYWlyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXNlckV4cG9ydEtleWdlbigpOiBQcm9taXNlPENyeXB0b0tleVBhaXI+IHtcbiAgcmV0dXJuIChhd2FpdCB1c2VyRXhwb3J0Q2lwaGVyU3VpdGUoKSkua2VtLmdlbmVyYXRlS2V5UGFpcigpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgQXJyYXlCdWZmZXIgc2xpY2UgcmVwcmVzZW50ZWQgYnkgYSBVaW50OEFycmF5XG4gKlxuICogQHBhcmFtIGIgVGhlIGJ1ZmZlciB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0aW5nIEFycmF5QnVmZmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5QnVmZmVyKGI6IFVpbnQ4QXJyYXkpOiBBcnJheUJ1ZmZlciB7XG4gIHJldHVybiBiLmJ1ZmZlci5zbGljZShiLmJ5dGVPZmZzZXQsIGIuYnl0ZU9mZnNldCArIGIuYnl0ZUxlbmd0aCk7XG59XG5cbi8qKlxuICogRGVjcnlwdCBhIHVzZXIgZXhwb3J0LlxuICpcbiAqIEBwYXJhbSByZWNpcGllbnRLZXkgVGhlIE5JU1QgUC0yNTYgc2VjcmV0IGtleSBjb3JyZXNwb25kaW5nIHRvIHRoZSBgcHVibGljS2V5YCBhcmd1bWVudCB0byB0aGUgYHVzZXJFeHBvcnRDb21wbGV0ZWAgaW52b2NhdGlvbiB0aGF0IHJldHVybmVkIGByZXNwb25zZWAuXG4gKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIGZyb20gYSBzdWNjZXNzZnVsIGB1c2VyRXhwb3J0Q29tcGxldGVgIHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgZGVjcnlwdGVkIGtleSBtYXRlcmlhbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVzZXJFeHBvcnREZWNyeXB0KFxuICByZWNpcGllbnRLZXk6IENyeXB0b0tleSxcbiAgcmVzcG9uc2U6IFVzZXJFeHBvcnRDb21wbGV0ZVJlc3BvbnNlLFxuKTogUHJvbWlzZTxVc2VyRXhwb3J0S2V5TWF0ZXJpYWw+IHtcbiAgLy8gVGhlIGNpcGhlcnN1aXRlIHdlIHVzZSBmb3IgZGVjcnlwdGlvblxuICBjb25zdCBzdWl0ZSA9IGF3YWl0IHVzZXJFeHBvcnRDaXBoZXJTdWl0ZSgpO1xuXG4gIC8vIGRlY3J5cHQgdGhlIGV4cG9ydCBjaXBoZXJ0ZXh0IHVzaW5nIHRoZSBIUEtFIG9uZS1zaG90IEFQSVxuICBjb25zdCB0ZW5jID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGNvbnN0IHRkZWMgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKTtcbiAgY29uc3QgaW5mbyA9IHRvQXJyYXlCdWZmZXIodGVuYy5lbmNvZGUoYGN1YmlzdC1zaWduZXI6OlVzZXJFeHBvcnRPd25lcjo6JHtyZXNwb25zZS51c2VyX2lkfWApKTtcbiAgY29uc3QgcHVibGljX2tleSA9IHRvQXJyYXlCdWZmZXIoZGVjb2RlQmFzZTY0KHJlc3BvbnNlLmVwaGVtZXJhbF9wdWJsaWNfa2V5KSk7XG4gIGNvbnN0IGN0eHQgPSB0b0FycmF5QnVmZmVyKGRlY29kZUJhc2U2NChyZXNwb25zZS5lbmNyeXB0ZWRfa2V5X21hdGVyaWFsKSk7XG4gIGNvbnN0IGRlY3J5cHRlZDogVXNlckV4cG9ydEtleU1hdGVyaWFsID0gSlNPTi5wYXJzZShcbiAgICB0ZGVjLmRlY29kZShcbiAgICAgIGF3YWl0IHN1aXRlLm9wZW4oXG4gICAgICAgIHtcbiAgICAgICAgICByZWNpcGllbnRLZXksXG4gICAgICAgICAgZW5jOiBwdWJsaWNfa2V5LFxuICAgICAgICAgIGluZm86IGluZm8sXG4gICAgICAgIH0sXG4gICAgICAgIGN0eHQsXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgcmV0dXJuIGRlY3J5cHRlZDtcbn1cblxuLypcbiAqIFRoaXMgbmV4dCB0d28gZnVuY3Rpb25zIGFyZSBwb3J0ZWQgZnJvbSB0aGUgaHBrZS1qcyBwYWNrYWdlLFxuICogICBodHRwczovL2dpdGh1Yi5jb20vZGFqaWFqaS9ocGtlLWpzL1xuICogd2hpY2ggaXMgQ29weXJpZ2h0IChDKSAyMDIyIEFqaXRvbWkgRGFpc3VrZSBhbmQgbGljZW5zZWRcbiAqIHVuZGVyIHRoZSBNSVQgTGljZW5zZSwgd2hpY2ggZm9sbG93czpcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMiBBaml0b21pIERhaXN1a2VcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbi8qKlxuICogRmlndXJlIG91dCBob3cgdG8gbG9hZCBTdWJ0bGVDcnlwdG8gaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gKlxuICogQHJldHVybnMgQSBTdWJ0bGVDcnlwdG8gaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRTdWJ0bGVDcnlwdG8oKTogUHJvbWlzZTxTdWJ0bGVDcnlwdG8+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjcnlwdG8gPSBhd2FpdCBsb2FkQ3J5cHRvKCk7XG4gICAgcmV0dXJuIGNyeXB0by5zdWJ0bGU7XG4gIH0gY2F0Y2ggKF9lOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic3VidGxlIGNyeXB0byBub3Qgc3VwcG9ydGVkXCIpO1xuICB9XG59XG5cbi8qKlxuICogRmlndXJlIG91dCBob3cgdG8gbG9hZCBDcnlwdG8gaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gKlxuICogQHJldHVybnMgQSBDcnlwdG8gaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRDcnlwdG8oKTogUHJvbWlzZTxDcnlwdG8+IHtcbiAgaWYgKGdsb2JhbFRoaXMgIT09IHVuZGVmaW5lZCAmJiBnbG9iYWxUaGlzLmNyeXB0byAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gQnJvd3NlcnMsIE5vZGUuanMgPj0gdjE5LCBDbG91ZGZsYXJlIFdvcmtlcnMsIEJ1biwgZXRjLlxuICAgIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0bztcbiAgfVxuICAvLyBOb2RlLmpzIDw9IHYxOFxuICB0cnkge1xuICAgIGNvbnN0IHsgd2ViY3J5cHRvIH0gPSBhd2FpdCBpbXBvcnQoXCJjcnlwdG9cIik7IC8vIG5vZGU6Y3J5cHRvXG4gICAgcmV0dXJuIHdlYmNyeXB0byBhcyB1bmtub3duIGFzIENyeXB0bztcbiAgfSBjYXRjaCAoX2U6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdWJ0bGUgY3J5cHRvIG5vdCBzdXBwb3J0ZWRcIik7XG4gIH1cbn1cbiJdfQ==
|
package/dist/src/util.d.ts
CHANGED
|
@@ -63,4 +63,11 @@ export declare function delay(ms: number): Promise<void>;
|
|
|
63
63
|
* @returns Hex string prefixed with "0x"
|
|
64
64
|
*/
|
|
65
65
|
export declare function encodeToHex(message: string | Uint8Array): string;
|
|
66
|
+
/**
|
|
67
|
+
* Decodes a hex string into a byte array.
|
|
68
|
+
*
|
|
69
|
+
* @param hex The hex string to decode, with or without a "0x" prefix
|
|
70
|
+
* @returns Decoded byte array
|
|
71
|
+
*/
|
|
72
|
+
export declare function decodeFromHex(hex: string): Uint8Array;
|
|
66
73
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/src/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,MAAM,WAAW,OAAO;IACtB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;CAC1E;AAED,sBAAsB;AACtB,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;AAEtF,qBAAqB;AACrB,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/E,iCAAiC;AACjC,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1D;
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,MAAM,WAAW,OAAO;IACtB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;CAC1E;AAED,sBAAsB;AACtB,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;AAEtF,qBAAqB;AACrB,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/E,iCAAiC;AACjC,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1D;AAKD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAIpD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAI1D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,WAAW,GAAG,MAAM,CAM7E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,WAAW,GAAG,MAAM,CAIhF;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAGhE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAgBrD"}
|
package/dist/src/util.js
CHANGED
|
@@ -7,6 +7,7 @@ exports.encodeToBase64 = encodeToBase64;
|
|
|
7
7
|
exports.encodeToBase64Url = encodeToBase64Url;
|
|
8
8
|
exports.delay = delay;
|
|
9
9
|
exports.encodeToHex = encodeToHex;
|
|
10
|
+
exports.decodeFromHex = decodeFromHex;
|
|
10
11
|
/**
|
|
11
12
|
* Path join
|
|
12
13
|
*
|
|
@@ -18,6 +19,8 @@ function pathJoin(dir, file) {
|
|
|
18
19
|
const sep = globalThis?.process?.platform === "win32" ? "\\" : "/";
|
|
19
20
|
return `${dir}${sep}${file}`;
|
|
20
21
|
}
|
|
22
|
+
// eslint-disable-next-line no-restricted-globals -- intentionally checking for Buffer before using it
|
|
23
|
+
const nodeBuffer = typeof Buffer === "function" ? Buffer : undefined;
|
|
21
24
|
/**
|
|
22
25
|
* Browser-friendly helper for decoding a 'base64'-encoded string into a byte array.
|
|
23
26
|
*
|
|
@@ -25,8 +28,8 @@ function pathJoin(dir, file) {
|
|
|
25
28
|
* @returns Decoded byte array
|
|
26
29
|
*/
|
|
27
30
|
function decodeBase64(b64) {
|
|
28
|
-
return
|
|
29
|
-
?
|
|
31
|
+
return nodeBuffer
|
|
32
|
+
? nodeBuffer.from(b64, "base64")
|
|
30
33
|
: Uint8Array.from(atob(b64), (c) => c.charCodeAt(0));
|
|
31
34
|
}
|
|
32
35
|
/**
|
|
@@ -49,8 +52,8 @@ function decodeBase64Url(b64url) {
|
|
|
49
52
|
*/
|
|
50
53
|
function encodeToBase64(buffer) {
|
|
51
54
|
const bytes = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : new Uint8Array(buffer);
|
|
52
|
-
const b64 =
|
|
53
|
-
?
|
|
55
|
+
const b64 = nodeBuffer
|
|
56
|
+
? nodeBuffer.from(bytes).toString("base64")
|
|
54
57
|
: btoa(bytes.reduce((s, b) => s + String.fromCharCode(b), ""));
|
|
55
58
|
return b64;
|
|
56
59
|
}
|
|
@@ -82,7 +85,27 @@ function delay(ms) {
|
|
|
82
85
|
* @returns Hex string prefixed with "0x"
|
|
83
86
|
*/
|
|
84
87
|
function encodeToHex(message) {
|
|
85
|
-
const
|
|
86
|
-
return "0x" +
|
|
88
|
+
const bytes = typeof message === "string" ? new TextEncoder().encode(message) : message;
|
|
89
|
+
return "0x" + Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
87
90
|
}
|
|
88
|
-
|
|
91
|
+
/**
|
|
92
|
+
* Decodes a hex string into a byte array.
|
|
93
|
+
*
|
|
94
|
+
* @param hex The hex string to decode, with or without a "0x" prefix
|
|
95
|
+
* @returns Decoded byte array
|
|
96
|
+
*/
|
|
97
|
+
function decodeFromHex(hex) {
|
|
98
|
+
const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
|
|
99
|
+
if (clean.length % 2 !== 0) {
|
|
100
|
+
throw new Error(`Invalid hexadecimal string length, must be even: ${clean.length}`);
|
|
101
|
+
}
|
|
102
|
+
if (!/^[0-9a-fA-F]*$/.test(clean)) {
|
|
103
|
+
throw new Error(`Invalid hexadecimal character in: '${clean}'`);
|
|
104
|
+
}
|
|
105
|
+
const bytes = new Uint8Array(clean.length / 2);
|
|
106
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
107
|
+
bytes[i] = parseInt(clean.slice(i * 2, i * 2 + 2), 16);
|
|
108
|
+
}
|
|
109
|
+
return bytes;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd0JBLDRCQUdDO0FBV0Qsb0NBSUM7QUFRRCwwQ0FJQztBQVNELHdDQU1DO0FBUUQsOENBSUM7QUFRRCxzQkFFQztBQVNELGtDQUdDO0FBUUQsc0NBZ0JDO0FBOUdEOzs7Ozs7R0FNRztBQUNILFNBQWdCLFFBQVEsQ0FBQyxHQUFXLEVBQUUsSUFBWTtJQUNoRCxNQUFNLEdBQUcsR0FBRyxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ25FLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCxzR0FBc0c7QUFDdEcsTUFBTSxVQUFVLEdBQUcsT0FBTyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUVyRTs7Ozs7R0FLRztBQUNILFNBQWdCLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLE9BQU8sVUFBVTtRQUNmLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7UUFDaEMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLE1BQWM7SUFDNUMsb0dBQW9HO0lBQ3BHLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxD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TSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEpTT04gbWFwIHR5cGUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbk1hcCB7XG4gIFttZW1iZXI6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgSnNvbkFycmF5IHwgSnNvbk1hcDtcbn1cblxuLyoqIEpTT04gYXJyYXkgdHlwZSAqL1xuZXhwb3J0IHR5cGUgSnNvbkFycmF5ID0gQXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCBKc29uQXJyYXkgfCBKc29uTWFwPjtcblxuLyoqIEFueSBKU09OIHZhbHVlICovXG5leHBvcnQgdHlwZSBKc29uVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IEpzb25BcnJheSB8IEpzb25NYXA7XG5cbi8qKiBUaGUgYWRkcmVzcyBvZiBhIGNvbnRyYWN0LiAqL1xuZXhwb3J0IHR5cGUgQ29udHJhY3RBZGRyZXNzID0ge1xuICBjaGFpbl9pZDogc3RyaW5nO1xuICBhZGRyZXNzOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFBhdGggam9pblxuICpcbiAqIEBwYXJhbSBkaXIgUGFyZW50IGRpcmVjdG9yeVxuICogQHBhcmFtIGZpbGUgUGF0aG5hbWVcbiAqIEByZXR1cm5zIE5ldyBwYXRobmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aEpvaW4oZGlyOiBzdHJpbmcsIGZpbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNlcCA9IGdsb2JhbFRoaXM/LnByb2Nlc3M/LnBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcIlxcXFxcIiA6IFwiL1wiO1xuICByZXR1cm4gYCR7ZGlyfSR7c2VwfSR7ZmlsZX1gO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIGludGVudGlvbmFsbHkgY2hlY2tpbmcgZm9yIEJ1ZmZlciBiZWZvcmUgdXNpbmcgaXRcbmNvbnN0IG5vZGVCdWZmZXIgPSB0eXBlb2YgQnVmZmVyID09PSBcImZ1bmN0aW9uXCIgPyBCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQnJvd3Nlci1mcmllbmRseSBoZWxwZXIgZm9yIGRlY29kaW5nIGEgJ2Jhc2U2NCctZW5jb2RlZCBzdHJpbmcgaW50byBhIGJ5dGUgYXJyYXkuXG4gKlxuICogQHBhcmFtIGI2NCBUaGUgJ2Jhc2U2NCctZW5jb2RlZCBzdHJpbmcgdG8gZGVjb2RlXG4gKiBAcmV0dXJucyBEZWNvZGVkIGJ5dGUgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NChiNjQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gbm9kZUJ1ZmZlclxuICAgID8gbm9kZUJ1ZmZlci5mcm9tKGI2NCwgXCJiYXNlNjRcIilcbiAgICA6IFVpbnQ4QXJyYXkuZnJvbShhdG9iKGI2NCksIChjKSA9PiBjLmNoYXJDb2RlQXQoMCkpO1xufVxuXG4vKipcbiAqIEJyb3dzZXItZnJpZW5kbHkgaGVscGVyIGZvciBkZWNvZGluZyBhICdiYXNlNjR1cmwnLWVuY29kZWQgc3RyaW5nIGludG8gYSBieXRlIGFycmF5LlxuICpcbiAqIEBwYXJhbSBiNjR1cmwgVGhlICdiYXNlNjR1cmwnLWVuY29kZWQgc3RyaW5nIHRvIGRlY29kZVxuICogQHJldHVybnMgRGVjb2RlZCBieXRlIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjRVcmwoYjY0dXJsOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgLy8gTk9URTogdGhlcmUgaXMgbm8gXCJiYXNlNjR1cmxcIiBlbmNvZGluZyBpbiB0aGUgXCJidWZmZXJcIiBtb2R1bGUgZm9yIHRoZSBicm93c2VyICh1bmxpa2UgaW4gbm9kZS5qcylcbiAgY29uc3QgYjY0ID0gYjY0dXJsLnJlcGxhY2UoLy0vZywgXCIrXCIpLnJlcGxhY2UoL18vZywgXCIvXCIpLnJlcGxhY2UoLz0qJC9nLCBcIlwiKTtcbiAgcmV0dXJuIGRlY29kZUJhc2U2NChiNjQpO1xufVxuXG4vKipcbiAqXG4gKiBCcm93c2VyLWZyaWVuZGx5IGhlbHBlciBmb3IgZW5jb2RpbmcgYSBieXRlIGFycmF5IGludG8gYSBwYWRkZWQgYGJhc2U2NGAtZW5jb2RlZCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGJ1ZmZlciBUaGUgYnl0ZSBhcnJheSB0byBlbmNvZGVcbiAqIEByZXR1cm5zIFRoZSAnYmFzZTY0JyBlbmNvZGluZyBvZiB0aGUgYnl0ZSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVRvQmFzZTY0KGJ1ZmZlcjogSXRlcmFibGU8bnVtYmVyPiB8IEFycmF5QnVmZmVyKTogc3RyaW5nIHtcbiAgY29uc3QgYnl0ZXMgPSBidWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IG5ldyBVaW50OEFycmF5KGJ1ZmZlcikgOiBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBjb25zdCBiNjQgPSBub2RlQnVmZmVyXG4gICAgPyBub2RlQnVmZmVyLmZyb20oYnl0ZXMpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG4gICAgOiBidG9hKGJ5dGVzLnJlZHVjZSgocywgYikgPT4gcyArIFN0cmluZy5mcm9tQ2hhckNvZGUoYiksIFwiXCIpKTtcbiAgcmV0dXJuIGI2NDtcbn1cblxuLyoqXG4gKiBCcm93c2VyLWZyaWVuZGx5IGhlbHBlciBmb3IgZW5jb2RpbmcgYSBieXRlIGFycmF5IGludG8gYSAnYmFzZTY0dXJsYC1lbmNvZGVkIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gYnVmZmVyIFRoZSBieXRlIGFycmF5IHRvIGVuY29kZVxuICogQHJldHVybnMgVGhlICdiYXNlNjR1cmwnIGVuY29kaW5nIG9mIHRoZSBieXRlIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVG9CYXNlNjRVcmwoYnVmZmVyOiBJdGVyYWJsZTxudW1iZXI+IHwgQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xuICBjb25zdCBiNjQgPSBlbmNvZGVUb0Jhc2U2NChidWZmZXIpO1xuICAvLyBOT1RFOiB0aGVyZSBpcyBubyBcImJhc2U2NHVybFwiIGVuY29kaW5nIGluIHRoZSBcImJ1ZmZlclwiIG1vZHVsZSBmb3IgdGhlIGJyb3dzZXIgKHVubGlrZSBpbiBub2RlLmpzKVxuICByZXR1cm4gYjY0LnJlcGxhY2UoL1xcKy9nLCBcIi1cIikucmVwbGFjZSgvXFwvL2csIFwiX1wiKS5yZXBsYWNlKC89KiQvZywgXCJcIik7XG59XG5cbi8qKlxuICogU2xlZXBzIGZvciBgbXNgIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0gbXMgTWlsbGlzZWNvbmRzIHRvIHNsZWVwXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBhZnRlciBgbXNgIG1pbGxpc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgb3IgYSB1aW50OCBhcnJheSBpbnRvIGEgaGV4IHN0cmluZy4gU3RyaW5ncyBhcmUgZW5jb2RlZCBpbiBVVEYtOCBiZWZvcmVcbiAqIGJlaW5nIGNvbnZlcnRlZCB0byBoZXguXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgVGhlIGlucHV0XG4gKiBAcmV0dXJucyBIZXggc3RyaW5nIHByZWZpeGVkIHdpdGggXCIweFwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVUb0hleChtZXNzYWdlOiBzdHJpbmcgfCBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgY29uc3QgYnl0ZXMgPSB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShtZXNzYWdlKSA6IG1lc3NhZ2U7XG4gIHJldHVybiBcIjB4XCIgKyBBcnJheS5mcm9tKGJ5dGVzLCAoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKS5qb2luKFwiXCIpO1xufVxuXG4vKipcbiAqIERlY29kZXMgYSBoZXggc3RyaW5nIGludG8gYSBieXRlIGFycmF5LlxuICpcbiAqIEBwYXJhbSBoZXggVGhlIGhleCBzdHJpbmcgdG8gZGVjb2RlLCB3aXRoIG9yIHdpdGhvdXQgYSBcIjB4XCIgcHJlZml4XG4gKiBAcmV0dXJucyBEZWNvZGVkIGJ5dGUgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZyb21IZXgoaGV4OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgY29uc3QgY2xlYW4gPSBoZXguc3RhcnRzV2l0aChcIjB4XCIpID8gaGV4LnNsaWNlKDIpIDogaGV4O1xuXG4gIGlmIChjbGVhbi5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGhleGFkZWNpbWFsIHN0cmluZyBsZW5ndGgsIG11c3QgYmUgZXZlbjogJHtjbGVhbi5sZW5ndGh9YCk7XG4gIH1cblxuICBpZiAoIS9eWzAtOWEtZkEtRl0qJC8udGVzdChjbGVhbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaGV4YWRlY2ltYWwgY2hhcmFjdGVyIGluOiAnJHtjbGVhbn0nYCk7XG4gIH1cblxuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGNsZWFuLmxlbmd0aCAvIDIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYnl0ZXNbaV0gPSBwYXJzZUludChjbGVhbi5zbGljZShpICogMiwgaSAqIDIgKyAyKSwgMTYpO1xuICB9XG4gIHJldHVybiBieXRlcztcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"url": "git+https://github.com/cubist-labs/CubeSigner-TypeScript-SDK.git",
|
|
6
6
|
"directory": "packages/sdk"
|
|
7
7
|
},
|
|
8
|
-
"version": "0.4.
|
|
8
|
+
"version": "0.4.246",
|
|
9
9
|
"description": "CubeSigner TypeScript SDK",
|
|
10
10
|
"license": "MIT OR Apache-2.0",
|
|
11
11
|
"author": "Cubist, Inc.",
|
package/src/audit_log.ts
CHANGED
|
@@ -186,10 +186,8 @@ export const auditLogEntrySchema = z.discriminatedUnion("event", [
|
|
|
186
186
|
export type AuditLogEntry = z.infer<typeof auditLogEntrySchema>;
|
|
187
187
|
|
|
188
188
|
// Compile-time check: errors if a variant is added to OrgEventDiscriminants but not handled here.
|
|
189
|
-
type
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
: never
|
|
193
|
-
: never;
|
|
189
|
+
type _LHS = [OrgEventDiscriminants];
|
|
190
|
+
type _RHS = [AuditLogEntry["event"]];
|
|
191
|
+
type _AllVariantsCovered = _LHS extends _RHS ? (_RHS extends _LHS ? true : never) : never;
|
|
194
192
|
const _allVariantsCovered: _AllVariantsCovered = true;
|
|
195
193
|
void _allVariantsCovered;
|
package/src/client/api_client.ts
CHANGED
|
@@ -69,6 +69,7 @@ import type {
|
|
|
69
69
|
ListBucketsResponse,
|
|
70
70
|
UpdateBucketRequest,
|
|
71
71
|
PolicyInfo,
|
|
72
|
+
JsonRpcRequest,
|
|
72
73
|
} from "../schema_types";
|
|
73
74
|
import { encodeToBase64 } from "../util";
|
|
74
75
|
import { auditLogEntrySchema } from "../audit_log";
|
|
@@ -158,6 +159,7 @@ import {
|
|
|
158
159
|
coerceBucketInfo,
|
|
159
160
|
coercePolicyInfo,
|
|
160
161
|
type BucketInfo,
|
|
162
|
+
MultiRegionEnv,
|
|
161
163
|
} from "../index";
|
|
162
164
|
import { assertOk, op, type Op, type Operation, apiFetch } from "../fetch";
|
|
163
165
|
import {
|
|
@@ -203,7 +205,7 @@ export type SessionSelector =
|
|
|
203
205
|
*/
|
|
204
206
|
export class ApiClient extends BaseClient {
|
|
205
207
|
/**
|
|
206
|
-
* Creates a new client using the same session manager but targeting a
|
|
208
|
+
* Creates a **new** client using the same session manager but targeting a
|
|
207
209
|
* different (child) organization.
|
|
208
210
|
*
|
|
209
211
|
* @param targetOrgId The ID of an organization that the new client should target
|
|
@@ -214,7 +216,7 @@ export class ApiClient extends BaseClient {
|
|
|
214
216
|
}
|
|
215
217
|
|
|
216
218
|
/**
|
|
217
|
-
* Creates a new client using with an updated {@link ClientConfig}.
|
|
219
|
+
* Creates a **new** client using with an updated {@link ClientConfig}.
|
|
218
220
|
*
|
|
219
221
|
* @param cfg Partial configuration to apply on top of the existing client
|
|
220
222
|
* @returns A new client with the updated configuration
|
|
@@ -228,7 +230,20 @@ export class ApiClient extends BaseClient {
|
|
|
228
230
|
}
|
|
229
231
|
|
|
230
232
|
/**
|
|
231
|
-
* Creates a new client
|
|
233
|
+
* Creates a **new** client with a preferred regional environment {@link env} to use.
|
|
234
|
+
*
|
|
235
|
+
* @param env Preferred environment to use.
|
|
236
|
+
* @returns A new client with updated preferred environment.
|
|
237
|
+
*/
|
|
238
|
+
withPreferredEnv(env: EnvInterface | undefined) {
|
|
239
|
+
return new ApiClient(this.sessionMeta, this.sessionManager, this.orgId, {
|
|
240
|
+
...this.config,
|
|
241
|
+
preferredEnv: env,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Creates a **new** client in which the current session will assume a given role.
|
|
232
247
|
* No validation is done on the client side; the back end will reject subsequent
|
|
233
248
|
* requests if the current session is not allowed to assume that role.
|
|
234
249
|
*
|
|
@@ -2743,7 +2758,7 @@ export class ApiClient extends BaseClient {
|
|
|
2743
2758
|
): Promise<CubeSignerResponse<UserExportCompleteResponse>> {
|
|
2744
2759
|
// base64-encode the public key
|
|
2745
2760
|
const subtle = await loadSubtleCrypto();
|
|
2746
|
-
const publicKeyB64 = encodeToBase64(
|
|
2761
|
+
const publicKeyB64 = encodeToBase64(await subtle.exportKey("raw", publicKey));
|
|
2747
2762
|
|
|
2748
2763
|
const o = op("/v0/org/{org_id}/user/me/export", "patch");
|
|
2749
2764
|
// make the request
|
|
@@ -2907,6 +2922,33 @@ export class ApiClient extends BaseClient {
|
|
|
2907
2922
|
|
|
2908
2923
|
// #endregion
|
|
2909
2924
|
|
|
2925
|
+
// #region RPC
|
|
2926
|
+
|
|
2927
|
+
/**
|
|
2928
|
+
* Send a JSON RPC request to the high-level API endpoint.
|
|
2929
|
+
*
|
|
2930
|
+
* @param body JSON RPC request body
|
|
2931
|
+
* @param mfaReceipt Optional MFA receipts
|
|
2932
|
+
* @returns Corresponding response
|
|
2933
|
+
*/
|
|
2934
|
+
async rpc(
|
|
2935
|
+
body: JsonRpcRequest,
|
|
2936
|
+
mfaReceipt?: MfaReceipts,
|
|
2937
|
+
): Promise<CubeSignerResponse<schemas["JsonRpcResponse"]>> {
|
|
2938
|
+
const o = op("/v0/org/{org_id}/rpc", "post");
|
|
2939
|
+
const reqFn = (headers?: HeadersInit) =>
|
|
2940
|
+
this.exec(o, {
|
|
2941
|
+
headers,
|
|
2942
|
+
body: {
|
|
2943
|
+
jsonrpc: "2.0",
|
|
2944
|
+
...body,
|
|
2945
|
+
},
|
|
2946
|
+
});
|
|
2947
|
+
return await CubeSignerResponse.create(this.env, reqFn, mfaReceipt);
|
|
2948
|
+
}
|
|
2949
|
+
|
|
2950
|
+
// #endregion
|
|
2951
|
+
|
|
2910
2952
|
/**
|
|
2911
2953
|
* Returns public org information.
|
|
2912
2954
|
*
|
|
@@ -2968,7 +3010,7 @@ export class ApiClient extends BaseClient {
|
|
|
2968
3010
|
* @returns The session data.
|
|
2969
3011
|
*/
|
|
2970
3012
|
static async oidcSessionCreate(
|
|
2971
|
-
env: EnvInterface,
|
|
3013
|
+
env: EnvInterface | MultiRegionEnv,
|
|
2972
3014
|
orgId: string,
|
|
2973
3015
|
token: string,
|
|
2974
3016
|
scopes: Array<Scope>,
|
|
@@ -2979,10 +3021,11 @@ export class ApiClient extends BaseClient {
|
|
|
2979
3021
|
): Promise<CubeSignerResponse<SessionData>> {
|
|
2980
3022
|
const o = op("/v0/org/{org_id}/oidc", "post");
|
|
2981
3023
|
|
|
3024
|
+
env = MultiRegionEnv.create(env);
|
|
2982
3025
|
const loginFn = async (mfaHeaders?: HeadersInit) => {
|
|
2983
3026
|
const data = await retryOn5XX(() =>
|
|
2984
3027
|
o({
|
|
2985
|
-
baseUrl: env.SignerApiRoot,
|
|
3028
|
+
baseUrl: env.primary.SignerApiRoot,
|
|
2986
3029
|
params: { path: { org_id: orgId } },
|
|
2987
3030
|
headers: mergeHeaders(headers, mfaHeaders, authHeader(token)),
|
|
2988
3031
|
body: {
|
|
@@ -2995,9 +3038,7 @@ export class ApiClient extends BaseClient {
|
|
|
2995
3038
|
|
|
2996
3039
|
return mapResponse(data, (sessionInfo): SessionData => {
|
|
2997
3040
|
return {
|
|
2998
|
-
env:
|
|
2999
|
-
["Dev-CubeSignerStack"]: env,
|
|
3000
|
-
},
|
|
3041
|
+
env: env.spec,
|
|
3001
3042
|
org_id: orgId,
|
|
3002
3043
|
token: sessionInfo.token,
|
|
3003
3044
|
refresh_token: sessionInfo.refresh_token,
|
|
@@ -3104,23 +3145,22 @@ export class ApiClient extends BaseClient {
|
|
|
3104
3145
|
* @returns The session data
|
|
3105
3146
|
*/
|
|
3106
3147
|
static async passkeyLoginComplete(
|
|
3107
|
-
env: EnvInterface,
|
|
3148
|
+
env: EnvInterface | MultiRegionEnv,
|
|
3108
3149
|
body: PasskeyAssertAnswer,
|
|
3109
3150
|
purpose?: string | null,
|
|
3110
3151
|
headers?: HeadersInit,
|
|
3111
3152
|
): Promise<SessionData> {
|
|
3112
3153
|
const o = op("/v0/passkey", "patch");
|
|
3154
|
+
env = MultiRegionEnv.create(env);
|
|
3113
3155
|
const resp = await retryOn5XX(() =>
|
|
3114
3156
|
o({
|
|
3115
|
-
baseUrl: env.SignerApiRoot,
|
|
3157
|
+
baseUrl: env.primary.SignerApiRoot,
|
|
3116
3158
|
body,
|
|
3117
3159
|
headers,
|
|
3118
3160
|
}),
|
|
3119
3161
|
).then(assertOk);
|
|
3120
3162
|
return {
|
|
3121
|
-
env:
|
|
3122
|
-
["Dev-CubeSignerStack"]: env,
|
|
3123
|
-
},
|
|
3163
|
+
env: env.spec,
|
|
3124
3164
|
org_id: resp.org_id!, // 'org_id' is always set from this endpoint
|
|
3125
3165
|
token: resp.token,
|
|
3126
3166
|
refresh_token: resp.refresh_token,
|
|
@@ -78,9 +78,16 @@ export class BaseClient extends EventEmitter<ClientEvents> {
|
|
|
78
78
|
/** MUTABLE configuration. */
|
|
79
79
|
readonly config: ClientConfig;
|
|
80
80
|
|
|
81
|
+
readonly #preferredEnv: EnvInterface | undefined;
|
|
82
|
+
|
|
81
83
|
/** @returns The env */
|
|
82
84
|
get env(): EnvInterface {
|
|
83
|
-
return this.sessionMeta.env["Dev-CubeSignerStack"];
|
|
85
|
+
return this.#preferredEnv ?? this.sessionMeta.env["Dev-CubeSignerStack"];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** @returns All available regional environments */
|
|
89
|
+
get envs(): EnvInterface[] {
|
|
90
|
+
return Object.values(this.sessionMeta.env);
|
|
84
91
|
}
|
|
85
92
|
|
|
86
93
|
/**
|
|
@@ -126,10 +133,13 @@ export class BaseClient extends EventEmitter<ClientEvents> {
|
|
|
126
133
|
sessionMeta: SessionMetadata,
|
|
127
134
|
manager: SessionManager,
|
|
128
135
|
targetOrgId?: string,
|
|
129
|
-
config?: ClientConfig
|
|
136
|
+
config?: ClientConfig & {
|
|
137
|
+
preferredEnv?: EnvInterface;
|
|
138
|
+
},
|
|
130
139
|
) {
|
|
131
140
|
super();
|
|
132
141
|
this.#targetOrgId = targetOrgId;
|
|
142
|
+
this.#preferredEnv = config?.preferredEnv;
|
|
133
143
|
this.sessionManager = manager;
|
|
134
144
|
this.sessionMeta = sessionMeta;
|
|
135
145
|
this.config = {
|
|
@@ -252,7 +262,7 @@ export class BaseClient extends EventEmitter<ClientEvents> {
|
|
|
252
262
|
return status >= 500 && status < 600;
|
|
253
263
|
},
|
|
254
264
|
});
|
|
255
|
-
// Once we have a non-5XX response, we will assertOk (either throwing or yielding the
|
|
265
|
+
// Once we have a non-5XX response, we will assertOk (either throwing or yielding the response)
|
|
256
266
|
return assertOk(resp);
|
|
257
267
|
} catch (e) {
|
|
258
268
|
if (e instanceof ErrResponse) {
|
package/src/client/session.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EnvInterface, StackName } from "../env";
|
|
1
|
+
import type { EnvInterface, Region, StackName } from "../env";
|
|
2
2
|
import { apiFetch, assertOk } from "../fetch";
|
|
3
3
|
import { retryOn5XX } from "../retry";
|
|
4
4
|
import type { ClientSessionInfo } from "../schema_types";
|
|
@@ -35,6 +35,9 @@ export interface SessionData {
|
|
|
35
35
|
session_exp: number | null | undefined; // may be missing in legacy session files
|
|
36
36
|
/** Available regional environment parameters */
|
|
37
37
|
env: Record<StackName, EnvInterface>;
|
|
38
|
+
/** Other regional environments (not included in 'env'), mapped by region. */
|
|
39
|
+
// NOTE: this is the format the CLI produces
|
|
40
|
+
other_envs?: Record<Region, EnvInterface>;
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
// Rather than just doing a simple Pick, we go the extra mile to ensure that
|
|
@@ -284,9 +287,13 @@ export function refresh(session: SessionData): Promise<SessionData> {
|
|
|
284
287
|
* @returns The session metadata
|
|
285
288
|
*/
|
|
286
289
|
export function metadata(session: SessionData): SessionMetadata {
|
|
287
|
-
const { env, org_id, role_id, purpose, session_exp } = session;
|
|
290
|
+
const { env, other_envs, org_id, role_id, purpose, session_exp } = session;
|
|
291
|
+
const merged = { ...env };
|
|
292
|
+
Object.entries(other_envs ?? {}).forEach(([region, env]) => {
|
|
293
|
+
merged[`Dev-CubeSignerStack-${region}`] = env;
|
|
294
|
+
});
|
|
288
295
|
return {
|
|
289
|
-
env,
|
|
296
|
+
env: merged,
|
|
290
297
|
org_id,
|
|
291
298
|
role_id,
|
|
292
299
|
purpose,
|
package/src/client.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { EmailOtpResponse, IdentityProof, RatchetConfig } from "./schema_ty
|
|
|
5
5
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
6
6
|
import { AddFidoChallenge, TotpChallenge } from "./mfa";
|
|
7
7
|
import { Org } from "./org";
|
|
8
|
-
import type { MfaReceipts, SessionData, SessionInfo, SessionManager } from ".";
|
|
8
|
+
import type { EnvInterface, MfaReceipts, SessionData, SessionInfo, SessionManager } from ".";
|
|
9
9
|
import { Key } from ".";
|
|
10
10
|
|
|
11
11
|
/** Options for logging in with OIDC token */
|
|
@@ -30,13 +30,16 @@ export class CubeSignerClient {
|
|
|
30
30
|
return this.#apiClient;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
/**
|
|
34
|
-
* @returns The environment.
|
|
35
|
-
*/
|
|
33
|
+
/** @returns The environment. */
|
|
36
34
|
get env() {
|
|
37
35
|
return this.#apiClient.env;
|
|
38
36
|
}
|
|
39
37
|
|
|
38
|
+
/** @returns All available regional environments */
|
|
39
|
+
get envs() {
|
|
40
|
+
return this.#apiClient.envs;
|
|
41
|
+
}
|
|
42
|
+
|
|
40
43
|
/**
|
|
41
44
|
* @returns The org ID of the client.
|
|
42
45
|
*/
|
|
@@ -53,6 +56,16 @@ export class CubeSignerClient {
|
|
|
53
56
|
this.#apiClient = apiClient;
|
|
54
57
|
}
|
|
55
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Creates a NEW client with a preferred regional environment {@link env} to use.
|
|
61
|
+
*
|
|
62
|
+
* @param env Preferred environment to use.
|
|
63
|
+
* @returns A new client with updated preferred environment.
|
|
64
|
+
*/
|
|
65
|
+
withPreferredEnv(env: EnvInterface | undefined) {
|
|
66
|
+
return new CubeSignerClient(this.#apiClient.withPreferredEnv(env));
|
|
67
|
+
}
|
|
68
|
+
|
|
56
69
|
/**
|
|
57
70
|
* Construct a client with a session or session manager
|
|
58
71
|
*
|
package/src/diffie_hellman.ts
CHANGED
|
@@ -20,7 +20,7 @@ export async function diffieHellmanDecrypt(
|
|
|
20
20
|
const suite = await userExportCipherSuite();
|
|
21
21
|
|
|
22
22
|
// Decrypt the ciphertext using the HPKE one-shot API
|
|
23
|
-
const tdec = new TextDecoder();
|
|
23
|
+
const tdec = new TextDecoder("utf-8");
|
|
24
24
|
// this is the info string used by the back-end when encrypting
|
|
25
25
|
const tenc = new TextEncoder();
|
|
26
26
|
const info = toArrayBuffer(tenc.encode("cubist-signer::DiffieHellmanResult"));
|
package/src/env.ts
CHANGED
|
@@ -56,6 +56,23 @@ export class MultiRegionEnv {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Convert either a single or multi-region environment to {@link MultiRegionEnv}.
|
|
61
|
+
*
|
|
62
|
+
* @param env Either a single or multi-region environment.
|
|
63
|
+
* @returns The resulting {@link MultiRegionEnv}
|
|
64
|
+
*/
|
|
65
|
+
static create(env: EnvInterface | MultiRegionEnv): MultiRegionEnv {
|
|
66
|
+
return env instanceof MultiRegionEnv
|
|
67
|
+
? env
|
|
68
|
+
: new MultiRegionEnv(
|
|
69
|
+
{
|
|
70
|
+
["Dev-CubeSignerStack"]: env,
|
|
71
|
+
},
|
|
72
|
+
env.Region,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
59
76
|
/**
|
|
60
77
|
* @returns The mapping from stack name to corresponding regional environment parameters.
|
|
61
78
|
* @internal
|
package/src/fetch.ts
CHANGED
|
@@ -181,7 +181,7 @@ export type FetchResponseSuccessData<T> = Required<FetchResponse<T>>["data"];
|
|
|
181
181
|
export function assertOk<T>(resp: FetchResponse<T>): FetchResponseSuccessData<T> {
|
|
182
182
|
if (!resp.response.ok) {
|
|
183
183
|
const errResp = resp.error as unknown as ErrorResponse | undefined;
|
|
184
|
-
|
|
184
|
+
throw new ErrResponse({
|
|
185
185
|
requestId: errResp?.request_id,
|
|
186
186
|
message: errResp?.message,
|
|
187
187
|
statusText: resp.response?.statusText,
|
|
@@ -189,7 +189,6 @@ export function assertOk<T>(resp: FetchResponse<T>): FetchResponseSuccessData<T>
|
|
|
189
189
|
url: resp.response?.url,
|
|
190
190
|
errorCode: errResp?.error_code,
|
|
191
191
|
});
|
|
192
|
-
throw error;
|
|
193
192
|
}
|
|
194
193
|
return resp.data!;
|
|
195
194
|
}
|
package/src/key.ts
CHANGED
|
@@ -29,6 +29,7 @@ import type {
|
|
|
29
29
|
DiffieHellmanResponse,
|
|
30
30
|
KeyInfoJwt,
|
|
31
31
|
KeyAttestationQuery,
|
|
32
|
+
BinanceApiProperties,
|
|
32
33
|
} from "./schema_types";
|
|
33
34
|
import type {
|
|
34
35
|
ApiClient,
|
|
@@ -99,6 +100,7 @@ export enum Ed25519 {
|
|
|
99
100
|
Stellar = "Ed25519StellarAddr",
|
|
100
101
|
Substrate = "Ed25519SubstrateAddr",
|
|
101
102
|
Tendermint = "Ed25519TendermintAddr",
|
|
103
|
+
BinanceApi = "Ed25519BinanceApi",
|
|
102
104
|
Ton = "Ed25519TonAddr",
|
|
103
105
|
Xrp = "Ed25519XrpAddr",
|
|
104
106
|
}
|
|
@@ -125,6 +127,9 @@ export type BabyJubjub = typeof BabyJubjub;
|
|
|
125
127
|
/** Key type */
|
|
126
128
|
export type KeyType = Secp256k1 | Bls | Ed25519 | Mnemonic | Stark | P256 | BabyJubjub;
|
|
127
129
|
|
|
130
|
+
/** The type representing all different kinds of key properties. */
|
|
131
|
+
export type KeyPropertiesPatch = { kind: "BinanceApi" } & BinanceApiProperties;
|
|
132
|
+
|
|
128
133
|
/**
|
|
129
134
|
* A representation of a signing key.
|
|
130
135
|
*/
|
|
@@ -265,6 +270,23 @@ export class Key {
|
|
|
265
270
|
return await this.update({ metadata }, mfaReceipt);
|
|
266
271
|
}
|
|
267
272
|
|
|
273
|
+
/**
|
|
274
|
+
* Set key properties. Each field in the provided patch is independent: missing
|
|
275
|
+
* means leave alone, `null` clears, a value sets. Sending `null` for the whole
|
|
276
|
+
* field clears all properties on the key.
|
|
277
|
+
*
|
|
278
|
+
* @param patch Type-specific properties
|
|
279
|
+
* @param mfaReceipt Optional MFA receipt(s)
|
|
280
|
+
* @throws if MFA is required and no receipts are provided
|
|
281
|
+
* @returns The updated key info
|
|
282
|
+
*/
|
|
283
|
+
async setProperties(
|
|
284
|
+
patch: KeyPropertiesPatch | null,
|
|
285
|
+
mfaReceipt?: MfaReceipts,
|
|
286
|
+
): Promise<KeyInfo> {
|
|
287
|
+
return await this.update({ properties: patch }, mfaReceipt);
|
|
288
|
+
}
|
|
289
|
+
|
|
268
290
|
/**
|
|
269
291
|
* Retrieves the existing metadata, asserts that it is an object (throws if it is not),
|
|
270
292
|
* then sets the value of the {@link name} property in that object to {@link value},
|
|
@@ -636,8 +658,8 @@ export class Key {
|
|
|
636
658
|
// construct the request
|
|
637
659
|
const subtle = await loadSubtleCrypto();
|
|
638
660
|
const req: DiffieHellmanRequest = {
|
|
639
|
-
points: points.map((pt) => encodeToBase64(
|
|
640
|
-
public_key: encodeToBase64(
|
|
661
|
+
points: points.map((pt) => encodeToBase64(pt)),
|
|
662
|
+
public_key: encodeToBase64(await subtle.exportKey("raw", publicKey)),
|
|
641
663
|
};
|
|
642
664
|
|
|
643
665
|
// send
|
|
@@ -820,6 +842,8 @@ export function fromSchemaKeyType(ty: SchemaKeyType): KeyType {
|
|
|
820
842
|
return Ed25519.Tendermint;
|
|
821
843
|
case "Ed25519TonAddr":
|
|
822
844
|
return Ed25519.Ton;
|
|
845
|
+
case "Ed25519BinanceApi":
|
|
846
|
+
return Ed25519.BinanceApi;
|
|
823
847
|
case "Stark":
|
|
824
848
|
return Stark;
|
|
825
849
|
case "Mnemonic":
|