From 2d609adc7401917b229cbfe4466550f63dd2533c Mon Sep 17 00:00:00 2001 From: Prashant-Sahni Date: Fri, 8 Apr 2011 11:36:13 +0530 Subject: [PATCH] Tweets fetcher --- README | 2 ++ path/pacman_chomp3.png | Bin 0 -> 5145 bytes static.js | 33 +++++++++++++++++++ test.html | 25 +++++++++++++++ test.js | 11 +++++++ tweet.js | 70 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 141 insertions(+) create mode 100644 README create mode 100644 path/pacman_chomp3.png create mode 100644 static.js create mode 100644 test.html create mode 100644 test.js create mode 100644 tweet.js diff --git a/README b/README new file mode 100644 index 0000000..624fea3 --- /dev/null +++ b/README @@ -0,0 +1,2 @@ +modified from +http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/ diff --git a/path/pacman_chomp3.png b/path/pacman_chomp3.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1e1eb53f0fe7f4ef22113c71dc61c4dc1bec98 GIT binary patch literal 5145 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 Hu0mjfwHEAF literal 0 HcmV?d00001 diff --git a/static.js b/static.js new file mode 100644 index 0000000..4f7d91b --- /dev/null +++ b/static.js @@ -0,0 +1,33 @@ +var sys = require("sys"), + http = require("http"), + url = require("url"), + path = require("path"), + fs = require("fs"); + +http.createServer(function(request, response) { + var uri = url.parse(request.url).pathname; + var filename = path.join(process.cwd(), uri); + path.exists(filename, function(exists) { + if(!exists) { + response.writeHeader(404, {"Content-Type": "text/plain"}); + response.write("404 Not Found\n"); + response.end(); + return; + } + + fs.readFile(filename, "binary", function(err, file) { + if(err) { + response.writeHeader(500, {"Content-Type": "text/plain"}); + response.write(err + "\n"); + response.end(); + return; + } + + response.writeHeader(200); + response.write(file, "binary"); + response.end(); + }); + }); +}).listen(8000); + +sys.puts("Server running at http://localhost:8080/"); diff --git a/test.html b/test.html new file mode 100644 index 0000000..d1046e4 --- /dev/null +++ b/test.html @@ -0,0 +1,25 @@ + + + + Tweet Streamer + + + +
    + + + diff --git a/test.js b/test.js new file mode 100644 index 0000000..45c4e5d --- /dev/null +++ b/test.js @@ -0,0 +1,11 @@ +var sys = require("sys"), + http = require("http"); + +http.createServer(function(req, res){ + res.writeHead(200, {"Content-Type": "text/html"}); + res.write("王懿"); + res.end(); +}).listen(8000); + +sys.puts("Server running at port 8000"); + diff --git a/tweet.js b/tweet.js new file mode 100644 index 0000000..745e076 --- /dev/null +++ b/tweet.js @@ -0,0 +1,70 @@ +var sys = require("sys"), + http = require("http"), + url = require("url"), + path = require("path"), + fs = require("fs"), + events = require("events"); + +function load_static_file(uri, response) { + var filename = path.join(process.cwd(), uri); + path.exists(filename, function(exists) { + if(!exists) { + response.writeHeader(404, {"Content-Type": "text/plain"}); + response.end("404 Not Found\n"); + return; + } + + fs.readFile(filename, "binary", function(err, file) { + if(err) { + response.writeHeader(500, {"Content-Type": "text/plain"}); + response.end(err + "\n"); + return; + } + response.writeHeader(200); + response.end(file, "binary"); + }); + }); +} + +var twitter_client = http.createClient(80,"api.twitter.com"); +var tweet_emitter = new events.EventEmitter(); +function get_tweets(){ + var req = twitter_client.request("GET","/1/statuses/public_timeline.json", {"host":"api.twitter.com"}); + req.addListener("response",function(res){ + var body = ""; + res.addListener("data",function(data){ + body += data; + }); + res.addListener("end",function(){ + var tweets = JSON.parse(body); + if(tweets.length > 0){ + tweet_emitter.emit("tweets", tweets); + } + }); + }); + req.end(); +} +setInterval(get_tweets, 5000); + +http.createServer(function(req, res){ + + var uri = url.parse(req.url).pathname; + sys.puts("uri = " + uri); + + if(uri == "/stream"){ + var listener = tweet_emitter.addListener("tweets", function(tweets){ + res.writeHeader(200, { "Content-Type" : "text/plain"}); + res.end(JSON.stringify(tweets)); + clearTimeout(timeout); + }); + + var timeout = setTimeout(function(){ + res.writeHeader(200, {"Content-Type":"text/plain"}); + res.end(JSON.stringify([])); + tweet_emitter.removeListener( listener); + }, 10000); + }else{ + load_static_file(uri, res); + } +}).listen(8000); +sys.puts("Server running at port 8000");