@yume-chan/adb 0.0.8 → 0.0.11

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 (407) hide show
  1. package/CHANGELOG.json +49 -0
  2. package/CHANGELOG.md +30 -0
  3. package/LICENSE +21 -21
  4. package/README.md +240 -257
  5. package/esm/adb.d.ts +48 -0
  6. package/esm/adb.d.ts.map +1 -0
  7. package/esm/adb.js +141 -145
  8. package/esm/adb.js.map +1 -1
  9. package/{dts → esm}/auth.d.ts +17 -7
  10. package/esm/auth.d.ts.map +1 -0
  11. package/esm/auth.js +69 -109
  12. package/esm/auth.js.map +1 -1
  13. package/esm/backend.d.ts +9 -0
  14. package/esm/backend.d.ts.map +1 -0
  15. package/{dts → esm}/commands/base.d.ts +1 -1
  16. package/esm/commands/base.d.ts.map +1 -0
  17. package/esm/commands/base.js +1 -0
  18. package/esm/commands/base.js.map +1 -1
  19. package/{dts → esm}/commands/framebuffer.d.ts +3 -3
  20. package/esm/commands/framebuffer.d.ts.map +1 -0
  21. package/esm/commands/framebuffer.js +15 -18
  22. package/esm/commands/framebuffer.js.map +1 -1
  23. package/esm/commands/index.d.ts +9 -0
  24. package/esm/commands/index.d.ts.map +1 -0
  25. package/esm/commands/index.js +8 -8
  26. package/esm/commands/index.js.map +1 -1
  27. package/esm/commands/install.d.ts +4 -0
  28. package/esm/commands/install.d.ts.map +1 -0
  29. package/esm/commands/install.js +21 -13
  30. package/esm/commands/install.js.map +1 -1
  31. package/esm/commands/power.d.ts +23 -0
  32. package/esm/commands/power.d.ts.map +1 -0
  33. package/esm/commands/power.js +45 -0
  34. package/esm/commands/power.js.map +1 -0
  35. package/{dts → esm}/commands/reverse.d.ts +3 -3
  36. package/esm/commands/reverse.d.ts.map +1 -0
  37. package/esm/commands/reverse.js +50 -60
  38. package/esm/commands/reverse.js.map +1 -1
  39. package/esm/commands/subprocess/index.d.ts +57 -0
  40. package/esm/commands/subprocess/index.d.ts.map +1 -0
  41. package/esm/commands/subprocess/index.js +83 -0
  42. package/esm/commands/subprocess/index.js.map +1 -0
  43. package/esm/commands/subprocess/legacy.d.ts +28 -0
  44. package/esm/commands/subprocess/legacy.d.ts.map +1 -0
  45. package/esm/commands/subprocess/legacy.js +44 -0
  46. package/esm/commands/subprocess/legacy.js.map +1 -0
  47. package/esm/commands/subprocess/protocol.d.ts +38 -0
  48. package/esm/commands/subprocess/protocol.d.ts.map +1 -0
  49. package/esm/commands/subprocess/protocol.js +155 -0
  50. package/esm/commands/subprocess/protocol.js.map +1 -0
  51. package/esm/commands/subprocess/types.d.ts +47 -0
  52. package/esm/commands/subprocess/types.d.ts.map +1 -0
  53. package/esm/commands/{shell → subprocess}/types.js +0 -0
  54. package/{cjs/commands/shell → esm/commands/subprocess}/types.js.map +1 -1
  55. package/{dts/commands/shell → esm/commands/subprocess}/utils.d.ts +0 -0
  56. package/esm/commands/subprocess/utils.d.ts.map +1 -0
  57. package/esm/commands/{shell → subprocess}/utils.js +0 -0
  58. package/esm/commands/subprocess/utils.js.map +1 -0
  59. package/esm/commands/sync/index.d.ts +8 -0
  60. package/esm/commands/sync/index.d.ts.map +1 -0
  61. package/esm/commands/sync/index.js +7 -7
  62. package/esm/commands/sync/index.js.map +1 -1
  63. package/{dts → esm}/commands/sync/list.d.ts +4 -4
  64. package/esm/commands/sync/list.d.ts.map +1 -0
  65. package/esm/commands/sync/list.js +16 -19
  66. package/esm/commands/sync/list.js.map +1 -1
  67. package/esm/commands/sync/pull.d.ts +11 -0
  68. package/esm/commands/sync/pull.d.ts.map +1 -0
  69. package/esm/commands/sync/pull.js +17 -11
  70. package/esm/commands/sync/pull.js.map +1 -1
  71. package/esm/commands/sync/push.d.ts +8 -0
  72. package/esm/commands/sync/push.d.ts.map +1 -0
  73. package/esm/commands/sync/push.js +19 -37
  74. package/esm/commands/sync/push.js.map +1 -1
  75. package/{dts → esm}/commands/sync/request.d.ts +3 -3
  76. package/esm/commands/sync/request.d.ts.map +1 -0
  77. package/esm/commands/sync/request.js +24 -26
  78. package/esm/commands/sync/request.js.map +1 -1
  79. package/{dts → esm}/commands/sync/response.d.ts +3 -3
  80. package/esm/commands/sync/response.d.ts.map +1 -0
  81. package/esm/commands/sync/response.js +16 -19
  82. package/esm/commands/sync/response.js.map +1 -1
  83. package/{dts → esm}/commands/sync/stat.d.ts +4 -4
  84. package/esm/commands/sync/stat.d.ts.map +1 -0
  85. package/esm/commands/sync/stat.js +22 -27
  86. package/esm/commands/sync/stat.js.map +1 -1
  87. package/esm/commands/sync/sync.d.ts +83 -0
  88. package/esm/commands/sync/sync.d.ts.map +1 -0
  89. package/esm/commands/sync/sync.js +92 -89
  90. package/esm/commands/sync/sync.js.map +1 -1
  91. package/{dts → esm}/commands/tcpip.d.ts +1 -1
  92. package/{dts → esm}/commands/tcpip.d.ts.map +1 -1
  93. package/esm/commands/tcpip.js +14 -19
  94. package/esm/commands/tcpip.js.map +1 -1
  95. package/esm/crypto.d.ts +24 -0
  96. package/esm/crypto.d.ts.map +1 -0
  97. package/esm/crypto.js +33 -31
  98. package/esm/crypto.js.map +1 -1
  99. package/{dts → esm}/features.d.ts +0 -0
  100. package/{dts → esm}/features.d.ts.map +0 -0
  101. package/esm/features.js +1 -1
  102. package/esm/features.js.map +1 -1
  103. package/esm/index.d.ts +11 -0
  104. package/esm/index.d.ts.map +1 -0
  105. package/esm/index.js +10 -10
  106. package/esm/index.js.map +1 -1
  107. package/esm/packet.d.ts +28 -0
  108. package/esm/packet.d.ts.map +1 -0
  109. package/esm/packet.js +26 -53
  110. package/esm/packet.js.map +1 -1
  111. package/esm/socket/controller.d.ts +37 -0
  112. package/esm/socket/controller.d.ts.map +1 -0
  113. package/esm/socket/controller.js +52 -66
  114. package/esm/socket/controller.js.map +1 -1
  115. package/{dts → esm}/socket/dispatcher.d.ts +10 -23
  116. package/esm/socket/dispatcher.d.ts.map +1 -0
  117. package/esm/socket/dispatcher.js +148 -164
  118. package/esm/socket/dispatcher.js.map +1 -1
  119. package/esm/socket/index.d.ts +3 -0
  120. package/esm/socket/index.d.ts.map +1 -0
  121. package/esm/socket/index.js +2 -6
  122. package/esm/socket/index.js.map +1 -1
  123. package/esm/socket/socket.d.ts +34 -0
  124. package/esm/socket/socket.d.ts.map +1 -0
  125. package/esm/socket/socket.js +69 -14
  126. package/esm/socket/socket.js.map +1 -1
  127. package/esm/stream/buffered.d.ts +35 -0
  128. package/esm/stream/buffered.d.ts.map +1 -0
  129. package/esm/stream/buffered.js +123 -0
  130. package/esm/stream/buffered.js.map +1 -0
  131. package/esm/stream/detect.bak.d.ts +240 -0
  132. package/esm/stream/detect.bak.d.ts.map +1 -0
  133. package/esm/stream/detect.bak.js +60 -0
  134. package/esm/stream/detect.bak.js.map +1 -0
  135. package/esm/stream/detect.d.ts +18 -0
  136. package/esm/stream/detect.d.ts.map +1 -0
  137. package/esm/stream/detect.js +6 -0
  138. package/esm/stream/detect.js.map +1 -0
  139. package/esm/stream/detect.native.d.ts +240 -0
  140. package/esm/stream/detect.native.d.ts.map +1 -0
  141. package/esm/stream/detect.native.js +60 -0
  142. package/esm/stream/detect.native.js.map +1 -0
  143. package/esm/stream/detect.polyfill.d.ts +18 -0
  144. package/esm/stream/detect.polyfill.d.ts.map +1 -0
  145. package/esm/stream/detect.polyfill.js +6 -0
  146. package/esm/stream/detect.polyfill.js.map +1 -0
  147. package/esm/stream/index.d.ts +4 -0
  148. package/esm/stream/index.d.ts.map +1 -0
  149. package/esm/stream/index.js +3 -2
  150. package/esm/stream/index.js.map +1 -1
  151. package/esm/stream/transform.d.ts +98 -0
  152. package/esm/stream/transform.d.ts.map +1 -0
  153. package/esm/stream/transform.js +352 -0
  154. package/esm/stream/transform.js.map +1 -0
  155. package/{dts → esm}/utils/auto-reset-event.d.ts +1 -1
  156. package/esm/utils/auto-reset-event.d.ts.map +1 -0
  157. package/esm/utils/auto-reset-event.js +2 -1
  158. package/esm/utils/auto-reset-event.js.map +1 -1
  159. package/esm/utils/base64.d.ts +5 -0
  160. package/esm/utils/base64.d.ts.map +1 -0
  161. package/esm/utils/base64.js +116 -80
  162. package/esm/utils/base64.js.map +1 -1
  163. package/esm/utils/encoding.d.ts +3 -0
  164. package/esm/utils/encoding.d.ts.map +1 -0
  165. package/esm/utils/encoding.js +11 -0
  166. package/esm/utils/encoding.js.map +1 -0
  167. package/esm/utils/index.d.ts +4 -0
  168. package/esm/utils/index.d.ts.map +1 -0
  169. package/esm/utils/index.js +3 -4
  170. package/esm/utils/index.js.map +1 -1
  171. package/package.json +49 -50
  172. package/src/adb.ts +247 -242
  173. package/src/auth.ts +170 -156
  174. package/src/backend.ts +11 -24
  175. package/src/commands/base.ts +11 -11
  176. package/src/commands/framebuffer.ts +73 -73
  177. package/src/commands/index.ts +8 -8
  178. package/src/commands/install.ts +32 -21
  179. package/src/commands/power.ts +54 -0
  180. package/src/commands/reverse.ts +136 -133
  181. package/src/commands/subprocess/index.ts +124 -0
  182. package/src/commands/subprocess/legacy.ts +58 -0
  183. package/src/commands/subprocess/protocol.ts +185 -0
  184. package/src/commands/subprocess/types.ts +55 -0
  185. package/src/commands/{shell → subprocess}/utils.ts +20 -20
  186. package/src/commands/sync/index.ts +7 -7
  187. package/src/commands/sync/list.ts +40 -39
  188. package/src/commands/sync/pull.ts +43 -34
  189. package/src/commands/sync/push.ts +41 -46
  190. package/src/commands/sync/request.ts +49 -48
  191. package/src/commands/sync/response.ts +58 -57
  192. package/src/commands/sync/stat.ts +123 -121
  193. package/src/commands/sync/sync.ts +145 -113
  194. package/src/commands/tcpip.ts +21 -21
  195. package/src/crypto.ts +280 -280
  196. package/src/features.ts +5 -5
  197. package/src/index.ts +11 -10
  198. package/src/packet.ts +69 -89
  199. package/src/socket/dispatcher.ts +256 -269
  200. package/src/socket/index.ts +2 -6
  201. package/src/socket/socket.ts +129 -28
  202. package/src/stream/buffered.ts +147 -0
  203. package/src/stream/detect.native.ts +362 -0
  204. package/src/stream/detect.polyfill.ts +25 -0
  205. package/src/stream/detect.ts +25 -0
  206. package/src/stream/index.ts +3 -2
  207. package/src/stream/transform.ts +427 -0
  208. package/src/utils/auto-reset-event.ts +41 -41
  209. package/src/utils/base64.ts +306 -274
  210. package/src/utils/encoding.ts +13 -0
  211. package/src/utils/index.ts +3 -4
  212. package/tsconfig.build.json +3 -0
  213. package/tsconfig.build.tsbuildinfo +1 -0
  214. package/tsconfig.test.json +10 -0
  215. package/cjs/adb.js +0 -205
  216. package/cjs/adb.js.map +0 -1
  217. package/cjs/auth.js +0 -141
  218. package/cjs/auth.js.map +0 -1
  219. package/cjs/backend.js +0 -3
  220. package/cjs/backend.js.map +0 -1
  221. package/cjs/commands/base.js +0 -12
  222. package/cjs/commands/base.js.map +0 -1
  223. package/cjs/commands/demo-mode.js +0 -174
  224. package/cjs/commands/demo-mode.js.map +0 -1
  225. package/cjs/commands/framebuffer.js +0 -66
  226. package/cjs/commands/framebuffer.js.map +0 -1
  227. package/cjs/commands/index.js +0 -12
  228. package/cjs/commands/index.js.map +0 -1
  229. package/cjs/commands/install.js +0 -20
  230. package/cjs/commands/install.js.map +0 -1
  231. package/cjs/commands/reverse.js +0 -105
  232. package/cjs/commands/reverse.js.map +0 -1
  233. package/cjs/commands/shell/index.js +0 -56
  234. package/cjs/commands/shell/index.js.map +0 -1
  235. package/cjs/commands/shell/legacy.js +0 -37
  236. package/cjs/commands/shell/legacy.js.map +0 -1
  237. package/cjs/commands/shell/protocol.js +0 -83
  238. package/cjs/commands/shell/protocol.js.map +0 -1
  239. package/cjs/commands/shell/types.js +0 -3
  240. package/cjs/commands/shell/utils.js +0 -23
  241. package/cjs/commands/shell/utils.js.map +0 -1
  242. package/cjs/commands/sync/index.js +0 -11
  243. package/cjs/commands/sync/index.js.map +0 -1
  244. package/cjs/commands/sync/list.js +0 -36
  245. package/cjs/commands/sync/list.js.map +0 -1
  246. package/cjs/commands/sync/pull.js +0 -34
  247. package/cjs/commands/sync/pull.js.map +0 -1
  248. package/cjs/commands/sync/push.js +0 -49
  249. package/cjs/commands/sync/push.js.map +0 -1
  250. package/cjs/commands/sync/request.js +0 -48
  251. package/cjs/commands/sync/request.js.map +0 -1
  252. package/cjs/commands/sync/response.js +0 -53
  253. package/cjs/commands/sync/response.js.map +0 -1
  254. package/cjs/commands/sync/stat.js +0 -109
  255. package/cjs/commands/sync/stat.js.map +0 -1
  256. package/cjs/commands/sync/sync.js +0 -118
  257. package/cjs/commands/sync/sync.js.map +0 -1
  258. package/cjs/commands/tcpip.js +0 -28
  259. package/cjs/commands/tcpip.js.map +0 -1
  260. package/cjs/crypto.js +0 -231
  261. package/cjs/crypto.js.map +0 -1
  262. package/cjs/features.js +0 -10
  263. package/cjs/features.js.map +0 -1
  264. package/cjs/index.js +0 -14
  265. package/cjs/index.js.map +0 -1
  266. package/cjs/packet.js +0 -77
  267. package/cjs/packet.js.map +0 -1
  268. package/cjs/socket/close-event-emitter.js +0 -32
  269. package/cjs/socket/close-event-emitter.js.map +0 -1
  270. package/cjs/socket/controller.js +0 -84
  271. package/cjs/socket/controller.js.map +0 -1
  272. package/cjs/socket/data-event-emitter.js +0 -29
  273. package/cjs/socket/data-event-emitter.js.map +0 -1
  274. package/cjs/socket/dispatcher.js +0 -219
  275. package/cjs/socket/dispatcher.js.map +0 -1
  276. package/cjs/socket/index.js +0 -10
  277. package/cjs/socket/index.js.map +0 -1
  278. package/cjs/socket/logger.js +0 -3
  279. package/cjs/socket/logger.js.map +0 -1
  280. package/cjs/socket/socket.js +0 -24
  281. package/cjs/socket/socket.js.map +0 -1
  282. package/cjs/stream/buffered-stream.js +0 -78
  283. package/cjs/stream/buffered-stream.js.map +0 -1
  284. package/cjs/stream/index.js +0 -6
  285. package/cjs/stream/index.js.map +0 -1
  286. package/cjs/stream/stream.js +0 -45
  287. package/cjs/stream/stream.js.map +0 -1
  288. package/cjs/utils/auto-reset-event.js +0 -37
  289. package/cjs/utils/auto-reset-event.js.map +0 -1
  290. package/cjs/utils/base64.js +0 -210
  291. package/cjs/utils/base64.js.map +0 -1
  292. package/cjs/utils/chunk.js +0 -75
  293. package/cjs/utils/chunk.js.map +0 -1
  294. package/cjs/utils/event-queue.js +0 -108
  295. package/cjs/utils/event-queue.js.map +0 -1
  296. package/cjs/utils/index.js +0 -8
  297. package/cjs/utils/index.js.map +0 -1
  298. package/dts/adb.d.ts +0 -46
  299. package/dts/adb.d.ts.map +0 -1
  300. package/dts/auth.d.ts.map +0 -1
  301. package/dts/backend.d.ts +0 -15
  302. package/dts/backend.d.ts.map +0 -1
  303. package/dts/commands/base.d.ts.map +0 -1
  304. package/dts/commands/demo-mode.d.ts +0 -41
  305. package/dts/commands/demo-mode.d.ts.map +0 -1
  306. package/dts/commands/framebuffer.d.ts.map +0 -1
  307. package/dts/commands/index.d.ts +0 -9
  308. package/dts/commands/index.d.ts.map +0 -1
  309. package/dts/commands/install.d.ts +0 -3
  310. package/dts/commands/install.d.ts.map +0 -1
  311. package/dts/commands/reverse.d.ts.map +0 -1
  312. package/dts/commands/shell/index.d.ts +0 -20
  313. package/dts/commands/shell/index.d.ts.map +0 -1
  314. package/dts/commands/shell/legacy.d.ts +0 -27
  315. package/dts/commands/shell/legacy.d.ts.map +0 -1
  316. package/dts/commands/shell/protocol.d.ts +0 -37
  317. package/dts/commands/shell/protocol.d.ts.map +0 -1
  318. package/dts/commands/shell/types.d.ts +0 -15
  319. package/dts/commands/shell/types.d.ts.map +0 -1
  320. package/dts/commands/shell/utils.d.ts.map +0 -1
  321. package/dts/commands/sync/index.d.ts +0 -8
  322. package/dts/commands/sync/index.d.ts.map +0 -1
  323. package/dts/commands/sync/list.d.ts.map +0 -1
  324. package/dts/commands/sync/pull.d.ts +0 -11
  325. package/dts/commands/sync/pull.d.ts.map +0 -1
  326. package/dts/commands/sync/push.d.ts +0 -8
  327. package/dts/commands/sync/push.d.ts.map +0 -1
  328. package/dts/commands/sync/request.d.ts.map +0 -1
  329. package/dts/commands/sync/response.d.ts.map +0 -1
  330. package/dts/commands/sync/stat.d.ts.map +0 -1
  331. package/dts/commands/sync/sync.d.ts +0 -68
  332. package/dts/commands/sync/sync.d.ts.map +0 -1
  333. package/dts/crypto.d.ts +0 -17
  334. package/dts/crypto.d.ts.map +0 -1
  335. package/dts/index.d.ts +0 -11
  336. package/dts/index.d.ts.map +0 -1
  337. package/dts/packet.d.ts +0 -27
  338. package/dts/packet.d.ts.map +0 -1
  339. package/dts/socket/close-event-emitter.d.ts +0 -8
  340. package/dts/socket/close-event-emitter.d.ts.map +0 -1
  341. package/dts/socket/controller.d.ts +0 -43
  342. package/dts/socket/controller.d.ts.map +0 -1
  343. package/dts/socket/data-event-emitter.d.ts +0 -10
  344. package/dts/socket/data-event-emitter.d.ts.map +0 -1
  345. package/dts/socket/dispatcher.d.ts.map +0 -1
  346. package/dts/socket/index.d.ts +0 -7
  347. package/dts/socket/index.d.ts.map +0 -1
  348. package/dts/socket/logger.d.ts +0 -9
  349. package/dts/socket/logger.d.ts.map +0 -1
  350. package/dts/socket/socket.d.ts +0 -22
  351. package/dts/socket/socket.d.ts.map +0 -1
  352. package/dts/stream/buffered-stream.d.ts +0 -30
  353. package/dts/stream/buffered-stream.d.ts.map +0 -1
  354. package/dts/stream/index.d.ts +0 -3
  355. package/dts/stream/index.d.ts.map +0 -1
  356. package/dts/stream/stream.d.ts +0 -15
  357. package/dts/stream/stream.d.ts.map +0 -1
  358. package/dts/utils/auto-reset-event.d.ts.map +0 -1
  359. package/dts/utils/base64.d.ts +0 -7
  360. package/dts/utils/base64.d.ts.map +0 -1
  361. package/dts/utils/chunk.d.ts +0 -3
  362. package/dts/utils/chunk.d.ts.map +0 -1
  363. package/dts/utils/event-queue.d.ts +0 -35
  364. package/dts/utils/event-queue.d.ts.map +0 -1
  365. package/dts/utils/index.d.ts +0 -5
  366. package/dts/utils/index.d.ts.map +0 -1
  367. package/esm/commands/demo-mode.js +0 -170
  368. package/esm/commands/demo-mode.js.map +0 -1
  369. package/esm/commands/shell/index.js +0 -52
  370. package/esm/commands/shell/index.js.map +0 -1
  371. package/esm/commands/shell/legacy.js +0 -33
  372. package/esm/commands/shell/legacy.js.map +0 -1
  373. package/esm/commands/shell/protocol.js +0 -79
  374. package/esm/commands/shell/protocol.js.map +0 -1
  375. package/esm/commands/shell/types.js.map +0 -1
  376. package/esm/commands/shell/utils.js.map +0 -1
  377. package/esm/socket/close-event-emitter.js +0 -28
  378. package/esm/socket/close-event-emitter.js.map +0 -1
  379. package/esm/socket/data-event-emitter.js +0 -25
  380. package/esm/socket/data-event-emitter.js.map +0 -1
  381. package/esm/socket/logger.js +0 -2
  382. package/esm/socket/logger.js.map +0 -1
  383. package/esm/stream/buffered-stream.js +0 -73
  384. package/esm/stream/buffered-stream.js.map +0 -1
  385. package/esm/stream/stream.js +0 -41
  386. package/esm/stream/stream.js.map +0 -1
  387. package/esm/utils/chunk.js +0 -70
  388. package/esm/utils/chunk.js.map +0 -1
  389. package/esm/utils/event-queue.js +0 -104
  390. package/esm/utils/event-queue.js.map +0 -1
  391. package/src/commands/demo-mode.ts +0 -160
  392. package/src/commands/shell/index.ts +0 -68
  393. package/src/commands/shell/legacy.ts +0 -42
  394. package/src/commands/shell/protocol.ts +0 -94
  395. package/src/commands/shell/types.ts +0 -21
  396. package/src/socket/close-event-emitter.ts +0 -28
  397. package/src/socket/controller.ts +0 -105
  398. package/src/socket/data-event-emitter.ts +0 -27
  399. package/src/socket/logger.ts +0 -12
  400. package/src/stream/buffered-stream.ts +0 -100
  401. package/src/stream/stream.ts +0 -50
  402. package/src/utils/chunk.ts +0 -70
  403. package/src/utils/event-queue.ts +0 -145
  404. package/tsconfig.cjs.json +0 -11
  405. package/tsconfig.esm.json +0 -28
  406. package/tsconfig.esm.tsbuildinfo +0 -1305
  407. package/tsconfig.json +0 -18
package/src/adb.ts CHANGED
@@ -1,242 +1,247 @@
1
- import { PromiseResolver } from '@yume-chan/async';
2
- import { DisposableList } from '@yume-chan/event';
3
- import { AdbAuthenticationHandler, AdbCredentialStore, AdbDefaultAuthenticators } from './auth';
4
- import { AdbBackend } from './backend';
5
- import { AdbChildProcess, AdbDemoMode, AdbFrameBuffer, AdbReverseCommand, AdbSync, AdbTcpIpCommand, escapeArg, framebuffer, install } from './commands';
6
- import { AdbFeatures } from './features';
7
- import { AdbCommand } from './packet';
8
- import { AdbLogger, AdbPacketDispatcher, AdbSocket } from './socket';
9
-
10
- export enum AdbPropKey {
11
- Product = 'ro.product.name',
12
- Model = 'ro.product.model',
13
- Device = 'ro.product.device',
14
- Features = 'features',
15
- }
16
-
17
- export class Adb {
18
- private readonly _backend: AdbBackend;
19
-
20
- public get backend(): AdbBackend { return this._backend; }
21
-
22
- private readonly packetDispatcher: AdbPacketDispatcher;
23
-
24
- public get onDisconnected() { return this.backend.onDisconnected; }
25
-
26
- private _connected = false;
27
- public get connected() { return this._connected; }
28
-
29
- public get name() { return this.backend.name; }
30
-
31
- private _protocolVersion: number | undefined;
32
- public get protocolVersion() { return this._protocolVersion; }
33
-
34
- private _product: string | undefined;
35
- public get product() { return this._product; }
36
-
37
- private _model: string | undefined;
38
- public get model() { return this._model; }
39
-
40
- private _device: string | undefined;
41
- public get device() { return this._device; }
42
-
43
- private _features: AdbFeatures[] | undefined;
44
- public get features() { return this._features; }
45
-
46
- public readonly tcpip: AdbTcpIpCommand;
47
-
48
- public readonly reverse: AdbReverseCommand;
49
-
50
- public readonly demoMode: AdbDemoMode;
51
-
52
- public readonly childProcess: AdbChildProcess;
53
-
54
- public constructor(backend: AdbBackend, logger?: AdbLogger) {
55
- this._backend = backend;
56
- this.packetDispatcher = new AdbPacketDispatcher(backend, logger);
57
-
58
- this.tcpip = new AdbTcpIpCommand(this);
59
- this.reverse = new AdbReverseCommand(this.packetDispatcher);
60
- this.demoMode = new AdbDemoMode(this);
61
- this.childProcess = new AdbChildProcess(this);
62
-
63
- backend.onDisconnected(this.dispose, this);
64
- }
65
-
66
- public async connect(
67
- credentialStore: AdbCredentialStore,
68
- authenticators = AdbDefaultAuthenticators
69
- ): Promise<void> {
70
- await this.backend.connect?.();
71
- this.packetDispatcher.maxPayloadSize = 0x1000;
72
- this.packetDispatcher.calculateChecksum = true;
73
- this.packetDispatcher.appendNullToServiceString = true;
74
- this.packetDispatcher.start();
75
-
76
- const version = 0x01000001;
77
- const versionNoChecksum = 0x01000001;
78
- const maxPayloadSize = 0x100000;
79
-
80
- const features = [
81
- 'shell_v2',
82
- 'cmd',
83
- AdbFeatures.StatV2,
84
- 'ls_v2',
85
- 'fixed_push_mkdir',
86
- 'apex',
87
- 'abb',
88
- 'fixed_push_symlink_timestamp',
89
- 'abb_exec',
90
- 'remount_shell',
91
- 'track_app',
92
- 'sendrecv_v2',
93
- 'sendrecv_v2_brotli',
94
- 'sendrecv_v2_lz4',
95
- 'sendrecv_v2_zstd',
96
- 'sendrecv_v2_dry_run_send',
97
- ].join(',');
98
-
99
- const resolver = new PromiseResolver<void>();
100
- const authHandler = new AdbAuthenticationHandler(authenticators, credentialStore);
101
- const disposableList = new DisposableList();
102
- disposableList.add(this.packetDispatcher.onPacket(async (e) => {
103
- e.handled = true;
104
-
105
- const { packet } = e;
106
- try {
107
- switch (packet.command) {
108
- case AdbCommand.Connect:
109
- this.packetDispatcher.maxPayloadSize = Math.min(maxPayloadSize, packet.arg1);
110
-
111
- const finalVersion = Math.min(version, packet.arg0);
112
- this._protocolVersion = finalVersion;
113
-
114
- if (finalVersion >= versionNoChecksum) {
115
- this.packetDispatcher.calculateChecksum = false;
116
- // Android prior to 9.0.0 uses char* to parse service string
117
- // thus requires an extra null character
118
- this.packetDispatcher.appendNullToServiceString = false;
119
- }
120
-
121
- this.parseBanner(this.backend.decodeUtf8(packet.payload!));
122
- resolver.resolve();
123
- break;
124
- case AdbCommand.Auth:
125
- const authPacket = await authHandler.handle(e.packet);
126
- await this.packetDispatcher.sendPacket(authPacket);
127
- break;
128
- case AdbCommand.Close:
129
- // Last connection was interrupted
130
- // Ignore this packet, device will recover
131
- break;
132
- default:
133
- throw new Error('Device not in correct state. Reconnect your device and try again');
134
- }
135
- } catch (e) {
136
- resolver.reject(e);
137
- }
138
- }));
139
-
140
- disposableList.add(this.packetDispatcher.onError(e => {
141
- resolver.reject(e);
142
- }));
143
-
144
- // Android prior 9.0.0 requires the null character
145
- // Newer versions can also handle the null character
146
- // The terminating `;` is required in formal definition
147
- // But ADB daemon can also work without it
148
- await this.packetDispatcher.sendPacket(
149
- AdbCommand.Connect,
150
- version,
151
- maxPayloadSize,
152
- `host::features=${features};\0`
153
- );
154
-
155
- try {
156
- await resolver.promise;
157
- this._connected = true;
158
- } finally {
159
- disposableList.dispose();
160
- }
161
- }
162
-
163
- private parseBanner(banner: string): void {
164
- this._features = [];
165
-
166
- const pieces = banner.split('::');
167
- if (pieces.length > 1) {
168
- const props = pieces[1];
169
- for (const prop of props.split(';')) {
170
- if (!prop) {
171
- continue;
172
- }
173
-
174
- const keyValue = prop.split('=');
175
- if (keyValue.length !== 2) {
176
- continue;
177
- }
178
-
179
- const [key, value] = keyValue;
180
- switch (key) {
181
- case AdbPropKey.Product:
182
- this._product = value;
183
- break;
184
- case AdbPropKey.Model:
185
- this._model = value;
186
- break;
187
- case AdbPropKey.Device:
188
- this._device = value;
189
- break;
190
- case AdbPropKey.Features:
191
- this._features = value.split(',') as AdbFeatures[];
192
- break;
193
- }
194
- }
195
- }
196
- }
197
-
198
- public async getProp(key: string): Promise<string> {
199
- const output = await this.childProcess.exec('getprop', key);
200
- return output.trim();
201
- }
202
-
203
- public async rm(...filenames: string[]): Promise<string> {
204
- return await this.childProcess.exec('rm', '-rf', ...filenames.map(arg => escapeArg(arg)));
205
- }
206
-
207
- public async install(
208
- apk: ArrayLike<number> | ArrayBufferLike | AsyncIterable<ArrayBuffer>,
209
- onProgress?: (uploaded: number) => void,
210
- ): Promise<void> {
211
- return await install(this, apk, onProgress);
212
- }
213
-
214
- public async sync(): Promise<AdbSync> {
215
- const socket = await this.createSocket('sync:');
216
- return new AdbSync(this, socket);
217
- }
218
-
219
- public async framebuffer(): Promise<AdbFrameBuffer> {
220
- return framebuffer(this);
221
- }
222
-
223
- public async createSocket(service: string): Promise<AdbSocket> {
224
- return this.packetDispatcher.createSocket(service);
225
- }
226
-
227
- public async createSocketAndReadAll(service: string): Promise<string> {
228
- const socket = await this.createSocket(service);
229
- const resolver = new PromiseResolver<string>();
230
- let result = '';
231
- socket.onData(buffer => {
232
- result += this.backend.decodeUtf8(buffer);
233
- });
234
- socket.onClose(() => resolver.resolve(result));
235
- return resolver.promise;
236
- }
237
-
238
- public async dispose(): Promise<void> {
239
- this.packetDispatcher.dispose();
240
- await this.backend.dispose();
241
- }
242
- }
1
+ import { PromiseResolver } from '@yume-chan/async';
2
+ import { AdbAuthenticationHandler, AdbDefaultAuthenticators, type AdbCredentialStore } from './auth.js';
3
+ import { AdbPower, AdbReverseCommand, AdbSubprocess, AdbSync, AdbTcpIpCommand, escapeArg, framebuffer, install, type AdbFrameBuffer } from './commands/index.js';
4
+ import { AdbFeatures } from './features.js';
5
+ import { AdbCommand, AdbPacket, calculateChecksum, type AdbPacketCore, type AdbPacketInit } from './packet.js';
6
+ import { AdbPacketDispatcher, AdbSocket } from './socket/index.js';
7
+ import { AbortController, DecodeUtf8Stream, GatherStringStream, WritableStream, type ReadableWritablePair } from "./stream/index.js";
8
+ import { decodeUtf8, encodeUtf8 } from "./utils/index.js";
9
+
10
+ export enum AdbPropKey {
11
+ Product = 'ro.product.name',
12
+ Model = 'ro.product.model',
13
+ Device = 'ro.product.device',
14
+ Features = 'features',
15
+ }
16
+
17
+ export const VERSION_OMIT_CHECKSUM = 0x01000001;
18
+
19
+ export class Adb {
20
+ /**
21
+ * It's possible to call `authenticate` multiple times on a single connection,
22
+ * every time the device receives a `CNXN` packet, it resets its internal state,
23
+ * and starts a new authentication process.
24
+ */
25
+ public static async authenticate(
26
+ connection: ReadableWritablePair<AdbPacketCore, AdbPacketCore>,
27
+ credentialStore: AdbCredentialStore,
28
+ authenticators = AdbDefaultAuthenticators,
29
+ ): Promise<Adb> {
30
+ let version = 0x01000001;
31
+ let maxPayloadSize = 0x100000;
32
+
33
+ const features = [
34
+ 'shell_v2',
35
+ 'cmd',
36
+ AdbFeatures.StatV2,
37
+ 'ls_v2',
38
+ 'fixed_push_mkdir',
39
+ 'apex',
40
+ 'abb',
41
+ 'fixed_push_symlink_timestamp',
42
+ 'abb_exec',
43
+ 'remount_shell',
44
+ 'track_app',
45
+ 'sendrecv_v2',
46
+ 'sendrecv_v2_brotli',
47
+ 'sendrecv_v2_lz4',
48
+ 'sendrecv_v2_zstd',
49
+ 'sendrecv_v2_dry_run_send',
50
+ ].join(',');
51
+
52
+ const resolver = new PromiseResolver<string>();
53
+ const authHandler = new AdbAuthenticationHandler(authenticators, credentialStore);
54
+
55
+ const abortController = new AbortController();
56
+ const pipe = connection.readable
57
+ .pipeTo(new WritableStream({
58
+ async write(packet: AdbPacket) {
59
+ switch (packet.command) {
60
+ case AdbCommand.Connect:
61
+ version = Math.min(version, packet.arg0);
62
+ maxPayloadSize = Math.min(maxPayloadSize, packet.arg1);
63
+ resolver.resolve(decodeUtf8(packet.payload));
64
+ break;
65
+ case AdbCommand.Auth:
66
+ const response = await authHandler.handle(packet);
67
+ await sendPacket(response);
68
+ break;
69
+ case AdbCommand.Close:
70
+ // Last connection was interrupted
71
+ // Ignore this packet, device will recover
72
+ break;
73
+ default:
74
+ throw new Error('Device not in correct state. Reconnect your device and try again');
75
+ }
76
+ }
77
+ }), {
78
+ preventCancel: true,
79
+ signal: abortController.signal,
80
+ })
81
+ .catch((e) => { resolver.reject(e); });
82
+
83
+ const writer = connection.writable.getWriter();
84
+ async function sendPacket(init: AdbPacketCore) {
85
+ // Always send checksum in auth steps
86
+ // Because we don't know if the device will ignore it yet.
87
+ await writer.write(calculateChecksum(init));
88
+ }
89
+
90
+ await sendPacket({
91
+ command: AdbCommand.Connect,
92
+ arg0: version,
93
+ arg1: maxPayloadSize,
94
+ // The terminating `;` is required in formal definition
95
+ // But ADB daemon (all versions) can still work without it
96
+ payload: encodeUtf8(`host::features=${features};`),
97
+ });
98
+
99
+ try {
100
+ const banner = await resolver.promise;
101
+
102
+ // Stop piping before creating Adb object
103
+ // Because AdbPacketDispatcher will try to lock the streams when initializing
104
+ abortController.abort();
105
+ await pipe;
106
+
107
+ writer.releaseLock();
108
+
109
+ return new Adb(
110
+ connection,
111
+ version,
112
+ maxPayloadSize,
113
+ banner,
114
+ );
115
+ } finally {
116
+ abortController.abort();
117
+ writer.releaseLock();
118
+ }
119
+ }
120
+
121
+ private readonly packetDispatcher: AdbPacketDispatcher;
122
+
123
+ public get disconnected() { return this.packetDispatcher.disconnected; }
124
+
125
+ private _protocolVersion: number | undefined;
126
+ public get protocolVersion() { return this._protocolVersion; }
127
+
128
+ private _product: string | undefined;
129
+ public get product() { return this._product; }
130
+
131
+ private _model: string | undefined;
132
+ public get model() { return this._model; }
133
+
134
+ private _device: string | undefined;
135
+ public get device() { return this._device; }
136
+
137
+ private _features: AdbFeatures[] | undefined;
138
+ public get features() { return this._features; }
139
+
140
+ public readonly subprocess: AdbSubprocess;
141
+ public readonly power: AdbPower;
142
+ public readonly reverse: AdbReverseCommand;
143
+ public readonly tcpip: AdbTcpIpCommand;
144
+
145
+ public constructor(
146
+ connection: ReadableWritablePair<AdbPacketCore, AdbPacketInit>,
147
+ version: number,
148
+ maxPayloadSize: number,
149
+ banner: string,
150
+ ) {
151
+ this.parseBanner(banner);
152
+ this.packetDispatcher = new AdbPacketDispatcher(connection);
153
+
154
+ this._protocolVersion = version;
155
+ if (version >= VERSION_OMIT_CHECKSUM) {
156
+ this.packetDispatcher.calculateChecksum = false;
157
+ // Android prior to 9.0.0 uses char* to parse service string
158
+ // thus requires an extra null character
159
+ this.packetDispatcher.appendNullToServiceString = false;
160
+ }
161
+ this.packetDispatcher.maxPayloadSize = maxPayloadSize;
162
+
163
+ this.subprocess = new AdbSubprocess(this);
164
+ this.power = new AdbPower(this);
165
+ this.reverse = new AdbReverseCommand(this.packetDispatcher);
166
+ this.tcpip = new AdbTcpIpCommand(this);
167
+ }
168
+
169
+ private parseBanner(banner: string): void {
170
+ this._features = [];
171
+
172
+ const pieces = banner.split('::');
173
+ if (pieces.length > 1) {
174
+ const props = pieces[1]!;
175
+ for (const prop of props.split(';')) {
176
+ if (!prop) {
177
+ continue;
178
+ }
179
+
180
+ const keyValue = prop.split('=');
181
+ if (keyValue.length !== 2) {
182
+ continue;
183
+ }
184
+
185
+ const [key, value] = keyValue;
186
+ switch (key) {
187
+ case AdbPropKey.Product:
188
+ this._product = value;
189
+ break;
190
+ case AdbPropKey.Model:
191
+ this._model = value;
192
+ break;
193
+ case AdbPropKey.Device:
194
+ this._device = value;
195
+ break;
196
+ case AdbPropKey.Features:
197
+ this._features = value!.split(',') as AdbFeatures[];
198
+ break;
199
+ }
200
+ }
201
+ }
202
+ }
203
+
204
+ public async getProp(key: string): Promise<string> {
205
+ const stdout = await this.subprocess.spawnAndWaitLegacy(
206
+ ['getprop', key]
207
+ );
208
+ return stdout.trim();
209
+ }
210
+
211
+ public async rm(...filenames: string[]): Promise<string> {
212
+ const stdout = await this.subprocess.spawnAndWaitLegacy(
213
+ ['rm', '-rf', ...filenames.map(arg => escapeArg(arg))],
214
+ );
215
+ return stdout;
216
+ }
217
+
218
+ public install() {
219
+ return install(this);
220
+ }
221
+
222
+ public async sync(): Promise<AdbSync> {
223
+ const socket = await this.createSocket('sync:');
224
+ return new AdbSync(this, socket);
225
+ }
226
+
227
+ public async framebuffer(): Promise<AdbFrameBuffer> {
228
+ return framebuffer(this);
229
+ }
230
+
231
+ public async createSocket(service: string): Promise<AdbSocket> {
232
+ return this.packetDispatcher.createSocket(service);
233
+ }
234
+
235
+ public async createSocketAndWait(service: string): Promise<string> {
236
+ const socket = await this.createSocket(service);
237
+ const gatherStream = new GatherStringStream();
238
+ await socket.readable
239
+ .pipeThrough(new DecodeUtf8Stream())
240
+ .pipeTo(gatherStream.writable);
241
+ return gatherStream.result;
242
+ }
243
+
244
+ public async dispose(): Promise<void> {
245
+ this.packetDispatcher.dispose();
246
+ }
247
+ }