@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
|
@@ -2,40 +2,35 @@ import type { PaymentResult } from './payment-result';
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Why {@link SpareLink.resumeIfNeeded} did not recover a terminal session.
|
|
5
|
-
* Mirrors Flutter's `NoRecoveryReason`.
|
|
6
|
-
*/
|
|
7
|
-
export type NoRecoveryReason = 'noPendingSession' | 'flowAlreadyActive' | 'persistenceUnavailable';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Outcome of {@link SpareLink.resumeIfNeeded}.
|
|
11
5
|
*
|
|
12
|
-
*
|
|
6
|
+
* `outcomeUnknown` is the one that carries weight: a payment was pending and no
|
|
7
|
+
* return arrived, so **it may have completed**. The SDK holds no credentials and
|
|
8
|
+
* has nothing to ask with — the reference is handed back for your backend to
|
|
9
|
+
* resolve.
|
|
13
10
|
*/
|
|
14
|
-
export type
|
|
11
|
+
export type NoRecoveryReason =
|
|
12
|
+
| 'noPendingSession'
|
|
13
|
+
| 'flowAlreadyActive'
|
|
14
|
+
| 'persistenceUnavailable'
|
|
15
|
+
| 'outcomeUnknown';
|
|
15
16
|
|
|
16
|
-
/**
|
|
17
|
+
/** Outcome of {@link SpareLink.resumeIfNeeded}. */
|
|
18
|
+
export type RecoveryResult = NoRecoveryNeeded | SessionRecovered;
|
|
19
|
+
|
|
20
|
+
/** No pending payment was resolved to a terminal outcome. */
|
|
17
21
|
export interface NoRecoveryNeeded {
|
|
18
22
|
readonly kind: 'none';
|
|
19
23
|
readonly reason: NoRecoveryReason;
|
|
24
|
+
/** The pending payment's reference, when `reason` is `outcomeUnknown`. */
|
|
25
|
+
readonly reference?: string;
|
|
20
26
|
}
|
|
21
27
|
|
|
22
|
-
/** A pending
|
|
28
|
+
/** A pending payment was resolved to a terminal {@link PaymentResult}. */
|
|
23
29
|
export interface SessionRecovered {
|
|
24
30
|
readonly kind: 'recovered';
|
|
25
31
|
readonly result: PaymentResult;
|
|
26
32
|
}
|
|
27
33
|
|
|
28
|
-
/**
|
|
29
|
-
* A pending session is non-terminal and the SDK opened its recovery UI —
|
|
30
|
-
* the integrator should treat this as in-progress, not "nothing happened".
|
|
31
|
-
* The terminal outcome arrives later via `SpareLink.events` /
|
|
32
|
-
* `spareLink.emitTerminal`, not as a second `resumeIfNeeded` resolution.
|
|
33
|
-
*/
|
|
34
|
-
export interface RecoveryAwaitingUser {
|
|
35
|
-
readonly kind: 'awaitingUser';
|
|
36
|
-
readonly linkToken: string;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
34
|
export function isSessionRecovered(r: RecoveryResult): r is SessionRecovered {
|
|
40
35
|
return r.kind === 'recovered';
|
|
41
36
|
}
|
|
@@ -43,7 +38,3 @@ export function isSessionRecovered(r: RecoveryResult): r is SessionRecovered {
|
|
|
43
38
|
export function isNoRecoveryNeeded(r: RecoveryResult): r is NoRecoveryNeeded {
|
|
44
39
|
return r.kind === 'none';
|
|
45
40
|
}
|
|
46
|
-
|
|
47
|
-
export function isRecoveryAwaitingUser(r: RecoveryResult): r is RecoveryAwaitingUser {
|
|
48
|
-
return r.kind === 'awaitingUser';
|
|
49
|
-
}
|
|
@@ -1,24 +1,48 @@
|
|
|
1
|
+
import { Platform } from 'react-native';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Deployment environment for the Spare Link API, which is also where the hosted
|
|
5
|
+
* payment page is served from.
|
|
6
|
+
*/
|
|
7
|
+
export type PaymentEnvironment = 'local' | 'dev' | 'sandbox' | 'production';
|
|
8
|
+
|
|
9
|
+
/** Default port an Encore app serves on. */
|
|
10
|
+
const LOCAL_PORT = 4000;
|
|
11
|
+
|
|
1
12
|
/**
|
|
2
|
-
*
|
|
13
|
+
* A Spare API running on the developer's own machine.
|
|
14
|
+
*
|
|
15
|
+
* The host differs by platform because an emulator's `localhost` is the emulator,
|
|
16
|
+
* not the machine hosting it. A **physical device** reaches neither, so pass
|
|
17
|
+
* `baseUrl` with your machine's address on the local network instead.
|
|
3
18
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
19
|
+
* Serves over plain HTTP, which both platforms block by default. See the
|
|
20
|
+
* integration notes for the debug-only exceptions that allow it.
|
|
6
21
|
*/
|
|
7
|
-
|
|
22
|
+
function localBaseUrl(): string {
|
|
23
|
+
return Platform.OS === 'android'
|
|
24
|
+
? `http://10.0.2.2:${LOCAL_PORT}`
|
|
25
|
+
: `http://localhost:${LOCAL_PORT}`;
|
|
26
|
+
}
|
|
8
27
|
|
|
9
|
-
|
|
28
|
+
/**
|
|
29
|
+
* `dev` is Spare's own integration environment, not one an integrator would ship
|
|
30
|
+
* against. Unlike the others its host names a single tenant, so it serves UAE alone.
|
|
31
|
+
*/
|
|
32
|
+
const DEFAULT_BASE_URLS: Readonly<Record<Exclude<PaymentEnvironment, 'local'>, string>> = {
|
|
33
|
+
dev: 'https://api-dev-uae.tryspare.ae',
|
|
10
34
|
sandbox: 'https://api.sandbox.tryspare.ae',
|
|
11
35
|
production: 'https://api.tryspare.ae',
|
|
12
36
|
};
|
|
13
37
|
|
|
14
38
|
export function defaultBaseUrlFor(env: PaymentEnvironment): string {
|
|
15
|
-
return DEFAULT_BASE_URLS[env];
|
|
39
|
+
return env === 'local' ? localBaseUrl() : DEFAULT_BASE_URLS[env];
|
|
16
40
|
}
|
|
17
41
|
|
|
18
42
|
/** Spare API tenant — one country per tenant. */
|
|
19
43
|
export type SpareApiTenant = 'ksa' | 'uae' | 'bah';
|
|
20
44
|
|
|
21
|
-
const TENANT_COUNTRY_CODES: Record<SpareApiTenant, string
|
|
45
|
+
const TENANT_COUNTRY_CODES: Readonly<Record<SpareApiTenant, string>> = {
|
|
22
46
|
ksa: 'KSA',
|
|
23
47
|
uae: 'UAE',
|
|
24
48
|
bah: 'BAH',
|
|
@@ -28,31 +52,19 @@ export function tenantCountryCode(t: SpareApiTenant): string {
|
|
|
28
52
|
return TENANT_COUNTRY_CODES[t];
|
|
29
53
|
}
|
|
30
54
|
|
|
31
|
-
/** Configuration
|
|
55
|
+
/** Configuration for a Spare Link instance. */
|
|
32
56
|
export interface SpareLinkConfig {
|
|
33
|
-
/**
|
|
34
|
-
linkToken: string;
|
|
35
|
-
|
|
36
|
-
/** Target environment (sandbox vs production). */
|
|
57
|
+
/** Target environment. Selects the host the hosted page is loaded from. */
|
|
37
58
|
environment: PaymentEnvironment;
|
|
38
59
|
|
|
39
|
-
/** Tenant (country). */
|
|
40
|
-
tenant: SpareApiTenant;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Override the base URL. Set only for local dev (e.g. `http://localhost:4000`)
|
|
44
|
-
* — production should rely on the environment-derived default.
|
|
45
|
-
*/
|
|
46
|
-
baseUrl?: string;
|
|
47
|
-
|
|
48
60
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
61
|
+
* Tenant (country). The hosted flow currently serves UAE only; the value is
|
|
62
|
+
* kept for that selection and for the tenants that follow.
|
|
51
63
|
*/
|
|
52
|
-
|
|
64
|
+
tenant: SpareApiTenant;
|
|
53
65
|
|
|
54
|
-
/**
|
|
55
|
-
|
|
66
|
+
/** Override the host. Set for a physical device pointed at a local API. */
|
|
67
|
+
baseUrl?: string;
|
|
56
68
|
}
|
|
57
69
|
|
|
58
70
|
/** Resolved base URL: explicit `baseUrl` if provided, else the environment default. */
|
|
@@ -61,27 +73,28 @@ export function resolvedBaseUrl(config: SpareLinkConfig): string {
|
|
|
61
73
|
}
|
|
62
74
|
|
|
63
75
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
76
|
+
* The tenants the hosted flow can actually serve.
|
|
77
|
+
*
|
|
78
|
+
* `tenant` accepts the others because the API surface outlives this list, but
|
|
79
|
+
* accepting one the page cannot serve would put a payer in front of the wrong
|
|
80
|
+
* country's flow rather than telling the integrator at construction time.
|
|
66
81
|
*/
|
|
67
|
-
|
|
68
|
-
environment: PaymentEnvironment;
|
|
69
|
-
tenant: SpareApiTenant;
|
|
70
|
-
baseUrl?: string;
|
|
71
|
-
fetch?: typeof fetch;
|
|
72
|
-
requestTimeoutMs?: number;
|
|
73
|
-
}
|
|
82
|
+
const SUPPORTED_TENANTS: readonly SpareApiTenant[] = ['uae'];
|
|
74
83
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
84
|
+
/**
|
|
85
|
+
* Throws if a config cannot be honoured.
|
|
86
|
+
*
|
|
87
|
+
* Called from {@link SpareLink}'s constructor, so a bad value fails where it was
|
|
88
|
+
* written rather than reaching the webview as a URL nobody meant.
|
|
89
|
+
*/
|
|
80
90
|
export function assertValidConfig(config: SpareLinkConfig): void {
|
|
81
|
-
if (!config.linkToken) {
|
|
82
|
-
throw new Error('SpareLinkConfig: linkToken must not be empty');
|
|
83
|
-
}
|
|
84
91
|
if (config.baseUrl && !/^https?:\/\//.test(config.baseUrl)) {
|
|
85
92
|
throw new Error('SpareLinkConfig: baseUrl must start with http:// or https://');
|
|
86
93
|
}
|
|
94
|
+
if (!SUPPORTED_TENANTS.includes(config.tenant)) {
|
|
95
|
+
throw new Error(
|
|
96
|
+
`SpareLinkConfig: the hosted flow does not serve tenant '${config.tenant}' yet ` +
|
|
97
|
+
`(supported: ${SUPPORTED_TENANTS.join(', ')})`,
|
|
98
|
+
);
|
|
99
|
+
}
|
|
87
100
|
}
|
|
@@ -3,20 +3,21 @@ import type { PaymentResult } from './payment-result';
|
|
|
3
3
|
/**
|
|
4
4
|
* Lifecycle events emitted on {@link SpareLink.events}.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* Analytics only — never required to drive the flow. This is a discriminated
|
|
7
|
+
* union (TypeScript's equivalent to Dart sealed classes); switch on `type` for
|
|
8
|
+
* exhaustive handling:
|
|
8
9
|
*
|
|
9
10
|
* ```ts
|
|
10
11
|
* spareLink.events.subscribe((event) => {
|
|
11
12
|
* switch (event.type) {
|
|
12
13
|
* case 'initialized':
|
|
13
|
-
* console.log('Started flow for', event.
|
|
14
|
+
* console.log('Started flow for', event.reference);
|
|
14
15
|
* break;
|
|
15
|
-
* case '
|
|
16
|
-
* console.log('
|
|
16
|
+
* case 'pageReady':
|
|
17
|
+
* console.log('Payer can act on the page');
|
|
17
18
|
* break;
|
|
18
19
|
* case 'succeeded':
|
|
19
|
-
* console.log('
|
|
20
|
+
* console.log('Reported success for', event.result.reference);
|
|
20
21
|
* break;
|
|
21
22
|
* // ...
|
|
22
23
|
* }
|
|
@@ -25,8 +26,7 @@ import type { PaymentResult } from './payment-result';
|
|
|
25
26
|
*/
|
|
26
27
|
export type SpareLinkEvent =
|
|
27
28
|
| SpareLinkInitialized
|
|
28
|
-
|
|
|
29
|
-
| SpareLinkConsentStarted
|
|
29
|
+
| SpareLinkPageReady
|
|
30
30
|
| SpareLinkRedirectToBank
|
|
31
31
|
| SpareLinkBankCallbackReceived
|
|
32
32
|
| SpareLinkSucceeded
|
|
@@ -37,36 +37,33 @@ export type SpareLinkEvent =
|
|
|
37
37
|
/** The SDK has started a payment flow. */
|
|
38
38
|
export interface SpareLinkInitialized {
|
|
39
39
|
readonly type: 'initialized';
|
|
40
|
-
readonly
|
|
40
|
+
readonly reference: string;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
/**
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
export interface SpareLinkConsentStarted {
|
|
53
|
-
readonly type: 'consentStarted';
|
|
54
|
-
readonly linkToken: string;
|
|
43
|
+
/**
|
|
44
|
+
* The hosted page is interactive and the payer has something to act on.
|
|
45
|
+
*
|
|
46
|
+
* The steps after this — choosing a bank, the payee check, reading the consent —
|
|
47
|
+
* happen inside the page, which does not report them.
|
|
48
|
+
*/
|
|
49
|
+
export interface SpareLinkPageReady {
|
|
50
|
+
readonly type: 'pageReady';
|
|
51
|
+
readonly reference: string;
|
|
55
52
|
}
|
|
56
53
|
|
|
57
|
-
/** The
|
|
54
|
+
/** The payer is being handed to their bank, outside the WebView. */
|
|
58
55
|
export interface SpareLinkRedirectToBank {
|
|
59
56
|
readonly type: 'redirectToBank';
|
|
60
|
-
readonly
|
|
57
|
+
readonly reference: string;
|
|
61
58
|
}
|
|
62
59
|
|
|
63
60
|
/** The bank has redirected back with a callback URI. */
|
|
64
61
|
export interface SpareLinkBankCallbackReceived {
|
|
65
62
|
readonly type: 'bankCallbackReceived';
|
|
66
|
-
readonly
|
|
63
|
+
readonly reference: string;
|
|
67
64
|
}
|
|
68
65
|
|
|
69
|
-
/** The
|
|
66
|
+
/** The return reported a completed payment and the flow is about to resolve. */
|
|
70
67
|
export interface SpareLinkSucceeded {
|
|
71
68
|
readonly type: 'succeeded';
|
|
72
69
|
readonly result: PaymentResult;
|
|
@@ -78,13 +75,13 @@ export interface SpareLinkFailed {
|
|
|
78
75
|
readonly result: PaymentResult;
|
|
79
76
|
}
|
|
80
77
|
|
|
81
|
-
/** The
|
|
78
|
+
/** The payer cancelled the payment and the flow is about to resolve. */
|
|
82
79
|
export interface SpareLinkCancelled {
|
|
83
80
|
readonly type: 'cancelled';
|
|
84
81
|
readonly result: PaymentResult;
|
|
85
82
|
}
|
|
86
83
|
|
|
87
|
-
/** The
|
|
84
|
+
/** The payer left before the flow resolved either way. */
|
|
88
85
|
export interface SpareLinkAbandoned {
|
|
89
86
|
readonly type: 'abandoned';
|
|
90
87
|
readonly result: PaymentResult;
|
|
@@ -93,8 +90,7 @@ export interface SpareLinkAbandoned {
|
|
|
93
90
|
/** All possible event type strings for type narrowing. */
|
|
94
91
|
export const SPARE_LINK_EVENT_TYPES = [
|
|
95
92
|
'initialized',
|
|
96
|
-
'
|
|
97
|
-
'consentStarted',
|
|
93
|
+
'pageReady',
|
|
98
94
|
'redirectToBank',
|
|
99
95
|
'bankCallbackReceived',
|
|
100
96
|
'succeeded',
|
|
@@ -114,22 +110,17 @@ export function isSpareLinkEvent(value: unknown): value is SpareLinkEvent {
|
|
|
114
110
|
|
|
115
111
|
/** Factory functions for creating events (internal use). */
|
|
116
112
|
export const SpareLinkEvents = {
|
|
117
|
-
initialized(
|
|
118
|
-
return { type: 'initialized',
|
|
119
|
-
},
|
|
120
|
-
sessionLoaded(linkToken: string, linkSessionId?: string): SpareLinkSessionLoaded {
|
|
121
|
-
return linkSessionId
|
|
122
|
-
? { type: 'sessionLoaded', linkToken, linkSessionId }
|
|
123
|
-
: { type: 'sessionLoaded', linkToken };
|
|
113
|
+
initialized(reference: string): SpareLinkInitialized {
|
|
114
|
+
return { type: 'initialized', reference };
|
|
124
115
|
},
|
|
125
|
-
|
|
126
|
-
return { type: '
|
|
116
|
+
pageReady(reference: string): SpareLinkPageReady {
|
|
117
|
+
return { type: 'pageReady', reference };
|
|
127
118
|
},
|
|
128
|
-
redirectToBank(
|
|
129
|
-
return { type: 'redirectToBank',
|
|
119
|
+
redirectToBank(reference: string): SpareLinkRedirectToBank {
|
|
120
|
+
return { type: 'redirectToBank', reference };
|
|
130
121
|
},
|
|
131
|
-
bankCallbackReceived(
|
|
132
|
-
return { type: 'bankCallbackReceived',
|
|
122
|
+
bankCallbackReceived(reference: string): SpareLinkBankCallbackReceived {
|
|
123
|
+
return { type: 'bankCallbackReceived', reference };
|
|
133
124
|
},
|
|
134
125
|
succeeded(result: PaymentResult): SpareLinkSucceeded {
|
|
135
126
|
return { type: 'succeeded', result };
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { PaymentResult } from './payment-result';
|
|
2
2
|
import type { RecoveryResult } from './recovery-result';
|
|
3
|
-
import type { SpareLinkSession } from './spare-link-session';
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
* Imperative API the {@link SpareLinkHost} mounts and wires to a
|
|
@@ -8,20 +7,8 @@ import type { SpareLinkSession } from './spare-link-session';
|
|
|
8
7
|
*
|
|
9
8
|
* @internal
|
|
10
9
|
*/
|
|
11
|
-
export interface SpareLinkHostApi {
|
|
12
|
-
start(args: { linkToken: string }): Promise<SpareLinkSession>;
|
|
13
|
-
handleRedirect(uri: URL | string): Promise<boolean>;
|
|
14
|
-
resumeIfNeeded(): Promise<RecoveryResult>;
|
|
15
|
-
isFlowActive(): boolean;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/** @internal */
|
|
19
10
|
export interface SpareLinkHostDelegate {
|
|
20
|
-
startFlow(args: {
|
|
21
|
-
linkToken: string;
|
|
22
|
-
resolve: (result: PaymentResult) => void;
|
|
23
|
-
onSessionLoaded?: (linkSessionId: string) => void;
|
|
24
|
-
}): void;
|
|
11
|
+
startFlow(args: { reference: string; resolve: (result: PaymentResult) => void }): void;
|
|
25
12
|
handleRedirect(uri: URL | string): Promise<boolean>;
|
|
26
13
|
resumeIfNeeded(): Promise<RecoveryResult>;
|
|
27
14
|
isFlowActive(): boolean;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { PendingSessionStore } from '../core/services/pending-session-store';
|
|
2
2
|
import { type EventEmitter, createEventEmitter } from '../internal/event-emitter';
|
|
3
3
|
import { type PaymentResult, paymentAbandoned } from './payment-result';
|
|
4
|
-
import {
|
|
4
|
+
import type { NoRecoveryReason, RecoveryResult } from './recovery-result';
|
|
5
5
|
import {
|
|
6
6
|
type PaymentEnvironment,
|
|
7
7
|
type SpareApiTenant,
|
|
8
|
+
assertValidConfig,
|
|
8
9
|
defaultBaseUrlFor,
|
|
9
10
|
} from './spare-link-config';
|
|
10
11
|
import { type SpareLinkEvent, SpareLinkEvents } from './spare-link-event';
|
|
@@ -15,14 +16,12 @@ export interface SpareLinkOptions {
|
|
|
15
16
|
environment: PaymentEnvironment;
|
|
16
17
|
tenant: SpareApiTenant;
|
|
17
18
|
baseUrl?: string;
|
|
18
|
-
fetch?: typeof fetch;
|
|
19
|
-
requestTimeoutMs?: number;
|
|
20
19
|
/** Store for crash-safe recovery. Defaults to none — wire e.g. `SecureStorePendingSessionStore`. */
|
|
21
20
|
pendingSessionStore?: PendingSessionStore;
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
interface PendingStart {
|
|
25
|
-
|
|
24
|
+
reference: string;
|
|
26
25
|
resolve: (session: SpareLinkSession) => void;
|
|
27
26
|
}
|
|
28
27
|
|
|
@@ -36,8 +35,11 @@ interface PendingResume {
|
|
|
36
35
|
}
|
|
37
36
|
|
|
38
37
|
/**
|
|
39
|
-
* Entry point for the Spare Link payment SDK
|
|
40
|
-
*
|
|
38
|
+
* Entry point for the Spare Link payment SDK.
|
|
39
|
+
*
|
|
40
|
+
* Your backend creates the payment request — with `channel: 'sdk_react_native'`
|
|
41
|
+
* and the return URLs your app is registered for — and gives the app the
|
|
42
|
+
* reference it returns. That reference is all this SDK needs.
|
|
41
43
|
*
|
|
42
44
|
* Mount {@link SpareLinkHost} once near your app root and pass this instance:
|
|
43
45
|
*
|
|
@@ -51,13 +53,15 @@ interface PendingResume {
|
|
|
51
53
|
* <App />
|
|
52
54
|
* </SpareLinkHost>
|
|
53
55
|
* ```
|
|
56
|
+
*
|
|
57
|
+
* The SDK makes no API calls of its own and holds no credentials. Every result
|
|
58
|
+
* it reports comes from a deep link that is interceptable by design, so confirm
|
|
59
|
+
* with your backend via `GET /payment-requests/{reference}` before acting on one.
|
|
54
60
|
*/
|
|
55
61
|
export class SpareLink {
|
|
56
62
|
readonly environment: PaymentEnvironment;
|
|
57
63
|
readonly tenant: SpareApiTenant;
|
|
58
64
|
readonly baseUrl: string | undefined;
|
|
59
|
-
readonly fetch: typeof fetch | undefined;
|
|
60
|
-
readonly requestTimeoutMs: number | undefined;
|
|
61
65
|
readonly pendingSessionStore: PendingSessionStore | undefined;
|
|
62
66
|
|
|
63
67
|
private readonly _events = createEventEmitter<SpareLinkEvent>();
|
|
@@ -69,11 +73,17 @@ export class SpareLink {
|
|
|
69
73
|
private readonly _pendingResumes: PendingResume[] = [];
|
|
70
74
|
|
|
71
75
|
constructor(options: SpareLinkOptions) {
|
|
76
|
+
// Fails where the config was written rather than letting a host the page was
|
|
77
|
+
// never served from reach the webview as a URL nobody meant.
|
|
78
|
+
assertValidConfig({
|
|
79
|
+
environment: options.environment,
|
|
80
|
+
tenant: options.tenant,
|
|
81
|
+
...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
|
|
82
|
+
});
|
|
83
|
+
|
|
72
84
|
this.environment = options.environment;
|
|
73
85
|
this.tenant = options.tenant;
|
|
74
86
|
this.baseUrl = options.baseUrl;
|
|
75
|
-
this.fetch = options.fetch;
|
|
76
|
-
this.requestTimeoutMs = options.requestTimeoutMs;
|
|
77
87
|
this.pendingSessionStore = options.pendingSessionStore;
|
|
78
88
|
}
|
|
79
89
|
|
|
@@ -92,45 +102,34 @@ export class SpareLink {
|
|
|
92
102
|
}
|
|
93
103
|
|
|
94
104
|
/**
|
|
95
|
-
*
|
|
105
|
+
* Opens the hosted payment page for `reference` and resolves when the flow ends.
|
|
96
106
|
*
|
|
97
|
-
* Returns a {@link SpareLinkSession} immediately; await `session.result`
|
|
98
|
-
*
|
|
107
|
+
* Returns a {@link SpareLinkSession} immediately; await `session.result` for the
|
|
108
|
+
* terminal outcome. There is no session to load first: the page resolves the
|
|
109
|
+
* request itself, so the payer sees it without waiting on a round trip.
|
|
99
110
|
*/
|
|
100
|
-
async start(args: {
|
|
101
|
-
const {
|
|
102
|
-
if (!
|
|
103
|
-
|
|
104
|
-
linkToken: '',
|
|
105
|
-
message: 'SpareLinkConfig: linkToken must not be empty',
|
|
106
|
-
resolvedAtMs: Date.now(),
|
|
107
|
-
});
|
|
108
|
-
this._emitTerminal(result);
|
|
109
|
-
return new SpareLinkSession({ linkToken: '', result: Promise.resolve(result) });
|
|
111
|
+
async start(args: { reference: string }): Promise<SpareLinkSession> {
|
|
112
|
+
const { reference } = args;
|
|
113
|
+
if (!reference) {
|
|
114
|
+
return this._resolveImmediately('', 'SpareLink.start: reference must not be empty');
|
|
110
115
|
}
|
|
111
116
|
|
|
112
117
|
if (this._disposed) {
|
|
113
|
-
|
|
114
|
-
linkToken,
|
|
115
|
-
message: 'SpareLink has been disposed.',
|
|
116
|
-
resolvedAtMs: Date.now(),
|
|
117
|
-
});
|
|
118
|
-
this._emitTerminal(result);
|
|
119
|
-
return new SpareLinkSession({ linkToken, result: Promise.resolve(result) });
|
|
118
|
+
return this._resolveImmediately(reference, 'SpareLink has been disposed.');
|
|
120
119
|
}
|
|
121
120
|
|
|
122
|
-
this._events.emit(SpareLinkEvents.initialized(
|
|
121
|
+
this._events.emit(SpareLinkEvents.initialized(reference));
|
|
123
122
|
|
|
124
123
|
if (!this._host) {
|
|
125
124
|
return new Promise<SpareLinkSession>((resolve) => {
|
|
126
|
-
this._pendingStarts.push({
|
|
125
|
+
this._pendingStarts.push({ reference, resolve });
|
|
127
126
|
});
|
|
128
127
|
}
|
|
129
128
|
|
|
130
|
-
return this._hostStart(
|
|
129
|
+
return this._hostStart(reference);
|
|
131
130
|
}
|
|
132
131
|
|
|
133
|
-
/** Processes a deep-link URI
|
|
132
|
+
/** Processes a deep-link URI the payer returned through. */
|
|
134
133
|
async handleRedirect(uri: URL | string): Promise<boolean> {
|
|
135
134
|
if (this._disposed) return false;
|
|
136
135
|
if (!this._host) {
|
|
@@ -141,12 +140,16 @@ export class SpareLink {
|
|
|
141
140
|
return this._host.handleRedirect(uri);
|
|
142
141
|
}
|
|
143
142
|
|
|
144
|
-
/**
|
|
143
|
+
/**
|
|
144
|
+
* Reports a payment that was left in progress by a previous app session.
|
|
145
|
+
*
|
|
146
|
+
* If the return deep link arrived before the app had a flow to give it to, the
|
|
147
|
+
* outcome is resolved from it. Otherwise the SDK cannot say how the payment
|
|
148
|
+
* ended — it holds no credentials, so it has nothing to ask with — and reports
|
|
149
|
+
* `outcomeUnknown` with the reference for your backend to resolve.
|
|
150
|
+
*/
|
|
145
151
|
async resumeIfNeeded(): Promise<RecoveryResult> {
|
|
146
|
-
if (this._disposed) {
|
|
147
|
-
return { kind: 'none', reason: 'persistenceUnavailable' };
|
|
148
|
-
}
|
|
149
|
-
if (!this.pendingSessionStore) {
|
|
152
|
+
if (this._disposed || !this.pendingSessionStore) {
|
|
150
153
|
return { kind: 'none', reason: 'persistenceUnavailable' };
|
|
151
154
|
}
|
|
152
155
|
if (!this._host) {
|
|
@@ -166,12 +169,12 @@ export class SpareLink {
|
|
|
166
169
|
|
|
167
170
|
for (const p of starts) {
|
|
168
171
|
const result = paymentAbandoned({
|
|
169
|
-
|
|
172
|
+
reference: p.reference,
|
|
170
173
|
message: 'SpareLink has been disposed.',
|
|
171
174
|
resolvedAtMs: Date.now(),
|
|
172
175
|
});
|
|
173
176
|
this._emitTerminal(result);
|
|
174
|
-
p.resolve(new SpareLinkSession({
|
|
177
|
+
p.resolve(new SpareLinkSession({ reference: p.reference, result: Promise.resolve(result) }));
|
|
175
178
|
}
|
|
176
179
|
for (const p of redirects) {
|
|
177
180
|
p.resolve(false);
|
|
@@ -207,6 +210,12 @@ export class SpareLink {
|
|
|
207
210
|
this._emitTerminal(result);
|
|
208
211
|
}
|
|
209
212
|
|
|
213
|
+
private _resolveImmediately(reference: string, message: string): SpareLinkSession {
|
|
214
|
+
const result = paymentAbandoned({ reference, message, resolvedAtMs: Date.now() });
|
|
215
|
+
this._emitTerminal(result);
|
|
216
|
+
return new SpareLinkSession({ reference, result: Promise.resolve(result) });
|
|
217
|
+
}
|
|
218
|
+
|
|
210
219
|
private _emitTerminal(result: PaymentResult): void {
|
|
211
220
|
switch (result.status) {
|
|
212
221
|
case 'success':
|
|
@@ -224,11 +233,11 @@ export class SpareLink {
|
|
|
224
233
|
}
|
|
225
234
|
}
|
|
226
235
|
|
|
227
|
-
private async _hostStart(
|
|
236
|
+
private async _hostStart(reference: string): Promise<SpareLinkSession> {
|
|
228
237
|
const host = this._host;
|
|
229
238
|
if (!host) {
|
|
230
239
|
return new Promise<SpareLinkSession>((resolve) => {
|
|
231
|
-
this._pendingStarts.push({
|
|
240
|
+
this._pendingStarts.push({ reference, resolve });
|
|
232
241
|
});
|
|
233
242
|
}
|
|
234
243
|
|
|
@@ -236,21 +245,16 @@ export class SpareLink {
|
|
|
236
245
|
const resultPromise = new Promise<PaymentResult>((resolve) => {
|
|
237
246
|
resolveResult = resolve;
|
|
238
247
|
});
|
|
239
|
-
const session = new SpareLinkSession({ linkToken, result: resultPromise });
|
|
240
248
|
|
|
241
249
|
host.startFlow({
|
|
242
|
-
|
|
250
|
+
reference,
|
|
243
251
|
resolve: (result) => {
|
|
244
252
|
this._emitTerminal(result);
|
|
245
253
|
resolveResult(result);
|
|
246
254
|
},
|
|
247
|
-
onSessionLoaded: (linkSessionId) => {
|
|
248
|
-
session.updateLinkSessionId(linkSessionId);
|
|
249
|
-
this._events.emit(SpareLinkEvents.sessionLoaded(linkToken, linkSessionId));
|
|
250
|
-
},
|
|
251
255
|
});
|
|
252
256
|
|
|
253
|
-
return
|
|
257
|
+
return new SpareLinkSession({ reference, result: resultPromise });
|
|
254
258
|
}
|
|
255
259
|
|
|
256
260
|
private _drainPending(host: SpareLinkHostDelegate): void {
|
|
@@ -259,7 +263,7 @@ export class SpareLink {
|
|
|
259
263
|
const resumes = this._pendingResumes.splice(0);
|
|
260
264
|
|
|
261
265
|
for (const p of starts) {
|
|
262
|
-
void this._hostStart(p.
|
|
266
|
+
void this._hostStart(p.reference).then(p.resolve);
|
|
263
267
|
}
|
|
264
268
|
for (const p of redirects) {
|
|
265
269
|
void host.handleRedirect(p.uri).then(p.resolve, () => p.resolve(false));
|
|
@@ -272,18 +276,6 @@ export class SpareLink {
|
|
|
272
276
|
}
|
|
273
277
|
}
|
|
274
278
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
recovery: RecoveryResult | { kind: 'inProgress'; linkToken: string },
|
|
278
|
-
): RecoveryResult {
|
|
279
|
-
if (recovery.kind === 'inProgress') {
|
|
280
|
-
return { kind: 'awaitingUser', linkToken: recovery.linkToken };
|
|
281
|
-
}
|
|
282
|
-
return recovery;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
export function noRecovery(reason: NoRecoveryReason): RecoveryResult {
|
|
286
|
-
return { kind: 'none', reason };
|
|
279
|
+
export function noRecovery(reason: NoRecoveryReason, reference?: string): RecoveryResult {
|
|
280
|
+
return reference ? { kind: 'none', reason, reference } : { kind: 'none', reason };
|
|
287
281
|
}
|
|
288
|
-
|
|
289
|
-
export { isSessionRecovered };
|
|
@@ -3,26 +3,14 @@ import type { PaymentResult } from './payment-result';
|
|
|
3
3
|
/**
|
|
4
4
|
* Handle for an in-flight or completed payment started via {@link SpareLink.start}.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* await `result` for the terminal outcome.
|
|
6
|
+
* `reference` is available immediately; await `result` for the terminal outcome.
|
|
8
7
|
*/
|
|
9
8
|
export class SpareLinkSession {
|
|
10
|
-
readonly
|
|
11
|
-
linkSessionId: string | undefined;
|
|
9
|
+
readonly reference: string;
|
|
12
10
|
readonly result: Promise<PaymentResult>;
|
|
13
11
|
|
|
14
|
-
constructor(args: {
|
|
15
|
-
|
|
16
|
-
result: Promise<PaymentResult>;
|
|
17
|
-
linkSessionId?: string;
|
|
18
|
-
}) {
|
|
19
|
-
this.linkToken = args.linkToken;
|
|
20
|
-
this.linkSessionId = args.linkSessionId;
|
|
12
|
+
constructor(args: { reference: string; result: Promise<PaymentResult> }) {
|
|
13
|
+
this.reference = args.reference;
|
|
21
14
|
this.result = args.result;
|
|
22
15
|
}
|
|
23
|
-
|
|
24
|
-
/** Called internally when the server provides {@link linkSessionId}. */
|
|
25
|
-
updateLinkSessionId(value: string): void {
|
|
26
|
-
this.linkSessionId = value;
|
|
27
|
-
}
|
|
28
16
|
}
|
package/src/public/spare-link.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { SpareLink,
|
|
1
|
+
export { SpareLink, noRecovery } from './spare-link-instance';
|
|
2
2
|
export type { SpareLinkOptions } from './spare-link-instance';
|