{
  "version": 3,
  "sources": ["../src/delegation.ts"],
  "sourcesContent": ["import type { DelegationValidateOptions, Policy, DelegationOptions, DelegationPayload, DID, DIDURL, StandardSchemaV1, DecodedEnvelope, DelegationFromOptions } from './types.js'\nimport type { CID } from 'multiformats'\nimport { base64pad } from 'iso-base/rfc4648'\nimport { parse as didParse } from 'iso-did'\nimport { randomBytes } from 'iso-web/crypto'\nimport * as Envelope from './envelope.js'\nimport {\n    assertExpiration,\n    assertIsValidCommand,\n    assertMeta,\n    assertNonce,\n    assertNotBefore,\n    assertNotRevoked,\n    cid,\n    expOrTtl,\n    verifySignature,\n} from './util.js'\n\n/**\n * UCAN Delegation\n */\nexport class Delegation {\n    iss:DIDURL\n    aud:DID\n    sub:DID | null\n    cmd:string\n    pol:Policy<unknown>\n    nbf:number | undefined\n    nonce:Uint8Array\n    meta:Record<string, unknown> | undefined\n    exp:number | null\n    envelope:DecodedEnvelope<'dlg'>\n    bytes:Uint8Array\n    cid:CID\n\n    constructor (envelope:DecodedEnvelope<'dlg'>, bytes:Uint8Array, cid:CID) {\n        this.envelope = envelope\n        this.bytes = bytes\n        this.cid = cid\n\n        this.iss = envelope.payload.iss\n        this.aud = envelope.payload.aud\n        this.sub = envelope.payload.sub ? envelope.payload.sub : null\n        this.cmd = envelope.payload.cmd\n        this.pol = envelope.payload.pol\n        this.exp = envelope.payload.exp\n        this.nbf = envelope.payload.nbf\n        this.nonce = envelope.payload.nonce\n        this.meta = envelope.payload.meta\n    }\n\n    /**\n     * Create a delegation from bytes and validate it\n     *\n     * Does not validate \"not before\" time, call {@link Delegation.validate} to validate it\n     */\n    static async from (options:DelegationFromOptions):Promise<Delegation> {\n        const { bytes, didResolver: didResolveOptions, verifierResolver } = options\n\n        const envelope = Envelope.decode({ envelope: bytes }) as DecodedEnvelope<'dlg'>\n\n        if (envelope.spec !== 'dlg') {\n            throw new Error(\n        `Invalid envelope type. Expected: Delegation but got: ${envelope.spec}`\n            )\n        }\n\n        assertStructure(envelope.payload)\n\n        await verifySignature(envelope, verifierResolver, didResolveOptions)\n\n        const _cid = await cid(envelope)\n        await assertNotRevoked(_cid, options.isRevoked)\n\n        return new Delegation(envelope, bytes, _cid)\n    }\n\n    /**\n     * Create a delegation from a base64 encoded string\n     */\n    static async fromString (token:string):Promise<Delegation> {\n        const bytes = base64pad.decode(token)\n        const envelope = Envelope.decode({ envelope: bytes }) as DecodedEnvelope<'dlg'>\n\n        if (envelope.spec !== 'dlg') {\n            throw new Error(\n        `Invalid envelope type. Expected: Delegation but got: ${envelope.spec}`\n            )\n        }\n\n        assertStructure(envelope.payload)\n        const _cid = await cid(envelope)\n        return new Delegation(envelope, bytes, _cid)\n    }\n\n    static async create<Schema extends StandardSchemaV1> (\n        options:DelegationOptions<Schema>\n    ):Promise<Delegation> {\n        const nonce = options.nonce || randomBytes(12)\n\n        const payload:DelegationPayload<StandardSchemaV1.InferOutput<Schema>> = {\n            iss: options.iss.toString(),\n            aud: options.aud,\n            sub: options.sub ? options.sub : null,\n            pol: options.pol,\n            cmd: options.cmd,\n            nonce,\n            exp: expOrTtl(options),\n        }\n\n        if (options.nbf) {\n            payload.nbf = options.nbf\n        }\n\n        if (options.meta) {\n            payload.meta = options.meta\n        }\n\n        assertStructure(payload)\n\n        const { signature, signaturePayload } = await Envelope.sign({\n            spec: 'dlg',\n            signer: options.iss,\n            payload,\n        })\n\n        const bytes = Envelope.encode({ signature, signaturePayload })\n\n        const envelope:DecodedEnvelope<'dlg'> = {\n            alg: options.iss.signatureType,\n            enc: 'DAG-CBOR',\n            signature,\n            payload,\n            spec: 'dlg',\n            version: Envelope.VERSION,\n        }\n\n        return new Delegation(envelope, bytes, await cid(envelope))\n    }\n\n    /**\n     * Validate a delegation\n     *\n     * Checks the structure, \"not before\" time, signature, and revocation status\n     */\n    async validate (options:DelegationValidateOptions):Promise<boolean> {\n        assertStructure(this.envelope.payload)\n        assertNotBefore(this.envelope.payload.nbf)\n        await verifySignature(\n            this.envelope,\n            options.verifierResolver,\n            options.didResolver\n        )\n        await assertNotRevoked(this.cid, options.isRevoked)\n\n        return true\n    }\n\n    toString ():string {\n        return base64pad.encode(this.bytes)\n    }\n\n    toJSON () {\n        return {\n            token: this.toString(),\n            cid: this.cid.toString(),\n            envelope: {\n                payload: {\n                    iss: this.iss.toString(),\n                    aud: this.aud.toString(),\n                    sub: this.sub ? this.sub.toString() : null,\n                    cmd: this.cmd,\n                    pol: this.pol,\n                    exp: this.exp,\n                    nbf: this.nbf,\n                    nonce: base64pad.encode(this.nonce),\n                    meta: this.meta,\n                },\n                signature: base64pad.encode(this.envelope.signature),\n                alg: this.envelope.alg,\n                enc: this.envelope.enc,\n                spec: this.envelope.spec,\n                version: this.envelope.version,\n            },\n        }\n    }\n}\n\nfunction assertStructure (payload:DelegationPayload<unknown>):void {\n    didParse(payload.iss)\n    didParse(payload.aud)\n\n    if (payload.sub !== null) {\n        didParse(payload.sub)\n    }\n\n    assertIsValidCommand(payload.cmd)\n    assertExpiration(payload.exp)\n    assertNonce(payload.nonce)\n\n    // assertPolicy(payload.pol)\n\n    assertMeta(payload.meta)\n}\n"],
  "mappings": "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",
  "names": ["cid", "didParse"]
}
