feat(scrcpy): move version info to option classes

This commit is contained in:
Simon Chan 2024-12-24 01:39:35 +08:00
parent a7a84979a5
commit cb44b6384c
No known key found for this signature in database
GPG key ID: A8B69F750B9BCEDD
36 changed files with 189 additions and 116 deletions

View file

@ -0,0 +1,6 @@
---
"@yume-chan/adb-scrcpy": minor
"@yume-chan/scrcpy": minor
---
Move `version` info to option classes and provide default values

View file

@ -120,7 +120,6 @@ export class AdbScrcpyClient {
static async start( static async start(
adb: Adb, adb: Adb,
path: string, path: string,
version: string,
options: AdbScrcpyOptions< options: AdbScrcpyOptions<
Pick<ScrcpyOptions1_15.Init, "tunnelForward"> Pick<ScrcpyOptions1_15.Init, "tunnelForward">
>, >,
@ -151,7 +150,7 @@ export class AdbScrcpyClient {
"app_process", "app_process",
/* unused */ "/", /* unused */ "/",
"com.genymobile.scrcpy.Server", "com.genymobile.scrcpy.Server",
version, options.version,
...options.serialize(), ...options.serialize(),
], ],
{ {

View file

@ -38,12 +38,11 @@ export class AdbScrcpyOptions1_16 extends AdbScrcpyOptions<
static async getEncoders( static async getEncoders(
adb: Adb, adb: Adb,
path: string, path: string,
version: string,
options: AdbScrcpyOptions< options: AdbScrcpyOptions<
Pick<ScrcpyOptions1_16Impl.Init, "tunnelForward"> Pick<ScrcpyOptions1_16Impl.Init, "tunnelForward">
>, >,
): Promise<ScrcpyEncoder[]> { ): Promise<ScrcpyEncoder[]> {
const client = await AdbScrcpyClient.start(adb, path, version, options); const client = await AdbScrcpyClient.start(adb, path, options);
const encoders: ScrcpyEncoder[] = []; const encoders: ScrcpyEncoder[] = [];
@ -65,7 +64,6 @@ export class AdbScrcpyOptions1_16 extends AdbScrcpyOptions<
static async getDisplays( static async getDisplays(
adb: Adb, adb: Adb,
path: string, path: string,
version: string,
options: AdbScrcpyOptions< options: AdbScrcpyOptions<
Pick<ScrcpyOptions1_16Impl.Init, "tunnelForward"> Pick<ScrcpyOptions1_16Impl.Init, "tunnelForward">
>, >,
@ -73,12 +71,7 @@ export class AdbScrcpyOptions1_16 extends AdbScrcpyOptions<
try { try {
// Server will exit before opening connections when an invalid display id was given // Server will exit before opening connections when an invalid display id was given
// so `start` will throw an `AdbScrcpyExitedError` // so `start` will throw an `AdbScrcpyExitedError`
const client = await AdbScrcpyClient.start( const client = await AdbScrcpyClient.start(adb, path, options);
adb,
path,
version,
options,
);
// If the server didn't exit, manually stop it and throw an error // If the server didn't exit, manually stop it and throw an error
await client.close(); await client.close();
@ -103,20 +96,12 @@ export class AdbScrcpyOptions1_16 extends AdbScrcpyOptions<
} }
} }
override getEncoders( override getEncoders(adb: Adb, path: string): Promise<ScrcpyEncoder[]> {
adb: Adb, return AdbScrcpyOptions1_16.getEncoders(adb, path, this);
path: string,
version: string,
): Promise<ScrcpyEncoder[]> {
return AdbScrcpyOptions1_16.getEncoders(adb, path, version, this);
} }
override getDisplays( override getDisplays(adb: Adb, path: string): Promise<ScrcpyDisplay[]> {
adb: Adb, return AdbScrcpyOptions1_16.getDisplays(adb, path, this);
path: string,
version: string,
): Promise<ScrcpyDisplay[]> {
return AdbScrcpyOptions1_16.getDisplays(adb, path, version, this);
} }
override createConnection(adb: Adb): AdbScrcpyConnection { override createConnection(adb: Adb): AdbScrcpyConnection {

View file

@ -18,20 +18,12 @@ export class AdbScrcpyOptions1_22 extends AdbScrcpyOptions<
"tunnelForward" | "control" | "sendDummyByte" "tunnelForward" | "control" | "sendDummyByte"
> >
> { > {
override getEncoders( override getEncoders(adb: Adb, path: string): Promise<ScrcpyEncoder[]> {
adb: Adb, return AdbScrcpyOptions1_16.getEncoders(adb, path, this);
path: string,
version: string,
): Promise<ScrcpyEncoder[]> {
return AdbScrcpyOptions1_16.getEncoders(adb, path, version, this);
} }
override getDisplays( override getDisplays(adb: Adb, path: string): Promise<ScrcpyDisplay[]> {
adb: Adb, return AdbScrcpyOptions1_16.getDisplays(adb, path, this);
path: string,
version: string,
): Promise<ScrcpyDisplay[]> {
return AdbScrcpyOptions1_16.getDisplays(adb, path, version, this);
} }
override createConnection(adb: Adb): AdbScrcpyConnection { override createConnection(adb: Adb): AdbScrcpyConnection {

View file

@ -24,7 +24,6 @@ export class AdbScrcpyOptions2_0 extends AdbScrcpyOptions<
static async getEncoders( static async getEncoders(
adb: Adb, adb: Adb,
path: string, path: string,
version: string,
options: AdbScrcpyOptions< options: AdbScrcpyOptions<
Pick<ScrcpyOptions1_16Impl.Init, "tunnelForward"> Pick<ScrcpyOptions1_16Impl.Init, "tunnelForward">
>, >,
@ -32,12 +31,7 @@ export class AdbScrcpyOptions2_0 extends AdbScrcpyOptions<
try { try {
// Similar to `AdbScrcpyOptions1_16.getDisplays`, // Similar to `AdbScrcpyOptions1_16.getDisplays`,
// server start procedure won't complete and `start `will throw // server start procedure won't complete and `start `will throw
const client = await AdbScrcpyClient.start( const client = await AdbScrcpyClient.start(adb, path, options);
adb,
path,
version,
options,
);
// If the server didn't exit, manually stop it and throw an error // If the server didn't exit, manually stop it and throw an error
await client.close(); await client.close();
@ -61,17 +55,12 @@ export class AdbScrcpyOptions2_0 extends AdbScrcpyOptions<
override async getEncoders( override async getEncoders(
adb: Adb, adb: Adb,
path: string, path: string,
version: string,
): Promise<ScrcpyEncoder[]> { ): Promise<ScrcpyEncoder[]> {
return AdbScrcpyOptions2_0.getEncoders(adb, path, version, this); return AdbScrcpyOptions2_0.getEncoders(adb, path, this);
} }
override getDisplays( override getDisplays(adb: Adb, path: string): Promise<ScrcpyDisplay[]> {
adb: Adb, return AdbScrcpyOptions1_16.getDisplays(adb, path, this);
path: string,
version: string,
): Promise<ScrcpyDisplay[]> {
return AdbScrcpyOptions1_16.getDisplays(adb, path, version, this);
} }
override createConnection(adb: Adb): AdbScrcpyConnection { override createConnection(adb: Adb): AdbScrcpyConnection {

View file

@ -28,17 +28,12 @@ export class AdbScrcpyOptions2_1 extends AdbScrcpyOptions<
override async getEncoders( override async getEncoders(
adb: Adb, adb: Adb,
path: string, path: string,
version: string,
): Promise<ScrcpyEncoder[]> { ): Promise<ScrcpyEncoder[]> {
return AdbScrcpyOptions2_0.getEncoders(adb, path, version, this); return AdbScrcpyOptions2_0.getEncoders(adb, path, this);
} }
override getDisplays( override getDisplays(adb: Adb, path: string): Promise<ScrcpyDisplay[]> {
adb: Adb, return AdbScrcpyOptions1_16.getDisplays(adb, path, this);
path: string,
version: string,
): Promise<ScrcpyDisplay[]> {
return AdbScrcpyOptions1_16.getDisplays(adb, path, version, this);
} }
override createConnection(adb: Adb): AdbScrcpyConnection { override createConnection(adb: Adb): AdbScrcpyConnection {

View file

@ -36,6 +36,8 @@ import {
export class ScrcpyOptions1_15 implements ScrcpyOptions<Init> { export class ScrcpyOptions1_15 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -47,8 +49,9 @@ export class ScrcpyOptions1_15 implements ScrcpyOptions<Init> {
return this.#clipboard; return this.#clipboard;
} }
constructor(init: Init) { constructor(init: Init, version = "1.15") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.control) { if (this.value.control) {
this.#clipboard = new ClipboardStream(); this.#clipboard = new ClipboardStream();

View file

@ -1,4 +1,9 @@
export { import { ScrcpyOptions1_15 } from "./1_15/index.js";
ScrcpyOptions1_15 as ScrcpyOptions1_15_1,
ScrcpyOptions1_15Impl as ScrcpyOptions1_15_1Impl, export class ScrcpyOptions1_15_1 extends ScrcpyOptions1_15 {
} from "./1_15/index.js"; constructor(init: ScrcpyOptions1_15.Init, version = "1.15.1") {
super(init, version);
}
}
export { ScrcpyOptions1_15Impl as ScrcpyOptions1_15_1Impl } from "./1_15/index.js";

View file

@ -1,4 +1,9 @@
export { import { ScrcpyOptions1_15 } from "./1_15/index.js";
ScrcpyOptions1_15 as ScrcpyOptions1_16,
ScrcpyOptions1_15Impl as ScrcpyOptions1_16Impl, export class ScrcpyOptions1_16 extends ScrcpyOptions1_15 {
} from "./1_15/index.js"; constructor(init: ScrcpyOptions1_15.Init, version = "1.16") {
super(init, version);
}
}
export { ScrcpyOptions1_15Impl as ScrcpyOptions1_16Impl } from "./1_15/index.js";

View file

@ -40,6 +40,8 @@ import {
export class ScrcpyOptions1_17 implements ScrcpyOptions<Init> { export class ScrcpyOptions1_17 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -51,8 +53,9 @@ export class ScrcpyOptions1_17 implements ScrcpyOptions<Init> {
return this.#clipboard; return this.#clipboard;
} }
constructor(init: Init) { constructor(init: Init, version = "1.17") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.control) { if (this.value.control) {
this.#clipboard = new ClipboardStream(); this.#clipboard = new ClipboardStream();

View file

@ -40,6 +40,8 @@ import {
export class ScrcpyOptions1_18 implements ScrcpyOptions<Init> { export class ScrcpyOptions1_18 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -51,8 +53,9 @@ export class ScrcpyOptions1_18 implements ScrcpyOptions<Init> {
return this.#clipboard; return this.#clipboard;
} }
constructor(init: Init) { constructor(init: Init, version = "1.18") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.control) { if (this.value.control) {
this.#clipboard = new ClipboardStream(); this.#clipboard = new ClipboardStream();

View file

@ -1,4 +1,9 @@
export { import { ScrcpyOptions1_18 } from "./1_18/index.js";
ScrcpyOptions1_18 as ScrcpyOptions1_19,
ScrcpyOptions1_18Impl as ScrcpyOptions1_19Impl, export class ScrcpyOptions1_19 extends ScrcpyOptions1_18 {
} from "./1_18/index.js"; constructor(init: ScrcpyOptions1_18.Init, version = "1.19") {
super(init, version);
}
}
export { ScrcpyOptions1_18Impl as ScrcpyOptions1_19Impl } from "./1_18/index.js";

View file

@ -1,4 +1,9 @@
export { import { ScrcpyOptions1_18 } from "./1_18/index.js";
ScrcpyOptions1_18 as ScrcpyOptions1_20,
ScrcpyOptions1_18Impl as ScrcpyOptions1_20Impl, export class ScrcpyOptions1_20 extends ScrcpyOptions1_18 {
} from "./1_18/index.js"; constructor(init: ScrcpyOptions1_18.Init, version = "1.20") {
super(init, version);
}
}
export { ScrcpyOptions1_18Impl as ScrcpyOptions1_20Impl } from "./1_18/index.js";

View file

@ -39,6 +39,8 @@ import {
export class ScrcpyOptions1_21 implements ScrcpyOptions<Init> { export class ScrcpyOptions1_21 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -52,8 +54,9 @@ export class ScrcpyOptions1_21 implements ScrcpyOptions<Init> {
#ackClipboardHandler: AckClipboardHandler | undefined; #ackClipboardHandler: AckClipboardHandler | undefined;
constructor(init: Init) { constructor(init: Init, version = "1.21") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.control && this.value.clipboardAutosync) { if (this.value.control && this.value.clipboardAutosync) {
this.#clipboard = new ClipboardStream(); this.#clipboard = new ClipboardStream();

View file

@ -1,9 +1,9 @@
import type { StructInit } from "@yume-chan/struct"; import type { StructInit } from "@yume-chan/struct";
import { s32, struct } from "@yume-chan/struct"; import { s32, struct } from "@yume-chan/struct";
import type { ScrcpyScrollController } from "../../base/index.js";
import type { ScrcpyInjectScrollControlMessage } from "../../latest.js"; import type { ScrcpyInjectScrollControlMessage } from "../../latest.js";
import type { ScrcpyScrollController } from "../../base/index.js";
import { PrevImpl } from "./prev.js"; import { PrevImpl } from "./prev.js";
export const InjectScrollControlMessage = /* #__PURE__ */ (() => export const InjectScrollControlMessage = /* #__PURE__ */ (() =>

View file

@ -39,6 +39,8 @@ import {
export class ScrcpyOptions1_22 implements ScrcpyOptions<Init> { export class ScrcpyOptions1_22 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -52,8 +54,9 @@ export class ScrcpyOptions1_22 implements ScrcpyOptions<Init> {
#ackClipboardHandler: AckClipboardHandler | undefined; #ackClipboardHandler: AckClipboardHandler | undefined;
constructor(init: Init) { constructor(init: Init, version = "1.22") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.control && this.value.clipboardAutosync) { if (this.value.control && this.value.clipboardAutosync) {
this.#clipboard = new ClipboardStream(); this.#clipboard = new ClipboardStream();

View file

@ -39,6 +39,8 @@ import {
export class ScrcpyOptions1_23 implements ScrcpyOptions<Init> { export class ScrcpyOptions1_23 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -52,8 +54,9 @@ export class ScrcpyOptions1_23 implements ScrcpyOptions<Init> {
#ackClipboardHandler: AckClipboardHandler | undefined; #ackClipboardHandler: AckClipboardHandler | undefined;
constructor(init: Init) { constructor(init: Init, version = "1.23") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.control && this.value.clipboardAutosync) { if (this.value.control && this.value.clipboardAutosync) {
this.#clipboard = new ClipboardStream(); this.#clipboard = new ClipboardStream();

View file

@ -39,6 +39,8 @@ import {
export class ScrcpyOptions1_24 implements ScrcpyOptions<Init> { export class ScrcpyOptions1_24 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -52,8 +54,9 @@ export class ScrcpyOptions1_24 implements ScrcpyOptions<Init> {
#ackClipboardHandler: AckClipboardHandler | undefined; #ackClipboardHandler: AckClipboardHandler | undefined;
constructor(init: Init) { constructor(init: Init, version = "1.24") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.control && this.value.clipboardAutosync) { if (this.value.control && this.value.clipboardAutosync) {
this.#clipboard = new ClipboardStream(); this.#clipboard = new ClipboardStream();

View file

@ -39,6 +39,8 @@ import {
export class ScrcpyOptions1_25 implements ScrcpyOptions<Init> { export class ScrcpyOptions1_25 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -52,8 +54,9 @@ export class ScrcpyOptions1_25 implements ScrcpyOptions<Init> {
#ackClipboardHandler: AckClipboardHandler | undefined; #ackClipboardHandler: AckClipboardHandler | undefined;
constructor(init: Init) { constructor(init: Init, version = "1.25") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.control && this.value.clipboardAutosync) { if (this.value.control && this.value.clipboardAutosync) {
this.#clipboard = new ClipboardStream(); this.#clipboard = new ClipboardStream();

View file

@ -40,6 +40,8 @@ import {
export class ScrcpyOptions2_0 implements ScrcpyOptions<Init> { export class ScrcpyOptions2_0 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -53,8 +55,9 @@ export class ScrcpyOptions2_0 implements ScrcpyOptions<Init> {
#ackClipboardHandler: AckClipboardHandler | undefined; #ackClipboardHandler: AckClipboardHandler | undefined;
constructor(init: Init) { constructor(init: Init, version = "2.0") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.control && this.value.clipboardAutosync) { if (this.value.control && this.value.clipboardAutosync) {
this.#clipboard = new ClipboardStream(); this.#clipboard = new ClipboardStream();

View file

@ -40,6 +40,8 @@ import {
export class ScrcpyOptions2_1 implements ScrcpyOptions<Init> { export class ScrcpyOptions2_1 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -53,8 +55,9 @@ export class ScrcpyOptions2_1 implements ScrcpyOptions<Init> {
#ackClipboardHandler: AckClipboardHandler | undefined; #ackClipboardHandler: AckClipboardHandler | undefined;
constructor(init: Init) { constructor(init: Init, version = "2.1") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.control && this.value.clipboardAutosync) { if (this.value.control && this.value.clipboardAutosync) {
this.#clipboard = new ClipboardStream(); this.#clipboard = new ClipboardStream();

View file

@ -40,6 +40,8 @@ import {
export class ScrcpyOptions2_2 implements ScrcpyOptions<Init> { export class ScrcpyOptions2_2 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -53,8 +55,9 @@ export class ScrcpyOptions2_2 implements ScrcpyOptions<Init> {
#ackClipboardHandler: AckClipboardHandler | undefined; #ackClipboardHandler: AckClipboardHandler | undefined;
constructor(init: Init) { constructor(init: Init, version = "v2.2") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.videoSource === "camera") { if (this.value.videoSource === "camera") {
this.value.control = false; this.value.control = false;

View file

@ -40,6 +40,8 @@ import {
export class ScrcpyOptions2_3 implements ScrcpyOptions<Init> { export class ScrcpyOptions2_3 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -53,8 +55,9 @@ export class ScrcpyOptions2_3 implements ScrcpyOptions<Init> {
#ackClipboardHandler: AckClipboardHandler | undefined; #ackClipboardHandler: AckClipboardHandler | undefined;
constructor(init: Init) { constructor(init: Init, version = "2.3") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.videoSource === "camera") { if (this.value.videoSource === "camera") {
this.value.control = false; this.value.control = false;

View file

@ -1,4 +1,9 @@
export { import { ScrcpyOptions2_3 } from "./2_3/index.js";
ScrcpyOptions2_3 as ScrcpyOptions2_3_1,
ScrcpyOptions2_3Impl as ScrcpyOptions2_3_1Impl, export class ScrcpyOptions2_3_1 extends ScrcpyOptions2_3 {
} from "./2_3/index.js"; constructor(init: ScrcpyOptions2_3.Init, version = "2.3.1") {
super(init, version);
}
}
export { ScrcpyOptions2_3Impl as ScrcpyOptions2_3_1Impl } from "./2_3/index.js";

View file

@ -44,6 +44,8 @@ import {
export class ScrcpyOptions2_4 implements ScrcpyOptions<Init> { export class ScrcpyOptions2_4 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -64,8 +66,9 @@ export class ScrcpyOptions2_4 implements ScrcpyOptions<Init> {
return this.#uHidOutput; return this.#uHidOutput;
} }
constructor(init: Init) { constructor(init: Init, version = "2.4") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.videoSource === "camera") { if (this.value.videoSource === "camera") {
this.value.control = false; this.value.control = false;

View file

@ -1,4 +1,9 @@
export { import { ScrcpyOptions2_4 } from "./2_4/index.js";
ScrcpyOptions2_4 as ScrcpyOptions2_5,
ScrcpyOptions2_4Impl as ScrcpyOptions2_5Impl, export class ScrcpyOptions2_5 extends ScrcpyOptions2_4 {
} from "./2_4/index.js"; constructor(init: ScrcpyOptions2_4.Init, version = "2.5") {
super(init, version);
}
}
export { ScrcpyOptions2_4Impl as ScrcpyOptions2_5Impl } from "./2_4/index.js";

View file

@ -20,6 +20,7 @@ import type {
ScrcpyUHidOutputDeviceMessage, ScrcpyUHidOutputDeviceMessage,
} from "../latest.js"; } from "../latest.js";
import type { Init } from "./impl/index.js";
import { import {
AckClipboardHandler, AckClipboardHandler,
ClipboardStream, ClipboardStream,
@ -39,11 +40,12 @@ import {
setListEncoders, setListEncoders,
UHidOutputStream, UHidOutputStream,
} from "./impl/index.js"; } from "./impl/index.js";
import type { Init } from "./impl/index.js";
export class ScrcpyOptions2_6 implements ScrcpyOptions<Init> { export class ScrcpyOptions2_6 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -64,8 +66,9 @@ export class ScrcpyOptions2_6 implements ScrcpyOptions<Init> {
return this.#uHidOutput; return this.#uHidOutput;
} }
constructor(init: Init) { constructor(init: Init, version = "2.6") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.videoSource === "camera") { if (this.value.videoSource === "camera") {
this.value.control = false; this.value.control = false;

View file

@ -1,4 +1,9 @@
export { import { ScrcpyOptions2_6 } from "./2_6/index.js";
ScrcpyOptions2_6 as ScrcpyOptions2_6_1,
ScrcpyOptions2_6Impl as ScrcpyOptions2_6_1Impl, export class ScrcpyOptions2_6_1 extends ScrcpyOptions2_6 {
} from "./2_6/index.js"; constructor(init: ScrcpyOptions2_6.Init, version = "2.6.1") {
super(init, version);
}
}
export { ScrcpyOptions2_6Impl as ScrcpyOptions2_6_1Impl } from "./2_6/index.js";

View file

@ -44,6 +44,8 @@ import {
export class ScrcpyOptions2_7 implements ScrcpyOptions<Init> { export class ScrcpyOptions2_7 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -64,8 +66,9 @@ export class ScrcpyOptions2_7 implements ScrcpyOptions<Init> {
return this.#uHidOutput; return this.#uHidOutput;
} }
constructor(init: Init) { constructor(init: Init, version = "2.7") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.videoSource === "camera") { if (this.value.videoSource === "camera") {
this.value.control = false; this.value.control = false;

View file

@ -44,6 +44,8 @@ import {
export class ScrcpyOptions3_0 implements ScrcpyOptions<Init> { export class ScrcpyOptions3_0 implements ScrcpyOptions<Init> {
static readonly Defaults = Defaults; static readonly Defaults = Defaults;
readonly version: string;
readonly value: Required<Init>; readonly value: Required<Init>;
get controlMessageTypes(): readonly ScrcpyControlMessageType[] { get controlMessageTypes(): readonly ScrcpyControlMessageType[] {
@ -64,8 +66,9 @@ export class ScrcpyOptions3_0 implements ScrcpyOptions<Init> {
return this.#uHidOutput; return this.#uHidOutput;
} }
constructor(init: Init) { constructor(init: Init, version = "3.0") {
this.value = { ...Defaults, ...init }; this.value = { ...Defaults, ...init };
this.version = version;
if (this.value.videoSource === "camera") { if (this.value.videoSource === "camera") {
this.value.control = false; this.value.control = false;

View file

@ -1,4 +1,9 @@
export { import { ScrcpyOptions3_0 } from "./3_0/index.js";
ScrcpyOptions3_0 as ScrcpyOptions3_0_1,
ScrcpyOptions3_0Impl as ScrcpyOptions3_0_1Impl, export class ScrcpyOptions3_0_1 extends ScrcpyOptions3_0 {
} from "./3_0/index.js"; constructor(init: ScrcpyOptions3_0.Init, version = "3.0.1") {
super(init, version);
}
}
export { ScrcpyOptions3_0Impl as ScrcpyOptions3_0_1Impl } from "./3_0/index.js";

View file

@ -1,4 +1,9 @@
export { import { ScrcpyOptions3_0 } from "./3_0/index.js";
ScrcpyOptions3_0 as ScrcpyOptions3_0_2,
ScrcpyOptions3_0Impl as ScrcpyOptions3_0_2Impl, export class ScrcpyOptions3_0_2 extends ScrcpyOptions3_0 {
} from "./3_0/index.js"; constructor(init: ScrcpyOptions3_0.Init, version = "3.0.2") {
super(init, version);
}
}
export { ScrcpyOptions3_0Impl as ScrcpyOptions3_0_2Impl } from "./3_0/index.js";

View file

@ -28,8 +28,8 @@ export function toScrcpyOptionValue<T>(value: unknown, empty: T): string | T {
typeof value !== "number" && typeof value !== "number" &&
typeof value !== "boolean" typeof value !== "boolean"
) { ) {
throw new TypeError(`Invalid option value: ${String(value)}`); throw new TypeError(`Invalid option value: ${JSON.stringify(value)}`);
} }
return String(value); return value.toString();
} }

View file

@ -19,6 +19,8 @@ import type { ScrcpyScrollController } from "./scroll-controller.js";
import type { ScrcpyVideoStream } from "./video.js"; import type { ScrcpyVideoStream } from "./video.js";
export interface ScrcpyOptions<T extends object> { export interface ScrcpyOptions<T extends object> {
get version(): string;
get controlMessageTypes(): readonly ScrcpyControlMessageType[]; get controlMessageTypes(): readonly ScrcpyControlMessageType[];
value: Required<T>; value: Required<T>;

View file

@ -1,3 +1,13 @@
import { ScrcpyOptions3_0 } from "./3_0/options.js";
export class ScrcpyOptionsLatest extends ScrcpyOptions3_0 {
constructor(init: ScrcpyOptions3_0.Init, version: string) {
super(init, version);
}
}
export { ScrcpyOptions3_0Impl as ScrcpyOptionsLatestImpl } from "./3_0/index.js";
export { export {
BackOrScreenOnControlMessage as ScrcpyBackOrScreenOnControlMessage, BackOrScreenOnControlMessage as ScrcpyBackOrScreenOnControlMessage,
CaptureOrientation as ScrcpyCaptureOrientation, CaptureOrientation as ScrcpyCaptureOrientation,
@ -14,5 +24,3 @@ export {
UHidCreateControlMessage as ScrcpyUHidCreateControlMessage, UHidCreateControlMessage as ScrcpyUHidCreateControlMessage,
UHidOutputDeviceMessage as ScrcpyUHidOutputDeviceMessage, UHidOutputDeviceMessage as ScrcpyUHidOutputDeviceMessage,
} from "./3_0/impl/index.js"; } from "./3_0/impl/index.js";
export { ScrcpyOptions3_0 as ScrcpyOptionsLatest } from "./3_0/index.js";

View file

@ -20,6 +20,10 @@ export class ScrcpyOptionsWrapper<T extends object>
{ {
#base: ScrcpyOptions<T>; #base: ScrcpyOptions<T>;
get version() {
return this.#base.version;
}
get controlMessageTypes() { get controlMessageTypes() {
return this.#base.controlMessageTypes; return this.#base.controlMessageTypes;
} }