diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4e2074d --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +build: + coffee -c index.coffee + +test: + coffee test.coffee diff --git a/README.md b/README.md new file mode 100644 index 0000000..312ed94 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# node-wurfl-client +Simple client for WURFL's (mobile devices database) HTTP API. + +## Installing + + $ npm install wurfl-client + +## Using + + var wurfl = require('wurfl-client') + + /* + Point to your WURFL installation here. + Other options: + path - default: '/Tera-Wurfl/webservice.php' + port - default: 80 + */ + wurfl.host = 'wurfl.mydomain.com' + + var ua = 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' + var fields = ['brand_name', 'model_name', 'resolution_width', 'resolution_height'] + + wurfl.query(ua, fields, function(err, data) { + if(err && err.length > 0) puts(inspect(err)) + else puts(inspect(data)) + }); + +Expected output: + + { brand_name: 'Google', + model_name: 'Nexus One', + resolution_width: 480, + resolution_height: 800 } diff --git a/example.js b/example.js new file mode 100644 index 0000000..7deb0b8 --- /dev/null +++ b/example.js @@ -0,0 +1,21 @@ +var inspect = require('sys').inspect +var puts = console.log + +var wurfl = require('wurfl-client') + +/* + Point to your WURFL installation here. + Other options: + path - default: '/Tera-Wurfl/webservice.php' + port - default: 80 +*/ +//wurfl.host = 'wurfl.mydomain.com' + +//var ua = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_3 like Mac OS X; xx-xx) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7E18 Safari/528.16' +var ua = 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' +var fields = ['brand_name', 'model_name', 'resolution_width', 'resolution_height'] + +wurfl.query(ua, fields, function(err, data) { + if(err && err.length > 0) puts(inspect(err)) + else puts(inspect(data)) +}); diff --git a/index.coffee b/index.coffee new file mode 100644 index 0000000..5fe0ba8 --- /dev/null +++ b/index.coffee @@ -0,0 +1,33 @@ +puts = console.log +inspect = require('sys').inspect +http = require 'http' + +urlencode = (str) -> + str = (str+'').toString() + encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+') + +@version = '0.0.1' +@host = 'www.tera-wurfl.com' +@port = 80 +@path = '/Tera-Wurfl/webservice.php' + +@query = (ua, fields, callback) => + ua = urlencode(ua) + fields = fields.join '|' + + wurfl = http.createClient @port, @host + request = wurfl.request 'GET', "#{@path}?ua=#{ua}&search=#{fields}&format=json", 'host': @host + request.end() + request.on 'response', (response) -> + if response.statusCode isnt 200 + callback [{'Expected response with status code HTTP 200 OK, got: ': response.statusCode}], null + else + response.setEncoding 'utf8' + data = '' + response.on 'data', (chunk) -> data += chunk + response.on 'end', -> + try + data = JSON.parse data + callback data.errors, data.capabilities + catch e + callback [{'Error parsing response as JSON': e}], null diff --git a/index.js b/index.js new file mode 100644 index 0000000..ead4dad --- /dev/null +++ b/index.js @@ -0,0 +1,53 @@ +(function() { + var http, inspect, puts, urlencode; + var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + puts = console.log; + inspect = require('sys').inspect; + http = require('http'); + urlencode = function(str) { + str = (str + '').toString(); + return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+'); + }; + this.version = '0.0.1'; + this.host = 'www.tera-wurfl.com'; + this.port = 80; + this.path = '/Tera-Wurfl/webservice.php'; + this.query = __bind(function(ua, fields, callback) { + var request, wurfl; + ua = urlencode(ua); + fields = fields.join('|'); + wurfl = http.createClient(this.port, this.host); + request = wurfl.request('GET', "" + this.path + "?ua=" + ua + "&search=" + fields + "&format=json", { + 'host': this.host + }); + request.end(); + return request.on('response', function(response) { + var data; + if (response.statusCode !== 200) { + return callback([ + { + 'Expected response with status code HTTP 200 OK, got: ': response.statusCode + } + ], null); + } else { + response.setEncoding('utf8'); + data = ''; + response.on('data', function(chunk) { + return data += chunk; + }); + return response.on('end', function() { + try { + data = JSON.parse(data); + return callback(data.errors, data.capabilities); + } catch (e) { + return callback([ + { + 'Error parsing response as JSON': e + } + ], null); + } + }); + } + }); + }, this); +}).call(this); diff --git a/package.json b/package.json new file mode 100644 index 0000000..5428bd1 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "wurfl-client", + "description": "Simple client for WURFL's (mobile devices database) HTTP API.", + "version": "0.0.1", + "author": "Maurice Machado ", + "keywords": ["mobile", "device", "detection"], + "main": "index", + "directories": { + "lib": "." + }, + "engines": { + "node": ">= 0.2.5" + } +}