1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/rocketchat_ynh.git synced 2024-09-03 20:16:25 +02:00
rocketchat_ynh/sources/programs/server/packages/ddp-rate-limiter.js
2016-04-29 16:32:48 +02:00

125 lines
8.8 KiB
JavaScript

(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var RateLimiter = Package['rate-limit'].RateLimiter;
/* Package-scope variables */
var DDPRateLimiter;
(function(){
//////////////////////////////////////////////////////////////////////////////////
// //
// packages/ddp-rate-limiter/ddp-rate-limiter.js //
// //
//////////////////////////////////////////////////////////////////////////////////
//
// Rate Limiter built into DDP with a default error message. See README or // 1
// online documentation for more details. // 2
DDPRateLimiter = {}; // 3
// 4
var errorMessage = function (rateLimitResult) { // 5
return "Error, too many requests. Please slow down. You must wait " + // 6
Math.ceil(rateLimitResult.timeToReset / 1000) + " seconds before " + // 7
"trying again."; // 8
}; // 9
var rateLimiter = new RateLimiter(); // 10
// 11
DDPRateLimiter.getErrorMessage = function (rateLimitResult) { // 12
if (typeof errorMessage === 'function') // 13
return errorMessage(rateLimitResult); // 14
else // 15
return errorMessage; // 16
}; // 17
// 18
/** // 19
* @summary Set error message text when method or subscription rate limit // 20
* exceeded. // 21
* @param {string|function} message Functions are passed in an object with a // 22
* `timeToReset` field that specifies the number of milliseconds until the next
* method or subscription is allowed to run. The function must return a string // 24
* of the error message. // 25
*/ // 26
DDPRateLimiter.setErrorMessage = function (message) { // 27
errorMessage = message; // 28
}; // 29
// 30
/** // 31
* @summary // 32
* Add a rule that matches against a stream of events describing method or // 33
* subscription attempts. Each event is an object with the following // 34
* properties: // 35
* // 36
* - `type`: Either "method" or "subscription" // 37
* - `name`: The name of the method or subscription being called // 38
* - `userId`: The user ID attempting the method or subscription // 39
* - `connectionId`: A string representing the user's DDP connection // 40
* - `clientAddress`: The IP address of the user // 41
* // 42
* Returns unique `ruleId` that can be passed to `removeRule`. // 43
* // 44
* @param {Object} matcher // 45
* Matchers specify which events are counted towards a rate limit. A matcher // 46
* is an object that has a subset of the same properties as the event objects
* described above. Each value in a matcher object is one of the following: // 48
* // 49
* - a string: for the event to satisfy the matcher, this value must be equal
* to the value of the same property in the event object // 51
* // 52
* - a function: for the event to satisfy the matcher, the function must // 53
* evaluate to true when passed the value of the same property // 54
* in the event object // 55
* // 56
* Here's how events are counted: Each event that satisfies the matcher's // 57
* filter is mapped to a bucket. Buckets are uniquely determined by the // 58
* event object's values for all properties present in both the matcher and // 59
* event objects. // 60
* // 61
* @param {number} numRequests number of requests allowed per time interval. // 62
* Default = 10. // 63
* @param {number} timeInterval time interval in milliseconds after which // 64
* rule's counters are reset. Default = 1000. // 65
*/ // 66
DDPRateLimiter.addRule = function (matcher, numRequests, timeInterval) { // 67
return rateLimiter.addRule(matcher, numRequests, timeInterval); // 68
}; // 69
// 70
DDPRateLimiter.printRules = function () { // 71
return rateLimiter.rules; // 72
}; // 73
// 74
/** // 75
* @summary Removes the specified rule from the rate limiter. If rule had // 76
* hit a rate limit, that limit is removed as well. // 77
* @param {string} id 'ruleId' returned from `addRule` // 78
* @return {boolean} True if a rule was removed. // 79
*/ // 80
DDPRateLimiter.removeRule = function (id) { // 81
return rateLimiter.removeRule(id); // 82
}; // 83
// 84
// This is accessed inside livedata_server.js, but shouldn't be called by any // 85
// user. // 86
DDPRateLimiter._increment = function (input) { // 87
rateLimiter.increment(input); // 88
}; // 89
// 90
DDPRateLimiter._check = function (input) { // 91
return rateLimiter.check(input); // 92
}; // 93
// 94
//////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
if (typeof Package === 'undefined') Package = {};
Package['ddp-rate-limiter'] = {
DDPRateLimiter: DDPRateLimiter
};
})();
//# sourceMappingURL=ddp-rate-limiter.js.map