@cubist-labs/cubesigner-sdk 0.1.23

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 (64) hide show
  1. package/LICENSE-APACHE +177 -0
  2. package/LICENSE-MIT +25 -0
  3. package/NOTICE +13 -0
  4. package/README.md +470 -0
  5. package/dist/examples/ethers.d.ts +1 -0
  6. package/dist/examples/ethers.js +142 -0
  7. package/dist/spec/env/beta.json +9 -0
  8. package/dist/spec/env/gamma.json +9 -0
  9. package/dist/spec/env/prod.json +9 -0
  10. package/dist/src/client.d.ts +10 -0
  11. package/dist/src/client.js +21 -0
  12. package/dist/src/env.d.ts +15 -0
  13. package/dist/src/env.js +35 -0
  14. package/dist/src/ethers/index.d.ts +50 -0
  15. package/dist/src/ethers/index.js +122 -0
  16. package/dist/src/index.d.ts +114 -0
  17. package/dist/src/index.js +205 -0
  18. package/dist/src/key.d.ts +114 -0
  19. package/dist/src/key.js +201 -0
  20. package/dist/src/mfa.d.ts +23 -0
  21. package/dist/src/mfa.js +63 -0
  22. package/dist/src/org.d.ts +161 -0
  23. package/dist/src/org.js +264 -0
  24. package/dist/src/role.d.ts +224 -0
  25. package/dist/src/role.js +256 -0
  26. package/dist/src/schema.d.ts +3049 -0
  27. package/dist/src/schema.js +7 -0
  28. package/dist/src/session/generic.d.ts +47 -0
  29. package/dist/src/session/generic.js +3 -0
  30. package/dist/src/session/management_session_manager.d.ts +59 -0
  31. package/dist/src/session/management_session_manager.js +111 -0
  32. package/dist/src/session/oidc_session_manager.d.ts +78 -0
  33. package/dist/src/session/oidc_session_manager.js +142 -0
  34. package/dist/src/session/session_manager.d.ts +74 -0
  35. package/dist/src/session/session_manager.js +79 -0
  36. package/dist/src/session/session_storage.d.ts +47 -0
  37. package/dist/src/session/session_storage.js +76 -0
  38. package/dist/src/session/signer_session_manager.d.ts +88 -0
  39. package/dist/src/session/signer_session_manager.js +159 -0
  40. package/dist/src/sign.d.ts +114 -0
  41. package/dist/src/sign.js +248 -0
  42. package/dist/src/signer_session.d.ts +180 -0
  43. package/dist/src/signer_session.js +369 -0
  44. package/dist/src/util.d.ts +35 -0
  45. package/dist/src/util.js +75 -0
  46. package/dist/test/sessions.d.ts +35 -0
  47. package/dist/test/sessions.js +56 -0
  48. package/package.json +61 -0
  49. package/src/client.ts +12 -0
  50. package/src/env.ts +25 -0
  51. package/src/ethers/index.ts +131 -0
  52. package/src/index.ts +220 -0
  53. package/src/key.ts +249 -0
  54. package/src/org.ts +333 -0
  55. package/src/role.ts +385 -0
  56. package/src/schema.ts +3054 -0
  57. package/src/session/management_session_manager.ts +136 -0
  58. package/src/session/oidc_session_manager.ts +193 -0
  59. package/src/session/session_manager.ts +114 -0
  60. package/src/session/session_storage.ts +73 -0
  61. package/src/session/signer_session_manager.ts +211 -0
  62. package/src/signer_session.ts +464 -0
  63. package/src/util.ts +58 -0
  64. package/tsconfig.json +32 -0
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.assertOk = exports.ErrResponse = exports.configDir = void 0;
27
+ const path = __importStar(require("path"));
28
+ /**
29
+ * Directory where CubeSigner stores config files.
30
+ * @return {string} Config dir
31
+ */
32
+ function configDir() {
33
+ const configDir = process.platform === "darwin"
34
+ ? `${process.env.HOME}/Library/Application Support`
35
+ : `${process.env.HOME}/.config`;
36
+ return path.join(configDir, "cubesigner");
37
+ }
38
+ exports.configDir = configDir;
39
+ /**
40
+ * Error response type, thrown on non-successful responses.
41
+ */
42
+ class ErrResponse extends Error {
43
+ /**
44
+ * Constructor
45
+ * @param {Partial<ErrResponse>} init Initializer
46
+ */
47
+ constructor(init) {
48
+ super(init.message);
49
+ Object.assign(this, init);
50
+ }
51
+ }
52
+ exports.ErrResponse = ErrResponse;
53
+ /**
54
+ * Throw if on error response. Otherwise, return the response data.
55
+ * @param {ResponseType} resp The response to check
56
+ * @param {string} description Description to include in the thrown error
57
+ * @return {D} The response data.
58
+ * @internal
59
+ */
60
+ function assertOk(resp, description) {
61
+ if (resp.error) {
62
+ throw new ErrResponse({
63
+ description,
64
+ message: resp.error.message,
65
+ statusText: resp.response?.statusText,
66
+ status: resp.response?.status,
67
+ });
68
+ }
69
+ if (resp.data === undefined) {
70
+ throw new Error("Response data is undefined");
71
+ }
72
+ return resp.data;
73
+ }
74
+ exports.assertOk = assertOk;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQTZCO0FBRTdCOzs7R0FHRztBQUNILFNBQWdCLFNBQVM7SUFDdkIsTUFBTSxTQUFTLEdBQ2IsT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRO1FBQzNCLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSw4QkFBOEI7UUFDbkQsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQztJQUNwQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFORCw4QkFNQztBQUlEOztHQUVHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsS0FBSztJQVFwQzs7O09BR0c7SUFDSCxZQUFZLElBQTBCO1FBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBaEJELGtDQWdCQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLFFBQVEsQ0FBTyxJQUF3QixFQUFFLFdBQW9CO0lBQzNFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNkLE1BQU0sSUFBSSxXQUFXLENBQUM7WUFDcEIsV0FBVztZQUNYLE9BQU8sRUFBRyxJQUFJLENBQUMsS0FBYSxDQUFDLE9BQU87WUFDcEMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVTtZQUNyQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNO1NBQzlCLENBQUMsQ0FBQztLQUNKO0lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7S0FDL0M7SUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDbkIsQ0FBQztBQWJELDRCQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG4vKipcbiAqIERpcmVjdG9yeSB3aGVyZSBDdWJlU2lnbmVyIHN0b3JlcyBjb25maWcgZmlsZXMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IENvbmZpZyBkaXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ0RpcigpOiBzdHJpbmcge1xuICBjb25zdCBjb25maWdEaXIgPVxuICAgIHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCJcbiAgICAgID8gYCR7cHJvY2Vzcy5lbnYuSE9NRX0vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0YFxuICAgICAgOiBgJHtwcm9jZXNzLmVudi5IT01FfS8uY29uZmlnYDtcbiAgcmV0dXJuIHBhdGguam9pbihjb25maWdEaXIsIFwiY3ViZXNpZ25lclwiKTtcbn1cblxudHlwZSBSZXNwb25zZVR5cGU8RCwgVD4gPSB7IGRhdGE/OiBEOyBlcnJvcj86IFQ7IHJlc3BvbnNlPzogUmVzcG9uc2UgfTtcblxuLyoqXG4gKiBFcnJvciByZXNwb25zZSB0eXBlLCB0aHJvd24gb24gbm9uLXN1Y2Nlc3NmdWwgcmVzcG9uc2VzLlxuICovXG5leHBvcnQgY2xhc3MgRXJyUmVzcG9uc2UgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKiBEZXNjcmlwdGlvbiAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIEhUVFAgc3RhdHVzIGNvZGUgdGV4dCAoZGVyaXZlZCBmcm9tIGB0aGlzLnN0YXR1c2ApICovXG4gIHJlYWRvbmx5IHN0YXR1c1RleHQ/OiBzdHJpbmc7XG4gIC8qKiBIVFRQIHN0YXR1cyBjb2RlICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEVyclJlc3BvbnNlPn0gaW5pdCBJbml0aWFsaXplclxuICAgKi9cbiAgY29uc3RydWN0b3IoaW5pdDogUGFydGlhbDxFcnJSZXNwb25zZT4pIHtcbiAgICBzdXBlcihpbml0Lm1lc3NhZ2UpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcywgaW5pdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvdyBpZiBvbiBlcnJvciByZXNwb25zZS4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHJlc3BvbnNlIGRhdGEuXG4gKiBAcGFyYW0ge1Jlc3BvbnNlVHlwZX0gcmVzcCBUaGUgcmVzcG9uc2UgdG8gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiB0byBpbmNsdWRlIGluIHRoZSB0aHJvd24gZXJyb3JcbiAqIEByZXR1cm4ge0R9IFRoZSByZXNwb25zZSBkYXRhLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRPazxELCBUPihyZXNwOiBSZXNwb25zZVR5cGU8RCwgVD4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogRCB7XG4gIGlmIChyZXNwLmVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVyclJlc3BvbnNlKHtcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgbWVzc2FnZTogKHJlc3AuZXJyb3IgYXMgYW55KS5tZXNzYWdlLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHN0YXR1c1RleHQ6IHJlc3AucmVzcG9uc2U/LnN0YXR1c1RleHQsXG4gICAgICBzdGF0dXM6IHJlc3AucmVzcG9uc2U/LnN0YXR1cyxcbiAgICB9KTtcbiAgfVxuICBpZiAocmVzcC5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNwb25zZSBkYXRhIGlzIHVuZGVmaW5lZFwiKTtcbiAgfVxuICByZXR1cm4gcmVzcC5kYXRhO1xufVxuIl19
@@ -0,0 +1,35 @@
1
+ import { EnvInterface } from "../src/env";
2
+ /**
3
+ * Defaults.
4
+ */
5
+ export declare class CubeSignerDefaults {
6
+ /** Default signer-session.json file path
7
+ * @return {string} Default signer-session.json file path
8
+ */
9
+ static signerSessionFile(): string;
10
+ /** Default management-session.json file path
11
+ * @return {string} Default management-session.json file path
12
+ */
13
+ static managementSessionFile(): string;
14
+ }
15
+ /** JSON representation of our "management session" file format */
16
+ export interface ManagementSession {
17
+ email: string;
18
+ id_token: string;
19
+ access_token: string;
20
+ refresh_token: string;
21
+ expiration: string;
22
+ env: {
23
+ ["Dev-CubeSignerStack"]: EnvInterface;
24
+ };
25
+ }
26
+ /** JSON representation of our "signer session" file format */
27
+ export interface SignerSession {
28
+ org_id: string;
29
+ role_id: string;
30
+ purpose: string;
31
+ token: string;
32
+ env: {
33
+ ["Dev-CubeSignerStack"]: EnvInterface;
34
+ };
35
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.CubeSignerDefaults = void 0;
27
+ const path = __importStar(require("path"));
28
+ /**
29
+ * Directory where CubeSigner stores config files.
30
+ * @return {string} Config dir
31
+ */
32
+ function configDir() {
33
+ const configDir = process.platform === "darwin"
34
+ ? `${process.env.HOME}/Library/Application Support`
35
+ : `${process.env.HOME}/.config`;
36
+ return path.join(configDir, "cubesigner");
37
+ }
38
+ /**
39
+ * Defaults.
40
+ */
41
+ class CubeSignerDefaults {
42
+ /** Default signer-session.json file path
43
+ * @return {string} Default signer-session.json file path
44
+ */
45
+ static signerSessionFile() {
46
+ return path.join(configDir(), "signer-session.json");
47
+ }
48
+ /** Default management-session.json file path
49
+ * @return {string} Default management-session.json file path
50
+ */
51
+ static managementSessionFile() {
52
+ return path.join(configDir(), "management-session.json");
53
+ }
54
+ }
55
+ exports.CubeSignerDefaults = CubeSignerDefaults;
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0L3Nlc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQTZCO0FBRzdCOzs7R0FHRztBQUNILFNBQVMsU0FBUztJQUNoQixNQUFNLFNBQVMsR0FDYixPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVE7UUFDM0IsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLDhCQUE4QjtRQUNuRCxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDO0lBQ3BDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDN0I7O09BRUc7SUFDSCxNQUFNLENBQUMsaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLHlCQUF5QixDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBZEQsZ0RBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBFbnZJbnRlcmZhY2UgfSBmcm9tIFwiLi4vc3JjL2VudlwiO1xuXG4vKipcbiAqIERpcmVjdG9yeSB3aGVyZSBDdWJlU2lnbmVyIHN0b3JlcyBjb25maWcgZmlsZXMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IENvbmZpZyBkaXJcbiAqL1xuZnVuY3Rpb24gY29uZmlnRGlyKCk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbmZpZ0RpciA9XG4gICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIlxuICAgICAgPyBgJHtwcm9jZXNzLmVudi5IT01FfS9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnRgXG4gICAgICA6IGAke3Byb2Nlc3MuZW52LkhPTUV9Ly5jb25maWdgO1xuICByZXR1cm4gcGF0aC5qb2luKGNvbmZpZ0RpciwgXCJjdWJlc2lnbmVyXCIpO1xufVxuXG4vKipcbiAqIERlZmF1bHRzLlxuICovXG5leHBvcnQgY2xhc3MgQ3ViZVNpZ25lckRlZmF1bHRzIHtcbiAgLyoqIERlZmF1bHQgc2lnbmVyLXNlc3Npb24uanNvbiBmaWxlIHBhdGhcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZWZhdWx0IHNpZ25lci1zZXNzaW9uLmpzb24gZmlsZSBwYXRoXG4gICAqL1xuICBzdGF0aWMgc2lnbmVyU2Vzc2lvbkZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKGNvbmZpZ0RpcigpLCBcInNpZ25lci1zZXNzaW9uLmpzb25cIik7XG4gIH1cblxuICAvKiogRGVmYXVsdCBtYW5hZ2VtZW50LXNlc3Npb24uanNvbiBmaWxlIHBhdGhcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZWZhdWx0IG1hbmFnZW1lbnQtc2Vzc2lvbi5qc29uIGZpbGUgcGF0aFxuICAgKi9cbiAgc3RhdGljIG1hbmFnZW1lbnRTZXNzaW9uRmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4oY29uZmlnRGlyKCksIFwibWFuYWdlbWVudC1zZXNzaW9uLmpzb25cIik7XG4gIH1cbn1cblxuLyoqIEpTT04gcmVwcmVzZW50YXRpb24gb2Ygb3VyIFwibWFuYWdlbWVudCBzZXNzaW9uXCIgZmlsZSBmb3JtYXQgKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlbWVudFNlc3Npb24ge1xuICBlbWFpbDogc3RyaW5nO1xuICBpZF90b2tlbjogc3RyaW5nO1xuICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgcmVmcmVzaF90b2tlbjogc3RyaW5nO1xuICBleHBpcmF0aW9uOiBzdHJpbmc7XG4gIGVudjoge1xuICAgIFtcIkRldi1DdWJlU2lnbmVyU3RhY2tcIl06IEVudkludGVyZmFjZTtcbiAgfTtcbn1cblxuLyoqIEpTT04gcmVwcmVzZW50YXRpb24gb2Ygb3VyIFwic2lnbmVyIHNlc3Npb25cIiBmaWxlIGZvcm1hdCAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduZXJTZXNzaW9uIHtcbiAgb3JnX2lkOiBzdHJpbmc7XG4gIHJvbGVfaWQ6IHN0cmluZztcbiAgcHVycG9zZTogc3RyaW5nO1xuICB0b2tlbjogc3RyaW5nO1xuICBlbnY6IHtcbiAgICBbXCJEZXYtQ3ViZVNpZ25lclN0YWNrXCJdOiBFbnZJbnRlcmZhY2U7XG4gIH07XG59XG4iXX0=
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@cubist-labs/cubesigner-sdk",
3
+ "author": "Cubist, Inc.",
4
+ "version": "0.1.23",
5
+ "description": "CubeSigner TypeScript SDK",
6
+ "homepage": "https://github.com/cubist-labs/CubeSigner-TypeScript-SDK",
7
+ "bugs": "https://github.com/cubist-labs/CubeSigner-TypeScript-SDK/issues",
8
+ "license": "MIT OR Apache-2.0",
9
+ "files": [
10
+ "tsconfig.json",
11
+ "src/**",
12
+ "dist/**",
13
+ "NOTICE",
14
+ "LICENSE-APACHE",
15
+ "LICENSE-MIT"
16
+ ],
17
+ "main": "dist/src/index.js",
18
+ "types": "dist/src/index.d.ts",
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "test": "jest --maxWorkers=1",
22
+ "prepack": "tsc",
23
+ "typedoc": "typedoc",
24
+ "fix": "eslint . --ext .ts --fix",
25
+ "lint": "eslint . --ext .ts",
26
+ "fmt": "prettier --write .",
27
+ "fmt-check": "prettier --check .",
28
+ "gen-schema": "npx openapi-typescript ./spec/openapi.json --output ./src/schema.ts"
29
+ },
30
+ "dependencies": {
31
+ "ethers": "^6.7.1",
32
+ "openapi-fetch": "0.6.1"
33
+ },
34
+ "devDependencies": {
35
+ "@types/chai": "^4.3.5",
36
+ "@types/jest": "^29.5.2",
37
+ "@types/node": "^20.3.2",
38
+ "@types/node-fetch": "^2.6.4",
39
+ "@types/tmp": "^0.2.3",
40
+ "@typescript-eslint/eslint-plugin": "^5.60.1",
41
+ "chai": "^4.3.7",
42
+ "eslint": "^8.43.0",
43
+ "eslint-config-google": "^0.14.0",
44
+ "eslint-config-prettier": "^8.8.0",
45
+ "jest": "^29.5.0",
46
+ "openapi-typescript": "^6.2.8",
47
+ "otplib": "^12.0.1",
48
+ "prettier": "3.0.0",
49
+ "tmp": "^0.2.1",
50
+ "ts-jest": "^29.1.0",
51
+ "ts-node": "^10.9.1",
52
+ "typedoc": "^0.24.8",
53
+ "typescript": "^5.1.6"
54
+ },
55
+ "optionalDependencies": {
56
+ "@aws-sdk/client-cognito-identity-provider": "^3.398.0"
57
+ },
58
+ "prettier": {
59
+ "printWidth": 100
60
+ }
61
+ }
package/src/client.ts ADDED
@@ -0,0 +1,12 @@
1
+ import createClient from "openapi-fetch";
2
+ import { paths } from "./schema";
3
+
4
+ /** Type of http client.
5
+ * @internal
6
+ * */
7
+ export type Client = ReturnType<typeof createClient<paths>>;
8
+
9
+ /** Re-export schema.
10
+ * @internal
11
+ * */
12
+ export * from "./schema";
package/src/env.ts ADDED
@@ -0,0 +1,25 @@
1
+ import * as prodSpec from "../spec/env/prod.json";
2
+ import * as gammaSpec from "../spec/env/gamma.json";
3
+ import * as betaSpec from "../spec/env/beta.json";
4
+
5
+ export type Environment =
6
+ /** Production environment */
7
+ | "prod"
8
+ /** Gamma, staging environment */
9
+ | "gamma"
10
+ /** Beta, development environment */
11
+ | "beta";
12
+
13
+ export interface EnvInterface {
14
+ ClientId: string;
15
+ LongLivedClientId: string;
16
+ Region: string;
17
+ UserPoolId: string;
18
+ SignerApiRoot: string;
19
+ }
20
+
21
+ export const envs: Record<Environment, EnvInterface> = {
22
+ prod: prodSpec["Dev-CubeSignerStack"],
23
+ gamma: gammaSpec["Dev-CubeSignerStack"],
24
+ beta: betaSpec["Dev-CubeSignerStack"],
25
+ };
@@ -0,0 +1,131 @@
1
+ import {
2
+ JsonRpcApiProvider,
3
+ TypedDataDomain,
4
+ TypedDataEncoder,
5
+ TypedDataField,
6
+ ethers,
7
+ getBytes,
8
+ toBeHex,
9
+ } from "ethers";
10
+ import { BlobSignRequest, EvmSignRequest, SignerSession } from "../signer_session";
11
+ import { Key } from "../key";
12
+
13
+ /**
14
+ * A ethers.js Signer using CubeSigner
15
+ */
16
+ export class Signer extends ethers.AbstractSigner {
17
+ /** The address of the account */
18
+ readonly #address: string;
19
+
20
+ /** The key to use for signing */
21
+ #key?: Key;
22
+
23
+ /** The underlying session */
24
+ readonly #signerSession: SignerSession;
25
+
26
+ /** Create new Signer instance
27
+ * @param {string} address The address of the account to use.
28
+ * @param {SignerSession} signerSession The underlying Signer session.
29
+ * @param {null | ethers.Provider} provider The optional provider instance to use.
30
+ */
31
+ constructor(address: string, signerSession: SignerSession, provider?: null | ethers.Provider) {
32
+ super(provider);
33
+ this.#address = address;
34
+ this.#signerSession = signerSession;
35
+ }
36
+
37
+ /** Resolves to the signer address. */
38
+ async getAddress(): Promise<string> {
39
+ return this.#address;
40
+ }
41
+
42
+ /**
43
+ * Returns the signer connected to %%provider%%.
44
+ * @param {null | ethers.Provider} provider The optional provider instance to use.
45
+ * @return {Signer} The signer connected to signer.
46
+ */
47
+ connect(provider: null | ethers.Provider): Signer {
48
+ return new Signer(this.#address, this.#signerSession, provider);
49
+ }
50
+
51
+ /**
52
+ * Signs a transaction. This populates the transaction type to `0x02` (EIP-1559) unless set.
53
+ * @param {ethers.TransactionRequest} tx The transaction to sign.
54
+ * @return {Promise<string>} Hex-encoded RLP encoding of the transaction and its signature.
55
+ */
56
+ async signTransaction(tx: ethers.TransactionRequest): Promise<string> {
57
+ // get the chain id from the network or tx
58
+ let chainId = tx.chainId;
59
+ if (chainId === undefined) {
60
+ const network = await this.provider?.getNetwork();
61
+ chainId = network?.chainId?.toString() ?? "1";
62
+ }
63
+
64
+ // Convert the transaction into a JSON-RPC transaction
65
+ const rpcTx =
66
+ this.provider instanceof JsonRpcApiProvider
67
+ ? this.provider.getRpcTransaction(tx)
68
+ : // We can just call the getRpcTransaction with a
69
+ // null receiver since it doesn't actually use it
70
+ // (and really should be declared static).
71
+ JsonRpcApiProvider.prototype.getRpcTransaction.call(null, tx);
72
+ rpcTx.type = toBeHex(tx.type ?? 0x02, 1); // we expect 0x0[0-2]
73
+
74
+ const req = <EvmSignRequest>{
75
+ chain_id: Number(chainId),
76
+ tx: rpcTx,
77
+ };
78
+ const sig = await this.#signerSession.signEvm(this.#address, req);
79
+ return sig.data().rlp_signed_tx;
80
+ }
81
+
82
+ /** Signs arbitrary messages. This uses ethers.js's [hashMessage](https://docs.ethers.org/v6/api/hashing/#hashMessage)
83
+ * to compute the EIP-191 digest and signs this digest using {@link Key#signBlob}.
84
+ * The key (for this session) must have the `"AllowRawBlobSigning"` policy attached.
85
+ * @param {string | Uint8Array} message The message to sign.
86
+ * @return {Promise<string>} The signature.
87
+ */
88
+ async signMessage(message: string | Uint8Array): Promise<string> {
89
+ const digest = ethers.hashMessage(message);
90
+ return this.signBlob(digest);
91
+ }
92
+
93
+ /** Signs EIP-712 typed data. This uses ethers.js's
94
+ * [TypedDataEncoder.hash](https://docs.ethers.org/v6/api/hashing/#TypedDataEncoder_hash)
95
+ * to compute the EIP-712 digest and signs this digest using {@link Key#signBlob}.
96
+ * The key (for this session) must have the `"AllowRawBlobSigning"` policy attached.
97
+ * @param {TypedDataDomain} domain The domain of the typed data.
98
+ * @param {Record<string, Array<TypedDataField>>} types The types of the typed data.
99
+ * @param {Record<string, any>} value The value of the typed data.
100
+ * @return {Promise<string>} The signature.
101
+ */
102
+ async signTypedData(
103
+ domain: TypedDataDomain,
104
+ types: Record<string, Array<TypedDataField>>,
105
+ value: Record<string, any>, // eslint-disable-line @typescript-eslint/no-explicit-any
106
+ ): Promise<string> {
107
+ const digest = TypedDataEncoder.hash(domain, types, value);
108
+ return this.signBlob(digest);
109
+ }
110
+
111
+ /** Sign arbitrary digest. This uses {@link Key#signBlob}.
112
+ * @param {string} digest The digest to sign.
113
+ * @return {Promise<string>} The signature.
114
+ */
115
+ private async signBlob(digest: string): Promise<string> {
116
+ const blobReq = <BlobSignRequest>{
117
+ message_base64: Buffer.from(getBytes(digest)).toString("base64"),
118
+ };
119
+ // Get the key corresponding to this address
120
+ if (this.#key === undefined) {
121
+ const key = (await this.#signerSession.keys()).find((k) => k.materialId === this.#address);
122
+ if (key === undefined) {
123
+ throw new Error(`Cannot access key '${this.#address}'`);
124
+ }
125
+ this.#key = key;
126
+ }
127
+ // sign
128
+ const result = await this.#signerSession.signBlob(this.#key, blobReq);
129
+ return result.data().signature;
130
+ }
131
+ }
package/src/index.ts ADDED
@@ -0,0 +1,220 @@
1
+ import { envs, EnvInterface } from "./env";
2
+ import { components, Client } from "./client";
3
+ import { Org } from "./org";
4
+ import { JsonFileSessionStorage, MemorySessionStorage } from "./session/session_storage";
5
+ import { SignerSessionStorage } from "./session/signer_session_manager";
6
+ import { SignerSession } from "./signer_session";
7
+ import {
8
+ ManagementSessionManager,
9
+ ManagementSessionStorage,
10
+ } from "./session/management_session_manager";
11
+ import { OidcSessionManager, OidcSessionStorage } from "./session/oidc_session_manager";
12
+ import { assertOk, configDir } from "./util";
13
+ import * as path from "path";
14
+
15
+ /** CubeSigner constructor options */
16
+ export interface CubeSignerOptions {
17
+ /** The environment to use */
18
+ env?: EnvInterface;
19
+ /** The management authorization token */
20
+ sessionMgr?: ManagementSessionManager | OidcSessionManager;
21
+ }
22
+
23
+ export type UserInfo = components["schemas"]["UserInfo"];
24
+ export type TotpInfo = components["responses"]["TotpInfo"]["content"]["application/json"];
25
+ export type ConfiguredMfa = components["schemas"]["ConfiguredMfa"];
26
+
27
+ /** CubeSigner client */
28
+ export class CubeSigner {
29
+ readonly #env: EnvInterface;
30
+ readonly sessionMgr?: ManagementSessionManager | OidcSessionManager;
31
+
32
+ /** @return {EnvInterface} The CubeSigner environment of this client */
33
+ get env(): EnvInterface {
34
+ return this.#env;
35
+ }
36
+
37
+ /**
38
+ * Loads an existing management session and creates a CubeSigner instance.
39
+ * @param {ManagementSessionStorage} storage Optional session storage to load
40
+ * the session from. If not specified, the management session from the config
41
+ * directory will be loaded.
42
+ * @return {Promise<CubeSigner>} New CubeSigner instance
43
+ */
44
+ static async loadManagementSession(storage?: ManagementSessionStorage): Promise<CubeSigner> {
45
+ const defaultFilePath = path.join(configDir(), "management-session.json");
46
+ const sessionMgr = await ManagementSessionManager.loadFromStorage(
47
+ storage ?? new JsonFileSessionStorage(defaultFilePath),
48
+ );
49
+ return new CubeSigner(<CubeSignerOptions>{
50
+ sessionMgr,
51
+ });
52
+ }
53
+
54
+ /**
55
+ * Loads a signer session from a session storage (e.g., session file).
56
+ * @param {SignerSessionStorage} storage Optional session storage to load
57
+ * the session from. If not specified, the signer session from the config
58
+ * directory will be loaded.
59
+ * @return {Promise<SignerSession>} New signer session
60
+ */
61
+ static async loadSignerSession(storage?: SignerSessionStorage): Promise<SignerSession> {
62
+ const defaultFilePath = path.join(configDir(), "signer-session.json");
63
+ const sss = storage ?? new JsonFileSessionStorage(defaultFilePath);
64
+ const env = (await sss.retrieve()).env["Dev-CubeSignerStack"];
65
+ return await SignerSession.loadSignerSession(new CubeSigner({ env }), sss);
66
+ }
67
+
68
+ /**
69
+ * Loads a signer session from OIDC storage
70
+ * @param {OidcSessionStorage} storage The storage to load from
71
+ * @return {Promise<SignerSession>} New signer session
72
+ */
73
+ static async loadOidcSession(storage: OidcSessionStorage): Promise<SignerSession> {
74
+ const env = (await storage.retrieve()).env;
75
+ return await SignerSession.loadOidcSession(new CubeSigner({ env }), storage);
76
+ }
77
+
78
+ /**
79
+ * Create a new CubeSigner instance.
80
+ * @param {CubeSignerOptions} options The options for the CubeSigner instance.
81
+ */
82
+ constructor(options: CubeSignerOptions) {
83
+ let env = options.env;
84
+ if (options.sessionMgr) {
85
+ this.sessionMgr = options.sessionMgr;
86
+ env = env ?? this.sessionMgr.env;
87
+ }
88
+ this.#env = env ?? envs["gamma"];
89
+ }
90
+
91
+ /**
92
+ * Authenticate an OIDC user and create a new OIDC session manager for them.
93
+ * @param {string} oidcToken The OIDC token
94
+ * @param {string} orgId The id of the organization that the user is in
95
+ * @param {List<string>} scopes The scopes of the resulting session
96
+ * @param {OidcSessionStorage} storage The signer session storage
97
+ * @return {Promise<OidcSessionManager>} The OIDC session manager
98
+ */
99
+ async createOidcManager(
100
+ oidcToken: string,
101
+ orgId: string,
102
+ scopes: Array<string>,
103
+ storage?: OidcSessionStorage,
104
+ ): Promise<OidcSessionManager> {
105
+ return await OidcSessionManager.create(
106
+ this.env,
107
+ storage || new MemorySessionStorage(),
108
+ oidcToken,
109
+ orgId,
110
+ scopes,
111
+ );
112
+ }
113
+
114
+ /**
115
+ * Authenticate an OIDC user and create a new session for them.
116
+ * @param {string} oidcToken The OIDC token
117
+ * @param {string} orgId The id of the organization that the user is in
118
+ * @param {List<string>} scopes The scopes of the resulting session
119
+ * @param {OidcSessionStorage} storage The signer session storage
120
+ * @return {Promise<SignerSession>} The signer session
121
+ */
122
+ async createOidcSession(
123
+ oidcToken: string,
124
+ orgId: string,
125
+ scopes: Array<string>,
126
+ storage?: OidcSessionStorage,
127
+ ): Promise<SignerSession> {
128
+ const mgr = await this.createOidcManager(oidcToken, orgId, scopes, storage);
129
+ return await CubeSigner.loadOidcSession(mgr.storage);
130
+ }
131
+
132
+ /** Retrieves information about the current user. */
133
+ async aboutMe(): Promise<UserInfo> {
134
+ const resp = await (
135
+ await this.management()
136
+ ).get("/v0/about_me", {
137
+ parseAs: "json",
138
+ });
139
+ const data = assertOk(resp);
140
+ return data;
141
+ }
142
+
143
+ /**
144
+ * Creates and sets a new TOTP configuration for the logged-in user,
145
+ * overriding the existing one (if any).
146
+ */
147
+ async resetTotp(): Promise<TotpInfo> {
148
+ const resp = await (
149
+ await this.management()
150
+ ).patch("/v0/totp", {
151
+ parseAs: "json",
152
+ });
153
+ return assertOk(resp);
154
+ }
155
+
156
+ /**
157
+ * Verifies a given TOTP code against the current user's TOTP configuration.
158
+ * Throws an error if the verification fails.
159
+ * @param {string} code Current TOTP code
160
+ */
161
+ async verifyTotp(code: string) {
162
+ const resp = await (
163
+ await this.management()
164
+ ).get("/v0/totp/verify/{code}", {
165
+ params: { path: { code } },
166
+ parseAs: "json",
167
+ });
168
+ assertOk(resp);
169
+ }
170
+
171
+ /** Retrieves information about an organization.
172
+ * @param {string} orgId The ID or name of the organization.
173
+ * @return {Org} The organization.
174
+ * */
175
+ async getOrg(orgId: string): Promise<Org> {
176
+ const resp = await (
177
+ await this.management()
178
+ ).get("/v0/org/{org_id}", {
179
+ params: { path: { org_id: orgId } },
180
+ parseAs: "json",
181
+ });
182
+
183
+ const data = assertOk(resp);
184
+ return new Org(this, data);
185
+ }
186
+
187
+ /** Get the management client.
188
+ * @return {Client} The client.
189
+ * @internal
190
+ * */
191
+ async management(): Promise<Client> {
192
+ if (!this.sessionMgr) {
193
+ throw new Error("No management session loaded");
194
+ }
195
+ return await this.sessionMgr.client();
196
+ }
197
+ }
198
+
199
+ /** Organizations */
200
+ export * from "./org";
201
+ /** Keys */
202
+ export * from "./key";
203
+ /** Roles */
204
+ export * from "./role";
205
+ /** Env */
206
+ export * from "./env";
207
+ /** Sessions */
208
+ export * from "./signer_session";
209
+ /** Session storage */
210
+ export * from "./session/session_storage";
211
+ /** Session manager */
212
+ export * from "./session/session_manager";
213
+ /** Management session manager */
214
+ export * from "./session/management_session_manager";
215
+ /** OIDC session manager */
216
+ export * from "./session/oidc_session_manager";
217
+ /** Signer session manager */
218
+ export * from "./session/signer_session_manager";
219
+ /** Export ethers.js Signer */
220
+ export * as ethers from "./ethers";