forked from clientIO/quota
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtwitter.js
110 lines (99 loc) · 3.75 KB
/
twitter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
'use strict';
var Manager = require('../manager.js');
var _ = require('lodash');
/**
* Quota Preset for Twitter's Public API
*
* Quota rules based on: https://dev.twitter.com/rest/public/rate-limiting
* Twitter's Public API docs: https://dev.twitter.com/rest/public
*
* In a cluster environment a local Server can be used if all requests are
* authenticated requests and those made on behalf a particular user are only
* made by a single node.js instance.
*
* @param options
* @returns {Manager}
*/
module.exports = function (options) {
_.defaults(options, {
authenticated: true
});
var manager = new Manager({
backoff: 'timeout' // TODO: Timeout to value in X-Rate-Limit-Reset
});
function addRule(resource, authQuota, noAuthQuota) {
if (!options.authenticated && noAuthQuota === 0) {
return;
}
manager.addRule({
name: resource,
limit: options.authenticated ? authQuota : noAuthQuota,
window: 15*60*1000,
throttling: 'window-sliding', // TODO: Consider feeding back of X-Rate-Limit-Reset
queueing: 'fifo',
scope: options.authenticated ? 'userId' : [],
resource: resource
});
}
// According to https://dev.twitter.com/rest/public/rate-limits
addRule('account/settings', 15, 0);
addRule('account/verify_credentials', 15, 0);
addRule('application/rate_limit_status', 180, 180);
addRule('blocks/ids', 15, 0);
addRule('blocks/list', 15, 0);
addRule('direct_messages', 15, 0);
addRule('direct_messages/sent', 15, 0);
addRule('direct_messages/show', 15, 0);
addRule('favorites/list', 15, 15);
addRule('followers/ids', 15, 15);
addRule('followers/list', 15, 30);
addRule('friends/ids', 15, 15);
addRule('friends/list', 15, 30);
addRule('friendships/incoming', 15, 0);
addRule('friendships/lookup', 15, 0);
addRule('friendships/no_retweets/ids', 15, 0);
addRule('friendships/outgoing', 15, 0);
addRule('friendships/show', 180, 15);
addRule('geo/id/:place_id', 15, 0);
addRule('geo/reverse_geocode', 15, 0);
addRule('geo/search', 15, 0);
addRule('help/configuration', 15, 15);
addRule('help/languages', 15, 15);
addRule('help/privacy', 15, 15);
addRule('help/tos', 15, 15);
addRule('lists/list', 15, 15);
addRule('lists/members', 180, 15);
addRule('lists/members/show', 15, 15);
addRule('lists/memberships', 15, 15);
addRule('lists/ownerships', 15, 15);
addRule('lists/show', 15, 15);
addRule('lists/statuses', 180, 180);
addRule('lists/subscribers', 180, 15);
addRule('lists/subscribers/show', 15, 15);
addRule('lists/subscriptions', 15, 15);
addRule('mutes/users/ids', 15, 0);
addRule('mutes/users/list', 15, 0);
addRule('saved_searches/list', 15, 0);
addRule('saved_searches/show/:id', 15, 0);
addRule('search/tweets', 180, 450);
addRule('statuses/lookup', 180, 60);
addRule('statuses/mentions_timeline', 15, 0);
addRule('statuses/home_timeline', 15, 0);
addRule('statuses/oembed', 180, 180);
addRule('statuses/retweeters/ids', 15, 60);
addRule('statuses/retweets/:id', 15, 60);
addRule('statuses/retweets_of_me', 15, 0);
addRule('statuses/show/:id', 180, 180);
addRule('statuses/user_timeline', 180, 300);
addRule('trends/available', 15, 15);
addRule('trends/closest', 15, 15);
addRule('trends/place', 15, 15);
addRule('users/lookup', 180, 60);
addRule('users/profile_banner', 180, 0);
addRule('users/search', 180, 0);
addRule('users/show', 180, 180);
addRule('users/suggestions', 15, 15);
addRule('users/suggestions/:slug', 15, 15);
addRule('users/suggestions/:slug/members', 15, 15);
return manager;
};