@arnaudjnn/billing-tools 0.36.0 → 0.36.2

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.
@@ -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,IAEpD,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CAmCnD"}
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"}
@@ -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, process.env.STRIPE_WEBHOOK_SECRET);
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,OAAO,CAAC,GAAG,CAAC,qBAAsB,CAAC,CAAC;QACnG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0CAA0C,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACxG,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAiC,CAAC;YAC7D,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/B,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,QAAmC,CAAC,CAAC;gBAC7E,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC7D,IAAI,UAAU,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,0EAA0E;oBAC1E,MAAM,YAAY,CAChB,UAAU,EACV,MAAM,EACN,aAAa,MAAM,sBAAsB,EACzC,QAAQ,EACR,mBAAmB,OAAO,CAAC,EAAE,EAAE,CAChC,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/routes/webhook.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,13 @@ export declare const BILLING_WEBHOOK_EVENTS: readonly ["checkout.session.complet
4
4
  export type EnsureWebhookResult = {
5
5
  id: string;
6
6
  url: string;
7
+ /**
8
+ * OTHER endpoint ids registered on the same URL. Stripe allows duplicates and
9
+ * delivers to every one of them, so this is usually an accident worth acting
10
+ * on (harmless for credits, which are idempotent, but it doubles delivery
11
+ * volume and makes logs lie). Pass `pruneDuplicates` to remove them.
12
+ */
13
+ duplicates: string[];
7
14
  /**
8
15
  * The signing secret for STRIPE_WEBHOOK_SECRET.
9
16
  *
@@ -32,5 +39,17 @@ export declare function ensureWebhookEndpoint(opts: {
32
39
  /** Delete and re-create, to mint a new signing secret. Destructive: the old
33
40
  * secret stops verifying as soon as this runs. */
34
41
  recreate?: boolean;
42
+ /**
43
+ * Replace the event list with exactly `events` instead of adding to it.
44
+ *
45
+ * Off by default, and that default is the important one: an endpoint you
46
+ * didn't create may legitimately carry events another consumer depends on, and
47
+ * silently narrowing it in a deploy script turns their handler into a no-op
48
+ * with nothing in the logs. The union can only ever over-deliver, which costs
49
+ * a discarded event.
50
+ */
51
+ exact?: boolean;
52
+ /** Delete other endpoints registered on the same URL. Destructive. */
53
+ pruneDuplicates?: boolean;
35
54
  }): Promise<EnsureWebhookResult>;
36
55
  //# sourceMappingURL=webhook-setup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-setup.d.ts","sourceRoot":"","sources":["../src/webhook-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAiBjC,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,yCAE4C,CAAC;AAEhF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,MAAM,CAAC,EAAE,SAAS,MAAM,CAAC,2BAA2B,CAAC,YAAY,EAAE,CAAC;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;uDACmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoC/B"}
1
+ {"version":3,"file":"webhook-setup.d.ts","sourceRoot":"","sources":["../src/webhook-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAiBjC,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,yCAE4C,CAAC;AAEhF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,MAAM,CAAC,EAAE,SAAS,MAAM,CAAC,2BAA2B,CAAC,YAAY,EAAE,CAAC;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;uDACmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA8C/B"}
@@ -27,19 +27,30 @@ export async function ensureWebhookEndpoint(opts) {
27
27
  const events = opts.events ?? BILLING_WEBHOOK_EVENTS;
28
28
  // Stripe has no lookup-by-url, so scan. Accounts have a handful of endpoints;
29
29
  // 100 is well past any real count.
30
- const existing = (await stripe.webhookEndpoints.list({ limit: 100 })).data.find((e) => e.url === opts.url);
30
+ const all = (await stripe.webhookEndpoints.list({ limit: 100 })).data;
31
+ const matches = all.filter((e) => e.url === opts.url);
32
+ const [existing, ...rest] = matches;
33
+ let duplicates = rest.map((e) => e.id);
34
+ if (duplicates.length && opts.pruneDuplicates) {
35
+ for (const id of duplicates)
36
+ await stripe.webhookEndpoints.del(id);
37
+ duplicates = [];
38
+ }
31
39
  if (existing && opts.recreate) {
32
40
  await stripe.webhookEndpoints.del(existing.id);
33
41
  }
34
42
  else if (existing) {
35
- const same = existing.enabled_events.length === events.length &&
36
- events.every((e) => existing.enabled_events.includes(e));
43
+ const wanted = opts.exact
44
+ ? [...events]
45
+ : [...new Set([...existing.enabled_events, ...events])];
46
+ const same = wanted.length === existing.enabled_events.length &&
47
+ wanted.every((e) => existing.enabled_events.includes(e));
37
48
  if (!same) {
38
49
  await stripe.webhookEndpoints.update(existing.id, {
39
- enabled_events: [...events],
50
+ enabled_events: wanted,
40
51
  });
41
52
  }
42
- return { id: existing.id, url: existing.url, created: false, updated: !same };
53
+ return { id: existing.id, url: existing.url, duplicates, created: false, updated: !same };
43
54
  }
44
55
  const created = await stripe.webhookEndpoints.create({
45
56
  url: opts.url,
@@ -50,6 +61,7 @@ export async function ensureWebhookEndpoint(opts) {
50
61
  id: created.id,
51
62
  url: created.url,
52
63
  secret: created.secret,
64
+ duplicates,
53
65
  created: true,
54
66
  updated: false,
55
67
  };
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-setup.js","sourceRoot":"","sources":["../src/webhook-setup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,8EAA8E;AAC9E,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,+EAA+E;AAC/E,2EAA2E;AAC3E,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,gFAAgF;AAChF,2EAA2E;AAC3E,kFAAkF;AAClF,6DAA6D;AAE7D,2DAA2D;AAC3D,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,4BAA4B;CACiD,CAAC;AAmBhF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAS3C;IACC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC;IAErD,8EAA8E;IAC9E,mCAAmC;IACnC,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAC7E,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAC1B,CAAC;IAEF,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,MAAM,IAAI,GACR,QAAQ,CAAC,cAAc,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAChD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAChD,cAAc,EAAE,CAAC,GAAG,MAAM,CAAC;aAC5B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;IAChF,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC;QACnD,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,cAAc,EAAE,CAAC,GAAG,MAAM,CAAC;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,qCAAqC;KACvE,CAAC,CAAC;IACH,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"webhook-setup.js","sourceRoot":"","sources":["../src/webhook-setup.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.0",
3
+ "version": "0.36.2",
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",