@sphereon/oid4vci-common
Version:
OpenID 4 Verifiable Credential Issuance Common Types
53 lines (42 loc) • 1.73 kB
text/typescript
import { CredentialFormat } from '@sphereon/ssi-types';
import { OID4VCICredentialFormat, OpenId4VCIVersion } from '../types';
export function isFormat<T extends { format?: OID4VCICredentialFormat }, Format extends OID4VCICredentialFormat>(
formatObject: T,
format: Format,
): formatObject is T & { format: Format } {
return formatObject.format === format;
}
export function isNotFormat<T extends { format?: OID4VCICredentialFormat }, Format extends OID4VCICredentialFormat>(
formatObject: T,
format: Format,
): formatObject is T & { format: Exclude<OID4VCICredentialFormat, Format> } {
return formatObject.format !== format;
}
const isUniformFormat = (format: string): format is OID4VCICredentialFormat => {
return ['jwt_vc_json', 'jwt_vc_json-ld', 'ldp_vc', 'vc+sd-jwt', 'mso_mdoc'].includes(format);
};
export function getUniformFormat(format: string | OID4VCICredentialFormat | CredentialFormat): OID4VCICredentialFormat {
// Already valid format
if (isUniformFormat(format)) {
return format;
}
// Older formats
if (format.toLocaleLowerCase() === 'jwt_vc' || format.toLocaleLowerCase() === 'jwt') {
return 'jwt_vc';
}
if (format === 'ldp_vc' || format === 'ldp') {
return 'ldp_vc';
}
throw new Error(`Invalid format: ${format}`);
}
export function getFormatForVersion(format: string, version: OpenId4VCIVersion) {
const uniformFormat = isUniformFormat(format) ? format : getUniformFormat(format);
if (version === OpenId4VCIVersion.VER_1_0_08) {
if (uniformFormat === 'jwt_vc_json') {
return 'jwt_vc' as const;
} else if (uniformFormat === 'ldp_vc' || uniformFormat === 'jwt_vc_json-ld') {
return 'ldp_vc' as const;
}
}
return uniformFormat;
}