@yume-chan/adb 1.1.0 → 2.0.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 (197) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +1 -1
  3. package/esm/adb.d.ts +7 -6
  4. package/esm/adb.d.ts.map +1 -1
  5. package/esm/adb.js +22 -22
  6. package/esm/adb.js.map +1 -1
  7. package/esm/banner.js.map +1 -1
  8. package/esm/commands/base.d.ts +3 -2
  9. package/esm/commands/base.d.ts.map +1 -1
  10. package/esm/commands/base.js +6 -3
  11. package/esm/commands/base.js.map +1 -1
  12. package/esm/commands/framebuffer.d.ts +6 -6
  13. package/esm/commands/power.d.ts +2 -2
  14. package/esm/commands/power.d.ts.map +1 -1
  15. package/esm/commands/power.js +4 -4
  16. package/esm/commands/power.js.map +1 -1
  17. package/esm/commands/reverse.d.ts +3 -4
  18. package/esm/commands/reverse.d.ts.map +1 -1
  19. package/esm/commands/reverse.js +5 -10
  20. package/esm/commands/reverse.js.map +1 -1
  21. package/esm/commands/subprocess/index.d.ts +3 -2
  22. package/esm/commands/subprocess/index.d.ts.map +1 -1
  23. package/esm/commands/subprocess/index.js +3 -2
  24. package/esm/commands/subprocess/index.js.map +1 -1
  25. package/esm/commands/subprocess/none/index.d.ts +5 -0
  26. package/esm/commands/subprocess/none/index.d.ts.map +1 -0
  27. package/esm/commands/subprocess/none/index.js +5 -0
  28. package/esm/commands/subprocess/none/index.js.map +1 -0
  29. package/esm/commands/subprocess/none/process.d.ts +13 -0
  30. package/esm/commands/subprocess/none/process.d.ts.map +1 -0
  31. package/esm/commands/subprocess/none/process.js +36 -0
  32. package/esm/commands/subprocess/none/process.js.map +1 -0
  33. package/esm/commands/subprocess/none/pty.d.ts +15 -0
  34. package/esm/commands/subprocess/none/pty.d.ts.map +1 -0
  35. package/esm/commands/subprocess/none/pty.js +29 -0
  36. package/esm/commands/subprocess/none/pty.js.map +1 -0
  37. package/esm/commands/subprocess/none/service.d.ts +10 -0
  38. package/esm/commands/subprocess/none/service.d.ts.map +1 -0
  39. package/esm/commands/subprocess/none/service.js +32 -0
  40. package/esm/commands/subprocess/none/service.js.map +1 -0
  41. package/esm/commands/subprocess/none/spawner.d.ts +19 -0
  42. package/esm/commands/subprocess/none/spawner.d.ts.map +1 -0
  43. package/esm/commands/subprocess/none/spawner.js +26 -0
  44. package/esm/commands/subprocess/none/spawner.js.map +1 -0
  45. package/esm/commands/subprocess/pty.d.ts +10 -0
  46. package/esm/commands/subprocess/pty.d.ts.map +1 -0
  47. package/esm/commands/subprocess/pty.js +2 -0
  48. package/esm/commands/subprocess/pty.js.map +1 -0
  49. package/esm/commands/subprocess/service.d.ts +11 -0
  50. package/esm/commands/subprocess/service.d.ts.map +1 -0
  51. package/esm/commands/subprocess/service.js +25 -0
  52. package/esm/commands/subprocess/service.js.map +1 -0
  53. package/esm/commands/subprocess/shell/index.d.ts +6 -0
  54. package/esm/commands/subprocess/shell/index.d.ts.map +1 -0
  55. package/esm/commands/subprocess/shell/index.js +6 -0
  56. package/esm/commands/subprocess/shell/index.js.map +1 -0
  57. package/esm/commands/subprocess/shell/process.d.ts +15 -0
  58. package/esm/commands/subprocess/shell/process.d.ts.map +1 -0
  59. package/esm/commands/subprocess/{protocols/shell.js → shell/process.js} +27 -54
  60. package/esm/commands/subprocess/shell/process.js.map +1 -0
  61. package/esm/commands/subprocess/shell/pty.d.ts +15 -0
  62. package/esm/commands/subprocess/shell/pty.d.ts.map +1 -0
  63. package/esm/commands/subprocess/shell/pty.js +76 -0
  64. package/esm/commands/subprocess/shell/pty.js.map +1 -0
  65. package/esm/commands/subprocess/shell/service.d.ts +14 -0
  66. package/esm/commands/subprocess/shell/service.d.ts.map +1 -0
  67. package/esm/commands/subprocess/shell/service.js +41 -0
  68. package/esm/commands/subprocess/shell/service.js.map +1 -0
  69. package/esm/commands/subprocess/shell/shared.d.ts +19 -0
  70. package/esm/commands/subprocess/shell/shared.d.ts.map +1 -0
  71. package/esm/commands/subprocess/shell/shared.js +15 -0
  72. package/esm/commands/subprocess/shell/shared.js.map +1 -0
  73. package/esm/commands/subprocess/shell/spawner.d.ts +24 -0
  74. package/esm/commands/subprocess/shell/spawner.d.ts.map +1 -0
  75. package/esm/commands/subprocess/shell/spawner.js +38 -0
  76. package/esm/commands/subprocess/shell/spawner.js.map +1 -0
  77. package/esm/commands/subprocess/utils.d.ts +1 -0
  78. package/esm/commands/subprocess/utils.d.ts.map +1 -1
  79. package/esm/commands/subprocess/utils.js +37 -0
  80. package/esm/commands/subprocess/utils.js.map +1 -1
  81. package/esm/commands/sync/list.d.ts +12 -8
  82. package/esm/commands/sync/list.d.ts.map +1 -1
  83. package/esm/commands/sync/list.js +5 -7
  84. package/esm/commands/sync/list.js.map +1 -1
  85. package/esm/commands/sync/pull.d.ts +4 -4
  86. package/esm/commands/sync/pull.d.ts.map +1 -1
  87. package/esm/commands/sync/pull.js +2 -7
  88. package/esm/commands/sync/pull.js.map +1 -1
  89. package/esm/commands/sync/push.d.ts +4 -4
  90. package/esm/commands/sync/request.d.ts +1 -1
  91. package/esm/commands/sync/response.d.ts +5 -5
  92. package/esm/commands/sync/response.d.ts.map +1 -1
  93. package/esm/commands/sync/response.js +2 -1
  94. package/esm/commands/sync/response.js.map +1 -1
  95. package/esm/commands/sync/stat.d.ts +4 -4
  96. package/esm/commands/sync/sync.d.ts +2 -2
  97. package/esm/commands/sync/sync.js +1 -1
  98. package/esm/commands/sync/sync.js.map +1 -1
  99. package/esm/commands/tcpip.d.ts +2 -2
  100. package/esm/commands/tcpip.js +2 -2
  101. package/esm/daemon/dispatcher.d.ts.map +1 -1
  102. package/esm/daemon/dispatcher.js.map +1 -1
  103. package/esm/daemon/packet.d.ts +6 -4
  104. package/esm/daemon/packet.d.ts.map +1 -1
  105. package/esm/daemon/packet.js +3 -5
  106. package/esm/daemon/packet.js.map +1 -1
  107. package/esm/daemon/socket.d.ts +2 -2
  108. package/esm/daemon/socket.d.ts.map +1 -1
  109. package/esm/daemon/socket.js +1 -1
  110. package/esm/daemon/socket.js.map +1 -1
  111. package/esm/device-observer.d.ts +4 -4
  112. package/esm/device-observer.d.ts.map +1 -1
  113. package/esm/server/client.d.ts +10 -38
  114. package/esm/server/client.d.ts.map +1 -1
  115. package/esm/server/client.js +9 -126
  116. package/esm/server/client.js.map +1 -1
  117. package/esm/server/commands/index.d.ts +3 -0
  118. package/esm/server/commands/index.d.ts.map +1 -0
  119. package/esm/server/commands/index.js +3 -0
  120. package/esm/server/commands/index.js.map +1 -0
  121. package/esm/server/commands/m-dns.d.ts +12 -0
  122. package/esm/server/commands/m-dns.d.ts.map +1 -0
  123. package/esm/server/commands/m-dns.js +38 -0
  124. package/esm/server/commands/m-dns.js.map +1 -0
  125. package/esm/server/commands/wireless.d.ts +27 -0
  126. package/esm/server/commands/wireless.d.ts.map +1 -0
  127. package/esm/server/commands/wireless.js +82 -0
  128. package/esm/server/commands/wireless.js.map +1 -0
  129. package/esm/server/observer.d.ts +2 -1
  130. package/esm/server/observer.d.ts.map +1 -1
  131. package/esm/server/observer.js +69 -47
  132. package/esm/server/observer.js.map +1 -1
  133. package/esm/server/stream.d.ts +1 -1
  134. package/esm/server/transport.d.ts.map +1 -1
  135. package/esm/server/transport.js +2 -2
  136. package/esm/server/transport.js.map +1 -1
  137. package/package.json +8 -8
  138. package/src/adb.ts +29 -28
  139. package/src/banner.ts +4 -4
  140. package/src/commands/base.ts +6 -3
  141. package/src/commands/power.ts +6 -6
  142. package/src/commands/reverse.ts +9 -12
  143. package/src/commands/subprocess/index.ts +3 -2
  144. package/src/commands/subprocess/none/index.ts +4 -0
  145. package/src/commands/subprocess/none/process.ts +56 -0
  146. package/src/commands/subprocess/none/pty.ts +45 -0
  147. package/src/commands/subprocess/none/service.ts +42 -0
  148. package/src/commands/subprocess/none/spawner.ts +68 -0
  149. package/src/commands/subprocess/pty.ts +15 -0
  150. package/src/commands/subprocess/service.ts +32 -0
  151. package/src/commands/subprocess/shell/index.ts +5 -0
  152. package/src/commands/subprocess/shell/process.ts +127 -0
  153. package/src/commands/subprocess/shell/pty.ts +112 -0
  154. package/src/commands/subprocess/shell/service.ts +58 -0
  155. package/src/commands/subprocess/shell/shared.ts +25 -0
  156. package/src/commands/subprocess/shell/spawner.ts +90 -0
  157. package/src/commands/subprocess/utils.ts +41 -0
  158. package/src/commands/sync/list.ts +7 -17
  159. package/src/commands/sync/pull.ts +2 -8
  160. package/src/commands/sync/response.ts +6 -4
  161. package/src/commands/sync/sync.ts +1 -1
  162. package/src/commands/tcpip.ts +2 -2
  163. package/src/daemon/dispatcher.ts +7 -4
  164. package/src/daemon/packet.ts +4 -8
  165. package/src/daemon/socket.ts +6 -6
  166. package/src/device-observer.ts +4 -4
  167. package/src/server/client.ts +23 -142
  168. package/src/server/commands/index.ts +2 -0
  169. package/src/server/commands/m-dns.ts +43 -0
  170. package/src/server/commands/wireless.ts +94 -0
  171. package/src/server/observer.ts +94 -66
  172. package/src/server/transport.ts +21 -20
  173. package/tsconfig.build.tsbuildinfo +1 -1
  174. package/esm/commands/subprocess/command.d.ts +0 -58
  175. package/esm/commands/subprocess/command.d.ts.map +0 -1
  176. package/esm/commands/subprocess/command.js +0 -89
  177. package/esm/commands/subprocess/command.js.map +0 -1
  178. package/esm/commands/subprocess/protocols/index.d.ts +0 -4
  179. package/esm/commands/subprocess/protocols/index.d.ts.map +0 -1
  180. package/esm/commands/subprocess/protocols/index.js +0 -4
  181. package/esm/commands/subprocess/protocols/index.js.map +0 -1
  182. package/esm/commands/subprocess/protocols/none.d.ts +0 -32
  183. package/esm/commands/subprocess/protocols/none.d.ts.map +0 -1
  184. package/esm/commands/subprocess/protocols/none.js +0 -61
  185. package/esm/commands/subprocess/protocols/none.js.map +0 -1
  186. package/esm/commands/subprocess/protocols/shell.d.ts +0 -42
  187. package/esm/commands/subprocess/protocols/shell.d.ts.map +0 -1
  188. package/esm/commands/subprocess/protocols/shell.js.map +0 -1
  189. package/esm/commands/subprocess/protocols/types.d.ts +0 -49
  190. package/esm/commands/subprocess/protocols/types.d.ts.map +0 -1
  191. package/esm/commands/subprocess/protocols/types.js +0 -2
  192. package/esm/commands/subprocess/protocols/types.js.map +0 -1
  193. package/src/commands/subprocess/command.ts +0 -141
  194. package/src/commands/subprocess/protocols/index.ts +0 -3
  195. package/src/commands/subprocess/protocols/none.ts +0 -81
  196. package/src/commands/subprocess/protocols/shell.ts +0 -171
  197. package/src/commands/subprocess/protocols/types.ts +0 -63
@@ -0,0 +1,32 @@
1
+ import { AdbNoneProtocolProcessImpl } from "./process.js";
2
+ import { AdbNoneProtocolPtyProcess } from "./pty.js";
3
+ import { AdbNoneProtocolSpawner } from "./spawner.js";
4
+ export class AdbNoneProtocolSubprocessService extends AdbNoneProtocolSpawner {
5
+ #adb;
6
+ get adb() {
7
+ return this.#adb;
8
+ }
9
+ constructor(adb) {
10
+ super(async (command, signal) => {
11
+ // `shell,raw:${command}` also triggers raw mode,
12
+ // But is not supported on Android version <7.
13
+ const socket = await this.#adb.createSocket(`exec:${command.join(" ")}`);
14
+ if (signal?.aborted) {
15
+ await socket.close();
16
+ throw signal.reason;
17
+ }
18
+ return new AdbNoneProtocolProcessImpl(socket, signal);
19
+ });
20
+ this.#adb = adb;
21
+ }
22
+ async pty(command) {
23
+ if (command === undefined) {
24
+ command = "";
25
+ }
26
+ else if (Array.isArray(command)) {
27
+ command = command.join(" ");
28
+ }
29
+ return new AdbNoneProtocolPtyProcess(await this.#adb.createSocket(`shell:${command}`));
30
+ }
31
+ }
32
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/none/service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,OAAO,gCAAiC,SAAQ,sBAAsB;IAC/D,IAAI,CAAM;IACnB,IAAI,GAAG;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,YAAY,GAAQ;QAChB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5B,iDAAiD;YACjD,8CAA8C;YAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CACvC,QAAQ,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC9B,CAAC;YAEF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBAClB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM,MAAM,CAAC,MAAM,CAAC;YACxB,CAAC;YAED,OAAO,IAAI,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAA2B;QACjC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC;QACjB,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,IAAI,yBAAyB,CAChC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,OAAO,EAAE,CAAC,CACnD,CAAC;IACN,CAAC;CACJ"}
@@ -0,0 +1,19 @@
1
+ import type { MaybePromiseLike } from "@yume-chan/async";
2
+ import type { AbortSignal, MaybeConsumable, ReadableStream, WritableStream } from "@yume-chan/stream-extra";
3
+ export interface AdbNoneProtocolProcess {
4
+ get stdin(): WritableStream<MaybeConsumable<Uint8Array>>;
5
+ /**
6
+ * Mix of stdout and stderr
7
+ */
8
+ get output(): ReadableStream<Uint8Array>;
9
+ get exited(): Promise<void>;
10
+ kill(): MaybePromiseLike<void>;
11
+ }
12
+ export declare class AdbNoneProtocolSpawner {
13
+ #private;
14
+ constructor(spawn: (command: string[], signal: AbortSignal | undefined) => Promise<AdbNoneProtocolProcess>);
15
+ spawn(command: string | string[], signal?: AbortSignal): Promise<AdbNoneProtocolProcess>;
16
+ spawnWait(command: string | string[]): Promise<Uint8Array>;
17
+ spawnWaitText(command: string | string[]): Promise<string>;
18
+ }
19
+ //# sourceMappingURL=spawner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawner.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/none/spawner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,cAAc,EACjB,MAAM,yBAAyB,CAAC;AASjC,MAAM,WAAW,sBAAsB;IACnC,IAAI,KAAK,IAAI,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IAEzD;;OAEG;IACH,IAAI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IAEzC,IAAI,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,qBAAa,sBAAsB;;gBAO3B,KAAK,EAAE,CACH,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,WAAW,GAAG,SAAS,KAC9B,OAAO,CAAC,sBAAsB,CAAC;IAKxC,KAAK,CACD,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,sBAAsB,CAAC;IAU5B,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAK1D,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAMnE"}
@@ -0,0 +1,26 @@
1
+ import { ConcatBufferStream, ConcatStringStream, TextDecoderStream, } from "@yume-chan/stream-extra";
2
+ import { splitCommand } from "../utils.js";
3
+ export class AdbNoneProtocolSpawner {
4
+ #spawn;
5
+ constructor(spawn) {
6
+ this.#spawn = spawn;
7
+ }
8
+ spawn(command, signal) {
9
+ signal?.throwIfAborted();
10
+ if (typeof command === "string") {
11
+ command = splitCommand(command);
12
+ }
13
+ return this.#spawn(command, signal);
14
+ }
15
+ async spawnWait(command) {
16
+ const process = await this.spawn(command);
17
+ return await process.output.pipeThrough(new ConcatBufferStream());
18
+ }
19
+ async spawnWaitText(command) {
20
+ const process = await this.spawn(command);
21
+ return await process.output
22
+ .pipeThrough(new TextDecoderStream())
23
+ .pipeThrough(new ConcatStringStream());
24
+ }
25
+ }
26
+ //# sourceMappingURL=spawner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawner.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/none/spawner.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,MAAM,OAAO,sBAAsB;IACtB,MAAM,CAGsB;IAErC,YACI,KAGoC;QAEpC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,KAAK,CACD,OAA0B,EAC1B,MAAoB;QAEpB,MAAM,EAAE,cAAc,EAAE,CAAC;QAEzB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAA0B;QACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAA0B;QAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,MAAM,OAAO,CAAC,MAAM;aACtB,WAAW,CAAC,IAAI,iBAAiB,EAAE,CAAC;aACpC,WAAW,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAC/C,CAAC;CACJ"}
@@ -0,0 +1,10 @@
1
+ import type { MaybePromiseLike } from "@yume-chan/async";
2
+ import type { MaybeConsumable, ReadableStream, WritableStream } from "@yume-chan/stream-extra";
3
+ export interface AdbPtyProcess<TExitCode> {
4
+ get input(): WritableStream<MaybeConsumable<Uint8Array>>;
5
+ get output(): ReadableStream<Uint8Array>;
6
+ get exited(): Promise<TExitCode>;
7
+ sigint(): Promise<void>;
8
+ kill(): MaybePromiseLike<void>;
9
+ }
10
+ //# sourceMappingURL=pty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../../src/commands/subprocess/pty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EACR,eAAe,EACf,cAAc,EACd,cAAc,EACjB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,aAAa,CAAC,SAAS;IACpC,IAAI,KAAK,IAAI,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,IAAI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAEjC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;CAClC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.js","sourceRoot":"","sources":["../../../src/commands/subprocess/pty.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import type { Adb } from "../../adb.js";
2
+ import { AdbNoneProtocolSubprocessService } from "./none/index.js";
3
+ import { AdbShellProtocolSubprocessService } from "./shell/index.js";
4
+ export declare class AdbSubprocessService {
5
+ #private;
6
+ get adb(): Adb;
7
+ get noneProtocol(): AdbNoneProtocolSubprocessService;
8
+ get shellProtocol(): AdbShellProtocolSubprocessService | undefined;
9
+ constructor(adb: Adb);
10
+ }
11
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/commands/subprocess/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,OAAO,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AAErE,qBAAa,oBAAoB;;IAE7B,IAAI,GAAG,QAEN;IAGD,IAAI,YAAY,IAAI,gCAAgC,CAEnD;IAGD,IAAI,aAAa,IAAI,iCAAiC,GAAG,SAAS,CAEjE;gBAEW,GAAG,EAAE,GAAG;CASvB"}
@@ -0,0 +1,25 @@
1
+ import { AdbFeature } from "../../features.js";
2
+ import { AdbNoneProtocolSubprocessService } from "./none/index.js";
3
+ import { AdbShellProtocolSubprocessService } from "./shell/index.js";
4
+ export class AdbSubprocessService {
5
+ #adb;
6
+ get adb() {
7
+ return this.#adb;
8
+ }
9
+ #noneProtocol;
10
+ get noneProtocol() {
11
+ return this.#noneProtocol;
12
+ }
13
+ #shellProtocol;
14
+ get shellProtocol() {
15
+ return this.#shellProtocol;
16
+ }
17
+ constructor(adb) {
18
+ this.#adb = adb;
19
+ this.#noneProtocol = new AdbNoneProtocolSubprocessService(adb);
20
+ if (adb.canUseFeature(AdbFeature.ShellV2)) {
21
+ this.#shellProtocol = new AdbShellProtocolSubprocessService(adb);
22
+ }
23
+ }
24
+ }
25
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/commands/subprocess/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AAErE,MAAM,OAAO,oBAAoB;IACpB,IAAI,CAAM;IACnB,IAAI,GAAG;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAEQ,aAAa,CAAmC;IACzD,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAEQ,cAAc,CAAqC;IAC5D,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,YAAY,GAAQ;QAChB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAEhB,IAAI,CAAC,aAAa,GAAG,IAAI,gCAAgC,CAAC,GAAG,CAAC,CAAC;QAE/D,IAAI,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,cAAc,GAAG,IAAI,iCAAiC,CAAC,GAAG,CAAC,CAAC;QACrE,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,6 @@
1
+ export * from "./process.js";
2
+ export * from "./pty.js";
3
+ export * from "./service.js";
4
+ export * from "./shared.js";
5
+ export * from "./spawner.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./process.js";
2
+ export * from "./pty.js";
3
+ export * from "./service.js";
4
+ export * from "./shared.js";
5
+ export * from "./spawner.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { MaybePromiseLike } from "@yume-chan/async";
2
+ import type { AbortSignal, ReadableStream } from "@yume-chan/stream-extra";
3
+ import { MaybeConsumable, WritableStream } from "@yume-chan/stream-extra";
4
+ import type { AdbSocket } from "../../../adb.js";
5
+ import type { AdbShellProtocolProcess } from "./spawner.js";
6
+ export declare class AdbShellProtocolProcessImpl implements AdbShellProtocolProcess {
7
+ #private;
8
+ get stdin(): WritableStream<MaybeConsumable<Uint8Array<ArrayBufferLike>>>;
9
+ get stdout(): ReadableStream<Uint8Array<ArrayBufferLike>>;
10
+ get stderr(): ReadableStream<Uint8Array<ArrayBufferLike>>;
11
+ get exited(): Promise<number>;
12
+ constructor(socket: AdbSocket, signal?: AbortSignal);
13
+ kill(): MaybePromiseLike<void>;
14
+ }
15
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EACR,WAAW,EAEX,cAAc,EAEjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACH,eAAe,EAGf,cAAc,EACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE5D,qBAAa,2BAA4B,YAAW,uBAAuB;;IAKvE,IAAI,KAAK,iEAER;IAGD,IAAI,MAAM,gDAET;IAGD,IAAI,MAAM,gDAET;IAGD,IAAI,MAAM,oBAET;gBAEW,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,WAAW;IA+EnD,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC;CAGjC"}
@@ -1,40 +1,7 @@
1
1
  import { PromiseResolver } from "@yume-chan/async";
2
2
  import { MaybeConsumable, PushReadableStream, StructDeserializeStream, WritableStream, } from "@yume-chan/stream-extra";
3
- import { buffer, struct, u32, u8 } from "@yume-chan/struct";
4
- import { AdbFeature } from "../../../features.js";
5
- import { encodeUtf8 } from "../../../utils/index.js";
6
- export const AdbShellProtocolId = {
7
- Stdin: 0,
8
- Stdout: 1,
9
- Stderr: 2,
10
- Exit: 3,
11
- CloseStdin: 4,
12
- WindowSizeChange: 5,
13
- };
14
- // This packet format is used in both directions.
15
- export const AdbShellProtocolPacket = struct({
16
- id: u8(),
17
- data: buffer(u32),
18
- }, { littleEndian: true });
19
- /**
20
- * Shell v2 a.k.a Shell Protocol
21
- *
22
- * Features:
23
- * * `stderr`: Yes
24
- * * `exit` exit code: Yes
25
- * * `resize`: Yes
26
- */
27
- export class AdbSubprocessShellProtocol {
28
- static isSupported(adb) {
29
- return adb.canUseFeature(AdbFeature.ShellV2);
30
- }
31
- static async pty(adb, command) {
32
- // TODO: AdbShellSubprocessProtocol: Support setting `XTERM` environment variable
33
- return new AdbSubprocessShellProtocol(await adb.createSocket(`shell,v2,pty:${command}`));
34
- }
35
- static async raw(adb, command) {
36
- return new AdbSubprocessShellProtocol(await adb.createSocket(`shell,v2,raw:${command}`));
37
- }
3
+ import { AdbShellProtocolId, AdbShellProtocolPacket } from "./shared.js";
4
+ export class AdbShellProtocolProcessImpl {
38
5
  #socket;
39
6
  #writer;
40
7
  #stdin;
@@ -49,11 +16,11 @@ export class AdbSubprocessShellProtocol {
49
16
  get stderr() {
50
17
  return this.#stderr;
51
18
  }
52
- #exit = new PromiseResolver();
53
- get exit() {
54
- return this.#exit.promise;
19
+ #exited;
20
+ get exited() {
21
+ return this.#exited;
55
22
  }
56
- constructor(socket) {
23
+ constructor(socket, signal) {
57
24
  this.#socket = socket;
58
25
  let stdoutController;
59
26
  let stderrController;
@@ -63,13 +30,15 @@ export class AdbSubprocessShellProtocol {
63
30
  this.#stderr = new PushReadableStream((controller) => {
64
31
  stderrController = controller;
65
32
  });
33
+ const exited = new PromiseResolver();
34
+ this.#exited = exited.promise;
66
35
  socket.readable
67
36
  .pipeThrough(new StructDeserializeStream(AdbShellProtocolPacket))
68
37
  .pipeTo(new WritableStream({
69
38
  write: async (chunk) => {
70
39
  switch (chunk.id) {
71
40
  case AdbShellProtocolId.Exit:
72
- this.#exit.resolve(chunk.data[0]);
41
+ exited.resolve(chunk.data[0]);
73
42
  break;
74
43
  case AdbShellProtocolId.Stdout:
75
44
  await stdoutController.enqueue(chunk.data);
@@ -77,20 +46,33 @@ export class AdbSubprocessShellProtocol {
77
46
  case AdbShellProtocolId.Stderr:
78
47
  await stderrController.enqueue(chunk.data);
79
48
  break;
49
+ default:
50
+ // Ignore unknown messages like Google ADB does
51
+ // https://cs.android.com/android/platform/superproject/main/+/main:packages/modules/adb/daemon/shell_service.cpp;l=684;drc=61197364367c9e404c7da6900658f1b16c42d0da
52
+ break;
80
53
  }
81
54
  },
82
55
  }))
83
56
  .then(() => {
84
57
  stdoutController.close();
85
58
  stderrController.close();
86
- // If `#exit` has already resolved, this will be a no-op
87
- this.#exit.reject(new Error("Socket ended without exit message"));
59
+ // If `exited` has already settled, this will be a no-op
60
+ exited.reject(new Error("Socket ended without exit message"));
88
61
  }, (e) => {
89
62
  stdoutController.error(e);
90
63
  stderrController.error(e);
91
- // If `#exit` has already resolved, this will be a no-op
92
- this.#exit.reject(e);
64
+ // If `exited` has already settled, this will be a no-op
65
+ exited.reject(e);
93
66
  });
67
+ if (signal) {
68
+ // `signal` won't affect `this.stdout` and `this.stderr`
69
+ // So remaining data can still be read
70
+ // (call `controller.error` will discard all pending data)
71
+ signal.addEventListener("abort", () => {
72
+ exited.reject(signal.reason);
73
+ this.#socket.close();
74
+ });
75
+ }
94
76
  this.#writer = this.#socket.writable.getWriter();
95
77
  this.#stdin = new MaybeConsumable.WritableStream({
96
78
  write: async (chunk) => {
@@ -101,17 +83,8 @@ export class AdbSubprocessShellProtocol {
101
83
  },
102
84
  });
103
85
  }
104
- async resize(rows, cols) {
105
- await this.#writer.write(AdbShellProtocolPacket.serialize({
106
- id: AdbShellProtocolId.WindowSizeChange,
107
- // The "correct" format is `${rows}x${cols},${x_pixels}x${y_pixels}`
108
- // However, according to https://linux.die.net/man/4/tty_ioctl
109
- // `x_pixels` and `y_pixels` are unused, so always sending `0` should be fine.
110
- data: encodeUtf8(`${rows}x${cols},0x0\0`),
111
- }));
112
- }
113
86
  kill() {
114
87
  return this.#socket.close();
115
88
  }
116
89
  }
117
- //# sourceMappingURL=shell.js.map
90
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ReadableStream } from "@yume-chan/stream-extra";
2
+ import { MaybeConsumable, WritableStream } from "@yume-chan/stream-extra";
3
+ import type { AdbSocket } from "../../../adb.js";
4
+ import type { AdbPtyProcess } from "../pty.js";
5
+ export declare class AdbShellProtocolPtyProcess implements AdbPtyProcess<number> {
6
+ #private;
7
+ get input(): WritableStream<MaybeConsumable<Uint8Array<ArrayBufferLike>>>;
8
+ get output(): ReadableStream<Uint8Array<ArrayBufferLike>>;
9
+ get exited(): Promise<number>;
10
+ constructor(socket: AdbSocket);
11
+ resize(rows: number, cols: number): Promise<void>;
12
+ sigint(): Promise<void>;
13
+ kill(): import("@yume-chan/async").MaybePromiseLike<void>;
14
+ }
15
+ //# sourceMappingURL=pty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/pty.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAER,cAAc,EAEjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACH,eAAe,EAGf,cAAc,EACjB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/C,qBAAa,0BAA2B,YAAW,aAAa,CAAC,MAAM,CAAC;;IAKpE,IAAI,KAAK,iEAER;IAGD,IAAI,MAAM,gDAET;IAGD,IAAI,MAAM,oBAET;gBAEW,MAAM,EAAE,SAAS;IAsDvB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAYvC,MAAM;IAIN,IAAI;CAGP"}
@@ -0,0 +1,76 @@
1
+ import { PromiseResolver } from "@yume-chan/async";
2
+ import { MaybeConsumable, PushReadableStream, StructDeserializeStream, WritableStream, } from "@yume-chan/stream-extra";
3
+ import { encodeUtf8 } from "@yume-chan/struct";
4
+ import { AdbShellProtocolId, AdbShellProtocolPacket } from "./shared.js";
5
+ export class AdbShellProtocolPtyProcess {
6
+ #socket;
7
+ #writer;
8
+ #input;
9
+ get input() {
10
+ return this.#input;
11
+ }
12
+ #stdout;
13
+ get output() {
14
+ return this.#stdout;
15
+ }
16
+ #exited = new PromiseResolver();
17
+ get exited() {
18
+ return this.#exited.promise;
19
+ }
20
+ constructor(socket) {
21
+ this.#socket = socket;
22
+ let stdoutController;
23
+ this.#stdout = new PushReadableStream((controller) => {
24
+ stdoutController = controller;
25
+ });
26
+ socket.readable
27
+ .pipeThrough(new StructDeserializeStream(AdbShellProtocolPacket))
28
+ .pipeTo(new WritableStream({
29
+ write: async (chunk) => {
30
+ switch (chunk.id) {
31
+ case AdbShellProtocolId.Exit:
32
+ this.#exited.resolve(chunk.data[0]);
33
+ break;
34
+ case AdbShellProtocolId.Stdout:
35
+ await stdoutController.enqueue(chunk.data);
36
+ break;
37
+ }
38
+ },
39
+ }))
40
+ .then(() => {
41
+ stdoutController.close();
42
+ // If `#exit` has already resolved, this will be a no-op
43
+ this.#exited.reject(new Error("Socket ended without exit message"));
44
+ }, (e) => {
45
+ stdoutController.error(e);
46
+ // If `#exit` has already resolved, this will be a no-op
47
+ this.#exited.reject(e);
48
+ });
49
+ this.#writer = this.#socket.writable.getWriter();
50
+ this.#input = new MaybeConsumable.WritableStream({
51
+ write: (chunk) => this.#writeStdin(chunk),
52
+ });
53
+ }
54
+ #writeStdin(chunk) {
55
+ return this.#writer.write(AdbShellProtocolPacket.serialize({
56
+ id: AdbShellProtocolId.Stdin,
57
+ data: chunk,
58
+ }));
59
+ }
60
+ async resize(rows, cols) {
61
+ await this.#writer.write(AdbShellProtocolPacket.serialize({
62
+ id: AdbShellProtocolId.WindowSizeChange,
63
+ // The "correct" format is `${rows}x${cols},${x_pixels}x${y_pixels}`
64
+ // However, according to https://linux.die.net/man/4/tty_ioctl
65
+ // `x_pixels` and `y_pixels` are unused, so always sending `0` should be fine.
66
+ data: encodeUtf8(`${rows}x${cols},0x0\0`),
67
+ }));
68
+ }
69
+ sigint() {
70
+ return this.#writeStdin(new Uint8Array([0x03]));
71
+ }
72
+ kill() {
73
+ return this.#socket.close();
74
+ }
75
+ }
76
+ //# sourceMappingURL=pty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/pty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Adb } from "../../../adb.js";
2
+ import { AdbShellProtocolPtyProcess } from "./pty.js";
3
+ import { AdbShellProtocolSpawner } from "./spawner.js";
4
+ export declare class AdbShellProtocolSubprocessService extends AdbShellProtocolSpawner {
5
+ #private;
6
+ get adb(): Adb;
7
+ get isSupported(): boolean;
8
+ constructor(adb: Adb);
9
+ pty(options?: {
10
+ command?: string | string[] | undefined;
11
+ terminalType?: string;
12
+ }): Promise<AdbShellProtocolPtyProcess>;
13
+ }
14
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAI3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,qBAAa,iCAAkC,SAAQ,uBAAuB;;IAE1E,IAAI,GAAG,QAEN;IAED,IAAI,WAAW,YAEd;gBAEW,GAAG,EAAE,GAAG;IAgBd,GAAG,CAAC,OAAO,CAAC,EAAE;QAChB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;QACxC,YAAY,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,0BAA0B,CAAC;CAqB1C"}
@@ -0,0 +1,41 @@
1
+ import { AdbFeature } from "../../../features.js";
2
+ import { AdbShellProtocolProcessImpl } from "./process.js";
3
+ import { AdbShellProtocolPtyProcess } from "./pty.js";
4
+ import { AdbShellProtocolSpawner } from "./spawner.js";
5
+ export class AdbShellProtocolSubprocessService extends AdbShellProtocolSpawner {
6
+ #adb;
7
+ get adb() {
8
+ return this.#adb;
9
+ }
10
+ get isSupported() {
11
+ return this.#adb.canUseFeature(AdbFeature.ShellV2);
12
+ }
13
+ constructor(adb) {
14
+ super(async (command, signal) => {
15
+ const socket = await this.#adb.createSocket(`shell,v2,raw:${command.join(" ")}`);
16
+ if (signal?.aborted) {
17
+ await socket.close();
18
+ throw signal.reason;
19
+ }
20
+ return new AdbShellProtocolProcessImpl(socket, signal);
21
+ });
22
+ this.#adb = adb;
23
+ }
24
+ async pty(options) {
25
+ let service = "shell,v2,pty";
26
+ if (options?.terminalType) {
27
+ service += `,TERM=` + options.terminalType;
28
+ }
29
+ service += ":";
30
+ if (options) {
31
+ if (typeof options.command === "string") {
32
+ service += options.command;
33
+ }
34
+ else if (Array.isArray(options.command)) {
35
+ service += options.command.join(" ");
36
+ }
37
+ }
38
+ return new AdbShellProtocolPtyProcess(await this.#adb.createSocket(service));
39
+ }
40
+ }
41
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,OAAO,iCAAkC,SAAQ,uBAAuB;IACjE,IAAI,CAAM;IACnB,IAAI,GAAG;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,YAAY,GAAQ;QAChB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CACvC,gBAAgB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACtC,CAAC;YAEF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBAClB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM,MAAM,CAAC,MAAM,CAAC;YACxB,CAAC;YAED,OAAO,IAAI,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAGT;QACG,IAAI,OAAO,GAAG,cAAc,CAAC;QAE7B,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;YACxB,OAAO,IAAI,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,GAAG,CAAC;QAEf,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACtC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;YAC/B,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,0BAA0B,CACjC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CACxC,CAAC;IACN,CAAC;CACJ"}
@@ -0,0 +1,19 @@
1
+ import type { StructValue } from "@yume-chan/struct";
2
+ export declare const AdbShellProtocolId: {
3
+ readonly Stdin: 0;
4
+ readonly Stdout: 1;
5
+ readonly Stderr: 2;
6
+ readonly Exit: 3;
7
+ readonly CloseStdin: 4;
8
+ readonly WindowSizeChange: 5;
9
+ };
10
+ export type AdbShellProtocolId = (typeof AdbShellProtocolId)[keyof typeof AdbShellProtocolId];
11
+ export declare const AdbShellProtocolPacket: import("@yume-chan/struct").Struct<{
12
+ id: import("@yume-chan/struct").Field<AdbShellProtocolId, never, never, number>;
13
+ data: import("@yume-chan/struct").Field<Uint8Array<ArrayBufferLike>, string, never, Uint8Array<ArrayBufferLike>>;
14
+ }, undefined, import("@yume-chan/struct").FieldsValue<{
15
+ id: import("@yume-chan/struct").Field<AdbShellProtocolId, never, never, number>;
16
+ data: import("@yume-chan/struct").Field<Uint8Array<ArrayBufferLike>, string, never, Uint8Array<ArrayBufferLike>>;
17
+ }>>;
18
+ export type AdbShellProtocolPacket = StructValue<typeof AdbShellProtocolPacket>;
19
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,eAAO,MAAM,kBAAkB;;;;;;;CAOrB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAC1B,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAGjE,eAAO,MAAM,sBAAsB;;;;;;GAMlC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { buffer, struct, u32, u8 } from "@yume-chan/struct";
2
+ export const AdbShellProtocolId = {
3
+ Stdin: 0,
4
+ Stdout: 1,
5
+ Stderr: 2,
6
+ Exit: 3,
7
+ CloseStdin: 4,
8
+ WindowSizeChange: 5,
9
+ };
10
+ // This packet format is used in both directions.
11
+ export const AdbShellProtocolPacket = struct({
12
+ id: u8(),
13
+ data: buffer(u32),
14
+ }, { littleEndian: true });
15
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAC9B,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,UAAU,EAAE,CAAC;IACb,gBAAgB,EAAE,CAAC;CACb,CAAC;AAKX,iDAAiD;AACjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CACxC;IACI,EAAE,EAAE,EAAE,EAAsB;IAC5B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC;CACpB,EACD,EAAE,YAAY,EAAE,IAAI,EAAE,CACzB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { MaybePromiseLike } from "@yume-chan/async";
2
+ import type { AbortSignal, MaybeConsumable, ReadableStream, WritableStream } from "@yume-chan/stream-extra";
3
+ export interface AdbShellProtocolProcess {
4
+ get stdin(): WritableStream<MaybeConsumable<Uint8Array>>;
5
+ get stdout(): ReadableStream<Uint8Array>;
6
+ get stderr(): ReadableStream<Uint8Array>;
7
+ get exited(): Promise<number>;
8
+ kill(): MaybePromiseLike<void>;
9
+ }
10
+ export declare class AdbShellProtocolSpawner {
11
+ #private;
12
+ constructor(spawn: (command: string[], signal: AbortSignal | undefined) => Promise<AdbShellProtocolProcess>);
13
+ spawn(command: string | string[], signal?: AbortSignal): Promise<AdbShellProtocolProcess>;
14
+ spawnWait(command: string | string[]): Promise<AdbShellProtocolSpawner.WaitResult<Uint8Array>>;
15
+ spawnWaitText(command: string | string[]): Promise<AdbShellProtocolSpawner.WaitResult<string>>;
16
+ }
17
+ export declare namespace AdbShellProtocolSpawner {
18
+ interface WaitResult<T> {
19
+ stdout: T;
20
+ stderr: T;
21
+ exitCode: number;
22
+ }
23
+ }
24
+ //# sourceMappingURL=spawner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawner.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/spawner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,cAAc,EACjB,MAAM,yBAAyB,CAAC;AASjC,MAAM,WAAW,uBAAuB;IACpC,IAAI,KAAK,IAAI,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IAEzD,IAAI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IAEzC,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9B,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,qBAAa,uBAAuB;;gBAO5B,KAAK,EAAE,CACH,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,WAAW,GAAG,SAAS,KAC9B,OAAO,CAAC,uBAAuB,CAAC;IAKzC,KAAK,CACD,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,uBAAuB,CAAC;IAU7B,SAAS,CACX,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAC3B,OAAO,CAAC,uBAAuB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAUpD,aAAa,CACf,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAC3B,OAAO,CAAC,uBAAuB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;CAazD;AAED,yBAAiB,uBAAuB,CAAC;IACrC,UAAiB,UAAU,CAAC,CAAC;QACzB,MAAM,EAAE,CAAC,CAAC;QACV,MAAM,EAAE,CAAC,CAAC;QACV,QAAQ,EAAE,MAAM,CAAC;KACpB;CACJ"}
@@ -0,0 +1,38 @@
1
+ import { ConcatBufferStream, ConcatStringStream, TextDecoderStream, } from "@yume-chan/stream-extra";
2
+ import { splitCommand } from "../utils.js";
3
+ export class AdbShellProtocolSpawner {
4
+ #spawn;
5
+ constructor(spawn) {
6
+ this.#spawn = spawn;
7
+ }
8
+ spawn(command, signal) {
9
+ signal?.throwIfAborted();
10
+ if (typeof command === "string") {
11
+ command = splitCommand(command);
12
+ }
13
+ return this.#spawn(command, signal);
14
+ }
15
+ async spawnWait(command) {
16
+ const process = await this.spawn(command);
17
+ const [stdout, stderr, exitCode] = await Promise.all([
18
+ process.stdout.pipeThrough(new ConcatBufferStream()),
19
+ process.stderr.pipeThrough(new ConcatBufferStream()),
20
+ process.exited,
21
+ ]);
22
+ return { stdout, stderr, exitCode };
23
+ }
24
+ async spawnWaitText(command) {
25
+ const process = await this.spawn(command);
26
+ const [stdout, stderr, exitCode] = await Promise.all([
27
+ process.stdout
28
+ .pipeThrough(new TextDecoderStream())
29
+ .pipeThrough(new ConcatStringStream()),
30
+ process.stderr
31
+ .pipeThrough(new TextDecoderStream())
32
+ .pipeThrough(new ConcatStringStream()),
33
+ process.exited,
34
+ ]);
35
+ return { stdout, stderr, exitCode };
36
+ }
37
+ }
38
+ //# sourceMappingURL=spawner.js.map