@yume-chan/scrcpy 0.0.17 → 0.0.19

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 (323) hide show
  1. package/CHANGELOG.json +39 -3
  2. package/CHANGELOG.md +22 -4
  3. package/LICENSE +1 -1
  4. package/README.md +149 -82
  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 +40 -39
  9. package/esm/adb/client.d.ts.map +1 -1
  10. package/esm/adb/client.js +223 -217
  11. package/esm/adb/client.js.map +1 -1
  12. package/esm/adb/connection.d.ts +48 -37
  13. package/esm/adb/connection.d.ts.map +1 -1
  14. package/esm/adb/connection.js +121 -101
  15. package/esm/adb/connection.js.map +1 -1
  16. package/esm/adb/index.d.ts +3 -3
  17. package/esm/adb/index.js +3 -3
  18. package/esm/adb/options/1_16.d.ts +7 -7
  19. package/esm/adb/options/1_16.d.ts.map +1 -1
  20. package/esm/adb/options/1_16.js +19 -19
  21. package/esm/adb/options/1_16.js.map +1 -1
  22. package/esm/adb/options/1_22.d.ts +7 -7
  23. package/esm/adb/options/1_22.d.ts.map +1 -1
  24. package/esm/adb/options/1_22.js +16 -16
  25. package/esm/adb/options/1_22.js.map +1 -1
  26. package/esm/adb/options/1_26.d.ts +9 -0
  27. package/esm/adb/options/1_26.d.ts.map +1 -0
  28. package/esm/adb/options/1_26.js +11 -0
  29. package/esm/adb/options/1_26.js.map +1 -0
  30. package/esm/adb/options/2_0.d.ts +8 -0
  31. package/esm/adb/options/2_0.d.ts.map +1 -0
  32. package/esm/adb/options/2_0.js +13 -0
  33. package/esm/adb/options/2_0.js.map +1 -0
  34. package/esm/adb/options/index.d.ts +3 -3
  35. package/esm/adb/options/index.js +3 -3
  36. package/esm/adb/options/types.d.ts +23 -22
  37. package/esm/adb/options/types.d.ts.map +1 -1
  38. package/esm/adb/options/types.js +36 -29
  39. package/esm/adb/options/types.js.map +1 -1
  40. package/esm/codec/av1.d.ts +33 -0
  41. package/esm/codec/av1.d.ts.map +1 -0
  42. package/esm/codec/av1.js +35 -0
  43. package/esm/codec/av1.js.map +1 -0
  44. package/esm/codec/h264.d.ts +98 -0
  45. package/esm/codec/h264.d.ts.map +1 -0
  46. package/esm/codec/h264.js +477 -0
  47. package/esm/codec/h264.js.map +1 -0
  48. package/esm/codec/h265.d.ts +36 -0
  49. package/esm/codec/h265.d.ts.map +1 -0
  50. package/esm/codec/h265.js +38 -0
  51. package/esm/codec/h265.js.map +1 -0
  52. package/esm/codec/index.d.ts +4 -0
  53. package/esm/codec/index.d.ts.map +1 -0
  54. package/esm/codec/index.js +4 -0
  55. package/esm/codec/index.js.map +1 -0
  56. package/esm/codec.d.ts +33 -33
  57. package/esm/codec.js +36 -36
  58. package/esm/control/back-or-screen-on.d.ts +3 -0
  59. package/esm/control/back-or-screen-on.d.ts.map +1 -0
  60. package/esm/control/back-or-screen-on.js +2 -0
  61. package/esm/control/back-or-screen-on.js.map +1 -0
  62. package/esm/control/basic.d.ts +5 -0
  63. package/esm/control/basic.d.ts.map +1 -0
  64. package/esm/control/basic.js +3 -0
  65. package/esm/control/basic.js.map +1 -0
  66. package/esm/control/hover-helper.d.ts +18 -0
  67. package/esm/control/hover-helper.d.ts.map +1 -0
  68. package/esm/control/hover-helper.js +44 -0
  69. package/esm/control/hover-helper.js.map +1 -0
  70. package/esm/control/index.d.ts +11 -7
  71. package/esm/control/index.d.ts.map +1 -1
  72. package/esm/control/index.js +11 -7
  73. package/esm/control/index.js.map +1 -1
  74. package/esm/control/inject-keycode.d.ts +194 -52
  75. package/esm/control/inject-keycode.d.ts.map +1 -1
  76. package/esm/control/inject-keycode.js +199 -53
  77. package/esm/control/inject-keycode.js.map +1 -1
  78. package/esm/control/inject-scroll.d.ts +3 -0
  79. package/esm/control/inject-scroll.d.ts.map +1 -0
  80. package/esm/control/inject-scroll.js +2 -0
  81. package/esm/control/inject-scroll.js.map +1 -0
  82. package/esm/control/inject-text.d.ts +8 -8
  83. package/esm/control/inject-text.d.ts.map +1 -1
  84. package/esm/control/inject-text.js +6 -6
  85. package/esm/control/inject-text.js.map +1 -1
  86. package/esm/control/inject-touch.d.ts +37 -29
  87. package/esm/control/inject-touch.d.ts.map +1 -1
  88. package/esm/control/inject-touch.js +62 -29
  89. package/esm/control/inject-touch.js.map +1 -1
  90. package/esm/control/rotate-device.d.ts +6 -6
  91. package/esm/control/rotate-device.d.ts.map +1 -1
  92. package/esm/control/rotate-device.js +3 -4
  93. package/esm/control/rotate-device.js.map +1 -1
  94. package/esm/control/serializer.d.ts +35 -22
  95. package/esm/control/serializer.d.ts.map +1 -1
  96. package/esm/control/serializer.js +82 -72
  97. package/esm/control/serializer.js.map +1 -1
  98. package/esm/control/set-clipboard.d.ts +3 -0
  99. package/esm/control/set-clipboard.d.ts.map +1 -0
  100. package/esm/control/set-clipboard.js +2 -0
  101. package/esm/control/set-clipboard.js.map +1 -0
  102. package/esm/control/set-screen-power-mode.d.ts +11 -11
  103. package/esm/control/set-screen-power-mode.d.ts.map +1 -1
  104. package/esm/control/set-screen-power-mode.js +11 -11
  105. package/esm/control/set-screen-power-mode.js.map +1 -1
  106. package/esm/control/simple.d.ts +5 -0
  107. package/esm/control/simple.d.ts.map +1 -0
  108. package/esm/control/simple.js +3 -0
  109. package/esm/control/simple.js.map +1 -0
  110. package/esm/control/type.d.ts +14 -14
  111. package/esm/control/type.js +18 -18
  112. package/esm/decoder.d.ts +2 -0
  113. package/esm/decoder.d.ts.map +1 -0
  114. package/esm/decoder.js +2 -0
  115. package/esm/decoder.js.map +1 -0
  116. package/esm/device-message/ack-clipboard.d.ts +9 -0
  117. package/esm/device-message/ack-clipboard.d.ts.map +1 -0
  118. package/esm/device-message/ack-clipboard.js +6 -0
  119. package/esm/device-message/ack-clipboard.js.map +1 -0
  120. package/esm/device-message/clipboard.d.ts +9 -9
  121. package/esm/device-message/clipboard.d.ts.map +1 -1
  122. package/esm/device-message/clipboard.js +6 -6
  123. package/esm/device-message/clipboard.js.map +1 -1
  124. package/esm/device-message/index.d.ts +4 -3
  125. package/esm/device-message/index.d.ts.map +1 -1
  126. package/esm/device-message/index.js +4 -3
  127. package/esm/device-message/index.js.map +1 -1
  128. package/esm/device-message/stream.d.ts +7 -6
  129. package/esm/device-message/stream.d.ts.map +1 -1
  130. package/esm/device-message/stream.js +19 -15
  131. package/esm/device-message/stream.js.map +1 -1
  132. package/esm/device-message/type.d.ts +4 -4
  133. package/esm/device-message/type.js +6 -6
  134. package/esm/index.d.ts +5 -5
  135. package/esm/index.js +5 -5
  136. package/esm/options/1.17.d.ts +3 -0
  137. package/esm/options/1.17.d.ts.map +1 -0
  138. package/esm/options/1.17.js +2 -0
  139. package/esm/options/1.17.js.map +1 -0
  140. package/esm/options/1_16/codec-options.d.ts +20 -18
  141. package/esm/options/1_16/codec-options.d.ts.map +1 -1
  142. package/esm/options/1_16/codec-options.js +25 -26
  143. package/esm/options/1_16/codec-options.js.map +1 -1
  144. package/esm/options/1_16/float-to-uint16.d.ts +5 -0
  145. package/esm/options/1_16/float-to-uint16.d.ts.map +1 -0
  146. package/esm/options/1_16/float-to-uint16.js +27 -0
  147. package/esm/options/1_16/float-to-uint16.js.map +1 -0
  148. package/esm/options/1_16/h264-configuration.d.ts +49 -0
  149. package/esm/options/1_16/h264-configuration.d.ts.map +1 -0
  150. package/esm/options/1_16/h264-configuration.js +414 -0
  151. package/esm/options/1_16/h264-configuration.js.map +1 -0
  152. package/esm/options/1_16/index.d.ts +4 -3
  153. package/esm/options/1_16/index.d.ts.map +1 -1
  154. package/esm/options/1_16/index.js +4 -3
  155. package/esm/options/1_16/index.js.map +1 -1
  156. package/esm/options/1_16/init.d.ts +66 -0
  157. package/esm/options/1_16/init.d.ts.map +1 -0
  158. package/esm/options/1_16/init.js +16 -0
  159. package/esm/options/1_16/init.js.map +1 -0
  160. package/esm/options/1_16/message.d.ts +32 -0
  161. package/esm/options/1_16/message.d.ts.map +1 -0
  162. package/esm/options/1_16/message.js +37 -0
  163. package/esm/options/1_16/message.js.map +1 -0
  164. package/esm/options/1_16/options.d.ts +102 -96
  165. package/esm/options/1_16/options.d.ts.map +1 -1
  166. package/esm/options/1_16/options.js +189 -187
  167. package/esm/options/1_16/options.js.map +1 -1
  168. package/esm/options/1_16/scroll.d.ts +28 -0
  169. package/esm/options/1_16/scroll.d.ts.map +1 -0
  170. package/esm/options/1_16/scroll.js +56 -0
  171. package/esm/options/1_16/scroll.js.map +1 -0
  172. package/esm/options/1_16/sps.d.ts +1 -1
  173. package/esm/options/1_16/sps.d.ts.map +1 -1
  174. package/esm/options/1_16/sps.js +25 -17
  175. package/esm/options/1_16/sps.js.map +1 -1
  176. package/esm/options/1_17.d.ts +32 -0
  177. package/esm/options/1_17.d.ts.map +1 -0
  178. package/esm/options/1_17.js +36 -0
  179. package/esm/options/1_17.js.map +1 -0
  180. package/esm/options/1_18.d.ts +21 -19
  181. package/esm/options/1_18.d.ts.map +1 -1
  182. package/esm/options/1_18.js +45 -45
  183. package/esm/options/1_18.js.map +1 -1
  184. package/esm/options/1_21.d.ts +22 -9
  185. package/esm/options/1_21.d.ts.map +1 -1
  186. package/esm/options/1_21.js +36 -25
  187. package/esm/options/1_21.js.map +1 -1
  188. package/esm/options/1_22/index.d.ts +3 -0
  189. package/esm/options/1_22/index.d.ts.map +1 -0
  190. package/esm/options/1_22/index.js +3 -0
  191. package/esm/options/1_22/index.js.map +1 -0
  192. package/esm/options/1_22/init.d.ts +17 -0
  193. package/esm/options/1_22/init.d.ts.map +1 -0
  194. package/esm/options/1_22/init.js +2 -0
  195. package/esm/options/1_22/init.js.map +1 -0
  196. package/esm/options/{1_22.d.ts → 1_22/options.d.ts} +30 -40
  197. package/esm/options/1_22/options.d.ts.map +1 -0
  198. package/esm/options/{1_22.js → 1_22/options.js} +26 -30
  199. package/esm/options/1_22/options.js.map +1 -0
  200. package/esm/options/1_22/scroll.d.ts +17 -0
  201. package/esm/options/1_22/scroll.d.ts.map +1 -0
  202. package/esm/options/1_22/scroll.js +15 -0
  203. package/esm/options/1_22/scroll.js.map +1 -0
  204. package/esm/options/1_23.d.ts +12 -11
  205. package/esm/options/1_23.d.ts.map +1 -1
  206. package/esm/options/1_23.js +34 -33
  207. package/esm/options/1_23.js.map +1 -1
  208. package/esm/options/1_24.d.ts +9 -8
  209. package/esm/options/1_24.d.ts.map +1 -1
  210. package/esm/options/1_24.js +12 -12
  211. package/esm/options/1_24.js.map +1 -1
  212. package/esm/options/1_25/index.d.ts +3 -0
  213. package/esm/options/1_25/index.d.ts.map +1 -0
  214. package/esm/options/1_25/index.js +3 -0
  215. package/esm/options/1_25/index.js.map +1 -0
  216. package/esm/options/1_25/options.d.ts +7 -0
  217. package/esm/options/1_25/options.d.ts.map +1 -0
  218. package/esm/options/1_25/options.js +8 -0
  219. package/esm/options/1_25/options.js.map +1 -0
  220. package/esm/options/1_25/scroll.d.ts +20 -0
  221. package/esm/options/1_25/scroll.d.ts.map +1 -0
  222. package/esm/options/1_25/scroll.js +33 -0
  223. package/esm/options/1_25/scroll.js.map +1 -0
  224. package/esm/options/1_26.d.ts +57 -0
  225. package/esm/options/1_26.d.ts.map +1 -0
  226. package/esm/options/1_26.js +67 -0
  227. package/esm/options/1_26.js.map +1 -0
  228. package/esm/options/2.d.ts +57 -0
  229. package/esm/options/2.d.ts.map +1 -0
  230. package/esm/options/2.js +67 -0
  231. package/esm/options/2.js.map +1 -0
  232. package/esm/options/2_0.d.ts +87 -0
  233. package/esm/options/2_0.d.ts.map +1 -0
  234. package/esm/options/2_0.js +175 -0
  235. package/esm/options/2_0.js.map +1 -0
  236. package/esm/options/codec.d.ts +52 -0
  237. package/esm/options/codec.d.ts.map +1 -0
  238. package/esm/options/codec.js +26 -0
  239. package/esm/options/codec.js.map +1 -0
  240. package/esm/options/index.d.ts +8 -7
  241. package/esm/options/index.d.ts.map +1 -1
  242. package/esm/options/index.js +8 -7
  243. package/esm/options/index.js.map +1 -1
  244. package/esm/options/latest.d.ts +12 -0
  245. package/esm/options/latest.d.ts.map +1 -0
  246. package/esm/options/latest.js +8 -0
  247. package/esm/options/latest.js.map +1 -0
  248. package/esm/options/types.d.ts +46 -44
  249. package/esm/options/types.d.ts.map +1 -1
  250. package/esm/options/types.js +17 -15
  251. package/esm/options/types.js.map +1 -1
  252. package/package.json +20 -12
  253. package/scripts/fetch-server.cjs +19 -9
  254. package/src/adb/client.ts +184 -147
  255. package/src/adb/connection.ts +95 -31
  256. package/src/adb/index.ts +3 -3
  257. package/src/adb/options/1_16.ts +15 -6
  258. package/src/adb/options/1_22.ts +12 -6
  259. package/src/adb/options/index.ts +3 -3
  260. package/src/adb/options/types.ts +34 -14
  261. package/src/control/back-or-screen-on.ts +4 -0
  262. package/src/control/hover-helper.ts +54 -0
  263. package/src/control/index.ts +11 -7
  264. package/src/control/inject-keycode.ts +203 -45
  265. package/src/control/inject-scroll.ts +4 -0
  266. package/src/control/inject-text.ts +7 -8
  267. package/src/control/inject-touch.ts +58 -14
  268. package/src/control/rotate-device.ts +7 -6
  269. package/src/control/serializer.ts +111 -43
  270. package/src/control/set-clipboard.ts +4 -0
  271. package/src/control/set-screen-power-mode.ts +7 -8
  272. package/src/device-message/ack-clipboard.ts +10 -0
  273. package/src/device-message/clipboard.ts +8 -8
  274. package/src/device-message/index.ts +4 -3
  275. package/src/device-message/stream.ts +17 -7
  276. package/src/index.ts +5 -5
  277. package/src/options/1_16/codec-options.ts +16 -11
  278. package/src/options/1_16/h264-configuration.ts +485 -0
  279. package/src/options/1_16/index.ts +4 -3
  280. package/src/options/1_16/options.ts +180 -130
  281. package/src/options/1_16/scroll.ts +74 -0
  282. package/src/options/1_18.ts +22 -12
  283. package/src/options/1_21.ts +30 -13
  284. package/src/options/1_22/index.ts +2 -0
  285. package/src/options/{1_22.ts → 1_22/options.ts} +9 -17
  286. package/src/options/1_22/scroll.ts +26 -0
  287. package/src/options/1_23.ts +30 -20
  288. package/src/options/1_24.ts +5 -3
  289. package/src/options/1_25/index.ts +2 -0
  290. package/src/options/1_25/options.ts +13 -0
  291. package/src/options/1_25/scroll.ts +49 -0
  292. package/src/options/index.ts +8 -7
  293. package/src/options/types.ts +36 -19
  294. package/tsconfig.build.json +1 -1
  295. package/tsconfig.build.tsbuildinfo +1 -1
  296. package/esm/decoder/index.d.ts +0 -28
  297. package/esm/decoder/index.d.ts.map +0 -1
  298. package/esm/decoder/index.js +0 -2
  299. package/esm/decoder/index.js.map +0 -1
  300. package/esm/decoder/tinyh264/index.d.ts +0 -20
  301. package/esm/decoder/tinyh264/index.d.ts.map +0 -1
  302. package/esm/decoder/tinyh264/index.js +0 -86
  303. package/esm/decoder/tinyh264/index.js.map +0 -1
  304. package/esm/decoder/tinyh264/worker.d.ts +0 -2
  305. package/esm/decoder/tinyh264/worker.d.ts.map +0 -1
  306. package/esm/decoder/tinyh264/worker.js +0 -3
  307. package/esm/decoder/tinyh264/worker.js.map +0 -1
  308. package/esm/decoder/tinyh264/wrapper.d.ts +0 -21
  309. package/esm/decoder/tinyh264/wrapper.d.ts.map +0 -1
  310. package/esm/decoder/tinyh264/wrapper.js +0 -74
  311. package/esm/decoder/tinyh264/wrapper.js.map +0 -1
  312. package/esm/decoder/types.d.ts +0 -2
  313. package/esm/decoder/types.d.ts.map +0 -1
  314. package/esm/decoder/types.js +0 -2
  315. package/esm/decoder/types.js.map +0 -1
  316. package/esm/decoder/web-codecs/index.d.ts +0 -22
  317. package/esm/decoder/web-codecs/index.d.ts.map +0 -1
  318. package/esm/decoder/web-codecs/index.js +0 -81
  319. package/esm/decoder/web-codecs/index.js.map +0 -1
  320. package/esm/options/1_22.d.ts.map +0 -1
  321. package/esm/options/1_22.js.map +0 -1
  322. package/src/options/1_16/sps.ts +0 -300
  323. package/tsconfig.test.tsbuildinfo +0 -1
@@ -1,11 +1,20 @@
1
- import type { Adb } from '@yume-chan/adb';
1
+ import type { Adb } from "@yume-chan/adb";
2
2
 
3
- import type { ScrcpyOptionsInit1_16 } from '../../options/index.js';
4
- import { AdbScrcpyConnection, AdbScrcpyConnectionOptions, AdbScrcpyForwardConnection, AdbScrcpyReverseConnection } from '../connection.js';
5
- import { AdbScrcpyOptionsBase } from './types.js';
3
+ import type { ScrcpyOptionsInit1_16 } from "../../options/index.js";
4
+ import type {
5
+ AdbScrcpyConnection,
6
+ AdbScrcpyConnectionOptions,
7
+ } from "../connection.js";
8
+ import {
9
+ AdbScrcpyForwardConnection,
10
+ AdbScrcpyReverseConnection,
11
+ } from "../connection.js";
6
12
 
7
- export class AdbScrcpyOptions1_16<T extends ScrcpyOptionsInit1_16 = ScrcpyOptionsInit1_16>
8
- extends AdbScrcpyOptionsBase<T> {
13
+ import { AdbScrcpyOptionsBase } from "./types.js";
14
+
15
+ export class AdbScrcpyOptions1_16<
16
+ T extends ScrcpyOptionsInit1_16 = ScrcpyOptionsInit1_16
17
+ > extends AdbScrcpyOptionsBase<T> {
9
18
  public override createConnection(adb: Adb): AdbScrcpyConnection {
10
19
  const options: AdbScrcpyConnectionOptions = {
11
20
  // Old versions always have control stream no matter what the option is
@@ -1,11 +1,17 @@
1
- import type { Adb } from '@yume-chan/adb';
1
+ import type { Adb } from "@yume-chan/adb";
2
2
 
3
- import type { ScrcpyOptionsInit1_22 } from '../../options/index.js';
4
- import { AdbScrcpyConnection, AdbScrcpyForwardConnection, AdbScrcpyReverseConnection } from '../connection.js';
5
- import { AdbScrcpyOptions1_16 } from './1_16.js';
3
+ import type { ScrcpyOptionsInit1_22 } from "../../options/index.js";
4
+ import type { AdbScrcpyConnection } from "../connection.js";
5
+ import {
6
+ AdbScrcpyForwardConnection,
7
+ AdbScrcpyReverseConnection,
8
+ } from "../connection.js";
6
9
 
7
- export class AdbScrcpyOptions1_22<T extends ScrcpyOptionsInit1_22 = ScrcpyOptionsInit1_22>
8
- extends AdbScrcpyOptions1_16<T> {
10
+ import { AdbScrcpyOptions1_16 } from "./1_16.js";
11
+
12
+ export class AdbScrcpyOptions1_22<
13
+ T extends ScrcpyOptionsInit1_22 = ScrcpyOptionsInit1_22
14
+ > extends AdbScrcpyOptions1_16<T> {
9
15
  public override createConnection(adb: Adb): AdbScrcpyConnection {
10
16
  const options = {
11
17
  ...this.getDefaultValue(),
@@ -1,3 +1,3 @@
1
- export * from './1_16.js';
2
- export * from './1_22.js';
3
- export * from './types.js';
1
+ export * from "./1_16.js";
2
+ export * from "./1_22.js";
3
+ export * from "./types.js";
@@ -1,19 +1,32 @@
1
- import type { Adb } from '@yume-chan/adb';
2
- import type { TransformStream } from '@yume-chan/stream-extra';
1
+ import type { Adb } from "@yume-chan/adb";
2
+ import type { TransformStream } from "@yume-chan/stream-extra";
3
3
 
4
- import type { ScrcpyControlMessageType } from '../../control/index.js';
5
- import type { ScrcpyBackOrScreenOnControlMessage1_18, ScrcpyInjectScrollControlMessage1_22, ScrcpyOptions, ScrcpyVideoStreamPacket } from '../../options/index.js';
6
- import type { AdbScrcpyConnection } from '../connection.js';
4
+ import type {
5
+ ScrcpyBackOrScreenOnControlMessage,
6
+ ScrcpyControlMessageType,
7
+ ScrcpySetClipboardControlMessage,
8
+ } from "../../control/index.js";
9
+ import type {
10
+ ScrcpyOptions,
11
+ ScrcpyVideoStreamPacket,
12
+ } from "../../options/index.js";
13
+ import type { AdbScrcpyConnection } from "../connection.js";
7
14
 
8
- export interface AdbScrcpyOptions<T> extends ScrcpyOptions<T> {
15
+ export interface AdbScrcpyOptions<T extends object> extends ScrcpyOptions<T> {
9
16
  createConnection(adb: Adb): AdbScrcpyConnection;
10
17
  }
11
18
 
12
- export abstract class AdbScrcpyOptionsBase<T> implements ScrcpyOptions<T> {
19
+ export abstract class AdbScrcpyOptionsBase<T extends object>
20
+ implements ScrcpyOptions<T>
21
+ {
13
22
  private raw: ScrcpyOptions<T>;
14
23
 
15
- public get value(): Partial<T> { return this.raw.value; }
16
- public set value(value: Partial<T>) { this.raw.value = value; }
24
+ public get value(): Partial<T> {
25
+ return this.raw.value;
26
+ }
27
+ public set value(value: Partial<T>) {
28
+ this.raw.value = value;
29
+ }
17
30
 
18
31
  public constructor(raw: ScrcpyOptions<T>) {
19
32
  this.raw = raw;
@@ -31,7 +44,10 @@ export abstract class AdbScrcpyOptionsBase<T> implements ScrcpyOptions<T> {
31
44
  return this.raw.getOutputEncoderNameRegex();
32
45
  }
33
46
 
34
- public createVideoStreamTransformer(): TransformStream<Uint8Array, ScrcpyVideoStreamPacket> {
47
+ public createVideoStreamTransformer(): TransformStream<
48
+ Uint8Array,
49
+ ScrcpyVideoStreamPacket
50
+ > {
35
51
  return this.raw.createVideoStreamTransformer();
36
52
  }
37
53
 
@@ -40,15 +56,19 @@ export abstract class AdbScrcpyOptionsBase<T> implements ScrcpyOptions<T> {
40
56
  }
41
57
 
42
58
  public serializeBackOrScreenOnControlMessage(
43
- message: ScrcpyBackOrScreenOnControlMessage1_18,
59
+ message: ScrcpyBackOrScreenOnControlMessage
44
60
  ): Uint8Array | undefined {
45
61
  return this.raw.serializeBackOrScreenOnControlMessage(message);
46
62
  }
47
63
 
48
- public serializeInjectScrollControlMessage(
49
- message: ScrcpyInjectScrollControlMessage1_22,
64
+ public serializeSetClipboardControlMessage(
65
+ message: ScrcpySetClipboardControlMessage
50
66
  ): Uint8Array {
51
- return this.raw.serializeInjectScrollControlMessage(message);
67
+ return this.raw.serializeSetClipboardControlMessage(message);
68
+ }
69
+
70
+ public getScrollController() {
71
+ return this.raw.getScrollController();
52
72
  }
53
73
 
54
74
  public abstract createConnection(adb: Adb): AdbScrcpyConnection;
@@ -0,0 +1,4 @@
1
+ import type { ScrcpyBackOrScreenOnControlMessage1_18 } from "../index.js";
2
+
3
+ export type ScrcpyBackOrScreenOnControlMessage =
4
+ ScrcpyBackOrScreenOnControlMessage1_18;
@@ -0,0 +1,54 @@
1
+ import type { ScrcpyInjectTouchControlMessage } from "./inject-touch.js";
2
+ import { AndroidMotionEventAction } from "./inject-touch.js";
3
+ import { ScrcpyControlMessageType } from "./type.js";
4
+
5
+ /**
6
+ * On both Android and Windows, while both mouse and touch are supported input devices,
7
+ * only one of them can be active at a time. Touch the screen with a finger will deactivate mouse,
8
+ * and move the mouse will deactivate touch.
9
+ *
10
+ * On Android, this is achieved by dispatching a `MotionEvent.ACTION_UP` event for the previous input type.
11
+ * But on Chrome, there is no such event, causing both mouse and touch to be active at the same time.
12
+ * This can cause the new input to appear as "ignored".
13
+ *
14
+ * This helper class synthesis `ACTION_UP` events when a different pointer type appears,
15
+ * so Scrcpy server can remove the previously hovering pointer.
16
+ */
17
+ export class ScrcpyHoverHelper {
18
+ // AFAIK, only mouse and pen can have hover state
19
+ // and you can't have two mouses or pens.
20
+ // So remember the last hovering pointer is enough.
21
+ private lastHoverMessage: ScrcpyInjectTouchControlMessage | undefined;
22
+
23
+ public process(
24
+ message: Omit<ScrcpyInjectTouchControlMessage, "type">
25
+ ): ScrcpyInjectTouchControlMessage[] {
26
+ const result: ScrcpyInjectTouchControlMessage[] = [];
27
+
28
+ // A different pointer appeared,
29
+ // Cancel previously hovering pointer so Scrcpy server can free up the pointer ID.
30
+ if (
31
+ this.lastHoverMessage &&
32
+ this.lastHoverMessage.pointerId !== message.pointerId
33
+ ) {
34
+ // TODO: Inject MotionEvent.ACTION_HOVER_EXIT
35
+ // From testing, it seems no App cares about this event.
36
+ result.push({
37
+ ...this.lastHoverMessage,
38
+ action: AndroidMotionEventAction.Up,
39
+ });
40
+ this.lastHoverMessage = undefined;
41
+ }
42
+
43
+ if (message.action === AndroidMotionEventAction.HoverMove) {
44
+ // TODO: Inject MotionEvent.ACTION_HOVER_ENTER
45
+ this.lastHoverMessage = message as ScrcpyInjectTouchControlMessage;
46
+ }
47
+
48
+ (message as ScrcpyInjectTouchControlMessage).type =
49
+ ScrcpyControlMessageType.InjectTouch;
50
+ result.push(message as ScrcpyInjectTouchControlMessage);
51
+
52
+ return result;
53
+ }
54
+ }
@@ -1,7 +1,11 @@
1
- export * from './inject-keycode.js';
2
- export * from './inject-text.js';
3
- export * from './inject-touch.js';
4
- export * from './rotate-device.js';
5
- export * from './serializer.js';
6
- export * from './set-screen-power-mode.js';
7
- export * from './type.js';
1
+ export * from "./back-or-screen-on.js";
2
+ export * from "./hover-helper.js";
3
+ export * from "./inject-keycode.js";
4
+ export * from "./inject-scroll.js";
5
+ export * from "./inject-text.js";
6
+ export * from "./inject-touch.js";
7
+ export * from "./rotate-device.js";
8
+ export * from "./serializer.js";
9
+ export * from "./set-clipboard.js";
10
+ export * from "./set-screen-power-mode.js";
11
+ export * from "./type.js";
@@ -1,59 +1,217 @@
1
- import Struct, { placeholder } from '@yume-chan/struct';
1
+ import Struct, { placeholder } from "@yume-chan/struct";
2
2
 
3
- import { ScrcpyControlMessageType } from './type.js';
3
+ import { ScrcpyControlMessageType } from "./type.js";
4
4
 
5
5
  export enum AndroidKeyEventAction {
6
6
  Down = 0,
7
7
  Up = 1,
8
8
  }
9
9
 
10
- // https://github.com/Genymobile/scrcpy/blob/cabb102a04153f9c237b18257d3269a058558c63/app/src/android/keycodes.h#L26
10
+ // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/view/KeyEvent.java;l=993;drc=95c1165bb895dd844e1793460710f7163dd330a3
11
+ export enum AndroidKeyEventMeta {
12
+ AltOn = 0x02,
13
+ AltLeftOn = 0x10,
14
+ AltRightOn = 0x20,
15
+ ShiftOn = 0x01,
16
+ ShiftLeftOn = 0x40,
17
+ ShiftRightOn = 0x80,
18
+ CtrlOn = 0x1000,
19
+ CtrlLeftOn = 0x2000,
20
+ CtrlRightOn = 0x4000,
21
+ MetaOn = 0x10000,
22
+ MetaLeftOn = 0x20000,
23
+ MetaRightOn = 0x40000,
24
+ CapsLockOn = 0x100000,
25
+ NumLockOn = 0x200000,
26
+ ScrollLockOn = 0x400000,
27
+ }
28
+
29
+ // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/view/KeyEvent.java;l=97;drc=95c1165bb895dd844e1793460710f7163dd330a3
30
+ // Most names follow Web API `KeyboardEvent.code`,
31
+ // Android-only (not exist in HID keyboard standard) keys are prefixed by `Android`.
11
32
  export enum AndroidKeyCode {
12
- Home = 3,
13
- Back = 4,
14
- VolumeUp = 24,
15
- VolumeDown,
16
- A = 29,
17
- B,
18
- C,
19
- D,
20
- E,
21
- F,
22
- G,
23
- H,
24
- I,
25
- J,
26
- K,
27
- L,
28
- M,
29
- N,
30
- O,
31
- P,
32
- Q,
33
- R,
34
- S,
35
- T,
36
- U,
37
- V,
38
- W,
39
- X,
40
- Y,
41
- Z,
42
- Tab = 61,
33
+ AndroidHome = 3,
34
+ AndroidBack = 4,
35
+ AndroidCall,
36
+ AndroidEndCall,
37
+
38
+ Digit0,
39
+ Digit1,
40
+ Digit2,
41
+ Digit3,
42
+ Digit4,
43
+ Digit5,
44
+ Digit6,
45
+ Digit7,
46
+ Digit8,
47
+ Digit9,
48
+ /**
49
+ * '*' key.
50
+ */
51
+ Star, // Name not verified
52
+ /**
53
+ * '#' key.
54
+ */
55
+ Pound, // Name not verified
56
+
57
+ /**
58
+ * Directional Pad Up key.
59
+ */
60
+ ArrowUp,
61
+ /**
62
+ * Directional Pad Down key.
63
+ */
64
+ ArrowDown,
65
+ /**
66
+ * Directional Pad Left key.
67
+ */
68
+ ArrowLeft,
69
+ /**
70
+ * Directional Pad Right key.
71
+ */
72
+ ArrowRight,
73
+ /**
74
+ * Directional Pad Center key.
75
+ */
76
+ AndroidDPadCenter,
77
+
78
+ VolumeUp, // Name not verified
79
+ VolumeDown, // Name not verified
80
+ Power, // Name not verified
81
+ AndroidCamera,
82
+ Clear, // Name not verified
83
+
84
+ KeyA,
85
+ KeyB,
86
+ KeyC,
87
+ KeyD,
88
+ KeyE,
89
+ KeyF,
90
+ KeyG,
91
+ KeyH,
92
+ KeyI,
93
+ KeyJ,
94
+ KeyK,
95
+ KeyL,
96
+ KeyM,
97
+ KeyN,
98
+ KeyO,
99
+ KeyP,
100
+ KeyQ,
101
+ KeyR,
102
+ KeyS,
103
+ KeyT,
104
+ KeyU,
105
+ KeyV,
106
+ KeyW,
107
+ KeyX,
108
+ KeyY,
109
+ KeyZ,
110
+ Comma,
111
+ Period,
112
+ AltLeft,
113
+ AltRight,
114
+ ShiftLeft,
115
+ ShiftRight,
116
+ Tab,
43
117
  Space,
44
- Enter = 66,
118
+ AndroidSymbol,
119
+ AndroidExplorer,
120
+ AndroidEnvelope,
121
+ Enter,
122
+ Backspace,
123
+ Backquote,
124
+ Minus,
125
+ Equal,
126
+ BracketLeft,
127
+ BracketRight,
128
+ Backslash,
129
+ Semicolon,
130
+ Quote,
131
+ Slash,
132
+ At, // Name not verified
133
+
134
+ AndroidNum,
135
+ AndroidHeadsetHook,
136
+ /**
137
+ * Camera Focus key。
138
+ */
139
+ AndroidFocus,
140
+
141
+ Plus, // Name not verified
142
+ ContextMenu,
143
+ AndroidNotification,
144
+ AndroidSearch,
145
+
146
+ PageUp = 92,
147
+ PageDown,
148
+
149
+ Escape = 111,
45
150
  Delete,
46
- VolumeMute = 164,
47
- AppSwitch = 187,
151
+ ControlLeft,
152
+ ControlRight,
153
+ CapsLock,
154
+ ScrollLock,
155
+ MetaLeft,
156
+ MetaRight,
157
+ AndroidFunction,
158
+ PrintScreen,
159
+ Pause,
160
+
161
+ Home,
162
+ End,
163
+ Insert,
164
+ AndroidForward,
165
+
166
+ F1 = 131,
167
+ F2,
168
+ F3,
169
+ F4,
170
+ F5,
171
+ F6,
172
+ F7,
173
+ F8,
174
+ F9,
175
+ F10,
176
+ F11,
177
+ F12,
178
+
179
+ NumLock,
180
+ Numpad0,
181
+ Numpad1,
182
+ Numpad2,
183
+ Numpad3,
184
+ Numpad4,
185
+ Numpad5,
186
+ Numpad6,
187
+ Numpad7,
188
+ Numpad8,
189
+ Numpad9,
190
+ NumpadDivide,
191
+ NumpadMultiply,
192
+ NumpadSubtract,
193
+ NumpadAdd,
194
+ NumpadDecimal,
195
+ NumpadComma, // Name not verified
196
+ NumpadEnter,
197
+ NumpadEquals, // Name not verified
198
+ NumpadLeftParen, // Name not verified
199
+ NumpadRightParen, // Name not verified
200
+
201
+ VolumeMute = 164, // Name not verified
202
+ AndroidAppSwitch = 187,
203
+
204
+ AndroidCut = 277,
205
+ AndroidCopy,
206
+ AndroidPaste,
48
207
  }
49
208
 
50
- export const ScrcpyInjectKeyCodeControlMessage =
51
- new Struct()
52
- .uint8('type', ScrcpyControlMessageType.InjectKeyCode as const)
53
- .uint8('action', placeholder<AndroidKeyEventAction>())
54
- .uint32('keyCode')
55
- .uint32('repeat')
56
- .uint32('metaState');
209
+ export const ScrcpyInjectKeyCodeControlMessage = new Struct()
210
+ .uint8("type", ScrcpyControlMessageType.InjectKeyCode as const)
211
+ .uint8("action", placeholder<AndroidKeyEventAction>())
212
+ .uint32("keyCode")
213
+ .uint32("repeat")
214
+ .uint32("metaState");
57
215
 
58
216
  export type ScrcpyInjectKeyCodeControlMessage =
59
- typeof ScrcpyInjectKeyCodeControlMessage['TInit'];
217
+ (typeof ScrcpyInjectKeyCodeControlMessage)["TInit"];
@@ -0,0 +1,4 @@
1
+ import type { ScrcpyInjectScrollControlMessage1_25 } from "../options/index.js";
2
+
3
+ export type ScrcpyInjectScrollControlMessage =
4
+ ScrcpyInjectScrollControlMessage1_25;
@@ -1,12 +1,11 @@
1
- import Struct from '@yume-chan/struct';
1
+ import Struct from "@yume-chan/struct";
2
2
 
3
- import { ScrcpyControlMessageType } from './type.js';
3
+ import { ScrcpyControlMessageType } from "./type.js";
4
4
 
5
- export const ScrcpyInjectTextControlMessage =
6
- new Struct()
7
- .uint8('type', ScrcpyControlMessageType.InjectText as const)
8
- .uint32('length')
9
- .string('text', { lengthField: 'length' });
5
+ export const ScrcpyInjectTextControlMessage = new Struct()
6
+ .uint8("type", ScrcpyControlMessageType.InjectText as const)
7
+ .uint32("length")
8
+ .string("text", { lengthField: "length" });
10
9
 
11
10
  export type ScrcpyInjectTextControlMessage =
12
- typeof ScrcpyInjectTextControlMessage['TInit'];
11
+ (typeof ScrcpyInjectTextControlMessage)["TInit"];
@@ -1,5 +1,10 @@
1
- import Struct, { placeholder } from '@yume-chan/struct';
2
- import { ScrcpyControlMessageType } from './type.js';
1
+ import Struct, {
2
+ NumberFieldDefinition,
3
+ NumberFieldType,
4
+ placeholder,
5
+ } from "@yume-chan/struct";
6
+
7
+ import { ScrcpyControlMessageType } from "./type.js";
3
8
 
4
9
  // https://developer.android.com/reference/android/view/MotionEvent#constants_1
5
10
  export enum AndroidMotionEventAction {
@@ -18,17 +23,56 @@ export enum AndroidMotionEventAction {
18
23
  ButtonRelease,
19
24
  }
20
25
 
21
- export const ScrcpyInjectTouchControlMessage =
22
- new Struct()
23
- .uint8('type', ScrcpyControlMessageType.InjectTouch as const)
24
- .uint8('action', placeholder<AndroidMotionEventAction>())
25
- .uint64('pointerId')
26
- .uint32('pointerX')
27
- .uint32('pointerY')
28
- .uint16('screenWidth')
29
- .uint16('screenHeight')
30
- .uint16('pressure')
31
- .uint32('buttons');
26
+ // eslint-disable-next-line @typescript-eslint/no-namespace
27
+ export namespace ScrcpyPointerId {
28
+ export const Mouse = BigInt(-1);
29
+ export const Finger = BigInt(-2);
30
+ export const VirtualMouse = BigInt(-3);
31
+ export const VirtualFinger = BigInt(-4);
32
+ }
33
+
34
+ export function clamp(value: number, min: number, max: number): number {
35
+ if (value < min) {
36
+ return min;
37
+ }
38
+
39
+ if (value > max) {
40
+ return max;
41
+ }
42
+
43
+ return value;
44
+ }
45
+
46
+ export const ScrcpyFloatToUint16NumberType: NumberFieldType = {
47
+ size: 2,
48
+ signed: false,
49
+ deserialize(array, littleEndian) {
50
+ const value = NumberFieldType.Uint16.deserialize(array, littleEndian);
51
+ // https://github.com/Genymobile/scrcpy/blob/1f138aef41de651668043b32c4effc2d4adbfc44/server/src/main/java/com/genymobile/scrcpy/Binary.java#L22
52
+ return value === 0xffff ? 1 : value / 0x10000;
53
+ },
54
+ serialize(dataView, offset, value, littleEndian) {
55
+ // https://github.com/Genymobile/scrcpy/blob/1f138aef41de651668043b32c4effc2d4adbfc44/app/src/util/binary.h#L51
56
+ value = clamp(value, -1, 1);
57
+ value = value === 1 ? 0xffff : value * 0x10000;
58
+ NumberFieldType.Uint16.serialize(dataView, offset, value, littleEndian);
59
+ },
60
+ };
61
+
62
+ const ScrcpyFloatToUint16FieldDefinition = new NumberFieldDefinition(
63
+ ScrcpyFloatToUint16NumberType
64
+ );
65
+
66
+ export const ScrcpyInjectTouchControlMessage = new Struct()
67
+ .uint8("type", ScrcpyControlMessageType.InjectTouch as const)
68
+ .uint8("action", placeholder<AndroidMotionEventAction>())
69
+ .uint64("pointerId")
70
+ .uint32("pointerX")
71
+ .uint32("pointerY")
72
+ .uint16("screenWidth")
73
+ .uint16("screenHeight")
74
+ .field("pressure", ScrcpyFloatToUint16FieldDefinition)
75
+ .uint32("buttons");
32
76
 
33
77
  export type ScrcpyInjectTouchControlMessage =
34
- typeof ScrcpyInjectTouchControlMessage['TInit'];
78
+ (typeof ScrcpyInjectTouchControlMessage)["TInit"];
@@ -1,10 +1,11 @@
1
- import Struct from '@yume-chan/struct';
1
+ import Struct from "@yume-chan/struct";
2
2
 
3
- import { ScrcpyControlMessageType } from './type.js';
3
+ import { ScrcpyControlMessageType } from "./type.js";
4
4
 
5
- export const ScrcpyRotateDeviceControlMessage =
6
- new Struct()
7
- .uint8('type', ScrcpyControlMessageType.RotateDevice as const)
5
+ export const ScrcpyRotateDeviceControlMessage = new Struct().uint8(
6
+ "type",
7
+ ScrcpyControlMessageType.RotateDevice as const
8
+ );
8
9
 
9
10
  export type ScrcpyRotateDeviceControlMessage =
10
- typeof ScrcpyRotateDeviceControlMessage['TInit'];
11
+ (typeof ScrcpyRotateDeviceControlMessage)["TInit"];