'use strict'; const common = require('../common'); const assert = require('assert'); const initHooks = require('./init-hooks'); const { checkInvocations } = require('./hook-checks'); const net = require('net'); const hooks = initHooks(); hooks.enable(); // // Creating server and listening on port // const server = net.createServer() .on('listening', common.mustCall(onlistening)) .on('connection', common.mustCall(onconnection)) .listen(0); assert.strictEqual(hooks.activitiesOfTypes('WRITEWRAP').length, 0); function onlistening() { assert.strictEqual(hooks.activitiesOfTypes('WRITEWRAP').length, 0); // // Creating client and connecting it to server // net .connect(server.address().port) .on('connect', common.mustCall(onconnect)); assert.strictEqual(hooks.activitiesOfTypes('WRITEWRAP').length, 0); } function checkDestroyedWriteWraps(n, stage) { const as = hooks.activitiesOfTypes('WRITEWRAP'); assert.strictEqual(as.length, n, `${as.length} out of ${n} WRITEWRAPs when ${stage}`); function checkValidWriteWrap(w) { assert.strictEqual(w.type, 'WRITEWRAP'); assert.strictEqual(typeof w.uid, 'number'); assert.strictEqual(typeof w.triggerAsyncId, 'number'); checkInvocations(w, { init: 1 }, `when ${stage}`); } as.forEach(checkValidWriteWrap); } function onconnection(conn) { conn.write('hi'); // Let the client know we're ready. conn.resume(); // // Server received client connection // checkDestroyedWriteWraps(0, 'server got connection'); } function onconnect() { // // Client connected to server // checkDestroyedWriteWraps(0, 'client connected'); this.once('data', common.mustCall(ondata)); } function ondata() { // // Writing data to client socket // const write = () => { let writeFinished = false; this.write('f'.repeat(1280000), () => { writeFinished = true; }); process.nextTick(() => { if (writeFinished) { // Synchronous finish, write more data immediately. writeFinished = false; write(); } else { // Asynchronous write; this is what we are here for. onafterwrite(this); } }); }; write(); } function onafterwrite(self) { checkDestroyedWriteWraps(1, 'client destroyed'); self.end(); checkDestroyedWriteWraps(1, 'client destroyed'); // // Closing server // server.close(common.mustCall(onserverClosed)); checkDestroyedWriteWraps(1, 'server closing'); } function onserverClosed() { checkDestroyedWriteWraps(1, 'server closed'); } process.on('exit', onexit); function onexit() { hooks.disable(); hooks.sanityCheck('WRITEWRAP'); checkDestroyedWriteWraps(1, 'process exits'); }