@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,151 @@
1
+ import {
2
+ type WritableStream,
3
+ type WritableStreamDefaultWriter,
4
+ } from "@yume-chan/stream-extra";
5
+
6
+ import {
7
+ type ScrcpyOptions,
8
+ type ScrcpyScrollController,
9
+ } from "../options/index.js";
10
+
11
+ import {
12
+ ScrcpyInjectKeyCodeControlMessage,
13
+ type AndroidKeyEventAction,
14
+ } from "./inject-keycode.js";
15
+ import { type ScrcpyInjectScrollControlMessage } from "./inject-scroll.js";
16
+ import { ScrcpyInjectTextControlMessage } from "./inject-text.js";
17
+ import { ScrcpyInjectTouchControlMessage } from "./inject-touch.js";
18
+ import { ScrcpyRotateDeviceControlMessage } from "./rotate-device.js";
19
+ import {
20
+ ScrcpySetScreenPowerModeControlMessage,
21
+ type AndroidScreenPowerMode,
22
+ } from "./set-screen-power-mode.js";
23
+ import { ScrcpyControlMessageType } from "./type.js";
24
+
25
+ export class ScrcpyControlMessageSerializer {
26
+ private options: ScrcpyOptions<object>;
27
+ /** Control message type values for current version of server */
28
+ private types: ScrcpyControlMessageType[];
29
+ private writer: WritableStreamDefaultWriter<Uint8Array>;
30
+ private scrollController: ScrcpyScrollController;
31
+
32
+ public constructor(
33
+ stream: WritableStream<Uint8Array>,
34
+ options: ScrcpyOptions<object>
35
+ ) {
36
+ this.writer = stream.getWriter();
37
+
38
+ this.options = options;
39
+ this.types = options.getControlMessageTypes();
40
+ this.scrollController = options.getScrollController();
41
+ }
42
+
43
+ public getActualMessageType(type: ScrcpyControlMessageType): number {
44
+ const value = this.types.indexOf(type);
45
+ if (value === -1) {
46
+ throw new Error("Not supported");
47
+ }
48
+ return value;
49
+ }
50
+
51
+ public addMessageType<T extends { type: ScrcpyControlMessageType }>(
52
+ message: Omit<T, "type">,
53
+ type: T["type"]
54
+ ): T {
55
+ (message as T).type = this.getActualMessageType(type);
56
+ return message as T;
57
+ }
58
+
59
+ public injectKeyCode(
60
+ message: Omit<ScrcpyInjectKeyCodeControlMessage, "type">
61
+ ) {
62
+ return this.writer.write(
63
+ ScrcpyInjectKeyCodeControlMessage.serialize(
64
+ this.addMessageType(
65
+ message,
66
+ ScrcpyControlMessageType.InjectKeyCode
67
+ )
68
+ )
69
+ );
70
+ }
71
+
72
+ public injectText(text: string) {
73
+ return this.writer.write(
74
+ ScrcpyInjectTextControlMessage.serialize({
75
+ text,
76
+ type: this.getActualMessageType(
77
+ ScrcpyControlMessageType.InjectText
78
+ ),
79
+ })
80
+ );
81
+ }
82
+
83
+ /**
84
+ * `pressure` is a float value between 0 and 1.
85
+ */
86
+ public injectTouch(message: Omit<ScrcpyInjectTouchControlMessage, "type">) {
87
+ return this.writer.write(
88
+ ScrcpyInjectTouchControlMessage.serialize(
89
+ this.addMessageType(
90
+ message,
91
+ ScrcpyControlMessageType.InjectTouch
92
+ )
93
+ )
94
+ );
95
+ }
96
+
97
+ /**
98
+ * `scrollX` and `scrollY` are float values between 0 and 1.
99
+ */
100
+ public injectScroll(
101
+ message: Omit<ScrcpyInjectScrollControlMessage, "type">
102
+ ) {
103
+ const data = this.scrollController.serializeScrollMessage(
104
+ this.addMessageType(message, ScrcpyControlMessageType.InjectScroll)
105
+ );
106
+
107
+ if (!data) {
108
+ return;
109
+ }
110
+
111
+ return this.writer.write(data);
112
+ }
113
+
114
+ public async backOrScreenOn(action: AndroidKeyEventAction) {
115
+ const buffer = this.options.serializeBackOrScreenOnControlMessage({
116
+ action,
117
+ type: this.getActualMessageType(
118
+ ScrcpyControlMessageType.BackOrScreenOn
119
+ ),
120
+ });
121
+
122
+ if (buffer) {
123
+ return await this.writer.write(buffer);
124
+ }
125
+ }
126
+
127
+ public setScreenPowerMode(mode: AndroidScreenPowerMode) {
128
+ return this.writer.write(
129
+ ScrcpySetScreenPowerModeControlMessage.serialize({
130
+ mode,
131
+ type: this.getActualMessageType(
132
+ ScrcpyControlMessageType.SetScreenPowerMode
133
+ ),
134
+ })
135
+ );
136
+ }
137
+
138
+ public rotateDevice() {
139
+ return this.writer.write(
140
+ ScrcpyRotateDeviceControlMessage.serialize({
141
+ type: this.getActualMessageType(
142
+ ScrcpyControlMessageType.RotateDevice
143
+ ),
144
+ })
145
+ );
146
+ }
147
+
148
+ public close() {
149
+ return this.writer.close();
150
+ }
151
+ }
@@ -0,0 +1,4 @@
1
+ import { type ScrcpySetClipboardControlMessage1_21 } from "../options/index.js";
2
+
3
+ export type ScrcpySetClipboardControlMessage =
4
+ ScrcpySetClipboardControlMessage1_21;
@@ -0,0 +1,17 @@
1
+ import Struct, { placeholder } from '@yume-chan/struct';
2
+
3
+ import { ScrcpyControlMessageType } from './type.js';
4
+
5
+ // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/view/SurfaceControl.java;l=659;drc=20303e05bf73796124ab70a279cf849b61b97905
6
+ export enum AndroidScreenPowerMode {
7
+ Off = 0,
8
+ Normal = 2
9
+ }
10
+
11
+ export const ScrcpySetScreenPowerModeControlMessage =
12
+ new Struct()
13
+ .uint8('type', ScrcpyControlMessageType.SetScreenPowerMode as const)
14
+ .uint8('mode', placeholder<AndroidScreenPowerMode>());
15
+
16
+ export type ScrcpySetScreenPowerModeControlMessage =
17
+ typeof ScrcpySetScreenPowerModeControlMessage['TInit'];
@@ -0,0 +1,17 @@
1
+ // https://github.com/Genymobile/scrcpy/blob/fa5b2a29e983a46b49531def9cf3d80c40c3de37/app/src/control_msg.h#L23
2
+ // For their message bodies, see https://github.com/Genymobile/scrcpy/blob/5c62f3419d252d10cd8c9cbb7c918b358b81f2d0/app/src/control_msg.c#L92
3
+ // Their IDs change between versions, so always use `options.getControlMessageTypes()`
4
+ export enum ScrcpyControlMessageType {
5
+ InjectKeyCode,
6
+ InjectText,
7
+ InjectTouch,
8
+ InjectScroll,
9
+ BackOrScreenOn,
10
+ ExpandNotificationPanel,
11
+ ExpandSettingPanel,
12
+ CollapseNotificationPanel,
13
+ GetClipboard,
14
+ SetClipboard,
15
+ SetScreenPowerMode,
16
+ RotateDevice,
17
+ }
@@ -0,0 +1,10 @@
1
+ import Struct from "@yume-chan/struct";
2
+
3
+ import { ScrcpyDeviceMessageType } from "./type.js";
4
+
5
+ export const ScrcpyAckClipboardDeviceMessage = new Struct()
6
+ .uint64("sequence")
7
+ .extra({ type: ScrcpyDeviceMessageType.AckClipboard as const });
8
+
9
+ export type ScrcpyAckClipboardDeviceMessage =
10
+ typeof ScrcpyAckClipboardDeviceMessage["TDeserializeResult"];
@@ -0,0 +1,11 @@
1
+ import Struct from "@yume-chan/struct";
2
+
3
+ import { ScrcpyDeviceMessageType } from "./type.js";
4
+
5
+ export const ScrcpyClipboardDeviceMessage = new Struct()
6
+ .uint32("length")
7
+ .string("content", { lengthField: "length" })
8
+ .extra({ type: ScrcpyDeviceMessageType.Clipboard as const });
9
+
10
+ export type ScrcpyClipboardDeviceMessage =
11
+ typeof ScrcpyClipboardDeviceMessage["TDeserializeResult"];
@@ -0,0 +1,4 @@
1
+ export * from "./ack-clipboard.js";
2
+ export * from "./clipboard.js";
3
+ export * from "./stream.js";
4
+ export * from "./type.js";
@@ -0,0 +1,29 @@
1
+ import { BufferedTransformStream } from "@yume-chan/stream-extra";
2
+
3
+ import { ScrcpyAckClipboardDeviceMessage } from "./ack-clipboard.js";
4
+ import { ScrcpyClipboardDeviceMessage } from "./clipboard.js";
5
+ import { ScrcpyDeviceMessageType } from "./type.js";
6
+
7
+ export type ScrcpyDeviceMessage =
8
+ | ScrcpyClipboardDeviceMessage
9
+ | ScrcpyAckClipboardDeviceMessage;
10
+
11
+ export class ScrcpyDeviceMessageDeserializeStream extends BufferedTransformStream<ScrcpyDeviceMessage> {
12
+ constructor() {
13
+ super(async (stream) => {
14
+ const type = await stream.read(1);
15
+ switch (type[0]) {
16
+ case ScrcpyDeviceMessageType.Clipboard:
17
+ return await ScrcpyClipboardDeviceMessage.deserialize(
18
+ stream
19
+ );
20
+ case ScrcpyDeviceMessageType.AckClipboard:
21
+ return await ScrcpyAckClipboardDeviceMessage.deserialize(
22
+ stream
23
+ );
24
+ default:
25
+ throw new Error("unknown control message type");
26
+ }
27
+ });
28
+ }
29
+ }
@@ -0,0 +1,5 @@
1
+ // https://github.com/Genymobile/scrcpy/blob/41abe021e2a73efd4899b0efcd0b9eef9ec68c9b/server/src/main/java/com/genymobile/scrcpy/DeviceMessage.java#L5
2
+ export enum ScrcpyDeviceMessageType {
3
+ Clipboard,
4
+ AckClipboard,
5
+ }
package/src/index.ts CHANGED
@@ -1,8 +1,5 @@
1
- export * from './client.js';
1
+ export * from './adb/index.js';
2
2
  export * from './codec.js';
3
- export * from './connection.js';
4
- export * from './decoder/index.js';
5
- export * from './message.js';
3
+ export * from './control/index.js';
4
+ export * from './device-message/index.js';
6
5
  export * from './options/index.js';
7
- export * from './push-server.js';
8
- export * from './utils.js';
@@ -0,0 +1,55 @@
1
+ import {
2
+ type AndroidCodecLevel,
3
+ type AndroidCodecProfile,
4
+ } from "../../codec.js";
5
+ import { type ScrcpyOptionValue } from "../types.js";
6
+
7
+ /**
8
+ * If the option you need is not in this type,
9
+ * please file an issue on GitHub.
10
+ */
11
+ export interface CodecOptionsInit {
12
+ profile: AndroidCodecProfile;
13
+ level: AndroidCodecLevel;
14
+
15
+ iFrameInterval: number;
16
+ maxBframes: number;
17
+ repeatPreviousFrameAfter: number;
18
+ maxPtsGapToEncoder: number;
19
+ }
20
+
21
+ function toDashCase(input: string) {
22
+ return input.replace(/([A-Z])/g, "-$1").toLowerCase();
23
+ }
24
+
25
+ const CODEC_OPTION_TYPES: Partial<
26
+ Record<keyof CodecOptionsInit, "long" | "float" | "string">
27
+ > = {
28
+ repeatPreviousFrameAfter: "long",
29
+ maxPtsGapToEncoder: "long",
30
+ };
31
+
32
+ export class CodecOptions implements ScrcpyOptionValue {
33
+ public value: Partial<CodecOptionsInit>;
34
+
35
+ public constructor(value: Partial<CodecOptionsInit>) {
36
+ this.value = value;
37
+ }
38
+
39
+ public toOptionValue(): string | undefined {
40
+ const entries = Object.entries(this.value).filter(
41
+ ([, value]) => value !== undefined
42
+ );
43
+
44
+ if (entries.length === 0) {
45
+ return undefined;
46
+ }
47
+
48
+ return entries
49
+ .map(([key, value]) => {
50
+ const type = CODEC_OPTION_TYPES[key as keyof CodecOptionsInit];
51
+ return `${toDashCase(key)}${type ? `:${type}` : ""}=${value}`;
52
+ })
53
+ .join(",");
54
+ }
55
+ }