UNPKG

faastjs

Version:

Serverless batch computing made simple.

594 lines 86.8 kB
"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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