@vrplatform/api 1.3.1-stage.2218 → 1.3.1-stage.2230

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 (166) hide show
  1. package/build/main/analytics/client.d.ts +16 -0
  2. package/build/main/analytics/client.js +81 -0
  3. package/build/main/analytics/client.js.map +1 -0
  4. package/build/main/analytics/index.d.ts +2 -0
  5. package/build/main/analytics/index.js +19 -0
  6. package/build/main/analytics/index.js.map +1 -0
  7. package/build/main/analytics/types.d.ts +77 -0
  8. package/build/main/analytics/types.js.map +1 -0
  9. package/build/main/index.d.ts +14 -6
  10. package/build/main/index.js +19 -3
  11. package/build/main/index.js.map +1 -1
  12. package/build/main/service-client.d.ts +15 -0
  13. package/build/main/service-client.js +90 -0
  14. package/build/main/service-client.js.map +1 -0
  15. package/build/main/services/analytics/client.d.ts +16 -0
  16. package/build/main/services/analytics/client.js +33 -0
  17. package/build/main/services/analytics/client.js.map +1 -0
  18. package/build/main/services/analytics/generated/v1.d.ts +359 -0
  19. package/build/main/services/analytics/generated/v1.js.map +1 -0
  20. package/build/main/{client.js → services/api/client.js} +29 -27
  21. package/build/main/services/api/client.js.map +1 -0
  22. package/build/main/services/api/error.d.ts +22 -0
  23. package/build/main/{error.js → services/api/error.js} +12 -8
  24. package/build/main/services/api/error.js.map +1 -0
  25. package/build/main/{generated → services/api/generated}/v1.d.ts +949 -94
  26. package/build/main/services/api/generated/v1.js +7 -0
  27. package/build/main/{generated → services/api/generated}/v1.js.map +1 -1
  28. package/build/main/services/api/index.d.ts +6 -0
  29. package/build/main/services/api/index.js +20 -0
  30. package/build/main/services/api/index.js.map +1 -0
  31. package/build/main/services/api/types.js +3 -0
  32. package/build/main/services/api/types.js.map +1 -0
  33. package/build/main/services/cache/client.d.ts +16 -0
  34. package/build/main/services/cache/client.js +33 -0
  35. package/build/main/services/cache/client.js.map +1 -0
  36. package/build/main/services/cache/generated/v1.d.ts +1009 -0
  37. package/build/main/services/cache/generated/v1.js +7 -0
  38. package/build/main/services/cache/generated/v1.js.map +1 -0
  39. package/build/main/services/cache/index.d.ts +2 -0
  40. package/build/main/services/cache/index.js +18 -0
  41. package/build/main/services/cache/index.js.map +1 -0
  42. package/build/main/services/control-plane/client.d.ts +17 -0
  43. package/build/main/services/control-plane/client.js +33 -0
  44. package/build/main/services/control-plane/client.js.map +1 -0
  45. package/build/main/services/control-plane/generated/v1.d.ts +2123 -0
  46. package/build/main/services/control-plane/generated/v1.js +7 -0
  47. package/build/main/services/control-plane/generated/v1.js.map +1 -0
  48. package/build/main/services/control-plane/index.d.ts +2 -0
  49. package/build/main/services/control-plane/index.js +18 -0
  50. package/build/main/services/control-plane/index.js.map +1 -0
  51. package/build/main/services/ingest/client.d.ts +16 -0
  52. package/build/main/services/ingest/client.js +33 -0
  53. package/build/main/services/ingest/client.js.map +1 -0
  54. package/build/main/services/ingest/generated/v1.d.ts +1920 -0
  55. package/build/main/services/ingest/generated/v1.js +7 -0
  56. package/build/main/services/ingest/generated/v1.js.map +1 -0
  57. package/build/main/services/ingest/index.d.ts +2 -0
  58. package/build/main/services/ingest/index.js +18 -0
  59. package/build/main/services/ingest/index.js.map +1 -0
  60. package/build/main/tsconfig.main.tsbuildinfo +1 -1
  61. package/build/module/analytics/client.d.ts +16 -0
  62. package/build/module/analytics/client.js +39 -0
  63. package/build/module/analytics/client.js.map +1 -0
  64. package/build/module/analytics/index.d.ts +2 -0
  65. package/build/module/analytics/index.js +3 -0
  66. package/build/module/analytics/index.js.map +1 -0
  67. package/build/module/analytics/types.d.ts +77 -0
  68. package/build/module/analytics/types.js.map +1 -0
  69. package/build/module/index.d.ts +14 -6
  70. package/build/module/index.js +6 -3
  71. package/build/module/index.js.map +1 -1
  72. package/build/module/service-client.d.ts +15 -0
  73. package/build/module/service-client.js +51 -0
  74. package/build/module/service-client.js.map +1 -0
  75. package/build/module/services/analytics/client.d.ts +16 -0
  76. package/build/module/services/analytics/client.js +24 -0
  77. package/build/module/services/analytics/client.js.map +1 -0
  78. package/build/module/services/analytics/generated/v1.d.ts +359 -0
  79. package/build/module/services/analytics/generated/v1.js.map +1 -0
  80. package/build/module/{client.js → services/api/client.js} +29 -27
  81. package/build/module/services/api/client.js.map +1 -0
  82. package/build/module/services/api/error.d.ts +22 -0
  83. package/build/module/{error.js → services/api/error.js} +12 -8
  84. package/build/module/services/api/error.js.map +1 -0
  85. package/build/module/{generated → services/api/generated}/v1.d.ts +949 -94
  86. package/build/module/services/api/generated/v1.js +6 -0
  87. package/build/module/{generated → services/api/generated}/v1.js.map +1 -1
  88. package/build/module/services/api/index.d.ts +6 -0
  89. package/build/module/services/api/index.js +4 -0
  90. package/build/module/services/api/index.js.map +1 -0
  91. package/build/module/services/api/types.js +2 -0
  92. package/build/module/services/api/types.js.map +1 -0
  93. package/build/module/services/cache/client.d.ts +16 -0
  94. package/build/module/services/cache/client.js +24 -0
  95. package/build/module/services/cache/client.js.map +1 -0
  96. package/build/module/services/cache/generated/v1.d.ts +1009 -0
  97. package/build/module/services/cache/generated/v1.js +6 -0
  98. package/build/module/services/cache/generated/v1.js.map +1 -0
  99. package/build/module/services/cache/index.d.ts +2 -0
  100. package/build/module/services/cache/index.js +2 -0
  101. package/build/module/services/cache/index.js.map +1 -0
  102. package/build/module/services/control-plane/client.d.ts +17 -0
  103. package/build/module/services/control-plane/client.js +24 -0
  104. package/build/module/services/control-plane/client.js.map +1 -0
  105. package/build/module/services/control-plane/generated/v1.d.ts +2123 -0
  106. package/build/module/services/control-plane/generated/v1.js +6 -0
  107. package/build/module/services/control-plane/generated/v1.js.map +1 -0
  108. package/build/module/services/control-plane/index.d.ts +2 -0
  109. package/build/module/services/control-plane/index.js +2 -0
  110. package/build/module/services/control-plane/index.js.map +1 -0
  111. package/build/module/services/ingest/client.d.ts +16 -0
  112. package/build/module/services/ingest/client.js +24 -0
  113. package/build/module/services/ingest/client.js.map +1 -0
  114. package/build/module/services/ingest/generated/v1.d.ts +1920 -0
  115. package/build/module/services/ingest/generated/v1.js +6 -0
  116. package/build/module/services/ingest/generated/v1.js.map +1 -0
  117. package/build/module/services/ingest/index.d.ts +2 -0
  118. package/build/module/services/ingest/index.js +2 -0
  119. package/build/module/services/ingest/index.js.map +1 -0
  120. package/build/module/tsconfig.esm.tsbuildinfo +1 -1
  121. package/package.json +37 -6
  122. package/src/analytics/client.ts +81 -0
  123. package/src/analytics/index.ts +2 -0
  124. package/src/analytics/types.ts +83 -0
  125. package/src/index.ts +49 -7
  126. package/src/service-client.ts +80 -0
  127. package/src/services/analytics/client.ts +44 -0
  128. package/src/services/analytics/generated/v1.ts +360 -0
  129. package/src/{client.ts → services/api/client.ts} +41 -24
  130. package/src/services/api/error.ts +82 -0
  131. package/src/{generated → services/api/generated}/v1.ts +949 -94
  132. package/src/services/api/index.ts +8 -0
  133. package/src/{types.ts → services/api/types.ts} +2 -0
  134. package/src/services/cache/client.ts +44 -0
  135. package/src/services/cache/generated/v1.ts +1010 -0
  136. package/src/services/cache/index.ts +2 -0
  137. package/src/services/control-plane/client.ts +46 -0
  138. package/src/services/control-plane/generated/v1.ts +2124 -0
  139. package/src/services/control-plane/index.ts +2 -0
  140. package/src/services/ingest/client.ts +44 -0
  141. package/src/services/ingest/generated/v1.ts +1921 -0
  142. package/src/services/ingest/index.ts +2 -0
  143. package/build/main/client.js.map +0 -1
  144. package/build/main/error.d.ts +0 -22
  145. package/build/main/error.js.map +0 -1
  146. package/build/main/generated/openapi-fetch.d.ts +0 -224
  147. package/build/main/generated/openapi-fetch.js +0 -14
  148. package/build/main/generated/openapi-fetch.js.map +0 -1
  149. package/build/main/types.js.map +0 -1
  150. package/build/module/client.js.map +0 -1
  151. package/build/module/error.d.ts +0 -22
  152. package/build/module/error.js.map +0 -1
  153. package/build/module/generated/openapi-fetch.d.ts +0 -224
  154. package/build/module/generated/openapi-fetch.js +0 -2
  155. package/build/module/generated/openapi-fetch.js.map +0 -1
  156. package/build/module/types.js.map +0 -1
  157. package/src/error.ts +0 -71
  158. package/src/generated/openapi-fetch.ts +0 -433
  159. /package/build/main/{types.js → analytics/types.js} +0 -0
  160. /package/build/main/{generated → services/analytics/generated}/v1.js +0 -0
  161. /package/build/main/{client.d.ts → services/api/client.d.ts} +0 -0
  162. /package/build/main/{types.d.ts → services/api/types.d.ts} +0 -0
  163. /package/build/module/{types.js → analytics/types.js} +0 -0
  164. /package/build/module/{generated → services/analytics/generated}/v1.js +0 -0
  165. /package/build/module/{client.d.ts → services/api/client.d.ts} +0 -0
  166. /package/build/module/{types.d.ts → services/api/types.d.ts} +0 -0
@@ -0,0 +1,360 @@
1
+ /**
2
+ * This file was auto-generated by openapi-typescript.
3
+ * Do not make direct changes to the file.
4
+ */
5
+
6
+ export interface paths {
7
+ "/health": {
8
+ parameters: {
9
+ query?: never;
10
+ header?: never;
11
+ path?: never;
12
+ cookie?: never;
13
+ };
14
+ /** @description Health endpoint for analytics worker. */
15
+ get: operations["getHealth"];
16
+ put?: never;
17
+ post?: never;
18
+ delete?: never;
19
+ options?: never;
20
+ head?: never;
21
+ patch?: never;
22
+ trace?: never;
23
+ };
24
+ "/v1/events/track": {
25
+ parameters: {
26
+ query?: never;
27
+ header?: never;
28
+ path?: never;
29
+ cookie?: never;
30
+ };
31
+ get?: never;
32
+ put?: never;
33
+ /** @description Track a single analytics event. */
34
+ post: operations["postV1EventsTrack"];
35
+ delete?: never;
36
+ options?: never;
37
+ head?: never;
38
+ patch?: never;
39
+ trace?: never;
40
+ };
41
+ "/v1/events/track-batch": {
42
+ parameters: {
43
+ query?: never;
44
+ header?: never;
45
+ path?: never;
46
+ cookie?: never;
47
+ };
48
+ get?: never;
49
+ put?: never;
50
+ /** @description Track a batch of analytics events. */
51
+ post: operations["postV1EventsTrackBatch"];
52
+ delete?: never;
53
+ options?: never;
54
+ head?: never;
55
+ patch?: never;
56
+ trace?: never;
57
+ };
58
+ }
59
+ export type webhooks = Record<string, never>;
60
+ export interface components {
61
+ schemas: never;
62
+ responses: never;
63
+ parameters: never;
64
+ requestBodies: never;
65
+ headers: never;
66
+ pathItems: never;
67
+ }
68
+ export type $defs = Record<string, never>;
69
+ export interface operations {
70
+ getHealth: {
71
+ parameters: {
72
+ query?: never;
73
+ header?: never;
74
+ path?: never;
75
+ cookie?: never;
76
+ };
77
+ requestBody?: never;
78
+ responses: {
79
+ /** @description Service health */
80
+ 200: {
81
+ headers: {
82
+ [name: string]: unknown;
83
+ };
84
+ content: {
85
+ "application/json": {
86
+ ok: boolean;
87
+ /** @constant */
88
+ service: "analytics";
89
+ };
90
+ };
91
+ };
92
+ /** @description Bad request */
93
+ 400: {
94
+ headers: {
95
+ [name: string]: unknown;
96
+ };
97
+ content: {
98
+ "application/json": {
99
+ code: string;
100
+ message: string;
101
+ };
102
+ };
103
+ };
104
+ /** @description Unauthorized */
105
+ 401: {
106
+ headers: {
107
+ [name: string]: unknown;
108
+ };
109
+ content: {
110
+ "application/json": {
111
+ code: string;
112
+ message: string;
113
+ };
114
+ };
115
+ };
116
+ /** @description Forbidden */
117
+ 403: {
118
+ headers: {
119
+ [name: string]: unknown;
120
+ };
121
+ content: {
122
+ "application/json": {
123
+ code: string;
124
+ message: string;
125
+ };
126
+ };
127
+ };
128
+ /** @description Not found */
129
+ 404: {
130
+ headers: {
131
+ [name: string]: unknown;
132
+ };
133
+ content: {
134
+ "application/json": {
135
+ code: string;
136
+ message: string;
137
+ };
138
+ };
139
+ };
140
+ /** @description Internal server error */
141
+ 500: {
142
+ headers: {
143
+ [name: string]: unknown;
144
+ };
145
+ content: {
146
+ "application/json": {
147
+ code: string;
148
+ message: string;
149
+ };
150
+ };
151
+ };
152
+ };
153
+ };
154
+ postV1EventsTrack: {
155
+ parameters: {
156
+ query?: never;
157
+ header?: never;
158
+ path?: never;
159
+ cookie?: never;
160
+ };
161
+ requestBody?: {
162
+ content: {
163
+ "application/json": {
164
+ /** Format: uuid */
165
+ tenantId: string;
166
+ event: string;
167
+ packageName: string;
168
+ /** Format: uuid */
169
+ userId?: string;
170
+ anonymousId?: string;
171
+ groupId?: string;
172
+ /** Format: date-time */
173
+ trackedAt?: string;
174
+ /** @default {} */
175
+ properties?: {
176
+ [key: string]: unknown;
177
+ };
178
+ };
179
+ };
180
+ };
181
+ responses: {
182
+ /** @description Tracked event id */
183
+ 200: {
184
+ headers: {
185
+ [name: string]: unknown;
186
+ };
187
+ content: {
188
+ "application/json": {
189
+ /** Format: uuid */
190
+ id: string;
191
+ };
192
+ };
193
+ };
194
+ /** @description Bad request */
195
+ 400: {
196
+ headers: {
197
+ [name: string]: unknown;
198
+ };
199
+ content: {
200
+ "application/json": {
201
+ code: string;
202
+ message: string;
203
+ };
204
+ };
205
+ };
206
+ /** @description Unauthorized */
207
+ 401: {
208
+ headers: {
209
+ [name: string]: unknown;
210
+ };
211
+ content: {
212
+ "application/json": {
213
+ code: string;
214
+ message: string;
215
+ };
216
+ };
217
+ };
218
+ /** @description Forbidden */
219
+ 403: {
220
+ headers: {
221
+ [name: string]: unknown;
222
+ };
223
+ content: {
224
+ "application/json": {
225
+ code: string;
226
+ message: string;
227
+ };
228
+ };
229
+ };
230
+ /** @description Not found */
231
+ 404: {
232
+ headers: {
233
+ [name: string]: unknown;
234
+ };
235
+ content: {
236
+ "application/json": {
237
+ code: string;
238
+ message: string;
239
+ };
240
+ };
241
+ };
242
+ /** @description Internal server error */
243
+ 500: {
244
+ headers: {
245
+ [name: string]: unknown;
246
+ };
247
+ content: {
248
+ "application/json": {
249
+ code: string;
250
+ message: string;
251
+ };
252
+ };
253
+ };
254
+ };
255
+ };
256
+ postV1EventsTrackBatch: {
257
+ parameters: {
258
+ query?: never;
259
+ header?: never;
260
+ path?: never;
261
+ cookie?: never;
262
+ };
263
+ requestBody?: {
264
+ content: {
265
+ "application/json": {
266
+ events: {
267
+ /** Format: uuid */
268
+ tenantId: string;
269
+ event: string;
270
+ packageName: string;
271
+ /** Format: uuid */
272
+ userId?: string;
273
+ anonymousId?: string;
274
+ groupId?: string;
275
+ /** Format: date-time */
276
+ trackedAt?: string;
277
+ /** @default {} */
278
+ properties?: {
279
+ [key: string]: unknown;
280
+ };
281
+ }[];
282
+ };
283
+ };
284
+ };
285
+ responses: {
286
+ /** @description Tracked event ids */
287
+ 200: {
288
+ headers: {
289
+ [name: string]: unknown;
290
+ };
291
+ content: {
292
+ "application/json": {
293
+ ids: string[];
294
+ total: number;
295
+ };
296
+ };
297
+ };
298
+ /** @description Bad request */
299
+ 400: {
300
+ headers: {
301
+ [name: string]: unknown;
302
+ };
303
+ content: {
304
+ "application/json": {
305
+ code: string;
306
+ message: string;
307
+ };
308
+ };
309
+ };
310
+ /** @description Unauthorized */
311
+ 401: {
312
+ headers: {
313
+ [name: string]: unknown;
314
+ };
315
+ content: {
316
+ "application/json": {
317
+ code: string;
318
+ message: string;
319
+ };
320
+ };
321
+ };
322
+ /** @description Forbidden */
323
+ 403: {
324
+ headers: {
325
+ [name: string]: unknown;
326
+ };
327
+ content: {
328
+ "application/json": {
329
+ code: string;
330
+ message: string;
331
+ };
332
+ };
333
+ };
334
+ /** @description Not found */
335
+ 404: {
336
+ headers: {
337
+ [name: string]: unknown;
338
+ };
339
+ content: {
340
+ "application/json": {
341
+ code: string;
342
+ message: string;
343
+ };
344
+ };
345
+ };
346
+ /** @description Internal server error */
347
+ 500: {
348
+ headers: {
349
+ [name: string]: unknown;
350
+ };
351
+ content: {
352
+ "application/json": {
353
+ code: string;
354
+ message: string;
355
+ };
356
+ };
357
+ };
358
+ };
359
+ };
360
+ }
@@ -4,9 +4,10 @@ import {
4
4
  useRetryableFetch,
5
5
  } from '@vrplatform/utils';
6
6
  import createClient from 'openapi-fetch';
7
- import { useCache } from './cache';
7
+ import { useCache } from '../../cache';
8
+ import { generateApiKeySec } from '../../sec';
9
+ import { applySentryTraceHeaders } from '../../service-client';
8
10
  import type { paths } from './generated/v1';
9
- import { generateApiKeySec } from './sec';
10
11
  import type { ApiClient, ApiClientAuth } from './types';
11
12
 
12
13
  export function useApiClient({
@@ -14,7 +15,6 @@ export function useApiClient({
14
15
  local,
15
16
  auth,
16
17
  sessionId: sid,
17
- // headers: h,
18
18
  testing,
19
19
  headers: h,
20
20
  ...retryableFetchParams
@@ -33,13 +33,12 @@ export function useApiClient({
33
33
  const baseUrl =
34
34
  (local
35
35
  ? `http://localhost:${typeof local === 'number' ? local : 8877}`
36
- : base) || 'https://api.vrplatform.app';
36
+ : base) || 'https://api.edge.vrplatform.app';
37
37
 
38
38
  const sessionId = sid || crypto.randomUUID();
39
- // cache the sec key for 1 minute (its valid for 5 minutes on the API)
40
39
  const cache = useCache(
41
- async (v: string) =>
42
- generateApiKeySec(v, testing?.getOverwriteTimestamp?.()),
40
+ async (value: string) =>
41
+ generateApiKeySec(value, testing?.getOverwriteTimestamp?.()),
43
42
  60_000
44
43
  );
45
44
 
@@ -47,7 +46,9 @@ export function useApiClient({
47
46
  ...retryableFetchParams,
48
47
  onRetry(arg) {
49
48
  cache.invalidate();
50
- if (retryableFetchParams.onRetry) retryableFetchParams.onRetry(arg);
49
+ if (retryableFetchParams.onRetry) {
50
+ retryableFetchParams.onRetry(arg);
51
+ }
51
52
  },
52
53
  });
53
54
 
@@ -62,38 +63,54 @@ export function useApiClient({
62
63
  },
63
64
  fetch(req) {
64
65
  return retryableFetch(async () => {
65
- let clone: any = req.clone() as any;
66
- if (testing?.overwriteUri)
66
+ let clone = new Request(req);
67
+ if (testing?.overwriteUri) {
67
68
  clone = new Request(testing.overwriteUri, clone);
69
+ }
70
+
71
+ const resolvedAuth = (typeof auth === 'function' ? auth() : auth) ?? {};
72
+
73
+ if (sessionId) {
74
+ clone.headers.set('X-Session-Id', sessionId);
75
+ }
76
+
77
+ if (resolvedAuth.sec) {
78
+ clone.headers.set(
79
+ 'X-Api-Key',
80
+ `Sec ${await cache.current(resolvedAuth.sec)}`
81
+ );
82
+ }
83
+
84
+ if (resolvedAuth.apiKey) {
85
+ clone.headers.set('X-Api-Key', resolvedAuth.apiKey);
86
+ }
68
87
 
69
- const a = (typeof auth === 'function' ? auth() : auth) || {};
70
- if (sessionId) clone.headers.set('X-Session-Id', sessionId);
71
- if (a.sec)
72
- clone.headers.set('X-Api-Key', `Sec ${await cache.current(a.sec)}`);
73
- if (a.apiKey) clone.headers.set('X-Api-Key', a.apiKey);
74
- if (a.tenantId) clone.headers.set('X-Team-Id', a.tenantId);
75
- if (a.accessToken)
88
+ if (resolvedAuth.tenantId) {
89
+ clone.headers.set('X-Team-Id', resolvedAuth.tenantId);
90
+ }
91
+
92
+ if (resolvedAuth.accessToken) {
76
93
  clone.headers.set(
77
94
  'Authorization',
78
- a.accessToken.startsWith('Bearer ')
79
- ? a.accessToken
80
- : `Bearer ${a.accessToken}`
95
+ resolvedAuth.accessToken.startsWith('Bearer ')
96
+ ? resolvedAuth.accessToken
97
+ : `Bearer ${resolvedAuth.accessToken}`
81
98
  );
99
+ }
100
+
82
101
  const additionalHeaders = h ? (typeof h === 'function' ? h() : h) : {};
83
102
  for (const key in additionalHeaders) {
84
103
  clone.headers.set(key, additionalHeaders[key]);
85
104
  }
86
105
 
87
- if (trace['sentry-trace'])
88
- clone.headers.set('sentry-trace', trace['sentry-trace']);
89
- if (trace.baggage) clone.headers.set('baggage', trace.baggage);
106
+ applySentryTraceHeaders(clone.headers, trace);
90
107
 
91
108
  return clone;
92
109
  });
93
110
  },
94
111
  });
95
112
 
96
- const sessionClient: ApiClient = client as any;
113
+ const sessionClient = client as ApiClient;
97
114
  sessionClient.sessionId = sessionId;
98
115
  return sessionClient;
99
116
  }
@@ -0,0 +1,82 @@
1
+ import { hasValue } from '@vrplatform/utils';
2
+ import type { ServiceFetchResponse } from '../../service-client';
3
+
4
+ type ApiErrorPayload = {
5
+ code: string;
6
+ message: string;
7
+ issues?: {
8
+ message: string;
9
+ }[];
10
+ context?: Record<string, unknown>;
11
+ stack?: string;
12
+ };
13
+
14
+ export class ApiClientError extends Error {
15
+ code: string;
16
+ issues: {
17
+ message: string;
18
+ }[];
19
+ context: Record<string, unknown>;
20
+
21
+ constructor(public error: ApiErrorPayload) {
22
+ const message =
23
+ error.message ||
24
+ [
25
+ error.code,
26
+ error.issues
27
+ ?.map((issue) =>
28
+ [issue.message, (issue as { path?: string[] }).path?.join('->')]
29
+ .filter(hasValue)
30
+ .join(' on ')
31
+ )
32
+ .join(', '),
33
+ ]
34
+ .filter(hasValue)
35
+ .join(': ');
36
+
37
+ super(message);
38
+ this.name = 'ApiClientError';
39
+ this.code = error.code;
40
+ this.issues = error.issues || [];
41
+ this.context = error.context || {};
42
+
43
+ if (error.stack) {
44
+ this.stack = error.stack;
45
+ }
46
+ }
47
+ }
48
+
49
+ export function throwIfError<T extends ServiceFetchResponse>(
50
+ response: T
51
+ ): NonNullable<T['data']>;
52
+ export function throwIfError<T extends ServiceFetchResponse>(
53
+ response: Promise<T>
54
+ ): Promise<NonNullable<T['data']>>;
55
+ export function throwIfError<T extends ServiceFetchResponse>(
56
+ response: Promise<T> | T
57
+ ): Promise<NonNullable<T['data']>> | NonNullable<T['data']> {
58
+ if (response instanceof Promise) {
59
+ return response.then((resolved) => {
60
+ if (resolved.response.status === 503) {
61
+ throw new ApiClientError({
62
+ code: 'SERVICE_UNAVAILABLE',
63
+ message: 'Worker resources exceeded.',
64
+ });
65
+ }
66
+
67
+ const error = resolved.error as ApiErrorPayload | undefined;
68
+ if (error) {
69
+ throw new ApiClientError(error);
70
+ }
71
+
72
+ return resolved.data as NonNullable<T['data']>;
73
+ });
74
+ }
75
+
76
+ const error = response.error as ApiErrorPayload | undefined;
77
+ if (error) {
78
+ throw new ApiClientError(error);
79
+ }
80
+
81
+ return response.data as NonNullable<T['data']>;
82
+ }