Üç model
graduated, volume (on_crossing düzeltmeli), package. Kademe başına per, sabit ücret, gözlem başı taban/tavan, per_event_up ya da sapmasız cumulative yuvarlama.
Tarifeyi ve şimdiye kadarki kullanımı sen verirsin; kütüphane tutarı hesaplar ve yazılacak planı döner. Ne zaman, nerede, kim — sayma, saklama, takvim, tampon, kuyruk, bakiye, HTTP, UI — senin uygulamanda kalır.
import { buildMetering } from "pricemeter";import { z } from "zod";
export const metering = buildMetering() .context(z.object({ accountId: z.string() })) .refs(["otp_send"]) .meter("msg/free_pool") .meter("otp/sms", { country: z.string().length(2) }, { feeds: { "msg/free_pool": 1 } }) .getRate(async (meter, dims, ctx, at) => ({ rate: await myTariff(meter, dims, ctx, at), usedSoFar: await myCounter(ctx, meter) })) .commit(async (plan) => myLedger.apply(plan)); // all-or-nothing, idempotent on (refType, refId)
const r = await metering.observe("otp/sms", { country: "TR" }, 2, { type: "otp_send", id: msgId }, { accountId });// { ok: true, charged: 40000, lines: [...] } or { ok: false, reason: "insufficient_credit" | "no_price" | ... }Üç model
graduated, volume (on_crossing düzeltmeli), package. Kademe başına per, sabit ücret, gözlem başı taban/tavan, per_event_up ya da sapmasız cumulative yuvarlama.
Saf çekirdek
rate() ve price() I/O yapmaz. observe ince bir sarmalayıcıdır: getRate → price → commit.
Hold
Çok satırlı rezervasyon bir değer nesnesidir: kısmi capture, extend, release. Tarife hold’un içinde saklanır.
Tipli katalog
Sayaç id’leri, boyutlar (zod / valibot / arktype, Standard Schema), havuzlar (feeds) derleme anında denetlenir. 500 sayaçlı katalog ~0,6 sn’de tip denetiminden geçer.
| Bağımlılık | Çalışma zamanında sıfır |
| Biçim | ESM + CJS, tipleriyle |
| Çalışma ortamı | Node ≥ 20, Bun, Cloudflare Workers |
| Para | MicroUsd: tamsayı number, 1 birim = 1.000.000; 2^53 ≈ 9 milyar ana birim. Rate para birimi taşımaz |
| Paket | Tek paket: pricemeter. Alt yollar: /rates, /gauge, /adjustments, /calendar, /testing, /sqlite, /cloudflare |