{
  "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": ["cid", "didParse"]
}
