faastjs
Version:
Serverless batch computing made simple.
595 lines • 87.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ava_1 = tslib_1.__importDefault(require("ava"));
const uuid_1 = require("uuid");
const cache_1 = require("../src/cache");
const throttle_1 = require("../src/throttle");
const functions_1 = require("./fixtures/functions");
const util_1 = require("./fixtures/util");
(0, ava_1.default)("deferred resolves its promise", async (t) => {
const deferred = new throttle_1.Deferred();
let resolved = false;
deferred.promise.then(_ => (resolved = true));
t.is(resolved, false);
deferred.resolve();
await deferred.promise;
t.is(resolved, true);
});
(0, ava_1.default)("deferred rejects its promise", async (t) => {
const deferred = new throttle_1.Deferred();
let rejected = false;
t.is(rejected, false);
deferred.reject();
try {
await deferred.promise;
}
catch (_) {
rejected = true;
}
t.is(rejected, true);
});
(0, ava_1.default)("deferred resolves only once", async (t) => {
const deferred = new throttle_1.Deferred();
let value = 0;
deferred.promise.then(_ => value++);
deferred.resolve();
await deferred.promise;
t.is(value, 1);
deferred.resolve();
await deferred.promise;
t.is(value, 1);
});
(0, ava_1.default)("deferred cannot reject after resolving", async (t) => {
const deferred = new throttle_1.Deferred();
let value = 0;
deferred.promise.then(_ => value++);
deferred.resolve();
await deferred.promise;
t.is(value, 1);
deferred.reject();
await deferred.promise;
t.is(value, 1);
});
ava_1.default.serial("funnel defaults to infinite concurrency (tested with 200)", t => (0, util_1.withClock)(async () => {
const funnel = new throttle_1.Funnel(0);
const promises = [];
const N = 200;
for (let i = 0; i < N; i++) {
promises.push(funnel.push(() => (0, functions_1.timer)(300)));
}
const times = await Promise.all(promises);
t.is((0, util_1.measureConcurrency)(times), N);
}));
ava_1.default.serial("funnel single concurrency is mutually exclusive", t => (0, util_1.withClock)(async () => {
const funnel = new throttle_1.Funnel(1);
const promises = [];
const N = 10;
for (let i = 0; i < N; i++) {
promises.push(funnel.push(() => (0, functions_1.timer)(10)));
}
const times = await Promise.all(promises);
t.is((0, util_1.measureConcurrency)(times), 1);
}));
ava_1.default.serial("funnel handles concurrency level 2", t => (0, util_1.withClock)(async () => {
const funnel = new throttle_1.Funnel(2);
const promises = [];
const N = 10;
for (let i = 0; i < N; i++) {
promises.push(funnel.push(() => (0, functions_1.timer)(20)));
}
const times = await Promise.all(promises);
t.is((0, util_1.measureConcurrency)(times), 2);
}));
ava_1.default.serial("funnel handles concurrency level 10", t => (0, util_1.withClock)(async () => {
const funnel = new throttle_1.Funnel(10);
const promises = [];
const N = 100;
for (let i = 0; i < N; i++) {
promises.push(funnel.push(() => (0, functions_1.timer)(20)));
}
const times = await Promise.all(promises);
t.is((0, util_1.measureConcurrency)(times), 10);
}));
ava_1.default.serial("funnel resumes after finishing a worker", t => (0, util_1.withClock)(async () => {
const funnel = new throttle_1.Funnel(1);
const time1 = await funnel.push(() => (0, functions_1.timer)(10));
const time2 = await funnel.push(() => (0, functions_1.timer)(10));
t.is((0, util_1.measureConcurrency)([time1, time2]), 1);
}));
(0, ava_1.default)("funnel clearing", async (t) => {
const funnel = new throttle_1.Funnel(1);
let count = 0;
const promise0 = funnel.push(async () => count++);
const promise1 = funnel.push(async () => count++);
const promise2 = funnel.push(async () => count++);
funnel.clear();
t.is(await Promise.race([promise0, promise1, promise2, (0, util_1.sleep)(100).then(_ => "done")]), "done");
t.is(count, 0);
});
(0, ava_1.default)("funnel gets executed asynchronously, not at the moment of push", async (t) => {
const funnel = new throttle_1.Funnel(1);
let n = 0;
funnel.push(async () => {
n++;
});
t.is(n, 0);
await funnel.all();
t.is(n, 1);
});
(0, ava_1.default)("funnel handles promise rejections without losing concurrency", async (t) => {
const funnel = new throttle_1.Funnel(1);
let executed = false;
await t.throwsAsync(funnel.push(() => Promise.reject(new Error("message"))), { message: "message" });
await funnel.push(async () => {
executed = true;
});
t.is(executed, true);
});
(0, ava_1.default)("funnel.all() waits for all requests to finish", async (t) => {
const funnel = new throttle_1.Funnel(1);
let executed = false;
funnel.push(async () => {
await (0, util_1.sleep)(200);
executed = true;
return "first";
});
funnel.push(async () => "second");
t.is(executed, false);
const result = await funnel.all();
t.is(result.length, 2);
t.is(result[0], "first");
t.is(result[1], "second");
t.is(executed, true);
});
(0, ava_1.default)("funnel.all() ignores errors and waits for other requests to finish", async (t) => {
const funnel = new throttle_1.Funnel(1);
funnel.push(async () => {
throw new Error();
});
funnel.push(async () => {
await (0, util_1.sleep)(100);
return "done";
});
const result = await funnel.all();
t.is(result.length, 2);
t.falsy(result[0]);
t.is(result[1], "done");
});
(0, ava_1.default)("retryOp() retries failures", async (t) => {
let attempts = 0;
await (0, throttle_1.retryOp)(2, async () => {
attempts++;
throw new Error();
}).catch(_ => { });
t.is(attempts, 3);
});
(0, ava_1.default)("funnel shouldRetry parameter retries failures", async (t) => {
const funnel = new throttle_1.Funnel(1, 2);
let attempts = 0;
let errors = 0;
funnel
.push(async () => {
attempts++;
throw Error();
})
.catch(_ => errors++);
await funnel.all();
t.is(attempts, 3);
t.is(errors, 1);
});
(0, ava_1.default)("funnel cancellation", async (t) => {
const funnel = new throttle_1.Funnel(1);
let executed = 0;
const promise = funnel.push(async () => {
executed++;
}, 0, () => "cancelled");
await t.throwsAsync(promise);
t.is(executed, 0);
});
(0, ava_1.default)("funnel processed and error counts", async (t) => {
const funnel = new throttle_1.Funnel(2);
funnel.push(async () => { });
funnel.push(async () => Promise.reject());
funnel.push(async () => { });
funnel.push(async () => Promise.reject());
funnel.push(async () => { });
await funnel.all();
t.is(funnel.processed, 3);
t.is(funnel.errors, 2);
});
ava_1.default.serial("pump works for concurrency level 1", t => (0, util_1.withClock)(async () => {
let executed = 0;
const pump = new throttle_1.Pump({ concurrency: 1 }, () => {
executed++;
return (0, util_1.sleep)(100);
});
t.is(executed, 0);
pump.start();
await (0, util_1.sleep)(300);
pump.stop();
t.true(executed === 3);
}));
ava_1.default.serial("pump works for concurrency level 10", t => (0, util_1.withClock)(async () => {
let executed = 0;
const pump = new throttle_1.Pump({ concurrency: 10 }, () => {
executed++;
return (0, util_1.sleep)(100);
});
pump.start();
await (0, util_1.sleep)(100);
pump.stop();
t.is(executed, 10);
}));
ava_1.default.serial("pump handles promise rejections without losing concurrency", t => (0, util_1.withClock)(async () => {
let executed = 0;
const pump = new throttle_1.Pump({ concurrency: 1, verbose: false }, () => {
executed++;
return (0, util_1.sleep)(100).then(_ => Promise.reject("hi"));
});
pump.start();
await (0, util_1.sleep)(500);
pump.stop();
t.is(executed, 5);
}));
ava_1.default.serial("pump drain", t => (0, util_1.withClock)(async () => {
let started = 0;
let finished = 0;
const N = 5;
const pump = new throttle_1.Pump({ concurrency: N }, async () => {
started++;
await (0, util_1.sleep)(100);
finished++;
});
t.is(started, 0);
t.is(finished, 0);
pump.start();
await pump.drain();
t.is(started, N);
t.is(finished, N);
}));
ava_1.default.serial("memoize returns cached results for the same key", t => (0, util_1.withClock)(async () => {
const promises = [];
const N = 10;
const timerFn = (0, throttle_1.throttle)({ memoize: true, concurrency: 1, rate: 10 }, _ => (0, functions_1.timer)(10));
for (let i = 0; i < N; i++) {
promises.push(timerFn("key"));
}
const times = await Promise.all(promises);
t.is((0, util_1.measureConcurrency)(times), N);
}));
ava_1.default.serial("memoize runs the worker for different keys", t => (0, util_1.withClock)(async () => {
const promises = [];
const N = 10;
const timerFn = (0, throttle_1.throttle)({ memoize: true, concurrency: 1, rate: 10 }, _ => (0, functions_1.timer)(10));
for (let i = 0; i < N; i++) {
promises.push(timerFn(i));
}
const times = await Promise.all(promises);
t.is((0, util_1.measureConcurrency)(times), 1);
}));
async function withCache(fn) {
const nonce = (0, uuid_1.v4)();
const cache = new cache_1.PersistentCache(`.faast/test/${nonce}`);
await fn(cache).catch(console.error);
await cache.clear({ leaveEmptyDir: false });
}
(0, ava_1.default)("caching saves values and skips re-execution", t => withCache(async (cache) => {
let counter = 0;
function fn(_) {
return Promise.resolve(counter++);
}
const mfn = (0, throttle_1.cacheFn)(cache, fn);
await mfn(0);
await mfn(7);
await mfn(0);
t.is(counter, 2);
const mfn2 = (0, throttle_1.cacheFn)(cache, fn);
await mfn2(0);
await mfn2(7);
await mfn2(0);
await mfn2(10);
t.is(counter, 3);
}));
(0, ava_1.default)("cache works with string arguments", async (t) => withCache(async (cache) => {
let counter = 0;
function fn(_) {
return Promise.resolve(counter++);
}
const mfn = (0, throttle_1.cacheFn)(cache, fn);
await mfn("a");
await mfn("b");
await mfn("a");
t.is(counter, 2);
}));
(0, ava_1.default)("cache works with object arguments", async (t) => withCache(async (cache) => {
let counter = 0;
function fn(_) {
return Promise.resolve(counter++);
}
const mfn = (0, throttle_1.cacheFn)(cache, fn);
await mfn({ f: "field", i: 42 });
await mfn({ f: "field", i: 1 });
await mfn({ f: "other", i: 42 });
await mfn({ f: "field", i: 42 });
t.is(counter, 3);
}));
(0, ava_1.default)("cache does not save rejected promises from cached function", async (t) => withCache(async (cache) => {
let counter = 0;
function fn(_) {
counter++;
return Promise.reject(new Error("rejection"));
}
let caught = 0;
const mfn = (0, throttle_1.cacheFn)(cache, fn);
await mfn(1).catch(_ => caught++);
await mfn(2).catch(_ => caught++);
await mfn(1).catch(_ => caught++);
t.is(counter, 3);
t.is(caught, 3);
}));
function measureMaxRequestRatePerSecond(timings) {
const requestsPerSecondStartingAt = timings
.map(t => t.start)
.map(t => timings.filter(({ start }) => start >= t && start < t + 1000).length);
return Math.max(...requestsPerSecondStartingAt);
}
ava_1.default.serial("rate limiter restricts max request rate per second", t => (0, util_1.withClock)(async () => {
const requestRate = 10;
const rateLimiter = new throttle_1.RateLimiter(requestRate);
const promises = [];
for (let i = 0; i < 15; i++) {
promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
}
const timings = await Promise.all(promises);
t.is(measureMaxRequestRatePerSecond(timings), requestRate);
}));
ava_1.default.serial("rate limiter works across second boundaries", t => (0, util_1.withClock)(async () => {
const requestRate = 10;
const rateLimiter = new throttle_1.RateLimiter(requestRate);
const promises = [];
promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
await (0, util_1.sleep)(900);
for (let i = 0; i < 15; i++) {
promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
}
const timings = await Promise.all(promises);
t.is(measureMaxRequestRatePerSecond(timings), requestRate);
}));
ava_1.default.serial("rate limiter bursting allows for request rate beyond target rate", t => (0, util_1.withClock)(async () => {
const requestRate = 10;
const maxBurst = 5;
const rateLimiter = new throttle_1.RateLimiter(requestRate, maxBurst);
const promises = [];
for (let i = 0; i < 15; i++) {
promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
}
const timings = await Promise.all(promises);
const maxRate = measureMaxRequestRatePerSecond(timings);
t.true(maxRate <= maxBurst + requestRate);
t.true(maxRate > maxBurst);
}));
ava_1.default.serial("throttle limits max concurrency and rate", t => (0, util_1.withClock)(async () => {
const concurrency = 10;
const rate = 10;
const timerFn = (0, throttle_1.throttle)({ concurrency, rate }, functions_1.timer);
const promises = [];
for (let i = 0; i < 15; i++) {
promises.push(timerFn(1000));
}
const times = await Promise.all(promises);
t.is((0, util_1.measureConcurrency)(times), concurrency);
t.is(measureMaxRequestRatePerSecond(times), rate);
}));
ava_1.default.serial("throttle limits rate with single concurrency", t => (0, util_1.withClock)(async () => {
const concurrency = 1;
const rate = 10;
const processTimeMs = 200;
const timerFn = (0, throttle_1.throttle)({ concurrency, rate }, functions_1.timer);
const promises = [];
for (let i = 0; i < 10; i++) {
promises.push(timerFn(processTimeMs));
}
const times = await Promise.all(promises);
t.is((0, util_1.measureConcurrency)(times), concurrency);
t.true(measureMaxRequestRatePerSecond(times) <= 1000 / processTimeMs + 1);
}));
(0, ava_1.default)("throttle memoize option", async (t) => {
const concurrency = 1;
const rate = 100;
let counter = 0;
const N = 5;
async function fn(_) {
counter++;
}
const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, memoize: true }, fn);
const promises = [];
for (let i = 0; i < N; i++) {
promises.push(throttledFn(i));
}
for (let i = 0; i < N; i++) {
promises.push(throttledFn(i));
}
await Promise.all(promises);
t.is(counter, N);
});
(0, ava_1.default)("throttle cache option persists values", async (t) => withCache(async (cache) => {
const concurrency = 1;
const rate = 100;
let counter = 0;
async function fn(_) {
return counter++;
}
const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, cache }, fn);
const v = await throttledFn(10);
t.is(v, 0);
const throttledFn2 = (0, throttle_1.throttle)({ concurrency, rate, cache }, fn);
const u1 = await throttledFn2(10);
const u2 = await throttledFn2(20);
t.is(u1, 0);
t.is(u2, 1);
t.is(counter, 2);
}));
(0, ava_1.default)("throttle cache and memoize options work together", async (t) => withCache(async (cache) => {
const concurrency = 1;
const rate = 100;
let counter = 0;
async function fn(_) {
return counter++;
}
const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, memoize: true, cache }, fn);
const v = await throttledFn(10);
const v2 = await throttledFn(10);
t.is(v, 0);
t.is(v2, 0);
const throttledFn2 = (0, throttle_1.throttle)({ concurrency, rate, memoize: true, cache }, fn);
const u1 = await throttledFn2(10);
const u2 = await throttledFn2(20);
const u3 = await throttledFn2(10);
t.is(u1, 0);
t.is(u2, 1);
t.is(u3, 0);
t.is(counter, 2);
}));
ava_1.default.serial("throttle cancellation", async (t) => (0, util_1.withClock)(async () => {
const concurrency = 10;
const rate = 100;
let counter = 0;
async function fn(_) {
return counter++;
}
const cancel = new throttle_1.Deferred();
const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, memoize: true, cancel: cancel.promise }, fn);
throttledFn(1);
throttledFn(2);
throttledFn(3);
await (0, util_1.sleep)(100);
t.is(counter, 3);
counter = 0;
throttledFn(1);
throttledFn(2);
throttledFn(3);
cancel.resolve();
await (0, util_1.sleep)(100);
t.is(counter, 0);
}));
(0, ava_1.default)("AsyncQueue works with enqueue before dequeue", async (t) => {
const q = new throttle_1.AsyncQueue();
q.enqueue(42);
t.is(await q.next(), 42);
});
(0, ava_1.default)("AsyncQueue works with multiple enqueues before dequeue", async (t) => {
const q = new throttle_1.AsyncQueue();
q.enqueue(42);
q.enqueue(43);
t.is(await q.next(), 42);
t.is(await q.next(), 43);
});
(0, ava_1.default)("AsyncQueue works with dequeue before enqueue", async (t) => {
const q = new throttle_1.AsyncQueue();
const promise = q.next();
q.enqueue(42);
t.is(await promise, 42);
});
(0, ava_1.default)("AsyncQueue works with multiple dequeues before enqueue", async (t) => {
const q = new throttle_1.AsyncQueue();
const promises = [q.next(), q.next()];
q.enqueue(42);
q.enqueue(43);
t.deepEqual(await Promise.all(promises), [42, 43]);
});
(0, ava_1.default)("AsyncQueue transition from more enqueues to more dequeues", async (t) => {
const q = new throttle_1.AsyncQueue();
q.enqueue(42);
t.is(await q.next(), 42);
const promise = q.next();
q.enqueue(100);
t.is(await promise, 100);
});
(0, ava_1.default)("AsyncQueue transition from more dequeues to more enqueues", async (t) => {
const q = new throttle_1.AsyncQueue();
const promise = q.next();
q.enqueue(42);
q.enqueue(100);
t.is(await promise, 42);
t.is(await q.next(), 100);
});
(0, ava_1.default)("AsyncQueue handles async enqueueing", async (t) => {
const q = new throttle_1.AsyncQueue();
const promise = q.next();
setTimeout(() => q.enqueue(99), 100);
t.is(await promise, 99);
});
(0, ava_1.default)("AsyncQueue handles async dequeueing", async (t) => {
t.plan(1);
const q = new throttle_1.AsyncQueue();
q.enqueue(88);
await new Promise(resolve => setTimeout(async () => {
t.is(await q.next(), 88);
resolve();
}, 100));
});
(0, ava_1.default)("AsyncQueue clear", async (t) => {
const q = new throttle_1.AsyncQueue();
q.enqueue(1);
q.clear();
q.enqueue(2);
t.is(await q.next(), 2);
const p1 = q.next();
q.clear();
const p2 = q.next();
q.enqueue(3);
t.is(await p2, 3);
});
async function toArray(iterable) {
const result = [];
for await (const value of iterable) {
result.push(value);
}
return result;
}
async function take(q, n) {
const result = [];
for (let i = 0; i < n; i++) {
result.push(await q.next());
}
return result;
}
(0, ava_1.default)("AsyncIterableQueue done function finishes iterator", async (t) => {
const q = new throttle_1.AsyncIterableQueue();
q.push(10);
q.done();
t.deepEqual(await toArray(q), [10]);
// test times out if the done function doesn't work.
});
(0, ava_1.default)("AsyncIterableQueue done function finishes iterator with pending dequeus", async (t) => {
const q = new throttle_1.AsyncIterableQueue();
const value = q.next();
q.done();
t.is((await value).done, true);
});
(0, ava_1.default)("AsyncOrderedQueue reorders according to sequence value", async (t) => {
const q = new throttle_1.AsyncOrderedQueue();
q.push(42, 1);
q.push(-42, 0);
t.deepEqual(await take(q, 2), [-42, 42]);
});
(0, ava_1.default)("AsyncOrderedQueue takes the first value with a given sequence value", async (t) => {
const q = new throttle_1.AsyncOrderedQueue();
q.push(100, 1);
q.push(101, 1);
q.push(42, 0);
t.deepEqual(await take(q, 2), [42, 100]);
});
(0, ava_1.default)("AsyncOrderedQueue pushImmediate pre-empts arrival order", async (t) => {
const q = new throttle_1.AsyncOrderedQueue();
q.push(42, 0);
q.push(44, 2);
q.pushImmediate(100);
q.push(43, 1);
t.is(await q.next(), 42);
t.is(await q.next(), 100);
t.is(await q.next(), 43);
t.is(await q.next(), 44);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC10aHJvdHRsZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC91bml0LXRocm90dGxlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQXVCO0FBQ3ZCLCtCQUFvQztBQUNwQyx3Q0FBK0M7QUFDL0MsOENBV3lCO0FBQ3pCLG9EQUFxRDtBQUNyRCwwQ0FBdUU7QUFFdkUsSUFBQSxhQUFJLEVBQUMsK0JBQStCLEVBQUUsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFO0lBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksbUJBQVEsRUFBRSxDQUFDO0lBQ2hDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUN2QixDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUMsQ0FBQztBQUVILElBQUEsYUFBSSxFQUFDLDhCQUE4QixFQUFFLEtBQUssRUFBQyxDQUFDLEVBQUMsRUFBRTtJQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLG1CQUFRLEVBQUUsQ0FBQztJQUNoQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLElBQUksQ0FBQztRQUNELE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBQUMsT0FBTyxDQUFD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