@bifold/core 2.10.2 → 2.11.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/lib/commonjs/components/listItems/NotificationListItem.js +19 -11
- package/lib/commonjs/components/listItems/NotificationListItem.js.map +1 -1
- package/lib/commonjs/components/misc/CredentialCard.js +3 -1
- package/lib/commonjs/components/misc/CredentialCard.js.map +1 -1
- package/lib/commonjs/components/misc/CredentialCard10.js +13 -5
- package/lib/commonjs/components/misc/CredentialCard10.js.map +1 -1
- package/lib/commonjs/components/misc/CredentialCard11.js +25 -22
- package/lib/commonjs/components/misc/CredentialCard11.js.map +1 -1
- package/lib/commonjs/components/views/CredentialDetailPrimaryHeader.js +8 -7
- package/lib/commonjs/components/views/CredentialDetailPrimaryHeader.js.map +1 -1
- package/lib/commonjs/constants.js +1 -0
- package/lib/commonjs/constants.js.map +1 -1
- package/lib/commonjs/container-api.js +3 -1
- package/lib/commonjs/container-api.js.map +1 -1
- package/lib/commonjs/container-impl.js +16 -0
- package/lib/commonjs/container-impl.js.map +1 -1
- package/lib/commonjs/hooks/notifications.js +4 -2
- package/lib/commonjs/hooks/notifications.js.map +1 -1
- package/lib/commonjs/hooks/useBifoldAgentSetup.js +5 -3
- package/lib/commonjs/hooks/useBifoldAgentSetup.js.map +1 -1
- package/lib/commonjs/index.js +16 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/localization/en/en.json +8 -1
- package/lib/commonjs/localization/fr/fr.json +8 -1
- package/lib/commonjs/localization/pt-br/pt-br.json +8 -1
- package/lib/commonjs/modules/openid/components/OpenIDCredentialCard.js +41 -1
- package/lib/commonjs/modules/openid/components/OpenIDCredentialCard.js.map +1 -1
- package/lib/commonjs/modules/openid/context/OpenIDCredentialRecordProvider.js +34 -111
- package/lib/commonjs/modules/openid/context/OpenIDCredentialRecordProvider.js.map +1 -1
- package/lib/commonjs/modules/openid/hooks/openid.js +38 -6
- package/lib/commonjs/modules/openid/hooks/openid.js.map +1 -1
- package/lib/commonjs/modules/openid/hooks/useAcceptReplacement.js +82 -0
- package/lib/commonjs/modules/openid/hooks/useAcceptReplacement.js.map +1 -0
- package/lib/commonjs/modules/openid/hooks/useCredentialErrorsFromRegistry.js +60 -0
- package/lib/commonjs/modules/openid/hooks/useCredentialErrorsFromRegistry.js.map +1 -0
- package/lib/commonjs/modules/openid/hooks/useDeclineReplacement.js +84 -0
- package/lib/commonjs/modules/openid/hooks/useDeclineReplacement.js.map +1 -0
- package/lib/commonjs/modules/openid/hooks/useOpenIdReplacementNavigation.js +55 -0
- package/lib/commonjs/modules/openid/hooks/useOpenIdReplacementNavigation.js.map +1 -0
- package/lib/commonjs/modules/openid/hooks/useReplacementNotifications.js +82 -0
- package/lib/commonjs/modules/openid/hooks/useReplacementNotifications.js.map +1 -0
- package/lib/commonjs/modules/openid/metadata.js +60 -1
- package/lib/commonjs/modules/openid/metadata.js.map +1 -1
- package/lib/commonjs/modules/openid/notification.js +42 -0
- package/lib/commonjs/modules/openid/notification.js.map +1 -0
- package/lib/commonjs/modules/openid/offerResolve.js +6 -0
- package/lib/commonjs/modules/openid/offerResolve.js.map +1 -1
- package/lib/commonjs/modules/openid/refresh/reIssuance.js +95 -0
- package/lib/commonjs/modules/openid/refresh/reIssuance.js.map +1 -0
- package/lib/commonjs/modules/openid/refresh/refreshOrchestrator.js +265 -0
- package/lib/commonjs/modules/openid/refresh/refreshOrchestrator.js.map +1 -0
- package/lib/commonjs/modules/openid/refresh/refreshToken.js +78 -0
- package/lib/commonjs/modules/openid/refresh/refreshToken.js.map +1 -0
- package/lib/commonjs/modules/openid/refresh/registery.js +143 -0
- package/lib/commonjs/modules/openid/refresh/registery.js.map +1 -0
- package/lib/commonjs/modules/openid/refresh/types.js +17 -0
- package/lib/commonjs/modules/openid/refresh/types.js.map +1 -0
- package/lib/commonjs/modules/openid/refresh/verifyCredentialStatus.js +34 -0
- package/lib/commonjs/modules/openid/refresh/verifyCredentialStatus.js.map +1 -0
- package/lib/commonjs/modules/openid/screens/OpenIDCredentialOffer.js +39 -2
- package/lib/commonjs/modules/openid/screens/OpenIDCredentialOffer.js.map +1 -1
- package/lib/commonjs/modules/openid/utils/utils.js +66 -0
- package/lib/commonjs/modules/openid/utils/utils.js.map +1 -1
- package/lib/commonjs/screens/CredentialDetails.js +28 -6
- package/lib/commonjs/screens/CredentialDetails.js.map +1 -1
- package/lib/commonjs/screens/CredentialOffer.js +6 -9
- package/lib/commonjs/screens/CredentialOffer.js.map +1 -1
- package/lib/commonjs/screens/CredentialOfferAccept.js +18 -2
- package/lib/commonjs/screens/CredentialOfferAccept.js.map +1 -1
- package/lib/commonjs/screens/Developer.js +26 -0
- package/lib/commonjs/screens/Developer.js.map +1 -1
- package/lib/commonjs/screens/Home.js +39 -1
- package/lib/commonjs/screens/Home.js.map +1 -1
- package/lib/commonjs/screens/ListCredentials.js +2 -2
- package/lib/commonjs/screens/ListCredentials.js.map +1 -1
- package/lib/commonjs/screens/ProofChangeCredential.js +3 -3
- package/lib/commonjs/screens/ProofChangeCredential.js.map +1 -1
- package/lib/commonjs/screens/ProofRequest.js +4 -4
- package/lib/commonjs/screens/ProofRequest.js.map +1 -1
- package/lib/commonjs/services/AgentBridge.js +90 -0
- package/lib/commonjs/services/AgentBridge.js.map +1 -0
- package/lib/commonjs/types/credentials.js +9 -0
- package/lib/commonjs/types/credentials.js.map +1 -1
- package/lib/commonjs/utils/agent.js +1 -1
- package/lib/commonjs/utils/agent.js.map +1 -1
- package/lib/commonjs/utils/cred-def.js +50 -43
- package/lib/commonjs/utils/cred-def.js.map +1 -1
- package/lib/commonjs/utils/credential.js +217 -1
- package/lib/commonjs/utils/credential.js.map +1 -1
- package/lib/commonjs/utils/helpers.js +83 -22
- package/lib/commonjs/utils/helpers.js.map +1 -1
- package/lib/module/components/listItems/NotificationListItem.js +19 -11
- package/lib/module/components/listItems/NotificationListItem.js.map +1 -1
- package/lib/module/components/misc/CredentialCard.js +3 -1
- package/lib/module/components/misc/CredentialCard.js.map +1 -1
- package/lib/module/components/misc/CredentialCard10.js +14 -6
- package/lib/module/components/misc/CredentialCard10.js.map +1 -1
- package/lib/module/components/misc/CredentialCard11.js +17 -14
- package/lib/module/components/misc/CredentialCard11.js.map +1 -1
- package/lib/module/components/views/CredentialDetailPrimaryHeader.js +9 -8
- package/lib/module/components/views/CredentialDetailPrimaryHeader.js.map +1 -1
- package/lib/module/constants.js +1 -0
- package/lib/module/constants.js.map +1 -1
- package/lib/module/container-api.js +3 -1
- package/lib/module/container-api.js.map +1 -1
- package/lib/module/container-impl.js +16 -0
- package/lib/module/container-impl.js.map +1 -1
- package/lib/module/hooks/notifications.js +4 -2
- package/lib/module/hooks/notifications.js.map +1 -1
- package/lib/module/hooks/useBifoldAgentSetup.js +5 -3
- package/lib/module/hooks/useBifoldAgentSetup.js.map +1 -1
- package/lib/module/index.js +3 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/localization/en/en.json +8 -1
- package/lib/module/localization/fr/fr.json +8 -1
- package/lib/module/localization/pt-br/pt-br.json +8 -1
- package/lib/module/modules/openid/components/OpenIDCredentialCard.js +41 -1
- package/lib/module/modules/openid/components/OpenIDCredentialCard.js.map +1 -1
- package/lib/module/modules/openid/context/OpenIDCredentialRecordProvider.js +34 -111
- package/lib/module/modules/openid/context/OpenIDCredentialRecordProvider.js.map +1 -1
- package/lib/module/modules/openid/hooks/openid.js +38 -5
- package/lib/module/modules/openid/hooks/openid.js.map +1 -1
- package/lib/module/modules/openid/hooks/useAcceptReplacement.js +76 -0
- package/lib/module/modules/openid/hooks/useAcceptReplacement.js.map +1 -0
- package/lib/module/modules/openid/hooks/useCredentialErrorsFromRegistry.js +54 -0
- package/lib/module/modules/openid/hooks/useCredentialErrorsFromRegistry.js.map +1 -0
- package/lib/module/modules/openid/hooks/useDeclineReplacement.js +77 -0
- package/lib/module/modules/openid/hooks/useDeclineReplacement.js.map +1 -0
- package/lib/module/modules/openid/hooks/useOpenIdReplacementNavigation.js +47 -0
- package/lib/module/modules/openid/hooks/useOpenIdReplacementNavigation.js.map +1 -0
- package/lib/module/modules/openid/hooks/useReplacementNotifications.js +75 -0
- package/lib/module/modules/openid/hooks/useReplacementNotifications.js.map +1 -0
- package/lib/module/modules/openid/metadata.js +52 -1
- package/lib/module/modules/openid/metadata.js.map +1 -1
- package/lib/module/modules/openid/notification.js +38 -0
- package/lib/module/modules/openid/notification.js.map +1 -0
- package/lib/module/modules/openid/offerResolve.js +7 -1
- package/lib/module/modules/openid/offerResolve.js.map +1 -1
- package/lib/module/modules/openid/refresh/reIssuance.js +89 -0
- package/lib/module/modules/openid/refresh/reIssuance.js.map +1 -0
- package/lib/module/modules/openid/refresh/refreshOrchestrator.js +257 -0
- package/lib/module/modules/openid/refresh/refreshOrchestrator.js.map +1 -0
- package/lib/module/modules/openid/refresh/refreshToken.js +72 -0
- package/lib/module/modules/openid/refresh/refreshToken.js.map +1 -0
- package/lib/module/modules/openid/refresh/registery.js +135 -0
- package/lib/module/modules/openid/refresh/registery.js.map +1 -0
- package/lib/module/modules/openid/refresh/types.js +11 -0
- package/lib/module/modules/openid/refresh/types.js.map +1 -0
- package/lib/module/modules/openid/refresh/verifyCredentialStatus.js +28 -0
- package/lib/module/modules/openid/refresh/verifyCredentialStatus.js.map +1 -0
- package/lib/module/modules/openid/screens/OpenIDCredentialOffer.js +39 -2
- package/lib/module/modules/openid/screens/OpenIDCredentialOffer.js.map +1 -1
- package/lib/module/modules/openid/utils/utils.js +64 -1
- package/lib/module/modules/openid/utils/utils.js.map +1 -1
- package/lib/module/screens/CredentialDetails.js +29 -7
- package/lib/module/screens/CredentialDetails.js.map +1 -1
- package/lib/module/screens/CredentialOffer.js +7 -10
- package/lib/module/screens/CredentialOffer.js.map +1 -1
- package/lib/module/screens/CredentialOfferAccept.js +19 -3
- package/lib/module/screens/CredentialOfferAccept.js.map +1 -1
- package/lib/module/screens/Developer.js +27 -1
- package/lib/module/screens/Developer.js.map +1 -1
- package/lib/module/screens/Home.js +41 -3
- package/lib/module/screens/Home.js.map +1 -1
- package/lib/module/screens/ListCredentials.js +1 -1
- package/lib/module/screens/ListCredentials.js.map +1 -1
- package/lib/module/screens/ProofChangeCredential.js +1 -1
- package/lib/module/screens/ProofChangeCredential.js.map +1 -1
- package/lib/module/screens/ProofRequest.js +1 -1
- package/lib/module/screens/ProofRequest.js.map +1 -1
- package/lib/module/services/AgentBridge.js +83 -0
- package/lib/module/services/AgentBridge.js.map +1 -0
- package/lib/module/types/credentials.js +8 -1
- package/lib/module/types/credentials.js.map +1 -1
- package/lib/module/utils/agent.js +2 -2
- package/lib/module/utils/agent.js.map +1 -1
- package/lib/module/utils/cred-def.js +46 -43
- package/lib/module/utils/cred-def.js.map +1 -1
- package/lib/module/utils/credential.js +210 -0
- package/lib/module/utils/credential.js.map +1 -1
- package/lib/module/utils/helpers.js +80 -22
- package/lib/module/utils/helpers.js.map +1 -1
- package/lib/typescript/src/components/listItems/NotificationListItem.d.ts.map +1 -1
- package/lib/typescript/src/components/misc/CredentialCard.d.ts +1 -2
- package/lib/typescript/src/components/misc/CredentialCard.d.ts.map +1 -1
- package/lib/typescript/src/components/misc/CredentialCard10.d.ts.map +1 -1
- package/lib/typescript/src/components/misc/CredentialCard11.d.ts +1 -5
- package/lib/typescript/src/components/misc/CredentialCard11.d.ts.map +1 -1
- package/lib/typescript/src/components/views/CredentialDetailPrimaryHeader.d.ts.map +1 -1
- package/lib/typescript/src/constants.d.ts +2 -1
- package/lib/typescript/src/constants.d.ts.map +1 -1
- package/lib/typescript/src/container-api.d.ts +8 -0
- package/lib/typescript/src/container-api.d.ts.map +1 -1
- package/lib/typescript/src/container-impl.d.ts +2 -0
- package/lib/typescript/src/container-impl.d.ts.map +1 -1
- package/lib/typescript/src/hooks/notifications.d.ts +2 -1
- package/lib/typescript/src/hooks/notifications.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useBifoldAgentSetup.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +4 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/modules/openid/components/OpenIDCredentialCard.d.ts.map +1 -1
- package/lib/typescript/src/modules/openid/context/OpenIDCredentialRecordProvider.d.ts +1 -2
- package/lib/typescript/src/modules/openid/context/OpenIDCredentialRecordProvider.d.ts.map +1 -1
- package/lib/typescript/src/modules/openid/hooks/openid.d.ts.map +1 -1
- package/lib/typescript/src/modules/openid/hooks/useAcceptReplacement.d.ts +11 -0
- package/lib/typescript/src/modules/openid/hooks/useAcceptReplacement.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/hooks/useCredentialErrorsFromRegistry.d.ts +9 -0
- package/lib/typescript/src/modules/openid/hooks/useCredentialErrorsFromRegistry.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/hooks/useDeclineReplacement.d.ts +16 -0
- package/lib/typescript/src/modules/openid/hooks/useDeclineReplacement.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/hooks/useOpenIdReplacementNavigation.d.ts +8 -0
- package/lib/typescript/src/modules/openid/hooks/useOpenIdReplacementNavigation.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/hooks/useReplacementNotifications.d.ts +6 -0
- package/lib/typescript/src/modules/openid/hooks/useReplacementNotifications.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/metadata.d.ts +27 -2
- package/lib/typescript/src/modules/openid/metadata.d.ts.map +1 -1
- package/lib/typescript/src/modules/openid/notification.d.ts +16 -0
- package/lib/typescript/src/modules/openid/notification.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/offerResolve.d.ts.map +1 -1
- package/lib/typescript/src/modules/openid/refresh/reIssuance.d.ts +19 -0
- package/lib/typescript/src/modules/openid/refresh/reIssuance.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/refresh/refreshOrchestrator.d.ts +25 -0
- package/lib/typescript/src/modules/openid/refresh/refreshOrchestrator.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/refresh/refreshToken.d.ts +9 -0
- package/lib/typescript/src/modules/openid/refresh/refreshToken.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/refresh/registery.d.ts +55 -0
- package/lib/typescript/src/modules/openid/refresh/registery.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/refresh/types.d.ts +59 -0
- package/lib/typescript/src/modules/openid/refresh/types.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/refresh/verifyCredentialStatus.d.ts +11 -0
- package/lib/typescript/src/modules/openid/refresh/verifyCredentialStatus.d.ts.map +1 -0
- package/lib/typescript/src/modules/openid/screens/OpenIDCredentialOffer.d.ts.map +1 -1
- package/lib/typescript/src/modules/openid/utils/utils.d.ts +4 -0
- package/lib/typescript/src/modules/openid/utils/utils.d.ts.map +1 -1
- package/lib/typescript/src/screens/CredentialDetails.d.ts.map +1 -1
- package/lib/typescript/src/screens/CredentialOffer.d.ts.map +1 -1
- package/lib/typescript/src/screens/CredentialOfferAccept.d.ts.map +1 -1
- package/lib/typescript/src/screens/Developer.d.ts.map +1 -1
- package/lib/typescript/src/screens/Home.d.ts.map +1 -1
- package/lib/typescript/src/screens/ListCredentials.d.ts.map +1 -1
- package/lib/typescript/src/services/AgentBridge.d.ts +31 -0
- package/lib/typescript/src/services/AgentBridge.d.ts.map +1 -0
- package/lib/typescript/src/types/credentials.d.ts +5 -0
- package/lib/typescript/src/types/credentials.d.ts.map +1 -1
- package/lib/typescript/src/types/notification.d.ts +4 -0
- package/lib/typescript/src/types/notification.d.ts.map +1 -1
- package/lib/typescript/src/utils/agent.d.ts.map +1 -1
- package/lib/typescript/src/utils/cred-def.d.ts +8 -3
- package/lib/typescript/src/utils/cred-def.d.ts.map +1 -1
- package/lib/typescript/src/utils/credential.d.ts +36 -0
- package/lib/typescript/src/utils/credential.d.ts.map +1 -1
- package/lib/typescript/src/utils/helpers.d.ts +5 -1
- package/lib/typescript/src/utils/helpers.d.ts.map +1 -1
- package/package.json +10 -4
- package/lib/commonjs/modules/openid/refresh/refreshMetadata.js +0 -25
- package/lib/commonjs/modules/openid/refresh/refreshMetadata.js.map +0 -1
- package/lib/module/modules/openid/refresh/refreshMetadata.js +0 -18
- package/lib/module/modules/openid/refresh/refreshMetadata.js.map +0 -1
- package/lib/typescript/src/modules/openid/refresh/refreshMetadata.d.ts +0 -20
- package/lib/typescript/src/modules/openid/refresh/refreshMetadata.d.ts.map +0 -1
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
// modules/openid/refresh/RefreshOrchestrator.ts
|
|
2
|
+
import { ClaimFormat, SdJwtVcRecord, W3cCredentialRecord } from '@credo-ts/core';
|
|
3
|
+
import { refreshAccessToken } from './refreshToken';
|
|
4
|
+
import { reissueCredentialWithAccessToken } from './reIssuance';
|
|
5
|
+
import { RefreshStatus } from './types';
|
|
6
|
+
import { credentialRegistry } from './registery';
|
|
7
|
+
import { verifyCredentialStatus } from './verifyCredentialStatus';
|
|
8
|
+
import { markOpenIDCredentialStatus } from '../metadata';
|
|
9
|
+
const defaultToLite = rec => {
|
|
10
|
+
var _rec$createdAt;
|
|
11
|
+
return {
|
|
12
|
+
id: rec.id,
|
|
13
|
+
// best-effort: SdJwt/W3C both expose claimFormat via tags in many setups.
|
|
14
|
+
// Fallback to JwtVc if unknown so UI has *some* value.
|
|
15
|
+
format: rec instanceof W3cCredentialRecord && ClaimFormat.JwtVc || rec instanceof SdJwtVcRecord && ClaimFormat.SdJwtVc || ClaimFormat.JwtVc,
|
|
16
|
+
createdAt: (_rec$createdAt = rec.createdAt) === null || _rec$createdAt === void 0 ? void 0 : _rec$createdAt.toISOString(),
|
|
17
|
+
issuer: undefined
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export class RefreshOrchestrator {
|
|
21
|
+
intervalOn = false; // interval enabled?
|
|
22
|
+
runningOnce = false; // a run is in progress?
|
|
23
|
+
|
|
24
|
+
recentlyIssued = new Map();
|
|
25
|
+
constructor(logger, bridge, opts) {
|
|
26
|
+
this.logger = logger;
|
|
27
|
+
this.opts = {
|
|
28
|
+
intervalMs: 15 * 60 * 1000,
|
|
29
|
+
autoStart: true,
|
|
30
|
+
onError: e => this.logger.error(String(e)),
|
|
31
|
+
listRecords: async () => [],
|
|
32
|
+
toLite: defaultToLite,
|
|
33
|
+
...(opts ?? {})
|
|
34
|
+
};
|
|
35
|
+
logger.info(`🔧 [RefreshOrchestrator] initialized -> ${JSON.stringify({
|
|
36
|
+
intervalMs: this.opts.intervalMs,
|
|
37
|
+
autoStart: this.opts.autoStart
|
|
38
|
+
})}`);
|
|
39
|
+
bridge.onReady(agent => {
|
|
40
|
+
this.agent = agent;
|
|
41
|
+
this.logger.info('🪝 [RefreshOrchestrator] Agent ready');
|
|
42
|
+
if (this.opts.autoStart && this.opts.intervalMs) this.start();
|
|
43
|
+
}, true);
|
|
44
|
+
}
|
|
45
|
+
configure(next) {
|
|
46
|
+
const prev = {
|
|
47
|
+
intervalOn: this.intervalOn,
|
|
48
|
+
intervalMs: this.opts.intervalMs ?? null,
|
|
49
|
+
autoStart: this.opts.autoStart ?? true,
|
|
50
|
+
agentReady: !!this.agent
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// merge
|
|
54
|
+
this.opts = {
|
|
55
|
+
...this.opts,
|
|
56
|
+
...next
|
|
57
|
+
};
|
|
58
|
+
this.logger.info(`🔧 [RefreshOrchestrator] configure -> ${JSON.stringify({
|
|
59
|
+
intervalMs: this.opts.intervalMs,
|
|
60
|
+
autoStart: this.opts.autoStart
|
|
61
|
+
})}`);
|
|
62
|
+
const nowIntervalMs = this.opts.intervalMs ?? null;
|
|
63
|
+
const nowAutoStart = this.opts.autoStart ?? true;
|
|
64
|
+
|
|
65
|
+
// Case A: timer is running and intervalMs changed → restart
|
|
66
|
+
if (prev.intervalOn && prev.intervalMs !== nowIntervalMs) {
|
|
67
|
+
this.stop();
|
|
68
|
+
if (nowIntervalMs) this.start();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Case B: timer is running but user disabled intervals
|
|
73
|
+
if (prev.intervalOn && nowIntervalMs === null) {
|
|
74
|
+
this.stop();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Case C: timer is NOT running, but user enabled intervals
|
|
79
|
+
// Start iff: we have a positive interval, and either autoStart is true
|
|
80
|
+
// or the caller intends to enable interval operation via configure.
|
|
81
|
+
if (!prev.intervalOn && nowIntervalMs && nowAutoStart) {
|
|
82
|
+
// If agent isn't ready yet, defer; onReady() will auto-start.
|
|
83
|
+
if (this.agent) this.start();
|
|
84
|
+
// else do nothing — the constructor's bridge.onReady() will call start()
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Case D: autoStart toggled from false→true with an interval set, and timer isn't running
|
|
89
|
+
if (!prev.intervalOn && !prev.autoStart && nowAutoStart && nowIntervalMs) {
|
|
90
|
+
if (this.agent) this.start();
|
|
91
|
+
// else defer to onReady()
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Otherwise: no timer state change needed.
|
|
96
|
+
}
|
|
97
|
+
isRunning() {
|
|
98
|
+
return this.runningOnce;
|
|
99
|
+
}
|
|
100
|
+
start() {
|
|
101
|
+
if (this.intervalOn || !this.opts.intervalMs) return;
|
|
102
|
+
this.logger.info('⏱️ [RefreshOrchestrator] start interval');
|
|
103
|
+
this.intervalOn = true;
|
|
104
|
+
this.timer = setInterval(() => {
|
|
105
|
+
// fire-and-forget; guard against overlap
|
|
106
|
+
void this.runOnce('interval');
|
|
107
|
+
}, this.opts.intervalMs);
|
|
108
|
+
}
|
|
109
|
+
stop() {
|
|
110
|
+
if (!this.intervalOn) return;
|
|
111
|
+
this.logger.info('⏹️ [RefreshOrchestrator] stop interval');
|
|
112
|
+
clearInterval(this.timer);
|
|
113
|
+
this.timer = undefined;
|
|
114
|
+
this.intervalOn = false;
|
|
115
|
+
}
|
|
116
|
+
async runOnce(reason = 'manual') {
|
|
117
|
+
var _this$agent;
|
|
118
|
+
if (this.runningOnce) {
|
|
119
|
+
this.logger.warn('⚠️ [RefreshOrchestrator] runOnce skipped: already running');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (!this.agent || !((_this$agent = this.agent) !== null && _this$agent !== void 0 && _this$agent.isInitialized)) {
|
|
123
|
+
this.logger.warn('⚠️ [RefreshOrchestrator] runOnce skipped: agent not ready');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
this.runningOnce = true;
|
|
127
|
+
this.logger.info(`🔁 [RefreshOrchestrator] runOnce (${reason})`);
|
|
128
|
+
try {
|
|
129
|
+
const records = await this.opts.listRecords();
|
|
130
|
+
this.logger.info(`📦 [Refresh] found ${records.length} credential records`);
|
|
131
|
+
for (const rec of records) {
|
|
132
|
+
// don’t block whole batch if one fails
|
|
133
|
+
try {
|
|
134
|
+
await this.refreshRecord(rec);
|
|
135
|
+
} catch (e) {
|
|
136
|
+
var _this$opts$onError, _this$opts;
|
|
137
|
+
this.logger.error(`💥 [Refresh] record ${rec.id} failed: ${String(e)}`);
|
|
138
|
+
(_this$opts$onError = (_this$opts = this.opts).onError) === null || _this$opts$onError === void 0 || _this$opts$onError.call(_this$opts, e);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
this.logger.info('✅ [Refresh] run completed');
|
|
142
|
+
} catch (e) {
|
|
143
|
+
var _this$opts$onError2, _this$opts2;
|
|
144
|
+
this.logger.error(`💥 [Refresh] global error: ${String(e)}`);
|
|
145
|
+
(_this$opts$onError2 = (_this$opts2 = this.opts).onError) === null || _this$opts$onError2 === void 0 || _this$opts$onError2.call(_this$opts2, e);
|
|
146
|
+
} finally {
|
|
147
|
+
this.runningOnce = false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
setIntervalMs(intervalMs) {
|
|
151
|
+
this.configure({
|
|
152
|
+
intervalMs
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
resolveFull(id) {
|
|
156
|
+
return this.recentlyIssued.get(id);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ---- internals ----
|
|
160
|
+
|
|
161
|
+
async refreshRecord(rec) {
|
|
162
|
+
const {
|
|
163
|
+
shouldSkip,
|
|
164
|
+
markRefreshing,
|
|
165
|
+
clearRefreshing,
|
|
166
|
+
clearExpired,
|
|
167
|
+
markExpiredWithReplacement,
|
|
168
|
+
blockAsFailed,
|
|
169
|
+
blockAsSucceeded,
|
|
170
|
+
upsert
|
|
171
|
+
} = credentialRegistry.getState();
|
|
172
|
+
const id = rec.id;
|
|
173
|
+
if (!this.agent) {
|
|
174
|
+
this.logger.error(`💥 [Refresh] Agent not initialized, cannot refresh credential ${id}`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// 0) fast exit if this cred is already handled or in-flight
|
|
179
|
+
if (shouldSkip(id)) {
|
|
180
|
+
this.logger.info(`⏭️ [Refresh] skip credential ${id} (blocked/expired/in-flight)`);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// 1) ensure a lite copy exists in registry (handy for UI/debug)
|
|
185
|
+
upsert(this.opts.toLite(rec));
|
|
186
|
+
|
|
187
|
+
// 2) mark in-flight
|
|
188
|
+
markRefreshing(id);
|
|
189
|
+
this.logger.info(`🧭 [Refresh] check credential ${id}`);
|
|
190
|
+
try {
|
|
191
|
+
// 3) verification
|
|
192
|
+
const isValid = await verifyCredentialStatus(rec, this.logger);
|
|
193
|
+
if (isValid) {
|
|
194
|
+
this.logger.info(`✅ [Refresh] valid → ${id}`);
|
|
195
|
+
// If it was previously expired for any reason, clear that and block as succeeded
|
|
196
|
+
clearExpired(id);
|
|
197
|
+
//We can block if isValid but for now we will keep checking it again every time
|
|
198
|
+
// blockAsSucceeded(id)
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Invalid case:
|
|
203
|
+
|
|
204
|
+
await markOpenIDCredentialStatus({
|
|
205
|
+
credential: rec,
|
|
206
|
+
status: RefreshStatus.Invalid,
|
|
207
|
+
agentContext: this.agent.context
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// 4) needs refresh → get access token
|
|
211
|
+
this.logger.info(`♻️ [Refresh] invalid, attempting re-issue → ${id}`);
|
|
212
|
+
const token = await refreshAccessToken({
|
|
213
|
+
logger: this.logger,
|
|
214
|
+
cred: rec,
|
|
215
|
+
agentContext: this.agent.context
|
|
216
|
+
});
|
|
217
|
+
if (!token) {
|
|
218
|
+
const msg = `no refresh token available`;
|
|
219
|
+
this.logger.warn(`⚠️ [Refresh] ${msg} for ${id}`);
|
|
220
|
+
blockAsFailed(id, msg);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// 5) re-issue
|
|
225
|
+
const newRecord = await reissueCredentialWithAccessToken({
|
|
226
|
+
agent: this.agent,
|
|
227
|
+
logger: this.logger,
|
|
228
|
+
record: rec,
|
|
229
|
+
tokenResponse: token
|
|
230
|
+
});
|
|
231
|
+
if (newRecord) {
|
|
232
|
+
this.logger.info(`💾 [Refresh] new credential → ${newRecord.id}`);
|
|
233
|
+
// Queue a replacement for UI/notifications and block the old one as succeeded
|
|
234
|
+
markExpiredWithReplacement(id, this.opts.toLite(newRecord));
|
|
235
|
+
blockAsSucceeded(id);
|
|
236
|
+
this.recentlyIssued.set(newRecord.id, newRecord);
|
|
237
|
+
} else {
|
|
238
|
+
const msg = `re-issue returned no record`;
|
|
239
|
+
this.logger.warn(`⚠️ [Refresh] ${msg} for ${id}`);
|
|
240
|
+
blockAsFailed(id, msg);
|
|
241
|
+
await markOpenIDCredentialStatus({
|
|
242
|
+
credential: rec,
|
|
243
|
+
status: RefreshStatus.Invalid,
|
|
244
|
+
agentContext: this.agent.context
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
} catch (e) {
|
|
248
|
+
const err = String(e);
|
|
249
|
+
this.logger.error(`💥 [Refresh] error on ${id}: ${err}`);
|
|
250
|
+
blockAsFailed(id, err);
|
|
251
|
+
} finally {
|
|
252
|
+
// 6) clear in-flight marker
|
|
253
|
+
clearRefreshing(id);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=refreshOrchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ClaimFormat","SdJwtVcRecord","W3cCredentialRecord","refreshAccessToken","reissueCredentialWithAccessToken","RefreshStatus","credentialRegistry","verifyCredentialStatus","markOpenIDCredentialStatus","defaultToLite","rec","_rec$createdAt","id","format","JwtVc","SdJwtVc","createdAt","toISOString","issuer","undefined","RefreshOrchestrator","intervalOn","runningOnce","recentlyIssued","Map","constructor","logger","bridge","opts","intervalMs","autoStart","onError","e","error","String","listRecords","toLite","info","JSON","stringify","onReady","agent","start","configure","next","prev","agentReady","nowIntervalMs","nowAutoStart","stop","isRunning","timer","setInterval","runOnce","clearInterval","reason","_this$agent","warn","isInitialized","records","length","refreshRecord","_this$opts$onError","_this$opts","call","_this$opts$onError2","_this$opts2","setIntervalMs","resolveFull","get","shouldSkip","markRefreshing","clearRefreshing","clearExpired","markExpiredWithReplacement","blockAsFailed","blockAsSucceeded","upsert","getState","isValid","credential","status","Invalid","agentContext","context","token","cred","msg","newRecord","record","tokenResponse","set","err"],"sourceRoot":"../../../../../src","sources":["modules/openid/refresh/refreshOrchestrator.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { getRefreshCredentialMetadata, persistCredentialRecord, setRefreshCredentialMetadata } from '../metadata';
|
|
2
|
+
export async function refreshAccessToken({
|
|
3
|
+
logger,
|
|
4
|
+
cred,
|
|
5
|
+
agentContext
|
|
6
|
+
}) {
|
|
7
|
+
logger.info(`[refreshAccessToken] Checking new credential for record: ${cred.id}`);
|
|
8
|
+
// return _mockTokenRefreshResponse
|
|
9
|
+
const refreshMetaData = getRefreshCredentialMetadata(cred);
|
|
10
|
+
if (!refreshMetaData) {
|
|
11
|
+
logger.error(`[refreshAccessToken] No refresh metadata found for credential: ${cred.id}`);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
logger.info(`[refreshAccessToken] Found refresh metadata for credential: ${cred.id}`);
|
|
15
|
+
const {
|
|
16
|
+
refreshToken,
|
|
17
|
+
authServer
|
|
18
|
+
} = refreshMetaData;
|
|
19
|
+
try {
|
|
20
|
+
if (!authServer) {
|
|
21
|
+
throw new Error('No authorization server found in the credential offer metadata');
|
|
22
|
+
}
|
|
23
|
+
logger.info(`[refreshAccessToken] Found auth server for credential: ${cred.id}: ${authServer}`);
|
|
24
|
+
|
|
25
|
+
// Build token endpoint: <AS>/token?force=false
|
|
26
|
+
// React-Native-safe URL build
|
|
27
|
+
const tokenUrl = (authServer.endsWith('/') ? authServer.slice(0, -1) : authServer) + '/token?force=false';
|
|
28
|
+
// const tokenUrl = new URL('token', authServer)
|
|
29
|
+
// tokenUrl.searchParams.set('force', 'false')
|
|
30
|
+
|
|
31
|
+
logger.info(`[refreshAccessToken] Refreshing access token at URL: ${tokenUrl} for credential: ${cred.id}`);
|
|
32
|
+
const body = new URLSearchParams({
|
|
33
|
+
grant_type: 'refresh_token',
|
|
34
|
+
refresh_token: refreshToken,
|
|
35
|
+
// these are accepted by some ASs that share the same endpoint with pre-auth:
|
|
36
|
+
pre_authorized_code: '',
|
|
37
|
+
pre_authorized_code_alt: '',
|
|
38
|
+
user_pin: ''
|
|
39
|
+
});
|
|
40
|
+
const res = await fetch(tokenUrl.toString(), {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: {
|
|
43
|
+
accept: 'application/json',
|
|
44
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
45
|
+
},
|
|
46
|
+
body: body.toString()
|
|
47
|
+
});
|
|
48
|
+
logger.info(`[refreshAccessToken] Response status: ${JSON.stringify(res)}`);
|
|
49
|
+
if (!res.ok) {
|
|
50
|
+
const errText = await res.text();
|
|
51
|
+
throw new Error(`Refresh failed ${res.status}: ${errText}`);
|
|
52
|
+
}
|
|
53
|
+
const data = await res.json();
|
|
54
|
+
logger.info(`[refreshAccessToken] New access token acquired: ${JSON.stringify(data)}`);
|
|
55
|
+
|
|
56
|
+
// If refresh token rotated, persist it
|
|
57
|
+
if (data.refresh_token && data.refresh_token !== refreshToken) {
|
|
58
|
+
logger.info(`[refreshAccessToken] Refresh token rotated; saving new one`);
|
|
59
|
+
setRefreshCredentialMetadata(cred, {
|
|
60
|
+
...refreshMetaData,
|
|
61
|
+
authServer: authServer,
|
|
62
|
+
refreshToken: data.refresh_token
|
|
63
|
+
});
|
|
64
|
+
await persistCredentialRecord(agentContext, cred);
|
|
65
|
+
}
|
|
66
|
+
return data;
|
|
67
|
+
} catch (error) {
|
|
68
|
+
logger.error(`[refreshAccessToken] Error getting new token: ${error}`);
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=refreshToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getRefreshCredentialMetadata","persistCredentialRecord","setRefreshCredentialMetadata","refreshAccessToken","logger","cred","agentContext","info","id","refreshMetaData","error","refreshToken","authServer","Error","tokenUrl","endsWith","slice","body","URLSearchParams","grant_type","refresh_token","pre_authorized_code","pre_authorized_code_alt","user_pin","res","fetch","toString","method","headers","accept","JSON","stringify","ok","errText","text","status","data","json"],"sourceRoot":"../../../../../src","sources":["modules/openid/refresh/refreshToken.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { createStore } from 'zustand/vanilla';
|
|
2
|
+
|
|
3
|
+
/** Permanent (until unblocked) blocks so the orchestrator won’t retry this cred again this session */
|
|
4
|
+
|
|
5
|
+
export const credentialRegistry = createStore((set, get) => ({
|
|
6
|
+
byId: {},
|
|
7
|
+
expired: [],
|
|
8
|
+
replacements: {},
|
|
9
|
+
refreshing: {},
|
|
10
|
+
blocked: {},
|
|
11
|
+
lastSweepAt: undefined,
|
|
12
|
+
upsert: cred => set(s => ({
|
|
13
|
+
byId: {
|
|
14
|
+
...s.byId,
|
|
15
|
+
[cred.id]: cred
|
|
16
|
+
}
|
|
17
|
+
})),
|
|
18
|
+
markRefreshing: id => set(s => ({
|
|
19
|
+
refreshing: {
|
|
20
|
+
...s.refreshing,
|
|
21
|
+
[id]: true
|
|
22
|
+
}
|
|
23
|
+
})),
|
|
24
|
+
clearRefreshing: id => set(s => {
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
26
|
+
const {
|
|
27
|
+
[id]: _drop,
|
|
28
|
+
...rest
|
|
29
|
+
} = s.refreshing;
|
|
30
|
+
return {
|
|
31
|
+
refreshing: rest
|
|
32
|
+
};
|
|
33
|
+
}),
|
|
34
|
+
markExpiredWithReplacement: (oldId, replacement) => set(s => ({
|
|
35
|
+
expired: s.expired.includes(oldId) ? s.expired : [...s.expired, oldId],
|
|
36
|
+
replacements: {
|
|
37
|
+
...s.replacements,
|
|
38
|
+
[oldId]: replacement
|
|
39
|
+
}
|
|
40
|
+
})),
|
|
41
|
+
acceptReplacement: oldId => set(s => {
|
|
42
|
+
const repl = s.replacements[oldId];
|
|
43
|
+
if (!repl) return s;
|
|
44
|
+
const byId = {
|
|
45
|
+
...s.byId
|
|
46
|
+
};
|
|
47
|
+
delete byId[oldId];
|
|
48
|
+
byId[repl.id] = repl;
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
50
|
+
const {
|
|
51
|
+
[oldId]: _drop,
|
|
52
|
+
...restRepl
|
|
53
|
+
} = s.replacements;
|
|
54
|
+
return {
|
|
55
|
+
byId,
|
|
56
|
+
replacements: restRepl,
|
|
57
|
+
expired: s.expired.filter(x => x !== oldId),
|
|
58
|
+
// Once accepted, you can optionally block the oldId as succeeded:
|
|
59
|
+
blocked: {
|
|
60
|
+
...s.blocked,
|
|
61
|
+
[oldId]: {
|
|
62
|
+
reason: 'succeeded',
|
|
63
|
+
at: new Date().toISOString()
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}),
|
|
68
|
+
clearExpired: id => set(s => ({
|
|
69
|
+
expired: s.expired.filter(x => x !== id)
|
|
70
|
+
})),
|
|
71
|
+
blockAsSucceeded: id => set(s => ({
|
|
72
|
+
blocked: {
|
|
73
|
+
...s.blocked,
|
|
74
|
+
[id]: {
|
|
75
|
+
reason: 'succeeded',
|
|
76
|
+
at: new Date().toISOString()
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
})),
|
|
80
|
+
blockAsFailed: (id, error) => set(s => ({
|
|
81
|
+
blocked: {
|
|
82
|
+
...s.blocked,
|
|
83
|
+
[id]: {
|
|
84
|
+
reason: 'failed',
|
|
85
|
+
at: new Date().toISOString(),
|
|
86
|
+
error
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
})),
|
|
90
|
+
unblock: id => set(s => {
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
92
|
+
const {
|
|
93
|
+
[id]: _drop,
|
|
94
|
+
...rest
|
|
95
|
+
} = s.blocked;
|
|
96
|
+
return {
|
|
97
|
+
blocked: rest
|
|
98
|
+
};
|
|
99
|
+
}),
|
|
100
|
+
shouldSkip: id => {
|
|
101
|
+
const s = get();
|
|
102
|
+
if (s.refreshing[id]) return true; // in-progress
|
|
103
|
+
if (s.expired.includes(id)) return true; // replacement already queued
|
|
104
|
+
if (s.blocked[id]) return true; // previously succeeded/failed
|
|
105
|
+
return false;
|
|
106
|
+
},
|
|
107
|
+
setLastSweep: iso => set({
|
|
108
|
+
lastSweepAt: iso
|
|
109
|
+
}),
|
|
110
|
+
reset: () => set({
|
|
111
|
+
byId: {},
|
|
112
|
+
expired: [],
|
|
113
|
+
replacements: {},
|
|
114
|
+
refreshing: {},
|
|
115
|
+
blocked: {},
|
|
116
|
+
lastSweepAt: undefined
|
|
117
|
+
})
|
|
118
|
+
}));
|
|
119
|
+
|
|
120
|
+
// Non-React helpers for workers/services
|
|
121
|
+
export const readRegistry = () => credentialRegistry.getState();
|
|
122
|
+
export const mutateRegistry = updater => credentialRegistry.setState(s => {
|
|
123
|
+
updater(s);
|
|
124
|
+
return s;
|
|
125
|
+
});
|
|
126
|
+
export const selectOldIdByReplacementId = replacementId => {
|
|
127
|
+
const {
|
|
128
|
+
replacements
|
|
129
|
+
} = credentialRegistry.getState();
|
|
130
|
+
for (const [oldId, repl] of Object.entries(replacements)) {
|
|
131
|
+
if (repl.id === replacementId) return oldId;
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=registery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createStore","credentialRegistry","set","get","byId","expired","replacements","refreshing","blocked","lastSweepAt","undefined","upsert","cred","s","id","markRefreshing","clearRefreshing","_drop","rest","markExpiredWithReplacement","oldId","replacement","includes","acceptReplacement","repl","restRepl","filter","x","reason","at","Date","toISOString","clearExpired","blockAsSucceeded","blockAsFailed","error","unblock","shouldSkip","setLastSweep","iso","reset","readRegistry","getState","mutateRegistry","updater","setState","selectOldIdByReplacementId","replacementId","Object","entries"],"sourceRoot":"../../../../../src","sources":["modules/openid/refresh/registery.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export let RefreshStatus = /*#__PURE__*/function (RefreshStatus) {
|
|
2
|
+
RefreshStatus["Valid"] = "valid";
|
|
3
|
+
RefreshStatus["Invalid"] = "invalid";
|
|
4
|
+
RefreshStatus["Error"] = "error";
|
|
5
|
+
return RefreshStatus;
|
|
6
|
+
}({});
|
|
7
|
+
export let OpenIDCustomNotificationType = /*#__PURE__*/function (OpenIDCustomNotificationType) {
|
|
8
|
+
OpenIDCustomNotificationType["CredentialReplacementAvailable"] = "CustomNotificationOpenIDCredential";
|
|
9
|
+
return OpenIDCustomNotificationType;
|
|
10
|
+
}({});
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["RefreshStatus","OpenIDCustomNotificationType"],"sourceRoot":"../../../../../src","sources":["modules/openid/refresh/types.ts"],"mappings":"AAmBA,WAAYA,aAAa,0BAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAA,OAAbA,aAAa;AAAA;AAoDzB,WAAYC,4BAA4B,0BAA5BA,4BAA4B;EAA5BA,4BAA4B;EAAA,OAA5BA,4BAA4B;AAAA","ignoreList":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// modules/openid/refresh/verifyCredentialStatus.ts
|
|
2
|
+
|
|
3
|
+
import { getListFromStatusListJWT, getStatusListFromJWT } from '@sd-jwt/jwt-status-list';
|
|
4
|
+
/**
|
|
5
|
+
* Verifies credential status for Sd-JWT credentials using status lists.
|
|
6
|
+
* Non–Sd-JWT credentials (W3C jwt_vc_json without status list, or mdoc) are treated as valid here.
|
|
7
|
+
* Returns true if valid; false if revoked/invalid or on error.
|
|
8
|
+
*/
|
|
9
|
+
export async function verifyCredentialStatus(rec, logger) {
|
|
10
|
+
try {
|
|
11
|
+
// Only Sd-JWT creds have compactSdJwtVc in this codebase
|
|
12
|
+
if (!('compactSdJwtVc' in rec)) return true;
|
|
13
|
+
logger === null || logger === void 0 || logger.info(`[Verifier] Verifying credential status for Sd-JWT credential: ${rec.id}`);
|
|
14
|
+
const ref = getStatusListFromJWT(rec.compactSdJwtVc);
|
|
15
|
+
const res = await fetch(ref.uri);
|
|
16
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
17
|
+
const jwt = await res.text();
|
|
18
|
+
const list = getListFromStatusListJWT(jwt);
|
|
19
|
+
const ok = list.getStatus(ref.idx) === 0;
|
|
20
|
+
logger === null || logger === void 0 || logger.info(`${ok ? '✅' : '❌'} [Verifier] ${rec.id} → ${ok ? 'valid' : 'revoked'}`);
|
|
21
|
+
return ok;
|
|
22
|
+
} catch (e) {
|
|
23
|
+
var _logger$error;
|
|
24
|
+
logger === null || logger === void 0 || (_logger$error = logger.error) === null || _logger$error === void 0 || _logger$error.call(logger, `💥 [Verifier] ${'id' in rec ? rec.id : 'unknown'} verify failed: ${String(e)}`);
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=verifyCredentialStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getListFromStatusListJWT","getStatusListFromJWT","verifyCredentialStatus","rec","logger","info","id","ref","compactSdJwtVc","res","fetch","uri","ok","Error","status","jwt","text","list","getStatus","idx","e","_logger$error","error","call","String"],"sourceRoot":"../../../../../src","sources":["modules/openid/refresh/verifyCredentialStatus.ts"],"mappings":"AAAA;;AAEA,SAASA,wBAAwB,EAAEC,oBAAoB,QAAQ,yBAAyB;AAKxF;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,sBAAsBA,CAACC,GAAY,EAAEC,MAAqB,EAAoB;EAClG,IAAI;IACF;IACA,IAAI,EAAE,gBAAgB,IAAID,GAAG,CAAC,EAAE,OAAO,IAAI;IAE3CC,MAAM,aAANA,MAAM,eAANA,MAAM,CAAEC,IAAI,CAAC,iEAAiEF,GAAG,CAACG,EAAE,EAAE,CAAC;IAEvF,MAAMC,GAAG,GAAGN,oBAAoB,CAACE,GAAG,CAACK,cAAc,CAAC;IACpD,MAAMC,GAAG,GAAG,MAAMC,KAAK,CAACH,GAAG,CAACI,GAAG,CAAC;IAChC,IAAI,CAACF,GAAG,CAACG,EAAE,EAAE,MAAM,IAAIC,KAAK,CAAC,QAAQJ,GAAG,CAACK,MAAM,EAAE,CAAC;IAClD,MAAMC,GAAG,GAAG,MAAMN,GAAG,CAACO,IAAI,CAAC,CAAC;IAE5B,MAAMC,IAAI,GAAGjB,wBAAwB,CAACe,GAAG,CAAC;IAC1C,MAAMH,EAAE,GAAGK,IAAI,CAACC,SAAS,CAACX,GAAG,CAACY,GAAG,CAAC,KAAK,CAAC;IAExCf,MAAM,aAANA,MAAM,eAANA,MAAM,CAAEC,IAAI,CAAC,GAAGO,EAAE,GAAG,GAAG,GAAG,GAAG,eAAeT,GAAG,CAACG,EAAE,MAAMM,EAAE,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC;IACpF,OAAOA,EAAE;EACX,CAAC,CAAC,OAAOQ,CAAC,EAAE;IAAA,IAAAC,aAAA;IACVjB,MAAM,aAANA,MAAM,gBAAAiB,aAAA,GAANjB,MAAM,CAAEkB,KAAK,cAAAD,aAAA,eAAbA,aAAA,CAAAE,IAAA,CAAAnB,MAAM,EAAU,iBAAiB,IAAI,IAAID,GAAG,GAAGA,GAAG,CAACG,EAAE,GAAG,SAAS,mBAAmBkB,MAAM,CAACJ,CAAC,CAAC,EAAE,CAAC;IAChG,OAAO,KAAK;EACd;AACF","ignoreList":[]}
|
|
@@ -7,6 +7,7 @@ import CommonRemoveModal from '../../../components/modals/CommonRemoveModal';
|
|
|
7
7
|
import Record from '../../../components/record/Record';
|
|
8
8
|
import { EventTypes } from '../../../constants';
|
|
9
9
|
import { useTheme } from '../../../contexts/theme';
|
|
10
|
+
import { TOKENS, useServices } from '../../../container-api';
|
|
10
11
|
import ScreenLayout from '../../../layout/ScreenLayout';
|
|
11
12
|
import CredentialOfferAccept from '../../../screens/CredentialOfferAccept';
|
|
12
13
|
import { BifoldError } from '../../../types/error';
|
|
@@ -16,6 +17,10 @@ import { testIdWithKey } from '../../../utils/testable';
|
|
|
16
17
|
import OpenIDCredentialCard from '../components/OpenIDCredentialCard';
|
|
17
18
|
import { useOpenIDCredentials } from '../context/OpenIDCredentialRecordProvider';
|
|
18
19
|
import { getCredentialForDisplay } from '../display';
|
|
20
|
+
import { NotificationEventType, useOpenId4VciNotifications } from '../notification';
|
|
21
|
+
import { temporaryMetaVanillaObject } from '../metadata';
|
|
22
|
+
import { useAcceptReplacement } from '../hooks/useAcceptReplacement';
|
|
23
|
+
import { useDeclineReplacement } from '../hooks/useDeclineReplacement';
|
|
19
24
|
const OpenIDCredentialOffer = ({
|
|
20
25
|
navigation,
|
|
21
26
|
route
|
|
@@ -24,6 +29,7 @@ const OpenIDCredentialOffer = ({
|
|
|
24
29
|
const {
|
|
25
30
|
credential
|
|
26
31
|
} = route.params;
|
|
32
|
+
const [logger] = useServices([TOKENS.UTIL_LOGGER]);
|
|
27
33
|
const credentialDisplay = getCredentialForDisplay(credential);
|
|
28
34
|
const {
|
|
29
35
|
display
|
|
@@ -41,12 +47,22 @@ const OpenIDCredentialOffer = ({
|
|
|
41
47
|
agent
|
|
42
48
|
} = useAgent();
|
|
43
49
|
const {
|
|
44
|
-
storeCredential,
|
|
45
50
|
resolveBundleForCredential
|
|
46
51
|
} = useOpenIDCredentials();
|
|
52
|
+
const {
|
|
53
|
+
sendOpenId4VciNotification
|
|
54
|
+
} = useOpenId4VciNotifications();
|
|
47
55
|
const [isRemoveModalDisplayed, setIsRemoveModalDisplayed] = useState(false);
|
|
48
56
|
const [buttonsVisible, setButtonsVisible] = useState(true);
|
|
49
57
|
const [acceptModalVisible, setAcceptModalVisible] = useState(false);
|
|
58
|
+
const {
|
|
59
|
+
acceptNewCredential
|
|
60
|
+
} = useAcceptReplacement();
|
|
61
|
+
const {
|
|
62
|
+
declineByNewId
|
|
63
|
+
} = useDeclineReplacement({
|
|
64
|
+
logger: logger
|
|
65
|
+
});
|
|
50
66
|
const [overlay, setOverlay] = useState({
|
|
51
67
|
bundle: undefined,
|
|
52
68
|
presentationFields: [],
|
|
@@ -80,17 +96,38 @@ const OpenIDCredentialOffer = ({
|
|
|
80
96
|
const toggleDeclineModalVisible = () => setIsRemoveModalDisplayed(!isRemoveModalDisplayed);
|
|
81
97
|
const handleDeclineTouched = async () => {
|
|
82
98
|
var _navigation$getParent;
|
|
99
|
+
await handleSendNotification(NotificationEventType.CREDENTIAL_DELETED);
|
|
100
|
+
await declineByNewId(credential.id);
|
|
83
101
|
toggleDeclineModalVisible();
|
|
84
102
|
(_navigation$getParent = navigation.getParent()) === null || _navigation$getParent === void 0 || _navigation$getParent.navigate(TabStacks.HomeStack, {
|
|
85
103
|
screen: Screens.Home
|
|
86
104
|
});
|
|
87
105
|
};
|
|
106
|
+
const handleSendNotification = async notificationEventType => {
|
|
107
|
+
try {
|
|
108
|
+
var _temporaryMetaVanilla, _temporaryMetaVanilla2, _temporaryMetaVanilla3;
|
|
109
|
+
if ((_temporaryMetaVanilla = temporaryMetaVanillaObject.notificationMetadata) !== null && _temporaryMetaVanilla !== void 0 && _temporaryMetaVanilla.notificationId && (_temporaryMetaVanilla2 = temporaryMetaVanillaObject.notificationMetadata) !== null && _temporaryMetaVanilla2 !== void 0 && _temporaryMetaVanilla2.notificationEndpoint && (_temporaryMetaVanilla3 = temporaryMetaVanillaObject.tokenResponse) !== null && _temporaryMetaVanilla3 !== void 0 && _temporaryMetaVanilla3.accessToken) {
|
|
110
|
+
var _temporaryMetaVanilla4, _temporaryMetaVanilla5, _temporaryMetaVanilla6;
|
|
111
|
+
await sendOpenId4VciNotification({
|
|
112
|
+
accessToken: (_temporaryMetaVanilla4 = temporaryMetaVanillaObject.tokenResponse) === null || _temporaryMetaVanilla4 === void 0 ? void 0 : _temporaryMetaVanilla4.accessToken,
|
|
113
|
+
notificationEvent: notificationEventType,
|
|
114
|
+
notificationMetadata: {
|
|
115
|
+
notificationId: temporaryMetaVanillaObject === null || temporaryMetaVanillaObject === void 0 || (_temporaryMetaVanilla5 = temporaryMetaVanillaObject.notificationMetadata) === null || _temporaryMetaVanilla5 === void 0 ? void 0 : _temporaryMetaVanilla5.notificationId,
|
|
116
|
+
notificationEndpoint: temporaryMetaVanillaObject === null || temporaryMetaVanillaObject === void 0 || (_temporaryMetaVanilla6 = temporaryMetaVanillaObject.notificationMetadata) === null || _temporaryMetaVanilla6 === void 0 ? void 0 : _temporaryMetaVanilla6.notificationEndpoint
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
} catch (err) {
|
|
121
|
+
logger.error('[Credential Offer] error sending notification');
|
|
122
|
+
}
|
|
123
|
+
};
|
|
88
124
|
const handleAcceptTouched = async () => {
|
|
89
125
|
if (!agent) {
|
|
90
126
|
return;
|
|
91
127
|
}
|
|
92
128
|
try {
|
|
93
|
-
await
|
|
129
|
+
await acceptNewCredential(credential);
|
|
130
|
+
await handleSendNotification(NotificationEventType.CREDENTIAL_ACCEPTED);
|
|
94
131
|
setAcceptModalVisible(true);
|
|
95
132
|
} catch (err) {
|
|
96
133
|
setButtonsVisible(true);
|