@lifeready/core 1.0.21 → 1.0.22
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/bundles/lifeready-core.umd.js +9745 -9700
- package/bundles/lifeready-core.umd.js.map +1 -1
- package/bundles/lifeready-core.umd.min.js +2 -2
- package/bundles/lifeready-core.umd.min.js.map +1 -1
- package/esm2015/lib/_common/run-outside-angular.js +2 -2
- package/esm2015/lib/_common/types.js +1 -1
- package/esm2015/lib/api/lr-apollo.service.js +3 -3
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +3 -3
- package/esm2015/lib/api/query-processor/common-processors.service.js +3 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +4 -4
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +6 -5
- package/esm2015/lib/api/types/lr-graphql.types.js +1 -1
- package/esm2015/lib/auth/auth.gql.js +1 -28
- package/esm2015/lib/auth/auth.types.js +1 -1
- package/esm2015/lib/auth/life-ready-auth.service.js +32 -31
- package/esm2015/lib/category/category.gql.js +1 -1
- package/esm2015/lib/category/category.service.js +6 -6
- package/esm2015/lib/contact-card/contact-card.gql.js +79 -0
- package/esm2015/lib/contact-card/contact-card.service.js +154 -0
- package/esm2015/lib/contact-card/contact-card2.gql.js +29 -0
- package/esm2015/lib/contact-card/contact-card2.service.js +103 -0
- package/esm2015/lib/encryption/encryption.service.js +189 -0
- package/esm2015/lib/file-upload/file-upload.service.js +74 -0
- package/esm2015/lib/file-upload/file-upload.types.js +1 -0
- package/esm2015/lib/{auth → idle}/idle.service.js +7 -7
- package/esm2015/lib/{auth → idle}/idle.types.js +1 -1
- package/esm2015/lib/items2/item2.service.js +20 -20
- package/esm2015/lib/key/key-factory.service.js +237 -0
- package/esm2015/lib/{cryptography → key}/key-graph.service.js +10 -10
- package/esm2015/lib/key/key-meta.service.js +200 -0
- package/esm2015/lib/key/key.service.js +124 -0
- package/esm2015/lib/key/key.types.js +11 -0
- package/esm2015/lib/key-exchange/key-exchange.gql.js +188 -0
- package/esm2015/lib/key-exchange/key-exchange.service.js +443 -0
- package/esm2015/lib/key-exchange/key-exchange.types.js +7 -0
- package/esm2015/lib/key-exchange/key-exchange2.gql.js +171 -0
- package/esm2015/lib/key-exchange/key-exchange2.service.js +500 -0
- package/esm2015/lib/lbop/lbop.service.js +355 -0
- package/esm2015/lib/life-ready.module.js +2 -27
- package/esm2015/lib/lock/lock.gql.js +40 -0
- package/esm2015/lib/lock/lock.service.js +64 -0
- package/esm2015/lib/message/message.gql.js +32 -0
- package/esm2015/lib/message/message.service.js +116 -0
- package/esm2015/lib/message/message.types.js +1 -0
- package/esm2015/lib/password/password.gql.js +28 -0
- package/esm2015/lib/password/password.service.js +315 -0
- package/esm2015/lib/persist/persist.service.js +180 -0
- package/esm2015/lib/profile/profile-details.service.js +214 -0
- package/esm2015/lib/profile/profile.gql.js +97 -0
- package/esm2015/lib/profile/profile.service.js +169 -0
- package/esm2015/lib/profile/profile.types.js +34 -0
- package/esm2015/lib/record/record-attachment.service.js +15 -15
- package/esm2015/lib/record/record.service.js +3 -3
- package/esm2015/lib/register/register.service.js +172 -0
- package/esm2015/lib/scenario/scenario.controller.js +2 -2
- package/esm2015/lib/scenario/{scenario.gql.private.js → scenario.private.gql.js} +1 -1
- package/esm2015/lib/scenario/scenario.service.js +9 -9
- package/esm2015/lib/scenario/scenario.types.js +1 -1
- package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +119 -0
- package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +41 -0
- package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +117 -0
- package/esm2015/lib/slip39/slip39.service.js +169 -0
- package/esm2015/lib/time/time.service.js +146 -0
- package/esm2015/lib/tp-assembly/tp-assembly.js +365 -0
- package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +22 -0
- package/esm2015/lib/tp-assembly/tp-assembly.types.js +1 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +100 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +117 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +4 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +34 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +74 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +165 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +54 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +92 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +1 -0
- package/esm2015/lib/trusted-party/trusted-party.gql.js +148 -0
- package/esm2015/lib/trusted-party/trusted-party.service.js +326 -0
- package/esm2015/lib/trusted-party/trusted-party.types.js +41 -0
- package/esm2015/lib/trusted-party/trusted-party2.gql.js +64 -0
- package/esm2015/lib/trusted-party/trusted-party2.gql.private.js +25 -0
- package/esm2015/lib/trusted-party/trusted-party2.service.js +224 -0
- package/esm2015/lib/trusted-party/trusted-party2.types.js +1 -0
- package/esm2015/lib/two-factor/two-factor.service.js +74 -0
- package/esm2015/lib/user/user.gql.js +60 -0
- package/esm2015/lib/user/user.service.js +79 -0
- package/esm2015/lib/user/user.types.js +1 -0
- package/esm2015/lib/web-crypto/web-crypto.service.js +29 -0
- package/esm2015/lifeready-core.js +15 -13
- package/esm2015/public-api.js +49 -51
- package/fesm2015/lifeready-core.js +9232 -9214
- package/fesm2015/lifeready-core.js.map +1 -1
- package/lib/_common/types.d.ts +3 -1
- package/lib/api/lr-apollo.service.d.ts +1 -1
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +1 -1
- package/lib/api/query-processor/common-processors.service.d.ts +1 -1
- package/lib/api/query-processor/query-processor.service.d.ts +1 -1
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +1 -1
- package/lib/api/types/lr-graphql.types.d.ts +11 -0
- package/lib/auth/auth.gql.d.ts +0 -3
- package/lib/auth/auth.types.d.ts +2 -2
- package/lib/auth/life-ready-auth.service.d.ts +12 -12
- package/lib/category/category.gql.d.ts +1 -1
- package/lib/category/category.service.d.ts +2 -2
- package/lib/{api → contact-card}/contact-card.service.d.ts +9 -9
- package/lib/contact-card/contact-card2.gql.d.ts +25 -0
- package/lib/{api → contact-card}/contact-card2.service.d.ts +11 -12
- package/lib/{cryptography → encryption}/encryption.service.d.ts +2 -2
- package/lib/{api/file.service.d.ts → file-upload/file-upload.service.d.ts} +3 -7
- package/lib/file-upload/file-upload.types.d.ts +5 -0
- package/lib/{auth → idle}/idle.service.d.ts +4 -4
- package/lib/items2/item2.service.d.ts +11 -11
- package/lib/{cryptography → key}/key-factory.service.d.ts +2 -2
- package/lib/{cryptography → key}/key-graph.service.d.ts +5 -5
- package/lib/{cryptography → key}/key-meta.service.d.ts +1 -1
- package/lib/{cryptography → key}/key.service.d.ts +2 -2
- package/lib/{cryptography/cryptography.types.d.ts → key/key.types.d.ts} +9 -13
- package/lib/{api → key-exchange}/key-exchange.service.d.ts +5 -5
- package/lib/{api → key-exchange}/key-exchange.types.d.ts +4 -4
- package/lib/{api → key-exchange}/key-exchange2.gql.d.ts +1 -1
- package/lib/{api → key-exchange}/key-exchange2.service.d.ts +71 -18
- package/lib/{auth → lbop}/lbop.service.d.ts +7 -7
- package/lib/{api → lock}/lock.gql.d.ts +1 -1
- package/lib/{api → lock}/lock.service.d.ts +1 -1
- package/lib/message/message.gql.d.ts +13 -0
- package/lib/message/message.service.d.ts +29 -0
- package/lib/message/message.types.d.ts +12 -0
- package/lib/password/password.gql.d.ts +3 -0
- package/lib/{auth → password}/password.service.d.ts +8 -8
- package/lib/{api → persist}/persist.service.d.ts +3 -3
- package/lib/{users → profile}/profile-details.service.d.ts +3 -3
- package/lib/{users → profile}/profile.gql.d.ts +2 -2
- package/lib/{users → profile}/profile.service.d.ts +6 -6
- package/lib/{users → profile}/profile.types.d.ts +1 -1
- package/lib/record/record-attachment.service.d.ts +6 -6
- package/lib/record/record.service.d.ts +1 -1
- package/lib/{auth → register}/register.service.d.ts +4 -4
- package/lib/scenario/scenario.controller.d.ts +1 -1
- package/lib/scenario/scenario.service.d.ts +2 -2
- package/lib/scenario/scenario.types.d.ts +1 -1
- package/lib/{api → shared-contact-card}/shared-contact-card.service.d.ts +9 -9
- package/lib/{api → shared-contact-card}/shared-contact-card2.gql.d.ts +1 -1
- package/lib/{api → shared-contact-card}/shared-contact-card2.service.d.ts +6 -6
- package/lib/{trusted-parties → tp-assembly}/tp-assembly.d.ts +7 -7
- package/lib/{trusted-parties → tp-assembly}/tp-assembly.types.d.ts +1 -1
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset-request.service.d.ts +4 -8
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset-user.service.d.ts +7 -13
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.controller.d.ts +1 -1
- package/lib/tp-password-reset/tp-password-reset.gql.d.ts +63 -0
- package/lib/{trusted-parties/tp-password-reset.gql.d.ts → tp-password-reset/tp-password-reset.private.gql.d.ts} +1 -63
- package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +59 -0
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.service.d.ts +6 -89
- package/lib/tp-password-reset/tp-password-reset.types.d.ts +40 -0
- package/lib/{trusted-parties → trusted-party}/trusted-party.service.d.ts +7 -7
- package/lib/{trusted-parties → trusted-party}/trusted-party.types.d.ts +2 -3
- package/lib/{trusted-parties → trusted-party}/trusted-party2.gql.d.ts +0 -22
- package/lib/trusted-party/trusted-party2.gql.private.d.ts +23 -0
- package/lib/{trusted-parties → trusted-party}/trusted-party2.service.d.ts +11 -35
- package/lib/trusted-party/trusted-party2.types.d.ts +12 -0
- package/lib/{users → user}/user.gql.d.ts +1 -1
- package/lib/{users → user}/user.types.d.ts +1 -1
- package/lifeready-core.d.ts +14 -12
- package/lifeready-core.metadata.json +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +48 -50
- package/esm2015/lib/api/contact-card.gql.js +0 -79
- package/esm2015/lib/api/contact-card.service.js +0 -154
- package/esm2015/lib/api/contact-card2.gql.js +0 -60
- package/esm2015/lib/api/contact-card2.service.js +0 -103
- package/esm2015/lib/api/file.service.js +0 -74
- package/esm2015/lib/api/key-exchange.gql.js +0 -188
- package/esm2015/lib/api/key-exchange.service.js +0 -442
- package/esm2015/lib/api/key-exchange.types.js +0 -7
- package/esm2015/lib/api/key-exchange2.gql.js +0 -171
- package/esm2015/lib/api/key-exchange2.service.js +0 -480
- package/esm2015/lib/api/lock.gql.js +0 -40
- package/esm2015/lib/api/lock.service.js +0 -64
- package/esm2015/lib/api/message.service.js +0 -138
- package/esm2015/lib/api/persist.service.js +0 -181
- package/esm2015/lib/api/shared-contact-card.service.js +0 -119
- package/esm2015/lib/api/shared-contact-card2.gql.js +0 -41
- package/esm2015/lib/api/shared-contact-card2.service.js +0 -117
- package/esm2015/lib/api/time.service.js +0 -146
- package/esm2015/lib/auth/lbop.service.js +0 -355
- package/esm2015/lib/auth/password.service.js +0 -315
- package/esm2015/lib/auth/register.service.js +0 -172
- package/esm2015/lib/auth/two-factor.service.js +0 -74
- package/esm2015/lib/cryptography/cryptography.types.js +0 -11
- package/esm2015/lib/cryptography/encryption.service.js +0 -189
- package/esm2015/lib/cryptography/key-factory.service.js +0 -237
- package/esm2015/lib/cryptography/key-meta.service.js +0 -200
- package/esm2015/lib/cryptography/key.service.js +0 -124
- package/esm2015/lib/cryptography/slip39.service.js +0 -169
- package/esm2015/lib/cryptography/web-crypto.service.js +0 -29
- package/esm2015/lib/trusted-parties/tp-assembly.gql.private.js +0 -22
- package/esm2015/lib/trusted-parties/tp-assembly.js +0 -365
- package/esm2015/lib/trusted-parties/tp-assembly.types.js +0 -1
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +0 -113
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +0 -129
- package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +0 -4
- package/esm2015/lib/trusted-parties/tp-password-reset.controller.js +0 -34
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +0 -237
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +0 -95
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +0 -148
- package/esm2015/lib/trusted-parties/trusted-party.service.js +0 -326
- package/esm2015/lib/trusted-parties/trusted-party.types.js +0 -41
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +0 -87
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +0 -218
- package/esm2015/lib/users/profile-details.service.js +0 -214
- package/esm2015/lib/users/profile.gql.js +0 -97
- package/esm2015/lib/users/profile.service.js +0 -169
- package/esm2015/lib/users/profile.types.js +0 -34
- package/esm2015/lib/users/user.gql.js +0 -60
- package/esm2015/lib/users/user.service.js +0 -79
- package/esm2015/lib/users/user.types.js +0 -1
- package/lib/api/contact-card2.gql.d.ts +0 -34
- package/lib/api/message.service.d.ts +0 -59
- /package/lib/{api → contact-card}/contact-card.gql.d.ts +0 -0
- /package/lib/{auth → idle}/idle.types.d.ts +0 -0
- /package/lib/{api → key-exchange}/key-exchange.gql.d.ts +0 -0
- /package/lib/scenario/{scenario.gql.private.d.ts → scenario.private.gql.d.ts} +0 -0
- /package/lib/{cryptography → slip39}/slip39.service.d.ts +0 -0
- /package/lib/{api → time}/time.service.d.ts +0 -0
- /package/lib/{trusted-parties/tp-assembly.gql.private.d.ts → tp-assembly/tp-assembly.private.gql.d.ts} +0 -0
- /package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.constants.d.ts +0 -0
- /package/lib/{trusted-parties → trusted-party}/trusted-party.gql.d.ts +0 -0
- /package/lib/{auth → two-factor}/two-factor.service.d.ts +0 -0
- /package/lib/{users → user}/user.service.d.ts +0 -0
- /package/lib/{cryptography → web-crypto}/web-crypto.service.d.ts +0 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
|
|
4
|
+
import { Apollo } from 'apollo-angular';
|
|
5
|
+
import gql from 'graphql-tag';
|
|
6
|
+
import * as moment_ from 'moment';
|
|
7
|
+
import { LrErrorCode, LrException, handleApolloError, } from '../_common/exceptions';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@aws-amplify/auth/lib-esm/Auth";
|
|
10
|
+
import * as i2 from "apollo-angular";
|
|
11
|
+
// "why?" you ask: https://stackoverflow.com/questions/59735280/angular-8-moment-error-cannot-call-a-namespace-moment
|
|
12
|
+
const moment = moment_;
|
|
13
|
+
export const ServerTimeQuery = gql `
|
|
14
|
+
query {
|
|
15
|
+
serverTime {
|
|
16
|
+
timestamp
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
`;
|
|
20
|
+
export class TimeService {
|
|
21
|
+
constructor(auth, apollo) {
|
|
22
|
+
this.auth = auth;
|
|
23
|
+
this.apollo = apollo;
|
|
24
|
+
this.VERIFY_ENABLED = true;
|
|
25
|
+
this.MAX_DIFF_MSEC = moment
|
|
26
|
+
.duration({ seconds: 30 })
|
|
27
|
+
.asMilliseconds();
|
|
28
|
+
this.offsetMs = null; // Millisecond offset of local clock.
|
|
29
|
+
this.verified = false; // Verified with independent time source
|
|
30
|
+
}
|
|
31
|
+
getAccessToken() {
|
|
32
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
try {
|
|
34
|
+
return (yield this.auth.currentAuthenticatedUser())
|
|
35
|
+
.getSignInUserSession()
|
|
36
|
+
.getAccessToken()
|
|
37
|
+
.getJwtToken();
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
return ''; // Not authenticated
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Get time from independent source to confirm.
|
|
45
|
+
verifyCognito() {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
const accessToken = yield this.getAccessToken();
|
|
48
|
+
if (!accessToken) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Request headers from AWS Amplify Auth lib
|
|
52
|
+
// accept: */*
|
|
53
|
+
// accept-encoding: gzip, deflate, br
|
|
54
|
+
// accept-language: en-GB,en-US;q=0.9,en;q=0.8
|
|
55
|
+
// cache-control: no-cache
|
|
56
|
+
// content-length: 1089
|
|
57
|
+
// content-type: application/x-amz-json-1.1
|
|
58
|
+
// origin: http://localhost:4200
|
|
59
|
+
// pragma: no-cache
|
|
60
|
+
// referer: http://localhost:4200/
|
|
61
|
+
// sec-fetch-dest: empty
|
|
62
|
+
// sec-fetch-mode: cors
|
|
63
|
+
// sec-fetch-site: cross-site
|
|
64
|
+
// user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
|
|
65
|
+
// x-amz-target: AWSCognitoIdentityProviderService.GetUser
|
|
66
|
+
// x-amz-user-agent: aws-amplify/0.1.x js
|
|
67
|
+
// We are only interested in the Date field.
|
|
68
|
+
// AZ: I suppose we could use any end-point that provides a reliable Date field in the header. And we don't
|
|
69
|
+
// need to be authenticated. Even a 400 response would have a Date header. But the worry is that AWS might
|
|
70
|
+
// think it's some sort of attack, and block the IP or domain. At least in an authenticated call it can't be
|
|
71
|
+
// seen as illegitimate.
|
|
72
|
+
const response = yield fetch('https://cognito-idp.ap-southeast-2.amazonaws.com/', {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
mode: 'cors',
|
|
75
|
+
cache: 'no-cache',
|
|
76
|
+
headers: {
|
|
77
|
+
'x-amz-target': 'AWSCognitoIdentityProviderService.GetUser',
|
|
78
|
+
'x-amz-user-agent': 'aws-amplify/0.1.x js',
|
|
79
|
+
'Content-Type': 'application/x-amz-json-1.1',
|
|
80
|
+
},
|
|
81
|
+
// redirect: 'follow', // manual, *follow, error
|
|
82
|
+
// referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
|
|
83
|
+
body: JSON.stringify({
|
|
84
|
+
AccessToken: accessToken,
|
|
85
|
+
}),
|
|
86
|
+
});
|
|
87
|
+
const now = Date.now();
|
|
88
|
+
const verifyTime = moment(response.headers.get('Date')).valueOf();
|
|
89
|
+
const serverTime = now + this.offsetMs;
|
|
90
|
+
const diff = Math.abs(serverTime - verifyTime);
|
|
91
|
+
if (diff > this.MAX_DIFF_MSEC) {
|
|
92
|
+
throw new LrException({
|
|
93
|
+
code: LrErrorCode.BadTimeSync,
|
|
94
|
+
message: `Server time does not match independent source. ServerTime: ${serverTime}, Cognito time: ${verifyTime}`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
this.verified = true;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
refresh() {
|
|
101
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
const start = Date.now();
|
|
103
|
+
const res = yield this.apollo
|
|
104
|
+
.query({ query: ServerTimeQuery })
|
|
105
|
+
.toPromise();
|
|
106
|
+
const end = Date.now();
|
|
107
|
+
handleApolloError(res.errors);
|
|
108
|
+
const serverTime = parseInt(res.data.serverTime.timestamp, 10);
|
|
109
|
+
const roundtrip = end - start;
|
|
110
|
+
this.offsetMs = serverTime - (start + roundtrip / 2);
|
|
111
|
+
if (this.VERIFY_ENABLED) {
|
|
112
|
+
yield this.verifyCognito();
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
serverNow() {
|
|
117
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
let needsRefresh = false;
|
|
119
|
+
// First call
|
|
120
|
+
if (this.offsetMs === null) {
|
|
121
|
+
needsRefresh = true;
|
|
122
|
+
}
|
|
123
|
+
if (this.VERIFY_ENABLED) {
|
|
124
|
+
// logged in but not yet verified time matches.
|
|
125
|
+
if (!this.verified && (yield this.getAccessToken())) {
|
|
126
|
+
needsRefresh = true;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (needsRefresh) {
|
|
130
|
+
yield this.refresh();
|
|
131
|
+
}
|
|
132
|
+
return Date.now() + this.offsetMs;
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
TimeService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TimeService_Factory() { return new TimeService(i0.ɵɵinject(i1.AuthClass), i0.ɵɵinject(i2.Apollo)); }, token: TimeService, providedIn: "root" });
|
|
137
|
+
TimeService.decorators = [
|
|
138
|
+
{ type: Injectable, args: [{
|
|
139
|
+
providedIn: 'root',
|
|
140
|
+
},] }
|
|
141
|
+
];
|
|
142
|
+
TimeService.ctorParameters = () => [
|
|
143
|
+
{ type: AuthClass },
|
|
144
|
+
{ type: Apollo }
|
|
145
|
+
];
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9vcHQvYXRsYXNzaWFuL3BpcGVsaW5lcy9hZ2VudC9idWlsZC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi90aW1lL3RpbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQztBQUM5QixPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLFdBQVcsRUFDWCxpQkFBaUIsR0FDbEIsTUFBTSx1QkFBdUIsQ0FBQzs7OztBQUMvQixxSEFBcUg7QUFDckgsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBRXZCLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUE7Ozs7OztDQU1qQyxDQUFDO0FBU0YsTUFBTSxPQUFPLFdBQVc7SUFTdEIsWUFBb0IsSUFBZSxFQUFVLE1BQWM7UUFBdkMsU0FBSSxHQUFKLElBQUksQ0FBVztRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFScEQsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDWixrQkFBYSxHQUFHLE1BQU07YUFDcEMsUUFBUSxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO2FBQ3pCLGNBQWMsRUFBRSxDQUFDO1FBRXBCLGFBQVEsR0FBVyxJQUFJLENBQUMsQ0FBQyxxQ0FBcUM7UUFDOUQsYUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLHdDQUF3QztJQUVJLENBQUM7SUFFakQsY0FBYzs7WUFDMUIsSUFBSTtnQkFDRixPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7cUJBQ2hELG9CQUFvQixFQUFFO3FCQUN0QixjQUFjLEVBQUU7cUJBQ2hCLFdBQVcsRUFBRSxDQUFDO2FBQ2xCO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsT0FBTyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7YUFDaEM7UUFDSCxDQUFDO0tBQUE7SUFFRCwrQ0FBK0M7SUFDakMsYUFBYTs7WUFDekIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDaEIsT0FBTzthQUNSO1lBRUQsNENBQTRDO1lBQzVDLGNBQWM7WUFDZCxxQ0FBcUM7WUFDckMsOENBQThDO1lBQzlDLDBCQUEwQjtZQUMxQix1QkFBdUI7WUFDdkIsMkNBQTJDO1lBQzNDLGdDQUFnQztZQUNoQyxtQkFBbUI7WUFDbkIsa0NBQWtDO1lBQ2xDLHdCQUF3QjtZQUN4Qix1QkFBdUI7WUFDdkIsNkJBQTZCO1lBQzdCLHdIQUF3SDtZQUN4SCwwREFBMEQ7WUFDMUQseUNBQXlDO1lBRXpDLDRDQUE0QztZQUM1QywyR0FBMkc7WUFDM0csMEdBQTBHO1lBQzFHLDRHQUE0RztZQUM1Ryx3QkFBd0I7WUFDeEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQzFCLG1EQUFtRCxFQUNuRDtnQkFDRSxNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJLEVBQUUsTUFBTTtnQkFDWixLQUFLLEVBQUUsVUFBVTtnQkFDakIsT0FBTyxFQUFFO29CQUNQLGNBQWMsRUFBRSwyQ0FBMkM7b0JBQzNELGtCQUFrQixFQUFFLHNCQUFzQjtvQkFDMUMsY0FBYyxFQUFFLDRCQUE0QjtpQkFDN0M7Z0JBQ0QsZ0RBQWdEO2dCQUNoRCx3TEFBd0w7Z0JBQ3hMLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixXQUFXLEVBQUUsV0FBVztpQkFDekIsQ0FBQzthQUNILENBQ0YsQ0FBQztZQUVGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUV2QixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsRSxNQUFNLFVBQVUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQztZQUUvQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUM3QixNQUFNLElBQUksV0FBVyxDQUFDO29CQUNwQixJQUFJLEVBQUUsV0FBVyxDQUFDLFdBQVc7b0JBQzdCLE9BQU8sRUFBRSw4REFBOEQsVUFBVSxtQkFBbUIsVUFBVSxFQUFFO2lCQUNqSCxDQUFDLENBQUM7YUFDSjtZQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7S0FBQTtJQUVhLE9BQU87O1lBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNO2lCQUMxQixLQUFLLENBQTZCLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDO2lCQUM3RCxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUV2QixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFOUIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUUvRCxNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1lBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxHQUFHLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVyRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3ZCLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzVCO1FBQ0gsQ0FBQztLQUFBO0lBRUssU0FBUzs7WUFDYixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7WUFFekIsYUFBYTtZQUNiLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7Z0JBQzFCLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDckI7WUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3ZCLCtDQUErQztnQkFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFO29CQUNuRCxZQUFZLEdBQUcsSUFBSSxDQUFDO2lCQUNyQjthQUNGO1lBRUQsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3RCO1lBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNwQyxDQUFDO0tBQUE7Ozs7WUFoSUYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUExQlEsU0FBUztZQUNULE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdXRoQ2xhc3MgfSBmcm9tICdAYXdzLWFtcGxpZnkvYXV0aC9saWItZXNtL0F1dGgnO1xuaW1wb3J0IHsgQXBvbGxvIH0gZnJvbSAnYXBvbGxvLWFuZ3VsYXInO1xuaW1wb3J0IGdxbCBmcm9tICdncmFwaHFsLXRhZyc7XG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XG5pbXBvcnQge1xuICBMckVycm9yQ29kZSxcbiAgTHJFeGNlcHRpb24sXG4gIGhhbmRsZUFwb2xsb0Vycm9yLFxufSBmcm9tICcuLi9fY29tbW9uL2V4Y2VwdGlvbnMnO1xuLy8gXCJ3aHk/XCIgeW91IGFzazogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTk3MzUyODAvYW5ndWxhci04LW1vbWVudC1lcnJvci1jYW5ub3QtY2FsbC1hLW5hbWVzcGFjZS1tb21lbnRcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XG5cbmV4cG9ydCBjb25zdCBTZXJ2ZXJUaW1lUXVlcnkgPSBncWxgXG4gIHF1ZXJ5IHtcbiAgICBzZXJ2ZXJUaW1lIHtcbiAgICAgIHRpbWVzdGFtcFxuICAgIH1cbiAgfVxuYDtcblxuaW50ZXJmYWNlIFNlcnZlclRpbWUge1xuICB0aW1lc3RhbXA6IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVTZXJ2aWNlIHtcbiAgcHVibGljIFZFUklGWV9FTkFCTEVEID0gdHJ1ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfRElGRl9NU0VDID0gbW9tZW50XG4gICAgLmR1cmF0aW9uKHsgc2Vjb25kczogMzAgfSlcbiAgICAuYXNNaWxsaXNlY29uZHMoKTtcblxuICBvZmZzZXRNczogbnVtYmVyID0gbnVsbDsgLy8gTWlsbGlzZWNvbmQgb2Zmc2V0IG9mIGxvY2FsIGNsb2NrLlxuICB2ZXJpZmllZCA9IGZhbHNlOyAvLyBWZXJpZmllZCB3aXRoIGluZGVwZW5kZW50IHRpbWUgc291cmNlXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoOiBBdXRoQ2xhc3MsIHByaXZhdGUgYXBvbGxvOiBBcG9sbG8pIHt9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXV0aC5jdXJyZW50QXV0aGVudGljYXRlZFVzZXIoKSlcbiAgICAgICAgLmdldFNpZ25JblVzZXJTZXNzaW9uKClcbiAgICAgICAgLmdldEFjY2Vzc1Rva2VuKClcbiAgICAgICAgLmdldEp3dFRva2VuKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiAnJzsgLy8gTm90IGF1dGhlbnRpY2F0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgdGltZSBmcm9tIGluZGVwZW5kZW50IHNvdXJjZSB0byBjb25maXJtLlxuICBwcml2YXRlIGFzeW5jIHZlcmlmeUNvZ25pdG8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLmdldEFjY2Vzc1Rva2VuKCk7XG4gICAgaWYgKCFhY2Nlc3NUb2tlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgaGVhZGVycyBmcm9tIEFXUyBBbXBsaWZ5IEF1dGggbGliXG4gICAgLy8gYWNjZXB0OiAqLypcbiAgICAvLyBhY2NlcHQtZW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUsIGJyXG4gICAgLy8gYWNjZXB0LWxhbmd1YWdlOiBlbi1HQixlbi1VUztxPTAuOSxlbjtxPTAuOFxuICAgIC8vIGNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlXG4gICAgLy8gY29udGVudC1sZW5ndGg6IDEwODlcbiAgICAvLyBjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtYW16LWpzb24tMS4xXG4gICAgLy8gb3JpZ2luOiBodHRwOi8vbG9jYWxob3N0OjQyMDBcbiAgICAvLyBwcmFnbWE6IG5vLWNhY2hlXG4gICAgLy8gcmVmZXJlcjogaHR0cDovL2xvY2FsaG9zdDo0MjAwL1xuICAgIC8vIHNlYy1mZXRjaC1kZXN0OiBlbXB0eVxuICAgIC8vIHNlYy1mZXRjaC1tb2RlOiBjb3JzXG4gICAgLy8gc2VjLWZldGNoLXNpdGU6IGNyb3NzLXNpdGVcbiAgICAvLyB1c2VyLWFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84MC4wLjM5ODcuMTMyIFNhZmFyaS81MzcuMzZcbiAgICAvLyB4LWFtei10YXJnZXQ6IEFXU0NvZ25pdG9JZGVudGl0eVByb3ZpZGVyU2VydmljZS5HZXRVc2VyXG4gICAgLy8geC1hbXotdXNlci1hZ2VudDogYXdzLWFtcGxpZnkvMC4xLngganNcblxuICAgIC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIERhdGUgZmllbGQuXG4gICAgLy8gQVo6IEkgc3VwcG9zZSB3ZSBjb3VsZCB1c2UgYW55IGVuZC1wb2ludCB0aGF0IHByb3ZpZGVzIGEgcmVsaWFibGUgRGF0ZSBmaWVsZCBpbiB0aGUgaGVhZGVyLiBBbmQgd2UgZG9uJ3RcbiAgICAvLyBuZWVkIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIEV2ZW4gYSA0MDAgcmVzcG9uc2Ugd291bGQgaGF2ZSBhIERhdGUgaGVhZGVyLiBCdXQgdGhlIHdvcnJ5IGlzIHRoYXQgQVdTIG1pZ2h0XG4gICAgLy8gdGhpbmsgaXQncyBzb21lIHNvcnQgb2YgYXR0YWNrLCBhbmQgYmxvY2sgdGhlIElQIG9yIGRvbWFpbi4gQXQgbGVhc3QgaW4gYW4gYXV0aGVudGljYXRlZCBjYWxsIGl0IGNhbid0IGJlXG4gICAgLy8gc2VlbiBhcyBpbGxlZ2l0aW1hdGUuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICdodHRwczovL2NvZ25pdG8taWRwLmFwLXNvdXRoZWFzdC0yLmFtYXpvbmF3cy5jb20vJyxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsIC8vICpHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBldGMuXG4gICAgICAgIG1vZGU6ICdjb3JzJywgLy8gbm8tY29ycywgKmNvcnMsIHNhbWUtb3JpZ2luXG4gICAgICAgIGNhY2hlOiAnbm8tY2FjaGUnLCAvLyAqZGVmYXVsdCwgbm8tY2FjaGUsIHJlbG9hZCwgZm9yY2UtY2FjaGUsIG9ubHktaWYtY2FjaGVkXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAneC1hbXotdGFyZ2V0JzogJ0FXU0NvZ25pdG9JZGVudGl0eVByb3ZpZGVyU2VydmljZS5HZXRVc2VyJyxcbiAgICAgICAgICAneC1hbXotdXNlci1hZ2VudCc6ICdhd3MtYW1wbGlmeS8wLjEueCBqcycsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LWFtei1qc29uLTEuMScsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gbWFudWFsLCAqZm9sbG93LCBlcnJvclxuICAgICAgICAvLyByZWZlcnJlclBvbGljeTogJ25vLXJlZmVycmVyJywgLy8gbm8tcmVmZXJyZXIsICpuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSwgb3JpZ2luLCBvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4sIHNhbWUtb3JpZ2luLCBzdHJpY3Qtb3JpZ2luLCBzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luLCB1bnNhZmUtdXJsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBBY2Nlc3NUb2tlbjogYWNjZXNzVG9rZW4sXG4gICAgICAgIH0pLCAvLyBib2R5IGRhdGEgdHlwZSBtdXN0IG1hdGNoIFwiQ29udGVudC1UeXBlXCIgaGVhZGVyXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICBjb25zdCB2ZXJpZnlUaW1lID0gbW9tZW50KHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdEYXRlJykpLnZhbHVlT2YoKTtcbiAgICBjb25zdCBzZXJ2ZXJUaW1lID0gbm93ICsgdGhpcy5vZmZzZXRNcztcbiAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoc2VydmVyVGltZSAtIHZlcmlmeVRpbWUpO1xuXG4gICAgaWYgKGRpZmYgPiB0aGlzLk1BWF9ESUZGX01TRUMpIHtcbiAgICAgIHRocm93IG5ldyBMckV4Y2VwdGlvbih7XG4gICAgICAgIGNvZGU6IExyRXJyb3JDb2RlLkJhZFRpbWVTeW5jLFxuICAgICAgICBtZXNzYWdlOiBgU2VydmVyIHRpbWUgZG9lcyBub3QgbWF0Y2ggaW5kZXBlbmRlbnQgc291cmNlLiBTZXJ2ZXJUaW1lOiAke3NlcnZlclRpbWV9LCBDb2duaXRvIHRpbWU6ICR7dmVyaWZ5VGltZX1gLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy52ZXJpZmllZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYXBvbGxvXG4gICAgICAucXVlcnk8eyBzZXJ2ZXJUaW1lOiBTZXJ2ZXJUaW1lIH0+KHsgcXVlcnk6IFNlcnZlclRpbWVRdWVyeSB9KVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIGNvbnN0IGVuZCA9IERhdGUubm93KCk7XG5cbiAgICBoYW5kbGVBcG9sbG9FcnJvcihyZXMuZXJyb3JzKTtcblxuICAgIGNvbnN0IHNlcnZlclRpbWUgPSBwYXJzZUludChyZXMuZGF0YS5zZXJ2ZXJUaW1lLnRpbWVzdGFtcCwgMTApO1xuXG4gICAgY29uc3Qgcm91bmR0cmlwID0gZW5kIC0gc3RhcnQ7XG4gICAgdGhpcy5vZmZzZXRNcyA9IHNlcnZlclRpbWUgLSAoc3RhcnQgKyByb3VuZHRyaXAgLyAyKTtcblxuICAgIGlmICh0aGlzLlZFUklGWV9FTkFCTEVEKSB7XG4gICAgICBhd2FpdCB0aGlzLnZlcmlmeUNvZ25pdG8oKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZXJ2ZXJOb3coKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgbmVlZHNSZWZyZXNoID0gZmFsc2U7XG5cbiAgICAvLyBGaXJzdCBjYWxsXG4gICAgaWYgKHRoaXMub2Zmc2V0TXMgPT09IG51bGwpIHtcbiAgICAgIG5lZWRzUmVmcmVzaCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuVkVSSUZZX0VOQUJMRUQpIHtcbiAgICAgIC8vIGxvZ2dlZCBpbiBidXQgbm90IHlldCB2ZXJpZmllZCB0aW1lIG1hdGNoZXMuXG4gICAgICBpZiAoIXRoaXMudmVyaWZpZWQgJiYgKGF3YWl0IHRoaXMuZ2V0QWNjZXNzVG9rZW4oKSkpIHtcbiAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVlZHNSZWZyZXNoKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICByZXR1cm4gRGF0ZS5ub3coKSArIHRoaXMub2Zmc2V0TXM7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { __awaiter, __rest } from "tslib";
|
|
2
|
+
import { LrGraphQLService } from '../api/lr-graphql';
|
|
3
|
+
import { mapEdges, } from '../api/types';
|
|
4
|
+
import { EncryptionService } from '../encryption/encryption.service';
|
|
5
|
+
import { KeyFactoryService } from '../key/key-factory.service';
|
|
6
|
+
import { KeyGraphService } from '../key/key-graph.service';
|
|
7
|
+
import { KeyService } from '../key/key.service';
|
|
8
|
+
import * as slip from '../slip39/slip39.service';
|
|
9
|
+
import { LrBadArgumentException, LrBadStateException, } from '../_common/exceptions';
|
|
10
|
+
import { TpsKeysQuery } from './tp-assembly.private.gql';
|
|
11
|
+
export class TpAssemblyController {
|
|
12
|
+
constructor(injector) {
|
|
13
|
+
this.keyFactory = injector.get(KeyFactoryService);
|
|
14
|
+
this.keyService = injector.get(KeyService);
|
|
15
|
+
this.encryptionService = injector.get(EncryptionService);
|
|
16
|
+
this.keyGraph = injector.get(KeyGraphService);
|
|
17
|
+
this.slip39Service = injector.get(slip.Slip39Service);
|
|
18
|
+
this.lrGraphQl = injector.get(LrGraphQLService);
|
|
19
|
+
}
|
|
20
|
+
recoverAssemblyKey(partials) {
|
|
21
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
// Every receiverPbkCipher should contain this and they should all be the same.
|
|
23
|
+
let assemblyKeyParams;
|
|
24
|
+
const shares = partials.map((partial) => {
|
|
25
|
+
if (assemblyKeyParams) {
|
|
26
|
+
if (JSON.stringify(assemblyKeyParams) !==
|
|
27
|
+
JSON.stringify(partial.assemblyKeyParams)) {
|
|
28
|
+
throw new LrBadStateException('The assembly key parameters are different between the approvals.');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
assemblyKeyParams = partial.assemblyKeyParams;
|
|
33
|
+
}
|
|
34
|
+
return partial.slip39.share.mnemonics;
|
|
35
|
+
});
|
|
36
|
+
const rawAssemblyKey = yield this.slip39Service.recoverSecret(shares, this.slip39Passphrase);
|
|
37
|
+
return yield KeyFactoryService.asKey(Object.assign(Object.assign({}, assemblyKeyParams), { k: rawAssemblyKey }));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
prepareTpWrappingKey(tp) {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
return this.keyGraph.getKey(tp.wrappingKeyId);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
prepareAssembly({ subjectKey, rootKey, }) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
const assemblyKey = yield this.keyFactory.createKey();
|
|
48
|
+
console.log('prepareAssembly assemblyKey', assemblyKey);
|
|
49
|
+
const _a = assemblyKey.toJSON(true), { k: rawAssemblyKey } = _a, assemblyKeyParams = __rest(_a, ["k"]);
|
|
50
|
+
const assemblyKeyVerifierPrk = yield this.keyFactory.createPkcSignKey();
|
|
51
|
+
const wrappedAssemblyKeyVerifierPrk = yield this.encryptionService.encryptToString(assemblyKey, assemblyKeyVerifierPrk.toJSON(true));
|
|
52
|
+
const assemblyKeyVerifierPbk = JSON.stringify(assemblyKeyVerifierPrk.toJSON());
|
|
53
|
+
const subjectKeyWrappedAssemblyKey = yield this.encryptionService.encryptToString(subjectKey, assemblyKey.toJSON(true));
|
|
54
|
+
// Encrypt the rootKey with the assemblyKey
|
|
55
|
+
const assemblyCipherData = yield this.encryptionService.encryptToString(assemblyKey, {
|
|
56
|
+
rootKey: rootKey.toJSON(true),
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
assemblyKey,
|
|
60
|
+
rawAssemblyKey,
|
|
61
|
+
assemblyKeyParams,
|
|
62
|
+
subjectKeyWrappedAssemblyKey,
|
|
63
|
+
assemblyCipherData,
|
|
64
|
+
assemblyKeyVerifierPbk,
|
|
65
|
+
wrappedAssemblyKeyVerifierPrk,
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
prepareCreateSubAssemblies({ input, subjectKey, slipSubAssemblies, assemblyKeyParams, }) {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
return Promise.all(input.map((sa, saIndex) => __awaiter(this, void 0, void 0, function* () {
|
|
72
|
+
const subjectCipherData = yield this.encryptionService.encryptToString(subjectKey, sa.subjectCipherDataClearJson || '');
|
|
73
|
+
const createApprovers = yield Promise.all(sa.approverTps.map((approverTp, approverIndex) => __awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
return this.prepareApprover({
|
|
75
|
+
tp: approverTp,
|
|
76
|
+
approverIndex,
|
|
77
|
+
slipSubAssembly: slipSubAssemblies[saIndex],
|
|
78
|
+
assemblyKeyParams,
|
|
79
|
+
subjectKey,
|
|
80
|
+
});
|
|
81
|
+
})));
|
|
82
|
+
return {
|
|
83
|
+
singleReject: sa.singleReject,
|
|
84
|
+
quorum: sa.quorum,
|
|
85
|
+
subjectCipherData,
|
|
86
|
+
createApprovers,
|
|
87
|
+
};
|
|
88
|
+
})));
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
prepareUpdateSubAssemblies({ input, subjectKey, slipSubAssemblies, assemblyKeyParams, subAssemblies, }) {
|
|
92
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
93
|
+
if (slipSubAssemblies.length !== input.length) {
|
|
94
|
+
throw new LrBadArgumentException('The slipSubAssemblies must be the same length as the input');
|
|
95
|
+
}
|
|
96
|
+
return Promise.all(input.map((sa, saIndex) => __awaiter(this, void 0, void 0, function* () {
|
|
97
|
+
const subjectCipherData = yield this.encryptionService.encryptToString(subjectKey, sa.subjectCipherDataClearJson || '');
|
|
98
|
+
// Get the existing sub-assembly
|
|
99
|
+
const existingSa = subAssemblies.edges.find((edge) => edge.node.id === sa.id).node;
|
|
100
|
+
// Get approvers that do not exist yet
|
|
101
|
+
const createApprovers = [];
|
|
102
|
+
const updateApprovers = [];
|
|
103
|
+
sa.approverTps.forEach((tp) => {
|
|
104
|
+
var _a;
|
|
105
|
+
const approver = (_a = existingSa.approvers.edges.find((edge) => edge.node.tp.id === tp.tpId)) === null || _a === void 0 ? void 0 : _a.node;
|
|
106
|
+
if (approver) {
|
|
107
|
+
updateApprovers.push({
|
|
108
|
+
tp,
|
|
109
|
+
approverId: approver.id,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
createApprovers.push({
|
|
114
|
+
tp,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
const slipSubAssembly = slipSubAssemblies[saIndex];
|
|
119
|
+
return {
|
|
120
|
+
subAssemblyId: sa.id,
|
|
121
|
+
singleReject: sa.singleReject,
|
|
122
|
+
quorum: sa.quorum,
|
|
123
|
+
subjectCipherData,
|
|
124
|
+
createApprovers: yield Promise.all(createApprovers.map(({ tp }, approverIndex) => __awaiter(this, void 0, void 0, function* () {
|
|
125
|
+
return this.prepareApprover({
|
|
126
|
+
tp,
|
|
127
|
+
approverIndex,
|
|
128
|
+
slipSubAssembly,
|
|
129
|
+
assemblyKeyParams,
|
|
130
|
+
subjectKey,
|
|
131
|
+
});
|
|
132
|
+
}))),
|
|
133
|
+
updateApprovers: yield Promise.all(updateApprovers.map(({ tp, approverId }, approverIndex) => __awaiter(this, void 0, void 0, function* () {
|
|
134
|
+
return this.prepareApprover({
|
|
135
|
+
approverId,
|
|
136
|
+
tp,
|
|
137
|
+
approverIndex: approverIndex + createApprovers.length,
|
|
138
|
+
slipSubAssembly,
|
|
139
|
+
assemblyKeyParams,
|
|
140
|
+
subjectKey,
|
|
141
|
+
});
|
|
142
|
+
}))),
|
|
143
|
+
};
|
|
144
|
+
})));
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
fillWrappingKeyId(input, tps) {
|
|
148
|
+
// Fill in wrappingKeyId if not present
|
|
149
|
+
input.forEach((sa) => {
|
|
150
|
+
sa.approverTps.forEach((approver) => {
|
|
151
|
+
if (!approver.wrappingKeyId) {
|
|
152
|
+
const tp = tps.find((x) => x.id === approver.tpId);
|
|
153
|
+
approver.wrappingKeyId = this.getTpWrappingKeyId(tp);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
getInputApprovers(input) {
|
|
159
|
+
const tpIds = [];
|
|
160
|
+
input.forEach((sa) => {
|
|
161
|
+
sa.approverTps.forEach((approver) => {
|
|
162
|
+
tpIds.push(approver.tpId);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
return tpIds;
|
|
166
|
+
}
|
|
167
|
+
prepareCreate(input) {
|
|
168
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
169
|
+
const rootKey = yield this.keyService.getCurrentRootKey();
|
|
170
|
+
const subjectKey = yield this.keyFactory.createKey();
|
|
171
|
+
const rootKeyWrappedSubjectKey = yield this.keyGraph.wrapKey(rootKey, subjectKey);
|
|
172
|
+
const _a = yield this.prepareAssembly({
|
|
173
|
+
rootKey: rootKey.jwk,
|
|
174
|
+
subjectKey,
|
|
175
|
+
}), { assemblyKey, rawAssemblyKey, assemblyKeyParams } = _a, assemblyInput = __rest(_a, ["assemblyKey", "rawAssemblyKey", "assemblyKeyParams"]);
|
|
176
|
+
const slipAssembly = yield this.prepareSlip39(input.createSubAssemblies, input.quorum, rawAssemblyKey);
|
|
177
|
+
const tpIds = this.getInputApprovers(input.createSubAssemblies);
|
|
178
|
+
// This should contain all the TPs that we need to update the assembly.
|
|
179
|
+
const tps = mapEdges((yield this.lrGraphQl.query({
|
|
180
|
+
query: TpsKeysQuery,
|
|
181
|
+
variables: {
|
|
182
|
+
ids: tpIds,
|
|
183
|
+
},
|
|
184
|
+
})).tps);
|
|
185
|
+
// Fill in wrappingKeyId if not present
|
|
186
|
+
this.fillWrappingKeyId(input.createSubAssemblies, tps);
|
|
187
|
+
const createSubAssemblies = yield this.prepareCreateSubAssemblies({
|
|
188
|
+
input: input.createSubAssemblies,
|
|
189
|
+
assemblyKeyParams,
|
|
190
|
+
slipSubAssemblies: slipAssembly.subAssemblies,
|
|
191
|
+
subjectKey,
|
|
192
|
+
});
|
|
193
|
+
const subjectCipherData = yield this.encryptionService.encryptToString(subjectKey, input.subjectCipherDataClearJson || '');
|
|
194
|
+
return {
|
|
195
|
+
assemblyKey,
|
|
196
|
+
mutationInput: Object.assign(Object.assign({}, assemblyInput), { singleReject: input.singleReject, quorum: input.quorum, subjectCipherData,
|
|
197
|
+
createSubAssemblies, rootKeyId: rootKey.id, rootKeyWrappedSubjectKey }),
|
|
198
|
+
};
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
getAssemblyApprovers(assembly) {
|
|
202
|
+
const tpIds = [];
|
|
203
|
+
// Find all TPs that belong to sub-assemblies
|
|
204
|
+
mapEdges(assembly.subAssemblies).map((sa) => {
|
|
205
|
+
mapEdges(sa.approvers).forEach((approver) => tpIds.push(approver.tp.id));
|
|
206
|
+
});
|
|
207
|
+
return tpIds;
|
|
208
|
+
}
|
|
209
|
+
prepareUpdate(input, assembly // TODO type this to only what we need.
|
|
210
|
+
) {
|
|
211
|
+
var _a;
|
|
212
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
213
|
+
input = Object.assign({ createSubAssemblies: [] }, input);
|
|
214
|
+
const createSubAssembliesInput = input.createSubAssemblies || [];
|
|
215
|
+
const updateSubAssembliesInput = input.updateSubAssemblies || [];
|
|
216
|
+
const deleteSubAssembliesInput = input.deleteSubAssemblies || [];
|
|
217
|
+
// Must have at least one.
|
|
218
|
+
if (createSubAssembliesInput.length === 0 &&
|
|
219
|
+
updateSubAssembliesInput.length === 0 &&
|
|
220
|
+
deleteSubAssembliesInput.length === 0) {
|
|
221
|
+
throw new LrBadArgumentException('Must specify at least one of: [createSubAssemblies, updateSubAssemblies, deleteSubAssemblies]');
|
|
222
|
+
}
|
|
223
|
+
const rootKey = yield this.keyService.getCurrentRootKey();
|
|
224
|
+
const subjectKey = yield this.keyGraph.getKey(assembly.subjectKey.id);
|
|
225
|
+
const _b = yield this.prepareAssembly({
|
|
226
|
+
rootKey: rootKey.jwk,
|
|
227
|
+
subjectKey: subjectKey.jwk,
|
|
228
|
+
}), { assemblyKey, rawAssemblyKey, assemblyKeyParams } = _b, assemblyInput = __rest(_b, ["assemblyKey", "rawAssemblyKey", "assemblyKeyParams"]);
|
|
229
|
+
// Find all the TPs that we need, duplicates are no problem.
|
|
230
|
+
// Existing approvers
|
|
231
|
+
const tpIds = this.getAssemblyApprovers(assembly).concat(this.getInputApprovers(createSubAssembliesInput), this.getInputApprovers(updateSubAssembliesInput));
|
|
232
|
+
// This should contain all the TPs that we need to update the assembly.
|
|
233
|
+
const tps = mapEdges((yield this.lrGraphQl.query({
|
|
234
|
+
query: TpsKeysQuery,
|
|
235
|
+
variables: {
|
|
236
|
+
ids: tpIds,
|
|
237
|
+
},
|
|
238
|
+
})).tps);
|
|
239
|
+
// Auto fill the updateSubAssemblies with existing sub assemblies if they are not
|
|
240
|
+
// explicitly deleted.
|
|
241
|
+
mapEdges(assembly.subAssemblies).forEach((existing) => {
|
|
242
|
+
// Deleting existing, don't include it
|
|
243
|
+
if (deleteSubAssembliesInput.includes(existing.id)) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
// Update already specified in the input
|
|
247
|
+
if (updateSubAssembliesInput.some((sa) => sa.id === existing.id)) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const approverTps = mapEdges(existing.approvers).map((approver) => {
|
|
251
|
+
return {
|
|
252
|
+
tpId: approver.tp.id,
|
|
253
|
+
sharedCipherDataClearJson: approver.sharedCipherDataClearJson,
|
|
254
|
+
sharedCipherApprovalDataClearJson: approver.sharedCipherApprovalDataClearJson,
|
|
255
|
+
};
|
|
256
|
+
});
|
|
257
|
+
updateSubAssembliesInput.push({
|
|
258
|
+
id: existing.id,
|
|
259
|
+
quorum: existing.quorum,
|
|
260
|
+
singleReject: existing.singleReject,
|
|
261
|
+
approverTps,
|
|
262
|
+
subjectCipherDataClearJson: existing.subjectCipherDataClearJson,
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
// Fill in wrappingKeyId if not present
|
|
266
|
+
this.fillWrappingKeyId(createSubAssembliesInput, tps);
|
|
267
|
+
this.fillWrappingKeyId(updateSubAssembliesInput, tps);
|
|
268
|
+
let slipAssembly;
|
|
269
|
+
try {
|
|
270
|
+
slipAssembly = yield this.prepareSlip39((createSubAssembliesInput || []).concat(updateSubAssembliesInput || []), input.quorum, rawAssemblyKey);
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
// TODO this sometimes happens. Maybe missing await.
|
|
274
|
+
console.log('Error while creating slip assembly', error);
|
|
275
|
+
}
|
|
276
|
+
const common = {
|
|
277
|
+
assemblyKeyParams,
|
|
278
|
+
subjectKey: subjectKey.jwk,
|
|
279
|
+
};
|
|
280
|
+
const createSubAssemblies = yield this.prepareCreateSubAssemblies(Object.assign(Object.assign({}, common), { input: createSubAssembliesInput,
|
|
281
|
+
// Need to match the slip sub assemblies to the input
|
|
282
|
+
slipSubAssemblies: slipAssembly.subAssemblies.slice(0, createSubAssembliesInput.length) }));
|
|
283
|
+
const updateSubAssemblies = yield this.prepareUpdateSubAssemblies(Object.assign(Object.assign({}, common), { input: updateSubAssembliesInput,
|
|
284
|
+
// Add an offset to the sub assemblies to skip the one that are created.
|
|
285
|
+
slipSubAssemblies: slipAssembly.subAssemblies.slice(createSubAssembliesInput.length), subAssemblies: assembly.subAssemblies }));
|
|
286
|
+
const subjectCipherData = yield this.encryptionService.encryptToString(subjectKey.jwk, (_a = input.subjectCipherDataClearJson) !== null && _a !== void 0 ? _a : assembly.subjectCipherDataClearJson);
|
|
287
|
+
return {
|
|
288
|
+
assemblyKey,
|
|
289
|
+
mutationInput: Object.assign(Object.assign({}, assemblyInput), { singleReject: input.singleReject, quorum: input.quorum, subjectCipherData, subjectKeyId: subjectKey.id, createSubAssemblies,
|
|
290
|
+
updateSubAssemblies }),
|
|
291
|
+
};
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
prepareApprover({ approverId, tp, approverIndex, slipSubAssembly, assemblyKeyParams, subjectKey, }) {
|
|
295
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
296
|
+
const tpWrappingKey = yield this.prepareTpWrappingKey(tp);
|
|
297
|
+
// shared key is rotated every time.
|
|
298
|
+
const sharedKey = yield this.keyFactory.createKey();
|
|
299
|
+
// For TP to access shared_key
|
|
300
|
+
const tpWrappedSharedKey = yield this.encryptionService.encryptToString(tpWrappingKey.jwk, sharedKey.toJSON(true));
|
|
301
|
+
// For subject to access shared_key
|
|
302
|
+
const subjectKeyWrappedSharedKey = yield this.encryptionService.encryptToString(subjectKey, sharedKey.toJSON(true));
|
|
303
|
+
// If quorum is 1, then using the same share for every member.
|
|
304
|
+
const share = slipSubAssembly.threshold === 1
|
|
305
|
+
? slipSubAssembly.shares[0]
|
|
306
|
+
: slipSubAssembly.shares[approverIndex];
|
|
307
|
+
const partialAssemblyKey = {
|
|
308
|
+
slip39: {
|
|
309
|
+
share,
|
|
310
|
+
subAssembly: {
|
|
311
|
+
quorum: slipSubAssembly.threshold,
|
|
312
|
+
size: slipSubAssembly.size,
|
|
313
|
+
},
|
|
314
|
+
},
|
|
315
|
+
assemblyKeyParams,
|
|
316
|
+
};
|
|
317
|
+
console.log('partialAssemblyKey', partialAssemblyKey);
|
|
318
|
+
const sharedCipherData = yield this.encryptionService.encryptToString(sharedKey, tp.sharedCipherDataClearJson || '');
|
|
319
|
+
const sharedCipherApprovalData = yield this.encryptionService.encryptToString(sharedKey, tp.sharedCipherApprovalDataClearJson || '');
|
|
320
|
+
const sharedCipherPartialAssemblyKey = yield this.encryptionService.encryptToString(sharedKey, partialAssemblyKey);
|
|
321
|
+
return {
|
|
322
|
+
tpWrappingKeyId: tpWrappingKey.id,
|
|
323
|
+
tpWrappedSharedKey,
|
|
324
|
+
subjectKeyWrappedSharedKey,
|
|
325
|
+
sharedCipherData,
|
|
326
|
+
sharedCipherApprovalData,
|
|
327
|
+
sharedCipherPartialAssemblyKey,
|
|
328
|
+
approverId: approverId || void 0,
|
|
329
|
+
tpId: approverId ? void 0 : tp.tpId,
|
|
330
|
+
};
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
validateApprovers(approvers) {
|
|
334
|
+
// Ensure all approvers have mkSharedKey.
|
|
335
|
+
for (const tp of approvers) {
|
|
336
|
+
if (!tp.currentUserSharedKey.userSharedKey.mkSharedKey) {
|
|
337
|
+
const msg = `tp ${tp.other.username} does not have mkSharedKey`;
|
|
338
|
+
console.log(msg);
|
|
339
|
+
throw new LrBadArgumentException(msg);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// Prepare slip39
|
|
344
|
+
prepareSlip39(subAssemblies, assemblyQuorum, rawAssemblyKey) {
|
|
345
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
346
|
+
// Is there enough sub assemblies to meet quorum
|
|
347
|
+
if (subAssemblies.length < assemblyQuorum) {
|
|
348
|
+
throw new LrBadArgumentException('Not enough sub assemblies to meet quorum');
|
|
349
|
+
}
|
|
350
|
+
const slipAssembly = new slip.Assembly(assemblyQuorum);
|
|
351
|
+
subAssemblies.forEach((sa, index) => {
|
|
352
|
+
let approverCount = sa.approverTps.length;
|
|
353
|
+
// slip39 restricts quorum == 1 to have only 1 member. So we just share the same
|
|
354
|
+
// partial key for all sub assembly members.
|
|
355
|
+
if (sa.quorum === 1) {
|
|
356
|
+
approverCount = 1;
|
|
357
|
+
}
|
|
358
|
+
slipAssembly.addSubAssembly(new slip.SubAssembly(index, sa.quorum, approverCount));
|
|
359
|
+
});
|
|
360
|
+
yield this.slip39Service.generateShares(rawAssemblyKey, this.slip39Passphrase, slipAssembly);
|
|
361
|
+
return slipAssembly;
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAtYXNzZW1ibHkuanMiLCJzb3VyY2VSb290IjoiL29wdC9hdGxhc3NpYW4vcGlwZWxpbmVzL2FnZW50L2J1aWxkL3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL3RwLWFzc2VtYmx5L3RwLWFzc2VtYmx5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBRUwsUUFBUSxHQUlULE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQsT0FBTyxLQUFLLElBQUksTUFBTSwwQkFBMEIsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG1CQUFtQixHQUNwQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVV6RCxNQUFNLE9BQWdCLG9CQUFvQjtJQVV4QyxZQUFZLFFBQWtCO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEs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LE1BQU0sQ0FBQztnQkFFMUMsZ0ZBQWdGO2dCQUNoRiw0Q0FBNEM7Z0JBQzVDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ25CLGFBQWEsR0FBRyxDQUFDLENBQUM7aUJBQ25CO2dCQUNELFlBQVksQ0FBQyxjQUFjLENBQ3pCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FDdEQsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FDckMsY0FBYyxFQUNkLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsWUFBWSxDQUNiLENBQUM7WUFDRixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO0tBQUE7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKV0sgfSBmcm9tICdub2RlLWpvc2UnO1xuaW1wb3J0IHsgTHJHcmFwaFFMU2VydmljZSB9IGZyb20gJy4uL2FwaS9sci1ncmFwaHFsJztcbmltcG9ydCB7XG4gIENvbm5lY3Rpb24sXG4gIG1hcEVkZ2VzLFxuICBUcEFzc2VtYmx5Tm9kZSxcbiAgVHBOb2RlLFxuICBUcFN1YkFzc2VtYmx5Tm9kZSxcbn0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vZW5jcnlwdGlvbi9lbmNyeXB0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9rZXkva2V5LWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBLZXlHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9rZXkva2V5LWdyYXBoLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL2tleS9rZXkuc2VydmljZSc7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICcuLi9rZXkva2V5LnR5cGVzJztcbmltcG9ydCAqIGFzIHNsaXAgZnJvbSAnLi4vc2xpcDM5L3NsaXAzOS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIExyQmFkQXJndW1lbnRFeGNlcHRpb24sXG4gIExyQmFkU3RhdGVFeGNlcHRpb24sXG59IGZyb20gJy4uL19jb21tb24vZXhjZXB0aW9ucyc7XG5pbXBvcnQgeyBUcHNLZXlzUXVlcnkgfSBmcm9tICcuL3RwLWFzc2VtYmx5LnByaXZhdGUuZ3FsJztcbmltcG9ydCB7XG4gIENyZWF0ZVRwQXNzZW1ibHlJbnB1dCxcbiAgQ3JlYXRlVHBTdWJBc3NlbWJseUlucHV0LFxuICBQYXJ0aWFsQXNzZW1ibHlLZXksXG4gIFRwQXNzZW1ibHlBcHByb3ZlcklucHV0LFxuICBVcGRhdGVUcEFzc2VtYmx5SW5wdXQsXG4gIFVwZGF0ZVRwU3ViQXNzZW1ibHlJbnB1dCxcbn0gZnJvbSAnLi90cC1hc3NlbWJseS50eXBlcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcEFzc2VtYmx5Q29udHJvbGxlciB7XG4gIGFic3RyYWN0IHNsaXAzOVBhc3NwaHJhc2U6IHN0cmluZztcblxuICBwcm90ZWN0ZWQga2V5RmFjdG9yeTogS2V5RmFjdG9yeVNlcnZpY2U7XG4gIHByb3RlY3RlZCBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlO1xuICBwcm90ZWN0ZWQga2V5R3JhcGg6IEtleUdyYXBoU2VydmljZTtcbiAgcHJvdGVjdGVkIHNsaXAzOVNlcnZpY2U6IHNsaXAuU2xpcDM5U2VydmljZTtcbiAgcHJvdGVjdGVkIGxyR3JhcGhRbDogTHJHcmFwaFFMU2VydmljZTtcblxuICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICB0aGlzLmtleUZhY3RvcnkgPSBpbmplY3Rvci5nZXQoS2V5RmFjdG9yeVNlcnZpY2UpO1xuICAgIHRoaXMua2V5U2VydmljZSA9IGluamVjdG9yLmdldChLZXlTZXJ2aWNlKTtcbiAgICB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KEVuY3J5cHRpb25TZXJ2aWNlKTtcbiAgICB0aGlzLmtleUdyYXBoID0gaW5qZWN0b3IuZ2V0KEtleUdyYXBoU2VydmljZSk7XG4gICAgdGhpcy5zbGlwMzlTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KHNsaXAuU2xpcDM5U2VydmljZSk7XG4gICAgdGhpcy5sckdyYXBoUWwgPSBpbmplY3Rvci5nZXQoTHJHcmFwaFFMU2VydmljZSk7XG4gIH1cblxuICBhYnN0cmFjdCBnZXRUcFdyYXBwaW5nS2V5SWQodHA6IFRwTm9kZSk6IHN0cmluZztcblxuICBhc3luYyByZWNvdmVyQXNzZW1ibHlLZXkocGFydGlhbHM6IFBhcnRpYWxBc3NlbWJseUtleVtdKSB7XG4gICAgLy8gRXZlcnkgcmVjZWl2ZXJQYmtDaXBoZXIgc2hvdWxkIGNvbnRhaW4gdGhpcyBhbmQgdGhleSBzaG91bGQgYWxsIGJlIHRoZSBzYW1lLlxuICAgIGxldCBhc3NlbWJseUtleVBhcmFtczogb2JqZWN0O1xuXG4gICAgY29uc3Qgc2hhcmVzID0gcGFydGlhbHMubWFwKChwYXJ0aWFsKSA9PiB7XG4gICAgICBpZiAoYXNzZW1ibHlLZXlQYXJhbXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFzc2VtYmx5S2V5UGFyYW1zKSAhPT1cbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShwYXJ0aWFsLmFzc2VtYmx5S2V5UGFyYW1zKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTHJCYWRTdGF0ZUV4Y2VwdGlvbihcbiAgICAgICAgICAgICdUaGUgYXNzZW1ibHkga2V5IHBhcmFtZXRlcnMgYXJlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBhcHByb3ZhbHMuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VtYmx5S2V5UGFyYW1zID0gcGFydGlhbC5hc3NlbWJseUtleVBhcmFtcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJ0aWFsLnNsaXAzOS5zaGFyZS5tbmVtb25pY3M7XG4gICAgfSk7XG5cbiAgICBjb25zdCByYXdBc3NlbWJseUtleSA9IGF3YWl0IHRoaXMuc2xpcDM5U2VydmljZS5yZWNvdmVyU2VjcmV0KFxuICAgICAgc2hhcmVzLFxuICAgICAgdGhpcy5zbGlwMzlQYXNzcGhyYXNlXG4gICAgKTtcblxuICAgIHJldHVybiBhd2FpdCBLZXlGYWN0b3J5U2VydmljZS5hc0tleSh7XG4gICAgICAuLi5hc3NlbWJseUtleVBhcmFtcyxcbiAgICAgIGs6IHJhd0Fzc2VtYmx5S2V5LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHByZXBhcmVUcFdyYXBwaW5nS2V5KFxuICAgIHRwOiBUcEFzc2VtYmx5QXBwcm92ZXJJbnB1dFxuICApOiBQcm9taXNlPEtleT4ge1xuICAgIHJldHVybiB0aGlzLmtleUdyYXBoLmdldEtleSh0cC53cmFwcGluZ0tleUlkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBwcmVwYXJlQXNzZW1ibHkoe1xuICAgIHN1YmplY3RLZXksXG4gICAgcm9vdEtleSxcbiAgfToge1xuICAgIHN1YmplY3RLZXk6IEpXSy5LZXk7XG4gICAgcm9vdEtleTogSldLLktleTtcbiAgfSkge1xuICAgIGNvbnN0IGFzc2VtYmx5S2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuICAgIGNvbnNvbGUubG9nKCdwcmVwYXJlQXNzZW1ibHkgYXNzZW1ibHlLZXknLCBhc3NlbWJseUtleSk7XG5cbiAgICBjb25zdCB7IGs6IHJhd0Fzc2VtYmx5S2V5LCAuLi5hc3NlbWJseUtleVBhcmFtcyB9ID0gYXNzZW1ibHlLZXkudG9KU09OKFxuICAgICAgdHJ1ZVxuICAgICkgYXMgYW55O1xuICAgIGNvbnN0IGFzc2VtYmx5S2V5VmVyaWZpZXJQcmsgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlUGtjU2lnbktleSgpO1xuICAgIGNvbnN0IHdyYXBwZWRBc3NlbWJseUtleVZlcmlmaWVyUHJrID1cbiAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgICBhc3NlbWJseUtleSxcbiAgICAgICAgYXNzZW1ibHlLZXlWZXJpZmllclByay50b0pTT04odHJ1ZSlcbiAgICAgICk7XG4gICAgY29uc3QgYXNzZW1ibHlLZXlWZXJpZmllclBiayA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgYXNzZW1ibHlLZXlWZXJpZmllclByay50b0pTT04oKVxuICAgICk7XG5cbiAgICBjb25zdCBzdWJqZWN0S2V5V3JhcHBlZEFzc2VtYmx5S2V5ID1cbiAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgICBzdWJqZWN0S2V5LFxuICAgICAgICBhc3NlbWJseUtleS50b0pTT04odHJ1ZSlcbiAgICAgICk7XG5cbiAgICAvLyBFbmNyeXB0IHRoZSByb290S2V5IHdpdGggdGhlIGFzc2VtYmx5S2V5XG4gICAgY29uc3QgYXNzZW1ibHlDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBhc3NlbWJseUtleSxcbiAgICAgIHtcbiAgICAgICAgcm9vdEtleTogcm9vdEtleS50b0pTT04odHJ1ZSksXG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhc3NlbWJseUtleSxcbiAgICAgIHJhd0Fzc2VtYmx5S2V5LFxuICAgICAgYXNzZW1ibHlLZXlQYXJhbXMsXG4gICAgICBzdWJqZWN0S2V5V3JhcHBlZEFzc2VtYmx5S2V5LFxuICAgICAgYXNzZW1ibHlDaXBoZXJEYXRhLFxuICAgICAgYXNzZW1ibHlLZXlWZXJpZmllclBiayxcbiAgICAgIHdyYXBwZWRBc3NlbWJseUtleVZlcmlmaWVyUHJrLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcHJlcGFyZUNyZWF0ZVN1YkFzc2VtYmxpZXMoe1xuICAgIGlucHV0LFxuICAgIHN1YmplY3RLZXksXG4gICAgc2xpcFN1YkFzc2VtYmxpZXMsXG4gICAgYXNzZW1ibHlLZXlQYXJhbXMsXG4gIH06IHtcbiAgICBpbnB1dDogQ3JlYXRlVHBTdWJBc3NlbWJseUlucHV0W107XG4gICAgc3ViamVjdEtleTogSldLLktleTtcbiAgICBzbGlwU3ViQXNzZW1ibGllczogc2xpcC5TdWJBc3NlbWJseVtdO1xuICAgIGFzc2VtYmx5S2V5UGFyYW1zOyAvLyBUT0RPIHR5cGUgdGhpc1xuICB9KSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgaW5wdXQubWFwKGFzeW5jIChzYSwgc2FJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzdWJqZWN0Q2lwaGVyRGF0YSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgICAgIHN1YmplY3RLZXksXG4gICAgICAgICAgc2Euc3ViamVjdENpcGhlckRhdGFDbGVhckpzb24gfHwgJydcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBjcmVhdGVBcHByb3ZlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBzYS5hcHByb3ZlclRwcy5tYXAoYXN5bmMgKGFwcHJvdmVyVHAsIGFwcHJvdmVySW5kZXgpID0+XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVBcHByb3Zlcih7XG4gICAgICAgICAgICAgIHRwOiBhcHByb3ZlclRwLFxuICAgICAgICAgICAgICBhcHByb3ZlckluZGV4LFxuICAgICAgICAgICAgICBzbGlwU3ViQXNzZW1ibHk6IHNsaXBTdWJBc3NlbWJsaWVzW3NhSW5kZXhdLFxuICAgICAgICAgICAgICBhc3NlbWJseUtleVBhcmFtcyxcbiAgICAgICAgICAgICAgc3ViamVjdEtleSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2luZ2xlUmVqZWN0OiBzYS5zaW5nbGVSZWplY3QsXG4gICAgICAgICAgcXVvcnVtOiBzYS5xdW9ydW0sXG4gICAgICAgICAgc3ViamVjdENpcGhlckRhdGEsXG4gICAgICAgICAgY3JlYXRlQXBwcm92ZXJzLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHByZXBhcmVVcGRhdGVTdWJBc3NlbWJsaWVzKHtcbiAgICBpbnB1dCxcbiAgICBzdWJqZWN0S2V5LFxuICAgIHNsaXBTdWJBc3NlbWJsaWVzLFxuICAgIGFzc2VtYmx5S2V5UGFyYW1zLFxuICAgIHN1YkFzc2VtYmxpZXMsXG4gIH06IHtcbiAgICBpbnB1dDogVXBkYXRlVHBTdWJBc3NlbWJseUlucHV0W107XG4gICAgc3ViamVjdEtleTogSldLLktleTtcbiAgICBzbGlwU3ViQXNzZW1ibGllczogc2xpcC5TdWJBc3NlbWJseVtdO1xuICAgIGFzc2VtYmx5S2V5UGFyYW1zOyAvLyBUT0RPIHR5cGUgdGhpc1xuICAgIHN1YkFzc2VtYmxpZXM6IENvbm5lY3Rpb248VHBTdWJBc3NlbWJseU5vZGU+O1xuICB9KSB7XG4gICAgaWYgKHNsaXBTdWJBc3NlbWJsaWVzLmxlbmd0aCAhPT0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgTHJCYWRBcmd1bWVudEV4Y2VwdGlvbihcbiAgICAgICAgJ1RoZSBzbGlwU3ViQXNzZW1ibGllcyBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgaW5wdXQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlucHV0Lm1hcChhc3luYyAoc2EsIHNhSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc3ViamVjdENpcGhlckRhdGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgICAgICBzdWJqZWN0S2V5LFxuICAgICAgICAgIHNhLnN1YmplY3RDaXBoZXJEYXRhQ2xlYXJKc29uIHx8ICcnXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBleGlzdGluZyBzdWItYXNzZW1ibHlcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTYSA9IHN1YkFzc2VtYmxpZXMuZWRnZXMuZmluZChcbiAgICAgICAgICAoZWRnZSkgPT4gZWRnZS5ub2RlLmlkID09PSBzYS5pZFxuICAgICAgICApLm5vZGU7XG5cbiAgICAgICAgLy8gR2V0IGFwcHJvdmVycyB0aGF0IGRvIG5vdCBleGlzdCB5ZXRcbiAgICAgICAgY29uc3QgY3JlYXRlQXBwcm92ZXJzID0gW107XG4gICAgICAgIGNvbnN0IHVwZGF0ZUFwcHJvdmVycyA9IFtdO1xuXG4gICAgICAgIHNhLmFwcHJvdmVyVHBzLmZvckVhY2goKHRwKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXBwcm92ZXIgPSBleGlzdGluZ1NhLmFwcHJvdmVycy5lZGdlcy5maW5kKFxuICAgICAgICAgICAgKGVkZ2UpID0+IGVkZ2Uubm9kZS50cC5pZCA9PT0gdHAudHBJZFxuICAgICAgICAgICk/Lm5vZGU7XG4gICAgICAgICAgaWYgKGFwcHJvdmVyKSB7XG4gICAgICAgICAgICB1cGRhdGVBcHByb3ZlcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRwLFxuICAgICAgICAgICAgICBhcHByb3ZlcklkOiBhcHByb3Zlci5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmVhdGVBcHByb3ZlcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzbGlwU3ViQXNzZW1ibHkgPSBzbGlwU3ViQXNzZW1ibGllc1tzYUluZGV4XTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1YkFzc2VtYmx5SWQ6IHNhLmlkLFxuICAgICAgICAgIHNpbmdsZVJlamVjdDogc2Euc2luZ2xlUmVqZWN0LFxuICAgICAgICAgIHF1b3J1bTogc2EucXVvcnVtLFxuICAgICAgICAgIHN1YmplY3RDaXBoZXJEYXRhLFxuICAgICAgICAgIGNyZWF0ZUFwcHJvdmVyczogYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBjcmVhdGVBcHByb3ZlcnMubWFwKGFzeW5jICh7IHRwIH0sIGFwcHJvdmVySW5kZXgpID0+XG4gICAgICAgICAgICAgIHRoaXMucHJlcGFyZUFwcHJvdmVyKHtcbiAgICAgICAgICAgICAgICB0cCxcbiAgICAgICAgICAgICAgICBhcHByb3ZlckluZGV4LFxuICAgICAgICAgICAgICAgIHNsaXBTdWJBc3NlbWJseSxcbiAgICAgICAgICAgICAgICBhc3NlbWJseUtleVBhcmFtcyxcbiAgICAgICAgICAgICAgICBzdWJqZWN0S2V5LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgdXBkYXRlQXBwcm92ZXJzOiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHVwZGF0ZUFwcHJvdmVycy5tYXAoYXN5bmMgKHsgdHAsIGFwcHJvdmVySWQgfSwgYXBwcm92ZXJJbmRleCkgPT5cbiAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlQXBwcm92ZXIoe1xuICAgICAgICAgICAgICAgIGFwcHJvdmVySWQsXG4gICAgICAgICAgICAgICAgdHAsXG4gICAgICAgICAgICAgICAgYXBwcm92ZXJJbmRleDogYXBwcm92ZXJJbmRleCArIGNyZWF0ZUFwcHJvdmVycy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgc2xpcFN1YkFzc2VtYmx5LFxuICAgICAgICAgICAgICAgIGFzc2VtYmx5S2V5UGFyYW1zLFxuICAgICAgICAgICAgICAgIHN1YmplY3RLZXksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsbFdyYXBwaW5nS2V5SWQoaW5wdXQ6IENyZWF0ZVRwU3ViQXNzZW1ibHlJbnB1dFtdLCB0cHM6IFRwTm9kZVtdKSB7XG4gICAgLy8gRmlsbCBpbiB3cmFwcGluZ0tleUlkIGlmIG5vdCBwcmVzZW50XG4gICAgaW5wdXQuZm9yRWFjaCgoc2EpID0+IHtcbiAgICAgIHNhLmFwcHJvdmVyVHBzLmZvckVhY2goKGFwcHJvdmVyKSA9PiB7XG4gICAgICAgIGlmICghYXBwcm92ZXIud3JhcHBpbmdLZXlJZCkge1xuICAgICAgICAgIGNvbnN0IHRwID0gdHBzLmZpbmQoKHgpID0+IHguaWQgPT09IGFwcHJvdmVyLnRwSWQpO1xuICAgICAgICAgIGFwcHJvdmVyLndyYXBwaW5nS2V5SWQgPSB0aGlzLmdldFRwV3JhcHBpbmdLZXlJZCh0cCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbnB1dEFwcHJvdmVycyhpbnB1dDogQ3JlYXRlVHBTdWJBc3NlbWJseUlucHV0W10pIHtcbiAgICBjb25zdCB0cElkczogc3RyaW5nW10gPSBbXTtcbiAgICBpbnB1dC5mb3JFYWNoKChzYSkgPT4ge1xuICAgICAgc2EuYXBwcm92ZXJUcHMuZm9yRWFjaCgoYXBwcm92ZXIpID0+IHtcbiAgICAgICAgdHBJZHMucHVzaChhcHByb3Zlci50cElkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0cElkcztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwcmVwYXJlQ3JlYXRlKGlucHV0OiBDcmVhdGVUcEFzc2VtYmx5SW5wdXQpIHtcbiAgICBjb25zdCByb290S2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRSb290S2V5KCk7XG4gICAgY29uc3Qgc3ViamVjdEtleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcbiAgICBjb25zdCByb290S2V5V3JhcHBlZFN1YmplY3RLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLndyYXBLZXkoXG4gICAgICByb290S2V5LFxuICAgICAgc3ViamVjdEtleVxuICAgICk7XG5cbiAgICBjb25zdCB7IGFzc2VtYmx5S2V5LCByYXdBc3NlbWJseUtleSwgYXNzZW1ibHlLZXlQYXJhbXMsIC4uLmFzc2VtYmx5SW5wdXQgfSA9XG4gICAgICBhd2FpdCB0aGlzLnByZXBhcmVBc3NlbWJseSh7XG4gICAgICAgIHJvb3RLZXk6IHJvb3RLZXkuandrLFxuICAgICAgICBzdWJqZWN0S2V5LFxuICAgICAgfSk7XG5cbiAgICBjb25zdCBzbGlwQXNzZW1ibHkgPSBhd2FpdCB0aGlzLnByZXBhcmVTbGlwMzkoXG4gICAgICBpbnB1dC5jcmVhdGVTdWJBc3NlbWJsaWVzLFxuICAgICAgaW5wdXQucXVvcnVtLFxuICAgICAgcmF3QXNzZW1ibHlLZXlcbiAgICApO1xuXG4gICAgY29uc3QgdHBJZHMgPSB0aGlzLmdldElucHV0QXBwcm92ZXJzKGlucHV0LmNyZWF0ZVN1YkFzc2VtYmxpZXMpO1xuXG4gICAgLy8gVGhpcyBzaG91bGQgY29udGFpbiBhbGwgdGhlIFRQcyB0aGF0IHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBhc3NlbWJseS5cbiAgICBjb25zdCB0cHMgPSBtYXBFZGdlcyhcbiAgICAgIChcbiAgICAgICAgYXdhaXQgdGhpcy5sckdyYXBoUWwucXVlcnkoe1xuICAgICAgICAgIHF1ZXJ5OiBUcHNLZXlzUXVlcnksXG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBpZHM6IHRwSWRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRwc1xuICAgICk7XG5cbiAgICAvLyBGaWxsIGluIHdyYXBwaW5nS2V5SWQgaWYgbm90IHByZXNlbnRcbiAgICB0aGlzLmZpbGxXcmFwcGluZ0tleUlkKGlucHV0LmNyZWF0ZVN1YkFzc2VtYmxpZXMsIHRwcyk7XG5cbiAgICBjb25zdCBjcmVhdGVTdWJBc3NlbWJsaWVzID0gYXdhaXQgdGhpcy5wcmVwYXJlQ3JlYXRlU3ViQXNzZW1ibGllcyh7XG4gICAgICBpbnB1dDogaW5wdXQuY3JlYXRlU3ViQXNzZW1ibGllcyxcbiAgICAgIGFzc2VtYmx5S2V5UGFyYW1zLFxuICAgICAgc2xpcFN1YkFzc2VtYmxpZXM6IHNsaXBBc3NlbWJseS5zdWJBc3NlbWJsaWVzLFxuICAgICAgc3ViamVjdEtleSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN1YmplY3RDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBzdWJqZWN0S2V5LFxuICAgICAgaW5wdXQuc3ViamVjdENpcGhlckRhdGFDbGVhckpzb24gfHwgJydcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgbXV0YXRpb25JbnB1dDoge1xuICAgICAgICAuLi5hc3NlbWJseUlucHV0LFxuICAgICAgICBzaW5nbGVSZWplY3Q6IGlucHV0LnNpbmdsZVJlamVjdCxcbiAgICAgICAgcXVvcnVtOiBpbnB1dC5xdW9ydW0sXG4gICAgICAgIHN1YmplY3RDaXBoZXJEYXRhLFxuICAgICAgICBjcmVhdGVTdWJBc3NlbWJsaWVzLFxuICAgICAgICByb290S2V5SWQ6IHJvb3RLZXkuaWQsXG4gICAgICAgIHJvb3RLZXlXcmFwcGVkU3ViamVjdEtleSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXNzZW1ibHlBcHByb3ZlcnMoYXNzZW1ibHk6IFRwQXNzZW1ibHlOb2RlKSB7XG4gICAgY29uc3QgdHBJZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBGaW5kIGFsbCBUUHMgdGhhdCBiZWxvbmcgdG8gc3ViLWFzc2VtYmxpZXNcbiAgICBtYXBFZGdlcyhhc3NlbWJseS5zdWJBc3NlbWJsaWVzKS5tYXAoKHNhKSA9PiB7XG4gICAgICBtYXBFZGdlcyhzYS5hcHByb3ZlcnMpLmZvckVhY2goKGFwcHJvdmVyKSA9PiB0cElkcy5wdXNoKGFwcHJvdmVyLnRwLmlkKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHBJZHM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZVVwZGF0ZShcbiAgICBpbnB1dDogVXBkYXRlVHBBc3NlbWJseUlucHV0LFxuICAgIGFzc2VtYmx5OiBUcEFzc2VtYmx5Tm9kZSAvLyBUT0RPIHR5cGUgdGhpcyB0byBvbmx5IHdoYXQgd2UgbmVlZC5cbiAgKSB7XG4gICAgaW5wdXQgPSB7XG4gICAgICBjcmVhdGVTdWJBc3NlbWJsaWVzOiBbXSxcbiAgICAgIC4uLmlucHV0LFxuICAgIH07XG5cbiAgICBjb25zdCBjcmVhdGVTdWJBc3NlbWJsaWVzSW5wdXQgPSBpbnB1dC5jcmVhdGVTdWJBc3NlbWJsaWVzIHx8IFtdO1xuICAgIGNvbnN0IHVwZGF0ZVN1YkFzc2VtYmxpZXNJbnB1dCA9IGlucHV0LnVwZGF0ZVN1YkFzc2VtYmxpZXMgfHwgW107XG4gICAgY29uc3QgZGVsZXRlU3ViQXNzZW1ibGllc0lucHV0ID0gaW5wdXQuZGVsZXRlU3ViQXNzZW1ibGllcyB8fCBbXTtcblxuICAgIC8vIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUuXG4gICAgaWYgKFxuICAgICAgY3JlYXRlU3ViQXNzZW1ibGllc0lucHV0Lmxlbmd0aCA9PT0gMCAmJlxuICAgICAgdXBkYXRlU3ViQXNzZW1ibGllc0lucHV0Lmxlbmd0aCA9PT0gMCAmJlxuICAgICAgZGVsZXRlU3ViQXNzZW1ibGllc0lucHV0Lmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IExyQmFkQXJndW1lbnRFeGNlcHRpb24oXG4gICAgICAgICdNdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIG9mOiBbY3JlYXRlU3ViQXNzZW1ibGllcywgdXBkYXRlU3ViQXNzZW1ibGllcywgZGVsZXRlU3ViQXNzZW1ibGllc10nXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3RLZXkgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFJvb3RLZXkoKTtcbiAgICBjb25zdCBzdWJqZWN0S2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRLZXkoYXNzZW1ibHkuc3ViamVjdEtleS5pZCk7XG5cbiAgICBjb25zdCB7IGFzc2VtYmx5S2V5LCByYXdBc3NlbWJseUtleSwgYXNzZW1ibHlLZXlQYXJhbXMsIC4uLmFzc2VtYmx5SW5wdXQgfSA9XG4gICAgICBhd2FpdCB0aGlzLnByZXBhcmVBc3NlbWJseSh7XG4gICAgICAgIHJvb3RLZXk6IHJvb3RLZXkuandrLFxuICAgICAgICBzdWJqZWN0S2V5OiBzdWJqZWN0S2V5Lmp3ayxcbiAgICAgIH0pO1xuXG4gICAgLy8gRmluZCBhbGwgdGhlIFRQcyB0aGF0IHdlIG5lZWQsIGR1cGxpY2F0ZXMgYXJlIG5vIHByb2JsZW0uXG4gICAgLy8gRXhpc3RpbmcgYXBwcm92ZXJzXG4gICAgY29uc3QgdHBJZHMgPSB0aGlzLmdldEFzc2VtYmx5QXBwcm92ZXJzKGFzc2VtYmx5KS5jb25jYXQoXG4gICAgICB0aGlzLmdldElucHV0QXBwcm92ZXJzKGNyZWF0ZVN1YkFzc2VtYmxpZXNJbnB1dCksXG4gICAgICB0aGlzLmdldElucHV0QXBwcm92ZXJzKHVwZGF0ZVN1YkFzc2VtYmxpZXNJbnB1dClcbiAgICApO1xuXG4gICAgLy8gVGhpcyBzaG91bGQgY29udGFpbiBhbGwgdGhlIFRQcyB0aGF0IHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBhc3NlbWJseS5cbiAgICBjb25zdCB0cHMgPSBtYXBFZGdlcyhcbiAgICAgIChcbiAgICAgICAgYXdhaXQgdGhpcy5sckdyYXBoUWwucXVlcnkoe1xuICAgICAgICAgIHF1ZXJ5OiBUcHNLZXlzUXVlcnksXG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBpZHM6IHRwSWRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRwc1xuICAgICk7XG5cbiAgICAvLyBBdXRvIGZpbGwgdGhlIHVwZGF0ZVN1YkFzc2VtYmxpZXMgd2l0aCBleGlzdGluZyBzdWIgYXNzZW1ibGllcyBpZiB0aGV5IGFyZSBub3RcbiAgICAvLyBleHBsaWNpdGx5IGRlbGV0ZWQuXG4gICAgbWFwRWRnZXMoYXNzZW1ibHkuc3ViQXNzZW1ibGllcykuZm9yRWFjaCgoZXhpc3RpbmcpID0+IHtcbiAgICAgIC8vIERlbGV0aW5nIGV4aXN0aW5nLCBkb24ndCBpbmNsdWRlIGl0XG4gICAgICBpZiAoZGVsZXRlU3ViQXNzZW1ibGllc0lucHV0LmluY2x1ZGVzKGV4aXN0aW5nLmlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBhbHJlYWR5IHNwZWNpZmllZCBpbiB0aGUgaW5wdXRcbiAgICAgIGlmICh1cGRhdGVTdWJBc3NlbWJsaWVzSW5wdXQuc29tZSgoc2EpID0+IHNhLmlkID09PSBleGlzdGluZy5pZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhcHByb3ZlclRwczogVHBBc3NlbWJseUFwcHJvdmVySW5wdXRbXSA9IG1hcEVkZ2VzKFxuICAgICAgICBleGlzdGluZy5hcHByb3ZlcnNcbiAgICAgICkubWFwKChhcHByb3ZlcikgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRwSWQ6IGFwcHJvdmVyLnRwLmlkLFxuICAgICAgICAgIHNoYXJlZENpcGhlckRhdGFDbGVhckpzb246IGFwcHJvdmVyLnNoYXJlZENpcGhlckRhdGFDbGVhckpzb24sXG4gICAgICAgICAgc2hhcmVkQ2lwaGVyQXBwcm92YWxEYXRhQ2xlYXJKc29uOlxuICAgICAgICAgICAgYXBwcm92ZXIuc2hhcmVkQ2lwaGVyQXBwcm92YWxEYXRhQ2xlYXJKc29uLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZVN1YkFzc2VtYmxpZXNJbnB1dC5wdXNoKHtcbiAgICAgICAgaWQ6IGV4aXN0aW5nLmlkLFxuICAgICAgICBxdW9ydW06IGV4aXN0aW5nLnF1b3J1bSxcbiAgICAgICAgc2luZ2xlUmVqZWN0OiBleGlzdGluZy5zaW5nbGVSZWplY3QsXG4gICAgICAgIGFwcHJvdmVyVHBzLFxuICAgICAgICBzdWJqZWN0Q2lwaGVyRGF0YUNsZWFySnNvbjogZXhpc3Rpbmcuc3ViamVjdENpcGhlckRhdGFDbGVhckpzb24sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEZpbGwgaW4gd3JhcHBpbmdLZXlJZCBpZiBub3QgcHJlc2VudFxuICAgIHRoaXMuZmlsbFdyYXBwaW5nS2V5SWQoY3JlYXRlU3ViQXNzZW1ibGllc0lucHV0LCB0cHMpO1xuICAgIHRoaXMuZmlsbFdyYXBwaW5nS2V5SWQodXBkYXRlU3ViQXNzZW1ibGllc0lucHV0LCB0cHMpO1xuXG4gICAgbGV0IHNsaXBBc3NlbWJseTtcbiAgICB0cnkge1xuICAgICAgc2xpcEFzc2VtYmx5ID0gYXdhaXQgdGhpcy5wcmVwYXJlU2xpcDM5KFxuICAgICAgICAoY3JlYXRlU3ViQXNzZW1ibGllc0lucHV0IHx8IFtdKS5jb25jYXQodXBkYXRlU3ViQXNzZW1ibGllc0lucHV0IHx8IFtdKSxcbiAgICAgICAgaW5wdXQucXVvcnVtLFxuICAgICAgICByYXdBc3NlbWJseUtleVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gVE9ETyB0aGlzIHNvbWV0aW1lcyBoYXBwZW5zLiBNYXliZSBtaXNzaW5nIGF3YWl0LlxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHdoaWxlIGNyZWF0aW5nIHNsaXAgYXNzZW1ibHknLCBlcnJvcik7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbW9uID0ge1xuICAgICAgYXNzZW1ibHlLZXlQYXJhbXMsXG4gICAgICBzdWJqZWN0S2V5OiBzdWJqZWN0S2V5Lmp3ayxcbiAgICB9O1xuXG4gICAgY29uc3QgY3JlYXRlU3ViQXNzZW1ibGllcyA9IGF3YWl0IHRoaXMucHJlcGFyZUNyZWF0ZVN1YkFzc2VtYmxpZXMoe1xuICAgICAgLi4uY29tbW9uLFxuICAgICAgaW5wdXQ6IGNyZWF0ZVN1YkFzc2VtYmxpZXNJbnB1dCxcbiAgICAgIC8vIE5lZWQgdG8gbWF0Y2ggdGhlIHNsaXAgc3ViIGFzc2VtYmxpZXMgdG8gdGhlIGlucHV0XG4gICAgICBzbGlwU3ViQXNzZW1ibGllczogc2xpcEFzc2VtYmx5LnN1YkFzc2VtYmxpZXMuc2xpY2UoXG4gICAgICAgIDAsXG4gICAgICAgIGNyZWF0ZVN1YkFzc2VtYmxpZXNJbnB1dC5sZW5ndGhcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICBjb25zdCB1cGRhdGVTdWJBc3NlbWJsaWVzID0gYXdhaXQgdGhpcy5wcmVwYXJlVXBkYXRlU3ViQXNzZW1ibGllcyh7XG4gICAgICAuLi5jb21tb24sXG4gICAgICBpbnB1dDogdXBkYXRlU3ViQXNzZW1ibGllc0lucHV0LFxuICAgICAgLy8gQWRkIGFuIG9mZnNldCB0byB0aGUgc3ViIGFzc2VtYmxpZXMgdG8gc2tpcCB0aGUgb25lIHRoYXQgYXJlIGNyZWF0ZWQuXG4gICAgICBzbGlwU3ViQXNzZW1ibGllczogc2xpcEFzc2VtYmx5LnN1YkFzc2VtYmxpZXMuc2xpY2UoXG4gICAgICAgIGNyZWF0ZVN1YkFzc2VtYmxpZXNJbnB1dC5sZW5ndGhcbiAgICAgICksXG4gICAgICBzdWJBc3NlbWJsaWVzOiBhc3NlbWJseS5zdWJBc3NlbWJsaWVzLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3ViamVjdENpcGhlckRhdGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgIHN1YmplY3RLZXkuandrLFxuICAgICAgaW5wdXQuc3ViamVjdENpcGhlckRhdGFDbGVhckpzb24gPz8gYXNzZW1ibHkuc3ViamVjdENpcGhlckRhdGFDbGVhckpzb25cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgbXV0YXRpb25JbnB1dDoge1xuICAgICAgICAuLi5hc3NlbWJseUlucHV0LFxuICAgICAgICBzaW5nbGVSZWplY3Q6IGlucHV0LnNpbmdsZVJlamVjdCxcbiAgICAgICAgcXVvcnVtOiBpbnB1dC5xdW9ydW0sXG4gICAgICAgIHN1YmplY3RDaXBoZXJEYXRhLFxuICAgICAgICBzdWJqZWN0S2V5SWQ6IHN1YmplY3RLZXkuaWQsXG4gICAgICAgIGNyZWF0ZVN1YkFzc2VtYmxpZXMsXG4gICAgICAgIHVwZGF0ZVN1YkFzc2VtYmxpZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVBcHByb3Zlcih7XG4gICAgYXBwcm92ZXJJZCxcbiAgICB0cCxcbiAgICBhcHByb3ZlckluZGV4LFxuICAgIHNsaXBTdWJBc3NlbWJseSxcbiAgICBhc3NlbWJseUtleVBhcmFtcyxcbiAgICBzdWJqZWN0S2V5LFxuICB9OiB7XG4gICAgYXBwcm92ZXJJZD86IHN0cmluZzsgLy8gR2l2ZW4gaWYgdXBkYXRpbmcgZXhpc3RpbmcgYXBwcm92ZXJcbiAgICB0cDogVHBBc3NlbWJseUFwcHJvdmVySW5wdXQ7XG4gICAgYXBwcm92ZXJJbmRleDogbnVtYmVyO1xuICAgIHNsaXBTdWJBc3NlbWJseTogc2xpcC5TdWJBc3NlbWJseTtcbiAgICBhc3NlbWJseUtleVBhcmFtczogb2JqZWN0O1xuICAgIHN1YmplY3RLZXk6IEpXSy5LZXk7XG4gIH0pIHtcbiAgICBjb25zdCB0cFdyYXBwaW5nS2V5ID0gYXdhaXQgdGhpcy5wcmVwYXJlVHBXcmFwcGluZ0tleSh0cCk7XG4gICAgLy8gc2hhcmVkIGtleSBpcyByb3RhdGVkIGV2ZXJ5IHRpbWUuXG4gICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuXG4gICAgLy8gRm9yIFRQIHRvIGFjY2VzcyBzaGFyZWRfa2V5XG4gICAgY29uc3QgdHBXcmFwcGVkU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICB0cFdyYXBwaW5nS2V5Lmp3ayxcbiAgICAgIHNoYXJlZEtleS50b0pTT04odHJ1ZSlcbiAgICApO1xuICAgIC8vIEZvciBzdWJqZWN0IHRvIGFjY2VzcyBzaGFyZWRfa2V5XG4gICAgY29uc3Qgc3ViamVjdEtleVdyYXBwZWRTaGFyZWRLZXkgPVxuICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICAgIHN1YmplY3RLZXksXG4gICAgICAgIHNoYXJlZEtleS50b0pTT04odHJ1ZSlcbiAgICAgICk7XG5cbiAgICAvLyBJZiBxdW9ydW0gaXMgMSwgdGhlbiB1c2luZyB0aGUgc2FtZSBzaGFyZSBmb3IgZXZlcnkgbWVtYmVyLlxuICAgIGNvbnN0IHNoYXJlID1cbiAgICAgIHNsaXBTdWJBc3NlbWJseS50aHJlc2hvbGQgPT09IDFcbiAgICAgICAgPyBzbGlwU3ViQXNzZW1ibHkuc2hhcmVzWzBdXG4gICAgICAgIDogc2xpcFN1YkFzc2VtYmx5LnNoYXJlc1thcHByb3ZlckluZGV4XTtcblxuICAgIGNvbnN0IHBhcnRpYWxBc3NlbWJseUtleTogUGFydGlhbEFzc2VtYmx5S2V5ID0ge1xuICAgICAgc2xpcDM5OiB7XG4gICAgICAgIHNoYXJlLFxuICAgICAgICBzdWJBc3NlbWJseToge1xuICAgICAgICAgIHF1b3J1bTogc2xpcFN1YkFzc2VtYmx5LnRocmVzaG9sZCxcbiAgICAgICAgICBzaXplOiBzbGlwU3ViQXNzZW1ibHkuc2l6ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhc3NlbWJseUtleVBhcmFtcyxcbiAgICB9O1xuXG4gICAgY29uc29sZS5sb2coJ3BhcnRpYWxBc3NlbWJseUtleScsIHBhcnRpYWxBc3NlbWJseUtleSk7XG5cbiAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBzaGFyZWRLZXksXG4gICAgICB0cC5zaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uIHx8ICcnXG4gICAgKTtcblxuICAgIGNvbnN0IHNoYXJlZENpcGhlckFwcHJvdmFsRGF0YSA9XG4gICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgICAgc2hhcmVkS2V5LFxuICAgICAgICB0cC5zaGFyZWRDaXBoZXJBcHByb3ZhbERhdGFDbGVhckpzb24gfHwgJydcbiAgICAgICk7XG5cbiAgICBjb25zdCBzaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXkgPVxuICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICAgIHNoYXJlZEtleSxcbiAgICAgICAgcGFydGlhbEFzc2VtYmx5S2V5XG4gICAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRwV3JhcHBpbmdLZXlJZDogdHBXcmFwcGluZ0tleS5pZCxcbiAgICAgIHRwV3JhcHBlZFNoYXJlZEtleSxcbiAgICAgIHN1YmplY3RLZXlXcmFwcGVkU2hhcmVkS2V5LFxuICAgICAgc2hhcmVkQ2lwaGVyRGF0YSxcbiAgICAgIHNoYXJlZENpcGhlckFwcHJvdmFsRGF0YSxcbiAgICAgIHNoYXJlZENpcGhlclBhcnRpYWxBc3NlbWJseUtleSxcbiAgICAgIGFwcHJvdmVySWQ6IGFwcHJvdmVySWQgfHwgdm9pZCAwLCAvLyBJZiBleGlzdGluZyBhcHByb3ZlclxuICAgICAgdHBJZDogYXBwcm92ZXJJZCA/IHZvaWQgMCA6IHRwLnRwSWQsIC8vIGVsc2UgYWRkaW5nIG5ldyBUUFxuICAgIH07XG4gIH1cblxuICB2YWxpZGF0ZUFwcHJvdmVycyhhcHByb3ZlcnM6IFRwTm9kZVtdKTogdm9pZCB7XG4gICAgLy8gRW5zdXJlIGFsbCBhcHByb3ZlcnMgaGF2ZSBta1NoYXJlZEtleS5cbiAgICBmb3IgKGNvbnN0IHRwIG9mIGFwcHJvdmVycykge1xuICAgICAgaWYgKCF0cC5jdXJyZW50VXNlclNoYXJlZEtleS51c2VyU2hhcmVkS2V5Lm1rU2hhcmVkS2V5KSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGB0cCAke3RwLm90aGVyLnVzZXJuYW1lfSBkb2VzIG5vdCBoYXZlIG1rU2hhcmVkS2V5YDtcbiAgICAgICAgY29uc29sZS5sb2cobXNnKTtcbiAgICAgICAgdGhyb3cgbmV3IExyQmFkQXJndW1lbnRFeGNlcHRpb24obXNnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQcmVwYXJlIHNsaXAzOVxuICBwcm90ZWN0ZWQgYXN5bmMgcHJlcGFyZVNsaXAzOShcbiAgICBzdWJBc3NlbWJsaWVzLFxuICAgIGFzc2VtYmx5UXVvcnVtOiBudW1iZXIsXG4gICAgcmF3QXNzZW1ibHlLZXk6IHN0cmluZ1xuICApOiBQcm9taXNlPHNsaXAuQXNzZW1ibHk+IHtcbiAgICAvLyBJcyB0aGVyZSBlbm91Z2ggc3ViIGFzc2VtYmxpZXMgdG8gbWVldCBxdW9ydW1cbiAgICBpZiAoc3ViQXNzZW1ibGllcy5sZW5ndGggPCBhc3NlbWJseVF1b3J1bSkge1xuICAgICAgdGhyb3cgbmV3IExyQmFkQXJndW1lbnRFeGNlcHRpb24oXG4gICAgICAgICdOb3QgZW5vdWdoIHN1YiBhc3NlbWJsaWVzIHRvIG1lZXQgcXVvcnVtJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzbGlwQXNzZW1ibHkgPSBuZXcgc2xpcC5Bc3NlbWJseShhc3NlbWJseVF1b3J1bSk7XG5cbiAgICBzdWJBc3NlbWJsaWVzLmZvckVhY2goKHNhLCBpbmRleCkgPT4ge1xuICAgICAgbGV0IGFwcHJvdmVyQ291bnQgPSBzYS5hcHByb3ZlclRwcy5sZW5ndGg7XG5cbiAgICAgIC8vIHNsaXAzOSByZXN0cmljdHMgcXVvcnVtID09IDEgdG8gaGF2ZSBvbmx5IDEgbWVtYmVyLiBTbyB3ZSBqdXN0IHNoYXJlIHRoZSBzYW1lXG4gICAgICAvLyBwYXJ0aWFsIGtleSBmb3IgYWxsIHN1YiBhc3NlbWJseSBtZW1iZXJzLlxuICAgICAgaWYgKHNhLnF1b3J1bSA9PT0gMSkge1xuICAgICAgICBhcHByb3ZlckNvdW50ID0gMTtcbiAgICAgIH1cbiAgICAgIHNsaXBBc3NlbWJseS5hZGRTdWJBc3NlbWJseShcbiAgICAgICAgbmV3IHNsaXAuU3ViQXNzZW1ibHkoaW5kZXgsIHNhLnF1b3J1bSwgYXBwcm92ZXJDb3VudClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLnNsaXAzOVNlcnZpY2UuZ2VuZXJhdGVTaGFyZXMoXG4gICAgICByYXdBc3NlbWJseUtleSxcbiAgICAgIHRoaXMuc2xpcDM5UGFzc3BocmFzZSxcbiAgICAgIHNsaXBBc3NlbWJseVxuICAgICk7XG4gICAgcmV0dXJuIHNsaXBBc3NlbWJseTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { gqlTyped } from '../_common/ast';
|
|
2
|
+
export const TpsKeysQuery = gqlTyped `
|
|
3
|
+
query TpsKeysQuery($ids: [ID]) {
|
|
4
|
+
tps(id_In: $ids) {
|
|
5
|
+
edges {
|
|
6
|
+
node {
|
|
7
|
+
id
|
|
8
|
+
currentUserSharedKey {
|
|
9
|
+
userSharedKey {
|
|
10
|
+
sharedKey {
|
|
11
|
+
id
|
|
12
|
+
}
|
|
13
|
+
mkSharedKey {
|
|
14
|
+
id
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}`;
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAtYXNzZW1ibHkucHJpdmF0ZS5ncWwuanMiLCJzb3VyY2VSb290IjoiL29wdC9hdGxhc3NpYW4vcGlwZWxpbmVzL2FnZW50L2J1aWxkL3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL3RwLWFzc2VtYmx5L3RwLWFzc2VtYmx5LnByaXZhdGUuZ3FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUsxQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1CdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbm5lY3Rpb24sIFRwTm9kZSB9IGZyb20gJy4uL2FwaS90eXBlcyc7XG5pbXBvcnQgeyBncWxUeXBlZCB9IGZyb20gJy4uL19jb21tb24vYXN0JztcblxuZXhwb3J0IGludGVyZmFjZSBUcHNLZXlzUXVlcnlSZXN1bHQge1xuICB0cHM6IENvbm5lY3Rpb248VHBOb2RlPjtcbn1cbmV4cG9ydCBjb25zdCBUcHNLZXlzUXVlcnkgPSBncWxUeXBlZDxUcHNLZXlzUXVlcnlSZXN1bHQ+YFxucXVlcnkgVHBzS2V5c1F1ZXJ5KCRpZHM6IFtJRF0pIHtcbiAgdHBzKGlkX0luOiAkaWRzKSB7XG4gICAgZWRnZXMge1xuICAgICAgbm9kZSB7XG4gICAgICAgIGlkXG4gICAgICAgIGN1cnJlbnRVc2VyU2hhcmVkS2V5IHtcbiAgICAgICAgICB1c2VyU2hhcmVkS2V5IHtcbiAgICAgICAgICAgIHNoYXJlZEtleSB7XG4gICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBta1NoYXJlZEtleSB7XG4gICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59YDtcbiJdfQ==
|