@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
@@ -0,0 +1,76 @@
1
+ import Struct from "@yume-chan/struct";
2
+
3
+ import {
4
+ ScrcpyControlMessageType,
5
+ type ScrcpyInjectScrollControlMessage,
6
+ } from "../../control/index.js";
7
+
8
+ export interface ScrcpyScrollController {
9
+ serializeScrollMessage(
10
+ message: ScrcpyInjectScrollControlMessage
11
+ ): Uint8Array | undefined;
12
+ }
13
+
14
+ export const ScrcpyInjectScrollControlMessage1_16 = new Struct()
15
+ .uint8("type", ScrcpyControlMessageType.InjectScroll as const)
16
+ .uint32("pointerX")
17
+ .uint32("pointerY")
18
+ .uint16("screenWidth")
19
+ .uint16("screenHeight")
20
+ .int32("scrollX")
21
+ .int32("scrollY");
22
+
23
+ /**
24
+ * Old version of Scrcpy server only supports integer values for scroll.
25
+ *
26
+ * Accumulate scroll values and send scroll message when accumulated value
27
+ * reaches 1 or -1.
28
+ */
29
+ export class ScrcpyScrollController1_16 implements ScrcpyScrollController {
30
+ private accumulatedX = 0;
31
+ private accumulatedY = 0;
32
+
33
+ protected processMessage(
34
+ message: ScrcpyInjectScrollControlMessage
35
+ ): ScrcpyInjectScrollControlMessage | undefined {
36
+ this.accumulatedX += message.scrollX;
37
+ this.accumulatedY += message.scrollY;
38
+
39
+ let scrollX = 0;
40
+ let scrollY = 0;
41
+ if (this.accumulatedX >= 1) {
42
+ scrollX = 1;
43
+ this.accumulatedX = 0;
44
+ } else if (this.accumulatedX <= -1) {
45
+ scrollX = -1;
46
+ this.accumulatedX = 0;
47
+ }
48
+
49
+ if (this.accumulatedY >= 1) {
50
+ scrollY = 1;
51
+ this.accumulatedY = 0;
52
+ } else if (this.accumulatedY <= -1) {
53
+ scrollY = -1;
54
+ this.accumulatedY = 0;
55
+ }
56
+
57
+ if (scrollX === 0 && scrollY === 0) {
58
+ return undefined;
59
+ }
60
+
61
+ message.scrollX = scrollX;
62
+ message.scrollY = scrollY;
63
+ return message;
64
+ }
65
+
66
+ public serializeScrollMessage(
67
+ message: ScrcpyInjectScrollControlMessage
68
+ ): Uint8Array | undefined {
69
+ const processed = this.processMessage(message);
70
+ if (!processed) {
71
+ return undefined;
72
+ }
73
+
74
+ return ScrcpyInjectScrollControlMessage1_16.serialize(processed);
75
+ }
76
+ }
@@ -1,28 +1,40 @@
1
1
  import Struct, { placeholder } from "@yume-chan/struct";
2
- import { AndroidKeyEventAction, ScrcpyControlMessageType } from "../message.js";
3
- import { ScrcpyBackOrScreenOnEvent1_16, ScrcpyOptions1_16, type ScrcpyOptionsInit1_16 } from "./1_16/index.js";
2
+
3
+ import {
4
+ ScrcpyControlMessageType,
5
+ type AndroidKeyEventAction,
6
+ type ScrcpyBackOrScreenOnControlMessage,
7
+ } from "../control/index.js";
8
+
9
+ import {
10
+ ScrcpyBackOrScreenOnControlMessage1_16,
11
+ ScrcpyOptions1_16,
12
+ type ScrcpyOptionsInit1_16,
13
+ } from "./1_16/options.js";
4
14
 
5
15
  export interface ScrcpyOptionsInit1_18 extends ScrcpyOptionsInit1_16 {
6
16
  powerOffOnClose: boolean;
7
17
  }
8
18
 
9
- export const ScrcpyBackOrScreenOnEvent1_18 =
10
- new Struct()
11
- .fields(ScrcpyBackOrScreenOnEvent1_16)
12
- .uint8('action', placeholder<AndroidKeyEventAction>());
19
+ export const ScrcpyBackOrScreenOnControlMessage1_18 = new Struct()
20
+ .fields(ScrcpyBackOrScreenOnControlMessage1_16)
21
+ .uint8("action", placeholder<AndroidKeyEventAction>());
13
22
 
14
- export type ScrcpyBackOrScreenOnEvent1_18 = typeof ScrcpyBackOrScreenOnEvent1_18["TInit"];
23
+ export type ScrcpyBackOrScreenOnControlMessage1_18 =
24
+ typeof ScrcpyBackOrScreenOnControlMessage1_18["TInit"];
15
25
 
16
- export class ScrcpyOptions1_18<T extends ScrcpyOptionsInit1_18 = ScrcpyOptionsInit1_18> extends ScrcpyOptions1_16<T> {
26
+ export class ScrcpyOptions1_18<
27
+ T extends ScrcpyOptionsInit1_18 = ScrcpyOptionsInit1_18
28
+ > extends ScrcpyOptions1_16<T> {
17
29
  constructor(value: Partial<ScrcpyOptionsInit1_18>) {
18
30
  super(value);
19
31
  }
20
32
 
21
33
  protected override getArgumentOrder(): (keyof T)[] {
22
- return super.getArgumentOrder().concat(['powerOffOnClose']);
34
+ return super.getArgumentOrder().concat(["powerOffOnClose"]);
23
35
  }
24
36
 
25
- protected override getDefaultValue(): T {
37
+ public override getDefaultValue(): T {
26
38
  return {
27
39
  ...super.getDefaultValue(),
28
40
  powerOffOnClose: false,
@@ -54,8 +66,8 @@ export class ScrcpyOptions1_18<T extends ScrcpyOptionsInit1_18 = ScrcpyOptionsIn
54
66
  }
55
67
 
56
68
  public override serializeBackOrScreenOnControlMessage(
57
- message: ScrcpyBackOrScreenOnEvent1_18,
69
+ message: ScrcpyBackOrScreenOnControlMessage
58
70
  ) {
59
- return ScrcpyBackOrScreenOnEvent1_18.serialize(message);
71
+ return ScrcpyBackOrScreenOnControlMessage1_18.serialize(message);
60
72
  }
61
73
  }
@@ -1,22 +1,41 @@
1
1
  // cspell: ignore autosync
2
2
 
3
- import { ScrcpyOptions1_18, type ScrcpyOptionsInit1_18 } from './1_18.js';
4
- import { toScrcpyOptionValue } from "./common.js";
3
+ import Struct from "@yume-chan/struct";
4
+
5
+ import {
6
+ ScrcpyControlMessageType,
7
+ type ScrcpySetClipboardControlMessage,
8
+ } from "../control/index.js";
9
+
10
+ import { ScrcpyOptions1_18, type ScrcpyOptionsInit1_18 } from "./1_18.js";
11
+ import { toScrcpyOptionValue } from "./types.js";
5
12
 
6
13
  export interface ScrcpyOptionsInit1_21 extends ScrcpyOptionsInit1_18 {
7
14
  clipboardAutosync?: boolean;
8
15
  }
9
16
 
10
17
  function toSnakeCase(input: string): string {
11
- return input.replace(/([A-Z])/g, '_$1').toLowerCase();
18
+ return input.replace(/([A-Z])/g, "_$1").toLowerCase();
12
19
  }
13
20
 
14
- export class ScrcpyOptions1_21<T extends ScrcpyOptionsInit1_21 = ScrcpyOptionsInit1_21> extends ScrcpyOptions1_18<T> {
21
+ export const ScrcpySetClipboardControlMessage1_21 = new Struct()
22
+ .uint8("type", ScrcpyControlMessageType.SetClipboard as const)
23
+ .uint64("sequence")
24
+ .int8("paste")
25
+ .uint32("length")
26
+ .string("content", { lengthField: "length" });
27
+
28
+ export type ScrcpySetClipboardControlMessage1_21 =
29
+ typeof ScrcpySetClipboardControlMessage1_21["TInit"];
30
+
31
+ export class ScrcpyOptions1_21<
32
+ T extends ScrcpyOptionsInit1_21 = ScrcpyOptionsInit1_21
33
+ > extends ScrcpyOptions1_18<T> {
15
34
  public constructor(init: Partial<ScrcpyOptionsInit1_21>) {
16
35
  super(init);
17
36
  }
18
37
 
19
- protected override getDefaultValue(): T {
38
+ public override getDefaultValue(): T {
20
39
  return {
21
40
  ...super.getDefaultValue(),
22
41
  clipboardAutosync: true,
@@ -27,8 +46,17 @@ export class ScrcpyOptions1_21<T extends ScrcpyOptionsInit1_21 = ScrcpyOptionsIn
27
46
  // 1.21 changed the format of arguments
28
47
  // So `getArgumentOrder()` is no longer needed
29
48
  return Object.entries(this.value)
30
- .map(([key, value]) => [key, toScrcpyOptionValue(value, undefined)] as const)
49
+ .map(
50
+ ([key, value]) =>
51
+ [key, toScrcpyOptionValue(value, undefined)] as const
52
+ )
31
53
  .filter((pair): pair is [string, string] => pair[1] !== undefined)
32
54
  .map(([key, value]) => `${toSnakeCase(key)}=${value}`);
33
55
  }
56
+
57
+ public override serializeSetClipboardControlMessage(
58
+ message: ScrcpySetClipboardControlMessage
59
+ ): Uint8Array {
60
+ return ScrcpySetClipboardControlMessage1_21.serialize(message);
61
+ }
34
62
  }
@@ -0,0 +1,2 @@
1
+ export * from "./options.js";
2
+ export * from "./scroll.js";
@@ -0,0 +1,58 @@
1
+ import { type ScrcpyScrollController } from "../1_16/index.js";
2
+ import { ScrcpyOptions1_21, type ScrcpyOptionsInit1_21 } from "../1_21.js";
3
+
4
+ import { ScrcpyScrollController1_22 } from "./scroll.js";
5
+
6
+ export interface ScrcpyOptionsInit1_22 extends ScrcpyOptionsInit1_21 {
7
+ downsizeOnError: boolean;
8
+
9
+ /**
10
+ * Send device name and size at start of video stream.
11
+ *
12
+ * @default true
13
+ */
14
+ sendDeviceMeta: boolean;
15
+
16
+ /**
17
+ * Send a `0` byte on start of video stream to detect connection issues
18
+ *
19
+ * @default true
20
+ */
21
+ sendDummyByte: boolean;
22
+
23
+ /**
24
+ * Implies `sendDeviceMeta: false`, `sendFrameMeta: false` and `sendDummyByte: false`
25
+ *
26
+ * @default false
27
+ */
28
+ rawVideoStream: boolean;
29
+ }
30
+
31
+ export class ScrcpyOptions1_22<
32
+ T extends ScrcpyOptionsInit1_22 = ScrcpyOptionsInit1_22
33
+ > extends ScrcpyOptions1_21<T> {
34
+ public constructor(init: Partial<ScrcpyOptionsInit1_22>) {
35
+ if (init.rawVideoStream) {
36
+ // Set implied options for client-side processing
37
+ init.sendDeviceMeta = false;
38
+ init.sendFrameMeta = false;
39
+ init.sendDummyByte = false;
40
+ }
41
+
42
+ super(init);
43
+ }
44
+
45
+ public override getDefaultValue(): T {
46
+ return {
47
+ ...super.getDefaultValue(),
48
+ downsizeOnError: true,
49
+ sendDeviceMeta: true,
50
+ sendDummyByte: true,
51
+ rawVideoStream: false,
52
+ };
53
+ }
54
+
55
+ public override getScrollController(): ScrcpyScrollController {
56
+ return new ScrcpyScrollController1_22();
57
+ }
58
+ }
@@ -0,0 +1,26 @@
1
+ import Struct from "@yume-chan/struct";
2
+
3
+ import {
4
+ ScrcpyInjectScrollControlMessage1_16,
5
+ ScrcpyScrollController1_16,
6
+ } from "../1_16/index.js";
7
+
8
+ export const ScrcpyInjectScrollControlMessage1_22 = new Struct()
9
+ .fields(ScrcpyInjectScrollControlMessage1_16)
10
+ .int32("buttons");
11
+
12
+ export type ScrcpyInjectScrollControlMessage1_22 =
13
+ typeof ScrcpyInjectScrollControlMessage1_22["TInit"];
14
+
15
+ export class ScrcpyScrollController1_22 extends ScrcpyScrollController1_16 {
16
+ public override serializeScrollMessage(
17
+ message: ScrcpyInjectScrollControlMessage1_22
18
+ ): Uint8Array | undefined {
19
+ const processed = this.processMessage(message);
20
+ if (!processed) {
21
+ return undefined;
22
+ }
23
+
24
+ return ScrcpyInjectScrollControlMessage1_22.serialize(processed);
25
+ }
26
+ }
@@ -1,6 +1,10 @@
1
- import { TransformStream } from "@yume-chan/adb";
2
- import { ScrcpyOptions1_22, type ScrcpyOptionsInit1_22 } from './1_22.js';
3
- import type { VideoStreamPacket } from "./common.js";
1
+ import { TransformStream } from "@yume-chan/stream-extra";
2
+
3
+ import {
4
+ ScrcpyOptions1_22,
5
+ type ScrcpyOptionsInit1_22,
6
+ } from "./1_22/options.js";
7
+ import { type ScrcpyVideoStreamPacket } from "./types.js";
4
8
 
5
9
  export interface ScrcpyOptionsInit1_23 extends ScrcpyOptionsInit1_22 {
6
10
  cleanup: boolean;
@@ -8,37 +12,47 @@ export interface ScrcpyOptionsInit1_23 extends ScrcpyOptionsInit1_22 {
8
12
 
9
13
  const KEYFRAME_PTS = BigInt(1) << BigInt(62);
10
14
 
11
- export class ScrcpyOptions1_23<T extends ScrcpyOptionsInit1_23 = ScrcpyOptionsInit1_23> extends ScrcpyOptions1_22<T> {
15
+ export class ScrcpyOptions1_23<
16
+ T extends ScrcpyOptionsInit1_23 = ScrcpyOptionsInit1_23
17
+ > extends ScrcpyOptions1_22<T> {
12
18
  public constructor(init: Partial<ScrcpyOptionsInit1_23>) {
13
19
  super(init);
14
20
  }
15
21
 
16
- protected override getDefaultValue(): T {
22
+ public override getDefaultValue(): T {
17
23
  return {
18
24
  ...super.getDefaultValue(),
19
25
  cleanup: true,
20
26
  };
21
27
  }
22
28
 
23
- public override createVideoStreamTransformer(): TransformStream<Uint8Array, VideoStreamPacket> {
29
+ public override createVideoStreamTransformer(): TransformStream<
30
+ Uint8Array,
31
+ ScrcpyVideoStreamPacket
32
+ > {
24
33
  const superStream = super.createVideoStreamTransformer();
25
34
  return {
26
35
  writable: superStream.writable,
27
- readable: superStream.readable.pipeThrough(new TransformStream({
28
- transform(packet, controller): void {
29
- if (packet.type !== 'frame') {
30
- controller.enqueue(packet);
31
- return;
32
- }
36
+ readable: superStream.readable.pipeThrough(
37
+ new TransformStream({
38
+ transform(packet, controller): void {
39
+ if (packet.type !== "frame") {
40
+ controller.enqueue(packet);
41
+ return;
42
+ }
33
43
 
34
- if (packet.pts !== undefined && packet.pts & KEYFRAME_PTS) {
35
- packet.keyframe = true;
36
- packet.pts &= ~KEYFRAME_PTS;
37
- }
44
+ if (
45
+ packet.pts !== undefined &&
46
+ packet.pts & KEYFRAME_PTS
47
+ ) {
48
+ packet.keyframe = true;
49
+ packet.pts &= ~KEYFRAME_PTS;
50
+ }
38
51
 
39
- controller.enqueue(packet);
40
- }
41
- }))
52
+ controller.enqueue(packet);
53
+ },
54
+ })
55
+ ),
42
56
  };
43
57
  }
44
58
  }
@@ -4,12 +4,13 @@ export interface ScrcpyOptionsInit1_24 extends ScrcpyOptionsInit1_23 {
4
4
  powerOn: boolean;
5
5
  }
6
6
 
7
- export class ScrcpyOptions1_24<T extends ScrcpyOptionsInit1_24 = ScrcpyOptionsInit1_24> extends ScrcpyOptions1_23<T> {
7
+ export class ScrcpyOptions1_24<T extends ScrcpyOptionsInit1_24 = ScrcpyOptionsInit1_24>
8
+ extends ScrcpyOptions1_23<T> {
8
9
  public constructor(init: Partial<ScrcpyOptionsInit1_24>) {
9
10
  super(init);
10
11
  }
11
12
 
12
- protected override getDefaultValue(): T {
13
+ public override getDefaultValue(): T {
13
14
  return {
14
15
  ...super.getDefaultValue(),
15
16
  powerOn: true,
@@ -0,0 +1,2 @@
1
+ export * from "./options.js";
2
+ export * from "./scroll.js";
@@ -0,0 +1,12 @@
1
+ import { type ScrcpyScrollController } from "../1_16/index.js";
2
+ import { ScrcpyOptions1_24, type ScrcpyOptionsInit1_24 } from "../1_24.js";
3
+
4
+ import { ScrcpyScrollController1_25 } from "./scroll.js";
5
+
6
+ export class ScrcpyOptions1_25<
7
+ T extends ScrcpyOptionsInit1_24 = ScrcpyOptionsInit1_24
8
+ > extends ScrcpyOptions1_24<T> {
9
+ public override getScrollController(): ScrcpyScrollController {
10
+ return new ScrcpyScrollController1_25();
11
+ }
12
+ }
@@ -0,0 +1,52 @@
1
+ import Struct, {
2
+ NumberFieldDefinition,
3
+ NumberFieldType,
4
+ } from "@yume-chan/struct";
5
+
6
+ import {
7
+ clamp,
8
+ ScrcpyControlMessageType,
9
+ type ScrcpyInjectScrollControlMessage,
10
+ } from "../../control/index.js";
11
+ import { type ScrcpyScrollController } from "../1_16/index.js";
12
+
13
+ export const ScrcpyFloatToInt16NumberType: NumberFieldType = {
14
+ size: 2,
15
+ signed: true,
16
+ deserialize(array, littleEndian) {
17
+ const value = NumberFieldType.Int16.deserialize(array, littleEndian);
18
+ // https://github.com/Genymobile/scrcpy/blob/1f138aef41de651668043b32c4effc2d4adbfc44/server/src/main/java/com/genymobile/scrcpy/Binary.java#L34
19
+ return value === 0x7fff ? 1 : value / 0x8000;
20
+ },
21
+ serialize(dataView, offset, value, littleEndian) {
22
+ // https://github.com/Genymobile/scrcpy/blob/1f138aef41de651668043b32c4effc2d4adbfc44/app/src/util/binary.h#L65
23
+ value = clamp(value, -1, 1);
24
+ value = value === 1 ? 0x7fff : value * 0x8000;
25
+ NumberFieldType.Int16.serialize(dataView, offset, value, littleEndian);
26
+ },
27
+ };
28
+
29
+ const ScrcpyFloatToInt16FieldDefinition = new NumberFieldDefinition(
30
+ ScrcpyFloatToInt16NumberType
31
+ );
32
+
33
+ export const ScrcpyInjectScrollControlMessage1_25 = new Struct()
34
+ .uint8("type", ScrcpyControlMessageType.InjectScroll as const)
35
+ .uint32("pointerX")
36
+ .uint32("pointerY")
37
+ .uint16("screenWidth")
38
+ .uint16("screenHeight")
39
+ .field("scrollX", ScrcpyFloatToInt16FieldDefinition)
40
+ .field("scrollY", ScrcpyFloatToInt16FieldDefinition)
41
+ .int32("buttons");
42
+
43
+ export type ScrcpyInjectScrollControlMessage1_25 =
44
+ typeof ScrcpyInjectScrollControlMessage1_25["TInit"];
45
+
46
+ export class ScrcpyScrollController1_25 implements ScrcpyScrollController {
47
+ serializeScrollMessage(
48
+ message: ScrcpyInjectScrollControlMessage
49
+ ): Uint8Array | undefined {
50
+ return ScrcpyInjectScrollControlMessage1_25.serialize(message);
51
+ }
52
+ }
@@ -1,7 +1,8 @@
1
1
  export * from './1_16/index.js';
2
2
  export * from './1_18.js';
3
3
  export * from './1_21.js';
4
- export * from './1_22.js';
5
- export * from './1_23.js';
6
- export * from './1_24.js';
7
- export * from './common.js';
4
+ export * from "./1_22/index.js";
5
+ export * from "./1_23.js";
6
+ export * from "./1_24.js";
7
+ export * from "./1_25/index.js";
8
+ export * from "./types.js";
@@ -0,0 +1,102 @@
1
+ import { type TransformStream } from "@yume-chan/stream-extra";
2
+
3
+ import {
4
+ type ScrcpyBackOrScreenOnControlMessage,
5
+ type ScrcpyControlMessageType,
6
+ type ScrcpySetClipboardControlMessage,
7
+ } from "../control/index.js";
8
+
9
+ import { type ScrcpyScrollController } from "./1_16/scroll.js";
10
+
11
+ export const DEFAULT_SERVER_PATH = "/data/local/tmp/scrcpy-server.jar";
12
+
13
+ export interface ScrcpyOptionValue {
14
+ toOptionValue(): string | undefined;
15
+ }
16
+
17
+ export function isScrcpyOptionValue(
18
+ value: unknown
19
+ ): value is ScrcpyOptionValue {
20
+ return (
21
+ typeof value === "object" &&
22
+ value !== null &&
23
+ "toOptionValue" in value &&
24
+ typeof value.toOptionValue === "function"
25
+ );
26
+ }
27
+
28
+ export function toScrcpyOptionValue<T>(value: unknown, empty: T): string | T {
29
+ if (isScrcpyOptionValue(value)) {
30
+ value = value.toOptionValue();
31
+ }
32
+
33
+ // `value` may become `undefined` after `toOptionValue`
34
+ if (value === undefined) {
35
+ return empty;
36
+ }
37
+
38
+ return String(value);
39
+ }
40
+
41
+ export interface H264Configuration {
42
+ profileIndex: number;
43
+ constraintSet: number;
44
+ levelIndex: number;
45
+
46
+ encodedWidth: number;
47
+ encodedHeight: number;
48
+
49
+ cropLeft: number;
50
+ cropRight: number;
51
+
52
+ cropTop: number;
53
+ cropBottom: number;
54
+
55
+ croppedWidth: number;
56
+ croppedHeight: number;
57
+ }
58
+
59
+ export interface ScrcpyVideoStreamConfigurationPacket {
60
+ type: "configuration";
61
+ sequenceParameterSet: Uint8Array;
62
+ pictureParameterSet: Uint8Array;
63
+ data: H264Configuration;
64
+ }
65
+
66
+ export interface ScrcpyVideoStreamFramePacket {
67
+ type: "frame";
68
+ keyframe?: boolean | undefined;
69
+ pts?: bigint | undefined;
70
+ data: Uint8Array;
71
+ }
72
+
73
+ export type ScrcpyVideoStreamPacket =
74
+ | ScrcpyVideoStreamConfigurationPacket
75
+ | ScrcpyVideoStreamFramePacket;
76
+
77
+ export interface ScrcpyOptions<T extends object> {
78
+ value: Partial<T>;
79
+
80
+ getDefaultValue(): T;
81
+
82
+ formatServerArguments(): string[];
83
+
84
+ getOutputEncoderNameRegex(): RegExp;
85
+
86
+ createVideoStreamTransformer(): TransformStream<
87
+ Uint8Array,
88
+ ScrcpyVideoStreamPacket
89
+ >;
90
+
91
+ getControlMessageTypes(): ScrcpyControlMessageType[];
92
+
93
+ serializeBackOrScreenOnControlMessage(
94
+ message: ScrcpyBackOrScreenOnControlMessage
95
+ ): Uint8Array | undefined;
96
+
97
+ serializeSetClipboardControlMessage(
98
+ message: ScrcpySetClipboardControlMessage
99
+ ): Uint8Array;
100
+
101
+ getScrollController(): ScrcpyScrollController;
102
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json"
3
+ }