@yume-chan/adb 0.0.15 → 0.0.17

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 (196) hide show
  1. package/CHANGELOG.json +33 -0
  2. package/CHANGELOG.md +18 -1
  3. package/LICENSE +21 -21
  4. package/README.md +247 -247
  5. package/esm/adb.d.ts +15 -3
  6. package/esm/adb.d.ts.map +1 -1
  7. package/esm/adb.js +18 -6
  8. package/esm/adb.js.map +1 -1
  9. package/esm/auth.d.ts.map +1 -1
  10. package/esm/auth.js.map +1 -1
  11. package/esm/backend.d.ts +2 -2
  12. package/esm/backend.d.ts.map +1 -1
  13. package/esm/commands/base.d.ts.map +1 -1
  14. package/esm/commands/base.js.map +1 -1
  15. package/esm/commands/framebuffer.d.ts +17 -1
  16. package/esm/commands/framebuffer.d.ts.map +1 -1
  17. package/esm/commands/framebuffer.js +4 -15
  18. package/esm/commands/framebuffer.js.map +1 -1
  19. package/esm/commands/install.d.ts +2 -2
  20. package/esm/commands/install.d.ts.map +1 -1
  21. package/esm/commands/install.js +3 -2
  22. package/esm/commands/install.js.map +1 -1
  23. package/esm/commands/power.d.ts +1 -1
  24. package/esm/commands/power.js +1 -1
  25. package/esm/commands/reverse.d.ts +3 -3
  26. package/esm/commands/reverse.d.ts.map +1 -1
  27. package/esm/commands/reverse.js +9 -9
  28. package/esm/commands/reverse.js.map +1 -1
  29. package/esm/commands/subprocess/command.d.ts +52 -0
  30. package/esm/commands/subprocess/command.d.ts.map +1 -0
  31. package/esm/commands/subprocess/command.js +83 -0
  32. package/esm/commands/subprocess/command.js.map +1 -0
  33. package/esm/commands/subprocess/index.d.ts +1 -53
  34. package/esm/commands/subprocess/index.d.ts.map +1 -1
  35. package/esm/commands/subprocess/index.js +1 -85
  36. package/esm/commands/subprocess/index.js.map +1 -1
  37. package/esm/commands/subprocess/protocols/none.d.ts +5 -4
  38. package/esm/commands/subprocess/protocols/none.d.ts.map +1 -1
  39. package/esm/commands/subprocess/protocols/none.js +11 -8
  40. package/esm/commands/subprocess/protocols/none.js.map +1 -1
  41. package/esm/commands/subprocess/protocols/shell.d.ts +4 -4
  42. package/esm/commands/subprocess/protocols/shell.d.ts.map +1 -1
  43. package/esm/commands/subprocess/protocols/shell.js +6 -6
  44. package/esm/commands/subprocess/protocols/shell.js.map +1 -1
  45. package/esm/commands/subprocess/protocols/types.d.ts +7 -7
  46. package/esm/commands/subprocess/protocols/types.d.ts.map +1 -1
  47. package/esm/commands/sync/index.d.ts +1 -1
  48. package/esm/commands/sync/index.d.ts.map +1 -1
  49. package/esm/commands/sync/index.js +1 -1
  50. package/esm/commands/sync/index.js.map +1 -1
  51. package/esm/commands/sync/list.d.ts +2 -2
  52. package/esm/commands/sync/list.d.ts.map +1 -1
  53. package/esm/commands/sync/list.js +15 -43
  54. package/esm/commands/sync/list.js.map +1 -1
  55. package/esm/commands/sync/pull.d.ts +3 -2
  56. package/esm/commands/sync/pull.d.ts.map +1 -1
  57. package/esm/commands/sync/pull.js +15 -17
  58. package/esm/commands/sync/pull.js.map +1 -1
  59. package/esm/commands/sync/push.d.ts +2 -2
  60. package/esm/commands/sync/push.d.ts.map +1 -1
  61. package/esm/commands/sync/push.js +2 -5
  62. package/esm/commands/sync/push.js.map +1 -1
  63. package/esm/commands/sync/request.d.ts +1 -1
  64. package/esm/commands/sync/request.d.ts.map +1 -1
  65. package/esm/commands/sync/request.js +1 -1
  66. package/esm/commands/sync/request.js.map +1 -1
  67. package/esm/commands/sync/response.d.ts +4 -9
  68. package/esm/commands/sync/response.d.ts.map +1 -1
  69. package/esm/commands/sync/response.js +32 -23
  70. package/esm/commands/sync/response.js.map +1 -1
  71. package/esm/commands/sync/stat.d.ts +3 -3
  72. package/esm/commands/sync/stat.d.ts.map +1 -1
  73. package/esm/commands/sync/stat.js +13 -30
  74. package/esm/commands/sync/stat.js.map +1 -1
  75. package/esm/commands/sync/sync.d.ts +2 -2
  76. package/esm/commands/sync/sync.d.ts.map +1 -1
  77. package/esm/commands/sync/sync.js +7 -5
  78. package/esm/commands/sync/sync.js.map +1 -1
  79. package/esm/crypto.js +1 -1
  80. package/esm/crypto.js.map +1 -1
  81. package/esm/index.d.ts +0 -1
  82. package/esm/index.d.ts.map +1 -1
  83. package/esm/index.js +0 -1
  84. package/esm/index.js.map +1 -1
  85. package/esm/packet.d.ts +1 -1
  86. package/esm/packet.d.ts.map +1 -1
  87. package/esm/packet.js +1 -1
  88. package/esm/packet.js.map +1 -1
  89. package/esm/socket/dispatcher.d.ts +11 -3
  90. package/esm/socket/dispatcher.d.ts.map +1 -1
  91. package/esm/socket/dispatcher.js +19 -11
  92. package/esm/socket/dispatcher.js.map +1 -1
  93. package/esm/socket/index.d.ts +1 -1
  94. package/esm/socket/index.d.ts.map +1 -1
  95. package/esm/socket/index.js +1 -1
  96. package/esm/socket/index.js.map +1 -1
  97. package/esm/socket/socket.d.ts +9 -4
  98. package/esm/socket/socket.d.ts.map +1 -1
  99. package/esm/socket/socket.js +20 -10
  100. package/esm/socket/socket.js.map +1 -1
  101. package/esm/utils/base64.d.ts +23 -0
  102. package/esm/utils/base64.d.ts.map +1 -1
  103. package/esm/utils/base64.js +6 -0
  104. package/esm/utils/base64.js.map +1 -1
  105. package/package.json +13 -14
  106. package/src/adb.ts +285 -273
  107. package/src/auth.ts +174 -173
  108. package/src/backend.ts +12 -11
  109. package/src/commands/base.ts +12 -11
  110. package/src/commands/framebuffer.ts +78 -73
  111. package/src/commands/index.ts +8 -8
  112. package/src/commands/install.ts +32 -30
  113. package/src/commands/power.ts +54 -54
  114. package/src/commands/reverse.ts +141 -140
  115. package/src/commands/subprocess/command.ts +131 -0
  116. package/src/commands/subprocess/index.ts +3 -139
  117. package/src/commands/subprocess/protocols/none.ts +73 -68
  118. package/src/commands/subprocess/protocols/shell.ts +191 -190
  119. package/src/commands/subprocess/protocols/types.ts +60 -59
  120. package/src/commands/subprocess/utils.ts +20 -20
  121. package/src/commands/sync/index.ts +7 -7
  122. package/src/commands/sync/list.ts +54 -86
  123. package/src/commands/sync/pull.ts +45 -46
  124. package/src/commands/sync/push.ts +38 -41
  125. package/src/commands/sync/request.ts +51 -50
  126. package/src/commands/sync/response.ts +68 -64
  127. package/src/commands/sync/stat.ts +129 -150
  128. package/src/commands/sync/sync.ts +182 -181
  129. package/src/commands/tcpip.ts +21 -21
  130. package/src/crypto.ts +296 -296
  131. package/src/features.ts +9 -9
  132. package/src/index.ts +10 -11
  133. package/src/packet.ts +80 -80
  134. package/src/socket/dispatcher.ts +310 -304
  135. package/src/socket/index.ts +2 -2
  136. package/src/socket/socket.ts +156 -144
  137. package/src/utils/auto-reset-event.ts +41 -41
  138. package/src/utils/base64.ts +329 -306
  139. package/src/utils/index.ts +3 -3
  140. package/tsconfig.build.json +3 -3
  141. package/tsconfig.build.tsbuildinfo +1 -1
  142. package/esm/commands/subprocess/legacy.d.ts +0 -35
  143. package/esm/commands/subprocess/legacy.d.ts.map +0 -1
  144. package/esm/commands/subprocess/legacy.js +0 -53
  145. package/esm/commands/subprocess/legacy.js.map +0 -1
  146. package/esm/commands/subprocess/protocol.d.ts +0 -39
  147. package/esm/commands/subprocess/protocol.d.ts.map +0 -1
  148. package/esm/commands/subprocess/protocol.js +0 -157
  149. package/esm/commands/subprocess/protocol.js.map +0 -1
  150. package/esm/commands/subprocess/types.d.ts +0 -50
  151. package/esm/commands/subprocess/types.d.ts.map +0 -1
  152. package/esm/commands/subprocess/types.js +0 -2
  153. package/esm/commands/subprocess/types.js.map +0 -1
  154. package/esm/socket/controller.d.ts +0 -37
  155. package/esm/socket/controller.d.ts.map +0 -1
  156. package/esm/socket/controller.js +0 -66
  157. package/esm/socket/controller.js.map +0 -1
  158. package/esm/stream/buffered.d.ts +0 -35
  159. package/esm/stream/buffered.d.ts.map +0 -1
  160. package/esm/stream/buffered.js +0 -123
  161. package/esm/stream/buffered.js.map +0 -1
  162. package/esm/stream/detect.bak.d.ts +0 -240
  163. package/esm/stream/detect.bak.d.ts.map +0 -1
  164. package/esm/stream/detect.bak.js +0 -60
  165. package/esm/stream/detect.bak.js.map +0 -1
  166. package/esm/stream/detect.d.ts +0 -2
  167. package/esm/stream/detect.d.ts.map +0 -1
  168. package/esm/stream/detect.js +0 -5
  169. package/esm/stream/detect.js.map +0 -1
  170. package/esm/stream/detect.native.d.ts +0 -240
  171. package/esm/stream/detect.native.d.ts.map +0 -1
  172. package/esm/stream/detect.native.js +0 -60
  173. package/esm/stream/detect.native.js.map +0 -1
  174. package/esm/stream/detect.polyfill.d.ts +0 -18
  175. package/esm/stream/detect.polyfill.d.ts.map +0 -1
  176. package/esm/stream/detect.polyfill.js +0 -9
  177. package/esm/stream/detect.polyfill.js.map +0 -1
  178. package/esm/stream/index.d.ts +0 -4
  179. package/esm/stream/index.d.ts.map +0 -1
  180. package/esm/stream/index.js +0 -4
  181. package/esm/stream/index.js.map +0 -1
  182. package/esm/stream/transform.d.ts +0 -104
  183. package/esm/stream/transform.d.ts.map +0 -1
  184. package/esm/stream/transform.js +0 -373
  185. package/esm/stream/transform.js.map +0 -1
  186. package/esm/utils/encoding.d.ts +0 -3
  187. package/esm/utils/encoding.d.ts.map +0 -1
  188. package/esm/utils/encoding.js +0 -11
  189. package/esm/utils/encoding.js.map +0 -1
  190. package/src/stream/buffered.ts +0 -147
  191. package/src/stream/detect.native.ts +0 -362
  192. package/src/stream/detect.polyfill.ts +0 -28
  193. package/src/stream/detect.ts +0 -5
  194. package/src/stream/index.ts +0 -3
  195. package/src/stream/transform.ts +0 -447
  196. package/tsconfig.test.json +0 -10
@@ -1,306 +1,329 @@
1
- // Prepare maps for O(1) searching
2
- const charToIndex: Record<string, number> = {};
3
- const indexToChar: number[] = [];
4
- const paddingChar = '='.charCodeAt(0);
5
-
6
- function addRange(start: string, end: string) {
7
- const charCodeStart = start.charCodeAt(0);
8
- const charCodeEnd = end.charCodeAt(0);
9
-
10
- for (let charCode = charCodeStart; charCode <= charCodeEnd; charCode += 1) {
11
- charToIndex[String.fromCharCode(charCode)] = indexToChar.length;
12
- indexToChar.push(charCode);
13
- }
14
- }
15
-
16
- addRange('A', 'Z');
17
- addRange('a', 'z');
18
- addRange('0', '9');
19
- addRange('+', '+');
20
- addRange('/', '/');
21
-
22
- export function calculateBase64EncodedLength(inputLength: number): [outputLength: number, paddingLength: number] {
23
- const remainder = inputLength % 3;
24
- const paddingLength = remainder !== 0 ? 3 - remainder : 0;
25
- return [(inputLength + paddingLength) / 3 * 4, paddingLength];
26
- }
27
-
28
- export function encodeBase64(
29
- input: Uint8Array,
30
- ): Uint8Array;
31
- export function encodeBase64(
32
- input: Uint8Array,
33
- output: Uint8Array,
34
- ): number;
35
- export function encodeBase64(
36
- input: Uint8Array,
37
- output?: Uint8Array,
38
- ): Uint8Array | number {
39
- const [outputLength, paddingLength] = calculateBase64EncodedLength(input.length);
40
-
41
- if (!output) {
42
- output = new Uint8Array(outputLength);
43
- encodeForward(input, output, paddingLength);
44
- return output;
45
- } else {
46
- if (output.length < outputLength) {
47
- throw new Error('output buffer is too small');
48
- }
49
-
50
- output = output.subarray(0, outputLength);
51
-
52
- // When input and output are on same ArrayBuffer,
53
- // we check if it's possible to encode in-place.
54
- if (input.buffer !== output.buffer) {
55
- encodeForward(input, output, paddingLength);
56
- } else if (output.byteOffset + output.length - (paddingLength + 1) <= input.byteOffset + input.length) {
57
- // Output ends before input ends
58
- // So output won't catch up with input.
59
-
60
- // Depends on padding length,
61
- // it's possible to write 1-3 bytes after input ends.
62
- // spell: disable-next-line
63
- // | aaaaaabb | | | |
64
- // | aaaaaa | bb0000 | = | = |
65
- //
66
- // spell: disable-next-line
67
- // | aaaaaabb | bbbbcccc | | |
68
- // | aaaaaa | bbbbbb | cccc00 | = |
69
- //
70
- // spell: disable-next-line
71
- // | aaaaaabb | bbbbcccc | ccdddddd | |
72
- // | aaaaaa | bbbbbb | cccccc | dddddd |
73
-
74
- // Must encode forwards.
75
- encodeForward(input, output, paddingLength);
76
- } else if (output.byteOffset >= input.byteOffset - 1) {
77
- // Output starts after input starts
78
- // So in backwards, output can't catch up with input.
79
-
80
- // Because first 3 bytes becomes 4 bytes,
81
- // it's possible to write 1 byte before input starts.
82
- // spell: disable-next-line
83
- // | | aaaaaabb | bbbbcccc | ccdddddd |
84
- // | aaaaaa | bbbbbb | cccccc | dddddd |
85
-
86
- // Must encode backwards.
87
- encodeBackward(input, output, paddingLength);
88
- } else {
89
- // Input is in the middle of output,
90
- // not possible to read neither first or last three bytes,
91
- throw new Error('input and output cannot overlap');
92
- }
93
-
94
- return outputLength;
95
- }
96
- }
97
-
98
- function encodeForward(input: Uint8Array, output: Uint8Array, paddingLength: number) {
99
- let inputIndex = 0;
100
- let outputIndex = 0;
101
-
102
- while (inputIndex < input.length - 2) {
103
- /* cspell: disable-next-line */
104
- // aaaaaabb
105
- const x = input[inputIndex]!;
106
- inputIndex += 1;
107
-
108
- /* cspell: disable-next-line */
109
- // bbbbcccc
110
- const y = input[inputIndex]!;
111
- inputIndex += 1;
112
-
113
- /* cspell: disable-next-line */
114
- // ccdddddd
115
- const z = input[inputIndex]!;
116
- inputIndex += 1;
117
-
118
- output[outputIndex] = indexToChar[x >> 2]!;
119
- outputIndex += 1;
120
-
121
- output[outputIndex] = indexToChar[((x & 0b11) << 4) | (y >> 4)]!;
122
- outputIndex += 1;
123
-
124
- output[outputIndex] = indexToChar[((y & 0b1111) << 2) | (z >> 6)]!;
125
- outputIndex += 1;
126
-
127
- output[outputIndex] = indexToChar[z & 0b111111]!;
128
- outputIndex += 1;
129
- }
130
-
131
- if (paddingLength === 2) {
132
- /* cspell: disable-next-line */
133
- // aaaaaabb
134
- const x = input[inputIndex]!;
135
- inputIndex += 1;
136
-
137
- output[outputIndex] = indexToChar[x >> 2]!;
138
- outputIndex += 1;
139
-
140
- output[outputIndex] = indexToChar[((x & 0b11) << 4)]!;
141
- outputIndex += 1;
142
-
143
- output[outputIndex] = paddingChar;
144
- outputIndex += 1;
145
-
146
- output[outputIndex] = paddingChar;
147
- } else if (paddingLength === 1) {
148
- /* cspell: disable-next-line */
149
- // aaaaaabb
150
- const x = input[inputIndex]!;
151
- inputIndex += 1;
152
-
153
- /* cspell: disable-next-line */
154
- // bbbbcccc
155
- const y = input[inputIndex]!;
156
- inputIndex += 1;
157
-
158
- output[outputIndex] = indexToChar[x >> 2]!;
159
- outputIndex += 1;
160
-
161
- output[outputIndex] = indexToChar[((x & 0b11) << 4) | (y >> 4)]!;
162
- outputIndex += 1;
163
-
164
- output[outputIndex] = indexToChar[((y & 0b1111) << 2)]!;
165
- outputIndex += 1;
166
-
167
- output[outputIndex] = paddingChar;
168
- }
169
- }
170
-
171
- function encodeBackward(input: Uint8Array, output: Uint8Array, paddingLength: number) {
172
- let inputIndex = input.length - 1;
173
- let outputIndex = output.length - 1;
174
-
175
- if (paddingLength === 2) {
176
- /* cspell: disable-next-line */
177
- // aaaaaabb
178
- const x = input[inputIndex]!;
179
- inputIndex -= 1;
180
-
181
- output[outputIndex] = paddingChar;
182
- outputIndex -= 1;
183
-
184
- output[outputIndex] = paddingChar;
185
- outputIndex -= 1;
186
-
187
- output[outputIndex] = indexToChar[((x & 0b11) << 4)]!;
188
- outputIndex -= 1;
189
-
190
- output[outputIndex] = indexToChar[x >> 2]!;
191
- outputIndex -= 1;
192
- } else if (paddingLength === 1) {
193
- /* cspell: disable-next-line */
194
- // bbbbcccc
195
- const y = input[inputIndex]!;
196
- inputIndex -= 1;
197
-
198
- /* cspell: disable-next-line */
199
- // aaaaaabb
200
- const x = input[inputIndex]!;
201
- inputIndex -= 1;
202
-
203
- output[outputIndex] = paddingChar;
204
- outputIndex -= 1;
205
-
206
- output[outputIndex] = indexToChar[((y & 0b1111) << 2)]!;
207
- outputIndex -= 1;
208
-
209
- output[outputIndex] = indexToChar[((x & 0b11) << 4) | (y >> 4)]!;
210
- outputIndex -= 1;
211
-
212
- output[outputIndex] = indexToChar[x >> 2]!;
213
- outputIndex -= 1;
214
- }
215
-
216
- while (inputIndex >= 0) {
217
- /* cspell: disable-next-line */
218
- // ccdddddd
219
- const z = input[inputIndex]!;
220
- inputIndex -= 1;
221
-
222
- /* cspell: disable-next-line */
223
- // bbbbcccc
224
- const y = input[inputIndex]!;
225
- inputIndex -= 1;
226
-
227
- /* cspell: disable-next-line */
228
- // aaaaaabb
229
- const x = input[inputIndex]!;
230
- inputIndex -= 1;
231
-
232
- output[outputIndex] = indexToChar[z & 0b111111]!;
233
- outputIndex -= 1;
234
-
235
- output[outputIndex] = indexToChar[((y & 0b1111) << 2) | (z >> 6)]!;
236
- outputIndex -= 1;
237
-
238
- output[outputIndex] = indexToChar[((x & 0b11) << 4) | (y >> 4)]!;
239
- outputIndex -= 1;
240
-
241
- output[outputIndex] = indexToChar[x >> 2]!;
242
- outputIndex -= 1;
243
- }
244
- }
245
-
246
- export function decodeBase64(input: string): Uint8Array {
247
- let padding: number;
248
- if (input[input.length - 2] === '=') {
249
- padding = 2;
250
- } else if (input[input.length - 1] === '=') {
251
- padding = 1;
252
- } else {
253
- padding = 0;
254
- }
255
-
256
- const result = new Uint8Array(input.length / 4 * 3 - padding);
257
- let sIndex = 0;
258
- let dIndex = 0;
259
-
260
- while (sIndex < input.length - (padding !== 0 ? 4 : 0)) {
261
- const a = charToIndex[input[sIndex]!]!;
262
- sIndex += 1;
263
-
264
- const b = charToIndex[input[sIndex]!]!;
265
- sIndex += 1;
266
-
267
- const c = charToIndex[input[sIndex]!]!;
268
- sIndex += 1;
269
-
270
- const d = charToIndex[input[sIndex]!]!;
271
- sIndex += 1;
272
-
273
- result[dIndex] = (a << 2) | ((b & 0b11_0000) >> 4);
274
- dIndex += 1;
275
-
276
- result[dIndex] = ((b & 0b1111) << 4) | ((c & 0b11_1100) >> 2);
277
- dIndex += 1;
278
-
279
- result[dIndex] = ((c & 0b11) << 6) | d;
280
- dIndex += 1;
281
- }
282
-
283
- if (padding === 1) {
284
- const a = charToIndex[input[sIndex]!]!;
285
- sIndex += 1;
286
-
287
- const b = charToIndex[input[sIndex]!]!;
288
- sIndex += 1;
289
-
290
- const c = charToIndex[input[sIndex]!]!;
291
-
292
- result[dIndex] = (a << 2) | ((b & 0b11_0000) >> 4);
293
- dIndex += 1;
294
-
295
- result[dIndex] = ((b & 0b1111) << 4) | ((c & 0b11_1100) >> 2);
296
- } else if (padding === 2) {
297
- const a = charToIndex[input[sIndex]!]!;
298
- sIndex += 1;
299
-
300
- const b = charToIndex[input[sIndex]!]!;
301
-
302
- result[dIndex] = (a << 2) | ((b & 0b11_0000) >> 4);
303
- }
304
-
305
- return result;
306
- }
1
+ // Prepare maps for O(1) searching
2
+ const charToIndex: Record<string, number> = {};
3
+ const indexToChar: number[] = [];
4
+ const paddingChar = '='.charCodeAt(0);
5
+
6
+ function addRange(start: string, end: string) {
7
+ const charCodeStart = start.charCodeAt(0);
8
+ const charCodeEnd = end.charCodeAt(0);
9
+
10
+ for (let charCode = charCodeStart; charCode <= charCodeEnd; charCode += 1) {
11
+ charToIndex[String.fromCharCode(charCode)] = indexToChar.length;
12
+ indexToChar.push(charCode);
13
+ }
14
+ }
15
+
16
+ addRange('A', 'Z');
17
+ addRange('a', 'z');
18
+ addRange('0', '9');
19
+ addRange('+', '+');
20
+ addRange('/', '/');
21
+
22
+ /**
23
+ * Calculate the required length of the output buffer for the given input length.
24
+ *
25
+ * @param inputLength Length of the input in bytes
26
+ * @returns Length of the output in bytes
27
+ */
28
+ export function calculateBase64EncodedLength(inputLength: number): [outputLength: number, paddingLength: number] {
29
+ const remainder = inputLength % 3;
30
+ const paddingLength = remainder !== 0 ? 3 - remainder : 0;
31
+ return [(inputLength + paddingLength) / 3 * 4, paddingLength];
32
+ }
33
+
34
+ /**
35
+ * Encode the given input buffer into base64.
36
+ *
37
+ * @param input The input buffer
38
+ * @returns The encoded output buffer
39
+ */
40
+ export function encodeBase64(
41
+ input: Uint8Array,
42
+ ): Uint8Array;
43
+ /**
44
+ * Encode the given input into base64 and write it to the output buffer.
45
+ *
46
+ * The output buffer must be at least as long as the value returned by `calculateBase64EncodedLength`.
47
+ * It can points to the same buffer as the input, as long as `output.offset <= input.offset - input.length / 3`,
48
+ * or `output.offset >= input.offset - 1`
49
+ *
50
+ * @param input The input buffer
51
+ * @param output The output buffer
52
+ * @returns The number of bytes written to the output buffer
53
+ */
54
+ export function encodeBase64(
55
+ input: Uint8Array,
56
+ output: Uint8Array,
57
+ ): number;
58
+ export function encodeBase64(
59
+ input: Uint8Array,
60
+ output?: Uint8Array,
61
+ ): Uint8Array | number {
62
+ const [outputLength, paddingLength] = calculateBase64EncodedLength(input.length);
63
+
64
+ if (!output) {
65
+ output = new Uint8Array(outputLength);
66
+ encodeForward(input, output, paddingLength);
67
+ return output;
68
+ } else {
69
+ if (output.length < outputLength) {
70
+ throw new Error('output buffer is too small');
71
+ }
72
+
73
+ output = output.subarray(0, outputLength);
74
+
75
+ // When input and output are on same ArrayBuffer,
76
+ // we check if it's possible to encode in-place.
77
+ if (input.buffer !== output.buffer) {
78
+ encodeForward(input, output, paddingLength);
79
+ } else if (output.byteOffset + output.length - (paddingLength + 1) <= input.byteOffset + input.length) {
80
+ // Output ends before input ends
81
+ // So output won't catch up with input.
82
+
83
+ // Depends on padding length,
84
+ // it's possible to write 1-3 bytes after input ends.
85
+ // spell: disable-next-line
86
+ // | aaaaaabb | | | |
87
+ // | aaaaaa | bb0000 | = | = |
88
+ //
89
+ // spell: disable-next-line
90
+ // | aaaaaabb | bbbbcccc | | |
91
+ // | aaaaaa | bbbbbb | cccc00 | = |
92
+ //
93
+ // spell: disable-next-line
94
+ // | aaaaaabb | bbbbcccc | ccdddddd | |
95
+ // | aaaaaa | bbbbbb | cccccc | dddddd |
96
+
97
+ // Must encode forwards.
98
+ encodeForward(input, output, paddingLength);
99
+ } else if (output.byteOffset >= input.byteOffset - 1) {
100
+ // Output starts after input starts
101
+ // So in backwards, output can't catch up with input.
102
+
103
+ // Because first 3 bytes becomes 4 bytes,
104
+ // it's possible to write 1 byte before input starts.
105
+ // spell: disable-next-line
106
+ // | | aaaaaabb | bbbbcccc | ccdddddd |
107
+ // | aaaaaa | bbbbbb | cccccc | dddddd |
108
+
109
+ // Must encode backwards.
110
+ encodeBackward(input, output, paddingLength);
111
+ } else {
112
+ // Input is in the middle of output,
113
+ // not possible to read neither first or last three bytes,
114
+ throw new Error('input and output cannot overlap');
115
+ }
116
+
117
+ return outputLength;
118
+ }
119
+ }
120
+
121
+ function encodeForward(input: Uint8Array, output: Uint8Array, paddingLength: number) {
122
+ let inputIndex = 0;
123
+ let outputIndex = 0;
124
+
125
+ while (inputIndex < input.length - 2) {
126
+ /* cspell: disable-next-line */
127
+ // aaaaaabb
128
+ const x = input[inputIndex]!;
129
+ inputIndex += 1;
130
+
131
+ /* cspell: disable-next-line */
132
+ // bbbbcccc
133
+ const y = input[inputIndex]!;
134
+ inputIndex += 1;
135
+
136
+ /* cspell: disable-next-line */
137
+ // ccdddddd
138
+ const z = input[inputIndex]!;
139
+ inputIndex += 1;
140
+
141
+ output[outputIndex] = indexToChar[x >> 2]!;
142
+ outputIndex += 1;
143
+
144
+ output[outputIndex] = indexToChar[((x & 0b11) << 4) | (y >> 4)]!;
145
+ outputIndex += 1;
146
+
147
+ output[outputIndex] = indexToChar[((y & 0b1111) << 2) | (z >> 6)]!;
148
+ outputIndex += 1;
149
+
150
+ output[outputIndex] = indexToChar[z & 0b111111]!;
151
+ outputIndex += 1;
152
+ }
153
+
154
+ if (paddingLength === 2) {
155
+ /* cspell: disable-next-line */
156
+ // aaaaaabb
157
+ const x = input[inputIndex]!;
158
+ inputIndex += 1;
159
+
160
+ output[outputIndex] = indexToChar[x >> 2]!;
161
+ outputIndex += 1;
162
+
163
+ output[outputIndex] = indexToChar[((x & 0b11) << 4)]!;
164
+ outputIndex += 1;
165
+
166
+ output[outputIndex] = paddingChar;
167
+ outputIndex += 1;
168
+
169
+ output[outputIndex] = paddingChar;
170
+ } else if (paddingLength === 1) {
171
+ /* cspell: disable-next-line */
172
+ // aaaaaabb
173
+ const x = input[inputIndex]!;
174
+ inputIndex += 1;
175
+
176
+ /* cspell: disable-next-line */
177
+ // bbbbcccc
178
+ const y = input[inputIndex]!;
179
+ inputIndex += 1;
180
+
181
+ output[outputIndex] = indexToChar[x >> 2]!;
182
+ outputIndex += 1;
183
+
184
+ output[outputIndex] = indexToChar[((x & 0b11) << 4) | (y >> 4)]!;
185
+ outputIndex += 1;
186
+
187
+ output[outputIndex] = indexToChar[((y & 0b1111) << 2)]!;
188
+ outputIndex += 1;
189
+
190
+ output[outputIndex] = paddingChar;
191
+ }
192
+ }
193
+
194
+ function encodeBackward(input: Uint8Array, output: Uint8Array, paddingLength: number) {
195
+ let inputIndex = input.length - 1;
196
+ let outputIndex = output.length - 1;
197
+
198
+ if (paddingLength === 2) {
199
+ /* cspell: disable-next-line */
200
+ // aaaaaabb
201
+ const x = input[inputIndex]!;
202
+ inputIndex -= 1;
203
+
204
+ output[outputIndex] = paddingChar;
205
+ outputIndex -= 1;
206
+
207
+ output[outputIndex] = paddingChar;
208
+ outputIndex -= 1;
209
+
210
+ output[outputIndex] = indexToChar[((x & 0b11) << 4)]!;
211
+ outputIndex -= 1;
212
+
213
+ output[outputIndex] = indexToChar[x >> 2]!;
214
+ outputIndex -= 1;
215
+ } else if (paddingLength === 1) {
216
+ /* cspell: disable-next-line */
217
+ // bbbbcccc
218
+ const y = input[inputIndex]!;
219
+ inputIndex -= 1;
220
+
221
+ /* cspell: disable-next-line */
222
+ // aaaaaabb
223
+ const x = input[inputIndex]!;
224
+ inputIndex -= 1;
225
+
226
+ output[outputIndex] = paddingChar;
227
+ outputIndex -= 1;
228
+
229
+ output[outputIndex] = indexToChar[((y & 0b1111) << 2)]!;
230
+ outputIndex -= 1;
231
+
232
+ output[outputIndex] = indexToChar[((x & 0b11) << 4) | (y >> 4)]!;
233
+ outputIndex -= 1;
234
+
235
+ output[outputIndex] = indexToChar[x >> 2]!;
236
+ outputIndex -= 1;
237
+ }
238
+
239
+ while (inputIndex >= 0) {
240
+ /* cspell: disable-next-line */
241
+ // ccdddddd
242
+ const z = input[inputIndex]!;
243
+ inputIndex -= 1;
244
+
245
+ /* cspell: disable-next-line */
246
+ // bbbbcccc
247
+ const y = input[inputIndex]!;
248
+ inputIndex -= 1;
249
+
250
+ /* cspell: disable-next-line */
251
+ // aaaaaabb
252
+ const x = input[inputIndex]!;
253
+ inputIndex -= 1;
254
+
255
+ output[outputIndex] = indexToChar[z & 0b111111]!;
256
+ outputIndex -= 1;
257
+
258
+ output[outputIndex] = indexToChar[((y & 0b1111) << 2) | (z >> 6)]!;
259
+ outputIndex -= 1;
260
+
261
+ output[outputIndex] = indexToChar[((x & 0b11) << 4) | (y >> 4)]!;
262
+ outputIndex -= 1;
263
+
264
+ output[outputIndex] = indexToChar[x >> 2]!;
265
+ outputIndex -= 1;
266
+ }
267
+ }
268
+
269
+ export function decodeBase64(input: string): Uint8Array {
270
+ let padding: number;
271
+ if (input[input.length - 2] === '=') {
272
+ padding = 2;
273
+ } else if (input[input.length - 1] === '=') {
274
+ padding = 1;
275
+ } else {
276
+ padding = 0;
277
+ }
278
+
279
+ const result = new Uint8Array(input.length / 4 * 3 - padding);
280
+ let sIndex = 0;
281
+ let dIndex = 0;
282
+
283
+ while (sIndex < input.length - (padding !== 0 ? 4 : 0)) {
284
+ const a = charToIndex[input[sIndex]!]!;
285
+ sIndex += 1;
286
+
287
+ const b = charToIndex[input[sIndex]!]!;
288
+ sIndex += 1;
289
+
290
+ const c = charToIndex[input[sIndex]!]!;
291
+ sIndex += 1;
292
+
293
+ const d = charToIndex[input[sIndex]!]!;
294
+ sIndex += 1;
295
+
296
+ result[dIndex] = (a << 2) | ((b & 0b11_0000) >> 4);
297
+ dIndex += 1;
298
+
299
+ result[dIndex] = ((b & 0b1111) << 4) | ((c & 0b11_1100) >> 2);
300
+ dIndex += 1;
301
+
302
+ result[dIndex] = ((c & 0b11) << 6) | d;
303
+ dIndex += 1;
304
+ }
305
+
306
+ if (padding === 1) {
307
+ const a = charToIndex[input[sIndex]!]!;
308
+ sIndex += 1;
309
+
310
+ const b = charToIndex[input[sIndex]!]!;
311
+ sIndex += 1;
312
+
313
+ const c = charToIndex[input[sIndex]!]!;
314
+
315
+ result[dIndex] = (a << 2) | ((b & 0b11_0000) >> 4);
316
+ dIndex += 1;
317
+
318
+ result[dIndex] = ((b & 0b1111) << 4) | ((c & 0b11_1100) >> 2);
319
+ } else if (padding === 2) {
320
+ const a = charToIndex[input[sIndex]!]!;
321
+ sIndex += 1;
322
+
323
+ const b = charToIndex[input[sIndex]!]!;
324
+
325
+ result[dIndex] = (a << 2) | ((b & 0b11_0000) >> 4);
326
+ }
327
+
328
+ return result;
329
+ }
@@ -1,3 +1,3 @@
1
- export { decodeUtf8, encodeUtf8 } from '@yume-chan/struct';
2
- export * from './auto-reset-event.js';
3
- export * from './base64.js';
1
+ export { decodeUtf8, encodeUtf8 } from '@yume-chan/struct';
2
+ export * from './auto-reset-event.js';
3
+ export * from './base64.js';
@@ -1,3 +1,3 @@
1
- {
2
- "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json"
3
- }
1
+ {
2
+ "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json"
3
+ }