faastjs
Version:
Serverless batch computing made simple.
594 lines • 86.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const ava_1 = 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC10aHJvdHRsZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC91bml0LXRocm90dGxlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBdUI7QUFDdkIsK0JBQW9DO0FBQ3BDLHdDQUErQztBQUMvQyw4Q0FXeUI7QUFDekIsb0RBQXFEO0FBQ3JELDBDQUF1RTtBQUV2RSxJQUFBLGFBQUksRUFBQywrQkFBK0IsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7SUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxtQkFBUSxFQUFFLENBQUM7SUFDaEMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QixRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBQSxhQUFJLEVBQUMsOEJBQThCLEVBQUUsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFO0lBQzNDLE1BQU0sUUFBUSxHQUFHLElBQUksbUJBQVEsRUFBRSxDQUFDO0lBQ2hDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEIsSUFBSTtRQUNBLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQztLQUMxQjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1Is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