@yume-chan/scrcpy 2.1.0 → 2.2.0

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 (180) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +3 -0
  3. package/esm/1_15/impl/clipboard-stream.d.ts +2 -1
  4. package/esm/1_15/impl/clipboard-stream.d.ts.map +1 -1
  5. package/esm/1_15/impl/clipboard-stream.js +4 -7
  6. package/esm/1_15/impl/clipboard-stream.js.map +1 -1
  7. package/esm/1_15/impl/scroll-controller.d.ts.map +1 -1
  8. package/esm/1_15/impl/scroll-controller.js +22 -21
  9. package/esm/1_15/impl/scroll-controller.js.map +1 -1
  10. package/esm/1_15/options.d.ts +2 -3
  11. package/esm/1_15/options.d.ts.map +1 -1
  12. package/esm/1_15/options.js +6 -15
  13. package/esm/1_15/options.js.map +1 -1
  14. package/esm/1_17/options.d.ts +2 -3
  15. package/esm/1_17/options.d.ts.map +1 -1
  16. package/esm/1_17/options.js +6 -15
  17. package/esm/1_17/options.js.map +1 -1
  18. package/esm/1_18/options.d.ts +2 -3
  19. package/esm/1_18/options.d.ts.map +1 -1
  20. package/esm/1_18/options.js +6 -15
  21. package/esm/1_18/options.js.map +1 -1
  22. package/esm/1_21/impl/set-clipboard.d.ts +2 -1
  23. package/esm/1_21/impl/set-clipboard.d.ts.map +1 -1
  24. package/esm/1_21/impl/set-clipboard.js +2 -5
  25. package/esm/1_21/impl/set-clipboard.js.map +1 -1
  26. package/esm/1_21/options.d.ts +2 -3
  27. package/esm/1_21/options.d.ts.map +1 -1
  28. package/esm/1_21/options.js +7 -21
  29. package/esm/1_21/options.js.map +1 -1
  30. package/esm/1_22/options.d.ts +2 -3
  31. package/esm/1_22/options.d.ts.map +1 -1
  32. package/esm/1_22/options.js +7 -21
  33. package/esm/1_22/options.js.map +1 -1
  34. package/esm/1_23/options.d.ts +2 -3
  35. package/esm/1_23/options.d.ts.map +1 -1
  36. package/esm/1_23/options.js +7 -21
  37. package/esm/1_23/options.js.map +1 -1
  38. package/esm/1_24/options.d.ts +2 -3
  39. package/esm/1_24/options.d.ts.map +1 -1
  40. package/esm/1_24/options.js +7 -21
  41. package/esm/1_24/options.js.map +1 -1
  42. package/esm/1_25/options.d.ts +2 -3
  43. package/esm/1_25/options.d.ts.map +1 -1
  44. package/esm/1_25/options.js +7 -21
  45. package/esm/1_25/options.js.map +1 -1
  46. package/esm/2_0/options.d.ts +2 -3
  47. package/esm/2_0/options.d.ts.map +1 -1
  48. package/esm/2_0/options.js +7 -21
  49. package/esm/2_0/options.js.map +1 -1
  50. package/esm/2_1/options.d.ts +2 -3
  51. package/esm/2_1/options.d.ts.map +1 -1
  52. package/esm/2_1/options.js +7 -21
  53. package/esm/2_1/options.js.map +1 -1
  54. package/esm/2_2/options.d.ts +2 -3
  55. package/esm/2_2/options.d.ts.map +1 -1
  56. package/esm/2_2/options.js +7 -21
  57. package/esm/2_2/options.js.map +1 -1
  58. package/esm/2_3/options.d.ts +2 -3
  59. package/esm/2_3/options.d.ts.map +1 -1
  60. package/esm/2_3/options.js +7 -21
  61. package/esm/2_3/options.js.map +1 -1
  62. package/esm/2_4/impl/uhid-output-stream.d.ts +2 -1
  63. package/esm/2_4/impl/uhid-output-stream.d.ts.map +1 -1
  64. package/esm/2_4/impl/uhid-output-stream.js +2 -5
  65. package/esm/2_4/impl/uhid-output-stream.js.map +1 -1
  66. package/esm/2_4/options.d.ts +2 -3
  67. package/esm/2_4/options.d.ts.map +1 -1
  68. package/esm/2_4/options.js +8 -27
  69. package/esm/2_4/options.js.map +1 -1
  70. package/esm/2_6/options.d.ts +2 -3
  71. package/esm/2_6/options.d.ts.map +1 -1
  72. package/esm/2_6/options.js +8 -22
  73. package/esm/2_6/options.js.map +1 -1
  74. package/esm/2_7/impl/serialize-uhid-create.d.ts +2 -2
  75. package/esm/2_7/impl/serialize-uhid-create.d.ts.map +1 -1
  76. package/esm/2_7/impl/serialize-uhid-create.js +3 -4
  77. package/esm/2_7/impl/serialize-uhid-create.js.map +1 -1
  78. package/esm/2_7/options.d.ts +2 -3
  79. package/esm/2_7/options.d.ts.map +1 -1
  80. package/esm/2_7/options.js +8 -22
  81. package/esm/2_7/options.js.map +1 -1
  82. package/esm/3_0/options.d.ts +2 -3
  83. package/esm/3_0/options.d.ts.map +1 -1
  84. package/esm/3_0/options.js +8 -22
  85. package/esm/3_0/options.js.map +1 -1
  86. package/esm/3_1/impl/serialize-uhid-create.d.ts +2 -2
  87. package/esm/3_1/impl/serialize-uhid-create.d.ts.map +1 -1
  88. package/esm/3_1/impl/serialize-uhid-create.js +3 -4
  89. package/esm/3_1/impl/serialize-uhid-create.js.map +1 -1
  90. package/esm/3_1/options.d.ts +2 -3
  91. package/esm/3_1/options.d.ts.map +1 -1
  92. package/esm/3_1/options.js +8 -22
  93. package/esm/3_1/options.js.map +1 -1
  94. package/esm/3_2/options.d.ts +2 -3
  95. package/esm/3_2/options.d.ts.map +1 -1
  96. package/esm/3_2/options.js +8 -22
  97. package/esm/3_2/options.js.map +1 -1
  98. package/esm/3_3.d.ts +8 -0
  99. package/esm/3_3.d.ts.map +1 -0
  100. package/esm/3_3.js +7 -0
  101. package/esm/3_3.js.map +1 -0
  102. package/esm/3_3_1/impl/index.d.ts +3 -0
  103. package/esm/3_3_1/impl/index.d.ts.map +1 -0
  104. package/esm/3_3_1/impl/index.js +3 -0
  105. package/esm/3_3_1/impl/index.js.map +1 -0
  106. package/esm/3_3_1/impl/prev.d.ts +2 -0
  107. package/esm/3_3_1/impl/prev.d.ts.map +1 -0
  108. package/esm/3_3_1/impl/prev.js +2 -0
  109. package/esm/3_3_1/impl/prev.js.map +1 -0
  110. package/esm/3_3_1/impl/scroll-controller.d.ts +7 -0
  111. package/esm/3_3_1/impl/scroll-controller.d.ts.map +1 -0
  112. package/esm/3_3_1/impl/scroll-controller.js +15 -0
  113. package/esm/3_3_1/impl/scroll-controller.js.map +1 -0
  114. package/esm/3_3_1/index.d.ts +2 -0
  115. package/esm/3_3_1/index.d.ts.map +1 -0
  116. package/esm/3_3_1/index.js +2 -0
  117. package/esm/3_3_1/index.js.map +1 -0
  118. package/esm/3_3_1/options.d.ts +90 -0
  119. package/esm/3_3_1/options.d.ts.map +1 -0
  120. package/esm/3_3_1/options.js +78 -0
  121. package/esm/3_3_1/options.js.map +1 -0
  122. package/esm/3_3_2.d.ts +8 -0
  123. package/esm/3_3_2.d.ts.map +1 -0
  124. package/esm/3_3_2.js +7 -0
  125. package/esm/3_3_2.js.map +1 -0
  126. package/esm/base/device-message.d.ts +10 -1
  127. package/esm/base/device-message.d.ts.map +1 -1
  128. package/esm/base/device-message.js +40 -1
  129. package/esm/base/device-message.js.map +1 -1
  130. package/esm/base/options.d.ts +2 -3
  131. package/esm/base/options.d.ts.map +1 -1
  132. package/esm/control/message-type-map.d.ts +2 -2
  133. package/esm/control/message-type-map.d.ts.map +1 -1
  134. package/esm/control/message-type-map.js.map +1 -1
  135. package/esm/index.d.ts +3 -0
  136. package/esm/index.d.ts.map +1 -1
  137. package/esm/index.js +3 -0
  138. package/esm/index.js.map +1 -1
  139. package/esm/latest.d.ts +5 -5
  140. package/esm/latest.d.ts.map +1 -1
  141. package/esm/latest.js +3 -3
  142. package/esm/latest.js.map +1 -1
  143. package/package.json +4 -4
  144. package/src/1_15/impl/clipboard-stream.ts +5 -7
  145. package/src/1_15/impl/scroll-controller.ts +22 -19
  146. package/src/1_15/options.ts +9 -21
  147. package/src/1_17/options.ts +9 -21
  148. package/src/1_18/options.ts +9 -21
  149. package/src/1_21/impl/set-clipboard.ts +2 -5
  150. package/src/1_21/options.ts +13 -28
  151. package/src/1_22/options.ts +13 -28
  152. package/src/1_23/options.ts +13 -28
  153. package/src/1_24/options.ts +13 -28
  154. package/src/1_25/options.ts +13 -28
  155. package/src/2_0/options.ts +13 -28
  156. package/src/2_1/options.ts +13 -28
  157. package/src/2_2/options.ts +13 -28
  158. package/src/2_3/options.ts +13 -28
  159. package/src/2_4/impl/uhid-output-stream.ts +3 -6
  160. package/src/2_4/options.ts +16 -35
  161. package/src/2_6/options.ts +16 -29
  162. package/src/2_7/impl/serialize-uhid-create.ts +9 -11
  163. package/src/2_7/options.ts +16 -29
  164. package/src/3_0/options.ts +16 -29
  165. package/src/3_1/impl/serialize-uhid-create.ts +11 -13
  166. package/src/3_1/options.ts +16 -29
  167. package/src/3_2/options.ts +16 -29
  168. package/src/3_3.ts +14 -0
  169. package/src/3_3_1/impl/index.ts +6 -0
  170. package/src/3_3_1/impl/prev.ts +1 -0
  171. package/src/3_3_1/impl/scroll-controller.ts +21 -0
  172. package/src/3_3_1/index.ts +1 -0
  173. package/src/3_3_1/options.ts +177 -0
  174. package/src/3_3_2.ts +14 -0
  175. package/src/base/device-message.ts +50 -1
  176. package/src/base/options.ts +3 -8
  177. package/src/control/message-type-map.ts +3 -3
  178. package/src/index.ts +3 -0
  179. package/src/latest.ts +5 -5
  180. package/tsconfig.build.tsbuildinfo +1 -1
@@ -0,0 +1,78 @@
1
+ import { ScrcpyDeviceMessageParsers } from "../base/index.js";
2
+ import { AckClipboardHandler, ClipboardStream, ControlMessageTypes, createMediaStreamTransformer, createScrollController, Defaults, parseAudioStreamMetadata, parseDisplay, parseEncoder, parseVideoStreamMetadata, serialize, serializeBackOrScreenOnControlMessage, serializeInjectTouchControlMessage, serializeUHidCreateControlMessage, setListDisplays, setListEncoders, UHidOutputStream, } from "./impl/index.js";
3
+ export class ScrcpyOptions3_3_1 {
4
+ static Defaults = Defaults;
5
+ value;
6
+ get controlMessageTypes() {
7
+ return ControlMessageTypes;
8
+ }
9
+ #clipboard;
10
+ get clipboard() {
11
+ return this.#clipboard;
12
+ }
13
+ #ackClipboardHandler;
14
+ #uHidOutput;
15
+ get uHidOutput() {
16
+ return this.#uHidOutput;
17
+ }
18
+ #deviceMessageParsers = new ScrcpyDeviceMessageParsers();
19
+ get deviceMessageParsers() {
20
+ return this.#deviceMessageParsers;
21
+ }
22
+ constructor(init) {
23
+ this.value = { ...Defaults, ...init };
24
+ if (this.value.videoSource === "camera") {
25
+ this.value.control = false;
26
+ }
27
+ if (this.value.audioDup) {
28
+ this.value.audioSource = "playback";
29
+ }
30
+ if (this.value.control) {
31
+ if (this.value.clipboardAutosync) {
32
+ this.#clipboard = this.#deviceMessageParsers.add(new ClipboardStream());
33
+ this.#ackClipboardHandler = this.#deviceMessageParsers.add(new AckClipboardHandler());
34
+ }
35
+ this.#uHidOutput = this.#deviceMessageParsers.add(new UHidOutputStream());
36
+ }
37
+ }
38
+ serialize() {
39
+ return serialize(this.value, Defaults);
40
+ }
41
+ setListDisplays() {
42
+ setListDisplays(this.value);
43
+ }
44
+ parseDisplay(line) {
45
+ return parseDisplay(line);
46
+ }
47
+ setListEncoders() {
48
+ setListEncoders(this.value);
49
+ }
50
+ parseEncoder(line) {
51
+ return parseEncoder(line);
52
+ }
53
+ parseVideoStreamMetadata(stream) {
54
+ return parseVideoStreamMetadata(this.value, stream);
55
+ }
56
+ parseAudioStreamMetadata(stream) {
57
+ return parseAudioStreamMetadata(stream, this.value);
58
+ }
59
+ createMediaStreamTransformer() {
60
+ return createMediaStreamTransformer(this.value);
61
+ }
62
+ serializeInjectTouchControlMessage(message) {
63
+ return serializeInjectTouchControlMessage(message);
64
+ }
65
+ serializeBackOrScreenOnControlMessage(message) {
66
+ return serializeBackOrScreenOnControlMessage(message);
67
+ }
68
+ serializeSetClipboardControlMessage(message) {
69
+ return this.#ackClipboardHandler.serializeSetClipboardControlMessage(message);
70
+ }
71
+ createScrollController() {
72
+ return createScrollController();
73
+ }
74
+ serializeUHidCreateControlMessage(message) {
75
+ return serializeUHidCreateControlMessage(message);
76
+ }
77
+ }
78
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/3_3_1/options.ts"],"names":[],"mappings":"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"}
package/esm/3_3_2.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { ScrcpyOptions3_3_1 } from "./3_3_1/index.js";
2
+ export declare class ScrcpyOptions3_3_2<TVideo extends boolean> extends ScrcpyOptions3_3_1<TVideo> {
3
+ constructor(init: ScrcpyOptions3_3_1.Init<TVideo>);
4
+ }
5
+ export declare namespace ScrcpyOptions3_3_2 {
6
+ type Init<TVideo extends boolean = boolean> = ScrcpyOptions3_3_1.Init<TVideo>;
7
+ }
8
+ //# sourceMappingURL=3_3_2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"3_3_2.d.ts","sourceRoot":"","sources":["../src/3_3_2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,qBAAa,kBAAkB,CAC3B,MAAM,SAAS,OAAO,CACxB,SAAQ,kBAAkB,CAAC,MAAM,CAAC;gBACpB,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;CAGpD;AAED,yBAAiB,kBAAkB,CAAC;IAChC,KAAY,IAAI,CAAC,MAAM,SAAS,OAAO,GAAG,OAAO,IAC7C,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;CACvC"}
package/esm/3_3_2.js ADDED
@@ -0,0 +1,7 @@
1
+ import { ScrcpyOptions3_3_1 } from "./3_3_1/index.js";
2
+ export class ScrcpyOptions3_3_2 extends ScrcpyOptions3_3_1 {
3
+ constructor(init) {
4
+ super(init);
5
+ }
6
+ }
7
+ //# sourceMappingURL=3_3_2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"3_3_2.js","sourceRoot":"","sources":["../src/3_3_2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,OAAO,kBAEX,SAAQ,kBAA0B;IAChC,YAAY,IAAqC;QAC7C,KAAK,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;CACJ"}
@@ -1,6 +1,15 @@
1
1
  import type { AsyncExactReadable } from "@yume-chan/struct";
2
2
  export interface ScrcpyDeviceMessageParser {
3
- parse(id: number, stream: AsyncExactReadable): Promise<boolean>;
3
+ readonly id: number | readonly number[];
4
+ parse(id: number, stream: AsyncExactReadable): Promise<undefined>;
5
+ close(): void;
6
+ error(e?: unknown): void;
7
+ }
8
+ export declare class ScrcpyDeviceMessageParsers {
9
+ #private;
10
+ get parsers(): readonly ScrcpyDeviceMessageParser[];
11
+ add<T extends ScrcpyDeviceMessageParser>(parser: T): T;
12
+ parse(id: number, stream: AsyncExactReadable): Promise<undefined>;
4
13
  close(): void;
5
14
  error(e?: unknown): void;
6
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"device-message.d.ts","sourceRoot":"","sources":["../../src/base/device-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,WAAW,yBAAyB;IACtC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhE,KAAK,IAAI,IAAI,CAAC;IAEd,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5B"}
1
+ {"version":3,"file":"device-message.d.ts","sourceRoot":"","sources":["../../src/base/device-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,WAAW,yBAAyB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAExC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAElE,KAAK,IAAI,IAAI,CAAC;IAEd,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5B;AAED,qBAAa,0BAA0B;;IAEnC,IAAI,OAAO,IAAI,SAAS,yBAAyB,EAAE,CAElD;IASD,GAAG,CAAC,CAAC,SAAS,yBAAyB,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC;IAYhD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;IASvE,KAAK;IAML,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO;CAKpB"}
@@ -1,2 +1,41 @@
1
- export {};
1
+ export class ScrcpyDeviceMessageParsers {
2
+ #parsers = [];
3
+ get parsers() {
4
+ return this.#parsers;
5
+ }
6
+ #add(id, parser) {
7
+ if (this.#parsers[id]) {
8
+ throw new Error(`Duplicate parser for id ${id}`);
9
+ }
10
+ this.#parsers[id] = parser;
11
+ }
12
+ add(parser) {
13
+ if (Array.isArray(parser.id)) {
14
+ for (const id of parser.id) {
15
+ this.#add(id, parser);
16
+ }
17
+ }
18
+ else {
19
+ this.#add(parser.id, parser);
20
+ }
21
+ return parser;
22
+ }
23
+ async parse(id, stream) {
24
+ const parser = this.#parsers[id];
25
+ if (!parser) {
26
+ throw new Error(`Unknown device message id ${id}`);
27
+ }
28
+ return parser.parse(id, stream);
29
+ }
30
+ close() {
31
+ for (const parser of this.#parsers) {
32
+ parser.close();
33
+ }
34
+ }
35
+ error(e) {
36
+ for (const parser of this.#parsers) {
37
+ parser.error(e);
38
+ }
39
+ }
40
+ }
2
41
  //# sourceMappingURL=device-message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"device-message.js","sourceRoot":"","sources":["../../src/base/device-message.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"device-message.js","sourceRoot":"","sources":["../../src/base/device-message.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,0BAA0B;IACnC,QAAQ,GAAgC,EAAE,CAAC;IAC3C,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,EAAU,EAAE,MAAiC;QAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;IAC/B,CAAC;IAED,GAAG,CAAsC,MAAS;QAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,EAAY,EAAE,MAAM,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAY,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EAAU,EAAE,MAA0B;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,KAAK;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,CAAW;QACb,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;CACJ"}
@@ -1,9 +1,9 @@
1
1
  import type { MaybePromiseLike } from "@yume-chan/async";
2
2
  import type { ReadableStream, TransformStream } from "@yume-chan/stream-extra";
3
- import type { AsyncExactReadable, ExactReadable } from "@yume-chan/struct";
4
3
  import type { ScrcpyBackOrScreenOnControlMessage, ScrcpyInjectTouchControlMessage, ScrcpySetClipboardControlMessage, ScrcpyUHidCreateControlMessage, ScrcpyUHidOutputDeviceMessage } from "../latest.js";
5
4
  import type { ScrcpyAudioStreamMetadata } from "./audio.js";
6
5
  import type { ScrcpyControlMessageType } from "./control-message-type.js";
6
+ import type { ScrcpyDeviceMessageParsers } from "./device-message.js";
7
7
  import type { ScrcpyDisplay } from "./display.js";
8
8
  import type { ScrcpyEncoder } from "./encoder.js";
9
9
  import type { ScrcpyMediaStreamPacket } from "./media.js";
@@ -14,13 +14,12 @@ export interface ScrcpyOptions<T extends object> {
14
14
  value: Required<T>;
15
15
  readonly clipboard?: ReadableStream<string> | undefined;
16
16
  readonly uHidOutput?: ReadableStream<ScrcpyUHidOutputDeviceMessage> | undefined;
17
+ readonly deviceMessageParsers: ScrcpyDeviceMessageParsers;
17
18
  serialize(): string[];
18
19
  setListDisplays(): void;
19
20
  parseDisplay(line: string): ScrcpyDisplay | undefined;
20
21
  parseVideoStreamMetadata(stream: ReadableStream<Uint8Array>): MaybePromiseLike<ScrcpyVideoStream>;
21
22
  parseAudioStreamMetadata?(stream: ReadableStream<Uint8Array>): MaybePromiseLike<ScrcpyAudioStreamMetadata>;
22
- parseDeviceMessage(id: number, stream: ExactReadable | AsyncExactReadable): Promise<void>;
23
- endDeviceMessageStream(e?: unknown): void;
24
23
  createMediaStreamTransformer(): TransformStream<Uint8Array, ScrcpyMediaStreamPacket>;
25
24
  serializeInjectTouchControlMessage(message: ScrcpyInjectTouchControlMessage): Uint8Array;
26
25
  serializeBackOrScreenOnControlMessage(message: ScrcpyBackOrScreenOnControlMessage): Uint8Array | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/base/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE3E,OAAO,KAAK,EACR,kCAAkC,EAClC,+BAA+B,EAC/B,gCAAgC,EAChC,8BAA8B,EAC9B,6BAA6B,EAChC,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM;IAC3C,IAAI,mBAAmB,IAAI,SAAS,wBAAwB,EAAE,CAAC;IAE/D,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEnB,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAExD,QAAQ,CAAC,UAAU,CAAC,EACd,cAAc,CAAC,6BAA6B,CAAC,GAC7C,SAAS,CAAC;IAEhB,SAAS,IAAI,MAAM,EAAE,CAAC;IAEtB,eAAe,IAAI,IAAI,CAAC;IAExB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IAEtD,wBAAwB,CACpB,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACnC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAEvC,wBAAwB,CAAC,CACrB,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACnC,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;IAE/C,kBAAkB,CACd,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,aAAa,GAAG,kBAAkB,GAC3C,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,sBAAsB,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE1C,4BAA4B,IAAI,eAAe,CAC3C,UAAU,EACV,uBAAuB,CAC1B,CAAC;IAEF,kCAAkC,CAC9B,OAAO,EAAE,+BAA+B,GACzC,UAAU,CAAC;IAEd,qCAAqC,CACjC,OAAO,EAAE,kCAAkC,GAC5C,UAAU,GAAG,SAAS,CAAC;IAE1B,mCAAmC,CAC/B,OAAO,EAAE,gCAAgC,GAC1C,UAAU,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5C,sBAAsB,IAAI,sBAAsB,CAAC;IAEjD,iCAAiC,CAAC,CAC9B,OAAO,EAAE,8BAA8B,GACxC,UAAU,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACtC,eAAe,IAAI,IAAI,CAAC;IAExB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;CACzD"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/base/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/E,OAAO,KAAK,EACR,kCAAkC,EAClC,+BAA+B,EAC/B,gCAAgC,EAChC,8BAA8B,EAC9B,6BAA6B,EAChC,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM;IAC3C,IAAI,mBAAmB,IAAI,SAAS,wBAAwB,EAAE,CAAC;IAE/D,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEnB,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAExD,QAAQ,CAAC,UAAU,CAAC,EACd,cAAc,CAAC,6BAA6B,CAAC,GAC7C,SAAS,CAAC;IAEhB,QAAQ,CAAC,oBAAoB,EAAE,0BAA0B,CAAC;IAE1D,SAAS,IAAI,MAAM,EAAE,CAAC;IAEtB,eAAe,IAAI,IAAI,CAAC;IAExB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IAEtD,wBAAwB,CACpB,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACnC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAEvC,wBAAwB,CAAC,CACrB,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACnC,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;IAE/C,4BAA4B,IAAI,eAAe,CAC3C,UAAU,EACV,uBAAuB,CAC1B,CAAC;IAEF,kCAAkC,CAC9B,OAAO,EAAE,+BAA+B,GACzC,UAAU,CAAC;IAEd,qCAAqC,CACjC,OAAO,EAAE,kCAAkC,GAC5C,UAAU,GAAG,SAAS,CAAC;IAE1B,mCAAmC,CAC/B,OAAO,EAAE,gCAAgC,GAC1C,UAAU,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5C,sBAAsB,IAAI,sBAAsB,CAAC;IAEjD,iCAAiC,CAAC,CAC9B,OAAO,EAAE,8BAA8B,GACxC,UAAU,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACtC,eAAe,IAAI,IAAI,CAAC;IAExB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;CACzD"}
@@ -9,7 +9,7 @@ export declare class ScrcpyControlMessageTypeMap {
9
9
  constructor(options: ScrcpyOptions<object>);
10
10
  get(type: ScrcpyControlMessageType): number;
11
11
  fillMessageType<T extends {
12
- type: ScrcpyControlMessageType;
13
- }>(message: Omit<T, "type">, type: T["type"]): T;
12
+ type: number;
13
+ }>(message: Omit<T, "type">, type: ScrcpyControlMessageType): T;
14
14
  }
15
15
  //# sourceMappingURL=message-type-map.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-type-map.d.ts","sourceRoot":"","sources":["../../src/control/message-type-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhF;;;;GAIG;AACH,qBAAa,2BAA2B;;gBAGxB,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,EACxD,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,EACxB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAChB,CAAC;CAIP"}
1
+ {"version":3,"file":"message-type-map.d.ts","sourceRoot":"","sources":["../../src/control/message-type-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhF;;;;GAIG;AACH,qBAAa,2BAA2B;;gBAGxB,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;IAI1C,GAAG,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM;IAQ3C,eAAe,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EACtC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,EACxB,IAAI,EAAE,wBAAwB,GAC/B,CAAC;CAIP"}
@@ -1 +1 @@
1
- {"version":3,"file":"message-type-map.js","sourceRoot":"","sources":["../../src/control/message-type-map.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,2BAA2B;IACpC,MAAM,CAAsC;IAE5C,YAAY,OAA8B;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAC9C,CAAC;IAED,GAAG,CAAC,IAA8B;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,eAAe,CACX,OAAwB,EACxB,IAAe;QAEd,OAAa,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAA6B,CAAC;QACjE,OAAO,OAAY,CAAC;IACxB,CAAC;CACJ"}
1
+ {"version":3,"file":"message-type-map.js","sourceRoot":"","sources":["../../src/control/message-type-map.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,2BAA2B;IACpC,MAAM,CAAsC;IAE5C,YAAY,OAA8B;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAC9C,CAAC;IAED,GAAG,CAAC,IAA8B;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,eAAe,CACX,OAAwB,EACxB,IAA8B;QAE7B,OAAa,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,OAAY,CAAC;IACxB,CAAC;CACJ"}
package/esm/index.d.ts CHANGED
@@ -26,6 +26,9 @@ export * from "./3_0_1.js";
26
26
  export * from "./3_0_2.js";
27
27
  export * from "./3_1/index.js";
28
28
  export * from "./3_2/index.js";
29
+ export * from "./3_3.js";
30
+ export * from "./3_3_1/index.js";
31
+ export * from "./3_3_2.js";
29
32
  export * from "./android/index.js";
30
33
  export * from "./base/index.js";
31
34
  export * from "./codec/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
package/esm/index.js CHANGED
@@ -26,6 +26,9 @@ export * from "./3_0_1.js";
26
26
  export * from "./3_0_2.js";
27
27
  export * from "./3_1/index.js";
28
28
  export * from "./3_2/index.js";
29
+ export * from "./3_3.js";
30
+ export * from "./3_3_1/index.js";
31
+ export * from "./3_3_2.js";
29
32
  export * from "./android/index.js";
30
33
  export * from "./base/index.js";
31
34
  export * from "./codec/index.js";
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
package/esm/latest.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { ScrcpyOptions3_2 } from "./3_2/options.js";
2
- export declare class ScrcpyOptionsLatest<TVideo extends boolean> extends ScrcpyOptions3_2<TVideo> {
3
- constructor(init: ScrcpyOptions3_2.Init<TVideo>);
1
+ import { ScrcpyOptions3_3_2 } from "./3_3_2.js";
2
+ export declare class ScrcpyOptionsLatest<TVideo extends boolean> extends ScrcpyOptions3_3_2<TVideo> {
3
+ constructor(init: ScrcpyOptions3_3_2.Init<TVideo>);
4
4
  }
5
5
  export declare namespace ScrcpyOptionsLatest {
6
- type Init<TVideo extends boolean = boolean> = ScrcpyOptions3_2.Init<TVideo>;
6
+ type Init<TVideo extends boolean = boolean> = ScrcpyOptions3_3_2.Init<TVideo>;
7
7
  }
8
- export { BackOrScreenOnControlMessage as ScrcpyBackOrScreenOnControlMessage, CaptureOrientation as ScrcpyCaptureOrientation, CodecOptions as ScrcpyCodecOptions, Crop as ScrcpyCrop, InjectScrollControlMessage as ScrcpyInjectScrollControlMessage, InjectTouchControlMessage as ScrcpyInjectTouchControlMessage, InstanceId as ScrcpyInstanceId, LockOrientation as ScrcpyLockOrientation, NewDisplay as ScrcpyNewDisplay, Orientation as ScrcpyOrientation, PointerId as ScrcpyPointerId, SetClipboardControlMessage as ScrcpySetClipboardControlMessage, UHidCreateControlMessage as ScrcpyUHidCreateControlMessage, UHidOutputDeviceMessage as ScrcpyUHidOutputDeviceMessage, } from "./3_2/impl/index.js";
8
+ export { BackOrScreenOnControlMessage as ScrcpyBackOrScreenOnControlMessage, CaptureOrientation as ScrcpyCaptureOrientation, CodecOptions as ScrcpyCodecOptions, Crop as ScrcpyCrop, InjectScrollControlMessage as ScrcpyInjectScrollControlMessage, InjectTouchControlMessage as ScrcpyInjectTouchControlMessage, InstanceId as ScrcpyInstanceId, LockOrientation as ScrcpyLockOrientation, NewDisplay as ScrcpyNewDisplay, Orientation as ScrcpyOrientation, PointerId as ScrcpyPointerId, SetClipboardControlMessage as ScrcpySetClipboardControlMessage, UHidCreateControlMessage as ScrcpyUHidCreateControlMessage, UHidOutputDeviceMessage as ScrcpyUHidOutputDeviceMessage, } from "./3_3_1/impl/index.js";
9
9
  //# sourceMappingURL=latest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"latest.d.ts","sourceRoot":"","sources":["../src/latest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,qBAAa,mBAAmB,CAC5B,MAAM,SAAS,OAAO,CACxB,SAAQ,gBAAgB,CAAC,MAAM,CAAC;gBAClB,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;CAGlD;AAED,yBAAiB,mBAAmB,CAAC;IACjC,KAAY,IAAI,CAAC,MAAM,SAAS,OAAO,GAAG,OAAO,IAC7C,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;CACrC;AAED,OAAO,EACH,4BAA4B,IAAI,kCAAkC,EAClE,kBAAkB,IAAI,wBAAwB,EAC9C,YAAY,IAAI,kBAAkB,EAClC,IAAI,IAAI,UAAU,EAClB,0BAA0B,IAAI,gCAAgC,EAC9D,yBAAyB,IAAI,+BAA+B,EAC5D,UAAU,IAAI,gBAAgB,EAC9B,eAAe,IAAI,qBAAqB,EACxC,UAAU,IAAI,gBAAgB,EAC9B,WAAW,IAAI,iBAAiB,EAChC,SAAS,IAAI,eAAe,EAC5B,0BAA0B,IAAI,gCAAgC,EAC9D,wBAAwB,IAAI,8BAA8B,EAC1D,uBAAuB,IAAI,6BAA6B,GAC3D,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"latest.d.ts","sourceRoot":"","sources":["../src/latest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,qBAAa,mBAAmB,CAC5B,MAAM,SAAS,OAAO,CACxB,SAAQ,kBAAkB,CAAC,MAAM,CAAC;gBACpB,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;CAGpD;AAED,yBAAiB,mBAAmB,CAAC;IACjC,KAAY,IAAI,CAAC,MAAM,SAAS,OAAO,GAAG,OAAO,IAC7C,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,OAAO,EACH,4BAA4B,IAAI,kCAAkC,EAClE,kBAAkB,IAAI,wBAAwB,EAC9C,YAAY,IAAI,kBAAkB,EAClC,IAAI,IAAI,UAAU,EAClB,0BAA0B,IAAI,gCAAgC,EAC9D,yBAAyB,IAAI,+BAA+B,EAC5D,UAAU,IAAI,gBAAgB,EAC9B,eAAe,IAAI,qBAAqB,EACxC,UAAU,IAAI,gBAAgB,EAC9B,WAAW,IAAI,iBAAiB,EAChC,SAAS,IAAI,eAAe,EAC5B,0BAA0B,IAAI,gCAAgC,EAC9D,wBAAwB,IAAI,8BAA8B,EAC1D,uBAAuB,IAAI,6BAA6B,GAC3D,MAAM,uBAAuB,CAAC"}
package/esm/latest.js CHANGED
@@ -1,8 +1,8 @@
1
- import { ScrcpyOptions3_2 } from "./3_2/options.js";
2
- export class ScrcpyOptionsLatest extends ScrcpyOptions3_2 {
1
+ import { ScrcpyOptions3_3_2 } from "./3_3_2.js";
2
+ export class ScrcpyOptionsLatest extends ScrcpyOptions3_3_2 {
3
3
  constructor(init) {
4
4
  super(init);
5
5
  }
6
6
  }
7
- export { BackOrScreenOnControlMessage as ScrcpyBackOrScreenOnControlMessage, CaptureOrientation as ScrcpyCaptureOrientation, CodecOptions as ScrcpyCodecOptions, Crop as ScrcpyCrop, InjectScrollControlMessage as ScrcpyInjectScrollControlMessage, InjectTouchControlMessage as ScrcpyInjectTouchControlMessage, InstanceId as ScrcpyInstanceId, LockOrientation as ScrcpyLockOrientation, NewDisplay as ScrcpyNewDisplay, Orientation as ScrcpyOrientation, PointerId as ScrcpyPointerId, SetClipboardControlMessage as ScrcpySetClipboardControlMessage, UHidCreateControlMessage as ScrcpyUHidCreateControlMessage, UHidOutputDeviceMessage as ScrcpyUHidOutputDeviceMessage, } from "./3_2/impl/index.js";
7
+ export { BackOrScreenOnControlMessage as ScrcpyBackOrScreenOnControlMessage, CaptureOrientation as ScrcpyCaptureOrientation, CodecOptions as ScrcpyCodecOptions, Crop as ScrcpyCrop, InjectScrollControlMessage as ScrcpyInjectScrollControlMessage, InjectTouchControlMessage as ScrcpyInjectTouchControlMessage, InstanceId as ScrcpyInstanceId, LockOrientation as ScrcpyLockOrientation, NewDisplay as ScrcpyNewDisplay, Orientation as ScrcpyOrientation, PointerId as ScrcpyPointerId, SetClipboardControlMessage as ScrcpySetClipboardControlMessage, UHidCreateControlMessage as ScrcpyUHidCreateControlMessage, UHidOutputDeviceMessage as ScrcpyUHidOutputDeviceMessage, } from "./3_3_1/impl/index.js";
8
8
  //# sourceMappingURL=latest.js.map
package/esm/latest.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"latest.js","sourceRoot":"","sources":["../src/latest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,OAAO,mBAEX,SAAQ,gBAAwB;IAC9B,YAAY,IAAmC;QAC3C,KAAK,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;CACJ;AAOD,OAAO,EACH,4BAA4B,IAAI,kCAAkC,EAClE,kBAAkB,IAAI,wBAAwB,EAC9C,YAAY,IAAI,kBAAkB,EAClC,IAAI,IAAI,UAAU,EAClB,0BAA0B,IAAI,gCAAgC,EAC9D,yBAAyB,IAAI,+BAA+B,EAC5D,UAAU,IAAI,gBAAgB,EAC9B,eAAe,IAAI,qBAAqB,EACxC,UAAU,IAAI,gBAAgB,EAC9B,WAAW,IAAI,iBAAiB,EAChC,SAAS,IAAI,eAAe,EAC5B,0BAA0B,IAAI,gCAAgC,EAC9D,wBAAwB,IAAI,8BAA8B,EAC1D,uBAAuB,IAAI,6BAA6B,GAC3D,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"latest.js","sourceRoot":"","sources":["../src/latest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,OAAO,mBAEX,SAAQ,kBAA0B;IAChC,YAAY,IAAqC;QAC7C,KAAK,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;CACJ;AAOD,OAAO,EACH,4BAA4B,IAAI,kCAAkC,EAClE,kBAAkB,IAAI,wBAAwB,EAC9C,YAAY,IAAI,kBAAkB,EAClC,IAAI,IAAI,UAAU,EAClB,0BAA0B,IAAI,gCAAgC,EAC9D,yBAAyB,IAAI,+BAA+B,EAC5D,UAAU,IAAI,gBAAgB,EAC9B,eAAe,IAAI,qBAAqB,EACxC,UAAU,IAAI,gBAAgB,EAC9B,WAAW,IAAI,iBAAiB,EAChC,SAAS,IAAI,eAAe,EAC5B,0BAA0B,IAAI,gCAAgC,EAC9D,wBAAwB,IAAI,8BAA8B,EAC1D,uBAAuB,IAAI,6BAA6B,GAC3D,MAAM,uBAAuB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yume-chan/scrcpy",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "TypeScript implementation of Scrcpy client.",
5
5
  "keywords": [
6
6
  "adb",
@@ -33,9 +33,9 @@
33
33
  "@yume-chan/struct": "^2.0.1"
34
34
  },
35
35
  "devDependencies": {
36
- "@types/node": "^24.0.1",
37
- "prettier": "^3.5.3",
38
- "typescript": "^5.8.3",
36
+ "@types/node": "^24.3.1",
37
+ "prettier": "^3.6.2",
38
+ "typescript": "^5.9.2",
39
39
  "@yume-chan/eslint-config": "^1.0.0",
40
40
  "@yume-chan/test-runner": "^1.0.0",
41
41
  "@yume-chan/tsconfig": "^1.0.0"
@@ -16,6 +16,8 @@ export class ClipboardStream
16
16
  {
17
17
  #controller: PushReadableStreamController<string>;
18
18
 
19
+ readonly id = 0;
20
+
19
21
  constructor() {
20
22
  let controller!: PushReadableStreamController<string>;
21
23
  super((controller_) => {
@@ -24,13 +26,9 @@ export class ClipboardStream
24
26
  this.#controller = controller;
25
27
  }
26
28
 
27
- async parse(id: number, stream: AsyncExactReadable): Promise<boolean> {
28
- if (id === 0) {
29
- const message = await ClipboardDeviceMessage.deserialize(stream);
30
- await this.#controller.enqueue(message.content);
31
- return true;
32
- }
33
- return false;
29
+ async parse(_id: number, stream: AsyncExactReadable): Promise<undefined> {
30
+ const message = await ClipboardDeviceMessage.deserialize(stream);
31
+ await this.#controller.enqueue(message.content);
34
32
  }
35
33
 
36
34
  close() {
@@ -34,33 +34,36 @@ export class ScrollController implements ScrcpyScrollController {
34
34
  protected processMessage(
35
35
  message: ScrcpyInjectScrollControlMessage,
36
36
  ): ScrcpyInjectScrollControlMessage | undefined {
37
- this.#accumulatedX += message.scrollX;
38
- this.#accumulatedY += message.scrollY;
37
+ // Ref https://github.com/libsdl-org/SDL/blob/878ea48b607f23e4ec8c12d1395b86ab529e30d0/src/events/SDL_mouse.c#L897-L914
39
38
 
40
- let scrollX = 0;
41
- let scrollY = 0;
42
- if (this.#accumulatedX >= 1) {
43
- scrollX = 1;
44
- this.#accumulatedX = 0;
45
- } else if (this.#accumulatedX <= -1) {
46
- scrollX = -1;
47
- this.#accumulatedX = 0;
39
+ if (message.scrollX) {
40
+ if (Math.sign(message.scrollX) !== Math.sign(this.#accumulatedX)) {
41
+ this.#accumulatedX = message.scrollX;
42
+ } else {
43
+ this.#accumulatedX += message.scrollX;
44
+ }
48
45
  }
49
46
 
50
- if (this.#accumulatedY >= 1) {
51
- scrollY = 1;
52
- this.#accumulatedY = 0;
53
- } else if (this.#accumulatedY <= -1) {
54
- scrollY = -1;
55
- this.#accumulatedY = 0;
47
+ if (message.scrollY) {
48
+ if (Math.sign(message.scrollY) !== Math.sign(this.#accumulatedY)) {
49
+ this.#accumulatedY = message.scrollY;
50
+ } else {
51
+ this.#accumulatedY += message.scrollY;
52
+ }
56
53
  }
57
54
 
58
- if (scrollX === 0 && scrollY === 0) {
55
+ const integerX = this.#accumulatedX | 0;
56
+ this.#accumulatedX -= integerX;
57
+
58
+ const integerY = this.#accumulatedY | 0;
59
+ this.#accumulatedY -= integerY;
60
+
61
+ if (integerX === 0 && integerY === 0) {
59
62
  return undefined;
60
63
  }
61
64
 
62
- message.scrollX = scrollX;
63
- message.scrollY = scrollY;
65
+ message.scrollX = integerX;
66
+ message.scrollY = integerY;
64
67
  return message;
65
68
  }
66
69
 
@@ -1,6 +1,5 @@
1
1
  import type { MaybePromiseLike } from "@yume-chan/async";
2
2
  import type { ReadableStream, TransformStream } from "@yume-chan/stream-extra";
3
- import type { AsyncExactReadable, ExactReadable } from "@yume-chan/struct";
4
3
 
5
4
  import type {
6
5
  ScrcpyControlMessageType,
@@ -10,6 +9,7 @@ import type {
10
9
  ScrcpyScrollController,
11
10
  ScrcpyVideoStream,
12
11
  } from "../base/index.js";
12
+ import { ScrcpyDeviceMessageParsers } from "../base/index.js";
13
13
  import type {
14
14
  ScrcpyBackOrScreenOnControlMessage,
15
15
  ScrcpyInjectTouchControlMessage,
@@ -47,11 +47,18 @@ export class ScrcpyOptions1_15 implements ScrcpyOptions<Init> {
47
47
  return this.#clipboard;
48
48
  }
49
49
 
50
+ #deviceMessageParsers = new ScrcpyDeviceMessageParsers();
51
+ get deviceMessageParsers() {
52
+ return this.#deviceMessageParsers;
53
+ }
54
+
50
55
  constructor(init: Init) {
51
56
  this.value = { ...Defaults, ...init };
52
57
 
53
58
  if (this.value.control) {
54
- this.#clipboard = new ClipboardStream();
59
+ this.#clipboard = this.#deviceMessageParsers.add(
60
+ new ClipboardStream(),
61
+ );
55
62
  }
56
63
  }
57
64
 
@@ -73,25 +80,6 @@ export class ScrcpyOptions1_15 implements ScrcpyOptions<Init> {
73
80
  return parseVideoStreamMetadata(stream);
74
81
  }
75
82
 
76
- async parseDeviceMessage(
77
- id: number,
78
- stream: ExactReadable | AsyncExactReadable,
79
- ): Promise<void> {
80
- if (await this.#clipboard!.parse(id, stream)) {
81
- return;
82
- }
83
-
84
- throw new Error("Unknown device message");
85
- }
86
-
87
- endDeviceMessageStream(e?: unknown): void {
88
- if (e) {
89
- this.#clipboard!.error(e);
90
- } else {
91
- this.#clipboard!.close();
92
- }
93
- }
94
-
95
83
  createMediaStreamTransformer(): TransformStream<
96
84
  Uint8Array,
97
85
  ScrcpyMediaStreamPacket
@@ -1,6 +1,5 @@
1
1
  import type { MaybePromiseLike } from "@yume-chan/async";
2
2
  import type { ReadableStream, TransformStream } from "@yume-chan/stream-extra";
3
- import type { AsyncExactReadable, ExactReadable } from "@yume-chan/struct";
4
3
 
5
4
  import type {
6
5
  ScrcpyControlMessageType,
@@ -12,6 +11,7 @@ import type {
12
11
  ScrcpyScrollController,
13
12
  ScrcpyVideoStream,
14
13
  } from "../base/index.js";
14
+ import { ScrcpyDeviceMessageParsers } from "../base/index.js";
15
15
  import type {
16
16
  ScrcpyBackOrScreenOnControlMessage,
17
17
  ScrcpyInjectTouchControlMessage,
@@ -54,11 +54,18 @@ export class ScrcpyOptions1_17
54
54
  return this.#clipboard;
55
55
  }
56
56
 
57
+ #deviceMessageParsers = new ScrcpyDeviceMessageParsers();
58
+ get deviceMessageParsers() {
59
+ return this.#deviceMessageParsers;
60
+ }
61
+
57
62
  constructor(init: Init) {
58
63
  this.value = { ...Defaults, ...init };
59
64
 
60
65
  if (this.value.control) {
61
- this.#clipboard = new ClipboardStream();
66
+ this.#clipboard = this.#deviceMessageParsers.add(
67
+ new ClipboardStream(),
68
+ );
62
69
  }
63
70
  }
64
71
 
@@ -88,25 +95,6 @@ export class ScrcpyOptions1_17
88
95
  return parseVideoStreamMetadata(stream);
89
96
  }
90
97
 
91
- async parseDeviceMessage(
92
- id: number,
93
- stream: ExactReadable | AsyncExactReadable,
94
- ): Promise<void> {
95
- if (await this.#clipboard!.parse(id, stream)) {
96
- return;
97
- }
98
-
99
- throw new Error("Unknown device message");
100
- }
101
-
102
- endDeviceMessageStream(e?: unknown): void {
103
- if (e) {
104
- this.#clipboard!.error(e);
105
- } else {
106
- this.#clipboard!.close();
107
- }
108
- }
109
-
110
98
  createMediaStreamTransformer(): TransformStream<
111
99
  Uint8Array,
112
100
  ScrcpyMediaStreamPacket
@@ -1,6 +1,5 @@
1
1
  import type { MaybePromiseLike } from "@yume-chan/async";
2
2
  import type { ReadableStream, TransformStream } from "@yume-chan/stream-extra";
3
- import type { AsyncExactReadable, ExactReadable } from "@yume-chan/struct";
4
3
 
5
4
  import type {
6
5
  ScrcpyControlMessageType,
@@ -12,6 +11,7 @@ import type {
12
11
  ScrcpyScrollController,
13
12
  ScrcpyVideoStream,
14
13
  } from "../base/index.js";
14
+ import { ScrcpyDeviceMessageParsers } from "../base/index.js";
15
15
  import type {
16
16
  ScrcpyBackOrScreenOnControlMessage,
17
17
  ScrcpyInjectTouchControlMessage,
@@ -54,11 +54,18 @@ export class ScrcpyOptions1_18
54
54
  return this.#clipboard;
55
55
  }
56
56
 
57
+ #deviceMessageParsers = new ScrcpyDeviceMessageParsers();
58
+ get deviceMessageParsers() {
59
+ return this.#deviceMessageParsers;
60
+ }
61
+
57
62
  constructor(init: Init) {
58
63
  this.value = { ...Defaults, ...init };
59
64
 
60
65
  if (this.value.control) {
61
- this.#clipboard = new ClipboardStream();
66
+ this.#clipboard = this.#deviceMessageParsers.add(
67
+ new ClipboardStream(),
68
+ );
62
69
  }
63
70
  }
64
71
 
@@ -88,25 +95,6 @@ export class ScrcpyOptions1_18
88
95
  return parseVideoStreamMetadata(stream);
89
96
  }
90
97
 
91
- async parseDeviceMessage(
92
- id: number,
93
- stream: ExactReadable | AsyncExactReadable,
94
- ): Promise<void> {
95
- if (await this.#clipboard!.parse(id, stream)) {
96
- return;
97
- }
98
-
99
- throw new Error("Unknown device message");
100
- }
101
-
102
- endDeviceMessageStream(e?: unknown): void {
103
- if (e) {
104
- this.#clipboard!.error(e);
105
- } else {
106
- this.#clipboard!.close();
107
- }
108
- }
109
-
110
98
  createMediaStreamTransformer(): TransformStream<
111
99
  Uint8Array,
112
100
  ScrcpyMediaStreamPacket
@@ -29,18 +29,15 @@ export class AckClipboardHandler implements ScrcpyDeviceMessageParser {
29
29
 
30
30
  #closed = false;
31
31
 
32
- async parse(id: number, stream: AsyncExactReadable) {
33
- if (id !== 1) {
34
- return false;
35
- }
32
+ readonly id = 1;
36
33
 
34
+ async parse(_id: number, stream: AsyncExactReadable): Promise<undefined> {
37
35
  const message = await AckClipboardDeviceMessage.deserialize(stream);
38
36
  const resolver = this.#resolvers.get(message.sequence);
39
37
  if (resolver) {
40
38
  resolver.resolve();
41
39
  this.#resolvers.delete(message.sequence);
42
40
  }
43
- return true;
44
41
  }
45
42
 
46
43
  close(): void {