@learncard/network-brain-service 3.19.0 → 4.0.0
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/.env.example +47 -82
- package/AGENTS.md +52 -0
- package/CHANGELOG.md +147 -0
- package/README.md +51 -2
- package/bootstrapLambda.test.ts +72 -0
- package/config/config.dev.json +29 -0
- package/config/config.example.json +29 -0
- package/config/config.json +1 -0
- package/config/config.production.json +29 -0
- package/config/config.scouts.dev.json +24 -0
- package/config/config.scouts.production.json +24 -0
- package/contractEventsLambda.ts +18 -0
- package/contractEventsLambdaApp.ts +19 -0
- package/didWebLambda.ts +13 -18
- package/didWebLambdaApp.ts +22 -0
- package/dist/accesslayer/app-manifest-version/create.d.ts +10 -0
- package/dist/accesslayer/app-manifest-version/create.d.ts.map +1 -0
- package/dist/accesslayer/app-manifest-version/read.d.ts +11 -0
- package/dist/accesslayer/app-manifest-version/read.d.ts.map +1 -0
- package/dist/accesslayer/app-manifest-version/update.d.ts +7 -0
- package/dist/accesslayer/app-manifest-version/update.d.ts.map +1 -0
- package/dist/accesslayer/app-store-listing/read.d.ts +2 -1
- package/dist/accesslayer/app-store-listing/read.d.ts.map +1 -1
- package/dist/accesslayer/app-store-listing/relationships/create.d.ts +1 -0
- package/dist/accesslayer/app-store-listing/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/app-store-listing/relationships/read.d.ts +2 -0
- package/dist/accesslayer/app-store-listing/relationships/read.d.ts.map +1 -1
- package/dist/accesslayer/app-store-listing/update.d.ts +1 -0
- package/dist/accesslayer/app-store-listing/update.d.ts.map +1 -1
- package/dist/accesslayer/boost/relationships/create.d.ts +2 -1
- package/dist/accesslayer/boost/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/create.d.ts +9 -1
- package/dist/accesslayer/consentflowcontract/create.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/read.d.ts +34 -3
- package/dist/accesslayer/consentflowcontract/read.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/relationships/create.d.ts +4 -1
- package/dist/accesslayer/consentflowcontract/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/relationships/delete.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/relationships/read.d.ts +3 -2
- package/dist/accesslayer/consentflowcontract/relationships/read.d.ts.map +1 -1
- package/dist/accesslayer/consentflowcontract/relationships/recipients.d.ts +12 -0
- package/dist/accesslayer/consentflowcontract/relationships/recipients.d.ts.map +1 -0
- package/dist/accesslayer/consentflowcontract/relationships/smartResume.d.ts +12 -0
- package/dist/accesslayer/consentflowcontract/relationships/smartResume.d.ts.map +1 -0
- package/dist/accesslayer/consentflowcontract/relationships/update.d.ts +8 -5
- package/dist/accesslayer/consentflowcontract/relationships/update.d.ts.map +1 -1
- package/dist/accesslayer/credential/create.d.ts +2 -1
- package/dist/accesslayer/credential/create.d.ts.map +1 -1
- package/dist/accesslayer/credential/relationships/create.d.ts +4 -3
- package/dist/accesslayer/credential/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/inbox-credential/relationships/create.d.ts +2 -1
- package/dist/accesslayer/inbox-credential/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/inbox-credential/update.d.ts +2 -1
- package/dist/accesslayer/inbox-credential/update.d.ts.map +1 -1
- package/dist/accesslayer/presentation/read.d.ts.map +1 -1
- package/dist/accesslayer/presentation/relationships/create.d.ts +2 -2
- package/dist/accesslayer/presentation/relationships/create.d.ts.map +1 -1
- package/dist/accesslayer/presentation/relationships/read.d.ts.map +1 -1
- package/dist/accesslayer/share-link/abandon.d.ts +3 -0
- package/dist/accesslayer/share-link/abandon.d.ts.map +1 -0
- package/dist/accesslayer/share-link/attachment.d.ts +37 -0
- package/dist/accesslayer/share-link/attachment.d.ts.map +1 -0
- package/dist/accesslayer/share-link/cleanup.d.ts +6 -0
- package/dist/accesslayer/share-link/cleanup.d.ts.map +1 -0
- package/dist/accesslayer/share-link/errors.d.ts +8 -0
- package/dist/accesslayer/share-link/errors.d.ts.map +1 -0
- package/dist/accesslayer/share-link/finalize.d.ts +3 -0
- package/dist/accesslayer/share-link/finalize.d.ts.map +1 -0
- package/dist/accesslayer/share-link/helpers.d.ts +59 -0
- package/dist/accesslayer/share-link/helpers.d.ts.map +1 -0
- package/dist/accesslayer/share-link/index.d.ts +12 -0
- package/dist/accesslayer/share-link/index.d.ts.map +1 -0
- package/dist/accesslayer/share-link/list.d.ts +5 -0
- package/dist/accesslayer/share-link/list.d.ts.map +1 -0
- package/dist/accesslayer/share-link/read.d.ts +5 -0
- package/dist/accesslayer/share-link/read.d.ts.map +1 -0
- package/dist/accesslayer/share-link/receipt.d.ts +11 -0
- package/dist/accesslayer/share-link/receipt.d.ts.map +1 -0
- package/dist/accesslayer/share-link/recovery.d.ts +6 -0
- package/dist/accesslayer/share-link/recovery.d.ts.map +1 -0
- package/dist/accesslayer/share-link/reserve.d.ts +4 -0
- package/dist/accesslayer/share-link/reserve.d.ts.map +1 -0
- package/dist/accesslayer/share-link/revoke.d.ts +3 -0
- package/dist/accesslayer/share-link/revoke.d.ts.map +1 -0
- package/dist/accesslayer/share-link/transaction-execution.d.ts +18 -0
- package/dist/accesslayer/share-link/transaction-execution.d.ts.map +1 -0
- package/dist/accesslayer/share-link/transaction.d.ts +15 -0
- package/dist/accesslayer/share-link/transaction.d.ts.map +1 -0
- package/dist/accesslayer/share-link/types.d.ts +375 -0
- package/dist/accesslayer/share-link/types.d.ts.map +1 -0
- package/dist/app.d.ts +4 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/cache/app-store.caches.d.ts +49 -0
- package/dist/cache/app-store.caches.d.ts.map +1 -1
- package/dist/config/applyDockerStageConfig.d.ts +2 -0
- package/dist/config/applyDockerStageConfig.d.ts.map +1 -0
- package/dist/config/environment.d.ts +14 -0
- package/dist/config/environment.d.ts.map +1 -1
- package/dist/config/serverlessFunctionEnv.test.d.ts +2 -0
- package/dist/config/serverlessFunctionEnv.test.d.ts.map +1 -0
- package/dist/config/stageConfig.d.ts +112 -0
- package/dist/config/stageConfig.d.ts.map +1 -0
- package/dist/config/stageConfig.test.d.ts +2 -0
- package/dist/config/stageConfig.test.d.ts.map +1 -0
- package/dist/constants/auth-grant.d.ts +2 -0
- package/dist/constants/auth-grant.d.ts.map +1 -1
- package/dist/didkit_wasm_bg.wasm +0 -0
- package/dist/docker-entry.d.ts +1 -1
- package/dist/docker-entry.d.ts.map +1 -1
- package/dist/helpers/app-manifest.helpers.d.ts +5 -0
- package/dist/helpers/app-manifest.helpers.d.ts.map +1 -0
- package/dist/helpers/boost.helpers.d.ts.map +1 -1
- package/dist/helpers/claim-hooks.helpers.d.ts +2 -1
- package/dist/helpers/claim-hooks.helpers.d.ts.map +1 -1
- package/dist/helpers/consent-referral.helpers.d.ts +2 -0
- package/dist/helpers/consent-referral.helpers.d.ts.map +1 -0
- package/dist/helpers/consent-scopes.helpers.d.ts +7 -0
- package/dist/helpers/consent-scopes.helpers.d.ts.map +1 -0
- package/dist/helpers/contract-event-maintenance.helpers.d.ts +3 -0
- package/dist/helpers/contract-event-maintenance.helpers.d.ts.map +1 -0
- package/dist/helpers/contract-events.helpers.d.ts +25 -0
- package/dist/helpers/contract-events.helpers.d.ts.map +1 -0
- package/dist/helpers/contract-requests.helpers.d.ts +19 -0
- package/dist/helpers/contract-requests.helpers.d.ts.map +1 -0
- package/dist/helpers/credentialSubject.helpers.d.ts +3 -0
- package/dist/helpers/credentialSubject.helpers.d.ts.map +1 -0
- package/dist/helpers/credentialSubject.helpers.test.d.ts +2 -0
- package/dist/helpers/credentialSubject.helpers.test.d.ts.map +1 -0
- package/dist/helpers/finalize-inbox.helpers.d.ts +3 -3
- package/dist/helpers/finalize-inbox.helpers.d.ts.map +1 -1
- package/dist/helpers/inbox.helpers.d.ts.map +1 -1
- package/dist/helpers/inline-template.helpers.d.ts +45 -0
- package/dist/helpers/inline-template.helpers.d.ts.map +1 -0
- package/dist/helpers/notificationMessages.d.ts +1 -1
- package/dist/helpers/notificationMessages.d.ts.map +1 -1
- package/dist/helpers/notificationQueue.helpers.d.ts.map +1 -1
- package/dist/helpers/notifications.helpers.d.ts +6 -0
- package/dist/helpers/notifications.helpers.d.ts.map +1 -1
- package/dist/helpers/presentation-metadata.d.ts +4 -0
- package/dist/helpers/presentation-metadata.d.ts.map +1 -0
- package/dist/helpers/presentation.helpers.d.ts +1 -1
- package/dist/helpers/presentation.helpers.d.ts.map +1 -1
- package/dist/helpers/profile.helpers.d.ts +2 -0
- package/dist/helpers/profile.helpers.d.ts.map +1 -1
- package/dist/helpers/share-content-client/adapters.d.ts +10 -0
- package/dist/helpers/share-content-client/adapters.d.ts.map +1 -0
- package/dist/helpers/share-content-client/canonical.d.ts +7 -0
- package/dist/helpers/share-content-client/canonical.d.ts.map +1 -0
- package/dist/helpers/share-content-client/client.d.ts +5 -0
- package/dist/helpers/share-content-client/client.d.ts.map +1 -0
- package/dist/helpers/share-content-client/config.d.ts +11 -0
- package/dist/helpers/share-content-client/config.d.ts.map +1 -0
- package/dist/helpers/share-content-client/index.d.ts +6 -0
- package/dist/helpers/share-content-client/index.d.ts.map +1 -0
- package/dist/helpers/share-content-client/responses.d.ts +16 -0
- package/dist/helpers/share-content-client/responses.d.ts.map +1 -0
- package/dist/helpers/share-content-client/types.d.ts +145 -0
- package/dist/helpers/share-content-client/types.d.ts.map +1 -0
- package/dist/helpers/share-link-attachment-access.d.ts +4 -0
- package/dist/helpers/share-link-attachment-access.d.ts.map +1 -0
- package/dist/helpers/share-link-attachment.d.ts +18 -0
- package/dist/helpers/share-link-attachment.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/attachment-stat.d.ts +5 -0
- package/dist/helpers/share-link-coordinator/attachment-stat.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/budget-helpers.d.ts +5 -0
- package/dist/helpers/share-link-coordinator/budget-helpers.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/cleanup-runner.d.ts +3 -0
- package/dist/helpers/share-link-coordinator/cleanup-runner.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/coordinator.d.ts +4 -0
- package/dist/helpers/share-link-coordinator/coordinator.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/index.d.ts +5 -0
- package/dist/helpers/share-link-coordinator/index.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/recovery-runner.d.ts +9 -0
- package/dist/helpers/share-link-coordinator/recovery-runner.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/runtime.d.ts +11 -0
- package/dist/helpers/share-link-coordinator/runtime.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/stat.d.ts +4 -0
- package/dist/helpers/share-link-coordinator/stat.d.ts.map +1 -0
- package/dist/helpers/share-link-coordinator/types.d.ts +160 -0
- package/dist/helpers/share-link-coordinator/types.d.ts.map +1 -0
- package/dist/helpers/share-link-lifecycle/index.d.ts +5 -0
- package/dist/helpers/share-link-lifecycle/index.d.ts.map +1 -0
- package/dist/helpers/share-link-lifecycle/lease.helpers.d.ts +4 -0
- package/dist/helpers/share-link-lifecycle/lease.helpers.d.ts.map +1 -0
- package/dist/helpers/share-link-lifecycle/recovery.helpers.d.ts +21 -0
- package/dist/helpers/share-link-lifecycle/recovery.helpers.d.ts.map +1 -0
- package/dist/helpers/share-link-lifecycle/request-hash.helpers.d.ts +9 -0
- package/dist/helpers/share-link-lifecycle/request-hash.helpers.d.ts.map +1 -0
- package/dist/helpers/share-link-lifecycle/types.d.ts +14 -0
- package/dist/helpers/share-link-lifecycle/types.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/budget.d.ts +12 -0
- package/dist/helpers/share-link-maintenance/budget.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/config.d.ts +48 -0
- package/dist/helpers/share-link-maintenance/config.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/index.d.ts +8 -0
- package/dist/helpers/share-link-maintenance/index.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/runner.d.ts +20 -0
- package/dist/helpers/share-link-maintenance/runner.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/runtime.d.ts +38 -0
- package/dist/helpers/share-link-maintenance/runtime.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/scheduler.d.ts +18 -0
- package/dist/helpers/share-link-maintenance/scheduler.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/telemetry.d.ts +5 -0
- package/dist/helpers/share-link-maintenance/telemetry.d.ts.map +1 -0
- package/dist/helpers/share-link-maintenance/types.d.ts +56 -0
- package/dist/helpers/share-link-maintenance/types.d.ts.map +1 -0
- package/dist/helpers/share-link-owner/config.d.ts +16 -0
- package/dist/helpers/share-link-owner/config.d.ts.map +1 -0
- package/dist/helpers/share-link-owner/diagnostics.d.ts +26 -0
- package/dist/helpers/share-link-owner/diagnostics.d.ts.map +1 -0
- package/dist/helpers/share-link-owner/lazy-initializer.d.ts +2 -0
- package/dist/helpers/share-link-owner/lazy-initializer.d.ts.map +1 -0
- package/dist/helpers/share-link-owner-projection.d.ts +4 -0
- package/dist/helpers/share-link-owner-projection.d.ts.map +1 -0
- package/dist/helpers/share-link-passcode-abuse.d.ts +2 -0
- package/dist/helpers/share-link-passcode-abuse.d.ts.map +1 -0
- package/dist/helpers/share-link-passcode.d.ts +6 -0
- package/dist/helpers/share-link-passcode.d.ts.map +1 -0
- package/dist/helpers/share-link-policy/index.d.ts +4 -0
- package/dist/helpers/share-link-policy/index.d.ts.map +1 -0
- package/dist/helpers/share-link-policy/production.d.ts +11 -0
- package/dist/helpers/share-link-policy/production.d.ts.map +1 -0
- package/dist/helpers/share-link-policy/resolver.d.ts +6 -0
- package/dist/helpers/share-link-policy/resolver.d.ts.map +1 -0
- package/dist/helpers/share-link-policy/types.d.ts +22 -0
- package/dist/helpers/share-link-policy/types.d.ts.map +1 -0
- package/dist/helpers/share-link-public/config.d.ts +13 -0
- package/dist/helpers/share-link-public/config.d.ts.map +1 -0
- package/dist/helpers/share-link-view-notification.d.ts +2 -0
- package/dist/helpers/share-link-view-notification.d.ts.map +1 -0
- package/dist/helpers/signingAuthority.helpers.d.ts.map +1 -1
- package/dist/helpers/smartResume.helpers.d.ts +3 -0
- package/dist/helpers/smartResume.helpers.d.ts.map +1 -0
- package/dist/index.js +2 -2
- package/dist/models/AppManifestVersion.d.ts +20 -0
- package/dist/models/AppManifestVersion.d.ts.map +1 -0
- package/dist/models/AppStoreListing.d.ts +13 -0
- package/dist/models/AppStoreListing.d.ts.map +1 -1
- package/dist/models/ConsentFlowContract.d.ts +13 -2
- package/dist/models/ConsentFlowContract.d.ts.map +1 -1
- package/dist/models/ConsentFlowTerms.d.ts.map +1 -1
- package/dist/models/ConsentFlowTransaction.d.ts.map +1 -1
- package/dist/models/Integration.d.ts +2 -0
- package/dist/models/Integration.d.ts.map +1 -1
- package/dist/models/Presentation.d.ts +2 -0
- package/dist/models/Presentation.d.ts.map +1 -1
- package/dist/models/Profile.d.ts +2 -0
- package/dist/models/Profile.d.ts.map +1 -1
- package/dist/models/ShareLink.d.ts +46 -0
- package/dist/models/ShareLink.d.ts.map +1 -0
- package/dist/models/ShareViewReceipt.d.ts +22 -0
- package/dist/models/ShareViewReceipt.d.ts.map +1 -0
- package/dist/models/index.d.ts +2 -0
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/share-link-constraints.d.ts +3 -0
- package/dist/models/share-link-constraints.d.ts.map +1 -0
- package/dist/openapi.d.ts +1 -1
- package/dist/openapi.d.ts.map +1 -1
- package/dist/public-share-link-http.d.ts +4 -0
- package/dist/public-share-link-http.d.ts.map +1 -0
- package/dist/routes/app-store.d.ts +619 -0
- package/dist/routes/app-store.d.ts.map +1 -1
- package/dist/routes/boosts.d.ts +2 -2
- package/dist/routes/boosts.d.ts.map +1 -1
- package/dist/routes/contracts.d.ts +148 -5
- package/dist/routes/contracts.d.ts.map +1 -1
- package/dist/routes/credentials.d.ts +35 -1
- package/dist/routes/credentials.d.ts.map +1 -1
- package/dist/routes/inbox.d.ts +52 -2
- package/dist/routes/inbox.d.ts.map +1 -1
- package/dist/routes/index.d.ts +153 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/presentations.d.ts +1 -0
- package/dist/routes/presentations.d.ts.map +1 -1
- package/dist/routes/profile-manager.d.ts.map +1 -1
- package/dist/routes/profiles.d.ts.map +1 -1
- package/dist/routes/public-share-links.d.ts +285 -0
- package/dist/routes/public-share-links.d.ts.map +1 -0
- package/dist/routes/share-links.d.ts +1005 -0
- package/dist/routes/share-links.d.ts.map +1 -0
- package/dist/routes/test.d.ts +5 -0
- package/dist/routes/test.d.ts.map +1 -1
- package/dist/routes/workflows.d.ts.map +1 -1
- package/dist/services/delivery/adapters/postmark.adapter.d.ts.map +1 -1
- package/dist/types/app-manifest.d.ts +339 -0
- package/dist/types/app-manifest.d.ts.map +1 -0
- package/dist/types/app-store-listing.d.ts +34 -0
- package/dist/types/app-store-listing.d.ts.map +1 -1
- package/dist/types/consentflowcontract.d.ts +31 -4
- package/dist/types/consentflowcontract.d.ts.map +1 -1
- package/dist/types/credential-refresh.d.ts +1 -1
- package/esbuildPlugins.cjs +1 -0
- package/lambda.ts +49 -192
- package/lambdaApp.ts +203 -0
- package/package.json +25 -17
- package/scripts/export-openapi.ts +20 -0
- package/scripts/offline-schema-environment.ts +18 -0
- package/scripts/seed-demo-persona.ts +425 -0
- package/scripts/verify-python-contracts.ts +72 -0
- package/serverless-local.yml +3 -6
- package/serverless.function-env.cjs +50 -0
- package/serverless.local.yml +0 -1
- package/serverless.yml +44 -55
- package/shareLinkMaintenanceLambda.ts +18 -0
- package/shareLinkMaintenanceLambdaApp.ts +50 -0
- package/src/accesslayer/app-manifest-version/create.ts +57 -0
- package/src/accesslayer/app-manifest-version/read.ts +129 -0
- package/src/accesslayer/app-manifest-version/update.ts +61 -0
- package/src/accesslayer/app-store-listing/read.ts +6 -0
- package/src/accesslayer/app-store-listing/relationships/create.ts +20 -0
- package/src/accesslayer/app-store-listing/relationships/read.ts +24 -1
- package/src/accesslayer/app-store-listing/update.ts +15 -0
- package/src/accesslayer/boost/relationships/create.ts +8 -2
- package/src/accesslayer/consentflowcontract/create.ts +81 -8
- package/src/accesslayer/consentflowcontract/read.ts +84 -10
- package/src/accesslayer/consentflowcontract/relationships/create.ts +125 -109
- package/src/accesslayer/consentflowcontract/relationships/delete.ts +1 -0
- package/src/accesslayer/consentflowcontract/relationships/read.ts +184 -108
- package/src/accesslayer/consentflowcontract/relationships/recipients.ts +125 -0
- package/src/accesslayer/consentflowcontract/relationships/smartResume.ts +125 -0
- package/src/accesslayer/consentflowcontract/relationships/update.ts +255 -217
- package/src/accesslayer/credential/create.test.ts +2 -115
- package/src/accesslayer/credential/create.ts +11 -6
- package/src/accesslayer/credential/relationships/create.ts +17 -10
- package/src/accesslayer/inbox-credential/relationships/create.ts +70 -48
- package/src/accesslayer/inbox-credential/update.ts +4 -2
- package/src/accesslayer/presentation/read.ts +57 -25
- package/src/accesslayer/presentation/relationships/create.ts +54 -11
- package/src/accesslayer/presentation/relationships/read.ts +21 -6
- package/src/accesslayer/share-link/abandon.ts +120 -0
- package/src/accesslayer/share-link/attachment.ts +360 -0
- package/src/accesslayer/share-link/cleanup.ts +271 -0
- package/src/accesslayer/share-link/errors.ts +32 -0
- package/src/accesslayer/share-link/finalize.ts +313 -0
- package/src/accesslayer/share-link/helpers.ts +450 -0
- package/src/accesslayer/share-link/index.ts +11 -0
- package/src/accesslayer/share-link/list.ts +162 -0
- package/src/accesslayer/share-link/read.ts +107 -0
- package/src/accesslayer/share-link/receipt.ts +548 -0
- package/src/accesslayer/share-link/recovery.ts +565 -0
- package/src/accesslayer/share-link/reserve.ts +763 -0
- package/src/accesslayer/share-link/revoke.ts +232 -0
- package/src/accesslayer/share-link/transaction-execution.ts +72 -0
- package/src/accesslayer/share-link/transaction.ts +126 -0
- package/src/accesslayer/share-link/types.ts +606 -0
- package/src/app.ts +6 -0
- package/src/cache/app-store.caches.ts +35 -0
- package/src/config/applyDockerStageConfig.ts +6 -0
- package/src/config/environment.test.ts +17 -12
- package/src/config/environment.ts +15 -0
- package/src/config/serverlessFunctionEnv.test.ts +105 -0
- package/src/config/stageConfig.test.ts +25 -0
- package/src/config/stageConfig.ts +24 -0
- package/src/constants/auth-grant.ts +5 -0
- package/src/docker-entry.ts +81 -0
- package/src/helpers/app-manifest.helpers.ts +185 -0
- package/src/helpers/boost.helpers.ts +4 -31
- package/src/helpers/claim-hooks.helpers.ts +20 -7
- package/src/helpers/consent-referral.helpers.ts +6 -0
- package/src/helpers/consent-scopes.helpers.ts +58 -0
- package/src/helpers/contract-event-maintenance.helpers.ts +43 -0
- package/src/helpers/contract-events.helpers.ts +540 -0
- package/src/helpers/contract-requests.helpers.ts +211 -0
- package/src/helpers/credentialSubject.helpers.test.ts +114 -0
- package/src/helpers/credentialSubject.helpers.ts +40 -0
- package/src/helpers/finalize-inbox.helpers.ts +163 -44
- package/src/helpers/inbox.helpers.ts +58 -70
- package/src/helpers/inline-template.helpers.ts +560 -0
- package/src/helpers/notificationMessages.ts +77 -1
- package/src/helpers/notificationQueue.helpers.ts +23 -5
- package/src/helpers/notifications.helpers.ts +25 -1
- package/src/helpers/presentation-metadata.ts +41 -0
- package/src/helpers/presentation.helpers.ts +27 -20
- package/src/helpers/profile.helpers.ts +13 -0
- package/src/helpers/share-content-client/adapters.ts +55 -0
- package/src/helpers/share-content-client/canonical.ts +25 -0
- package/src/helpers/share-content-client/client.ts +440 -0
- package/src/helpers/share-content-client/config.ts +189 -0
- package/src/helpers/share-content-client/index.ts +27 -0
- package/src/helpers/share-content-client/responses.ts +273 -0
- package/src/helpers/share-content-client/types.ts +253 -0
- package/src/helpers/share-link-attachment-access.ts +87 -0
- package/src/helpers/share-link-attachment.ts +115 -0
- package/src/helpers/share-link-coordinator/attachment-stat.ts +41 -0
- package/src/helpers/share-link-coordinator/budget-helpers.ts +53 -0
- package/src/helpers/share-link-coordinator/cleanup-runner.ts +286 -0
- package/src/helpers/share-link-coordinator/coordinator.ts +727 -0
- package/src/helpers/share-link-coordinator/index.ts +8 -0
- package/src/helpers/share-link-coordinator/recovery-runner.ts +443 -0
- package/src/helpers/share-link-coordinator/runtime.ts +88 -0
- package/src/helpers/share-link-coordinator/stat.ts +30 -0
- package/src/helpers/share-link-coordinator/types.ts +353 -0
- package/src/helpers/share-link-lifecycle/index.ts +4 -0
- package/src/helpers/share-link-lifecycle/lease.helpers.ts +35 -0
- package/src/helpers/share-link-lifecycle/recovery.helpers.ts +173 -0
- package/src/helpers/share-link-lifecycle/request-hash.helpers.ts +130 -0
- package/src/helpers/share-link-lifecycle/types.ts +58 -0
- package/src/helpers/share-link-maintenance/budget.ts +63 -0
- package/src/helpers/share-link-maintenance/config.ts +312 -0
- package/src/helpers/share-link-maintenance/index.ts +24 -0
- package/src/helpers/share-link-maintenance/runner.ts +251 -0
- package/src/helpers/share-link-maintenance/runtime.ts +340 -0
- package/src/helpers/share-link-maintenance/scheduler.ts +126 -0
- package/src/helpers/share-link-maintenance/telemetry.ts +73 -0
- package/src/helpers/share-link-maintenance/types.ts +91 -0
- package/src/helpers/share-link-owner/config.ts +48 -0
- package/src/helpers/share-link-owner/diagnostics.ts +89 -0
- package/src/helpers/share-link-owner/lazy-initializer.ts +29 -0
- package/src/helpers/share-link-owner-projection.ts +54 -0
- package/src/helpers/share-link-passcode-abuse.ts +36 -0
- package/src/helpers/share-link-passcode.ts +47 -0
- package/src/helpers/share-link-policy/index.ts +7 -0
- package/src/helpers/share-link-policy/production.ts +108 -0
- package/src/helpers/share-link-policy/resolver.ts +113 -0
- package/src/helpers/share-link-policy/types.ts +56 -0
- package/src/helpers/share-link-public/config.ts +41 -0
- package/src/helpers/share-link-view-notification.ts +18 -0
- package/src/helpers/signingAuthority.helpers.ts +23 -14
- package/src/helpers/smartResume.helpers.ts +123 -0
- package/src/models/AppManifestVersion.ts +43 -0
- package/src/models/AppStoreListing.ts +32 -0
- package/src/models/ConsentFlowContract.ts +34 -3
- package/src/models/ConsentFlowTerms.ts +10 -0
- package/src/models/ConsentFlowTransaction.ts +3 -0
- package/src/models/Integration.ts +2 -0
- package/src/models/Presentation.ts +2 -2
- package/src/models/Profile.ts +3 -2
- package/src/models/ShareLink.ts +134 -0
- package/src/models/ShareViewReceipt.ts +69 -0
- package/src/models/index.ts +25 -0
- package/src/models/share-link-constraints.ts +98 -0
- package/src/openapi.ts +44 -8
- package/src/public-share-link-http.ts +49 -0
- package/src/routes/app-store.ts +1056 -38
- package/src/routes/boosts.ts +14 -25
- package/src/routes/contracts.ts +384 -273
- package/src/routes/inbox.ts +4 -2
- package/src/routes/index.ts +142 -44
- package/src/routes/presentations.ts +19 -3
- package/src/routes/profile-manager.ts +29 -2
- package/src/routes/profiles.ts +29 -6
- package/src/routes/public-share-links.ts +983 -0
- package/src/routes/share-links.ts +709 -0
- package/src/routes/workflows.ts +3 -2
- package/src/services/delivery/adapters/postmark.adapter.ts +4 -1
- package/src/types/app-manifest.ts +28 -0
- package/src/types/app-store-listing.ts +13 -0
- package/src/types/consentflowcontract.ts +25 -4
- package/test/app-manifest.helpers.spec.ts +170 -0
- package/test/app-manifest.routes.spec.ts +299 -0
- package/test/app-store-listing-updates.spec.ts +236 -0
- package/test/app-store-listing.spec.ts +65 -3
- package/test/consent-data-boundaries.spec.ts +352 -0
- package/test/consent-recipients.spec.ts +513 -0
- package/test/consent-scopes.helpers.spec.ts +67 -0
- package/test/consentflow.spec.ts +63 -2
- package/test/contract-requests.spec.ts +1588 -0
- package/test/credential-storage.neo4j.spec.ts +122 -0
- package/test/dids.spec.ts +10 -1
- package/test/guardian-gated-routes.spec.ts +49 -0
- package/test/helpers/share-link-fixtures.ts +94 -0
- package/test/inbox-security.e2e.ts +26 -10
- package/test/inbox.spec.ts +184 -8
- package/test/inline-template.helpers.spec.ts +49 -0
- package/test/managed-recipient-inbox.spec.ts +152 -0
- package/test/notificationMessages.spec.ts +13 -0
- package/test/openapi.spec.ts +14 -53
- package/test/presentations.spec.ts +54 -6
- package/test/profiles.spec.ts +97 -1
- package/test/share-content-client.contract.spec.ts +365 -0
- package/test/share-content-client.unit.spec.ts +462 -0
- package/test/share-link-abuse.unit.spec.ts +65 -0
- package/test/share-link-attachment.neo4j.spec.ts +262 -0
- package/test/share-link-attachment.unit.spec.ts +244 -0
- package/test/share-link-coordinator.neo4j.spec.ts +684 -0
- package/test/share-link-coordinator.unit.spec.ts +990 -0
- package/test/share-link-dependency-diagnostics.unit.spec.ts +127 -0
- package/test/share-link-lifecycle.neo4j.spec.ts +1411 -0
- package/test/share-link-lifecycle.unit.spec.ts +205 -0
- package/test/share-link-list-cursor.unit.spec.ts +86 -0
- package/test/share-link-list.neo4j.spec.ts +324 -0
- package/test/share-link-maintenance.neo4j.spec.ts +355 -0
- package/test/share-link-maintenance.unit.spec.ts +1140 -0
- package/test/share-link-owner-policy.unit.spec.ts +210 -0
- package/test/share-link-owner-route.unit.spec.ts +820 -0
- package/test/share-link-owner-runtime.unit.spec.ts +102 -0
- package/test/share-link-passcode.unit.spec.ts +29 -0
- package/test/share-link-policy.unit.spec.ts +149 -0
- package/test/share-link-presentation-metadata.unit.spec.ts +49 -0
- package/test/share-link-production-policy.unit.spec.ts +126 -0
- package/test/share-link-public-config.unit.spec.ts +64 -0
- package/test/share-link-public-http-adapter.unit.spec.ts +315 -0
- package/test/share-link-public-route.unit.spec.ts +1079 -0
- package/test/share-link-receipt.neo4j.spec.ts +943 -0
- package/test/share-link-recovery.neo4j.spec.ts +935 -0
- package/test/share-link-recovery.unit.spec.ts +726 -0
- package/test/share-link-service-policy.neo4j.spec.ts +403 -0
- package/test/signing-authority-encryption.spec.ts +75 -0
- package/test/smart-resume-consent.spec.ts +233 -0
- package/test/smart-resume-upload.spec.ts +65 -0
- package/tsconfig.build.json +1 -1
- package/tsconfig.json +1 -0
- package/vitest.config.ts +14 -0
- package/vitest.inbox-e2e.config.ts +2 -0
- package/vitest.share-links-neo4j.config.ts +19 -0
- package/vitest.share-links-unit.config.ts +28 -0
- package/workerLambda.test.ts +100 -0
|
@@ -1,14 +1,32 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { authorizeContractNotification } from '@helpers/contract-events.helpers';
|
|
2
|
+
import { ConsentFlowWebhookMetadataValidator, LCNNotificationValidator } from '@learncard/types';
|
|
2
3
|
|
|
3
4
|
import { acknowledgeConnectionPromptNotificationDelivery } from '@helpers/connectionPrompt.helpers';
|
|
4
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
PermanentNotificationDeliveryError,
|
|
7
|
+
sendNotification,
|
|
8
|
+
} from '@helpers/notifications.helpers';
|
|
5
9
|
|
|
6
10
|
export const deliverQueuedNotification = async (body: string): Promise<void> => {
|
|
7
11
|
const notification = await LCNNotificationValidator.parseAsync(JSON.parse(body));
|
|
8
12
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
if (!(await authorizeContractNotification(notification))) return;
|
|
14
|
+
|
|
15
|
+
const isContractEvent = ConsentFlowWebhookMetadataValidator.safeParse(
|
|
16
|
+
notification.data?.metadata
|
|
17
|
+
).success;
|
|
18
|
+
let stored: boolean | undefined;
|
|
19
|
+
try {
|
|
20
|
+
stored = await sendNotification(notification, {
|
|
21
|
+
propagateDirectWebhookTransportErrors: true,
|
|
22
|
+
throwOnPermanentFailure: isContractEvent,
|
|
23
|
+
});
|
|
24
|
+
} catch (error) {
|
|
25
|
+
// Acknowledge terminal contract rejections so SQS can discard its payload too.
|
|
26
|
+
// Other notification types keep their existing worker behavior.
|
|
27
|
+
if (isContractEvent && error instanceof PermanentNotificationDeliveryError) return;
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
12
30
|
|
|
13
31
|
if (!stored) throw new Error('Notification was not durably stored');
|
|
14
32
|
|
|
@@ -26,8 +26,20 @@ const TIMEOUT = 6000;
|
|
|
26
26
|
|
|
27
27
|
type NotificationDeliveryOptions = {
|
|
28
28
|
propagateDirectWebhookTransportErrors?: boolean;
|
|
29
|
+
/** Opt in to terminal rejection errors; legacy callers continue to receive false. */
|
|
30
|
+
throwOnPermanentFailure?: boolean;
|
|
29
31
|
};
|
|
30
32
|
|
|
33
|
+
export class PermanentNotificationDeliveryError extends Error {
|
|
34
|
+
constructor(
|
|
35
|
+
readonly reason: 'no_webhook' | 'invalid_webhook' | 'webhook_rejected',
|
|
36
|
+
readonly statusCode?: number
|
|
37
|
+
) {
|
|
38
|
+
super(`Notification delivery rejected: ${reason}`);
|
|
39
|
+
this.name = 'PermanentNotificationDeliveryError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
31
43
|
type NotificationWebhookResponseRecord = Record<string, unknown>;
|
|
32
44
|
|
|
33
45
|
const isDefinitiveWebhookRejection = (statusCode: number): boolean => {
|
|
@@ -308,6 +320,8 @@ export async function sendNotification(
|
|
|
308
320
|
);
|
|
309
321
|
|
|
310
322
|
if (!notificationsWebhook) {
|
|
323
|
+
if (options.throwOnPermanentFailure)
|
|
324
|
+
throw new PermanentNotificationDeliveryError('no_webhook');
|
|
311
325
|
return false;
|
|
312
326
|
}
|
|
313
327
|
|
|
@@ -360,7 +374,14 @@ export async function sendNotification(
|
|
|
360
374
|
}
|
|
361
375
|
|
|
362
376
|
if (!response.ok) {
|
|
363
|
-
if (isDefinitiveWebhookRejection(response.status))
|
|
377
|
+
if (isDefinitiveWebhookRejection(response.status)) {
|
|
378
|
+
if (options.throwOnPermanentFailure)
|
|
379
|
+
throw new PermanentNotificationDeliveryError(
|
|
380
|
+
'webhook_rejected',
|
|
381
|
+
response.status
|
|
382
|
+
);
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
364
385
|
|
|
365
386
|
throw createWebhookTransportError(response.status);
|
|
366
387
|
}
|
|
@@ -411,7 +432,10 @@ export async function sendNotification(
|
|
|
411
432
|
|
|
412
433
|
return notificationDelivered;
|
|
413
434
|
}
|
|
435
|
+
if (options.throwOnPermanentFailure)
|
|
436
|
+
throw new PermanentNotificationDeliveryError('invalid_webhook');
|
|
414
437
|
} catch (error) {
|
|
438
|
+
if (error instanceof PermanentNotificationDeliveryError) throw error;
|
|
415
439
|
if (runtimeEnvironment.NODE_ENV !== 'test') {
|
|
416
440
|
console.error('Notifications Helpers - Error While Sending:', error);
|
|
417
441
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { TRPCError } from '@trpc/server';
|
|
2
|
+
import { ShareLinkIdValidator } from '@learncard/types';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
|
|
5
|
+
// Relationship metadata is not signed VP content. Bound generic metadata and
|
|
6
|
+
// reserve the share-link shape for the recipient's own send/accept workflow.
|
|
7
|
+
const ShareLinkPresentationMetadataValidator = z
|
|
8
|
+
.object({
|
|
9
|
+
type: z.literal('learncard.share-link.v1'),
|
|
10
|
+
shareId: ShareLinkIdValidator,
|
|
11
|
+
title: z.string().min(1).max(120),
|
|
12
|
+
note: z.string().max(500).optional(),
|
|
13
|
+
sharer: z
|
|
14
|
+
.object({
|
|
15
|
+
profileId: z.string().min(1).max(128),
|
|
16
|
+
displayName: z.string().min(1).max(120),
|
|
17
|
+
})
|
|
18
|
+
.strict(),
|
|
19
|
+
})
|
|
20
|
+
.strict();
|
|
21
|
+
|
|
22
|
+
export const PresentationMetadataValidator = z
|
|
23
|
+
.record(z.string().min(1).max(64), z.unknown())
|
|
24
|
+
.refine(value => JSON.stringify(value).length <= 4096, 'Metadata is too large')
|
|
25
|
+
.superRefine((value, ctx) => {
|
|
26
|
+
if (value.type !== 'learncard.share-link.v1') return;
|
|
27
|
+
if (!ShareLinkPresentationMetadataValidator.safeParse(value).success)
|
|
28
|
+
ctx.addIssue({ code: 'custom', message: 'Invalid share-link metadata' });
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export const assertPresentationMetadataRecipient = (
|
|
32
|
+
metadata: Record<string, unknown> | undefined,
|
|
33
|
+
senderProfileId: string,
|
|
34
|
+
recipientProfileId: string
|
|
35
|
+
): void => {
|
|
36
|
+
if (metadata?.type === 'learncard.share-link.v1' && senderProfileId !== recipientProfileId)
|
|
37
|
+
throw new TRPCError({
|
|
38
|
+
code: 'BAD_REQUEST',
|
|
39
|
+
message: 'Share-link metadata requires a self-save',
|
|
40
|
+
});
|
|
41
|
+
};
|
|
@@ -23,23 +23,29 @@ export const sendPresentation = async (
|
|
|
23
23
|
from: ProfileType,
|
|
24
24
|
to: ProfileType,
|
|
25
25
|
presentation: VP | JWE,
|
|
26
|
-
domain: string
|
|
26
|
+
domain: string,
|
|
27
|
+
metadata?: Record<string, unknown>
|
|
27
28
|
): Promise<string> => {
|
|
28
29
|
const presentationInstance = await storePresentation(presentation);
|
|
29
30
|
|
|
30
|
-
await createSentPresentationRelationship(from, to, presentationInstance);
|
|
31
|
+
await createSentPresentationRelationship(from, to, presentationInstance, metadata);
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
const uri = getPresentationUri(presentationInstance.id, domain);
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
// Saving a shared collection reuses the presentation send/accept pipeline by
|
|
36
|
+
// sending it to the current profile. Keep that storage behavior without
|
|
37
|
+
// creating a meaningless "you sent this to yourself" recipient alert.
|
|
38
|
+
if (from.profileId !== to.profileId) {
|
|
39
|
+
await addNotificationToQueue({
|
|
40
|
+
type: LCNNotificationTypeEnumValidator.enum.PRESENTATION_RECEIVED,
|
|
41
|
+
to,
|
|
42
|
+
from,
|
|
43
|
+
message: getNotificationMessage('presentationReceived', resolveRecipientLocale(to), {
|
|
44
|
+
from: from.displayName,
|
|
45
|
+
}),
|
|
46
|
+
data: { vpUris: [uri] },
|
|
47
|
+
});
|
|
48
|
+
}
|
|
43
49
|
|
|
44
50
|
return uri;
|
|
45
51
|
};
|
|
@@ -63,16 +69,17 @@ export const acceptPresentation = async (profile: ProfileType, uri: string): Pro
|
|
|
63
69
|
});
|
|
64
70
|
}
|
|
65
71
|
|
|
66
|
-
//
|
|
72
|
+
// Acceptance is idempotent so a client can safely recover from a response
|
|
73
|
+
// interruption without producing a second received relationship.
|
|
67
74
|
const alreadyReceived = await getPresentationReceivedByProfile(id, profile);
|
|
68
|
-
if (alreadyReceived) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
75
|
+
if (!alreadyReceived) {
|
|
76
|
+
await createReceivedPresentationRelationship(
|
|
77
|
+
profile,
|
|
78
|
+
pendingVp.source,
|
|
79
|
+
pendingVp.target,
|
|
80
|
+
pendingVp.relationship.metadata
|
|
81
|
+
);
|
|
73
82
|
}
|
|
74
83
|
|
|
75
|
-
await createReceivedPresentationRelationship(profile, pendingVp.source, pendingVp.target);
|
|
76
|
-
|
|
77
84
|
return true;
|
|
78
85
|
};
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { LCNProfileValidator } from '@learncard/types';
|
|
2
|
+
|
|
1
3
|
import { getProfileByProfileId } from '@accesslayer/profile/read';
|
|
2
4
|
import { createProfile } from '@accesslayer/profile/create';
|
|
3
5
|
import { getProfileIdFromDid } from './did.helpers';
|
|
@@ -6,6 +8,17 @@ import { ProfileType } from 'types/profile';
|
|
|
6
8
|
export const transformProfileId = (rawInput: string): string =>
|
|
7
9
|
rawInput.toLowerCase().replaceAll(':', '%3A');
|
|
8
10
|
|
|
11
|
+
export const PublicProfileIdValidator = LCNProfileValidator.shape.profileId.refine(
|
|
12
|
+
profileId => !transformProfileId(profileId).startsWith('sample-'),
|
|
13
|
+
{ message: 'Profile IDs beginning with "sample-" are reserved.' }
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
/** Legacy service flags never override an explicit child classification. */
|
|
17
|
+
export const isServiceProfileExemptFromGuardianship = (
|
|
18
|
+
isServiceProfile: unknown,
|
|
19
|
+
profileType: unknown
|
|
20
|
+
): boolean => isServiceProfile === true && profileType !== 'child';
|
|
21
|
+
|
|
9
22
|
/**
|
|
10
23
|
* Gets or creates a federated profile for cross-instance credential sending.
|
|
11
24
|
* Federated profiles use email-like format: profileId@service-domain to avoid collisions.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { getDidWebLearnCard, getServerDidWebDID } from '@helpers/learnCard.helpers';
|
|
2
|
+
|
|
3
|
+
import type { ShareContentTokenSigner } from './types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Runtime signing adapter for the LC-2187 share-content service token.
|
|
7
|
+
*
|
|
8
|
+
* It reuses the existing did:web LearnCard signing primitives — no new
|
|
9
|
+
* cryptographic algorithm or key material is introduced. The fixed C1 verifier
|
|
10
|
+
* expects a holder-signed VP JWT whose `nonce` is the JSON-serialized claims
|
|
11
|
+
* object, signed with `EdDSA` by an allowlisted did:web verification method. The
|
|
12
|
+
* `kid` did:web fragment is produced by DIDKit from the signing key; the client
|
|
13
|
+
* independently re-checks that it binds the configured signer DID before any
|
|
14
|
+
* request is sent.
|
|
15
|
+
*
|
|
16
|
+
* Exported separately from the client barrel so unit tests never load the
|
|
17
|
+
* LearnCard/environment graph.
|
|
18
|
+
*/
|
|
19
|
+
export const createDidWebLearnCardTokenSigner = (dependencies?: {
|
|
20
|
+
getLearnCard?: () => Promise<{
|
|
21
|
+
invoke: { issuePresentation: (...args: unknown[]) => unknown };
|
|
22
|
+
}>;
|
|
23
|
+
getSignerDid?: () => string;
|
|
24
|
+
}): ShareContentTokenSigner => {
|
|
25
|
+
const resolveLearnCard = dependencies?.getLearnCard ?? getDidWebLearnCard;
|
|
26
|
+
const resolveSignerDid = dependencies?.getSignerDid ?? getServerDidWebDID;
|
|
27
|
+
|
|
28
|
+
return async claims => {
|
|
29
|
+
const learnCard = await resolveLearnCard();
|
|
30
|
+
const signerDid = resolveSignerDid();
|
|
31
|
+
|
|
32
|
+
if (claims.iss !== signerDid) {
|
|
33
|
+
throw new Error('share-content signer DID does not match the token issuer binding');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const presentation = {
|
|
37
|
+
'@context': ['https://www.w3.org/2018/credentials/v1'],
|
|
38
|
+
type: ['VerifiablePresentation'],
|
|
39
|
+
holder: signerDid,
|
|
40
|
+
verifiableCredential: [],
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const issued = await learnCard.invoke.issuePresentation(presentation, {
|
|
44
|
+
proofPurpose: 'authentication',
|
|
45
|
+
proofFormat: 'jwt',
|
|
46
|
+
challenge: JSON.stringify(claims),
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
if (typeof issued !== 'string' || issued.length === 0) {
|
|
50
|
+
throw new Error('share-content signer did not return a JWT presentation');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return issued;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { canonicalizeShareContentRequestBody } from '@learncard/helpers';
|
|
3
|
+
|
|
4
|
+
export {
|
|
5
|
+
canonicalizeShareContentRequestBody,
|
|
6
|
+
DEFAULT_MAX_CANONICAL_BYTES,
|
|
7
|
+
DEFAULT_MAX_CANONICAL_DEPTH,
|
|
8
|
+
ShareContentCanonicalizationError,
|
|
9
|
+
} from '@learncard/helpers';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* SHA-256 (lowercase hex) over the canonical request body. This is exactly the
|
|
13
|
+
* value signed into `claims.requestHash` and recomputed by C1.
|
|
14
|
+
*/
|
|
15
|
+
export const computeShareContentRequestBodyHash = (
|
|
16
|
+
body: unknown,
|
|
17
|
+
options: { maxBytes?: number; maxDepth?: number } = {}
|
|
18
|
+
): string =>
|
|
19
|
+
createHash('sha256')
|
|
20
|
+
.update(canonicalizeShareContentRequestBody(body, options), 'utf8')
|
|
21
|
+
.digest('hex');
|
|
22
|
+
|
|
23
|
+
/** Strict lowercase hex SHA-256. */
|
|
24
|
+
export const isSha256Hex = (value: unknown): value is string =>
|
|
25
|
+
typeof value === 'string' && /^[0-9a-f]{64}$/.test(value);
|