@adonis-agora/payments 0.2.0 → 0.4.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/CHANGELOG.md +2375 -0
- package/dist/assets/spa/assets/index-B7rU8eIL.css +2 -0
- package/dist/assets/spa/assets/index-BcM2VH5k.js +10 -0
- package/dist/assets/spa/assets/index-BcM2VH5k.js.map +1 -0
- package/dist/assets/spa/index.html +20 -0
- package/dist/commands/main.d.ts +4 -3
- package/dist/commands/main.d.ts.map +1 -1
- package/dist/commands/main.js +9 -2
- package/dist/commands/main.js.map +1 -1
- package/dist/commands/make_billable.d.ts.map +1 -1
- package/dist/commands/make_billable.js +1 -1
- package/dist/commands/make_billable.js.map +1 -1
- package/dist/commands/make_webhook_handler.d.ts.map +1 -1
- package/dist/commands/make_webhook_handler.js +1 -1
- package/dist/commands/make_webhook_handler.js.map +1 -1
- package/dist/commands/payments_health.d.ts +31 -0
- package/dist/commands/payments_health.d.ts.map +1 -0
- package/dist/commands/payments_health.js +113 -0
- package/dist/commands/payments_health.js.map +1 -0
- package/dist/commands/payments_sync.d.ts +18 -4
- package/dist/commands/payments_sync.d.ts.map +1 -1
- package/dist/commands/payments_sync.js +136 -40
- package/dist/commands/payments_sync.js.map +1 -1
- package/dist/commands/payments_webhook.d.ts.map +1 -1
- package/dist/commands/payments_webhook.js.map +1 -1
- package/dist/configure.d.ts +12 -5
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +18 -5
- package/dist/configure.js.map +1 -1
- package/dist/providers/dashboard_provider.d.ts +97 -0
- package/dist/providers/dashboard_provider.d.ts.map +1 -0
- package/dist/providers/dashboard_provider.js +430 -0
- package/dist/providers/dashboard_provider.js.map +1 -0
- package/dist/providers/payments_client_provider.d.ts +41 -0
- package/dist/providers/payments_client_provider.d.ts.map +1 -0
- package/dist/providers/payments_client_provider.js +95 -0
- package/dist/providers/payments_client_provider.js.map +1 -0
- package/dist/providers/payments_provider.d.ts +35 -0
- package/dist/providers/payments_provider.d.ts.map +1 -1
- package/dist/providers/payments_provider.js +250 -36
- package/dist/providers/payments_provider.js.map +1 -1
- package/dist/src/billing/billing_health.d.ts +85 -0
- package/dist/src/billing/billing_health.d.ts.map +1 -0
- package/dist/src/billing/billing_health.js +155 -0
- package/dist/src/billing/billing_health.js.map +1 -0
- package/dist/src/billing/billing_overview.d.ts +4 -3
- package/dist/src/billing/billing_overview.d.ts.map +1 -1
- package/dist/src/billing/billing_overview.js +14 -5
- package/dist/src/billing/billing_overview.js.map +1 -1
- package/dist/src/billing/billing_store.d.ts +634 -5
- package/dist/src/billing/billing_store.d.ts.map +1 -1
- package/dist/src/billing/billing_store.js +18 -1
- package/dist/src/billing/billing_store.js.map +1 -1
- package/dist/src/billing/index.d.ts +4 -3
- package/dist/src/billing/index.d.ts.map +1 -1
- package/dist/src/billing/index.js +2 -1
- package/dist/src/billing/index.js.map +1 -1
- package/dist/src/billing/list_query.d.ts +16 -0
- package/dist/src/billing/list_query.d.ts.map +1 -0
- package/dist/src/billing/list_query.js +28 -0
- package/dist/src/billing/list_query.js.map +1 -0
- package/dist/src/billing/lucid_billing_store.d.ts +122 -4
- package/dist/src/billing/lucid_billing_store.d.ts.map +1 -1
- package/dist/src/billing/lucid_billing_store.js +811 -13
- package/dist/src/billing/lucid_billing_store.js.map +1 -1
- package/dist/src/billing/mixins/index.d.ts +5 -2
- package/dist/src/billing/mixins/index.d.ts.map +1 -1
- package/dist/src/billing/mixins/index.js +5 -2
- package/dist/src/billing/mixins/index.js.map +1 -1
- package/dist/src/billing/mixins/with_audit_event.d.ts +48 -0
- package/dist/src/billing/mixins/with_audit_event.d.ts.map +1 -0
- package/dist/src/billing/mixins/with_audit_event.js +77 -0
- package/dist/src/billing/mixins/with_audit_event.js.map +1 -0
- package/dist/src/billing/mixins/with_billable.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_customer.d.ts +39 -0
- package/dist/src/billing/mixins/with_customer.d.ts.map +1 -0
- package/dist/src/billing/mixins/with_customer.js +68 -0
- package/dist/src/billing/mixins/with_customer.js.map +1 -0
- package/dist/src/billing/mixins/with_dispute.d.ts +68 -0
- package/dist/src/billing/mixins/with_dispute.d.ts.map +1 -0
- package/dist/src/billing/mixins/with_dispute.js +83 -0
- package/dist/src/billing/mixins/with_dispute.js.map +1 -0
- package/dist/src/billing/mixins/with_payment.d.ts +42 -0
- package/dist/src/billing/mixins/with_payment.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_payment.js +29 -3
- package/dist/src/billing/mixins/with_payment.js.map +1 -1
- package/dist/src/billing/mixins/with_subscription.d.ts +7 -0
- package/dist/src/billing/mixins/with_subscription.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_subscription.js +15 -1
- package/dist/src/billing/mixins/with_subscription.js.map +1 -1
- package/dist/src/billing/mixins/with_usage_event.d.ts +7 -0
- package/dist/src/billing/mixins/with_usage_event.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_usage_event.js +15 -1
- package/dist/src/billing/mixins/with_usage_event.js.map +1 -1
- package/dist/src/billing/mixins/with_webhook_event.d.ts +18 -0
- package/dist/src/billing/mixins/with_webhook_event.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_webhook_event.js +18 -1
- package/dist/src/billing/mixins/with_webhook_event.js.map +1 -1
- package/dist/src/billing/resolve_dispatch.d.ts +22 -0
- package/dist/src/billing/resolve_dispatch.d.ts.map +1 -0
- package/dist/src/billing/resolve_dispatch.js +44 -0
- package/dist/src/billing/resolve_dispatch.js.map +1 -0
- package/dist/src/billing/resolve_store.d.ts +18 -0
- package/dist/src/billing/resolve_store.d.ts.map +1 -0
- package/dist/src/billing/resolve_store.js +35 -0
- package/dist/src/billing/resolve_store.js.map +1 -0
- package/dist/src/billing/schema.d.ts +108 -0
- package/dist/src/billing/schema.d.ts.map +1 -0
- package/dist/src/billing/schema.js +350 -0
- package/dist/src/billing/schema.js.map +1 -0
- package/dist/src/billing/webhook_dispatcher.d.ts +95 -16
- package/dist/src/billing/webhook_dispatcher.d.ts.map +1 -1
- package/dist/src/billing/webhook_dispatcher.js +186 -33
- package/dist/src/billing/webhook_dispatcher.js.map +1 -1
- package/dist/src/billing/webhook_events.d.ts +67 -1
- package/dist/src/billing/webhook_events.d.ts.map +1 -1
- package/dist/src/billing/webhook_events.js +15 -0
- package/dist/src/billing/webhook_events.js.map +1 -1
- package/dist/src/billing/webhook_processor.d.ts.map +1 -1
- package/dist/src/billing/webhook_processor.js +325 -5
- package/dist/src/billing/webhook_processor.js.map +1 -1
- package/dist/src/client/define_config.d.ts +150 -0
- package/dist/src/client/define_config.d.ts.map +1 -0
- package/dist/src/client/define_config.js +98 -0
- package/dist/src/client/define_config.js.map +1 -0
- package/dist/src/client/handlers.d.ts +71 -0
- package/dist/src/client/handlers.d.ts.map +1 -0
- package/dist/src/client/handlers.js +119 -0
- package/dist/src/client/handlers.js.map +1 -0
- package/dist/src/client/index.d.ts +15 -0
- package/dist/src/client/index.d.ts.map +1 -0
- package/dist/src/client/index.js +12 -0
- package/dist/src/client/index.js.map +1 -0
- package/dist/src/client/statuses.d.ts +38 -0
- package/dist/src/client/statuses.d.ts.map +1 -0
- package/dist/src/client/statuses.js +42 -0
- package/dist/src/client/statuses.js.map +1 -0
- package/dist/src/dashboard/actions.d.ts +143 -0
- package/dist/src/dashboard/actions.d.ts.map +1 -0
- package/dist/src/dashboard/actions.js +112 -0
- package/dist/src/dashboard/actions.js.map +1 -0
- package/dist/src/dashboard/auth.d.ts +136 -0
- package/dist/src/dashboard/auth.d.ts.map +1 -0
- package/dist/src/dashboard/auth.js +152 -0
- package/dist/src/dashboard/auth.js.map +1 -0
- package/dist/src/dashboard/define_config.d.ts +80 -0
- package/dist/src/dashboard/define_config.d.ts.map +1 -0
- package/dist/src/dashboard/define_config.js +83 -0
- package/dist/src/dashboard/define_config.js.map +1 -0
- package/dist/src/dashboard/handlers.d.ts +281 -0
- package/dist/src/dashboard/handlers.d.ts.map +1 -0
- package/dist/src/dashboard/handlers.js +960 -0
- package/dist/src/dashboard/handlers.js.map +1 -0
- package/dist/src/dashboard/index.d.ts +17 -0
- package/dist/src/dashboard/index.d.ts.map +1 -0
- package/dist/src/dashboard/index.js +13 -0
- package/dist/src/dashboard/index.js.map +1 -0
- package/dist/src/dashboard/login_page.d.ts +23 -0
- package/dist/src/dashboard/login_page.d.ts.map +1 -0
- package/dist/src/dashboard/login_page.js +170 -0
- package/dist/src/dashboard/login_page.js.map +1 -0
- package/dist/src/dashboard/period.d.ts +31 -0
- package/dist/src/dashboard/period.d.ts.map +1 -0
- package/dist/src/dashboard/period.js +44 -0
- package/dist/src/dashboard/period.js.map +1 -0
- package/dist/src/dashboard/session_cookie.d.ts +42 -0
- package/dist/src/dashboard/session_cookie.d.ts.map +1 -0
- package/dist/src/dashboard/session_cookie.js +97 -0
- package/dist/src/dashboard/session_cookie.js.map +1 -0
- package/dist/src/dashboard/spa.d.ts +24 -0
- package/dist/src/dashboard/spa.d.ts.map +1 -0
- package/dist/src/dashboard/spa.js +52 -0
- package/dist/src/dashboard/spa.js.map +1 -0
- package/dist/src/define_config.d.ts +245 -10
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js +97 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/diagnostics.d.ts +287 -7
- package/dist/src/diagnostics.d.ts.map +1 -1
- package/dist/src/diagnostics.js +317 -1
- package/dist/src/diagnostics.js.map +1 -1
- package/dist/src/driver.d.ts +139 -5
- package/dist/src/driver.d.ts.map +1 -1
- package/dist/src/drivers/abacate.d.ts +13 -3
- package/dist/src/drivers/abacate.d.ts.map +1 -1
- package/dist/src/drivers/abacate.js +112 -19
- package/dist/src/drivers/abacate.js.map +1 -1
- package/dist/src/drivers/adyen.d.ts +164 -0
- package/dist/src/drivers/adyen.d.ts.map +1 -0
- package/dist/src/drivers/adyen.js +678 -0
- package/dist/src/drivers/adyen.js.map +1 -0
- package/dist/src/drivers/asaas.d.ts +53 -3
- package/dist/src/drivers/asaas.d.ts.map +1 -1
- package/dist/src/drivers/asaas.js +364 -29
- package/dist/src/drivers/asaas.js.map +1 -1
- package/dist/src/drivers/dodo.d.ts +135 -0
- package/dist/src/drivers/dodo.d.ts.map +1 -0
- package/dist/src/drivers/dodo.js +864 -0
- package/dist/src/drivers/dodo.js.map +1 -0
- package/dist/src/drivers/efi.d.ts +98 -0
- package/dist/src/drivers/efi.d.ts.map +1 -0
- package/dist/src/drivers/efi.js +628 -0
- package/dist/src/drivers/efi.js.map +1 -0
- package/dist/src/drivers/infinitepay.d.ts +156 -0
- package/dist/src/drivers/infinitepay.d.ts.map +1 -0
- package/dist/src/drivers/infinitepay.js +321 -0
- package/dist/src/drivers/infinitepay.js.map +1 -0
- package/dist/src/drivers/lemonsqueezy.d.ts +125 -0
- package/dist/src/drivers/lemonsqueezy.d.ts.map +1 -0
- package/dist/src/drivers/lemonsqueezy.js +632 -0
- package/dist/src/drivers/lemonsqueezy.js.map +1 -0
- package/dist/src/drivers/mercadopago.d.ts +97 -0
- package/dist/src/drivers/mercadopago.d.ts.map +1 -0
- package/dist/src/drivers/mercadopago.js +844 -0
- package/dist/src/drivers/mercadopago.js.map +1 -0
- package/dist/src/drivers/mollie.d.ts +125 -0
- package/dist/src/drivers/mollie.d.ts.map +1 -0
- package/dist/src/drivers/mollie.js +812 -0
- package/dist/src/drivers/mollie.js.map +1 -0
- package/dist/src/drivers/paddle.d.ts +148 -0
- package/dist/src/drivers/paddle.d.ts.map +1 -0
- package/dist/src/drivers/paddle.js +738 -0
- package/dist/src/drivers/paddle.js.map +1 -0
- package/dist/src/drivers/pagarme.d.ts +97 -0
- package/dist/src/drivers/pagarme.d.ts.map +1 -0
- package/dist/src/drivers/pagarme.js +829 -0
- package/dist/src/drivers/pagarme.js.map +1 -0
- package/dist/src/drivers/pagbank.d.ts +57 -0
- package/dist/src/drivers/pagbank.d.ts.map +1 -0
- package/dist/src/drivers/pagbank.js +499 -0
- package/dist/src/drivers/pagbank.js.map +1 -0
- package/dist/src/drivers/paypal.d.ts +120 -0
- package/dist/src/drivers/paypal.d.ts.map +1 -0
- package/dist/src/drivers/paypal.js +891 -0
- package/dist/src/drivers/paypal.js.map +1 -0
- package/dist/src/drivers/polar.d.ts +118 -0
- package/dist/src/drivers/polar.d.ts.map +1 -0
- package/dist/src/drivers/polar.js +604 -0
- package/dist/src/drivers/polar.js.map +1 -0
- package/dist/src/drivers/razorpay.d.ts +103 -0
- package/dist/src/drivers/razorpay.d.ts.map +1 -0
- package/dist/src/drivers/razorpay.js +867 -0
- package/dist/src/drivers/razorpay.js.map +1 -0
- package/dist/src/drivers/shared.d.ts +33 -0
- package/dist/src/drivers/shared.d.ts.map +1 -0
- package/dist/src/drivers/shared.js +37 -0
- package/dist/src/drivers/shared.js.map +1 -0
- package/dist/src/drivers/square.d.ts +133 -0
- package/dist/src/drivers/square.d.ts.map +1 -0
- package/dist/src/drivers/square.js +905 -0
- package/dist/src/drivers/square.js.map +1 -0
- package/dist/src/drivers/stripe.d.ts +41 -4
- package/dist/src/drivers/stripe.d.ts.map +1 -1
- package/dist/src/drivers/stripe.js +823 -26
- package/dist/src/drivers/stripe.js.map +1 -1
- package/dist/src/drivers/woovi.d.ts +11 -4
- package/dist/src/drivers/woovi.d.ts.map +1 -1
- package/dist/src/drivers/woovi.js +162 -29
- package/dist/src/drivers/woovi.js.map +1 -1
- package/dist/src/ensure_customer.d.ts +34 -1
- package/dist/src/ensure_customer.d.ts.map +1 -1
- package/dist/src/ensure_customer.js +29 -4
- package/dist/src/ensure_customer.js.map +1 -1
- package/dist/src/hooks/webhook_handlers.d.ts.map +1 -1
- package/dist/src/hooks/webhook_handlers.js.map +1 -1
- package/dist/src/http.d.ts +37 -3
- package/dist/src/http.d.ts.map +1 -1
- package/dist/src/http.js +69 -5
- package/dist/src/http.js.map +1 -1
- package/dist/src/index.d.ts +54 -26
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +29 -12
- package/dist/src/index.js.map +1 -1
- package/dist/src/invoice/drivers/asaas.d.ts.map +1 -1
- package/dist/src/invoice/drivers/asaas.js.map +1 -1
- package/dist/src/invoice/drivers/enotas.d.ts.map +1 -1
- package/dist/src/invoice/drivers/enotas.js.map +1 -1
- package/dist/src/invoice/drivers/focus.d.ts.map +1 -1
- package/dist/src/invoice/drivers/focus.js.map +1 -1
- package/dist/src/invoice/drivers/plugnotas.d.ts.map +1 -1
- package/dist/src/invoice/drivers/plugnotas.js.map +1 -1
- package/dist/src/invoice/drivers/tecnospeed.d.ts.map +1 -1
- package/dist/src/invoice/drivers/tecnospeed.js.map +1 -1
- package/dist/src/invoice/emit_invoice.d.ts.map +1 -1
- package/dist/src/invoice/emit_invoice.js +31 -11
- package/dist/src/invoice/emit_invoice.js.map +1 -1
- package/dist/src/invoice/invoice_manager.d.ts.map +1 -1
- package/dist/src/money.d.ts +23 -5
- package/dist/src/money.d.ts.map +1 -1
- package/dist/src/money.js +72 -7
- package/dist/src/money.js.map +1 -1
- package/dist/src/payments_manager.d.ts +8 -1
- package/dist/src/payments_manager.d.ts.map +1 -1
- package/dist/src/payments_manager.js +168 -6
- package/dist/src/payments_manager.js.map +1 -1
- package/dist/src/services/main.d.ts +38 -0
- package/dist/src/services/main.d.ts.map +1 -1
- package/dist/src/services/main.js +130 -0
- package/dist/src/services/main.js.map +1 -1
- package/dist/src/telescope/index.d.ts +2 -0
- package/dist/src/telescope/index.d.ts.map +1 -1
- package/dist/src/telescope/index.js +1 -0
- package/dist/src/telescope/index.js.map +1 -1
- package/dist/src/telescope/payments_watcher.d.ts +10 -4
- package/dist/src/telescope/payments_watcher.d.ts.map +1 -1
- package/dist/src/telescope/payments_watcher.js +66 -14
- package/dist/src/telescope/payments_watcher.js.map +1 -1
- package/dist/src/telescope/register.d.ts +62 -0
- package/dist/src/telescope/register.d.ts.map +1 -0
- package/dist/src/telescope/register.js +48 -0
- package/dist/src/telescope/register.js.map +1 -0
- package/dist/src/testing/fake_payments.d.ts +62 -0
- package/dist/src/testing/fake_payments.d.ts.map +1 -0
- package/dist/src/testing/fake_payments.js +82 -0
- package/dist/src/testing/fake_payments.js.map +1 -0
- package/dist/src/testing/fake_payments_driver.d.ts +1 -1
- package/dist/src/testing/fake_payments_driver.d.ts.map +1 -1
- package/dist/src/testing/fake_payments_driver.js.map +1 -1
- package/dist/src/testing/in_memory_billing_store.d.ts +151 -2
- package/dist/src/testing/in_memory_billing_store.d.ts.map +1 -1
- package/dist/src/testing/in_memory_billing_store.js +517 -4
- package/dist/src/testing/in_memory_billing_store.js.map +1 -1
- package/dist/src/testing/index.d.ts +3 -2
- package/dist/src/testing/index.d.ts.map +1 -1
- package/dist/src/testing/index.js +1 -0
- package/dist/src/testing/index.js.map +1 -1
- package/dist/src/testing/mutable_clock.d.ts.map +1 -1
- package/dist/src/types.d.ts +161 -5
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +30 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/webhook_handlers.d.ts +96 -2
- package/dist/src/webhook_handlers.d.ts.map +1 -1
- package/dist/src/webhook_handlers.js +91 -10
- package/dist/src/webhook_handlers.js.map +1 -1
- package/dist/src/webhook_security.d.ts +94 -3
- package/dist/src/webhook_security.d.ts.map +1 -1
- package/dist/src/webhook_security.js +173 -9
- package/dist/src/webhook_security.js.map +1 -1
- package/dist/stubs/config/payments.stub +13 -0
- package/dist/stubs/config/payments_client.stub +42 -0
- package/dist/stubs/config/payments_dashboard.stub +38 -0
- package/dist/stubs/database/migrations/create_billing_tables.stub +35 -77
- package/dist/stubs/main.js.map +1 -1
- package/dist/stubs/make/webhook_handler/main.stub +29 -11
- package/package.json +67 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/telescope/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/telescope/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import type { WatcherContext } from './telescope-sdk.js';
|
|
2
2
|
/**
|
|
3
3
|
* A payments-specific Telescope watcher: records a typed `payments` entry for every
|
|
4
|
-
*
|
|
5
|
-
* subscriptions, invoice emission, webhook lifecycle)
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* `agora:payments:*` event the library emits — the milestones (charges, refunds,
|
|
5
|
+
* subscriptions, invoice emission, webhook lifecycle) and the debug events
|
|
6
|
+
* (`gateway.request*`, `webhook.verification`) — flattening the event's payload into
|
|
7
|
+
* structured content rather than storing the raw envelope like the generic diagnostics
|
|
8
|
+
* bridge does.
|
|
9
|
+
*
|
|
10
|
+
* Entries are SHAPED, not spread blindly: the fields you scan a timeline by lead
|
|
11
|
+
* ({@link LEAD_KEYS} — who, which object, what happened, how long), then whatever else
|
|
12
|
+
* the payload carried, then `ts`. Same family as the other Agora watchers, which is why
|
|
13
|
+
* the `event` + flattened-payload envelope handling is identical to media's.
|
|
8
14
|
*
|
|
9
15
|
* Zero coupling: payments publishes via the structural `@adonis-agora/diagnostics`
|
|
10
16
|
* emit slot; this subscribes to the same `node:diagnostics_channel` channels — neither
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payments_watcher.d.ts","sourceRoot":"","sources":["../../../src/telescope/payments_watcher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"payments_watcher.d.ts","sourceRoot":"","sources":["../../../src/telescope/payments_watcher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAsEzD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,eAAe;IAC1B,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAEnD,0FAA0F;IAC1F,QAAQ,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAalC;IAED,mFAAmF;IACnF,OAAO,IAAI,IAAI,CAEd;CACF"}
|
|
@@ -1,17 +1,77 @@
|
|
|
1
1
|
import { subscribe, unsubscribe } from 'node:diagnostics_channel';
|
|
2
|
-
import {
|
|
2
|
+
import { claimPaymentsDiagnostics, PAYMENTS_DIAGNOSTIC_EVENTS, } from '../diagnostics.js';
|
|
3
3
|
/** All payments milestones are low-frequency — record every one of them. */
|
|
4
4
|
const RECORDED_EVENTS = [...PAYMENTS_DIAGNOSTIC_EVENTS];
|
|
5
5
|
/** The `agora:payments:<event>` `node:diagnostics_channel` name — the cross-repo wire contract, replicated structurally (payments never imports `@adonis-agora/diagnostics`). */
|
|
6
6
|
function paymentsChannelName(event) {
|
|
7
7
|
return `agora:payments:${event}`;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* The fields that lead an entry, in this order — the ones a developer scans a timeline
|
|
11
|
+
* by. Everything else in the payload follows, unreordered.
|
|
12
|
+
*
|
|
13
|
+
* `traceId` is handled separately (it can come from either the envelope or the payload)
|
|
14
|
+
* and always sits right after `event`.
|
|
15
|
+
*/
|
|
16
|
+
const LEAD_KEYS = [
|
|
17
|
+
'provider',
|
|
18
|
+
'gatewayId',
|
|
19
|
+
'id',
|
|
20
|
+
'type',
|
|
21
|
+
'method',
|
|
22
|
+
'host',
|
|
23
|
+
'path',
|
|
24
|
+
'query',
|
|
25
|
+
'status',
|
|
26
|
+
'outcome',
|
|
27
|
+
'scheme',
|
|
28
|
+
'amount',
|
|
29
|
+
'currency',
|
|
30
|
+
'durationMs',
|
|
31
|
+
'error',
|
|
32
|
+
'reason',
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Build the entry content: `event`, the correlation id, the {@link LEAD_KEYS} that are
|
|
36
|
+
* present, then the rest of the payload, then `ts`.
|
|
37
|
+
*
|
|
38
|
+
* The trace id can arrive two ways. `@adonis-agora/diagnostics` fills the ENVELOPE's
|
|
39
|
+
* `traceId` from the host's request-context accessor; payments cannot set that field
|
|
40
|
+
* (the structural emit slot is `(lib, event, payload)`) so it puts its own webhook-chain
|
|
41
|
+
* id on the PAYLOAD. The envelope's wins when both are there — it is the host's real
|
|
42
|
+
* request trace, and correlating to it reaches other libraries too.
|
|
43
|
+
*/
|
|
44
|
+
function shapeContent(envelope) {
|
|
45
|
+
const payload = envelope.payload ?? {};
|
|
46
|
+
const traceId = envelope.traceId ?? payload.traceId;
|
|
47
|
+
const content = { event: envelope.event };
|
|
48
|
+
if (traceId !== undefined)
|
|
49
|
+
content.traceId = traceId;
|
|
50
|
+
for (const key of LEAD_KEYS) {
|
|
51
|
+
if (payload[key] !== undefined)
|
|
52
|
+
content[key] = payload[key];
|
|
53
|
+
}
|
|
54
|
+
for (const [key, value] of Object.entries(payload)) {
|
|
55
|
+
if (key === 'traceId' || key in content)
|
|
56
|
+
continue;
|
|
57
|
+
content[key] = value;
|
|
58
|
+
}
|
|
59
|
+
if (envelope.ts !== undefined)
|
|
60
|
+
content.ts = envelope.ts;
|
|
61
|
+
return content;
|
|
62
|
+
}
|
|
9
63
|
/**
|
|
10
64
|
* A payments-specific Telescope watcher: records a typed `payments` entry for every
|
|
11
|
-
*
|
|
12
|
-
* subscriptions, invoice emission, webhook lifecycle)
|
|
13
|
-
*
|
|
14
|
-
*
|
|
65
|
+
* `agora:payments:*` event the library emits — the milestones (charges, refunds,
|
|
66
|
+
* subscriptions, invoice emission, webhook lifecycle) and the debug events
|
|
67
|
+
* (`gateway.request*`, `webhook.verification`) — flattening the event's payload into
|
|
68
|
+
* structured content rather than storing the raw envelope like the generic diagnostics
|
|
69
|
+
* bridge does.
|
|
70
|
+
*
|
|
71
|
+
* Entries are SHAPED, not spread blindly: the fields you scan a timeline by lead
|
|
72
|
+
* ({@link LEAD_KEYS} — who, which object, what happened, how long), then whatever else
|
|
73
|
+
* the payload carried, then `ts`. Same family as the other Agora watchers, which is why
|
|
74
|
+
* the `event` + flattened-payload envelope handling is identical to media's.
|
|
15
75
|
*
|
|
16
76
|
* Zero coupling: payments publishes via the structural `@adonis-agora/diagnostics`
|
|
17
77
|
* emit slot; this subscribes to the same `node:diagnostics_channel` channels — neither
|
|
@@ -35,15 +95,7 @@ export class PaymentsWatcher {
|
|
|
35
95
|
const envelope = message;
|
|
36
96
|
if (envelope === null || typeof envelope !== 'object')
|
|
37
97
|
return;
|
|
38
|
-
ctx.record({
|
|
39
|
-
type: this.type,
|
|
40
|
-
content: {
|
|
41
|
-
event: envelope.event,
|
|
42
|
-
...(envelope.ts !== undefined ? { ts: envelope.ts } : {}),
|
|
43
|
-
...(envelope.traceId !== undefined ? { traceId: envelope.traceId } : {}),
|
|
44
|
-
...(envelope.payload ?? {}),
|
|
45
|
-
},
|
|
46
|
-
});
|
|
98
|
+
ctx.record({ type: this.type, content: shapeContent(envelope) });
|
|
47
99
|
};
|
|
48
100
|
subscribe(channel, onMessage);
|
|
49
101
|
this.disposers.push(() => unsubscribe(channel, onMessage));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payments_watcher.js","sourceRoot":"","sources":["../../../src/telescope/payments_watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"payments_watcher.js","sourceRoot":"","sources":["../../../src/telescope/payments_watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { PaymentsWatcher } from './payments_watcher.js';
|
|
2
|
+
/**
|
|
3
|
+
* Wiring the typed `payments` Telescope watcher, extracted from the provider so it can be
|
|
4
|
+
* tested for what it promises without standing up an application — and without installing
|
|
5
|
+
* `@adonis-agora/telescope`, which is an optional peer this package deliberately does not
|
|
6
|
+
* depend on.
|
|
7
|
+
*
|
|
8
|
+
* This was six lines every app copied into `start/telescope.ts`, and until someone did, a
|
|
9
|
+
* payments timeline showed generic `diagnostic` entries with the payload buried rather than
|
|
10
|
+
* typed `payments` ones. The wiring never varied, so it moved here.
|
|
11
|
+
*
|
|
12
|
+
* **There is no configuration for this, on purpose.** Every option that was drafted turned
|
|
13
|
+
* out to describe a situation the code can just detect:
|
|
14
|
+
*
|
|
15
|
+
* - "off, because I wire my own" — the channel claims say so. An app that registered its own
|
|
16
|
+
* watcher has already claimed the payments channels, and this skips.
|
|
17
|
+
* - "off, because I do not want telescope" — then telescope is not in the app, and this
|
|
18
|
+
* skips.
|
|
19
|
+
* - "on, and fail if telescope is missing" — a missing telescope means an empty timeline,
|
|
20
|
+
* which is not a reason to refuse to take payments.
|
|
21
|
+
*/
|
|
22
|
+
/** The slice of a telescope store the watcher records through. */
|
|
23
|
+
export interface TelescopeRecorder {
|
|
24
|
+
record(entry: {
|
|
25
|
+
type: string;
|
|
26
|
+
content: unknown;
|
|
27
|
+
}): Promise<unknown>;
|
|
28
|
+
}
|
|
29
|
+
/** The slice of the AdonisJS application container this needs. */
|
|
30
|
+
export interface WatcherHost {
|
|
31
|
+
container: {
|
|
32
|
+
make(token: never): Promise<unknown>;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** A disposable registration — the provider holds it so `shutdown()` can release it. */
|
|
36
|
+
export interface RegisteredWatcher {
|
|
37
|
+
dispose(): void;
|
|
38
|
+
}
|
|
39
|
+
export interface RegisterWatcherOptions {
|
|
40
|
+
/**
|
|
41
|
+
* Seams, for tests only. The import is a seam because telescope is not installed here and
|
|
42
|
+
* a test must be able to describe both worlds — present and absent — without it.
|
|
43
|
+
*/
|
|
44
|
+
importTelescope?: () => Promise<{
|
|
45
|
+
TelescopeService: unknown;
|
|
46
|
+
}>;
|
|
47
|
+
makeWatcher?: () => PaymentsWatcher;
|
|
48
|
+
alreadyClaimed?: () => boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Register the watcher against the app's telescope store, unless there is nothing to do.
|
|
52
|
+
*
|
|
53
|
+
* Returns `undefined` when it did not register, which is a normal outcome and not an error:
|
|
54
|
+
* telescope may be absent, or the app may already have wired its own watcher.
|
|
55
|
+
*
|
|
56
|
+
* The provider calls this in `ready()`, not `boot()`, and the order is the whole reason the
|
|
57
|
+
* claim check works: `start/` files run before `ready`, so an app that wires its own watcher
|
|
58
|
+
* has already claimed the channels by the time this looks. Registering in `boot()` would
|
|
59
|
+
* race that and double-record for every app that followed the old documentation.
|
|
60
|
+
*/
|
|
61
|
+
export declare function registerPaymentsWatcher(app: WatcherHost, options?: RegisterWatcherOptions): Promise<RegisteredWatcher | undefined>;
|
|
62
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/telescope/register.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrE;AAED,kEAAkE;AAClE,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE;QAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;CACrD;AAED,wFAAwF;AACxF,MAAM,WAAW,iBAAiB;IAChC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,gBAAgB,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC/D,WAAW,CAAC,EAAE,MAAM,eAAe,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;CAChC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,WAAW,EAChB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAuCxC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { isPaymentsDiagnosticClaimed } from '../diagnostics.js';
|
|
2
|
+
const TELESCOPE_PACKAGE = '@adonis-agora/telescope';
|
|
3
|
+
/**
|
|
4
|
+
* Register the watcher against the app's telescope store, unless there is nothing to do.
|
|
5
|
+
*
|
|
6
|
+
* Returns `undefined` when it did not register, which is a normal outcome and not an error:
|
|
7
|
+
* telescope may be absent, or the app may already have wired its own watcher.
|
|
8
|
+
*
|
|
9
|
+
* The provider calls this in `ready()`, not `boot()`, and the order is the whole reason the
|
|
10
|
+
* claim check works: `start/` files run before `ready`, so an app that wires its own watcher
|
|
11
|
+
* has already claimed the channels by the time this looks. Registering in `boot()` would
|
|
12
|
+
* race that and double-record for every app that followed the old documentation.
|
|
13
|
+
*/
|
|
14
|
+
export async function registerPaymentsWatcher(app, options = {}) {
|
|
15
|
+
// Somebody already owns these channels — an app that wired `PaymentsWatcher` by hand, the
|
|
16
|
+
// way the docs used to say to. Registering a second one would record every payment event
|
|
17
|
+
// twice, and the app that followed the instructions would be the one it happened to.
|
|
18
|
+
const claimed = options.alreadyClaimed ?? (() => isPaymentsDiagnosticClaimed('charge.created'));
|
|
19
|
+
if (claimed())
|
|
20
|
+
return undefined;
|
|
21
|
+
try {
|
|
22
|
+
const telescope = options.importTelescope !== undefined
|
|
23
|
+
? await options.importTelescope()
|
|
24
|
+
: // A non-literal specifier on purpose: `@adonis-agora/telescope` is an OPTIONAL peer
|
|
25
|
+
// and is not installed here, so a literal import would fail `tsc` in this repo even
|
|
26
|
+
// though it resolves fine in an app that has it.
|
|
27
|
+
(await import(TELESCOPE_PACKAGE));
|
|
28
|
+
const service = (await app.container.make(telescope.TelescopeService));
|
|
29
|
+
const store = service.telescopeStore;
|
|
30
|
+
const watcher = options.makeWatcher !== undefined
|
|
31
|
+
? options.makeWatcher()
|
|
32
|
+
: new (await import('./payments_watcher.js')).PaymentsWatcher();
|
|
33
|
+
watcher.register({
|
|
34
|
+
// Recording is observability. A telescope store that is full, locked or briefly
|
|
35
|
+
// unreachable must not take a payment webhook down with it — so the promise is
|
|
36
|
+
// swallowed here rather than surfacing inside a diagnostics publish, which runs
|
|
37
|
+
// synchronously inside the charge that triggered it.
|
|
38
|
+
record: (entry) => void store.record(entry).catch(() => { }),
|
|
39
|
+
});
|
|
40
|
+
return watcher;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Telescope is not in this app. Nothing to do, and nothing to say about it — an app
|
|
44
|
+
// without observability is a normal app, not a misconfigured one.
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/telescope/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAGhE,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAgDpD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,GAAgB,EAChB,OAAO,GAA2B,EAAE;IAEpC,0FAA0F;IAC1F,yFAAyF;IACzF,qFAAqF;IACrF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,IAAI,CAAC,GAAG,EAAE,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAChG,IAAI,OAAO,EAAE;QAAE,OAAO,SAAS,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,SAAS,GACb,OAAO,CAAC,eAAe,KAAK,SAAS;YACnC,CAAC,CAAC,MAAM,OAAO,CAAC,eAAe,EAAE;YACjC,CAAC,CAAC,oFAAoF;gBACpF,oFAAoF;gBACpF,iDAAiD;gBAChD,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAA8C,CAAC;QAEtF,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAyB,CAAC,CAE7E,CAAC;QACF,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC;QAErC,MAAM,OAAO,GACX,OAAO,CAAC,WAAW,KAAK,SAAS;YAC/B,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE;YACvB,CAAC,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QAEpE,OAAO,CAAC,QAAQ,CAAC;YACf,gFAAgF;YAChF,+EAA+E;YAC/E,gFAAgF;YAChF,qDAAqD;YACrD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;SAC5D,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,oFAAoF;QACpF,kEAAkE;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { BillingStore } from '../billing/billing_store.js';
|
|
2
|
+
import { PaymentsManager } from '../payments_manager.js';
|
|
3
|
+
import { FakePaymentsDriver } from './fake_payments_driver.js';
|
|
4
|
+
/**
|
|
5
|
+
* A real {@link PaymentsManager} over a {@link FakePaymentsDriver}.
|
|
6
|
+
*
|
|
7
|
+
* Until this existed `./testing` shipped the fake DRIVER and no way to build a manager
|
|
8
|
+
* around it, so every app wrote the same line:
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* setPayments({ driver: () => fake } as never)
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* `as never` is the tell. That object is not a manager: it has no `invoice()` and no
|
|
15
|
+
* `assertCapability()`, so a charge with `invoice: true` and a refund against a gateway
|
|
16
|
+
* that cannot refund both took a path the test could not exercise — the cast erased exactly
|
|
17
|
+
* the two methods whose absence would have been caught.
|
|
18
|
+
*
|
|
19
|
+
* No `methods` routing is configured on purpose: with one driver and no routing, `driver()`
|
|
20
|
+
* returns it unbound, which is what a test wants. Route explicitly if the test is ABOUT
|
|
21
|
+
* routing.
|
|
22
|
+
*/
|
|
23
|
+
export declare function fakePayments(driver?: FakePaymentsDriver): PaymentsManager;
|
|
24
|
+
/**
|
|
25
|
+
* Install a manager on the `services/main` singleton and hand back the restore.
|
|
26
|
+
*
|
|
27
|
+
* The restore works when NOTHING was set, which is the normal case in a test that never
|
|
28
|
+
* booted a provider — and the case the hand-rolled save/restore could not express, because
|
|
29
|
+
* saving meant calling a `getPayments()` that throws when nothing is set.
|
|
30
|
+
*
|
|
31
|
+
* ```ts
|
|
32
|
+
* const fake = new FakePaymentsDriver()
|
|
33
|
+
* const restore = swapPayments(fakePayments(fake))
|
|
34
|
+
* afterEach(restore)
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function swapPayments(manager: PaymentsManager): () => void;
|
|
38
|
+
/** The same, for the billing store — `InMemoryBillingStore` is the usual argument. */
|
|
39
|
+
export declare function swapBillingStore(store: BillingStore): () => void;
|
|
40
|
+
/**
|
|
41
|
+
* Wait until every webhook this process accepted has finished processing.
|
|
42
|
+
*
|
|
43
|
+
* The gap it closes: with `billing.dispatcher: 'durable'` the delivery resolves when the
|
|
44
|
+
* event is ACCEPTED, not processed, so `await request(...)` returns before anything has
|
|
45
|
+
* happened. Apps papered over it with polling `waitFor` helpers — and could then write a
|
|
46
|
+
* NEGATIVE assertion only as a timed sleep, which is slow when it passes and wrong when the
|
|
47
|
+
* machine is busy.
|
|
48
|
+
*
|
|
49
|
+
* ```ts
|
|
50
|
+
* await client.post('/payments/webhook/asaas').json(payload)
|
|
51
|
+
* await flushWebhooks()
|
|
52
|
+
* expect(await grants.count()).toBe(0) // an assertion, not a sleep
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* No-op when the billing layer is off (nothing dispatched, nothing to wait for). Throws on
|
|
56
|
+
* timeout rather than hanging — including the honest case where a separate worker process
|
|
57
|
+
* runs the events and no in-process wait can ever see them.
|
|
58
|
+
*/
|
|
59
|
+
export declare function flushWebhooks(options?: {
|
|
60
|
+
timeoutMs?: number;
|
|
61
|
+
}): Promise<void>;
|
|
62
|
+
//# sourceMappingURL=fake_payments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake_payments.d.ts","sourceRoot":"","sources":["../../../src/testing/fake_payments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAUzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAC1B,MAAM,GAAE,kBAA6C,GACpD,eAAe,CAEjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,IAAI,CAOjE;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,IAAI,CAOhE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { PaymentsManager } from '../payments_manager.js';
|
|
2
|
+
import { findBillingStore, findPayments, findWebhookDispatcher, resetBillingStore, resetPayments, setBillingStore, setPayments, } from '../services/main.js';
|
|
3
|
+
import { FakePaymentsDriver } from './fake_payments_driver.js';
|
|
4
|
+
/**
|
|
5
|
+
* A real {@link PaymentsManager} over a {@link FakePaymentsDriver}.
|
|
6
|
+
*
|
|
7
|
+
* Until this existed `./testing` shipped the fake DRIVER and no way to build a manager
|
|
8
|
+
* around it, so every app wrote the same line:
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* setPayments({ driver: () => fake } as never)
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* `as never` is the tell. That object is not a manager: it has no `invoice()` and no
|
|
15
|
+
* `assertCapability()`, so a charge with `invoice: true` and a refund against a gateway
|
|
16
|
+
* that cannot refund both took a path the test could not exercise — the cast erased exactly
|
|
17
|
+
* the two methods whose absence would have been caught.
|
|
18
|
+
*
|
|
19
|
+
* No `methods` routing is configured on purpose: with one driver and no routing, `driver()`
|
|
20
|
+
* returns it unbound, which is what a test wants. Route explicitly if the test is ABOUT
|
|
21
|
+
* routing.
|
|
22
|
+
*/
|
|
23
|
+
export function fakePayments(driver = new FakePaymentsDriver()) {
|
|
24
|
+
return new PaymentsManager({ drivers: new Map([[driver.provider, driver]]) });
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Install a manager on the `services/main` singleton and hand back the restore.
|
|
28
|
+
*
|
|
29
|
+
* The restore works when NOTHING was set, which is the normal case in a test that never
|
|
30
|
+
* booted a provider — and the case the hand-rolled save/restore could not express, because
|
|
31
|
+
* saving meant calling a `getPayments()` that throws when nothing is set.
|
|
32
|
+
*
|
|
33
|
+
* ```ts
|
|
34
|
+
* const fake = new FakePaymentsDriver()
|
|
35
|
+
* const restore = swapPayments(fakePayments(fake))
|
|
36
|
+
* afterEach(restore)
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export function swapPayments(manager) {
|
|
40
|
+
const previous = findPayments();
|
|
41
|
+
setPayments(manager);
|
|
42
|
+
return () => {
|
|
43
|
+
if (previous === undefined)
|
|
44
|
+
resetPayments();
|
|
45
|
+
else
|
|
46
|
+
setPayments(previous);
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** The same, for the billing store — `InMemoryBillingStore` is the usual argument. */
|
|
50
|
+
export function swapBillingStore(store) {
|
|
51
|
+
const previous = findBillingStore();
|
|
52
|
+
setBillingStore(store);
|
|
53
|
+
return () => {
|
|
54
|
+
if (previous === undefined)
|
|
55
|
+
resetBillingStore();
|
|
56
|
+
else
|
|
57
|
+
setBillingStore(previous);
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Wait until every webhook this process accepted has finished processing.
|
|
62
|
+
*
|
|
63
|
+
* The gap it closes: with `billing.dispatcher: 'durable'` the delivery resolves when the
|
|
64
|
+
* event is ACCEPTED, not processed, so `await request(...)` returns before anything has
|
|
65
|
+
* happened. Apps papered over it with polling `waitFor` helpers — and could then write a
|
|
66
|
+
* NEGATIVE assertion only as a timed sleep, which is slow when it passes and wrong when the
|
|
67
|
+
* machine is busy.
|
|
68
|
+
*
|
|
69
|
+
* ```ts
|
|
70
|
+
* await client.post('/payments/webhook/asaas').json(payload)
|
|
71
|
+
* await flushWebhooks()
|
|
72
|
+
* expect(await grants.count()).toBe(0) // an assertion, not a sleep
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* No-op when the billing layer is off (nothing dispatched, nothing to wait for). Throws on
|
|
76
|
+
* timeout rather than hanging — including the honest case where a separate worker process
|
|
77
|
+
* runs the events and no in-process wait can ever see them.
|
|
78
|
+
*/
|
|
79
|
+
export async function flushWebhooks(options = {}) {
|
|
80
|
+
await findWebhookDispatcher()?.flushWebhooks(options);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=fake_payments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake_payments.js","sourceRoot":"","sources":["../../../src/testing/fake_payments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAM,GAAuB,IAAI,kBAAkB,EAAE;IAErD,OAAO,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAChF,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,OAAwB;IACnD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,GAAG,EAAE;QACV,IAAI,QAAQ,KAAK,SAAS;YAAE,aAAa,EAAE,CAAC;;YACvC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,eAAe,CAAC,KAAK,CAAC,CAAC;IACvB,OAAO,GAAG,EAAE;QACV,IAAI,QAAQ,KAAK,SAAS;YAAE,iBAAiB,EAAE,CAAC;;YAC3C,eAAe,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAO,GAA2B,EAAE;IACtE,MAAM,qBAAqB,EAAE,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -11,7 +11,7 @@ export interface FakePaymentsDriverOptions {
|
|
|
11
11
|
*/
|
|
12
12
|
export declare class FakePaymentsDriver implements PaymentsDriver {
|
|
13
13
|
readonly provider: string;
|
|
14
|
-
readonly supportedMethods: readonly [
|
|
14
|
+
readonly supportedMethods: readonly ['pix', 'credit_card', 'boleto', 'debit_card', 'undefined'];
|
|
15
15
|
/** Canned webhook events returned by `parseWebhook`, in order. */
|
|
16
16
|
webhookEvents: WebhookEvent[];
|
|
17
17
|
createCustomerCalls: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake_payments_driver.d.ts","sourceRoot":"","sources":["../../../src/testing/fake_payments_driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EACR,OAAO,EACP,OAAO,EACP,MAAM,EACN,YAAY,EACZ,YAAY,EACb,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAChC;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"fake_payments_driver.d.ts","sourceRoot":"","sources":["../../../src/testing/fake_payments_driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake_payments_driver.js","sourceRoot":"","sources":["../../../src/testing/fake_payments_driver.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACpB,QAAQ,CAAS;IACjB,gBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAU,CAAC;IAEjG,kEAAkE;IAClE,aAAa,CAAiB;IAE9B,+BAA+B;IAC/B,mBAAmB,GAAiE,EAAE,CAAC;IACvF,WAAW,GAAyD,EAAE,CAAC;IACvE,WAAW,GAAoD,EAAE,CAAC;IAClE,mBAAmB,GAAiE,EAAE,CAAC;IACvF,uBAAuB,GAAqE,EAAE,CAAC;IAC/F,uBAAuB,GAA0D,EAAE,CAAC;IACpF,uBAAuB,GAAqD,EAAE,CAAC;IAE/E,kBAAkB;IAClB,SAAS,GAA0B,IAAI,GAAG,EAAE,CAAC;IAC7C,QAAQ,GAAyB,IAAI,GAAG,EAAE,CAAC;IAC3C,aAAa,GAA8B,IAAI,GAAG,EAAE,CAAC;IACrD,QAAQ,GAAc,EAAE,CAAC;IAEzB,YAAY,
|
|
1
|
+
{"version":3,"file":"fake_payments_driver.js","sourceRoot":"","sources":["../../../src/testing/fake_payments_driver.ts"],"names":[],"mappings":"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"}
|