@inno-isw/react-native-rtp 0.0.0-stage → 0.2.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/LICENSE +20 -0
- package/README.md +385 -2
- package/lib/module/client.js +391 -0
- package/lib/module/client.js.map +1 -0
- package/lib/module/constants.js +49 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/emitter.js +46 -0
- package/lib/module/emitter.js.map +1 -0
- package/lib/module/index.js +16 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/mock/makeRtpPayload.js +54 -0
- package/lib/module/mock/makeRtpPayload.js.map +1 -0
- package/lib/module/mock/mockTransport.js +89 -0
- package/lib/module/mock/mockTransport.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/push.js +96 -0
- package/lib/module/push.js.map +1 -0
- package/lib/module/react/RtpProvider.js +152 -0
- package/lib/module/react/RtpProvider.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/validate.js +122 -0
- package/lib/module/validate.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/client.d.ts +20 -0
- package/lib/typescript/src/client.d.ts.map +1 -0
- package/lib/typescript/src/constants.d.ts +50 -0
- package/lib/typescript/src/constants.d.ts.map +1 -0
- package/lib/typescript/src/emitter.d.ts +15 -0
- package/lib/typescript/src/emitter.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +14 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/mock/makeRtpPayload.d.ts +17 -0
- package/lib/typescript/src/mock/makeRtpPayload.d.ts.map +1 -0
- package/lib/typescript/src/mock/mockTransport.d.ts +35 -0
- package/lib/typescript/src/mock/mockTransport.d.ts.map +1 -0
- package/lib/typescript/src/push.d.ts +41 -0
- package/lib/typescript/src/push.d.ts.map +1 -0
- package/lib/typescript/src/react/RtpProvider.d.ts +60 -0
- package/lib/typescript/src/react/RtpProvider.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +153 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/validate.d.ts +33 -0
- package/lib/typescript/src/validate.d.ts.map +1 -0
- package/package.json +141 -4
- package/src/client.ts +428 -0
- package/src/constants.ts +54 -0
- package/src/emitter.ts +53 -0
- package/src/index.tsx +45 -0
- package/src/mock/makeRtpPayload.ts +69 -0
- package/src/mock/mockTransport.ts +119 -0
- package/src/push.ts +109 -0
- package/src/react/RtpProvider.tsx +235 -0
- package/src/types.ts +172 -0
- package/src/validate.ts +141 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { RTP_ERROR, RTP_EVENT, RTP_STATUS } from "./constants.js";
|
|
4
|
+
import { createEmitter, defaultNow, noopLogger } from "./emitter.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
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Create a portable Request-to-Pay client.
|
|
44
|
+
*
|
|
45
|
+
* The client owns validation, de-duplication, expiry, status computation and
|
|
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.
|
|
49
|
+
*/
|
|
50
|
+
export function createRtpClient(options) {
|
|
51
|
+
const {
|
|
52
|
+
transport,
|
|
53
|
+
getAuthHeaders = async () => ({}),
|
|
54
|
+
getCurrentUser = () => null,
|
|
55
|
+
now = defaultNow,
|
|
56
|
+
logger = noopLogger,
|
|
57
|
+
basePath = '/rtp'
|
|
58
|
+
} = options;
|
|
59
|
+
if (!transport) {
|
|
60
|
+
throw new Error('[react-native-rtp] `transport` is required');
|
|
61
|
+
}
|
|
62
|
+
const emitter = createEmitter();
|
|
63
|
+
const entries = new Map();
|
|
64
|
+
|
|
65
|
+
// --- expiry scheduling --------------------------------------------------
|
|
66
|
+
// Expiry is not only evaluated lazily: an inactive timer fires at `expiresAt`
|
|
67
|
+
// so a request cannot remain actionable after it has lapsed (INDV-3807/3808).
|
|
68
|
+
let expiryTimer;
|
|
69
|
+
let expiryTimerId;
|
|
70
|
+
function clearExpiryTimer() {
|
|
71
|
+
if (expiryTimer !== undefined) {
|
|
72
|
+
clearTimeout(expiryTimer);
|
|
73
|
+
}
|
|
74
|
+
expiryTimer = undefined;
|
|
75
|
+
expiryTimerId = undefined;
|
|
76
|
+
}
|
|
77
|
+
function scheduleExpiry(entry) {
|
|
78
|
+
clearExpiryTimer();
|
|
79
|
+
const expiry = new Date(entry.request.expiresAt).getTime();
|
|
80
|
+
if (Number.isNaN(expiry)) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const id = entry.request.id;
|
|
84
|
+
expiryTimerId = id;
|
|
85
|
+
expiryTimer = setTimeout(() => {
|
|
86
|
+
const current = entries.get(id);
|
|
87
|
+
if (!current || TERMINAL_STATUSES.has(current.status)) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
logger('[react-native-rtp] request expired:', id);
|
|
91
|
+
emitResult({
|
|
92
|
+
id,
|
|
93
|
+
status: RTP_STATUS.EXPIRED
|
|
94
|
+
});
|
|
95
|
+
}, Math.max(0, expiry - now()));
|
|
96
|
+
|
|
97
|
+
// Never keep a Node process (e.g. Jest) alive for a pending expiry.
|
|
98
|
+
const handle = expiryTimer;
|
|
99
|
+
if (typeof handle?.unref === 'function') {
|
|
100
|
+
handle.unref();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function setStatus(id, status) {
|
|
104
|
+
const entry = entries.get(id);
|
|
105
|
+
if (entry) {
|
|
106
|
+
entry.status = status;
|
|
107
|
+
}
|
|
108
|
+
if (TERMINAL_STATUSES.has(status) && expiryTimerId === id) {
|
|
109
|
+
clearExpiryTimer();
|
|
110
|
+
}
|
|
111
|
+
emitter.emit(RTP_EVENT.STATE, {
|
|
112
|
+
id,
|
|
113
|
+
status
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
function emitResult(result) {
|
|
117
|
+
setStatus(result.id, result.status);
|
|
118
|
+
emitter.emit(RTP_EVENT.RESULT, result);
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
function fail(id, error) {
|
|
122
|
+
return emitResult({
|
|
123
|
+
id,
|
|
124
|
+
status: RTP_STATUS.FAILED,
|
|
125
|
+
error
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
async function receive(payload) {
|
|
129
|
+
if (!isRtpPayload(payload)) {
|
|
130
|
+
return {
|
|
131
|
+
handled: false
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const id = payload.rtpId;
|
|
135
|
+
|
|
136
|
+
// Idempotency: the same request can arrive twice (foreground + background,
|
|
137
|
+
// or a double tap). Never re-emit for an id we have already seen.
|
|
138
|
+
const existing = entries.get(id);
|
|
139
|
+
if (existing) {
|
|
140
|
+
return {
|
|
141
|
+
handled: true,
|
|
142
|
+
request: existing.request,
|
|
143
|
+
status: existing.status
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const errors = findValidationErrors(payload);
|
|
147
|
+
if (errors.length > 0) {
|
|
148
|
+
logger('[react-native-rtp] invalid payload, missing:', errors.join(', '));
|
|
149
|
+
return {
|
|
150
|
+
handled: true,
|
|
151
|
+
error: RTP_ERROR.INVALID_PAYLOAD
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const request = toRtpRequest(payload);
|
|
155
|
+
const entry = {
|
|
156
|
+
request,
|
|
157
|
+
status: RTP_STATUS.RECEIVED
|
|
158
|
+
};
|
|
159
|
+
entries.set(id, entry);
|
|
160
|
+
if (isExpired(request, now())) {
|
|
161
|
+
const result = emitResult({
|
|
162
|
+
id,
|
|
163
|
+
status: RTP_STATUS.EXPIRED
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
handled: true,
|
|
167
|
+
request,
|
|
168
|
+
status: result.status
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const currentUser = getCurrentUser();
|
|
172
|
+
if (!currentUser) {
|
|
173
|
+
setStatus(id, RTP_STATUS.AWAITING_AUTH);
|
|
174
|
+
scheduleExpiry(entry);
|
|
175
|
+
return {
|
|
176
|
+
handled: true,
|
|
177
|
+
request,
|
|
178
|
+
status: RTP_STATUS.AWAITING_AUTH
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (request.recipient && currentUser !== request.recipient) {
|
|
182
|
+
const result = fail(id, RTP_ERROR.RECIPIENT_MISMATCH);
|
|
183
|
+
return {
|
|
184
|
+
handled: true,
|
|
185
|
+
request,
|
|
186
|
+
status: result.status,
|
|
187
|
+
error: result.error
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
setStatus(id, RTP_STATUS.READY);
|
|
191
|
+
scheduleExpiry(entry);
|
|
192
|
+
emitter.emit(RTP_EVENT.REQUEST, request);
|
|
193
|
+
return {
|
|
194
|
+
handled: true,
|
|
195
|
+
request,
|
|
196
|
+
status: RTP_STATUS.READY
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Fetch (or refresh) authorization details for a request from the backend,
|
|
202
|
+
* and reconcile the backend status. This is the "retrieve details" step the
|
|
203
|
+
* authorization page needs before it can be trusted (INDV-3804).
|
|
204
|
+
*/
|
|
205
|
+
async function retrieve(id) {
|
|
206
|
+
const entry = entries.get(id);
|
|
207
|
+
if (!entry) {
|
|
208
|
+
return fail(id, RTP_ERROR.UNKNOWN);
|
|
209
|
+
}
|
|
210
|
+
if (isExpired(entry.request, now())) {
|
|
211
|
+
return emitResult({
|
|
212
|
+
id,
|
|
213
|
+
status: RTP_STATUS.EXPIRED
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (TERMINAL_STATUSES.has(entry.status)) {
|
|
217
|
+
return {
|
|
218
|
+
id,
|
|
219
|
+
status: entry.status
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
setStatus(id, RTP_STATUS.RETRIEVING);
|
|
223
|
+
try {
|
|
224
|
+
const headers = await getAuthHeaders();
|
|
225
|
+
const res = await transport.get(`${basePath}/${id}`, headers);
|
|
226
|
+
const data = res?.data ?? {};
|
|
227
|
+
const mapped = normalizeBackendStatus(data.status);
|
|
228
|
+
if (mapped === RTP_STATUS.EXPIRED || mapped === RTP_STATUS.DECLINED || mapped === RTP_STATUS.FAILED) {
|
|
229
|
+
return emitResult({
|
|
230
|
+
id,
|
|
231
|
+
status: mapped,
|
|
232
|
+
data,
|
|
233
|
+
error: mapped === RTP_STATUS.FAILED ? RTP_ERROR.BACKEND_REJECTED : undefined
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
if (mapped === RTP_STATUS.ACCEPTED) {
|
|
237
|
+
return emitResult({
|
|
238
|
+
id,
|
|
239
|
+
status: RTP_STATUS.ACCEPTED,
|
|
240
|
+
data
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
if (mapped === RTP_STATUS.PENDING) {
|
|
244
|
+
return emitResult({
|
|
245
|
+
id,
|
|
246
|
+
status: RTP_STATUS.PENDING,
|
|
247
|
+
data
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Merge any returned details (a full payload, or nested under `request`).
|
|
252
|
+
const incoming = data.request ?? data;
|
|
253
|
+
if (incoming && typeof incoming === 'object') {
|
|
254
|
+
entry.request = mergeRequest(entry.request, toRequestPatch(incoming));
|
|
255
|
+
}
|
|
256
|
+
if (isExpired(entry.request, now())) {
|
|
257
|
+
return emitResult({
|
|
258
|
+
id,
|
|
259
|
+
status: RTP_STATUS.EXPIRED
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
setStatus(id, RTP_STATUS.READY);
|
|
263
|
+
scheduleExpiry(entry);
|
|
264
|
+
emitter.emit(RTP_EVENT.REQUEST, entry.request);
|
|
265
|
+
return {
|
|
266
|
+
id,
|
|
267
|
+
status: RTP_STATUS.READY,
|
|
268
|
+
data
|
|
269
|
+
};
|
|
270
|
+
} catch (err) {
|
|
271
|
+
logger('[react-native-rtp] retrieve failed:', err);
|
|
272
|
+
return fail(id, RTP_ERROR.RETRIEVE_FAILED);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Called by the host after a successful login to release any requests that
|
|
278
|
+
* were waiting on the auth gate.
|
|
279
|
+
*/
|
|
280
|
+
function resumeAuth() {
|
|
281
|
+
for (const [id, entry] of entries) {
|
|
282
|
+
if (entry.status !== RTP_STATUS.AWAITING_AUTH) {
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
if (isExpired(entry.request, now())) {
|
|
286
|
+
const result = emitResult({
|
|
287
|
+
id,
|
|
288
|
+
status: RTP_STATUS.EXPIRED
|
|
289
|
+
});
|
|
290
|
+
logger('[react-native-rtp] request expired while awaiting auth:', id, result.status);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
const currentUser = getCurrentUser();
|
|
294
|
+
if (entry.request.recipient && currentUser && currentUser !== entry.request.recipient) {
|
|
295
|
+
fail(id, RTP_ERROR.RECIPIENT_MISMATCH);
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
setStatus(id, RTP_STATUS.READY);
|
|
299
|
+
scheduleExpiry(entry);
|
|
300
|
+
emitter.emit(RTP_EVENT.REQUEST, entry.request);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
async function accept(params) {
|
|
304
|
+
const {
|
|
305
|
+
id,
|
|
306
|
+
credential
|
|
307
|
+
} = params;
|
|
308
|
+
const entry = entries.get(id);
|
|
309
|
+
if (!entry) {
|
|
310
|
+
return fail(id, RTP_ERROR.UNKNOWN);
|
|
311
|
+
}
|
|
312
|
+
if (isExpired(entry.request, now())) {
|
|
313
|
+
return emitResult({
|
|
314
|
+
id,
|
|
315
|
+
status: RTP_STATUS.EXPIRED
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
setStatus(id, RTP_STATUS.PROCESSING);
|
|
319
|
+
try {
|
|
320
|
+
const headers = await getAuthHeaders();
|
|
321
|
+
const res = await transport.post(`${basePath}/${id}/accept`, {
|
|
322
|
+
credential
|
|
323
|
+
}, headers);
|
|
324
|
+
const data = res?.data ?? {};
|
|
325
|
+
|
|
326
|
+
// If the backend returned a status we recognise, honour it. If it
|
|
327
|
+
// returned no status at all, the accept call itself succeeded. If it
|
|
328
|
+
// returned a status we do NOT understand, fail closed rather than
|
|
329
|
+
// showing the customer an approved payment we cannot vouch for.
|
|
330
|
+
const hasStatus = data.status !== undefined && data.status !== null;
|
|
331
|
+
const mapped = normalizeBackendStatus(data.status);
|
|
332
|
+
const status = hasStatus ? mapped ?? RTP_STATUS.FAILED : RTP_STATUS.ACCEPTED;
|
|
333
|
+
return emitResult({
|
|
334
|
+
id,
|
|
335
|
+
status,
|
|
336
|
+
data,
|
|
337
|
+
error: status === RTP_STATUS.FAILED ? RTP_ERROR.BACKEND_REJECTED : undefined
|
|
338
|
+
});
|
|
339
|
+
} catch (err) {
|
|
340
|
+
logger('[react-native-rtp] accept failed:', err);
|
|
341
|
+
return fail(id, RTP_ERROR.NETWORK_ERROR);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
async function decline(params) {
|
|
345
|
+
const {
|
|
346
|
+
id,
|
|
347
|
+
reason
|
|
348
|
+
} = params;
|
|
349
|
+
const entry = entries.get(id);
|
|
350
|
+
if (!entry) {
|
|
351
|
+
return fail(id, RTP_ERROR.UNKNOWN);
|
|
352
|
+
}
|
|
353
|
+
setStatus(id, RTP_STATUS.PROCESSING);
|
|
354
|
+
try {
|
|
355
|
+
const headers = await getAuthHeaders();
|
|
356
|
+
const res = await transport.post(`${basePath}/${id}/decline`, {
|
|
357
|
+
reason
|
|
358
|
+
}, headers);
|
|
359
|
+
const data = res?.data ?? {};
|
|
360
|
+
const mapped = normalizeBackendStatus(data.status);
|
|
361
|
+
const status = mapped === RTP_STATUS.EXPIRED || mapped === RTP_STATUS.FAILED ? mapped : RTP_STATUS.DECLINED;
|
|
362
|
+
return emitResult({
|
|
363
|
+
id,
|
|
364
|
+
status,
|
|
365
|
+
data,
|
|
366
|
+
error: status === RTP_STATUS.FAILED ? RTP_ERROR.BACKEND_REJECTED : undefined
|
|
367
|
+
});
|
|
368
|
+
} catch (err) {
|
|
369
|
+
logger('[react-native-rtp] decline failed:', err);
|
|
370
|
+
return fail(id, RTP_ERROR.NETWORK_ERROR);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
isRtp: isRtpPayload,
|
|
375
|
+
receive,
|
|
376
|
+
retrieve,
|
|
377
|
+
resumeAuth,
|
|
378
|
+
accept,
|
|
379
|
+
decline,
|
|
380
|
+
getStatus: id => entries.get(id)?.status,
|
|
381
|
+
getRequest: id => entries.get(id)?.request,
|
|
382
|
+
acknowledge: id => {
|
|
383
|
+
if (expiryTimerId === id) {
|
|
384
|
+
clearExpiryTimer();
|
|
385
|
+
}
|
|
386
|
+
entries.delete(id);
|
|
387
|
+
},
|
|
388
|
+
on: emitter.on
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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","getAuthHeaders","getCurrentUser","now","logger","basePath","Error","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":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Normalized RTP status.
|
|
5
|
+
*
|
|
6
|
+
* The SDK is the single source of truth for these values so that every host
|
|
7
|
+
* platform (React Native, Kotlin, Swift) renders the same UI states.
|
|
8
|
+
*/
|
|
9
|
+
export const RTP_STATUS = {
|
|
10
|
+
/** Payload arrived and passed validation, but is not yet actionable. */
|
|
11
|
+
RECEIVED: 'RECEIVED',
|
|
12
|
+
/** Authorization details are being fetched from the backend. */
|
|
13
|
+
RETRIEVING: 'RETRIEVING',
|
|
14
|
+
/** Expired before it could be actioned. */
|
|
15
|
+
EXPIRED: 'EXPIRED',
|
|
16
|
+
/** Valid, but the user is not authenticated yet (login gate). */
|
|
17
|
+
AWAITING_AUTH: 'AWAITING_AUTH',
|
|
18
|
+
/** Valid, authenticated, and ready for the user to accept/decline. */
|
|
19
|
+
READY: 'READY',
|
|
20
|
+
/** Accept/decline in flight. */
|
|
21
|
+
PROCESSING: 'PROCESSING',
|
|
22
|
+
/** Backend accepted the action but a final decision is still pending. */
|
|
23
|
+
PENDING: 'PENDING',
|
|
24
|
+
/** Backend confirmed acceptance. */
|
|
25
|
+
ACCEPTED: 'ACCEPTED',
|
|
26
|
+
/** Backend confirmed (or user initiated) a decline. */
|
|
27
|
+
DECLINED: 'DECLINED',
|
|
28
|
+
/** Terminal failure (network, validation, recipient mismatch, etc.). */
|
|
29
|
+
FAILED: 'FAILED'
|
|
30
|
+
};
|
|
31
|
+
/** Events emitted by the client. */
|
|
32
|
+
export const RTP_EVENT = {
|
|
33
|
+
/** A new, actionable request is available. */
|
|
34
|
+
REQUEST: 'request',
|
|
35
|
+
/** Status transition for a request. */
|
|
36
|
+
STATE: 'state',
|
|
37
|
+
/** Terminal outcome for a request. */
|
|
38
|
+
RESULT: 'result'
|
|
39
|
+
};
|
|
40
|
+
/** Reasons a request can end in FAILED, exposed for UI/diagnostics. */
|
|
41
|
+
export const RTP_ERROR = {
|
|
42
|
+
INVALID_PAYLOAD: 'INVALID_PAYLOAD',
|
|
43
|
+
RECIPIENT_MISMATCH: 'RECIPIENT_MISMATCH',
|
|
44
|
+
RETRIEVE_FAILED: 'RETRIEVE_FAILED',
|
|
45
|
+
NETWORK_ERROR: 'NETWORK_ERROR',
|
|
46
|
+
BACKEND_REJECTED: 'BACKEND_REJECTED',
|
|
47
|
+
UNKNOWN: 'UNKNOWN'
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tiny typed event emitter. Deliberately dependency-free so the same contract
|
|
5
|
+
* is trivial to re-implement in Kotlin/Swift.
|
|
6
|
+
*/
|
|
7
|
+
export function createEmitter() {
|
|
8
|
+
const listeners = {
|
|
9
|
+
request: new Set(),
|
|
10
|
+
state: new Set(),
|
|
11
|
+
result: new Set()
|
|
12
|
+
};
|
|
13
|
+
function on(event, handler) {
|
|
14
|
+
const set = listeners[event];
|
|
15
|
+
if (!set) {
|
|
16
|
+
throw new Error(`[react-native-rtp] Unknown event: ${String(event)}`);
|
|
17
|
+
}
|
|
18
|
+
set.add(handler);
|
|
19
|
+
return () => {
|
|
20
|
+
set.delete(handler);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function emit(event, payload) {
|
|
24
|
+
// Copy to a snapshot so handlers can unsubscribe during emit.
|
|
25
|
+
for (const handler of Array.from(listeners[event])) {
|
|
26
|
+
handler(payload);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function clear() {
|
|
30
|
+
listeners.request.clear();
|
|
31
|
+
listeners.state.clear();
|
|
32
|
+
listeners.result.clear();
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
on,
|
|
36
|
+
emit,
|
|
37
|
+
clear
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Default logger used when the host does not provide one. */
|
|
42
|
+
export const noopLogger = () => {};
|
|
43
|
+
|
|
44
|
+
/** Default clock. */
|
|
45
|
+
export const defaultNow = () => Date.now();
|
|
46
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createEmitter","listeners","request","Set","state","result","on","event","handler","set","Error","String","add","delete","emit","payload","Array","from","clear","noopLogger","defaultNow","Date","now"],"sourceRoot":"../../src","sources":["emitter.ts"],"mappings":";;AAIA;AACA;AACA;AACA;AACA,OAAO,SAASA,aAAaA,CAAA,EAAG;EAC9B,MAAMC,SAAqD,GAAG;IAC5DC,OAAO,EAAE,IAAIC,GAAG,CAAC,CAAC;IAClBC,KAAK,EAAE,IAAID,GAAG,CAAC,CAAC;IAChBE,MAAM,EAAE,IAAIF,GAAG,CAAC;EAClB,CAAC;EAED,SAASG,EAAEA,CACTC,KAAQ,EACRC,OAAuB,EACP;IAChB,MAAMC,GAAG,GAAGR,SAAS,CAACM,KAAK,CAAC;IAC5B,IAAI,CAACE,GAAG,EAAE;MACR,MAAM,IAAIC,KAAK,CAAC,qCAAqCC,MAAM,CAACJ,KAAK,CAAC,EAAE,CAAC;IACvE;IACAE,GAAG,CAACG,GAAG,CAACJ,OAAqB,CAAC;IAC9B,OAAO,MAAM;MACXC,GAAG,CAACI,MAAM,CAACL,OAAqB,CAAC;IACnC,CAAC;EACH;EAEA,SAASM,IAAIA,CACXP,KAAQ,EACRQ,OAAsC,EAChC;IACN;IACA,KAAK,MAAMP,OAAO,IAAIQ,KAAK,CAACC,IAAI,CAAChB,SAAS,CAACM,KAAK,CAAC,CAAC,EAAE;MAClDC,OAAO,CAACO,OAAO,CAAC;IAClB;EACF;EAEA,SAASG,KAAKA,CAAA,EAAS;IACrBjB,SAAS,CAACC,OAAO,CAACgB,KAAK,CAAC,CAAC;IACzBjB,SAAS,CAACG,KAAK,CAACc,KAAK,CAAC,CAAC;IACvBjB,SAAS,CAACI,MAAM,CAACa,KAAK,CAAC,CAAC;EAC1B;EAEA,OAAO;IAAEZ,EAAE;IAAEQ,IAAI;IAAEI;EAAM,CAAC;AAC5B;;AAEA;AACA,OAAO,MAAMC,UAAmD,GAAGA,CAAA,KAAM,CAAC,CAAC;;AAE3E;AACA,OAAO,MAAMC,UAAU,GAAGA,CAAA,KAAMC,IAAI,CAACC,GAAG,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// Core (platform-agnostic)
|
|
4
|
+
export { createRtpClient, normalizeBackendStatus } from "./client.js";
|
|
5
|
+
export { RTP_STATUS, RTP_EVENT, RTP_ERROR } from "./constants.js";
|
|
6
|
+
export { isRtpPayload, findValidationErrors, toRtpRequest, toRequestPatch, mergeRequest, isExpired } from "./validate.js";
|
|
7
|
+
export { mapPushToRtp } from "./push.js";
|
|
8
|
+
|
|
9
|
+
// Types
|
|
10
|
+
|
|
11
|
+
// React adapter
|
|
12
|
+
export { RtpProvider, useRtp, RtpContext } from "./react/RtpProvider.js";
|
|
13
|
+
// Mocks (for tests / example app)
|
|
14
|
+
export { createMockTransport } from "./mock/mockTransport.js";
|
|
15
|
+
export { makeRtpPayload, makeExpiredPayload } from "./mock/makeRtpPayload.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/** Number of ms in a minute, for readable fixture offsets. */
|
|
4
|
+
const MINUTE = 60_000;
|
|
5
|
+
let counter = 0;
|
|
6
|
+
/**
|
|
7
|
+
* Build a valid RTP payload for tests, fixtures and the example app.
|
|
8
|
+
* Every field is overridable so edge cases are trivial to express.
|
|
9
|
+
*/
|
|
10
|
+
export function makeRtpPayload(overrides = {}) {
|
|
11
|
+
const {
|
|
12
|
+
payer,
|
|
13
|
+
payee,
|
|
14
|
+
expiresInMs = 15 * MINUTE,
|
|
15
|
+
from = Date.now(),
|
|
16
|
+
...rest
|
|
17
|
+
} = overrides;
|
|
18
|
+
counter += 1;
|
|
19
|
+
return {
|
|
20
|
+
version: '1.0',
|
|
21
|
+
type: 'RTP',
|
|
22
|
+
rtpId: `RTP-${from}-${counter}`,
|
|
23
|
+
amount: 250000,
|
|
24
|
+
currency: 'NGN',
|
|
25
|
+
narration: 'Payment for invoice 1042',
|
|
26
|
+
transactionRef: `TRX-${from}-${counter}`,
|
|
27
|
+
orderNumber: `ORD-${from}-${counter}`,
|
|
28
|
+
deepLink: `quickteller://rtp/${from}-${counter}`,
|
|
29
|
+
actionMessage: 'Review and approve this payment request',
|
|
30
|
+
recipient: 'john.doe@quickteller.com',
|
|
31
|
+
expiresAt: new Date(from + expiresInMs).toISOString(),
|
|
32
|
+
payer: {
|
|
33
|
+
name: 'Ajibola Shadrach',
|
|
34
|
+
accountNumber: '0123456789',
|
|
35
|
+
bank: 'Quickteller MFB',
|
|
36
|
+
...payer
|
|
37
|
+
},
|
|
38
|
+
payee: {
|
|
39
|
+
name: 'Michael Chinweike',
|
|
40
|
+
accountNumber: '9876543210',
|
|
41
|
+
...payee
|
|
42
|
+
},
|
|
43
|
+
...rest
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** A payload that has already expired. */
|
|
48
|
+
export function makeExpiredPayload(overrides = {}) {
|
|
49
|
+
return makeRtpPayload({
|
|
50
|
+
...overrides,
|
|
51
|
+
expiresInMs: -MINUTE
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=makeRtpPayload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":[]}
|