@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/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @spare-technologies/spare-link
|
|
2
2
|
|
|
3
|
-
React Native SDK for [Spare Link](https://tryspare.com) —
|
|
3
|
+
React Native SDK for [Spare Link](https://tryspare.com) — open-banking payments for iOS and Android.
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
6
|
bun add @spare-technologies/spare-link
|
|
@@ -8,11 +8,19 @@ bun add @spare-technologies/spare-link
|
|
|
8
8
|
npm i @spare-technologies/spare-link
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
Full integration guide: [`docs/getting-started.md`](https://github.com/spare-technologies/link-rn/blob/main/docs/getting-started.md).
|
|
12
|
+
|
|
13
|
+
## What this SDK does
|
|
14
|
+
|
|
15
|
+
Your backend creates a payment request and gives the app the reference it returns. The SDK presents the payment flow for that reference, opens the payer's bank in a real browser when a consent exists, and reports the outcome carried by the return deep link.
|
|
16
|
+
|
|
17
|
+
The SDK makes no API calls and holds no credentials. It reports only what the payment flow and the deep link tell it, which is why your backend reads the final result.
|
|
18
|
+
|
|
19
|
+
The bank opens in a browser rather than inside the app for two reasons: banks commonly refuse to authorize a payment in an embedded view, and the address bar lets the payer check they are on a real bank page.
|
|
20
|
+
|
|
11
21
|
## Quickstart
|
|
12
22
|
|
|
13
|
-
|
|
14
|
-
instance, mount one `SpareLinkHost` near your app root, and pass that instance to every
|
|
15
|
-
screen that starts a payment.
|
|
23
|
+
Create one `SpareLink` instance, mount one `SpareLinkHost` near your app root, and pass the instance to every screen that starts a payment.
|
|
16
24
|
|
|
17
25
|
```tsx
|
|
18
26
|
import { SpareLink, SpareLinkHost, useSpareLinkDeepLinks } from '@spare-technologies/spare-link';
|
|
@@ -31,18 +39,69 @@ function App() {
|
|
|
31
39
|
</SpareLinkHost>
|
|
32
40
|
);
|
|
33
41
|
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Your backend creates the payment request with `channel: 'sdk_react_native'` and the return URLs your app is registered for. It then hands the app the reference. That reference is all the SDK needs.
|
|
34
45
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const session = await spareLink.start({
|
|
46
|
+
```tsx
|
|
47
|
+
async function pay(spareLink: SpareLink, reference: string) {
|
|
48
|
+
const session = await spareLink.start({ reference });
|
|
38
49
|
const result = await session.result;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
50
|
+
|
|
51
|
+
// Confirm with your backend before you act on this. See "Confirming the result".
|
|
52
|
+
console.log(result.status, result.reference);
|
|
43
53
|
}
|
|
44
54
|
```
|
|
45
55
|
|
|
56
|
+
## Confirming the result
|
|
57
|
+
|
|
58
|
+
Every result this SDK reports is read from a deep link. A deep link is not proof: the OS hands it over, and any installed app can register the same custom scheme.
|
|
59
|
+
|
|
60
|
+
**The deep link an app receives is not signed, deliberately.** Any installed app can claim a custom scheme, so a signature on a deep link would be a proof handed to whoever intercepted it. There is therefore nothing on it to verify, and reading the record is the only way to establish what happened:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
GET /payment-requests/{reference}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Call it from your backend with its own credentials before you fulfil anything.
|
|
67
|
+
|
|
68
|
+
The deep link does carry `paymentId` on a single payment's success, or `mandateId` on a mandate's — record whichever is set. `signature` is populated only on Spare's https redirect, so expect it to be `undefined` in an app; when it is present it is an ES256 JWS over the return URL, which the SDK passes through unverified.
|
|
69
|
+
|
|
70
|
+
## Payment statuses
|
|
71
|
+
|
|
72
|
+
Each status belongs to one of three groups. Only the first group is routed to your `successRedirectUrl`; every other status is routed to your `failureRedirectUrl`, so both URLs must be registered and both must open your app.
|
|
73
|
+
|
|
74
|
+
| Group | Statuses | `result.status` |
|
|
75
|
+
| --- | --- | --- |
|
|
76
|
+
| Settled | `Processed`, `Scheduled` | `'success'` |
|
|
77
|
+
| Terminal failure | `Rejected`, `Errored` | `'failed'` |
|
|
78
|
+
| Still in flight | `New`, `Consumed`, `ConsentRaised` | `'abandoned'` |
|
|
79
|
+
|
|
80
|
+
`Scheduled` is a success: the bank has accepted a payment dated in the future, and the money has not moved yet. If your fulfilment requires settled funds, check the status you read back from your backend rather than the `'success'` result alone.
|
|
81
|
+
|
|
82
|
+
The statuses in the third group are not outcomes — a request with one of them is still payable, so it should not appear on a return. If one does, the SDK reports `'abandoned'` and your backend resolves it. The SDK does the same for a status it does not recognise, because reporting an unknown status as a success would tell a payer their money moved when it may not have.
|
|
83
|
+
|
|
84
|
+
`status` is always sent but **can be empty**, so `errorCode` is the reliable discriminator: it is present on every failure and on no success. Its value today is always `SP500`; use it for your own copy rather than to determine the outcome. An empty `status` alongside an `errorCode` is a failure, and the SDK reads it as one.
|
|
85
|
+
|
|
86
|
+
Older builds of the service sent `status=success` / `status=failure` and the code as `error_code`. The SDK still reads those, so an environment that has not been updated does not misreport.
|
|
87
|
+
|
|
88
|
+
## Peer dependencies
|
|
89
|
+
|
|
90
|
+
Install these with Expo, so the versions match your Expo SDK:
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
npx expo install react-native-webview react-native-safe-area-context react-native-screens \
|
|
94
|
+
expo-web-browser expo-secure-store expo-font expo-linear-gradient @expo/vector-icons
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
npm and bun will install these automatically, and the declared ranges are pinned to the Expo 52 module line, so an automatic resolve lands on a compatible version. `expo install` is still the safer route: it reads your installed Expo SDK and picks the exact version that ships with it.
|
|
98
|
+
|
|
99
|
+
The ranges are deliberately narrow. This release supports **Expo 52 only**, so an app on a newer Expo SDK gets a peer-dependency conflict at install time rather than a native build failure or a crash on device.
|
|
100
|
+
|
|
101
|
+
`expo-web-browser` opens the bank, `expo-secure-store` stores the pending payment for recovery, and the rest render the payment flow. `react-native-svg` is an optional peer, loaded only if present; without it the SDK shows a plain activity indicator.
|
|
102
|
+
|
|
103
|
+
The SDK requires no runtime permissions.
|
|
104
|
+
|
|
46
105
|
## Expo plugin
|
|
47
106
|
|
|
48
107
|
Add to `app.config.ts`:
|
|
@@ -52,122 +111,101 @@ plugins: [
|
|
|
52
111
|
[
|
|
53
112
|
'@spare-technologies/spare-link/expo-plugin',
|
|
54
113
|
{
|
|
55
|
-
|
|
56
|
-
merchantScheme: 'sparemerchantrn',
|
|
114
|
+
merchantScheme: 'myapp',
|
|
57
115
|
merchantHost: 'callback',
|
|
58
116
|
},
|
|
59
117
|
],
|
|
60
118
|
]
|
|
61
119
|
```
|
|
62
120
|
|
|
63
|
-
The plugin
|
|
121
|
+
The plugin registers only the deep link the payer returns through:
|
|
122
|
+
|
|
123
|
+
- **iOS**: a `CFBundleURLSchemes` entry for your app scheme.
|
|
124
|
+
- **Android**: an intent-filter for `myapp://callback`.
|
|
64
125
|
|
|
65
|
-
|
|
66
|
-
|
|
126
|
+
Use the same scheme and host your backend sets in `successRedirectUrl` and `failureRedirectUrl`. Rebuild your dev client after adding the plugin, because it changes native configuration.
|
|
127
|
+
|
|
128
|
+
Earlier versions injected `ACCESS_FINE_LOCATION` and an iOS location usage description for device telemetry. The SDK no longer collects it, and the plugin requests no permissions.
|
|
129
|
+
|
|
130
|
+
## Environments
|
|
131
|
+
|
|
132
|
+
| Environment | Host |
|
|
133
|
+
| --- | --- |
|
|
134
|
+
| `sandbox` | `https://api.sandbox.tryspare.ae` |
|
|
135
|
+
| `production` | `https://api.tryspare.ae` |
|
|
136
|
+
|
|
137
|
+
Pass `baseUrl` to override the host. The payment flow currently serves **UAE only**; constructing with another tenant throws instead of showing the payer another country's flow.
|
|
67
138
|
|
|
68
139
|
## Deep-link handling
|
|
69
140
|
|
|
70
|
-
`
|
|
141
|
+
`useSpareLinkDeepLinks(spareLink)` wires `Linking.addEventListener('url', …)` and `Linking.getInitialURL()` to `spareLink.handleRedirect(url)`. Call `handleRedirect` yourself if you have your own router — it returns `true` when the URI belonged to a payment, so you can leave your own routing untouched for anything else.
|
|
142
|
+
|
|
143
|
+
A return that arrives before there is a flow to give it to is held, not discarded, and picked up by `start()` or `resumeIfNeeded()`.
|
|
71
144
|
|
|
72
145
|
## Cold-start recovery
|
|
73
146
|
|
|
74
|
-
Construct the instance with a
|
|
147
|
+
Construct the instance with a store, and call `resumeIfNeeded()` when the app becomes active:
|
|
75
148
|
|
|
76
149
|
```tsx
|
|
77
|
-
import { SecureStorePendingSessionStore, SpareLink
|
|
78
|
-
|
|
79
|
-
const store = new SecureStorePendingSessionStore();
|
|
80
|
-
const spareLink = new SpareLink({ environment: 'sandbox', tenant: 'uae', pendingSessionStore: store });
|
|
150
|
+
import { SecureStorePendingSessionStore, SpareLink } from '@spare-technologies/spare-link';
|
|
81
151
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
152
|
+
const spareLink = new SpareLink({
|
|
153
|
+
environment: 'sandbox',
|
|
154
|
+
tenant: 'uae',
|
|
155
|
+
pendingSessionStore: new SecureStorePendingSessionStore(),
|
|
156
|
+
});
|
|
85
157
|
```
|
|
86
158
|
|
|
87
159
|
```ts
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
AppState.addEventListener('change', (state) => {
|
|
91
|
-
if (state !== 'active') return;
|
|
92
|
-
void spareLink.resumeIfNeeded().then((recovery) => {
|
|
93
|
-
if (recovery.kind === 'recovered') {
|
|
94
|
-
// recovery.result is the terminal PaymentResult
|
|
95
|
-
}
|
|
96
|
-
// kind === 'awaitingUser' means the SDK opened its own recovery UI —
|
|
97
|
-
// the terminal outcome arrives later via `spareLink.events`.
|
|
98
|
-
});
|
|
99
|
-
});
|
|
160
|
+
const recovery = await spareLink.resumeIfNeeded();
|
|
100
161
|
```
|
|
101
162
|
|
|
102
|
-
`
|
|
103
|
-
|
|
104
|
-
- `{ kind: '
|
|
105
|
-
- `{ kind: 'awaitingUser', linkToken }` — the session is still non-terminal and the SDK opened its recovery UI (mounted by `SpareLinkHost`); the terminal outcome arrives later via `spareLink.events` / the `succeeded`/`failed`/`cancelled`/`abandoned` events.
|
|
106
|
-
- `{ kind: 'none', reason }` — nothing to recover (`noPendingSession` | `flowAlreadyActive` | `persistenceUnavailable`).
|
|
107
|
-
|
|
108
|
-
After `kMaxRecoveryAttempts` (3) non-terminal attempts the SDK resolves `PaymentFailed('recovery_exhausted')` and clears the record.
|
|
109
|
-
|
|
110
|
-
## Testing with the harness
|
|
163
|
+
- `{ kind: 'recovered', result }` — the return arrived before there was a flow to give it to, and the outcome was read from it.
|
|
164
|
+
- `{ kind: 'none', reason: 'outcomeUnknown', reference }` — a payment was under way and no return arrived. **It may have completed.** The SDK holds no credentials and cannot ask; your backend resolves it using the reference.
|
|
165
|
+
- `{ kind: 'none', reason: 'noPendingSession' | 'flowAlreadyActive' | 'persistenceUnavailable' }` — nothing to recover.
|
|
111
166
|
|
|
112
|
-
|
|
167
|
+
Without a `pendingSessionStore` you always get `persistenceUnavailable`, and a payment interrupted by the app closing is never reported.
|
|
113
168
|
|
|
114
|
-
|
|
115
|
-
import { setupMockLinkApi } from '@spare-technologies/link-test-harness';
|
|
116
|
-
|
|
117
|
-
const server = setupMockLinkApi({ scenario: 'happyPath' });
|
|
118
|
-
beforeAll(() => server.start());
|
|
119
|
-
afterAll(() => server.stop());
|
|
120
|
-
afterEach(() => server.reset());
|
|
121
|
-
```
|
|
169
|
+
## When the payment flow cannot be opened
|
|
122
170
|
|
|
123
|
-
|
|
171
|
+
If the flow fails to load, or loads and never becomes usable, the payer is told that the service is unreachable and that no payment has been taken, and is offered a retry. Nothing has been attempted at that point. If the payer gives up, the flow resolves as `PaymentFailed` with `page_unavailable`.
|
|
124
172
|
|
|
125
|
-
|
|
173
|
+
A failure after the flow was working reports `page_lost` instead.
|
|
126
174
|
|
|
127
175
|
## API reference
|
|
128
176
|
|
|
129
177
|
### `new SpareLink(options)`
|
|
130
178
|
|
|
131
|
-
|
|
132
|
-
| --- | --- | --- |
|
|
133
|
-
| `environment` | `'sandbox' \| 'production'` | Default base URL is derived from this. |
|
|
134
|
-
| `tenant` | `'ksa' \| 'uae' \| 'bah'` | Sent as the `X-Tenant` header. |
|
|
135
|
-
| `baseUrl` | `string?` | Override the base URL (dev only). |
|
|
136
|
-
| `fetch` | `typeof fetch?` | Inject a custom fetch for cert pinning. |
|
|
137
|
-
| `requestTimeoutMs` | `number?` | Default `15_000`. |
|
|
138
|
-
| `pendingSessionStore` | `PendingSessionStore?` | Enables cold-start recovery, e.g. `SecureStorePendingSessionStore`. |
|
|
179
|
+
`{ environment, tenant, baseUrl?, pendingSessionStore? }`. Validates its config and throws on a `baseUrl` that is not a URL, or a tenant the payment flow cannot serve.
|
|
139
180
|
|
|
140
|
-
### `spareLink.start({
|
|
181
|
+
### `spareLink.start({ reference })`
|
|
141
182
|
|
|
142
|
-
|
|
183
|
+
Presents the payment flow and resolves to a `SpareLinkSession`. `await session.result` for the terminal outcome. A second call during an active payment resolves as `'failed'` with `concurrent_start`.
|
|
143
184
|
|
|
144
185
|
### `PaymentResult` discriminated union
|
|
145
186
|
|
|
146
187
|
```ts
|
|
147
188
|
type PaymentResult =
|
|
148
|
-
| PaymentSuccess // { status: 'success',
|
|
149
|
-
| PaymentCancelled // { status: 'cancelled',
|
|
150
|
-
| PaymentFailed // { status: 'failed',
|
|
151
|
-
| PaymentAbandoned // { status: 'abandoned',
|
|
189
|
+
| PaymentSuccess // { status: 'success', reference, paymentId?, mandateId?, signature?, merchantRef?, ... }
|
|
190
|
+
| PaymentCancelled // { status: 'cancelled', reference, ... }
|
|
191
|
+
| PaymentFailed // { status: 'failed', reference, errorCode, errorReason?, ... }
|
|
192
|
+
| PaymentAbandoned // { status: 'abandoned', reference, ... }
|
|
152
193
|
```
|
|
153
194
|
|
|
154
|
-
|
|
195
|
+
`abandoned` means the flow ended without an outcome. A payment already at the bank may still complete, so it is not reported as a failure.
|
|
155
196
|
|
|
156
|
-
|
|
197
|
+
### `SpareLinkEvent`
|
|
157
198
|
|
|
158
|
-
|
|
159
|
-
type SpareLinkEventType =
|
|
160
|
-
| 'initialized' | 'sessionLoaded' | 'consentStarted'
|
|
161
|
-
| 'redirectToBank' | 'bankCallbackReceived'
|
|
162
|
-
| 'succeeded' | 'failed' | 'cancelled' | 'abandoned';
|
|
163
|
-
```
|
|
199
|
+
`initialized`, `pageReady`, `redirectToBank`, `bankCallbackReceived`, then one of `succeeded` / `failed` / `cancelled` / `abandoned`. Analytics only — never required to drive the flow.
|
|
164
200
|
|
|
165
201
|
## Supported versions
|
|
166
202
|
|
|
167
203
|
- **Expo SDK** ≥ 52 (tested with 52.0.x)
|
|
168
|
-
- **React Native** ≥ 0.76
|
|
204
|
+
- **React Native** ≥ 0.76.9
|
|
169
205
|
- **React** ≥ 18.3
|
|
170
206
|
|
|
207
|
+
Requires a custom dev client or a production build. The SDK uses native modules and does not run in Expo Go.
|
|
208
|
+
|
|
171
209
|
## License
|
|
172
210
|
|
|
173
|
-
MIT — see [LICENSE](
|
|
211
|
+
MIT — see [LICENSE](./LICENSE).
|
|
@@ -4,39 +4,264 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.extractPaymentReturnErrorCode = extractPaymentReturnErrorCode;
|
|
7
|
+
exports.extractPaymentReturnErrorDescription = extractPaymentReturnErrorDescription;
|
|
8
|
+
exports.extractPaymentReturnErrorReason = extractPaymentReturnErrorReason;
|
|
9
|
+
exports.extractPaymentReturnMandateId = extractPaymentReturnMandateId;
|
|
10
|
+
exports.extractPaymentReturnMerchantRef = extractPaymentReturnMerchantRef;
|
|
11
|
+
exports.extractPaymentReturnPaymentId = extractPaymentReturnPaymentId;
|
|
12
|
+
exports.extractPaymentReturnReference = extractPaymentReturnReference;
|
|
13
|
+
exports.extractPaymentReturnSignature = extractPaymentReturnSignature;
|
|
7
14
|
exports.isPaymentReturnCallbackUri = isPaymentReturnCallbackUri;
|
|
15
|
+
exports.isPaymentReturnSuccess = isPaymentReturnSuccess;
|
|
16
|
+
exports.paymentReturnOutcome = paymentReturnOutcome;
|
|
17
|
+
exports.paymentReturnParams = paymentReturnParams;
|
|
18
|
+
exports.readPaymentReturn = readPaymentReturn;
|
|
19
|
+
var _urlParts = require("../../internal/url-parts.js");
|
|
8
20
|
/**
|
|
9
|
-
* Query
|
|
21
|
+
* Query parameters on the deep link that returns a payer to the app.
|
|
10
22
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
23
|
+
* Both channels are told the same thing in the same words. A success carries
|
|
24
|
+
* `reference`, `status` and either `paymentId` or `mandateId`. A failure carries
|
|
25
|
+
* `reference`, `errorCode` and `status`. `merchantRef` is on both when the request
|
|
26
|
+
* recorded one, and `status` is always present but may be empty.
|
|
27
|
+
*
|
|
28
|
+
* `errorCode` is what tells the two apart: it is on every failure and on no
|
|
29
|
+
* success, so an outcome can be read without recognising a status.
|
|
30
|
+
*
|
|
31
|
+
* **A deep link to an app is not signed.** `sig` is added on the browser channel
|
|
32
|
+
* only, deliberately: any installed app can claim a custom scheme, so a signature
|
|
33
|
+
* on a deep link would be a proof handed to whoever intercepted it. When it is
|
|
34
|
+
* present it is an ES256 JWS over the return URL, and it is carried through
|
|
35
|
+
* unverified — checking it needs Spare's public key, which the SDK does not hold.
|
|
36
|
+
*
|
|
37
|
+
* The query is read by {@link parseQueryParams} rather than through `URL`,
|
|
38
|
+
* because React Native's `URL.searchParams` never parses the URL it was given.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Statuses that mean the payment is done and will not change.
|
|
43
|
+
*
|
|
44
|
+
* `Scheduled` is a success: a future-dated payment the bank has accepted has
|
|
45
|
+
* succeeded, the money simply has not moved yet. A caller that needs settled funds
|
|
46
|
+
* specifically must read the status back from its own backend — this SDK reports
|
|
47
|
+
* every settled status as `processed`, because all of them are terminal and all of
|
|
48
|
+
* them resolve to the merchant's success URL.
|
|
49
|
+
*
|
|
50
|
+
* `success` is the word an app used to be sent instead of the request's own status.
|
|
51
|
+
* The service now sends one vocabulary to both channels, so it should no longer
|
|
52
|
+
* arrive — it is still read because an environment running the earlier build would
|
|
53
|
+
* otherwise report a completed payment as unresolved.
|
|
54
|
+
*/
|
|
55
|
+
const SETTLED_STATUSES = new Set(['Processed', 'Scheduled', 'success']);
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Statuses that mean the payment will not happen. `failure` is legacy, for the same
|
|
59
|
+
* reason `success` is in {@link SETTLED_STATUSES}.
|
|
13
60
|
*/
|
|
61
|
+
const FAILED_STATUSES = new Set(['Rejected', 'Errored', 'failure']);
|
|
14
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Statuses that mean the request is still payable — not an outcome at all.
|
|
65
|
+
*
|
|
66
|
+
* A return should never carry one: the payer has come back, so the request has
|
|
67
|
+
* moved on. One arriving here means the outcome is still being decided, which is
|
|
68
|
+
* `unknown` rather than either answer.
|
|
69
|
+
*/
|
|
70
|
+
const IN_FLIGHT_STATUSES = new Set(['New', 'Consumed', 'ConsentRaised']);
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The one error key that reports a success rather than a failure.
|
|
74
|
+
*
|
|
75
|
+
* It arrives in `errorCode` like every other key, so anything that treats the
|
|
76
|
+
* presence of a key as a failure reports a completed payment as a failed one.
|
|
77
|
+
*/
|
|
78
|
+
const SUCCESS_ERROR_KEY = 'request_processed';
|
|
79
|
+
|
|
80
|
+
/** Every status this version has been taught, whatever it means. */
|
|
81
|
+
function isKnownStatus(status) {
|
|
82
|
+
return SETTLED_STATUSES.has(status) || FAILED_STATUSES.has(status) || IN_FLIGHT_STATUSES.has(status);
|
|
83
|
+
}
|
|
15
84
|
function isPaymentReturnCallbackUri(uri) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
if (
|
|
24
|
-
if (params.has('error_code')) return true;
|
|
25
|
-
if (params.has('error')) return true;
|
|
26
|
-
if (params.get('status') === 'failure') return true;
|
|
85
|
+
const params = paymentReturnParams(uri);
|
|
86
|
+
if (params.reference !== undefined) return true;
|
|
87
|
+
if (params.merchantRef !== undefined) return true;
|
|
88
|
+
if (params.errorCode !== undefined) return true;
|
|
89
|
+
if (params.error_code !== undefined) return true;
|
|
90
|
+
if (params.error !== undefined) return true;
|
|
91
|
+
const status = nonEmpty(params.status);
|
|
92
|
+
if (status !== undefined && isKnownStatus(status)) return true;
|
|
27
93
|
return false;
|
|
28
94
|
}
|
|
29
95
|
|
|
96
|
+
/** Reads the query of a return URI into the shape the extractors below take. */
|
|
97
|
+
function paymentReturnParams(uri) {
|
|
98
|
+
return (0, _urlParts.parseQueryParams)(typeof uri === 'string' ? uri : uri.toString());
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Whether the return URI reports a completed payment.
|
|
103
|
+
*
|
|
104
|
+
* Only a known settled status counts. Absent, in-flight or a status this version
|
|
105
|
+
* has not been taught is read as not-a-success: a payer returned without one has
|
|
106
|
+
* not been told their payment succeeded, and neither should the app.
|
|
107
|
+
*/
|
|
108
|
+
function isPaymentReturnSuccess(params) {
|
|
109
|
+
const status = nonEmpty(params.status);
|
|
110
|
+
return status !== undefined && SETTLED_STATUSES.has(status);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** The payment request reference, if the return URI named one. */
|
|
114
|
+
function extractPaymentReturnReference(params) {
|
|
115
|
+
return nonEmpty(params.reference);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** The merchant's own reference for the attempt, if present. */
|
|
119
|
+
function extractPaymentReturnMerchantRef(params) {
|
|
120
|
+
return nonEmpty(params.merchantRef);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Spare's identifier for the payment itself, present on a success.
|
|
125
|
+
*
|
|
126
|
+
* Distinct from the reference, which names the *request*. This is what a merchant
|
|
127
|
+
* records against the order.
|
|
128
|
+
*/
|
|
129
|
+
function extractPaymentReturnPaymentId(params) {
|
|
130
|
+
return nonEmpty(params.paymentId);
|
|
131
|
+
}
|
|
132
|
+
|
|
30
133
|
/**
|
|
31
|
-
*
|
|
134
|
+
* Spare's identifier for a mandate, present on a mandate's success.
|
|
32
135
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
136
|
+
* A return carries this or {@link extractPaymentReturnPaymentId}, never both: a
|
|
137
|
+
* single payment names a payment, every mandate type names a mandate. Read
|
|
138
|
+
* whichever is present rather than assuming which one the flow produced.
|
|
139
|
+
*/
|
|
140
|
+
function extractPaymentReturnMandateId(params) {
|
|
141
|
+
return nonEmpty(params.mandateId);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* The signature over this return, if it carried one.
|
|
146
|
+
*
|
|
147
|
+
* An ES256 JWS whose payload is the return URL. Handed to the caller unverified —
|
|
148
|
+
* checking it needs Spare's public key, which the SDK does not hold.
|
|
149
|
+
*/
|
|
150
|
+
function extractPaymentReturnSignature(params) {
|
|
151
|
+
return nonEmpty(params.sig);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* The failure key from a payment return URI, if it reported one.
|
|
156
|
+
*
|
|
157
|
+
* `errorCode` is the name both channels now use, and it is what tells the two
|
|
158
|
+
* outcomes apart: the service puts it on every failure and on no success, so a
|
|
159
|
+
* reader never has to recognise a status to know the payment did not happen.
|
|
160
|
+
*
|
|
161
|
+
* `error_code` and `error` are legacy — an earlier build sent the code under the
|
|
162
|
+
* snake_case name, and older returns carried a separate machine-readable reason.
|
|
163
|
+
* Both are still read so an environment running that build is not misread.
|
|
164
|
+
*
|
|
165
|
+
* {@link SUCCESS_ERROR_KEY} is excluded, because a success reports itself through
|
|
166
|
+
* the same field and must not come back out of here looking like a reason the
|
|
167
|
+
* payment failed.
|
|
168
|
+
*/
|
|
169
|
+
function failureErrorKey(params) {
|
|
170
|
+
const key = nonEmpty(params.errorCode) ?? nonEmpty(params.error_code) ?? nonEmpty(params.error);
|
|
171
|
+
return key === SUCCESS_ERROR_KEY ? undefined : key;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* The failure code from a payment return URI.
|
|
176
|
+
*
|
|
177
|
+
* A return that says only that it failed, naming no key, still yields something a
|
|
178
|
+
* merchant can branch on.
|
|
35
179
|
*/
|
|
36
180
|
function extractPaymentReturnErrorCode(params) {
|
|
37
|
-
const
|
|
38
|
-
if (
|
|
39
|
-
|
|
181
|
+
const key = failureErrorKey(params);
|
|
182
|
+
if (key !== undefined) return key;
|
|
183
|
+
const status = nonEmpty(params.status);
|
|
184
|
+
if (status !== undefined && FAILED_STATUSES.has(status)) return 'authorize_failed';
|
|
40
185
|
return undefined;
|
|
41
186
|
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* The machine-readable reason a payment did not complete, e.g. `user_cancelled`.
|
|
190
|
+
*
|
|
191
|
+
* Kept alongside the code because the code is often generic where this is not.
|
|
192
|
+
*/
|
|
193
|
+
function extractPaymentReturnErrorReason(params) {
|
|
194
|
+
const reason = nonEmpty(params.error);
|
|
195
|
+
return reason === SUCCESS_ERROR_KEY ? undefined : reason;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* The human-readable failure text, if the return carried one.
|
|
200
|
+
*
|
|
201
|
+
* For the merchant's logs and their own copy decisions — not shown to the payer
|
|
202
|
+
* by this SDK, which cannot verify anything the link says.
|
|
203
|
+
*/
|
|
204
|
+
function extractPaymentReturnErrorDescription(params) {
|
|
205
|
+
return nonEmpty(params.error_description);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Everything a return said, gathered once.
|
|
210
|
+
*
|
|
211
|
+
* Carried whole through the flow so a new parameter reaches the caller by being
|
|
212
|
+
* read here, rather than by being threaded through every state factory.
|
|
213
|
+
*/
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* What a return said about the payment.
|
|
217
|
+
*
|
|
218
|
+
* `unknown` is not a failure. The status vocabulary grows, and a payment the
|
|
219
|
+
* service has not finished deciding on must not be reported as one that failed —
|
|
220
|
+
* the merchant's backend is what resolves it.
|
|
221
|
+
*/
|
|
222
|
+
|
|
223
|
+
function paymentReturnOutcome(params) {
|
|
224
|
+
const status = nonEmpty(params.status);
|
|
225
|
+
|
|
226
|
+
// The status is the authoritative field, so a recognised one settles it — an
|
|
227
|
+
// error key alongside does not override it. In-flight and unrecognised statuses
|
|
228
|
+
// both fall through to `unknown`: one is a payment still being decided, the
|
|
229
|
+
// other a value this version has not been taught, and neither is an outcome.
|
|
230
|
+
if (status !== undefined) {
|
|
231
|
+
if (SETTLED_STATUSES.has(status)) return 'processed';
|
|
232
|
+
if (FAILED_STATUSES.has(status)) return 'rejected';
|
|
233
|
+
return 'unknown';
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// No status at all. A failure key is still a report of failure, so it is read as
|
|
237
|
+
// one — but the success key on its own is not read as a success. Reporting money
|
|
238
|
+
// moved on the strength of one field is the one mistake with no way back.
|
|
239
|
+
return failureErrorKey(params) !== undefined ? 'rejected' : 'unknown';
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** Reads a return URI into an outcome and everything it reported. */
|
|
243
|
+
function readPaymentReturn(uri) {
|
|
244
|
+
const params = paymentReturnParams(uri);
|
|
245
|
+
return {
|
|
246
|
+
outcome: paymentReturnOutcome(params),
|
|
247
|
+
report: {
|
|
248
|
+
...defined('reference', extractPaymentReturnReference(params)),
|
|
249
|
+
...defined('merchantRef', extractPaymentReturnMerchantRef(params)),
|
|
250
|
+
...defined('paymentId', extractPaymentReturnPaymentId(params)),
|
|
251
|
+
...defined('mandateId', extractPaymentReturnMandateId(params)),
|
|
252
|
+
...defined('signature', extractPaymentReturnSignature(params)),
|
|
253
|
+
...defined('errorCode', extractPaymentReturnErrorCode(params)),
|
|
254
|
+
...defined('errorReason', extractPaymentReturnErrorReason(params)),
|
|
255
|
+
...defined('errorDescription', extractPaymentReturnErrorDescription(params))
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
function defined(key, value) {
|
|
260
|
+
return value === undefined ? {} : {
|
|
261
|
+
[key]: value
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
function nonEmpty(value) {
|
|
265
|
+
return value !== undefined && value.length > 0 ? value : undefined;
|
|
266
|
+
}
|
|
42
267
|
//# sourceMappingURL=payment-return-params.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isPaymentReturnCallbackUri","uri","
|
|
1
|
+
{"version":3,"names":["_urlParts","require","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","parseQueryParams","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":[]}
|