From 75b70e5824310ccc97b0ab7b283cdc8781bd3d0c Mon Sep 17 00:00:00 2001
From: Alex Yang <himself65@outlook.com>
Date: Tue, 3 Sep 2024 18:01:42 -0700
Subject: [PATCH] fix: remove Stream API polyfill (#1149)

---
 examples/agent/openai-task.ts                             | 1 -
 examples/agent/react-task.ts                              | 1 -
 examples/tsconfig.json                                    | 2 --
 packages/env/src/index.ts                                 | 8 --------
 packages/env/src/polyfill.ts                              | 8 --------
 .../e2e/examples/cloudflare-worker-agent/src/index.ts     | 2 --
 packages/llamaindex/e2e/tsconfig.json                     | 2 +-
 packages/llamaindex/src/agent/base.ts                     | 6 +++---
 packages/llamaindex/src/agent/react.ts                    | 2 +-
 packages/llamaindex/src/agent/types.ts                    | 1 -
 packages/llamaindex/src/agent/utils.ts                    | 1 -
 packages/llamaindex/src/internal/utils.ts                 | 4 ++++
 12 files changed, 9 insertions(+), 29 deletions(-)

diff --git a/examples/agent/openai-task.ts b/examples/agent/openai-task.ts
index 3a242c15d..22a602d93 100644
--- a/examples/agent/openai-task.ts
+++ b/examples/agent/openai-task.ts
@@ -1,5 +1,4 @@
 import { ChatResponseChunk, OpenAIAgent } from "llamaindex";
-import { ReadableStream } from "node:stream/web";
 import {
   getCurrentIDTool,
   getUserInfoTool,
diff --git a/examples/agent/react-task.ts b/examples/agent/react-task.ts
index fdbdeec01..4c4835bc4 100644
--- a/examples/agent/react-task.ts
+++ b/examples/agent/react-task.ts
@@ -1,5 +1,4 @@
 import { ChatResponseChunk, ReActAgent } from "llamaindex";
-import { ReadableStream } from "node:stream/web";
 import {
   getCurrentIDTool,
   getUserInfoTool,
diff --git a/examples/tsconfig.json b/examples/tsconfig.json
index 600c6fe72..8dcc2b578 100644
--- a/examples/tsconfig.json
+++ b/examples/tsconfig.json
@@ -7,8 +7,6 @@
     "forceConsistentCasingInFileNames": true,
     "strict": true,
     "skipLibCheck": true,
-    "lib": ["ES2022"],
-    "types": ["node"],
     "outDir": "./lib",
     "tsBuildInfoFile": "./lib/.tsbuildinfo",
     "incremental": true,
diff --git a/packages/env/src/index.ts b/packages/env/src/index.ts
index b7895f88c..e3d20b159 100644
--- a/packages/env/src/index.ts
+++ b/packages/env/src/index.ts
@@ -16,11 +16,6 @@ import { createHash, randomUUID } from "node:crypto";
 import { EOL } from "node:os";
 import path from "node:path";
 import { Readable } from "node:stream";
-import {
-  ReadableStream,
-  TransformStream,
-  WritableStream,
-} from "node:stream/web";
 import { fileURLToPath } from "node:url";
 import { createWriteStream, fs } from "./fs/node.js";
 import type { SHA256 } from "./polyfill.js";
@@ -48,7 +43,4 @@ export {
   path,
   randomUUID,
   Readable,
-  ReadableStream,
-  TransformStream,
-  WritableStream,
 };
diff --git a/packages/env/src/polyfill.ts b/packages/env/src/polyfill.ts
index 9f47010be..c9294b7f7 100644
--- a/packages/env/src/polyfill.ts
+++ b/packages/env/src/polyfill.ts
@@ -46,12 +46,4 @@ export function randomUUID(): string {
   return crypto.randomUUID();
 }
 
-// @ts-expect-error
-const ReadableStream = globalThis.ReadableStream;
-// @ts-expect-error
-const TransformStream = globalThis.TransformStream;
-// @ts-expect-error
-const WritableStream = globalThis.WritableStream;
-
 export { AsyncLocalStorage, CustomEvent, getEnv, setEnvs } from "./utils.js";
-export { ReadableStream, TransformStream, WritableStream };
diff --git a/packages/llamaindex/e2e/examples/cloudflare-worker-agent/src/index.ts b/packages/llamaindex/e2e/examples/cloudflare-worker-agent/src/index.ts
index d96fe9d74..8a283cc6b 100644
--- a/packages/llamaindex/e2e/examples/cloudflare-worker-agent/src/index.ts
+++ b/packages/llamaindex/e2e/examples/cloudflare-worker-agent/src/index.ts
@@ -18,14 +18,12 @@ export default {
     console.log(2);
     const textEncoder = new TextEncoder();
     const response = responseStream.pipeThrough<Uint8Array>(
-      // @ts-expect-error: see https://github.com/cloudflare/workerd/issues/2067
       new TransformStream({
         transform: (chunk, controller) => {
           controller.enqueue(textEncoder.encode(chunk.delta));
         },
       }),
     );
-    // @ts-expect-error: see https://github.com/cloudflare/workerd/issues/2067
     return new Response(response);
   },
 };
diff --git a/packages/llamaindex/e2e/tsconfig.json b/packages/llamaindex/e2e/tsconfig.json
index de19b0f45..cd5c86ed7 100644
--- a/packages/llamaindex/e2e/tsconfig.json
+++ b/packages/llamaindex/e2e/tsconfig.json
@@ -5,7 +5,7 @@
     "module": "node16",
     "moduleResolution": "node16",
     "target": "ESNext",
-    "lib": ["ES2022"],
+    "lib": ["ES2022", "DOM.AsyncIterable"],
     "types": ["node"]
   },
   "include": ["./node", "./mock-module.js", "./mock-register.js", "./fixtures"],
diff --git a/packages/llamaindex/src/agent/base.ts b/packages/llamaindex/src/agent/base.ts
index 27e8af5c1..6971b022e 100644
--- a/packages/llamaindex/src/agent/base.ts
+++ b/packages/llamaindex/src/agent/base.ts
@@ -7,7 +7,7 @@ import type {
 } from "@llamaindex/core/llms";
 import { EngineResponse } from "@llamaindex/core/schema";
 import { wrapEventCaller } from "@llamaindex/core/utils";
-import { ReadableStream, TransformStream, randomUUID } from "@llamaindex/env";
+import { randomUUID } from "@llamaindex/env";
 import { ChatHistory } from "../ChatHistory.js";
 import { Settings } from "../Settings.js";
 import {
@@ -16,7 +16,7 @@ import {
   type ChatEngineParamsStreaming,
 } from "../engines/chat/index.js";
 import { consoleLogger, emptyLogger } from "../internal/logger.js";
-import { isAsyncIterable } from "../internal/utils.js";
+import { isReadableStream } from "../internal/utils.js";
 import { ObjectRetriever } from "../objects/index.js";
 import type {
   AgentTaskContext,
@@ -374,7 +374,7 @@ export abstract class AgentRunner<
       this.#chatHistory = [...stepOutput.taskStep.context.store.messages];
       if (stepOutput.isLast) {
         const { output } = stepOutput;
-        if (isAsyncIterable(output)) {
+        if (isReadableStream(output)) {
           return output.pipeThrough<EngineResponse>(
             new TransformStream({
               transform(chunk, controller) {
diff --git a/packages/llamaindex/src/agent/react.ts b/packages/llamaindex/src/agent/react.ts
index 866a5faa9..47bdc9c39 100644
--- a/packages/llamaindex/src/agent/react.ts
+++ b/packages/llamaindex/src/agent/react.ts
@@ -7,7 +7,7 @@ import type {
   LLM,
 } from "@llamaindex/core/llms";
 import { extractText } from "@llamaindex/core/utils";
-import { randomUUID, ReadableStream } from "@llamaindex/env";
+import { randomUUID } from "@llamaindex/env";
 import { getReACTAgentSystemHeader } from "../internal/prompt/react.js";
 import {
   isAsyncIterable,
diff --git a/packages/llamaindex/src/agent/types.ts b/packages/llamaindex/src/agent/types.ts
index d1ee13aa8..40765139c 100644
--- a/packages/llamaindex/src/agent/types.ts
+++ b/packages/llamaindex/src/agent/types.ts
@@ -7,7 +7,6 @@ import type {
   MessageContent,
   ToolOutput,
 } from "@llamaindex/core/llms";
-import { ReadableStream } from "@llamaindex/env";
 import type { Logger } from "../internal/logger.js";
 import type { UUID } from "../types.js";
 
diff --git a/packages/llamaindex/src/agent/utils.ts b/packages/llamaindex/src/agent/utils.ts
index ff8711007..9e6502e61 100644
--- a/packages/llamaindex/src/agent/utils.ts
+++ b/packages/llamaindex/src/agent/utils.ts
@@ -16,7 +16,6 @@ import type {
   ToolOutput,
 } from "@llamaindex/core/llms";
 import { baseToolWithCallSchema } from "@llamaindex/core/schema";
-import { ReadableStream } from "@llamaindex/env";
 import { z } from "zod";
 import type { Logger } from "../internal/logger.js";
 import {
diff --git a/packages/llamaindex/src/internal/utils.ts b/packages/llamaindex/src/internal/utils.ts
index ab144a3cf..10a06b394 100644
--- a/packages/llamaindex/src/internal/utils.ts
+++ b/packages/llamaindex/src/internal/utils.ts
@@ -10,6 +10,10 @@ export const isAsyncIterable = (
   return obj != null && typeof obj === "object" && Symbol.asyncIterator in obj;
 };
 
+export const isReadableStream = (obj: unknown): obj is ReadableStream => {
+  return obj instanceof ReadableStream;
+};
+
 export const isIterable = (obj: unknown): obj is Iterable<unknown> => {
   return obj != null && typeof obj === "object" && Symbol.iterator in obj;
 };
-- 
GitLab