Created
August 20, 2011 14:45
-
-
Save justoneplanet/1159188 to your computer and use it in GitHub Desktop.
Push Earthquake Early Warning through WebSocket.
This file contains hidden or 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
/** | |
* Mitsuaki Ishimoto | |
* Push a message of Earthquake Early Warning | |
* Using WebSocket-Node | |
* @see: https://github.com/Worlize/WebSocket-Node | |
/*=================================================================*/ | |
var sys = require('sys'); | |
var eew = require('../eew.js'); | |
var https = require('https'); | |
var delivers = {}; | |
/** | |
* extend default WebSocketServer for broadcast | |
*/ | |
var WebSocketServer = require('websocket').server; | |
WebSocketServer.prototype.broadcastUTF = function(data){ | |
this.connections.forEach(function(connection, i, ary){ | |
if(connection.connected){ | |
connection.sendUTF(data); | |
} | |
}); | |
}; | |
/** | |
* websocket server for end users | |
*/ | |
var server = require('http').createServer( | |
function(request, response) { | |
//console.log((new Date()) + " Received request for " + request.url); | |
response.writeHead(404); | |
response.end(); | |
} | |
); | |
server.listen( | |
eew.env['port'], | |
function() { | |
console.log((new Date()) + " Server is listening on port 80"); | |
} | |
); | |
wsServer = new WebSocketServer({ | |
"httpServer" : server, | |
"autoAcceptConnections" : true | |
}); | |
wsServer.on( | |
'connect', | |
function(connection){ | |
//console.log((new Date()) + " Connection accepted."); | |
connection.sendUTF('{"status" : "accepted"}'); | |
} | |
); | |
/** | |
* http request to twitter | |
*/ | |
var auth = 'Basic ' + new Buffer(eew.env['username'] + ':' + eew.env['password']).toString('base64'); | |
var options = { | |
"host" : "stream.twitter.com", | |
"port" : 443, | |
"path" : '/1/statuses/filter.json?follow=16052553', | |
"method" : 'GET', | |
"Authorization" : auth | |
}; | |
var request = https.request( | |
options, | |
function(response) { | |
console.log("statusCode: ", response.statusCode); | |
console.log("headers: ", response.headers); | |
sys.puts('response'); | |
var chunk = ''; | |
response.on( | |
'data', | |
function(data){ | |
sys.puts("data:" + data); | |
sys.puts("data.length:" + data.length); | |
try{ | |
data = "" + data; | |
data = data.replace(/\n|\r/gm, '').replace(/^\s*/, ''); | |
sys.puts("data:" + data); | |
sys.puts("data.length:" + data.length); | |
var json = JSON.parse(data); | |
if(json['user']['id'] === 16052553){ | |
delivers['id_str' + json['id_str']] = true; | |
wsServer.broadcastUTF(data); | |
} | |
chunk = ''; | |
} | |
catch(e){ | |
chunk += data; | |
sys.puts("e:" + e); | |
sys.puts("chunk:" + chunk); | |
sys.puts("chunk.length:" + chunk.length); | |
try{ | |
var json = JSON.parse(chunk); | |
if(json['user']['id'] === 16052553){ | |
delivers['id_str' + json['id_str']] = true; | |
wsServer.broadcastUTF(chunk); | |
} | |
chunk = ''; | |
} | |
catch(e2){ | |
wsServer.broadcastUTF(" "); | |
if(chunk.length > 10000){ | |
chunk = ''; | |
} | |
} | |
} | |
} | |
); | |
response.on( | |
'end', | |
function(){ | |
sys.puts('response::twitter - response - end'); | |
throw new Error('response::twitter - response - end'); | |
} | |
); | |
response.on( | |
'close', | |
function(){ | |
sys.puts('response::twitter - response - close'); | |
throw new Error('response::twitter - response - close'); | |
} | |
); | |
} | |
); | |
request["_headers"]["Authorization"] = auth; | |
request["_headerNames"]["Authorization"] = 'Authorization'; | |
request.end(); | |
/** | |
* connection to other servers | |
*/ | |
/* | |
var WebSocketClient = require('websocket').client; | |
var OtherServerConnection = function(host){ | |
sys.puts('called-otherserverconnections'); | |
this.host = host; | |
this.client; | |
var self = this; | |
this.construct = function(){ | |
self.client = new WebSocketClient(); | |
self.client.on( | |
'connect', | |
function(conn){ | |
conn.on( | |
'error', | |
function(){ | |
setTimeout(function(){ | |
self.construct(self.host); | |
}, 5000); | |
} | |
); | |
conn.on( | |
'close', | |
function(){ | |
setTimeout(function(){ | |
self.construct(self.host); | |
}, 5000); | |
} | |
); | |
conn.on( | |
'message', | |
function(msg){ | |
//wsServer.broadcastUTF(msg.utf8Data); | |
sys.puts("others-d:" + msg.utf8Data); | |
try{ | |
var json = JSON.parse(msg.utf8Data); | |
if(!(delivers['id_str' + json['id_str']] === true)){ | |
sys.puts('deliver-info-from-others'); | |
delivers['id_str' + json['id_str']] = true; | |
wsServer.broadcastUTF(msg.utf8Data); | |
} | |
} | |
catch(e){// parse error | |
//wsServer.broadcastUTF(' ');// unlimited echo loop | |
} | |
} | |
); | |
} | |
); | |
self.client.on( | |
'connectFailed', | |
function(){ | |
sys.puts('connectFailed'); | |
setTimeout(function(){ | |
self.construct(self.host); | |
}, 5000); | |
} | |
); | |
self.client.connect('ws://' + self.host); | |
} | |
self.construct(); | |
} | |
var conns = []; | |
for(var i = 0; i < eew.env['others'].length; i++){ | |
conns[i] = new OtherServerConnection(eew.env['others'][i]); | |
} | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment