Skip to content

Instantly share code, notes, and snippets.

@nornagon
Created March 19, 2012 11:34
Show Gist options
  • Save nornagon/2108489 to your computer and use it in GitHub Desktop.
Save nornagon/2108489 to your computer and use it in GitHub Desktop.
Programmer nomic
coffee = require 'coffee-script'
vm = require 'vm'
connect = require 'connect'
browserChannel = require('browserchannel').server
comm = new (require('events').EventEmitter)
# TODO: sandbox
master = ((comm) ->
code = '''
order ?= []
(msg) ->
switch msg.type
when 'data'
switch msg.data.cmd
when 'patch'
updateCode(msg.data.code)
ctrl.sendMessage \"fun updated by #{msg.sender}\"
when 'order?'
ctrl.sendMessage \"order is #{JSON.stringify order}\"
when 'join'
order.push msg.sender
when 'leave'
i = order.indexOf msg.sender
order.splice i, 1
'''
state = {}
ctrl = {
sendMessage: (msg) ->
comm.emit 'sendMessage', msg
}
updateCode = (source) ->
code = source
sandbox = vm.Script.createContext {updateCode, ctrl}
fun = (msg) ->
coffee.eval(code, {sandbox})(msg)
comm.on 'message', (sender, data) ->
fun {sender, type: 'data', data}
comm.on 'join', (sender) ->
fun {sender, type: 'join'}
comm.on 'leave', (sender) ->
fun {sender, type: 'leave'}
)(comm)
comm.on 'sendMessage', (msg) ->
broadcast msg
sessions = {}
broadcast = (message, except) ->
for id, s of sessions
s.send message unless id == except
onConnect = (session) ->
sessions[session.id] = session
console.log "New session: #{session.id} from #{session.address} with cookies #{session.headers.cookie}"
comm.emit 'join', session.id
session.on 'message', (data) ->
console.log "#{session.id} sent #{JSON.stringify data}"
comm.emit 'message', session.id, data
session.on 'close', (reason) ->
comm.emit 'leave', session.id
console.log "#{session.id} disconnected (#{reason})"
delete sessions[session.id]
server = connect(
connect.static "#{__dirname}/static"
browserChannel onConnect
).listen 4321
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment