@@ -672,8 +672,6 @@ describe(QUICStream.name, () => {
672672 await streamEndedProm . p ;
673673 expect ( streamCreatedCount ) . toBe ( streamsNum ) ;
674674 expect ( streamEndedCount ) . toBe ( streamsNum ) ;
675- await client . destroy ( { force : true } ) ;
676- await server . stop ( { force : true } ) ;
677675 } ) ;
678676 test ( 'should clean up streams when connection times out' , async ( ) => {
679677 const streamsNum = 10 ;
@@ -1237,4 +1235,183 @@ describe(QUICStream.name, () => {
12371235 await client . destroy ( { force : true } ) ;
12381236 await server . stop ( { force : true } ) ;
12391237 } ) ;
1238+
1239+ test ( 'streams are allowed to end when client is destroyed with force: false' , async ( ) => {
1240+ const message = Buffer . from ( 'The Quick Brown Fox Jumped Over The Lazy Dog' ) ;
1241+ const numStreams = 10 ;
1242+ const numMessage = 10 ;
1243+ const connectionEventProm =
1244+ utils . promise < events . EventQUICServerConnection > ( ) ;
1245+ const tlsConfig = await generateTLSConfig ( defaultType ) ;
1246+ const server = new QUICServer ( {
1247+ crypto : {
1248+ key,
1249+ ops : serverCrypto ,
1250+ } ,
1251+ logger : logger . getChild ( QUICServer . name ) ,
1252+ config : {
1253+ key : tlsConfig . leafKeyPairPEM . privateKey ,
1254+ cert : tlsConfig . leafCertPEM ,
1255+ verifyPeer : false ,
1256+ } ,
1257+ } ) ;
1258+ socketCleanMethods . extractSocket ( server ) ;
1259+ server . addEventListener (
1260+ events . EventQUICServerConnection . name ,
1261+ ( e : events . EventQUICServerConnection ) => connectionEventProm . resolveP ( e ) ,
1262+ ) ;
1263+ await server . start ( {
1264+ host : localhost ,
1265+ } ) ;
1266+ const client = await QUICClient . createQUICClient ( {
1267+ host : localhost ,
1268+ port : server . port ,
1269+ localHost : localhost ,
1270+ crypto : {
1271+ ops : clientCrypto ,
1272+ } ,
1273+ logger : logger . getChild ( QUICClient . name ) ,
1274+ config : {
1275+ verifyPeer : false ,
1276+ } ,
1277+ } ) ;
1278+ socketCleanMethods . extractSocket ( client ) ;
1279+ const conn = ( await connectionEventProm . p ) . detail ;
1280+
1281+ // Do the test
1282+ const activeServerStreams : Array < Promise < void > > = [ ] ;
1283+ conn . addEventListener (
1284+ events . EventQUICConnectionStream . name ,
1285+ ( streamEvent : events . EventQUICConnectionStream ) => {
1286+ const stream = streamEvent . detail ;
1287+ const streamProm = stream . readable . pipeTo ( stream . writable ) ;
1288+ activeServerStreams . push ( streamProm ) ;
1289+ } ,
1290+ ) ;
1291+
1292+ const { p : waitP , resolveP : waitResolveP } = utils . promise ( ) ;
1293+
1294+ // Let's make a new streams.
1295+ const activeClientStreams : Array < Promise < void > > = [ ] ;
1296+ for ( let i = 0 ; i < numStreams ; i ++ ) {
1297+ activeClientStreams . push (
1298+ ( async ( ) => {
1299+ const stream = client . connection . newStream ( ) ;
1300+ const writer = stream . writable . getWriter ( ) ;
1301+ const reader = stream . readable . getReader ( ) ;
1302+ // Do write and read messages here.
1303+ for ( let j = 0 ; j < numMessage ; j ++ ) {
1304+ await writer . write ( message ) ;
1305+ const readMessage = await reader . read ( ) ;
1306+ expect ( readMessage . done ) . toBeFalse ( ) ;
1307+ expect ( readMessage . value ) . toStrictEqual ( message ) ;
1308+ await waitP ;
1309+ }
1310+ await writer . close ( ) ;
1311+ const value = await reader . read ( ) ;
1312+ expect ( value . done ) . toBeTrue ( ) ;
1313+ } ) ( ) ,
1314+ ) ;
1315+ }
1316+
1317+ // Start unforced close of client
1318+ const clientDestroyP = client . destroy ( { force : false } ) ;
1319+ waitResolveP ( ) ;
1320+
1321+ await Promise . all ( [
1322+ Promise . all ( activeClientStreams ) ,
1323+ Promise . all ( activeServerStreams ) ,
1324+ clientDestroyP ,
1325+ ] ) ;
1326+ await server . stop ( { force : true } ) ;
1327+ } ) ;
1328+ test ( 'streams are allowed to end when server is destroyed with force: false' , async ( ) => {
1329+ const message = Buffer . from ( 'The Quick Brown Fox Jumped Over The Lazy Dog' ) ;
1330+ const numStreams = 10 ;
1331+ const numMessage = 10 ;
1332+ const connectionEventProm =
1333+ utils . promise < events . EventQUICServerConnection > ( ) ;
1334+ const tlsConfig = await generateTLSConfig ( defaultType ) ;
1335+ const server = new QUICServer ( {
1336+ crypto : {
1337+ key,
1338+ ops : serverCrypto ,
1339+ } ,
1340+ logger : logger . getChild ( QUICServer . name ) ,
1341+ config : {
1342+ key : tlsConfig . leafKeyPairPEM . privateKey ,
1343+ cert : tlsConfig . leafCertPEM ,
1344+ verifyPeer : false ,
1345+ } ,
1346+ } ) ;
1347+ socketCleanMethods . extractSocket ( server ) ;
1348+ server . addEventListener (
1349+ events . EventQUICServerConnection . name ,
1350+ ( e : events . EventQUICServerConnection ) => connectionEventProm . resolveP ( e ) ,
1351+ ) ;
1352+ await server . start ( {
1353+ host : localhost ,
1354+ } ) ;
1355+ const client = await QUICClient . createQUICClient ( {
1356+ host : localhost ,
1357+ port : server . port ,
1358+ localHost : localhost ,
1359+ crypto : {
1360+ ops : clientCrypto ,
1361+ } ,
1362+ logger : logger . getChild ( QUICClient . name ) ,
1363+ config : {
1364+ verifyPeer : false ,
1365+ } ,
1366+ } ) ;
1367+ socketCleanMethods . extractSocket ( client ) ;
1368+ const conn = ( await connectionEventProm . p ) . detail ;
1369+
1370+ // Do the test
1371+ const activeServerStreams : Array < Promise < void > > = [ ] ;
1372+ conn . addEventListener (
1373+ events . EventQUICConnectionStream . name ,
1374+ ( streamEvent : events . EventQUICConnectionStream ) => {
1375+ const stream = streamEvent . detail ;
1376+ const streamProm = stream . readable . pipeTo ( stream . writable ) ;
1377+ activeServerStreams . push ( streamProm ) ;
1378+ } ,
1379+ ) ;
1380+
1381+ const { p : waitP , resolveP : waitResolveP } = utils . promise ( ) ;
1382+
1383+ // Let's make a new streams.
1384+ const activeClientStreams : Array < Promise < void > > = [ ] ;
1385+ for ( let i = 0 ; i < numStreams ; i ++ ) {
1386+ activeClientStreams . push (
1387+ ( async ( ) => {
1388+ const stream = client . connection . newStream ( ) ;
1389+ const writer = stream . writable . getWriter ( ) ;
1390+ const reader = stream . readable . getReader ( ) ;
1391+ // Do write and read messages here.
1392+ for ( let j = 0 ; j < numMessage ; j ++ ) {
1393+ await writer . write ( message ) ;
1394+ const readMessage = await reader . read ( ) ;
1395+ expect ( readMessage . done ) . toBeFalse ( ) ;
1396+ expect ( readMessage . value ) . toStrictEqual ( message ) ;
1397+ await waitP ;
1398+ }
1399+ await writer . close ( ) ;
1400+ const value = await reader . read ( ) ;
1401+ expect ( value . done ) . toBeTrue ( ) ;
1402+ } ) ( ) ,
1403+ ) ;
1404+ }
1405+
1406+ // Start unforced close of server
1407+ const serverStopP = server . stop ( { force : false } ) ;
1408+ waitResolveP ( ) ;
1409+
1410+ await Promise . all ( [
1411+ Promise . all ( activeClientStreams ) ,
1412+ Promise . all ( activeServerStreams ) ,
1413+ serverStopP ,
1414+ ] ) ;
1415+ await client . destroy ( { force : true } ) ;
1416+ } ) ;
12401417} ) ;
0 commit comments