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