1
- import { createTestServer } from '@ai-sdk/provider-utils/test' ;
1
+ import {
2
+ createTestServer ,
3
+ TestResponseController ,
4
+ } from '@ai-sdk/provider-utils/test' ;
2
5
import { MCPClientError } from '../../../errors' ;
3
6
import { SseMCPTransport } from './mcp-sse-transport' ;
4
7
5
8
describe ( 'SseMCPTransport' , ( ) => {
6
9
const server = createTestServer ( {
7
- 'http://localhost:3000/sse' : {
8
- response : undefined ,
9
- } ,
10
+ 'http://localhost:3000/sse' : { } ,
10
11
'http://localhost:3000/messages' : {
11
12
response : {
12
13
type : 'json-value' ,
@@ -19,17 +20,12 @@ describe('SseMCPTransport', () => {
19
20
} ,
20
21
} ) ;
21
22
22
- beforeEach ( ( ) => {
23
- server . urls [ 'http://localhost:3000/sse' ] . response = undefined ;
24
- } ) ;
25
-
26
23
it ( 'should establish connection and receive endpoint' , async ( ) => {
27
- const controller = new TransformStreamController ( ) ;
28
- const stream = controller . readable ;
24
+ const controller = new TestResponseController ( ) ;
29
25
30
26
server . urls [ 'http://localhost:3000/sse' ] . response = {
31
- type : 'readable -stream' ,
32
- stream ,
27
+ type : 'controlled -stream' ,
28
+ controller ,
33
29
headers : {
34
30
'Content-Type' : 'text/event-stream' ,
35
31
} ,
@@ -40,7 +36,7 @@ describe('SseMCPTransport', () => {
40
36
} ) ;
41
37
const connectPromise = transport . start ( ) ;
42
38
43
- controller . enqueue (
39
+ controller . write (
44
40
'event: endpoint\ndata: http://localhost:3000/messages\n\n' ,
45
41
) ;
46
42
@@ -56,8 +52,7 @@ describe('SseMCPTransport', () => {
56
52
} ) ;
57
53
58
54
it ( 'should throw if server returns non-200 status' , async ( ) => {
59
- const controller = new TransformStreamController ( ) ;
60
- const stream = controller . readable ;
55
+ const controller = new TestResponseController ( ) ;
61
56
62
57
server . urls [ 'http://localhost:3000/sse' ] . response = {
63
58
type : 'error' ,
@@ -70,20 +65,19 @@ describe('SseMCPTransport', () => {
70
65
} ) ;
71
66
const connectPromise = transport . start ( ) ;
72
67
73
- controller . enqueue (
68
+ controller . write (
74
69
'event: endpoint\ndata: http://localhost:3000/messages\n\n' ,
75
70
) ;
76
71
77
72
await expect ( connectPromise ) . rejects . toThrow ( ) ;
78
73
} ) ;
79
74
80
75
it ( 'should handle valid JSON-RPC messages' , async ( ) => {
81
- const controller = new TransformStreamController ( ) ;
82
- const stream = controller . readable ;
76
+ const controller = new TestResponseController ( ) ;
83
77
84
78
server . urls [ 'http://localhost:3000/sse' ] . response = {
85
- type : 'readable -stream' ,
86
- stream ,
79
+ type : 'controlled -stream' ,
80
+ controller ,
87
81
headers : {
88
82
'Content-Type' : 'text/event-stream' ,
89
83
} ,
@@ -98,7 +92,7 @@ describe('SseMCPTransport', () => {
98
92
} ) ;
99
93
100
94
const connectPromise = transport . start ( ) ;
101
- controller . enqueue (
95
+ controller . write (
102
96
'event: endpoint\ndata: http://localhost:3000/messages\n\n' ,
103
97
) ;
104
98
await connectPromise ;
@@ -110,7 +104,7 @@ describe('SseMCPTransport', () => {
110
104
id : '1' ,
111
105
} ;
112
106
113
- controller . enqueue (
107
+ controller . write (
114
108
`event: message\ndata: ${ JSON . stringify ( testMessage ) } \n\n` ,
115
109
) ;
116
110
@@ -121,12 +115,11 @@ describe('SseMCPTransport', () => {
121
115
} ) ;
122
116
123
117
it ( 'should handle invalid JSON-RPC messages' , async ( ) => {
124
- const controller = new TransformStreamController ( ) ;
125
- const stream = controller . readable ;
118
+ const controller = new TestResponseController ( ) ;
126
119
127
120
server . urls [ 'http://localhost:3000/sse' ] . response = {
128
- type : 'readable -stream' ,
129
- stream ,
121
+ type : 'controlled -stream' ,
122
+ controller ,
130
123
headers : {
131
124
'Content-Type' : 'text/event-stream' ,
132
125
} ,
@@ -141,7 +134,7 @@ describe('SseMCPTransport', () => {
141
134
} ) ;
142
135
143
136
const connectPromise = transport . start ( ) ;
144
- controller . enqueue (
137
+ controller . write (
145
138
'event: endpoint\ndata: http://localhost:3000/messages\n\n' ,
146
139
) ;
147
140
await connectPromise ;
@@ -150,7 +143,7 @@ describe('SseMCPTransport', () => {
150
143
foo : 'bar' ,
151
144
} ;
152
145
153
- controller . enqueue (
146
+ controller . write (
154
147
`event: message\ndata: ${ JSON . stringify ( invalidMessage ) } \n\n` ,
155
148
) ;
156
149
@@ -162,12 +155,11 @@ describe('SseMCPTransport', () => {
162
155
} ) ;
163
156
164
157
it ( 'should send messages as POST requests' , async ( ) => {
165
- const controller = new TransformStreamController ( ) ;
166
- const stream = controller . readable ;
158
+ const controller = new TestResponseController ( ) ;
167
159
168
160
server . urls [ 'http://localhost:3000/sse' ] . response = {
169
- type : 'readable -stream' ,
170
- stream ,
161
+ type : 'controlled -stream' ,
162
+ controller ,
171
163
headers : {
172
164
'Content-Type' : 'text/event-stream' ,
173
165
} ,
@@ -178,7 +170,7 @@ describe('SseMCPTransport', () => {
178
170
} ) ;
179
171
180
172
const connectPromise = transport . start ( ) ;
181
- controller . enqueue (
173
+ controller . write (
182
174
'event: endpoint\ndata: http://localhost:3000/messages\n\n' ,
183
175
) ;
184
176
await connectPromise ;
@@ -201,12 +193,11 @@ describe('SseMCPTransport', () => {
201
193
} ) ;
202
194
203
195
it ( 'should handle POST request errors' , async ( ) => {
204
- const controller = new TransformStreamController ( ) ;
205
- const stream = controller . readable ;
196
+ const controller = new TestResponseController ( ) ;
206
197
207
198
server . urls [ 'http://localhost:3000/sse' ] . response = {
208
- type : 'readable -stream' ,
209
- stream ,
199
+ type : 'controlled -stream' ,
200
+ controller ,
210
201
headers : {
211
202
'Content-Type' : 'text/event-stream' ,
212
203
} ,
@@ -226,7 +217,7 @@ describe('SseMCPTransport', () => {
226
217
} ) ;
227
218
228
219
const connectPromise = transport . start ( ) ;
229
- controller . enqueue (
220
+ controller . write (
230
221
'event: endpoint\ndata: http://localhost:3000/messages\n\n' ,
231
222
) ;
232
223
await connectPromise ;
@@ -266,12 +257,11 @@ describe('SseMCPTransport', () => {
266
257
} ) ;
267
258
268
259
it ( 'should send custom headers with all requests' , async ( ) => {
269
- const controller = new TransformStreamController ( ) ;
270
- const stream = controller . readable ;
260
+ const controller = new TestResponseController ( ) ;
271
261
272
262
server . urls [ 'http://localhost:3000/sse' ] . response = {
273
- type : 'readable -stream' ,
274
- stream ,
263
+ type : 'controlled -stream' ,
264
+ controller ,
275
265
headers : {
276
266
'Content-Type' : 'text/event-stream' ,
277
267
} ,
@@ -288,9 +278,11 @@ describe('SseMCPTransport', () => {
288
278
} ) ;
289
279
290
280
const connectPromise = transport . start ( ) ;
291
- controller . enqueue (
281
+
282
+ controller . write (
292
283
'event: endpoint\ndata: http://localhost:3000/messages\n\n' ,
293
284
) ;
285
+
294
286
await connectPromise ;
295
287
296
288
const message = {
@@ -317,25 +309,3 @@ describe('SseMCPTransport', () => {
317
309
await transport . close ( ) ;
318
310
} ) ;
319
311
} ) ;
320
-
321
- class TransformStreamController {
322
- private readonly stream : TransformStream ;
323
- private readonly writer : WritableStreamDefaultWriter ;
324
-
325
- constructor ( ) {
326
- this . stream = new TransformStream ( ) ;
327
- this . writer = this . stream . writable . getWriter ( ) ;
328
- }
329
-
330
- get readable ( ) : ReadableStream {
331
- return this . stream . readable ;
332
- }
333
-
334
- async enqueue ( chunk : string ) : Promise < void > {
335
- await this . writer . write ( chunk ) ;
336
- }
337
-
338
- async close ( ) : Promise < void > {
339
- await this . writer . close ( ) ;
340
- }
341
- }
0 commit comments