@flitt/api 1.0.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 (69) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +277 -0
  4. package/SECURITY.md +15 -0
  5. package/dist/cjs/client.d.ts +243 -0
  6. package/dist/cjs/client.d.ts.map +1 -0
  7. package/dist/cjs/client.js +470 -0
  8. package/dist/cjs/client.js.map +1 -0
  9. package/dist/cjs/errors.d.ts +71 -0
  10. package/dist/cjs/errors.d.ts.map +1 -0
  11. package/dist/cjs/errors.js +107 -0
  12. package/dist/cjs/errors.js.map +1 -0
  13. package/dist/cjs/http.d.ts +53 -0
  14. package/dist/cjs/http.d.ts.map +1 -0
  15. package/dist/cjs/http.js +322 -0
  16. package/dist/cjs/http.js.map +1 -0
  17. package/dist/cjs/index.d.ts +13 -0
  18. package/dist/cjs/index.d.ts.map +1 -0
  19. package/dist/cjs/index.js +31 -0
  20. package/dist/cjs/index.js.map +1 -0
  21. package/dist/cjs/package.json +3 -0
  22. package/dist/cjs/types.d.ts +406 -0
  23. package/dist/cjs/types.d.ts.map +1 -0
  24. package/dist/cjs/types.js +7 -0
  25. package/dist/cjs/types.js.map +1 -0
  26. package/dist/cjs/version.d.ts +3 -0
  27. package/dist/cjs/version.d.ts.map +1 -0
  28. package/dist/cjs/version.js +6 -0
  29. package/dist/cjs/version.js.map +1 -0
  30. package/dist/cjs/webhooks.d.ts +40 -0
  31. package/dist/cjs/webhooks.d.ts.map +1 -0
  32. package/dist/cjs/webhooks.js +98 -0
  33. package/dist/cjs/webhooks.js.map +1 -0
  34. package/dist/esm/client.d.ts +243 -0
  35. package/dist/esm/client.d.ts.map +1 -0
  36. package/dist/esm/client.js +465 -0
  37. package/dist/esm/client.js.map +1 -0
  38. package/dist/esm/errors.d.ts +71 -0
  39. package/dist/esm/errors.d.ts.map +1 -0
  40. package/dist/esm/errors.js +90 -0
  41. package/dist/esm/errors.js.map +1 -0
  42. package/dist/esm/http.d.ts +53 -0
  43. package/dist/esm/http.d.ts.map +1 -0
  44. package/dist/esm/http.js +310 -0
  45. package/dist/esm/http.js.map +1 -0
  46. package/dist/esm/index.d.ts +13 -0
  47. package/dist/esm/index.d.ts.map +1 -0
  48. package/dist/esm/index.js +9 -0
  49. package/dist/esm/index.js.map +1 -0
  50. package/dist/esm/types.d.ts +406 -0
  51. package/dist/esm/types.d.ts.map +1 -0
  52. package/dist/esm/types.js +6 -0
  53. package/dist/esm/types.js.map +1 -0
  54. package/dist/esm/version.d.ts +3 -0
  55. package/dist/esm/version.d.ts.map +1 -0
  56. package/dist/esm/version.js +3 -0
  57. package/dist/esm/version.js.map +1 -0
  58. package/dist/esm/webhooks.d.ts +40 -0
  59. package/dist/esm/webhooks.d.ts.map +1 -0
  60. package/dist/esm/webhooks.js +93 -0
  61. package/dist/esm/webhooks.js.map +1 -0
  62. package/package.json +67 -0
  63. package/src/client.ts +576 -0
  64. package/src/errors.ts +92 -0
  65. package/src/http.ts +353 -0
  66. package/src/index.ts +26 -0
  67. package/src/types.ts +390 -0
  68. package/src/version.ts +2 -0
  69. package/src/webhooks.ts +115 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { RateLimit } from "./types.js";
2
+ export type FetchLike = (input: string, init: RequestInit) => Promise<Response>;
3
+ export type Query = Record<string, string | number | boolean | Date | null | undefined>;
4
+ export type RequestOptions = {
5
+ /** Abort the request (and its retries). */
6
+ signal?: AbortSignal;
7
+ /** Overrides the client timeout for this request, in ms. */
8
+ timeoutMs?: number;
9
+ /** Overrides the client retry count for this request. */
10
+ maxRetries?: number;
11
+ };
12
+ export type TransportOptions = {
13
+ baseUrl: string;
14
+ token: string;
15
+ timeoutMs: number;
16
+ maxRetries: number;
17
+ maxRetryDelayMs: number;
18
+ fetch: FetchLike;
19
+ userAgent?: string;
20
+ headers?: Record<string, string>;
21
+ /** Vote API wraps payloads in { ok, data }. */
22
+ unwrapData: boolean;
23
+ onRateLimit?: (rateLimit: RateLimit) => void;
24
+ };
25
+ type Call = RequestOptions & {
26
+ query?: Query;
27
+ body?: unknown;
28
+ /** Makes a POST safe to retry (the API deduplicates on it). */
29
+ idempotencyKey?: string;
30
+ };
31
+ export declare function isBrowserLike(): boolean;
32
+ /** Validates and normalises a base URL: HTTPS only (HTTP allowed for localhost during development). */
33
+ export declare function normalizeBaseUrl(raw: string): string;
34
+ /** One path segment, URL-encoded. Rejects empty values and dot segments. */
35
+ export declare function segment(value: string, name: string): string;
36
+ /** X-RateLimit-* headers. Reset is an ISO date (Public API) or unix seconds (Vote API). */
37
+ export declare function parseRateLimit(headers: Headers): RateLimit | null;
38
+ /** Retry-After in ms (seconds or HTTP date), null if absent or invalid. */
39
+ export declare function parseRetryAfter(headers: Headers, now?: number): number | null;
40
+ /** Full-jitter exponential backoff: random in [0, min(cap, 500 ms * 2^attempt)]. */
41
+ export declare function backoffMs(attempt: number, capMs: number): number;
42
+ export declare class Transport {
43
+ private readonly opts;
44
+ /** Quota state from the last response carrying X-RateLimit-* headers. */
45
+ lastRateLimit: RateLimit | null;
46
+ constructor(opts: TransportOptions);
47
+ request<T>(method: string, path: string, call?: Call): Promise<T>;
48
+ }
49
+ /** Random idempotency key (UUID v4 when available). */
50
+ export declare function randomKey(): string;
51
+ export declare function resolveFetch(custom?: FetchLike): FetchLike;
52
+ export {};
53
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEhF,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAExF,MAAM,MAAM,cAAc,GAAG;IAC3B,2CAA2C;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,+CAA+C;IAC/C,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CAC9C,CAAC;AAEF,KAAK,IAAI,GAAG,cAAc,GAAG;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAOF,wBAAgB,aAAa,IAAI,OAAO,CAGvC;AAED,uGAAuG;AACvG,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAcpD;AAED,4EAA4E;AAC5E,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAM3D;AAmBD,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAYjE;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,SAAa,GAAG,MAAM,GAAG,IAAI,CAMjF;AAiBD,oFAAoF;AACpF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhE;AAmDD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,yEAAyE;IACzE,aAAa,EAAE,SAAS,GAAG,IAAI,CAAQ;gBAE3B,IAAI,EAAE,gBAAgB;IAI5B,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,IAAS,GAAG,OAAO,CAAC,CAAC,CAAC;CAmI5E;AAED,uDAAuD;AACvD,wBAAgB,SAAS,IAAI,MAAM,CAQlC;AAED,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAO1D"}
@@ -0,0 +1,310 @@
1
+ import { apiErrorFor, FlittAbortError, FlittConfigError, FlittConnectionError, FlittTimeoutError, } from "./errors.js";
2
+ import { VERSION } from "./version.js";
3
+ const RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);
4
+ const MAX_ERROR_TEXT = 300;
5
+ /** Responses above this size are refused (a sane API response is far smaller). */
6
+ const MAX_RESPONSE_BYTES = 32 * 1024 * 1024;
7
+ export function isBrowserLike() {
8
+ const g = globalThis;
9
+ return typeof g.window !== "undefined" && typeof g.window.document !== "undefined";
10
+ }
11
+ /** Validates and normalises a base URL: HTTPS only (HTTP allowed for localhost during development). */
12
+ export function normalizeBaseUrl(raw) {
13
+ let url;
14
+ try {
15
+ url = new URL(raw);
16
+ }
17
+ catch {
18
+ throw new FlittConfigError(`Invalid baseUrl: ${JSON.stringify(raw)}`);
19
+ }
20
+ const local = ["localhost", "127.0.0.1", "[::1]", "::1"].includes(url.hostname);
21
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && local)) {
22
+ throw new FlittConfigError("baseUrl must use https:// (your API key would travel in clear otherwise).");
23
+ }
24
+ if (url.username || url.password)
25
+ throw new FlittConfigError("baseUrl must not contain credentials.");
26
+ if (url.search || url.hash)
27
+ throw new FlittConfigError("baseUrl must not contain a query string or a fragment.");
28
+ return url.toString().replace(/\/+$/, "");
29
+ }
30
+ /** One path segment, URL-encoded. Rejects empty values and dot segments. */
31
+ export function segment(value, name) {
32
+ const v = String(value ?? "").trim();
33
+ if (!v)
34
+ throw new FlittConfigError(`${name} is required.`);
35
+ if (v === "." || v === "..")
36
+ throw new FlittConfigError(`${name} is invalid.`);
37
+ if (v.length > 256)
38
+ throw new FlittConfigError(`${name} is too long.`);
39
+ return encodeURIComponent(v);
40
+ }
41
+ function buildQuery(query) {
42
+ if (!query)
43
+ return "";
44
+ const params = new URLSearchParams();
45
+ for (const [key, value] of Object.entries(query)) {
46
+ if (value === undefined || value === null || value === "")
47
+ continue;
48
+ params.set(key, value instanceof Date ? value.toISOString() : String(value));
49
+ }
50
+ const s = params.toString();
51
+ return s ? `?${s}` : "";
52
+ }
53
+ function parseCount(raw) {
54
+ if (!raw || raw.toLowerCase() === "unlimited")
55
+ return null;
56
+ const n = Number(raw);
57
+ return Number.isFinite(n) ? n : null;
58
+ }
59
+ /** X-RateLimit-* headers. Reset is an ISO date (Public API) or unix seconds (Vote API). */
60
+ export function parseRateLimit(headers) {
61
+ const limit = headers.get("x-ratelimit-limit");
62
+ const remaining = headers.get("x-ratelimit-remaining");
63
+ const reset = headers.get("x-ratelimit-reset");
64
+ if (limit === null && remaining === null && reset === null)
65
+ return null;
66
+ let resetAt = null;
67
+ if (reset) {
68
+ const asNumber = /^\d+(\.\d+)?$/.test(reset) ? Number(reset) : NaN;
69
+ const d = Number.isFinite(asNumber) ? new Date(asNumber < 1e12 ? asNumber * 1000 : asNumber) : new Date(reset);
70
+ resetAt = Number.isNaN(d.getTime()) ? null : d;
71
+ }
72
+ return { limit: parseCount(limit), remaining: parseCount(remaining), reset: resetAt };
73
+ }
74
+ /** Retry-After in ms (seconds or HTTP date), null if absent or invalid. */
75
+ export function parseRetryAfter(headers, now = Date.now()) {
76
+ const raw = headers.get("retry-after");
77
+ if (!raw)
78
+ return null;
79
+ if (/^\d+(\.\d+)?$/.test(raw.trim()))
80
+ return Math.max(0, Math.round(Number(raw) * 1000));
81
+ const date = Date.parse(raw);
82
+ return Number.isNaN(date) ? null : Math.max(0, date - now);
83
+ }
84
+ function sleep(ms, signal) {
85
+ return new Promise((resolve, reject) => {
86
+ if (signal?.aborted)
87
+ return reject(new FlittAbortError("Request aborted."));
88
+ const timer = setTimeout(() => {
89
+ signal?.removeEventListener("abort", onAbort);
90
+ resolve();
91
+ }, ms);
92
+ const onAbort = () => {
93
+ clearTimeout(timer);
94
+ reject(new FlittAbortError("Request aborted."));
95
+ };
96
+ signal?.addEventListener("abort", onAbort, { once: true });
97
+ });
98
+ }
99
+ /** Full-jitter exponential backoff: random in [0, min(cap, 500 ms * 2^attempt)]. */
100
+ export function backoffMs(attempt, capMs) {
101
+ const ceiling = Math.min(capMs, 500 * 2 ** attempt);
102
+ return Math.floor(Math.random() * ceiling);
103
+ }
104
+ function stripText(text) {
105
+ return text
106
+ .replace(/<[^>]*>/g, " ")
107
+ .replace(/\s+/g, " ")
108
+ .trim()
109
+ .slice(0, MAX_ERROR_TEXT);
110
+ }
111
+ const DEFAULT_CODES = {
112
+ 400: "BAD_REQUEST",
113
+ 401: "UNAUTHORIZED",
114
+ 403: "FORBIDDEN",
115
+ 404: "NOT_FOUND",
116
+ 409: "CONFLICT",
117
+ 429: "RATE_LIMITED",
118
+ 500: "INTERNAL",
119
+ 502: "BAD_GATEWAY",
120
+ 503: "UNAVAILABLE",
121
+ 504: "GATEWAY_TIMEOUT",
122
+ };
123
+ /**
124
+ * The API uses three error shapes; they are all turned into one error type:
125
+ * { error: { code, message, details } } (Public API)
126
+ * { ok: false, error: { code, message } } (Vote API)
127
+ * { error: "Unauthorized", message: "..." } (authentication layer)
128
+ */
129
+ function describeError(status, statusText, body, text) {
130
+ const fallbackCode = DEFAULT_CODES[status] ?? `HTTP_${status}`;
131
+ if (body && typeof body === "object") {
132
+ const b = body;
133
+ if (b.error && typeof b.error === "object") {
134
+ const e = b.error;
135
+ return {
136
+ code: typeof e.code === "string" && e.code ? e.code : fallbackCode,
137
+ message: typeof e.message === "string" && e.message ? e.message : statusText || "Request failed",
138
+ details: e.details,
139
+ };
140
+ }
141
+ const { error: _e, message: _m, ...rest } = b;
142
+ return {
143
+ code: fallbackCode,
144
+ message: typeof b.message === "string" && b.message ? b.message : typeof b.error === "string" ? b.error : statusText || "Request failed",
145
+ details: Object.keys(rest).length ? rest : undefined,
146
+ };
147
+ }
148
+ return { code: fallbackCode, message: stripText(text) || statusText || "Request failed", details: undefined };
149
+ }
150
+ export class Transport {
151
+ opts;
152
+ /** Quota state from the last response carrying X-RateLimit-* headers. */
153
+ lastRateLimit = null;
154
+ constructor(opts) {
155
+ this.opts = opts;
156
+ }
157
+ async request(method, path, call = {}) {
158
+ const url = `${this.opts.baseUrl}${path}${buildQuery(call.query)}`;
159
+ const retryable = method === "GET" || method === "HEAD" || method === "DELETE" || Boolean(call.idempotencyKey);
160
+ const maxRetries = Math.max(0, Math.min(10, call.maxRetries ?? this.opts.maxRetries));
161
+ const timeoutMs = Math.max(1, call.timeoutMs ?? this.opts.timeoutMs);
162
+ const headers = {
163
+ Accept: "application/json",
164
+ ...this.opts.headers,
165
+ Authorization: `Bearer ${this.opts.token}`,
166
+ };
167
+ // Browsers forbid setting User-Agent; elsewhere it identifies the SDK in our logs.
168
+ if (!isBrowserLike())
169
+ headers["User-Agent"] = this.opts.userAgent ?? `flitt-api-js/${VERSION}`;
170
+ let payload;
171
+ if (call.body !== undefined) {
172
+ headers["Content-Type"] = "application/json";
173
+ payload = JSON.stringify(call.body);
174
+ }
175
+ if (call.idempotencyKey)
176
+ headers["Idempotency-Key"] = call.idempotencyKey;
177
+ for (let attempt = 0;; attempt++) {
178
+ if (call.signal?.aborted)
179
+ throw new FlittAbortError("Request aborted.");
180
+ const controller = new AbortController();
181
+ const onAbort = () => controller.abort();
182
+ call.signal?.addEventListener("abort", onAbort, { once: true });
183
+ let timedOut = false;
184
+ const timer = setTimeout(() => {
185
+ timedOut = true;
186
+ controller.abort();
187
+ }, timeoutMs);
188
+ let response;
189
+ try {
190
+ response = await this.opts.fetch(url, {
191
+ method,
192
+ headers,
193
+ body: payload,
194
+ signal: controller.signal,
195
+ // Never follow a redirect with the Authorization header attached.
196
+ // (No `cache` / `credentials` options: Cloudflare Workers reject them,
197
+ // and cross-origin requests do not carry cookies by default.)
198
+ redirect: "error",
199
+ });
200
+ }
201
+ catch (err) {
202
+ clearTimeout(timer);
203
+ call.signal?.removeEventListener("abort", onAbort);
204
+ if (call.signal?.aborted)
205
+ throw new FlittAbortError("Request aborted.", { cause: err });
206
+ const error = timedOut
207
+ ? new FlittTimeoutError(`No response from Flitt within ${timeoutMs} ms (${method} ${path}).`, { cause: err })
208
+ : new FlittConnectionError(`Could not reach Flitt (${method} ${path}): ${err?.message ?? err}`, { cause: err });
209
+ if (retryable && attempt < maxRetries) {
210
+ await sleep(backoffMs(attempt, this.opts.maxRetryDelayMs), call.signal);
211
+ continue;
212
+ }
213
+ throw error;
214
+ }
215
+ let text;
216
+ try {
217
+ const declared = Number(response.headers.get("content-length") ?? "0");
218
+ if (declared > MAX_RESPONSE_BYTES)
219
+ throw new FlittConnectionError(`Response too large (${declared} bytes).`);
220
+ text = await response.text();
221
+ }
222
+ catch (err) {
223
+ clearTimeout(timer);
224
+ call.signal?.removeEventListener("abort", onAbort);
225
+ if (err instanceof FlittConnectionError)
226
+ throw err;
227
+ if (call.signal?.aborted)
228
+ throw new FlittAbortError("Request aborted.", { cause: err });
229
+ const error = timedOut
230
+ ? new FlittTimeoutError(`Flitt response not received within ${timeoutMs} ms (${method} ${path}).`, { cause: err })
231
+ : new FlittConnectionError(`Connection lost while reading the response (${method} ${path}).`, { cause: err });
232
+ if (retryable && attempt < maxRetries) {
233
+ await sleep(backoffMs(attempt, this.opts.maxRetryDelayMs), call.signal);
234
+ continue;
235
+ }
236
+ throw error;
237
+ }
238
+ finally {
239
+ clearTimeout(timer);
240
+ call.signal?.removeEventListener("abort", onAbort);
241
+ }
242
+ const rateLimit = parseRateLimit(response.headers);
243
+ if (rateLimit) {
244
+ this.lastRateLimit = rateLimit;
245
+ this.opts.onRateLimit?.(rateLimit);
246
+ }
247
+ let body = undefined;
248
+ if (text) {
249
+ try {
250
+ body = JSON.parse(text);
251
+ }
252
+ catch {
253
+ body = undefined;
254
+ }
255
+ }
256
+ if (response.ok) {
257
+ if (body === undefined && text) {
258
+ throw apiErrorFor({ status: 502, code: "INVALID_RESPONSE", message: `Expected JSON, got: ${stripText(text)}`, method, path });
259
+ }
260
+ if (this.opts.unwrapData && body && typeof body === "object" && "ok" in body) {
261
+ return body.data;
262
+ }
263
+ return body;
264
+ }
265
+ const retryAfterMs = parseRetryAfter(response.headers);
266
+ const described = describeError(response.status, response.statusText, body, text);
267
+ const error = apiErrorFor({
268
+ status: response.status,
269
+ ...described,
270
+ method,
271
+ path,
272
+ rateLimit,
273
+ retryAfterMs: retryAfterMs ??
274
+ (response.status === 429 && rateLimit?.reset ? Math.max(0, rateLimit.reset.getTime() - Date.now()) : null),
275
+ });
276
+ // 429 is retried only when the wait is short (per-minute limits), never
277
+ // for a monthly quota. Non-idempotent calls are retried only on 429:
278
+ // the API refused them before doing anything.
279
+ const canRetry429 = response.status === 429 && error.retryAfterMs !== null && error.retryAfterMs <= this.opts.maxRetryDelayMs;
280
+ const canRetry = response.status === 429 ? canRetry429 : retryable && RETRYABLE_STATUS.has(response.status);
281
+ if (canRetry && attempt < maxRetries) {
282
+ const wait = error.retryAfterMs ?? backoffMs(attempt, this.opts.maxRetryDelayMs);
283
+ await sleep(Math.min(wait, this.opts.maxRetryDelayMs), call.signal);
284
+ continue;
285
+ }
286
+ throw error;
287
+ }
288
+ }
289
+ }
290
+ /** Random idempotency key (UUID v4 when available). */
291
+ export function randomKey() {
292
+ const c = globalThis.crypto;
293
+ if (c?.randomUUID)
294
+ return c.randomUUID();
295
+ if (c?.getRandomValues) {
296
+ const bytes = c.getRandomValues(new Uint8Array(16));
297
+ return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
298
+ }
299
+ throw new FlittConfigError("No secure random source (globalThis.crypto) available: pass an idempotencyKey.");
300
+ }
301
+ export function resolveFetch(custom) {
302
+ if (custom)
303
+ return custom;
304
+ const f = globalThis.fetch;
305
+ if (typeof f !== "function") {
306
+ throw new FlittConfigError("No global fetch found: use Node.js 18+ or pass the `fetch` option.");
307
+ }
308
+ return f.bind(globalThis);
309
+ }
310
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @flitt/api — official client of the Flitt Public API and Vote API.
3
+ * https://flitt.me/docs/public-api
4
+ */
5
+ export { Flitt, FlittVotes, DEFAULT_BASE_URL } from "./client.js";
6
+ export type { ClientOptions, FlittOptions, FlittVotesOptions } from "./client.js";
7
+ export type { FetchLike, RequestOptions } from "./http.js";
8
+ export { verifyWebhook, FlittWebhookError } from "./webhooks.js";
9
+ export type { VerifyWebhookOptions, HeaderSource } from "./webhooks.js";
10
+ export { FlittError, FlittConfigError, FlittConnectionError, FlittTimeoutError, FlittAbortError, FlittAPIError, FlittValidationError, FlittAuthenticationError, FlittPermissionError, FlittNotFoundError, FlittConflictError, FlittRateLimitError, FlittServerError, } from "./errors.js";
11
+ export { VERSION } from "./version.js";
12
+ export type * from "./types.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClF,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,mBAAmB,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @flitt/api — official client of the Flitt Public API and Vote API.
3
+ * https://flitt.me/docs/public-api
4
+ */
5
+ export { Flitt, FlittVotes, DEFAULT_BASE_URL } from "./client.js";
6
+ export { verifyWebhook, FlittWebhookError } from "./webhooks.js";
7
+ export { FlittError, FlittConfigError, FlittConnectionError, FlittTimeoutError, FlittAbortError, FlittAPIError, FlittValidationError, FlittAuthenticationError, FlittPermissionError, FlittNotFoundError, FlittConflictError, FlittRateLimitError, FlittServerError, } from "./errors.js";
8
+ export { VERSION } from "./version.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}