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.
- package/README.md +156 -46
- package/client-dist/assets/index-cy7uJgaT.js +49 -0
- package/client-dist/index.html +1 -1
- package/dist/cli.js +351 -83
- package/dist/cli.js.map +1 -1
- package/dist/control-client.d.ts +1 -0
- package/dist/control-client.d.ts.map +1 -1
- package/dist/control-client.js +10 -2
- package/dist/control-client.js.map +1 -1
- package/dist/engine/scrcpy-engine.d.ts +2 -2
- package/dist/engine/scrcpy-engine.d.ts.map +1 -1
- package/dist/engine/scrcpy-engine.js.map +1 -1
- package/dist/engine/types.d.ts +3 -8
- package/dist/engine/types.d.ts.map +1 -1
- package/dist/focus-navigation.d.ts +27 -0
- package/dist/focus-navigation.d.ts.map +1 -0
- package/dist/focus-navigation.js +118 -0
- package/dist/focus-navigation.js.map +1 -0
- package/dist/gesture.d.ts +14 -0
- package/dist/gesture.d.ts.map +1 -0
- package/dist/gesture.js +110 -0
- package/dist/gesture.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/input-validation.d.ts.map +1 -1
- package/dist/input-validation.js +4 -56
- package/dist/input-validation.js.map +1 -1
- package/dist/input.d.ts +1 -21
- package/dist/input.d.ts.map +1 -1
- package/dist/keycodes.d.ts +2 -1
- package/dist/keycodes.d.ts.map +1 -1
- package/dist/keycodes.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +185 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mp4-writer.d.ts +18 -0
- package/dist/mp4-writer.d.ts.map +1 -0
- package/dist/mp4-writer.js +195 -0
- package/dist/mp4-writer.js.map +1 -0
- package/dist/protocol.d.ts +74 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +154 -7
- package/dist/protocol.js.map +1 -1
- package/dist/recording.d.ts +22 -0
- package/dist/recording.d.ts.map +1 -0
- package/dist/recording.js +132 -0
- package/dist/recording.js.map +1 -0
- package/dist/screen-diff.d.ts +21 -0
- package/dist/screen-diff.d.ts.map +1 -0
- package/dist/screen-diff.js +70 -0
- package/dist/screen-diff.js.map +1 -0
- package/dist/server/http.d.ts +5 -4
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +69 -31
- package/dist/server/http.js.map +1 -1
- package/dist/server/ws.d.ts +4 -3
- package/dist/server/ws.d.ts.map +1 -1
- package/dist/server/ws.js +32 -18
- package/dist/server/ws.js.map +1 -1
- package/dist/session.d.ts +25 -10
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +117 -67
- package/dist/session.js.map +1 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +1 -3
- package/dist/state.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +18 -3
- package/skills/porthole/SKILL.md +130 -0
- 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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"}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -1,10 +1,82 @@
|
|
|
1
|
-
|
|
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
|
package/dist/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
|
20
|
-
|
|
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
|
package/dist/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"
|
|
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"}
|