| // Flags: --expose-internals |
| 'use strict'; |
| |
| const common = require('../common'); |
| const StreamWrap = require('internal/js_stream_socket'); |
| const net = require('net'); |
| |
| // This test ensures that when we directly call `socket.destroy()` without |
| // having called `socket.end()` on an instance of streamWrap, it will |
| // still emit EOF which makes the socket on the other side emit "end" and |
| // "close" events, and vice versa. |
| { |
| let port; |
| const server = net.createServer((socket) => { |
| socket.on('error', common.mustNotCall()); |
| socket.on('end', common.mustNotCall()); |
| socket.on('close', common.mustCall()); |
| socket.destroy(); |
| }); |
| |
| server.listen(() => { |
| port = server.address().port; |
| createSocket(); |
| }); |
| |
| function createSocket() { |
| let streamWrap; |
| const socket = new net.connect({ |
| port, |
| }, () => { |
| socket.on('error', common.mustNotCall()); |
| socket.on('end', common.mustCall()); |
| socket.on('close', common.mustCall()); |
| |
| streamWrap.on('error', common.mustNotCall()); |
| // The "end" events will be emitted which is as same as |
| // the same situation for an instance of `net.Socket` without |
| // `StreamWrap`. |
| streamWrap.on('end', common.mustCall()); |
| // Destroying a socket in the server side should emit EOF and cause |
| // the corresponding client-side socket closed. |
| streamWrap.on('close', common.mustCall(() => { |
| server.close(); |
| })); |
| }); |
| streamWrap = new StreamWrap(socket); |
| } |
| } |
| |
| // Destroy the streamWrap and test again. |
| { |
| let port; |
| const server = net.createServer((socket) => { |
| socket.on('error', common.mustNotCall()); |
| socket.on('end', common.mustCall()); |
| socket.on('close', common.mustCall(() => { |
| server.close(); |
| })); |
| // Do not `socket.end()` and directly `socket.destroy()`. |
| }); |
| |
| server.listen(() => { |
| port = server.address().port; |
| createSocket(); |
| }); |
| |
| function createSocket() { |
| let streamWrap; |
| const socket = new net.connect({ |
| port, |
| }, () => { |
| socket.on('error', common.mustNotCall()); |
| socket.on('end', common.mustNotCall()); |
| socket.on('close', common.mustCall()); |
| |
| streamWrap.on('error', common.mustNotCall()); |
| streamWrap.on('end', common.mustNotCall()); |
| // Destroying a socket in the server side should emit EOF and cause |
| // the corresponding client-side socket closed. |
| streamWrap.on('close', common.mustCall()); |
| streamWrap.destroy(); |
| }); |
| streamWrap = new StreamWrap(socket); |
| } |
| } |
| |
| // Destroy the client socket and test again. |
| { |
| let port; |
| const server = net.createServer((socket) => { |
| socket.on('error', common.mustNotCall()); |
| socket.on('end', common.mustCall()); |
| socket.on('close', common.mustCall(() => { |
| server.close(); |
| })); |
| }); |
| |
| server.listen(() => { |
| port = server.address().port; |
| createSocket(); |
| }); |
| |
| function createSocket() { |
| let streamWrap; |
| const socket = new net.connect({ |
| port, |
| }, () => { |
| socket.on('error', common.mustNotCall()); |
| socket.on('end', common.mustNotCall()); |
| socket.on('close', common.mustCall()); |
| |
| streamWrap.on('error', common.mustNotCall()); |
| streamWrap.on('end', common.mustNotCall()); |
| streamWrap.on('close', common.mustCall()); |
| socket.destroy(); |
| }); |
| streamWrap = new StreamWrap(socket); |
| } |
| } |