@alibarbar/common 1.0.0

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.
Files changed (210) hide show
  1. package/README.md +338 -0
  2. package/dist/algorithm.d.mts +66 -0
  3. package/dist/algorithm.d.ts +66 -0
  4. package/dist/algorithm.js +44 -0
  5. package/dist/algorithm.js.map +1 -0
  6. package/dist/algorithm.mjs +3 -0
  7. package/dist/algorithm.mjs.map +1 -0
  8. package/dist/array.d.mts +139 -0
  9. package/dist/array.d.ts +139 -0
  10. package/dist/array.js +84 -0
  11. package/dist/array.js.map +1 -0
  12. package/dist/array.mjs +3 -0
  13. package/dist/array.mjs.map +1 -0
  14. package/dist/chunk-27UDDVLZ.js +259 -0
  15. package/dist/chunk-27UDDVLZ.js.map +1 -0
  16. package/dist/chunk-2FFSQ573.mjs +138 -0
  17. package/dist/chunk-2FFSQ573.mjs.map +1 -0
  18. package/dist/chunk-4RGXV4SJ.js +106 -0
  19. package/dist/chunk-4RGXV4SJ.js.map +1 -0
  20. package/dist/chunk-56W6YECK.js +374 -0
  21. package/dist/chunk-56W6YECK.js.map +1 -0
  22. package/dist/chunk-5BGSUGTI.mjs +128 -0
  23. package/dist/chunk-5BGSUGTI.mjs.map +1 -0
  24. package/dist/chunk-7E6GELHJ.mjs +302 -0
  25. package/dist/chunk-7E6GELHJ.mjs.map +1 -0
  26. package/dist/chunk-7V5UQXIO.js +89 -0
  27. package/dist/chunk-7V5UQXIO.js.map +1 -0
  28. package/dist/chunk-A4SWQXX7.mjs +484 -0
  29. package/dist/chunk-A4SWQXX7.mjs.map +1 -0
  30. package/dist/chunk-ALDC6LRJ.mjs +85 -0
  31. package/dist/chunk-ALDC6LRJ.mjs.map +1 -0
  32. package/dist/chunk-BHCRFURU.js +491 -0
  33. package/dist/chunk-BHCRFURU.js.map +1 -0
  34. package/dist/chunk-D7CS5EKF.js +110 -0
  35. package/dist/chunk-D7CS5EKF.js.map +1 -0
  36. package/dist/chunk-DYBSRI7V.js +189 -0
  37. package/dist/chunk-DYBSRI7V.js.map +1 -0
  38. package/dist/chunk-F3LAGHPG.js +332 -0
  39. package/dist/chunk-F3LAGHPG.js.map +1 -0
  40. package/dist/chunk-HLDFI7R2.mjs +175 -0
  41. package/dist/chunk-HLDFI7R2.mjs.map +1 -0
  42. package/dist/chunk-HME2N3VY.mjs +354 -0
  43. package/dist/chunk-HME2N3VY.mjs.map +1 -0
  44. package/dist/chunk-I3L42475.js +145 -0
  45. package/dist/chunk-I3L42475.js.map +1 -0
  46. package/dist/chunk-JBLX27WD.mjs +240 -0
  47. package/dist/chunk-JBLX27WD.mjs.map +1 -0
  48. package/dist/chunk-JHZ7M2MR.mjs +133 -0
  49. package/dist/chunk-JHZ7M2MR.mjs.map +1 -0
  50. package/dist/chunk-JK2SE3I2.js +100 -0
  51. package/dist/chunk-JK2SE3I2.js.map +1 -0
  52. package/dist/chunk-JQZBPAPO.js +157 -0
  53. package/dist/chunk-JQZBPAPO.js.map +1 -0
  54. package/dist/chunk-JXYGC2C5.mjs +100 -0
  55. package/dist/chunk-JXYGC2C5.mjs.map +1 -0
  56. package/dist/chunk-KGFTD255.js +104 -0
  57. package/dist/chunk-KGFTD255.js.map +1 -0
  58. package/dist/chunk-LBHBNPNJ.mjs +148 -0
  59. package/dist/chunk-LBHBNPNJ.mjs.map +1 -0
  60. package/dist/chunk-LCXGZISK.js +158 -0
  61. package/dist/chunk-LCXGZISK.js.map +1 -0
  62. package/dist/chunk-LF4CILQS.mjs +87 -0
  63. package/dist/chunk-LF4CILQS.mjs.map +1 -0
  64. package/dist/chunk-MMR6XQNX.js +98 -0
  65. package/dist/chunk-MMR6XQNX.js.map +1 -0
  66. package/dist/chunk-NSSDYX2U.mjs +80 -0
  67. package/dist/chunk-NSSDYX2U.mjs.map +1 -0
  68. package/dist/chunk-O3O67R4I.js +143 -0
  69. package/dist/chunk-O3O67R4I.js.map +1 -0
  70. package/dist/chunk-OX5PLOWB.js +90 -0
  71. package/dist/chunk-OX5PLOWB.js.map +1 -0
  72. package/dist/chunk-PJ7UCTX4.mjs +362 -0
  73. package/dist/chunk-PJ7UCTX4.mjs.map +1 -0
  74. package/dist/chunk-QIBE7GVN.mjs +81 -0
  75. package/dist/chunk-QIBE7GVN.mjs.map +1 -0
  76. package/dist/chunk-QIOC54LQ.mjs +130 -0
  77. package/dist/chunk-QIOC54LQ.mjs.map +1 -0
  78. package/dist/chunk-QV6MIQ7H.mjs +328 -0
  79. package/dist/chunk-QV6MIQ7H.mjs.map +1 -0
  80. package/dist/chunk-TQN37HIN.js +94 -0
  81. package/dist/chunk-TQN37HIN.js.map +1 -0
  82. package/dist/chunk-XJTZDXSR.mjs +94 -0
  83. package/dist/chunk-XJTZDXSR.mjs.map +1 -0
  84. package/dist/chunk-XVUE53T3.js +361 -0
  85. package/dist/chunk-XVUE53T3.js.map +1 -0
  86. package/dist/chunk-Y364QIQH.js +139 -0
  87. package/dist/chunk-Y364QIQH.js.map +1 -0
  88. package/dist/chunk-YXM6Q4JS.mjs +94 -0
  89. package/dist/chunk-YXM6Q4JS.mjs.map +1 -0
  90. package/dist/chunk-ZDMFMUDR.js +309 -0
  91. package/dist/chunk-ZDMFMUDR.js.map +1 -0
  92. package/dist/chunk-ZVJ6NQUM.mjs +82 -0
  93. package/dist/chunk-ZVJ6NQUM.mjs.map +1 -0
  94. package/dist/color.d.mts +74 -0
  95. package/dist/color.d.ts +74 -0
  96. package/dist/color.js +40 -0
  97. package/dist/color.js.map +1 -0
  98. package/dist/color.mjs +3 -0
  99. package/dist/color.mjs.map +1 -0
  100. package/dist/crypto.d.mts +92 -0
  101. package/dist/crypto.d.ts +92 -0
  102. package/dist/crypto.js +60 -0
  103. package/dist/crypto.js.map +1 -0
  104. package/dist/crypto.mjs +3 -0
  105. package/dist/crypto.mjs.map +1 -0
  106. package/dist/data-structure.d.mts +213 -0
  107. package/dist/data-structure.d.ts +213 -0
  108. package/dist/data-structure.js +32 -0
  109. package/dist/data-structure.js.map +1 -0
  110. package/dist/data-structure.mjs +3 -0
  111. package/dist/data-structure.mjs.map +1 -0
  112. package/dist/date.d.mts +108 -0
  113. package/dist/date.d.ts +108 -0
  114. package/dist/date.js +72 -0
  115. package/dist/date.js.map +1 -0
  116. package/dist/date.mjs +3 -0
  117. package/dist/date.mjs.map +1 -0
  118. package/dist/dom.d.mts +92 -0
  119. package/dist/dom.d.ts +92 -0
  120. package/dist/dom.js +56 -0
  121. package/dist/dom.js.map +1 -0
  122. package/dist/dom.mjs +3 -0
  123. package/dist/dom.mjs.map +1 -0
  124. package/dist/file.d.mts +44 -0
  125. package/dist/file.d.ts +44 -0
  126. package/dist/file.js +32 -0
  127. package/dist/file.js.map +1 -0
  128. package/dist/file.mjs +3 -0
  129. package/dist/file.mjs.map +1 -0
  130. package/dist/i18n.d.mts +77 -0
  131. package/dist/i18n.d.ts +77 -0
  132. package/dist/i18n.js +40 -0
  133. package/dist/i18n.js.map +1 -0
  134. package/dist/i18n.mjs +3 -0
  135. package/dist/i18n.mjs.map +1 -0
  136. package/dist/index.d.mts +155 -0
  137. package/dist/index.d.ts +155 -0
  138. package/dist/index.js +839 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/index.mjs +22 -0
  141. package/dist/index.mjs.map +1 -0
  142. package/dist/network.d.mts +47 -0
  143. package/dist/network.d.ts +47 -0
  144. package/dist/network.js +28 -0
  145. package/dist/network.js.map +1 -0
  146. package/dist/network.mjs +3 -0
  147. package/dist/network.mjs.map +1 -0
  148. package/dist/number.d.mts +100 -0
  149. package/dist/number.d.ts +100 -0
  150. package/dist/number.js +56 -0
  151. package/dist/number.js.map +1 -0
  152. package/dist/number.mjs +3 -0
  153. package/dist/number.mjs.map +1 -0
  154. package/dist/object.d.mts +132 -0
  155. package/dist/object.d.ts +132 -0
  156. package/dist/object.js +80 -0
  157. package/dist/object.js.map +1 -0
  158. package/dist/object.mjs +3 -0
  159. package/dist/object.mjs.map +1 -0
  160. package/dist/performance.d.mts +85 -0
  161. package/dist/performance.d.ts +85 -0
  162. package/dist/performance.js +40 -0
  163. package/dist/performance.js.map +1 -0
  164. package/dist/performance.mjs +3 -0
  165. package/dist/performance.mjs.map +1 -0
  166. package/dist/storage.d.mts +176 -0
  167. package/dist/storage.d.ts +176 -0
  168. package/dist/storage.js +33 -0
  169. package/dist/storage.js.map +1 -0
  170. package/dist/storage.mjs +4 -0
  171. package/dist/storage.mjs.map +1 -0
  172. package/dist/string.d.mts +105 -0
  173. package/dist/string.d.ts +105 -0
  174. package/dist/string.js +68 -0
  175. package/dist/string.js.map +1 -0
  176. package/dist/string.mjs +3 -0
  177. package/dist/string.mjs.map +1 -0
  178. package/dist/tracking.d.mts +182 -0
  179. package/dist/tracking.d.ts +182 -0
  180. package/dist/tracking.js +52 -0
  181. package/dist/tracking.js.map +1 -0
  182. package/dist/tracking.mjs +3 -0
  183. package/dist/tracking.mjs.map +1 -0
  184. package/dist/transform.d.mts +53 -0
  185. package/dist/transform.d.ts +53 -0
  186. package/dist/transform.js +32 -0
  187. package/dist/transform.js.map +1 -0
  188. package/dist/transform.mjs +3 -0
  189. package/dist/transform.mjs.map +1 -0
  190. package/dist/upload-DzlQtUBc.d.mts +202 -0
  191. package/dist/upload-DzlQtUBc.d.ts +202 -0
  192. package/dist/upload.d.mts +1 -0
  193. package/dist/upload.d.ts +1 -0
  194. package/dist/upload.js +17 -0
  195. package/dist/upload.js.map +1 -0
  196. package/dist/upload.mjs +4 -0
  197. package/dist/upload.mjs.map +1 -0
  198. package/dist/url.d.mts +82 -0
  199. package/dist/url.d.ts +82 -0
  200. package/dist/url.js +44 -0
  201. package/dist/url.js.map +1 -0
  202. package/dist/url.mjs +3 -0
  203. package/dist/url.mjs.map +1 -0
  204. package/dist/validation.d.mts +83 -0
  205. package/dist/validation.d.ts +83 -0
  206. package/dist/validation.js +60 -0
  207. package/dist/validation.js.map +1 -0
  208. package/dist/validation.mjs +3 -0
  209. package/dist/validation.mjs.map +1 -0
  210. package/package.json +170 -0
@@ -0,0 +1,175 @@
1
+ // src/helper/crypto.ts
2
+ async function sha256(data) {
3
+ const buffer = typeof data === "string" ? new TextEncoder().encode(data) : data;
4
+ const hashBuffer = await crypto.subtle.digest("SHA-256", buffer);
5
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
6
+ return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
7
+ }
8
+ function base64Encode(data) {
9
+ if (typeof data === "string") {
10
+ return btoa(unescape(encodeURIComponent(data)));
11
+ }
12
+ const bytes = new Uint8Array(data);
13
+ let binary = "";
14
+ for (let i = 0; i < bytes.length; i++) {
15
+ binary += String.fromCharCode(bytes[i]);
16
+ }
17
+ return btoa(binary);
18
+ }
19
+ function base64Decode(data) {
20
+ try {
21
+ return decodeURIComponent(escape(atob(data)));
22
+ } catch {
23
+ throw new Error("Invalid Base64 string");
24
+ }
25
+ }
26
+ function generateUUID() {
27
+ if (typeof crypto !== "undefined" && crypto.randomUUID) {
28
+ return crypto.randomUUID();
29
+ }
30
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
31
+ const r = Math.random() * 16 | 0;
32
+ const v = c === "x" ? r : r & 3 | 8;
33
+ return v.toString(16);
34
+ });
35
+ }
36
+ function generateRandomString(length, charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") {
37
+ let result = "";
38
+ for (let i = 0; i < length; i++) {
39
+ result += charset.charAt(Math.floor(Math.random() * charset.length));
40
+ }
41
+ return result;
42
+ }
43
+ function hash(data) {
44
+ let hashValue = 0;
45
+ for (let i = 0; i < data.length; i++) {
46
+ const char = data.charCodeAt(i);
47
+ hashValue = (hashValue << 5) - hashValue + char;
48
+ hashValue = hashValue & hashValue;
49
+ }
50
+ return Math.abs(hashValue);
51
+ }
52
+ async function generateRSAKeyPair(modulusLength = 2048) {
53
+ if (typeof crypto === "undefined" || !crypto.subtle) {
54
+ throw new Error("Web Crypto API is not available");
55
+ }
56
+ const keyPair = await crypto.subtle.generateKey(
57
+ {
58
+ name: "RSA-OAEP",
59
+ modulusLength,
60
+ publicExponent: new Uint8Array([1, 0, 1]),
61
+ hash: "SHA-256"
62
+ },
63
+ true,
64
+ ["encrypt", "decrypt"]
65
+ );
66
+ return {
67
+ publicKey: keyPair.publicKey,
68
+ privateKey: keyPair.privateKey
69
+ };
70
+ }
71
+ async function rsaEncrypt(data, publicKey) {
72
+ if (typeof crypto === "undefined" || !crypto.subtle) {
73
+ throw new Error("Web Crypto API is not available");
74
+ }
75
+ const encoder = new TextEncoder();
76
+ const dataBuffer = encoder.encode(data);
77
+ const maxChunkSize = 245;
78
+ const chunks = [];
79
+ for (let i = 0; i < dataBuffer.length; i += maxChunkSize) {
80
+ const chunk = dataBuffer.slice(i, i + maxChunkSize);
81
+ const encrypted = await crypto.subtle.encrypt(
82
+ {
83
+ name: "RSA-OAEP"
84
+ },
85
+ publicKey,
86
+ chunk
87
+ );
88
+ chunks.push(encrypted);
89
+ }
90
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
91
+ const merged = new Uint8Array(totalLength);
92
+ let offset = 0;
93
+ for (const chunk of chunks) {
94
+ merged.set(new Uint8Array(chunk), offset);
95
+ offset += chunk.byteLength;
96
+ }
97
+ return base64Encode(merged.buffer);
98
+ }
99
+ async function rsaDecrypt(encryptedData, privateKey) {
100
+ if (typeof crypto === "undefined" || !crypto.subtle) {
101
+ throw new Error("Web Crypto API is not available");
102
+ }
103
+ const binaryString = atob(encryptedData);
104
+ const encryptedArray = new Uint8Array(binaryString.length);
105
+ for (let i = 0; i < binaryString.length; i++) {
106
+ encryptedArray[i] = binaryString.charCodeAt(i);
107
+ }
108
+ const chunkSize = 256;
109
+ const chunks = [];
110
+ for (let i = 0; i < encryptedArray.length; i += chunkSize) {
111
+ const chunk = encryptedArray.slice(i, i + chunkSize);
112
+ const decrypted = await crypto.subtle.decrypt(
113
+ {
114
+ name: "RSA-OAEP"
115
+ },
116
+ privateKey,
117
+ chunk
118
+ );
119
+ const decoder = new TextDecoder();
120
+ chunks.push(decoder.decode(decrypted));
121
+ }
122
+ return chunks.join("");
123
+ }
124
+ async function exportPublicKey(publicKey) {
125
+ if (typeof crypto === "undefined" || !crypto.subtle) {
126
+ throw new Error("Web Crypto API is not available");
127
+ }
128
+ const exported = await crypto.subtle.exportKey("spki", publicKey);
129
+ return base64Encode(exported);
130
+ }
131
+ async function exportPrivateKey(privateKey) {
132
+ if (typeof crypto === "undefined" || !crypto.subtle) {
133
+ throw new Error("Web Crypto API is not available");
134
+ }
135
+ const exported = await crypto.subtle.exportKey("pkcs8", privateKey);
136
+ return base64Encode(exported);
137
+ }
138
+ async function importPublicKey(keyData) {
139
+ if (typeof crypto === "undefined" || !crypto.subtle) {
140
+ throw new Error("Web Crypto API is not available");
141
+ }
142
+ const keyBuffer = base64Decode(keyData);
143
+ const keyArray = new Uint8Array(keyBuffer.split("").map((char) => char.charCodeAt(0)));
144
+ return crypto.subtle.importKey(
145
+ "spki",
146
+ keyArray.buffer,
147
+ {
148
+ name: "RSA-OAEP",
149
+ hash: "SHA-256"
150
+ },
151
+ true,
152
+ ["encrypt"]
153
+ );
154
+ }
155
+ async function importPrivateKey(keyData) {
156
+ if (typeof crypto === "undefined" || !crypto.subtle) {
157
+ throw new Error("Web Crypto API is not available");
158
+ }
159
+ const keyBuffer = base64Decode(keyData);
160
+ const keyArray = new Uint8Array(keyBuffer.split("").map((char) => char.charCodeAt(0)));
161
+ return crypto.subtle.importKey(
162
+ "pkcs8",
163
+ keyArray.buffer,
164
+ {
165
+ name: "RSA-OAEP",
166
+ hash: "SHA-256"
167
+ },
168
+ true,
169
+ ["decrypt"]
170
+ );
171
+ }
172
+
173
+ export { base64Decode, base64Encode, exportPrivateKey, exportPublicKey, generateRSAKeyPair, generateRandomString, generateUUID, hash, importPrivateKey, importPublicKey, rsaDecrypt, rsaEncrypt, sha256 };
174
+ //# sourceMappingURL=chunk-HLDFI7R2.mjs.map
175
+ //# sourceMappingURL=chunk-HLDFI7R2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helper/crypto.ts"],"names":[],"mappings":";AASA,eAAsB,OAAO,IAAA,EAA6C;AACxE,EAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAS,QAAA,GAAW,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAC3E,EAAA,MAAM,aAAa,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,MAAM,CAAA;AAC/D,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,IAAI,UAAA,CAAW,UAAU,CAAC,CAAA;AACvD,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AACpE;AAOO,SAAS,aAAa,IAAA,EAAoC;AAC/D,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,kBAAA,CAAmB,IAAI,CAAC,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAI,CAAA;AACjC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAOO,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,IAAI;AACF,IAAA,OAAO,kBAAA,CAAmB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAAA,EAC9C,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,EACzC;AACF;AAMO,SAAS,YAAA,GAAuB;AACrC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,UAAA,EAAY;AACtD,IAAA,OAAO,OAAO,UAAA,EAAW;AAAA,EAC3B;AAGA,EAAA,OAAO,sCAAA,CAAuC,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAA,KAAK;AAClE,IAAA,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA,GAAM,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,KAAM,GAAA,GAAM,CAAA,GAAK,IAAI,CAAA,GAAO,CAAA;AACtC,IAAA,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,EACtB,CAAC,CAAA;AACH;AAQO,SAAS,oBAAA,CACd,MAAA,EACA,OAAA,GAAU,gEAAA,EACF;AACR,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAA,IAAU,OAAA,CAAQ,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,KAAK,IAAA,EAAsB;AACzC,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAC9B,IAAA,SAAA,GAAA,CAAa,SAAA,IAAa,KAAK,SAAA,GAAY,IAAA;AAC3C,IAAA,SAAA,GAAY,SAAA,GAAY,SAAA;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AAC3B;AAeA,eAAsB,kBAAA,CAAmB,gBAAgB,IAAA,EAA2B;AAClF,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACnD,IAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,MAAA,CAAO,WAAA;AAAA,IAClC;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,aAAA;AAAA,MACA,gBAAgB,IAAI,UAAA,CAAW,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MACxC,IAAA,EAAM;AAAA,KACR;AAAA,IACA,IAAA;AAAA,IACA,CAAC,WAAW,SAAS;AAAA,GACvB;AAEA,EAAA,OAAO;AAAA,IACL,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,YAAY,OAAA,CAAQ;AAAA,GACtB;AACF;AAQA,eAAsB,UAAA,CAAW,MAAc,SAAA,EAAuC;AACpF,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACnD,IAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAItC,EAAA,MAAM,YAAA,GAAe,GAAA;AACrB,EAAA,MAAM,SAAwB,EAAC;AAE/B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,MAAA,EAAQ,KAAK,YAAA,EAAc;AACxD,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,IAAI,YAAY,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,OAAA;AAAA,MACpC;AAAA,QACE,IAAA,EAAM;AAAA,OACR;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,EACvB;AAGA,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,UAAA,EAAY,CAAC,CAAA;AAC3E,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,WAAW,CAAA;AACzC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAA,CAAO,GAAA,CAAI,IAAI,UAAA,CAAW,KAAK,GAAG,MAAM,CAAA;AACxC,IAAA,MAAA,IAAU,KAAA,CAAM,UAAA;AAAA,EAClB;AAEA,EAAA,OAAO,YAAA,CAAa,OAAO,MAAM,CAAA;AACnC;AAQA,eAAsB,UAAA,CAAW,eAAuB,UAAA,EAAwC;AAC9F,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACnD,IAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,EACnD;AAGA,EAAA,MAAM,YAAA,GAAe,KAAK,aAAa,CAAA;AACvC,EAAA,MAAM,cAAA,GAAiB,IAAI,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AACzD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,cAAA,CAAe,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,SAAA,GAAY,GAAA;AAClB,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,MAAA,EAAQ,KAAK,SAAA,EAAW;AACzD,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AACnD,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,OAAA;AAAA,MACpC;AAAA,QACE,IAAA,EAAM;AAAA,OACR;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,MAAA,CAAO,KAAK,EAAE,CAAA;AACvB;AAOA,eAAsB,gBAAgB,SAAA,EAAuC;AAC3E,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACnD,IAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,WAAW,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,QAAQ,SAAS,CAAA;AAChE,EAAA,OAAO,aAAa,QAAQ,CAAA;AAC9B;AAOA,eAAsB,iBAAiB,UAAA,EAAwC;AAC7E,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACnD,IAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,WAAW,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,SAAS,UAAU,CAAA;AAClE,EAAA,OAAO,aAAa,QAAQ,CAAA;AAC9B;AAOA,eAAsB,gBAAgB,OAAA,EAAqC;AACzE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACnD,IAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,SAAA,GAAY,aAAa,OAAO,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,SAAA,CAAU,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAC,CAAA;AAEnF,EAAA,OAAO,OAAO,MAAA,CAAO,SAAA;AAAA,IACnB,MAAA;AAAA,IACA,QAAA,CAAS,MAAA;AAAA,IACT;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,IAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AACF;AAOA,eAAsB,iBAAiB,OAAA,EAAqC;AAC1E,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACnD,IAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,SAAA,GAAY,aAAa,OAAO,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,SAAA,CAAU,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAC,CAAA;AAEnF,EAAA,OAAO,OAAO,MAAA,CAAO,SAAA;AAAA,IACnB,OAAA;AAAA,IACA,QAAA,CAAS,MAAA;AAAA,IACT;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,IAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AACF","file":"chunk-HLDFI7R2.mjs","sourcesContent":["/**\n * 加密工具函数\n */\n\n/**\n * SHA256加密\n * @param data - 要加密的数据(字符串或ArrayBuffer)\n * @returns Promise<string> 加密后的十六进制字符串\n */\nexport async function sha256(data: string | ArrayBuffer): Promise<string> {\n const buffer = typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Base64编码\n * @param data - 要编码的数据(字符串或ArrayBuffer)\n * @returns Base64编码字符串\n */\nexport function base64Encode(data: string | ArrayBuffer): string {\n if (typeof data === 'string') {\n return btoa(unescape(encodeURIComponent(data)));\n }\n const bytes = new Uint8Array(data);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Base64解码\n * @param data - Base64编码字符串\n * @returns 解码后的字符串\n */\nexport function base64Decode(data: string): string {\n try {\n return decodeURIComponent(escape(atob(data)));\n } catch {\n throw new Error('Invalid Base64 string');\n }\n}\n\n/**\n * 生成UUID v4\n * @returns UUID字符串\n */\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // 降级方案\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * 生成随机字符串\n * @param length - 字符串长度\n * @param charset - 字符集,默认为 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n * @returns 随机字符串\n */\nexport function generateRandomString(\n length: number,\n charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n): string {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += charset.charAt(Math.floor(Math.random() * charset.length));\n }\n return result;\n}\n\n/**\n * 通用哈希函数(简单实现)\n * @param data - 要哈希的数据\n * @returns 哈希值\n */\nexport function hash(data: string): number {\n let hashValue = 0;\n for (let i = 0; i < data.length; i++) {\n const char = data.charCodeAt(i);\n hashValue = (hashValue << 5) - hashValue + char;\n hashValue = hashValue & hashValue; // 转换为32位整数\n }\n return Math.abs(hashValue);\n}\n\n/**\n * RSA密钥对类型\n */\nexport interface RSAKeyPair {\n publicKey: CryptoKey;\n privateKey: CryptoKey;\n}\n\n/**\n * 生成RSA密钥对\n * @param modulusLength - 密钥长度,默认为 2048\n * @returns Promise<RSAKeyPair> RSA密钥对\n */\nexport async function generateRSAKeyPair(modulusLength = 2048): Promise<RSAKeyPair> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const keyPair = await crypto.subtle.generateKey(\n {\n name: 'RSA-OAEP',\n modulusLength,\n publicExponent: new Uint8Array([1, 0, 1]),\n hash: 'SHA-256',\n },\n true,\n ['encrypt', 'decrypt']\n );\n\n return {\n publicKey: keyPair.publicKey,\n privateKey: keyPair.privateKey,\n };\n}\n\n/**\n * RSA加密\n * @param data - 要加密的数据(字符串)\n * @param publicKey - 公钥\n * @returns Promise<string> Base64编码的加密数据\n */\nexport async function rsaEncrypt(data: string, publicKey: CryptoKey): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(data);\n\n // RSA-OAEP 最大加密长度受密钥长度限制\n // 2048位密钥最多加密245字节,需要分块处理\n const maxChunkSize = 245;\n const chunks: ArrayBuffer[] = [];\n\n for (let i = 0; i < dataBuffer.length; i += maxChunkSize) {\n const chunk = dataBuffer.slice(i, i + maxChunkSize);\n const encrypted = await crypto.subtle.encrypt(\n {\n name: 'RSA-OAEP',\n },\n publicKey,\n chunk\n );\n chunks.push(encrypted);\n }\n\n // 将所有加密块合并并转换为Base64\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(new Uint8Array(chunk), offset);\n offset += chunk.byteLength;\n }\n\n return base64Encode(merged.buffer);\n}\n\n/**\n * RSA解密\n * @param encryptedData - Base64编码的加密数据\n * @param privateKey - 私钥\n * @returns Promise<string> 解密后的字符串\n */\nexport async function rsaDecrypt(encryptedData: string, privateKey: CryptoKey): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n // Base64解码为ArrayBuffer\n const binaryString = atob(encryptedData);\n const encryptedArray = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n encryptedArray[i] = binaryString.charCodeAt(i);\n }\n\n // RSA-OAEP 解密块大小(256字节对于2048位密钥)\n const chunkSize = 256;\n const chunks: string[] = [];\n\n for (let i = 0; i < encryptedArray.length; i += chunkSize) {\n const chunk = encryptedArray.slice(i, i + chunkSize);\n const decrypted = await crypto.subtle.decrypt(\n {\n name: 'RSA-OAEP',\n },\n privateKey,\n chunk\n );\n const decoder = new TextDecoder();\n chunks.push(decoder.decode(decrypted));\n }\n\n return chunks.join('');\n}\n\n/**\n * 导出公钥为Base64字符串\n * @param publicKey - 公钥\n * @returns Promise<string> Base64编码的公钥\n */\nexport async function exportPublicKey(publicKey: CryptoKey): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const exported = await crypto.subtle.exportKey('spki', publicKey);\n return base64Encode(exported);\n}\n\n/**\n * 导出私钥为Base64字符串\n * @param privateKey - 私钥\n * @returns Promise<string> Base64编码的私钥\n */\nexport async function exportPrivateKey(privateKey: CryptoKey): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const exported = await crypto.subtle.exportKey('pkcs8', privateKey);\n return base64Encode(exported);\n}\n\n/**\n * 从Base64字符串导入公钥\n * @param keyData - Base64编码的公钥\n * @returns Promise<CryptoKey> 公钥对象\n */\nexport async function importPublicKey(keyData: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const keyBuffer = base64Decode(keyData);\n const keyArray = new Uint8Array(keyBuffer.split('').map(char => char.charCodeAt(0)));\n\n return crypto.subtle.importKey(\n 'spki',\n keyArray.buffer,\n {\n name: 'RSA-OAEP',\n hash: 'SHA-256',\n },\n true,\n ['encrypt']\n );\n}\n\n/**\n * 从Base64字符串导入私钥\n * @param keyData - Base64编码的私钥\n * @returns Promise<CryptoKey> 私钥对象\n */\nexport async function importPrivateKey(keyData: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const keyBuffer = base64Decode(keyData);\n const keyArray = new Uint8Array(keyBuffer.split('').map(char => char.charCodeAt(0)));\n\n return crypto.subtle.importKey(\n 'pkcs8',\n keyArray.buffer,\n {\n name: 'RSA-OAEP',\n hash: 'SHA-256',\n },\n true,\n ['decrypt']\n );\n}\n"]}
@@ -0,0 +1,354 @@
1
+ import { rsaDecrypt, rsaEncrypt } from './chunk-HLDFI7R2.mjs';
2
+
3
+ // src/browser/storage.ts
4
+ var globalKeyPair = null;
5
+ function setStorageKeyPair(keyPair) {
6
+ globalKeyPair = keyPair;
7
+ }
8
+ function getStorageKeyPair() {
9
+ return globalKeyPair;
10
+ }
11
+ async function encryptValue(value, publicKey) {
12
+ return rsaEncrypt(value, publicKey);
13
+ }
14
+ async function decryptValue(encryptedValue, privateKey) {
15
+ try {
16
+ return await rsaDecrypt(encryptedValue, privateKey);
17
+ } catch {
18
+ try {
19
+ JSON.parse(encryptedValue);
20
+ return encryptedValue;
21
+ } catch {
22
+ throw new Error("Failed to decrypt storage value");
23
+ }
24
+ }
25
+ }
26
+ var localStorage = {
27
+ /**
28
+ * 设置值
29
+ * @param key - 键
30
+ * @param value - 值
31
+ * @param options - 选项(过期时间、密钥等)
32
+ * @returns Promise<void>
33
+ */
34
+ async set(key, value, options = {}) {
35
+ if (typeof window === "undefined" || !window.localStorage) {
36
+ throw new Error("localStorage is not available");
37
+ }
38
+ const { expiry, publicKey } = options;
39
+ const item = {
40
+ value,
41
+ expiry: expiry ? Date.now() + expiry : void 0
42
+ };
43
+ try {
44
+ const jsonStr = JSON.stringify(item);
45
+ const keyToUse = publicKey || globalKeyPair?.publicKey;
46
+ if (keyToUse) {
47
+ const encrypted = await encryptValue(jsonStr, keyToUse);
48
+ window.localStorage.setItem(key, encrypted);
49
+ } else {
50
+ const { base64Encode } = await import('./crypto.mjs');
51
+ const encoded = base64Encode(jsonStr);
52
+ window.localStorage.setItem(key, encoded);
53
+ }
54
+ } catch (error) {
55
+ console.error("localStorage.set error:", error);
56
+ throw error;
57
+ }
58
+ },
59
+ /**
60
+ * 获取值
61
+ * @param key - 键
62
+ * @param options - 选项(默认值、私钥等)
63
+ * @returns Promise<T | undefined> 值或默认值
64
+ */
65
+ async get(key, options = {}) {
66
+ if (typeof window === "undefined" || !window.localStorage) {
67
+ return options.defaultValue;
68
+ }
69
+ const { defaultValue, privateKey } = options;
70
+ try {
71
+ const encryptedStr = window.localStorage.getItem(key);
72
+ if (!encryptedStr) return defaultValue;
73
+ let decryptedStr;
74
+ const keyToUse = privateKey || globalKeyPair?.privateKey;
75
+ if (keyToUse) {
76
+ try {
77
+ decryptedStr = await decryptValue(encryptedStr, keyToUse);
78
+ } catch {
79
+ const { base64Decode } = await import('./crypto.mjs');
80
+ try {
81
+ decryptedStr = base64Decode(encryptedStr);
82
+ } catch {
83
+ return defaultValue;
84
+ }
85
+ }
86
+ } else {
87
+ const { base64Decode } = await import('./crypto.mjs');
88
+ try {
89
+ decryptedStr = base64Decode(encryptedStr);
90
+ } catch {
91
+ return defaultValue;
92
+ }
93
+ }
94
+ const item = JSON.parse(decryptedStr);
95
+ if (item.expiry && Date.now() > item.expiry) {
96
+ window.localStorage.removeItem(key);
97
+ return defaultValue;
98
+ }
99
+ return item.value;
100
+ } catch {
101
+ return defaultValue;
102
+ }
103
+ },
104
+ /**
105
+ * 移除值
106
+ * @param key - 键
107
+ */
108
+ remove(key) {
109
+ if (typeof window === "undefined" || !window.localStorage) return;
110
+ try {
111
+ window.localStorage.removeItem(key);
112
+ } catch (error) {
113
+ console.error("localStorage.remove error:", error);
114
+ }
115
+ },
116
+ /**
117
+ * 清空所有值
118
+ */
119
+ clear() {
120
+ if (typeof window === "undefined" || !window.localStorage) return;
121
+ try {
122
+ window.localStorage.clear();
123
+ } catch (error) {
124
+ console.error("localStorage.clear error:", error);
125
+ }
126
+ },
127
+ /**
128
+ * 获取所有键
129
+ * @returns 键数组
130
+ */
131
+ keys() {
132
+ if (typeof window === "undefined" || !window.localStorage) return [];
133
+ const keys = [];
134
+ try {
135
+ for (let i = 0; i < window.localStorage.length; i++) {
136
+ const key = window.localStorage.key(i);
137
+ if (key) keys.push(key);
138
+ }
139
+ } catch (error) {
140
+ console.error("localStorage.keys error:", error);
141
+ }
142
+ return keys;
143
+ }
144
+ };
145
+ var sessionStorage = {
146
+ /**
147
+ * 设置值
148
+ * @param key - 键
149
+ * @param value - 值
150
+ * @param options - 选项(公钥等)
151
+ * @returns Promise<void>
152
+ */
153
+ async set(key, value, options = {}) {
154
+ if (typeof window === "undefined" || !window.sessionStorage) {
155
+ throw new Error("sessionStorage is not available");
156
+ }
157
+ const { publicKey } = options;
158
+ try {
159
+ const jsonStr = JSON.stringify(value);
160
+ const keyToUse = publicKey || globalKeyPair?.publicKey;
161
+ if (keyToUse) {
162
+ const encrypted = await encryptValue(jsonStr, keyToUse);
163
+ window.sessionStorage.setItem(key, encrypted);
164
+ } else {
165
+ const { base64Encode } = await import('./crypto.mjs');
166
+ const encoded = base64Encode(jsonStr);
167
+ window.sessionStorage.setItem(key, encoded);
168
+ }
169
+ } catch (error) {
170
+ console.error("sessionStorage.set error:", error);
171
+ throw error;
172
+ }
173
+ },
174
+ /**
175
+ * 获取值
176
+ * @param key - 键
177
+ * @param options - 选项(默认值、私钥等)
178
+ * @returns Promise<T | undefined> 值或默认值
179
+ */
180
+ async get(key, options = {}) {
181
+ if (typeof window === "undefined" || !window.sessionStorage) {
182
+ return options.defaultValue;
183
+ }
184
+ const { defaultValue, privateKey } = options;
185
+ try {
186
+ const encryptedStr = window.sessionStorage.getItem(key);
187
+ if (!encryptedStr) return defaultValue;
188
+ let decryptedStr;
189
+ const keyToUse = privateKey || globalKeyPair?.privateKey;
190
+ if (keyToUse) {
191
+ try {
192
+ decryptedStr = await decryptValue(encryptedStr, keyToUse);
193
+ } catch {
194
+ const { base64Decode } = await import('./crypto.mjs');
195
+ try {
196
+ decryptedStr = base64Decode(encryptedStr);
197
+ } catch {
198
+ return defaultValue;
199
+ }
200
+ }
201
+ } else {
202
+ const { base64Decode } = await import('./crypto.mjs');
203
+ try {
204
+ decryptedStr = base64Decode(encryptedStr);
205
+ } catch {
206
+ return defaultValue;
207
+ }
208
+ }
209
+ return JSON.parse(decryptedStr);
210
+ } catch {
211
+ return defaultValue;
212
+ }
213
+ },
214
+ /**
215
+ * 移除值
216
+ * @param key - 键
217
+ */
218
+ remove(key) {
219
+ if (typeof window === "undefined" || !window.sessionStorage) return;
220
+ try {
221
+ window.sessionStorage.removeItem(key);
222
+ } catch (error) {
223
+ console.error("sessionStorage.remove error:", error);
224
+ }
225
+ },
226
+ /**
227
+ * 清空所有值
228
+ */
229
+ clear() {
230
+ if (typeof window === "undefined" || !window.sessionStorage) return;
231
+ try {
232
+ window.sessionStorage.clear();
233
+ } catch (error) {
234
+ console.error("sessionStorage.clear error:", error);
235
+ }
236
+ }
237
+ };
238
+ var cookie = {
239
+ /**
240
+ * 设置Cookie
241
+ * @param key - 键
242
+ * @param value - 值
243
+ * @param options - Cookie选项
244
+ */
245
+ set(key, value, options = {}) {
246
+ if (typeof document === "undefined") {
247
+ throw new Error("document is not available");
248
+ }
249
+ let cookieStr = `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
250
+ if (options.expires) {
251
+ const expiresDate = options.expires instanceof Date ? options.expires : new Date(Date.now() + options.expires * 24 * 60 * 60 * 1e3);
252
+ cookieStr += `; expires=${expiresDate.toUTCString()}`;
253
+ }
254
+ if (options.path) cookieStr += `; path=${options.path}`;
255
+ if (options.domain) cookieStr += `; domain=${options.domain}`;
256
+ if (options.secure) cookieStr += "; secure";
257
+ if (options.sameSite) cookieStr += `; sameSite=${options.sameSite}`;
258
+ document.cookie = cookieStr;
259
+ },
260
+ /**
261
+ * 获取Cookie
262
+ * @param key - 键
263
+ * @returns Cookie值
264
+ */
265
+ get(key) {
266
+ if (typeof document === "undefined") return void 0;
267
+ const name = encodeURIComponent(key);
268
+ const cookies = document.cookie.split(";");
269
+ for (const cookie2 of cookies) {
270
+ const [cookieKey, cookieValue] = cookie2.trim().split("=");
271
+ if (cookieKey === name) {
272
+ return decodeURIComponent(cookieValue);
273
+ }
274
+ }
275
+ return void 0;
276
+ },
277
+ /**
278
+ * 移除Cookie
279
+ * @param key - 键
280
+ * @param options - Cookie选项
281
+ */
282
+ remove(key, options = {}) {
283
+ cookie.set(key, "", {
284
+ ...options,
285
+ expires: /* @__PURE__ */ new Date(0)
286
+ });
287
+ },
288
+ /**
289
+ * 获取所有Cookie
290
+ * @returns Cookie对象
291
+ */
292
+ getAll() {
293
+ if (typeof document === "undefined") return {};
294
+ const cookies = {};
295
+ document.cookie.split(";").forEach((cookieStr) => {
296
+ const [key, value] = cookieStr.trim().split("=");
297
+ if (key && value) {
298
+ cookies[decodeURIComponent(key)] = decodeURIComponent(value);
299
+ }
300
+ });
301
+ return cookies;
302
+ }
303
+ };
304
+ var storage = {
305
+ /**
306
+ * 设置值(优先使用localStorage,失败则使用sessionStorage)
307
+ * @param key - 键
308
+ * @param value - 值
309
+ * @param options - 选项(过期时间、公钥等)
310
+ * @returns Promise<void>
311
+ */
312
+ async set(key, value, options = {}) {
313
+ try {
314
+ await localStorage.set(key, value, options);
315
+ } catch {
316
+ try {
317
+ await sessionStorage.set(key, value, { publicKey: options.publicKey });
318
+ } catch {
319
+ console.warn("Both localStorage and sessionStorage are not available");
320
+ }
321
+ }
322
+ },
323
+ /**
324
+ * 获取值
325
+ * @param key - 键
326
+ * @param options - 选项(默认值、私钥等)
327
+ * @returns Promise<T | undefined> 值或默认值
328
+ */
329
+ async get(key, options = {}) {
330
+ const localValue = await localStorage.get(key, options);
331
+ if (localValue !== void 0) return localValue;
332
+ const sessionValue = await sessionStorage.get(key, options);
333
+ return sessionValue !== void 0 ? sessionValue : options.defaultValue;
334
+ },
335
+ /**
336
+ * 移除值
337
+ * @param key - 键
338
+ */
339
+ remove(key) {
340
+ localStorage.remove(key);
341
+ sessionStorage.remove(key);
342
+ },
343
+ /**
344
+ * 清空所有值
345
+ */
346
+ clear() {
347
+ localStorage.clear();
348
+ sessionStorage.clear();
349
+ }
350
+ };
351
+
352
+ export { cookie, getStorageKeyPair, localStorage, sessionStorage, setStorageKeyPair, storage };
353
+ //# sourceMappingURL=chunk-HME2N3VY.mjs.map
354
+ //# sourceMappingURL=chunk-HME2N3VY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/browser/storage.ts"],"names":["cookie"],"mappings":"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","file":"chunk-HME2N3VY.mjs","sourcesContent":["/**\n * 存储工具函数\n */\n\nimport { rsaEncrypt, rsaDecrypt, type RSAKeyPair } from '../helper/crypto';\n\n/**\n * 存储项配置\n */\ninterface StorageItem<T> {\n value: T;\n expiry?: number; // 过期时间戳\n}\n\n/**\n * 存储配置选项\n */\nexport interface StorageOptions {\n /** RSA公钥(用于加密) */\n publicKey?: CryptoKey;\n /** RSA私钥(用于解密) */\n privateKey?: CryptoKey;\n /** 是否启用加密,默认为 true */\n encrypt?: boolean;\n}\n\n// 全局密钥对(可选,用户也可以传入)\nlet globalKeyPair: RSAKeyPair | null = null;\n\n/**\n * 设置全局RSA密钥对\n * @param keyPair - RSA密钥对\n */\nexport function setStorageKeyPair(keyPair: RSAKeyPair): void {\n globalKeyPair = keyPair;\n}\n\n/**\n * 获取全局密钥对\n * @returns 全局密钥对或null\n */\nexport function getStorageKeyPair(): RSAKeyPair | null {\n return globalKeyPair;\n}\n\n/**\n * 加密存储值\n * @param value - 要加密的值\n * @param publicKey - RSA公钥\n * @returns Promise<string> 加密后的Base64字符串\n */\nasync function encryptValue(value: string, publicKey: CryptoKey): Promise<string> {\n return rsaEncrypt(value, publicKey);\n}\n\n/**\n * 解密存储值\n * @param encryptedValue - 加密后的Base64字符串\n * @param privateKey - RSA私钥\n * @returns Promise<string> 解密后的字符串\n */\nasync function decryptValue(encryptedValue: string, privateKey: CryptoKey): Promise<string> {\n try {\n return await rsaDecrypt(encryptedValue, privateKey);\n } catch {\n // 如果解密失败,可能是旧数据(未加密)或格式错误\n // 尝试直接解析 JSON(向后兼容)\n try {\n JSON.parse(encryptedValue);\n return encryptedValue; // 如果是有效的 JSON,返回原值\n } catch {\n throw new Error('Failed to decrypt storage value');\n }\n }\n}\n\n/**\n * localStorage封装(支持过期时间和RSA加密)\n */\nexport const localStorage = {\n /**\n * 设置值\n * @param key - 键\n * @param value - 值\n * @param options - 选项(过期时间、密钥等)\n * @returns Promise<void>\n */\n async set<T>(\n key: string,\n value: T,\n options: {\n expiry?: number;\n publicKey?: CryptoKey;\n } = {}\n ): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n throw new Error('localStorage is not available');\n }\n\n const { expiry, publicKey } = options;\n const item: StorageItem<T> = {\n value,\n expiry: expiry ? Date.now() + expiry : undefined,\n };\n\n try {\n const jsonStr = JSON.stringify(item);\n\n // 如果提供了公钥或全局密钥对存在,使用RSA加密\n const keyToUse = publicKey || globalKeyPair?.publicKey;\n if (keyToUse) {\n const encrypted = await encryptValue(jsonStr, keyToUse);\n window.localStorage.setItem(key, encrypted);\n } else {\n // 如果没有密钥,使用Base64编码(向后兼容)\n const { base64Encode } = await import('../helper/crypto');\n const encoded = base64Encode(jsonStr);\n window.localStorage.setItem(key, encoded);\n }\n } catch (error) {\n console.error('localStorage.set error:', error);\n throw error;\n }\n },\n\n /**\n * 获取值\n * @param key - 键\n * @param options - 选项(默认值、私钥等)\n * @returns Promise<T | undefined> 值或默认值\n */\n async get<T>(\n key: string,\n options: {\n defaultValue?: T;\n privateKey?: CryptoKey;\n } = {}\n ): Promise<T | undefined> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return options.defaultValue;\n }\n\n const { defaultValue, privateKey } = options;\n\n try {\n const encryptedStr = window.localStorage.getItem(key);\n if (!encryptedStr) return defaultValue;\n\n let decryptedStr: string;\n\n // 如果提供了私钥或全局密钥对存在,使用RSA解密\n const keyToUse = privateKey || globalKeyPair?.privateKey;\n if (keyToUse) {\n try {\n decryptedStr = await decryptValue(encryptedStr, keyToUse);\n } catch {\n // RSA解密失败,尝试Base64解码(向后兼容)\n const { base64Decode } = await import('../helper/crypto');\n try {\n decryptedStr = base64Decode(encryptedStr);\n } catch {\n return defaultValue;\n }\n }\n } else {\n // 如果没有密钥,尝试Base64解码\n const { base64Decode } = await import('../helper/crypto');\n try {\n decryptedStr = base64Decode(encryptedStr);\n } catch {\n return defaultValue;\n }\n }\n\n const item: StorageItem<T> = JSON.parse(decryptedStr);\n\n // 检查是否过期\n if (item.expiry && Date.now() > item.expiry) {\n window.localStorage.removeItem(key);\n return defaultValue;\n }\n\n return item.value;\n } catch {\n return defaultValue;\n }\n },\n\n /**\n * 移除值\n * @param key - 键\n */\n remove(key: string): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n try {\n window.localStorage.removeItem(key);\n } catch (error) {\n console.error('localStorage.remove error:', error);\n }\n },\n\n /**\n * 清空所有值\n */\n clear(): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n try {\n window.localStorage.clear();\n } catch (error) {\n console.error('localStorage.clear error:', error);\n }\n },\n\n /**\n * 获取所有键\n * @returns 键数组\n */\n keys(): string[] {\n if (typeof window === 'undefined' || !window.localStorage) return [];\n const keys: string[] = [];\n try {\n for (let i = 0; i < window.localStorage.length; i++) {\n const key = window.localStorage.key(i);\n if (key) keys.push(key);\n }\n } catch (error) {\n console.error('localStorage.keys error:', error);\n }\n return keys;\n },\n};\n\n/**\n * sessionStorage封装(支持RSA加密)\n */\nexport const sessionStorage = {\n /**\n * 设置值\n * @param key - 键\n * @param value - 值\n * @param options - 选项(公钥等)\n * @returns Promise<void>\n */\n async set<T>(\n key: string,\n value: T,\n options: {\n publicKey?: CryptoKey;\n } = {}\n ): Promise<void> {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n throw new Error('sessionStorage is not available');\n }\n\n const { publicKey } = options;\n\n try {\n const jsonStr = JSON.stringify(value);\n\n // 如果提供了公钥或全局密钥对存在,使用RSA加密\n const keyToUse = publicKey || globalKeyPair?.publicKey;\n if (keyToUse) {\n const encrypted = await encryptValue(jsonStr, keyToUse);\n window.sessionStorage.setItem(key, encrypted);\n } else {\n // 如果没有密钥,使用Base64编码(向后兼容)\n const { base64Encode } = await import('../helper/crypto');\n const encoded = base64Encode(jsonStr);\n window.sessionStorage.setItem(key, encoded);\n }\n } catch (error) {\n console.error('sessionStorage.set error:', error);\n throw error;\n }\n },\n\n /**\n * 获取值\n * @param key - 键\n * @param options - 选项(默认值、私钥等)\n * @returns Promise<T | undefined> 值或默认值\n */\n async get<T>(\n key: string,\n options: {\n defaultValue?: T;\n privateKey?: CryptoKey;\n } = {}\n ): Promise<T | undefined> {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return options.defaultValue;\n }\n\n const { defaultValue, privateKey } = options;\n\n try {\n const encryptedStr = window.sessionStorage.getItem(key);\n if (!encryptedStr) return defaultValue;\n\n let decryptedStr: string;\n\n // 如果提供了私钥或全局密钥对存在,使用RSA解密\n const keyToUse = privateKey || globalKeyPair?.privateKey;\n if (keyToUse) {\n try {\n decryptedStr = await decryptValue(encryptedStr, keyToUse);\n } catch {\n // RSA解密失败,尝试Base64解码(向后兼容)\n const { base64Decode } = await import('../helper/crypto');\n try {\n decryptedStr = base64Decode(encryptedStr);\n } catch {\n return defaultValue;\n }\n }\n } else {\n // 如果没有密钥,尝试Base64解码\n const { base64Decode } = await import('../helper/crypto');\n try {\n decryptedStr = base64Decode(encryptedStr);\n } catch {\n return defaultValue;\n }\n }\n\n return JSON.parse(decryptedStr) as T;\n } catch {\n return defaultValue;\n }\n },\n\n /**\n * 移除值\n * @param key - 键\n */\n remove(key: string): void {\n if (typeof window === 'undefined' || !window.sessionStorage) return;\n try {\n window.sessionStorage.removeItem(key);\n } catch (error) {\n console.error('sessionStorage.remove error:', error);\n }\n },\n\n /**\n * 清空所有值\n */\n clear(): void {\n if (typeof window === 'undefined' || !window.sessionStorage) return;\n try {\n window.sessionStorage.clear();\n } catch (error) {\n console.error('sessionStorage.clear error:', error);\n }\n },\n};\n\n/**\n * Cookie操作封装\n */\nexport const cookie = {\n /**\n * 设置Cookie\n * @param key - 键\n * @param value - 值\n * @param options - Cookie选项\n */\n set(\n key: string,\n value: string,\n options: {\n expires?: number | Date; // 过期时间(天数或Date对象)\n path?: string;\n domain?: string;\n secure?: boolean;\n sameSite?: 'strict' | 'lax' | 'none';\n } = {}\n ): void {\n if (typeof document === 'undefined') {\n throw new Error('document is not available');\n }\n\n let cookieStr = `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n\n if (options.expires) {\n const expiresDate =\n options.expires instanceof Date\n ? options.expires\n : new Date(Date.now() + options.expires * 24 * 60 * 60 * 1000);\n cookieStr += `; expires=${expiresDate.toUTCString()}`;\n }\n\n if (options.path) cookieStr += `; path=${options.path}`;\n if (options.domain) cookieStr += `; domain=${options.domain}`;\n if (options.secure) cookieStr += '; secure';\n if (options.sameSite) cookieStr += `; sameSite=${options.sameSite}`;\n\n document.cookie = cookieStr;\n },\n\n /**\n * 获取Cookie\n * @param key - 键\n * @returns Cookie值\n */\n get(key: string): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n const name = encodeURIComponent(key);\n const cookies = document.cookie.split(';');\n\n for (const cookie of cookies) {\n const [cookieKey, cookieValue] = cookie.trim().split('=');\n if (cookieKey === name) {\n return decodeURIComponent(cookieValue);\n }\n }\n\n return undefined;\n },\n\n /**\n * 移除Cookie\n * @param key - 键\n * @param options - Cookie选项\n */\n remove(key: string, options: { path?: string; domain?: string } = {}): void {\n cookie.set(key, '', {\n ...options,\n expires: new Date(0),\n });\n },\n\n /**\n * 获取所有Cookie\n * @returns Cookie对象\n */\n getAll(): Record<string, string> {\n if (typeof document === 'undefined') return {};\n\n const cookies: Record<string, string> = {};\n document.cookie.split(';').forEach(cookieStr => {\n const [key, value] = cookieStr.trim().split('=');\n if (key && value) {\n cookies[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n });\n\n return cookies;\n },\n};\n\n/**\n * 统一存储接口(自动选择存储方式,支持RSA加密)\n */\nexport const storage = {\n /**\n * 设置值(优先使用localStorage,失败则使用sessionStorage)\n * @param key - 键\n * @param value - 值\n * @param options - 选项(过期时间、公钥等)\n * @returns Promise<void>\n */\n async set<T>(\n key: string,\n value: T,\n options: {\n expiry?: number;\n publicKey?: CryptoKey;\n } = {}\n ): Promise<void> {\n try {\n await localStorage.set(key, value, options);\n } catch {\n try {\n await sessionStorage.set(key, value, { publicKey: options.publicKey });\n } catch {\n console.warn('Both localStorage and sessionStorage are not available');\n }\n }\n },\n\n /**\n * 获取值\n * @param key - 键\n * @param options - 选项(默认值、私钥等)\n * @returns Promise<T | undefined> 值或默认值\n */\n async get<T>(\n key: string,\n options: {\n defaultValue?: T;\n privateKey?: CryptoKey;\n } = {}\n ): Promise<T | undefined> {\n const localValue = await localStorage.get<T>(key, options);\n if (localValue !== undefined) return localValue;\n\n const sessionValue = await sessionStorage.get<T>(key, options);\n return sessionValue !== undefined ? sessionValue : options.defaultValue;\n },\n\n /**\n * 移除值\n * @param key - 键\n */\n remove(key: string): void {\n localStorage.remove(key);\n sessionStorage.remove(key);\n },\n\n /**\n * 清空所有值\n */\n clear(): void {\n localStorage.clear();\n sessionStorage.clear();\n },\n};\n"]}