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