@ddunigma/node 1.0.27 → 1.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.
Files changed (61) hide show
  1. package/dist/cjs/base/BaseDdu.d.ts +38 -0
  2. package/dist/cjs/base/BaseDdu.js +78 -0
  3. package/dist/cjs/base/index.d.ts +1 -0
  4. package/dist/cjs/base/index.js +5 -0
  5. package/dist/cjs/charSets/index.d.ts +4 -0
  6. package/dist/cjs/charSets/index.js +4341 -0
  7. package/dist/cjs/encoders/Ddu64.d.ts +49 -0
  8. package/dist/cjs/encoders/Ddu64.js +355 -0
  9. package/dist/cjs/encoders/index.d.ts +1 -0
  10. package/dist/cjs/encoders/index.js +6 -0
  11. package/dist/cjs/index.d.ts +4 -5
  12. package/dist/cjs/index.js +10 -11
  13. package/dist/cjs/types/DduDefaultTypes.d.ts +3 -0
  14. package/dist/cjs/types/DduDefaultTypes.js +12 -0
  15. package/dist/cjs/types/DduEnums.d.ts +6 -0
  16. package/dist/cjs/types/DduEnums.js +10 -0
  17. package/dist/cjs/types/DduInterface.d.ts +24 -0
  18. package/dist/cjs/types/DduInterface.js +2 -0
  19. package/dist/cjs/types/index.d.ts +3 -0
  20. package/dist/cjs/types/index.js +19 -0
  21. package/dist/mjs/base/BaseDdu.d.ts +38 -0
  22. package/dist/mjs/base/BaseDdu.js +72 -0
  23. package/dist/mjs/base/index.d.ts +1 -0
  24. package/dist/mjs/base/index.js +1 -0
  25. package/dist/mjs/charSets/index.d.ts +4 -0
  26. package/dist/mjs/charSets/index.js +4336 -0
  27. package/dist/mjs/encoders/Ddu64.d.ts +49 -0
  28. package/dist/mjs/encoders/Ddu64.js +358 -0
  29. package/dist/mjs/encoders/index.d.ts +1 -0
  30. package/dist/mjs/encoders/index.js +2 -0
  31. package/dist/mjs/index.d.ts +4 -5
  32. package/dist/mjs/index.js +6 -5
  33. package/dist/mjs/types/DduDefaultTypes.d.ts +3 -0
  34. package/dist/mjs/types/DduDefaultTypes.js +9 -0
  35. package/dist/mjs/types/DduEnums.d.ts +6 -0
  36. package/dist/mjs/types/DduEnums.js +7 -0
  37. package/dist/mjs/types/DduInterface.d.ts +24 -0
  38. package/dist/mjs/types/DduInterface.js +1 -0
  39. package/dist/mjs/types/index.d.ts +3 -0
  40. package/dist/mjs/types/index.js +3 -0
  41. package/package.json +3 -2
  42. package/dist/cjs/Custom64.d.ts +0 -29
  43. package/dist/cjs/Custom64.js +0 -205
  44. package/dist/cjs/Ddu1024.d.ts +0 -26
  45. package/dist/cjs/Ddu1024.js +0 -262
  46. package/dist/cjs/Ddu128.d.ts +0 -26
  47. package/dist/cjs/Ddu128.js +0 -150
  48. package/dist/cjs/Ddu512.d.ts +0 -26
  49. package/dist/cjs/Ddu512.js +0 -198
  50. package/dist/cjs/Ddu64.d.ts +0 -29
  51. package/dist/cjs/Ddu64.js +0 -149
  52. package/dist/mjs/Custom64.d.ts +0 -29
  53. package/dist/mjs/Custom64.js +0 -203
  54. package/dist/mjs/Ddu1024.d.ts +0 -26
  55. package/dist/mjs/Ddu1024.js +0 -261
  56. package/dist/mjs/Ddu128.d.ts +0 -26
  57. package/dist/mjs/Ddu128.js +0 -149
  58. package/dist/mjs/Ddu512.d.ts +0 -26
  59. package/dist/mjs/Ddu512.js +0 -197
  60. package/dist/mjs/Ddu64.d.ts +0 -29
  61. package/dist/mjs/Ddu64.js +0 -147
@@ -0,0 +1,49 @@
1
+ import { BaseDdu } from "../base/BaseDdu";
2
+ import { DduConstructorOptions, DduOptions } from "../types";
3
+ export declare class Ddu64 extends BaseDdu {
4
+ protected readonly dduChar: string[];
5
+ protected readonly paddingChar: string;
6
+ protected readonly charLength: number;
7
+ protected readonly bitLength: number;
8
+ protected readonly usePowerOfTwo: boolean;
9
+ protected readonly encoding: BufferEncoding;
10
+ protected readonly dduBinaryLookup: Map<string, number>;
11
+ private readonly isPredefinedCharSet;
12
+ private readonly binaryToIntLookup;
13
+ constructor(dduChar?: string[] | string, paddingChar?: string, dduOptions?: DduConstructorOptions);
14
+ /**
15
+ * charset 초기화 (커스텀 또는 미리 정의된 charset)
16
+ */
17
+ private initializeCharSet;
18
+ /**
19
+ * 커스텀 charset 처리
20
+ */
21
+ private processCustomCharSet;
22
+ /**
23
+ * 미리 정의된 charset 처리
24
+ */
25
+ private processPredefinedCharSet;
26
+ /**
27
+ * 기본 charset 처리
28
+ */
29
+ private processDefaultCharSet;
30
+ /**
31
+ * fallback charset 가져오기
32
+ */
33
+ private getFallbackCharSet;
34
+ /**
35
+ * string 또는 배열을 문자 배열로 변환
36
+ */
37
+ private convertToCharArray;
38
+ /**
39
+ * usePowerOfTwo 옵션 적용
40
+ */
41
+ private applyPowerOfTwoOption;
42
+ /**
43
+ * 2글자 이상의 문자셋에서 조합으로 인한 중복을 검증
44
+ * 예: ["AB", "CD"] + padding "AB" 또는 "A" + "B" = "AB" 같은 경우 감지
45
+ */
46
+ private validateCombinationDuplicates;
47
+ encode(input: Buffer | string, _options?: DduOptions): string;
48
+ decode(input: string, _options?: DduOptions): string;
49
+ }
@@ -0,0 +1,358 @@
1
+ import { BaseDdu } from "../base/BaseDdu";
2
+ import { DduSetSymbol, dduDefaultConstructorOptions, } from "../types";
3
+ import { getCharSet } from "../charSets";
4
+ export class Ddu64 extends BaseDdu {
5
+ dduChar;
6
+ paddingChar;
7
+ charLength;
8
+ bitLength;
9
+ usePowerOfTwo;
10
+ encoding;
11
+ dduBinaryLookup = new Map();
12
+ isPredefinedCharSet;
13
+ binaryToIntLookup = new Map();
14
+ constructor(dduChar, paddingChar, dduOptions) {
15
+ super();
16
+ // charset 초기화
17
+ let finalCharSet;
18
+ let finalPadding;
19
+ let requiredLength;
20
+ let bitLength;
21
+ let isPredefined = false;
22
+ try {
23
+ const result = this.initializeCharSet(dduChar, paddingChar, dduOptions);
24
+ finalCharSet = result.finalCharSet;
25
+ finalPadding = result.finalPadding;
26
+ requiredLength = result.requiredLength;
27
+ bitLength = result.bitLength;
28
+ isPredefined = result.isPredefined;
29
+ }
30
+ catch (error) {
31
+ // useBuildErrorReturn이 true일 경우 에러를 그대로 throw
32
+ if (dduOptions?.useBuildErrorReturn ?? false) {
33
+ throw error;
34
+ }
35
+ // fallback 처리
36
+ const fallbackResult = this.getFallbackCharSet(dduOptions);
37
+ finalCharSet = fallbackResult.finalCharSet;
38
+ finalPadding = fallbackResult.finalPadding;
39
+ requiredLength = fallbackResult.requiredLength;
40
+ bitLength = fallbackResult.bitLength;
41
+ isPredefined = true; // fallback도 predefined charset 사용
42
+ }
43
+ // 유효성 검사: 최소 requiredLength개 이상의 문자 필요
44
+ if (finalCharSet.length < requiredLength) {
45
+ throw new Error(`${this.constructor.name} requires at least ${requiredLength} characters in the character set. Provided: ${finalCharSet.length}`);
46
+ }
47
+ // 첫 번째 문자의 길이를 기준으로 설정
48
+ this.charLength = finalCharSet[0].length;
49
+ // 모든 문자의 길이가 동일한지 검사
50
+ for (let i = 0; i < finalCharSet.length; i++) {
51
+ if (finalCharSet[i].length !== this.charLength) {
52
+ throw new Error(`All characters must have the same length. Expected: ${this.charLength}, but character at index ${i} ("${finalCharSet[i]}") has length ${finalCharSet[i].length}`);
53
+ }
54
+ }
55
+ // 패딩 문자 길이 검사
56
+ if (finalPadding.length !== this.charLength) {
57
+ throw new Error(`Padding character must have the same length as the characters. Expected: ${this.charLength}, but padding character has length ${finalPadding.length}`);
58
+ }
59
+ // 중복 검사
60
+ const uniqueChars = new Set(finalCharSet);
61
+ if (uniqueChars.size !== finalCharSet.length) {
62
+ throw new Error(`Character set contains duplicate characters. Unique: ${uniqueChars.size}, Total: ${finalCharSet.length}`);
63
+ }
64
+ // 패딩 문자가 문자셋에 포함되어 있는지 검사
65
+ if (uniqueChars.has(finalPadding)) {
66
+ throw new Error(`Padding character "${finalPadding}" cannot be in the character set`);
67
+ }
68
+ // 2글자 이상의 문자셋인 경우 조합 중복 검사 (미리 정의된 charset은 건너뜀)
69
+ if (this.charLength >= 2 && !isPredefined) {
70
+ this.validateCombinationDuplicates(finalCharSet, finalPadding, requiredLength);
71
+ }
72
+ // 앞에서부터 정확히 requiredLength개만 사용
73
+ this.dduChar = finalCharSet.slice(0, requiredLength);
74
+ this.paddingChar = finalPadding;
75
+ this.bitLength = bitLength;
76
+ this.isPredefinedCharSet = isPredefined;
77
+ // requiredLength가 2의 제곱수인 경우 자동으로 usePowerOfTwo 활성화
78
+ const isPowerOfTwo = (requiredLength & (requiredLength - 1)) === 0 && requiredLength > 0;
79
+ this.usePowerOfTwo = isPowerOfTwo || (dduOptions?.usePowerOfTwo ?? true);
80
+ // encoding 설정
81
+ this.encoding = dduOptions?.encoding ?? this.defaultEncoding;
82
+ // 룩업 테이블 생성
83
+ this.dduChar.forEach((char, index) => this.dduBinaryLookup.set(char, index));
84
+ // parseInt 최적화: 이진수 문자열 → 정수 룩업 테이블 생성
85
+ // 가능한 모든 비트 패턴을 미리 계산
86
+ // 성능 최적화: bitLength가 12 이하일 때만 룩업 테이블 사용 (4096 엔트리 이하)
87
+ // 그 이상은 parseInt가 더 효율적 (캐시 미스 감소)
88
+ const dduLength = this.dduChar.length;
89
+ const effectiveBitLength = this.usePowerOfTwo
90
+ ? this.bitLength
91
+ : this.getBitLength(dduLength);
92
+ if (effectiveBitLength <= 12) {
93
+ const maxValue = Math.pow(2, effectiveBitLength);
94
+ for (let i = 0; i < maxValue; i++) {
95
+ const binaryStr = i.toString(2).padStart(effectiveBitLength, "0");
96
+ this.binaryToIntLookup.set(binaryStr, i);
97
+ }
98
+ }
99
+ // effectiveBitLength > 12인 경우 룩업 테이블을 생성하지 않음 (parseInt 사용)
100
+ }
101
+ /**
102
+ * charset 초기화 (커스텀 또는 미리 정의된 charset)
103
+ */
104
+ initializeCharSet(dduChar, paddingChar, dduOptions) {
105
+ const finalDduChar = dduChar ?? dduOptions?.dduChar;
106
+ const finalPaddingChar = paddingChar ?? dduOptions?.paddingChar;
107
+ // 1. 커스텀 charset 사용
108
+ if (finalDduChar) {
109
+ return this.processCustomCharSet(finalDduChar, finalPaddingChar, dduOptions);
110
+ }
111
+ // 2. 미리 정의된 charset 사용
112
+ if (dduOptions?.dduSetSymbol) {
113
+ return this.processPredefinedCharSet(dduOptions.dduSetSymbol, dduOptions);
114
+ }
115
+ // 3. 기본 charset 사용
116
+ return this.processDefaultCharSet();
117
+ }
118
+ /**
119
+ * 커스텀 charset 처리
120
+ */
121
+ processCustomCharSet(dduChar, paddingChar, dduOptions) {
122
+ if (!paddingChar) {
123
+ throw new Error("paddingChar is required when dduChar or dduOptions.dduChar is provided");
124
+ }
125
+ // string 타입을 배열로 변환
126
+ const dduCharArray = this.convertToCharArray(dduChar);
127
+ const dduCharLength = dduOptions?.requiredLength ?? dduCharArray.length;
128
+ if (dduCharArray.length < dduCharLength) {
129
+ throw new Error(`dduChar must be at least ${dduCharLength} characters long. Provided: ${dduCharArray.length}`);
130
+ }
131
+ // usePowerOfTwo 처리
132
+ const result = this.applyPowerOfTwoOption(dduCharArray, paddingChar, dduCharLength, dduOptions?.usePowerOfTwo ?? true);
133
+ return {
134
+ ...result,
135
+ isPredefined: false // 커스텀 charset은 검증 필요
136
+ };
137
+ }
138
+ /**
139
+ * 미리 정의된 charset 처리
140
+ */
141
+ processPredefinedCharSet(symbol, dduOptions) {
142
+ const fixedCharSet = getCharSet(symbol);
143
+ if (!fixedCharSet) {
144
+ throw new Error(`CharSet with symbol ${symbol} not found`);
145
+ }
146
+ const { charSet, paddingChar, maxRequiredLength, bitLength } = fixedCharSet;
147
+ // usePowerOfTwo 처리
148
+ if (dduOptions?.usePowerOfTwo ?? true) {
149
+ const result = this.applyPowerOfTwoOption(charSet, paddingChar, maxRequiredLength, true);
150
+ return {
151
+ ...result,
152
+ isPredefined: true // 미리 정의된 charset은 검증 패스
153
+ };
154
+ }
155
+ return {
156
+ finalCharSet: charSet,
157
+ finalPadding: paddingChar,
158
+ requiredLength: maxRequiredLength,
159
+ bitLength,
160
+ isPredefined: true // 미리 정의된 charset은 검증 패스
161
+ };
162
+ }
163
+ /**
164
+ * 기본 charset 처리
165
+ */
166
+ processDefaultCharSet() {
167
+ const defaultSymbol = dduDefaultConstructorOptions.dduSetSymbol ?? DduSetSymbol.DDU;
168
+ const fixedCharSet = getCharSet(defaultSymbol);
169
+ if (!fixedCharSet) {
170
+ throw new Error(`Default CharSet with symbol ${defaultSymbol} not found`);
171
+ }
172
+ return {
173
+ finalCharSet: fixedCharSet.charSet,
174
+ finalPadding: fixedCharSet.paddingChar,
175
+ requiredLength: fixedCharSet.maxRequiredLength,
176
+ bitLength: fixedCharSet.bitLength,
177
+ isPredefined: true // 기본 charset도 미리 정의된 것이므로 검증 패스
178
+ };
179
+ }
180
+ /**
181
+ * fallback charset 가져오기
182
+ */
183
+ getFallbackCharSet(dduOptions) {
184
+ const fallbackSymbol = dduOptions?.dduSetSymbol ??
185
+ dduDefaultConstructorOptions.dduSetSymbol ??
186
+ DduSetSymbol.DDU;
187
+ const fixedCharSet = getCharSet(fallbackSymbol);
188
+ if (!fixedCharSet) {
189
+ throw new Error(`Fallback CharSet with symbol ${fallbackSymbol} not found`);
190
+ }
191
+ return {
192
+ finalCharSet: fixedCharSet.charSet,
193
+ finalPadding: fixedCharSet.paddingChar,
194
+ requiredLength: fixedCharSet.maxRequiredLength,
195
+ bitLength: fixedCharSet.bitLength,
196
+ };
197
+ }
198
+ /**
199
+ * string 또는 배열을 문자 배열로 변환
200
+ */
201
+ convertToCharArray(input) {
202
+ if (typeof input === "string") {
203
+ return [...new Set(input.trim())].map((c) => c);
204
+ }
205
+ return input;
206
+ }
207
+ /**
208
+ * usePowerOfTwo 옵션 적용
209
+ */
210
+ applyPowerOfTwoOption(charArray, padding, length, usePowerOfTwo) {
211
+ if (usePowerOfTwo) {
212
+ const powerOfTwoExponent = this.getLargestPowerOfTwoExponent(length);
213
+ const powerOfTwoLength = Math.pow(2, powerOfTwoExponent);
214
+ return {
215
+ finalCharSet: charArray.slice(0, powerOfTwoLength),
216
+ finalPadding: padding,
217
+ requiredLength: powerOfTwoLength,
218
+ bitLength: powerOfTwoExponent,
219
+ };
220
+ }
221
+ return {
222
+ finalCharSet: charArray.slice(0, length),
223
+ finalPadding: padding,
224
+ requiredLength: length,
225
+ bitLength: this.getBitLength(length),
226
+ };
227
+ }
228
+ /**
229
+ * 2글자 이상의 문자셋에서 조합으로 인한 중복을 검증
230
+ * 예: ["AB", "CD"] + padding "AB" 또는 "A" + "B" = "AB" 같은 경우 감지
231
+ */
232
+ validateCombinationDuplicates(charSet, paddingChar, requiredLength) {
233
+ const charLength = charSet[0].length;
234
+ const allStrings = new Set();
235
+ // 1. 기본 문자셋과 패딩 문자 추가
236
+ charSet.slice(0, requiredLength).forEach((char) => allStrings.add(char));
237
+ allStrings.add(paddingChar);
238
+ // 2. 2개 조합 검사 (charLength * 2 길이)
239
+ for (let i = 0; i < Math.min(charSet.length, requiredLength); i++) {
240
+ for (let j = 0; j < Math.min(charSet.length, requiredLength); j++) {
241
+ const combination = charSet[i] + charSet[j];
242
+ // 조합이 기존 문자와 중복되는지 확인
243
+ if (allStrings.has(combination)) {
244
+ throw new Error(`Combination conflict detected: "${charSet[i]}" + "${charSet[j]}" = "${combination}" already exists in the character set or padding`);
245
+ }
246
+ }
247
+ // 문자 + 패딩 조합 검사
248
+ const charPlusPadding = charSet[i] + paddingChar;
249
+ const paddingPlusChar = paddingChar + charSet[i];
250
+ if (allStrings.has(charPlusPadding)) {
251
+ throw new Error(`Combination conflict detected: "${charSet[i]}" + padding "${paddingChar}" = "${charPlusPadding}" already exists in the character set`);
252
+ }
253
+ if (allStrings.has(paddingPlusChar)) {
254
+ throw new Error(`Combination conflict detected: padding "${paddingChar}" + "${charSet[i]}" = "${paddingPlusChar}" already exists in the character set`);
255
+ }
256
+ }
257
+ // 3. 패딩 + 패딩 조합 검사
258
+ const doublePadding = paddingChar + paddingChar;
259
+ if (allStrings.has(doublePadding)) {
260
+ throw new Error(`Combination conflict detected: padding "${paddingChar}" + padding "${paddingChar}" = "${doublePadding}" already exists in the character set`);
261
+ }
262
+ // 4. 3개 이상 조합 검사 (선택적, 성능을 위해 샘플링)
263
+ // 모든 조합을 검사하면 O(n^3)이므로 일부만 샘플링
264
+ if (charLength >= 2 && requiredLength <= 100) {
265
+ // 100개 이하일 때만 전체 검사
266
+ for (let i = 0; i < Math.min(charSet.length, requiredLength); i++) {
267
+ for (let j = 0; j < Math.min(charSet.length, requiredLength); j++) {
268
+ for (let k = 0; k < Math.min(charSet.length, requiredLength); k++) {
269
+ const combination = charSet[i] + charSet[j] + charSet[k];
270
+ // 조합의 부분 문자열이 기존 문자와 중복되는지 확인
271
+ for (let start = 0; start < combination.length - charLength + 1; start++) {
272
+ const substring = combination.substring(start, start + charLength);
273
+ if (allStrings.has(substring) && substring !== charSet[i] && substring !== charSet[j] && substring !== charSet[k]) {
274
+ throw new Error(`Combination conflict detected: substring "${substring}" from "${charSet[i]}" + "${charSet[j]}" + "${charSet[k]}" conflicts with existing character`);
275
+ }
276
+ }
277
+ }
278
+ }
279
+ }
280
+ }
281
+ }
282
+ encode(input, _options) {
283
+ // options는 구버전 호환성을 위해 유지하지만 사용하지 않음
284
+ const bufferInput = typeof input === "string" ? Buffer.from(input, this.encoding) : input;
285
+ // 생성자에서 설정된 값 사용
286
+ const dduLength = this.dduChar.length;
287
+ const effectiveBitLength = this.usePowerOfTwo
288
+ ? this.bitLength
289
+ : this.getBitLength(dduLength);
290
+ const { dduBinary, padding } = this.bufferToDduBinary(bufferInput, effectiveBitLength);
291
+ // 문자열 연결 최적화: Array + join 사용
292
+ const resultParts = new Array(dduBinary.length);
293
+ // 각 비트 청크를 변환
294
+ for (let i = 0; i < dduBinary.length; i++) {
295
+ const binaryChunk = dduBinary[i];
296
+ // parseInt 최적화: 룩업 테이블 사용
297
+ const charInt = this.binaryToIntLookup.get(binaryChunk) ?? parseInt(binaryChunk, 2);
298
+ if (this.charLength === 1 && !this.usePowerOfTwo) {
299
+ // 가변 길이 조합 인코딩
300
+ const quotient = Math.floor(charInt / dduLength);
301
+ const remainder = charInt % dduLength;
302
+ resultParts[i] = this.dduChar[quotient] + this.dduChar[remainder];
303
+ }
304
+ else {
305
+ // 고정 길이 직접 매핑
306
+ resultParts[i] = this.dduChar[charInt];
307
+ }
308
+ }
309
+ let resultString = resultParts.join("");
310
+ // 패딩 비트 정보를 padChar + 패딩비트수 형태로 추가
311
+ if (padding > 0) {
312
+ resultString += this.paddingChar + padding;
313
+ }
314
+ return resultString;
315
+ }
316
+ decode(input, _options) {
317
+ // options는 구버전 호환성을 위해 유지하지만 사용하지 않음
318
+ // 패딩 정보 추출
319
+ let paddingBits = 0;
320
+ const padCharIndex = input.indexOf(this.paddingChar);
321
+ if (padCharIndex >= 0) {
322
+ const paddingStr = input.substring(padCharIndex + this.paddingChar.length);
323
+ paddingBits = parseInt(paddingStr) || 0;
324
+ input = input.substring(0, padCharIndex);
325
+ }
326
+ let dduBinary = "";
327
+ // 생성자에서 설정된 값 사용
328
+ const dduLength = this.dduChar.length;
329
+ const effectiveBitLength = this.usePowerOfTwo
330
+ ? this.bitLength
331
+ : this.getBitLength(dduLength);
332
+ if (this.charLength === 1 && !this.usePowerOfTwo) {
333
+ // 가변 길이 조합 디코딩 (2개씩 읽음)
334
+ for (let i = 0; i < input.length; i += 2) {
335
+ const firstChar = input[i];
336
+ const secondChar = input[i + 1];
337
+ const firstIndex = this.dduBinaryLookup.get(firstChar);
338
+ const secondIndex = this.dduBinaryLookup.get(secondChar);
339
+ if (firstIndex === undefined || secondIndex === undefined)
340
+ throw new Error(`Invalid character: ${firstChar} or ${secondChar}`);
341
+ const value = firstIndex * dduLength + secondIndex;
342
+ dduBinary += value.toString(2).padStart(effectiveBitLength, "0");
343
+ }
344
+ }
345
+ else {
346
+ // 고정 길이 직접 매핑 (charLength만큼씩 읽음)
347
+ for (let i = 0; i < input.length; i += this.charLength) {
348
+ const charChunk = input.slice(i, i + this.charLength);
349
+ const charIndex = this.dduBinaryLookup.get(charChunk);
350
+ if (charIndex === undefined)
351
+ throw new Error(`Invalid character: ${charChunk}`);
352
+ dduBinary += charIndex.toString(2).padStart(effectiveBitLength, "0");
353
+ }
354
+ }
355
+ const decoded = this.dduBinaryToBuffer(dduBinary, paddingBits);
356
+ return decoded.toString(this.encoding);
357
+ }
358
+ }
@@ -0,0 +1 @@
1
+ export { Ddu64 } from "./Ddu64";
@@ -0,0 +1,2 @@
1
+ // Unified encoder (supports both fixed and variable length via usePowerOfTwo option)
2
+ export { Ddu64 } from "./Ddu64";
@@ -1,5 +1,4 @@
1
- export { Ddu64 } from "./Ddu64.js";
2
- export { Custom64 } from "./Custom64.js";
3
- export { Ddu128 } from "./Ddu128.js";
4
- export { Ddu512 } from "./Ddu512.js";
5
- export { Ddu1024 } from "./Ddu1024.js";
1
+ export type { DduOptions, BufferToDduBinaryResult, DduConstructorOptions, } from "./types";
2
+ export { DduSetSymbol } from "./types";
3
+ export { BaseDdu } from "./base";
4
+ export { Ddu64 } from "./encoders";
package/dist/mjs/index.js CHANGED
@@ -1,5 +1,6 @@
1
- export { Ddu64 } from "./Ddu64.js";
2
- export { Custom64 } from "./Custom64.js";
3
- export { Ddu128 } from "./Ddu128.js";
4
- export { Ddu512 } from "./Ddu512.js";
5
- export { Ddu1024 } from "./Ddu1024.js";
1
+ // Export enums
2
+ export { DduSetSymbol } from "./types";
3
+ // Export base classes
4
+ export { BaseDdu } from "./base";
5
+ // Export encoders
6
+ export { Ddu64 } from "./encoders";
@@ -0,0 +1,3 @@
1
+ import { DduConstructorOptions } from "./DduInterface";
2
+ declare const dduDefaultConstructorOptions: DduConstructorOptions;
3
+ export { dduDefaultConstructorOptions };
@@ -0,0 +1,9 @@
1
+ import { DduSetSymbol } from "./DduEnums";
2
+ const dduDefaultConstructorOptions = {
3
+ dduSetSymbol: DduSetSymbol.DDU,
4
+ usePowerOfTwo: true,
5
+ requiredLength: 8,
6
+ bitLength: 3,
7
+ useBuildErrorReturn: false,
8
+ };
9
+ export { dduDefaultConstructorOptions };
@@ -0,0 +1,6 @@
1
+ export declare enum DduSetSymbol {
2
+ DDU = "ddu",
3
+ ONECHARSET = "oneCharSet",
4
+ TWOCHARSET = "twoCharSet",
5
+ THREECHARSET = "threeCharSet"
6
+ }
@@ -0,0 +1,7 @@
1
+ export var DduSetSymbol;
2
+ (function (DduSetSymbol) {
3
+ DduSetSymbol["DDU"] = "ddu";
4
+ DduSetSymbol["ONECHARSET"] = "oneCharSet";
5
+ DduSetSymbol["TWOCHARSET"] = "twoCharSet";
6
+ DduSetSymbol["THREECHARSET"] = "threeCharSet";
7
+ })(DduSetSymbol || (DduSetSymbol = {}));
@@ -0,0 +1,24 @@
1
+ import { DduSetSymbol } from "./DduEnums";
2
+ export interface CharSetConfig {
3
+ symbol: DduSetSymbol;
4
+ charSet: string[];
5
+ maxRequiredLength: number;
6
+ bitLength: number;
7
+ paddingChar: string;
8
+ }
9
+ export interface DduOptions {
10
+ }
11
+ export interface DduConstructorOptions {
12
+ dduSetSymbol?: DduSetSymbol;
13
+ dduChar?: string[] | string;
14
+ paddingChar?: string;
15
+ requiredLength?: number;
16
+ bitLength?: number;
17
+ usePowerOfTwo?: boolean;
18
+ useBuildErrorReturn?: boolean;
19
+ encoding?: BufferEncoding;
20
+ }
21
+ export interface BufferToDduBinaryResult {
22
+ dduBinary: string[];
23
+ padding: number;
24
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from "./DduEnums";
2
+ export * from "./DduInterface";
3
+ export * from "./DduDefaultTypes";
@@ -0,0 +1,3 @@
1
+ export * from "./DduEnums";
2
+ export * from "./DduInterface";
3
+ export * from "./DduDefaultTypes";
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@ddunigma/node",
3
- "version": "1.0.27",
3
+ "version": "1.1.1",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/mjs/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "type": "module",
8
8
  "scripts": {
9
9
  "build": "rm -rf dist/* && tsc -p tsconfig.json && tsc -p tsconfig-cjs.json && sh postProcess.sh",
10
- "test": "tsx ./src/test/test-comprehensive.ts"
10
+ "test": "NODE_OPTIONS='--expose-gc' tsx ./src/test/test-comprehensive.ts",
11
+ "test:no-gc": "tsx ./src/test/test-comprehensive.ts"
11
12
  },
12
13
  "exports": {
13
14
  ".": {
@@ -1,29 +0,0 @@
1
- export declare class Custom64 {
2
- private readonly dduChar;
3
- private readonly paddingChar;
4
- private readonly dduCharDefault;
5
- private readonly paddingCharDefault;
6
- private readonly defaultEncoding;
7
- private readonly bitLengthMap;
8
- private readonly binaryLookup;
9
- private readonly dduBinaryLookup;
10
- private readonly dduBinaryLookupKr;
11
- private readonly paddingRegex;
12
- constructor(dduChar?: string[] | string, paddingChar?: string);
13
- private getBitLength;
14
- private getLargestPowerOfTwo;
15
- private splitString;
16
- private getSelectedSets;
17
- private bufferToDduBinary;
18
- private dduBinaryToBuffer;
19
- encode(input: Buffer | string, options?: {
20
- dduSetSymbol?: string;
21
- encoding?: BufferEncoding;
22
- usePowerOfTwo?: boolean;
23
- }): string;
24
- decode(input: string, options?: {
25
- dduSetSymbol?: string;
26
- encoding?: BufferEncoding;
27
- usePowerOfTwo?: boolean;
28
- }): string;
29
- }