kopia lustrzana https://github.com/c9/core
Merge pull request +15755 from c9/docker-async-backup-retry
throttle publishingpull/467/head
commit
727c385c87
|
@ -0,0 +1,18 @@
|
||||||
|
/**
|
||||||
|
* Return a function that ensures callback is
|
||||||
|
* not called more often ten once per tpms (times per ms)
|
||||||
|
*/
|
||||||
|
function throttle(tpms) {
|
||||||
|
var last = Date.now();
|
||||||
|
|
||||||
|
return function(callback) {
|
||||||
|
var now = Date.now();
|
||||||
|
var delay = Math.max(0, last - now);
|
||||||
|
|
||||||
|
last = now + delay + tpms;
|
||||||
|
|
||||||
|
setTimeout(callback, delay);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = throttle;
|
|
@ -0,0 +1,135 @@
|
||||||
|
/*global describe it beforeEach afterEach*/
|
||||||
|
"use strict";
|
||||||
|
"use server";
|
||||||
|
"use mocha";
|
||||||
|
|
||||||
|
require("c9/inline-mocha")(module);
|
||||||
|
|
||||||
|
var throttle = require("./throttle");
|
||||||
|
var sinon = require("sinon");
|
||||||
|
var assert = require("assert");
|
||||||
|
var async = require("async");
|
||||||
|
|
||||||
|
describe("urls", function() {
|
||||||
|
|
||||||
|
this.timeout(15000);
|
||||||
|
|
||||||
|
it("calls first invocation with no delay", function(done) {
|
||||||
|
var tpms = 10;
|
||||||
|
var throttler = throttle(tpms);
|
||||||
|
|
||||||
|
var start = Date.now();
|
||||||
|
|
||||||
|
throttler(function() {
|
||||||
|
var end = Date.now() - start;
|
||||||
|
assert.ok(end < tpms, "invocation was immediate");
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("calls second invocation delayed by tpms", function(done) {
|
||||||
|
var tpms = 10;
|
||||||
|
var throttler = throttle(tpms);
|
||||||
|
|
||||||
|
var start = Date.now();
|
||||||
|
var first = sinon.stub();
|
||||||
|
|
||||||
|
throttler(first);
|
||||||
|
|
||||||
|
throttler(function() {
|
||||||
|
var end = Date.now() - start;
|
||||||
|
assert(first.calledOnce);
|
||||||
|
assert.ok(end >= tpms);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("calls third invocation delayed by 2 * tpms", function(done) {
|
||||||
|
var tpms = 10;
|
||||||
|
var throttler = throttle(tpms);
|
||||||
|
|
||||||
|
var start = Date.now();
|
||||||
|
var first = sinon.stub();
|
||||||
|
var second = sinon.stub();
|
||||||
|
|
||||||
|
throttler(first);
|
||||||
|
throttler(second);
|
||||||
|
|
||||||
|
throttler(function() {
|
||||||
|
var end = Date.now() - start;
|
||||||
|
assert(first.calledOnce);
|
||||||
|
assert(second.calledOnce);
|
||||||
|
|
||||||
|
assert.ok(end >= tpms * 2);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("does not delay after enough time has passed", function(done) {
|
||||||
|
var tpms = 10;
|
||||||
|
var throttler = throttle(tpms);
|
||||||
|
|
||||||
|
var first = sinon.stub();
|
||||||
|
var second = sinon.stub();
|
||||||
|
|
||||||
|
throttler(first);
|
||||||
|
throttler(second);
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
var start = Date.now();
|
||||||
|
|
||||||
|
assert(first.calledOnce);
|
||||||
|
assert(second.calledOnce);
|
||||||
|
|
||||||
|
throttler(function() {
|
||||||
|
var end = Date.now() - start;
|
||||||
|
|
||||||
|
assert.ok(end < tpms, "third call was not delayed at all");
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
}, tpms * 3);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it("delays callback chains", function(done) {
|
||||||
|
var tpms = 30;
|
||||||
|
var throttler = throttle(tpms);
|
||||||
|
|
||||||
|
var start = Date.now();
|
||||||
|
|
||||||
|
async.each([1, 2, 3, 4], function(a, next) {
|
||||||
|
throttler(next);
|
||||||
|
}, function() {
|
||||||
|
var end = Date.now() - start;
|
||||||
|
assert.ok(end >= tpms * 3, "End result was delayed");
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("delays a .series", function(done) {
|
||||||
|
var tpms = 30;
|
||||||
|
var throttler = throttle(tpms);
|
||||||
|
|
||||||
|
var start = Date.now();
|
||||||
|
|
||||||
|
async.series([
|
||||||
|
throttler,
|
||||||
|
throttler,
|
||||||
|
function(next) {
|
||||||
|
var end = Date.now() - start;
|
||||||
|
assert.ok(end >= tpms, "got delayed");
|
||||||
|
throttler(next);
|
||||||
|
}
|
||||||
|
|
||||||
|
], function() {
|
||||||
|
var end = Date.now() - start;
|
||||||
|
assert.ok(end >= tpms * 2, "delayed 2 times");
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
});
|
Ładowanie…
Reference in New Issue