cipher-kit 0.0.3 → 0.0.4
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/dist/chunk-6EC6NPNV.cjs +139 -0
- package/dist/chunk-6EC6NPNV.cjs.map +1 -0
- package/dist/{chunk-KFZLZJ2J.cjs → chunk-DAMEE4F4.cjs} +51 -52
- package/dist/chunk-DAMEE4F4.cjs.map +1 -0
- package/dist/{chunk-MMHTEI3Q.js → chunk-HSRKAY2V.js} +20 -22
- package/dist/chunk-HSRKAY2V.js.map +1 -0
- package/dist/{chunk-72PZBMQR.js → chunk-IHTNNCLY.js} +5 -5
- package/dist/{chunk-72PZBMQR.js.map → chunk-IHTNNCLY.js.map} +1 -1
- package/dist/{chunk-WD5FWRQ4.cjs → chunk-SSMTQMF4.cjs} +6 -6
- package/dist/{chunk-WD5FWRQ4.cjs.map → chunk-SSMTQMF4.cjs.map} +1 -1
- package/dist/{chunk-GYFL6RUD.js → chunk-VJ4BV4K2.js} +12 -14
- package/dist/chunk-VJ4BV4K2.js.map +1 -0
- package/dist/index.cjs +49 -33
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/node.cjs +26 -14
- package/dist/node.d.cts +6 -6
- package/dist/node.d.ts +6 -6
- package/dist/node.js +2 -2
- package/dist/{utils-D8fOvyw5.d.cts → utils-1Ds0QKBI.d.cts} +5 -1
- package/dist/{utils-D8fOvyw5.d.ts → utils-1Ds0QKBI.d.ts} +5 -1
- package/dist/web-api.cjs +26 -14
- package/dist/web-api.d.cts +5 -5
- package/dist/web-api.d.ts +5 -5
- package/dist/web-api.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-GYFL6RUD.js.map +0 -1
- package/dist/chunk-KFZLZJ2J.cjs.map +0 -1
- package/dist/chunk-MMHTEI3Q.js.map +0 -1
- package/dist/chunk-WB7F34SY.cjs +0 -140
- package/dist/chunk-WB7F34SY.cjs.map +0 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkSSMTQMF4_cjs = require('./chunk-SSMTQMF4.cjs');
|
|
4
|
+
var buffer = require('buffer');
|
|
5
|
+
var nodeCrypto = require('crypto');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var nodeCrypto__default = /*#__PURE__*/_interopDefault(nodeCrypto);
|
|
10
|
+
|
|
11
|
+
function encode(data, format = "utf8") {
|
|
12
|
+
try {
|
|
13
|
+
return chunkSSMTQMF4_cjs.$ok({ bytes: buffer.Buffer.from(data, format) });
|
|
14
|
+
} catch (error) {
|
|
15
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode data", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function decode(data, format = "utf8") {
|
|
19
|
+
try {
|
|
20
|
+
return chunkSSMTQMF4_cjs.$ok(buffer.Buffer.from(data).toString(format));
|
|
21
|
+
} catch (error) {
|
|
22
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to decode data", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
var NODE_ALGORITHM = "aes-256-gcm";
|
|
26
|
+
function newUuid() {
|
|
27
|
+
try {
|
|
28
|
+
return chunkSSMTQMF4_cjs.$ok(nodeCrypto__default.default.randomUUID());
|
|
29
|
+
} catch (error) {
|
|
30
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to generate UUID with Crypto NodeJS", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function isNodeKey(key) {
|
|
34
|
+
return key instanceof nodeCrypto__default.default.KeyObject;
|
|
35
|
+
}
|
|
36
|
+
function hash(data) {
|
|
37
|
+
if (!chunkSSMTQMF4_cjs.$isStr(data)) {
|
|
38
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Empty data for hashing", description: "Data must be a non-empty string" });
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const hashed = nodeCrypto__default.default.createHash("sha256").update(data).digest();
|
|
42
|
+
return decode(hashed, "base64url");
|
|
43
|
+
} catch (error) {
|
|
44
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to hash data with Crypto NodeJS", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function newSecretKey(key) {
|
|
48
|
+
if (typeof key === "string") {
|
|
49
|
+
if (!chunkSSMTQMF4_cjs.$isStr(key, 1)) return chunkSSMTQMF4_cjs.$err({ message: "Empty key for Crypto NodeJS", description: "Invalid secret key" });
|
|
50
|
+
try {
|
|
51
|
+
const hashedKey = nodeCrypto__default.default.createHash("sha256").update(key).digest();
|
|
52
|
+
const secretKey = nodeCrypto__default.default.createSecretKey(hashedKey);
|
|
53
|
+
return chunkSSMTQMF4_cjs.$ok({ secretKey });
|
|
54
|
+
} catch (error) {
|
|
55
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to create secret key with Crypto NodeJS", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!isNodeKey(key)) return chunkSSMTQMF4_cjs.$err({ message: "Invalid secret key", description: "Expected a crypto.KeyObject" });
|
|
59
|
+
return chunkSSMTQMF4_cjs.$ok({ secretKey: key });
|
|
60
|
+
}
|
|
61
|
+
function encrypt(data, secretKey) {
|
|
62
|
+
if (!chunkSSMTQMF4_cjs.$isStr(data)) {
|
|
63
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Empty data for encryption", description: "Data must be a non-empty string" });
|
|
64
|
+
}
|
|
65
|
+
if (!isNodeKey(secretKey)) {
|
|
66
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Invalid encryption key", description: "Expected a crypto.KeyObject" });
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const iv = nodeCrypto__default.default.randomBytes(12);
|
|
70
|
+
const cipher = nodeCrypto__default.default.createCipheriv(NODE_ALGORITHM, secretKey, iv);
|
|
71
|
+
const encrypted = buffer.Buffer.concat([cipher.update(data, "utf8"), cipher.final()]);
|
|
72
|
+
const tag = cipher.getAuthTag();
|
|
73
|
+
const { result: decodedIv, error: ivError } = decode(iv, "base64url");
|
|
74
|
+
const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, "base64url");
|
|
75
|
+
const { result: decodedTag, error: tagError } = decode(tag, "base64url");
|
|
76
|
+
if (ivError || encryptedError || tagError) {
|
|
77
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode encrypted data", description: "Encoding error" });
|
|
78
|
+
}
|
|
79
|
+
return chunkSSMTQMF4_cjs.$ok(`${decodedIv}.${decodedEncrypted}.${decodedTag}.`);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encrypt data with Crypto NodeJS", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function decrypt(encrypted, secretKey) {
|
|
85
|
+
if (chunkSSMTQMF4_cjs.ENCRYPTED_NODE_REGEX.test(encrypted) === false) {
|
|
86
|
+
return chunkSSMTQMF4_cjs.$err({
|
|
87
|
+
message: "Invalid encrypted data format",
|
|
88
|
+
description: 'Encrypted data must be in the format "iv.encrypted.tag."'
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const [iv, encryptedData, tag] = encrypted.split(".", 4);
|
|
92
|
+
if (!chunkSSMTQMF4_cjs.$isStr(iv, 1) || !chunkSSMTQMF4_cjs.$isStr(encryptedData, 1) || !chunkSSMTQMF4_cjs.$isStr(tag, 1)) {
|
|
93
|
+
return chunkSSMTQMF4_cjs.$err({
|
|
94
|
+
message: "Invalid parameters for decryption",
|
|
95
|
+
description: "IV, encrypted data, and tag must be non-empty strings"
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (!isNodeKey(secretKey)) {
|
|
99
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Invalid decryption key", description: "Expected a crypto.KeyObject" });
|
|
100
|
+
}
|
|
101
|
+
const { bytes: ivBytes, error: ivError } = encode(iv, "base64url");
|
|
102
|
+
const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedData, "base64url");
|
|
103
|
+
const { bytes: tagBytes, error: tagError } = encode(tag, "base64url");
|
|
104
|
+
if (ivError || encryptedError || tagError) {
|
|
105
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const decipher = nodeCrypto__default.default.createDecipheriv(NODE_ALGORITHM, secretKey, ivBytes);
|
|
109
|
+
decipher.setAuthTag(tagBytes);
|
|
110
|
+
const decrypted = buffer.Buffer.concat([decipher.update(encryptedBytes), decipher.final()]);
|
|
111
|
+
return decode(decrypted, "utf8");
|
|
112
|
+
} catch (error) {
|
|
113
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to decrypt data with Crypto NodeJS", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function encryptObj(data, secretKey) {
|
|
117
|
+
const { result, error } = chunkSSMTQMF4_cjs.stringifyObj(data);
|
|
118
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
119
|
+
return encrypt(result, secretKey);
|
|
120
|
+
}
|
|
121
|
+
function decryptObj(encrypted, secretKey) {
|
|
122
|
+
const { result, error } = decrypt(encrypted, secretKey);
|
|
123
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
124
|
+
return chunkSSMTQMF4_cjs.parseToObj(result);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
exports.NODE_ALGORITHM = NODE_ALGORITHM;
|
|
128
|
+
exports.decode = decode;
|
|
129
|
+
exports.decrypt = decrypt;
|
|
130
|
+
exports.decryptObj = decryptObj;
|
|
131
|
+
exports.encode = encode;
|
|
132
|
+
exports.encrypt = encrypt;
|
|
133
|
+
exports.encryptObj = encryptObj;
|
|
134
|
+
exports.hash = hash;
|
|
135
|
+
exports.isNodeKey = isNodeKey;
|
|
136
|
+
exports.newSecretKey = newSecretKey;
|
|
137
|
+
exports.newUuid = newUuid;
|
|
138
|
+
//# sourceMappingURL=chunk-6EC6NPNV.cjs.map
|
|
139
|
+
//# sourceMappingURL=chunk-6EC6NPNV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/node/encode.ts","../src/node/encrypt.ts"],"names":["$ok","Buffer","$err","$stringifyError","nodeCrypto","$isStr","ENCRYPTED_NODE_REGEX","stringifyObj","parseToObj"],"mappings":";;;;;;;;;;AAIO,SAAS,MAAA,CAAO,IAAA,EAAc,MAAA,GAAyB,MAAA,EAAmC;AAC/F,EAAA,IAAI;AACF,IAAA,OAAOA,qBAAA,CAAI,EAAE,KAAA,EAAOC,aAAA,CAAO,KAAK,IAAA,EAAM,MAAM,GAAG,CAAA;AAAA,EACjD,SAAS,KAAA,EAAO;AACd,IAAA,OAAOC,sBAAA,CAAK,EAAE,OAAA,EAAS,uBAAA,EAAyB,aAAaC,iCAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EACvF;AACF;AAEO,SAAS,MAAA,CAAO,IAAA,EAAc,MAAA,GAAyB,MAAA,EAAwB;AACpF,EAAA,IAAI;AACF,IAAA,OAAOH,sBAAIC,aAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,EAC/C,SAAS,KAAA,EAAO;AACd,IAAA,OAAOC,sBAAA,CAAK,EAAE,OAAA,EAAS,uBAAA,EAAyB,aAAaC,iCAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EACvF;AACF;ACXO,IAAM,cAAA,GAAiB;AAEvB,SAAS,OAAA,GAA0B;AACxC,EAAA,IAAI;AACF,IAAA,OAAOH,qBAAA,CAAII,2BAAA,CAAW,UAAA,EAAY,CAAA;AAAA,EACpC,SAAS,KAAA,EAAO;AACd,IAAA,OAAOF,sBAAA,CAAK,EAAE,OAAA,EAAS,4CAAA,EAA8C,aAAaC,iCAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EAC5G;AACF;AAEO,SAAS,UAAU,GAAA,EAA2C;AACnE,EAAA,OAAO,eAAeC,2BAAA,CAAW,SAAA;AACnC;AAEO,SAAS,KAAK,IAAA,EAA8B;AACjD,EAAA,IAAI,CAACC,wBAAA,CAAO,IAAI,CAAA,EAAG;AACjB,IAAA,OAAOH,uBAAK,EAAE,OAAA,EAAS,wBAAA,EAA0B,WAAA,EAAa,mCAAmC,CAAA;AAAA,EACnG;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAASE,4BAAW,UAAA,CAAW,QAAQ,EAAE,MAAA,CAAO,IAAI,EAAE,MAAA,EAAO;AACnE,IAAA,OAAO,MAAA,CAAO,QAAQ,WAAW,CAAA;AAAA,EACnC,SAAS,KAAA,EAAO;AACd,IAAA,OAAOF,sBAAA,CAAK,EAAE,OAAA,EAAS,wCAAA,EAA0C,aAAaC,iCAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EACxG;AACF;AAEO,SAAS,aAAa,GAAA,EAAuD;AAClF,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,CAACE,wBAAA,CAAO,GAAA,EAAK,CAAC,CAAA,EAAG,OAAOH,sBAAA,CAAK,EAAE,OAAA,EAAS,6BAAA,EAA+B,WAAA,EAAa,oBAAA,EAAsB,CAAA;AAE9G,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAYE,4BAAW,UAAA,CAAW,QAAQ,EAAE,MAAA,CAAO,GAAG,EAAE,MAAA,EAAO;AACrE,MAAA,MAAM,SAAA,GAAYA,2BAAA,CAAW,eAAA,CAAgB,SAAS,CAAA;AACtD,MAAA,OAAOJ,qBAAA,CAAI,EAAE,SAAA,EAAW,CAAA;AAAA,IAC1B,SAAS,KAAA,EAAO;AACd,MAAA,OAAOE,sBAAA,CAAK,EAAE,OAAA,EAAS,gDAAA,EAAkD,aAAaC,iCAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,IAChH;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,SAAA,CAAU,GAAG,CAAA,EAAG,OAAOD,sBAAA,CAAK,EAAE,OAAA,EAAS,oBAAA,EAAsB,WAAA,EAAa,6BAAA,EAA+B,CAAA;AAC9G,EAAA,OAAOF,qBAAA,CAAI,EAAE,SAAA,EAAW,GAAA,EAAK,CAAA;AAC/B;AAEO,SAAS,OAAA,CAAQ,MAAc,SAAA,EAAoC;AACxE,EAAA,IAAI,CAACK,wBAAA,CAAO,IAAI,CAAA,EAAG;AACjB,IAAA,OAAOH,uBAAK,EAAE,OAAA,EAAS,2BAAA,EAA6B,WAAA,EAAa,mCAAmC,CAAA;AAAA,EACtG;AAEA,EAAA,IAAI,CAAC,SAAA,CAAU,SAAS,CAAA,EAAG;AACzB,IAAA,OAAOA,uBAAK,EAAE,OAAA,EAAS,wBAAA,EAA0B,WAAA,EAAa,+BAA+B,CAAA;AAAA,EAC/F;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAKE,2BAAA,CAAW,WAAA,CAAY,EAAE,CAAA;AACpC,IAAA,MAAM,MAAA,GAASA,2BAAA,CAAW,cAAA,CAAe,cAAA,EAAgB,WAAW,EAAE,CAAA;AACtE,IAAA,MAAM,SAAA,GAAYH,aAAAA,CAAO,MAAA,CAAO,CAAC,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAC7E,IAAA,MAAM,GAAA,GAAM,OAAO,UAAA,EAAW;AAE9B,IAAA,MAAM,EAAE,QAAQ,SAAA,EAAW,KAAA,EAAO,SAAQ,GAAI,MAAA,CAAO,IAAI,WAAW,CAAA;AACpE,IAAA,MAAM,EAAE,QAAQ,gBAAA,EAAkB,KAAA,EAAO,gBAAe,GAAI,MAAA,CAAO,WAAW,WAAW,CAAA;AACzF,IAAA,MAAM,EAAE,QAAQ,UAAA,EAAY,KAAA,EAAO,UAAS,GAAI,MAAA,CAAO,KAAK,WAAW,CAAA;AACvE,IAAA,IAAI,OAAA,IAAW,kBAAkB,QAAA,EAAU;AACzC,MAAA,OAAOC,uBAAK,EAAE,OAAA,EAAS,iCAAA,EAAmC,WAAA,EAAa,kBAAkB,CAAA;AAAA,IAC3F;AAEA,IAAA,OAAOF,sBAAI,CAAA,EAAG,SAAS,IAAI,gBAAgB,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9D,SAAS,KAAA,EAAO;AACd,IAAA,OAAOE,sBAAA,CAAK,EAAE,OAAA,EAAS,2CAAA,EAA6C,aAAaC,iCAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EAC3G;AACF;AAEO,SAAS,OAAA,CAAQ,WAAmB,SAAA,EAAoC;AAC7E,EAAA,IAAIG,sCAAA,CAAqB,IAAA,CAAK,SAAS,CAAA,KAAM,KAAA,EAAO;AAClD,IAAA,OAAOJ,sBAAA,CAAK;AAAA,MACV,OAAA,EAAS,+BAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,CAAC,IAAI,aAAA,EAAe,GAAG,IAAI,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,CAAA;AACvD,EAAA,IAAI,CAACG,wBAAA,CAAO,EAAA,EAAI,CAAC,KAAK,CAACA,wBAAA,CAAO,aAAA,EAAe,CAAC,CAAA,IAAK,CAACA,wBAAA,CAAO,GAAA,EAAK,CAAC,CAAA,EAAG;AAClE,IAAA,OAAOH,sBAAA,CAAK;AAAA,MACV,OAAA,EAAS,mCAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,SAAA,CAAU,SAAS,CAAA,EAAG;AACzB,IAAA,OAAOA,uBAAK,EAAE,OAAA,EAAS,wBAAA,EAA0B,WAAA,EAAa,+BAA+B,CAAA;AAAA,EAC/F;AAEA,EAAA,MAAM,EAAE,OAAO,OAAA,EAAS,KAAA,EAAO,SAAQ,GAAI,MAAA,CAAO,IAAI,WAAW,CAAA;AACjE,EAAA,MAAM,EAAE,OAAO,cAAA,EAAgB,KAAA,EAAO,gBAAe,GAAI,MAAA,CAAO,eAAe,WAAW,CAAA;AAC1F,EAAA,MAAM,EAAE,OAAO,QAAA,EAAU,KAAA,EAAO,UAAS,GAAI,MAAA,CAAO,KAAK,WAAW,CAAA;AACpE,EAAA,IAAI,OAAA,IAAW,kBAAkB,QAAA,EAAU;AACzC,IAAA,OAAOA,uBAAK,EAAE,OAAA,EAAS,uCAAA,EAAyC,WAAA,EAAa,kBAAkB,CAAA;AAAA,EACjG;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAWE,2BAAA,CAAW,gBAAA,CAAiB,cAAA,EAAgB,WAAW,OAAO,CAAA;AAC/E,IAAA,QAAA,CAAS,WAAW,QAAQ,CAAA;AAE5B,IAAA,MAAM,SAAA,GAAYH,aAAAA,CAAO,MAAA,CAAO,CAAC,QAAA,CAAS,MAAA,CAAO,cAAc,CAAA,EAAG,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA;AACnF,IAAA,OAAO,MAAA,CAAO,WAAW,MAAM,CAAA;AAAA,EACjC,SAAS,KAAA,EAAO;AACd,IAAA,OAAOC,sBAAA,CAAK,EAAE,OAAA,EAAS,2CAAA,EAA6C,aAAaC,iCAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EAC3G;AACF;AAEO,SAAS,UAAA,CAAW,MAA+B,SAAA,EAAoC;AAC5F,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAII,+BAAa,IAAI,CAAA;AAC3C,EAAA,IAAI,KAAA,EAAO,OAAOL,sBAAA,CAAK,KAAK,CAAA;AAC5B,EAAA,OAAO,OAAA,CAAQ,QAAQ,SAAS,CAAA;AAClC;AAEO,SAAS,UAAA,CAAW,WAAmB,SAAA,EAAiE;AAC7G,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,OAAA,CAAQ,WAAW,SAAS,CAAA;AACtD,EAAA,IAAI,KAAA,EAAO,OAAOA,sBAAA,CAAK,KAAK,CAAA;AAC5B,EAAA,OAAOM,6BAAW,MAAM,CAAA;AAC1B","file":"chunk-6EC6NPNV.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 { 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, ENCRYPTED_NODE_REGEX, parseToObj, stringifyObj } from '~/utils';\r\nimport { decode, encode } from './encode';\r\n\r\nexport const NODE_ALGORITHM = 'aes-256-gcm';\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\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"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkSSMTQMF4_cjs = require('./chunk-SSMTQMF4.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
|
|
12
|
+
return chunkSSMTQMF4_cjs.$ok({ bytes: $fromBase64(data) });
|
|
13
13
|
case "base64url":
|
|
14
|
-
return
|
|
14
|
+
return chunkSSMTQMF4_cjs.$ok({ bytes: $fromBase64Url(data) });
|
|
15
15
|
case "hex":
|
|
16
|
-
return
|
|
16
|
+
return chunkSSMTQMF4_cjs.$ok({ bytes: $fromHex(data) });
|
|
17
17
|
case "utf8":
|
|
18
|
-
return
|
|
18
|
+
return chunkSSMTQMF4_cjs.$ok({ bytes: textEncoder.encode(data) });
|
|
19
19
|
default:
|
|
20
|
-
return
|
|
20
|
+
return chunkSSMTQMF4_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
|
|
26
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode data", description: chunkSSMTQMF4_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
|
|
34
|
+
return chunkSSMTQMF4_cjs.$ok($toBase64(bytes));
|
|
35
35
|
case "base64url":
|
|
36
|
-
return
|
|
36
|
+
return chunkSSMTQMF4_cjs.$ok($toBase64Url(bytes));
|
|
37
37
|
case "hex":
|
|
38
|
-
return
|
|
38
|
+
return chunkSSMTQMF4_cjs.$ok($toHex(bytes));
|
|
39
39
|
case "utf8":
|
|
40
|
-
return
|
|
40
|
+
return chunkSSMTQMF4_cjs.$ok(textDecoder.decode(bytes));
|
|
41
41
|
default:
|
|
42
|
-
return
|
|
42
|
+
return chunkSSMTQMF4_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
|
|
48
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to decode data", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
function $toBase64(bytes) {
|
|
@@ -87,112 +87,110 @@ function $fromHex(data) {
|
|
|
87
87
|
return out;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
// src/web/
|
|
90
|
+
// src/web/encrypt.ts
|
|
91
|
+
var WEB_API_ALGORITHM = "AES-GCM";
|
|
91
92
|
function newUuid() {
|
|
92
93
|
try {
|
|
93
|
-
return
|
|
94
|
+
return chunkSSMTQMF4_cjs.$ok(crypto.randomUUID());
|
|
94
95
|
} catch (error) {
|
|
95
|
-
return
|
|
96
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to generate UUID with Crypto Web API", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
96
97
|
}
|
|
97
98
|
}
|
|
98
|
-
function
|
|
99
|
+
function isWebApiKey(key) {
|
|
99
100
|
return key !== null && key !== void 0 && typeof key === "object" && "type" in key && typeof key.type === "string" && "algorithm" in key && typeof key.algorithm === "object" && "extractable" in key && typeof key.extractable === "boolean" && "usages" in key && Array.isArray(key.usages) && key.usages.every((usage) => typeof usage === "string");
|
|
100
101
|
}
|
|
101
|
-
|
|
102
|
-
// src/web/encrypt.ts
|
|
103
|
-
var WEB_API_ALGORITHM = "AES-GCM";
|
|
104
102
|
async function hash(data) {
|
|
105
|
-
if (!
|
|
106
|
-
return
|
|
103
|
+
if (!chunkSSMTQMF4_cjs.$isStr(data)) {
|
|
104
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Empty data for hashing", description: "Data must be a non-empty string" });
|
|
107
105
|
}
|
|
108
106
|
const { bytes, error } = encode(data, "utf8");
|
|
109
|
-
if (error) return
|
|
107
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
110
108
|
try {
|
|
111
109
|
const hashed = await crypto.subtle.digest("SHA-256", bytes);
|
|
112
110
|
return decode(hashed, "base64url");
|
|
113
111
|
} catch (error2) {
|
|
114
|
-
return
|
|
112
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to hash data with Crypto Web API", description: chunkSSMTQMF4_cjs.$stringifyError(error2) });
|
|
115
113
|
}
|
|
116
114
|
}
|
|
117
115
|
async function newSecretKey(key) {
|
|
118
116
|
if (typeof key === "string") {
|
|
119
|
-
if (!
|
|
117
|
+
if (!chunkSSMTQMF4_cjs.$isStr(key, 1)) return chunkSSMTQMF4_cjs.$err({ message: "Empty key for Crypto Web API", description: "Invalid secret key" });
|
|
120
118
|
const { bytes, error } = encode(key, "utf8");
|
|
121
|
-
if (error) return
|
|
119
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
122
120
|
try {
|
|
123
121
|
const hashedKey = await crypto.subtle.digest("SHA-256", bytes);
|
|
124
122
|
const secretKey = await crypto.subtle.importKey("raw", hashedKey, { name: WEB_API_ALGORITHM }, true, [
|
|
125
123
|
"encrypt",
|
|
126
124
|
"decrypt"
|
|
127
125
|
]);
|
|
128
|
-
return
|
|
126
|
+
return chunkSSMTQMF4_cjs.$ok({ secretKey });
|
|
129
127
|
} catch (error2) {
|
|
130
|
-
return
|
|
128
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to create secret key with Crypto Web API", description: chunkSSMTQMF4_cjs.$stringifyError(error2) });
|
|
131
129
|
}
|
|
132
130
|
}
|
|
133
|
-
if (
|
|
134
|
-
return
|
|
131
|
+
if (!isWebApiKey(key)) return chunkSSMTQMF4_cjs.$err({ message: "Invalid secret key", description: "Expected a webcrypto.CryptoKey" });
|
|
132
|
+
return chunkSSMTQMF4_cjs.$ok({ secretKey: key });
|
|
135
133
|
}
|
|
136
134
|
async function encrypt(data, secretKey) {
|
|
137
|
-
if (!
|
|
138
|
-
return
|
|
135
|
+
if (!chunkSSMTQMF4_cjs.$isStr(data)) {
|
|
136
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Empty data for encryption", description: "Data must be a non-empty string" });
|
|
139
137
|
}
|
|
140
|
-
if (
|
|
141
|
-
return
|
|
138
|
+
if (!isWebApiKey(secretKey)) {
|
|
139
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Invalid encryption key", description: "Expected a webcrypto.CryptoKey" });
|
|
142
140
|
}
|
|
143
141
|
const { bytes, error } = encode(data, "utf8");
|
|
144
|
-
if (error) return
|
|
142
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
145
143
|
try {
|
|
146
144
|
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
147
145
|
const encrypted = await crypto.subtle.encrypt({ name: WEB_API_ALGORITHM, iv }, secretKey, bytes);
|
|
148
146
|
const { result: decodedIv, error: ivError } = decode(iv, "base64url");
|
|
149
147
|
const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, "base64url");
|
|
150
148
|
if (ivError || encryptedError) {
|
|
151
|
-
return
|
|
149
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
|
|
152
150
|
}
|
|
153
|
-
return
|
|
151
|
+
return chunkSSMTQMF4_cjs.$ok(`${decodedIv}.${decodedEncrypted}.`);
|
|
154
152
|
} catch (error2) {
|
|
155
|
-
return
|
|
153
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encrypt data with Crypto Web API", description: chunkSSMTQMF4_cjs.$stringifyError(error2) });
|
|
156
154
|
}
|
|
157
155
|
}
|
|
158
156
|
async function decrypt(encrypted, secretKey) {
|
|
159
|
-
if (
|
|
160
|
-
return
|
|
157
|
+
if (chunkSSMTQMF4_cjs.ENCRYPTED_WEB_REGEX.test(encrypted) === false) {
|
|
158
|
+
return chunkSSMTQMF4_cjs.$err({
|
|
161
159
|
message: "Invalid encrypted data format",
|
|
162
160
|
description: 'Data must be in the format "iv.encryptedWithTag."'
|
|
163
161
|
});
|
|
164
162
|
}
|
|
165
163
|
const [iv, encryptedWithTag] = encrypted.split(".", 3);
|
|
166
|
-
if (!
|
|
167
|
-
return
|
|
164
|
+
if (!chunkSSMTQMF4_cjs.$isStr(iv, 1) || !chunkSSMTQMF4_cjs.$isStr(encryptedWithTag, 1)) {
|
|
165
|
+
return chunkSSMTQMF4_cjs.$err({
|
|
168
166
|
message: "Invalid parameters for decryption",
|
|
169
167
|
description: "IV and encrypted data must be non-empty strings"
|
|
170
168
|
});
|
|
171
169
|
}
|
|
172
|
-
if (
|
|
173
|
-
return
|
|
170
|
+
if (!isWebApiKey(secretKey)) {
|
|
171
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Invalid decryption key", description: "Expected a webcrypto.CryptoKey" });
|
|
174
172
|
}
|
|
175
173
|
const { bytes: ivBytes, error: ivError } = encode(iv, "base64url");
|
|
176
174
|
const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedWithTag, "base64url");
|
|
177
175
|
if (ivError || encryptedError) {
|
|
178
|
-
return
|
|
176
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
|
|
179
177
|
}
|
|
180
178
|
try {
|
|
181
179
|
const decrypted = await crypto.subtle.decrypt({ name: WEB_API_ALGORITHM, iv: ivBytes }, secretKey, encryptedBytes);
|
|
182
180
|
return decode(decrypted, "utf8");
|
|
183
181
|
} catch (error) {
|
|
184
|
-
return
|
|
182
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to decrypt data with Crypto Web API", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
185
183
|
}
|
|
186
184
|
}
|
|
187
185
|
async function encryptObj(data, secretKey) {
|
|
188
|
-
const { result, error } =
|
|
189
|
-
if (error) return
|
|
186
|
+
const { result, error } = chunkSSMTQMF4_cjs.stringifyObj(data);
|
|
187
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
190
188
|
return await encrypt(result, secretKey);
|
|
191
189
|
}
|
|
192
190
|
async function decryptObj(encrypted, secretKey) {
|
|
193
191
|
const { result, error } = await decrypt(encrypted, secretKey);
|
|
194
|
-
if (error) return
|
|
195
|
-
return
|
|
192
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
193
|
+
return chunkSSMTQMF4_cjs.parseToObj(result);
|
|
196
194
|
}
|
|
197
195
|
|
|
198
196
|
exports.WEB_API_ALGORITHM = WEB_API_ALGORITHM;
|
|
@@ -203,7 +201,8 @@ exports.encode = encode;
|
|
|
203
201
|
exports.encrypt = encrypt;
|
|
204
202
|
exports.encryptObj = encryptObj;
|
|
205
203
|
exports.hash = hash;
|
|
204
|
+
exports.isWebApiKey = isWebApiKey;
|
|
206
205
|
exports.newSecretKey = newSecretKey;
|
|
207
206
|
exports.newUuid = newUuid;
|
|
208
|
-
//# sourceMappingURL=chunk-
|
|
209
|
-
//# sourceMappingURL=chunk-
|
|
207
|
+
//# sourceMappingURL=chunk-DAMEE4F4.cjs.map
|
|
208
|
+
//# sourceMappingURL=chunk-DAMEE4F4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/web/encode.ts","../src/web/encrypt.ts"],"names":["$ok","$err","$stringifyError","$isStr","error","ENCRYPTED_WEB_REGEX","stringifyObj","parseToObj"],"mappings":"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","file":"chunk-DAMEE4F4.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\nimport { $isStr, ENCRYPTED_WEB_REGEX, parseToObj, stringifyObj } from '~/utils';\r\nimport { decode, encode } from './encode';\r\n\r\nexport const WEB_API_ALGORITHM = 'AES-GCM';\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\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_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
|
-
import { $ok, $err, $stringifyError, $isStr, ENCRYPTED_NODE_REGEX,
|
|
1
|
+
import { $ok, $err, $stringifyError, $isStr, ENCRYPTED_NODE_REGEX, stringifyObj, parseToObj } from './chunk-IHTNNCLY.js';
|
|
2
2
|
import { Buffer } from 'buffer';
|
|
3
|
-
import
|
|
3
|
+
import nodeCrypto from 'crypto';
|
|
4
4
|
|
|
5
5
|
function encode(data, format = "utf8") {
|
|
6
6
|
try {
|
|
@@ -16,25 +16,23 @@ function decode(data, format = "utf8") {
|
|
|
16
16
|
return $err({ message: "Failed to decode data", description: $stringifyError(error) });
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
+
var NODE_ALGORITHM = "aes-256-gcm";
|
|
19
20
|
function newUuid() {
|
|
20
21
|
try {
|
|
21
|
-
return $ok(
|
|
22
|
+
return $ok(nodeCrypto.randomUUID());
|
|
22
23
|
} catch (error) {
|
|
23
24
|
return $err({ message: "Failed to generate UUID with Crypto NodeJS", description: $stringifyError(error) });
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
|
-
function
|
|
27
|
-
return key instanceof
|
|
27
|
+
function isNodeKey(key) {
|
|
28
|
+
return key instanceof nodeCrypto.KeyObject;
|
|
28
29
|
}
|
|
29
|
-
|
|
30
|
-
// src/node/encrypt.ts
|
|
31
|
-
var NODE_ALGORITHM = "aes-256-gcm";
|
|
32
30
|
function hash(data) {
|
|
33
31
|
if (!$isStr(data)) {
|
|
34
32
|
return $err({ message: "Empty data for hashing", description: "Data must be a non-empty string" });
|
|
35
33
|
}
|
|
36
34
|
try {
|
|
37
|
-
const hashed =
|
|
35
|
+
const hashed = nodeCrypto.createHash("sha256").update(data).digest();
|
|
38
36
|
return decode(hashed, "base64url");
|
|
39
37
|
} catch (error) {
|
|
40
38
|
return $err({ message: "Failed to hash data with Crypto NodeJS", description: $stringifyError(error) });
|
|
@@ -44,26 +42,26 @@ function newSecretKey(key) {
|
|
|
44
42
|
if (typeof key === "string") {
|
|
45
43
|
if (!$isStr(key, 1)) return $err({ message: "Empty key for Crypto NodeJS", description: "Invalid secret key" });
|
|
46
44
|
try {
|
|
47
|
-
const hashedKey =
|
|
48
|
-
const secretKey =
|
|
45
|
+
const hashedKey = nodeCrypto.createHash("sha256").update(key).digest();
|
|
46
|
+
const secretKey = nodeCrypto.createSecretKey(hashedKey);
|
|
49
47
|
return $ok({ secretKey });
|
|
50
48
|
} catch (error) {
|
|
51
49
|
return $err({ message: "Failed to create secret key with Crypto NodeJS", description: $stringifyError(error) });
|
|
52
50
|
}
|
|
53
51
|
}
|
|
54
|
-
if (
|
|
52
|
+
if (!isNodeKey(key)) return $err({ message: "Invalid secret key", description: "Expected a crypto.KeyObject" });
|
|
55
53
|
return $ok({ secretKey: key });
|
|
56
54
|
}
|
|
57
55
|
function encrypt(data, secretKey) {
|
|
58
56
|
if (!$isStr(data)) {
|
|
59
57
|
return $err({ message: "Empty data for encryption", description: "Data must be a non-empty string" });
|
|
60
58
|
}
|
|
61
|
-
if (
|
|
59
|
+
if (!isNodeKey(secretKey)) {
|
|
62
60
|
return $err({ message: "Invalid encryption key", description: "Expected a crypto.KeyObject" });
|
|
63
61
|
}
|
|
64
62
|
try {
|
|
65
|
-
const iv =
|
|
66
|
-
const cipher =
|
|
63
|
+
const iv = nodeCrypto.randomBytes(12);
|
|
64
|
+
const cipher = nodeCrypto.createCipheriv(NODE_ALGORITHM, secretKey, iv);
|
|
67
65
|
const encrypted = Buffer.concat([cipher.update(data, "utf8"), cipher.final()]);
|
|
68
66
|
const tag = cipher.getAuthTag();
|
|
69
67
|
const { result: decodedIv, error: ivError } = decode(iv, "base64url");
|
|
@@ -91,7 +89,7 @@ function decrypt(encrypted, secretKey) {
|
|
|
91
89
|
description: "IV, encrypted data, and tag must be non-empty strings"
|
|
92
90
|
});
|
|
93
91
|
}
|
|
94
|
-
if (
|
|
92
|
+
if (!isNodeKey(secretKey)) {
|
|
95
93
|
return $err({ message: "Invalid decryption key", description: "Expected a crypto.KeyObject" });
|
|
96
94
|
}
|
|
97
95
|
const { bytes: ivBytes, error: ivError } = encode(iv, "base64url");
|
|
@@ -101,7 +99,7 @@ function decrypt(encrypted, secretKey) {
|
|
|
101
99
|
return $err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
|
|
102
100
|
}
|
|
103
101
|
try {
|
|
104
|
-
const decipher =
|
|
102
|
+
const decipher = nodeCrypto.createDecipheriv(NODE_ALGORITHM, secretKey, ivBytes);
|
|
105
103
|
decipher.setAuthTag(tagBytes);
|
|
106
104
|
const decrypted = Buffer.concat([decipher.update(encryptedBytes), decipher.final()]);
|
|
107
105
|
return decode(decrypted, "utf8");
|
|
@@ -110,16 +108,16 @@ function decrypt(encrypted, secretKey) {
|
|
|
110
108
|
}
|
|
111
109
|
}
|
|
112
110
|
function encryptObj(data, secretKey) {
|
|
113
|
-
const { result, error } =
|
|
111
|
+
const { result, error } = stringifyObj(data);
|
|
114
112
|
if (error) return $err(error);
|
|
115
113
|
return encrypt(result, secretKey);
|
|
116
114
|
}
|
|
117
115
|
function decryptObj(encrypted, secretKey) {
|
|
118
116
|
const { result, error } = decrypt(encrypted, secretKey);
|
|
119
117
|
if (error) return $err(error);
|
|
120
|
-
return
|
|
118
|
+
return parseToObj(result);
|
|
121
119
|
}
|
|
122
120
|
|
|
123
|
-
export { NODE_ALGORITHM, decode, decrypt, decryptObj, encode, encrypt, encryptObj, hash, newSecretKey, newUuid };
|
|
124
|
-
//# sourceMappingURL=chunk-
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
121
|
+
export { NODE_ALGORITHM, decode, decrypt, decryptObj, encode, encrypt, encryptObj, hash, isNodeKey, newSecretKey, newUuid };
|
|
122
|
+
//# sourceMappingURL=chunk-HSRKAY2V.js.map
|
|
123
|
+
//# sourceMappingURL=chunk-HSRKAY2V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/node/encode.ts","../src/node/encrypt.ts"],"names":["Buffer"],"mappings":"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","file":"chunk-HSRKAY2V.js","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 { 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, ENCRYPTED_NODE_REGEX, parseToObj, stringifyObj } from '~/utils';\r\nimport { decode, encode } from './encode';\r\n\r\nexport const NODE_ALGORITHM = 'aes-256-gcm';\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\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"]}
|
|
@@ -22,7 +22,7 @@ function $isStr(value, min = 0) {
|
|
|
22
22
|
function $isObj(value) {
|
|
23
23
|
return typeof value === "object" && value !== null && value !== void 0 && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
|
|
24
24
|
}
|
|
25
|
-
function
|
|
25
|
+
function stringifyObj(obj) {
|
|
26
26
|
if (!$isObj(obj)) return $err({ message: "Invalid object", description: "Input is not a plain object" });
|
|
27
27
|
try {
|
|
28
28
|
return $ok(JSON.stringify(obj));
|
|
@@ -30,7 +30,7 @@ function $stringifyObj(obj) {
|
|
|
30
30
|
return $err({ message: "Stringify error", description: $stringifyError(error) });
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
function
|
|
33
|
+
function parseToObj(str) {
|
|
34
34
|
if (!$isStr(str)) return $err({ message: "Invalid input", description: "Input is not a valid string" });
|
|
35
35
|
try {
|
|
36
36
|
const obj = JSON.parse(str);
|
|
@@ -43,6 +43,6 @@ function $parseToObj(str) {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
export { $err, $isStr, $ok, $
|
|
47
|
-
//# sourceMappingURL=chunk-
|
|
48
|
-
//# sourceMappingURL=chunk-
|
|
46
|
+
export { $err, $isStr, $ok, $stringifyError, ENCRYPTED_NODE_REGEX, ENCRYPTED_REGEX, ENCRYPTED_WEB_REGEX, parseToObj, stringifyObj };
|
|
47
|
+
//# sourceMappingURL=chunk-IHTNNCLY.js.map
|
|
48
|
+
//# sourceMappingURL=chunk-IHTNNCLY.js.map
|
|
@@ -1 +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,IAAM,eAAA,GAAkB;AACxB,IAAM,oBAAA,GAAuB;AAC7B,IAAM,mBAAA,GAAsB;AAE5B,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,
|
|
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,IAAM,eAAA,GAAkB;AACxB,IAAM,oBAAA,GAAuB;AAC7B,IAAM,mBAAA,GAAsB;AAE5B,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,aAAa,GAAA,EAA8C;AACzE,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,WAAW,GAAA,EAA0D;AACnF,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-IHTNNCLY.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 const ENCRYPTED_REGEX = /^(?:[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+(?:\\.[A-Za-z0-9_-]+)?\\.)$/;\r\nexport const ENCRYPTED_NODE_REGEX = /^([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.$/;\r\nexport const ENCRYPTED_WEB_REGEX = /^([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.$/;\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"]}
|