{"version":3,"file":"crypto.cjs","sources":["../../src/include/crypto.ts"],"sourcesContent":["import sodium from \"libsodium-wrappers\";\nimport compresor from \"./compress\";\n\n/* ================================\n   Types\n================================ */\nexport type EncryptInput = string | object | any[];\n\n/* ================================\n   Sodium Init (SAFE & IDP)\n================================ */\nlet initPromise: Promise<void> | null = null;\n\nasync function init(): Promise<void> {\n   if (!initPromise) {\n      initPromise = sodium.ready.then(() => void 0);\n   }\n   return initPromise;\n}\n\n/* ================================\n   Key Derivation\n   (Stable & deterministic)\n================================ */\nfunction deriveKey(secret: string): Uint8Array {\n   return sodium.crypto_generichash(\n      sodium.crypto_secretbox_KEYBYTES,\n      sodium.from_string(secret),\n      null\n   ) as Uint8Array\n}\n\n/* ================================\n   Encrypt (string)\n================================ */\nasync function encrypt(\n   input: EncryptInput,\n   secret: string\n): Promise<string> {\n   const buf = await encryptBuffer(input, secret);\n   return sodium.to_base64(\n      buf,\n      sodium.base64_variants.URLSAFE_NO_PADDING\n   );\n}\n\n/* ================================\n   Decrypt (string)\n================================ */\nasync function decrypt(\n   base64: string,\n   secret: string\n): Promise<any | null> {\n   await init();\n\n   const box = sodium.from_base64(\n      base64,\n      sodium.base64_variants.URLSAFE_NO_PADDING\n   );\n\n   return decryptBuffer(box, secret);\n}\n\n/* ================================\n   Encrypt (buffer)\n================================ */\nasync function encryptBuffer(\n   input: EncryptInput,\n   secret: string\n): Promise<Uint8Array> {\n   await init();\n\n   const key = deriveKey(secret);\n   const nonce = sodium.randombytes_buf(\n      sodium.crypto_secretbox_NONCEBYTES\n   ) as Uint8Array\n\n\n   const compressed = await compresor.compressBuffer(input);\n\n   const cipher = sodium.crypto_secretbox_easy(\n      compressed,\n      nonce,\n      key\n   ) as Uint8Array\n\n   const out = new Uint8Array(nonce.length + cipher.length);\n   out.set(nonce);\n   out.set(cipher, nonce.length);\n\n   return out;\n}\n\n/* ================================\n   Decrypt (buffer)\n================================ */\nasync function decryptBuffer(\n   box: Uint8Array,\n   secret: string\n): Promise<any | null> {\n   await init();\n\n   const key = deriveKey(secret);\n   const nonceSize = sodium.crypto_secretbox_NONCEBYTES;\n\n   if (box.length <= nonceSize) return null;\n\n   const nonce = box.subarray(0, nonceSize);\n   const cipher = box.subarray(nonceSize);\n\n   const opened = sodium.crypto_secretbox_open_easy(\n      cipher,\n      nonce,\n      key\n   ) as Uint8Array\n\n   if (!opened) return null;\n\n   return compresor.decompressBuffer(opened);\n}\n\n/* ================================\n   Hash (URL-safe, short)\n================================ */\nasync function hash(str: string): Promise<string> {\n   await init();\n\n   const digest = sodium.crypto_generichash(\n      32,\n      sodium.from_string(str),\n      null\n   );\n\n   return sodium\n      .to_base64(digest, sodium.base64_variants.URLSAFE_NO_PADDING)\n      .replace(/[^a-zA-Z0-9]/g, \"\");\n}\n\n/* ================================\n   Canonical JSON\n================================ */\nfunction canonicalJSON(value: any): string {\n   if (value === null || typeof value !== \"object\") {\n      return JSON.stringify(value);\n   }\n\n   if (Array.isArray(value)) {\n      return JSON.stringify(value.map(canonicalJSON));\n   }\n\n   const keys = Object.keys(value).sort();\n   const obj: any = {};\n\n   for (const k of keys) {\n      obj[k] = value[k];\n   }\n\n   return JSON.stringify(obj);\n}\n\n/* ================================\n   Create Token\n================================ */\nasync function createToken(\n   payload: Record<string, any>,\n   secret: string\n): Promise<string> {\n   await init();\n\n   const key = deriveKey(secret);\n   const json = canonicalJSON(payload);\n\n   const encryptedPayload = await encrypt(payload, secret);\n\n   const mac = sodium.crypto_generichash(\n      32,\n      sodium.from_string(json),\n      key\n   );\n\n   const macBase64 = sodium.to_base64(\n      mac,\n      sodium.base64_variants.URLSAFE_NO_PADDING\n   );\n\n   return `${encryptedPayload}.${macBase64}`;\n}\n\n/* ================================\n   Verify Token\n================================ */\nasync function verifyToken(\n   token: string,\n   secret: string\n): Promise<{ valid: boolean; payload?: any }> {\n   await init();\n\n   const parts = token.split(\".\");\n   if (parts.length !== 2) return { valid: false };\n\n   const [payloadBase64, macBase64] = parts;\n\n   const payload = await decrypt(payloadBase64, secret);\n   if (payload === null) return { valid: false };\n\n   const json = canonicalJSON(payload);\n   const key = deriveKey(secret);\n\n   const expectedMac = sodium.crypto_generichash(\n      32,\n      sodium.from_string(json),\n      key\n   ) as Uint8Array\n\n   const mac = sodium.from_base64(\n      macBase64,\n      sodium.base64_variants.URLSAFE_NO_PADDING\n   );\n\n   if (\n      mac.length !== expectedMac.length ||\n      !sodium.memcmp(expectedMac, mac)\n   ) {\n      return { valid: false };\n   }\n\n   return { valid: true, payload };\n}\n\n\n\nconst crypto = {\n   init,\n   encrypt,\n   decrypt,\n   encryptBuffer,\n   decryptBuffer,\n   hash,\n   createToken,\n   verifyToken,\n}\n\nexport default crypto"],"names":["compresor"],"mappings":"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"}