1- import { IpcMessage , IpcMessageSchema } from 'codify-schemas' ;
1+ import { IpcMessage , IpcMessageSchema , MessageCmd , SudoRequestData , SudoRequestDataSchema } from 'codify-schemas' ;
22import { ChildProcess , fork } from 'node:child_process' ;
33import { createRequire } from 'node:module' ;
44
5- import { ctx } from '../events/context.js' ;
5+ import { ctx , Event } from '../events/context.js' ;
66import { ajv } from '../utils/ajv.js' ;
77import { PluginMessage } from './message.js' ;
88
99const ipcMessageValidator = ajv . compile ( IpcMessageSchema ) ;
10+ const sudoRequestValidator = ajv . compile ( SudoRequestDataSchema ) ;
11+
1012
1113type Resolve < T > = ( value : T ) => void ;
1214type Reject = ( reason ?: Error ) => void ;
@@ -30,7 +32,7 @@ export class PluginProcess {
3032 pluginPath ,
3133 [ ] ,
3234 {
33- env : { ...process . env , FORCE_COLOR : '1' , DEBUG_COLORS : '1' } ,
35+ env : { ...process . env , DEBUG_COLORS : '1' , FORCE_COLOR : '1' } ,
3436 silent : true ,
3537 ...( isTypescript && { execArgv : [ '--import' , 'tsx' ] } ) ,
3638 } ,
@@ -41,6 +43,7 @@ export class PluginProcess {
4143 _process . on ( 'exit' , ( code ) => {
4244 throw new Error ( `Plugin ${ this . name } exited with code ${ code } ` ) ;
4345 } )
46+ this . handleSudoRequests ( _process ) ;
4447
4548 return new PluginProcess ( _process ) ;
4649 }
@@ -67,12 +70,37 @@ export class PluginProcess {
6770 try {
6871 const require = createRequire ( import . meta. url ) ;
6972 require . resolve ( 'tsx' ) ;
70- } catch ( e ) {
73+ } catch {
7174 return false ;
7275 }
7376
7477 return true ;
7578 }
79+
80+ private static handleSudoRequests ( process : ChildProcess ) {
81+ process . on ( 'message' , ( message ) => {
82+ if ( ! ipcMessageValidator ( message ) ) {
83+ throw new Error ( `Invalid message from plugin. ${ JSON . stringify ( message , null , 2 ) } ` ) ;
84+ }
85+
86+ if ( message . cmd === MessageCmd . SUDO_REQUEST ) {
87+ const { data } = message ;
88+ if ( ! sudoRequestValidator ( data ) ) {
89+ throw new Error ( `Invalid sudo request from plugin ${ this . name } . ${ JSON . stringify ( sudoRequestValidator . errors , null , 2 ) } ` ) ;
90+ }
91+
92+ ctx . sudoRequested ( this . name , ( data as unknown as SudoRequestData ) . command ) ;
93+ }
94+ } )
95+ ctx . on ( Event . SUDO_REQUEST_GRANTED , ( pluginName ) => {
96+ if ( pluginName === this . name ) {
97+ process . send ( {
98+ cmd : resultFunctionName ( MessageCmd . SUDO_REQUEST ) ,
99+ data : { }
100+ } )
101+ }
102+ } )
103+ }
76104}
77105
78106class SendMessageForResultHandler {
0 commit comments