@yume-chan/adb 2.6.2 → 3.0.0-beta.1

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 (450) 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/banner.js.map +1 -1
  10. package/esm/daemon/auth/authenticator.d.ts +28 -0
  11. package/esm/daemon/auth/authenticator.d.ts.map +1 -0
  12. package/esm/daemon/auth/authenticator.js +108 -0
  13. package/esm/daemon/auth/authenticator.js.map +1 -0
  14. package/esm/daemon/auth/index.d.ts +5 -0
  15. package/esm/daemon/auth/index.d.ts.map +1 -0
  16. package/esm/daemon/auth/index.js +5 -0
  17. package/esm/daemon/auth/index.js.map +1 -0
  18. package/esm/daemon/auth/packet-processor.d.ts +42 -0
  19. package/esm/daemon/auth/packet-processor.d.ts.map +1 -0
  20. package/esm/daemon/auth/packet-processor.js +129 -0
  21. package/esm/daemon/auth/packet-processor.js.map +1 -0
  22. package/esm/daemon/auth/public-key.d.ts +8 -0
  23. package/esm/daemon/auth/public-key.d.ts.map +1 -0
  24. package/esm/daemon/auth/public-key.js +74 -0
  25. package/esm/daemon/auth/public-key.js.map +1 -0
  26. package/esm/daemon/auth/type.d.ts +5 -0
  27. package/esm/daemon/auth/type.d.ts.map +1 -0
  28. package/esm/daemon/auth/type.js +2 -0
  29. package/esm/daemon/auth/type.js.map +1 -0
  30. package/esm/daemon/crypto.d.ts +6 -5
  31. package/esm/daemon/crypto.d.ts.map +1 -1
  32. package/esm/daemon/crypto.js +23 -72
  33. package/esm/daemon/crypto.js.map +1 -1
  34. package/esm/daemon/dispatcher.d.ts +3 -3
  35. package/esm/daemon/dispatcher.d.ts.map +1 -1
  36. package/esm/daemon/dispatcher.js +11 -4
  37. package/esm/daemon/dispatcher.js.map +1 -1
  38. package/esm/daemon/index.d.ts +1 -1
  39. package/esm/daemon/index.d.ts.map +1 -1
  40. package/esm/daemon/index.js +1 -1
  41. package/esm/daemon/index.js.map +1 -1
  42. package/esm/daemon/socket.d.ts +3 -3
  43. package/esm/daemon/socket.d.ts.map +1 -1
  44. package/esm/daemon/transport.d.ts +13 -65
  45. package/esm/daemon/transport.d.ts.map +1 -1
  46. package/esm/daemon/transport.js +18 -140
  47. package/esm/daemon/transport.js.map +1 -1
  48. package/esm/device-observer.d.ts +2 -3
  49. package/esm/device-observer.d.ts.map +1 -1
  50. package/esm/features-value.d.ts +40 -0
  51. package/esm/features-value.d.ts.map +1 -0
  52. package/esm/features-value.js +46 -0
  53. package/esm/features-value.js.map +1 -0
  54. package/esm/features.d.ts +4 -12
  55. package/esm/features.d.ts.map +1 -1
  56. package/esm/features.js +27 -13
  57. package/esm/features.js.map +1 -1
  58. package/esm/index.d.ts +1 -1
  59. package/esm/index.d.ts.map +1 -1
  60. package/esm/index.js +1 -1
  61. package/esm/index.js.map +1 -1
  62. package/esm/server/client.d.ts +11 -10
  63. package/esm/server/client.d.ts.map +1 -1
  64. package/esm/server/client.js +82 -98
  65. package/esm/server/client.js.map +1 -1
  66. package/esm/server/commands/wireless.js +1 -1
  67. package/esm/server/commands/wireless.js.map +1 -1
  68. package/esm/server/{stream.d.ts → data-connection.d.ts} +5 -5
  69. package/esm/server/data-connection.d.ts.map +1 -0
  70. package/esm/server/{stream.js → data-connection.js} +4 -4
  71. package/esm/server/data-connection.js.map +1 -0
  72. package/esm/server/index.d.ts +1 -1
  73. package/esm/server/index.d.ts.map +1 -1
  74. package/esm/server/index.js +1 -1
  75. package/esm/server/index.js.map +1 -1
  76. package/esm/server/observer.d.ts.map +1 -1
  77. package/esm/server/observer.js +14 -13
  78. package/esm/server/observer.js.map +1 -1
  79. package/esm/server/transport.d.ts +4 -6
  80. package/esm/server/transport.d.ts.map +1 -1
  81. package/esm/server/transport.js +9 -24
  82. package/esm/server/transport.js.map +1 -1
  83. package/esm/service/framebuffer.d.ts.map +1 -0
  84. package/esm/service/framebuffer.js.map +1 -0
  85. package/esm/{commands → service}/index.d.ts +1 -2
  86. package/esm/service/index.d.ts.map +1 -0
  87. package/esm/{commands → service}/index.js +1 -2
  88. package/esm/service/index.js.map +1 -0
  89. package/esm/{commands → service}/power.d.ts +4 -2
  90. package/esm/service/power.d.ts.map +1 -0
  91. package/esm/{commands → service}/power.js +11 -5
  92. package/esm/service/power.js.map +1 -0
  93. package/esm/service/reverse/error.d.ts +14 -0
  94. package/esm/service/reverse/error.d.ts.map +1 -0
  95. package/esm/service/reverse/error.js +21 -0
  96. package/esm/service/reverse/error.js.map +1 -0
  97. package/esm/service/reverse/index.d.ts +3 -0
  98. package/esm/service/reverse/index.d.ts.map +1 -0
  99. package/esm/service/reverse/index.js +4 -0
  100. package/esm/service/reverse/index.js.map +1 -0
  101. package/esm/service/reverse/response.d.ts +2 -0
  102. package/esm/service/reverse/response.d.ts.map +1 -0
  103. package/esm/service/reverse/response.js +30 -0
  104. package/esm/service/reverse/response.js.map +1 -0
  105. package/esm/service/reverse/service.d.ts +59 -0
  106. package/esm/service/reverse/service.d.ts.map +1 -0
  107. package/esm/{commands/reverse.js → service/reverse/service.js} +16 -45
  108. package/esm/service/reverse/service.js.map +1 -0
  109. package/esm/{commands → service}/subprocess/index.d.ts +1 -0
  110. package/esm/service/subprocess/index.d.ts.map +1 -0
  111. package/esm/{commands → service}/subprocess/index.js +1 -0
  112. package/esm/service/subprocess/index.js.map +1 -0
  113. package/esm/service/subprocess/none/index.d.ts.map +1 -0
  114. package/esm/service/subprocess/none/index.js.map +1 -0
  115. package/esm/{commands → service}/subprocess/none/process.d.ts +2 -2
  116. package/esm/service/subprocess/none/process.d.ts.map +1 -0
  117. package/esm/service/subprocess/none/process.js.map +1 -0
  118. package/esm/{commands → service}/subprocess/none/pty.d.ts +4 -4
  119. package/esm/service/subprocess/none/pty.d.ts.map +1 -0
  120. package/esm/{commands → service}/subprocess/none/pty.js +1 -1
  121. package/esm/service/subprocess/none/pty.js.map +1 -0
  122. package/esm/service/subprocess/none/service.d.ts +10 -0
  123. package/esm/service/subprocess/none/service.d.ts.map +1 -0
  124. package/esm/service/subprocess/none/service.js +44 -0
  125. package/esm/service/subprocess/none/service.js.map +1 -0
  126. package/esm/service/subprocess/none/spawner.d.ts +15 -0
  127. package/esm/service/subprocess/none/spawner.d.ts.map +1 -0
  128. package/esm/service/subprocess/none/spawner.js +36 -0
  129. package/esm/service/subprocess/none/spawner.js.map +1 -0
  130. package/esm/{commands → service}/subprocess/pty.d.ts +1 -1
  131. package/esm/service/subprocess/pty.d.ts.map +1 -0
  132. package/esm/{commands → service}/subprocess/pty.js.map +1 -1
  133. package/esm/service/subprocess/service.d.ts.map +1 -0
  134. package/esm/{commands → service}/subprocess/service.js +1 -1
  135. package/esm/service/subprocess/service.js.map +1 -0
  136. package/esm/service/subprocess/shell/index.d.ts +5 -0
  137. package/esm/{commands/subprocess/none → service/subprocess/shell}/index.d.ts.map +1 -1
  138. package/esm/service/subprocess/shell/index.js +6 -0
  139. package/esm/{commands/subprocess/none → service/subprocess/shell}/index.js.map +1 -1
  140. package/esm/{commands → service}/subprocess/shell/process.d.ts +2 -2
  141. package/esm/service/subprocess/shell/process.d.ts.map +1 -0
  142. package/esm/{commands → service}/subprocess/shell/process.js +11 -15
  143. package/esm/service/subprocess/shell/process.js.map +1 -0
  144. package/esm/{commands → service}/subprocess/shell/pty.d.ts +4 -4
  145. package/esm/service/subprocess/shell/pty.d.ts.map +1 -0
  146. package/esm/{commands → service}/subprocess/shell/pty.js +11 -9
  147. package/esm/service/subprocess/shell/pty.js.map +1 -0
  148. package/esm/service/subprocess/shell/service.d.ts +34 -0
  149. package/esm/service/subprocess/shell/service.d.ts.map +1 -0
  150. package/esm/service/subprocess/shell/service.js +52 -0
  151. package/esm/service/subprocess/shell/service.js.map +1 -0
  152. package/esm/service/subprocess/shell/shared.d.ts +2 -0
  153. package/esm/service/subprocess/shell/shared.d.ts.map +1 -0
  154. package/esm/{commands → service}/subprocess/shell/shared.js +2 -0
  155. package/esm/service/subprocess/shell/shared.js.map +1 -0
  156. package/esm/{commands → service}/subprocess/shell/spawner.d.ts +3 -7
  157. package/esm/service/subprocess/shell/spawner.d.ts.map +1 -0
  158. package/esm/service/subprocess/shell/spawner.js +50 -0
  159. package/esm/service/subprocess/shell/spawner.js.map +1 -0
  160. package/esm/service/subprocess/types.d.ts +14 -0
  161. package/esm/service/subprocess/types.d.ts.map +1 -0
  162. package/esm/service/subprocess/types.js +2 -0
  163. package/esm/service/subprocess/types.js.map +1 -0
  164. package/esm/service/subprocess/utils.d.ts +39 -0
  165. package/esm/service/subprocess/utils.d.ts.map +1 -0
  166. package/esm/service/subprocess/utils.js +142 -0
  167. package/esm/service/subprocess/utils.js.map +1 -0
  168. package/esm/service/sync/android.d.ts +34 -0
  169. package/esm/service/sync/android.d.ts.map +1 -0
  170. package/esm/service/sync/android.js +34 -0
  171. package/esm/service/sync/android.js.map +1 -0
  172. package/esm/service/sync/compression/compression.d.ts +17 -0
  173. package/esm/service/sync/compression/compression.d.ts.map +1 -0
  174. package/esm/service/sync/compression/compression.js +92 -0
  175. package/esm/service/sync/compression/compression.js.map +1 -0
  176. package/esm/service/sync/compression/format-ns.d.ts +5 -0
  177. package/esm/service/sync/compression/format-ns.d.ts.map +1 -0
  178. package/esm/service/sync/compression/format-ns.js +5 -0
  179. package/esm/service/sync/compression/format-ns.js.map +1 -0
  180. package/esm/service/sync/compression/format.d.ts +4 -0
  181. package/esm/service/sync/compression/format.d.ts.map +1 -0
  182. package/esm/service/sync/compression/format.js +3 -0
  183. package/esm/service/sync/compression/format.js.map +1 -0
  184. package/esm/service/sync/compression/index.d.ts +2 -0
  185. package/esm/service/sync/compression/index.d.ts.map +1 -0
  186. package/esm/service/sync/compression/index.js +2 -0
  187. package/esm/service/sync/compression/index.js.map +1 -0
  188. package/esm/service/sync/id/common.d.ts +17 -0
  189. package/esm/service/sync/id/common.d.ts.map +1 -0
  190. package/esm/service/sync/id/common.js +29 -0
  191. package/esm/service/sync/id/common.js.map +1 -0
  192. package/esm/service/sync/id/index.d.ts +4 -0
  193. package/esm/service/sync/id/index.d.ts.map +1 -0
  194. package/esm/service/sync/id/index.js +6 -0
  195. package/esm/service/sync/id/index.js.map +1 -0
  196. package/esm/service/sync/id/request.d.ts +7 -0
  197. package/esm/service/sync/id/request.d.ts.map +1 -0
  198. package/esm/service/sync/id/request.js +9 -0
  199. package/esm/service/sync/id/request.js.map +1 -0
  200. package/esm/service/sync/id/response.d.ts +6 -0
  201. package/esm/service/sync/id/response.d.ts.map +1 -0
  202. package/esm/service/sync/id/response.js +8 -0
  203. package/esm/service/sync/id/response.js.map +1 -0
  204. package/esm/service/sync/index-ns.d.ts +7 -0
  205. package/esm/service/sync/index-ns.d.ts.map +1 -0
  206. package/esm/service/sync/index-ns.js +7 -0
  207. package/esm/service/sync/index-ns.js.map +1 -0
  208. package/esm/service/sync/index.d.ts +3 -0
  209. package/esm/service/sync/index.d.ts.map +1 -0
  210. package/esm/service/sync/index.js +3 -0
  211. package/esm/service/sync/index.js.map +1 -0
  212. package/esm/service/sync/request/index.d.ts +5 -0
  213. package/esm/service/sync/request/index.d.ts.map +1 -0
  214. package/esm/service/sync/request/index.js +5 -0
  215. package/esm/service/sync/request/index.js.map +1 -0
  216. package/esm/{commands/sync → service/sync/request}/list.d.ts +21 -19
  217. package/esm/service/sync/request/list.d.ts.map +1 -0
  218. package/esm/service/sync/request/list.js +77 -0
  219. package/esm/service/sync/request/list.js.map +1 -0
  220. package/esm/service/sync/request/pull.d.ts +12 -0
  221. package/esm/service/sync/request/pull.d.ts.map +1 -0
  222. package/esm/service/sync/request/pull.js +28 -0
  223. package/esm/service/sync/request/pull.js.map +1 -0
  224. package/esm/service/sync/request/push.d.ts +54 -0
  225. package/esm/service/sync/request/push.d.ts.map +1 -0
  226. package/esm/service/sync/request/push.js +95 -0
  227. package/esm/service/sync/request/push.js.map +1 -0
  228. package/esm/{commands/sync → service/sync/request}/stat.d.ts +40 -50
  229. package/esm/service/sync/request/stat.d.ts.map +1 -0
  230. package/esm/service/sync/request/stat.js +89 -0
  231. package/esm/service/sync/request/stat.js.map +1 -0
  232. package/esm/service/sync/service.d.ts +123 -0
  233. package/esm/service/sync/service.d.ts.map +1 -0
  234. package/esm/service/sync/service.js +170 -0
  235. package/esm/service/sync/service.js.map +1 -0
  236. package/esm/service/sync/socket-pool.d.ts +11 -0
  237. package/esm/service/sync/socket-pool.d.ts.map +1 -0
  238. package/esm/service/sync/socket-pool.js +80 -0
  239. package/esm/service/sync/socket-pool.js.map +1 -0
  240. package/esm/service/sync/socket.d.ts +40 -0
  241. package/esm/service/sync/socket.d.ts.map +1 -0
  242. package/esm/service/sync/socket.js +153 -0
  243. package/esm/service/sync/socket.js.map +1 -0
  244. package/esm/{commands → service}/tcpip.d.ts +4 -2
  245. package/esm/service/tcpip.d.ts.map +1 -0
  246. package/esm/{commands → service}/tcpip.js +10 -7
  247. package/esm/service/tcpip.js.map +1 -0
  248. package/esm/utils/array-buffer.d.ts.map +1 -1
  249. package/esm/utils/array-buffer.js +2 -3
  250. package/esm/utils/array-buffer.js.map +1 -1
  251. package/esm/utils/base64.d.ts.map +1 -1
  252. package/esm/utils/base64.js +22 -10
  253. package/esm/utils/base64.js.map +1 -1
  254. package/esm/utils/index.d.ts +1 -0
  255. package/esm/utils/index.d.ts.map +1 -1
  256. package/esm/utils/index.js +1 -0
  257. package/esm/utils/index.js.map +1 -1
  258. package/esm/utils/md5.d.ts +8 -0
  259. package/esm/utils/md5.d.ts.map +1 -0
  260. package/esm/utils/md5.js +149 -0
  261. package/esm/utils/md5.js.map +1 -0
  262. package/package.json +7 -7
  263. package/src/adb.ts +44 -35
  264. package/src/banner.ts +2 -1
  265. package/src/daemon/auth/authenticator.ts +186 -0
  266. package/src/daemon/auth/index.ts +4 -0
  267. package/src/daemon/auth/packet-processor.ts +212 -0
  268. package/src/daemon/auth/public-key.ts +112 -0
  269. package/src/daemon/auth/type.ts +5 -0
  270. package/src/daemon/crypto.ts +36 -101
  271. package/src/daemon/dispatcher.ts +15 -8
  272. package/src/daemon/index.ts +1 -1
  273. package/src/daemon/socket.ts +3 -3
  274. package/src/daemon/transport.ts +35 -253
  275. package/src/device-observer.ts +3 -3
  276. package/src/features-value.ts +47 -0
  277. package/src/features.ts +31 -14
  278. package/src/index.ts +1 -1
  279. package/src/server/client.ts +112 -104
  280. package/src/server/commands/wireless.ts +1 -1
  281. package/src/server/{stream.ts → data-connection.ts} +4 -4
  282. package/src/server/index.ts +1 -1
  283. package/src/server/observer.ts +21 -19
  284. package/src/server/transport.ts +13 -34
  285. package/src/{commands → service}/index.ts +1 -2
  286. package/src/{commands → service}/power.ts +14 -5
  287. package/src/service/reverse/error.ts +35 -0
  288. package/src/service/reverse/index.ts +3 -0
  289. package/src/service/reverse/response.ts +38 -0
  290. package/src/{commands/reverse.ts → service/reverse/service.ts} +32 -72
  291. package/src/{commands → service}/subprocess/index.ts +1 -0
  292. package/src/{commands → service}/subprocess/none/process.ts +3 -3
  293. package/src/{commands → service}/subprocess/none/pty.ts +5 -5
  294. package/src/service/subprocess/none/service.ts +57 -0
  295. package/src/service/subprocess/none/spawner.ts +85 -0
  296. package/src/{commands → service}/subprocess/pty.ts +1 -1
  297. package/src/{commands → service}/subprocess/service.ts +1 -1
  298. package/src/{commands → service}/subprocess/shell/index.ts +1 -1
  299. package/src/{commands → service}/subprocess/shell/process.ts +13 -17
  300. package/src/{commands → service}/subprocess/shell/pty.ts +15 -13
  301. package/src/service/subprocess/shell/service.ts +75 -0
  302. package/src/{commands → service}/subprocess/shell/shared.ts +5 -0
  303. package/src/service/subprocess/shell/spawner.ts +113 -0
  304. package/src/service/subprocess/types.ts +19 -0
  305. package/src/service/subprocess/utils.ts +166 -0
  306. package/src/service/sync/android.ts +43 -0
  307. package/src/service/sync/compression/compression.ts +126 -0
  308. package/src/service/sync/compression/format-ns.ts +4 -0
  309. package/src/service/sync/compression/format.ts +5 -0
  310. package/src/service/sync/compression/index.ts +1 -0
  311. package/src/service/sync/id/common.ts +33 -0
  312. package/src/service/sync/id/index.ts +7 -0
  313. package/src/service/sync/id/request.ts +12 -0
  314. package/src/service/sync/id/response.ts +11 -0
  315. package/src/service/sync/index-ns.ts +6 -0
  316. package/src/service/sync/index.ts +2 -0
  317. package/src/service/sync/request/index.ts +4 -0
  318. package/src/service/sync/request/list.ts +110 -0
  319. package/src/service/sync/request/pull.ts +49 -0
  320. package/src/service/sync/request/push.ts +184 -0
  321. package/src/service/sync/request/stat.ts +127 -0
  322. package/src/service/sync/service.ts +255 -0
  323. package/src/service/sync/socket-pool.ts +97 -0
  324. package/src/service/sync/socket.ts +201 -0
  325. package/src/{commands → service}/tcpip.ts +13 -7
  326. package/src/utils/array-buffer.ts +2 -3
  327. package/src/utils/base64.ts +24 -10
  328. package/src/utils/index.ts +1 -0
  329. package/src/utils/md5.ts +185 -0
  330. package/CHANGELOG.md +0 -257
  331. package/esm/commands/base.d.ts +0 -8
  332. package/esm/commands/base.d.ts.map +0 -1
  333. package/esm/commands/base.js +0 -12
  334. package/esm/commands/base.js.map +0 -1
  335. package/esm/commands/framebuffer.d.ts.map +0 -1
  336. package/esm/commands/framebuffer.js.map +0 -1
  337. package/esm/commands/index.d.ts.map +0 -1
  338. package/esm/commands/index.js.map +0 -1
  339. package/esm/commands/power.d.ts.map +0 -1
  340. package/esm/commands/power.js.map +0 -1
  341. package/esm/commands/reverse.d.ts +0 -48
  342. package/esm/commands/reverse.d.ts.map +0 -1
  343. package/esm/commands/reverse.js.map +0 -1
  344. package/esm/commands/subprocess/index.d.ts.map +0 -1
  345. package/esm/commands/subprocess/index.js.map +0 -1
  346. package/esm/commands/subprocess/none/process.d.ts.map +0 -1
  347. package/esm/commands/subprocess/none/process.js.map +0 -1
  348. package/esm/commands/subprocess/none/pty.d.ts.map +0 -1
  349. package/esm/commands/subprocess/none/pty.js.map +0 -1
  350. package/esm/commands/subprocess/none/service.d.ts +0 -10
  351. package/esm/commands/subprocess/none/service.d.ts.map +0 -1
  352. package/esm/commands/subprocess/none/service.js +0 -34
  353. package/esm/commands/subprocess/none/service.js.map +0 -1
  354. package/esm/commands/subprocess/none/spawner.d.ts +0 -19
  355. package/esm/commands/subprocess/none/spawner.d.ts.map +0 -1
  356. package/esm/commands/subprocess/none/spawner.js +0 -26
  357. package/esm/commands/subprocess/none/spawner.js.map +0 -1
  358. package/esm/commands/subprocess/pty.d.ts.map +0 -1
  359. package/esm/commands/subprocess/service.d.ts.map +0 -1
  360. package/esm/commands/subprocess/service.js.map +0 -1
  361. package/esm/commands/subprocess/shell/index.d.ts +0 -6
  362. package/esm/commands/subprocess/shell/index.d.ts.map +0 -1
  363. package/esm/commands/subprocess/shell/index.js +0 -6
  364. package/esm/commands/subprocess/shell/index.js.map +0 -1
  365. package/esm/commands/subprocess/shell/process.d.ts.map +0 -1
  366. package/esm/commands/subprocess/shell/process.js.map +0 -1
  367. package/esm/commands/subprocess/shell/pty.d.ts.map +0 -1
  368. package/esm/commands/subprocess/shell/pty.js.map +0 -1
  369. package/esm/commands/subprocess/shell/service.d.ts +0 -14
  370. package/esm/commands/subprocess/shell/service.d.ts.map +0 -1
  371. package/esm/commands/subprocess/shell/service.js +0 -41
  372. package/esm/commands/subprocess/shell/service.js.map +0 -1
  373. package/esm/commands/subprocess/shell/shared.d.ts +0 -19
  374. package/esm/commands/subprocess/shell/shared.d.ts.map +0 -1
  375. package/esm/commands/subprocess/shell/shared.js.map +0 -1
  376. package/esm/commands/subprocess/shell/spawner.d.ts.map +0 -1
  377. package/esm/commands/subprocess/shell/spawner.js +0 -38
  378. package/esm/commands/subprocess/shell/spawner.js.map +0 -1
  379. package/esm/commands/subprocess/utils.d.ts +0 -3
  380. package/esm/commands/subprocess/utils.d.ts.map +0 -1
  381. package/esm/commands/subprocess/utils.js +0 -56
  382. package/esm/commands/subprocess/utils.js.map +0 -1
  383. package/esm/commands/sync/index.d.ts +0 -9
  384. package/esm/commands/sync/index.d.ts.map +0 -1
  385. package/esm/commands/sync/index.js +0 -9
  386. package/esm/commands/sync/index.js.map +0 -1
  387. package/esm/commands/sync/list.d.ts.map +0 -1
  388. package/esm/commands/sync/list.js +0 -64
  389. package/esm/commands/sync/list.js.map +0 -1
  390. package/esm/commands/sync/pull.d.ts +0 -12
  391. package/esm/commands/sync/pull.d.ts.map +0 -1
  392. package/esm/commands/sync/pull.js +0 -33
  393. package/esm/commands/sync/pull.js.map +0 -1
  394. package/esm/commands/sync/push.d.ts +0 -61
  395. package/esm/commands/sync/push.d.ts.map +0 -1
  396. package/esm/commands/sync/push.js +0 -83
  397. package/esm/commands/sync/push.js.map +0 -1
  398. package/esm/commands/sync/request.d.ts +0 -24
  399. package/esm/commands/sync/request.d.ts.map +0 -1
  400. package/esm/commands/sync/request.js +0 -32
  401. package/esm/commands/sync/request.js.map +0 -1
  402. package/esm/commands/sync/response.d.ts +0 -28
  403. package/esm/commands/sync/response.d.ts.map +0 -1
  404. package/esm/commands/sync/response.js +0 -81
  405. package/esm/commands/sync/response.js.map +0 -1
  406. package/esm/commands/sync/socket.d.ts +0 -22
  407. package/esm/commands/sync/socket.d.ts.map +0 -1
  408. package/esm/commands/sync/socket.js +0 -78
  409. package/esm/commands/sync/socket.js.map +0 -1
  410. package/esm/commands/sync/stat.d.ts.map +0 -1
  411. package/esm/commands/sync/stat.js +0 -121
  412. package/esm/commands/sync/stat.js.map +0 -1
  413. package/esm/commands/sync/sync.d.ts +0 -82
  414. package/esm/commands/sync/sync.d.ts.map +0 -1
  415. package/esm/commands/sync/sync.js +0 -138
  416. package/esm/commands/sync/sync.js.map +0 -1
  417. package/esm/commands/tcpip.d.ts.map +0 -1
  418. package/esm/commands/tcpip.js.map +0 -1
  419. package/esm/daemon/auth.d.ts +0 -54
  420. package/esm/daemon/auth.d.ts.map +0 -1
  421. package/esm/daemon/auth.js +0 -104
  422. package/esm/daemon/auth.js.map +0 -1
  423. package/esm/server/stream.d.ts.map +0 -1
  424. package/esm/server/stream.js.map +0 -1
  425. package/src/commands/base.ts +0 -15
  426. package/src/commands/subprocess/none/service.ts +0 -45
  427. package/src/commands/subprocess/none/spawner.ts +0 -68
  428. package/src/commands/subprocess/shell/service.ts +0 -58
  429. package/src/commands/subprocess/shell/spawner.ts +0 -90
  430. package/src/commands/subprocess/utils.ts +0 -61
  431. package/src/commands/sync/index.ts +0 -8
  432. package/src/commands/sync/list.ts +0 -99
  433. package/src/commands/sync/pull.ts +0 -55
  434. package/src/commands/sync/push.ts +0 -172
  435. package/src/commands/sync/request.ts +0 -53
  436. package/src/commands/sync/response.ts +0 -105
  437. package/src/commands/sync/socket.ts +0 -109
  438. package/src/commands/sync/stat.ts +0 -177
  439. package/src/commands/sync/sync.ts +0 -175
  440. package/src/daemon/auth.ts +0 -203
  441. package/tsconfig.build.tsbuildinfo +0 -1
  442. /package/esm/{commands → service}/framebuffer.d.ts +0 -0
  443. /package/esm/{commands → service}/framebuffer.js +0 -0
  444. /package/esm/{commands → service}/subprocess/none/index.d.ts +0 -0
  445. /package/esm/{commands → service}/subprocess/none/index.js +0 -0
  446. /package/esm/{commands → service}/subprocess/none/process.js +0 -0
  447. /package/esm/{commands → service}/subprocess/pty.js +0 -0
  448. /package/esm/{commands → service}/subprocess/service.d.ts +0 -0
  449. /package/src/{commands → service}/framebuffer.ts +0 -0
  450. /package/src/{commands → service}/subprocess/none/index.ts +0 -0
@@ -12,13 +12,13 @@ import {
12
12
  } from "@yume-chan/stream-extra";
13
13
  import { encodeUtf8 } from "@yume-chan/struct";
14
14
 
15
- import type { AdbSocket } from "../../../adb.js";
16
- import type { AdbPtyProcess } from "../pty.js";
15
+ import type { Adb } from "../../../adb.js";
16
+ import type { AdbPty } from "../pty.js";
17
17
 
18
18
  import { AdbShellProtocolId, AdbShellProtocolPacket } from "./shared.js";
19
19
 
20
- export class AdbShellProtocolPtyProcess implements AdbPtyProcess<number> {
21
- readonly #socket: AdbSocket;
20
+ export class AdbShellProtocolPty implements AdbPty<number> {
21
+ readonly #socket: Adb.Socket;
22
22
  readonly #writer: WritableStreamDefaultWriter<MaybeConsumable<Uint8Array>>;
23
23
 
24
24
  readonly #input: WritableStream<MaybeConsumable<Uint8Array>>;
@@ -26,9 +26,9 @@ export class AdbShellProtocolPtyProcess implements AdbPtyProcess<number> {
26
26
  return this.#input;
27
27
  }
28
28
 
29
- readonly #stdout: ReadableStream<Uint8Array>;
29
+ readonly #output: ReadableStream<Uint8Array>;
30
30
  get output() {
31
- return this.#stdout;
31
+ return this.#output;
32
32
  }
33
33
 
34
34
  readonly #exited = new PromiseResolver<number>();
@@ -36,12 +36,12 @@ export class AdbShellProtocolPtyProcess implements AdbPtyProcess<number> {
36
36
  return this.#exited.promise;
37
37
  }
38
38
 
39
- constructor(socket: AdbSocket) {
39
+ constructor(socket: Adb.Socket) {
40
40
  this.#socket = socket;
41
41
 
42
- let stdoutController!: PushReadableStreamController<Uint8Array>;
43
- this.#stdout = new PushReadableStream<Uint8Array>((controller) => {
44
- stdoutController = controller;
42
+ let outputController!: PushReadableStreamController<Uint8Array>;
43
+ this.#output = new PushReadableStream<Uint8Array>((controller) => {
44
+ outputController = controller;
45
45
  });
46
46
 
47
47
  socket.readable
@@ -54,22 +54,23 @@ export class AdbShellProtocolPtyProcess implements AdbPtyProcess<number> {
54
54
  this.#exited.resolve(chunk.data[0]!);
55
55
  break;
56
56
  case AdbShellProtocolId.Stdout:
57
- await stdoutController.enqueue(chunk.data);
57
+ await outputController.enqueue(chunk.data);
58
58
  break;
59
+ // PTY mode doesn't have stderr
59
60
  }
60
61
  },
61
62
  }),
62
63
  )
63
64
  .then(
64
65
  () => {
65
- stdoutController.close();
66
+ outputController.close();
66
67
  // If `#exit` has already resolved, this will be a no-op
67
68
  this.#exited.reject(
68
69
  new Error("Socket ended without exit message"),
69
70
  );
70
71
  },
71
72
  (e) => {
72
- stdoutController.error(e);
73
+ outputController.error(e);
73
74
  // If `#exit` has already resolved, this will be a no-op
74
75
  this.#exited.reject(e);
75
76
  },
@@ -103,6 +104,7 @@ export class AdbShellProtocolPtyProcess implements AdbPtyProcess<number> {
103
104
  }
104
105
 
105
106
  sigint() {
107
+ // Write `^C`
106
108
  return this.#writeStdin(new Uint8Array([0x03]));
107
109
  }
108
110
 
@@ -0,0 +1,75 @@
1
+ import type { Adb } from "../../../adb.js";
2
+ import { AdbFeature } from "../../../features.js";
3
+
4
+ import { AdbShellProtocolProcessImpl } from "./process.js";
5
+ import { AdbShellProtocolPty } from "./pty.js";
6
+ import { AdbShellProtocolId, AdbShellProtocolPacket } from "./shared.js";
7
+ import { adbShellProtocolSpawner } from "./spawner.js";
8
+
9
+ export class AdbShellProtocolSubprocessService {
10
+ static readonly PacketId = AdbShellProtocolId;
11
+
12
+ static readonly Packet = AdbShellProtocolPacket;
13
+
14
+ readonly #adb: Adb;
15
+ get adb() {
16
+ return this.#adb;
17
+ }
18
+
19
+ get isSupported() {
20
+ return this.#adb.canUseFeature(AdbFeature.Shell2);
21
+ }
22
+
23
+ constructor(adb: Adb) {
24
+ this.#adb = adb;
25
+ }
26
+
27
+ spawn = adbShellProtocolSpawner(async (command, signal) => {
28
+ if (!command.length) {
29
+ throw new Error("Command cannot be empty");
30
+ }
31
+
32
+ // Don't escape `command`. See `AdbNoneProtocolSubprocessService.prototype.spawn` for details.
33
+ const service = "shell,v2,raw:" + command.join(" ");
34
+ const socket = await this.#adb.createSocket(service);
35
+
36
+ if (signal?.aborted) {
37
+ await socket.close();
38
+ throw signal.reason;
39
+ }
40
+
41
+ return new AdbShellProtocolProcessImpl(socket, signal);
42
+ });
43
+
44
+ async pty(options?: {
45
+ command?: string | readonly string[] | undefined;
46
+ terminalType?: string;
47
+ }): Promise<AdbShellProtocolPty> {
48
+ const { command, terminalType } = options ?? {};
49
+
50
+ let service = "shell,v2,pty";
51
+
52
+ if (terminalType) {
53
+ if (terminalType.includes(",") || terminalType.includes(":")) {
54
+ throw new Error("terminalType must not contain ',' or ':'");
55
+ }
56
+ service += `,TERM=` + terminalType;
57
+ }
58
+ service += ":";
59
+
60
+ if (typeof command === "string") {
61
+ service += command;
62
+ } else if (Array.isArray(command)) {
63
+ // Don't escape `command`. See `AdbNoneProtocolSubprocessService.prototype.spawn` for details.
64
+ service += command.join(" ");
65
+ }
66
+
67
+ return new AdbShellProtocolPty(await this.#adb.createSocket(service));
68
+ }
69
+ }
70
+
71
+ export namespace AdbShellProtocolSubprocessService {
72
+ export type PacketId = AdbShellProtocolId;
73
+
74
+ export type Packet = AdbShellProtocolPacket;
75
+ }
@@ -1,6 +1,7 @@
1
1
  import type { StructValue } from "@yume-chan/struct";
2
2
  import { buffer, struct, u32, u8 } from "@yume-chan/struct";
3
3
 
4
+ /** @internal */
4
5
  export const AdbShellProtocolId = {
5
6
  Stdin: 0,
6
7
  Stdout: 1,
@@ -10,10 +11,12 @@ export const AdbShellProtocolId = {
10
11
  WindowSizeChange: 5,
11
12
  } as const;
12
13
 
14
+ /** @internal */
13
15
  export type AdbShellProtocolId =
14
16
  (typeof AdbShellProtocolId)[keyof typeof AdbShellProtocolId];
15
17
 
16
18
  // This packet format is used in both directions.
19
+ /** @internal */
17
20
  export const AdbShellProtocolPacket = struct(
18
21
  {
19
22
  id: u8<AdbShellProtocolId>(),
@@ -22,4 +25,6 @@ export const AdbShellProtocolPacket = struct(
22
25
  { littleEndian: true },
23
26
  );
24
27
 
28
+ // `StructValue` and `StructInit` is same for `AdbShellProtocolPacket`.
29
+ /** @internal */
25
30
  export type AdbShellProtocolPacket = StructValue<typeof AdbShellProtocolPacket>;
@@ -0,0 +1,113 @@
1
+ import type { MaybePromiseLike } from "@yume-chan/async";
2
+ import type {
3
+ AbortSignal,
4
+ MaybeConsumable,
5
+ ReadableStream,
6
+ WritableStream,
7
+ } from "@yume-chan/stream-extra";
8
+ import { concatUint8Arrays } from "@yume-chan/stream-extra";
9
+
10
+ import type { AdbSubprocessSpawner } from "../types.js";
11
+ import {
12
+ createLazyPromise,
13
+ decodeUtf8Chunked,
14
+ splitCommand,
15
+ ToArrayStream,
16
+ } from "../utils.js";
17
+
18
+ export interface AdbShellProtocolProcess {
19
+ get stdin(): WritableStream<MaybeConsumable<Uint8Array>>;
20
+
21
+ get stdout(): ReadableStream<Uint8Array>;
22
+ get stderr(): ReadableStream<Uint8Array>;
23
+
24
+ get exited(): Promise<number>;
25
+
26
+ kill(): MaybePromiseLike<void>;
27
+ }
28
+
29
+ export type AdbShellProtocolSpawner = (
30
+ command: string | readonly string[],
31
+ signal?: AbortSignal,
32
+ ) => Promise<AdbShellProtocolProcess> &
33
+ AdbSubprocessSpawner.Wait<
34
+ AdbShellProtocolSpawner.WaitResult<Uint8Array>,
35
+ AdbShellProtocolSpawner.WaitResult<string>
36
+ >;
37
+
38
+ export namespace AdbShellProtocolSpawner {
39
+ export interface WaitResult<T> {
40
+ stdout: T;
41
+ stderr: T;
42
+ exitCode: number;
43
+ }
44
+ }
45
+
46
+ export function adbShellProtocolSpawner(
47
+ spawn: (
48
+ command: readonly string[],
49
+ signal: AbortSignal | undefined,
50
+ ) => Promise<AdbShellProtocolProcess>,
51
+ ): AdbShellProtocolSpawner {
52
+ return (command, signal) => {
53
+ signal?.throwIfAborted();
54
+
55
+ if (typeof command === "string") {
56
+ command = splitCommand(command);
57
+ }
58
+
59
+ const processPromise = spawn(
60
+ command,
61
+ signal,
62
+ ) as Promise<AdbShellProtocolProcess> &
63
+ AdbSubprocessSpawner.Wait<
64
+ AdbShellProtocolSpawner.WaitResult<Uint8Array>,
65
+ AdbShellProtocolSpawner.WaitResult<string>
66
+ >;
67
+
68
+ processPromise.wait = (options) => {
69
+ const waitPromise = processPromise.then(async (process) => {
70
+ try {
71
+ const [, stdout, stderr, exitCode] = await Promise.all([
72
+ options?.stdin?.pipeTo(process.stdin),
73
+ process.stdout.pipeThrough(new ToArrayStream()),
74
+ process.stderr.pipeThrough(new ToArrayStream()),
75
+ process.exited,
76
+ ]);
77
+ return {
78
+ stdout,
79
+ stderr,
80
+ exitCode,
81
+ } satisfies AdbShellProtocolSpawner.WaitResult<Uint8Array[]>;
82
+ } finally {
83
+ await process.kill();
84
+ }
85
+ });
86
+
87
+ return createLazyPromise(
88
+ async () => {
89
+ const { stdout, stderr, exitCode } = await waitPromise;
90
+
91
+ return {
92
+ stdout: concatUint8Arrays(stdout),
93
+ stderr: concatUint8Arrays(stderr),
94
+ exitCode,
95
+ };
96
+ },
97
+ {
98
+ async toString() {
99
+ const { stdout, stderr, exitCode } = await waitPromise;
100
+
101
+ return {
102
+ stdout: decodeUtf8Chunked(stdout),
103
+ stderr: decodeUtf8Chunked(stderr),
104
+ exitCode,
105
+ };
106
+ },
107
+ },
108
+ );
109
+ };
110
+
111
+ return processPromise;
112
+ };
113
+ }
@@ -0,0 +1,19 @@
1
+ import type { MaybeConsumable, ReadableStream } from "@yume-chan/stream-extra";
2
+
3
+ import type { LazyPromise } from "./utils.js";
4
+
5
+ export namespace AdbSubprocessSpawner {
6
+ export interface WaitToString<T> {
7
+ toString(): Promise<T>;
8
+ }
9
+
10
+ export interface WaitOptions {
11
+ stdin?: ReadableStream<MaybeConsumable<Uint8Array>> | undefined;
12
+ }
13
+
14
+ export interface Wait<TBuffer, TString> {
15
+ wait(
16
+ options?: WaitOptions,
17
+ ): LazyPromise<TBuffer, WaitToString<TString>>;
18
+ }
19
+ }
@@ -0,0 +1,166 @@
1
+ import { AccumulateStream } from "@yume-chan/stream-extra";
2
+ import { TextDecoder } from "@yume-chan/struct";
3
+
4
+ export function escapeArg(s: string) {
5
+ let result = "";
6
+ result += `'`;
7
+
8
+ let base = 0;
9
+ while (true) {
10
+ const found = s.indexOf(`'`, base);
11
+ if (found === -1) {
12
+ result += s.substring(base);
13
+ break;
14
+ }
15
+ result += s.substring(base, found);
16
+ // a'b becomes 'a'\'b', which is 'a' + \' + 'b'
17
+ // (quoted string 'a', escaped single quote, and quoted string 'b')
18
+ result += String.raw`'\''`;
19
+ base = found + 1;
20
+ }
21
+
22
+ result += `'`;
23
+ return result;
24
+ }
25
+
26
+ /**
27
+ * Split the command.
28
+ *
29
+ * Quotes and escaped characters are supported, and will be returned as-is.
30
+ * @param input The input command
31
+ * @returns An array of string containing the arguments
32
+ */
33
+ export function splitCommand(input: string): string[] {
34
+ const result: string[] = [];
35
+ let quote: string | undefined;
36
+ let isEscaped = false;
37
+ let start = 0;
38
+
39
+ for (let i = 0, len = input.length; i < len; i += 1) {
40
+ if (isEscaped) {
41
+ isEscaped = false;
42
+ continue;
43
+ }
44
+
45
+ const char = input.charAt(i);
46
+ switch (char) {
47
+ case " ":
48
+ if (!quote) {
49
+ if (i !== start) {
50
+ result.push(input.substring(start, i));
51
+ }
52
+ start = i + 1;
53
+ }
54
+ break;
55
+ case "'":
56
+ case '"':
57
+ if (!quote) {
58
+ quote = char;
59
+ } else if (char === quote) {
60
+ quote = undefined;
61
+ }
62
+ break;
63
+ case "\\":
64
+ isEscaped = true;
65
+ break;
66
+ }
67
+ }
68
+
69
+ if (start < input.length) {
70
+ result.push(input.substring(start));
71
+ }
72
+
73
+ return result;
74
+ }
75
+
76
+ // Omit `Symbol.toStringTag` so it's incompatible with `Promise`.
77
+ // It can't be returned from async function like `Promise`s.
78
+ export type LazyPromise<T, U> = Omit<Promise<T>, typeof Symbol.toStringTag> & U;
79
+
80
+ /**
81
+ * Creates a `Promise`-like object that lazily computes the result
82
+ * only when it's being used as a `Promise`.
83
+ *
84
+ * For example, if an API returns a value `p` of type `Promise<T> & { asU(): Promise<U> }`,
85
+ * and the user calls `p.asU()` instead of using it as a `Promise` (`p.then()`, `await p`, etc.),
86
+ * is unnecessary to compute the result `T` (unless `asU` also depends on it).
87
+ *
88
+ * By using `createLazyPromise(computeT, { asU: computeU })`,
89
+ * `computeT` will only run when `p` is used as a `Promise`.
90
+ *
91
+ * Note that the result object can't be returned from an async function,
92
+ * as async functions always creates a new `Promise` with the return value,
93
+ * which runs `initializer` immediately, and discards any extra `methods` attached.
94
+ * @param initializer
95
+ * The initializer function when the result object is being used as a `Promise`.
96
+ *
97
+ * The result value will be cached.
98
+ * @param methods Any extra methods to add to the result object
99
+ * @returns
100
+ * A `Promise`-like object that runs `initializer` when used as a `Promise`, and contains `methods`.
101
+ */
102
+ export function createLazyPromise<
103
+ T,
104
+ U extends Record<PropertyKey, () => unknown>,
105
+ >(initializer: () => Promise<T>, methods: U): LazyPromise<T, U> {
106
+ let promise: Promise<T> | undefined;
107
+
108
+ const getOrCreatePromise = () => {
109
+ if (!promise) {
110
+ promise = initializer();
111
+ }
112
+ return promise;
113
+ };
114
+
115
+ const result = {
116
+ // biome-ignore lint/suspicious/noThenProperty: This object is intentionally thenable
117
+ then(onfulfilled, onrejected) {
118
+ return getOrCreatePromise().then(onfulfilled, onrejected);
119
+ },
120
+ // biome-ignore lint/suspicious/noThenProperty: This object is intentionally thenable
121
+ catch(onrejected) {
122
+ return getOrCreatePromise().catch(onrejected);
123
+ },
124
+ // biome-ignore lint/suspicious/noThenProperty: This object is intentionally thenable
125
+ finally(onfinally) {
126
+ return getOrCreatePromise().finally(onfinally);
127
+ },
128
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
129
+ } satisfies LazyPromise<T, {}> as LazyPromise<T, U>;
130
+
131
+ for (const [key, value] of Object.entries(methods)) {
132
+ Object.defineProperty(result, key, {
133
+ configurable: true,
134
+ writable: true,
135
+ enumerable: false,
136
+ value,
137
+ });
138
+ }
139
+
140
+ return result;
141
+ }
142
+
143
+ export class ToArrayStream<T> extends AccumulateStream<T, T[]> {
144
+ constructor() {
145
+ super(
146
+ [],
147
+ (chunk, current) => {
148
+ current.push(chunk);
149
+ return current;
150
+ },
151
+ (output) => output,
152
+ );
153
+ }
154
+ }
155
+
156
+ export function decodeUtf8Chunked(chunks: Uint8Array[]): string {
157
+ // PERF: `TextDecoder`'s `stream` mode can decode from `chunks` directly.
158
+ // This avoids an extra allocation and copy.
159
+ const decoder = new TextDecoder();
160
+ let output = "";
161
+ for (const chunk of chunks) {
162
+ output += decoder.decode(chunk, { stream: true });
163
+ }
164
+ output += decoder.decode();
165
+ return output;
166
+ }
@@ -0,0 +1,43 @@
1
+ // https://github.com/python/cpython/blob/4e581d64b8aff3e2eda99b12f080c877bb78dfca/Lib/stat.py#L36
2
+ export const LinuxFileType = {
3
+ Directory: 0o04,
4
+ File: 0o10,
5
+ Link: 0o12,
6
+ } as const;
7
+
8
+ export type LinuxFileType = (typeof LinuxFileType)[keyof typeof LinuxFileType];
9
+
10
+ export const AndroidSyscallErrorCode = {
11
+ SUCCESS: 0,
12
+ EACCES: 13,
13
+ EEXIST: 17,
14
+ EFAULT: 14,
15
+ EFBIG: 27,
16
+ EINTR: 4,
17
+ EINVAL: 22,
18
+ EIO: 5,
19
+ EISDIR: 21,
20
+ ELOOP: 40,
21
+ EMFILE: 24,
22
+ ENAMETOOLONG: 36,
23
+ ENFILE: 23,
24
+ ENOENT: 2,
25
+ ENOMEM: 12,
26
+ ENOSPC: 28,
27
+ ENOTDIR: 20,
28
+ EOVERFLOW: 75,
29
+ EPERM: 1,
30
+ EROFS: 30,
31
+ ETXTBSY: 26,
32
+ } as const;
33
+
34
+ export type AndroidSyscallErrorCode =
35
+ (typeof AndroidSyscallErrorCode)[keyof typeof AndroidSyscallErrorCode];
36
+
37
+ export const AndroidSyscallErrorNameMap = /* #__PURE__ */ (() =>
38
+ Object.fromEntries(
39
+ Object.entries(AndroidSyscallErrorCode).map(([key, value]) => [
40
+ value,
41
+ key,
42
+ ]),
43
+ ))();
@@ -0,0 +1,126 @@
1
+ import {
2
+ CompressionStream,
3
+ DecompressionStream,
4
+ TransformStream,
5
+ } from "@yume-chan/stream-extra";
6
+
7
+ import type { Adb } from "../../../adb.js";
8
+ import { AdbFeature } from "../../../features.js";
9
+ import { NOOP } from "../../../utils/no-op.js";
10
+
11
+ import { Format } from "./format.js";
12
+
13
+ export { Format };
14
+
15
+ export const Mode = {
16
+ Compress: 0,
17
+ Decompress: 1,
18
+ } as const;
19
+
20
+ export type Mode = (typeof Mode)[keyof typeof Mode];
21
+
22
+ const FormatMap: Record<Format, string> = {
23
+ [Format.None]: "",
24
+ // https://github.com/whatwg/compression/pull/80
25
+ [Format.Zstd]: "zstd",
26
+ // placeholder
27
+ [Format.Lz4]: "lz4",
28
+ // https://github.com/whatwg/compression/pull/80
29
+ [Format.Brotli]: "brotli",
30
+ };
31
+
32
+ const CompressionFormatCache = new Map<Format, boolean>();
33
+ const DecompressionFormatCache = new Map<Format, boolean>();
34
+
35
+ export function hasRuntimeSupport(format: Format, mode: Mode) {
36
+ if (format === Format.None) {
37
+ return true;
38
+ }
39
+
40
+ const Cache =
41
+ mode === Mode.Compress
42
+ ? CompressionFormatCache
43
+ : DecompressionFormatCache;
44
+ if (Cache.has(format)) {
45
+ return Cache.get(format)!;
46
+ }
47
+
48
+ const Stream =
49
+ mode === Mode.Compress ? CompressionStream : DecompressionStream;
50
+ if (!Stream) {
51
+ return false;
52
+ }
53
+
54
+ try {
55
+ const stream = new Stream(FormatMap[format]);
56
+ void stream.writable.abort().catch(NOOP);
57
+ Cache.set(format, true);
58
+ return true;
59
+ } catch {
60
+ Cache.set(format, false);
61
+ return false;
62
+ }
63
+ }
64
+
65
+ export function canUseBrotli(adb: Adb, mode: Mode) {
66
+ return (
67
+ adb.canUseFeature(AdbFeature.SendReceive2Brotli) &&
68
+ hasRuntimeSupport(Format.Brotli, mode)
69
+ );
70
+ }
71
+
72
+ export function canUseLz4(adb: Adb, mode: Mode) {
73
+ return (
74
+ adb.canUseFeature(AdbFeature.SendReceive2Lz4) &&
75
+ hasRuntimeSupport(Format.Lz4, mode)
76
+ );
77
+ }
78
+
79
+ export function canUseZstd(adb: Adb, mode: Mode) {
80
+ return (
81
+ adb.canUseFeature(AdbFeature.SendReceive2Zstd) &&
82
+ hasRuntimeSupport(Format.Zstd, mode)
83
+ );
84
+ }
85
+
86
+ export function canUseFormat(adb: Adb, format: Format, mode: Mode) {
87
+ switch (format) {
88
+ case Format.None:
89
+ return true;
90
+ case Format.Brotli:
91
+ return canUseBrotli(adb, mode);
92
+ case Format.Lz4:
93
+ return canUseLz4(adb, mode);
94
+ case Format.Zstd:
95
+ return canUseZstd(adb, mode);
96
+ default:
97
+ return false;
98
+ }
99
+ }
100
+
101
+ export function chooseFormat(adb: Adb, mode: Mode) {
102
+ // The order follows
103
+ // https://android.googlesource.com/platform/packages/modules/adb/+/3da39565cad412a743a58b94b875a43ed3c640d3/client/file_sync_client.cpp#277
104
+
105
+ if (canUseZstd(adb, mode)) {
106
+ return Format.Zstd;
107
+ }
108
+
109
+ if (canUseLz4(adb, mode)) {
110
+ return Format.Lz4;
111
+ }
112
+
113
+ if (canUseBrotli(adb, mode)) {
114
+ return Format.Brotli;
115
+ }
116
+
117
+ return Format.None;
118
+ }
119
+
120
+ export function createCompressionStream(format: Format): CompressionStream {
121
+ if (format === Format.None) {
122
+ return new TransformStream();
123
+ }
124
+
125
+ return new CompressionStream(FormatMap[format]);
126
+ }
@@ -0,0 +1,4 @@
1
+ export const None = 0;
2
+ export const Brotli = 2;
3
+ export const Lz4 = 3;
4
+ export const Zstd = 4;
@@ -0,0 +1,5 @@
1
+ import * as Format from "./format-ns.js";
2
+
3
+ type Format = (typeof Format)[keyof typeof Format];
4
+
5
+ export { Format };
@@ -0,0 +1 @@
1
+ export * as Compression from "./compression.js";