UNPKG

faastjs

Version:

Serverless batch computing made simple.

595 lines 87.1 kB
"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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