@ bearly/ 间隔
重新连接和重启循环的纯正间隔政策:何时再次尝试,何时一个依赖已经准备好.
这里没有任何东西拥有一个时钟,一个计时器,一个套接字或者一个过程. 你通过 now, (中文(简体) ), sleep你的探测器,在测试中,一个种子
随机源. 模块将常见的焦躁图案和一个备战门放在一个位置,所以每个回路都可以使用
同一个代码.
安装
从 npm 安装; git 安装可解析 TypeScript 源并只在 Bun 下运行 .
bun add @bearly/pacing
使用
import { additiveJitter, awaitReady, decorrelatedJitter, fullJitter } from "@bearly/pacing"
// Full jitter: uniform in [0, min(cap, base * 2 ** attempt)]. A plain spread over a window is base = cap = window.
const delay = fullJitter(250, 30_000, attempt)
// Additive jitter: keep the exponential delay as a floor and spread up to 25% above it, clipped to cap.
const quotaDelay = additiveJitter(60_000, 3_600_000, attempt, 0.25)
// Decorrelated jitter: uniform in [base, min(cap, previous * 3)]; feed back the last delay (base on the first call).
let wait = 500
wait = decorrelatedJitter(500, 30_000, wait)
// Readiness gate: probe until it answers true or the timeout (a duration) passes.
const outcome = await awaitReady(() => daemon.ping(), {
timeoutMs: 30_000,
retryMs: 250,
now: () => Date.now(),
sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
})
if (!outcome.ready) console.warn(`daemon not ready after ${outcome.waitedMs} ms`, outcome.lastError)
awaitReady 探测器一次,没有睡眠。 然后用装饰相伴而眠 retryMs 财务报告和审定财务报表
maxRetryMs (默认) retryMs * 8),被剪断了,所以它从来没有睡过超时. 最后一个探测器运行在
暂停,以及 ready: false 之后才回来 抛出数为未准备好的探测器,其最后一个错误是
已经返回.
当重试必须至少等待其指数基数时选择添加态焦点, 当整个延迟可以时选择全态焦点 由 0 展开, 当对等方在争论中从先前的延迟中节奏时, 解开相关的焦急 .
探测器必须绑住自己. 门只检查探测器之间的超时,所以一个永远无法解决的探测器
门将永远通过它的时间。 给每个探测器自己的超时 短于 timeoutMs: 呼叫超时
套接字,或一个 AbortSignal.timeout {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}在取货时 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}我...
每个函数投出 RangeError 当它的边框名称不延时(负基、基底下方的上限、分数)
尝试,在 [0, 1] 外的添加剂比,或不是有限数量的约束.
保证
- 延迟不会超过上限; 添加剂活泼不会降到指数地板下, 装饰活泼永远不会 坠入它的底部.
- 备战的大门从不睡觉过夜 每个探测器落地时 它都会在超时返回.
- 没有I/O,计时器或全球.
Math.random是默认的随机源,每个函数都需要替换.