@inno-isw/react-native-rtp 0.1.0 → 0.3.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 +57 -23
- package/lib/module/client.js +218 -17
- package/lib/module/client.js.map +1 -1
- package/lib/module/constants.js +5 -0
- package/lib/module/constants.js.map +1 -1
- package/lib/module/index.js +2 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/mock/makeRtpPayload.js +3 -0
- package/lib/module/mock/makeRtpPayload.js.map +1 -1
- package/lib/module/mock/mockTransport.js +9 -2
- package/lib/module/mock/mockTransport.js.map +1 -1
- package/lib/module/react/RtpProvider.js +13 -3
- package/lib/module/react/RtpProvider.js.map +1 -1
- package/lib/module/validate.js +42 -0
- package/lib/module/validate.js.map +1 -1
- package/lib/typescript/src/client.d.ts +12 -3
- package/lib/typescript/src/client.d.ts.map +1 -1
- package/lib/typescript/src/constants.d.ts +5 -0
- package/lib/typescript/src/constants.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/mock/makeRtpPayload.d.ts.map +1 -1
- package/lib/typescript/src/mock/mockTransport.d.ts +7 -1
- package/lib/typescript/src/mock/mockTransport.d.ts.map +1 -1
- package/lib/typescript/src/react/RtpProvider.d.ts +6 -2
- package/lib/typescript/src/react/RtpProvider.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +22 -5
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/validate.d.ts +11 -0
- package/lib/typescript/src/validate.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +227 -20
- package/src/constants.ts +5 -0
- package/src/index.tsx +3 -1
- package/src/mock/makeRtpPayload.ts +3 -0
- package/src/mock/mockTransport.ts +18 -2
- package/src/react/RtpProvider.tsx +40 -5
- package/src/types.ts +22 -6
- package/src/validate.ts +48 -0
package/README.md
CHANGED
|
@@ -52,16 +52,27 @@ interface RtpPayload {
|
|
|
52
52
|
version?: string; // schema version; unknown values are ignored
|
|
53
53
|
type: 'RTP'; // discriminator
|
|
54
54
|
rtpId: string; // stable id — the idempotency key
|
|
55
|
-
amount:
|
|
55
|
+
amount: number; // minor unit (e.g. kobo); integer, no floats
|
|
56
56
|
currency: string; // ISO 4217, e.g. "NGN"
|
|
57
|
-
|
|
57
|
+
payer: { name: string; accountNumber?: string; bank?: string; logoUrl?: string };
|
|
58
|
+
payee: { name: string; accountNumber?: string; bank?: string; bankCode?: string; logoUrl?: string };
|
|
59
|
+
narration?: string;
|
|
58
60
|
transactionRef?: string;
|
|
61
|
+
orderNumber?: string; // merchant/issuer order no. (≠ transactionRef)
|
|
62
|
+
deepLink?: string; // secure transaction / deep-link reference
|
|
63
|
+
actionMessage?: string; // instruction shown to the customer
|
|
59
64
|
expiresAt: string; // ISO 8601
|
|
60
65
|
recipient?: string; // alias the request is addressed to
|
|
61
66
|
[key: string]: unknown; // forward-compatible passthrough
|
|
62
67
|
}
|
|
63
68
|
```
|
|
64
69
|
|
|
70
|
+
> `payer` is the party being asked to pay (your customer); `payee` is the party
|
|
71
|
+
> that receives the money (the merchant).
|
|
72
|
+
|
|
73
|
+
> `payee.bankCode` is the destination institution code (e.g. a NIP bank code).
|
|
74
|
+
> The host uses it to route the transfer; the SDK passes it through untouched.
|
|
75
|
+
|
|
65
76
|
> Unknown fields are **ignored, not rejected**, so older SDKs keep working when
|
|
66
77
|
> the backend adds fields.
|
|
67
78
|
|
|
@@ -78,22 +89,12 @@ payload.type === 'RTP' && typeof payload.rtpId === 'string';
|
|
|
78
89
|
|
|
79
90
|
## Quick start
|
|
80
91
|
|
|
81
|
-
### 1. Create the client (injected
|
|
92
|
+
### 1. Create the client (injected ports)
|
|
82
93
|
|
|
83
94
|
```ts
|
|
84
95
|
import { createRtpClient } from '@inno-isw/react-native-rtp';
|
|
85
|
-
import { api } from './api'; // your existing HTTP client / ky / axios instance
|
|
86
96
|
|
|
87
97
|
export const rtpClient = createRtpClient({
|
|
88
|
-
// (required) minimal HTTP contract — the SDK never imports a network lib
|
|
89
|
-
transport: {
|
|
90
|
-
post: (path, body, headers) => api.post(path, { json: body, headers }),
|
|
91
|
-
get: (path, headers) => api.get(path, { headers }),
|
|
92
|
-
},
|
|
93
|
-
|
|
94
|
-
// (optional) auth headers, called per request so tokens/MACs stay fresh
|
|
95
|
-
getAuthHeaders: async () => ({ Authorization: `Bearer ${await getToken()}` }),
|
|
96
|
-
|
|
97
98
|
// (optional) drives the auth gate + recipient matching
|
|
98
99
|
getCurrentUser: () => authStore.user?.email ?? null,
|
|
99
100
|
|
|
@@ -102,9 +103,27 @@ export const rtpClient = createRtpClient({
|
|
|
102
103
|
|
|
103
104
|
// (optional) diagnostics sink
|
|
104
105
|
logger: (...args) => console.log('[rtp]', ...args),
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Transport-free by default.** With no `transport`, the client validates,
|
|
110
|
+
de-duplicates, expires and tracks the request, but performs **no network
|
|
111
|
+
calls** — `accept`/`decline` record the decision locally and `retrieve` reports
|
|
112
|
+
the details already held from the payload. This is the iteration-1 shape: the
|
|
113
|
+
host finalises the payment through its **own core banking**, not an RTP backend.
|
|
105
114
|
|
|
106
|
-
|
|
107
|
-
|
|
115
|
+
Inject a `transport` only when your host has a real RTP service to talk to:
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
import { api } from './api'; // your existing HTTP client / ky / axios instance
|
|
119
|
+
|
|
120
|
+
export const rtpClient = createRtpClient({
|
|
121
|
+
transport: {
|
|
122
|
+
post: (path, body, headers) => api.post(path, { json: body, headers }),
|
|
123
|
+
get: (path, headers) => api.get(path, { headers }),
|
|
124
|
+
},
|
|
125
|
+
basePath: '/rtp', // defaults to "/rtp"
|
|
126
|
+
getCurrentUser: () => authStore.user?.email ?? null,
|
|
108
127
|
});
|
|
109
128
|
```
|
|
110
129
|
|
|
@@ -154,7 +173,7 @@ Inside your screen, render your own sheet (e.g. QTM's `QTBottomSheet`):
|
|
|
154
173
|
|
|
155
174
|
```tsx
|
|
156
175
|
function Dashboard() {
|
|
157
|
-
const { request, status, isReady, accept, decline, dismiss, lastResult } =
|
|
176
|
+
const { request, status, isReady, isLoading, accept, decline, dismiss, lastResult } =
|
|
158
177
|
useRtp();
|
|
159
178
|
|
|
160
179
|
return (
|
|
@@ -162,9 +181,11 @@ function Dashboard() {
|
|
|
162
181
|
<YourDashboard />
|
|
163
182
|
|
|
164
183
|
<QTBottomSheet isOpen={status !== null} onClose={dismiss}>
|
|
184
|
+
{isLoading && <ActivityIndicator />}
|
|
185
|
+
|
|
165
186
|
{request && (
|
|
166
187
|
<>
|
|
167
|
-
<Text>{request.
|
|
188
|
+
<Text>{request.payee.name}</Text>
|
|
168
189
|
<Text>{request.currency} {request.amount}</Text>
|
|
169
190
|
<Text>{request.transactionRef}</Text>
|
|
170
191
|
</>
|
|
@@ -196,16 +217,20 @@ The SDK computes status; the app only renders it.
|
|
|
196
217
|
| Status | Meaning |
|
|
197
218
|
| --- | --- |
|
|
198
219
|
| `RECEIVED` | Payload arrived and passed validation. |
|
|
220
|
+
| `RETRIEVING` | Details are being fetched from the backend (`retrieve`). |
|
|
199
221
|
| `AWAITING_AUTH` | Valid, but the user is logged out (auth gate). |
|
|
200
222
|
| `READY` | Valid, authenticated, actionable — show Accept / Decline. |
|
|
201
223
|
| `PROCESSING` | Accept/decline in flight. |
|
|
224
|
+
| `PENDING` | Backend accepted the action but a final decision is still pending. |
|
|
202
225
|
| `ACCEPTED` | Backend confirmed acceptance. |
|
|
203
226
|
| `DECLINED` | Backend confirmed (or user initiated) a decline. |
|
|
204
227
|
| `EXPIRED` | Past `expiresAt`; no longer actionable. |
|
|
205
228
|
| `FAILED` | Terminal failure. See `RtpError` for the reason. |
|
|
206
229
|
|
|
207
|
-
`
|
|
208
|
-
|
|
230
|
+
`ACCEPTED`, `DECLINED`, `EXPIRED` and `FAILED` are terminal; `PENDING` is not.
|
|
231
|
+
|
|
232
|
+
`RtpError` values: `INVALID_PAYLOAD`, `RECIPIENT_MISMATCH`, `RETRIEVE_FAILED`,
|
|
233
|
+
`NETWORK_ERROR`, `BACKEND_REJECTED`, `UNKNOWN`.
|
|
209
234
|
|
|
210
235
|
---
|
|
211
236
|
|
|
@@ -216,8 +241,8 @@ function.
|
|
|
216
241
|
|
|
217
242
|
| Event | Payload | Fires when |
|
|
218
243
|
| --- | --- | --- |
|
|
219
|
-
| `request` | `RtpRequest` | A request becomes actionable (`READY`). |
|
|
220
|
-
| `state` | `{ id, status }` | Any status transition. |
|
|
244
|
+
| `request` | `RtpRequest` | A request becomes actionable (`READY`), or its details were refreshed. |
|
|
245
|
+
| `state` | `{ id, status }` | Any status transition, including the in-place `EXPIRED` below. |
|
|
221
246
|
| `result` | `RtpResult` | A terminal outcome (`ACCEPTED`/`DECLINED`/`EXPIRED`/`FAILED`). |
|
|
222
247
|
|
|
223
248
|
```ts
|
|
@@ -236,6 +261,7 @@ off();
|
|
|
236
261
|
| --- | --- |
|
|
237
262
|
| `isRtp(payload)` | Type guard for decoded RTP payloads. |
|
|
238
263
|
| `receive(payload)` | Validate, de-dupe, apply the auth gate/expiry, and emit. Returns an outcome. |
|
|
264
|
+
| `retrieve(id)` | Fetch/refresh authorization details and reconcile the backend status. |
|
|
239
265
|
| `accept({ id, credential })` | Authorize a request. `credential` is **opaque** — the SDK forwards it untouched. |
|
|
240
266
|
| `decline({ id, reason })` | Decline a request. |
|
|
241
267
|
| `getStatus(id)` | Current normalized status. |
|
|
@@ -263,8 +289,16 @@ its own credential type and posts it opaquely.
|
|
|
263
289
|
|
|
264
290
|
- **Duplicate delivery** — the same `rtpId` arriving via foreground *and*
|
|
265
291
|
background (or a double tap) emits `request` exactly once.
|
|
266
|
-
- **Expiry
|
|
267
|
-
sheet is open
|
|
292
|
+
- **Expiry fires on its own** — a timer is armed at `expiresAt`, so a request
|
|
293
|
+
that lapses while the sheet is open transitions to `EXPIRED` in place (a
|
|
294
|
+
`state` + `result` event) instead of waiting for the next user action.
|
|
295
|
+
- **Expiry re-checked on every transition** — `accept`/`decline`/`retrieve`
|
|
296
|
+
refuse an already-lapsed request and report `EXPIRED`.
|
|
297
|
+
- **Backend status is never assumed** — an unrecognised status from
|
|
298
|
+
`accept`/`retrieve` fails closed (`FAILED` / `BACKEND_REJECTED`) rather than
|
|
299
|
+
being reported as an approved payment.
|
|
300
|
+
- **Retrieve failure is contained** — a failed `retrieve` emits `FAILED` with
|
|
301
|
+
`RETRIEVE_FAILED`; the request is not silently dropped.
|
|
268
302
|
- **Recipient mismatch** — if `payload.recipient` doesn't match `getCurrentUser()`,
|
|
269
303
|
the request fails with `RECIPIENT_MISMATCH` instead of being shown.
|
|
270
304
|
- **Logged-out → login resume** — a request received while logged out sits in
|
package/lib/module/client.js
CHANGED
|
@@ -2,34 +2,108 @@
|
|
|
2
2
|
|
|
3
3
|
import { RTP_ERROR, RTP_EVENT, RTP_STATUS } from "./constants.js";
|
|
4
4
|
import { createEmitter, defaultNow, noopLogger } from "./emitter.js";
|
|
5
|
-
import { findValidationErrors, isExpired, isRtpPayload, toRtpRequest } from "./validate.js";
|
|
5
|
+
import { findValidationErrors, isExpired, isRtpPayload, mergeRequest, toRequestPatch, toRtpRequest } from "./validate.js";
|
|
6
|
+
/** Statuses after which a request is finished with. */
|
|
7
|
+
const TERMINAL_STATUSES = new Set([RTP_STATUS.ACCEPTED, RTP_STATUS.DECLINED, RTP_STATUS.EXPIRED, RTP_STATUS.FAILED]);
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Map a backend status string onto the normalized SDK status.
|
|
11
|
+
*
|
|
12
|
+
* Unknown values are deliberately **not** treated as success — they map to
|
|
13
|
+
* `undefined` so the caller can decide, rather than silently reporting an
|
|
14
|
+
* approved payment for a status the client does not understand.
|
|
15
|
+
*/
|
|
16
|
+
export function normalizeBackendStatus(raw) {
|
|
17
|
+
if (typeof raw !== 'string') {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
switch (raw.toUpperCase()) {
|
|
21
|
+
case 'ACCEPTED':
|
|
22
|
+
case 'APPROVED':
|
|
23
|
+
case 'SUCCESS':
|
|
24
|
+
case 'SUCCESSFUL':
|
|
25
|
+
return RTP_STATUS.ACCEPTED;
|
|
26
|
+
case 'DECLINED':
|
|
27
|
+
case 'USER_DECLINED':
|
|
28
|
+
return RTP_STATUS.DECLINED;
|
|
29
|
+
case 'EXPIRED':
|
|
30
|
+
return RTP_STATUS.EXPIRED;
|
|
31
|
+
case 'PENDING':
|
|
32
|
+
case 'PROCESSING':
|
|
33
|
+
return RTP_STATUS.PENDING;
|
|
34
|
+
case 'FAILED':
|
|
35
|
+
case 'REJECTED':
|
|
36
|
+
return RTP_STATUS.FAILED;
|
|
37
|
+
default:
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
6
42
|
/**
|
|
7
43
|
* Create a portable Request-to-Pay client.
|
|
8
44
|
*
|
|
9
45
|
* The client owns validation, de-duplication, expiry, status computation and
|
|
10
|
-
* the accept/decline/
|
|
11
|
-
* Every external effect is injected so the same contract can be
|
|
12
|
-
* on other platforms.
|
|
46
|
+
* the accept/decline/retrieve calls. It owns no UI, no navigation and no
|
|
47
|
+
* crypto. Every external effect is injected so the same contract can be
|
|
48
|
+
* re-implemented on other platforms.
|
|
13
49
|
*/
|
|
14
50
|
export function createRtpClient(options) {
|
|
15
51
|
const {
|
|
16
52
|
transport,
|
|
17
|
-
getAuthHeaders = async () => ({}),
|
|
18
53
|
getCurrentUser = () => null,
|
|
19
54
|
now = defaultNow,
|
|
20
55
|
logger = noopLogger,
|
|
21
56
|
basePath = '/rtp'
|
|
22
57
|
} = options;
|
|
23
|
-
if (!transport) {
|
|
24
|
-
throw new Error('[react-native-rtp] `transport` is required');
|
|
25
|
-
}
|
|
26
58
|
const emitter = createEmitter();
|
|
27
59
|
const entries = new Map();
|
|
60
|
+
|
|
61
|
+
// --- expiry scheduling --------------------------------------------------
|
|
62
|
+
// Expiry is not only evaluated lazily: an inactive timer fires at `expiresAt`
|
|
63
|
+
// so a request cannot remain actionable after it has lapsed (INDV-3807/3808).
|
|
64
|
+
let expiryTimer;
|
|
65
|
+
let expiryTimerId;
|
|
66
|
+
function clearExpiryTimer() {
|
|
67
|
+
if (expiryTimer !== undefined) {
|
|
68
|
+
clearTimeout(expiryTimer);
|
|
69
|
+
}
|
|
70
|
+
expiryTimer = undefined;
|
|
71
|
+
expiryTimerId = undefined;
|
|
72
|
+
}
|
|
73
|
+
function scheduleExpiry(entry) {
|
|
74
|
+
clearExpiryTimer();
|
|
75
|
+
const expiry = new Date(entry.request.expiresAt).getTime();
|
|
76
|
+
if (Number.isNaN(expiry)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const id = entry.request.id;
|
|
80
|
+
expiryTimerId = id;
|
|
81
|
+
expiryTimer = setTimeout(() => {
|
|
82
|
+
const current = entries.get(id);
|
|
83
|
+
if (!current || TERMINAL_STATUSES.has(current.status)) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
logger('[react-native-rtp] request expired:', id);
|
|
87
|
+
emitResult({
|
|
88
|
+
id,
|
|
89
|
+
status: RTP_STATUS.EXPIRED
|
|
90
|
+
});
|
|
91
|
+
}, Math.max(0, expiry - now()));
|
|
92
|
+
|
|
93
|
+
// Never keep a Node process (e.g. Jest) alive for a pending expiry.
|
|
94
|
+
const handle = expiryTimer;
|
|
95
|
+
if (typeof handle?.unref === 'function') {
|
|
96
|
+
handle.unref();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
28
99
|
function setStatus(id, status) {
|
|
29
100
|
const entry = entries.get(id);
|
|
30
101
|
if (entry) {
|
|
31
102
|
entry.status = status;
|
|
32
103
|
}
|
|
104
|
+
if (TERMINAL_STATUSES.has(status) && expiryTimerId === id) {
|
|
105
|
+
clearExpiryTimer();
|
|
106
|
+
}
|
|
33
107
|
emitter.emit(RTP_EVENT.STATE, {
|
|
34
108
|
id,
|
|
35
109
|
status
|
|
@@ -74,10 +148,11 @@ export function createRtpClient(options) {
|
|
|
74
148
|
};
|
|
75
149
|
}
|
|
76
150
|
const request = toRtpRequest(payload);
|
|
77
|
-
|
|
151
|
+
const entry = {
|
|
78
152
|
request,
|
|
79
153
|
status: RTP_STATUS.RECEIVED
|
|
80
|
-
}
|
|
154
|
+
};
|
|
155
|
+
entries.set(id, entry);
|
|
81
156
|
if (isExpired(request, now())) {
|
|
82
157
|
const result = emitResult({
|
|
83
158
|
id,
|
|
@@ -92,6 +167,7 @@ export function createRtpClient(options) {
|
|
|
92
167
|
const currentUser = getCurrentUser();
|
|
93
168
|
if (!currentUser) {
|
|
94
169
|
setStatus(id, RTP_STATUS.AWAITING_AUTH);
|
|
170
|
+
scheduleExpiry(entry);
|
|
95
171
|
return {
|
|
96
172
|
handled: true,
|
|
97
173
|
request,
|
|
@@ -108,6 +184,7 @@ export function createRtpClient(options) {
|
|
|
108
184
|
};
|
|
109
185
|
}
|
|
110
186
|
setStatus(id, RTP_STATUS.READY);
|
|
187
|
+
scheduleExpiry(entry);
|
|
111
188
|
emitter.emit(RTP_EVENT.REQUEST, request);
|
|
112
189
|
return {
|
|
113
190
|
handled: true,
|
|
@@ -116,6 +193,96 @@ export function createRtpClient(options) {
|
|
|
116
193
|
};
|
|
117
194
|
}
|
|
118
195
|
|
|
196
|
+
/**
|
|
197
|
+
* Fetch (or refresh) authorization details for a request from the backend,
|
|
198
|
+
* and reconcile the backend status. This is the "retrieve details" step the
|
|
199
|
+
* authorization page needs before it can be trusted (INDV-3804).
|
|
200
|
+
*/
|
|
201
|
+
async function retrieve(id) {
|
|
202
|
+
const entry = entries.get(id);
|
|
203
|
+
if (!entry) {
|
|
204
|
+
return fail(id, RTP_ERROR.UNKNOWN);
|
|
205
|
+
}
|
|
206
|
+
if (isExpired(entry.request, now())) {
|
|
207
|
+
return emitResult({
|
|
208
|
+
id,
|
|
209
|
+
status: RTP_STATUS.EXPIRED
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
if (TERMINAL_STATUSES.has(entry.status)) {
|
|
213
|
+
return {
|
|
214
|
+
id,
|
|
215
|
+
status: entry.status
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Transport-free mode: there is no backend to fetch from, so the details
|
|
220
|
+
// already held from the payload are authoritative. This is the shape the
|
|
221
|
+
// client runs in when the host settles the payment through its own core
|
|
222
|
+
// banking rather than an RTP backend.
|
|
223
|
+
if (!transport) {
|
|
224
|
+
setStatus(id, RTP_STATUS.READY);
|
|
225
|
+
scheduleExpiry(entry);
|
|
226
|
+
emitter.emit(RTP_EVENT.REQUEST, entry.request);
|
|
227
|
+
return {
|
|
228
|
+
id,
|
|
229
|
+
status: RTP_STATUS.READY
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
setStatus(id, RTP_STATUS.RETRIEVING);
|
|
233
|
+
try {
|
|
234
|
+
const headers = {};
|
|
235
|
+
const res = await transport.get(`${basePath}/${id}`, headers);
|
|
236
|
+
const data = res?.data ?? {};
|
|
237
|
+
const mapped = normalizeBackendStatus(data.status);
|
|
238
|
+
if (mapped === RTP_STATUS.EXPIRED || mapped === RTP_STATUS.DECLINED || mapped === RTP_STATUS.FAILED) {
|
|
239
|
+
return emitResult({
|
|
240
|
+
id,
|
|
241
|
+
status: mapped,
|
|
242
|
+
data,
|
|
243
|
+
error: mapped === RTP_STATUS.FAILED ? RTP_ERROR.BACKEND_REJECTED : undefined
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
if (mapped === RTP_STATUS.ACCEPTED) {
|
|
247
|
+
return emitResult({
|
|
248
|
+
id,
|
|
249
|
+
status: RTP_STATUS.ACCEPTED,
|
|
250
|
+
data
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
if (mapped === RTP_STATUS.PENDING) {
|
|
254
|
+
return emitResult({
|
|
255
|
+
id,
|
|
256
|
+
status: RTP_STATUS.PENDING,
|
|
257
|
+
data
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Merge any returned details (a full payload, or nested under `request`).
|
|
262
|
+
const incoming = data.request ?? data;
|
|
263
|
+
if (incoming && typeof incoming === 'object') {
|
|
264
|
+
entry.request = mergeRequest(entry.request, toRequestPatch(incoming));
|
|
265
|
+
}
|
|
266
|
+
if (isExpired(entry.request, now())) {
|
|
267
|
+
return emitResult({
|
|
268
|
+
id,
|
|
269
|
+
status: RTP_STATUS.EXPIRED
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
setStatus(id, RTP_STATUS.READY);
|
|
273
|
+
scheduleExpiry(entry);
|
|
274
|
+
emitter.emit(RTP_EVENT.REQUEST, entry.request);
|
|
275
|
+
return {
|
|
276
|
+
id,
|
|
277
|
+
status: RTP_STATUS.READY,
|
|
278
|
+
data
|
|
279
|
+
};
|
|
280
|
+
} catch (err) {
|
|
281
|
+
logger('[react-native-rtp] retrieve failed:', err);
|
|
282
|
+
return fail(id, RTP_ERROR.RETRIEVE_FAILED);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
119
286
|
/**
|
|
120
287
|
* Called by the host after a successful login to release any requests that
|
|
121
288
|
* were waiting on the auth gate.
|
|
@@ -139,6 +306,7 @@ export function createRtpClient(options) {
|
|
|
139
306
|
continue;
|
|
140
307
|
}
|
|
141
308
|
setStatus(id, RTP_STATUS.READY);
|
|
309
|
+
scheduleExpiry(entry);
|
|
142
310
|
emitter.emit(RTP_EVENT.REQUEST, entry.request);
|
|
143
311
|
}
|
|
144
312
|
}
|
|
@@ -158,17 +326,33 @@ export function createRtpClient(options) {
|
|
|
158
326
|
});
|
|
159
327
|
}
|
|
160
328
|
setStatus(id, RTP_STATUS.PROCESSING);
|
|
329
|
+
|
|
330
|
+
// Transport-free mode: acceptance is realised by the host's own payment
|
|
331
|
+
// flow; the client only records the decision locally.
|
|
332
|
+
if (!transport) {
|
|
333
|
+
return emitResult({
|
|
334
|
+
id,
|
|
335
|
+
status: RTP_STATUS.ACCEPTED
|
|
336
|
+
});
|
|
337
|
+
}
|
|
161
338
|
try {
|
|
162
|
-
const headers =
|
|
339
|
+
const headers = {};
|
|
163
340
|
const res = await transport.post(`${basePath}/${id}/accept`, {
|
|
164
341
|
credential
|
|
165
342
|
}, headers);
|
|
166
|
-
const
|
|
167
|
-
|
|
343
|
+
const data = res?.data ?? {};
|
|
344
|
+
|
|
345
|
+
// If the backend returned a status we recognise, honour it. If it
|
|
346
|
+
// returned no status at all, the accept call itself succeeded. If it
|
|
347
|
+
// returned a status we do NOT understand, fail closed rather than
|
|
348
|
+
// showing the customer an approved payment we cannot vouch for.
|
|
349
|
+
const hasStatus = data.status !== undefined && data.status !== null;
|
|
350
|
+
const mapped = normalizeBackendStatus(data.status);
|
|
351
|
+
const status = hasStatus ? mapped ?? RTP_STATUS.FAILED : RTP_STATUS.ACCEPTED;
|
|
168
352
|
return emitResult({
|
|
169
353
|
id,
|
|
170
354
|
status,
|
|
171
|
-
data
|
|
355
|
+
data,
|
|
172
356
|
error: status === RTP_STATUS.FAILED ? RTP_ERROR.BACKEND_REJECTED : undefined
|
|
173
357
|
});
|
|
174
358
|
} catch (err) {
|
|
@@ -186,15 +370,28 @@ export function createRtpClient(options) {
|
|
|
186
370
|
return fail(id, RTP_ERROR.UNKNOWN);
|
|
187
371
|
}
|
|
188
372
|
setStatus(id, RTP_STATUS.PROCESSING);
|
|
373
|
+
|
|
374
|
+
// Transport-free mode: the decline is recorded locally; a host with a
|
|
375
|
+
// backend still posts it through `transport`.
|
|
376
|
+
if (!transport) {
|
|
377
|
+
return emitResult({
|
|
378
|
+
id,
|
|
379
|
+
status: RTP_STATUS.DECLINED
|
|
380
|
+
});
|
|
381
|
+
}
|
|
189
382
|
try {
|
|
190
|
-
const headers =
|
|
383
|
+
const headers = {};
|
|
191
384
|
const res = await transport.post(`${basePath}/${id}/decline`, {
|
|
192
385
|
reason
|
|
193
386
|
}, headers);
|
|
387
|
+
const data = res?.data ?? {};
|
|
388
|
+
const mapped = normalizeBackendStatus(data.status);
|
|
389
|
+
const status = mapped === RTP_STATUS.EXPIRED || mapped === RTP_STATUS.FAILED ? mapped : RTP_STATUS.DECLINED;
|
|
194
390
|
return emitResult({
|
|
195
391
|
id,
|
|
196
|
-
status
|
|
197
|
-
data
|
|
392
|
+
status,
|
|
393
|
+
data,
|
|
394
|
+
error: status === RTP_STATUS.FAILED ? RTP_ERROR.BACKEND_REJECTED : undefined
|
|
198
395
|
});
|
|
199
396
|
} catch (err) {
|
|
200
397
|
logger('[react-native-rtp] decline failed:', err);
|
|
@@ -204,12 +401,16 @@ export function createRtpClient(options) {
|
|
|
204
401
|
return {
|
|
205
402
|
isRtp: isRtpPayload,
|
|
206
403
|
receive,
|
|
404
|
+
retrieve,
|
|
207
405
|
resumeAuth,
|
|
208
406
|
accept,
|
|
209
407
|
decline,
|
|
210
408
|
getStatus: id => entries.get(id)?.status,
|
|
211
409
|
getRequest: id => entries.get(id)?.request,
|
|
212
410
|
acknowledge: id => {
|
|
411
|
+
if (expiryTimerId === id) {
|
|
412
|
+
clearExpiryTimer();
|
|
413
|
+
}
|
|
213
414
|
entries.delete(id);
|
|
214
415
|
},
|
|
215
416
|
on: emitter.on
|
package/lib/module/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RTP_ERROR","RTP_EVENT","RTP_STATUS","createEmitter","defaultNow","noopLogger","findValidationErrors","isExpired","isRtpPayload","toRtpRequest","createRtpClient","options","transport","getAuthHeaders","getCurrentUser","now","logger","basePath","Error","emitter","entries","Map","setStatus","id","status","entry","get","emit","STATE","emitResult","result","RESULT","fail","error","FAILED","receive","payload","handled","rtpId","existing","request","errors","length","join","INVALID_PAYLOAD","set","RECEIVED","EXPIRED","currentUser","AWAITING_AUTH","recipient","RECIPIENT_MISMATCH","READY","REQUEST","resumeAuth","accept","params","credential","UNKNOWN","PROCESSING","headers","res","post","backendStatus","data","DECLINED","ACCEPTED","BACKEND_REJECTED","undefined","err","NETWORK_ERROR","decline","reason","isRtp","getStatus","getRequest","acknowledge","delete","on"],"sourceRoot":"../../src","sources":["client.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["RTP_ERROR","RTP_EVENT","RTP_STATUS","createEmitter","defaultNow","noopLogger","findValidationErrors","isExpired","isRtpPayload","mergeRequest","toRequestPatch","toRtpRequest","TERMINAL_STATUSES","Set","ACCEPTED","DECLINED","EXPIRED","FAILED","normalizeBackendStatus","raw","undefined","toUpperCase","PENDING","createRtpClient","options","transport","getCurrentUser","now","logger","basePath","emitter","entries","Map","expiryTimer","expiryTimerId","clearExpiryTimer","clearTimeout","scheduleExpiry","entry","expiry","Date","request","expiresAt","getTime","Number","isNaN","id","setTimeout","current","get","has","status","emitResult","Math","max","handle","unref","setStatus","emit","STATE","result","RESULT","fail","error","receive","payload","handled","rtpId","existing","errors","length","join","INVALID_PAYLOAD","RECEIVED","set","currentUser","AWAITING_AUTH","recipient","RECIPIENT_MISMATCH","READY","REQUEST","retrieve","UNKNOWN","RETRIEVING","headers","res","data","mapped","BACKEND_REJECTED","incoming","err","RETRIEVE_FAILED","resumeAuth","accept","params","credential","PROCESSING","post","hasStatus","NETWORK_ERROR","decline","reason","isRtp","getStatus","getRequest","acknowledge","delete","on"],"sourceRoot":"../../src","sources":["client.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/constants.js
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
export const RTP_STATUS = {
|
|
10
10
|
/** Payload arrived and passed validation, but is not yet actionable. */
|
|
11
11
|
RECEIVED: 'RECEIVED',
|
|
12
|
+
/** Authorization details are being fetched from the backend. */
|
|
13
|
+
RETRIEVING: 'RETRIEVING',
|
|
12
14
|
/** Expired before it could be actioned. */
|
|
13
15
|
EXPIRED: 'EXPIRED',
|
|
14
16
|
/** Valid, but the user is not authenticated yet (login gate). */
|
|
@@ -17,6 +19,8 @@ export const RTP_STATUS = {
|
|
|
17
19
|
READY: 'READY',
|
|
18
20
|
/** Accept/decline in flight. */
|
|
19
21
|
PROCESSING: 'PROCESSING',
|
|
22
|
+
/** Backend accepted the action but a final decision is still pending. */
|
|
23
|
+
PENDING: 'PENDING',
|
|
20
24
|
/** Backend confirmed acceptance. */
|
|
21
25
|
ACCEPTED: 'ACCEPTED',
|
|
22
26
|
/** Backend confirmed (or user initiated) a decline. */
|
|
@@ -37,6 +41,7 @@ export const RTP_EVENT = {
|
|
|
37
41
|
export const RTP_ERROR = {
|
|
38
42
|
INVALID_PAYLOAD: 'INVALID_PAYLOAD',
|
|
39
43
|
RECIPIENT_MISMATCH: 'RECIPIENT_MISMATCH',
|
|
44
|
+
RETRIEVE_FAILED: 'RETRIEVE_FAILED',
|
|
40
45
|
NETWORK_ERROR: 'NETWORK_ERROR',
|
|
41
46
|
BACKEND_REJECTED: 'BACKEND_REJECTED',
|
|
42
47
|
UNKNOWN: 'UNKNOWN'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RTP_STATUS","RECEIVED","EXPIRED","AWAITING_AUTH","READY","PROCESSING","ACCEPTED","DECLINED","FAILED","RTP_EVENT","REQUEST","STATE","RESULT","RTP_ERROR","INVALID_PAYLOAD","RECIPIENT_MISMATCH","NETWORK_ERROR","BACKEND_REJECTED","UNKNOWN"],"sourceRoot":"../../src","sources":["constants.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,UAAU,GAAG;EACxB;EACAC,QAAQ,EAAE,UAAU;EACpB;EACAC,OAAO,EAAE,SAAS;EAClB;EACAC,aAAa,EAAE,eAAe;EAC9B;EACAC,KAAK,EAAE,OAAO;EACd;EACAC,UAAU,EAAE,YAAY;EACxB;EACAC,QAAQ,EAAE,UAAU;EACpB;EACAC,QAAQ,EAAE,UAAU;EACpB;EACAC,MAAM,EAAE;AACV,CAAU;AAIV;AACA,OAAO,MAAMC,SAAS,GAAG;EACvB;EACAC,OAAO,EAAE,SAAS;EAClB;EACAC,KAAK,EAAE,OAAO;EACd;EACAC,MAAM,EAAE;AACV,CAAU;AAIV;AACA,OAAO,MAAMC,SAAS,GAAG;EACvBC,eAAe,EAAE,iBAAiB;EAClCC,kBAAkB,EAAE,oBAAoB;EACxCC,aAAa,EAAE,eAAe;EAC9BC,gBAAgB,EAAE,kBAAkB;EACpCC,OAAO,EAAE;AACX,CAAU","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["RTP_STATUS","RECEIVED","RETRIEVING","EXPIRED","AWAITING_AUTH","READY","PROCESSING","PENDING","ACCEPTED","DECLINED","FAILED","RTP_EVENT","REQUEST","STATE","RESULT","RTP_ERROR","INVALID_PAYLOAD","RECIPIENT_MISMATCH","RETRIEVE_FAILED","NETWORK_ERROR","BACKEND_REJECTED","UNKNOWN"],"sourceRoot":"../../src","sources":["constants.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,UAAU,GAAG;EACxB;EACAC,QAAQ,EAAE,UAAU;EACpB;EACAC,UAAU,EAAE,YAAY;EACxB;EACAC,OAAO,EAAE,SAAS;EAClB;EACAC,aAAa,EAAE,eAAe;EAC9B;EACAC,KAAK,EAAE,OAAO;EACd;EACAC,UAAU,EAAE,YAAY;EACxB;EACAC,OAAO,EAAE,SAAS;EAClB;EACAC,QAAQ,EAAE,UAAU;EACpB;EACAC,QAAQ,EAAE,UAAU;EACpB;EACAC,MAAM,EAAE;AACV,CAAU;AAIV;AACA,OAAO,MAAMC,SAAS,GAAG;EACvB;EACAC,OAAO,EAAE,SAAS;EAClB;EACAC,KAAK,EAAE,OAAO;EACd;EACAC,MAAM,EAAE;AACV,CAAU;AAIV;AACA,OAAO,MAAMC,SAAS,GAAG;EACvBC,eAAe,EAAE,iBAAiB;EAClCC,kBAAkB,EAAE,oBAAoB;EACxCC,eAAe,EAAE,iBAAiB;EAClCC,aAAa,EAAE,eAAe;EAC9BC,gBAAgB,EAAE,kBAAkB;EACpCC,OAAO,EAAE;AACX,CAAU","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
// Core (platform-agnostic)
|
|
4
|
-
export { createRtpClient } from "./client.js";
|
|
4
|
+
export { createRtpClient, normalizeBackendStatus } from "./client.js";
|
|
5
5
|
export { RTP_STATUS, RTP_EVENT, RTP_ERROR } from "./constants.js";
|
|
6
|
-
export { isRtpPayload, findValidationErrors, toRtpRequest, isExpired } from "./validate.js";
|
|
6
|
+
export { isRtpPayload, findValidationErrors, toRtpRequest, toRequestPatch, mergeRequest, isExpired } from "./validate.js";
|
|
7
7
|
export { mapPushToRtp } from "./push.js";
|
|
8
8
|
|
|
9
9
|
// Types
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createRtpClient","RTP_STATUS","RTP_EVENT","RTP_ERROR","isRtpPayload","findValidationErrors","toRtpRequest","isExpired","mapPushToRtp","RtpProvider","useRtp","RtpContext","createMockTransport","makeRtpPayload","makeExpiredPayload"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA,SAASA,eAAe,QAAQ,aAAU;
|
|
1
|
+
{"version":3,"names":["createRtpClient","normalizeBackendStatus","RTP_STATUS","RTP_EVENT","RTP_ERROR","isRtpPayload","findValidationErrors","toRtpRequest","toRequestPatch","mergeRequest","isExpired","mapPushToRtp","RtpProvider","useRtp","RtpContext","createMockTransport","makeRtpPayload","makeExpiredPayload"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA,SAASA,eAAe,EAAEC,sBAAsB,QAAQ,aAAU;AAClE,SAASC,UAAU,EAAEC,SAAS,EAAEC,SAAS,QAAQ,gBAAa;AAE9D,SACEC,YAAY,EACZC,oBAAoB,EACpBC,YAAY,EACZC,cAAc,EACdC,YAAY,EACZC,SAAS,QACJ,eAAY;AACnB,SAASC,YAAY,QAAQ,WAAQ;;AAGrC;;AAiBA;AACA,SAASC,WAAW,EAAEC,MAAM,EAAEC,UAAU,QAAQ,wBAAqB;AAGrE;AACA,SAASC,mBAAmB,QAAQ,yBAAsB;AAM1D,SAASC,cAAc,EAAEC,kBAAkB,QAAQ,0BAAuB","ignoreList":[]}
|
|
@@ -24,6 +24,9 @@ export function makeRtpPayload(overrides = {}) {
|
|
|
24
24
|
currency: 'NGN',
|
|
25
25
|
narration: 'Payment for invoice 1042',
|
|
26
26
|
transactionRef: `TRX-${from}-${counter}`,
|
|
27
|
+
orderNumber: `ORD-${from}-${counter}`,
|
|
28
|
+
deepLink: `quickteller://rtp/${from}-${counter}`,
|
|
29
|
+
actionMessage: 'Review and approve this payment request',
|
|
27
30
|
recipient: 'john.doe@quickteller.com',
|
|
28
31
|
expiresAt: new Date(from + expiresInMs).toISOString(),
|
|
29
32
|
payer: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MINUTE","counter","makeRtpPayload","overrides","payer","payee","expiresInMs","from","Date","now","rest","version","type","rtpId","amount","currency","narration","transactionRef","recipient","expiresAt","toISOString","name","accountNumber","bank","makeExpiredPayload"],"sourceRoot":"../../../src","sources":["mock/makeRtpPayload.ts"],"mappings":";;AAEA;AACA,MAAMA,MAAM,GAAG,MAAM;AAErB,IAAIC,OAAO,GAAG,CAAC;AAaf;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAC5BC,SAAkC,GAAG,CAAC,CAAC,EAC3B;EACZ,MAAM;IACJC,KAAK;IACLC,KAAK;IACLC,WAAW,GAAG,EAAE,GAAGN,MAAM;IACzBO,IAAI,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;IACjB,GAAGC;EACL,CAAC,GAAGP,SAAS;EAEbF,OAAO,IAAI,CAAC;EAEZ,OAAO;IACLU,OAAO,EAAE,KAAK;IACdC,IAAI,EAAE,KAAK;IACXC,KAAK,EAAE,OAAON,IAAI,IAAIN,OAAO,EAAE;IAC/Ba,MAAM,EAAE,MAAM;IACdC,QAAQ,EAAE,KAAK;IACfC,SAAS,EAAE,0BAA0B;IACrCC,cAAc,EAAE,OAAOV,IAAI,IAAIN,OAAO,EAAE;IACxCiB,SAAS,EAAE,0BAA0B;IACrCC,SAAS,EAAE,
|
|
1
|
+
{"version":3,"names":["MINUTE","counter","makeRtpPayload","overrides","payer","payee","expiresInMs","from","Date","now","rest","version","type","rtpId","amount","currency","narration","transactionRef","orderNumber","deepLink","actionMessage","recipient","expiresAt","toISOString","name","accountNumber","bank","makeExpiredPayload"],"sourceRoot":"../../../src","sources":["mock/makeRtpPayload.ts"],"mappings":";;AAEA;AACA,MAAMA,MAAM,GAAG,MAAM;AAErB,IAAIC,OAAO,GAAG,CAAC;AAaf;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAC5BC,SAAkC,GAAG,CAAC,CAAC,EAC3B;EACZ,MAAM;IACJC,KAAK;IACLC,KAAK;IACLC,WAAW,GAAG,EAAE,GAAGN,MAAM;IACzBO,IAAI,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;IACjB,GAAGC;EACL,CAAC,GAAGP,SAAS;EAEbF,OAAO,IAAI,CAAC;EAEZ,OAAO;IACLU,OAAO,EAAE,KAAK;IACdC,IAAI,EAAE,KAAK;IACXC,KAAK,EAAE,OAAON,IAAI,IAAIN,OAAO,EAAE;IAC/Ba,MAAM,EAAE,MAAM;IACdC,QAAQ,EAAE,KAAK;IACfC,SAAS,EAAE,0BAA0B;IACrCC,cAAc,EAAE,OAAOV,IAAI,IAAIN,OAAO,EAAE;IACxCiB,WAAW,EAAE,OAAOX,IAAI,IAAIN,OAAO,EAAE;IACrCkB,QAAQ,EAAE,qBAAqBZ,IAAI,IAAIN,OAAO,EAAE;IAChDmB,aAAa,EAAE,yCAAyC;IACxDC,SAAS,EAAE,0BAA0B;IACrCC,SAAS,EAAE,IAAId,IAAI,CAACD,IAAI,GAAGD,WAAW,CAAC,CAACiB,WAAW,CAAC,CAAC;IACrDnB,KAAK,EAAE;MACLoB,IAAI,EAAE,kBAAkB;MACxBC,aAAa,EAAE,YAAY;MAC3BC,IAAI,EAAE,iBAAiB;MACvB,GAAGtB;IACL,CAAC;IACDC,KAAK,EAAE;MACLmB,IAAI,EAAE,mBAAmB;MACzBC,aAAa,EAAE,YAAY;MAC3B,GAAGpB;IACL,CAAC;IACD,GAAGK;EACL,CAAC;AACH;;AAEA;AACA,OAAO,SAASiB,kBAAkBA,CAChCxB,SAAkC,GAAG,CAAC,CAAC,EAC3B;EACZ,OAAOD,cAAc,CAAC;IAAE,GAAGC,SAAS;IAAEG,WAAW,EAAE,CAACN;EAAO,CAAC,CAAC;AAC/D","ignoreList":[]}
|
|
@@ -13,7 +13,10 @@ export function createMockTransport(options = {}) {
|
|
|
13
13
|
latencyMs = 250,
|
|
14
14
|
failAccept = false,
|
|
15
15
|
failDecline = false,
|
|
16
|
-
|
|
16
|
+
failRetrieve = false,
|
|
17
|
+
acceptStatus = 'ACCEPTED',
|
|
18
|
+
retrieveStatus = 'READY',
|
|
19
|
+
retrieveRequest
|
|
17
20
|
} = options;
|
|
18
21
|
const calls = [];
|
|
19
22
|
const delay = () => new Promise(resolve => setTimeout(resolve, latencyMs));
|
|
@@ -62,11 +65,15 @@ export function createMockTransport(options = {}) {
|
|
|
62
65
|
headers
|
|
63
66
|
});
|
|
64
67
|
await delay();
|
|
68
|
+
if (failRetrieve) {
|
|
69
|
+
throw new Error('Mock network failure on retrieve');
|
|
70
|
+
}
|
|
65
71
|
return {
|
|
66
72
|
status: 200,
|
|
67
73
|
data: {
|
|
68
74
|
id: extractId(path),
|
|
69
|
-
status:
|
|
75
|
+
status: retrieveStatus,
|
|
76
|
+
request: retrieveRequest
|
|
70
77
|
}
|
|
71
78
|
};
|
|
72
79
|
}
|