@lifeready/core 1.0.12 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -62
- package/bundles/lifeready-core.umd.js +14315 -14315
- 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 +52 -52
- 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/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 +262 -262
- 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 +101 -101
- 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 +488 -488
- 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 +299 -299
- 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/items2/item2.gql.js +139 -139
- package/esm2015/lib/items2/item2.service.js +498 -498
- package/esm2015/lib/items2/item2.types.js +1 -1
- package/esm2015/lib/life-ready.config.js +84 -84
- package/esm2015/lib/life-ready.module.js +74 -74
- package/esm2015/lib/notification/notification.gql.js +43 -43
- package/esm2015/lib/notification/notification.service.js +118 -118
- 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/scenario.constants.js +2 -2
- package/esm2015/lib/scenario/scenario.controller.js +34 -34
- package/esm2015/lib/scenario/scenario.gql.js +72 -72
- package/esm2015/lib/scenario/scenario.gql.private.js +198 -198
- package/esm2015/lib/scenario/scenario.service.js +538 -538
- package/esm2015/lib/scenario/scenario.types.js +1 -1
- package/esm2015/lib/trusted-parties/tp-assembly.gql.private.js +22 -22
- package/esm2015/lib/trusted-parties/tp-assembly.js +362 -362
- package/esm2015/lib/trusted-parties/tp-assembly.types.js +1 -1
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +113 -113
- 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.controller.js +34 -34
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +236 -236
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +95 -95
- 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 +13 -13
- package/esm2015/public-api.js +71 -71
- package/fesm2015/lifeready-core.js +12258 -12258
- 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 +9 -9
- 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/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 +34 -34
- 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 +28 -28
- 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 +502 -502
- 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 +61 -61
- 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 +41 -41
- 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/items2/item2.gql.d.ts +123 -123
- package/lib/items2/item2.service.d.ts +203 -203
- package/lib/items2/item2.types.d.ts +70 -70
- package/lib/life-ready.config.d.ts +14 -14
- package/lib/life-ready.module.d.ts +5 -5
- package/lib/notification/notification.gql.d.ts +37 -37
- package/lib/notification/notification.service.d.ts +63 -63
- 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/scenario.constants.d.ts +1 -1
- package/lib/scenario/scenario.controller.d.ts +10 -10
- package/lib/scenario/scenario.gql.d.ts +62 -62
- package/lib/scenario/scenario.gql.private.d.ts +16 -16
- package/lib/scenario/scenario.service.d.ts +233 -233
- package/lib/scenario/scenario.types.d.ts +50 -50
- package/lib/trusted-parties/tp-assembly.d.ts +177 -177
- package/lib/trusted-parties/tp-assembly.gql.private.d.ts +5 -5
- package/lib/trusted-parties/tp-assembly.types.d.ts +38 -38
- 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.controller.d.ts +10 -10
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +223 -223
- package/lib/trusted-parties/tp-password-reset.service.d.ts +188 -188
- 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 +12 -12
- package/package.json +1 -1
- package/public-api.d.ts +67 -67
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHItbXV0YXRpb24tYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9Qcm9qZWN0cy9rYy1jbGllbnQvcHJvamVjdHMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvYXBpL2xyLWdyYXBocWwvbHItbXV0YXRpb24tYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBcUIsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFPL0QsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQTs7OztDQUlyRCxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQXVCLENBQUM7QUFFcEQsMkNBQTJDO0FBQzNDLHlFQUF5RTtBQUV6RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQWdCLGNBQWM7SUFBcEM7UUFHRSxrQ0FBa0M7UUFDeEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUU1QixpREFBaUQ7UUFDakMsb0JBQWUsR0FBRyxJQUFJLGVBQWUsRUFBSyxDQUFDO0lBK0I3RCxDQUFDO0lBN0JDLElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUM7SUFDdEMsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFRO1FBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFZO1FBQ2pCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsTUFBTSxJQUFJLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcGVyYXRpb25WYXJpYWJsZXMgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcclxuaW1wb3J0IHsgRnJhZ21lbnRTcHJlYWROb2RlIH0gZnJvbSAnZ3JhcGhxbCc7XHJcbmltcG9ydCBncWwgZnJvbSAnZ3JhcGhxbC10YWcnO1xyXG5pbXBvcnQgeyBnZXRRdWVyeSwgVHlwZWREb2N1bWVudE5vZGUgfSBmcm9tICcuLi8uLi9fY29tbW9uL2FzdCc7XHJcbmltcG9ydCB7IERlZmVycmVkUHJvbWlzZSB9IGZyb20gJy4uLy4uL19jb21tb24vZGVmZXJyZWQtcHJvbWlzZSc7XHJcbmltcG9ydCB7IExyQmFkU3RhdGVFeGNlcHRpb24gfSBmcm9tICcuLi8uLi9fY29tbW9uL2V4Y2VwdGlvbnMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMck11dGF0aW9uRGF0YTxULCBUVmFyaWFibGVzID0gT3BlcmF0aW9uVmFyaWFibGVzPiB7XHJcbiAgbXV0YXRpb246IFR5cGVkRG9jdW1lbnROb2RlPFQ+O1xyXG4gIHZhcmlhYmxlcz86IFRWYXJpYWJsZXM7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudFNwcmVhZEFzdFNlbGVjdGlvbiA9IGdldFF1ZXJ5KGdxbGBcclxuICBxdWVyeSB7XHJcbiAgICAuLi5GcmFnbWVudE5hbWVcclxuICB9XHJcbmApLnNlbGVjdGlvblNldC5zZWxlY3Rpb25zWzBdIGFzIEZyYWdtZW50U3ByZWFkTm9kZTtcclxuXHJcbi8vIGNvbnN0IGZyYWdtZW50U3ByZWFkQXN0U2VsZWN0aW9uID0gKCkgPT5cclxuLy8gICBsb2Rhc2guZGVlcENsb25lKF9mcmFnbWVudFNwcmVhZEFzdFNlbGVjdGlvbikgYXMgRnJhZ21lbnRTcHJlYWROb2RlO1xyXG5cclxuLyoqXHJcbiAqIERFQ0lTSU9OOiBMck11dGF0aW9uQmFzZSBkb2VzIG5vdCBwcm92aWRlIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGNhbGwgbHJHcmFwaFFMLmxyTXV0YXRlKClcclxuICogYmVjYXVzZSB0aGlzIGNsYXNzIGNvdWxkIGJlIG1hZGUgaW5kZXBlbmRlbnQgb2Ygd2hhdCBsaWIgaXMgdXNlZCB0byBjYWxsIHRoZSBBUEkuIElmIHdlXHJcbiAqIHByb3ZpZGVkIGEgY29uZmlndXJhYmxlIGNhbGwgYmFjayB0byBtYWtlIHRoZSBBUEkgY2FsbCwgdGhlbiB0aGUgdHlwaW5nIGZvciB0aGF0IGNhbGxiYWNrXHJcbiAqIG5lZWRzIHRvIGJlIGtub3duLiBCdXQgc2luY2UgdGhlIEFQSSBsaWIgKGVnLiBBcG9sbG8pIGhhcyBpdCdzIG93biB1bmlxdWUgcmV0dXJuIHR5cGUsIHNvXHJcbiAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGRvIGluIGdlbmVyYWwuXHJcbiAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTHJNdXRhdGlvbkJhc2U8VCwgVFZhcmlhYmxlcyA9IE9wZXJhdGlvblZhcmlhYmxlcz4ge1xyXG4gIHByb3RlY3RlZCBtdXRhdGlvbjogVHlwZWREb2N1bWVudE5vZGU8VD47XHJcbiAgcHJvdGVjdGVkIHZhcmlhYmxlcz86IFRWYXJpYWJsZXM7XHJcbiAgLyogdHNsaW50OmRpc2FibGU6dmFyaWFibGUtbmFtZSAqL1xyXG4gIHByb3RlY3RlZCBfZXhlY3V0ZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8gcHJvdGVjdGVkIHByb21pc2VzOiBEZWZlcnJlZFByb21pc2U8VD5bXSA9IFtdO1xyXG4gIHB1YmxpYyByZWFkb25seSBkZWZlcnJlZFByb21pc2UgPSBuZXcgRGVmZXJyZWRQcm9taXNlPFQ+KCk7XHJcblxyXG4gIGdldCBwcm9taXNlKCk6IFByb21pc2U8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGVmZXJyZWRQcm9taXNlLnByb21pc2U7XHJcbiAgfVxyXG5cclxuICByZXNvbHZlKHZhbHVlOiBUKSB7XHJcbiAgICB0aGlzLmRlZmVycmVkUHJvbWlzZS5yZXNvbHZlKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHJlamVjdChyZWFzb24/OiBhbnkpIHtcclxuICAgIHRoaXMuZGVmZXJyZWRQcm9taXNlLnJlamVjdChyZWFzb24pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxyTXV0YXRpb25EYXRhKCk6IExyTXV0YXRpb25EYXRhPFQsIFRWYXJpYWJsZXM+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG11dGF0aW9uOiB0aGlzLm11dGF0aW9uLFxyXG4gICAgICB2YXJpYWJsZXM6IHRoaXMudmFyaWFibGVzLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldCBleGVjdXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9leGVjdXRlZDtcclxuICB9XHJcblxyXG4gIHNldEV4ZWN1dGVkKCkge1xyXG4gICAgaWYgKHRoaXMuX2V4ZWN1dGVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBMckJhZFN0YXRlRXhjZXB0aW9uKCdBbHJlYWR5IGV4ZWN1dGVkJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9leGVjdXRlZCA9IHRydWU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHItbXV0YXRpb24uanMiLCJzb3VyY2VSb290IjoiQzovUHJvamVjdHMva2MtY2xpZW50L3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2FwaS9sci1ncmFwaHFsL2xyLW11dGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBR2pDLE9BQU8sRUFDTCxjQUFjLEVBQ2QsWUFBWSxFQUNaLFdBQVcsR0FFWixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sS0FBSyxHQUFHLE1BQU0sbUJBQW1CLENBQUM7QUFFekMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhGLE1BQU0sT0FBTyxVQUdYLFNBQVEsY0FBNkI7SUFDckMsWUFBWSxPQUFzQztRQUNoRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sQ0FBVSxTQUFxQztRQUNuRCwyQkFBMkI7UUFDM0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFpQixDQUFDO1FBQ3BFLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU5QyxNQUFNLFdBQVcsR0FBRyxFQUErQyxDQUFDO1FBQ3BFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFnQyxFQUFFLEVBQUU7WUFDbkUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFNBQW9CLEVBQUUsRUFBRTtZQUNyRCxNQUFNLEtBQUssR0FBRyxTQUFzQixDQUFDO1lBQ3JDLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFeEMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDYixPQUFPO2FBQ1I7WUFFRCx3REFBd0Q7WUFDeEQsd0RBQXdEO1lBQ3hELHFEQUFxRDtZQUNyRCxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRztnREFFekIsMEJBQTBCLEtBQzdCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUU1QixDQUFDO1FBQ0osQ0FBQyxDQUFDO1FBRUYsWUFBWSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDekQsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtnQkFDOUIscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDbEM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxVQUFVLENBQUM7WUFDcEIsUUFBUSxFQUFFLGdDQUNMLFdBQVcsS0FDZCxXQUFXLEVBQUU7b0JBQ1gsZ0NBQWdDO29CQUNoQyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUMvQixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxvQkFBb0IsQ0FDM0M7b0JBQ0QsR0FBRyxTQUFTLENBQUMsV0FBVztpQkFDekIsR0FDNEI7WUFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGxvZGFzaCBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBPcGVyYXRpb25WYXJpYWJsZXMgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcclxuaW1wb3J0IHsgRG9jdW1lbnROb2RlLCBGaWVsZE5vZGUsIEZyYWdtZW50RGVmaW5pdGlvbk5vZGUgfSBmcm9tICdncmFwaHFsJztcclxuaW1wb3J0IHtcclxuICBnZXRBbGlhc09yTmFtZSxcclxuICBnZXRGcmFnbWVudHMsXHJcbiAgZ2V0TXV0YXRpb24sXHJcbiAgVHlwZWREb2N1bWVudE5vZGUsXHJcbn0gZnJvbSAnLi4vLi4vX2NvbW1vbi9hc3QnO1xyXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAnLi4vLi4vX2NvbW1vbi9hc3QnO1xyXG5pbXBvcnQgeyBMck11dGF0aW9uRGF0YSB9IGZyb20gJy4vbHItbXV0YXRpb24tYmFzZSc7XHJcbmltcG9ydCB7IGZyYWdtZW50U3ByZWFkQXN0U2VsZWN0aW9uLCBMck11dGF0aW9uQmFzZSB9IGZyb20gJy4vbHItbXV0YXRpb24tYmFzZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgTHJNdXRhdGlvbjxcclxuICBUIGV4dGVuZHMgYW55LFxyXG4gIFRWYXJpYWJsZXMgPSBPcGVyYXRpb25WYXJpYWJsZXNcclxuPiBleHRlbmRzIExyTXV0YXRpb25CYXNlPFQsIFRWYXJpYWJsZXM+IHtcclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBMck11dGF0aW9uRGF0YTxULCBUVmFyaWFibGVzPikge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMubXV0YXRpb24gPSBvcHRpb25zLm11dGF0aW9uO1xyXG4gICAgdGhpcy52YXJpYWJsZXMgPSBvcHRpb25zLnZhcmlhYmxlcztcclxuICB9XHJcblxyXG4gIHNlbGVjdDxUUmVzdWx0PihmcmFnbWVudHM6IFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQ+KSB7XHJcbiAgICAvLyBEb24ndCB0b3VjaCB0aGUgb3JpZ2luYWxcclxuICAgIGNvbnN0IG11dGF0aW9uRG9jID0gbG9kYXNoLmNsb25lRGVlcCh0aGlzLm11dGF0aW9uKSBhcyBEb2N1bWVudE5vZGU7XHJcbiAgICBjb25zdCBtdXRhdGlvbk5vZGUgPSBnZXRNdXRhdGlvbihtdXRhdGlvbkRvYyk7XHJcblxyXG4gICAgY29uc3QgZnJhZ21lbnRNYXAgPSB7fSBhcyB7IFtrZXk6IHN0cmluZ106IEZyYWdtZW50RGVmaW5pdGlvbk5vZGUgfTtcclxuICAgIGdldEZyYWdtZW50cyhmcmFnbWVudHMpLmZvckVhY2goKGZyYWdtZW50OiBGcmFnbWVudERlZmluaXRpb25Ob2RlKSA9PiB7XHJcbiAgICAgIGZyYWdtZW50TWFwW2ZyYWdtZW50Lm5hbWUudmFsdWVdID0gZnJhZ21lbnQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCByZXBsYWNlRmllbGRTZWxlY3Rpb24gPSAoc2VsZWN0aW9uOiBGaWVsZE5vZGUpID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSBzZWxlY3Rpb24gYXMgRmllbGROb2RlO1xyXG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBnZXRBbGlhc09yTmFtZShmaWVsZCk7XHJcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gZnJhZ21lbnRNYXBbZmllbGROYW1lXTtcclxuXHJcbiAgICAgIGlmICghZnJhZ21lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIE1ha2UgdGhlIGVudGlyZSBzZWxlY3Rpb24gb2YgdGhlIG11dGF0aW9uIGEgc3ByZWFkIG9mXHJcbiAgICAgIC8vIGEgZnJhZ21lbnQgdXNpbmcgdGhlIHNhbWUgbmFtZSBhcyB0aGUgbXV0YXRpb24gZmllbGQuXHJcbiAgICAgIC8vIFdlIHdpbGwgYWxzbyByZW5hbWUgdGhlIGZyYWdtZW50IHRvIHRoZSBzYW1lIG5hbWUuXHJcbiAgICAgIGZpZWxkLnNlbGVjdGlvblNldC5zZWxlY3Rpb25zID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIC4uLmZyYWdtZW50U3ByZWFkQXN0U2VsZWN0aW9uLFxyXG4gICAgICAgICAgbmFtZTogYXN0Lm5hbWUoZmllbGROYW1lKSxcclxuICAgICAgICB9LFxyXG4gICAgICBdO1xyXG4gICAgfTtcclxuXHJcbiAgICBtdXRhdGlvbk5vZGUuc2VsZWN0aW9uU2V0LnNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIGlmIChzZWxlY3Rpb24ua2luZCA9PT0gJ0ZpZWxkJykge1xyXG4gICAgICAgIHJlcGxhY2VGaWVsZFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xyXG4gICAgICBtdXRhdGlvbjoge1xyXG4gICAgICAgIC4uLm11dGF0aW9uRG9jLFxyXG4gICAgICAgIGRlZmluaXRpb25zOiBbXHJcbiAgICAgICAgICAvLyBSZW1vdmUgYWxsIGV4aXN0aW5nIGZyYWdtZW50c1xyXG4gICAgICAgICAgLi4ubXV0YXRpb25Eb2MuZGVmaW5pdGlvbnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAoZGVmKSA9PiBkZWYua2luZCAhPT0gJ0ZyYWdtZW50RGVmaW5pdGlvbidcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICAuLi5mcmFnbWVudHMuZGVmaW5pdGlvbnMsXHJcbiAgICAgICAgXSxcclxuICAgICAgfSBhcyBUeXBlZERvY3VtZW50Tm9kZTxUUmVzdWx0PixcclxuICAgICAgdmFyaWFibGVzOiB0aGlzLnZhcmlhYmxlcyxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9Qcm9qZWN0cy9rYy1jbGllbnQvcHJvamVjdHMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvYXBpL2xyLWdyYXBocWwvbHIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUNMLGdCQUFnQixHQUdqQixNQUFNLHNCQUFzQixDQUFDO0FBRzlCLE1BQU0sT0FBTyxTQUFTO0lBR3BCLFlBQVksUUFBa0I7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVlLE1BQU0sQ0FDcEIsVUFFMEMsRUFDMUMsT0FBMEM7O1lBRTFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELENBQUM7S0FBQTtJQUVlLEtBQUssQ0FBTyxPQUE2Qjs7WUFDdkQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxDQUFDO0tBQUE7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgTHJHcmFwaFFMU2VydmljZSxcclxuICBMck11dGF0aW9uT3B0aW9ucyxcclxuICBMclF1ZXJ5T3B0aW9ucyxcclxufSBmcm9tICcuL2xyLWdyYXBocWwuc2VydmljZSc7XHJcbmltcG9ydCB7IExyTXV0YXRpb25CYXNlIH0gZnJvbSAnLi9sci1tdXRhdGlvbi1iYXNlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBMclNlcnZpY2Uge1xyXG4gIHByb3RlY3RlZCBsckdyYXBoUUw6IExyR3JhcGhRTFNlcnZpY2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgdGhpcy5sckdyYXBoUUwgPSBpbmplY3Rvci5nZXQoTHJHcmFwaFFMU2VydmljZSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgbXV0YXRlPFQsIFRWYXJpYWJsZXM+KFxyXG4gICAgbHJNdXRhdGlvbjpcclxuICAgICAgfCBMck11dGF0aW9uQmFzZTxULCBUVmFyaWFibGVzPlxyXG4gICAgICB8IFByb21pc2U8THJNdXRhdGlvbkJhc2U8VCwgVFZhcmlhYmxlcz4+LFxyXG4gICAgb3B0aW9ucz86IExyTXV0YXRpb25PcHRpb25zPFQsIFRWYXJpYWJsZXM+XHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sckdyYXBoUUwubHJNdXRhdGUobHJNdXRhdGlvbiwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgcXVlcnk8VCwgVj4ob3B0aW9uczogTHJRdWVyeU9wdGlvbnM8VCwgVj4pIHtcclxuICAgIHJldHVybiB0aGlzLmxyR3JhcGhRTC5xdWVyeShvcHRpb25zKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2plY3RzL2tjLWNsaWVudC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9hcGkvbWVzc2FnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQztBQUU5QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7QUFHdEQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFBOzs7Ozs7OztDQVFyQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF1QjNCLGdCQUFnQjtDQUNuQixDQUFDO0FBNkNGLE1BQU0sT0FBTyxjQUFjO0lBY3pCLFlBQ1UsUUFBeUIsRUFDekIsUUFBeUIsRUFDekIsaUJBQW9DLEVBQ3BDLGtCQUFzQztRQUh0QyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFqQi9CLFlBQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDNUQsSUFBSSxDQUFDLGlCQUFpQixDQUN2QixDQUFDO1FBQ2UsWUFBTyxH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TSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXRFLDRFQUE0RTtZQUM1RSx1REFBdUQ7WUFDdkQsdURBQXVEO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUU1RSxxQkFBcUI7WUFDckIsd0NBQXdDO1lBQ3hDLHNEQUFzRDtZQUN0RCxnREFBZ0Q7WUFFaEQsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtnQkFDakMsU0FBUztnQkFDVCxZQUFZO2FBQ2IsQ0FBQyxDQUFDO1lBRUgsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUN4QixPQUFPLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDN0Q7WUFFRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDckIsQ0FBQztLQUFBOzs7O1lBMUhGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBakZRLGVBQWU7WUFIZixlQUFlO1lBRGYsaUJBQWlCO1lBR2pCLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGdxbCBmcm9tICdncmFwaHFsLXRhZyc7XHJcbmltcG9ydCB7IEpXSyB9IGZyb20gJ25vZGUtam9zZSc7XHJcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2VuY3J5cHRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEtleUdyYXBoU2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXktZ3JhcGguc2VydmljZSc7XHJcbmltcG9ydCB7IEtleUdyYXBoRnJhZ21lbnQgfSBmcm9tICcuLi9fY29tbW9uL3F1ZXJpZXMuZ3FsJztcclxuaW1wb3J0IHsgS2V5RXhjaGFuZ2VTZXJ2aWNlIH0gZnJvbSAnLi9rZXktZXhjaGFuZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IExyQXBvbGxvU2VydmljZSB9IGZyb20gJy4vbHItYXBvbGxvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBLZXlGYWN0b3J5U2VydmljZSBhcyBLRlMgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkva2V5LWZhY3Rvcnkuc2VydmljZSc7XHJcblxyXG5leHBvcnQgY29uc3QgU2VuZE1lc3NhZ2VNdXRhdGlvbiA9IGdxbGBcclxuICBtdXRhdGlvbiBTZW5kTWVzc2FnZSgkaW5wdXQ6IFNlbmRNZXNzYWdlSW5wdXQhKSB7XHJcbiAgICBzZW5kTWVzc2FnZShpbnB1dDogJGlucHV0KSB7XHJcbiAgICAgIG1lc3NhZ2Uge1xyXG4gICAgICAgIGlkXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgTWVzc2FnZVF1ZXJ5ID0gZ3FsYFxyXG4gIHF1ZXJ5IE1lc3NhZ2UoJGlkOiBMclJlbGF5SWRJbnB1dCEpIHtcclxuICAgIG1lc3NhZ2UoaWQ6ICRpZCkge1xyXG4gICAgICBpZFxyXG4gICAgICBzZW5kZXIge1xyXG4gICAgICAgIHVzZXJuYW1lXHJcbiAgICAgIH1cclxuICAgICAgcmVjZWl2ZXIge1xyXG4gICAgICAgIHVzZXJuYW1lXHJcbiAgICAgIH1cclxuICAgICAgcGxhaW5NZXNzYWdlXHJcbiAgICAgIHNpZ25lZENpcGhlck1lc3NhZ2VcclxuICAgICAgc2hhcmVkS2V5IHtcclxuICAgICAgICBpZFxyXG4gICAgICB9XHJcbiAgICAgIHNlbmRlclNpZ1BiayB7XHJcbiAgICAgICAgaWRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAga2V5R3JhcGgge1xyXG4gICAgICAuLi5LZXlHcmFwaEZyYWdtZW50XHJcbiAgICB9XHJcbiAgfVxyXG4gICR7S2V5R3JhcGhGcmFnbWVudH1cclxuYDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VuZE1lc3NhZ2Uge1xyXG4gIG1lc3NhZ2U6IHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZW5kTWVzc2FnZUlucHV0IHtcclxuICB1c2VybmFtZT86IHN0cmluZztcclxuICB1c2VySWQ/OiBzdHJpbmc7XHJcbiAgcGxhaW5NZXNzYWdlSnNvbj86IGFueTtcclxuICBwbGFpbkNpcGhlck1lc3NhZ2VKc29uPzogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgc2VuZGVyOiB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgdXNlcm5hbWU6IHN0cmluZztcclxuICB9O1xyXG4gIHJlY2VpdmVyOiB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgdXNlcm5hbWU6IHN0cmluZztcclxuICB9O1xyXG4gIHBsYWluTWVzc2FnZTogc3RyaW5nO1xyXG4gIHBsYWluTWVzc2FnZUpzb24/OiBhbnk7XHJcbiAgc2lnbmVkQ2lwaGVyTWVzc2FnZTogc3RyaW5nO1xyXG4gIHBsYWluU2lnbmVkQ2lwaGVyTWVzc2FnZUpzb24/OiBhbnk7XHJcbiAgc2VuZGVyU2lnUGJrOiB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gIH07XHJcbiAgc2hhcmVkS2V5OiB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gIH07XHJcbn1cclxuXHJcbmludGVyZmFjZSBEZWNyeXB0TWVzc2FnZU9wdGlvbnMge1xyXG4gIHNoYXJlZEtleTogSldLLktleTtcclxuICBzZW5kZXJTaWdQYms6IEpXSy5LZXk7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZXNzYWdlU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbmNyeXB0ID0gdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0LmJpbmQoXHJcbiAgICB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlXHJcbiAgKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlY3J5cHQgPSB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQuYmluZChcclxuICAgIHRoaXMuZW5jcnlwdGlvblNlcnZpY2VcclxuICApO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbiA9IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbi5iaW5kKFxyXG4gICAgdGhpcy5lbmNyeXB0aW9uU2VydmljZVxyXG4gICk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJpZnkgPSB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnZlcmlmeS5iaW5kKFxyXG4gICAgdGhpcy5lbmNyeXB0aW9uU2VydmljZVxyXG4gICk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBsckFwb2xsbzogTHJBcG9sbG9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBrZXlHcmFwaDogS2V5R3JhcGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBlbmNyeXB0aW9uU2VydmljZTogRW5jcnlwdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGtleUV4Y2hhbmdlU2VydmljZTogS2V5RXhjaGFuZ2VTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBhc3luYyBzZW5kTWVzc2FnZSh7XHJcbiAgICB1c2VybmFtZSxcclxuICAgIHVzZXJJZCxcclxuICAgIHBsYWluTWVzc2FnZUpzb24sXHJcbiAgICBwbGFpbkNpcGhlck1lc3NhZ2VKc29uLFxyXG4gIH06IFNlbmRNZXNzYWdlSW5wdXQpOiBQcm9taXNlPFNlbmRNZXNzYWdlPiB7XHJcbiAgICBjb25zdCB1c2VyU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlFeGNoYW5nZVNlcnZpY2UuY3VycmVudFVzZXJTaGFyZWRLZXkoe1xyXG4gICAgICB1c2VybmFtZSxcclxuICAgICAgdXNlcklkLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaW5wdXQ6IGFueSA9IHtcclxuICAgICAgcmVjZWl2ZXJVc2VybmFtZTogdXNlcm5hbWUsXHJcbiAgICAgIHJlY2VpdmVySWQ6IHVzZXJJZCxcclxuICAgICAgc2hhcmVkS2V5SWQ6IHVzZXJTaGFyZWRLZXkuc2hhcmVkS2V5LmlkLFxyXG4gICAgICBzZW5kZXJTaWdQYmtJZDogdXNlclNoYXJlZEtleS51c2VyU2lnUHJrLmlkLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAocGxhaW5DaXBoZXJNZXNzYWdlSnNvbikge1xyXG4gICAgICBjb25zdCBzaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShcclxuICAgICAgICB1c2VyU2hhcmVkS2V5LnNoYXJlZEtleS5pZFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBjaXBoZXJNZXNzYWdlID0gYXdhaXQgdGhpcy5lbmNyeXB0KFxyXG4gICAgICAgIHNoYXJlZEtleSxcclxuICAgICAgICBwbGFpbkNpcGhlck1lc3NhZ2VKc29uXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjb25zdCBzZW5kZXJTaWdQcmsgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShcclxuICAgICAgICB1c2VyU2hhcmVkS2V5LnVzZXJTaWdQcmsuaWRcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgc2lnbmVkQ2lwaGVyTWVzc2FnZSA9IGF3YWl0IHRoaXMuc2lnbihzZW5kZXJTaWdQcmssIGNpcGhlck1lc3NhZ2UpO1xyXG5cclxuICAgICAgaW5wdXQuc2lnbmVkQ2lwaGVyTWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KHNpZ25lZENpcGhlck1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwbGFpbk1lc3NhZ2VKc29uKSB7XHJcbiAgICAgIGlucHV0LnBsYWluTWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KHBsYWluTWVzc2FnZUpzb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubHJBcG9sbG8ucXVlcnk8YW55Pih7XHJcbiAgICAgIHF1ZXJ5OiBTZW5kTWVzc2FnZU11dGF0aW9uLFxyXG4gICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICBpbnB1dCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXMuc2VuZE1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWNyeXB0TWVzc2FnZShcclxuICAgIG1lc3NhZ2U6IE1lc3NhZ2UsXHJcbiAgICB7IHNoYXJlZEtleSwgc2VuZGVyU2lnUGJrIH06IERlY3J5cHRNZXNzYWdlT3B0aW9uc1xyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2lnbmVkQ2lwaGVyTWVzc2FnZSA9IGF3YWl0IHRoaXMudmVyaWZ5KFxyXG4gICAgICBzZW5kZXJTaWdQYmssXHJcbiAgICAgIEpTT04ucGFyc2UobWVzc2FnZS5zaWduZWRDaXBoZXJNZXNzYWdlKVxyXG4gICAgKTtcclxuXHJcbiAgICBtZXNzYWdlLnBsYWluU2lnbmVkQ2lwaGVyTWVzc2FnZUpzb24gPSBhd2FpdCB0aGlzLmRlY3J5cHQoXHJcbiAgICAgIHNoYXJlZEtleSxcclxuICAgICAgc2lnbmVkQ2lwaGVyTWVzc2FnZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldE1lc3NhZ2UoaWQ6IHN0cmluZyk6IFByb21pc2U8TWVzc2FnZT4ge1xyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sckFwb2xsby5xdWVyeTxhbnk+KHtcclxuICAgICAgcXVlcnk6IE1lc3NhZ2VRdWVyeSxcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgaWQsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmtleUdyYXBoLmFkZEtleXMocmVzLmtleUdyYXBoKTtcclxuXHJcbiAgICBjb25zdCBtZXNzYWdlID0gcmVzLm1lc3NhZ2UgYXMgTWVzc2FnZTtcclxuXHJcbiAgICBjb25zdCBzaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShtZXNzYWdlLnNoYXJlZEtleS5pZCk7XHJcblxyXG4gICAgLy8gVGhlIHNlbmRlciB3b3VsZCBiZSBnZXR0aW5nIHRoZSBQcmsgYmFjay4gVGhlIHJlY2VpdmVyIGdldHMgdGhlIFBiayBiYWNrLlxyXG4gICAgLy8gQnV0IG9ubHkgdGhlIFBiayBpcyBuZWVkZWQgaGVyZSB0byB2ZXJpZnkgc2lnbmF0dXJlLlxyXG4gICAgLy8gU28gYm90aCBzZW5kZXIgYW5kIHJlY2VpdmVyIGNhbiBhY2Nlc3MgdGhpcyBtZXNzYWdlLlxyXG4gICAgY29uc3Qgc2VuZGVyU2lnUGJrID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRKd2tLZXkobWVzc2FnZS5zZW5kZXJTaWdQYmsuaWQpO1xyXG5cclxuICAgIC8vIFRlc3QgYmFkIHNpZ25hdHVyZVxyXG4gICAgLy8gc2VuZGVyU2lnUGJrID0gc2VuZGVyU2lnUGJrLnRvSlNPTigpO1xyXG4gICAgLy8gc2VuZGVyU2lnUGJrLm4gPSBcInhcIiArIHNlbmRlclNpZ1Biay5uLnN1YnN0cmluZygxKTtcclxuICAgIC8vIHNlbmRlclNpZ1BiayA9IGF3YWl0IEtGUy5hc0tleShzZW5kZXJTaWdQYmspO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuZGVjcnlwdE1lc3NhZ2UobWVzc2FnZSwge1xyXG4gICAgICBzaGFyZWRLZXksXHJcbiAgICAgIHNlbmRlclNpZ1BiayxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChtZXNzYWdlLnBsYWluTWVzc2FnZSkge1xyXG4gICAgICBtZXNzYWdlLnBsYWluTWVzc2FnZUpzb24gPSBKU09OLnBhcnNlKG1lc3NhZ2UucGxhaW5NZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzLm1lc3NhZ2U7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|