@lifeready/core 1.0.1 → 1.0.2
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 +15939 -0
- package/bundles/lifeready-core.umd.js.map +1 -0
- package/bundles/lifeready-core.umd.min.js +16 -0
- package/bundles/lifeready-core.umd.min.js.map +1 -0
- package/esm2015/lib/_common/ast.js +40 -0
- package/esm2015/lib/_common/deferred-promise.js +24 -0
- package/esm2015/lib/_common/exceptions.js +157 -0
- package/esm2015/lib/_common/queries.gql.js +190 -0
- package/esm2015/lib/_common/run-outside-angular.js +79 -0
- package/esm2015/lib/_common/types.js +1 -0
- package/esm2015/lib/_common/utils.js +44 -0
- package/esm2015/lib/api/contact-card.gql.js +79 -0
- package/esm2015/lib/api/contact-card.service.js +154 -0
- package/esm2015/lib/api/contact-card2.gql.js +60 -0
- package/esm2015/lib/api/contact-card2.service.js +103 -0
- package/esm2015/lib/api/file.service.js +74 -0
- package/esm2015/lib/api/item2.gql.js +110 -0
- package/esm2015/lib/api/item2.service.js +311 -0
- package/esm2015/lib/api/key-exchange.gql.js +188 -0
- package/esm2015/lib/api/key-exchange.service.js +442 -0
- package/esm2015/lib/api/key-exchange.types.js +18 -0
- package/esm2015/lib/api/key-exchange2.gql.js +171 -0
- package/esm2015/lib/api/key-exchange2.service.js +479 -0
- package/esm2015/lib/api/lock.gql.js +40 -0
- package/esm2015/lib/api/lock.service.js +64 -0
- package/esm2015/lib/api/lr-apollo.service.js +46 -0
- package/esm2015/lib/api/lr-graphql/index.js +6 -0
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -0
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -0
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -0
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -0
- package/esm2015/lib/api/lr-graphql/lr.service.js +18 -0
- package/esm2015/lib/api/message.service.js +138 -0
- package/esm2015/lib/api/persist.service.js +181 -0
- package/esm2015/lib/api/query-processor/common-processors.service.js +93 -0
- package/esm2015/lib/api/query-processor/index.js +3 -0
- package/esm2015/lib/api/query-processor/query-processor.service.js +192 -0
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -0
- package/esm2015/lib/api/shared-contact-card.service.js +119 -0
- package/esm2015/lib/api/shared-contact-card2.gql.js +41 -0
- package/esm2015/lib/api/shared-contact-card2.service.js +117 -0
- package/esm2015/lib/api/time.service.js +146 -0
- package/esm2015/lib/api/types/graphql.types.js +7 -0
- package/esm2015/lib/api/types/index.js +3 -0
- package/esm2015/lib/api/types/lr-graphql.types.js +71 -0
- package/esm2015/lib/auth/auth.config.js +57 -0
- package/esm2015/lib/auth/auth.gql.js +48 -0
- package/esm2015/lib/auth/auth.types.js +27 -0
- package/esm2015/lib/auth/idle.service.js +168 -0
- package/esm2015/lib/auth/idle.types.js +7 -0
- package/esm2015/lib/auth/lbop.service.js +355 -0
- package/esm2015/lib/auth/life-ready-auth.service.js +500 -0
- package/esm2015/lib/auth/password.service.js +320 -0
- package/esm2015/lib/auth/register.service.js +172 -0
- package/esm2015/lib/auth/two-factor.service.js +74 -0
- package/esm2015/lib/category/category-meta.service.js +99 -0
- package/esm2015/lib/category/category.gql.js +406 -0
- package/esm2015/lib/category/category.service.js +390 -0
- package/esm2015/lib/category/category.types.js +29 -0
- package/esm2015/lib/cryptography/cryptography.types.js +11 -0
- package/esm2015/lib/cryptography/encryption.service.js +189 -0
- package/esm2015/lib/cryptography/key-factory.service.js +237 -0
- package/esm2015/lib/cryptography/key-graph.service.js +280 -0
- package/esm2015/lib/cryptography/key-meta.service.js +200 -0
- package/esm2015/lib/cryptography/key.service.js +124 -0
- package/esm2015/lib/cryptography/slip39.service.js +169 -0
- package/esm2015/lib/cryptography/web-crypto.service.js +29 -0
- package/esm2015/lib/life-ready.config.js +84 -0
- package/esm2015/lib/life-ready.module.js +74 -0
- package/esm2015/lib/plan/plan.gql.js +123 -0
- package/esm2015/lib/plan/plan.service.js +149 -0
- package/esm2015/lib/plan/plan.types.js +11 -0
- package/esm2015/lib/record/record-attachment.service.js +101 -0
- package/esm2015/lib/record/record.gql.js +179 -0
- package/esm2015/lib/record/record.service.js +206 -0
- package/esm2015/lib/record/record.types.js +15 -0
- package/esm2015/lib/record-type/record-type.service.js +75 -0
- package/esm2015/lib/record-type/record-type.types.js +28 -0
- package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +105 -0
- package/esm2015/lib/scenario/approvals/scenario-approval.types.js +1 -0
- package/esm2015/lib/scenario/approvals/scenario-approver.service.js +300 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +52 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +97 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +1 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +150 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +229 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +1 -0
- package/esm2015/lib/scenario/scenario-setup.service.js +269 -0
- package/esm2015/lib/scenario/scenario.gql.js +368 -0
- package/esm2015/lib/scenario/scenario.service.js +611 -0
- package/esm2015/lib/scenario/scenario.types.js +64 -0
- package/esm2015/lib/search/search.gql.js +62 -0
- package/esm2015/lib/search/search.service.js +156 -0
- package/esm2015/lib/search/search.types.js +6 -0
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +112 -0
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +129 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +4 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +232 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +299 -0
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -0
- package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -0
- package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -0
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -0
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -0
- package/esm2015/lib/users/profile-details.service.js +214 -0
- package/esm2015/lib/users/profile.gql.js +97 -0
- package/esm2015/lib/users/profile.service.js +169 -0
- package/esm2015/lib/users/profile.types.js +34 -0
- package/esm2015/lib/users/user.gql.js +60 -0
- package/esm2015/lib/users/user.service.js +79 -0
- package/esm2015/lib/users/user.types.js +5 -0
- package/esm2015/lifeready-core.js +10 -0
- package/esm2015/public-api.js +81 -0
- package/fesm2015/lifeready-core.js +13314 -0
- package/fesm2015/lifeready-core.js.map +1 -0
- package/lib/_common/ast.d.ts +11 -0
- package/lib/_common/deferred-promise.d.ts +12 -0
- package/lib/_common/exceptions.d.ts +109 -0
- package/lib/_common/queries.gql.d.ts +10 -0
- package/lib/_common/run-outside-angular.d.ts +14 -0
- package/{src/lib/_common/types.ts → lib/_common/types.d.ts} +10 -13
- package/lib/_common/utils.d.ts +3 -0
- package/lib/api/contact-card.gql.d.ts +7 -0
- package/lib/api/contact-card.service.d.ts +52 -0
- package/lib/api/contact-card2.gql.d.ts +34 -0
- package/lib/api/contact-card2.service.d.ts +49 -0
- package/lib/api/file.service.d.ts +18 -0
- package/lib/api/item2.gql.d.ts +96 -0
- package/lib/api/item2.service.d.ts +177 -0
- package/lib/api/key-exchange.gql.d.ts +9 -0
- package/lib/api/key-exchange.service.d.ts +39 -0
- package/lib/api/key-exchange.types.d.ts +196 -0
- package/lib/api/key-exchange2.gql.d.ts +125 -0
- package/lib/api/key-exchange2.service.d.ts +187 -0
- package/lib/api/lock.gql.d.ts +27 -0
- package/lib/api/lock.service.d.ts +25 -0
- package/lib/api/lr-apollo.service.d.ts +15 -0
- package/{src/lib/api/lr-graphql/index.ts → lib/api/lr-graphql/index.d.ts} +5 -5
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -0
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +27 -0
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -0
- package/lib/api/lr-graphql/lr-mutation.d.ts +8 -0
- package/lib/api/lr-graphql/lr.service.d.ts +9 -0
- package/lib/api/message.service.d.ts +58 -0
- package/lib/api/persist.service.d.ts +31 -0
- package/lib/api/query-processor/common-processors.service.d.ts +36 -0
- package/{src/lib/api/query-processor/index.ts → lib/api/query-processor/index.d.ts} +2 -2
- package/lib/api/query-processor/query-processor.service.d.ts +18 -0
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -0
- package/lib/api/shared-contact-card.service.d.ts +33 -0
- package/lib/api/shared-contact-card2.gql.d.ts +36 -0
- package/lib/api/shared-contact-card2.service.d.ts +45 -0
- package/lib/api/time.service.d.ts +16 -0
- package/lib/api/types/graphql.types.d.ts +29 -0
- package/{src/lib/api/types/index.ts → lib/api/types/index.d.ts} +2 -2
- package/lib/api/types/lr-graphql.types.d.ts +385 -0
- package/lib/auth/auth.config.d.ts +5 -0
- package/lib/auth/auth.gql.d.ts +15 -0
- package/lib/auth/auth.types.d.ts +66 -0
- package/lib/auth/idle.service.d.ts +40 -0
- package/lib/auth/idle.types.d.ts +10 -0
- package/lib/auth/lbop.service.d.ts +91 -0
- package/lib/auth/life-ready-auth.service.d.ts +59 -0
- package/lib/auth/password.service.d.ts +78 -0
- package/lib/auth/register.service.d.ts +25 -0
- package/lib/auth/two-factor.service.d.ts +15 -0
- package/lib/category/category-meta.service.d.ts +23 -0
- package/lib/category/category.gql.d.ts +45 -0
- package/lib/category/category.service.d.ts +67 -0
- package/lib/category/category.types.d.ts +79 -0
- package/lib/cryptography/cryptography.types.d.ts +83 -0
- package/lib/cryptography/encryption.service.d.ts +41 -0
- package/lib/cryptography/key-factory.service.d.ts +38 -0
- package/lib/cryptography/key-graph.service.d.ts +33 -0
- package/lib/cryptography/key-meta.service.d.ts +44 -0
- package/lib/cryptography/key.service.d.ts +36 -0
- package/lib/cryptography/slip39.service.d.ts +43 -0
- package/lib/cryptography/web-crypto.service.d.ts +5 -0
- package/lib/life-ready.config.d.ts +14 -0
- package/lib/life-ready.module.d.ts +5 -0
- package/lib/plan/plan.gql.d.ts +11 -0
- package/lib/plan/plan.service.d.ts +33 -0
- package/lib/plan/plan.types.d.ts +31 -0
- package/lib/record/record-attachment.service.d.ts +16 -0
- package/lib/record/record.gql.d.ts +14 -0
- package/lib/record/record.service.d.ts +25 -0
- package/lib/record/record.types.d.ts +57 -0
- package/lib/record-type/record-type.service.d.ts +11 -0
- package/lib/record-type/record-type.types.d.ts +50 -0
- package/lib/scenario/approvals/scenario-approval.gql.d.ts +7 -0
- package/lib/scenario/approvals/scenario-approval.types.d.ts +63 -0
- package/lib/scenario/approvals/scenario-approver.service.d.ts +32 -0
- package/lib/scenario/claimants/scenario-claimant.gql.d.ts +5 -0
- package/lib/scenario/claimants/scenario-claimant.service.d.ts +17 -0
- package/lib/scenario/claimants/scenario-claimant.types.d.ts +18 -0
- package/lib/scenario/receivers/scenario-receiver.gql.d.ts +8 -0
- package/lib/scenario/receivers/scenario-receiver.service.d.ts +30 -0
- package/lib/scenario/receivers/scenario-receiver.types.d.ts +54 -0
- package/lib/scenario/scenario-setup.service.d.ts +22 -0
- package/lib/scenario/scenario.gql.d.ts +34 -0
- package/lib/scenario/scenario.service.d.ts +58 -0
- package/lib/scenario/scenario.types.d.ts +217 -0
- package/lib/search/search.gql.d.ts +1 -0
- package/lib/search/search.service.d.ts +25 -0
- package/lib/search/search.types.d.ts +20 -0
- package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -0
- package/lib/trusted-parties/tp-password-reset-user.service.d.ts +35 -0
- package/lib/trusted-parties/tp-password-reset.constants.d.ts +3 -0
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +218 -0
- package/lib/trusted-parties/tp-password-reset.service.d.ts +130 -0
- package/lib/trusted-parties/trusted-party.gql.d.ts +9 -0
- package/lib/trusted-parties/trusted-party.service.d.ts +44 -0
- package/lib/trusted-parties/trusted-party.types.d.ts +102 -0
- package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -0
- package/lib/trusted-parties/trusted-party2.service.d.ts +114 -0
- package/lib/users/profile-details.service.d.ts +21 -0
- package/lib/users/profile.gql.d.ts +11 -0
- package/lib/users/profile.service.d.ts +35 -0
- package/lib/users/profile.types.d.ts +96 -0
- package/lib/users/user.gql.d.ts +9 -0
- package/lib/users/user.service.d.ts +12 -0
- package/lib/users/user.types.d.ts +23 -0
- package/lifeready-core.d.ts +9 -0
- package/lifeready-core.metadata.json +1 -0
- package/package.json +29 -21
- package/{src/public-api.ts → public-api.d.ts} +77 -96
- package/karma.conf.js +0 -32
- package/ng-package.json +0 -26
- package/src/lib/_common/ast.ts +0 -75
- package/src/lib/_common/deferred-promise.ts +0 -35
- package/src/lib/_common/exceptions.ts +0 -189
- package/src/lib/_common/queries.gql.ts +0 -200
- package/src/lib/_common/run-outside-angular.ts +0 -125
- package/src/lib/_common/tests.ts +0 -82
- package/src/lib/_common/utils.ts +0 -57
- package/src/lib/api/api-mutation.spec.ts +0 -547
- package/src/lib/api/api-query.spec.ts +0 -40
- package/src/lib/api/contact-card.gql.ts +0 -85
- package/src/lib/api/contact-card.service.spec.ts +0 -249
- package/src/lib/api/contact-card.service.ts +0 -228
- package/src/lib/api/contact-card2.gql.ts +0 -93
- package/src/lib/api/contact-card2.service.spec.ts +0 -297
- package/src/lib/api/contact-card2.service.ts +0 -139
- package/src/lib/api/file.service.spec.ts +0 -14
- package/src/lib/api/file.service.ts +0 -81
- package/src/lib/api/item2.gql.ts +0 -211
- package/src/lib/api/item2.service.spec.ts +0 -1043
- package/src/lib/api/item2.service.ts +0 -481
- package/src/lib/api/key-exchange.gql.ts +0 -196
- package/src/lib/api/key-exchange.service.spec.ts +0 -470
- package/src/lib/api/key-exchange.service.ts +0 -731
- package/src/lib/api/key-exchange.types.ts +0 -235
- package/src/lib/api/key-exchange2.gql.ts +0 -310
- package/src/lib/api/key-exchange2.service.spec.ts +0 -892
- package/src/lib/api/key-exchange2.service.ts +0 -875
- package/src/lib/api/lock.gql.ts +0 -67
- package/src/lib/api/lock.service.spec.ts +0 -549
- package/src/lib/api/lock.service.ts +0 -57
- package/src/lib/api/lr-apollo.service.spec.ts +0 -27
- package/src/lib/api/lr-apollo.service.ts +0 -43
- package/src/lib/api/lr-graphql/lr-graphql.service.ts +0 -313
- package/src/lib/api/lr-graphql/lr-merged-mutation.ts +0 -377
- package/src/lib/api/lr-graphql/lr-mutation-base.ts +0 -67
- package/src/lib/api/lr-graphql/lr-mutation.ts +0 -74
- package/src/lib/api/lr-graphql/lr.service.ts +0 -28
- package/src/lib/api/message.service.spec.ts +0 -20
- package/src/lib/api/message.service.ts +0 -210
- package/src/lib/api/persist.service.spec.ts +0 -209
- package/src/lib/api/persist.service.ts +0 -220
- package/src/lib/api/query-processor/common-processors.service.ts +0 -148
- package/src/lib/api/query-processor/query-processor.service.ts +0 -240
- package/src/lib/api/query-processor/tp-password-reset-processor.service.ts +0 -177
- package/src/lib/api/shared-contact-card.service.ts +0 -156
- package/src/lib/api/shared-contact-card2.gql.ts +0 -76
- package/src/lib/api/shared-contact-card2.service.ts +0 -154
- package/src/lib/api/time.service.spec.ts +0 -48
- package/src/lib/api/time.service.ts +0 -155
- package/src/lib/api/types/graphql.types.ts +0 -48
- package/src/lib/api/types/lr-graphql.types.ts +0 -467
- package/src/lib/auth/auth.config.ts +0 -83
- package/src/lib/auth/auth.gql.ts +0 -62
- package/src/lib/auth/auth.types.ts +0 -79
- package/src/lib/auth/idle.service.spec.ts +0 -119
- package/src/lib/auth/idle.service.ts +0 -208
- package/src/lib/auth/idle.types.ts +0 -11
- package/src/lib/auth/lbop.service.spec.ts +0 -56
- package/src/lib/auth/lbop.service.ts +0 -539
- package/src/lib/auth/life-ready-auth.service.spec.ts +0 -70
- package/src/lib/auth/life-ready-auth.service.ts +0 -454
- package/src/lib/auth/password.service.spec.ts +0 -51
- package/src/lib/auth/password.service.ts +0 -438
- package/src/lib/auth/register.service.spec.ts +0 -31
- package/src/lib/auth/register.service.ts +0 -181
- package/src/lib/auth/two-factor.service.spec.ts +0 -21
- package/src/lib/auth/two-factor.service.ts +0 -69
- package/src/lib/category/category-meta.service.spec.ts +0 -28
- package/src/lib/category/category-meta.service.ts +0 -125
- package/src/lib/category/category.gql.ts +0 -449
- package/src/lib/category/category.service.spec.ts +0 -26
- package/src/lib/category/category.service.ts +0 -498
- package/src/lib/category/category.types.ts +0 -89
- package/src/lib/cryptography/cryptography.types.ts +0 -108
- package/src/lib/cryptography/encryption.service.spec.ts +0 -125
- package/src/lib/cryptography/encryption.service.ts +0 -243
- package/src/lib/cryptography/key-factory.service.spec.ts +0 -15
- package/src/lib/cryptography/key-factory.service.ts +0 -303
- package/src/lib/cryptography/key-graph.service.spec.ts +0 -16
- package/src/lib/cryptography/key-graph.service.ts +0 -354
- package/src/lib/cryptography/key-meta.service.spec.ts +0 -40
- package/src/lib/cryptography/key-meta.service.ts +0 -254
- package/src/lib/cryptography/key.service.spec.ts +0 -16
- package/src/lib/cryptography/key.service.ts +0 -154
- package/src/lib/cryptography/slip39.service.spec.ts +0 -44
- package/src/lib/cryptography/slip39.service.ts +0 -204
- package/src/lib/cryptography/web-crypto.service.ts +0 -22
- package/src/lib/life-ready.config.ts +0 -127
- package/src/lib/life-ready.module.ts +0 -81
- package/src/lib/plan/plan.gql.ts +0 -133
- package/src/lib/plan/plan.service.spec.ts +0 -294
- package/src/lib/plan/plan.service.ts +0 -198
- package/src/lib/plan/plan.types.ts +0 -37
- package/src/lib/record/record-attachment.service.spec.ts +0 -31
- package/src/lib/record/record-attachment.service.ts +0 -101
- package/src/lib/record/record.gql.ts +0 -192
- package/src/lib/record/record.service.spec.ts +0 -598
- package/src/lib/record/record.service.ts +0 -236
- package/src/lib/record/record.types.ts +0 -86
- package/src/lib/record-type/record-type.service.spec.ts +0 -16
- package/src/lib/record-type/record-type.service.ts +0 -71
- package/src/lib/record-type/record-type.types.ts +0 -58
- package/src/lib/scenario/approvals/scenario-approval.gql.ts +0 -112
- package/src/lib/scenario/approvals/scenario-approval.types.ts +0 -85
- package/src/lib/scenario/approvals/scenario-approver.service.spec.ts +0 -16
- package/src/lib/scenario/approvals/scenario-approver.service.ts +0 -422
- package/src/lib/scenario/claimants/scenario-claimant.gql.ts +0 -56
- package/src/lib/scenario/claimants/scenario-claimant.service.spec.ts +0 -16
- package/src/lib/scenario/claimants/scenario-claimant.service.ts +0 -100
- package/src/lib/scenario/claimants/scenario-claimant.types.ts +0 -21
- package/src/lib/scenario/receivers/scenario-receiver.gql.ts +0 -157
- package/src/lib/scenario/receivers/scenario-receiver.service.spec.ts +0 -16
- package/src/lib/scenario/receivers/scenario-receiver.service.ts +0 -278
- package/src/lib/scenario/receivers/scenario-receiver.types.ts +0 -66
- package/src/lib/scenario/scenario-setup.service.spec.ts +0 -22
- package/src/lib/scenario/scenario-setup.service.ts +0 -369
- package/src/lib/scenario/scenario.gql.ts +0 -404
- package/src/lib/scenario/scenario.service.spec.ts +0 -1586
- package/src/lib/scenario/scenario.service.ts +0 -811
- package/src/lib/scenario/scenario.types.ts +0 -258
- package/src/lib/search/search.gql.ts +0 -62
- package/src/lib/search/search.service.spec.ts +0 -57
- package/src/lib/search/search.service.ts +0 -174
- package/src/lib/search/search.types.ts +0 -24
- package/src/lib/trusted-parties/tp-password-reset-request.service.ts +0 -140
- package/src/lib/trusted-parties/tp-password-reset-user.service.ts +0 -359
- package/src/lib/trusted-parties/tp-password-reset.gql.ts +0 -453
- package/src/lib/trusted-parties/tp-password-reset.service.spec.ts +0 -602
- package/src/lib/trusted-parties/tp-password-reset.service.ts +0 -482
- package/src/lib/trusted-parties/trusted-party.gql.ts +0 -159
- package/src/lib/trusted-parties/trusted-party.service.spec.ts +0 -1008
- package/src/lib/trusted-parties/trusted-party.service.ts +0 -394
- package/src/lib/trusted-parties/trusted-party.types.ts +0 -119
- package/src/lib/trusted-parties/trusted-party2.gql.ts +0 -165
- package/src/lib/trusted-parties/trusted-party2.service.spec.ts +0 -1782
- package/src/lib/trusted-parties/trusted-party2.service.ts +0 -272
- package/src/lib/users/profile-details.service.spec.ts +0 -45
- package/src/lib/users/profile-details.service.ts +0 -278
- package/src/lib/users/profile.gql.ts +0 -108
- package/src/lib/users/profile.service.spec.ts +0 -97
- package/src/lib/users/profile.service.ts +0 -224
- package/src/lib/users/profile.types.ts +0 -101
- package/src/lib/users/user.gql.ts +0 -69
- package/src/lib/users/user.service.spec.ts +0 -161
- package/src/lib/users/user.service.ts +0 -72
- package/src/lib/users/user.types.ts +0 -27
- package/src/test.ts +0 -21
- package/tsconfig.lib.json +0 -21
- package/tsconfig.lib.prod.json +0 -6
- package/tsconfig.spec.json +0 -10
- package/tslint.json +0 -17
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { Key, PassKey } from './cryptography.types';
|
|
3
|
-
import { LrNotFoundException } from '../_common/exceptions';
|
|
4
|
-
import { PersistService } from '../api/persist.service';
|
|
5
|
-
import { KeyFactoryService as KFS } from './key-factory.service';
|
|
6
|
-
import { LifeReadyConfig, LR_CONFIG } from '../life-ready.config';
|
|
7
|
-
|
|
8
|
-
export class UserKeys {
|
|
9
|
-
passKey: PassKey;
|
|
10
|
-
masterKey: Key;
|
|
11
|
-
rootKey?: Key;
|
|
12
|
-
pxk?: Key;
|
|
13
|
-
sigPxk?: Key;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
interface StoredPassKey {
|
|
17
|
-
id: string;
|
|
18
|
-
jwk: object;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
@Injectable({
|
|
22
|
-
providedIn: 'root',
|
|
23
|
-
})
|
|
24
|
-
export class KeyService {
|
|
25
|
-
private readonly STORE_MASTER_KEY = 'masterKey';
|
|
26
|
-
// variables
|
|
27
|
-
private keys: UserKeys;
|
|
28
|
-
private masterKey: Key;
|
|
29
|
-
|
|
30
|
-
// AZ: This can't be change easily. It's basically a PassK or PassIdp rotation.
|
|
31
|
-
// todo: we should eventually increase this periodically to match with Moore's law.
|
|
32
|
-
// The iterations for each key are kept by the server as well but we assume the value
|
|
33
|
-
// from the server is not trustworthy, so need to have minimum thresholds here.
|
|
34
|
-
// If creating new keys, these minimum are used.
|
|
35
|
-
public readonly MIN_PASS_IDP_PBKDF_ITER = 100000;
|
|
36
|
-
public readonly MIN_PASS_KEY_PBKDF_ITER = 100000;
|
|
37
|
-
public readonly MIN_LBOP_KEY_PBKDF_ITER = 100000;
|
|
38
|
-
|
|
39
|
-
// These are used as the default values. They must be larger than the minimum values.
|
|
40
|
-
public readonly DEFAULT_PASS_IDP_PBKDF_ITER = this.MIN_PASS_IDP_PBKDF_ITER;
|
|
41
|
-
public readonly DEFAULT_PASS_KEY_PBKDF_ITER = this.MIN_PASS_KEY_PBKDF_ITER;
|
|
42
|
-
public readonly DEFAULT_LBOP_KEY_PBKDF_ITER = this.MIN_LBOP_KEY_PBKDF_ITER;
|
|
43
|
-
|
|
44
|
-
constructor(
|
|
45
|
-
@Inject(LR_CONFIG) private config: LifeReadyConfig,
|
|
46
|
-
private persistService: PersistService
|
|
47
|
-
) {
|
|
48
|
-
this.resetKeys();
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
resetKeys() {
|
|
52
|
-
this.keys = null;
|
|
53
|
-
this.masterKey = null;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
purgeKeys() {
|
|
57
|
-
this.resetKeys();
|
|
58
|
-
this.persistService.clear();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
populateKeys(keys: UserKeys) {
|
|
62
|
-
this.keys = keys;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
public getCurrentPassKey(): Key {
|
|
66
|
-
return this.keys.passKey;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
public getCurrentMasterKey(): Key {
|
|
70
|
-
return this.keys.masterKey;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
public getCurrentRootKey(): Key {
|
|
74
|
-
return this.keys.rootKey;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
public getCurrentPxk(): Key {
|
|
78
|
-
return this.keys.pxk;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
public getCurrentSigPxk(): Key {
|
|
82
|
-
return this.keys.sigPxk;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
private expiresAfter(seconds: number): Date {
|
|
86
|
-
return new Date(Date.now() + 1000 * seconds);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async persistMasterKey(
|
|
90
|
-
masterKey: Key,
|
|
91
|
-
expiresAfterSeconds: number
|
|
92
|
-
): Promise<void> {
|
|
93
|
-
const storedKey = {
|
|
94
|
-
id: masterKey.id,
|
|
95
|
-
jwk: masterKey.jwk.toJSON(true),
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
this.masterKey = masterKey;
|
|
99
|
-
|
|
100
|
-
// Save in an expirable cookie.
|
|
101
|
-
await this.persistService.set({
|
|
102
|
-
name: this.STORE_MASTER_KEY,
|
|
103
|
-
value: storedKey,
|
|
104
|
-
expiry: this.expiresAfter(expiresAfterSeconds),
|
|
105
|
-
serverSession: !this.config.disableSessionEncryptionKey,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
async setMasterKeyExpiresAfterSeconds(seconds: number): Promise<void> {
|
|
110
|
-
const storedKey = await this.persistService.get(this.STORE_MASTER_KEY);
|
|
111
|
-
if (storedKey == null) {
|
|
112
|
-
throw new LrNotFoundException(
|
|
113
|
-
`Can not find masterKey in persisted storage using name: ${this.STORE_MASTER_KEY}`
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
await this.persistService.set({
|
|
117
|
-
name: this.STORE_MASTER_KEY,
|
|
118
|
-
value: storedKey,
|
|
119
|
-
expiry: this.expiresAfter(seconds),
|
|
120
|
-
serverSession: !this.config.disableSessionEncryptionKey,
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// There's little benefit in using WebCrypto's none-extractable keys because if there
|
|
125
|
-
// is an XSS attack, then the attacker has control over the js that downloads the keys. The
|
|
126
|
-
// attacker can modify the code to import the keys as extractable. So none-extractable keys
|
|
127
|
-
// are only useful if they are already persisted and the user cannot download any more keys,
|
|
128
|
-
// which is not feasible.
|
|
129
|
-
// So storing the PassKey in localstorage for now, at least till we know what the usage
|
|
130
|
-
// pattern is, i.e. how often do we need to use the RootK, MaterK, and PassK.
|
|
131
|
-
async loadMasterKey(masterKeyId: string): Promise<Key> {
|
|
132
|
-
if (!this.masterKey) {
|
|
133
|
-
const storedKey = await this.persistService.get(this.STORE_MASTER_KEY);
|
|
134
|
-
|
|
135
|
-
if (!storedKey) {
|
|
136
|
-
throw new LrNotFoundException(
|
|
137
|
-
'Could not find masterKey in persisted storage'
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (storedKey.id !== masterKeyId) {
|
|
142
|
-
throw new LrNotFoundException(
|
|
143
|
-
`masterKeyId ${storedKey.id} in persisted storage does not match the one requested ${masterKeyId}`
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
storedKey.jwk = await KFS.asKey(storedKey.jwk);
|
|
148
|
-
|
|
149
|
-
this.masterKey = storedKey;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return this.masterKey;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { TestBed } from '@angular/core/testing';
|
|
2
|
-
import { Slip39Service, Assembly, SubAssembly } from './slip39.service';
|
|
3
|
-
import { ScenarioApproverService } from '../scenario/approvals/scenario-approver.service';
|
|
4
|
-
import { lrConfigureTestingModule } from '../_common/tests';
|
|
5
|
-
|
|
6
|
-
describe('Slip32Service', () => {
|
|
7
|
-
let slip39Service: Slip39Service;
|
|
8
|
-
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
lrConfigureTestingModule();
|
|
11
|
-
slip39Service = TestBed.inject(Slip39Service);
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('should combine mnemonics', async () => {
|
|
15
|
-
const quorum = 2;
|
|
16
|
-
const slipAssembly = new Assembly(quorum);
|
|
17
|
-
|
|
18
|
-
slipAssembly.addSubAssembly(new SubAssembly(0, 2, 3));
|
|
19
|
-
slipAssembly.addSubAssembly(new SubAssembly(1, 2, 2));
|
|
20
|
-
slipAssembly.addSubAssembly(new SubAssembly(2, 3, 5));
|
|
21
|
-
|
|
22
|
-
const secret = '123456abcdefg';
|
|
23
|
-
await slip39Service.generateShares(
|
|
24
|
-
secret,
|
|
25
|
-
ScenarioApproverService.SLIP39_PASSPHRASE,
|
|
26
|
-
slipAssembly
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
const mnemonics = [];
|
|
30
|
-
|
|
31
|
-
slipAssembly.subAssemblies.forEach((sa) => {
|
|
32
|
-
sa.shares.forEach((share) => mnemonics.push(share.mnemonics));
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
expect(mnemonics.length).toBe(10);
|
|
36
|
-
|
|
37
|
-
// The recoverSecret() should
|
|
38
|
-
const recovered = await slip39Service.recoverSecret(
|
|
39
|
-
mnemonics,
|
|
40
|
-
ScenarioApproverService.SLIP39_PASSPHRASE
|
|
41
|
-
);
|
|
42
|
-
expect(recovered).toEqual(secret);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { Slip39, Slip39Helper } from 'slip39';
|
|
3
|
-
|
|
4
|
-
export class SecretShare {
|
|
5
|
-
constructor(
|
|
6
|
-
public assembly: number = 0,
|
|
7
|
-
public subAssembly: number = 0,
|
|
8
|
-
public mnemonics: string = ''
|
|
9
|
-
) {}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export class SubAssembly {
|
|
13
|
-
constructor(
|
|
14
|
-
public index: number,
|
|
15
|
-
public threshold: number = 0,
|
|
16
|
-
public size: number = 0
|
|
17
|
-
) {
|
|
18
|
-
this.clearShares();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
shares: SecretShare[];
|
|
22
|
-
|
|
23
|
-
public clearShares() {
|
|
24
|
-
this.shares = Array();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public addShare(share: SecretShare) {
|
|
28
|
-
this.shares.push(share);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export class Assembly {
|
|
33
|
-
constructor(public threshold: number = 0) {
|
|
34
|
-
this.clearSubAssemblies();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
subAssemblies: SubAssembly[];
|
|
38
|
-
|
|
39
|
-
public size() {
|
|
40
|
-
return this.subAssemblies.length;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
public clearSubAssemblies() {
|
|
44
|
-
this.subAssemblies = new Array();
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
public addSubAssembly(subAssembly: SubAssembly) {
|
|
48
|
-
this.subAssemblies.push(subAssembly);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export class SubQuorum {
|
|
53
|
-
shares: string[];
|
|
54
|
-
|
|
55
|
-
constructor(public subAssemblyIndex: number) {
|
|
56
|
-
this.clearShares();
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
public clearShares() {
|
|
60
|
-
this.shares = new Array();
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
public addShare(share: string) {
|
|
64
|
-
this.shares.push(share);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export class Quorum {
|
|
69
|
-
subQuora: SubQuorum[];
|
|
70
|
-
|
|
71
|
-
constructor() {
|
|
72
|
-
this.clearSubQuora();
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
public clearSubQuora() {
|
|
76
|
-
this.subQuora = new Array();
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
public addSubQuorum(subQuorum: SubQuorum) {
|
|
80
|
-
this.subQuora.push(subQuorum);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
public serialiseShares() {
|
|
84
|
-
let shares = [];
|
|
85
|
-
|
|
86
|
-
this.subQuora.forEach((subQuorum) => {
|
|
87
|
-
shares = shares.concat(subQuorum.shares);
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
return shares;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
@Injectable({
|
|
95
|
-
providedIn: 'root',
|
|
96
|
-
})
|
|
97
|
-
export class Slip39Service {
|
|
98
|
-
constructor() {}
|
|
99
|
-
|
|
100
|
-
public async generateShares(secret, passphrase: string, assembly: Assembly) {
|
|
101
|
-
// Hex-encode secret.
|
|
102
|
-
let ems = btoa(secret);
|
|
103
|
-
ems = Slip39Helper.slip39EncodeHex(ems);
|
|
104
|
-
|
|
105
|
-
// Construct group specifications
|
|
106
|
-
const groups = [];
|
|
107
|
-
|
|
108
|
-
for (const sa of assembly.subAssemblies) {
|
|
109
|
-
groups.push([sa.threshold, sa.size]);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Split!
|
|
113
|
-
const slip = await Slip39.fromArray(ems, {
|
|
114
|
-
passphrase,
|
|
115
|
-
threshold: assembly.threshold,
|
|
116
|
-
groups,
|
|
117
|
-
title: '',
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
// Extract shares
|
|
121
|
-
assembly.subAssemblies.forEach((sa, isa) => {
|
|
122
|
-
// Remove any existing shares
|
|
123
|
-
sa.clearShares();
|
|
124
|
-
|
|
125
|
-
for (let im = 0; im < sa.size; im++) {
|
|
126
|
-
// Construct the path to the share, formatted as "r/<subassembly index>/<member index>"
|
|
127
|
-
// with <subassembly index> and <member index> being two-digit, zero-padded integers.
|
|
128
|
-
const path =
|
|
129
|
-
'r/' +
|
|
130
|
-
isa.toString().padStart(2, '0') +
|
|
131
|
-
'/' +
|
|
132
|
-
im.toString().padStart(2, '0');
|
|
133
|
-
const mnemonics = slip.fromPath(path).mnemonics[0];
|
|
134
|
-
const share = new SecretShare(isa, im, mnemonics);
|
|
135
|
-
|
|
136
|
-
sa.addShare(share);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Remove all redundant shares. i.e. keep only enough members and groups to satisfy the thresholds.
|
|
142
|
-
private minimalSet(mnemonics: string[]): string[] {
|
|
143
|
-
// Decode the mnemonics and sort then into groups.
|
|
144
|
-
let groupThresh = null;
|
|
145
|
-
const groups = new Map();
|
|
146
|
-
for (const mnemonic of mnemonics) {
|
|
147
|
-
const decoded = Slip39Helper.decodeMnemonic(mnemonic);
|
|
148
|
-
|
|
149
|
-
if (groupThresh && groupThresh !== decoded.groupThreshold) {
|
|
150
|
-
throw new Error('groupThreshold is different in mnemonics');
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
groupThresh = decoded.groupThreshold;
|
|
154
|
-
|
|
155
|
-
// Note that Slip39.recoverSecret() will do all the error checking again. So it's not critical
|
|
156
|
-
// that we error check here. So we just optimistically assume it's all good.
|
|
157
|
-
let g = groups.get(decoded.groupIndex);
|
|
158
|
-
if (g == null) {
|
|
159
|
-
g = {
|
|
160
|
-
memberThreshold: decoded.memberThreshold,
|
|
161
|
-
members: [],
|
|
162
|
-
};
|
|
163
|
-
groups.set(decoded.groupIndex, g);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
g.members.push({
|
|
167
|
-
mnemonic,
|
|
168
|
-
decoded,
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// Keep the minimum set of groups that meet threshold.
|
|
173
|
-
const mnemonicsMinSet = [];
|
|
174
|
-
let groupCount = 0;
|
|
175
|
-
for (const g of groups.values()) {
|
|
176
|
-
// Keep only groups that meet threshold
|
|
177
|
-
if (g.members.length < g.memberThreshold) {
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Keep minimum number of approvals needed for group
|
|
182
|
-
g.members.slice(0, g.memberThreshold).forEach((member) => {
|
|
183
|
-
mnemonicsMinSet.push(member.mnemonic);
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
++groupCount;
|
|
187
|
-
if (groupCount >= groupThresh) {
|
|
188
|
-
break;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
return mnemonicsMinSet;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
public async recoverSecret(shares: string[], passphrase: string) {
|
|
196
|
-
shares = this.minimalSet(shares);
|
|
197
|
-
|
|
198
|
-
const recovered = await Slip39.recoverSecret(shares, passphrase);
|
|
199
|
-
|
|
200
|
-
const secret = Slip39Helper.slip39DecodeHex(recovered);
|
|
201
|
-
|
|
202
|
-
return atob(secret);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
|
|
3
|
-
@Injectable({
|
|
4
|
-
providedIn: 'root',
|
|
5
|
-
})
|
|
6
|
-
export class WebCryptoService {
|
|
7
|
-
crypto: Crypto = window.crypto;
|
|
8
|
-
|
|
9
|
-
toHex(buffer: ArrayBuffer) {
|
|
10
|
-
// Ref: https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
|
|
11
|
-
const array = Array.from(new Uint8Array(buffer)); // convert buffer to byte array
|
|
12
|
-
const hex = array.map((b) => b.toString(16).padStart(2, '0')).join(''); // convert bytes to hex string
|
|
13
|
-
return hex;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
async stringDigest(algorithm: string, message: string): Promise<string> {
|
|
17
|
-
const encoder = new TextEncoder();
|
|
18
|
-
const data = encoder.encode(message);
|
|
19
|
-
const hash = await this.crypto.subtle.digest(algorithm, data);
|
|
20
|
-
return this.toHex(hash);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
-
import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
|
|
3
|
-
import {
|
|
4
|
-
ApolloClientOptions,
|
|
5
|
-
ApolloLink,
|
|
6
|
-
createHttpLink,
|
|
7
|
-
DefaultOptions,
|
|
8
|
-
from,
|
|
9
|
-
InMemoryCache,
|
|
10
|
-
} from '@apollo/client/core';
|
|
11
|
-
import { setContext } from '@apollo/client/link/context';
|
|
12
|
-
import { RetryLink } from '@apollo/client/link/retry';
|
|
13
|
-
import { LrApiErrorCode } from './_common/exceptions';
|
|
14
|
-
import { GraphQLError } from 'graphql';
|
|
15
|
-
|
|
16
|
-
export const LR_CONFIG = new InjectionToken<LifeReadyConfig>('LR.AUTH');
|
|
17
|
-
const RETRY_ERROR_CODES = [LrApiErrorCode.CONCURRENT_ACCESS];
|
|
18
|
-
|
|
19
|
-
export interface LifeReadyConfig {
|
|
20
|
-
authUrl: string;
|
|
21
|
-
apiUrl: string;
|
|
22
|
-
apolloUrl: string;
|
|
23
|
-
userPoolId: string;
|
|
24
|
-
userPoolWebClientId: string;
|
|
25
|
-
apolloConfig?: ApolloClientOptions<any>;
|
|
26
|
-
// Mainly to allow localhost to not needing this. Default to falsy
|
|
27
|
-
disableSessionEncryptionKey?: boolean;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export const configureApollo = (
|
|
31
|
-
config: LifeReadyConfig,
|
|
32
|
-
auth: AuthClass
|
|
33
|
-
): ApolloClientOptions<any> => {
|
|
34
|
-
const defaultOptions: DefaultOptions = {
|
|
35
|
-
watchQuery: {
|
|
36
|
-
fetchPolicy: 'no-cache',
|
|
37
|
-
errorPolicy: 'all',
|
|
38
|
-
},
|
|
39
|
-
query: {
|
|
40
|
-
fetchPolicy: 'no-cache',
|
|
41
|
-
errorPolicy: 'all',
|
|
42
|
-
},
|
|
43
|
-
mutate: {
|
|
44
|
-
errorPolicy: 'all',
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const authLink = setContext(async (_, { headers }) => {
|
|
49
|
-
let accessJwt = null;
|
|
50
|
-
try {
|
|
51
|
-
accessJwt = (await auth.currentSession()).getAccessToken();
|
|
52
|
-
} catch {
|
|
53
|
-
console.log('User not signed in');
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return {
|
|
57
|
-
headers: {
|
|
58
|
-
...headers,
|
|
59
|
-
authorization: accessJwt ? `Bearer ${accessJwt.jwtToken}` : '',
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// We are only retrying on certain errors, like the CONCURRENT_ACCESS gql
|
|
65
|
-
// error which indicates DB race condition. So can be safely retried.
|
|
66
|
-
const retryIf = (error, _) => {
|
|
67
|
-
// The RetryLink is called on network error as well, so we need to filter for GraphQL errors.
|
|
68
|
-
if (error instanceof GraphQLErrorException) {
|
|
69
|
-
if (
|
|
70
|
-
error.errors.some((e) => RETRY_ERROR_CODES.includes(e.extensions?.code))
|
|
71
|
-
) {
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return false;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
const retryLink = new RetryLink({
|
|
80
|
-
delay: {
|
|
81
|
-
initial: 300,
|
|
82
|
-
max: Infinity,
|
|
83
|
-
jitter: true,
|
|
84
|
-
},
|
|
85
|
-
attempts: {
|
|
86
|
-
max: 3,
|
|
87
|
-
retryIf,
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
class GraphQLErrorException extends Error {
|
|
92
|
-
constructor(public errors: readonly GraphQLError[]) {
|
|
93
|
-
super(errors.map((e) => e.message).join(', '));
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Throw exception on gql errors which effectively promotes it to a network
|
|
98
|
-
// error, which can then be handled by the RetryLink.
|
|
99
|
-
const promoteGqlErrors = new ApolloLink((operation, forward) => {
|
|
100
|
-
return forward(operation).map((data) => {
|
|
101
|
-
if (data && data.errors) {
|
|
102
|
-
const errors = data.errors.filter((e) =>
|
|
103
|
-
RETRY_ERROR_CODES.includes(e.extensions?.code)
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
if (errors.length > 0) {
|
|
107
|
-
throw new GraphQLErrorException(data.errors);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return data;
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
const httpLink = createHttpLink({
|
|
115
|
-
uri: config.apolloUrl,
|
|
116
|
-
// Sending the sessionid cookie so that the server can use session data when needed.
|
|
117
|
-
// eg. setting the session encryption key.
|
|
118
|
-
credentials: 'include',
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
return {
|
|
122
|
-
link: from([retryLink, promoteGqlErrors, authLink, httpLink]),
|
|
123
|
-
cache: new InMemoryCache(),
|
|
124
|
-
defaultOptions,
|
|
125
|
-
...config.apolloConfig,
|
|
126
|
-
};
|
|
127
|
-
};
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { HttpClientModule } from '@angular/common/http';
|
|
2
|
-
import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';
|
|
3
|
-
import Auth from '@aws-amplify/auth';
|
|
4
|
-
import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
|
|
5
|
-
import { APOLLO_OPTIONS } from 'apollo-angular';
|
|
6
|
-
import { CookieService } from 'ngx-cookie-service';
|
|
7
|
-
import { FileService } from './api/file.service';
|
|
8
|
-
import { ProfileService } from './users/profile.service';
|
|
9
|
-
import { configureAmplifyAuth } from './auth/auth.config';
|
|
10
|
-
import {
|
|
11
|
-
initialiseAuth,
|
|
12
|
-
LifeReadyAuthService,
|
|
13
|
-
} from './auth/life-ready-auth.service';
|
|
14
|
-
import { PasswordService } from './auth/password.service';
|
|
15
|
-
import { RegisterService } from './auth/register.service';
|
|
16
|
-
import { EncryptionService } from './cryptography/encryption.service';
|
|
17
|
-
import { KeyGraphService } from './cryptography/key-graph.service';
|
|
18
|
-
import { KeyService } from './cryptography/key.service';
|
|
19
|
-
import { KeyFactoryService } from './cryptography/key-factory.service';
|
|
20
|
-
import { WebCryptoService } from './cryptography/web-crypto.service';
|
|
21
|
-
import {
|
|
22
|
-
configureApollo,
|
|
23
|
-
LifeReadyConfig,
|
|
24
|
-
LR_CONFIG,
|
|
25
|
-
} from './life-ready.config';
|
|
26
|
-
import { TimeService } from './api/time.service';
|
|
27
|
-
import { NgIdleKeepaliveModule } from '@ng-idle/keepalive';
|
|
28
|
-
|
|
29
|
-
@NgModule({
|
|
30
|
-
imports: [HttpClientModule, NgIdleKeepaliveModule.forRoot()],
|
|
31
|
-
providers: [
|
|
32
|
-
CookieService,
|
|
33
|
-
TimeService,
|
|
34
|
-
FileService,
|
|
35
|
-
ProfileService,
|
|
36
|
-
RegisterService,
|
|
37
|
-
LifeReadyAuthService,
|
|
38
|
-
PasswordService,
|
|
39
|
-
WebCryptoService,
|
|
40
|
-
EncryptionService,
|
|
41
|
-
KeyGraphService,
|
|
42
|
-
KeyService,
|
|
43
|
-
KeyFactoryService,
|
|
44
|
-
],
|
|
45
|
-
})
|
|
46
|
-
export class LifeReadyModule {
|
|
47
|
-
public static forRoot(
|
|
48
|
-
config: LifeReadyConfig
|
|
49
|
-
): ModuleWithProviders<LifeReadyModule> {
|
|
50
|
-
return {
|
|
51
|
-
ngModule: LifeReadyModule,
|
|
52
|
-
providers: [
|
|
53
|
-
{
|
|
54
|
-
provide: LR_CONFIG,
|
|
55
|
-
useValue: config,
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
provide: AuthClass,
|
|
59
|
-
useValue: Auth,
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
provide: APP_INITIALIZER,
|
|
63
|
-
useFactory: configureAmplifyAuth,
|
|
64
|
-
deps: [LR_CONFIG, AuthClass],
|
|
65
|
-
multi: true,
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
provide: APP_INITIALIZER,
|
|
69
|
-
useFactory: initialiseAuth,
|
|
70
|
-
deps: [LifeReadyAuthService],
|
|
71
|
-
multi: true,
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
provide: APOLLO_OPTIONS,
|
|
75
|
-
useFactory: configureApollo,
|
|
76
|
-
deps: [LR_CONFIG, AuthClass],
|
|
77
|
-
},
|
|
78
|
-
],
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
}
|