@cubist-labs/cubesigner-sdk 0.2.28 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -28
- package/dist/cjs/package.json +41 -0
- package/dist/cjs/spec/env/beta.json +9 -0
- package/dist/cjs/spec/env/gamma.json +9 -0
- package/dist/cjs/spec/env/prod.json +9 -0
- package/dist/cjs/src/api.d.ts +652 -0
- package/dist/cjs/src/api.js +1345 -0
- package/dist/cjs/src/client.d.ts +642 -0
- package/dist/cjs/src/client.js +455 -0
- package/dist/cjs/src/env.d.ts +15 -0
- package/dist/cjs/src/env.js +35 -0
- package/dist/cjs/src/error.d.ts +32 -0
- package/dist/cjs/src/error.js +37 -0
- package/dist/cjs/src/events.d.ts +84 -0
- package/dist/cjs/src/events.js +195 -0
- package/dist/cjs/src/index.d.ts +203 -0
- package/dist/cjs/src/index.js +298 -0
- package/dist/cjs/src/key.d.ts +169 -0
- package/dist/cjs/src/key.js +262 -0
- package/dist/{src/fido.d.ts → cjs/src/mfa.d.ts} +38 -17
- package/dist/cjs/src/mfa.js +172 -0
- package/dist/cjs/src/org.d.ts +99 -0
- package/dist/cjs/src/org.js +95 -0
- package/dist/cjs/src/paginator.d.ts +76 -0
- package/dist/cjs/src/paginator.js +99 -0
- package/dist/cjs/src/response.d.ts +114 -0
- package/dist/cjs/src/response.js +203 -0
- package/dist/cjs/src/role.d.ts +289 -0
- package/dist/cjs/src/role.js +261 -0
- package/dist/cjs/src/schema.d.ts +6404 -0
- package/dist/cjs/src/schema.js +7 -0
- package/dist/cjs/src/schema_types.d.ts +116 -0
- package/dist/cjs/src/schema_types.js +3 -0
- package/dist/cjs/src/session/session_storage.d.ts +27 -0
- package/dist/cjs/src/session/session_storage.js +47 -0
- package/dist/cjs/src/session/signer_session_manager.d.ts +125 -0
- package/dist/cjs/src/session/signer_session_manager.js +239 -0
- package/dist/cjs/src/signer_session.d.ts +41 -0
- package/dist/cjs/src/signer_session.js +77 -0
- package/dist/cjs/src/user_export.d.ts +52 -0
- package/dist/cjs/src/user_export.js +129 -0
- package/dist/cjs/src/util.d.ts +56 -0
- package/dist/cjs/src/util.js +87 -0
- package/dist/esm/package.json +41 -0
- package/dist/esm/spec/env/beta.json +9 -0
- package/dist/esm/spec/env/gamma.json +9 -0
- package/dist/esm/spec/env/prod.json +9 -0
- package/dist/esm/src/api.d.ts +652 -0
- package/dist/esm/src/api.js +1335 -0
- package/dist/esm/src/client.d.ts +642 -0
- package/dist/esm/src/client.js +451 -0
- package/dist/esm/src/env.d.ts +15 -0
- package/dist/esm/src/env.js +9 -0
- package/dist/esm/src/error.d.ts +32 -0
- package/dist/esm/src/error.js +32 -0
- package/dist/esm/src/events.d.ts +84 -0
- package/dist/esm/src/events.js +189 -0
- package/dist/esm/src/index.d.ts +203 -0
- package/dist/esm/src/index.js +276 -0
- package/dist/esm/src/key.d.ts +169 -0
- package/dist/esm/src/key.js +256 -0
- package/dist/esm/src/mfa.d.ts +97 -0
- package/dist/esm/src/mfa.js +166 -0
- package/dist/esm/src/org.d.ts +99 -0
- package/dist/esm/src/org.js +91 -0
- package/dist/esm/src/paginator.d.ts +76 -0
- package/dist/esm/src/paginator.js +94 -0
- package/dist/esm/src/response.d.ts +114 -0
- package/dist/esm/src/response.js +198 -0
- package/dist/esm/src/role.d.ts +289 -0
- package/dist/esm/src/role.js +256 -0
- package/dist/esm/src/schema.d.ts +6404 -0
- package/dist/esm/src/schema.js +6 -0
- package/dist/esm/src/schema_types.d.ts +116 -0
- package/dist/esm/src/schema_types.js +2 -0
- package/dist/esm/src/session/session_storage.d.ts +27 -0
- package/dist/esm/src/session/session_storage.js +43 -0
- package/dist/esm/src/session/signer_session_manager.d.ts +125 -0
- package/dist/esm/src/session/signer_session_manager.js +235 -0
- package/dist/esm/src/signer_session.d.ts +41 -0
- package/dist/esm/src/signer_session.js +72 -0
- package/dist/esm/src/user_export.d.ts +52 -0
- package/dist/esm/src/user_export.js +99 -0
- package/dist/esm/src/util.d.ts +56 -0
- package/dist/esm/src/util.js +77 -0
- package/dist/package.json +13 -45
- package/dist/src/api.d.ts +29 -1
- package/dist/src/api.js +66 -1
- package/dist/src/client.d.ts +35 -14
- package/dist/src/client.js +12 -8
- package/dist/src/events.js +1 -1
- package/dist/src/index.d.ts +6 -11
- package/dist/src/index.js +9 -25
- package/dist/src/key.d.ts +18 -7
- package/dist/src/key.js +52 -19
- package/dist/src/role.d.ts +46 -3
- package/dist/src/role.js +60 -8
- package/dist/src/schema.d.ts +206 -72
- package/dist/src/schema.js +1 -1
- package/dist/src/schema_types.d.ts +3 -0
- package/dist/src/schema_types.js +1 -1
- package/dist/src/session/signer_session_manager.d.ts +38 -14
- package/dist/src/session/signer_session_manager.js +93 -33
- package/dist/src/util.d.ts +14 -0
- package/dist/src/util.js +24 -27
- package/package.json +19 -46
- package/src/api.ts +145 -19
- package/src/client.ts +106 -10
- package/src/error.ts +4 -0
- package/src/events.ts +2 -0
- package/src/index.ts +10 -24
- package/src/key.ts +67 -20
- package/src/mfa.ts +8 -4
- package/src/response.ts +50 -4
- package/src/role.ts +87 -7
- package/src/schema.ts +764 -152
- package/src/schema_types.ts +6 -0
- package/src/session/session_storage.ts +0 -32
- package/src/session/signer_session_manager.ts +126 -38
- package/src/util.ts +18 -10
- package/tsconfig.json +1 -21
- package/LICENSE-APACHE +0 -177
- package/LICENSE-MIT +0 -25
- package/NOTICE +0 -13
- package/dist/examples/ethers.d.ts +0 -1
- package/dist/examples/ethers.js +0 -142
- package/dist/src/ethers/index.d.ts +0 -95
- package/dist/src/ethers/index.js +0 -215
- package/dist/src/fido.js +0 -148
- package/dist/src/session/cognito_manager.d.ts +0 -71
- package/dist/src/session/cognito_manager.js +0 -129
- package/dist/src/session/generic.d.ts +0 -47
- package/dist/src/session/generic.js +0 -3
- package/dist/src/session/management_session_manager.d.ts +0 -59
- package/dist/src/session/management_session_manager.js +0 -111
- package/dist/src/session/oidc_session_manager.d.ts +0 -78
- package/dist/src/session/oidc_session_manager.js +0 -142
- package/dist/src/session/session_manager.d.ts +0 -99
- package/dist/src/session/session_manager.js +0 -136
- package/dist/src/sign.d.ts +0 -114
- package/dist/src/sign.js +0 -248
- package/dist/test/sessions.d.ts +0 -35
- package/dist/test/sessions.js +0 -56
- package/src/ethers/index.ts +0 -253
- package/src/session/cognito_manager.ts +0 -161
- package/src/session/session_manager.ts +0 -165
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { MfaPolicy } from "./role";
|
|
2
|
+
import { components } from "./schema";
|
|
3
|
+
import { JsonMap } from "./util";
|
|
4
|
+
type schemas = components["schemas"];
|
|
5
|
+
export type UserInfo = schemas["UserInfo"];
|
|
6
|
+
export type ConfiguredMfa = schemas["ConfiguredMfa"];
|
|
7
|
+
export type RatchetConfig = schemas["RatchetConfig"];
|
|
8
|
+
export type IdentityProof = schemas["IdentityProof"];
|
|
9
|
+
export type TotpInfo = schemas["TotpInfo"];
|
|
10
|
+
export type OidcAuthResponse = schemas["NewSessionResponse"];
|
|
11
|
+
export type ApiAddFidoChallenge = schemas["FidoCreateChallengeResponse"];
|
|
12
|
+
export type ApiMfaFidoChallenge = schemas["FidoAssertChallenge"];
|
|
13
|
+
export type PublicKeyCredentialCreationOptions = schemas["PublicKeyCredentialCreationOptions"];
|
|
14
|
+
export type PublicKeyCredentialRequestOptions = schemas["PublicKeyCredentialRequestOptions"];
|
|
15
|
+
export type PublicKeyCredentialParameters = schemas["PublicKeyCredentialParameters"];
|
|
16
|
+
export type PublicKeyCredentialDescriptor = schemas["PublicKeyCredentialDescriptor"];
|
|
17
|
+
export type AuthenticatorSelectionCriteria = schemas["AuthenticatorSelectionCriteria"];
|
|
18
|
+
export type PublicKeyCredentialUserEntity = schemas["PublicKeyCredentialUserEntity"];
|
|
19
|
+
export type PublicKeyCredential = schemas["PublicKeyCredential"];
|
|
20
|
+
export type OrgInfo = schemas["OrgInfo"];
|
|
21
|
+
export type UserIdInfo = schemas["UserIdInfo"];
|
|
22
|
+
export type UpdateOrgRequest = schemas["UpdateOrgRequest"];
|
|
23
|
+
export type UpdateOrgResponse = schemas["UpdateOrgResponse"];
|
|
24
|
+
export type OidcIdentity = schemas["OIDCIdentity"];
|
|
25
|
+
export type MemberRole = schemas["MemberRole"];
|
|
26
|
+
export type SchemaKeyType = schemas["KeyType"];
|
|
27
|
+
export type ListKeysResponse = schemas["PaginatedListKeysResponse"];
|
|
28
|
+
export type UpdateKeyRequest = schemas["UpdateKeyRequest"];
|
|
29
|
+
export type KeyInfoApi = schemas["KeyInfo"];
|
|
30
|
+
export type KeyInRoleInfo = schemas["KeyInRoleInfo"];
|
|
31
|
+
export type UserInRoleInfo = schemas["UserInRoleInfo"];
|
|
32
|
+
export type KeyTypeApi = schemas["KeyType"];
|
|
33
|
+
export type ListKeyRolesResponse = schemas["PaginatedListKeyRolesResponse"];
|
|
34
|
+
export type ListRolesResponse = schemas["PaginatedListRolesResponse"];
|
|
35
|
+
export type ListRoleKeysResponse = schemas["PaginatedListRoleKeysResponse"];
|
|
36
|
+
export type ListRoleUsersResponse = schemas["PaginatedListRoleUsersResponse"];
|
|
37
|
+
export type UpdateRoleRequest = schemas["UpdateRoleRequest"];
|
|
38
|
+
export type KeyWithPoliciesInfo = schemas["KeyInRoleInfo"];
|
|
39
|
+
export type RoleInfo = schemas["RoleInfo"];
|
|
40
|
+
export type SessionInfo = schemas["SessionInfo"];
|
|
41
|
+
export type ClientSessionInfo = schemas["ClientSessionInfo"];
|
|
42
|
+
export type NewSessionResponse = schemas["NewSessionResponse"];
|
|
43
|
+
export type SessionsResponse = schemas["PaginatedSessionsResponse"];
|
|
44
|
+
export type CreateSignerSessionRequest = schemas["CreateTokenRequest"];
|
|
45
|
+
export type RefreshSignerSessionRequest = schemas["AuthData"];
|
|
46
|
+
export type EvmSignRequest = schemas["Eth1SignRequest"];
|
|
47
|
+
export type EvmSignResponse = schemas["Eth1SignResponse"];
|
|
48
|
+
export type Eip191SignRequest = schemas["Eip191SignRequest"];
|
|
49
|
+
export type Eip712SignRequest = schemas["Eip712SignRequest"];
|
|
50
|
+
export type Eip191Or712SignResponse = schemas["Eip191Or712SignResponse"];
|
|
51
|
+
export type Eth2SignRequest = schemas["Eth2SignRequest"];
|
|
52
|
+
export type Eth2SignResponse = schemas["Eth2SignResponse"];
|
|
53
|
+
export type Eth2StakeRequest = schemas["StakeRequest"];
|
|
54
|
+
export type Eth2StakeResponse = schemas["StakeResponse"];
|
|
55
|
+
export type Eth2UnstakeRequest = schemas["UnstakeRequest"];
|
|
56
|
+
export type Eth2UnstakeResponse = schemas["UnstakeResponse"];
|
|
57
|
+
export type BlobSignRequest = schemas["BlobSignRequest"];
|
|
58
|
+
export type BlobSignResponse = schemas["BlobSignResponse"];
|
|
59
|
+
export type BtcSignRequest = schemas["BtcSignRequest"];
|
|
60
|
+
export type BtcSignResponse = schemas["BtcSignResponse"];
|
|
61
|
+
export type SolanaSignRequest = schemas["SolanaSignRequest"];
|
|
62
|
+
export type SolanaSignResponse = schemas["SolanaSignResponse"];
|
|
63
|
+
export type AvaSignRequest = schemas["AvaSignRequest"];
|
|
64
|
+
export type AvaSignResponse = schemas["AvaSignResponse"];
|
|
65
|
+
export type AcceptedResponse = schemas["AcceptedResponse"];
|
|
66
|
+
export type ErrorResponse = schemas["ErrorResponse"];
|
|
67
|
+
export type BtcSignatureKind = schemas["BtcSignatureKind"];
|
|
68
|
+
export type CsErrCode = schemas["SignerErrorCode"];
|
|
69
|
+
export type MfaType = schemas["MfaType"];
|
|
70
|
+
export type MfaVote = schemas["MfaVote"];
|
|
71
|
+
export type MfaRequestInfo = schemas["MfaRequestInfo"];
|
|
72
|
+
export type UserExportInitRequest = schemas["UserExportInitRequest"];
|
|
73
|
+
export type UserExportInitResponse = schemas["UserExportInitResponse"];
|
|
74
|
+
export type UserExportCompleteRequest = schemas["UserExportCompleteRequest"];
|
|
75
|
+
export type UserExportCompleteResponse = schemas["UserExportCompleteResponse"];
|
|
76
|
+
export type UserExportListResponse = schemas["PaginatedUserExportListResponse"];
|
|
77
|
+
export type UserExportKeyMaterial = schemas["JsonKeyPackage"];
|
|
78
|
+
export type Empty = schemas["EmptyImpl"];
|
|
79
|
+
/** Options for a new OIDC user */
|
|
80
|
+
export interface CreateOidcUserOptions {
|
|
81
|
+
/** The role of an OIDC user, default is "Alien" */
|
|
82
|
+
memberRole?: MemberRole;
|
|
83
|
+
/** Optional MFA policy to associate with the user account */
|
|
84
|
+
mfaPolicy?: MfaPolicy;
|
|
85
|
+
}
|
|
86
|
+
/** Ava P- or X-chain transaction */
|
|
87
|
+
export type AvaTx = {
|
|
88
|
+
P: AvaPChainTx;
|
|
89
|
+
} | {
|
|
90
|
+
X: AvaXChainTx;
|
|
91
|
+
};
|
|
92
|
+
/** Ava P-chain transaction */
|
|
93
|
+
export type AvaPChainTx = {
|
|
94
|
+
AddPermissionlessValidator: JsonMap;
|
|
95
|
+
} | {
|
|
96
|
+
AddSubnetValidator: JsonMap;
|
|
97
|
+
} | {
|
|
98
|
+
AddValidator: JsonMap;
|
|
99
|
+
} | {
|
|
100
|
+
CreateChain: JsonMap;
|
|
101
|
+
} | {
|
|
102
|
+
CreateSubnet: JsonMap;
|
|
103
|
+
} | {
|
|
104
|
+
Export: JsonMap;
|
|
105
|
+
} | {
|
|
106
|
+
Import: JsonMap;
|
|
107
|
+
};
|
|
108
|
+
/** Ava X-chain transaction */
|
|
109
|
+
export type AvaXChainTx = {
|
|
110
|
+
Base: JsonMap;
|
|
111
|
+
} | {
|
|
112
|
+
Export: JsonMap;
|
|
113
|
+
} | {
|
|
114
|
+
Import: JsonMap;
|
|
115
|
+
};
|
|
116
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hX3R5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NjaGVtYV90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWZhUG9saWN5IH0gZnJvbSBcIi4vcm9sZVwiO1xuaW1wb3J0IHsgY29tcG9uZW50cyB9IGZyb20gXCIuL3NjaGVtYVwiO1xuaW1wb3J0IHsgSnNvbk1hcCB9IGZyb20gXCIuL3V0aWxcIjtcblxudHlwZSBzY2hlbWFzID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl07XG5cbmV4cG9ydCB0eXBlIFVzZXJJbmZvID0gc2NoZW1hc1tcIlVzZXJJbmZvXCJdO1xuZXhwb3J0IHR5cGUgQ29uZmlndXJlZE1mYSA9IHNjaGVtYXNbXCJDb25maWd1cmVkTWZhXCJdO1xuZXhwb3J0IHR5cGUgUmF0Y2hldENvbmZpZyA9IHNjaGVtYXNbXCJSYXRjaGV0Q29uZmlnXCJdO1xuZXhwb3J0IHR5cGUgSWRlbnRpdHlQcm9vZiA9IHNjaGVtYXNbXCJJZGVudGl0eVByb29mXCJdO1xuZXhwb3J0IHR5cGUgVG90cEluZm8gPSBzY2hlbWFzW1wiVG90cEluZm9cIl07XG5cbmV4cG9ydCB0eXBlIE9pZGNBdXRoUmVzcG9uc2UgPSBzY2hlbWFzW1wiTmV3U2Vzc2lvblJlc3BvbnNlXCJdO1xuZXhwb3J0IHR5cGUgQXBpQWRkRmlkb0NoYWxsZW5nZSA9IHNjaGVtYXNbXCJGaWRvQ3JlYXRlQ2hhbGxlbmdlUmVzcG9uc2VcIl07XG5leHBvcnQgdHlwZSBBcGlNZmFGaWRvQ2hhbGxlbmdlID0gc2NoZW1hc1tcIkZpZG9Bc3NlcnRDaGFsbGVuZ2VcIl07XG5cbmV4cG9ydCB0eXBlIFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMgPSBzY2hlbWFzW1wiUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc1wiXTtcbmV4cG9ydCB0eXBlIFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyA9IHNjaGVtYXNbXCJQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNcIl07XG5leHBvcnQgdHlwZSBQdWJsaWNLZXlDcmVkZW50aWFsUGFyYW1ldGVycyA9IHNjaGVtYXNbXCJQdWJsaWNLZXlDcmVkZW50aWFsUGFyYW1ldGVyc1wiXTtcbmV4cG9ydCB0eXBlIFB1YmxpY0tleUNyZWRlbnRpYWxEZXNjcmlwdG9yID0gc2NoZW1hc1tcIlB1YmxpY0tleUNyZWRlbnRpYWxEZXNjcmlwdG9yXCJdO1xuZXhwb3J0IHR5cGUgQXV0aGVudGljYXRvclNlbGVjdGlvbkNyaXRlcmlhID0gc2NoZW1hc1tcIkF1dGhlbnRpY2F0b3JTZWxlY3Rpb25Dcml0ZXJpYVwiXTtcbmV4cG9ydCB0eXBlIFB1YmxpY0tleUNyZWRlbnRpYWxVc2VyRW50aXR5ID0gc2NoZW1hc1tcIlB1YmxpY0tleUNyZWRlbnRpYWxVc2VyRW50aXR5XCJdO1xuZXhwb3J0IHR5cGUgUHVibGljS2V5Q3JlZGVudGlhbCA9IHNjaGVtYXNbXCJQdWJsaWNLZXlDcmVkZW50aWFsXCJdO1xuXG5leHBvcnQgdHlwZSBPcmdJbmZvID0gc2NoZW1hc1tcIk9yZ0luZm9cIl07XG5leHBvcnQgdHlwZSBVc2VySWRJbmZvID0gc2NoZW1hc1tcIlVzZXJJZEluZm9cIl07XG5leHBvcnQgdHlwZSBVcGRhdGVPcmdSZXF1ZXN0ID0gc2NoZW1hc1tcIlVwZGF0ZU9yZ1JlcXVlc3RcIl07XG5leHBvcnQgdHlwZSBVcGRhdGVPcmdSZXNwb25zZSA9IHNjaGVtYXNbXCJVcGRhdGVPcmdSZXNwb25zZVwiXTtcblxuZXhwb3J0IHR5cGUgT2lkY0lkZW50aXR5ID0gc2NoZW1hc1tcIk9JRENJZGVudGl0eVwiXTtcbmV4cG9ydCB0eXBlIE1lbWJlclJvbGUgPSBzY2hlbWFzW1wiTWVtYmVyUm9sZVwiXTtcblxuZXhwb3J0IHR5cGUgU2NoZW1hS2V5VHlwZSA9IHNjaGVtYXNbXCJLZXlUeXBlXCJdO1xuXG5leHBvcnQgdHlwZSBMaXN0S2V5c1Jlc3BvbnNlID0gc2NoZW1hc1tcIlBhZ2luYXRlZExpc3RLZXlzUmVzcG9uc2VcIl07XG5leHBvcnQgdHlwZSBVcGRhdGVLZXlSZXF1ZXN0ID0gc2NoZW1hc1tcIlVwZGF0ZUtleVJlcXVlc3RcIl07XG5leHBvcnQgdHlwZSBLZXlJbmZvQXBpID0gc2NoZW1hc1tcIktleUluZm9cIl07XG5leHBvcnQgdHlwZSBLZXlJblJvbGVJbmZvID0gc2NoZW1hc1tcIktleUluUm9sZUluZm9cIl07XG5leHBvcnQgdHlwZSBVc2VySW5Sb2xlSW5mbyA9IHNjaGVtYXNbXCJVc2VySW5Sb2xlSW5mb1wiXTtcbmV4cG9ydCB0eXBlIEtleVR5cGVBcGkgPSBzY2hlbWFzW1wiS2V5VHlwZVwiXTtcblxuZXhwb3J0IHR5cGUgTGlzdEtleVJvbGVzUmVzcG9uc2UgPSBzY2hlbWFzW1wiUGFnaW5hdGVkTGlzdEtleVJvbGVzUmVzcG9uc2VcIl07XG5leHBvcnQgdHlwZSBMaXN0Um9sZXNSZXNwb25zZSA9IHNjaGVtYXNbXCJQYWdpbmF0ZWRMaXN0Um9sZXNSZXNwb25zZVwiXTtcbmV4cG9ydCB0eXBlIExpc3RSb2xlS2V5c1Jlc3BvbnNlID0gc2NoZW1hc1tcIlBhZ2luYXRlZExpc3RSb2xlS2V5c1Jlc3BvbnNlXCJdO1xuZXhwb3J0IHR5cGUgTGlzdFJvbGVVc2Vyc1Jlc3BvbnNlID0gc2NoZW1hc1tcIlBhZ2luYXRlZExpc3RSb2xlVXNlcnNSZXNwb25zZVwiXTtcbmV4cG9ydCB0eXBlIFVwZGF0ZVJvbGVSZXF1ZXN0ID0gc2NoZW1hc1tcIlVwZGF0ZVJvbGVSZXF1ZXN0XCJdO1xuZXhwb3J0IHR5cGUgS2V5V2l0aFBvbGljaWVzSW5mbyA9IHNjaGVtYXNbXCJLZXlJblJvbGVJbmZvXCJdO1xuZXhwb3J0IHR5cGUgUm9sZUluZm8gPSBzY2hlbWFzW1wiUm9sZUluZm9cIl07XG5cbmV4cG9ydCB0eXBlIFNlc3Npb25JbmZvID0gc2NoZW1hc1tcIlNlc3Npb25JbmZvXCJdO1xuZXhwb3J0IHR5cGUgQ2xpZW50U2Vzc2lvbkluZm8gPSBzY2hlbWFzW1wiQ2xpZW50U2Vzc2lvbkluZm9cIl07XG5leHBvcnQgdHlwZSBOZXdTZXNzaW9uUmVzcG9uc2UgPSBzY2hlbWFzW1wiTmV3U2Vzc2lvblJlc3BvbnNlXCJdO1xuZXhwb3J0IHR5cGUgU2Vzc2lvbnNSZXNwb25zZSA9IHNjaGVtYXNbXCJQYWdpbmF0ZWRTZXNzaW9uc1Jlc3BvbnNlXCJdO1xuXG5leHBvcnQgdHlwZSBDcmVhdGVTaWduZXJTZXNzaW9uUmVxdWVzdCA9IHNjaGVtYXNbXCJDcmVhdGVUb2tlblJlcXVlc3RcIl07XG5leHBvcnQgdHlwZSBSZWZyZXNoU2lnbmVyU2Vzc2lvblJlcXVlc3QgPSBzY2hlbWFzW1wiQXV0aERhdGFcIl07XG5cbmV4cG9ydCB0eXBlIEV2bVNpZ25SZXF1ZXN0ID0gc2NoZW1hc1tcIkV0aDFTaWduUmVxdWVzdFwiXTtcbmV4cG9ydCB0eXBlIEV2bVNpZ25SZXNwb25zZSA9IHNjaGVtYXNbXCJFdGgxU2lnblJlc3BvbnNlXCJdO1xuZXhwb3J0IHR5cGUgRWlwMTkxU2lnblJlcXVlc3QgPSBzY2hlbWFzW1wiRWlwMTkxU2lnblJlcXVlc3RcIl07XG5leHBvcnQgdHlwZSBFaXA3MTJTaWduUmVxdWVzdCA9IHNjaGVtYXNbXCJFaXA3MTJTaWduUmVxdWVzdFwiXTtcbmV4cG9ydCB0eXBlIEVpcDE5MU9yNzEyU2lnblJlc3BvbnNlID0gc2NoZW1hc1tcIkVpcDE5MU9yNzEyU2lnblJlc3BvbnNlXCJdO1xuZXhwb3J0IHR5cGUgRXRoMlNpZ25SZXF1ZXN0ID0gc2NoZW1hc1tcIkV0aDJTaWduUmVxdWVzdFwiXTtcbmV4cG9ydCB0eXBlIEV0aDJTaWduUmVzcG9uc2UgPSBzY2hlbWFzW1wiRXRoMlNpZ25SZXNwb25zZVwiXTtcbmV4cG9ydCB0eXBlIEV0aDJTdGFrZVJlcXVlc3QgPSBzY2hlbWFzW1wiU3Rha2VSZXF1ZXN0XCJdO1xuZXhwb3J0IHR5cGUgRXRoMlN0YWtlUmVzcG9uc2UgPSBzY2hlbWFzW1wiU3Rha2VSZXNwb25zZVwiXTtcbmV4cG9ydCB0eXBlIEV0aDJVbnN0YWtlUmVxdWVzdCA9IHNjaGVtYXNbXCJVbnN0YWtlUmVxdWVzdFwiXTtcbmV4cG9ydCB0eXBlIEV0aDJVbnN0YWtlUmVzcG9uc2UgPSBzY2hlbWFzW1wiVW5zdGFrZVJlc3BvbnNlXCJdO1xuZXhwb3J0IHR5cGUgQmxvYlNpZ25SZXF1ZXN0ID0gc2NoZW1hc1tcIkJsb2JTaWduUmVxdWVzdFwiXTtcbmV4cG9ydCB0eXBlIEJsb2JTaWduUmVzcG9uc2UgPSBzY2hlbWFzW1wiQmxvYlNpZ25SZXNwb25zZVwiXTtcbmV4cG9ydCB0eXBlIEJ0Y1NpZ25SZXF1ZXN0ID0gc2NoZW1hc1tcIkJ0Y1NpZ25SZXF1ZXN0XCJdO1xuZXhwb3J0IHR5cGUgQnRjU2lnblJlc3BvbnNlID0gc2NoZW1hc1tcIkJ0Y1NpZ25SZXNwb25zZVwiXTtcbmV4cG9ydCB0eXBlIFNvbGFuYVNpZ25SZXF1ZXN0ID0gc2NoZW1hc1tcIlNvbGFuYVNpZ25SZXF1ZXN0XCJdO1xuZXhwb3J0IHR5cGUgU29sYW5hU2lnblJlc3BvbnNlID0gc2NoZW1hc1tcIlNvbGFuYVNpZ25SZXNwb25zZVwiXTtcbmV4cG9ydCB0eXBlIEF2YVNpZ25SZXF1ZXN0ID0gc2NoZW1hc1tcIkF2YVNpZ25SZXF1ZXN0XCJdO1xuZXhwb3J0IHR5cGUgQXZhU2lnblJlc3BvbnNlID0gc2NoZW1hc1tcIkF2YVNpZ25SZXNwb25zZVwiXTtcblxuZXhwb3J0IHR5cGUgQWNjZXB0ZWRSZXNwb25zZSA9IHNjaGVtYXNbXCJBY2NlcHRlZFJlc3BvbnNlXCJdO1xuZXhwb3J0IHR5cGUgRXJyb3JSZXNwb25zZSA9IHNjaGVtYXNbXCJFcnJvclJlc3BvbnNlXCJdO1xuZXhwb3J0IHR5cGUgQnRjU2lnbmF0dXJlS2luZCA9IHNjaGVtYXNbXCJCdGNTaWduYXR1cmVLaW5kXCJdO1xuZXhwb3J0IHR5cGUgQ3NFcnJDb2RlID0gc2NoZW1hc1tcIlNpZ25lckVycm9yQ29kZVwiXTtcblxuZXhwb3J0IHR5cGUgTWZhVHlwZSA9IHNjaGVtYXNbXCJNZmFUeXBlXCJdO1xuZXhwb3J0IHR5cGUgTWZhVm90ZSA9IHNjaGVtYXNbXCJNZmFWb3RlXCJdO1xuZXhwb3J0IHR5cGUgTWZhUmVxdWVzdEluZm8gPSBzY2hlbWFzW1wiTWZhUmVxdWVzdEluZm9cIl07XG5cbmV4cG9ydCB0eXBlIFVzZXJFeHBvcnRJbml0UmVxdWVzdCA9IHNjaGVtYXNbXCJVc2VyRXhwb3J0SW5pdFJlcXVlc3RcIl07XG5leHBvcnQgdHlwZSBVc2VyRXhwb3J0SW5pdFJlc3BvbnNlID0gc2NoZW1hc1tcIlVzZXJFeHBvcnRJbml0UmVzcG9uc2VcIl07XG5leHBvcnQgdHlwZSBVc2VyRXhwb3J0Q29tcGxldGVSZXF1ZXN0ID0gc2NoZW1hc1tcIlVzZXJFeHBvcnRDb21wbGV0ZVJlcXVlc3RcIl07XG5leHBvcnQgdHlwZSBVc2VyRXhwb3J0Q29tcGxldGVSZXNwb25zZSA9IHNjaGVtYXNbXCJVc2VyRXhwb3J0Q29tcGxldGVSZXNwb25zZVwiXTtcbmV4cG9ydCB0eXBlIFVzZXJFeHBvcnRMaXN0UmVzcG9uc2UgPSBzY2hlbWFzW1wiUGFnaW5hdGVkVXNlckV4cG9ydExpc3RSZXNwb25zZVwiXTtcbmV4cG9ydCB0eXBlIFVzZXJFeHBvcnRLZXlNYXRlcmlhbCA9IHNjaGVtYXNbXCJKc29uS2V5UGFja2FnZVwiXTtcblxuZXhwb3J0IHR5cGUgRW1wdHkgPSBzY2hlbWFzW1wiRW1wdHlJbXBsXCJdO1xuXG4vKiogT3B0aW9ucyBmb3IgYSBuZXcgT0lEQyB1c2VyICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU9pZGNVc2VyT3B0aW9ucyB7XG4gIC8qKiBUaGUgcm9sZSBvZiBhbiBPSURDIHVzZXIsIGRlZmF1bHQgaXMgXCJBbGllblwiICovXG4gIG1lbWJlclJvbGU/OiBNZW1iZXJSb2xlO1xuICAvKiogT3B0aW9uYWwgTUZBIHBvbGljeSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdXNlciBhY2NvdW50ICovXG4gIG1mYVBvbGljeT86IE1mYVBvbGljeTtcbn1cblxuLyoqIEF2YSBQLSBvciBYLWNoYWluIHRyYW5zYWN0aW9uICovXG5leHBvcnQgdHlwZSBBdmFUeCA9IHsgUDogQXZhUENoYWluVHggfSB8IHsgWDogQXZhWENoYWluVHggfTtcblxuLyoqIEF2YSBQLWNoYWluIHRyYW5zYWN0aW9uICovXG5leHBvcnQgdHlwZSBBdmFQQ2hhaW5UeCA9XG4gIHwgeyBBZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcjogSnNvbk1hcCB9XG4gIHwgeyBBZGRTdWJuZXRWYWxpZGF0b3I6IEpzb25NYXAgfVxuICB8IHsgQWRkVmFsaWRhdG9yOiBKc29uTWFwIH1cbiAgfCB7IENyZWF0ZUNoYWluOiBKc29uTWFwIH1cbiAgfCB7IENyZWF0ZVN1Ym5ldDogSnNvbk1hcCB9XG4gIHwgeyBFeHBvcnQ6IEpzb25NYXAgfVxuICB8IHsgSW1wb3J0OiBKc29uTWFwIH07XG5cbi8qKiBBdmEgWC1jaGFpbiB0cmFuc2FjdGlvbiAqL1xuZXhwb3J0IHR5cGUgQXZhWENoYWluVHggPSB7IEJhc2U6IEpzb25NYXAgfSB8IHsgRXhwb3J0OiBKc29uTWFwIH0gfCB7IEltcG9ydDogSnNvbk1hcCB9O1xuIl19
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Interface for storing sessions. */
|
|
2
|
+
export interface SessionStorage<U> {
|
|
3
|
+
/** Store session information */
|
|
4
|
+
save(data: U): Promise<void>;
|
|
5
|
+
/** Retrieve session information */
|
|
6
|
+
retrieve(): Promise<U>;
|
|
7
|
+
}
|
|
8
|
+
/** Stores session information in memory */
|
|
9
|
+
export declare class MemorySessionStorage<U> implements SessionStorage<U> {
|
|
10
|
+
#private;
|
|
11
|
+
/**
|
|
12
|
+
* Store session information.
|
|
13
|
+
* @param {U} data The session information to store
|
|
14
|
+
* @return {Promise<void>}
|
|
15
|
+
*/
|
|
16
|
+
save(data: U): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Retrieve session information.
|
|
19
|
+
* @return {Promise<U>} The session information
|
|
20
|
+
*/
|
|
21
|
+
retrieve(): Promise<U>;
|
|
22
|
+
/**
|
|
23
|
+
* Constructor.
|
|
24
|
+
* @param {U?} data The initial data
|
|
25
|
+
*/
|
|
26
|
+
constructor(data?: U);
|
|
27
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
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");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
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");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _MemorySessionStorage_data;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MemorySessionStorage = void 0;
|
|
16
|
+
/** Stores session information in memory */
|
|
17
|
+
class MemorySessionStorage {
|
|
18
|
+
/**
|
|
19
|
+
* Store session information.
|
|
20
|
+
* @param {U} data The session information to store
|
|
21
|
+
* @return {Promise<void>}
|
|
22
|
+
*/
|
|
23
|
+
async save(data) {
|
|
24
|
+
__classPrivateFieldSet(this, _MemorySessionStorage_data, data, "f");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Retrieve session information.
|
|
28
|
+
* @return {Promise<U>} The session information
|
|
29
|
+
*/
|
|
30
|
+
async retrieve() {
|
|
31
|
+
if (!__classPrivateFieldGet(this, _MemorySessionStorage_data, "f")) {
|
|
32
|
+
throw new Error("Missing session information");
|
|
33
|
+
}
|
|
34
|
+
return __classPrivateFieldGet(this, _MemorySessionStorage_data, "f");
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Constructor.
|
|
38
|
+
* @param {U?} data The initial data
|
|
39
|
+
*/
|
|
40
|
+
constructor(data) {
|
|
41
|
+
_MemorySessionStorage_data.set(this, void 0);
|
|
42
|
+
__classPrivateFieldSet(this, _MemorySessionStorage_data, data, "f");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.MemorySessionStorage = MemorySessionStorage;
|
|
46
|
+
_MemorySessionStorage_data = new WeakMap();
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbl9zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Nlc3Npb24vc2Vzc2lvbl9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVNBLDJDQUEyQztBQUMzQyxNQUFhLG9CQUFvQjtJQUcvQjs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFPO1FBQ2hCLHVCQUFBLElBQUksOEJBQVMsSUFBSSxNQUFBLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLHVCQUFBLElBQUksa0NBQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsT0FBTyx1QkFBQSxJQUFJLGtDQUFNLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksSUFBUTtRQTFCcEIsNkNBQVU7UUEyQlIsdUJBQUEsSUFBSSw4QkFBUyxJQUFJLE1BQUEsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUE5QkQsb0RBOEJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEludGVyZmFjZSBmb3Igc3RvcmluZyBzZXNzaW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblN0b3JhZ2U8VT4ge1xuICAvKiogU3RvcmUgc2Vzc2lvbiBpbmZvcm1hdGlvbiAqL1xuICBzYXZlKGRhdGE6IFUpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBSZXRyaWV2ZSBzZXNzaW9uIGluZm9ybWF0aW9uICovXG4gIHJldHJpZXZlKCk6IFByb21pc2U8VT47XG59XG5cbi8qKiBTdG9yZXMgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpbiBtZW1vcnkgKi9cbmV4cG9ydCBjbGFzcyBNZW1vcnlTZXNzaW9uU3RvcmFnZTxVPiBpbXBsZW1lbnRzIFNlc3Npb25TdG9yYWdlPFU+IHtcbiAgI2RhdGE/OiBVO1xuXG4gIC8qKlxuICAgKiBTdG9yZSBzZXNzaW9uIGluZm9ybWF0aW9uLlxuICAgKiBAcGFyYW0ge1V9IGRhdGEgVGhlIHNlc3Npb24gaW5mb3JtYXRpb24gdG8gc3RvcmVcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNhdmUoZGF0YTogVSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuI2RhdGEgPSBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHNlc3Npb24gaW5mb3JtYXRpb24uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VT59IFRoZSBzZXNzaW9uIGluZm9ybWF0aW9uXG4gICAqL1xuICBhc3luYyByZXRyaWV2ZSgpOiBQcm9taXNlPFU+IHtcbiAgICBpZiAoIXRoaXMuI2RhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcgc2Vzc2lvbiBpbmZvcm1hdGlvblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7VT99IGRhdGEgVGhlIGluaXRpYWwgZGF0YVxuICAgKi9cbiAgY29uc3RydWN0b3IoZGF0YT86IFUpIHtcbiAgICB0aGlzLiNkYXRhID0gZGF0YTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Events } from "../events";
|
|
2
|
+
import { EnvInterface } from "../env";
|
|
3
|
+
import { Client } from "../api";
|
|
4
|
+
import { SessionStorage } from "./session_storage";
|
|
5
|
+
import { ClientSessionInfo, NewSessionResponse } from "../schema_types";
|
|
6
|
+
import { operations } from "../schema";
|
|
7
|
+
/** JSON representation of our "signer session" file format */
|
|
8
|
+
export interface SignerSessionData {
|
|
9
|
+
/** The organization ID */
|
|
10
|
+
org_id: string;
|
|
11
|
+
/** The role ID */
|
|
12
|
+
role_id?: string;
|
|
13
|
+
/** The purpose of the session token */
|
|
14
|
+
purpose?: string;
|
|
15
|
+
/** The token to include in Authorization header */
|
|
16
|
+
token: string;
|
|
17
|
+
/** Session info */
|
|
18
|
+
session_info: ClientSessionInfo;
|
|
19
|
+
/** Session expiration (in seconds since UNIX epoch) beyond which it cannot be refreshed */
|
|
20
|
+
session_exp: number | undefined;
|
|
21
|
+
/** The environment */
|
|
22
|
+
env: {
|
|
23
|
+
["Dev-CubeSignerStack"]: EnvInterface;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** Type of storage required for signer sessions */
|
|
27
|
+
export type SignerSessionStorage = SessionStorage<SignerSessionData>;
|
|
28
|
+
export interface SignerSessionLifetime {
|
|
29
|
+
/** Session lifetime (in seconds). Defaults to one week (604800). */
|
|
30
|
+
session?: number;
|
|
31
|
+
/** Auth token lifetime (in seconds). Defaults to five minutes (300). */
|
|
32
|
+
auth: number;
|
|
33
|
+
/** Refresh token lifetime (in seconds). Defaults to one day (86400). */
|
|
34
|
+
refresh?: number;
|
|
35
|
+
/** Grace lifetime (in seconds). Defaults to 30 seconds (30). */
|
|
36
|
+
grace?: number;
|
|
37
|
+
}
|
|
38
|
+
/** Generic session manager interface. */
|
|
39
|
+
export declare class SignerSessionManager {
|
|
40
|
+
#private;
|
|
41
|
+
readonly env: EnvInterface;
|
|
42
|
+
readonly orgId: string;
|
|
43
|
+
readonly storage: SignerSessionStorage;
|
|
44
|
+
readonly events: Events;
|
|
45
|
+
/**
|
|
46
|
+
* @return {string} The current auth token.
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
token(): Promise<string>;
|
|
50
|
+
/**
|
|
51
|
+
* Refreshes the current session if needed, then returns a client using the current session.
|
|
52
|
+
*
|
|
53
|
+
* May **UPDATE/MUTATE** self.
|
|
54
|
+
*
|
|
55
|
+
* @param {operations} operation The operation that this client will be
|
|
56
|
+
* used for. This parameter is used exclusively for more accurate error
|
|
57
|
+
* reporting and does not affect functionality.
|
|
58
|
+
* @return {Client} The client with the current session
|
|
59
|
+
*/
|
|
60
|
+
client(operation?: keyof operations): Promise<Client>;
|
|
61
|
+
/** Revokes the session. */
|
|
62
|
+
revoke(): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Refreshes the session and **UPDATES/MUTATES** self.
|
|
65
|
+
*/
|
|
66
|
+
refresh(): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Returns whether it's time to refresh this token.
|
|
69
|
+
* @return {boolean} Whether it's time to refresh this token.
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
isStale(): Promise<boolean>;
|
|
73
|
+
/**
|
|
74
|
+
* Return whether this session has expired and cannot be refreshed anymore.
|
|
75
|
+
* @return {boolean} Whether this session has expired.
|
|
76
|
+
* @internal
|
|
77
|
+
*/
|
|
78
|
+
hasExpired(): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Refreshes the session if it is about to expire.
|
|
81
|
+
* @return {boolean} Whether the session token was refreshed.
|
|
82
|
+
* @internal
|
|
83
|
+
*/
|
|
84
|
+
refreshIfNeeded(): Promise<boolean>;
|
|
85
|
+
/**
|
|
86
|
+
* Automatically refreshes the session in the background (if needed) every
|
|
87
|
+
* minute. This is a simple wrapper around `setInterval`.
|
|
88
|
+
* @return {number} The interval ID of the refresh timer.
|
|
89
|
+
*/
|
|
90
|
+
autoRefresh(): RefreshId;
|
|
91
|
+
/**
|
|
92
|
+
* Clears the auto refresh timer.
|
|
93
|
+
* @param {number} timer The timer ID to clear.
|
|
94
|
+
*/
|
|
95
|
+
clearAutoRefresh(timer: RefreshId): void;
|
|
96
|
+
/**
|
|
97
|
+
* @param {EnvInterface} env The CubeSigner environment
|
|
98
|
+
* @param {string} orgId The organization ID
|
|
99
|
+
* @param {NewSessionResponse} session The session information.
|
|
100
|
+
* @param {SignerSessionStorage} storage The storage to use for saving the session.
|
|
101
|
+
* @return {Promise<SignerSessionManager>} New signer session manager.
|
|
102
|
+
*/
|
|
103
|
+
static createFromSessionInfo(env: EnvInterface, orgId: string, session: NewSessionResponse, storage?: SignerSessionStorage): Promise<SignerSessionManager>;
|
|
104
|
+
/**
|
|
105
|
+
* @param {SignerSessionData} sessionData The session information.
|
|
106
|
+
* @param {SignerSessionStorage} storage The storage to use for saving the session.
|
|
107
|
+
* @return {Promise<SignerSessionManager>} New signer session manager.
|
|
108
|
+
*/
|
|
109
|
+
static createFromSessionData(sessionData: SignerSessionData, storage?: SignerSessionStorage): Promise<SignerSessionManager>;
|
|
110
|
+
/**
|
|
111
|
+
* Uses an existing session to create a new signer session manager.
|
|
112
|
+
*
|
|
113
|
+
* @param {SignerSessionStorage} storage The session storage to use
|
|
114
|
+
* @return {Promise<SingerSession>} New signer session manager
|
|
115
|
+
*/
|
|
116
|
+
static loadFromStorage(storage: SignerSessionStorage): Promise<SignerSessionManager>;
|
|
117
|
+
/**
|
|
118
|
+
* Constructor.
|
|
119
|
+
* @param {SignerSessionData} sessionData Session data
|
|
120
|
+
* @param {SignerSessionStorage} storage The session storage to use.
|
|
121
|
+
*/
|
|
122
|
+
constructor(sessionData: SignerSessionData, storage: SignerSessionStorage);
|
|
123
|
+
}
|
|
124
|
+
/** Type of the refresh timer ID. */
|
|
125
|
+
export type RefreshId = ReturnType<typeof setInterval>;
|
|
@@ -0,0 +1,239 @@
|
|
|
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 _SignerSessionManager_instances, _a, _SignerSessionManager_eventEmitter, _SignerSessionManager_refreshing, _SignerSessionManager_client, _SignerSessionManager_createClient, _SignerSessionManager_hasTimestampExpired;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.SignerSessionManager = void 0;
|
|
16
|
+
const events_1 = require("../events");
|
|
17
|
+
const api_1 = require("../api");
|
|
18
|
+
const session_storage_1 = require("./session_storage");
|
|
19
|
+
const util_1 = require("../util");
|
|
20
|
+
const events_2 = require("../events");
|
|
21
|
+
const error_1 = require("../error");
|
|
22
|
+
const DEFAULT_EXPIRATION_BUFFER_SECS = 30;
|
|
23
|
+
/**
|
|
24
|
+
* Constructs {@link Date} from a number representing seconds since unix epoch.
|
|
25
|
+
* @param {number} secs Seconds since unix epoch.
|
|
26
|
+
* @return {Date} The equivalent date.
|
|
27
|
+
*/
|
|
28
|
+
function secondsSinceEpochToDate(secs) {
|
|
29
|
+
return new Date(secs * 1000);
|
|
30
|
+
}
|
|
31
|
+
/** Generic session manager interface. */
|
|
32
|
+
class SignerSessionManager {
|
|
33
|
+
/**
|
|
34
|
+
* @return {string} The current auth token.
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
async token() {
|
|
38
|
+
const session = await this.storage.retrieve();
|
|
39
|
+
return session.token;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Refreshes the current session if needed, then returns a client using the current session.
|
|
43
|
+
*
|
|
44
|
+
* May **UPDATE/MUTATE** self.
|
|
45
|
+
*
|
|
46
|
+
* @param {operations} operation The operation that this client will be
|
|
47
|
+
* used for. This parameter is used exclusively for more accurate error
|
|
48
|
+
* reporting and does not affect functionality.
|
|
49
|
+
* @return {Client} The client with the current session
|
|
50
|
+
*/
|
|
51
|
+
async client(operation) {
|
|
52
|
+
await this.refreshIfNeeded();
|
|
53
|
+
// trigger "session expired" if the session as a whole has expired
|
|
54
|
+
// or if (for whatever reason) the token is still stale
|
|
55
|
+
if (__classPrivateFieldGet(_a, _a, "m", _SignerSessionManager_hasTimestampExpired).call(_a, __classPrivateFieldGet(this, _SignerSessionManager_client, "f").token_exp) || this.hasExpired()) {
|
|
56
|
+
await __classPrivateFieldGet(this, _SignerSessionManager_eventEmitter, "f").emitSessionExpired();
|
|
57
|
+
throw new error_1.SessionExpiredError(operation);
|
|
58
|
+
}
|
|
59
|
+
return __classPrivateFieldGet(this, _SignerSessionManager_client, "f").client;
|
|
60
|
+
}
|
|
61
|
+
/** Revokes the session. */
|
|
62
|
+
async revoke() {
|
|
63
|
+
const client = new api_1.OpClient("revokeCurrentSession", await this.client(), __classPrivateFieldGet(this, _SignerSessionManager_eventEmitter, "f"));
|
|
64
|
+
await client.del("/v0/org/{org_id}/session/self", {
|
|
65
|
+
params: { path: { org_id: this.orgId } },
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Refreshes the session and **UPDATES/MUTATES** self.
|
|
70
|
+
*/
|
|
71
|
+
async refresh() {
|
|
72
|
+
if (this.hasExpired()) {
|
|
73
|
+
await __classPrivateFieldGet(this, _SignerSessionManager_eventEmitter, "f").emitSessionExpired();
|
|
74
|
+
throw new error_1.SessionExpiredError("signerSessionRefresh");
|
|
75
|
+
}
|
|
76
|
+
const currSession = await this.storage.retrieve();
|
|
77
|
+
const client = new api_1.OpClient("signerSessionRefresh", __classPrivateFieldGet(this, _SignerSessionManager_client, "f").client, __classPrivateFieldGet(this, _SignerSessionManager_eventEmitter, "f"));
|
|
78
|
+
const csi = currSession.session_info;
|
|
79
|
+
const data = await client.patch("/v1/org/{org_id}/token/refresh", {
|
|
80
|
+
params: { path: { org_id: this.orgId } },
|
|
81
|
+
body: {
|
|
82
|
+
epoch_num: csi.epoch,
|
|
83
|
+
epoch_token: csi.epoch_token,
|
|
84
|
+
other_token: csi.refresh_token,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
const newSession = {
|
|
88
|
+
...currSession,
|
|
89
|
+
session_info: data.session_info,
|
|
90
|
+
token: data.token,
|
|
91
|
+
};
|
|
92
|
+
await this.storage.save(newSession);
|
|
93
|
+
__classPrivateFieldSet(this, _SignerSessionManager_client, {
|
|
94
|
+
client: __classPrivateFieldGet(this, _SignerSessionManager_instances, "m", _SignerSessionManager_createClient).call(this, newSession.token),
|
|
95
|
+
token_exp: secondsSinceEpochToDate(newSession.session_info.auth_token_exp),
|
|
96
|
+
session_exp: newSession.session_exp
|
|
97
|
+
? secondsSinceEpochToDate(newSession.session_exp)
|
|
98
|
+
: undefined,
|
|
99
|
+
}, "f");
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Returns whether it's time to refresh this token.
|
|
103
|
+
* @return {boolean} Whether it's time to refresh this token.
|
|
104
|
+
* @internal
|
|
105
|
+
*/
|
|
106
|
+
async isStale() {
|
|
107
|
+
return __classPrivateFieldGet(_a, _a, "m", _SignerSessionManager_hasTimestampExpired).call(_a, __classPrivateFieldGet(this, _SignerSessionManager_client, "f").token_exp, DEFAULT_EXPIRATION_BUFFER_SECS);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Return whether this session has expired and cannot be refreshed anymore.
|
|
111
|
+
* @return {boolean} Whether this session has expired.
|
|
112
|
+
* @internal
|
|
113
|
+
*/
|
|
114
|
+
hasExpired() {
|
|
115
|
+
return ((__classPrivateFieldGet(this, _SignerSessionManager_client, "f").session_exp || false) &&
|
|
116
|
+
__classPrivateFieldGet(_a, _a, "m", _SignerSessionManager_hasTimestampExpired).call(_a, __classPrivateFieldGet(this, _SignerSessionManager_client, "f").session_exp));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Refreshes the session if it is about to expire.
|
|
120
|
+
* @return {boolean} Whether the session token was refreshed.
|
|
121
|
+
* @internal
|
|
122
|
+
*/
|
|
123
|
+
async refreshIfNeeded() {
|
|
124
|
+
if (await this.isStale()) {
|
|
125
|
+
if (__classPrivateFieldGet(this, _SignerSessionManager_refreshing, "f")) {
|
|
126
|
+
// wait until done refreshing
|
|
127
|
+
while (__classPrivateFieldGet(this, _SignerSessionManager_refreshing, "f")) {
|
|
128
|
+
await (0, util_1.delay)(100);
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// refresh
|
|
134
|
+
__classPrivateFieldSet(this, _SignerSessionManager_refreshing, true, "f");
|
|
135
|
+
try {
|
|
136
|
+
await this.refresh();
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
__classPrivateFieldSet(this, _SignerSessionManager_refreshing, false, "f");
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Automatically refreshes the session in the background (if needed) every
|
|
148
|
+
* minute. This is a simple wrapper around `setInterval`.
|
|
149
|
+
* @return {number} The interval ID of the refresh timer.
|
|
150
|
+
*/
|
|
151
|
+
autoRefresh() {
|
|
152
|
+
return setInterval(async () => {
|
|
153
|
+
await this.refreshIfNeeded();
|
|
154
|
+
}, 60 * 1000);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Clears the auto refresh timer.
|
|
158
|
+
* @param {number} timer The timer ID to clear.
|
|
159
|
+
*/
|
|
160
|
+
clearAutoRefresh(timer) {
|
|
161
|
+
clearInterval(timer);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* @param {EnvInterface} env The CubeSigner environment
|
|
165
|
+
* @param {string} orgId The organization ID
|
|
166
|
+
* @param {NewSessionResponse} session The session information.
|
|
167
|
+
* @param {SignerSessionStorage} storage The storage to use for saving the session.
|
|
168
|
+
* @return {Promise<SignerSessionManager>} New signer session manager.
|
|
169
|
+
*/
|
|
170
|
+
static async createFromSessionInfo(env, orgId, session, storage) {
|
|
171
|
+
const sessionData = {
|
|
172
|
+
env: {
|
|
173
|
+
["Dev-CubeSignerStack"]: env,
|
|
174
|
+
},
|
|
175
|
+
org_id: orgId,
|
|
176
|
+
token: session.token,
|
|
177
|
+
purpose: "sign via oidc",
|
|
178
|
+
session_info: session.session_info,
|
|
179
|
+
session_exp: session.expiration,
|
|
180
|
+
};
|
|
181
|
+
storage ??= new session_storage_1.MemorySessionStorage();
|
|
182
|
+
await storage.save(sessionData);
|
|
183
|
+
return new _a(sessionData, storage);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* @param {SignerSessionData} sessionData The session information.
|
|
187
|
+
* @param {SignerSessionStorage} storage The storage to use for saving the session.
|
|
188
|
+
* @return {Promise<SignerSessionManager>} New signer session manager.
|
|
189
|
+
*/
|
|
190
|
+
static async createFromSessionData(sessionData, storage) {
|
|
191
|
+
storage ??= new session_storage_1.MemorySessionStorage();
|
|
192
|
+
await storage.save(sessionData);
|
|
193
|
+
return new _a(sessionData, storage);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Uses an existing session to create a new signer session manager.
|
|
197
|
+
*
|
|
198
|
+
* @param {SignerSessionStorage} storage The session storage to use
|
|
199
|
+
* @return {Promise<SingerSession>} New signer session manager
|
|
200
|
+
*/
|
|
201
|
+
static async loadFromStorage(storage) {
|
|
202
|
+
const session = await storage.retrieve();
|
|
203
|
+
return new _a(session, storage);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Constructor.
|
|
207
|
+
* @param {SignerSessionData} sessionData Session data
|
|
208
|
+
* @param {SignerSessionStorage} storage The session storage to use.
|
|
209
|
+
*/
|
|
210
|
+
constructor(sessionData, storage) {
|
|
211
|
+
_SignerSessionManager_instances.add(this);
|
|
212
|
+
this.events = new events_1.Events();
|
|
213
|
+
_SignerSessionManager_eventEmitter.set(this, void 0);
|
|
214
|
+
_SignerSessionManager_refreshing.set(this, false);
|
|
215
|
+
_SignerSessionManager_client.set(this, void 0);
|
|
216
|
+
this.env = sessionData.env["Dev-CubeSignerStack"];
|
|
217
|
+
this.orgId = sessionData.org_id;
|
|
218
|
+
this.storage = storage;
|
|
219
|
+
__classPrivateFieldSet(this, _SignerSessionManager_eventEmitter, new events_2.EventEmitter([this.events]), "f");
|
|
220
|
+
__classPrivateFieldSet(this, _SignerSessionManager_client, {
|
|
221
|
+
client: __classPrivateFieldGet(this, _SignerSessionManager_instances, "m", _SignerSessionManager_createClient).call(this, sessionData.token),
|
|
222
|
+
token_exp: secondsSinceEpochToDate(sessionData.session_info.auth_token_exp),
|
|
223
|
+
session_exp: sessionData.session_exp
|
|
224
|
+
? secondsSinceEpochToDate(sessionData.session_exp)
|
|
225
|
+
: undefined,
|
|
226
|
+
}, "f");
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
exports.SignerSessionManager = SignerSessionManager;
|
|
230
|
+
_a = SignerSessionManager, _SignerSessionManager_eventEmitter = new WeakMap(), _SignerSessionManager_refreshing = new WeakMap(), _SignerSessionManager_client = new WeakMap(), _SignerSessionManager_instances = new WeakSet(), _SignerSessionManager_createClient = function _SignerSessionManager_createClient(token) {
|
|
231
|
+
return (0, api_1.createHttpClient)(this.env.SignerApiRoot, token);
|
|
232
|
+
}, _SignerSessionManager_hasTimestampExpired = function _SignerSessionManager_hasTimestampExpired(exp, bufferSeconds) {
|
|
233
|
+
bufferSeconds ??= 0;
|
|
234
|
+
const expMsSinceEpoch = exp.getTime();
|
|
235
|
+
const nowMsSinceEpoch = new Date().getTime();
|
|
236
|
+
const bufferMs = bufferSeconds * 1000;
|
|
237
|
+
return expMsSinceEpoch < nowMsSinceEpoch + bufferMs;
|
|
238
|
+
};
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmVyX3Nlc3Npb25fbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXNzaW9uL3NpZ25lcl9zZXNzaW9uX21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0NBQW1DO0FBRW5DLGdDQUE0RDtBQUM1RCx1REFBeUU7QUFDekUsa0NBQWdDO0FBTWhDLHNDQUF5QztBQUN6QyxvQ0FBK0M7QUFHL0MsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLENBQUM7QUFzQjFDOzs7O0dBSUc7QUFDSCxTQUFTLHVCQUF1QixDQUFDLElBQVk7SUFDM0MsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQWdCRCx5Q0FBeUM7QUFDekMsTUFBYSxvQkFBb0I7SUFTL0I7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQTRCO1FBQ3ZDLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTdCLGtFQUFrRTtRQUNsRSx1REFBdUQ7UUFDdkQsSUFBSSx1QkFBQSxFQUFvQixxREFBcUIsTUFBekMsRUFBb0IsRUFBc0IsdUJBQUEsSUFBSSxvQ0FBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQzNGLE1BQU0sdUJBQUEsSUFBSSwwQ0FBYyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDOUMsTUFBTSxJQUFJLDJCQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxPQUFPLHVCQUFBLElBQUksb0NB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QVksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFBLENBQUM7UUFDckQsdUJBQUEsSUFBSSxnQ0FBVztZQUNiLE1BQU0sRUFBRSx1QkFBQSxJQUFJLDJFQUFjLE1BQWxCLElBQUksRUFBZSxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQzdDLFNBQVMsRUFBRSx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQztZQUMzRSxXQUFXLEVBQUUsV0FBVyxDQUFDLFdBQVc7Z0JBQ2xDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO2dCQUNsRCxDQUFDLENBQUMsU0FBUztTQUNkLE1BQUEsQ0FBQztJQUNKLENBQUM7Q0F3QkY7QUEzUEQsb0RBMlBDO2lUQWpCZSxLQUFhO0lBQ3pCLE9BQU8sSUFBQSxzQkFBZ0IsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6RCxDQUFDLGlHQVEyQixHQUFTLEVBQUUsYUFBc0I7SUFDM0QsYUFBYSxLQUFLLENBQUMsQ0FBQztJQUNwQixNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QyxNQUFNLFFBQVEsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE9BQU8sZUFBZSxHQUFHLGVBQWUsR0FBRyxRQUFRLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50cyB9IGZyb20gXCIuLi9ldmVudHNcIjtcbmltcG9ydCB7IEVudkludGVyZmFjZSB9IGZyb20gXCIuLi9lbnZcIjtcbmltcG9ydCB7IENsaWVudCwgY3JlYXRlSHR0cENsaWVudCwgT3BDbGllbnQgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBNZW1vcnlTZXNzaW9uU3RvcmFnZSwgU2Vzc2lvblN0b3JhZ2UgfSBmcm9tIFwiLi9zZXNzaW9uX3N0b3JhZ2VcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCB7XG4gIENsaWVudFNlc3Npb25JbmZvLFxuICBOZXdTZXNzaW9uUmVzcG9uc2UsXG4gIFJlZnJlc2hTaWduZXJTZXNzaW9uUmVxdWVzdCxcbn0gZnJvbSBcIi4uL3NjaGVtYV90eXBlc1wiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIi4uL2V2ZW50c1wiO1xuaW1wb3J0IHsgU2Vzc2lvbkV4cGlyZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuaW1wb3J0IHsgb3BlcmF0aW9ucyB9IGZyb20gXCIuLi9zY2hlbWFcIjtcblxuY29uc3QgREVGQVVMVF9FWFBJUkFUSU9OX0JVRkZFUl9TRUNTID0gMzA7XG5cbi8qKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIG91ciBcInNpZ25lciBzZXNzaW9uXCIgZmlsZSBmb3JtYXQgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmVyU2Vzc2lvbkRhdGEge1xuICAvKiogVGhlIG9yZ2FuaXphdGlvbiBJRCAqL1xuICBvcmdfaWQ6IHN0cmluZztcbiAgLyoqIFRoZSByb2xlIElEICovXG4gIHJvbGVfaWQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgcHVycG9zZSBvZiB0aGUgc2Vzc2lvbiB0b2tlbiAqL1xuICBwdXJwb3NlPzogc3RyaW5nO1xuICAvKiogVGhlIHRva2VuIHRvIGluY2x1ZGUgaW4gQXV0aG9yaXphdGlvbiBoZWFkZXIgKi9cbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIFNlc3Npb24gaW5mbyAqL1xuICBzZXNzaW9uX2luZm86IENsaWVudFNlc3Npb25JbmZvO1xuICAvKiogU2Vzc2lvbiBleHBpcmF0aW9uIChpbiBzZWNvbmRzIHNpbmNlIFVOSVggZXBvY2gpIGJleW9uZCB3aGljaCBpdCBjYW5ub3QgYmUgcmVmcmVzaGVkICovXG4gIHNlc3Npb25fZXhwOiBudW1iZXIgfCB1bmRlZmluZWQ7IC8vIG1heSBiZSBtaXNzaW5nIGluIGxlZ2FjeSBzZXNzaW9uIGZpbGVzXG4gIC8qKiBUaGUgZW52aXJvbm1lbnQgKi9cbiAgZW52OiB7XG4gICAgW1wiRGV2LUN1YmVTaWduZXJTdGFja1wiXTogRW52SW50ZXJmYWNlO1xuICB9O1xufVxuXG4vKipcbiAqIENvbnN0cnVjdHMge0BsaW5rIERhdGV9IGZyb20gYSBudW1iZXIgcmVwcmVzZW50aW5nIHNlY29uZHMgc2luY2UgdW5peCBlcG9jaC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWNzIFNlY29uZHMgc2luY2UgdW5peCBlcG9jaC5cbiAqIEByZXR1cm4ge0RhdGV9IFRoZSBlcXVpdmFsZW50IGRhdGUuXG4gKi9cbmZ1bmN0aW9uIHNlY29uZHNTaW5jZUVwb2NoVG9EYXRlKHNlY3M6IG51bWJlcik6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUoc2VjcyAqIDEwMDApO1xufVxuXG4vKiogVHlwZSBvZiBzdG9yYWdlIHJlcXVpcmVkIGZvciBzaWduZXIgc2Vzc2lvbnMgKi9cbmV4cG9ydCB0eXBlIFNpZ25lclNlc3Npb25TdG9yYWdlID0gU2Vzc2lvblN0b3JhZ2U8U2lnbmVyU2Vzc2lvbkRhdGE+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25lclNlc3Npb25MaWZldGltZSB7XG4gIC8qKiBTZXNzaW9uIGxpZmV0aW1lIChpbiBzZWNvbmRzKS4gRGVmYXVsdHMgdG8gb25lIHdlZWsgKDYwNDgwMCkuICovXG4gIHNlc3Npb24/OiBudW1iZXI7XG4gIC8qKiBBdXRoIHRva2VuIGxpZmV0aW1lIChpbiBzZWNvbmRzKS4gRGVmYXVsdHMgdG8gZml2ZSBtaW51dGVzICgzMDApLiAqL1xuICBhdXRoOiBudW1iZXI7XG4gIC8qKiBSZWZyZXNoIHRva2VuIGxpZmV0aW1lIChpbiBzZWNvbmRzKS4gRGVmYXVsdHMgdG8gb25lIGRheSAoODY0MDApLiAqL1xuICByZWZyZXNoPzogbnVtYmVyO1xuICAvKiogR3JhY2UgbGlmZXRpbWUgKGluIHNlY29uZHMpLiBEZWZhdWx0cyB0byAzMCBzZWNvbmRzICgzMCkuICovXG4gIGdyYWNlPzogbnVtYmVyO1xufVxuXG4vKiogR2VuZXJpYyBzZXNzaW9uIG1hbmFnZXIgaW50ZXJmYWNlLiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25lclNlc3Npb25NYW5hZ2VyIHtcbiAgcmVhZG9ubHkgZW52OiBFbnZJbnRlcmZhY2U7XG4gIHJlYWRvbmx5IG9yZ0lkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0b3JhZ2U6IFNpZ25lclNlc3Npb25TdG9yYWdlO1xuICByZWFkb25seSBldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIHJlYWRvbmx5ICNldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjtcbiAgI3JlZnJlc2hpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI2NsaWVudDogeyBjbGllbnQ6IENsaWVudDsgdG9rZW5fZXhwOiBEYXRlOyBzZXNzaW9uX2V4cD86IERhdGUgfTtcblxuICAvKipcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY3VycmVudCBhdXRoIHRva2VuLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGFzeW5jIHRva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZS5yZXRyaWV2ZSgpO1xuICAgIHJldHVybiBzZXNzaW9uLnRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgY3VycmVudCBzZXNzaW9uIGlmIG5lZWRlZCwgdGhlbiByZXR1cm5zIGEgY2xpZW50IHVzaW5nIHRoZSBjdXJyZW50IHNlc3Npb24uXG4gICAqXG4gICAqIE1heSAqKlVQREFURS9NVVRBVEUqKiBzZWxmLlxuICAgKlxuICAgKiBAcGFyYW0ge29wZXJhdGlvbnN9IG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRoYXQgdGhpcyBjbGllbnQgd2lsbCBiZVxuICAgKiAgIHVzZWQgZm9yLiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIGV4Y2x1c2l2ZWx5IGZvciBtb3JlIGFjY3VyYXRlIGVycm9yXG4gICAqICAgcmVwb3J0aW5nIGFuZCBkb2VzIG5vdCBhZmZlY3QgZnVuY3Rpb25hbGl0eS5cbiAgICogQHJldHVybiB7Q2xpZW50fSBUaGUgY2xpZW50IHdpdGggdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgKi9cbiAgYXN5bmMgY2xpZW50KG9wZXJhdGlvbj86IGtleW9mIG9wZXJhdGlvbnMpOiBQcm9taXNlPENsaWVudD4ge1xuICAgIGF3YWl0IHRoaXMucmVmcmVzaElmTmVlZGVkKCk7XG5cbiAgICAvLyB0cmlnZ2VyIFwic2Vzc2lvbiBleHBpcmVkXCIgaWYgdGhlIHNlc3Npb24gYXMgYSB3aG9sZSBoYXMgZXhwaXJlZFxuICAgIC8vIG9yIGlmIChmb3Igd2hhdGV2ZXIgcmVhc29uKSB0aGUgdG9rZW4gaXMgc3RpbGwgc3RhbGVcbiAgICBpZiAoU2lnbmVyU2Vzc2lvbk1hbmFnZXIuI2hhc1RpbWVzdGFtcEV4cGlyZWQodGhpcy4jY2xpZW50LnRva2VuX2V4cCkgfHwgdGhpcy5oYXNFeHBpcmVkKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuI2V2ZW50RW1pdHRlci5lbWl0U2Vzc2lvbkV4cGlyZWQoKTtcbiAgICAgIHRocm93IG5ldyBTZXNzaW9uRXhwaXJlZEVycm9yKG9wZXJhdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2NsaWVudC5jbGllbnQ7XG4gIH1cblxuICAvKiogUmV2b2tlcyB0aGUgc2Vzc2lvbi4gKi9cbiAgYXN5bmMgcmV2b2tlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBPcENsaWVudChcInJldm9rZUN1cnJlbnRTZXNzaW9uXCIsIGF3YWl0IHRoaXMuY2xpZW50KCksIHRoaXMuI2V2ZW50RW1pdHRlcik7XG4gICAgYXdhaXQgY2xpZW50LmRlbChcIi92MC9vcmcve29yZ19pZH0vc2Vzc2lvbi9zZWxmXCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy5vcmdJZCB9IH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaGVzIHRoZSBzZXNzaW9uIGFuZCAqKlVQREFURVMvTVVUQVRFUyoqIHNlbGYuXG4gICAqL1xuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmhhc0V4cGlyZWQoKSkge1xuICAgICAgYXdhaXQgdGhpcy4jZXZlbnRFbWl0dGVyLmVtaXRTZXNzaW9uRXhwaXJlZCgpO1xuICAgICAgdGhyb3cgbmV3IFNlc3Npb25FeHBpcmVkRXJyb3IoXCJzaWduZXJTZXNzaW9uUmVmcmVzaFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyU2Vzc2lvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZS5yZXRyaWV2ZSgpO1xuXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IE9wQ2xpZW50KFwic2lnbmVyU2Vzc2lvblJlZnJlc2hcIiwgdGhpcy4jY2xpZW50LmNsaWVudCwgdGhpcy4jZXZlbnRFbWl0dGVyKTtcbiAgICBjb25zdCBjc2kgPSBjdXJyU2Vzc2lvbi5zZXNzaW9uX2luZm87XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGNsaWVudC5wYXRjaChcIi92MS9vcmcve29yZ19pZH0vdG9rZW4vcmVmcmVzaFwiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMub3JnSWQgfSB9LFxuICAgICAgYm9keTogPFJlZnJlc2hTaWduZXJTZXNzaW9uUmVxdWVzdD57XG4gICAgICAgIGVwb2NoX251bTogY3NpLmVwb2NoLFxuICAgICAgICBlcG9jaF90b2tlbjogY3NpLmVwb2NoX3Rva2VuLFxuICAgICAgICBvdGhlcl90b2tlbjogY3NpLnJlZnJlc2hfdG9rZW4sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IG5ld1Nlc3Npb24gPSA8U2lnbmVyU2Vzc2lvbkRhdGE+e1xuICAgICAgLi4uY3VyclNlc3Npb24sXG4gICAgICBzZXNzaW9uX2luZm86IGRhdGEuc2Vzc2lvbl9pbmZvLFxuICAgICAgdG9rZW46IGRhdGEudG9rZW4sXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5zYXZlKG5ld1Nlc3Npb24pO1xuICAgIHRoaXMuI2NsaWVudCA9IHtcbiAgICAgIGNsaWVudDogdGhpcy4jY3JlYXRlQ2xpZW50KG5ld1Nlc3Npb24udG9rZW4pLFxuICAgICAgdG9rZW5fZXhwOiBzZWNvbmRzU2luY2VFcG9jaFRvRGF0ZShuZXdTZXNzaW9uLnNlc3Npb25faW5mby5hdXRoX3Rva2VuX2V4cCksXG4gICAgICBzZXNzaW9uX2V4cDogbmV3U2Vzc2lvbi5zZXNzaW9uX2V4cFxuICAgICAgICA/IHNlY29uZHNTaW5jZUVwb2NoVG9EYXRlKG5ld1Nlc3Npb24uc2Vzc2lvbl9leHApXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIGl0J3MgdGltZSB0byByZWZyZXNoIHRoaXMgdG9rZW4uXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgaXQncyB0aW1lIHRvIHJlZnJlc2ggdGhpcyB0b2tlbi5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBhc3luYyBpc1N0YWxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBTaWduZXJTZXNzaW9uTWFuYWdlci4jaGFzVGltZXN0YW1wRXhwaXJlZChcbiAgICAgIHRoaXMuI2NsaWVudC50b2tlbl9leHAsXG4gICAgICBERUZBVUxUX0VYUElSQVRJT05fQlVGRkVSX1NFQ1MsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIHNlc3Npb24gaGFzIGV4cGlyZWQgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQgYW55bW9yZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHNlc3Npb24gaGFzIGV4cGlyZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgaGFzRXhwaXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMuI2NsaWVudC5zZXNzaW9uX2V4cCB8fCBmYWxzZSkgJiZcbiAgICAgIFNpZ25lclNlc3Npb25NYW5hZ2VyLiNoYXNUaW1lc3RhbXBFeHBpcmVkKHRoaXMuI2NsaWVudC5zZXNzaW9uX2V4cClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgc2Vzc2lvbiBpZiBpdCBpcyBhYm91dCB0byBleHBpcmUuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNlc3Npb24gdG9rZW4gd2FzIHJlZnJlc2hlZC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBhc3luYyByZWZyZXNoSWZOZWVkZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGF3YWl0IHRoaXMuaXNTdGFsZSgpKSB7XG4gICAgICBpZiAodGhpcy4jcmVmcmVzaGluZykge1xuICAgICAgICAvLyB3YWl0IHVudGlsIGRvbmUgcmVmcmVzaGluZ1xuICAgICAgICB3aGlsZSAodGhpcy4jcmVmcmVzaGluZykge1xuICAgICAgICAgIGF3YWl0IGRlbGF5KDEwMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVmcmVzaFxuICAgICAgICB0aGlzLiNyZWZyZXNoaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLiNyZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQXV0b21hdGljYWxseSByZWZyZXNoZXMgdGhlIHNlc3Npb24gaW4gdGhlIGJhY2tncm91bmQgKGlmIG5lZWRlZCkgZXZlcnlcbiAgICogbWludXRlLiBUaGlzIGlzIGEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGBzZXRJbnRlcnZhbGAuXG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGludGVydmFsIElEIG9mIHRoZSByZWZyZXNoIHRpbWVyLlxuICAgKi9cbiAgYXV0b1JlZnJlc2goKTogUmVmcmVzaElkIHtcbiAgICByZXR1cm4gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoSWZOZWVkZWQoKTtcbiAgICB9LCA2MCAqIDEwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgYXV0byByZWZyZXNoIHRpbWVyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZXIgVGhlIHRpbWVyIElEIHRvIGNsZWFyLlxuICAgKi9cbiAgY2xlYXJBdXRvUmVmcmVzaCh0aW1lcjogUmVmcmVzaElkKTogdm9pZCB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbnZJbnRlcmZhY2V9IGVudiBUaGUgQ3ViZVNpZ25lciBlbnZpcm9ubWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3JnSWQgVGhlIG9yZ2FuaXphdGlvbiBJRFxuICAgKiBAcGFyYW0ge05ld1Nlc3Npb25SZXNwb25zZX0gc2Vzc2lvbiBUaGUgc2Vzc2lvbiBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtTaWduZXJTZXNzaW9uU3RvcmFnZX0gc3RvcmFnZSBUaGUgc3RvcmFnZSB0byB1c2UgZm9yIHNhdmluZyB0aGUgc2Vzc2lvbi5cbiAgICogQHJldHVybiB7UHJvbWlzZTxTaWduZXJTZXNzaW9uTWFuYWdlcj59IE5ldyBzaWduZXIgc2Vzc2lvbiBtYW5hZ2VyLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUZyb21TZXNzaW9uSW5mbyhcbiAgICBlbnY6IEVudkludGVyZmFjZSxcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHNlc3Npb246IE5ld1Nlc3Npb25SZXNwb25zZSxcbiAgICBzdG9yYWdlPzogU2lnbmVyU2Vzc2lvblN0b3JhZ2UsXG4gICk6IFByb21pc2U8U2lnbmVyU2Vzc2lvbk1hbmFnZXI+IHtcbiAgICBjb25zdCBzZXNzaW9uRGF0YSA9IHtcbiAgICAgIGVudjoge1xuICAgICAgICBbXCJEZXYtQ3ViZVNpZ25lclN0YWNrXCJdOiBlbnYsXG4gICAgICB9LFxuICAgICAgb3JnX2lkOiBvcmdJZCxcbiAgICAgIHRva2VuOiBzZXNzaW9uLnRva2VuLFxuICAgICAgcHVycG9zZTogXCJzaWduIHZpYSBvaWRjXCIsXG4gICAgICBzZXNzaW9uX2luZm86IHNlc3Npb24uc2Vzc2lvbl9pbmZvLFxuICAgICAgc2Vzc2lvbl9leHA6IHNlc3Npb24uZXhwaXJhdGlvbiEsXG4gICAgfTtcbiAgICBzdG9yYWdlID8/PSBuZXcgTWVtb3J5U2Vzc2lvblN0b3JhZ2UoKTtcbiAgICBhd2FpdCBzdG9yYWdlLnNhdmUoc2Vzc2lvbkRhdGEpO1xuICAgIHJldHVybiBuZXcgU2lnbmVyU2Vzc2lvbk1hbmFnZXIoc2Vzc2lvbkRhdGEsIHN0b3JhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U2lnbmVyU2Vzc2lvbkRhdGF9IHNlc3Npb25EYXRhIFRoZSBzZXNzaW9uIGluZm9ybWF0aW9uLlxuICAgKiBAcGFyYW0ge1NpZ25lclNlc3Npb25TdG9yYWdlfSBzdG9yYWdlIFRoZSBzdG9yYWdlIHRvIHVzZSBmb3Igc2F2aW5nIHRoZSBzZXNzaW9uLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lclNlc3Npb25NYW5hZ2VyPn0gTmV3IHNpZ25lciBzZXNzaW9uIG1hbmFnZXIuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY3JlYXRlRnJvbVNlc3Npb25EYXRhKFxuICAgIHNlc3Npb25EYXRhOiBTaWduZXJTZXNzaW9uRGF0YSxcbiAgICBzdG9yYWdlPzogU2lnbmVyU2Vzc2lvblN0b3JhZ2UsXG4gICk6IFByb21pc2U8U2lnbmVyU2Vzc2lvbk1hbmFnZXI+IHtcbiAgICBzdG9yYWdlID8/PSBuZXcgTWVtb3J5U2Vzc2lvblN0b3JhZ2UoKTtcbiAgICBhd2FpdCBzdG9yYWdlLnNhdmUoc2Vzc2lvbkRhdGEpO1xuICAgIHJldHVybiBuZXcgU2lnbmVyU2Vzc2lvbk1hbmFnZXIoc2Vzc2lvbkRhdGEsIHN0b3JhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXMgYW4gZXhpc3Rpbmcgc2Vzc2lvbiB0byBjcmVhdGUgYSBuZXcgc2lnbmVyIHNlc3Npb24gbWFuYWdlci5cbiAgICpcbiAgICogQHBhcmFtIHtTaWduZXJTZXNzaW9uU3RvcmFnZX0gc3RvcmFnZSBUaGUgc2Vzc2lvbiBzdG9yYWdlIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNpbmdlclNlc3Npb24+fSBOZXcgc2lnbmVyIHNlc3Npb24gbWFuYWdlclxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGxvYWRGcm9tU3RvcmFnZShzdG9yYWdlOiBTaWduZXJTZXNzaW9uU3RvcmFnZSk6IFByb21pc2U8U2lnbmVyU2Vzc2lvbk1hbmFnZXI+IHtcbiAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RvcmFnZS5yZXRyaWV2ZSgpO1xuICAgIHJldHVybiBuZXcgU2lnbmVyU2Vzc2lvbk1hbmFnZXIoc2Vzc2lvbiwgc3RvcmFnZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7U2lnbmVyU2Vzc2lvbkRhdGF9IHNlc3Npb25EYXRhIFNlc3Npb24gZGF0YVxuICAgKiBAcGFyYW0ge1NpZ25lclNlc3Npb25TdG9yYWdlfSBzdG9yYWdlIFRoZSBzZXNzaW9uIHN0b3JhZ2UgdG8gdXNlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2Vzc2lvbkRhdGE6IFNpZ25lclNlc3Npb25EYXRhLCBzdG9yYWdlOiBTaWduZXJTZXNzaW9uU3RvcmFnZSkge1xuICAgIHRoaXMuZW52ID0gc2Vzc2lvbkRhdGEuZW52W1wiRGV2LUN1YmVTaWduZXJTdGFja1wiXTtcbiAgICB0aGlzLm9yZ0lkID0gc2Vzc2lvbkRhdGEub3JnX2lkO1xuICAgIHRoaXMuc3RvcmFnZSA9IHN0b3JhZ2U7XG4gICAgdGhpcy4jZXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcihbdGhpcy5ldmVudHNdKTtcbiAgICB0aGlzLiNjbGllbnQgPSB7XG4gICAgICBjbGllbnQ6IHRoaXMuI2NyZWF0ZUNsaWVudChzZXNzaW9uRGF0YS50b2tlbiksXG4gICAgICB0b2tlbl9leHA6IHNlY29uZHNTaW5jZUVwb2NoVG9EYXRlKHNlc3Npb25EYXRhLnNlc3Npb25faW5mby5hdXRoX3Rva2VuX2V4cCksXG4gICAgICBzZXNzaW9uX2V4cDogc2Vzc2lvbkRhdGEuc2Vzc2lvbl9leHBcbiAgICAgICAgPyBzZWNvbmRzU2luY2VFcG9jaFRvRGF0ZShzZXNzaW9uRGF0YS5zZXNzaW9uX2V4cClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFJFU1QgY2xpZW50IHdpdGggYSBnaXZlbiB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW4gVGhlIGF1dGhvcml6YXRpb24gdG9rZW4gdG8gdXNlIGZvciB0aGUgY2xpZW50XG4gICAqIEByZXR1cm4ge0NsaWVudH0gVGhlIG5ldyBSRVNUIGNsaWVudFxuICAgKi9cbiAgI2NyZWF0ZUNsaWVudCh0b2tlbjogc3RyaW5nKTogQ2xpZW50IHtcbiAgICByZXR1cm4gY3JlYXRlSHR0cENsaWVudCh0aGlzLmVudi5TaWduZXJBcGlSb290LCB0b2tlbik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0aW1lc3RhbXAgaXMgd2l0aGluIHtAbGluayBidWZmZXJTZWNvbmRzfSBzZWNvbmRzIGZyb20gZXhwaXJhdGlvbi5cbiAgICogQHBhcmFtIHtEYXRlfSBleHAgVGhlIHRpbWVzdGFtcCB0byBjaGVja1xuICAgKiBAcGFyYW0ge251bWJlcn0gYnVmZmVyU2Vjb25kcyBUaW1lIGJ1ZmZlciBpbiBzZWNvbmRzIChkZWZhdWx0cyB0byAwcylcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdGltZXN0YW1wIGhhcyBleHBpcmVkXG4gICAqL1xuICBzdGF0aWMgI2hhc1RpbWVzdGFtcEV4cGlyZWQoZXhwOiBEYXRlLCBidWZmZXJTZWNvbmRzPzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgYnVmZmVyU2Vjb25kcyA/Pz0gMDtcbiAgICBjb25zdCBleHBNc1NpbmNlRXBvY2ggPSBleHAuZ2V0VGltZSgpO1xuICAgIGNvbnN0IG5vd01zU2luY2VFcG9jaCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGJ1ZmZlck1zID0gYnVmZmVyU2Vjb25kcyAqIDEwMDA7XG4gICAgcmV0dXJuIGV4cE1zU2luY2VFcG9jaCA8IG5vd01zU2luY2VFcG9jaCArIGJ1ZmZlck1zO1xuICB9XG59XG5cbi8qKiBUeXBlIG9mIHRoZSByZWZyZXNoIHRpbWVyIElELiAqL1xuZXhwb3J0IHR5cGUgUmVmcmVzaElkID0gUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuIl19
|