1 var fs = require('fs');
  2 var nowUtil = require('./nowUtil').nowUtil;
  3 //redirect the client/now.js to ../dist/now.min.js
  4 var clientNow = '/dist/now.js';
  5 var fileCache = {};
  6 var nowFileCache = {};
  7 
  8 var defaultListeners;
  9 var server;
 10 var options;
 11 
 12 var handleResponse, serveFile, generateClientLibs;
 13 
 14 exports.wrapServer = function (httpServer, serverOptions) {
 15   server = httpServer;
 16   options = serverOptions || {client: {}};
 17   options.client = JSON.stringify(options.client);
 18 
 19   defaultListeners = server.listeners('request');
 20   if (serverOptions.autoHost) {
 21     server.removeAllListeners('request');
 22     server.on('request', handleResponse);
 23   }
 24 };
 25 
 26 // Called upon http server request
 27 handleResponse = function (request, response) {
 28   // Handle only GET requests for /nowjs/* files. Pass all other requests through
 29   var i;
 30   if (request.method === 'GET') {
 31 
 32     // Detect if request involves the now.js file
 33     if (request.url.split('?')[0] === '/nowjs/now.js') {
 34       try {
 35         serveFile(__dirname + clientNow, request, response, options);
 36       } 
 37       catch(err) 
 38       {
 39         console.log("/client/now.js not found, while serving file");
 40         return;
 41       };
 42       
 43     } else {
 44       // Make sure default listeners are still handled
 45       for (i in defaultListeners) {
 46         if (nowUtil.hasProperty(defaultListeners, i)) {
 47           defaultListeners[i].call(server, request, response);
 48         }
 49       }
 50     }
 51   } else {
 52     for (i in defaultListeners) {
 53       // Make sure default listeners are still handled
 54       if (nowUtil.hasProperty(defaultListeners, i)) {
 55         defaultListeners[i].call(server, request, response);
 56       }
 57     }
 58   }
 59 };
 60 
 61 // Actually serve the file
 62 serveFile = function (filename, request, response, options) {
 63   // Write file from cache if possible
 64   if (nowUtil.hasProperty(fileCache, filename)) {
 65     response.writeHead(200);
 66     response.write(fileCache[filename]);
 67     response.end();
 68   } else {
 69     if (filename.indexOf('/now.js') !== -1) {
 70 
 71       // Write file from cache if possible
 72       if (nowUtil.hasProperty(nowFileCache, request.headers.host)) {
 73 
 74         // Write file from cache
 75         response.writeHead(200, {'Content-Type': 'text/javascript'});
 76         response.write(nowFileCache[request.headers.host].now);
 77         response.end();
 78       } else {
 79         // Determine hostname / port if not given in options
 80         var host = request.headers.host.split(':');
 81         var hostServer = options['host'] || host[0];
 82         var hostPort =  options['port'] || host[1] || '80';
 83 
 84         // Call generate client libs, which takes the desired host/port and executes callback with two parts of now.js as parameters
 85         generateClientLibs(hostServer, hostPort, function (nowText) {
 86 
 87           // Write to client
 88           response.writeHead(200, {'Content-Type': 'text/javascript'});
 89           response.write(nowText);
 90           response.end();
 91 
 92           // Add to cache
 93           nowFileCache[request.headers.host] = {now: nowText};
 94         });
 95       }
 96     } else {
 97       // For any other filename, read file and server (not cached)
 98       fs.readFile(filename, function (err, data) {
 99         var text = data.toString();
100         response.writeHead(200);
101         response.write(text);
102         response.end();
103         fileCache[filename] = text;
104       });
105     }
106   }
107 };
108 
109 // Takes host and port and call callback with now.js as parameter
110 generateClientLibs = function (hostServer, hostPort, callback) {
111   try {
112     fs.readFile(__dirname + clientNow, function (err, data) {
113       var nowText = data.toString();
114       var initString = options.scope + '.now = nowInitialize("' +
115           (options.protocol !==  undefined ? options.protocol + ':' : '') +
116           '//' + hostServer + ':' + hostPort + '", ' + options.client + ');\n';
117       nowText += initString;
118 
119       callback(nowText);
120   });
121   } catch(err){
122     console.log("/client/now.js not found while reading file");
123     return;
124   
125   };
126 };
127 
128 exports.generateClientLibs = generateClientLibs;
129