@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.
Files changed (39) hide show
  1. package/README.md +57 -23
  2. package/lib/module/client.js +218 -17
  3. package/lib/module/client.js.map +1 -1
  4. package/lib/module/constants.js +5 -0
  5. package/lib/module/constants.js.map +1 -1
  6. package/lib/module/index.js +2 -2
  7. package/lib/module/index.js.map +1 -1
  8. package/lib/module/mock/makeRtpPayload.js +3 -0
  9. package/lib/module/mock/makeRtpPayload.js.map +1 -1
  10. package/lib/module/mock/mockTransport.js +9 -2
  11. package/lib/module/mock/mockTransport.js.map +1 -1
  12. package/lib/module/react/RtpProvider.js +13 -3
  13. package/lib/module/react/RtpProvider.js.map +1 -1
  14. package/lib/module/validate.js +42 -0
  15. package/lib/module/validate.js.map +1 -1
  16. package/lib/typescript/src/client.d.ts +12 -3
  17. package/lib/typescript/src/client.d.ts.map +1 -1
  18. package/lib/typescript/src/constants.d.ts +5 -0
  19. package/lib/typescript/src/constants.d.ts.map +1 -1
  20. package/lib/typescript/src/index.d.ts +2 -2
  21. package/lib/typescript/src/index.d.ts.map +1 -1
  22. package/lib/typescript/src/mock/makeRtpPayload.d.ts.map +1 -1
  23. package/lib/typescript/src/mock/mockTransport.d.ts +7 -1
  24. package/lib/typescript/src/mock/mockTransport.d.ts.map +1 -1
  25. package/lib/typescript/src/react/RtpProvider.d.ts +6 -2
  26. package/lib/typescript/src/react/RtpProvider.d.ts.map +1 -1
  27. package/lib/typescript/src/types.d.ts +22 -5
  28. package/lib/typescript/src/types.d.ts.map +1 -1
  29. package/lib/typescript/src/validate.d.ts +11 -0
  30. package/lib/typescript/src/validate.d.ts.map +1 -1
  31. package/package.json +1 -1
  32. package/src/client.ts +227 -20
  33. package/src/constants.ts +5 -0
  34. package/src/index.tsx +3 -1
  35. package/src/mock/makeRtpPayload.ts +3 -0
  36. package/src/mock/mockTransport.ts +18 -2
  37. package/src/react/RtpProvider.tsx +40 -5
  38. package/src/types.ts +22 -6
  39. 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: string; // decimal string, e.g. "5000.00"
55
+ amount: number; // minor unit (e.g. kobo); integer, no floats
56
56
  currency: string; // ISO 4217, e.g. "NGN"
57
- merchant: { name: string; accountNumber?: string; bank?: string; logoUrl?: string };
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 seams)
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
- // (optional) REST base path, default "/rtp"
107
- basePath: '/rtp',
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.merchant.name}</Text>
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
- `RtpError` values: `INVALID_PAYLOAD`, `RECIPIENT_MISMATCH`, `NETWORK_ERROR`,
208
- `BACKEND_REJECTED`, `UNKNOWN`.
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 re-checked on every transition** — a request can expire while the
267
- sheet is open; `accept` refuses and reports `EXPIRED`.
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
@@ -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/status calls. It owns no UI, no navigation and no crypto.
11
- * Every external effect is injected so the same contract can be re-implemented
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
- entries.set(id, {
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 = await getAuthHeaders();
339
+ const headers = {};
163
340
  const res = await transport.post(`${basePath}/${id}/accept`, {
164
341
  credential
165
342
  }, headers);
166
- const backendStatus = res?.data?.status;
167
- const status = backendStatus === 'DECLINED' ? RTP_STATUS.DECLINED : backendStatus === 'FAILED' ? RTP_STATUS.FAILED : RTP_STATUS.ACCEPTED;
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: res?.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 = await getAuthHeaders();
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: RTP_STATUS.DECLINED,
197
- data: res?.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
@@ -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":[]}
@@ -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":[]}
@@ -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
@@ -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;AAC1C,SAASC,UAAU,EAAEC,SAAS,EAAEC,SAAS,QAAQ,gBAAa;AAE9D,SACEC,YAAY,EACZC,oBAAoB,EACpBC,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":[]}
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,IAAIX,IAAI,CAACD,IAAI,GAAGD,WAAW,CAAC,CAACc,WAAW,CAAC,CAAC;IACrDhB,KAAK,EAAE;MACLiB,IAAI,EAAE,kBAAkB;MACxBC,aAAa,EAAE,YAAY;MAC3BC,IAAI,EAAE,iBAAiB;MACvB,GAAGnB;IACL,CAAC;IACDC,KAAK,EAAE;MACLgB,IAAI,EAAE,mBAAmB;MACzBC,aAAa,EAAE,YAAY;MAC3B,GAAGjB;IACL,CAAC;IACD,GAAGK;EACL,CAAC;AACH;;AAEA;AACA,OAAO,SAASc,kBAAkBA,CAChCrB,SAAkC,GAAG,CAAC,CAAC,EAC3B;EACZ,OAAOD,cAAc,CAAC;IAAE,GAAGC,SAAS;IAAEG,WAAW,EAAE,CAACN;EAAO,CAAC,CAAC;AAC/D","ignoreList":[]}
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
- acceptStatus = 'ACCEPTED'
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: 'PENDING'
75
+ status: retrieveStatus,
76
+ request: retrieveRequest
70
77
  }
71
78
  };
72
79
  }