@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
@@ -1,269 +1,256 @@
1
- import { AsyncOperationManager } from '@yume-chan/async';
2
- import { AutoDisposable, EventEmitter } from '@yume-chan/event';
3
- import { AdbBackend } from '../backend';
4
- import { AdbCommand, AdbPacket, AdbPacketInit } from '../packet';
5
- import { AutoResetEvent } from '../utils';
6
- import { AdbSocketController } from './controller';
7
- import { AdbLogger } from './logger';
8
- import { AdbSocket } from './socket';
9
-
10
- export interface AdbPacketReceivedEventArgs {
11
- handled: boolean;
12
-
13
- packet: AdbPacket;
14
- }
15
-
16
- export interface AdbIncomingSocketEventArgs {
17
- handled: boolean;
18
-
19
- packet: AdbPacket;
20
-
21
- serviceString: string;
22
-
23
- socket: AdbSocket;
24
- }
25
-
26
- const EmptyArrayBuffer = new ArrayBuffer(0);
27
-
28
- export class AdbPacketDispatcher extends AutoDisposable {
29
- // ADB socket id starts from 1
30
- // (0 means open failed)
31
- private readonly initializers = new AsyncOperationManager(1);
32
- private readonly sockets = new Map<number, AdbSocketController>();
33
- private readonly sendLock = new AutoResetEvent();
34
- private readonly logger: AdbLogger | undefined;
35
-
36
- public readonly backend: AdbBackend;
37
-
38
- public maxPayloadSize = 0;
39
- public calculateChecksum = true;
40
- public appendNullToServiceString = true;
41
-
42
- private readonly packetEvent = this.addDisposable(new EventEmitter<AdbPacketReceivedEventArgs>());
43
- public get onPacket() { return this.packetEvent.event; }
44
-
45
- private readonly incomingSocketEvent = this.addDisposable(new EventEmitter<AdbIncomingSocketEventArgs>());
46
- public get onIncomingSocket() { return this.incomingSocketEvent.event; }
47
-
48
- private readonly errorEvent = this.addDisposable(new EventEmitter<Error>());
49
- public get onError() { return this.errorEvent.event; }
50
-
51
- private _running = false;
52
- public get running() { return this._running; }
53
-
54
- public constructor(backend: AdbBackend, logger?: AdbLogger) {
55
- super();
56
-
57
- this.backend = backend;
58
- this.logger = logger;
59
- }
60
-
61
- private async receiveLoop() {
62
- try {
63
- while (this._running) {
64
- const packet = await AdbPacket.read(this.backend);
65
- this.logger?.onIncomingPacket?.(packet);
66
-
67
- switch (packet.command) {
68
- case AdbCommand.OK:
69
- this.handleOk(packet);
70
- continue;
71
- case AdbCommand.Close:
72
- await this.handleClose(packet);
73
- continue;
74
- case AdbCommand.Write:
75
- if (this.sockets.has(packet.arg1)) {
76
- await this.sockets.get(packet.arg1)!.dataEvent.fire(packet.payload!);
77
- await this.sendPacket(AdbCommand.OK, packet.arg1, packet.arg0);
78
- }
79
-
80
- // Maybe the device is responding to a packet of last connection
81
- // Just ignore it
82
- continue;
83
- case AdbCommand.Open:
84
- await this.handleOpen(packet);
85
- continue;
86
- }
87
-
88
- const args: AdbPacketReceivedEventArgs = {
89
- handled: false,
90
- packet,
91
- };
92
- this.packetEvent.fire(args);
93
- if (!args.handled) {
94
- this.dispose();
95
- throw new Error(`Unhandled packet with command '${packet.command}'`);
96
- }
97
- }
98
- } catch (e) {
99
- if (!this._running) {
100
- // ignore error
101
- return;
102
- }
103
-
104
- this.errorEvent.fire(e);
105
- }
106
- }
107
-
108
- private handleOk(packet: AdbPacket) {
109
- if (this.initializers.resolve(packet.arg1, packet.arg0)) {
110
- // Device successfully created the socket
111
- return;
112
- }
113
-
114
- const socket = this.sockets.get(packet.arg1);
115
- if (socket) {
116
- // Device has received last `WRTE` to the socket
117
- socket.ack();
118
- return;
119
- }
120
-
121
- // Maybe the device is responding to a packet of last connection
122
- // Tell the device to close the socket
123
- this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0);
124
- }
125
-
126
- private async handleClose(packet: AdbPacket) {
127
- // From https://android.googlesource.com/platform/packages/modules/adb/+/65d18e2c1cc48b585811954892311b28a4c3d188/adb.cpp#459
128
- /* According to protocol.txt, p->msg.arg0 might be 0 to indicate
129
- * a failed OPEN only. However, due to a bug in previous ADB
130
- * versions, CLOSE(0, remote-id, "") was also used for normal
131
- * CLOSE() operations.
132
- */
133
-
134
- // So don't return if `reject` didn't find a pending socket
135
- if (packet.arg0 === 0 &&
136
- this.initializers.reject(packet.arg1, new Error('Socket open failed'))) {
137
- // Device failed to create the socket
138
- return;
139
- }
140
-
141
- const socket = this.sockets.get(packet.arg1);
142
- if (socket) {
143
- // The device want to close the socket
144
- if (!socket.closed) {
145
- await this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0);
146
- }
147
- socket.dispose();
148
- this.sockets.delete(packet.arg1);
149
- return;
150
- }
151
-
152
- // Maybe the device is responding to a packet of last connection
153
- // Just ignore it
154
- }
155
-
156
- private async handleOpen(packet: AdbPacket) {
157
- // AsyncOperationManager doesn't support get and skip an ID
158
- // Use `add` + `resolve` to simulate this behavior
159
- const [localId] = this.initializers.add<number>();
160
- this.initializers.resolve(localId, undefined);
161
-
162
- const remoteId = packet.arg0;
163
- const serviceString = this.backend.decodeUtf8(packet.payload!);
164
-
165
- const controller = new AdbSocketController({
166
- dispatcher: this,
167
- localId,
168
- remoteId,
169
- localCreated: false,
170
- serviceString,
171
- });
172
- const socket = new AdbSocket(controller);
173
-
174
- const args: AdbIncomingSocketEventArgs = {
175
- handled: false,
176
- packet,
177
- serviceString,
178
- socket,
179
- };
180
- this.incomingSocketEvent.fire(args);
181
-
182
- if (args.handled) {
183
- this.sockets.set(localId, controller);
184
- await this.sendPacket(AdbCommand.OK, localId, remoteId);
185
- } else {
186
- await this.sendPacket(AdbCommand.Close, 0, remoteId);
187
- }
188
- }
189
-
190
- public start() {
191
- this._running = true;
192
- this.receiveLoop();
193
- }
194
-
195
- public async createSocket(serviceString: string): Promise<AdbSocket> {
196
- if (this.appendNullToServiceString) {
197
- serviceString += '\0';
198
- }
199
-
200
- const [localId, initializer] = this.initializers.add<number>();
201
- await this.sendPacket(AdbCommand.Open, localId, 0, serviceString);
202
-
203
- const remoteId = await initializer;
204
- const controller = new AdbSocketController({
205
- dispatcher: this,
206
- localId,
207
- remoteId,
208
- localCreated: true,
209
- serviceString,
210
- });
211
- this.sockets.set(controller.localId, controller);
212
-
213
- return new AdbSocket(controller);
214
- }
215
-
216
- public sendPacket(packet: AdbPacketInit): Promise<void>;
217
- public sendPacket(
218
- command: AdbCommand,
219
- arg0: number,
220
- arg1: number,
221
- payload?: string | ArrayBuffer
222
- ): Promise<void>;
223
- public async sendPacket(
224
- packetOrCommand: AdbPacketInit | AdbCommand,
225
- arg0?: number,
226
- arg1?: number,
227
- payload: string | ArrayBuffer = EmptyArrayBuffer,
228
- ): Promise<void> {
229
- let init: AdbPacketInit;
230
- if (arg0 === undefined) {
231
- init = packetOrCommand as AdbPacketInit;
232
- } else {
233
- init = {
234
- command: packetOrCommand as AdbCommand,
235
- arg0: arg0 as number,
236
- arg1: arg1 as number,
237
- payload: typeof payload === 'string' ? this.backend.encodeUtf8(payload) : payload,
238
- };
239
- }
240
-
241
- if (init.payload &&
242
- init.payload.byteLength > this.maxPayloadSize) {
243
- throw new Error('payload too large');
244
- }
245
-
246
- try {
247
- // `AdbPacket.write` writes each packet in two parts
248
- // Use a lock to prevent packets been interlaced
249
- await this.sendLock.wait();
250
-
251
- this.logger?.onOutgoingPacket?.(init);
252
-
253
- await AdbPacket.write(init, this.calculateChecksum, this.backend);
254
- } finally {
255
- this.sendLock.notify();
256
- }
257
- }
258
-
259
- public dispose() {
260
- this._running = false;
261
-
262
- for (const socket of this.sockets.values()) {
263
- socket.dispose();
264
- }
265
- this.sockets.clear();
266
-
267
- super.dispose();
268
- }
269
- }
1
+ import { AsyncOperationManager, PromiseResolver } from '@yume-chan/async';
2
+ import { AutoDisposable, EventEmitter } from '@yume-chan/event';
3
+ import { AdbCommand, calculateChecksum, type AdbPacketCore, type AdbPacketInit } from '../packet.js';
4
+ import { AbortController, WritableStream, WritableStreamDefaultWriter, type ReadableWritablePair } from '../stream/index.js';
5
+ import { decodeUtf8, encodeUtf8 } from '../utils/index.js';
6
+ import { AdbSocket } from './socket.js';
7
+
8
+ export interface AdbIncomingSocketEventArgs {
9
+ handled: boolean;
10
+
11
+ packet: AdbPacketCore;
12
+
13
+ serviceString: string;
14
+
15
+ socket: AdbSocket;
16
+ }
17
+
18
+ const EmptyUint8Array = new Uint8Array(0);
19
+
20
+ export class AdbPacketDispatcher extends AutoDisposable {
21
+ // ADB socket id starts from 1
22
+ // (0 means open failed)
23
+ private readonly initializers = new AsyncOperationManager(1);
24
+ private readonly sockets = new Map<number, AdbSocket>();
25
+
26
+ private _writer!: WritableStreamDefaultWriter<AdbPacketInit>;
27
+
28
+ public maxPayloadSize = 0;
29
+ public calculateChecksum = true;
30
+ public appendNullToServiceString = true;
31
+
32
+ private _disconnected = new PromiseResolver<void>();
33
+ public get disconnected() { return this._disconnected.promise; }
34
+
35
+ private readonly incomingSocketEvent = this.addDisposable(new EventEmitter<AdbIncomingSocketEventArgs>());
36
+ public get onIncomingSocket() { return this.incomingSocketEvent.event; }
37
+
38
+ private readonly errorEvent = this.addDisposable(new EventEmitter<Error>());
39
+ public get onError() { return this.errorEvent.event; }
40
+
41
+ private _abortController = new AbortController();
42
+
43
+ public constructor(
44
+ connection: ReadableWritablePair<AdbPacketCore, AdbPacketInit>,
45
+ ) {
46
+ super();
47
+
48
+ connection.readable
49
+ .pipeTo(new WritableStream({
50
+ write: async (packet) => {
51
+ try {
52
+ switch (packet.command) {
53
+ case AdbCommand.OK:
54
+ this.handleOk(packet);
55
+ return;
56
+ case AdbCommand.Close:
57
+ await this.handleClose(packet);
58
+ return;
59
+ case AdbCommand.Write:
60
+ if (this.sockets.has(packet.arg1)) {
61
+ await this.sockets.get(packet.arg1)!.enqueue(packet.payload);
62
+ await this.sendPacket(AdbCommand.OK, packet.arg1, packet.arg0);
63
+ }
64
+
65
+ // Maybe the device is responding to a packet of last connection
66
+ // Just ignore it
67
+ return;
68
+ case AdbCommand.Open:
69
+ await this.handleOpen(packet);
70
+ return;
71
+ }
72
+ } catch (e) {
73
+ this.errorEvent.fire(e as Error);
74
+
75
+ // Throw error here will stop the pipe
76
+ // But won't close `readable` because of `preventCancel: true`
77
+ throw e;
78
+ }
79
+ },
80
+ }), {
81
+ preventCancel: false,
82
+ signal: this._abortController.signal,
83
+ })
84
+ .then(() => {
85
+ this.dispose();
86
+ }, () => {
87
+ // TODO: AdbPacketDispatcher: reject `_disconnected` when pipe errored?
88
+ this.dispose();
89
+ });
90
+
91
+ this._writer = connection.writable.getWriter();
92
+ }
93
+
94
+ private handleOk(packet: AdbPacketCore) {
95
+ if (this.initializers.resolve(packet.arg1, packet.arg0)) {
96
+ // Device successfully created the socket
97
+ return;
98
+ }
99
+
100
+ const socket = this.sockets.get(packet.arg1);
101
+ if (socket) {
102
+ // Device has received last `WRTE` to the socket
103
+ socket.ack();
104
+ return;
105
+ }
106
+
107
+ // Maybe the device is responding to a packet of last connection
108
+ // Tell the device to close the socket
109
+ this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0);
110
+ }
111
+
112
+ private async handleClose(packet: AdbPacketCore) {
113
+ // From https://android.googlesource.com/platform/packages/modules/adb/+/65d18e2c1cc48b585811954892311b28a4c3d188/adb.cpp#459
114
+ /* According to protocol.txt, p->msg.arg0 might be 0 to indicate
115
+ * a failed OPEN only. However, due to a bug in previous ADB
116
+ * versions, CLOSE(0, remote-id, "") was also used for normal
117
+ * CLOSE() operations.
118
+ */
119
+
120
+ // So don't return if `reject` didn't find a pending socket
121
+ if (packet.arg0 === 0 &&
122
+ this.initializers.reject(packet.arg1, new Error('Socket open failed'))) {
123
+ // Device failed to create the socket
124
+ return;
125
+ }
126
+
127
+ const socket = this.sockets.get(packet.arg1);
128
+ if (socket) {
129
+ // The device want to close the socket
130
+ if (!socket.closed) {
131
+ await this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0);
132
+ }
133
+ socket.dispose();
134
+ this.sockets.delete(packet.arg1);
135
+ return;
136
+ }
137
+
138
+ // Maybe the device is responding to a packet of last connection
139
+ // Just ignore it
140
+ }
141
+
142
+ private async handleOpen(packet: AdbPacketCore) {
143
+ // AsyncOperationManager doesn't support get and skip an ID
144
+ // Use `add` + `resolve` to simulate this behavior
145
+ const [localId] = this.initializers.add<number>();
146
+ this.initializers.resolve(localId, undefined);
147
+
148
+ const remoteId = packet.arg0;
149
+ const serviceString = decodeUtf8(packet.payload);
150
+
151
+ const socket = new AdbSocket({
152
+ dispatcher: this,
153
+ localId,
154
+ remoteId,
155
+ localCreated: false,
156
+ serviceString,
157
+ });
158
+
159
+ const args: AdbIncomingSocketEventArgs = {
160
+ handled: false,
161
+ packet,
162
+ serviceString,
163
+ socket,
164
+ };
165
+ this.incomingSocketEvent.fire(args);
166
+
167
+ if (args.handled) {
168
+ this.sockets.set(localId, socket);
169
+ await this.sendPacket(AdbCommand.OK, localId, remoteId);
170
+ } else {
171
+ await this.sendPacket(AdbCommand.Close, 0, remoteId);
172
+ }
173
+ }
174
+
175
+ public async createSocket(serviceString: string): Promise<AdbSocket> {
176
+ if (this.appendNullToServiceString) {
177
+ serviceString += '\0';
178
+ }
179
+
180
+ const [localId, initializer] = this.initializers.add<number>();
181
+ await this.sendPacket(AdbCommand.Open, localId, 0, serviceString);
182
+
183
+ const remoteId = await initializer;
184
+ const socket = new AdbSocket({
185
+ dispatcher: this,
186
+ localId,
187
+ remoteId,
188
+ localCreated: true,
189
+ serviceString,
190
+ });
191
+ this.sockets.set(localId, socket);
192
+
193
+ return socket;
194
+ }
195
+
196
+ public sendPacket(packet: AdbPacketInit): Promise<void>;
197
+ public sendPacket(
198
+ command: AdbCommand,
199
+ arg0: number,
200
+ arg1: number,
201
+ payload?: string | Uint8Array
202
+ ): Promise<void>;
203
+ public async sendPacket(
204
+ packetOrCommand: AdbPacketInit | AdbCommand,
205
+ arg0?: number,
206
+ arg1?: number,
207
+ payload: string | Uint8Array = EmptyUint8Array,
208
+ ): Promise<void> {
209
+ let init: AdbPacketCore;
210
+ if (arg0 === undefined) {
211
+ init = packetOrCommand as AdbPacketInit;
212
+ } else {
213
+ if (typeof payload === 'string') {
214
+ payload = encodeUtf8(payload);
215
+ }
216
+
217
+ init = {
218
+ command: packetOrCommand as AdbCommand,
219
+ arg0: arg0 as number,
220
+ arg1: arg1 as number,
221
+ payload,
222
+ };
223
+ }
224
+
225
+ if (init.payload &&
226
+ init.payload.byteLength > this.maxPayloadSize) {
227
+ throw new Error('payload too large');
228
+ }
229
+
230
+ if (this.calculateChecksum) {
231
+ calculateChecksum(init);
232
+ } else {
233
+ (init as AdbPacketInit).checksum = 0;
234
+ }
235
+
236
+ await this._writer.write(init as AdbPacketInit);
237
+ }
238
+
239
+ public override dispose() {
240
+ for (const socket of this.sockets.values()) {
241
+ socket.dispose();
242
+ }
243
+ this.sockets.clear();
244
+
245
+ try {
246
+ // Stop pipes
247
+ this._abortController.abort();
248
+ } catch { }
249
+
250
+ this._writer.releaseLock();
251
+
252
+ this._disconnected.resolve();
253
+
254
+ super.dispose();
255
+ }
256
+ }
@@ -1,6 +1,2 @@
1
- export * from './close-event-emitter';
2
- export * from './controller';
3
- export * from './data-event-emitter';
4
- export * from './dispatcher';
5
- export * from './logger';
6
- export * from './socket';
1
+ export * from './socket.js';
2
+ export * from './dispatcher.js';