{
  "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": ["delegation_exports", "__export", "Delegation", "__toCommonJS", "import_rfc4648", "import_iso_did", "import_crypto", "Envelope", "import_util", "Delegation", "__name", "envelope", "bytes", "cid", "options", "didResolveOptions", "verifierResolver", "assertStructure", "_cid", "token", "nonce", "payload", "signature", "signaturePayload", "didParse"]
}
