/* -*- mode:javascript; coding:utf-8; -*- */ 'use strict'; var PORT = 3000; var REDISKEY_URL_QUEUE = 'url.queue'; var REDISKEY_URL_SEQ = 'url.seq'; var URL_QUEUE_MAXLEN = 10; var express = require('express'); var routes = require('./routes'); var app = express(); var redis = require('redis').createClient(); var server = require('http').createServer(app); var io = require('socket.io').listen(server); app.set('view engine', 'jade'); app.set('views', __dirname + '/views'); app.engine('jade', require('jade').__express); //app.use(express.bodyParser()); //app.use(express.methodOverride()); app.use(app.router); app.use(express.static(__dirname + '/public')); switch (app.get('env')) { case 'development': app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); break; case 'production': app.use(express.errorHandler()); break } app.get('/', routes.index); app.get('/chat', routes.chat); server.listen(PORT); io.sockets.on('connection', function (socket) { socket.emit('message', { message: 'ready' }); socket.on('send', function (data) { var m = data.message.match(/(?:https?:\/\/)(?:[\da-z\.-]+)(?:\.(?:[a-z\.]{2,6}))?(?:\:\d+)?(?:[\/\w\.-]*)*\/?/ig); if (m) { var length = m.length; redis.incrby(REDISKEY_URL_SEQ, length, function (e, v) { var timestamp = Date.now(); var xs = m.map(function (url, i) { return JSON.stringify({ seq: v - length + i + 1, timestamp: timestamp, url: url }); }); xs.unshift(REDISKEY_URL_QUEUE); redis.send_command('rpush', xs); redis.ltrim(REDISKEY_URL_QUEUE, -URL_QUEUE_MAXLEN, -1); redis.lrange(REDISKEY_URL_QUEUE, -URL_QUEUE_MAXLEN, -1, function (e, queue) { if (queue) { data.queue = queue; } io.sockets.emit('message', data); }); }); } else { io.sockets.emit('message', data); } }); }); console.log("listening on port %d (env=%s)", server.address().port, app.settings.env);