11import fs from "node:fs" ;
22import path from "node:path" ;
3+ import stream from "node:stream" ;
34import { ChildProcessWithoutNullStreams , spawn } from "node:child_process" ;
45import tcpPortUsed from "tcp-port-used" ;
56import fetchRT from "fetch-retry" ;
@@ -10,6 +11,8 @@ import {
1011 NitroModelOperationResponse ,
1112 NitroModelInitOptions ,
1213 NitroProcessInfo ,
14+ NitroProcessEventHandler ,
15+ NitroProcessStdioHanler ,
1316} from "./types" ;
1417import { downloadNitro } from "./scripts" ;
1518import { checkMagicBytes , getResourcesInfo } from "./utils" ;
@@ -50,6 +53,28 @@ const getNitroProcessInfo = (subprocess: any): NitroProcessInfo => ({
5053 isRunning : subprocess != null ,
5154} ) ;
5255const getCurrentNitroProcessInfo = ( ) => getNitroProcessInfo ( subprocess ) ;
56+ // Default event handler: do nothing
57+ let processEventHandler : NitroProcessEventHandler = { } ;
58+ // Default stdio handler: log stdout and stderr
59+ let processStdioHandler : NitroProcessStdioHanler = {
60+ stdout : ( stdout : stream . Readable | null | undefined ) => {
61+ stdout ?. on ( "data" , ( data : any ) => {
62+ log ( `[NITRO]::Debug: ${ data } ` ) ;
63+ } ) ;
64+ } ,
65+ stderr : ( stderr : stream . Readable | null | undefined ) => {
66+ stderr ?. on ( "data" , ( data : any ) => {
67+ log ( `[NITRO]::Error: ${ data } ` ) ;
68+ } ) ;
69+ } ,
70+ } ;
71+
72+ const registerEventHandler = ( handler : NitroProcessEventHandler ) => {
73+ processEventHandler = handler ;
74+ } ;
75+ const registerStdioHandler = ( handler : NitroProcessStdioHanler ) => {
76+ processStdioHandler = handler ;
77+ } ;
5378
5479// The current model file url
5580let currentModelFile : string = "" ;
@@ -378,16 +403,16 @@ function spawnNitroProcess(
378403 ) ;
379404
380405 // Handle subprocess output
381- subprocess . stdout . on ( "data" , ( data : any ) => {
382- log ( `[NITRO]::Debug: ${ data } ` ) ;
383- } ) ;
384-
385- subprocess . stderr . on ( "data" , ( data : any ) => {
386- log ( `[NITRO]::Error: ${ data } ` ) ;
387- } ) ;
406+ processStdioHandler . stdout ( subprocess . stdout ) ;
407+ processStdioHandler . stderr ( subprocess . stderr ) ;
408+ // Handle events
409+ let evt : keyof NitroProcessEventHandler ;
410+ for ( evt in processEventHandler ) {
411+ subprocess . on ( evt , processEventHandler [ evt ] ! ) ;
412+ }
388413
389- subprocess . on ( "close" , ( code : any ) => {
390- log ( `[NITRO]::Debug: Nitro exited with code: ${ code } ` ) ;
414+ subprocess . on ( "close" , ( code : number , signal : string ) => {
415+ log ( `[NITRO]::Debug: Nitro exited with code: ${ code } , signal: ${ signal } ` ) ;
391416 subprocess = undefined ;
392417 reject ( `child process exited with code ${ code } ` ) ;
393418 } ) ;
@@ -411,6 +436,8 @@ export {
411436 getCurrentNitroProcessInfo ,
412437 getBinPath ,
413438 setBinPath ,
439+ registerStdioHandler ,
440+ registerEventHandler ,
414441 initialize ,
415442 stopModel ,
416443 runModel ,
0 commit comments