@lifeready/core 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -62
- package/bundles/lifeready-core.umd.js +15445 -15445
- package/bundles/lifeready-core.umd.js.map +1 -1
- package/bundles/lifeready-core.umd.min.js.map +1 -1
- package/esm2015/lib/_common/ast.js +40 -40
- package/esm2015/lib/_common/deferred-promise.js +24 -24
- package/esm2015/lib/_common/exceptions.js +157 -157
- package/esm2015/lib/_common/queries.gql.js +190 -190
- package/esm2015/lib/_common/run-outside-angular.js +79 -79
- package/esm2015/lib/_common/types.js +1 -1
- package/esm2015/lib/_common/utils.js +44 -44
- package/esm2015/lib/api/contact-card.gql.js +79 -79
- package/esm2015/lib/api/contact-card.service.js +154 -154
- package/esm2015/lib/api/contact-card2.gql.js +60 -60
- package/esm2015/lib/api/contact-card2.service.js +103 -103
- package/esm2015/lib/api/file.service.js +74 -74
- package/esm2015/lib/api/item2.gql.js +110 -110
- package/esm2015/lib/api/item2.service.js +311 -311
- package/esm2015/lib/api/key-exchange.gql.js +188 -188
- package/esm2015/lib/api/key-exchange.service.js +442 -442
- package/esm2015/lib/api/key-exchange.types.js +18 -18
- package/esm2015/lib/api/key-exchange2.gql.js +171 -171
- package/esm2015/lib/api/key-exchange2.service.js +479 -479
- package/esm2015/lib/api/lock.gql.js +40 -40
- package/esm2015/lib/api/lock.service.js +64 -64
- package/esm2015/lib/api/lr-apollo.service.js +46 -46
- package/esm2015/lib/api/lr-graphql/index.js +6 -6
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -155
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -213
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -51
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -48
- package/esm2015/lib/api/lr-graphql/lr.service.js +18 -18
- package/esm2015/lib/api/message.service.js +138 -138
- package/esm2015/lib/api/persist.service.js +181 -181
- package/esm2015/lib/api/query-processor/common-processors.service.js +93 -93
- package/esm2015/lib/api/query-processor/index.js +3 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +192 -192
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -109
- package/esm2015/lib/api/shared-contact-card.service.js +119 -119
- package/esm2015/lib/api/shared-contact-card2.gql.js +41 -41
- package/esm2015/lib/api/shared-contact-card2.service.js +117 -117
- package/esm2015/lib/api/time.service.js +146 -146
- package/esm2015/lib/api/types/graphql.types.js +7 -7
- package/esm2015/lib/api/types/index.js +3 -3
- package/esm2015/lib/api/types/lr-graphql.types.js +71 -71
- package/esm2015/lib/auth/auth.config.js +57 -57
- package/esm2015/lib/auth/auth.gql.js +48 -48
- package/esm2015/lib/auth/auth.types.js +27 -27
- package/esm2015/lib/auth/idle.service.js +168 -168
- package/esm2015/lib/auth/idle.types.js +7 -7
- package/esm2015/lib/auth/lbop.service.js +355 -355
- package/esm2015/lib/auth/life-ready-auth.service.js +500 -500
- package/esm2015/lib/auth/password.service.js +320 -320
- package/esm2015/lib/auth/register.service.js +172 -172
- package/esm2015/lib/auth/two-factor.service.js +74 -74
- package/esm2015/lib/category/category-meta.service.js +99 -99
- package/esm2015/lib/category/category.gql.js +406 -406
- package/esm2015/lib/category/category.service.js +390 -390
- package/esm2015/lib/category/category.types.js +29 -29
- package/esm2015/lib/cryptography/cryptography.types.js +11 -11
- package/esm2015/lib/cryptography/encryption.service.js +189 -189
- package/esm2015/lib/cryptography/key-factory.service.js +237 -237
- package/esm2015/lib/cryptography/key-graph.service.js +280 -280
- package/esm2015/lib/cryptography/key-meta.service.js +200 -200
- package/esm2015/lib/cryptography/key.service.js +124 -124
- package/esm2015/lib/cryptography/slip39.service.js +169 -169
- package/esm2015/lib/cryptography/web-crypto.service.js +29 -29
- package/esm2015/lib/life-ready.config.js +84 -84
- package/esm2015/lib/life-ready.module.js +74 -74
- package/esm2015/lib/plan/plan.gql.js +123 -123
- package/esm2015/lib/plan/plan.service.js +149 -149
- package/esm2015/lib/plan/plan.types.js +11 -11
- package/esm2015/lib/record/record-attachment.service.js +101 -101
- package/esm2015/lib/record/record.gql.js +179 -179
- package/esm2015/lib/record/record.service.js +206 -206
- package/esm2015/lib/record/record.types.js +15 -15
- package/esm2015/lib/record-type/record-type.service.js +75 -75
- package/esm2015/lib/record-type/record-type.types.js +28 -28
- package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +105 -105
- package/esm2015/lib/scenario/approvals/scenario-approval.types.js +1 -1
- package/esm2015/lib/scenario/approvals/scenario-approver.service.js +300 -300
- package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +52 -52
- package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +97 -97
- package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +1 -1
- package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +150 -150
- package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +229 -229
- package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +1 -1
- package/esm2015/lib/scenario/scenario-setup.service.js +269 -269
- package/esm2015/lib/scenario/scenario.gql.js +368 -368
- package/esm2015/lib/scenario/scenario.service.js +611 -611
- package/esm2015/lib/scenario/scenario.types.js +64 -64
- package/esm2015/lib/search/search.gql.js +62 -62
- package/esm2015/lib/search/search.service.js +156 -156
- package/esm2015/lib/search/search.types.js +6 -6
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +112 -112
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +129 -129
- package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +4 -4
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +232 -232
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +299 -299
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -148
- package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -326
- package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -41
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -87
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -215
- package/esm2015/lib/users/profile-details.service.js +214 -214
- package/esm2015/lib/users/profile.gql.js +97 -97
- package/esm2015/lib/users/profile.service.js +169 -169
- package/esm2015/lib/users/profile.types.js +34 -34
- package/esm2015/lib/users/user.gql.js +60 -60
- package/esm2015/lib/users/user.service.js +79 -79
- package/esm2015/lib/users/user.types.js +5 -5
- package/esm2015/lifeready-core.js +10 -10
- package/esm2015/public-api.js +81 -81
- package/fesm2015/lifeready-core.js +13088 -13088
- package/fesm2015/lifeready-core.js.map +1 -1
- package/lib/_common/ast.d.ts +11 -11
- package/lib/_common/deferred-promise.d.ts +12 -12
- package/lib/_common/exceptions.d.ts +109 -109
- package/lib/_common/queries.gql.d.ts +10 -10
- package/lib/_common/run-outside-angular.d.ts +14 -14
- package/lib/_common/types.d.ts +10 -10
- package/lib/_common/utils.d.ts +3 -3
- package/lib/api/contact-card.gql.d.ts +7 -7
- package/lib/api/contact-card.service.d.ts +52 -52
- package/lib/api/contact-card2.gql.d.ts +34 -34
- package/lib/api/contact-card2.service.d.ts +49 -49
- package/lib/api/file.service.d.ts +18 -18
- package/lib/api/item2.gql.d.ts +96 -96
- package/lib/api/item2.service.d.ts +177 -177
- package/lib/api/key-exchange.gql.d.ts +9 -9
- package/lib/api/key-exchange.service.d.ts +39 -39
- package/lib/api/key-exchange.types.d.ts +196 -196
- package/lib/api/key-exchange2.gql.d.ts +125 -125
- package/lib/api/key-exchange2.service.d.ts +187 -187
- package/lib/api/lock.gql.d.ts +27 -27
- package/lib/api/lock.service.d.ts +25 -25
- package/lib/api/lr-apollo.service.d.ts +15 -15
- package/lib/api/lr-graphql/index.d.ts +5 -5
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -60
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +27 -27
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -28
- package/lib/api/lr-graphql/lr-mutation.d.ts +8 -8
- package/lib/api/lr-graphql/lr.service.d.ts +9 -9
- package/lib/api/message.service.d.ts +58 -58
- package/lib/api/persist.service.d.ts +31 -31
- package/lib/api/query-processor/common-processors.service.d.ts +36 -36
- package/lib/api/query-processor/index.d.ts +2 -2
- package/lib/api/query-processor/query-processor.service.d.ts +18 -18
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -15
- package/lib/api/shared-contact-card.service.d.ts +33 -33
- package/lib/api/shared-contact-card2.gql.d.ts +36 -36
- package/lib/api/shared-contact-card2.service.d.ts +45 -45
- package/lib/api/time.service.d.ts +16 -16
- package/lib/api/types/graphql.types.d.ts +29 -29
- package/lib/api/types/index.d.ts +2 -2
- package/lib/api/types/lr-graphql.types.d.ts +385 -385
- package/lib/auth/auth.config.d.ts +5 -5
- package/lib/auth/auth.gql.d.ts +15 -15
- package/lib/auth/auth.types.d.ts +66 -66
- package/lib/auth/idle.service.d.ts +40 -40
- package/lib/auth/idle.types.d.ts +10 -10
- package/lib/auth/lbop.service.d.ts +91 -91
- package/lib/auth/life-ready-auth.service.d.ts +59 -59
- package/lib/auth/password.service.d.ts +78 -78
- package/lib/auth/register.service.d.ts +25 -25
- package/lib/auth/two-factor.service.d.ts +15 -15
- package/lib/category/category-meta.service.d.ts +23 -23
- package/lib/category/category.gql.d.ts +45 -45
- package/lib/category/category.service.d.ts +67 -67
- package/lib/category/category.types.d.ts +79 -79
- package/lib/cryptography/cryptography.types.d.ts +83 -83
- package/lib/cryptography/encryption.service.d.ts +41 -41
- package/lib/cryptography/key-factory.service.d.ts +38 -38
- package/lib/cryptography/key-graph.service.d.ts +33 -33
- package/lib/cryptography/key-meta.service.d.ts +44 -44
- package/lib/cryptography/key.service.d.ts +36 -36
- package/lib/cryptography/slip39.service.d.ts +43 -43
- package/lib/cryptography/web-crypto.service.d.ts +5 -5
- package/lib/life-ready.config.d.ts +14 -14
- package/lib/life-ready.module.d.ts +5 -5
- package/lib/plan/plan.gql.d.ts +11 -11
- package/lib/plan/plan.service.d.ts +33 -33
- package/lib/plan/plan.types.d.ts +31 -31
- package/lib/record/record-attachment.service.d.ts +16 -16
- package/lib/record/record.gql.d.ts +14 -14
- package/lib/record/record.service.d.ts +25 -25
- package/lib/record/record.types.d.ts +57 -57
- package/lib/record-type/record-type.service.d.ts +11 -11
- package/lib/record-type/record-type.types.d.ts +50 -50
- package/lib/scenario/approvals/scenario-approval.gql.d.ts +7 -7
- package/lib/scenario/approvals/scenario-approval.types.d.ts +63 -63
- package/lib/scenario/approvals/scenario-approver.service.d.ts +32 -32
- package/lib/scenario/claimants/scenario-claimant.gql.d.ts +5 -5
- package/lib/scenario/claimants/scenario-claimant.service.d.ts +17 -17
- package/lib/scenario/claimants/scenario-claimant.types.d.ts +18 -18
- package/lib/scenario/receivers/scenario-receiver.gql.d.ts +8 -8
- package/lib/scenario/receivers/scenario-receiver.service.d.ts +30 -30
- package/lib/scenario/receivers/scenario-receiver.types.d.ts +54 -54
- package/lib/scenario/scenario-setup.service.d.ts +22 -22
- package/lib/scenario/scenario.gql.d.ts +34 -34
- package/lib/scenario/scenario.service.d.ts +58 -58
- package/lib/scenario/scenario.types.d.ts +217 -217
- package/lib/search/search.gql.d.ts +1 -1
- package/lib/search/search.service.d.ts +25 -25
- package/lib/search/search.types.d.ts +20 -20
- package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -20
- package/lib/trusted-parties/tp-password-reset-user.service.d.ts +35 -35
- package/lib/trusted-parties/tp-password-reset.constants.d.ts +3 -3
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +218 -218
- package/lib/trusted-parties/tp-password-reset.service.d.ts +130 -130
- package/lib/trusted-parties/trusted-party.gql.d.ts +9 -9
- package/lib/trusted-parties/trusted-party.service.d.ts +44 -44
- package/lib/trusted-parties/trusted-party.types.d.ts +102 -102
- package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -79
- package/lib/trusted-parties/trusted-party2.service.d.ts +114 -114
- package/lib/users/profile-details.service.d.ts +21 -21
- package/lib/users/profile.gql.d.ts +11 -11
- package/lib/users/profile.service.d.ts +35 -35
- package/lib/users/profile.types.d.ts +96 -96
- package/lib/users/user.gql.d.ts +9 -9
- package/lib/users/user.service.d.ts +12 -12
- package/lib/users/user.types.d.ts +23 -23
- package/lifeready-core.d.ts +9 -9
- package/package.json +1 -1
- package/public-api.d.ts +77 -77
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import gql from 'graphql-tag';
|
|
2
|
-
import { getQuery } from '../../_common/ast';
|
|
3
|
-
import { DeferredPromise } from '../../_common/deferred-promise';
|
|
4
|
-
import { LrBadStateException } from '../../_common/exceptions';
|
|
5
|
-
export const fragmentSpreadAstSelection = getQuery(gql `
|
|
6
|
-
query {
|
|
7
|
-
...FragmentName
|
|
8
|
-
}
|
|
9
|
-
`).selectionSet.selections[0];
|
|
10
|
-
// const fragmentSpreadAstSelection = () =>
|
|
11
|
-
// lodash.deepClone(_fragmentSpreadAstSelection) as FragmentSpreadNode;
|
|
12
|
-
/**
|
|
13
|
-
* DECISION: LrMutationBase does not provide a convenience method to call lrGraphQL.lrMutate()
|
|
14
|
-
* because this class could be made independent of what lib is used to call the API. If we
|
|
15
|
-
* provided a configurable call back to make the API call, then the typing for that callback
|
|
16
|
-
* needs to be known. But since the API lib (eg. Apollo) has it's own unique return type, so
|
|
17
|
-
* it's not possible to do in general.
|
|
18
|
-
*/
|
|
19
|
-
export class LrMutationBase {
|
|
20
|
-
constructor() {
|
|
21
|
-
/* tslint:disable:variable-name */
|
|
22
|
-
this._executed = false;
|
|
23
|
-
// protected promises: DeferredPromise<T>[] = [];
|
|
24
|
-
this.deferredPromise = new DeferredPromise();
|
|
25
|
-
}
|
|
26
|
-
get promise() {
|
|
27
|
-
return this.deferredPromise.promise;
|
|
28
|
-
}
|
|
29
|
-
resolve(value) {
|
|
30
|
-
this.deferredPromise.resolve(value);
|
|
31
|
-
}
|
|
32
|
-
reject(reason) {
|
|
33
|
-
this.deferredPromise.reject(reason);
|
|
34
|
-
}
|
|
35
|
-
get lrMutationData() {
|
|
36
|
-
return {
|
|
37
|
-
mutation: this.mutation,
|
|
38
|
-
variables: this.variables,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
get executed() {
|
|
42
|
-
return this._executed;
|
|
43
|
-
}
|
|
44
|
-
setExecuted() {
|
|
45
|
-
if (this._executed) {
|
|
46
|
-
throw new LrBadStateException('Already executed');
|
|
47
|
-
}
|
|
48
|
-
this._executed = true;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import gql from 'graphql-tag';
|
|
2
|
+
import { getQuery } from '../../_common/ast';
|
|
3
|
+
import { DeferredPromise } from '../../_common/deferred-promise';
|
|
4
|
+
import { LrBadStateException } from '../../_common/exceptions';
|
|
5
|
+
export const fragmentSpreadAstSelection = getQuery(gql `
|
|
6
|
+
query {
|
|
7
|
+
...FragmentName
|
|
8
|
+
}
|
|
9
|
+
`).selectionSet.selections[0];
|
|
10
|
+
// const fragmentSpreadAstSelection = () =>
|
|
11
|
+
// lodash.deepClone(_fragmentSpreadAstSelection) as FragmentSpreadNode;
|
|
12
|
+
/**
|
|
13
|
+
* DECISION: LrMutationBase does not provide a convenience method to call lrGraphQL.lrMutate()
|
|
14
|
+
* because this class could be made independent of what lib is used to call the API. If we
|
|
15
|
+
* provided a configurable call back to make the API call, then the typing for that callback
|
|
16
|
+
* needs to be known. But since the API lib (eg. Apollo) has it's own unique return type, so
|
|
17
|
+
* it's not possible to do in general.
|
|
18
|
+
*/
|
|
19
|
+
export class LrMutationBase {
|
|
20
|
+
constructor() {
|
|
21
|
+
/* tslint:disable:variable-name */
|
|
22
|
+
this._executed = false;
|
|
23
|
+
// protected promises: DeferredPromise<T>[] = [];
|
|
24
|
+
this.deferredPromise = new DeferredPromise();
|
|
25
|
+
}
|
|
26
|
+
get promise() {
|
|
27
|
+
return this.deferredPromise.promise;
|
|
28
|
+
}
|
|
29
|
+
resolve(value) {
|
|
30
|
+
this.deferredPromise.resolve(value);
|
|
31
|
+
}
|
|
32
|
+
reject(reason) {
|
|
33
|
+
this.deferredPromise.reject(reason);
|
|
34
|
+
}
|
|
35
|
+
get lrMutationData() {
|
|
36
|
+
return {
|
|
37
|
+
mutation: this.mutation,
|
|
38
|
+
variables: this.variables,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
get executed() {
|
|
42
|
+
return this._executed;
|
|
43
|
+
}
|
|
44
|
+
setExecuted() {
|
|
45
|
+
if (this._executed) {
|
|
46
|
+
throw new LrBadStateException('Already executed');
|
|
47
|
+
}
|
|
48
|
+
this._executed = true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHItbXV0YXRpb24tYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9Qcm9qZWN0cy9uZXdyZXBvL2tjLWNsaWVudC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9hcGkvbHItZ3JhcGhxbC9sci1tdXRhdGlvbi1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQztBQUM5QixPQUFPLEVBQUUsUUFBUSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU8vRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFBOzs7O0NBSXJELENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBdUIsQ0FBQztBQUVwRCwyQ0FBMkM7QUFDM0MseUVBQXlFO0FBRXpFOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBZ0IsY0FBYztJQUFwQztRQUdFLGtDQUFrQztRQUN4QixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTVCLGlEQUFpRDtRQUNqQyxvQkFBZSxHQUFHLElBQUksZUFBZSxFQUFLLENBQUM7SUErQjdELENBQUM7SUE3QkMsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztJQUN0QyxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQVE7UUFDZCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQVk7UUFDakIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPO1lBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztTQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixNQUFNLElBQUksbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9wZXJhdGlvblZhcmlhYmxlcyB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xyXG5pbXBvcnQgeyBGcmFnbWVudFNwcmVhZE5vZGUgfSBmcm9tICdncmFwaHFsJztcclxuaW1wb3J0IGdxbCBmcm9tICdncmFwaHFsLXRhZyc7XHJcbmltcG9ydCB7IGdldFF1ZXJ5LCBUeXBlZERvY3VtZW50Tm9kZSB9IGZyb20gJy4uLy4uL19jb21tb24vYXN0JztcclxuaW1wb3J0IHsgRGVmZXJyZWRQcm9taXNlIH0gZnJvbSAnLi4vLi4vX2NvbW1vbi9kZWZlcnJlZC1wcm9taXNlJztcclxuaW1wb3J0IHsgTHJCYWRTdGF0ZUV4Y2VwdGlvbiB9IGZyb20gJy4uLy4uL19jb21tb24vZXhjZXB0aW9ucyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExyTXV0YXRpb25EYXRhPFQsIFRWYXJpYWJsZXMgPSBPcGVyYXRpb25WYXJpYWJsZXM+IHtcclxuICBtdXRhdGlvbjogVHlwZWREb2N1bWVudE5vZGU8VD47XHJcbiAgdmFyaWFibGVzPzogVFZhcmlhYmxlcztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50U3ByZWFkQXN0U2VsZWN0aW9uID0gZ2V0UXVlcnkoZ3FsYFxyXG4gIHF1ZXJ5IHtcclxuICAgIC4uLkZyYWdtZW50TmFtZVxyXG4gIH1cclxuYCkuc2VsZWN0aW9uU2V0LnNlbGVjdGlvbnNbMF0gYXMgRnJhZ21lbnRTcHJlYWROb2RlO1xyXG5cclxuLy8gY29uc3QgZnJhZ21lbnRTcHJlYWRBc3RTZWxlY3Rpb24gPSAoKSA9PlxyXG4vLyAgIGxvZGFzaC5kZWVwQ2xvbmUoX2ZyYWdtZW50U3ByZWFkQXN0U2VsZWN0aW9uKSBhcyBGcmFnbWVudFNwcmVhZE5vZGU7XHJcblxyXG4vKipcclxuICogREVDSVNJT046IExyTXV0YXRpb25CYXNlIGRvZXMgbm90IHByb3ZpZGUgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gY2FsbCBsckdyYXBoUUwubHJNdXRhdGUoKVxyXG4gKiBiZWNhdXNlIHRoaXMgY2xhc3MgY291bGQgYmUgbWFkZSBpbmRlcGVuZGVudCBvZiB3aGF0IGxpYiBpcyB1c2VkIHRvIGNhbGwgdGhlIEFQSS4gSWYgd2VcclxuICogcHJvdmlkZWQgYSBjb25maWd1cmFibGUgY2FsbCBiYWNrIHRvIG1ha2UgdGhlIEFQSSBjYWxsLCB0aGVuIHRoZSB0eXBpbmcgZm9yIHRoYXQgY2FsbGJhY2tcclxuICogbmVlZHMgdG8gYmUga25vd24uIEJ1dCBzaW5jZSB0aGUgQVBJIGxpYiAoZWcuIEFwb2xsbykgaGFzIGl0J3Mgb3duIHVuaXF1ZSByZXR1cm4gdHlwZSwgc29cclxuICogaXQncyBub3QgcG9zc2libGUgdG8gZG8gaW4gZ2VuZXJhbC5cclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMck11dGF0aW9uQmFzZTxULCBUVmFyaWFibGVzID0gT3BlcmF0aW9uVmFyaWFibGVzPiB7XHJcbiAgcHJvdGVjdGVkIG11dGF0aW9uOiBUeXBlZERvY3VtZW50Tm9kZTxUPjtcclxuICBwcm90ZWN0ZWQgdmFyaWFibGVzPzogVFZhcmlhYmxlcztcclxuICAvKiB0c2xpbnQ6ZGlzYWJsZTp2YXJpYWJsZS1uYW1lICovXHJcbiAgcHJvdGVjdGVkIF9leGVjdXRlZCA9IGZhbHNlO1xyXG5cclxuICAvLyBwcm90ZWN0ZWQgcHJvbWlzZXM6IERlZmVycmVkUHJvbWlzZTxUPltdID0gW107XHJcbiAgcHVibGljIHJlYWRvbmx5IGRlZmVycmVkUHJvbWlzZSA9IG5ldyBEZWZlcnJlZFByb21pc2U8VD4oKTtcclxuXHJcbiAgZ2V0IHByb21pc2UoKTogUHJvbWlzZTxUPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kZWZlcnJlZFByb21pc2UucHJvbWlzZTtcclxuICB9XHJcblxyXG4gIHJlc29sdmUodmFsdWU6IFQpIHtcclxuICAgIHRoaXMuZGVmZXJyZWRQcm9taXNlLnJlc29sdmUodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcmVqZWN0KHJlYXNvbj86IGFueSkge1xyXG4gICAgdGhpcy5kZWZlcnJlZFByb21pc2UucmVqZWN0KHJlYXNvbik7XHJcbiAgfVxyXG5cclxuICBnZXQgbHJNdXRhdGlvbkRhdGEoKTogTHJNdXRhdGlvbkRhdGE8VCwgVFZhcmlhYmxlcz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbXV0YXRpb246IHRoaXMubXV0YXRpb24sXHJcbiAgICAgIHZhcmlhYmxlczogdGhpcy52YXJpYWJsZXMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGV4ZWN1dGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGVkO1xyXG4gIH1cclxuXHJcbiAgc2V0RXhlY3V0ZWQoKSB7XHJcbiAgICBpZiAodGhpcy5fZXhlY3V0ZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IExyQmFkU3RhdGVFeGNlcHRpb24oJ0FscmVhZHkgZXhlY3V0ZWQnKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2V4ZWN1dGVkID0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import * as lodash from 'lodash';
|
|
2
|
-
import { getAliasOrName, getFragments, getMutation, } from '../../_common/ast';
|
|
3
|
-
import * as ast from '../../_common/ast';
|
|
4
|
-
import { fragmentSpreadAstSelection, LrMutationBase } from './lr-mutation-base';
|
|
5
|
-
export class LrMutation extends LrMutationBase {
|
|
6
|
-
constructor(options) {
|
|
7
|
-
super();
|
|
8
|
-
this.mutation = options.mutation;
|
|
9
|
-
this.variables = options.variables;
|
|
10
|
-
}
|
|
11
|
-
select(fragments) {
|
|
12
|
-
// Don't touch the original
|
|
13
|
-
const mutationDoc = lodash.cloneDeep(this.mutation);
|
|
14
|
-
const mutationNode = getMutation(mutationDoc);
|
|
15
|
-
const fragmentMap = {};
|
|
16
|
-
getFragments(fragments).forEach((fragment) => {
|
|
17
|
-
fragmentMap[fragment.name.value] = fragment;
|
|
18
|
-
});
|
|
19
|
-
const replaceFieldSelection = (selection) => {
|
|
20
|
-
const field = selection;
|
|
21
|
-
const fieldName = getAliasOrName(field);
|
|
22
|
-
const fragment = fragmentMap[fieldName];
|
|
23
|
-
if (!fragment) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
// Make the entire selection of the mutation a spread of
|
|
27
|
-
// a fragment using the same name as the mutation field.
|
|
28
|
-
// We will also rename the fragment to the same name.
|
|
29
|
-
field.selectionSet.selections = [
|
|
30
|
-
Object.assign(Object.assign({}, fragmentSpreadAstSelection), { name: ast.name(fieldName) }),
|
|
31
|
-
];
|
|
32
|
-
};
|
|
33
|
-
mutationNode.selectionSet.selections.forEach((selection) => {
|
|
34
|
-
if (selection.kind === 'Field') {
|
|
35
|
-
replaceFieldSelection(selection);
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
return new LrMutation({
|
|
39
|
-
mutation: Object.assign(Object.assign({}, mutationDoc), { definitions: [
|
|
40
|
-
// Remove all existing fragments
|
|
41
|
-
...mutationDoc.definitions.filter((def) => def.kind !== 'FragmentDefinition'),
|
|
42
|
-
...fragments.definitions,
|
|
43
|
-
] }),
|
|
44
|
-
variables: this.variables,
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import * as lodash from 'lodash';
|
|
2
|
+
import { getAliasOrName, getFragments, getMutation, } from '../../_common/ast';
|
|
3
|
+
import * as ast from '../../_common/ast';
|
|
4
|
+
import { fragmentSpreadAstSelection, LrMutationBase } from './lr-mutation-base';
|
|
5
|
+
export class LrMutation extends LrMutationBase {
|
|
6
|
+
constructor(options) {
|
|
7
|
+
super();
|
|
8
|
+
this.mutation = options.mutation;
|
|
9
|
+
this.variables = options.variables;
|
|
10
|
+
}
|
|
11
|
+
select(fragments) {
|
|
12
|
+
// Don't touch the original
|
|
13
|
+
const mutationDoc = lodash.cloneDeep(this.mutation);
|
|
14
|
+
const mutationNode = getMutation(mutationDoc);
|
|
15
|
+
const fragmentMap = {};
|
|
16
|
+
getFragments(fragments).forEach((fragment) => {
|
|
17
|
+
fragmentMap[fragment.name.value] = fragment;
|
|
18
|
+
});
|
|
19
|
+
const replaceFieldSelection = (selection) => {
|
|
20
|
+
const field = selection;
|
|
21
|
+
const fieldName = getAliasOrName(field);
|
|
22
|
+
const fragment = fragmentMap[fieldName];
|
|
23
|
+
if (!fragment) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Make the entire selection of the mutation a spread of
|
|
27
|
+
// a fragment using the same name as the mutation field.
|
|
28
|
+
// We will also rename the fragment to the same name.
|
|
29
|
+
field.selectionSet.selections = [
|
|
30
|
+
Object.assign(Object.assign({}, fragmentSpreadAstSelection), { name: ast.name(fieldName) }),
|
|
31
|
+
];
|
|
32
|
+
};
|
|
33
|
+
mutationNode.selectionSet.selections.forEach((selection) => {
|
|
34
|
+
if (selection.kind === 'Field') {
|
|
35
|
+
replaceFieldSelection(selection);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
return new LrMutation({
|
|
39
|
+
mutation: Object.assign(Object.assign({}, mutationDoc), { definitions: [
|
|
40
|
+
// Remove all existing fragments
|
|
41
|
+
...mutationDoc.definitions.filter((def) => def.kind !== 'FragmentDefinition'),
|
|
42
|
+
...fragments.definitions,
|
|
43
|
+
] }),
|
|
44
|
+
variables: this.variables,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHItbXV0YXRpb24uanMiLCJzb3VyY2VSb290IjoiQzovUHJvamVjdHMvbmV3cmVwby9rYy1jbGllbnQvcHJvamVjdHMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvYXBpL2xyLWdyYXBocWwvbHItbXV0YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFHakMsT0FBTyxFQUNMLGNBQWMsRUFDZCxZQUFZLEVBQ1osV0FBVyxHQUVaLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQztBQUV6QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEYsTUFBTSxPQUFPLFVBR1gsU0FBUSxjQUE2QjtJQUNyQyxZQUFZLE9BQXNDO1FBQ2hELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsTUFBTSxDQUFVLFNBQXFDO1FBQ25ELDJCQUEyQjtRQUMzQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQWlCLENBQUM7UUFDcEUsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sV0FBVyxHQUFHLEVBQStDLENBQUM7UUFDcEUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQWdDLEVBQUUsRUFBRTtZQUNuRSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsU0FBb0IsRUFBRSxFQUFFO1lBQ3JELE1BQU0sS0FBSyxHQUFHLFNBQXNCLENBQUM7WUFDckMsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV4QyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNiLE9BQU87YUFDUjtZQUVELHdEQUF3RDtZQUN4RCx3REFBd0Q7WUFDeEQscURBQXFEO1lBQ3JELEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHO2dEQUV6QiwwQkFBMEIsS0FDN0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBRTVCLENBQUM7UUFDSixDQUFDLENBQUM7UUFFRixZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUN6RCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO2dCQUM5QixxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLFVBQVUsQ0FBQztZQUNwQixRQUFRLEVBQUUsZ0NBQ0wsV0FBVyxLQUNkLFdBQVcsRUFBRTtvQkFDWCxnQ0FBZ0M7b0JBQ2hDLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQy9CLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLG9CQUFvQixDQUMzQztvQkFDRCxHQUFHLFNBQVMsQ0FBQyxXQUFXO2lCQUN6QixHQUM0QjtZQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbG9kYXNoIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IE9wZXJhdGlvblZhcmlhYmxlcyB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xyXG5pbXBvcnQgeyBEb2N1bWVudE5vZGUsIEZpZWxkTm9kZSwgRnJhZ21lbnREZWZpbml0aW9uTm9kZSB9IGZyb20gJ2dyYXBocWwnO1xyXG5pbXBvcnQge1xyXG4gIGdldEFsaWFzT3JOYW1lLFxyXG4gIGdldEZyYWdtZW50cyxcclxuICBnZXRNdXRhdGlvbixcclxuICBUeXBlZERvY3VtZW50Tm9kZSxcclxufSBmcm9tICcuLi8uLi9fY29tbW9uL2FzdCc7XHJcbmltcG9ydCAqIGFzIGFzdCBmcm9tICcuLi8uLi9fY29tbW9uL2FzdCc7XHJcbmltcG9ydCB7IExyTXV0YXRpb25EYXRhIH0gZnJvbSAnLi9sci1tdXRhdGlvbi1iYXNlJztcclxuaW1wb3J0IHsgZnJhZ21lbnRTcHJlYWRBc3RTZWxlY3Rpb24sIExyTXV0YXRpb25CYXNlIH0gZnJvbSAnLi9sci1tdXRhdGlvbi1iYXNlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBMck11dGF0aW9uPFxyXG4gIFQgZXh0ZW5kcyBhbnksXHJcbiAgVFZhcmlhYmxlcyA9IE9wZXJhdGlvblZhcmlhYmxlc1xyXG4+IGV4dGVuZHMgTHJNdXRhdGlvbkJhc2U8VCwgVFZhcmlhYmxlcz4ge1xyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IExyTXV0YXRpb25EYXRhPFQsIFRWYXJpYWJsZXM+KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5tdXRhdGlvbiA9IG9wdGlvbnMubXV0YXRpb247XHJcbiAgICB0aGlzLnZhcmlhYmxlcyA9IG9wdGlvbnMudmFyaWFibGVzO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0PFRSZXN1bHQ+KGZyYWdtZW50czogVHlwZWREb2N1bWVudE5vZGU8VFJlc3VsdD4pIHtcclxuICAgIC8vIERvbid0IHRvdWNoIHRoZSBvcmlnaW5hbFxyXG4gICAgY29uc3QgbXV0YXRpb25Eb2MgPSBsb2Rhc2guY2xvbmVEZWVwKHRoaXMubXV0YXRpb24pIGFzIERvY3VtZW50Tm9kZTtcclxuICAgIGNvbnN0IG11dGF0aW9uTm9kZSA9IGdldE11dGF0aW9uKG11dGF0aW9uRG9jKTtcclxuXHJcbiAgICBjb25zdCBmcmFnbWVudE1hcCA9IHt9IGFzIHsgW2tleTogc3RyaW5nXTogRnJhZ21lbnREZWZpbml0aW9uTm9kZSB9O1xyXG4gICAgZ2V0RnJhZ21lbnRzKGZyYWdtZW50cykuZm9yRWFjaCgoZnJhZ21lbnQ6IEZyYWdtZW50RGVmaW5pdGlvbk5vZGUpID0+IHtcclxuICAgICAgZnJhZ21lbnRNYXBbZnJhZ21lbnQubmFtZS52YWx1ZV0gPSBmcmFnbWVudDtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHJlcGxhY2VGaWVsZFNlbGVjdGlvbiA9IChzZWxlY3Rpb246IEZpZWxkTm9kZSkgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IHNlbGVjdGlvbiBhcyBGaWVsZE5vZGU7XHJcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEFsaWFzT3JOYW1lKGZpZWxkKTtcclxuICAgICAgY29uc3QgZnJhZ21lbnQgPSBmcmFnbWVudE1hcFtmaWVsZE5hbWVdO1xyXG5cclxuICAgICAgaWYgKCFmcmFnbWVudCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gTWFrZSB0aGUgZW50aXJlIHNlbGVjdGlvbiBvZiB0aGUgbXV0YXRpb24gYSBzcHJlYWQgb2ZcclxuICAgICAgLy8gYSBmcmFnbWVudCB1c2luZyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBtdXRhdGlvbiBmaWVsZC5cclxuICAgICAgLy8gV2Ugd2lsbCBhbHNvIHJlbmFtZSB0aGUgZnJhZ21lbnQgdG8gdGhlIHNhbWUgbmFtZS5cclxuICAgICAgZmllbGQuc2VsZWN0aW9uU2V0LnNlbGVjdGlvbnMgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLi4uZnJhZ21lbnRTcHJlYWRBc3RTZWxlY3Rpb24sXHJcbiAgICAgICAgICBuYW1lOiBhc3QubmFtZShmaWVsZE5hbWUpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF07XHJcbiAgICB9O1xyXG5cclxuICAgIG11dGF0aW9uTm9kZS5zZWxlY3Rpb25TZXQuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgaWYgKHNlbGVjdGlvbi5raW5kID09PSAnRmllbGQnKSB7XHJcbiAgICAgICAgcmVwbGFjZUZpZWxkU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XHJcbiAgICAgIG11dGF0aW9uOiB7XHJcbiAgICAgICAgLi4ubXV0YXRpb25Eb2MsXHJcbiAgICAgICAgZGVmaW5pdGlvbnM6IFtcclxuICAgICAgICAgIC8vIFJlbW92ZSBhbGwgZXhpc3RpbmcgZnJhZ21lbnRzXHJcbiAgICAgICAgICAuLi5tdXRhdGlvbkRvYy5kZWZpbml0aW9ucy5maWx0ZXIoXHJcbiAgICAgICAgICAgIChkZWYpID0+IGRlZi5raW5kICE9PSAnRnJhZ21lbnREZWZpbml0aW9uJ1xyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIC4uLmZyYWdtZW50cy5kZWZpbml0aW9ucyxcclxuICAgICAgICBdLFxyXG4gICAgICB9IGFzIFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQ+LFxyXG4gICAgICB2YXJpYWJsZXM6IHRoaXMudmFyaWFibGVzLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { LrGraphQLService, } from './lr-graphql.service';
|
|
3
|
-
export class LrService {
|
|
4
|
-
constructor(injector) {
|
|
5
|
-
this.lrGraphQL = injector.get(LrGraphQLService);
|
|
6
|
-
}
|
|
7
|
-
mutate(lrMutation, options) {
|
|
8
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
9
|
-
return this.lrGraphQL.lrMutate(lrMutation, options);
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
query(options) {
|
|
13
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
14
|
-
return this.lrGraphQL.query(options);
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { LrGraphQLService, } from './lr-graphql.service';
|
|
3
|
+
export class LrService {
|
|
4
|
+
constructor(injector) {
|
|
5
|
+
this.lrGraphQL = injector.get(LrGraphQLService);
|
|
6
|
+
}
|
|
7
|
+
mutate(lrMutation, options) {
|
|
8
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
9
|
+
return this.lrGraphQL.lrMutate(lrMutation, options);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
query(options) {
|
|
13
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
14
|
+
return this.lrGraphQL.query(options);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9Qcm9qZWN0cy9uZXdyZXBvL2tjLWNsaWVudC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9hcGkvbHItZ3JhcGhxbC9sci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQ0wsZ0JBQWdCLEdBR2pCLE1BQU0sc0JBQXNCLENBQUM7QUFHOUIsTUFBTSxPQUFPLFNBQVM7SUFHcEIsWUFBWSxRQUFrQjtRQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRWUsTUFBTSxDQUNwQixVQUUwQyxFQUMxQyxPQUEwQzs7WUFFMUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsQ0FBQztLQUFBO0lBRWUsS0FBSyxDQUFPLE9BQTZCOztZQUN2RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7S0FBQTtDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBMckdyYXBoUUxTZXJ2aWNlLFxyXG4gIExyTXV0YXRpb25PcHRpb25zLFxyXG4gIExyUXVlcnlPcHRpb25zLFxyXG59IGZyb20gJy4vbHItZ3JhcGhxbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTHJNdXRhdGlvbkJhc2UgfSBmcm9tICcuL2xyLW11dGF0aW9uLWJhc2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIExyU2VydmljZSB7XHJcbiAgcHJvdGVjdGVkIGxyR3JhcGhRTDogTHJHcmFwaFFMU2VydmljZTtcclxuXHJcbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICB0aGlzLmxyR3JhcGhRTCA9IGluamVjdG9yLmdldChMckdyYXBoUUxTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBtdXRhdGU8VCwgVFZhcmlhYmxlcz4oXHJcbiAgICBsck11dGF0aW9uOlxyXG4gICAgICB8IExyTXV0YXRpb25CYXNlPFQsIFRWYXJpYWJsZXM+XHJcbiAgICAgIHwgUHJvbWlzZTxMck11dGF0aW9uQmFzZTxULCBUVmFyaWFibGVzPj4sXHJcbiAgICBvcHRpb25zPzogTHJNdXRhdGlvbk9wdGlvbnM8VCwgVFZhcmlhYmxlcz5cclxuICApIHtcclxuICAgIHJldHVybiB0aGlzLmxyR3JhcGhRTC5sck11dGF0ZShsck11dGF0aW9uLCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBxdWVyeTxULCBWPihvcHRpb25zOiBMclF1ZXJ5T3B0aW9uczxULCBWPikge1xyXG4gICAgcmV0dXJuIHRoaXMubHJHcmFwaFFMLnF1ZXJ5KG9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import gql from 'graphql-tag';
|
|
4
|
-
import { EncryptionService } from '../cryptography/encryption.service';
|
|
5
|
-
import { KeyGraphService } from '../cryptography/key-graph.service';
|
|
6
|
-
import { KeyGraphFragment } from '../_common/queries.gql';
|
|
7
|
-
import { KeyExchangeService } from './key-exchange.service';
|
|
8
|
-
import { LrApolloService } from './lr-apollo.service';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "./lr-apollo.service";
|
|
11
|
-
import * as i2 from "../cryptography/key-graph.service";
|
|
12
|
-
import * as i3 from "../cryptography/encryption.service";
|
|
13
|
-
import * as i4 from "./key-exchange.service";
|
|
14
|
-
export const SendMessageMutation = gql `
|
|
15
|
-
mutation SendMessage($input: SendMessageInput!) {
|
|
16
|
-
sendMessage(input: $input) {
|
|
17
|
-
message {
|
|
18
|
-
id
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
`;
|
|
23
|
-
export const MessageQuery = gql `
|
|
24
|
-
query Message($id: LrRelayIdInput!) {
|
|
25
|
-
message(id: $id) {
|
|
26
|
-
id
|
|
27
|
-
sender {
|
|
28
|
-
username
|
|
29
|
-
}
|
|
30
|
-
receiver {
|
|
31
|
-
username
|
|
32
|
-
}
|
|
33
|
-
plainMessage
|
|
34
|
-
signedCipherMessage
|
|
35
|
-
sharedKey {
|
|
36
|
-
id
|
|
37
|
-
}
|
|
38
|
-
senderSigPbk {
|
|
39
|
-
id
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
keyGraph {
|
|
43
|
-
...KeyGraphFragment
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
${KeyGraphFragment}
|
|
47
|
-
`;
|
|
48
|
-
export class MessageService {
|
|
49
|
-
constructor(lrApollo, keyGraph, encryptionService, keyExchangeService) {
|
|
50
|
-
this.lrApollo = lrApollo;
|
|
51
|
-
this.keyGraph = keyGraph;
|
|
52
|
-
this.encryptionService = encryptionService;
|
|
53
|
-
this.keyExchangeService = keyExchangeService;
|
|
54
|
-
this.encrypt = this.encryptionService.encrypt.bind(this.encryptionService);
|
|
55
|
-
this.decrypt = this.encryptionService.decrypt.bind(this.encryptionService);
|
|
56
|
-
this.sign = this.encryptionService.sign.bind(this.encryptionService);
|
|
57
|
-
this.verify = this.encryptionService.verify.bind(this.encryptionService);
|
|
58
|
-
}
|
|
59
|
-
sendMessage({ username, userId, plainMessageJson, plainCipherMessageJson, }) {
|
|
60
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
61
|
-
const userSharedKey = yield this.keyExchangeService.currentUserSharedKey({
|
|
62
|
-
username,
|
|
63
|
-
userId,
|
|
64
|
-
});
|
|
65
|
-
const input = {
|
|
66
|
-
receiverUsername: username,
|
|
67
|
-
receiverId: userId,
|
|
68
|
-
sharedKeyId: userSharedKey.sharedKey.id,
|
|
69
|
-
senderSigPbkId: userSharedKey.userSigPrk.id,
|
|
70
|
-
};
|
|
71
|
-
if (plainCipherMessageJson) {
|
|
72
|
-
const sharedKey = yield this.keyGraph.getJwkKey(userSharedKey.sharedKey.id);
|
|
73
|
-
const cipherMessage = yield this.encrypt(sharedKey, plainCipherMessageJson);
|
|
74
|
-
const senderSigPrk = yield this.keyGraph.getJwkKey(userSharedKey.userSigPrk.id);
|
|
75
|
-
const signedCipherMessage = yield this.sign(senderSigPrk, cipherMessage);
|
|
76
|
-
input.signedCipherMessage = JSON.stringify(signedCipherMessage);
|
|
77
|
-
}
|
|
78
|
-
if (plainMessageJson) {
|
|
79
|
-
input.plainMessage = JSON.stringify(plainMessageJson);
|
|
80
|
-
}
|
|
81
|
-
const res = yield this.lrApollo.query({
|
|
82
|
-
query: SendMessageMutation,
|
|
83
|
-
variables: {
|
|
84
|
-
input,
|
|
85
|
-
},
|
|
86
|
-
});
|
|
87
|
-
return res.sendMessage;
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
decryptMessage(message, { sharedKey, senderSigPbk }) {
|
|
91
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
-
const signedCipherMessage = yield this.verify(senderSigPbk, JSON.parse(message.signedCipherMessage));
|
|
93
|
-
message.plainSignedCipherMessageJson = yield this.decrypt(sharedKey, signedCipherMessage);
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
getMessage(id) {
|
|
97
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
-
const res = yield this.lrApollo.query({
|
|
99
|
-
query: MessageQuery,
|
|
100
|
-
variables: {
|
|
101
|
-
id,
|
|
102
|
-
},
|
|
103
|
-
});
|
|
104
|
-
this.keyGraph.addKeys(res.keyGraph);
|
|
105
|
-
const message = res.message;
|
|
106
|
-
const sharedKey = yield this.keyGraph.getJwkKey(message.sharedKey.id);
|
|
107
|
-
// The sender would be getting the Prk back. The receiver gets the Pbk back.
|
|
108
|
-
// But only the Pbk is needed here to verify signature.
|
|
109
|
-
// So both sender and receiver can access this message.
|
|
110
|
-
const senderSigPbk = yield this.keyGraph.getJwkKey(message.senderSigPbk.id);
|
|
111
|
-
// Test bad signature
|
|
112
|
-
// senderSigPbk = senderSigPbk.toJSON();
|
|
113
|
-
// senderSigPbk.n = "x" + senderSigPbk.n.substring(1);
|
|
114
|
-
// senderSigPbk = await KFS.asKey(senderSigPbk);
|
|
115
|
-
yield this.decryptMessage(message, {
|
|
116
|
-
sharedKey,
|
|
117
|
-
senderSigPbk,
|
|
118
|
-
});
|
|
119
|
-
if (message.plainMessage) {
|
|
120
|
-
message.plainMessageJson = JSON.parse(message.plainMessage);
|
|
121
|
-
}
|
|
122
|
-
return res.message;
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
MessageService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MessageService_Factory() { return new MessageService(i0.ɵɵinject(i1.LrApolloService), i0.ɵɵinject(i2.KeyGraphService), i0.ɵɵinject(i3.EncryptionService), i0.ɵɵinject(i4.KeyExchangeService)); }, token: MessageService, providedIn: "root" });
|
|
127
|
-
MessageService.decorators = [
|
|
128
|
-
{ type: Injectable, args: [{
|
|
129
|
-
providedIn: 'root',
|
|
130
|
-
},] }
|
|
131
|
-
];
|
|
132
|
-
MessageService.ctorParameters = () => [
|
|
133
|
-
{ type: LrApolloService },
|
|
134
|
-
{ type: KeyGraphService },
|
|
135
|
-
{ type: EncryptionService },
|
|
136
|
-
{ type: KeyExchangeService }
|
|
137
|
-
];
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9vcHQvYXRsYXNzaWFuL3BpcGVsaW5lcy9hZ2VudC9idWlsZC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9hcGkvbWVzc2FnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQztBQUU5QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7QUFHdEQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFBOzs7Ozs7OztDQVFyQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF1QjNCLGdCQUFnQjtDQUNuQixDQUFDO0FBNkNGLE1BQU0sT0FBTyxjQUFjO0lBY3pCLFlBQ1UsUUFBeUIsRUFDekIsUUFBeUIsRUFDekIsaUJBQW9DLEVBQ3BDLGtCQUFzQztRQUh0QyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFqQi9CLFlBQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDNUQsSUFBSSxDQUFDLGlCQUFpQixDQUN2QixD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LENBQUM7WUFFdkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXRFLDRFQUE0RTtZQUM1RSx1REFBdUQ7WUFDdkQsdURBQXVEO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUU1RSxxQkFBcUI7WUFDckIsd0NBQXdDO1lBQ3hDLHNEQUFzRDtZQUN0RCxnREFBZ0Q7WUFFaEQsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtnQkFDakMsU0FBUztnQkFDVCxZQUFZO2FBQ2IsQ0FBQyxDQUFDO1lBRUgsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUN4QixPQUFPLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDN0Q7WUFFRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDckIsQ0FBQztLQUFBOzs7O1lBMUhGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBakZRLGVBQWU7WUFIZixlQUFlO1lBRGYsaUJBQWlCO1lBR2pCLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBncWwgZnJvbSAnZ3JhcGhxbC10YWcnO1xuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBLZXlHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkva2V5LWdyYXBoLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5R3JhcGhGcmFnbWVudCB9IGZyb20gJy4uL19jb21tb24vcXVlcmllcy5ncWwnO1xuaW1wb3J0IHsgS2V5RXhjaGFuZ2VTZXJ2aWNlIH0gZnJvbSAnLi9rZXktZXhjaGFuZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBMckFwb2xsb1NlcnZpY2UgfSBmcm9tICcuL2xyLWFwb2xsby5zZXJ2aWNlJztcbmltcG9ydCB7IEtleUZhY3RvcnlTZXJ2aWNlIGFzIEtGUyB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXktZmFjdG9yeS5zZXJ2aWNlJztcblxuZXhwb3J0IGNvbnN0IFNlbmRNZXNzYWdlTXV0YXRpb24gPSBncWxgXG4gIG11dGF0aW9uIFNlbmRNZXNzYWdlKCRpbnB1dDogU2VuZE1lc3NhZ2VJbnB1dCEpIHtcbiAgICBzZW5kTWVzc2FnZShpbnB1dDogJGlucHV0KSB7XG4gICAgICBtZXNzYWdlIHtcbiAgICAgICAgaWRcbiAgICAgIH1cbiAgICB9XG4gIH1cbmA7XG5cbmV4cG9ydCBjb25zdCBNZXNzYWdlUXVlcnkgPSBncWxgXG4gIHF1ZXJ5IE1lc3NhZ2UoJGlkOiBMclJlbGF5SWRJbnB1dCEpIHtcbiAgICBtZXNzYWdlKGlkOiAkaWQpIHtcbiAgICAgIGlkXG4gICAgICBzZW5kZXIge1xuICAgICAgICB1c2VybmFtZVxuICAgICAgfVxuICAgICAgcmVjZWl2ZXIge1xuICAgICAgICB1c2VybmFtZVxuICAgICAgfVxuICAgICAgcGxhaW5NZXNzYWdlXG4gICAgICBzaWduZWRDaXBoZXJNZXNzYWdlXG4gICAgICBzaGFyZWRLZXkge1xuICAgICAgICBpZFxuICAgICAgfVxuICAgICAgc2VuZGVyU2lnUGJrIHtcbiAgICAgICAgaWRcbiAgICAgIH1cbiAgICB9XG4gICAga2V5R3JhcGgge1xuICAgICAgLi4uS2V5R3JhcGhGcmFnbWVudFxuICAgIH1cbiAgfVxuICAke0tleUdyYXBoRnJhZ21lbnR9XG5gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRNZXNzYWdlIHtcbiAgbWVzc2FnZToge1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VuZE1lc3NhZ2VJbnB1dCB7XG4gIHVzZXJuYW1lPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHBsYWluTWVzc2FnZUpzb24/OiBhbnk7XG4gIHBsYWluQ2lwaGVyTWVzc2FnZUpzb24/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHNlbmRlcjoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgfTtcbiAgcmVjZWl2ZXI6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gIH07XG4gIHBsYWluTWVzc2FnZTogc3RyaW5nO1xuICBwbGFpbk1lc3NhZ2VKc29uPzogYW55O1xuICBzaWduZWRDaXBoZXJNZXNzYWdlOiBzdHJpbmc7XG4gIHBsYWluU2lnbmVkQ2lwaGVyTWVzc2FnZUpzb24/OiBhbnk7XG4gIHNlbmRlclNpZ1Biazoge1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG4gIHNoYXJlZEtleToge1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBEZWNyeXB0TWVzc2FnZU9wdGlvbnMge1xuICBzaGFyZWRLZXk6IEpXSy5LZXk7XG4gIHNlbmRlclNpZ1BiazogSldLLktleTtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmNyeXB0ID0gdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0LmJpbmQoXG4gICAgdGhpcy5lbmNyeXB0aW9uU2VydmljZVxuICApO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY3J5cHQgPSB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQuYmluZChcbiAgICB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbiA9IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbi5iaW5kKFxuICAgIHRoaXMuZW5jcnlwdGlvblNlcnZpY2VcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJpZnkgPSB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnZlcmlmeS5iaW5kKFxuICAgIHRoaXMuZW5jcnlwdGlvblNlcnZpY2VcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGxyQXBvbGxvOiBMckFwb2xsb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBrZXlHcmFwaDogS2V5R3JhcGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUga2V5RXhjaGFuZ2VTZXJ2aWNlOiBLZXlFeGNoYW5nZVNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKHtcbiAgICB1c2VybmFtZSxcbiAgICB1c2VySWQsXG4gICAgcGxhaW5NZXNzYWdlSnNvbixcbiAgICBwbGFpbkNpcGhlck1lc3NhZ2VKc29uLFxuICB9OiBTZW5kTWVzc2FnZUlucHV0KTogUHJvbWlzZTxTZW5kTWVzc2FnZT4ge1xuICAgIGNvbnN0IHVzZXJTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5jdXJyZW50VXNlclNoYXJlZEtleSh7XG4gICAgICB1c2VybmFtZSxcbiAgICAgIHVzZXJJZCxcbiAgICB9KTtcblxuICAgIGNvbnN0IGlucHV0OiBhbnkgPSB7XG4gICAgICByZWNlaXZlclVzZXJuYW1lOiB1c2VybmFtZSxcbiAgICAgIHJlY2VpdmVySWQ6IHVzZXJJZCxcbiAgICAgIHNoYXJlZEtleUlkOiB1c2VyU2hhcmVkS2V5LnNoYXJlZEtleS5pZCxcbiAgICAgIHNlbmRlclNpZ1Bia0lkOiB1c2VyU2hhcmVkS2V5LnVzZXJTaWdQcmsuaWQsXG4gICAgfTtcblxuICAgIGlmIChwbGFpbkNpcGhlck1lc3NhZ2VKc29uKSB7XG4gICAgICBjb25zdCBzaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShcbiAgICAgICAgdXNlclNoYXJlZEtleS5zaGFyZWRLZXkuaWRcbiAgICAgICk7XG4gICAgICBjb25zdCBjaXBoZXJNZXNzYWdlID0gYXdhaXQgdGhpcy5lbmNyeXB0KFxuICAgICAgICBzaGFyZWRLZXksXG4gICAgICAgIHBsYWluQ2lwaGVyTWVzc2FnZUpzb25cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNlbmRlclNpZ1ByayA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0SndrS2V5KFxuICAgICAgICB1c2VyU2hhcmVkS2V5LnVzZXJTaWdQcmsuaWRcbiAgICAgICk7XG4gICAgICBjb25zdCBzaWduZWRDaXBoZXJNZXNzYWdlID0gYXdhaXQgdGhpcy5zaWduKHNlbmRlclNpZ1ByaywgY2lwaGVyTWVzc2FnZSk7XG5cbiAgICAgIGlucHV0LnNpZ25lZENpcGhlck1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShzaWduZWRDaXBoZXJNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBpZiAocGxhaW5NZXNzYWdlSnNvbikge1xuICAgICAgaW5wdXQucGxhaW5NZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkocGxhaW5NZXNzYWdlSnNvbik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sckFwb2xsby5xdWVyeTxhbnk+KHtcbiAgICAgIHF1ZXJ5OiBTZW5kTWVzc2FnZU11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXMuc2VuZE1lc3NhZ2U7XG4gIH1cblxuICBhc3luYyBkZWNyeXB0TWVzc2FnZShcbiAgICBtZXNzYWdlOiBNZXNzYWdlLFxuICAgIHsgc2hhcmVkS2V5LCBzZW5kZXJTaWdQYmsgfTogRGVjcnlwdE1lc3NhZ2VPcHRpb25zXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNpZ25lZENpcGhlck1lc3NhZ2UgPSBhd2FpdCB0aGlzLnZlcmlmeShcbiAgICAgIHNlbmRlclNpZ1BiayxcbiAgICAgIEpTT04ucGFyc2UobWVzc2FnZS5zaWduZWRDaXBoZXJNZXNzYWdlKVxuICAgICk7XG5cbiAgICBtZXNzYWdlLnBsYWluU2lnbmVkQ2lwaGVyTWVzc2FnZUpzb24gPSBhd2FpdCB0aGlzLmRlY3J5cHQoXG4gICAgICBzaGFyZWRLZXksXG4gICAgICBzaWduZWRDaXBoZXJNZXNzYWdlXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldE1lc3NhZ2UoaWQ6IHN0cmluZyk6IFByb21pc2U8TWVzc2FnZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubHJBcG9sbG8ucXVlcnk8YW55Pih7XG4gICAgICBxdWVyeTogTWVzc2FnZVF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlkLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMua2V5R3JhcGguYWRkS2V5cyhyZXMua2V5R3JhcGgpO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IHJlcy5tZXNzYWdlIGFzIE1lc3NhZ2U7XG5cbiAgICBjb25zdCBzaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShtZXNzYWdlLnNoYXJlZEtleS5pZCk7XG5cbiAgICAvLyBUaGUgc2VuZGVyIHdvdWxkIGJlIGdldHRpbmcgdGhlIFByayBiYWNrLiBUaGUgcmVjZWl2ZXIgZ2V0cyB0aGUgUGJrIGJhY2suXG4gICAgLy8gQnV0IG9ubHkgdGhlIFBiayBpcyBuZWVkZWQgaGVyZSB0byB2ZXJpZnkgc2lnbmF0dXJlLlxuICAgIC8vIFNvIGJvdGggc2VuZGVyIGFuZCByZWNlaXZlciBjYW4gYWNjZXNzIHRoaXMgbWVzc2FnZS5cbiAgICBjb25zdCBzZW5kZXJTaWdQYmsgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShtZXNzYWdlLnNlbmRlclNpZ1Biay5pZCk7XG5cbiAgICAvLyBUZXN0IGJhZCBzaWduYXR1cmVcbiAgICAvLyBzZW5kZXJTaWdQYmsgPSBzZW5kZXJTaWdQYmsudG9KU09OKCk7XG4gICAgLy8gc2VuZGVyU2lnUGJrLm4gPSBcInhcIiArIHNlbmRlclNpZ1Biay5uLnN1YnN0cmluZygxKTtcbiAgICAvLyBzZW5kZXJTaWdQYmsgPSBhd2FpdCBLRlMuYXNLZXkoc2VuZGVyU2lnUGJrKTtcblxuICAgIGF3YWl0IHRoaXMuZGVjcnlwdE1lc3NhZ2UobWVzc2FnZSwge1xuICAgICAgc2hhcmVkS2V5LFxuICAgICAgc2VuZGVyU2lnUGJrLFxuICAgIH0pO1xuXG4gICAgaWYgKG1lc3NhZ2UucGxhaW5NZXNzYWdlKSB7XG4gICAgICBtZXNzYWdlLnBsYWluTWVzc2FnZUpzb24gPSBKU09OLnBhcnNlKG1lc3NhZ2UucGxhaW5NZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLm1lc3NhZ2U7XG4gIH1cbn1cbiJdfQ==
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import gql from 'graphql-tag';
|
|
4
|
+
import { EncryptionService } from '../cryptography/encryption.service';
|
|
5
|
+
import { KeyGraphService } from '../cryptography/key-graph.service';
|
|
6
|
+
import { KeyGraphFragment } from '../_common/queries.gql';
|
|
7
|
+
import { KeyExchangeService } from './key-exchange.service';
|
|
8
|
+
import { LrApolloService } from './lr-apollo.service';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "./lr-apollo.service";
|
|
11
|
+
import * as i2 from "../cryptography/key-graph.service";
|
|
12
|
+
import * as i3 from "../cryptography/encryption.service";
|
|
13
|
+
import * as i4 from "./key-exchange.service";
|
|
14
|
+
export const SendMessageMutation = gql `
|
|
15
|
+
mutation SendMessage($input: SendMessageInput!) {
|
|
16
|
+
sendMessage(input: $input) {
|
|
17
|
+
message {
|
|
18
|
+
id
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
`;
|
|
23
|
+
export const MessageQuery = gql `
|
|
24
|
+
query Message($id: LrRelayIdInput!) {
|
|
25
|
+
message(id: $id) {
|
|
26
|
+
id
|
|
27
|
+
sender {
|
|
28
|
+
username
|
|
29
|
+
}
|
|
30
|
+
receiver {
|
|
31
|
+
username
|
|
32
|
+
}
|
|
33
|
+
plainMessage
|
|
34
|
+
signedCipherMessage
|
|
35
|
+
sharedKey {
|
|
36
|
+
id
|
|
37
|
+
}
|
|
38
|
+
senderSigPbk {
|
|
39
|
+
id
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
keyGraph {
|
|
43
|
+
...KeyGraphFragment
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
${KeyGraphFragment}
|
|
47
|
+
`;
|
|
48
|
+
export class MessageService {
|
|
49
|
+
constructor(lrApollo, keyGraph, encryptionService, keyExchangeService) {
|
|
50
|
+
this.lrApollo = lrApollo;
|
|
51
|
+
this.keyGraph = keyGraph;
|
|
52
|
+
this.encryptionService = encryptionService;
|
|
53
|
+
this.keyExchangeService = keyExchangeService;
|
|
54
|
+
this.encrypt = this.encryptionService.encrypt.bind(this.encryptionService);
|
|
55
|
+
this.decrypt = this.encryptionService.decrypt.bind(this.encryptionService);
|
|
56
|
+
this.sign = this.encryptionService.sign.bind(this.encryptionService);
|
|
57
|
+
this.verify = this.encryptionService.verify.bind(this.encryptionService);
|
|
58
|
+
}
|
|
59
|
+
sendMessage({ username, userId, plainMessageJson, plainCipherMessageJson, }) {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
const userSharedKey = yield this.keyExchangeService.currentUserSharedKey({
|
|
62
|
+
username,
|
|
63
|
+
userId,
|
|
64
|
+
});
|
|
65
|
+
const input = {
|
|
66
|
+
receiverUsername: username,
|
|
67
|
+
receiverId: userId,
|
|
68
|
+
sharedKeyId: userSharedKey.sharedKey.id,
|
|
69
|
+
senderSigPbkId: userSharedKey.userSigPrk.id,
|
|
70
|
+
};
|
|
71
|
+
if (plainCipherMessageJson) {
|
|
72
|
+
const sharedKey = yield this.keyGraph.getJwkKey(userSharedKey.sharedKey.id);
|
|
73
|
+
const cipherMessage = yield this.encrypt(sharedKey, plainCipherMessageJson);
|
|
74
|
+
const senderSigPrk = yield this.keyGraph.getJwkKey(userSharedKey.userSigPrk.id);
|
|
75
|
+
const signedCipherMessage = yield this.sign(senderSigPrk, cipherMessage);
|
|
76
|
+
input.signedCipherMessage = JSON.stringify(signedCipherMessage);
|
|
77
|
+
}
|
|
78
|
+
if (plainMessageJson) {
|
|
79
|
+
input.plainMessage = JSON.stringify(plainMessageJson);
|
|
80
|
+
}
|
|
81
|
+
const res = yield this.lrApollo.query({
|
|
82
|
+
query: SendMessageMutation,
|
|
83
|
+
variables: {
|
|
84
|
+
input,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
return res.sendMessage;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
decryptMessage(message, { sharedKey, senderSigPbk }) {
|
|
91
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
+
const signedCipherMessage = yield this.verify(senderSigPbk, JSON.parse(message.signedCipherMessage));
|
|
93
|
+
message.plainSignedCipherMessageJson = yield this.decrypt(sharedKey, signedCipherMessage);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
getMessage(id) {
|
|
97
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
+
const res = yield this.lrApollo.query({
|
|
99
|
+
query: MessageQuery,
|
|
100
|
+
variables: {
|
|
101
|
+
id,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
this.keyGraph.addKeys(res.keyGraph);
|
|
105
|
+
const message = res.message;
|
|
106
|
+
const sharedKey = yield this.keyGraph.getJwkKey(message.sharedKey.id);
|
|
107
|
+
// The sender would be getting the Prk back. The receiver gets the Pbk back.
|
|
108
|
+
// But only the Pbk is needed here to verify signature.
|
|
109
|
+
// So both sender and receiver can access this message.
|
|
110
|
+
const senderSigPbk = yield this.keyGraph.getJwkKey(message.senderSigPbk.id);
|
|
111
|
+
// Test bad signature
|
|
112
|
+
// senderSigPbk = senderSigPbk.toJSON();
|
|
113
|
+
// senderSigPbk.n = "x" + senderSigPbk.n.substring(1);
|
|
114
|
+
// senderSigPbk = await KFS.asKey(senderSigPbk);
|
|
115
|
+
yield this.decryptMessage(message, {
|
|
116
|
+
sharedKey,
|
|
117
|
+
senderSigPbk,
|
|
118
|
+
});
|
|
119
|
+
if (message.plainMessage) {
|
|
120
|
+
message.plainMessageJson = JSON.parse(message.plainMessage);
|
|
121
|
+
}
|
|
122
|
+
return res.message;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
MessageService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MessageService_Factory() { return new MessageService(i0.ɵɵinject(i1.LrApolloService), i0.ɵɵinject(i2.KeyGraphService), i0.ɵɵinject(i3.EncryptionService), i0.ɵɵinject(i4.KeyExchangeService)); }, token: MessageService, providedIn: "root" });
|
|
127
|
+
MessageService.decorators = [
|
|
128
|
+
{ type: Injectable, args: [{
|
|
129
|
+
providedIn: 'root',
|
|
130
|
+
},] }
|
|
131
|
+
];
|
|
132
|
+
MessageService.ctorParameters = () => [
|
|
133
|
+
{ type: LrApolloService },
|
|
134
|
+
{ type: KeyGraphService },
|
|
135
|
+
{ type: EncryptionService },
|
|
136
|
+
{ type: KeyExchangeService }
|
|
137
|
+
];
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2plY3RzL25ld3JlcG8va2MtY2xpZW50L3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2FwaS9tZXNzYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDO0FBRTlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7OztBQUd0RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUE7Ozs7Ozs7O0NBUXJDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXVCM0IsZ0JBQWdCO0NBQ25CLENBQUM7QUE2Q0YsTUFBTSxPQUFPLGNBQWM7SUFjekIsWUFDVSxRQUF5QixFQUN6QixRQUF5QixFQUN6QixpQkFBb0MsRUFDcEMsa0JBQXNDO1FBSHRDLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQWpCL0IsWUFBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUM1RCxJQUFJLENBQUMsaUJBQWlCLENBQ3ZCLENBQUM7UUFD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QUV2QyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFdEUsNEVBQTRFO1lBQzVFLHVEQUF1RDtZQUN2RCx1REFBdUQ7WUFDdkQsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRTVFLHFCQUFxQjtZQUNyQix3Q0FBd0M7WUFDeEMsc0RBQXNEO1lBQ3RELGdEQUFnRDtZQUVoRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO2dCQUNqQyxTQUFTO2dCQUNULFlBQVk7YUFDYixDQUFDLENBQUM7WUFFSCxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7Z0JBQ3hCLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUM3RDtZQUVELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUNyQixDQUFDO0tBQUE7Ozs7WUExSEYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUFqRlEsZUFBZTtZQUhmLGVBQWU7WUFEZixpQkFBaUI7WUFHakIsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgZ3FsIGZyb20gJ2dyYXBocWwtdGFnJztcclxuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcclxuaW1wb3J0IHsgRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkvZW5jcnlwdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgS2V5R3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS1ncmFwaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgS2V5R3JhcGhGcmFnbWVudCB9IGZyb20gJy4uL19jb21tb24vcXVlcmllcy5ncWwnO1xyXG5pbXBvcnQgeyBLZXlFeGNoYW5nZVNlcnZpY2UgfSBmcm9tICcuL2tleS1leGNoYW5nZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTHJBcG9sbG9TZXJ2aWNlIH0gZnJvbSAnLi9sci1hcG9sbG8uc2VydmljZSc7XHJcbmltcG9ydCB7IEtleUZhY3RvcnlTZXJ2aWNlIGFzIEtGUyB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXktZmFjdG9yeS5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBjb25zdCBTZW5kTWVzc2FnZU11dGF0aW9uID0gZ3FsYFxyXG4gIG11dGF0aW9uIFNlbmRNZXNzYWdlKCRpbnB1dDogU2VuZE1lc3NhZ2VJbnB1dCEpIHtcclxuICAgIHNlbmRNZXNzYWdlKGlucHV0OiAkaW5wdXQpIHtcclxuICAgICAgbWVzc2FnZSB7XHJcbiAgICAgICAgaWRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBNZXNzYWdlUXVlcnkgPSBncWxgXHJcbiAgcXVlcnkgTWVzc2FnZSgkaWQ6IExyUmVsYXlJZElucHV0ISkge1xyXG4gICAgbWVzc2FnZShpZDogJGlkKSB7XHJcbiAgICAgIGlkXHJcbiAgICAgIHNlbmRlciB7XHJcbiAgICAgICAgdXNlcm5hbWVcclxuICAgICAgfVxyXG4gICAgICByZWNlaXZlciB7XHJcbiAgICAgICAgdXNlcm5hbWVcclxuICAgICAgfVxyXG4gICAgICBwbGFpbk1lc3NhZ2VcclxuICAgICAgc2lnbmVkQ2lwaGVyTWVzc2FnZVxyXG4gICAgICBzaGFyZWRLZXkge1xyXG4gICAgICAgIGlkXHJcbiAgICAgIH1cclxuICAgICAgc2VuZGVyU2lnUGJrIHtcclxuICAgICAgICBpZFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBrZXlHcmFwaCB7XHJcbiAgICAgIC4uLktleUdyYXBoRnJhZ21lbnRcclxuICAgIH1cclxuICB9XHJcbiAgJHtLZXlHcmFwaEZyYWdtZW50fVxyXG5gO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZW5kTWVzc2FnZSB7XHJcbiAgbWVzc2FnZToge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRNZXNzYWdlSW5wdXQge1xyXG4gIHVzZXJuYW1lPzogc3RyaW5nO1xyXG4gIHVzZXJJZD86IHN0cmluZztcclxuICBwbGFpbk1lc3NhZ2VKc29uPzogYW55O1xyXG4gIHBsYWluQ2lwaGVyTWVzc2FnZUpzb24/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBzZW5kZXI6IHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICB1c2VybmFtZTogc3RyaW5nO1xyXG4gIH07XHJcbiAgcmVjZWl2ZXI6IHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICB1c2VybmFtZTogc3RyaW5nO1xyXG4gIH07XHJcbiAgcGxhaW5NZXNzYWdlOiBzdHJpbmc7XHJcbiAgcGxhaW5NZXNzYWdlSnNvbj86IGFueTtcclxuICBzaWduZWRDaXBoZXJNZXNzYWdlOiBzdHJpbmc7XHJcbiAgcGxhaW5TaWduZWRDaXBoZXJNZXNzYWdlSnNvbj86IGFueTtcclxuICBzZW5kZXJTaWdQYms6IHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgfTtcclxuICBzaGFyZWRLZXk6IHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgfTtcclxufVxyXG5cclxuaW50ZXJmYWNlIERlY3J5cHRNZXNzYWdlT3B0aW9ucyB7XHJcbiAgc2hhcmVkS2V5OiBKV0suS2V5O1xyXG4gIHNlbmRlclNpZ1BiazogSldLLktleTtcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVuY3J5cHQgPSB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQuYmluZChcclxuICAgIHRoaXMuZW5jcnlwdGlvblNlcnZpY2VcclxuICApO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjcnlwdCA9IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdC5iaW5kKFxyXG4gICAgdGhpcy5lbmNyeXB0aW9uU2VydmljZVxyXG4gICk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaWduID0gdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduLmJpbmQoXHJcbiAgICB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlXHJcbiAgKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHZlcmlmeSA9IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UudmVyaWZ5LmJpbmQoXHJcbiAgICB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlXHJcbiAgKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGxyQXBvbGxvOiBMckFwb2xsb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGtleUdyYXBoOiBLZXlHcmFwaFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVuY3J5cHRpb25TZXJ2aWNlOiBFbmNyeXB0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUga2V5RXhjaGFuZ2VTZXJ2aWNlOiBLZXlFeGNoYW5nZVNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIHNlbmRNZXNzYWdlKHtcclxuICAgIHVzZXJuYW1lLFxyXG4gICAgdXNlcklkLFxyXG4gICAgcGxhaW5NZXNzYWdlSnNvbixcclxuICAgIHBsYWluQ2lwaGVyTWVzc2FnZUpzb24sXHJcbiAgfTogU2VuZE1lc3NhZ2VJbnB1dCk6IFByb21pc2U8U2VuZE1lc3NhZ2U+IHtcclxuICAgIGNvbnN0IHVzZXJTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5jdXJyZW50VXNlclNoYXJlZEtleSh7XHJcbiAgICAgIHVzZXJuYW1lLFxyXG4gICAgICB1c2VySWQsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBpbnB1dDogYW55ID0ge1xyXG4gICAgICByZWNlaXZlclVzZXJuYW1lOiB1c2VybmFtZSxcclxuICAgICAgcmVjZWl2ZXJJZDogdXNlcklkLFxyXG4gICAgICBzaGFyZWRLZXlJZDogdXNlclNoYXJlZEtleS5zaGFyZWRLZXkuaWQsXHJcbiAgICAgIHNlbmRlclNpZ1Bia0lkOiB1c2VyU2hhcmVkS2V5LnVzZXJTaWdQcmsuaWQsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChwbGFpbkNpcGhlck1lc3NhZ2VKc29uKSB7XHJcbiAgICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0SndrS2V5KFxyXG4gICAgICAgIHVzZXJTaGFyZWRLZXkuc2hhcmVkS2V5LmlkXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGNpcGhlck1lc3NhZ2UgPSBhd2FpdCB0aGlzLmVuY3J5cHQoXHJcbiAgICAgICAgc2hhcmVkS2V5LFxyXG4gICAgICAgIHBsYWluQ2lwaGVyTWVzc2FnZUpzb25cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHNlbmRlclNpZ1ByayA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0SndrS2V5KFxyXG4gICAgICAgIHVzZXJTaGFyZWRLZXkudXNlclNpZ1Byay5pZFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBzaWduZWRDaXBoZXJNZXNzYWdlID0gYXdhaXQgdGhpcy5zaWduKHNlbmRlclNpZ1ByaywgY2lwaGVyTWVzc2FnZSk7XHJcblxyXG4gICAgICBpbnB1dC5zaWduZWRDaXBoZXJNZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoc2lnbmVkQ2lwaGVyTWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBsYWluTWVzc2FnZUpzb24pIHtcclxuICAgICAgaW5wdXQucGxhaW5NZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkocGxhaW5NZXNzYWdlSnNvbik7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sckFwb2xsby5xdWVyeTxhbnk+KHtcclxuICAgICAgcXVlcnk6IFNlbmRNZXNzYWdlTXV0YXRpb24sXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlucHV0LFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlcy5zZW5kTWVzc2FnZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRlY3J5cHRNZXNzYWdlKFxyXG4gICAgbWVzc2FnZTogTWVzc2FnZSxcclxuICAgIHsgc2hhcmVkS2V5LCBzZW5kZXJTaWdQYmsgfTogRGVjcnlwdE1lc3NhZ2VPcHRpb25zXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzaWduZWRDaXBoZXJNZXNzYWdlID0gYXdhaXQgdGhpcy52ZXJpZnkoXHJcbiAgICAgIHNlbmRlclNpZ1BiayxcclxuICAgICAgSlNPTi5wYXJzZShtZXNzYWdlLnNpZ25lZENpcGhlck1lc3NhZ2UpXHJcbiAgICApO1xyXG5cclxuICAgIG1lc3NhZ2UucGxhaW5TaWduZWRDaXBoZXJNZXNzYWdlSnNvbiA9IGF3YWl0IHRoaXMuZGVjcnlwdChcclxuICAgICAgc2hhcmVkS2V5LFxyXG4gICAgICBzaWduZWRDaXBoZXJNZXNzYWdlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0TWVzc2FnZShpZDogc3RyaW5nKTogUHJvbWlzZTxNZXNzYWdlPiB7XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmxyQXBvbGxvLnF1ZXJ5PGFueT4oe1xyXG4gICAgICBxdWVyeTogTWVzc2FnZVF1ZXJ5LFxyXG4gICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICBpZCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMua2V5R3JhcGguYWRkS2V5cyhyZXMua2V5R3JhcGgpO1xyXG5cclxuICAgIGNvbnN0IG1lc3NhZ2UgPSByZXMubWVzc2FnZSBhcyBNZXNzYWdlO1xyXG5cclxuICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0SndrS2V5KG1lc3NhZ2Uuc2hhcmVkS2V5LmlkKTtcclxuXHJcbiAgICAvLyBUaGUgc2VuZGVyIHdvdWxkIGJlIGdldHRpbmcgdGhlIFByayBiYWNrLiBUaGUgcmVjZWl2ZXIgZ2V0cyB0aGUgUGJrIGJhY2suXHJcbiAgICAvLyBCdXQgb25seSB0aGUgUGJrIGlzIG5lZWRlZCBoZXJlIHRvIHZlcmlmeSBzaWduYXR1cmUuXHJcbiAgICAvLyBTbyBib3RoIHNlbmRlciBhbmQgcmVjZWl2ZXIgY2FuIGFjY2VzcyB0aGlzIG1lc3NhZ2UuXHJcbiAgICBjb25zdCBzZW5kZXJTaWdQYmsgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShtZXNzYWdlLnNlbmRlclNpZ1Biay5pZCk7XHJcblxyXG4gICAgLy8gVGVzdCBiYWQgc2lnbmF0dXJlXHJcbiAgICAvLyBzZW5kZXJTaWdQYmsgPSBzZW5kZXJTaWdQYmsudG9KU09OKCk7XHJcbiAgICAvLyBzZW5kZXJTaWdQYmsubiA9IFwieFwiICsgc2VuZGVyU2lnUGJrLm4uc3Vic3RyaW5nKDEpO1xyXG4gICAgLy8gc2VuZGVyU2lnUGJrID0gYXdhaXQgS0ZTLmFzS2V5KHNlbmRlclNpZ1Biayk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5kZWNyeXB0TWVzc2FnZShtZXNzYWdlLCB7XHJcbiAgICAgIHNoYXJlZEtleSxcclxuICAgICAgc2VuZGVyU2lnUGJrLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKG1lc3NhZ2UucGxhaW5NZXNzYWdlKSB7XHJcbiAgICAgIG1lc3NhZ2UucGxhaW5NZXNzYWdlSnNvbiA9IEpTT04ucGFyc2UobWVzc2FnZS5wbGFpbk1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXMubWVzc2FnZTtcclxuICB9XHJcbn1cclxuIl19
|