@reopt-ai/data-contract 0.6.3 → 0.7.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/dist/client.cjs +228 -321
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +57 -71
- package/dist/client.d.cts.map +1 -0
- package/dist/client.d.ts +57 -71
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +228 -322
- package/dist/client.js.map +1 -1
- package/dist/control.cjs +158 -54
- package/dist/control.cjs.map +1 -1
- package/dist/control.d.cts +121 -137
- package/dist/control.d.cts.map +1 -0
- package/dist/control.d.ts +121 -137
- package/dist/control.d.ts.map +1 -0
- package/dist/control.js +134 -54
- package/dist/control.js.map +1 -1
- package/dist/events-BUIeU60t.d.cts +142 -0
- package/dist/events-BUIeU60t.d.cts.map +1 -0
- package/dist/events-BUIeU60t.d.ts +142 -0
- package/dist/events-BUIeU60t.d.ts.map +1 -0
- package/dist/events.cjs +110 -15
- package/dist/events.cjs.map +1 -1
- package/dist/events.d.cts +2 -59
- package/dist/events.d.ts +2 -59
- package/dist/events.js +101 -15
- package/dist/events.js.map +1 -1
- package/dist/identity.cjs +150 -55
- package/dist/identity.cjs.map +1 -1
- package/dist/identity.d.cts +21 -20
- package/dist/identity.d.cts.map +1 -0
- package/dist/identity.d.ts +21 -20
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +126 -56
- package/dist/identity.js.map +1 -1
- package/dist/index.cjs +46 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +37 -54
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +37 -54
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -25
- package/dist/index.js.map +1 -1
- package/dist/ingest.cjs +152 -57
- package/dist/ingest.cjs.map +1 -1
- package/dist/ingest.d.cts +182 -193
- package/dist/ingest.d.cts.map +1 -0
- package/dist/ingest.d.ts +182 -193
- package/dist/ingest.d.ts.map +1 -0
- package/dist/ingest.js +126 -57
- package/dist/ingest.js.map +1 -1
- package/dist/query.cjs +284 -84
- package/dist/query.cjs.map +1 -1
- package/dist/query.d.cts +456 -469
- package/dist/query.d.cts.map +1 -0
- package/dist/query.d.ts +456 -469
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +245 -84
- package/dist/query.js.map +1 -1
- package/dist/report.cjs +104 -74
- package/dist/report.cjs.map +1 -1
- package/dist/report.d.cts +182 -136
- package/dist/report.d.cts.map +1 -0
- package/dist/report.d.ts +182 -136
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +93 -74
- package/dist/report.js.map +1 -1
- package/dist/version-B_0qb1_K.cjs +53 -0
- package/dist/version-B_0qb1_K.cjs.map +1 -0
- package/dist/version-C09Cyf4R.js +12 -0
- package/dist/version-C09Cyf4R.js.map +1 -0
- package/dist/{version-DJ2Grb_N.d.ts → version-CGujUGWd.d.cts} +5 -3
- package/dist/version-CGujUGWd.d.cts.map +1 -0
- package/dist/{version-DJ2Grb_N.d.cts → version-CGujUGWd.d.ts} +5 -3
- package/dist/version-CGujUGWd.d.ts.map +1 -0
- package/package.json +69 -28
- package/dist/chunk-3EEANNYN.cjs +0 -62
- package/dist/chunk-3EEANNYN.cjs.map +0 -1
- package/dist/chunk-7W33YGRO.js +0 -160
- package/dist/chunk-7W33YGRO.js.map +0 -1
- package/dist/chunk-F2RNXJGO.cjs +0 -19
- package/dist/chunk-F2RNXJGO.cjs.map +0 -1
- package/dist/chunk-FP2X3PRK.js +0 -62
- package/dist/chunk-FP2X3PRK.js.map +0 -1
- package/dist/chunk-JCEWUSUM.js +0 -53
- package/dist/chunk-JCEWUSUM.js.map +0 -1
- package/dist/chunk-L3JPDRVG.cjs +0 -160
- package/dist/chunk-L3JPDRVG.cjs.map +0 -1
- package/dist/chunk-L4KBQAOO.js +0 -204
- package/dist/chunk-L4KBQAOO.js.map +0 -1
- package/dist/chunk-NJ4JKNBX.js +0 -361
- package/dist/chunk-NJ4JKNBX.js.map +0 -1
- package/dist/chunk-ORNTN6AK.cjs +0 -53
- package/dist/chunk-ORNTN6AK.cjs.map +0 -1
- package/dist/chunk-PSUINLW7.js +0 -19
- package/dist/chunk-PSUINLW7.js.map +0 -1
- package/dist/chunk-RU26QFM2.js +0 -179
- package/dist/chunk-RU26QFM2.js.map +0 -1
- package/dist/chunk-XDH5QQYF.cjs +0 -361
- package/dist/chunk-XDH5QQYF.cjs.map +0 -1
- package/dist/chunk-YCTGHWTP.cjs +0 -204
- package/dist/chunk-YCTGHWTP.cjs.map +0 -1
- package/dist/chunk-ZI6A3WQP.cjs +0 -179
- package/dist/chunk-ZI6A3WQP.cjs.map +0 -1
package/dist/client.js
CHANGED
|
@@ -1,336 +1,242 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from "./
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
zRotateOrganizationKeyResponse,
|
|
14
|
-
zUpdateOrganizationQuotaResponse
|
|
15
|
-
} from "./chunk-L4KBQAOO.js";
|
|
16
|
-
import {
|
|
17
|
-
QUERY_API_PATHS,
|
|
18
|
-
zEventsTimeseriesResponse,
|
|
19
|
-
zFunnelResponse,
|
|
20
|
-
zRetentionResponse,
|
|
21
|
-
zTrafficOverviewResponse,
|
|
22
|
-
zTrafficSourcesResponse
|
|
23
|
-
} from "./chunk-NJ4JKNBX.js";
|
|
24
|
-
import {
|
|
25
|
-
DataApiError
|
|
26
|
-
} from "./chunk-JCEWUSUM.js";
|
|
27
|
-
import "./chunk-7W33YGRO.js";
|
|
28
|
-
import {
|
|
29
|
-
CLIENT_ID_HEADER,
|
|
30
|
-
CLIENT_SECRET_HEADER,
|
|
31
|
-
CONTRACT_VERSION,
|
|
32
|
-
CONTRACT_VERSION_HEADER,
|
|
33
|
-
REQUEST_ID_HEADER
|
|
34
|
-
} from "./chunk-PSUINLW7.js";
|
|
35
|
-
import "./chunk-FP2X3PRK.js";
|
|
36
|
-
|
|
37
|
-
// src/client.ts
|
|
38
|
-
var TRACK_PATH = "/api/track";
|
|
39
|
-
var DEFAULTS = {
|
|
40
|
-
timeoutMs: 1e4,
|
|
41
|
-
maxRetries: 2,
|
|
42
|
-
baseDelayMs: 500,
|
|
43
|
-
maxDelayMs: 2e4
|
|
1
|
+
import { i as CONTRACT_VERSION_HEADER, n as CLIENT_SECRET_HEADER, r as CONTRACT_VERSION, t as CLIENT_ID_HEADER } from "./version-C09Cyf4R.js";
|
|
2
|
+
import { DataApiError } from "./index.js";
|
|
3
|
+
import { zIngestResponse } from "./ingest.js";
|
|
4
|
+
import { QUERY_API_PATHS, zEventsTimeseriesResponse, zFunnelResponse, zRetentionResponse, zTrafficOverviewResponse, zTrafficSourcesResponse } from "./query.js";
|
|
5
|
+
import { CONTROL_API_PATHS, ORG_KEY_HEADER, PLATFORM_KEY_HEADER, zCreateOrganizationResponse, zCreateProjectResponse, zDeleteProjectResponse, zEventMetaResponse, zRotateClientSecretResponse, zRotateOrganizationKeyResponse, zUpdateOrganizationQuotaResponse } from "./control.js";
|
|
6
|
+
//#region src/client.ts
|
|
7
|
+
const TRACK_PATH = "/api/track";
|
|
8
|
+
const DEFAULTS = {
|
|
9
|
+
timeoutMs: 1e4,
|
|
10
|
+
maxRetries: 2,
|
|
11
|
+
baseDelayMs: 500,
|
|
12
|
+
maxDelayMs: 2e4
|
|
44
13
|
};
|
|
45
14
|
function normalizeBaseUrl(baseUrl) {
|
|
46
|
-
|
|
15
|
+
return baseUrl.replace(/\/+$/, "");
|
|
47
16
|
}
|
|
48
17
|
function parseRetryAfter(header) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return void 0;
|
|
18
|
+
if (!header) return void 0;
|
|
19
|
+
const seconds = Number(header);
|
|
20
|
+
if (Number.isFinite(seconds) && seconds >= 0) return Math.round(seconds * 1e3);
|
|
21
|
+
const at = Date.parse(header);
|
|
22
|
+
if (Number.isFinite(at)) return Math.max(0, at - Date.now());
|
|
55
23
|
}
|
|
56
24
|
function sleep(ms, signal) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
if (signal?.aborted) {
|
|
27
|
+
reject(signal.reason ?? new Error("Aborted"));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const timer = setTimeout(() => {
|
|
31
|
+
signal?.removeEventListener("abort", onAbort);
|
|
32
|
+
resolve();
|
|
33
|
+
}, ms);
|
|
34
|
+
const onAbort = () => {
|
|
35
|
+
clearTimeout(timer);
|
|
36
|
+
reject(signal?.reason ?? new Error("Aborted"));
|
|
37
|
+
};
|
|
38
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
39
|
+
});
|
|
72
40
|
}
|
|
73
41
|
function backoffDelay(attempt, retry) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
42
|
+
const exponential = retry.baseDelayMs * 2 ** attempt;
|
|
43
|
+
const capped = Math.min(exponential, retry.maxDelayMs);
|
|
44
|
+
return Math.round(capped * (.5 + Math.random() * .5));
|
|
77
45
|
}
|
|
78
46
|
function toApiError(status, rawBody, retryAfterMs, requestId) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = JSON.parse(rawBody);
|
|
50
|
+
} catch {
|
|
51
|
+
return new DataApiError({
|
|
52
|
+
message: `reopt-data responded ${status} with a non-JSON body`,
|
|
53
|
+
status,
|
|
54
|
+
code: status >= 500 ? "internal_error" : "unknown_error",
|
|
55
|
+
requestId,
|
|
56
|
+
retryAfterMs,
|
|
57
|
+
details: rawBody.slice(0, 2e3)
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const body = parsed ?? {};
|
|
61
|
+
const code = typeof body.code === "string" ? body.code : status >= 500 ? "internal_error" : "unknown_error";
|
|
62
|
+
const message = typeof body.message === "string" && body.message || typeof body.error === "string" && body.error || `reopt-data responded ${status}`;
|
|
63
|
+
return new DataApiError({
|
|
64
|
+
message,
|
|
65
|
+
status,
|
|
66
|
+
code,
|
|
67
|
+
requestId: (typeof body.requestId === "string" ? body.requestId : void 0) ?? requestId,
|
|
68
|
+
retryAfterMs,
|
|
69
|
+
details: body.errors ?? void 0
|
|
70
|
+
});
|
|
103
71
|
}
|
|
104
72
|
function createDataClient(options) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
rotateOrgKey(organizationId, auth, init) {
|
|
271
|
-
return send(
|
|
272
|
-
"POST",
|
|
273
|
-
CONTROL_API_PATHS.organizationKeys(organizationId),
|
|
274
|
-
{},
|
|
275
|
-
(value) => zRotateOrganizationKeyResponse.parse(value),
|
|
276
|
-
{ [PLATFORM_KEY_HEADER]: auth.platformKey },
|
|
277
|
-
init?.signal
|
|
278
|
-
);
|
|
279
|
-
},
|
|
280
|
-
updateOrganizationQuota(organizationId, input, auth, init) {
|
|
281
|
-
return send(
|
|
282
|
-
"PATCH",
|
|
283
|
-
CONTROL_API_PATHS.organization(organizationId),
|
|
284
|
-
input,
|
|
285
|
-
(value) => zUpdateOrganizationQuotaResponse.parse(value),
|
|
286
|
-
{ [PLATFORM_KEY_HEADER]: auth.platformKey },
|
|
287
|
-
init?.signal
|
|
288
|
-
);
|
|
289
|
-
},
|
|
290
|
-
createProject(input, auth, init) {
|
|
291
|
-
return send(
|
|
292
|
-
"POST",
|
|
293
|
-
CONTROL_API_PATHS.projects,
|
|
294
|
-
input,
|
|
295
|
-
(value) => zCreateProjectResponse.parse(value),
|
|
296
|
-
{ [ORG_KEY_HEADER]: auth.orgKey },
|
|
297
|
-
init?.signal
|
|
298
|
-
);
|
|
299
|
-
},
|
|
300
|
-
rotateServerClientSecret(projectId, clientId, auth, init) {
|
|
301
|
-
return send(
|
|
302
|
-
"POST",
|
|
303
|
-
CONTROL_API_PATHS.clientRotate(projectId, clientId),
|
|
304
|
-
{},
|
|
305
|
-
(value) => zRotateClientSecretResponse.parse(value),
|
|
306
|
-
{ [ORG_KEY_HEADER]: auth.orgKey },
|
|
307
|
-
init?.signal
|
|
308
|
-
);
|
|
309
|
-
},
|
|
310
|
-
deleteProject(projectId, input, auth, init) {
|
|
311
|
-
return send(
|
|
312
|
-
"DELETE",
|
|
313
|
-
CONTROL_API_PATHS.project(projectId),
|
|
314
|
-
input,
|
|
315
|
-
(value) => zDeleteProjectResponse.parse(value),
|
|
316
|
-
{ [ORG_KEY_HEADER]: auth.orgKey },
|
|
317
|
-
init?.signal
|
|
318
|
-
);
|
|
319
|
-
},
|
|
320
|
-
upsertEventMeta(projectId, name, input, auth, init) {
|
|
321
|
-
return send(
|
|
322
|
-
"PUT",
|
|
323
|
-
CONTROL_API_PATHS.projectEvent(projectId, name),
|
|
324
|
-
input,
|
|
325
|
-
(value) => zEventMetaResponse.parse(value),
|
|
326
|
-
{ [ORG_KEY_HEADER]: auth.orgKey },
|
|
327
|
-
init?.signal
|
|
328
|
-
);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
};
|
|
73
|
+
const baseUrl = normalizeBaseUrl(options.baseUrl);
|
|
74
|
+
const doFetch = options.fetch ?? globalThis.fetch;
|
|
75
|
+
if (typeof doFetch !== "function") throw new TypeError("createDataClient: no fetch implementation available — pass options.fetch");
|
|
76
|
+
const timeoutMs = options.timeoutMs ?? DEFAULTS.timeoutMs;
|
|
77
|
+
const retry = {
|
|
78
|
+
maxRetries: options.retry?.maxRetries ?? DEFAULTS.maxRetries,
|
|
79
|
+
baseDelayMs: options.retry?.baseDelayMs ?? DEFAULTS.baseDelayMs,
|
|
80
|
+
maxDelayMs: options.retry?.maxDelayMs ?? DEFAULTS.maxDelayMs,
|
|
81
|
+
respectRetryAfter: options.retry?.respectRetryAfter ?? true
|
|
82
|
+
};
|
|
83
|
+
const userAgent = options.userAgent ? `reopt-data-contract/${CONTRACT_VERSION} ${options.userAgent}` : `reopt-data-contract/${CONTRACT_VERSION}`;
|
|
84
|
+
function requireClientCredentials() {
|
|
85
|
+
if (!options.clientId || !options.clientSecret) throw new DataApiError({
|
|
86
|
+
message: "createDataClient was given no client credentials — pass clientId and clientSecret to use the ingest or query planes",
|
|
87
|
+
status: 0,
|
|
88
|
+
code: "credentials_missing"
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
clientId: options.clientId,
|
|
92
|
+
clientSecret: options.clientSecret
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async function requestOnce(method, path, body, extraHeaders, signal) {
|
|
96
|
+
const controller = new AbortController();
|
|
97
|
+
const timer = setTimeout(() => controller.abort(new Error(`reopt-data request timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
98
|
+
const onCallerAbort = () => controller.abort(signal?.reason ?? new Error("Aborted"));
|
|
99
|
+
signal?.addEventListener("abort", onCallerAbort, { once: true });
|
|
100
|
+
try {
|
|
101
|
+
return await doFetch(`${baseUrl}${path}`, {
|
|
102
|
+
method,
|
|
103
|
+
headers: {
|
|
104
|
+
"content-type": "application/json",
|
|
105
|
+
"user-agent": userAgent,
|
|
106
|
+
...options.clientId && options.clientSecret ? {
|
|
107
|
+
[CLIENT_ID_HEADER]: options.clientId,
|
|
108
|
+
[CLIENT_SECRET_HEADER]: options.clientSecret
|
|
109
|
+
} : {},
|
|
110
|
+
...extraHeaders
|
|
111
|
+
},
|
|
112
|
+
body: JSON.stringify(body),
|
|
113
|
+
signal: controller.signal
|
|
114
|
+
});
|
|
115
|
+
} finally {
|
|
116
|
+
clearTimeout(timer);
|
|
117
|
+
signal?.removeEventListener("abort", onCallerAbort);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function send(method, path, body, parse, extraHeaders = {}, signal) {
|
|
121
|
+
let lastError;
|
|
122
|
+
for (let attempt = 0; attempt <= retry.maxRetries; attempt++) {
|
|
123
|
+
let response;
|
|
124
|
+
try {
|
|
125
|
+
response = await requestOnce(method, path, body, extraHeaders, signal);
|
|
126
|
+
} catch (cause) {
|
|
127
|
+
if (signal?.aborted) throw cause;
|
|
128
|
+
lastError = new DataApiError({
|
|
129
|
+
message: cause instanceof Error ? cause.message : String(cause),
|
|
130
|
+
status: 0,
|
|
131
|
+
code: "network_error",
|
|
132
|
+
details: cause
|
|
133
|
+
});
|
|
134
|
+
if (attempt < retry.maxRetries) {
|
|
135
|
+
await sleep(backoffDelay(attempt, retry), signal);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
throw lastError;
|
|
139
|
+
}
|
|
140
|
+
const requestId = response.headers.get("x-request-id") ?? void 0;
|
|
141
|
+
const serverContractVersion = response.headers.get(CONTRACT_VERSION_HEADER);
|
|
142
|
+
const rawBody = await response.text();
|
|
143
|
+
if (serverContractVersion !== "0.7.0") throw new DataApiError({
|
|
144
|
+
message: serverContractVersion ? `reopt-data contract ${serverContractVersion} does not match client contract ${CONTRACT_VERSION}` : "reopt-data response did not declare its contract version",
|
|
145
|
+
status: response.status,
|
|
146
|
+
code: "contract_mismatch",
|
|
147
|
+
requestId,
|
|
148
|
+
details: {
|
|
149
|
+
expected: CONTRACT_VERSION,
|
|
150
|
+
received: serverContractVersion
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
if (response.ok) {
|
|
154
|
+
let json;
|
|
155
|
+
try {
|
|
156
|
+
json = JSON.parse(rawBody);
|
|
157
|
+
} catch (cause) {
|
|
158
|
+
throw new DataApiError({
|
|
159
|
+
message: "reopt-data returned a 2xx with an unparseable body",
|
|
160
|
+
status: response.status,
|
|
161
|
+
code: "contract_mismatch",
|
|
162
|
+
requestId,
|
|
163
|
+
details: cause
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
return parse(json);
|
|
168
|
+
} catch (cause) {
|
|
169
|
+
throw new DataApiError({
|
|
170
|
+
message: "reopt-data returned a 2xx that does not match the contract",
|
|
171
|
+
status: response.status,
|
|
172
|
+
code: "contract_mismatch",
|
|
173
|
+
requestId,
|
|
174
|
+
details: cause
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const retryAfterMs = retry.respectRetryAfter ? parseRetryAfter(response.headers.get("retry-after")) : void 0;
|
|
179
|
+
lastError = toApiError(response.status, rawBody, retryAfterMs, requestId);
|
|
180
|
+
if (!lastError.retryable || attempt === retry.maxRetries) throw lastError;
|
|
181
|
+
await sleep(retryAfterMs ?? backoffDelay(attempt, retry), signal);
|
|
182
|
+
}
|
|
183
|
+
throw lastError ?? new DataApiError({
|
|
184
|
+
message: "reopt-data request failed",
|
|
185
|
+
status: 0,
|
|
186
|
+
code: "network_error"
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
async function post(path, body, parse, signal) {
|
|
190
|
+
requireClientCredentials();
|
|
191
|
+
return send("POST", path, body, parse, {}, signal);
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
ingest: { track(events, init) {
|
|
195
|
+
return post(TRACK_PATH, events, (value) => zIngestResponse.parse(value), init?.signal);
|
|
196
|
+
} },
|
|
197
|
+
query: {
|
|
198
|
+
eventsTimeseries(input, init) {
|
|
199
|
+
return post(QUERY_API_PATHS.eventsTimeseries, input, (value) => zEventsTimeseriesResponse.parse(value), init?.signal);
|
|
200
|
+
},
|
|
201
|
+
funnel(input, init) {
|
|
202
|
+
return post(QUERY_API_PATHS.funnel, input, (value) => zFunnelResponse.parse(value), init?.signal);
|
|
203
|
+
},
|
|
204
|
+
retention(input, init) {
|
|
205
|
+
return post(QUERY_API_PATHS.retention, input, (value) => zRetentionResponse.parse(value), init?.signal);
|
|
206
|
+
},
|
|
207
|
+
trafficOverview(input, init) {
|
|
208
|
+
return post(QUERY_API_PATHS.trafficOverview, input, (value) => zTrafficOverviewResponse.parse(value), init?.signal);
|
|
209
|
+
},
|
|
210
|
+
trafficSources(input, init) {
|
|
211
|
+
return post(QUERY_API_PATHS.trafficSources, input, (value) => zTrafficSourcesResponse.parse(value), init?.signal);
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
control: {
|
|
215
|
+
createOrganization(input, auth, init) {
|
|
216
|
+
return send("POST", CONTROL_API_PATHS.organizations, input, (value) => zCreateOrganizationResponse.parse(value), { [PLATFORM_KEY_HEADER]: auth.platformKey }, init?.signal);
|
|
217
|
+
},
|
|
218
|
+
rotateOrgKey(organizationId, auth, init) {
|
|
219
|
+
return send("POST", CONTROL_API_PATHS.organizationKeys(organizationId), {}, (value) => zRotateOrganizationKeyResponse.parse(value), { [PLATFORM_KEY_HEADER]: auth.platformKey }, init?.signal);
|
|
220
|
+
},
|
|
221
|
+
updateOrganizationQuota(organizationId, input, auth, init) {
|
|
222
|
+
return send("PATCH", CONTROL_API_PATHS.organization(organizationId), input, (value) => zUpdateOrganizationQuotaResponse.parse(value), { [PLATFORM_KEY_HEADER]: auth.platformKey }, init?.signal);
|
|
223
|
+
},
|
|
224
|
+
createProject(input, auth, init) {
|
|
225
|
+
return send("POST", CONTROL_API_PATHS.projects, input, (value) => zCreateProjectResponse.parse(value), { [ORG_KEY_HEADER]: auth.orgKey }, init?.signal);
|
|
226
|
+
},
|
|
227
|
+
rotateServerClientSecret(projectId, clientId, auth, init) {
|
|
228
|
+
return send("POST", CONTROL_API_PATHS.clientRotate(projectId, clientId), {}, (value) => zRotateClientSecretResponse.parse(value), { [ORG_KEY_HEADER]: auth.orgKey }, init?.signal);
|
|
229
|
+
},
|
|
230
|
+
deleteProject(projectId, input, auth, init) {
|
|
231
|
+
return send("DELETE", CONTROL_API_PATHS.project(projectId), input, (value) => zDeleteProjectResponse.parse(value), { [ORG_KEY_HEADER]: auth.orgKey }, init?.signal);
|
|
232
|
+
},
|
|
233
|
+
upsertEventMeta(projectId, name, input, auth, init) {
|
|
234
|
+
return send("PUT", CONTROL_API_PATHS.projectEvent(projectId, name), input, (value) => zEventMetaResponse.parse(value), { [ORG_KEY_HEADER]: auth.orgKey }, init?.signal);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
};
|
|
332
238
|
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
239
|
+
//#endregion
|
|
240
|
+
export { createDataClient };
|
|
241
|
+
|
|
336
242
|
//# sourceMappingURL=client.js.map
|