@meterapp/car-image-sdk 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.
package/dist/client.js ADDED
@@ -0,0 +1,400 @@
1
+ import { CarImageError } from "./errors.js";
2
+ import { imageRequestBody, imageSearchParams, normalizeYear } from "./params.js";
3
+ import { RETRYABLE_STATUSES, backoffDelayMs, parseRetryAfter } from "./retry.js";
4
+ import { DEFAULT_BASE_URL, } from "./types.js";
5
+ import { SDK_VERSION } from "./version.js";
6
+ function readEnv(name) {
7
+ const proc = globalThis.process;
8
+ const value = proc?.env?.[name];
9
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
10
+ }
11
+ function intHeader(headers, name) {
12
+ const raw = headers.get(name);
13
+ if (raw === null || raw === "")
14
+ return null;
15
+ const value = Number(raw);
16
+ return Number.isFinite(value) ? value : null;
17
+ }
18
+ function sourceHeader(headers) {
19
+ const raw = headers.get("x-image-source");
20
+ return raw === "cache" || raw === "generated" ? raw : null;
21
+ }
22
+ function defaultSleep(ms) {
23
+ return new Promise((resolve) => setTimeout(resolve, ms));
24
+ }
25
+ /**
26
+ * Client for the Car Image API. Safe for Node 20+, edge runtimes and browsers
27
+ * (in browsers, prefer signed delivery URLs created server-side so the API key
28
+ * never ships to the client).
29
+ */
30
+ export class CarImageClient {
31
+ baseUrl;
32
+ userAgent;
33
+ maxRetries;
34
+ retryBaseDelayMs;
35
+ maxRetryDelayMs;
36
+ timeoutMs;
37
+ apiKey;
38
+ fetchImpl;
39
+ sleep;
40
+ constructor(options = {}) {
41
+ this.baseUrl = (options.baseUrl ?? readEnv("CAR_IMAGE_API_URL") ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
42
+ this.apiKey = options.apiKey?.trim() || readEnv("CAR_IMAGE_API_KEY");
43
+ const fetchImpl = options.fetch ?? (typeof globalThis.fetch === "function" ? globalThis.fetch.bind(globalThis) : undefined);
44
+ if (!fetchImpl) {
45
+ throw new Error("No fetch implementation available. Pass { fetch } to CarImageClient.");
46
+ }
47
+ this.fetchImpl = fetchImpl;
48
+ this.userAgent = options.userAgent ?? `car-image-sdk/${SDK_VERSION}`;
49
+ this.maxRetries = Math.max(0, Math.floor(options.maxRetries ?? 2));
50
+ this.retryBaseDelayMs = options.retryBaseDelayMs ?? 500;
51
+ this.maxRetryDelayMs = options.maxRetryDelayMs ?? 30_000;
52
+ this.timeoutMs = options.timeoutMs;
53
+ this.sleep = options.sleep ?? defaultSleep;
54
+ }
55
+ /** Whether a key is configured; the key itself is never exposed. */
56
+ get hasApiKey() {
57
+ return Boolean(this.apiKey);
58
+ }
59
+ /** Display form such as `cimg_A1b2…9zY`; never logs the full key. */
60
+ maskedApiKey() {
61
+ if (!this.apiKey)
62
+ return null;
63
+ if (this.apiKey.length <= 12)
64
+ return `${this.apiKey.slice(0, 4)}…`;
65
+ return `${this.apiKey.slice(0, 9)}…${this.apiKey.slice(-3)}`;
66
+ }
67
+ /** Keeps the key out of `JSON.stringify(client)`, logs and error reports. */
68
+ toJSON() {
69
+ return {
70
+ baseUrl: this.baseUrl,
71
+ userAgent: this.userAgent,
72
+ maxRetries: this.maxRetries,
73
+ apiKey: this.maskedApiKey(),
74
+ };
75
+ }
76
+ // ---------------------------------------------------------------- images
77
+ /** GET /api/v1/images/car — 1 credit; returns the bytes plus billing headers. */
78
+ async getImage(params, options = {}) {
79
+ const response = await this.send(`/api/v1/images/car?${imageSearchParams(params)}`, {
80
+ ...options,
81
+ accept: "image/png, image/webp, image/jpeg, image/*;q=0.9, application/problem+json;q=0.8",
82
+ });
83
+ const bytes = new Uint8Array(await response.arrayBuffer());
84
+ return {
85
+ bytes,
86
+ contentType: response.headers.get("content-type") ?? "application/octet-stream",
87
+ width: intHeader(response.headers, "x-image-width"),
88
+ height: intHeader(response.headers, "x-image-height"),
89
+ creditsCharged: intHeader(response.headers, "x-credits-charged"),
90
+ creditsRemaining: intHeader(response.headers, "x-credits-remaining"),
91
+ source: sourceHeader(response.headers),
92
+ etag: response.headers.get("etag"),
93
+ requestId: response.headers.get("x-request-id"),
94
+ };
95
+ }
96
+ /** GET /api/v1/images/car with `Accept: application/json` — 1 credit; returns a signed URL. */
97
+ async getImageUrl(params, options = {}) {
98
+ const response = await this.send(`/api/v1/images/car?${imageSearchParams(params)}`, {
99
+ ...options,
100
+ accept: "application/json",
101
+ });
102
+ return this.json(response);
103
+ }
104
+ /**
105
+ * POST /api/v1/image-urls — 1 credit per URL, charged at creation. Up to 50
106
+ * images per call. Redemptions are free within the TTL.
107
+ */
108
+ async createImageUrls(images, options = {}) {
109
+ const list = Array.isArray(images) ? images : [images];
110
+ if (list.length < 1 || list.length > 50) {
111
+ throw new RangeError(`createImageUrls accepts 1 to 50 images (received ${list.length})`);
112
+ }
113
+ const { ttlSeconds, maxUses, ...request } = options;
114
+ const body = { images: list.map(imageRequestBody) };
115
+ if (ttlSeconds !== undefined)
116
+ body.ttl_seconds = ttlSeconds;
117
+ if (maxUses !== undefined)
118
+ body.max_uses = maxUses;
119
+ const response = await this.send("/api/v1/image-urls", {
120
+ ...request,
121
+ method: "POST",
122
+ body: JSON.stringify(body),
123
+ });
124
+ return this.json(response);
125
+ }
126
+ /** GET /api/v1/images/options — public; views, colors, sizes, formats, pricing, catalog. */
127
+ async options(options = {}) {
128
+ const response = await this.send("/api/v1/images/options", { ...options, auth: "optional" });
129
+ return this.json(response);
130
+ }
131
+ /** POST /api/v1/images/resolve — free; turns "red 2024 porsche 911 side view" into parameters. */
132
+ async resolve(query, options = {}) {
133
+ if (typeof query !== "string" || !query.trim())
134
+ throw new TypeError("query is required");
135
+ const response = await this.send("/api/v1/images/resolve", {
136
+ ...options,
137
+ method: "POST",
138
+ body: JSON.stringify({ query: query.trim() }),
139
+ });
140
+ return this.json(response);
141
+ }
142
+ async vehicles(filter = {}, options = {}) {
143
+ const search = new URLSearchParams();
144
+ if (filter.year !== undefined)
145
+ search.set("year", String(normalizeYear(filter.year)));
146
+ if (filter.makeId !== undefined)
147
+ search.set("makeId", String(filter.makeId));
148
+ const query = search.size ? `?${search}` : "";
149
+ const response = await this.send(`/api/v1/vehicles${query}`, { ...options, auth: "optional" });
150
+ return this.json(response);
151
+ }
152
+ /** GET /api/v1/vehicles?q= — public fuzzy search across makes and models. */
153
+ async searchVehicles(query, options = {}) {
154
+ if (typeof query !== "string" || !query.trim())
155
+ throw new TypeError("query is required");
156
+ const { limit, year, ...request } = options;
157
+ const search = new URLSearchParams({ q: query.trim() });
158
+ if (limit !== undefined)
159
+ search.set("limit", String(limit));
160
+ if (year !== undefined)
161
+ search.set("year", String(normalizeYear(year)));
162
+ const response = await this.send(`/api/v1/vehicles?${search}`, { ...request, auth: "optional" });
163
+ return this.json(response);
164
+ }
165
+ // ------------------------------------------------------------- feedback
166
+ /** POST /api/v1/feedback — free; rate a delivered image by request id or by vehicle. */
167
+ async feedback(input, options = {}) {
168
+ if (input.rating === undefined && input.verdict === undefined) {
169
+ throw new TypeError("feedback requires a rating (1-5) or a verdict (good|bad)");
170
+ }
171
+ const body = {};
172
+ if ("requestId" in input && input.requestId) {
173
+ body.request_id = input.requestId;
174
+ }
175
+ else if ("make" in input) {
176
+ Object.assign(body, imageRequestBody(input));
177
+ delete body.width;
178
+ delete body.height;
179
+ delete body.format;
180
+ }
181
+ else {
182
+ throw new TypeError("feedback requires requestId or make/model/year");
183
+ }
184
+ if (input.rating !== undefined)
185
+ body.rating = input.rating;
186
+ if (input.verdict !== undefined)
187
+ body.verdict = input.verdict;
188
+ if (input.reason !== undefined)
189
+ body.reason = input.reason;
190
+ const response = await this.send("/api/v1/feedback", {
191
+ ...options,
192
+ method: "POST",
193
+ body: JSON.stringify(body),
194
+ });
195
+ return this.json(response);
196
+ }
197
+ // -------------------------------------------------------------- account
198
+ /** GET /api/v1/account — credits, auto-reload, 30-day usage, key scopes. */
199
+ async account(options = {}) {
200
+ const response = await this.send("/api/v1/account", options);
201
+ return this.json(response);
202
+ }
203
+ /** POST /api/v1/billing/checkout — hosted Stripe Checkout URL (scope billing:write). */
204
+ async createCheckout(credits, options = {}) {
205
+ if (!Number.isInteger(credits) || credits <= 0)
206
+ throw new RangeError("credits must be a positive integer");
207
+ const response = await this.send("/api/v1/billing/checkout", {
208
+ ...options,
209
+ method: "POST",
210
+ body: JSON.stringify({ credits }),
211
+ });
212
+ return this.json(response);
213
+ }
214
+ /** POST /api/v1/billing/portal — Stripe Customer Portal URL (scope billing:write). */
215
+ async billingPortal(options = {}) {
216
+ const response = await this.send("/api/v1/billing/portal", { ...options, method: "POST", body: "{}" });
217
+ return this.json(response);
218
+ }
219
+ // ----------------------------------------------------------------- meta
220
+ /** GET /api/health — public. */
221
+ async health(options = {}) {
222
+ const response = await this.send("/api/health", { ...options, auth: "none" });
223
+ return this.json(response);
224
+ }
225
+ /** GET /openapi.json — public machine-readable contract. */
226
+ async openapi(options = {}) {
227
+ const response = await this.send("/openapi.json", { ...options, auth: "none" });
228
+ return this.json(response);
229
+ }
230
+ /** POST /api/auth/device/code — start browser-assisted login (public). */
231
+ async startDeviceLogin(input = {}, options = {}) {
232
+ const response = await this.send("/api/auth/device/code", {
233
+ ...options,
234
+ method: "POST",
235
+ auth: "none",
236
+ body: JSON.stringify(input.clientName ? { client_name: input.clientName } : {}),
237
+ });
238
+ return this.json(response);
239
+ }
240
+ /** POST /api/auth/device/token — one poll; returns pending/expired/approved without throwing. */
241
+ async pollDeviceLogin(deviceCode, options = {}) {
242
+ const response = await this.rawSend("/api/auth/device/token", {
243
+ ...options,
244
+ method: "POST",
245
+ auth: "none",
246
+ retries: 0,
247
+ body: JSON.stringify({ device_code: deviceCode }),
248
+ });
249
+ if (response.ok) {
250
+ const token = (await response.json());
251
+ return {
252
+ status: "approved",
253
+ accessToken: token.access_token,
254
+ tokenType: token.token_type ?? "Bearer",
255
+ scope: token.scope ?? "",
256
+ };
257
+ }
258
+ if (response.status === 400 || response.status === 428) {
259
+ let code = "";
260
+ try {
261
+ const body = (await response.clone().json());
262
+ code = body.error ?? "";
263
+ }
264
+ catch {
265
+ code = "";
266
+ }
267
+ if (code === "authorization_pending" || code === "slow_down")
268
+ return { status: "pending" };
269
+ if (code === "expired_token")
270
+ return { status: "expired" };
271
+ }
272
+ throw await CarImageError.fromResponse(response);
273
+ }
274
+ /** POST /api/v1/events — anonymous telemetry; public, never retried. */
275
+ async trackEvents(events, options = {}) {
276
+ if (events.length === 0)
277
+ return;
278
+ await this.send("/api/v1/events", {
279
+ ...options,
280
+ method: "POST",
281
+ auth: "none",
282
+ retries: 0,
283
+ body: JSON.stringify({ events }),
284
+ });
285
+ }
286
+ /**
287
+ * Authenticated raw fetch for anything not covered above. No retries, no
288
+ * throwing on HTTP errors. The `Authorization` header is only attached when
289
+ * the target shares the client's origin, so a foreign URL never sees the key.
290
+ */
291
+ async fetch(pathOrUrl, init = {}) {
292
+ const url = this.url(pathOrUrl);
293
+ const headers = new Headers(init.headers);
294
+ if (!headers.has("user-agent"))
295
+ headers.set("User-Agent", this.userAgent);
296
+ if (this.apiKey && !headers.has("authorization") && this.sameOrigin(url)) {
297
+ headers.set("Authorization", `Bearer ${this.apiKey}`);
298
+ }
299
+ return this.fetchImpl(url, { ...init, headers });
300
+ }
301
+ // ------------------------------------------------------------ internals
302
+ url(path) {
303
+ if (/^https?:\/\//i.test(path))
304
+ return path;
305
+ return `${this.baseUrl}${path.startsWith("/") ? "" : "/"}${path}`;
306
+ }
307
+ sameOrigin(url) {
308
+ try {
309
+ return new URL(url).origin === new URL(this.baseUrl).origin;
310
+ }
311
+ catch {
312
+ return false;
313
+ }
314
+ }
315
+ async json(response) {
316
+ return (await response.json());
317
+ }
318
+ signalFor(options) {
319
+ const timeout = options.timeoutMs ?? this.timeoutMs;
320
+ const timeoutSignal = timeout !== undefined && typeof AbortSignal.timeout === "function" ? AbortSignal.timeout(timeout) : undefined;
321
+ if (options.signal && timeoutSignal) {
322
+ const any = AbortSignal.any;
323
+ return typeof any === "function" ? any([options.signal, timeoutSignal]) : options.signal;
324
+ }
325
+ return options.signal ?? timeoutSignal;
326
+ }
327
+ /** Sends and throws `CarImageError` on any non-2xx response. */
328
+ async send(path, options = {}) {
329
+ const response = await this.rawSend(path, options);
330
+ if (response.ok)
331
+ return response;
332
+ throw await CarImageError.fromResponse(response);
333
+ }
334
+ /** Sends with retries but returns the final response, whatever its status. */
335
+ async rawSend(path, options = {}) {
336
+ const method = options.method ?? "GET";
337
+ const auth = options.auth ?? "required";
338
+ const headers = new Headers(options.headers);
339
+ headers.set("Accept", options.accept ?? "application/json");
340
+ if (!headers.has("user-agent"))
341
+ headers.set("User-Agent", this.userAgent);
342
+ if (options.body !== undefined && !headers.has("content-type")) {
343
+ headers.set("Content-Type", "application/json");
344
+ }
345
+ if (this.apiKey) {
346
+ if (auth !== "none")
347
+ headers.set("Authorization", `Bearer ${this.apiKey}`);
348
+ }
349
+ else if (auth === "required") {
350
+ throw new CarImageError({
351
+ status: 401,
352
+ title: "API key required",
353
+ detail: "Create the client with { apiKey } or set CAR_IMAGE_API_KEY. Get a key at https://car-imgs.vercel.app/dashboard or run `npx @meterapp/car-image login`.",
354
+ });
355
+ }
356
+ const retries = Math.max(0, options.retries ?? this.maxRetries);
357
+ const url = this.url(path);
358
+ const idempotent = method === "GET" || method === "HEAD";
359
+ for (let attempt = 0;; attempt += 1) {
360
+ let response;
361
+ try {
362
+ response = await this.fetchImpl(url, {
363
+ method,
364
+ headers,
365
+ body: options.body,
366
+ signal: this.signalFor(options),
367
+ });
368
+ }
369
+ catch (error) {
370
+ if (options.signal?.aborted)
371
+ throw error;
372
+ if (attempt < retries && idempotent) {
373
+ await this.sleep(backoffDelayMs(attempt, this.retryBaseDelayMs, this.maxRetryDelayMs));
374
+ continue;
375
+ }
376
+ throw new CarImageError({
377
+ status: 0,
378
+ title: "Network error",
379
+ detail: error instanceof Error ? error.message : String(error),
380
+ cause: error,
381
+ });
382
+ }
383
+ if (response.ok || !RETRYABLE_STATUSES.has(response.status) || attempt >= retries) {
384
+ return response;
385
+ }
386
+ const retryAfter = parseRetryAfter(response.headers.get("retry-after"));
387
+ const delay = retryAfter !== null
388
+ ? Math.min(retryAfter * 1000, this.maxRetryDelayMs)
389
+ : backoffDelayMs(attempt, this.retryBaseDelayMs, this.maxRetryDelayMs);
390
+ try {
391
+ await response.body?.cancel();
392
+ }
393
+ catch {
394
+ // Body already consumed or not cancellable; nothing to release.
395
+ }
396
+ await this.sleep(delay);
397
+ }
398
+ }
399
+ }
400
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /** RFC 9457 problem details as sent by the API (`application/problem+json`). */
2
+ export interface ProblemDetails {
3
+ type?: string;
4
+ title?: string;
5
+ status?: number;
6
+ detail?: string;
7
+ request_id?: string;
8
+ /** Present on 402 responses. */
9
+ balance?: number;
10
+ /** Present on 402 responses. */
11
+ required_credits?: number;
12
+ [key: string]: unknown;
13
+ }
14
+ export interface CarImageErrorInit {
15
+ status: number;
16
+ title: string;
17
+ detail: string;
18
+ requestId?: string | null;
19
+ problem?: ProblemDetails | null;
20
+ retryAfterSeconds?: number | null;
21
+ headers?: Headers | null;
22
+ cause?: unknown;
23
+ }
24
+ /**
25
+ * Every failure surfaced by the SDK. `status` is the HTTP status (0 for network
26
+ * failures), `detail` is the human-readable explanation from the server and
27
+ * `requestId` lets support trace the call.
28
+ */
29
+ export declare class CarImageError extends Error {
30
+ readonly status: number;
31
+ readonly title: string;
32
+ readonly detail: string;
33
+ readonly requestId: string | null;
34
+ readonly problem: ProblemDetails | null;
35
+ readonly retryAfterSeconds: number | null;
36
+ readonly headers: Headers | null;
37
+ constructor(init: CarImageErrorInit);
38
+ /** Builds an error from a non-2xx response, reading problem+json when present. */
39
+ static fromResponse(response: Response): Promise<CarImageError>;
40
+ /** 402: buy credits before retrying. Never retried automatically. */
41
+ get isInsufficientCredits(): boolean;
42
+ /** 429: honor `retryAfterSeconds`. */
43
+ get isRateLimited(): boolean;
44
+ /** 401 or 403. */
45
+ get isAuthentication(): boolean;
46
+ get isNotFound(): boolean;
47
+ /** 0 (network), 429 or 503. */
48
+ get isRetryable(): boolean;
49
+ toJSON(): ProblemDetails;
50
+ }
51
+ export declare function isCarImageError(error: unknown): error is CarImageError;
52
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;gBAErB,IAAI,EAAE,iBAAiB;IAanC,kFAAkF;WACrE,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;IAyCrE,qEAAqE;IACrE,IAAI,qBAAqB,IAAI,OAAO,CAEnC;IAED,sCAAsC;IACtC,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,kBAAkB;IAClB,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,+BAA+B;IAC/B,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,MAAM,IAAI,cAAc;CASzB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE"}
package/dist/errors.js ADDED
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Every failure surfaced by the SDK. `status` is the HTTP status (0 for network
3
+ * failures), `detail` is the human-readable explanation from the server and
4
+ * `requestId` lets support trace the call.
5
+ */
6
+ export class CarImageError extends Error {
7
+ status;
8
+ title;
9
+ detail;
10
+ requestId;
11
+ problem;
12
+ retryAfterSeconds;
13
+ headers;
14
+ constructor(init) {
15
+ const suffix = init.requestId ? ` (request ${init.requestId})` : "";
16
+ super(`${init.title}: ${init.detail}${suffix}`, init.cause === undefined ? undefined : { cause: init.cause });
17
+ this.name = "CarImageError";
18
+ this.status = init.status;
19
+ this.title = init.title;
20
+ this.detail = init.detail;
21
+ this.requestId = init.requestId ?? null;
22
+ this.problem = init.problem ?? null;
23
+ this.retryAfterSeconds = init.retryAfterSeconds ?? null;
24
+ this.headers = init.headers ?? null;
25
+ }
26
+ /** Builds an error from a non-2xx response, reading problem+json when present. */
27
+ static async fromResponse(response) {
28
+ let text = "";
29
+ try {
30
+ text = await response.text();
31
+ }
32
+ catch {
33
+ text = "";
34
+ }
35
+ let problem = null;
36
+ if (text) {
37
+ try {
38
+ const parsed = JSON.parse(text);
39
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
40
+ problem = parsed;
41
+ }
42
+ }
43
+ catch {
44
+ problem = null;
45
+ }
46
+ }
47
+ const title = (typeof problem?.title === "string" && problem.title) ||
48
+ (response.statusText ? response.statusText : `HTTP ${response.status}`);
49
+ const detail = (typeof problem?.detail === "string" && problem.detail) ||
50
+ (typeof problem?.error === "string" && problem.error) ||
51
+ (text && !problem ? text.slice(0, 300) : `The server responded with HTTP ${response.status}.`);
52
+ const retryAfter = response.headers.get("retry-after");
53
+ const retryAfterSeconds = retryAfter && /^\d+$/.test(retryAfter.trim()) ? Number(retryAfter) : null;
54
+ return new CarImageError({
55
+ status: response.status,
56
+ title,
57
+ detail,
58
+ requestId: (typeof problem?.request_id === "string" && problem.request_id) ||
59
+ response.headers.get("x-request-id") ||
60
+ null,
61
+ problem,
62
+ retryAfterSeconds,
63
+ headers: response.headers,
64
+ });
65
+ }
66
+ /** 402: buy credits before retrying. Never retried automatically. */
67
+ get isInsufficientCredits() {
68
+ return this.status === 402;
69
+ }
70
+ /** 429: honor `retryAfterSeconds`. */
71
+ get isRateLimited() {
72
+ return this.status === 429;
73
+ }
74
+ /** 401 or 403. */
75
+ get isAuthentication() {
76
+ return this.status === 401 || this.status === 403;
77
+ }
78
+ get isNotFound() {
79
+ return this.status === 404;
80
+ }
81
+ /** 0 (network), 429 or 503. */
82
+ get isRetryable() {
83
+ return this.status === 0 || this.status === 429 || this.status === 503;
84
+ }
85
+ toJSON() {
86
+ return {
87
+ ...(this.problem ?? {}),
88
+ status: this.status,
89
+ title: this.title,
90
+ detail: this.detail,
91
+ request_id: this.requestId ?? undefined,
92
+ };
93
+ }
94
+ }
95
+ export function isCarImageError(error) {
96
+ return error instanceof CarImageError || (error instanceof Error && error.name === "CarImageError");
97
+ }
98
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { CarImageClient, type CarImageClientOptions, type RequestOptions } from "./client.js";
2
+ export { CarImageError, isCarImageError, type CarImageErrorInit, type ProblemDetails } from "./errors.js";
3
+ export { assertImageParams, imageRequestBody, imageSearchParams, normalizeYear, suggestedFileName, } from "./params.js";
4
+ export { RETRYABLE_STATUSES, backoffDelayMs, parseRetryAfter, retryDelayMs } from "./retry.js";
5
+ export * from "./types.js";
6
+ export { SDK_VERSION } from "./version.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1G,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/F,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { CarImageClient } from "./client.js";
2
+ export { CarImageError, isCarImageError } from "./errors.js";
3
+ export { assertImageParams, imageRequestBody, imageSearchParams, normalizeYear, suggestedFileName, } from "./params.js";
4
+ export { RETRYABLE_STATUSES, backoffDelayMs, parseRetryAfter, retryDelayMs } from "./retry.js";
5
+ export * from "./types.js";
6
+ export { SDK_VERSION } from "./version.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAmD,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,eAAe,EAA+C,MAAM,aAAa,CAAC;AAC1G,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/F,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}