@ddunigma/node 3.0.3 → 4.0.1

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.
@@ -9,6 +9,15 @@ declare enum DduSetSymbol {
9
9
  DDU_V1 = "ddu_v1",
10
10
  ONECHARSET = "oneCharSet"
11
11
  }
12
+ type DduTextEncoding = "utf-8" | "utf8" | "latin1" | "ascii" | "base64" | "base64url" | "hex" | "binary" | "ucs2" | "ucs-2" | "utf16le" | "utf-16le";
13
+ interface EncodingProfile {
14
+ /** 논리 심볼당 비트 수 */
15
+ bitLength: number;
16
+ /** 2의 제곱수 charset 직접 인덱스 모드 여부 */
17
+ usePowerOfTwo: boolean;
18
+ /** 반복 패딩 시 패딩 문자 1개가 나타내는 비트 수 */
19
+ bitsPerPadChar?: number;
20
+ }
12
21
  interface CharSetConfig {
13
22
  /** charset 식별 심볼 */
14
23
  symbol: DduSetSymbol;
@@ -24,6 +33,12 @@ interface CharSetConfig {
24
33
  paddingChar: string;
25
34
  /** 패딩 문자 반복 방식 사용 여부 */
26
35
  useRepeatPadding?: boolean;
36
+ /** 반복 패딩 시 패딩 문자 1개가 나타내는 비트 수 (기본값: 2) */
37
+ bitsPerPadChar?: number;
38
+ /** 2의 제곱수 모드 강제 여부 (false로 설정하면 인덱스 쌍 출력 모드 사용) */
39
+ usePowerOfTwo?: boolean;
40
+ /** 프리셋별 인코딩 프로필. 레거시 와이어 호환성을 고정할 때 사용 */
41
+ encodingProfile?: EncodingProfile;
27
42
  }
28
43
  interface CharSetInfo {
29
44
  /** 인코딩에 사용할 문자 배열 */
@@ -35,7 +50,7 @@ interface CharSetInfo {
35
50
  /** 2의 제곱수 charset 여부 */
36
51
  usePowerOfTwo: boolean;
37
52
  /** 문자열 인코딩 방식 */
38
- encoding: BufferEncoding;
53
+ encoding: DduTextEncoding;
39
54
  /** 기본 압축 사용 여부 */
40
55
  defaultCompress: boolean;
41
56
  /** 기본 최대 디코딩 바이트 수 */
@@ -87,11 +102,22 @@ interface DduEncodeStats {
87
102
  }
88
103
  type KeyDerivationAlgorithm = "sha256" | "pbkdf2";
89
104
  interface KeyDerivationOptions {
90
- /** Key derivation algorithm. `sha256` preserves legacy compatibility. */
105
+ /**
106
+ * Key derivation algorithm. Defaults to `sha256` for legacy compatibility.
107
+ *
108
+ * ⚠️ Security: the default `sha256` is a single, unsalted hash and is fast to
109
+ * brute-force. For low-entropy keys (human passwords) protecting production
110
+ * data, use `pbkdf2` with an application-specific `salt`. Keep `sha256` only
111
+ * for high-entropy keys (e.g. 32 random bytes) or legacy data compatibility.
112
+ */
91
113
  algorithm?: KeyDerivationAlgorithm;
92
- /** Salt for PBKDF2. Provide a stable value to decode across instances. */
114
+ /**
115
+ * Salt for PBKDF2. Provide a stable, application-specific value to decode
116
+ * across instances. If omitted, a fixed default salt is used (weaker — set
117
+ * your own when security matters).
118
+ */
93
119
  salt?: string | Uint8Array;
94
- /** PBKDF2 iteration count. Values below 10000 are clamped unless throwOnError is enabled. */
120
+ /** PBKDF2 iteration count. Positive values below 10000 are clamped to 10000. */
95
121
  iterations?: number;
96
122
  /** Hash function used by PBKDF2. */
97
123
  hash?: "SHA-256" | "SHA-384" | "SHA-512";
@@ -99,8 +125,6 @@ interface KeyDerivationOptions {
99
125
  interface DduOptions {
100
126
  /** 압축 사용 여부 (zlib deflate 또는 brotli) */
101
127
  compress?: boolean;
102
- /** decode stream에서 footer 기반 자동 감지 사용 여부 (기본값: true) */
103
- streamAutoDetect?: boolean;
104
128
  /** 내부 암/복호화 사용 여부 (기본값: true, 스트림 파이프라인 내부 제어용) */
105
129
  encrypt?: boolean;
106
130
  /** 압축 알고리즘 (기본값: "deflate") */
@@ -135,24 +159,13 @@ interface DduConstructorOptions extends DduOptions {
135
159
  paddingChar?: string;
136
160
  /** 필요 문자 수 */
137
161
  requiredLength?: number;
138
- /** 비트 길이 */
139
- bitLength?: number;
140
162
  /** 2의 제곱수 강제 여부 */
141
163
  usePowerOfTwo?: boolean;
142
164
  /**
143
165
  * true이면 초기화 오류 시 throw합니다. false이면 fallback charset으로 대체합니다.
144
166
  * @default false
145
- * @deprecated throwOnError를 사용하세요. 이 옵션은 하위 호환성을 위해 유지됩니다.
146
- */
147
- useBuildErrorReturn?: boolean;
148
- /**
149
- * true이면 초기화 오류 시 throw합니다. false이면 fallback charset으로 대체합니다.
150
- * useBuildErrorReturn과 동일한 동작이며, 둘 다 지정 시 throwOnError가 우선합니다.
151
- * @default false
152
167
  */
153
168
  throwOnError?: boolean;
154
- /** Buffer 인코딩 방식 */
155
- encoding?: BufferEncoding;
156
169
  /** URL-Safe 모드 (특수문자를 URL 안전 문자로 변환) */
157
170
  urlSafe?: boolean;
158
171
  /** 암호화 키 (AES-256-GCM) */
@@ -163,9 +176,7 @@ interface DduConstructorOptions extends DduOptions {
163
176
  useRepeatPadding?: boolean;
164
177
  /** 명시적 플랫폼 어댑터 (자동 감지 대신 사용) */
165
178
  adapter?: PlatformAdapter;
166
- /** 한글 난독화 활성화 (encryptionKey 필요) */
167
- obfuscate?: boolean;
168
- /** WASM 임계값 (바이트 단위, 기본값: 4096, 범위: 1024-1048576) */
179
+ /** WASM 임계값 (바이트 단위, 기본값: 4096, 범위: 1024-1048576, Infinity면 비활성화) */
169
180
  wasmThreshold?: number;
170
181
  }
171
182
  /**
@@ -181,13 +192,13 @@ interface PlatformAdapter {
181
192
  /** 동기적으로 256비트 키를 파생 (Node.js 전용) */
182
193
  deriveKeySync?(key: string, options?: KeyDerivationOptions): Uint8Array;
183
194
  /** AES-256-GCM으로 데이터를 암호화. IV(12) + authTag(16) + 암호문을 반환 */
184
- encrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
195
+ encrypt(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
185
196
  /** 동기적으로 데이터를 암호화 (Node.js 전용) */
186
- encryptSync?(data: Uint8Array, keyHash: Uint8Array): Uint8Array;
197
+ encryptSync?(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Uint8Array;
187
198
  /** AES-256-GCM 페이로드를 복호화. IV(12) + authTag(16) + 암호문 형식을 기대 */
188
- decrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
199
+ decrypt(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
189
200
  /** 동기적으로 데이터를 복호화 (Node.js 전용) */
190
- decryptSync?(data: Uint8Array, keyHash: Uint8Array): Uint8Array;
201
+ decryptSync?(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Uint8Array;
191
202
  /** 암호학적으로 안전한 랜덤 바이트를 생성 */
192
203
  randomBytes(length: number): Uint8Array;
193
204
  /** deflate 알고리즘으로 데이터를 압축 */
@@ -230,38 +241,6 @@ interface WasmCodec {
230
241
  /** WASM 모듈이 초기화되어 사용 가능한지 확인 */
231
242
  readonly ready: boolean;
232
243
  }
233
- /**
234
- * 인코딩/디코딩 연산을 위해 워커 스레드에 전달되는 설정.
235
- */
236
- interface EncoderConfig {
237
- charSet: string[];
238
- paddingChar: string;
239
- bitLength: number;
240
- usePowerOfTwo: boolean;
241
- compress?: boolean;
242
- compressionAlgorithm?: "deflate" | "brotli";
243
- compressionLevel?: number;
244
- encrypt?: boolean;
245
- encryptionKeyHash?: Uint8Array;
246
- checksum?: boolean;
247
- urlSafe?: boolean;
248
- chunkSize?: number;
249
- chunkSeparator?: string;
250
- useRepeatPadding?: boolean;
251
- }
252
- /**
253
- * 대용량 페이로드의 인코딩/디코딩 연산을 오프로드하는 워커 스레드 풀 인터페이스.
254
- */
255
- interface WorkerPool {
256
- /** 워커 스레드를 사용하여 인코딩 */
257
- encode(input: Uint8Array, config: EncoderConfig): Promise<string>;
258
- /** 워커 스레드를 사용하여 디코딩 */
259
- decode(input: string, config: EncoderConfig): Promise<Uint8Array>;
260
- /** 풀의 워커 스레드 수를 설정 (1-64) */
261
- setPoolSize(n: number): void;
262
- /** 모든 워커 스레드를 종료하고 리소스를 정리 */
263
- terminate(): Promise<void>;
264
- }
265
244
  /**
266
245
  * 한글 음절 난독화 레이어 인터페이스.
267
246
  * 암호화된 출력을 자연스러운 한국어 음절 블록으로 변환합니다.
@@ -342,16 +321,16 @@ interface TestVector {
342
321
  declare class Ddu64Core {
343
322
  /** 인코딩에 사용되는 문자 */
344
323
  protected readonly dduChar: string[];
324
+ /** 인코딩 문자의 코드포인트 배열 (String.fromCharCode 배치 호출용) */
325
+ private readonly dduCharCodes;
345
326
  /** 패딩 문자 */
346
327
  protected readonly paddingChar: string;
347
328
  /** 비트 길이 (2의 제곱수 charset의 경우 charset 크기의 log2) */
348
329
  protected readonly bitLength: number;
349
330
  /** charset 크기가 2의 제곱수인지 여부 */
350
331
  protected readonly usePowerOfTwo: boolean;
351
- /** 인코딩에 사용되는 유효 비트 길이 */
352
- private readonly effectiveBitLength;
353
- /** 문자 → 인덱스 역방향 룩업 맵 */
354
- protected readonly dduBinaryLookup: Map<string, number>;
332
+ /** UTF-16 코드 유닛 인덱스 direct lookup (단일 BMP 심볼 전용) */
333
+ private readonly dduCharCodeLookup;
355
334
  /** 미리 정의된 charset 사용 여부 */
356
335
  private readonly isPredefinedCharSet;
357
336
  /** 기본 압축 활성화 */
@@ -380,20 +359,22 @@ declare class Ddu64Core {
380
359
  private readonly defaultCompressionAlgorithm;
381
360
  /** 반복 패딩 모드 사용 여부 */
382
361
  private readonly useRepeatPadding;
362
+ /** 반복 패딩 시 패딩 문자 1개가 나타내는 비트 수 */
363
+ private readonly bitsPerPadChar;
383
364
  /** BitPack 설정 */
384
365
  private readonly bitPackConfig;
385
366
  /** WASM 사용 임계값 */
386
367
  private readonly wasmThreshold;
387
- /** 네이티브 Base64 fast path 사용 여부 */
368
+ /** 표준 Base64 charset에서 네이티브 Base64 fast path 사용 여부 */
388
369
  private readonly canUseNativeBase64;
389
- /** 현재 charset 문자 네이티브 Base64 문자 매핑 */
390
- private readonly nativeDecodeMap;
370
+ /** 인코딩/디코딩 payload codec 공유 컨텍스트 */
371
+ private readonly payloadCodecContext;
391
372
  /** 플랫폼 어댑터 (동기용 지연 로드 또는 명시적 제공) */
392
373
  private adapter;
393
374
  /** 기본 난독화 활성화 */
394
375
  private readonly defaultObfuscate;
395
376
  /** 지연 초기화되는 난독화 레이어 */
396
- private _obfuscationLayer;
377
+ private obfuscationLayer;
397
378
  constructor(dduChar?: string[] | string | DduConstructorOptions, paddingChar?: string, dduOptions?: DduConstructorOptions);
398
379
  /**
399
380
  * 입력 데이터를 charset 인코딩 문자열로 인코딩합니다.
@@ -402,6 +383,7 @@ declare class Ddu64Core {
402
383
  * @param options - 인코딩 옵션
403
384
  * @returns 인코딩된 문자열
404
385
  * @throws 동기 암호화/압축이 필요하지만 어댑터가 지원하지 않는 경우
386
+ * @group Sync
405
387
  */
406
388
  encode(input: Uint8Array | string, options?: DduOptions): string;
407
389
  /**
@@ -410,6 +392,7 @@ declare class Ddu64Core {
410
392
  * @param input - 디코딩할 인코딩된 문자열
411
393
  * @param options - 디코딩 옵션
412
394
  * @returns 디코딩된 문자열
395
+ * @group Sync
413
396
  */
414
397
  decode(input: string, options?: DduOptions): string;
415
398
  /**
@@ -418,64 +401,68 @@ declare class Ddu64Core {
418
401
  * @param input - 디코딩할 인코딩된 문자열
419
402
  * @param options - 디코딩 옵션
420
403
  * @returns 디코딩된 바이트
404
+ * @group Sync
421
405
  */
422
406
  decodeToUint8Array(input: string, options?: DduOptions): Uint8Array;
407
+ private decodeToUint8ArrayInternal;
423
408
  /**
424
409
  * 비동기 인코딩 - 브라우저를 포함한 모든 런타임에서 동작합니다.
410
+ *
411
+ * @group Async
425
412
  */
426
413
  encodeAsync(input: Uint8Array | string, options?: DduOptions): Promise<string>;
414
+ private encodeAsyncInternal;
427
415
  /**
428
416
  * 비동기 디코딩 - 브라우저를 포함한 모든 런타임에서 동작합니다.
417
+ *
418
+ * @group Async
429
419
  */
430
420
  decodeAsync(input: string, options?: DduOptions): Promise<string>;
431
421
  /**
432
422
  * 비동기 Uint8Array 디코딩 - 브라우저를 포함한 모든 런타임에서 동작합니다.
423
+ *
424
+ * @group Async
433
425
  */
434
426
  decodeToUint8ArrayAsync(input: string, options?: DduOptions): Promise<Uint8Array>;
427
+ private decodeToUint8ArrayAsyncInternal;
435
428
  /**
436
429
  * charset 정보를 가져옵니다.
430
+ *
431
+ * @group Introspection
437
432
  */
438
433
  getCharSetInfo(): CharSetInfo;
439
434
  /**
440
435
  * 인코딩 통계를 가져옵니다.
441
- */
442
- getStats(input: Uint8Array | string, options?: DduOptions): DduEncodeStats;
443
- /**
444
- * 대용량 인코딩/디코딩 연산을 오프로드하기 위한 전역 워커 풀 크기를 설정합니다.
445
436
  *
446
- * @param n - 워커 수 (정수, 1–64)
447
- * @throws n이 정수가 아니거나 [1, 64] 범위를 벗어난 경우 에러
437
+ * @group Introspection
448
438
  */
449
- static setWorkerPoolSize(n: number): void;
439
+ getStats(input: Uint8Array | string, options?: DduOptions): DduEncodeStats;
450
440
  /**
451
441
  * 통계를 위한 메타데이터 포함 내부 인코딩.
452
442
  */
453
443
  private encodeInternal;
454
444
  /**
455
- * 인코딩 후처리: 난독화, 체크섬, URL-safe, 청킹을 적용합니다.
445
+ * 인코딩 마무리: 비트팩 인코딩 + 후처리(난독화/체크섬/URL-safe/청킹).
446
+ * 동기/비동기 인코딩에서 공유하는 순수 동기 단계입니다.
456
447
  */
457
- private applyPostEncoding;
448
+ private finalizeEncode;
458
449
  /**
459
- * BitPack + 푸터를 사용하여 바이트를 charset 문자열로 인코딩합니다.
450
+ * 인코딩 후처리: 난독화, 체크섬, URL-safe, 청킹을 적용합니다.
460
451
  */
461
- private encodeBytes;
452
+ private applyPostEncoding;
462
453
  /**
463
- * charset 문자열을 인덱스로 변환한 BitPack으로 바이트를 얻습니다.
454
+ * 디코딩 전처리: 동기/비동기 디코딩에서 공통으로 쓰는 순수 동기 단계.
455
+ * 청크 제거 → URL-safe 역변환 → 체크섬 추출 → 역난독화 → 푸터 파싱 →
456
+ * 검증(정렬/패딩/크기) → 비트팩 해제까지 수행합니다.
464
457
  */
465
- private decodeChars;
466
- private encodeBytesWithNativeBase64;
467
- private decodeCharsWithNativeBase64;
468
- private bytesToBase64;
469
- private base64ToBytes;
470
- private shouldUseWasm;
458
+ private decodePrelude;
459
+ private getPayloadCodecContext;
471
460
  private reportProgress;
472
- private requireSyncAdapter;
473
461
  private encryptSync;
474
462
  private decryptSync;
475
463
  private compressSync;
476
464
  private decompressSync;
477
- private getAdapterAsync;
478
- private getKeyHashAsync;
465
+ private getSyncGatewayContext;
479
466
  /**
480
467
  * 난독화 레이어를 가져오거나 생성합니다 (지연 초기화).
481
468
  * 알파벳에는 charset 문자, 패딩 문자, 모든 푸터 마커 문자가 포함됩니다.
@@ -487,9 +474,8 @@ declare class Ddu64Core {
487
474
  * 암호화 키 없이 난독화가 활성화되면 throw합니다.
488
475
  */
489
476
  private shouldObfuscate;
490
- private normalizeLimit;
491
- private estimateDecodedBytes;
492
- private assertEncodedInputAligned;
477
+ private assertSafeChunkSeparator;
478
+ private isLineBreakSeparator;
493
479
  }
494
480
 
495
481
  /**
@@ -625,39 +611,75 @@ declare class CharsetBuilder {
625
611
  }
626
612
 
627
613
  /**
628
- * ddunigma 비트 패킹 가속을 위한 WASM 로더 및 통합.
629
- *
630
- * 순수 JavaScript 구현과 바이트 단위로 동일한 선택적 WASM 가속
631
- * 인코딩/디코딩을 제공합니다. WASM을 사용할 수 없거나 실패하면
632
- * 조용히 JS로 폴백합니다.
633
- *
634
- * @module wasm/WasmCodec
635
- */
636
-
637
- /**
638
- * WASM 모듈을 사전 로드하고 초기화합니다.
639
- *
640
- * 첫 번째 인코딩/디코딩 연산 전에 WASM이 준비되도록 애플리케이션 초기에
641
- * 호출하세요. WASM이 초기화되면 resolve되고, 10초 내에 초기화에 실패하면
642
- * reject됩니다.
643
- *
644
- * @throws WASM 초기화가 실패하거나 타임아웃(10초)된 경우 에러
645
- */
646
- declare function preloadWasm(): Promise<void>;
647
- /**
648
- * WASM 코덱이 준비되었으면 반환하거나, 온디맨드 초기화를 시도합니다.
614
+ * ddunigma custom error hierarchy.
649
615
  *
650
- * `preloadWasm()`이 호출되지 않았으면 5초 타임아웃으로 초기화를 시도합니다.
651
- * WASM을 사용할 없으면 null을 반환합니다.
616
+ * Public encode/decode APIs wrap internal/runtime failures in these typed
617
+ * errors so callers can branch on a stable code without parsing messages.
652
618
  *
653
- * 함수는 throw하지 않음 — 실패 시 null을 반환합니다.
654
- */
655
- declare function getWasmCodec(): WasmCodec | null;
656
- /**
657
- * WASM 코덱이 이미 초기화된 경우에만 반환합니다.
658
- * 온디맨드 초기화를 트리거하지 않습니다.
659
- * WASM이 준비되지 않았으면 null을 반환합니다.
619
+ * @module core/errors
660
620
  */
661
- declare function getWasmCodecSync(): WasmCodec | null;
621
+ type Ddu64Operation = "construct" | "encode" | "decode" | "compress" | "decompress" | "encrypt" | "decrypt" | "checksum" | "charset" | "adapter" | "obfuscation" | "stream";
622
+ declare enum Ddu64ErrorCode {
623
+ EncodeFailed = "DDU64_ENCODE_FAILED",
624
+ DecodeFailed = "DDU64_DECODE_FAILED",
625
+ CompressionFailed = "DDU64_COMPRESSION_FAILED",
626
+ DecompressionFailed = "DDU64_DECOMPRESSION_FAILED",
627
+ EncryptionFailed = "DDU64_ENCRYPTION_FAILED",
628
+ DecryptionFailed = "DDU64_DECRYPTION_FAILED",
629
+ ChecksumMismatch = "DDU64_CHECKSUM_MISMATCH",
630
+ InvalidCharset = "DDU64_INVALID_CHARSET",
631
+ InvalidInput = "DDU64_INVALID_INPUT",
632
+ LimitExceeded = "DDU64_LIMIT_EXCEEDED",
633
+ AdapterUnavailable = "DDU64_ADAPTER_UNAVAILABLE",
634
+ ObfuscationFailed = "DDU64_OBFUSCATION_FAILED",
635
+ StreamFailed = "DDU64_STREAM_FAILED"
636
+ }
637
+ interface Ddu64ErrorOptions {
638
+ code: Ddu64ErrorCode;
639
+ operation: Ddu64Operation;
640
+ cause?: unknown;
641
+ }
642
+ declare class Ddu64Error extends Error {
643
+ readonly code: Ddu64ErrorCode;
644
+ readonly operation: Ddu64Operation;
645
+ constructor(message: string, options: Ddu64ErrorOptions);
646
+ }
647
+ declare class Ddu64EncodeError extends Ddu64Error {
648
+ constructor(message: string, cause?: unknown);
649
+ }
650
+ declare class Ddu64DecodeError extends Ddu64Error {
651
+ constructor(message: string, cause?: unknown);
652
+ }
653
+ declare class Ddu64CompressionError extends Ddu64Error {
654
+ constructor(message: string, cause?: unknown);
655
+ }
656
+ declare class Ddu64DecompressionError extends Ddu64Error {
657
+ constructor(message: string, cause?: unknown);
658
+ }
659
+ declare class Ddu64EncryptionError extends Ddu64Error {
660
+ constructor(message: string, cause?: unknown);
661
+ }
662
+ declare class Ddu64DecryptionError extends Ddu64Error {
663
+ constructor(message: string, cause?: unknown);
664
+ }
665
+ declare class Ddu64ChecksumError extends Ddu64Error {
666
+ constructor(message: string, cause?: unknown);
667
+ }
668
+ declare class Ddu64CharsetError extends Ddu64Error {
669
+ constructor(message: string, cause?: unknown);
670
+ }
671
+ declare class Ddu64LimitError extends Ddu64Error {
672
+ constructor(message: string, operation: Ddu64Operation, cause?: unknown);
673
+ }
674
+ declare class Ddu64AdapterError extends Ddu64Error {
675
+ constructor(message: string, operation: Ddu64Operation, cause?: unknown);
676
+ }
677
+ declare class Ddu64ObfuscationError extends Ddu64Error {
678
+ constructor(message: string, cause?: unknown);
679
+ }
680
+ declare class Ddu64StreamError extends Ddu64Error {
681
+ constructor(message: string, cause?: unknown);
682
+ }
683
+ declare function isDdu64Error(error: unknown): error is Ddu64Error;
662
684
 
663
- export { type CharSetConfig as C, Ddu64Core as D, type EncoderConfig as E, type KeyDerivationOptions as K, type ObfuscationLayer as O, type PlatformAdapter as P, type TestVector as T, type WasmCodec as W, type DduConstructorOptions as a, type DduOptions as b, type CharSetInfo as c, CharsetBuilder as d, type DduEncodeStats as e, type DduProgressInfo as f, DduSetSymbol as g, type KeyDerivationAlgorithm as h, type WorkerPool as i, getWasmCodec as j, getWasmCodecSync as k, preloadWasm as p };
685
+ export { type CharSetConfig as C, Ddu64Core as D, type EncodingProfile as E, type KeyDerivationAlgorithm as K, type ObfuscationLayer as O, type PlatformAdapter as P, type TestVector as T, type WasmCodec as W, type DduConstructorOptions as a, type CharSetInfo as b, CharsetBuilder as c, Ddu64AdapterError as d, Ddu64CharsetError as e, Ddu64ChecksumError as f, Ddu64CompressionError as g, Ddu64DecodeError as h, Ddu64DecompressionError as i, Ddu64DecryptionError as j, Ddu64EncodeError as k, Ddu64EncryptionError as l, Ddu64Error as m, Ddu64ErrorCode as n, type Ddu64ErrorOptions as o, Ddu64LimitError as p, Ddu64ObfuscationError as q, type Ddu64Operation as r, Ddu64StreamError as s, type DduEncodeStats as t, type DduOptions as u, type DduProgressInfo as v, DduSetSymbol as w, type DduTextEncoding as x, type KeyDerivationOptions as y, isDdu64Error as z };
package/dist/index.cjs CHANGED
@@ -1,7 +1,2 @@
1
- 'use strict';var crypto$1=require('crypto'),zlib=require('zlib'),util=require('util');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var Ke=Object.defineProperty;var We=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var W=(n,e)=>()=>(n&&(e=n(n=0)),e);var z=(n,e)=>{for(var t in e)Ke(n,t,{get:e[t],enumerable:true});};var Re={};z(Re,{NodeAdapter:()=>exports.NodeAdapter});function Le(n){return (n??"SHA-256").toLowerCase().replace("-","")}function xe(n){return n===void 0||!Number.isFinite(n)||n<=0?ve:Math.max(Dt,Math.floor(n))}function Te(n){return n===void 0?Buffer.from(Pt,"utf-8"):typeof n=="string"?Buffer.from(n,"utf-8"):Buffer.from(n.buffer,n.byteOffset,n.byteLength)}var Ct,Ue,Et,ke,Bt,ve,Dt,Pt;exports.NodeAdapter=void 0;var M=W(()=>{Ct=util.promisify(zlib.deflateRaw),Ue=util.promisify(zlib.inflateRaw),Et=util.promisify(zlib.brotliCompress),ke=util.promisify(zlib.brotliDecompress),Bt=util.promisify(crypto$1.pbkdf2),ve=21e4,Dt=1e4,Pt="ddunigma:pbkdf2:v1";exports.NodeAdapter=class{supportsSyncCrypto=true;supportsSyncCompression=true;supportsBrotli=true;runtime="node";async deriveKey(e,t){if(t?.algorithm==="pbkdf2"){let r=await Bt(e,Te(t.salt),xe(t.iterations),32,Le(t.hash));return new Uint8Array(r)}return this.deriveKeySync(e,t)}deriveKeySync(e,t){return t?.algorithm==="pbkdf2"?new Uint8Array(crypto$1.pbkdf2Sync(e,Te(t.salt),xe(t.iterations),32,Le(t.hash))):new Uint8Array(crypto$1.createHash("sha256").update(e).digest())}async encrypt(e,t){return this.encryptSync(e,t)}encryptSync(e,t){let r=crypto$1.randomBytes(12),o=crypto$1.createCipheriv("aes-256-gcm",t,r),s=Buffer.concat([o.update(e),o.final()]),i=o.getAuthTag(),a=new Uint8Array(28+s.length);return a.set(r,0),a.set(i,12),a.set(s,28),a}async decrypt(e,t){return this.decryptSync(e,t)}decryptSync(e,t){if(e.length<28)throw new Error("[Ddu64 decrypt] Invalid encrypted data: too short");let r=e.subarray(0,12),o=e.subarray(12,28),s=e.subarray(28),i=crypto$1.createDecipheriv("aes-256-gcm",t,r);i.setAuthTag(o);let a=Buffer.concat([i.update(s),i.final()]);return new Uint8Array(a)}randomBytes(e){return new Uint8Array(crypto$1.randomBytes(e))}async deflate(e,t){let r={};t!==void 0&&(r.level=t);let o=await Ct(Buffer.from(e),r);return new Uint8Array(o)}deflateSync(e,t){let r={};return t!==void 0&&(r.level=t),new Uint8Array(zlib.deflateRawSync(Buffer.from(e),r))}async inflate(e,t){if(t===void 0||t===Number.POSITIVE_INFINITY){let o=await Ue(Buffer.from(e));return new Uint8Array(o)}let r={maxOutputLength:t};try{let o=await Ue(Buffer.from(e),r);return new Uint8Array(o)}catch(o){let s=o,i=String(s?.message??"").toLowerCase();throw String(s?.code??"")==="ERR_BUFFER_TOO_LARGE"||i.includes("output length")||i.includes("buffer too large")?new Error(`[Ddu64 inflate] Decompressed data exceeds limit. Limit: ${t} bytes`,{cause:o}):o}}inflateSync(e,t){if(t===void 0||t===Number.POSITIVE_INFINITY)return new Uint8Array(zlib.inflateRawSync(Buffer.from(e)));try{return new Uint8Array(zlib.inflateRawSync(Buffer.from(e),{maxOutputLength:t}))}catch(r){let o=r,s=String(o?.message??"").toLowerCase();throw String(o?.code??"")==="ERR_BUFFER_TOO_LARGE"||s.includes("output length")||s.includes("buffer too large")?new Error(`[Ddu64 inflate] Decompressed data exceeds limit. Limit: ${t} bytes`,{cause:r}):r}}async brotliCompress(e,t){let r={};t!==void 0&&(r.params={[zlib.constants.BROTLI_PARAM_QUALITY]:Math.max(0,Math.min(11,t))});let o=await Et(Buffer.from(e),r);return new Uint8Array(o)}brotliCompressSync(e,t){let r={};return t!==void 0&&(r.params={[zlib.constants.BROTLI_PARAM_QUALITY]:Math.max(0,Math.min(11,t))}),new Uint8Array(zlib.brotliCompressSync(Buffer.from(e),r))}async brotliDecompress(e,t){if(t===void 0||t===Number.POSITIVE_INFINITY){let r=await ke(Buffer.from(e));return new Uint8Array(r)}try{let r=await ke(Buffer.from(e),{maxOutputLength:t});return new Uint8Array(r)}catch(r){let o=r,s=String(o?.message??"").toLowerCase();throw String(o?.code??"")==="ERR_BUFFER_TOO_LARGE"||s.includes("output length")||s.includes("buffer too large")||s.includes("cannot create a buffer larger")?new Error(`[Ddu64 brotli] Decompressed data exceeds limit. Limit: ${t} bytes`,{cause:r}):r}}brotliDecompressSync(e,t){if(t===void 0||t===Number.POSITIVE_INFINITY)return new Uint8Array(zlib.brotliDecompressSync(Buffer.from(e)));try{return new Uint8Array(zlib.brotliDecompressSync(Buffer.from(e),{maxOutputLength:t}))}catch(r){let o=r,s=String(o?.message??"").toLowerCase();throw String(o?.code??"")==="ERR_BUFFER_TOO_LARGE"||s.includes("output length")||s.includes("buffer too large")||s.includes("cannot create a buffer larger")?new Error(`[Ddu64 brotli] Decompressed data exceeds limit. Limit: ${t} bytes`,{cause:r}):r}}};});var _e={};z(_e,{BrowserAdapter:()=>exports.BrowserAdapter});function kt(n){return n===void 0||!Number.isFinite(n)||n<=0?21e4:Math.max(1e4,Math.floor(n))}function vt(n){return n===void 0?new TextEncoder().encode(Ut):typeof n=="string"?new TextEncoder().encode(n):n}var Ut;exports.BrowserAdapter=void 0;var re=W(()=>{Ut="ddunigma:pbkdf2:v1";exports.BrowserAdapter=class{supportsSyncCrypto=false;supportsSyncCompression=false;supportsBrotli=false;runtime="browser";async deriveKey(e,t){let o=new TextEncoder().encode(e);if(t?.algorithm==="pbkdf2"){let i=await crypto.subtle.importKey("raw",o,"PBKDF2",false,["deriveBits"]),a=await crypto.subtle.deriveBits({name:"PBKDF2",salt:vt(t.salt),iterations:kt(t.iterations),hash:t.hash??"SHA-256"},i,256);return new Uint8Array(a)}let s=await crypto.subtle.digest("SHA-256",o);return new Uint8Array(s)}async encrypt(e,t){let r=crypto.getRandomValues(new Uint8Array(12)),o=await crypto.subtle.importKey("raw",t,{name:"AES-GCM"},false,["encrypt"]),s=await crypto.subtle.encrypt({name:"AES-GCM",iv:r,tagLength:128},o,e),i=new Uint8Array(s),a=i.slice(0,i.length-16),c=i.slice(i.length-16),d=new Uint8Array(28+a.length);return d.set(r,0),d.set(c,12),d.set(a,28),d}async decrypt(e,t){if(e.length<28)throw new Error("[Ddu64 decrypt] Encrypted data is invalid. Payload must be at least 28 bytes (12 IV + 16 authTag + ciphertext).");let r=e.slice(0,12),o=e.slice(12,28),s=e.slice(28),i=new Uint8Array(s.length+16);i.set(s,0),i.set(o,s.length);let a=await crypto.subtle.importKey("raw",t,{name:"AES-GCM"},false,["decrypt"]);try{let c=await crypto.subtle.decrypt({name:"AES-GCM",iv:r,tagLength:128},a,i);return new Uint8Array(c)}catch{throw new Error("[Ddu64 decrypt] Decryption failed: data tampering or incorrect key.")}}randomBytes(e){return crypto.getRandomValues(new Uint8Array(e))}async deflate(e,t){if(typeof CompressionStream>"u")throw new Error("[Ddu64 compress] Deflate compression is unsupported in the current runtime. CompressionStream API is not available.");let r=this.getDeflateFormat(),o=new CompressionStream(r),s=o.writable.getWriter(),i=o.readable.getReader();s.write(e),s.close();let a=[],c=0;for(;;){let{done:h,value:f}=await i.read();if(h)break;a.push(f),c+=f.length;}let d=new Uint8Array(c),l=0;for(let h of a)d.set(h,l),l+=h.length;return d}async inflate(e,t){if(typeof DecompressionStream>"u")throw new Error("[Ddu64 decompress] Deflate decompression is unsupported in the current runtime. DecompressionStream API is not available.");let r=this.getDeflateFormat(),o=new DecompressionStream(r),s=o.writable.getWriter(),i=o.readable.getReader();s.write(e),s.close();let a=[],c=0;for(;;){let{done:h,value:f}=await i.read();if(h)break;if(c+=f.length,t!==void 0&&c>t)throw new Error(`[Ddu64 decompress] Decompressed size exceeds limit. Estimated ${c}+ bytes exceeds maximum of ${t} bytes.`);a.push(f);}let d=new Uint8Array(c),l=0;for(let h of a)d.set(h,l),l+=h.length;return d}getDeflateFormat(){return "deflate-raw"}};});var Oe={};z(Oe,{detectRuntime:()=>ne,getAdapter:()=>Ie});function ne(){if(typeof globalThis.process<"u"&&globalThis.process?.versions?.node)return "node";if(globalThis.Deno?.version?.deno)return "deno";if(globalThis.Bun?.version)return "bun";if(typeof globalThis.crypto<"u"&&globalThis.crypto?.subtle)return "browser";throw new Error("[ddunigma] No suitable crypto provider found. Detected runtime lacks both Node.js crypto module and Web Crypto API (SubtleCrypto).")}async function Ie(){switch(ne()){case "node":{let{NodeAdapter:e}=await Promise.resolve().then(()=>(M(),Re));return new e}case "deno":case "bun":case "browser":case "edge":{let{BrowserAdapter:e}=await Promise.resolve().then(()=>(re(),_e));return new e}default:throw new Error("[ddunigma] No suitable crypto provider found. Detected runtime lacks both Node.js crypto module and Web Crypto API (SubtleCrypto).")}}var oe=W(()=>{});function ae(n,e){let{bitLength:t,usePowerOfTwo:r,charsetSize:o}=e,s=n.length;if(s===0)return {indices:[],paddingBits:0};let i=s*8,a=Math.ceil(i/t),c=r?a:a*2,d=new Array(c),l=0,h=0,f=0;if(r){let m=(1<<t)-1;for(let g=0;g<s;g++)for(h=h<<8|n[g],f+=8;f>=t;)f-=t,d[l++]=h>>f&m,h&=(1<<f)-1;}else for(let m=0;m<s;m++)for(h=h<<8|n[m],f+=8;f>=t;){f-=t;let g=h>>f,p=g/o|0;d[l++]=p,d[l++]=g-p*o,h&=(1<<f)-1;}let u=0;if(f>0){u=t-f;let m=h<<u;if(r)d[l++]=m;else {let g=m/o|0;d[l++]=g,d[l++]=m-g*o;}}return d.length=l,{indices:d,paddingBits:u}}function ce(n,e,t){let{bitLength:r,usePowerOfTwo:o,charsetSize:s}=t,i=n.length;if(i===0)return new Uint8Array(0);let a=o?1:2,c=Math.ceil(i/a),d=r<31?1<<r:Math.pow(2,r),l=Math.ceil((c*r-e)/8),h=new Uint8Array(l+1),f=0,u=0,m=0;if(o)for(let g=0;g<i;g+=a){let p=n[g];if(p<0||p>=s)throw new Error(`[BitPack decode] Invalid index ${p} at position ${g}`);for(u=u<<r|p,m+=r,g+a>=i&&e>0&&(u>>=e,m-=e);m>=8;)m-=8,h[f++]=u>>m&255,u&=(1<<m)-1;}else for(let g=0;g<i;g+=a){let p=n[g],y=n[g+1];if(p<0||p>=s)throw new Error(`[BitPack decode] Invalid index ${p} at position ${g}`);if(y===void 0||y<0||y>=s)throw new Error(`[BitPack decode] Invalid index ${y} at position ${g+1}`);let b=p*s+y;if(b>=d)throw new Error(`[BitPack decode] Value ${b} exceeds range at position ${g}`);for(u=u<<r|b,m+=r,g+a>=i&&e>0&&(u>>=e,m-=e);m>=8;)m-=8,h[f++]=u>>m&255,u&=(1<<m)-1;}return h.subarray(0,f)}function ze(n,e){return n<=1?0:e?Math.floor(Math.log2(n)):Math.ceil(Math.log2(n))}function He(n){return n>0&&(n&n-1)===0}function de(n){let e=He(n);return {bitLength:ze(n,e),usePowerOfTwo:e,charsetSize:n}}var S="DDS1",D="ELYSIA",P="GRISEO";function H(n,e,t){let r=n.length,o=e.length,s={cleanedInput:n,paddingBits:0,isEncrypted:false,pipelineVersion:2};if(r<o)return s;let a=Math.max(0,t-1).toString().length;for(let c=Math.min(a,r);c>=1;c--){let d=r-c,l=true;for(let b=d;b<r;b++){let L=n.charCodeAt(b);if(L<48||L>57){l=false;break}}if(!l)continue;let h=n.substring(d),f=parseInt(h,10);if(Number.isNaN(f)||f<0||f>=t||h!==f.toString())continue;let u=d,m=false,g,p=2;u>=2&&n.substring(u-2,u)==="V3"&&(p=3,u-=2),u>=3&&n.substring(u-3,u)==="ENC"&&(m=true,u-=3),u>=D.length&&n.substring(u-D.length,u)===D?(g="deflate",u-=D.length):u>=P.length&&n.substring(u-P.length,u)===P&&(g="brotli",u-=P.length);let y=u-o;if(y>=0&&n.substring(y,u)===e)return {cleanedInput:n.substring(0,y),paddingBits:f,compressionAlgorithm:g,isEncrypted:m,pipelineVersion:p}}if(n.endsWith(e)){let c=0,d=r;for(;d>=o&&n.substring(d-o,d)===e;)c++,d-=o;if(c>0){let l=c*2;if(l<t)return {cleanedInput:n.substring(0,d),paddingBits:l,isEncrypted:false,pipelineVersion:2}}}return s}function F(n){let e=n.lastIndexOf("CHK");if(e===-1)return {data:n,checksum:null};let t=n.slice(e+3);return t.length!==8||!/^[0-9a-f]+$/i.test(t)?{data:n,checksum:null}:{data:n.slice(0,e),checksum:t.toLowerCase()}}function $(n){return n.length*2+S.length+2}function x(n,e){let t=e.compressionAlgorithm==="brotli"?"B":e.compressionAlgorithm==="deflate"?"D":"N",r=e.encrypted?"1":"0";return `${n}${S}${t}${r}${n}`}function le(n,e){let t=$(e);if(n.length<t||!n.startsWith(e))return null;let r=e.length;if(n.slice(r,r+S.length)!==S)throw new Error("[wireFormat] Invalid stream header magic");let s=n[r+S.length],i=n[r+S.length+1];if(n.slice(t-e.length,t)!==e)throw new Error("[wireFormat] Invalid stream header terminator");let c=s==="B"?"brotli":s==="D"?"deflate":s==="N"?void 0:null;if(c===null)throw new Error("[wireFormat] Invalid stream header compression flag");if(i!=="0"&&i!=="1")throw new Error("[wireFormat] Invalid stream header encryption flag");return {compressionAlgorithm:c,encrypted:i==="1"}}function ue(n){let{paddingBits:e,compressionAlgorithm:t,isEncrypted:r,paddingChar:o,useRepeatPadding:s,pipelineVersion:i=2}=n;if(e===0&&!t&&!r&&i===2)return "";if(s&&!t&&!r&&i===2&&e>0&&e%2===0){let c=e>>1;return o.repeat(c)}return o+(t==="deflate"?D:t==="brotli"?P:"")+(r?"ENC":"")+(i===3?"V3":"")+e.toString()}var Fe=(()=>{let n=new Uint32Array(256);for(let e=0;e<256;e++){let t=e;for(let r=0;r<8;r++)t=t>>>1^(t&1?3988292384:0);n[e]=t;}return n})();function U(n){let e=4294967295;for(let t=0;t<n.length;t++)e=e>>>8^Fe[(e^n[t])&255];return ((e^4294967295)>>>0).toString(16).padStart(8,"0")}function he(n){return n.length===0?n:n.replaceAll("+","-").replaceAll("/","_").replaceAll("=",".")}function q(n){return n.length===0?n:n.replaceAll("-","+").replaceAll("_","/").replaceAll(".","=")}function fe(n,e,t){if(e<=0||n.length<=e)return n;let r=Math.ceil(n.length/e),o=new Array(r*2-1),s=0;for(let i=0;i<n.length;i+=e)o[s++]=n.slice(i,i+e),i+e<n.length&&(o[s++]=t);return o.join("")}function Y(n,e){if(n.length===0)return n;let t=n.replace(/[\r\n]/g,""),r=e&&e!==`
2
- `&&e!==`\r
3
- `&&e!=="\r"?e:"";return r.length>0&&t.includes(r)&&(t=t.replaceAll(r,"")),t}var $e={"":0,\u3131:1,\u3132:2,\u3133:3,\u3134:4,\u3135:5,\u3136:6,\u3137:7,\u3139:8,\u313A:9,\u313B:10,\u313C:11,\u313D:12,\u313E:13,\u313F:14,\u3140:15,\u3141:16,\u3142:17,\u3144:18,\u3145:19,\u3146:20,\u3147:21,\u3148:22,\u314A:23,\u314B:24,\u314C:25,\u314D:26,\u314E:27};function qe(n,e){let t=n.charCodeAt(0);if(t<44032||t>55203)return n;let r=t-(t-44032)%28,o=$e[e]??0;return String.fromCharCode(r+o)}function T(n,e){let t=new Array(n.length*e.length),r=0;for(let o of n)for(let s of e)t[r++]=qe(o,s);return t}function R(n,e){let r=n===void 0||!Number.isFinite(n)?6:Math.floor(n);return Math.min(e==="brotli"?11:9,Math.max(0,r))}var Ye=new TextEncoder,Ve=new TextDecoder;function _(n){return Ye.encode(n)}function V(n){return Ve.decode(n)}var j=(r=>(r.DDU="ddu",r.DDU_V1="ddu_v1",r.ONECHARSET="oneCharSet",r))(j||{}),G={dduSetSymbol:"ddu",usePowerOfTwo:true,requiredLength:64,bitLength:6};var je={symbol:"ddu",charSet:["\uB70C","\uB568","\uC774","\uC6B0","\uC57C","\uB4C0","\uB31C","\uB3A8"],codaChar:["","\u3131","\u3132","\u3137","\u3148","\u3147","\u3145","\u3146"],maxRequiredLength:64,bitLength:6,paddingChar:"\uBB50",useRepeatPadding:true},Ge={symbol:"ddu_v1",charSet:["\uB70C","\uB568","\uC774","\uC6B0","\uC57C","!","?","."],maxRequiredLength:8,bitLength:3,paddingChar:"\uBB50",useRepeatPadding:true},Ze={symbol:"oneCharSet",charSet:["A","s","q","r","0","z","3","t","y","1","5","2","4","E","B","C","Q","F","R","T","U","W","V","X","Y","Z","b","a","c","d","D","G","L","H","I","-","J","K","M","O","N","f","e","h","g","P","i","S","k","l","m","u","j","v","n","o","p","9","w","6","7","8","x","_"],paddingChar:"=",maxRequiredLength:64,bitLength:6};function I(n){switch(n){case "ddu":return je;case "ddu_v1":return Ge;case "oneCharSet":return Ze;default:return}}var Xe=65536,Qe=["-","_","."];function me(n,e,t,r){let o=(s,i,a,c,d)=>{if(Je(a,t?.usePowerOfTwo)&&a>0){let f=Math.floor(Math.log2(a)),u=1<<f;return {charSet:s.length===u?s:s.slice(0,u),padding:i,requiredLength:u,bitLength:f,isPredefined:c,useRepeatPadding:d}}return {charSet:s.length===a?s:s.slice(0,a),padding:i,requiredLength:a,bitLength:a>0?Math.ceil(Math.log2(a)):0,isPredefined:c,useRepeatPadding:d}};try{let s=n??t?.dduChar,i=e??t?.paddingChar;if(s){if(!i)throw new Error("[Ddu64 Constructor] paddingChar is required when dduChar is provided.");let l=typeof s=="string"?[...s]:[...s],h=t?.codaChar,f=h?!0:t?.useRepeatPadding??!1;if(h&&h.length>0&&(l=T(l,h)),r&&new Set(l).size!==l.length){let g=l.filter((p,y)=>l.indexOf(p)!==y);throw new Error(`[Ddu64 Constructor] Character set contains duplicate characters: [${[...new Set(g)].join(", ")}]`)}let u=t?.requiredLength??l.length;if(l.length<u)throw new Error("[Ddu64 Constructor] Insufficient characters.");return o(l,i,u,!1,f)}let a=t?.dduSetSymbol??G.dduSetSymbol??"ddu",c=et(a),d=c.codaChar?T(c.charSet,c.codaChar):c.charSet;return o(d,c.paddingChar,c.maxRequiredLength,!0,c.useRepeatPadding)}catch(s){if(r)throw s;return Z(t)}}function pe(n,e,t){let r=[n,null];for(let s of r){let i=s?{...s}:Z(t);try{let a=i.charSet,c=i.requiredLength,d=Array.from(new Set(a));if(d.length!==a.length){if(e){let f=a.filter((u,m)=>a.indexOf(u)!==m);throw new Error(`[Ddu64 normalizeCharSet] Character set contains duplicate characters: [${[...new Set(f)].join(", ")}]`)}a=d,i.isPredefined||(c=a.length);}if(a.length<c)throw new Error(`[Ddu64 normalizeCharSet] Insufficient characters. Required: ${c}, Has: ${a.length}`);if(c<2)throw new Error("[Ddu64 normalizeCharSet] At least 2 unique characters required.");if(a.length===0)throw new Error("[Ddu64 normalizeCharSet] Empty charset.");if(a.find(f=>f.length!==1)){if(e)throw new Error("[Ddu64 normalizeCharSet] Multi-character symbols are not supported.");continue}if(a.length>Xe){if(e)throw new Error("[Ddu64 normalizeCharSet] Charset size exceeds maximum supported size of 65536.");continue}if(i.padding.length!==1)throw new Error(`[Ddu64 normalizeCharSet] Padding length mismatch. Expected 1, got ${i.padding.length}`);if(a.includes(i.padding)){if(e)throw new Error(`[Ddu64 normalizeCharSet] Padding character "${i.padding}" conflicts with charset.`);a=a.filter(f=>f!==i.padding);}for(let f of a)if(f.includes(`
4
- `)||f.includes("\r"))throw new Error("[Ddu64 normalizeCharSet] Newline and carriage return characters are reserved.");if(i.padding.includes(`
5
- `)||i.padding.includes("\r"))throw new Error("[Ddu64 normalizeCharSet] Newline and carriage return characters are reserved.");return {charSet:a.length===c?a:a.slice(0,c),padding:i.padding,isPredefined:i.isPredefined}}catch(a){if(e)throw a}}let o=Z(t);return {charSet:o.charSet.slice(0,o.requiredLength),padding:o.padding,isPredefined:true}}function ye(n,e,t){for(let r of Qe){for(let o of n)if(o.includes(r)){let s=`[Ddu64 Constructor] URL-Safe mode conflict: charset character "${o}" contains "${r}".`;if(t)throw new Error(s);return false}if(e.includes(r)){let o=`[Ddu64 Constructor] URL-Safe mode conflict: padding character "${e}" contains "${r}".`;if(t)throw new Error(o);return false}}return true}function ge(n,e,t){if(t>256)return;let r=Math.min(n.length,t),o=n.slice(0,r),s=new Set;for(let a=0;a<o.length;a++)s.add(o[a]);s.add(e);for(let a=0;a<o.length;a++){let c=o[a];for(let h=0;h<o.length;h++){let f=c+o[h];if(s.has(f))throw new Error(`Combination conflict: "${c}" + "${o[h]}"`);s.add(f);}let d=c+e;if(s.has(d))throw new Error(`Combination conflict: "${c}" + padding`);s.add(d);let l=e+c;if(s.has(l))throw new Error(`Combination conflict: padding + "${c}"`);s.add(l);}let i=e+e;if(s.has(i))throw new Error("Combination conflict: double padding");s.add(i);}function Je(n,e){return e!==void 0?e?n>0:false:n>0&&(n&n-1)===0}function et(n){let e=I(n);if(!e)throw new Error(`CharSet with symbol ${n} not found`);return e}function Z(n){let e=n?.dduSetSymbol??G.dduSetSymbol??"oneCharSet",t=I(e)??I("oneCharSet");if(!t)throw new Error("Critical: No fallback CharSet available");return {charSet:t.codaChar?T(t.charSet,t.codaChar):t.charSet,padding:t.paddingChar,requiredLength:t.maxRequiredLength,bitLength:t.bitLength,isPredefined:true,useRepeatPadding:t.useRepeatPadding}}function tt(){let n=1;return typeof globalThis.navigator<"u"&&globalThis.navigator.hardwareConcurrency?n=globalThis.navigator.hardwareConcurrency:typeof globalThis.process<"u"&&globalThis.process.versions?.node&&(typeof globalThis.process.availableParallelism=="function"?n=globalThis.process.availableParallelism():n=4),Math.max(1,Math.min(64,n-1))}function rt(){try{let{Worker:n}=We("worker_threads"),e=new URL("./nodeWorker.js",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))).pathname,t=new n(e);return {postMessage(r){t.postMessage(r);},async terminate(){await t.terminate();},onMessage(r){t.on("message",r);},onError(r){t.on("error",r);}}}catch{return null}}function nt(){try{if(typeof globalThis.Worker>"u")return null;let n=new URL("./webWorker.js",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))),e=new globalThis.Worker(n,{type:"module"});return {postMessage(t){e.postMessage(t);},async terminate(){e.terminate();},onMessage(t){e.addEventListener("message",r=>{t(r.data);});},onError(t){e.addEventListener("error",r=>{t(new Error(r.message||"Worker error"));});}}}catch{return null}}var Q=class{poolSize;workers=[];pendingTasks=new Map;nextTaskId=0;roundRobinIndex=0;initialized=false;terminated=false;constructor(e){this.poolSize=e??tt();}async encode(e,t){return await this.dispatch("encode",e,t)}async decode(e,t){return await this.dispatch("decode",e,t)}setPoolSize(e){if(!Number.isInteger(e))throw new Error(`[WorkerPool] Pool size must be an integer. Got: ${e}. Valid range: [1, 64]`);if(e<1||e>64)throw new Error(`[WorkerPool] Pool size must be between 1 and 64. Got: ${e}`);let t=this.poolSize;this.poolSize=e,this.initialized&&t!==e&&(this.terminateWorkers(),this.initialized=false);}async terminate(){this.terminated=true,await this.terminateWorkers();for(let[,e]of this.pendingTasks)e.reject(new Error("[WorkerPool] Pool terminated"));this.pendingTasks.clear();}async dispatch(e,t,r){if(this.terminated)throw new Error("[WorkerPool] Pool has been terminated");if(this.ensureInitialized(),this.workers.length===0)throw new Error("[WorkerPool] No workers available. Workers may not be supported in this runtime.");let o=this.nextTaskId++,s=this.roundRobinIndex%this.workers.length;this.roundRobinIndex=(this.roundRobinIndex+1)%this.workers.length;let i=this.workers[s];return new Promise((a,c)=>{this.pendingTasks.set(o,{resolve:a,reject:c});let d={id:o,type:e,data:t,config:r};i.postMessage(d);})}ensureInitialized(){if(this.initialized)return;let e=typeof globalThis.process<"u"&&!!globalThis.process.versions?.node;for(let t=0;t<this.poolSize;t++){let r=e?rt():nt();if(!r)break;r.onMessage(o=>{let s=this.pendingTasks.get(o.id);s&&(this.pendingTasks.delete(o.id),o.type==="error"?s.reject(new Error(o.error??"Worker error")):s.resolve(o.result));}),r.onError(o=>{console.error("[WorkerPool] Worker error:",o.message);}),this.workers.push(r);}this.initialized=true;}async terminateWorkers(){let e=this.workers.map(t=>t.terminate());await Promise.all(e),this.workers=[];}},X=null;function ot(){return X||(X=new Q),X}function J(n){ot().setPoolSize(n);}function be(n){if(n.length===0)throw new Error("[Ddu64 obfuscation] Alphabet must not be empty.");if(n.length>11172)throw new Error(`[Ddu64 obfuscation] Alphabet size (${n.length}) exceeds available Hangul syllables (11172).`);let e=Math.floor(11172/n.length),t=new Map;for(let r=0;r<n.length;r++)t.set(n[r],r);return {alphabet:n,syllablesPerChar:e,charToIndex:t}}function we(n,e,t){let r=44032+n*t.syllablesPerChar,o=e%t.syllablesPerChar;return r+o}function Ae(n,e){if(n<44032||n>55203)return -1;let t=n-44032,r=Math.floor(t/e.syllablesPerChar);return r>=e.alphabet.length?-1:r}var C=class{config;constructor(e){this.config=be(e);}obfuscate(e){if(e.length===0)return "";let t=new Array(e.length);for(let r=0;r<e.length;r++){let o=e[r],s=this.config.charToIndex.get(o);if(s===void 0)throw new Error(`[Ddu64 obfuscation] Character "${o}" (U+${o.charCodeAt(0).toString(16).padStart(4,"0").toUpperCase()}) not found in obfuscation alphabet.`);let i=we(s,r,this.config);t[r]=String.fromCharCode(i);}return t.join("")}deobfuscate(e){if(e.length===0)return "";let t=new Array(e.length);for(let r=0;r<e.length;r++){let o=e.charCodeAt(r),s=Ae(o,this.config);if(s===-1)throw new Error(`[Ddu64 obfuscation] Invalid syllable at position ${r}: U+${o.toString(16).padStart(4,"0").toUpperCase()} is not in the mapped range.`);t[r]=this.config.alphabet[s];}return t.join("")}};function st(n,e){let t=new Set(n);t.add(e);let r=[...t];return new C(r)}var E=null,ee=false,A=false,w=null,te=class{exports;_ready=true;constructor(e){this.exports=e;}get ready(){return this._ready}encode(e,t){let{exports:r}=this;if(e.length===0)return {indices:new Uint16Array(0),paddingBits:0};let o=r.alloc(e.length);new Uint8Array(r.memory.buffer).set(e,o);let i=1<<t,a=1;try{let c=r.encode(o,e.length,t,i,a),d=r.get_result_ptr(),l=new Uint16Array(r.memory.buffer,d,c),h=new Uint16Array(c);return h.set(l),{indices:h,paddingBits:r.get_padding_bits()}}finally{r.dealloc(o,e.length);}}decode(e,t,r){let{exports:o}=this;if(e.length===0)return new Uint8Array(0);let s=e.length*2,i=o.alloc(s);new Uint16Array(o.memory.buffer,i,e.length).set(e);let c=1<<t,d=1;try{let l=o.decode(i,e.length,t,c,d,r);if(l===4294967295)throw new Error("[WasmCodec decode] Invalid index in input");let h=o.get_result_ptr(),f=new Uint8Array(o.memory.buffer,h,l),u=new Uint8Array(l);return u.set(f),u}finally{o.dealloc(i,s);}}};async function it(){try{if(typeof globalThis.process<"u"&&globalThis.process.versions?.node){let{readFile:n}=await import('fs/promises'),{fileURLToPath:e}=await import('url'),{dirname:t,join:r}=await import('path'),o=t(e((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))),s=r(o,"wasm","codec.wasm");try{let i=await n(s);return i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength)}catch{let i=r(o,"codec.wasm");try{let a=await n(i);return a.buffer.slice(a.byteOffset,a.byteOffset+a.byteLength)}catch{let a=r(o,"..","wasm","codec.wasm");try{let c=await n(a);return c.buffer.slice(c.byteOffset,c.byteOffset+c.byteLength)}catch{return null}}}}if(typeof fetch=="function"){let n=await fetch(new URL("./wasm/codec.wasm",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))));return n.ok?await n.arrayBuffer():null}return null}catch{return null}}async function at(n){try{if(n.byteLength<16)return null;let e=new Uint8Array(n,0,4);if(e[0]!==0||e[1]!==97||e[2]!==115||e[3]!==109)return null;let t;try{t=await WebAssembly.compile(n);}catch{return null}let o=(await WebAssembly.instantiate(t,{})).exports;return typeof o.alloc!="function"||typeof o.dealloc!="function"||typeof o.encode!="function"||typeof o.decode!="function"||typeof o.get_result_ptr!="function"||typeof o.get_result_len!="function"||typeof o.get_padding_bits!="function"||!o.memory?null:o}catch{return null}}async function Se(){try{if(E)return !0;if(A)return !1;let n=await it();if(!n)return A=!0,!1;let e=await at(n);return e?(E=new te(e),!0):(A=!0,!1)}catch{return A=true,false}}function ct(n,e){let t;return {promise:new Promise((s,i)=>{t=setTimeout(()=>i(new Error(e)),n);}),clear:()=>clearTimeout(t)}}async function dt(){if(E)return;if(w)return w;let n=ct(1e4,"[Ddu64 wasm] WASM initialization timed out (10s)"),e=async()=>{try{if(!await Se())throw new Error("[Ddu64 wasm] WASM initialization failed")}finally{n.clear();}};return w=Promise.race([e(),n.promise]).finally(()=>{w=null,ee=true;}),w}function lt(){if(E)return E;if(A)return null;if(!ee&&!w){ee=true;let n;w=new Promise(e=>{n=setTimeout(()=>{A=true,e();},5e3),Se().then(t=>{t||(A=true);}).catch(()=>{A=true;}).finally(()=>{n!==void 0&&clearTimeout(n),e();});}).finally(()=>{w=null;});}return null}function O(){return E}function Ce(n){if(!Number.isFinite(n))throw new Error(`[Ddu64 config] wasmThreshold must be a finite number, got ${n}`);return Math.max(1024,Math.min(1048576,Math.round(n)))}var xt=8,Tt=64*1024*1024,Rt=64*1024*1024,se="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Me="=",_t=Object.fromEntries([...se].map((n,e)=>[n,e])),v=class{dduChar;paddingChar;bitLength;usePowerOfTwo;effectiveBitLength;dduBinaryLookup=new Map;isPredefinedCharSet;defaultCompress;defaultMaxDecodedBytes;defaultMaxDecompressedBytes;urlSafe;encryptionKey;keyDerivation;encryptionKeyHash;defaultChecksum;defaultChunkSize;defaultChunkSeparator;defaultCompressionLevel;defaultCompressionAlgorithm;useRepeatPadding;bitPackConfig;wasmThreshold;canUseNativeBase64;nativeDecodeMap;adapter;defaultObfuscate;_obfuscationLayer;constructor(e,t,r){e!=null&&typeof e=="object"&&!Array.isArray(e)&&(r=e,e=void 0,t=void 0);let o=r?.throwOnError??r?.useBuildErrorReturn??false;r?.adapter?this.adapter=r.adapter:this.adapter=void 0;let s=me(e,t,r,o),i=pe(s,o,r);this.dduChar=i.charSet,this.paddingChar=i.padding,this.isPredefinedCharSet=i.isPredefined,this.defaultCompress=r?.compress??false,this.defaultMaxDecodedBytes=this.normalizeLimit(r?.maxDecodedBytes,Tt,o,"maxDecodedBytes"),this.defaultMaxDecompressedBytes=this.normalizeLimit(r?.maxDecompressedBytes,Rt,o,"maxDecompressedBytes");let a=this.dduChar.length;this.usePowerOfTwo=a>0&&(a&a-1)===0;let c=Math.ceil(Math.log2(a));this.bitLength=this.usePowerOfTwo?Math.floor(Math.log2(a)):c,this.effectiveBitLength=this.usePowerOfTwo?this.bitLength:c;for(let l=0;l<a;l++)this.dduBinaryLookup.set(this.dduChar[l],l);this.isPredefinedCharSet||ge(this.dduChar,this.paddingChar,a);let d=r?.urlSafe??false;if(this.urlSafe=d?ye(this.dduChar,this.paddingChar,o):false,this.encryptionKey=r?.encryptionKey,this.keyDerivation=r?.keyDerivation,this.encryptionKey&&this.adapter?.deriveKeySync&&(this.encryptionKeyHash=this.adapter.deriveKeySync(this.encryptionKey,this.keyDerivation)),this.defaultChecksum=r?.checksum??false,this.defaultChunkSize=r?.chunkSize,this.defaultChunkSeparator=r?.chunkSeparator??`
6
- `,this.defaultCompressionAlgorithm=r?.compressionAlgorithm??"deflate",this.defaultCompressionLevel=R(r?.compressionLevel,this.defaultCompressionAlgorithm),this.useRepeatPadding=r?.useRepeatPadding??s.useRepeatPadding??false,this.defaultObfuscate=r?.obfuscate??false,this.defaultObfuscate&&!this.encryptionKey)throw new Error("[Ddu64 obfuscation] Obfuscation requires encryption to be enabled.");if(this.bitPackConfig=de(a),this.wasmThreshold=Ce(r?.wasmThreshold??4096),this.canUseNativeBase64=this.usePowerOfTwo&&this.dduChar.length===64,this.canUseNativeBase64){this.nativeDecodeMap=new Map;for(let l=0;l<se.length;l++){let h=this.dduChar[l];this.nativeDecodeMap.set(h,se[l]);}}}encode(e,t){return this.encodeInternal(e,t).encoded}decode(e,t){let r=this.decodeToUint8Array(e,t);return V(r)}decodeToUint8Array(e,t){let r=t?.checksum??this.defaultChecksum,o=t?.compress!==false,s=t?.encrypt!==false,i=e;this.reportProgress(t,{processedBytes:0,totalBytes:e.length,percent:0,stage:"start"});let a=t?.chunkSeparator??this.defaultChunkSeparator;i=Y(i,a),this.urlSafe&&(i=q(i));let c=null;if(r){let y=F(i);c=y.checksum,i=y.data;}this.shouldObfuscate(t)&&(i=this.getObfuscationLayer().deobfuscate(i));let{cleanedInput:d,paddingBits:l,compressionAlgorithm:h,isEncrypted:f,pipelineVersion:u}=H(i,this.paddingChar,this.effectiveBitLength);if(f&&s&&!this.encryptionKey)throw new Error("[Ddu64 decode] Encrypted payload requires an encryptionKey");this.assertEncodedInputAligned(d);let m=this.normalizeLimit(t?.maxDecodedBytes,this.defaultMaxDecodedBytes,true,"maxDecodedBytes"),g=this.estimateDecodedBytes(d.length,l);if(g>m)throw new Error(`[Ddu64 decode] Decoded output exceeds limit. Estimated: ${g} bytes, Limit: ${m} bytes`);this.reportProgress(t,{processedBytes:d.length,totalBytes:e.length,percent:30,stage:"decode"});let p=this.decodeChars(d,l);if(u===3&&f&&this.encryptionKey&&s&&(this.reportProgress(t,{processedBytes:p.length,totalBytes:p.length,percent:55,stage:"decrypt"}),p=this.decryptSync(p)),h&&o&&(u===2||!f||s)){let y=this.normalizeLimit(t?.maxDecompressedBytes,this.defaultMaxDecompressedBytes,true,"maxDecompressedBytes");this.reportProgress(t,{processedBytes:p.length,totalBytes:p.length,percent:70,stage:"decompress"}),p=this.decompressSync(p,h,y);}if(c&&(u===2||!f||s)){this.reportProgress(t,{processedBytes:p.length,totalBytes:p.length,percent:85,stage:"checksum"});let y=U(p);if(y!==c)throw new Error(`[Ddu64 decode] Checksum mismatch. Expected: ${c}, Got: ${y}`)}return u===2&&f&&this.encryptionKey&&s&&(this.reportProgress(t,{processedBytes:p.length,totalBytes:p.length,percent:90,stage:"decrypt"}),p=this.decryptSync(p)),this.reportProgress(t,{processedBytes:p.length,totalBytes:p.length,percent:100,stage:"done"}),p}async encodeAsync(e,t){let r=await this.getAdapterAsync(),o=t?.compress??this.defaultCompress,s=t?.checksum??this.defaultChecksum,i=(t?.encrypt??true)&&!!this.encryptionKey,a=t?.chunkSize??this.defaultChunkSize,c=t?.chunkSeparator??this.defaultChunkSeparator,d=typeof e=="string"?_(e):e;this.reportProgress(t,{processedBytes:0,totalBytes:d.length,percent:0,stage:"start"});let l="";s&&(l=U(d));let h;if(o){let m=t?.compressionAlgorithm??this.defaultCompressionAlgorithm,g=R(t?.compressionLevel??this.defaultCompressionLevel,m);this.reportProgress(t,{processedBytes:d.length,totalBytes:d.length,percent:20,stage:"compress"});let p;if(m==="brotli"){if(!r.brotliCompress)throw new Error("[Ddu64 compress] Brotli compression is unavailable in the current runtime.");p=await r.brotliCompress(d,g);}else p=await r.deflate(d,g);p.length<d.length&&(d=p,h=m);}let f=false;if(i){let m=await this.getKeyHashAsync(r);this.reportProgress(t,{processedBytes:d.length,totalBytes:d.length,percent:45,stage:"encrypt"}),d=await r.encrypt(d,m),f=true;}this.reportProgress(t,{processedBytes:d.length,totalBytes:d.length,percent:70,stage:"encode"});let u=this.encodeBytes(d,h,f,t);return u=this.applyPostEncoding(u,t,l,s,a,c),this.reportProgress(t,{processedBytes:d.length,totalBytes:d.length,percent:100,stage:"done"}),u}async decodeAsync(e,t){let r=await this.decodeToUint8ArrayAsync(e,t);return V(r)}async decodeToUint8ArrayAsync(e,t){let r=await this.getAdapterAsync(),o=t?.checksum??this.defaultChecksum,s=t?.compress!==false,i=t?.encrypt!==false,a=e;this.reportProgress(t,{processedBytes:0,totalBytes:e.length,percent:0,stage:"start"});let c=t?.chunkSeparator??this.defaultChunkSeparator;a=Y(a,c),this.urlSafe&&(a=q(a));let d=null;if(o){let b=F(a);d=b.checksum,a=b.data;}this.shouldObfuscate(t)&&(a=this.getObfuscationLayer().deobfuscate(a));let{cleanedInput:l,paddingBits:h,compressionAlgorithm:f,isEncrypted:u,pipelineVersion:m}=H(a,this.paddingChar,this.effectiveBitLength);if(u&&i&&!this.encryptionKey)throw new Error("[Ddu64 decode] Encrypted payload requires an encryptionKey");this.assertEncodedInputAligned(l);let g=this.normalizeLimit(t?.maxDecodedBytes,this.defaultMaxDecodedBytes,true,"maxDecodedBytes"),p=this.estimateDecodedBytes(l.length,h);if(p>g)throw new Error(`[Ddu64 decode] Decoded output exceeds limit. Estimated: ${p} bytes, Limit: ${g} bytes`);this.reportProgress(t,{processedBytes:l.length,totalBytes:e.length,percent:30,stage:"decode"});let y=this.decodeChars(l,h);if(m===3&&u&&this.encryptionKey&&i){let b=await this.getKeyHashAsync(r);this.reportProgress(t,{processedBytes:y.length,totalBytes:y.length,percent:55,stage:"decrypt"}),y=await r.decrypt(y,b);}if(f&&s&&(m===2||!u||i)){let b=this.normalizeLimit(t?.maxDecompressedBytes,this.defaultMaxDecompressedBytes,true,"maxDecompressedBytes");if(f==="brotli"){if(!r.brotliDecompress)throw new Error("[Ddu64 decompress] Brotli decompression is unavailable in the current runtime.");this.reportProgress(t,{processedBytes:y.length,totalBytes:y.length,percent:70,stage:"decompress"}),y=await r.brotliDecompress(y,b);}else this.reportProgress(t,{processedBytes:y.length,totalBytes:y.length,percent:70,stage:"decompress"}),y=await r.inflate(y,b);}if(d&&(m===2||!u||i)){this.reportProgress(t,{processedBytes:y.length,totalBytes:y.length,percent:85,stage:"checksum"});let b=U(y);if(b!==d)throw new Error(`[Ddu64 decode] Checksum mismatch. Expected: ${d}, Got: ${b}`)}if(m===2&&u&&this.encryptionKey&&i){let b=await this.getKeyHashAsync(r);this.reportProgress(t,{processedBytes:y.length,totalBytes:y.length,percent:90,stage:"decrypt"}),y=await r.decrypt(y,b);}return this.reportProgress(t,{processedBytes:y.length,totalBytes:y.length,percent:100,stage:"done"}),y}getCharSetInfo(){return {charSet:[...this.dduChar],paddingChar:this.paddingChar,bitLength:this.bitLength,usePowerOfTwo:this.usePowerOfTwo,encoding:"utf-8",defaultCompress:this.defaultCompress,defaultMaxDecodedBytes:this.defaultMaxDecodedBytes,defaultMaxDecompressedBytes:this.defaultMaxDecompressedBytes,urlSafe:this.urlSafe,hasEncryptionKey:!!this.encryptionKey,defaultChecksum:this.defaultChecksum,defaultChunkSize:this.defaultChunkSize,defaultChunkSeparator:this.defaultChunkSeparator,defaultCompressionLevel:this.defaultCompressionLevel,defaultCompressionAlgorithm:this.defaultCompressionAlgorithm}}getStats(e,t){let o=(typeof e=="string"?_(e):e).length,{encoded:s,compressedSize:i}=this.encodeInternal(e,t),a=s.length,c=o>0?a/o:0,l=(t?.compress??this.defaultCompress)&&i!==void 0&&o>0?i/o:void 0;return {originalSize:o,encodedSize:a,compressedSize:i,compressionRatio:l,expansionRatio:c,charsetSize:this.dduChar.length,bitLength:this.bitLength}}static setWorkerPoolSize(e){J(e);}encodeInternal(e,t){let r=t?.compress??this.defaultCompress,o=t?.checksum??this.defaultChecksum,s=(t?.encrypt??true)&&!!this.encryptionKey,i=t?.chunkSize??this.defaultChunkSize,a=t?.chunkSeparator??this.defaultChunkSeparator,c=typeof e=="string"?_(e):e;this.reportProgress(t,{processedBytes:0,totalBytes:c.length,percent:0,stage:"start"});let d="";o&&(d=U(c));let l,h;if(r){let m=t?.compressionAlgorithm??this.defaultCompressionAlgorithm,g=R(t?.compressionLevel??this.defaultCompressionLevel,m);this.reportProgress(t,{processedBytes:c.length,totalBytes:c.length,percent:20,stage:"compress"});let p=this.compressSync(c,m,g);h=p.length,p.length<c.length&&(c=p,l=m);}let f=false;s&&(this.reportProgress(t,{processedBytes:c.length,totalBytes:c.length,percent:45,stage:"encrypt"}),c=this.encryptSync(c),f=true),this.reportProgress(t,{processedBytes:c.length,totalBytes:c.length,percent:70,stage:"encode"});let u=this.encodeBytes(c,l,f,t);return u=this.applyPostEncoding(u,t,d,o,i,a),this.reportProgress(t,{processedBytes:c.length,totalBytes:c.length,percent:100,stage:"done"}),{encoded:u,compressedSize:h}}applyPostEncoding(e,t,r,o,s,i){let a=e;return this.shouldObfuscate(t)&&(a=this.getObfuscationLayer().obfuscate(a)),o&&r&&(a=a+"CHK"+r),this.urlSafe&&(a=he(a)),s&&s>0&&(a=fe(a,s,i)),a}encodeBytes(e,t,r,o){if(e.length===0)return "";let s=this.encodeBytesWithNativeBase64(e),i,a;if(s)i=s.indices,a=s.paddingBits;else {let l=this.shouldUseWasm(e.length)?O():null;if(l?.ready&&this.usePowerOfTwo){let h=l.encode(e,this.bitLength);i=h.indices,a=h.paddingBits;}else {let h=ae(e,this.bitPackConfig);i=h.indices,a=h.paddingBits;}}let c=new Array(i.length);for(let l=0;l<i.length;l++)c[l]=this.dduChar[i[l]];let d=o?.omitFooter?"":ue({paddingBits:a,compressionAlgorithm:t,isEncrypted:!!r,paddingChar:this.paddingChar,useRepeatPadding:this.useRepeatPadding&&!t&&!r,pipelineVersion:r?3:2});return c.join("")+d}decodeChars(e,t){let r=e.length;if(r===0)return new Uint8Array(0);let o=this.decodeCharsWithNativeBase64(e,t);if(o)return o;let s=r>=this.wasmThreshold||r>=4096?new Uint16Array(r):new Array(r);for(let a=0;a<r;a++){let c=e[a],d=this.dduBinaryLookup.get(c);if(d===void 0)throw new Error(`[Ddu64 decode] Invalid character "${c}" at ${a}`);s[a]=d;}let i=this.shouldUseWasm(r)?O():null;if(i?.ready&&this.usePowerOfTwo){let a=s instanceof Uint16Array?s:Uint16Array.from(s);return i.decode(a,this.bitLength,t)}return ce(s,t,this.bitPackConfig)}encodeBytesWithNativeBase64(e){if(!this.canUseNativeBase64)return null;let t=this.bytesToBase64(e);if(t===null)return null;let r=0,o=t.length;for(;o>0&&t[o-1]===Me;)r++,o--;let s=o>=4096?new Uint16Array(o):new Array(o);for(let i=0;i<o;i++)s[i]=_t[t[i]];return {indices:s,paddingBits:r===2?4:r===1?2:0}}decodeCharsWithNativeBase64(e,t){if(!this.canUseNativeBase64||!this.nativeDecodeMap)return null;let r=t===4?2:t===2?1:t===0?0:-1;if(r<0)return null;let o=new Array(e.length+r);for(let s=0;s<e.length;s++){let i=this.nativeDecodeMap.get(e[s]);if(i===void 0)return null;o[s]=i;}for(let s=0;s<r;s++)o[e.length+s]=Me;return this.base64ToBytes(o.join(""))}bytesToBase64(e){let t=e.toBase64;if(typeof t=="function")return t.call(e);let r=globalThis.Buffer;return r?.from?r.from(e.buffer,e.byteOffset,e.byteLength).toString("base64"):null}base64ToBytes(e){let t=Uint8Array;if(typeof t.fromBase64=="function")return t.fromBase64(e);let r=globalThis.Buffer;if(r?.from){let o=r.from(e,"base64");return new Uint8Array(o.buffer,o.byteOffset,o.byteLength)}return null}shouldUseWasm(e){return e>=this.wasmThreshold}reportProgress(e,t){e?.onProgress?.(t);}requireSyncAdapter(){if(!this.adapter)throw new Error("[Ddu64 adapter] No platform adapter available. Use encodeAsync()/decodeAsync() in browser environments, or provide an adapter via options.adapter.");return this.adapter}encryptSync(e){let t=this.requireSyncAdapter();if(!t.encryptSync)throw new Error("[Ddu64 encrypt] Sync encryption unavailable. Use encodeAsync() in browser environments.");if(!this.encryptionKeyHash){if(!t.deriveKeySync)throw new Error("[Ddu64 encrypt] Sync key derivation unavailable. Use encodeAsync() in browser environments.");this.encryptionKeyHash=t.deriveKeySync(this.encryptionKey,this.keyDerivation);}return t.encryptSync(e,this.encryptionKeyHash)}decryptSync(e){let t=this.requireSyncAdapter();if(!t.decryptSync)throw new Error("[Ddu64 decrypt] Sync decryption unavailable. Use decodeAsync() in browser environments.");if(!this.encryptionKeyHash){if(!t.deriveKeySync)throw new Error("[Ddu64 decrypt] Sync key derivation unavailable. Use decodeAsync() in browser environments.");this.encryptionKeyHash=t.deriveKeySync(this.encryptionKey,this.keyDerivation);}return t.decryptSync(e,this.encryptionKeyHash)}compressSync(e,t,r){let o=this.requireSyncAdapter();if(t==="brotli"){if(!o.brotliCompressSync)throw new Error("[Ddu64 compress] Brotli compression is unavailable in the current runtime.");return o.brotliCompressSync(e,r)}if(!o.deflateSync)throw new Error("[Ddu64 compress] Sync compression unavailable. Use encodeAsync() in browser environments.");return o.deflateSync(e,r)}decompressSync(e,t,r){let o=this.requireSyncAdapter();if(t==="brotli"){if(!o.brotliDecompressSync)throw new Error("[Ddu64 decompress] Brotli decompression is unavailable in the current runtime.");return o.brotliDecompressSync(e,r)}if(!o.inflateSync)throw new Error("[Ddu64 decompress] Sync decompression unavailable. Use decodeAsync() in browser environments.");return o.inflateSync(e,r)}async getAdapterAsync(){if(this.adapter)return this.adapter;let{getAdapter:e}=await Promise.resolve().then(()=>(oe(),Oe));return this.adapter=await e(),this.adapter}async getKeyHashAsync(e){return this.encryptionKeyHash?this.encryptionKeyHash:(this.encryptionKeyHash=await e.deriveKey(this.encryptionKey,this.keyDerivation),this.encryptionKeyHash)}getObfuscationLayer(){if(!this._obfuscationLayer){let e=new Set(this.dduChar);e.add(this.paddingChar);let t="ELYSIAGRONCV01234567";for(let o of t)e.add(o);let r=[...e];this._obfuscationLayer=new C(r);}return this._obfuscationLayer}shouldObfuscate(e){let t=e?.obfuscate??this.defaultObfuscate;if(t&&!this.encryptionKey)throw new Error("[Ddu64 obfuscation] Obfuscation requires encryption to be enabled.");return t}normalizeLimit(e,t,r,o){if(e===void 0)return t;if(e===Number.POSITIVE_INFINITY)return Number.POSITIVE_INFINITY;if(!Number.isFinite(e)||e<=0){if(r)throw new Error(`[Ddu64 options] Invalid ${o}. Must be a positive finite number or Infinity.`);return t}return Math.floor(e)}estimateDecodedBytes(e,t){if(e===0)return 0;if(t<0||t>=this.effectiveBitLength)throw new Error(`[Ddu64 decode] Invalid padding bits: ${t}`);let r=this.usePowerOfTwo?1:2,s=Math.ceil(e/r)*this.effectiveBitLength-t;if(s<0)throw new Error("[Ddu64 decode] Invalid decoded bit length");return Math.ceil(s/xt)}assertEncodedInputAligned(e){if(!this.usePowerOfTwo&&e.length%2!==0)throw new Error(`[Ddu64 decode] Invalid encoded length for variable charset. Expected multiple of 2, got ${e.length}`)}};M();var K=class extends v{constructor(e,t,r){e!=null&&typeof e=="object"&&!Array.isArray(e)&&(r=e,e=void 0,t=void 0);let o={...r,adapter:r?.adapter??new exports.NodeAdapter};super(e,t,o);}decodeToBuffer(e,t){let r=this.decodeToUint8Array(e,t);return Buffer.from(r.buffer,r.byteOffset,r.byteLength)}async decodeToBufferAsync(e,t){let r=await this.decodeToUint8ArrayAsync(e,t);return Buffer.from(r.buffer,r.byteOffset,r.byteLength)}};var ie=class n{chars=[];constructor(){}static create(){return new n}static fromUnicodeRange(e,t){return new n().addUnicodeRange(e,t)}static fromString(e){return new n().addString(e)}static base64(){return new n().addString("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")}static base32(){return new n().addString("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567")}static uppercase(){return n.fromUnicodeRange(65,90)}static lowercase(){return n.fromUnicodeRange(97,122)}static digits(){return n.fromUnicodeRange(48,57)}static hangulJamo(){return new n().addUnicodeRange(4352,4370).addUnicodeRange(4449,4469).addUnicodeRange(4520,4546)}addUnicodeRange(e,t){for(let r=e;r<=t;r++)this.chars.push(String.fromCodePoint(r));return this}addString(e){return typeof e=="string"?this.chars.push(...e):this.chars.push(...e),this}add(...e){return this.chars.push(...e),this}excludeConfusing(){let e=new Set(["0","O","o","1","l","I","i","|","L"]);return this.chars=this.chars.filter(t=>!e.has(t)),this}exclude(...e){let t=new Set(e);return this.chars=this.chars.filter(r=>!t.has(r)),this}excludeUrlUnsafe(){let e=new Set(["+","/","=","?","&","#","%"," "]);return this.chars=this.chars.filter(t=>!e.has(t)),this}unique(){return this.chars=[...new Set(this.chars)],this}shuffle(e){let t=e!==void 0?this.seededRandom(e):Math.random;for(let r=this.chars.length-1;r>0;r--){let o=Math.floor(t()*(r+1));[this.chars[r],this.chars[o]]=[this.chars[o],this.chars[r]];}return this}seededRandom(e){let t=e|0||1;return ()=>(t^=t<<13,t^=t>>17,t^=t<<5,(t>>>0)/4294967296)}limit(e){return this.chars=this.chars.slice(0,e),this}limitToPowerOfTwo(){let e=this.chars.length;if(e===0)return this;let t=1<<Math.floor(Math.log2(e));return this.chars=this.chars.slice(0,t),this}sort(){return this.chars.sort(),this}reverse(){return this.chars.reverse(),this}get length(){return this.chars.length}buildString(){return this.chars.join("")}build(){return [...this.chars]}buildWithPadding(e){let t=[...this.chars],r=e;if(!r){let o=["=",".","_","-","~","!"];for(let s of o)if(!t.includes(s)){r=s;break}if(!r)throw new Error("Cannot find suitable padding character")}return {charset:t,padding:r}}};function It(n,e){let t=n.getCharSetInfo(),r=e?.compress??t.defaultCompress,o=(e?.encrypt??true)&&t.hasEncryptionKey,s=r?e?.compressionAlgorithm??t.defaultCompressionAlgorithm:void 0,i=t.paddingChar,a=!r&&!o,c=false,d=[],l=0,h=null;return new TransformStream({async transform(f,u){if(a){if(!c){let b=x(i,{compressionAlgorithm:void 0,encrypted:false});u.enqueue(b),c=true;}let m;h&&h.length>0?(m=new Uint8Array(h.length+f.length),m.set(h,0),m.set(f,h.length)):m=f;let g=t.bitLength,p=Ne(g,8)/8,y=Math.floor(m.length/p)*p;if(y>0){let b=m.subarray(0,y),L=await n.encodeAsync(b,{compress:false,encrypt:false,checksum:false,chunkSize:void 0,chunkSeparator:void 0,omitFooter:true});u.enqueue(L);}y<m.length?h=m.slice(y):h=null;}else d.push(f),l+=f.length;},async flush(f){try{if(a){if(!c){let u=x(i,{compressionAlgorithm:void 0,encrypted:!1});f.enqueue(u);}if(h&&h.length>0){let u=await n.encodeAsync(h,{compress:!1,encrypt:!1,checksum:!1,chunkSize:void 0,chunkSeparator:void 0});f.enqueue(u);}h=null;}else {let u=x(i,{compressionAlgorithm:s,encrypted:o});if(f.enqueue(u),l>0){let m=new Uint8Array(l),g=0;for(let y of d)m.set(y,g),g+=y.length;let p=await n.encodeAsync(m,{...e,compress:r,encrypt:o,checksum:!1,chunkSize:void 0,chunkSeparator:void 0});f.enqueue(p);}d=[],l=0;}}catch(u){f.error(u instanceof Error?u:new Error(String(u)));}}})}function Ot(n,e){let t=n.getCharSetInfo(),r=t.paddingChar,o=$(r),s="",i=false,a=null,c=false;return new TransformStream({async transform(d,l){if(s+=d,!i&&s.length>=o){if(!s.startsWith(r)){l.error(new Error("[WebStreams decode] Invalid or missing stream header"));return}if(a=le(s,r),a===null){l.error(new Error("[WebStreams decode] Invalid or missing stream header"));return}if(a.encrypted&&!t.hasEncryptionKey){l.error(new Error("[WebStreams decode] Encrypted stream requires an encryptionKey"));return}i=true,c=!a.compressionAlgorithm&&!a.encrypted,s=s.slice(o);}if(i&&c&&s.length>0){let h=t.bitLength,f=Ne(h,8)/h,u=Math.floor(s.length/f)*f;if(u>0){let m=s.slice(0,u);s=s.slice(u);try{let g=await n.decodeToUint8ArrayAsync(m,{compress:!1,encrypt:!1,checksum:!1,chunkSize:void 0,chunkSeparator:void 0});g.length>0&&l.enqueue(g);}catch{s=m+s;}}}},async flush(d){try{if(!i){if(s.length===0)return;d.error(new Error("[WebStreams decode] Incomplete stream header"));return}if(s.length===0)return;let l=a.compressionAlgorithm,h=a.encrypted,f=await n.decodeToUint8ArrayAsync(s,{...e,compress:!!l,compressionAlgorithm:l,encrypt:h,checksum:!1,chunkSize:void 0,chunkSeparator:void 0});f.length>0&&d.enqueue(f),s="";}catch(l){d.error(l instanceof Error?l:new Error(String(l)));}}})}function Ne(n,e){return n*e/Mt(n,e)}function Mt(n,e){for(;e!==0;){let t=e;e=n%e,n=t;}return n}M();re();oe();exports.CharsetBuilder=ie;exports.Ddu64=K;exports.Ddu64Core=v;exports.Ddu64Node=K;exports.DduSetSymbol=j;exports.HangulObfuscationLayer=C;exports.createObfuscationLayer=st;exports.createReadableDecodeStream=Ot;exports.createReadableEncodeStream=It;exports.detectRuntime=ne;exports.getAdapter=Ie;exports.getWasmCodec=lt;exports.getWasmCodecSync=O;exports.preloadWasm=dt;exports.setWorkerPoolSize=J;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var chunkWS6GB27C_cjs=require('./chunk-WS6GB27C.cjs'),chunkFACJ5LAG_cjs=require('./chunk-FACJ5LAG.cjs'),chunkRFBXQWSA_cjs=require('./chunk-RFBXQWSA.cjs'),chunkRHVBUC4T_cjs=require('./chunk-RHVBUC4T.cjs');require('./chunk-NY4FGVF3.cjs');var promises=require('fs/promises'),path=require('path'),url=require('url');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var d=class extends chunkFACJ5LAG_cjs.B{constructor(r,t,e){let s=chunkFACJ5LAG_cjs.x(r,t,e),C={...s.dduOptions,adapter:s.dduOptions?.adapter??new chunkRHVBUC4T_cjs.a};super(s.dduChar,s.paddingChar,C);}decodeToBuffer(r,t){let e=this.decodeToUint8Array(r,t);return Buffer.from(e.buffer,e.byteOffset,e.byteLength)}async decodeToBufferAsync(r,t){let e=await this.decodeToUint8ArrayAsync(r,t);return Buffer.from(e.buffer,e.byteOffset,e.byteLength)}};async function M(){let o=chunkWS6GB27C_cjs.a();switch(o){case "node":{let{NodeAdapter:r}=await import('./NodeAdapter-DS44MI5D.cjs');return new r}case "deno":case "bun":case "browser":case "edge":{let{BrowserAdapter:r}=await import('./BrowserAdapter-LIUL744V.cjs');return new r(o)}default:throw new Error("[ddunigma] No suitable crypto provider found. Detected runtime lacks both Node.js crypto module and Web Crypto API (SubtleCrypto).")}}var D=false;async function V(o){try{let r=await promises.readFile(o);return r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength)}catch{return null}}async function X(){let o=path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))),r=[path.join(o,"wasm","codec.wasm"),path.join(o,"codec.wasm"),path.join(o,"..","wasm","codec.wasm")];for(let t of r){let e=await V(t);if(e)return e}return null}function i(){D||(chunkFACJ5LAG_cjs.g(X),D=true);}async function q(){return i(),chunkFACJ5LAG_cjs.d()}function z(){return i(),chunkFACJ5LAG_cjs.e()}function G(){return i(),chunkFACJ5LAG_cjs.f()}Object.defineProperty(exports,"createReadableDecodeStream",{enumerable:true,get:function(){return chunkWS6GB27C_cjs.c}});Object.defineProperty(exports,"createReadableEncodeStream",{enumerable:true,get:function(){return chunkWS6GB27C_cjs.b}});Object.defineProperty(exports,"detectRuntime",{enumerable:true,get:function(){return chunkWS6GB27C_cjs.a}});Object.defineProperty(exports,"CharsetBuilder",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.C}});Object.defineProperty(exports,"Ddu64AdapterError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.s}});Object.defineProperty(exports,"Ddu64CharsetError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.q}});Object.defineProperty(exports,"Ddu64ChecksumError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.p}});Object.defineProperty(exports,"Ddu64CompressionError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.l}});Object.defineProperty(exports,"Ddu64Core",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.B}});Object.defineProperty(exports,"Ddu64DecodeError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.k}});Object.defineProperty(exports,"Ddu64DecompressionError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.m}});Object.defineProperty(exports,"Ddu64DecryptionError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.o}});Object.defineProperty(exports,"Ddu64EncodeError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.j}});Object.defineProperty(exports,"Ddu64EncryptionError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.n}});Object.defineProperty(exports,"Ddu64Error",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.i}});Object.defineProperty(exports,"Ddu64ErrorCode",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.h}});Object.defineProperty(exports,"Ddu64LimitError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.r}});Object.defineProperty(exports,"Ddu64ObfuscationError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.t}});Object.defineProperty(exports,"Ddu64StreamError",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.u}});Object.defineProperty(exports,"DduSetSymbol",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.a}});Object.defineProperty(exports,"HangulObfuscationLayer",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.b}});Object.defineProperty(exports,"createObfuscationLayer",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.c}});Object.defineProperty(exports,"isDdu64Error",{enumerable:true,get:function(){return chunkFACJ5LAG_cjs.v}});Object.defineProperty(exports,"BrowserAdapter",{enumerable:true,get:function(){return chunkRFBXQWSA_cjs.a}});Object.defineProperty(exports,"NodeAdapter",{enumerable:true,get:function(){return chunkRHVBUC4T_cjs.a}});exports.Ddu64=d;exports.Ddu64Node=d;exports.getAdapter=M;exports.getWasmCodec=z;exports.getWasmCodecSync=G;exports.preloadWasm=q;//# sourceMappingURL=index.cjs.map
7
2
  //# sourceMappingURL=index.cjs.map