@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
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { parseUrlParts } from '../url-parts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Messages the hosted payment page sends to this SDK.
|
|
5
|
+
*
|
|
6
|
+
* The contract is one-way. The page never waits on a reply, so a message this
|
|
7
|
+
* version does not recognise is dropped rather than treated as a failure — the
|
|
8
|
+
* page continues, and a newer page stays usable by an older app.
|
|
9
|
+
*
|
|
10
|
+
* The page posts to `window.ReactNativeWebView.postMessage` as a JSON string,
|
|
11
|
+
* which arrives here as `event.nativeEvent.data`.
|
|
12
|
+
*/
|
|
13
|
+
export type HostedBridgeMessage = HostedReady | HostedOpenUrl | HostedCancel | HostedError;
|
|
14
|
+
|
|
15
|
+
/** The payable page is interactive. */
|
|
16
|
+
export interface HostedReady {
|
|
17
|
+
readonly type: 'ready';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* A consent exists and the bank must now be opened outside the WebView.
|
|
22
|
+
*
|
|
23
|
+
* Banks commonly refuse to serve their authorization pages inside an embedded
|
|
24
|
+
* browser, and the address bar is what lets a payer tell a real bank page from
|
|
25
|
+
* a convincing copy.
|
|
26
|
+
*/
|
|
27
|
+
export interface HostedOpenUrl {
|
|
28
|
+
readonly type: 'openUrl';
|
|
29
|
+
readonly url: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** The payer cancelled, and the request is already rejected server-side. */
|
|
33
|
+
export interface HostedCancel {
|
|
34
|
+
readonly type: 'cancel';
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** The flow cannot continue. [code] is the key the page itself renders. */
|
|
38
|
+
export interface HostedError {
|
|
39
|
+
readonly type: 'error';
|
|
40
|
+
readonly code: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Parses a message posted by the hosted page.
|
|
45
|
+
*
|
|
46
|
+
* Returns null for anything unrecognised. The message crosses a boundary the
|
|
47
|
+
* SDK does not control, so nothing here trusts its shape — the WebView message
|
|
48
|
+
* channel is shared with every script on the page.
|
|
49
|
+
*/
|
|
50
|
+
export function parseHostedBridgeMessage(raw: unknown): HostedBridgeMessage | null {
|
|
51
|
+
const message = asRecord(raw);
|
|
52
|
+
if (!message) return null;
|
|
53
|
+
|
|
54
|
+
const type = message.type;
|
|
55
|
+
if (typeof type !== 'string') return null;
|
|
56
|
+
|
|
57
|
+
switch (type) {
|
|
58
|
+
case 'spare.ready':
|
|
59
|
+
return { type: 'ready' };
|
|
60
|
+
case 'spare.open_url': {
|
|
61
|
+
const url = message.url;
|
|
62
|
+
if (typeof url !== 'string' || !isHttpsUrl(url)) return null;
|
|
63
|
+
return { type: 'openUrl', url };
|
|
64
|
+
}
|
|
65
|
+
case 'spare.cancel':
|
|
66
|
+
return { type: 'cancel' };
|
|
67
|
+
case 'spare.error': {
|
|
68
|
+
const code = message.code;
|
|
69
|
+
if (typeof code !== 'string' || code.trim().length === 0) return null;
|
|
70
|
+
return { type: 'error', code };
|
|
71
|
+
}
|
|
72
|
+
default:
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Reads the message out of whatever the WebView handed over.
|
|
79
|
+
*
|
|
80
|
+
* The page stringifies its payload, but a plain object is accepted too so the
|
|
81
|
+
* transport is not the thing that decides whether a valid message is understood.
|
|
82
|
+
*/
|
|
83
|
+
function asRecord(raw: unknown): Record<string, unknown> | null {
|
|
84
|
+
if (typeof raw === 'string') {
|
|
85
|
+
try {
|
|
86
|
+
return asRecord(JSON.parse(raw) as unknown);
|
|
87
|
+
} catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) return null;
|
|
92
|
+
return raw as Record<string, unknown>;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Whether [url] is an absolute https URL.
|
|
97
|
+
*
|
|
98
|
+
* Required before handing a URL to the OS browser: the page is trusted to name
|
|
99
|
+
* a bank, not to name a scheme that could reach something else on the device.
|
|
100
|
+
* Parsed rather than pattern-matched so `https:/\/evil` and friends cannot pass
|
|
101
|
+
* for an absolute URL.
|
|
102
|
+
*/
|
|
103
|
+
function isHttpsUrl(url: string): boolean {
|
|
104
|
+
const parts = parseUrlParts(url);
|
|
105
|
+
return parts !== null && parts.scheme === 'https' && parts.host.length > 0;
|
|
106
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { isSameOrigin } from '../url-parts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Origin channel this SDK identifies as to the hosted page.
|
|
5
|
+
*
|
|
6
|
+
* The same value must be recorded on the payment request by the merchant's
|
|
7
|
+
* backend, because the bank redirect that completes a payment carries no query
|
|
8
|
+
* string of ours and the return path is decided from the stored row.
|
|
9
|
+
*/
|
|
10
|
+
export const HOSTED_ORIGIN_CHANNEL = 'sdk_react_native';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Builds the hosted payment page URL for a payment request reference.
|
|
14
|
+
*
|
|
15
|
+
* The reference is the only credential the page needs; everything else is
|
|
16
|
+
* resolved server-side from the row it names.
|
|
17
|
+
*/
|
|
18
|
+
export function buildHostedPaymentUrl(args: { baseUrl: string; reference: string }): string {
|
|
19
|
+
const base = args.baseUrl.trim().replace(/\/+$/, '');
|
|
20
|
+
const reference = encodeURIComponent(args.reference.trim());
|
|
21
|
+
return `${base}/link/payment/${reference}?channel=${HOSTED_ORIGIN_CHANNEL}`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Whether [url] belongs to the hosted origin derived from [baseUrl].
|
|
26
|
+
*
|
|
27
|
+
* The WebView loads only the hosted origin. Bank authentication deliberately
|
|
28
|
+
* happens outside it, so anything else navigating in-frame is refused rather
|
|
29
|
+
* than followed.
|
|
30
|
+
*/
|
|
31
|
+
export function isHostedOriginUrl(args: { baseUrl: string; url: string }): boolean {
|
|
32
|
+
return isSameOrigin(args.baseUrl, args.url);
|
|
33
|
+
}
|
package/src/internal/index.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { collectTelemetry } from './telemetry-collector';
|
|
2
1
|
export { launchBankRedirect, type BankRedirectArgs } from './bank-redirect';
|
|
3
2
|
export { SecureStorePendingSessionStore } from './secure-store-pending-session-store';
|
|
4
3
|
export { useSpareLinkDeepLinks } from './deep-link-listener';
|
|
@@ -1,18 +1,72 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Redacts the query of a bank-return URI before it is logged.
|
|
3
|
+
*
|
|
4
|
+
* Every value goes except the few that describe the outcome rather than identify
|
|
5
|
+
* anyone — see {@link KEPT_KEYS}. Redaction is a denylist by default rather than
|
|
6
|
+
* an allowlist of names to remove: an earlier version named the two keys to
|
|
7
|
+
* redact, so anything else the return ever carried was logged in full, and one of
|
|
8
|
+
* the names it knew (`exchange_code`) is not even in the contract any more.
|
|
9
|
+
*
|
|
10
|
+
* What is worth keeping in a log is the shape of the URI — its scheme, its path,
|
|
11
|
+
* which parameters were present — plus enough to explain the outcome.
|
|
12
|
+
*
|
|
13
|
+
* It also cannot use the global `URL`. React Native's is a stub whose
|
|
14
|
+
* `searchParams` returns a fresh empty instance, so `has()` was always false and
|
|
15
|
+
* this function returned the URI untouched on a device while redacting correctly
|
|
16
|
+
* under Jest, which runs on Node.
|
|
17
|
+
*
|
|
18
|
+
* The query is split here rather than read through `parseQueryParams`, because
|
|
19
|
+
* that decodes values and keeps only the first of a repeated key — fine for
|
|
20
|
+
* reading an outcome, wrong for reproducing a URI whose shape is the point.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const REDACTED = '[REDACTED]';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Parameters whose values are kept, because they say what happened rather than to
|
|
27
|
+
* whom.
|
|
28
|
+
*
|
|
29
|
+
* Redacting these made the log useless for the one question it gets asked. A
|
|
30
|
+
* return that resolves as unresolved does so because of its `status`, and a log
|
|
31
|
+
* reading `status=[REDACTED]` cannot tell anyone which value was not recognised.
|
|
32
|
+
*
|
|
33
|
+
* None of these identifies a payer, a payment or a request: `status` is one of a
|
|
34
|
+
* fixed vocabulary, and `errorCode` and `error` are keys from a fixed list. The
|
|
35
|
+
* identifiers — `reference`, `merchantRef`, `paymentId` — and the signature stay
|
|
36
|
+
* redacted, as does `error_description`, which is prose and could name a person.
|
|
37
|
+
*/
|
|
38
|
+
const KEPT_KEYS: ReadonlySet<string> = new Set(['status', 'errorCode', 'error']);
|
|
2
39
|
|
|
3
|
-
/** Redacts sensitive query params before logging bank-return URIs. */
|
|
4
40
|
export function redactPaymentReturnUri(uri: string): string {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
41
|
+
const queryStart = uri.indexOf('?');
|
|
42
|
+
const fragmentStart = uri.indexOf('#');
|
|
43
|
+
|
|
44
|
+
// No query and no fragment: nothing here carries a value.
|
|
45
|
+
if (queryStart === -1 && fragmentStart === -1) return uri;
|
|
46
|
+
|
|
47
|
+
const queryEnd = fragmentStart !== -1 && fragmentStart > queryStart ? fragmentStart : uri.length;
|
|
48
|
+
|
|
49
|
+
const beforeQuery = queryStart === -1 ? uri.slice(0, fragmentStart) : uri.slice(0, queryStart);
|
|
50
|
+
const query = queryStart === -1 ? '' : uri.slice(queryStart + 1, queryEnd);
|
|
51
|
+
|
|
52
|
+
// A fragment is dropped whole. Nothing in this SDK reads one, so its shape is
|
|
53
|
+
// not worth keeping, and a return that ever carried a token in one — as OAuth
|
|
54
|
+
// implicit flows do — must not put it in a log.
|
|
55
|
+
const hadFragment = fragmentStart !== -1;
|
|
56
|
+
|
|
57
|
+
const redactedQuery = query
|
|
58
|
+
.split('&')
|
|
59
|
+
.filter((pair) => pair.length > 0)
|
|
60
|
+
.map((pair) => {
|
|
61
|
+
const eq = pair.indexOf('=');
|
|
62
|
+
const key = eq === -1 ? pair : pair.slice(0, eq);
|
|
63
|
+
if (KEPT_KEYS.has(key)) return pair;
|
|
64
|
+
return `${key}=${REDACTED}`;
|
|
65
|
+
})
|
|
66
|
+
.join('&');
|
|
67
|
+
|
|
68
|
+
const rebuiltQuery = redactedQuery.length > 0 ? `?${redactedQuery}` : '';
|
|
69
|
+
const rebuiltFragment = hadFragment ? `#${REDACTED}` : '';
|
|
70
|
+
|
|
71
|
+
return `${beforeQuery}${rebuiltQuery}${rebuiltFragment}`;
|
|
18
72
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Production `PendingSessionStore` backed by expo-secure-store. Persists
|
|
3
|
-
* single in-flight payment
|
|
2
|
+
* Production `PendingSessionStore` backed by expo-secure-store. Persists the
|
|
3
|
+
* reference of a single in-flight payment so a cold start knows which payment
|
|
4
|
+
* was under way.
|
|
4
5
|
*/
|
|
5
6
|
|
|
6
7
|
import type { PendingSessionRecord } from '../core/models';
|
|
@@ -9,14 +10,24 @@ import { createLogger } from './logger';
|
|
|
9
10
|
|
|
10
11
|
const log = createLogger('SecureStorePendingSessionStore');
|
|
11
12
|
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
const KEY_REFERENCE = 'spare_link_reference';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Keys earlier versions wrote, cleared alongside our own.
|
|
17
|
+
*
|
|
18
|
+
* An app upgrading mid-payment would otherwise keep a token and session it can
|
|
19
|
+
* never resolve — the endpoints they addressed are gone — and the secure store
|
|
20
|
+
* outlives the version that wrote to it.
|
|
21
|
+
*/
|
|
22
|
+
const RETIRED_KEYS = [
|
|
23
|
+
'spare_link_token',
|
|
24
|
+
'spare_link_session_id',
|
|
25
|
+
'spare_link_bank_id',
|
|
26
|
+
'spare_link_auth_url',
|
|
27
|
+
'spare_link_consent_at',
|
|
28
|
+
'spare_link_recovery_attempts',
|
|
29
|
+
'spare_link_merchant_ref',
|
|
30
|
+
] as const;
|
|
20
31
|
|
|
21
32
|
export interface SecureStoreModule {
|
|
22
33
|
getItemAsync(key: string): Promise<string | null>;
|
|
@@ -71,18 +82,7 @@ export class SecureStorePendingSessionStore implements PendingSessionStore {
|
|
|
71
82
|
save(record: PendingSessionRecord): Promise<void> {
|
|
72
83
|
return this.enqueueWrite(async () => {
|
|
73
84
|
const s = await this.module;
|
|
74
|
-
await
|
|
75
|
-
s.setItemAsync(KEYS.sessionId, record.sessionId),
|
|
76
|
-
s.setItemAsync(KEYS.bankId, record.selectedBankId),
|
|
77
|
-
s.setItemAsync(KEYS.authUrl, record.authorizationUrl),
|
|
78
|
-
record.consentAt !== undefined
|
|
79
|
-
? s.setItemAsync(KEYS.consentAt, String(record.consentAt))
|
|
80
|
-
: s.deleteItemAsync(KEYS.consentAt),
|
|
81
|
-
s.setItemAsync(KEYS.recoveryAttempts, String(record.recoveryAttempts)),
|
|
82
|
-
record.merchantRef
|
|
83
|
-
? s.setItemAsync(KEYS.merchantRef, record.merchantRef)
|
|
84
|
-
: s.deleteItemAsync(KEYS.merchantRef),
|
|
85
|
-
]);
|
|
85
|
+
await s.setItemAsync(KEY_REFERENCE, record.reference);
|
|
86
86
|
});
|
|
87
87
|
}
|
|
88
88
|
|
|
@@ -90,41 +90,20 @@ export class SecureStorePendingSessionStore implements PendingSessionStore {
|
|
|
90
90
|
// Wait for any pending writes to settle so we read a consistent snapshot.
|
|
91
91
|
await this.writeQueue.catch(() => undefined);
|
|
92
92
|
const s = await this.module;
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
s.getItemAsync(KEYS.authUrl),
|
|
97
|
-
s.getItemAsync(KEYS.consentAt),
|
|
98
|
-
s.getItemAsync(KEYS.recoveryAttempts),
|
|
99
|
-
s.getItemAsync(KEYS.merchantRef),
|
|
100
|
-
]);
|
|
101
|
-
if (!sessionId || !bankId || !authUrl) {
|
|
102
|
-
log.fine('load: no pending session found');
|
|
93
|
+
const reference = await s.getItemAsync(KEY_REFERENCE);
|
|
94
|
+
if (!reference) {
|
|
95
|
+
log.fine('load: no pending payment found');
|
|
103
96
|
return null;
|
|
104
97
|
}
|
|
105
|
-
|
|
106
|
-
const recoveryAttempts = attemptsRaw ? Number(attemptsRaw) : 0;
|
|
107
|
-
const record: PendingSessionRecord = {
|
|
108
|
-
sessionId,
|
|
109
|
-
selectedBankId: bankId,
|
|
110
|
-
authorizationUrl: authUrl,
|
|
111
|
-
recoveryAttempts: Number.isFinite(recoveryAttempts) ? recoveryAttempts : 0,
|
|
112
|
-
};
|
|
113
|
-
if (consentAt !== undefined && Number.isFinite(consentAt)) record.consentAt = consentAt;
|
|
114
|
-
if (merchantRef) record.merchantRef = merchantRef;
|
|
115
|
-
return record;
|
|
98
|
+
return { reference };
|
|
116
99
|
}
|
|
117
100
|
|
|
118
101
|
clear(): Promise<void> {
|
|
119
102
|
return this.enqueueWrite(async () => {
|
|
120
103
|
const s = await this.module;
|
|
121
104
|
await Promise.all([
|
|
122
|
-
s.deleteItemAsync(
|
|
123
|
-
s.deleteItemAsync(
|
|
124
|
-
s.deleteItemAsync(KEYS.authUrl),
|
|
125
|
-
s.deleteItemAsync(KEYS.consentAt),
|
|
126
|
-
s.deleteItemAsync(KEYS.recoveryAttempts),
|
|
127
|
-
s.deleteItemAsync(KEYS.merchantRef),
|
|
105
|
+
s.deleteItemAsync(KEY_REFERENCE),
|
|
106
|
+
...RETIRED_KEYS.map((key) => s.deleteItemAsync(key)),
|
|
128
107
|
]);
|
|
129
108
|
});
|
|
130
109
|
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal URL parsing that does not go through the global `URL`.
|
|
3
|
+
*
|
|
4
|
+
* React Native ships a stub: every component accessor — `protocol`, `hostname`,
|
|
5
|
+
* `port`, `origin`, `search`, `pathname` — throws "not implemented", and
|
|
6
|
+
* `searchParams` returns a fresh empty instance that never reads the URL it was
|
|
7
|
+
* constructed from (`react-native/Libraries/Blob/URL.js`, installed globally by
|
|
8
|
+
* `setUpXHR.js`). Code written against the standard therefore behaves correctly
|
|
9
|
+
* under Jest, which runs on Node's real `URL`, and silently reads nothing on a
|
|
10
|
+
* device.
|
|
11
|
+
*
|
|
12
|
+
* The SDK parses what it needs itself rather than asking the host app to install
|
|
13
|
+
* a polyfill whose presence it cannot verify — an origin check that quietly
|
|
14
|
+
* stops comparing hosts is worse than one that was never written.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** The parts of a URL this SDK compares origins on. */
|
|
18
|
+
export interface UrlParts {
|
|
19
|
+
/** Lower-cased, without the trailing colon. */
|
|
20
|
+
scheme: string;
|
|
21
|
+
/** Lower-cased host, without userinfo. IPv6 hosts keep their brackets. */
|
|
22
|
+
host: string;
|
|
23
|
+
/** The explicit port, or the scheme's default where it has one. */
|
|
24
|
+
port: number | undefined;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Scheme plus authority. Anything without an authority has no origin to compare. */
|
|
28
|
+
const SCHEME_AND_AUTHORITY = /^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^/?#]*)/;
|
|
29
|
+
|
|
30
|
+
const DEFAULT_PORTS: Readonly<Record<string, number>> = { http: 80, https: 443 };
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Splits [url] into the parts an origin comparison needs, or null if it has no
|
|
34
|
+
* authority to compare.
|
|
35
|
+
*/
|
|
36
|
+
export function parseUrlParts(url: string): UrlParts | null {
|
|
37
|
+
const match = SCHEME_AND_AUTHORITY.exec(url.trim());
|
|
38
|
+
if (!match?.[1] || match[2] === undefined) return null;
|
|
39
|
+
|
|
40
|
+
const scheme = match[1].toLowerCase();
|
|
41
|
+
|
|
42
|
+
// Everything up to the last `@` is userinfo, not host. `https://api.real.example@evil.example`
|
|
43
|
+
// is a request to evil.example, and reading the left half would accept it as the real one.
|
|
44
|
+
const authority = match[2].slice(match[2].lastIndexOf('@') + 1);
|
|
45
|
+
|
|
46
|
+
const hostAndPort = splitHostAndPort(authority);
|
|
47
|
+
if (!hostAndPort) return null;
|
|
48
|
+
|
|
49
|
+
const { host, portText } = hostAndPort;
|
|
50
|
+
if (host.length === 0) return null;
|
|
51
|
+
|
|
52
|
+
// An empty port (`https://host:/x`) means the scheme's default, as does no port.
|
|
53
|
+
if (portText === undefined || portText.length === 0) {
|
|
54
|
+
return { scheme, host: host.toLowerCase(), port: DEFAULT_PORTS[scheme] };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!/^\d+$/.test(portText)) return null;
|
|
58
|
+
const port = Number.parseInt(portText, 10);
|
|
59
|
+
if (port > 65535) return null;
|
|
60
|
+
|
|
61
|
+
return { scheme, host: host.toLowerCase(), port };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Whether two URLs share a scheme, host and port.
|
|
66
|
+
*
|
|
67
|
+
* Both must carry an authority, so a relative path never matches an absolute
|
|
68
|
+
* URL: `/link/payment/x` names no origin and must not be read as naming this one.
|
|
69
|
+
*/
|
|
70
|
+
export function isSameOrigin(a: string, b: string): boolean {
|
|
71
|
+
const left = parseUrlParts(a);
|
|
72
|
+
const right = parseUrlParts(b);
|
|
73
|
+
if (!left || !right) return false;
|
|
74
|
+
return left.scheme === right.scheme && left.host === right.host && left.port === right.port;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Reads the query string of [url] into a plain object.
|
|
79
|
+
*
|
|
80
|
+
* The first occurrence of a repeated key wins, matching `URLSearchParams.get`.
|
|
81
|
+
* A value the SDK cannot decode is kept in its raw form rather than dropping the
|
|
82
|
+
* parameter: callers compare against known literals, and a mangled value should
|
|
83
|
+
* fail that comparison rather than read as absent.
|
|
84
|
+
*/
|
|
85
|
+
export function parseQueryParams(url: string): Record<string, string> {
|
|
86
|
+
const params: Record<string, string> = {};
|
|
87
|
+
|
|
88
|
+
const start = url.indexOf('?');
|
|
89
|
+
if (start === -1) return params;
|
|
90
|
+
|
|
91
|
+
const fragment = url.indexOf('#', start);
|
|
92
|
+
const query = fragment === -1 ? url.slice(start + 1) : url.slice(start + 1, fragment);
|
|
93
|
+
|
|
94
|
+
for (const pair of query.split('&')) {
|
|
95
|
+
if (pair.length === 0) continue;
|
|
96
|
+
const eq = pair.indexOf('=');
|
|
97
|
+
const rawKey = eq === -1 ? pair : pair.slice(0, eq);
|
|
98
|
+
const rawValue = eq === -1 ? '' : pair.slice(eq + 1);
|
|
99
|
+
|
|
100
|
+
const key = decodeFormComponent(rawKey);
|
|
101
|
+
if (key.length === 0 || Object.hasOwn(params, key)) continue;
|
|
102
|
+
params[key] = decodeFormComponent(rawValue);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return params;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function splitHostAndPort(
|
|
109
|
+
authority: string,
|
|
110
|
+
): { host: string; portText: string | undefined } | null {
|
|
111
|
+
// An IPv6 literal carries colons of its own, so its brackets close the host.
|
|
112
|
+
if (authority.startsWith('[')) {
|
|
113
|
+
const close = authority.indexOf(']');
|
|
114
|
+
if (close === -1) return null;
|
|
115
|
+
const host = authority.slice(0, close + 1);
|
|
116
|
+
const rest = authority.slice(close + 1);
|
|
117
|
+
if (rest.length === 0) return { host, portText: undefined };
|
|
118
|
+
if (!rest.startsWith(':')) return null;
|
|
119
|
+
return { host, portText: rest.slice(1) };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const colon = authority.indexOf(':');
|
|
123
|
+
if (colon === -1) return { host: authority, portText: undefined };
|
|
124
|
+
return { host: authority.slice(0, colon), portText: authority.slice(colon + 1) };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function decodeFormComponent(value: string): string {
|
|
128
|
+
const plusesAsSpaces = value.replace(/\+/g, ' ');
|
|
129
|
+
try {
|
|
130
|
+
return decodeURIComponent(plusesAsSpaces);
|
|
131
|
+
} catch {
|
|
132
|
+
return plusesAsSpaces;
|
|
133
|
+
}
|
|
134
|
+
}
|
package/src/public/index.ts
CHANGED
|
@@ -2,11 +2,9 @@ export {
|
|
|
2
2
|
type PaymentEnvironment,
|
|
3
3
|
type SpareApiTenant,
|
|
4
4
|
type SpareLinkConfig,
|
|
5
|
-
type SpareLinkResumeConfig,
|
|
6
5
|
defaultBaseUrlFor,
|
|
7
6
|
tenantCountryCode,
|
|
8
7
|
resolvedBaseUrl,
|
|
9
|
-
resolvedResumeBaseUrl,
|
|
10
8
|
assertValidConfig,
|
|
11
9
|
} from './spare-link-config';
|
|
12
10
|
|
|
@@ -14,8 +12,7 @@ export {
|
|
|
14
12
|
type SpareLinkEvent,
|
|
15
13
|
type SpareLinkEventType,
|
|
16
14
|
type SpareLinkInitialized,
|
|
17
|
-
type
|
|
18
|
-
type SpareLinkConsentStarted,
|
|
15
|
+
type SpareLinkPageReady,
|
|
19
16
|
type SpareLinkRedirectToBank,
|
|
20
17
|
type SpareLinkBankCallbackReceived,
|
|
21
18
|
type SpareLinkSucceeded,
|
|
@@ -40,36 +37,17 @@ export {
|
|
|
40
37
|
paymentAbandoned,
|
|
41
38
|
} from './payment-result';
|
|
42
39
|
|
|
43
|
-
export type {
|
|
44
|
-
SpareLinkCallbacks,
|
|
45
|
-
SpareLinkSuccessCallback,
|
|
46
|
-
SpareLinkExitCallback,
|
|
47
|
-
SpareLinkEventCallback,
|
|
48
|
-
} from './spare-link-callbacks';
|
|
49
|
-
|
|
50
40
|
export type {
|
|
51
41
|
RecoveryResult,
|
|
52
42
|
NoRecoveryReason,
|
|
53
43
|
NoRecoveryNeeded,
|
|
54
44
|
SessionRecovered,
|
|
55
|
-
RecoveryAwaitingUser,
|
|
56
|
-
} from './recovery-result';
|
|
57
|
-
export {
|
|
58
|
-
isSessionRecovered,
|
|
59
|
-
isNoRecoveryNeeded,
|
|
60
|
-
isRecoveryAwaitingUser,
|
|
61
45
|
} from './recovery-result';
|
|
46
|
+
export { isSessionRecovered, isNoRecoveryNeeded } from './recovery-result';
|
|
62
47
|
|
|
63
48
|
export { SpareLinkSession } from './spare-link-session';
|
|
64
49
|
export { SpareLink, type SpareLinkOptions } from './spare-link-instance';
|
|
65
50
|
|
|
66
|
-
export {
|
|
67
|
-
kMaxRecoveryAttempts,
|
|
68
|
-
DEFAULT_REQUEST_TIMEOUT_MS,
|
|
69
|
-
DEFAULT_AWAITING_CALLBACK_TIMEOUT_MS,
|
|
70
|
-
DEFAULT_AWAITING_CALLBACK_POLL_MS,
|
|
71
|
-
} from './constants';
|
|
72
|
-
|
|
73
51
|
export {
|
|
74
52
|
configureSpareLinkLogging,
|
|
75
53
|
createLogger,
|
|
@@ -1,28 +1,61 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Terminal outcome of a payment flow — narrow on the `status` field.
|
|
3
|
+
*
|
|
4
|
+
* Every result here is read off a deep link, which is interceptable by design
|
|
5
|
+
* and names no bank identifiers. It reports what happened rather than attesting
|
|
6
|
+
* to it: confirm with your backend via `GET /payment-requests/{reference}`
|
|
7
|
+
* before acting on one.
|
|
3
8
|
*/
|
|
4
9
|
export type PaymentStatus = 'success' | 'cancelled' | 'failed' | 'abandoned';
|
|
5
10
|
|
|
6
11
|
interface PaymentResultBase {
|
|
7
12
|
status: PaymentStatus;
|
|
8
|
-
/** The
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
/** The payment request this flow was paying, and what your backend reads the
|
|
14
|
+
* authoritative result by. */
|
|
15
|
+
reference: string;
|
|
16
|
+
/** The merchant's own reference for the attempt, when the return named one. */
|
|
17
|
+
merchantRef?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Spare's identifier for the payment, present on a reported success.
|
|
20
|
+
*
|
|
21
|
+
* Distinct from `reference`, which names the request. This is what an order
|
|
22
|
+
* records.
|
|
23
|
+
*/
|
|
24
|
+
paymentId?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Spare's identifier for a mandate, present when the flow created one.
|
|
27
|
+
*
|
|
28
|
+
* A return names a payment or a mandate, never both. Read whichever is set
|
|
29
|
+
* rather than assuming which the flow produced.
|
|
30
|
+
*/
|
|
31
|
+
mandateId?: string;
|
|
32
|
+
/**
|
|
33
|
+
* The return's signature: an ES256 JWS whose payload is the return URL, every
|
|
34
|
+
* parameter included.
|
|
35
|
+
*
|
|
36
|
+
* The only part of the return that cannot be forged. Verify it against Spare's
|
|
37
|
+
* public key on your backend before acting on the outcome — the SDK holds no
|
|
38
|
+
* keys and passes it through unchecked.
|
|
39
|
+
*/
|
|
40
|
+
signature?: string;
|
|
41
|
+
/**
|
|
42
|
+
* The machine-readable reason a payment did not complete, e.g. `user_cancelled`.
|
|
43
|
+
*
|
|
44
|
+
* Alongside `errorCode`, which is often generic where this is not.
|
|
45
|
+
*/
|
|
46
|
+
errorReason?: string;
|
|
12
47
|
message?: string;
|
|
13
48
|
errorCode?: string;
|
|
14
49
|
resolvedAtMs?: number;
|
|
15
50
|
}
|
|
16
51
|
|
|
17
|
-
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
52
|
+
/**
|
|
53
|
+
* The return reported a completed payment.
|
|
54
|
+
*
|
|
55
|
+
* Treat this as a prompt to confirm with your backend, not as settlement.
|
|
56
|
+
*/
|
|
20
57
|
export interface PaymentSuccess extends PaymentResultBase {
|
|
21
58
|
status: 'success';
|
|
22
|
-
exchangeCode?: string;
|
|
23
|
-
merchantRef?: string;
|
|
24
|
-
/** API payment type string (e.g. `FixedPeriodicSchedule`), when available. Mirrors Flutter's `paymentType`. */
|
|
25
|
-
paymentType?: string;
|
|
26
59
|
}
|
|
27
60
|
|
|
28
61
|
export interface PaymentCancelled extends PaymentResultBase {
|
|
@@ -35,7 +68,12 @@ export interface PaymentFailed extends PaymentResultBase {
|
|
|
35
68
|
errorCode: string;
|
|
36
69
|
}
|
|
37
70
|
|
|
38
|
-
/**
|
|
71
|
+
/**
|
|
72
|
+
* The payer left before the flow resolved either way.
|
|
73
|
+
*
|
|
74
|
+
* A payment already at the bank may still complete after this, so it is not a
|
|
75
|
+
* failure — only your backend knows how it ended.
|
|
76
|
+
*/
|
|
39
77
|
export interface PaymentAbandoned extends PaymentResultBase {
|
|
40
78
|
status: 'abandoned';
|
|
41
79
|
}
|