1- import { IpcMessageV2Schema , IpcMessageV2 , MessageCmd , SudoRequestData , SudoRequestDataSchema } from 'codify-schemas' ;
1+ import { IpcMessageV2 , IpcMessageV2Schema , MessageCmd , SudoRequestData , SudoRequestDataSchema } from 'codify-schemas' ;
22import { ChildProcess , fork } from 'node:child_process' ;
33import { createRequire } from 'node:module' ;
44
55import { Event , ctx } from '../events/context.js' ;
66import { ajv } from '../utils/ajv.js' ;
7- import { PluginMessage } from './plugin-message.js' ;
87import { sendIpcMessageForResult } from './message-sender.js' ;
8+ import { PluginMessage } from './plugin-message.js' ;
99
1010export const ipcMessageValidator = ajv . compile ( IpcMessageV2Schema ) ;
1111export const sudoRequestValidator = ajv . compile ( SudoRequestDataSchema ) ;
1212
13+ const DEFAULT_NODE_MODULES_DIR = '/usr/local/lib/codify/node_modules/'
14+
15+ // Find the location of the node_modules of the CLI itself. Plugins depend on a shared instance of node-pty to work (using NODE_PATH)
16+ // ex: /Users/kevinwang/Projects/codify/node_modules/@homebridge /node-pty-prebuilt-multiarch/lib/index.js
17+ const require = createRequire ( import . meta. url ) ;
18+ const nodeModulesDir = require . resolve ( '@homebridge/node-pty-prebuilt-multiarch' )
19+ ?. split ( '@homebridge/node-pty-prebuilt-multiarch' )
20+ ?. at ( 0 )
21+ ?? DEFAULT_NODE_MODULES_DIR ;
22+
1323export function returnMessageCmd ( cmd : string ) {
1424 return `${ cmd } _Response` ;
1525}
@@ -32,7 +42,7 @@ export class PluginProcess {
3242 [ ] ,
3343 {
3444 detached : secureMode ,
35- env : { ...process . env , DEBUG_COLORS : '1' , FORCE_COLOR : '1' } ,
45+ env : { ...process . env , DEBUG_COLORS : '1' , FORCE_COLOR : '1' , NODE_PATH : nodeModulesDir } ,
3646 silent : true ,
3747 ...( isTypescript && { execArgv : [ '--import' , 'tsx' ] } ) ,
3848 } ,
@@ -57,7 +67,7 @@ export class PluginProcess {
5767 private static handleSudoRequests ( process : ChildProcess , pluginName : string ) {
5868 // Listen for incoming sudo incoming sudo requests
5969 process . on ( 'message' , ( message ) => {
60- if ( ! ipcMessageValidator ( message ) ) {
70+ if ( ! PluginProcess . isIpcMessage ( message ) ) {
6171 throw new Error ( `Invalid message from plugin. ${ JSON . stringify ( message , null , 2 ) } ` ) ;
6272 }
6373
@@ -89,7 +99,6 @@ export class PluginProcess {
8999 // Tsx is only installed for dev builds. Only allow typescript plugins for testing.
90100 private static isTsxInstalled ( ) : boolean {
91101 try {
92- const require = createRequire ( import . meta. url ) ;
93102 require . resolve ( 'tsx' ) ;
94103 } catch {
95104 return false ;
@@ -102,5 +111,9 @@ export class PluginProcess {
102111 const message = PluginMessage . create ( cmd , data ) ;
103112 return sendIpcMessageForResult ( message , this . process ) ;
104113 }
114+
115+ private static isIpcMessage ( message : unknown ) : message is IpcMessageV2 {
116+ return ipcMessageValidator ( message ) ;
117+ }
105118}
106119
0 commit comments