@bycrawl/nodejs-sdk 0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/exceptions.ts","../src/http.ts","../src/resource.ts","../src/platforms/dcard.ts","../src/platforms/facebook.ts","../src/platforms/gmaps.ts","../src/platforms/instagram.ts","../src/platforms/job104.ts","../src/platforms/linkedin.ts","../src/platforms/reddit.ts","../src/platforms/threads.ts","../src/platforms/tiktok.ts","../src/platforms/webfetch.ts","../src/platforms/x.ts","../src/platforms/youtube.ts","../src/client.ts"],"sourcesContent":["/**\n * ByCrawl Exception Hierarchy\n *\n * All SDK exceptions inherit from ByCrawlError.\n * HTTP errors are mapped to specific subclasses by status code.\n */\n\nexport class ByCrawlError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ByCrawlError\";\n }\n}\n\nexport class APIError extends ByCrawlError {\n readonly statusCode: number;\n readonly body: Record<string, unknown> | null;\n\n constructor(\n message: string,\n options: { statusCode: number; body?: Record<string, unknown> | null },\n ) {\n super(message);\n this.name = \"APIError\";\n this.statusCode = options.statusCode;\n this.body = options.body ?? null;\n }\n}\n\nexport class AuthenticationError extends APIError {\n constructor(\n message = \"Invalid or missing API key\",\n body?: Record<string, unknown> | null,\n ) {\n super(message, { statusCode: 401, body });\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class PermissionError extends APIError {\n constructor(\n message = \"Insufficient scope\",\n body?: Record<string, unknown> | null,\n ) {\n super(message, { statusCode: 403, body });\n this.name = \"PermissionError\";\n }\n}\n\nexport class NotFoundError extends APIError {\n constructor(\n message = \"Resource not found\",\n body?: Record<string, unknown> | null,\n ) {\n super(message, { statusCode: 404, body });\n this.name = \"NotFoundError\";\n }\n}\n\nexport class RateLimitError extends APIError {\n readonly retryAfter: number | null;\n\n constructor(\n message = \"Rate limit exceeded\",\n options?: { retryAfter?: number | null; body?: Record<string, unknown> | null },\n ) {\n super(message, { statusCode: 429, body: options?.body });\n this.name = \"RateLimitError\";\n this.retryAfter = options?.retryAfter ?? null;\n }\n}\n\nexport class ServerError extends APIError {\n constructor(\n message: string,\n options: { statusCode: number; body?: Record<string, unknown> | null },\n ) {\n super(message, options);\n this.name = \"ServerError\";\n }\n}\n\nexport class TimeoutError extends ByCrawlError {\n constructor(message = \"Request timed out\") {\n super(message);\n this.name = \"TimeoutError\";\n }\n}\n\nexport class ConnectionError extends ByCrawlError {\n constructor(message = \"Network connection error\") {\n super(message);\n this.name = \"ConnectionError\";\n }\n}\n","/**\n * HTTP Transport Layer\n *\n * Wraps native fetch with:\n * - API key authentication (x-api-key header)\n * - Automatic retry with exponential backoff + jitter\n * - Consistent error mapping to ByCrawl exceptions\n * - ResponseWrapper with headers for rate limit / credit parsing\n */\n\nimport {\n APIError,\n AuthenticationError,\n ByCrawlError,\n ConnectionError,\n NotFoundError,\n PermissionError,\n RateLimitError,\n ServerError,\n TimeoutError,\n} from \"./exceptions.js\";\n\nexport const DEFAULT_BASE_URL = \"https://api.bycrawl.com\";\nexport const DEFAULT_TIMEOUT = 60_000;\nexport const DEFAULT_MAX_RETRIES = 2;\nexport const SDK_VERSION = \"0.1.1\";\n\nconst RETRYABLE_STATUS_CODES = new Set([429, 500, 502, 503, 504]);\n\nfunction userAgent(): string {\n return `bycrawl-node/${SDK_VERSION}`;\n}\n\nfunction makeHeaders(apiKey: string): Record<string, string> {\n return {\n \"x-api-key\": apiKey,\n \"User-Agent\": userAgent(),\n Accept: \"application/json\",\n };\n}\n\nfunction backoffDelay(attempt: number, base = 0.5, maxDelay = 8.0): number {\n const delay = Math.min(base * 2 ** attempt, maxDelay);\n return Math.random() * delay;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface ResponseWrapper {\n statusCode: number;\n data: Record<string, unknown>;\n headers: Record<string, string>;\n}\n\nfunction raiseForStatus(\n status: number,\n body: Record<string, unknown> | null,\n headers: Headers,\n): void {\n if (status >= 200 && status < 300) return;\n\n const message =\n (body?.error as string) ?? `HTTP ${status}`;\n\n if (status === 401) {\n throw new AuthenticationError(message, body);\n }\n if (status === 403) {\n throw new PermissionError(message, body);\n }\n if (status === 404) {\n throw new NotFoundError(message, body);\n }\n if (status === 429) {\n const retryAfter = headers.get(\"retry-after\");\n throw new RateLimitError(message, {\n retryAfter: retryAfter ? parseFloat(retryAfter) : null,\n body,\n });\n }\n if (status >= 500) {\n throw new ServerError(message, { statusCode: status, body });\n }\n\n throw new APIError(message, { statusCode: status, body });\n}\n\nfunction headersToRecord(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nexport interface TransportOptions {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n maxRetries?: number;\n}\n\nexport class Transport {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly defaultHeaders: Record<string, string>;\n\n constructor(options: TransportOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.defaultHeaders = makeHeaders(this.apiKey);\n }\n\n async request(\n method: string,\n path: string,\n options?: {\n params?: Record<string, unknown>;\n json?: Record<string, unknown>;\n headers?: Record<string, string>;\n },\n ): Promise<ResponseWrapper> {\n const url = new URL(path, this.baseUrl);\n\n if (options?.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value != null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const requestHeaders: Record<string, string> = {\n ...this.defaultHeaders,\n ...options?.headers,\n };\n\n if (options?.json) {\n requestHeaders[\"Content-Type\"] = \"application/json\";\n }\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.timeout,\n );\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method,\n headers: requestHeaders,\n body: options?.json ? JSON.stringify(options.json) : undefined,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (\n RETRYABLE_STATUS_CODES.has(response.status) &&\n attempt < this.maxRetries\n ) {\n let delay = backoffDelay(attempt);\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"retry-after\");\n if (retryAfter) {\n delay = Math.max(delay, parseFloat(retryAfter) * 1000);\n }\n }\n await sleep(delay);\n continue;\n }\n\n let body: Record<string, unknown> | null = null;\n try {\n body = (await response.json()) as Record<string, unknown>;\n } catch {\n if (!response.ok) {\n throw new APIError(\"Invalid JSON response\", { statusCode: 502 });\n }\n }\n\n raiseForStatus(response.status, body, response.headers);\n\n return {\n statusCode: response.status,\n data: body ?? {},\n headers: headersToRecord(response.headers),\n };\n } catch (error) {\n if (\n error instanceof AuthenticationError ||\n error instanceof PermissionError ||\n error instanceof NotFoundError ||\n error instanceof RateLimitError ||\n error instanceof ServerError ||\n error instanceof APIError\n ) {\n throw error;\n }\n\n if (error instanceof DOMException && error.name === \"AbortError\") {\n lastError = error;\n if (attempt < this.maxRetries) {\n const delay = backoffDelay(attempt);\n await sleep(delay);\n continue;\n }\n throw new TimeoutError(String(error));\n }\n\n if (error instanceof TypeError && error.message.includes(\"fetch\")) {\n lastError = error;\n if (attempt < this.maxRetries) {\n const delay = backoffDelay(attempt);\n await sleep(delay);\n continue;\n }\n throw new ConnectionError(String(error));\n }\n\n if (error instanceof ByCrawlError) {\n throw error;\n }\n\n throw new ByCrawlError(`Unexpected error: ${error}`);\n }\n }\n\n if (lastError) {\n throw new ConnectionError(String(lastError));\n }\n throw new ConnectionError(\"Request failed after retries\");\n }\n}\n","/**\n * APIResource Base Class\n *\n * All platform namespaces inherit from APIResource.\n * Handles HTTP call delegation, response wrapping, header parsing, and pagination.\n */\n\nimport { ByCrawlError } from \"./exceptions.js\";\nimport type { ResponseWrapper, Transport } from \"./http.js\";\nimport type { APIResponse, CreditInfo, RateLimit } from \"./types.js\";\n\nfunction parseRateLimit(headers: Record<string, string>): RateLimit | null {\n const limit = headers[\"x-ratelimit-limit\"];\n const remaining = headers[\"x-ratelimit-remaining\"];\n const reset = headers[\"x-ratelimit-reset\"];\n if (limit == null && remaining == null && reset == null) return null;\n return {\n limit: limit ? parseInt(limit, 10) : null,\n remaining: remaining ? parseInt(remaining, 10) : null,\n reset: reset ? parseFloat(reset) : null,\n };\n}\n\nfunction parseCredit(headers: Record<string, string>): CreditInfo | null {\n const remaining = headers[\"x-credit-remaining\"];\n const used = headers[\"x-credit-used\"];\n if (remaining == null && used == null) return null;\n return {\n remaining: remaining ? parseInt(remaining, 10) : null,\n used: used ? parseInt(used, 10) : null,\n };\n}\n\nfunction wrapResponse<T>(\n wrapper: ResponseWrapper,\n castTo?: (raw: Record<string, unknown>) => T,\n): APIResponse<T> {\n const data = wrapper.data;\n let bodyData: unknown;\n let success: boolean;\n let error: string | null;\n let queued: boolean;\n\n if (typeof data === \"object\" && data !== null && \"data\" in data) {\n bodyData = data.data;\n success = (data.success as boolean) ?? true;\n error = (data.error as string) ?? null;\n queued = (data.queued as boolean) ?? false;\n } else if (typeof data === \"object\" && data !== null && \"error\" in data) {\n bodyData = null;\n success = false;\n error = (data.error as string) ?? null;\n queued = false;\n } else {\n bodyData = data;\n success = true;\n error = null;\n queued = false;\n }\n\n let parsed: T | null = bodyData as T | null;\n if (castTo && bodyData != null) {\n if (Array.isArray(bodyData)) {\n parsed = bodyData.map((item) =>\n castTo(item as Record<string, unknown>),\n ) as T;\n } else if (typeof bodyData === \"object\") {\n parsed = castTo(bodyData as Record<string, unknown>);\n }\n }\n\n return {\n success,\n data: parsed,\n error,\n queued,\n rateLimit: parseRateLimit(wrapper.headers),\n credit: parseCredit(wrapper.headers),\n };\n}\n\nexport class APIResource {\n protected readonly _transport: Transport;\n\n constructor(transport: Transport) {\n this._transport = transport;\n }\n\n protected async _get<T>(\n path: string,\n options?: {\n params?: Record<string, unknown>;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T>> {\n return this._request(\"GET\", path, { params: options?.params, castTo: options?.castTo });\n }\n\n protected async _post<T>(\n path: string,\n options?: {\n body?: Record<string, unknown>;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T>> {\n return this._request(\"POST\", path, { body: options?.body, castTo: options?.castTo });\n }\n\n protected async _getList<T>(\n path: string,\n options: {\n params?: Record<string, unknown>;\n itemsKey: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T[]>> {\n const resp = await this._get<Record<string, unknown>>(path, {\n params: options.params,\n });\n const raw = resp.data;\n let items: T[];\n\n if (raw && typeof raw === \"object\" && !Array.isArray(raw) && options.itemsKey in raw) {\n const arr = (raw as Record<string, unknown>)[options.itemsKey];\n if (Array.isArray(arr)) {\n items = options.castTo\n ? arr.map((item) => options.castTo!(item as Record<string, unknown>))\n : (arr as T[]);\n } else {\n items = [];\n }\n } else if (Array.isArray(raw)) {\n items = options.castTo\n ? raw.map((item) => options.castTo!(item as Record<string, unknown>))\n : (raw as T[]);\n } else {\n items = [];\n }\n\n return {\n ...resp,\n data: items,\n } as APIResponse<T[]>;\n }\n\n protected async _request<T>(\n method: string,\n path: string,\n options?: {\n params?: Record<string, unknown>;\n body?: Record<string, unknown>;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T>> {\n const wrapper = await this._transport.request(method, path, {\n params: options?.params,\n json: options?.body,\n });\n return wrapResponse<T>(wrapper, options?.castTo);\n }\n\n protected async *_paginate<T>(\n path: string,\n options: {\n params: Record<string, unknown>;\n itemsKey?: string;\n cursorKey?: string;\n hasMoreKey?: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): AsyncGenerator<T> {\n const itemsKey = options.itemsKey ?? \"items\";\n const cursorKey = options.cursorKey ?? \"cursor\";\n const hasMoreKey = options.hasMoreKey ?? \"hasMore\";\n let params = { ...options.params };\n\n while (true) {\n const wrapper = await this._transport.request(\"GET\", path, { params });\n const responseData = wrapper.data;\n const data =\n typeof responseData === \"object\" &&\n responseData !== null &&\n \"data\" in responseData\n ? (responseData.data as Record<string, unknown>)\n : (responseData as Record<string, unknown>);\n\n const items = (data[itemsKey] as unknown[]) ?? [];\n for (const item of items) {\n if (options.castTo) {\n yield options.castTo(item as Record<string, unknown>);\n } else {\n yield item as T;\n }\n }\n\n if (!data[hasMoreKey]) break;\n const nextCursor =\n (data[cursorKey] as string) ?? (data[\"next_cursor\"] as string);\n if (!nextCursor) break;\n params = { ...params, [cursorKey]: nextCursor };\n }\n }\n\n protected async *_paginateByPage<T>(\n path: string,\n options: {\n params: Record<string, unknown>;\n itemsKey?: string;\n pageKey?: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): AsyncGenerator<T> {\n const itemsKey = options.itemsKey ?? \"items\";\n const pageKey = options.pageKey ?? \"page\";\n let page = (options.params[pageKey] as number) ?? 1;\n\n while (true) {\n const params = { ...options.params, [pageKey]: page };\n const wrapper = await this._transport.request(\"GET\", path, { params });\n const responseData = wrapper.data;\n const data =\n typeof responseData === \"object\" &&\n responseData !== null &&\n \"data\" in responseData\n ? (responseData.data as Record<string, unknown>)\n : (responseData as Record<string, unknown>);\n\n const items = (data[itemsKey] as unknown[]) ?? [];\n if (items.length === 0) break;\n\n for (const item of items) {\n if (options.castTo) {\n yield options.castTo(item as Record<string, unknown>);\n } else {\n yield item as T;\n }\n }\n\n const hasMore = data[\"hasMore\"] as boolean | undefined;\n if (hasMore === false) break;\n const limit = (params[\"limit\"] as number) ?? 20;\n if (items.length < limit) break;\n page += 1;\n }\n }\n\n protected async *_paginateByOffset<T>(\n path: string,\n options: {\n params: Record<string, unknown>;\n itemsKey?: string;\n countKey?: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): AsyncGenerator<T> {\n const itemsKey = options.itemsKey ?? \"items\";\n const countKey = options.countKey ?? \"count\";\n let offset = (options.params[\"offset\"] as number) ?? 0;\n const limit = (options.params[\"limit\"] as number) ?? 20;\n\n while (true) {\n const params = { ...options.params, offset, limit };\n const wrapper = await this._transport.request(\"GET\", path, { params });\n const responseData = wrapper.data;\n const data =\n typeof responseData === \"object\" &&\n responseData !== null &&\n \"data\" in responseData\n ? (responseData.data as Record<string, unknown>)\n : (responseData as Record<string, unknown>);\n\n const items = (data[itemsKey] as unknown[]) ?? [];\n if (items.length === 0) break;\n\n for (const item of items) {\n if (options.castTo) {\n yield options.castTo(item as Record<string, unknown>);\n } else {\n yield item as T;\n }\n }\n\n const total = data[countKey] as number | undefined;\n offset += items.length;\n if (total != null && offset >= total) break;\n if (items.length < limit) break;\n }\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, DcardForum, DcardPersona, DcardPost } from \"../types.js\";\n\nexport class Dcard extends APIResource {\n async getForum(alias: string): Promise<APIResponse<DcardForum>> {\n return this._get(`/dcard/forums/${alias}`, {\n castTo: (r) => r as DcardForum,\n });\n }\n\n async getForumPosts(\n alias: string,\n options?: { count?: number; popular?: boolean },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/dcard/forums/${alias}/posts`, {\n params: { count: options?.count, popular: options?.popular },\n });\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number; offset?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/dcard/posts/search`, {\n params: { q, count: options?.count, offset: options?.offset },\n });\n }\n\n async getPersona(username: string): Promise<APIResponse<DcardPersona>> {\n return this._get(`/dcard/personas/${username}`, {\n castTo: (r) => r as DcardPersona,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterSearchPosts(\n q: string,\n options?: { count?: number },\n ): AsyncGenerator<DcardPost> {\n return this._paginateByOffset(`/dcard/posts/search`, {\n params: { q, count: options?.count ?? 30 },\n itemsKey: \"posts\",\n castTo: (r) => r as DcardPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, FacebookPost, FacebookUser } from \"../types.js\";\n\nexport class Facebook extends APIResource {\n async getUser(username: string): Promise<APIResponse<FacebookUser>> {\n return this._get(`/facebook/users/${username}`, {\n castTo: (r) => r as FacebookUser,\n });\n }\n\n async getUserPosts(\n username: string,\n ): Promise<APIResponse<FacebookPost[]>> {\n return this._request<FacebookPost[]>(\"GET\", `/facebook/users/${username}/posts`);\n }\n\n async getPost(options: { url: string }): Promise<APIResponse<FacebookPost>> {\n return this._get(`/facebook/posts`, {\n params: { url: options.url },\n castTo: (r) => r as FacebookPost,\n });\n }\n\n async getPostComments(options: {\n url: string;\n cursor?: string;\n }): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/posts/comments`, {\n params: { url: options.url, cursor: options.cursor },\n });\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number; cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/posts/search`, {\n params: { q, count: options?.count, cursor: options?.cursor },\n });\n }\n\n async marketplaceBrowse(\n location: string,\n options?: { category?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/marketplace/listings`, {\n params: { location, category: options?.category },\n });\n }\n\n async marketplaceSearch(\n q: string,\n options?: { location?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/marketplace/search`, {\n params: { q, location: options?.location },\n });\n }\n\n async marketplaceItem(\n listingId: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/marketplace/items/${listingId}`);\n }\n\n // -- Auto-pagination iterators --\n\n iterPostComments(options: {\n url: string;\n }): AsyncGenerator<Record<string, unknown>> {\n return this._paginate(`/facebook/posts/comments`, {\n params: { url: options.url },\n itemsKey: \"comments\",\n });\n }\n\n iterSearchPosts(\n q: string,\n options?: { count?: number },\n ): AsyncGenerator<FacebookPost> {\n return this._paginate(`/facebook/posts/search`, {\n params: { q, count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as FacebookPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, GMapsPlace } from \"../types.js\";\n\nexport class GMaps extends APIResource {\n async search(\n q: string,\n options?: { language?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/gmaps/places/search`, {\n params: { q, language: options?.language },\n });\n }\n\n async getPlace(\n query: string,\n options?: { language?: string },\n ): Promise<APIResponse<GMapsPlace>> {\n return this._get(`/gmaps/places`, {\n params: { query, language: options?.language },\n castTo: (r) => r as GMapsPlace,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, InstagramUser } from \"../types.js\";\n\nexport class Instagram extends APIResource {\n async getUser(username: string): Promise<APIResponse<InstagramUser>> {\n return this._get(`/instagram/users/${username}`, {\n castTo: (r) => r as InstagramUser,\n });\n }\n\n async searchTags(\n q: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/tags/search`, { params: { q } });\n }\n\n async getPost(\n shortcode: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/posts/${shortcode}`);\n }\n\n async getPostComments(\n shortcode: string,\n options?: { cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/posts/${shortcode}/comments`, {\n params: { cursor: options?.cursor },\n });\n }\n\n async getUserPosts(\n username: string,\n options?: { cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/users/${username}/posts`, {\n params: { cursor: options?.cursor },\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterUserPosts(\n username: string,\n ): AsyncGenerator<Record<string, unknown>> {\n return this._paginate(`/instagram/users/${username}/posts`, {\n params: {},\n itemsKey: \"posts\",\n });\n }\n\n iterPostComments(\n shortcode: string,\n ): AsyncGenerator<Record<string, unknown>> {\n return this._paginate(`/instagram/posts/${shortcode}/comments`, {\n params: {},\n itemsKey: \"comments\",\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, Job104Company, Job104Job } from \"../types.js\";\n\nexport class Job104 extends APIResource {\n async searchJobs(options?: {\n q?: string;\n welfare?: string;\n area?: string;\n page?: number;\n count?: number;\n }): Promise<APIResponse<Job104Job[]>> {\n return this._getList(`/job104/jobs/search`, {\n params: {\n q: options?.q,\n welfare: options?.welfare,\n area: options?.area,\n page: options?.page,\n count: options?.count,\n },\n itemsKey: \"jobs\",\n castTo: (r) => r as Job104Job,\n });\n }\n\n async getCompany(companyId: string): Promise<APIResponse<Job104Company>> {\n return this._get(`/job104/companies/${companyId}`, {\n castTo: (r) => r as Job104Company,\n });\n }\n\n async getJob(jobId: string): Promise<APIResponse<Job104Job>> {\n return this._get(`/job104/jobs/${jobId}`, {\n castTo: (r) => r as Job104Job,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterSearchJobs(options?: {\n q?: string;\n welfare?: string;\n area?: string;\n count?: number;\n }): AsyncGenerator<Job104Job> {\n return this._paginateByPage(`/job104/jobs/search`, {\n params: {\n q: options?.q,\n welfare: options?.welfare,\n area: options?.area,\n count: options?.count ?? 20,\n },\n itemsKey: \"jobs\",\n pageKey: \"page\",\n castTo: (r) => r as Job104Job,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type {\n APIResponse,\n LinkedInCompany,\n LinkedInJob,\n LinkedInPost,\n LinkedInUser,\n} from \"../types.js\";\n\nexport class LinkedIn extends APIResource {\n async getCompany(\n companyId: string,\n ): Promise<APIResponse<LinkedInCompany>> {\n return this._get(`/linkedin/companies/${companyId}`, {\n castTo: (r) => r as LinkedInCompany,\n });\n }\n\n async getCompanyJobs(\n companyId: string,\n options?: { count?: number; offset?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/linkedin/companies/${companyId}/jobs`, {\n params: { count: options?.count, offset: options?.offset },\n });\n }\n\n async searchJobs(\n query: string,\n options?: { location?: string; count?: number; offset?: number },\n ): Promise<APIResponse<LinkedInJob[]>> {\n return this._getList(`/linkedin/jobs/search`, {\n params: {\n q: query,\n location: options?.location,\n count: options?.count,\n offset: options?.offset,\n },\n itemsKey: \"jobs\",\n castTo: (r) => r as LinkedInJob,\n });\n }\n\n async getJob(jobId: string): Promise<APIResponse<LinkedInJob>> {\n return this._get(`/linkedin/jobs/${jobId}`, {\n castTo: (r) => r as LinkedInJob,\n });\n }\n\n async getPost(postId: string): Promise<APIResponse<LinkedInPost>> {\n return this._get(`/linkedin/posts/${postId}`, {\n castTo: (r) => r as LinkedInPost,\n });\n }\n\n async searchUsers(\n query: string,\n options?: { count?: number; offset?: number },\n ): Promise<APIResponse<LinkedInUser[]>> {\n return this._getList(`/linkedin/users/search`, {\n params: { q: query, count: options?.count, offset: options?.offset },\n itemsKey: \"users\",\n castTo: (r) => r as LinkedInUser,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<LinkedInUser>> {\n return this._get(`/linkedin/users/${username}`, {\n castTo: (r) => r as LinkedInUser,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterCompanyJobs(\n companyId: string,\n options?: { count?: number },\n ): AsyncGenerator<LinkedInJob> {\n const count = options?.count ?? 10;\n return this._paginateByOffset(`/linkedin/companies/${companyId}/jobs`, {\n params: { count, limit: count },\n itemsKey: \"jobs\",\n castTo: (r) => r as LinkedInJob,\n });\n }\n\n iterSearchJobs(\n query: string,\n options?: { location?: string; count?: number },\n ): AsyncGenerator<LinkedInJob> {\n const count = options?.count ?? 10;\n return this._paginateByOffset(`/linkedin/jobs/search`, {\n params: { q: query, location: options?.location, count, limit: count },\n itemsKey: \"jobs\",\n castTo: (r) => r as LinkedInJob,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, RedditPost, RedditUser, Subreddit } from \"../types.js\";\n\nexport class Reddit extends APIResource {\n async getSubreddit(name: string): Promise<APIResponse<Subreddit>> {\n return this._get(`/reddit/subreddits/${name}`, {\n castTo: (r) => r as Subreddit,\n });\n }\n\n async getSubredditPosts(\n name: string,\n options?: { sort?: string; t?: string; count?: number },\n ): Promise<APIResponse<RedditPost[]>> {\n return this._getList(`/reddit/subreddits/${name}/posts`, {\n params: { sort: options?.sort, t: options?.t, count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as RedditPost,\n });\n }\n\n async getPost(postId: string): Promise<APIResponse<RedditPost>> {\n return this._get(`/reddit/posts/${postId}`, {\n castTo: (r) => r as RedditPost,\n });\n }\n\n async searchPosts(\n q: string,\n options?: { sort?: string; count?: number },\n ): Promise<APIResponse<RedditPost[]>> {\n return this._getList(`/reddit/posts/search`, {\n params: { q, sort: options?.sort, count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as RedditPost,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<RedditUser>> {\n return this._get(`/reddit/users/${username}`, {\n castTo: (r) => r as RedditUser,\n });\n }\n\n async getUserPosts(\n username: string,\n options?: {\n sort?: string;\n t?: string;\n count?: number;\n after?: string;\n },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/reddit/users/${username}/posts`, {\n params: {\n sort: options?.sort,\n t: options?.t,\n count: options?.count,\n after: options?.after,\n },\n });\n }\n}\n","import { ByCrawlError, TimeoutError } from \"../exceptions.js\";\nimport { APIResource } from \"../resource.js\";\nimport type { APIResponse, BulkJob, BulkJobStatus, ThreadsPost, ThreadsUser } from \"../types.js\";\n\nexport class Threads extends APIResource {\n async getPost(\n postId: string,\n options?: { mode?: string },\n ): Promise<APIResponse<ThreadsPost>> {\n return this._get(`/threads/posts/${postId}`, {\n params: { mode: options?.mode },\n castTo: (r) => r as ThreadsPost,\n });\n }\n\n async getPosts(\n ids: string[],\n options?: { mode?: string },\n ): Promise<APIResponse<ThreadsPost[]>> {\n const resp = await this._request<ThreadsPost[]>(\"GET\", `/threads/posts`, {\n params: { ids: ids.join(\",\"), mode: options?.mode },\n });\n return resp;\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<ThreadsPost[]>> {\n return this._getList(`/threads/posts/search`, {\n params: { q, count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as ThreadsPost,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<ThreadsUser>> {\n return this._get(`/threads/users/${username}`, {\n castTo: (r) => r as ThreadsUser,\n });\n }\n\n async getUserPosts(\n userId: string,\n options?: { cursor?: string; count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/threads/users/${userId}/posts`, {\n params: { cursor: options?.cursor, count: options?.count },\n });\n }\n\n async getUserReplies(\n userId: string,\n options?: { cursor?: string; count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/threads/users/${userId}/replies`, {\n params: { cursor: options?.cursor, count: options?.count },\n });\n }\n\n async searchUsers(\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<ThreadsUser[]>> {\n return this._getList(`/threads/users/search`, {\n params: { q, count: options?.count },\n itemsKey: \"users\",\n castTo: (r) => r as ThreadsUser,\n });\n }\n\n async getPublicFeed(options?: {\n cursor?: string;\n count?: number;\n }): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/threads/feed/public`, {\n params: { cursor: options?.cursor, count: options?.count },\n });\n }\n\n // -- Bulk operations --\n\n async bulkSubmit(\n ids: string[],\n options?: { type?: string },\n ): Promise<APIResponse<BulkJob>> {\n return this._post(`/threads/bulk`, {\n body: { ids, type: options?.type ?? \"content\" },\n castTo: (r) => r as BulkJob,\n });\n }\n\n async bulkStatus(jobId: string): Promise<APIResponse<BulkJobStatus>> {\n return this._get(`/threads/bulk/${jobId}`, {\n castTo: (r) => r as BulkJobStatus,\n });\n }\n\n async bulkResults(jobId: string): Promise<APIResponse<ThreadsPost[]>> {\n return this._request<ThreadsPost[]>(\"GET\", `/threads/bulk/${jobId}/results`);\n }\n\n async bulkSubmitAndWait(\n ids: string[],\n options?: { pollInterval?: number; timeout?: number },\n ): Promise<APIResponse<ThreadsPost[]>> {\n const pollInterval = options?.pollInterval ?? 2000;\n const timeout = options?.timeout ?? 300_000;\n\n const submitResp = await this.bulkSubmit(ids);\n const jobId = submitResp.data!.jobId;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const statusResp = await this.bulkStatus(jobId);\n const status = statusResp.data!.status;\n if (status === \"completed\") {\n return this.bulkResults(jobId);\n }\n if (status === \"failed\") {\n throw new ByCrawlError(`Bulk job ${jobId} failed`);\n }\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new TimeoutError(`Bulk job ${jobId} timed out after ${timeout}ms`);\n }\n\n // -- Auto-pagination iterators --\n\n iterUserPosts(\n userId: string,\n options?: { count?: number },\n ): AsyncGenerator<ThreadsPost> {\n return this._paginate(`/threads/users/${userId}/posts`, {\n params: { count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as ThreadsPost,\n });\n }\n\n iterUserReplies(\n userId: string,\n options?: { count?: number },\n ): AsyncGenerator<ThreadsPost> {\n return this._paginate(`/threads/users/${userId}/replies`, {\n params: { count: options?.count },\n itemsKey: \"replies\",\n castTo: (r) => r as ThreadsPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, TikTokComment, TikTokUser, TikTokVideo } from \"../types.js\";\n\nexport class TikTok extends APIResource {\n async getVideo(videoId: string): Promise<APIResponse<TikTokVideo>> {\n return this._get(`/tiktok/videos/${videoId}`, {\n castTo: (r) => r as TikTokVideo,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<TikTokUser>> {\n return this._get(`/tiktok/users/${username}`, {\n castTo: (r) => r as TikTokUser,\n });\n }\n\n async getUserVideos(\n username: string,\n options?: { count?: number },\n ): Promise<APIResponse<TikTokVideo[]>> {\n return this._request<TikTokVideo[]>(\"GET\", `/tiktok/users/${username}/videos`, {\n params: { count: options?.count },\n });\n }\n\n async getVideoComments(\n videoId: string,\n options?: { cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/videos/${videoId}/comments`, {\n params: { cursor: options?.cursor },\n });\n }\n\n async getCategories(options?: {\n category?: string;\n count?: number;\n }): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/categories`, {\n params: { category: options?.category, count: options?.count },\n });\n }\n\n async search(\n keyword: string,\n options?: { count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/videos/search`, {\n params: { q: keyword, count: options?.count },\n });\n }\n\n async getVideoSubtitles(\n videoId: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/videos/${videoId}/subtitles`);\n }\n\n // -- Auto-pagination iterators --\n\n iterVideoComments(videoId: string): AsyncGenerator<TikTokComment> {\n return this._paginate(`/tiktok/videos/${videoId}/comments`, {\n params: {},\n itemsKey: \"comments\",\n castTo: (r) => r as TikTokComment,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse } from \"../types.js\";\n\nexport class WebFetch extends APIResource {\n async fetch(\n url: string,\n options?: { format?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/web/fetch`, {\n params: { url, format: options?.format },\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, XPost, XUser } from \"../types.js\";\n\nexport class X extends APIResource {\n async getUser(username: string): Promise<APIResponse<XUser>> {\n return this._get(`/x/users/${username}`, {\n castTo: (r) => r as XUser,\n });\n }\n\n async getUserPosts(\n username: string,\n options?: { count?: number; cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/x/users/${username}/posts`, {\n params: { count: options?.count, cursor: options?.cursor },\n });\n }\n\n async getPost(postId: string): Promise<APIResponse<XPost>> {\n return this._get(`/x/posts/${postId}`, {\n castTo: (r) => r as XPost,\n });\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number; cursor?: string; product?: string },\n ): Promise<APIResponse<XPost[]>> {\n return this._getList(`/x/posts/search`, {\n params: {\n q,\n count: options?.count,\n cursor: options?.cursor,\n product: options?.product,\n },\n itemsKey: \"tweets\",\n castTo: (r) => r as XPost,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterUserPosts(\n username: string,\n options?: { count?: number },\n ): AsyncGenerator<XPost> {\n return this._paginate(`/x/users/${username}/posts`, {\n params: { count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as XPost,\n });\n }\n\n iterSearchPosts(\n q: string,\n options?: { count?: number; product?: string },\n ): AsyncGenerator<XPost> {\n return this._paginate(`/x/posts/search`, {\n params: { q, count: options?.count, product: options?.product },\n itemsKey: \"posts\",\n castTo: (r) => r as XPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, YouTubeChannel, YouTubeComment, YouTubeVideo } from \"../types.js\";\n\nexport class YouTube extends APIResource {\n async getVideo(videoId: string): Promise<APIResponse<YouTubeVideo>> {\n return this._get(`/youtube/videos/${videoId}`, {\n castTo: (r) => r as YouTubeVideo,\n });\n }\n\n async getChannel(channelId: string): Promise<APIResponse<YouTubeChannel>> {\n return this._get(`/youtube/channels/${channelId}`, {\n castTo: (r) => r as YouTubeChannel,\n });\n }\n\n async search(\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/youtube/videos/search`, {\n params: { q, count: options?.count },\n });\n }\n\n async getVideoComments(\n videoId: string,\n options?: { count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/youtube/videos/${videoId}/comments`, {\n params: { count: options?.count },\n });\n }\n\n async getVideoTranscription(\n videoId: string,\n options?: { language?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/youtube/videos/${videoId}/transcription`, {\n params: { language: options?.language },\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterSearch(\n q: string,\n options?: { count?: number },\n ): AsyncGenerator<YouTubeVideo> {\n return this._paginate(`/youtube/videos/search`, {\n params: { q, count: options?.count },\n itemsKey: \"videos\",\n castTo: (r) => r as YouTubeVideo,\n });\n }\n\n iterVideoComments(\n videoId: string,\n options?: { count?: number },\n ): AsyncGenerator<YouTubeComment> {\n return this._paginate(`/youtube/videos/${videoId}/comments`, {\n params: { count: options?.count },\n itemsKey: \"comments\",\n castTo: (r) => r as YouTubeComment,\n });\n }\n}\n","/**\n * ByCrawl Client\n *\n * Main entry point for the SDK. Wires up all platform namespaces\n * and manages the HTTP transport.\n */\n\nimport {\n DEFAULT_BASE_URL,\n DEFAULT_MAX_RETRIES,\n DEFAULT_TIMEOUT,\n Transport,\n} from \"./http.js\";\nimport { Dcard } from \"./platforms/dcard.js\";\nimport { Facebook } from \"./platforms/facebook.js\";\nimport { GMaps } from \"./platforms/gmaps.js\";\nimport { Instagram } from \"./platforms/instagram.js\";\nimport { Job104 } from \"./platforms/job104.js\";\nimport { LinkedIn } from \"./platforms/linkedin.js\";\nimport { Reddit } from \"./platforms/reddit.js\";\nimport { Threads } from \"./platforms/threads.js\";\nimport { TikTok } from \"./platforms/tiktok.js\";\nimport { WebFetch } from \"./platforms/webfetch.js\";\nimport { X } from \"./platforms/x.js\";\nimport { YouTube } from \"./platforms/youtube.js\";\n\nexport interface ByCrawlOptions {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n maxRetries?: number;\n}\n\n/**\n * ByCrawl client for the ByCrawl social media data API.\n *\n * @example\n * ```ts\n * const client = new ByCrawl({ apiKey: \"sk_byc_...\" });\n * const post = await client.threads.getPost(\"DQt-ox3kdE4\");\n * console.log(post.data);\n * ```\n */\nexport class ByCrawl {\n readonly threads: Threads;\n readonly facebook: Facebook;\n readonly x: X;\n readonly instagram: Instagram;\n readonly reddit: Reddit;\n readonly linkedin: LinkedIn;\n readonly tiktok: TikTok;\n readonly youtube: YouTube;\n readonly dcard: Dcard;\n readonly gmaps: GMaps;\n readonly job104: Job104;\n readonly web: WebFetch;\n\n private readonly _transport: Transport;\n\n constructor(options?: ByCrawlOptions) {\n const apiKey =\n options?.apiKey ?? process.env[\"BYCRAWL_API_KEY\"] ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"apiKey must be provided or set via the BYCRAWL_API_KEY environment variable\",\n );\n }\n\n this._transport = new Transport({\n apiKey,\n baseUrl: options?.baseUrl ?? DEFAULT_BASE_URL,\n timeout: options?.timeout ?? DEFAULT_TIMEOUT,\n maxRetries: options?.maxRetries ?? DEFAULT_MAX_RETRIES,\n });\n\n this.threads = new Threads(this._transport);\n this.facebook = new Facebook(this._transport);\n this.x = new X(this._transport);\n this.instagram = new Instagram(this._transport);\n this.reddit = new Reddit(this._transport);\n this.linkedin = new LinkedIn(this._transport);\n this.tiktok = new TikTok(this._transport);\n this.youtube = new YouTube(this._transport);\n this.dcard = new Dcard(this._transport);\n this.gmaps = new GMaps(this._transport);\n this.job104 = new Job104(this._transport);\n this.web = new WebFetch(this._transport);\n }\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@bycrawl/nodejs-sdk",
3
+ "version": "0.1.1",
4
+ "description": "Official Node.js SDK for the ByCrawl social media data API",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "require": {
15
+ "types": "./dist/index.d.cts",
16
+ "default": "./dist/index.cjs"
17
+ }
18
+ }
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "LICENSE"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsup",
26
+ "dev": "tsup --watch",
27
+ "test": "vitest run",
28
+ "test:watch": "vitest",
29
+ "typecheck": "tsc --noEmit",
30
+ "lint": "eslint src",
31
+ "prepublishOnly": "npm run build"
32
+ },
33
+ "keywords": [
34
+ "bycrawl",
35
+ "social-media",
36
+ "api",
37
+ "sdk",
38
+ "threads",
39
+ "twitter",
40
+ "instagram",
41
+ "tiktok",
42
+ "youtube",
43
+ "facebook",
44
+ "reddit",
45
+ "linkedin",
46
+ "dcard",
47
+ "scraper"
48
+ ],
49
+ "author": "Signalsurf",
50
+ "license": "MIT",
51
+ "homepage": "https://bycrawl.com",
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "https://github.com/Signalsurf-ai/bycrawl-node.git"
55
+ },
56
+ "engines": {
57
+ "node": ">=18.0.0"
58
+ },
59
+ "devDependencies": {
60
+ "tsup": "^8.0.0",
61
+ "typescript": "^5.8.0",
62
+ "vitest": "^3.0.0",
63
+ "@types/node": "^22.0.0"
64
+ }
65
+ }