Skip to content

Commit ad4a42c

Browse files
committed
fix: Fix the issue of incorrect data type of ReadableStream on edge platform
1 parent 19e5725 commit ad4a42c

3 files changed

Lines changed: 14 additions & 11 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "deep-research",
33
"description": "Use any LLMs (Large Language Models) for Deep Research. Support SSE API and MCP server.",
4-
"version": "0.9.4",
4+
"version": "0.9.5",
55
"license": "MIT",
66
"repository": {
77
"url": "https://github.com/u14app/deep-research"

src/libs/mcp-server/sse.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ const nanoid = customAlphabet("1234567890abcdef");
112112
*/
113113
export class SSEServerTransport implements Transport {
114114
// Store the ReadableStream controller for the SSE stream
115-
private _sseController?: ReadableStreamController<string>;
115+
private _sseController?: ReadableStreamController<Uint8Array>;
116116
private _started: boolean = false;
117117
private _sessionId: string;
118118
// Counter for generating SSE event IDs (optional but good practice for SSE)
@@ -169,7 +169,8 @@ export class SSEServerTransport implements Transport {
169169
};
170170

171171
// Create the ReadableStream for the SSE body
172-
const stream = new ReadableStream<string>({
172+
const encoder = new TextEncoder();
173+
const stream = new ReadableStream<Uint8Array>({
173174
start: (controller) => {
174175
this._sseController = controller; // Store the controller to send messages later
175176
console.log(`[${this._sessionId}] SSE stream started.`);
@@ -189,7 +190,7 @@ export class SSEServerTransport implements Transport {
189190
// Let's add a simple auto-incrementing ID to all events for consistency.
190191
const endpointEventData = `event: endpoint\ndata: ${relativeUrlWithSession}\n\n`;
191192
try {
192-
controller.enqueue(endpointEventData);
193+
controller.enqueue(encoder.encode(endpointEventData));
193194
console.log(
194195
`[${this._sessionId}] Sent 'endpoint' event: ${relativeUrlWithSession}`
195196
);
@@ -407,6 +408,7 @@ export class SSEServerTransport implements Transport {
407408
throw error;
408409
}
409410

411+
const encoder = new TextEncoder();
410412
// Format the message as an SSE event
411413
const eventData = `event: message\nid: ${this
412414
._messageIdCounter++}\ndata: ${JSON.stringify(message)}\n\n`;
@@ -425,7 +427,7 @@ export class SSEServerTransport implements Transport {
425427
this._sseController = undefined;
426428
throw error;
427429
}
428-
this._sseController.enqueue(eventData);
430+
this._sseController.enqueue(encoder.encode(eventData));
429431
// console.log(`[${this._sessionId}] Sent message (SSE event ID: ${this._messageIdCounter - 1})`); // Debug log
430432
} catch (error) {
431433
// Catch synchronous errors during enqueue (e.g. controller already errored)

src/libs/mcp-server/streamableHttp.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ export class StreamableHTTPServerTransport implements Transport {
170170
private sessionIdGenerator: (() => string) | undefined;
171171
private _started: boolean = false;
172172
// Map streamId to the ReadableStream controller for SSE streams
173-
private _streamMapping: Map<string, ReadableStreamController<string>> =
173+
private _streamMapping: Map<string, ReadableStreamController<Uint8Array>> =
174174
new Map();
175175
// Maps request ID to stream ID for POST requests resulting in SSE streams
176176
private _requestToStreamMapping: Map<RequestId, string> = new Map();
@@ -366,10 +366,10 @@ export class StreamableHTTPServerTransport implements Transport {
366366
private createSSEStream(
367367
streamId: string,
368368
options?: { lastEventId?: string }
369-
): ReadableStream<string> {
370-
let controller: ReadableStreamController<string>;
369+
): ReadableStream<Uint8Array> {
370+
let controller: ReadableStreamController<Uint8Array>;
371371

372-
const stream = new ReadableStream<string>({
372+
const stream = new ReadableStream<Uint8Array>({
373373
start: async (c) => {
374374
controller = c;
375375
// Store the controller keyed by streamId
@@ -478,7 +478,7 @@ export class StreamableHTTPServerTransport implements Transport {
478478
* Returns false if the enqueue fails (e.g., stream is closed or full).
479479
*/
480480
private writeSSEEvent(
481-
controller: ReadableStreamController<string>,
481+
controller: ReadableStreamController<Uint8Array>,
482482
message: JSONRPCMessage,
483483
eventId?: string
484484
): boolean {
@@ -506,7 +506,8 @@ export class StreamableHTTPServerTransport implements Transport {
506506

507507
// enqueue returns void, success is implied unless it throws or controller is closed asynchronously
508508
try {
509-
controller.enqueue(eventData);
509+
const encoder = new TextEncoder();
510+
controller.enqueue(encoder.encode(eventData));
510511
return true; // Indicate success
511512
} catch (error) {
512513
// Catch synchronous errors during enqueue (e.g. controller is already errored)

0 commit comments

Comments
 (0)