@ddunigma/node 2.1.1 → 2.2.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 (70) hide show
  1. package/README.md +101 -11
  2. package/dist/DduStream-KO75MEEM.js +2 -0
  3. package/dist/chunk-CZMUPXSK.js +5 -0
  4. package/dist/index.cjs +8 -0
  5. package/dist/index.d.cts +813 -0
  6. package/dist/index.d.ts +813 -0
  7. package/dist/index.js +5 -0
  8. package/package.json +33 -15
  9. package/dist/cjs/base/BaseDdu.d.ts +0 -53
  10. package/dist/cjs/base/BaseDdu.js +0 -29
  11. package/dist/cjs/base/index.d.ts +0 -1
  12. package/dist/cjs/base/index.js +0 -5
  13. package/dist/cjs/charSets/index.d.ts +0 -18
  14. package/dist/cjs/charSets/index.js +0 -4385
  15. package/dist/cjs/encoders/Ddu64.d.ts +0 -302
  16. package/dist/cjs/encoders/Ddu64.js +0 -1308
  17. package/dist/cjs/encoders/index.d.ts +0 -1
  18. package/dist/cjs/encoders/index.js +0 -5
  19. package/dist/cjs/index.d.ts +0 -5
  20. package/dist/cjs/index.js +0 -16
  21. package/dist/cjs/package.json +0 -3
  22. package/dist/cjs/types/DduDefaultTypes.d.ts +0 -3
  23. package/dist/cjs/types/DduDefaultTypes.js +0 -17
  24. package/dist/cjs/types/DduEnums.d.ts +0 -6
  25. package/dist/cjs/types/DduEnums.js +0 -10
  26. package/dist/cjs/types/DduInterface.d.ts +0 -91
  27. package/dist/cjs/types/DduInterface.js +0 -2
  28. package/dist/cjs/types/index.d.ts +0 -3
  29. package/dist/cjs/types/index.js +0 -19
  30. package/dist/cjs/utils/CharsetBuilder.d.ts +0 -129
  31. package/dist/cjs/utils/CharsetBuilder.js +0 -246
  32. package/dist/cjs/utils/DduPipeline.d.ts +0 -114
  33. package/dist/cjs/utils/DduPipeline.js +0 -229
  34. package/dist/cjs/utils/DduStream.d.ts +0 -64
  35. package/dist/cjs/utils/DduStream.js +0 -221
  36. package/dist/cjs/utils/crypto.d.ts +0 -30
  37. package/dist/cjs/utils/crypto.js +0 -84
  38. package/dist/cjs/utils/index.d.ts +0 -3
  39. package/dist/cjs/utils/index.js +0 -12
  40. package/dist/mjs/base/BaseDdu.d.ts +0 -53
  41. package/dist/mjs/base/BaseDdu.js +0 -23
  42. package/dist/mjs/base/index.d.ts +0 -1
  43. package/dist/mjs/base/index.js +0 -1
  44. package/dist/mjs/charSets/index.d.ts +0 -18
  45. package/dist/mjs/charSets/index.js +0 -4380
  46. package/dist/mjs/encoders/Ddu64.d.ts +0 -302
  47. package/dist/mjs/encoders/Ddu64.js +0 -1343
  48. package/dist/mjs/encoders/index.d.ts +0 -1
  49. package/dist/mjs/encoders/index.js +0 -1
  50. package/dist/mjs/index.d.ts +0 -5
  51. package/dist/mjs/index.js +0 -4
  52. package/dist/mjs/package.json +0 -3
  53. package/dist/mjs/types/DduDefaultTypes.d.ts +0 -3
  54. package/dist/mjs/types/DduDefaultTypes.js +0 -14
  55. package/dist/mjs/types/DduEnums.d.ts +0 -6
  56. package/dist/mjs/types/DduEnums.js +0 -7
  57. package/dist/mjs/types/DduInterface.d.ts +0 -91
  58. package/dist/mjs/types/DduInterface.js +0 -1
  59. package/dist/mjs/types/index.d.ts +0 -3
  60. package/dist/mjs/types/index.js +0 -3
  61. package/dist/mjs/utils/CharsetBuilder.d.ts +0 -129
  62. package/dist/mjs/utils/CharsetBuilder.js +0 -241
  63. package/dist/mjs/utils/DduPipeline.d.ts +0 -114
  64. package/dist/mjs/utils/DduPipeline.js +0 -223
  65. package/dist/mjs/utils/DduStream.d.ts +0 -64
  66. package/dist/mjs/utils/DduStream.js +0 -225
  67. package/dist/mjs/utils/crypto.d.ts +0 -30
  68. package/dist/mjs/utils/crypto.js +0 -78
  69. package/dist/mjs/utils/index.d.ts +0 -3
  70. package/dist/mjs/utils/index.js +0 -3
@@ -0,0 +1,813 @@
1
+ import { Transform, TransformCallback, TransformOptions } from 'stream';
2
+
3
+ declare enum DduSetSymbol {
4
+ DDU = "ddu",
5
+ ONECHARSET = "oneCharSet",
6
+ TWOCHARSET = "twoCharSet",
7
+ THREECHARSET = "threeCharSet"
8
+ }
9
+
10
+ interface CharSetConfig {
11
+ /** charset 식별 심볼 */
12
+ symbol: DduSetSymbol;
13
+ /** 인코딩에 사용할 문자 배열 */
14
+ charSet: string[];
15
+ /** 최대 필요 문자 수 */
16
+ maxRequiredLength: number;
17
+ /** 비트 길이 (log2) */
18
+ bitLength: number;
19
+ /** 패딩 문자 */
20
+ paddingChar: string;
21
+ }
22
+ /** 진행률 콜백 정보 */
23
+ interface DduProgressInfo {
24
+ /** 현재 처리된 바이트 수 (근사값) */
25
+ processedBytes: number;
26
+ /** 전체 바이트 수 */
27
+ totalBytes: number;
28
+ /** 진행률 (0-100, 단계별 근사값) */
29
+ percent: number;
30
+ /** 현재 처리 단계 */
31
+ stage?: "start" | "encrypt" | "compress" | "encode" | "decode" | "decompress" | "checksum" | "decrypt" | "done";
32
+ }
33
+ /** 인코딩 통계 정보 */
34
+ interface DduEncodeStats {
35
+ /** 원본 데이터 크기 (바이트) */
36
+ originalSize: number;
37
+ /** 인코딩된 문자열 길이 */
38
+ encodedSize: number;
39
+ /** 압축된 크기 (압축 사용시) */
40
+ compressedSize?: number;
41
+ /** 압축률 (0-1, 낮을수록 효율적) */
42
+ compressionRatio?: number;
43
+ /** 인코딩 확장 비율 */
44
+ expansionRatio: number;
45
+ /** 사용된 charset 크기 */
46
+ charsetSize: number;
47
+ /** 비트 길이 */
48
+ bitLength: number;
49
+ }
50
+ interface DduOptions {
51
+ /** 압축 사용 여부 (zlib deflate 또는 brotli) */
52
+ compress?: boolean;
53
+ /** decode stream에서 footer 기반 자동 감지 사용 여부 (기본값: true) */
54
+ streamAutoDetect?: boolean;
55
+ /** 내부 암/복호화 사용 여부 (기본값: true, 스트림 파이프라인 내부 제어용) */
56
+ encrypt?: boolean;
57
+ /** 압축 알고리즘 (기본값: "deflate") */
58
+ compressionAlgorithm?: "deflate" | "brotli";
59
+ /** 압축 레벨 (deflate 기본값: 6, brotli도 기본값 6을 사용하며 전달값은 0~11 범위로 보정) */
60
+ compressionLevel?: number;
61
+ /** 최대 디코딩 바이트 수 (Zip Bomb 방어) */
62
+ maxDecodedBytes?: number;
63
+ /** 최대 압축해제 바이트 수 (Zip Bomb 방어) */
64
+ maxDecompressedBytes?: number;
65
+ /** 체크섬 추가 여부 (CRC32) */
66
+ checksum?: boolean;
67
+ /** 청크 분할 크기 */
68
+ chunkSize?: number;
69
+ /** 청크 구분자 (기본값: '\n') */
70
+ chunkSeparator?: string;
71
+ /** 중간 스트림 청크처럼 푸터를 생략해야 할 때 사용 */
72
+ omitFooter?: boolean;
73
+ /** 진행률 콜백 */
74
+ onProgress?: (info: DduProgressInfo) => void;
75
+ }
76
+ interface DduConstructorOptions extends DduOptions {
77
+ /** 미리 정의된 charset 심볼 */
78
+ dduSetSymbol?: DduSetSymbol;
79
+ /** 커스텀 charset 문자 배열 또는 문자열 */
80
+ dduChar?: string[] | string;
81
+ /** 패딩 문자 */
82
+ paddingChar?: string;
83
+ /** 필요 문자 수 */
84
+ requiredLength?: number;
85
+ /** 비트 길이 */
86
+ bitLength?: number;
87
+ /** 2의 제곱수 강제 여부 */
88
+ usePowerOfTwo?: boolean;
89
+ /**
90
+ * true이면 초기화 오류 시 throw합니다. false이면 fallback charset으로 대체합니다.
91
+ * @default false
92
+ * @deprecated throwOnError를 사용하세요. 이 옵션은 하위 호환성을 위해 유지됩니다.
93
+ */
94
+ useBuildErrorReturn?: boolean;
95
+ /**
96
+ * true이면 초기화 오류 시 throw합니다. false이면 fallback charset으로 대체합니다.
97
+ * useBuildErrorReturn과 동일한 동작이며, 둘 다 지정 시 throwOnError가 우선합니다.
98
+ * @default false
99
+ */
100
+ throwOnError?: boolean;
101
+ /** Buffer 인코딩 방식 */
102
+ encoding?: BufferEncoding;
103
+ /** URL-Safe 모드 (특수문자를 URL 안전 문자로 변환) */
104
+ urlSafe?: boolean;
105
+ /** 암호화 키 (AES-256-GCM) */
106
+ encryptionKey?: string;
107
+ }
108
+
109
+ declare abstract class BaseDdu {
110
+ protected readonly defaultEncoding: BufferEncoding;
111
+ /**
112
+ * 주어진 숫자보다 작거나 같은 가장 큰 2의 제곱수의 지수를 반환합니다.
113
+ * @param n - 대상 숫자
114
+ * @returns 2의 제곱수 지수 (예: n=8 → 3, n=64 → 6)
115
+ * @example getLargestPowerOfTwoExponent(8) // 3
116
+ * @example getLargestPowerOfTwoExponent(100) // 6
117
+ */
118
+ protected getLargestPowerOfTwoExponent(n: number): number;
119
+ /**
120
+ * charset 크기에 필요한 비트 길이를 계산합니다.
121
+ * @param setLength - charset 문자 수
122
+ * @returns 필요한 비트 수
123
+ * @example getBitLength(64) // 6
124
+ * @example getBitLength(100) // 7
125
+ */
126
+ protected getBitLength(setLength: number): number;
127
+ /**
128
+ * 입력 데이터를 인코딩합니다.
129
+ * @param input - 인코딩할 문자열 또는 Buffer
130
+ * @param options - 인코딩 옵션
131
+ * @returns 인코딩된 문자열
132
+ */
133
+ abstract encode(input: Buffer | string, options?: DduOptions): string;
134
+ /**
135
+ * 인코딩된 문자열을 Buffer로 디코딩합니다.
136
+ * @param input - 인코딩된 문자열
137
+ * @param options - 디코딩 옵션
138
+ * @returns 디코딩된 Buffer
139
+ */
140
+ abstract decodeToBuffer(input: string, options?: DduOptions): Buffer;
141
+ /**
142
+ * 인코딩된 문자열을 원본 문자열로 디코딩합니다.
143
+ * @param input - 인코딩된 문자열
144
+ * @param options - 디코딩 옵션
145
+ * @returns 디코딩된 문자열
146
+ */
147
+ abstract decode(input: string, options?: DduOptions): string;
148
+ /**
149
+ * 현재 인코더의 charset 정보를 반환합니다.
150
+ * @returns charset 설정 정보 객체
151
+ */
152
+ abstract getCharSetInfo(): {
153
+ charSet: string[];
154
+ paddingChar: string;
155
+ charLength: number;
156
+ bitLength: number;
157
+ usePowerOfTwo: boolean;
158
+ encoding: BufferEncoding;
159
+ };
160
+ }
161
+
162
+ /**
163
+ * AES-256-GCM 스트림 암호화 (Node.js Transform)
164
+ */
165
+ declare class GcmEncryptStream extends Transform {
166
+ private cipher;
167
+ constructor(keyHash: Buffer);
168
+ _transform(chunk: Buffer, enc: BufferEncoding, cb: TransformCallback): void;
169
+ _flush(cb: TransformCallback): void;
170
+ }
171
+ /**
172
+ * AES-256-GCM 스트림 복호화 (Node.js Transform)
173
+ */
174
+ declare class GcmDecryptStream extends Transform {
175
+ private keyHash;
176
+ private iv;
177
+ private decipher;
178
+ private tail;
179
+ constructor(keyHash: Buffer);
180
+ _transform(chunk: Buffer, enc: BufferEncoding, cb: TransformCallback): void;
181
+ _flush(cb: TransformCallback): void;
182
+ }
183
+
184
+ /**
185
+ * 커스텀 charset을 사용하는 Base64 스타일 인코더
186
+ *
187
+ * @description
188
+ * 바이너리 데이터를 지정된 charset으로 인코딩/디코딩합니다.
189
+ * 2의 제곱수 charset과 가변 길이 charset 모두 지원하며,
190
+ * 압축 옵션을 통해 데이터 크기를 줄일 수 있습니다.
191
+ *
192
+ * @example
193
+ * // 기본 사용
194
+ * const encoder = new Ddu64("우따야", "뭐");
195
+ * const encoded = encoder.encode("Hello");
196
+ * const decoded = encoder.decode(encoded);
197
+ *
198
+ * @example
199
+ * // 압축 사용
200
+ * const encoder = new Ddu64(undefined, undefined, { compress: true });
201
+ * const encoded = encoder.encode(longText);
202
+ */
203
+ declare class Ddu64 extends BaseDdu {
204
+ /** 인코딩에 사용할 문자 배열 */
205
+ protected readonly dduChar: string[];
206
+ /** 패딩 문자 */
207
+ protected readonly paddingChar: string;
208
+ /** 각 charset 문자의 길이 */
209
+ protected readonly charLength: number;
210
+ /** 비트 길이 (log2) */
211
+ protected readonly bitLength: number;
212
+ /** 2의 제곱수 charset 여부 */
213
+ protected readonly usePowerOfTwo: boolean;
214
+ /** 문자열 인코딩 방식 */
215
+ protected readonly encoding: BufferEncoding;
216
+ /** 기본 압축 사용 여부 */
217
+ protected readonly defaultCompress: boolean;
218
+ /** 기본 최대 디코딩 바이트 수 */
219
+ private readonly defaultMaxDecodedBytes;
220
+ /** 기본 최대 압축해제 바이트 수 */
221
+ private readonly defaultMaxDecompressedBytes;
222
+ /** 문자 → 인덱스 역방향 룩업 맵 */
223
+ protected readonly dduBinaryLookup: Map<string, number>;
224
+ /** 미리 정의된 charset 사용 여부 */
225
+ private readonly isPredefinedCharSet;
226
+ /** 실제 사용되는 비트 길이 */
227
+ private readonly effectiveBitLength;
228
+ /** 최대 바이너리 값 */
229
+ private readonly maxBinaryValue;
230
+ /** ASCII 문자 빠른 룩업 테이블 */
231
+ private readonly fastAsciiLookup;
232
+ /** ASCII 룩업 사용 여부 */
233
+ private readonly useAsciiLookup;
234
+ /** URL-Safe 모드 여부 */
235
+ private readonly urlSafe;
236
+ /** 암호화 키 해시 (AES-256용 32바이트) */
237
+ private readonly encryptionKeyHash;
238
+ /** 기본 체크섬 사용 여부 */
239
+ private readonly defaultChecksum;
240
+ /** 기본 청크 크기 */
241
+ private readonly defaultChunkSize;
242
+ /** 기본 청크 구분자 */
243
+ private readonly defaultChunkSeparator;
244
+ /** 기본 압축 레벨 (1~9) */
245
+ private readonly defaultCompressionLevel;
246
+ /** 기본 압축 알고리즘 */
247
+ private readonly defaultCompressionAlgorithm;
248
+ /**
249
+ * Ddu64 인코더 인스턴스를 생성합니다.
250
+ *
251
+ * @param dduChar - charset 문자열 또는 배열 (미지정 시 옵션의 dduSetSymbol 사용)
252
+ * @param paddingChar - 패딩 문자 (dduChar 지정 시 필수)
253
+ * @param dduOptions - 생성자 옵션
254
+ *
255
+ * @throws dduChar 지정 시 paddingChar가 없으면 에러
256
+ * @throws charset 문자 수가 부족하면 에러
257
+ *
258
+ * @example
259
+ * // 커스텀 charset
260
+ * new Ddu64("우따야", "뭐");
261
+ *
262
+ * @example
263
+ * // 미리 정의된 charset
264
+ * new Ddu64(undefined, undefined, { dduSetSymbol: DduSetSymbol.ONECHARSET });
265
+ */
266
+ constructor(dduChar?: string[] | string, paddingChar?: string, dduOptions?: DduConstructorOptions);
267
+ /**
268
+ * 입력 데이터를 인코딩합니다.
269
+ *
270
+ * @param input - 인코딩할 문자열 또는 Buffer
271
+ * @param options - 인코딩 옵션
272
+ * @param options.compress - 압축 사용 여부 (기본값: 생성자 설정)
273
+ * @param options.checksum - 체크섬 추가 여부
274
+ * @param options.chunkSize - 청크 분할 크기
275
+ * @param options.chunkSeparator - 청크 구분자
276
+ * @param options.onProgress - 진행률 콜백
277
+ * @returns 인코딩된 문자열
278
+ *
279
+ * @example
280
+ * encoder.encode("Hello World!");
281
+ * encoder.encode(buffer, { compress: true });
282
+ * encoder.encode(data, { checksum: true, chunkSize: 76 });
283
+ */
284
+ encode(input: Buffer | string, options?: DduOptions): string;
285
+ /**
286
+ * 인코딩 핵심 로직. encode()와 getStats()가 공유합니다.
287
+ * 압축 크기 등 메타데이터도 함께 반환하여 중복 deflateSync 호출을 방지합니다.
288
+ */
289
+ private encodeInternal;
290
+ /**
291
+ * 인코딩된 문자열을 Buffer로 디코딩합니다.
292
+ *
293
+ * @param input - 디코딩할 인코딩된 문자열
294
+ * @param options - 디코딩 옵션
295
+ * @param options.maxDecodedBytes - 최대 디코딩 바이트 수
296
+ * @param options.maxDecompressedBytes - 최대 압축해제 바이트 수
297
+ * @param options.onProgress - 진행률 콜백
298
+ * @returns 디코딩된 Buffer
299
+ *
300
+ * @throws 잘못된 문자가 포함된 경우
301
+ * @throws 패딩 형식이 잘못된 경우
302
+ * @throws 크기 제한 초과 시
303
+ * @throws 체크섬 불일치 시
304
+ */
305
+ decodeToBuffer(input: string, options?: DduOptions): Buffer;
306
+ /**
307
+ * 인코딩된 문자열을 원본 문자열로 디코딩합니다.
308
+ *
309
+ * @param input - 디코딩할 인코딩된 문자열
310
+ * @param options - 디코딩 옵션
311
+ * @returns 디코딩된 문자열
312
+ *
313
+ * @throws 잘못된 문자나 패딩 형식일 경우 에러
314
+ */
315
+ decode(input: string, options?: DduOptions): string;
316
+ /**
317
+ * 공개 스트림 API의 auto-detect 경로에서 사용하는 전용 디코더입니다.
318
+ * 스트림 인코딩은 compress -> encrypt -> encode 순서를 사용하므로,
319
+ * 복원은 decode -> decrypt -> decompress 순서로 수행합니다.
320
+ */
321
+ decodeStreamToBuffer(input: string, options?: DduOptions): Buffer;
322
+ /**
323
+ * 현재 인코더의 charset 정보를 반환합니다.
324
+ *
325
+ * @returns charset 설정 정보 객체
326
+ */
327
+ getCharSetInfo(): {
328
+ charSet: string[];
329
+ paddingChar: string;
330
+ charLength: number;
331
+ bitLength: number;
332
+ usePowerOfTwo: boolean;
333
+ encoding: BufferEncoding;
334
+ defaultCompress: boolean;
335
+ defaultMaxDecodedBytes: number;
336
+ defaultMaxDecompressedBytes: number;
337
+ urlSafe: boolean;
338
+ hasEncryptionKey: boolean;
339
+ defaultChecksum: boolean;
340
+ defaultChunkSize: number | undefined;
341
+ defaultChunkSeparator: string;
342
+ defaultCompressionLevel: number;
343
+ defaultCompressionAlgorithm: "deflate" | "brotli";
344
+ };
345
+ /**
346
+ * 외부 스트림 파이프라인에서 전처리된 Buffer를 그대로 인코딩합니다.
347
+ * 압축/암호화는 수행하지 않고, 마지막 푸터에만 메타데이터를 반영합니다.
348
+ */
349
+ encodeRawBuffer(input: Buffer, options?: {
350
+ compressionAlgorithm?: "deflate" | "brotli";
351
+ encrypted?: boolean;
352
+ omitFooter?: boolean;
353
+ }): string;
354
+ /**
355
+ * 인코딩 통계 정보를 반환합니다.
356
+ *
357
+ * @param input - 분석할 데이터
358
+ * @param options - 인코딩 옵션
359
+ * @returns 통계 정보 객체
360
+ */
361
+ getStats(input: Buffer | string, options?: DduOptions): DduEncodeStats;
362
+ /**
363
+ * 비동기 인코딩을 수행합니다.
364
+ *
365
+ * 가능한 경우 청크 단위로 Event Loop를 양보(Yield)하여 스타베이션을 줄입니다.
366
+ * 다만 압축, 체크섬, 암호화, URL-safe가 개입되는 큰 입력은 정확성을 위해
367
+ * 안전한 단일 페이로드 경로로 fallback 됩니다.
368
+ *
369
+ * @param input - 인코딩할 데이터
370
+ * @param options - 인코딩 옵션
371
+ * @returns 인코딩된 문자열 Promise
372
+ */
373
+ encodeAsync(input: Buffer | string, options?: DduOptions): Promise<string>;
374
+ /**
375
+ * 비동기 디코딩을 수행합니다.
376
+ *
377
+ * 대용량 데이터를 처리할 때 Event Loop를 양보하여 블로킹을 방지합니다.
378
+ *
379
+ * @param input - 디코딩할 인코딩된 문자열
380
+ * @param options - 디코딩 옵션
381
+ * @returns 디코딩된 문자열 Promise
382
+ */
383
+ decodeAsync(input: string, options?: DduOptions): Promise<string>;
384
+ /**
385
+ * 비동기 디코딩을 Buffer로 수행합니다.
386
+ *
387
+ * @param input - 디코딩할 인코딩된 문자열
388
+ * @param options - 디코딩 옵션
389
+ * @returns 디코딩된 Buffer Promise
390
+ *
391
+ * @description
392
+ * 큰 입력 중에서도 압축, 암호화, 체크섬, 청크 구분자 해석이 필요한 경우에는
393
+ * 안전성을 위해 내부적으로 전체 페이로드 단위 디코딩으로 fallback 될 수 있습니다.
394
+ */
395
+ decodeToBufferAsync(input: string, options?: DduOptions): Promise<Buffer>;
396
+ /**
397
+ * 데이터를 AES-256-GCM으로 암호화합니다.
398
+ */
399
+ private encryptData;
400
+ /**
401
+ * AES-256-GCM으로 암호화된 데이터를 복호화합니다.
402
+ */
403
+ private decryptData;
404
+ /**
405
+ * 공개 스트림 API의 암호화 포맷(iv + encrypted + authTag)을 복호화합니다.
406
+ */
407
+ private decryptStreamData;
408
+ /**
409
+ * 공개 스트림 API에서 사용할 암호화 Transform을 생성합니다.
410
+ */
411
+ createEncryptionStream(): GcmEncryptStream | undefined;
412
+ /**
413
+ * 공개 스트림 API에서 사용할 복호화 Transform을 생성합니다.
414
+ */
415
+ createDecryptionStream(): GcmDecryptStream | undefined;
416
+ /**
417
+ * 옵션 값을 정규화합니다.
418
+ */
419
+ private normalizeLimit;
420
+ /**
421
+ * 압축 레벨을 알고리즘별 지원 범위에 맞춰 정규화합니다.
422
+ */
423
+ private normalizeCompressionLevel;
424
+ /**
425
+ * 디코딩 결과 바이트 수를 추정합니다.
426
+ */
427
+ private estimateDecodedBytes;
428
+ /**
429
+ * 인코딩된 입력의 정렬을 검증합니다.
430
+ */
431
+ private assertEncodedInputAligned;
432
+ /**
433
+ * 크기 제한을 적용하여 압축을 해제합니다.
434
+ */
435
+ private inflateWithLimit;
436
+ /**
437
+ * 인코딩된 문자열의 푸터(패딩 정보)를 파싱합니다.
438
+ *
439
+ * 푸터 형식: {encodedData}{paddingChar}[ELYSIA][ENC]{digits}
440
+ * 끝에서부터 역순으로 파싱하여 paddingChar가 숫자인 경우도 안전하게 처리합니다.
441
+ */
442
+ private parseFooter;
443
+ /**
444
+ * 일반 정수 연산을 사용한 빠른 인코딩
445
+ */
446
+ private encodeFast;
447
+ /**
448
+ * 일반 정수 연산을 사용한 빠른 디코딩
449
+ */
450
+ private decodeFast;
451
+ /**
452
+ * BigInt를 사용한 대형 비트 인코딩
453
+ */
454
+ private encodeBigInt;
455
+ /**
456
+ * 인코딩 파트 배열을 최종 문자열로 직렬화합니다.
457
+ * 청크 옵션이 있으면 join 후 split하는 대신 한 번에 separator를 삽입합니다.
458
+ */
459
+ private serializeEncodedParts;
460
+ /**
461
+ * BigInt를 사용한 대형 비트 디코딩
462
+ */
463
+ private decodeBigInt;
464
+ /**
465
+ * Charset을 정규화합니다.
466
+ */
467
+ private normalizeCharSet;
468
+ /**
469
+ * 초기 charset을 결정합니다.
470
+ */
471
+ private resolveInitialCharSet;
472
+ /**
473
+ * Fallback charset을 반환합니다.
474
+ */
475
+ private getFallbackCharSet;
476
+ /**
477
+ * 2의 제곱수 사용 여부를 결정합니다.
478
+ */
479
+ private shouldUsePowerOfTwo;
480
+ /**
481
+ * charset을 가져오거나 에러를 발생시킵니다.
482
+ */
483
+ private getCharSetOrThrow;
484
+ /**
485
+ * URL-Safe 모드 시 charset/padding이 역변환 대상 문자를 포함하지 않는지 검증합니다.
486
+ * 역변환 대상 문자("-", "_", ".")가 charset이나 padding에 있으면
487
+ * fromUrlSafe 시 해당 문자가 "+", "/", "="로 변환되어 데이터가 손상됩니다.
488
+ *
489
+ * @returns URL-Safe 모드를 활성화해도 안전한 경우 true
490
+ */
491
+ private isUrlSafeCompatible;
492
+ /**
493
+ * 커스텀 charset의 조합 중복을 검증합니다.
494
+ */
495
+ private validateCombinationDuplicates;
496
+ }
497
+
498
+ /**
499
+ * 커스텀 Charset을 쉽게 생성하기 위한 빌더 클래스
500
+ *
501
+ * @example
502
+ * const chars = CharsetBuilder
503
+ * .fromUnicodeRange(0x4E00, 0x4E3F)
504
+ * .excludeConfusing()
505
+ * .shuffle()
506
+ * .build();
507
+ */
508
+ declare class CharsetBuilder {
509
+ private chars;
510
+ private constructor();
511
+ /**
512
+ * 빈 빌더를 생성합니다.
513
+ */
514
+ static create(): CharsetBuilder;
515
+ /**
516
+ * 유니코드 범위에서 문자들을 추가합니다.
517
+ *
518
+ * @param start - 시작 유니코드 코드포인트
519
+ * @param end - 끝 유니코드 코드포인트 (포함)
520
+ */
521
+ static fromUnicodeRange(start: number, end: number): CharsetBuilder;
522
+ /**
523
+ * 문자열에서 문자들을 추가합니다.
524
+ *
525
+ * @param chars - 문자열 또는 문자 배열
526
+ */
527
+ static fromString(chars: string | string[]): CharsetBuilder;
528
+ /**
529
+ * Base64 표준 문자셋으로 시작합니다.
530
+ */
531
+ static base64(): CharsetBuilder;
532
+ /**
533
+ * Base32 표준 문자셋으로 시작합니다.
534
+ */
535
+ static base32(): CharsetBuilder;
536
+ /**
537
+ * 영문 대문자만 포함합니다.
538
+ */
539
+ static uppercase(): CharsetBuilder;
540
+ /**
541
+ * 영문 소문자만 포함합니다.
542
+ */
543
+ static lowercase(): CharsetBuilder;
544
+ /**
545
+ * 숫자만 포함합니다.
546
+ */
547
+ static digits(): CharsetBuilder;
548
+ /**
549
+ * 한글 자모를 포함합니다.
550
+ */
551
+ static hangulJamo(): CharsetBuilder;
552
+ /**
553
+ * 유니코드 범위에서 문자들을 추가합니다.
554
+ */
555
+ addUnicodeRange(start: number, end: number): CharsetBuilder;
556
+ /**
557
+ * 문자열에서 문자들을 추가합니다.
558
+ */
559
+ addString(chars: string | string[]): CharsetBuilder;
560
+ /**
561
+ * 특정 문자들을 추가합니다.
562
+ */
563
+ add(...chars: string[]): CharsetBuilder;
564
+ /**
565
+ * 혼동하기 쉬운 문자들을 제거합니다.
566
+ * (0, O, o, 1, l, I, i 등)
567
+ */
568
+ excludeConfusing(): CharsetBuilder;
569
+ /**
570
+ * 특정 문자들을 제거합니다.
571
+ */
572
+ exclude(...chars: string[]): CharsetBuilder;
573
+ /**
574
+ * URL에서 안전하지 않은 문자들을 제거합니다.
575
+ */
576
+ excludeUrlUnsafe(): CharsetBuilder;
577
+ /**
578
+ * 중복 문자를 제거합니다.
579
+ */
580
+ unique(): CharsetBuilder;
581
+ /**
582
+ * 문자셋을 무작위로 섞습니다.
583
+ */
584
+ shuffle(seed?: number): CharsetBuilder;
585
+ /**
586
+ * 시드 기반 난수 생성기 (xorshift32)
587
+ */
588
+ private seededRandom;
589
+ /**
590
+ * 특정 길이로 자릅니다.
591
+ */
592
+ limit(length: number): CharsetBuilder;
593
+ /**
594
+ * 2의 제곱수 길이로 자릅니다.
595
+ */
596
+ limitToPowerOfTwo(): CharsetBuilder;
597
+ /**
598
+ * 문자셋을 정렬합니다.
599
+ */
600
+ sort(): CharsetBuilder;
601
+ /**
602
+ * 역순으로 정렬합니다.
603
+ */
604
+ reverse(): CharsetBuilder;
605
+ /**
606
+ * 현재 문자 수를 반환합니다.
607
+ */
608
+ get length(): number;
609
+ /**
610
+ * 문자셋을 문자열로 빌드합니다.
611
+ */
612
+ buildString(): string;
613
+ /**
614
+ * 문자셋을 배열로 빌드합니다.
615
+ */
616
+ build(): string[];
617
+ /**
618
+ * 문자셋과 패딩 문자를 함께 빌드합니다.
619
+ *
620
+ * @param paddingChar - 패딩 문자 (기본값: charset에서 제외된 첫 번째 문자)
621
+ */
622
+ buildWithPadding(paddingChar?: string): {
623
+ charset: string[];
624
+ padding: string;
625
+ };
626
+ }
627
+
628
+ /**
629
+ * 다중 인코딩/암호화/압축을 파이프라인으로 조합할 수 있는 빌더 클래스
630
+ *
631
+ * @example
632
+ * const pipeline = new DduPipeline()
633
+ * .compress()
634
+ * .encrypt('secret-key')
635
+ * .encode(new Ddu64(chars, pad));
636
+ *
637
+ * const encoded = pipeline.process('Hello World');
638
+ * const decoded = pipeline.reverse().process(encoded);
639
+ */
640
+ declare class DduPipeline {
641
+ private steps;
642
+ /**
643
+ * 압축 단계를 추가합니다.
644
+ *
645
+ * @param level - 압축 레벨 (0-9, 기본값: 9)
646
+ * @param algorithm - 압축 알고리즘 (기본값: "deflate")
647
+ */
648
+ compress(level?: number, algorithm?: "deflate" | "brotli"): DduPipeline;
649
+ /**
650
+ * 압축 해제 단계를 추가합니다.
651
+ *
652
+ * @param maxDecompressedBytes - 최대 압축해제 바이트 수 (Zip Bomb 방어용)
653
+ * @param algorithm - 압축 알고리즘 (기본값: "deflate")
654
+ */
655
+ decompress(maxDecompressedBytes?: number, algorithm?: "deflate" | "brotli"): DduPipeline;
656
+ /**
657
+ * AES-256-GCM 암호화 단계를 추가합니다.
658
+ *
659
+ * @param key - 암호화 키
660
+ */
661
+ encrypt(key: string): DduPipeline;
662
+ /**
663
+ * AES-256-GCM 복호화 단계를 추가합니다.
664
+ *
665
+ * @param key - 복호화 키
666
+ */
667
+ decrypt(key: string): DduPipeline;
668
+ /**
669
+ * Ddu64 인코딩 단계를 추가합니다.
670
+ *
671
+ * @param encoder - Ddu64 인코더 인스턴스
672
+ */
673
+ encode(encoder: Ddu64): DduPipeline;
674
+ /**
675
+ * Ddu64 디코딩 단계를 추가합니다.
676
+ *
677
+ * @param encoder - Ddu64 인코더 인스턴스
678
+ */
679
+ decode(encoder: Ddu64): DduPipeline;
680
+ /**
681
+ * 새 인코더를 생성하여 인코딩 단계를 추가합니다.
682
+ *
683
+ * @param dduChar - charset 문자열 또는 배열
684
+ * @param paddingChar - 패딩 문자
685
+ * @param options - 인코더 옵션
686
+ */
687
+ encodeWith(dduChar?: string[] | string, paddingChar?: string, options?: DduConstructorOptions): DduPipeline;
688
+ /**
689
+ * 커스텀 Buffer 변환 단계를 추가합니다.
690
+ *
691
+ * @param fn - 변환 함수
692
+ */
693
+ transform(fn: (data: Buffer) => Buffer): DduPipeline;
694
+ /**
695
+ * 커스텀 문자열 변환 단계를 추가합니다.
696
+ *
697
+ * @param fn - 변환 함수
698
+ */
699
+ transformString(fn: (data: string) => string): DduPipeline;
700
+ /**
701
+ * 파이프라인을 역순으로 실행할 새 파이프라인을 생성합니다.
702
+ */
703
+ reverse(): DduPipeline;
704
+ /**
705
+ * 파이프라인을 실행합니다.
706
+ *
707
+ * @param input - 입력 데이터 (문자열 또는 Buffer)
708
+ * @returns 처리된 결과 (문자열 또는 Buffer)
709
+ */
710
+ process(input: string | Buffer): string | Buffer;
711
+ /**
712
+ * 파이프라인을 실행하고 문자열로 반환합니다.
713
+ */
714
+ processToString(input: string | Buffer, encoding?: BufferEncoding): string;
715
+ /**
716
+ * 파이프라인을 실행하고 Buffer로 반환합니다.
717
+ */
718
+ processToBuffer(input: string | Buffer, encoding?: BufferEncoding): Buffer;
719
+ /**
720
+ * 개별 단계를 실행합니다.
721
+ */
722
+ private executeStep;
723
+ private toBuffer;
724
+ private toString;
725
+ private compressData;
726
+ private decompressData;
727
+ private encryptData;
728
+ private decryptData;
729
+ /**
730
+ * 현재 파이프라인의 단계 수를 반환합니다.
731
+ */
732
+ get stepCount(): number;
733
+ /**
734
+ * 파이프라인을 복제합니다.
735
+ */
736
+ clone(): DduPipeline;
737
+ /**
738
+ * 파이프라인을 초기화합니다.
739
+ */
740
+ clear(): DduPipeline;
741
+ }
742
+
743
+ /**
744
+ * Ddu64 인코딩을 위한 Transform 스트림
745
+ * (내부적으로 청크 단위 인코딩을 수행합니다. 압축이 필요한 경우
746
+ * `createEncodeStream` 팩토리 함수를 사용하는 것을 권장합니다.)
747
+ *
748
+ * @example
749
+ * const encoder = new Ddu64(chars, pad);
750
+ * const stream = new DduEncodeStream(encoder);
751
+ * fs.createReadStream('input.bin')
752
+ * .pipe(stream)
753
+ * .pipe(fs.createWriteStream('output.txt'));
754
+ */
755
+ declare class DduEncodeStream extends Transform {
756
+ private encoder;
757
+ private buffers;
758
+ private bufferOffset;
759
+ private totalLength;
760
+ private chunkSize;
761
+ private footerCompressionAlgorithm;
762
+ private footerEncrypted;
763
+ constructor(encoder: Ddu64, options?: DduOptions & TransformOptions);
764
+ /**
765
+ * 비트 길이에 맞는 최적의 청크 크기를 계산합니다.
766
+ */
767
+ private calculateChunkSize;
768
+ _transform(chunk: Buffer, _encoding: BufferEncoding, callback: TransformCallback): void;
769
+ _flush(callback: TransformCallback): void;
770
+ private encodeChunk;
771
+ private readBytes;
772
+ }
773
+ /**
774
+ * Ddu64 디코딩을 위한 Transform 스트림
775
+ * (내부적으로 청크 단위 디코딩을 수행합니다. 압축 해제가 필요한 경우
776
+ * `createDecodeStream` 팩토리 함수를 사용하는 것을 권장합니다.)
777
+ *
778
+ * @example
779
+ * const encoder = new Ddu64(chars, pad);
780
+ * const stream = new DduDecodeStream(encoder);
781
+ * fs.createReadStream('input.txt')
782
+ * .pipe(stream)
783
+ * .pipe(fs.createWriteStream('output.bin'));
784
+ */
785
+ declare class DduDecodeStream extends Transform {
786
+ private encoder;
787
+ private options;
788
+ private normalizedBuffer;
789
+ private charLength;
790
+ private chunkSize;
791
+ private chunkSeparator;
792
+ private separatorTail;
793
+ constructor(encoder: Ddu64, options?: DduOptions & TransformOptions);
794
+ private calculateChunkSize;
795
+ _transform(chunk: Buffer, _encoding: BufferEncoding, callback: TransformCallback): void;
796
+ _flush(callback: TransformCallback): void;
797
+ private appendNormalizedChunk;
798
+ }
799
+ /**
800
+ * Ddu64 인코더에서 스트림을 생성하는 팩토리 함수
801
+ * 옵션에 따라 압축 스트림을 자동으로 연결합니다.
802
+ */
803
+ declare function createEncodeStream(encoder: Ddu64, options?: DduOptions & TransformOptions): NodeJS.ReadWriteStream;
804
+ /**
805
+ * Ddu64 인코더에서 디코드 스트림을 생성하는 팩토리 함수
806
+ * 옵션에 따라 압축 해제 스트림을 자동으로 연결합니다.
807
+ * 기본적으로 footer를 끝까지 읽어 압축/암호화를 자동 감지합니다.
808
+ * 진짜 스트리밍 복원을 원하면 `streamAutoDetect: false`와 함께 encode 측과 동일한
809
+ * compress/encryption 설정 또는 같은 encoder 기본값을 사용해야 합니다.
810
+ */
811
+ declare function createDecodeStream(encoder: Ddu64, options?: DduOptions & TransformOptions): NodeJS.ReadWriteStream;
812
+
813
+ export { BaseDdu, type CharSetConfig, CharsetBuilder, Ddu64, type DduConstructorOptions, DduDecodeStream, type DduEncodeStats, DduEncodeStream, type DduOptions, DduPipeline, type DduProgressInfo, DduSetSymbol, createDecodeStream, createEncodeStream };