@ddunigma/node 3.0.3 → 3.1.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.
package/README.md CHANGED
@@ -10,7 +10,7 @@ V2 추가사항
10
10
 
11
11
  ### Credits
12
12
 
13
- - Original Python Implementation by:
13
+ - Origin implementation by:
14
14
  - [@i3ls](https://github.com/i3l3)
15
15
  - [@gunu3371](https://github.com/gunu3371)
16
16
  - Original Repository: [ddunigma](https://github.com/i3l3/ddunigma)
@@ -51,7 +51,7 @@ const input = new Uint8Array([0, 1, 127, 128, 255]);
51
51
 
52
52
  const encoded = ddu.encode(input);
53
53
  const bytes = ddu.decodeToUint8Array(encoded);
54
- const buffer = ddu.decodeToBuffer(encoded); // Node.js Buffer
54
+ const buffer = ddu.decodeToBuffer(encoded); // Node.js entry only
55
55
  ```
56
56
 
57
57
  ## Presets
@@ -127,6 +127,8 @@ const decoded = ddu.decode(encoded);
127
127
  ```
128
128
 
129
129
  압축은 원본보다 작아질 때만 적용됩니다. 압축 결과가 더 크면 비압축으로 저장됩니다.
130
+ 브라우저 진입점은 `deflate-raw`를 지원하는 CompressionStream/DecompressionStream 런타임에서 압축을 사용합니다.
131
+ 브라우저 Brotli는 런타임 지원 여부를 feature detection으로 확인하며, Web API 특성상 `compressionLevel`은 적용되지 않을 수 있습니다.
130
132
 
131
133
  ## Encryption
132
134
 
@@ -151,6 +153,9 @@ const dduPbkdf2 = new Ddu64({
151
153
  });
152
154
  ```
153
155
 
156
+ PBKDF2 `iterations`는 기본값이 `210_000`이며, `10_000` 미만의 양수는 `10_000`으로 보정됩니다.
157
+ 0 이하 또는 유한하지 않은 값은 기본값으로 대체됩니다.
158
+
154
159
  ## Checksum
155
160
 
156
161
  ```typescript
@@ -207,6 +212,7 @@ const decoded = await ddu.decodeAsync(encoded);
207
212
  ```
208
213
 
209
214
  Node.js에서도 async 메서드를 사용할 수 있습니다. 브라우저 진입점(`@ddunigma/node/browser`)은 Node.js 내장 모듈을 임포트하지 않습니다.
215
+ 코어 진입점(`@ddunigma/node/core`)은 기본 인코딩/디코딩만 포함하며, 압축/암호화가 필요하면 명시적으로 어댑터를 전달하세요.
210
216
 
211
217
  ## Web Streams
212
218
 
@@ -230,7 +236,7 @@ const decodedStream = encodedStream.pipeThrough(createReadableDecodeStream(ddu))
230
236
  ```typescript
231
237
  import { Ddu64, preloadWasm } from "@ddunigma/node";
232
238
 
233
- await preloadWasm(); // 선택적 사전 로드
239
+ await preloadWasm(); // 동기 encode/decode hot path에서 WASM을 쓰려면 먼저 완료되어야 함
234
240
 
235
241
  const ddu = new Ddu64({
236
242
  wasmThreshold: 4096, // 이 크기 이상일 때 WASM 사용
@@ -239,7 +245,8 @@ const ddu = new Ddu64({
239
245
  const encoded = ddu.encode(new Uint8Array(1024 * 1024));
240
246
  ```
241
247
 
242
- WASM을 사용할 없으면 JavaScript로 자동 폴백됩니다.
248
+ `encode()`/`decode()`의 동기 hot path는 이미 로드된 WASM만 사용합니다.
249
+ `preloadWasm()`이 완료되지 않았거나 WASM을 사용할 수 없으면 JavaScript로 폴백됩니다.
243
250
 
244
251
  ## Progress Callback
245
252
 
@@ -276,6 +283,8 @@ const ddu = new Ddu64({
276
283
 
277
284
  ## API
278
285
 
286
+ ### Node Entry
287
+
279
288
  ```typescript
280
289
  class Ddu64 {
281
290
  encode(data: string | Uint8Array, options?: DduOptions): string;
@@ -290,11 +299,48 @@ class Ddu64 {
290
299
 
291
300
  getStats(data: string | Uint8Array, options?: DduOptions): DduEncodeStats;
292
301
  getCharSetInfo(): CharSetInfo;
302
+ }
303
+ ```
304
+
305
+ ### Browser Entry
306
+
307
+ ```typescript
308
+ class Ddu64 {
309
+ encode(data: string | Uint8Array, options?: DduOptions): string;
310
+ decode(encoded: string, options?: DduOptions): string;
311
+ decodeToUint8Array(encoded: string, options?: DduOptions): Uint8Array;
293
312
 
294
- static setWorkerPoolSize(n: number): void;
313
+ encodeAsync(data: string | Uint8Array, options?: DduOptions): Promise<string>;
314
+ decodeAsync(encoded: string, options?: DduOptions): Promise<string>;
315
+ decodeToUint8ArrayAsync(encoded: string, options?: DduOptions): Promise<Uint8Array>;
316
+
317
+ getStats(data: string | Uint8Array, options?: DduOptions): DduEncodeStats;
318
+ getCharSetInfo(): CharSetInfo;
295
319
  }
296
320
  ```
297
321
 
322
+ 브라우저 진입점(`@ddunigma/node/browser`)은 `Buffer` API를 노출하지 않습니다.
323
+
324
+ ### Core Entry
325
+
326
+ ```typescript
327
+ class Ddu64 {
328
+ encode(data: string | Uint8Array, options?: DduOptions): string;
329
+ decode(encoded: string, options?: DduOptions): string;
330
+ decodeToUint8Array(encoded: string, options?: DduOptions): Uint8Array;
331
+
332
+ encodeAsync(data: string | Uint8Array, options?: DduOptions): Promise<string>;
333
+ decodeAsync(encoded: string, options?: DduOptions): Promise<string>;
334
+ decodeToUint8ArrayAsync(encoded: string, options?: DduOptions): Promise<Uint8Array>;
335
+
336
+ getStats(data: string | Uint8Array, options?: DduOptions): DduEncodeStats;
337
+ getCharSetInfo(): CharSetInfo;
338
+ }
339
+ ```
340
+
341
+ 코어 진입점(`@ddunigma/node/core`)은 플랫폼 어댑터를 자동 로드하지 않습니다.
342
+ 압축 또는 암호화가 필요한 async 호출에는 `adapter`를 명시적으로 전달하세요.
343
+
298
344
  ## Constructor Options
299
345
 
300
346
  ```typescript
@@ -348,7 +394,7 @@ new Ddu64(dduChar, paddingChar, options?);
348
394
  | Import Path | 용도 |
349
395
  | ------------------------ | ------------------------------------- |
350
396
  | `@ddunigma/node` | Node.js 전체 기능 (동기+비동기) |
351
- | `@ddunigma/node/browser` | 브라우저 최적화 (Node.js 모듈 미포함) |
397
+ | `@ddunigma/node/browser` | 브라우저 최적화 (BrowserAdapter 기본) |
352
398
  | `@ddunigma/node/core` | 최소 코어 (인코딩/디코딩만) |
353
399
 
354
400
  ## Build & Test
@@ -0,0 +1,2 @@
1
+ export{a as BrowserAdapter}from'./chunk-5RZDTEOZ.js';import'./chunk-QR43FNIY.js';//# sourceMappingURL=BrowserAdapter-BHHWPUTB.js.map
2
+ //# sourceMappingURL=BrowserAdapter-BHHWPUTB.js.map
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkNFMYVNOG_cjs=require('./chunk-NFMYVNOG.cjs');require('./chunk-NY4FGVF3.cjs');Object.defineProperty(exports,"BrowserAdapter",{enumerable:true,get:function(){return chunkNFMYVNOG_cjs.a}});//# sourceMappingURL=BrowserAdapter-M7PUHVGS.cjs.map
2
+ //# sourceMappingURL=BrowserAdapter-M7PUHVGS.cjs.map
@@ -0,0 +1,2 @@
1
+ export{a as NodeAdapter}from'./chunk-M6LY6DIE.js';import'./chunk-QR43FNIY.js';//# sourceMappingURL=NodeAdapter-JB2EZ3T4.js.map
2
+ //# sourceMappingURL=NodeAdapter-JB2EZ3T4.js.map
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkTJTDYO65_cjs=require('./chunk-TJTDYO65.cjs');require('./chunk-NY4FGVF3.cjs');Object.defineProperty(exports,"NodeAdapter",{enumerable:true,get:function(){return chunkTJTDYO65_cjs.a}});//# sourceMappingURL=NodeAdapter-JRRSYUJT.cjs.map
2
+ //# sourceMappingURL=NodeAdapter-JRRSYUJT.cjs.map
@@ -0,0 +1,205 @@
1
+ import { P as PlatformAdapter, i as KeyDerivationOptions, D as Ddu64Core, e as DduOptions, O as ObfuscationLayer } from './core-DYSnygnp.js';
2
+
3
+ /**
4
+ * 브라우저 플랫폼 어댑터 구현.
5
+ * 암호화 연산에 Web Crypto API(SubtleCrypto)를 사용하고
6
+ * 압축에 CompressionStream/DecompressionStream을 사용합니다.
7
+ *
8
+ * 이 어댑터는 동기 암호화 또는 압축 연산을 지원하지 않습니다.
9
+ * Brotli는 CompressionStream/DecompressionStream에서 지원되는 런타임에서만 사용할 수 있습니다.
10
+ *
11
+ * @module adapters/BrowserAdapter
12
+ */
13
+
14
+ /**
15
+ * Web API를 사용하여 PlatformAdapter를 구현하는 BrowserAdapter:
16
+ * - AES-256-GCM 및 SHA-256을 위한 Web Crypto API(SubtleCrypto)
17
+ * - 안전한 랜덤 바이트를 위한 crypto.getRandomValues
18
+ * - deflate-raw 압축을 위한 CompressionStream/DecompressionStream
19
+ * - 런타임이 지원하는 경우 Brotli 압축
20
+ */
21
+ declare class BrowserAdapter implements PlatformAdapter {
22
+ readonly supportsSyncCrypto = false;
23
+ readonly supportsSyncCompression = false;
24
+ readonly supportsBrotli: boolean;
25
+ readonly runtime: "browser";
26
+ /**
27
+ * UTF-8 키 문자열에서 SHA-256을 통해 256비트 키를 파생합니다.
28
+ * UTF-8 인코딩된 키에 SubtleCrypto.digest('SHA-256', ...)를 사용합니다.
29
+ */
30
+ deriveKey(key: string, options?: KeyDerivationOptions): Promise<Uint8Array>;
31
+ /**
32
+ * 12바이트 IV를 사용하여 AES-256-GCM으로 데이터를 암호화합니다.
33
+ * 와이어 포맷 반환: IV(12바이트) + authTag(16바이트) + 암호문.
34
+ *
35
+ * 참고: Web Crypto는 authTag를 암호문에 추가하므로,
36
+ * 마지막 16바이트를 authTag로 추출하고 와이어 포맷에 맞게 재배치합니다.
37
+ */
38
+ encrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
39
+ /**
40
+ * AES-256-GCM 페이로드를 복호화합니다.
41
+ * 와이어 포맷 기대: IV(12바이트) + authTag(16바이트) + 암호문.
42
+ * 복호화 전에 Web Crypto 형식(암호문 + authTag)으로 재구성합니다.
43
+ */
44
+ decrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
45
+ /**
46
+ * 암호학적으로 안전한 랜덤 바이트를 생성합니다.
47
+ */
48
+ randomBytes(length: number): Uint8Array;
49
+ /**
50
+ * CompressionStream을 통해 deflate로 데이터를 압축합니다.
51
+ * Node.js zlib.deflateRaw와의 상호운용성을 위해 'deflate-raw' 형식만 사용합니다.
52
+ */
53
+ deflate(data: Uint8Array, _level?: number): Promise<Uint8Array>;
54
+ /**
55
+ * DecompressionStream을 통해 deflate 데이터를 압축 해제합니다.
56
+ * Node.js zlib.inflateRaw와의 상호운용성을 위해 'deflate-raw' 형식만 사용합니다.
57
+ * maxBytes가 지정되면 제한을 적용합니다.
58
+ */
59
+ inflate(data: Uint8Array, maxBytes?: number): Promise<Uint8Array>;
60
+ /**
61
+ * CompressionStream을 통해 Brotli로 데이터를 압축합니다.
62
+ * 브라우저 Web API는 Brotli 품질 레벨을 받지 않으므로 level 값은 무시됩니다.
63
+ */
64
+ brotliCompress(data: Uint8Array, _level?: number): Promise<Uint8Array>;
65
+ /**
66
+ * DecompressionStream을 통해 Brotli 데이터를 압축 해제합니다.
67
+ */
68
+ brotliDecompress(data: Uint8Array, maxBytes?: number): Promise<Uint8Array>;
69
+ /**
70
+ * CompressionStream에 적합한 deflate 형식을 결정합니다.
71
+ * Node.js zlib.deflateRaw와의 상호운용성을 위해 'deflate-raw'만 사용합니다.
72
+ */
73
+ private getDeflateFormat;
74
+ private writeAndReadStream;
75
+ private readAllChunks;
76
+ }
77
+
78
+ /**
79
+ * Runtime detection helpers with no platform-specific imports.
80
+ *
81
+ * @module adapters/runtime
82
+ */
83
+ /** 감지된 런타임 환경 식별자 */
84
+ type RuntimeId = "node" | "browser" | "edge" | "deno" | "bun" | "unknown";
85
+ /**
86
+ * 현재 JavaScript 런타임 환경을 감지합니다.
87
+ *
88
+ * 감지는 순수하게 globalThis 검사에 기반하며 Node.js 내장 모듈을 임포트하지 않습니다.
89
+ */
90
+ declare function detectRuntime(): RuntimeId;
91
+
92
+ /**
93
+ * ddunigma Web Streams API 구현.
94
+ *
95
+ * Web Streams API(globalThis.TransformStream)를 사용하는
96
+ * TransformStream 기반 인코딩/디코딩 파이프라인을 제공합니다.
97
+ * 모든 최신 브라우저와 Node.js에서 사용 가능합니다.
98
+ *
99
+ * 스트리밍 모드:
100
+ * - 압축/암호화/체크섬 비활성화 + 2의 제곱수 charset: 진정한 청크 단위 스트리밍
101
+ * - 그 외: 전체 축적 후 일괄 처리 (알고리즘/와이어 포맷 제약)
102
+ *
103
+ * 스트림 헤더 형식: [pad]DDS1[D|B|N][1|0][pad]
104
+ * D=deflate, B=brotli, N=없음 (압축), 1/0 (암호화).
105
+ *
106
+ * @module streams/WebStreams
107
+ */
108
+
109
+ /**
110
+ * 바이너리 데이터를 charset 인코딩 문자열로 변환하는
111
+ * Web Streams API TransformStream을 생성합니다.
112
+ *
113
+ * 압축/암호화/체크섬이 비활성화되고 charset이 2의 제곱수일 때 각 청크를 즉시 인코딩합니다.
114
+ * 그 외에는 전체 데이터를 축적한 후 flush에서 처리합니다.
115
+ *
116
+ * @param encoder - 인코딩에 사용할 Ddu64Core 인스턴스
117
+ * @param options - 인코딩 옵션 (compress, encrypt, compressionAlgorithm 등)
118
+ * @returns TransformStream<Uint8Array, string>
119
+ */
120
+ declare function createReadableEncodeStream(encoder: Ddu64Core, options?: DduOptions): TransformStream<Uint8Array, string>;
121
+ /**
122
+ * charset 인코딩 문자열을 바이너리 데이터로 역변환하는
123
+ * Web Streams API TransformStream을 생성합니다.
124
+ *
125
+ * 스트림은 DDS1 스트림 헤더를 파싱하여 압축 및 암호화 설정을 감지한 후
126
+ * 페이로드를 그에 맞게 디코딩합니다.
127
+ *
128
+ * 압축/암호화/체크섬이 없고 charset이 2의 제곱수인 스트림은 헤더 파싱 후 각 청크를 즉시 디코딩합니다.
129
+ * 그 외에는 전체 페이로드를 축적 후 일괄 디코딩합니다.
130
+ *
131
+ * @param encoder - 디코딩에 사용할 Ddu64Core 인스턴스
132
+ * @param options - 디코딩 옵션
133
+ * @returns TransformStream<string, Uint8Array>
134
+ */
135
+ declare function createReadableDecodeStream(encoder: Ddu64Core, options?: DduOptions): TransformStream<string, Uint8Array>;
136
+
137
+ /**
138
+ * 한글 음절 난독화 레이어 구현.
139
+ *
140
+ * 암호화된 charset 인코딩 문자열을 결정론적 전단사 매핑을 사용하여
141
+ * 자연스러운 한국어 음절 블록으로 변환합니다. 매핑은 다음을 보장합니다:
142
+ * - 모든 출력 문자가 유효한 한국어 음절 블록 (U+AC00–U+D7A3)
143
+ * - 단일 문자 빈도가 기대 균등 빈도의 3배를 초과하지 않음
144
+ * - 출력 길이 <= 입력 길이의 1.5배 (실제로는 1:1 매핑)
145
+ *
146
+ * 플랫폼 독립적: Node.js 임포트 없음.
147
+ *
148
+ * @module obfuscation/ObfuscationLayer
149
+ */
150
+
151
+ /**
152
+ * 한글 음절 매핑을 사용하여 ObfuscationLayer 인터페이스를 구현합니다.
153
+ *
154
+ * 입력 알파벳(인코더가 사용하는 charset 문자)이 주어지면,
155
+ * 이 레이어는 각 문자를 결정론적으로 한글 음절에 매핑합니다.
156
+ * 매핑은 전단사(가역적)이며 위치에 따라 각 문자의 할당된 음절 범위를
157
+ * 순환하여 출력 빈도를 균등하게 분배합니다.
158
+ */
159
+ declare class HangulObfuscationLayer implements ObfuscationLayer {
160
+ private readonly config;
161
+ /**
162
+ * 새 HangulObfuscationLayer를 생성합니다.
163
+ *
164
+ * @param alphabet - 완전한 입력 알파벳 (charset 문자 + 패딩 문자).
165
+ * 인코딩된 문자열에 나타날 수 있는 모든 고유 문자.
166
+ */
167
+ constructor(alphabet: string[]);
168
+ /**
169
+ * 암호화된 charset 인코딩 문자열을 한글 음절로 변환합니다.
170
+ *
171
+ * 각 입력 문자는 할당된 범위의 한글 음절에 매핑됩니다.
172
+ * 문자열 내 위치가 범위 내 어떤 음절을 사용할지 결정하여
173
+ * 균등한 빈도 분포를 보장합니다.
174
+ *
175
+ * @param input - 암호화된 charset 인코딩 문자열
176
+ * @returns 한글 음절 블록 문자열 (U+AC00–U+D7A3)
177
+ * @throws 입력에 알파벳에 없는 문자가 포함된 경우 에러
178
+ */
179
+ obfuscate(input: string): string;
180
+ /**
181
+ * 난독화를 역변환하여 원본 charset 인코딩 문자열을 복원합니다.
182
+ *
183
+ * 각 한글 음절이 어떤 문자의 범위에 속하는지 판별하여
184
+ * 원래 문자로 매핑합니다.
185
+ *
186
+ * @param input - 난독화된 한글 음절 문자열
187
+ * @returns 원본 charset 인코딩 문자열
188
+ * @throws 입력에 유효한 한글 음절 범위 밖의 문자가 포함되거나
189
+ * 알파벳 문자에 매핑되지 않는 문자가 포함된 경우 에러
190
+ */
191
+ deobfuscate(input: string): string;
192
+ }
193
+ /**
194
+ * 주어진 charset 설정에 대한 ObfuscationLayer를 생성합니다.
195
+ *
196
+ * charset 문자와 패딩 문자로부터 완전한 알파벳을 구성한 후
197
+ * 한글 난독화 레이어를 생성합니다.
198
+ *
199
+ * @param charSet - 인코딩에 사용되는 charset 문자
200
+ * @param paddingChar - 패딩 문자
201
+ * @returns ObfuscationLayer 인스턴스
202
+ */
203
+ declare function createObfuscationLayer(charSet: string[], paddingChar: string): ObfuscationLayer;
204
+
205
+ export { BrowserAdapter as B, HangulObfuscationLayer as H, createReadableDecodeStream as a, createReadableEncodeStream as b, createObfuscationLayer as c, detectRuntime as d };
@@ -0,0 +1,205 @@
1
+ import { P as PlatformAdapter, i as KeyDerivationOptions, D as Ddu64Core, e as DduOptions, O as ObfuscationLayer } from './core-DYSnygnp.cjs';
2
+
3
+ /**
4
+ * 브라우저 플랫폼 어댑터 구현.
5
+ * 암호화 연산에 Web Crypto API(SubtleCrypto)를 사용하고
6
+ * 압축에 CompressionStream/DecompressionStream을 사용합니다.
7
+ *
8
+ * 이 어댑터는 동기 암호화 또는 압축 연산을 지원하지 않습니다.
9
+ * Brotli는 CompressionStream/DecompressionStream에서 지원되는 런타임에서만 사용할 수 있습니다.
10
+ *
11
+ * @module adapters/BrowserAdapter
12
+ */
13
+
14
+ /**
15
+ * Web API를 사용하여 PlatformAdapter를 구현하는 BrowserAdapter:
16
+ * - AES-256-GCM 및 SHA-256을 위한 Web Crypto API(SubtleCrypto)
17
+ * - 안전한 랜덤 바이트를 위한 crypto.getRandomValues
18
+ * - deflate-raw 압축을 위한 CompressionStream/DecompressionStream
19
+ * - 런타임이 지원하는 경우 Brotli 압축
20
+ */
21
+ declare class BrowserAdapter implements PlatformAdapter {
22
+ readonly supportsSyncCrypto = false;
23
+ readonly supportsSyncCompression = false;
24
+ readonly supportsBrotli: boolean;
25
+ readonly runtime: "browser";
26
+ /**
27
+ * UTF-8 키 문자열에서 SHA-256을 통해 256비트 키를 파생합니다.
28
+ * UTF-8 인코딩된 키에 SubtleCrypto.digest('SHA-256', ...)를 사용합니다.
29
+ */
30
+ deriveKey(key: string, options?: KeyDerivationOptions): Promise<Uint8Array>;
31
+ /**
32
+ * 12바이트 IV를 사용하여 AES-256-GCM으로 데이터를 암호화합니다.
33
+ * 와이어 포맷 반환: IV(12바이트) + authTag(16바이트) + 암호문.
34
+ *
35
+ * 참고: Web Crypto는 authTag를 암호문에 추가하므로,
36
+ * 마지막 16바이트를 authTag로 추출하고 와이어 포맷에 맞게 재배치합니다.
37
+ */
38
+ encrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
39
+ /**
40
+ * AES-256-GCM 페이로드를 복호화합니다.
41
+ * 와이어 포맷 기대: IV(12바이트) + authTag(16바이트) + 암호문.
42
+ * 복호화 전에 Web Crypto 형식(암호문 + authTag)으로 재구성합니다.
43
+ */
44
+ decrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
45
+ /**
46
+ * 암호학적으로 안전한 랜덤 바이트를 생성합니다.
47
+ */
48
+ randomBytes(length: number): Uint8Array;
49
+ /**
50
+ * CompressionStream을 통해 deflate로 데이터를 압축합니다.
51
+ * Node.js zlib.deflateRaw와의 상호운용성을 위해 'deflate-raw' 형식만 사용합니다.
52
+ */
53
+ deflate(data: Uint8Array, _level?: number): Promise<Uint8Array>;
54
+ /**
55
+ * DecompressionStream을 통해 deflate 데이터를 압축 해제합니다.
56
+ * Node.js zlib.inflateRaw와의 상호운용성을 위해 'deflate-raw' 형식만 사용합니다.
57
+ * maxBytes가 지정되면 제한을 적용합니다.
58
+ */
59
+ inflate(data: Uint8Array, maxBytes?: number): Promise<Uint8Array>;
60
+ /**
61
+ * CompressionStream을 통해 Brotli로 데이터를 압축합니다.
62
+ * 브라우저 Web API는 Brotli 품질 레벨을 받지 않으므로 level 값은 무시됩니다.
63
+ */
64
+ brotliCompress(data: Uint8Array, _level?: number): Promise<Uint8Array>;
65
+ /**
66
+ * DecompressionStream을 통해 Brotli 데이터를 압축 해제합니다.
67
+ */
68
+ brotliDecompress(data: Uint8Array, maxBytes?: number): Promise<Uint8Array>;
69
+ /**
70
+ * CompressionStream에 적합한 deflate 형식을 결정합니다.
71
+ * Node.js zlib.deflateRaw와의 상호운용성을 위해 'deflate-raw'만 사용합니다.
72
+ */
73
+ private getDeflateFormat;
74
+ private writeAndReadStream;
75
+ private readAllChunks;
76
+ }
77
+
78
+ /**
79
+ * Runtime detection helpers with no platform-specific imports.
80
+ *
81
+ * @module adapters/runtime
82
+ */
83
+ /** 감지된 런타임 환경 식별자 */
84
+ type RuntimeId = "node" | "browser" | "edge" | "deno" | "bun" | "unknown";
85
+ /**
86
+ * 현재 JavaScript 런타임 환경을 감지합니다.
87
+ *
88
+ * 감지는 순수하게 globalThis 검사에 기반하며 Node.js 내장 모듈을 임포트하지 않습니다.
89
+ */
90
+ declare function detectRuntime(): RuntimeId;
91
+
92
+ /**
93
+ * ddunigma Web Streams API 구현.
94
+ *
95
+ * Web Streams API(globalThis.TransformStream)를 사용하는
96
+ * TransformStream 기반 인코딩/디코딩 파이프라인을 제공합니다.
97
+ * 모든 최신 브라우저와 Node.js에서 사용 가능합니다.
98
+ *
99
+ * 스트리밍 모드:
100
+ * - 압축/암호화/체크섬 비활성화 + 2의 제곱수 charset: 진정한 청크 단위 스트리밍
101
+ * - 그 외: 전체 축적 후 일괄 처리 (알고리즘/와이어 포맷 제약)
102
+ *
103
+ * 스트림 헤더 형식: [pad]DDS1[D|B|N][1|0][pad]
104
+ * D=deflate, B=brotli, N=없음 (압축), 1/0 (암호화).
105
+ *
106
+ * @module streams/WebStreams
107
+ */
108
+
109
+ /**
110
+ * 바이너리 데이터를 charset 인코딩 문자열로 변환하는
111
+ * Web Streams API TransformStream을 생성합니다.
112
+ *
113
+ * 압축/암호화/체크섬이 비활성화되고 charset이 2의 제곱수일 때 각 청크를 즉시 인코딩합니다.
114
+ * 그 외에는 전체 데이터를 축적한 후 flush에서 처리합니다.
115
+ *
116
+ * @param encoder - 인코딩에 사용할 Ddu64Core 인스턴스
117
+ * @param options - 인코딩 옵션 (compress, encrypt, compressionAlgorithm 등)
118
+ * @returns TransformStream<Uint8Array, string>
119
+ */
120
+ declare function createReadableEncodeStream(encoder: Ddu64Core, options?: DduOptions): TransformStream<Uint8Array, string>;
121
+ /**
122
+ * charset 인코딩 문자열을 바이너리 데이터로 역변환하는
123
+ * Web Streams API TransformStream을 생성합니다.
124
+ *
125
+ * 스트림은 DDS1 스트림 헤더를 파싱하여 압축 및 암호화 설정을 감지한 후
126
+ * 페이로드를 그에 맞게 디코딩합니다.
127
+ *
128
+ * 압축/암호화/체크섬이 없고 charset이 2의 제곱수인 스트림은 헤더 파싱 후 각 청크를 즉시 디코딩합니다.
129
+ * 그 외에는 전체 페이로드를 축적 후 일괄 디코딩합니다.
130
+ *
131
+ * @param encoder - 디코딩에 사용할 Ddu64Core 인스턴스
132
+ * @param options - 디코딩 옵션
133
+ * @returns TransformStream<string, Uint8Array>
134
+ */
135
+ declare function createReadableDecodeStream(encoder: Ddu64Core, options?: DduOptions): TransformStream<string, Uint8Array>;
136
+
137
+ /**
138
+ * 한글 음절 난독화 레이어 구현.
139
+ *
140
+ * 암호화된 charset 인코딩 문자열을 결정론적 전단사 매핑을 사용하여
141
+ * 자연스러운 한국어 음절 블록으로 변환합니다. 매핑은 다음을 보장합니다:
142
+ * - 모든 출력 문자가 유효한 한국어 음절 블록 (U+AC00–U+D7A3)
143
+ * - 단일 문자 빈도가 기대 균등 빈도의 3배를 초과하지 않음
144
+ * - 출력 길이 <= 입력 길이의 1.5배 (실제로는 1:1 매핑)
145
+ *
146
+ * 플랫폼 독립적: Node.js 임포트 없음.
147
+ *
148
+ * @module obfuscation/ObfuscationLayer
149
+ */
150
+
151
+ /**
152
+ * 한글 음절 매핑을 사용하여 ObfuscationLayer 인터페이스를 구현합니다.
153
+ *
154
+ * 입력 알파벳(인코더가 사용하는 charset 문자)이 주어지면,
155
+ * 이 레이어는 각 문자를 결정론적으로 한글 음절에 매핑합니다.
156
+ * 매핑은 전단사(가역적)이며 위치에 따라 각 문자의 할당된 음절 범위를
157
+ * 순환하여 출력 빈도를 균등하게 분배합니다.
158
+ */
159
+ declare class HangulObfuscationLayer implements ObfuscationLayer {
160
+ private readonly config;
161
+ /**
162
+ * 새 HangulObfuscationLayer를 생성합니다.
163
+ *
164
+ * @param alphabet - 완전한 입력 알파벳 (charset 문자 + 패딩 문자).
165
+ * 인코딩된 문자열에 나타날 수 있는 모든 고유 문자.
166
+ */
167
+ constructor(alphabet: string[]);
168
+ /**
169
+ * 암호화된 charset 인코딩 문자열을 한글 음절로 변환합니다.
170
+ *
171
+ * 각 입력 문자는 할당된 범위의 한글 음절에 매핑됩니다.
172
+ * 문자열 내 위치가 범위 내 어떤 음절을 사용할지 결정하여
173
+ * 균등한 빈도 분포를 보장합니다.
174
+ *
175
+ * @param input - 암호화된 charset 인코딩 문자열
176
+ * @returns 한글 음절 블록 문자열 (U+AC00–U+D7A3)
177
+ * @throws 입력에 알파벳에 없는 문자가 포함된 경우 에러
178
+ */
179
+ obfuscate(input: string): string;
180
+ /**
181
+ * 난독화를 역변환하여 원본 charset 인코딩 문자열을 복원합니다.
182
+ *
183
+ * 각 한글 음절이 어떤 문자의 범위에 속하는지 판별하여
184
+ * 원래 문자로 매핑합니다.
185
+ *
186
+ * @param input - 난독화된 한글 음절 문자열
187
+ * @returns 원본 charset 인코딩 문자열
188
+ * @throws 입력에 유효한 한글 음절 범위 밖의 문자가 포함되거나
189
+ * 알파벳 문자에 매핑되지 않는 문자가 포함된 경우 에러
190
+ */
191
+ deobfuscate(input: string): string;
192
+ }
193
+ /**
194
+ * 주어진 charset 설정에 대한 ObfuscationLayer를 생성합니다.
195
+ *
196
+ * charset 문자와 패딩 문자로부터 완전한 알파벳을 구성한 후
197
+ * 한글 난독화 레이어를 생성합니다.
198
+ *
199
+ * @param charSet - 인코딩에 사용되는 charset 문자
200
+ * @param paddingChar - 패딩 문자
201
+ * @returns ObfuscationLayer 인스턴스
202
+ */
203
+ declare function createObfuscationLayer(charSet: string[], paddingChar: string): ObfuscationLayer;
204
+
205
+ export { BrowserAdapter as B, HangulObfuscationLayer as H, createReadableDecodeStream as a, createReadableEncodeStream as b, createObfuscationLayer as c, detectRuntime as d };