diff --git a/packages/runtime/src/utils/terminal.ts b/packages/runtime/src/utils/terminal.ts index dc88c1e42..c99b1c84d 100644 --- a/packages/runtime/src/utils/terminal.ts +++ b/packages/runtime/src/utils/terminal.ts @@ -4,6 +4,7 @@ export interface ITerminal { reset: () => void; write: (data: string) => void; + input: (data: string) => void; onData: (cb: (data: string) => void) => void; } diff --git a/packages/runtime/src/webcontainer/terminal-config.ts b/packages/runtime/src/webcontainer/terminal-config.ts index 603258789..cdfb8afa4 100644 --- a/packages/runtime/src/webcontainer/terminal-config.ts +++ b/packages/runtime/src/webcontainer/terminal-config.ts @@ -66,7 +66,7 @@ export class TerminalPanel implements ITerminal { private _terminal?: ITerminal; private _process?: WebContainerProcess; - private _data: string[] = []; + private _data: { data: string; type: 'input' | 'echo' }[] = []; private _onData?: (data: string) => void; constructor( @@ -130,11 +130,24 @@ export class TerminalPanel implements ITerminal { } } + /** @internal*/ write(data: string) { if (this._terminal) { this._terminal.write(data); } else { - this._data.push(data); + this._data.push({ data, type: 'echo' }); + } + } + + input(data: string) { + if (this.type !== 'terminal') { + throw new Error('Cannot write data to output-only terminal'); + } + + if (this._terminal) { + this._terminal.input(data); + } else { + this._data.push({ data, type: 'input' }); } } @@ -166,8 +179,12 @@ export class TerminalPanel implements ITerminal { * @param terminal The terminal. */ attachTerminal(terminal: ITerminal) { - for (const data of this._data) { - terminal.write(data); + for (const { type, data } of this._data) { + if (type === 'echo') { + terminal.write(data); + } else { + terminal.input(data); + } } this._data = [];