@yume-chan/adb 0.0.9 → 0.0.10

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 (205) hide show
  1. package/CHANGELOG.json +23 -0
  2. package/CHANGELOG.md +16 -0
  3. package/LICENSE +21 -21
  4. package/README.md +227 -257
  5. package/dts/adb.d.ts.map +1 -1
  6. package/dts/auth.d.ts +11 -1
  7. package/dts/auth.d.ts.map +1 -1
  8. package/dts/backend.d.ts +3 -5
  9. package/dts/backend.d.ts.map +1 -1
  10. package/dts/commands/demo-mode.d.ts +3 -3
  11. package/dts/commands/demo-mode.d.ts.map +1 -1
  12. package/dts/commands/reverse.d.ts +2 -2
  13. package/dts/commands/reverse.d.ts.map +1 -1
  14. package/dts/commands/shell/index.d.ts +31 -5
  15. package/dts/commands/shell/index.d.ts.map +1 -1
  16. package/dts/commands/shell/legacy.d.ts +13 -2
  17. package/dts/commands/shell/legacy.d.ts.map +1 -1
  18. package/dts/commands/shell/protocol.d.ts +11 -3
  19. package/dts/commands/shell/protocol.d.ts.map +1 -1
  20. package/dts/commands/shell/types.d.ts +35 -3
  21. package/dts/commands/shell/types.d.ts.map +1 -1
  22. package/dts/commands/sync/request.d.ts +1 -1
  23. package/dts/commands/sync/request.d.ts.map +1 -1
  24. package/dts/commands/sync/response.d.ts +2 -2
  25. package/dts/commands/sync/response.d.ts.map +1 -1
  26. package/dts/commands/sync/sync.d.ts.map +1 -1
  27. package/dts/crypto.d.ts +7 -0
  28. package/dts/crypto.d.ts.map +1 -1
  29. package/dts/packet.d.ts.map +1 -1
  30. package/dts/socket/close-event-emitter.d.ts.map +1 -1
  31. package/dts/socket/controller.d.ts.map +1 -1
  32. package/dts/socket/data-event-emitter.d.ts.map +1 -1
  33. package/dts/socket/dispatcher.d.ts.map +1 -1
  34. package/dts/stream/buffered-stream.d.ts +2 -4
  35. package/dts/stream/buffered-stream.d.ts.map +1 -1
  36. package/dts/utils/encoding.d.ts +3 -0
  37. package/dts/utils/encoding.d.ts.map +1 -0
  38. package/dts/utils/index.d.ts +1 -0
  39. package/dts/utils/index.d.ts.map +1 -1
  40. package/esm/adb.js +3 -2
  41. package/esm/adb.js.map +1 -1
  42. package/esm/auth.js +2 -2
  43. package/esm/auth.js.map +1 -1
  44. package/esm/commands/demo-mode.js +9 -9
  45. package/esm/commands/demo-mode.js.map +1 -1
  46. package/esm/commands/reverse.js +3 -2
  47. package/esm/commands/reverse.js.map +1 -1
  48. package/esm/commands/shell/index.js +28 -18
  49. package/esm/commands/shell/index.js.map +1 -1
  50. package/esm/commands/shell/legacy.js +16 -0
  51. package/esm/commands/shell/legacy.js.map +1 -1
  52. package/esm/commands/shell/protocol.js +36 -9
  53. package/esm/commands/shell/protocol.js.map +1 -1
  54. package/esm/commands/sync/request.js +5 -4
  55. package/esm/commands/sync/request.js.map +1 -1
  56. package/esm/commands/sync/response.js +4 -3
  57. package/esm/commands/sync/response.js.map +1 -1
  58. package/esm/commands/sync/sync.js.map +1 -1
  59. package/esm/crypto.js +7 -2
  60. package/esm/crypto.js.map +1 -1
  61. package/esm/packet.js +12 -14
  62. package/esm/packet.js.map +1 -1
  63. package/esm/socket/close-event-emitter.js.map +1 -1
  64. package/esm/socket/controller.js.map +1 -1
  65. package/esm/socket/data-event-emitter.js.map +1 -1
  66. package/esm/socket/dispatcher.js +7 -7
  67. package/esm/socket/dispatcher.js.map +1 -1
  68. package/esm/stream/buffered-stream.js +0 -6
  69. package/esm/stream/buffered-stream.js.map +1 -1
  70. package/esm/utils/encoding.js +11 -0
  71. package/esm/utils/encoding.js.map +1 -0
  72. package/esm/utils/index.js +1 -0
  73. package/esm/utils/index.js.map +1 -1
  74. package/package.json +44 -51
  75. package/src/adb.ts +243 -242
  76. package/src/auth.ts +166 -156
  77. package/src/backend.ts +20 -24
  78. package/src/commands/base.ts +11 -11
  79. package/src/commands/demo-mode.ts +160 -160
  80. package/src/commands/framebuffer.ts +73 -73
  81. package/src/commands/index.ts +8 -8
  82. package/src/commands/install.ts +21 -21
  83. package/src/commands/reverse.ts +134 -133
  84. package/src/commands/shell/index.ts +87 -68
  85. package/src/commands/shell/legacy.ts +59 -42
  86. package/src/commands/shell/protocol.ts +121 -94
  87. package/src/commands/shell/types.ts +55 -21
  88. package/src/commands/shell/utils.ts +20 -20
  89. package/src/commands/sync/index.ts +7 -7
  90. package/src/commands/sync/list.ts +39 -39
  91. package/src/commands/sync/pull.ts +34 -34
  92. package/src/commands/sync/push.ts +46 -46
  93. package/src/commands/sync/request.ts +49 -48
  94. package/src/commands/sync/response.ts +58 -57
  95. package/src/commands/sync/stat.ts +121 -121
  96. package/src/commands/sync/sync.ts +113 -113
  97. package/src/commands/tcpip.ts +21 -21
  98. package/src/crypto.ts +285 -280
  99. package/src/features.ts +5 -5
  100. package/src/index.ts +10 -10
  101. package/src/packet.ts +84 -89
  102. package/src/socket/close-event-emitter.ts +28 -28
  103. package/src/socket/controller.ts +105 -105
  104. package/src/socket/data-event-emitter.ts +27 -27
  105. package/src/socket/dispatcher.ts +269 -269
  106. package/src/socket/index.ts +6 -6
  107. package/src/socket/logger.ts +12 -12
  108. package/src/socket/socket.ts +28 -28
  109. package/src/stream/buffered-stream.ts +92 -100
  110. package/src/stream/index.ts +2 -2
  111. package/src/stream/stream.ts +50 -50
  112. package/src/utils/auto-reset-event.ts +41 -41
  113. package/src/utils/base64.ts +274 -274
  114. package/src/utils/chunk.ts +70 -70
  115. package/src/utils/encoding.ts +13 -0
  116. package/src/utils/event-queue.ts +145 -145
  117. package/src/utils/index.ts +5 -4
  118. package/cjs/adb.js +0 -205
  119. package/cjs/adb.js.map +0 -1
  120. package/cjs/auth.js +0 -141
  121. package/cjs/auth.js.map +0 -1
  122. package/cjs/backend.js +0 -3
  123. package/cjs/backend.js.map +0 -1
  124. package/cjs/commands/base.js +0 -12
  125. package/cjs/commands/base.js.map +0 -1
  126. package/cjs/commands/demo-mode.js +0 -174
  127. package/cjs/commands/demo-mode.js.map +0 -1
  128. package/cjs/commands/framebuffer.js +0 -66
  129. package/cjs/commands/framebuffer.js.map +0 -1
  130. package/cjs/commands/index.js +0 -12
  131. package/cjs/commands/index.js.map +0 -1
  132. package/cjs/commands/install.js +0 -20
  133. package/cjs/commands/install.js.map +0 -1
  134. package/cjs/commands/reverse.js +0 -105
  135. package/cjs/commands/reverse.js.map +0 -1
  136. package/cjs/commands/shell/index.js +0 -56
  137. package/cjs/commands/shell/index.js.map +0 -1
  138. package/cjs/commands/shell/legacy.js +0 -37
  139. package/cjs/commands/shell/legacy.js.map +0 -1
  140. package/cjs/commands/shell/protocol.js +0 -83
  141. package/cjs/commands/shell/protocol.js.map +0 -1
  142. package/cjs/commands/shell/types.js +0 -3
  143. package/cjs/commands/shell/types.js.map +0 -1
  144. package/cjs/commands/shell/utils.js +0 -23
  145. package/cjs/commands/shell/utils.js.map +0 -1
  146. package/cjs/commands/sync/index.js +0 -11
  147. package/cjs/commands/sync/index.js.map +0 -1
  148. package/cjs/commands/sync/list.js +0 -36
  149. package/cjs/commands/sync/list.js.map +0 -1
  150. package/cjs/commands/sync/pull.js +0 -34
  151. package/cjs/commands/sync/pull.js.map +0 -1
  152. package/cjs/commands/sync/push.js +0 -49
  153. package/cjs/commands/sync/push.js.map +0 -1
  154. package/cjs/commands/sync/request.js +0 -48
  155. package/cjs/commands/sync/request.js.map +0 -1
  156. package/cjs/commands/sync/response.js +0 -53
  157. package/cjs/commands/sync/response.js.map +0 -1
  158. package/cjs/commands/sync/stat.js +0 -109
  159. package/cjs/commands/sync/stat.js.map +0 -1
  160. package/cjs/commands/sync/sync.js +0 -118
  161. package/cjs/commands/sync/sync.js.map +0 -1
  162. package/cjs/commands/tcpip.js +0 -28
  163. package/cjs/commands/tcpip.js.map +0 -1
  164. package/cjs/crypto.js +0 -231
  165. package/cjs/crypto.js.map +0 -1
  166. package/cjs/features.js +0 -10
  167. package/cjs/features.js.map +0 -1
  168. package/cjs/index.js +0 -14
  169. package/cjs/index.js.map +0 -1
  170. package/cjs/packet.js +0 -77
  171. package/cjs/packet.js.map +0 -1
  172. package/cjs/socket/close-event-emitter.js +0 -32
  173. package/cjs/socket/close-event-emitter.js.map +0 -1
  174. package/cjs/socket/controller.js +0 -84
  175. package/cjs/socket/controller.js.map +0 -1
  176. package/cjs/socket/data-event-emitter.js +0 -29
  177. package/cjs/socket/data-event-emitter.js.map +0 -1
  178. package/cjs/socket/dispatcher.js +0 -219
  179. package/cjs/socket/dispatcher.js.map +0 -1
  180. package/cjs/socket/index.js +0 -10
  181. package/cjs/socket/index.js.map +0 -1
  182. package/cjs/socket/logger.js +0 -3
  183. package/cjs/socket/logger.js.map +0 -1
  184. package/cjs/socket/socket.js +0 -24
  185. package/cjs/socket/socket.js.map +0 -1
  186. package/cjs/stream/buffered-stream.js +0 -78
  187. package/cjs/stream/buffered-stream.js.map +0 -1
  188. package/cjs/stream/index.js +0 -6
  189. package/cjs/stream/index.js.map +0 -1
  190. package/cjs/stream/stream.js +0 -45
  191. package/cjs/stream/stream.js.map +0 -1
  192. package/cjs/utils/auto-reset-event.js +0 -37
  193. package/cjs/utils/auto-reset-event.js.map +0 -1
  194. package/cjs/utils/base64.js +0 -210
  195. package/cjs/utils/base64.js.map +0 -1
  196. package/cjs/utils/chunk.js +0 -75
  197. package/cjs/utils/chunk.js.map +0 -1
  198. package/cjs/utils/event-queue.js +0 -108
  199. package/cjs/utils/event-queue.js.map +0 -1
  200. package/cjs/utils/index.js +0 -8
  201. package/cjs/utils/index.js.map +0 -1
  202. package/tsconfig.cjs.json +0 -11
  203. package/tsconfig.esm.json +0 -28
  204. package/tsconfig.esm.tsbuildinfo +0 -1305
  205. package/tsconfig.json +0 -18
@@ -1,70 +1,70 @@
1
- export function* chunkArrayLike(
2
- value: ArrayLike<number> | ArrayBufferLike,
3
- size: number
4
- ): Generator<ArrayBuffer, void, void> {
5
- if ('length' in value) {
6
- value = new Uint8Array(value).buffer;
7
- }
8
-
9
- if (value.byteLength <= size) {
10
- return yield value;
11
- }
12
-
13
- for (let i = 0; i < value.byteLength; i += size) {
14
- yield value.slice(i, i + size);
15
- }
16
- }
17
-
18
- export async function* chunkAsyncIterable(
19
- value: AsyncIterable<ArrayBuffer>,
20
- size: number
21
- ): AsyncGenerator<ArrayBuffer, void, void> {
22
- let result = new Uint8Array(size);
23
- let index = 0;
24
- for await (let buffer of value) {
25
- // `result` has some data, `result + buffer` is enough
26
- if (index !== 0 && index + buffer.byteLength >= size) {
27
- const remainder = size - index;
28
- result.set(new Uint8Array(buffer, 0, remainder), index);
29
- yield result.buffer;
30
-
31
- result = new Uint8Array(size);
32
- index = 0;
33
-
34
- if (buffer.byteLength > remainder) {
35
- // `buffer` still has some data
36
- buffer = buffer.slice(remainder);
37
- } else {
38
- continue;
39
- }
40
- }
41
-
42
- // `result` is empty, `buffer` alone is enough
43
- if (buffer.byteLength >= size) {
44
- let remainder = false;
45
- for (const chunk of chunkArrayLike(buffer, size)) {
46
- if (chunk.byteLength === size) {
47
- yield chunk;
48
- continue;
49
- }
50
-
51
- // `buffer` still has some data
52
- remainder = true;
53
- buffer = chunk;
54
- }
55
-
56
- if (!remainder) {
57
- continue;
58
- }
59
- }
60
-
61
- // `result` has some data but `result + buffer` is still not enough
62
- // or after previous steps `buffer` still has some data
63
- result.set(new Uint8Array(buffer), index);
64
- index += buffer.byteLength;
65
- }
66
-
67
- if (index !== 0) {
68
- yield result.buffer.slice(0, index);
69
- }
70
- }
1
+ export function* chunkArrayLike(
2
+ value: ArrayLike<number> | ArrayBufferLike,
3
+ size: number
4
+ ): Generator<ArrayBuffer, void, void> {
5
+ if ('length' in value) {
6
+ value = new Uint8Array(value).buffer;
7
+ }
8
+
9
+ if (value.byteLength <= size) {
10
+ return yield value;
11
+ }
12
+
13
+ for (let i = 0; i < value.byteLength; i += size) {
14
+ yield value.slice(i, i + size);
15
+ }
16
+ }
17
+
18
+ export async function* chunkAsyncIterable(
19
+ value: AsyncIterable<ArrayBuffer>,
20
+ size: number
21
+ ): AsyncGenerator<ArrayBuffer, void, void> {
22
+ let result = new Uint8Array(size);
23
+ let index = 0;
24
+ for await (let buffer of value) {
25
+ // `result` has some data, `result + buffer` is enough
26
+ if (index !== 0 && index + buffer.byteLength >= size) {
27
+ const remainder = size - index;
28
+ result.set(new Uint8Array(buffer, 0, remainder), index);
29
+ yield result.buffer;
30
+
31
+ result = new Uint8Array(size);
32
+ index = 0;
33
+
34
+ if (buffer.byteLength > remainder) {
35
+ // `buffer` still has some data
36
+ buffer = buffer.slice(remainder);
37
+ } else {
38
+ continue;
39
+ }
40
+ }
41
+
42
+ // `result` is empty, `buffer` alone is enough
43
+ if (buffer.byteLength >= size) {
44
+ let remainder = false;
45
+ for (const chunk of chunkArrayLike(buffer, size)) {
46
+ if (chunk.byteLength === size) {
47
+ yield chunk;
48
+ continue;
49
+ }
50
+
51
+ // `buffer` still has some data
52
+ remainder = true;
53
+ buffer = chunk;
54
+ }
55
+
56
+ if (!remainder) {
57
+ continue;
58
+ }
59
+ }
60
+
61
+ // `result` has some data but `result + buffer` is still not enough
62
+ // or after previous steps `buffer` still has some data
63
+ result.set(new Uint8Array(buffer), index);
64
+ index += buffer.byteLength;
65
+ }
66
+
67
+ if (index !== 0) {
68
+ yield result.buffer.slice(0, index);
69
+ }
70
+ }
@@ -0,0 +1,13 @@
1
+
2
+ // @ts-expect-error @types/node missing `TextEncoder`
3
+ const Utf8Encoder = new TextEncoder();
4
+ // @ts-expect-error @types/node missing `TextDecoder`
5
+ const Utf8Decoder = new TextDecoder();
6
+
7
+ export function encodeUtf8(input: string): ArrayBuffer {
8
+ return Utf8Encoder.encode(input).buffer;
9
+ }
10
+
11
+ export function decodeUtf8(buffer: ArrayBuffer): string {
12
+ return Utf8Decoder.decode(buffer);
13
+ }
@@ -1,145 +1,145 @@
1
- import { PromiseResolver } from '@yume-chan/async';
2
- import { EventEmitter } from '@yume-chan/event';
3
-
4
- export interface EventQueueOptions {
5
- maxWaitCount: number;
6
-
7
- highWaterMark: number;
8
-
9
- lowWaterMark: number;
10
- }
11
-
12
- export const EventQueueDefaultOptions: EventQueueOptions = {
13
- maxWaitCount: Infinity,
14
- highWaterMark: 10,
15
- lowWaterMark: 0,
16
- };
17
-
18
- interface LinkedListItem<T> {
19
- value: T;
20
-
21
- next?: LinkedListItem<T>;
22
- }
23
-
24
- class LinkedList<T>{
25
- private head?: LinkedListItem<T>;
26
-
27
- private tail?: LinkedListItem<T>;
28
-
29
- private _length = 0;
30
- public get length() { return this._length; }
31
-
32
- public push(value: T): void {
33
- const item: LinkedListItem<T> = { value };
34
-
35
- if (this._length === 0) {
36
- this.head = item;
37
- } else {
38
- this.tail!.next = item;
39
- }
40
-
41
- this._length += 1;
42
- this.tail = item;
43
- }
44
-
45
- public shift(): T | undefined {
46
- if (this._length === 0) {
47
- return;
48
- }
49
-
50
- const { next, value } = this.head!;
51
- if (!next) {
52
- this.tail = undefined;
53
- }
54
-
55
- this.head = next;
56
- this._length -= 1;
57
- return value;
58
- }
59
- }
60
-
61
- /**
62
- * Basically an object-mode ReadableStream with Promise-based API
63
- *
64
- * It's called `EventQueue` because it usually converts events ("push system") to "pull system"
65
- *
66
- * https://github.com/nodejs/node/blob/master/lib/internal/streams/readable.js
67
- */
68
- export class EventQueue<T> {
69
- // Use linked lists for faster shift operation.
70
-
71
- /** Already buffered data ready to be served to consumers */
72
- private buffers = new LinkedList<[value: T, size: number]>();
73
-
74
- /** Waiting consumers because lack of data */
75
- private awaiters = new LinkedList<PromiseResolver<T>>();
76
-
77
- private options: EventQueueOptions;
78
-
79
- private ended = false;
80
-
81
- private _length = 0;
82
- public get length() { return this._length; }
83
-
84
- private _needDrain = false;
85
- public get needDrain() { return this._needDrain; }
86
-
87
- private readonly drainEvent = new EventEmitter<void>();
88
- public readonly onDrain = this.drainEvent.event;
89
-
90
- public constructor(options?: Partial<EventQueueOptions>) {
91
- this.options = { ...EventQueueDefaultOptions, ...options };
92
- }
93
-
94
- public enqueue(value: T, length = 1): boolean {
95
- if (this.ended) {
96
- return true;
97
- }
98
-
99
- if (this.awaiters.length) {
100
- this.awaiters.shift()!.resolve(value);
101
- return true;
102
- }
103
-
104
- this.buffers.push([value, length]);
105
- this._length += length;
106
- if (this._length < this.options.highWaterMark) {
107
- return true;
108
- }
109
-
110
- this._needDrain = true;
111
- return false;
112
- }
113
-
114
- public dequeue(): Promise<T> {
115
- if (this.buffers.length) {
116
- const [value, size] = this.buffers.shift()!;
117
- this._length -= size;
118
- if (this._needDrain &&
119
- this._length <= this.options.lowWaterMark) {
120
- this.drainEvent.fire();
121
- }
122
- return Promise.resolve(value);
123
- }
124
-
125
- if (this.ended) {
126
- return Promise.reject(new Error('The EventQueue has already ended'));
127
- }
128
-
129
- if (this.awaiters.length === this.options.maxWaitCount - 1) {
130
- throw new Error('Max wait count exceeded');
131
- }
132
-
133
- const resolver = new PromiseResolver<T>();
134
- this.awaiters.push(resolver);
135
- return resolver.promise;
136
- }
137
-
138
- public end(): void {
139
- this.ended = true;
140
- let item: PromiseResolver<T> | undefined;
141
- while (item = this.awaiters.shift()) {
142
- item.reject(new Error('The EventQueue has already ended'));
143
- }
144
- }
145
- }
1
+ import { PromiseResolver } from '@yume-chan/async';
2
+ import { EventEmitter } from '@yume-chan/event';
3
+
4
+ export interface EventQueueOptions {
5
+ maxWaitCount: number;
6
+
7
+ highWaterMark: number;
8
+
9
+ lowWaterMark: number;
10
+ }
11
+
12
+ export const EventQueueDefaultOptions: EventQueueOptions = {
13
+ maxWaitCount: Infinity,
14
+ highWaterMark: 10,
15
+ lowWaterMark: 0,
16
+ };
17
+
18
+ interface LinkedListItem<T> {
19
+ value: T;
20
+
21
+ next?: LinkedListItem<T>;
22
+ }
23
+
24
+ class LinkedList<T>{
25
+ private head?: LinkedListItem<T>;
26
+
27
+ private tail?: LinkedListItem<T>;
28
+
29
+ private _length = 0;
30
+ public get length() { return this._length; }
31
+
32
+ public push(value: T): void {
33
+ const item: LinkedListItem<T> = { value };
34
+
35
+ if (this._length === 0) {
36
+ this.head = item;
37
+ } else {
38
+ this.tail!.next = item;
39
+ }
40
+
41
+ this._length += 1;
42
+ this.tail = item;
43
+ }
44
+
45
+ public shift(): T | undefined {
46
+ if (this._length === 0) {
47
+ return;
48
+ }
49
+
50
+ const { next, value } = this.head!;
51
+ if (!next) {
52
+ this.tail = undefined;
53
+ }
54
+
55
+ this.head = next;
56
+ this._length -= 1;
57
+ return value;
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Basically an object-mode ReadableStream with Promise-based API
63
+ *
64
+ * It's called `EventQueue` because it usually converts events ("push system") to "pull system"
65
+ *
66
+ * https://github.com/nodejs/node/blob/master/lib/internal/streams/readable.js
67
+ */
68
+ export class EventQueue<T> {
69
+ // Use linked lists for faster shift operation.
70
+
71
+ /** Already buffered data ready to be served to consumers */
72
+ private buffers = new LinkedList<[value: T, size: number]>();
73
+
74
+ /** Waiting consumers because lack of data */
75
+ private awaiters = new LinkedList<PromiseResolver<T>>();
76
+
77
+ private options: EventQueueOptions;
78
+
79
+ private ended = false;
80
+
81
+ private _length = 0;
82
+ public get length() { return this._length; }
83
+
84
+ private _needDrain = false;
85
+ public get needDrain() { return this._needDrain; }
86
+
87
+ private readonly drainEvent = new EventEmitter<void>();
88
+ public readonly onDrain = this.drainEvent.event;
89
+
90
+ public constructor(options?: Partial<EventQueueOptions>) {
91
+ this.options = { ...EventQueueDefaultOptions, ...options };
92
+ }
93
+
94
+ public enqueue(value: T, length = 1): boolean {
95
+ if (this.ended) {
96
+ return true;
97
+ }
98
+
99
+ if (this.awaiters.length) {
100
+ this.awaiters.shift()!.resolve(value);
101
+ return true;
102
+ }
103
+
104
+ this.buffers.push([value, length]);
105
+ this._length += length;
106
+ if (this._length < this.options.highWaterMark) {
107
+ return true;
108
+ }
109
+
110
+ this._needDrain = true;
111
+ return false;
112
+ }
113
+
114
+ public dequeue(): Promise<T> {
115
+ if (this.buffers.length) {
116
+ const [value, size] = this.buffers.shift()!;
117
+ this._length -= size;
118
+ if (this._needDrain &&
119
+ this._length <= this.options.lowWaterMark) {
120
+ this.drainEvent.fire();
121
+ }
122
+ return Promise.resolve(value);
123
+ }
124
+
125
+ if (this.ended) {
126
+ return Promise.reject(new Error('The EventQueue has already ended'));
127
+ }
128
+
129
+ if (this.awaiters.length === this.options.maxWaitCount - 1) {
130
+ throw new Error('Max wait count exceeded');
131
+ }
132
+
133
+ const resolver = new PromiseResolver<T>();
134
+ this.awaiters.push(resolver);
135
+ return resolver.promise;
136
+ }
137
+
138
+ public end(): void {
139
+ this.ended = true;
140
+ let item: PromiseResolver<T> | undefined;
141
+ while (item = this.awaiters.shift()) {
142
+ item.reject(new Error('The EventQueue has already ended'));
143
+ }
144
+ }
145
+ }
@@ -1,4 +1,5 @@
1
- export * from './auto-reset-event';
2
- export * from './base64';
3
- export * from './chunk';
4
- export * from './event-queue';
1
+ export * from './auto-reset-event';
2
+ export * from './base64';
3
+ export * from './chunk';
4
+ export * from './encoding';
5
+ export * from './event-queue';
package/cjs/adb.js DELETED
@@ -1,205 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Adb = exports.AdbPropKey = void 0;
4
- const tslib_1 = require("tslib");
5
- const async_1 = require("@yume-chan/async");
6
- const event_1 = require("@yume-chan/event");
7
- const auth_1 = require("./auth");
8
- const commands_1 = require("./commands");
9
- const features_1 = require("./features");
10
- const packet_1 = require("./packet");
11
- const socket_1 = require("./socket");
12
- var AdbPropKey;
13
- (function (AdbPropKey) {
14
- AdbPropKey["Product"] = "ro.product.name";
15
- AdbPropKey["Model"] = "ro.product.model";
16
- AdbPropKey["Device"] = "ro.product.device";
17
- AdbPropKey["Features"] = "features";
18
- })(AdbPropKey = exports.AdbPropKey || (exports.AdbPropKey = {}));
19
- class Adb {
20
- constructor(backend, logger) {
21
- this._connected = false;
22
- this._backend = backend;
23
- this.packetDispatcher = new socket_1.AdbPacketDispatcher(backend, logger);
24
- this.tcpip = new commands_1.AdbTcpIpCommand(this);
25
- this.reverse = new commands_1.AdbReverseCommand(this.packetDispatcher);
26
- this.demoMode = new commands_1.AdbDemoMode(this);
27
- this.childProcess = new commands_1.AdbChildProcess(this);
28
- backend.onDisconnected(this.dispose, this);
29
- }
30
- get backend() { return this._backend; }
31
- get onDisconnected() { return this.backend.onDisconnected; }
32
- get connected() { return this._connected; }
33
- get name() { return this.backend.name; }
34
- get protocolVersion() { return this._protocolVersion; }
35
- get product() { return this._product; }
36
- get model() { return this._model; }
37
- get device() { return this._device; }
38
- get features() { return this._features; }
39
- connect(credentialStore, authenticators = auth_1.AdbDefaultAuthenticators) {
40
- var _a, _b;
41
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
42
- yield ((_b = (_a = this.backend).connect) === null || _b === void 0 ? void 0 : _b.call(_a));
43
- this.packetDispatcher.maxPayloadSize = 0x1000;
44
- this.packetDispatcher.calculateChecksum = true;
45
- this.packetDispatcher.appendNullToServiceString = true;
46
- this.packetDispatcher.start();
47
- const version = 0x01000001;
48
- const versionNoChecksum = 0x01000001;
49
- const maxPayloadSize = 0x100000;
50
- const features = [
51
- 'shell_v2',
52
- 'cmd',
53
- features_1.AdbFeatures.StatV2,
54
- 'ls_v2',
55
- 'fixed_push_mkdir',
56
- 'apex',
57
- 'abb',
58
- 'fixed_push_symlink_timestamp',
59
- 'abb_exec',
60
- 'remount_shell',
61
- 'track_app',
62
- 'sendrecv_v2',
63
- 'sendrecv_v2_brotli',
64
- 'sendrecv_v2_lz4',
65
- 'sendrecv_v2_zstd',
66
- 'sendrecv_v2_dry_run_send',
67
- ].join(',');
68
- const resolver = new async_1.PromiseResolver();
69
- const authHandler = new auth_1.AdbAuthenticationHandler(authenticators, credentialStore);
70
- const disposableList = new event_1.DisposableList();
71
- disposableList.add(this.packetDispatcher.onPacket((e) => tslib_1.__awaiter(this, void 0, void 0, function* () {
72
- e.handled = true;
73
- const { packet } = e;
74
- try {
75
- switch (packet.command) {
76
- case packet_1.AdbCommand.Connect:
77
- this.packetDispatcher.maxPayloadSize = Math.min(maxPayloadSize, packet.arg1);
78
- const finalVersion = Math.min(version, packet.arg0);
79
- this._protocolVersion = finalVersion;
80
- if (finalVersion >= versionNoChecksum) {
81
- this.packetDispatcher.calculateChecksum = false;
82
- // Android prior to 9.0.0 uses char* to parse service string
83
- // thus requires an extra null character
84
- this.packetDispatcher.appendNullToServiceString = false;
85
- }
86
- this.parseBanner(this.backend.decodeUtf8(packet.payload));
87
- resolver.resolve();
88
- break;
89
- case packet_1.AdbCommand.Auth:
90
- const authPacket = yield authHandler.handle(e.packet);
91
- yield this.packetDispatcher.sendPacket(authPacket);
92
- break;
93
- case packet_1.AdbCommand.Close:
94
- // Last connection was interrupted
95
- // Ignore this packet, device will recover
96
- break;
97
- default:
98
- throw new Error('Device not in correct state. Reconnect your device and try again');
99
- }
100
- }
101
- catch (e) {
102
- resolver.reject(e);
103
- }
104
- })));
105
- disposableList.add(this.packetDispatcher.onError(e => {
106
- resolver.reject(e);
107
- }));
108
- // Android prior 9.0.0 requires the null character
109
- // Newer versions can also handle the null character
110
- // The terminating `;` is required in formal definition
111
- // But ADB daemon can also work without it
112
- yield this.packetDispatcher.sendPacket(packet_1.AdbCommand.Connect, version, maxPayloadSize, `host::features=${features};\0`);
113
- try {
114
- yield resolver.promise;
115
- this._connected = true;
116
- }
117
- finally {
118
- disposableList.dispose();
119
- }
120
- });
121
- }
122
- parseBanner(banner) {
123
- this._features = [];
124
- const pieces = banner.split('::');
125
- if (pieces.length > 1) {
126
- const props = pieces[1];
127
- for (const prop of props.split(';')) {
128
- if (!prop) {
129
- continue;
130
- }
131
- const keyValue = prop.split('=');
132
- if (keyValue.length !== 2) {
133
- continue;
134
- }
135
- const [key, value] = keyValue;
136
- switch (key) {
137
- case AdbPropKey.Product:
138
- this._product = value;
139
- break;
140
- case AdbPropKey.Model:
141
- this._model = value;
142
- break;
143
- case AdbPropKey.Device:
144
- this._device = value;
145
- break;
146
- case AdbPropKey.Features:
147
- this._features = value.split(',');
148
- break;
149
- }
150
- }
151
- }
152
- }
153
- getProp(key) {
154
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
155
- const output = yield this.childProcess.exec('getprop', key);
156
- return output.trim();
157
- });
158
- }
159
- rm(...filenames) {
160
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
161
- return yield this.childProcess.exec('rm', '-rf', ...filenames.map(arg => commands_1.escapeArg(arg)));
162
- });
163
- }
164
- install(apk, onProgress) {
165
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
166
- return yield commands_1.install(this, apk, onProgress);
167
- });
168
- }
169
- sync() {
170
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
171
- const socket = yield this.createSocket('sync:');
172
- return new commands_1.AdbSync(this, socket);
173
- });
174
- }
175
- framebuffer() {
176
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
177
- return commands_1.framebuffer(this);
178
- });
179
- }
180
- createSocket(service) {
181
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
182
- return this.packetDispatcher.createSocket(service);
183
- });
184
- }
185
- createSocketAndReadAll(service) {
186
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
187
- const socket = yield this.createSocket(service);
188
- const resolver = new async_1.PromiseResolver();
189
- let result = '';
190
- socket.onData(buffer => {
191
- result += this.backend.decodeUtf8(buffer);
192
- });
193
- socket.onClose(() => resolver.resolve(result));
194
- return resolver.promise;
195
- });
196
- }
197
- dispose() {
198
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
199
- this.packetDispatcher.dispose();
200
- yield this.backend.dispose();
201
- });
202
- }
203
- }
204
- exports.Adb = Adb;
205
- //# sourceMappingURL=adb.js.map
package/cjs/adb.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"adb.js","sourceRoot":"","sources":["../src/adb.ts"],"names":[],"mappings":"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"}