@arnaudjnn/billing-tools 5.0.0 → 6.0.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/allowance.d.ts.map +1 -1
- package/dist/allowance.js +30 -3
- package/dist/allowance.js.map +1 -1
- package/dist/billing.d.ts +18 -0
- package/dist/billing.d.ts.map +1 -1
- package/dist/billing.js +40 -0
- package/dist/billing.js.map +1 -1
- package/dist/bin/cli.js.map +1 -1
- package/dist/checkout.js +1 -1
- package/dist/checkout.js.map +1 -1
- package/dist/doctor.d.ts +5 -3
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +3 -3
- package/dist/doctor.js.map +1 -1
- package/dist/tax.d.ts +3 -3
- package/dist/tax.d.ts.map +1 -1
- package/dist/tax.js +5 -5
- package/dist/tax.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/usage-cache.d.ts.map +1 -1
- package/dist/usage-cache.js +6 -0
- package/dist/usage-cache.js.map +1 -1
- package/dist/usage-ledger.d.ts +35 -0
- package/dist/usage-ledger.d.ts.map +1 -1
- package/dist/usage-ledger.js +28 -2
- package/dist/usage-ledger.js.map +1 -1
- package/dist/usage-scopes.d.ts +15 -11
- package/dist/usage-scopes.d.ts.map +1 -1
- package/dist/usage-scopes.js +166 -35
- package/dist/usage-scopes.js.map +1 -1
- package/package.json +1 -1
package/dist/tax.d.ts
CHANGED
|
@@ -32,13 +32,13 @@ export declare function ensureStripeTaxRate(decision: TaxDecision, opts?: {
|
|
|
32
32
|
}): Promise<string | null>;
|
|
33
33
|
export type TaxMode =
|
|
34
34
|
/** This library: `resolveTax` (sales-tax + VIES) → an explicit Stripe TaxRate. */
|
|
35
|
-
"
|
|
35
|
+
"local"
|
|
36
36
|
/** Stripe Tax (`automatic_tax`). Requires registrations, or it computes 0%. */
|
|
37
37
|
| "stripe"
|
|
38
38
|
/** No tax on anything the library charges. */
|
|
39
39
|
| "none";
|
|
40
40
|
/**
|
|
41
|
-
* The declared mode. **Nothing declared means `"
|
|
41
|
+
* The declared mode. **Nothing declared means `"local"`.**
|
|
42
42
|
*
|
|
43
43
|
* That default is the whole point, and it used to be `"none"`. Silence meant no tax
|
|
44
44
|
* on anything the library charged — so a deployment that never thought about VAT
|
|
@@ -84,7 +84,7 @@ export declare function invalidateTaxOrigin(): void;
|
|
|
84
84
|
* Returns the same `{ taxRates, automaticTax }` shape every charge site already
|
|
85
85
|
* takes, so wiring it is one line per site and an explicit argument still wins.
|
|
86
86
|
*
|
|
87
|
-
* Under `"
|
|
87
|
+
* Under `"local"` the rate comes from the CUSTOMER: their address decides
|
|
88
88
|
* domestic vs cross-border and their Stripe tax id decides reverse charge. A
|
|
89
89
|
* customer with no address on file is charged the DOMESTIC rate rather than
|
|
90
90
|
* nothing — the same direction `resolveTax` takes for an unverifiable VAT number,
|
package/dist/tax.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tax.d.ts","sourceRoot":"","sources":["../src/tax.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgBhD,MAAM,MAAM,WAAW,GAAG;IACxB,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,OAAO,CAAC,WAAW,CAAC,CAavB;AAuBD;sCACsC;AACtC,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,WAAW,EACrB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyCxB;AAeD,MAAM,MAAM,OAAO;AACjB,kFAAkF;AAChF,
|
|
1
|
+
{"version":3,"file":"tax.d.ts","sourceRoot":"","sources":["../src/tax.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgBhD,MAAM,MAAM,WAAW,GAAG;IACxB,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,OAAO,CAAC,WAAW,CAAC,CAavB;AAuBD;sCACsC;AACtC,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,WAAW,EACrB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyCxB;AAeD,MAAM,MAAM,OAAO;AACjB,kFAAkF;AAChF,OAAO;AACT,+EAA+E;GAC7E,QAAQ;AACV,8CAA8C;GAC5C,MAAM,CAAC;AAEX;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,GAAG,OAAO,CAIxE;AAOD;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAY7F;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,MAAM,CAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,GACpC,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAsC1D;AAyBD,kFAAkF;AAClF,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAIxD;AAED;;;;;;;;;GASG;AACH,wBAAsB,6BAA6B,CACjD,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
package/dist/tax.js
CHANGED
|
@@ -80,7 +80,7 @@ export async function ensureStripeTaxRate(decision, opts = {}) {
|
|
|
80
80
|
return resolve;
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
83
|
-
* The declared mode. **Nothing declared means `"
|
|
83
|
+
* The declared mode. **Nothing declared means `"local"`.**
|
|
84
84
|
*
|
|
85
85
|
* That default is the whole point, and it used to be `"none"`. Silence meant no tax
|
|
86
86
|
* on anything the library charged — so a deployment that never thought about VAT
|
|
@@ -104,7 +104,7 @@ export function taxModeOf(tax) {
|
|
|
104
104
|
return tax.mode;
|
|
105
105
|
if (tax?.automatic)
|
|
106
106
|
return "stripe";
|
|
107
|
-
return "
|
|
107
|
+
return "local";
|
|
108
108
|
}
|
|
109
109
|
// The Stripe account's country, memoised. One read per process: an account does not
|
|
110
110
|
// change country, and this sits behind `taxFor` on the hot path of every metered
|
|
@@ -148,7 +148,7 @@ export function invalidateTaxOrigin() {
|
|
|
148
148
|
accountCountry = undefined;
|
|
149
149
|
warnedNoOrigin = false;
|
|
150
150
|
}
|
|
151
|
-
// A missing `origin` under the
|
|
151
|
+
// A missing `origin` under the `local` mode is a config error, not a
|
|
152
152
|
// per-charge one, so it is said once rather than on every invoice.
|
|
153
153
|
let warnedNoOrigin = false;
|
|
154
154
|
/**
|
|
@@ -157,7 +157,7 @@ let warnedNoOrigin = false;
|
|
|
157
157
|
* Returns the same `{ taxRates, automaticTax }` shape every charge site already
|
|
158
158
|
* takes, so wiring it is one line per site and an explicit argument still wins.
|
|
159
159
|
*
|
|
160
|
-
* Under `"
|
|
160
|
+
* Under `"local"` the rate comes from the CUSTOMER: their address decides
|
|
161
161
|
* domestic vs cross-border and their Stripe tax id decides reverse charge. A
|
|
162
162
|
* customer with no address on file is charged the DOMESTIC rate rather than
|
|
163
163
|
* nothing — the same direction `resolveTax` takes for an unverifiable VAT number,
|
|
@@ -176,7 +176,7 @@ export async function taxFor(stripeCustomerId, tax) {
|
|
|
176
176
|
return { automaticTax: true };
|
|
177
177
|
case "none":
|
|
178
178
|
return {};
|
|
179
|
-
case "
|
|
179
|
+
case "local": {
|
|
180
180
|
const originCountry = await originFor(tax);
|
|
181
181
|
if (!originCountry) {
|
|
182
182
|
if (!warnedNoOrigin) {
|
package/dist/tax.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tax.js","sourceRoot":"","sources":["../src/tax.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tax.js","sourceRoot":"","sources":["../src/tax.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -173,7 +173,7 @@ export interface BillingConfig {
|
|
|
173
173
|
/**
|
|
174
174
|
* Where YOU are established, as an ISO country code ("IT", "FR", "US").
|
|
175
175
|
*
|
|
176
|
-
* Setting it selects `mode: "
|
|
176
|
+
* Setting it selects `mode: "local"` — the library works the rate out
|
|
177
177
|
* itself (`sales-tax` + VIES) from the customer's address and tax id, and
|
|
178
178
|
* applies it as an explicit Stripe TaxRate. It decides domestic vs
|
|
179
179
|
* cross-border, which is the whole question a VAT rate turns on, so there is
|
|
@@ -181,7 +181,7 @@ export interface BillingConfig {
|
|
|
181
181
|
*/
|
|
182
182
|
origin?: string;
|
|
183
183
|
/** Override the mode `origin` / `automatic` imply. See `TaxMode`. */
|
|
184
|
-
mode?: "
|
|
184
|
+
mode?: "local" | "stripe" | "none";
|
|
185
185
|
/**
|
|
186
186
|
* Resolve the TaxRate ids yourself, e.g. from your own records. Wins over
|
|
187
187
|
* `mode` when it returns any — the hook exists to be authoritative.
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB;iDAC6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE;;;;;;;;;;;;;;;;OAgBG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACjF,0EAA0E;IAC1E,eAAe,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxD,gFAAgF;IAChF,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,0EAA0E;IAC1E,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5D,0DAA0D;IAC1D,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,wEAAwE;IACxE,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE;;8CAE0C;IAC1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpG,qDAAqD;IACrD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD,uEAAuE;IACvE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACtF;8EAC0E;IAC1E,mBAAmB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD;wFACoF;IACpF,kBAAkB,CAAC,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAO3G,sEAAsE;IACtE,cAAc,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChE,yEAAyE;IACzE,cAAc,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpF;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,4EAA4E;IAC5E,eAAe,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAQtF,wDAAwD;IACxD,eAAe,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B;;uDAE+C;QAC/C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB;;;qCAG6B;QAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB;;;yDAGiD;QACjD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;KAC5C,CAAC,CAAC;IACH;gDAC4C;IAC5C,eAAe,CAAC,CACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,GACA,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,2DAA2D;IAC3D,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C;;kEAE8D;IAC9D,aAAa,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,mFAAmF;IACnF,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;;OAYG;IACH,GAAG,CAAC,EAAE;QACJ;;;;;;;;WAQG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,qEAAqE;QACrE,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;QACnC;;;WAGG;QACH,KAAK,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;QACnE;;;;;;;WAOG;QACH,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,sEAAsE;IACtE,cAAc,CAAC,EAAE;QACf;;;;;;;;;WASG;QACH,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAID,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,gBAAgB,CAAC,CAAC,GAClF,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,gBAAgB,CAAC,CAAC;AAEhD,wBAAgB,aAAa,CAAC,CAAC,EAAE,aAAa,GAAG,cAAc,CAU9D;AAED;;;;;;mDAMmD;AACnD,wBAAgB,sBAAsB,CACpC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAC1B,MAAM,SAAyB,GAC9B,MAAM,EAAE,CAOV;AAGD,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-cache.d.ts","sourceRoot":"","sources":["../src/usage-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAyC7E,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"usage-cache.d.ts","sourceRoot":"","sources":["../src/usage-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAyC7E,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAuBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,GAAE,iBAAsB,GAAG,WAAW,CA+C/F"}
|
package/dist/usage-cache.js
CHANGED
|
@@ -10,6 +10,12 @@ function keyOf(q) {
|
|
|
10
10
|
q.end ?? "now",
|
|
11
11
|
f?.callerKind ?? "",
|
|
12
12
|
f?.callerId ?? "",
|
|
13
|
+
// `sources` is part of the ANSWER, not just of how it is fetched: a read that
|
|
14
|
+
// skips a leg returns a smaller number than one that does not. In practice the
|
|
15
|
+
// two are derived from the same caller and always agree, but keying on the
|
|
16
|
+
// window alone would make that an assumption rather than a fact.
|
|
17
|
+
(q.sources?.included ?? true) ? "i" : "-",
|
|
18
|
+
(q.sources?.wallet ?? true) ? "w" : "-",
|
|
13
19
|
].join("|");
|
|
14
20
|
}
|
|
15
21
|
/**
|
package/dist/usage-cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-cache.js","sourceRoot":"","sources":["../src/usage-cache.ts"],"names":[],"mappings":"AAwDA;;2EAE2E;AAC3E,SAAS,KAAK,CAAC,CAAa;IAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,OAAO;QACL,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,GAAG,IAAI,KAAK;QACd,CAAC,EAAE,UAAU,IAAI,EAAE;QACnB,CAAC,EAAE,QAAQ,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"usage-cache.js","sourceRoot":"","sources":["../src/usage-cache.ts"],"names":[],"mappings":"AAwDA;;2EAE2E;AAC3E,SAAS,KAAK,CAAC,CAAa;IAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,OAAO;QACL,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,GAAG,IAAI,KAAK;QACd,CAAC,EAAE,UAAU,IAAI,EAAE;QACnB,CAAC,EAAE,QAAQ,IAAI,EAAE;QACjB,8EAA8E;QAC9E,+EAA+E;QAC/E,2EAA2E;QAC3E,iEAAiE;QACjE,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;QACzC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;KACxC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAkB,EAAE,OAA0B,EAAE;IAChF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyC,CAAC;IAChE,iFAAiF;IACjF,8EAA8E;IAC9E,gDAAgD;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEpD,SAAS,KAAK,CAAC,GAAW;QACxB,IAAI,MAAM,CAAC,IAAI,IAAI,UAAU;YAAE,OAAO;QACtC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM;YAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG;gBAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrE,IAAI,MAAM,CAAC,IAAI,GAAG,UAAU;YAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjD,8EAA8E;QAC9E,MAAM,EAAE,CAAC,KAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;QAElD,KAAK,CAAC,KAAK,CAAC,KAAiB;YAC3B,IAAI,GAAG,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC;YAEhD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;YAE5B,MAAM,IAAI,GAAG,KAAK;iBACf,KAAK,CAAC,KAAK,CAAC;iBACZ,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBACd,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAClB,OAAO,KAAK,CAAC;YACf,CAAC,CAAC;gBACF,qEAAqE;gBACrE,kEAAkE;iBACjE,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAEvC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/usage-ledger.d.ts
CHANGED
|
@@ -33,11 +33,46 @@ export interface UsageQuery {
|
|
|
33
33
|
callerKind?: string;
|
|
34
34
|
callerId?: string;
|
|
35
35
|
};
|
|
36
|
+
/**
|
|
37
|
+
* Which funding sources this window can actually contain — an optimisation
|
|
38
|
+
* hint, never a filter on the answer.
|
|
39
|
+
*
|
|
40
|
+
* A ledger that reads two sources (the scope ledger reads INCLUDED usage from a
|
|
41
|
+
* meter and WALLET-funded usage from the debits) can skip the leg that must
|
|
42
|
+
* return 0. The caller knows this and the ledger cannot: whether a per-caller
|
|
43
|
+
* window can hold wallet-funded usage is a property of the plan
|
|
44
|
+
* (`exhaustedPolicy`), and whether it can hold included usage is
|
|
45
|
+
* `capCovers` — an `api` caller on a `covers: "users"` plan draws no included
|
|
46
|
+
* allowance at all, so reading its meter is a guaranteed 0.
|
|
47
|
+
*
|
|
48
|
+
* Omitted means BOTH, which is the safe reading: a ledger must never invent a
|
|
49
|
+
* restriction the caller did not state, because skipping a source that could
|
|
50
|
+
* contribute under-reports, and under-reporting reads as generosity and refuses
|
|
51
|
+
* no one. `resolveAllowance` fills it in for every read it issues.
|
|
52
|
+
*/
|
|
53
|
+
sources?: {
|
|
54
|
+
included?: boolean;
|
|
55
|
+
wallet?: boolean;
|
|
56
|
+
};
|
|
36
57
|
}
|
|
37
58
|
export interface UsageLedger {
|
|
38
59
|
record(event: UsageEvent): Promise<void>;
|
|
39
60
|
/** Summed cost in [start, end). */
|
|
40
61
|
total(query: UsageQuery): Promise<number>;
|
|
62
|
+
/**
|
|
63
|
+
* Several windows at once, in as few requests as the backend allows.
|
|
64
|
+
*
|
|
65
|
+
* Optional, and purely an optimisation: the answer must equal
|
|
66
|
+
* `Promise.all(queries.map(total))` element for element. It exists because a
|
|
67
|
+
* plan declares several windows over the SAME caller — a monthly pack and a
|
|
68
|
+
* weekly limit, say — and both a Stripe meter (via `value_grouping_window`) and
|
|
69
|
+
* a balance-transaction walk can serve all of them from one pass.
|
|
70
|
+
*
|
|
71
|
+
* Callers should not reach for this directly; `stripeScopeUsageLedger` batches
|
|
72
|
+
* per tick internally, so ordinary `total` calls issued together already
|
|
73
|
+
* collapse.
|
|
74
|
+
*/
|
|
75
|
+
totals?(queries: readonly UsageQuery[]): Promise<number[]>;
|
|
41
76
|
/**
|
|
42
77
|
* Which windows this ledger can count (see `LedgerCoverage`).
|
|
43
78
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-ledger.d.ts","sourceRoot":"","sources":["../src/usage-ledger.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAmBpG,uCAAuC;AACvC,MAAM,MAAM,aAAa;AACvB,oCAAoC;AAClC,MAAM;AACR,8BAA8B;GAC5B,MAAM;AACR,uDAAuD;GACrD,QAAQ,CAAC;AAEb,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,iCAAiC;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"usage-ledger.d.ts","sourceRoot":"","sources":["../src/usage-ledger.ts"],"names":[],"mappings":"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"}
|
package/dist/usage-ledger.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getStripe,
|
|
1
|
+
import { getStripe, usageSinceWindows } from "./billing.js";
|
|
2
2
|
import { ledgerGaps, normalizePlans } from "./plan-model.js";
|
|
3
3
|
/**
|
|
4
4
|
* The ledger this library has always had: the debits themselves.
|
|
@@ -19,7 +19,33 @@ export function stripeBalanceUsageLedger() {
|
|
|
19
19
|
/* the balance transaction IS the record */
|
|
20
20
|
},
|
|
21
21
|
// `start` is epoch ms throughout this seam; Stripe's `created` is seconds.
|
|
22
|
-
|
|
22
|
+
//
|
|
23
|
+
// Routed through the multi-window walk so `total` and `totals` cannot disagree
|
|
24
|
+
// — the contract is that the batch equals the individual calls. It also fixes
|
|
25
|
+
// an old imprecision: this used to call `usageSince`, which has no upper bound
|
|
26
|
+
// and therefore summed past a CLOSED window's end. No gate hit it (a current
|
|
27
|
+
// window always ends in the future) but a historical read would have.
|
|
28
|
+
total: (q) => usageSinceWindows(q.customerId, [{ since: Math.floor(q.start / 1000), until: q.end == null ? undefined : Math.floor(q.end / 1000) }], q.filter).then((r) => r[0]),
|
|
29
|
+
// Many windows, ONE walk. Grouped by customer+filter, since those are what
|
|
30
|
+
// decide which transactions are eligible; the window bounds only decide which
|
|
31
|
+
// of the groups' totals each one lands in.
|
|
32
|
+
async totals(queries) {
|
|
33
|
+
const out = new Array(queries.length).fill(0);
|
|
34
|
+
const groups = new Map();
|
|
35
|
+
queries.forEach((q, i) => {
|
|
36
|
+
const key = `${q.customerId}|${q.filter?.callerKind ?? ""}|${q.filter?.callerId ?? ""}`;
|
|
37
|
+
(groups.get(key) ?? groups.set(key, []).get(key)).push(i);
|
|
38
|
+
});
|
|
39
|
+
await Promise.all([...groups.values()].map(async (idx) => {
|
|
40
|
+
const first = queries[idx[0]];
|
|
41
|
+
const sums = await usageSinceWindows(first.customerId, idx.map((i) => ({
|
|
42
|
+
since: Math.floor(queries[i].start / 1000),
|
|
43
|
+
until: queries[i].end == null ? undefined : Math.floor(queries[i].end / 1000),
|
|
44
|
+
})), first.filter);
|
|
45
|
+
idx.forEach((qi, n) => (out[qi] = sums[n]));
|
|
46
|
+
}));
|
|
47
|
+
return out;
|
|
48
|
+
},
|
|
23
49
|
};
|
|
24
50
|
}
|
|
25
51
|
/** Default name of the Stripe Billing Meter events are reported to. */
|
package/dist/usage-ledger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-ledger.js","sourceRoot":"","sources":["../src/usage-ledger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"usage-ledger.js","sourceRoot":"","sources":["../src/usage-ledger.ts"],"names":[],"mappings":"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"}
|
package/dist/usage-scopes.d.ts
CHANGED
|
@@ -34,18 +34,22 @@ export interface ScopeLedgerOptions {
|
|
|
34
34
|
* Where WALLET-funded per-caller usage is read from. Defaults to the balance
|
|
35
35
|
* ledger, which is exact and has no lag because the debit IS the record.
|
|
36
36
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* org whose API usage the wallet funds writes one transaction per call — so a
|
|
42
|
-
* monthly window can cost tens of requests, on every per-member read.
|
|
37
|
+
* This is the most expensive read here and the only unbounded one: `usageSince`
|
|
38
|
+
* pages balance transactions newest-first across the whole window, 100 per
|
|
39
|
+
* request, and an org whose API usage the wallet funds writes one transaction
|
|
40
|
+
* per call — so a monthly window can cost tens of requests.
|
|
43
41
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
42
|
+
* **You should not normally need to touch this.** `resolveAllowance` states on
|
|
43
|
+
* every read whether the window can hold wallet-funded usage at all
|
|
44
|
+
* (`UsageQuery.sources`), derived from `exhaustedPolicy`, and the leg is skipped
|
|
45
|
+
* when it cannot. That is strictly better than deciding here, because it is per
|
|
46
|
+
* QUERY rather than per deployment: the same plan can have a member window that
|
|
47
|
+
* overflows to the wallet and an agent window that is wallet-only.
|
|
48
|
+
*
|
|
49
|
+
* `null` remains as a blunt override for a consumer driving this ledger
|
|
50
|
+
* directly, without `resolveAllowance` to supply the hint. Setting it when any
|
|
51
|
+
* per-caller window CAN move money under-reports, and under-reporting reads as
|
|
52
|
+
* generosity and refuses no one.
|
|
49
53
|
*/
|
|
50
54
|
wallet?: UsageLedger | null;
|
|
51
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-scopes.d.ts","sourceRoot":"","sources":["../src/usage-scopes.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAC;AA+D3B,yCAAyC;AACzC,wBAAgB,OAAO,CAAC,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAInF;AAED;oEACoE;AACpE,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,EAAE,CAKtF;AAED;;;;;gEAKgE;AAChE,eAAO,MAAM,iBAAiB,8BAA8B,CAAC;AAE7D;gFACgF;AAChF,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAEhD;6BAC6B;AAC7B,eAAO,MAAM,eAAe,mBAAmB,CAAC;AA+EhD,2EAA2E;AAC3E,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;
|
|
1
|
+
{"version":3,"file":"usage-scopes.d.ts","sourceRoot":"","sources":["../src/usage-scopes.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAC;AA+D3B,yCAAyC;AACzC,wBAAgB,OAAO,CAAC,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAInF;AAED;oEACoE;AACpE,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,EAAE,CAKtF;AAED;;;;;gEAKgE;AAChE,eAAO,MAAM,iBAAiB,8BAA8B,CAAC;AAE7D;gFACgF;AAChF,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAEhD;6BAC6B;AAC7B,eAAO,MAAM,eAAe,mBAAmB,CAAC;AA+EhD,2EAA2E;AAC3E,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AA2DD,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,kBAAuB,GAAG,WAAW,CAoNjF"}
|
package/dist/usage-scopes.js
CHANGED
|
@@ -181,6 +181,40 @@ async function streamToken() {
|
|
|
181
181
|
session = { token: s.authentication_token, expiresAt: Date.parse(s.expires_at) };
|
|
182
182
|
return session.token;
|
|
183
183
|
}
|
|
184
|
+
// ── Answering several windows with one request ──────────────────────────────
|
|
185
|
+
//
|
|
186
|
+
// A plan declares more than one window over the SAME caller — a monthly seat pack
|
|
187
|
+
// and a weekly limit, say — and `resolveAllowance` issues them together, in one
|
|
188
|
+
// tick, deliberately (they go in a single `Promise.all` so the meter costs one
|
|
189
|
+
// round trip's latency rather than three). That makes them batchable without any
|
|
190
|
+
// change to the seam: collect what arrives in a tick, then answer it in as few
|
|
191
|
+
// requests as Stripe allows.
|
|
192
|
+
//
|
|
193
|
+
// The meter can group by time: `value_grouping_window: "day"` returns one bucket
|
|
194
|
+
// per day over the range, so a month-wide read and a week-wide read over the same
|
|
195
|
+
// scope both come out of ONE response. Verified against the API — a slice of the
|
|
196
|
+
// bucketed response equals a dedicated narrow read exactly, and empty days are
|
|
197
|
+
// simply absent, so a slice sums the buckets it contains rather than assuming they
|
|
198
|
+
// are contiguous.
|
|
199
|
+
//
|
|
200
|
+
// Stripe ENFORCES alignment for that parameter ("start_time … should be aligned
|
|
201
|
+
// with daily boundaries"), so only day-aligned windows can share a read. That is
|
|
202
|
+
// most of them: `rateWindowFor` aligns day, week and month to UTC boundaries. An
|
|
203
|
+
// `every: "hour"` window is not day-aligned and keeps its own read — which costs
|
|
204
|
+
// nothing, since an hour is one bucket either way.
|
|
205
|
+
const DAY_MS = 86_400_000;
|
|
206
|
+
const isDayAligned = (q) => q.start % DAY_MS === 0 && (q.end == null || q.end % DAY_MS === 0);
|
|
207
|
+
/** Sum the buckets that fall inside a window. Buckets are day-sized and the
|
|
208
|
+
* window is day-aligned, so they nest exactly and none is split. */
|
|
209
|
+
function sliceBuckets(buckets, q) {
|
|
210
|
+
const from = Math.floor(q.start / 1000);
|
|
211
|
+
const to = q.end == null ? Number.POSITIVE_INFINITY : Math.floor(q.end / 1000);
|
|
212
|
+
let sum = 0;
|
|
213
|
+
for (const b of buckets)
|
|
214
|
+
if (b.start_time >= from && b.end_time <= to)
|
|
215
|
+
sum += b.aggregated_value;
|
|
216
|
+
return sum;
|
|
217
|
+
}
|
|
184
218
|
/**
|
|
185
219
|
* A per-CALLER `UsageLedger` backed entirely by Stripe.
|
|
186
220
|
*
|
|
@@ -201,7 +235,7 @@ export function stripeScopeUsageLedger(opts = {}) {
|
|
|
201
235
|
// is the one statement that makes skipping the walk correct rather than
|
|
202
236
|
// under-reporting.
|
|
203
237
|
const wallet = opts.wallet === null ? null : (opts.wallet ?? stripeBalanceUsageLedger());
|
|
204
|
-
|
|
238
|
+
const api = {
|
|
205
239
|
covers: { orgIncluded: false, callerIncluded: true },
|
|
206
240
|
async record(event) {
|
|
207
241
|
if (!event.cost)
|
|
@@ -248,41 +282,138 @@ export function stripeScopeUsageLedger(opts = {}) {
|
|
|
248
282
|
complain(`${event.orgId}|record`, e);
|
|
249
283
|
}
|
|
250
284
|
},
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
//
|
|
254
|
-
//
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
const meter = await meterIdFor(eventName, { create: false });
|
|
263
|
-
if (!meter)
|
|
264
|
-
return 0;
|
|
265
|
-
const id = await customerForScope(query.orgId, scope);
|
|
266
|
-
if (!id)
|
|
267
|
-
return 0;
|
|
268
|
-
// Seconds, and Stripe requires the window on minute boundaries.
|
|
269
|
-
const floorMinute = (ms) => Math.floor(ms / 60_000) * 60;
|
|
270
|
-
const summaries = await getStripe().billing.meters.listEventSummaries(meter, {
|
|
271
|
-
customer: id,
|
|
272
|
-
start_time: floorMinute(query.start),
|
|
273
|
-
end_time: floorMinute(query.end ?? Date.now()),
|
|
274
|
-
limit: 100,
|
|
275
|
-
});
|
|
276
|
-
return summaries.data.reduce((sum, s) => sum + s.aggregated_value, 0);
|
|
277
|
-
}
|
|
278
|
-
catch (e) {
|
|
279
|
-
complain(`${query.orgId}|${scope}`, e);
|
|
280
|
-
return 0;
|
|
281
|
-
}
|
|
282
|
-
})(),
|
|
283
|
-
]);
|
|
284
|
-
return paid + included;
|
|
285
|
+
total(query) {
|
|
286
|
+
// Queued rather than issued: everything asked for in this tick is answered
|
|
287
|
+
// together below. `resolveAllowance` issues its windows in one `Promise.all`,
|
|
288
|
+
// so this collapses them with no change at the call site.
|
|
289
|
+
return new Promise((resolve, reject) => {
|
|
290
|
+
pending.push({ query, resolve, reject });
|
|
291
|
+
if (!flushing) {
|
|
292
|
+
flushing = true;
|
|
293
|
+
queueMicrotask(flush);
|
|
294
|
+
}
|
|
295
|
+
});
|
|
285
296
|
},
|
|
297
|
+
totals: (queries) => Promise.all(queries.map((q) => api.total(q))),
|
|
286
298
|
};
|
|
299
|
+
let pending = [];
|
|
300
|
+
let flushing = false;
|
|
301
|
+
async function flush() {
|
|
302
|
+
const batch = pending;
|
|
303
|
+
pending = [];
|
|
304
|
+
flushing = false;
|
|
305
|
+
if (!batch.length)
|
|
306
|
+
return;
|
|
307
|
+
// Group by everything that decides WHICH events are eligible. The window
|
|
308
|
+
// bounds are not part of it — they only decide which group member each event
|
|
309
|
+
// lands in, which is exactly what makes one read serve several windows.
|
|
310
|
+
const groups = new Map();
|
|
311
|
+
for (const w of batch) {
|
|
312
|
+
const scope = scopeOf(w.query.filter);
|
|
313
|
+
const key = [
|
|
314
|
+
w.query.orgId,
|
|
315
|
+
w.query.customerId,
|
|
316
|
+
scope,
|
|
317
|
+
w.query.sources?.wallet ?? true,
|
|
318
|
+
w.query.sources?.included ?? true,
|
|
319
|
+
].join("|");
|
|
320
|
+
const g = groups.get(key);
|
|
321
|
+
if (g)
|
|
322
|
+
g.push(w);
|
|
323
|
+
else
|
|
324
|
+
groups.set(key, [w]);
|
|
325
|
+
}
|
|
326
|
+
await Promise.all([...groups.values()].map((g) => answerGroup(g).catch(() => { })));
|
|
327
|
+
}
|
|
328
|
+
async function answerGroup(group) {
|
|
329
|
+
const first = group[0].query;
|
|
330
|
+
const scope = scopeOf(first.filter);
|
|
331
|
+
// An org-wide window is not this leg's question — see `total`'s old comment.
|
|
332
|
+
if (scope === "org") {
|
|
333
|
+
const sums = wallet
|
|
334
|
+
? await legTotals(wallet, group.map((w) => w.query))
|
|
335
|
+
: group.map(() => 0);
|
|
336
|
+
group.forEach((w, i) => w.resolve(sums[i] ?? 0));
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const wantsWallet = (first.sources?.wallet ?? true) && Boolean(wallet);
|
|
340
|
+
const wantsIncluded = first.sources?.included ?? true;
|
|
341
|
+
const [paid, included] = await Promise.all([
|
|
342
|
+
wantsWallet
|
|
343
|
+
? legTotals(wallet, group.map((w) => w.query)).catch((e) => {
|
|
344
|
+
complain(`${first.orgId}|wallet`, e);
|
|
345
|
+
return group.map(() => 0);
|
|
346
|
+
})
|
|
347
|
+
: Promise.resolve(group.map(() => 0)),
|
|
348
|
+
wantsIncluded
|
|
349
|
+
? meterTotals(group, scope).catch((e) => {
|
|
350
|
+
complain(`${first.orgId}|${scope}`, e);
|
|
351
|
+
return group.map(() => 0);
|
|
352
|
+
})
|
|
353
|
+
: Promise.resolve(group.map(() => 0)),
|
|
354
|
+
]);
|
|
355
|
+
group.forEach((w, i) => w.resolve((paid[i] ?? 0) + (included[i] ?? 0)));
|
|
356
|
+
}
|
|
357
|
+
/** One bucketed read for every day-aligned window in the group; the rest keep
|
|
358
|
+
* their own, which is what an `every: "hour"` window needs and costs nothing. */
|
|
359
|
+
async function meterTotals(group, scope) {
|
|
360
|
+
const out = new Array(group.length).fill(0);
|
|
361
|
+
const meter = await meterIdFor(eventName, { create: false });
|
|
362
|
+
if (!meter)
|
|
363
|
+
return out;
|
|
364
|
+
const id = await customerForScope(group[0].query.orgId, scope);
|
|
365
|
+
if (!id)
|
|
366
|
+
return out;
|
|
367
|
+
const stripe = getStripe();
|
|
368
|
+
const floorMinute = (ms) => Math.floor(ms / 60_000) * 60;
|
|
369
|
+
const aligned = [];
|
|
370
|
+
const loose = [];
|
|
371
|
+
group.forEach((w, i) => (isDayAligned(w.query) ? aligned : loose).push(i));
|
|
372
|
+
const work = [];
|
|
373
|
+
if (aligned.length === 1) {
|
|
374
|
+
// One window needs no bucketing, and a plain read is cheaper to page.
|
|
375
|
+
loose.push(aligned.pop());
|
|
376
|
+
}
|
|
377
|
+
else if (aligned.length > 1) {
|
|
378
|
+
const from = Math.min(...aligned.map((i) => group[i].query.start));
|
|
379
|
+
const opened = aligned.some((i) => group[i].query.end == null);
|
|
380
|
+
const to = opened
|
|
381
|
+
? Math.ceil(Date.now() / DAY_MS) * DAY_MS
|
|
382
|
+
: Math.max(...aligned.map((i) => group[i].query.end));
|
|
383
|
+
work.push((async () => {
|
|
384
|
+
const buckets = [];
|
|
385
|
+
for await (const b of stripe.billing.meters.listEventSummaries(meter, {
|
|
386
|
+
customer: id,
|
|
387
|
+
start_time: Math.floor(from / 1000),
|
|
388
|
+
end_time: Math.floor(to / 1000),
|
|
389
|
+
value_grouping_window: "day",
|
|
390
|
+
limit: 100,
|
|
391
|
+
})) {
|
|
392
|
+
buckets.push(b);
|
|
393
|
+
}
|
|
394
|
+
for (const i of aligned)
|
|
395
|
+
out[i] = sliceBuckets(buckets, group[i].query);
|
|
396
|
+
})());
|
|
397
|
+
}
|
|
398
|
+
for (const i of loose) {
|
|
399
|
+
const q = group[i].query;
|
|
400
|
+
work.push((async () => {
|
|
401
|
+
const s = await stripe.billing.meters.listEventSummaries(meter, {
|
|
402
|
+
customer: id,
|
|
403
|
+
start_time: floorMinute(q.start),
|
|
404
|
+
end_time: floorMinute(q.end ?? Date.now()),
|
|
405
|
+
limit: 100,
|
|
406
|
+
});
|
|
407
|
+
out[i] = s.data.reduce((sum, x) => sum + x.aggregated_value, 0);
|
|
408
|
+
})());
|
|
409
|
+
}
|
|
410
|
+
await Promise.all(work);
|
|
411
|
+
return out;
|
|
412
|
+
}
|
|
413
|
+
/** A leg's answer for many windows: its own batch method when it has one. */
|
|
414
|
+
function legTotals(leg, queries) {
|
|
415
|
+
return leg.totals ? leg.totals(queries) : Promise.all(queries.map((q) => leg.total(q)));
|
|
416
|
+
}
|
|
417
|
+
return api;
|
|
287
418
|
}
|
|
288
419
|
//# sourceMappingURL=usage-scopes.js.map
|