Skip to content

Instantly share code, notes, and snippets.

@ulbrich
Created April 19, 2010 15:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ulbrich/371167 to your computer and use it in GitHub Desktop.
Save ulbrich/371167 to your computer and use it in GitHub Desktop.
diff --git a/express/examples/chat/app.js.bak b/express/examples/chat/app.js
index 7852fa3..9973ad0 100644
--- a/express/examples/chat/app.js.bak
+++ b/express/examples/chat/app.js
@@ -3,6 +3,8 @@ require.paths.unshift('lib')
require('express')
require('express/plugins')
+sys = require('sys')
+
configure(function(){
use(MethodOverride)
use(ContentLength)
@@ -12,7 +14,45 @@ configure(function(){
//enable('cache view contents')
})
-var messages = []
+var MessageQueue = function() {
+ process.EventEmitter.call(this);
+
+ this.messages = [];
+ this.promises = [];
+}
+
+sys.inherits(MessageQueue, process.EventEmitter);
+
+MessageQueue.prototype.push = function(message) {
+ var promise;
+
+ this.messages.push(message);
+ this.emit("message", message);
+
+ while((promise = this.promises.shift()) != null)
+ promise.emitSuccess(message);
+}
+
+MessageQueue.prototype.poll = function(callback) {
+ var promise = new process.Promise();
+
+ promise.addCallback(callback);
+
+ setTimeout(function() {
+ promise.emitSuccess(null);
+ }, 60000);
+
+ this.promises.push(promise);
+
+ promise.wait();
+}
+
+var queue = new MessageQueue();
+
+queue.addListener("message", function(message) {
+ if(message.indexOf("nervous:") != 0)
+ queue.push("nervous: Yes, yes, " + message.replace(/^[^:]+:/, ''));
+});
get('/', function(){
this.redirect('/chat')
@@ -21,13 +61,13 @@ get('/', function(){
get('/chat', function(){
this.render('chat.haml.html', {
locals: {
- messages: messages
+ messages: queue.messages
}
})
})
post('/chat', function(){
- messages
+ queue
.push(escape(this.param('message'))
.replace(/(http:\/\/[^\s]+)/g, '<a href="$1" target="express-chat">$1</a>')
.replace(/:\)/g, '<img src="http://icons3.iconfinder.netdna-cdn.com/data/icons/ledicons/emoticon_smile.png">'))
@@ -35,15 +75,12 @@ post('/chat', function(){
})
get('/chat/messages', function(){
- var self = this,
- previousLength = messages.length,
- timer = setInterval(function(){
- if (messages.length > previousLength)
- self.contentType('json'),
- previousLength = messages.length,
- self.halt(200, JSON.encode(messages)),
- clearInterval(timer)
- }, 100)
+ var request = this;
+
+ queue.poll(function(message) {
+ request.contentType('json');
+ request.halt(200, JSON.encode(queue.messages));
+ })
})
get('/public/*', function(file){
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment