1// Flags: --expose-internals 2'use strict'; 3const common = require('../common'); 4const assert = require('assert'); 5 6const { internalBinding } = require('internal/test/binding'); 7const { TCP, constants: TCPConstants } = internalBinding('tcp_wrap'); 8const { 9 WriteWrap, 10 kReadBytesOrError, 11 kArrayBufferOffset, 12 streamBaseState 13} = internalBinding('stream_wrap'); 14 15const server = new TCP(TCPConstants.SOCKET); 16 17const r = server.bind('0.0.0.0', 0); 18assert.strictEqual(r, 0); 19let port = {}; 20server.getsockname(port); 21port = port.port; 22 23server.listen(128); 24 25server.onconnection = (err, client) => { 26 assert.strictEqual(client.writeQueueSize, 0); 27 console.log('got connection'); 28 29 const maybeCloseClient = () => { 30 if (client.pendingWrites.length === 0 && client.gotEOF) { 31 console.log('close client'); 32 client.close(); 33 } 34 }; 35 36 client.readStart(); 37 client.pendingWrites = []; 38 client.onread = common.mustCall((arrayBuffer) => { 39 if (arrayBuffer) { 40 const offset = streamBaseState[kArrayBufferOffset]; 41 const nread = streamBaseState[kReadBytesOrError]; 42 const buffer = Buffer.from(arrayBuffer, offset, nread); 43 assert.ok(buffer.length > 0); 44 45 assert.strictEqual(client.writeQueueSize, 0); 46 47 const req = new WriteWrap(); 48 req.async = false; 49 const returnCode = client.writeBuffer(req, buffer); 50 assert.strictEqual(returnCode, 0); 51 client.pendingWrites.push(req); 52 53 console.log(`client.writeQueueSize: ${client.writeQueueSize}`); 54 // 11 bytes should flush 55 assert.strictEqual(client.writeQueueSize, 0); 56 57 if (req.async) 58 req.oncomplete = common.mustCall(done); 59 else 60 process.nextTick(done.bind(null, 0, client, req)); 61 62 function done(status, client_, req_) { 63 assert.strictEqual(client.pendingWrites.shift(), req); 64 65 // Check parameters. 66 assert.strictEqual(status, 0); 67 assert.strictEqual(client_, client); 68 assert.strictEqual(req_, req); 69 70 console.log(`client.writeQueueSize: ${client.writeQueueSize}`); 71 assert.strictEqual(client.writeQueueSize, 0); 72 73 maybeCloseClient(); 74 } 75 76 } else { 77 console.log('eof'); 78 client.gotEOF = true; 79 server.close(); 80 maybeCloseClient(); 81 } 82 }, 2); 83}; 84 85const net = require('net'); 86 87const c = net.createConnection(port); 88 89c.on('connect', common.mustCall(() => { c.end('hello world'); })); 90 91c.setEncoding('utf8'); 92c.on('data', common.mustCall((d) => { 93 assert.strictEqual(d, 'hello world'); 94})); 95 96c.on('close', () => { 97 console.error('client closed'); 98}); 99