Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | /** Custom-field `field_type` used for software passkeys. */ export const PASSKEY_CUSTOM_FIELD_TYPE = 'passkey'; /** Fixed label for passkey custom fields (hide in credential editors). */ export const PASSKEY_CUSTOM_FIELD_LABEL = 'Passkey'; function isNonEmptyString(value) { return typeof value === 'string' && value.length > 0; } /** * Type guard for a parsed passkey payload (object form). */ export function isPasskeyData(value) { if (value === null || typeof value !== 'object') { return false; } const data = value; return data.v === 1 && isNonEmptyString(data.domain) && isNonEmptyString(data.credentialId) && typeof data.userName === 'string' && typeof data.userDisplayName === 'string' && isNonEmptyString(data.userId) && isNonEmptyString(data.key) && (data.rpId === undefined || typeof data.rpId === 'string'); } /** * Normalize a custom-field value that may be a PasskeyData object or a JSON string. */ export function parsePasskeyValue(value) { let candidate = value; if (typeof candidate === 'string') { try { candidate = JSON.parse(candidate); } catch { return null; } } return isPasskeyData(candidate) ? candidate : null; } /** * True when the custom field is a secret passkey field with a valid v1 payload. */ export function isPasskeyCustomField(field) { if (!field || field.field_type !== PASSKEY_CUSTOM_FIELD_TYPE || field.secret !== true) { return false; } return parsePasskeyValue(field.value) !== null; } /** * Build a secret passkey custom field ready to store on a credential. * @throws Error when `passkey` is not a valid {@link PasskeyData} v1 object */ export function createPasskeyCustomField(passkey) { if (!isPasskeyData(passkey)) { throw new Error('Invalid passkey data: expected a complete PasskeyData v1 object'); } return { label: PASSKEY_CUSTOM_FIELD_LABEL, secret: true, field_type: PASSKEY_CUSTOM_FIELD_TYPE, value: { ...passkey } }; } |