1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
/* -*- 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);
|