@yume-chan/scrcpy 0.0.19 → 0.0.20

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 (252) hide show
  1. package/CHANGELOG.json +15 -0
  2. package/CHANGELOG.md +9 -1
  3. package/README.md +105 -181
  4. package/esm/codec/h264.d.ts +1 -21
  5. package/esm/codec/h264.d.ts.map +1 -1
  6. package/esm/codec/h264.js +13 -234
  7. package/esm/codec/h264.js.map +1 -1
  8. package/esm/codec/h265.d.ts +454 -0
  9. package/esm/codec/h265.d.ts.map +1 -1
  10. package/esm/codec/h265.js +1060 -0
  11. package/esm/codec/h265.js.map +1 -1
  12. package/esm/codec/index.d.ts +1 -0
  13. package/esm/codec/index.d.ts.map +1 -1
  14. package/esm/codec/index.js +1 -0
  15. package/esm/codec/index.js.map +1 -1
  16. package/esm/codec/nalu.d.ts +44 -0
  17. package/esm/codec/nalu.d.ts.map +1 -0
  18. package/esm/codec/nalu.js +310 -0
  19. package/esm/codec/nalu.js.map +1 -0
  20. package/esm/control/back-or-screen-on.d.ts +1 -1
  21. package/esm/control/back-or-screen-on.d.ts.map +1 -1
  22. package/esm/control/index.d.ts +2 -0
  23. package/esm/control/index.d.ts.map +1 -1
  24. package/esm/control/index.js +2 -0
  25. package/esm/control/index.js.map +1 -1
  26. package/esm/control/inject-keycode.d.ts +1 -2
  27. package/esm/control/inject-keycode.d.ts.map +1 -1
  28. package/esm/control/inject-keycode.js +1 -2
  29. package/esm/control/inject-keycode.js.map +1 -1
  30. package/esm/control/inject-text.d.ts +1 -2
  31. package/esm/control/inject-text.d.ts.map +1 -1
  32. package/esm/control/inject-text.js +1 -2
  33. package/esm/control/inject-text.js.map +1 -1
  34. package/esm/control/inject-touch.d.ts +15 -20
  35. package/esm/control/inject-touch.d.ts.map +1 -1
  36. package/esm/control/inject-touch.js +14 -41
  37. package/esm/control/inject-touch.js.map +1 -1
  38. package/esm/control/rotate-device.d.ts +2 -4
  39. package/esm/control/rotate-device.d.ts.map +1 -1
  40. package/esm/control/rotate-device.js +2 -3
  41. package/esm/control/rotate-device.js.map +1 -1
  42. package/esm/control/serializer.d.ts +13 -23
  43. package/esm/control/serializer.d.ts.map +1 -1
  44. package/esm/control/serializer.js +23 -52
  45. package/esm/control/serializer.js.map +1 -1
  46. package/esm/control/set-screen-power-mode.d.ts +1 -2
  47. package/esm/control/set-screen-power-mode.d.ts.map +1 -1
  48. package/esm/control/set-screen-power-mode.js +1 -2
  49. package/esm/control/set-screen-power-mode.js.map +1 -1
  50. package/esm/control/type.d.ts +14 -0
  51. package/esm/control/type.d.ts.map +1 -1
  52. package/esm/control/type.js +22 -0
  53. package/esm/control/type.js.map +1 -1
  54. package/esm/control/writer.d.ts +28 -0
  55. package/esm/control/writer.d.ts.map +1 -0
  56. package/esm/control/writer.js +53 -0
  57. package/esm/control/writer.js.map +1 -0
  58. package/esm/device-message/stream.d.ts.map +1 -1
  59. package/esm/device-message/stream.js +23 -8
  60. package/esm/device-message/stream.js.map +1 -1
  61. package/esm/index.d.ts +1 -2
  62. package/esm/index.d.ts.map +1 -1
  63. package/esm/index.js +1 -2
  64. package/esm/index.js.map +1 -1
  65. package/esm/options/1_16/codec-options.d.ts +2 -3
  66. package/esm/options/1_16/codec-options.d.ts.map +1 -1
  67. package/esm/options/1_16/codec-options.js.map +1 -1
  68. package/esm/options/1_16/index.d.ts +3 -1
  69. package/esm/options/1_16/index.d.ts.map +1 -1
  70. package/esm/options/1_16/index.js +3 -1
  71. package/esm/options/1_16/index.js.map +1 -1
  72. package/esm/options/1_16/options.d.ts +42 -96
  73. package/esm/options/1_16/options.d.ts.map +1 -1
  74. package/esm/options/1_16/options.js +106 -143
  75. package/esm/options/1_16/options.js.map +1 -1
  76. package/esm/options/1_16/scroll.d.ts +1 -2
  77. package/esm/options/1_16/scroll.d.ts.map +1 -1
  78. package/esm/options/1_16/scroll.js +1 -2
  79. package/esm/options/1_16/scroll.js.map +1 -1
  80. package/esm/options/1_17.d.ts +1 -0
  81. package/esm/options/1_17.d.ts.map +1 -1
  82. package/esm/options/1_17.js +7 -1
  83. package/esm/options/1_17.js.map +1 -1
  84. package/esm/options/1_18.d.ts +49 -11
  85. package/esm/options/1_18.d.ts.map +1 -1
  86. package/esm/options/1_18.js +65 -32
  87. package/esm/options/1_18.js.map +1 -1
  88. package/esm/options/1_21.d.ts +26 -7
  89. package/esm/options/1_21.d.ts.map +1 -1
  90. package/esm/options/1_21.js +35 -20
  91. package/esm/options/1_21.js.map +1 -1
  92. package/esm/options/1_22/index.d.ts +1 -0
  93. package/esm/options/1_22/index.d.ts.map +1 -1
  94. package/esm/options/1_22/index.js +1 -0
  95. package/esm/options/1_22/index.js.map +1 -1
  96. package/esm/options/1_22/options.d.ts +32 -26
  97. package/esm/options/1_22/options.d.ts.map +1 -1
  98. package/esm/options/1_22/options.js +27 -16
  99. package/esm/options/1_22/options.js.map +1 -1
  100. package/esm/options/1_22/scroll.d.ts +1 -1
  101. package/esm/options/1_22/scroll.js +1 -1
  102. package/esm/options/1_23.d.ts +32 -8
  103. package/esm/options/1_23.d.ts.map +1 -1
  104. package/esm/options/1_23.js +24 -14
  105. package/esm/options/1_23.js.map +1 -1
  106. package/esm/options/1_24.d.ts +29 -4
  107. package/esm/options/1_24.d.ts.map +1 -1
  108. package/esm/options/1_24.js +17 -7
  109. package/esm/options/1_24.js.map +1 -1
  110. package/esm/options/1_25/options.d.ts +6 -2
  111. package/esm/options/1_25/options.d.ts.map +1 -1
  112. package/esm/options/1_25/options.js +16 -2
  113. package/esm/options/1_25/options.js.map +1 -1
  114. package/esm/options/1_25/scroll.d.ts.map +1 -1
  115. package/esm/options/1_25/scroll.js +2 -1
  116. package/esm/options/1_25/scroll.js.map +1 -1
  117. package/esm/options/2_0.d.ts +12 -8
  118. package/esm/options/2_0.d.ts.map +1 -1
  119. package/esm/options/2_0.js +80 -11
  120. package/esm/options/2_0.js.map +1 -1
  121. package/esm/options/codec.d.ts +4 -4
  122. package/esm/options/codec.d.ts.map +1 -1
  123. package/esm/options/codec.js +3 -3
  124. package/esm/options/codec.js.map +1 -1
  125. package/esm/options/index.d.ts +4 -0
  126. package/esm/options/index.d.ts.map +1 -1
  127. package/esm/options/index.js +4 -0
  128. package/esm/options/index.js.map +1 -1
  129. package/esm/options/types.d.ts +73 -33
  130. package/esm/options/types.d.ts.map +1 -1
  131. package/esm/options/types.js +52 -0
  132. package/esm/options/types.js.map +1 -1
  133. package/package.json +7 -14
  134. package/src/codec/av1.ts +33 -0
  135. package/src/codec/h264.ts +317 -0
  136. package/src/codec/h265.ts +1375 -0
  137. package/src/codec/index.ts +4 -0
  138. package/src/codec/nalu.ts +373 -0
  139. package/src/control/back-or-screen-on.ts +1 -1
  140. package/{esm/control/simple.js → src/control/basic.ts} +3 -3
  141. package/src/control/index.ts +2 -0
  142. package/src/control/inject-keycode.ts +1 -3
  143. package/src/control/inject-text.ts +1 -3
  144. package/src/control/inject-touch.ts +16 -55
  145. package/src/control/rotate-device.ts +2 -7
  146. package/src/control/serializer.ts +42 -101
  147. package/src/control/set-screen-power-mode.ts +1 -3
  148. package/src/control/type.ts +32 -0
  149. package/src/control/writer.ts +87 -0
  150. package/src/device-message/stream.ts +32 -12
  151. package/src/index.ts +1 -2
  152. package/src/options/1_16/codec-options.ts +2 -3
  153. package/src/options/1_16/float-to-uint16.ts +33 -0
  154. package/src/options/1_16/index.ts +3 -1
  155. package/src/options/1_16/init.ts +80 -0
  156. package/src/options/1_16/message.ts +55 -0
  157. package/src/options/1_16/options.ts +146 -255
  158. package/src/options/1_16/scroll.ts +1 -2
  159. package/src/options/1_17.ts +66 -0
  160. package/src/options/1_18.ts +101 -37
  161. package/src/options/1_21.ts +47 -25
  162. package/src/options/1_22/index.ts +1 -0
  163. package/src/options/1_22/init.ts +19 -0
  164. package/src/options/1_22/options.ts +38 -45
  165. package/src/options/1_22/scroll.ts +1 -1
  166. package/src/options/1_23.ts +33 -21
  167. package/src/options/1_24.ts +23 -11
  168. package/src/options/1_25/options.ts +22 -4
  169. package/src/options/1_25/scroll.ts +2 -1
  170. package/src/options/2_0.ts +342 -0
  171. package/src/options/codec.ts +98 -0
  172. package/src/options/index.ts +4 -0
  173. package/src/options/latest.ts +14 -0
  174. package/src/options/types.ts +152 -42
  175. package/tsconfig.build.json +9 -1
  176. package/tsconfig.build.tsbuildinfo +1 -1
  177. package/esm/adb/client.d.ts +0 -41
  178. package/esm/adb/client.d.ts.map +0 -1
  179. package/esm/adb/client.js +0 -224
  180. package/esm/adb/client.js.map +0 -1
  181. package/esm/adb/connection.d.ts +0 -49
  182. package/esm/adb/connection.d.ts.map +0 -1
  183. package/esm/adb/connection.js +0 -122
  184. package/esm/adb/connection.js.map +0 -1
  185. package/esm/adb/index.d.ts +0 -4
  186. package/esm/adb/index.d.ts.map +0 -1
  187. package/esm/adb/index.js +0 -4
  188. package/esm/adb/index.js.map +0 -1
  189. package/esm/adb/options/1_16.d.ts +0 -8
  190. package/esm/adb/options/1_16.d.ts.map +0 -1
  191. package/esm/adb/options/1_16.js +0 -20
  192. package/esm/adb/options/1_16.js.map +0 -1
  193. package/esm/adb/options/1_22.d.ts +0 -8
  194. package/esm/adb/options/1_22.d.ts.map +0 -1
  195. package/esm/adb/options/1_22.js +0 -17
  196. package/esm/adb/options/1_22.js.map +0 -1
  197. package/esm/adb/options/1_26.d.ts +0 -9
  198. package/esm/adb/options/1_26.d.ts.map +0 -1
  199. package/esm/adb/options/1_26.js +0 -11
  200. package/esm/adb/options/1_26.js.map +0 -1
  201. package/esm/adb/options/2_0.d.ts +0 -8
  202. package/esm/adb/options/2_0.d.ts.map +0 -1
  203. package/esm/adb/options/2_0.js +0 -13
  204. package/esm/adb/options/2_0.js.map +0 -1
  205. package/esm/adb/options/index.d.ts +0 -4
  206. package/esm/adb/options/index.d.ts.map +0 -1
  207. package/esm/adb/options/index.js +0 -4
  208. package/esm/adb/options/index.js.map +0 -1
  209. package/esm/adb/options/types.d.ts +0 -24
  210. package/esm/adb/options/types.d.ts.map +0 -1
  211. package/esm/adb/options/types.js +0 -37
  212. package/esm/adb/options/types.js.map +0 -1
  213. package/esm/codec.d.ts +0 -34
  214. package/esm/codec.d.ts.map +0 -1
  215. package/esm/codec.js +0 -37
  216. package/esm/codec.js.map +0 -1
  217. package/esm/control/simple.d.ts +0 -5
  218. package/esm/control/simple.d.ts.map +0 -1
  219. package/esm/control/simple.js.map +0 -1
  220. package/esm/decoder.d.ts +0 -2
  221. package/esm/decoder.d.ts.map +0 -1
  222. package/esm/decoder.js +0 -2
  223. package/esm/decoder.js.map +0 -1
  224. package/esm/options/1.17.d.ts +0 -3
  225. package/esm/options/1.17.d.ts.map +0 -1
  226. package/esm/options/1.17.js +0 -2
  227. package/esm/options/1.17.js.map +0 -1
  228. package/esm/options/1_16/h264-configuration.d.ts +0 -49
  229. package/esm/options/1_16/h264-configuration.d.ts.map +0 -1
  230. package/esm/options/1_16/h264-configuration.js +0 -414
  231. package/esm/options/1_16/h264-configuration.js.map +0 -1
  232. package/esm/options/1_16/sps.d.ts +0 -22
  233. package/esm/options/1_16/sps.d.ts.map +0 -1
  234. package/esm/options/1_16/sps.js +0 -263
  235. package/esm/options/1_16/sps.js.map +0 -1
  236. package/esm/options/1_26.d.ts +0 -57
  237. package/esm/options/1_26.d.ts.map +0 -1
  238. package/esm/options/1_26.js +0 -67
  239. package/esm/options/1_26.js.map +0 -1
  240. package/esm/options/2.d.ts +0 -57
  241. package/esm/options/2.d.ts.map +0 -1
  242. package/esm/options/2.js +0 -67
  243. package/esm/options/2.js.map +0 -1
  244. package/src/adb/client.ts +0 -329
  245. package/src/adb/connection.ts +0 -209
  246. package/src/adb/index.ts +0 -3
  247. package/src/adb/options/1_16.ts +0 -32
  248. package/src/adb/options/1_22.ts +0 -26
  249. package/src/adb/options/index.ts +0 -3
  250. package/src/adb/options/types.ts +0 -75
  251. package/src/codec.ts +0 -35
  252. package/src/options/1_16/h264-configuration.ts +0 -485
@@ -6,63 +6,127 @@ import type {
6
6
  } from "../control/index.js";
7
7
  import { ScrcpyControlMessageType } from "../control/index.js";
8
8
 
9
- import type { ScrcpyOptionsInit1_16 } from "./1_16/options.js";
10
9
  import {
10
+ SCRCPY_CONTROL_MESSAGE_TYPES_1_16,
11
11
  ScrcpyBackOrScreenOnControlMessage1_16,
12
+ ScrcpyLogLevel1_16,
12
13
  ScrcpyOptions1_16,
13
- } from "./1_16/options.js";
14
+ ScrcpyVideoOrientation1_16,
15
+ } from "./1_16/index.js";
16
+ import type { ScrcpyOptionsInit1_17 } from "./1_17.js";
17
+ import { ScrcpyOptions1_17 } from "./1_17.js";
18
+ import type { ScrcpyEncoder } from "./types.js";
19
+ import { ScrcpyOptionsBase } from "./types.js";
14
20
 
15
- export interface ScrcpyOptionsInit1_18 extends ScrcpyOptionsInit1_16 {
16
- powerOffOnClose: boolean;
21
+ export enum ScrcpyLogLevel1_18 {
22
+ Verbose = "verbose",
23
+ Debug = "debug",
24
+ Info = "info",
25
+ Warn = "warn",
26
+ Error = "error",
27
+ }
28
+
29
+ export enum ScrcpyVideoOrientation1_18 {
30
+ Initial = -2,
31
+ Unlocked = -1,
32
+ Portrait = 0,
33
+ Landscape = 1,
34
+ PortraitFlipped = 2,
35
+ LandscapeFlipped = 3,
36
+ }
37
+
38
+ export interface ScrcpyOptionsInit1_18
39
+ extends Omit<ScrcpyOptionsInit1_17, "logLevel" | "lockVideoOrientation"> {
40
+ logLevel?: ScrcpyLogLevel1_18;
41
+
42
+ lockVideoOrientation?: ScrcpyVideoOrientation1_18;
43
+
44
+ powerOffOnClose?: boolean;
17
45
  }
18
46
 
19
47
  export const ScrcpyBackOrScreenOnControlMessage1_18 = new Struct()
20
- .fields(ScrcpyBackOrScreenOnControlMessage1_16)
48
+ .concat(ScrcpyBackOrScreenOnControlMessage1_16)
21
49
  .uint8("action", placeholder<AndroidKeyEventAction>());
22
50
 
23
51
  export type ScrcpyBackOrScreenOnControlMessage1_18 =
24
52
  (typeof ScrcpyBackOrScreenOnControlMessage1_18)["TInit"];
25
53
 
26
- export class ScrcpyOptions1_18<
27
- T extends ScrcpyOptionsInit1_18 = ScrcpyOptionsInit1_18
28
- > extends ScrcpyOptions1_16<T> {
29
- constructor(value: Partial<ScrcpyOptionsInit1_18>) {
30
- super(value);
54
+ export const SCRCPY_CONTROL_MESSAGE_TYPES_1_18 =
55
+ SCRCPY_CONTROL_MESSAGE_TYPES_1_16.slice();
56
+ SCRCPY_CONTROL_MESSAGE_TYPES_1_18.splice(
57
+ 6,
58
+ 0,
59
+ ScrcpyControlMessageType.ExpandSettingPanel
60
+ );
61
+
62
+ const LOG_LEVEL_MAP = {
63
+ [ScrcpyLogLevel1_18.Verbose]: ScrcpyLogLevel1_16.Debug,
64
+ [ScrcpyLogLevel1_18.Debug]: ScrcpyLogLevel1_16.Debug,
65
+ [ScrcpyLogLevel1_18.Info]: ScrcpyLogLevel1_16.Info,
66
+ [ScrcpyLogLevel1_18.Warn]: ScrcpyLogLevel1_16.Warn,
67
+ [ScrcpyLogLevel1_18.Error]: ScrcpyLogLevel1_16.Error,
68
+ };
69
+
70
+ const VIDEO_ORIENTATION_MAP = {
71
+ [ScrcpyVideoOrientation1_18.Initial]: ScrcpyVideoOrientation1_16.Unlocked,
72
+ [ScrcpyVideoOrientation1_18.Unlocked]: ScrcpyVideoOrientation1_16.Unlocked,
73
+ [ScrcpyVideoOrientation1_18.Portrait]: ScrcpyVideoOrientation1_16.Portrait,
74
+ [ScrcpyVideoOrientation1_18.Landscape]:
75
+ ScrcpyVideoOrientation1_16.Landscape,
76
+ [ScrcpyVideoOrientation1_18.PortraitFlipped]:
77
+ ScrcpyVideoOrientation1_16.PortraitFlipped,
78
+ [ScrcpyVideoOrientation1_18.LandscapeFlipped]:
79
+ ScrcpyVideoOrientation1_16.LandscapeFlipped,
80
+ };
81
+ export class ScrcpyOptions1_18 extends ScrcpyOptionsBase<
82
+ ScrcpyOptionsInit1_18,
83
+ ScrcpyOptions1_17
84
+ > {
85
+ public static readonly DEFAULTS = {
86
+ ...ScrcpyOptions1_17.DEFAULTS,
87
+ logLevel: ScrcpyLogLevel1_18.Debug,
88
+ lockVideoOrientation: ScrcpyVideoOrientation1_18.Unlocked,
89
+ powerOffOnClose: false,
90
+ } as const satisfies Required<ScrcpyOptionsInit1_18>;
91
+
92
+ public static readonly SERIALIZE_ORDER = [
93
+ ...ScrcpyOptions1_17.SERIALIZE_ORDER,
94
+ "powerOffOnClose",
95
+ ] as const satisfies readonly (keyof ScrcpyOptionsInit1_18)[];
96
+
97
+ public override get defaults(): Required<ScrcpyOptionsInit1_18> {
98
+ return ScrcpyOptions1_18.DEFAULTS;
31
99
  }
32
100
 
33
- protected override getArgumentOrder(): (keyof T)[] {
34
- return super.getArgumentOrder().concat(["powerOffOnClose"]);
101
+ public override get controlMessageTypes() {
102
+ return SCRCPY_CONTROL_MESSAGE_TYPES_1_18;
35
103
  }
36
104
 
37
- public override getDefaultValue(): T {
38
- return {
39
- ...super.getDefaultValue(),
40
- powerOffOnClose: false,
41
- };
105
+ constructor(init: ScrcpyOptionsInit1_18) {
106
+ const value = { ...ScrcpyOptions1_18.DEFAULTS, ...init };
107
+ super(
108
+ new ScrcpyOptions1_17({
109
+ ...init,
110
+ logLevel: LOG_LEVEL_MAP[value.logLevel],
111
+ lockVideoOrientation:
112
+ VIDEO_ORIENTATION_MAP[value.lockVideoOrientation],
113
+ }),
114
+ value
115
+ );
42
116
  }
43
117
 
44
- public override getOutputEncoderNameRegex(): RegExp {
45
- return /\s+scrcpy --encoder '(.*?)'/;
118
+ public serialize(): string[] {
119
+ return ScrcpyOptions1_16.serialize(
120
+ this.value,
121
+ ScrcpyOptions1_18.SERIALIZE_ORDER
122
+ );
46
123
  }
47
124
 
48
- public override getControlMessageTypes(): ScrcpyControlMessageType[] {
49
- /**
50
- * 0 InjectKeycode
51
- * 1 InjectText
52
- * 2 InjectTouch
53
- * 3 InjectScroll
54
- * 4 BackOrScreenOn
55
- * 5 ExpandNotificationPanel
56
- * 6 ExpandSettingsPanel
57
- * 7 CollapseNotificationPanel
58
- * 8 GetClipboard
59
- * 9 SetClipboard
60
- * 10 SetScreenPowerMode
61
- * 11 RotateDevice
62
- */
63
- const types = super.getControlMessageTypes();
64
- types.splice(6, 0, ScrcpyControlMessageType.ExpandSettingPanel);
65
- return types;
125
+ public override parseEncoder(line: string): ScrcpyEncoder | undefined {
126
+ return ScrcpyOptions1_17.parseEncoder(
127
+ line,
128
+ /\s+scrcpy --encoder '(.*?)'/
129
+ );
66
130
  }
67
131
 
68
132
  public override serializeBackOrScreenOnControlMessage(
@@ -1,13 +1,12 @@
1
1
  // cspell: ignore autosync
2
2
 
3
- import Struct from "@yume-chan/struct";
3
+ import Struct, { placeholder } from "@yume-chan/struct";
4
4
 
5
5
  import type { ScrcpySetClipboardControlMessage } from "../control/index.js";
6
- import { ScrcpyControlMessageType } from "../control/index.js";
7
6
 
8
7
  import type { ScrcpyOptionsInit1_18 } from "./1_18.js";
9
8
  import { ScrcpyOptions1_18 } from "./1_18.js";
10
- import { toScrcpyOptionValue } from "./types.js";
9
+ import { ScrcpyOptionsBase, toScrcpyOptionValue } from "./types.js";
11
10
 
12
11
  export interface ScrcpyOptionsInit1_21 extends ScrcpyOptionsInit1_18 {
13
12
  clipboardAutosync?: boolean;
@@ -18,39 +17,62 @@ function toSnakeCase(input: string): string {
18
17
  }
19
18
 
20
19
  export const ScrcpySetClipboardControlMessage1_21 = new Struct()
21
- .uint8("type", ScrcpyControlMessageType.SetClipboard as const)
20
+ .uint8("type")
22
21
  .uint64("sequence")
23
- .int8("paste")
22
+ .int8("paste", placeholder<boolean>())
24
23
  .uint32("length")
25
24
  .string("content", { lengthField: "length" });
26
25
 
27
26
  export type ScrcpySetClipboardControlMessage1_21 =
28
27
  (typeof ScrcpySetClipboardControlMessage1_21)["TInit"];
29
28
 
30
- export class ScrcpyOptions1_21<
31
- T extends ScrcpyOptionsInit1_21 = ScrcpyOptionsInit1_21
32
- > extends ScrcpyOptions1_18<T> {
33
- public constructor(init: Partial<ScrcpyOptionsInit1_21>) {
34
- super(init);
29
+ export class ScrcpyOptions1_21 extends ScrcpyOptionsBase<
30
+ ScrcpyOptionsInit1_21,
31
+ ScrcpyOptions1_18
32
+ > {
33
+ public static readonly DEFAULTS = {
34
+ ...ScrcpyOptions1_18.DEFAULTS,
35
+ clipboardAutosync: true,
36
+ } as const satisfies Required<ScrcpyOptionsInit1_21>;
37
+
38
+ public static serialize<T extends object>(
39
+ options: T,
40
+ defaults: Required<T>
41
+ ): string[] {
42
+ // 1.21 changed the format of arguments
43
+ const result: string[] = [];
44
+ for (const [key, value] of Object.entries(options)) {
45
+ const serializedValue = toScrcpyOptionValue(value, undefined);
46
+ if (!serializedValue) {
47
+ continue;
48
+ }
49
+
50
+ const defaultValue = toScrcpyOptionValue(
51
+ defaults[key as keyof T],
52
+ undefined
53
+ );
54
+ if (serializedValue == defaultValue) {
55
+ continue;
56
+ }
57
+
58
+ result.push(`${toSnakeCase(key)}=${serializedValue}`);
59
+ }
60
+ return result;
35
61
  }
36
62
 
37
- public override getDefaultValue(): T {
38
- return {
39
- ...super.getDefaultValue(),
40
- clipboardAutosync: true,
41
- };
63
+ public override get defaults(): Required<ScrcpyOptionsInit1_21> {
64
+ return ScrcpyOptions1_21.DEFAULTS;
42
65
  }
43
66
 
44
- public override formatServerArguments(): string[] {
45
- // 1.21 changed the format of arguments
46
- // So `getArgumentOrder()` is no longer needed
47
- return Object.entries(this.value)
48
- .map(
49
- ([key, value]) =>
50
- [key, toScrcpyOptionValue(value, undefined)] as const
51
- )
52
- .filter((pair): pair is [string, string] => pair[1] !== undefined)
53
- .map(([key, value]) => `${toSnakeCase(key)}=${value}`);
67
+ public constructor(init: ScrcpyOptionsInit1_21) {
68
+ super(new ScrcpyOptions1_18(init), {
69
+ ...ScrcpyOptions1_21.DEFAULTS,
70
+ ...init,
71
+ });
72
+ }
73
+
74
+ public override serialize(): string[] {
75
+ return ScrcpyOptions1_21.serialize(this.value, this.defaults);
54
76
  }
55
77
 
56
78
  public override serializeSetClipboardControlMessage(
@@ -1,2 +1,3 @@
1
+ export * from "./init.js";
1
2
  export * from "./options.js";
2
3
  export * from "./scroll.js";
@@ -0,0 +1,19 @@
1
+ import type { ScrcpyOptionsInit1_21 } from "../1_21.js";
2
+
3
+ export interface ScrcpyOptionsInit1_22 extends ScrcpyOptionsInit1_21 {
4
+ downsizeOnError?: boolean;
5
+
6
+ /**
7
+ * Send device name and size at start of video stream.
8
+ *
9
+ * @default true
10
+ */
11
+ sendDeviceMeta?: boolean;
12
+
13
+ /**
14
+ * Send a `0` byte on start of video stream to detect connection issues
15
+ *
16
+ * @default true
17
+ */
18
+ sendDummyByte?: boolean;
19
+ }
@@ -1,59 +1,52 @@
1
+ import type { ReadableStream } from "@yume-chan/stream-extra";
2
+ import type { ValueOrPromise } from "@yume-chan/struct";
3
+
1
4
  import type { ScrcpyScrollController } from "../1_16/index.js";
2
- import type { ScrcpyOptionsInit1_21 } from "../1_21.js";
3
5
  import { ScrcpyOptions1_21 } from "../1_21.js";
6
+ import type { ScrcpyVideoStream } from "../codec.js";
7
+ import { ScrcpyVideoCodecId } from "../codec.js";
8
+ import { ScrcpyOptionsBase } from "../types.js";
4
9
 
10
+ import type { ScrcpyOptionsInit1_22 } from "./init.js";
5
11
  import { ScrcpyScrollController1_22 } from "./scroll.js";
6
12
 
7
- export interface ScrcpyOptionsInit1_22 extends ScrcpyOptionsInit1_21 {
8
- downsizeOnError: boolean;
9
-
10
- /**
11
- * Send device name and size at start of video stream.
12
- *
13
- * @default true
14
- */
15
- sendDeviceMeta: boolean;
16
-
17
- /**
18
- * Send a `0` byte on start of video stream to detect connection issues
19
- *
20
- * @default true
21
- */
22
- sendDummyByte: boolean;
23
-
24
- /**
25
- * Implies `sendDeviceMeta: false`, `sendFrameMeta: false` and `sendDummyByte: false`
26
- *
27
- * @default false
28
- */
29
- rawVideoStream: boolean;
30
- }
13
+ export class ScrcpyOptions1_22 extends ScrcpyOptionsBase<
14
+ ScrcpyOptionsInit1_22,
15
+ ScrcpyOptions1_21
16
+ > {
17
+ public static readonly DEFAULTS = {
18
+ ...ScrcpyOptions1_21.DEFAULTS,
19
+ downsizeOnError: true,
20
+ sendDeviceMeta: true,
21
+ sendDummyByte: true,
22
+ } as const satisfies Required<ScrcpyOptionsInit1_22>;
23
+
24
+ public override get defaults(): Required<ScrcpyOptionsInit1_22> {
25
+ return ScrcpyOptions1_22.DEFAULTS;
26
+ }
31
27
 
32
- export class ScrcpyOptions1_22<
33
- T extends ScrcpyOptionsInit1_22 = ScrcpyOptionsInit1_22
34
- > extends ScrcpyOptions1_21<T> {
35
- public constructor(init: Partial<ScrcpyOptionsInit1_22>) {
36
- if (init.rawVideoStream) {
37
- // Set implied options for client-side processing
38
- init.sendDeviceMeta = false;
39
- init.sendFrameMeta = false;
40
- init.sendDummyByte = false;
41
- }
28
+ public constructor(init: ScrcpyOptionsInit1_22) {
29
+ super(new ScrcpyOptions1_21(init), {
30
+ ...ScrcpyOptions1_22.DEFAULTS,
31
+ ...init,
32
+ });
33
+ }
42
34
 
43
- super(init);
35
+ public override parseVideoStreamMetadata(
36
+ stream: ReadableStream<Uint8Array>
37
+ ): ValueOrPromise<ScrcpyVideoStream> {
38
+ if (!this.value.sendDeviceMeta) {
39
+ return { stream, metadata: { codec: ScrcpyVideoCodecId.H264 } };
40
+ } else {
41
+ return this._base.parseVideoStreamMetadata(stream);
42
+ }
44
43
  }
45
44
 
46
- public override getDefaultValue(): T {
47
- return {
48
- ...super.getDefaultValue(),
49
- downsizeOnError: true,
50
- sendDeviceMeta: true,
51
- sendDummyByte: true,
52
- rawVideoStream: false,
53
- };
45
+ public override serialize(): string[] {
46
+ return ScrcpyOptions1_21.serialize(this.value, this.defaults);
54
47
  }
55
48
 
56
- public override getScrollController(): ScrcpyScrollController {
49
+ public override createScrollController(): ScrcpyScrollController {
57
50
  return new ScrcpyScrollController1_22();
58
51
  }
59
52
  }
@@ -6,7 +6,7 @@ import {
6
6
  } from "../1_16/index.js";
7
7
 
8
8
  export const ScrcpyInjectScrollControlMessage1_22 = new Struct()
9
- .fields(ScrcpyInjectScrollControlMessage1_16)
9
+ .concat(ScrcpyInjectScrollControlMessage1_16)
10
10
  .int32("buttons");
11
11
 
12
12
  export type ScrcpyInjectScrollControlMessage1_22 =
@@ -1,40 +1,52 @@
1
1
  import { TransformStream } from "@yume-chan/stream-extra";
2
2
 
3
- import type { ScrcpyOptionsInit1_22 } from "./1_22/options.js";
4
- import { ScrcpyOptions1_22 } from "./1_22/options.js";
5
- import type { ScrcpyVideoStreamPacket } from "./types.js";
3
+ import { ScrcpyOptions1_21 } from "./1_21.js";
4
+ import type { ScrcpyOptionsInit1_22 } from "./1_22/index.js";
5
+ import { ScrcpyOptions1_22 } from "./1_22/index.js";
6
+ import type { ScrcpyMediaStreamPacket } from "./codec.js";
7
+ import { ScrcpyOptionsBase } from "./types.js";
6
8
 
7
9
  export interface ScrcpyOptionsInit1_23 extends ScrcpyOptionsInit1_22 {
8
- cleanup: boolean;
10
+ cleanup?: boolean;
9
11
  }
10
12
 
11
- const KEYFRAME_PTS = BigInt(1) << BigInt(62);
13
+ const KEYFRAME_PTS = 1n << 62n;
12
14
 
13
- export class ScrcpyOptions1_23<
14
- T extends ScrcpyOptionsInit1_23 = ScrcpyOptionsInit1_23
15
- > extends ScrcpyOptions1_22<T> {
16
- public constructor(init: Partial<ScrcpyOptionsInit1_23>) {
17
- super(init);
15
+ export class ScrcpyOptions1_23 extends ScrcpyOptionsBase<
16
+ ScrcpyOptionsInit1_23,
17
+ ScrcpyOptions1_22
18
+ > {
19
+ public static readonly DEFAULTS = {
20
+ ...ScrcpyOptions1_22.DEFAULTS,
21
+ cleanup: true,
22
+ } as const satisfies Required<ScrcpyOptionsInit1_23>;
23
+
24
+ public override get defaults(): Required<ScrcpyOptionsInit1_23> {
25
+ return ScrcpyOptions1_23.DEFAULTS;
18
26
  }
19
27
 
20
- public override getDefaultValue(): T {
21
- return {
22
- ...super.getDefaultValue(),
23
- cleanup: true,
24
- };
28
+ public constructor(init: ScrcpyOptionsInit1_22) {
29
+ super(new ScrcpyOptions1_22(init), {
30
+ ...ScrcpyOptions1_23.DEFAULTS,
31
+ ...init,
32
+ });
33
+ }
34
+
35
+ public override serialize(): string[] {
36
+ return ScrcpyOptions1_21.serialize(this.value, this.defaults);
25
37
  }
26
38
 
27
- public override createVideoStreamTransformer(): TransformStream<
39
+ public override createMediaStreamTransformer(): TransformStream<
28
40
  Uint8Array,
29
- ScrcpyVideoStreamPacket
41
+ ScrcpyMediaStreamPacket
30
42
  > {
31
- const superStream = super.createVideoStreamTransformer();
43
+ const stream = this._base.createMediaStreamTransformer();
32
44
  return {
33
- writable: superStream.writable,
34
- readable: superStream.readable.pipeThrough(
45
+ writable: stream.writable,
46
+ readable: stream.readable.pipeThrough(
35
47
  new TransformStream({
36
48
  transform(packet, controller): void {
37
- if (packet.type !== "frame") {
49
+ if (packet.type !== "data") {
38
50
  controller.enqueue(packet);
39
51
  return;
40
52
  }
@@ -1,21 +1,33 @@
1
+ import { ScrcpyOptions1_21 } from "./1_21.js";
1
2
  import type { ScrcpyOptionsInit1_23 } from "./1_23.js";
2
3
  import { ScrcpyOptions1_23 } from "./1_23.js";
4
+ import { ScrcpyOptionsBase } from "./types.js";
3
5
 
4
6
  export interface ScrcpyOptionsInit1_24 extends ScrcpyOptionsInit1_23 {
5
- powerOn: boolean;
7
+ powerOn?: boolean;
6
8
  }
7
9
 
8
- export class ScrcpyOptions1_24<
9
- T extends ScrcpyOptionsInit1_24 = ScrcpyOptionsInit1_24
10
- > extends ScrcpyOptions1_23<T> {
11
- public constructor(init: Partial<ScrcpyOptionsInit1_24>) {
12
- super(init);
10
+ export class ScrcpyOptions1_24 extends ScrcpyOptionsBase<
11
+ ScrcpyOptionsInit1_24,
12
+ ScrcpyOptions1_23
13
+ > {
14
+ public static readonly DEFAULTS = {
15
+ ...ScrcpyOptions1_23.DEFAULTS,
16
+ powerOn: true,
17
+ } as const satisfies Required<ScrcpyOptionsInit1_24>;
18
+
19
+ public override get defaults(): Required<ScrcpyOptionsInit1_24> {
20
+ return ScrcpyOptions1_24.DEFAULTS;
21
+ }
22
+
23
+ public constructor(init: ScrcpyOptionsInit1_24) {
24
+ super(new ScrcpyOptions1_23(init), {
25
+ ...ScrcpyOptions1_24.DEFAULTS,
26
+ ...init,
27
+ });
13
28
  }
14
29
 
15
- public override getDefaultValue(): T {
16
- return {
17
- ...super.getDefaultValue(),
18
- powerOn: true,
19
- };
30
+ public override serialize(): string[] {
31
+ return ScrcpyOptions1_21.serialize(this.value, this.defaults);
20
32
  }
21
33
  }
@@ -1,13 +1,31 @@
1
1
  import type { ScrcpyScrollController } from "../1_16/index.js";
2
+ import { ScrcpyOptions1_21 } from "../1_21.js";
2
3
  import type { ScrcpyOptionsInit1_24 } from "../1_24.js";
3
4
  import { ScrcpyOptions1_24 } from "../1_24.js";
5
+ import { ScrcpyOptionsBase } from "../types.js";
4
6
 
5
7
  import { ScrcpyScrollController1_25 } from "./scroll.js";
6
8
 
7
- export class ScrcpyOptions1_25<
8
- T extends ScrcpyOptionsInit1_24 = ScrcpyOptionsInit1_24
9
- > extends ScrcpyOptions1_24<T> {
10
- public override getScrollController(): ScrcpyScrollController {
9
+ export class ScrcpyOptions1_25 extends ScrcpyOptionsBase<
10
+ ScrcpyOptionsInit1_24,
11
+ ScrcpyOptions1_24
12
+ > {
13
+ public override get defaults(): Required<ScrcpyOptionsInit1_24> {
14
+ return ScrcpyOptions1_24.DEFAULTS;
15
+ }
16
+
17
+ public constructor(init: ScrcpyOptionsInit1_24) {
18
+ super(new ScrcpyOptions1_24(init), {
19
+ ...ScrcpyOptions1_24.DEFAULTS,
20
+ ...init,
21
+ });
22
+ }
23
+
24
+ public override serialize(): string[] {
25
+ return ScrcpyOptions1_21.serialize(this.value, this.defaults);
26
+ }
27
+
28
+ public override createScrollController(): ScrcpyScrollController {
11
29
  return new ScrcpyScrollController1_25();
12
30
  }
13
31
  }
@@ -4,8 +4,9 @@ import Struct, {
4
4
  } from "@yume-chan/struct";
5
5
 
6
6
  import type { ScrcpyInjectScrollControlMessage } from "../../control/index.js";
7
- import { clamp, ScrcpyControlMessageType } from "../../control/index.js";
7
+ import { ScrcpyControlMessageType } from "../../control/index.js";
8
8
  import type { ScrcpyScrollController } from "../1_16/index.js";
9
+ import { clamp } from "../1_16/index.js";
9
10
 
10
11
  export const ScrcpyFloatToInt16NumberType: NumberFieldType = {
11
12
  size: 2,