@ddunigma/node 2.0.1 → 2.1.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.
- package/LICENCE +1 -1
- package/README.md +304 -46
- package/dist/cjs/base/BaseDdu.d.ts +35 -9
- package/dist/cjs/base/BaseDdu.js +14 -39
- package/dist/cjs/charSets/index.d.ts +14 -0
- package/dist/cjs/charSets/index.js +4292 -4248
- package/dist/cjs/encoders/Ddu64.d.ts +264 -10
- package/dist/cjs/encoders/Ddu64.js +1047 -205
- package/dist/cjs/encoders/index.js +0 -1
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.js +8 -4
- package/dist/cjs/types/DduDefaultTypes.js +5 -0
- package/dist/cjs/types/DduInterface.d.ts +72 -5
- package/dist/cjs/utils/CharsetBuilder.d.ts +129 -0
- package/dist/cjs/utils/CharsetBuilder.js +246 -0
- package/dist/cjs/utils/DduPipeline.d.ts +114 -0
- package/dist/cjs/utils/DduPipeline.js +229 -0
- package/dist/cjs/utils/DduStream.d.ts +64 -0
- package/dist/cjs/utils/DduStream.js +221 -0
- package/dist/cjs/utils/crypto.d.ts +30 -0
- package/dist/cjs/utils/crypto.js +84 -0
- package/dist/cjs/utils/index.d.ts +3 -0
- package/dist/cjs/utils/index.js +12 -0
- package/dist/mjs/base/BaseDdu.d.ts +35 -9
- package/dist/mjs/base/BaseDdu.js +14 -39
- package/dist/mjs/base/index.js +1 -1
- package/dist/mjs/charSets/index.d.ts +14 -0
- package/dist/mjs/charSets/index.js +4293 -4249
- package/dist/mjs/encoders/Ddu64.d.ts +264 -10
- package/dist/mjs/encoders/Ddu64.js +1080 -211
- package/dist/mjs/encoders/index.js +1 -2
- package/dist/mjs/index.d.ts +2 -1
- package/dist/mjs/index.js +4 -6
- package/dist/mjs/types/DduDefaultTypes.js +6 -1
- package/dist/mjs/types/DduInterface.d.ts +72 -5
- package/dist/mjs/types/index.js +3 -3
- package/dist/mjs/utils/CharsetBuilder.d.ts +129 -0
- package/dist/mjs/utils/CharsetBuilder.js +241 -0
- package/dist/mjs/utils/DduPipeline.d.ts +114 -0
- package/dist/mjs/utils/DduPipeline.js +223 -0
- package/dist/mjs/utils/DduStream.d.ts +64 -0
- package/dist/mjs/utils/DduStream.js +225 -0
- package/dist/mjs/utils/crypto.d.ts +30 -0
- package/dist/mjs/utils/crypto.js +78 -0
- package/dist/mjs/utils/index.d.ts +3 -0
- package/dist/mjs/utils/index.js +3 -0
- package/package.json +15 -8
package/LICENCE
CHANGED
package/README.md
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
## ddunigma Node
|
|
1
|
+
## ddunigma Node
|
|
2
|
+
|
|
2
3
|
[](https://www.npmjs.com/package/@ddunigma/node)
|
|
3
4
|
|
|
4
|
-
## Overview
|
|
5
|
+
## Overview
|
|
5
6
|
|
|
6
7
|
Node.js implementation of [ddunigma](https://github.com/i3l3/ddunigma) (Python original)
|
|
7
8
|
|
|
9
|
+
커스텀 charset을 사용하는 Base64 스타일 인코더/디코더 라이브러리입니다.
|
|
10
|
+
|
|
8
11
|
### Credits
|
|
9
12
|
|
|
10
13
|
- Original Python Implementation by:
|
|
@@ -24,7 +27,7 @@ npm install @ddunigma/node
|
|
|
24
27
|
|
|
25
28
|
## Usage
|
|
26
29
|
|
|
27
|
-
###
|
|
30
|
+
### 기본 인코딩/디코딩
|
|
28
31
|
|
|
29
32
|
```typescript
|
|
30
33
|
import { Ddu64 } from "@ddunigma/node";
|
|
@@ -46,88 +49,343 @@ console.log(decoded); // "Hello World!"
|
|
|
46
49
|
import { Ddu64, DduSetSymbol } from "@ddunigma/node";
|
|
47
50
|
|
|
48
51
|
// ONECHARSET (64개 문자)
|
|
49
|
-
const encoder1 = new Ddu64(undefined, undefined, {
|
|
50
|
-
dduSetSymbol: DduSetSymbol.ONECHARSET
|
|
52
|
+
const encoder1 = new Ddu64(undefined, undefined, {
|
|
53
|
+
dduSetSymbol: DduSetSymbol.ONECHARSET,
|
|
51
54
|
});
|
|
52
55
|
|
|
53
56
|
// DDU (8개 문자)
|
|
54
|
-
const encoder2 = new Ddu64(undefined, undefined, {
|
|
55
|
-
dduSetSymbol: DduSetSymbol.DDU
|
|
57
|
+
const encoder2 = new Ddu64(undefined, undefined, {
|
|
58
|
+
dduSetSymbol: DduSetSymbol.DDU,
|
|
56
59
|
});
|
|
57
60
|
|
|
58
61
|
// TWOCHARSET (1024개 문자)
|
|
59
|
-
const encoder3 = new Ddu64(undefined, undefined, {
|
|
60
|
-
dduSetSymbol: DduSetSymbol.TWOCHARSET
|
|
62
|
+
const encoder3 = new Ddu64(undefined, undefined, {
|
|
63
|
+
dduSetSymbol: DduSetSymbol.TWOCHARSET,
|
|
61
64
|
});
|
|
62
65
|
|
|
63
66
|
// THREECHARSET (32768개 문자)
|
|
64
|
-
const encoder4 = new Ddu64(undefined, undefined, {
|
|
65
|
-
dduSetSymbol: DduSetSymbol.THREECHARSET
|
|
67
|
+
const encoder4 = new Ddu64(undefined, undefined, {
|
|
68
|
+
dduSetSymbol: DduSetSymbol.THREECHARSET,
|
|
66
69
|
});
|
|
67
70
|
|
|
68
71
|
const text = "안녕하세요";
|
|
69
72
|
const encoded = encoder1.encode(text);
|
|
70
73
|
const decoded = encoder1.decode(encoded);
|
|
71
|
-
const decodedBuffer = encoder1.decodeToBuffer(encoded);
|
|
72
74
|
```
|
|
73
75
|
|
|
74
|
-
###
|
|
76
|
+
### 압축 인코딩
|
|
75
77
|
|
|
76
78
|
```typescript
|
|
77
79
|
import { Ddu64 } from "@ddunigma/node";
|
|
78
80
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
// 생성자에서 기본 압축 활성화
|
|
82
|
+
const encoder = new Ddu64(undefined, undefined, {
|
|
83
|
+
compress: true,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// 또는 encode 호출 시 압축 옵션 지정
|
|
87
|
+
const text = "반복되는 긴 텍스트...".repeat(100);
|
|
88
|
+
const encoded = encoder.encode(text, { compress: true });
|
|
89
|
+
const decoded = encoder.decode(encoded); // 자동으로 압축 해제
|
|
90
|
+
```
|
|
84
91
|
|
|
85
|
-
|
|
92
|
+
### URL-Safe 인코딩
|
|
86
93
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const
|
|
94
|
+
```typescript
|
|
95
|
+
import { Ddu64 } from "@ddunigma/node";
|
|
96
|
+
|
|
97
|
+
const encoder = new Ddu64(undefined, undefined, {
|
|
98
|
+
dduSetSymbol: DduSetSymbol.ONECHARSET,
|
|
99
|
+
urlSafe: true, // +, /, = 를 URL 안전 문자로 변환
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const encoded = encoder.encode("Hello World!");
|
|
103
|
+
// URL에서 안전하게 사용 가능한 문자열 반환
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 체크섬 (무결성 검증)
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
import { Ddu64 } from "@ddunigma/node";
|
|
110
|
+
|
|
111
|
+
const encoder = new Ddu64(undefined, undefined, {
|
|
112
|
+
checksum: true, // CRC32 체크섬 활성화
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const encoded = encoder.encode("Important data", { checksum: true });
|
|
116
|
+
const decoded = encoder.decode(encoded); // 자동으로 체크섬 검증
|
|
117
|
+
// 체크섬 불일치 시 에러 발생
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 암호화
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
import { Ddu64 } from "@ddunigma/node";
|
|
124
|
+
|
|
125
|
+
const encoder = new Ddu64(undefined, undefined, {
|
|
126
|
+
encryptionKey: "my-secret-key-123", // AES-256-GCM 암호화
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
const encoded = encoder.encode("Secret message!");
|
|
130
|
+
const decoded = encoder.decode(encoded); // 자동으로 복호화
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 청크 분할
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import { Ddu64 } from "@ddunigma/node";
|
|
137
|
+
|
|
138
|
+
const encoder = new Ddu64();
|
|
139
|
+
|
|
140
|
+
const encoded = encoder.encode(longData, {
|
|
141
|
+
chunkSize: 76, // 76자마다 분할
|
|
142
|
+
chunkSeparator: "\n", // 줄바꿈으로 구분
|
|
143
|
+
});
|
|
144
|
+
// 결과: "ABCDxyz...\nEFGHijk...\n..."
|
|
145
|
+
|
|
146
|
+
const decoded = encoder.decode(encoded); // 자동으로 줄바꿈 제거
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 비동기 인코딩/디코딩
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { Ddu64 } from "@ddunigma/node";
|
|
153
|
+
|
|
154
|
+
const encoder = new Ddu64();
|
|
155
|
+
|
|
156
|
+
// 비동기 인코딩 (이벤트 루프 블로킹 방지)
|
|
157
|
+
const encoded = await encoder.encodeAsync(largeData);
|
|
158
|
+
const decoded = await encoder.decodeAsync(encoded);
|
|
159
|
+
const buffer = await encoder.decodeToBufferAsync(encoded);
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 진행률 콜백
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
import { Ddu64 } from "@ddunigma/node";
|
|
166
|
+
|
|
167
|
+
const encoder = new Ddu64();
|
|
168
|
+
|
|
169
|
+
encoder.encode(largeData, {
|
|
170
|
+
onProgress: (info) => {
|
|
171
|
+
console.log(`진행률: ${info.percent}%`);
|
|
172
|
+
console.log(`처리됨: ${info.processedBytes}/${info.totalBytes}`);
|
|
173
|
+
},
|
|
174
|
+
});
|
|
91
175
|
```
|
|
92
176
|
|
|
93
|
-
|
|
177
|
+
### 통계/분석
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
import { Ddu64 } from "@ddunigma/node";
|
|
181
|
+
|
|
182
|
+
const encoder = new Ddu64();
|
|
183
|
+
|
|
184
|
+
const stats = encoder.getStats("Test data", { compress: true });
|
|
185
|
+
console.log(stats);
|
|
186
|
+
// {
|
|
187
|
+
// originalSize: 9,
|
|
188
|
+
// encodedSize: 12,
|
|
189
|
+
// compressedSize: 17,
|
|
190
|
+
// compressionRatio: 1.89,
|
|
191
|
+
// expansionRatio: 1.33,
|
|
192
|
+
// charsetSize: 64,
|
|
193
|
+
// bitLength: 6
|
|
194
|
+
// }
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Zip Bomb 방어
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
import { Ddu64 } from "@ddunigma/node";
|
|
201
|
+
|
|
202
|
+
const encoder = new Ddu64(undefined, undefined, {
|
|
203
|
+
maxDecodedBytes: 10 * 1024 * 1024, // 10MB
|
|
204
|
+
maxDecompressedBytes: 50 * 1024 * 1024, // 50MB
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
// 제한 초과 시 에러 발생
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## CharsetBuilder
|
|
213
|
+
|
|
214
|
+
커스텀 charset을 쉽게 생성할 수 있는 빌더 유틸리티입니다.
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
import { CharsetBuilder } from "@ddunigma/node";
|
|
218
|
+
|
|
219
|
+
// 유니코드 범위에서 생성
|
|
220
|
+
const chars1 = CharsetBuilder.fromUnicodeRange(0x4e00, 0x4e3f).build();
|
|
221
|
+
|
|
222
|
+
// Base64 문자셋
|
|
223
|
+
const chars2 = CharsetBuilder.base64().build();
|
|
224
|
+
|
|
225
|
+
// 혼동 문자 제외 (0, O, 1, l, I 등)
|
|
226
|
+
const chars3 = CharsetBuilder.base64().excludeConfusing().build();
|
|
227
|
+
|
|
228
|
+
// 2의 제곱수로 제한
|
|
229
|
+
const chars4 = CharsetBuilder.fromString("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
|
|
230
|
+
.limitToPowerOfTwo()
|
|
231
|
+
.build(); // 32자
|
|
232
|
+
|
|
233
|
+
// URL 안전 문자만
|
|
234
|
+
const chars5 = CharsetBuilder.base64().excludeUrlUnsafe().build();
|
|
235
|
+
|
|
236
|
+
// 시드 기반 셔플
|
|
237
|
+
const chars6 = CharsetBuilder.base64().shuffle(12345).build();
|
|
238
|
+
|
|
239
|
+
// 패딩 문자와 함께 빌드
|
|
240
|
+
const { charset, padding } = CharsetBuilder.base64().buildWithPadding();
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## DduPipeline
|
|
246
|
+
|
|
247
|
+
다단계 인코딩/암호화/압축을 조합할 수 있는 파이프라인 빌더입니다.
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
import { DduPipeline, Ddu64 } from "@ddunigma/node";
|
|
251
|
+
|
|
252
|
+
const encoder = new Ddu64();
|
|
253
|
+
|
|
254
|
+
// 압축 → 암호화 → 인코딩 파이프라인
|
|
255
|
+
const pipeline = new DduPipeline()
|
|
256
|
+
.compress()
|
|
257
|
+
.encrypt("my-secret-key")
|
|
258
|
+
.encode(encoder);
|
|
259
|
+
|
|
260
|
+
const encoded = pipeline.processToString("Hello World!");
|
|
261
|
+
|
|
262
|
+
// 역순 파이프라인으로 복원
|
|
263
|
+
const decoded = pipeline.reverse().processToString(encoded);
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 스트림 지원
|
|
269
|
+
|
|
270
|
+
대용량 파일 처리를 위한 스트림 인코딩/디코딩을 지원합니다.
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
import { Ddu64, createEncodeStream, createDecodeStream } from "@ddunigma/node";
|
|
274
|
+
import fs from "fs";
|
|
275
|
+
|
|
276
|
+
const encoder = new Ddu64();
|
|
277
|
+
|
|
278
|
+
// 인코딩 스트림
|
|
279
|
+
fs.createReadStream("input.bin")
|
|
280
|
+
.pipe(createEncodeStream(encoder))
|
|
281
|
+
.pipe(fs.createWriteStream("output.txt"));
|
|
282
|
+
|
|
283
|
+
// 디코딩 스트림
|
|
284
|
+
fs.createReadStream("output.txt")
|
|
285
|
+
.pipe(createDecodeStream(encoder))
|
|
286
|
+
.pipe(fs.createWriteStream("restored.bin"));
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## API Reference
|
|
94
292
|
|
|
95
293
|
### `new Ddu64(dduChar?, paddingChar?, options?)`
|
|
96
294
|
|
|
97
295
|
인코더 인스턴스를 생성합니다.
|
|
98
296
|
|
|
99
297
|
**Parameters:**
|
|
100
|
-
- `dduChar` (string | string[]): charset 문자열 또는 배열
|
|
101
|
-
- `paddingChar` (string): 패딩 문자
|
|
102
|
-
- `options` (DduOptions): 옵션 객체
|
|
103
|
-
- `dduSetSymbol`: 미리 정의된 charset 사용
|
|
104
|
-
- `encoding`: Buffer encoding (기본값: 'utf-8')
|
|
105
|
-
- `usePowerOfTwo`: 2의 제곱수 강제 여부
|
|
106
|
-
- `useBuildErrorReturn`: 에러 발생 시 throw 여부
|
|
107
298
|
|
|
108
|
-
|
|
299
|
+
| Parameter | Type | Description |
|
|
300
|
+
| ------------- | ----------------------- | ------------------------ |
|
|
301
|
+
| `dduChar` | `string \| string[]` | charset 문자열 또는 배열 |
|
|
302
|
+
| `paddingChar` | `string` | 패딩 문자 |
|
|
303
|
+
| `options` | `DduConstructorOptions` | 옵션 객체 |
|
|
304
|
+
|
|
305
|
+
**DduConstructorOptions:**
|
|
306
|
+
|
|
307
|
+
| Option | Type | Default | Description |
|
|
308
|
+
| ---------------------- | ---------------- | ----------- | --------------------------- |
|
|
309
|
+
| `dduSetSymbol` | `DduSetSymbol` | `DDU` | 미리 정의된 charset 심볼 |
|
|
310
|
+
| `encoding` | `BufferEncoding` | `'utf-8'` | 문자열 인코딩 |
|
|
311
|
+
| `usePowerOfTwo` | `boolean` | `true` | 2의 제곱수 강제 여부 |
|
|
312
|
+
| `useBuildErrorReturn` | `boolean` | `false` | 에러 발생 시 throw 여부 |
|
|
313
|
+
| `compress` | `boolean` | `false` | 기본 압축 활성화 |
|
|
314
|
+
| `maxDecodedBytes` | `number` | `67108864` | 최대 디코딩 바이트 (64MB) |
|
|
315
|
+
| `maxDecompressedBytes` | `number` | `67108864` | 최대 압축해제 바이트 (64MB) |
|
|
316
|
+
| `urlSafe` | `boolean` | `false` | URL-Safe 모드 |
|
|
317
|
+
| `encryptionKey` | `string` | `undefined` | AES-256-GCM 암호화 키 |
|
|
318
|
+
| `checksum` | `boolean` | `false` | CRC32 체크섬 활성화 |
|
|
319
|
+
| `chunkSize` | `number` | `undefined` | 청크 분할 크기 |
|
|
320
|
+
| `chunkSeparator` | `string` | `'\n'` | 청크 구분자 |
|
|
321
|
+
|
|
322
|
+
### `encode(data, options?): string`
|
|
323
|
+
|
|
324
|
+
데이터를 인코딩합니다.
|
|
325
|
+
|
|
326
|
+
**DduOptions:**
|
|
327
|
+
|
|
328
|
+
| Option | Type | Description |
|
|
329
|
+
| ---------------- | ---------- | ---------------- |
|
|
330
|
+
| `compress` | `boolean` | 압축 사용 여부 |
|
|
331
|
+
| `checksum` | `boolean` | 체크섬 추가 여부 |
|
|
332
|
+
| `chunkSize` | `number` | 청크 분할 크기 |
|
|
333
|
+
| `chunkSeparator` | `string` | 청크 구분자 |
|
|
334
|
+
| `onProgress` | `function` | 진행률 콜백 |
|
|
109
335
|
|
|
110
|
-
|
|
336
|
+
### `decode(encoded, options?): string`
|
|
111
337
|
|
|
112
|
-
|
|
338
|
+
인코딩된 문자열을 디코딩합니다.
|
|
113
339
|
|
|
114
|
-
|
|
340
|
+
### `decodeToBuffer(encoded, options?): Buffer`
|
|
115
341
|
|
|
116
|
-
|
|
342
|
+
인코딩된 문자열을 Buffer로 직접 디코딩합니다.
|
|
117
343
|
|
|
118
|
-
|
|
344
|
+
### `encodeAsync(data, options?): Promise<string>`
|
|
119
345
|
|
|
120
|
-
|
|
346
|
+
비동기로 데이터를 인코딩합니다.
|
|
121
347
|
|
|
122
|
-
|
|
348
|
+
### `decodeAsync(encoded, options?): Promise<string>`
|
|
349
|
+
|
|
350
|
+
비동기로 데이터를 디코딩합니다.
|
|
351
|
+
|
|
352
|
+
### `decodeToBufferAsync(encoded, options?): Promise<Buffer>`
|
|
353
|
+
|
|
354
|
+
비동기로 Buffer로 디코딩합니다.
|
|
355
|
+
|
|
356
|
+
### `getStats(data, options?): DduEncodeStats`
|
|
357
|
+
|
|
358
|
+
인코딩 통계 정보를 반환합니다.
|
|
123
359
|
|
|
124
360
|
```typescript
|
|
125
361
|
{
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
362
|
+
originalSize: number; // 원본 데이터 크기
|
|
363
|
+
encodedSize: number; // 인코딩된 문자열 길이
|
|
364
|
+
compressedSize?: number; // 압축된 크기
|
|
365
|
+
compressionRatio?: number; // 압축률 (0-1)
|
|
366
|
+
expansionRatio: number; // 인코딩 확장 비율
|
|
367
|
+
charsetSize: number; // charset 크기
|
|
368
|
+
bitLength: number; // 비트 길이
|
|
132
369
|
}
|
|
133
|
-
```
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### `getCharSetInfo(): CharSetInfo`
|
|
373
|
+
|
|
374
|
+
현재 인코더의 charset 정보를 반환합니다.
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## DduSetSymbol
|
|
379
|
+
|
|
380
|
+
| Symbol | 문자 수 | 비트 길이 | 설명 |
|
|
381
|
+
| -------------- | ------- | --------- | ------------------------- |
|
|
382
|
+
| `DDU` | 8 | 3 | 한글 + 특수문자 기본 세트 |
|
|
383
|
+
| `ONECHARSET` | 64 | 6 | 영문 + 숫자 + 특수문자 |
|
|
384
|
+
| `TWOCHARSET` | 1024 | 10 | 2글자 조합 세트 |
|
|
385
|
+
| `THREECHARSET` | 32768 | 15 | 3글자 조합 세트 |
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## License
|
|
390
|
+
|
|
391
|
+
BSD-2-Clause
|
|
@@ -1,20 +1,46 @@
|
|
|
1
|
-
import { DduOptions
|
|
1
|
+
import { DduOptions } from "../types";
|
|
2
2
|
export declare abstract class BaseDdu {
|
|
3
3
|
protected readonly defaultEncoding: BufferEncoding;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
/**
|
|
5
|
+
* 주어진 숫자보다 작거나 같은 가장 큰 2의 제곱수의 지수를 반환합니다.
|
|
6
|
+
* @param n - 대상 숫자
|
|
7
|
+
* @returns 2의 제곱수 지수 (예: n=8 → 3, n=64 → 6)
|
|
8
|
+
* @example getLargestPowerOfTwoExponent(8) // 3
|
|
9
|
+
* @example getLargestPowerOfTwoExponent(100) // 6
|
|
10
|
+
*/
|
|
8
11
|
protected getLargestPowerOfTwoExponent(n: number): number;
|
|
12
|
+
/**
|
|
13
|
+
* charset 크기에 필요한 비트 길이를 계산합니다.
|
|
14
|
+
* @param setLength - charset 문자 수
|
|
15
|
+
* @returns 필요한 비트 수
|
|
16
|
+
* @example getBitLength(64) // 6
|
|
17
|
+
* @example getBitLength(100) // 7
|
|
18
|
+
*/
|
|
9
19
|
protected getBitLength(setLength: number): number;
|
|
10
|
-
|
|
11
|
-
|
|
20
|
+
/**
|
|
21
|
+
* 입력 데이터를 인코딩합니다.
|
|
22
|
+
* @param input - 인코딩할 문자열 또는 Buffer
|
|
23
|
+
* @param options - 인코딩 옵션
|
|
24
|
+
* @returns 인코딩된 문자열
|
|
25
|
+
*/
|
|
12
26
|
abstract encode(input: Buffer | string, options?: DduOptions): string;
|
|
27
|
+
/**
|
|
28
|
+
* 인코딩된 문자열을 Buffer로 디코딩합니다.
|
|
29
|
+
* @param input - 인코딩된 문자열
|
|
30
|
+
* @param options - 디코딩 옵션
|
|
31
|
+
* @returns 디코딩된 Buffer
|
|
32
|
+
*/
|
|
13
33
|
abstract decodeToBuffer(input: string, options?: DduOptions): Buffer;
|
|
34
|
+
/**
|
|
35
|
+
* 인코딩된 문자열을 원본 문자열로 디코딩합니다.
|
|
36
|
+
* @param input - 인코딩된 문자열
|
|
37
|
+
* @param options - 디코딩 옵션
|
|
38
|
+
* @returns 디코딩된 문자열
|
|
39
|
+
*/
|
|
14
40
|
abstract decode(input: string, options?: DduOptions): string;
|
|
15
41
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
42
|
+
* 현재 인코더의 charset 정보를 반환합니다.
|
|
43
|
+
* @returns charset 설정 정보 객체
|
|
18
44
|
*/
|
|
19
45
|
abstract getCharSetInfo(): {
|
|
20
46
|
charSet: string[];
|
package/dist/cjs/base/BaseDdu.js
CHANGED
|
@@ -4,51 +4,26 @@ exports.BaseDdu = void 0;
|
|
|
4
4
|
class BaseDdu {
|
|
5
5
|
constructor() {
|
|
6
6
|
this.defaultEncoding = "utf-8";
|
|
7
|
-
this.binaryLookup = Array.from({ length: 256 }, (_, i) => i.toString(2).padStart(8, "0"));
|
|
8
|
-
}
|
|
9
|
-
escapeRegExp(str) {
|
|
10
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
11
|
-
}
|
|
12
|
-
*splitString(s, length) {
|
|
13
|
-
for (let i = 0; i < s.length; i += length) {
|
|
14
|
-
yield s.slice(i, Math.min(i + length, s.length));
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
getLargestPowerOfTwo(n) {
|
|
18
|
-
return 2 ** Math.floor(Math.log2(n));
|
|
19
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* 주어진 숫자보다 작거나 같은 가장 큰 2의 제곱수의 지수를 반환합니다.
|
|
10
|
+
* @param n - 대상 숫자
|
|
11
|
+
* @returns 2의 제곱수 지수 (예: n=8 → 3, n=64 → 6)
|
|
12
|
+
* @example getLargestPowerOfTwoExponent(8) // 3
|
|
13
|
+
* @example getLargestPowerOfTwoExponent(100) // 6
|
|
14
|
+
*/
|
|
20
15
|
getLargestPowerOfTwoExponent(n) {
|
|
21
16
|
return Math.floor(Math.log2(n));
|
|
22
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* charset 크기에 필요한 비트 길이를 계산합니다.
|
|
20
|
+
* @param setLength - charset 문자 수
|
|
21
|
+
* @returns 필요한 비트 수
|
|
22
|
+
* @example getBitLength(64) // 6
|
|
23
|
+
* @example getBitLength(100) // 7
|
|
24
|
+
*/
|
|
23
25
|
getBitLength(setLength) {
|
|
24
26
|
return Math.ceil(Math.log2(setLength));
|
|
25
27
|
}
|
|
26
|
-
bufferToDduBinary(input, bitLength) {
|
|
27
|
-
// 성능 최적화: reduce 대신 for loop + join 사용
|
|
28
|
-
if (input.length === 0) {
|
|
29
|
-
return { dduBinary: [], padding: 0 };
|
|
30
|
-
}
|
|
31
|
-
const binaryParts = new Array(input.length);
|
|
32
|
-
for (let i = 0; i < input.length; i++) {
|
|
33
|
-
binaryParts[i] = this.binaryLookup[input[i]];
|
|
34
|
-
}
|
|
35
|
-
const encodedBin = binaryParts.join("");
|
|
36
|
-
const dduBinary = Array.from(this.splitString(encodedBin, bitLength));
|
|
37
|
-
const padding = bitLength - dduBinary[dduBinary.length - 1].length;
|
|
38
|
-
if (padding > 0) {
|
|
39
|
-
dduBinary[dduBinary.length - 1] += "0".repeat(padding);
|
|
40
|
-
}
|
|
41
|
-
return { dduBinary, padding };
|
|
42
|
-
}
|
|
43
|
-
dduBinaryToBuffer(decodedBin, paddingBits) {
|
|
44
|
-
if (paddingBits > 0) {
|
|
45
|
-
decodedBin = decodedBin.slice(0, -paddingBits);
|
|
46
|
-
}
|
|
47
|
-
const buffer = [];
|
|
48
|
-
for (let i = 0; i < decodedBin.length; i += 8) {
|
|
49
|
-
buffer.push(parseInt(decodedBin.slice(i, i + 8), 2));
|
|
50
|
-
}
|
|
51
|
-
return Buffer.from(buffer);
|
|
52
|
-
}
|
|
53
28
|
}
|
|
54
29
|
exports.BaseDdu = BaseDdu;
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
import { CharSetConfig, DduSetSymbol } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* 심볼에 해당하는 charset 설정을 반환합니다.
|
|
4
|
+
* @param symbol - charset 심볼
|
|
5
|
+
* @returns CharSetConfig 또는 undefined
|
|
6
|
+
*/
|
|
2
7
|
export declare function getCharSet(symbol: DduSetSymbol): CharSetConfig | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* 모든 사용 가능한 charset 심볼 목록을 반환합니다.
|
|
10
|
+
* @returns DduSetSymbol 배열
|
|
11
|
+
*/
|
|
3
12
|
export declare function getAllSymbols(): DduSetSymbol[];
|
|
13
|
+
/**
|
|
14
|
+
* 해당 심볼의 charset이 존재하는지 확인합니다.
|
|
15
|
+
* @param symbol - 확인할 charset 심볼
|
|
16
|
+
* @returns 존재 여부
|
|
17
|
+
*/
|
|
4
18
|
export declare function hasCharSet(symbol: DduSetSymbol): boolean;
|