@spare-technologies/spare-link 0.1.0-beta.0 → 1.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/README.md +119 -81
- package/lib/commonjs/core/models/payment-return-params.js +245 -20
- package/lib/commonjs/core/models/payment-return-params.js.map +1 -1
- package/lib/commonjs/core/models/pending-session-record.js +2 -0
- package/lib/commonjs/core/models/pending-session-record.js.map +1 -0
- package/lib/commonjs/core/services/hosted-flow-controller.js +333 -0
- package/lib/commonjs/core/services/hosted-flow-controller.js.map +1 -0
- package/lib/commonjs/core/services/hosted-flow-state.js +96 -0
- package/lib/commonjs/core/services/hosted-flow-state.js.map +1 -0
- package/lib/commonjs/index.js +42 -164
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/internal/hosted/bridge-message.js +107 -0
- package/lib/commonjs/internal/hosted/bridge-message.js.map +1 -0
- package/lib/commonjs/internal/hosted/hosted-url.js +41 -0
- package/lib/commonjs/internal/hosted/hosted-url.js.map +1 -0
- package/lib/commonjs/internal/index.js +0 -7
- package/lib/commonjs/internal/index.js.map +1 -1
- package/lib/commonjs/internal/redact-uri.js +59 -15
- package/lib/commonjs/internal/redact-uri.js.map +1 -1
- package/lib/commonjs/internal/secure-store-pending-session-store.js +20 -25
- package/lib/commonjs/internal/secure-store-pending-session-store.js.map +1 -1
- package/lib/commonjs/internal/url-parts.js +145 -0
- package/lib/commonjs/internal/url-parts.js.map +1 -0
- package/lib/commonjs/public/index.js +0 -37
- package/lib/commonjs/public/index.js.map +1 -1
- package/lib/commonjs/public/payment-result.js +16 -4
- package/lib/commonjs/public/payment-result.js.map +1 -1
- package/lib/commonjs/public/recovery-result.js +7 -18
- package/lib/commonjs/public/recovery-result.js.map +1 -1
- package/lib/commonjs/public/spare-link-config.js +41 -16
- package/lib/commonjs/public/spare-link-config.js.map +1 -1
- package/lib/commonjs/public/spare-link-event.js +27 -33
- package/lib/commonjs/public/spare-link-event.js.map +1 -1
- package/lib/commonjs/public/spare-link-instance.js +67 -77
- package/lib/commonjs/public/spare-link-instance.js.map +1 -1
- package/lib/commonjs/public/spare-link-session.js +2 -9
- package/lib/commonjs/public/spare-link-session.js.map +1 -1
- package/lib/commonjs/public/spare-link.js +0 -12
- package/lib/commonjs/public/spare-link.js.map +1 -1
- package/lib/commonjs/ui/hooks/{use-payment-flow-state.js → use-hosted-flow-state.js} +4 -4
- package/lib/commonjs/ui/hooks/use-hosted-flow-state.js.map +1 -0
- package/lib/commonjs/ui/hosted/hosted-payment-page.js +177 -0
- package/lib/commonjs/ui/hosted/hosted-payment-page.js.map +1 -0
- package/lib/commonjs/ui/hosted/hosted-payment-webview.js +168 -0
- package/lib/commonjs/ui/hosted/hosted-payment-webview.js.map +1 -0
- package/lib/commonjs/ui/screens/index.js +3 -17
- package/lib/commonjs/ui/screens/index.js.map +1 -1
- package/lib/commonjs/ui/screens/page-unavailable-screen.js +101 -0
- package/lib/commonjs/ui/screens/page-unavailable-screen.js.map +1 -0
- package/lib/commonjs/ui/spare-link-host.js +220 -234
- package/lib/commonjs/ui/spare-link-host.js.map +1 -1
- package/lib/commonjs/ui/widgets/index.js +3 -10
- package/lib/commonjs/ui/widgets/index.js.map +1 -1
- package/lib/commonjs/version.js +7 -5
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/core/models/payment-return-params.js +235 -20
- package/lib/module/core/models/payment-return-params.js.map +1 -1
- package/lib/module/core/models/pending-session-record.js +2 -0
- package/lib/module/core/models/pending-session-record.js.map +1 -0
- package/lib/module/core/services/hosted-flow-controller.js +328 -0
- package/lib/module/core/services/hosted-flow-controller.js.map +1 -0
- package/lib/module/core/services/hosted-flow-state.js +91 -0
- package/lib/module/core/services/hosted-flow-state.js.map +1 -0
- package/lib/module/index.js +8 -22
- package/lib/module/index.js.map +1 -1
- package/lib/module/internal/hosted/bridge-message.js +104 -0
- package/lib/module/internal/hosted/bridge-message.js.map +1 -0
- package/lib/module/internal/hosted/hosted-url.js +36 -0
- package/lib/module/internal/hosted/hosted-url.js.map +1 -0
- package/lib/module/internal/index.js +0 -1
- package/lib/module/internal/index.js.map +1 -1
- package/lib/module/internal/redact-uri.js +59 -15
- package/lib/module/internal/redact-uri.js.map +1 -1
- package/lib/module/internal/secure-store-pending-session-store.js +20 -25
- package/lib/module/internal/secure-store-pending-session-store.js.map +1 -1
- package/lib/module/internal/url-parts.js +139 -0
- package/lib/module/internal/url-parts.js.map +1 -0
- package/lib/module/public/index.js +2 -3
- package/lib/module/public/index.js.map +1 -1
- package/lib/module/public/payment-result.js +16 -4
- package/lib/module/public/payment-result.js.map +1 -1
- package/lib/module/public/recovery-result.js +7 -17
- package/lib/module/public/recovery-result.js.map +1 -1
- package/lib/module/public/spare-link-config.js +42 -15
- package/lib/module/public/spare-link-config.js.map +1 -1
- package/lib/module/public/spare-link-event.js +27 -33
- package/lib/module/public/spare-link-event.js.map +1 -1
- package/lib/module/public/spare-link-instance.js +68 -72
- package/lib/module/public/spare-link-instance.js.map +1 -1
- package/lib/module/public/spare-link-session.js +2 -9
- package/lib/module/public/spare-link-session.js.map +1 -1
- package/lib/module/public/spare-link.js +1 -1
- package/lib/module/public/spare-link.js.map +1 -1
- package/lib/module/ui/hooks/{use-payment-flow-state.js → use-hosted-flow-state.js} +3 -3
- package/lib/module/ui/hooks/use-hosted-flow-state.js.map +1 -0
- package/lib/module/ui/hosted/hosted-payment-page.js +175 -0
- package/lib/module/ui/hosted/hosted-payment-page.js.map +1 -0
- package/lib/module/ui/hosted/hosted-payment-webview.js +163 -0
- package/lib/module/ui/hosted/hosted-payment-webview.js.map +1 -0
- package/lib/module/ui/screens/index.js +1 -3
- package/lib/module/ui/screens/index.js.map +1 -1
- package/lib/module/ui/screens/page-unavailable-screen.js +97 -0
- package/lib/module/ui/screens/page-unavailable-screen.js.map +1 -0
- package/lib/module/ui/spare-link-host.js +221 -236
- package/lib/module/ui/spare-link-host.js.map +1 -1
- package/lib/module/ui/widgets/index.js +1 -2
- package/lib/module/ui/widgets/index.js.map +1 -1
- package/lib/module/version.js +7 -5
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/commonjs/core/models/index.d.ts +1 -123
- package/lib/typescript/commonjs/core/models/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/core/models/payment-return-params.d.ts +91 -8
- package/lib/typescript/commonjs/core/models/payment-return-params.d.ts.map +1 -1
- package/lib/typescript/commonjs/core/models/pending-session-record.d.ts +11 -0
- package/lib/typescript/commonjs/core/models/pending-session-record.d.ts.map +1 -0
- package/lib/typescript/commonjs/core/services/hosted-flow-controller.d.ts +119 -0
- package/lib/typescript/commonjs/core/services/hosted-flow-controller.d.ts.map +1 -0
- package/lib/typescript/commonjs/core/services/hosted-flow-state.d.ts +75 -0
- package/lib/typescript/commonjs/core/services/hosted-flow-state.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +5 -14
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/internal/hosted/bridge-message.d.ts +44 -0
- package/lib/typescript/commonjs/internal/hosted/bridge-message.d.ts.map +1 -0
- package/lib/typescript/commonjs/internal/hosted/hosted-url.d.ts +30 -0
- package/lib/typescript/commonjs/internal/hosted/hosted-url.d.ts.map +1 -0
- package/lib/typescript/commonjs/internal/index.d.ts +0 -1
- package/lib/typescript/commonjs/internal/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/internal/redact-uri.d.ts +21 -1
- package/lib/typescript/commonjs/internal/redact-uri.d.ts.map +1 -1
- package/lib/typescript/commonjs/internal/secure-store-pending-session-store.d.ts +3 -2
- package/lib/typescript/commonjs/internal/secure-store-pending-session-store.d.ts.map +1 -1
- package/lib/typescript/commonjs/internal/url-parts.d.ts +46 -0
- package/lib/typescript/commonjs/internal/url-parts.d.ts.map +1 -0
- package/lib/typescript/commonjs/public/index.d.ts +4 -6
- package/lib/typescript/commonjs/public/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/payment-result.d.ts +50 -12
- package/lib/typescript/commonjs/public/payment-result.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/recovery-result.d.ts +11 -20
- package/lib/typescript/commonjs/public/recovery-result.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link-config.d.ts +13 -31
- package/lib/typescript/commonjs/public/spare-link-config.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link-event.d.ts +29 -31
- package/lib/typescript/commonjs/public/spare-link-event.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link-host-api.d.ts +1 -12
- package/lib/typescript/commonjs/public/spare-link-host-api.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link-instance.d.ts +26 -20
- package/lib/typescript/commonjs/public/spare-link-instance.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link-session.d.ts +3 -8
- package/lib/typescript/commonjs/public/spare-link-session.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link.d.ts +1 -1
- package/lib/typescript/commonjs/public/spare-link.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/use-hosted-flow-state.d.ts +9 -0
- package/lib/typescript/commonjs/ui/hooks/use-hosted-flow-state.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/hosted/hosted-payment-page.d.ts +17 -0
- package/lib/typescript/commonjs/ui/hosted/hosted-payment-page.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/hosted/hosted-payment-webview.d.ts +43 -0
- package/lib/typescript/commonjs/ui/hosted/hosted-payment-webview.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/screens/index.d.ts +1 -3
- package/lib/typescript/commonjs/ui/screens/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/page-unavailable-screen.d.ts +18 -0
- package/lib/typescript/commonjs/ui/screens/page-unavailable-screen.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/spare-link-host.d.ts +4 -5
- package/lib/typescript/commonjs/ui/spare-link-host.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/widgets/index.d.ts +1 -2
- package/lib/typescript/commonjs/ui/widgets/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/version.d.ts +7 -5
- package/lib/typescript/commonjs/version.d.ts.map +1 -1
- package/lib/typescript/module/core/models/index.d.ts +1 -123
- package/lib/typescript/module/core/models/index.d.ts.map +1 -1
- package/lib/typescript/module/core/models/payment-return-params.d.ts +91 -8
- package/lib/typescript/module/core/models/payment-return-params.d.ts.map +1 -1
- package/lib/typescript/module/core/models/pending-session-record.d.ts +11 -0
- package/lib/typescript/module/core/models/pending-session-record.d.ts.map +1 -0
- package/lib/typescript/module/core/services/hosted-flow-controller.d.ts +119 -0
- package/lib/typescript/module/core/services/hosted-flow-controller.d.ts.map +1 -0
- package/lib/typescript/module/core/services/hosted-flow-state.d.ts +75 -0
- package/lib/typescript/module/core/services/hosted-flow-state.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +5 -14
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/internal/hosted/bridge-message.d.ts +44 -0
- package/lib/typescript/module/internal/hosted/bridge-message.d.ts.map +1 -0
- package/lib/typescript/module/internal/hosted/hosted-url.d.ts +30 -0
- package/lib/typescript/module/internal/hosted/hosted-url.d.ts.map +1 -0
- package/lib/typescript/module/internal/index.d.ts +0 -1
- package/lib/typescript/module/internal/index.d.ts.map +1 -1
- package/lib/typescript/module/internal/redact-uri.d.ts +21 -1
- package/lib/typescript/module/internal/redact-uri.d.ts.map +1 -1
- package/lib/typescript/module/internal/secure-store-pending-session-store.d.ts +3 -2
- package/lib/typescript/module/internal/secure-store-pending-session-store.d.ts.map +1 -1
- package/lib/typescript/module/internal/url-parts.d.ts +46 -0
- package/lib/typescript/module/internal/url-parts.d.ts.map +1 -0
- package/lib/typescript/module/public/index.d.ts +4 -6
- package/lib/typescript/module/public/index.d.ts.map +1 -1
- package/lib/typescript/module/public/payment-result.d.ts +50 -12
- package/lib/typescript/module/public/payment-result.d.ts.map +1 -1
- package/lib/typescript/module/public/recovery-result.d.ts +11 -20
- package/lib/typescript/module/public/recovery-result.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link-config.d.ts +13 -31
- package/lib/typescript/module/public/spare-link-config.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link-event.d.ts +29 -31
- package/lib/typescript/module/public/spare-link-event.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link-host-api.d.ts +1 -12
- package/lib/typescript/module/public/spare-link-host-api.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link-instance.d.ts +26 -20
- package/lib/typescript/module/public/spare-link-instance.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link-session.d.ts +3 -8
- package/lib/typescript/module/public/spare-link-session.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link.d.ts +1 -1
- package/lib/typescript/module/public/spare-link.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/use-hosted-flow-state.d.ts +9 -0
- package/lib/typescript/module/ui/hooks/use-hosted-flow-state.d.ts.map +1 -0
- package/lib/typescript/module/ui/hosted/hosted-payment-page.d.ts +17 -0
- package/lib/typescript/module/ui/hosted/hosted-payment-page.d.ts.map +1 -0
- package/lib/typescript/module/ui/hosted/hosted-payment-webview.d.ts +43 -0
- package/lib/typescript/module/ui/hosted/hosted-payment-webview.d.ts.map +1 -0
- package/lib/typescript/module/ui/screens/index.d.ts +1 -3
- package/lib/typescript/module/ui/screens/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/page-unavailable-screen.d.ts +18 -0
- package/lib/typescript/module/ui/screens/page-unavailable-screen.d.ts.map +1 -0
- package/lib/typescript/module/ui/spare-link-host.d.ts +4 -5
- package/lib/typescript/module/ui/spare-link-host.d.ts.map +1 -1
- package/lib/typescript/module/ui/widgets/index.d.ts +1 -2
- package/lib/typescript/module/ui/widgets/index.d.ts.map +1 -1
- package/lib/typescript/module/version.d.ts +7 -5
- package/lib/typescript/module/version.d.ts.map +1 -1
- package/package.json +24 -23
- package/plugins/with-spare-link.js +6 -26
- package/src/core/models/index.ts +1 -139
- package/src/core/models/payment-return-params.ts +269 -21
- package/src/core/models/pending-session-record.ts +10 -0
- package/src/core/services/hosted-flow-controller.ts +374 -0
- package/src/core/services/hosted-flow-state.ts +123 -0
- package/src/index.ts +20 -89
- package/src/internal/hosted/bridge-message.ts +106 -0
- package/src/internal/hosted/hosted-url.ts +33 -0
- package/src/internal/index.ts +0 -1
- package/src/internal/redact-uri.ts +69 -15
- package/src/internal/secure-store-pending-session-store.ts +28 -49
- package/src/internal/url-parts.ts +134 -0
- package/src/public/index.ts +2 -24
- package/src/public/payment-result.ts +50 -12
- package/src/public/recovery-result.ts +16 -25
- package/src/public/spare-link-config.ts +56 -43
- package/src/public/spare-link-event.ts +33 -42
- package/src/public/spare-link-host-api.ts +1 -14
- package/src/public/spare-link-instance.ts +57 -65
- package/src/public/spare-link-session.ts +4 -16
- package/src/public/spare-link.ts +1 -1
- package/src/ui/hooks/use-hosted-flow-state.ts +16 -0
- package/src/ui/hosted/hosted-payment-page.tsx +178 -0
- package/src/ui/hosted/hosted-payment-webview.tsx +164 -0
- package/src/ui/screens/index.ts +4 -6
- package/src/ui/screens/page-unavailable-screen.tsx +94 -0
- package/src/ui/spare-link-host.tsx +227 -247
- package/src/ui/widgets/index.ts +1 -2
- package/src/version.ts +7 -5
- package/CHANGELOG.md +0 -66
- package/lib/commonjs/core/client/link-api-client.js +0 -297
- package/lib/commonjs/core/client/link-api-client.js.map +0 -1
- package/lib/commonjs/core/errors/payment-api-error.js +0 -35
- package/lib/commonjs/core/errors/payment-api-error.js.map +0 -1
- package/lib/commonjs/core/models/link-session-status.js +0 -14
- package/lib/commonjs/core/models/link-session-status.js.map +0 -1
- package/lib/commonjs/core/models/payment-type.js +0 -45
- package/lib/commonjs/core/models/payment-type.js.map +0 -1
- package/lib/commonjs/core/models/wire-mappers.js +0 -277
- package/lib/commonjs/core/models/wire-mappers.js.map +0 -1
- package/lib/commonjs/core/services/consent-presenter.js +0 -150
- package/lib/commonjs/core/services/consent-presenter.js.map +0 -1
- package/lib/commonjs/core/services/execute-resume-if-needed.js +0 -216
- package/lib/commonjs/core/services/execute-resume-if-needed.js.map +0 -1
- package/lib/commonjs/core/services/multi-payment-rules-presenter.js +0 -151
- package/lib/commonjs/core/services/multi-payment-rules-presenter.js.map +0 -1
- package/lib/commonjs/core/services/payment-flow-controller.js +0 -547
- package/lib/commonjs/core/services/payment-flow-controller.js.map +0 -1
- package/lib/commonjs/core/services/payment-flow-state.js +0 -110
- package/lib/commonjs/core/services/payment-flow-state.js.map +0 -1
- package/lib/commonjs/core/services/payment-result-mapper.js +0 -49
- package/lib/commonjs/core/services/payment-result-mapper.js.map +0 -1
- package/lib/commonjs/core/services/presentation-utils.js +0 -11
- package/lib/commonjs/core/services/presentation-utils.js.map +0 -1
- package/lib/commonjs/core/services/redirect-buffer.js +0 -40
- package/lib/commonjs/core/services/redirect-buffer.js.map +0 -1
- package/lib/commonjs/core/services/user-friendly-messages.js +0 -46
- package/lib/commonjs/core/services/user-friendly-messages.js.map +0 -1
- package/lib/commonjs/internal/telemetry-collector.js +0 -80
- package/lib/commonjs/internal/telemetry-collector.js.map +0 -1
- package/lib/commonjs/public/constants.js +0 -21
- package/lib/commonjs/public/constants.js.map +0 -1
- package/lib/commonjs/public/spare-link-callbacks.js +0 -6
- package/lib/commonjs/public/spare-link-callbacks.js.map +0 -1
- package/lib/commonjs/ui/consent/charge-bearer-display.js +0 -99
- package/lib/commonjs/ui/consent/charge-bearer-display.js.map +0 -1
- package/lib/commonjs/ui/consent/consent-accordion.js +0 -94
- package/lib/commonjs/ui/consent/consent-accordion.js.map +0 -1
- package/lib/commonjs/ui/consent/consent-summary-section.js +0 -27
- package/lib/commonjs/ui/consent/consent-summary-section.js.map +0 -1
- package/lib/commonjs/ui/consent/cop-information.js +0 -168
- package/lib/commonjs/ui/consent/cop-information.js.map +0 -1
- package/lib/commonjs/ui/consent/international-payment-summary.js +0 -98
- package/lib/commonjs/ui/consent/international-payment-summary.js.map +0 -1
- package/lib/commonjs/ui/consent/label-value-rows.js +0 -59
- package/lib/commonjs/ui/consent/label-value-rows.js.map +0 -1
- package/lib/commonjs/ui/consent/multi-payment-rules-list.js +0 -130
- package/lib/commonjs/ui/consent/multi-payment-rules-list.js.map +0 -1
- package/lib/commonjs/ui/consent/multi-payment-summary.js +0 -99
- package/lib/commonjs/ui/consent/multi-payment-summary.js.map +0 -1
- package/lib/commonjs/ui/consent/single-payment-summary.js +0 -158
- package/lib/commonjs/ui/consent/single-payment-summary.js.map +0 -1
- package/lib/commonjs/ui/consent/terms-link.js +0 -35
- package/lib/commonjs/ui/consent/terms-link.js.map +0 -1
- package/lib/commonjs/ui/hooks/use-payment-flow-state.js.map +0 -1
- package/lib/commonjs/ui/payment-flow-page.js +0 -235
- package/lib/commonjs/ui/payment-flow-page.js.map +0 -1
- package/lib/commonjs/ui/screens/bank-selection-screen.js +0 -215
- package/lib/commonjs/ui/screens/bank-selection-screen.js.map +0 -1
- package/lib/commonjs/ui/screens/consent-details-screen.js +0 -124
- package/lib/commonjs/ui/screens/consent-details-screen.js.map +0 -1
- package/lib/commonjs/ui/screens/mandate-setup-success-screen.js +0 -79
- package/lib/commonjs/ui/screens/mandate-setup-success-screen.js.map +0 -1
- package/lib/commonjs/ui/widgets/layout-w-header.js +0 -106
- package/lib/commonjs/ui/widgets/layout-w-header.js.map +0 -1
- package/lib/commonjs/ui/widgets/stepper.js +0 -124
- package/lib/commonjs/ui/widgets/stepper.js.map +0 -1
- package/lib/module/core/client/link-api-client.js +0 -292
- package/lib/module/core/client/link-api-client.js.map +0 -1
- package/lib/module/core/errors/payment-api-error.js +0 -29
- package/lib/module/core/errors/payment-api-error.js.map +0 -1
- package/lib/module/core/models/link-session-status.js +0 -10
- package/lib/module/core/models/link-session-status.js.map +0 -1
- package/lib/module/core/models/payment-type.js +0 -36
- package/lib/module/core/models/payment-type.js.map +0 -1
- package/lib/module/core/models/wire-mappers.js +0 -263
- package/lib/module/core/models/wire-mappers.js.map +0 -1
- package/lib/module/core/services/consent-presenter.js +0 -140
- package/lib/module/core/services/consent-presenter.js.map +0 -1
- package/lib/module/core/services/execute-resume-if-needed.js +0 -211
- package/lib/module/core/services/execute-resume-if-needed.js.map +0 -1
- package/lib/module/core/services/multi-payment-rules-presenter.js +0 -146
- package/lib/module/core/services/multi-payment-rules-presenter.js.map +0 -1
- package/lib/module/core/services/payment-flow-controller.js +0 -544
- package/lib/module/core/services/payment-flow-controller.js.map +0 -1
- package/lib/module/core/services/payment-flow-state.js +0 -106
- package/lib/module/core/services/payment-flow-state.js.map +0 -1
- package/lib/module/core/services/payment-result-mapper.js +0 -45
- package/lib/module/core/services/payment-result-mapper.js.map +0 -1
- package/lib/module/core/services/presentation-utils.js +0 -7
- package/lib/module/core/services/presentation-utils.js.map +0 -1
- package/lib/module/core/services/redirect-buffer.js +0 -33
- package/lib/module/core/services/redirect-buffer.js.map +0 -1
- package/lib/module/core/services/user-friendly-messages.js +0 -42
- package/lib/module/core/services/user-friendly-messages.js.map +0 -1
- package/lib/module/internal/telemetry-collector.js +0 -75
- package/lib/module/internal/telemetry-collector.js.map +0 -1
- package/lib/module/public/constants.js +0 -17
- package/lib/module/public/constants.js.map +0 -1
- package/lib/module/public/spare-link-callbacks.js +0 -4
- package/lib/module/public/spare-link-callbacks.js.map +0 -1
- package/lib/module/ui/consent/charge-bearer-display.js +0 -95
- package/lib/module/ui/consent/charge-bearer-display.js.map +0 -1
- package/lib/module/ui/consent/consent-accordion.js +0 -90
- package/lib/module/ui/consent/consent-accordion.js.map +0 -1
- package/lib/module/ui/consent/consent-summary-section.js +0 -23
- package/lib/module/ui/consent/consent-summary-section.js.map +0 -1
- package/lib/module/ui/consent/cop-information.js +0 -165
- package/lib/module/ui/consent/cop-information.js.map +0 -1
- package/lib/module/ui/consent/international-payment-summary.js +0 -94
- package/lib/module/ui/consent/international-payment-summary.js.map +0 -1
- package/lib/module/ui/consent/label-value-rows.js +0 -55
- package/lib/module/ui/consent/label-value-rows.js.map +0 -1
- package/lib/module/ui/consent/multi-payment-rules-list.js +0 -125
- package/lib/module/ui/consent/multi-payment-rules-list.js.map +0 -1
- package/lib/module/ui/consent/multi-payment-summary.js +0 -95
- package/lib/module/ui/consent/multi-payment-summary.js.map +0 -1
- package/lib/module/ui/consent/single-payment-summary.js +0 -154
- package/lib/module/ui/consent/single-payment-summary.js.map +0 -1
- package/lib/module/ui/consent/terms-link.js +0 -31
- package/lib/module/ui/consent/terms-link.js.map +0 -1
- package/lib/module/ui/hooks/use-payment-flow-state.js.map +0 -1
- package/lib/module/ui/payment-flow-page.js +0 -232
- package/lib/module/ui/payment-flow-page.js.map +0 -1
- package/lib/module/ui/screens/bank-selection-screen.js +0 -211
- package/lib/module/ui/screens/bank-selection-screen.js.map +0 -1
- package/lib/module/ui/screens/consent-details-screen.js +0 -120
- package/lib/module/ui/screens/consent-details-screen.js.map +0 -1
- package/lib/module/ui/screens/mandate-setup-success-screen.js +0 -75
- package/lib/module/ui/screens/mandate-setup-success-screen.js.map +0 -1
- package/lib/module/ui/widgets/layout-w-header.js +0 -102
- package/lib/module/ui/widgets/layout-w-header.js.map +0 -1
- package/lib/module/ui/widgets/stepper.js +0 -120
- package/lib/module/ui/widgets/stepper.js.map +0 -1
- package/lib/typescript/commonjs/core/client/link-api-client.d.ts +0 -70
- package/lib/typescript/commonjs/core/client/link-api-client.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/errors/payment-api-error.d.ts +0 -15
- package/lib/typescript/commonjs/core/errors/payment-api-error.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/models/link-session-status.d.ts +0 -6
- package/lib/typescript/commonjs/core/models/link-session-status.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/models/payment-type.d.ts +0 -18
- package/lib/typescript/commonjs/core/models/payment-type.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/models/wire-mappers.d.ts +0 -19
- package/lib/typescript/commonjs/core/models/wire-mappers.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/consent-presenter.d.ts +0 -67
- package/lib/typescript/commonjs/core/services/consent-presenter.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/execute-resume-if-needed.d.ts +0 -32
- package/lib/typescript/commonjs/core/services/execute-resume-if-needed.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/multi-payment-rules-presenter.d.ts +0 -9
- package/lib/typescript/commonjs/core/services/multi-payment-rules-presenter.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/payment-flow-controller.d.ts +0 -146
- package/lib/typescript/commonjs/core/services/payment-flow-controller.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/payment-flow-state.d.ts +0 -64
- package/lib/typescript/commonjs/core/services/payment-flow-state.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/payment-result-mapper.d.ts +0 -5
- package/lib/typescript/commonjs/core/services/payment-result-mapper.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/presentation-utils.d.ts +0 -5
- package/lib/typescript/commonjs/core/services/presentation-utils.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/redirect-buffer.d.ts +0 -6
- package/lib/typescript/commonjs/core/services/redirect-buffer.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/user-friendly-messages.d.ts +0 -6
- package/lib/typescript/commonjs/core/services/user-friendly-messages.d.ts.map +0 -1
- package/lib/typescript/commonjs/internal/telemetry-collector.d.ts +0 -2
- package/lib/typescript/commonjs/internal/telemetry-collector.d.ts.map +0 -1
- package/lib/typescript/commonjs/public/constants.d.ts +0 -12
- package/lib/typescript/commonjs/public/constants.d.ts.map +0 -1
- package/lib/typescript/commonjs/public/spare-link-callbacks.d.ts +0 -14
- package/lib/typescript/commonjs/public/spare-link-callbacks.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/charge-bearer-display.d.ts +0 -5
- package/lib/typescript/commonjs/ui/consent/charge-bearer-display.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/consent-accordion.d.ts +0 -10
- package/lib/typescript/commonjs/ui/consent/consent-accordion.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/consent-summary-section.d.ts +0 -6
- package/lib/typescript/commonjs/ui/consent/consent-summary-section.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/cop-information.d.ts +0 -6
- package/lib/typescript/commonjs/ui/consent/cop-information.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/international-payment-summary.d.ts +0 -6
- package/lib/typescript/commonjs/ui/consent/international-payment-summary.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/label-value-rows.d.ts +0 -10
- package/lib/typescript/commonjs/ui/consent/label-value-rows.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/multi-payment-rules-list.d.ts +0 -15
- package/lib/typescript/commonjs/ui/consent/multi-payment-rules-list.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/multi-payment-summary.d.ts +0 -6
- package/lib/typescript/commonjs/ui/consent/multi-payment-summary.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/single-payment-summary.d.ts +0 -6
- package/lib/typescript/commonjs/ui/consent/single-payment-summary.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/terms-link.d.ts +0 -2
- package/lib/typescript/commonjs/ui/consent/terms-link.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/hooks/use-payment-flow-state.d.ts +0 -9
- package/lib/typescript/commonjs/ui/hooks/use-payment-flow-state.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/payment-flow-page.d.ts +0 -20
- package/lib/typescript/commonjs/ui/payment-flow-page.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/screens/bank-selection-screen.d.ts +0 -15
- package/lib/typescript/commonjs/ui/screens/bank-selection-screen.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/screens/consent-details-screen.d.ts +0 -13
- package/lib/typescript/commonjs/ui/screens/consent-details-screen.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/screens/mandate-setup-success-screen.d.ts +0 -10
- package/lib/typescript/commonjs/ui/screens/mandate-setup-success-screen.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/widgets/layout-w-header.d.ts +0 -20
- package/lib/typescript/commonjs/ui/widgets/layout-w-header.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/widgets/stepper.d.ts +0 -15
- package/lib/typescript/commonjs/ui/widgets/stepper.d.ts.map +0 -1
- package/lib/typescript/module/core/client/link-api-client.d.ts +0 -70
- package/lib/typescript/module/core/client/link-api-client.d.ts.map +0 -1
- package/lib/typescript/module/core/errors/payment-api-error.d.ts +0 -15
- package/lib/typescript/module/core/errors/payment-api-error.d.ts.map +0 -1
- package/lib/typescript/module/core/models/link-session-status.d.ts +0 -6
- package/lib/typescript/module/core/models/link-session-status.d.ts.map +0 -1
- package/lib/typescript/module/core/models/payment-type.d.ts +0 -18
- package/lib/typescript/module/core/models/payment-type.d.ts.map +0 -1
- package/lib/typescript/module/core/models/wire-mappers.d.ts +0 -19
- package/lib/typescript/module/core/models/wire-mappers.d.ts.map +0 -1
- package/lib/typescript/module/core/services/consent-presenter.d.ts +0 -67
- package/lib/typescript/module/core/services/consent-presenter.d.ts.map +0 -1
- package/lib/typescript/module/core/services/execute-resume-if-needed.d.ts +0 -32
- package/lib/typescript/module/core/services/execute-resume-if-needed.d.ts.map +0 -1
- package/lib/typescript/module/core/services/multi-payment-rules-presenter.d.ts +0 -9
- package/lib/typescript/module/core/services/multi-payment-rules-presenter.d.ts.map +0 -1
- package/lib/typescript/module/core/services/payment-flow-controller.d.ts +0 -146
- package/lib/typescript/module/core/services/payment-flow-controller.d.ts.map +0 -1
- package/lib/typescript/module/core/services/payment-flow-state.d.ts +0 -64
- package/lib/typescript/module/core/services/payment-flow-state.d.ts.map +0 -1
- package/lib/typescript/module/core/services/payment-result-mapper.d.ts +0 -5
- package/lib/typescript/module/core/services/payment-result-mapper.d.ts.map +0 -1
- package/lib/typescript/module/core/services/presentation-utils.d.ts +0 -5
- package/lib/typescript/module/core/services/presentation-utils.d.ts.map +0 -1
- package/lib/typescript/module/core/services/redirect-buffer.d.ts +0 -6
- package/lib/typescript/module/core/services/redirect-buffer.d.ts.map +0 -1
- package/lib/typescript/module/core/services/user-friendly-messages.d.ts +0 -6
- package/lib/typescript/module/core/services/user-friendly-messages.d.ts.map +0 -1
- package/lib/typescript/module/internal/telemetry-collector.d.ts +0 -2
- package/lib/typescript/module/internal/telemetry-collector.d.ts.map +0 -1
- package/lib/typescript/module/public/constants.d.ts +0 -12
- package/lib/typescript/module/public/constants.d.ts.map +0 -1
- package/lib/typescript/module/public/spare-link-callbacks.d.ts +0 -14
- package/lib/typescript/module/public/spare-link-callbacks.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/charge-bearer-display.d.ts +0 -5
- package/lib/typescript/module/ui/consent/charge-bearer-display.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/consent-accordion.d.ts +0 -10
- package/lib/typescript/module/ui/consent/consent-accordion.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/consent-summary-section.d.ts +0 -6
- package/lib/typescript/module/ui/consent/consent-summary-section.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/cop-information.d.ts +0 -6
- package/lib/typescript/module/ui/consent/cop-information.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/international-payment-summary.d.ts +0 -6
- package/lib/typescript/module/ui/consent/international-payment-summary.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/label-value-rows.d.ts +0 -10
- package/lib/typescript/module/ui/consent/label-value-rows.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/multi-payment-rules-list.d.ts +0 -15
- package/lib/typescript/module/ui/consent/multi-payment-rules-list.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/multi-payment-summary.d.ts +0 -6
- package/lib/typescript/module/ui/consent/multi-payment-summary.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/single-payment-summary.d.ts +0 -6
- package/lib/typescript/module/ui/consent/single-payment-summary.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/terms-link.d.ts +0 -2
- package/lib/typescript/module/ui/consent/terms-link.d.ts.map +0 -1
- package/lib/typescript/module/ui/hooks/use-payment-flow-state.d.ts +0 -9
- package/lib/typescript/module/ui/hooks/use-payment-flow-state.d.ts.map +0 -1
- package/lib/typescript/module/ui/payment-flow-page.d.ts +0 -20
- package/lib/typescript/module/ui/payment-flow-page.d.ts.map +0 -1
- package/lib/typescript/module/ui/screens/bank-selection-screen.d.ts +0 -15
- package/lib/typescript/module/ui/screens/bank-selection-screen.d.ts.map +0 -1
- package/lib/typescript/module/ui/screens/consent-details-screen.d.ts +0 -13
- package/lib/typescript/module/ui/screens/consent-details-screen.d.ts.map +0 -1
- package/lib/typescript/module/ui/screens/mandate-setup-success-screen.d.ts +0 -10
- package/lib/typescript/module/ui/screens/mandate-setup-success-screen.d.ts.map +0 -1
- package/lib/typescript/module/ui/widgets/layout-w-header.d.ts +0 -20
- package/lib/typescript/module/ui/widgets/layout-w-header.d.ts.map +0 -1
- package/lib/typescript/module/ui/widgets/stepper.d.ts +0 -15
- package/lib/typescript/module/ui/widgets/stepper.d.ts.map +0 -1
- package/src/core/client/link-api-client.ts +0 -414
- package/src/core/errors/payment-api-error.ts +0 -35
- package/src/core/models/link-session-status.ts +0 -7
- package/src/core/models/payment-type.ts +0 -54
- package/src/core/models/wire-mappers.ts +0 -315
- package/src/core/services/consent-presenter.ts +0 -213
- package/src/core/services/execute-resume-if-needed.ts +0 -243
- package/src/core/services/multi-payment-rules-presenter.ts +0 -158
- package/src/core/services/payment-flow-controller.ts +0 -607
- package/src/core/services/payment-flow-state.ts +0 -124
- package/src/core/services/payment-result-mapper.ts +0 -41
- package/src/core/services/presentation-utils.ts +0 -4
- package/src/core/services/redirect-buffer.ts +0 -34
- package/src/core/services/user-friendly-messages.ts +0 -39
- package/src/internal/telemetry-collector.ts +0 -90
- package/src/public/constants.ts +0 -14
- package/src/public/spare-link-callbacks.ts +0 -20
- package/src/ui/consent/charge-bearer-display.tsx +0 -68
- package/src/ui/consent/consent-accordion.tsx +0 -89
- package/src/ui/consent/consent-summary-section.tsx +0 -19
- package/src/ui/consent/cop-information.tsx +0 -121
- package/src/ui/consent/international-payment-summary.tsx +0 -83
- package/src/ui/consent/label-value-rows.tsx +0 -50
- package/src/ui/consent/multi-payment-rules-list.tsx +0 -138
- package/src/ui/consent/multi-payment-summary.tsx +0 -82
- package/src/ui/consent/single-payment-summary.tsx +0 -123
- package/src/ui/consent/terms-link.tsx +0 -27
- package/src/ui/hooks/use-payment-flow-state.ts +0 -16
- package/src/ui/payment-flow-page.tsx +0 -254
- package/src/ui/screens/bank-selection-screen.tsx +0 -209
- package/src/ui/screens/consent-details-screen.tsx +0 -106
- package/src/ui/screens/mandate-setup-success-screen.tsx +0 -72
- package/src/ui/widgets/layout-w-header.tsx +0 -89
- package/src/ui/widgets/stepper.tsx +0 -126
package/lib/commonjs/version.js
CHANGED
|
@@ -5,10 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.SDK_VERSION = void 0;
|
|
7
7
|
/**
|
|
8
|
-
* SDK version reported in telemetry and the default User-Agent.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* SDK version reported in telemetry and the default User-Agent.
|
|
9
|
+
*
|
|
10
|
+
* GENERATED FILE — do not edit by hand. Written from package.json by
|
|
11
|
+
* scripts/sync-sdk-version.mjs (run by the root `version` npm script after
|
|
12
|
+
* `changeset version`). The src/index.ts smoke test asserts this matches
|
|
13
|
+
* package.json's version.
|
|
12
14
|
*/
|
|
13
|
-
const SDK_VERSION = exports.SDK_VERSION = '
|
|
15
|
+
const SDK_VERSION = exports.SDK_VERSION = '1.0.0';
|
|
14
16
|
//# sourceMappingURL=version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SDK_VERSION","exports"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,
|
|
1
|
+
{"version":3,"names":["SDK_VERSION","exports"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,OAAgB","ignoreList":[]}
|
|
@@ -1,37 +1,252 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { parseQueryParams } from "../../internal/url-parts.js";
|
|
4
|
+
|
|
3
5
|
/**
|
|
4
|
-
* Query
|
|
6
|
+
* Query parameters on the deep link that returns a payer to the app.
|
|
7
|
+
*
|
|
8
|
+
* Both channels are told the same thing in the same words. A success carries
|
|
9
|
+
* `reference`, `status` and either `paymentId` or `mandateId`. A failure carries
|
|
10
|
+
* `reference`, `errorCode` and `status`. `merchantRef` is on both when the request
|
|
11
|
+
* recorded one, and `status` is always present but may be empty.
|
|
12
|
+
*
|
|
13
|
+
* `errorCode` is what tells the two apart: it is on every failure and on no
|
|
14
|
+
* success, so an outcome can be read without recognising a status.
|
|
5
15
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
16
|
+
* **A deep link to an app is not signed.** `sig` is added on the browser channel
|
|
17
|
+
* only, deliberately: any installed app can claim a custom scheme, so a signature
|
|
18
|
+
* on a deep link would be a proof handed to whoever intercepted it. When it is
|
|
19
|
+
* present it is an ES256 JWS over the return URL, and it is carried through
|
|
20
|
+
* unverified — checking it needs Spare's public key, which the SDK does not hold.
|
|
21
|
+
*
|
|
22
|
+
* The query is read by {@link parseQueryParams} rather than through `URL`,
|
|
23
|
+
* because React Native's `URL.searchParams` never parses the URL it was given.
|
|
8
24
|
*/
|
|
9
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Statuses that mean the payment is done and will not change.
|
|
28
|
+
*
|
|
29
|
+
* `Scheduled` is a success: a future-dated payment the bank has accepted has
|
|
30
|
+
* succeeded, the money simply has not moved yet. A caller that needs settled funds
|
|
31
|
+
* specifically must read the status back from its own backend — this SDK reports
|
|
32
|
+
* every settled status as `processed`, because all of them are terminal and all of
|
|
33
|
+
* them resolve to the merchant's success URL.
|
|
34
|
+
*
|
|
35
|
+
* `success` is the word an app used to be sent instead of the request's own status.
|
|
36
|
+
* The service now sends one vocabulary to both channels, so it should no longer
|
|
37
|
+
* arrive — it is still read because an environment running the earlier build would
|
|
38
|
+
* otherwise report a completed payment as unresolved.
|
|
39
|
+
*/
|
|
40
|
+
const SETTLED_STATUSES = new Set(['Processed', 'Scheduled', 'success']);
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Statuses that mean the payment will not happen. `failure` is legacy, for the same
|
|
44
|
+
* reason `success` is in {@link SETTLED_STATUSES}.
|
|
45
|
+
*/
|
|
46
|
+
const FAILED_STATUSES = new Set(['Rejected', 'Errored', 'failure']);
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Statuses that mean the request is still payable — not an outcome at all.
|
|
50
|
+
*
|
|
51
|
+
* A return should never carry one: the payer has come back, so the request has
|
|
52
|
+
* moved on. One arriving here means the outcome is still being decided, which is
|
|
53
|
+
* `unknown` rather than either answer.
|
|
54
|
+
*/
|
|
55
|
+
const IN_FLIGHT_STATUSES = new Set(['New', 'Consumed', 'ConsentRaised']);
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The one error key that reports a success rather than a failure.
|
|
59
|
+
*
|
|
60
|
+
* It arrives in `errorCode` like every other key, so anything that treats the
|
|
61
|
+
* presence of a key as a failure reports a completed payment as a failed one.
|
|
62
|
+
*/
|
|
63
|
+
const SUCCESS_ERROR_KEY = 'request_processed';
|
|
64
|
+
|
|
65
|
+
/** Every status this version has been taught, whatever it means. */
|
|
66
|
+
function isKnownStatus(status) {
|
|
67
|
+
return SETTLED_STATUSES.has(status) || FAILED_STATUSES.has(status) || IN_FLIGHT_STATUSES.has(status);
|
|
68
|
+
}
|
|
10
69
|
export function isPaymentReturnCallbackUri(uri) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
if (
|
|
19
|
-
if (params.has('error_code')) return true;
|
|
20
|
-
if (params.has('error')) return true;
|
|
21
|
-
if (params.get('status') === 'failure') return true;
|
|
70
|
+
const params = paymentReturnParams(uri);
|
|
71
|
+
if (params.reference !== undefined) return true;
|
|
72
|
+
if (params.merchantRef !== undefined) return true;
|
|
73
|
+
if (params.errorCode !== undefined) return true;
|
|
74
|
+
if (params.error_code !== undefined) return true;
|
|
75
|
+
if (params.error !== undefined) return true;
|
|
76
|
+
const status = nonEmpty(params.status);
|
|
77
|
+
if (status !== undefined && isKnownStatus(status)) return true;
|
|
22
78
|
return false;
|
|
23
79
|
}
|
|
24
80
|
|
|
81
|
+
/** Reads the query of a return URI into the shape the extractors below take. */
|
|
82
|
+
export function paymentReturnParams(uri) {
|
|
83
|
+
return parseQueryParams(typeof uri === 'string' ? uri : uri.toString());
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Whether the return URI reports a completed payment.
|
|
88
|
+
*
|
|
89
|
+
* Only a known settled status counts. Absent, in-flight or a status this version
|
|
90
|
+
* has not been taught is read as not-a-success: a payer returned without one has
|
|
91
|
+
* not been told their payment succeeded, and neither should the app.
|
|
92
|
+
*/
|
|
93
|
+
export function isPaymentReturnSuccess(params) {
|
|
94
|
+
const status = nonEmpty(params.status);
|
|
95
|
+
return status !== undefined && SETTLED_STATUSES.has(status);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** The payment request reference, if the return URI named one. */
|
|
99
|
+
export function extractPaymentReturnReference(params) {
|
|
100
|
+
return nonEmpty(params.reference);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** The merchant's own reference for the attempt, if present. */
|
|
104
|
+
export function extractPaymentReturnMerchantRef(params) {
|
|
105
|
+
return nonEmpty(params.merchantRef);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Spare's identifier for the payment itself, present on a success.
|
|
110
|
+
*
|
|
111
|
+
* Distinct from the reference, which names the *request*. This is what a merchant
|
|
112
|
+
* records against the order.
|
|
113
|
+
*/
|
|
114
|
+
export function extractPaymentReturnPaymentId(params) {
|
|
115
|
+
return nonEmpty(params.paymentId);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Spare's identifier for a mandate, present on a mandate's success.
|
|
120
|
+
*
|
|
121
|
+
* A return carries this or {@link extractPaymentReturnPaymentId}, never both: a
|
|
122
|
+
* single payment names a payment, every mandate type names a mandate. Read
|
|
123
|
+
* whichever is present rather than assuming which one the flow produced.
|
|
124
|
+
*/
|
|
125
|
+
export function extractPaymentReturnMandateId(params) {
|
|
126
|
+
return nonEmpty(params.mandateId);
|
|
127
|
+
}
|
|
128
|
+
|
|
25
129
|
/**
|
|
26
|
-
*
|
|
130
|
+
* The signature over this return, if it carried one.
|
|
27
131
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
132
|
+
* An ES256 JWS whose payload is the return URL. Handed to the caller unverified —
|
|
133
|
+
* checking it needs Spare's public key, which the SDK does not hold.
|
|
134
|
+
*/
|
|
135
|
+
export function extractPaymentReturnSignature(params) {
|
|
136
|
+
return nonEmpty(params.sig);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* The failure key from a payment return URI, if it reported one.
|
|
141
|
+
*
|
|
142
|
+
* `errorCode` is the name both channels now use, and it is what tells the two
|
|
143
|
+
* outcomes apart: the service puts it on every failure and on no success, so a
|
|
144
|
+
* reader never has to recognise a status to know the payment did not happen.
|
|
145
|
+
*
|
|
146
|
+
* `error_code` and `error` are legacy — an earlier build sent the code under the
|
|
147
|
+
* snake_case name, and older returns carried a separate machine-readable reason.
|
|
148
|
+
* Both are still read so an environment running that build is not misread.
|
|
149
|
+
*
|
|
150
|
+
* {@link SUCCESS_ERROR_KEY} is excluded, because a success reports itself through
|
|
151
|
+
* the same field and must not come back out of here looking like a reason the
|
|
152
|
+
* payment failed.
|
|
153
|
+
*/
|
|
154
|
+
function failureErrorKey(params) {
|
|
155
|
+
const key = nonEmpty(params.errorCode) ?? nonEmpty(params.error_code) ?? nonEmpty(params.error);
|
|
156
|
+
return key === SUCCESS_ERROR_KEY ? undefined : key;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* The failure code from a payment return URI.
|
|
161
|
+
*
|
|
162
|
+
* A return that says only that it failed, naming no key, still yields something a
|
|
163
|
+
* merchant can branch on.
|
|
30
164
|
*/
|
|
31
165
|
export function extractPaymentReturnErrorCode(params) {
|
|
32
|
-
const
|
|
33
|
-
if (
|
|
34
|
-
|
|
166
|
+
const key = failureErrorKey(params);
|
|
167
|
+
if (key !== undefined) return key;
|
|
168
|
+
const status = nonEmpty(params.status);
|
|
169
|
+
if (status !== undefined && FAILED_STATUSES.has(status)) return 'authorize_failed';
|
|
35
170
|
return undefined;
|
|
36
171
|
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* The machine-readable reason a payment did not complete, e.g. `user_cancelled`.
|
|
175
|
+
*
|
|
176
|
+
* Kept alongside the code because the code is often generic where this is not.
|
|
177
|
+
*/
|
|
178
|
+
export function extractPaymentReturnErrorReason(params) {
|
|
179
|
+
const reason = nonEmpty(params.error);
|
|
180
|
+
return reason === SUCCESS_ERROR_KEY ? undefined : reason;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* The human-readable failure text, if the return carried one.
|
|
185
|
+
*
|
|
186
|
+
* For the merchant's logs and their own copy decisions — not shown to the payer
|
|
187
|
+
* by this SDK, which cannot verify anything the link says.
|
|
188
|
+
*/
|
|
189
|
+
export function extractPaymentReturnErrorDescription(params) {
|
|
190
|
+
return nonEmpty(params.error_description);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Everything a return said, gathered once.
|
|
195
|
+
*
|
|
196
|
+
* Carried whole through the flow so a new parameter reaches the caller by being
|
|
197
|
+
* read here, rather than by being threaded through every state factory.
|
|
198
|
+
*/
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* What a return said about the payment.
|
|
202
|
+
*
|
|
203
|
+
* `unknown` is not a failure. The status vocabulary grows, and a payment the
|
|
204
|
+
* service has not finished deciding on must not be reported as one that failed —
|
|
205
|
+
* the merchant's backend is what resolves it.
|
|
206
|
+
*/
|
|
207
|
+
|
|
208
|
+
export function paymentReturnOutcome(params) {
|
|
209
|
+
const status = nonEmpty(params.status);
|
|
210
|
+
|
|
211
|
+
// The status is the authoritative field, so a recognised one settles it — an
|
|
212
|
+
// error key alongside does not override it. In-flight and unrecognised statuses
|
|
213
|
+
// both fall through to `unknown`: one is a payment still being decided, the
|
|
214
|
+
// other a value this version has not been taught, and neither is an outcome.
|
|
215
|
+
if (status !== undefined) {
|
|
216
|
+
if (SETTLED_STATUSES.has(status)) return 'processed';
|
|
217
|
+
if (FAILED_STATUSES.has(status)) return 'rejected';
|
|
218
|
+
return 'unknown';
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// No status at all. A failure key is still a report of failure, so it is read as
|
|
222
|
+
// one — but the success key on its own is not read as a success. Reporting money
|
|
223
|
+
// moved on the strength of one field is the one mistake with no way back.
|
|
224
|
+
return failureErrorKey(params) !== undefined ? 'rejected' : 'unknown';
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Reads a return URI into an outcome and everything it reported. */
|
|
228
|
+
export function readPaymentReturn(uri) {
|
|
229
|
+
const params = paymentReturnParams(uri);
|
|
230
|
+
return {
|
|
231
|
+
outcome: paymentReturnOutcome(params),
|
|
232
|
+
report: {
|
|
233
|
+
...defined('reference', extractPaymentReturnReference(params)),
|
|
234
|
+
...defined('merchantRef', extractPaymentReturnMerchantRef(params)),
|
|
235
|
+
...defined('paymentId', extractPaymentReturnPaymentId(params)),
|
|
236
|
+
...defined('mandateId', extractPaymentReturnMandateId(params)),
|
|
237
|
+
...defined('signature', extractPaymentReturnSignature(params)),
|
|
238
|
+
...defined('errorCode', extractPaymentReturnErrorCode(params)),
|
|
239
|
+
...defined('errorReason', extractPaymentReturnErrorReason(params)),
|
|
240
|
+
...defined('errorDescription', extractPaymentReturnErrorDescription(params))
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function defined(key, value) {
|
|
245
|
+
return value === undefined ? {} : {
|
|
246
|
+
[key]: value
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function nonEmpty(value) {
|
|
250
|
+
return value !== undefined && value.length > 0 ? value : undefined;
|
|
251
|
+
}
|
|
37
252
|
//# sourceMappingURL=payment-return-params.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isPaymentReturnCallbackUri","uri","
|
|
1
|
+
{"version":3,"names":["parseQueryParams","SETTLED_STATUSES","Set","FAILED_STATUSES","IN_FLIGHT_STATUSES","SUCCESS_ERROR_KEY","isKnownStatus","status","has","isPaymentReturnCallbackUri","uri","params","paymentReturnParams","reference","undefined","merchantRef","errorCode","error_code","error","nonEmpty","toString","isPaymentReturnSuccess","extractPaymentReturnReference","extractPaymentReturnMerchantRef","extractPaymentReturnPaymentId","paymentId","extractPaymentReturnMandateId","mandateId","extractPaymentReturnSignature","sig","failureErrorKey","key","extractPaymentReturnErrorCode","extractPaymentReturnErrorReason","reason","extractPaymentReturnErrorDescription","error_description","paymentReturnOutcome","readPaymentReturn","outcome","report","defined","value","length"],"sourceRoot":"../../../../src","sources":["core/models/payment-return-params.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../../src","sources":["core/models/pending-session-record.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { launchBankRedirect as defaultLaunchBankRedirect } from "../../internal/bank-redirect.js";
|
|
4
|
+
import { parseHostedBridgeMessage } from "../../internal/hosted/bridge-message.js";
|
|
5
|
+
import { createLogger } from "../../internal/logger.js";
|
|
6
|
+
import { readPaymentReturn } from "../models/payment-return-params.js";
|
|
7
|
+
import { HostedFlowStates, isTerminalPhase } from "./hosted-flow-state.js";
|
|
8
|
+
const log = createLogger('HostedFlowController');
|
|
9
|
+
|
|
10
|
+
/** Opens a bank authorization URL outside the WebView. */
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* How long the page has to become interactive, measured from when the webview
|
|
14
|
+
* mounts.
|
|
15
|
+
*
|
|
16
|
+
* A page can load and still never speak: its script can fail to fetch, or throw
|
|
17
|
+
* before it posts `spare.ready`. Nothing else would notice, and the payer would
|
|
18
|
+
* hold a blank frame for as long as they were willing to.
|
|
19
|
+
*
|
|
20
|
+
* Measured from the webview rather than from this controller, because a
|
|
21
|
+
* controller is built before the screen is: the sheet's animation and whatever
|
|
22
|
+
* the host waits on before rendering would otherwise be charged against the
|
|
23
|
+
* page's budget, and a page that merely loads slowly would be called unreachable.
|
|
24
|
+
*/
|
|
25
|
+
export const DEFAULT_READY_TIMEOUT_MS = 20_000;
|
|
26
|
+
/**
|
|
27
|
+
* Drives a hosted payment from the messages the page sends and the deep link
|
|
28
|
+
* the OS delivers when the payer comes back.
|
|
29
|
+
*
|
|
30
|
+
* The SDK makes no API calls of its own: the page creates the consent, and the
|
|
31
|
+
* merchant's backend reads the result. So this controller only ever reacts —
|
|
32
|
+
* which is why every transition here is guarded against arriving after the flow
|
|
33
|
+
* has already resolved.
|
|
34
|
+
*/
|
|
35
|
+
export class HostedFlowController {
|
|
36
|
+
listeners = new Set();
|
|
37
|
+
constructor(options) {
|
|
38
|
+
this.reference = options.reference;
|
|
39
|
+
this.bankLauncher = options.bankLauncher ?? (url => defaultLaunchBankRedirect({
|
|
40
|
+
authorizationUrl: url
|
|
41
|
+
}));
|
|
42
|
+
this.readyTimeoutMs = options.readyTimeoutMs ?? DEFAULT_READY_TIMEOUT_MS;
|
|
43
|
+
this.currentState = HostedFlowStates.loading(options.reference);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Records that the webview carrying the page is on screen.
|
|
48
|
+
*
|
|
49
|
+
* Starts the clock the page has to become interactive. Called on mount rather
|
|
50
|
+
* than on load, so a document that never finishes arriving is covered too.
|
|
51
|
+
*/
|
|
52
|
+
reportPageMounted() {
|
|
53
|
+
if (this.currentState.phase !== 'loading') return;
|
|
54
|
+
this.watchForReadiness();
|
|
55
|
+
}
|
|
56
|
+
get state() {
|
|
57
|
+
return this.currentState;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Subscribe to state changes. Returns an unsubscribe function. */
|
|
61
|
+
subscribe(listener) {
|
|
62
|
+
this.listeners.add(listener);
|
|
63
|
+
return () => {
|
|
64
|
+
this.listeners.delete(listener);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Reacts to a message from the hosted page.
|
|
70
|
+
*
|
|
71
|
+
* Resolves to whether the message was understood, so a caller can log what it
|
|
72
|
+
* dropped. An unrecognised message is not a failure: the page keeps working
|
|
73
|
+
* and the payer is unaffected.
|
|
74
|
+
*/
|
|
75
|
+
async handleBridgeMessage(raw) {
|
|
76
|
+
const message = parseHostedBridgeMessage(raw);
|
|
77
|
+
if (!message) {
|
|
78
|
+
log.info('dropped an unrecognised message from the hosted page');
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Only a page still on screen may drive the flow. The page posts on render,
|
|
83
|
+
// and a webview left behind a payer who has moved on can post again: a `ready`
|
|
84
|
+
// accepted while they are at their bank would drag the flow back to `hosted`,
|
|
85
|
+
// and the `openUrl` after it would open a second bank browser for a payment
|
|
86
|
+
// whose first authorization is already under way.
|
|
87
|
+
if (!this.isPagePresented()) {
|
|
88
|
+
log.info(`ignoring a '${message.type}' message from a page no longer on screen`);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
switch (message.type) {
|
|
92
|
+
case 'ready':
|
|
93
|
+
this.stopWatchingForReadiness();
|
|
94
|
+
this.moveTo(HostedFlowStates.hosted(this.reference, this.currentState.attempt));
|
|
95
|
+
break;
|
|
96
|
+
case 'openUrl':
|
|
97
|
+
await this.openBank(message.url);
|
|
98
|
+
break;
|
|
99
|
+
case 'cancel':
|
|
100
|
+
// The page spoke, so it is not unreachable whatever it went on to say.
|
|
101
|
+
this.stopWatchingForReadiness();
|
|
102
|
+
this.moveTo(HostedFlowStates.cancelled(this.reference, this.currentState.attempt));
|
|
103
|
+
break;
|
|
104
|
+
case 'error':
|
|
105
|
+
this.stopWatchingForReadiness();
|
|
106
|
+
this.moveTo(HostedFlowStates.failed({
|
|
107
|
+
reference: this.reference,
|
|
108
|
+
errorCode: message.code,
|
|
109
|
+
attempt: this.currentState.attempt
|
|
110
|
+
}));
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Resolves the flow from the deep link the payer returned through.
|
|
118
|
+
*
|
|
119
|
+
* The outcome is read from the link rather than inferred: it is the only
|
|
120
|
+
* report of what the bank and the payment actually did.
|
|
121
|
+
*/
|
|
122
|
+
/** Whether the page is still the thing on screen and may still be believed. */
|
|
123
|
+
isPagePresented() {
|
|
124
|
+
const phase = this.currentState.phase;
|
|
125
|
+
return phase === 'loading' || phase === 'hosted';
|
|
126
|
+
}
|
|
127
|
+
handleReturn(uri) {
|
|
128
|
+
const {
|
|
129
|
+
outcome,
|
|
130
|
+
report
|
|
131
|
+
} = readPaymentReturn(uri);
|
|
132
|
+
|
|
133
|
+
// A return that names a different payment is not this payment's business. The
|
|
134
|
+
// link is handed over by the OS and any app can send one, and a delayed
|
|
135
|
+
// callback for an earlier payment would otherwise resolve whichever one is
|
|
136
|
+
// open — with the wrong outcome attached to the wrong reference.
|
|
137
|
+
if (report.reference !== undefined && report.reference !== this.reference) {
|
|
138
|
+
log.warning('ignoring a return that names a different payment');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.stopWatchingForReadiness();
|
|
142
|
+
if (outcome === 'processed') {
|
|
143
|
+
this.moveTo(HostedFlowStates.succeeded({
|
|
144
|
+
reference: this.reference,
|
|
145
|
+
attempt: this.currentState.attempt,
|
|
146
|
+
report
|
|
147
|
+
}));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// `unknown` is not a failure. The service has statuses this version has not
|
|
152
|
+
// been taught, and a payment still being decided must not be reported as one
|
|
153
|
+
// that failed — abandoned says "ask your backend", which is the truth.
|
|
154
|
+
if (outcome === 'unknown') {
|
|
155
|
+
log.info('the return did not say what happened — reporting it as unresolved');
|
|
156
|
+
this.moveTo(HostedFlowStates.abandoned(this.reference, this.currentState.attempt));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
this.moveTo(HostedFlowStates.failed({
|
|
160
|
+
reference: this.reference,
|
|
161
|
+
errorCode: report.errorCode ?? 'authorize_failed',
|
|
162
|
+
attempt: this.currentState.attempt,
|
|
163
|
+
report
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Records that the payment page could not be loaded.
|
|
169
|
+
*
|
|
170
|
+
* Only meaningful before the bank is opened. Once the payer is away, a load
|
|
171
|
+
* error is the WebView behind them and says nothing about their payment.
|
|
172
|
+
*
|
|
173
|
+
* Before the page has spoken this does not resolve the flow: nothing has been
|
|
174
|
+
* attempted, so the payer is offered the page again rather than told their
|
|
175
|
+
* payment failed.
|
|
176
|
+
*
|
|
177
|
+
* After it has spoken, it does. By then the payer may have chosen a bank and
|
|
178
|
+
* the page may have created a consent for it, and reloading from the start
|
|
179
|
+
* could create a second one while silently discarding what they entered.
|
|
180
|
+
*/
|
|
181
|
+
failToLoad() {
|
|
182
|
+
const phase = this.currentState.phase;
|
|
183
|
+
if (phase !== 'loading' && phase !== 'hosted') {
|
|
184
|
+
log.info('ignoring a page load error raised behind the payer');
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
this.stopWatchingForReadiness();
|
|
188
|
+
if (phase === 'hosted') {
|
|
189
|
+
log.severe('the page failed after it had already started — not offering a reload');
|
|
190
|
+
this.moveTo(HostedFlowStates.failed({
|
|
191
|
+
reference: this.reference,
|
|
192
|
+
// Not `page_unavailable`: that means the page was never reached and
|
|
193
|
+
// nothing was attempted. This page was working, and the payer may have
|
|
194
|
+
// got as far as a consent before its frame died — a different thing for
|
|
195
|
+
// a merchant to look into, and a different thing to show the payer.
|
|
196
|
+
errorCode: 'page_lost',
|
|
197
|
+
attempt: this.currentState.attempt
|
|
198
|
+
}));
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
this.moveTo(HostedFlowStates.unreachable(this.reference, this.currentState.attempt));
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Asks for the page again after it could not be reached.
|
|
206
|
+
*
|
|
207
|
+
* The attempt is counted so the screen mounts a fresh webview: reusing the one
|
|
208
|
+
* that failed would show the payer the same dead frame.
|
|
209
|
+
*/
|
|
210
|
+
retry() {
|
|
211
|
+
if (this.currentState.phase !== 'unreachable') {
|
|
212
|
+
log.info('ignoring a retry for a payment that is not waiting on the page');
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const attempt = this.currentState.attempt + 1;
|
|
216
|
+
log.info(`asking for the payment page again (attempt ${attempt})`);
|
|
217
|
+
// The fresh webview reports itself mounted, which restarts the clock.
|
|
218
|
+
this.moveTo(HostedFlowStates.loading(this.reference, attempt));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Records that the payer gave up on a page that could not be reached.
|
|
223
|
+
*
|
|
224
|
+
* Reported as a failure rather than abandonment: the payer did not leave a
|
|
225
|
+
* payment in progress, the SDK never managed to present one.
|
|
226
|
+
*/
|
|
227
|
+
giveUp() {
|
|
228
|
+
if (this.currentState.phase !== 'unreachable') {
|
|
229
|
+
log.info('ignoring a give-up for a payment that is not waiting on the page');
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
this.stopWatchingForReadiness();
|
|
233
|
+
this.moveTo(HostedFlowStates.failed({
|
|
234
|
+
reference: this.reference,
|
|
235
|
+
errorCode: 'page_unavailable',
|
|
236
|
+
attempt: this.currentState.attempt
|
|
237
|
+
}));
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Records that the payer left before the flow resolved.
|
|
242
|
+
*
|
|
243
|
+
* A payment already at the bank may still complete after this, so it is
|
|
244
|
+
* reported as abandoned rather than failed: the merchant's backend, not the
|
|
245
|
+
* app, is what knows.
|
|
246
|
+
*/
|
|
247
|
+
abandon() {
|
|
248
|
+
this.stopWatchingForReadiness();
|
|
249
|
+
if (this.currentState.phase === 'unreachable') {
|
|
250
|
+
// Nothing was ever presented, so there is no payment that might still
|
|
251
|
+
// complete at the bank — which is what abandonment promises the merchant.
|
|
252
|
+
this.moveTo(HostedFlowStates.failed({
|
|
253
|
+
reference: this.reference,
|
|
254
|
+
errorCode: 'page_unavailable',
|
|
255
|
+
attempt: this.currentState.attempt
|
|
256
|
+
}));
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
this.moveTo(HostedFlowStates.abandoned(this.reference, this.currentState.attempt));
|
|
260
|
+
}
|
|
261
|
+
dispose() {
|
|
262
|
+
this.stopWatchingForReadiness();
|
|
263
|
+
this.listeners.clear();
|
|
264
|
+
}
|
|
265
|
+
watchForReadiness() {
|
|
266
|
+
this.stopWatchingForReadiness();
|
|
267
|
+
this.readyTimer = setTimeout(() => {
|
|
268
|
+
this.readyTimer = undefined;
|
|
269
|
+
if (this.currentState.phase !== 'loading') return;
|
|
270
|
+
log.severe('the payment page never became interactive — treating it as unreachable');
|
|
271
|
+
this.moveTo(HostedFlowStates.unreachable(this.reference, this.currentState.attempt));
|
|
272
|
+
}, this.readyTimeoutMs);
|
|
273
|
+
}
|
|
274
|
+
stopWatchingForReadiness() {
|
|
275
|
+
if (this.readyTimer === undefined) return;
|
|
276
|
+
clearTimeout(this.readyTimer);
|
|
277
|
+
this.readyTimer = undefined;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Opens the bank and waits for the payer to be sent back.
|
|
282
|
+
*
|
|
283
|
+
* The URL is opened exactly once, and never once the flow has resolved. The
|
|
284
|
+
* page posts on render, so a rebuild can repeat the message; opening a second
|
|
285
|
+
* browser — or one for a payment the payer has already left — would leave them
|
|
286
|
+
* authorizing in a window whose return nobody is waiting for.
|
|
287
|
+
*/
|
|
288
|
+
async openBank(url) {
|
|
289
|
+
if (isTerminalPhase(this.currentState.phase)) {
|
|
290
|
+
log.info('not opening the bank for a payment that already resolved');
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
if (this.currentState.phase === 'redirecting' || this.currentState.phase === 'awaitingCallback') {
|
|
294
|
+
log.info('bank already opened for this payment — ignoring');
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
this.stopWatchingForReadiness();
|
|
298
|
+
this.moveTo(HostedFlowStates.redirecting(this.reference, this.currentState.attempt));
|
|
299
|
+
try {
|
|
300
|
+
await this.bankLauncher(url);
|
|
301
|
+
this.moveTo(HostedFlowStates.awaitingCallback(this.reference, this.currentState.attempt));
|
|
302
|
+
} catch {
|
|
303
|
+
// The platform's message is not logged: a native launcher's error can carry
|
|
304
|
+
// the whole authorize URL back, `request_uri` and state included.
|
|
305
|
+
log.severe('could not open the bank');
|
|
306
|
+
this.moveTo(HostedFlowStates.failed({
|
|
307
|
+
reference: this.reference,
|
|
308
|
+
errorCode: 'redirect_failed',
|
|
309
|
+
attempt: this.currentState.attempt
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
moveTo(next) {
|
|
314
|
+
if (isTerminalPhase(this.currentState.phase)) {
|
|
315
|
+
log.info('ignoring transition after the flow already resolved');
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
this.currentState = next;
|
|
319
|
+
for (const listener of this.listeners) {
|
|
320
|
+
try {
|
|
321
|
+
listener();
|
|
322
|
+
} catch {
|
|
323
|
+
/* a listener that throws must not stop the others from hearing */
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=hosted-flow-controller.js.map
|