@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.
@@ -1,20 +1,51 @@
1
1
  /**
2
2
  * Scrcpy preview service for AIServer
3
3
  *
4
- * 仿照 midscene/packages/android-playground/src/scrcpy-server.ts 实现,
5
- * 通过 socket.io 提供稳定的 Android 投屏服务。
4
+ * 基于原生 ws (WebSocket) 协议实现 Android 投屏服务。
6
5
  *
7
- * 前端约定(与 nethp-docs-static 对齐):
8
- * - 连接后 emit 'connect-device' { deviceId?, maxSize? }
9
- * - 服务端推送:
10
- * 'devices-list' { devices, currentDeviceId }
11
- * 'preview-status' { phase, message }
12
- * 'video-metadata' { codec, width, height }
13
- * 'video-data' { data: Uint8Array, type: 'configuration'|'data', keyFrame, timestamp }
14
- * 'control-ready'
15
- * 'error' { message }
16
- * 'device-switched' { deviceId }
17
- * 'global-device-switched' { deviceId, timestamp }
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 io;
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 setupApiRoutes;
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 setupSocketHandlers;
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;;;;;;;;;;;;;;;;;GAiBG;AAcH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAiCxD,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;AA2CD,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,EAAE,CAAiB;IAC3B,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;gBAEZ,MAAM,EAAE,YAAY;IAiChC,OAAO,CAAC,cAAc;YAoBR,YAAY;YA2BZ,cAAc;YAuBd,MAAM;YAwCN,WAAW;IA2EzB,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,mBAAmB;IAuf3B,OAAO,CAAC,qBAAqB;IAYvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB7B"}
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"}
@@ -1,20 +1,51 @@
1
1
  /**
2
2
  * Scrcpy preview service for AIServer
3
3
  *
4
- * 仿照 midscene/packages/android-playground/src/scrcpy-server.ts 实现,
5
- * 通过 socket.io 提供稳定的 Android 投屏服务。
4
+ * 基于原生 ws (WebSocket) 协议实现 Android 投屏服务。
6
5
  *
7
- * 前端约定(与 nethp-docs-static 对齐):
8
- * - 连接后 emit 'connect-device' { deviceId?, maxSize? }
9
- * - 服务端推送:
10
- * 'devices-list' { devices, currentDeviceId }
11
- * 'preview-status' { phase, message }
12
- * 'video-metadata' { codec, width, height }
13
- * 'video-data' { data: Uint8Array, type: 'configuration'|'data', keyFrame, timestamp }
14
- * 'control-ready'
15
- * 'error' { message }
16
- * 'device-switched' { deviceId }
17
- * 'global-device-switched' { deviceId, timestamp }
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 cors from 'cors';
26
- import express from 'express';
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
- io;
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.app = express();
94
- this.httpServer = createServer(this.app);
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.app.use(cors({
107
- origin(origin, callback) {
108
- callback(null, isAllowedOrigin(origin));
109
- },
110
- credentials: true,
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
- setupApiRoutes() {
119
- this.app.get('/api/health', (_req, res) => {
120
- res.json({ ok: true, currentDeviceId: this.currentDeviceId });
121
- });
122
- this.app.get('/api/devices', async (_req, res) => {
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.json({ devices, currentDeviceId: this.currentDeviceId });
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.status(500).json({
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: 60,
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
- // Socket handlers
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.io.emit('devices-list', {
280
+ this.broadcastJson('devices-list', {
243
281
  devices,
244
282
  currentDeviceId: this.currentDeviceId,
245
283
  });
246
284
  }
247
- setupSocketHandlers() {
248
- this.io.on('connection', (socket) => {
249
- logger.info(`Client connected: id=${socket.id}, address=${socket.handshake.address}`);
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
- const emitStatus = (phase) => {
257
- socket.emit('preview-status', buildScrcpyPreviewStatusEvent(phase));
258
- };
259
- const sendDevicesList = async () => {
260
- try {
261
- const devices = await this.getDevicesList();
262
- socket.emit('devices-list', {
263
- devices,
264
- currentDeviceId: this.currentDeviceId,
265
- });
266
- }
267
- catch (error) {
268
- logger.warn(`sendDevicesList failed: ${error.message}`);
269
- socket.emit('error', { message: 'failed to get devices list' });
270
- }
271
- };
272
- socket.on('get-devices', () => {
273
- void sendDevicesList();
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
- socket.on('switch-device', async (deviceId) => {
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
- if (state.scrcpyClient) {
278
- await state.scrcpyClient.close().catch(() => { });
279
- state.scrcpyClient = null;
280
- }
281
- this.currentDeviceId = deviceId;
282
- socket.emit('device-switched', { deviceId });
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
- socket.emit('error', {
398
+ wsSend(ws, 'error', {
290
399
  message: `Failed to switch device: ${error?.message || 'Unknown error'}`,
291
400
  });
292
401
  }
293
- });
294
- socket.on('connect-device', async (options = {}) => {
295
- const { ScrcpyVideoCodecId } = await import('@yume-chan/scrcpy');
402
+ },
403
+ 'connect-device': async (options = {}) => {
296
404
  try {
297
405
  emitStatus('connecting-device');
298
- const requestedDeviceId = resolveRequestedDeviceId(options, this.currentDeviceId);
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
- socket.emit('error', { message: 'No device found' });
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}, client=${socket.id}`);
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
- socket.emit('error', {
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
- if (!metadata.codec)
322
- metadata.codec = ScrcpyVideoCodecId.H264;
323
- if (!metadata.width)
324
- metadata.width = 1080;
325
- if (!metadata.height)
326
- metadata.height = 1920;
327
- socket.emit('video-metadata', metadata);
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
- // 二进制 Uint8Array 直发,避免 Array.from 内存爆炸
342
- socket.emit('video-data', {
343
- data: value.data,
344
- type: frameType,
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
- logger.error(`Video stream error: ${error.message}`);
352
- if (socket.connected) {
353
- socket.emit('error', {
354
- message: 'video stream processing error',
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
- if (socket.connected) {
361
- socket.emit('error', { message: 'video stream ended' });
507
+ finally {
508
+ if (state.streamReader === reader) {
509
+ state.streamReader = null;
510
+ }
362
511
  }
363
- if (state.scrcpyClient) {
364
- await state.scrcpyClient.close().catch(() => { });
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
- socket.emit('control-ready');
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
- if (state.scrcpyClient) {
377
- await state.scrcpyClient.close().catch(() => { });
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
- socket.on('control-key', async (raw = {}) => {
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
- socket.on('control-text', async (raw = {}) => {
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
- const pressKey = async (keyCode) => {
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); // AndroidKeyCode.AndroidBack
618
+ await pressKey(4);
546
619
  }
547
- catch (error) {
548
- logger.warn(`control-back failed: ${error.message}`);
620
+ catch (e) {
621
+ logger.warn(`control-back failed: ${e.message}`);
549
622
  }
550
- });
551
- socket.on('control-home', async () => {
623
+ },
624
+ 'control-home': async () => {
552
625
  try {
553
- await pressKey(3); // AndroidKeyCode.AndroidHome
626
+ await pressKey(3);
554
627
  }
555
- catch (error) {
556
- logger.warn(`control-home failed: ${error.message}`);
628
+ catch (e) {
629
+ logger.warn(`control-home failed: ${e.message}`);
557
630
  }
558
- });
559
- socket.on('control-app-switch', async () => {
631
+ },
632
+ 'control-app-switch': async () => {
560
633
  try {
561
- await pressKey(187); // AndroidKeyCode.AndroidAppSwitch
634
+ await pressKey(187);
562
635
  }
563
- catch (error) {
564
- logger.warn(`control-app-switch failed: ${error.message}`);
636
+ catch (e) {
637
+ logger.warn(`control-app-switch failed: ${e.message}`);
565
638
  }
566
- });
567
- socket.on('control-set-clipboard', async (raw = {}) => {
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
- // ---- scroll: 鼠标滚轮(参考 https://tangoadb.dev/scrcpy/control/scroll/) ----
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
- // ---- back-or-screen-on:右键模拟,息屏时唤醒 ----
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
- // ---- rotate-device:旋转屏幕 ----
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
- // ---- reset-video:让 scrcpy 重新发送 SPS/PPS 与关键帧(解决花屏) ----
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
- // ---- screen-power:开/关屏幕背光(不锁屏) ----
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
- socket.on('disconnect', async (reason) => {
671
- logger.info(`Client disconnected: id=${socket.id}, reason=${reason}`);
672
- if (state.scrcpyClient) {
673
- try {
674
- await state.scrcpyClient.close();
675
- }
676
- catch (error) {
677
- logger.warn(`Failed to close scrcpy client on disconnect: ${error.message}`);
678
- }
679
- state.scrcpyClient = null;
680
- }
681
- });
682
- // 立即异步推送设备列表,避免冷启动卡住
683
- void sendDevicesList();
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 http://${this.config.host}:${this.config.port}`);
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.io.close(() => {
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.1",
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.4",
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",