1 |
|
2 |
|
3 |
|
4 | var Auth = require('./auth')
|
5 | , OARequest = require('./oarequest')
|
6 |
|
7 |
|
8 | var 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 |
|
17 |
|
18 | var 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 |
|
33 | this.auth = new Auth(credentials)
|
34 | }
|
35 |
|
36 | Twitter.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 |
|
45 | if (typeof params === 'function') {
|
46 | callback = params
|
47 | params = {}
|
48 | }
|
49 |
|
50 |
|
51 | var rgxParam = /\/:(\w+)/g
|
52 |
|
53 | var paramsClone = JSON.parse(JSON.stringify(params))
|
54 |
|
55 | var missingParamErr = null
|
56 |
|
57 |
|
58 |
|
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 |
|
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 |
|
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 |
|
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 |
|
121 | authKeys.forEach(function (authKey) {
|
122 | if (auth[authKey]) {
|
123 | self.config[authKey] = auth[authKey]
|
124 | }
|
125 | })
|
126 |
|
127 |
|
128 | this.auth = new Auth(this.config)
|
129 | },
|
130 | getAuth: function () {
|
131 | return this.config
|
132 | }
|
133 | }
|
134 |
|
135 | module.exports = Twitter
|