@ddunigma/node 1.0.27 → 1.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.
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
@@ -1,205 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Custom64 = void 0;
4
- class Custom64 {
5
- constructor(dduChar, paddingChar) {
6
- this.dduCharDefault = [
7
- "A",
8
- "s",
9
- "q",
10
- "r",
11
- "0",
12
- "z",
13
- "3",
14
- "t",
15
- "y",
16
- "1",
17
- "5",
18
- "2",
19
- "4",
20
- "E",
21
- "B",
22
- "C",
23
- "Q",
24
- "F",
25
- "R",
26
- "T",
27
- "U",
28
- "W",
29
- "V",
30
- "X",
31
- "Y",
32
- "Z",
33
- "b",
34
- "a",
35
- "c",
36
- "d",
37
- "D",
38
- "G",
39
- "L",
40
- "H",
41
- "I",
42
- "-",
43
- "J",
44
- "K",
45
- "M",
46
- "O",
47
- "N",
48
- "f",
49
- "e",
50
- "h",
51
- "g",
52
- "P",
53
- "i",
54
- "S",
55
- "k",
56
- "l",
57
- "m",
58
- "u",
59
- "j",
60
- "v",
61
- "n",
62
- "o",
63
- "p",
64
- "9",
65
- "w",
66
- "6",
67
- "7",
68
- "8",
69
- "x",
70
- "_",
71
- ];
72
- this.paddingCharDefault = "=";
73
- this.defaultEncoding = "utf-8";
74
- this.bitLengthMap = new Map();
75
- this.binaryLookup = Array.from({ length: 256 }, (_, i) => i.toString(2).padStart(8, "0"));
76
- this.dduBinaryLookup = new Map();
77
- this.dduBinaryLookupKr = new Map();
78
- this.paddingRegex = new Map();
79
- if (typeof dduChar === "string") {
80
- const removeDuplicatesString = [...new Set(dduChar.trim())].join("");
81
- this.dduChar = removeDuplicatesString.trim().split("");
82
- }
83
- else {
84
- this.dduChar = dduChar || this.dduCharDefault;
85
- }
86
- this.paddingChar = paddingChar || this.paddingCharDefault;
87
- this.dduChar.forEach((char, index) => this.dduBinaryLookup.set(char, index));
88
- this.dduCharDefault.forEach((char, index) => this.dduBinaryLookupKr.set(char, index));
89
- this.paddingRegex.set("default", new RegExp(this.paddingChar, "g"));
90
- this.paddingRegex.set("KR", new RegExp(this.paddingCharDefault, "g"));
91
- }
92
- getBitLength(setLength) {
93
- let cached = this.bitLengthMap.get(setLength);
94
- if (cached === undefined) {
95
- cached = Math.ceil(Math.log2(setLength));
96
- this.bitLengthMap.set(setLength, cached);
97
- }
98
- return cached;
99
- }
100
- getLargestPowerOfTwo(n) {
101
- return Math.pow(2, Math.floor(Math.log2(n)));
102
- }
103
- *splitString(s, length) {
104
- for (let i = 0; i < s.length; i += length) {
105
- yield s.slice(i, Math.min(i + length, s.length));
106
- }
107
- }
108
- getSelectedSets(dduSetSymbol, usePowerOfTwo) {
109
- const isKR = dduSetSymbol === "KR";
110
- const dduSet = isKR ? this.dduCharDefault : this.dduChar;
111
- const padChar = isKR ? this.paddingCharDefault : this.paddingChar;
112
- let dduLength = dduSet.length;
113
- if (usePowerOfTwo) {
114
- const powerOfTwoLength = this.getLargestPowerOfTwo(dduLength);
115
- dduLength = powerOfTwoLength;
116
- }
117
- return {
118
- dduSet: usePowerOfTwo ? dduSet.slice(0, dduLength) : dduSet,
119
- padChar,
120
- dduLength,
121
- bitLength: this.getBitLength(dduLength),
122
- lookupTable: isKR ? this.dduBinaryLookupKr : this.dduBinaryLookup,
123
- paddingRegExp: this.paddingRegex.get(isKR ? "KR" : "default"),
124
- };
125
- }
126
- bufferToDduBinary(input, bitLength) {
127
- const encodedBin = input.reduce((acc, byte) => acc + this.binaryLookup[byte], "");
128
- if (encodedBin.length === 0) {
129
- return { dduBinary: [], padding: 0 };
130
- }
131
- const dduBinary = Array.from(this.splitString(encodedBin, bitLength));
132
- const padding = bitLength - dduBinary[dduBinary.length - 1].length;
133
- if (padding > 0) {
134
- dduBinary[dduBinary.length - 1] += "0".repeat(padding);
135
- }
136
- return { dduBinary, padding };
137
- }
138
- dduBinaryToBuffer(decodedBin, paddingBits) {
139
- if (paddingBits > 0) {
140
- decodedBin = decodedBin.slice(0, -paddingBits);
141
- }
142
- const buffer = [];
143
- for (let i = 0; i < decodedBin.length; i += 8) {
144
- buffer.push(parseInt(decodedBin.slice(i, i + 8), 2));
145
- }
146
- return Buffer.from(buffer);
147
- }
148
- encode(input, options = {}) {
149
- const { dduSetSymbol = "default", encoding = this.defaultEncoding, usePowerOfTwo = true, } = options;
150
- const bufferInput = typeof input === "string" ? Buffer.from(input, encoding) : input;
151
- const { dduSet, padChar, dduLength, bitLength } = this.getSelectedSets(dduSetSymbol, usePowerOfTwo);
152
- const { dduBinary, padding } = this.bufferToDduBinary(bufferInput, bitLength);
153
- let resultString = "";
154
- for (const binaryChunk of dduBinary) {
155
- const charInt = parseInt(binaryChunk, 2);
156
- if (usePowerOfTwo) {
157
- resultString += dduSet[charInt];
158
- }
159
- else {
160
- const quotient = Math.floor(charInt / dduLength);
161
- const remainder = charInt % dduLength;
162
- resultString += dduSet[quotient] + dduSet[remainder];
163
- }
164
- }
165
- // 패딩 비트 수를 padChar + 숫자로 명시 (모든 모드)
166
- if (padding > 0) {
167
- resultString += padChar + padding;
168
- }
169
- return resultString;
170
- }
171
- decode(input, options = {}) {
172
- const { dduSetSymbol = "default", encoding = this.defaultEncoding, usePowerOfTwo = true, } = options;
173
- const { dduSet, dduLength, bitLength, lookupTable, padChar, paddingRegExp } = this.getSelectedSets(dduSetSymbol, usePowerOfTwo);
174
- // 패딩 정보 추출: padChar 이후의 숫자가 패딩 비트 수 (모든 모드)
175
- let paddingBits = 0;
176
- const padCharIndex = input.indexOf(padChar);
177
- if (padCharIndex >= 0) {
178
- const paddingStr = input.substring(padCharIndex + padChar.length);
179
- paddingBits = parseInt(paddingStr) || 0;
180
- input = input.substring(0, padCharIndex);
181
- }
182
- let dduBinary = "";
183
- for (let i = 0; i < input.length; i += usePowerOfTwo ? 1 : 2) {
184
- const firstChar = input[i];
185
- const secondChar = input[i + 1];
186
- if (usePowerOfTwo) {
187
- const charIndex = lookupTable.get(firstChar);
188
- if (charIndex === undefined)
189
- throw new Error(`Invalid character: ${firstChar}`);
190
- dduBinary += charIndex.toString(2).padStart(bitLength, "0");
191
- }
192
- else {
193
- const firstIndex = lookupTable.get(firstChar);
194
- const secondIndex = lookupTable.get(secondChar);
195
- if (firstIndex === undefined || secondIndex === undefined)
196
- throw new Error(`Invalid character: ${firstChar} or ${secondChar}`);
197
- const value = firstIndex * dduLength + secondIndex;
198
- dduBinary += value.toString(2).padStart(bitLength, "0");
199
- }
200
- }
201
- const decoded = this.dduBinaryToBuffer(dduBinary, paddingBits);
202
- return decoded.toString(encoding);
203
- }
204
- }
205
- exports.Custom64 = Custom64;
@@ -1,26 +0,0 @@
1
- export declare class Ddu1024 {
2
- private readonly dduChar;
3
- private readonly paddingChar;
4
- private readonly charLength;
5
- private readonly dduCharDefault;
6
- private readonly paddingCharDefault;
7
- private readonly defaultEncoding;
8
- private readonly binaryLookup;
9
- private readonly dduBinaryLookup;
10
- private readonly dduBinaryLookupKr;
11
- private readonly paddingRegex;
12
- constructor(dduChar?: string[], paddingChar?: string);
13
- private escapeRegExp;
14
- private splitString;
15
- private getSelectedSets;
16
- private bufferToDduBinary;
17
- private dduBinaryToBuffer;
18
- encode(input: Buffer | string, options?: {
19
- dduSetSymbol?: string;
20
- encoding?: BufferEncoding;
21
- }): string;
22
- decode(input: string, options?: {
23
- dduSetSymbol?: string;
24
- encoding?: BufferEncoding;
25
- }): string;
26
- }
@@ -1,262 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Ddu1024 = void 0;
4
- class Ddu1024 {
5
- constructor(dduChar, paddingChar) {
6
- // 1024개의 2글자 URL-safe 문자열 (앞글자: E,l,y 제외 / 뒷글자: s,i,a 제외)
7
- this.dduCharDefault = [
8
- 'Ok', '-d', 'b4', 'mF', 'pP', 'vL', 'eA', '87',
9
- '2j', 'G8', 'Bj', 'PR', 'eI', 'a6', 'pQ', 'eZ',
10
- 'qv', '3j', 'h6', '-2', '1I', 'tc', 'qa', 'OX',
11
- '5z', 'vn', 'p1', 'OL', 'XC', 'N8', 'qW', 'hH',
12
- '-C', '_o', 'BQ', '54', 'O7', 'BT', '-7', '8c',
13
- 'gs', 'MC', 'kz', 'hx', 'Jt', 'ZL', 'Po', 'ZI',
14
- 'VU', 'M2', 'sg', 'Xr', 'YR', 'T4', 'J0', 'J4',
15
- 'KW', 'ho', 'hI', 'Bw', 'd9', 'iU', 'eC', 'Sm',
16
- 'V4', 'fd', 'mz', 'Ac', 'KT', 'Gw', '3r', 'K2',
17
- 'pi', '_Y', 'ax', 'Ho', 'OQ', 'J7', 'b8', 'OA',
18
- 'Oz', 'bv', 'pA', 'pt', 'ZU', 'mU', 'A6', 'kc',
19
- 'KV', 'hA', 'vR', 'B6', 'fY', 'wz', 'i7', 'Ou',
20
- 'ic', '_U', '-F', 'TL', 'WL', 'T6', '14', '_9',
21
- 'Kj', 'Nj', 'HU', '-1', '3m', '5L', 'tR', 'wj',
22
- '0L', 'DH', 'hn', 'ed', 'S8', 'q1', 'Di', '8r',
23
- 'kR', 'Nt', 'iz', 'uI', '-6', 'Ma', 'k6', 'Yx',
24
- 'qR', 'e1', 'ft', 'OI', '3a', 'SR', 'bR', 'G9',
25
- 'Pj', 'eu', '5F', 'ur', 'h9', 'q9', 'M6', '2r',
26
- 'fL', 'i9', 'ij', 'Yz', 'S5', 'Hn', 'eW', 'DU',
27
- '0o', 'Ar', 'MH', 'BY', 'GU', 'bd', '_R', 'dx',
28
- '-I', 'kQ', 'ei', 'M8', 'ir', 'pZ', '8U', 'Dn',
29
- 'e2', 'Az', 'D7', '09', 'fv', 'vF', 'f7', 'JW',
30
- 'hc', 'tC', 'P6', '1U', 'D2', 'to', 'H9', 'pX',
31
- 'Nm', 'Kd', 'e9', '_2', 'dI', '3n', 'vQ', '_7',
32
- 'MU', 'MA', 'Mj', 'Zr', 'K0', 'eF', 'SV', 'Hj',
33
- 'ar', 'NW', 'wC', 'Vr', 'H4', '35', '5x', 'NF',
34
- 'u9', '3W', 'S6', 'Nr', 'eU', 'px', 'O5', '-V',
35
- 'NC', 'GQ', 'K6', 'Nd', 'KZ', 'bc', '3F', 'N6',
36
- 'dn', 'wF', 'dC', 'Jw', '34', '04', '1Q', 'v6',
37
- 'JX', 'bI', 'm9', '38', 'Z7', 'Gc', 'N4', 'pu',
38
- 'Su', 'hj', '2x', 'kF', 'B5', 'Mc', 'BU', 'qC',
39
- '3o', '-U', 'Gv', 'Gu', 'Gj', 'ex', 'in', 'wL',
40
- 'OU', 'w6', 'Kk', 'ko', 'Sx', 'h0', 'BL', 'DT',
41
- 'tQ', 'Aj', 'Xj', 'p4', 'fI', 'Xo', 'Xx', 'Z4',
42
- 'P4', 'MV', '0U', 'bt', 'hY', '2F', 'qF', 'TR',
43
- 'ew', '5U', 'h8', '1F', 'DZ', 'v9', 'GT', 'OC',
44
- 'Px', 'B0', '-w', '3V', 'vz', 'e0', 'qY', 'Ao',
45
- 'ek', 'JL', 'NU', 'uc', 'OY', 'Jm', 'po', 'Xz',
46
- '3I', 'Bd', 'mo', 'pr', 'bA', 'uF', 'hV', '1L',
47
- 'Du', 'KY', 'BF', '1r', '8j', '_I', 'AI', 'uL',
48
- '_T', 'u7', '0j', '-T', 'Jn', 'SU', 'A7', 'pT',
49
- 'PF', 'vI', 'HF', 'Jc', 'JC', '_x', '3P', 'T9',
50
- 't6', 'Zz', 'GH', 'hW', 'q8', 'a7', 'ha', 'Nn',
51
- 'qd', '2c', 'qj', 't9', 'e8', 'TU', 'bj', 'Sw',
52
- 'O2', 'YL', 'MZ', 'hm', '31', 'b6', 'KL', '_v',
53
- 'Mw', 'Bc', 'T7', 'DC', 'G4', 'BZ', 'Mt', '2n',
54
- 'J2', 'fu', 'AU', 'Tr', 'tz', 'Dr', 'SX', '_j',
55
- 'qV', '_d', 'h5', '_V', 'tU', 'iF', 'uj', 'Bn',
56
- 'fn', 'pm', 'bw', 'XF', 'Hz', '3H', 'YQ', 'pV',
57
- 'pU', '-u', '5j', 'wQ', 'fP', '5r', '-0', 'PC',
58
- 'K8', 'bu', 'SL', 'm6', 'e7', 'hP', 'Wn', 'O9',
59
- 'uU', '-Q', 'w9', 'NH', '1R', 'Oc', '3C', 'u4',
60
- 'bo', 'bZ', 'Kv', 'GZ', 'Ka', 'pI', 'BA', 'KR',
61
- 't4', 'Mu', 'vC', 'hv', '-k', 'pL', 'vU', '8Q',
62
- 'd7', 'ux', 'tF', '0I', 'e5', 'W7', 'ST', 'bU',
63
- 'Ju', 'Bv', 'pw', 'et', 'B2', 'O0', 'qA', '3L',
64
- 'SI', 'O8', 'Oa', 'qm', 'Gk', 'aI', '3d', 'G7',
65
- 'dz', 'uC', 'aj', 'Jj', '_6', 'Xn', 'VI', 'fz',
66
- 'SQ', 'P9', 'p9', 'em', '8I', 'Wj', 'dr', 'p7',
67
- 'q5', 'hd', 'qt', '36', 'io', 'vr', 'GY', '-5',
68
- 'TC', 'hT', '24', 'pn', 'i6', 'SW', 'ZR', 'JA',
69
- 'J5', 'MT', 'fC', 'JH', 'YU', 'Bk', 'ev', 'H6',
70
- 'GV', '8x', 'bH', '2Q', 'TF', 'Kx', 'vc', 'Gn',
71
- 'Ko', 'aU', '_5', 'TI', 'Jr', 'Od', '1c', '_L',
72
- 'A9', 'K7', '0R', 'fA', 'DF', 'Ba', 'd4', 'SF',
73
- 'Da', '-i', '16', 'hR', 'KF', 'b7', '3x', 'Nv',
74
- 'KI', 'vj', 'Zc', 'fU', 'eR', 'tL', 'Ga', 'Vz',
75
- 'p6', 'Dj', 'GP', 'qi', 'Tc', '57', 'fV', 'h7',
76
- 'M7', 'BP', 'eH', '3X', 'fT', 'Y9', '30', 'XQ',
77
- 'hi', '39', 'Ja', 'NQ', 'AC', 'qk', '_i', 'qL',
78
- 'Gi', '-A', 'MP', 'qQ', '0r', 'TQ', 'hZ', 'Jo',
79
- '2z', 'J9', 'ZC', 'aF', 'Dm', 'Gr', 'Yj', '_r',
80
- 'AF', 'Mv', 'AR', 'JQ', 'er', 'Gz', 'An', 'p5',
81
- 'hr', 'Bz', 'Zx', 'Jd', 'G6', 'pH', 'bi', 'SH',
82
- '29', 'bn', 'fQ', 'PU', 'SA', '59', 'St', '_X',
83
- 'M1', 'pz', 'fr', 'Mk', 'OH', 'bQ', 'YF', 'bx',
84
- '_1', 'bT', 'mc', 'h2', 'eo', '_C', 'D5', 'Bm',
85
- 'KP', 'ea', 'en', '84', 'DY', 'Ax', 'Mm', '3R',
86
- 'K9', 'PQ', 'N5', 'f4', 'OV', 'pj', '1C', 'GR',
87
- 'wc', 'bY', 'VC', 'Si', 'Zn', 'OW', 'DI', '-j',
88
- 'N0', 'mQ', 'Or', 'q4', 'O1', 'S1', 'eY', 'Ki',
89
- 'DP', 'aC', 'NY', 'iC', 'pR', 'S4', 'KA', 'BV',
90
- '0c', 'SZ', 'Mr', 'NA', '3T', 'f1', 'uz', 'XU',
91
- '-P', 'B4', 'ht', 'VL', 'Yc', 'WQ', 'ac', 'eT',
92
- 'Vo', 'wI', 'iQ', '_8', '8C', 'hX', 'WF', 'WC',
93
- 'N7', 'qT', 'N2', 'Bi', 'bm', '-r', 'D8', 'dU',
94
- 'G0', 'dc', '2L', 'p2', 'O4', 'v4', 'vx', 'eX',
95
- 'fo', 'ao', 'Wr', 'W4', 'V9', 'Sz', 'XL', 'eV',
96
- 'ba', '5c', 'SC', 'f6', '-m', 'aQ', '5o', 'Pr',
97
- 'fR', 'Sk', 'fi', 'qU', 'JP', 'Jk', 'Na', 'qw',
98
- 'Ox', 'qo', 'W9', '5C', 'b0', 'N1', '-v', '-R',
99
- 'N9', 'wU', 'wo', 'an', 'tx', 'Kr', 'b5', 'Tx',
100
- 'q6', 'q2', 'J1', 'Gt', '2C', 'BX', '_a', 'SP',
101
- 'JY', 'Br', 'KH', 'MF', 'AQ', 't7', 'OF', 'Mz',
102
- 'B9', 'HI', 'hk', 'VQ', 'S2', 'f5', '-n', 'Xc',
103
- 'i4', 'Kt', '0Q', 'D0', 'Oj', 'PI', 'BH', 'Kc',
104
- 'dj', 'DR', '3u', 'qz', 'OT', 'Nw', 'Sd', 'K4',
105
- '1o', '2R', 'qP', 'bV', 'NV', 'Zj', 'kL', 'k7',
106
- '_c', 'Bt', 'mR', 'mC', 'kU', 'HR', 'J8', 'Gm',
107
- 'B7', 'e6', '1z', '3Q', 'NZ', 'Bu', '0x', 'Dt',
108
- 'WR', 'BW', 'ZF', 'ix', 'q7', '1j', 'XI', 'DA',
109
- 'VR', '56', 'V7', 'iL', '5n', 'Md', 'vo', 'pa',
110
- 'Y4', 'YI', '8R', 'Dk', 'pk', 'fk', 'fc', '_t',
111
- 'Z6', '-4', 'Y6', '_Q', '3t', '0n', 'f9', 'az',
112
- 'fm', 'hu', 'Z9', '_4', '-c', 'f2', '5Q', 'DW',
113
- 'D9', 'JI', 'JF', '5I', 'No', '17', 'AL', 'Nk',
114
- 'Ji', 'Ow', 'iI', 'Mx', 'mr', '_m', 'f8', 'mL',
115
- 'D1', '_z', 'Dd', 'WU', 'HC', '-Z', 'K1', 'Zo',
116
- 'NR', 'GX', 'D6', 'So', 'V6', 'd6', 'fX', 'qH',
117
- 'Ot', 'MI', '3w', 'iR', 'HL', 'ec', 'JU', 'm7',
118
- 'wr', 'PL', 'G5', 'S0', '-x', 'NX', 'kj', 'W6',
119
- '-8', 'ZQ', 'hU', 'GL', 'kC', '26', 'fx', '-X',
120
- 'JV', 'B1', 'fH', 'eP', 'OZ', 'pW', 'OP', '_u',
121
- 'JT', '2o', '3Y', 'NI', 'Sn', 'Sr', 'b9', 'SY',
122
- 'DQ', 'm4', '1n', 'BI', 'hL', 'M0', 'Oo', '3k',
123
- 'ez', '3A', 'wR', 'bW', 'K5', 'kr', 'NL', 'a9',
124
- '-Y', 'bk', 'Dz', 'qX', 'KQ', 'b2', 'Yo', 'hw',
125
- '3v', 'k9', 'v7', '5R', 'do', 'GW', 'fW', '19',
126
- '_n', 'Sa', 'p8', 'S9', 'MY', '-a', 'qI', '8o',
127
- 'dQ', 'h4', 'Nc', 'Dx', 'qZ', 'Gd', '3Z', 'pc',
128
- 'Sc', '3U', 'e4', 'Do', 'XR', 'MQ', 'Wz', '-o',
129
- 'a4', 'KX', 'A4', 'pv', 'On', '86', 'kn', 'OR',
130
- 'tr', 'Y7', 'YC', 'Om', 'Mi', 'Jx', 'Nu', 'u6',
131
- '8F', 'fF', 'Jz', 'fa', 'bP', '-9', 'Ku', '0F',
132
- '_F', 'f0', 'M5', 'Hr', '3z', 'VF', 'w7', 'pY',
133
- 'Dc', 'kI', 'Vj', '-t', 'ML', 'wx', '0z', 'Nz',
134
- 'D4', '3c', 'bX', '0C', 'Tz', 'Bx', 'HQ', 'pd',
135
- '2I', 'w4', '8n', 'hz', 'Yr', '3i', 'hC', 'dL'
136
- ];
137
- this.paddingCharDefault = "ly"; // 앞글자=E(제외됨), 뒷글자=s(제외됨)
138
- this.defaultEncoding = "utf-8";
139
- this.binaryLookup = Array.from({ length: 256 }, (_, i) => i.toString(2).padStart(8, "0"));
140
- this.dduBinaryLookup = new Map();
141
- this.dduBinaryLookupKr = new Map();
142
- this.paddingRegex = new Map();
143
- // 기본값 설정
144
- const sourceChar = dduChar || this.dduCharDefault;
145
- const sourcePadding = paddingChar || this.paddingCharDefault;
146
- // 유효성 검사: 최소 1024개 이상의 문자 필요
147
- if (sourceChar.length < 1024) {
148
- throw new Error(`Ddu1024 requires at least 1024 characters in the character set. Provided: ${sourceChar.length}`);
149
- }
150
- // 첫 번째 문자의 길이를 기준으로 설정
151
- this.charLength = sourceChar[0].length;
152
- // 모든 문자의 길이가 동일한지 검사
153
- for (let i = 0; i < sourceChar.length; i++) {
154
- if (sourceChar[i].length !== this.charLength) {
155
- throw new Error(`All characters must have the same length. Expected: ${this.charLength}, but character at index ${i} ("${sourceChar[i]}") has length ${sourceChar[i].length}`);
156
- }
157
- }
158
- // 중복 검사
159
- const uniqueChars = new Set(sourceChar);
160
- if (uniqueChars.size !== sourceChar.length) {
161
- throw new Error(`Character set contains duplicate characters. Unique: ${uniqueChars.size}, Total: ${sourceChar.length}`);
162
- }
163
- // 패딩 문자가 문자셋에 포함되어 있는지 검사
164
- if (uniqueChars.has(sourcePadding)) {
165
- throw new Error(`Padding character "${sourcePadding}" cannot be in the character set`);
166
- }
167
- // 앞에서부터 정확히 1024개만 사용
168
- this.dduChar = sourceChar.slice(0, 1024);
169
- this.paddingChar = sourcePadding;
170
- // 룩업 테이블 생성
171
- this.dduChar.forEach((char, index) => this.dduBinaryLookup.set(char, index));
172
- this.dduCharDefault.forEach((char, index) => this.dduBinaryLookupKr.set(char, index));
173
- this.paddingRegex.set("default", new RegExp(this.escapeRegExp(this.paddingChar), "g"));
174
- this.paddingRegex.set("KR", new RegExp(this.escapeRegExp(this.paddingCharDefault), "g"));
175
- }
176
- escapeRegExp(str) {
177
- return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
178
- }
179
- *splitString(s, length) {
180
- for (let i = 0; i < s.length; i += length) {
181
- yield s.slice(i, Math.min(i + length, s.length));
182
- }
183
- }
184
- getSelectedSets(dduSetSymbol) {
185
- const isKR = dduSetSymbol === "KR";
186
- const dduSet = isKR ? this.dduCharDefault : this.dduChar;
187
- const padChar = isKR ? this.paddingCharDefault : this.paddingChar;
188
- return {
189
- dduSet,
190
- padChar,
191
- lookupTable: isKR ? this.dduBinaryLookupKr : this.dduBinaryLookup,
192
- paddingRegExp: this.paddingRegex.get(isKR ? "KR" : "default"),
193
- };
194
- }
195
- bufferToDduBinary(input) {
196
- const encodedBin = input.reduce((acc, byte) => acc + this.binaryLookup[byte], "");
197
- if (encodedBin.length === 0) {
198
- return { dduBinary: [], padding: 0 };
199
- }
200
- const bitLength = 10; // 1024 = 2^10
201
- const dduBinary = Array.from(this.splitString(encodedBin, bitLength));
202
- const padding = bitLength - dduBinary[dduBinary.length - 1].length;
203
- if (padding > 0) {
204
- dduBinary[dduBinary.length - 1] += "0".repeat(padding);
205
- }
206
- return { dduBinary, padding };
207
- }
208
- dduBinaryToBuffer(decodedBin, paddingBits) {
209
- if (paddingBits > 0) {
210
- decodedBin = decodedBin.slice(0, -paddingBits);
211
- }
212
- const buffer = [];
213
- for (let i = 0; i < decodedBin.length; i += 8) {
214
- buffer.push(parseInt(decodedBin.slice(i, i + 8), 2));
215
- }
216
- return Buffer.from(buffer);
217
- }
218
- encode(input, options = {}) {
219
- const { dduSetSymbol = "default", encoding = this.defaultEncoding, } = options;
220
- const bufferInput = typeof input === "string" ? Buffer.from(input, encoding) : input;
221
- const { dduSet, padChar } = this.getSelectedSets(dduSetSymbol);
222
- const { dduBinary, padding } = this.bufferToDduBinary(bufferInput);
223
- let resultString = "";
224
- // 각 10비트 청크를 charLength 글자 문자열로 변환
225
- for (const binaryChunk of dduBinary) {
226
- const charInt = parseInt(binaryChunk, 2);
227
- resultString += dduSet[charInt];
228
- }
229
- // 패딩 비트 정보를 padChar + 패딩비트수(0-9) 형태로 추가
230
- // padding이 0이 아니면 padChar를 추가
231
- if (padding > 0) {
232
- resultString += padChar + padding;
233
- }
234
- return resultString;
235
- }
236
- decode(input, options = {}) {
237
- const { dduSetSymbol = "default", encoding = this.defaultEncoding, } = options;
238
- const { lookupTable, padChar } = this.getSelectedSets(dduSetSymbol);
239
- // 패딩 정보 추출
240
- let paddingBits = 0;
241
- const padCharIndex = input.indexOf(padChar);
242
- if (padCharIndex >= 0) {
243
- // padChar 이후의 숫자가 패딩 비트 수
244
- const paddingStr = input.substring(padCharIndex + padChar.length);
245
- paddingBits = parseInt(paddingStr) || 0;
246
- // 패딩 정보 제거
247
- input = input.substring(0, padCharIndex);
248
- }
249
- let dduBinary = "";
250
- // charLength 길이만큼 읽어서 디코딩
251
- for (let i = 0; i < input.length; i += this.charLength) {
252
- const charChunk = input.slice(i, i + this.charLength);
253
- const charIndex = lookupTable.get(charChunk);
254
- if (charIndex === undefined)
255
- throw new Error(`Invalid character: ${charChunk}`);
256
- dduBinary += charIndex.toString(2).padStart(10, "0");
257
- }
258
- const decoded = this.dduBinaryToBuffer(dduBinary, paddingBits);
259
- return decoded.toString(encoding);
260
- }
261
- }
262
- exports.Ddu1024 = Ddu1024;
@@ -1,26 +0,0 @@
1
- export declare class Ddu128 {
2
- private readonly dduChar;
3
- private readonly paddingChar;
4
- private readonly charLength;
5
- private readonly dduCharDefault;
6
- private readonly paddingCharDefault;
7
- private readonly defaultEncoding;
8
- private readonly binaryLookup;
9
- private readonly dduBinaryLookup;
10
- private readonly dduBinaryLookupKr;
11
- private readonly paddingRegex;
12
- constructor(dduChar?: string[], paddingChar?: string);
13
- private escapeRegExp;
14
- private splitString;
15
- private getSelectedSets;
16
- private bufferToDduBinary;
17
- private dduBinaryToBuffer;
18
- encode(input: Buffer | string, options?: {
19
- dduSetSymbol?: string;
20
- encoding?: BufferEncoding;
21
- }): string;
22
- decode(input: string, options?: {
23
- dduSetSymbol?: string;
24
- encoding?: BufferEncoding;
25
- }): string;
26
- }