@cubist-labs/cubesigner-sdk 0.2.2 → 0.2.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +68 -0
- package/dist/src/api.d.ts +493 -0
- package/dist/src/api.js +1166 -0
- package/dist/src/client.d.ts +432 -335
- package/dist/src/client.js +195 -863
- package/dist/src/ethers/index.d.ts +33 -6
- package/dist/src/ethers/index.js +59 -12
- package/dist/src/index.d.ts +31 -26
- package/dist/src/index.js +51 -32
- package/dist/src/key.d.ts +28 -21
- package/dist/src/key.js +17 -10
- package/dist/src/mfa.d.ts +7 -7
- package/dist/src/mfa.js +20 -32
- package/dist/src/org.d.ts +37 -279
- package/dist/src/org.js +48 -194
- package/dist/src/paginator.js +1 -1
- package/dist/src/response.d.ts +101 -0
- package/dist/src/response.js +164 -0
- package/dist/src/role.d.ts +11 -9
- package/dist/src/role.js +1 -1
- package/dist/src/schema.d.ts +586 -10
- package/dist/src/schema.js +1 -1
- package/dist/src/schema_types.d.ts +6 -0
- package/dist/src/schema_types.js +1 -1
- package/dist/src/session/cognito_manager.d.ts +15 -3
- package/dist/src/session/cognito_manager.js +23 -5
- package/dist/src/session/session_manager.d.ts +1 -1
- package/dist/src/session/session_manager.js +3 -11
- package/dist/src/session/session_storage.js +1 -1
- package/dist/src/session/signer_session_manager.d.ts +3 -7
- package/dist/src/session/signer_session_manager.js +2 -8
- package/dist/src/signer_session.d.ts +8 -266
- package/dist/src/signer_session.js +15 -221
- package/dist/src/user_export.d.ts +52 -0
- package/dist/src/user_export.js +129 -0
- package/dist/src/util.d.ts +15 -0
- package/dist/src/util.js +33 -11
- package/package.json +12 -10
- package/src/api.ts +1395 -0
- package/src/client.ts +216 -1025
- package/src/ethers/index.ts +70 -12
- package/src/index.ts +59 -43
- package/src/key.ts +19 -12
- package/src/mfa.ts +16 -28
- package/src/org.ts +49 -204
- package/src/response.ts +196 -0
- package/src/role.ts +5 -3
- package/src/schema.ts +586 -10
- package/src/schema_types.ts +7 -0
- package/src/session/cognito_manager.ts +33 -6
- package/src/session/session_manager.ts +2 -8
- package/src/session/signer_session_manager.ts +3 -10
- package/src/signer_session.ts +13 -261
- package/src/user_export.ts +116 -0
- package/src/util.ts +29 -10
|
@@ -1,89 +1,6 @@
|
|
|
1
|
-
import { CubeSigner, MfaReceipt, KeyInfo } from ".";
|
|
2
1
|
import { CubeSignerClient } from "./client";
|
|
3
|
-
import {
|
|
2
|
+
import { KeyInfo } from "./key";
|
|
4
3
|
import { SignerSessionManager, SignerSessionStorage } from "./session/signer_session_manager";
|
|
5
|
-
type Response<U> = U | AcceptedResponse;
|
|
6
|
-
type RequestFn<U> = (headers?: HeadersInit) => Promise<Response<U>>;
|
|
7
|
-
type MapFn<U, V> = (u: U) => V;
|
|
8
|
-
/**
|
|
9
|
-
* Takes a {@link Response<U>} and a {@link MapFn<U, V>} function and returns
|
|
10
|
-
* a {@link Response<V>} that maps the value of the original response when its status code is 200.
|
|
11
|
-
*
|
|
12
|
-
* @param {Response<U>} resp Original response
|
|
13
|
-
* @param {Map<U, V>} mapFn Map to apply to the response value when its status code is 200.
|
|
14
|
-
* @return {Response<V>} Response whose value for status code 200 is mapped from U to V
|
|
15
|
-
*/
|
|
16
|
-
export declare function mapResponse<U, V>(resp: Response<U>, mapFn: MapFn<U, V>): Response<V>;
|
|
17
|
-
export interface MfaRequired {
|
|
18
|
-
/** Org id */
|
|
19
|
-
org_id: string;
|
|
20
|
-
/** MFA request id */
|
|
21
|
-
id: string;
|
|
22
|
-
/** Optional MFA session */
|
|
23
|
-
session?: NewSessionResponse | null;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* A response of a CubeSigner request.
|
|
27
|
-
*/
|
|
28
|
-
export declare class CubeSignerResponse<U> {
|
|
29
|
-
#private;
|
|
30
|
-
/** @return {string} The MFA id associated with this request */
|
|
31
|
-
mfaId(): string;
|
|
32
|
-
/** @return {boolean} True if this request requires an MFA approval */
|
|
33
|
-
requiresMfa(): boolean;
|
|
34
|
-
/**
|
|
35
|
-
* Returns session information to use for any MFA approval requests (if any was included in the response).
|
|
36
|
-
* @return {ClientSessionInfo | undefined}
|
|
37
|
-
*/
|
|
38
|
-
mfaSessionInfo(): NewSessionResponse | undefined;
|
|
39
|
-
/** @return {U} The response data, if no MFA is required */
|
|
40
|
-
data(): U;
|
|
41
|
-
/**
|
|
42
|
-
* Approves the MFA request using a given session and a TOTP code.
|
|
43
|
-
*
|
|
44
|
-
* @param {SignerSession} session Signer session to use
|
|
45
|
-
* @param {string} code 6-digit TOTP code
|
|
46
|
-
* @return {CubeSignerResponse<U>} The result of signing with the approval
|
|
47
|
-
*/
|
|
48
|
-
approveTotp(session: SignerSession, code: string): Promise<CubeSignerResponse<U>>;
|
|
49
|
-
/**
|
|
50
|
-
* Approves the MFA request using a given `CubeSignerClient` instance (i.e., its session).
|
|
51
|
-
*
|
|
52
|
-
* @param {CubeSigner} cs CubeSigner whose session to use
|
|
53
|
-
* @return {CubeSignerResponse<U>} The result of signing with the approval
|
|
54
|
-
*/
|
|
55
|
-
approve(cs: CubeSigner): Promise<CubeSignerResponse<U>>;
|
|
56
|
-
/**
|
|
57
|
-
* @param {MfaReceipt} mfaReceipt The MFA receipt
|
|
58
|
-
* @return {Promise<CubeSignerResponse<U>>} The result of signing after MFA approval
|
|
59
|
-
*/
|
|
60
|
-
signWithMfaApproval(mfaReceipt: MfaReceipt): Promise<CubeSignerResponse<U>>;
|
|
61
|
-
/**
|
|
62
|
-
* Constructor.
|
|
63
|
-
*
|
|
64
|
-
* @param {RequestFn} requestFn
|
|
65
|
-
* The signing function that this response is from.
|
|
66
|
-
* This argument is used to resend requests with different headers if needed.
|
|
67
|
-
* @param {U | AcceptedResponse} resp The response as returned by the OpenAPI client.
|
|
68
|
-
*/
|
|
69
|
-
constructor(requestFn: RequestFn<U>, resp: U | AcceptedResponse);
|
|
70
|
-
/**
|
|
71
|
-
* Static constructor.
|
|
72
|
-
* @param {RequestFn} requestFn
|
|
73
|
-
* The request function that this response is from.
|
|
74
|
-
* This argument is used to resend requests with different headers if needed.
|
|
75
|
-
* @param {MfaReceipt} mfaReceipt Optional MFA receipt
|
|
76
|
-
* @return {Promise<CubeSignerResponse<U>>} New instance of this class.
|
|
77
|
-
*/
|
|
78
|
-
static create<U>(requestFn: RequestFn<U>, mfaReceipt?: MfaReceipt): Promise<CubeSignerResponse<U>>;
|
|
79
|
-
/**
|
|
80
|
-
* Returns HTTP headers containing a given MFA receipt.
|
|
81
|
-
*
|
|
82
|
-
* @param {MfaReceipt} mfaReceipt MFA receipt
|
|
83
|
-
* @return {HeadersInit} Headers including that receipt
|
|
84
|
-
*/
|
|
85
|
-
static getMfaHeaders(mfaReceipt?: MfaReceipt): HeadersInit | undefined;
|
|
86
|
-
}
|
|
87
4
|
/** Signer session info. Can only be used to revoke a token, but not for authentication. */
|
|
88
5
|
export declare class SignerSessionInfo {
|
|
89
6
|
#private;
|
|
@@ -101,188 +18,9 @@ export declare class SignerSessionInfo {
|
|
|
101
18
|
}
|
|
102
19
|
/**
|
|
103
20
|
* Signer session.
|
|
104
|
-
*
|
|
105
|
-
* @deprecated Use {@link CubeSignerClient} instead.
|
|
21
|
+
* Extends {@link CubeSignerClient} and provides a few convenience methods on top.
|
|
106
22
|
*/
|
|
107
|
-
export declare class SignerSession {
|
|
108
|
-
#private;
|
|
109
|
-
/** Deprecated */
|
|
110
|
-
get sessionMgr(): SignerSessionManager;
|
|
111
|
-
/** Org id */
|
|
112
|
-
get orgId(): string;
|
|
113
|
-
/**
|
|
114
|
-
* Returns the list of keys that this token grants access to.
|
|
115
|
-
* @return {KeyInfo[]} The list of keys.
|
|
116
|
-
*/
|
|
117
|
-
keys(): Promise<KeyInfo[]>;
|
|
118
|
-
/** Approve a pending MFA request using TOTP. */
|
|
119
|
-
get totpApprove(): (mfaId: string, code: string) => Promise<{
|
|
120
|
-
expires_at: number;
|
|
121
|
-
id: string;
|
|
122
|
-
receipt?: {
|
|
123
|
-
confirmation: string;
|
|
124
|
-
final_approver: string;
|
|
125
|
-
timestamp: number;
|
|
126
|
-
} | null | undefined;
|
|
127
|
-
request: {
|
|
128
|
-
body?: Record<string, unknown> | null | undefined;
|
|
129
|
-
method: string;
|
|
130
|
-
path: string;
|
|
131
|
-
};
|
|
132
|
-
status: {
|
|
133
|
-
allowed_approvers: string[];
|
|
134
|
-
allowed_mfa_types?: ("CubeSigner" | "Totp" | "Fido")[] | null | undefined;
|
|
135
|
-
approved_by: {
|
|
136
|
-
[key: string]: {
|
|
137
|
-
[key: string]: {
|
|
138
|
-
timestamp: number;
|
|
139
|
-
};
|
|
140
|
-
};
|
|
141
|
-
};
|
|
142
|
-
count: number;
|
|
143
|
-
num_auth_factors: number;
|
|
144
|
-
};
|
|
145
|
-
}>;
|
|
146
|
-
/** Initiate approval of an existing MFA request using FIDO. */
|
|
147
|
-
get fidoApproveStart(): (mfaId: string) => Promise<import("./mfa").MfaFidoChallenge>;
|
|
148
|
-
/** Get a pending MFA request by its id. */
|
|
149
|
-
get getMfaInfo(): (mfaId: string) => Promise<{
|
|
150
|
-
expires_at: number;
|
|
151
|
-
id: string;
|
|
152
|
-
receipt?: {
|
|
153
|
-
confirmation: string;
|
|
154
|
-
final_approver: string;
|
|
155
|
-
timestamp: number;
|
|
156
|
-
} | null | undefined;
|
|
157
|
-
request: {
|
|
158
|
-
body?: Record<string, unknown> | null | undefined;
|
|
159
|
-
method: string;
|
|
160
|
-
path: string;
|
|
161
|
-
};
|
|
162
|
-
status: {
|
|
163
|
-
allowed_approvers: string[];
|
|
164
|
-
allowed_mfa_types?: ("CubeSigner" | "Totp" | "Fido")[] | null | undefined;
|
|
165
|
-
approved_by: {
|
|
166
|
-
[key: string]: {
|
|
167
|
-
[key: string]: {
|
|
168
|
-
timestamp: number;
|
|
169
|
-
};
|
|
170
|
-
};
|
|
171
|
-
};
|
|
172
|
-
count: number;
|
|
173
|
-
num_auth_factors: number;
|
|
174
|
-
};
|
|
175
|
-
}>;
|
|
176
|
-
/** Submit an EVM sign request. */
|
|
177
|
-
get signEvm(): (key: string | import("./key").Key, req: {
|
|
178
|
-
chain_id: number;
|
|
179
|
-
tx: Record<string, never>;
|
|
180
|
-
}, mfaReceipt?: MfaReceipt | undefined) => Promise<CubeSignerResponse<{
|
|
181
|
-
rlp_signed_tx: string;
|
|
182
|
-
}>>;
|
|
183
|
-
/** Submit an 'eth2' sign request. */
|
|
184
|
-
get signEth2(): (key: string | import("./key").Key, req: {
|
|
185
|
-
eth2_sign_request: Record<string, never>;
|
|
186
|
-
network: "mainnet" | "prater" | "goerli" | "holesky";
|
|
187
|
-
}, mfaReceipt?: MfaReceipt | undefined) => Promise<CubeSignerResponse<{
|
|
188
|
-
signature: string;
|
|
189
|
-
}>>;
|
|
190
|
-
/** Sign a stake request. */
|
|
191
|
-
get stake(): (req: {
|
|
192
|
-
chain_id: number;
|
|
193
|
-
deposit_type: "Canonical" | "Wrapper";
|
|
194
|
-
staking_amount_gwei?: number | undefined;
|
|
195
|
-
unsafe_conf?: {
|
|
196
|
-
deposit_contract_addr?: string | null | undefined;
|
|
197
|
-
genesis_fork_version?: string | null | undefined;
|
|
198
|
-
} | null | undefined;
|
|
199
|
-
validator_key?: string | null | undefined;
|
|
200
|
-
withdrawal_addr: string;
|
|
201
|
-
}, mfaReceipt?: MfaReceipt | undefined) => Promise<CubeSignerResponse<{
|
|
202
|
-
created_validator_key_id: string;
|
|
203
|
-
deposit_tx: {
|
|
204
|
-
chain_id: number;
|
|
205
|
-
deposit_txn: Record<string, never>;
|
|
206
|
-
new_validator_pk: string;
|
|
207
|
-
};
|
|
208
|
-
}>>;
|
|
209
|
-
/** Sign an unstake request. */
|
|
210
|
-
get unstake(): (key: string | import("./key").Key, req: {
|
|
211
|
-
epoch?: string | null | undefined;
|
|
212
|
-
fork: {
|
|
213
|
-
current_version: string;
|
|
214
|
-
epoch: string;
|
|
215
|
-
previous_version: string;
|
|
216
|
-
};
|
|
217
|
-
genesis_data: {
|
|
218
|
-
genesis_fork_version: string;
|
|
219
|
-
genesis_time: string;
|
|
220
|
-
genesis_validators_root: string;
|
|
221
|
-
};
|
|
222
|
-
network: "mainnet" | "prater" | "goerli" | "holesky";
|
|
223
|
-
validator_index: string;
|
|
224
|
-
}, mfaReceipt?: MfaReceipt | undefined) => Promise<CubeSignerResponse<{
|
|
225
|
-
message: {
|
|
226
|
-
epoch: string;
|
|
227
|
-
validator_index: string;
|
|
228
|
-
};
|
|
229
|
-
signature: string;
|
|
230
|
-
}>>;
|
|
231
|
-
/** Sign a raw blob.*/
|
|
232
|
-
get signBlob(): (key: string | import("./key").Key, req: {
|
|
233
|
-
message_base64: string;
|
|
234
|
-
}, mfaReceipt?: MfaReceipt | undefined) => Promise<CubeSignerResponse<{
|
|
235
|
-
signature: string;
|
|
236
|
-
}>>;
|
|
237
|
-
/** Sign a bitcoin message. */
|
|
238
|
-
get signBtc(): (key: string | import("./key").Key, req: {
|
|
239
|
-
sig_kind: {
|
|
240
|
-
Segwit: {
|
|
241
|
-
input_index: number;
|
|
242
|
-
script_code: string;
|
|
243
|
-
sighash_type: "All" | "None" | "Single" | "AllPlusAnyoneCanPay" | "NonePlusAnyoneCanPay" | "SinglePlusAnyoneCanPay";
|
|
244
|
-
value: number;
|
|
245
|
-
};
|
|
246
|
-
};
|
|
247
|
-
tx: Record<string, never>;
|
|
248
|
-
}, mfaReceipt?: MfaReceipt | undefined) => Promise<CubeSignerResponse<{
|
|
249
|
-
signature: string;
|
|
250
|
-
}>>;
|
|
251
|
-
/** Sign a solana message. */
|
|
252
|
-
get signSolana(): (key: string | import("./key").Key, req: {
|
|
253
|
-
message_base64: string;
|
|
254
|
-
}, mfaReceipt?: MfaReceipt | undefined) => Promise<CubeSignerResponse<{
|
|
255
|
-
signature: string;
|
|
256
|
-
}>>;
|
|
257
|
-
/** Sign an Avalanche P- or X-chain message. */
|
|
258
|
-
get signAva(): (key: string | import("./key").Key, tx: import("./schema_types").AvaTx, mfaReceipt?: MfaReceipt | undefined) => Promise<CubeSignerResponse<{
|
|
259
|
-
signature: string;
|
|
260
|
-
}>>;
|
|
261
|
-
/**
|
|
262
|
-
* Obtain a proof of authentication.
|
|
263
|
-
*/
|
|
264
|
-
get proveIdentity(): () => Promise<{
|
|
265
|
-
aud?: string | null | undefined;
|
|
266
|
-
email: string;
|
|
267
|
-
exp_epoch: number;
|
|
268
|
-
identity?: {
|
|
269
|
-
iss: string;
|
|
270
|
-
sub: string;
|
|
271
|
-
} | null | undefined;
|
|
272
|
-
user_info?: {
|
|
273
|
-
configured_mfa: ({
|
|
274
|
-
type: "totp";
|
|
275
|
-
} | {
|
|
276
|
-
id: string;
|
|
277
|
-
name: string;
|
|
278
|
-
type: "fido";
|
|
279
|
-
})[];
|
|
280
|
-
initialized: boolean;
|
|
281
|
-
user_id: string;
|
|
282
|
-
} | null | undefined;
|
|
283
|
-
} & {
|
|
284
|
-
id: string;
|
|
285
|
-
}>;
|
|
23
|
+
export declare class SignerSession extends CubeSignerClient {
|
|
286
24
|
/**
|
|
287
25
|
* Loads an existing signer session from storage.
|
|
288
26
|
* @param {SignerSessionStorage} storage The session storage to use
|
|
@@ -295,5 +33,9 @@ export declare class SignerSession {
|
|
|
295
33
|
* @internal
|
|
296
34
|
*/
|
|
297
35
|
constructor(sessionMgr: SignerSessionManager);
|
|
36
|
+
/**
|
|
37
|
+
* Returns the list of keys that this token grants access to.
|
|
38
|
+
* @return {KeyInfo[]} The list of keys.
|
|
39
|
+
*/
|
|
40
|
+
keys(): Promise<KeyInfo[]>;
|
|
298
41
|
}
|
|
299
|
-
export {};
|
|
@@ -10,157 +10,12 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
10
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
11
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
12
|
};
|
|
13
|
-
var
|
|
14
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
-
};
|
|
16
|
-
var _CubeSignerResponse_requestFn, _CubeSignerResponse_resp, _CubeSignerResponse_mfaRequired, _SignerSessionInfo_csc, _SignerSessionInfo_sessionId, _SignerSession_csc;
|
|
13
|
+
var _SignerSessionInfo_csc, _SignerSessionInfo_sessionId;
|
|
17
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.SignerSession = exports.SignerSessionInfo =
|
|
19
|
-
const assert_1 = __importDefault(require("assert"));
|
|
20
|
-
const _1 = require(".");
|
|
15
|
+
exports.SignerSession = exports.SignerSessionInfo = void 0;
|
|
21
16
|
const client_1 = require("./client");
|
|
17
|
+
const key_1 = require("./key");
|
|
22
18
|
const signer_session_manager_1 = require("./session/signer_session_manager");
|
|
23
|
-
/**
|
|
24
|
-
* Takes a {@link Response<U>} and a {@link MapFn<U, V>} function and returns
|
|
25
|
-
* a {@link Response<V>} that maps the value of the original response when its status code is 200.
|
|
26
|
-
*
|
|
27
|
-
* @param {Response<U>} resp Original response
|
|
28
|
-
* @param {Map<U, V>} mapFn Map to apply to the response value when its status code is 200.
|
|
29
|
-
* @return {Response<V>} Response whose value for status code 200 is mapped from U to V
|
|
30
|
-
*/
|
|
31
|
-
function mapResponse(resp, mapFn) {
|
|
32
|
-
if (resp.accepted?.MfaRequired) {
|
|
33
|
-
return resp;
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
return mapFn(resp);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
exports.mapResponse = mapResponse;
|
|
40
|
-
/**
|
|
41
|
-
* A response of a CubeSigner request.
|
|
42
|
-
*/
|
|
43
|
-
class CubeSignerResponse {
|
|
44
|
-
/** @return {string} The MFA id associated with this request */
|
|
45
|
-
mfaId() {
|
|
46
|
-
return __classPrivateFieldGet(this, _CubeSignerResponse_mfaRequired, "f").id;
|
|
47
|
-
}
|
|
48
|
-
/** @return {boolean} True if this request requires an MFA approval */
|
|
49
|
-
requiresMfa() {
|
|
50
|
-
return __classPrivateFieldGet(this, _CubeSignerResponse_mfaRequired, "f") !== undefined;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Returns session information to use for any MFA approval requests (if any was included in the response).
|
|
54
|
-
* @return {ClientSessionInfo | undefined}
|
|
55
|
-
*/
|
|
56
|
-
mfaSessionInfo() {
|
|
57
|
-
return __classPrivateFieldGet(this, _CubeSignerResponse_resp, "f").accepted?.MfaRequired?.session ?? undefined;
|
|
58
|
-
}
|
|
59
|
-
/** @return {U} The response data, if no MFA is required */
|
|
60
|
-
data() {
|
|
61
|
-
if (this.requiresMfa()) {
|
|
62
|
-
throw new Error("Cannot call `data()` while MFA is required");
|
|
63
|
-
}
|
|
64
|
-
return __classPrivateFieldGet(this, _CubeSignerResponse_resp, "f");
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Approves the MFA request using a given session and a TOTP code.
|
|
68
|
-
*
|
|
69
|
-
* @param {SignerSession} session Signer session to use
|
|
70
|
-
* @param {string} code 6-digit TOTP code
|
|
71
|
-
* @return {CubeSignerResponse<U>} The result of signing with the approval
|
|
72
|
-
*/
|
|
73
|
-
async approveTotp(session, code) {
|
|
74
|
-
(0, assert_1.default)(this.requiresMfa());
|
|
75
|
-
const mfaId = this.mfaId();
|
|
76
|
-
const mfaOrgId = __classPrivateFieldGet(this, _CubeSignerResponse_mfaRequired, "f").org_id;
|
|
77
|
-
const mfaApproval = await session.totpApprove(mfaId, code);
|
|
78
|
-
(0, assert_1.default)(mfaApproval.id === mfaId);
|
|
79
|
-
const mfaConf = mfaApproval.receipt?.confirmation;
|
|
80
|
-
if (!mfaConf) {
|
|
81
|
-
return this;
|
|
82
|
-
}
|
|
83
|
-
return await this.signWithMfaApproval({ mfaId, mfaOrgId, mfaConf });
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Approves the MFA request using a given `CubeSignerClient` instance (i.e., its session).
|
|
87
|
-
*
|
|
88
|
-
* @param {CubeSigner} cs CubeSigner whose session to use
|
|
89
|
-
* @return {CubeSignerResponse<U>} The result of signing with the approval
|
|
90
|
-
*/
|
|
91
|
-
async approve(cs) {
|
|
92
|
-
(0, assert_1.default)(this.requiresMfa());
|
|
93
|
-
const mfaId = __classPrivateFieldGet(this, _CubeSignerResponse_mfaRequired, "f").id;
|
|
94
|
-
const mfaOrgId = __classPrivateFieldGet(this, _CubeSignerResponse_mfaRequired, "f").org_id;
|
|
95
|
-
const mfaApproval = await cs.mfaApprove(mfaOrgId, mfaId);
|
|
96
|
-
(0, assert_1.default)(mfaApproval.id === mfaId);
|
|
97
|
-
const mfaConf = mfaApproval.receipt?.confirmation;
|
|
98
|
-
if (!mfaConf) {
|
|
99
|
-
return this;
|
|
100
|
-
}
|
|
101
|
-
return await this.signWithMfaApproval({ mfaId, mfaOrgId, mfaConf });
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* @param {MfaReceipt} mfaReceipt The MFA receipt
|
|
105
|
-
* @return {Promise<CubeSignerResponse<U>>} The result of signing after MFA approval
|
|
106
|
-
*/
|
|
107
|
-
async signWithMfaApproval(mfaReceipt) {
|
|
108
|
-
const headers = CubeSignerResponse.getMfaHeaders(mfaReceipt);
|
|
109
|
-
return new CubeSignerResponse(__classPrivateFieldGet(this, _CubeSignerResponse_requestFn, "f"), await __classPrivateFieldGet(this, _CubeSignerResponse_requestFn, "f").call(this, headers));
|
|
110
|
-
}
|
|
111
|
-
// --------------------------------------------------------------------------
|
|
112
|
-
// -- INTERNAL --------------------------------------------------------------
|
|
113
|
-
// --------------------------------------------------------------------------
|
|
114
|
-
/**
|
|
115
|
-
* Constructor.
|
|
116
|
-
*
|
|
117
|
-
* @param {RequestFn} requestFn
|
|
118
|
-
* The signing function that this response is from.
|
|
119
|
-
* This argument is used to resend requests with different headers if needed.
|
|
120
|
-
* @param {U | AcceptedResponse} resp The response as returned by the OpenAPI client.
|
|
121
|
-
*/
|
|
122
|
-
constructor(requestFn, resp) {
|
|
123
|
-
_CubeSignerResponse_requestFn.set(this, void 0);
|
|
124
|
-
_CubeSignerResponse_resp.set(this, void 0);
|
|
125
|
-
/**
|
|
126
|
-
* Optional MFA id. Only set if there is an MFA request associated with the
|
|
127
|
-
* signing request
|
|
128
|
-
*/
|
|
129
|
-
_CubeSignerResponse_mfaRequired.set(this, void 0);
|
|
130
|
-
__classPrivateFieldSet(this, _CubeSignerResponse_requestFn, requestFn, "f");
|
|
131
|
-
__classPrivateFieldSet(this, _CubeSignerResponse_resp, resp, "f");
|
|
132
|
-
__classPrivateFieldSet(this, _CubeSignerResponse_mfaRequired, __classPrivateFieldGet(this, _CubeSignerResponse_resp, "f").accepted?.MfaRequired, "f");
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Static constructor.
|
|
136
|
-
* @param {RequestFn} requestFn
|
|
137
|
-
* The request function that this response is from.
|
|
138
|
-
* This argument is used to resend requests with different headers if needed.
|
|
139
|
-
* @param {MfaReceipt} mfaReceipt Optional MFA receipt
|
|
140
|
-
* @return {Promise<CubeSignerResponse<U>>} New instance of this class.
|
|
141
|
-
*/
|
|
142
|
-
static async create(requestFn, mfaReceipt) {
|
|
143
|
-
const seed = await requestFn(this.getMfaHeaders(mfaReceipt));
|
|
144
|
-
return new CubeSignerResponse(requestFn, seed);
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Returns HTTP headers containing a given MFA receipt.
|
|
148
|
-
*
|
|
149
|
-
* @param {MfaReceipt} mfaReceipt MFA receipt
|
|
150
|
-
* @return {HeadersInit} Headers including that receipt
|
|
151
|
-
*/
|
|
152
|
-
static getMfaHeaders(mfaReceipt) {
|
|
153
|
-
return mfaReceipt
|
|
154
|
-
? {
|
|
155
|
-
"x-cubist-mfa-id": mfaReceipt.mfaId,
|
|
156
|
-
"x-cubist-mfa-org-id": mfaReceipt.mfaOrgId,
|
|
157
|
-
"x-cubist-mfa-confirmation": mfaReceipt.mfaConf,
|
|
158
|
-
}
|
|
159
|
-
: undefined;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
exports.CubeSignerResponse = CubeSignerResponse;
|
|
163
|
-
_CubeSignerResponse_requestFn = new WeakMap(), _CubeSignerResponse_resp = new WeakMap(), _CubeSignerResponse_mfaRequired = new WeakMap();
|
|
164
19
|
/** Signer session info. Can only be used to revoke a token, but not for authentication. */
|
|
165
20
|
class SignerSessionInfo {
|
|
166
21
|
/** Revoke this session */
|
|
@@ -189,76 +44,9 @@ exports.SignerSessionInfo = SignerSessionInfo;
|
|
|
189
44
|
_SignerSessionInfo_csc = new WeakMap(), _SignerSessionInfo_sessionId = new WeakMap();
|
|
190
45
|
/**
|
|
191
46
|
* Signer session.
|
|
192
|
-
*
|
|
193
|
-
* @deprecated Use {@link CubeSignerClient} instead.
|
|
47
|
+
* Extends {@link CubeSignerClient} and provides a few convenience methods on top.
|
|
194
48
|
*/
|
|
195
|
-
class SignerSession {
|
|
196
|
-
/** Deprecated */
|
|
197
|
-
get sessionMgr() {
|
|
198
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").sessionMgr;
|
|
199
|
-
}
|
|
200
|
-
/** Org id */
|
|
201
|
-
get orgId() {
|
|
202
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").orgId;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Returns the list of keys that this token grants access to.
|
|
206
|
-
* @return {KeyInfo[]} The list of keys.
|
|
207
|
-
*/
|
|
208
|
-
async keys() {
|
|
209
|
-
const keys = await __classPrivateFieldGet(this, _SignerSession_csc, "f").sessionKeysList();
|
|
210
|
-
return keys.map((k) => (0, _1.toKeyInfo)(k));
|
|
211
|
-
}
|
|
212
|
-
/** Approve a pending MFA request using TOTP. */
|
|
213
|
-
get totpApprove() {
|
|
214
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").mfaApproveTotp.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
215
|
-
}
|
|
216
|
-
/** Initiate approval of an existing MFA request using FIDO. */
|
|
217
|
-
get fidoApproveStart() {
|
|
218
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").mfaApproveFidoInit.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
219
|
-
}
|
|
220
|
-
/** Get a pending MFA request by its id. */
|
|
221
|
-
get getMfaInfo() {
|
|
222
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").mfaGet.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
223
|
-
}
|
|
224
|
-
/** Submit an EVM sign request. */
|
|
225
|
-
get signEvm() {
|
|
226
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").signEvm.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
227
|
-
}
|
|
228
|
-
/** Submit an 'eth2' sign request. */
|
|
229
|
-
get signEth2() {
|
|
230
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").signEth2.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
231
|
-
}
|
|
232
|
-
/** Sign a stake request. */
|
|
233
|
-
get stake() {
|
|
234
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").signStake.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
235
|
-
}
|
|
236
|
-
/** Sign an unstake request. */
|
|
237
|
-
get unstake() {
|
|
238
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").signUnstake.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
239
|
-
}
|
|
240
|
-
/** Sign a raw blob.*/
|
|
241
|
-
get signBlob() {
|
|
242
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").signBlob.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
243
|
-
}
|
|
244
|
-
/** Sign a bitcoin message. */
|
|
245
|
-
get signBtc() {
|
|
246
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").signBtc.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
247
|
-
}
|
|
248
|
-
/** Sign a solana message. */
|
|
249
|
-
get signSolana() {
|
|
250
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").signSolana.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
251
|
-
}
|
|
252
|
-
/** Sign an Avalanche P- or X-chain message. */
|
|
253
|
-
get signAva() {
|
|
254
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").signAva.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Obtain a proof of authentication.
|
|
258
|
-
*/
|
|
259
|
-
get proveIdentity() {
|
|
260
|
-
return __classPrivateFieldGet(this, _SignerSession_csc, "f").identityProve.bind(__classPrivateFieldGet(this, _SignerSession_csc, "f"));
|
|
261
|
-
}
|
|
49
|
+
class SignerSession extends client_1.CubeSignerClient {
|
|
262
50
|
/**
|
|
263
51
|
* Loads an existing signer session from storage.
|
|
264
52
|
* @param {SignerSessionStorage} storage The session storage to use
|
|
@@ -274,10 +62,16 @@ class SignerSession {
|
|
|
274
62
|
* @internal
|
|
275
63
|
*/
|
|
276
64
|
constructor(sessionMgr) {
|
|
277
|
-
|
|
278
|
-
|
|
65
|
+
super(sessionMgr);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Returns the list of keys that this token grants access to.
|
|
69
|
+
* @return {KeyInfo[]} The list of keys.
|
|
70
|
+
*/
|
|
71
|
+
async keys() {
|
|
72
|
+
const keys = await this.sessionKeysList();
|
|
73
|
+
return keys.map((k) => (0, key_1.toKeyInfo)(k));
|
|
279
74
|
}
|
|
280
75
|
}
|
|
281
76
|
exports.SignerSession = SignerSession;
|
|
282
|
-
|
|
283
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmVyX3Nlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2lnbmVyX3Nlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLHdCQUErRDtBQUMvRCxxQ0FBNEM7QUFFNUMsNkVBQThGO0FBTTlGOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixXQUFXLENBQU8sSUFBaUIsRUFBRSxLQUFrQjtJQUNyRSxJQUFLLElBQXlCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRTtRQUNwRCxPQUFPLElBQXdCLENBQUM7S0FDakM7U0FBTTtRQUNMLE9BQU8sS0FBSyxDQUFDLElBQVMsQ0FBQyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQU5ELGtDQU1DO0FBV0Q7O0dBRUc7QUFDSCxNQUFhLGtCQUFrQjtJQVM3QiwrREFBK0Q7SUFDL0QsS0FBSztRQUNILE9BQU8sdUJBQUEsSUFBSSx1Q0FBYyxDQUFDLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLFdBQVc7UUFDVCxPQUFPLHVCQUFBLElBQUksdUNBQWEsS0FBSyxTQUFTLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWM7UUFDWixPQUFRLHVCQUFBLElBQUksZ0NBQTJCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLElBQUksU0FBUyxDQUFDO0lBQ3RGLENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsSUFBSTtRQUNGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztTQUMvRDtRQUNELE9BQU8sdUJBQUEsSUFBSSxnQ0FBVyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQXNCLEVBQUUsSUFBWTtRQUNwRCxJQUFBLGdCQUFNLEVBQUMsSUFB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aW1wb3J0IHsgQ3ViZVNpZ25lciwgdG9LZXlJbmZvLCBNZmFSZWNlaXB0LCBLZXlJbmZvIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IEN1YmVTaWduZXJDbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB7IEFjY2VwdGVkUmVzcG9uc2UsIE5ld1Nlc3Npb25SZXNwb25zZSB9IGZyb20gXCIuL3NjaGVtYV90eXBlc1wiO1xuaW1wb3J0IHsgU2lnbmVyU2Vzc2lvbk1hbmFnZXIsIFNpZ25lclNlc3Npb25TdG9yYWdlIH0gZnJvbSBcIi4vc2Vzc2lvbi9zaWduZXJfc2Vzc2lvbl9tYW5hZ2VyXCI7XG5cbnR5cGUgUmVzcG9uc2U8VT4gPSBVIHwgQWNjZXB0ZWRSZXNwb25zZTtcbnR5cGUgUmVxdWVzdEZuPFU+ID0gKGhlYWRlcnM/OiBIZWFkZXJzSW5pdCkgPT4gUHJvbWlzZTxSZXNwb25zZTxVPj47XG50eXBlIE1hcEZuPFUsIFY+ID0gKHU6IFUpID0+IFY7XG5cbi8qKlxuICogVGFrZXMgYSB7QGxpbmsgUmVzcG9uc2U8VT59IGFuZCBhIHtAbGluayBNYXBGbjxVLCBWPn0gZnVuY3Rpb24gYW5kIHJldHVybnNcbiAqIGEge0BsaW5rIFJlc3BvbnNlPFY+fSB0aGF0IG1hcHMgdGhlIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCByZXNwb25zZSB3aGVuIGl0cyBzdGF0dXMgY29kZSBpcyAyMDAuXG4gKlxuICogQHBhcmFtIHtSZXNwb25zZTxVPn0gcmVzcCBPcmlnaW5hbCByZXNwb25zZVxuICogQHBhcmFtIHtNYXA8VSwgVj59IG1hcEZuIE1hcCB0byBhcHBseSB0byB0aGUgcmVzcG9uc2UgdmFsdWUgd2hlbiBpdHMgc3RhdHVzIGNvZGUgaXMgMjAwLlxuICogQHJldHVybiB7UmVzcG9uc2U8Vj59IFJlc3BvbnNlIHdob3NlIHZhbHVlIGZvciBzdGF0dXMgY29kZSAyMDAgaXMgbWFwcGVkIGZyb20gVSB0byBWXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBSZXNwb25zZTxVLCBWPihyZXNwOiBSZXNwb25zZTxVPiwgbWFwRm46IE1hcEZuPFUsIFY+KTogUmVzcG9uc2U8Vj4ge1xuICBpZiAoKHJlc3AgYXMgQWNjZXB0ZWRSZXNwb25zZSkuYWNjZXB0ZWQ/Lk1mYVJlcXVpcmVkKSB7XG4gICAgcmV0dXJuIHJlc3AgYXMgQWNjZXB0ZWRSZXNwb25zZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbWFwRm4ocmVzcCBhcyBVKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1mYVJlcXVpcmVkIHtcbiAgLyoqIE9yZyBpZCAqL1xuICBvcmdfaWQ6IHN0cmluZztcbiAgLyoqIE1GQSByZXF1ZXN0IGlkICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBNRkEgc2Vzc2lvbiAqL1xuICBzZXNzaW9uPzogTmV3U2Vzc2lvblJlc3BvbnNlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBBIHJlc3BvbnNlIG9mIGEgQ3ViZVNpZ25lciByZXF1ZXN0LlxuICovXG5leHBvcnQgY2xhc3MgQ3ViZVNpZ25lclJlc3BvbnNlPFU+IHtcbiAgcmVhZG9ubHkgI3JlcXVlc3RGbjogUmVxdWVzdEZuPFU+O1xuICByZWFkb25seSAjcmVzcDogVSB8IEFjY2VwdGVkUmVzcG9uc2U7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNRkEgaWQuIE9ubHkgc2V0IGlmIHRoZXJlIGlzIGFuIE1GQSByZXF1ZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogc2lnbmluZyByZXF1ZXN0XG4gICAqL1xuICByZWFkb25seSAjbWZhUmVxdWlyZWQ/OiBNZmFSZXF1aXJlZDtcblxuICAvKiogQHJldHVybiB7c3RyaW5nfSBUaGUgTUZBIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QgKi9cbiAgbWZhSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jbWZhUmVxdWlyZWQhLmlkO1xuICB9XG5cbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyByZXF1ZXN0IHJlcXVpcmVzIGFuIE1GQSBhcHByb3ZhbCAqL1xuICByZXF1aXJlc01mYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jbWZhUmVxdWlyZWQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHNlc3Npb24gaW5mb3JtYXRpb24gdG8gdXNlIGZvciBhbnkgTUZBIGFwcHJvdmFsIHJlcXVlc3RzIChpZiBhbnkgd2FzIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZSkuXG4gICAqIEByZXR1cm4ge0NsaWVudFNlc3Npb25JbmZvIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgbWZhU2Vzc2lvbkluZm8oKTogTmV3U2Vzc2lvblJlc3BvbnNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gKHRoaXMuI3Jlc3AgYXMgQWNjZXB0ZWRSZXNwb25zZSkuYWNjZXB0ZWQ/Lk1mYVJlcXVpcmVkPy5zZXNzaW9uID8/IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBAcmV0dXJuIHtVfSBUaGUgcmVzcG9uc2UgZGF0YSwgaWYgbm8gTUZBIGlzIHJlcXVpcmVkICovXG4gIGRhdGEoKTogVSB7XG4gICAgaWYgKHRoaXMucmVxdWlyZXNNZmEoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNhbGwgYGRhdGEoKWAgd2hpbGUgTUZBIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jcmVzcCBhcyBVO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcHJvdmVzIHRoZSBNRkEgcmVxdWVzdCB1c2luZyBhIGdpdmVuIHNlc3Npb24gYW5kIGEgVE9UUCBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge1NpZ25lclNlc3Npb259IHNlc3Npb24gU2lnbmVyIHNlc3Npb24gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIDYtZGlnaXQgVE9UUCBjb2RlXG4gICAqIEByZXR1cm4ge0N1YmVTaWduZXJSZXNwb25zZTxVPn0gVGhlIHJlc3VsdCBvZiBzaWduaW5nIHdpdGggdGhlIGFwcHJvdmFsXG4gICAqL1xuICBhc3luYyBhcHByb3ZlVG90cChzZXNzaW9uOiBTaWduZXJTZXNzaW9uLCBjb2RlOiBzdHJpbmcpOiBQcm9taXNlPEN1YmVTaWduZXJSZXNwb25zZTxVPj4ge1xuICAgIGFzc2VydCh0aGlzLnJlcXVpcmVzTWZhKCkpO1xuICAgIGNvbnN0IG1mYUlkID0gdGhpcy5tZmFJZCgpO1xuICAgIGNvbnN0IG1mYU9yZ0lkID0gdGhpcy4jbWZhUmVxdWlyZWQhLm9yZ19pZDtcbiAgICBjb25zdCBtZmFBcHByb3ZhbCA9IGF3YWl0IHNlc3Npb24udG90cEFwcHJvdmUobWZhSWQsIGNvZGUpO1xuICAgIGFzc2VydChtZmFBcHByb3ZhbC5pZCA9PT0gbWZhSWQpO1xuICAgIGNvbnN0IG1mYUNvbmYgPSBtZmFBcHByb3ZhbC5yZWNlaXB0Py5jb25maXJtYXRpb247XG5cbiAgICBpZiAoIW1mYUNvbmYpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnNpZ25XaXRoTWZhQXBwcm92YWwoeyBtZmFJZCwgbWZhT3JnSWQsIG1mYUNvbmYgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwcm92ZXMgdGhlIE1GQSByZXF1ZXN0IHVzaW5nIGEgZ2l2ZW4gYEN1YmVTaWduZXJDbGllbnRgIGluc3RhbmNlIChpLmUuLCBpdHMgc2Vzc2lvbikuXG4gICAqXG4gICAqIEBwYXJhbSB7Q3ViZVNpZ25lcn0gY3MgQ3ViZVNpZ25lciB3aG9zZSBzZXNzaW9uIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtDdWJlU2lnbmVyUmVzcG9uc2U8VT59IFRoZSByZXN1bHQgb2Ygc2lnbmluZyB3aXRoIHRoZSBhcHByb3ZhbFxuICAgKi9cbiAgYXN5bmMgYXBwcm92ZShjczogQ3ViZVNpZ25lcik6IFByb21pc2U8Q3ViZVNpZ25lclJlc3BvbnNlPFU+PiB7XG4gICAgYXNzZXJ0KHRoaXMucmVxdWlyZXNNZmEoKSk7XG4gICAgY29uc3QgbWZhSWQgPSB0aGlzLiNtZmFSZXF1aXJlZCEuaWQ7XG4gICAgY29uc3QgbWZhT3JnSWQgPSB0aGlzLiNtZmFSZXF1aXJlZCEub3JnX2lkO1xuXG4gICAgY29uc3QgbWZhQXBwcm92YWwgPSBhd2FpdCBjcy5tZmFBcHByb3ZlKG1mYU9yZ0lkLCBtZmFJZCk7XG4gICAgYXNzZXJ0KG1mYUFwcHJvdmFsLmlkID09PSBtZmFJZCk7XG4gICAgY29uc3QgbWZhQ29uZiA9IG1mYUFwcHJvdmFsLnJlY2VpcHQ/LmNvbmZpcm1hdGlvbjtcblxuICAgIGlmICghbWZhQ29uZikge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2lnbldpdGhNZmFBcHByb3ZhbCh7IG1mYUlkLCBtZmFPcmdJZCwgbWZhQ29uZiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge01mYVJlY2VpcHR9IG1mYVJlY2VpcHQgVGhlIE1GQSByZWNlaXB0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q3ViZVNpZ25lclJlc3BvbnNlPFU+Pn0gVGhlIHJlc3VsdCBvZiBzaWduaW5nIGFmdGVyIE1GQSBhcHByb3ZhbFxuICAgKi9cbiAgYXN5bmMgc2lnbldpdGhNZmFBcHByb3ZhbChtZmFSZWNlaXB0OiBNZmFSZWNlaXB0KTogUHJvbWlzZTxDdWJlU2lnbmVyUmVzcG9uc2U8VT4+IHtcbiAgICBjb25zdCBoZWFkZXJzID0gQ3ViZVNpZ25lclJlc3BvbnNlLmdldE1mYUhlYWRlcnMobWZhUmVjZWlwdCk7XG4gICAgcmV0dXJuIG5ldyBDdWJlU2lnbmVyUmVzcG9uc2UodGhpcy4jcmVxdWVzdEZuLCBhd2FpdCB0aGlzLiNyZXF1ZXN0Rm4oaGVhZGVycykpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0gSU5URVJOQUwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogQ29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVxdWVzdEZufSByZXF1ZXN0Rm5cbiAgICogICAgVGhlIHNpZ25pbmcgZnVuY3Rpb24gdGhhdCB0aGlzIHJlc3BvbnNlIGlzIGZyb20uXG4gICAqICAgIFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0byByZXNlbmQgcmVxdWVzdHMgd2l0aCBkaWZmZXJlbnQgaGVhZGVycyBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7VSB8IEFjY2VwdGVkUmVzcG9uc2V9IHJlc3AgVGhlIHJlc3BvbnNlIGFzIHJldHVybmVkIGJ5IHRoZSBPcGVuQVBJIGNsaWVudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3RGbjogUmVxdWVzdEZuPFU+LCByZXNwOiBVIHwgQWNjZXB0ZWRSZXNwb25zZSkge1xuICAgIHRoaXMuI3JlcXVlc3RGbiA9IHJlcXVlc3RGbjtcbiAgICB0aGlzLiNyZXNwID0gcmVzcDtcbiAgICB0aGlzLiNtZmFSZXF1aXJlZCA9ICh0aGlzLiNyZXNwIGFzIEFjY2VwdGVkUmVzcG9uc2UpLmFjY2VwdGVkPy5NZmFSZXF1aXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7UmVxdWVzdEZufSByZXF1ZXN0Rm5cbiAgICogICAgVGhlIHJlcXVlc3QgZnVuY3Rpb24gdGhhdCB0aGlzIHJlc3BvbnNlIGlzIGZyb20uXG4gICAqICAgIFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0byByZXNlbmQgcmVxdWVzdHMgd2l0aCBkaWZmZXJlbnQgaGVhZGVycyBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7TWZhUmVjZWlwdH0gbWZhUmVjZWlwdCBPcHRpb25hbCBNRkEgcmVjZWlwdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEN1YmVTaWduZXJSZXNwb25zZTxVPj59IE5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZTxVPihcbiAgICByZXF1ZXN0Rm46IFJlcXVlc3RGbjxVPixcbiAgICBtZmFSZWNlaXB0PzogTWZhUmVjZWlwdCxcbiAgKTogUHJvbWlzZTxDdWJlU2lnbmVyUmVzcG9uc2U8VT4+IHtcbiAgICBjb25zdCBzZWVkID0gYXdhaXQgcmVxdWVzdEZuKHRoaXMuZ2V0TWZhSGVhZGVycyhtZmFSZWNlaXB0KSk7XG4gICAgcmV0dXJuIG5ldyBDdWJlU2lnbmVyUmVzcG9uc2UocmVxdWVzdEZuLCBzZWVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIEhUVFAgaGVhZGVycyBjb250YWluaW5nIGEgZ2l2ZW4gTUZBIHJlY2VpcHQuXG4gICAqXG4gICAqIEBwYXJhbSB7TWZhUmVjZWlwdH0gbWZhUmVjZWlwdCBNRkEgcmVjZWlwdFxuICAgKiBAcmV0dXJuIHtIZWFkZXJzSW5pdH0gSGVhZGVycyBpbmNsdWRpbmcgdGhhdCByZWNlaXB0XG4gICAqL1xuICBzdGF0aWMgZ2V0TWZhSGVhZGVycyhtZmFSZWNlaXB0PzogTWZhUmVjZWlwdCk6IEhlYWRlcnNJbml0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gbWZhUmVjZWlwdFxuICAgICAgPyB7XG4gICAgICAgICAgXCJ4LWN1YmlzdC1tZmEtaWRcIjogbWZhUmVjZWlwdC5tZmFJZCxcbiAgICAgICAgICBcIngtY3ViaXN0LW1mYS1vcmctaWRcIjogbWZhUmVjZWlwdC5tZmFPcmdJZCxcbiAgICAgICAgICBcIngtY3ViaXN0LW1mYS1jb25maXJtYXRpb25cIjogbWZhUmVjZWlwdC5tZmFDb25mLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogU2lnbmVyIHNlc3Npb24gaW5mby4gQ2FuIG9ubHkgYmUgdXNlZCB0byByZXZva2UgYSB0b2tlbiwgYnV0IG5vdCBmb3IgYXV0aGVudGljYXRpb24uICovXG5leHBvcnQgY2xhc3MgU2lnbmVyU2Vzc2lvbkluZm8ge1xuICByZWFkb25seSAjY3NjOiBDdWJlU2lnbmVyQ2xpZW50O1xuICByZWFkb25seSAjc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBwdXJwb3NlOiBzdHJpbmc7XG5cbiAgLyoqIFJldm9rZSB0aGlzIHNlc3Npb24gKi9cbiAgYXN5bmMgcmV2b2tlKCkge1xuICAgIGF3YWl0IHRoaXMuI2NzYy5zZXNzaW9uUmV2b2tlKHRoaXMuI3Nlc3Npb25JZCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyAtLSBJTlRFUk5BTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyQ2xpZW50fSBjcyBDdWJlU2lnbmVyIGluc3RhbmNlIHRvIHVzZSB3aGVuIGNhbGxpbmcgYHJldm9rZWBcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZCBUaGUgSUQgb2YgdGhlIHNlc3Npb247IGNhbiBiZSB1c2VkIGZvciByZXZvY2F0aW9uIGJ1dCBub3QgZm9yIGF1dGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IHB1cnBvc2UgU2Vzc2lvbiBwdXJwb3NlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0b3IoY3M6IEN1YmVTaWduZXJDbGllbnQsIHNlc3Npb25JZDogc3RyaW5nLCBwdXJwb3NlOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNjc2MgPSBjcztcbiAgICB0aGlzLiNzZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgdGhpcy5wdXJwb3NlID0gcHVycG9zZTtcbiAgfVxufVxuXG4vKipcbiAqIFNpZ25lciBzZXNzaW9uLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ3ViZVNpZ25lckNsaWVudH0gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25lclNlc3Npb24ge1xuICByZWFkb25seSAjY3NjOiBDdWJlU2lnbmVyQ2xpZW50O1xuXG4gIC8qKiBEZXByZWNhdGVkICovXG4gIGdldCBzZXNzaW9uTWdyKCkge1xuICAgIHJldHVybiB0aGlzLiNjc2Muc2Vzc2lvbk1ncjtcbiAgfVxuXG4gIC8qKiBPcmcgaWQgKi9cbiAgZ2V0IG9yZ0lkKCkge1xuICAgIHJldHVybiB0aGlzLiNjc2Mub3JnSWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBrZXlzIHRoYXQgdGhpcyB0b2tlbiBncmFudHMgYWNjZXNzIHRvLlxuICAgKiBAcmV0dXJuIHtLZXlJbmZvW119IFRoZSBsaXN0IG9mIGtleXMuXG4gICAqL1xuICBhc3luYyBrZXlzKCk6IFByb21pc2U8S2V5SW5mb1tdPiB7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IHRoaXMuI2NzYy5zZXNzaW9uS2V5c0xpc3QoKTtcbiAgICByZXR1cm4ga2V5cy5tYXAoKGspID0+IHRvS2V5SW5mbyhrKSk7XG4gIH1cblxuICAvKiogQXBwcm92ZSBhIHBlbmRpbmcgTUZBIHJlcXVlc3QgdXNpbmcgVE9UUC4gKi9cbiAgZ2V0IHRvdHBBcHByb3ZlKCkge1xuICAgIHJldHVybiB0aGlzLiNjc2MubWZhQXBwcm92ZVRvdHAuYmluZCh0aGlzLiNjc2MpO1xuICB9XG5cbiAgLyoqIEluaXRpYXRlIGFwcHJvdmFsIG9mIGFuIGV4aXN0aW5nIE1GQSByZXF1ZXN0IHVzaW5nIEZJRE8uICovXG4gIGdldCBmaWRvQXBwcm92ZVN0YXJ0KCkge1xuICAgIHJldHVybiB0aGlzLiNjc2MubWZhQXBwcm92ZUZpZG9Jbml0LmJpbmQodGhpcy4jY3NjKTtcbiAgfVxuXG4gIC8qKiBHZXQgYSBwZW5kaW5nIE1GQSByZXF1ZXN0IGJ5IGl0cyBpZC4gKi9cbiAgZ2V0IGdldE1mYUluZm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NzYy5tZmFHZXQuYmluZCh0aGlzLiNjc2MpO1xuICB9XG5cbiAgLyoqIFN1Ym1pdCBhbiBFVk0gc2lnbiByZXF1ZXN0LiAqL1xuICBnZXQgc2lnbkV2bSgpIHtcbiAgICByZXR1cm4gdGhpcy4jY3NjLnNpZ25Fdm0uYmluZCh0aGlzLiNjc2MpO1xuICB9XG5cbiAgLyoqIFN1Ym1pdCBhbiAnZXRoMicgc2lnbiByZXF1ZXN0LiAqL1xuICBnZXQgc2lnbkV0aDIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NzYy5zaWduRXRoMi5iaW5kKHRoaXMuI2NzYyk7XG4gIH1cblxuICAvKiogU2lnbiBhIHN0YWtlIHJlcXVlc3QuICovXG4gIGdldCBzdGFrZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jY3NjLnNpZ25TdGFrZS5iaW5kKHRoaXMuI2NzYyk7XG4gIH1cblxuICAvKiogU2lnbiBhbiB1bnN0YWtlIHJlcXVlc3QuICovXG4gIGdldCB1bnN0YWtlKCkge1xuICAgIHJldHVybiB0aGlzLiNjc2Muc2lnblVuc3Rha2UuYmluZCh0aGlzLiNjc2MpO1xuICB9XG5cbiAgLyoqIFNpZ24gYSByYXcgYmxvYi4qL1xuICBnZXQgc2lnbkJsb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NzYy5zaWduQmxvYi5iaW5kKHRoaXMuI2NzYyk7XG4gIH1cblxuICAvKiogU2lnbiBhIGJpdGNvaW4gbWVzc2FnZS4gKi9cbiAgZ2V0IHNpZ25CdGMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NzYy5zaWduQnRjLmJpbmQodGhpcy4jY3NjKTtcbiAgfVxuXG4gIC8qKiBTaWduIGEgc29sYW5hIG1lc3NhZ2UuICovXG4gIGdldCBzaWduU29sYW5hKCkge1xuICAgIHJldHVybiB0aGlzLiNjc2Muc2lnblNvbGFuYS5iaW5kKHRoaXMuI2NzYyk7XG4gIH1cblxuICAvKiogU2lnbiBhbiBBdmFsYW5jaGUgUC0gb3IgWC1jaGFpbiBtZXNzYWdlLiAqL1xuICBnZXQgc2lnbkF2YSgpIHtcbiAgICByZXR1cm4gdGhpcy4jY3NjLnNpZ25BdmEuYmluZCh0aGlzLiNjc2MpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGFpbiBhIHByb29mIG9mIGF1dGhlbnRpY2F0aW9uLlxuICAgKi9cbiAgZ2V0IHByb3ZlSWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NzYy5pZGVudGl0eVByb3ZlLmJpbmQodGhpcy4jY3NjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbiBleGlzdGluZyBzaWduZXIgc2Vzc2lvbiBmcm9tIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB7U2lnbmVyU2Vzc2lvblN0b3JhZ2V9IHN0b3JhZ2UgVGhlIHNlc3Npb24gc3RvcmFnZSB0byB1c2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxTaW5nZXJTZXNzaW9uPn0gTmV3IHNpZ25lciBzZXNzaW9uXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbG9hZFNpZ25lclNlc3Npb24oc3RvcmFnZTogU2lnbmVyU2Vzc2lvblN0b3JhZ2UpOiBQcm9taXNlPFNpZ25lclNlc3Npb24+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gYXdhaXQgU2lnbmVyU2Vzc2lvbk1hbmFnZXIubG9hZEZyb21TdG9yYWdlKHN0b3JhZ2UpO1xuICAgIHJldHVybiBuZXcgU2lnbmVyU2Vzc2lvbihtYW5hZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtTaWduZXJTZXNzaW9uTWFuYWdlcn0gc2Vzc2lvbk1nciBUaGUgc2Vzc2lvbiBtYW5hZ2VyIHRvIHVzZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNlc3Npb25NZ3I6IFNpZ25lclNlc3Npb25NYW5hZ2VyKSB7XG4gICAgdGhpcy4jY3NjID0gbmV3IEN1YmVTaWduZXJDbGllbnQoc2Vzc2lvbk1ncik7XG4gIH1cbn1cbiJdfQ==
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmVyX3Nlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2lnbmVyX3Nlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscUNBQTRDO0FBQzVDLCtCQUEyQztBQUMzQyw2RUFBOEY7QUFFOUYsMkZBQTJGO0FBQzNGLE1BQWEsaUJBQWlCO0lBSzVCLDBCQUEwQjtJQUMxQixLQUFLLENBQUMsTUFBTTtRQUNWLE1BQU0sdUJBQUEsSUFBSSw4QkFBSyxDQUFDLGFBQWEsQ0FBQyx1QkFBQSxJQUFJLG9DQUFXLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSw2RUFBNkU7SUFFN0U7Ozs7OztPQU1HO0lBQ0gsWUFBWSxFQUFvQixFQUFFLFNBQWlCLEVBQUUsT0FBZTtRQXBCM0QseUNBQXVCO1FBQ3ZCLCtDQUFtQjtRQW9CMUIsdUJBQUEsSUFBSSwwQkFBUSxFQUFFLE1BQUEsQ0FBQztRQUNmLHVCQUFBLElBQUksZ0NBQWMsU0FBUyxNQUFBLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBMUJELDhDQTBCQzs7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLGFBQWMsU0FBUSx5QkFBZ0I7SUFDakQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBNkI7UUFDMUQsTUFBTSxPQUFPLEdBQUcsTUFBTSw2Q0FBb0IsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEUsT0FBTyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBQSxlQUFTLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUE1QkQsc0NBNEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3ViZVNpZ25lckNsaWVudCB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHsgS2V5SW5mbywgdG9LZXlJbmZvIH0gZnJvbSBcIi4va2V5XCI7XG5pbXBvcnQgeyBTaWduZXJTZXNzaW9uTWFuYWdlciwgU2lnbmVyU2Vzc2lvblN0b3JhZ2UgfSBmcm9tIFwiLi9zZXNzaW9uL3NpZ25lcl9zZXNzaW9uX21hbmFnZXJcIjtcblxuLyoqIFNpZ25lciBzZXNzaW9uIGluZm8uIENhbiBvbmx5IGJlIHVzZWQgdG8gcmV2b2tlIGEgdG9rZW4sIGJ1dCBub3QgZm9yIGF1dGhlbnRpY2F0aW9uLiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25lclNlc3Npb25JbmZvIHtcbiAgcmVhZG9ubHkgI2NzYzogQ3ViZVNpZ25lckNsaWVudDtcbiAgcmVhZG9ubHkgI3Nlc3Npb25JZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcHVycG9zZTogc3RyaW5nO1xuXG4gIC8qKiBSZXZva2UgdGhpcyBzZXNzaW9uICovXG4gIGFzeW5jIHJldm9rZSgpIHtcbiAgICBhd2FpdCB0aGlzLiNjc2Muc2Vzc2lvblJldm9rZSh0aGlzLiNzZXNzaW9uSWQpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0gSU5URVJOQUwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogSW50ZXJuYWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7Q3ViZVNpZ25lckNsaWVudH0gY3MgQ3ViZVNpZ25lciBpbnN0YW5jZSB0byB1c2Ugd2hlbiBjYWxsaW5nIGByZXZva2VgXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgVGhlIElEIG9mIHRoZSBzZXNzaW9uOyBjYW4gYmUgdXNlZCBmb3IgcmV2b2NhdGlvbiBidXQgbm90IGZvciBhdXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdXJwb3NlIFNlc3Npb24gcHVycG9zZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNzOiBDdWJlU2lnbmVyQ2xpZW50LCBzZXNzaW9uSWQ6IHN0cmluZywgcHVycG9zZTogc3RyaW5nKSB7XG4gICAgdGhpcy4jY3NjID0gY3M7XG4gICAgdGhpcy4jc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgIHRoaXMucHVycG9zZSA9IHB1cnBvc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBTaWduZXIgc2Vzc2lvbi5cbiAqIEV4dGVuZHMge0BsaW5rIEN1YmVTaWduZXJDbGllbnR9IGFuZCBwcm92aWRlcyBhIGZldyBjb252ZW5pZW5jZSBtZXRob2RzIG9uIHRvcC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25lclNlc3Npb24gZXh0ZW5kcyBDdWJlU2lnbmVyQ2xpZW50IHtcbiAgLyoqXG4gICAqIExvYWRzIGFuIGV4aXN0aW5nIHNpZ25lciBzZXNzaW9uIGZyb20gc3RvcmFnZS5cbiAgICogQHBhcmFtIHtTaWduZXJTZXNzaW9uU3RvcmFnZX0gc3RvcmFnZSBUaGUgc2Vzc2lvbiBzdG9yYWdlIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNpbmdlclNlc3Npb24+fSBOZXcgc2lnbmVyIHNlc3Npb25cbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2FkU2lnbmVyU2Vzc2lvbihzdG9yYWdlOiBTaWduZXJTZXNzaW9uU3RvcmFnZSk6IFByb21pc2U8U2lnbmVyU2Vzc2lvbj4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBhd2FpdCBTaWduZXJTZXNzaW9uTWFuYWdlci5sb2FkRnJvbVN0b3JhZ2Uoc3RvcmFnZSk7XG4gICAgcmV0dXJuIG5ldyBTaWduZXJTZXNzaW9uKG1hbmFnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge1NpZ25lclNlc3Npb25NYW5hZ2VyfSBzZXNzaW9uTWdyIFRoZSBzZXNzaW9uIG1hbmFnZXIgdG8gdXNlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2Vzc2lvbk1ncjogU2lnbmVyU2Vzc2lvbk1hbmFnZXIpIHtcbiAgICBzdXBlcihzZXNzaW9uTWdyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGtleXMgdGhhdCB0aGlzIHRva2VuIGdyYW50cyBhY2Nlc3MgdG8uXG4gICAqIEByZXR1cm4ge0tleUluZm9bXX0gVGhlIGxpc3Qgb2Yga2V5cy5cbiAgICovXG4gIGFzeW5jIGtleXMoKTogUHJvbWlzZTxLZXlJbmZvW10+IHtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgdGhpcy5zZXNzaW9uS2V5c0xpc3QoKTtcbiAgICByZXR1cm4ga2V5cy5tYXAoKGspID0+IHRvS2V5SW5mbyhrKSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { UserExportCompleteResponse, UserExportKeyMaterial } from "./schema_types";
|
|
2
|
+
import type { CipherSuite } from "@hpke/core";
|
|
3
|
+
/** Get the HPKE ciphersuite for user-export decryption.
|
|
4
|
+
*
|
|
5
|
+
* @return {any} The HPKE ciphersuite for user export.
|
|
6
|
+
*/
|
|
7
|
+
export declare function userExportCipherSuite(): Promise<CipherSuite>;
|
|
8
|
+
/**
|
|
9
|
+
* Generate a key pair for user export.
|
|
10
|
+
*
|
|
11
|
+
* @return {Promise<CryptoKeyPair>} The newly generated key pair.
|
|
12
|
+
*/
|
|
13
|
+
export declare function userExportKeygen(): Promise<CryptoKeyPair>;
|
|
14
|
+
/**
|
|
15
|
+
* Decrypt a user export.
|
|
16
|
+
*
|
|
17
|
+
* @param {CryptoKey} recipientKey The NIST P-256 secret key corresponding to the `publicKey` argument to the `userExportComplete` invocation that returned `response`.
|
|
18
|
+
* @param {UserExportCompleteResponse} response The response from a successful `userExportComplete` request.
|
|
19
|
+
* @return {Promise<UserExportKeyMaterial>} The decrypted key material.
|
|
20
|
+
*/
|
|
21
|
+
export declare function userExportDecrypt(recipientKey: CryptoKey, response: UserExportCompleteResponse): Promise<UserExportKeyMaterial>;
|
|
22
|
+
/**
|
|
23
|
+
* Figure out how to load SubtleCrypto in the current environment.
|
|
24
|
+
*
|
|
25
|
+
* This functionality is reproduced from the hpke-js package,
|
|
26
|
+
* https://github.com/dajiaji/hpke-js/
|
|
27
|
+
* which is Copyright (C) 2022 Ajitomi Daisuke and licensed
|
|
28
|
+
* under the MIT License, which follows:
|
|
29
|
+
*
|
|
30
|
+
* MIT License
|
|
31
|
+
*
|
|
32
|
+
* Copyright (c) 2022 Ajitomi Daisuke
|
|
33
|
+
*
|
|
34
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
35
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
36
|
+
* in the Software without restriction, including without limitation the rights
|
|
37
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
38
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
39
|
+
* furnished to do so, subject to the following conditions:
|
|
40
|
+
*
|
|
41
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
42
|
+
* copies or substantial portions of the Software.
|
|
43
|
+
*
|
|
44
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
45
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
46
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
47
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
48
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
49
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
50
|
+
* SOFTWARE.
|
|
51
|
+
*/
|
|
52
|
+
export declare function loadSubtleCrypto(): Promise<SubtleCrypto>;
|