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