sound-tank 2.1.0 → 2.1.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # sound-tank
2
2
 
3
+ ## 2.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 8563389: Add `throttle` option to `PaginationOptions` (`delayMs`, `everyNPages`) to prevent 429 rate-limit errors on large fetches. `getAllMyListings()` and `streamAllMyListings()` now pause 5s every 5 pages by default.
8
+
3
9
  ## 2.1.0
4
10
 
5
11
  ### Minor Changes
package/dist/index.js CHANGED
@@ -260,7 +260,8 @@ async function paginateAll(fetchPage, options = {}) {
260
260
  const {
261
261
  perPage = 50,
262
262
  startPage = 1,
263
- maxPages = Number.MAX_SAFE_INTEGER
263
+ maxPages = Number.MAX_SAFE_INTEGER,
264
+ throttle
264
265
  } = options;
265
266
  const allItems = [];
266
267
  let currentPage = startPage;
@@ -281,6 +282,10 @@ async function paginateAll(fetchPage, options = {}) {
281
282
  }
282
283
  currentPage++;
283
284
  pagesProcessed++;
285
+ if (throttle && pagesProcessed % throttle.everyNPages === 0) {
286
+ Logger.debug("Throttling: waiting %dms after %d pages.", throttle.delayMs, pagesProcessed);
287
+ await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));
288
+ }
284
289
  }
285
290
  Logger.debug(
286
291
  "Pagination complete. Total items fetched: %d across %d pages.",
@@ -294,7 +299,8 @@ async function* paginateStream(fetchPage, options = {}) {
294
299
  const {
295
300
  perPage = 50,
296
301
  startPage = 1,
297
- maxPages = Number.MAX_SAFE_INTEGER
302
+ maxPages = Number.MAX_SAFE_INTEGER,
303
+ throttle
298
304
  } = options;
299
305
  let currentPage = startPage;
300
306
  let pagesProcessed = 0;
@@ -316,6 +322,10 @@ async function* paginateStream(fetchPage, options = {}) {
316
322
  }
317
323
  currentPage++;
318
324
  pagesProcessed++;
325
+ if (throttle && pagesProcessed % throttle.everyNPages === 0) {
326
+ Logger.debug("Throttling: waiting %dms after %d pages.", throttle.delayMs, pagesProcessed);
327
+ await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));
328
+ }
319
329
  }
320
330
  Logger.debug("Stream pagination complete after %d pages.", pagesProcessed + 1);
321
331
  }
@@ -355,7 +365,7 @@ var getAllMyListings = /* @__PURE__ */ __name(async (client, config, options) =>
355
365
  });
356
366
  return createPaginatedResult(response.data.listings || [], perPage, page);
357
367
  },
358
- { perPage: 50 }
368
+ { perPage: 50, throttle: { delayMs: 5e3, everyNPages: 5 } }
359
369
  );
360
370
  return {
361
371
  data: allListings,
@@ -377,7 +387,7 @@ async function* streamAllMyListings(client, config, options) {
377
387
  });
378
388
  return createPaginatedResult(response.data.listings || [], perPage, page);
379
389
  },
380
- { perPage: 50 }
390
+ { perPage: 50, throttle: { delayMs: 5e3, everyNPages: 5 } }
381
391
  );
382
392
  for await (const page of pages) {
383
393
  for (const listing of page) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/sound-tank/sound-tank/dist/index.js","../src/config/ReverbConfig.ts","../src/utils/logger.ts","../src/http/FetchHttpClient.ts","../src/utils/urlBuilder.ts","../src/utils/queryBuilder.ts","../src/utils/pagination.ts","../src/methods/listings/getListings.ts","../src/methods/listings/postListing.ts","../src/resources/ListingsResource.ts","../src/methods/orders/getOrders.ts","../src/resources/OrdersResource.ts","../src/methods/negotiations/getNegotiations.ts","../src/resources/NegotiationsResource.ts","../src/methods/index.ts","../src/Reverb.ts","../src/index.ts"],"names":["LogLevel"],"mappings":"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","file":"/home/runner/work/sound-tank/sound-tank/dist/index.js","sourcesContent":[null,"import {\n ApiKey,\n ApiVersion,\n AuthReverbHeaders,\n DisplayCurrency,\n Locale,\n RootEndpoint,\n ShippingRegion,\n} from '../Reverb';\n\nexport interface ReverbConfig {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}\n\nexport function createReverbConfig(params: {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}): ReverbConfig {\n return {\n rootEndpoint: params.rootEndpoint,\n apiKey: params.apiKey,\n headers: params.headers,\n version: params.version,\n locale: params.locale,\n displayCurrency: params.displayCurrency,\n shippingRegion: params.shippingRegion,\n };\n}\n","export enum LogLevel {\n ERROR = '0',\n WARN = '1',\n INFO = '2',\n DEBUG = '3',\n TRACE = '4',\n}\n\nexport default class Logger {\n static log(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.log(`[Reverb API Client] ${message}`, ...args);\n }\n\n static error(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.error(`[Reverb API Client] ${message}`, ...args);\n }\n\n static warn(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.WARN\n ) {\n return;\n }\n console.warn(`[Reverb API Client] ${message}`, ...args);\n }\n\n static info(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.INFO\n ) {\n return;\n }\n console.info(`[Reverb API Client] ${message}`, ...args);\n }\n\n static debug(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.debug(`[Reverb API Client] ${message}`, ...args);\n }\n\n static trace(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.TRACE\n ) {\n return;\n }\n console.trace(`[Reverb API Client] ${message}`, ...args);\n }\n\n static group(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.group(`[Reverb API Client] ${message}`, ...args);\n }\n\n static groupEnd(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.groupEnd();\n }\n\n static time(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.time(`[Reverb API Client] ${label}`);\n }\n\n static timeEnd(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.timeEnd(`[Reverb API Client] ${label}`);\n }\n\n static assert(condition: any, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.assert(condition, `[Reverb API Client] ${message}`, ...args);\n }\n\n static clear(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.clear();\n }\n\n static count(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.count(`[Reverb API Client] ${label}`);\n }\n\n static countReset(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.countReset(`[Reverb API Client] ${label}`);\n }\n\n static dir(level: LogLevel, object: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.dir(object);\n }\n\n static table(level: LogLevel, data: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.table(data);\n }\n\n static groupCollapsed(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.groupCollapsed(`[Reverb API Client] ${message}`, ...args);\n }\n}\n","import { HttpClient } from './HttpClient';\nimport { HttpRequestConfig, HttpResponse } from './types';\nimport Logger from '~/utils/logger';\n\nexport class FetchHttpClient implements HttpClient {\n private async request<T>(\n method: string,\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const { headers, params, timeout } = config ?? {};\n\n let fullUrl = url;\n if (params) {\n const query = Object.entries(params)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n if (query) fullUrl += (url.includes('?') ? '&' : '?') + query;\n }\n\n let controller: AbortController | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (timeout) {\n controller = new AbortController();\n timeoutId = setTimeout(() => controller!.abort(), timeout);\n }\n\n try {\n const resolvedHeaders = headers\n ? (Object.fromEntries(\n Object.entries(headers).filter(([, v]) => v !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n const init: RequestInit = {\n method,\n headers: resolvedHeaders,\n signal: controller?.signal,\n };\n if (data !== undefined) {\n init.body = JSON.stringify(data);\n }\n\n const res = await fetch(fullUrl, init);\n\n if (timeoutId) clearTimeout(timeoutId);\n\n const responseHeaders: Record<string, string> = {};\n res.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const contentType = res.headers.get('content-type') ?? '';\n const responseData: T =\n contentType.includes('json')\n ? await res.json()\n : (await res.text()) as unknown as T;\n\n if (!res.ok) {\n const err = new Error(`HTTP ${res.status}: ${res.statusText}`) as any;\n err.status = res.status;\n err.response = {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n throw err;\n }\n\n return {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n } catch (err) {\n if (timeoutId) clearTimeout(timeoutId);\n throw err;\n }\n }\n\n async get<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('GET request to %s with config: %o', url, config);\n return this.request<T>('GET', url, undefined, config);\n }\n\n async post<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('POST request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('POST', url, data, config);\n }\n\n async put<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PUT request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PUT', url, data, config);\n }\n\n async delete<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('DELETE request to %s with config: %o', url, config);\n return this.request<T>('DELETE', url, undefined, config);\n }\n\n async patch<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PATCH request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PATCH', url, data, config);\n }\n}\n","import Logger from './logger';\n\n/**\n * Builds a complete URL from a base URL and path, handling both absolute and relative URLs.\n *\n * @param baseUrl - The base URL (e.g., \"https://api.reverb.com/api\")\n * @param path - The path to append (e.g., \"/my/listings\" or \"my/listings\")\n * @returns The complete URL\n *\n * @example\n * ```ts\n * buildUrl(\"https://api.reverb.com/api\", \"/my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"https://example.com/absolute\")\n * // Returns: \"https://example.com/absolute\"\n * ```\n */\nexport function buildUrl(baseUrl: string, path: string): string {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n Logger.debug('Provided path is an absolute URL: %s', path);\n return path;\n }\n\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n const fullUrl = `${normalizedBase}${normalizedPath}`;\n Logger.debug(\n 'Built URL: %s from base: %s and path: %s',\n fullUrl,\n baseUrl,\n path,\n );\n return fullUrl;\n}\n","import Logger from './logger';\n\n/**\n * Builds a URL-encoded query string from an object of parameters.\n * Filters out undefined and null values.\n *\n * @param params - An object containing query parameters\n * @returns A query string (without leading \"?\") or empty string if no valid params\n *\n * @example\n * ```ts\n * buildQueryString({ page: 1, per_page: 50 })\n * // Returns: \"page=1&per_page=50\"\n *\n * buildQueryString({ query: \"guitar\", state: undefined })\n * // Returns: \"query=guitar\"\n *\n * buildQueryString({ search: \"hello world\" })\n * // Returns: \"search=hello%20world\"\n *\n * buildQueryString({})\n * // Returns: \"\"\n * ```\n */\nexport function buildQueryString(\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const entries = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;\n });\n\n Logger.debug(\n 'Built query string: %s from params: %o',\n entries.join('&'),\n params,\n );\n return entries.join('&');\n}\n\n/**\n * Builds a complete URL with query parameters.\n *\n * @param baseUrl - The base URL\n * @param params - An object containing query parameters\n * @returns The complete URL with query string\n *\n * @example\n * ```ts\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", { page: 1 })\n * // Returns: \"https://api.reverb.com/api/my/listings?page=1\"\n *\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", {})\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n * ```\n */\nexport function buildUrlWithQuery(\n baseUrl: string,\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const queryString = buildQueryString(params);\n if (!queryString) {\n return baseUrl;\n }\n return `${baseUrl}?${queryString}`;\n}\n","import Logger from './logger';\n\nexport interface PaginationOptions {\n perPage?: number;\n startPage?: number;\n maxPages?: number;\n}\n\nexport interface PaginatedFetchResult<T> {\n items: T[];\n hasMore: boolean;\n currentPage: number;\n}\n\nexport async function paginateAll<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): Promise<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n } = options;\n\n const allItems: T[] = [];\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n allItems.push(...result.items);\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n }\n\n Logger.debug(\n 'Pagination complete. Total items fetched: %d across %d pages.',\n allItems.length,\n pagesProcessed,\n );\n return allItems;\n}\n\nexport async function* paginateStream<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): AsyncGenerator<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n } = options;\n\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n if (result.items.length > 0) {\n yield result.items;\n }\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n }\n\n Logger.debug('Stream pagination complete after %d pages.', pagesProcessed + 1);\n}\n\nexport function createPaginatedResult<T>(\n items: T[],\n perPage: number,\n currentPage: number,\n): PaginatedFetchResult<T> {\n return {\n items,\n hasMore: items.length === perPage,\n currentPage,\n };\n}\n","import { Listing, ListingStates, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n buildUrl,\n buildUrlWithQuery,\n paginateAll,\n paginateStream,\n createPaginatedResult,\n} from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyListingsOptions {\n page?: number;\n perPage?: number;\n query?: string;\n state?: string;\n}\n\nexport const getMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyListingsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: Listing[] }>>> => {\n const { page, perPage, query, state } = options;\n\n const url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings'), {\n page,\n per_page: perPage,\n query,\n state,\n });\n Logger.debug('Fetching my listings with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ listings: Listing[] }>>(url, {\n headers: config.headers,\n });\n};\n\nexport interface GetAllMyListingsOptions {\n query?: string;\n state?: ListingStates;\n}\n\nexport const getAllMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): Promise<HttpResponse<Listing[]>> => {\n const { query, state } = options;\n\n const allListings = await paginateAll<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50 },\n );\n\n return {\n data: allListings,\n status: 200,\n statusText: 'OK',\n headers: {},\n config: {},\n };\n};\n\nexport async function* streamAllMyListings(\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): AsyncGenerator<Listing> {\n const { query, state } = options;\n\n const pages = paginateStream<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50 },\n );\n\n for await (const page of pages) {\n for (const listing of page) {\n yield listing;\n }\n }\n}\n\nexport interface GetOneListingOptions {\n id: string;\n}\n\nexport const getOneListing = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingOptions,\n): Promise<HttpResponse<Listing>> => {\n const { id } = options;\n const url = buildUrl(config.rootEndpoint, `/listings/${id}`);\n Logger.debug('Fetching listing with ID: %s using URL: %s', id, url);\n return client.get<Listing>(url, { headers: config.headers });\n};\n\nexport interface GetOneListingPhotosOptions {\n id: string;\n}\n\nexport const getOneListingPhotos = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingPhotosOptions,\n): Promise<HttpResponse<{ photos: string[] }>> => {\n const { id } = options;\n\n const oneListingResponse = await getOneListing(client, config, { id });\n\n const photos =\n oneListingResponse.data?.photos?.map((photo) => photo._links.full.href) ||\n [];\n Logger.debug('Fetched %d photos for listing with ID: %s', photos.length, id);\n\n return {\n data: { photos },\n status: oneListingResponse.status,\n statusText: oneListingResponse.statusText,\n headers: oneListingResponse.headers,\n config: oneListingResponse.config,\n };\n};\n","import type { Listing, ListingPostBody } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport const postListing = async (\n client: HttpClient,\n config: ReverbConfig,\n body: ListingPostBody,\n): Promise<HttpResponse<Listing>> => {\n const url = buildUrl(config.rootEndpoint, '/listings');\n Logger.debug('Posting new listing with URL: %s and body: %o', url, body);\n return client.post<Listing>(url, JSON.stringify(body), {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getMyListings,\n getAllMyListings,\n streamAllMyListings,\n getOneListing,\n GetMyListingsOptions,\n GetAllMyListingsOptions,\n GetOneListingOptions,\n} from '~/methods/listings/getListings';\nimport { postListing } from '~/methods/listings/postListing';\nimport { ListingPostBody } from '~/types';\n\nexport class ListingsResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyListingsOptions = {}) {\n return getMyListings(this.getClient(), this.getConfig(), options);\n }\n\n getOne(options: GetOneListingOptions) {\n return getOneListing(this.getClient(), this.getConfig(), options);\n }\n\n async getPhotos(options: GetOneListingOptions) {\n const response = await getOneListing(\n this.getClient(),\n this.getConfig(),\n options,\n );\n const photos =\n response.data?.photos?.map((photo) => photo._links.full.href) || [];\n return photos;\n }\n\n getAllMy(options: GetAllMyListingsOptions = {}) {\n return getAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n streamAllMy(options: GetAllMyListingsOptions = {}) {\n return streamAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n create(body: ListingPostBody) {\n return postListing(this.getClient(), this.getConfig(), body);\n }\n}\n","import { Order, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl, buildUrlWithQuery } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyOrdersOptions {\n page?: number;\n}\n\nexport const getMyOrders = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyOrdersOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ orders: Order[] }>>> => {\n const { page } = options;\n\n const url = buildUrlWithQuery(\n buildUrl(config.rootEndpoint, '/my/orders/selling/all'),\n { page },\n );\n\n Logger.debug('Fetching my orders with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ orders: Order[] }>>(url, {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { getMyOrders, GetMyOrdersOptions } from '~/methods/orders/getOrders';\n\nexport class OrdersResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyOrdersOptions = {}) {\n return getMyOrders(this.getClient(), this.getConfig(), options);\n }\n}\n","\n\n/*\n\nFind your Active Offers\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\" \nhttps://api.reverb.com/api/my/listings/negotiations\n\n */\n\n/*\n\nGet the details of an individual Offer\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\"\nhttps://api.reverb.com/api/my/negotiations/[offer_id]\n\n */\n\nimport { HttpClient, HttpResponse } from '../../http';\nimport { ReverbConfig } from '../../config/ReverbConfig';\nimport { Negotiation, ListingWithNegotiations, PaginatedReverbResponse } from '../../types';\nimport { buildUrlWithQuery, buildUrl } from '../../utils';\n\nexport interface GetNegotiationsOptions {\n\tpage?: number;\n\tperPage?: number;\n\tstatus?: 'active' | 'active_for_seller' | 'all';\n\tnegotiation_type?: 'standard' | 'auto_push_offer';\n}\n\nexport const getNegotiations = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\toptions: GetNegotiationsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>> => {\n\tconst { page, perPage, status, negotiation_type } = options;\n\n\tconst url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings/negotiations'), {\n\t\tpage,\n\t\tper_page: perPage,\n\t\tstatus,\n\t\tnegotiation_type,\n\t});\n\n\treturn client.get<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>(url, {\n\t\theaders: config.headers,\n\t});\n};\n\nexport const getNegotiation = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\tofferId: number,\n): Promise<HttpResponse<Negotiation>> => {\n\tconst url = buildUrl(config.rootEndpoint, `/my/negotiations/${offerId}`);\n\n\treturn client.get<Negotiation>(url, {\n\t\theaders: config.headers,\n\t});\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getNegotiation,\n getNegotiations,\n\tGetNegotiationsOptions\n} from '../methods/negotiations/getNegotiations';\n\nexport class NegotiationsResource {\n\tconstructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n\tgetNegotiations(options: GetNegotiationsOptions) {\n\t\treturn getNegotiations(this.getClient(), this.getConfig(), options);\n\t}\n\n\tgetNegotiation(offerId: number) {\n\t\treturn getNegotiation(this.getClient(), this.getConfig(), offerId);\n\t}\n}\n","export * from './listings/getListings';\nexport * from './listings/postListing';\nexport * from './orders/getOrders';\nexport type { PaginatedReverbResponse } from '~/types';\n\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport type GetArbitraryEndpointOptions = {\n url: string;\n params?: { [key: string]: string };\n};\n\nexport const getArbitraryEndpoint = async <T = any>(\n client: HttpClient,\n config: ReverbConfig,\n options: GetArbitraryEndpointOptions,\n): Promise<HttpResponse<T>> => {\n const { url, params } = options;\n const requestUrl = url.startsWith('http')\n ? url\n : buildUrl(config.rootEndpoint, url);\n\n Logger.debug(\n 'Fetching arbitrary endpoint with URL: %s and params: %o',\n requestUrl,\n params,\n );\n\n return client.get<T>(requestUrl, { headers: config.headers, params });\n};\n","import { ReverbConfig, createReverbConfig } from \"./config/ReverbConfig\";\nimport { FetchHttpClient, HttpClient } from \"./http\";\nimport { ListingsResource } from \"./resources/ListingsResource\";\nimport { OrdersResource } from \"./resources/OrdersResource\";\nimport { NegotiationsResource } from \"./resources/NegotiationsResource\";\nimport { getArbitraryEndpoint, GetArbitraryEndpointOptions } from \"./methods\";\nimport Logger from \"./utils/logger\";\n\nexport type ApiVersion = string;\nexport type ApiKey = string;\nexport type Locale = string;\nexport type ShippingRegion = string;\nexport type DisplayCurrency = string;\nexport type RootEndpoint = Domain;\n\ntype Domain = `${string}.${string}` | `${string}.${string}.${string}`;\n\nexport interface ReverbOptions {\n apiKey: ApiKey;\n version?: ApiVersion | undefined;\n rootEndpoint?: RootEndpoint | undefined;\n displayCurrency?: DisplayCurrency | undefined;\n shippingRegion?: ShippingRegion | undefined;\n locale?: Locale | undefined;\n}\n\nexport type ReverbHeaders = {\n \"Content-Type\": string;\n \"Accept-Version\": ApiVersion;\n Accept: string;\n \"Accept-Language\": Locale;\n \"X-Display-Currency\": DisplayCurrency;\n \"X-Shipping-Region\"?: ShippingRegion | undefined;\n \"User-Agent\"?: string;\n [key: string]: string | undefined;\n};\n\nexport interface AuthReverbHeaders extends ReverbHeaders {\n Authorization: `Bearer ${ApiKey}`;\n}\n\nexport default class Reverb {\n static defaultHeaders: ReverbHeaders = {\n \"Content-Type\": \"application/hal+json\",\n \"Accept-Version\": \"3.0\",\n Accept: \"application/hal+json\",\n \"Accept-Language\": \"en\",\n \"X-Display-Currency\": \"USD\",\n \"User-Agent\": \"Reverb Node SDK\",\n };\n\n private _rootEndpoint: RootEndpoint = \"https://api.reverb.com/api\";\n private _version: ApiVersion = Reverb.defaultHeaders[\"Accept-Version\"];\n private apiKey: string;\n private _headers: AuthReverbHeaders;\n private _displayCurrency: DisplayCurrency = Reverb.defaultHeaders[\"X-Display-Currency\"];\n private _shippingRegion: ShippingRegion | undefined;\n private _locale: Locale = Reverb.defaultHeaders[\"Accept-Language\"];\n private _config!: ReverbConfig;\n private _httpClient: HttpClient;\n\n readonly listings: ListingsResource;\n readonly orders: OrdersResource;\n readonly negotiations: NegotiationsResource;\n constructor(options: ReverbOptions) {\n const {\n apiKey,\n version,\n rootEndpoint: defaultEndpoint,\n displayCurrency,\n shippingRegion,\n locale,\n } = options;\n\n if (!apiKey || apiKey === \"\") {\n throw new Error(\"Reverb: apiKey is required\");\n }\n\n if (version) this._version = version;\n if (defaultEndpoint) this._rootEndpoint = defaultEndpoint;\n if (displayCurrency) this._displayCurrency = displayCurrency;\n if (shippingRegion) this._shippingRegion = shippingRegion;\n if (locale) this._locale = locale;\n\n this.apiKey = apiKey;\n this._headers = {\n ...Reverb.defaultHeaders,\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n this._httpClient = new FetchHttpClient();\n this.updateHeaders();\n this._updateConfig();\n\n this.listings = new ListingsResource(\n () => this._httpClient,\n () => this._config,\n );\n this.orders = new OrdersResource(\n () => this._httpClient,\n () => this._config,\n );\n this.negotiations = new NegotiationsResource(\n () => this._httpClient,\n () => this._config,\n );\n\n Logger.trace(\"Reverb client initialized with config: %o\", this._config);\n }\n\n private updateHeaders() {\n const optionalHeaders = {} as any;\n if (this._shippingRegion) optionalHeaders[\"X-Shipping-Region\"] = this._shippingRegion;\n\n Logger.debug(\n \"Updating headers with API key and config values. Shipping region included: %s\",\n !!this._shippingRegion,\n );\n\n this._headers = {\n ...this._headers,\n Authorization: `Bearer ${this.apiKey}`,\n \"Accept-Version\": this._version,\n \"X-Display-Currency\": this._displayCurrency,\n \"Accept-Language\": this._locale,\n ...optionalHeaders,\n };\n }\n\n private _updateConfig() {\n Logger.debug(\n \"Updating Reverb config with current settings. Root endpoint: %s, Version: %s, Display currency: %s, Locale: %s, Shipping region: %s\",\n this._rootEndpoint,\n this._version,\n this._displayCurrency,\n this._locale,\n this._shippingRegion,\n );\n\n this._config = createReverbConfig({\n rootEndpoint: this._rootEndpoint,\n apiKey: this.apiKey,\n headers: this._headers,\n version: this._version,\n locale: this._locale,\n displayCurrency: this._displayCurrency,\n shippingRegion: this._shippingRegion,\n });\n }\n\n set locale(locale: Locale) {\n Logger.debug(\"Setting locale to: %s\", locale);\n\n this._locale = locale;\n this.updateHeaders();\n this._updateConfig();\n }\n get locale() {\n return this._locale;\n }\n\n set shippingRegion(shippingRegion: ShippingRegion | undefined) {\n Logger.debug(\"Setting shipping region to: %s\", shippingRegion);\n\n this._shippingRegion = shippingRegion;\n this.updateHeaders();\n this._updateConfig();\n }\n get shippingRegion(): ShippingRegion | undefined {\n return this._shippingRegion;\n }\n\n get headers(): AuthReverbHeaders {\n return this._headers;\n }\n\n set displayCurrency(displayCurrency: DisplayCurrency) {\n Logger.debug(\"Setting display currency to: %s\", displayCurrency);\n\n this._displayCurrency = displayCurrency;\n this.updateHeaders();\n this._updateConfig();\n }\n get displayCurrency(): DisplayCurrency {\n return this._displayCurrency;\n }\n\n set version(version: ApiVersion) {\n Logger.debug(\"Setting API version to: %s\", version);\n\n this._version = version;\n this.updateHeaders();\n this._updateConfig();\n }\n get version(): ApiVersion {\n return this._version;\n }\n\n set rootEndpoint(rootEndpoint: RootEndpoint) {\n Logger.debug(\"Setting root endpoint to: %s\", rootEndpoint);\n\n this._rootEndpoint = rootEndpoint;\n this._updateConfig();\n }\n get rootEndpoint(): RootEndpoint {\n return this._rootEndpoint;\n }\n\n get config(): ReverbConfig {\n return this._config;\n }\n\n async _getArbitraryEndpoint<T = any>(\n url: string,\n params?: GetArbitraryEndpointOptions[\"params\"],\n ) {\n return getArbitraryEndpoint<T>(this._httpClient, this._config, {\n url,\n params,\n });\n }\n}\n","export * from './Reverb';\nexport * from './resources/ListingsResource';\nexport * from './resources/OrdersResource';\n\nimport Reverb from './Reverb';\n\nexport default Reverb;\n"]}
1
+ {"version":3,"sources":["/home/runner/work/sound-tank/sound-tank/dist/index.js","../src/config/ReverbConfig.ts","../src/utils/logger.ts","../src/http/FetchHttpClient.ts","../src/utils/urlBuilder.ts","../src/utils/queryBuilder.ts","../src/utils/pagination.ts","../src/methods/listings/getListings.ts","../src/methods/listings/postListing.ts","../src/resources/ListingsResource.ts","../src/methods/orders/getOrders.ts","../src/resources/OrdersResource.ts","../src/methods/negotiations/getNegotiations.ts","../src/resources/NegotiationsResource.ts","../src/methods/index.ts","../src/Reverb.ts","../src/index.ts"],"names":["LogLevel"],"mappings":"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","file":"/home/runner/work/sound-tank/sound-tank/dist/index.js","sourcesContent":[null,"import {\n ApiKey,\n ApiVersion,\n AuthReverbHeaders,\n DisplayCurrency,\n Locale,\n RootEndpoint,\n ShippingRegion,\n} from '../Reverb';\n\nexport interface ReverbConfig {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}\n\nexport function createReverbConfig(params: {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}): ReverbConfig {\n return {\n rootEndpoint: params.rootEndpoint,\n apiKey: params.apiKey,\n headers: params.headers,\n version: params.version,\n locale: params.locale,\n displayCurrency: params.displayCurrency,\n shippingRegion: params.shippingRegion,\n };\n}\n","export enum LogLevel {\n ERROR = '0',\n WARN = '1',\n INFO = '2',\n DEBUG = '3',\n TRACE = '4',\n}\n\nexport default class Logger {\n static log(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.log(`[Reverb API Client] ${message}`, ...args);\n }\n\n static error(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.error(`[Reverb API Client] ${message}`, ...args);\n }\n\n static warn(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.WARN\n ) {\n return;\n }\n console.warn(`[Reverb API Client] ${message}`, ...args);\n }\n\n static info(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.INFO\n ) {\n return;\n }\n console.info(`[Reverb API Client] ${message}`, ...args);\n }\n\n static debug(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.debug(`[Reverb API Client] ${message}`, ...args);\n }\n\n static trace(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.TRACE\n ) {\n return;\n }\n console.trace(`[Reverb API Client] ${message}`, ...args);\n }\n\n static group(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.group(`[Reverb API Client] ${message}`, ...args);\n }\n\n static groupEnd(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.groupEnd();\n }\n\n static time(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.time(`[Reverb API Client] ${label}`);\n }\n\n static timeEnd(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.timeEnd(`[Reverb API Client] ${label}`);\n }\n\n static assert(condition: any, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.assert(condition, `[Reverb API Client] ${message}`, ...args);\n }\n\n static clear(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.clear();\n }\n\n static count(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.count(`[Reverb API Client] ${label}`);\n }\n\n static countReset(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.countReset(`[Reverb API Client] ${label}`);\n }\n\n static dir(level: LogLevel, object: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.dir(object);\n }\n\n static table(level: LogLevel, data: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.table(data);\n }\n\n static groupCollapsed(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.groupCollapsed(`[Reverb API Client] ${message}`, ...args);\n }\n}\n","import { HttpClient } from './HttpClient';\nimport { HttpRequestConfig, HttpResponse } from './types';\nimport Logger from '~/utils/logger';\n\nexport class FetchHttpClient implements HttpClient {\n private async request<T>(\n method: string,\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const { headers, params, timeout } = config ?? {};\n\n let fullUrl = url;\n if (params) {\n const query = Object.entries(params)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n if (query) fullUrl += (url.includes('?') ? '&' : '?') + query;\n }\n\n let controller: AbortController | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (timeout) {\n controller = new AbortController();\n timeoutId = setTimeout(() => controller!.abort(), timeout);\n }\n\n try {\n const resolvedHeaders = headers\n ? (Object.fromEntries(\n Object.entries(headers).filter(([, v]) => v !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n const init: RequestInit = {\n method,\n headers: resolvedHeaders,\n signal: controller?.signal,\n };\n if (data !== undefined) {\n init.body = JSON.stringify(data);\n }\n\n const res = await fetch(fullUrl, init);\n\n if (timeoutId) clearTimeout(timeoutId);\n\n const responseHeaders: Record<string, string> = {};\n res.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const contentType = res.headers.get('content-type') ?? '';\n const responseData: T =\n contentType.includes('json')\n ? await res.json()\n : (await res.text()) as unknown as T;\n\n if (!res.ok) {\n const err = new Error(`HTTP ${res.status}: ${res.statusText}`) as any;\n err.status = res.status;\n err.response = {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n throw err;\n }\n\n return {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n } catch (err) {\n if (timeoutId) clearTimeout(timeoutId);\n throw err;\n }\n }\n\n async get<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('GET request to %s with config: %o', url, config);\n return this.request<T>('GET', url, undefined, config);\n }\n\n async post<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('POST request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('POST', url, data, config);\n }\n\n async put<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PUT request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PUT', url, data, config);\n }\n\n async delete<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('DELETE request to %s with config: %o', url, config);\n return this.request<T>('DELETE', url, undefined, config);\n }\n\n async patch<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PATCH request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PATCH', url, data, config);\n }\n}\n","import Logger from './logger';\n\n/**\n * Builds a complete URL from a base URL and path, handling both absolute and relative URLs.\n *\n * @param baseUrl - The base URL (e.g., \"https://api.reverb.com/api\")\n * @param path - The path to append (e.g., \"/my/listings\" or \"my/listings\")\n * @returns The complete URL\n *\n * @example\n * ```ts\n * buildUrl(\"https://api.reverb.com/api\", \"/my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"https://example.com/absolute\")\n * // Returns: \"https://example.com/absolute\"\n * ```\n */\nexport function buildUrl(baseUrl: string, path: string): string {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n Logger.debug('Provided path is an absolute URL: %s', path);\n return path;\n }\n\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n const fullUrl = `${normalizedBase}${normalizedPath}`;\n Logger.debug(\n 'Built URL: %s from base: %s and path: %s',\n fullUrl,\n baseUrl,\n path,\n );\n return fullUrl;\n}\n","import Logger from './logger';\n\n/**\n * Builds a URL-encoded query string from an object of parameters.\n * Filters out undefined and null values.\n *\n * @param params - An object containing query parameters\n * @returns A query string (without leading \"?\") or empty string if no valid params\n *\n * @example\n * ```ts\n * buildQueryString({ page: 1, per_page: 50 })\n * // Returns: \"page=1&per_page=50\"\n *\n * buildQueryString({ query: \"guitar\", state: undefined })\n * // Returns: \"query=guitar\"\n *\n * buildQueryString({ search: \"hello world\" })\n * // Returns: \"search=hello%20world\"\n *\n * buildQueryString({})\n * // Returns: \"\"\n * ```\n */\nexport function buildQueryString(\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const entries = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;\n });\n\n Logger.debug(\n 'Built query string: %s from params: %o',\n entries.join('&'),\n params,\n );\n return entries.join('&');\n}\n\n/**\n * Builds a complete URL with query parameters.\n *\n * @param baseUrl - The base URL\n * @param params - An object containing query parameters\n * @returns The complete URL with query string\n *\n * @example\n * ```ts\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", { page: 1 })\n * // Returns: \"https://api.reverb.com/api/my/listings?page=1\"\n *\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", {})\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n * ```\n */\nexport function buildUrlWithQuery(\n baseUrl: string,\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const queryString = buildQueryString(params);\n if (!queryString) {\n return baseUrl;\n }\n return `${baseUrl}?${queryString}`;\n}\n","import Logger from './logger';\n\nexport interface PaginationOptions {\n perPage?: number;\n startPage?: number;\n maxPages?: number;\n throttle?: { delayMs: number; everyNPages: number };\n}\n\nexport interface PaginatedFetchResult<T> {\n items: T[];\n hasMore: boolean;\n currentPage: number;\n}\n\nexport async function paginateAll<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): Promise<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n throttle,\n } = options;\n\n const allItems: T[] = [];\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n allItems.push(...result.items);\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n\n if (throttle && pagesProcessed % throttle.everyNPages === 0) {\n Logger.debug('Throttling: waiting %dms after %d pages.', throttle.delayMs, pagesProcessed);\n await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));\n }\n }\n\n Logger.debug(\n 'Pagination complete. Total items fetched: %d across %d pages.',\n allItems.length,\n pagesProcessed,\n );\n return allItems;\n}\n\nexport async function* paginateStream<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): AsyncGenerator<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n throttle,\n } = options;\n\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n if (result.items.length > 0) {\n yield result.items;\n }\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n\n if (throttle && pagesProcessed % throttle.everyNPages === 0) {\n Logger.debug('Throttling: waiting %dms after %d pages.', throttle.delayMs, pagesProcessed);\n await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));\n }\n }\n\n Logger.debug('Stream pagination complete after %d pages.', pagesProcessed + 1);\n}\n\nexport function createPaginatedResult<T>(\n items: T[],\n perPage: number,\n currentPage: number,\n): PaginatedFetchResult<T> {\n return {\n items,\n hasMore: items.length === perPage,\n currentPage,\n };\n}\n","import { Listing, ListingStates, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n buildUrl,\n buildUrlWithQuery,\n paginateAll,\n paginateStream,\n createPaginatedResult,\n} from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyListingsOptions {\n page?: number;\n perPage?: number;\n query?: string;\n state?: string;\n}\n\nexport const getMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyListingsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: Listing[] }>>> => {\n const { page, perPage, query, state } = options;\n\n const url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings'), {\n page,\n per_page: perPage,\n query,\n state,\n });\n Logger.debug('Fetching my listings with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ listings: Listing[] }>>(url, {\n headers: config.headers,\n });\n};\n\nexport interface GetAllMyListingsOptions {\n query?: string;\n state?: ListingStates;\n}\n\nexport const getAllMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): Promise<HttpResponse<Listing[]>> => {\n const { query, state } = options;\n\n const allListings = await paginateAll<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50, throttle: { delayMs: 5000, everyNPages: 5 } },\n );\n\n return {\n data: allListings,\n status: 200,\n statusText: 'OK',\n headers: {},\n config: {},\n };\n};\n\nexport async function* streamAllMyListings(\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): AsyncGenerator<Listing> {\n const { query, state } = options;\n\n const pages = paginateStream<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50, throttle: { delayMs: 5000, everyNPages: 5 } },\n );\n\n for await (const page of pages) {\n for (const listing of page) {\n yield listing;\n }\n }\n}\n\nexport interface GetOneListingOptions {\n id: string;\n}\n\nexport const getOneListing = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingOptions,\n): Promise<HttpResponse<Listing>> => {\n const { id } = options;\n const url = buildUrl(config.rootEndpoint, `/listings/${id}`);\n Logger.debug('Fetching listing with ID: %s using URL: %s', id, url);\n return client.get<Listing>(url, { headers: config.headers });\n};\n\nexport interface GetOneListingPhotosOptions {\n id: string;\n}\n\nexport const getOneListingPhotos = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingPhotosOptions,\n): Promise<HttpResponse<{ photos: string[] }>> => {\n const { id } = options;\n\n const oneListingResponse = await getOneListing(client, config, { id });\n\n const photos =\n oneListingResponse.data?.photos?.map((photo) => photo._links.full.href) ||\n [];\n Logger.debug('Fetched %d photos for listing with ID: %s', photos.length, id);\n\n return {\n data: { photos },\n status: oneListingResponse.status,\n statusText: oneListingResponse.statusText,\n headers: oneListingResponse.headers,\n config: oneListingResponse.config,\n };\n};\n","import type { Listing, ListingPostBody } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport const postListing = async (\n client: HttpClient,\n config: ReverbConfig,\n body: ListingPostBody,\n): Promise<HttpResponse<Listing>> => {\n const url = buildUrl(config.rootEndpoint, '/listings');\n Logger.debug('Posting new listing with URL: %s and body: %o', url, body);\n return client.post<Listing>(url, JSON.stringify(body), {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getMyListings,\n getAllMyListings,\n streamAllMyListings,\n getOneListing,\n GetMyListingsOptions,\n GetAllMyListingsOptions,\n GetOneListingOptions,\n} from '~/methods/listings/getListings';\nimport { postListing } from '~/methods/listings/postListing';\nimport { ListingPostBody } from '~/types';\n\nexport class ListingsResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyListingsOptions = {}) {\n return getMyListings(this.getClient(), this.getConfig(), options);\n }\n\n getOne(options: GetOneListingOptions) {\n return getOneListing(this.getClient(), this.getConfig(), options);\n }\n\n async getPhotos(options: GetOneListingOptions) {\n const response = await getOneListing(\n this.getClient(),\n this.getConfig(),\n options,\n );\n const photos =\n response.data?.photos?.map((photo) => photo._links.full.href) || [];\n return photos;\n }\n\n getAllMy(options: GetAllMyListingsOptions = {}) {\n return getAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n streamAllMy(options: GetAllMyListingsOptions = {}) {\n return streamAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n create(body: ListingPostBody) {\n return postListing(this.getClient(), this.getConfig(), body);\n }\n}\n","import { Order, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl, buildUrlWithQuery } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyOrdersOptions {\n page?: number;\n}\n\nexport const getMyOrders = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyOrdersOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ orders: Order[] }>>> => {\n const { page } = options;\n\n const url = buildUrlWithQuery(\n buildUrl(config.rootEndpoint, '/my/orders/selling/all'),\n { page },\n );\n\n Logger.debug('Fetching my orders with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ orders: Order[] }>>(url, {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { getMyOrders, GetMyOrdersOptions } from '~/methods/orders/getOrders';\n\nexport class OrdersResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyOrdersOptions = {}) {\n return getMyOrders(this.getClient(), this.getConfig(), options);\n }\n}\n","\n\n/*\n\nFind your Active Offers\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\" \nhttps://api.reverb.com/api/my/listings/negotiations\n\n */\n\n/*\n\nGet the details of an individual Offer\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\"\nhttps://api.reverb.com/api/my/negotiations/[offer_id]\n\n */\n\nimport { HttpClient, HttpResponse } from '../../http';\nimport { ReverbConfig } from '../../config/ReverbConfig';\nimport { Negotiation, ListingWithNegotiations, PaginatedReverbResponse } from '../../types';\nimport { buildUrlWithQuery, buildUrl } from '../../utils';\n\nexport interface GetNegotiationsOptions {\n\tpage?: number;\n\tperPage?: number;\n\tstatus?: 'active' | 'active_for_seller' | 'all';\n\tnegotiation_type?: 'standard' | 'auto_push_offer';\n}\n\nexport const getNegotiations = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\toptions: GetNegotiationsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>> => {\n\tconst { page, perPage, status, negotiation_type } = options;\n\n\tconst url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings/negotiations'), {\n\t\tpage,\n\t\tper_page: perPage,\n\t\tstatus,\n\t\tnegotiation_type,\n\t});\n\n\treturn client.get<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>(url, {\n\t\theaders: config.headers,\n\t});\n};\n\nexport const getNegotiation = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\tofferId: number,\n): Promise<HttpResponse<Negotiation>> => {\n\tconst url = buildUrl(config.rootEndpoint, `/my/negotiations/${offerId}`);\n\n\treturn client.get<Negotiation>(url, {\n\t\theaders: config.headers,\n\t});\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getNegotiation,\n getNegotiations,\n\tGetNegotiationsOptions\n} from '../methods/negotiations/getNegotiations';\n\nexport class NegotiationsResource {\n\tconstructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n\tgetNegotiations(options: GetNegotiationsOptions) {\n\t\treturn getNegotiations(this.getClient(), this.getConfig(), options);\n\t}\n\n\tgetNegotiation(offerId: number) {\n\t\treturn getNegotiation(this.getClient(), this.getConfig(), offerId);\n\t}\n}\n","export * from './listings/getListings';\nexport * from './listings/postListing';\nexport * from './orders/getOrders';\nexport type { PaginatedReverbResponse } from '~/types';\n\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport type GetArbitraryEndpointOptions = {\n url: string;\n params?: { [key: string]: string };\n};\n\nexport const getArbitraryEndpoint = async <T = any>(\n client: HttpClient,\n config: ReverbConfig,\n options: GetArbitraryEndpointOptions,\n): Promise<HttpResponse<T>> => {\n const { url, params } = options;\n const requestUrl = url.startsWith('http')\n ? url\n : buildUrl(config.rootEndpoint, url);\n\n Logger.debug(\n 'Fetching arbitrary endpoint with URL: %s and params: %o',\n requestUrl,\n params,\n );\n\n return client.get<T>(requestUrl, { headers: config.headers, params });\n};\n","import { ReverbConfig, createReverbConfig } from \"./config/ReverbConfig\";\nimport { FetchHttpClient, HttpClient } from \"./http\";\nimport { ListingsResource } from \"./resources/ListingsResource\";\nimport { OrdersResource } from \"./resources/OrdersResource\";\nimport { NegotiationsResource } from \"./resources/NegotiationsResource\";\nimport { getArbitraryEndpoint, GetArbitraryEndpointOptions } from \"./methods\";\nimport Logger from \"./utils/logger\";\n\nexport type ApiVersion = string;\nexport type ApiKey = string;\nexport type Locale = string;\nexport type ShippingRegion = string;\nexport type DisplayCurrency = string;\nexport type RootEndpoint = Domain;\n\ntype Domain = `${string}.${string}` | `${string}.${string}.${string}`;\n\nexport interface ReverbOptions {\n apiKey: ApiKey;\n version?: ApiVersion | undefined;\n rootEndpoint?: RootEndpoint | undefined;\n displayCurrency?: DisplayCurrency | undefined;\n shippingRegion?: ShippingRegion | undefined;\n locale?: Locale | undefined;\n}\n\nexport type ReverbHeaders = {\n \"Content-Type\": string;\n \"Accept-Version\": ApiVersion;\n Accept: string;\n \"Accept-Language\": Locale;\n \"X-Display-Currency\": DisplayCurrency;\n \"X-Shipping-Region\"?: ShippingRegion | undefined;\n \"User-Agent\"?: string;\n [key: string]: string | undefined;\n};\n\nexport interface AuthReverbHeaders extends ReverbHeaders {\n Authorization: `Bearer ${ApiKey}`;\n}\n\nexport default class Reverb {\n static defaultHeaders: ReverbHeaders = {\n \"Content-Type\": \"application/hal+json\",\n \"Accept-Version\": \"3.0\",\n Accept: \"application/hal+json\",\n \"Accept-Language\": \"en\",\n \"X-Display-Currency\": \"USD\",\n \"User-Agent\": \"Reverb Node SDK\",\n };\n\n private _rootEndpoint: RootEndpoint = \"https://api.reverb.com/api\";\n private _version: ApiVersion = Reverb.defaultHeaders[\"Accept-Version\"];\n private apiKey: string;\n private _headers: AuthReverbHeaders;\n private _displayCurrency: DisplayCurrency = Reverb.defaultHeaders[\"X-Display-Currency\"];\n private _shippingRegion: ShippingRegion | undefined;\n private _locale: Locale = Reverb.defaultHeaders[\"Accept-Language\"];\n private _config!: ReverbConfig;\n private _httpClient: HttpClient;\n\n readonly listings: ListingsResource;\n readonly orders: OrdersResource;\n readonly negotiations: NegotiationsResource;\n constructor(options: ReverbOptions) {\n const {\n apiKey,\n version,\n rootEndpoint: defaultEndpoint,\n displayCurrency,\n shippingRegion,\n locale,\n } = options;\n\n if (!apiKey || apiKey === \"\") {\n throw new Error(\"Reverb: apiKey is required\");\n }\n\n if (version) this._version = version;\n if (defaultEndpoint) this._rootEndpoint = defaultEndpoint;\n if (displayCurrency) this._displayCurrency = displayCurrency;\n if (shippingRegion) this._shippingRegion = shippingRegion;\n if (locale) this._locale = locale;\n\n this.apiKey = apiKey;\n this._headers = {\n ...Reverb.defaultHeaders,\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n this._httpClient = new FetchHttpClient();\n this.updateHeaders();\n this._updateConfig();\n\n this.listings = new ListingsResource(\n () => this._httpClient,\n () => this._config,\n );\n this.orders = new OrdersResource(\n () => this._httpClient,\n () => this._config,\n );\n this.negotiations = new NegotiationsResource(\n () => this._httpClient,\n () => this._config,\n );\n\n Logger.trace(\"Reverb client initialized with config: %o\", this._config);\n }\n\n private updateHeaders() {\n const optionalHeaders = {} as any;\n if (this._shippingRegion) optionalHeaders[\"X-Shipping-Region\"] = this._shippingRegion;\n\n Logger.debug(\n \"Updating headers with API key and config values. Shipping region included: %s\",\n !!this._shippingRegion,\n );\n\n this._headers = {\n ...this._headers,\n Authorization: `Bearer ${this.apiKey}`,\n \"Accept-Version\": this._version,\n \"X-Display-Currency\": this._displayCurrency,\n \"Accept-Language\": this._locale,\n ...optionalHeaders,\n };\n }\n\n private _updateConfig() {\n Logger.debug(\n \"Updating Reverb config with current settings. Root endpoint: %s, Version: %s, Display currency: %s, Locale: %s, Shipping region: %s\",\n this._rootEndpoint,\n this._version,\n this._displayCurrency,\n this._locale,\n this._shippingRegion,\n );\n\n this._config = createReverbConfig({\n rootEndpoint: this._rootEndpoint,\n apiKey: this.apiKey,\n headers: this._headers,\n version: this._version,\n locale: this._locale,\n displayCurrency: this._displayCurrency,\n shippingRegion: this._shippingRegion,\n });\n }\n\n set locale(locale: Locale) {\n Logger.debug(\"Setting locale to: %s\", locale);\n\n this._locale = locale;\n this.updateHeaders();\n this._updateConfig();\n }\n get locale() {\n return this._locale;\n }\n\n set shippingRegion(shippingRegion: ShippingRegion | undefined) {\n Logger.debug(\"Setting shipping region to: %s\", shippingRegion);\n\n this._shippingRegion = shippingRegion;\n this.updateHeaders();\n this._updateConfig();\n }\n get shippingRegion(): ShippingRegion | undefined {\n return this._shippingRegion;\n }\n\n get headers(): AuthReverbHeaders {\n return this._headers;\n }\n\n set displayCurrency(displayCurrency: DisplayCurrency) {\n Logger.debug(\"Setting display currency to: %s\", displayCurrency);\n\n this._displayCurrency = displayCurrency;\n this.updateHeaders();\n this._updateConfig();\n }\n get displayCurrency(): DisplayCurrency {\n return this._displayCurrency;\n }\n\n set version(version: ApiVersion) {\n Logger.debug(\"Setting API version to: %s\", version);\n\n this._version = version;\n this.updateHeaders();\n this._updateConfig();\n }\n get version(): ApiVersion {\n return this._version;\n }\n\n set rootEndpoint(rootEndpoint: RootEndpoint) {\n Logger.debug(\"Setting root endpoint to: %s\", rootEndpoint);\n\n this._rootEndpoint = rootEndpoint;\n this._updateConfig();\n }\n get rootEndpoint(): RootEndpoint {\n return this._rootEndpoint;\n }\n\n get config(): ReverbConfig {\n return this._config;\n }\n\n async _getArbitraryEndpoint<T = any>(\n url: string,\n params?: GetArbitraryEndpointOptions[\"params\"],\n ) {\n return getArbitraryEndpoint<T>(this._httpClient, this._config, {\n url,\n params,\n });\n }\n}\n","export * from './Reverb';\nexport * from './resources/ListingsResource';\nexport * from './resources/OrdersResource';\n\nimport Reverb from './Reverb';\n\nexport default Reverb;\n"]}
package/dist/index.mjs CHANGED
@@ -260,7 +260,8 @@ async function paginateAll(fetchPage, options = {}) {
260
260
  const {
261
261
  perPage = 50,
262
262
  startPage = 1,
263
- maxPages = Number.MAX_SAFE_INTEGER
263
+ maxPages = Number.MAX_SAFE_INTEGER,
264
+ throttle
264
265
  } = options;
265
266
  const allItems = [];
266
267
  let currentPage = startPage;
@@ -281,6 +282,10 @@ async function paginateAll(fetchPage, options = {}) {
281
282
  }
282
283
  currentPage++;
283
284
  pagesProcessed++;
285
+ if (throttle && pagesProcessed % throttle.everyNPages === 0) {
286
+ Logger.debug("Throttling: waiting %dms after %d pages.", throttle.delayMs, pagesProcessed);
287
+ await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));
288
+ }
284
289
  }
285
290
  Logger.debug(
286
291
  "Pagination complete. Total items fetched: %d across %d pages.",
@@ -294,7 +299,8 @@ async function* paginateStream(fetchPage, options = {}) {
294
299
  const {
295
300
  perPage = 50,
296
301
  startPage = 1,
297
- maxPages = Number.MAX_SAFE_INTEGER
302
+ maxPages = Number.MAX_SAFE_INTEGER,
303
+ throttle
298
304
  } = options;
299
305
  let currentPage = startPage;
300
306
  let pagesProcessed = 0;
@@ -316,6 +322,10 @@ async function* paginateStream(fetchPage, options = {}) {
316
322
  }
317
323
  currentPage++;
318
324
  pagesProcessed++;
325
+ if (throttle && pagesProcessed % throttle.everyNPages === 0) {
326
+ Logger.debug("Throttling: waiting %dms after %d pages.", throttle.delayMs, pagesProcessed);
327
+ await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));
328
+ }
319
329
  }
320
330
  Logger.debug("Stream pagination complete after %d pages.", pagesProcessed + 1);
321
331
  }
@@ -355,7 +365,7 @@ var getAllMyListings = /* @__PURE__ */ __name(async (client, config, options) =>
355
365
  });
356
366
  return createPaginatedResult(response.data.listings || [], perPage, page);
357
367
  },
358
- { perPage: 50 }
368
+ { perPage: 50, throttle: { delayMs: 5e3, everyNPages: 5 } }
359
369
  );
360
370
  return {
361
371
  data: allListings,
@@ -377,7 +387,7 @@ async function* streamAllMyListings(client, config, options) {
377
387
  });
378
388
  return createPaginatedResult(response.data.listings || [], perPage, page);
379
389
  },
380
- { perPage: 50 }
390
+ { perPage: 50, throttle: { delayMs: 5e3, everyNPages: 5 } }
381
391
  );
382
392
  for await (const page of pages) {
383
393
  for (const listing of page) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/ReverbConfig.ts","../src/utils/logger.ts","../src/http/FetchHttpClient.ts","../src/utils/urlBuilder.ts","../src/utils/queryBuilder.ts","../src/utils/pagination.ts","../src/methods/listings/getListings.ts","../src/methods/listings/postListing.ts","../src/resources/ListingsResource.ts","../src/methods/orders/getOrders.ts","../src/resources/OrdersResource.ts","../src/methods/negotiations/getNegotiations.ts","../src/resources/NegotiationsResource.ts","../src/methods/index.ts","../src/Reverb.ts","../src/index.ts"],"sourcesContent":["import {\n ApiKey,\n ApiVersion,\n AuthReverbHeaders,\n DisplayCurrency,\n Locale,\n RootEndpoint,\n ShippingRegion,\n} from '../Reverb';\n\nexport interface ReverbConfig {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}\n\nexport function createReverbConfig(params: {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}): ReverbConfig {\n return {\n rootEndpoint: params.rootEndpoint,\n apiKey: params.apiKey,\n headers: params.headers,\n version: params.version,\n locale: params.locale,\n displayCurrency: params.displayCurrency,\n shippingRegion: params.shippingRegion,\n };\n}\n","export enum LogLevel {\n ERROR = '0',\n WARN = '1',\n INFO = '2',\n DEBUG = '3',\n TRACE = '4',\n}\n\nexport default class Logger {\n static log(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.log(`[Reverb API Client] ${message}`, ...args);\n }\n\n static error(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.error(`[Reverb API Client] ${message}`, ...args);\n }\n\n static warn(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.WARN\n ) {\n return;\n }\n console.warn(`[Reverb API Client] ${message}`, ...args);\n }\n\n static info(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.INFO\n ) {\n return;\n }\n console.info(`[Reverb API Client] ${message}`, ...args);\n }\n\n static debug(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.debug(`[Reverb API Client] ${message}`, ...args);\n }\n\n static trace(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.TRACE\n ) {\n return;\n }\n console.trace(`[Reverb API Client] ${message}`, ...args);\n }\n\n static group(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.group(`[Reverb API Client] ${message}`, ...args);\n }\n\n static groupEnd(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.groupEnd();\n }\n\n static time(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.time(`[Reverb API Client] ${label}`);\n }\n\n static timeEnd(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.timeEnd(`[Reverb API Client] ${label}`);\n }\n\n static assert(condition: any, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.assert(condition, `[Reverb API Client] ${message}`, ...args);\n }\n\n static clear(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.clear();\n }\n\n static count(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.count(`[Reverb API Client] ${label}`);\n }\n\n static countReset(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.countReset(`[Reverb API Client] ${label}`);\n }\n\n static dir(level: LogLevel, object: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.dir(object);\n }\n\n static table(level: LogLevel, data: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.table(data);\n }\n\n static groupCollapsed(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.groupCollapsed(`[Reverb API Client] ${message}`, ...args);\n }\n}\n","import { HttpClient } from './HttpClient';\nimport { HttpRequestConfig, HttpResponse } from './types';\nimport Logger from '~/utils/logger';\n\nexport class FetchHttpClient implements HttpClient {\n private async request<T>(\n method: string,\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const { headers, params, timeout } = config ?? {};\n\n let fullUrl = url;\n if (params) {\n const query = Object.entries(params)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n if (query) fullUrl += (url.includes('?') ? '&' : '?') + query;\n }\n\n let controller: AbortController | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (timeout) {\n controller = new AbortController();\n timeoutId = setTimeout(() => controller!.abort(), timeout);\n }\n\n try {\n const resolvedHeaders = headers\n ? (Object.fromEntries(\n Object.entries(headers).filter(([, v]) => v !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n const init: RequestInit = {\n method,\n headers: resolvedHeaders,\n signal: controller?.signal,\n };\n if (data !== undefined) {\n init.body = JSON.stringify(data);\n }\n\n const res = await fetch(fullUrl, init);\n\n if (timeoutId) clearTimeout(timeoutId);\n\n const responseHeaders: Record<string, string> = {};\n res.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const contentType = res.headers.get('content-type') ?? '';\n const responseData: T =\n contentType.includes('json')\n ? await res.json()\n : (await res.text()) as unknown as T;\n\n if (!res.ok) {\n const err = new Error(`HTTP ${res.status}: ${res.statusText}`) as any;\n err.status = res.status;\n err.response = {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n throw err;\n }\n\n return {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n } catch (err) {\n if (timeoutId) clearTimeout(timeoutId);\n throw err;\n }\n }\n\n async get<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('GET request to %s with config: %o', url, config);\n return this.request<T>('GET', url, undefined, config);\n }\n\n async post<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('POST request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('POST', url, data, config);\n }\n\n async put<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PUT request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PUT', url, data, config);\n }\n\n async delete<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('DELETE request to %s with config: %o', url, config);\n return this.request<T>('DELETE', url, undefined, config);\n }\n\n async patch<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PATCH request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PATCH', url, data, config);\n }\n}\n","import Logger from './logger';\n\n/**\n * Builds a complete URL from a base URL and path, handling both absolute and relative URLs.\n *\n * @param baseUrl - The base URL (e.g., \"https://api.reverb.com/api\")\n * @param path - The path to append (e.g., \"/my/listings\" or \"my/listings\")\n * @returns The complete URL\n *\n * @example\n * ```ts\n * buildUrl(\"https://api.reverb.com/api\", \"/my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"https://example.com/absolute\")\n * // Returns: \"https://example.com/absolute\"\n * ```\n */\nexport function buildUrl(baseUrl: string, path: string): string {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n Logger.debug('Provided path is an absolute URL: %s', path);\n return path;\n }\n\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n const fullUrl = `${normalizedBase}${normalizedPath}`;\n Logger.debug(\n 'Built URL: %s from base: %s and path: %s',\n fullUrl,\n baseUrl,\n path,\n );\n return fullUrl;\n}\n","import Logger from './logger';\n\n/**\n * Builds a URL-encoded query string from an object of parameters.\n * Filters out undefined and null values.\n *\n * @param params - An object containing query parameters\n * @returns A query string (without leading \"?\") or empty string if no valid params\n *\n * @example\n * ```ts\n * buildQueryString({ page: 1, per_page: 50 })\n * // Returns: \"page=1&per_page=50\"\n *\n * buildQueryString({ query: \"guitar\", state: undefined })\n * // Returns: \"query=guitar\"\n *\n * buildQueryString({ search: \"hello world\" })\n * // Returns: \"search=hello%20world\"\n *\n * buildQueryString({})\n * // Returns: \"\"\n * ```\n */\nexport function buildQueryString(\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const entries = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;\n });\n\n Logger.debug(\n 'Built query string: %s from params: %o',\n entries.join('&'),\n params,\n );\n return entries.join('&');\n}\n\n/**\n * Builds a complete URL with query parameters.\n *\n * @param baseUrl - The base URL\n * @param params - An object containing query parameters\n * @returns The complete URL with query string\n *\n * @example\n * ```ts\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", { page: 1 })\n * // Returns: \"https://api.reverb.com/api/my/listings?page=1\"\n *\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", {})\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n * ```\n */\nexport function buildUrlWithQuery(\n baseUrl: string,\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const queryString = buildQueryString(params);\n if (!queryString) {\n return baseUrl;\n }\n return `${baseUrl}?${queryString}`;\n}\n","import Logger from './logger';\n\nexport interface PaginationOptions {\n perPage?: number;\n startPage?: number;\n maxPages?: number;\n}\n\nexport interface PaginatedFetchResult<T> {\n items: T[];\n hasMore: boolean;\n currentPage: number;\n}\n\nexport async function paginateAll<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): Promise<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n } = options;\n\n const allItems: T[] = [];\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n allItems.push(...result.items);\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n }\n\n Logger.debug(\n 'Pagination complete. Total items fetched: %d across %d pages.',\n allItems.length,\n pagesProcessed,\n );\n return allItems;\n}\n\nexport async function* paginateStream<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): AsyncGenerator<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n } = options;\n\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n if (result.items.length > 0) {\n yield result.items;\n }\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n }\n\n Logger.debug('Stream pagination complete after %d pages.', pagesProcessed + 1);\n}\n\nexport function createPaginatedResult<T>(\n items: T[],\n perPage: number,\n currentPage: number,\n): PaginatedFetchResult<T> {\n return {\n items,\n hasMore: items.length === perPage,\n currentPage,\n };\n}\n","import { Listing, ListingStates, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n buildUrl,\n buildUrlWithQuery,\n paginateAll,\n paginateStream,\n createPaginatedResult,\n} from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyListingsOptions {\n page?: number;\n perPage?: number;\n query?: string;\n state?: string;\n}\n\nexport const getMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyListingsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: Listing[] }>>> => {\n const { page, perPage, query, state } = options;\n\n const url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings'), {\n page,\n per_page: perPage,\n query,\n state,\n });\n Logger.debug('Fetching my listings with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ listings: Listing[] }>>(url, {\n headers: config.headers,\n });\n};\n\nexport interface GetAllMyListingsOptions {\n query?: string;\n state?: ListingStates;\n}\n\nexport const getAllMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): Promise<HttpResponse<Listing[]>> => {\n const { query, state } = options;\n\n const allListings = await paginateAll<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50 },\n );\n\n return {\n data: allListings,\n status: 200,\n statusText: 'OK',\n headers: {},\n config: {},\n };\n};\n\nexport async function* streamAllMyListings(\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): AsyncGenerator<Listing> {\n const { query, state } = options;\n\n const pages = paginateStream<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50 },\n );\n\n for await (const page of pages) {\n for (const listing of page) {\n yield listing;\n }\n }\n}\n\nexport interface GetOneListingOptions {\n id: string;\n}\n\nexport const getOneListing = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingOptions,\n): Promise<HttpResponse<Listing>> => {\n const { id } = options;\n const url = buildUrl(config.rootEndpoint, `/listings/${id}`);\n Logger.debug('Fetching listing with ID: %s using URL: %s', id, url);\n return client.get<Listing>(url, { headers: config.headers });\n};\n\nexport interface GetOneListingPhotosOptions {\n id: string;\n}\n\nexport const getOneListingPhotos = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingPhotosOptions,\n): Promise<HttpResponse<{ photos: string[] }>> => {\n const { id } = options;\n\n const oneListingResponse = await getOneListing(client, config, { id });\n\n const photos =\n oneListingResponse.data?.photos?.map((photo) => photo._links.full.href) ||\n [];\n Logger.debug('Fetched %d photos for listing with ID: %s', photos.length, id);\n\n return {\n data: { photos },\n status: oneListingResponse.status,\n statusText: oneListingResponse.statusText,\n headers: oneListingResponse.headers,\n config: oneListingResponse.config,\n };\n};\n","import type { Listing, ListingPostBody } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport const postListing = async (\n client: HttpClient,\n config: ReverbConfig,\n body: ListingPostBody,\n): Promise<HttpResponse<Listing>> => {\n const url = buildUrl(config.rootEndpoint, '/listings');\n Logger.debug('Posting new listing with URL: %s and body: %o', url, body);\n return client.post<Listing>(url, JSON.stringify(body), {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getMyListings,\n getAllMyListings,\n streamAllMyListings,\n getOneListing,\n GetMyListingsOptions,\n GetAllMyListingsOptions,\n GetOneListingOptions,\n} from '~/methods/listings/getListings';\nimport { postListing } from '~/methods/listings/postListing';\nimport { ListingPostBody } from '~/types';\n\nexport class ListingsResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyListingsOptions = {}) {\n return getMyListings(this.getClient(), this.getConfig(), options);\n }\n\n getOne(options: GetOneListingOptions) {\n return getOneListing(this.getClient(), this.getConfig(), options);\n }\n\n async getPhotos(options: GetOneListingOptions) {\n const response = await getOneListing(\n this.getClient(),\n this.getConfig(),\n options,\n );\n const photos =\n response.data?.photos?.map((photo) => photo._links.full.href) || [];\n return photos;\n }\n\n getAllMy(options: GetAllMyListingsOptions = {}) {\n return getAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n streamAllMy(options: GetAllMyListingsOptions = {}) {\n return streamAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n create(body: ListingPostBody) {\n return postListing(this.getClient(), this.getConfig(), body);\n }\n}\n","import { Order, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl, buildUrlWithQuery } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyOrdersOptions {\n page?: number;\n}\n\nexport const getMyOrders = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyOrdersOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ orders: Order[] }>>> => {\n const { page } = options;\n\n const url = buildUrlWithQuery(\n buildUrl(config.rootEndpoint, '/my/orders/selling/all'),\n { page },\n );\n\n Logger.debug('Fetching my orders with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ orders: Order[] }>>(url, {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { getMyOrders, GetMyOrdersOptions } from '~/methods/orders/getOrders';\n\nexport class OrdersResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyOrdersOptions = {}) {\n return getMyOrders(this.getClient(), this.getConfig(), options);\n }\n}\n","\n\n/*\n\nFind your Active Offers\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\" \nhttps://api.reverb.com/api/my/listings/negotiations\n\n */\n\n/*\n\nGet the details of an individual Offer\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\"\nhttps://api.reverb.com/api/my/negotiations/[offer_id]\n\n */\n\nimport { HttpClient, HttpResponse } from '../../http';\nimport { ReverbConfig } from '../../config/ReverbConfig';\nimport { Negotiation, ListingWithNegotiations, PaginatedReverbResponse } from '../../types';\nimport { buildUrlWithQuery, buildUrl } from '../../utils';\n\nexport interface GetNegotiationsOptions {\n\tpage?: number;\n\tperPage?: number;\n\tstatus?: 'active' | 'active_for_seller' | 'all';\n\tnegotiation_type?: 'standard' | 'auto_push_offer';\n}\n\nexport const getNegotiations = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\toptions: GetNegotiationsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>> => {\n\tconst { page, perPage, status, negotiation_type } = options;\n\n\tconst url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings/negotiations'), {\n\t\tpage,\n\t\tper_page: perPage,\n\t\tstatus,\n\t\tnegotiation_type,\n\t});\n\n\treturn client.get<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>(url, {\n\t\theaders: config.headers,\n\t});\n};\n\nexport const getNegotiation = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\tofferId: number,\n): Promise<HttpResponse<Negotiation>> => {\n\tconst url = buildUrl(config.rootEndpoint, `/my/negotiations/${offerId}`);\n\n\treturn client.get<Negotiation>(url, {\n\t\theaders: config.headers,\n\t});\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getNegotiation,\n getNegotiations,\n\tGetNegotiationsOptions\n} from '../methods/negotiations/getNegotiations';\n\nexport class NegotiationsResource {\n\tconstructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n\tgetNegotiations(options: GetNegotiationsOptions) {\n\t\treturn getNegotiations(this.getClient(), this.getConfig(), options);\n\t}\n\n\tgetNegotiation(offerId: number) {\n\t\treturn getNegotiation(this.getClient(), this.getConfig(), offerId);\n\t}\n}\n","export * from './listings/getListings';\nexport * from './listings/postListing';\nexport * from './orders/getOrders';\nexport type { PaginatedReverbResponse } from '~/types';\n\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport type GetArbitraryEndpointOptions = {\n url: string;\n params?: { [key: string]: string };\n};\n\nexport const getArbitraryEndpoint = async <T = any>(\n client: HttpClient,\n config: ReverbConfig,\n options: GetArbitraryEndpointOptions,\n): Promise<HttpResponse<T>> => {\n const { url, params } = options;\n const requestUrl = url.startsWith('http')\n ? url\n : buildUrl(config.rootEndpoint, url);\n\n Logger.debug(\n 'Fetching arbitrary endpoint with URL: %s and params: %o',\n requestUrl,\n params,\n );\n\n return client.get<T>(requestUrl, { headers: config.headers, params });\n};\n","import { ReverbConfig, createReverbConfig } from \"./config/ReverbConfig\";\nimport { FetchHttpClient, HttpClient } from \"./http\";\nimport { ListingsResource } from \"./resources/ListingsResource\";\nimport { OrdersResource } from \"./resources/OrdersResource\";\nimport { NegotiationsResource } from \"./resources/NegotiationsResource\";\nimport { getArbitraryEndpoint, GetArbitraryEndpointOptions } from \"./methods\";\nimport Logger from \"./utils/logger\";\n\nexport type ApiVersion = string;\nexport type ApiKey = string;\nexport type Locale = string;\nexport type ShippingRegion = string;\nexport type DisplayCurrency = string;\nexport type RootEndpoint = Domain;\n\ntype Domain = `${string}.${string}` | `${string}.${string}.${string}`;\n\nexport interface ReverbOptions {\n apiKey: ApiKey;\n version?: ApiVersion | undefined;\n rootEndpoint?: RootEndpoint | undefined;\n displayCurrency?: DisplayCurrency | undefined;\n shippingRegion?: ShippingRegion | undefined;\n locale?: Locale | undefined;\n}\n\nexport type ReverbHeaders = {\n \"Content-Type\": string;\n \"Accept-Version\": ApiVersion;\n Accept: string;\n \"Accept-Language\": Locale;\n \"X-Display-Currency\": DisplayCurrency;\n \"X-Shipping-Region\"?: ShippingRegion | undefined;\n \"User-Agent\"?: string;\n [key: string]: string | undefined;\n};\n\nexport interface AuthReverbHeaders extends ReverbHeaders {\n Authorization: `Bearer ${ApiKey}`;\n}\n\nexport default class Reverb {\n static defaultHeaders: ReverbHeaders = {\n \"Content-Type\": \"application/hal+json\",\n \"Accept-Version\": \"3.0\",\n Accept: \"application/hal+json\",\n \"Accept-Language\": \"en\",\n \"X-Display-Currency\": \"USD\",\n \"User-Agent\": \"Reverb Node SDK\",\n };\n\n private _rootEndpoint: RootEndpoint = \"https://api.reverb.com/api\";\n private _version: ApiVersion = Reverb.defaultHeaders[\"Accept-Version\"];\n private apiKey: string;\n private _headers: AuthReverbHeaders;\n private _displayCurrency: DisplayCurrency = Reverb.defaultHeaders[\"X-Display-Currency\"];\n private _shippingRegion: ShippingRegion | undefined;\n private _locale: Locale = Reverb.defaultHeaders[\"Accept-Language\"];\n private _config!: ReverbConfig;\n private _httpClient: HttpClient;\n\n readonly listings: ListingsResource;\n readonly orders: OrdersResource;\n readonly negotiations: NegotiationsResource;\n constructor(options: ReverbOptions) {\n const {\n apiKey,\n version,\n rootEndpoint: defaultEndpoint,\n displayCurrency,\n shippingRegion,\n locale,\n } = options;\n\n if (!apiKey || apiKey === \"\") {\n throw new Error(\"Reverb: apiKey is required\");\n }\n\n if (version) this._version = version;\n if (defaultEndpoint) this._rootEndpoint = defaultEndpoint;\n if (displayCurrency) this._displayCurrency = displayCurrency;\n if (shippingRegion) this._shippingRegion = shippingRegion;\n if (locale) this._locale = locale;\n\n this.apiKey = apiKey;\n this._headers = {\n ...Reverb.defaultHeaders,\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n this._httpClient = new FetchHttpClient();\n this.updateHeaders();\n this._updateConfig();\n\n this.listings = new ListingsResource(\n () => this._httpClient,\n () => this._config,\n );\n this.orders = new OrdersResource(\n () => this._httpClient,\n () => this._config,\n );\n this.negotiations = new NegotiationsResource(\n () => this._httpClient,\n () => this._config,\n );\n\n Logger.trace(\"Reverb client initialized with config: %o\", this._config);\n }\n\n private updateHeaders() {\n const optionalHeaders = {} as any;\n if (this._shippingRegion) optionalHeaders[\"X-Shipping-Region\"] = this._shippingRegion;\n\n Logger.debug(\n \"Updating headers with API key and config values. Shipping region included: %s\",\n !!this._shippingRegion,\n );\n\n this._headers = {\n ...this._headers,\n Authorization: `Bearer ${this.apiKey}`,\n \"Accept-Version\": this._version,\n \"X-Display-Currency\": this._displayCurrency,\n \"Accept-Language\": this._locale,\n ...optionalHeaders,\n };\n }\n\n private _updateConfig() {\n Logger.debug(\n \"Updating Reverb config with current settings. Root endpoint: %s, Version: %s, Display currency: %s, Locale: %s, Shipping region: %s\",\n this._rootEndpoint,\n this._version,\n this._displayCurrency,\n this._locale,\n this._shippingRegion,\n );\n\n this._config = createReverbConfig({\n rootEndpoint: this._rootEndpoint,\n apiKey: this.apiKey,\n headers: this._headers,\n version: this._version,\n locale: this._locale,\n displayCurrency: this._displayCurrency,\n shippingRegion: this._shippingRegion,\n });\n }\n\n set locale(locale: Locale) {\n Logger.debug(\"Setting locale to: %s\", locale);\n\n this._locale = locale;\n this.updateHeaders();\n this._updateConfig();\n }\n get locale() {\n return this._locale;\n }\n\n set shippingRegion(shippingRegion: ShippingRegion | undefined) {\n Logger.debug(\"Setting shipping region to: %s\", shippingRegion);\n\n this._shippingRegion = shippingRegion;\n this.updateHeaders();\n this._updateConfig();\n }\n get shippingRegion(): ShippingRegion | undefined {\n return this._shippingRegion;\n }\n\n get headers(): AuthReverbHeaders {\n return this._headers;\n }\n\n set displayCurrency(displayCurrency: DisplayCurrency) {\n Logger.debug(\"Setting display currency to: %s\", displayCurrency);\n\n this._displayCurrency = displayCurrency;\n this.updateHeaders();\n this._updateConfig();\n }\n get displayCurrency(): DisplayCurrency {\n return this._displayCurrency;\n }\n\n set version(version: ApiVersion) {\n Logger.debug(\"Setting API version to: %s\", version);\n\n this._version = version;\n this.updateHeaders();\n this._updateConfig();\n }\n get version(): ApiVersion {\n return this._version;\n }\n\n set rootEndpoint(rootEndpoint: RootEndpoint) {\n Logger.debug(\"Setting root endpoint to: %s\", rootEndpoint);\n\n this._rootEndpoint = rootEndpoint;\n this._updateConfig();\n }\n get rootEndpoint(): RootEndpoint {\n return this._rootEndpoint;\n }\n\n get config(): ReverbConfig {\n return this._config;\n }\n\n async _getArbitraryEndpoint<T = any>(\n url: string,\n params?: GetArbitraryEndpointOptions[\"params\"],\n ) {\n return getArbitraryEndpoint<T>(this._httpClient, this._config, {\n url,\n params,\n });\n }\n}\n","export * from './Reverb';\nexport * from './resources/ListingsResource';\nexport * from './resources/OrdersResource';\n\nimport Reverb from './Reverb';\n\nexport default Reverb;\n"],"mappings":"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","names":["LogLevel"]}
1
+ {"version":3,"sources":["../src/config/ReverbConfig.ts","../src/utils/logger.ts","../src/http/FetchHttpClient.ts","../src/utils/urlBuilder.ts","../src/utils/queryBuilder.ts","../src/utils/pagination.ts","../src/methods/listings/getListings.ts","../src/methods/listings/postListing.ts","../src/resources/ListingsResource.ts","../src/methods/orders/getOrders.ts","../src/resources/OrdersResource.ts","../src/methods/negotiations/getNegotiations.ts","../src/resources/NegotiationsResource.ts","../src/methods/index.ts","../src/Reverb.ts","../src/index.ts"],"sourcesContent":["import {\n ApiKey,\n ApiVersion,\n AuthReverbHeaders,\n DisplayCurrency,\n Locale,\n RootEndpoint,\n ShippingRegion,\n} from '../Reverb';\n\nexport interface ReverbConfig {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}\n\nexport function createReverbConfig(params: {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}): ReverbConfig {\n return {\n rootEndpoint: params.rootEndpoint,\n apiKey: params.apiKey,\n headers: params.headers,\n version: params.version,\n locale: params.locale,\n displayCurrency: params.displayCurrency,\n shippingRegion: params.shippingRegion,\n };\n}\n","export enum LogLevel {\n ERROR = '0',\n WARN = '1',\n INFO = '2',\n DEBUG = '3',\n TRACE = '4',\n}\n\nexport default class Logger {\n static log(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.log(`[Reverb API Client] ${message}`, ...args);\n }\n\n static error(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.error(`[Reverb API Client] ${message}`, ...args);\n }\n\n static warn(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.WARN\n ) {\n return;\n }\n console.warn(`[Reverb API Client] ${message}`, ...args);\n }\n\n static info(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.INFO\n ) {\n return;\n }\n console.info(`[Reverb API Client] ${message}`, ...args);\n }\n\n static debug(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.debug(`[Reverb API Client] ${message}`, ...args);\n }\n\n static trace(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.TRACE\n ) {\n return;\n }\n console.trace(`[Reverb API Client] ${message}`, ...args);\n }\n\n static group(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.group(`[Reverb API Client] ${message}`, ...args);\n }\n\n static groupEnd(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.groupEnd();\n }\n\n static time(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.time(`[Reverb API Client] ${label}`);\n }\n\n static timeEnd(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.timeEnd(`[Reverb API Client] ${label}`);\n }\n\n static assert(condition: any, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.assert(condition, `[Reverb API Client] ${message}`, ...args);\n }\n\n static clear(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.clear();\n }\n\n static count(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.count(`[Reverb API Client] ${label}`);\n }\n\n static countReset(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.countReset(`[Reverb API Client] ${label}`);\n }\n\n static dir(level: LogLevel, object: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.dir(object);\n }\n\n static table(level: LogLevel, data: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.table(data);\n }\n\n static groupCollapsed(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.groupCollapsed(`[Reverb API Client] ${message}`, ...args);\n }\n}\n","import { HttpClient } from './HttpClient';\nimport { HttpRequestConfig, HttpResponse } from './types';\nimport Logger from '~/utils/logger';\n\nexport class FetchHttpClient implements HttpClient {\n private async request<T>(\n method: string,\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const { headers, params, timeout } = config ?? {};\n\n let fullUrl = url;\n if (params) {\n const query = Object.entries(params)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n if (query) fullUrl += (url.includes('?') ? '&' : '?') + query;\n }\n\n let controller: AbortController | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (timeout) {\n controller = new AbortController();\n timeoutId = setTimeout(() => controller!.abort(), timeout);\n }\n\n try {\n const resolvedHeaders = headers\n ? (Object.fromEntries(\n Object.entries(headers).filter(([, v]) => v !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n const init: RequestInit = {\n method,\n headers: resolvedHeaders,\n signal: controller?.signal,\n };\n if (data !== undefined) {\n init.body = JSON.stringify(data);\n }\n\n const res = await fetch(fullUrl, init);\n\n if (timeoutId) clearTimeout(timeoutId);\n\n const responseHeaders: Record<string, string> = {};\n res.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const contentType = res.headers.get('content-type') ?? '';\n const responseData: T =\n contentType.includes('json')\n ? await res.json()\n : (await res.text()) as unknown as T;\n\n if (!res.ok) {\n const err = new Error(`HTTP ${res.status}: ${res.statusText}`) as any;\n err.status = res.status;\n err.response = {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n throw err;\n }\n\n return {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n } catch (err) {\n if (timeoutId) clearTimeout(timeoutId);\n throw err;\n }\n }\n\n async get<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('GET request to %s with config: %o', url, config);\n return this.request<T>('GET', url, undefined, config);\n }\n\n async post<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('POST request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('POST', url, data, config);\n }\n\n async put<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PUT request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PUT', url, data, config);\n }\n\n async delete<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('DELETE request to %s with config: %o', url, config);\n return this.request<T>('DELETE', url, undefined, config);\n }\n\n async patch<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PATCH request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PATCH', url, data, config);\n }\n}\n","import Logger from './logger';\n\n/**\n * Builds a complete URL from a base URL and path, handling both absolute and relative URLs.\n *\n * @param baseUrl - The base URL (e.g., \"https://api.reverb.com/api\")\n * @param path - The path to append (e.g., \"/my/listings\" or \"my/listings\")\n * @returns The complete URL\n *\n * @example\n * ```ts\n * buildUrl(\"https://api.reverb.com/api\", \"/my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"https://example.com/absolute\")\n * // Returns: \"https://example.com/absolute\"\n * ```\n */\nexport function buildUrl(baseUrl: string, path: string): string {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n Logger.debug('Provided path is an absolute URL: %s', path);\n return path;\n }\n\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n const fullUrl = `${normalizedBase}${normalizedPath}`;\n Logger.debug(\n 'Built URL: %s from base: %s and path: %s',\n fullUrl,\n baseUrl,\n path,\n );\n return fullUrl;\n}\n","import Logger from './logger';\n\n/**\n * Builds a URL-encoded query string from an object of parameters.\n * Filters out undefined and null values.\n *\n * @param params - An object containing query parameters\n * @returns A query string (without leading \"?\") or empty string if no valid params\n *\n * @example\n * ```ts\n * buildQueryString({ page: 1, per_page: 50 })\n * // Returns: \"page=1&per_page=50\"\n *\n * buildQueryString({ query: \"guitar\", state: undefined })\n * // Returns: \"query=guitar\"\n *\n * buildQueryString({ search: \"hello world\" })\n * // Returns: \"search=hello%20world\"\n *\n * buildQueryString({})\n * // Returns: \"\"\n * ```\n */\nexport function buildQueryString(\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const entries = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;\n });\n\n Logger.debug(\n 'Built query string: %s from params: %o',\n entries.join('&'),\n params,\n );\n return entries.join('&');\n}\n\n/**\n * Builds a complete URL with query parameters.\n *\n * @param baseUrl - The base URL\n * @param params - An object containing query parameters\n * @returns The complete URL with query string\n *\n * @example\n * ```ts\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", { page: 1 })\n * // Returns: \"https://api.reverb.com/api/my/listings?page=1\"\n *\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", {})\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n * ```\n */\nexport function buildUrlWithQuery(\n baseUrl: string,\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const queryString = buildQueryString(params);\n if (!queryString) {\n return baseUrl;\n }\n return `${baseUrl}?${queryString}`;\n}\n","import Logger from './logger';\n\nexport interface PaginationOptions {\n perPage?: number;\n startPage?: number;\n maxPages?: number;\n throttle?: { delayMs: number; everyNPages: number };\n}\n\nexport interface PaginatedFetchResult<T> {\n items: T[];\n hasMore: boolean;\n currentPage: number;\n}\n\nexport async function paginateAll<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): Promise<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n throttle,\n } = options;\n\n const allItems: T[] = [];\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n allItems.push(...result.items);\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n\n if (throttle && pagesProcessed % throttle.everyNPages === 0) {\n Logger.debug('Throttling: waiting %dms after %d pages.', throttle.delayMs, pagesProcessed);\n await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));\n }\n }\n\n Logger.debug(\n 'Pagination complete. Total items fetched: %d across %d pages.',\n allItems.length,\n pagesProcessed,\n );\n return allItems;\n}\n\nexport async function* paginateStream<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): AsyncGenerator<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n throttle,\n } = options;\n\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n if (result.items.length > 0) {\n yield result.items;\n }\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n\n if (throttle && pagesProcessed % throttle.everyNPages === 0) {\n Logger.debug('Throttling: waiting %dms after %d pages.', throttle.delayMs, pagesProcessed);\n await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));\n }\n }\n\n Logger.debug('Stream pagination complete after %d pages.', pagesProcessed + 1);\n}\n\nexport function createPaginatedResult<T>(\n items: T[],\n perPage: number,\n currentPage: number,\n): PaginatedFetchResult<T> {\n return {\n items,\n hasMore: items.length === perPage,\n currentPage,\n };\n}\n","import { Listing, ListingStates, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n buildUrl,\n buildUrlWithQuery,\n paginateAll,\n paginateStream,\n createPaginatedResult,\n} from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyListingsOptions {\n page?: number;\n perPage?: number;\n query?: string;\n state?: string;\n}\n\nexport const getMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyListingsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: Listing[] }>>> => {\n const { page, perPage, query, state } = options;\n\n const url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings'), {\n page,\n per_page: perPage,\n query,\n state,\n });\n Logger.debug('Fetching my listings with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ listings: Listing[] }>>(url, {\n headers: config.headers,\n });\n};\n\nexport interface GetAllMyListingsOptions {\n query?: string;\n state?: ListingStates;\n}\n\nexport const getAllMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): Promise<HttpResponse<Listing[]>> => {\n const { query, state } = options;\n\n const allListings = await paginateAll<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50, throttle: { delayMs: 5000, everyNPages: 5 } },\n );\n\n return {\n data: allListings,\n status: 200,\n statusText: 'OK',\n headers: {},\n config: {},\n };\n};\n\nexport async function* streamAllMyListings(\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): AsyncGenerator<Listing> {\n const { query, state } = options;\n\n const pages = paginateStream<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50, throttle: { delayMs: 5000, everyNPages: 5 } },\n );\n\n for await (const page of pages) {\n for (const listing of page) {\n yield listing;\n }\n }\n}\n\nexport interface GetOneListingOptions {\n id: string;\n}\n\nexport const getOneListing = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingOptions,\n): Promise<HttpResponse<Listing>> => {\n const { id } = options;\n const url = buildUrl(config.rootEndpoint, `/listings/${id}`);\n Logger.debug('Fetching listing with ID: %s using URL: %s', id, url);\n return client.get<Listing>(url, { headers: config.headers });\n};\n\nexport interface GetOneListingPhotosOptions {\n id: string;\n}\n\nexport const getOneListingPhotos = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingPhotosOptions,\n): Promise<HttpResponse<{ photos: string[] }>> => {\n const { id } = options;\n\n const oneListingResponse = await getOneListing(client, config, { id });\n\n const photos =\n oneListingResponse.data?.photos?.map((photo) => photo._links.full.href) ||\n [];\n Logger.debug('Fetched %d photos for listing with ID: %s', photos.length, id);\n\n return {\n data: { photos },\n status: oneListingResponse.status,\n statusText: oneListingResponse.statusText,\n headers: oneListingResponse.headers,\n config: oneListingResponse.config,\n };\n};\n","import type { Listing, ListingPostBody } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport const postListing = async (\n client: HttpClient,\n config: ReverbConfig,\n body: ListingPostBody,\n): Promise<HttpResponse<Listing>> => {\n const url = buildUrl(config.rootEndpoint, '/listings');\n Logger.debug('Posting new listing with URL: %s and body: %o', url, body);\n return client.post<Listing>(url, JSON.stringify(body), {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getMyListings,\n getAllMyListings,\n streamAllMyListings,\n getOneListing,\n GetMyListingsOptions,\n GetAllMyListingsOptions,\n GetOneListingOptions,\n} from '~/methods/listings/getListings';\nimport { postListing } from '~/methods/listings/postListing';\nimport { ListingPostBody } from '~/types';\n\nexport class ListingsResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyListingsOptions = {}) {\n return getMyListings(this.getClient(), this.getConfig(), options);\n }\n\n getOne(options: GetOneListingOptions) {\n return getOneListing(this.getClient(), this.getConfig(), options);\n }\n\n async getPhotos(options: GetOneListingOptions) {\n const response = await getOneListing(\n this.getClient(),\n this.getConfig(),\n options,\n );\n const photos =\n response.data?.photos?.map((photo) => photo._links.full.href) || [];\n return photos;\n }\n\n getAllMy(options: GetAllMyListingsOptions = {}) {\n return getAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n streamAllMy(options: GetAllMyListingsOptions = {}) {\n return streamAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n create(body: ListingPostBody) {\n return postListing(this.getClient(), this.getConfig(), body);\n }\n}\n","import { Order, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl, buildUrlWithQuery } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyOrdersOptions {\n page?: number;\n}\n\nexport const getMyOrders = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyOrdersOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ orders: Order[] }>>> => {\n const { page } = options;\n\n const url = buildUrlWithQuery(\n buildUrl(config.rootEndpoint, '/my/orders/selling/all'),\n { page },\n );\n\n Logger.debug('Fetching my orders with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ orders: Order[] }>>(url, {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { getMyOrders, GetMyOrdersOptions } from '~/methods/orders/getOrders';\n\nexport class OrdersResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyOrdersOptions = {}) {\n return getMyOrders(this.getClient(), this.getConfig(), options);\n }\n}\n","\n\n/*\n\nFind your Active Offers\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\" \nhttps://api.reverb.com/api/my/listings/negotiations\n\n */\n\n/*\n\nGet the details of an individual Offer\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\"\nhttps://api.reverb.com/api/my/negotiations/[offer_id]\n\n */\n\nimport { HttpClient, HttpResponse } from '../../http';\nimport { ReverbConfig } from '../../config/ReverbConfig';\nimport { Negotiation, ListingWithNegotiations, PaginatedReverbResponse } from '../../types';\nimport { buildUrlWithQuery, buildUrl } from '../../utils';\n\nexport interface GetNegotiationsOptions {\n\tpage?: number;\n\tperPage?: number;\n\tstatus?: 'active' | 'active_for_seller' | 'all';\n\tnegotiation_type?: 'standard' | 'auto_push_offer';\n}\n\nexport const getNegotiations = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\toptions: GetNegotiationsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>> => {\n\tconst { page, perPage, status, negotiation_type } = options;\n\n\tconst url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings/negotiations'), {\n\t\tpage,\n\t\tper_page: perPage,\n\t\tstatus,\n\t\tnegotiation_type,\n\t});\n\n\treturn client.get<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>(url, {\n\t\theaders: config.headers,\n\t});\n};\n\nexport const getNegotiation = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\tofferId: number,\n): Promise<HttpResponse<Negotiation>> => {\n\tconst url = buildUrl(config.rootEndpoint, `/my/negotiations/${offerId}`);\n\n\treturn client.get<Negotiation>(url, {\n\t\theaders: config.headers,\n\t});\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getNegotiation,\n getNegotiations,\n\tGetNegotiationsOptions\n} from '../methods/negotiations/getNegotiations';\n\nexport class NegotiationsResource {\n\tconstructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n\tgetNegotiations(options: GetNegotiationsOptions) {\n\t\treturn getNegotiations(this.getClient(), this.getConfig(), options);\n\t}\n\n\tgetNegotiation(offerId: number) {\n\t\treturn getNegotiation(this.getClient(), this.getConfig(), offerId);\n\t}\n}\n","export * from './listings/getListings';\nexport * from './listings/postListing';\nexport * from './orders/getOrders';\nexport type { PaginatedReverbResponse } from '~/types';\n\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport type GetArbitraryEndpointOptions = {\n url: string;\n params?: { [key: string]: string };\n};\n\nexport const getArbitraryEndpoint = async <T = any>(\n client: HttpClient,\n config: ReverbConfig,\n options: GetArbitraryEndpointOptions,\n): Promise<HttpResponse<T>> => {\n const { url, params } = options;\n const requestUrl = url.startsWith('http')\n ? url\n : buildUrl(config.rootEndpoint, url);\n\n Logger.debug(\n 'Fetching arbitrary endpoint with URL: %s and params: %o',\n requestUrl,\n params,\n );\n\n return client.get<T>(requestUrl, { headers: config.headers, params });\n};\n","import { ReverbConfig, createReverbConfig } from \"./config/ReverbConfig\";\nimport { FetchHttpClient, HttpClient } from \"./http\";\nimport { ListingsResource } from \"./resources/ListingsResource\";\nimport { OrdersResource } from \"./resources/OrdersResource\";\nimport { NegotiationsResource } from \"./resources/NegotiationsResource\";\nimport { getArbitraryEndpoint, GetArbitraryEndpointOptions } from \"./methods\";\nimport Logger from \"./utils/logger\";\n\nexport type ApiVersion = string;\nexport type ApiKey = string;\nexport type Locale = string;\nexport type ShippingRegion = string;\nexport type DisplayCurrency = string;\nexport type RootEndpoint = Domain;\n\ntype Domain = `${string}.${string}` | `${string}.${string}.${string}`;\n\nexport interface ReverbOptions {\n apiKey: ApiKey;\n version?: ApiVersion | undefined;\n rootEndpoint?: RootEndpoint | undefined;\n displayCurrency?: DisplayCurrency | undefined;\n shippingRegion?: ShippingRegion | undefined;\n locale?: Locale | undefined;\n}\n\nexport type ReverbHeaders = {\n \"Content-Type\": string;\n \"Accept-Version\": ApiVersion;\n Accept: string;\n \"Accept-Language\": Locale;\n \"X-Display-Currency\": DisplayCurrency;\n \"X-Shipping-Region\"?: ShippingRegion | undefined;\n \"User-Agent\"?: string;\n [key: string]: string | undefined;\n};\n\nexport interface AuthReverbHeaders extends ReverbHeaders {\n Authorization: `Bearer ${ApiKey}`;\n}\n\nexport default class Reverb {\n static defaultHeaders: ReverbHeaders = {\n \"Content-Type\": \"application/hal+json\",\n \"Accept-Version\": \"3.0\",\n Accept: \"application/hal+json\",\n \"Accept-Language\": \"en\",\n \"X-Display-Currency\": \"USD\",\n \"User-Agent\": \"Reverb Node SDK\",\n };\n\n private _rootEndpoint: RootEndpoint = \"https://api.reverb.com/api\";\n private _version: ApiVersion = Reverb.defaultHeaders[\"Accept-Version\"];\n private apiKey: string;\n private _headers: AuthReverbHeaders;\n private _displayCurrency: DisplayCurrency = Reverb.defaultHeaders[\"X-Display-Currency\"];\n private _shippingRegion: ShippingRegion | undefined;\n private _locale: Locale = Reverb.defaultHeaders[\"Accept-Language\"];\n private _config!: ReverbConfig;\n private _httpClient: HttpClient;\n\n readonly listings: ListingsResource;\n readonly orders: OrdersResource;\n readonly negotiations: NegotiationsResource;\n constructor(options: ReverbOptions) {\n const {\n apiKey,\n version,\n rootEndpoint: defaultEndpoint,\n displayCurrency,\n shippingRegion,\n locale,\n } = options;\n\n if (!apiKey || apiKey === \"\") {\n throw new Error(\"Reverb: apiKey is required\");\n }\n\n if (version) this._version = version;\n if (defaultEndpoint) this._rootEndpoint = defaultEndpoint;\n if (displayCurrency) this._displayCurrency = displayCurrency;\n if (shippingRegion) this._shippingRegion = shippingRegion;\n if (locale) this._locale = locale;\n\n this.apiKey = apiKey;\n this._headers = {\n ...Reverb.defaultHeaders,\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n this._httpClient = new FetchHttpClient();\n this.updateHeaders();\n this._updateConfig();\n\n this.listings = new ListingsResource(\n () => this._httpClient,\n () => this._config,\n );\n this.orders = new OrdersResource(\n () => this._httpClient,\n () => this._config,\n );\n this.negotiations = new NegotiationsResource(\n () => this._httpClient,\n () => this._config,\n );\n\n Logger.trace(\"Reverb client initialized with config: %o\", this._config);\n }\n\n private updateHeaders() {\n const optionalHeaders = {} as any;\n if (this._shippingRegion) optionalHeaders[\"X-Shipping-Region\"] = this._shippingRegion;\n\n Logger.debug(\n \"Updating headers with API key and config values. Shipping region included: %s\",\n !!this._shippingRegion,\n );\n\n this._headers = {\n ...this._headers,\n Authorization: `Bearer ${this.apiKey}`,\n \"Accept-Version\": this._version,\n \"X-Display-Currency\": this._displayCurrency,\n \"Accept-Language\": this._locale,\n ...optionalHeaders,\n };\n }\n\n private _updateConfig() {\n Logger.debug(\n \"Updating Reverb config with current settings. Root endpoint: %s, Version: %s, Display currency: %s, Locale: %s, Shipping region: %s\",\n this._rootEndpoint,\n this._version,\n this._displayCurrency,\n this._locale,\n this._shippingRegion,\n );\n\n this._config = createReverbConfig({\n rootEndpoint: this._rootEndpoint,\n apiKey: this.apiKey,\n headers: this._headers,\n version: this._version,\n locale: this._locale,\n displayCurrency: this._displayCurrency,\n shippingRegion: this._shippingRegion,\n });\n }\n\n set locale(locale: Locale) {\n Logger.debug(\"Setting locale to: %s\", locale);\n\n this._locale = locale;\n this.updateHeaders();\n this._updateConfig();\n }\n get locale() {\n return this._locale;\n }\n\n set shippingRegion(shippingRegion: ShippingRegion | undefined) {\n Logger.debug(\"Setting shipping region to: %s\", shippingRegion);\n\n this._shippingRegion = shippingRegion;\n this.updateHeaders();\n this._updateConfig();\n }\n get shippingRegion(): ShippingRegion | undefined {\n return this._shippingRegion;\n }\n\n get headers(): AuthReverbHeaders {\n return this._headers;\n }\n\n set displayCurrency(displayCurrency: DisplayCurrency) {\n Logger.debug(\"Setting display currency to: %s\", displayCurrency);\n\n this._displayCurrency = displayCurrency;\n this.updateHeaders();\n this._updateConfig();\n }\n get displayCurrency(): DisplayCurrency {\n return this._displayCurrency;\n }\n\n set version(version: ApiVersion) {\n Logger.debug(\"Setting API version to: %s\", version);\n\n this._version = version;\n this.updateHeaders();\n this._updateConfig();\n }\n get version(): ApiVersion {\n return this._version;\n }\n\n set rootEndpoint(rootEndpoint: RootEndpoint) {\n Logger.debug(\"Setting root endpoint to: %s\", rootEndpoint);\n\n this._rootEndpoint = rootEndpoint;\n this._updateConfig();\n }\n get rootEndpoint(): RootEndpoint {\n return this._rootEndpoint;\n }\n\n get config(): ReverbConfig {\n return this._config;\n }\n\n async _getArbitraryEndpoint<T = any>(\n url: string,\n params?: GetArbitraryEndpointOptions[\"params\"],\n ) {\n return getArbitraryEndpoint<T>(this._httpClient, this._config, {\n url,\n params,\n });\n }\n}\n","export * from './Reverb';\nexport * from './resources/ListingsResource';\nexport * from './resources/OrdersResource';\n\nimport Reverb from './Reverb';\n\nexport default Reverb;\n"],"mappings":"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","names":["LogLevel"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sound-tank",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "A library for interacting with the Reverb Marketplace API",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",