@yume-chan/adb 2.6.0 → 3.0.0-beta.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 (449) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/esm/adb.d.ts +18 -15
  4. package/esm/adb.d.ts.map +1 -1
  5. package/esm/adb.js +18 -11
  6. package/esm/adb.js.map +1 -1
  7. package/esm/banner.d.ts +1 -1
  8. package/esm/banner.d.ts.map +1 -1
  9. package/esm/daemon/auth/authenticator.d.ts +28 -0
  10. package/esm/daemon/auth/authenticator.d.ts.map +1 -0
  11. package/esm/daemon/auth/authenticator.js +108 -0
  12. package/esm/daemon/auth/authenticator.js.map +1 -0
  13. package/esm/daemon/auth/index.d.ts +5 -0
  14. package/esm/daemon/auth/index.d.ts.map +1 -0
  15. package/esm/daemon/auth/index.js +5 -0
  16. package/esm/daemon/auth/index.js.map +1 -0
  17. package/esm/daemon/auth/packet-processor.d.ts +42 -0
  18. package/esm/daemon/auth/packet-processor.d.ts.map +1 -0
  19. package/esm/daemon/auth/packet-processor.js +129 -0
  20. package/esm/daemon/auth/packet-processor.js.map +1 -0
  21. package/esm/daemon/auth/public-key.d.ts +8 -0
  22. package/esm/daemon/auth/public-key.d.ts.map +1 -0
  23. package/esm/daemon/auth/public-key.js +74 -0
  24. package/esm/daemon/auth/public-key.js.map +1 -0
  25. package/esm/daemon/auth/type.d.ts +5 -0
  26. package/esm/daemon/auth/type.d.ts.map +1 -0
  27. package/esm/daemon/auth/type.js +2 -0
  28. package/esm/daemon/auth/type.js.map +1 -0
  29. package/esm/daemon/crypto.d.ts +6 -5
  30. package/esm/daemon/crypto.d.ts.map +1 -1
  31. package/esm/daemon/crypto.js +23 -73
  32. package/esm/daemon/crypto.js.map +1 -1
  33. package/esm/daemon/dispatcher.d.ts +3 -3
  34. package/esm/daemon/dispatcher.d.ts.map +1 -1
  35. package/esm/daemon/dispatcher.js +11 -4
  36. package/esm/daemon/dispatcher.js.map +1 -1
  37. package/esm/daemon/index.d.ts +1 -1
  38. package/esm/daemon/index.d.ts.map +1 -1
  39. package/esm/daemon/index.js +1 -1
  40. package/esm/daemon/index.js.map +1 -1
  41. package/esm/daemon/socket.d.ts +3 -3
  42. package/esm/daemon/socket.d.ts.map +1 -1
  43. package/esm/daemon/transport.d.ts +13 -65
  44. package/esm/daemon/transport.d.ts.map +1 -1
  45. package/esm/daemon/transport.js +18 -140
  46. package/esm/daemon/transport.js.map +1 -1
  47. package/esm/device-observer.d.ts +2 -3
  48. package/esm/device-observer.d.ts.map +1 -1
  49. package/esm/features-value.d.ts +40 -0
  50. package/esm/features-value.d.ts.map +1 -0
  51. package/esm/features-value.js +46 -0
  52. package/esm/features-value.js.map +1 -0
  53. package/esm/features.d.ts +4 -12
  54. package/esm/features.d.ts.map +1 -1
  55. package/esm/features.js +27 -13
  56. package/esm/features.js.map +1 -1
  57. package/esm/index.d.ts +1 -1
  58. package/esm/index.d.ts.map +1 -1
  59. package/esm/index.js +1 -1
  60. package/esm/index.js.map +1 -1
  61. package/esm/server/client.d.ts +7 -7
  62. package/esm/server/client.d.ts.map +1 -1
  63. package/esm/server/client.js +69 -86
  64. package/esm/server/client.js.map +1 -1
  65. package/esm/server/commands/wireless.js +1 -1
  66. package/esm/server/commands/wireless.js.map +1 -1
  67. package/esm/server/{stream.d.ts → data-connection.d.ts} +5 -5
  68. package/esm/server/data-connection.d.ts.map +1 -0
  69. package/esm/server/{stream.js → data-connection.js} +4 -4
  70. package/esm/server/data-connection.js.map +1 -0
  71. package/esm/server/index.d.ts +1 -1
  72. package/esm/server/index.d.ts.map +1 -1
  73. package/esm/server/index.js +1 -1
  74. package/esm/server/index.js.map +1 -1
  75. package/esm/server/observer.d.ts.map +1 -1
  76. package/esm/server/observer.js +14 -13
  77. package/esm/server/observer.js.map +1 -1
  78. package/esm/server/transport.d.ts +4 -6
  79. package/esm/server/transport.d.ts.map +1 -1
  80. package/esm/server/transport.js +9 -24
  81. package/esm/server/transport.js.map +1 -1
  82. package/esm/service/framebuffer.d.ts.map +1 -0
  83. package/esm/service/framebuffer.js.map +1 -0
  84. package/esm/{commands → service}/index.d.ts +1 -2
  85. package/esm/service/index.d.ts.map +1 -0
  86. package/esm/{commands → service}/index.js +1 -2
  87. package/esm/service/index.js.map +1 -0
  88. package/esm/{commands → service}/power.d.ts +4 -2
  89. package/esm/service/power.d.ts.map +1 -0
  90. package/esm/{commands → service}/power.js +11 -5
  91. package/esm/service/power.js.map +1 -0
  92. package/esm/service/reverse/error.d.ts +14 -0
  93. package/esm/service/reverse/error.d.ts.map +1 -0
  94. package/esm/service/reverse/error.js +21 -0
  95. package/esm/service/reverse/error.js.map +1 -0
  96. package/esm/service/reverse/index.d.ts +3 -0
  97. package/esm/service/reverse/index.d.ts.map +1 -0
  98. package/esm/service/reverse/index.js +4 -0
  99. package/esm/service/reverse/index.js.map +1 -0
  100. package/esm/service/reverse/response.d.ts +2 -0
  101. package/esm/service/reverse/response.d.ts.map +1 -0
  102. package/esm/service/reverse/response.js +30 -0
  103. package/esm/service/reverse/response.js.map +1 -0
  104. package/esm/service/reverse/service.d.ts +59 -0
  105. package/esm/service/reverse/service.d.ts.map +1 -0
  106. package/esm/{commands/reverse.js → service/reverse/service.js} +16 -45
  107. package/esm/service/reverse/service.js.map +1 -0
  108. package/esm/{commands → service}/subprocess/index.d.ts +1 -0
  109. package/esm/service/subprocess/index.d.ts.map +1 -0
  110. package/esm/{commands → service}/subprocess/index.js +1 -0
  111. package/esm/service/subprocess/index.js.map +1 -0
  112. package/esm/service/subprocess/none/index.d.ts.map +1 -0
  113. package/esm/service/subprocess/none/index.js.map +1 -0
  114. package/esm/{commands → service}/subprocess/none/process.d.ts +2 -2
  115. package/esm/service/subprocess/none/process.d.ts.map +1 -0
  116. package/esm/service/subprocess/none/process.js.map +1 -0
  117. package/esm/{commands → service}/subprocess/none/pty.d.ts +4 -4
  118. package/esm/service/subprocess/none/pty.d.ts.map +1 -0
  119. package/esm/{commands → service}/subprocess/none/pty.js +1 -1
  120. package/esm/service/subprocess/none/pty.js.map +1 -0
  121. package/esm/service/subprocess/none/service.d.ts +10 -0
  122. package/esm/service/subprocess/none/service.d.ts.map +1 -0
  123. package/esm/service/subprocess/none/service.js +44 -0
  124. package/esm/service/subprocess/none/service.js.map +1 -0
  125. package/esm/service/subprocess/none/spawner.d.ts +15 -0
  126. package/esm/service/subprocess/none/spawner.d.ts.map +1 -0
  127. package/esm/service/subprocess/none/spawner.js +31 -0
  128. package/esm/service/subprocess/none/spawner.js.map +1 -0
  129. package/esm/{commands → service}/subprocess/pty.d.ts +1 -1
  130. package/esm/service/subprocess/pty.d.ts.map +1 -0
  131. package/esm/{commands → service}/subprocess/pty.js.map +1 -1
  132. package/esm/service/subprocess/service.d.ts.map +1 -0
  133. package/esm/{commands → service}/subprocess/service.js +1 -1
  134. package/esm/service/subprocess/service.js.map +1 -0
  135. package/esm/service/subprocess/shell/index.d.ts +5 -0
  136. package/esm/{commands/subprocess/none → service/subprocess/shell}/index.d.ts.map +1 -1
  137. package/esm/service/subprocess/shell/index.js +6 -0
  138. package/esm/{commands/subprocess/none → service/subprocess/shell}/index.js.map +1 -1
  139. package/esm/{commands → service}/subprocess/shell/process.d.ts +2 -2
  140. package/esm/service/subprocess/shell/process.d.ts.map +1 -0
  141. package/esm/{commands → service}/subprocess/shell/process.js +4 -6
  142. package/esm/service/subprocess/shell/process.js.map +1 -0
  143. package/esm/{commands → service}/subprocess/shell/pty.d.ts +4 -4
  144. package/esm/service/subprocess/shell/pty.d.ts.map +1 -0
  145. package/esm/{commands → service}/subprocess/shell/pty.js +11 -9
  146. package/esm/service/subprocess/shell/pty.js.map +1 -0
  147. package/esm/service/subprocess/shell/service.d.ts +34 -0
  148. package/esm/service/subprocess/shell/service.d.ts.map +1 -0
  149. package/esm/service/subprocess/shell/service.js +52 -0
  150. package/esm/service/subprocess/shell/service.js.map +1 -0
  151. package/esm/service/subprocess/shell/shared.d.ts +2 -0
  152. package/esm/service/subprocess/shell/shared.d.ts.map +1 -0
  153. package/esm/{commands → service}/subprocess/shell/shared.js +2 -0
  154. package/esm/service/subprocess/shell/shared.js.map +1 -0
  155. package/esm/{commands → service}/subprocess/shell/spawner.d.ts +3 -7
  156. package/esm/service/subprocess/shell/spawner.d.ts.map +1 -0
  157. package/esm/service/subprocess/shell/spawner.js +45 -0
  158. package/esm/service/subprocess/shell/spawner.js.map +1 -0
  159. package/esm/service/subprocess/types.d.ts +14 -0
  160. package/esm/service/subprocess/types.d.ts.map +1 -0
  161. package/esm/service/subprocess/types.js +2 -0
  162. package/esm/service/subprocess/types.js.map +1 -0
  163. package/esm/service/subprocess/utils.d.ts +39 -0
  164. package/esm/service/subprocess/utils.d.ts.map +1 -0
  165. package/esm/service/subprocess/utils.js +142 -0
  166. package/esm/service/subprocess/utils.js.map +1 -0
  167. package/esm/service/sync/android.d.ts +34 -0
  168. package/esm/service/sync/android.d.ts.map +1 -0
  169. package/esm/service/sync/android.js +34 -0
  170. package/esm/service/sync/android.js.map +1 -0
  171. package/esm/service/sync/compression/compression.d.ts +17 -0
  172. package/esm/service/sync/compression/compression.d.ts.map +1 -0
  173. package/esm/service/sync/compression/compression.js +92 -0
  174. package/esm/service/sync/compression/compression.js.map +1 -0
  175. package/esm/service/sync/compression/format-ns.d.ts +5 -0
  176. package/esm/service/sync/compression/format-ns.d.ts.map +1 -0
  177. package/esm/service/sync/compression/format-ns.js +5 -0
  178. package/esm/service/sync/compression/format-ns.js.map +1 -0
  179. package/esm/service/sync/compression/format.d.ts +4 -0
  180. package/esm/service/sync/compression/format.d.ts.map +1 -0
  181. package/esm/service/sync/compression/format.js +3 -0
  182. package/esm/service/sync/compression/format.js.map +1 -0
  183. package/esm/service/sync/compression/index.d.ts +2 -0
  184. package/esm/service/sync/compression/index.d.ts.map +1 -0
  185. package/esm/service/sync/compression/index.js +2 -0
  186. package/esm/service/sync/compression/index.js.map +1 -0
  187. package/esm/service/sync/id/common.d.ts +17 -0
  188. package/esm/service/sync/id/common.d.ts.map +1 -0
  189. package/esm/service/sync/id/common.js +29 -0
  190. package/esm/service/sync/id/common.js.map +1 -0
  191. package/esm/service/sync/id/index.d.ts +4 -0
  192. package/esm/service/sync/id/index.d.ts.map +1 -0
  193. package/esm/service/sync/id/index.js +6 -0
  194. package/esm/service/sync/id/index.js.map +1 -0
  195. package/esm/service/sync/id/request.d.ts +7 -0
  196. package/esm/service/sync/id/request.d.ts.map +1 -0
  197. package/esm/service/sync/id/request.js +9 -0
  198. package/esm/service/sync/id/request.js.map +1 -0
  199. package/esm/service/sync/id/response.d.ts +6 -0
  200. package/esm/service/sync/id/response.d.ts.map +1 -0
  201. package/esm/service/sync/id/response.js +8 -0
  202. package/esm/service/sync/id/response.js.map +1 -0
  203. package/esm/service/sync/index-ns.d.ts +7 -0
  204. package/esm/service/sync/index-ns.d.ts.map +1 -0
  205. package/esm/service/sync/index-ns.js +7 -0
  206. package/esm/service/sync/index-ns.js.map +1 -0
  207. package/esm/service/sync/index.d.ts +3 -0
  208. package/esm/service/sync/index.d.ts.map +1 -0
  209. package/esm/service/sync/index.js +3 -0
  210. package/esm/service/sync/index.js.map +1 -0
  211. package/esm/service/sync/request/index.d.ts +5 -0
  212. package/esm/service/sync/request/index.d.ts.map +1 -0
  213. package/esm/service/sync/request/index.js +5 -0
  214. package/esm/service/sync/request/index.js.map +1 -0
  215. package/esm/{commands/sync → service/sync/request}/list.d.ts +21 -19
  216. package/esm/service/sync/request/list.d.ts.map +1 -0
  217. package/esm/service/sync/request/list.js +77 -0
  218. package/esm/service/sync/request/list.js.map +1 -0
  219. package/esm/service/sync/request/pull.d.ts +12 -0
  220. package/esm/service/sync/request/pull.d.ts.map +1 -0
  221. package/esm/service/sync/request/pull.js +28 -0
  222. package/esm/service/sync/request/pull.js.map +1 -0
  223. package/esm/service/sync/request/push.d.ts +54 -0
  224. package/esm/service/sync/request/push.d.ts.map +1 -0
  225. package/esm/service/sync/request/push.js +95 -0
  226. package/esm/service/sync/request/push.js.map +1 -0
  227. package/esm/{commands/sync → service/sync/request}/stat.d.ts +40 -50
  228. package/esm/service/sync/request/stat.d.ts.map +1 -0
  229. package/esm/service/sync/request/stat.js +89 -0
  230. package/esm/service/sync/request/stat.js.map +1 -0
  231. package/esm/service/sync/service.d.ts +123 -0
  232. package/esm/service/sync/service.d.ts.map +1 -0
  233. package/esm/service/sync/service.js +170 -0
  234. package/esm/service/sync/service.js.map +1 -0
  235. package/esm/service/sync/socket-pool.d.ts +11 -0
  236. package/esm/service/sync/socket-pool.d.ts.map +1 -0
  237. package/esm/service/sync/socket-pool.js +80 -0
  238. package/esm/service/sync/socket-pool.js.map +1 -0
  239. package/esm/service/sync/socket.d.ts +40 -0
  240. package/esm/service/sync/socket.d.ts.map +1 -0
  241. package/esm/service/sync/socket.js +153 -0
  242. package/esm/service/sync/socket.js.map +1 -0
  243. package/esm/{commands → service}/tcpip.d.ts +4 -2
  244. package/esm/service/tcpip.d.ts.map +1 -0
  245. package/esm/{commands → service}/tcpip.js +10 -7
  246. package/esm/service/tcpip.js.map +1 -0
  247. package/esm/utils/array-buffer.d.ts.map +1 -1
  248. package/esm/utils/array-buffer.js +2 -3
  249. package/esm/utils/array-buffer.js.map +1 -1
  250. package/esm/utils/base64.d.ts.map +1 -1
  251. package/esm/utils/base64.js +22 -12
  252. package/esm/utils/base64.js.map +1 -1
  253. package/esm/utils/index.d.ts +1 -0
  254. package/esm/utils/index.d.ts.map +1 -1
  255. package/esm/utils/index.js +1 -0
  256. package/esm/utils/index.js.map +1 -1
  257. package/esm/utils/md5.d.ts +8 -0
  258. package/esm/utils/md5.d.ts.map +1 -0
  259. package/esm/utils/md5.js +149 -0
  260. package/esm/utils/md5.js.map +1 -0
  261. package/package.json +10 -10
  262. package/src/adb.ts +44 -34
  263. package/src/daemon/auth/authenticator.ts +186 -0
  264. package/src/daemon/auth/index.ts +4 -0
  265. package/src/daemon/auth/packet-processor.ts +212 -0
  266. package/src/daemon/auth/public-key.ts +112 -0
  267. package/src/daemon/auth/type.ts +5 -0
  268. package/src/daemon/crypto.ts +36 -102
  269. package/src/daemon/dispatcher.ts +15 -8
  270. package/src/daemon/index.ts +1 -1
  271. package/src/daemon/socket.ts +3 -3
  272. package/src/daemon/transport.ts +35 -253
  273. package/src/device-observer.ts +3 -3
  274. package/src/features-value.ts +47 -0
  275. package/src/features.ts +31 -14
  276. package/src/index.ts +1 -1
  277. package/src/server/client.ts +96 -94
  278. package/src/server/commands/wireless.ts +1 -1
  279. package/src/server/{stream.ts → data-connection.ts} +4 -4
  280. package/src/server/index.ts +1 -1
  281. package/src/server/observer.ts +21 -19
  282. package/src/server/transport.ts +13 -34
  283. package/src/{commands → service}/index.ts +1 -2
  284. package/src/{commands → service}/power.ts +14 -5
  285. package/src/service/reverse/error.ts +35 -0
  286. package/src/service/reverse/index.ts +3 -0
  287. package/src/service/reverse/response.ts +38 -0
  288. package/src/{commands/reverse.ts → service/reverse/service.ts} +32 -72
  289. package/src/{commands → service}/subprocess/index.ts +1 -0
  290. package/src/{commands → service}/subprocess/none/process.ts +3 -3
  291. package/src/{commands → service}/subprocess/none/pty.ts +5 -5
  292. package/src/service/subprocess/none/service.ts +57 -0
  293. package/src/service/subprocess/none/spawner.ts +81 -0
  294. package/src/{commands → service}/subprocess/pty.ts +1 -1
  295. package/src/{commands → service}/subprocess/service.ts +1 -1
  296. package/src/{commands → service}/subprocess/shell/index.ts +1 -1
  297. package/src/{commands → service}/subprocess/shell/process.ts +6 -7
  298. package/src/{commands → service}/subprocess/shell/pty.ts +15 -13
  299. package/src/service/subprocess/shell/service.ts +75 -0
  300. package/src/{commands → service}/subprocess/shell/shared.ts +5 -0
  301. package/src/service/subprocess/shell/spawner.ts +109 -0
  302. package/src/service/subprocess/types.ts +19 -0
  303. package/src/service/subprocess/utils.ts +166 -0
  304. package/src/service/sync/android.ts +43 -0
  305. package/src/service/sync/compression/compression.ts +126 -0
  306. package/src/service/sync/compression/format-ns.ts +4 -0
  307. package/src/service/sync/compression/format.ts +5 -0
  308. package/src/service/sync/compression/index.ts +1 -0
  309. package/src/service/sync/id/common.ts +33 -0
  310. package/src/service/sync/id/index.ts +7 -0
  311. package/src/service/sync/id/request.ts +12 -0
  312. package/src/service/sync/id/response.ts +11 -0
  313. package/src/service/sync/index-ns.ts +6 -0
  314. package/src/service/sync/index.ts +2 -0
  315. package/src/service/sync/request/index.ts +4 -0
  316. package/src/service/sync/request/list.ts +110 -0
  317. package/src/service/sync/request/pull.ts +49 -0
  318. package/src/service/sync/request/push.ts +184 -0
  319. package/src/service/sync/request/stat.ts +127 -0
  320. package/src/service/sync/service.ts +255 -0
  321. package/src/service/sync/socket-pool.ts +97 -0
  322. package/src/service/sync/socket.ts +201 -0
  323. package/src/{commands → service}/tcpip.ts +13 -7
  324. package/src/utils/array-buffer.ts +2 -3
  325. package/src/utils/base64.ts +24 -12
  326. package/src/utils/index.ts +1 -0
  327. package/src/utils/md5.ts +185 -0
  328. package/yume-chan-adb-3.0.0-beta.0.tgz +0 -0
  329. package/CHANGELOG.md +0 -251
  330. package/esm/commands/base.d.ts +0 -8
  331. package/esm/commands/base.d.ts.map +0 -1
  332. package/esm/commands/base.js +0 -12
  333. package/esm/commands/base.js.map +0 -1
  334. package/esm/commands/framebuffer.d.ts.map +0 -1
  335. package/esm/commands/framebuffer.js.map +0 -1
  336. package/esm/commands/index.d.ts.map +0 -1
  337. package/esm/commands/index.js.map +0 -1
  338. package/esm/commands/power.d.ts.map +0 -1
  339. package/esm/commands/power.js.map +0 -1
  340. package/esm/commands/reverse.d.ts +0 -48
  341. package/esm/commands/reverse.d.ts.map +0 -1
  342. package/esm/commands/reverse.js.map +0 -1
  343. package/esm/commands/subprocess/index.d.ts.map +0 -1
  344. package/esm/commands/subprocess/index.js.map +0 -1
  345. package/esm/commands/subprocess/none/process.d.ts.map +0 -1
  346. package/esm/commands/subprocess/none/process.js.map +0 -1
  347. package/esm/commands/subprocess/none/pty.d.ts.map +0 -1
  348. package/esm/commands/subprocess/none/pty.js.map +0 -1
  349. package/esm/commands/subprocess/none/service.d.ts +0 -10
  350. package/esm/commands/subprocess/none/service.d.ts.map +0 -1
  351. package/esm/commands/subprocess/none/service.js +0 -34
  352. package/esm/commands/subprocess/none/service.js.map +0 -1
  353. package/esm/commands/subprocess/none/spawner.d.ts +0 -19
  354. package/esm/commands/subprocess/none/spawner.d.ts.map +0 -1
  355. package/esm/commands/subprocess/none/spawner.js +0 -26
  356. package/esm/commands/subprocess/none/spawner.js.map +0 -1
  357. package/esm/commands/subprocess/pty.d.ts.map +0 -1
  358. package/esm/commands/subprocess/service.d.ts.map +0 -1
  359. package/esm/commands/subprocess/service.js.map +0 -1
  360. package/esm/commands/subprocess/shell/index.d.ts +0 -6
  361. package/esm/commands/subprocess/shell/index.d.ts.map +0 -1
  362. package/esm/commands/subprocess/shell/index.js +0 -6
  363. package/esm/commands/subprocess/shell/index.js.map +0 -1
  364. package/esm/commands/subprocess/shell/process.d.ts.map +0 -1
  365. package/esm/commands/subprocess/shell/process.js.map +0 -1
  366. package/esm/commands/subprocess/shell/pty.d.ts.map +0 -1
  367. package/esm/commands/subprocess/shell/pty.js.map +0 -1
  368. package/esm/commands/subprocess/shell/service.d.ts +0 -14
  369. package/esm/commands/subprocess/shell/service.d.ts.map +0 -1
  370. package/esm/commands/subprocess/shell/service.js +0 -41
  371. package/esm/commands/subprocess/shell/service.js.map +0 -1
  372. package/esm/commands/subprocess/shell/shared.d.ts +0 -19
  373. package/esm/commands/subprocess/shell/shared.d.ts.map +0 -1
  374. package/esm/commands/subprocess/shell/shared.js.map +0 -1
  375. package/esm/commands/subprocess/shell/spawner.d.ts.map +0 -1
  376. package/esm/commands/subprocess/shell/spawner.js +0 -38
  377. package/esm/commands/subprocess/shell/spawner.js.map +0 -1
  378. package/esm/commands/subprocess/utils.d.ts +0 -3
  379. package/esm/commands/subprocess/utils.d.ts.map +0 -1
  380. package/esm/commands/subprocess/utils.js +0 -56
  381. package/esm/commands/subprocess/utils.js.map +0 -1
  382. package/esm/commands/sync/index.d.ts +0 -9
  383. package/esm/commands/sync/index.d.ts.map +0 -1
  384. package/esm/commands/sync/index.js +0 -9
  385. package/esm/commands/sync/index.js.map +0 -1
  386. package/esm/commands/sync/list.d.ts.map +0 -1
  387. package/esm/commands/sync/list.js +0 -64
  388. package/esm/commands/sync/list.js.map +0 -1
  389. package/esm/commands/sync/pull.d.ts +0 -12
  390. package/esm/commands/sync/pull.d.ts.map +0 -1
  391. package/esm/commands/sync/pull.js +0 -33
  392. package/esm/commands/sync/pull.js.map +0 -1
  393. package/esm/commands/sync/push.d.ts +0 -61
  394. package/esm/commands/sync/push.d.ts.map +0 -1
  395. package/esm/commands/sync/push.js +0 -83
  396. package/esm/commands/sync/push.js.map +0 -1
  397. package/esm/commands/sync/request.d.ts +0 -24
  398. package/esm/commands/sync/request.d.ts.map +0 -1
  399. package/esm/commands/sync/request.js +0 -32
  400. package/esm/commands/sync/request.js.map +0 -1
  401. package/esm/commands/sync/response.d.ts +0 -28
  402. package/esm/commands/sync/response.d.ts.map +0 -1
  403. package/esm/commands/sync/response.js +0 -81
  404. package/esm/commands/sync/response.js.map +0 -1
  405. package/esm/commands/sync/socket.d.ts +0 -22
  406. package/esm/commands/sync/socket.d.ts.map +0 -1
  407. package/esm/commands/sync/socket.js +0 -78
  408. package/esm/commands/sync/socket.js.map +0 -1
  409. package/esm/commands/sync/stat.d.ts.map +0 -1
  410. package/esm/commands/sync/stat.js +0 -121
  411. package/esm/commands/sync/stat.js.map +0 -1
  412. package/esm/commands/sync/sync.d.ts +0 -82
  413. package/esm/commands/sync/sync.d.ts.map +0 -1
  414. package/esm/commands/sync/sync.js +0 -138
  415. package/esm/commands/sync/sync.js.map +0 -1
  416. package/esm/commands/tcpip.d.ts.map +0 -1
  417. package/esm/commands/tcpip.js.map +0 -1
  418. package/esm/daemon/auth.d.ts +0 -54
  419. package/esm/daemon/auth.d.ts.map +0 -1
  420. package/esm/daemon/auth.js +0 -104
  421. package/esm/daemon/auth.js.map +0 -1
  422. package/esm/server/stream.d.ts.map +0 -1
  423. package/esm/server/stream.js.map +0 -1
  424. package/src/commands/base.ts +0 -15
  425. package/src/commands/subprocess/none/service.ts +0 -45
  426. package/src/commands/subprocess/none/spawner.ts +0 -68
  427. package/src/commands/subprocess/shell/service.ts +0 -58
  428. package/src/commands/subprocess/shell/spawner.ts +0 -90
  429. package/src/commands/subprocess/utils.ts +0 -61
  430. package/src/commands/sync/index.ts +0 -8
  431. package/src/commands/sync/list.ts +0 -99
  432. package/src/commands/sync/pull.ts +0 -55
  433. package/src/commands/sync/push.ts +0 -172
  434. package/src/commands/sync/request.ts +0 -53
  435. package/src/commands/sync/response.ts +0 -105
  436. package/src/commands/sync/socket.ts +0 -109
  437. package/src/commands/sync/stat.ts +0 -177
  438. package/src/commands/sync/sync.ts +0 -175
  439. package/src/daemon/auth.ts +0 -204
  440. package/tsconfig.build.tsbuildinfo +0 -1
  441. /package/esm/{commands → service}/framebuffer.d.ts +0 -0
  442. /package/esm/{commands → service}/framebuffer.js +0 -0
  443. /package/esm/{commands → service}/subprocess/none/index.d.ts +0 -0
  444. /package/esm/{commands → service}/subprocess/none/index.js +0 -0
  445. /package/esm/{commands → service}/subprocess/none/process.js +0 -0
  446. /package/esm/{commands → service}/subprocess/pty.js +0 -0
  447. /package/esm/{commands → service}/subprocess/service.d.ts +0 -0
  448. /package/src/{commands → service}/framebuffer.ts +0 -0
  449. /package/src/{commands → service}/subprocess/none/index.ts +0 -0
@@ -48,11 +48,14 @@ export function setBigUint(
48
48
  littleEndian?: boolean,
49
49
  ) {
50
50
  if (littleEndian) {
51
+ const end = byteOffset + length;
51
52
  while (value > 0n) {
52
53
  setInt64LittleEndian(array, byteOffset, value);
53
54
  byteOffset += 8;
54
55
  value >>= 64n;
55
56
  }
57
+ // Clear the trailing bytes
58
+ array.subarray(byteOffset, end).fill(0);
56
59
  } else {
57
60
  let position = byteOffset + length - 8;
58
61
  while (value > 0n) {
@@ -60,9 +63,16 @@ export function setBigUint(
60
63
  position -= 8;
61
64
  value >>= 64n;
62
65
  }
66
+ // Clear the leading bytes
67
+ array.subarray(byteOffset, position + 8).fill(0);
63
68
  }
64
69
  }
65
70
 
71
+ export interface SimpleRsaPrivateKey {
72
+ n: bigint;
73
+ d: bigint;
74
+ }
75
+
66
76
  // These values are correct only if
67
77
  // modulus length is 2048 and
68
78
  // public exponent (e) is 65537
@@ -89,10 +99,16 @@ const RsaPrivateKeyNLength = 2048 / 8;
89
99
  const RsaPrivateKeyDOffset = 303;
90
100
  const RsaPrivateKeyDLength = 2048 / 8;
91
101
 
92
- export function rsaParsePrivateKey(key: Uint8Array): [n: bigint, d: bigint] {
102
+ export function rsaParsePrivateKey(key: Uint8Array): SimpleRsaPrivateKey {
103
+ if (key.length < RsaPrivateKeyDOffset + RsaPrivateKeyDLength) {
104
+ throw new Error(
105
+ "RSA private key is too short. Expecting a PKCS#8 formatted RSA private key with modulus length 2048 bits and public exponent 65537.",
106
+ );
107
+ }
108
+
93
109
  const n = getBigUint(key, RsaPrivateKeyNOffset, RsaPrivateKeyNLength);
94
110
  const d = getBigUint(key, RsaPrivateKeyDOffset, RsaPrivateKeyDLength);
95
- return [n, d];
111
+ return { n, d };
96
112
  }
97
113
 
98
114
  function nonNegativeMod(m: number, d: number) {
@@ -133,98 +149,6 @@ export function modInverse(a: number, m: number) {
133
149
  return nonNegativeMod(y, m);
134
150
  }
135
151
 
136
- const ModulusLengthInBytes = 2048 / 8;
137
- const ModulusLengthInWords = ModulusLengthInBytes / 4;
138
-
139
- export function adbGetPublicKeySize() {
140
- return 4 + 4 + ModulusLengthInBytes + ModulusLengthInBytes + 4;
141
- }
142
-
143
- export function adbGeneratePublicKey(
144
- privateKey: Uint8Array,
145
- ): Uint8Array<ArrayBuffer>;
146
- export function adbGeneratePublicKey(
147
- privateKey: Uint8Array,
148
- output: Uint8Array,
149
- ): number;
150
- export function adbGeneratePublicKey(
151
- privateKey: Uint8Array,
152
- output?: Uint8Array,
153
- ): Uint8Array | number {
154
- // cspell: ignore: mincrypt
155
- // Android 6 and earlier has its own encryption library called mincrypt
156
- // This is the RSA public key format used by mincrypt:
157
- // https://android.googlesource.com/platform/system/core/+/bb0c180e62703c2068a1b2c9f8ba6d634bf1553c/include/mincrypt/rsa.h#46
158
- // `n0inv` and `rr` are pre-calculated to speed up RSA operations
159
-
160
- // Android 7 switched its encryption library to BoringSSL, but still keeps the key format:
161
- // https://android.googlesource.com/platform/system/core.git/+/91784040db2b9273687f88d8b95f729d4a61ecc2/libcrypto_utils/android_pubkey.cpp#38
162
- // Except when reading a key, `n0inv` and `rr` are ignored (they are still populated when generating a key):
163
- // https://android.googlesource.com/platform/system/core.git/+/91784040db2b9273687f88d8b95f729d4a61ecc2/libcrypto_utils/android_pubkey.cpp#55
164
-
165
- // The public key is a struct (in little endian) of:
166
- //
167
- // [
168
- // modulusLengthInWords, // 32-bit integer, a "word" is 32-bit so it must be 2048 / 8 / 4
169
- // // (the comment in Android source code is incorrect saying "This must be ANDROID_PUBKEY_MODULUS_SIZE")
170
- // n0inv, // 32-bit integer, the modular inverse of (lower 32 bits of `n`)
171
- // modulus, // `n`
172
- // rr, // Montgomery parameter R^2
173
- // exponent, // 32-bit integer, must be 3 or 65537
174
- // ]
175
-
176
- let outputType: "Uint8Array" | "number";
177
- const outputLength = adbGetPublicKeySize();
178
- if (!output) {
179
- output = new Uint8Array(outputLength);
180
- outputType = "Uint8Array";
181
- } else {
182
- if (output.length < outputLength) {
183
- throw new TypeError("output buffer is too small");
184
- }
185
-
186
- outputType = "number";
187
- }
188
-
189
- const outputView = new DataView(
190
- output.buffer,
191
- output.byteOffset,
192
- output.length,
193
- );
194
- let outputOffset = 0;
195
-
196
- // modulusLengthInWords
197
- outputView.setUint32(outputOffset, ModulusLengthInWords, true);
198
- outputOffset += 4;
199
-
200
- // extract `n` from private key
201
- const [n] = rsaParsePrivateKey(privateKey);
202
-
203
- // Calculate `n0inv`
204
- const n0inv = -modInverse(Number(n % 2n ** 32n), 2 ** 32);
205
- outputView.setInt32(outputOffset, n0inv, true);
206
- outputOffset += 4;
207
-
208
- // Write `n` (a.k.a. `modulus`)
209
- setBigUint(output, outputOffset, ModulusLengthInBytes, n, true);
210
- outputOffset += ModulusLengthInBytes;
211
-
212
- // Calculate rr = (2 ** (rsa_size)) ** 2 % n
213
- const rr = 2n ** 4096n % n;
214
- setBigUint(output, outputOffset, ModulusLengthInBytes, rr, true);
215
- outputOffset += ModulusLengthInBytes;
216
-
217
- // exponent
218
- outputView.setUint32(outputOffset, 65537, true);
219
- outputOffset += 4;
220
-
221
- if (outputType === "Uint8Array") {
222
- return output;
223
- } else {
224
- return outputLength;
225
- }
226
- }
227
-
228
152
  /**
229
153
  * Modular exponentiation.
230
154
  *
@@ -283,17 +207,27 @@ export const SHA1_DIGEST_INFO = new Uint8Array([
283
207
  SHA1_DIGEST_LENGTH,
284
208
  ]);
285
209
 
286
- // SubtleCrypto.sign() will hash the given data and sign the hash
287
- // But we don't need the hashing step
288
- // (In another word, ADB just requires the client to
289
- // encrypt the given data with its private key)
290
- // However SubtileCrypto.encrypt() doesn't accept 'RSASSA-PKCS1-v1_5' algorithm
291
- // So we need to implement the encryption by ourself
210
+ // Standard `RSASSA-PKCS1-v1_5` algorithm will hash the given data
211
+ // and sign the hash
212
+ // https://datatracker.ietf.org/doc/html/rfc8017#section-8.2
213
+ //
214
+ // But ADB authentication passes 20 bytes of random value to
215
+ // OpenSSL's `RSA_sign` method which treat the input as a hash
216
+ // https://docs.openssl.org/1.0.2/man3/RSA_sign/
217
+ //
218
+ // Since it's non-standard and not supported by Web Crypto API,
219
+ // we need to implement the signing by ourself
292
220
  export function rsaSign(
293
- privateKey: Uint8Array,
221
+ privateKey: SimpleRsaPrivateKey,
294
222
  data: Uint8Array,
295
223
  ): Uint8Array<ArrayBuffer> {
296
- const [n, d] = rsaParsePrivateKey(privateKey);
224
+ if (data.length !== SHA1_DIGEST_LENGTH) {
225
+ throw new Error(
226
+ `rsaSign expects ${SHA1_DIGEST_LENGTH} bytes (SHA-1 digest length) of data but got ${data.length} bytes`,
227
+ );
228
+ }
229
+
230
+ const { n, d } = privateKey;
297
231
 
298
232
  // PKCS#1 padding
299
233
  const padded = new Uint8Array(256);
@@ -19,7 +19,7 @@ import {
19
19
  } from "@yume-chan/stream-extra";
20
20
  import { EmptyUint8Array, decodeUtf8, encodeUtf8 } from "@yume-chan/struct";
21
21
 
22
- import type { AdbIncomingSocketHandler, AdbSocket, Closeable } from "../adb.js";
22
+ import type { Adb, Closeable } from "../adb.js";
23
23
 
24
24
  import type { AdbPacketData, AdbPacketInit } from "./packet.js";
25
25
  import { AdbCommand, calculateChecksum } from "./packet.js";
@@ -114,7 +114,7 @@ export class AdbPacketDispatcher implements Closeable {
114
114
 
115
115
  readonly #incomingSocketHandlers = new Map<
116
116
  string,
117
- AdbIncomingSocketHandler
117
+ Adb.IncomingSocketHandler
118
118
  >();
119
119
  readonly #readAbortController = new AbortController();
120
120
 
@@ -146,13 +146,20 @@ export class AdbPacketDispatcher implements Closeable {
146
146
  this.#handleOkay(packet);
147
147
  break;
148
148
  case AdbCommand.Open:
149
- await this.#handleOpen(packet);
149
+ // Don't await
150
+ // The handler may take a long time to accept the socket,
151
+ // don't block other sockets' packet processing.
152
+ this.#handleOpen(packet).catch((e) => {
153
+ // Propagate fatal errors to consumer
154
+ controller.error(e);
155
+ });
150
156
  break;
151
157
  case AdbCommand.Write:
152
- // Don't await - let each socket handle its own backpressure
153
- // without blocking other sockets' packet processing.
154
- // Fatal errors are propagated via WritableStream's controller.
158
+ // Don't await
159
+ // The socket might be stalled because of backpressure,
160
+ // don't block other sockets' packet processing.
155
161
  this.#handleWrite(packet).catch((e) => {
162
+ // Propagate fatal errors to consumer
156
163
  controller.error(e);
157
164
  });
158
165
  break;
@@ -392,7 +399,7 @@ export class AdbPacketDispatcher implements Closeable {
392
399
  await Promise.race(promises);
393
400
  }
394
401
 
395
- async createSocket(service: string): Promise<AdbSocket> {
402
+ async createSocket(service: string): Promise<Adb.Socket> {
396
403
  if (this.options.appendNullToServiceString) {
397
404
  service += "\0";
398
405
  }
@@ -421,7 +428,7 @@ export class AdbPacketDispatcher implements Closeable {
421
428
  return controller.socket;
422
429
  }
423
430
 
424
- addReverseTunnel(service: string, handler: AdbIncomingSocketHandler) {
431
+ addReverseTunnel(service: string, handler: Adb.IncomingSocketHandler) {
425
432
  this.#incomingSocketHandlers.set(service, handler);
426
433
  }
427
434
 
@@ -1,4 +1,4 @@
1
- export * from "./auth.js";
1
+ export * from "./auth/index.js";
2
2
  export * from "./crypto.js";
3
3
  export * from "./device.js";
4
4
  export * from "./dispatcher.js";
@@ -9,7 +9,7 @@ import type {
9
9
  import { MaybeConsumable, PushReadableStream } from "@yume-chan/stream-extra";
10
10
  import { EmptyUint8Array } from "@yume-chan/struct";
11
11
 
12
- import type { AdbSocket } from "../adb.js";
12
+ import type { Adb } from "../adb.js";
13
13
 
14
14
  import type { AdbPacketDispatcher } from "./dispatcher.js";
15
15
  import { AdbCommand } from "./packet.js";
@@ -34,7 +34,7 @@ export interface AdbDaemonSocketInit extends AdbDaemonSocketInfo {
34
34
  }
35
35
 
36
36
  export class AdbDaemonSocketController
37
- implements AdbDaemonSocketInfo, AdbSocket, Disposable
37
+ implements AdbDaemonSocketInfo, Adb.Socket, Disposable
38
38
  {
39
39
  readonly #dispatcher!: AdbPacketDispatcher;
40
40
 
@@ -177,7 +177,7 @@ export class AdbDaemonSocketController
177
177
  /**
178
178
  * A duplex stream representing a socket to ADB daemon.
179
179
  */
180
- export class AdbDaemonSocket implements AdbDaemonSocketInfo, AdbSocket {
180
+ export class AdbDaemonSocket implements AdbDaemonSocketInfo, Adb.Socket {
181
181
  readonly #controller: AdbDaemonSocketController;
182
182
 
183
183
  get localId(): number {
@@ -1,55 +1,14 @@
1
1
  import type { MaybePromiseLike } from "@yume-chan/async";
2
- import { PromiseResolver } from "@yume-chan/async";
3
- import type { ReadableWritablePair } from "@yume-chan/stream-extra";
4
- import {
5
- AbortController,
6
- Consumable,
7
- WritableStream,
8
- } from "@yume-chan/stream-extra";
9
- import { decodeUtf8, encodeUtf8 } from "@yume-chan/struct";
2
+ import type { Consumable, ReadableWritablePair } from "@yume-chan/stream-extra";
10
3
 
11
- import type {
12
- AdbIncomingSocketHandler,
13
- AdbSocket,
14
- AdbTransport,
15
- } from "../adb.js";
4
+ import type { Adb, AdbTransport } from "../adb.js";
16
5
  import { AdbBanner } from "../banner.js";
17
- import { AdbFeature } from "../features.js";
6
+ import { AdbDeviceFeatures, AdbFeature } from "../features.js";
18
7
 
19
- import type { AdbAuthenticator, AdbCredentialStore } from "./auth.js";
20
- import {
21
- ADB_DEFAULT_AUTHENTICATORS,
22
- AdbAuthenticationProcessor,
23
- } from "./auth.js";
24
8
  import { AdbPacketDispatcher } from "./dispatcher.js";
25
9
  import type { AdbPacketData, AdbPacketInit } from "./packet.js";
26
- import { AdbCommand, calculateChecksum } from "./packet.js";
27
10
 
28
11
  export const ADB_DAEMON_VERSION_OMIT_CHECKSUM = 0x01000001;
29
- // https://android.googlesource.com/platform/packages/modules/adb/+/79010dc6d5ca7490c493df800d4421730f5466ca/transport.cpp#1252
30
- // There are some other feature constants, but some of them are only used by ADB server, not devices (daemons).
31
- export const ADB_DAEMON_DEFAULT_FEATURES = /* #__PURE__ */ (() =>
32
- [
33
- AdbFeature.ShellV2,
34
- AdbFeature.Cmd,
35
- AdbFeature.StatV2,
36
- AdbFeature.ListV2,
37
- AdbFeature.FixedPushMkdir,
38
- "apex",
39
- AdbFeature.Abb,
40
- // only tells the client the symlink timestamp issue in `adb push --sync` has been fixed.
41
- // No special handling required.
42
- "fixed_push_symlink_timestamp",
43
- AdbFeature.AbbExec,
44
- "remount_shell",
45
- "track_app",
46
- AdbFeature.SendReceiveV2,
47
- "sendrecv_v2_brotli",
48
- "sendrecv_v2_lz4",
49
- "sendrecv_v2_zstd",
50
- "sendrecv_v2_dry_run_send",
51
- AdbFeature.DelayedAck,
52
- ] as readonly AdbFeature[])();
53
12
  export const ADB_DAEMON_DEFAULT_INITIAL_PAYLOAD_SIZE = 32 * 1024 * 1024;
54
13
 
55
14
  export type AdbDaemonConnection = ReadableWritablePair<
@@ -57,55 +16,7 @@ export type AdbDaemonConnection = ReadableWritablePair<
57
16
  Consumable<AdbPacketInit>
58
17
  >;
59
18
 
60
- export interface AdbDaemonAuthenticationOptions {
61
- serial: string;
62
- connection: AdbDaemonConnection;
63
- credentialStore: AdbCredentialStore;
64
- authenticators?: readonly AdbAuthenticator[];
65
- features?: readonly AdbFeature[];
66
-
67
- /**
68
- * The number of bytes the device can send before receiving an ack packet.
69
- * Using delayed ack can improve the throughput,
70
- * especially when the device is connected over Wi-Fi (so the latency is higher).
71
- *
72
- * Set to 0 or any negative value to disable delayed ack in handshake.
73
- * Otherwise the value must be in the range of unsigned 32-bit integer.
74
- *
75
- * Delayed ack was added in Android 14,
76
- * this option will be ignored when the device doesn't support it.
77
- *
78
- * @default ADB_DAEMON_DEFAULT_INITIAL_PAYLOAD_SIZE
79
- */
80
- initialDelayedAckBytes?: number;
81
-
82
- /**
83
- * Whether to keep the `connection` open (don't call `writable.close` and `readable.cancel`)
84
- * when `AdbDaemonTransport.close` is called.
85
- *
86
- * Note that when `authenticate` fails,
87
- * no matter which value this option has,
88
- * the `connection` is always kept open, so it can be used in another `authenticate` call.
89
- *
90
- * @default false
91
- */
92
- preserveConnection?: boolean | undefined;
93
-
94
- /**
95
- * When set, the transport will throw an error when
96
- * one of the socket readable stalls for this amount of milliseconds.
97
- *
98
- * Because ADB is a multiplexed protocol, blocking one socket will also block all other sockets.
99
- * It's important to always read from all sockets to prevent stalling.
100
- *
101
- * This option is helpful to detect bugs in the client code.
102
- *
103
- * @default undefined
104
- */
105
- readTimeLimit?: number | undefined;
106
- }
107
-
108
- interface AdbDaemonSocketConnectorConstructionOptions {
19
+ export interface AdbDaemonTransportInit {
109
20
  serial: string;
110
21
  connection: AdbDaemonConnection;
111
22
  version: number;
@@ -116,16 +27,16 @@ interface AdbDaemonSocketConnectorConstructionOptions {
116
27
  /**
117
28
  * The number of bytes the device can send before receiving an ack packet.
118
29
  *
119
- * On Android 14 and newer, the Delayed Acknowledgement feature is added to
120
- * improve performance, especially for high-latency connections like ADB over Wi-Fi.
30
+ * Android 14 added the Delayed Acknowledgement feature to improve performance,
31
+ * especially for high-latency connections like ADB over Wi-Fi.
121
32
  *
122
- * When `features` doesn't include `AdbFeature.DelayedAck`, it must be set to 0. Otherwise,
123
- * the value must be in the range of unsigned 32-bit integer.
33
+ * Whether the feature is enabled is negotiated in the handshake process
34
+ * using the {@linkcode AdbFeature.DelayedAck} feature.
35
+ * If the feature is enabled, this parameter must be set to a positive integer.
124
36
  *
125
- * If the device enabled delayed ack but the client didn't, the device will throw an error
126
- * when the client sends the first data packet. And vice versa.
37
+ * If not specified, the default value is {@linkcode ADB_DAEMON_DEFAULT_INITIAL_PAYLOAD_SIZE}.
127
38
  */
128
- initialDelayedAckBytes: number;
39
+ initialDelayedAckBytes?: number | undefined;
129
40
 
130
41
  /**
131
42
  * Whether to keep the `connection` open (don't call `writable.close` and `readable.cancel`)
@@ -153,135 +64,6 @@ interface AdbDaemonSocketConnectorConstructionOptions {
153
64
  * An ADB Transport that connects to ADB Daemons directly.
154
65
  */
155
66
  export class AdbDaemonTransport implements AdbTransport {
156
- /**
157
- * Authenticate with the ADB Daemon and create a new transport.
158
- */
159
- static async authenticate({
160
- serial,
161
- connection,
162
- credentialStore,
163
- authenticators = ADB_DEFAULT_AUTHENTICATORS,
164
- features = ADB_DAEMON_DEFAULT_FEATURES,
165
- initialDelayedAckBytes = ADB_DAEMON_DEFAULT_INITIAL_PAYLOAD_SIZE,
166
- ...options
167
- }: AdbDaemonAuthenticationOptions): Promise<AdbDaemonTransport> {
168
- // Initially, set to highest-supported version and payload size.
169
- let version = 0x01000001;
170
- // Android 4: 4K, Android 7: 256K, Android 9: 1M
171
- let maxPayloadSize = 1024 * 1024;
172
-
173
- const resolver = new PromiseResolver<string>();
174
- const authProcessor = new AdbAuthenticationProcessor(
175
- authenticators,
176
- credentialStore,
177
- );
178
-
179
- // Here is similar to `AdbPacketDispatcher`,
180
- // But the received packet types and send packet processing are different.
181
- const abortController = new AbortController();
182
- const pipe = connection.readable
183
- .pipeTo(
184
- new WritableStream({
185
- async write(packet) {
186
- switch (packet.command) {
187
- case AdbCommand.Connect:
188
- version = Math.min(version, packet.arg0);
189
- maxPayloadSize = Math.min(
190
- maxPayloadSize,
191
- packet.arg1,
192
- );
193
- resolver.resolve(decodeUtf8(packet.payload));
194
- break;
195
- case AdbCommand.Auth: {
196
- const response =
197
- await authProcessor.process(packet);
198
- await sendPacket(response);
199
- break;
200
- }
201
- default:
202
- // Maybe the previous ADB client exited without reading all packets,
203
- // so they are still waiting in OS internal buffer.
204
- // Just ignore them.
205
- // Because a `Connect` packet will reset the device,
206
- // Eventually there will be `Connect` and `Auth` response packets.
207
- break;
208
- }
209
- },
210
- }),
211
- {
212
- // Don't cancel the source ReadableStream on AbortSignal abort.
213
- preventCancel: true,
214
- signal: abortController.signal,
215
- },
216
- )
217
- .then(
218
- () => {
219
- // If `resolver` is already settled, call `reject` won't do anything.
220
- resolver.reject(
221
- new Error("Connection closed unexpectedly"),
222
- );
223
- },
224
- (e) => {
225
- resolver.reject(e);
226
- },
227
- );
228
-
229
- const writer = connection.writable.getWriter();
230
- async function sendPacket(init: AdbPacketData) {
231
- // Always send checksum in auth steps
232
- // Because we don't know if the device needs it or not.
233
- (init as AdbPacketInit).checksum = calculateChecksum(init.payload);
234
- (init as AdbPacketInit).magic = init.command ^ 0xffffffff;
235
- await Consumable.WritableStream.write(
236
- writer,
237
- init as AdbPacketInit,
238
- );
239
- }
240
-
241
- const actualFeatures = features.slice();
242
- if (initialDelayedAckBytes <= 0) {
243
- const index = features.indexOf(AdbFeature.DelayedAck);
244
- if (index !== -1) {
245
- actualFeatures.splice(index, 1);
246
- }
247
- }
248
-
249
- let banner: string;
250
- try {
251
- await sendPacket({
252
- command: AdbCommand.Connect,
253
- arg0: version,
254
- arg1: maxPayloadSize,
255
- // The terminating `;` is required in formal definition
256
- // But ADB daemon (all versions) can still work without it
257
- payload: encodeUtf8(
258
- `host::features=${actualFeatures.join(",")}`,
259
- ),
260
- });
261
-
262
- banner = await resolver.promise;
263
- } finally {
264
- // When failed, release locks on `connection` so the caller can try again.
265
- // When success, also release locks so `AdbPacketDispatcher` can use them.
266
- abortController.abort();
267
- writer.releaseLock();
268
-
269
- // Wait until pipe stops (`ReadableStream` lock released)
270
- await pipe;
271
- }
272
-
273
- return new AdbDaemonTransport({
274
- serial,
275
- connection,
276
- version,
277
- maxPayloadSize,
278
- banner,
279
- features: actualFeatures,
280
- initialDelayedAckBytes,
281
- ...options,
282
- });
283
- }
284
-
285
67
  #connection: AdbDaemonConnection;
286
68
  get connection() {
287
69
  return this.#connection;
@@ -322,42 +104,42 @@ export class AdbDaemonTransport implements AdbTransport {
322
104
  connection,
323
105
  version,
324
106
  banner,
325
- features = ADB_DAEMON_DEFAULT_FEATURES,
326
- initialDelayedAckBytes,
107
+ features = AdbDeviceFeatures,
108
+ initialDelayedAckBytes = ADB_DAEMON_DEFAULT_INITIAL_PAYLOAD_SIZE,
327
109
  ...options
328
- }: AdbDaemonSocketConnectorConstructionOptions) {
110
+ }: AdbDaemonTransportInit) {
329
111
  this.#serial = serial;
330
112
  this.#connection = connection;
331
113
  this.#banner = AdbBanner.parse(banner);
332
114
  this.#clientFeatures = features;
333
115
 
334
- if (features.includes(AdbFeature.DelayedAck)) {
335
- if (initialDelayedAckBytes <= 0) {
336
- throw new TypeError(
337
- "`initialDelayedAckBytes` must be greater than 0 when DelayedAck feature is enabled.",
338
- );
339
- }
340
-
341
- if (!this.#banner.features.includes(AdbFeature.DelayedAck)) {
342
- initialDelayedAckBytes = 0;
343
- }
344
- } else {
116
+ if (
117
+ !this.#banner.features.includes(AdbFeature.DelayedAck) ||
118
+ !features.includes(AdbFeature.DelayedAck)
119
+ ) {
120
+ // For `AdbPacketDispatcher`, 0 means disabled
345
121
  initialDelayedAckBytes = 0;
122
+ } else if (initialDelayedAckBytes <= 0) {
123
+ // Delayed Ack is enabled in handshake process, we can't disable it here,
124
+ // so it must be a positive integer
125
+ throw new TypeError(
126
+ "`initialDelayedAckBytes` must be greater than 0 when DelayedAck feature is enabled.",
127
+ );
346
128
  }
347
129
 
348
- let calculateChecksum: boolean;
349
- let appendNullToServiceString: boolean;
130
+ let shouldCalculateChecksum: boolean;
131
+ let shouldAppendNullToServiceString: boolean;
350
132
  if (version >= ADB_DAEMON_VERSION_OMIT_CHECKSUM) {
351
- calculateChecksum = false;
352
- appendNullToServiceString = false;
133
+ shouldCalculateChecksum = false;
134
+ shouldAppendNullToServiceString = false;
353
135
  } else {
354
- calculateChecksum = true;
355
- appendNullToServiceString = true;
136
+ shouldCalculateChecksum = true;
137
+ shouldAppendNullToServiceString = true;
356
138
  }
357
139
 
358
140
  this.#dispatcher = new AdbPacketDispatcher(connection, {
359
- calculateChecksum,
360
- appendNullToServiceString,
141
+ calculateChecksum: shouldCalculateChecksum,
142
+ appendNullToServiceString: shouldAppendNullToServiceString,
361
143
  initialDelayedAckBytes,
362
144
  ...options,
363
145
  });
@@ -365,12 +147,12 @@ export class AdbDaemonTransport implements AdbTransport {
365
147
  this.#protocolVersion = version;
366
148
  }
367
149
 
368
- connect(service: string): MaybePromiseLike<AdbSocket> {
150
+ connect(service: string): MaybePromiseLike<Adb.Socket> {
369
151
  return this.#dispatcher.createSocket(service);
370
152
  }
371
153
 
372
154
  addReverseTunnel(
373
- handler: AdbIncomingSocketHandler,
155
+ handler: Adb.IncomingSocketHandler,
374
156
  address?: string,
375
157
  ): string {
376
158
  if (!address) {
@@ -1,10 +1,10 @@
1
- import type { MaybePromiseLike } from "@yume-chan/async";
2
1
  import type { Event } from "@yume-chan/event";
3
2
 
4
- export interface DeviceObserver<T> {
3
+ import type { Closeable } from "./adb.js";
4
+
5
+ export interface DeviceObserver<T> extends Closeable {
5
6
  readonly onDeviceAdd: Event<readonly T[]>;
6
7
  readonly onDeviceRemove: Event<readonly T[]>;
7
8
  readonly onListChange: Event<readonly T[]>;
8
9
  readonly current: readonly T[];
9
- stop(): MaybePromiseLike<void>;
10
10
  }