1// Flags: --expose-internals 2'use strict'; 3 4const common = require('../common'); 5const StreamWrap = require('internal/js_stream_socket'); 6const net = require('net'); 7 8// This test ensures that when we directly call `socket.destroy()` without 9// having called `socket.end()` on an instance of streamWrap, it will 10// still emit EOF which makes the socket on the other side emit "end" and 11// "close" events, and vice versa. 12{ 13 let port; 14 const server = net.createServer((socket) => { 15 socket.on('error', common.mustNotCall()); 16 socket.on('end', common.mustNotCall()); 17 socket.on('close', common.mustCall()); 18 socket.destroy(); 19 }); 20 21 server.listen(() => { 22 port = server.address().port; 23 createSocket(); 24 }); 25 26 function createSocket() { 27 let streamWrap; 28 const socket = new net.connect({ 29 port, 30 }, () => { 31 socket.on('error', common.mustNotCall()); 32 socket.on('end', common.mustCall()); 33 socket.on('close', common.mustCall()); 34 35 streamWrap.on('error', common.mustNotCall()); 36 // The "end" events will be emitted which is as same as 37 // the same situation for an instance of `net.Socket` without 38 // `StreamWrap`. 39 streamWrap.on('end', common.mustCall()); 40 // Destroying a socket in the server side should emit EOF and cause 41 // the corresponding client-side socket closed. 42 streamWrap.on('close', common.mustCall(() => { 43 server.close(); 44 })); 45 }); 46 streamWrap = new StreamWrap(socket); 47 } 48} 49 50// Destroy the streamWrap and test again. 51{ 52 let port; 53 const server = net.createServer((socket) => { 54 socket.on('error', common.mustNotCall()); 55 socket.on('end', common.mustCall()); 56 socket.on('close', common.mustCall(() => { 57 server.close(); 58 })); 59 // Do not `socket.end()` and directly `socket.destroy()`. 60 }); 61 62 server.listen(() => { 63 port = server.address().port; 64 createSocket(); 65 }); 66 67 function createSocket() { 68 let streamWrap; 69 const socket = new net.connect({ 70 port, 71 }, () => { 72 socket.on('error', common.mustNotCall()); 73 socket.on('end', common.mustNotCall()); 74 socket.on('close', common.mustCall()); 75 76 streamWrap.on('error', common.mustNotCall()); 77 streamWrap.on('end', common.mustNotCall()); 78 // Destroying a socket in the server side should emit EOF and cause 79 // the corresponding client-side socket closed. 80 streamWrap.on('close', common.mustCall()); 81 streamWrap.destroy(); 82 }); 83 streamWrap = new StreamWrap(socket); 84 } 85} 86 87// Destroy the client socket and test again. 88{ 89 let port; 90 const server = net.createServer((socket) => { 91 socket.on('error', common.mustNotCall()); 92 socket.on('end', common.mustCall()); 93 socket.on('close', common.mustCall(() => { 94 server.close(); 95 })); 96 }); 97 98 server.listen(() => { 99 port = server.address().port; 100 createSocket(); 101 }); 102 103 function createSocket() { 104 let streamWrap; 105 const socket = new net.connect({ 106 port, 107 }, () => { 108 socket.on('error', common.mustNotCall()); 109 socket.on('end', common.mustNotCall()); 110 socket.on('close', common.mustCall()); 111 112 streamWrap.on('error', common.mustNotCall()); 113 streamWrap.on('end', common.mustNotCall()); 114 streamWrap.on('close', common.mustCall()); 115 socket.destroy(); 116 }); 117 streamWrap = new StreamWrap(socket); 118 } 119} 120