@bikefinder/api-client 0.3.0 → 0.4.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 (46) hide show
  1. package/README.md +3 -1
  2. package/dist/admin/generated/index.d.ts +1 -1
  3. package/dist/admin/generated/index.d.ts.map +1 -1
  4. package/dist/admin/generated/sdk.gen.d.ts +132 -18
  5. package/dist/admin/generated/sdk.gen.d.ts.map +1 -1
  6. package/dist/admin/generated/sdk.gen.js +264 -150
  7. package/dist/admin/generated/sdk.gen.js.map +1 -1
  8. package/dist/admin/generated/types.gen.d.ts +791 -385
  9. package/dist/admin/generated/types.gen.d.ts.map +1 -1
  10. package/dist/admin/generated/zod.gen.d.ts +957 -988
  11. package/dist/admin/generated/zod.gen.d.ts.map +1 -1
  12. package/dist/admin/generated/zod.gen.js +239 -292
  13. package/dist/admin/generated/zod.gen.js.map +1 -1
  14. package/dist/generated/index.d.ts +1 -1
  15. package/dist/generated/index.d.ts.map +1 -1
  16. package/dist/generated/sdk.gen.d.ts +80 -45
  17. package/dist/generated/sdk.gen.d.ts.map +1 -1
  18. package/dist/generated/sdk.gen.js +192 -157
  19. package/dist/generated/sdk.gen.js.map +1 -1
  20. package/dist/generated/types.gen.d.ts +887 -453
  21. package/dist/generated/types.gen.d.ts.map +1 -1
  22. package/dist/generated/zod.gen.d.ts +468 -286
  23. package/dist/generated/zod.gen.d.ts.map +1 -1
  24. package/dist/generated/zod.gen.js +188 -201
  25. package/dist/generated/zod.gen.js.map +1 -1
  26. package/dist/realtime/api-stream-error.d.ts +2 -1
  27. package/dist/realtime/api-stream-error.d.ts.map +1 -1
  28. package/dist/realtime/api-stream-error.js +8 -1
  29. package/dist/realtime/api-stream-error.js.map +1 -1
  30. package/dist/realtime/watch.d.ts.map +1 -1
  31. package/dist/realtime/watch.js +1 -1
  32. package/dist/realtime/watch.js.map +1 -1
  33. package/dist/transport.js +10 -1
  34. package/dist/transport.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/admin/generated/index.ts +1 -7
  37. package/src/admin/generated/sdk.gen.ts +440 -326
  38. package/src/admin/generated/types.gen.ts +860 -464
  39. package/src/admin/generated/zod.gen.ts +259 -318
  40. package/src/generated/index.ts +6 -2
  41. package/src/generated/sdk.gen.ts +408 -373
  42. package/src/generated/types.gen.ts +956 -516
  43. package/src/generated/zod.gen.ts +217 -231
  44. package/src/realtime/api-stream-error.ts +12 -1
  45. package/src/realtime/watch.ts +6 -1
  46. package/src/transport.ts +10 -1
@@ -4,8 +4,13 @@ export type ApiStreamErrorCode = "http" | "protocol" | "network";
4
4
  export class ApiStreamError extends Error {
5
5
  readonly code: ApiStreamErrorCode;
6
6
  readonly status: number | undefined;
7
+ readonly retryAfterMs: number | undefined;
7
8
 
8
- constructor(code: ApiStreamErrorCode, status?: number) {
9
+ constructor(
10
+ code: ApiStreamErrorCode,
11
+ status?: number,
12
+ retryAfterMs?: number,
13
+ ) {
9
14
  super(
10
15
  code === "http"
11
16
  ? `The tracker stream returned HTTP ${status}.`
@@ -16,5 +21,11 @@ export class ApiStreamError extends Error {
16
21
  this.name = "ApiStreamError";
17
22
  this.code = code;
18
23
  this.status = status;
24
+ this.retryAfterMs =
25
+ retryAfterMs !== undefined &&
26
+ Number.isFinite(retryAfterMs) &&
27
+ retryAfterMs >= 0
28
+ ? Math.min(retryAfterMs, 300_000)
29
+ : undefined;
19
30
  }
20
31
  }
@@ -136,7 +136,12 @@ export function watch<TSdk, TOperation extends StreamOperation<TSdk>>(
136
136
  (error.status ?? 0) >= 500)));
137
137
  if (!retryable) throw error;
138
138
  const maximum = Math.min(30_000, 1_000 * 2 ** (attempt - 1));
139
- return timer(maximum * (0.5 + Math.random() * 0.5));
139
+ return timer(
140
+ Math.max(
141
+ maximum * (0.5 + Math.random() * 0.5),
142
+ error.retryAfterMs ?? 0,
143
+ ),
144
+ );
140
145
  },
141
146
  }),
142
147
  ),
package/src/transport.ts CHANGED
@@ -60,7 +60,7 @@ export function createAuthenticatedFetch(
60
60
  if (response.status !== 200) {
61
61
  await response.body?.cancel().catch(() => {});
62
62
  if (response.status === 401) throw new AuthenticationError();
63
- throw new ApiStreamError("http", response.status);
63
+ throw new ApiStreamError("http", response.status, retryAfter(response));
64
64
  }
65
65
  const contentType = response.headers
66
66
  .get("Content-Type")
@@ -86,6 +86,15 @@ export function createAuthenticatedFetch(
86
86
  };
87
87
  }
88
88
 
89
+ function retryAfter(response: Response): number | undefined {
90
+ const value = response.headers.get("Retry-After")?.trim();
91
+ if (!value) return undefined;
92
+ const delay = /^\d+$/.test(value)
93
+ ? Number(value) * 1_000
94
+ : Date.parse(value) - Date.now();
95
+ return Number.isFinite(delay) ? Math.max(0, delay) : undefined;
96
+ }
97
+
89
98
  function throwIfAborted(signal?: AbortSignal): void {
90
99
  // Expo's React Native AbortSignal supports aborted, but not throwIfAborted().
91
100
  if (signal?.aborted) {