|  | @@ -0,0 +1,62 @@
 | 
	
		
			
				|  |  | +var express   = require('express');
 | 
	
		
			
				|  |  | +var fs        = require('fs');
 | 
	
		
			
				|  |  | +var io        = require('socket.io');
 | 
	
		
			
				|  |  | +var _         = require('underscore');
 | 
	
		
			
				|  |  | +var Mustache  = require('mustache');
 | 
	
		
			
				|  |  | +var crypto		= require('crypto');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +var app       = express.createServer();
 | 
	
		
			
				|  |  | +var staticDir = express.static;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +io            = io.listen(app);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +var opts = {
 | 
	
		
			
				|  |  | +	port :      1948,
 | 
	
		
			
				|  |  | +	baseDir :   __dirname + '/../../'
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +io.sockets.on('connection', function(socket) {
 | 
	
		
			
				|  |  | +	socket.on('slidechanged', function(slideData) {
 | 
	
		
			
				|  |  | +		console.log(slideData);
 | 
	
		
			
				|  |  | +		if (createHash(slideData.secret) === slideData.socketId) {
 | 
	
		
			
				|  |  | +			slideData.secret = null;
 | 
	
		
			
				|  |  | +			socket.broadcast.emit(slideData.socketId, slideData);
 | 
	
		
			
				|  |  | +		};
 | 
	
		
			
				|  |  | +	});
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +app.configure(function() {
 | 
	
		
			
				|  |  | +	[ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) {
 | 
	
		
			
				|  |  | +		app.use('/' + dir, staticDir(opts.baseDir + dir));
 | 
	
		
			
				|  |  | +	});
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +app.get("/", function(req, res) {
 | 
	
		
			
				|  |  | +	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +app.get("/token", function(req,res) {
 | 
	
		
			
				|  |  | +	var ts = new Date().getTime();
 | 
	
		
			
				|  |  | +	var rand = Math.floor(Math.random()*9999999);
 | 
	
		
			
				|  |  | +	var secret = ts.toString() + rand.toString();
 | 
	
		
			
				|  |  | +	res.send({secret: secret, socketId: createHash(secret)});
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +var createHash = function(secret) {
 | 
	
		
			
				|  |  | +	var cipher = crypto.createCipher('blowfish', secret);
 | 
	
		
			
				|  |  | +	return(cipher.final('hex'));
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Actually listen
 | 
	
		
			
				|  |  | +app.listen(opts.port || null);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +var brown = '\033[33m', 
 | 
	
		
			
				|  |  | +	green = '\033[32m', 
 | 
	
		
			
				|  |  | +	reset = '\033[0m';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +console.log( brown + "reveal.js - Speaker Notes" + reset );
 | 
	
		
			
				|  |  | +console.log( "1. Open the slides at " + green + slidesLocation + reset );
 | 
	
		
			
				|  |  | +console.log( "2. Click on the link your JS console to go to the notes page" );
 | 
	
		
			
				|  |  | +console.log( "3. Advance through your slides and your notes will advance automatically" );
 |