* Start the child bridge process
()
| 390 | * Start the child bridge process |
| 391 | */ |
| 392 | private startChildProcess(): void { |
| 393 | this.bridgeStatus = ChildBridgeStatus.PENDING |
| 394 | |
| 395 | this.child = fork(resolve(__dirname, 'childBridgeFork.js'), this.args, this.processEnv) |
| 396 | |
| 397 | this.child.stdout?.on('data', (data) => { |
| 398 | process.stdout.write(data) |
| 399 | }) |
| 400 | |
| 401 | this.child.stderr?.on('data', (data) => { |
| 402 | process.stderr.write(data) |
| 403 | }) |
| 404 | |
| 405 | this.child.on('error', (e) => { |
| 406 | this.bridgeStatus = ChildBridgeStatus.DOWN |
| 407 | this.log.error('Child bridge process error', e) |
| 408 | }) |
| 409 | |
| 410 | this.child.once('close', (code, signal) => { |
| 411 | this.handleProcessClose(code, signal) |
| 412 | }) |
| 413 | |
| 414 | // handle incoming ipc messages from the child process |
| 415 | this.child.on('message', (message: ChildProcessMessageEvent<unknown>) => { |
| 416 | if (typeof message !== 'object' || !message.id) { |
| 417 | return |
| 418 | } |
| 419 | |
| 420 | switch (message.id) { |
| 421 | case ChildProcessMessageEventType.READY: { |
| 422 | this.log(`Child bridge starting${this.child?.pid ? ` (pid ${this.child.pid})` : ''}...`) |
| 423 | this.loadPlugin() |
| 424 | break |
| 425 | } |
| 426 | case ChildProcessMessageEventType.LOADED: { |
| 427 | const version = (message.data as ChildProcessPluginLoadedEventData).version |
| 428 | if (this.pluginConfig.length > 1) { |
| 429 | this.log.success(`Child bridge started successfully with ${this.pluginConfig.length} accessories (plugin v${version}).`) |
| 430 | } else { |
| 431 | this.log.success(`Child bridge started successfully (plugin v${version}).`) |
| 432 | } |
| 433 | this.startBridge() |
| 434 | break |
| 435 | } |
| 436 | case ChildProcessMessageEventType.ONLINE: { |
| 437 | this.bridgeStatus = ChildBridgeStatus.OK |
| 438 | break |
| 439 | } |
| 440 | case ChildProcessMessageEventType.PORT_REQUEST: { |
| 441 | void this.handlePortRequest(message.data as ChildProcessPortRequestEventData) |
| 442 | break |
| 443 | } |
| 444 | case ChildProcessMessageEventType.RELEASE_MATTER_PORT: { |
| 445 | const data = message.data as { uniqueId?: string } | undefined |
| 446 | if (data?.uniqueId) { |
| 447 | this.externalPortService.releaseMatterPort(data.uniqueId) |
| 448 | } |
| 449 | break |
no test coverage detected