@learncard/vc-plugin 1.5.12 → 1.6.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/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/refreshCredential.d.ts +13 -0
- package/dist/refreshCredential.d.ts.map +1 -0
- package/dist/refreshCredential.fetch.d.ts +13 -0
- package/dist/refreshCredential.fetch.d.ts.map +1 -0
- package/dist/refreshCredential.fetch.test.d.ts +2 -0
- package/dist/refreshCredential.fetch.test.d.ts.map +1 -0
- package/dist/refreshCredential.test.d.ts +2 -0
- package/dist/refreshCredential.test.d.ts.map +1 -0
- package/dist/types.d.ts +32 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/vc-plugin.cjs.development.cjs +626 -1
- package/dist/vc-plugin.cjs.development.cjs.map +4 -4
- package/dist/vc-plugin.cjs.production.min.cjs +1 -1
- package/dist/vc-plugin.cjs.production.min.cjs.map +4 -4
- package/dist/vc-plugin.esm.js +635 -1
- package/dist/vc-plugin.esm.js.map +4 -4
- package/dist/vc.d.ts.map +1 -1
- package/package.json +5 -4
- package/src/index.ts +1 -0
- package/src/refreshCredential.fetch.test.ts +110 -0
- package/src/refreshCredential.fetch.ts +159 -0
- package/src/refreshCredential.test.ts +1144 -0
- package/src/refreshCredential.ts +931 -0
- package/src/types.ts +36 -0
- package/src/vc.ts +2 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../../../../node_modules/multiformats/vendor/base-x.js", "../../../../node_modules/multiformats/src/bytes.js", "../../../../node_modules/multiformats/src/bases/base.js", "../../../../node_modules/multiformats/src/bases/base58.js", "../../../../node_modules/multiformats/src/bases/base64.js", "../src/helpers.ts", "../src/issueCredential.ts", "../src/verifyCredential.ts", "../src/issuePresentation.ts", "../src/verifyPresentation.ts", "../src/vc.ts"],
|
|
4
|
-
"sourcesContent": ["export { getVCPlugin } from './vc';\nexport * from './types';\n", "// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\nfunction base (ALPHABET, name) {\n if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\n var BASE_MAP = new Uint8Array(256);\n for (var j = 0; j < BASE_MAP.length; j++) {\n BASE_MAP[j] = 255;\n }\n for (var i = 0; i < ALPHABET.length; i++) {\n var x = ALPHABET.charAt(i);\n var xc = x.charCodeAt(0);\n if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\n BASE_MAP[xc] = i;\n }\n var BASE = ALPHABET.length;\n var LEADER = ALPHABET.charAt(0);\n var FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n var iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n function encode (source) {\n if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {\n source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n } else if (Array.isArray(source)) {\n source = Uint8Array.from(source);\n }\n if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }\n if (source.length === 0) { return '' }\n // Skip & count leading zeroes.\n var zeroes = 0;\n var length = 0;\n var pbegin = 0;\n var pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n var size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n var b58 = new Uint8Array(size);\n // Process the bytes.\n while (pbegin !== pend) {\n var carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n var i = 0;\n for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = (carry % BASE) >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n var it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n var str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }\n return str\n }\n function decodeUnsafe (source) {\n if (typeof source !== 'string') { throw new TypeError('Expected String') }\n if (source.length === 0) { return new Uint8Array() }\n var psz = 0;\n // Skip leading spaces.\n if (source[psz] === ' ') { return }\n // Skip and count leading '1's.\n var zeroes = 0;\n var length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n var size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.\n var b256 = new Uint8Array(size);\n // Process the characters.\n while (source[psz]) {\n // Decode character\n var carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) { return }\n var i = 0;\n for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = (carry % 256) >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n psz++;\n }\n // Skip trailing spaces.\n if (source[psz] === ' ') { return }\n // Skip leading zeroes in b256.\n var it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n var vch = new Uint8Array(zeroes + (size - it4));\n var j = zeroes;\n while (it4 !== size) {\n vch[j++] = b256[it4++];\n }\n return vch\n }\n function decode (string) {\n var buffer = decodeUnsafe(string);\n if (buffer) { return buffer }\n throw new Error(`Non-${name} character`)\n }\n return {\n encode: encode,\n decodeUnsafe: decodeUnsafe,\n decode: decode\n }\n}\nvar src = base;\n\nvar _brrp__multiformats_scope_baseX = src;\n\nexport default _brrp__multiformats_scope_baseX;\n", "const empty = new Uint8Array(0)\n\n/**\n * @param {Uint8Array} d\n */\nconst toHex = d => d.reduce((hex, byte) => hex + byte.toString(16).padStart(2, '0'), '')\n\n/**\n * @param {string} hex\n */\nconst fromHex = hex => {\n const hexes = hex.match(/../g)\n return hexes ? new Uint8Array(hexes.map(b => parseInt(b, 16))) : empty\n}\n\n/**\n * @param {Uint8Array} aa\n * @param {Uint8Array} bb\n */\nconst equals = (aa, bb) => {\n if (aa === bb) return true\n if (aa.byteLength !== bb.byteLength) {\n return false\n }\n\n for (let ii = 0; ii < aa.byteLength; ii++) {\n if (aa[ii] !== bb[ii]) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @param {ArrayBufferView|ArrayBuffer|Uint8Array} o\n * @returns {Uint8Array}\n */\nconst coerce = o => {\n if (o instanceof Uint8Array && o.constructor.name === 'Uint8Array') return o\n if (o instanceof ArrayBuffer) return new Uint8Array(o)\n if (ArrayBuffer.isView(o)) {\n return new Uint8Array(o.buffer, o.byteOffset, o.byteLength)\n }\n throw new Error('Unknown type, must be binary type')\n}\n\n/**\n * @param {any} o\n * @returns {o is ArrayBuffer|ArrayBufferView}\n */\nconst isBinary = o =>\n o instanceof ArrayBuffer || ArrayBuffer.isView(o)\n\n/**\n * @param {string} str\n * @returns {Uint8Array}\n */\nconst fromString = str => (new TextEncoder()).encode(str)\n\n/**\n * @param {Uint8Array} b\n * @returns {string}\n */\nconst toString = b => (new TextDecoder()).decode(b)\n\nexport { equals, coerce, isBinary, fromHex, toHex, fromString, toString, empty }\n", "import basex from '../../vendor/base-x.js'\nimport { coerce } from '../bytes.js'\n// Linter can't see that API is used in types.\n// eslint-disable-next-line\nimport * as API from './interface.js'\n\n/**\n * Class represents both BaseEncoder and MultibaseEncoder meaning it\n * can be used to encode to multibase or base encode without multibase\n * prefix.\n *\n * @class\n * @template {string} Base\n * @template {string} Prefix\n * @implements {API.MultibaseEncoder<Prefix>}\n * @implements {API.BaseEncoder}\n */\nclass Encoder {\n /**\n * @param {Base} name\n * @param {Prefix} prefix\n * @param {(bytes:Uint8Array) => string} baseEncode\n */\n constructor (name, prefix, baseEncode) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n }\n\n /**\n * @param {Uint8Array} bytes\n * @returns {API.Multibase<Prefix>}\n */\n encode (bytes) {\n if (bytes instanceof Uint8Array) {\n return `${this.prefix}${this.baseEncode(bytes)}`\n } else {\n throw Error('Unknown type, must be binary type')\n }\n }\n}\n\n/**\n * @template {string} Prefix\n */\n/**\n * Class represents both BaseDecoder and MultibaseDecoder so it could be used\n * to decode multibases (with matching prefix) or just base decode strings\n * with corresponding base encoding.\n *\n * @class\n * @template {string} Base\n * @template {string} Prefix\n * @implements {API.MultibaseDecoder<Prefix>}\n * @implements {API.UnibaseDecoder<Prefix>}\n * @implements {API.BaseDecoder}\n */\nclass Decoder {\n /**\n * @param {Base} name\n * @param {Prefix} prefix\n * @param {(text:string) => Uint8Array} baseDecode\n */\n constructor (name, prefix, baseDecode) {\n this.name = name\n this.prefix = prefix\n /* c8 ignore next 3 */\n if (prefix.codePointAt(0) === undefined) {\n throw new Error('Invalid prefix character')\n }\n /** @private */\n this.prefixCodePoint = /** @type {number} */ (prefix.codePointAt(0))\n this.baseDecode = baseDecode\n }\n\n /**\n * @param {string} text\n */\n decode (text) {\n if (typeof text === 'string') {\n if (text.codePointAt(0) !== this.prefixCodePoint) {\n throw Error(`Unable to decode multibase string ${JSON.stringify(text)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`)\n }\n return this.baseDecode(text.slice(this.prefix.length))\n } else {\n throw Error('Can only multibase decode strings')\n }\n }\n\n /**\n * @template {string} OtherPrefix\n * @param {API.UnibaseDecoder<OtherPrefix>|ComposedDecoder<OtherPrefix>} decoder\n * @returns {ComposedDecoder<Prefix|OtherPrefix>}\n */\n or (decoder) {\n return or(this, decoder)\n }\n}\n\n/**\n * @template {string} Prefix\n * @typedef {Record<Prefix, API.UnibaseDecoder<Prefix>>} Decoders\n */\n\n/**\n * @template {string} Prefix\n * @implements {API.MultibaseDecoder<Prefix>}\n * @implements {API.CombobaseDecoder<Prefix>}\n */\nclass ComposedDecoder {\n /**\n * @param {Decoders<Prefix>} decoders\n */\n constructor (decoders) {\n this.decoders = decoders\n }\n\n /**\n * @template {string} OtherPrefix\n * @param {API.UnibaseDecoder<OtherPrefix>|ComposedDecoder<OtherPrefix>} decoder\n * @returns {ComposedDecoder<Prefix|OtherPrefix>}\n */\n or (decoder) {\n return or(this, decoder)\n }\n\n /**\n * @param {string} input\n * @returns {Uint8Array}\n */\n decode (input) {\n const prefix = /** @type {Prefix} */ (input[0])\n const decoder = this.decoders[prefix]\n if (decoder) {\n return decoder.decode(input)\n } else {\n throw RangeError(`Unable to decode multibase string ${JSON.stringify(input)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)\n }\n }\n}\n\n/**\n * @template {string} L\n * @template {string} R\n * @param {API.UnibaseDecoder<L>|API.CombobaseDecoder<L>} left\n * @param {API.UnibaseDecoder<R>|API.CombobaseDecoder<R>} right\n * @returns {ComposedDecoder<L|R>}\n */\nexport const or = (left, right) => new ComposedDecoder(/** @type {Decoders<L|R>} */({\n ...(left.decoders || { [/** @type API.UnibaseDecoder<L> */(left).prefix]: left }),\n ...(right.decoders || { [/** @type API.UnibaseDecoder<R> */(right).prefix]: right })\n}))\n\n/**\n * @class\n * @template {string} Base\n * @template {string} Prefix\n * @implements {API.MultibaseCodec<Prefix>}\n * @implements {API.MultibaseEncoder<Prefix>}\n * @implements {API.MultibaseDecoder<Prefix>}\n * @implements {API.BaseCodec}\n * @implements {API.BaseEncoder}\n * @implements {API.BaseDecoder}\n */\nexport class Codec {\n /**\n * @param {Base} name\n * @param {Prefix} prefix\n * @param {(bytes:Uint8Array) => string} baseEncode\n * @param {(text:string) => Uint8Array} baseDecode\n */\n constructor (name, prefix, baseEncode, baseDecode) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n this.baseDecode = baseDecode\n this.encoder = new Encoder(name, prefix, baseEncode)\n this.decoder = new Decoder(name, prefix, baseDecode)\n }\n\n /**\n * @param {Uint8Array} input\n */\n encode (input) {\n return this.encoder.encode(input)\n }\n\n /**\n * @param {string} input\n */\n decode (input) {\n return this.decoder.decode(input)\n }\n}\n\n/**\n * @template {string} Base\n * @template {string} Prefix\n * @param {object} options\n * @param {Base} options.name\n * @param {Prefix} options.prefix\n * @param {(bytes:Uint8Array) => string} options.encode\n * @param {(input:string) => Uint8Array} options.decode\n * @returns {Codec<Base, Prefix>}\n */\nexport const from = ({ name, prefix, encode, decode }) =>\n new Codec(name, prefix, encode, decode)\n\n/**\n * @template {string} Base\n * @template {string} Prefix\n * @param {object} options\n * @param {Base} options.name\n * @param {Prefix} options.prefix\n * @param {string} options.alphabet\n * @returns {Codec<Base, Prefix>}\n */\nexport const baseX = ({ prefix, name, alphabet }) => {\n const { encode, decode } = basex(alphabet, name)\n return from({\n prefix,\n name,\n encode,\n /**\n * @param {string} text\n */\n decode: text => coerce(decode(text))\n })\n}\n\n/**\n * @param {string} string\n * @param {string} alphabet\n * @param {number} bitsPerChar\n * @param {string} name\n * @returns {Uint8Array}\n */\nconst decode = (string, alphabet, bitsPerChar, name) => {\n // Build the character lookup table:\n /** @type {Record<string, number>} */\n const codes = {}\n for (let i = 0; i < alphabet.length; ++i) {\n codes[alphabet[i]] = i\n }\n\n // Count the padding bytes:\n let end = string.length\n while (string[end - 1] === '=') {\n --end\n }\n\n // Allocate the output:\n const out = new Uint8Array((end * bitsPerChar / 8) | 0)\n\n // Parse the data:\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n let written = 0 // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = codes[string[i]]\n if (value === undefined) {\n throw new SyntaxError(`Non-${name} character`)\n }\n\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value\n bits += bitsPerChar\n\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8\n out[written++] = 0xff & (buffer >> bits)\n }\n }\n\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || 0xff & (buffer << (8 - bits))) {\n throw new SyntaxError('Unexpected end of data')\n }\n\n return out\n}\n\n/**\n * @param {Uint8Array} data\n * @param {string} alphabet\n * @param {number} bitsPerChar\n * @returns {string}\n */\nconst encode = (data, alphabet, bitsPerChar) => {\n const pad = alphabet[alphabet.length - 1] === '='\n const mask = (1 << bitsPerChar) - 1\n let out = ''\n\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n for (let i = 0; i < data.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | data[i]\n bits += 8\n\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar\n out += alphabet[mask & (buffer >> bits)]\n }\n }\n\n // Partial character:\n if (bits) {\n out += alphabet[mask & (buffer << (bitsPerChar - bits))]\n }\n\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while ((out.length * bitsPerChar) & 7) {\n out += '='\n }\n }\n\n return out\n}\n\n/**\n * RFC4648 Factory\n *\n * @template {string} Base\n * @template {string} Prefix\n * @param {object} options\n * @param {Base} options.name\n * @param {Prefix} options.prefix\n * @param {string} options.alphabet\n * @param {number} options.bitsPerChar\n */\nexport const rfc4648 = ({ name, prefix, bitsPerChar, alphabet }) => {\n return from({\n prefix,\n name,\n encode (input) {\n return encode(input, alphabet, bitsPerChar)\n },\n decode (input) {\n return decode(input, alphabet, bitsPerChar, name)\n }\n })\n}\n", "import { baseX } from './base.js'\n\nexport const base58btc = baseX({\n name: 'base58btc',\n prefix: 'z',\n alphabet: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n})\n\nexport const base58flickr = baseX({\n name: 'base58flickr',\n prefix: 'Z',\n alphabet: '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n})\n", "// @ts-check\n\nimport { rfc4648 } from './base.js'\n\nexport const base64 = rfc4648({\n prefix: 'm',\n name: 'base64',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n bitsPerChar: 6\n})\n\nexport const base64pad = rfc4648({\n prefix: 'M',\n name: 'base64pad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n bitsPerChar: 6\n})\n\nexport const base64url = rfc4648({\n prefix: 'u',\n name: 'base64url',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n bitsPerChar: 6\n})\n\nexport const base64urlpad = rfc4648({\n prefix: 'U',\n name: 'base64urlpad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=',\n bitsPerChar: 6\n})\n", "import { VCImplicitLearnCard } from './types';\nimport { base58btc } from 'multiformats/bases/base58';\nimport { base64url } from 'multiformats/bases/base64';\n\n/**\n * Determines the default verification method to use for a given did by resolving it and looking\n * for a keypair that matches the default keypair for the LearnCard\n */\nexport const getDefaultVerificationMethod = async (\n learnCard: VCImplicitLearnCard,\n issuerDid: string\n) => {\n const kp = learnCard.id.keypair();\n\n if (!kp) {\n throw new Error('Cannot get default verification method: unable to get subject keypair');\n }\n\n const issuerDidDoc = await learnCard.invoke.resolveDid(issuerDid);\n\n const toX = (vm: any): string | undefined => {\n if (!vm || typeof vm === 'string') return undefined;\n if (vm.publicKeyJwk?.x) return vm.publicKeyJwk.x;\n if (vm.publicKeyMultibase) {\n const decoded = base58btc.decode(vm.publicKeyMultibase);\n const ed = decoded[0] === 0xed && decoded[1] === 0x01 ? decoded.slice(2) : decoded;\n return base64url.encode(ed).slice(1);\n }\n if (vm.publicKeyBase58) {\n const ed = base58btc.baseDecode(vm.publicKeyBase58);\n return base64url.encode(ed).slice(1);\n }\n return undefined;\n };\n\n const verificationMethodEntry =\n typeof issuerDidDoc === 'string'\n ? undefined\n : issuerDidDoc?.verificationMethod?.find(entry => toX(entry as any) === kp.x);\n\n const verificationMethod =\n (typeof verificationMethodEntry !== 'string' && verificationMethodEntry?.id) ||\n (await learnCard.invoke.didToVerificationMethod(issuerDid));\n\n return verificationMethod;\n};\n", "import { UnsignedVC } from '@learncard/types';\n\nimport { ProofOptions } from '@learncard/didkit-plugin';\nimport { VCDependentLearnCard, VCImplicitLearnCard } from './types';\nimport { getDefaultVerificationMethod } from './helpers';\n\nexport const issueCredential = (initLearnCard: VCDependentLearnCard) => {\n return async (\n learnCard: VCImplicitLearnCard,\n credential: UnsignedVC,\n signingOptions: Partial<ProofOptions> = {}\n ) => {\n const kp = learnCard.id.keypair();\n\n if (!kp) throw new Error('Cannot issue credential: Could not get subject keypair');\n\n const contexts = Array.isArray(credential['@context'])\n ? credential['@context']\n : [credential['@context']];\n\n const hasV2Context = contexts.some(\n ctx =>\n typeof ctx === 'string' &&\n (ctx.includes('/ns/credentials/v2') || ctx.includes('/credentials/v2'))\n );\n\n // Ed25519Signature2018 is incompatible with credentials v2.\n const proofType =\n hasV2Context && signingOptions.type === 'Ed25519Signature2018'\n ? 'Ed25519Signature2020'\n : signingOptions.type ??\n (signingOptions.proofFormat === 'jwt' ? undefined : 'DataIntegrityProof');\n\n const options: ProofOptions = {\n proofPurpose: 'assertionMethod',\n ...signingOptions,\n ...(proofType ? { type: proofType } : {}),\n };\n\n if (options.type === 'DataIntegrityProof' && !options.cryptosuite) {\n options.cryptosuite = 'eddsa-rdfc-2022';\n }\n\n if (!('verificationMethod' in options)) {\n const issuerDid =\n typeof credential.issuer === 'string' ? credential.issuer : credential.issuer.id!;\n\n options.verificationMethod = await getDefaultVerificationMethod(learnCard, issuerDid);\n }\n\n learnCard.debug?.('Signing with these options', {\n credential,\n options,\n kp,\n });\n\n return initLearnCard.invoke.issueCredential(credential, options, kp);\n };\n};\n", "import { VC } from '@learncard/types';\n\nimport { ProofOptions } from '@learncard/didkit-plugin';\nimport { VCDependentLearnCard, VCImplicitLearnCard } from './types';\n\nexport const verifyCredential = (initLearnCard: VCDependentLearnCard) => {\n return async (\n _learnCard: VCImplicitLearnCard,\n credential: VC,\n _options: Partial<ProofOptions> = {}\n ) => {\n const options: Partial<ProofOptions> = { ..._options };\n\n if (!options.checks) {\n options.checks = ['proof'];\n if (credential.credentialStatus) options.checks.push('credentialStatus');\n if (credential.credentialSchema) options.checks.push('credentialSchema');\n }\n\n return initLearnCard.invoke.verifyCredential(credential, options);\n };\n};\n", "import { UnsignedVP } from '@learncard/types';\n\nimport { ProofOptions } from '@learncard/didkit-plugin';\nimport { VCDependentLearnCard, VCImplicitLearnCard } from './types';\nimport { getDefaultVerificationMethod } from './helpers';\n\nexport const issuePresentation = (initLearnCard: VCDependentLearnCard) => {\n return async (\n learnCard: VCImplicitLearnCard,\n presentation: UnsignedVP,\n signingOptions: Partial<ProofOptions> = {}\n ) => {\n const kp = learnCard.id.keypair();\n\n if (!kp) throw new Error('Cannot issue credential: Could not get subject keypair');\n\n // Check if presentation uses v2 context\n const contexts = Array.isArray(presentation['@context']) \n ? presentation['@context'] \n : [presentation['@context']];\n const hasV2Context = contexts.some(ctx => \n typeof ctx === 'string' && (ctx.includes('/ns/credentials/v2') || ctx.includes('/credentials/v2'))\n );\n\n // For v2 contexts, upgrade Ed25519Signature2018 to Ed25519Signature2020\n // Ed25519Signature2018 is incompatible with credentials v2\n const proofType = hasV2Context && signingOptions.type === 'Ed25519Signature2018'\n ? 'Ed25519Signature2020'\n : signingOptions.type ?? 'Ed25519Signature2020';\n\n const options = {\n ...(signingOptions.proofFormat === 'jwt'\n ? {}\n : { proofPurpose: 'assertionMethod', type: proofType }),\n ...signingOptions,\n };\n\n if (!('verificationMethod' in options)) {\n options.verificationMethod = await getDefaultVerificationMethod(\n learnCard,\n learnCard.id.did()\n );\n }\n\n return initLearnCard.invoke.issuePresentation(presentation, options, kp);\n };\n};\n", "import { VP } from '@learncard/types';\n\nimport { ProofOptions } from '@learncard/didkit-plugin';\nimport { VCDependentLearnCard, VCImplicitLearnCard } from './types';\n\nexport const verifyPresentation = (initLearnCard: VCDependentLearnCard) => {\n return async (\n _learnCard: VCImplicitLearnCard,\n presentation: VP | string,\n options: Partial<ProofOptions> = {}\n ) => {\n return initLearnCard.invoke.verifyPresentation(presentation, options);\n };\n};\n", "import { issueCredential } from './issueCredential';\nimport { verifyCredential } from './verifyCredential';\nimport { issuePresentation } from './issuePresentation';\nimport { verifyPresentation } from './verifyPresentation';\n\nimport { VCDependentLearnCard, VCPlugin } from './types';\nimport { UnsignedVP } from '@learncard/types';\n\n/**\n * @group Plugins\n */\nexport const getVCPlugin = (learnCard: VCDependentLearnCard): VCPlugin => {\n return {\n name: 'VC',\n displayName: 'VC',\n description:\n 'Handles the infrastructure needed to issue and verify credentials and presentations',\n methods: {\n issueCredential: issueCredential(learnCard),\n verifyCredential: verifyCredential(learnCard),\n issuePresentation: issuePresentation(learnCard),\n verifyPresentation: verifyPresentation(learnCard),\n getTestVc: (_learnCard, subject = 'did:example:d23dd687a7dc6787646f2eb98d0') => {\n const did = _learnCard.id.did();\n\n return {\n '@context': ['https://www.w3.org/ns/credentials/v2'],\n id: `urn:uuid:${crypto.randomUUID()}`,\n type: ['VerifiableCredential'],\n issuer: did,\n validFrom: new Date().toISOString(),\n credentialSubject: { id: subject },\n };\n },\n getTestVp: async (_learnCard, _credential) => {\n const credential =\n _credential ||\n (await _learnCard.invoke.issueCredential(_learnCard.invoke.getTestVc()));\n\n const did = _learnCard.id.did();\n\n return {\n '@context': ['https://www.w3.org/ns/credentials/v2'],\n type: ['VerifiablePresentation'],\n holder: did,\n verifiableCredential: credential,\n };\n },\n getDidAuthVp: async (_learnCard, options = {}) => {\n const did = _learnCard.id.did();\n const unsignedVP: UnsignedVP = {\n '@context': ['https://www.w3.org/ns/credentials/v2'],\n type: ['VerifiablePresentation'],\n holder: did,\n };\n\n return _learnCard.invoke.issuePresentation(unsignedVP, {\n proofPurpose: 'authentication',\n ...options,\n });\n },\n },\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["index_exports", "__export", "getVCPlugin", "__toCommonJS", "base", "ALPHABET", "name", "BASE_MAP", "j", "i", "x", "xc", "BASE", "LEADER", "FACTOR", "iFACTOR", "encode", "source", "zeroes", "length", "pbegin", "pend", "size", "b58", "carry", "it1", "it2", "str", "__name", "decodeUnsafe", "psz", "b256", "it3", "it4", "vch", "decode", "string", "buffer", "src", "_brrp__multiformats_scope_baseX", "base_x_default", "empty", "coerce", "__name", "o", "_Encoder", "name", "prefix", "baseEncode", "bytes", "__name", "Encoder", "_Decoder", "baseDecode", "text", "decoder", "or", "Decoder", "_ComposedDecoder", "decoders", "input", "ComposedDecoder", "left", "right", "_Codec", "Codec", "from", "encode", "decode", "baseX", "alphabet", "base_x_default", "coerce", "string", "bitsPerChar", "codes", "i", "end", "out", "bits", "buffer", "written", "value", "data", "pad", "mask", "rfc4648", "base58btc", "baseX", "base58flickr", "base64", "rfc4648", "base64pad", "base64url", "base64urlpad", "getDefaultVerificationMethod", "__name", "learnCard", "issuerDid", "kp", "issuerDidDoc", "toX", "vm", "decoded", "base58btc", "ed", "base64url", "verificationMethodEntry", "entry", "issueCredential", "__name", "initLearnCard", "learnCard", "credential", "signingOptions", "kp", "proofType", "ctx", "options", "issuerDid", "getDefaultVerificationMethod", "verifyCredential", "__name", "initLearnCard", "_learnCard", "credential", "_options", "options", "issuePresentation", "__name", "initLearnCard", "learnCard", "presentation", "signingOptions", "kp", "proofType", "ctx", "options", "getDefaultVerificationMethod", "verifyPresentation", "__name", "initLearnCard", "_learnCard", "presentation", "options", "getVCPlugin", "__name", "learnCard", "issueCredential", "verifyCredential", "issuePresentation", "verifyPresentation", "_learnCard", "subject", "did", "_credential", "credential", "options", "unsignedVP"]
|
|
3
|
+
"sources": ["../src/index.ts", "../../../../node_modules/multiformats/vendor/base-x.js", "../../../../node_modules/multiformats/src/bytes.js", "../../../../node_modules/multiformats/src/bases/base.js", "../../../../node_modules/multiformats/src/bases/base58.js", "../../../../node_modules/multiformats/src/bases/base64.js", "../src/helpers.ts", "../src/issueCredential.ts", "../src/verifyCredential.ts", "../src/issuePresentation.ts", "../src/verifyPresentation.ts", "../src/refreshCredential.ts", "../src/refreshCredential.fetch.ts", "../src/vc.ts"],
|
|
4
|
+
"sourcesContent": ["export { getVCPlugin } from './vc';\nexport { refreshCredential } from './refreshCredential';\nexport * from './types';\n", "// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\nfunction base (ALPHABET, name) {\n if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\n var BASE_MAP = new Uint8Array(256);\n for (var j = 0; j < BASE_MAP.length; j++) {\n BASE_MAP[j] = 255;\n }\n for (var i = 0; i < ALPHABET.length; i++) {\n var x = ALPHABET.charAt(i);\n var xc = x.charCodeAt(0);\n if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\n BASE_MAP[xc] = i;\n }\n var BASE = ALPHABET.length;\n var LEADER = ALPHABET.charAt(0);\n var FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n var iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n function encode (source) {\n if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {\n source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n } else if (Array.isArray(source)) {\n source = Uint8Array.from(source);\n }\n if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }\n if (source.length === 0) { return '' }\n // Skip & count leading zeroes.\n var zeroes = 0;\n var length = 0;\n var pbegin = 0;\n var pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n var size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n var b58 = new Uint8Array(size);\n // Process the bytes.\n while (pbegin !== pend) {\n var carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n var i = 0;\n for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = (carry % BASE) >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n var it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n var str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }\n return str\n }\n function decodeUnsafe (source) {\n if (typeof source !== 'string') { throw new TypeError('Expected String') }\n if (source.length === 0) { return new Uint8Array() }\n var psz = 0;\n // Skip leading spaces.\n if (source[psz] === ' ') { return }\n // Skip and count leading '1's.\n var zeroes = 0;\n var length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n var size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.\n var b256 = new Uint8Array(size);\n // Process the characters.\n while (source[psz]) {\n // Decode character\n var carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) { return }\n var i = 0;\n for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = (carry % 256) >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n psz++;\n }\n // Skip trailing spaces.\n if (source[psz] === ' ') { return }\n // Skip leading zeroes in b256.\n var it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n var vch = new Uint8Array(zeroes + (size - it4));\n var j = zeroes;\n while (it4 !== size) {\n vch[j++] = b256[it4++];\n }\n return vch\n }\n function decode (string) {\n var buffer = decodeUnsafe(string);\n if (buffer) { return buffer }\n throw new Error(`Non-${name} character`)\n }\n return {\n encode: encode,\n decodeUnsafe: decodeUnsafe,\n decode: decode\n }\n}\nvar src = base;\n\nvar _brrp__multiformats_scope_baseX = src;\n\nexport default _brrp__multiformats_scope_baseX;\n", "const empty = new Uint8Array(0)\n\n/**\n * @param {Uint8Array} d\n */\nconst toHex = d => d.reduce((hex, byte) => hex + byte.toString(16).padStart(2, '0'), '')\n\n/**\n * @param {string} hex\n */\nconst fromHex = hex => {\n const hexes = hex.match(/../g)\n return hexes ? new Uint8Array(hexes.map(b => parseInt(b, 16))) : empty\n}\n\n/**\n * @param {Uint8Array} aa\n * @param {Uint8Array} bb\n */\nconst equals = (aa, bb) => {\n if (aa === bb) return true\n if (aa.byteLength !== bb.byteLength) {\n return false\n }\n\n for (let ii = 0; ii < aa.byteLength; ii++) {\n if (aa[ii] !== bb[ii]) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @param {ArrayBufferView|ArrayBuffer|Uint8Array} o\n * @returns {Uint8Array}\n */\nconst coerce = o => {\n if (o instanceof Uint8Array && o.constructor.name === 'Uint8Array') return o\n if (o instanceof ArrayBuffer) return new Uint8Array(o)\n if (ArrayBuffer.isView(o)) {\n return new Uint8Array(o.buffer, o.byteOffset, o.byteLength)\n }\n throw new Error('Unknown type, must be binary type')\n}\n\n/**\n * @param {any} o\n * @returns {o is ArrayBuffer|ArrayBufferView}\n */\nconst isBinary = o =>\n o instanceof ArrayBuffer || ArrayBuffer.isView(o)\n\n/**\n * @param {string} str\n * @returns {Uint8Array}\n */\nconst fromString = str => (new TextEncoder()).encode(str)\n\n/**\n * @param {Uint8Array} b\n * @returns {string}\n */\nconst toString = b => (new TextDecoder()).decode(b)\n\nexport { equals, coerce, isBinary, fromHex, toHex, fromString, toString, empty }\n", "import basex from '../../vendor/base-x.js'\nimport { coerce } from '../bytes.js'\n// Linter can't see that API is used in types.\n// eslint-disable-next-line\nimport * as API from './interface.js'\n\n/**\n * Class represents both BaseEncoder and MultibaseEncoder meaning it\n * can be used to encode to multibase or base encode without multibase\n * prefix.\n *\n * @class\n * @template {string} Base\n * @template {string} Prefix\n * @implements {API.MultibaseEncoder<Prefix>}\n * @implements {API.BaseEncoder}\n */\nclass Encoder {\n /**\n * @param {Base} name\n * @param {Prefix} prefix\n * @param {(bytes:Uint8Array) => string} baseEncode\n */\n constructor (name, prefix, baseEncode) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n }\n\n /**\n * @param {Uint8Array} bytes\n * @returns {API.Multibase<Prefix>}\n */\n encode (bytes) {\n if (bytes instanceof Uint8Array) {\n return `${this.prefix}${this.baseEncode(bytes)}`\n } else {\n throw Error('Unknown type, must be binary type')\n }\n }\n}\n\n/**\n * @template {string} Prefix\n */\n/**\n * Class represents both BaseDecoder and MultibaseDecoder so it could be used\n * to decode multibases (with matching prefix) or just base decode strings\n * with corresponding base encoding.\n *\n * @class\n * @template {string} Base\n * @template {string} Prefix\n * @implements {API.MultibaseDecoder<Prefix>}\n * @implements {API.UnibaseDecoder<Prefix>}\n * @implements {API.BaseDecoder}\n */\nclass Decoder {\n /**\n * @param {Base} name\n * @param {Prefix} prefix\n * @param {(text:string) => Uint8Array} baseDecode\n */\n constructor (name, prefix, baseDecode) {\n this.name = name\n this.prefix = prefix\n /* c8 ignore next 3 */\n if (prefix.codePointAt(0) === undefined) {\n throw new Error('Invalid prefix character')\n }\n /** @private */\n this.prefixCodePoint = /** @type {number} */ (prefix.codePointAt(0))\n this.baseDecode = baseDecode\n }\n\n /**\n * @param {string} text\n */\n decode (text) {\n if (typeof text === 'string') {\n if (text.codePointAt(0) !== this.prefixCodePoint) {\n throw Error(`Unable to decode multibase string ${JSON.stringify(text)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`)\n }\n return this.baseDecode(text.slice(this.prefix.length))\n } else {\n throw Error('Can only multibase decode strings')\n }\n }\n\n /**\n * @template {string} OtherPrefix\n * @param {API.UnibaseDecoder<OtherPrefix>|ComposedDecoder<OtherPrefix>} decoder\n * @returns {ComposedDecoder<Prefix|OtherPrefix>}\n */\n or (decoder) {\n return or(this, decoder)\n }\n}\n\n/**\n * @template {string} Prefix\n * @typedef {Record<Prefix, API.UnibaseDecoder<Prefix>>} Decoders\n */\n\n/**\n * @template {string} Prefix\n * @implements {API.MultibaseDecoder<Prefix>}\n * @implements {API.CombobaseDecoder<Prefix>}\n */\nclass ComposedDecoder {\n /**\n * @param {Decoders<Prefix>} decoders\n */\n constructor (decoders) {\n this.decoders = decoders\n }\n\n /**\n * @template {string} OtherPrefix\n * @param {API.UnibaseDecoder<OtherPrefix>|ComposedDecoder<OtherPrefix>} decoder\n * @returns {ComposedDecoder<Prefix|OtherPrefix>}\n */\n or (decoder) {\n return or(this, decoder)\n }\n\n /**\n * @param {string} input\n * @returns {Uint8Array}\n */\n decode (input) {\n const prefix = /** @type {Prefix} */ (input[0])\n const decoder = this.decoders[prefix]\n if (decoder) {\n return decoder.decode(input)\n } else {\n throw RangeError(`Unable to decode multibase string ${JSON.stringify(input)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)\n }\n }\n}\n\n/**\n * @template {string} L\n * @template {string} R\n * @param {API.UnibaseDecoder<L>|API.CombobaseDecoder<L>} left\n * @param {API.UnibaseDecoder<R>|API.CombobaseDecoder<R>} right\n * @returns {ComposedDecoder<L|R>}\n */\nexport const or = (left, right) => new ComposedDecoder(/** @type {Decoders<L|R>} */({\n ...(left.decoders || { [/** @type API.UnibaseDecoder<L> */(left).prefix]: left }),\n ...(right.decoders || { [/** @type API.UnibaseDecoder<R> */(right).prefix]: right })\n}))\n\n/**\n * @class\n * @template {string} Base\n * @template {string} Prefix\n * @implements {API.MultibaseCodec<Prefix>}\n * @implements {API.MultibaseEncoder<Prefix>}\n * @implements {API.MultibaseDecoder<Prefix>}\n * @implements {API.BaseCodec}\n * @implements {API.BaseEncoder}\n * @implements {API.BaseDecoder}\n */\nexport class Codec {\n /**\n * @param {Base} name\n * @param {Prefix} prefix\n * @param {(bytes:Uint8Array) => string} baseEncode\n * @param {(text:string) => Uint8Array} baseDecode\n */\n constructor (name, prefix, baseEncode, baseDecode) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n this.baseDecode = baseDecode\n this.encoder = new Encoder(name, prefix, baseEncode)\n this.decoder = new Decoder(name, prefix, baseDecode)\n }\n\n /**\n * @param {Uint8Array} input\n */\n encode (input) {\n return this.encoder.encode(input)\n }\n\n /**\n * @param {string} input\n */\n decode (input) {\n return this.decoder.decode(input)\n }\n}\n\n/**\n * @template {string} Base\n * @template {string} Prefix\n * @param {object} options\n * @param {Base} options.name\n * @param {Prefix} options.prefix\n * @param {(bytes:Uint8Array) => string} options.encode\n * @param {(input:string) => Uint8Array} options.decode\n * @returns {Codec<Base, Prefix>}\n */\nexport const from = ({ name, prefix, encode, decode }) =>\n new Codec(name, prefix, encode, decode)\n\n/**\n * @template {string} Base\n * @template {string} Prefix\n * @param {object} options\n * @param {Base} options.name\n * @param {Prefix} options.prefix\n * @param {string} options.alphabet\n * @returns {Codec<Base, Prefix>}\n */\nexport const baseX = ({ prefix, name, alphabet }) => {\n const { encode, decode } = basex(alphabet, name)\n return from({\n prefix,\n name,\n encode,\n /**\n * @param {string} text\n */\n decode: text => coerce(decode(text))\n })\n}\n\n/**\n * @param {string} string\n * @param {string} alphabet\n * @param {number} bitsPerChar\n * @param {string} name\n * @returns {Uint8Array}\n */\nconst decode = (string, alphabet, bitsPerChar, name) => {\n // Build the character lookup table:\n /** @type {Record<string, number>} */\n const codes = {}\n for (let i = 0; i < alphabet.length; ++i) {\n codes[alphabet[i]] = i\n }\n\n // Count the padding bytes:\n let end = string.length\n while (string[end - 1] === '=') {\n --end\n }\n\n // Allocate the output:\n const out = new Uint8Array((end * bitsPerChar / 8) | 0)\n\n // Parse the data:\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n let written = 0 // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = codes[string[i]]\n if (value === undefined) {\n throw new SyntaxError(`Non-${name} character`)\n }\n\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value\n bits += bitsPerChar\n\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8\n out[written++] = 0xff & (buffer >> bits)\n }\n }\n\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || 0xff & (buffer << (8 - bits))) {\n throw new SyntaxError('Unexpected end of data')\n }\n\n return out\n}\n\n/**\n * @param {Uint8Array} data\n * @param {string} alphabet\n * @param {number} bitsPerChar\n * @returns {string}\n */\nconst encode = (data, alphabet, bitsPerChar) => {\n const pad = alphabet[alphabet.length - 1] === '='\n const mask = (1 << bitsPerChar) - 1\n let out = ''\n\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n for (let i = 0; i < data.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | data[i]\n bits += 8\n\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar\n out += alphabet[mask & (buffer >> bits)]\n }\n }\n\n // Partial character:\n if (bits) {\n out += alphabet[mask & (buffer << (bitsPerChar - bits))]\n }\n\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while ((out.length * bitsPerChar) & 7) {\n out += '='\n }\n }\n\n return out\n}\n\n/**\n * RFC4648 Factory\n *\n * @template {string} Base\n * @template {string} Prefix\n * @param {object} options\n * @param {Base} options.name\n * @param {Prefix} options.prefix\n * @param {string} options.alphabet\n * @param {number} options.bitsPerChar\n */\nexport const rfc4648 = ({ name, prefix, bitsPerChar, alphabet }) => {\n return from({\n prefix,\n name,\n encode (input) {\n return encode(input, alphabet, bitsPerChar)\n },\n decode (input) {\n return decode(input, alphabet, bitsPerChar, name)\n }\n })\n}\n", "import { baseX } from './base.js'\n\nexport const base58btc = baseX({\n name: 'base58btc',\n prefix: 'z',\n alphabet: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n})\n\nexport const base58flickr = baseX({\n name: 'base58flickr',\n prefix: 'Z',\n alphabet: '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n})\n", "// @ts-check\n\nimport { rfc4648 } from './base.js'\n\nexport const base64 = rfc4648({\n prefix: 'm',\n name: 'base64',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n bitsPerChar: 6\n})\n\nexport const base64pad = rfc4648({\n prefix: 'M',\n name: 'base64pad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n bitsPerChar: 6\n})\n\nexport const base64url = rfc4648({\n prefix: 'u',\n name: 'base64url',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n bitsPerChar: 6\n})\n\nexport const base64urlpad = rfc4648({\n prefix: 'U',\n name: 'base64urlpad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=',\n bitsPerChar: 6\n})\n", "import { VCImplicitLearnCard } from './types';\nimport { base58btc } from 'multiformats/bases/base58';\nimport { base64url } from 'multiformats/bases/base64';\n\n/**\n * Determines the default verification method to use for a given did by resolving it and looking\n * for a keypair that matches the default keypair for the LearnCard\n */\nexport const getDefaultVerificationMethod = async (\n learnCard: VCImplicitLearnCard,\n issuerDid: string\n) => {\n const kp = learnCard.id.keypair();\n\n if (!kp) {\n throw new Error('Cannot get default verification method: unable to get subject keypair');\n }\n\n const issuerDidDoc = await learnCard.invoke.resolveDid(issuerDid);\n\n const toX = (vm: any): string | undefined => {\n if (!vm || typeof vm === 'string') return undefined;\n if (vm.publicKeyJwk?.x) return vm.publicKeyJwk.x;\n if (vm.publicKeyMultibase) {\n const decoded = base58btc.decode(vm.publicKeyMultibase);\n const ed = decoded[0] === 0xed && decoded[1] === 0x01 ? decoded.slice(2) : decoded;\n return base64url.encode(ed).slice(1);\n }\n if (vm.publicKeyBase58) {\n const ed = base58btc.baseDecode(vm.publicKeyBase58);\n return base64url.encode(ed).slice(1);\n }\n return undefined;\n };\n\n const verificationMethodEntry =\n typeof issuerDidDoc === 'string'\n ? undefined\n : issuerDidDoc?.verificationMethod?.find(entry => toX(entry as any) === kp.x);\n\n const verificationMethod =\n (typeof verificationMethodEntry !== 'string' && verificationMethodEntry?.id) ||\n (await learnCard.invoke.didToVerificationMethod(issuerDid));\n\n return verificationMethod;\n};\n", "import { UnsignedVC } from '@learncard/types';\n\nimport { ProofOptions } from '@learncard/didkit-plugin';\nimport { VCDependentLearnCard, VCImplicitLearnCard } from './types';\nimport { getDefaultVerificationMethod } from './helpers';\n\nexport const issueCredential = (initLearnCard: VCDependentLearnCard) => {\n return async (\n learnCard: VCImplicitLearnCard,\n credential: UnsignedVC,\n signingOptions: Partial<ProofOptions> = {}\n ) => {\n const kp = learnCard.id.keypair();\n\n if (!kp) throw new Error('Cannot issue credential: Could not get subject keypair');\n\n const contexts = Array.isArray(credential['@context'])\n ? credential['@context']\n : [credential['@context']];\n\n const hasV2Context = contexts.some(\n ctx =>\n typeof ctx === 'string' &&\n (ctx.includes('/ns/credentials/v2') || ctx.includes('/credentials/v2'))\n );\n\n // Ed25519Signature2018 is incompatible with credentials v2.\n const proofType =\n hasV2Context && signingOptions.type === 'Ed25519Signature2018'\n ? 'Ed25519Signature2020'\n : signingOptions.type ??\n (signingOptions.proofFormat === 'jwt' ? undefined : 'DataIntegrityProof');\n\n const options: ProofOptions = {\n proofPurpose: 'assertionMethod',\n ...signingOptions,\n ...(proofType ? { type: proofType } : {}),\n };\n\n if (options.type === 'DataIntegrityProof' && !options.cryptosuite) {\n options.cryptosuite = 'eddsa-rdfc-2022';\n }\n\n if (!('verificationMethod' in options)) {\n const issuerDid =\n typeof credential.issuer === 'string' ? credential.issuer : credential.issuer.id!;\n\n options.verificationMethod = await getDefaultVerificationMethod(learnCard, issuerDid);\n }\n\n learnCard.debug?.('Signing with these options', {\n credential,\n options,\n kp,\n });\n\n return initLearnCard.invoke.issueCredential(credential, options, kp);\n };\n};\n", "import { VC } from '@learncard/types';\n\nimport { ProofOptions } from '@learncard/didkit-plugin';\nimport { VCDependentLearnCard, VCImplicitLearnCard } from './types';\n\nexport const verifyCredential = (initLearnCard: VCDependentLearnCard) => {\n return async (\n _learnCard: VCImplicitLearnCard,\n credential: VC,\n _options: Partial<ProofOptions> = {}\n ) => {\n const options: Partial<ProofOptions> = { ..._options };\n\n if (!options.checks) {\n options.checks = ['proof'];\n if (credential.credentialStatus) options.checks.push('credentialStatus');\n if (credential.credentialSchema) options.checks.push('credentialSchema');\n }\n\n return initLearnCard.invoke.verifyCredential(credential, options);\n };\n};\n", "import { UnsignedVP } from '@learncard/types';\n\nimport { ProofOptions } from '@learncard/didkit-plugin';\nimport { VCDependentLearnCard, VCImplicitLearnCard } from './types';\nimport { getDefaultVerificationMethod } from './helpers';\n\nexport const issuePresentation = (initLearnCard: VCDependentLearnCard) => {\n return async (\n learnCard: VCImplicitLearnCard,\n presentation: UnsignedVP,\n signingOptions: Partial<ProofOptions> = {}\n ) => {\n const kp = learnCard.id.keypair();\n\n if (!kp) throw new Error('Cannot issue credential: Could not get subject keypair');\n\n // Check if presentation uses v2 context\n const contexts = Array.isArray(presentation['@context']) \n ? presentation['@context'] \n : [presentation['@context']];\n const hasV2Context = contexts.some(ctx => \n typeof ctx === 'string' && (ctx.includes('/ns/credentials/v2') || ctx.includes('/credentials/v2'))\n );\n\n // For v2 contexts, upgrade Ed25519Signature2018 to Ed25519Signature2020\n // Ed25519Signature2018 is incompatible with credentials v2\n const proofType = hasV2Context && signingOptions.type === 'Ed25519Signature2018'\n ? 'Ed25519Signature2020'\n : signingOptions.type ?? 'Ed25519Signature2020';\n\n const options = {\n ...(signingOptions.proofFormat === 'jwt'\n ? {}\n : { proofPurpose: 'assertionMethod', type: proofType }),\n ...signingOptions,\n };\n\n if (!('verificationMethod' in options)) {\n options.verificationMethod = await getDefaultVerificationMethod(\n learnCard,\n learnCard.id.did()\n );\n }\n\n return initLearnCard.invoke.issuePresentation(presentation, options, kp);\n };\n};\n", "import { VP } from '@learncard/types';\n\nimport { ProofOptions } from '@learncard/didkit-plugin';\nimport { VCDependentLearnCard, VCImplicitLearnCard } from './types';\n\nexport const verifyPresentation = (initLearnCard: VCDependentLearnCard) => {\n return async (\n _learnCard: VCImplicitLearnCard,\n presentation: VP | string,\n options: Partial<ProofOptions> = {}\n ) => {\n return initLearnCard.invoke.verifyPresentation(presentation, options);\n };\n};\n", "import {\n CredentialRefreshChallengeValidator,\n CredentialRefreshFailureCode,\n CredentialRefreshResult,\n JWE,\n JWEValidator,\n VC,\n VCValidator,\n VP,\n} from '@learncard/types';\nimport {\n credentialContentsEqual,\n getCredentialEffectiveTime,\n getCredentialIssuerId,\n getSupportedRefreshService,\n} from '@learncard/helpers';\n\nimport { fetchWithPinnedAddress, type PinnedAddress } from './refreshCredential.fetch';\nimport { RefreshCredentialOptions, VCDependentLearnCard, VCImplicitLearnCard } from './types';\n\n/**\n * Generic holder-side credential refresh primitive (LC-2117, LC-2135, LC-2136).\n *\n * `refreshCredential` fetches a candidate replacement from a credential's\n * `1EdTechCredentialRefresh` (JSON only) or `LearnCardCredentialRefresh2026` service,\n * verifies both the current and candidate\n * proofs, enforces identity stability and non-regressing freshness, and returns a\n * typed result. It performs no storage or index mutation.\n *\n * The generic primitive permits same-issuer-signed changes to credentialStatus and\n * refreshService. It does not pin those fields; applications requiring immutable\n * revocation/refresh handles must enforce that policy. Managed brain-service\n * publication enforces both. Any new endpoint is revalidated on the next refresh.\n *\n * Because `refreshService.id` is credential-controlled input, every request is\n * SSRF-hardened: HTTPS-only by default, private/loopback/link-local destinations are\n * rejected (after DNS resolution in Node runtimes), redirects are followed manually\n * and revalidated, timeouts abort the request, response bytes are counted while\n * streaming, and only JSON VC/JWE representations implemented by the decoder are\n * accepted. DID auth is retried exactly once for the recognized `LearnCardDIDAuth`\n * challenge scheme and is never forwarded across origins.\n */\n\nconst DID_AUTH_SCHEME = 'learncarddidauth';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst HEADER_CHALLENGE_TTL_MS = 300_000;\nconst MAX_TRACKED_CHALLENGES = 1024;\nconst DEFAULT_MAX_REDIRECTS = 3;\nconst DEFAULT_MAX_RESPONSE_BYTES = 1_048_576; // 1 MiB\n\n/** JSON representations implemented by the response decoder */\nconst ACCEPTED_MEDIA_TYPES = new Set([\n 'application/json',\n 'application/ld+json',\n 'application/vc+ld+json',\n 'application/vc-ld+json',\n 'application/jwe+json',\n]);\n\nconst ACCEPT_HEADER = [...ACCEPTED_MEDIA_TYPES].join(', ');\n\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\nconst failed = (\n code: CredentialRefreshFailureCode,\n retryable: boolean\n): CredentialRefreshResult => ({\n status: 'failed',\n code,\n retryable,\n});\n\nconst unsafeEndpoint = () => failed('UNSAFE_ENDPOINT', false);\nconst malformedResponse = () => failed('MALFORMED_RESPONSE', false);\nconst invalidProof = () => failed('INVALID_PROOF', false);\nconst unauthorized = () => failed('UNAUTHORIZED', false);\n// Deliberately fail closed on verifier warnings until each warning is reviewed.\nconst proofVerified = (\n check: { checks: string[]; warnings: string[]; errors: string[] } | null | undefined\n): boolean =>\n !!check &&\n check.errors.length === 0 &&\n check.warnings.length === 0 &&\n check.checks.includes('proof');\n\ntype ResolvedRefreshOptions = {\n etag?: string;\n timeoutMs: number;\n maxRedirects: number;\n maxResponseBytes: number;\n allowInsecureHttp: boolean;\n allowPrivateAddresses: boolean;\n resolveHost?: (hostname: string) => Promise<string[]>;\n};\n\n// --- SSRF guards --------------------------------------------------------------\n\nconst parseIPv4Octets = (ip: string): [number, number, number, number] | undefined => {\n const parts = ip.split('.');\n\n if (\n parts.length !== 4 ||\n parts.some(part => !/^\\d{1,3}$/.test(part) || Number(part) < 0 || Number(part) > 255)\n ) {\n return undefined;\n }\n\n return parts.map(Number) as [number, number, number, number];\n};\n\n/** Rejects loopback, private, link-local, multicast, reserved, and cloud-metadata IPv4 ranges */\nexport const isPrivateOrReservedIPv4 = (ip: string): boolean => {\n const octets = parseIPv4Octets(ip);\n\n if (!octets) return true; // malformed literals are unsafe\n\n const [a, b, c] = octets;\n\n return (\n a === 0 || // \"this\" network\n a === 10 || // RFC 1918\n a === 127 || // loopback\n (a === 100 && b >= 64 && b <= 127) || // CGNAT\n (a === 169 && b === 254) || // link-local + cloud metadata\n (a === 172 && b >= 16 && b <= 31) || // RFC 1918\n (a === 192 && b === 0) || // IETF protocol assignments + TEST-NET-1\n (a === 192 && b === 168) || // RFC 1918\n (a === 198 && (b === 18 || b === 19)) || // benchmarking\n (a === 198 && b === 51 && c === 100) || // TEST-NET-2\n (a === 203 && b === 0 && c === 113) || // TEST-NET-3\n a >= 224 // multicast + reserved\n );\n};\n\nconst parseIPv6Hextets = (raw: string): number[] | undefined => {\n const hasOpeningBracket = raw.startsWith('[');\n const hasClosingBracket = raw.endsWith(']');\n\n if (hasOpeningBracket !== hasClosingBracket) return undefined;\n\n const ip = (hasOpeningBracket ? raw.slice(1, -1) : raw).toLowerCase();\n\n if (!ip || ip.includes('%') || (ip.match(/::/g)?.length ?? 0) > 1) return undefined;\n\n let normalized = ip;\n const dottedTail = normalized.match(/(?:^|:)(\\d{1,3}(?:\\.\\d{1,3}){3})$/)?.[1];\n\n if (dottedTail) {\n const octets = parseIPv4Octets(dottedTail);\n\n if (!octets) return undefined;\n\n normalized = normalized.slice(0, -dottedTail.length);\n normalized += `${((octets[0] << 8) | octets[1]).toString(16)}:${(\n (octets[2] << 8) |\n octets[3]\n ).toString(16)}`;\n }\n\n const hasCompression = normalized.includes('::');\n const [leftRaw, rightRaw = ''] = normalized.split('::');\n const left = leftRaw ? leftRaw.split(':') : [];\n const right = rightRaw ? rightRaw.split(':') : [];\n const tokens = [...left, ...right];\n\n if (\n tokens.some(token => !/^[0-9a-f]{1,4}$/.test(token)) ||\n (hasCompression ? tokens.length >= 8 : tokens.length !== 8)\n ) {\n return undefined;\n }\n\n const omitted = hasCompression ? 8 - tokens.length : 0;\n\n return [...left, ...Array<number>(omitted).fill(0), ...right].map(token =>\n typeof token === 'number' ? token : Number.parseInt(token, 16)\n );\n};\n\n/**\n * Translation/transition ranges can route an apparently public IPv6 literal to an\n * embedded IPv4 destination. Reject the standardized ranges rather than trusting\n * an intermediary gateway not to expose private or link-local IPv4 services.\n */\nconst isIPv4TranslationOrTransitionPrefix = (hextets: number[]): boolean => {\n const [first, second, third] = hextets;\n const isNat64WellKnown =\n first === 0x0064 && second === 0xff9b && hextets.slice(2, 6).every(part => part === 0); // 64:ff9b::/96\n const isNat64Local = first === 0x0064 && second === 0xff9b && third === 0x0001; // 64:ff9b:1::/48\n const is6to4 = first === 0x2002; // 2002::/16\n\n return isNat64WellKnown || isNat64Local || is6to4;\n};\n\n/** Rejects loopback, private/transition, link-local, multicast, documentation, and mapped-private IPv6 */\nexport const isPrivateOrReservedIPv6 = (raw: string): boolean => {\n const hextets = parseIPv6Hextets(raw);\n\n if (!hextets) return true;\n\n if (isIPv4TranslationOrTransitionPrefix(hextets)) return true;\n\n const [first = 0, second = 0] = hextets;\n const isEmbeddedIPv4Prefix = hextets.slice(0, 5).every(part => part === 0);\n\n if (isEmbeddedIPv4Prefix && (hextets[5] === 0 || hextets[5] === 0xffff)) {\n const embedded = `${(hextets[6] ?? 0) >> 8}.${(hextets[6] ?? 0) & 0xff}.${\n (hextets[7] ?? 0) >> 8\n }.${(hextets[7] ?? 0) & 0xff}`;\n\n if (isPrivateOrReservedIPv4(embedded)) return true;\n }\n\n if (hextets.every(part => part === 0)) return true;\n if (hextets.slice(0, 7).every(part => part === 0) && hextets[7] === 1) return true;\n if ((first & 0xfe00) === 0xfc00) return true; // fc00::/7 unique local\n if ((first & 0xffc0) === 0xfe80) return true; // fe80::/10 link-local\n if ((first & 0xff00) === 0xff00) return true; // ff00::/8 multicast\n if (first === 0x2001 && second === 0x0db8) return true; // docs\n\n return false;\n};\n\nconst parsePinnedAddress = (raw: string): PinnedAddress | undefined => {\n if (raw.includes(':')) {\n const hextets = parseIPv6Hextets(raw);\n\n if (!hextets) return undefined;\n\n return { address: hextets.map(part => part.toString(16)).join(':'), family: 6 };\n }\n\n const octets = parseIPv4Octets(raw);\n\n if (!octets) return undefined;\n\n return { address: octets.join('.'), family: 4 };\n};\n\nconst isNodeRuntime = typeof process !== 'undefined' && !!process.versions?.node;\n\n/**\n * Resolves a hostname with Node's DNS resolver. The specifier is intentionally\n * computed so browser bundlers leave the Node builtin external.\n */\nconst resolveHostnameWithNodeDns = async (hostname: string): Promise<string[]> => {\n const specifier = 'node:dns/promises';\n const dns = (await import(/* @vite-ignore */ specifier)) as typeof import('node:dns/promises');\n const answers = await dns.lookup(hostname, { all: true, verbatim: true });\n\n return answers.map(answer => answer.address);\n};\n\ntype ValidatedRefreshUrl = { url: URL; pinnedAddress?: PinnedAddress };\ntype UrlSafety = ValidatedRefreshUrl | { result: CredentialRefreshResult };\n\n/**\n * Validates a refresh endpoint URL before any request is made.\n *\n * Requires HTTPS unless the explicit local-development opt-in allows HTTP, rejects\n * userinfo, and rejects private/loopback/link-local host literals. In Node-capable\n * runtimes the hostname is resolved and every private answer rejects the endpoint;\n * in browsers only unsafe host literals are rejected and the platform plus CORS are\n * relied upon for host resolution.\n */\nconst validateRefreshUrl = async (\n rawUrl: string,\n options: ResolvedRefreshOptions\n): Promise<UrlSafety> => {\n let url: URL;\n\n try {\n url = new URL(rawUrl);\n } catch {\n return { result: unsafeEndpoint() };\n }\n\n if (url.username || url.password) return { result: unsafeEndpoint() };\n\n const isHttps = url.protocol === 'https:';\n const isHttp = url.protocol === 'http:';\n\n if (!isHttps && !(isHttp && options.allowInsecureHttp)) return { result: unsafeEndpoint() };\n\n const isIpv6Literal = url.hostname.startsWith('[');\n const hostname = url.hostname.replace(/^\\[|\\]$/g, '');\n\n if (!hostname) return { result: unsafeEndpoint() };\n\n if (isIpv6Literal) {\n if (!options.allowPrivateAddresses && isPrivateOrReservedIPv6(hostname)) {\n return { result: unsafeEndpoint() };\n }\n } else if (/^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(hostname)) {\n if (!options.allowPrivateAddresses && isPrivateOrReservedIPv4(hostname)) {\n return { result: unsafeEndpoint() };\n }\n } else if (options.resolveHost) {\n let addresses: string[];\n\n try {\n addresses = await options.resolveHost(hostname);\n } catch {\n return { result: failed('UNAVAILABLE', true) };\n }\n\n if (addresses.length === 0) return { result: failed('UNAVAILABLE', true) };\n\n const parsedAddresses = addresses.map(parsePinnedAddress);\n const pinnedAddress = parsedAddresses[0];\n const hasUnsafeAnswer = parsedAddresses.some(\n address =>\n !address ||\n (address.family === 6\n ? isPrivateOrReservedIPv6(address.address)\n : isPrivateOrReservedIPv4(address.address))\n );\n\n if (!pinnedAddress || (hasUnsafeAnswer && !options.allowPrivateAddresses)) {\n return { result: unsafeEndpoint() };\n }\n\n return { url, pinnedAddress };\n }\n\n return { url };\n};\n\n// --- Safe fetching --------------------------------------------------------------\n\ntype GuardedResponse = {\n response: Response;\n endpoint: ValidatedRefreshUrl;\n signal: AbortSignal;\n finish: () => void;\n};\ntype FetchOutcome = GuardedResponse | { result: CredentialRefreshResult };\n\nconst discardGuardedResponse = async (guarded: GuardedResponse): Promise<void> => {\n try {\n await guarded.response.body?.cancel();\n } catch {\n // The response is already terminal; cancellation is best-effort cleanup.\n } finally {\n guarded.finish();\n }\n};\n\n/**\n * Performs a guarded GET: manual redirect handling with full revalidation of every\n * redirect target, a redirect cap, a shared timeout across hops, and no forwarding of\n * LearnCard authorization across origins.\n */\nconst fetchWithGuards = async (\n initialEndpoint: ValidatedRefreshUrl,\n options: ResolvedRefreshOptions,\n authorization?: string\n): Promise<FetchOutcome> => {\n if (typeof globalThis.fetch !== 'function') {\n return { result: failed('UNAVAILABLE', false) };\n }\n\n let current = initialEndpoint;\n const initialOrigin = initialEndpoint.url.origin;\n let redirectsRemaining = options.maxRedirects;\n let auth = authorization;\n const deadline = Date.now() + options.timeoutMs;\n\n for (;;) {\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) return { result: failed('TIMEOUT', true) };\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), remainingMs);\n\n let response: Response;\n\n try {\n const headers: Record<string, string> = { accept: ACCEPT_HEADER };\n\n if (options.etag) headers['if-none-match'] = options.etag;\n if (auth) headers.authorization = auth;\n\n response = await fetchWithPinnedAddress(\n current.url,\n {\n method: 'GET',\n redirect: 'manual',\n signal: controller.signal,\n headers,\n },\n current.pinnedAddress\n );\n } catch (error) {\n clearTimeout(timer);\n\n const timedOut =\n controller.signal.aborted || (error as Error | null)?.name === 'AbortError';\n\n return { result: failed(timedOut ? 'TIMEOUT' : 'UNAVAILABLE', true) };\n }\n\n if (!REDIRECT_STATUSES.has(response.status)) {\n return {\n response,\n endpoint: current,\n signal: controller.signal,\n finish: () => clearTimeout(timer),\n };\n }\n\n clearTimeout(timer);\n await response.body?.cancel().catch(() => undefined);\n\n if (redirectsRemaining <= 0) return { result: failed('UNAVAILABLE', false) };\n\n const location = response.headers.get('location');\n\n if (!location) return { result: malformedResponse() };\n\n let next: URL;\n\n try {\n next = new URL(location, current.url);\n } catch {\n return { result: unsafeEndpoint() };\n }\n\n const validated = await validateRefreshUrl(next.href, options);\n\n if ('result' in validated) return validated;\n\n if (validated.url.origin !== initialOrigin) auth = undefined;\n\n redirectsRemaining -= 1;\n current = validated;\n }\n};\n\n/**\n * Reads a response body while counting streamed bytes and keeps the request's abort\n * signal observable until streaming completes.\n */\ntype BodyReadOutcome =\n { body: string } | { result: CredentialRefreshResult; reason: 'timeout' | 'malformed' };\n\nconst readBodyWithLimit = async (\n response: Response,\n maxBytes: number,\n signal: AbortSignal\n): Promise<BodyReadOutcome> => {\n const declared = Number(response.headers.get('content-length'));\n\n if (Number.isFinite(declared) && declared > maxBytes) {\n return { result: malformedResponse(), reason: 'malformed' };\n }\n\n if (!response.body) {\n try {\n const body = await response.text();\n\n return new TextEncoder().encode(body).byteLength > maxBytes\n ? { result: malformedResponse(), reason: 'malformed' }\n : { body };\n } catch {\n return signal.aborted\n ? { result: failed('TIMEOUT', true), reason: 'timeout' }\n : { result: malformedResponse(), reason: 'malformed' };\n }\n }\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n total += value?.byteLength ?? 0;\n\n if (total > maxBytes) {\n await reader.cancel().catch(() => undefined);\n\n return { result: malformedResponse(), reason: 'malformed' };\n }\n\n if (value) chunks.push(value);\n }\n } catch {\n return signal.aborted\n ? { result: failed('TIMEOUT', true), reason: 'timeout' }\n : { result: malformedResponse(), reason: 'malformed' };\n }\n\n const merged = new Uint8Array(total);\n let offset = 0;\n\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return { body: new TextDecoder().decode(merged) };\n};\n\nconst isAcceptedMediaType = (contentType: string | null): boolean => {\n if (!contentType) return false;\n\n const mediaType = contentType.split(';', 1)[0]?.trim().toLowerCase() ?? '';\n\n return ACCEPTED_MEDIA_TYPES.has(mediaType);\n};\n\n// --- Managed DID-auth challenge -------------------------------------------------\n\ntype ParsedChallenge = { challenge: string; domain?: string; expiresAt: number };\n\nconst parseAuthParams = (header: string): Record<string, string> => {\n const params: Record<string, string> = {};\n const pattern = /([a-zA-Z][a-zA-Z0-9_-]*)\\s*=\\s*\"([^\"]*)\"/g;\n\n let match: RegExpExecArray | null;\n\n while ((match = pattern.exec(header))) {\n const key = match[1]?.toLowerCase();\n\n if (key && match[2]) params[key] = match[2];\n }\n\n return params;\n};\n\n/**\n * Parses a `LearnCardDIDAuth` challenge from a 401 response. Challenge/domain\n * parameters are read from the `WWW-Authenticate` header and/or the machine-readable\n * JSON body; when both carry a challenge they must agree. Expired challenges are\n * rejected. Returns `undefined` when the challenge is absent or malformed.\n */\nconst parseDidAuthChallenge = (\n response: Response,\n bodyText: string,\n expectedDomain: string\n): ParsedChallenge | undefined => {\n const header = response.headers.get('www-authenticate') ?? '';\n\n const scheme = header.trim().split(/\\s/, 1)[0]?.toLowerCase();\n\n if (scheme !== DID_AUTH_SCHEME) return undefined;\n\n const headerParams = parseAuthParams(header);\n\n let challenge = headerParams.challenge;\n let domain = headerParams.domain;\n let expiresAt = Date.now() + HEADER_CHALLENGE_TTL_MS;\n\n if (bodyText) {\n let body: unknown;\n\n try {\n body = JSON.parse(bodyText);\n } catch {\n return undefined; // machine-readable challenge body must be JSON\n }\n\n const parsed = CredentialRefreshChallengeValidator.safeParse(body);\n\n if (!parsed.success) return undefined;\n\n if (challenge && parsed.data.challenge !== challenge) return undefined; // ambiguous\n if (domain && parsed.data.domain && parsed.data.domain !== domain) return undefined;\n\n challenge = parsed.data.challenge;\n domain = parsed.data.domain ?? domain;\n\n expiresAt = Date.parse(parsed.data.expiresAt);\n\n if (Number.isNaN(expiresAt) || expiresAt <= Date.now()) return undefined;\n }\n\n if (!challenge || (domain && domain !== expectedDomain)) return undefined;\n\n return { challenge, domain: expectedDomain, expiresAt };\n};\n\n// --- Response decoding ------------------------------------------------------------\n\ntype DecodedCandidate = { credential: VC; etag?: string; managedVersion?: number };\n\nconst asManagedVersion = (value: unknown): number | undefined =>\n typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : undefined;\n\ntype InvokeBag = Record<string, ((...args: unknown[]) => Promise<unknown>) | undefined>;\n\n/**\n * Decodes a refresh response body into a candidate credential. Accepts a bare signed\n * VC, a `{format:'vc'}` envelope, or a `{format:'jwe'}` envelope / bare JWE. Managed\n * JWE payloads are decrypted only when the optional `decryptDagJwe` capability is\n * present on the wallet.\n */\nconst decodeCandidate = async (\n learnCard: VCImplicitLearnCard,\n json: unknown,\n response: Response\n): Promise<DecodedCandidate | CredentialRefreshResult> => {\n const headerEtag = response.headers.get('etag') ?? undefined;\n\n // Tagged union: VCDM 2.0 credentials may legitimately carry a `status` field, so a\n // bare `VC | CredentialRefreshResult` union cannot be discriminated by `'status' in`.\n const decryptJwe = async (\n jwe: JWE\n ): Promise<{ credential: VC } | { failure: CredentialRefreshResult }> => {\n const decrypt = (learnCard.invoke as unknown as InvokeBag).decryptDagJwe;\n\n if (typeof decrypt !== 'function') return { failure: failed('UNSUPPORTED_SERVICE', false) };\n\n let decrypted: unknown;\n\n try {\n decrypted = await decrypt(jwe);\n } catch {\n return { failure: malformedResponse() };\n }\n\n const parsed = VCValidator.safeParse(decrypted);\n\n if (!parsed.success) return { failure: malformedResponse() };\n\n return { credential: parsed.data as VC };\n };\n\n const envelopeEtag = (value: unknown) => (typeof value === 'string' ? value : headerEtag);\n\n if (json !== null && typeof json === 'object' && 'format' in json) {\n const envelope = json as Record<string, unknown>;\n\n if (envelope.format === 'jwe') {\n const jwe = JWEValidator.safeParse(envelope.jwe);\n\n if (!jwe.success) return malformedResponse();\n\n const decrypted = await decryptJwe(jwe.data);\n\n if ('failure' in decrypted) return decrypted.failure;\n\n return {\n credential: decrypted.credential,\n etag: envelopeEtag(envelope.etag),\n managedVersion: asManagedVersion(envelope.version),\n };\n }\n\n if (envelope.format === 'vc') {\n const parsed = VCValidator.safeParse(envelope.credential);\n\n if (!parsed.success) return malformedResponse();\n\n return {\n credential: parsed.data as VC,\n etag: envelopeEtag(envelope.etag),\n managedVersion: asManagedVersion(envelope.version),\n };\n }\n\n return malformedResponse();\n }\n\n const bareVc = VCValidator.safeParse(json);\n\n if (bareVc.success) return { credential: bareVc.data as VC, etag: headerEtag };\n\n const bareJwe = JWEValidator.safeParse(json);\n\n if (bareJwe.success) {\n const decrypted = await decryptJwe(bareJwe.data);\n\n if ('failure' in decrypted) return decrypted.failure;\n\n return { credential: decrypted.credential, etag: headerEtag };\n }\n\n return malformedResponse();\n};\n\n// --- Stability and freshness --------------------------------------------------------\n\nconst getHolderIds = (vc: VC): string[] => {\n const subject = vc.credentialSubject as { id?: unknown } | Array<{ id?: unknown }>;\n const subjects = Array.isArray(subject) ? subject : [subject];\n\n return subjects.map(entry => (typeof entry?.id === 'string' ? entry.id : '')).sort();\n};\n\nconst holdersEqual = (first: VC, second: VC): boolean => {\n const firstIds = getHolderIds(first);\n const secondIds = getHolderIds(second);\n\n return (\n firstIds.length === secondIds.length &&\n firstIds.every((id, index) => id === secondIds[index])\n );\n};\n\n/**\n * Holder-side refresh primitive. See the module docblock for the safety contract.\n *\n * Never includes the current credential or its claims in request headers or logs.\n */\nexport const refreshCredential = (_initLearnCard: VCDependentLearnCard) => {\n /**\n * Challenges already consumed by this wallet instance. A managed endpoint issues\n * single-use challenges; a repeated challenge value indicates a replay and is\n * rejected without signing.\n */\n // Retain live entries until expiry; fail closed at capacity instead of evicting\n // replay protection. Header-only challenges have a five-minute retention window.\n const usedChallenges = new Map<string, number>();\n\n return async (\n _learnCard: VCImplicitLearnCard,\n credential: VC,\n options: RefreshCredentialOptions = {}\n ): Promise<CredentialRefreshResult> => {\n const resolved: ResolvedRefreshOptions = {\n etag: options.etag,\n timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n maxRedirects: options.maxRedirects ?? DEFAULT_MAX_REDIRECTS,\n maxResponseBytes: options.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES,\n allowInsecureHttp: options.allowInsecureHttp ?? false,\n allowPrivateAddresses: options.allowPrivateAddresses ?? false,\n resolveHost:\n options.resolveHost ?? (isNodeRuntime ? resolveHostnameWithNodeDns : undefined),\n };\n\n const service = getSupportedRefreshService(credential);\n\n if (!service) return { status: 'unsupported' };\n\n // Verify the currently held credential before contacting the endpoint.\n try {\n const check = await _learnCard.invoke.verifyCredential(credential);\n\n if (!proofVerified(check)) return invalidProof();\n } catch {\n return invalidProof();\n }\n\n // Managed publication requires a stable ID. Standard credentials may omit it.\n if (\n service.type === 'LearnCardCredentialRefresh2026' &&\n (typeof credential.id !== 'string' || credential.id.length === 0)\n ) {\n return failed('ID_MISMATCH', false);\n }\n\n const validated = await validateRefreshUrl(service.id, resolved);\n\n if ('result' in validated) return validated.result;\n\n const initial = await fetchWithGuards(validated, resolved);\n\n if ('result' in initial) return initial.result;\n\n let guardedResponse = initial;\n let response = guardedResponse.response;\n\n // Managed endpoints authenticate with a single DID-auth retry.\n if (response.status === 401 && service.type === 'LearnCardCredentialRefresh2026') {\n // Only the origin signed into the credential may request a holder proof.\n if (guardedResponse.endpoint.url.origin !== validated.url.origin) {\n await discardGuardedResponse(guardedResponse);\n return unauthorized();\n }\n const challengeRead = await readBodyWithLimit(\n response,\n resolved.maxResponseBytes,\n guardedResponse.signal\n );\n\n guardedResponse.finish();\n\n if ('result' in challengeRead) {\n return challengeRead.reason === 'timeout' ? challengeRead.result : unauthorized();\n }\n\n const expectedDomain = guardedResponse.endpoint.url.host;\n const challenge = parseDidAuthChallenge(response, challengeRead.body, expectedDomain);\n\n if (!challenge) return unauthorized();\n\n const challengeKey = `${guardedResponse.endpoint.url.origin}|${challenge.challenge}`;\n\n const now = Date.now();\n for (const [key, expiresAt] of usedChallenges) {\n if (expiresAt <= now) usedChallenges.delete(key);\n }\n if (usedChallenges.has(challengeKey)) return unauthorized();\n if (usedChallenges.size >= MAX_TRACKED_CHALLENGES) return unauthorized();\n usedChallenges.set(challengeKey, challenge.expiresAt);\n\n let vp: VP | string;\n\n try {\n vp = await _learnCard.invoke.getDidAuthVp({\n proofFormat: 'jwt',\n challenge: challenge.challenge,\n domain: expectedDomain,\n });\n } catch {\n return unauthorized();\n }\n\n const retry = await fetchWithGuards(\n guardedResponse.endpoint,\n resolved,\n `Bearer ${typeof vp === 'string' ? vp : JSON.stringify(vp)}`\n );\n\n if ('result' in retry) return retry.result;\n\n guardedResponse = retry;\n response = guardedResponse.response;\n }\n\n if (response.status === 304) {\n await discardGuardedResponse(guardedResponse);\n\n return {\n status: 'unchanged',\n checkedAt: new Date().toISOString(),\n etag: response.headers.get('etag') ?? resolved.etag,\n };\n }\n\n if (response.status === 410) {\n await discardGuardedResponse(guardedResponse);\n return failed('REVOKED', false);\n }\n\n if (response.status === 401 || response.status === 403) {\n await discardGuardedResponse(guardedResponse);\n return unauthorized();\n }\n\n if (response.status < 200 || response.status > 299) {\n await discardGuardedResponse(guardedResponse);\n return failed('UNAVAILABLE', response.status >= 500);\n }\n\n if (!isAcceptedMediaType(response.headers.get('content-type'))) {\n await discardGuardedResponse(guardedResponse);\n return malformedResponse();\n }\n\n const bodyRead = await readBodyWithLimit(\n response,\n resolved.maxResponseBytes,\n guardedResponse.signal\n );\n\n guardedResponse.finish();\n\n if ('result' in bodyRead) return bodyRead.result;\n\n let json: unknown;\n\n try {\n json = JSON.parse(bodyRead.body);\n } catch {\n return malformedResponse();\n }\n\n // The standard protocol returns a bare credential, never a LearnCard envelope.\n if (service.type === '1EdTechCredentialRefresh' && !VCValidator.safeParse(json).success) {\n return malformedResponse();\n }\n const decoded = await decodeCandidate(_learnCard, json, response);\n\n if ('status' in decoded) return decoded;\n\n const candidate = decoded.credential;\n\n // Verify the replacement proof before any stability/freshness checks.\n try {\n const check = await _learnCard.invoke.verifyCredential(candidate);\n\n if (!proofVerified(check)) return invalidProof();\n } catch {\n return invalidProof();\n }\n\n // Identity stability: same credential ID, normalized issuer, and holder. Holder\n // changes are surfaced as ID_MISMATCH because the holder identity is part of the\n // credential's identity for refresh purposes.\n if (candidate.id !== credential.id) {\n return failed('ID_MISMATCH', false);\n }\n\n if (getCredentialIssuerId(candidate) !== getCredentialIssuerId(credential)) {\n return failed('ISSUER_MISMATCH', false);\n }\n\n if (!holdersEqual(credential, candidate)) return failed('ID_MISMATCH', false);\n\n // Freshness: reject a strictly older effective timestamp.\n const currentTime = getCredentialEffectiveTime(credential);\n const candidateTime = getCredentialEffectiveTime(candidate);\n\n if (\n currentTime !== undefined &&\n candidateTime !== undefined &&\n candidateTime < currentTime\n ) {\n return failed('ROLLBACK', false);\n }\n\n // Proof-insensitive canonical comparison distinguishes updated from unchanged.\n if (credentialContentsEqual(credential, candidate)) {\n return { status: 'unchanged', checkedAt: new Date().toISOString(), etag: decoded.etag };\n }\n\n return {\n status: 'updated',\n credential: candidate,\n ...(decoded.etag ? { etag: decoded.etag } : {}),\n ...(decoded.managedVersion ? { managedVersion: decoded.managedVersion } : {}),\n };\n };\n};\n", "export type PinnedAddress = { address: string; family: 4 | 6 };\n\ntype NodeLookupCallback = (\n error: Error | null,\n address: string | Array<PinnedAddress>,\n family?: number\n) => void;\n\ntype NodeResponse = {\n statusCode?: number;\n statusMessage?: string;\n headers: Record<string, string | string[] | undefined>;\n on: (event: string, listener: (...args: unknown[]) => void) => void;\n destroy: (error?: Error) => void;\n};\n\ntype NodeRequest = {\n on: (event: string, listener: (error: Error) => void) => void;\n end: () => void;\n};\n\ntype NodeHttpClient = {\n request: (\n url: URL,\n options: Record<string, unknown>,\n onResponse: (response: NodeResponse) => void\n ) => NodeRequest;\n};\n\nconst isNodeRuntime = typeof process !== 'undefined' && !!process.versions?.node;\n\nconst toResponseHeaders = (headers: Record<string, string | string[] | undefined>): Headers => {\n const result = new Headers();\n\n for (const [name, value] of Object.entries(headers)) {\n if (Array.isArray(value)) value.forEach(entry => result.append(name, entry));\n else if (value !== undefined) result.append(name, value);\n }\n\n return result;\n};\n\n/**\n * Fetches through an already-validated IP address in Node without changing the URL\n * hostname. Keeping the original URL lets Node perform SNI and certificate hostname\n * verification against the refresh endpoint while the custom lookup prevents a\n * second, potentially rebound DNS answer from selecting the socket destination.\n * Browsers do not expose connection-level DNS controls and therefore use native fetch.\n */\nexport const fetchWithPinnedAddress = async (\n url: URL,\n init: RequestInit,\n pinnedAddress?: PinnedAddress\n): Promise<Response> => {\n if (!isNodeRuntime || !pinnedAddress) return globalThis.fetch(url.href, init);\n\n const specifier = url.protocol === 'https:' ? 'node:https' : 'node:http';\n const client = (await import(/* @vite-ignore */ specifier)) as unknown as NodeHttpClient;\n\n return new Promise<Response>((resolve, reject) => {\n const lookup = (\n _hostname: string,\n options: { all?: boolean },\n callback: NodeLookupCallback\n ): void => {\n if (options?.all) callback(null, [pinnedAddress]);\n else callback(null, pinnedAddress.address, pinnedAddress.family);\n };\n\n let request: NodeRequest;\n\n try {\n const headers = Object.fromEntries(new Headers(init.headers).entries());\n\n headers['accept-encoding'] = 'identity';\n\n request = client.request(\n url,\n {\n method: init.method,\n headers,\n signal: init.signal,\n lookup,\n // A shared agent could reuse a socket created for a different DNS\n // answer and bypass this request's validated pin.\n agent: false,\n ...(url.protocol === 'https:' ? { servername: url.hostname } : {}),\n },\n nodeResponse => {\n try {\n const status = nodeResponse.statusCode;\n if (\n status === undefined ||\n !Number.isInteger(status) ||\n status < 200 ||\n status > 599\n ) {\n reject(new RangeError('Invalid refresh response status'));\n nodeResponse.destroy();\n return;\n }\n const hasBody = status !== 204 && status !== 205 && status !== 304;\n const body = hasBody\n ? new ReadableStream<Uint8Array>({\n start(controller) {\n nodeResponse.on('data', chunk => {\n if (typeof chunk === 'string') {\n controller.enqueue(new TextEncoder().encode(chunk));\n } else if (chunk instanceof Uint8Array) {\n controller.enqueue(chunk);\n } else {\n controller.error(\n new TypeError('Unsupported response chunk')\n );\n }\n });\n nodeResponse.on('end', () => controller.close());\n nodeResponse.on('error', error => controller.error(error));\n nodeResponse.on('aborted', () =>\n controller.error(\n new DOMException(\n 'The operation was aborted',\n 'AbortError'\n )\n )\n );\n },\n cancel(reason) {\n nodeResponse.destroy(\n reason instanceof Error\n ? reason\n : new Error(String(reason))\n );\n },\n })\n : null;\n\n resolve(\n new Response(body, {\n status,\n statusText: nodeResponse.statusMessage,\n headers: toResponseHeaders(nodeResponse.headers),\n })\n );\n } catch (error) {\n reject(error);\n nodeResponse.destroy();\n }\n }\n );\n } catch (error) {\n reject(error);\n return;\n }\n\n request.on('error', reject);\n request.end();\n });\n};\n", "import { issueCredential } from './issueCredential';\nimport { verifyCredential } from './verifyCredential';\nimport { issuePresentation } from './issuePresentation';\nimport { verifyPresentation } from './verifyPresentation';\nimport { refreshCredential } from './refreshCredential';\n\nimport { VCDependentLearnCard, VCPlugin } from './types';\nimport { UnsignedVP } from '@learncard/types';\n\n/**\n * @group Plugins\n */\nexport const getVCPlugin = (learnCard: VCDependentLearnCard): VCPlugin => {\n return {\n name: 'VC',\n displayName: 'VC',\n description:\n 'Handles the infrastructure needed to issue and verify credentials and presentations',\n methods: {\n issueCredential: issueCredential(learnCard),\n verifyCredential: verifyCredential(learnCard),\n issuePresentation: issuePresentation(learnCard),\n verifyPresentation: verifyPresentation(learnCard),\n refreshCredential: refreshCredential(learnCard),\n getTestVc: (_learnCard, subject = 'did:example:d23dd687a7dc6787646f2eb98d0') => {\n const did = _learnCard.id.did();\n\n return {\n '@context': ['https://www.w3.org/ns/credentials/v2'],\n id: `urn:uuid:${crypto.randomUUID()}`,\n type: ['VerifiableCredential'],\n issuer: did,\n validFrom: new Date().toISOString(),\n credentialSubject: { id: subject },\n };\n },\n getTestVp: async (_learnCard, _credential) => {\n const credential =\n _credential ||\n (await _learnCard.invoke.issueCredential(_learnCard.invoke.getTestVc()));\n\n const did = _learnCard.id.did();\n\n return {\n '@context': ['https://www.w3.org/ns/credentials/v2'],\n type: ['VerifiablePresentation'],\n holder: did,\n verifiableCredential: credential,\n };\n },\n getDidAuthVp: async (_learnCard, options = {}) => {\n const did = _learnCard.id.did();\n const unsignedVP: UnsignedVP = {\n '@context': ['https://www.w3.org/ns/credentials/v2'],\n type: ['VerifiablePresentation'],\n holder: did,\n };\n\n return _learnCard.invoke.issuePresentation(unsignedVP, {\n proofPurpose: 'authentication',\n ...options,\n });\n },\n },\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["index_exports", "__export", "getVCPlugin", "refreshCredential", "__toCommonJS", "base", "ALPHABET", "name", "BASE_MAP", "j", "i", "x", "xc", "BASE", "LEADER", "FACTOR", "iFACTOR", "encode", "source", "zeroes", "length", "pbegin", "pend", "size", "b58", "carry", "it1", "it2", "str", "__name", "decodeUnsafe", "psz", "b256", "it3", "it4", "vch", "decode", "string", "buffer", "src", "_brrp__multiformats_scope_baseX", "base_x_default", "empty", "coerce", "__name", "o", "_Encoder", "name", "prefix", "baseEncode", "bytes", "__name", "Encoder", "_Decoder", "baseDecode", "text", "decoder", "or", "Decoder", "_ComposedDecoder", "decoders", "input", "ComposedDecoder", "left", "right", "_Codec", "Codec", "from", "encode", "decode", "baseX", "alphabet", "base_x_default", "coerce", "string", "bitsPerChar", "codes", "i", "end", "out", "bits", "buffer", "written", "value", "data", "pad", "mask", "rfc4648", "base58btc", "baseX", "base58flickr", "base64", "rfc4648", "base64pad", "base64url", "base64urlpad", "getDefaultVerificationMethod", "__name", "learnCard", "issuerDid", "kp", "issuerDidDoc", "toX", "vm", "decoded", "base58btc", "ed", "base64url", "verificationMethodEntry", "entry", "issueCredential", "__name", "initLearnCard", "learnCard", "credential", "signingOptions", "kp", "proofType", "ctx", "options", "issuerDid", "getDefaultVerificationMethod", "verifyCredential", "__name", "initLearnCard", "_learnCard", "credential", "_options", "options", "issuePresentation", "__name", "initLearnCard", "learnCard", "presentation", "signingOptions", "kp", "proofType", "ctx", "options", "getDefaultVerificationMethod", "verifyPresentation", "__name", "initLearnCard", "_learnCard", "presentation", "options", "import_types", "import_helpers", "isNodeRuntime", "toResponseHeaders", "__name", "headers", "result", "name", "value", "entry", "fetchWithPinnedAddress", "url", "init", "pinnedAddress", "client", "resolve", "reject", "lookup", "_hostname", "options", "callback", "request", "nodeResponse", "status", "body", "controller", "chunk", "error", "reason", "DID_AUTH_SCHEME", "DEFAULT_TIMEOUT_MS", "HEADER_CHALLENGE_TTL_MS", "MAX_TRACKED_CHALLENGES", "DEFAULT_MAX_REDIRECTS", "DEFAULT_MAX_RESPONSE_BYTES", "ACCEPTED_MEDIA_TYPES", "ACCEPT_HEADER", "REDIRECT_STATUSES", "failed", "__name", "code", "retryable", "unsafeEndpoint", "malformedResponse", "invalidProof", "unauthorized", "proofVerified", "check", "parseIPv4Octets", "ip", "parts", "part", "isPrivateOrReservedIPv4", "octets", "a", "b", "c", "parseIPv6Hextets", "raw", "hasOpeningBracket", "hasClosingBracket", "normalized", "dottedTail", "hasCompression", "leftRaw", "rightRaw", "left", "right", "tokens", "token", "omitted", "isIPv4TranslationOrTransitionPrefix", "hextets", "first", "second", "third", "isPrivateOrReservedIPv6", "embedded", "parsePinnedAddress", "isNodeRuntime", "resolveHostnameWithNodeDns", "hostname", "answer", "validateRefreshUrl", "rawUrl", "options", "url", "isHttps", "isHttp", "isIpv6Literal", "addresses", "parsedAddresses", "pinnedAddress", "hasUnsafeAnswer", "address", "discardGuardedResponse", "guarded", "fetchWithGuards", "initialEndpoint", "authorization", "current", "initialOrigin", "redirectsRemaining", "auth", "deadline", "remainingMs", "controller", "timer", "response", "headers", "fetchWithPinnedAddress", "error", "timedOut", "location", "next", "validated", "readBodyWithLimit", "maxBytes", "signal", "declared", "body", "reader", "chunks", "total", "done", "value", "merged", "offset", "chunk", "isAcceptedMediaType", "contentType", "mediaType", "parseAuthParams", "header", "params", "pattern", "match", "key", "parseDidAuthChallenge", "bodyText", "expectedDomain", "headerParams", "challenge", "domain", "expiresAt", "parsed", "asManagedVersion", "decodeCandidate", "learnCard", "json", "headerEtag", "decryptJwe", "jwe", "decrypt", "decrypted", "envelopeEtag", "envelope", "bareVc", "bareJwe", "getHolderIds", "vc", "subject", "entry", "holdersEqual", "firstIds", "secondIds", "id", "index", "refreshCredential", "_initLearnCard", "usedChallenges", "_learnCard", "credential", "resolved", "service", "initial", "guardedResponse", "challengeRead", "challengeKey", "now", "vp", "retry", "bodyRead", "decoded", "candidate", "currentTime", "candidateTime", "getVCPlugin", "__name", "learnCard", "issueCredential", "verifyCredential", "issuePresentation", "verifyPresentation", "refreshCredential", "_learnCard", "subject", "did", "_credential", "credential", "options", "unsignedVP"]
|
|
7
7
|
}
|