@wdft/micropayments-sdk 0.0.5 → 0.0.6
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/package.json +1 -1
- package/src/client.ts +8 -2
- package/src/service.test.ts +3 -0
- package/src/service.ts +34 -1
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -26,6 +26,8 @@ export type ICommitmentPayloadSimple = Omit<
|
|
|
26
26
|
"status" | "message"
|
|
27
27
|
>;
|
|
28
28
|
|
|
29
|
+
const DEFAULT_RETRY_TIME_MS = 5000;
|
|
30
|
+
|
|
29
31
|
class Commitment {
|
|
30
32
|
private readonly payload: ICommitmentPayload;
|
|
31
33
|
|
|
@@ -224,6 +226,10 @@ class Commitment {
|
|
|
224
226
|
try {
|
|
225
227
|
const status = await this.service.checkCommitment(this.getCommitmentId());
|
|
226
228
|
|
|
229
|
+
if (status.retry_after) {
|
|
230
|
+
this.options.retry_ms = Math.max(this.options.retry_ms || DEFAULT_RETRY_TIME_MS, status.retry_after)
|
|
231
|
+
}
|
|
232
|
+
|
|
227
233
|
switch (status.status) {
|
|
228
234
|
case "duplicated": {
|
|
229
235
|
this.markAsDuplicated();
|
|
@@ -316,7 +322,7 @@ export class Client {
|
|
|
316
322
|
reference_id: reference_id,
|
|
317
323
|
expires_at: response.expires_at,
|
|
318
324
|
click_url: response.click_url,
|
|
319
|
-
retry_ms: this.options.retry_ms ??
|
|
325
|
+
retry_ms: this.options.retry_ms ?? DEFAULT_RETRY_TIME_MS,
|
|
320
326
|
},
|
|
321
327
|
options,
|
|
322
328
|
);
|
|
@@ -410,7 +416,7 @@ export type ICallback = OnStatusCallback & OnStatusErrorCallback;
|
|
|
410
416
|
class CommitmentObservabileBuilder {
|
|
411
417
|
private _reference_id: string | undefined;
|
|
412
418
|
private _amount: number | undefined;
|
|
413
|
-
private _retry_ms =
|
|
419
|
+
private _retry_ms = DEFAULT_RETRY_TIME_MS;
|
|
414
420
|
private _currency: string | undefined;
|
|
415
421
|
private _metadata: ICommitmentMetadata = { title: "", url: "" };
|
|
416
422
|
private _onCreatedFn: (commitment: Commitment) => void = () => {};
|
package/src/service.test.ts
CHANGED
|
@@ -41,6 +41,8 @@ it("service.checkCommitment - 200 - resolved good data", async () => {
|
|
|
41
41
|
message: "waiting for sms",
|
|
42
42
|
status: "waiting",
|
|
43
43
|
commitment_id: "sample_commitment_id",
|
|
44
|
+
}, {
|
|
45
|
+
'Retry-After': '5'
|
|
44
46
|
});
|
|
45
47
|
|
|
46
48
|
const status = await my.checkCommitment("sample_commitment_id");
|
|
@@ -48,6 +50,7 @@ it("service.checkCommitment - 200 - resolved good data", async () => {
|
|
|
48
50
|
expect(status).toMatchObject({
|
|
49
51
|
message: "waiting for sms",
|
|
50
52
|
status: "waiting",
|
|
53
|
+
retry_after: 5000,
|
|
51
54
|
commitment_id: "sample_commitment_id",
|
|
52
55
|
});
|
|
53
56
|
});
|
package/src/service.ts
CHANGED
|
@@ -5,6 +5,7 @@ interface CustomResponse {
|
|
|
5
5
|
|
|
6
6
|
interface SuccessResponse<T> extends CustomResponse {
|
|
7
7
|
error: false;
|
|
8
|
+
retry_after: number;
|
|
8
9
|
message: null;
|
|
9
10
|
data: T;
|
|
10
11
|
}
|
|
@@ -41,6 +42,28 @@ export type Fetcher = (
|
|
|
41
42
|
init?: RequestInit,
|
|
42
43
|
) => Promise<Response>;
|
|
43
44
|
|
|
45
|
+
function randomBetween(min: number, max: number) {
|
|
46
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function parseRetryAfter(retryAfter: string | undefined | null | number): number {
|
|
50
|
+
let retryAfterParsed = 0;
|
|
51
|
+
|
|
52
|
+
if (!retryAfter) {
|
|
53
|
+
return retryAfterParsed;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const retryAfterSeconds = typeof retryAfter === 'number' ? retryAfter : parseInt(retryAfter, 10);
|
|
57
|
+
|
|
58
|
+
if (!isNaN(retryAfterSeconds) && isFinite(retryAfterSeconds)) {
|
|
59
|
+
retryAfterParsed = retryAfterSeconds * 1000;
|
|
60
|
+
} else {
|
|
61
|
+
retryAfterParsed = 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return retryAfterParsed;
|
|
65
|
+
}
|
|
66
|
+
|
|
44
67
|
async function request<T = unknown>(
|
|
45
68
|
path: string,
|
|
46
69
|
req: RequestInit,
|
|
@@ -49,9 +72,11 @@ async function request<T = unknown>(
|
|
|
49
72
|
try {
|
|
50
73
|
const response = await fetcher(new Request(path, req));
|
|
51
74
|
if (response.ok) {
|
|
75
|
+
const retryAfter = response.headers.get('Retry-After');
|
|
52
76
|
return {
|
|
53
77
|
status: response.status,
|
|
54
78
|
error: false,
|
|
79
|
+
retry_after: parseRetryAfter(response.headers.get('Retry-After')),
|
|
55
80
|
data: (await parseResponse(response)) as T,
|
|
56
81
|
} as ResponseDTO<T>;
|
|
57
82
|
}
|
|
@@ -68,6 +93,7 @@ async function request<T = unknown>(
|
|
|
68
93
|
"message" in errorPayload
|
|
69
94
|
? errorPayload.message
|
|
70
95
|
: response.statusText,
|
|
96
|
+
retry_after: parseRetryAfter(response.headers.get('Retry-After')),
|
|
71
97
|
data: null,
|
|
72
98
|
} as ResponseDTO<T>;
|
|
73
99
|
} catch (error) {
|
|
@@ -75,6 +101,7 @@ async function request<T = unknown>(
|
|
|
75
101
|
status: 500,
|
|
76
102
|
error: true,
|
|
77
103
|
message: error instanceof Error ? error.message : `${error}`,
|
|
104
|
+
retry_after: randomBetween(10_000, 30_000),
|
|
78
105
|
data: null,
|
|
79
106
|
} as ErrorResponse;
|
|
80
107
|
}
|
|
@@ -98,6 +125,7 @@ export interface ICommitmentStatus {
|
|
|
98
125
|
commitment_id: string;
|
|
99
126
|
status: string;
|
|
100
127
|
message: string;
|
|
128
|
+
retry_after?: number;
|
|
101
129
|
}
|
|
102
130
|
|
|
103
131
|
export class Service {
|
|
@@ -177,6 +205,11 @@ export class Service {
|
|
|
177
205
|
throw new Error("Bad response");
|
|
178
206
|
}
|
|
179
207
|
|
|
180
|
-
return
|
|
208
|
+
return {
|
|
209
|
+
commitment_id: response.data.commitment_id,
|
|
210
|
+
message: response.data.message,
|
|
211
|
+
status: response.data.status,
|
|
212
|
+
retry_after: response.retry_after
|
|
213
|
+
};
|
|
181
214
|
}
|
|
182
215
|
}
|