@openlv/core 0.0.1-beta.5 → 0.0.1-beta.7

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.
@@ -37,7 +37,6 @@ export class BaseError extends Error {
37
37
  ...(details ? [`Details: ${details}`] : []),
38
38
  ...(errorConfig.version ? [`Version: ${errorConfig.version}`] : []),
39
39
  ].join("\n");
40
- // @ts-expect-error - cause is not supported in the constructor
41
40
  super(message, args.cause ? { cause: args.cause } : undefined);
42
41
  Object.defineProperty(this, "details", {
43
42
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/errors/base.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,qBAAqB,CAAC;AAOtC,IAAI,WAAW,GAAgB;IAC7B,iBAAiB;IACjB,mBAAmB;IACnB,qBAAqB;IACrB,gBAAgB;IAChB,6BAA6B;IAC7B,eAAe;IACf,4FAA4F;IAC5F,aAAa;IACb,uBAAuB;IACvB,OAAO;CACR,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,WAAW,GAAG,MAAM,CAAC;AACvB,CAAC;AAaD,MAAM,OAAO,SAAU,SAAQ,KAAK;IASlC,YAAY,YAAoB,EAAE,OAA4B,EAAE;QAC9D,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE;YACpB,IAAI,IAAI,CAAC,KAAK,YAAY,SAAS;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAE/D,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAEnD,OAAO,IAAI,CAAC,OAAQ,CAAC;QACvB,CAAC,CAAC,EAAE,CAAC;QACL,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE;YACrB,IAAI,IAAI,CAAC,KAAK,YAAY,SAAS;gBACjC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;YAE9C,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC,CAAC,EAAE,CAAC;QACL,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEhE,MAAM,OAAO,GAAG;YACd,YAAY,IAAI,oBAAoB;YACpC,EAAE;YACF,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,+DAA+D;QAC/D,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAlCjE;;;;;WAAgB;QAChB;;;;;WAA8B;QAC9B;;;;;WAAoC;QACpC;;;;;WAAqB;QACrB;;;;;WAAgB;QAEP;;;;mBAAO,WAAW;WAAC;QA8B1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAID,IAAI,CAAC,EAAQ;QACX,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxB,CAAC;CACF;AAED,SAAS,IAAI,CACX,GAAY,EACZ,EAA4C;IAE5C,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAE1B,IACE,GAAG;QACH,OAAO,GAAG,KAAK,QAAQ;QACvB,OAAO,IAAI,GAAG;QACd,GAAG,CAAC,KAAK,KAAK,SAAS;QAEvB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE7B,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/errors/base.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /** biome-ignore-all lint/performance/noReExportAll: package entrypoint */
2
2
  /** biome-ignore-all lint/performance/noBarrelFile: package entrypoint */
3
+ export * from "./make.js";
3
4
  export * from "./messages/index.js";
4
5
  export * from "./session.js";
5
6
  export * from "./settings.js";
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /** biome-ignore-all lint/performance/noReExportAll: package entrypoint */
2
2
  /** biome-ignore-all lint/performance/noBarrelFile: package entrypoint */
3
+ export * from "./make.js";
3
4
  export * from "./messages/index.js";
4
5
  export * from "./session.js";
5
6
  export * from "./settings.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
package/dist/make.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
2
+ type Merge<T extends readonly object[]> = UnionToIntersection<T[number]>;
3
+ type EnsureAssignable<Have, Want> = Have extends Want ? unknown : never;
4
+ export declare function combine<Target extends object, Parts extends readonly object[]>(...parts: Parts): EnsureAssignable<Merge<Parts>, Target> extends unknown ? Target : never;
5
+ export declare const make: <M extends object, O extends object>(e: M, o: O) => M & O;
6
+ export {};
package/dist/make.js ADDED
@@ -0,0 +1,8 @@
1
+ export function combine(...parts) {
2
+ // runtime: left-to-right shallow assign
3
+ return Object.assign({}, ...parts);
4
+ }
5
+ export const make = (e, o) => {
6
+ return Object.assign(e, o);
7
+ };
8
+ //# sourceMappingURL=make.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make.js","sourceRoot":"","sources":["../src/make.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,OAAO,CACrB,GAAG,KAAY;IAEf,wCAAwC;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAQ,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAqC,CAAI,EAAE,CAAI,EAAE,EAAE;IACrE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAU,CAAC;AACtC,CAAC,CAAC"}
@@ -1,15 +1,2 @@
1
- import type { EventEmitter } from "eventemitter3";
2
1
  import type { SessionCreationParameters } from "./session.js";
3
2
  export type SignalingSettings = SessionCreationParameters;
4
- export type ConnectorSettings = {
5
- retainHistory: boolean;
6
- autoReconnect: boolean;
7
- session: SignalingSettings;
8
- };
9
- export type ConnectorStorage = {
10
- emitter: EventEmitter<{
11
- settings_change: (settings: ConnectorSettings) => void;
12
- }>;
13
- getSettings: () => ConnectorSettings;
14
- setSettings: (settings: ConnectorSettings) => void;
15
- };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openlv/core",
3
- "version": "0.0.1-beta.5",
3
+ "version": "0.0.1-beta.7",
4
4
  "keywords": [
5
5
  "open-lavatory"
6
6
  ],
@@ -1,88 +0,0 @@
1
- /**
2
- * Encryption utilities for Open Lavatory Protocol
3
- * Implements ECDH key exchange with P-256 curve and ECIES encryption
4
- */
5
- /** biome-ignore-all lint/suspicious/noConsole: temp */
6
- /** biome-ignore-all lint/complexity/noStaticOnlyClass: temp */
7
- export declare class EncryptionUtils {
8
- /**
9
- * URL-safe alphabet for session ID generation
10
- */
11
- private static readonly URL_SAFE_ALPHABET;
12
- /**
13
- * Generate a cryptographically secure URL-safe random string
14
- */
15
- static generateUrlSafeRandomString(length: number): string;
16
- /**
17
- * Generate a 16-character URL-safe session ID
18
- */
19
- static generateSessionId(): string;
20
- /**
21
- * Generate a 32-byte random shared key and return as hex
22
- */
23
- static generateSharedKey(): string;
24
- /**
25
- * Convert hex string to Uint8Array
26
- */
27
- static hexToBytes(hex: string): Uint8Array;
28
- /**
29
- * Convert Uint8Array to hex string
30
- */
31
- static bytesToHex(bytes: Uint8Array): string;
32
- /**
33
- * Generate an ECDH keypair using P-256 curve
34
- */
35
- static generateKeyPair(): Promise<{
36
- privateKey: CryptoKey;
37
- publicKey: CryptoKey;
38
- }>;
39
- /**
40
- * Export public key to raw format (65 bytes uncompressed)
41
- */
42
- static exportPublicKey(publicKey: CryptoKey): Promise<ArrayBuffer>;
43
- /**
44
- * Import public key from raw format
45
- */
46
- static importPublicKey(keyData: ArrayBuffer): Promise<CryptoKey>;
47
- /**
48
- * Compute SHA-256 hash of public key and return first 8 bytes as hex
49
- */
50
- static computePublicKeyHash(publicKey: CryptoKey): Promise<string>;
51
- /**
52
- * Compute SHA-256 hash of raw public key data
53
- */
54
- static computePublicKeyHashFromRaw(publicKeyData: Uint8Array): Promise<string>;
55
- /**
56
- * Derive shared AES-GCM key from ECDH key exchange
57
- */
58
- static deriveSharedKey(privateKey: CryptoKey, peerPublicKey: CryptoKey): Promise<CryptoKey>;
59
- /**
60
- * Encrypt message using ECIES scheme
61
- * Format: ephemeral_pubkey || iv || encrypted_data || auth_tag
62
- */
63
- static encryptMessage(message: any, recipientPublicKey: CryptoKey, senderPrivateKey: CryptoKey, senderPublicKey: CryptoKey): Promise<string>;
64
- /**
65
- * Decrypt message using ECIES scheme
66
- */
67
- static decryptMessage(encryptedMessage: string, recipientPrivateKey: CryptoKey): Promise<any>;
68
- /**
69
- * Convert public key to base64 string for transmission
70
- */
71
- static publicKeyToBase64(publicKey: CryptoKey): Promise<string>;
72
- /**
73
- * Convert base64 string back to public key
74
- */
75
- static publicKeyFromBase64(base64Key: string): Promise<CryptoKey>;
76
- /**
77
- * Derive symmetric key from hex-encoded shared secret (for initial handshake)
78
- */
79
- static deriveSymmetricKey(sharedSecretHex: string): Promise<CryptoKey>;
80
- /**
81
- * Encrypt message using symmetric key (for initial handshake)
82
- */
83
- static encryptSymmetric(message: any, sharedKey: CryptoKey): Promise<string>;
84
- /**
85
- * Decrypt message using symmetric key (for initial handshake)
86
- */
87
- static decryptSymmetric(encryptedMessage: string, sharedKey: CryptoKey): Promise<any>;
88
- }
@@ -1,245 +0,0 @@
1
- /**
2
- * Encryption utilities for Open Lavatory Protocol
3
- * Implements ECDH key exchange with P-256 curve and ECIES encryption
4
- */
5
- /** biome-ignore-all lint/suspicious/noConsole: temp */
6
- /** biome-ignore-all lint/complexity/noStaticOnlyClass: temp */
7
- export class EncryptionUtils {
8
- /**
9
- * Generate a cryptographically secure URL-safe random string
10
- */
11
- static generateUrlSafeRandomString(length) {
12
- const array = new Uint8Array(length);
13
- crypto.getRandomValues(array);
14
- return Array.from(array)
15
- .map((byte) => EncryptionUtils.URL_SAFE_ALPHABET[byte % EncryptionUtils.URL_SAFE_ALPHABET.length])
16
- .join("");
17
- }
18
- /**
19
- * Generate a 16-character URL-safe session ID
20
- */
21
- static generateSessionId() {
22
- return EncryptionUtils.generateUrlSafeRandomString(16);
23
- }
24
- /**
25
- * Generate a 32-byte random shared key and return as hex
26
- */
27
- static generateSharedKey() {
28
- const array = new Uint8Array(32);
29
- crypto.getRandomValues(array);
30
- return Array.from(array)
31
- .map((b) => b.toString(16).padStart(2, "0"))
32
- .join("");
33
- }
34
- /**
35
- * Convert hex string to Uint8Array
36
- */
37
- static hexToBytes(hex) {
38
- if (hex.length % 2 !== 0) {
39
- throw new Error("Hex string must have even length");
40
- }
41
- const array = new Uint8Array(hex.length / 2);
42
- for (let i = 0; i < hex.length; i += 2) {
43
- array[i / 2] = parseInt(hex.substr(i, 2), 16);
44
- }
45
- return array;
46
- }
47
- /**
48
- * Convert Uint8Array to hex string
49
- */
50
- static bytesToHex(bytes) {
51
- return Array.from(bytes)
52
- .map((b) => b.toString(16).padStart(2, "0"))
53
- .join("");
54
- }
55
- /**
56
- * Generate an ECDH keypair using P-256 curve
57
- */
58
- static async generateKeyPair() {
59
- return await crypto.subtle.generateKey({
60
- name: "ECDH",
61
- namedCurve: "P-256",
62
- }, true, ["deriveKey"]);
63
- }
64
- /**
65
- * Export public key to raw format (65 bytes uncompressed)
66
- */
67
- static async exportPublicKey(publicKey) {
68
- return await crypto.subtle.exportKey("raw", publicKey);
69
- }
70
- /**
71
- * Import public key from raw format
72
- */
73
- static async importPublicKey(keyData) {
74
- return await crypto.subtle.importKey("raw", keyData, {
75
- name: "ECDH",
76
- namedCurve: "P-256",
77
- }, false, []);
78
- }
79
- /**
80
- * Compute SHA-256 hash of public key and return first 8 bytes as hex
81
- */
82
- static async computePublicKeyHash(publicKey) {
83
- const exportedKey = await EncryptionUtils.exportPublicKey(publicKey);
84
- const hashBuffer = await crypto.subtle.digest("SHA-256", exportedKey);
85
- const hashArray = new Uint8Array(hashBuffer);
86
- const shortHash = hashArray.slice(0, 8); // First 8 bytes
87
- return Array.from(shortHash)
88
- .map((b) => b.toString(16).padStart(2, "0"))
89
- .join("");
90
- }
91
- /**
92
- * Compute SHA-256 hash of raw public key data
93
- */
94
- static async computePublicKeyHashFromRaw(publicKeyData) {
95
- // @ts-expect-error
96
- const hashBuffer = await crypto.subtle.digest("SHA-256", publicKeyData);
97
- const hashArray = new Uint8Array(hashBuffer);
98
- const shortHash = hashArray.slice(0, 8); // First 8 bytes
99
- return Array.from(shortHash)
100
- .map((b) => b.toString(16).padStart(2, "0"))
101
- .join("");
102
- }
103
- /**
104
- * Derive shared AES-GCM key from ECDH key exchange
105
- */
106
- static async deriveSharedKey(privateKey, peerPublicKey) {
107
- const sharedSecret = await crypto.subtle.deriveKey({
108
- name: "ECDH",
109
- public: peerPublicKey,
110
- }, privateKey, {
111
- name: "AES-GCM",
112
- length: 256,
113
- }, false, ["encrypt", "decrypt"]);
114
- return sharedSecret;
115
- }
116
- /**
117
- * Encrypt message using ECIES scheme
118
- * Format: ephemeral_pubkey || iv || encrypted_data || auth_tag
119
- */
120
- static async encryptMessage(message, recipientPublicKey, senderPrivateKey, senderPublicKey) {
121
- const sharedKey = await EncryptionUtils.deriveSharedKey(senderPrivateKey, recipientPublicKey);
122
- const encoder = new TextEncoder();
123
- const data = encoder.encode(JSON.stringify(message));
124
- const iv = crypto.getRandomValues(new Uint8Array(12));
125
- const encrypted = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, sharedKey, data);
126
- // Get ephemeral public key for ECIES
127
- const ephemeralPublicKey = await EncryptionUtils.exportPublicKey(senderPublicKey);
128
- // Combine ephemeral public key, IV and encrypted data
129
- const combined = new Uint8Array(ephemeralPublicKey.byteLength + iv.length + encrypted.byteLength);
130
- combined.set(new Uint8Array(ephemeralPublicKey));
131
- combined.set(iv, ephemeralPublicKey.byteLength);
132
- combined.set(new Uint8Array(encrypted), ephemeralPublicKey.byteLength + iv.length);
133
- // Return as base64
134
- return btoa(String.fromCharCode.apply(null, Array.from(combined)));
135
- }
136
- /**
137
- * Decrypt message using ECIES scheme
138
- */
139
- static async decryptMessage(encryptedMessage, recipientPrivateKey) {
140
- try {
141
- // Decode from base64
142
- const combined = new Uint8Array(atob(encryptedMessage)
143
- .split("")
144
- .map((char) => char.charCodeAt(0)));
145
- // Extract ephemeral public key, IV and encrypted data
146
- const ephemeralPublicKey = combined.slice(0, 65); // P-256 uncompressed key is 65 bytes
147
- const iv = combined.slice(65, 77); // 12 bytes
148
- const encrypted = combined.slice(77);
149
- // Import ephemeral public key
150
- const senderPublicKey = await EncryptionUtils.importPublicKey(ephemeralPublicKey.buffer);
151
- // Derive shared key
152
- const sharedKey = await EncryptionUtils.deriveSharedKey(recipientPrivateKey, senderPublicKey);
153
- const decrypted = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, sharedKey, encrypted);
154
- const decoder = new TextDecoder();
155
- const messageStr = decoder.decode(decrypted);
156
- return JSON.parse(messageStr);
157
- }
158
- catch (error) {
159
- console.error("Failed to decrypt message:", error);
160
- throw new Error("Message decryption failed");
161
- }
162
- }
163
- /**
164
- * Convert public key to base64 string for transmission
165
- */
166
- static async publicKeyToBase64(publicKey) {
167
- const exportedKey = await EncryptionUtils.exportPublicKey(publicKey);
168
- return btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(exportedKey))));
169
- }
170
- /**
171
- * Convert base64 string back to public key
172
- */
173
- static async publicKeyFromBase64(base64Key) {
174
- const keyData = new Uint8Array(atob(base64Key)
175
- .split("")
176
- .map((char) => char.charCodeAt(0)));
177
- return await EncryptionUtils.importPublicKey(keyData.buffer);
178
- }
179
- /**
180
- * Derive symmetric key from hex-encoded shared secret (for initial handshake)
181
- */
182
- static async deriveSymmetricKey(sharedSecretHex) {
183
- const sharedSecretBytes = EncryptionUtils.hexToBytes(sharedSecretHex);
184
- // @ts-expect-error
185
- const sharedSecretBytesBufferSource = sharedSecretBytes;
186
- const keyMaterial = await crypto.subtle.importKey("raw", sharedSecretBytesBufferSource, "PBKDF2", false, ["deriveKey"]);
187
- const encoder = new TextEncoder();
188
- return await crypto.subtle.deriveKey({
189
- name: "PBKDF2",
190
- salt: encoder.encode("openlv-salt"), // Fixed salt for deterministic key
191
- iterations: 100000,
192
- hash: "SHA-256",
193
- }, keyMaterial, {
194
- name: "AES-GCM",
195
- length: 256,
196
- }, false, ["encrypt", "decrypt"]);
197
- }
198
- /**
199
- * Encrypt message using symmetric key (for initial handshake)
200
- */
201
- static async encryptSymmetric(message, sharedKey) {
202
- const encoder = new TextEncoder();
203
- const data = encoder.encode(JSON.stringify(message));
204
- const iv = crypto.getRandomValues(new Uint8Array(12));
205
- const encrypted = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, sharedKey, data);
206
- // Combine IV and encrypted data
207
- const combined = new Uint8Array(iv.length + encrypted.byteLength);
208
- combined.set(iv);
209
- combined.set(new Uint8Array(encrypted), iv.length);
210
- // Return as base64
211
- return btoa(String.fromCharCode.apply(null, Array.from(combined)));
212
- }
213
- /**
214
- * Decrypt message using symmetric key (for initial handshake)
215
- */
216
- static async decryptSymmetric(encryptedMessage, sharedKey) {
217
- try {
218
- // Decode from base64
219
- const combined = new Uint8Array(atob(encryptedMessage)
220
- .split("")
221
- .map((char) => char.charCodeAt(0)));
222
- // Extract IV and encrypted data
223
- const iv = combined.slice(0, 12); // 12 bytes
224
- const encrypted = combined.slice(12);
225
- const decrypted = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, sharedKey, encrypted);
226
- const decoder = new TextDecoder();
227
- const messageStr = decoder.decode(decrypted);
228
- return JSON.parse(messageStr);
229
- }
230
- catch (error) {
231
- console.error("Failed to decrypt symmetric message:", error);
232
- throw new Error("Symmetric message decryption failed");
233
- }
234
- }
235
- }
236
- /**
237
- * URL-safe alphabet for session ID generation
238
- */
239
- Object.defineProperty(EncryptionUtils, "URL_SAFE_ALPHABET", {
240
- enumerable: true,
241
- configurable: true,
242
- writable: true,
243
- value: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
244
- });
245
- //# sourceMappingURL=encryption.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/utils/encryption.ts"],"names":[],"mappings":"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"}