{"version":3,"file":"base64url.mjs","names":[],"sources":["../../src/utils/base64url.ts"],"sourcesContent":["/**\n * Pure-JS base64url codec (no padding, RFC 4648 §5).\n *\n * Lives in `utils/` rather than `crypto/` because it's needed by models (e.g.\n * VaultDocument serialization) and we don't want models pulling the crypto\n * provider — that would force the Node WASM provider into the RN bundle even\n * for code paths that don't touch crypto.\n *\n * Both providers (Node WASM and RN) re-export these helpers under the same\n * names; this module is the canonical implementation used by non-crypto code.\n */\n\nconst B64URL_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'\nconst B64URL_DECODE = (() => {\n  const m = new Int16Array(256).fill(-1)\n  for (let i = 0; i < B64URL_CHARS.length; i++) m[B64URL_CHARS.charCodeAt(i)] = i\n  return m\n})()\n\nexport function toBase64UrlPure(data: Uint8Array): string {\n  let out = ''\n  let i = 0\n  for (; i + 2 < data.length; i += 3) {\n    const v = (data[i] << 16) | (data[i + 1] << 8) | data[i + 2]\n    out +=\n      B64URL_CHARS[(v >> 18) & 0x3f] +\n      B64URL_CHARS[(v >> 12) & 0x3f] +\n      B64URL_CHARS[(v >> 6) & 0x3f] +\n      B64URL_CHARS[v & 0x3f]\n  }\n  if (i < data.length) {\n    const a = data[i]\n    const b = i + 1 < data.length ? data[i + 1] : 0\n    out += B64URL_CHARS[(a >> 2) & 0x3f]\n    if (i + 1 < data.length) {\n      out += B64URL_CHARS[((a << 4) & 0x30) | ((b >> 4) & 0x0f)] + B64URL_CHARS[(b << 2) & 0x3c]\n    } else {\n      out += B64URL_CHARS[(a << 4) & 0x30]\n    }\n  }\n  return out\n}\n\nexport function fromBase64UrlPure(encoded: string): Uint8Array {\n  const len = encoded.length\n  const byteLen = Math.floor((len * 3) / 4)\n  const out = new Uint8Array(byteLen)\n  let oi = 0\n  let buf = 0\n  let bits = 0\n  for (let i = 0; i < len; i++) {\n    const v = B64URL_DECODE[encoded.charCodeAt(i)]\n    if (v < 0) throw new Error(`Invalid base64url character at ${i}`)\n    buf = (buf << 6) | v\n    bits += 6\n    if (bits >= 8) {\n      bits -= 8\n      out[oi++] = (buf >> bits) & 0xff\n    }\n  }\n  return out.subarray(0, oi)\n}\n"],"mappings":";;;;;;;;;;;;AAYA,MAAM,eAAe;AACrB,MAAM,uBAAuB;CAC3B,MAAM,IAAI,IAAI,WAAW,IAAI,CAAC,KAAK,GAAG;AACtC,MAAK,IAAI,IAAI,GAAG,IAAI,IAAqB,IAAK,GAAE,aAAa,WAAW,EAAE,IAAI;AAC9E,QAAO;IACL;AAEJ,SAAgB,gBAAgB,MAA0B;CACxD,IAAI,MAAM;CACV,IAAI,IAAI;AACR,QAAO,IAAI,IAAI,KAAK,QAAQ,KAAK,GAAG;EAClC,MAAM,IAAK,KAAK,MAAM,KAAO,KAAK,IAAI,MAAM,IAAK,KAAK,IAAI;AAC1D,SACE,aAAc,KAAK,KAAM,MACzB,aAAc,KAAK,KAAM,MACzB,aAAc,KAAK,IAAK,MACxB,aAAa,IAAI;;AAErB,KAAI,IAAI,KAAK,QAAQ;EACnB,MAAM,IAAI,KAAK;EACf,MAAM,IAAI,IAAI,IAAI,KAAK,SAAS,KAAK,IAAI,KAAK;AAC9C,SAAO,aAAc,KAAK,IAAK;AAC/B,MAAI,IAAI,IAAI,KAAK,OACf,QAAO,aAAe,KAAK,IAAK,KAAU,KAAK,IAAK,MAAS,aAAc,KAAK,IAAK;MAErF,QAAO,aAAc,KAAK,IAAK;;AAGnC,QAAO;;AAGT,SAAgB,kBAAkB,SAA6B;CAC7D,MAAM,MAAM,QAAQ;CACpB,MAAM,UAAU,KAAK,MAAO,MAAM,IAAK,EAAE;CACzC,MAAM,MAAM,IAAI,WAAW,QAAQ;CACnC,IAAI,KAAK;CACT,IAAI,MAAM;CACV,IAAI,OAAO;AACX,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;EAC5B,MAAM,IAAI,cAAc,QAAQ,WAAW,EAAE;AAC7C,MAAI,IAAI,EAAG,OAAM,IAAI,MAAM,kCAAkC,IAAI;AACjE,QAAO,OAAO,IAAK;AACnB,UAAQ;AACR,MAAI,QAAQ,GAAG;AACb,WAAQ;AACR,OAAI,QAAS,OAAO,OAAQ;;;AAGhC,QAAO,IAAI,SAAS,GAAG,GAAG"}