{
  "version": 3,
  "sources": ["../src/invocation.ts"],
  "sourcesContent": ["import type { Delegation } from './delegation.js'\nimport type { CID } from 'multiformats'\nimport type { InvocationFromOptions, InvocationOptions, InvocationPayload, Payload, DecodedEnvelope } from './types.js'\nimport { parse as didParse } from 'iso-did'\nimport { randomBytes } from 'iso-web/crypto'\nimport * as Envelope from './envelope.js'\nimport { validate } from './policy.js'\nimport {\n    assertArgs,\n    assertExpiration,\n    assertIsValidCommand,\n    assertMeta,\n    assertNonce,\n    cid,\n    expOrTtl,\n    verifySignature,\n} from './util.js'\n\n/**\n * UCAN Invocation\n */\nexport class Invocation {\n    delegations:Delegation[]\n    cid:CID\n    envelope:DecodedEnvelope<'inv'>\n    payload:InvocationPayload\n    bytes:Uint8Array\n\n    constructor (envelope:DecodedEnvelope<'inv'>, bytes:Uint8Array, cid:CID, delegations:Delegation[]) {\n        this.envelope = envelope\n        this.payload = envelope.payload\n        this.bytes = bytes\n        this.cid = cid\n        this.delegations = delegations\n    }\n\n    static async from (options:InvocationFromOptions):Promise<Invocation> {\n        const { bytes, audience } = options\n\n        const envelope = Envelope.decode({ envelope: bytes }) as DecodedEnvelope<'inv'>\n\n        if (envelope.spec !== 'inv') {\n            throw new TypeError(\n        `Invalid envelope type. Expected \"inv\" but got \"${envelope.spec}\"`\n            )\n        }\n        // Audience or subject must match receiver\n        if (\n            envelope.payload.aud !== audience.did &&\n      envelope.payload.sub !== audience.did\n        ) {\n            throw new TypeError(\n        `UCAN Invocation audience or subject does not match receiver. Expected: ${audience.did} but got: ${envelope.payload.aud ?? envelope.payload.sub ?? 'null'}`\n            )\n        }\n\n        assertStructure(envelope.payload)\n        await verifySignature(\n            envelope,\n            options.verifierResolver,\n            options.didResolver\n        )\n\n        // Resolve and validate proofs\n        const proofs:Delegation[] = []\n        const iss = didParse(envelope.payload.iss)\n        if (iss.did !== envelope.payload.sub) {\n            for (const proof of envelope.payload.prf) {\n                const delegation = await options.resolveProof(proof)\n                await delegation.validate(options)\n                proofs.push(delegation)\n            }\n\n            assertProofs(envelope.payload, proofs)\n        }\n\n        const _cid = await cid(envelope)\n        return new Invocation(envelope, bytes, _cid, proofs)\n    }\n\n    static async create (options:InvocationOptions):Promise<Invocation> {\n        const nonce = options.nonce || randomBytes(12)\n\n        const payload:InvocationPayload = {\n            iss: options.iss.toString(),\n            aud: options.aud ? options.aud : options.sub,\n            sub: options.sub,\n            cmd: options.cmd,\n            nonce,\n            exp: expOrTtl(options),\n            args: options.args,\n            prf: options.prf.map((p) => p.cid),\n        }\n        if (options.cause) {\n            payload.cause = options.cause\n        }\n        if (options.meta) {\n            payload.meta = options.meta\n        }\n        if (options.iat) {\n            payload.iat = options.iat\n        }\n        if (options.nbf) {\n            payload.nbf = options.nbf\n        }\n\n        assertStructure(payload)\n\n        if (options.iss.did !== options.sub) {\n            for (const proof of options.prf) {\n                await proof.validate(options)\n            }\n\n            assertProofs(payload, options.prf)\n        }\n\n        const { signature, signaturePayload } = await Envelope.sign({\n            spec: 'inv',\n            signer: options.iss,\n            payload,\n        })\n\n        const bytes = Envelope.encode({ signature, signaturePayload })\n\n        const envelope:DecodedEnvelope<'inv'> = {\n            alg: options.iss.signatureType,\n            enc: 'DAG-CBOR',\n            signature,\n            payload,\n            spec: 'inv',\n            version: Envelope.VERSION,\n        }\n\n        return new Invocation(envelope, bytes, await cid(envelope), options.prf)\n    }\n}\n\nfunction assertStructure (payload:InvocationPayload):void {\n    didParse(payload.iss)\n    didParse(payload.sub)\n\n    if (payload.aud) {\n        didParse(payload.aud)\n    }\n\n    assertIsValidCommand(payload.cmd)\n    assertArgs(payload.args)\n    assertMeta(payload.meta)\n    assertNonce(payload.nonce)\n    assertExpiration(payload.exp)\n}\n\nexport function assertProofs (payload:InvocationPayload, proofs:Delegation[]):boolean {\n    if (payload.prf.length <= 0) {\n        throw new Error('UCAN Invocation proofs are required')\n    }\n\n    if (proofs.length !== payload.prf.length) {\n        throw new Error(\"UCAN Invocation couldn't resolve all proofs CIDs\")\n    }\n\n    const lastProof = proofs[proofs.length - 1]\n    const issuerDid = didParse(lastProof.envelope.payload.iss).did\n    if (issuerDid !== lastProof.envelope.payload.sub) {\n        throw new Error('UCAN Invocation root proof is not self-signed')\n    }\n\n    for (let index = 0; index < proofs.length; index++) {\n        const current = proofs[index].envelope.payload\n        const currentAudience = didParse(current.aud)\n        const currentSubject = didParse(current.sub ?? payload.sub)\n\n        if (!validate(payload.args, current.pol)) {\n            throw new Error(\n        `UCAN Invocation invalid arguments, expected ${JSON.stringify(payload.args)} to be valid for policy ${JSON.stringify(current.pol)} `\n            )\n        }\n\n        const nextProof = proofs[index + 1]\n        let next:Payload\n        if (nextProof) {\n            next = nextProof.envelope.payload\n        } else {\n            next = payload\n        }\n\n        const nextIssuer = didParse(next.iss)\n        const nextSubject = didParse(next.sub ?? payload.sub)\n        if (nextIssuer.did !== currentAudience.did) {\n            throw new Error(\n        `UCAN Invocation principal alignment mismatch, expected ${currentAudience.toString()} but got ${nextIssuer.toString()}`\n            )\n        }\n\n        if (nextSubject.did !== currentSubject.did) {\n            throw new Error(\n        `UCAN Invocation subject alignment mismatch, expected ${currentSubject.toString()} but got ${nextSubject.toString()}`\n            )\n        }\n\n        if (!next.cmd.startsWith(current.cmd)) {\n            throw new Error(\n        `UCAN Invocation command mismatch, expected ${current.cmd} to be a broader than ${next.cmd}`\n            )\n        }\n    }\n\n    return true\n}\n"],
  "mappings": "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",
  "names": ["invocation_exports", "__export", "Invocation", "assertProofs", "__toCommonJS", "import_iso_did", "import_crypto", "Envelope", "import_policy", "import_util", "Invocation", "__name", "envelope", "bytes", "cid", "delegations", "options", "audience", "assertStructure", "proofs", "didParse", "proof", "delegation", "assertProofs", "_cid", "nonce", "payload", "p", "signature", "signaturePayload", "lastProof", "index", "current", "currentAudience", "currentSubject", "nextProof", "next", "nextIssuer", "nextSubject"]
}
