From 7ddd48cc8d0186d4aaa37b792eb75815e5e6451a Mon Sep 17 00:00:00 2001 From: Donghwan Kim Date: Wed, 3 May 2017 23:06:06 +0900 Subject: [PATCH] Replace setters with a dedicated option object Fixes #12 --- lib/server.js | 22 ++++------- test/client.js | 50 ++++++++++++++---------- test/testee/server.js | 91 +++++++++++++++++++++++-------------------- 3 files changed, 87 insertions(+), 76 deletions(-) diff --git a/lib/server.js b/lib/server.js index 84c3af1..15c32a0 100644 --- a/lib/server.js +++ b/lib/server.js @@ -14,26 +14,20 @@ var traverse = require("traverse"); // This function is exposed to the module's `createServer` as a factory to create a server which // consumes transport and produces socket. -module.exports = function() { +module.exports = function(options) { // A server object. var self = new events.EventEmitter(); // A repository of sockets consisting of opened socket and closed socket only. A socket has id // but it doesn't need to be public now so that array is used to hide it. self.sockets = []; // Options to configure server and client. - var options = { - // A heartbeat interval in milliseconds. - heartbeat: 20000, - // This is just to speed up heartbeat test and should not work in production. It means the time - // to wait for this server's response. The default value is `5000`. - _heartbeat: 5000 - }; - self.setHeartbeat = function(heartbeat) { - options.heartbeat = +heartbeat; - }; - self.set_heartbeat = function(_heartbeat) { - options._heartbeat = +_heartbeat; - }; + options = options || {}; + // A heartbeat interval in milliseconds. + options.heartbeat = options.heartbeat || 20000; + // This is just to speed up heartbeat test and should not work in production. It means the time + // to wait for this server's response. The default value is `5000`. + options._heartbeat = options._heartbeat || 5000; + // A link between Cettia protocol and Cettia transport protocol. `transport` is expected to be // passed from Cettia transport server. self.handle = function(transport) { diff --git a/test/client.js b/test/client.js index 22d5256..8eb743f 100644 --- a/test/client.js +++ b/test/client.js @@ -34,14 +34,6 @@ describe("client", function() { // To be destroyed var sockets = []; var netSockets = []; - // A Cettia server - var server = cettia.createServer(); - server.on("socket", function(socket) { - sockets.push(socket); - socket.on("close", function() { - sockets.splice(sockets.indexOf(socket), 1); - }); - }); // An HTTP server to install Cettia server var httpServer = http.createServer(); httpServer.on("connection", function(socket) { @@ -51,23 +43,35 @@ describe("client", function() { }); }); var httpTransportServer = cettia.transport.createHttpServer(); - httpTransportServer.on("transport", server.handle); + httpTransportServer.on("transport", function(transport) { + server.handle(transport); + }); httpServer.on("request", function(req, res) { if (url.parse(req.url).pathname === "/cettia") { httpTransportServer.handle(req, res); } }); var wsTransportServer = cettia.transport.createWebSocketServer(); - wsTransportServer.on("transport", server.handle); + wsTransportServer.on("transport", function(transport) { + server.handle(transport); + }); httpServer.on("upgrade", function(req, sock, head) { if (url.parse(req.url).pathname === "/cettia") { wsTransportServer.handle(req, sock, head); } }); + function setupServer(options) { + server = cettia.createServer(options); + server.on("socket", function(socket) { + sockets.push(socket); + socket.on("close", function() { + sockets.splice(sockets.indexOf(socket), 1); + }); + }); + } + function run(options) { - server.setHeartbeat(options.heartbeat || 20000); - server.set_heartbeat(options._heartbeat || 5000); var params = { uri: "http://localhost:" + httpServer.address().port + "/cettia" }; @@ -107,14 +111,7 @@ describe("client", function() { done(); }); }); - beforeEach(function() { - // To restore the original stack - this.socketListeners = server.listeners("socket"); - }); afterEach(function() { - // Remove the listener added by the test and restore the original stack - server.removeAllListeners("socket"); - this.socketListeners.forEach(server.on.bind(server, "socket")); // To release stress of browsers, clean sockets sockets.forEach(function(socket) { socket.close(); @@ -122,12 +119,14 @@ describe("client", function() { }); factory.create("should open a new socket", function(done) { + setupServer(); server.on("socket", function(socket) { done(); }); run({transport: this.args.transport}); }); factory.create("should close the socket", function(done) { + setupServer(); server.on("socket", function(socket) { socket.on("open", function() { socket.send("abort"); @@ -139,6 +138,7 @@ describe("client", function() { run({transport: this.args.transport}); }); factory.create("should exchange a text event", function(done) { + setupServer(); server.on("socket", function(socket) { socket.on("open", function() { socket.send("echo", "data"); @@ -151,6 +151,7 @@ describe("client", function() { run({transport: this.args.transport}); }); factory.create("should exchange a binary event", function(done) { + setupServer(); server.on("socket", function(socket) { socket.on("open", function() { socket.send("echo", Buffer("data")); @@ -163,6 +164,7 @@ describe("client", function() { run({transport: this.args.transport}); }); factory.create("should exchange a composite event", function(done) { + setupServer(); server.on("socket", function(socket) { socket.on("open", function() { socket.send("echo", {text: "data", binary: Buffer("data")}); @@ -175,6 +177,7 @@ describe("client", function() { run({transport: this.args.transport}); }); factory.create("should exchange an event containing of multi-byte characters", function(done) { + setupServer(); server.on("socket", function(socket) { socket.on("open", function() { socket.send("echo", "라면"); @@ -187,6 +190,7 @@ describe("client", function() { run({transport: this.args.transport}); }); factory.create("should exchange an event of 2KB", function(done) { + setupServer(); var text2KB = Array(2048).join("K"); server.on("socket", function(socket) { socket.on("open", function() { @@ -200,6 +204,7 @@ describe("client", function() { run({transport: this.args.transport}); }); factory.create("should not lose any event in an exchange of twenty events", function(done) { + setupServer(); var timer, sent = [], received = []; server.on("socket", function(socket) { socket.on("open", function() { @@ -220,6 +225,7 @@ describe("client", function() { run({transport: this.args.transport}); }); factory.create("should close the socket if heartbeat fails", function(done) { + setupServer({heartbeat: 2500, _heartbeat: 2400}); server.on("socket", function(socket) { // Breaks heartbeat functionality socket.send = function() { @@ -231,10 +237,11 @@ describe("client", function() { done(); }); }); - run({transport: this.args.transport, heartbeat: 2500, _heartbeat: 2400}); + run({transport: this.args.transport}); }); describe("reply", function() { factory.create("should execute the resolve callback when receiving event", function(done) { + setupServer(); server.on("socket", function(socket) { socket.on("open", function() { socket.send("/reply/inbound", {type: "resolved", data: Math.PI}, function(value) { @@ -248,6 +255,7 @@ describe("client", function() { run({transport: this.args.transport}); }); factory.create("should execute the reject callback when receiving event", function(done) { + setupServer(); server.on("socket", function(socket) { socket.on("open", function() { socket.send("/reply/inbound", {type: "rejected", data: Math.PI}, function() { @@ -261,6 +269,7 @@ describe("client", function() { run({transport: this.args.transport}); }); factory.create("should execute the resolve callback when sending event", function(done) { + setupServer(); server.on("socket", function(socket) { socket.on("open", function() { socket.send("/reply/outbound", {type: "resolved", data: Math.E}); @@ -276,6 +285,7 @@ describe("client", function() { run({transport: this.args.transport}); }); factory.create("should execute the reject callback when sending event", function(done) { + setupServer(); server.on("socket", function(socket) { socket.on("open", function() { socket.send("/reply/outbound", {type: "rejected", data: Math.E}) diff --git a/test/testee/server.js b/test/testee/server.js index c120dd9..dd75240 100644 --- a/test/testee/server.js +++ b/test/testee/server.js @@ -2,57 +2,57 @@ var cettia = require("../../lib/index"); var url = require("url"); var http = require("http"); -var server = cettia.createServer(); -server.on("socket", function(socket) { - socket.on("error", function() { - }) - .on("abort", function() { - this.close(); - }) - .on("echo", function(data) { - socket.send("echo", data); - }); - // reply - socket.on("/reply/inbound", function(data, reply) { - switch (data.type) { - case "resolved": - reply.resolve(data.data); - break; - case "rejected": - reply.reject(data.data); - break; - } - }) - .on("/reply/outbound", function(data) { - switch (data.type) { - case "resolved": - this.send("test", data.data, function(data) { - this.send("done", data); - }); - break; - case "rejected": - this.send("test", data.data, null, function(data) { - this.send("done", data); - }); - break; - } - }); -}); - +var server; var httpServer = http.createServer(); -var httpTransportServer = cettia.transport.createHttpServer(); -httpTransportServer.on("transport", server.handle); httpServer.on("request", function(req, res) { var urlObj = url.parse(req.url, true); var query = urlObj.query; switch (urlObj.pathname) { case "/setup": + var options = {}; if (query.heartbeat) { - server.setHeartbeat(+query.heartbeat); + options.heartbeat = +query.heartbeat; } if (query._heartbeat) { - server.set_heartbeat(+query._heartbeat); + options._heartbeat = +query._heartbeat; } + + server = cettia.createServer(options); + server.on("socket", function(socket) { + socket.on("error", function() { + }) + .on("abort", function() { + this.close(); + }) + .on("echo", function(data) { + socket.send("echo", data); + }); + // reply + socket.on("/reply/inbound", function(data, reply) { + switch (data.type) { + case "resolved": + reply.resolve(data.data); + break; + case "rejected": + reply.reject(data.data); + break; + } + }) + .on("/reply/outbound", function(data) { + switch (data.type) { + case "resolved": + this.send("test", data.data, function(data) { + this.send("done", data); + }); + break; + case "rejected": + this.send("test", data.data, null, function(data) { + this.send("done", data); + }); + break; + } + }); + }); res.end(); break; case "/cettia": @@ -60,8 +60,15 @@ httpServer.on("request", function(req, res) { break; } }); + +var httpTransportServer = cettia.transport.createHttpServer(); +httpTransportServer.on("transport", function(transport) { + server.handle(transport); +}); var wsTransportServer = cettia.transport.createWebSocketServer(); -wsTransportServer.on("transport", server.handle); +wsTransportServer.on("transport", function(transport) { + server.handle(transport); +}); httpServer.on("upgrade", function(req, sock, head) { if (url.parse(req.url).pathname === "/cettia") { wsTransportServer.handle(req, sock, head);