From 45caad3c3cc1edd6d6ae83d8cf4c443ef7da70b2 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Thu, 26 Apr 2012 22:19:31 -0400 Subject: [PATCH] Using coffee instead (derby new --coffee first-project) --- .gitignore | 1 + Makefile | 2 + lib/app/index.js | 83 ----------------------------------- lib/server/index.js | 53 ---------------------- lib/server/serverError.js | 21 --------- package.json | 5 ++- src/app/index.coffee | 66 ++++++++++++++++++++++++++++ src/server/index.coffee | 51 +++++++++++++++++++++ src/server/serverError.coffee | 18 ++++++++ 9 files changed, 142 insertions(+), 158 deletions(-) create mode 100644 Makefile delete mode 100644 lib/app/index.js delete mode 100644 lib/server/index.js delete mode 100644 lib/server/serverError.js create mode 100644 src/app/index.coffee create mode 100644 src/server/index.coffee create mode 100644 src/server/serverError.coffee diff --git a/.gitignore b/.gitignore index 2cc7b00606..6531ddc484 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store public/gen node_modules +lib/ *.swp diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..e27a82a557 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +compile: + ./node_modules/coffee-script/bin/coffee -bw -o ./lib -c ./src diff --git a/lib/app/index.js b/lib/app/index.js deleted file mode 100644 index 33e25b9301..0000000000 --- a/lib/app/index.js +++ /dev/null @@ -1,83 +0,0 @@ -var app = require('derby').createApp(module) - , get = app.get - , view = app.view - , ready = app.ready - , start - -// ROUTES // - -start = +new Date() - -// Derby routes can be rendered on the client and the server -get('/:roomName?', function(page, model, params) { - var roomName = params.roomName || 'home' - - // Subscribes the model to any updates on this room's object. Calls back - // with a scoped model equivalent to: - // room = model.at('rooms.' + roomName) - model.subscribe('rooms.' + roomName, function(err, room) { - model.ref('_room', room) - - // setNull will set a value if the object is currently null or undefined - room.setNull('welcome', 'Welcome to ' + roomName + '!') - - room.incr('visits') - - // This value is set for when the page initially renders - model.set('_timer', '0.0') - // Reset the counter when visiting a new route client-side - start = +new Date() - - // Render will use the model data as well as an optional context object - page.render({ - roomName: roomName - , randomUrl: parseInt(Math.random() * 1e9).toString(36) - }) - }) -}) - - -// CONTROLLER FUNCTIONS // - -ready(function(model) { - var timer - - // Expose the model as a global variable in the browser. This is fun in - // development, but it should be removed when writing an app - window.model = model - - // Exported functions are exposed as a global in the browser with the same - // name as the module that includes Derby. They can also be bound to DOM - // events using the "x-bind" attribute in a template. - exports.stop = function() { - - // Any path name that starts with an underscore is private to the current - // client. Nothing set under a private path is synced back to the server. - model.set('_stopped', true) - clearInterval(timer) - } - - exports.start = function() { - model.set('_stopped', false) - timer = setInterval(function() { - model.set('_timer', (((+new Date()) - start) / 1000).toFixed(1)) - }, 100) - } - exports.start() - - - model.set('_showReconnect', true) - exports.connect = function() { - // Hide the reconnect link for a second after clicking it - model.set('_showReconnect', false) - setTimeout(function() { - model.set('_showReconnect', true) - }, 1000) - model.socket.socket.connect() - } - - exports.reload = function() { - window.location.reload() - } - -}) diff --git a/lib/server/index.js b/lib/server/index.js deleted file mode 100644 index 5b04574623..0000000000 --- a/lib/server/index.js +++ /dev/null @@ -1,53 +0,0 @@ -var http = require('http') - , path = require('path') - , express = require('express') - , gzippo = require('gzippo') - , derby = require('derby') - , app = require('../app') - , serverError = require('./serverError') - - -// SERVER CONFIGURATION // - -var ONE_YEAR = 1000 * 60 * 60 * 24 * 365 - , root = path.dirname(path.dirname(__dirname)) - , publicPath = path.join(root, 'public') - , expressApp, server, store - -;(expressApp = express()) - .use(express.favicon()) - // Gzip static files and serve from memory - .use(gzippo.staticGzip(publicPath, {maxAge: ONE_YEAR})) - - // Gzip dynamically rendered content - .use(express.compress()) - - // Uncomment to add form data parsing support - // .use(express.bodyParser()) - // .use(express.methodOverride()) - - // Derby session middleware creates req.model and subscribes to _session - // .use(express.cookieParser('secret_sauce')) - // .use(express.session({ - // cookie: {maxAge: ONE_YEAR} - // }) - // .use(app.session()) - - // The router method creates an express middleware from the app's routes - .use(app.router()) - .use(expressApp.router) - .use(serverError(root)) - -module.exports = server = http.createServer(expressApp) - - -// SERVER ONLY ROUTES // - -expressApp.all('*', function(req) { - throw '404: ' + req.url -}) - - -// STORE SETUP // - -store = app.createStore({listen: server}) diff --git a/lib/server/serverError.js b/lib/server/serverError.js deleted file mode 100644 index 3d24be86ec..0000000000 --- a/lib/server/serverError.js +++ /dev/null @@ -1,21 +0,0 @@ -var derby = require('derby') - , isProduction = derby.util.isProduction - -module.exports = function(root) { - var staticPages = derby.createStatic(root) - - return function(err, req, res, next) { - if (err == null) return next() - - console.log(err.stack ? err.stack : err) - - // Customize error handling here - var message = err.message || err.toString() - , status = parseInt(message) - if (status === 404) { - staticPages.render('404', res, {url: req.url}, 404) - } else { - res.send( ((status >= 400) && (status < 600)) ? status : 500) - } - } -} diff --git a/package.json b/package.json index 2eebe98495..bf1b2d9dbf 100644 --- a/package.json +++ b/package.json @@ -8,5 +8,8 @@ "express": "3.x", "gzippo": ">=0.1.4" }, - "private": true + "private": true, + "devDependencies": { + "coffee-script": ">=1.2" + } } \ No newline at end of file diff --git a/src/app/index.coffee b/src/app/index.coffee new file mode 100644 index 0000000000..a0161fe406 --- /dev/null +++ b/src/app/index.coffee @@ -0,0 +1,66 @@ +{get, view, ready} = require('derby').createApp module + +## ROUTES ## + +start = +new Date() + +# Derby routes can be rendered on the client and the server +get '/:roomName?', (page, model, {roomName}) -> + roomName ||= 'home' + + # Subscribes the model to any updates on this room's object. Calls back + # with a scoped model equivalent to: + # room = model.at "rooms.#{roomName}" + model.subscribe "rooms.#{roomName}", (err, room) -> + model.ref '_room', room + + # setNull will set a value if the object is currently null or undefined + room.setNull 'welcome', "Welcome to #{roomName}!" + + room.incr 'visits' + + # This value is set for when the page initially renders + model.set '_timer', '0.0' + # Reset the counter when visiting a new route client-side + start = +new Date() + + # Render will use the model data as well as an optional context object + page.render + roomName: roomName + randomUrl: parseInt(Math.random() * 1e9).toString(36) + + +## CONTROLLER FUNCTIONS ## + +ready (model) -> + timer = null + + # Expose the model as a global variable in the browser. This is fun in + # development, but it should be removed when writing an app + window.model = model + + # Exported functions are exposed as a global in the browser with the same + # name as the module that includes Derby. They can also be bound to DOM + # events using the "x-bind" attribute in a template. + exports.stop = -> + + # Any path name that starts with an underscore is private to the current + # client. Nothing set under a private path is synced back to the server. + model.set '_stopped', true + clearInterval timer + + do exports.start = -> + model.set '_stopped', false + timer = setInterval -> + model.set '_timer', (((+new Date()) - start) / 1000).toFixed(1) + , 100 + + + model.set '_showReconnect', true + exports.connect = -> + # Hide the reconnect link for a second after clicking it + model.set '_showReconnect', false + setTimeout (-> model.set '_showReconnect', true), 1000 + model.socket.socket.connect() + + exports.reload = -> window.location.reload() diff --git a/src/server/index.coffee b/src/server/index.coffee new file mode 100644 index 0000000000..165bf8d1f1 --- /dev/null +++ b/src/server/index.coffee @@ -0,0 +1,51 @@ +http = require 'http' +path = require 'path' +express = require 'express' +gzippo = require 'gzippo' +derby = require 'derby' +app = require '../app' +serverError = require './serverError' + + +## SERVER CONFIGURATION ## + +ONE_YEAR = 1000 * 60 * 60 * 24 * 365 +root = path.dirname path.dirname __dirname +publicPath = path.join root, 'public' + +(expressApp = express()) + .use(express.favicon()) + # Gzip static files and serve from memory + .use(gzippo.staticGzip publicPath, maxAge: ONE_YEAR) + + # Gzip dynamically rendered content + .use(express.compress()) + + # Uncomment to add form data parsing support + # .use(express.bodyParser()) + # .use(express.methodOverride()) + + # Derby session middleware creates req.model and subscribes to _session + # .use(express.cookieParser 'secret_sauce') + # .use(express.session + # cookie: {maxAge: ONE_YEAR} + # ) + # .use(app.session()) + + # The router method creates an express middleware from the app's routes + .use(app.router()) + .use(expressApp.router) + .use(serverError root) + +module.exports = server = http.createServer expressApp + + +## SERVER ONLY ROUTES ## + +expressApp.all '*', (req) -> + throw "404: #{req.url}" + + +## STORE SETUP ## + +store = app.createStore listen: server diff --git a/src/server/serverError.coffee b/src/server/serverError.coffee new file mode 100644 index 0000000000..e1b489de60 --- /dev/null +++ b/src/server/serverError.coffee @@ -0,0 +1,18 @@ +derby = require 'derby' +{isProduction} = derby.util + +module.exports = (root) -> + staticPages = derby.createStatic root + + return (err, req, res, next) -> + return next() unless err? + + console.log(if err.stack then err.stack else err) + + ## Customize error handling here ## + message = err.message || err.toString() + status = parseInt message + if status is 404 + staticPages.render '404', res, {url: req.url}, 404 + else + res.send if 400 <= status < 600 then status else 500