{"record":{"id":"c54e39c2cf00e1a4","repo":"homebridge/homebridge","slug":"received-unknown-message-type-from-parent-process","errorCode":null,"errorMessage":"Received unknown message type from parent process: ${message.id}","messagePattern":"Received unknown message type from parent process: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/childBridgeFork.ts","lineNumber":526,"sourceCode":"      childPluginFork.handleGetMatterAccessories()\n      break\n    }\n    case ChildProcessMessageEventType.GET_MATTER_ACCESSORY_INFO: {\n      childPluginFork.handleGetMatterAccessoryInfo(message.data as { uuid: string })\n      break\n    }\n    case ChildProcessMessageEventType.MATTER_ACCESSORY_CONTROL: {\n      childPluginFork.handleMatterAccessoryControl(message.data as {\n        uuid: string\n        cluster: string\n        attributes: Record<string, unknown>\n        partId?: string\n        correlationId?: string\n      })\n      break\n    }\n    default: {\n      Logger.internal.warn(`Received unknown message type from parent process: ${message.id}`)\n      break\n    }\n  }\n})\n\n/**\n * Handle the sigterm shutdown signals\n */\nlet shuttingDown = false\nfunction signalHandler(signal: NodeJS.Signals, signalNum: number): void {\n  if (shuttingDown) {\n    return\n  }\n  shuttingDown = true\n\n  Logger.internal.info('Got %s, shutting down child bridge process...', signal)\n\n  try {","sourceCodeStart":508,"sourceCodeEnd":544,"githubUrl":"https://github.com/homebridge/homebridge/blob/edf54930340d67cade23d01abd41b03cd9621e8b/src/childBridgeFork.ts#L508-L544","documentation":"The child bridge's process.on('message') handler switches on message.id (a ChildProcessMessageEventType) and logs this warning in the default branch when the parent sends a message type the child does not understand. Typically caused by version mismatch between parent Homebridge and the forked child code, or third-party messages injected into the IPC channel.","triggerScenarios":"Parent sends an IPC message whose id is not one of the handled ChildProcessMessageEventType cases — e.g. newer parent version with new event types while the fork handles an older set, or a foreign message on process.send channel.","commonSituations":"Partial upgrade where parent and child run different code (stale process not restarted); another library or tooling writing to the IPC channel; typo'd custom message id from patched code.","solutions":["Restart Homebridge fully so parent and all child bridges run the same version","Ensure no other code writes raw messages to the child's IPC channel","Update Homebridge (and plugins using child bridges) to matching versions","If from a plugin sending custom IPC, register/ignore its message id explicitly"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const KNOWN = new Set(Object.values(ChildProcessMessageEventType))\nif (!KNOWN.has(message.id)) console.warn(`unhandled IPC message ${message.id}; version mismatch?`)","typeGuard":"function isKnownIpcMessage(m: unknown): m is { id: ChildProcessMessageEventType } {\n  return typeof m === 'object' && m !== null && typeof (m as any).id === 'string' && (m as any).id in ChildProcessMessageEventType\n}","tryCatchPattern":"process.on('message', (m) => { if (!isKnownIpcMessage(m)) { Logger.internal.warn('ignoring unknown IPC message'); return } /* handle */ })","preventionTips":["Always restart parent + children together after upgrading Homebridge","Do not send raw custom messages over the child bridge IPC channel","Pin one Homebridge version across the deployment","Extend ChildProcessMessageEventType instead of inventing new ids"],"tags":["ipc","child-bridge","unknown-message"],"backgroundTag":"unknown-ipc-message-type","analyzedSha":"edf54930340d67cade23d01abd41b03cd9621e8b","analyzedAt":"2026-08-30T21:28:53.235Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}