@yume-chan/scrcpy 0.0.18 → 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 (288) hide show
  1. package/CHANGELOG.json +33 -0
  2. package/CHANGELOG.md +18 -1
  3. package/README.md +157 -183
  4. package/bin/scrcpy-server +0 -0
  5. package/bin/version.d.ts +1 -1
  6. package/bin/version.js +1 -1
  7. package/esm/codec/av1.d.ts +33 -0
  8. package/esm/codec/av1.d.ts.map +1 -0
  9. package/esm/codec/av1.js +35 -0
  10. package/esm/codec/av1.js.map +1 -0
  11. package/esm/codec/h264.d.ts +78 -0
  12. package/esm/codec/h264.d.ts.map +1 -0
  13. package/esm/codec/h264.js +256 -0
  14. package/esm/codec/h264.js.map +1 -0
  15. package/esm/codec/h265.d.ts +490 -0
  16. package/esm/codec/h265.d.ts.map +1 -0
  17. package/esm/codec/h265.js +1098 -0
  18. package/esm/codec/h265.js.map +1 -0
  19. package/esm/codec/index.d.ts +5 -0
  20. package/esm/codec/index.d.ts.map +1 -0
  21. package/esm/codec/index.js +5 -0
  22. package/esm/codec/index.js.map +1 -0
  23. package/esm/codec/nalu.d.ts +44 -0
  24. package/esm/codec/nalu.d.ts.map +1 -0
  25. package/esm/codec/nalu.js +310 -0
  26. package/esm/codec/nalu.js.map +1 -0
  27. package/esm/control/back-or-screen-on.d.ts +2 -2
  28. package/esm/control/back-or-screen-on.d.ts.map +1 -1
  29. package/esm/control/back-or-screen-on.js +1 -1
  30. package/esm/control/basic.d.ts +5 -0
  31. package/esm/control/basic.d.ts.map +1 -0
  32. package/esm/control/basic.js +3 -0
  33. package/esm/control/basic.js.map +1 -0
  34. package/esm/control/hover-helper.d.ts +17 -17
  35. package/esm/control/hover-helper.d.ts.map +1 -1
  36. package/esm/control/hover-helper.js +43 -43
  37. package/esm/control/hover-helper.js.map +1 -1
  38. package/esm/control/index.d.ts +13 -11
  39. package/esm/control/index.d.ts.map +1 -1
  40. package/esm/control/index.js +13 -11
  41. package/esm/control/index.js.map +1 -1
  42. package/esm/control/inject-keycode.d.ts +193 -60
  43. package/esm/control/inject-keycode.d.ts.map +1 -1
  44. package/esm/control/inject-keycode.js +198 -61
  45. package/esm/control/inject-keycode.js.map +1 -1
  46. package/esm/control/inject-scroll.d.ts +2 -2
  47. package/esm/control/inject-scroll.d.ts.map +1 -1
  48. package/esm/control/inject-scroll.js +1 -1
  49. package/esm/control/inject-text.d.ts +7 -8
  50. package/esm/control/inject-text.d.ts.map +1 -1
  51. package/esm/control/inject-text.js +5 -6
  52. package/esm/control/inject-text.js.map +1 -1
  53. package/esm/control/inject-touch.d.ts +32 -37
  54. package/esm/control/inject-touch.d.ts.map +1 -1
  55. package/esm/control/inject-touch.js +35 -62
  56. package/esm/control/inject-touch.js.map +1 -1
  57. package/esm/control/rotate-device.d.ts +4 -6
  58. package/esm/control/rotate-device.d.ts.map +1 -1
  59. package/esm/control/rotate-device.js +2 -4
  60. package/esm/control/rotate-device.js.map +1 -1
  61. package/esm/control/serializer.d.ts +25 -33
  62. package/esm/control/serializer.d.ts.map +1 -1
  63. package/esm/control/serializer.js +53 -78
  64. package/esm/control/serializer.js.map +1 -1
  65. package/esm/control/set-clipboard.d.ts +2 -2
  66. package/esm/control/set-clipboard.d.ts.map +1 -1
  67. package/esm/control/set-clipboard.js +1 -1
  68. package/esm/control/set-screen-power-mode.d.ts +10 -11
  69. package/esm/control/set-screen-power-mode.d.ts.map +1 -1
  70. package/esm/control/set-screen-power-mode.js +10 -11
  71. package/esm/control/set-screen-power-mode.js.map +1 -1
  72. package/esm/control/type.d.ts +28 -14
  73. package/esm/control/type.d.ts.map +1 -1
  74. package/esm/control/type.js +40 -18
  75. package/esm/control/type.js.map +1 -1
  76. package/esm/control/writer.d.ts +28 -0
  77. package/esm/control/writer.d.ts.map +1 -0
  78. package/esm/control/writer.js +53 -0
  79. package/esm/control/writer.js.map +1 -0
  80. package/esm/device-message/ack-clipboard.d.ts +8 -8
  81. package/esm/device-message/ack-clipboard.d.ts.map +1 -1
  82. package/esm/device-message/ack-clipboard.js +5 -5
  83. package/esm/device-message/clipboard.d.ts +9 -9
  84. package/esm/device-message/clipboard.d.ts.map +1 -1
  85. package/esm/device-message/clipboard.js +6 -6
  86. package/esm/device-message/index.d.ts +4 -4
  87. package/esm/device-message/index.js +4 -4
  88. package/esm/device-message/stream.d.ts +7 -7
  89. package/esm/device-message/stream.d.ts.map +1 -1
  90. package/esm/device-message/stream.js +34 -19
  91. package/esm/device-message/stream.js.map +1 -1
  92. package/esm/device-message/type.d.ts +4 -4
  93. package/esm/device-message/type.js +6 -6
  94. package/esm/index.d.ts +4 -5
  95. package/esm/index.d.ts.map +1 -1
  96. package/esm/index.js +4 -5
  97. package/esm/index.js.map +1 -1
  98. package/esm/options/1_16/codec-options.d.ts +19 -19
  99. package/esm/options/1_16/codec-options.d.ts.map +1 -1
  100. package/esm/options/1_16/codec-options.js +25 -25
  101. package/esm/options/1_16/codec-options.js.map +1 -1
  102. package/esm/options/1_16/float-to-uint16.d.ts +5 -0
  103. package/esm/options/1_16/float-to-uint16.d.ts.map +1 -0
  104. package/esm/options/1_16/float-to-uint16.js +27 -0
  105. package/esm/options/1_16/float-to-uint16.js.map +1 -0
  106. package/esm/options/1_16/index.d.ts +6 -4
  107. package/esm/options/1_16/index.d.ts.map +1 -1
  108. package/esm/options/1_16/index.js +6 -4
  109. package/esm/options/1_16/index.js.map +1 -1
  110. package/esm/options/1_16/init.d.ts +66 -0
  111. package/esm/options/1_16/init.d.ts.map +1 -0
  112. package/esm/options/1_16/init.js +16 -0
  113. package/esm/options/1_16/init.js.map +1 -0
  114. package/esm/options/1_16/message.d.ts +32 -0
  115. package/esm/options/1_16/message.d.ts.map +1 -0
  116. package/esm/options/1_16/message.js +37 -0
  117. package/esm/options/1_16/message.js.map +1 -0
  118. package/esm/options/1_16/options.d.ts +48 -93
  119. package/esm/options/1_16/options.d.ts.map +1 -1
  120. package/esm/options/1_16/options.js +152 -189
  121. package/esm/options/1_16/options.js.map +1 -1
  122. package/esm/options/1_16/scroll.d.ts +26 -26
  123. package/esm/options/1_16/scroll.d.ts.map +1 -1
  124. package/esm/options/1_16/scroll.js +54 -55
  125. package/esm/options/1_16/scroll.js.map +1 -1
  126. package/esm/options/1_17.d.ts +33 -0
  127. package/esm/options/1_17.d.ts.map +1 -0
  128. package/esm/options/1_17.js +42 -0
  129. package/esm/options/1_17.js.map +1 -0
  130. package/esm/options/1_18.d.ts +59 -19
  131. package/esm/options/1_18.d.ts.map +1 -1
  132. package/esm/options/1_18.js +78 -45
  133. package/esm/options/1_18.js.map +1 -1
  134. package/esm/options/1_21.d.ts +41 -20
  135. package/esm/options/1_21.d.ts.map +1 -1
  136. package/esm/options/1_21.js +51 -36
  137. package/esm/options/1_21.js.map +1 -1
  138. package/esm/options/1_22/index.d.ts +3 -2
  139. package/esm/options/1_22/index.d.ts.map +1 -1
  140. package/esm/options/1_22/index.js +3 -2
  141. package/esm/options/1_22/index.js.map +1 -1
  142. package/esm/options/1_22/init.d.ts +17 -0
  143. package/esm/options/1_22/init.d.ts.map +1 -0
  144. package/esm/options/1_22/init.js +2 -0
  145. package/esm/options/1_22/init.js.map +1 -0
  146. package/esm/options/1_22/options.d.ts +35 -28
  147. package/esm/options/1_22/options.d.ts.map +1 -1
  148. package/esm/options/1_22/options.js +36 -25
  149. package/esm/options/1_22/options.js.map +1 -1
  150. package/esm/options/1_22/scroll.d.ts +16 -16
  151. package/esm/options/1_22/scroll.d.ts.map +1 -1
  152. package/esm/options/1_22/scroll.js +14 -14
  153. package/esm/options/1_23.d.ts +36 -11
  154. package/esm/options/1_23.d.ts.map +1 -1
  155. package/esm/options/1_23.js +44 -34
  156. package/esm/options/1_23.js.map +1 -1
  157. package/esm/options/1_24.d.ts +34 -8
  158. package/esm/options/1_24.d.ts.map +1 -1
  159. package/esm/options/1_24.js +22 -12
  160. package/esm/options/1_24.js.map +1 -1
  161. package/esm/options/1_25/index.d.ts +2 -2
  162. package/esm/options/1_25/index.js +2 -2
  163. package/esm/options/1_25/options.d.ts +10 -5
  164. package/esm/options/1_25/options.d.ts.map +1 -1
  165. package/esm/options/1_25/options.js +21 -7
  166. package/esm/options/1_25/options.js.map +1 -1
  167. package/esm/options/1_25/scroll.d.ts +19 -18
  168. package/esm/options/1_25/scroll.d.ts.map +1 -1
  169. package/esm/options/1_25/scroll.js +33 -32
  170. package/esm/options/1_25/scroll.js.map +1 -1
  171. package/esm/options/2_0.d.ts +91 -0
  172. package/esm/options/2_0.d.ts.map +1 -0
  173. package/esm/options/2_0.js +244 -0
  174. package/esm/options/2_0.js.map +1 -0
  175. package/esm/options/codec.d.ts +52 -0
  176. package/esm/options/codec.d.ts.map +1 -0
  177. package/esm/options/codec.js +26 -0
  178. package/esm/options/codec.js.map +1 -0
  179. package/esm/options/index.d.ts +12 -8
  180. package/esm/options/index.d.ts.map +1 -1
  181. package/esm/options/index.js +12 -8
  182. package/esm/options/index.js.map +1 -1
  183. package/esm/options/latest.d.ts +12 -0
  184. package/esm/options/latest.d.ts.map +1 -0
  185. package/esm/options/latest.js +8 -0
  186. package/esm/options/latest.js.map +1 -0
  187. package/esm/options/types.d.ts +86 -46
  188. package/esm/options/types.d.ts.map +1 -1
  189. package/esm/options/types.js +69 -17
  190. package/esm/options/types.js.map +1 -1
  191. package/package.json +10 -16
  192. package/src/codec/av1.ts +33 -0
  193. package/src/codec/h264.ts +317 -0
  194. package/src/codec/h265.ts +1375 -0
  195. package/src/codec/index.ts +4 -0
  196. package/src/codec/nalu.ts +373 -0
  197. package/src/control/back-or-screen-on.ts +1 -1
  198. package/src/control/basic.ts +3 -0
  199. package/src/control/hover-helper.ts +2 -4
  200. package/src/control/index.ts +2 -0
  201. package/src/control/inject-keycode.ts +194 -51
  202. package/src/control/inject-scroll.ts +1 -1
  203. package/src/control/inject-text.ts +6 -9
  204. package/src/control/inject-touch.ts +16 -55
  205. package/src/control/rotate-device.ts +3 -7
  206. package/src/control/serializer.ts +49 -105
  207. package/src/control/set-clipboard.ts +1 -1
  208. package/src/control/set-screen-power-mode.ts +6 -9
  209. package/src/control/type.ts +32 -0
  210. package/src/control/writer.ts +87 -0
  211. package/src/device-message/ack-clipboard.ts +1 -1
  212. package/src/device-message/clipboard.ts +1 -1
  213. package/src/device-message/stream.ts +32 -12
  214. package/src/index.ts +4 -5
  215. package/src/options/1_16/codec-options.ts +5 -8
  216. package/src/options/1_16/float-to-uint16.ts +33 -0
  217. package/src/options/1_16/index.ts +3 -1
  218. package/src/options/1_16/init.ts +80 -0
  219. package/src/options/1_16/message.ts +55 -0
  220. package/src/options/1_16/options.ts +152 -256
  221. package/src/options/1_16/scroll.ts +2 -5
  222. package/src/options/1_17.ts +66 -0
  223. package/src/options/1_18.ts +106 -42
  224. package/src/options/1_21.ts +51 -30
  225. package/src/options/1_22/index.ts +1 -0
  226. package/src/options/1_22/init.ts +19 -0
  227. package/src/options/1_22/options.ts +40 -46
  228. package/src/options/1_22/scroll.ts +2 -2
  229. package/src/options/1_23.ts +33 -23
  230. package/src/options/1_24.ts +25 -11
  231. package/src/options/1_25/options.ts +25 -6
  232. package/src/options/1_25/scroll.ts +5 -7
  233. package/src/options/2_0.ts +342 -0
  234. package/src/options/codec.ts +98 -0
  235. package/src/options/index.ts +7 -3
  236. package/src/options/latest.ts +14 -0
  237. package/src/options/types.ts +158 -48
  238. package/tsconfig.build.json +9 -1
  239. package/tsconfig.build.tsbuildinfo +1 -1
  240. package/esm/adb/client.d.ts +0 -41
  241. package/esm/adb/client.d.ts.map +0 -1
  242. package/esm/adb/client.js +0 -243
  243. package/esm/adb/client.js.map +0 -1
  244. package/esm/adb/connection.d.ts +0 -47
  245. package/esm/adb/connection.d.ts.map +0 -1
  246. package/esm/adb/connection.js +0 -110
  247. package/esm/adb/connection.js.map +0 -1
  248. package/esm/adb/index.d.ts +0 -4
  249. package/esm/adb/index.d.ts.map +0 -1
  250. package/esm/adb/index.js +0 -4
  251. package/esm/adb/index.js.map +0 -1
  252. package/esm/adb/options/1_16.d.ts +0 -8
  253. package/esm/adb/options/1_16.d.ts.map +0 -1
  254. package/esm/adb/options/1_16.js +0 -20
  255. package/esm/adb/options/1_16.js.map +0 -1
  256. package/esm/adb/options/1_22.d.ts +0 -8
  257. package/esm/adb/options/1_22.d.ts.map +0 -1
  258. package/esm/adb/options/1_22.js +0 -17
  259. package/esm/adb/options/1_22.js.map +0 -1
  260. package/esm/adb/options/index.d.ts +0 -4
  261. package/esm/adb/options/index.d.ts.map +0 -1
  262. package/esm/adb/options/index.js +0 -4
  263. package/esm/adb/options/index.js.map +0 -1
  264. package/esm/adb/options/types.d.ts +0 -24
  265. package/esm/adb/options/types.d.ts.map +0 -1
  266. package/esm/adb/options/types.js +0 -37
  267. package/esm/adb/options/types.js.map +0 -1
  268. package/esm/codec.d.ts +0 -34
  269. package/esm/codec.d.ts.map +0 -1
  270. package/esm/codec.js +0 -37
  271. package/esm/codec.js.map +0 -1
  272. package/esm/options/1_16/h264-configuration.d.ts +0 -49
  273. package/esm/options/1_16/h264-configuration.d.ts.map +0 -1
  274. package/esm/options/1_16/h264-configuration.js +0 -414
  275. package/esm/options/1_16/h264-configuration.js.map +0 -1
  276. package/esm/options/1_16/sps.d.ts +0 -22
  277. package/esm/options/1_16/sps.d.ts.map +0 -1
  278. package/esm/options/1_16/sps.js +0 -263
  279. package/esm/options/1_16/sps.js.map +0 -1
  280. package/src/adb/client.ts +0 -345
  281. package/src/adb/connection.ts +0 -192
  282. package/src/adb/index.ts +0 -3
  283. package/src/adb/options/1_16.ts +0 -30
  284. package/src/adb/options/1_22.ts +0 -26
  285. package/src/adb/options/index.ts +0 -3
  286. package/src/adb/options/types.ts +0 -75
  287. package/src/codec.ts +0 -35
  288. package/src/options/1_16/h264-configuration.ts +0 -485
@@ -1,15 +1,29 @@
1
- export declare enum ScrcpyControlMessageType {
2
- InjectKeyCode = 0,
3
- InjectText = 1,
4
- InjectTouch = 2,
5
- InjectScroll = 3,
6
- BackOrScreenOn = 4,
7
- ExpandNotificationPanel = 5,
8
- ExpandSettingPanel = 6,
9
- CollapseNotificationPanel = 7,
10
- GetClipboard = 8,
11
- SetClipboard = 9,
12
- SetScreenPowerMode = 10,
13
- RotateDevice = 11
14
- }
1
+ import type { ScrcpyOptions } from "../options/index.js";
2
+ export declare enum ScrcpyControlMessageType {
3
+ InjectKeyCode = 0,
4
+ InjectText = 1,
5
+ InjectTouch = 2,
6
+ InjectScroll = 3,
7
+ BackOrScreenOn = 4,
8
+ ExpandNotificationPanel = 5,
9
+ ExpandSettingPanel = 6,
10
+ CollapseNotificationPanel = 7,
11
+ GetClipboard = 8,
12
+ SetClipboard = 9,
13
+ SetScreenPowerMode = 10,
14
+ RotateDevice = 11
15
+ }
16
+ /**
17
+ * Scrcpy control message types have different values between versions.
18
+ *
19
+ * This class provides a way to get the actual value for a given type.
20
+ */
21
+ export declare class ScrcpyControlMessageTypeValue {
22
+ private types;
23
+ constructor(options: ScrcpyOptions<object>);
24
+ get(type: ScrcpyControlMessageType): number;
25
+ fillMessageType<T extends {
26
+ type: ScrcpyControlMessageType;
27
+ }>(message: Omit<T, "type">, type: T["type"]): T;
28
+ }
15
29
  //# sourceMappingURL=type.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/control/type.ts"],"names":[],"mappings":"AAGA,oBAAY,wBAAwB;IAChC,aAAa,IAAA;IACb,UAAU,IAAA;IACV,WAAW,IAAA;IACX,YAAY,IAAA;IACZ,cAAc,IAAA;IACd,uBAAuB,IAAA;IACvB,kBAAkB,IAAA;IAClB,yBAAyB,IAAA;IACzB,YAAY,IAAA;IACZ,YAAY,IAAA;IACZ,kBAAkB,KAAA;IAClB,YAAY,KAAA;CACf"}
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/control/type.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,oBAAY,wBAAwB;IAChC,aAAa,IAAA;IACb,UAAU,IAAA;IACV,WAAW,IAAA;IACX,YAAY,IAAA;IACZ,cAAc,IAAA;IACd,uBAAuB,IAAA;IACvB,kBAAkB,IAAA;IAClB,yBAAyB,IAAA;IACzB,YAAY,IAAA;IACZ,YAAY,IAAA;IACZ,kBAAkB,KAAA;IAClB,YAAY,KAAA;CACf;AAED;;;;GAIG;AACH,qBAAa,6BAA6B;IACtC,OAAO,CAAC,KAAK,CAAsC;gBAEhC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;IAI1C,GAAG,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM;IAQ3C,eAAe,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,wBAAwB,CAAA;KAAE,EAC/D,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,EACxB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAChB,CAAC;CAIP"}
@@ -1,19 +1,41 @@
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 var ScrcpyControlMessageType;
5
- (function (ScrcpyControlMessageType) {
6
- ScrcpyControlMessageType[ScrcpyControlMessageType["InjectKeyCode"] = 0] = "InjectKeyCode";
7
- ScrcpyControlMessageType[ScrcpyControlMessageType["InjectText"] = 1] = "InjectText";
8
- ScrcpyControlMessageType[ScrcpyControlMessageType["InjectTouch"] = 2] = "InjectTouch";
9
- ScrcpyControlMessageType[ScrcpyControlMessageType["InjectScroll"] = 3] = "InjectScroll";
10
- ScrcpyControlMessageType[ScrcpyControlMessageType["BackOrScreenOn"] = 4] = "BackOrScreenOn";
11
- ScrcpyControlMessageType[ScrcpyControlMessageType["ExpandNotificationPanel"] = 5] = "ExpandNotificationPanel";
12
- ScrcpyControlMessageType[ScrcpyControlMessageType["ExpandSettingPanel"] = 6] = "ExpandSettingPanel";
13
- ScrcpyControlMessageType[ScrcpyControlMessageType["CollapseNotificationPanel"] = 7] = "CollapseNotificationPanel";
14
- ScrcpyControlMessageType[ScrcpyControlMessageType["GetClipboard"] = 8] = "GetClipboard";
15
- ScrcpyControlMessageType[ScrcpyControlMessageType["SetClipboard"] = 9] = "SetClipboard";
16
- ScrcpyControlMessageType[ScrcpyControlMessageType["SetScreenPowerMode"] = 10] = "SetScreenPowerMode";
17
- ScrcpyControlMessageType[ScrcpyControlMessageType["RotateDevice"] = 11] = "RotateDevice";
18
- })(ScrcpyControlMessageType = ScrcpyControlMessageType || (ScrcpyControlMessageType = {}));
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 var ScrcpyControlMessageType;
5
+ (function (ScrcpyControlMessageType) {
6
+ ScrcpyControlMessageType[ScrcpyControlMessageType["InjectKeyCode"] = 0] = "InjectKeyCode";
7
+ ScrcpyControlMessageType[ScrcpyControlMessageType["InjectText"] = 1] = "InjectText";
8
+ ScrcpyControlMessageType[ScrcpyControlMessageType["InjectTouch"] = 2] = "InjectTouch";
9
+ ScrcpyControlMessageType[ScrcpyControlMessageType["InjectScroll"] = 3] = "InjectScroll";
10
+ ScrcpyControlMessageType[ScrcpyControlMessageType["BackOrScreenOn"] = 4] = "BackOrScreenOn";
11
+ ScrcpyControlMessageType[ScrcpyControlMessageType["ExpandNotificationPanel"] = 5] = "ExpandNotificationPanel";
12
+ ScrcpyControlMessageType[ScrcpyControlMessageType["ExpandSettingPanel"] = 6] = "ExpandSettingPanel";
13
+ ScrcpyControlMessageType[ScrcpyControlMessageType["CollapseNotificationPanel"] = 7] = "CollapseNotificationPanel";
14
+ ScrcpyControlMessageType[ScrcpyControlMessageType["GetClipboard"] = 8] = "GetClipboard";
15
+ ScrcpyControlMessageType[ScrcpyControlMessageType["SetClipboard"] = 9] = "SetClipboard";
16
+ ScrcpyControlMessageType[ScrcpyControlMessageType["SetScreenPowerMode"] = 10] = "SetScreenPowerMode";
17
+ ScrcpyControlMessageType[ScrcpyControlMessageType["RotateDevice"] = 11] = "RotateDevice";
18
+ })(ScrcpyControlMessageType = ScrcpyControlMessageType || (ScrcpyControlMessageType = {}));
19
+ /**
20
+ * Scrcpy control message types have different values between versions.
21
+ *
22
+ * This class provides a way to get the actual value for a given type.
23
+ */
24
+ export class ScrcpyControlMessageTypeValue {
25
+ types;
26
+ constructor(options) {
27
+ this.types = options.controlMessageTypes;
28
+ }
29
+ get(type) {
30
+ const value = this.types.indexOf(type);
31
+ if (value === -1) {
32
+ throw new Error("Not supported");
33
+ }
34
+ return value;
35
+ }
36
+ fillMessageType(message, type) {
37
+ message.type = this.get(type);
38
+ return message;
39
+ }
40
+ }
19
41
  //# sourceMappingURL=type.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/control/type.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,6IAA6I;AAC7I,sFAAsF;AACtF,MAAM,CAAN,IAAY,wBAaX;AAbD,WAAY,wBAAwB;IAChC,yFAAa,CAAA;IACb,mFAAU,CAAA;IACV,qFAAW,CAAA;IACX,uFAAY,CAAA;IACZ,2FAAc,CAAA;IACd,6GAAuB,CAAA;IACvB,mGAAkB,CAAA;IAClB,iHAAyB,CAAA;IACzB,uFAAY,CAAA;IACZ,uFAAY,CAAA;IACZ,oGAAkB,CAAA;IAClB,wFAAY,CAAA;AAChB,CAAC,EAbW,wBAAwB,GAAxB,wBAAwB,KAAxB,wBAAwB,QAanC"}
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/control/type.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,6IAA6I;AAI7I,sFAAsF;AACtF,MAAM,CAAN,IAAY,wBAaX;AAbD,WAAY,wBAAwB;IAChC,yFAAa,CAAA;IACb,mFAAU,CAAA;IACV,qFAAW,CAAA;IACX,uFAAY,CAAA;IACZ,2FAAc,CAAA;IACd,6GAAuB,CAAA;IACvB,mGAAkB,CAAA;IAClB,iHAAyB,CAAA;IACzB,uFAAY,CAAA;IACZ,uFAAY,CAAA;IACZ,oGAAkB,CAAA;IAClB,wFAAY,CAAA;AAChB,CAAC,EAbW,wBAAwB,GAAxB,wBAAwB,KAAxB,wBAAwB,QAanC;AAED;;;;GAIG;AACH,MAAM,OAAO,6BAA6B;IAC9B,KAAK,CAAsC;IAEnD,YAAmB,OAA8B;QAC7C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAC7C,CAAC;IAEM,GAAG,CAAC,IAA8B;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;SACpC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,eAAe,CAClB,OAAwB,EACxB,IAAe;QAEd,OAAa,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,OAAY,CAAC;IACxB,CAAC;CACJ"}
@@ -0,0 +1,28 @@
1
+ import type { Consumable, WritableStreamDefaultWriter } from "@yume-chan/stream-extra";
2
+ import type { ScrcpyOptions } from "../options/index.js";
3
+ import type { AndroidKeyEventAction, ScrcpyInjectKeyCodeControlMessage } from "./inject-keycode.js";
4
+ import type { ScrcpyInjectScrollControlMessage } from "./inject-scroll.js";
5
+ import type { ScrcpyInjectTouchControlMessage } from "./inject-touch.js";
6
+ import type { AndroidScreenPowerMode } from "./set-screen-power-mode.js";
7
+ export declare class ScrcpyControlMessageWriter {
8
+ private _writer;
9
+ private _serializer;
10
+ constructor(writer: WritableStreamDefaultWriter<Consumable<Uint8Array>>, options: ScrcpyOptions<object>);
11
+ private write;
12
+ injectKeyCode(message: Omit<ScrcpyInjectKeyCodeControlMessage, "type">): Promise<void>;
13
+ injectText(text: string): Promise<void>;
14
+ /**
15
+ * `pressure` is a float value between 0 and 1.
16
+ */
17
+ injectTouch(message: Omit<ScrcpyInjectTouchControlMessage, "type">): Promise<void>;
18
+ /**
19
+ * `scrollX` and `scrollY` are float values between 0 and 1.
20
+ */
21
+ injectScroll(message: Omit<ScrcpyInjectScrollControlMessage, "type">): Promise<void>;
22
+ backOrScreenOn(action: AndroidKeyEventAction): Promise<void>;
23
+ setScreenPowerMode(mode: AndroidScreenPowerMode): Promise<void>;
24
+ rotateDevice(): Promise<void>;
25
+ releaseLock(): void;
26
+ close(): Promise<void>;
27
+ }
28
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/control/writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,UAAU,EACV,2BAA2B,EAC9B,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EACR,qBAAqB,EACrB,iCAAiC,EACpC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,qBAAa,0BAA0B;IACnC,OAAO,CAAC,OAAO,CAAsD;IACrE,OAAO,CAAC,WAAW,CAAiC;gBAGhD,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAC3D,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;YAMpB,KAAK;IAIN,aAAa,CACtB,OAAO,EAAE,IAAI,CAAC,iCAAiC,EAAE,MAAM,CAAC;IAK/C,UAAU,CAAC,IAAI,EAAE,MAAM;IAIpC;;OAEG;IACU,WAAW,CACpB,OAAO,EAAE,IAAI,CAAC,+BAA+B,EAAE,MAAM,CAAC;IAK1D;;OAEG;IACU,YAAY,CACrB,OAAO,EAAE,IAAI,CAAC,gCAAgC,EAAE,MAAM,CAAC;IAQ9C,cAAc,CAAC,MAAM,EAAE,qBAAqB;IAO5C,kBAAkB,CAAC,IAAI,EAAE,sBAAsB;IAI/C,YAAY;IAIlB,WAAW;IAIL,KAAK;CAGrB"}
@@ -0,0 +1,53 @@
1
+ import { ConsumableWritableStream } from "@yume-chan/stream-extra";
2
+ import { ScrcpyControlMessageSerializer } from "./serializer.js";
3
+ export class ScrcpyControlMessageWriter {
4
+ _writer;
5
+ _serializer;
6
+ constructor(writer, options) {
7
+ this._writer = writer;
8
+ this._serializer = new ScrcpyControlMessageSerializer(options);
9
+ }
10
+ async write(message) {
11
+ await ConsumableWritableStream.write(this._writer, message);
12
+ }
13
+ async injectKeyCode(message) {
14
+ await this.write(this._serializer.injectKeyCode(message));
15
+ }
16
+ async injectText(text) {
17
+ await this.write(this._serializer.injectText(text));
18
+ }
19
+ /**
20
+ * `pressure` is a float value between 0 and 1.
21
+ */
22
+ async injectTouch(message) {
23
+ await this.write(this._serializer.injectTouch(message));
24
+ }
25
+ /**
26
+ * `scrollX` and `scrollY` are float values between 0 and 1.
27
+ */
28
+ async injectScroll(message) {
29
+ const data = this._serializer.injectScroll(message);
30
+ if (data) {
31
+ await this.write(data);
32
+ }
33
+ }
34
+ async backOrScreenOn(action) {
35
+ const data = this._serializer.backOrScreenOn(action);
36
+ if (data) {
37
+ await this.write(data);
38
+ }
39
+ }
40
+ async setScreenPowerMode(mode) {
41
+ await this.write(this._serializer.setScreenPowerMode(mode));
42
+ }
43
+ async rotateDevice() {
44
+ await this.write(this._serializer.rotateDevice());
45
+ }
46
+ releaseLock() {
47
+ this._writer.releaseLock();
48
+ }
49
+ async close() {
50
+ await this._writer.close();
51
+ }
52
+ }
53
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/control/writer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAUnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAGjE,MAAM,OAAO,0BAA0B;IAC3B,OAAO,CAAsD;IAC7D,WAAW,CAAiC;IAEpD,YACI,MAA2D,EAC3D,OAA8B;QAE9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,OAAmB;QACnC,MAAM,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,aAAa,CACtB,OAAwD;QAExD,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAY;QAChC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,WAAW,CACpB,OAAsD;QAEtD,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY,CACrB,OAAuD;QAEvD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,IAAI,EAAE;YACN,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC1B;IACL,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,MAA6B;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,IAAI,EAAE;YACN,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC1B;IACL,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,IAA4B;QACxD,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,YAAY;QACrB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;IACtD,CAAC;IAEM,WAAW;QACd,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,KAAK;QACd,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CACJ"}
@@ -1,9 +1,9 @@
1
- import Struct from "@yume-chan/struct";
2
- import { ScrcpyDeviceMessageType } from "./type.js";
3
- export declare const ScrcpyAckClipboardDeviceMessage: Struct<{
4
- sequence: bigint;
5
- }, never, {
6
- type: ScrcpyDeviceMessageType.AckClipboard;
7
- }, undefined>;
8
- export type ScrcpyAckClipboardDeviceMessage = typeof ScrcpyAckClipboardDeviceMessage["TDeserializeResult"];
1
+ import Struct from "@yume-chan/struct";
2
+ import { ScrcpyDeviceMessageType } from "./type.js";
3
+ export declare const ScrcpyAckClipboardDeviceMessage: Struct<{
4
+ sequence: bigint;
5
+ }, never, {
6
+ type: ScrcpyDeviceMessageType.AckClipboard;
7
+ }, undefined>;
8
+ export type ScrcpyAckClipboardDeviceMessage = (typeof ScrcpyAckClipboardDeviceMessage)["TDeserializeResult"];
9
9
  //# sourceMappingURL=ack-clipboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ack-clipboard.d.ts","sourceRoot":"","sources":["../../src/device-message/ack-clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEpD,eAAO,MAAM,+BAA+B;;;;aAEuB,CAAC;AAEpE,MAAM,MAAM,+BAA+B,GACvC,OAAO,+BAA+B,CAAC,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"ack-clipboard.d.ts","sourceRoot":"","sources":["../../src/device-message/ack-clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEpD,eAAO,MAAM,+BAA+B;;;;aAEuB,CAAC;AAEpE,MAAM,MAAM,+BAA+B,GACvC,CAAC,OAAO,+BAA+B,CAAC,CAAC,oBAAoB,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
- import Struct from "@yume-chan/struct";
2
- import { ScrcpyDeviceMessageType } from "./type.js";
3
- export const ScrcpyAckClipboardDeviceMessage = new Struct()
4
- .uint64("sequence")
5
- .extra({ type: ScrcpyDeviceMessageType.AckClipboard });
1
+ import Struct from "@yume-chan/struct";
2
+ import { ScrcpyDeviceMessageType } from "./type.js";
3
+ export const ScrcpyAckClipboardDeviceMessage = new Struct()
4
+ .uint64("sequence")
5
+ .extra({ type: ScrcpyDeviceMessageType.AckClipboard });
6
6
  //# sourceMappingURL=ack-clipboard.js.map
@@ -1,10 +1,10 @@
1
- import Struct from "@yume-chan/struct";
2
- import { ScrcpyDeviceMessageType } from "./type.js";
3
- export declare const ScrcpyClipboardDeviceMessage: Struct<{
4
- length: number;
5
- content: string;
6
- }, "length", {
7
- type: ScrcpyDeviceMessageType.Clipboard;
8
- }, undefined>;
9
- export type ScrcpyClipboardDeviceMessage = typeof ScrcpyClipboardDeviceMessage["TDeserializeResult"];
1
+ import Struct from "@yume-chan/struct";
2
+ import { ScrcpyDeviceMessageType } from "./type.js";
3
+ export declare const ScrcpyClipboardDeviceMessage: Struct<{
4
+ length: number;
5
+ content: string;
6
+ }, "length", {
7
+ type: ScrcpyDeviceMessageType.Clipboard;
8
+ }, undefined>;
9
+ export type ScrcpyClipboardDeviceMessage = (typeof ScrcpyClipboardDeviceMessage)["TDeserializeResult"];
10
10
  //# sourceMappingURL=clipboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/device-message/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEpD,eAAO,MAAM,4BAA4B;;;;;aAGuB,CAAC;AAEjE,MAAM,MAAM,4BAA4B,GACpC,OAAO,4BAA4B,CAAC,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/device-message/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEpD,eAAO,MAAM,4BAA4B;;;;;aAGuB,CAAC;AAEjE,MAAM,MAAM,4BAA4B,GACpC,CAAC,OAAO,4BAA4B,CAAC,CAAC,oBAAoB,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
- import Struct from "@yume-chan/struct";
2
- import { ScrcpyDeviceMessageType } from "./type.js";
3
- export const ScrcpyClipboardDeviceMessage = new Struct()
4
- .uint32("length")
5
- .string("content", { lengthField: "length" })
6
- .extra({ type: ScrcpyDeviceMessageType.Clipboard });
1
+ import Struct from "@yume-chan/struct";
2
+ import { ScrcpyDeviceMessageType } from "./type.js";
3
+ export const ScrcpyClipboardDeviceMessage = new Struct()
4
+ .uint32("length")
5
+ .string("content", { lengthField: "length" })
6
+ .extra({ type: ScrcpyDeviceMessageType.Clipboard });
7
7
  //# sourceMappingURL=clipboard.js.map
@@ -1,5 +1,5 @@
1
- export * from "./ack-clipboard.js";
2
- export * from "./clipboard.js";
3
- export * from "./stream.js";
4
- export * from "./type.js";
1
+ export * from "./ack-clipboard.js";
2
+ export * from "./clipboard.js";
3
+ export * from "./stream.js";
4
+ export * from "./type.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,5 @@
1
- export * from "./ack-clipboard.js";
2
- export * from "./clipboard.js";
3
- export * from "./stream.js";
4
- export * from "./type.js";
1
+ export * from "./ack-clipboard.js";
2
+ export * from "./clipboard.js";
3
+ export * from "./stream.js";
4
+ export * from "./type.js";
5
5
  //# sourceMappingURL=index.js.map
@@ -1,8 +1,8 @@
1
- import { BufferedTransformStream } from "@yume-chan/stream-extra";
2
- import { ScrcpyAckClipboardDeviceMessage } from "./ack-clipboard.js";
3
- import { ScrcpyClipboardDeviceMessage } from "./clipboard.js";
4
- export type ScrcpyDeviceMessage = ScrcpyClipboardDeviceMessage | ScrcpyAckClipboardDeviceMessage;
5
- export declare class ScrcpyDeviceMessageDeserializeStream extends BufferedTransformStream<ScrcpyDeviceMessage> {
6
- constructor();
7
- }
1
+ import { BufferedTransformStream } from "@yume-chan/stream-extra";
2
+ import { ScrcpyAckClipboardDeviceMessage } from "./ack-clipboard.js";
3
+ import { ScrcpyClipboardDeviceMessage } from "./clipboard.js";
4
+ export type ScrcpyDeviceMessage = ScrcpyClipboardDeviceMessage | ScrcpyAckClipboardDeviceMessage;
5
+ export declare class ScrcpyDeviceMessageDeserializeStream extends BufferedTransformStream<ScrcpyDeviceMessage> {
6
+ constructor();
7
+ }
8
8
  //# sourceMappingURL=stream.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/device-message/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAG9D,MAAM,MAAM,mBAAmB,GACzB,4BAA4B,GAC5B,+BAA+B,CAAC;AAEtC,qBAAa,oCAAqC,SAAQ,uBAAuB,CAAC,mBAAmB,CAAC;;CAkBrG"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/device-message/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAOlE,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAG9D,MAAM,MAAM,mBAAmB,GACzB,4BAA4B,GAC5B,+BAA+B,CAAC;AAEtC,qBAAa,oCAAqC,SAAQ,uBAAuB,CAAC,mBAAmB,CAAC;;CAiCrG"}
@@ -1,20 +1,35 @@
1
- import { BufferedTransformStream } from "@yume-chan/stream-extra";
2
- import { ScrcpyAckClipboardDeviceMessage } from "./ack-clipboard.js";
3
- import { ScrcpyClipboardDeviceMessage } from "./clipboard.js";
4
- import { ScrcpyDeviceMessageType } from "./type.js";
5
- export class ScrcpyDeviceMessageDeserializeStream extends BufferedTransformStream {
6
- constructor() {
7
- super(async (stream) => {
8
- const type = await stream.read(1);
9
- switch (type[0]) {
10
- case ScrcpyDeviceMessageType.Clipboard:
11
- return await ScrcpyClipboardDeviceMessage.deserialize(stream);
12
- case ScrcpyDeviceMessageType.AckClipboard:
13
- return await ScrcpyAckClipboardDeviceMessage.deserialize(stream);
14
- default:
15
- throw new Error("unknown control message type");
16
- }
17
- });
18
- }
19
- }
1
+ import { BufferedTransformStream } from "@yume-chan/stream-extra";
2
+ import { ExactReadableEndedError, StructEmptyError, StructNotEnoughDataError, } from "@yume-chan/struct";
3
+ import { ScrcpyAckClipboardDeviceMessage } from "./ack-clipboard.js";
4
+ import { ScrcpyClipboardDeviceMessage } from "./clipboard.js";
5
+ import { ScrcpyDeviceMessageType } from "./type.js";
6
+ export class ScrcpyDeviceMessageDeserializeStream extends BufferedTransformStream {
7
+ constructor() {
8
+ super(async (stream) => {
9
+ try {
10
+ const type = await stream.readExactly(1);
11
+ switch (type[0]) {
12
+ case ScrcpyDeviceMessageType.Clipboard:
13
+ return await ScrcpyClipboardDeviceMessage.deserialize(stream);
14
+ case ScrcpyDeviceMessageType.AckClipboard:
15
+ return await ScrcpyAckClipboardDeviceMessage.deserialize(stream);
16
+ default:
17
+ throw new Error("Unsupported control message type");
18
+ }
19
+ }
20
+ catch (e) {
21
+ // Can't read the `type` byte
22
+ if (e instanceof ExactReadableEndedError) {
23
+ throw new StructEmptyError();
24
+ }
25
+ // Can't read struct body,
26
+ // treat as not enough data because `type` byte is already read
27
+ if (e instanceof StructEmptyError) {
28
+ throw new StructNotEnoughDataError();
29
+ }
30
+ throw e;
31
+ }
32
+ });
33
+ }
34
+ }
20
35
  //# sourceMappingURL=stream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/device-message/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAMpD,MAAM,OAAO,oCAAqC,SAAQ,uBAA4C;IAClG;QACI,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE;gBACb,KAAK,uBAAuB,CAAC,SAAS;oBAClC,OAAO,MAAM,4BAA4B,CAAC,WAAW,CACjD,MAAM,CACT,CAAC;gBACN,KAAK,uBAAuB,CAAC,YAAY;oBACrC,OAAO,MAAM,+BAA+B,CAAC,WAAW,CACpD,MAAM,CACT,CAAC;gBACN;oBACI,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;aACvD;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/device-message/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACH,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,GAC3B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAMpD,MAAM,OAAO,oCAAqC,SAAQ,uBAA4C;IAClG;QACI,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACnB,IAAI;gBACA,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACzC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE;oBACb,KAAK,uBAAuB,CAAC,SAAS;wBAClC,OAAO,MAAM,4BAA4B,CAAC,WAAW,CACjD,MAAM,CACT,CAAC;oBACN,KAAK,uBAAuB,CAAC,YAAY;wBACrC,OAAO,MAAM,+BAA+B,CAAC,WAAW,CACpD,MAAM,CACT,CAAC;oBACN;wBACI,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;iBAC3D;aACJ;YAAC,OAAO,CAAC,EAAE;gBACR,6BAA6B;gBAC7B,IAAI,CAAC,YAAY,uBAAuB,EAAE;oBACtC,MAAM,IAAI,gBAAgB,EAAE,CAAC;iBAChC;gBAED,0BAA0B;gBAC1B,+DAA+D;gBAC/D,IAAI,CAAC,YAAY,gBAAgB,EAAE;oBAC/B,MAAM,IAAI,wBAAwB,EAAE,CAAC;iBACxC;gBAED,MAAM,CAAC,CAAC;aACX;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
@@ -1,5 +1,5 @@
1
- export declare enum ScrcpyDeviceMessageType {
2
- Clipboard = 0,
3
- AckClipboard = 1
4
- }
1
+ export declare enum ScrcpyDeviceMessageType {
2
+ Clipboard = 0,
3
+ AckClipboard = 1
4
+ }
5
5
  //# sourceMappingURL=type.d.ts.map
@@ -1,7 +1,7 @@
1
- // https://github.com/Genymobile/scrcpy/blob/41abe021e2a73efd4899b0efcd0b9eef9ec68c9b/server/src/main/java/com/genymobile/scrcpy/DeviceMessage.java#L5
2
- export var ScrcpyDeviceMessageType;
3
- (function (ScrcpyDeviceMessageType) {
4
- ScrcpyDeviceMessageType[ScrcpyDeviceMessageType["Clipboard"] = 0] = "Clipboard";
5
- ScrcpyDeviceMessageType[ScrcpyDeviceMessageType["AckClipboard"] = 1] = "AckClipboard";
6
- })(ScrcpyDeviceMessageType = ScrcpyDeviceMessageType || (ScrcpyDeviceMessageType = {}));
1
+ // https://github.com/Genymobile/scrcpy/blob/41abe021e2a73efd4899b0efcd0b9eef9ec68c9b/server/src/main/java/com/genymobile/scrcpy/DeviceMessage.java#L5
2
+ export var ScrcpyDeviceMessageType;
3
+ (function (ScrcpyDeviceMessageType) {
4
+ ScrcpyDeviceMessageType[ScrcpyDeviceMessageType["Clipboard"] = 0] = "Clipboard";
5
+ ScrcpyDeviceMessageType[ScrcpyDeviceMessageType["AckClipboard"] = 1] = "AckClipboard";
6
+ })(ScrcpyDeviceMessageType = ScrcpyDeviceMessageType || (ScrcpyDeviceMessageType = {}));
7
7
  //# sourceMappingURL=type.js.map
package/esm/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
- export * from './adb/index.js';
2
- export * from './codec.js';
3
- export * from './control/index.js';
4
- export * from './device-message/index.js';
5
- export * from './options/index.js';
1
+ export * from "./codec/index.js";
2
+ export * from "./control/index.js";
3
+ export * from "./device-message/index.js";
4
+ export * from "./options/index.js";
6
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
package/esm/index.js CHANGED
@@ -1,6 +1,5 @@
1
- export * from './adb/index.js';
2
- export * from './codec.js';
3
- export * from './control/index.js';
4
- export * from './device-message/index.js';
5
- export * from './options/index.js';
1
+ export * from "./codec/index.js";
2
+ export * from "./control/index.js";
3
+ export * from "./device-message/index.js";
4
+ export * from "./options/index.js";
6
5
  //# sourceMappingURL=index.js.map
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
@@ -1,20 +1,20 @@
1
- import { type AndroidCodecLevel, type AndroidCodecProfile } from "../../codec.js";
2
- import { type ScrcpyOptionValue } from "../types.js";
3
- /**
4
- * If the option you need is not in this type,
5
- * please file an issue on GitHub.
6
- */
7
- export interface CodecOptionsInit {
8
- profile: AndroidCodecProfile;
9
- level: AndroidCodecLevel;
10
- iFrameInterval: number;
11
- maxBframes: number;
12
- repeatPreviousFrameAfter: number;
13
- maxPtsGapToEncoder: number;
14
- }
15
- export declare class CodecOptions implements ScrcpyOptionValue {
16
- value: Partial<CodecOptionsInit>;
17
- constructor(value: Partial<CodecOptionsInit>);
18
- toOptionValue(): string | undefined;
19
- }
1
+ import type { ScrcpyOptionValue } from "../types.js";
2
+ /**
3
+ * If the option you need is not in this type,
4
+ * please file an issue on GitHub.
5
+ */
6
+ export interface CodecOptionsInit {
7
+ profile: number;
8
+ level: number;
9
+ iFrameInterval: number;
10
+ maxBframes: number;
11
+ repeatPreviousFrameAfter: number;
12
+ maxPtsGapToEncoder: number;
13
+ intraRefreshPeriod: number;
14
+ }
15
+ export declare class CodecOptions implements ScrcpyOptionValue {
16
+ value: Partial<CodecOptionsInit>;
17
+ constructor(value?: Partial<CodecOptionsInit>);
18
+ toOptionValue(): string | undefined;
19
+ }
20
20
  //# sourceMappingURL=codec-options.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec-options.d.ts","sourceRoot":"","sources":["../../../src/options/1_16/codec-options.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,EAAE,iBAAiB,CAAC;IAEzB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,wBAAwB,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAaD,qBAAa,YAAa,YAAW,iBAAiB;IAC3C,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBAErB,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAI5C,aAAa,IAAI,MAAM,GAAG,SAAS;CAgB7C"}
1
+ {"version":3,"file":"codec-options.d.ts","sourceRoot":"","sources":["../../../src/options/1_16/codec-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IAEd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,wBAAwB,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAaD,qBAAa,YAAa,YAAW,iBAAiB;IAC3C,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBAErB,KAAK,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAIjD,aAAa,IAAI,MAAM,GAAG,SAAS;CAgB7C"}
@@ -1,26 +1,26 @@
1
- function toDashCase(input) {
2
- return input.replace(/([A-Z])/g, "-$1").toLowerCase();
3
- }
4
- const CODEC_OPTION_TYPES = {
5
- repeatPreviousFrameAfter: "long",
6
- maxPtsGapToEncoder: "long",
7
- };
8
- export class CodecOptions {
9
- value;
10
- constructor(value) {
11
- this.value = value;
12
- }
13
- toOptionValue() {
14
- const entries = Object.entries(this.value).filter(([, value]) => value !== undefined);
15
- if (entries.length === 0) {
16
- return undefined;
17
- }
18
- return entries
19
- .map(([key, value]) => {
20
- const type = CODEC_OPTION_TYPES[key];
21
- return `${toDashCase(key)}${type ? `:${type}` : ""}=${value}`;
22
- })
23
- .join(",");
24
- }
25
- }
1
+ function toDashCase(input) {
2
+ return input.replace(/([A-Z])/g, "-$1").toLowerCase();
3
+ }
4
+ const CODEC_OPTION_TYPES = {
5
+ repeatPreviousFrameAfter: "long",
6
+ maxPtsGapToEncoder: "long",
7
+ };
8
+ export class CodecOptions {
9
+ value;
10
+ constructor(value = {}) {
11
+ this.value = value;
12
+ }
13
+ toOptionValue() {
14
+ const entries = Object.entries(this.value).filter(([, value]) => value !== undefined);
15
+ if (entries.length === 0) {
16
+ return undefined;
17
+ }
18
+ return entries
19
+ .map(([key, value]) => {
20
+ const type = CODEC_OPTION_TYPES[key];
21
+ return `${toDashCase(key)}${type ? `:${type}` : ""}=${value}`;
22
+ })
23
+ .join(",");
24
+ }
25
+ }
26
26
  //# sourceMappingURL=codec-options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec-options.js","sourceRoot":"","sources":["../../../src/options/1_16/codec-options.ts"],"names":[],"mappings":"AAoBA,SAAS,UAAU,CAAC,KAAa;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,kBAAkB,GAEpB;IACA,wBAAwB,EAAE,MAAM;IAChC,kBAAkB,EAAE,MAAM;CAC7B,CAAC;AAEF,MAAM,OAAO,YAAY;IACd,KAAK,CAA4B;IAExC,YAAmB,KAAgC;QAC/C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAEM,aAAa;QAChB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CACrC,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACtB,OAAO,SAAS,CAAC;SACpB;QAED,OAAO,OAAO;aACT,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAClB,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAA6B,CAAC,CAAC;YAC/D,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC;QAClE,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ"}
1
+ {"version":3,"file":"codec-options.js","sourceRoot":"","sources":["../../../src/options/1_16/codec-options.ts"],"names":[],"mappings":"AAiBA,SAAS,UAAU,CAAC,KAAa;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,kBAAkB,GAEpB;IACA,wBAAwB,EAAE,MAAM;IAChC,kBAAkB,EAAE,MAAM;CAC7B,CAAC;AAEF,MAAM,OAAO,YAAY;IACd,KAAK,CAA4B;IAExC,YAAmB,QAAmC,EAAE;QACpD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAEM,aAAa;QAChB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CACrC,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACtB,OAAO,SAAS,CAAC;SACpB;QAED,OAAO,OAAO;aACT,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAClB,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAA6B,CAAC,CAAC;YAC/D,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC;QAClE,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ"}
@@ -0,0 +1,5 @@
1
+ import { NumberFieldDefinition, NumberFieldType } from "@yume-chan/struct";
2
+ export declare function clamp(value: number, min: number, max: number): number;
3
+ export declare const ScrcpyFloatToUint16NumberType: NumberFieldType;
4
+ export declare const ScrcpyFloatToUint16FieldDefinition: NumberFieldDefinition<NumberFieldType, number>;
5
+ //# sourceMappingURL=float-to-uint16.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"float-to-uint16.d.ts","sourceRoot":"","sources":["../../../src/options/1_16/float-to-uint16.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE3E,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAUrE;AAED,eAAO,MAAM,6BAA6B,EAAE,eAc3C,CAAC;AAEF,eAAO,MAAM,kCAAkC,gDAE9C,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { NumberFieldDefinition, NumberFieldType } from "@yume-chan/struct";
2
+ export function clamp(value, min, max) {
3
+ if (value < min) {
4
+ return min;
5
+ }
6
+ if (value > max) {
7
+ return max;
8
+ }
9
+ return value;
10
+ }
11
+ export const ScrcpyFloatToUint16NumberType = {
12
+ size: 2,
13
+ signed: false,
14
+ deserialize(array, littleEndian) {
15
+ const value = NumberFieldType.Uint16.deserialize(array, littleEndian);
16
+ // https://github.com/Genymobile/scrcpy/blob/1f138aef41de651668043b32c4effc2d4adbfc44/server/src/main/java/com/genymobile/scrcpy/Binary.java#L22
17
+ return value === 0xffff ? 1 : value / 0x10000;
18
+ },
19
+ serialize(dataView, offset, value, littleEndian) {
20
+ // https://github.com/Genymobile/scrcpy/blob/1f138aef41de651668043b32c4effc2d4adbfc44/app/src/util/binary.h#L51
21
+ value = clamp(value, -1, 1);
22
+ value = value === 1 ? 0xffff : value * 0x10000;
23
+ NumberFieldType.Uint16.serialize(dataView, offset, value, littleEndian);
24
+ },
25
+ };
26
+ export const ScrcpyFloatToUint16FieldDefinition = new NumberFieldDefinition(ScrcpyFloatToUint16NumberType);
27
+ //# sourceMappingURL=float-to-uint16.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"float-to-uint16.js","sourceRoot":"","sources":["../../../src/options/1_16/float-to-uint16.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE3E,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACzD,IAAI,KAAK,GAAG,GAAG,EAAE;QACb,OAAO,GAAG,CAAC;KACd;IAED,IAAI,KAAK,GAAG,GAAG,EAAE;QACb,OAAO,GAAG,CAAC;KACd;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAAoB;IAC1D,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,KAAK;IACb,WAAW,CAAC,KAAK,EAAE,YAAY;QAC3B,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QACtE,gJAAgJ;QAChJ,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC;IAClD,CAAC;IACD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY;QAC3C,+GAA+G;QAC/G,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC;QAC/C,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAC5E,CAAC;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,qBAAqB,CACvE,6BAA6B,CAChC,CAAC"}