@sphereon/oid4vci-common
Version:
OpenID 4 Verifiable Credential Issuance Common Types
80 lines (64 loc) • 4.01 kB
text/typescript
import { AssertedUniformCredentialOffer } from './CredentialIssuance.types';
import { CredentialDataSupplierInput, NotificationRequest, StatusListOpts } from './Generic.types';
export interface StateType {
createdAt: number;
expiresAt?: number;
}
export interface CredentialOfferSession extends StateType {
clientId?: string;
credentialOffer: AssertedUniformCredentialOffer;
credentialDataSupplierInput?: CredentialDataSupplierInput; // Optional storage that can help the credential Data Supplier. For instance to store credential input data during offer creation, if no additional data can be supplied later on
txCode?: string; // in here we only store the txCode, previously < V13 this was the userPin. We map the userPin onto this value
status: IssueStatus;
error?: string;
lastUpdatedAt: number;
notification_id: string;
notification?: NotificationRequest;
issuerState?: string; //todo: Probably good to hash it here, since it would come in from the client and we could match the hash and thus use the client value
preAuthorizedCode?: string; //todo: Probably good to hash it here, since it would come in from the client and we could match the hash and thus use the client value
authorizationCode?: string;
redirectUri?: string;
statusLists?: Array<StatusListOpts>;
}
export enum IssueStatus {
OFFER_CREATED = 'OFFER_CREATED', // An offer is created. This is the initial state
ACCESS_TOKEN_REQUESTED = 'ACCESS_TOKEN_REQUESTED', // Optional state, given the token endpoint could also be on a separate AS
ACCESS_TOKEN_CREATED = 'ACCESS_TOKEN_CREATED', // Optional state, given the token endpoint could also be on a separate AS
CREDENTIAL_REQUEST_RECEIVED = 'CREDENTIAL_REQUEST_RECEIVED', // Credential request received. Next state would either be error or issued
CREDENTIAL_ISSUED = 'CREDENTIAL_ISSUED', // The credential iss issued from the issuer's perspective
NOTIFICATION_CREDENTIAL_ACCEPTED = 'NOTIFICATION_CREDENTIAL_ACCEPTED', // The holder/user stored the credential in the wallet (If notifications are enabled)
NOTIFICATION_CREDENTIAL_DELETED = 'NOTIFICATION_CREDENTIAL_DELETED', // The holder/user did not store the credential in the wallet (If notifications are enabled)
NOTIFICATION_CREDENTIAL_FAILURE = 'NOTIFICATION_CREDENTIAL_FAILURE', // The holder/user encountered an error (If notifications are enabled)
ERROR = 'ERROR', // An error occurred
}
export interface CNonceState extends StateType {
cNonce: string;
issuerState?: string;
preAuthorizedCode?: string; //todo: Probably good to hash it here, since it would come in from the client and we could match the hash and thus use the client value
}
export interface URIState extends StateType {
issuerState?: string; //todo: Probably good to hash it here, since it would come in from the client and we could match the hash and thus use the client value
preAuthorizedCode?: string; //todo: Probably good to hash it here, since it would come in from the client and we could match the hash and thus use the client value
uri: string; //todo: Probably good to hash it here, since it would come in from the client and we could match the hash and thus use the client value
correlationId?: string;
}
export interface IssueStatusResponse {
createdAt: number;
lastUpdatedAt: number;
expiresAt?: number;
status: IssueStatus;
error?: string;
clientId?: string;
statusLists?: Array<StatusListOpts>;
}
export interface IStateManager<T extends StateType> {
set(id: string, stateValue: T): Promise<void>;
get(id: string): Promise<T | undefined>;
has(id: string): Promise<boolean>;
delete(id: string): Promise<boolean>;
clearExpired(timestamp?: number): Promise<void>; // clears all expired states compared against timestamp if provided, otherwise current timestamp
clearAll(): Promise<void>; // clears all states
getAsserted(id: string): Promise<T>;
startCleanupRoutine(timeout?: number): Promise<void>;
stopCleanupRoutine(): Promise<void>;
}