@arnaudjnn/billing-tools 0.55.0 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/workos-org.d.ts +2 -0
- package/dist/adapters/workos-org.d.ts.map +1 -1
- package/dist/adapters/workos-org.js +4 -0
- package/dist/adapters/workos-org.js.map +1 -1
- package/dist/allowance.d.ts +81 -0
- package/dist/allowance.d.ts.map +1 -0
- package/dist/allowance.js +130 -0
- package/dist/allowance.js.map +1 -0
- package/dist/billing.d.ts.map +1 -1
- package/dist/billing.js +4 -0
- package/dist/billing.js.map +1 -1
- package/dist/doctor.d.ts +11 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +109 -0
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/metering.d.ts +38 -14
- package/dist/metering.d.ts.map +1 -1
- package/dist/metering.js +65 -42
- package/dist/metering.js.map +1 -1
- package/dist/plan-model.d.ts +395 -0
- package/dist/plan-model.d.ts.map +1 -0
- package/dist/plan-model.js +342 -0
- package/dist/plan-model.js.map +1 -0
- package/dist/plans.d.ts +25 -53
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +55 -34
- package/dist/plans.js.map +1 -1
- package/dist/pricing.d.ts +130 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +260 -0
- package/dist/pricing.js.map +1 -0
- package/dist/sync.d.ts +3 -16
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +45 -26
- package/dist/sync.js.map +1 -1
- package/dist/tax-ids.d.ts +26 -0
- package/dist/tax-ids.d.ts.map +1 -0
- package/dist/tax-ids.js +50 -0
- package/dist/tax-ids.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/ui/index.d.ts +1 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +2 -0
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/tax-id-types.d.ts +10 -0
- package/dist/ui/tax-id-types.d.ts.map +1 -0
- package/dist/ui/tax-id-types.js +140 -0
- package/dist/ui/tax-id-types.js.map +1 -0
- package/dist/usage-ledger.d.ts +87 -0
- package/dist/usage-ledger.d.ts.map +1 -0
- package/dist/usage-ledger.js +117 -0
- package/dist/usage-ledger.js.map +1 -0
- package/package.json +6 -1
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,10 @@ export { authContext, runWithAuth, runWithResolvedOrg, enforceAccess, enforceTok
|
|
|
4
4
|
export { getWorkOS } from "./workos.js";
|
|
5
5
|
export { createWorkOSOrgMirror, ALL_MEMBERSHIP_STATUSES, type WorkOSOrgMirror, type WorkOSOrgMirrorOptions, } from "./org-mirror.js";
|
|
6
6
|
export { getStripe, stripeConfigured, ensureStripeCustomer, getBillingCustomerId, getOrgSubscription, getTokenBalance, deductTokens, creditTokens, usageSince, createTokenCheckoutSession, createBillingPortalSession, getAutoReloadSettings, setAutoReloadSettings, tryAutoReload, listInvoices, listSubscriptionPrices, resolveSubscriptionPrice, type StripePrice, } from "./billing.js";
|
|
7
|
-
export { ensurePlans, resolvePlanPrices, invalidatePlanPrices, migrateSubscriptions, planPriceId, planForPriceId, seatTypeForPriceId, seatLimit, includedTokens, includedTokensByType, lookupKeyFor, DEFAULT_SEAT_TYPES, type PlanDef, type SeatTypeDef, type PlansConfig, type BillingInterval, type EnsuredPrice, type PlanPrices, type MigratedSubscription, type MigrateSubscriptionsResult, } from "./plans.js";
|
|
7
|
+
export { ensurePlans, resolvePlanPrices, invalidatePlanPrices, migrateSubscriptions, planPriceId, planForPriceId, seatTypeForPriceId, seatLimit, seatTypeLimit, planSale, definePlans, isLegacyPlan, normalizePlan, normalizePlans, planModel, plansWhere, selfServePlans, defaultBasket, validateBasket, describeBasketProblem, grantFor, poolSizeOf, packSizeOf, exhaustedPolicy, cycleWindowFor, includedTokens, includedTokensByType, lookupKeyFor, DEFAULT_SEAT_TYPES, type PlanDef, type SeatTypeDef, type PlansConfig, type BillingInterval, type EnsuredPrice, type PlanPrices, type MigratedSubscription, type MigrateSubscriptionsResult, type PlanCatalog, type PlanSpec, type PlanModel, type PlanDisplay, type PlanLimits, type SeatTypeSpec, type SeatTypeDisplay, type NormalSeatType, type Sells, type Grant, type Cap, type Exhausted, type Replenish, type Sale, type Money, type IntervalPrice, type Quantities as PlanQuantities, type BasketProblem, type CycleWindow, } from "./plans.js";
|
|
8
|
+
export { derivePlanViews, derivePlanView, renderPlansMarkdown, renderRateCardMarkdown, type PlanView, type PlanPriceView, type SeatRowView, type CtaView, type MoneyView, type DerivePlanViewsOptions, type MarkdownOptions, } from "./pricing.js";
|
|
9
|
+
export { resolveAllowance, fundingFor, describeDenial, type AllowanceState, type AllowanceInput, type FundingDecision, type DenialReason, } from "./allowance.js";
|
|
10
|
+
export { stripeBalanceUsageLedger, stripeMeterUsageLedger, ensureMeters, invalidateMeters, USAGE_METER_EVENT, type UsageLedger, type UsageEvent, type UsageQuery, type FundingSource, } from "./usage-ledger.js";
|
|
8
11
|
export { meterUsage, createMeter, createApiMeterGuard, type MeterCaller, type MeterInput, type MeterResult, type MeterConfig, type MeterCallOpts, type Meter, type ApiMeterGuard, } from "./metering.js";
|
|
9
12
|
export { requestTopUp, listTopUpRequests, approveTopUp, denyTopUp, extraAllowance, type TopUpRequest, } from "./topup.js";
|
|
10
13
|
export { assignSeatType, listSeatAssignments, getSeatType, } from "./seats.js";
|
|
@@ -26,7 +29,7 @@ export { createStripeWebhookHandler, type WebhookOptions } from "./routes/webhoo
|
|
|
26
29
|
export { ensureWebhookEndpoint, BILLING_WEBHOOK_EVENTS, type EnsureWebhookResult, } from "./webhook-setup.js";
|
|
27
30
|
export { resolveTax, ensureStripeTaxRate, invalidateTaxRates, taxRatesFor, updateCheckoutSessionTaxRates, type TaxDecision, } from "./tax.js";
|
|
28
31
|
export { ensureTaxSetup, type TaxRegistrationSpec, type TaxSetupResult, } from "./tax-setup.js";
|
|
29
|
-
export { checkBillingSetup, formatDoctorResult, type Check, type CheckLevel, type DoctorResult, } from "./doctor.js";
|
|
32
|
+
export { checkBillingSetup, checkPlansConfig, formatDoctorResult, type Check, type CheckLevel, type DoctorResult, } from "./doctor.js";
|
|
30
33
|
export { registerBillingCommands } from "./cli/commands.js";
|
|
31
34
|
export { callTool, listTools, type ApiClientConfig } from "./cli/client.js";
|
|
32
35
|
export { type CliOptions, type CliConfig, configPath, readConfig, writeConfig, resolveBaseUrl, resolveApiKey, } from "./cli/config.js";
|
|
@@ -41,4 +44,6 @@ export type { SavedCard } from "./payment-methods.js";
|
|
|
41
44
|
export { getBillingProfile, updateBillingProfile, INVOICE_EMAIL_MAX, COMPANY_NAME_MAX, } from "./billing-profile.js";
|
|
42
45
|
export type { BillingProfile } from "./billing-profile.js";
|
|
43
46
|
export type { BillingAddress } from "./billing-profile.js";
|
|
47
|
+
export { listCustomerTaxIds, setCustomerTaxId } from "./tax-ids.js";
|
|
48
|
+
export type { CustomerTaxId } from "./tax-ids.js";
|
|
44
49
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,cAAc,EACd,WAAW,EACX,UAAU,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGnE,OAAO,EACL,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,MAAM,WAAW,CAAC;AAMnB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,EACxB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,22 @@ export { createWorkOSOrgMirror, ALL_MEMBERSHIP_STATUSES, } from "./org-mirror.js
|
|
|
13
13
|
// Billing engine (Stripe math)
|
|
14
14
|
export { getStripe, stripeConfigured, ensureStripeCustomer, getBillingCustomerId, getOrgSubscription, getTokenBalance, deductTokens, creditTokens, usageSince, createTokenCheckoutSession, createBillingPortalSession, getAutoReloadSettings, setAutoReloadSettings, tryAutoReload, listInvoices, listSubscriptionPrices, resolveSubscriptionPrice, } from "./billing.js";
|
|
15
15
|
// Declarative plans (auto-provision Stripe products/prices from config)
|
|
16
|
-
export { ensurePlans, resolvePlanPrices, invalidatePlanPrices, migrateSubscriptions, planPriceId, planForPriceId, seatTypeForPriceId, seatLimit,
|
|
16
|
+
export { ensurePlans, resolvePlanPrices, invalidatePlanPrices, migrateSubscriptions, planPriceId, planForPriceId, seatTypeForPriceId, seatLimit, seatTypeLimit, planSale,
|
|
17
|
+
// The plan model: five independent axes (what it sells, what it credits, what
|
|
18
|
+
// it includes, how it's replenished, whether it can be bought) + presentation.
|
|
19
|
+
// The legacy PlanDef keeps working — `normalizePlans` maps it.
|
|
20
|
+
definePlans, isLegacyPlan, normalizePlan, normalizePlans, planModel, plansWhere, selfServePlans, defaultBasket, validateBasket, describeBasketProblem, grantFor, poolSizeOf, packSizeOf, exhaustedPolicy, cycleWindowFor, includedTokens, includedTokensByType, lookupKeyFor, DEFAULT_SEAT_TYPES, } from "./plans.js";
|
|
21
|
+
// Pricing view models: the plan config turned into what a surface renders. Also
|
|
22
|
+
// available as the leaf entry point `@arnaudjnn/billing-tools/pricing`, which
|
|
23
|
+
// pulls in neither Stripe nor WorkOS — so a client component and a docs
|
|
24
|
+
// generator can both read it.
|
|
25
|
+
export { derivePlanViews, derivePlanView, renderPlansMarkdown, renderRateCardMarkdown, } from "./pricing.js";
|
|
26
|
+
// Included allowance as a counted WINDOW (a pool, or a per-seat pack) rather than
|
|
27
|
+
// as credit — a Stripe credit balance auto-applies to the next invoice, so
|
|
28
|
+
// crediting a plan's own included tokens discounts its own renewal.
|
|
29
|
+
export { resolveAllowance, fundingFor, describeDenial, } from "./allowance.js";
|
|
30
|
+
// Counting usage separately from moving money — the seam an included window needs.
|
|
31
|
+
export { stripeBalanceUsageLedger, stripeMeterUsageLedger, ensureMeters, invalidateMeters, USAGE_METER_EVENT, } from "./usage-ledger.js";
|
|
17
32
|
// Per-execution metering engine (prepaid balance; per-seat packs or a global
|
|
18
33
|
// pool; usage summed from Stripe balance-transaction metadata — no new backend).
|
|
19
34
|
export { meterUsage, createMeter, createApiMeterGuard, } from "./metering.js";
|
|
@@ -62,7 +77,7 @@ export { resolveTax, ensureStripeTaxRate, invalidateTaxRates, taxRatesFor, updat
|
|
|
62
77
|
export { ensureTaxSetup, } from "./tax-setup.js";
|
|
63
78
|
// Preflight for the misconfigurations that fail silently (zero tax, unspecified
|
|
64
79
|
// tax_behavior, a missing or disabled endpoint, duplicates).
|
|
65
|
-
export { checkBillingSetup, formatDoctorResult, } from "./doctor.js";
|
|
80
|
+
export { checkBillingSetup, checkPlansConfig, formatDoctorResult, } from "./doctor.js";
|
|
66
81
|
// CLI factory
|
|
67
82
|
export { registerBillingCommands } from "./cli/commands.js";
|
|
68
83
|
export { callTool, listTools } from "./cli/client.js";
|
|
@@ -76,4 +91,5 @@ export { createCheckoutSession, checkoutSessionOutcome, expireCheckoutSession, f
|
|
|
76
91
|
export { resolveSession, ANONYMOUS_SESSION } from "./session.js";
|
|
77
92
|
export { listPaymentMethods, createCardSetupIntent, setDefaultPaymentMethod, detachPaymentMethod, } from "./payment-methods.js";
|
|
78
93
|
export { getBillingProfile, updateBillingProfile, INVOICE_EMAIL_MAX, COMPANY_NAME_MAX, } from "./billing-profile.js";
|
|
94
|
+
export { listCustomerTaxIds, setCustomerTaxId } from "./tax-ids.js";
|
|
79
95
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAYnE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEnE,cAAc;AACd,OAAO,EACL,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,MAAM,WAAW,CAAC;AAEnB,8EAA8E;AAC9E,6EAA6E;AAC7E,6EAA6E;AAC7E,gFAAgF;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,6EAA6E;AAC7E,6EAA6E;AAC7E,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GAGxB,MAAM,iBAAiB,CAAC;AAEzB,+BAA+B;AAC/B,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,cAAc,CAAC;AAEtB,wEAAwE;AACxE,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/metering.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CycleWindow, type PlanCatalog } from "./plan-model.js";
|
|
2
|
+
import { type UsageLedger } from "./usage-ledger.js";
|
|
2
3
|
import type { BillingAdapter, ResolvedConfig } from "./types.js";
|
|
3
4
|
export interface MeterCaller {
|
|
4
5
|
/** `user` = a human via session/OAuth (their seat); `api` = an API key / agent
|
|
@@ -16,28 +17,39 @@ export interface MeterInput {
|
|
|
16
17
|
action: string;
|
|
17
18
|
/** Token cost for this execution (rate card × units), resolved by the consumer. */
|
|
18
19
|
cost: number;
|
|
19
|
-
plans:
|
|
20
|
+
plans: PlanCatalog;
|
|
20
21
|
/** The org's current plan key (consumer resolves + caches it). */
|
|
21
22
|
plan: string | null;
|
|
22
|
-
/** Start of the current billing cycle, unix
|
|
23
|
-
*
|
|
24
|
-
cycleStart
|
|
25
|
-
/**
|
|
26
|
-
*
|
|
23
|
+
/** Start of the current billing cycle, unix SECONDS (unchanged). Prefer
|
|
24
|
+
* `cycle`, which also carries the END — an annual window needs both. */
|
|
25
|
+
cycleStart?: number;
|
|
26
|
+
/** The window usage is measured over. Derived from the subscription period
|
|
27
|
+
* when omitted. */
|
|
28
|
+
cycle?: CycleWindow;
|
|
29
|
+
/** @deprecated Resolved from the adapter now (see `resolveAllowance`), so a
|
|
30
|
+
* caller can no longer pass a cycle key that disagrees with the window. */
|
|
27
31
|
extraAllowance?: number;
|
|
32
|
+
/** Where usage is counted. Defaults to the balance-transaction ledger, which
|
|
33
|
+
* is exact but can only see wallet-funded calls — a plan with an included
|
|
34
|
+
* window wants `stripeMeterUsageLedger()`. */
|
|
35
|
+
ledger?: UsageLedger;
|
|
28
36
|
caller?: MeterCaller;
|
|
29
37
|
}
|
|
30
38
|
export type MeterResult = {
|
|
31
39
|
ok: true;
|
|
40
|
+
funded?: "pool" | "pack" | "wallet" | null;
|
|
32
41
|
} | {
|
|
33
42
|
ok: false;
|
|
34
|
-
|
|
43
|
+
/** `pool_exhausted` is new: an org whose included package is used up used
|
|
44
|
+
* to be told "insufficient balance", which pointed at the wrong problem
|
|
45
|
+
* and the wrong remedy. */
|
|
46
|
+
reason: "no_billing" | "insufficient_balance" | "seat_allowance_reached" | "pool_exhausted";
|
|
35
47
|
message: string;
|
|
36
48
|
};
|
|
37
49
|
export declare function meterUsage(adapter: BillingAdapter, config: ResolvedConfig, input: MeterInput): Promise<MeterResult>;
|
|
38
50
|
export interface MeterConfig<R extends Record<string, number> = Record<string, number>> {
|
|
39
|
-
/** Plan catalog (
|
|
40
|
-
plans:
|
|
51
|
+
/** Plan catalog (shapes, packs, pools, limits). */
|
|
52
|
+
plans: PlanCatalog;
|
|
41
53
|
/** action → token cost (per unit). Consumer-authored product data. Omit to
|
|
42
54
|
* always pass an explicit `cost` at the call site. */
|
|
43
55
|
rateCard?: R;
|
|
@@ -54,12 +66,24 @@ export interface MeterConfig<R extends Record<string, number> = Record<string, n
|
|
|
54
66
|
/** Plan-cache TTL (ms). Default 60_000. The plan changes rarely; a brief stale
|
|
55
67
|
* read only affects which allowance mode applies, never the debit. */
|
|
56
68
|
planCacheTtlMs?: number;
|
|
57
|
-
/**
|
|
58
|
-
*
|
|
69
|
+
/**
|
|
70
|
+
* Start of the current billing cycle, unix seconds.
|
|
71
|
+
*
|
|
72
|
+
* No longer needed: the window is derived from the SUBSCRIPTION period when the
|
|
73
|
+
* adapter can report one, falling back to the 1st of the month UTC — which is
|
|
74
|
+
* what an included allowance requires (an annual package measured over calendar
|
|
75
|
+
* months would reset twelve times). Override only to impose your own window.
|
|
76
|
+
*/
|
|
59
77
|
cycleStart?: () => number;
|
|
60
|
-
/** Cycle key top-up grants are stored under. Default "YYYY-MM" UTC.
|
|
61
|
-
*
|
|
78
|
+
/** Cycle key top-up grants are stored under. Default "YYYY-MM" UTC. Derived
|
|
79
|
+
* from the same window as the usage measurement, so the two cannot drift —
|
|
80
|
+
* which they could when this was the caller's obligation. */
|
|
62
81
|
cycleKey?: () => string;
|
|
82
|
+
/** Where usage is counted. Default: the balance-transaction ledger (exact, and
|
|
83
|
+
* free for a wallet-only product). A plan with an INCLUDED window needs
|
|
84
|
+
* `stripeMeterUsageLedger()` — an included call moves no money, so it writes
|
|
85
|
+
* no transaction to count. */
|
|
86
|
+
ledger?: UsageLedger;
|
|
63
87
|
}
|
|
64
88
|
export interface MeterCallOpts {
|
|
65
89
|
/** Who is spending — decides which seat pack the debit draws (by auth identity,
|
package/dist/metering.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metering.d.ts","sourceRoot":"","sources":["../src/metering.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metering.d.ts","sourceRoot":"","sources":["../src/metering.ts"],"names":[],"mappings":"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"}
|
package/dist/metering.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { deductTokens, getBillingCustomerId,
|
|
1
|
+
import { deductTokens, getBillingCustomerId, stripeConfigured, tryAutoReload } from "./billing.js";
|
|
2
2
|
import { isInternalOrg } from "./auth.js";
|
|
3
|
-
import {
|
|
3
|
+
import { describeDenial, fundingFor, resolveAllowance } from "./allowance.js";
|
|
4
4
|
import { getSeatType } from "./seats.js";
|
|
5
|
+
import { planModel } from "./plan-model.js";
|
|
6
|
+
import { stripeBalanceUsageLedger } from "./usage-ledger.js";
|
|
5
7
|
// The shared metering engine (used by every consumer). Pricing is per execution
|
|
6
8
|
// at a uniform cost regardless of surface. The org's prepaid Stripe balance is
|
|
7
9
|
// the shared reserve; in `per_seat` plans each caller's per-cycle pack caps how
|
|
@@ -11,51 +13,63 @@ import { getSeatType } from "./seats.js";
|
|
|
11
13
|
// usage is attributable. Free (cost 0), Stripe-unset, and internal orgs pass
|
|
12
14
|
// through untouched. Persistence is entirely Stripe + the adapter — no new DB.
|
|
13
15
|
export async function meterUsage(adapter, config, input) {
|
|
14
|
-
const { orgId, action, cost, plans, plan,
|
|
15
|
-
const extra = input.extraAllowance ?? 0;
|
|
16
|
+
const { orgId, action, cost, plans, plan, caller } = input;
|
|
16
17
|
if (cost <= 0)
|
|
17
|
-
return { ok: true };
|
|
18
|
+
return { ok: true, funded: null };
|
|
18
19
|
if (!stripeConfigured())
|
|
19
|
-
return { ok: true };
|
|
20
|
+
return { ok: true, funded: null };
|
|
20
21
|
if (await isInternalOrg(adapter, orgId, config.internalDomains))
|
|
21
|
-
return { ok: true };
|
|
22
|
+
return { ok: true, funded: null };
|
|
22
23
|
const customerId = await getBillingCustomerId(adapter, orgId);
|
|
23
24
|
if (!customerId) {
|
|
24
25
|
return { ok: false, reason: "no_billing", message: "No billing account found." };
|
|
25
26
|
}
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
27
|
+
const model = planModel(plans, plan);
|
|
28
|
+
const ledger = input.ledger ?? stripeBalanceUsageLedger();
|
|
29
|
+
const cycle = input.cycle ??
|
|
30
|
+
(input.cycleStart != null
|
|
31
|
+
? {
|
|
32
|
+
start: input.cycleStart * 1000,
|
|
33
|
+
end: null,
|
|
34
|
+
key: new Date(input.cycleStart * 1000).toISOString().slice(0, 7),
|
|
35
|
+
}
|
|
36
|
+
: undefined);
|
|
37
|
+
const state = await resolveAllowance(adapter, config, {
|
|
38
|
+
orgId,
|
|
39
|
+
plans,
|
|
40
|
+
plan,
|
|
41
|
+
caller,
|
|
42
|
+
customerId,
|
|
43
|
+
cycle,
|
|
44
|
+
ledger,
|
|
45
|
+
});
|
|
46
|
+
// Included allowance first, wallet last: a pooled org that has used up its
|
|
47
|
+
// package is told exactly that, instead of being told its balance is short.
|
|
48
|
+
const funding = fundingFor(state, model, cost, caller);
|
|
49
|
+
if (!funding.ok) {
|
|
29
50
|
return {
|
|
30
51
|
ok: false,
|
|
31
|
-
reason: "insufficient_balance",
|
|
32
|
-
message:
|
|
52
|
+
reason: funding.reason ?? "insufficient_balance",
|
|
53
|
+
message: describeDenial(funding.reason ?? "insufficient_balance", state),
|
|
33
54
|
};
|
|
34
55
|
}
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
reason: "seat_allowance_reached",
|
|
51
|
-
message: "Seat token allowance reached for this cycle. Request extra from the workspace owner.",
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
}
|
|
56
|
+
// Count every call; charge only the ones the wallet funds. Included usage was
|
|
57
|
+
// paid for by the subscription, and debiting it would charge twice — while
|
|
58
|
+
// crediting the allowance instead would discount the subscription's own
|
|
59
|
+
// invoice (a Stripe credit balance auto-applies to it).
|
|
60
|
+
await ledger.record({
|
|
61
|
+
orgId,
|
|
62
|
+
customerId,
|
|
63
|
+
action,
|
|
64
|
+
cost,
|
|
65
|
+
funded: funding.source ?? "wallet",
|
|
66
|
+
caller: caller ? { kind: caller.kind, id: caller.id } : undefined,
|
|
67
|
+
});
|
|
68
|
+
if (funding.source === "wallet") {
|
|
69
|
+
await deductTokens(customerId, action, cost, config.currency, caller ? { kind: caller.kind, id: caller.id } : undefined);
|
|
70
|
+
tryAutoReload(customerId, config.currency).catch(() => { });
|
|
55
71
|
}
|
|
56
|
-
|
|
57
|
-
tryAutoReload(customerId, config.currency).catch(() => { });
|
|
58
|
-
return { ok: true };
|
|
72
|
+
return { ok: true, funded: funding.source };
|
|
59
73
|
}
|
|
60
74
|
function defaultCycleStart() {
|
|
61
75
|
const d = new Date();
|
|
@@ -66,9 +80,20 @@ function defaultCycleKey() {
|
|
|
66
80
|
return `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, "0")}`;
|
|
67
81
|
}
|
|
68
82
|
export function createMeter(adapter, config, meterCfg) {
|
|
69
|
-
const { plans, rateCard, resolvePlan, seatDefaults, planCacheTtlMs = 60_000, cycleStart
|
|
83
|
+
const { plans, rateCard, resolvePlan, seatDefaults, planCacheTtlMs = 60_000, cycleStart, cycleKey, } = meterCfg;
|
|
70
84
|
const userSeat = seatDefaults?.user ?? "standard";
|
|
71
85
|
const apiSeat = seatDefaults?.api ?? "api";
|
|
86
|
+
// A consumer-imposed window. When absent, the window comes from the
|
|
87
|
+
// subscription period (see resolveAllowance) — which is what an annual package
|
|
88
|
+
// needs — and the cycle key travels with it, so a top-up grant can no longer be
|
|
89
|
+
// recorded against a different cycle than the usage it is meant to extend.
|
|
90
|
+
const cycleOverride = cycleStart || cycleKey
|
|
91
|
+
? () => ({
|
|
92
|
+
start: (cycleStart ?? defaultCycleStart)() * 1000,
|
|
93
|
+
end: null,
|
|
94
|
+
key: (cycleKey ?? defaultCycleKey)(),
|
|
95
|
+
})
|
|
96
|
+
: null;
|
|
72
97
|
const planCache = new Map();
|
|
73
98
|
async function currentPlan(orgId) {
|
|
74
99
|
const hit = planCache.get(orgId);
|
|
@@ -89,18 +114,16 @@ export function createMeter(adapter, config, meterCfg) {
|
|
|
89
114
|
: (opts.caller.id && (await getSeatType(adapter, orgId, opts.caller.id))) || userSeat;
|
|
90
115
|
caller = { kind: opts.caller.kind, id: opts.caller.id, seatType };
|
|
91
116
|
}
|
|
92
|
-
// Owner-approved extra allowance for a user seat this cycle (top-up flow).
|
|
93
|
-
const extra = caller?.kind === "user" && caller.id
|
|
94
|
-
? await extraAllowance(adapter, orgId, caller.id, cycleKey())
|
|
95
|
-
: 0;
|
|
96
117
|
return meterUsage(adapter, config, {
|
|
97
118
|
orgId,
|
|
98
119
|
action,
|
|
99
120
|
cost,
|
|
100
121
|
plans,
|
|
101
122
|
plan: await currentPlan(orgId),
|
|
102
|
-
|
|
103
|
-
|
|
123
|
+
// Only when the consumer imposed one; otherwise the window (and with it
|
|
124
|
+
// the top-up cycle key) comes from the subscription period.
|
|
125
|
+
cycle: cycleOverride?.(),
|
|
126
|
+
ledger: meterCfg.ledger,
|
|
104
127
|
caller,
|
|
105
128
|
});
|
|
106
129
|
};
|
package/dist/metering.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metering.js","sourceRoot":"","sources":["../src/metering.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"metering.js","sourceRoot":"","sources":["../src/metering.ts"],"names":[],"mappings":"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"}
|