MCPcopy
hub / github.com/homebridge/homebridge / startChildProcess

Method startChildProcess

src/childBridgeService.ts:392–505  ·  view source on GitHub ↗

* Start the child bridge process

()

Source from the content-addressed store, hash-verified

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

Callers 3

startMethod · 0.95
handleProcessCloseMethod · 0.95
startChildBridgeMethod · 0.95

Calls 11

handleProcessCloseMethod · 0.95
loadPluginMethod · 0.95
startBridgeMethod · 0.95
handlePortRequestMethod · 0.95
sendStatusUpdateMethod · 0.95
onMethod · 0.80
errorMethod · 0.80
logMethod · 0.80
successMethod · 0.80
releaseMatterPortMethod · 0.45
sendMessageMethod · 0.45

Tested by

no test coverage detected