@arnaudjnn/billing-tools 0.36.1 → 0.36.3
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/events.d.ts.map +1 -1
- package/dist/events.js +53 -13
- package/dist/events.js.map +1 -1
- package/dist/routes/webhook.d.ts.map +1 -1
- package/dist/routes/webhook.js +22 -1
- package/dist/routes/webhook.js.map +1 -1
- package/package.json +1 -1
package/dist/events.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAejC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;yEACyE;AACzE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAejC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;yEACyE;AACzE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,UAAU,CAAC,CAmEtB;AAED;kEACkE;AAClE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,UAAU,CAAC,CAsCtB"}
|
package/dist/events.js
CHANGED
|
@@ -10,21 +10,61 @@ export async function pollStripeEvents(opts) {
|
|
|
10
10
|
return { cursor: latest.data[0]?.id ?? null, count: 0 };
|
|
11
11
|
}
|
|
12
12
|
const max = opts.maxPerPoll ?? 500;
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
const PAGE = 100;
|
|
14
|
+
// Walk FORWARD from the cursor, page by page, advancing it only across events
|
|
15
|
+
// actually processed.
|
|
16
|
+
//
|
|
17
|
+
// The obvious implementation — list newest-first and collect until you reach
|
|
18
|
+
// the cursor — loses events. Stripe returns newest first, so once a backlog
|
|
19
|
+
// exceeds the per-poll cap you collect the NEWEST `max`, never reach the
|
|
20
|
+
// cursor, and then move the cursor to the newest event: everything between the
|
|
21
|
+
// old cursor and that window is skipped, silently and permanently. It fires
|
|
22
|
+
// precisely when this path matters — the poller was down, so the backlog is
|
|
23
|
+
// large — which is the worst possible time to drop events.
|
|
24
|
+
//
|
|
25
|
+
// Paging with `ending_before` returns the page immediately NEWER than an id,
|
|
26
|
+
// so each batch is contiguous with the cursor. The cap then bounds throughput
|
|
27
|
+
// per poll instead of discarding history: whatever is left is picked up by the
|
|
28
|
+
// next one.
|
|
29
|
+
let cursor = opts.after;
|
|
30
|
+
let count = 0;
|
|
31
|
+
for (;;) {
|
|
32
|
+
let page;
|
|
33
|
+
try {
|
|
34
|
+
page = await stripe.events.list({
|
|
35
|
+
...listParams,
|
|
36
|
+
limit: PAGE,
|
|
37
|
+
ending_before: cursor,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
// Stripe keeps events for 30 days. A cursor older than that no longer
|
|
42
|
+
// resolves, and every future poll would raise the same error forever —
|
|
43
|
+
// so re-baseline to the newest event and carry on. History that aged out
|
|
44
|
+
// is unrecoverable either way; wedging the sync on top of it is not.
|
|
45
|
+
if (err.code === "resource_missing") {
|
|
46
|
+
const latest = await stripe.events.list({ ...listParams, limit: 1 });
|
|
47
|
+
return { cursor: latest.data[0]?.id ?? null, count };
|
|
48
|
+
}
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
const asc = [...page.data].reverse(); // Stripe pages newest-first
|
|
52
|
+
if (asc.length === 0)
|
|
53
|
+
break;
|
|
54
|
+
for (const event of asc) {
|
|
55
|
+
await opts.onEvent(event);
|
|
56
|
+
// Advance per event: a throw mid-page leaves the caller's stored cursor
|
|
57
|
+
// untouched, so the page is retried rather than half-skipped.
|
|
58
|
+
cursor = event.id;
|
|
59
|
+
count++;
|
|
60
|
+
}
|
|
61
|
+
if (count >= max)
|
|
62
|
+
break;
|
|
63
|
+
// A short page means we've reached the newest event.
|
|
64
|
+
if (asc.length < PAGE)
|
|
19
65
|
break;
|
|
20
66
|
}
|
|
21
|
-
|
|
22
|
-
for (const event of fresh)
|
|
23
|
-
await opts.onEvent(event);
|
|
24
|
-
return {
|
|
25
|
-
cursor: fresh.length ? fresh[fresh.length - 1].id : opts.after,
|
|
26
|
-
count: fresh.length,
|
|
27
|
-
};
|
|
67
|
+
return { cursor, count };
|
|
28
68
|
}
|
|
29
69
|
/** Poll WorkOS events of the given types newer than `after`, oldest first.
|
|
30
70
|
* No `after` → baseline to the newest event, process nothing. */
|
package/dist/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAiBxC;yEACyE;AACzE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAKtC;IACC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAEhF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC1D,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC;IACnC,MAAM,
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/routes/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAQjC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC9D;AAOD,wBAAgB,0BAA0B,CAAC,IAAI,GAAE,cAAmB,
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/routes/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAQjC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC9D;AAOD,wBAAgB,0BAA0B,CAAC,IAAI,GAAE,cAAmB,IAGpD,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CA6DnD"}
|
package/dist/routes/webhook.js
CHANGED
|
@@ -6,14 +6,35 @@ function customerIdOf(v) {
|
|
|
6
6
|
}
|
|
7
7
|
export function createStripeWebhookHandler(opts = {}) {
|
|
8
8
|
const currency = opts.currency ?? "usd";
|
|
9
|
+
let warnedUnconfigured = false;
|
|
9
10
|
return async (request) => {
|
|
11
|
+
// The webhook is OPTIONAL — createBillingSync polls the same events — so an
|
|
12
|
+
// unset secret is a legitimate state (every local dev), not a bug. Say so
|
|
13
|
+
// instead of feeding `undefined` to constructEvent, which fails as
|
|
14
|
+
// "signature verification failed" and sends the reader hunting for a
|
|
15
|
+
// signature mismatch that doesn't exist.
|
|
16
|
+
//
|
|
17
|
+
// 503, not 200: without the secret this delivery genuinely wasn't processed,
|
|
18
|
+
// and an endpoint registered against an environment that has no secret is a
|
|
19
|
+
// misconfiguration worth seeing in Stripe's dashboard. Nothing is lost while
|
|
20
|
+
// it retries — the poller credits the same event under the same idempotency
|
|
21
|
+
// key regardless.
|
|
22
|
+
const secret = process.env.STRIPE_WEBHOOK_SECRET;
|
|
23
|
+
if (!secret) {
|
|
24
|
+
if (!warnedUnconfigured) {
|
|
25
|
+
warnedUnconfigured = true;
|
|
26
|
+
console.warn("[billing] STRIPE_WEBHOOK_SECRET is not set — webhook deliveries are " +
|
|
27
|
+
"rejected; the event poller handles these events instead.");
|
|
28
|
+
}
|
|
29
|
+
return Response.json({ error: "Webhook not configured (STRIPE_WEBHOOK_SECRET unset); events are polled instead" }, { status: 503 });
|
|
30
|
+
}
|
|
10
31
|
const body = await request.text();
|
|
11
32
|
const signature = request.headers.get("stripe-signature");
|
|
12
33
|
if (!signature)
|
|
13
34
|
return Response.json({ error: "Missing signature" }, { status: 400 });
|
|
14
35
|
let event;
|
|
15
36
|
try {
|
|
16
|
-
event = getStripe().webhooks.constructEvent(body, signature,
|
|
37
|
+
event = getStripe().webhooks.constructEvent(body, signature, secret);
|
|
17
38
|
}
|
|
18
39
|
catch (err) {
|
|
19
40
|
const message = err instanceof Error ? err.message : "Unknown error";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/routes/webhook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAaxD,SAAS,YAAY,CAAC,CAA6C;IACjE,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAuB,EAAE;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;IACxC,OAAO,KAAK,EAAE,OAAgB,EAAqB,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAEtF,IAAI,KAAmB,CAAC;QACxB,IAAI,CAAC;YACH,KAAK,GAAG,SAAS,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/routes/webhook.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arnaudjnn/billing-tools",
|
|
3
|
-
"version": "0.36.
|
|
3
|
+
"version": "0.36.3",
|
|
4
4
|
"description": "The get-paid engine for Stripe + WorkOS apps, for humans and AI agents. Drop-in API-key auth, token/credit + subscription billing, auth.md agent registration, and MPP machine payments, as MCP tools, a REST API, and a CLI. Framework-agnostic, storage-pluggable.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Arnaud Jeannin",
|