@yume-chan/scrcpy 0.0.21 → 0.0.22

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 (75) hide show
  1. package/CHANGELOG.json +18 -0
  2. package/CHANGELOG.md +10 -1
  3. package/esm/codec/h264.js.map +1 -1
  4. package/esm/codec/h265.d.ts +72 -4
  5. package/esm/codec/h265.d.ts.map +1 -1
  6. package/esm/codec/h265.js +16 -17
  7. package/esm/codec/h265.js.map +1 -1
  8. package/esm/codec/nalu.js.map +1 -1
  9. package/esm/control/hover-helper.js.map +1 -1
  10. package/esm/control/inject-keycode.d.ts +13 -13
  11. package/esm/control/inject-keycode.d.ts.map +1 -1
  12. package/esm/control/inject-touch.d.ts.map +1 -1
  13. package/esm/control/inject-touch.js +0 -1
  14. package/esm/control/inject-touch.js.map +1 -1
  15. package/esm/control/serializer.d.ts +3 -0
  16. package/esm/control/serializer.d.ts.map +1 -1
  17. package/esm/control/serializer.js +16 -0
  18. package/esm/control/serializer.js.map +1 -1
  19. package/esm/control/type.js.map +1 -1
  20. package/esm/control/writer.d.ts +4 -0
  21. package/esm/control/writer.d.ts.map +1 -1
  22. package/esm/control/writer.js +17 -8
  23. package/esm/control/writer.js.map +1 -1
  24. package/esm/device-message/stream.js.map +1 -1
  25. package/esm/options/1_16/codec-options.d.ts +2 -2
  26. package/esm/options/1_16/codec-options.d.ts.map +1 -1
  27. package/esm/options/1_16/codec-options.js +15 -5
  28. package/esm/options/1_16/codec-options.js.map +1 -1
  29. package/esm/options/1_16/float-to-uint16.js.map +1 -1
  30. package/esm/options/1_16/options.d.ts +1 -1
  31. package/esm/options/1_16/options.js +1 -1
  32. package/esm/options/1_16/options.js.map +1 -1
  33. package/esm/options/1_16/scroll.js.map +1 -1
  34. package/esm/options/1_17.d.ts +1 -1
  35. package/esm/options/1_17.js.map +1 -1
  36. package/esm/options/1_18.d.ts +1 -1
  37. package/esm/options/1_21.d.ts +1 -1
  38. package/esm/options/1_21.js.map +1 -1
  39. package/esm/options/1_22/options.d.ts +1 -1
  40. package/esm/options/1_22/options.js.map +1 -1
  41. package/esm/options/1_22/scroll.js.map +1 -1
  42. package/esm/options/1_23.d.ts +1 -1
  43. package/esm/options/1_23.js.map +1 -1
  44. package/esm/options/1_24.d.ts +1 -1
  45. package/esm/options/2_0.d.ts +1 -1
  46. package/esm/options/2_0.js.map +1 -1
  47. package/esm/options/2_1.d.ts +1 -1
  48. package/esm/options/2_2.d.ts +67 -0
  49. package/esm/options/2_2.d.ts.map +1 -0
  50. package/esm/options/2_2.js +44 -0
  51. package/esm/options/2_2.js.map +1 -0
  52. package/esm/options/codec.js +1 -1
  53. package/esm/options/codec.js.map +1 -1
  54. package/esm/options/index.d.ts +1 -0
  55. package/esm/options/index.d.ts.map +1 -1
  56. package/esm/options/index.js +1 -0
  57. package/esm/options/index.js.map +1 -1
  58. package/esm/options/latest.d.ts +4 -4
  59. package/esm/options/latest.js +2 -2
  60. package/esm/options/types.d.ts.map +1 -1
  61. package/esm/options/types.js +5 -0
  62. package/esm/options/types.js.map +1 -1
  63. package/package.json +9 -18
  64. package/src/codec/h265.ts +26 -17
  65. package/src/control/inject-touch.ts +0 -1
  66. package/src/control/serializer.ts +25 -0
  67. package/src/control/writer.ts +20 -8
  68. package/src/options/1_16/codec-options.ts +20 -5
  69. package/src/options/1_16/options.ts +1 -1
  70. package/src/options/2_2.ts +68 -0
  71. package/src/options/codec.ts +1 -1
  72. package/src/options/index.ts +1 -0
  73. package/src/options/latest.ts +4 -4
  74. package/src/options/types.ts +8 -0
  75. package/tsconfig.build.tsbuildinfo +1 -1
@@ -8,6 +8,7 @@ export * from "./1_24.js";
8
8
  export * from "./1_25/index.js";
9
9
  export * from "./2_0.js";
10
10
  export * from "./2_1.js";
11
+ export * from "./2_2.js";
11
12
  export * from "./codec.js";
12
13
  export * from "./latest.js";
13
14
  export * from "./types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/options/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/options/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import { ScrcpyLogLevel1_18, ScrcpyVideoOrientation1_18 } from "./1_18.js";
2
- import type { ScrcpyOptionsInit2_1 } from "./2_1.js";
3
- import { ScrcpyOptions2_1 } from "./2_1.js";
2
+ import type { ScrcpyOptionsInit2_2 } from "./2_2.js";
3
+ import { ScrcpyOptions2_2 } from "./2_2.js";
4
4
  export declare const ScrcpyLogLevel: typeof ScrcpyLogLevel1_18;
5
5
  export type ScrcpyLogLevel = ScrcpyLogLevel1_18;
6
6
  export declare const ScrcpyVideoOrientation: typeof ScrcpyVideoOrientation1_18;
7
7
  export type ScrcpyVideoOrientation = ScrcpyVideoOrientation1_18;
8
- export type ScrcpyOptionsInitLatest = ScrcpyOptionsInit2_1;
9
- export declare class ScrcpyOptionsLatest extends ScrcpyOptions2_1 {
8
+ export type ScrcpyOptionsInitLatest = ScrcpyOptionsInit2_2;
9
+ export declare class ScrcpyOptionsLatest extends ScrcpyOptions2_2 {
10
10
  }
11
11
  //# sourceMappingURL=latest.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import { ScrcpyLogLevel1_18, ScrcpyVideoOrientation1_18 } from "./1_18.js";
2
- import { ScrcpyOptions2_1 } from "./2_1.js";
2
+ import { ScrcpyOptions2_2 } from "./2_2.js";
3
3
  export const ScrcpyLogLevel = ScrcpyLogLevel1_18;
4
4
  export const ScrcpyVideoOrientation = ScrcpyVideoOrientation1_18;
5
- export class ScrcpyOptionsLatest extends ScrcpyOptions2_1 {
5
+ export class ScrcpyOptionsLatest extends ScrcpyOptions2_2 {
6
6
  }
7
7
  //# sourceMappingURL=latest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,11 @@ export function toScrcpyOptionValue(value, empty) {
13
13
  if (value === undefined) {
14
14
  return empty;
15
15
  }
16
+ if (typeof value !== "string" &&
17
+ typeof value !== "number" &&
18
+ typeof value !== "boolean") {
19
+ throw new Error(`Invalid option value: ${String(value)}`);
20
+ }
16
21
  return String(value);
17
22
  }
18
23
  export class ScrcpyOptionsBase {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,mBAAmB,GAAG,mCAAmC,CAAC;AAMvE,MAAM,UAAU,mBAAmB,CAC/B,KAAc;IAEd,OAAO,CACH,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,eAAe,IAAI,KAAK;QACxB,OAAO,KAAK,CAAC,aAAa,KAAK,UAAU,CAC5C,CAAC;AACN,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAI,KAAc,EAAE,KAAQ;IAC3D,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;QAC5B,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;KACjC;IAED,uDAAuD;IACvD,IAAI,KAAK,KAAK,SAAS,EAAE;QACrB,OAAO,KAAK,CAAC;KAChB;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAgFD,MAAM,OAAgB,iBAAiB;IAKzB,KAAK,CAAI;IAInB,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;IAC1C,CAAC;IAEQ,KAAK,CAAc;IAE5B,YAAY,IAAO,EAAE,KAAkB;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC;IAED,SAAS;QACL,oCAAoC;QACpC,0DAA0D;QAC1D,2DAA2D;QAC3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,KAAK,YAAY,iBAAiB,EAAE;YACzC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;SAC1B;IACL,CAAC;IAID,eAAe;QACX,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;IACjC,CAAC;IAED,eAAe;QACX,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,YAAY,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;OAOG;IACH,wBAAwB,CACpB,MAAkC;QAElC,OAAO,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,wBAAwB,CACpB,MAAkC;QAElC,OAAO,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,4BAA4B;QAIxB,OAAO,IAAI,CAAC,KAAK,CAAC,4BAA4B,EAAE,CAAC;IACrD,CAAC;IAED,kCAAkC,CAC9B,OAAwC;QAExC,OAAO,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,qCAAqC,CACjC,OAA2C;QAE3C,OAAO,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,mCAAmC,CAC/B,OAAyC;QAEzC,OAAO,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,sBAAsB;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC;IAC/C,CAAC;CACJ"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yume-chan/scrcpy",
3
- "version": "0.0.21",
3
+ "version": "0.0.22",
4
4
  "description": "TypeScript implementation of Scrcpy.",
5
5
  "keywords": [
6
6
  "adb",
@@ -26,29 +26,20 @@
26
26
  "main": "esm/index.js",
27
27
  "types": "esm/index.d.ts",
28
28
  "dependencies": {
29
- "@yume-chan/stream-extra": "^0.0.21",
30
- "@yume-chan/struct": "^0.0.21",
31
- "tslib": "^2.6.0"
29
+ "@yume-chan/stream-extra": "^0.0.22",
30
+ "@yume-chan/struct": "^0.0.22",
31
+ "tslib": "^2.6.2"
32
32
  },
33
33
  "devDependencies": {
34
- "@jest/globals": "^29.6.1",
34
+ "@jest/globals": "^29.7.0",
35
35
  "@yume-chan/eslint-config": "^1.0.0",
36
36
  "@yume-chan/tsconfig": "^1.0.0",
37
37
  "cross-env": "^7.0.3",
38
- "eslint": "^8.44.0",
39
- "gh-release-fetch": "^3.0.2",
40
- "jest": "^29.5.0",
41
- "prettier": "^3.0.0",
38
+ "eslint": "^8.55.0",
39
+ "jest": "^29.7.0",
40
+ "prettier": "^3.1.0",
42
41
  "ts-jest": "^29.1.1",
43
- "typescript": "^5.1.6"
44
- },
45
- "peerDependencies": {
46
- "gh-release-fetch": "^3.0.2"
47
- },
48
- "peerDependenciesMeta": {
49
- "gh-release-fetch": {
50
- "optional": true
51
- }
42
+ "typescript": "^5.3.2"
52
43
  },
53
44
  "scripts": {
54
45
  "build": "tsc -b tsconfig.build.json",
package/src/codec/h265.ts CHANGED
@@ -14,6 +14,9 @@
14
14
  // cspell: ignore texmc
15
15
  // cspell: ignore rbsp
16
16
  // cspell: ignore cprms
17
+ // cspell: ignore nalu
18
+ // cspell: ignore sodb
19
+ // cspell: ignore luma
17
20
 
18
21
  import { NaluSodbBitReader, annexBSplitNalu } from "./nalu.js";
19
22
 
@@ -275,9 +278,9 @@ export function h265ParseSequenceParameterSet(nalu: Uint8Array) {
275
278
  const log2_max_pic_order_cnt_lsb_minus4 =
276
279
  reader.decodeExponentialGolombNumber();
277
280
 
278
- let sps_max_dec_pic_buffering_minus1: number[] | undefined;
279
- let sps_max_num_reorder_pics: number[] | undefined;
280
- let sps_max_latency_increase_plus1: number[] | undefined;
281
+ const sps_max_dec_pic_buffering_minus1: number[] = [];
282
+ const sps_max_num_reorder_pics: number[] = [];
283
+ const sps_max_latency_increase_plus1: number[] = [];
281
284
  const sps_sub_layer_ordering_info_present_flag = !!reader.next();
282
285
  for (
283
286
  let i = sps_sub_layer_ordering_info_present_flag
@@ -286,17 +289,11 @@ export function h265ParseSequenceParameterSet(nalu: Uint8Array) {
286
289
  i <= sps_max_sub_layers_minus1;
287
290
  i += 1
288
291
  ) {
289
- sps_max_dec_pic_buffering_minus1 = [];
290
- sps_max_num_reorder_pics = [];
291
- sps_max_latency_increase_plus1 = [];
292
- for (let i = 0; i <= sps_max_sub_layers_minus1; i += 1) {
293
- sps_max_dec_pic_buffering_minus1[i] =
294
- reader.decodeExponentialGolombNumber();
295
- sps_max_num_reorder_pics[i] =
296
- reader.decodeExponentialGolombNumber();
297
- sps_max_latency_increase_plus1[i] =
298
- reader.decodeExponentialGolombNumber();
299
- }
292
+ sps_max_dec_pic_buffering_minus1[i] =
293
+ reader.decodeExponentialGolombNumber();
294
+ sps_max_num_reorder_pics[i] = reader.decodeExponentialGolombNumber();
295
+ sps_max_latency_increase_plus1[i] =
296
+ reader.decodeExponentialGolombNumber();
300
297
  }
301
298
 
302
299
  const log2_min_luma_coding_block_size_minus3 =
@@ -370,7 +367,10 @@ export function h265ParseSequenceParameterSet(nalu: Uint8Array) {
370
367
  const vui_parameters_present_flag = !!reader.next();
371
368
  let vuiParameters: H265VuiParameters | undefined;
372
369
  if (vui_parameters_present_flag) {
373
- vuiParameters = h265ParseVuiParameters(reader);
370
+ vuiParameters = h265ParseVuiParameters(
371
+ reader,
372
+ sps_max_sub_layers_minus1,
373
+ );
374
374
  }
375
375
 
376
376
  const sps_extension_present_flag = !!reader.next();
@@ -897,7 +897,10 @@ export function h265ParseShortTermReferencePictureSet(
897
897
  /**
898
898
  * E.2.1 VUI parameters syntax
899
899
  */
900
- export function h265ParseVuiParameters(reader: NaluSodbBitReader) {
900
+ export function h265ParseVuiParameters(
901
+ reader: NaluSodbBitReader,
902
+ sps_max_sub_layers_minus1: number,
903
+ ) {
901
904
  const aspect_ratio_info_present_flag = !!reader.next();
902
905
  let aspect_ratio_idc: number | undefined;
903
906
  let sar_width: number | undefined;
@@ -966,6 +969,7 @@ export function h265ParseVuiParameters(reader: NaluSodbBitReader) {
966
969
  let vui_poc_proportional_to_timing_flag: boolean | undefined;
967
970
  let vui_num_ticks_poc_diff_one_minus1: number | undefined;
968
971
  let vui_hrd_parameters_present_flag: boolean | undefined;
972
+ let vui_hrd_parameters: H265HrdParameters | undefined;
969
973
  if (vui_timing_info_present_flag) {
970
974
  vui_num_units_in_tick = reader.read(32);
971
975
  vui_time_scale = reader.read(32);
@@ -976,7 +980,11 @@ export function h265ParseVuiParameters(reader: NaluSodbBitReader) {
976
980
  }
977
981
  vui_hrd_parameters_present_flag = !!reader.next();
978
982
  if (vui_hrd_parameters_present_flag) {
979
- throw new Error("Not implemented");
983
+ vui_hrd_parameters = h265ParseHrdParameters(
984
+ reader,
985
+ true,
986
+ sps_max_sub_layers_minus1,
987
+ );
980
988
  }
981
989
  }
982
990
 
@@ -1037,6 +1045,7 @@ export function h265ParseVuiParameters(reader: NaluSodbBitReader) {
1037
1045
  vui_poc_proportional_to_timing_flag,
1038
1046
  vui_num_ticks_poc_diff_one_minus1,
1039
1047
  vui_hrd_parameters_present_flag,
1048
+ vui_hrd_parameters,
1040
1049
 
1041
1050
  bitstream_restriction_flag,
1042
1051
  tiles_fixed_structure_flag,
@@ -27,7 +27,6 @@ export enum AndroidMotionEventButton {
27
27
  StylusSecondary = 0x40,
28
28
  }
29
29
 
30
- // eslint-disable-next-line @typescript-eslint/no-namespace
31
30
  export namespace ScrcpyPointerId {
32
31
  export const Mouse = -1n;
33
32
  export const Finger = -2n;
@@ -3,6 +3,7 @@ import type {
3
3
  ScrcpyScrollController,
4
4
  } from "../options/index.js";
5
5
 
6
+ import { BasicControlMessage } from "./basic.js";
6
7
  import type { AndroidKeyEventAction } from "./inject-keycode.js";
7
8
  import { ScrcpyInjectKeyCodeControlMessage } from "./inject-keycode.js";
8
9
  import type { ScrcpyInjectScrollControlMessage } from "./inject-scroll.js";
@@ -83,6 +84,30 @@ export class ScrcpyControlMessageSerializer {
83
84
  });
84
85
  }
85
86
 
87
+ expandNotificationPanel() {
88
+ return BasicControlMessage.serialize({
89
+ type: this.#typeValues.get(
90
+ ScrcpyControlMessageType.ExpandNotificationPanel,
91
+ ),
92
+ });
93
+ }
94
+
95
+ expandSettingPanel() {
96
+ return BasicControlMessage.serialize({
97
+ type: this.#typeValues.get(
98
+ ScrcpyControlMessageType.ExpandSettingPanel,
99
+ ),
100
+ });
101
+ }
102
+
103
+ collapseNotificationPanel() {
104
+ return BasicControlMessage.serialize({
105
+ type: this.#typeValues.get(
106
+ ScrcpyControlMessageType.CollapseNotificationPanel,
107
+ ),
108
+ });
109
+ }
110
+
86
111
  rotateDevice() {
87
112
  return ScrcpyRotateDeviceControlMessage.serialize({
88
113
  type: this.#typeValues.get(ScrcpyControlMessageType.RotateDevice),
@@ -27,25 +27,25 @@ export class ScrcpyControlMessageWriter {
27
27
  this.#serializer = new ScrcpyControlMessageSerializer(options);
28
28
  }
29
29
 
30
- async #write(message: Uint8Array) {
30
+ async write(message: Uint8Array) {
31
31
  await ConsumableWritableStream.write(this.#writer, message);
32
32
  }
33
33
 
34
34
  async injectKeyCode(
35
35
  message: Omit<ScrcpyInjectKeyCodeControlMessage, "type">,
36
36
  ) {
37
- await this.#write(this.#serializer.injectKeyCode(message));
37
+ await this.write(this.#serializer.injectKeyCode(message));
38
38
  }
39
39
 
40
40
  async injectText(text: string) {
41
- await this.#write(this.#serializer.injectText(text));
41
+ await this.write(this.#serializer.injectText(text));
42
42
  }
43
43
 
44
44
  /**
45
45
  * `pressure` is a float value between 0 and 1.
46
46
  */
47
47
  async injectTouch(message: Omit<ScrcpyInjectTouchControlMessage, "type">) {
48
- await this.#write(this.#serializer.injectTouch(message));
48
+ await this.write(this.#serializer.injectTouch(message));
49
49
  }
50
50
 
51
51
  /**
@@ -56,23 +56,35 @@ export class ScrcpyControlMessageWriter {
56
56
  ) {
57
57
  const data = this.#serializer.injectScroll(message);
58
58
  if (data) {
59
- await this.#write(data);
59
+ await this.write(data);
60
60
  }
61
61
  }
62
62
 
63
63
  async backOrScreenOn(action: AndroidKeyEventAction) {
64
64
  const data = this.#serializer.backOrScreenOn(action);
65
65
  if (data) {
66
- await this.#write(data);
66
+ await this.write(data);
67
67
  }
68
68
  }
69
69
 
70
70
  async setScreenPowerMode(mode: AndroidScreenPowerMode) {
71
- await this.#write(this.#serializer.setScreenPowerMode(mode));
71
+ await this.write(this.#serializer.setScreenPowerMode(mode));
72
+ }
73
+
74
+ async expandNotificationPanel() {
75
+ await this.write(this.#serializer.expandNotificationPanel());
76
+ }
77
+
78
+ async expandSettingPanel() {
79
+ await this.write(this.#serializer.expandSettingPanel());
80
+ }
81
+
82
+ async collapseNotificationPanel() {
83
+ await this.write(this.#serializer.collapseNotificationPanel());
72
84
  }
73
85
 
74
86
  async rotateDevice() {
75
- await this.#write(this.#serializer.rotateDevice());
87
+ await this.write(this.#serializer.rotateDevice());
76
88
  }
77
89
 
78
90
  releaseLock() {
@@ -27,14 +27,22 @@ const CODEC_OPTION_TYPES: Partial<
27
27
  };
28
28
 
29
29
  export class CodecOptions implements ScrcpyOptionValue {
30
- value: Partial<CodecOptionsInit>;
30
+ options: Partial<CodecOptionsInit>;
31
31
 
32
- constructor(value: Partial<CodecOptionsInit> = {}) {
33
- this.value = value;
32
+ constructor(options: Partial<CodecOptionsInit> = {}) {
33
+ for (const [key, value] of Object.entries(options)) {
34
+ if (typeof value !== "number") {
35
+ throw new Error(
36
+ `Invalid option value for ${key}: ${String(value)}`,
37
+ );
38
+ }
39
+ }
40
+
41
+ this.options = options;
34
42
  }
35
43
 
36
44
  toOptionValue(): string | undefined {
37
- const entries = Object.entries(this.value).filter(
45
+ const entries = Object.entries(this.options).filter(
38
46
  ([, value]) => value !== undefined,
39
47
  );
40
48
 
@@ -44,8 +52,15 @@ export class CodecOptions implements ScrcpyOptionValue {
44
52
 
45
53
  return entries
46
54
  .map(([key, value]) => {
55
+ let result = toDashCase(key);
56
+
47
57
  const type = CODEC_OPTION_TYPES[key as keyof CodecOptionsInit];
48
- return `${toDashCase(key)}${type ? `:${type}` : ""}=${value}`;
58
+ if (type) {
59
+ result += `:${type}`;
60
+ }
61
+
62
+ result += `=${value}`;
63
+ return result;
49
64
  })
50
65
  .join(",");
51
66
  }
@@ -45,7 +45,7 @@ export class ScrcpyOptions1_16 implements ScrcpyOptions<ScrcpyOptionsInit1_16> {
45
45
  maxFps: 0,
46
46
  lockVideoOrientation: ScrcpyVideoOrientation1_16.Unlocked,
47
47
  tunnelForward: false,
48
- crop: undefined,
48
+ crop: "",
49
49
  sendFrameMeta: true,
50
50
  control: true,
51
51
  displayId: 0,
@@ -0,0 +1,68 @@
1
+ import { ScrcpyOptions1_21 } from "./1_21.js";
2
+ import type { ScrcpyOptionsInit2_1 } from "./2_1.js";
3
+ import { ScrcpyOptions2_1 } from "./2_1.js";
4
+ import type { ScrcpyDisplay } from "./types.js";
5
+ import { ScrcpyOptionsBase } from "./types.js";
6
+
7
+ export interface ScrcpyOptionsInit2_2
8
+ extends Omit<ScrcpyOptionsInit2_1, "display"> {
9
+ videoSource?: "display" | "camera";
10
+ displayId?: number;
11
+ cameraId?: string | undefined;
12
+ cameraSize?: string | undefined;
13
+ cameraFacing?: "front" | "back" | "external" | undefined;
14
+ cameraAr?: string | undefined;
15
+ cameraFps?: number | undefined;
16
+ cameraHighSpeed?: boolean;
17
+
18
+ listCameras?: boolean;
19
+ listCameraSizes?: boolean;
20
+ }
21
+
22
+ export class ScrcpyOptions2_2 extends ScrcpyOptionsBase<
23
+ ScrcpyOptionsInit2_2,
24
+ ScrcpyOptions2_1
25
+ > {
26
+ static readonly DEFAULTS = {
27
+ ...ScrcpyOptions2_1.DEFAULTS,
28
+ videoSource: "display",
29
+ displayId: 0,
30
+ cameraId: undefined,
31
+ cameraSize: undefined,
32
+ cameraFacing: undefined,
33
+ cameraAr: undefined,
34
+ cameraFps: undefined,
35
+ cameraHighSpeed: false,
36
+ listCameras: false,
37
+ listCameraSizes: false,
38
+ } as const satisfies Required<ScrcpyOptionsInit2_2>;
39
+
40
+ override get defaults(): Required<ScrcpyOptionsInit2_2> {
41
+ return ScrcpyOptions2_2.DEFAULTS;
42
+ }
43
+
44
+ constructor(init: ScrcpyOptionsInit2_2) {
45
+ super(new ScrcpyOptions2_1(init), {
46
+ ...ScrcpyOptions2_2.DEFAULTS,
47
+ ...init,
48
+ });
49
+ }
50
+
51
+ override parseDisplay(line: string): ScrcpyDisplay | undefined {
52
+ const match = line.match(/\s+--display-id=(\d+)\s+\((.*?)\)/);
53
+ if (match) {
54
+ const display: ScrcpyDisplay = {
55
+ id: Number.parseInt(match[1]!, 10),
56
+ };
57
+ if (match[2] !== "size unknown") {
58
+ display.resolution = match[2]!;
59
+ }
60
+ return display;
61
+ }
62
+ return undefined;
63
+ }
64
+
65
+ override serialize(): string[] {
66
+ return ScrcpyOptions1_21.serialize(this.value, this.defaults);
67
+ }
68
+ }
@@ -37,7 +37,7 @@ export class ScrcpyAudioCodec implements ScrcpyOptionValue {
37
37
  "raw",
38
38
  0x00_72_61_77,
39
39
  "audio/raw",
40
- "1",
40
+ "",
41
41
  );
42
42
 
43
43
  readonly optionValue: string;
@@ -8,6 +8,7 @@ export * from "./1_24.js";
8
8
  export * from "./1_25/index.js";
9
9
  export * from "./2_0.js";
10
10
  export * from "./2_1.js";
11
+ export * from "./2_2.js";
11
12
  export * from "./codec.js";
12
13
  export * from "./latest.js";
13
14
  export * from "./types.js";
@@ -1,6 +1,6 @@
1
1
  import { ScrcpyLogLevel1_18, ScrcpyVideoOrientation1_18 } from "./1_18.js";
2
- import type { ScrcpyOptionsInit2_1 } from "./2_1.js";
3
- import { ScrcpyOptions2_1 } from "./2_1.js";
2
+ import type { ScrcpyOptionsInit2_2 } from "./2_2.js";
3
+ import { ScrcpyOptions2_2 } from "./2_2.js";
4
4
 
5
5
  export const ScrcpyLogLevel = ScrcpyLogLevel1_18;
6
6
  export type ScrcpyLogLevel = ScrcpyLogLevel1_18;
@@ -8,5 +8,5 @@ export type ScrcpyLogLevel = ScrcpyLogLevel1_18;
8
8
  export const ScrcpyVideoOrientation = ScrcpyVideoOrientation1_18;
9
9
  export type ScrcpyVideoOrientation = ScrcpyVideoOrientation1_18;
10
10
 
11
- export type ScrcpyOptionsInitLatest = ScrcpyOptionsInit2_1;
12
- export class ScrcpyOptionsLatest extends ScrcpyOptions2_1 {}
11
+ export type ScrcpyOptionsInitLatest = ScrcpyOptionsInit2_2;
12
+ export class ScrcpyOptionsLatest extends ScrcpyOptions2_2 {}
@@ -42,6 +42,14 @@ export function toScrcpyOptionValue<T>(value: unknown, empty: T): string | T {
42
42
  return empty;
43
43
  }
44
44
 
45
+ if (
46
+ typeof value !== "string" &&
47
+ typeof value !== "number" &&
48
+ typeof value !== "boolean"
49
+ ) {
50
+ throw new Error(`Invalid option value: ${String(value)}`);
51
+ }
52
+
45
53
  return String(value);
46
54
  }
47
55