node-continuation-local-storage icon indicating copy to clipboard operation
node-continuation-local-storage copied to clipboard

net-events 'close' not preserving state

Open ericwaldheim opened this issue 11 years ago • 2 comments

If I modify net-events.tap.js to have the server do socket.destroy() rather than a socket.end(), I get a 'close' event in the client that does not get the client.write cls. Should the 'close' event preserve the cls state? Thank you.

Here is the modified net-events.tap.js

'use strict';

var net             = require('net')
  , tap             = require('tap')
  , test            = tap.test
  , createNamespace = require('../context').createNamespace
  ;

test("continuation-local state with net connection", function (t) {
  t.plan(4);

  var namespace = createNamespace('net');
  namespace.run(function () {
    namespace.set('test', 0xabad1dea);

    var server;
    namespace.run(function () {
      namespace.set('test', 0x1337);

      server = net.createServer(function (socket) {
        t.equal(namespace.get('test'), 0x1337, "state has been mutated");
        socket.on("data", function () {
          t.equal(namespace.get('test'), 0x1337, "state is still preserved");
      socket.destroy(); // DESTROY RATHER THAN END
          server.close();
//           socket.end("GoodBye");
        });
      });
      server.listen(function () {
        var address = server.address();
        namespace.run(function () {
          namespace.set("test", "MONKEY");
          var client = net.connect(address.port, function () {
            t.equal(namespace.get("test"), "MONKEY",
                    "state preserved for client connection");
            client.write("Hello");
            client.on("data", function () {
              t.equal(namespace.get("test"), "MONKEY", "state preserved for client data");
            });
            client.on("close", function () { // CLOSE EVENT NOT GETTING CLS STATE
           t.equal(namespace.get("test"), "MONKEY", "state preserved for client close");
              t.end();
            });

          });
        });
      });
    });
  });
});

ericwaldheim avatar Feb 07 '14 15:02 ericwaldheim

I'll need to do some investigation to figure out if this is a problem with CLS or the underlying asyncListener API, but until I have a chance to do that, what's the use case here? Why would you be calling .destroy() from your code?

othiym23 avatar Feb 08 '14 06:02 othiym23

The use case is a custom-protocol server with clients (that we do not write) that close the socket at any point in any way. I call .destroy() only from test to simulate "at any point in any way" and generate the 'close' event that the server occasionally sees. Thank you.

On Feb 7, 2014, at 11:36 PM, Forrest L Norvell [email protected] wrote:

I'll need to do some investigation to figure out if this is a problem with CLS or the underlying asyncListener API, but until I have a chance to do that, what's the use case here? Why would you be calling .destroy() from your code?

— Reply to this email directly or view it on GitHub.

ericwaldheim avatar Feb 08 '14 14:02 ericwaldheim