Skip to content

Commit

Permalink
fixed new way of default server start
Browse files Browse the repository at this point in the history
  • Loading branch information
Henrik Vendelbo authored and Henrik Vendelbo committed Aug 23, 2015
1 parent 6ee5c34 commit f6f6e9e
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 73 deletions.
2 changes: 1 addition & 1 deletion lib/cli/generate.js
Expand Up @@ -157,7 +157,7 @@ exports.generate = function(program) {

/* Generate app.js */
appjs = '// My SocketStream 0.4 app\n\nvar ss = require(\'socketstream\');\n\n'+
'// Define a single-page client called \'main\'\nss.client.define(\'main\', {\n view: \'app.' + viewExtension + '\',\n css: [\'' + (clientFiles.css.join('\', \'')) + '\'],\n code: [\'' + (clientFiles.code.join('\', \'')) + '\'],\n tmpl: \'*\'\n});\n\n// Serve this client on the root URL\nss.http.route(\'/\', function(req, res){\n res.serveClient(\'main\');\n});\n';
'// Define a single-page client called \'main\'\nss.client.define(\'main\', {\n view: \'app.' + viewExtension + '\',\n css: [\'' + (clientFiles.css.join('\', \'')) + '\'],\n code: [\'' + (clientFiles.code.join('\', \'')) + '\'],\n tmpl: \'chat\'\n});\n\n// Serve this client on the root URL\nss.http.route(\'/\', function(req, res){\n res.serveClient(\'main\');\n});\n';

/* List any selected formatters */
if (selectedFormatters.length > 0) {
Expand Down
113 changes: 57 additions & 56 deletions lib/socketstream.js
Expand Up @@ -85,9 +85,16 @@ var api = exports.api = {
*/
orchestrator: orchestrator,

// This is an experimental API, expect changes
task: task,

log: log,
session: session,

// loading http, client and ws
load: load,
unload: unload,

/**
* @ngdoc function
* @name ss.add
Expand Down Expand Up @@ -122,7 +129,7 @@ var events = exports.events = api.events = new EventEmitter2();
var publish = exports.publish = require('./publish/index')();

// HTTP
var http = exports.http = require('./http/index')(root);
var http = exports.http = api.http = require('./http/index')(root);

// Client Asset Manager
var client = exports.client = require('./client/index')(api);
Expand Down Expand Up @@ -152,9 +159,8 @@ api.server = {};

function getServer() {
if (api.server.responders == null) {
api.server.responders = responders.load();
api.server.eventTransport = publish.transport.load();
api.server.sessionStore = session.store.get();
api.server.responders = responders.load();
api.server.eventTransport = publish.transport.load();

// Extend the internal API with a publish object you can call from your own server-side code
api.publish = publish.api(api.server.eventTransport);
Expand All @@ -168,17 +174,53 @@ var responders = exports.responders = require('./request/index')(api);
// Websocket Layer (transport, message responders, transmit incoming events)
var ws = exports.ws = require('./websocket/index')(api);

// Only one instance of the server can be started at once
var serverInstance = null;

// In the future the server will just be a middleware to use
// Ensure server can only be started once
exports.start = function() {
return serverInstance || (serverInstance = start.apply(null,arguments));
};

exports.stream = api.stream = stream;

function stream(httpServer) {

api.log.info('Starting SocketStream %s in %s mode...'.green, version, env);
var server = getServer();
server.httpServer = httpServer;
}

var loaded = false;

function load() {
if (loaded) return;
loaded = true;

api.log.info('Starting SocketStream %s in %s mode...'.green, version, env);

var server = getServer();

// Bind responders to websocket
ws.load(server.httpServer, server.responders, server.eventTransport, session.options);
ws.load(server.httpServer, server.responders, server.eventTransport, api.session.options);

// Append SocketStream middleware to stack
http.load(client.options.dirs['static'], client.options.dirs['assets'], session.store.get(), session.options);

// Load Client Asset Manager
client.load();

}

function unload() {
loaded = false;

tasks.unload();
client.unload();
http.unload();
ws.unload();
}

/**
* @ngdoc function
* @name start
Expand All @@ -189,66 +231,25 @@ function stream(httpServer) {
function start() {

var plan = tasks.plan(arguments),
httpServer = plan.httpServer,
targets = plan.targets;

var server = getServer();
server = getServer();

// Hook in streaming if called with HTTP server
if (httpServer) {
stream(httpServer);
if (plan.httpServer) {
stream(plan.httpServer);
}

tasks.load(http, client, session);
tasks.load(http);

tasks.start(targets);
tasks.start(plan.targets);

process.on('exit', function() {
tasks.unload();
client.unload();
http.unload();
ws.unload();
api.unload();
});
// If no HTTP server is passed return an API to allow for server-side testing
// Note this feature is currently considered 'experimental' and the implementation will
// be changed in SocketStream 0.4 to ensure any type of Request Responder can be tested
// } else {
// var sessionID = session.create();

// // jshint loopfunc:true
// for (var id in server.responders) {
// if (server.responders.hasOwnProperty(id)) {
// var responder = api.server.responders[id];

// if (responder.name && responder.interfaces.internal) {
// var fn = function(){
// var args = Array.prototype.slice.call(arguments),
// cb = args.pop();

// return responder.interfaces.internal(args, {sessionId: sessionID, transport: 'test'}, function(err, params){ cb(params); });
// };
// api.add(responder.name, fn); // interesting, potential or hack?
// }
// }
// }
// //TODO should client.start("build",function(){}) be called ?
// }

return api;
}

// Only one instance of the server can be started at once
var serverInstance = null;

// In the future the server will just be a middleware to use
// Ensure server can only be started once
exports.start = function() {
return serverInstance || (serverInstance = start.apply(null,arguments));
};

exports.stream = api.stream = stream;

// This is an experimental API, expect changes
exports.task = function task(name, dependents, fn) {
function task(name, dependents, fn) {
orchestrator.add(name, dependents, fn);
};
}

24 changes: 9 additions & 15 deletions lib/tasks/index.js
Expand Up @@ -31,26 +31,24 @@ module.exports = function(ss, router, options) {
},

// the passing of http is temporary, not the best dependency
load: function(ss_http, client, session) {
load: function() {

// if the app doesn't define how to start the server, this is the default
if (!ss.orchestrator.hasTask('start-server')) {
ss.orchestrator.add('start-server',function(done) {
var server = http.Server(ss_http.middleware);
var server = http.Server(ss.http.middleware);
server.listen(3000, function() {
ss.stream(server); // probably shouldn't be on internal API
ss.stream(server);
console.log('server started');
done();
});
});
}

ss.orchestrator.add('load-socketstream', function() {
// Append SocketStream middleware to stack
ss_http.load(client.options.dirs['static'], client.options.dirs['assets'], ss.server.sessionStore, session.options);

// Load Client Asset Manager
client.load();

// if the server was passed in ss.start(httpServer) one shouldn't be started
ss.orchestrator.add('load-socketstream', (ss.server.httpServer == null)? ['start-server']:[], function() {
console.log('loading socketstream');
ss.load();
});

// task: ondemand
Expand Down Expand Up @@ -89,11 +87,7 @@ module.exports = function(ss, router, options) {
if (!ss.orchestrator.hasTask('default')) {
var defaultTasks = [];

// if the server was passed in ss.start(httpServer) one shouldn't be started
if (ss.server.httpServer == null) {
defaultTasks.push('start-server');
}
defaultTasks.push('load-socketstream');
defaultTasks.push('load-socketstream');
if (options.packedAssets) {
defaultTasks.push(options.packedAssets.all? 'pack-all':'pack-if-needed');
} else {
Expand Down
2 changes: 1 addition & 1 deletion test/unit/client/index.test.js
Expand Up @@ -145,7 +145,7 @@ describe('client asset manager', function () {
ss.client.load();
ss.tasks.load(ss.http);

ss.api.orchestrator.tasks.default.dep.should.eql(['start-server','load-socketstream','pack-if-needed','live-reload','serve']);
ss.api.orchestrator.tasks.default.dep.should.eql(['load-socketstream','pack-if-needed','live-reload','serve']);
ss.api.orchestrator.tasks['pack-if-needed'].dep.should.eql(['pack-report','abc:pack']);

ss.tasks.start(['pack-if-needed'],function() {
Expand Down

0 comments on commit f6f6e9e

Please sign in to comment.