Created
December 3, 2011 07:33
-
-
Save mbrevoort/1426410 to your computer and use it in GitHub Desktop.
Dojo Stateful Replication over Socket.io
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<title>Dojo Stateful Replication</title> | |
<script> | |
var dojoConfig = { | |
baseUrl: '/js/dojo/1.7.0/dojo', | |
}; | |
</script> | |
<script src="/js/dojo/1.7.0/dojo/dojo.js"></script> | |
<script src="/socket.io/socket.io.js"></script> | |
</head> | |
<body> | |
<script> | |
dojo.require('dojo.Stateful'); | |
dojo.addOnLoad(function(){ | |
var state = new dojo.Stateful(), | |
socket = io.connect('http://localhost'), | |
watcher = null; | |
socket.on('connect', function() { | |
watcher = state.watch( watch ); | |
}); | |
socket.on('state', function (data) { | |
state.set(data); | |
}); | |
socket.on('update', function (data) { | |
state[data.name] = data.value; | |
}); | |
socket.on('delete', function (data) { | |
delete state[data.name]; | |
}); | |
function watch(name, previous, updated){ | |
if( (updated === undefined) ) { | |
emit('delete', name); | |
} else { | |
emit('update', name, updated); | |
} | |
} | |
function emit(action, name, value) { | |
socket.emit(action, { | |
action: action, | |
name: name, | |
value: value | |
}); | |
} | |
}); | |
</script> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var util = require('util') | |
, express = require('express') | |
, io = require('socket.io') | |
, argv = require('optimist').argv | |
, requirejs = require('requirejs') | |
, port = argv.port || 8080; | |
// ============================================================================ | |
// RequireJs and Dojo Stateful wireup | |
// ============================================================================ | |
requirejs.config({ | |
nodeRequire: require, | |
baseUrl: './public/js/dojo/1.7.0/dojo' | |
}); | |
requirejs(['stateful'], function(stateful) { | |
Stateful = stateful; | |
}); | |
var state = new Stateful(); | |
var watcher = state.watch(watch); | |
// ============================================================================ | |
// Express app configuration | |
// ============================================================================ | |
var app = module.exports = express.createServer(); | |
app.configure(function(){ | |
app.use(express.static(__dirname + "/public")); | |
}); | |
var io = io.listen(app); | |
app.listen(port) && util.log("Listening on " + port); | |
io.sockets.on('connection', function(client) { | |
client.emit('state', state); | |
client.on('update', function(data) { | |
client.broadcast.emit('update', data); | |
state[data.name] = data.value; | |
console.log(state); | |
}); | |
client.on('delete', function(data) { | |
client.broadcast.emit('delete', data); | |
delete state[data.name] | |
console.log(state); | |
}); | |
client.on('disconnect', function() { | |
// placeholder in case we need to do anything on disconnect | |
}); | |
}); | |
function watch(name, previous, updated){ | |
if( (updated === undefined) ) { | |
emit('delete', name); | |
} else { | |
emit('update', name, updated); | |
} | |
} | |
function emit(action, name, value) { | |
io.sockets.emit(action, { | |
action: action, | |
name: name, | |
value: value | |
}); | |
} | |
// increment a count variable in the state for testing server state propagation | |
var i=0; | |
setInterval(function() { state.set('count', ++i)}, 5000) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment