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