that.close = function(callback) { callback = callback || noop; ondb.get(common.fork(callback, function(db) { db.close(callback); })); };
Collection.prototype.find = function() { var args = Array.prototype.slice.call(arguments); var oncursor = common.future(); var oncollection = this._oncollection; // we provide sugar for doing find(query, callback) -> find(query).toArray(callback); if (typeof args[args.length - 1] === 'function') { var callback = args.pop(); oncursor.get(common.fork(callback, function(cur) { cur.toArray(callback); })); } common.step([ function(next) { oncollection.get(next); }, function(col, next) { args.push(next); col.find.apply(col, args); }, function(cur) { oncursor.put(null, cur); } ], oncursor.put); return new Cursor(oncursor); };
Request.prototype.send = function(body, callback) { if (!callback) { callback = body; body = ''; } else { body = this._encode(body); this._headers['content-length'] = this._headers['content-length'] || (Buffer.isBuffer(body) ? body.length : Buffer.byteLength(body)); } callback = callback || noop; var self = this; this._response(common.fork(callback, function(response) { if (self._head) { callback(null, response.headers); return; } self._decode(response, callback); })); if (!this._piping) { this.end(body); } return this; };
that[name] = function() { var args = arguments; var callback = args[args.length - 1] || noop; ondb.get(common.fork(callback, function(db) { db[name].apply(db, args); })); };
Cursor.prototype._exec = function(name, args) { var callback = typeof args[args.length - 1] === 'function' ? args[args.length - 1] : noop; this._oncursor.get(common.fork(callback, function(cur) { cur[name].apply(cur, args); })); return this; };
var flush = function() { if (!buffer) { writer = null; that.send = send; return; } that.send = sendBuffer; writer = mania.put('/sockets/'+id).send(empty(), common.fork(onerror, flush)); };
single(function(free) { callback = free.wrap(callback); sub.exclude = common.join(sub.exclude, exclude); resolveFile(entry, sub, common.fork(callback, function(main) { exclude = common.join(exclude, main.dependencies, {require:1}); callback(null, main.compiled); })); });
Cursor.prototype._exec = function(name, args) { var callback = noop; if (typeof args[args.length-1] === 'function') { callback = args[args.length-1] = normalize(args[args.length-1]); } this._oncursor.get(common.fork(callback, function(cur) { cur[name].apply(cur, args); })); return this; };
server.get('/user/{user}/unbook', function(request, response) { if (!request.query.date) { respond(response, {err:'no date'}, 500); } db.booking.remove({bookingId: request.query.date}, common.fork(function(err) { respond(response, {err:'no date'}, 500); }, function(data) { respond(response, {}, 200); })); });
return function(stream, callback) { exports.string(common.fork(callback, function(result) { try { result = strat(result); } catch(err) { callback(err); return; } callback(null, result); })); };
Request.prototype.to = function(output, callback) { callback = callback || noop; this._response(common.fork(callback, function(response) { pipe(response, output, callback); })); if (!this._piping) { this.end(); } return this; };
Collection.prototype._exec = function(name, args) { var callback = typeof args[args.length - 1] === 'function' ? args[args.length - 1] : noop; this._oncollection.get(common.fork(callback, function(col) { var old = col.opts.safe; if (callback !== noop) { col.opts.safe = true; } col[name].apply(col, args); col.opts.safe = old; })); };
Collection.prototype._exec = function(name, args) { var args = normalizeId(args); var callback = args[args.length-1]; if (typeof callback === 'function') { args[args.length-1] = callback = normalize(callback); } else { callback = noop; } this._oncollection.get(common.fork(callback, function(col) { col[name].apply(col, args); })); };
Request.prototype.from = function(input, callback) { this._piping = true; input.pipe(this._request()); if (callback) { var self = this; this._response(common.fork(callback, function(response) { self._decode(response, callback); })); } return this; };
var read = function(message) { if (message === '') { onerror(new Error('empty message')); return; } if (message) { message = message.split('\n'); for (var i = 0; i < message.length; i++) { if (message[i]) { that.emit('message', message[i]); } } } reader = mania.get('/sockets/'+id, common.fork(onerror, read)); };
var read = function(data) { if (data) { data = data.split('\n'); for (var i = 0; i < data.length; i++) { if (!data[i] || data[i] === 'pong') { continue; } self.emit('message', JSON.parse(data[i])); } } if (self.destroyed) { return; } reader.get('/read?id='+id+'&t='+tick(), common.fork(onerror, read)); };
router.get('/json-sockets/read', function(request, response) { var query = parseURL(request.url, true).query; var socket = polls[query.id]; var respond = responder(query, response); var onerror = function() { respond(404, ''); }; if (!socket) { onerror(); return; } request.on('close', function() { socket.destroy(); }); socket.read(common.fork(onerror, function(data) { respond(200, data); })); });
exports.login = function(user, password, callback) { curly.post('https://se.diasend.com/diasend/login.php') .headers({ Host:'se.diasend.com', Origin:'http://diasend.com', Referer:'http://diasend.com/site/index.php?lang=sv', 'content-type':'application/x-www-form-urlencoded', 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2' }) .follow(false) .allow(302) .head(true) .send(querify({ user:user, passwd:password, submit:'Logga in', lang:'swedish' }), common.fork(callback, function(headers) { if (!headers['set-cookie']) { callback(new Error('set-cookie header missing')); } callback(null, headers['set-cookie'][0]); })); };
var onbodyrequest = function(request, response) { buffoon.string(request, common.fork(noop, function(data) { querify(request); invoke(request, data, false, response); })); };
var onmain = function(callback) { return common.fork(callback, function(main) { callback(null, main.compiled); }); };
var send = self._send = function(message) { self._send = pusher; writer.post('/write?id='+id+'&t='+tick(), message+'\n', common.fork(onerror, flush)); };
var send = function() { var next = body.length <= (i+1)*1000 ? callback : common.fork(callback, send); var post = encodeURIComponent(body.substr(1000 * i++, 1000)); self._destroy = curl.jsonp(host+'post='+post+'&callback=?', next); };
return function(request, response) { var url = common.format(location, request.params); var onnotfound = function() { response.writeHead(404); response.end(); }; var onerror = function(err) { response.writeHead(500); //console.log(err); response.end(err); }; if (/\/\.\.\//.test(url)) { // security check onnotfound(); return; } if(mime.lookup(url) == 'text/css') { fs.readFile(url,'ascii', common.fork(onnotfound, function(data) { try { console.log('try'); less.render(data, function(err, text) { console.log('done', err); response.writeHead(200, {'content-type':'text/css'}); response.end(err ? data : text); }); } catch (e) { console.log('catch'); response.writeHead(200, {'content-type':'text/css'}); response.end(data); } })); return; } if(mime.lookup(url).indexOf('image/') != -1) { fs.readFile(url, function(err, data){ response.writeHead(200, {"Content-Type": "image/png"}); response.write(data, "binary"); response.end(); }); return; } fs.stat(url, common.fork(onnotfound, function(stat) { var headers = { 'content-type':mime.lookup(url), 'content-length':stat.size, 'date':new Date().toUTCString(), 'last-modified':stat.mtime.toUTCString() }; if (options.cacheMaxAge !== undefined) { headers['cache-control'] = 'public, max-age=' + options.cacheMaxAge; } response.writeHead(options.status, headers); fs.createReadStream(url).pipe(response); })); };
server.get('/api/{method}', function(request, response) { var url = parse(request.url,true); var onerror = function(message) { response.writeHead(200, {'Content-Type': 'application/javascript'}); response.write(JSON.stringify({error:message})); response.end(); } var write = common.fork(onerror,function(data) { response.writeHead(200, {'Content-Type': 'application/javascript'}); response.write(JSON.stringify(data)); response.end(); }); switch(request.params.method) { case 'auth': chat.isValidUser(url.query.name,url.query.password,common.fork(onerror,function(valid) { response.writeHead(200, {'Content-Type': 'text/html','Set-Cookie':cookie.stringify(url.query.name)}); response.end(JSON.stringify(valid && url.query.name)); })); break; case 'create': if (!url.query.name || url.query.name.replace(/\s/g,"") == "") { onerror('Choose a username'); return; } if (!url.query.password || url.query.password.replace(/\s/g,"") == "") { onerror('Set a password'); return; } common.step([ function(next) { chat.exists(url.query.name, next); }, function(exists) { if (exists) { onerror('Username is taken'); return; } chat.createUser(url.query.name,url.query.password,write); } ],function(err) { onerror(); }); break; case 'users': chat.getUsers(write); break; case 'conversation': chat.getUser(url.query.name, common.fork(write, function(user) { user.conversation(url.query.to,write); })); break; case 'status': chat.getUser(url.query.name,common.fork(write, function(user) { user.status(url.query.status,write); })); break; case 'chat': chat.getUser(url.query.name,common.fork(write, function(user) { user.chat(url.query.to,url.query.message,write); pubsub.publish({ origin: 'server', from: name, to:url.query.to, message: url.query.message }); })); break; } });
}, function(doc) { chat.getUser(doc.from, common.fork(noop,function(user) { user.chat(doc.to, doc.message); })); });
server.get('/user/{user}/book', function(request, response) { if (!request.query.date) { respond(response, {err:'no date'}, 500); } db.booking.findOne({bookingId: request.query.date}, common.fork(function(err) { respond(response, {err:'no date'}, 500); }, function(booking) { if (booking) { respond(response, {taken:1}, 200); return; } db.booking.save({bookingId: request.query.date, notes: request.query.notes,user: users[request.params.user]}, common.fork(function(err) { respond(response, {err:'no date'}, 500); }, function(data) { respond(response, {}, 200); })); })); });
var createLongPoll = function(host) { var mania = require('crossmania').create(host); var that = common.createEmitter(); var writer; var reader; var onerror = function(err) { that.destroy(); }; writer = mania.post('/sockets', common.fork(onerror, function(id) { var buffer = ''; var empty = function() { var b = buffer.substring(0, mania.type === 'jsonp' ? 1000 : buffer.length); buffer = buffer.substring(b.length); return b; }; var flush = function() { if (!buffer) { writer = null; that.send = send; return; } that.send = sendBuffer; writer = mania.put('/sockets/'+id).send(empty(), common.fork(onerror, flush)); }; var sendBuffer = function(message) { buffer += message+'\n'; }; var send = function(message) { buffer += message+'\n'; flush(); }; var read = function(message) { if (message === '') { onerror(new Error('empty message')); return; } if (message) { message = message.split('\n'); for (var i = 0; i < message.length; i++) { if (message[i]) { that.emit('message', message[i]); } } } reader = mania.get('/sockets/'+id, common.fork(onerror, read)); }; read(); that.send = send; that.emit('open'); })); that.type = 'long-poll-'+mania.type; that.send = noop; that.destroy = function() { that.destroy = noop; if (writer) { writer.destroy(); } if (reader) { reader.destroy(); } that.emit('close'); }; return that; };
}, function(booking) { if (booking) { respond(response, {taken:1}, 200); return; } db.booking.save({bookingId: request.query.date, notes: request.query.notes,user: users[request.params.user]}, common.fork(function(err) { respond(response, {err:'no date'}, 500); }, function(data) { respond(response, {}, 200); })); }));
var LongPoll = common.emitter(function(host) { this.reader = createRequest(host); this.writer = createRequest(host); var self = this; var reader = this.reader; var writer = this.writer; var cnt = 0; this.type = 'longpoll-'+reader.type; this.destroyed = false; this._ping = null; var onerror = function() { self.destroy(); }; var oncreate = function(id) { var buffer = []; var read = function(data) { if (data) { data = data.split('\n'); for (var i = 0; i < data.length; i++) { if (!data[i] || data[i] === 'pong') { continue; } self.emit('message', JSON.parse(data[i])); } } if (self.destroyed) { return; } reader.get('/read?id='+id+'&t='+tick(), common.fork(onerror, read)); }; var flush = function() { if (buffer.length) { var data = buffer.join('\n'); buffer = []; send(data); } else { self._send = send; } }; var pusher = function(data) { buffer.push(data); }; var send = self._send = function(message) { self._send = pusher; writer.post('/write?id='+id+'&t='+tick(), message+'\n', common.fork(onerror, flush)); }; self._ping = setInterval(function() { self._send('ping'); }, PING_INTERVAL); read(); self.emit('open'); }; reader.get('/create?t='+tick(), common.fork(onerror, oncreate)); });
Request.prototype.resume = function() { this._response(common.fork(noop, function(response) { response.resume(); })); };