@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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wdft/micropayments-sdk",
3
3
  "description": "wdft - we do fintech - micropayments sdk",
4
- "version": "0.0.5",
4
+ "version": "0.0.6",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
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 ?? 1000,
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 = 1000;
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 = () => {};
@@ -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 response.data;
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
  }