@ddunigma/node 3.1.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +107 -281
  2. package/dist/BrowserAdapter-HORDDCOE.js +2 -0
  3. package/dist/BrowserAdapter-PB4J6FHX.cjs +2 -0
  4. package/dist/NodeAdapter-5FBNCJSG.js +2 -0
  5. package/dist/NodeAdapter-EQ73FGEJ.cjs +2 -0
  6. package/dist/{ObfuscationLayer-D-xl5d7P.d.ts → ObfuscationLayer-BDr-0s1M.d.ts} +31 -15
  7. package/dist/{ObfuscationLayer-DAVKTnHf.d.cts → ObfuscationLayer-BgL73E5F.d.cts} +31 -15
  8. package/dist/browser.cjs +1 -1
  9. package/dist/browser.d.cts +5 -4
  10. package/dist/browser.d.ts +5 -4
  11. package/dist/browser.js +1 -1
  12. package/dist/chunk-5NSHXTMN.cjs +2 -0
  13. package/dist/chunk-7RWUNW5S.js +2 -0
  14. package/dist/chunk-AMOZHHMB.cjs +2 -0
  15. package/dist/chunk-CQATQOBZ.js +2 -0
  16. package/dist/chunk-HTZT725P.js +10 -0
  17. package/dist/chunk-HZJ7PU7X.cjs +2 -0
  18. package/dist/chunk-KS6PRP5Y.js +2 -0
  19. package/dist/chunk-OQXMQIE3.js +2 -0
  20. package/dist/chunk-UMA4JEN4.cjs +10 -0
  21. package/dist/chunk-WCXD5LRF.cjs +2 -0
  22. package/dist/core.cjs +1 -1
  23. package/dist/core.d.cts +40 -1
  24. package/dist/core.d.ts +40 -1
  25. package/dist/core.js +1 -1
  26. package/dist/{core-DYSnygnp.d.cts → errors-DNICpo4L.d.cts} +188 -139
  27. package/dist/{core-DYSnygnp.d.ts → errors-DNICpo4L.d.ts} +188 -139
  28. package/dist/index.cjs +1 -1
  29. package/dist/index.d.cts +23 -8
  30. package/dist/index.d.ts +23 -8
  31. package/dist/index.js +1 -1
  32. package/dist/wasm/codec.wasm +0 -0
  33. package/package.json +46 -5
  34. package/dist/BrowserAdapter-BHHWPUTB.js +0 -2
  35. package/dist/BrowserAdapter-M7PUHVGS.cjs +0 -2
  36. package/dist/NodeAdapter-JB2EZ3T4.js +0 -2
  37. package/dist/NodeAdapter-JRRSYUJT.cjs +0 -2
  38. package/dist/chunk-5RZDTEOZ.js +0 -2
  39. package/dist/chunk-JUBMOKKH.js +0 -2
  40. package/dist/chunk-JZSHJ6KN.cjs +0 -9
  41. package/dist/chunk-KEWLOPEV.js +0 -9
  42. package/dist/chunk-M6LY6DIE.js +0 -2
  43. package/dist/chunk-NFMYVNOG.cjs +0 -2
  44. package/dist/chunk-NY4FGVF3.cjs +0 -2
  45. package/dist/chunk-PHMARSJE.cjs +0 -2
  46. package/dist/chunk-QR43FNIY.js +0 -2
  47. package/dist/chunk-TJTDYO65.cjs +0 -2
@@ -9,6 +9,11 @@ declare enum DduSetSymbol {
9
9
  DDU_V1 = "ddu_v1",
10
10
  ONECHARSET = "oneCharSet"
11
11
  }
12
+ /**
13
+ * @deprecated ddunigma runtime string encode/decode paths are UTF-8 based.
14
+ * This union remains for legacy type compatibility and `CharSetInfo.encoding`
15
+ * metadata only; non-UTF-8 values do not change runtime text conversion.
16
+ */
12
17
  type DduTextEncoding = "utf-8" | "utf8" | "latin1" | "ascii" | "base64" | "base64url" | "hex" | "binary" | "ucs2" | "ucs-2" | "utf16le" | "utf-16le";
13
18
  interface EncodingProfile {
14
19
  /** 논리 심볼당 비트 수 */
@@ -63,6 +68,12 @@ interface CharSetInfo {
63
68
  hasEncryptionKey: boolean;
64
69
  /** 기본 체크섬 사용 여부 */
65
70
  defaultChecksum: boolean;
71
+ /** 기본 체크섬 계산 범위 (5.0: "output") */
72
+ defaultChecksumScope: "plaintext" | "output";
73
+ /** 기본 난독화 사용 여부 */
74
+ defaultObfuscate: boolean;
75
+ /** WASM 사용 임계값 (바이트) */
76
+ wasmThreshold: number;
66
77
  /** 기본 청크 크기 */
67
78
  defaultChunkSize: number | undefined;
68
79
  /** 기본 청크 구분자 */
@@ -103,12 +114,13 @@ interface DduEncodeStats {
103
114
  type KeyDerivationAlgorithm = "sha256" | "pbkdf2";
104
115
  interface KeyDerivationOptions {
105
116
  /**
106
- * Key derivation algorithm. Defaults to `sha256` for legacy compatibility.
117
+ * Key derivation algorithm. Defaults to `pbkdf2` (5.0).
107
118
  *
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.
119
+ * ⚠️ Migration: 4.x defaulted to `sha256`. Data encrypted with 4.x defaults must be decrypted with
120
+ * `algorithm: "sha256"` explicitly (key derivation is NOT self-described in the wire format).
121
+ * For low-entropy keys (human passwords), keep the `pbkdf2` default and provide an
122
+ * application-specific `salt`. Use `sha256` only for high-entropy keys (e.g. 32 random bytes) or
123
+ * legacy data compatibility.
112
124
  */
113
125
  algorithm?: KeyDerivationAlgorithm;
114
126
  /**
@@ -125,7 +137,11 @@ interface KeyDerivationOptions {
125
137
  interface DduOptions {
126
138
  /** 압축 사용 여부 (zlib deflate 또는 brotli) */
127
139
  compress?: boolean;
128
- /** 내부 암/복호화 사용 여부 (기본값: true, 스트림 파이프라인 내부 제어용) */
140
+ /**
141
+ * 내부 암/복호화 사용 여부 (기본값: true, 스트림 파이프라인 내부 제어용).
142
+ * @internal 일반 사용자는 `encryptionKey`로 암호화를 제어하세요. 이 플래그는
143
+ * 스트림/내부 파이프라인 전용이며 향후 공개 옵션에서 분리될 수 있습니다.
144
+ */
129
145
  encrypt?: boolean;
130
146
  /** 압축 알고리즘 (기본값: "deflate") */
131
147
  compressionAlgorithm?: "deflate" | "brotli";
@@ -137,11 +153,23 @@ interface DduOptions {
137
153
  maxDecompressedBytes?: number;
138
154
  /** 체크섬 추가 여부 (CRC32) */
139
155
  checksum?: boolean;
156
+ /**
157
+ * 체크섬 계산 범위 (기본값: "output").
158
+ * - `"plaintext"`: 원본 입력 바이트의 CRC32 (레거시 범위). 암호화와 함께 쓰면 평문 CRC가 출력에 노출됩니다.
159
+ * - `"output"`: 인코딩 파이프라인 최종 바이트(압축/암호화 후, 와이어에 실리는 바이트)의 CRC32.
160
+ * 암호화 시 평문 CRC를 노출하지 않고, 복호화 이전에 전송 손상을 감지합니다.
161
+ *
162
+ * `checksum`과 마찬가지로 와이어에 자기기술 플래그가 없으므로 인코딩/디코딩에서 동일하게 지정해야 합니다.
163
+ */
164
+ checksumScope?: "plaintext" | "output";
140
165
  /** 청크 분할 크기 */
141
166
  chunkSize?: number;
142
167
  /** 청크 구분자 (기본값: '\n') */
143
168
  chunkSeparator?: string;
144
- /** 중간 스트림 청크처럼 푸터를 생략해야 할 때 사용 */
169
+ /**
170
+ * 중간 스트림 청크처럼 푸터를 생략해야 할 때 사용.
171
+ * @internal 스트림 인코딩 내부 전용 플래그이며 향후 공개 옵션에서 분리될 수 있습니다.
172
+ */
145
173
  omitFooter?: boolean;
146
174
  /** 진행률 콜백 */
147
175
  onProgress?: (info: DduProgressInfo) => void;
@@ -151,6 +179,12 @@ interface DduOptions {
151
179
  interface DduConstructorOptions extends DduOptions {
152
180
  /** 미리 정의된 charset 심볼 */
153
181
  dduSetSymbol?: DduSetSymbol;
182
+ /**
183
+ * @deprecated Runtime string encode/decode paths are always UTF-8 based.
184
+ * This option is accepted for legacy type compatibility only and has no
185
+ * runtime effect.
186
+ */
187
+ encoding?: DduTextEncoding;
154
188
  /** 커스텀 charset 문자 배열 또는 문자열 */
155
189
  dduChar?: string[] | string;
156
190
  /** 종성 문자 배열 (dduChar × codaChar 조합으로 최종 charset 동적 생성) */
@@ -159,23 +193,14 @@ interface DduConstructorOptions extends DduOptions {
159
193
  paddingChar?: string;
160
194
  /** 필요 문자 수 */
161
195
  requiredLength?: number;
162
- /**
163
- * 비트 길이.
164
- * @deprecated 무시되는 옵션입니다. 심볼당 비트 수는 charset 길이에서 자동 계산됩니다.
165
- */
166
- bitLength?: number;
167
196
  /** 2의 제곱수 강제 여부 */
168
197
  usePowerOfTwo?: boolean;
169
198
  /**
170
199
  * true이면 초기화 오류 시 throw합니다. false이면 fallback charset으로 대체합니다.
171
- * @default false
172
- * @deprecated throwOnError를 사용하세요. 옵션은 하위 호환성을 위해 유지됩니다.
173
- */
174
- useBuildErrorReturn?: boolean;
175
- /**
176
- * true이면 초기화 오류 시 throw합니다. false이면 fallback charset으로 대체합니다.
177
- * useBuildErrorReturn과 동일한 동작이며, 둘 다 지정 시 throwOnError가 우선합니다.
178
- * @default false
200
+ *
201
+ * ⚠️ 5.0 변경: 기본값이 `false` `true`로 전환되었습니다. 잘못된 커스텀 charset에
202
+ * 더 엄격하게 동작하며, 레거시의 묵시적 fallback 동작이 필요하면 `false`를 명시하세요.
203
+ * @default true
179
204
  */
180
205
  throwOnError?: boolean;
181
206
  /** URL-Safe 모드 (특수문자를 URL 안전 문자로 변환) */
@@ -188,7 +213,7 @@ interface DduConstructorOptions extends DduOptions {
188
213
  useRepeatPadding?: boolean;
189
214
  /** 명시적 플랫폼 어댑터 (자동 감지 대신 사용) */
190
215
  adapter?: PlatformAdapter;
191
- /** WASM 임계값 (바이트 단위, 기본값: 4096, 범위: 1024-1048576) */
216
+ /** WASM 임계값 (바이트 단위, 기본값: 16384, 범위: 1024-1048576, Infinity면 비활성화) */
192
217
  wasmThreshold?: number;
193
218
  }
194
219
  /**
@@ -204,13 +229,13 @@ interface PlatformAdapter {
204
229
  /** 동기적으로 256비트 키를 파생 (Node.js 전용) */
205
230
  deriveKeySync?(key: string, options?: KeyDerivationOptions): Uint8Array;
206
231
  /** AES-256-GCM으로 데이터를 암호화. IV(12) + authTag(16) + 암호문을 반환 */
207
- encrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
232
+ encrypt(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
208
233
  /** 동기적으로 데이터를 암호화 (Node.js 전용) */
209
- encryptSync?(data: Uint8Array, keyHash: Uint8Array): Uint8Array;
234
+ encryptSync?(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Uint8Array;
210
235
  /** AES-256-GCM 페이로드를 복호화. IV(12) + authTag(16) + 암호문 형식을 기대 */
211
- decrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
236
+ decrypt(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
212
237
  /** 동기적으로 데이터를 복호화 (Node.js 전용) */
213
- decryptSync?(data: Uint8Array, keyHash: Uint8Array): Uint8Array;
238
+ decryptSync?(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Uint8Array;
214
239
  /** 암호학적으로 안전한 랜덤 바이트를 생성 */
215
240
  randomBytes(length: number): Uint8Array;
216
241
  /** deflate 알고리즘으로 데이터를 압축 */
@@ -269,54 +294,6 @@ interface ObfuscationLayer {
269
294
  */
270
295
  deobfuscate(input: string): string;
271
296
  }
272
- /**
273
- * 크로스 플랫폼 인코딩 호환성 및 와이어 포맷 적합성을 검증하기 위한
274
- * 표준화된 테스트 벡터 형식.
275
- */
276
- interface TestVector {
277
- /** 이 테스트 벡터의 고유 식별자 */
278
- id: string;
279
- /** 이 벡터가 테스트하는 내용에 대한 설명 */
280
- description: string;
281
- /** 입력 데이터 명세 */
282
- input: {
283
- /** 16진수 인코딩된 입력 바이트 */
284
- raw: string;
285
- /** 원시 데이터의 인코딩 */
286
- encoding: "utf-8" | "binary";
287
- };
288
- /** 이 벡터의 charset 설정 */
289
- charset: {
290
- /** 프리셋 심볼 (내장 charset 사용 시) */
291
- preset?: DduSetSymbol;
292
- /** 커스텀 charset 문자 (프리셋 미사용 시) */
293
- dduChar?: string[];
294
- /** 조합 charset용 종성 문자 */
295
- codaChar?: string[];
296
- /** 패딩 문자 */
297
- paddingChar: string;
298
- };
299
- /** 인코딩 옵션 */
300
- options: {
301
- compress?: boolean;
302
- compressionAlgorithm?: "deflate" | "brotli";
303
- encrypt?: boolean;
304
- encryptionKey?: string;
305
- checksum?: boolean;
306
- urlSafe?: boolean;
307
- chunkSize?: number;
308
- useRepeatPadding?: boolean;
309
- };
310
- /** 기대 출력 */
311
- expected: {
312
- /** 기대되는 인코딩 문자열 */
313
- encoded: string;
314
- /** 바이너리 비교를 위한 16진수 표현 */
315
- encodedHex?: string;
316
- };
317
- /** 테스트 벡터 분류 태그 */
318
- tags: string[];
319
- }
320
297
 
321
298
  /**
322
299
  * 플랫폼 독립 Ddu64 인코더/디코더 코어.
@@ -343,8 +320,6 @@ declare class Ddu64Core {
343
320
  protected readonly usePowerOfTwo: boolean;
344
321
  /** UTF-16 코드 유닛 → 인덱스 direct lookup (단일 BMP 심볼 전용) */
345
322
  private readonly dduCharCodeLookup;
346
- /** 미리 정의된 charset 사용 여부 */
347
- private readonly isPredefinedCharSet;
348
323
  /** 기본 압축 활성화 */
349
324
  protected readonly defaultCompress: boolean;
350
325
  /** 기본 최대 디코딩 바이트 수 */
@@ -359,8 +334,12 @@ declare class Ddu64Core {
359
334
  private readonly keyDerivation;
360
335
  /** 캐시된 암호화 키 해시 */
361
336
  private encryptionKeyHash;
337
+ /** 캐시된 어댑터 게이트웨이 컨텍스트 (호출당 재할당 방지, 해시는 getter로 라이브 조회) */
338
+ private syncGatewayContext;
362
339
  /** 기본 체크섬 활성화 */
363
340
  private readonly defaultChecksum;
341
+ /** 기본 체크섬 계산 범위 */
342
+ private readonly defaultChecksumScope;
364
343
  /** 기본 청크 크기 */
365
344
  private readonly defaultChunkSize;
366
345
  /** 기본 청크 구분자 */
@@ -379,12 +358,27 @@ declare class Ddu64Core {
379
358
  private readonly wasmThreshold;
380
359
  /** 표준 Base64 charset에서 네이티브 Base64 fast path 사용 여부 */
381
360
  private readonly canUseNativeBase64;
361
+ /** 인코딩/디코딩 payload codec 공유 컨텍스트 */
362
+ private readonly payloadCodecContext;
382
363
  /** 플랫폼 어댑터 (동기용 지연 로드 또는 명시적 제공) */
383
364
  private adapter;
384
365
  /** 기본 난독화 활성화 */
385
366
  private readonly defaultObfuscate;
386
367
  /** 지연 초기화되는 난독화 레이어 */
387
- private _obfuscationLayer;
368
+ private obfuscationLayer;
369
+ /**
370
+ * Ddu64 인코더/디코더를 생성합니다.
371
+ *
372
+ * 권장: 옵션 객체 단일 인자 형태 — `new Ddu64({ dduSetSymbol, compress, ... })`.
373
+ *
374
+ * 위치 인자 형태 `new Ddu64(dduChar, paddingChar, options)`는 커스텀 charset
375
+ * 지정용으로 계속 지원되지만, 가독성을 위해 옵션 객체 형태를 우선 권장합니다.
376
+ * (`new Ddu64(charset, padding, options)` 또는 `new Ddu64({ dduChar, paddingChar, ...options })`)
377
+ *
378
+ * @param dduChar - 커스텀 charset(문자열/배열) 또는 옵션 객체
379
+ * @param paddingChar - 패딩 문자 (커스텀 charset 사용 시 필수)
380
+ * @param dduOptions - 추가 옵션
381
+ */
388
382
  constructor(dduChar?: string[] | string | DduConstructorOptions, paddingChar?: string, dduOptions?: DduConstructorOptions);
389
383
  /**
390
384
  * 입력 데이터를 charset 인코딩 문자열로 인코딩합니다.
@@ -393,6 +387,7 @@ declare class Ddu64Core {
393
387
  * @param options - 인코딩 옵션
394
388
  * @returns 인코딩된 문자열
395
389
  * @throws 동기 암호화/압축이 필요하지만 어댑터가 지원하지 않는 경우
390
+ * @group Sync
396
391
  */
397
392
  encode(input: Uint8Array | string, options?: DduOptions): string;
398
393
  /**
@@ -401,6 +396,7 @@ declare class Ddu64Core {
401
396
  * @param input - 디코딩할 인코딩된 문자열
402
397
  * @param options - 디코딩 옵션
403
398
  * @returns 디코딩된 문자열
399
+ * @group Sync
404
400
  */
405
401
  decode(input: string, options?: DduOptions): string;
406
402
  /**
@@ -409,33 +405,78 @@ declare class Ddu64Core {
409
405
  * @param input - 디코딩할 인코딩된 문자열
410
406
  * @param options - 디코딩 옵션
411
407
  * @returns 디코딩된 바이트
408
+ * @group Sync
412
409
  */
413
410
  decodeToUint8Array(input: string, options?: DduOptions): Uint8Array;
411
+ private decodeToUint8ArrayInternal;
414
412
  /**
415
413
  * 비동기 인코딩 - 브라우저를 포함한 모든 런타임에서 동작합니다.
414
+ *
415
+ * @group Async
416
416
  */
417
417
  encodeAsync(input: Uint8Array | string, options?: DduOptions): Promise<string>;
418
+ private encodeAsyncInternal;
418
419
  /**
419
420
  * 비동기 디코딩 - 브라우저를 포함한 모든 런타임에서 동작합니다.
421
+ *
422
+ * @group Async
420
423
  */
421
424
  decodeAsync(input: string, options?: DduOptions): Promise<string>;
422
425
  /**
423
426
  * 비동기 Uint8Array 디코딩 - 브라우저를 포함한 모든 런타임에서 동작합니다.
427
+ *
428
+ * @group Async
424
429
  */
425
430
  decodeToUint8ArrayAsync(input: string, options?: DduOptions): Promise<Uint8Array>;
431
+ private decodeToUint8ArrayAsyncInternal;
432
+ /**
433
+ * 동기/비동기 디코딩 파이프라인이 공유하는 기본 컨텍스트를 구성합니다.
434
+ * decrypt/decompress만 동기/비동기 구현에서 각각 덧붙입니다.
435
+ */
436
+ private buildDecodeBaseContext;
426
437
  /**
427
438
  * charset 정보를 가져옵니다.
439
+ *
440
+ * @group Introspection
428
441
  */
429
442
  getCharSetInfo(): CharSetInfo;
430
443
  /**
431
444
  * 인코딩 통계를 가져옵니다.
445
+ *
446
+ * @group Introspection
432
447
  */
433
448
  getStats(input: Uint8Array | string, options?: DduOptions): DduEncodeStats;
449
+ /**
450
+ * 비동기 인코딩 통계를 가져옵니다.
451
+ *
452
+ * 브라우저/Workers처럼 압축이 비동기 API로만 제공되는 런타임에서는 `compress: true`
453
+ * 통계 계산에 이 메서드를 사용하세요.
454
+ *
455
+ * @group Introspection
456
+ */
457
+ getStatsAsync(input: Uint8Array | string, options?: DduOptions): Promise<DduEncodeStats>;
458
+ private buildEncodeStats;
434
459
  /**
435
460
  * 통계를 위한 메타데이터 포함 내부 인코딩.
436
461
  */
437
462
  private encodeInternal;
438
- private resolveEncodeSettings;
463
+ /**
464
+ * getStats 전용 인코딩: 실제 AES-GCM 연산을 생략하고 길이만 정확한 더미 암호화를 사용합니다.
465
+ *
466
+ * 암호화 출력 길이는 `평문 + AEAD_OVERHEAD_BYTES`로 결정적이고, 비트팩/푸터/체크섬/난독화/
467
+ * URL-safe/청킹은 모두 입력 바이트 "길이"에만 의존(바이트 "값"과 무관)하므로, 더미 암호문(0으로 채운
468
+ * 동일 길이 버퍼)으로 마무리해도 `encoded.length`는 실제 `encode()` 출력과 바이트 단위로 일치합니다.
469
+ * 압축은 결과 크기와 적용 여부 판단에 필요하므로 실제로 수행합니다.
470
+ *
471
+ * 이 등식(통계 길이 === 실제 encode 길이)은 property test로 고정됩니다.
472
+ */
473
+ private encodeStatsInternal;
474
+ private encodeStatsAsyncInternal;
475
+ /**
476
+ * 동기/비동기 인코딩 파이프라인이 공유하는 기본 컨텍스트를 구성합니다.
477
+ * compress/encrypt만 동기/비동기 구현에서 각각 덧붙입니다.
478
+ */
479
+ private buildEncodeBaseContext;
439
480
  /**
440
481
  * 인코딩 마무리: 비트팩 인코딩 + 후처리(난독화/체크섬/URL-safe/청킹).
441
482
  * 동기/비동기 인코딩에서 공유하는 순수 동기 단계입니다.
@@ -445,43 +486,19 @@ declare class Ddu64Core {
445
486
  * 인코딩 후처리: 난독화, 체크섬, URL-safe, 청킹을 적용합니다.
446
487
  */
447
488
  private applyPostEncoding;
448
- /**
449
- * BitPack + 푸터를 사용하여 바이트를 charset 문자열로 인코딩합니다.
450
- */
451
- private encodeBytes;
452
489
  /**
453
490
  * 디코딩 전처리: 동기/비동기 디코딩에서 공통으로 쓰는 순수 동기 단계.
454
491
  * 청크 제거 → URL-safe 역변환 → 체크섬 추출 → 역난독화 → 푸터 파싱 →
455
492
  * 검증(정렬/패딩/크기) → 비트팩 해제까지 수행합니다.
456
493
  */
457
494
  private decodePrelude;
458
- /**
459
- * 압축 해제 단계를 실행해야 하는지 결정합니다.
460
- * (압축 마커 존재 + 내부 압축 해제 허용 + 파이프라인 단계 조건)
461
- */
462
- private shouldDecompress;
463
- /**
464
- * 추출된 체크섬이 있으면 복원된 데이터의 CRC32와 비교 검증합니다.
465
- * 동기/비동기 디코딩에서 공유하는 순수 동기 단계입니다.
466
- */
467
- private verifyDecodedChecksum;
468
- /**
469
- * charset 문자열을 인덱스로 변환한 후 BitPack으로 바이트를 얻습니다.
470
- */
471
- private decodeChars;
472
- private encodeBytesWithNativeBase64;
473
- private decodeCharsWithNativeBase64;
474
- private bytesToBase64;
475
- private base64ToBytes;
476
- private shouldUseWasm;
495
+ private getPayloadCodecContext;
477
496
  private reportProgress;
478
- private requireSyncAdapter;
479
497
  private encryptSync;
480
498
  private decryptSync;
481
499
  private compressSync;
482
500
  private decompressSync;
483
- private getAdapterAsync;
484
- private getKeyHashAsync;
501
+ private getSyncGatewayContext;
485
502
  /**
486
503
  * 난독화 레이어를 가져오거나 생성합니다 (지연 초기화).
487
504
  * 알파벳에는 charset 문자, 패딩 문자, 모든 푸터 마커 문자가 포함됩니다.
@@ -493,12 +510,8 @@ declare class Ddu64Core {
493
510
  * 암호화 키 없이 난독화가 활성화되면 throw합니다.
494
511
  */
495
512
  private shouldObfuscate;
496
- private normalizeLimit;
497
513
  private assertSafeChunkSeparator;
498
514
  private isLineBreakSeparator;
499
- private estimateDecodedBytes;
500
- private assertEncodedInputAligned;
501
- private assertCanonicalPadding;
502
515
  }
503
516
 
504
517
  /**
@@ -634,39 +647,75 @@ declare class CharsetBuilder {
634
647
  }
635
648
 
636
649
  /**
637
- * ddunigma 비트 패킹 가속을 위한 WASM 로더 및 통합.
638
- *
639
- * 순수 JavaScript 구현과 바이트 단위로 동일한 선택적 WASM 가속
640
- * 인코딩/디코딩을 제공합니다. WASM을 사용할 수 없거나 실패하면
641
- * 조용히 JS로 폴백합니다.
642
- *
643
- * @module wasm/WasmCodec
644
- */
645
-
646
- /**
647
- * WASM 모듈을 사전 로드하고 초기화합니다.
648
- *
649
- * 첫 번째 인코딩/디코딩 연산 전에 WASM이 준비되도록 애플리케이션 초기에
650
- * 호출하세요. WASM이 초기화되면 resolve되고, 10초 내에 초기화에 실패하면
651
- * reject됩니다.
652
- *
653
- * @throws WASM 초기화가 실패하거나 타임아웃(10초)된 경우 에러
654
- */
655
- declare function preloadWasm(): Promise<void>;
656
- /**
657
- * WASM 코덱이 준비되었으면 반환하거나, 온디맨드 초기화를 시도합니다.
650
+ * ddunigma custom error hierarchy.
658
651
  *
659
- * `preloadWasm()`이 호출되지 않았으면 5초 타임아웃으로 초기화를 시도합니다.
660
- * WASM을 사용할 없으면 null을 반환합니다.
652
+ * Public encode/decode APIs wrap internal/runtime failures in these typed
653
+ * errors so callers can branch on a stable code without parsing messages.
661
654
  *
662
- * 함수는 throw하지 않음 — 실패 시 null을 반환합니다.
663
- */
664
- declare function getWasmCodec(): WasmCodec | null;
665
- /**
666
- * WASM 코덱이 이미 초기화된 경우에만 반환합니다.
667
- * 온디맨드 초기화를 트리거하지 않습니다.
668
- * WASM이 준비되지 않았으면 null을 반환합니다.
655
+ * @module core/errors
669
656
  */
670
- declare function getWasmCodecSync(): WasmCodec | null;
657
+ type Ddu64Operation = "construct" | "encode" | "decode" | "compress" | "decompress" | "encrypt" | "decrypt" | "checksum" | "charset" | "adapter" | "obfuscation" | "stream";
658
+ declare enum Ddu64ErrorCode {
659
+ EncodeFailed = "DDU64_ENCODE_FAILED",
660
+ DecodeFailed = "DDU64_DECODE_FAILED",
661
+ CompressionFailed = "DDU64_COMPRESSION_FAILED",
662
+ DecompressionFailed = "DDU64_DECOMPRESSION_FAILED",
663
+ EncryptionFailed = "DDU64_ENCRYPTION_FAILED",
664
+ DecryptionFailed = "DDU64_DECRYPTION_FAILED",
665
+ ChecksumMismatch = "DDU64_CHECKSUM_MISMATCH",
666
+ InvalidCharset = "DDU64_INVALID_CHARSET",
667
+ InvalidInput = "DDU64_INVALID_INPUT",
668
+ LimitExceeded = "DDU64_LIMIT_EXCEEDED",
669
+ AdapterUnavailable = "DDU64_ADAPTER_UNAVAILABLE",
670
+ ObfuscationFailed = "DDU64_OBFUSCATION_FAILED",
671
+ StreamFailed = "DDU64_STREAM_FAILED"
672
+ }
673
+ interface Ddu64ErrorOptions {
674
+ code: Ddu64ErrorCode;
675
+ operation: Ddu64Operation;
676
+ cause?: unknown;
677
+ }
678
+ declare class Ddu64Error extends Error {
679
+ readonly code: Ddu64ErrorCode;
680
+ readonly operation: Ddu64Operation;
681
+ constructor(message: string, options: Ddu64ErrorOptions);
682
+ }
683
+ declare class Ddu64EncodeError extends Ddu64Error {
684
+ constructor(message: string, cause?: unknown);
685
+ }
686
+ declare class Ddu64DecodeError extends Ddu64Error {
687
+ constructor(message: string, cause?: unknown);
688
+ }
689
+ declare class Ddu64CompressionError extends Ddu64Error {
690
+ constructor(message: string, cause?: unknown);
691
+ }
692
+ declare class Ddu64DecompressionError extends Ddu64Error {
693
+ constructor(message: string, cause?: unknown);
694
+ }
695
+ declare class Ddu64EncryptionError extends Ddu64Error {
696
+ constructor(message: string, cause?: unknown);
697
+ }
698
+ declare class Ddu64DecryptionError extends Ddu64Error {
699
+ constructor(message: string, cause?: unknown);
700
+ }
701
+ declare class Ddu64ChecksumError extends Ddu64Error {
702
+ constructor(message: string, cause?: unknown);
703
+ }
704
+ declare class Ddu64CharsetError extends Ddu64Error {
705
+ constructor(message: string, cause?: unknown);
706
+ }
707
+ declare class Ddu64LimitError extends Ddu64Error {
708
+ constructor(message: string, operation: Ddu64Operation, cause?: unknown);
709
+ }
710
+ declare class Ddu64AdapterError extends Ddu64Error {
711
+ constructor(message: string, operation: Ddu64Operation, cause?: unknown);
712
+ }
713
+ declare class Ddu64ObfuscationError extends Ddu64Error {
714
+ constructor(message: string, cause?: unknown);
715
+ }
716
+ declare class Ddu64StreamError extends Ddu64Error {
717
+ constructor(message: string, cause?: unknown);
718
+ }
719
+ declare function isDdu64Error(error: unknown): error is Ddu64Error;
671
720
 
672
- 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, type DduEncodeStats as d, type DduOptions as e, type DduProgressInfo as f, DduSetSymbol as g, type DduTextEncoding as h, type KeyDerivationOptions as i, getWasmCodec as j, getWasmCodecSync as k, preloadWasm as p };
721
+ 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 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,2 +1,2 @@
1
- 'use strict';var chunkPHMARSJE_cjs=require('./chunk-PHMARSJE.cjs'),chunkJZSHJ6KN_cjs=require('./chunk-JZSHJ6KN.cjs'),chunkNFMYVNOG_cjs=require('./chunk-NFMYVNOG.cjs'),chunkTJTDYO65_cjs=require('./chunk-TJTDYO65.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 s=class extends chunkJZSHJ6KN_cjs.k{constructor(e,r,t){e!=null&&typeof e=="object"&&!Array.isArray(e)&&(t=e,e=void 0,r=void 0);let p={...t,adapter:t?.adapter??new chunkTJTDYO65_cjs.a};super(e,r,p);}decodeToBuffer(e,r){let t=this.decodeToUint8Array(e,r);return Buffer.from(t.buffer,t.byteOffset,t.byteLength)}async decodeToBufferAsync(e,r){let t=await this.decodeToUint8ArrayAsync(e,r);return Buffer.from(t.buffer,t.byteOffset,t.byteLength)}};async function O(){switch(chunkPHMARSJE_cjs.a()){case "node":{let{NodeAdapter:e}=await import('./NodeAdapter-JRRSYUJT.cjs');return new e}case "deno":case "bun":case "browser":case "edge":{let{BrowserAdapter:e}=await import('./BrowserAdapter-M7PUHVGS.cjs');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).")}}async function B(o){try{let e=await promises.readFile(o);return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}catch{return null}}async function C(){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)))),e=[path.join(o,"wasm","codec.wasm"),path.join(o,"codec.wasm"),path.join(o,"..","wasm","codec.wasm")];for(let r of e){let t=await B(r);if(t)return t}return null}chunkJZSHJ6KN_cjs.j(C);Object.defineProperty(exports,"createReadableDecodeStream",{enumerable:true,get:function(){return chunkPHMARSJE_cjs.c}});Object.defineProperty(exports,"createReadableEncodeStream",{enumerable:true,get:function(){return chunkPHMARSJE_cjs.b}});Object.defineProperty(exports,"detectRuntime",{enumerable:true,get:function(){return chunkPHMARSJE_cjs.a}});Object.defineProperty(exports,"CharsetBuilder",{enumerable:true,get:function(){return chunkJZSHJ6KN_cjs.l}});Object.defineProperty(exports,"Ddu64Core",{enumerable:true,get:function(){return chunkJZSHJ6KN_cjs.k}});Object.defineProperty(exports,"DduSetSymbol",{enumerable:true,get:function(){return chunkJZSHJ6KN_cjs.d}});Object.defineProperty(exports,"HangulObfuscationLayer",{enumerable:true,get:function(){return chunkJZSHJ6KN_cjs.e}});Object.defineProperty(exports,"createObfuscationLayer",{enumerable:true,get:function(){return chunkJZSHJ6KN_cjs.f}});Object.defineProperty(exports,"getWasmCodec",{enumerable:true,get:function(){return chunkJZSHJ6KN_cjs.h}});Object.defineProperty(exports,"getWasmCodecSync",{enumerable:true,get:function(){return chunkJZSHJ6KN_cjs.i}});Object.defineProperty(exports,"preloadWasm",{enumerable:true,get:function(){return chunkJZSHJ6KN_cjs.g}});Object.defineProperty(exports,"BrowserAdapter",{enumerable:true,get:function(){return chunkNFMYVNOG_cjs.a}});Object.defineProperty(exports,"NodeAdapter",{enumerable:true,get:function(){return chunkTJTDYO65_cjs.a}});exports.Ddu64=s;exports.Ddu64Node=s;exports.getAdapter=O;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var chunkWCXD5LRF_cjs=require('./chunk-WCXD5LRF.cjs'),chunkUMA4JEN4_cjs=require('./chunk-UMA4JEN4.cjs'),chunkAMOZHHMB_cjs=require('./chunk-AMOZHHMB.cjs'),chunkHZJ7PU7X_cjs=require('./chunk-HZJ7PU7X.cjs');require('./chunk-5NSHXTMN.cjs');var promises=require('fs/promises'),path=require('path'),url=require('url');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var s=class extends chunkUMA4JEN4_cjs.C{constructor(r,t,e){let d=chunkUMA4JEN4_cjs.B(r,t,e),C={...d.dduOptions,...d.dduChar!==void 0?{dduChar:d.dduChar}:{},...d.paddingChar!==void 0?{paddingChar:d.paddingChar}:{},adapter:d.dduOptions?.adapter??new chunkHZJ7PU7X_cjs.a};super(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 U(){let o=chunkWCXD5LRF_cjs.a();switch(o){case "node":{let{NodeAdapter:r}=await import('./NodeAdapter-EQ73FGEJ.cjs');return new r}case "deno":case "bun":case "browser":case "edge":{let{BrowserAdapter:r}=await import('./BrowserAdapter-PB4J6FHX.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 q(o){try{let r=await promises.readFile(o);return r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength)}catch{return null}}async function z(){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 q(t);if(e)return e}return null}function c(){D||(chunkUMA4JEN4_cjs.k(z),D=true);}async function G(){return c(),chunkUMA4JEN4_cjs.h()}function J(){return c(),chunkUMA4JEN4_cjs.i()}function Q(){return c(),chunkUMA4JEN4_cjs.j()}Object.defineProperty(exports,"createReadableDecodeStream",{enumerable:true,get:function(){return chunkWCXD5LRF_cjs.c}});Object.defineProperty(exports,"createReadableEncodeStream",{enumerable:true,get:function(){return chunkWCXD5LRF_cjs.b}});Object.defineProperty(exports,"detectRuntime",{enumerable:true,get:function(){return chunkWCXD5LRF_cjs.a}});Object.defineProperty(exports,"CharsetBuilder",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.D}});Object.defineProperty(exports,"Ddu64AdapterError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.w}});Object.defineProperty(exports,"Ddu64CharsetError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.u}});Object.defineProperty(exports,"Ddu64ChecksumError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.t}});Object.defineProperty(exports,"Ddu64CompressionError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.p}});Object.defineProperty(exports,"Ddu64Core",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.C}});Object.defineProperty(exports,"Ddu64DecodeError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.o}});Object.defineProperty(exports,"Ddu64DecompressionError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.q}});Object.defineProperty(exports,"Ddu64DecryptionError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.s}});Object.defineProperty(exports,"Ddu64EncodeError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.n}});Object.defineProperty(exports,"Ddu64EncryptionError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.r}});Object.defineProperty(exports,"Ddu64Error",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.m}});Object.defineProperty(exports,"Ddu64ErrorCode",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.l}});Object.defineProperty(exports,"Ddu64LimitError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.v}});Object.defineProperty(exports,"Ddu64ObfuscationError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.x}});Object.defineProperty(exports,"Ddu64StreamError",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.y}});Object.defineProperty(exports,"DduSetSymbol",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.a}});Object.defineProperty(exports,"HangulObfuscationLayer",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.e}});Object.defineProperty(exports,"createEncoderObfuscationLayer",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.g}});Object.defineProperty(exports,"createObfuscationLayer",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.f}});Object.defineProperty(exports,"isDdu64Error",{enumerable:true,get:function(){return chunkUMA4JEN4_cjs.z}});Object.defineProperty(exports,"BrowserAdapter",{enumerable:true,get:function(){return chunkAMOZHHMB_cjs.a}});Object.defineProperty(exports,"NodeAdapter",{enumerable:true,get:function(){return chunkHZJ7PU7X_cjs.a}});exports.Ddu64=s;exports.Ddu64Node=s;exports.getAdapter=U;exports.getWasmCodec=J;exports.getWasmCodecSync=Q;exports.preloadWasm=G;//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
- import { D as Ddu64Core, a as DduConstructorOptions, e as DduOptions, P as PlatformAdapter, i as KeyDerivationOptions } from './core-DYSnygnp.cjs';
2
- export { C as CharSetConfig, b as CharSetInfo, c as CharsetBuilder, d as DduEncodeStats, f as DduProgressInfo, g as DduSetSymbol, h as DduTextEncoding, E as EncodingProfile, K as KeyDerivationAlgorithm, O as ObfuscationLayer, T as TestVector, W as WasmCodec, j as getWasmCodec, k as getWasmCodecSync, p as preloadWasm } from './core-DYSnygnp.cjs';
3
- export { B as BrowserAdapter, H as HangulObfuscationLayer, c as createObfuscationLayer, a as createReadableDecodeStream, b as createReadableEncodeStream, d as detectRuntime } from './ObfuscationLayer-DAVKTnHf.cjs';
1
+ import { D as Ddu64Core, a as DduConstructorOptions, u as DduOptions, P as PlatformAdapter, y as KeyDerivationOptions, W as WasmCodec } from './errors-DNICpo4L.cjs';
2
+ export { C as CharSetConfig, b as CharSetInfo, c as CharsetBuilder, d as Ddu64AdapterError, e as Ddu64CharsetError, f as Ddu64ChecksumError, g as Ddu64CompressionError, h as Ddu64DecodeError, i as Ddu64DecompressionError, j as Ddu64DecryptionError, k as Ddu64EncodeError, l as Ddu64EncryptionError, m as Ddu64Error, n as Ddu64ErrorCode, o as Ddu64ErrorOptions, p as Ddu64LimitError, q as Ddu64ObfuscationError, r as Ddu64Operation, s as Ddu64StreamError, t as DduEncodeStats, v as DduProgressInfo, w as DduSetSymbol, x as DduTextEncoding, E as EncodingProfile, K as KeyDerivationAlgorithm, O as ObfuscationLayer, z as isDdu64Error } from './errors-DNICpo4L.cjs';
3
+ export { B as BrowserAdapter, H as HangulObfuscationLayer, c as createEncoderObfuscationLayer, a as createObfuscationLayer, b as createReadableDecodeStream, d as createReadableEncodeStream, e as detectRuntime } from './ObfuscationLayer-BgL73E5F.cjs';
4
4
 
5
5
  /**
6
6
  * Node.js 전용 Ddu64 래퍼.
@@ -36,6 +36,7 @@ declare class Ddu64Node extends Ddu64Core {
36
36
  * @param input - 디코딩할 인코딩된 문자열
37
37
  * @param options - 디코딩 옵션
38
38
  * @returns 디코딩된 Buffer
39
+ * @group Sync
39
40
  */
40
41
  decodeToBuffer(input: string, options?: DduOptions): Buffer;
41
42
  /**
@@ -44,6 +45,7 @@ declare class Ddu64Node extends Ddu64Core {
44
45
  * @param input - 디코딩할 인코딩된 문자열
45
46
  * @param options - 디코딩 옵션
46
47
  * @returns 디코딩된 Buffer로 resolve되는 Promise
48
+ * @group Async
47
49
  */
48
50
  decodeToBufferAsync(input: string, options?: DduOptions): Promise<Buffer>;
49
51
  }
@@ -67,10 +69,10 @@ declare class NodeAdapter implements PlatformAdapter {
67
69
  readonly runtime: "node";
68
70
  deriveKey(key: string, options?: KeyDerivationOptions): Promise<Uint8Array>;
69
71
  deriveKeySync(key: string, options?: KeyDerivationOptions): Uint8Array;
70
- encrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
71
- encryptSync(data: Uint8Array, keyHash: Uint8Array): Uint8Array;
72
- decrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
73
- decryptSync(data: Uint8Array, keyHash: Uint8Array): Uint8Array;
72
+ encrypt(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
73
+ encryptSync(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Uint8Array;
74
+ decrypt(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
75
+ decryptSync(data: Uint8Array, keyHash: Uint8Array, aad?: Uint8Array): Uint8Array;
74
76
  randomBytes(length: number): Uint8Array;
75
77
  deflate(data: Uint8Array, level?: number): Promise<Uint8Array>;
76
78
  deflateSync(data: Uint8Array, level?: number): Uint8Array;
@@ -103,4 +105,17 @@ declare class NodeAdapter implements PlatformAdapter {
103
105
  */
104
106
  declare function getAdapter(): Promise<PlatformAdapter>;
105
107
 
106
- export { Ddu64Node as Ddu64, Ddu64Core, Ddu64Node, DduConstructorOptions, DduOptions, KeyDerivationOptions, NodeAdapter, PlatformAdapter, getAdapter };
108
+ /**
109
+ * Node.js 파일시스템 기반 WASM 로더.
110
+ *
111
+ * 브라우저/core 엔트리에서 Node.js 내장 모듈이 번들에 섞이지 않도록
112
+ * Node 전용 진입점(`@ddunigma/node`)에서만 이 모듈을 가져옵니다.
113
+ *
114
+ * @module wasm/WasmCodecNode
115
+ */
116
+
117
+ declare function preloadWasm(): Promise<void>;
118
+ declare function getWasmCodec(): WasmCodec | null;
119
+ declare function getWasmCodecSync(): WasmCodec | null;
120
+
121
+ export { Ddu64Node as Ddu64, Ddu64Core, Ddu64Node, DduConstructorOptions, DduOptions, KeyDerivationOptions, NodeAdapter, PlatformAdapter, WasmCodec, getAdapter, getWasmCodec, getWasmCodecSync, preloadWasm };