From 6ac32533cfa458bff38a9ab968147d4cd64bde54 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 11 Oct 2023 11:39:38 -0700 Subject: [PATCH 1/4] Add exit code to process --- packages/python-sdk/e2b/session/process.py | 16 +++++++++++++++- packages/python-sdk/example.py | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/python-sdk/e2b/session/process.py b/packages/python-sdk/e2b/session/process.py index 6a9edd4dd..7dd727ebc 100644 --- a/packages/python-sdk/e2b/session/process.py +++ b/packages/python-sdk/e2b/session/process.py @@ -52,6 +52,7 @@ class ProcessOutput(BaseModel): messages: List[ProcessMessage] = [] error: bool = False + exit_code: Optional[int] = None @property def stdout(self) -> str: @@ -101,6 +102,15 @@ def __init__( self._finished = finished self._output = output + @property + def exit_code(self) -> int: + """ + The exit code of the last process started by this manager. + """ + if not self.finished: + raise ProcessException("Process is still running") + return self.output.exit_code + @property def output(self) -> ProcessOutput: """ @@ -282,6 +292,10 @@ async def start( output = ProcessOutput() + def handle_exit(exit_code: int): + output.exit_code = exit_code + future_exit(True) + def handle_stdout(data: Dict[Any, Any]): out = OutStdoutResponse(**data) @@ -317,7 +331,7 @@ def handle_stderr(data: Dict[Any, Any]): try: unsub_all = await self._session._handle_subscriptions( self._session._subscribe( - self._service_name, future_exit, "onExit", process_id + self._service_name, handle_exit, "onExit", process_id ), self._session._subscribe( self._service_name, handle_stdout, "onStdout", process_id diff --git a/packages/python-sdk/example.py b/packages/python-sdk/example.py index c1178fa47..bf8d71f1f 100644 --- a/packages/python-sdk/example.py +++ b/packages/python-sdk/example.py @@ -2,8 +2,11 @@ import logging from os import getenv +from dotenv import load_dotenv + from e2b import Session +load_dotenv() id = "Python3" E2B_API_KEY = getenv("E2B_API_KEY") From e19476567af44719a97e57f5e5bd805dbcf273a9 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 11 Oct 2023 13:01:16 -0700 Subject: [PATCH 2/4] Add exit code to process JS --- packages/js-sdk/src/session/index.ts | 6 +++++- packages/js-sdk/src/session/process.ts | 17 +++++++++++++++++ packages/python-sdk/e2b/session/process.py | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/js-sdk/src/session/index.ts b/packages/js-sdk/src/session/index.ts index 103b390ed..a8f66922b 100644 --- a/packages/js-sdk/src/session/index.ts +++ b/packages/js-sdk/src/session/index.ts @@ -277,6 +277,10 @@ export class Session extends SessionConnection { const { promise: processExited, resolve: triggerExit } = createDeferredPromise() const output = new ProcessOutput() + const handleExit = (exitCode: number) => { + output.setExitCode(exitCode) + triggerExit() + } const handleStdout = (data: { line: string; timestamp: number }) => { const message = new ProcessMessage(data.line, data.timestamp, false) @@ -304,7 +308,7 @@ export class Session extends SessionConnection { const [onExitSubID, onStdoutSubID, onStderrSubID] = await this.handleSubscriptions( - this.subscribe(processService, triggerExit, 'onExit', processID), + this.subscribe(processService, handleExit, 'onExit', processID), this.subscribe(processService, handleStdout, 'onStdout', processID), this.subscribe(processService, handleStderr, 'onStderr', processID), ) diff --git a/packages/js-sdk/src/session/process.ts b/packages/js-sdk/src/session/process.ts index 7a2ad38c2..ee185f946 100644 --- a/packages/js-sdk/src/session/process.ts +++ b/packages/js-sdk/src/session/process.ts @@ -26,6 +26,18 @@ export class ProcessOutput { private readonly delimiter = '\n' private readonly messages: ProcessMessage[] = [] private _error = false + private _exitCode?: number + private _finished = false + + /** + * The exit code of the process. + */ + get exitCode(): number | undefined { + if (!this._finished) { + throw new Error('Process has not finished yet') + } + return this._exitCode + } /** * Whether the process has errored. @@ -63,6 +75,11 @@ export class ProcessOutput { this.insertByTimestamp(message) } + setExitCode(exitCode: number) { + this._exitCode = exitCode + this._finished = true + } + private insertByTimestamp(message: ProcessMessage) { let i = this.messages.length - 1 while (i >= 0 && this.messages[i].timestamp > message.timestamp) { diff --git a/packages/python-sdk/e2b/session/process.py b/packages/python-sdk/e2b/session/process.py index 7dd727ebc..a01a94472 100644 --- a/packages/python-sdk/e2b/session/process.py +++ b/packages/python-sdk/e2b/session/process.py @@ -108,7 +108,7 @@ def exit_code(self) -> int: The exit code of the last process started by this manager. """ if not self.finished: - raise ProcessException("Process is still running") + raise ProcessException("Process has not finished yet") return self.output.exit_code @property From f9aec833f8a1d336993c9594c91de29181dec22b Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 11 Oct 2023 13:06:34 -0700 Subject: [PATCH 3/4] Add changeset --- .changeset/angry-ears-thank.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/angry-ears-thank.md diff --git a/.changeset/angry-ears-thank.md b/.changeset/angry-ears-thank.md new file mode 100644 index 000000000..312bde474 --- /dev/null +++ b/.changeset/angry-ears-thank.md @@ -0,0 +1,6 @@ +--- +'@e2b/python-sdk': patch +'@e2b/sdk': patch +--- + +Add exit code to process From 3f76de85237d7af8140bf7f35818c8bba6cf8657 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Wed, 11 Oct 2023 13:30:00 -0700 Subject: [PATCH 4/4] Add tests --- packages/js-sdk/test/process.test.mjs | 2 ++ packages/python-sdk/tests/test_process.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/js-sdk/test/process.test.mjs b/packages/js-sdk/test/process.test.mjs index 9e6d33fce..dc112b291 100644 --- a/packages/js-sdk/test/process.test.mjs +++ b/packages/js-sdk/test/process.test.mjs @@ -21,6 +21,7 @@ test('process on stdout/stderr', async () => { expect(output.stderr).toEqual('') expect(stdout.map(message => message.line)).toEqual(['/tmp']) expect(stderr).toEqual([]) + expect(process.output.exitCode).toEqual(0) await session.close() }) @@ -112,6 +113,7 @@ test('test default on stdout/stderr', async () => { await process.finished expect(onStdout).toHaveBeenCalledOnce() expect(onStderr).toHaveBeenCalled() + expect(process.output.exitCode).toEqual(1) await session.close() }, 10000) diff --git a/packages/python-sdk/tests/test_process.py b/packages/python-sdk/tests/test_process.py index 784fbf37c..5677da76d 100644 --- a/packages/python-sdk/tests/test_process.py +++ b/packages/python-sdk/tests/test_process.py @@ -33,6 +33,7 @@ async def test_process_on_stdout_stderr(): assert output.stderr == "" assert list(map(lambda message: message.line, stdout)) == ["/tmp"] assert stderr == [] + assert proc.exit_code == 0 await session.close() @@ -122,5 +123,6 @@ async def test_process_default_on_stdout_stderr(): on_stdout.assert_called_once() on_stderr.assert_called() + assert proc.exit_code == 1 await session.close()