UNPKG

3.97 kBJavaScriptView Raw
1//
2// Twitter API Wrapper
3//
4var Auth = require('./auth')
5 , OARequest = require('./oarequest')
6
7// Endpoints
8var REST_ROOT = 'https://api.twitter.com/1.1/'
9 , PUB_STREAM = 'https://stream.twitter.com/1.1/'
10 , USER_STREAM = 'https://userstream.twitter.com/1.1/'
11 , SITE_STREAM = 'https://sitestream.twitter.com/1.1/'
12 , OA_REQ = 'https://api.twitter.com/oauth/request_token'
13 , OA_ACCESS = 'https://api.twitter.com/oauth/access_token'
14
15//
16// Twitter
17//
18var Twitter = function (config) {
19 var credentials = {
20 oauth_request_url : OA_REQ
21 , oauth_access_url : OA_ACCESS
22 , consumer_key : config.consumer_key
23 , consumer_secret : config.consumer_secret
24 , access_token : config.access_token
25 , access_token_secret : config.access_token_secret
26 }
27
28 this.config = config;
29 this.config.oauth_request_url = OA_REQ;
30 this.config.oauth_access_url = OA_ACCESS;
31
32 //authenticate our oauth client
33 this.auth = new Auth(credentials)
34}
35
36Twitter.prototype = {
37 get: function (path, params, callback) {
38 return this.request('GET', REST_ROOT + path, params, callback)
39 },
40 post: function (path, params, callback) {
41 return this.request('POST', REST_ROOT + path, params, callback)
42 },
43 request: function (method, path, params, callback) {
44 // if no `params` is specified but a callback is, use default params
45 if (typeof params === 'function') {
46 callback = params
47 params = {}
48 }
49
50 // regex to extract :params from `path`
51 var rgxParam = /\/:(\w+)/g
52 // clone `params` object so we can modify it without modifying the user's reference
53 var paramsClone = JSON.parse(JSON.stringify(params))
54
55 var missingParamErr = null
56
57 // extract params like from paths like statuses/retweet/:id
58 // and replace them with user-supplied params
59 var finalPath = path.replace(rgxParam, function (hit) {
60 var paramName = hit.slice(2)
61 var userVal = paramsClone[paramName]
62
63 if (!userVal) {
64 missingParamErr = new Error('Twit: Params object is missing a required parameter for this request: `'+paramName+'`')
65 return
66 }
67
68 // clone this param value, and delete from `paramsClone` so we don't pass it in the querystring or body
69 var paramVal = JSON.parse(JSON.stringify(userVal))
70 delete paramsClone[paramName]
71
72 return '/' + paramVal
73 })
74
75 if (missingParamErr) {
76 return callback(missingParamErr)
77 }
78
79 // convert any arrays in `paramsClone` to comma-seperated strings
80 var finalParams = this.normalizeParams(paramsClone)
81
82 return new OARequest(
83 this.auth
84 , method
85 , finalPath + '.json'
86 , finalParams
87 ).end(callback)
88 },
89 stream: function (path, params) {
90 var stream_endpoint_map = {
91 user: USER_STREAM,
92 site: SITE_STREAM
93 }
94
95 var ROOT = stream_endpoint_map[path] || PUB_STREAM
96
97 var streamPath = ROOT + path + '.json'
98 var finalParams = this.normalizeParams(params)
99
100 return new OARequest(this.auth, 'POST', streamPath, finalParams).persist()
101 },
102 normalizeParams: function (params) {
103 var normalized = params
104 if (params && typeof params === 'object') {
105 Object.keys(params).forEach(function (key) {
106 var value = params[key]
107 // replace any arrays in `params` with comma-separated string
108 if (Array.isArray(value))
109 normalized[key] = value.join(',')
110 })
111 } else if (!params) {
112 normalized = {}
113 }
114 return normalized
115 },
116 setAuth: function (auth) {
117 var self = this
118 var authKeys = [ 'consumer_key', 'consumer_secret', 'access_token', 'access_token_secret' ];
119
120 // update config
121 authKeys.forEach(function (authKey) {
122 if (auth[authKey]) {
123 self.config[authKey] = auth[authKey]
124 }
125 })
126
127 // create a new auth object
128 this.auth = new Auth(this.config)
129 },
130 getAuth: function () {
131 return this.config
132 }
133}
134
135module.exports = Twitter