@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,63 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
+ if (kind === "m") throw new TypeError("Private method is not writable");
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ var _Mfa_sign, _Mfa_role;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.Mfa = void 0;
19
+ const assert_1 = __importDefault(require("assert"));
20
+ /**
21
+ * Wrapper around @type {Sign} and @type {Role} that adds a **single-approval**
22
+ * multi-factor authorization on top of all sign operations.
23
+ */
24
+ class Mfa {
25
+ /* eslint-disable valid-jsdoc */
26
+ /**
27
+ * Auto approve a sign operation that requires MFA.
28
+ *
29
+ * @param signFn The sign operation to call
30
+ * @param {T} args Arguments to the sign operation
31
+ * @return {Promise<U>} The result of the sign operation.
32
+ */
33
+ async autoApprove(// eslint-disable-line @typescript-eslint/no-explicit-any
34
+ /* eslint-enable valid-jsdoc */
35
+ signFn, ...args) {
36
+ const data = await signFn.bind(__classPrivateFieldGet(this, _Mfa_sign, "f"))(...args);
37
+ if (data.requiresMfa()) {
38
+ const mfaId = data.mfaId();
39
+ const approval = await __classPrivateFieldGet(this, _Mfa_role, "f").mfaApprove(mfaId);
40
+ (0, assert_1.default)(approval.id === mfaId);
41
+ (0, assert_1.default)(approval.receipt);
42
+ const mfa = new Mfa(__classPrivateFieldGet(this, _Mfa_sign, "f").withMfaApproval(approval), __classPrivateFieldGet(this, _Mfa_role, "f"));
43
+ return await mfa.autoApprove(signFn, ...args);
44
+ }
45
+ else {
46
+ return data;
47
+ }
48
+ }
49
+ /**
50
+ * Constructor.
51
+ * @param {Sign} sign Sign instance to use for signing
52
+ * @param {Role} role Role instance to use for MFA approval
53
+ */
54
+ constructor(sign, role) {
55
+ _Mfa_sign.set(this, void 0);
56
+ _Mfa_role.set(this, void 0);
57
+ __classPrivateFieldSet(this, _Mfa_sign, sign, "f");
58
+ __classPrivateFieldSet(this, _Mfa_role, role, "f");
59
+ }
60
+ }
61
+ exports.Mfa = Mfa;
62
+ _Mfa_sign = new WeakMap(), _Mfa_role = new WeakMap();
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21mYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFHNUI7OztHQUdHO0FBQ0gsTUFBYSxHQUFHO0lBSWQsZ0NBQWdDO0lBQ2hDOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQTJCLHlEQUF5RDtJQUNuRywrQkFBK0I7SUFDL0IsTUFBZ0QsRUFDaEQsR0FBRyxJQUFPO1FBRVYsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUFBLElBQUksaUJBQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLE1BQU0sUUFBUSxHQUFHLE1BQU0sdUJBQUEsSUFBSSxpQkFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxJQUFBLGdCQUFNLEVBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQztZQUM5QixJQUFBLGdCQUFNLEVBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLHVCQUFBLElBQUksaUJBQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsdUJBQUEsSUFBSSxpQkFBTSxDQUFDLENBQUM7WUFDdEUsT0FBTyxNQUFNLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDL0M7YUFBTTtZQUNMLE9BQU8sSUFBUyxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLElBQVUsRUFBRSxJQUFVO1FBbEN6Qiw0QkFBWTtRQUNaLDRCQUFZO1FBa0NuQix1QkFBQSxJQUFJLGFBQVMsSUFBSSxNQUFBLENBQUM7UUFDbEIsdUJBQUEsSUFBSSxhQUFTLElBQUksTUFBQSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXZDRCxrQkF1Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IFNpZ24sIFNpZ25SZXNwb25zZSwgUm9sZSB9IGZyb20gXCIuXCI7XG5cbi8qKlxuICogV3JhcHBlciBhcm91bmQgQHR5cGUge1NpZ259IGFuZCBAdHlwZSB7Um9sZX0gdGhhdCBhZGRzIGEgKipzaW5nbGUtYXBwcm92YWwqKlxuICogbXVsdGktZmFjdG9yIGF1dGhvcml6YXRpb24gb24gdG9wIG9mIGFsbCBzaWduIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZmEge1xuICByZWFkb25seSAjc2lnbjogU2lnbjtcbiAgcmVhZG9ubHkgI3JvbGU6IFJvbGU7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgdmFsaWQtanNkb2MgKi9cbiAgLyoqXG4gICAqIEF1dG8gYXBwcm92ZSBhIHNpZ24gb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgTUZBLlxuICAgKlxuICAgKiBAcGFyYW0gc2lnbkZuIFRoZSBzaWduIG9wZXJhdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7VH0gYXJncyBBcmd1bWVudHMgdG8gdGhlIHNpZ24gb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VT59IFRoZSByZXN1bHQgb2YgdGhlIHNpZ24gb3BlcmF0aW9uLlxuICAgKi9cbiAgYXN5bmMgYXV0b0FwcHJvdmU8VCBleHRlbmRzIEFycmF5PGFueT4sIFU+KCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAvKiBlc2xpbnQtZW5hYmxlIHZhbGlkLWpzZG9jICovXG4gICAgc2lnbkZuOiAoLi4uYXJnczogVCkgPT4gUHJvbWlzZTxTaWduUmVzcG9uc2U8VT4+LFxuICAgIC4uLmFyZ3M6IFRcbiAgKTogUHJvbWlzZTxVPiB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHNpZ25Gbi5iaW5kKHRoaXMuI3NpZ24pKC4uLmFyZ3MpO1xuICAgIGlmIChkYXRhLnJlcXVpcmVzTWZhKCkpIHtcbiAgICAgIGNvbnN0IG1mYUlkID0gZGF0YS5tZmFJZCgpO1xuICAgICAgY29uc3QgYXBwcm92YWwgPSBhd2FpdCB0aGlzLiNyb2xlLm1mYUFwcHJvdmUobWZhSWQpO1xuICAgICAgYXNzZXJ0KGFwcHJvdmFsLmlkID09PSBtZmFJZCk7XG4gICAgICBhc3NlcnQoYXBwcm92YWwucmVjZWlwdCk7XG4gICAgICBjb25zdCBtZmEgPSBuZXcgTWZhKHRoaXMuI3NpZ24ud2l0aE1mYUFwcHJvdmFsKGFwcHJvdmFsKSwgdGhpcy4jcm9sZSk7XG4gICAgICByZXR1cm4gYXdhaXQgbWZhLmF1dG9BcHByb3ZlKHNpZ25GbiwgLi4uYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkYXRhIGFzIFU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge1NpZ259IHNpZ24gU2lnbiBpbnN0YW5jZSB0byB1c2UgZm9yIHNpZ25pbmdcbiAgICogQHBhcmFtIHtSb2xlfSByb2xlIFJvbGUgaW5zdGFuY2UgdG8gdXNlIGZvciBNRkEgYXBwcm92YWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNpZ246IFNpZ24sIHJvbGU6IFJvbGUpIHtcbiAgICB0aGlzLiNzaWduID0gc2lnbjtcbiAgICB0aGlzLiNyb2xlID0gcm9sZTtcbiAgfVxufVxuIl19
@@ -0,0 +1,161 @@
1
+ import { CubeSigner, MfaRequestInfo } from ".";
2
+ import { components } from "./client";
3
+ import { KeyType, Key } from "./key";
4
+ import { Role } from "./role";
5
+ /** Organization id */
6
+ export type OrgId = string;
7
+ /** Org-wide policy */
8
+ export type OrgPolicy = SourceIpAllowlistPolicy | OriginAllowlistPolicy | MaxDailyUnstakePolicy;
9
+ /**
10
+ * Only allow requests from the specified origins.
11
+ * @example {"OriginAllowlist": "*"}
12
+ */
13
+ export interface OriginAllowlistPolicy {
14
+ OriginAllowlist: string[] | "*";
15
+ }
16
+ /**
17
+ * Restrict signing to specific source IP addresses.
18
+ * @example {"SourceIpAllowlist": ["10.1.2.3/8", "169.254.17.1/16"]}
19
+ */
20
+ export interface SourceIpAllowlistPolicy {
21
+ SourceIpAllowlist: string[];
22
+ }
23
+ /**
24
+ * Restrict the number of unstakes per day.
25
+ * @example {"MaxDailyUnstake": 5 }
26
+ */
27
+ export interface MaxDailyUnstakePolicy {
28
+ MaxDailyUnstake: number;
29
+ }
30
+ type OrgInfo = components["schemas"]["OrgInfo"];
31
+ type UserIdInfo = components["schemas"]["UserIdInfo"];
32
+ export type OidcIdentity = components["schemas"]["OIDCIdentity"];
33
+ export type MemberRole = components["schemas"]["MemberRole"];
34
+ /** An organization. */
35
+ export declare class Org {
36
+ #private;
37
+ /**
38
+ * @description The org id
39
+ * @example Org#c3b9379c-4e8c-4216-bd0a-65ace53cf98f
40
+ * */
41
+ get id(): OrgId;
42
+ /** Human-readable name for the org */
43
+ name(): Promise<string | undefined>;
44
+ /** Set the human-readable name for the org.
45
+ * @param {string} name The new human-readable name for the org (must be alphanumeric).
46
+ * @example my_org_name
47
+ * */
48
+ setName(name: string): Promise<void>;
49
+ /** Is the org enabled? */
50
+ enabled(): Promise<boolean>;
51
+ /** Enable the org. */
52
+ enable(): Promise<void>;
53
+ /** Disable the org. */
54
+ disable(): Promise<void>;
55
+ /** Get the policy for the org. */
56
+ policy(): Promise<OrgPolicy[]>;
57
+ /** Set the policy for the org.
58
+ * @param {OrgPolicy[]} policy The new policy for the org.
59
+ * */
60
+ setPolicy(policy: OrgPolicy[]): Promise<void>;
61
+ /** Create a new signing key.
62
+ * @param {KeyType} type The type of key to create.
63
+ * @param {string?} ownerId The owner of the key. Defaults to the session's user.
64
+ * @return {Key[]} The new keys.
65
+ * */
66
+ createKey(type: KeyType, ownerId?: string): Promise<Key>;
67
+ /** Create new signing keys.
68
+ * @param {KeyType} type The type of key to create.
69
+ * @param {nummber} count The number of keys to create.
70
+ * @param {string?} ownerId The owner of the keys. Defaults to the session's user.
71
+ * @return {Key[]} The new keys.
72
+ * */
73
+ createKeys(type: KeyType, count: number, ownerId?: string): Promise<Key[]>;
74
+ /**
75
+ * Create a new user in the organization and sends an invitation to that user
76
+ * @param {string} email Email of the user
77
+ * @param {string} name The full name of the user
78
+ */
79
+ createUser(email: string, name: string): Promise<void>;
80
+ /**
81
+ * Create a new OIDC user
82
+ * @param {OidcIdentity} identity The identity of the OIDC user
83
+ * @param {MemberRole} memberRole The type of membership of the new user
84
+ * @return {string} User id of the new user
85
+ */
86
+ createOidcUser(identity: OidcIdentity, memberRole: MemberRole): Promise<string>;
87
+ /**
88
+ * List users in the organization
89
+ * @return {UserIdInfo[]} List of users
90
+ */
91
+ users(): Promise<UserIdInfo[]>;
92
+ /** Get a key by id.
93
+ * @param {string} keyId The id of the key to get.
94
+ * @return {Key} The key.
95
+ * */
96
+ getKey(keyId: string): Promise<Key>;
97
+ /** Get all keys in the org.
98
+ * @param {KeyType?} type Optional key type to filter list for.
99
+ * @return {Key} The key.
100
+ * */
101
+ keys(type?: KeyType): Promise<Key[]>;
102
+ /** Create a new role.
103
+ * @param {string?} name The name of the role.
104
+ * @return {Role} The new role.
105
+ * */
106
+ createRole(name?: string): Promise<Role>;
107
+ /** Get a role by id or name.
108
+ * @param {string} roleId The id or name of the role to get.
109
+ * @return {Role} The role.
110
+ * */
111
+ getRole(roleId: string): Promise<Role>;
112
+ /** List all roles in the org..
113
+ * @return {Role[]} The roles.
114
+ * */
115
+ list(): Promise<Role[]>;
116
+ /**
117
+ * Get a pending MFA request by its id.
118
+ * @param {string} mfaId The id of the MFA request.
119
+ * @return {Promise<MfaRequestInfo>} The MFA request.
120
+ */
121
+ mfaGet(mfaId: string): Promise<MfaRequestInfo>;
122
+ /**
123
+ * Approve a pending MFA request.
124
+ *
125
+ * @param {string} mfaId The id of the MFA request.
126
+ * @return {Promise<MfaRequestInfo>} The MFA request.
127
+ */
128
+ mfaApprove(mfaId: string): Promise<MfaRequestInfo>;
129
+ /** Create a new org.
130
+ * @param {CubeSigner} cs The CubeSigner instance.
131
+ * @param {OrgInfo} data The JSON response from the API server.
132
+ * @internal
133
+ * */
134
+ constructor(cs: CubeSigner, data: OrgInfo);
135
+ /**
136
+ * Approve a pending MFA request.
137
+ *
138
+ * @param {CubeSigner} cs The CubeSigner instance to use for requests
139
+ * @param {string} orgId The org id of the MFA request
140
+ * @param {string} mfaId The id of the MFA request
141
+ * @return {Promise<MfaRequestInfo>} The result of the MFA request
142
+ */
143
+ static mfaApprove(cs: CubeSigner, orgId: string, mfaId: string): Promise<MfaRequestInfo>;
144
+ /** Fetch org info.
145
+ * @return {OrgInfo} The org info.
146
+ * */
147
+ private fetch;
148
+ /** Update the org.
149
+ * @param {UpdateOrgRequest} request The JSON request to send to the API server.
150
+ * @return {UpdateOrgResponse} The JSON response from the API server.
151
+ * */
152
+ private update;
153
+ /** List roles.
154
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
155
+ * @param {string} orgId The id of the organization to which the role belongs.
156
+ * @return {Role} The role.
157
+ * @internal
158
+ * */
159
+ private static roles;
160
+ }
161
+ export {};
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
+ if (kind === "m") throw new TypeError("Private method is not writable");
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
+ };
13
+ var _Org_cs, _Org_id;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.Org = void 0;
16
+ const util_1 = require("./util");
17
+ const key_1 = require("./key");
18
+ const role_1 = require("./role");
19
+ /** An organization. */
20
+ class Org {
21
+ /**
22
+ * @description The org id
23
+ * @example Org#c3b9379c-4e8c-4216-bd0a-65ace53cf98f
24
+ * */
25
+ get id() {
26
+ return __classPrivateFieldGet(this, _Org_id, "f");
27
+ }
28
+ /** Human-readable name for the org */
29
+ async name() {
30
+ const data = await this.fetch();
31
+ return data.name ?? undefined;
32
+ }
33
+ /** Set the human-readable name for the org.
34
+ * @param {string} name The new human-readable name for the org (must be alphanumeric).
35
+ * @example my_org_name
36
+ * */
37
+ async setName(name) {
38
+ if (!/^[a-zA-Z0-9_]{3,30}$/.test(name)) {
39
+ throw new Error("Org name must be alphanumeric and between 3 and 30 characters");
40
+ }
41
+ await this.update({ name });
42
+ }
43
+ /** Is the org enabled? */
44
+ async enabled() {
45
+ const data = await this.fetch();
46
+ return data.enabled;
47
+ }
48
+ /** Enable the org. */
49
+ async enable() {
50
+ await this.update({ enabled: true });
51
+ }
52
+ /** Disable the org. */
53
+ async disable() {
54
+ await this.update({ enabled: false });
55
+ }
56
+ /** Get the policy for the org. */
57
+ async policy() {
58
+ const data = await this.fetch();
59
+ return (data.policy ?? []);
60
+ }
61
+ /** Set the policy for the org.
62
+ * @param {OrgPolicy[]} policy The new policy for the org.
63
+ * */
64
+ async setPolicy(policy) {
65
+ const p = policy;
66
+ await this.update({ policy: p });
67
+ }
68
+ /** Create a new signing key.
69
+ * @param {KeyType} type The type of key to create.
70
+ * @param {string?} ownerId The owner of the key. Defaults to the session's user.
71
+ * @return {Key[]} The new keys.
72
+ * */
73
+ async createKey(type, ownerId) {
74
+ return (await key_1.Key.createKeys(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, type, 1, ownerId))[0];
75
+ }
76
+ /** Create new signing keys.
77
+ * @param {KeyType} type The type of key to create.
78
+ * @param {nummber} count The number of keys to create.
79
+ * @param {string?} ownerId The owner of the keys. Defaults to the session's user.
80
+ * @return {Key[]} The new keys.
81
+ * */
82
+ async createKeys(type, count, ownerId) {
83
+ return key_1.Key.createKeys(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, type, count, ownerId);
84
+ }
85
+ /**
86
+ * Create a new user in the organization and sends an invitation to that user
87
+ * @param {string} email Email of the user
88
+ * @param {string} name The full name of the user
89
+ */
90
+ async createUser(email, name) {
91
+ const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).post("/v0/org/{org_id}/invite", {
92
+ params: { path: { org_id: this.id } },
93
+ body: {
94
+ email,
95
+ name,
96
+ skip_email: false,
97
+ },
98
+ parseAs: "json",
99
+ });
100
+ (0, util_1.assertOk)(resp);
101
+ }
102
+ /**
103
+ * Create a new OIDC user
104
+ * @param {OidcIdentity} identity The identity of the OIDC user
105
+ * @param {MemberRole} memberRole The type of membership of the new user
106
+ * @return {string} User id of the new user
107
+ */
108
+ async createOidcUser(identity, memberRole) {
109
+ const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).post("/v0/org/{org_id}/users", {
110
+ params: { path: { org_id: this.id } },
111
+ body: {
112
+ identity,
113
+ role: memberRole,
114
+ },
115
+ parseAs: "json",
116
+ });
117
+ return (0, util_1.assertOk)(resp).user_id;
118
+ }
119
+ /**
120
+ * List users in the organization
121
+ * @return {UserIdInfo[]} List of users
122
+ */
123
+ async users() {
124
+ const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).get("/v0/org/{org_id}/users", {
125
+ params: { path: { org_id: this.id } },
126
+ parseAs: "json",
127
+ });
128
+ return (0, util_1.assertOk)(resp).users;
129
+ }
130
+ /** Get a key by id.
131
+ * @param {string} keyId The id of the key to get.
132
+ * @return {Key} The key.
133
+ * */
134
+ async getKey(keyId) {
135
+ return await key_1.Key.getKey(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, keyId);
136
+ }
137
+ /** Get all keys in the org.
138
+ * @param {KeyType?} type Optional key type to filter list for.
139
+ * @return {Key} The key.
140
+ * */
141
+ async keys(type) {
142
+ const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).get("/v0/org/{org_id}/keys", {
143
+ params: {
144
+ path: { org_id: this.id },
145
+ query: type ? { key_type: type } : undefined,
146
+ },
147
+ parseAs: "json",
148
+ });
149
+ const data = (0, util_1.assertOk)(resp);
150
+ return data.keys.map((k) => new key_1.Key(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, k));
151
+ }
152
+ /** Create a new role.
153
+ * @param {string?} name The name of the role.
154
+ * @return {Role} The new role.
155
+ * */
156
+ async createRole(name) {
157
+ return role_1.Role.createRole(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, name);
158
+ }
159
+ /** Get a role by id or name.
160
+ * @param {string} roleId The id or name of the role to get.
161
+ * @return {Role} The role.
162
+ * */
163
+ async getRole(roleId) {
164
+ return role_1.Role.getRole(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, roleId);
165
+ }
166
+ /** List all roles in the org..
167
+ * @return {Role[]} The roles.
168
+ * */
169
+ async list() {
170
+ return Org.roles(__classPrivateFieldGet(this, _Org_cs, "f"), this.id);
171
+ }
172
+ /**
173
+ * Get a pending MFA request by its id.
174
+ * @param {string} mfaId The id of the MFA request.
175
+ * @return {Promise<MfaRequestInfo>} The MFA request.
176
+ */
177
+ async mfaGet(mfaId) {
178
+ const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).get("/v0/org/{org_id}/mfa/{mfa_id}", {
179
+ params: { path: { org_id: __classPrivateFieldGet(this, _Org_id, "f"), mfa_id: mfaId } },
180
+ });
181
+ return (0, util_1.assertOk)(resp);
182
+ }
183
+ /**
184
+ * Approve a pending MFA request.
185
+ *
186
+ * @param {string} mfaId The id of the MFA request.
187
+ * @return {Promise<MfaRequestInfo>} The MFA request.
188
+ */
189
+ async mfaApprove(mfaId) {
190
+ return Org.mfaApprove(__classPrivateFieldGet(this, _Org_cs, "f"), __classPrivateFieldGet(this, _Org_id, "f"), mfaId);
191
+ }
192
+ // --------------------------------------------------------------------------
193
+ // -- INTERNAL --------------------------------------------------------------
194
+ // --------------------------------------------------------------------------
195
+ /** Create a new org.
196
+ * @param {CubeSigner} cs The CubeSigner instance.
197
+ * @param {OrgInfo} data The JSON response from the API server.
198
+ * @internal
199
+ * */
200
+ constructor(cs, data) {
201
+ _Org_cs.set(this, void 0);
202
+ /**
203
+ * The ID of the organization.
204
+ * @example Org#124dfe3e-3bbd-487d-80c0-53c55e8ab87a
205
+ */
206
+ _Org_id.set(this, void 0);
207
+ __classPrivateFieldSet(this, _Org_cs, cs, "f");
208
+ __classPrivateFieldSet(this, _Org_id, data.org_id, "f");
209
+ }
210
+ /**
211
+ * Approve a pending MFA request.
212
+ *
213
+ * @param {CubeSigner} cs The CubeSigner instance to use for requests
214
+ * @param {string} orgId The org id of the MFA request
215
+ * @param {string} mfaId The id of the MFA request
216
+ * @return {Promise<MfaRequestInfo>} The result of the MFA request
217
+ */
218
+ static async mfaApprove(cs, orgId, mfaId) {
219
+ const resp = await (await cs.management()).patch("/v0/org/{org_id}/mfa/{mfa_id}", {
220
+ params: { path: { org_id: orgId, mfa_id: mfaId } },
221
+ });
222
+ return (0, util_1.assertOk)(resp);
223
+ }
224
+ /** Fetch org info.
225
+ * @return {OrgInfo} The org info.
226
+ * */
227
+ async fetch() {
228
+ const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).get("/v0/org/{org_id}", {
229
+ params: { path: { org_id: this.id } },
230
+ parseAs: "json",
231
+ });
232
+ const data = (0, util_1.assertOk)(resp);
233
+ return data;
234
+ }
235
+ /** Update the org.
236
+ * @param {UpdateOrgRequest} request The JSON request to send to the API server.
237
+ * @return {UpdateOrgResponse} The JSON response from the API server.
238
+ * */
239
+ async update(request) {
240
+ const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).patch("/v0/org/{org_id}", {
241
+ params: { path: { org_id: this.id } },
242
+ body: request,
243
+ parseAs: "json",
244
+ });
245
+ return (0, util_1.assertOk)(resp);
246
+ }
247
+ /** List roles.
248
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
249
+ * @param {string} orgId The id of the organization to which the role belongs.
250
+ * @return {Role} The role.
251
+ * @internal
252
+ * */
253
+ static async roles(cs, orgId) {
254
+ const resp = await (await cs.management()).get("/v0/org/{org_id}/roles", {
255
+ params: { path: { org_id: orgId } },
256
+ parseAs: "json",
257
+ });
258
+ const data = (0, util_1.assertOk)(resp);
259
+ return data.roles.map((r) => new role_1.Role(cs, orgId, r));
260
+ }
261
+ }
262
+ exports.Org = Org;
263
+ _Org_cs = new WeakMap(), _Org_id = new WeakMap();
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29yZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFFQSxpQ0FBa0M7QUFDbEMsK0JBQXFDO0FBQ3JDLGlDQUF3QztBQTBDeEMsdUJBQXVCO0FBQ3ZCLE1BQWEsR0FBRztJQVFkOzs7U0FHSztJQUNMLElBQUksRUFBRTtRQUNKLE9BQU8sdUJBQUEsSUFBSSxlQUFJLENBQUM7SUFDbEIsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7U0FHSztJQUNMLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBWTtRQUN4QixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQztTQUNsRjtRQUNELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9B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LENBQUMsS0FBSyxDQUFDLEVBQWMsRUFBRSxLQUFhO1FBQ3RELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FDakIsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQ3RCLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFO1lBQzlCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNuQyxPQUFPLEVBQUUsTUFBTTtTQUNoQixDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxJQUFBLGVBQVEsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNGO0FBN1JELGtCQTZSQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1YmVTaWduZXIsIEtleUluZm8sIE1mYVJlcXVlc3RJbmZvIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGNvbXBvbmVudHMsIHBhdGhzIH0gZnJvbSBcIi4vY2xpZW50XCI7XG5pbXBvcnQgeyBhc3NlcnRPayB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IEtleVR5cGUsIEtleSB9IGZyb20gXCIuL2tleVwiO1xuaW1wb3J0IHsgUm9sZSwgUm9sZUluZm8gfSBmcm9tIFwiLi9yb2xlXCI7XG5cbi8qKiBPcmdhbml6YXRpb24gaWQgKi9cbmV4cG9ydCB0eXBlIE9yZ0lkID0gc3RyaW5nO1xuXG4vKiogT3JnLXdpZGUgcG9saWN5ICovXG5leHBvcnQgdHlwZSBPcmdQb2xpY3kgPSBTb3VyY2VJcEFsbG93bGlzdFBvbGljeSB8IE9yaWdpbkFsbG93bGlzdFBvbGljeSB8IE1heERhaWx5VW5zdGFrZVBvbGljeTtcblxuLyoqXG4gKiBPbmx5IGFsbG93IHJlcXVlc3RzIGZyb20gdGhlIHNwZWNpZmllZCBvcmlnaW5zLlxuICogQGV4YW1wbGUge1wiT3JpZ2luQWxsb3dsaXN0XCI6IFwiKlwifVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbkFsbG93bGlzdFBvbGljeSB7XG4gIE9yaWdpbkFsbG93bGlzdDogc3RyaW5nW10gfCBcIipcIjtcbn1cblxuLyoqXG4gKiBSZXN0cmljdCBzaWduaW5nIHRvIHNwZWNpZmljIHNvdXJjZSBJUCBhZGRyZXNzZXMuXG4gKiBAZXhhbXBsZSB7XCJTb3VyY2VJcEFsbG93bGlzdFwiOiBbXCIxMC4xLjIuMy84XCIsIFwiMTY5LjI1NC4xNy4xLzE2XCJdfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZUlwQWxsb3dsaXN0UG9saWN5IHtcbiAgU291cmNlSXBBbGxvd2xpc3Q6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFJlc3RyaWN0IHRoZSBudW1iZXIgb2YgdW5zdGFrZXMgcGVyIGRheS5cbiAqIEBleGFtcGxlIHtcIk1heERhaWx5VW5zdGFrZVwiOiA1IH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXhEYWlseVVuc3Rha2VQb2xpY3kge1xuICBNYXhEYWlseVVuc3Rha2U6IG51bWJlcjtcbn1cblxudHlwZSBPcmdJbmZvID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJPcmdJbmZvXCJdO1xudHlwZSBVc2VySWRJbmZvID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJVc2VySWRJbmZvXCJdO1xudHlwZSBVcGRhdGVPcmdSZXF1ZXN0ID1cbiAgcGF0aHNbXCIvdjAvb3JnL3tvcmdfaWR9XCJdW1wicGF0Y2hcIl1bXCJyZXF1ZXN0Qm9keVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xudHlwZSBVcGRhdGVPcmdSZXNwb25zZSA9XG4gIHBhdGhzW1wiL3YwL29yZy97b3JnX2lkfVwiXVtcInBhdGNoXCJdW1wicmVzcG9uc2VzXCJdW1wiMjAwXCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5cbmV4cG9ydCB0eXBlIE9pZGNJZGVudGl0eSA9IGNvbXBvbmVudHNbXCJzY2hlbWFzXCJdW1wiT0lEQ0lkZW50aXR5XCJdO1xuZXhwb3J0IHR5cGUgTWVtYmVyUm9sZSA9IGNvbXBvbmVudHNbXCJzY2hlbWFzXCJdW1wiTWVtYmVyUm9sZVwiXTtcblxuLyoqIEFuIG9yZ2FuaXphdGlvbi4gKi9cbmV4cG9ydCBjbGFzcyBPcmcge1xuICByZWFkb25seSAjY3M6IEN1YmVTaWduZXI7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIG9yZ2FuaXphdGlvbi5cbiAgICogQGV4YW1wbGUgT3JnIzEyNGRmZTNlLTNiYmQtNDg3ZC04MGMwLTUzYzU1ZThhYjg3YVxuICAgKi9cbiAgcmVhZG9ubHkgI2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgb3JnIGlkXG4gICAqIEBleGFtcGxlIE9yZyNjM2I5Mzc5Yy00ZThjLTQyMTYtYmQwYS02NWFjZTUzY2Y5OGZcbiAgICogKi9cbiAgZ2V0IGlkKCk6IE9yZ0lkIHtcbiAgICByZXR1cm4gdGhpcy4jaWQ7XG4gIH1cblxuICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIG9yZyAqL1xuICBhc3luYyBuYW1lKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZmV0Y2goKTtcbiAgICByZXR1cm4gZGF0YS5uYW1lID8/IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoZSBvcmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuZXcgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIG9yZyAobXVzdCBiZSBhbHBoYW51bWVyaWMpLlxuICAgKiBAZXhhbXBsZSBteV9vcmdfbmFtZVxuICAgKiAqL1xuICBhc3luYyBzZXROYW1lKG5hbWU6IHN0cmluZykge1xuICAgIGlmICghL15bYS16QS1aMC05X117MywzMH0kLy50ZXN0KG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPcmcgbmFtZSBtdXN0IGJlIGFscGhhbnVtZXJpYyBhbmQgYmV0d2VlbiAzIGFuZCAzMCBjaGFyYWN0ZXJzXCIpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnVwZGF0ZSh7IG5hbWUgfSk7XG4gIH1cblxuICAvKiogSXMgdGhlIG9yZyBlbmFibGVkPyAqL1xuICBhc3luYyBlbmFibGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZldGNoKCk7XG4gICAgcmV0dXJuIGRhdGEuZW5hYmxlZDtcbiAgfVxuXG4gIC8qKiBFbmFibGUgdGhlIG9yZy4gKi9cbiAgYXN5bmMgZW5hYmxlKCkge1xuICAgIGF3YWl0IHRoaXMudXBkYXRlKHsgZW5hYmxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBEaXNhYmxlIHRoZSBvcmcuICovXG4gIGFzeW5jIGRpc2FibGUoKSB7XG4gICAgYXdhaXQgdGhpcy51cGRhdGUoeyBlbmFibGVkOiBmYWxzZSB9KTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHBvbGljeSBmb3IgdGhlIG9yZy4gKi9cbiAgYXN5bmMgcG9saWN5KCk6IFByb21pc2U8T3JnUG9saWN5W10+IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5mZXRjaCgpO1xuICAgIHJldHVybiAoZGF0YS5wb2xpY3kgPz8gW10pIGFzIHVua25vd24gYXMgT3JnUG9saWN5W107XG4gIH1cblxuICAvKiogU2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBvcmcuXG4gICAqIEBwYXJhbSB7T3JnUG9saWN5W119IHBvbGljeSBUaGUgbmV3IHBvbGljeSBmb3IgdGhlIG9yZy5cbiAgICogKi9cbiAgYXN5bmMgc2V0UG9saWN5KHBvbGljeTogT3JnUG9saWN5W10pIHtcbiAgICBjb25zdCBwID0gcG9saWN5IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgbmV2ZXI+W107XG4gICAgYXdhaXQgdGhpcy51cGRhdGUoeyBwb2xpY3k6IHAgfSk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbmV3IHNpZ25pbmcga2V5LlxuICAgKiBAcGFyYW0ge0tleVR5cGV9IHR5cGUgVGhlIHR5cGUgb2Yga2V5IHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmc/fSBvd25lcklkIFRoZSBvd25lciBvZiB0aGUga2V5LiBEZWZhdWx0cyB0byB0aGUgc2Vzc2lvbidzIHVzZXIuXG4gICAqIEByZXR1cm4ge0tleVtdfSBUaGUgbmV3IGtleXMuXG4gICAqICovXG4gIGFzeW5jIGNyZWF0ZUtleSh0eXBlOiBLZXlUeXBlLCBvd25lcklkPzogc3RyaW5nKTogUHJvbWlzZTxLZXk+IHtcbiAgICByZXR1cm4gKGF3YWl0IEtleS5jcmVhdGVLZXlzKHRoaXMuI2NzLCB0aGlzLmlkLCB0eXBlLCAxLCBvd25lcklkKSlbMF07XG4gIH1cblxuICAvKiogQ3JlYXRlIG5ldyBzaWduaW5nIGtleXMuXG4gICAqIEBwYXJhbSB7S2V5VHlwZX0gdHlwZSBUaGUgdHlwZSBvZiBrZXkgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0ge251bW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2Yga2V5cyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nP30gb3duZXJJZCBUaGUgb3duZXIgb2YgdGhlIGtleXMuIERlZmF1bHRzIHRvIHRoZSBzZXNzaW9uJ3MgdXNlci5cbiAgICogQHJldHVybiB7S2V5W119IFRoZSBuZXcga2V5cy5cbiAgICogKi9cbiAgYXN5bmMgY3JlYXRlS2V5cyh0eXBlOiBLZXlUeXBlLCBjb3VudDogbnVtYmVyLCBvd25lcklkPzogc3RyaW5nKTogUHJvbWlzZTxLZXlbXT4ge1xuICAgIHJldHVybiBLZXkuY3JlYXRlS2V5cyh0aGlzLiNjcywgdGhpcy5pZCwgdHlwZSwgY291bnQsIG93bmVySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB1c2VyIGluIHRoZSBvcmdhbml6YXRpb24gYW5kIHNlbmRzIGFuIGludml0YXRpb24gdG8gdGhhdCB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbCBFbWFpbCBvZiB0aGUgdXNlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVsbCBuYW1lIG9mIHRoZSB1c2VyXG4gICAqL1xuICBhc3luYyBjcmVhdGVVc2VyKGVtYWlsOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLiNjcy5tYW5hZ2VtZW50KClcbiAgICApLnBvc3QoXCIvdjAvb3JnL3tvcmdfaWR9L2ludml0ZVwiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMuaWQgfSB9LFxuICAgICAgYm9keToge1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc2tpcF9lbWFpbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgYXNzZXJ0T2socmVzcCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IE9JREMgdXNlclxuICAgKiBAcGFyYW0ge09pZGNJZGVudGl0eX0gaWRlbnRpdHkgVGhlIGlkZW50aXR5IG9mIHRoZSBPSURDIHVzZXJcbiAgICogQHBhcmFtIHtNZW1iZXJSb2xlfSBtZW1iZXJSb2xlIFRoZSB0eXBlIG9mIG1lbWJlcnNoaXAgb2YgdGhlIG5ldyB1c2VyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVXNlciBpZCBvZiB0aGUgbmV3IHVzZXJcbiAgICovXG4gIGFzeW5jIGNyZWF0ZU9pZGNVc2VyKGlkZW50aXR5OiBPaWRjSWRlbnRpdHksIG1lbWJlclJvbGU6IE1lbWJlclJvbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLiNjcy5tYW5hZ2VtZW50KClcbiAgICApLnBvc3QoXCIvdjAvb3JnL3tvcmdfaWR9L3VzZXJzXCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy5pZCB9IH0sXG4gICAgICBib2R5OiB7XG4gICAgICAgIGlkZW50aXR5LFxuICAgICAgICByb2xlOiBtZW1iZXJSb2xlLFxuICAgICAgfSxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIHJldHVybiBhc3NlcnRPayhyZXNwKS51c2VyX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdXNlcnMgaW4gdGhlIG9yZ2FuaXphdGlvblxuICAgKiBAcmV0dXJuIHtVc2VySWRJbmZvW119IExpc3Qgb2YgdXNlcnNcbiAgICovXG4gIGFzeW5jIHVzZXJzKCk6IFByb21pc2U8VXNlcklkSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgIGF3YWl0IHRoaXMuI2NzLm1hbmFnZW1lbnQoKVxuICAgICkuZ2V0KFwiL3YwL29yZy97b3JnX2lkfS91c2Vyc1wiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMuaWQgfSB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIGFzc2VydE9rKHJlc3ApLnVzZXJzO1xuICB9XG5cbiAgLyoqIEdldCBhIGtleSBieSBpZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleUlkIFRoZSBpZCBvZiB0aGUga2V5IHRvIGdldC5cbiAgICogQHJldHVybiB7S2V5fSBUaGUga2V5LlxuICAgKiAqL1xuICBhc3luYyBnZXRLZXkoa2V5SWQ6IHN0cmluZyk6IFByb21pc2U8S2V5PiB7XG4gICAgcmV0dXJuIGF3YWl0IEtleS5nZXRLZXkodGhpcy4jY3MsIHRoaXMuaWQsIGtleUlkKTtcbiAgfVxuXG4gIC8qKiBHZXQgYWxsIGtleXMgaW4gdGhlIG9yZy5cbiAgICogQHBhcmFtIHtLZXlUeXBlP30gdHlwZSBPcHRpb25hbCBrZXkgdHlwZSB0byBmaWx0ZXIgbGlzdCBmb3IuXG4gICAqIEByZXR1cm4ge0tleX0gVGhlIGtleS5cbiAgICogKi9cbiAgYXN5bmMga2V5cyh0eXBlPzogS2V5VHlwZSk6IFByb21pc2U8S2V5W10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgYXdhaXQgdGhpcy4jY3MubWFuYWdlbWVudCgpXG4gICAgKS5nZXQoXCIvdjAvb3JnL3tvcmdfaWR9L2tleXNcIiwge1xuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIHBhdGg6IHsgb3JnX2lkOiB0aGlzLmlkIH0sXG4gICAgICAgIHF1ZXJ5OiB0eXBlID8geyBrZXlfdHlwZTogdHlwZSB9IDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhc3NlcnRPayhyZXNwKTtcbiAgICByZXR1cm4gZGF0YS5rZXlzLm1hcCgoazogS2V5SW5mbykgPT4gbmV3IEtleSh0aGlzLiNjcywgdGhpcy5pZCwgaykpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyByb2xlLlxuICAgKiBAcGFyYW0ge3N0cmluZz99IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHJvbGUuXG4gICAqIEByZXR1cm4ge1JvbGV9IFRoZSBuZXcgcm9sZS5cbiAgICogKi9cbiAgYXN5bmMgY3JlYXRlUm9sZShuYW1lPzogc3RyaW5nKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgcmV0dXJuIFJvbGUuY3JlYXRlUm9sZSh0aGlzLiNjcywgdGhpcy5pZCwgbmFtZSk7XG4gIH1cblxuICAvKiogR2V0IGEgcm9sZSBieSBpZCBvciBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZUlkIFRoZSBpZCBvciBuYW1lIG9mIHRoZSByb2xlIHRvIGdldC5cbiAgICogQHJldHVybiB7Um9sZX0gVGhlIHJvbGUuXG4gICAqICovXG4gIGFzeW5jIGdldFJvbGUocm9sZUlkOiBzdHJpbmcpOiBQcm9taXNlPFJvbGU+IHtcbiAgICByZXR1cm4gUm9sZS5nZXRSb2xlKHRoaXMuI2NzLCB0aGlzLmlkLCByb2xlSWQpO1xuICB9XG5cbiAgLyoqIExpc3QgYWxsIHJvbGVzIGluIHRoZSBvcmcuLlxuICAgKiBAcmV0dXJuIHtSb2xlW119IFRoZSByb2xlcy5cbiAgICogKi9cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFJvbGVbXT4ge1xuICAgIHJldHVybiBPcmcucm9sZXModGhpcy4jY3MsIHRoaXMuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHBlbmRpbmcgTUZBIHJlcXVlc3QgYnkgaXRzIGlkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWZhSWQgVGhlIGlkIG9mIHRoZSBNRkEgcmVxdWVzdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNZmFSZXF1ZXN0SW5mbz59IFRoZSBNRkEgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIG1mYUdldChtZmFJZDogc3RyaW5nKTogUHJvbWlzZTxNZmFSZXF1ZXN0SW5mbz4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLiNjcy5tYW5hZ2VtZW50KClcbiAgICApLmdldChcIi92MC9vcmcve29yZ19pZH0vbWZhL3ttZmFfaWR9XCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy4jaWQsIG1mYV9pZDogbWZhSWQgfSB9LFxuICAgIH0pO1xuICAgIHJldHVybiBhc3NlcnRPayhyZXNwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlIGEgcGVuZGluZyBNRkEgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1mYUlkIFRoZSBpZCBvZiB0aGUgTUZBIHJlcXVlc3QuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TWZhUmVxdWVzdEluZm8+fSBUaGUgTUZBIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBtZmFBcHByb3ZlKG1mYUlkOiBzdHJpbmcpOiBQcm9taXNlPE1mYVJlcXVlc3RJbmZvPiB7XG4gICAgcmV0dXJuIE9yZy5tZmFBcHByb3ZlKHRoaXMuI2NzLCB0aGlzLiNpZCwgbWZhSWQpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0gSU5URVJOQUwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiogQ3JlYXRlIGEgbmV3IG9yZy5cbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBUaGUgQ3ViZVNpZ25lciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtPcmdJbmZvfSBkYXRhIFRoZSBKU09OIHJlc3BvbnNlIGZyb20gdGhlIEFQSSBzZXJ2ZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKiAqL1xuICBjb25zdHJ1Y3RvcihjczogQ3ViZVNpZ25lciwgZGF0YTogT3JnSW5mbykge1xuICAgIHRoaXMuI2NzID0gY3M7XG4gICAgdGhpcy4jaWQgPSBkYXRhLm9yZ19pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlIGEgcGVuZGluZyBNRkEgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBUaGUgQ3ViZVNpZ25lciBpbnN0YW5jZSB0byB1c2UgZm9yIHJlcXVlc3RzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmdJZCBUaGUgb3JnIGlkIG9mIHRoZSBNRkEgcmVxdWVzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWZhSWQgVGhlIGlkIG9mIHRoZSBNRkEgcmVxdWVzdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1mYVJlcXVlc3RJbmZvPn0gVGhlIHJlc3VsdCBvZiB0aGUgTUZBIHJlcXVlc3RcbiAgICovXG4gIHN0YXRpYyBhc3luYyBtZmFBcHByb3ZlKGNzOiBDdWJlU2lnbmVyLCBvcmdJZDogc3RyaW5nLCBtZmFJZDogc3RyaW5nKTogUHJvbWlzZTxNZmFSZXF1ZXN0SW5mbz4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCBjcy5tYW5hZ2VtZW50KClcbiAgICApLnBhdGNoKFwiL3YwL29yZy97b3JnX2lkfS9tZmEve21mYV9pZH1cIiwge1xuICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiBvcmdJZCwgbWZhX2lkOiBtZmFJZCB9IH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGFzc2VydE9rKHJlc3ApO1xuICB9XG5cbiAgLyoqIEZldGNoIG9yZyBpbmZvLlxuICAgKiBAcmV0dXJuIHtPcmdJbmZvfSBUaGUgb3JnIGluZm8uXG4gICAqICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2goKTogUHJvbWlzZTxPcmdJbmZvPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgIGF3YWl0IHRoaXMuI2NzLm1hbmFnZW1lbnQoKVxuICAgICkuZ2V0KFwiL3YwL29yZy97b3JnX2lkfVwiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMuaWQgfSB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGFzc2VydE9rKHJlc3ApO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqIFVwZGF0ZSB0aGUgb3JnLlxuICAgKiBAcGFyYW0ge1VwZGF0ZU9yZ1JlcXVlc3R9IHJlcXVlc3QgVGhlIEpTT04gcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBBUEkgc2VydmVyLlxuICAgKiBAcmV0dXJuIHtVcGRhdGVPcmdSZXNwb25zZX0gVGhlIEpTT04gcmVzcG9uc2UgZnJvbSB0aGUgQVBJIHNlcnZlci5cbiAgICogKi9cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGUocmVxdWVzdDogVXBkYXRlT3JnUmVxdWVzdCk6IFByb21pc2U8VXBkYXRlT3JnUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgYXdhaXQgdGhpcy4jY3MubWFuYWdlbWVudCgpXG4gICAgKS5wYXRjaChcIi92MC9vcmcve29yZ19pZH1cIiwge1xuICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiB0aGlzLmlkIH0gfSxcbiAgICAgIGJvZHk6IHJlcXVlc3QsXG4gICAgICBwYXJzZUFzOiBcImpzb25cIixcbiAgICB9KTtcbiAgICByZXR1cm4gYXNzZXJ0T2socmVzcCk7XG4gIH1cblxuICAvKiogTGlzdCByb2xlcy5cbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBUaGUgQ3ViZVNpZ25lciBpbnN0YW5jZSB0byB1c2UgZm9yIHNpZ25pbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmdJZCBUaGUgaWQgb2YgdGhlIG9yZ2FuaXphdGlvbiB0byB3aGljaCB0aGUgcm9sZSBiZWxvbmdzLlxuICAgKiBAcmV0dXJuIHtSb2xlfSBUaGUgcm9sZS5cbiAgICogQGludGVybmFsXG4gICAqICovXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIHJvbGVzKGNzOiBDdWJlU2lnbmVyLCBvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxSb2xlW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgYXdhaXQgY3MubWFuYWdlbWVudCgpXG4gICAgKS5nZXQoXCIvdjAvb3JnL3tvcmdfaWR9L3JvbGVzXCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogb3JnSWQgfSB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGFzc2VydE9rKHJlc3ApO1xuICAgIHJldHVybiBkYXRhLnJvbGVzLm1hcCgocjogUm9sZUluZm8pID0+IG5ldyBSb2xlKGNzLCBvcmdJZCwgcikpO1xuICB9XG59XG4iXX0=