@walkhi/code-relax 0.1.0-beta.81 → 0.1.0-beta.83

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.
@@ -9,7 +9,8 @@ import { readRecord } from '../../service-lifecycle.mjs';
9
9
  export { residentStartup } from './resident-startup.mjs';
10
10
 
11
11
  import { managedEndpointUrl, readManagedEndpoint } from '../../managed-endpoint.mjs';
12
- export function createDesktopHost({ request = systemRequest, wait = delay, now = Date.now, timeout = 10000,
12
+ export function createDesktopHost({ request = systemRequest, wait = delay, now = Date.now, timeout = 30000,
13
+ diagnose = record => console.info(JSON.stringify({ time: new Date().toISOString(), event: 'mac-desktop-close', ...record })),
13
14
  stateRoot = () => runtimePaths().stateRoot, fingerprint = file => {
14
15
  const stat = fs.statSync(path.join(file, 'Contents/Info.plist'));
15
16
  return `${stat.ino}:${stat.size}:${stat.mtimeMs}:${stat.ctimeMs}`;
@@ -48,10 +49,37 @@ export function createDesktopHost({ request = systemRequest, wait = delay, now =
48
49
  const info = await this.inspect();
49
50
  if (!info.running) return;
50
51
  if (info.desktop !== bundlePath || !info.process) throw new Error('Desktop 进程身份已变化,未请求退出。');
51
- await request({ operation: 'desktop-close', bundlePath, expected: info.process });
52
+ const started = now();
53
+ const identity = value => value ? { pid: value.pid, created: value.created, executable: value.executable } : null;
54
+ const context = { target: identity(info.process), version: info.version, build: info.build, timeoutMs: timeout };
55
+ diagnose({ ...context, stage: 'request' });
56
+ let result;
57
+ try { result = await request({ operation: 'desktop-close', bundlePath, expected: info.process }); }
58
+ catch (error) {
59
+ diagnose({ ...context, stage: 'request-failed', elapsedMs: now() - started, error: error.message });
60
+ throw error;
61
+ }
62
+ diagnose({ ...context, stage: 'request-returned', elapsedMs: now() - started,
63
+ quitRequested: result.quitRequested === true, alreadyStopped: result.stopped === true });
52
64
  const deadline = now() + timeout;
53
- while ((await this.inspect()).running) {
54
- if (now() >= deadline) throw new Error('Desktop 尚未正常退出,请在 Mac 上处理未保存内容后重试;未强制结束进程。');
65
+ while (true) {
66
+ let current;
67
+ try { current = await this.inspect(); }
68
+ catch (error) {
69
+ diagnose({ ...context, stage: 'inspect-failed', elapsedMs: now() - started, error: error.message });
70
+ throw error;
71
+ }
72
+ const observation = { ...context, elapsedMs: now() - started, current: identity(current.process),
73
+ finishedLaunching: current.finishedLaunching, connectedToManagedServer: current.connectedToManagedServer };
74
+ if (!current.running) { diagnose({ ...observation, stage: 'exited' }); return; }
75
+ if (current.process?.pid !== info.process.pid || current.process?.created !== info.process.created) {
76
+ diagnose({ ...observation, stage: 'process-changed' });
77
+ throw Object.assign(new Error('Mac 桌面端进程已变化,请刷新状态核对;未再次请求退出。'), { code: 'MAC_DESKTOP_CLOSE_CHANGED' });
78
+ }
79
+ if (now() >= deadline) {
80
+ diagnose({ ...observation, stage: 'timeout', quitRequested: result.quitRequested === true });
81
+ throw Object.assign(new Error('Mac 桌面端退出请求已发送,但未在等待时间内退出。请在 Mac 查看桌面端退出状态和诊断日志;未强制结束进程。'), { code: 'MAC_DESKTOP_CLOSE_TIMEOUT' });
82
+ }
55
83
  await wait(200);
56
84
  }
57
85
  },