@yume-chan/scrcpy 0.0.16 → 0.0.18

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 (292) hide show
  1. package/CHANGELOG.json +36 -3
  2. package/CHANGELOG.md +21 -4
  3. package/LICENSE +1 -1
  4. package/README.md +291 -37
  5. package/bin/scrcpy-server +0 -0
  6. package/bin/version.d.ts +1 -1
  7. package/bin/version.js +1 -1
  8. package/esm/adb/client.d.ts +41 -0
  9. package/esm/adb/client.d.ts.map +1 -0
  10. package/esm/adb/client.js +243 -0
  11. package/esm/adb/client.js.map +1 -0
  12. package/esm/adb/connection.d.ts +47 -0
  13. package/esm/adb/connection.d.ts.map +1 -0
  14. package/esm/{connection.js → adb/connection.js} +35 -31
  15. package/esm/adb/connection.js.map +1 -0
  16. package/esm/adb/index.d.ts +4 -0
  17. package/esm/adb/index.d.ts.map +1 -0
  18. package/esm/adb/index.js +4 -0
  19. package/esm/adb/index.js.map +1 -0
  20. package/esm/adb/options/1_16.d.ts +8 -0
  21. package/esm/adb/options/1_16.d.ts.map +1 -0
  22. package/esm/adb/options/1_16.js +20 -0
  23. package/esm/adb/options/1_16.js.map +1 -0
  24. package/esm/adb/options/1_22.d.ts +8 -0
  25. package/esm/adb/options/1_22.d.ts.map +1 -0
  26. package/esm/adb/options/1_22.js +17 -0
  27. package/esm/adb/options/1_22.js.map +1 -0
  28. package/esm/adb/options/index.d.ts +4 -0
  29. package/esm/adb/options/index.d.ts.map +1 -0
  30. package/esm/adb/options/index.js +4 -0
  31. package/esm/adb/options/index.js.map +1 -0
  32. package/esm/adb/options/types.d.ts +24 -0
  33. package/esm/adb/options/types.d.ts.map +1 -0
  34. package/esm/adb/options/types.js +37 -0
  35. package/esm/adb/options/types.js.map +1 -0
  36. package/esm/codec.js +2 -2
  37. package/esm/codec.js.map +1 -1
  38. package/esm/control/back-or-screen-on.d.ts +3 -0
  39. package/esm/control/back-or-screen-on.d.ts.map +1 -0
  40. package/esm/control/back-or-screen-on.js +2 -0
  41. package/esm/control/back-or-screen-on.js.map +1 -0
  42. package/esm/control/hover-helper.d.ts +18 -0
  43. package/esm/control/hover-helper.d.ts.map +1 -0
  44. package/esm/control/hover-helper.js +44 -0
  45. package/esm/control/hover-helper.js.map +1 -0
  46. package/esm/control/index.d.ts +12 -0
  47. package/esm/control/index.d.ts.map +1 -0
  48. package/esm/control/index.js +12 -0
  49. package/esm/control/index.js.map +1 -0
  50. package/esm/control/inject-keycode.d.ts +61 -0
  51. package/esm/control/inject-keycode.d.ts.map +1 -0
  52. package/esm/control/inject-keycode.js +62 -0
  53. package/esm/control/inject-keycode.js.map +1 -0
  54. package/esm/control/inject-scroll.d.ts +3 -0
  55. package/esm/control/inject-scroll.d.ts.map +1 -0
  56. package/esm/control/inject-scroll.js +2 -0
  57. package/esm/control/inject-scroll.js.map +1 -0
  58. package/esm/control/inject-text.d.ts +9 -0
  59. package/esm/control/inject-text.d.ts.map +1 -0
  60. package/esm/control/inject-text.js +7 -0
  61. package/esm/control/inject-text.js.map +1 -0
  62. package/esm/control/inject-touch.d.ts +38 -0
  63. package/esm/control/inject-touch.d.ts.map +1 -0
  64. package/esm/control/inject-touch.js +63 -0
  65. package/esm/control/inject-touch.js.map +1 -0
  66. package/esm/control/rotate-device.d.ts +7 -0
  67. package/esm/control/rotate-device.d.ts.map +1 -0
  68. package/esm/control/rotate-device.js +5 -0
  69. package/esm/control/rotate-device.js.map +1 -0
  70. package/esm/control/serializer.d.ts +34 -0
  71. package/esm/control/serializer.d.ts.map +1 -0
  72. package/esm/control/serializer.js +79 -0
  73. package/esm/control/serializer.js.map +1 -0
  74. package/esm/control/set-clipboard.d.ts +3 -0
  75. package/esm/control/set-clipboard.d.ts.map +1 -0
  76. package/esm/control/set-clipboard.js +2 -0
  77. package/esm/control/set-clipboard.js.map +1 -0
  78. package/esm/control/set-screen-power-mode.d.ts +12 -0
  79. package/esm/control/set-screen-power-mode.d.ts.map +1 -0
  80. package/esm/control/set-screen-power-mode.js +12 -0
  81. package/esm/control/set-screen-power-mode.js.map +1 -0
  82. package/esm/control/type.d.ts +15 -0
  83. package/esm/control/type.d.ts.map +1 -0
  84. package/esm/control/type.js +19 -0
  85. package/esm/control/type.js.map +1 -0
  86. package/esm/device-message/ack-clipboard.d.ts +9 -0
  87. package/esm/device-message/ack-clipboard.d.ts.map +1 -0
  88. package/esm/device-message/ack-clipboard.js +6 -0
  89. package/esm/device-message/ack-clipboard.js.map +1 -0
  90. package/esm/device-message/clipboard.d.ts +10 -0
  91. package/esm/device-message/clipboard.d.ts.map +1 -0
  92. package/esm/device-message/clipboard.js +7 -0
  93. package/esm/device-message/clipboard.js.map +1 -0
  94. package/esm/device-message/index.d.ts +5 -0
  95. package/esm/device-message/index.d.ts.map +1 -0
  96. package/esm/device-message/index.js +5 -0
  97. package/esm/device-message/index.js.map +1 -0
  98. package/esm/device-message/stream.d.ts +8 -0
  99. package/esm/device-message/stream.d.ts.map +1 -0
  100. package/esm/device-message/stream.js +20 -0
  101. package/esm/device-message/stream.js.map +1 -0
  102. package/esm/device-message/type.d.ts +5 -0
  103. package/esm/device-message/type.d.ts.map +1 -0
  104. package/esm/device-message/type.js +7 -0
  105. package/esm/device-message/type.js.map +1 -0
  106. package/esm/index.d.ts +3 -6
  107. package/esm/index.d.ts.map +1 -1
  108. package/esm/index.js +3 -6
  109. package/esm/index.js.map +1 -1
  110. package/esm/options/1_16/codec-options.d.ts +20 -0
  111. package/esm/options/1_16/codec-options.d.ts.map +1 -0
  112. package/esm/options/1_16/codec-options.js +26 -0
  113. package/esm/options/1_16/codec-options.js.map +1 -0
  114. package/esm/options/1_16/h264-configuration.d.ts +49 -0
  115. package/esm/options/1_16/h264-configuration.d.ts.map +1 -0
  116. package/esm/options/1_16/h264-configuration.js +414 -0
  117. package/esm/options/1_16/h264-configuration.js.map +1 -0
  118. package/esm/options/1_16/index.d.ts +4 -110
  119. package/esm/options/1_16/index.d.ts.map +1 -1
  120. package/esm/options/1_16/index.js +4 -226
  121. package/esm/options/1_16/index.js.map +1 -1
  122. package/esm/options/1_16/options.d.ts +94 -0
  123. package/esm/options/1_16/options.d.ts.map +1 -0
  124. package/esm/options/1_16/options.js +190 -0
  125. package/esm/options/1_16/options.js.map +1 -0
  126. package/esm/options/1_16/scroll.d.ts +27 -0
  127. package/esm/options/1_16/scroll.d.ts.map +1 -0
  128. package/esm/options/1_16/scroll.js +56 -0
  129. package/esm/options/1_16/scroll.js.map +1 -0
  130. package/esm/options/1_16/sps.d.ts +1 -1
  131. package/esm/options/1_16/sps.d.ts.map +1 -1
  132. package/esm/options/1_16/sps.js +25 -17
  133. package/esm/options/1_16/sps.js.map +1 -1
  134. package/esm/options/1_18.d.ts +8 -8
  135. package/esm/options/1_18.d.ts.map +1 -1
  136. package/esm/options/1_18.js +7 -7
  137. package/esm/options/1_18.js.map +1 -1
  138. package/esm/options/1_21.d.ts +13 -2
  139. package/esm/options/1_21.d.ts.map +1 -1
  140. package/esm/options/1_21.js +14 -3
  141. package/esm/options/1_21.js.map +1 -1
  142. package/esm/options/1_22/index.d.ts +3 -0
  143. package/esm/options/1_22/index.d.ts.map +1 -0
  144. package/esm/options/1_22/index.js +3 -0
  145. package/esm/options/1_22/index.js.map +1 -0
  146. package/esm/options/1_22/options.d.ts +29 -0
  147. package/esm/options/1_22/options.d.ts.map +1 -0
  148. package/esm/options/1_22/options.js +26 -0
  149. package/esm/options/1_22/options.js.map +1 -0
  150. package/esm/options/1_22/scroll.d.ts +17 -0
  151. package/esm/options/1_22/scroll.d.ts.map +1 -0
  152. package/esm/options/1_22/scroll.js +15 -0
  153. package/esm/options/1_22/scroll.js.map +1 -0
  154. package/esm/options/1_23.d.ts +5 -5
  155. package/esm/options/1_23.d.ts.map +1 -1
  156. package/esm/options/1_23.js +7 -6
  157. package/esm/options/1_23.js.map +1 -1
  158. package/esm/options/1_24.d.ts +1 -1
  159. package/esm/options/1_24.d.ts.map +1 -1
  160. package/esm/options/1_24.js.map +1 -1
  161. package/esm/options/1_25/index.d.ts +3 -0
  162. package/esm/options/1_25/index.d.ts.map +1 -0
  163. package/esm/options/1_25/index.js +3 -0
  164. package/esm/options/1_25/index.js.map +1 -0
  165. package/esm/options/1_25/options.d.ts +6 -0
  166. package/esm/options/1_25/options.d.ts.map +1 -0
  167. package/esm/options/1_25/options.js +8 -0
  168. package/esm/options/1_25/options.js.map +1 -0
  169. package/esm/options/1_25/scroll.d.ts +19 -0
  170. package/esm/options/1_25/scroll.d.ts.map +1 -0
  171. package/esm/options/1_25/scroll.js +33 -0
  172. package/esm/options/1_25/scroll.js.map +1 -0
  173. package/esm/options/index.d.ts +5 -4
  174. package/esm/options/index.d.ts.map +1 -1
  175. package/esm/options/index.js +5 -4
  176. package/esm/options/index.js.map +1 -1
  177. package/esm/options/types.d.ts +47 -0
  178. package/esm/options/types.d.ts.map +1 -0
  179. package/esm/options/types.js +18 -0
  180. package/esm/options/types.js.map +1 -0
  181. package/package.json +32 -25
  182. package/scripts/fetch-server.cjs +19 -9
  183. package/src/adb/client.ts +345 -0
  184. package/src/adb/connection.ts +192 -0
  185. package/src/adb/index.ts +3 -0
  186. package/src/adb/options/1_16.ts +30 -0
  187. package/src/adb/options/1_22.ts +26 -0
  188. package/src/adb/options/index.ts +3 -0
  189. package/src/adb/options/types.ts +75 -0
  190. package/src/control/back-or-screen-on.ts +4 -0
  191. package/src/control/hover-helper.ts +56 -0
  192. package/src/control/index.ts +11 -0
  193. package/src/control/inject-keycode.ts +72 -0
  194. package/src/control/inject-scroll.ts +4 -0
  195. package/src/control/inject-text.ts +12 -0
  196. package/src/control/inject-touch.ts +78 -0
  197. package/src/control/rotate-device.ts +10 -0
  198. package/src/control/serializer.ts +151 -0
  199. package/src/control/set-clipboard.ts +4 -0
  200. package/src/control/set-screen-power-mode.ts +17 -0
  201. package/src/control/type.ts +17 -0
  202. package/src/device-message/ack-clipboard.ts +10 -0
  203. package/src/device-message/clipboard.ts +11 -0
  204. package/src/device-message/index.ts +4 -0
  205. package/src/device-message/stream.ts +29 -0
  206. package/src/device-message/type.ts +5 -0
  207. package/src/index.ts +3 -6
  208. package/src/options/1_16/codec-options.ts +55 -0
  209. package/src/options/1_16/h264-configuration.ts +485 -0
  210. package/src/options/1_16/index.ts +4 -345
  211. package/src/options/1_16/options.ts +339 -0
  212. package/src/options/1_16/scroll.ts +76 -0
  213. package/src/options/1_18.ts +24 -12
  214. package/src/options/1_21.ts +34 -6
  215. package/src/options/1_22/index.ts +2 -0
  216. package/src/options/1_22/options.ts +58 -0
  217. package/src/options/1_22/scroll.ts +26 -0
  218. package/src/options/1_23.ts +33 -19
  219. package/src/options/1_24.ts +3 -2
  220. package/src/options/1_25/index.ts +2 -0
  221. package/src/options/1_25/options.ts +12 -0
  222. package/src/options/1_25/scroll.ts +52 -0
  223. package/src/options/index.ts +5 -4
  224. package/src/options/types.ts +102 -0
  225. package/tsconfig.build.json +3 -0
  226. package/tsconfig.build.tsbuildinfo +1 -0
  227. package/esm/client.d.ts +0 -48
  228. package/esm/client.d.ts.map +0 -1
  229. package/esm/client.js +0 -341
  230. package/esm/client.js.map +0 -1
  231. package/esm/connection.d.ts +0 -37
  232. package/esm/connection.d.ts.map +0 -1
  233. package/esm/connection.js.map +0 -1
  234. package/esm/decoder/index.d.ts +0 -4
  235. package/esm/decoder/index.d.ts.map +0 -1
  236. package/esm/decoder/index.js +0 -4
  237. package/esm/decoder/index.js.map +0 -1
  238. package/esm/decoder/tinyh264/index.d.ts +0 -20
  239. package/esm/decoder/tinyh264/index.d.ts.map +0 -1
  240. package/esm/decoder/tinyh264/index.js +0 -86
  241. package/esm/decoder/tinyh264/index.js.map +0 -1
  242. package/esm/decoder/tinyh264/worker.d.ts +0 -2
  243. package/esm/decoder/tinyh264/worker.d.ts.map +0 -1
  244. package/esm/decoder/tinyh264/worker.js +0 -3
  245. package/esm/decoder/tinyh264/worker.js.map +0 -1
  246. package/esm/decoder/tinyh264/wrapper.d.ts +0 -21
  247. package/esm/decoder/tinyh264/wrapper.d.ts.map +0 -1
  248. package/esm/decoder/tinyh264/wrapper.js +0 -68
  249. package/esm/decoder/tinyh264/wrapper.js.map +0 -1
  250. package/esm/decoder/types.d.ts +0 -28
  251. package/esm/decoder/types.d.ts.map +0 -1
  252. package/esm/decoder/types.js +0 -2
  253. package/esm/decoder/types.js.map +0 -1
  254. package/esm/decoder/web-codecs/index.d.ts +0 -22
  255. package/esm/decoder/web-codecs/index.d.ts.map +0 -1
  256. package/esm/decoder/web-codecs/index.js +0 -81
  257. package/esm/decoder/web-codecs/index.js.map +0 -1
  258. package/esm/message.d.ts +0 -98
  259. package/esm/message.d.ts.map +0 -1
  260. package/esm/message.js +0 -98
  261. package/esm/message.js.map +0 -1
  262. package/esm/options/1_22.d.ts +0 -43
  263. package/esm/options/1_22.d.ts.map +0 -1
  264. package/esm/options/1_22.js +0 -43
  265. package/esm/options/1_22.js.map +0 -1
  266. package/esm/options/common.d.ts +0 -34
  267. package/esm/options/common.d.ts.map +0 -1
  268. package/esm/options/common.js +0 -16
  269. package/esm/options/common.js.map +0 -1
  270. package/esm/push-server.d.ts +0 -6
  271. package/esm/push-server.d.ts.map +0 -1
  272. package/esm/push-server.js +0 -16
  273. package/esm/push-server.js.map +0 -1
  274. package/esm/utils.d.ts +0 -2
  275. package/esm/utils.d.ts.map +0 -1
  276. package/esm/utils.js +0 -6
  277. package/esm/utils.js.map +0 -1
  278. package/src/client.ts +0 -435
  279. package/src/connection.ts +0 -148
  280. package/src/decoder/index.ts +0 -3
  281. package/src/decoder/tinyh264/index.ts +0 -112
  282. package/src/decoder/tinyh264/types.d.ts +0 -137
  283. package/src/decoder/tinyh264/worker.ts +0 -2
  284. package/src/decoder/tinyh264/wrapper.ts +0 -89
  285. package/src/decoder/types.ts +0 -35
  286. package/src/decoder/web-codecs/index.ts +0 -99
  287. package/src/message.ts +0 -113
  288. package/src/options/1_16/sps.ts +0 -300
  289. package/src/options/1_22.ts +0 -78
  290. package/src/options/common.ts +0 -66
  291. package/src/push-server.ts +0 -24
  292. package/src/utils.ts +0 -5
@@ -1,43 +0,0 @@
1
- import Struct from "@yume-chan/struct";
2
- import { ScrcpyClientForwardConnection, ScrcpyClientReverseConnection } from "../connection.js";
3
- import { ScrcpyInjectScrollControlMessage1_16 } from "./1_16/index.js";
4
- import { ScrcpyOptions1_21 } from "./1_21.js";
5
- export const ScrcpyInjectScrollControlMessage1_22 = new Struct()
6
- .fields(ScrcpyInjectScrollControlMessage1_16)
7
- .int32("buttons");
8
- export class ScrcpyOptions1_22 extends ScrcpyOptions1_21 {
9
- constructor(init) {
10
- if (init.rawVideoStream) {
11
- // Set implied options for client-side processing
12
- init.sendDeviceMeta = false;
13
- init.sendFrameMeta = false;
14
- init.sendDummyByte = false;
15
- }
16
- super(init);
17
- }
18
- getDefaultValue() {
19
- return {
20
- ...super.getDefaultValue(),
21
- downsizeOnError: true,
22
- sendDeviceMeta: true,
23
- sendDummyByte: true,
24
- rawVideoStream: false,
25
- };
26
- }
27
- createConnection(device) {
28
- const options = {
29
- ...this.getDefaultValue(),
30
- ...this.value,
31
- };
32
- if (this.value.tunnelForward) {
33
- return new ScrcpyClientForwardConnection(device, options);
34
- }
35
- else {
36
- return new ScrcpyClientReverseConnection(device, options);
37
- }
38
- }
39
- serializeInjectScrollControlMessage(message) {
40
- return ScrcpyInjectScrollControlMessage1_22.serialize(message);
41
- }
42
- }
43
- //# sourceMappingURL=1_22.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"1_22.js","sourceRoot":"","sources":["../../src/options/1_22.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAA+B,MAAM,kBAAkB,CAAC;AAC7H,OAAO,EAAE,oCAAoC,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAA8B,MAAM,WAAW,CAAC;AA2B1E,MAAM,CAAC,MAAM,oCAAoC,GAC7C,IAAI,MAAM,EAAE;KACP,MAAM,CAAC,oCAAoC,CAAC;KAC5C,KAAK,CAAC,SAAS,CAAC,CAAC;AAI1B,MAAM,OAAO,iBAA2E,SAAQ,iBAAoB;IAChH,YAAmB,IAAoC;QACnD,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,iDAAiD;YACjD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;SAC9B;QAED,KAAK,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAEkB,eAAe;QAC9B,OAAO;YACH,GAAG,KAAK,CAAC,eAAe,EAAE;YAC1B,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,KAAK;SACxB,CAAC;IACN,CAAC;IAEe,gBAAgB,CAAC,MAAW;QACxC,MAAM,OAAO,GAAG;YACZ,GAAG,IAAI,CAAC,eAAe,EAAE;YACzB,GAAG,IAAI,CAAC,KAAK;SAChB,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC1B,OAAO,IAAI,6BAA6B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAC7D;aAAM;YACH,OAAO,IAAI,6BAA6B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAC7D;IACL,CAAC;IAEe,mCAAmC,CAC/C,OAA6C;QAE7C,OAAO,oCAAoC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;CACJ"}
@@ -1,34 +0,0 @@
1
- import type { Adb, TransformStream } from "@yume-chan/adb";
2
- import type { ScrcpyClientConnection } from "../connection.js";
3
- import type { H264Configuration } from "../decoder/index.js";
4
- import type { ScrcpyControlMessageType } from "../message.js";
5
- import type { ScrcpyBackOrScreenOnEvent1_18 } from "./1_18.js";
6
- import type { ScrcpyInjectScrollControlMessage1_22 } from "./1_22.js";
7
- export declare const DEFAULT_SERVER_PATH = "/data/local/tmp/scrcpy-server.jar";
8
- export interface ScrcpyOptionValue {
9
- toOptionValue(): string | undefined;
10
- }
11
- export declare function isScrcpyOptionValue(value: any): value is ScrcpyOptionValue;
12
- export declare function toScrcpyOptionValue<T>(value: any, empty: T): string | T;
13
- export interface VideoStreamConfigurationPacket {
14
- type: 'configuration';
15
- data: H264Configuration;
16
- }
17
- export interface VideoStreamFramePacket {
18
- type: 'frame';
19
- keyframe?: boolean | undefined;
20
- pts?: bigint | undefined;
21
- data: Uint8Array;
22
- }
23
- export declare type VideoStreamPacket = VideoStreamConfigurationPacket | VideoStreamFramePacket;
24
- export interface ScrcpyOptions<T> {
25
- value: Partial<T>;
26
- formatServerArguments(): string[];
27
- getOutputEncoderNameRegex(): RegExp;
28
- createConnection(adb: Adb): ScrcpyClientConnection;
29
- createVideoStreamTransformer(): TransformStream<Uint8Array, VideoStreamPacket>;
30
- getControlMessageTypes(): ScrcpyControlMessageType[];
31
- serializeBackOrScreenOnControlMessage(message: ScrcpyBackOrScreenOnEvent1_18): Uint8Array | undefined;
32
- serializeInjectScrollControlMessage(message: ScrcpyInjectScrollControlMessage1_22): Uint8Array;
33
- }
34
- //# sourceMappingURL=common.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/options/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,WAAW,CAAC;AAEtE,eAAO,MAAM,mBAAmB,sCAAsC,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAC9B,aAAa,IAAI,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,iBAAiB,CAI1E;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,CAUvE;AAED,MAAM,WAAW,8BAA8B;IAC3C,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,UAAU,CAAC;CACpB;AAED,oBAAY,iBAAiB,GAAG,8BAA8B,GAAG,sBAAsB,CAAC;AAExF,MAAM,WAAW,aAAa,CAAC,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAElB,qBAAqB,IAAI,MAAM,EAAE,CAAC;IAElC,yBAAyB,IAAI,MAAM,CAAC;IAEpC,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,sBAAsB,CAAC;IAEnD,4BAA4B,IAAI,eAAe,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAE/E,sBAAsB,IAAI,wBAAwB,EAAE,CAAC;IAErD,qCAAqC,CACjC,OAAO,EAAE,6BAA6B,GACvC,UAAU,GAAG,SAAS,CAAC;IAE1B,mCAAmC,CAC/B,OAAO,EAAE,oCAAoC,GAC9C,UAAU,CAAC;CACjB"}
@@ -1,16 +0,0 @@
1
- export const DEFAULT_SERVER_PATH = '/data/local/tmp/scrcpy-server.jar';
2
- export function isScrcpyOptionValue(value) {
3
- return typeof value === 'object' &&
4
- value !== null &&
5
- typeof value.toOptionValue === 'function';
6
- }
7
- export function toScrcpyOptionValue(value, empty) {
8
- if (isScrcpyOptionValue(value)) {
9
- value = value.toOptionValue();
10
- }
11
- if (value === undefined) {
12
- return empty;
13
- }
14
- return `${value}`;
15
- }
16
- //# sourceMappingURL=common.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/options/common.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,mBAAmB,GAAG,mCAAmC,CAAC;AAMvE,MAAM,UAAU,mBAAmB,CAAC,KAAU;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ;QAC5B,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,CAAC,aAAa,KAAK,UAAU,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAI,KAAU,EAAE,KAAQ;IACvD,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;QAC5B,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;KACjC;IAED,IAAI,KAAK,KAAK,SAAS,EAAE;QACrB,OAAO,KAAK,CAAC;KAChB;IAED,OAAO,GAAG,KAAK,EAAE,CAAC;AACtB,CAAC"}
@@ -1,6 +0,0 @@
1
- import { WrapWritableStream, type Adb } from "@yume-chan/adb";
2
- export interface PushServerOptions {
3
- path?: string;
4
- }
5
- export declare function pushServer(device: Adb, options?: PushServerOptions): WrapWritableStream<Uint8Array>;
6
- //# sourceMappingURL=push-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"push-server.d.ts","sourceRoot":"","sources":["../src/push-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,GAAG,EAAgB,MAAM,gBAAgB,CAAC;AAG5E,MAAM,WAAW,iBAAiB;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,CACtB,MAAM,EAAE,GAAG,EACX,OAAO,GAAE,iBAAsB,kCAclC"}
@@ -1,16 +0,0 @@
1
- import { WrapWritableStream } from "@yume-chan/adb";
2
- import { DEFAULT_SERVER_PATH } from "./options/index.js";
3
- export function pushServer(device, options = {}) {
4
- const { path = DEFAULT_SERVER_PATH } = options;
5
- let sync;
6
- return new WrapWritableStream({
7
- async start() {
8
- sync = await device.sync();
9
- return sync.write(path);
10
- },
11
- async close() {
12
- await sync.dispose();
13
- },
14
- });
15
- }
16
- //# sourceMappingURL=push-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"push-server.js","sourceRoot":"","sources":["../src/push-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA0B,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAMzD,MAAM,UAAU,UAAU,CACtB,MAAW,EACX,UAA6B,EAAE;IAE/B,MAAM,EAAE,IAAI,GAAG,mBAAmB,EAAE,GAAG,OAAO,CAAC;IAE/C,IAAI,IAAc,CAAC;IACnB,OAAO,IAAI,kBAAkB,CAAa;QACtC,KAAK,CAAC,KAAK;YACP,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,KAAK;YACP,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}
package/esm/utils.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export declare function delay(time: number): Promise<void>;
2
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjD"}
package/esm/utils.js DELETED
@@ -1,6 +0,0 @@
1
- export function delay(time) {
2
- return new Promise(resolve => {
3
- globalThis.setTimeout(resolve, time);
4
- });
5
- }
6
- //# sourceMappingURL=utils.js.map
package/esm/utils.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,KAAK,CAAC,IAAY;IAC9B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACxB,UAAkB,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACP,CAAC"}
package/src/client.ts DELETED
@@ -1,435 +0,0 @@
1
- import { AbortController, AdbBufferedStream, AdbSubprocessNoneProtocol, DecodeUtf8Stream, InspectStream, ReadableStream, TransformStream, WritableStream, type Adb, type AdbSocket, type AdbSubprocessProtocol, type WritableStreamDefaultWriter } from '@yume-chan/adb';
2
- import { EventEmitter } from '@yume-chan/event';
3
- import Struct from '@yume-chan/struct';
4
- import { AndroidMotionEventAction, ScrcpyControlMessageType, ScrcpyInjectKeyCodeControlMessage, ScrcpyInjectTextControlMessage, ScrcpyInjectTouchControlMessage, ScrcpySimpleControlMessage, type AndroidKeyEventAction } from './message.js';
5
- import type { ScrcpyInjectScrollControlMessage1_22, ScrcpyOptions, VideoStreamPacket } from "./options/index.js";
6
-
7
- function* splitLines(text: string): Generator<string, void, void> {
8
- let start = 0;
9
-
10
- while (true) {
11
- const index = text.indexOf('\n', start);
12
- if (index === -1) {
13
- return;
14
- }
15
-
16
- const line = text.substring(start, index);
17
- yield line;
18
-
19
- start = index + 1;
20
- }
21
- }
22
-
23
- class SplitLinesStream extends TransformStream<string, string>{
24
- constructor() {
25
- super({
26
- transform(chunk, controller) {
27
- for (const line of splitLines(chunk)) {
28
- if (line === '') {
29
- continue;
30
- }
31
- controller.enqueue(line);
32
- }
33
- },
34
- });
35
- }
36
- }
37
-
38
- class ArrayToStream<T> extends ReadableStream<T>{
39
- private array!: T[];
40
- private index = 0;
41
-
42
- constructor(array: T[]) {
43
- super({
44
- start: async () => {
45
- await Promise.resolve();
46
- this.array = array;
47
- },
48
- pull: (controller) => {
49
- if (this.index < this.array.length) {
50
- controller.enqueue(this.array[this.index]!);
51
- this.index += 1;
52
- } else {
53
- controller.close();
54
- }
55
- },
56
- });
57
- }
58
- }
59
-
60
- class ConcatStream<T> extends ReadableStream<T>{
61
- private streams!: ReadableStream<T>[];
62
- private index = 0;
63
- private reader!: ReadableStreamDefaultReader<T>;
64
-
65
- constructor(...streams: ReadableStream<T>[]) {
66
- super({
67
- start: async (controller) => {
68
- await Promise.resolve();
69
-
70
- this.streams = streams;
71
- this.advance(controller);
72
- },
73
- pull: async (controller) => {
74
- const result = await this.reader.read();
75
- if (!result.done) {
76
- controller.enqueue(result.value);
77
- return;
78
- }
79
- this.advance(controller);
80
- }
81
- });
82
- }
83
-
84
- private advance(controller: ReadableStreamDefaultController<T>) {
85
- if (this.index < this.streams.length) {
86
- this.reader = this.streams[this.index]!.getReader();
87
- this.index += 1;
88
- } else {
89
- controller.close();
90
- }
91
- }
92
- }
93
-
94
- const ClipboardMessage =
95
- new Struct()
96
- .uint32('length')
97
- .string('content', { lengthField: 'length' });
98
-
99
- export class ScrcpyClient {
100
- /**
101
- * This method will modify the given `options`,
102
- * so don't reuse it elsewhere.
103
- */
104
- public static async getEncoders(
105
- adb: Adb,
106
- path: string,
107
- version: string,
108
- options: ScrcpyOptions<any>
109
- ): Promise<string[]> {
110
- // Provide an invalid encoder name
111
- // So the server will return all available encoders
112
- options.value.encoderName = '_';
113
- // Disable control for faster connection in 1.22+
114
- options.value.control = false;
115
- options.value.sendDeviceMeta = false;
116
- options.value.sendDummyByte = false;
117
-
118
- // Scrcpy server will open connections, before initializing encoder
119
- // Thus although an invalid encoder name is given, the start process will success
120
- const client = await ScrcpyClient.start(adb, path, version, options);
121
-
122
- const encoderNameRegex = options.getOutputEncoderNameRegex();
123
- const encoders: string[] = [];
124
- await client.stdout.pipeTo(new WritableStream({
125
- write(line) {
126
- const match = line.match(encoderNameRegex);
127
- if (match) {
128
- encoders.push(match[1]!);
129
- }
130
- },
131
- }));
132
-
133
- return encoders;
134
- }
135
-
136
- /**
137
- * This method will modify the given `options`,
138
- * so don't reuse it elsewhere.
139
- */
140
- public static async getDisplays(
141
- adb: Adb,
142
- path: string,
143
- version: string,
144
- options: ScrcpyOptions<any>
145
- ): Promise<number[]> {
146
- // Similar to `getEncoders`, pass an invalid option and parse the output
147
- options.value.displayId = -1;
148
-
149
- options.value.control = false;
150
- options.value.sendDeviceMeta = false;
151
- options.value.sendDummyByte = false;
152
-
153
- try {
154
- // Server will exit before opening connections when an invalid display id was given.
155
- await ScrcpyClient.start(adb, path, version, options);
156
- } catch (e) {
157
- if (e instanceof Error) {
158
- const output = (e as any).output as string[];
159
-
160
- const displayIdRegex = /\s+scrcpy --display (\d+)/;
161
- const displays: number[] = [];
162
- for (const line of output) {
163
- const match = line.match(displayIdRegex);
164
- if (match) {
165
- displays.push(Number.parseInt(match[1]!, 10));
166
- }
167
- }
168
- return displays;
169
- }
170
- }
171
-
172
- throw new Error('failed to get displays');
173
- }
174
-
175
- public static async start(
176
- adb: Adb,
177
- path: string,
178
- version: string,
179
- options: ScrcpyOptions<any>
180
- ) {
181
- const connection = options.createConnection(adb);
182
- let process: AdbSubprocessProtocol | undefined;
183
-
184
- try {
185
- await connection.initialize();
186
-
187
- process = await adb.subprocess.spawn(
188
- [
189
- // cspell: disable-next-line
190
- `CLASSPATH=${path}`,
191
- 'app_process',
192
- /* unused */ '/',
193
- 'com.genymobile.scrcpy.Server',
194
- version,
195
- ...options.formatServerArguments(),
196
- ],
197
- {
198
- // Scrcpy server doesn't split stdout and stderr,
199
- // so disable Shell Protocol to simplify processing
200
- protocols: [AdbSubprocessNoneProtocol],
201
- }
202
- );
203
-
204
- const stdout = process.stdout
205
- .pipeThrough(new DecodeUtf8Stream())
206
- .pipeThrough(new SplitLinesStream());
207
-
208
- // Read stdout, otherwise `process.exit` won't resolve.
209
- const output: string[] = [];
210
- const abortController = new AbortController();
211
- const pipe = stdout
212
- .pipeTo(new WritableStream({
213
- write(chunk) {
214
- output.push(chunk);
215
- }
216
- }), {
217
- signal: abortController.signal,
218
- preventCancel: true,
219
- })
220
- .catch(() => { });
221
-
222
- const result = await Promise.race([
223
- process.exit,
224
- connection.getStreams(),
225
- ]);
226
-
227
- if (typeof result === 'number') {
228
- const error = new Error('scrcpy server exited prematurely');
229
- (error as any).output = output;
230
- throw error;
231
- }
232
-
233
- abortController.abort();
234
- await pipe;
235
-
236
- const [videoStream, controlStream] = result;
237
- return new ScrcpyClient(
238
- adb,
239
- options,
240
- process,
241
- new ConcatStream(
242
- new ArrayToStream(output),
243
- stdout,
244
- ),
245
- videoStream,
246
- controlStream
247
- );
248
- } catch (e) {
249
- await process?.kill();
250
- throw e;
251
- } finally {
252
- connection.dispose();
253
- }
254
- }
255
-
256
- private _adb: Adb;
257
- public get adb() { return this._adb; }
258
-
259
- private options: ScrcpyOptions<any>;
260
- private process: AdbSubprocessProtocol;
261
-
262
- private _stdout: ReadableStream<string>;
263
- public get stdout() { return this._stdout; }
264
-
265
- public get exit() { return this.process.exit; }
266
-
267
- private _screenWidth: number | undefined;
268
- public get screenWidth() { return this._screenWidth; }
269
-
270
- private _screenHeight: number | undefined;
271
- public get screenHeight() { return this._screenHeight; }
272
-
273
- private _videoStream: ReadableStream<VideoStreamPacket>;
274
- public get videoStream() { return this._videoStream; }
275
-
276
- private _controlStreamWriter: WritableStreamDefaultWriter<Uint8Array> | undefined;
277
-
278
- private readonly clipboardChangeEvent = new EventEmitter<string>();
279
- public get onClipboardChange() { return this.clipboardChangeEvent.event; }
280
-
281
- private lastTouchMessage = 0;
282
-
283
- public constructor(
284
- adb: Adb,
285
- options: ScrcpyOptions<any>,
286
- process: AdbSubprocessProtocol,
287
- stdout: ReadableStream<string>,
288
- videoStream: AdbSocket,
289
- controlStream: AdbSocket | undefined,
290
- ) {
291
- this._adb = adb;
292
- this.options = options;
293
- this.process = process;
294
-
295
- this._stdout = stdout;
296
-
297
- this._videoStream = videoStream.readable
298
- .pipeThrough(options.createVideoStreamTransformer())
299
- .pipeThrough(new InspectStream(packet => {
300
- if (packet.type === 'configuration') {
301
- this._screenWidth = packet.data.croppedWidth;
302
- this._screenHeight = packet.data.croppedHeight;
303
- }
304
- }));
305
-
306
- if (controlStream) {
307
- const buffered = new AdbBufferedStream(controlStream);
308
- this._controlStreamWriter = controlStream.writable.getWriter();
309
- (async () => {
310
- try {
311
- while (true) {
312
- const type = await buffered.read(1);
313
- switch (type[0]) {
314
- case 0:
315
- const { content } = await ClipboardMessage.deserialize(buffered);
316
- this.clipboardChangeEvent.fire(content!);
317
- break;
318
- default:
319
- throw new Error('unknown control message type');
320
- }
321
- }
322
- } catch {
323
- // TODO: Scrcpy: handle error
324
- }
325
- })();
326
- }
327
- }
328
-
329
- private checkControlStream(caller: string) {
330
- if (!this._controlStreamWriter) {
331
- throw new Error(`${caller} called with control disabled`);
332
- }
333
-
334
- return this._controlStreamWriter;
335
- }
336
-
337
- private getControlMessageTypeValue(type: ScrcpyControlMessageType) {
338
- const list = this.options.getControlMessageTypes();
339
- const index = list.indexOf(type);
340
- if (index === -1) {
341
- throw new Error('Not supported');
342
- }
343
- return index;
344
- }
345
-
346
- public async injectKeyCode(message: Omit<ScrcpyInjectKeyCodeControlMessage, 'type'>) {
347
- const controlStream = this.checkControlStream('injectKeyCode');
348
-
349
- await controlStream.write(ScrcpyInjectKeyCodeControlMessage.serialize({
350
- ...message,
351
- type: this.getControlMessageTypeValue(ScrcpyControlMessageType.InjectKeycode),
352
- }));
353
- }
354
-
355
- public async injectText(text: string) {
356
- const controlStream = this.checkControlStream('injectText');
357
-
358
- await controlStream.write(ScrcpyInjectTextControlMessage.serialize({
359
- type: this.getControlMessageTypeValue(ScrcpyControlMessageType.InjectText),
360
- text,
361
- }));
362
- }
363
-
364
- public async injectTouch(message: Omit<ScrcpyInjectTouchControlMessage, 'type' | 'screenWidth' | 'screenHeight'>) {
365
- const controlStream = this.checkControlStream('injectTouch');
366
-
367
- if (!this.screenWidth || !this.screenHeight) {
368
- return;
369
- }
370
-
371
- // ADB streams are actually pretty low-bandwidth and laggy
372
- // Re-sample move events to avoid flooding the connection
373
-
374
- // TODO: Scrcpy: investigate how to throttle touch events
375
- // because 60FPS may still be too high
376
- const now = Date.now();
377
- if (now - this.lastTouchMessage < 16 &&
378
- [AndroidMotionEventAction.Move, AndroidMotionEventAction.HoverMove].includes(message.action)) {
379
- return;
380
- }
381
-
382
- this.lastTouchMessage = now;
383
- await controlStream.write(ScrcpyInjectTouchControlMessage.serialize({
384
- ...message,
385
- type: this.getControlMessageTypeValue(ScrcpyControlMessageType.InjectTouch),
386
- screenWidth: this.screenWidth,
387
- screenHeight: this.screenHeight,
388
- }));
389
- }
390
-
391
- public async injectScroll(message: Omit<ScrcpyInjectScrollControlMessage1_22, 'type' | 'screenWidth' | 'screenHeight'>) {
392
- const controlStream = this.checkControlStream('injectScroll');
393
-
394
- if (!this.screenWidth || !this.screenHeight) {
395
- return;
396
- }
397
-
398
- const buffer = this.options!.serializeInjectScrollControlMessage({
399
- ...message,
400
- type: this.getControlMessageTypeValue(ScrcpyControlMessageType.InjectScroll),
401
- screenWidth: this.screenWidth,
402
- screenHeight: this.screenHeight,
403
- });
404
- await controlStream.write(buffer);
405
- }
406
-
407
- public async pressBackOrTurnOnScreen(action: AndroidKeyEventAction) {
408
- const controlStream = this.checkControlStream('pressBackOrTurnOnScreen');
409
-
410
- const buffer = this.options!.serializeBackOrScreenOnControlMessage({
411
- type: this.getControlMessageTypeValue(ScrcpyControlMessageType.BackOrScreenOn),
412
- action,
413
- });
414
- if (buffer) {
415
- await controlStream.write(buffer);
416
- }
417
- }
418
-
419
- private async sendSimpleControlMessage(type: ScrcpyControlMessageType, name: string) {
420
- const controlStream = this.checkControlStream(name);
421
- const buffer = ScrcpySimpleControlMessage.serialize({
422
- type: this.getControlMessageTypeValue(type),
423
- });
424
- await controlStream.write(buffer);
425
- }
426
-
427
- public async rotateDevice() {
428
- await this.sendSimpleControlMessage(ScrcpyControlMessageType.RotateDevice, 'rotateDevice');
429
- }
430
-
431
- public async close() {
432
- // No need to close streams. Kill the process will destroy them from the other side.
433
- await this.process?.kill();
434
- }
435
- }