'use strict'; const common = require('../common'); const assert = require('assert'); const net = require('net'); const message = Buffer.from('hello world'); // Test typical usage net.createServer(common.mustCall(function(socket) { this.close(); socket.end(message); })).listen(0, function() { let received = 0; const buffers = []; const sockBuf = Buffer.alloc(8); net.connect({ port: this.address().port, onread: { buffer: sockBuf, callback: function(nread, buf) { assert.strictEqual(buf, sockBuf); received += nread; buffers.push(Buffer.from(buf.slice(0, nread))); } } }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { assert.strictEqual(received, message.length); assert.deepStrictEqual(Buffer.concat(buffers), message); })); }); // Test Uint8Array support net.createServer(common.mustCall(function(socket) { this.close(); socket.end(message); })).listen(0, function() { let received = 0; let incoming = new Uint8Array(0); const sockBuf = new Uint8Array(8); net.connect({ port: this.address().port, onread: { buffer: sockBuf, callback: function(nread, buf) { assert.strictEqual(buf, sockBuf); received += nread; const newIncoming = new Uint8Array(incoming.length + nread); newIncoming.set(incoming); newIncoming.set(buf.slice(0, nread), incoming.length); incoming = newIncoming; } } }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { assert.strictEqual(received, message.length); assert.deepStrictEqual(incoming, new Uint8Array(message)); })); }); // Test Buffer callback usage net.createServer(common.mustCall(function(socket) { this.close(); socket.end(message); })).listen(0, function() { let received = 0; const incoming = []; const bufPool = [ Buffer.alloc(2), Buffer.alloc(2), Buffer.alloc(2) ]; let bufPoolIdx = -1; let bufPoolUsage = 0; net.connect({ port: this.address().port, onread: { buffer: () => { ++bufPoolUsage; bufPoolIdx = (bufPoolIdx + 1) % bufPool.length; return bufPool[bufPoolIdx]; }, callback: function(nread, buf) { assert.strictEqual(buf, bufPool[bufPoolIdx]); received += nread; incoming.push(Buffer.from(buf.slice(0, nread))); } } }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { assert.strictEqual(received, message.length); assert.deepStrictEqual(Buffer.concat(incoming), message); assert.strictEqual(bufPoolUsage, 7); })); }); // Test Uint8Array callback support net.createServer(common.mustCall(function(socket) { this.close(); socket.end(message); })).listen(0, function() { let received = 0; let incoming = new Uint8Array(0); const bufPool = [ new Uint8Array(2), new Uint8Array(2), new Uint8Array(2) ]; let bufPoolIdx = -1; let bufPoolUsage = 0; net.connect({ port: this.address().port, onread: { buffer: () => { ++bufPoolUsage; bufPoolIdx = (bufPoolIdx + 1) % bufPool.length; return bufPool[bufPoolIdx]; }, callback: function(nread, buf) { assert.strictEqual(buf, bufPool[bufPoolIdx]); received += nread; const newIncoming = new Uint8Array(incoming.length + nread); newIncoming.set(incoming); newIncoming.set(buf.slice(0, nread), incoming.length); incoming = newIncoming; } } }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { assert.strictEqual(received, message.length); assert.deepStrictEqual(incoming, new Uint8Array(message)); assert.strictEqual(bufPoolUsage, 7); })); }); // Test explicit socket pause net.createServer(common.mustCall(function(socket) { this.close(); socket.end(message); })).listen(0, function() { let received = 0; const buffers = []; const sockBuf = Buffer.alloc(8); let paused = false; net.connect({ port: this.address().port, onread: { buffer: sockBuf, callback: function(nread, buf) { assert.strictEqual(paused, false); assert.strictEqual(buf, sockBuf); received += nread; buffers.push(Buffer.from(buf.slice(0, nread))); paused = true; this.pause(); setTimeout(() => { paused = false; this.resume(); }, 100); } } }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { assert.strictEqual(received, message.length); assert.deepStrictEqual(Buffer.concat(buffers), message); })); }); // Test implicit socket pause net.createServer(common.mustCall(function(socket) { this.close(); socket.end(message); })).listen(0, function() { let received = 0; const buffers = []; const sockBuf = Buffer.alloc(8); let paused = false; net.connect({ port: this.address().port, onread: { buffer: sockBuf, callback: function(nread, buf) { assert.strictEqual(paused, false); assert.strictEqual(buf, sockBuf); received += nread; buffers.push(Buffer.from(buf.slice(0, nread))); paused = true; setTimeout(() => { paused = false; this.resume(); }, 100); return false; } } }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { assert.strictEqual(received, message.length); assert.deepStrictEqual(Buffer.concat(buffers), message); })); });