Skip to content

Commit 37a8ec7

Browse files
committed
Initial version
1 parent 9f1d76d commit 37a8ec7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+425
-0
lines changed

app/controllers/messages/create.js

Whitespace-only changes.

app/controllers/messages/delete.js

Whitespace-only changes.

app/controllers/messages/edit.js

Whitespace-only changes.

app/http.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
var express = require('express');
2+
var serveStatic = require('serve-static');
3+
var bodyParser = require('body-parser');
4+
var session = require('express-session');
5+
var RedisStore = require('connect-redis')(session);
6+
7+
function appCtor(cfg, pool) {
8+
var app = express();
9+
10+
app.set('trust proxy', true);
11+
app.set('view engine', 'jade');
12+
app.set('views', __dirname + '/views');
13+
app.use(serveStatic(__dirname + '/static'));
14+
app.use(session({
15+
store: new RedisStore({
16+
host: cfg.redis.hostname,
17+
port: cfg.redis.port}),
18+
secret: cfg.env.SECRET_KEY_BASE,
19+
resave: false,
20+
saveUninitialized: false
21+
}));
22+
app.use(function (req, res, next) {
23+
if (!req.session) {
24+
return next(new Error("couldn't find sessions"));
25+
}
26+
else return next();
27+
});
28+
app.use(bodyParser.urlencoded({ extended: false }));
29+
30+
app.get('/', function(req, res) {
31+
return res.render('index');
32+
});
33+
app.get('/m', function(req, res) {
34+
return res.render('messaging');
35+
});
36+
37+
return app;
38+
}

app/pool.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
var r = require('rethinkdb');
2+
var endex = require('endex');
3+
var Promise = require('bluebird');
4+
5+
module.exports = function poolCtor(cfg) {
6+
var pool = {};
7+
var serverReportError = console.error.bind(console);
8+
9+
var conn;
10+
11+
function runQueryNormally(query) {
12+
return query.run(conn);
13+
}
14+
15+
var connPromise = r.connect(cfg.rethinkdb).then(function(connection) {
16+
conn = connection;
17+
pool.runQuery = runQueryNormally;
18+
return endex(r).db(cfg.rethinkdb && cfg.rethinkdb.db || 'dingroll')
19+
.table('users')
20+
.index('username')
21+
.table('messages')
22+
.index('sender')
23+
.index('target')
24+
.index('creation')
25+
.index('mentions', {multi: true})
26+
.index('hashtags', {multi: true})
27+
.run(connection);
28+
}).catch(serverReportError);
29+
30+
pool.runQuery = function queueQueryRun(query) {
31+
return new Promise(function(resolve, reject) {
32+
connPromise.then(function(conn){
33+
query.run(conn).then(resolve, reject);
34+
return conn;
35+
});
36+
});
37+
};
38+
};

app/socket.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
var r = require('rethinkdb');
2+
3+
function socketAppCtor(cfg, pool) { return function socketApp(socket) {
4+
5+
// just listen for changes in sidebar filter status -
6+
// report every new message in active filters
7+
var filters;
8+
function reportError(err){
9+
socket.write({
10+
type: 'error',
11+
err: err
12+
});
13+
}
14+
15+
function haveMessage(message){
16+
socket.write({
17+
type: 'haveMessage',
18+
message: message
19+
});
20+
}
21+
22+
var adHocFilterCursor;
23+
24+
function setAdHocFilter(filter) {
25+
if (adHocFilterCursor) adHocFilterCursor.close();
26+
adHocFilterCursor = pool.runQuery(r.table('messages')
27+
.filter(r.row('body').match(filter)));
28+
adHocFilterCursor.each(function(err, message){
29+
if (err) return reportError(err);
30+
haveMessage(message);
31+
}, function onFinished(){
32+
adHocFilterCursor = pool.runQuery(r.table('messages')
33+
.filter(r.row('body').match(filter)).changes());
34+
adHocFilterCursor.each(function(err, changes){
35+
if (err) return reportError(err);
36+
haveMessage(changes.new_val);
37+
});
38+
});
39+
}
40+
41+
socket.on('data', function(data){
42+
if (data.type == 'error') return console.error(data);
43+
else if (data.type == 'createMessage') {
44+
pool.runQuery(r.table('messages').insert(data.message));
45+
} else if (data.type == 'setAdHocFilter') {
46+
setAdHocFilter(data.filter);
47+
} else {
48+
console.error('Unrecognized message type', data);
49+
}
50+
});
51+
}}
52+
53+
module.exports = socketAppCtor;

app/static/android-chrome-144x144.png

7.63 KB

app/static/android-chrome-192x192.png

10.1 KB

app/static/android-chrome-36x36.png

1.99 KB

app/static/android-chrome-48x48.png

2.66 KB

0 commit comments

Comments
 (0)