@aiscene/aiserver 1.9.6 → 1.9.7
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/debug/websocket-server.d.ts +5 -0
- package/dist/debug/websocket-server.d.ts.map +1 -1
- package/dist/debug/websocket-server.js +70 -13
- package/dist/debug/websocket-server.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/scrcpy/server.d.ts +8 -0
- package/dist/scrcpy/server.d.ts.map +1 -1
- package/dist/scrcpy/server.js +253 -134
- package/dist/scrcpy/server.js.map +1 -1
- package/dist/task/scheduler.d.ts +1 -0
- package/dist/task/scheduler.d.ts.map +1 -1
- package/dist/task/scheduler.js +47 -0
- package/dist/task/scheduler.js.map +1 -1
- package/dist/task/test-case-reference-resolver.d.ts +16 -0
- package/dist/task/test-case-reference-resolver.d.ts.map +1 -0
- package/dist/task/test-case-reference-resolver.js +283 -0
- package/dist/task/test-case-reference-resolver.js.map +1 -0
- package/dist/web/debug-page.d.ts.map +1 -1
- package/dist/web/debug-page.js +49 -58
- package/dist/web/debug-page.js.map +1 -1
- package/dist/web/server.d.ts +5 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +35 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/scrcpy/server.d.ts
CHANGED
|
@@ -66,6 +66,10 @@ export declare class ScrcpyServer {
|
|
|
66
66
|
private currentDeviceId;
|
|
67
67
|
private devicePollInterval;
|
|
68
68
|
private lastDeviceListJson;
|
|
69
|
+
private lastDeviceList;
|
|
70
|
+
private lastDeviceListAt;
|
|
71
|
+
private deviceListInFlight;
|
|
72
|
+
private deviceConnectLocks;
|
|
69
73
|
private serverBinPath;
|
|
70
74
|
private started;
|
|
71
75
|
private projectionBlockedDevices;
|
|
@@ -74,7 +78,10 @@ export declare class ScrcpyServer {
|
|
|
74
78
|
constructor(config: ScrcpyConfig);
|
|
75
79
|
private handleHttpRequest;
|
|
76
80
|
private getAdbClient;
|
|
81
|
+
private loadDevicesListFromAdb;
|
|
77
82
|
private getDevicesList;
|
|
83
|
+
private selectAvailableDeviceId;
|
|
84
|
+
private isSessionOpen;
|
|
78
85
|
private isProjectionBlocked;
|
|
79
86
|
private getProjectionBlockedMessage;
|
|
80
87
|
private getAdb;
|
|
@@ -89,6 +96,7 @@ export declare class ScrcpyServer {
|
|
|
89
96
|
private sendDevicesListTo;
|
|
90
97
|
/** 释放 session 持有的 scrcpy 资源(reader + client),用于断开/切换 */
|
|
91
98
|
private releaseSession;
|
|
99
|
+
private connectDeviceForSession;
|
|
92
100
|
private attachSocketHandlers;
|
|
93
101
|
private startDeviceMonitoring;
|
|
94
102
|
start(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
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;AAsBxD,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;
|
|
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;AAsBxD,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;AAmGD,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,cAAc,CAA4B;IAClD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,kBAAkB,CAA8C;IACxE,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,wBAAwB,CAAkC;IAClE,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAiD;gBAErD,MAAM,EAAE,YAAY;YAoBlB,iBAAiB;YA6CjB,YAAY;YA2BZ,sBAAsB;YAuBtB,cAAc;IA4B5B,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,2BAA2B;YAOrB,MAAM;YAoCN,gBAAgB;YA2BhB,WAAW;IAwEzB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,4BAA4B;YA0BtB,0BAA0B;YAoB1B,kBAAkB;IAShC,OAAO,CAAC,sBAAsB;YA2BhB,iBAAiB;IAoB/B,wDAAwD;YAC1C,cAAc;YAqBd,uBAAuB;IAyOrC,OAAO,CAAC,oBAAoB;IA0iB5B,OAAO,CAAC,qBAAqB;IAYvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA8B7B"}
|
package/dist/scrcpy/server.js
CHANGED
|
@@ -139,6 +139,10 @@ export class ScrcpyServer {
|
|
|
139
139
|
currentDeviceId = null;
|
|
140
140
|
devicePollInterval = null;
|
|
141
141
|
lastDeviceListJson = '';
|
|
142
|
+
lastDeviceList = [];
|
|
143
|
+
lastDeviceListAt = 0;
|
|
144
|
+
deviceListInFlight = null;
|
|
145
|
+
deviceConnectLocks = new Map();
|
|
142
146
|
serverBinPath;
|
|
143
147
|
started = false;
|
|
144
148
|
projectionBlockedDevices = new Map();
|
|
@@ -210,7 +214,7 @@ export class ScrcpyServer {
|
|
|
210
214
|
this.adbClient = new AdbServerClient(new AdbServerNodeTcpConnector({ host: '127.0.0.1', port: 5037 }));
|
|
211
215
|
return this.adbClient;
|
|
212
216
|
}
|
|
213
|
-
async
|
|
217
|
+
async loadDevicesListFromAdb() {
|
|
214
218
|
try {
|
|
215
219
|
const client = await this.getAdbClient();
|
|
216
220
|
const devices = (await withTimeout(client.getDevices(), this.config.adbConnectTimeoutMs, `Timed out listing devices after ${Math.round(this.config.adbConnectTimeoutMs / 1000)}s`));
|
|
@@ -227,6 +231,38 @@ export class ScrcpyServer {
|
|
|
227
231
|
return [];
|
|
228
232
|
}
|
|
229
233
|
}
|
|
234
|
+
async getDevicesList(forceRefresh = false) {
|
|
235
|
+
const now = Date.now();
|
|
236
|
+
const cacheTtlMs = 2000;
|
|
237
|
+
if (!forceRefresh &&
|
|
238
|
+
this.lastDeviceListAt > 0 &&
|
|
239
|
+
now - this.lastDeviceListAt < cacheTtlMs) {
|
|
240
|
+
return this.lastDeviceList;
|
|
241
|
+
}
|
|
242
|
+
if (this.deviceListInFlight) {
|
|
243
|
+
return this.deviceListInFlight;
|
|
244
|
+
}
|
|
245
|
+
this.deviceListInFlight = this.loadDevicesListFromAdb()
|
|
246
|
+
.then((devices) => {
|
|
247
|
+
this.lastDeviceList = devices;
|
|
248
|
+
this.lastDeviceListAt = Date.now();
|
|
249
|
+
return devices;
|
|
250
|
+
})
|
|
251
|
+
.finally(() => {
|
|
252
|
+
this.deviceListInFlight = null;
|
|
253
|
+
});
|
|
254
|
+
return this.deviceListInFlight;
|
|
255
|
+
}
|
|
256
|
+
selectAvailableDeviceId(devices) {
|
|
257
|
+
const online = devices.find((device) => device.status.toLowerCase() === 'device' &&
|
|
258
|
+
!this.isProjectionBlocked(device.id));
|
|
259
|
+
return online?.id || null;
|
|
260
|
+
}
|
|
261
|
+
isSessionOpen(state) {
|
|
262
|
+
return (!state.closed &&
|
|
263
|
+
state.ws.readyState === WebSocket.OPEN &&
|
|
264
|
+
this.sessions.get(state.ws) === state);
|
|
265
|
+
}
|
|
230
266
|
isProjectionBlocked(deviceId) {
|
|
231
267
|
if (!deviceId)
|
|
232
268
|
return false;
|
|
@@ -250,14 +286,12 @@ export class ScrcpyServer {
|
|
|
250
286
|
this.currentDeviceId = targetDeviceId;
|
|
251
287
|
return new Adb(await withTimeout(client.createTransport({ serial: targetDeviceId }), this.config.adbConnectTimeoutMs, `Timed out connecting to Android device ${targetDeviceId} via ADB after ${Math.round(this.config.adbConnectTimeoutMs / 1000)}s`));
|
|
252
288
|
}
|
|
253
|
-
const devices =
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
const availableDevice = devices.find((device) => !this.isProjectionBlocked(device.serial));
|
|
257
|
-
if (!availableDevice)
|
|
289
|
+
const devices = await this.getDevicesList();
|
|
290
|
+
const availableDeviceId = this.selectAvailableDeviceId(devices);
|
|
291
|
+
if (!availableDeviceId)
|
|
258
292
|
return null;
|
|
259
|
-
this.currentDeviceId =
|
|
260
|
-
return new Adb(await withTimeout(client.createTransport(
|
|
293
|
+
this.currentDeviceId = availableDeviceId;
|
|
294
|
+
return new Adb(await withTimeout(client.createTransport({ serial: availableDeviceId }), this.config.adbConnectTimeoutMs, `Timed out connecting to ${availableDeviceId} via ADB`));
|
|
261
295
|
}
|
|
262
296
|
async wakeDeviceScreen(deviceId) {
|
|
263
297
|
const targetDeviceId = deviceId || this.currentDeviceId;
|
|
@@ -386,7 +420,7 @@ export class ScrcpyServer {
|
|
|
386
420
|
await Promise.allSettled(releases);
|
|
387
421
|
}
|
|
388
422
|
async refreshDevicesList() {
|
|
389
|
-
const devices = await this.getDevicesList();
|
|
423
|
+
const devices = await this.getDevicesList(true);
|
|
390
424
|
this.lastDeviceListJson = '';
|
|
391
425
|
this.broadcastDevicesList(devices);
|
|
392
426
|
}
|
|
@@ -403,6 +437,8 @@ export class ScrcpyServer {
|
|
|
403
437
|
scrcpyClient: null,
|
|
404
438
|
adb: null,
|
|
405
439
|
deviceId: null,
|
|
440
|
+
connectPromise: null,
|
|
441
|
+
closed: false,
|
|
406
442
|
videoWidth: 0,
|
|
407
443
|
videoHeight: 0,
|
|
408
444
|
streamReader: null,
|
|
@@ -415,9 +451,14 @@ export class ScrcpyServer {
|
|
|
415
451
|
async sendDevicesListTo(state) {
|
|
416
452
|
try {
|
|
417
453
|
const devices = await this.getDevicesList();
|
|
454
|
+
if (!this.isSessionOpen(state))
|
|
455
|
+
return;
|
|
418
456
|
if (this.currentDeviceId && this.isProjectionBlocked(this.currentDeviceId)) {
|
|
419
457
|
this.currentDeviceId = null;
|
|
420
458
|
}
|
|
459
|
+
if (!this.currentDeviceId) {
|
|
460
|
+
this.currentDeviceId = this.selectAvailableDeviceId(devices);
|
|
461
|
+
}
|
|
421
462
|
wsSend(state.ws, 'devices-list', {
|
|
422
463
|
devices,
|
|
423
464
|
currentDeviceId: this.currentDeviceId,
|
|
@@ -451,6 +492,185 @@ export class ScrcpyServer {
|
|
|
451
492
|
state.videoWidth = 0;
|
|
452
493
|
state.videoHeight = 0;
|
|
453
494
|
}
|
|
495
|
+
async connectDeviceForSession(state, options = {}, emitStatus) {
|
|
496
|
+
const { ws } = state;
|
|
497
|
+
const safeOptions = options || {};
|
|
498
|
+
let connectLockKey = null;
|
|
499
|
+
try {
|
|
500
|
+
emitStatus('connecting-device');
|
|
501
|
+
// 重复 connect-device 时,先释放旧资源避免 scrcpy 进程残留。
|
|
502
|
+
if (state.scrcpyClient) {
|
|
503
|
+
await this.releaseSession(state);
|
|
504
|
+
}
|
|
505
|
+
if (!this.isSessionOpen(state))
|
|
506
|
+
return;
|
|
507
|
+
let targetDeviceId = resolveRequestedDeviceId(safeOptions, this.currentDeviceId);
|
|
508
|
+
if (!targetDeviceId) {
|
|
509
|
+
const devices = await this.getDevicesList();
|
|
510
|
+
if (!this.isSessionOpen(state))
|
|
511
|
+
return;
|
|
512
|
+
targetDeviceId = this.selectAvailableDeviceId(devices) || undefined;
|
|
513
|
+
}
|
|
514
|
+
if (!targetDeviceId) {
|
|
515
|
+
wsSend(ws, 'error', { message: 'No device found' });
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
if (this.isProjectionBlocked(targetDeviceId)) {
|
|
519
|
+
logger.info(`Skip scrcpy connect for scheduled task device: deviceId=${targetDeviceId}`);
|
|
520
|
+
wsSend(ws, 'error', { message: this.getProjectionBlockedMessage(targetDeviceId) });
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
const lockedBy = this.deviceConnectLocks.get(targetDeviceId);
|
|
524
|
+
if (lockedBy && lockedBy !== state.id) {
|
|
525
|
+
logger.info(`Skip duplicate scrcpy connect: deviceId=${targetDeviceId},owner=${lockedBy},client=${state.id}`);
|
|
526
|
+
wsSend(ws, 'error', {
|
|
527
|
+
message: `设备 ${targetDeviceId} 正在建立投屏连接,请稍后重试`,
|
|
528
|
+
});
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
connectLockKey = targetDeviceId;
|
|
532
|
+
this.deviceConnectLocks.set(connectLockKey, state.id);
|
|
533
|
+
this.currentDeviceId = targetDeviceId;
|
|
534
|
+
state.deviceId = targetDeviceId;
|
|
535
|
+
state.adb = await this.getAdb(targetDeviceId);
|
|
536
|
+
if (!this.isSessionOpen(state)) {
|
|
537
|
+
await this.releaseSession(state);
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
if (!state.adb) {
|
|
541
|
+
wsSend(ws, 'error', { message: 'No device found' });
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
await this.wakeDeviceScreen(targetDeviceId);
|
|
545
|
+
if (!this.isSessionOpen(state)) {
|
|
546
|
+
await this.releaseSession(state);
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
state.scrcpyClient = await this.startScrcpy(state.adb, safeOptions, emitStatus);
|
|
550
|
+
if (!this.isSessionOpen(state)) {
|
|
551
|
+
await this.releaseSession(state);
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
logger.info(`Scrcpy started for device=${targetDeviceId},client=${state.id}`);
|
|
555
|
+
const videoStreamRaw = state.scrcpyClient?.videoStream;
|
|
556
|
+
if (!videoStreamRaw) {
|
|
557
|
+
wsSend(ws, 'error', {
|
|
558
|
+
message: 'Video stream not available in scrcpy client',
|
|
559
|
+
});
|
|
560
|
+
await this.releaseSession(state);
|
|
561
|
+
return;
|
|
562
|
+
}
|
|
563
|
+
emitStatus('waiting-for-video');
|
|
564
|
+
const videoStream = typeof videoStreamRaw?.then === 'function'
|
|
565
|
+
? await withTimeout(videoStreamRaw, this.config.videoStreamTimeoutMs, `Timed out waiting for scrcpy video stream metadata after ${Math.round(this.config.videoStreamTimeoutMs / 1000)}s`)
|
|
566
|
+
: videoStreamRaw;
|
|
567
|
+
if (!this.isSessionOpen(state)) {
|
|
568
|
+
await this.releaseSession(state);
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
const metadata = videoStream.metadata;
|
|
572
|
+
// 严格校验:缺失元数据直接报错,避免兜底 H264/1080x1920 与真实流不匹配。
|
|
573
|
+
if (!metadata ||
|
|
574
|
+
!metadata.codec ||
|
|
575
|
+
!metadata.width ||
|
|
576
|
+
!metadata.height) {
|
|
577
|
+
const detail = JSON.stringify(metadata || {});
|
|
578
|
+
logger.error(`incomplete video metadata: ${detail}`);
|
|
579
|
+
wsSend(ws, 'error', {
|
|
580
|
+
message: `Incomplete video metadata from scrcpy: ${detail}`,
|
|
581
|
+
});
|
|
582
|
+
await this.releaseSession(state);
|
|
583
|
+
return;
|
|
584
|
+
}
|
|
585
|
+
// 唤醒屏幕,避免设备熄屏时 scrcpy 推黑画面。
|
|
586
|
+
const controller = state.scrcpyClient?.controller;
|
|
587
|
+
if (controller) {
|
|
588
|
+
try {
|
|
589
|
+
await controller.setScreenPowerMode?.(2);
|
|
590
|
+
}
|
|
591
|
+
catch (e) {
|
|
592
|
+
logger.warn(`setScreenPowerMode failed: ${e.message}`);
|
|
593
|
+
}
|
|
594
|
+
try {
|
|
595
|
+
await controller.backOrScreenOn?.(0);
|
|
596
|
+
}
|
|
597
|
+
catch (e) {
|
|
598
|
+
logger.warn(`backOrScreenOn failed: ${e.message}`);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
if (!this.isSessionOpen(state)) {
|
|
602
|
+
await this.releaseSession(state);
|
|
603
|
+
return;
|
|
604
|
+
}
|
|
605
|
+
wsSend(ws, 'video-metadata', {
|
|
606
|
+
codec: metadata.codec,
|
|
607
|
+
width: metadata.width,
|
|
608
|
+
height: metadata.height,
|
|
609
|
+
});
|
|
610
|
+
state.videoWidth = metadata.width;
|
|
611
|
+
state.videoHeight = metadata.height;
|
|
612
|
+
const { stream } = videoStream;
|
|
613
|
+
const reader = stream.getReader();
|
|
614
|
+
state.streamReader = reader;
|
|
615
|
+
const processStream = async () => {
|
|
616
|
+
try {
|
|
617
|
+
while (true) {
|
|
618
|
+
const { done, value } = await reader.read();
|
|
619
|
+
if (done)
|
|
620
|
+
break;
|
|
621
|
+
const data = value.data;
|
|
622
|
+
const frameType = value.type || 'data';
|
|
623
|
+
const isKey = !!(value.keyframe ?? value.keyFrame) || isH264IdrFrame(data);
|
|
624
|
+
const isConfig = frameType === 'configuration';
|
|
625
|
+
if (!this.isSessionOpen(state))
|
|
626
|
+
break;
|
|
627
|
+
ws.send(buildVideoFrameBuffer(data, isKey, isConfig, Date.now()), { binary: true });
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
catch (error) {
|
|
631
|
+
const msg = error.message || '';
|
|
632
|
+
if (!/cancel|abort/i.test(msg)) {
|
|
633
|
+
logger.error(`Video stream error: ${msg}`);
|
|
634
|
+
if (this.isSessionOpen(state)) {
|
|
635
|
+
wsSend(ws, 'error', {
|
|
636
|
+
message: 'video stream processing error',
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
finally {
|
|
643
|
+
if (state.streamReader === reader) {
|
|
644
|
+
state.streamReader = null;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
if (this.isSessionOpen(state)) {
|
|
648
|
+
wsSend(ws, 'error', { message: 'video stream ended' });
|
|
649
|
+
}
|
|
650
|
+
await this.releaseSession(state);
|
|
651
|
+
};
|
|
652
|
+
void processStream();
|
|
653
|
+
if (state.scrcpyClient?.controller && this.isSessionOpen(state)) {
|
|
654
|
+
wsSend(ws, 'control-ready');
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
catch (error) {
|
|
658
|
+
const message = error?.message || 'Unknown error';
|
|
659
|
+
logger.error(`connect-device failed: ${message}`);
|
|
660
|
+
await this.releaseSession(state);
|
|
661
|
+
if (this.isSessionOpen(state)) {
|
|
662
|
+
wsSend(ws, 'error', {
|
|
663
|
+
message: `Failed to connect device: ${message}`,
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
finally {
|
|
668
|
+
if (connectLockKey &&
|
|
669
|
+
this.deviceConnectLocks.get(connectLockKey) === state.id) {
|
|
670
|
+
this.deviceConnectLocks.delete(connectLockKey);
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
}
|
|
454
674
|
attachSocketHandlers(state) {
|
|
455
675
|
const { ws } = state;
|
|
456
676
|
const emitStatus = (phase) => {
|
|
@@ -526,6 +746,12 @@ export class ScrcpyServer {
|
|
|
526
746
|
'get-devices': () => this.sendDevicesListTo(state),
|
|
527
747
|
'switch-device': async (deviceId) => {
|
|
528
748
|
try {
|
|
749
|
+
if (state.connectPromise) {
|
|
750
|
+
wsSend(ws, 'error', {
|
|
751
|
+
message: 'Device connection is already in progress',
|
|
752
|
+
});
|
|
753
|
+
return;
|
|
754
|
+
}
|
|
529
755
|
const id = typeof deviceId === 'string' ? deviceId : String(deviceId ?? '');
|
|
530
756
|
if (this.isProjectionBlocked(id)) {
|
|
531
757
|
wsSend(ws, 'error', { message: this.getProjectionBlockedMessage(id) });
|
|
@@ -547,134 +773,25 @@ export class ScrcpyServer {
|
|
|
547
773
|
});
|
|
548
774
|
}
|
|
549
775
|
},
|
|
550
|
-
'connect-device':
|
|
551
|
-
|
|
776
|
+
'connect-device': (options = {}) => {
|
|
777
|
+
if (state.connectPromise) {
|
|
552
778
|
emitStatus('connecting-device');
|
|
553
|
-
// 重复 connect-device 时,先释放旧资源避免 scrcpy 残留
|
|
554
|
-
if (state.scrcpyClient) {
|
|
555
|
-
await this.releaseSession(state);
|
|
556
|
-
}
|
|
557
|
-
const requestedDeviceId = resolveRequestedDeviceId(options || {}, this.currentDeviceId);
|
|
558
|
-
if (this.isProjectionBlocked(requestedDeviceId)) {
|
|
559
|
-
const blockedDeviceId = requestedDeviceId || '';
|
|
560
|
-
logger.info(`Skip scrcpy connect for scheduled task device: deviceId=${blockedDeviceId}`);
|
|
561
|
-
wsSend(ws, 'error', { message: this.getProjectionBlockedMessage(blockedDeviceId) });
|
|
562
|
-
return;
|
|
563
|
-
}
|
|
564
|
-
if (requestedDeviceId) {
|
|
565
|
-
this.currentDeviceId = requestedDeviceId;
|
|
566
|
-
state.deviceId = requestedDeviceId;
|
|
567
|
-
}
|
|
568
|
-
state.adb = await this.getAdb(requestedDeviceId);
|
|
569
|
-
if (!state.adb) {
|
|
570
|
-
wsSend(ws, 'error', { message: 'No device found' });
|
|
571
|
-
return;
|
|
572
|
-
}
|
|
573
|
-
await this.wakeDeviceScreen(this.currentDeviceId || requestedDeviceId);
|
|
574
|
-
state.scrcpyClient = await this.startScrcpy(state.adb, options || {}, emitStatus);
|
|
575
|
-
logger.info(`Scrcpy started for device=${this.currentDeviceId},client=${state.id}`);
|
|
576
|
-
const videoStreamRaw = state.scrcpyClient?.videoStream;
|
|
577
|
-
if (!videoStreamRaw) {
|
|
578
|
-
wsSend(ws, 'error', {
|
|
579
|
-
message: 'Video stream not available in scrcpy client',
|
|
580
|
-
});
|
|
581
|
-
await this.releaseSession(state);
|
|
582
|
-
return;
|
|
583
|
-
}
|
|
584
|
-
emitStatus('waiting-for-video');
|
|
585
|
-
const videoStream = typeof videoStreamRaw?.then === 'function'
|
|
586
|
-
? await withTimeout(videoStreamRaw, this.config.videoStreamTimeoutMs, `Timed out waiting for scrcpy video stream metadata after ${Math.round(this.config.videoStreamTimeoutMs / 1000)}s`)
|
|
587
|
-
: videoStreamRaw;
|
|
588
|
-
const metadata = videoStream.metadata;
|
|
589
|
-
// 严格校验:缺失元数据直接报错,避免兜底 H264/1080x1920 与真实流不匹配
|
|
590
|
-
if (!metadata ||
|
|
591
|
-
!metadata.codec ||
|
|
592
|
-
!metadata.width ||
|
|
593
|
-
!metadata.height) {
|
|
594
|
-
const detail = JSON.stringify(metadata || {});
|
|
595
|
-
logger.error(`incomplete video metadata: ${detail}`);
|
|
596
|
-
wsSend(ws, 'error', {
|
|
597
|
-
message: `Incomplete video metadata from scrcpy: ${detail}`,
|
|
598
|
-
});
|
|
599
|
-
await this.releaseSession(state);
|
|
600
|
-
return;
|
|
601
|
-
}
|
|
602
|
-
// 唤醒屏幕,避免设备熄屏时 scrcpy 推黑画面
|
|
603
|
-
const controller = state.scrcpyClient?.controller;
|
|
604
|
-
if (controller) {
|
|
605
|
-
try {
|
|
606
|
-
await controller.setScreenPowerMode?.(2);
|
|
607
|
-
}
|
|
608
|
-
catch (e) {
|
|
609
|
-
logger.warn(`setScreenPowerMode failed: ${e.message}`);
|
|
610
|
-
}
|
|
611
|
-
try {
|
|
612
|
-
await controller.backOrScreenOn?.(0);
|
|
613
|
-
}
|
|
614
|
-
catch (e) {
|
|
615
|
-
logger.warn(`backOrScreenOn failed: ${e.message}`);
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
wsSend(ws, 'video-metadata', {
|
|
619
|
-
codec: metadata.codec,
|
|
620
|
-
width: metadata.width,
|
|
621
|
-
height: metadata.height,
|
|
622
|
-
});
|
|
623
|
-
state.videoWidth = metadata.width;
|
|
624
|
-
state.videoHeight = metadata.height;
|
|
625
|
-
const { stream } = videoStream;
|
|
626
|
-
const reader = stream.getReader();
|
|
627
|
-
state.streamReader = reader;
|
|
628
|
-
const processStream = async () => {
|
|
629
|
-
try {
|
|
630
|
-
while (true) {
|
|
631
|
-
const { done, value } = await reader.read();
|
|
632
|
-
if (done)
|
|
633
|
-
break;
|
|
634
|
-
const data = value.data;
|
|
635
|
-
const frameType = value.type || 'data';
|
|
636
|
-
const isKey = !!(value.keyframe ?? value.keyFrame) || isH264IdrFrame(data);
|
|
637
|
-
const isConfig = frameType === 'configuration';
|
|
638
|
-
if (ws.readyState !== WebSocket.OPEN)
|
|
639
|
-
break;
|
|
640
|
-
ws.send(buildVideoFrameBuffer(data, isKey, isConfig, Date.now()), { binary: true });
|
|
641
|
-
}
|
|
642
|
-
}
|
|
643
|
-
catch (error) {
|
|
644
|
-
const msg = error.message || '';
|
|
645
|
-
if (!/cancel|abort/i.test(msg)) {
|
|
646
|
-
logger.error(`Video stream error: ${msg}`);
|
|
647
|
-
if (ws.readyState === WebSocket.OPEN) {
|
|
648
|
-
wsSend(ws, 'error', {
|
|
649
|
-
message: 'video stream processing error',
|
|
650
|
-
});
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
return;
|
|
654
|
-
}
|
|
655
|
-
finally {
|
|
656
|
-
if (state.streamReader === reader) {
|
|
657
|
-
state.streamReader = null;
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
if (ws.readyState === WebSocket.OPEN) {
|
|
661
|
-
wsSend(ws, 'error', { message: 'video stream ended' });
|
|
662
|
-
}
|
|
663
|
-
await this.releaseSession(state);
|
|
664
|
-
};
|
|
665
|
-
void processStream();
|
|
666
|
-
if (state.scrcpyClient?.controller) {
|
|
667
|
-
wsSend(ws, 'control-ready');
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
catch (error) {
|
|
671
|
-
const message = error?.message || 'Unknown error';
|
|
672
|
-
logger.error(`connect-device failed: ${message}`);
|
|
673
|
-
await this.releaseSession(state);
|
|
674
779
|
wsSend(ws, 'error', {
|
|
675
|
-
message:
|
|
780
|
+
message: 'Device connection is already in progress',
|
|
676
781
|
});
|
|
782
|
+
return;
|
|
677
783
|
}
|
|
784
|
+
const promise = this.connectDeviceForSession(state, options || {}, emitStatus);
|
|
785
|
+
state.connectPromise = promise;
|
|
786
|
+
void promise
|
|
787
|
+
.catch((error) => {
|
|
788
|
+
logger.error(`connect-device promise failed: ${error.message}`);
|
|
789
|
+
})
|
|
790
|
+
.finally(() => {
|
|
791
|
+
if (state.connectPromise === promise) {
|
|
792
|
+
state.connectPromise = null;
|
|
793
|
+
}
|
|
794
|
+
});
|
|
678
795
|
},
|
|
679
796
|
'control-touch': async (raw = {}) => {
|
|
680
797
|
try {
|
|
@@ -1076,6 +1193,7 @@ export class ScrcpyServer {
|
|
|
1076
1193
|
});
|
|
1077
1194
|
ws.on('close', async (code, reason) => {
|
|
1078
1195
|
logger.info(`Client disconnected: id=${state.id}, code=${code}, reason=${reason?.toString() || ''}`);
|
|
1196
|
+
state.closed = true;
|
|
1079
1197
|
this.sessions.delete(ws);
|
|
1080
1198
|
androidRecordingManager.cancel(state.id);
|
|
1081
1199
|
await this.releaseSession(state);
|
|
@@ -1092,7 +1210,7 @@ export class ScrcpyServer {
|
|
|
1092
1210
|
return;
|
|
1093
1211
|
this.devicePollInterval = setInterval(async () => {
|
|
1094
1212
|
try {
|
|
1095
|
-
const devices = await this.getDevicesList();
|
|
1213
|
+
const devices = await this.getDevicesList(true);
|
|
1096
1214
|
this.broadcastDevicesList(devices);
|
|
1097
1215
|
}
|
|
1098
1216
|
catch (error) {
|
|
@@ -1125,6 +1243,7 @@ export class ScrcpyServer {
|
|
|
1125
1243
|
this.devicePollInterval = null;
|
|
1126
1244
|
}
|
|
1127
1245
|
for (const sess of this.sessions.values()) {
|
|
1246
|
+
sess.closed = true;
|
|
1128
1247
|
await this.releaseSession(sess);
|
|
1129
1248
|
try {
|
|
1130
1249
|
sess.ws.close(1001, 'server shutting down');
|