pushd
Version:
Blazing fast multi-protocol mobile push notification service
67 lines (55 loc) • 2.47 kB
text/coffeescript
policyFile = '<?xml version="1.0"?>' +
'<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">' +
'<cross-domain-policy>' +
'<site-control permitted-cross-domain-policies="master-only"/>' +
'<allow-access-from domain="*" secure="false"/>' +
'<allow-http-request-headers-from domain="*" headers="Accept"/>' +
'</cross-domain-policy>'
exports.setup = (app, authorize, eventPublisher) ->
app.get '/crossdomain.xml', (req, res) ->
res.set 'Content-Type', 'application/xml'
res.send(policyFile)
app.options '/subscribe', authorize('listen'), (req, res) ->
res.set
'Content-Type': 'text/event-stream',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET'
'Access-Control-Max-Age': '86400'
res.end()
app.get '/subscribe', authorize('listen'), (req, res) ->
unless req.accepts('text/event-stream')
res.send 406
return
unless typeof req.query.events is 'string'
res.send 400
return
eventNames = req.query.events.split ' '
req.socket.setTimeout(Infinity);
req.socket.setNoDelay(true);
res.set
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Access-Control-Allow-Origin': '*',
'Connection': 'close'
res.write('\n')
if req.get('User-Agent')?.indexOf('MSIE') != -1
res.write new Array(2048).join('\n')
sendEvent = (event, payload) ->
data =
event: event.name
title: payload.title
message: payload.msg
data: payload.data
res.write("data: " + JSON.stringify(data) + "\n\n")
antiIdleInterval = setInterval ->
res.write "\n"
, 10000
res.socket.on 'close', =>
clearInterval antiIdleInterval
for eventName in eventNames
eventPublisher.removeListener eventName, sendEvent
for eventName in eventNames
eventPublisher.addListener eventName, sendEvent