@learncard/vc-plugin 1.6.1 → 1.6.3
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/issueCredential.d.ts.map +1 -1
- package/dist/vc-plugin.cjs.development.cjs +14 -10
- package/dist/vc-plugin.cjs.development.cjs.map +3 -3
- 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 +8 -4
- package/dist/vc-plugin.esm.js.map +3 -3
- package/package.json +5 -5
- package/src/issueCredential.test.ts +123 -0
- package/src/issueCredential.ts +16 -8
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var M=Object.defineProperty;var ye=Object.getOwnPropertyDescriptor;var we=Object.getOwnPropertyNames;var be=Object.prototype.hasOwnProperty;var a=(r,e)=>M(r,"name",{value:e,configurable:!0});var Ce=(r,e)=>{for(var t in e)M(r,t,{get:e[t],enumerable:!0})},ve=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of we(e))!be.call(r,s)&&s!==t&&M(r,s,{get:()=>e[s],enumerable:!(n=ye(e,s))||n.enumerable});return r};var Ae=r=>ve(M({},"__esModule",{value:!0}),r);var qe={};Ce(qe,{getVCPlugin:()=>ge,refreshCredential:()=>H});module.exports=Ae(qe);function xe(r,e){if(r.length>=255)throw new TypeError("Alphabet too long");for(var t=new Uint8Array(256),n=0;n<t.length;n++)t[n]=255;for(var s=0;s<r.length;s++){var u=r.charAt(s),f=u.charCodeAt(0);if(t[f]!==255)throw new TypeError(u+" is ambiguous");t[f]=s}var c=r.length,i=r.charAt(0),o=Math.log(c)/Math.log(256),d=Math.log(256)/Math.log(c);function p(l){if(l instanceof Uint8Array||(ArrayBuffer.isView(l)?l=new Uint8Array(l.buffer,l.byteOffset,l.byteLength):Array.isArray(l)&&(l=Uint8Array.from(l))),!(l instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(l.length===0)return"";for(var h=0,E=0,g=0,A=l.length;g!==A&&l[g]===0;)g++,h++;for(var w=(A-g)*d+1>>>0,b=new Uint8Array(w);g!==A;){for(var P=l[g],x=0,C=w-1;(P!==0||x<E)&&C!==-1;C--,x++)P+=256*b[C]>>>0,b[C]=P%c>>>0,P=P/c>>>0;if(P!==0)throw new Error("Non-zero carry");E=x,g++}for(var V=w-E;V!==w&&b[V]===0;)V++;for(var k=i.repeat(h);V<w;++V)k+=r.charAt(b[V]);return k}a(p,"encode");function R(l){if(typeof l!="string")throw new TypeError("Expected String");if(l.length===0)return new Uint8Array;var h=0;if(l[h]!==" "){for(var E=0,g=0;l[h]===i;)E++,h++;for(var A=(l.length-h)*o+1>>>0,w=new Uint8Array(A);l[h];){var b=t[l.charCodeAt(h)];if(b===255)return;for(var P=0,x=A-1;(b!==0||P<g)&&x!==-1;x--,P++)b+=c*w[x]>>>0,w[x]=b%256>>>0,b=b/256>>>0;if(b!==0)throw new Error("Non-zero carry");g=P,h++}if(l[h]!==" "){for(var C=A-g;C!==A&&w[C]===0;)C++;for(var V=new Uint8Array(E+(A-C)),k=E;C!==A;)V[k++]=w[C++];return V}}}a(R,"decodeUnsafe");function m(l){var h=R(l);if(h)return h;throw new Error(`Non-${e} character`)}return a(m,"decode"),{encode:p,decodeUnsafe:R,decode:m}}a(xe,"base");var Re=xe,Ee=Re,Y=Ee;var Ze=new Uint8Array(0);var Q=a(r=>{if(r instanceof Uint8Array&&r.constructor.name==="Uint8Array")return r;if(r instanceof ArrayBuffer)return new Uint8Array(r);if(ArrayBuffer.isView(r))return new Uint8Array(r.buffer,r.byteOffset,r.byteLength);throw new Error("Unknown type, must be binary type")},"coerce");var z=class z{constructor(e,t,n){this.name=e,this.prefix=t,this.baseEncode=n}encode(e){if(e instanceof Uint8Array)return`${this.prefix}${this.baseEncode(e)}`;throw Error("Unknown type, must be binary type")}};a(z,"Encoder");var _=z,J=class J{constructor(e,t,n){if(this.name=e,this.prefix=t,t.codePointAt(0)===void 0)throw new Error("Invalid prefix character");this.prefixCodePoint=t.codePointAt(0),this.baseDecode=n}decode(e){if(typeof e=="string"){if(e.codePointAt(0)!==this.prefixCodePoint)throw Error(`Unable to decode multibase string ${JSON.stringify(e)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);return this.baseDecode(e.slice(this.prefix.length))}else throw Error("Can only multibase decode strings")}or(e){return ee(this,e)}};a(J,"Decoder");var B=J,W=class W{constructor(e){this.decoders=e}or(e){return ee(this,e)}decode(e){let t=e[0],n=this.decoders[t];if(n)return n.decode(e);throw RangeError(`Unable to decode multibase string ${JSON.stringify(e)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)}};a(W,"ComposedDecoder");var j=W,ee=a((r,e)=>new j({...r.decoders||{[r.prefix]:r},...e.decoders||{[e.prefix]:e}}),"or"),q=class q{constructor(e,t,n,s){this.name=e,this.prefix=t,this.baseEncode=n,this.baseDecode=s,this.encoder=new _(e,t,n),this.decoder=new B(e,t,s)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}};a(q,"Codec");var $=q,te=a(({name:r,prefix:e,encode:t,decode:n})=>new $(r,e,t,n),"from"),F=a(({prefix:r,name:e,alphabet:t})=>{let{encode:n,decode:s}=Y(t,e);return te({prefix:r,name:e,encode:n,decode:a(u=>Q(s(u)),"decode")})},"baseX"),Pe=a((r,e,t,n)=>{let s={};for(let d=0;d<e.length;++d)s[e[d]]=d;let u=r.length;for(;r[u-1]==="=";)--u;let f=new Uint8Array(u*t/8|0),c=0,i=0,o=0;for(let d=0;d<u;++d){let p=s[r[d]];if(p===void 0)throw new SyntaxError(`Non-${n} character`);i=i<<t|p,c+=t,c>=8&&(c-=8,f[o++]=255&i>>c)}if(c>=t||255&i<<8-c)throw new SyntaxError("Unexpected end of data");return f},"decode"),Ve=a((r,e,t)=>{let n=e[e.length-1]==="=",s=(1<<t)-1,u="",f=0,c=0;for(let i=0;i<r.length;++i)for(c=c<<8|r[i],f+=8;f>t;)f-=t,u+=e[s&c>>f];if(f&&(u+=e[s&c<<t-f]),n)for(;u.length*t&7;)u+="=";return u},"encode"),T=a(({name:r,prefix:e,bitsPerChar:t,alphabet:n})=>te({prefix:e,name:r,encode(s){return Ve(s,n,t)},decode(s){return Pe(s,n,t,r)}}),"rfc4648");var K=F({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),it=F({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var dt=T({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),ct=T({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),G=T({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),ut=T({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});var N=a(async(r,e)=>{let t=r.id.keypair();if(!t)throw new Error("Cannot get default verification method: unable to get subject keypair");let n=await r.invoke.resolveDid(e),s=a(c=>{if(!(!c||typeof c=="string")){if(c.publicKeyJwk?.x)return c.publicKeyJwk.x;if(c.publicKeyMultibase){let i=K.decode(c.publicKeyMultibase),o=i[0]===237&&i[1]===1?i.slice(2):i;return G.encode(o).slice(1)}if(c.publicKeyBase58){let i=K.baseDecode(c.publicKeyBase58);return G.encode(i).slice(1)}}},"toX"),u=typeof n=="string"?void 0:n?.verificationMethod?.find(c=>s(c)===t.x);return typeof u!="string"&&u?.id||await r.invoke.didToVerificationMethod(e)},"getDefaultVerificationMethod");var re=a(r=>async(e,t,n={})=>{let s=e.id.keypair();if(!s)throw new Error("Cannot issue credential: Could not get subject keypair");let c=(Array.isArray(t["@context"])?t["@context"]:[t["@context"]]).some(o=>typeof o=="string"&&(o.includes("/ns/credentials/v2")||o.includes("/credentials/v2")))&&n.type==="Ed25519Signature2018"?"Ed25519Signature2020":n.type??(n.proofFormat==="jwt"?void 0:"DataIntegrityProof"),i={proofPurpose:"assertionMethod",...n,...c?{type:c}:{}};if(i.type==="DataIntegrityProof"&&!i.cryptosuite&&(i.cryptosuite="eddsa-rdfc-2022"),!("verificationMethod"in i)){let o=typeof t.issuer=="string"?t.issuer:t.issuer.id;i.verificationMethod=await N(e,o)}return e.debug?.("Signing with these options",{credential:t,options:i,kp:s}),r.invoke.issueCredential(t,i,s)},"issueCredential");var ne=a(r=>async(e,t,n={})=>{let s={...n};return s.checks||(s.checks=["proof"],t.credentialStatus&&s.checks.push("credentialStatus"),t.credentialSchema&&s.checks.push("credentialSchema")),r.invoke.verifyCredential(t,s)},"verifyCredential");var se=a(r=>async(e,t,n={})=>{let s=e.id.keypair();if(!s)throw new Error("Cannot issue credential: Could not get subject keypair");let c=(Array.isArray(t["@context"])?t["@context"]:[t["@context"]]).some(o=>typeof o=="string"&&(o.includes("/ns/credentials/v2")||o.includes("/credentials/v2")))&&n.type==="Ed25519Signature2018"?"Ed25519Signature2020":n.type??"Ed25519Signature2020",i={...n.proofFormat==="jwt"?{}:{proofPurpose:"assertionMethod",type:c},...n};return"verificationMethod"in i||(i.verificationMethod=await N(e,e.id.did())),r.invoke.issuePresentation(t,i,s)},"issuePresentation");var ie=a(r=>async(e,t,n={})=>r.invoke.verifyPresentation(t,n),"verifyPresentation");var U=require("@learncard/types"),L=require("@learncard/helpers");var Ue=typeof process<"u"&&!!process.versions?.node,Le=a(r=>{let e=new Headers;for(let[t,n]of Object.entries(r))Array.isArray(n)?n.forEach(s=>e.append(t,s)):n!==void 0&&e.append(t,n);return e},"toResponseHeaders"),oe=a(async(r,e,t)=>{if(!Ue||!t)return globalThis.fetch(r.href,e);let s=await import(r.protocol==="https:"?"node:https":"node:http");return new Promise((u,f)=>{let c=a((o,d,p)=>{d?.all?p(null,[t]):p(null,t.address,t.family)},"lookup"),i;try{let o=Object.fromEntries(new Headers(e.headers).entries());o["accept-encoding"]="identity",i=s.request(r,{method:e.method,headers:o,signal:e.signal,lookup:c,agent:!1,...r.protocol==="https:"?{servername:r.hostname}:{}},d=>{try{let p=d.statusCode;if(p===void 0||!Number.isInteger(p)||p<200||p>599){f(new RangeError("Invalid refresh response status")),d.destroy();return}let m=p!==204&&p!==205&&p!==304?new ReadableStream({start(l){d.on("data",h=>{typeof h=="string"?l.enqueue(new TextEncoder().encode(h)):h instanceof Uint8Array?l.enqueue(h):l.error(new TypeError("Unsupported response chunk"))}),d.on("end",()=>l.close()),d.on("error",h=>l.error(h)),d.on("aborted",()=>l.error(new DOMException("The operation was aborted","AbortError")))},cancel(l){d.destroy(l instanceof Error?l:new Error(String(l)))}}):null;u(new Response(m,{status:p,statusText:d.statusMessage,headers:Le(d.headers)}))}catch(p){f(p),d.destroy()}})}catch(o){f(o);return}i.on("error",f),i.end()})},"fetchWithPinnedAddress");var Ie="learncarddidauth",Se=1e4,ke=3e5,De=1024,Te=3,Me=1048576,pe=new Set(["application/json","application/ld+json","application/vc+ld+json","application/vc-ld+json","application/jwe+json"]),Ne=[...pe].join(", "),Oe=new Set([301,302,303,307,308]),y=a((r,e)=>({status:"failed",code:r,retryable:e}),"failed"),I=a(()=>y("UNSAFE_ENDPOINT",!1),"unsafeEndpoint"),v=a(()=>y("MALFORMED_RESPONSE",!1),"malformedResponse"),O=a(()=>y("INVALID_PROOF",!1),"invalidProof"),S=a(()=>y("UNAUTHORIZED",!1),"unauthorized"),ae=a(r=>!!r&&r.errors.length===0&&r.warnings.length===0&&r.checks.includes("proof"),"proofVerified"),Z=a(r=>{let e=r.split(".");if(!(e.length!==4||e.some(t=>!/^\d{1,3}$/.test(t)||Number(t)<0||Number(t)>255)))return e.map(Number)},"parseIPv4Octets"),X=a(r=>{let e=Z(r);if(!e)return!0;let[t,n,s]=e;return t===0||t===10||t===127||t===100&&n>=64&&n<=127||t===169&&n===254||t===172&&n>=16&&n<=31||t===192&&n===0||t===192&&n===168||t===198&&(n===18||n===19)||t===198&&n===51&&s===100||t===203&&n===0&&s===113||t>=224},"isPrivateOrReservedIPv4"),he=a(r=>{let e=r.startsWith("["),t=r.endsWith("]");if(e!==t)return;let n=(e?r.slice(1,-1):r).toLowerCase();if(!n||n.includes("%")||(n.match(/::/g)?.length??0)>1)return;let s=n,u=s.match(/(?:^|:)(\d{1,3}(?:\.\d{1,3}){3})$/)?.[1];if(u){let m=Z(u);if(!m)return;s=s.slice(0,-u.length),s+=`${(m[0]<<8|m[1]).toString(16)}:${(m[2]<<8|m[3]).toString(16)}`}let f=s.includes("::"),[c,i=""]=s.split("::"),o=c?c.split(":"):[],d=i?i.split(":"):[],p=[...o,...d];if(p.some(m=>!/^[0-9a-f]{1,4}$/.test(m))||(f?p.length>=8:p.length!==8))return;let R=f?8-p.length:0;return[...o,...Array(R).fill(0),...d].map(m=>typeof m=="number"?m:Number.parseInt(m,16))},"parseIPv6Hextets"),He=a(r=>{let[e,t,n]=r;return e===100&&t===65435&&r.slice(2,6).every(c=>c===0)||e===100&&t===65435&&n===1||e===8194},"isIPv4TranslationOrTransitionPrefix"),de=a(r=>{let e=he(r);if(!e||He(e))return!0;let[t=0,n=0]=e;if(e.slice(0,5).every(u=>u===0)&&(e[5]===0||e[5]===65535)){let u=`${(e[6]??0)>>8}.${(e[6]??0)&255}.${(e[7]??0)>>8}.${(e[7]??0)&255}`;if(X(u))return!0}return!!(e.every(u=>u===0)||e.slice(0,7).every(u=>u===0)&&e[7]===1||(t&65024)===64512||(t&65472)===65152||(t&65280)===65280||t===8193&&n===3512)},"isPrivateOrReservedIPv6"),_e=a(r=>{if(r.includes(":")){let t=he(r);return t?{address:t.map(n=>n.toString(16)).join(":"),family:6}:void 0}let e=Z(r);if(e)return{address:e.join("."),family:4}},"parsePinnedAddress"),Be=typeof process<"u"&&!!process.versions?.node,je=a(async r=>(await(await import("node:dns/promises")).lookup(r,{all:!0,verbatim:!0})).map(s=>s.address),"resolveHostnameWithNodeDns"),me=a(async(r,e)=>{let t;try{t=new URL(r)}catch{return{result:I()}}if(t.username||t.password)return{result:I()};let n=t.protocol==="https:",s=t.protocol==="http:";if(!n&&!(s&&e.allowInsecureHttp))return{result:I()};let u=t.hostname.startsWith("["),f=t.hostname.replace(/^\[|\]$/g,"");if(!f)return{result:I()};if(u){if(!e.allowPrivateAddresses&&de(f))return{result:I()}}else if(/^\d{1,3}(?:\.\d{1,3}){3}$/.test(f)){if(!e.allowPrivateAddresses&&X(f))return{result:I()}}else if(e.resolveHost){let c;try{c=await e.resolveHost(f)}catch{return{result:y("UNAVAILABLE",!0)}}if(c.length===0)return{result:y("UNAVAILABLE",!0)};let i=c.map(_e),o=i[0],d=i.some(p=>!p||(p.family===6?de(p.address):X(p.address)));return!o||d&&!e.allowPrivateAddresses?{result:I()}:{url:t,pinnedAddress:o}}return{url:t}},"validateRefreshUrl"),D=a(async r=>{try{await r.response.body?.cancel()}catch{}finally{r.finish()}},"discardGuardedResponse"),ce=a(async(r,e,t)=>{if(typeof globalThis.fetch!="function")return{result:y("UNAVAILABLE",!1)};let n=r,s=r.url.origin,u=e.maxRedirects,f=t,c=Date.now()+e.timeoutMs;for(;;){let i=c-Date.now();if(i<=0)return{result:y("TIMEOUT",!0)};let o=new AbortController,d=setTimeout(()=>o.abort(),i),p;try{let h={accept:Ne};e.etag&&(h["if-none-match"]=e.etag),f&&(h.authorization=f),p=await oe(n.url,{method:"GET",redirect:"manual",signal:o.signal,headers:h},n.pinnedAddress)}catch(h){clearTimeout(d);let E=o.signal.aborted||h?.name==="AbortError";return{result:y(E?"TIMEOUT":"UNAVAILABLE",!0)}}if(!Oe.has(p.status))return{response:p,endpoint:n,signal:o.signal,finish:a(()=>clearTimeout(d),"finish")};if(clearTimeout(d),await p.body?.cancel().catch(()=>{}),u<=0)return{result:y("UNAVAILABLE",!1)};let R=p.headers.get("location");if(!R)return{result:v()};let m;try{m=new URL(R,n.url)}catch{return{result:I()}}let l=await me(m.href,e);if("result"in l)return l;l.url.origin!==s&&(f=void 0),u-=1,n=l}},"fetchWithGuards"),ue=a(async(r,e,t)=>{let n=Number(r.headers.get("content-length"));if(Number.isFinite(n)&&n>e)return{result:v(),reason:"malformed"};if(!r.body)try{let o=await r.text();return new TextEncoder().encode(o).byteLength>e?{result:v(),reason:"malformed"}:{body:o}}catch{return t.aborted?{result:y("TIMEOUT",!0),reason:"timeout"}:{result:v(),reason:"malformed"}}let s=r.body.getReader(),u=[],f=0;try{for(;;){let{done:o,value:d}=await s.read();if(o)break;if(f+=d?.byteLength??0,f>e)return await s.cancel().catch(()=>{}),{result:v(),reason:"malformed"};d&&u.push(d)}}catch{return t.aborted?{result:y("TIMEOUT",!0),reason:"timeout"}:{result:v(),reason:"malformed"}}let c=new Uint8Array(f),i=0;for(let o of u)c.set(o,i),i+=o.byteLength;return{body:new TextDecoder().decode(c)}},"readBodyWithLimit"),$e=a(r=>{if(!r)return!1;let e=r.split(";",1)[0]?.trim().toLowerCase()??"";return pe.has(e)},"isAcceptedMediaType"),Fe=a(r=>{let e={},t=/([a-zA-Z][a-zA-Z0-9_-]*)\s*=\s*"([^"]*)"/g,n;for(;n=t.exec(r);){let s=n[1]?.toLowerCase();s&&n[2]&&(e[s]=n[2])}return e},"parseAuthParams"),ze=a((r,e,t)=>{let n=r.headers.get("www-authenticate")??"";if(n.trim().split(/\s/,1)[0]?.toLowerCase()!==Ie)return;let u=Fe(n),f=u.challenge,c=u.domain,i=Date.now()+ke;if(e){let o;try{o=JSON.parse(e)}catch{return}let d=U.CredentialRefreshChallengeValidator.safeParse(o);if(!d.success||f&&d.data.challenge!==f||c&&d.data.domain&&d.data.domain!==c||(f=d.data.challenge,c=d.data.domain??c,i=Date.parse(d.data.expiresAt),Number.isNaN(i)||i<=Date.now()))return}if(!(!f||c&&c!==t))return{challenge:f,domain:t,expiresAt:i}},"parseDidAuthChallenge"),fe=a(r=>typeof r=="number"&&Number.isInteger(r)&&r>0?r:void 0,"asManagedVersion"),Je=a(async(r,e,t)=>{let n=t.headers.get("etag")??void 0,s=a(async i=>{let o=r.invoke.decryptDagJwe;if(typeof o!="function")return{failure:y("UNSUPPORTED_SERVICE",!1)};let d;try{d=await o(i)}catch{return{failure:v()}}let p=U.VCValidator.safeParse(d);return p.success?{credential:p.data}:{failure:v()}},"decryptJwe"),u=a(i=>typeof i=="string"?i:n,"envelopeEtag");if(e!==null&&typeof e=="object"&&"format"in e){let i=e;if(i.format==="jwe"){let o=U.JWEValidator.safeParse(i.jwe);if(!o.success)return v();let d=await s(o.data);return"failure"in d?d.failure:{credential:d.credential,etag:u(i.etag),managedVersion:fe(i.version)}}if(i.format==="vc"){let o=U.VCValidator.safeParse(i.credential);return o.success?{credential:o.data,etag:u(i.etag),managedVersion:fe(i.version)}:v()}return v()}let f=U.VCValidator.safeParse(e);if(f.success)return{credential:f.data,etag:n};let c=U.JWEValidator.safeParse(e);if(c.success){let i=await s(c.data);return"failure"in i?i.failure:{credential:i.credential,etag:n}}return v()},"decodeCandidate"),le=a(r=>{let e=r.credentialSubject;return(Array.isArray(e)?e:[e]).map(n=>typeof n?.id=="string"?n.id:"").sort()},"getHolderIds"),We=a((r,e)=>{let t=le(r),n=le(e);return t.length===n.length&&t.every((s,u)=>s===n[u])},"holdersEqual"),H=a(r=>{let e=new Map;return async(t,n,s={})=>{let u={etag:s.etag,timeoutMs:s.timeoutMs??Se,maxRedirects:s.maxRedirects??Te,maxResponseBytes:s.maxResponseBytes??Me,allowInsecureHttp:s.allowInsecureHttp??!1,allowPrivateAddresses:s.allowPrivateAddresses??!1,resolveHost:s.resolveHost??(Be?je:void 0)},f=(0,L.getSupportedRefreshService)(n);if(!f)return{status:"unsupported"};try{let g=await t.invoke.verifyCredential(n);if(!ae(g))return O()}catch{return O()}if(f.type==="LearnCardCredentialRefresh2026"&&(typeof n.id!="string"||n.id.length===0))return y("ID_MISMATCH",!1);let c=await me(f.id,u);if("result"in c)return c.result;let i=await ce(c,u);if("result"in i)return i.result;let o=i,d=o.response;if(d.status===401&&f.type==="LearnCardCredentialRefresh2026"){if(o.endpoint.url.origin!==c.url.origin)return await D(o),S();let g=await ue(d,u.maxResponseBytes,o.signal);if(o.finish(),"result"in g)return g.reason==="timeout"?g.result:S();let A=o.endpoint.url.host,w=ze(d,g.body,A);if(!w)return S();let b=`${o.endpoint.url.origin}|${w.challenge}`,P=Date.now();for(let[V,k]of e)k<=P&&e.delete(V);if(e.has(b)||e.size>=De)return S();e.set(b,w.expiresAt);let x;try{x=await t.invoke.getDidAuthVp({proofFormat:"jwt",challenge:w.challenge,domain:A})}catch{return S()}let C=await ce(o.endpoint,u,`Bearer ${typeof x=="string"?x:JSON.stringify(x)}`);if("result"in C)return C.result;o=C,d=o.response}if(d.status===304)return await D(o),{status:"unchanged",checkedAt:new Date().toISOString(),etag:d.headers.get("etag")??u.etag};if(d.status===410)return await D(o),y("REVOKED",!1);if(d.status===401||d.status===403)return await D(o),S();if(d.status<200||d.status>299)return await D(o),y("UNAVAILABLE",d.status>=500);if(!$e(d.headers.get("content-type")))return await D(o),v();let p=await ue(d,u.maxResponseBytes,o.signal);if(o.finish(),"result"in p)return p.result;let R;try{R=JSON.parse(p.body)}catch{return v()}if(f.type==="1EdTechCredentialRefresh"&&!U.VCValidator.safeParse(R).success)return v();let m=await Je(t,R,d);if("status"in m)return m;let l=m.credential;try{let g=await t.invoke.verifyCredential(l);if(!ae(g))return O()}catch{return O()}if(l.id!==n.id)return y("ID_MISMATCH",!1);if((0,L.getCredentialIssuerId)(l)!==(0,L.getCredentialIssuerId)(n))return y("ISSUER_MISMATCH",!1);if(!We(n,l))return y("ID_MISMATCH",!1);let h=(0,L.getCredentialEffectiveTime)(n),E=(0,L.getCredentialEffectiveTime)(l);return h!==void 0&&E!==void 0&&E<h?y("ROLLBACK",!1):(0,L.credentialContentsEqual)(n,l)?{status:"unchanged",checkedAt:new Date().toISOString(),etag:m.etag}:{status:"updated",credential:l,...m.etag?{etag:m.etag}:{},...m.managedVersion?{managedVersion:m.managedVersion}:{}}}},"refreshCredential");var ge=a(r=>({name:"VC",displayName:"VC",description:"Handles the infrastructure needed to issue and verify credentials and presentations",methods:{issueCredential:re(r),verifyCredential:ne(r),issuePresentation:se(r),verifyPresentation:ie(r),refreshCredential:H(r),getTestVc:a((e,t="did:example:d23dd687a7dc6787646f2eb98d0")=>{let n=e.id.did();return{"@context":["https://www.w3.org/ns/credentials/v2"],id:`urn:uuid:${crypto.randomUUID()}`,type:["VerifiableCredential"],issuer:n,validFrom:new Date().toISOString(),credentialSubject:{id:t}}},"getTestVc"),getTestVp:a(async(e,t)=>{let n=t||await e.invoke.issueCredential(e.invoke.getTestVc()),s=e.id.did();return{"@context":["https://www.w3.org/ns/credentials/v2"],type:["VerifiablePresentation"],holder:s,verifiableCredential:n}},"getTestVp"),getDidAuthVp:a(async(e,t={})=>{let n=e.id.did(),s={"@context":["https://www.w3.org/ns/credentials/v2"],type:["VerifiablePresentation"],holder:n};return e.invoke.issuePresentation(s,{proofPurpose:"authentication",...t})},"getDidAuthVp")}}),"getVCPlugin");
|
|
1
|
+
"use strict";var M=Object.defineProperty;var we=Object.getOwnPropertyDescriptor;var be=Object.getOwnPropertyNames;var Ce=Object.prototype.hasOwnProperty;var d=(r,e)=>M(r,"name",{value:e,configurable:!0});var ve=(r,e)=>{for(var t in e)M(r,t,{get:e[t],enumerable:!0})},Ae=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of be(e))!Ce.call(r,s)&&s!==t&&M(r,s,{get:()=>e[s],enumerable:!(n=we(e,s))||n.enumerable});return r};var xe=r=>Ae(M({},"__esModule",{value:!0}),r);var Ke={};ve(Ke,{getVCPlugin:()=>ye,refreshCredential:()=>H});module.exports=xe(Ke);var re=require("@learncard/helpers");function Re(r,e){if(r.length>=255)throw new TypeError("Alphabet too long");for(var t=new Uint8Array(256),n=0;n<t.length;n++)t[n]=255;for(var s=0;s<r.length;s++){var c=r.charAt(s),u=c.charCodeAt(0);if(t[u]!==255)throw new TypeError(c+" is ambiguous");t[u]=s}var f=r.length,a=r.charAt(0),o=Math.log(f)/Math.log(256),i=Math.log(256)/Math.log(f);function p(l){if(l instanceof Uint8Array||(ArrayBuffer.isView(l)?l=new Uint8Array(l.buffer,l.byteOffset,l.byteLength):Array.isArray(l)&&(l=Uint8Array.from(l))),!(l instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(l.length===0)return"";for(var h=0,E=0,g=0,A=l.length;g!==A&&l[g]===0;)g++,h++;for(var w=(A-g)*i+1>>>0,b=new Uint8Array(w);g!==A;){for(var P=l[g],x=0,C=w-1;(P!==0||x<E)&&C!==-1;C--,x++)P+=256*b[C]>>>0,b[C]=P%f>>>0,P=P/f>>>0;if(P!==0)throw new Error("Non-zero carry");E=x,g++}for(var V=w-E;V!==w&&b[V]===0;)V++;for(var k=a.repeat(h);V<w;++V)k+=r.charAt(b[V]);return k}d(p,"encode");function R(l){if(typeof l!="string")throw new TypeError("Expected String");if(l.length===0)return new Uint8Array;var h=0;if(l[h]!==" "){for(var E=0,g=0;l[h]===a;)E++,h++;for(var A=(l.length-h)*o+1>>>0,w=new Uint8Array(A);l[h];){var b=t[l.charCodeAt(h)];if(b===255)return;for(var P=0,x=A-1;(b!==0||P<g)&&x!==-1;x--,P++)b+=f*w[x]>>>0,w[x]=b%256>>>0,b=b/256>>>0;if(b!==0)throw new Error("Non-zero carry");g=P,h++}if(l[h]!==" "){for(var C=A-g;C!==A&&w[C]===0;)C++;for(var V=new Uint8Array(E+(A-C)),k=E;C!==A;)V[k++]=w[C++];return V}}}d(R,"decodeUnsafe");function m(l){var h=R(l);if(h)return h;throw new Error(`Non-${e} character`)}return d(m,"decode"),{encode:p,decodeUnsafe:R,decode:m}}d(Re,"base");var Ee=Re,Pe=Ee,Y=Pe;var Ye=new Uint8Array(0);var Q=d(r=>{if(r instanceof Uint8Array&&r.constructor.name==="Uint8Array")return r;if(r instanceof ArrayBuffer)return new Uint8Array(r);if(ArrayBuffer.isView(r))return new Uint8Array(r.buffer,r.byteOffset,r.byteLength);throw new Error("Unknown type, must be binary type")},"coerce");var z=class z{constructor(e,t,n){this.name=e,this.prefix=t,this.baseEncode=n}encode(e){if(e instanceof Uint8Array)return`${this.prefix}${this.baseEncode(e)}`;throw Error("Unknown type, must be binary type")}};d(z,"Encoder");var _=z,J=class J{constructor(e,t,n){if(this.name=e,this.prefix=t,t.codePointAt(0)===void 0)throw new Error("Invalid prefix character");this.prefixCodePoint=t.codePointAt(0),this.baseDecode=n}decode(e){if(typeof e=="string"){if(e.codePointAt(0)!==this.prefixCodePoint)throw Error(`Unable to decode multibase string ${JSON.stringify(e)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);return this.baseDecode(e.slice(this.prefix.length))}else throw Error("Can only multibase decode strings")}or(e){return ee(this,e)}};d(J,"Decoder");var B=J,W=class W{constructor(e){this.decoders=e}or(e){return ee(this,e)}decode(e){let t=e[0],n=this.decoders[t];if(n)return n.decode(e);throw RangeError(`Unable to decode multibase string ${JSON.stringify(e)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)}};d(W,"ComposedDecoder");var j=W,ee=d((r,e)=>new j({...r.decoders||{[r.prefix]:r},...e.decoders||{[e.prefix]:e}}),"or"),q=class q{constructor(e,t,n,s){this.name=e,this.prefix=t,this.baseEncode=n,this.baseDecode=s,this.encoder=new _(e,t,n),this.decoder=new B(e,t,s)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}};d(q,"Codec");var $=q,te=d(({name:r,prefix:e,encode:t,decode:n})=>new $(r,e,t,n),"from"),F=d(({prefix:r,name:e,alphabet:t})=>{let{encode:n,decode:s}=Y(t,e);return te({prefix:r,name:e,encode:n,decode:d(c=>Q(s(c)),"decode")})},"baseX"),Ve=d((r,e,t,n)=>{let s={};for(let i=0;i<e.length;++i)s[e[i]]=i;let c=r.length;for(;r[c-1]==="=";)--c;let u=new Uint8Array(c*t/8|0),f=0,a=0,o=0;for(let i=0;i<c;++i){let p=s[r[i]];if(p===void 0)throw new SyntaxError(`Non-${n} character`);a=a<<t|p,f+=t,f>=8&&(f-=8,u[o++]=255&a>>f)}if(f>=t||255&a<<8-f)throw new SyntaxError("Unexpected end of data");return u},"decode"),Ue=d((r,e,t)=>{let n=e[e.length-1]==="=",s=(1<<t)-1,c="",u=0,f=0;for(let a=0;a<r.length;++a)for(f=f<<8|r[a],u+=8;u>t;)u-=t,c+=e[s&f>>u];if(u&&(c+=e[s&f<<t-u]),n)for(;c.length*t&7;)c+="=";return c},"encode"),T=d(({name:r,prefix:e,bitsPerChar:t,alphabet:n})=>te({prefix:e,name:r,encode(s){return Ue(s,n,t)},decode(s){return Ve(s,n,t,r)}}),"rfc4648");var K=F({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),ot=F({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var ct=T({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),ft=T({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),G=T({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),ut=T({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});var N=d(async(r,e)=>{let t=r.id.keypair();if(!t)throw new Error("Cannot get default verification method: unable to get subject keypair");let n=await r.invoke.resolveDid(e),s=d(f=>{if(!(!f||typeof f=="string")){if(f.publicKeyJwk?.x)return f.publicKeyJwk.x;if(f.publicKeyMultibase){let a=K.decode(f.publicKeyMultibase),o=a[0]===237&&a[1]===1?a.slice(2):a;return G.encode(o).slice(1)}if(f.publicKeyBase58){let a=K.baseDecode(f.publicKeyBase58);return G.encode(a).slice(1)}}},"toX"),c=typeof n=="string"?void 0:n?.verificationMethod?.find(f=>s(f)===t.x);return typeof c!="string"&&c?.id||await r.invoke.didToVerificationMethod(e)},"getDefaultVerificationMethod");var ne=d(r=>async(e,t,n={})=>{let s=e.id.keypair();if(!s)throw new Error("Cannot issue credential: Could not get subject keypair");let c=(0,re.prepareManagedRefreshContext)(t),a=(Array.isArray(c["@context"])?c["@context"]:[c["@context"]]).some(i=>typeof i=="string"&&(i.includes("/ns/credentials/v2")||i.includes("/credentials/v2")))&&n.type==="Ed25519Signature2018"?"Ed25519Signature2020":n.type??(n.proofFormat==="jwt"?void 0:"DataIntegrityProof"),o={proofPurpose:"assertionMethod",...n,...a?{type:a}:{}};if(o.type==="DataIntegrityProof"&&!o.cryptosuite&&(o.cryptosuite="eddsa-rdfc-2022"),!("verificationMethod"in o)){let i=typeof c.issuer=="string"?c.issuer:c.issuer.id;o.verificationMethod=await N(e,i)}return e.debug?.("Signing with these options",{credential:c,options:o,kp:s}),r.invoke.issueCredential(c,o,s)},"issueCredential");var se=d(r=>async(e,t,n={})=>{let s={...n};return s.checks||(s.checks=["proof"],t.credentialStatus&&s.checks.push("credentialStatus"),t.credentialSchema&&s.checks.push("credentialSchema")),r.invoke.verifyCredential(t,s)},"verifyCredential");var ie=d(r=>async(e,t,n={})=>{let s=e.id.keypair();if(!s)throw new Error("Cannot issue credential: Could not get subject keypair");let f=(Array.isArray(t["@context"])?t["@context"]:[t["@context"]]).some(o=>typeof o=="string"&&(o.includes("/ns/credentials/v2")||o.includes("/credentials/v2")))&&n.type==="Ed25519Signature2018"?"Ed25519Signature2020":n.type??"Ed25519Signature2020",a={...n.proofFormat==="jwt"?{}:{proofPurpose:"assertionMethod",type:f},...n};return"verificationMethod"in a||(a.verificationMethod=await N(e,e.id.did())),r.invoke.issuePresentation(t,a,s)},"issuePresentation");var oe=d(r=>async(e,t,n={})=>r.invoke.verifyPresentation(t,n),"verifyPresentation");var U=require("@learncard/types"),L=require("@learncard/helpers");var Le=typeof process<"u"&&!!process.versions?.node,Ie=d(r=>{let e=new Headers;for(let[t,n]of Object.entries(r))Array.isArray(n)?n.forEach(s=>e.append(t,s)):n!==void 0&&e.append(t,n);return e},"toResponseHeaders"),ae=d(async(r,e,t)=>{if(!Le||!t)return globalThis.fetch(r.href,e);let s=await import(r.protocol==="https:"?"node:https":"node:http");return new Promise((c,u)=>{let f=d((o,i,p)=>{i?.all?p(null,[t]):p(null,t.address,t.family)},"lookup"),a;try{let o=Object.fromEntries(new Headers(e.headers).entries());o["accept-encoding"]="identity",a=s.request(r,{method:e.method,headers:o,signal:e.signal,lookup:f,agent:!1,...r.protocol==="https:"?{servername:r.hostname}:{}},i=>{try{let p=i.statusCode;if(p===void 0||!Number.isInteger(p)||p<200||p>599){u(new RangeError("Invalid refresh response status")),i.destroy();return}let m=p!==204&&p!==205&&p!==304?new ReadableStream({start(l){i.on("data",h=>{typeof h=="string"?l.enqueue(new TextEncoder().encode(h)):h instanceof Uint8Array?l.enqueue(h):l.error(new TypeError("Unsupported response chunk"))}),i.on("end",()=>l.close()),i.on("error",h=>l.error(h)),i.on("aborted",()=>l.error(new DOMException("The operation was aborted","AbortError")))},cancel(l){i.destroy(l instanceof Error?l:new Error(String(l)))}}):null;c(new Response(m,{status:p,statusText:i.statusMessage,headers:Ie(i.headers)}))}catch(p){u(p),i.destroy()}})}catch(o){u(o);return}a.on("error",u),a.end()})},"fetchWithPinnedAddress");var Se="learncarddidauth",ke=1e4,De=3e5,Te=1024,Me=3,Ne=1048576,he=new Set(["application/json","application/ld+json","application/vc+ld+json","application/vc-ld+json","application/jwe+json"]),Oe=[...he].join(", "),He=new Set([301,302,303,307,308]),y=d((r,e)=>({status:"failed",code:r,retryable:e}),"failed"),I=d(()=>y("UNSAFE_ENDPOINT",!1),"unsafeEndpoint"),v=d(()=>y("MALFORMED_RESPONSE",!1),"malformedResponse"),O=d(()=>y("INVALID_PROOF",!1),"invalidProof"),S=d(()=>y("UNAUTHORIZED",!1),"unauthorized"),de=d(r=>!!r&&r.errors.length===0&&r.warnings.length===0&&r.checks.includes("proof"),"proofVerified"),Z=d(r=>{let e=r.split(".");if(!(e.length!==4||e.some(t=>!/^\d{1,3}$/.test(t)||Number(t)<0||Number(t)>255)))return e.map(Number)},"parseIPv4Octets"),X=d(r=>{let e=Z(r);if(!e)return!0;let[t,n,s]=e;return t===0||t===10||t===127||t===100&&n>=64&&n<=127||t===169&&n===254||t===172&&n>=16&&n<=31||t===192&&n===0||t===192&&n===168||t===198&&(n===18||n===19)||t===198&&n===51&&s===100||t===203&&n===0&&s===113||t>=224},"isPrivateOrReservedIPv4"),me=d(r=>{let e=r.startsWith("["),t=r.endsWith("]");if(e!==t)return;let n=(e?r.slice(1,-1):r).toLowerCase();if(!n||n.includes("%")||(n.match(/::/g)?.length??0)>1)return;let s=n,c=s.match(/(?:^|:)(\d{1,3}(?:\.\d{1,3}){3})$/)?.[1];if(c){let m=Z(c);if(!m)return;s=s.slice(0,-c.length),s+=`${(m[0]<<8|m[1]).toString(16)}:${(m[2]<<8|m[3]).toString(16)}`}let u=s.includes("::"),[f,a=""]=s.split("::"),o=f?f.split(":"):[],i=a?a.split(":"):[],p=[...o,...i];if(p.some(m=>!/^[0-9a-f]{1,4}$/.test(m))||(u?p.length>=8:p.length!==8))return;let R=u?8-p.length:0;return[...o,...Array(R).fill(0),...i].map(m=>typeof m=="number"?m:Number.parseInt(m,16))},"parseIPv6Hextets"),_e=d(r=>{let[e,t,n]=r;return e===100&&t===65435&&r.slice(2,6).every(f=>f===0)||e===100&&t===65435&&n===1||e===8194},"isIPv4TranslationOrTransitionPrefix"),ce=d(r=>{let e=me(r);if(!e||_e(e))return!0;let[t=0,n=0]=e;if(e.slice(0,5).every(c=>c===0)&&(e[5]===0||e[5]===65535)){let c=`${(e[6]??0)>>8}.${(e[6]??0)&255}.${(e[7]??0)>>8}.${(e[7]??0)&255}`;if(X(c))return!0}return!!(e.every(c=>c===0)||e.slice(0,7).every(c=>c===0)&&e[7]===1||(t&65024)===64512||(t&65472)===65152||(t&65280)===65280||t===8193&&n===3512)},"isPrivateOrReservedIPv6"),Be=d(r=>{if(r.includes(":")){let t=me(r);return t?{address:t.map(n=>n.toString(16)).join(":"),family:6}:void 0}let e=Z(r);if(e)return{address:e.join("."),family:4}},"parsePinnedAddress"),je=typeof process<"u"&&!!process.versions?.node,$e=d(async r=>(await(await import("node:dns/promises")).lookup(r,{all:!0,verbatim:!0})).map(s=>s.address),"resolveHostnameWithNodeDns"),ge=d(async(r,e)=>{let t;try{t=new URL(r)}catch{return{result:I()}}if(t.username||t.password)return{result:I()};let n=t.protocol==="https:",s=t.protocol==="http:";if(!n&&!(s&&e.allowInsecureHttp))return{result:I()};let c=t.hostname.startsWith("["),u=t.hostname.replace(/^\[|\]$/g,"");if(!u)return{result:I()};if(c){if(!e.allowPrivateAddresses&&ce(u))return{result:I()}}else if(/^\d{1,3}(?:\.\d{1,3}){3}$/.test(u)){if(!e.allowPrivateAddresses&&X(u))return{result:I()}}else if(e.resolveHost){let f;try{f=await e.resolveHost(u)}catch{return{result:y("UNAVAILABLE",!0)}}if(f.length===0)return{result:y("UNAVAILABLE",!0)};let a=f.map(Be),o=a[0],i=a.some(p=>!p||(p.family===6?ce(p.address):X(p.address)));return!o||i&&!e.allowPrivateAddresses?{result:I()}:{url:t,pinnedAddress:o}}return{url:t}},"validateRefreshUrl"),D=d(async r=>{try{await r.response.body?.cancel()}catch{}finally{r.finish()}},"discardGuardedResponse"),fe=d(async(r,e,t)=>{if(typeof globalThis.fetch!="function")return{result:y("UNAVAILABLE",!1)};let n=r,s=r.url.origin,c=e.maxRedirects,u=t,f=Date.now()+e.timeoutMs;for(;;){let a=f-Date.now();if(a<=0)return{result:y("TIMEOUT",!0)};let o=new AbortController,i=setTimeout(()=>o.abort(),a),p;try{let h={accept:Oe};e.etag&&(h["if-none-match"]=e.etag),u&&(h.authorization=u),p=await ae(n.url,{method:"GET",redirect:"manual",signal:o.signal,headers:h},n.pinnedAddress)}catch(h){clearTimeout(i);let E=o.signal.aborted||h?.name==="AbortError";return{result:y(E?"TIMEOUT":"UNAVAILABLE",!0)}}if(!He.has(p.status))return{response:p,endpoint:n,signal:o.signal,finish:d(()=>clearTimeout(i),"finish")};if(clearTimeout(i),await p.body?.cancel().catch(()=>{}),c<=0)return{result:y("UNAVAILABLE",!1)};let R=p.headers.get("location");if(!R)return{result:v()};let m;try{m=new URL(R,n.url)}catch{return{result:I()}}let l=await ge(m.href,e);if("result"in l)return l;l.url.origin!==s&&(u=void 0),c-=1,n=l}},"fetchWithGuards"),ue=d(async(r,e,t)=>{let n=Number(r.headers.get("content-length"));if(Number.isFinite(n)&&n>e)return{result:v(),reason:"malformed"};if(!r.body)try{let o=await r.text();return new TextEncoder().encode(o).byteLength>e?{result:v(),reason:"malformed"}:{body:o}}catch{return t.aborted?{result:y("TIMEOUT",!0),reason:"timeout"}:{result:v(),reason:"malformed"}}let s=r.body.getReader(),c=[],u=0;try{for(;;){let{done:o,value:i}=await s.read();if(o)break;if(u+=i?.byteLength??0,u>e)return await s.cancel().catch(()=>{}),{result:v(),reason:"malformed"};i&&c.push(i)}}catch{return t.aborted?{result:y("TIMEOUT",!0),reason:"timeout"}:{result:v(),reason:"malformed"}}let f=new Uint8Array(u),a=0;for(let o of c)f.set(o,a),a+=o.byteLength;return{body:new TextDecoder().decode(f)}},"readBodyWithLimit"),Fe=d(r=>{if(!r)return!1;let e=r.split(";",1)[0]?.trim().toLowerCase()??"";return he.has(e)},"isAcceptedMediaType"),ze=d(r=>{let e={},t=/([a-zA-Z][a-zA-Z0-9_-]*)\s*=\s*"([^"]*)"/g,n;for(;n=t.exec(r);){let s=n[1]?.toLowerCase();s&&n[2]&&(e[s]=n[2])}return e},"parseAuthParams"),Je=d((r,e,t)=>{let n=r.headers.get("www-authenticate")??"";if(n.trim().split(/\s/,1)[0]?.toLowerCase()!==Se)return;let c=ze(n),u=c.challenge,f=c.domain,a=Date.now()+De;if(e){let o;try{o=JSON.parse(e)}catch{return}let i=U.CredentialRefreshChallengeValidator.safeParse(o);if(!i.success||u&&i.data.challenge!==u||f&&i.data.domain&&i.data.domain!==f||(u=i.data.challenge,f=i.data.domain??f,a=Date.parse(i.data.expiresAt),Number.isNaN(a)||a<=Date.now()))return}if(!(!u||f&&f!==t))return{challenge:u,domain:t,expiresAt:a}},"parseDidAuthChallenge"),le=d(r=>typeof r=="number"&&Number.isInteger(r)&&r>0?r:void 0,"asManagedVersion"),We=d(async(r,e,t)=>{let n=t.headers.get("etag")??void 0,s=d(async a=>{let o=r.invoke.decryptDagJwe;if(typeof o!="function")return{failure:y("UNSUPPORTED_SERVICE",!1)};let i;try{i=await o(a)}catch{return{failure:v()}}let p=U.VCValidator.safeParse(i);return p.success?{credential:p.data}:{failure:v()}},"decryptJwe"),c=d(a=>typeof a=="string"?a:n,"envelopeEtag");if(e!==null&&typeof e=="object"&&"format"in e){let a=e;if(a.format==="jwe"){let o=U.JWEValidator.safeParse(a.jwe);if(!o.success)return v();let i=await s(o.data);return"failure"in i?i.failure:{credential:i.credential,etag:c(a.etag),managedVersion:le(a.version)}}if(a.format==="vc"){let o=U.VCValidator.safeParse(a.credential);return o.success?{credential:o.data,etag:c(a.etag),managedVersion:le(a.version)}:v()}return v()}let u=U.VCValidator.safeParse(e);if(u.success)return{credential:u.data,etag:n};let f=U.JWEValidator.safeParse(e);if(f.success){let a=await s(f.data);return"failure"in a?a.failure:{credential:a.credential,etag:n}}return v()},"decodeCandidate"),pe=d(r=>{let e=r.credentialSubject;return(Array.isArray(e)?e:[e]).map(n=>typeof n?.id=="string"?n.id:"").sort()},"getHolderIds"),qe=d((r,e)=>{let t=pe(r),n=pe(e);return t.length===n.length&&t.every((s,c)=>s===n[c])},"holdersEqual"),H=d(r=>{let e=new Map;return async(t,n,s={})=>{let c={etag:s.etag,timeoutMs:s.timeoutMs??ke,maxRedirects:s.maxRedirects??Me,maxResponseBytes:s.maxResponseBytes??Ne,allowInsecureHttp:s.allowInsecureHttp??!1,allowPrivateAddresses:s.allowPrivateAddresses??!1,resolveHost:s.resolveHost??(je?$e:void 0)},u=(0,L.getSupportedRefreshService)(n);if(!u)return{status:"unsupported"};try{let g=await t.invoke.verifyCredential(n);if(!de(g))return O()}catch{return O()}if(u.type==="LearnCardCredentialRefresh2026"&&(typeof n.id!="string"||n.id.length===0))return y("ID_MISMATCH",!1);let f=await ge(u.id,c);if("result"in f)return f.result;let a=await fe(f,c);if("result"in a)return a.result;let o=a,i=o.response;if(i.status===401&&u.type==="LearnCardCredentialRefresh2026"){if(o.endpoint.url.origin!==f.url.origin)return await D(o),S();let g=await ue(i,c.maxResponseBytes,o.signal);if(o.finish(),"result"in g)return g.reason==="timeout"?g.result:S();let A=o.endpoint.url.host,w=Je(i,g.body,A);if(!w)return S();let b=`${o.endpoint.url.origin}|${w.challenge}`,P=Date.now();for(let[V,k]of e)k<=P&&e.delete(V);if(e.has(b)||e.size>=Te)return S();e.set(b,w.expiresAt);let x;try{x=await t.invoke.getDidAuthVp({proofFormat:"jwt",challenge:w.challenge,domain:A})}catch{return S()}let C=await fe(o.endpoint,c,`Bearer ${typeof x=="string"?x:JSON.stringify(x)}`);if("result"in C)return C.result;o=C,i=o.response}if(i.status===304)return await D(o),{status:"unchanged",checkedAt:new Date().toISOString(),etag:i.headers.get("etag")??c.etag};if(i.status===410)return await D(o),y("REVOKED",!1);if(i.status===401||i.status===403)return await D(o),S();if(i.status<200||i.status>299)return await D(o),y("UNAVAILABLE",i.status>=500);if(!Fe(i.headers.get("content-type")))return await D(o),v();let p=await ue(i,c.maxResponseBytes,o.signal);if(o.finish(),"result"in p)return p.result;let R;try{R=JSON.parse(p.body)}catch{return v()}if(u.type==="1EdTechCredentialRefresh"&&!U.VCValidator.safeParse(R).success)return v();let m=await We(t,R,i);if("status"in m)return m;let l=m.credential;try{let g=await t.invoke.verifyCredential(l);if(!de(g))return O()}catch{return O()}if(l.id!==n.id)return y("ID_MISMATCH",!1);if((0,L.getCredentialIssuerId)(l)!==(0,L.getCredentialIssuerId)(n))return y("ISSUER_MISMATCH",!1);if(!qe(n,l))return y("ID_MISMATCH",!1);let h=(0,L.getCredentialEffectiveTime)(n),E=(0,L.getCredentialEffectiveTime)(l);return h!==void 0&&E!==void 0&&E<h?y("ROLLBACK",!1):(0,L.credentialContentsEqual)(n,l)?{status:"unchanged",checkedAt:new Date().toISOString(),etag:m.etag}:{status:"updated",credential:l,...m.etag?{etag:m.etag}:{},...m.managedVersion?{managedVersion:m.managedVersion}:{}}}},"refreshCredential");var ye=d(r=>({name:"VC",displayName:"VC",description:"Handles the infrastructure needed to issue and verify credentials and presentations",methods:{issueCredential:ne(r),verifyCredential:se(r),issuePresentation:ie(r),verifyPresentation:oe(r),refreshCredential:H(r),getTestVc:d((e,t="did:example:d23dd687a7dc6787646f2eb98d0")=>{let n=e.id.did();return{"@context":["https://www.w3.org/ns/credentials/v2"],id:`urn:uuid:${crypto.randomUUID()}`,type:["VerifiableCredential"],issuer:n,validFrom:new Date().toISOString(),credentialSubject:{id:t}}},"getTestVc"),getTestVp:d(async(e,t)=>{let n=t||await e.invoke.issueCredential(e.invoke.getTestVc()),s=e.id.did();return{"@context":["https://www.w3.org/ns/credentials/v2"],type:["VerifiablePresentation"],holder:s,verifiableCredential:n}},"getTestVp"),getDidAuthVp:d(async(e,t={})=>{let n=e.id.did(),s={"@context":["https://www.w3.org/ns/credentials/v2"],type:["VerifiablePresentation"],holder:n};return e.invoke.issuePresentation(s,{proofPurpose:"authentication",...t})},"getDidAuthVp")}}),"getVCPlugin");
|
|
2
2
|
//# sourceMappingURL=vc-plugin.cjs.production.min.cjs.map
|