mirror of
https://github.com/YunoHost-Apps/rocketchat_ynh.git
synced 2024-09-03 20:16:25 +02:00
125 lines
8.8 KiB
JavaScript
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
|