Jelajahi Sumber

fix(e2b): simplify setup abort wait

Tianyi Cui 2 bulan lalu
induk
melakukan
dc44f93c39
1 mengubah file dengan 14 tambahan dan 18 penghapusan
  1. 14 18
      packages/e2b/code-runtime-e2b/src/index.ts

+ 14 - 18
packages/e2b/code-runtime-e2b/src/index.ts

@@ -199,24 +199,20 @@ export class E2BCodeRuntime extends CodeRuntime {
   }
   /* jscpd:ignore-end */
 
-  private awaitPreparation(signal: AbortSignal | undefined): Promise<PreparedRuntime | undefined> {
-    if (signal === undefined) return this.ready
-    return new Promise<PreparedRuntime | undefined>((resolve, reject) => {
-      const onAbort = (): void => { cleanup(); resolve(undefined) }
-      const cleanup = (): void => { signal.removeEventListener('abort', onAbort) }
-      signal.addEventListener('abort', onAbort, { once: true })
-      if (signal.aborted) {
-        onAbort()
-        return
-      }
-      void this.ready.then(
-        (runtime) => { cleanup(); resolve(runtime) },
-        (error: unknown) => {
-          cleanup()
-          reject(new Error(messageOf(error), { cause: error }))
-        },
-      )
-    })
+  private async awaitPreparation(signal: AbortSignal | undefined): Promise<PreparedRuntime | undefined> {
+    if (signal === undefined) return await this.ready
+    const aborted = Promise.withResolvers<undefined>()
+    const onAbort = (): void => { aborted.resolve(undefined) }
+    signal.addEventListener('abort', onAbort, { once: true })
+    if (signal.aborted) {
+      signal.removeEventListener('abort', onAbort)
+      return undefined
+    }
+    try {
+      return await Promise.race([this.ready, aborted.promise])
+    } finally {
+      signal.removeEventListener('abort', onAbort)
+    }
   }
 
   private assertPreparationActive(): void {