cipher-kit 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,9 +4,8 @@
4
4
  <h1 align="center" style="font-weight:900;">cipher-kit</h1>
5
5
 
6
6
  <p align="center">
7
- A Secure, Lightweight, and Cross-platform Package<br/>
8
- for Encryption and Decryption<br/>
9
- Built for Web, Node.js, Deno, and Bun environments
7
+ Secure, Lightweight, and Cross-Platform <br/>
8
+ Encryption & Decryption for Web, Node.js, Deno, and Bun
10
9
  </p>
11
10
 
12
11
  <a href="https://opensource.org/licenses/MIT" rel="nofollow"><img src="https://img.shields.io/github/license/WolfieLeader/npm?color=DC343B" alt="License"></a>
@@ -18,22 +17,16 @@
18
17
 
19
18
  ## About 📖
20
19
 
21
- `cipher-kit` is a versatile encryption toolkit designed to work seamlessly across multiple environments, including:
22
-
23
- - **Web** (using the Web Crypto API)
24
- - **Node.js**
25
- - **Deno**
26
- - **Bun**
27
-
28
- It provides a simple and secure way to encrypt and decrypt data, ensuring that your sensitive information remains protected regardless of the platform you are using, with error handling and type safety in mind.
20
+ `cipher-kit` is a modern encryption toolkit designed to work seamlessly across **Web**, **Node.js**, **Deno**, and **Bun** environments.
21
+ It provides a simple, secure, and dependency-free API for encrypting and decrypting data with **AES-GCM**, ensuring strong security, predictable behavior, and type safety.
29
22
 
30
23
  ## Features 🌟
31
24
 
32
- - **AES-GCM** – Uses AES-GCM for secure and authenticated encryption and decryption.
33
- - 🌐 **Cross-Platform Support** – Works seamlessly in Web, Node.js, Deno, and Bun environments.
34
- - 🚫 **No External Dependencies** – Does not rely on any external libraries or modules.
35
- - 🔒 **Key Derivation via SHA256** – Derives encryption keys from passwords using SHA256.
36
- - 🧪 **Strict Input Validation and `Result` Typing** - Using unified `Result<T>` type and strict input validation to ensure type safety and prevent errors.
25
+ - 🛡️ **AES-GCM Encryption** – Secure and authenticated encryption with built-in integrity checks.
26
+ - 🌐 **Cross-Platform** – Works in Web, Node.js, Deno, and Bun without code changes.
27
+ - 🚫 **Zero Dependencies** – Fully self-contained, no external libraries required.
28
+ - 🔒 **SHA-256 Key Derivation** – Derives strong encryption keys from passwords.
29
+ - 🧪 **Strict Validation & `Result<T>` Typing** Unified return type with robust input validation.
37
30
 
38
31
  ## Installation 🔥
39
32
 
@@ -1,4 +1,4 @@
1
- import { $err, $ok, $stringifyError, $isStr } from './chunk-K5MLGTAJ.js';
1
+ import { $err, $ok, $stringifyError, $isStr, $stringifyObj, $parseToObj } from './chunk-7QVQLIZE.js';
2
2
 
3
3
  // src/web/encode.ts
4
4
  var textEncoder = new TextEncoder();
@@ -183,7 +183,17 @@ async function decrypt(encrypted, secretKey) {
183
183
  return $err({ message: "Failed to decrypt data with Crypto Web API", description: $stringifyError(error) });
184
184
  }
185
185
  }
186
+ async function encryptObj(data, secretKey) {
187
+ const { result, error } = $stringifyObj(data);
188
+ if (error) return $err(error);
189
+ return await encrypt(result, secretKey);
190
+ }
191
+ async function decryptObj(encrypted, secretKey) {
192
+ const { result, error } = await decrypt(encrypted, secretKey);
193
+ if (error) return $err(error);
194
+ return $parseToObj(result);
195
+ }
186
196
 
187
- export { ENCRYPTED_WEB_API_REGEX, WEB_API_ALGORITHM, decode, decrypt, encode, encrypt, hash, newSecretKey, newUuid };
188
- //# sourceMappingURL=chunk-57CXI3PH.js.map
189
- //# sourceMappingURL=chunk-57CXI3PH.js.map
197
+ export { ENCRYPTED_WEB_API_REGEX, WEB_API_ALGORITHM, decode, decrypt, decryptObj, encode, encrypt, encryptObj, hash, newSecretKey, newUuid };
198
+ //# sourceMappingURL=chunk-42BWXKCF.js.map
199
+ //# sourceMappingURL=chunk-42BWXKCF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/web/encode.ts","../src/web/utils.ts","../src/web/encrypt.ts"],"names":["error"],"mappings":"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","file":"chunk-42BWXKCF.js","sourcesContent":["import { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { EncodingFormat } from '~/types';\r\n\r\nconst textEncoder = new TextEncoder();\r\nconst textDecoder = new TextDecoder();\r\n\r\nexport function encode(data: string, format: EncodingFormat = 'utf8'): Result<{ bytes: Uint8Array }> {\r\n try {\r\n switch (format) {\r\n case 'base64':\r\n return $ok({ bytes: $fromBase64(data) });\r\n case 'base64url':\r\n return $ok({ bytes: $fromBase64Url(data) });\r\n case 'hex':\r\n return $ok({ bytes: $fromHex(data) });\r\n case 'utf8':\r\n return $ok({ bytes: textEncoder.encode(data) });\r\n default:\r\n return $err({\r\n message: `Unsupported encode format: ${format}`,\r\n description: 'Use base64, base64url, hex, or utf8',\r\n });\r\n }\r\n } catch (error) {\r\n return $err({ message: 'Failed to encode data', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function decode(data: ArrayBuffer | Uint8Array, format: EncodingFormat = 'utf8'): Result<string> {\r\n try {\r\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\r\n switch (format) {\r\n case 'base64':\r\n return $ok($toBase64(bytes));\r\n case 'base64url':\r\n return $ok($toBase64Url(bytes));\r\n case 'hex':\r\n return $ok($toHex(bytes));\r\n case 'utf8':\r\n return $ok(textDecoder.decode(bytes));\r\n default:\r\n return $err({\r\n message: `Unsupported decode format: ${format}`,\r\n description: 'Use base64, base64url, hex, or utf8',\r\n });\r\n }\r\n } catch (error) {\r\n return $err({ message: 'Failed to decode data', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nfunction $toBase64(bytes: Uint8Array): string {\r\n let binary = '';\r\n const chunkSize = 0x8000; // 32KB per chunk\r\n for (let i = 0; i < bytes.length; i += chunkSize) {\r\n binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));\r\n }\r\n return btoa(binary);\r\n}\r\n\r\nfunction $fromBase64(data: string): Uint8Array {\r\n const binary = atob(data);\r\n const len = binary.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n}\r\n\r\nfunction $toBase64Url(bytes: Uint8Array): string {\r\n return $toBase64(bytes).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n}\r\n\r\nfunction $fromBase64Url(data: string): Uint8Array {\r\n let b64 = data.replace(/-/g, '+').replace(/_/g, '/');\r\n const padLen = (4 - (b64.length % 4)) % 4;\r\n b64 += '='.repeat(padLen);\r\n return $fromBase64(b64);\r\n}\r\n\r\nfunction $toHex(bytes: Uint8Array): string {\r\n return Array.from(bytes)\r\n .map((b) => b.toString(16).padStart(2, '0'))\r\n .join('');\r\n}\r\n\r\nfunction $fromHex(data: string): Uint8Array {\r\n const clean = data.startsWith('0x') ? data.slice(2) : data;\r\n if (clean.length % 2 !== 0) throw new Error('Invalid hex string');\r\n const out = new Uint8Array(clean.length / 2);\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Number.parseInt(clean.slice(i * 2, i * 2 + 2), 16);\r\n }\r\n return out;\r\n}\r\n","import { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { WebApiKey } from '~/types';\r\n\r\nexport const ENCRYPTED_WEB_API_REGEX = /^([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.$/;\r\n\r\nexport function newUuid(): Result<string> {\r\n try {\r\n return $ok(crypto.randomUUID());\r\n } catch (error) {\r\n return $err({ message: 'Failed to generate UUID with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function $isWebApiKey(key: unknown): key is WebApiKey {\r\n return (\r\n key !== null &&\r\n key !== undefined &&\r\n typeof key === 'object' &&\r\n 'type' in key &&\r\n typeof key.type === 'string' &&\r\n 'algorithm' in key &&\r\n typeof key.algorithm === 'object' &&\r\n 'extractable' in key &&\r\n typeof key.extractable === 'boolean' &&\r\n 'usages' in key &&\r\n Array.isArray(key.usages) &&\r\n key.usages.every((usage) => typeof usage === 'string')\r\n );\r\n}\r\n","import { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { WebApiKey } from '~/types';\r\nimport { $isStr, $parseToObj, $stringifyObj } from '~/utils';\r\nimport { decode, encode } from './encode';\r\nimport { $isWebApiKey, ENCRYPTED_WEB_API_REGEX } from './utils';\r\n\r\nexport const WEB_API_ALGORITHM = 'AES-GCM';\r\n\r\nexport async function hash(data: string): Promise<Result<string>> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for hashing', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n const { bytes, error } = encode(data, 'utf8');\r\n if (error) return $err(error);\r\n\r\n try {\r\n const hashed = await crypto.subtle.digest('SHA-256', bytes);\r\n return decode(hashed, 'base64url');\r\n } catch (error) {\r\n return $err({ message: 'Failed to hash data with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function newSecretKey(key: string | WebApiKey): Promise<Result<{ secretKey: WebApiKey }>> {\r\n if (typeof key === 'string') {\r\n if (!$isStr(key, 1)) return $err({ message: 'Empty key for Crypto Web API', description: 'Invalid secret key' });\r\n\r\n const { bytes, error } = encode(key, 'utf8');\r\n if (error) return $err(error);\r\n\r\n try {\r\n const hashedKey = await crypto.subtle.digest('SHA-256', bytes);\r\n const secretKey = await crypto.subtle.importKey('raw', hashedKey, { name: WEB_API_ALGORITHM }, true, [\r\n 'encrypt',\r\n 'decrypt',\r\n ]);\r\n return $ok({ secretKey });\r\n } catch (error) {\r\n return $err({ message: 'Failed to create secret key with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n }\r\n\r\n if (!$isWebApiKey(key)) return $err({ message: 'Invalid secret key', description: 'Expected a webcrypto.CryptoKey' });\r\n return $ok({ secretKey: key });\r\n}\r\n\r\nexport async function encrypt(data: string, secretKey: WebApiKey): Promise<Result<string>> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for encryption', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n if (!$isWebApiKey(secretKey)) {\r\n return $err({ message: 'Invalid encryption key', description: 'Expected a webcrypto.CryptoKey' });\r\n }\r\n\r\n const { bytes, error } = encode(data, 'utf8');\r\n if (error) return $err(error);\r\n\r\n try {\r\n const iv = crypto.getRandomValues(new Uint8Array(12));\r\n const encrypted = await crypto.subtle.encrypt({ name: WEB_API_ALGORITHM, iv: iv }, secretKey, bytes);\r\n\r\n const { result: decodedIv, error: ivError } = decode(iv, 'base64url');\r\n const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, 'base64url');\r\n\r\n if (ivError || encryptedError) {\r\n return $err({ message: 'Failed to encode IV or encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n return $ok(`${decodedIv}.${decodedEncrypted}.`);\r\n } catch (error) {\r\n return $err({ message: 'Failed to encrypt data with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function decrypt(encrypted: string, secretKey: WebApiKey): Promise<Result<string>> {\r\n if (ENCRYPTED_WEB_API_REGEX.test(encrypted) === false) {\r\n return $err({\r\n message: 'Invalid encrypted data format',\r\n description: 'Data must be in the format \"iv.encryptedWithTag.\"',\r\n });\r\n }\r\n\r\n const [iv, encryptedWithTag] = encrypted.split('.', 3);\r\n if (!$isStr(iv, 1) || !$isStr(encryptedWithTag, 1)) {\r\n return $err({\r\n message: 'Invalid parameters for decryption',\r\n description: 'IV and encrypted data must be non-empty strings',\r\n });\r\n }\r\n\r\n if (!$isWebApiKey(secretKey)) {\r\n return $err({ message: 'Invalid decryption key', description: 'Expected a webcrypto.CryptoKey' });\r\n }\r\n\r\n const { bytes: ivBytes, error: ivError } = encode(iv, 'base64url');\r\n const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedWithTag, 'base64url');\r\n if (ivError || encryptedError) {\r\n return $err({ message: 'Failed to encode IV or encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n try {\r\n const decrypted = await crypto.subtle.decrypt({ name: WEB_API_ALGORITHM, iv: ivBytes }, secretKey, encryptedBytes);\r\n\r\n return decode(decrypted, 'utf8');\r\n } catch (error) {\r\n return $err({ message: 'Failed to decrypt data with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function encryptObj(data: Record<string, unknown>, secretKey: WebApiKey): Promise<Result<string>> {\r\n const { result, error } = $stringifyObj(data);\r\n if (error) return $err(error);\r\n return await encrypt(result, secretKey);\r\n}\r\n\r\nexport async function decryptObj(\r\n encrypted: string,\r\n secretKey: WebApiKey,\r\n): Promise<Result<{ result: Record<string, unknown> }>> {\r\n const { result, error } = await decrypt(encrypted, secretKey);\r\n if (error) return $err(error);\r\n return $parseToObj(result);\r\n}\r\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkGYHEGPUY_cjs = require('./chunk-GYHEGPUY.cjs');
3
+ var chunkQN3P7CIM_cjs = require('./chunk-QN3P7CIM.cjs');
4
4
  var buffer = require('buffer');
5
5
  var nodeCrypto2 = require('crypto');
6
6
 
@@ -10,24 +10,24 @@ var nodeCrypto2__default = /*#__PURE__*/_interopDefault(nodeCrypto2);
10
10
 
11
11
  function encode(data, format = "utf8") {
12
12
  try {
13
- return chunkGYHEGPUY_cjs.$ok({ bytes: buffer.Buffer.from(data, format) });
13
+ return chunkQN3P7CIM_cjs.$ok({ bytes: buffer.Buffer.from(data, format) });
14
14
  } catch (error) {
15
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to encode data", description: chunkGYHEGPUY_cjs.$stringifyError(error) });
15
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to encode data", description: chunkQN3P7CIM_cjs.$stringifyError(error) });
16
16
  }
17
17
  }
18
18
  function decode(data, format = "utf8") {
19
19
  try {
20
- return chunkGYHEGPUY_cjs.$ok(buffer.Buffer.from(data).toString(format));
20
+ return chunkQN3P7CIM_cjs.$ok(buffer.Buffer.from(data).toString(format));
21
21
  } catch (error) {
22
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to decode data", description: chunkGYHEGPUY_cjs.$stringifyError(error) });
22
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to decode data", description: chunkQN3P7CIM_cjs.$stringifyError(error) });
23
23
  }
24
24
  }
25
25
  var ENCRYPTED_NODE_REGEX = /^([A-Za-z0-9_-]+)\.([A-Za-z0-9_-]+)\.([A-Za-z0-9_-]+)\.$/;
26
26
  function newUuid() {
27
27
  try {
28
- return chunkGYHEGPUY_cjs.$ok(nodeCrypto2__default.default.randomUUID());
28
+ return chunkQN3P7CIM_cjs.$ok(nodeCrypto2__default.default.randomUUID());
29
29
  } catch (error) {
30
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to generate UUID with Crypto NodeJS", description: chunkGYHEGPUY_cjs.$stringifyError(error) });
30
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to generate UUID with Crypto NodeJS", description: chunkQN3P7CIM_cjs.$stringifyError(error) });
31
31
  }
32
32
  }
33
33
  function $isNodeKey(key) {
@@ -37,36 +37,36 @@ function $isNodeKey(key) {
37
37
  // src/node/encrypt.ts
38
38
  var NODE_ALGORITHM = "aes-256-gcm";
39
39
  function hash(data) {
40
- if (!chunkGYHEGPUY_cjs.$isStr(data)) {
41
- return chunkGYHEGPUY_cjs.$err({ message: "Empty data for hashing", description: "Data must be a non-empty string" });
40
+ if (!chunkQN3P7CIM_cjs.$isStr(data)) {
41
+ return chunkQN3P7CIM_cjs.$err({ message: "Empty data for hashing", description: "Data must be a non-empty string" });
42
42
  }
43
43
  try {
44
44
  const hashed = nodeCrypto2__default.default.createHash("sha256").update(data).digest();
45
45
  return decode(hashed, "base64url");
46
46
  } catch (error) {
47
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to hash data with Crypto NodeJS", description: chunkGYHEGPUY_cjs.$stringifyError(error) });
47
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to hash data with Crypto NodeJS", description: chunkQN3P7CIM_cjs.$stringifyError(error) });
48
48
  }
49
49
  }
50
50
  function newSecretKey(key) {
51
51
  if (typeof key === "string") {
52
- if (!chunkGYHEGPUY_cjs.$isStr(key, 1)) return chunkGYHEGPUY_cjs.$err({ message: "Empty key for Crypto NodeJS", description: "Invalid secret key" });
52
+ if (!chunkQN3P7CIM_cjs.$isStr(key, 1)) return chunkQN3P7CIM_cjs.$err({ message: "Empty key for Crypto NodeJS", description: "Invalid secret key" });
53
53
  try {
54
54
  const hashedKey = nodeCrypto2__default.default.createHash("sha256").update(key).digest();
55
55
  const secretKey = nodeCrypto2__default.default.createSecretKey(hashedKey);
56
- return chunkGYHEGPUY_cjs.$ok({ secretKey });
56
+ return chunkQN3P7CIM_cjs.$ok({ secretKey });
57
57
  } catch (error) {
58
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to create secret key with Crypto NodeJS", description: chunkGYHEGPUY_cjs.$stringifyError(error) });
58
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to create secret key with Crypto NodeJS", description: chunkQN3P7CIM_cjs.$stringifyError(error) });
59
59
  }
60
60
  }
61
- if (!$isNodeKey(key)) return chunkGYHEGPUY_cjs.$err({ message: "Invalid secret key", description: "Expected a crypto.KeyObject" });
62
- return chunkGYHEGPUY_cjs.$ok({ secretKey: key });
61
+ if (!$isNodeKey(key)) return chunkQN3P7CIM_cjs.$err({ message: "Invalid secret key", description: "Expected a crypto.KeyObject" });
62
+ return chunkQN3P7CIM_cjs.$ok({ secretKey: key });
63
63
  }
64
64
  function encrypt(data, secretKey) {
65
- if (!chunkGYHEGPUY_cjs.$isStr(data)) {
66
- return chunkGYHEGPUY_cjs.$err({ message: "Empty data for encryption", description: "Data must be a non-empty string" });
65
+ if (!chunkQN3P7CIM_cjs.$isStr(data)) {
66
+ return chunkQN3P7CIM_cjs.$err({ message: "Empty data for encryption", description: "Data must be a non-empty string" });
67
67
  }
68
68
  if (!$isNodeKey(secretKey)) {
69
- return chunkGYHEGPUY_cjs.$err({ message: "Invalid encryption key", description: "Expected a crypto.KeyObject" });
69
+ return chunkQN3P7CIM_cjs.$err({ message: "Invalid encryption key", description: "Expected a crypto.KeyObject" });
70
70
  }
71
71
  try {
72
72
  const iv = nodeCrypto2__default.default.randomBytes(12);
@@ -77,35 +77,35 @@ function encrypt(data, secretKey) {
77
77
  const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, "base64url");
78
78
  const { result: decodedTag, error: tagError } = decode(tag, "base64url");
79
79
  if (ivError || encryptedError || tagError) {
80
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to encode encrypted data", description: "Encoding error" });
80
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to encode encrypted data", description: "Encoding error" });
81
81
  }
82
- return chunkGYHEGPUY_cjs.$ok(`${decodedIv}.${decodedEncrypted}.${decodedTag}.`);
82
+ return chunkQN3P7CIM_cjs.$ok(`${decodedIv}.${decodedEncrypted}.${decodedTag}.`);
83
83
  } catch (error) {
84
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to encrypt data with Crypto NodeJS", description: chunkGYHEGPUY_cjs.$stringifyError(error) });
84
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to encrypt data with Crypto NodeJS", description: chunkQN3P7CIM_cjs.$stringifyError(error) });
85
85
  }
86
86
  }
87
87
  function decrypt(encrypted, secretKey) {
88
88
  if (ENCRYPTED_NODE_REGEX.test(encrypted) === false) {
89
- return chunkGYHEGPUY_cjs.$err({
89
+ return chunkQN3P7CIM_cjs.$err({
90
90
  message: "Invalid encrypted data format",
91
91
  description: 'Encrypted data must be in the format "iv.encrypted.tag."'
92
92
  });
93
93
  }
94
94
  const [iv, encryptedData, tag] = encrypted.split(".", 4);
95
- if (!chunkGYHEGPUY_cjs.$isStr(iv, 1) || !chunkGYHEGPUY_cjs.$isStr(encryptedData, 1) || !chunkGYHEGPUY_cjs.$isStr(tag, 1)) {
96
- return chunkGYHEGPUY_cjs.$err({
95
+ if (!chunkQN3P7CIM_cjs.$isStr(iv, 1) || !chunkQN3P7CIM_cjs.$isStr(encryptedData, 1) || !chunkQN3P7CIM_cjs.$isStr(tag, 1)) {
96
+ return chunkQN3P7CIM_cjs.$err({
97
97
  message: "Invalid parameters for decryption",
98
98
  description: "IV, encrypted data, and tag must be non-empty strings"
99
99
  });
100
100
  }
101
101
  if (!$isNodeKey(secretKey)) {
102
- return chunkGYHEGPUY_cjs.$err({ message: "Invalid decryption key", description: "Expected a crypto.KeyObject" });
102
+ return chunkQN3P7CIM_cjs.$err({ message: "Invalid decryption key", description: "Expected a crypto.KeyObject" });
103
103
  }
104
104
  const { bytes: ivBytes, error: ivError } = encode(iv, "base64url");
105
105
  const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedData, "base64url");
106
106
  const { bytes: tagBytes, error: tagError } = encode(tag, "base64url");
107
107
  if (ivError || encryptedError || tagError) {
108
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
108
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
109
109
  }
110
110
  try {
111
111
  const decipher = nodeCrypto2__default.default.createDecipheriv(NODE_ALGORITHM, secretKey, ivBytes);
@@ -113,18 +113,30 @@ function decrypt(encrypted, secretKey) {
113
113
  const decrypted = buffer.Buffer.concat([decipher.update(encryptedBytes), decipher.final()]);
114
114
  return decode(decrypted, "utf8");
115
115
  } catch (error) {
116
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to decrypt data with Crypto NodeJS", description: chunkGYHEGPUY_cjs.$stringifyError(error) });
116
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to decrypt data with Crypto NodeJS", description: chunkQN3P7CIM_cjs.$stringifyError(error) });
117
117
  }
118
118
  }
119
+ function encryptObj(data, secretKey) {
120
+ const { result, error } = chunkQN3P7CIM_cjs.$stringifyObj(data);
121
+ if (error) return chunkQN3P7CIM_cjs.$err(error);
122
+ return encrypt(result, secretKey);
123
+ }
124
+ function decryptObj(encrypted, secretKey) {
125
+ const { result, error } = decrypt(encrypted, secretKey);
126
+ if (error) return chunkQN3P7CIM_cjs.$err(error);
127
+ return chunkQN3P7CIM_cjs.$parseToObj(result);
128
+ }
119
129
 
120
130
  exports.ENCRYPTED_NODE_REGEX = ENCRYPTED_NODE_REGEX;
121
131
  exports.NODE_ALGORITHM = NODE_ALGORITHM;
122
132
  exports.decode = decode;
123
133
  exports.decrypt = decrypt;
134
+ exports.decryptObj = decryptObj;
124
135
  exports.encode = encode;
125
136
  exports.encrypt = encrypt;
137
+ exports.encryptObj = encryptObj;
126
138
  exports.hash = hash;
127
139
  exports.newSecretKey = newSecretKey;
128
140
  exports.newUuid = newUuid;
129
- //# sourceMappingURL=chunk-RKUUM2D6.cjs.map
130
- //# sourceMappingURL=chunk-RKUUM2D6.cjs.map
141
+ //# sourceMappingURL=chunk-4DJEDYAV.cjs.map
142
+ //# sourceMappingURL=chunk-4DJEDYAV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/node/encode.ts","../src/node/utils.ts","../src/node/encrypt.ts"],"names":["$ok","Buffer","$err","$stringifyError","nodeCrypto","$isStr","$stringifyObj","$parseToObj"],"mappings":"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","file":"chunk-4DJEDYAV.cjs","sourcesContent":["import { Buffer } from 'node:buffer';\r\nimport { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { EncodingFormat } from '~/types';\r\n\r\nexport function encode(data: string, format: EncodingFormat = 'utf8'): Result<{ bytes: Buffer }> {\r\n try {\r\n return $ok({ bytes: Buffer.from(data, format) });\r\n } catch (error) {\r\n return $err({ message: 'Failed to encode data', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function decode(data: Buffer, format: EncodingFormat = 'utf8'): Result<string> {\r\n try {\r\n return $ok(Buffer.from(data).toString(format));\r\n } catch (error) {\r\n return $err({ message: 'Failed to decode data', description: $stringifyError(error) });\r\n }\r\n}\r\n","import nodeCrypto from 'node:crypto';\r\nimport { $err, $ok, $stringifyError, type Result } from '~/error';\r\n\r\nexport const ENCRYPTED_NODE_REGEX = /^([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.$/;\r\n\r\nexport function newUuid(): Result<string> {\r\n try {\r\n return $ok(nodeCrypto.randomUUID());\r\n } catch (error) {\r\n return $err({ message: 'Failed to generate UUID with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function $isNodeKey(key: unknown): key is nodeCrypto.KeyObject {\r\n return key instanceof nodeCrypto.KeyObject;\r\n}\r\n","import { Buffer } from 'node:buffer';\r\nimport nodeCrypto from 'node:crypto';\r\nimport { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { NodeKey } from '~/types';\r\nimport { $isStr, $parseToObj, $stringifyObj } from '~/utils';\r\nimport { decode, encode } from './encode';\r\nimport { $isNodeKey, ENCRYPTED_NODE_REGEX } from './utils';\r\n\r\nexport const NODE_ALGORITHM = 'aes-256-gcm';\r\n\r\nexport function hash(data: string): Result<string> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for hashing', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n try {\r\n const hashed = nodeCrypto.createHash('sha256').update(data).digest();\r\n return decode(hashed, 'base64url');\r\n } catch (error) {\r\n return $err({ message: 'Failed to hash data with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function newSecretKey(key: string | NodeKey): Result<{ secretKey: NodeKey }> {\r\n if (typeof key === 'string') {\r\n if (!$isStr(key, 1)) return $err({ message: 'Empty key for Crypto NodeJS', description: 'Invalid secret key' });\r\n\r\n try {\r\n const hashedKey = nodeCrypto.createHash('sha256').update(key).digest();\r\n const secretKey = nodeCrypto.createSecretKey(hashedKey);\r\n return $ok({ secretKey });\r\n } catch (error) {\r\n return $err({ message: 'Failed to create secret key with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n }\r\n\r\n if (!$isNodeKey(key)) return $err({ message: 'Invalid secret key', description: 'Expected a crypto.KeyObject' });\r\n return $ok({ secretKey: key });\r\n}\r\n\r\nexport function encrypt(data: string, secretKey: NodeKey): Result<string> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for encryption', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n if (!$isNodeKey(secretKey)) {\r\n return $err({ message: 'Invalid encryption key', description: 'Expected a crypto.KeyObject' });\r\n }\r\n\r\n try {\r\n const iv = nodeCrypto.randomBytes(12);\r\n const cipher = nodeCrypto.createCipheriv(NODE_ALGORITHM, secretKey, iv);\r\n const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);\r\n const tag = cipher.getAuthTag();\r\n\r\n const { result: decodedIv, error: ivError } = decode(iv, 'base64url');\r\n const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, 'base64url');\r\n const { result: decodedTag, error: tagError } = decode(tag, 'base64url');\r\n if (ivError || encryptedError || tagError) {\r\n return $err({ message: 'Failed to encode encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n return $ok(`${decodedIv}.${decodedEncrypted}.${decodedTag}.`);\r\n } catch (error) {\r\n return $err({ message: 'Failed to encrypt data with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function decrypt(encrypted: string, secretKey: NodeKey): Result<string> {\r\n if (ENCRYPTED_NODE_REGEX.test(encrypted) === false) {\r\n return $err({\r\n message: 'Invalid encrypted data format',\r\n description: 'Encrypted data must be in the format \"iv.encrypted.tag.\"',\r\n });\r\n }\r\n\r\n const [iv, encryptedData, tag] = encrypted.split('.', 4);\r\n if (!$isStr(iv, 1) || !$isStr(encryptedData, 1) || !$isStr(tag, 1)) {\r\n return $err({\r\n message: 'Invalid parameters for decryption',\r\n description: 'IV, encrypted data, and tag must be non-empty strings',\r\n });\r\n }\r\n\r\n if (!$isNodeKey(secretKey)) {\r\n return $err({ message: 'Invalid decryption key', description: 'Expected a crypto.KeyObject' });\r\n }\r\n\r\n const { bytes: ivBytes, error: ivError } = encode(iv, 'base64url');\r\n const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedData, 'base64url');\r\n const { bytes: tagBytes, error: tagError } = encode(tag, 'base64url');\r\n if (ivError || encryptedError || tagError) {\r\n return $err({ message: 'Failed to encode IV or encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n try {\r\n const decipher = nodeCrypto.createDecipheriv(NODE_ALGORITHM, secretKey, ivBytes);\r\n decipher.setAuthTag(tagBytes);\r\n\r\n const decrypted = Buffer.concat([decipher.update(encryptedBytes), decipher.final()]);\r\n return decode(decrypted, 'utf8');\r\n } catch (error) {\r\n return $err({ message: 'Failed to decrypt data with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function encryptObj(data: Record<string, unknown>, secretKey: NodeKey): Result<string> {\r\n const { result, error } = $stringifyObj(data);\r\n if (error) return $err(error);\r\n return encrypt(result, secretKey);\r\n}\r\n\r\nexport function decryptObj(encrypted: string, secretKey: NodeKey): Result<{ result: Record<string, unknown> }> {\r\n const { result, error } = decrypt(encrypted, secretKey);\r\n if (error) return $err(error);\r\n return $parseToObj(result);\r\n}\r\n"]}
@@ -0,0 +1,45 @@
1
+ // src/error.ts
2
+ function $ok(result) {
3
+ if ($isObj(result)) return { success: true, ...result };
4
+ return { success: true, result };
5
+ }
6
+ function $err(typeOrErr) {
7
+ return { success: false, error: typeOrErr };
8
+ }
9
+ function $stringifyError(error) {
10
+ if (error instanceof Error) return error.message;
11
+ if (typeof error === "string") return error;
12
+ return String(error);
13
+ }
14
+
15
+ // src/utils.ts
16
+ function $isStr(value, min = 0) {
17
+ return (value !== null || value !== void 0) && typeof value === "string" && value.trim().length >= min;
18
+ }
19
+ function $isObj(value) {
20
+ return typeof value === "object" && value !== null && value !== void 0 && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
21
+ }
22
+ function $stringifyObj(obj) {
23
+ if (!$isObj(obj)) return $err({ message: "Invalid object", description: "Input is not a plain object" });
24
+ try {
25
+ return $ok(JSON.stringify(obj));
26
+ } catch (error) {
27
+ return $err({ message: "Stringify error", description: $stringifyError(error) });
28
+ }
29
+ }
30
+ function $parseToObj(str) {
31
+ if (!$isStr(str)) return $err({ message: "Invalid input", description: "Input is not a valid string" });
32
+ try {
33
+ const obj = JSON.parse(str);
34
+ if (!$isObj(obj)) {
35
+ return $err({ message: "Invalid object format", description: "Parsed data is not a plain object" });
36
+ }
37
+ return $ok({ result: obj });
38
+ } catch (error) {
39
+ return $err({ message: "Invalid format", description: $stringifyError(error) });
40
+ }
41
+ }
42
+
43
+ export { $err, $isStr, $ok, $parseToObj, $stringifyError, $stringifyObj };
44
+ //# sourceMappingURL=chunk-7QVQLIZE.js.map
45
+ //# sourceMappingURL=chunk-7QVQLIZE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/error.ts","../src/utils.ts"],"names":[],"mappings":";AAeO,SAAS,IAAO,MAAA,EAAuB;AAC5C,EAAA,IAAI,MAAA,CAAO,MAAM,CAAA,EAAG,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAI,MAAA,EAAsB;AACtE,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AACjC;AAIO,SAAS,KAAK,SAAA,EAA2F;AAC9G,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,SAAA,EAAU;AAC5C;AAEO,SAAS,gBAAgB,KAAA,EAAwB;AACtD,EAAA,IAAI,KAAA,YAAiB,KAAA,EAAO,OAAO,KAAA,CAAM,OAAA;AACzC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;;;AC5BO,SAAS,MAAA,CAAO,KAAA,EAAgB,GAAA,GAAM,CAAA,EAAoB;AAC/D,EAAA,OAAA,CAAQ,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,KAAc,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,IAAA,EAAK,CAAE,MAAA,IAAU,GAAA;AACxG;AAEO,SAAS,OAAO,KAAA,EAAkD;AACvE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,UAAU,MAAA,KACT,MAAA,CAAO,cAAA,CAAe,KAAK,MAAM,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA,KAAM,IAAA,CAAA;AAE3F;AAEO,SAAS,cAAc,GAAA,EAA8C;AAC1E,EAAA,IAAI,CAAC,MAAA,CAAO,GAAG,CAAA,EAAG,OAAO,IAAA,CAAK,EAAE,OAAA,EAAS,gBAAA,EAAkB,WAAA,EAAa,6BAAA,EAA+B,CAAA;AAEvG,EAAA,IAAI;AACF,IAAA,OAAO,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EAChC,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,EAAS,iBAAA,EAAmB,aAAa,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EACjF;AACF;AAEO,SAAS,YAAY,GAAA,EAA0D;AACpF,EAAA,IAAI,CAAC,MAAA,CAAO,GAAG,CAAA,EAAG,OAAO,IAAA,CAAK,EAAE,OAAA,EAAS,eAAA,EAAiB,WAAA,EAAa,6BAAA,EAA+B,CAAA;AAEtG,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC1B,IAAA,IAAI,CAAC,MAAA,CAAO,GAAG,CAAA,EAAG;AAChB,MAAA,OAAO,KAAK,EAAE,OAAA,EAAS,uBAAA,EAAyB,WAAA,EAAa,qCAAqC,CAAA;AAAA,IACpG;AAEA,IAAA,OAAO,GAAA,CAAI,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,EAAS,gBAAA,EAAkB,aAAa,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EAChF;AACF","file":"chunk-7QVQLIZE.js","sourcesContent":["import { $isObj } from './utils';\r\n\r\nexport interface ResultErr {\r\n readonly message: string;\r\n readonly description: string;\r\n}\r\n\r\nexport type Result<T, E = ResultErr> = T extends object\r\n ?\r\n | ({ readonly [K in keyof T]: T[K] } & { readonly success: true; readonly error?: undefined })\r\n | ({ readonly [K in keyof T]?: undefined } & { readonly success: false; readonly error: E })\r\n :\r\n | { readonly success: true; readonly result: T; readonly error?: undefined }\r\n | { readonly success: false; readonly error: E; readonly result?: undefined };\r\n\r\nexport function $ok<T>(result?: T): Result<T> {\r\n if ($isObj(result)) return { success: true, ...(result as T & object) } as Result<T>;\r\n return { success: true, result } as Result<T>;\r\n}\r\n\r\nexport function $err(typeOrErr: { message: string; description: string }): Result<never, ResultErr>;\r\nexport function $err(typeOrErr: ResultErr): Result<never, ResultErr>;\r\nexport function $err(typeOrErr: { message: string; description: string } | ResultErr): Result<never, ResultErr> {\r\n return { success: false, error: typeOrErr } as Result<never, ResultErr>;\r\n}\r\n\r\nexport function $stringifyError(error: unknown): string {\r\n if (error instanceof Error) return error.message;\r\n if (typeof error === 'string') return error;\r\n return String(error);\r\n}\r\n","import { $err, $ok, $stringifyError, type Result } from './error';\r\n\r\nexport function $isStr(value: unknown, min = 0): value is string {\r\n return (value !== null || value !== undefined) && typeof value === 'string' && value.trim().length >= min;\r\n}\r\n\r\nexport function $isObj(value: unknown): value is Record<string, unknown> {\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n value !== undefined &&\r\n (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)\r\n );\r\n}\r\n\r\nexport function $stringifyObj(obj: Record<string, unknown>): Result<string> {\r\n if (!$isObj(obj)) return $err({ message: 'Invalid object', description: 'Input is not a plain object' });\r\n\r\n try {\r\n return $ok(JSON.stringify(obj));\r\n } catch (error) {\r\n return $err({ message: 'Stringify error', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function $parseToObj(str: string): Result<{ result: Record<string, unknown> }> {\r\n if (!$isStr(str)) return $err({ message: 'Invalid input', description: 'Input is not a valid string' });\r\n\r\n try {\r\n const obj = JSON.parse(str);\r\n if (!$isObj(obj)) {\r\n return $err({ message: 'Invalid object format', description: 'Parsed data is not a plain object' });\r\n }\r\n\r\n return $ok({ result: obj });\r\n } catch (error) {\r\n return $err({ message: 'Invalid format', description: $stringifyError(error) });\r\n }\r\n}\r\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkGYHEGPUY_cjs = require('./chunk-GYHEGPUY.cjs');
3
+ var chunkQN3P7CIM_cjs = require('./chunk-QN3P7CIM.cjs');
4
4
 
5
5
  // src/web/encode.ts
6
6
  var textEncoder = new TextEncoder();
@@ -9,21 +9,21 @@ function encode(data, format = "utf8") {
9
9
  try {
10
10
  switch (format) {
11
11
  case "base64":
12
- return chunkGYHEGPUY_cjs.$ok({ bytes: $fromBase64(data) });
12
+ return chunkQN3P7CIM_cjs.$ok({ bytes: $fromBase64(data) });
13
13
  case "base64url":
14
- return chunkGYHEGPUY_cjs.$ok({ bytes: $fromBase64Url(data) });
14
+ return chunkQN3P7CIM_cjs.$ok({ bytes: $fromBase64Url(data) });
15
15
  case "hex":
16
- return chunkGYHEGPUY_cjs.$ok({ bytes: $fromHex(data) });
16
+ return chunkQN3P7CIM_cjs.$ok({ bytes: $fromHex(data) });
17
17
  case "utf8":
18
- return chunkGYHEGPUY_cjs.$ok({ bytes: textEncoder.encode(data) });
18
+ return chunkQN3P7CIM_cjs.$ok({ bytes: textEncoder.encode(data) });
19
19
  default:
20
- return chunkGYHEGPUY_cjs.$err({
20
+ return chunkQN3P7CIM_cjs.$err({
21
21
  message: `Unsupported encode format: ${format}`,
22
22
  description: "Use base64, base64url, hex, or utf8"
23
23
  });
24
24
  }
25
25
  } catch (error) {
26
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to encode data", description: chunkGYHEGPUY_cjs.$stringifyError(error) });
26
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to encode data", description: chunkQN3P7CIM_cjs.$stringifyError(error) });
27
27
  }
28
28
  }
29
29
  function decode(data, format = "utf8") {
@@ -31,21 +31,21 @@ function decode(data, format = "utf8") {
31
31
  const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
32
32
  switch (format) {
33
33
  case "base64":
34
- return chunkGYHEGPUY_cjs.$ok($toBase64(bytes));
34
+ return chunkQN3P7CIM_cjs.$ok($toBase64(bytes));
35
35
  case "base64url":
36
- return chunkGYHEGPUY_cjs.$ok($toBase64Url(bytes));
36
+ return chunkQN3P7CIM_cjs.$ok($toBase64Url(bytes));
37
37
  case "hex":
38
- return chunkGYHEGPUY_cjs.$ok($toHex(bytes));
38
+ return chunkQN3P7CIM_cjs.$ok($toHex(bytes));
39
39
  case "utf8":
40
- return chunkGYHEGPUY_cjs.$ok(textDecoder.decode(bytes));
40
+ return chunkQN3P7CIM_cjs.$ok(textDecoder.decode(bytes));
41
41
  default:
42
- return chunkGYHEGPUY_cjs.$err({
42
+ return chunkQN3P7CIM_cjs.$err({
43
43
  message: `Unsupported decode format: ${format}`,
44
44
  description: "Use base64, base64url, hex, or utf8"
45
45
  });
46
46
  }
47
47
  } catch (error) {
48
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to decode data", description: chunkGYHEGPUY_cjs.$stringifyError(error) });
48
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to decode data", description: chunkQN3P7CIM_cjs.$stringifyError(error) });
49
49
  }
50
50
  }
51
51
  function $toBase64(bytes) {
@@ -91,9 +91,9 @@ function $fromHex(data) {
91
91
  var ENCRYPTED_WEB_API_REGEX = /^([A-Za-z0-9_-]+)\.([A-Za-z0-9_-]+)\.$/;
92
92
  function newUuid() {
93
93
  try {
94
- return chunkGYHEGPUY_cjs.$ok(crypto.randomUUID());
94
+ return chunkQN3P7CIM_cjs.$ok(crypto.randomUUID());
95
95
  } catch (error) {
96
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to generate UUID with Crypto Web API", description: chunkGYHEGPUY_cjs.$stringifyError(error) });
96
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to generate UUID with Crypto Web API", description: chunkQN3P7CIM_cjs.$stringifyError(error) });
97
97
  }
98
98
  }
99
99
  function $isWebApiKey(key) {
@@ -103,97 +103,109 @@ function $isWebApiKey(key) {
103
103
  // src/web/encrypt.ts
104
104
  var WEB_API_ALGORITHM = "AES-GCM";
105
105
  async function hash(data) {
106
- if (!chunkGYHEGPUY_cjs.$isStr(data)) {
107
- return chunkGYHEGPUY_cjs.$err({ message: "Empty data for hashing", description: "Data must be a non-empty string" });
106
+ if (!chunkQN3P7CIM_cjs.$isStr(data)) {
107
+ return chunkQN3P7CIM_cjs.$err({ message: "Empty data for hashing", description: "Data must be a non-empty string" });
108
108
  }
109
109
  const { bytes, error } = encode(data, "utf8");
110
- if (error) return chunkGYHEGPUY_cjs.$err(error);
110
+ if (error) return chunkQN3P7CIM_cjs.$err(error);
111
111
  try {
112
112
  const hashed = await crypto.subtle.digest("SHA-256", bytes);
113
113
  return decode(hashed, "base64url");
114
114
  } catch (error2) {
115
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to hash data with Crypto Web API", description: chunkGYHEGPUY_cjs.$stringifyError(error2) });
115
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to hash data with Crypto Web API", description: chunkQN3P7CIM_cjs.$stringifyError(error2) });
116
116
  }
117
117
  }
118
118
  async function newSecretKey(key) {
119
119
  if (typeof key === "string") {
120
- if (!chunkGYHEGPUY_cjs.$isStr(key, 1)) return chunkGYHEGPUY_cjs.$err({ message: "Empty key for Crypto Web API", description: "Invalid secret key" });
120
+ if (!chunkQN3P7CIM_cjs.$isStr(key, 1)) return chunkQN3P7CIM_cjs.$err({ message: "Empty key for Crypto Web API", description: "Invalid secret key" });
121
121
  const { bytes, error } = encode(key, "utf8");
122
- if (error) return chunkGYHEGPUY_cjs.$err(error);
122
+ if (error) return chunkQN3P7CIM_cjs.$err(error);
123
123
  try {
124
124
  const hashedKey = await crypto.subtle.digest("SHA-256", bytes);
125
125
  const secretKey = await crypto.subtle.importKey("raw", hashedKey, { name: WEB_API_ALGORITHM }, true, [
126
126
  "encrypt",
127
127
  "decrypt"
128
128
  ]);
129
- return chunkGYHEGPUY_cjs.$ok({ secretKey });
129
+ return chunkQN3P7CIM_cjs.$ok({ secretKey });
130
130
  } catch (error2) {
131
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to create secret key with Crypto Web API", description: chunkGYHEGPUY_cjs.$stringifyError(error2) });
131
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to create secret key with Crypto Web API", description: chunkQN3P7CIM_cjs.$stringifyError(error2) });
132
132
  }
133
133
  }
134
- if (!$isWebApiKey(key)) return chunkGYHEGPUY_cjs.$err({ message: "Invalid secret key", description: "Expected a webcrypto.CryptoKey" });
135
- return chunkGYHEGPUY_cjs.$ok({ secretKey: key });
134
+ if (!$isWebApiKey(key)) return chunkQN3P7CIM_cjs.$err({ message: "Invalid secret key", description: "Expected a webcrypto.CryptoKey" });
135
+ return chunkQN3P7CIM_cjs.$ok({ secretKey: key });
136
136
  }
137
137
  async function encrypt(data, secretKey) {
138
- if (!chunkGYHEGPUY_cjs.$isStr(data)) {
139
- return chunkGYHEGPUY_cjs.$err({ message: "Empty data for encryption", description: "Data must be a non-empty string" });
138
+ if (!chunkQN3P7CIM_cjs.$isStr(data)) {
139
+ return chunkQN3P7CIM_cjs.$err({ message: "Empty data for encryption", description: "Data must be a non-empty string" });
140
140
  }
141
141
  if (!$isWebApiKey(secretKey)) {
142
- return chunkGYHEGPUY_cjs.$err({ message: "Invalid encryption key", description: "Expected a webcrypto.CryptoKey" });
142
+ return chunkQN3P7CIM_cjs.$err({ message: "Invalid encryption key", description: "Expected a webcrypto.CryptoKey" });
143
143
  }
144
144
  const { bytes, error } = encode(data, "utf8");
145
- if (error) return chunkGYHEGPUY_cjs.$err(error);
145
+ if (error) return chunkQN3P7CIM_cjs.$err(error);
146
146
  try {
147
147
  const iv = crypto.getRandomValues(new Uint8Array(12));
148
148
  const encrypted = await crypto.subtle.encrypt({ name: WEB_API_ALGORITHM, iv }, secretKey, bytes);
149
149
  const { result: decodedIv, error: ivError } = decode(iv, "base64url");
150
150
  const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, "base64url");
151
151
  if (ivError || encryptedError) {
152
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
152
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
153
153
  }
154
- return chunkGYHEGPUY_cjs.$ok(`${decodedIv}.${decodedEncrypted}.`);
154
+ return chunkQN3P7CIM_cjs.$ok(`${decodedIv}.${decodedEncrypted}.`);
155
155
  } catch (error2) {
156
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to encrypt data with Crypto Web API", description: chunkGYHEGPUY_cjs.$stringifyError(error2) });
156
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to encrypt data with Crypto Web API", description: chunkQN3P7CIM_cjs.$stringifyError(error2) });
157
157
  }
158
158
  }
159
159
  async function decrypt(encrypted, secretKey) {
160
160
  if (ENCRYPTED_WEB_API_REGEX.test(encrypted) === false) {
161
- return chunkGYHEGPUY_cjs.$err({
161
+ return chunkQN3P7CIM_cjs.$err({
162
162
  message: "Invalid encrypted data format",
163
163
  description: 'Data must be in the format "iv.encryptedWithTag."'
164
164
  });
165
165
  }
166
166
  const [iv, encryptedWithTag] = encrypted.split(".", 3);
167
- if (!chunkGYHEGPUY_cjs.$isStr(iv, 1) || !chunkGYHEGPUY_cjs.$isStr(encryptedWithTag, 1)) {
168
- return chunkGYHEGPUY_cjs.$err({
167
+ if (!chunkQN3P7CIM_cjs.$isStr(iv, 1) || !chunkQN3P7CIM_cjs.$isStr(encryptedWithTag, 1)) {
168
+ return chunkQN3P7CIM_cjs.$err({
169
169
  message: "Invalid parameters for decryption",
170
170
  description: "IV and encrypted data must be non-empty strings"
171
171
  });
172
172
  }
173
173
  if (!$isWebApiKey(secretKey)) {
174
- return chunkGYHEGPUY_cjs.$err({ message: "Invalid decryption key", description: "Expected a webcrypto.CryptoKey" });
174
+ return chunkQN3P7CIM_cjs.$err({ message: "Invalid decryption key", description: "Expected a webcrypto.CryptoKey" });
175
175
  }
176
176
  const { bytes: ivBytes, error: ivError } = encode(iv, "base64url");
177
177
  const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedWithTag, "base64url");
178
178
  if (ivError || encryptedError) {
179
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
179
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
180
180
  }
181
181
  try {
182
182
  const decrypted = await crypto.subtle.decrypt({ name: WEB_API_ALGORITHM, iv: ivBytes }, secretKey, encryptedBytes);
183
183
  return decode(decrypted, "utf8");
184
184
  } catch (error) {
185
- return chunkGYHEGPUY_cjs.$err({ message: "Failed to decrypt data with Crypto Web API", description: chunkGYHEGPUY_cjs.$stringifyError(error) });
185
+ return chunkQN3P7CIM_cjs.$err({ message: "Failed to decrypt data with Crypto Web API", description: chunkQN3P7CIM_cjs.$stringifyError(error) });
186
186
  }
187
187
  }
188
+ async function encryptObj(data, secretKey) {
189
+ const { result, error } = chunkQN3P7CIM_cjs.$stringifyObj(data);
190
+ if (error) return chunkQN3P7CIM_cjs.$err(error);
191
+ return await encrypt(result, secretKey);
192
+ }
193
+ async function decryptObj(encrypted, secretKey) {
194
+ const { result, error } = await decrypt(encrypted, secretKey);
195
+ if (error) return chunkQN3P7CIM_cjs.$err(error);
196
+ return chunkQN3P7CIM_cjs.$parseToObj(result);
197
+ }
188
198
 
189
199
  exports.ENCRYPTED_WEB_API_REGEX = ENCRYPTED_WEB_API_REGEX;
190
200
  exports.WEB_API_ALGORITHM = WEB_API_ALGORITHM;
191
201
  exports.decode = decode;
192
202
  exports.decrypt = decrypt;
203
+ exports.decryptObj = decryptObj;
193
204
  exports.encode = encode;
194
205
  exports.encrypt = encrypt;
206
+ exports.encryptObj = encryptObj;
195
207
  exports.hash = hash;
196
208
  exports.newSecretKey = newSecretKey;
197
209
  exports.newUuid = newUuid;
198
- //# sourceMappingURL=chunk-SD6QP3UT.cjs.map
199
- //# sourceMappingURL=chunk-SD6QP3UT.cjs.map
210
+ //# sourceMappingURL=chunk-NT4ZCTLJ.cjs.map
211
+ //# sourceMappingURL=chunk-NT4ZCTLJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/web/encode.ts","../src/web/utils.ts","../src/web/encrypt.ts"],"names":["$ok","$err","$stringifyError","$isStr","error","$stringifyObj","$parseToObj"],"mappings":"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","file":"chunk-NT4ZCTLJ.cjs","sourcesContent":["import { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { EncodingFormat } from '~/types';\r\n\r\nconst textEncoder = new TextEncoder();\r\nconst textDecoder = new TextDecoder();\r\n\r\nexport function encode(data: string, format: EncodingFormat = 'utf8'): Result<{ bytes: Uint8Array }> {\r\n try {\r\n switch (format) {\r\n case 'base64':\r\n return $ok({ bytes: $fromBase64(data) });\r\n case 'base64url':\r\n return $ok({ bytes: $fromBase64Url(data) });\r\n case 'hex':\r\n return $ok({ bytes: $fromHex(data) });\r\n case 'utf8':\r\n return $ok({ bytes: textEncoder.encode(data) });\r\n default:\r\n return $err({\r\n message: `Unsupported encode format: ${format}`,\r\n description: 'Use base64, base64url, hex, or utf8',\r\n });\r\n }\r\n } catch (error) {\r\n return $err({ message: 'Failed to encode data', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function decode(data: ArrayBuffer | Uint8Array, format: EncodingFormat = 'utf8'): Result<string> {\r\n try {\r\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\r\n switch (format) {\r\n case 'base64':\r\n return $ok($toBase64(bytes));\r\n case 'base64url':\r\n return $ok($toBase64Url(bytes));\r\n case 'hex':\r\n return $ok($toHex(bytes));\r\n case 'utf8':\r\n return $ok(textDecoder.decode(bytes));\r\n default:\r\n return $err({\r\n message: `Unsupported decode format: ${format}`,\r\n description: 'Use base64, base64url, hex, or utf8',\r\n });\r\n }\r\n } catch (error) {\r\n return $err({ message: 'Failed to decode data', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nfunction $toBase64(bytes: Uint8Array): string {\r\n let binary = '';\r\n const chunkSize = 0x8000; // 32KB per chunk\r\n for (let i = 0; i < bytes.length; i += chunkSize) {\r\n binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));\r\n }\r\n return btoa(binary);\r\n}\r\n\r\nfunction $fromBase64(data: string): Uint8Array {\r\n const binary = atob(data);\r\n const len = binary.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n}\r\n\r\nfunction $toBase64Url(bytes: Uint8Array): string {\r\n return $toBase64(bytes).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n}\r\n\r\nfunction $fromBase64Url(data: string): Uint8Array {\r\n let b64 = data.replace(/-/g, '+').replace(/_/g, '/');\r\n const padLen = (4 - (b64.length % 4)) % 4;\r\n b64 += '='.repeat(padLen);\r\n return $fromBase64(b64);\r\n}\r\n\r\nfunction $toHex(bytes: Uint8Array): string {\r\n return Array.from(bytes)\r\n .map((b) => b.toString(16).padStart(2, '0'))\r\n .join('');\r\n}\r\n\r\nfunction $fromHex(data: string): Uint8Array {\r\n const clean = data.startsWith('0x') ? data.slice(2) : data;\r\n if (clean.length % 2 !== 0) throw new Error('Invalid hex string');\r\n const out = new Uint8Array(clean.length / 2);\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Number.parseInt(clean.slice(i * 2, i * 2 + 2), 16);\r\n }\r\n return out;\r\n}\r\n","import { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { WebApiKey } from '~/types';\r\n\r\nexport const ENCRYPTED_WEB_API_REGEX = /^([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.$/;\r\n\r\nexport function newUuid(): Result<string> {\r\n try {\r\n return $ok(crypto.randomUUID());\r\n } catch (error) {\r\n return $err({ message: 'Failed to generate UUID with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function $isWebApiKey(key: unknown): key is WebApiKey {\r\n return (\r\n key !== null &&\r\n key !== undefined &&\r\n typeof key === 'object' &&\r\n 'type' in key &&\r\n typeof key.type === 'string' &&\r\n 'algorithm' in key &&\r\n typeof key.algorithm === 'object' &&\r\n 'extractable' in key &&\r\n typeof key.extractable === 'boolean' &&\r\n 'usages' in key &&\r\n Array.isArray(key.usages) &&\r\n key.usages.every((usage) => typeof usage === 'string')\r\n );\r\n}\r\n","import { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { WebApiKey } from '~/types';\r\nimport { $isStr, $parseToObj, $stringifyObj } from '~/utils';\r\nimport { decode, encode } from './encode';\r\nimport { $isWebApiKey, ENCRYPTED_WEB_API_REGEX } from './utils';\r\n\r\nexport const WEB_API_ALGORITHM = 'AES-GCM';\r\n\r\nexport async function hash(data: string): Promise<Result<string>> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for hashing', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n const { bytes, error } = encode(data, 'utf8');\r\n if (error) return $err(error);\r\n\r\n try {\r\n const hashed = await crypto.subtle.digest('SHA-256', bytes);\r\n return decode(hashed, 'base64url');\r\n } catch (error) {\r\n return $err({ message: 'Failed to hash data with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function newSecretKey(key: string | WebApiKey): Promise<Result<{ secretKey: WebApiKey }>> {\r\n if (typeof key === 'string') {\r\n if (!$isStr(key, 1)) return $err({ message: 'Empty key for Crypto Web API', description: 'Invalid secret key' });\r\n\r\n const { bytes, error } = encode(key, 'utf8');\r\n if (error) return $err(error);\r\n\r\n try {\r\n const hashedKey = await crypto.subtle.digest('SHA-256', bytes);\r\n const secretKey = await crypto.subtle.importKey('raw', hashedKey, { name: WEB_API_ALGORITHM }, true, [\r\n 'encrypt',\r\n 'decrypt',\r\n ]);\r\n return $ok({ secretKey });\r\n } catch (error) {\r\n return $err({ message: 'Failed to create secret key with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n }\r\n\r\n if (!$isWebApiKey(key)) return $err({ message: 'Invalid secret key', description: 'Expected a webcrypto.CryptoKey' });\r\n return $ok({ secretKey: key });\r\n}\r\n\r\nexport async function encrypt(data: string, secretKey: WebApiKey): Promise<Result<string>> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for encryption', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n if (!$isWebApiKey(secretKey)) {\r\n return $err({ message: 'Invalid encryption key', description: 'Expected a webcrypto.CryptoKey' });\r\n }\r\n\r\n const { bytes, error } = encode(data, 'utf8');\r\n if (error) return $err(error);\r\n\r\n try {\r\n const iv = crypto.getRandomValues(new Uint8Array(12));\r\n const encrypted = await crypto.subtle.encrypt({ name: WEB_API_ALGORITHM, iv: iv }, secretKey, bytes);\r\n\r\n const { result: decodedIv, error: ivError } = decode(iv, 'base64url');\r\n const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, 'base64url');\r\n\r\n if (ivError || encryptedError) {\r\n return $err({ message: 'Failed to encode IV or encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n return $ok(`${decodedIv}.${decodedEncrypted}.`);\r\n } catch (error) {\r\n return $err({ message: 'Failed to encrypt data with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function decrypt(encrypted: string, secretKey: WebApiKey): Promise<Result<string>> {\r\n if (ENCRYPTED_WEB_API_REGEX.test(encrypted) === false) {\r\n return $err({\r\n message: 'Invalid encrypted data format',\r\n description: 'Data must be in the format \"iv.encryptedWithTag.\"',\r\n });\r\n }\r\n\r\n const [iv, encryptedWithTag] = encrypted.split('.', 3);\r\n if (!$isStr(iv, 1) || !$isStr(encryptedWithTag, 1)) {\r\n return $err({\r\n message: 'Invalid parameters for decryption',\r\n description: 'IV and encrypted data must be non-empty strings',\r\n });\r\n }\r\n\r\n if (!$isWebApiKey(secretKey)) {\r\n return $err({ message: 'Invalid decryption key', description: 'Expected a webcrypto.CryptoKey' });\r\n }\r\n\r\n const { bytes: ivBytes, error: ivError } = encode(iv, 'base64url');\r\n const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedWithTag, 'base64url');\r\n if (ivError || encryptedError) {\r\n return $err({ message: 'Failed to encode IV or encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n try {\r\n const decrypted = await crypto.subtle.decrypt({ name: WEB_API_ALGORITHM, iv: ivBytes }, secretKey, encryptedBytes);\r\n\r\n return decode(decrypted, 'utf8');\r\n } catch (error) {\r\n return $err({ message: 'Failed to decrypt data with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function encryptObj(data: Record<string, unknown>, secretKey: WebApiKey): Promise<Result<string>> {\r\n const { result, error } = $stringifyObj(data);\r\n if (error) return $err(error);\r\n return await encrypt(result, secretKey);\r\n}\r\n\r\nexport async function decryptObj(\r\n encrypted: string,\r\n secretKey: WebApiKey,\r\n): Promise<Result<{ result: Record<string, unknown> }>> {\r\n const { result, error } = await decrypt(encrypted, secretKey);\r\n if (error) return $err(error);\r\n return $parseToObj(result);\r\n}\r\n"]}