@@ -165,6 +165,194 @@ test("should reject unsupported protocol version", async () => {
165
165
expect ( clientTransport . close ) . toHaveBeenCalled ( ) ;
166
166
} ) ;
167
167
168
+ test ( "should connect new client to old, supported server version" , async ( ) => {
169
+ const OLD_VERSION = SUPPORTED_PROTOCOL_VERSIONS [ 1 ] ;
170
+ const server = new Server (
171
+ {
172
+ name : "test server" ,
173
+ version : "1.0" ,
174
+ } ,
175
+ {
176
+ capabilities : {
177
+ resources : { } ,
178
+ tools : { } ,
179
+ } ,
180
+ } ,
181
+ ) ;
182
+
183
+ server . setRequestHandler ( InitializeRequestSchema , ( _request ) => ( {
184
+ protocolVersion : OLD_VERSION ,
185
+ capabilities : {
186
+ resources : { } ,
187
+ tools : { } ,
188
+ } ,
189
+ serverInfo : {
190
+ name : "old server" ,
191
+ version : "1.0" ,
192
+ } ,
193
+ } ) ) ;
194
+
195
+ server . setRequestHandler ( ListResourcesRequestSchema , ( ) => ( {
196
+ resources : [ ] ,
197
+ } ) ) ;
198
+
199
+ server . setRequestHandler ( ListToolsRequestSchema , ( ) => ( {
200
+ tools : [ ] ,
201
+ } ) ) ;
202
+
203
+ const [ clientTransport , serverTransport ] =
204
+ InMemoryTransport . createLinkedPair ( ) ;
205
+
206
+ const client = new Client (
207
+ {
208
+ name : "new client" ,
209
+ version : "1.0" ,
210
+ protocolVersion : LATEST_PROTOCOL_VERSION ,
211
+ } ,
212
+ {
213
+ capabilities : {
214
+ sampling : { } ,
215
+ } ,
216
+ enforceStrictCapabilities : true ,
217
+ } ,
218
+ ) ;
219
+
220
+ await Promise . all ( [
221
+ client . connect ( clientTransport ) ,
222
+ server . connect ( serverTransport ) ,
223
+ ] ) ;
224
+
225
+ expect ( client . getServerVersion ( ) ) . toEqual ( {
226
+ name : "old server" ,
227
+ version : "1.0" ,
228
+ } ) ;
229
+ } ) ;
230
+
231
+ test ( "should negotiate version when client is old, and newer server supports its version" , async ( ) => {
232
+ const OLD_VERSION = SUPPORTED_PROTOCOL_VERSIONS [ 1 ] ;
233
+ const server = new Server (
234
+ {
235
+ name : "new server" ,
236
+ version : "1.0" ,
237
+ } ,
238
+ {
239
+ capabilities : {
240
+ resources : { } ,
241
+ tools : { } ,
242
+ } ,
243
+ } ,
244
+ ) ;
245
+
246
+ server . setRequestHandler ( InitializeRequestSchema , ( _request ) => ( {
247
+ protocolVersion : LATEST_PROTOCOL_VERSION ,
248
+ capabilities : {
249
+ resources : { } ,
250
+ tools : { } ,
251
+ } ,
252
+ serverInfo : {
253
+ name : "new server" ,
254
+ version : "1.0" ,
255
+ } ,
256
+ } ) ) ;
257
+
258
+ server . setRequestHandler ( ListResourcesRequestSchema , ( ) => ( {
259
+ resources : [ ] ,
260
+ } ) ) ;
261
+
262
+ server . setRequestHandler ( ListToolsRequestSchema , ( ) => ( {
263
+ tools : [ ] ,
264
+ } ) ) ;
265
+
266
+ const [ clientTransport , serverTransport ] =
267
+ InMemoryTransport . createLinkedPair ( ) ;
268
+
269
+ const client = new Client (
270
+ {
271
+ name : "old client" ,
272
+ version : "1.0" ,
273
+ protocolVersion : OLD_VERSION ,
274
+ } ,
275
+ {
276
+ capabilities : {
277
+ sampling : { } ,
278
+ } ,
279
+ enforceStrictCapabilities : true ,
280
+ } ,
281
+ ) ;
282
+
283
+ await Promise . all ( [
284
+ client . connect ( clientTransport ) ,
285
+ server . connect ( serverTransport ) ,
286
+ ] ) ;
287
+
288
+ expect ( client . getServerVersion ( ) ) . toEqual ( {
289
+ name : "new server" ,
290
+ version : "1.0" ,
291
+ } ) ;
292
+ } ) ;
293
+
294
+ test ( "should throw when client is old, and server doesn't support its version" , async ( ) => {
295
+ const OLD_VERSION = SUPPORTED_PROTOCOL_VERSIONS [ 1 ] ;
296
+ const FUTURE_VERSION = "FUTURE_VERSION" ;
297
+ const server = new Server (
298
+ {
299
+ name : "new server" ,
300
+ version : "1.0" ,
301
+ } ,
302
+ {
303
+ capabilities : {
304
+ resources : { } ,
305
+ tools : { } ,
306
+ } ,
307
+ } ,
308
+ ) ;
309
+
310
+ server . setRequestHandler ( InitializeRequestSchema , ( _request ) => ( {
311
+ protocolVersion : FUTURE_VERSION ,
312
+ capabilities : {
313
+ resources : { } ,
314
+ tools : { } ,
315
+ } ,
316
+ serverInfo : {
317
+ name : "new server" ,
318
+ version : "1.0" ,
319
+ } ,
320
+ } ) ) ;
321
+
322
+ server . setRequestHandler ( ListResourcesRequestSchema , ( ) => ( {
323
+ resources : [ ] ,
324
+ } ) ) ;
325
+
326
+ server . setRequestHandler ( ListToolsRequestSchema , ( ) => ( {
327
+ tools : [ ] ,
328
+ } ) ) ;
329
+
330
+ const [ clientTransport , serverTransport ] =
331
+ InMemoryTransport . createLinkedPair ( ) ;
332
+
333
+ const client = new Client (
334
+ {
335
+ name : "old client" ,
336
+ version : "1.0" ,
337
+ protocolVersion : OLD_VERSION ,
338
+ } ,
339
+ {
340
+ capabilities : {
341
+ sampling : { } ,
342
+ } ,
343
+ enforceStrictCapabilities : true ,
344
+ } ,
345
+ ) ;
346
+
347
+ await Promise . all ( [
348
+ expect ( client . connect ( clientTransport ) ) . rejects . toThrow (
349
+ "Server's protocol version is not supported: FUTURE_VERSION"
350
+ ) ,
351
+ server . connect ( serverTransport ) ,
352
+ ] ) ;
353
+
354
+ } ) ;
355
+
168
356
test ( "should respect server capabilities" , async ( ) => {
169
357
const server = new Server (
170
358
{
0 commit comments