portholejs 0.1.1 → 0.2.1

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/README.md +156 -46
  2. package/client-dist/assets/index-cy7uJgaT.js +49 -0
  3. package/client-dist/index.html +1 -1
  4. package/dist/cli.js +351 -83
  5. package/dist/cli.js.map +1 -1
  6. package/dist/control-client.d.ts +1 -0
  7. package/dist/control-client.d.ts.map +1 -1
  8. package/dist/control-client.js +10 -2
  9. package/dist/control-client.js.map +1 -1
  10. package/dist/engine/scrcpy-engine.d.ts +2 -2
  11. package/dist/engine/scrcpy-engine.d.ts.map +1 -1
  12. package/dist/engine/scrcpy-engine.js.map +1 -1
  13. package/dist/engine/types.d.ts +3 -8
  14. package/dist/engine/types.d.ts.map +1 -1
  15. package/dist/focus-navigation.d.ts +27 -0
  16. package/dist/focus-navigation.d.ts.map +1 -0
  17. package/dist/focus-navigation.js +118 -0
  18. package/dist/focus-navigation.js.map +1 -0
  19. package/dist/gesture.d.ts +14 -0
  20. package/dist/gesture.d.ts.map +1 -0
  21. package/dist/gesture.js +110 -0
  22. package/dist/gesture.js.map +1 -0
  23. package/dist/index.d.ts +4 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +2 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/input-validation.d.ts.map +1 -1
  28. package/dist/input-validation.js +4 -56
  29. package/dist/input-validation.js.map +1 -1
  30. package/dist/input.d.ts +1 -21
  31. package/dist/input.d.ts.map +1 -1
  32. package/dist/keycodes.d.ts +2 -1
  33. package/dist/keycodes.d.ts.map +1 -1
  34. package/dist/keycodes.js.map +1 -1
  35. package/dist/mcp/server.d.ts.map +1 -1
  36. package/dist/mcp/server.js +185 -2
  37. package/dist/mcp/server.js.map +1 -1
  38. package/dist/mp4-writer.d.ts +18 -0
  39. package/dist/mp4-writer.d.ts.map +1 -0
  40. package/dist/mp4-writer.js +195 -0
  41. package/dist/mp4-writer.js.map +1 -0
  42. package/dist/protocol.d.ts +74 -2
  43. package/dist/protocol.d.ts.map +1 -1
  44. package/dist/protocol.js +154 -7
  45. package/dist/protocol.js.map +1 -1
  46. package/dist/recording.d.ts +22 -0
  47. package/dist/recording.d.ts.map +1 -0
  48. package/dist/recording.js +132 -0
  49. package/dist/recording.js.map +1 -0
  50. package/dist/screen-diff.d.ts +21 -0
  51. package/dist/screen-diff.d.ts.map +1 -0
  52. package/dist/screen-diff.js +70 -0
  53. package/dist/screen-diff.js.map +1 -0
  54. package/dist/server/http.d.ts +5 -4
  55. package/dist/server/http.d.ts.map +1 -1
  56. package/dist/server/http.js +69 -31
  57. package/dist/server/http.js.map +1 -1
  58. package/dist/server/ws.d.ts +4 -3
  59. package/dist/server/ws.d.ts.map +1 -1
  60. package/dist/server/ws.js +32 -18
  61. package/dist/server/ws.js.map +1 -1
  62. package/dist/session.d.ts +25 -10
  63. package/dist/session.d.ts.map +1 -1
  64. package/dist/session.js +117 -67
  65. package/dist/session.js.map +1 -1
  66. package/dist/state.d.ts.map +1 -1
  67. package/dist/state.js +1 -3
  68. package/dist/state.js.map +1 -1
  69. package/dist/version.d.ts +2 -0
  70. package/dist/version.d.ts.map +1 -0
  71. package/dist/version.js +6 -0
  72. package/dist/version.js.map +1 -0
  73. package/package.json +18 -3
  74. package/skills/porthole/SKILL.md +130 -0
  75. package/client-dist/assets/index-C_qSS_Gy.js +0 -49
@@ -0,0 +1,195 @@
1
+ const DEFAULT_TIMESCALE = 90_000;
2
+ // A late-joining recorder receives the server's cached keyframe whose PTS can
3
+ // be minutes older than the live stream; unclamped, that gap becomes one
4
+ // giant frozen first frame. No real inter-frame gap should exceed this.
5
+ const MAX_SAMPLE_DURATION_S = 1;
6
+ const MIN_SAMPLE_DURATION_S = 1 / 240;
7
+ export function createMp4(track) {
8
+ if (track.samples.length === 0)
9
+ throw new Error("Cannot create MP4 without samples.");
10
+ const timescale = track.timescale ?? DEFAULT_TIMESCALE;
11
+ const parameterSets = h264ParameterSets(track.config);
12
+ const prepared = prepareSamples(track.samples, timescale, track.durationMs);
13
+ const ftyp = box("ftyp", str("isom"), u32(0x200), str("isom"), str("iso2"), str("avc1"), str("mp41"));
14
+ const mdatPayload = concat(prepared.map((sample) => sample.data));
15
+ const mdat = box("mdat", mdatPayload);
16
+ const firstSampleOffset = ftyp.byteLength + 8;
17
+ let offset = firstSampleOffset;
18
+ for (const sample of prepared) {
19
+ sample.offset = offset;
20
+ offset += sample.data.byteLength;
21
+ }
22
+ const moov = moovBox(track, prepared, parameterSets, timescale);
23
+ return concat([ftyp, mdat, moov]);
24
+ }
25
+ export function annexBToAvcc(data) {
26
+ const nals = splitAnnexBNals(data);
27
+ return concat(nals.map((nal) => {
28
+ const length = u32(nal.byteLength);
29
+ return concat([length, nal]);
30
+ }));
31
+ }
32
+ export function splitAnnexBNals(data) {
33
+ const starts = [];
34
+ for (let i = 0; i < data.byteLength - 3; i++) {
35
+ if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 1) {
36
+ starts.push(i);
37
+ i += 2;
38
+ }
39
+ else if (i < data.byteLength - 4 &&
40
+ data[i] === 0 &&
41
+ data[i + 1] === 0 &&
42
+ data[i + 2] === 0 &&
43
+ data[i + 3] === 1) {
44
+ starts.push(i);
45
+ i += 3;
46
+ }
47
+ }
48
+ return starts.map((start, index) => {
49
+ const startCodeLength = data[start + 2] === 1 ? 3 : 4;
50
+ const nalStart = start + startCodeLength;
51
+ const nalEnd = starts[index + 1] ?? data.byteLength;
52
+ return data.subarray(nalStart, nalEnd);
53
+ });
54
+ }
55
+ export function hasMp4Box(data, type) {
56
+ for (let offset = 0; offset + 8 <= data.byteLength;) {
57
+ const size = readU32(data, offset);
58
+ const boxType = new TextDecoder().decode(data.subarray(offset + 4, offset + 8));
59
+ if (boxType === type)
60
+ return true;
61
+ if (size < 8)
62
+ return false;
63
+ offset += size;
64
+ }
65
+ return false;
66
+ }
67
+ function prepareSamples(samples, timescale, durationMs) {
68
+ const totalDurationSeconds = durationMs === undefined ? undefined : durationMs / 1000;
69
+ const firstTimestamp = timestampSeconds(samples[0]?.timestamp ?? 0);
70
+ return samples.map((sample, index) => {
71
+ const next = samples[index + 1];
72
+ const durationSeconds = next
73
+ ? timestampSeconds(next.timestamp) - timestampSeconds(sample.timestamp)
74
+ : totalDurationSeconds !== undefined
75
+ ? Math.max(1 / 30, totalDurationSeconds - (timestampSeconds(sample.timestamp) - firstTimestamp))
76
+ : index > 0
77
+ ? timestampSeconds(sample.timestamp) -
78
+ timestampSeconds(previousSample(samples, index).timestamp)
79
+ : 1 / 30;
80
+ const clampedSeconds = Math.min(MAX_SAMPLE_DURATION_S, Math.max(MIN_SAMPLE_DURATION_S, durationSeconds));
81
+ return {
82
+ data: annexBToAvcc(sample.data),
83
+ duration: Math.max(1, Math.round(clampedSeconds * timescale)),
84
+ keyframe: sample.keyframe,
85
+ offset: 0,
86
+ };
87
+ });
88
+ }
89
+ function previousSample(samples, index) {
90
+ const sample = samples[index - 1];
91
+ if (!sample)
92
+ throw new Error("Missing previous sample.");
93
+ return sample;
94
+ }
95
+ function timestampSeconds(timestamp) {
96
+ return timestamp > 10_000 ? timestamp / 1_000_000 : timestamp / 1_000;
97
+ }
98
+ function h264ParameterSets(config) {
99
+ const nals = splitAnnexBNals(config);
100
+ const sps = nals.find((nal) => (nal[0] & 0x1f) === 7);
101
+ const pps = nals.find((nal) => (nal[0] & 0x1f) === 8);
102
+ if (!sps || !pps)
103
+ throw new Error("H.264 config must contain SPS and PPS NAL units.");
104
+ return { sps, pps };
105
+ }
106
+ function moovBox(track, samples, parameterSets, timescale) {
107
+ const duration = samples.reduce((sum, sample) => sum + sample.duration, 0);
108
+ return box("moov", mvhd(timescale, duration), trakBox(track, samples, parameterSets, timescale, duration));
109
+ }
110
+ function trakBox(track, samples, parameterSets, timescale, duration) {
111
+ return box("trak", tkhd(track.width, track.height, duration), box("mdia", mdhd(timescale, duration), hdlr(), box("minf", vmhd(), dinf(), stbl(track, samples, parameterSets))));
112
+ }
113
+ function mvhd(timescale, duration) {
114
+ return box("mvhd", u32(0), u32(0), u32(0), u32(timescale), u32(duration), u32(0x00010000), u16(0x0100), zeros(10), matrix(), zeros(24), u32(2));
115
+ }
116
+ function tkhd(width, height, duration) {
117
+ return box("tkhd", u32(0x00000007), u32(0), u32(0), u32(1), u32(0), u32(duration), zeros(8), u16(0), u16(0), u16(0), u16(0), matrix(), u32(width << 16), u32(height << 16));
118
+ }
119
+ function mdhd(timescale, duration) {
120
+ return box("mdhd", u32(0), u32(0), u32(0), u32(timescale), u32(duration), u16(0x55c4), u16(0));
121
+ }
122
+ function hdlr() {
123
+ return box("hdlr", u32(0), u32(0), str("vide"), zeros(12), str("VideoHandler\0"));
124
+ }
125
+ function vmhd() {
126
+ return box("vmhd", u32(1), u16(0), u16(0), u16(0), u16(0));
127
+ }
128
+ function dinf() {
129
+ return box("dinf", box("dref", u32(0), u32(1), box("url ", u32(1))));
130
+ }
131
+ function stbl(track, samples, parameterSets) {
132
+ return box("stbl", stsd(track, parameterSets), stts(samples), stss(samples), box("stsc", u32(0), u32(1), u32(1), u32(1), u32(1)), box("stsz", u32(0), u32(0), u32(samples.length), ...samples.map((sample) => u32(sample.data.byteLength))), box("stco", u32(0), u32(samples.length), ...samples.map((sample) => u32(sample.offset))));
133
+ }
134
+ function stsd(track, parameterSets) {
135
+ return box("stsd", u32(0), u32(1), box("avc1", zeros(6), u16(1), zeros(16), u16(track.width), u16(track.height), u32(0x00480000), u32(0x00480000), u32(0), u16(1), zeros(32), u16(0x0018), u16(0xffff), avcc(parameterSets)));
136
+ }
137
+ function stts(samples) {
138
+ return box("stts", u32(0), u32(samples.length), ...samples.map((sample) => concat([u32(1), u32(sample.duration)])));
139
+ }
140
+ function stss(samples) {
141
+ const keys = samples.flatMap((sample, index) => sample.keyframe ? [u32(index + 1)] : []);
142
+ return box("stss", u32(0), u32(keys.length), ...keys);
143
+ }
144
+ function avcc({ sps, pps }) {
145
+ return box("avcC", u8(1), u8(sps[1] ?? 0x42), u8(sps[2] ?? 0), u8(sps[3] ?? 0x1f), u8(0xff), u8(0xe1), u16(sps.byteLength), sps, u8(1), u16(pps.byteLength), pps);
146
+ }
147
+ function box(type, ...payloads) {
148
+ const payload = concat(payloads);
149
+ return concat([u32(payload.byteLength + 8), str(type), payload]);
150
+ }
151
+ function concat(chunks) {
152
+ const result = new Uint8Array(chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0));
153
+ let offset = 0;
154
+ for (const chunk of chunks) {
155
+ result.set(chunk, offset);
156
+ offset += chunk.byteLength;
157
+ }
158
+ return result;
159
+ }
160
+ function matrix() {
161
+ return concat([
162
+ u32(0x00010000),
163
+ u32(0),
164
+ u32(0),
165
+ u32(0),
166
+ u32(0x00010000),
167
+ u32(0),
168
+ u32(0),
169
+ u32(0),
170
+ u32(0x40000000),
171
+ ]);
172
+ }
173
+ function str(value) {
174
+ return new TextEncoder().encode(value);
175
+ }
176
+ function zeros(length) {
177
+ return new Uint8Array(length);
178
+ }
179
+ function u8(value) {
180
+ return Uint8Array.of(value & 0xff);
181
+ }
182
+ function u16(value) {
183
+ const data = new Uint8Array(2);
184
+ new DataView(data.buffer).setUint16(0, value);
185
+ return data;
186
+ }
187
+ function u32(value) {
188
+ const data = new Uint8Array(4);
189
+ new DataView(data.buffer).setUint32(0, value >>> 0);
190
+ return data;
191
+ }
192
+ function readU32(data, offset) {
193
+ return new DataView(data.buffer, data.byteOffset, data.byteLength).getUint32(offset);
194
+ }
195
+ //# sourceMappingURL=mp4-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mp4-writer.js","sourceRoot":"","sources":["../src/mp4-writer.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,82 @@
1
- import type { VideoChunk } from "./engine/types.js";
1
+ export declare const REMOTE_BUTTONS: readonly ["dpad_up", "dpad_down", "dpad_left", "dpad_right", "select", "back", "home", "menu", "play_pause", "rewind", "fast_forward", "volume_up", "volume_down"];
2
+ export type RemoteButton = (typeof REMOTE_BUTTONS)[number];
3
+ export interface TouchEvent {
4
+ kind: "touch";
5
+ phase: "down" | "move" | "up";
6
+ x: number;
7
+ y: number;
8
+ }
9
+ export interface KeyEvent {
10
+ kind: "key";
11
+ phase: "down" | "up";
12
+ keycode: number;
13
+ }
14
+ export interface TextEvent {
15
+ kind: "text";
16
+ text: string;
17
+ }
18
+ export interface RemoteEvent {
19
+ kind: "remote";
20
+ button: RemoteButton;
21
+ }
22
+ export interface SwipeGestureEvent {
23
+ kind: "gesture";
24
+ type: "swipe";
25
+ x1: number;
26
+ y1: number;
27
+ x2: number;
28
+ y2: number;
29
+ durationMs?: number;
30
+ steps?: number;
31
+ }
32
+ export interface LongPressGestureEvent {
33
+ kind: "gesture";
34
+ type: "longpress";
35
+ x1: number;
36
+ y1: number;
37
+ durationMs?: number;
38
+ steps?: number;
39
+ }
40
+ export type GestureEvent = SwipeGestureEvent | LongPressGestureEvent;
41
+ export type EngineInputEvent = TouchEvent | KeyEvent | TextEvent | RemoteEvent;
42
+ export type InputEvent = EngineInputEvent | GestureEvent;
43
+ export interface VideoChunk {
44
+ type: "config" | "frame";
45
+ data: Uint8Array;
46
+ timestamp?: number;
47
+ keyframe?: boolean;
48
+ }
49
+ export type DeviceProfile = "phone" | "tv";
50
+ export type DeviceState = "running" | "stopped" | "offline";
51
+ export type VideoMode = "webcodecs" | "mjpeg";
52
+ export interface ProtocolDevice {
53
+ name: string;
54
+ serial: string | null;
55
+ profile: DeviceProfile;
56
+ state: DeviceState;
57
+ }
58
+ export interface HealthResponse {
59
+ status: "waiting" | "ok" | "reconnecting" | "dead";
60
+ codec?: string;
61
+ width?: number;
62
+ height?: number;
63
+ device?: ProtocolDevice;
64
+ preferredVideoMode?: VideoMode;
65
+ videoModes?: VideoMode[];
66
+ }
67
+ export interface InputResponse {
68
+ ok: boolean;
69
+ }
2
70
  export type WsPacketType = "config" | "delta" | "key";
3
71
  export interface DecodedWsPacket {
4
72
  type: WsPacketType;
5
73
  timestamp: number;
6
74
  data: Uint8Array;
75
+ deviceId?: string;
7
76
  }
8
- export declare function encodeVideoPacket(chunk: VideoChunk): Uint8Array;
77
+ export declare function encodeVideoPacket(chunk: VideoChunk, deviceId?: string): Uint8Array;
9
78
  export declare function decodeVideoPacket(data: ArrayBufferLike): DecodedWsPacket;
79
+ export declare function encodeInputEvent(event: InputEvent): string;
80
+ export declare function decodeInputEvent(value: unknown): InputEvent;
81
+ export declare function decodeInputEventJson(json: string): InputEvent;
10
82
  //# sourceMappingURL=protocol.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,CAAC;CAClB;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAW/D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,CAYxE"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
package/dist/protocol.js CHANGED
@@ -1,27 +1,174 @@
1
+ export const REMOTE_BUTTONS = [
2
+ "dpad_up",
3
+ "dpad_down",
4
+ "dpad_left",
5
+ "dpad_right",
6
+ "select",
7
+ "back",
8
+ "home",
9
+ "menu",
10
+ "play_pause",
11
+ "rewind",
12
+ "fast_forward",
13
+ "volume_up",
14
+ "volume_down",
15
+ ];
1
16
  const PACKET_HEADER_BYTES = 13;
2
- export function encodeVideoPacket(chunk) {
17
+ const LEGACY_PACKET_HEADER_BYTES = 5;
18
+ const DEVICE_PACKET_FLAG = 0x80;
19
+ const TOUCH_PHASES = new Set(["down", "move", "up"]);
20
+ const KEY_PHASES = new Set(["down", "up"]);
21
+ const REMOTE_BUTTON_SET = new Set(REMOTE_BUTTONS);
22
+ export function encodeVideoPacket(chunk, deviceId) {
3
23
  const type = chunk.type === "config" ? 0 : chunk.keyframe ? 2 : 1;
4
- const header = new Uint8Array(PACKET_HEADER_BYTES);
24
+ const deviceBytes = deviceId === undefined ? undefined : new TextEncoder().encode(deviceId);
25
+ const headerLength = deviceBytes === undefined
26
+ ? PACKET_HEADER_BYTES
27
+ : PACKET_HEADER_BYTES + 2 + deviceBytes.length;
28
+ const header = new Uint8Array(headerLength);
5
29
  const view = new DataView(header.buffer);
6
- view.setUint8(0, type);
30
+ view.setUint8(0, deviceBytes === undefined ? type : type | DEVICE_PACKET_FLAG);
7
31
  view.setUint32(1, chunk.data.byteLength);
8
32
  view.setFloat64(5, chunk.timestamp ?? 0);
9
- const packet = new Uint8Array(PACKET_HEADER_BYTES + chunk.data.byteLength);
33
+ if (deviceBytes !== undefined) {
34
+ view.setUint16(PACKET_HEADER_BYTES, deviceBytes.length);
35
+ header.set(deviceBytes, PACKET_HEADER_BYTES + 2);
36
+ }
37
+ const packet = new Uint8Array(headerLength + chunk.data.byteLength);
10
38
  packet.set(header, 0);
11
- packet.set(chunk.data, PACKET_HEADER_BYTES);
39
+ packet.set(chunk.data, headerLength);
12
40
  return packet;
13
41
  }
14
42
  export function decodeVideoPacket(data) {
15
43
  const view = new DataView(data);
16
44
  const rawType = view.getUint8(0);
45
+ const hasDeviceId = (rawType & DEVICE_PACKET_FLAG) !== 0;
17
46
  const length = view.getUint32(1);
18
47
  const timestamp = data.byteLength >= PACKET_HEADER_BYTES ? view.getFloat64(5) : 0;
19
- const offset = data.byteLength >= PACKET_HEADER_BYTES ? PACKET_HEADER_BYTES : 5;
20
- const type = rawType === 0 ? "config" : rawType === 2 ? "key" : "delta";
48
+ const legacyOffset = data.byteLength >= PACKET_HEADER_BYTES
49
+ ? PACKET_HEADER_BYTES
50
+ : LEGACY_PACKET_HEADER_BYTES;
51
+ let offset = legacyOffset;
52
+ let deviceId;
53
+ if (hasDeviceId) {
54
+ const deviceLength = view.getUint16(PACKET_HEADER_BYTES);
55
+ offset = PACKET_HEADER_BYTES + 2 + deviceLength;
56
+ deviceId = new TextDecoder().decode(new Uint8Array(data, PACKET_HEADER_BYTES + 2, deviceLength));
57
+ }
58
+ const typeByte = rawType & ~DEVICE_PACKET_FLAG;
59
+ const type = typeByte === 0 ? "config" : typeByte === 2 ? "key" : "delta";
21
60
  return {
22
61
  type,
23
62
  timestamp,
24
63
  data: new Uint8Array(data, offset, length),
64
+ ...(deviceId === undefined ? {} : { deviceId }),
25
65
  };
26
66
  }
67
+ export function encodeInputEvent(event) {
68
+ return JSON.stringify(event);
69
+ }
70
+ export function decodeInputEvent(value) {
71
+ if (!value || typeof value !== "object") {
72
+ throw new Error("Input event must be an object.");
73
+ }
74
+ const event = value;
75
+ if (event.kind === "touch") {
76
+ if (!TOUCH_PHASES.has(String(event.phase))) {
77
+ throw new Error("Touch phase must be down, move, or up.");
78
+ }
79
+ if (!isNormalized(event.x) || !isNormalized(event.y)) {
80
+ throw new Error("Touch coordinates must be numbers in 0..1.");
81
+ }
82
+ return {
83
+ kind: "touch",
84
+ phase: event.phase,
85
+ x: event.x,
86
+ y: event.y,
87
+ };
88
+ }
89
+ if (event.kind === "key") {
90
+ if (!KEY_PHASES.has(String(event.phase))) {
91
+ throw new Error("Key phase must be down or up.");
92
+ }
93
+ if (!Number.isInteger(event.keycode)) {
94
+ throw new Error("Keycode must be an integer.");
95
+ }
96
+ return {
97
+ kind: "key",
98
+ phase: event.phase,
99
+ keycode: event.keycode,
100
+ };
101
+ }
102
+ if (event.kind === "text") {
103
+ if (typeof event.text !== "string") {
104
+ throw new Error("Text input must include a string text field.");
105
+ }
106
+ return { kind: "text", text: event.text };
107
+ }
108
+ if (event.kind === "remote") {
109
+ if (typeof event.button !== "string" || !isRemoteButton(event.button)) {
110
+ throw new Error(`Remote button must be one of ${REMOTE_BUTTONS.join(", ")}.`);
111
+ }
112
+ return { kind: "remote", button: event.button };
113
+ }
114
+ if (event.kind === "gesture") {
115
+ if (event.type !== "swipe" && event.type !== "longpress") {
116
+ throw new Error("Gesture type must be swipe or longpress.");
117
+ }
118
+ if (!isNormalized(event.x1) || !isNormalized(event.y1)) {
119
+ throw new Error("Gesture start coordinates must be numbers in 0..1.");
120
+ }
121
+ const durationMs = optionalPositiveNumber(event.durationMs, "Gesture duration");
122
+ const steps = optionalPositiveInteger(event.steps, "Gesture steps");
123
+ if (event.type === "longpress") {
124
+ return {
125
+ kind: "gesture",
126
+ type: "longpress",
127
+ x1: event.x1,
128
+ y1: event.y1,
129
+ ...(durationMs === undefined ? {} : { durationMs }),
130
+ ...(steps === undefined ? {} : { steps }),
131
+ };
132
+ }
133
+ if (!isNormalized(event.x2) || !isNormalized(event.y2)) {
134
+ throw new Error("Gesture end coordinates must be numbers in 0..1.");
135
+ }
136
+ return {
137
+ kind: "gesture",
138
+ type: "swipe",
139
+ x1: event.x1,
140
+ y1: event.y1,
141
+ x2: event.x2,
142
+ y2: event.y2,
143
+ ...(durationMs === undefined ? {} : { durationMs }),
144
+ ...(steps === undefined ? {} : { steps }),
145
+ };
146
+ }
147
+ throw new Error("Unknown input event kind.");
148
+ }
149
+ export function decodeInputEventJson(json) {
150
+ return decodeInputEvent(JSON.parse(json));
151
+ }
152
+ function isNormalized(value) {
153
+ return typeof value === "number" && value >= 0 && value <= 1;
154
+ }
155
+ function isRemoteButton(value) {
156
+ return REMOTE_BUTTON_SET.has(value);
157
+ }
158
+ function optionalPositiveNumber(value, label) {
159
+ if (value === undefined)
160
+ return undefined;
161
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
162
+ throw new Error(`${label} must be a positive number.`);
163
+ }
164
+ return value;
165
+ }
166
+ function optionalPositiveInteger(value, label) {
167
+ if (value === undefined)
168
+ return undefined;
169
+ if (!Number.isInteger(value) || value <= 0) {
170
+ throw new Error(`${label} must be a positive integer.`);
171
+ }
172
+ return value;
173
+ }
27
174
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAUA,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,MAAM,UAAU,iBAAiB,CAAC,KAAiB;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,mBAAmB,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3E,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,IAAI,GAAiB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IACtF,OAAO;QACL,IAAI;QACJ,SAAS;QACT,IAAI,EAAE,IAAI,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;KAC3C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type ControlClientOptions } from "./control-client.js";
2
+ export interface RecordingOptions extends ControlClientOptions {
3
+ output: string;
4
+ durationMs?: number;
5
+ }
6
+ export interface RecordingResult {
7
+ ok: true;
8
+ path: string;
9
+ samples: number;
10
+ durationMs: number;
11
+ }
12
+ export declare function recordSession(opts: RecordingOptions): Promise<RecordingResult>;
13
+ export declare class H264Recorder {
14
+ #private;
15
+ private readonly width;
16
+ private readonly height;
17
+ constructor(width: number, height: number);
18
+ get sampleCount(): number;
19
+ addPacket(data: Uint8Array): void;
20
+ finalize(durationMs?: number): Uint8Array;
21
+ }
22
+ //# sourceMappingURL=recording.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../src/recording.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGjF,MAAM,WAAW,gBAAiB,SAAQ,oBAAoB;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA8CpF;AAED,qBAAa,YAAY;;IAMrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM;IAGjC,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAoBjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU;CAY1C"}