@aiscene/aiserver 1.6.1 → 1.6.3
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/dist/scrcpy/server.d.ts +54 -17
- package/dist/scrcpy/server.d.ts.map +1 -1
- package/dist/scrcpy/server.js +386 -288
- package/dist/scrcpy/server.js.map +1 -1
- package/package.json +2 -2
package/dist/scrcpy/server.d.ts
CHANGED
|
@@ -1,20 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Scrcpy preview service for AIServer
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* 通过 socket.io 提供稳定的 Android 投屏服务。
|
|
4
|
+
* 基于原生 ws (WebSocket) 协议实现 Android 投屏服务。
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
6
|
+
* ============================================================
|
|
7
|
+
* 协议约定(前端必须按此对齐)
|
|
8
|
+
* ============================================================
|
|
9
|
+
* 1) 文本帧(JSON):
|
|
10
|
+
* {
|
|
11
|
+
* "event": "<eventName>",
|
|
12
|
+
* "data": <payload?>
|
|
13
|
+
* }
|
|
14
|
+
*
|
|
15
|
+
* 2) 二进制帧(视频流,避免 base64/JSON 体积膨胀):
|
|
16
|
+
* [1 byte header][8 bytes BE timestamp ms][N bytes H264]
|
|
17
|
+
* header bits:
|
|
18
|
+
* bit0 (0x01) = isKeyFrame
|
|
19
|
+
* bit1 (0x02) = isConfiguration (SPS/PPS)
|
|
20
|
+
*
|
|
21
|
+
* 客户端 → 服务端(文本帧 event 名):
|
|
22
|
+
* - get-devices
|
|
23
|
+
* - switch-device data: deviceId (string)
|
|
24
|
+
* - connect-device data: { deviceId?, maxSize?, videoBitRate? }
|
|
25
|
+
* - control-touch data: { action, x, y, normalized?, pointerId?, pressure? }
|
|
26
|
+
* - control-key data: { keycode, action?: 'down'|'up'|'press', repeat?, metaState? }
|
|
27
|
+
* - control-text data: { text } | string
|
|
28
|
+
* - control-back data: -
|
|
29
|
+
* - control-home data: -
|
|
30
|
+
* - control-app-switch data: -
|
|
31
|
+
* - control-set-clipboard data: { text, paste? }
|
|
32
|
+
* - control-scroll data: { x?, y?, scrollX?, scrollY?, normalized? }
|
|
33
|
+
* - control-back-or-screen-on data: -
|
|
34
|
+
* - control-rotate data: -
|
|
35
|
+
* - control-reset-video data: -
|
|
36
|
+
* - control-screen-power data: { mode: 'normal'|'off' }
|
|
37
|
+
* - ping data: - // 心跳,服务端会回 pong
|
|
38
|
+
*
|
|
39
|
+
* 服务端 → 客户端(文本帧 event 名):
|
|
40
|
+
* - devices-list data: { devices, currentDeviceId }
|
|
41
|
+
* - preview-status data: { phase, message }
|
|
42
|
+
* - video-metadata data: { codec, width, height }
|
|
43
|
+
* - control-ready data: -
|
|
44
|
+
* - error data: { message }
|
|
45
|
+
* - device-switched data: { deviceId }
|
|
46
|
+
* - global-device-switched data: { deviceId, timestamp }
|
|
47
|
+
* - pong data: -
|
|
48
|
+
* (视频流走二进制帧,不走 JSON)
|
|
18
49
|
*/
|
|
19
50
|
import type { ScrcpyConfig } from '../config/schema.js';
|
|
20
51
|
export interface ScrcpyConnectDeviceRequest {
|
|
@@ -28,9 +59,8 @@ export interface ScrcpyListedDevice {
|
|
|
28
59
|
status: string;
|
|
29
60
|
}
|
|
30
61
|
export declare class ScrcpyServer {
|
|
31
|
-
private app;
|
|
32
62
|
private httpServer;
|
|
33
|
-
private
|
|
63
|
+
private wss;
|
|
34
64
|
private config;
|
|
35
65
|
private adbClient;
|
|
36
66
|
private currentDeviceId;
|
|
@@ -38,14 +68,21 @@ export declare class ScrcpyServer {
|
|
|
38
68
|
private lastDeviceListJson;
|
|
39
69
|
private serverBinPath;
|
|
40
70
|
private started;
|
|
71
|
+
/** 所有活动 session(按 ws 索引),用于广播 */
|
|
72
|
+
private sessions;
|
|
41
73
|
constructor(config: ScrcpyConfig);
|
|
42
|
-
private
|
|
74
|
+
private handleHttpRequest;
|
|
43
75
|
private getAdbClient;
|
|
44
76
|
private getDevicesList;
|
|
45
77
|
private getAdb;
|
|
46
78
|
private startScrcpy;
|
|
79
|
+
private broadcastJson;
|
|
47
80
|
private broadcastDevicesList;
|
|
48
|
-
private
|
|
81
|
+
private setupWebSocketHandlers;
|
|
82
|
+
private sendDevicesListTo;
|
|
83
|
+
/** 释放 session 持有的 scrcpy 资源(reader + client),用于断开/切换 */
|
|
84
|
+
private releaseSession;
|
|
85
|
+
private attachSocketHandlers;
|
|
49
86
|
private startDeviceMonitoring;
|
|
50
87
|
start(): Promise<void>;
|
|
51
88
|
close(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/scrcpy/server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/scrcpy/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAaH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAWxD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAyED,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,kBAAkB,CAA+B;IACzD,OAAO,CAAC,kBAAkB,CAAM;IAChC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAiD;gBAErD,MAAM,EAAE,YAAY;YAmBlB,iBAAiB;YA6CjB,YAAY;YA2BZ,cAAc;YAuBd,MAAM;YAwCN,WAAW;IAwEzB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,sBAAsB;YAwBhB,iBAAiB;IAa/B,wDAAwD;YAC1C,cAAc;IAqB5B,OAAO,CAAC,oBAAoB;IA6d5B,OAAO,CAAC,qBAAqB;IAYvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA6B7B"}
|
package/dist/scrcpy/server.js
CHANGED
|
@@ -1,20 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Scrcpy preview service for AIServer
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* 通过 socket.io 提供稳定的 Android 投屏服务。
|
|
4
|
+
* 基于原生 ws (WebSocket) 协议实现 Android 投屏服务。
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
6
|
+
* ============================================================
|
|
7
|
+
* 协议约定(前端必须按此对齐)
|
|
8
|
+
* ============================================================
|
|
9
|
+
* 1) 文本帧(JSON):
|
|
10
|
+
* {
|
|
11
|
+
* "event": "<eventName>",
|
|
12
|
+
* "data": <payload?>
|
|
13
|
+
* }
|
|
14
|
+
*
|
|
15
|
+
* 2) 二进制帧(视频流,避免 base64/JSON 体积膨胀):
|
|
16
|
+
* [1 byte header][8 bytes BE timestamp ms][N bytes H264]
|
|
17
|
+
* header bits:
|
|
18
|
+
* bit0 (0x01) = isKeyFrame
|
|
19
|
+
* bit1 (0x02) = isConfiguration (SPS/PPS)
|
|
20
|
+
*
|
|
21
|
+
* 客户端 → 服务端(文本帧 event 名):
|
|
22
|
+
* - get-devices
|
|
23
|
+
* - switch-device data: deviceId (string)
|
|
24
|
+
* - connect-device data: { deviceId?, maxSize?, videoBitRate? }
|
|
25
|
+
* - control-touch data: { action, x, y, normalized?, pointerId?, pressure? }
|
|
26
|
+
* - control-key data: { keycode, action?: 'down'|'up'|'press', repeat?, metaState? }
|
|
27
|
+
* - control-text data: { text } | string
|
|
28
|
+
* - control-back data: -
|
|
29
|
+
* - control-home data: -
|
|
30
|
+
* - control-app-switch data: -
|
|
31
|
+
* - control-set-clipboard data: { text, paste? }
|
|
32
|
+
* - control-scroll data: { x?, y?, scrollX?, scrollY?, normalized? }
|
|
33
|
+
* - control-back-or-screen-on data: -
|
|
34
|
+
* - control-rotate data: -
|
|
35
|
+
* - control-reset-video data: -
|
|
36
|
+
* - control-screen-power data: { mode: 'normal'|'off' }
|
|
37
|
+
* - ping data: - // 心跳,服务端会回 pong
|
|
38
|
+
*
|
|
39
|
+
* 服务端 → 客户端(文本帧 event 名):
|
|
40
|
+
* - devices-list data: { devices, currentDeviceId }
|
|
41
|
+
* - preview-status data: { phase, message }
|
|
42
|
+
* - video-metadata data: { codec, width, height }
|
|
43
|
+
* - control-ready data: -
|
|
44
|
+
* - error data: { message }
|
|
45
|
+
* - device-switched data: { deviceId }
|
|
46
|
+
* - global-device-switched data: { deviceId, timestamp }
|
|
47
|
+
* - pong data: -
|
|
48
|
+
* (视频流走二进制帧,不走 JSON)
|
|
18
49
|
*/
|
|
19
50
|
import { exec } from 'node:child_process';
|
|
20
51
|
import { createReadStream, existsSync } from 'node:fs';
|
|
@@ -22,34 +53,14 @@ import { createServer } from 'node:http';
|
|
|
22
53
|
import path from 'node:path';
|
|
23
54
|
import { promisify } from 'node:util';
|
|
24
55
|
import { createRequire } from 'node:module';
|
|
25
|
-
import
|
|
26
|
-
import
|
|
27
|
-
import { Server as SocketIoServer } from 'socket.io';
|
|
56
|
+
import { randomUUID } from 'node:crypto';
|
|
57
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
28
58
|
import { createLogger } from '../core/logger.js';
|
|
29
59
|
import { buildScrcpyPreviewStatusEvent, } from './preview-status.js';
|
|
30
60
|
import { withTimeout } from './timeout.js';
|
|
31
61
|
const logger = createLogger('ScrcpyServer');
|
|
32
62
|
const promiseExec = promisify(exec);
|
|
33
63
|
const requireCjs = createRequire(import.meta.url);
|
|
34
|
-
const LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1', '[::1]']);
|
|
35
|
-
function isPrivateIP(hostname) {
|
|
36
|
-
return (LOOPBACK_HOSTS.has(hostname) ||
|
|
37
|
-
/^10\./.test(hostname) ||
|
|
38
|
-
/^172\.(1[6-9]|2\d|3[01])\./.test(hostname) ||
|
|
39
|
-
/^192\.168\./.test(hostname) ||
|
|
40
|
-
/^100\.(6[4-9]|[7-9]\d|1[0-2]\d)\./.test(hostname));
|
|
41
|
-
}
|
|
42
|
-
function isAllowedOrigin(origin) {
|
|
43
|
-
if (!origin)
|
|
44
|
-
return true;
|
|
45
|
-
try {
|
|
46
|
-
const url = new URL(origin);
|
|
47
|
-
return isPrivateIP(url.hostname);
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
64
|
function resolveRequestedDeviceId(options, currentDeviceId) {
|
|
54
65
|
const requestedDeviceId = typeof options?.deviceId === 'string' ? options.deviceId.trim() : '';
|
|
55
66
|
return requestedDeviceId || currentDeviceId || undefined;
|
|
@@ -63,7 +74,6 @@ function resolveServerBinPath(configured) {
|
|
|
63
74
|
return configured;
|
|
64
75
|
}
|
|
65
76
|
try {
|
|
66
|
-
// require.resolve 找到 package.json,从而得到包根
|
|
67
77
|
const pkgPath = requireCjs.resolve('@aiscene/android/package.json');
|
|
68
78
|
const candidate = path.resolve(path.dirname(pkgPath), 'bin/scrcpy-server');
|
|
69
79
|
if (existsSync(candidate))
|
|
@@ -72,14 +82,35 @@ function resolveServerBinPath(configured) {
|
|
|
72
82
|
catch {
|
|
73
83
|
// ignore
|
|
74
84
|
}
|
|
75
|
-
// 最后退路:相对 cwd 的默认 node_modules 路径
|
|
76
85
|
const fallback = path.resolve(process.cwd(), 'node_modules/@aiscene/android/bin/scrcpy-server');
|
|
77
86
|
return fallback;
|
|
78
87
|
}
|
|
88
|
+
/** 服务端 → 客户端的统一 JSON 发送 */
|
|
89
|
+
function wsSend(ws, event, data) {
|
|
90
|
+
if (ws.readyState !== WebSocket.OPEN)
|
|
91
|
+
return;
|
|
92
|
+
try {
|
|
93
|
+
ws.send(JSON.stringify(data === undefined ? { event } : { event, data }));
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
logger.warn(`wsSend(${event}) failed: ${e.message}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 视频帧 → 二进制:[header(1)][ts(8 BE)][payload(N)]
|
|
101
|
+
* header bits: 0x01=keyFrame, 0x02=configuration
|
|
102
|
+
*/
|
|
103
|
+
function buildVideoFrameBuffer(payload, isKeyFrame, isConfiguration, timestampMs) {
|
|
104
|
+
const header = (isKeyFrame ? 0x01 : 0) | (isConfiguration ? 0x02 : 0);
|
|
105
|
+
const buf = Buffer.alloc(1 + 8 + payload.byteLength);
|
|
106
|
+
buf.writeUInt8(header, 0);
|
|
107
|
+
buf.writeBigUInt64BE(BigInt(timestampMs), 1);
|
|
108
|
+
buf.set(payload, 9);
|
|
109
|
+
return buf;
|
|
110
|
+
}
|
|
79
111
|
export class ScrcpyServer {
|
|
80
|
-
app;
|
|
81
112
|
httpServer;
|
|
82
|
-
|
|
113
|
+
wss;
|
|
83
114
|
config;
|
|
84
115
|
adbClient = null;
|
|
85
116
|
currentDeviceId = null;
|
|
@@ -87,49 +118,54 @@ export class ScrcpyServer {
|
|
|
87
118
|
lastDeviceListJson = '';
|
|
88
119
|
serverBinPath;
|
|
89
120
|
started = false;
|
|
121
|
+
/** 所有活动 session(按 ws 索引),用于广播 */
|
|
122
|
+
sessions = new Map();
|
|
90
123
|
constructor(config) {
|
|
91
124
|
this.config = config;
|
|
92
125
|
this.serverBinPath = resolveServerBinPath(config.serverBinPath);
|
|
93
|
-
this.
|
|
94
|
-
|
|
95
|
-
this.io = new SocketIoServer(this.httpServer, {
|
|
96
|
-
cors: {
|
|
97
|
-
origin(origin, callback) {
|
|
98
|
-
callback(null, isAllowedOrigin(origin));
|
|
99
|
-
},
|
|
100
|
-
methods: ['GET', 'POST'],
|
|
101
|
-
credentials: true,
|
|
102
|
-
},
|
|
103
|
-
// 视频帧二进制大小较大,提升允许的载荷上限
|
|
104
|
-
maxHttpBufferSize: 1e8,
|
|
126
|
+
this.httpServer = createServer((req, res) => {
|
|
127
|
+
void this.handleHttpRequest(req, res);
|
|
105
128
|
});
|
|
106
|
-
this.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}));
|
|
112
|
-
this.setupApiRoutes();
|
|
113
|
-
this.setupSocketHandlers();
|
|
129
|
+
this.wss = new WebSocketServer({
|
|
130
|
+
server: this.httpServer,
|
|
131
|
+
maxPayload: 100 * 1024 * 1024,
|
|
132
|
+
});
|
|
133
|
+
this.setupWebSocketHandlers();
|
|
114
134
|
}
|
|
115
135
|
// ============================================================
|
|
116
|
-
// REST API
|
|
136
|
+
// REST API (minimal, 保留 health & devices 便于探活)
|
|
117
137
|
// ============================================================
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
138
|
+
async handleHttpRequest(req, res) {
|
|
139
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
140
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
141
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
142
|
+
if (req.method === 'OPTIONS') {
|
|
143
|
+
res.writeHead(204);
|
|
144
|
+
res.end();
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const url = req.url || '/';
|
|
148
|
+
if (url === '/api/health') {
|
|
149
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
150
|
+
res.end(JSON.stringify({ ok: true, currentDeviceId: this.currentDeviceId }));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (url === '/api/devices') {
|
|
123
154
|
try {
|
|
124
155
|
const devices = await this.getDevicesList();
|
|
125
|
-
res.
|
|
156
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
157
|
+
res.end(JSON.stringify({ devices, currentDeviceId: this.currentDeviceId }));
|
|
126
158
|
}
|
|
127
159
|
catch (error) {
|
|
128
|
-
res.
|
|
160
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
161
|
+
res.end(JSON.stringify({
|
|
129
162
|
error: error.message || 'Failed to get devices list',
|
|
130
|
-
});
|
|
163
|
+
}));
|
|
131
164
|
}
|
|
132
|
-
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
168
|
+
res.end(JSON.stringify({ error: 'Not Found' }));
|
|
133
169
|
}
|
|
134
170
|
// ============================================================
|
|
135
171
|
// ADB helpers
|
|
@@ -193,19 +229,16 @@ export class ScrcpyServer {
|
|
|
193
229
|
}
|
|
194
230
|
onProgress?.('pushing-server');
|
|
195
231
|
await withTimeout(AdbScrcpyClient.pushServer(adb, ReadableStream.from(createReadStream(this.serverBinPath))), this.config.pushTimeoutMs, `Timed out pushing scrcpy server to device after ${Math.round(this.config.pushTimeoutMs / 1000)}s`);
|
|
232
|
+
// 强制 H264:前端 jmuxer 仅支持 H264,避免设备默认推 H265 时画面全黑。
|
|
233
|
+
// maxFps 降到 30:高码率 + 60fps 在部分低端机上会让首帧迟迟不来。
|
|
196
234
|
const scrcpyOptions = new AdbScrcpyOptions3_3_3({
|
|
197
235
|
audio: false,
|
|
198
236
|
control: true,
|
|
199
237
|
maxSize: options.maxSize ?? this.config.maxSize,
|
|
200
|
-
// 让 web decoder 能区分 configuration 帧
|
|
201
238
|
sendFrameMeta: true,
|
|
202
239
|
videoBitRate: options.videoBitRate ?? this.config.videoBitRate,
|
|
203
|
-
|
|
204
|
-
maxFps:
|
|
205
|
-
// 让设备更频繁地发关键帧,掉帧/花屏可更快恢复(单位:秒)
|
|
206
|
-
// 注意:scrcpy 3.x 接受字符串 "1" 也可以是 number;保险用字符串
|
|
207
|
-
// 由 scrcpy server 用 ffmpeg/ MediaCodec 解释
|
|
208
|
-
// 如果你的 scrcpy 版本不支持此选项,会被忽略,无副作用
|
|
240
|
+
videoCodec: 'h264',
|
|
241
|
+
maxFps: 30,
|
|
209
242
|
});
|
|
210
243
|
onProgress?.('starting-service');
|
|
211
244
|
const startPromise = AdbScrcpyClient.start(adb, DefaultServerPath, scrcpyOptions);
|
|
@@ -221,8 +254,13 @@ export class ScrcpyServer {
|
|
|
221
254
|
});
|
|
222
255
|
}
|
|
223
256
|
// ============================================================
|
|
224
|
-
//
|
|
257
|
+
// Broadcasting
|
|
225
258
|
// ============================================================
|
|
259
|
+
broadcastJson(event, data) {
|
|
260
|
+
for (const sess of this.sessions.values()) {
|
|
261
|
+
wsSend(sess.ws, event, data);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
226
264
|
broadcastDevicesList(devices) {
|
|
227
265
|
const currentJson = JSON.stringify(devices);
|
|
228
266
|
if (this.lastDeviceListJson === currentJson)
|
|
@@ -239,96 +277,207 @@ export class ScrcpyServer {
|
|
|
239
277
|
logger.info(`Auto-selected online device: ${this.currentDeviceId}`);
|
|
240
278
|
}
|
|
241
279
|
}
|
|
242
|
-
this.
|
|
280
|
+
this.broadcastJson('devices-list', {
|
|
243
281
|
devices,
|
|
244
282
|
currentDeviceId: this.currentDeviceId,
|
|
245
283
|
});
|
|
246
284
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
285
|
+
// ============================================================
|
|
286
|
+
// WebSocket handlers
|
|
287
|
+
// ============================================================
|
|
288
|
+
setupWebSocketHandlers() {
|
|
289
|
+
this.wss.on('connection', (ws, req) => {
|
|
290
|
+
const sessionId = randomUUID();
|
|
291
|
+
logger.info(`Client connected: id=${sessionId}, address=${req.socket.remoteAddress}`);
|
|
250
292
|
const state = {
|
|
293
|
+
id: sessionId,
|
|
294
|
+
ws,
|
|
251
295
|
scrcpyClient: null,
|
|
252
296
|
adb: null,
|
|
253
297
|
videoWidth: 0,
|
|
254
298
|
videoHeight: 0,
|
|
299
|
+
streamReader: null,
|
|
255
300
|
};
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
};
|
|
272
|
-
|
|
273
|
-
|
|
301
|
+
this.sessions.set(ws, state);
|
|
302
|
+
this.attachSocketHandlers(state);
|
|
303
|
+
void this.sendDevicesListTo(state);
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
async sendDevicesListTo(state) {
|
|
307
|
+
try {
|
|
308
|
+
const devices = await this.getDevicesList();
|
|
309
|
+
wsSend(state.ws, 'devices-list', {
|
|
310
|
+
devices,
|
|
311
|
+
currentDeviceId: this.currentDeviceId,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
logger.warn(`sendDevicesList failed: ${error.message}`);
|
|
316
|
+
wsSend(state.ws, 'error', { message: 'failed to get devices list' });
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/** 释放 session 持有的 scrcpy 资源(reader + client),用于断开/切换 */
|
|
320
|
+
async releaseSession(state) {
|
|
321
|
+
if (state.streamReader) {
|
|
322
|
+
try {
|
|
323
|
+
await state.streamReader.cancel();
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// ignore
|
|
327
|
+
}
|
|
328
|
+
state.streamReader = null;
|
|
329
|
+
}
|
|
330
|
+
if (state.scrcpyClient) {
|
|
331
|
+
try {
|
|
332
|
+
await state.scrcpyClient.close();
|
|
333
|
+
}
|
|
334
|
+
catch (e) {
|
|
335
|
+
logger.warn(`close scrcpy client failed: ${e.message}`);
|
|
336
|
+
}
|
|
337
|
+
state.scrcpyClient = null;
|
|
338
|
+
}
|
|
339
|
+
state.videoWidth = 0;
|
|
340
|
+
state.videoHeight = 0;
|
|
341
|
+
}
|
|
342
|
+
attachSocketHandlers(state) {
|
|
343
|
+
const { ws } = state;
|
|
344
|
+
const emitStatus = (phase) => {
|
|
345
|
+
wsSend(ws, 'preview-status', buildScrcpyPreviewStatusEvent(phase));
|
|
346
|
+
};
|
|
347
|
+
const ensureController = () => {
|
|
348
|
+
const controller = state.scrcpyClient?.controller;
|
|
349
|
+
if (!controller) {
|
|
350
|
+
wsSend(ws, 'error', {
|
|
351
|
+
message: 'Scrcpy controller not ready, connect-device first',
|
|
352
|
+
});
|
|
353
|
+
return null;
|
|
354
|
+
}
|
|
355
|
+
return controller;
|
|
356
|
+
};
|
|
357
|
+
const ACTION_MAP = {
|
|
358
|
+
down: 0,
|
|
359
|
+
up: 1,
|
|
360
|
+
move: 2,
|
|
361
|
+
cancel: 3,
|
|
362
|
+
};
|
|
363
|
+
const FINGER_POINTER_ID = BigInt(-2);
|
|
364
|
+
const pressKey = async (keyCode) => {
|
|
365
|
+
const controller = ensureController();
|
|
366
|
+
if (!controller)
|
|
367
|
+
return;
|
|
368
|
+
await controller.injectKeyCode({
|
|
369
|
+
action: 0,
|
|
370
|
+
keyCode,
|
|
371
|
+
repeat: 0,
|
|
372
|
+
metaState: 0,
|
|
373
|
+
});
|
|
374
|
+
await controller.injectKeyCode({
|
|
375
|
+
action: 1,
|
|
376
|
+
keyCode,
|
|
377
|
+
repeat: 0,
|
|
378
|
+
metaState: 0,
|
|
274
379
|
});
|
|
275
|
-
|
|
380
|
+
};
|
|
381
|
+
const handlers = {
|
|
382
|
+
ping: () => {
|
|
383
|
+
wsSend(ws, 'pong');
|
|
384
|
+
},
|
|
385
|
+
'get-devices': () => this.sendDevicesListTo(state),
|
|
386
|
+
'switch-device': async (deviceId) => {
|
|
276
387
|
try {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
}
|
|
281
|
-
this.
|
|
282
|
-
|
|
283
|
-
this.io.emit('global-device-switched', {
|
|
284
|
-
deviceId,
|
|
388
|
+
const id = typeof deviceId === 'string' ? deviceId : String(deviceId ?? '');
|
|
389
|
+
await this.releaseSession(state);
|
|
390
|
+
this.currentDeviceId = id;
|
|
391
|
+
wsSend(ws, 'device-switched', { deviceId: id });
|
|
392
|
+
this.broadcastJson('global-device-switched', {
|
|
393
|
+
deviceId: id,
|
|
285
394
|
timestamp: Date.now(),
|
|
286
395
|
});
|
|
287
396
|
}
|
|
288
397
|
catch (error) {
|
|
289
|
-
|
|
398
|
+
wsSend(ws, 'error', {
|
|
290
399
|
message: `Failed to switch device: ${error?.message || 'Unknown error'}`,
|
|
291
400
|
});
|
|
292
401
|
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
const { ScrcpyVideoCodecId } = await import('@yume-chan/scrcpy');
|
|
402
|
+
},
|
|
403
|
+
'connect-device': async (options = {}) => {
|
|
296
404
|
try {
|
|
297
405
|
emitStatus('connecting-device');
|
|
298
|
-
|
|
406
|
+
// 重复 connect-device 时,先释放旧资源避免 scrcpy 残留
|
|
407
|
+
if (state.scrcpyClient) {
|
|
408
|
+
await this.releaseSession(state);
|
|
409
|
+
}
|
|
410
|
+
const requestedDeviceId = resolveRequestedDeviceId(options || {}, this.currentDeviceId);
|
|
299
411
|
if (requestedDeviceId) {
|
|
300
412
|
this.currentDeviceId = requestedDeviceId;
|
|
301
413
|
}
|
|
302
414
|
state.adb = await this.getAdb(requestedDeviceId);
|
|
303
415
|
if (!state.adb) {
|
|
304
|
-
|
|
416
|
+
wsSend(ws, 'error', { message: 'No device found' });
|
|
305
417
|
return;
|
|
306
418
|
}
|
|
307
|
-
state.scrcpyClient = await this.startScrcpy(state.adb, options, emitStatus);
|
|
308
|
-
logger.info(`Scrcpy started for device=${this.currentDeviceId},
|
|
419
|
+
state.scrcpyClient = await this.startScrcpy(state.adb, options || {}, emitStatus);
|
|
420
|
+
logger.info(`Scrcpy started for device=${this.currentDeviceId},client=${state.id}`);
|
|
309
421
|
const videoStreamRaw = state.scrcpyClient?.videoStream;
|
|
310
422
|
if (!videoStreamRaw) {
|
|
311
|
-
|
|
423
|
+
wsSend(ws, 'error', {
|
|
312
424
|
message: 'Video stream not available in scrcpy client',
|
|
313
425
|
});
|
|
426
|
+
await this.releaseSession(state);
|
|
314
427
|
return;
|
|
315
428
|
}
|
|
316
429
|
emitStatus('waiting-for-video');
|
|
317
430
|
const videoStream = typeof videoStreamRaw?.then === 'function'
|
|
318
431
|
? await withTimeout(videoStreamRaw, this.config.videoStreamTimeoutMs, `Timed out waiting for scrcpy video stream metadata after ${Math.round(this.config.videoStreamTimeoutMs / 1000)}s`)
|
|
319
432
|
: videoStreamRaw;
|
|
320
|
-
const metadata = videoStream.metadata
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
metadata.width
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
433
|
+
const metadata = videoStream.metadata;
|
|
434
|
+
// 严格校验:缺失元数据直接报错,避免兜底 H264/1080x1920 与真实流不匹配
|
|
435
|
+
if (!metadata ||
|
|
436
|
+
!metadata.codec ||
|
|
437
|
+
!metadata.width ||
|
|
438
|
+
!metadata.height) {
|
|
439
|
+
const detail = JSON.stringify(metadata || {});
|
|
440
|
+
logger.error(`incomplete video metadata: ${detail}`);
|
|
441
|
+
wsSend(ws, 'error', {
|
|
442
|
+
message: `Incomplete video metadata from scrcpy: ${detail}`,
|
|
443
|
+
});
|
|
444
|
+
await this.releaseSession(state);
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
// 黑屏的两个常见根因,连上后主动处理一次:
|
|
448
|
+
// 1) 物理屏幕熄屏时 scrcpy 推黑画面,先唤醒
|
|
449
|
+
// 2) jmuxer/MSE 必须从 IDR 开始喂数据,主动 resetVideo 拉一帧
|
|
450
|
+
const controller = state.scrcpyClient?.controller;
|
|
451
|
+
if (controller) {
|
|
452
|
+
try {
|
|
453
|
+
await controller.setScreenPowerMode?.(2);
|
|
454
|
+
}
|
|
455
|
+
catch (e) {
|
|
456
|
+
logger.warn(`setScreenPowerMode failed: ${e.message}`);
|
|
457
|
+
}
|
|
458
|
+
try {
|
|
459
|
+
await controller.backOrScreenOn?.(0);
|
|
460
|
+
}
|
|
461
|
+
catch (e) {
|
|
462
|
+
logger.warn(`backOrScreenOn failed: ${e.message}`);
|
|
463
|
+
}
|
|
464
|
+
try {
|
|
465
|
+
await controller.resetVideo?.();
|
|
466
|
+
}
|
|
467
|
+
catch (e) {
|
|
468
|
+
logger.warn(`resetVideo failed: ${e.message}`);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
wsSend(ws, 'video-metadata', {
|
|
472
|
+
codec: metadata.codec,
|
|
473
|
+
width: metadata.width,
|
|
474
|
+
height: metadata.height,
|
|
475
|
+
});
|
|
328
476
|
state.videoWidth = metadata.width;
|
|
329
477
|
state.videoHeight = metadata.height;
|
|
330
478
|
const { stream } = videoStream;
|
|
331
479
|
const reader = stream.getReader();
|
|
480
|
+
state.streamReader = reader;
|
|
332
481
|
const processStream = async () => {
|
|
333
482
|
try {
|
|
334
483
|
while (true) {
|
|
@@ -336,107 +485,61 @@ export class ScrcpyServer {
|
|
|
336
485
|
if (done)
|
|
337
486
|
break;
|
|
338
487
|
const frameType = value.type || 'data';
|
|
339
|
-
// scrcpy 包属性是 `keyframe`(小写 f),兼容两种命名后强制布尔
|
|
340
488
|
const isKey = !!(value.keyframe ?? value.keyFrame);
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
timestamp: Date.now(),
|
|
346
|
-
keyFrame: isKey,
|
|
347
|
-
});
|
|
489
|
+
const isConfig = frameType === 'configuration';
|
|
490
|
+
if (ws.readyState !== WebSocket.OPEN)
|
|
491
|
+
break;
|
|
492
|
+
ws.send(buildVideoFrameBuffer(value.data, isKey, isConfig, Date.now()), { binary: true });
|
|
348
493
|
}
|
|
349
494
|
}
|
|
350
495
|
catch (error) {
|
|
351
|
-
|
|
352
|
-
if (
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
496
|
+
const msg = error.message || '';
|
|
497
|
+
if (!/cancel|abort/i.test(msg)) {
|
|
498
|
+
logger.error(`Video stream error: ${msg}`);
|
|
499
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
500
|
+
wsSend(ws, 'error', {
|
|
501
|
+
message: 'video stream processing error',
|
|
502
|
+
});
|
|
503
|
+
}
|
|
356
504
|
}
|
|
357
505
|
return;
|
|
358
506
|
}
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
507
|
+
finally {
|
|
508
|
+
if (state.streamReader === reader) {
|
|
509
|
+
state.streamReader = null;
|
|
510
|
+
}
|
|
362
511
|
}
|
|
363
|
-
if (
|
|
364
|
-
|
|
365
|
-
state.scrcpyClient = null;
|
|
512
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
513
|
+
wsSend(ws, 'error', { message: 'video stream ended' });
|
|
366
514
|
}
|
|
515
|
+
await this.releaseSession(state);
|
|
367
516
|
};
|
|
368
517
|
void processStream();
|
|
369
518
|
if (state.scrcpyClient?.controller) {
|
|
370
|
-
|
|
519
|
+
wsSend(ws, 'control-ready');
|
|
371
520
|
}
|
|
372
521
|
}
|
|
373
522
|
catch (error) {
|
|
374
523
|
const message = error?.message || 'Unknown error';
|
|
375
524
|
logger.error(`connect-device failed: ${message}`);
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
state.scrcpyClient = null;
|
|
379
|
-
}
|
|
380
|
-
socket.emit('error', {
|
|
525
|
+
await this.releaseSession(state);
|
|
526
|
+
wsSend(ws, 'error', {
|
|
381
527
|
message: `Failed to connect device: ${message}`,
|
|
382
528
|
});
|
|
383
529
|
}
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
// Control channel: 触摸 / 按键 / 文本 / 物理按键快捷
|
|
387
|
-
// 客户端约定:
|
|
388
|
-
// socket.emit('control-touch', {
|
|
389
|
-
// action: 'down'|'move'|'up'|'cancel',
|
|
390
|
-
// x, y, // 0..1 归一化 或 已映射到设备坐标
|
|
391
|
-
// normalized?: boolean, // true 表示 x,y 是 0..1,需要乘 videoWidth/Height
|
|
392
|
-
// pointerId?: number,
|
|
393
|
-
// pressure?: number,
|
|
394
|
-
// })
|
|
395
|
-
// socket.emit('control-key', { keycode: number, action?: 'down'|'up'|'press', repeat?, metaState? })
|
|
396
|
-
// socket.emit('control-text', { text: string })
|
|
397
|
-
// socket.emit('control-back') // 等价于 back/screen on
|
|
398
|
-
// socket.emit('control-home') // Home
|
|
399
|
-
// socket.emit('control-app-switch') // 最近任务
|
|
400
|
-
// socket.emit('control-set-clipboard', { text, paste?: boolean })
|
|
401
|
-
// ============================================================
|
|
402
|
-
const ensureController = () => {
|
|
403
|
-
const controller = state.scrcpyClient?.controller;
|
|
404
|
-
if (!controller) {
|
|
405
|
-
socket.emit('error', {
|
|
406
|
-
message: 'Scrcpy controller not ready, connect-device first',
|
|
407
|
-
});
|
|
408
|
-
return null;
|
|
409
|
-
}
|
|
410
|
-
return controller;
|
|
411
|
-
};
|
|
412
|
-
const ACTION_MAP = {
|
|
413
|
-
down: 0,
|
|
414
|
-
up: 1,
|
|
415
|
-
move: 2,
|
|
416
|
-
cancel: 3,
|
|
417
|
-
};
|
|
418
|
-
// scrcpy 协议常量(参考 https://tangoadb.dev/scrcpy/control/touch/)
|
|
419
|
-
// ScrcpyPointerId.Finger = -2n
|
|
420
|
-
const FINGER_POINTER_ID = BigInt(-2);
|
|
421
|
-
const BUTTON_PRIMARY = 1;
|
|
422
|
-
socket.on('control-touch', async (raw = {}) => {
|
|
530
|
+
},
|
|
531
|
+
'control-touch': async (raw = {}) => {
|
|
423
532
|
try {
|
|
424
533
|
const controller = ensureController();
|
|
425
|
-
if (!controller)
|
|
426
|
-
logger.warn('control-touch: controller not ready');
|
|
534
|
+
if (!controller)
|
|
427
535
|
return;
|
|
428
|
-
}
|
|
429
|
-
// ⚠️ scrcpy 协议字段是 videoWidth / videoHeight(旧 d.ts 误写为 screenWidth),
|
|
430
|
-
// 必须与最近一次 video-metadata 的 width/height 完全一致,否则 server 会忽略
|
|
431
536
|
const videoWidth = state.videoWidth || 1080;
|
|
432
537
|
const videoHeight = state.videoHeight || 1920;
|
|
433
538
|
const normalized = raw.normalized === true;
|
|
434
539
|
let x = Number(raw.x);
|
|
435
540
|
let y = Number(raw.y);
|
|
436
|
-
if (!Number.isFinite(x) || !Number.isFinite(y))
|
|
437
|
-
logger.warn(`control-touch: invalid coords ${JSON.stringify(raw)}`);
|
|
541
|
+
if (!Number.isFinite(x) || !Number.isFinite(y))
|
|
438
542
|
return;
|
|
439
|
-
}
|
|
440
543
|
if (normalized) {
|
|
441
544
|
x = Math.max(0, Math.min(1, x)) * videoWidth;
|
|
442
545
|
y = Math.max(0, Math.min(1, y)) * videoHeight;
|
|
@@ -446,36 +549,27 @@ export class ScrcpyServer {
|
|
|
446
549
|
const actionStr = String(raw.action || 'down').toLowerCase();
|
|
447
550
|
const action = ACTION_MAP[actionStr] ?? 0;
|
|
448
551
|
const isUp = actionStr === 'up' || actionStr === 'cancel';
|
|
449
|
-
// pressure: down/move=1.0, up=0
|
|
450
552
|
const pressure = isUp ? 0 : 1;
|
|
451
|
-
// 手指模式 (Finger=-2n);如果前端有 pointerId 就直接用 BigInt
|
|
452
553
|
const pointerId = raw.pointerId !== undefined && raw.pointerId !== null
|
|
453
554
|
? BigInt(raw.pointerId)
|
|
454
555
|
: FINGER_POINTER_ID;
|
|
455
|
-
// 触摸(手指)模式下,scrcpy server 在 server 端的解码不依赖 button 字段
|
|
456
|
-
// —— 上一次设置 actionButton=Primary 反而让某些 ROM 把它当成"按下了实体鼠标键再松开",
|
|
457
|
-
// 结果手机上能看到 inject 但 click 不识别。回退到 0/0 最稳。
|
|
458
|
-
const actionButton = 0;
|
|
459
|
-
const buttons = 0;
|
|
460
|
-
logger.info(`inject touch ${actionStr} (${x},${y}) p=${pressure} pid=${pointerId} videoSize=${videoWidth}x${videoHeight}`);
|
|
461
556
|
await controller.injectTouch({
|
|
462
557
|
action,
|
|
463
558
|
pointerId,
|
|
464
559
|
pointerX: x,
|
|
465
560
|
pointerY: y,
|
|
466
|
-
// 重要:字段名是 videoWidth/videoHeight
|
|
467
561
|
videoWidth,
|
|
468
562
|
videoHeight,
|
|
469
563
|
pressure,
|
|
470
|
-
actionButton,
|
|
471
|
-
buttons,
|
|
564
|
+
actionButton: 0,
|
|
565
|
+
buttons: 0,
|
|
472
566
|
});
|
|
473
567
|
}
|
|
474
568
|
catch (error) {
|
|
475
569
|
logger.warn(`control-touch failed: ${error.message}`);
|
|
476
570
|
}
|
|
477
|
-
}
|
|
478
|
-
|
|
571
|
+
},
|
|
572
|
+
'control-key': async (raw = {}) => {
|
|
479
573
|
try {
|
|
480
574
|
const controller = ensureController();
|
|
481
575
|
if (!controller)
|
|
@@ -486,19 +580,16 @@ export class ScrcpyServer {
|
|
|
486
580
|
const repeat = Number(raw.repeat ?? 0);
|
|
487
581
|
const metaState = Number(raw.metaState ?? 0);
|
|
488
582
|
const action = String(raw.action || 'press').toLowerCase();
|
|
489
|
-
logger.info(`inject key ${action} keycode=${keycode}`);
|
|
490
583
|
const inject = (act) => controller.injectKeyCode({
|
|
491
584
|
action: act,
|
|
492
585
|
keyCode: keycode,
|
|
493
586
|
repeat,
|
|
494
587
|
metaState,
|
|
495
588
|
});
|
|
496
|
-
if (action === 'down')
|
|
589
|
+
if (action === 'down')
|
|
497
590
|
await inject(0);
|
|
498
|
-
|
|
499
|
-
else if (action === 'up') {
|
|
591
|
+
else if (action === 'up')
|
|
500
592
|
await inject(1);
|
|
501
|
-
}
|
|
502
593
|
else {
|
|
503
594
|
await inject(0);
|
|
504
595
|
await inject(1);
|
|
@@ -507,8 +598,8 @@ export class ScrcpyServer {
|
|
|
507
598
|
catch (error) {
|
|
508
599
|
logger.warn(`control-key failed: ${error.message}`);
|
|
509
600
|
}
|
|
510
|
-
}
|
|
511
|
-
|
|
601
|
+
},
|
|
602
|
+
'control-text': async (raw = {}) => {
|
|
512
603
|
try {
|
|
513
604
|
const controller = ensureController();
|
|
514
605
|
if (!controller)
|
|
@@ -516,55 +607,37 @@ export class ScrcpyServer {
|
|
|
516
607
|
const text = typeof raw === 'string' ? raw : String(raw.text ?? '');
|
|
517
608
|
if (!text)
|
|
518
609
|
return;
|
|
519
|
-
logger.info(`inject text len=${text.length}`);
|
|
520
610
|
await controller.injectText(text);
|
|
521
611
|
}
|
|
522
612
|
catch (error) {
|
|
523
613
|
logger.warn(`control-text failed: ${error.message}`);
|
|
524
614
|
}
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
const controller = ensureController();
|
|
528
|
-
if (!controller)
|
|
529
|
-
return;
|
|
530
|
-
await controller.injectKeyCode({
|
|
531
|
-
action: 0,
|
|
532
|
-
keyCode,
|
|
533
|
-
repeat: 0,
|
|
534
|
-
metaState: 0,
|
|
535
|
-
});
|
|
536
|
-
await controller.injectKeyCode({
|
|
537
|
-
action: 1,
|
|
538
|
-
keyCode,
|
|
539
|
-
repeat: 0,
|
|
540
|
-
metaState: 0,
|
|
541
|
-
});
|
|
542
|
-
};
|
|
543
|
-
socket.on('control-back', async () => {
|
|
615
|
+
},
|
|
616
|
+
'control-back': async () => {
|
|
544
617
|
try {
|
|
545
|
-
await pressKey(4);
|
|
618
|
+
await pressKey(4);
|
|
546
619
|
}
|
|
547
|
-
catch (
|
|
548
|
-
logger.warn(`control-back failed: ${
|
|
620
|
+
catch (e) {
|
|
621
|
+
logger.warn(`control-back failed: ${e.message}`);
|
|
549
622
|
}
|
|
550
|
-
}
|
|
551
|
-
|
|
623
|
+
},
|
|
624
|
+
'control-home': async () => {
|
|
552
625
|
try {
|
|
553
|
-
await pressKey(3);
|
|
626
|
+
await pressKey(3);
|
|
554
627
|
}
|
|
555
|
-
catch (
|
|
556
|
-
logger.warn(`control-home failed: ${
|
|
628
|
+
catch (e) {
|
|
629
|
+
logger.warn(`control-home failed: ${e.message}`);
|
|
557
630
|
}
|
|
558
|
-
}
|
|
559
|
-
|
|
631
|
+
},
|
|
632
|
+
'control-app-switch': async () => {
|
|
560
633
|
try {
|
|
561
|
-
await pressKey(187);
|
|
634
|
+
await pressKey(187);
|
|
562
635
|
}
|
|
563
|
-
catch (
|
|
564
|
-
logger.warn(`control-app-switch failed: ${
|
|
636
|
+
catch (e) {
|
|
637
|
+
logger.warn(`control-app-switch failed: ${e.message}`);
|
|
565
638
|
}
|
|
566
|
-
}
|
|
567
|
-
|
|
639
|
+
},
|
|
640
|
+
'control-set-clipboard': async (raw = {}) => {
|
|
568
641
|
try {
|
|
569
642
|
const controller = ensureController();
|
|
570
643
|
if (!controller)
|
|
@@ -581,11 +654,8 @@ export class ScrcpyServer {
|
|
|
581
654
|
catch (error) {
|
|
582
655
|
logger.warn(`control-set-clipboard failed: ${error.message}`);
|
|
583
656
|
}
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
// raw: { x, y, scrollX?, scrollY?, normalized?: bool }
|
|
587
|
-
// 默认 scrollY = -1(向下滚动一格),向上滚动用 +1
|
|
588
|
-
socket.on('control-scroll', async (raw = {}) => {
|
|
657
|
+
},
|
|
658
|
+
'control-scroll': async (raw = {}) => {
|
|
589
659
|
try {
|
|
590
660
|
const controller = ensureController();
|
|
591
661
|
if (!controller)
|
|
@@ -615,22 +685,19 @@ export class ScrcpyServer {
|
|
|
615
685
|
catch (error) {
|
|
616
686
|
logger.warn(`control-scroll failed: ${error.message}`);
|
|
617
687
|
}
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
socket.on('control-back-or-screen-on', async () => {
|
|
688
|
+
},
|
|
689
|
+
'control-back-or-screen-on': async () => {
|
|
621
690
|
try {
|
|
622
691
|
const controller = ensureController();
|
|
623
692
|
if (!controller)
|
|
624
693
|
return;
|
|
625
|
-
// action: Down(0)=按下;通常一次发 Down 就够了
|
|
626
694
|
await controller.backOrScreenOn(0);
|
|
627
695
|
}
|
|
628
696
|
catch (error) {
|
|
629
697
|
logger.warn(`control-back-or-screen-on failed: ${error.message}`);
|
|
630
698
|
}
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
socket.on('control-rotate', async () => {
|
|
699
|
+
},
|
|
700
|
+
'control-rotate': async () => {
|
|
634
701
|
try {
|
|
635
702
|
const controller = ensureController();
|
|
636
703
|
if (!controller)
|
|
@@ -640,9 +707,8 @@ export class ScrcpyServer {
|
|
|
640
707
|
catch (error) {
|
|
641
708
|
logger.warn(`control-rotate failed: ${error.message}`);
|
|
642
709
|
}
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
socket.on('control-reset-video', async () => {
|
|
710
|
+
},
|
|
711
|
+
'control-reset-video': async () => {
|
|
646
712
|
try {
|
|
647
713
|
const controller = ensureController();
|
|
648
714
|
if (!controller)
|
|
@@ -652,10 +718,8 @@ export class ScrcpyServer {
|
|
|
652
718
|
catch (error) {
|
|
653
719
|
logger.warn(`control-reset-video failed: ${error.message}`);
|
|
654
720
|
}
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
// raw: { mode: 'normal' | 'off' } normal=2, off=0
|
|
658
|
-
socket.on('control-screen-power', async (raw = {}) => {
|
|
721
|
+
},
|
|
722
|
+
'control-screen-power': async (raw = {}) => {
|
|
659
723
|
try {
|
|
660
724
|
const controller = ensureController();
|
|
661
725
|
if (!controller)
|
|
@@ -666,21 +730,45 @@ export class ScrcpyServer {
|
|
|
666
730
|
catch (error) {
|
|
667
731
|
logger.warn(`control-screen-power failed: ${error.message}`);
|
|
668
732
|
}
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
733
|
+
},
|
|
734
|
+
};
|
|
735
|
+
ws.on('message', (raw, isBinary) => {
|
|
736
|
+
if (isBinary)
|
|
737
|
+
return;
|
|
738
|
+
let msg;
|
|
739
|
+
try {
|
|
740
|
+
msg = JSON.parse(raw.toString('utf8'));
|
|
741
|
+
}
|
|
742
|
+
catch (e) {
|
|
743
|
+
logger.warn(`Invalid JSON from client ${state.id}: ${e.message}`);
|
|
744
|
+
wsSend(ws, 'error', { message: 'invalid JSON message' });
|
|
745
|
+
return;
|
|
746
|
+
}
|
|
747
|
+
const event = msg && typeof msg.event === 'string' ? msg.event : '';
|
|
748
|
+
if (!event) {
|
|
749
|
+
wsSend(ws, 'error', { message: 'missing event field' });
|
|
750
|
+
return;
|
|
751
|
+
}
|
|
752
|
+
const handler = handlers[event];
|
|
753
|
+
if (!handler) {
|
|
754
|
+
logger.warn(`Unknown event from client ${state.id}: ${event}`);
|
|
755
|
+
wsSend(ws, 'error', { message: `unknown event: ${event}` });
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
758
|
+
try {
|
|
759
|
+
void handler(msg.data);
|
|
760
|
+
}
|
|
761
|
+
catch (e) {
|
|
762
|
+
logger.warn(`handler(${event}) threw: ${e.message}`);
|
|
763
|
+
}
|
|
764
|
+
});
|
|
765
|
+
ws.on('close', async (code, reason) => {
|
|
766
|
+
logger.info(`Client disconnected: id=${state.id}, code=${code}, reason=${reason?.toString() || ''}`);
|
|
767
|
+
this.sessions.delete(ws);
|
|
768
|
+
await this.releaseSession(state);
|
|
769
|
+
});
|
|
770
|
+
ws.on('error', (err) => {
|
|
771
|
+
logger.warn(`WebSocket error for ${state.id}: ${err.message}`);
|
|
684
772
|
});
|
|
685
773
|
}
|
|
686
774
|
// ============================================================
|
|
@@ -709,7 +797,7 @@ export class ScrcpyServer {
|
|
|
709
797
|
this.started = true;
|
|
710
798
|
await new Promise((resolve) => {
|
|
711
799
|
this.httpServer.listen(this.config.port, this.config.host, () => {
|
|
712
|
-
logger.info(`Scrcpy server running at
|
|
800
|
+
logger.info(`Scrcpy WebSocket server running at ws://${this.config.host}:${this.config.port}`);
|
|
713
801
|
logger.info(`Using scrcpy-server bin: ${this.serverBinPath}`);
|
|
714
802
|
this.startDeviceMonitoring();
|
|
715
803
|
resolve();
|
|
@@ -723,12 +811,22 @@ export class ScrcpyServer {
|
|
|
723
811
|
clearInterval(this.devicePollInterval);
|
|
724
812
|
this.devicePollInterval = null;
|
|
725
813
|
}
|
|
814
|
+
for (const sess of this.sessions.values()) {
|
|
815
|
+
await this.releaseSession(sess);
|
|
816
|
+
try {
|
|
817
|
+
sess.ws.close(1001, 'server shutting down');
|
|
818
|
+
}
|
|
819
|
+
catch {
|
|
820
|
+
// ignore
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
this.sessions.clear();
|
|
726
824
|
await new Promise((resolve) => {
|
|
727
825
|
if (!this.httpServer.listening) {
|
|
728
826
|
resolve();
|
|
729
827
|
return;
|
|
730
828
|
}
|
|
731
|
-
this.
|
|
829
|
+
this.wss.close(() => {
|
|
732
830
|
this.httpServer.close(() => resolve());
|
|
733
831
|
});
|
|
734
832
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/scrcpy/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/scrcpy/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiscene/aiserver",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.3",
|
|
4
4
|
"description": "AI automation server with device management, task scheduling, and debug capabilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"format": "prettier --write src/"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@aiscene/android": "^9.0.
|
|
22
|
+
"@aiscene/android": "^9.0.5",
|
|
23
23
|
"@aiscene/web": "^9.0.0",
|
|
24
24
|
"@midscene/ios": "^1.6.0",
|
|
25
25
|
"@playwright/test": "^1.59.1",
|