@adbjs/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/errors.ts","../src/base-resource.ts","../src/resources/host.ts","../src/resources/link.ts","../src/resources/magnet.ts","../src/resources/user.ts","../src/client.ts"],"names":["wretch"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ApiError } from './types.js'\r\n\r\n/**\r\n * Base error class for AllDebrid SDK errors\r\n */\r\nexport class AllDebridError extends Error {\r\n public readonly code: string\r\n public readonly isAllDebridError = true\r\n\r\n constructor(code: string, message: string) {\r\n super(message)\r\n this.name = 'AllDebridError'\r\n this.code = code\r\n\r\n // Maintains proper stack trace for where our error was thrown (only available on V8)\r\n if ('captureStackTrace' in Error && typeof (Error as any).captureStackTrace === 'function') {\r\n ;(Error as any).captureStackTrace(this, AllDebridError)\r\n }\r\n }\r\n\r\n /**\r\n * Create an AllDebridError from an API error response\r\n */\r\n static fromApiError(error: ApiError): AllDebridError {\r\n return new AllDebridError(error.code, error.message)\r\n }\r\n}\r\n\r\n/**\r\n * Authentication related errors\r\n */\r\nexport class AuthenticationError extends AllDebridError {\r\n constructor(code: string, message: string) {\r\n super(code, message)\r\n this.name = 'AuthenticationError'\r\n }\r\n}\r\n\r\n/**\r\n * Link processing errors\r\n */\r\nexport class LinkError extends AllDebridError {\r\n constructor(code: string, message: string) {\r\n super(code, message)\r\n this.name = 'LinkError'\r\n }\r\n}\r\n\r\n/**\r\n * Magnet/Torrent related errors\r\n */\r\nexport class MagnetError extends AllDebridError {\r\n constructor(code: string, message: string) {\r\n super(code, message)\r\n this.name = 'MagnetError'\r\n }\r\n}\r\n\r\n/**\r\n * Network/HTTP errors\r\n */\r\nexport class NetworkError extends AllDebridError {\r\n constructor(\r\n message: string,\r\n public readonly statusCode?: number,\r\n ) {\r\n super('NETWORK_ERROR', message)\r\n this.name = 'NetworkError'\r\n }\r\n}\r\n\r\n/**\r\n * Helper to determine error type from error code\r\n */\r\nexport function createTypedError(code: string, message: string): AllDebridError {\r\n if (code.startsWith('AUTH_')) {\r\n return new AuthenticationError(code, message)\r\n }\r\n if (\r\n code.startsWith('LINK_') ||\r\n code.startsWith('REDIRECTOR_') ||\r\n code.startsWith('STREAM_') ||\r\n code.startsWith('DELAYED_')\r\n ) {\r\n return new LinkError(code, message)\r\n }\r\n if (code.startsWith('MAGNET_')) {\r\n return new MagnetError(code, message)\r\n }\r\n return new AllDebridError(code, message)\r\n}\r\n","import type { AllDebridClient } from './client.js'\r\nimport type { ExtractData } from './types.js'\r\n\r\n/**\r\n * Base class for all resources\r\n * Provides access to HTTP methods\r\n * @internal\r\n */\r\nexport abstract class BaseResource {\r\n constructor(protected readonly client: AllDebridClient) {}\r\n\r\n /**\r\n * Make a GET request\r\n * @param T - The generated response type (e.g., GetLinkUnlockResponse)\r\n * @returns The extracted data from the response (without the { status, data } wrapper)\r\n */\r\n protected async get<T>(path: string, params?: Record<string, unknown>): Promise<ExtractData<T>> {\r\n const clientAny = this.client as any\r\n return clientAny.get(path, params) as Promise<ExtractData<T>>\r\n }\r\n\r\n /**\r\n * Make a POST request\r\n * @param T - The generated response type\r\n * @returns The extracted data from the response (without the { status, data } wrapper)\r\n */\r\n protected async post<T>(\r\n path: string,\r\n body?: unknown,\r\n params?: Record<string, unknown>,\r\n ): Promise<ExtractData<T>> {\r\n const clientAny = this.client as any\r\n return clientAny.post(path, body, params) as Promise<ExtractData<T>>\r\n }\r\n\r\n /**\r\n * Make a POST request with FormData (multipart/form-data)\r\n * @param T - The generated response type\r\n * @returns The extracted data from the response (without the { status, data } wrapper)\r\n */\r\n protected async postFormData<T>(\r\n path: string,\r\n formData: FormData,\r\n params?: Record<string, unknown>,\r\n ): Promise<ExtractData<T>> {\r\n const clientAny = this.client as any\r\n return clientAny.postFormData(path, formData, params) as Promise<ExtractData<T>>\r\n }\r\n}\r\n","import type {\r\n GetHostsDomainsResponse,\r\n GetHostsPriorityResponse,\r\n GetHostsResponse,\r\n} from '../generated/types.gen.js'\r\nimport { BaseResource } from '../base-resource.js'\r\n\r\n/**\r\n * Host resource for getting information about supported hosts\r\n */\r\nexport class HostResource extends BaseResource {\r\n /**\r\n * Get list of all supported hosts with their information\r\n *\r\n * @param hostOnly - If true, only return hosts (exclude streams and redirectors)\r\n *\r\n * @example\r\n * ```ts\r\n * const hosts = await client.host.list()\r\n * console.log(hosts.hosts) // All supported file hosts\r\n * console.log(hosts.streams) // Streaming hosts\r\n * console.log(hosts.redirectors) // Link redirectors\r\n * ```\r\n */\r\n async list(hostOnly?: boolean) {\r\n const params = hostOnly ? { hostOnly: '1' } : undefined\r\n return this.get<GetHostsResponse>('/hosts', params)\r\n }\r\n\r\n /**\r\n * Get array of all supported domain names\r\n *\r\n * @example\r\n * ```ts\r\n * const domains = await client.host.domains()\r\n * console.log(domains) // ['rapidgator.net', 'uploaded.net', ...]\r\n * ```\r\n */\r\n async domains() {\r\n return this.get<GetHostsDomainsResponse>('/hosts/domains')\r\n }\r\n\r\n /**\r\n * Get hosts ordered by restriction level (priority list)\r\n *\r\n * @example\r\n * ```ts\r\n * const priority = await client.host.priority()\r\n * console.log(priority.hosts) // Ordered list with restriction levels\r\n * ```\r\n */\r\n async priority() {\r\n return this.get<GetHostsPriorityResponse>('/hosts/priority')\r\n }\r\n}\r\n","import type {\r\n GetLinkDelayedResponse,\r\n GetLinkInfosResponse,\r\n GetLinkRedirectorResponse,\r\n GetLinkStreamingResponse,\r\n GetLinkUnlockResponse,\r\n} from '../generated/types.gen.js'\r\nimport { BaseResource } from '../base-resource.js'\r\n\r\n/**\r\n * Options for polling delayed link generation\r\n */\r\nexport interface PollOptions {\r\n /**\r\n * Polling interval in milliseconds\r\n * @default 2000\r\n */\r\n interval?: number\r\n\r\n /**\r\n * Maximum number of polling attempts\r\n * @default 30\r\n */\r\n maxAttempts?: number\r\n\r\n /**\r\n * Callback called on each polling attempt\r\n */\r\n onPoll?: (attempt: number) => void\r\n}\r\n\r\n/**\r\n * Link resource for unlocking and managing download links\r\n */\r\nexport class LinkResource extends BaseResource {\r\n /**\r\n * Get information about one or more links\r\n *\r\n * @param links - Single link or array of links to get info for\r\n *\r\n * @example\r\n * ```ts\r\n * const info = await client.link.infos('https://example.com/file.zip')\r\n * console.log(info)\r\n * ```\r\n */\r\n async infos(links: string | string[]) {\r\n const linksArray = Array.isArray(links) ? links : [links]\r\n const data = await this.get<GetLinkInfosResponse>('/link/infos', {\r\n link: linksArray,\r\n })\r\n return data?.infos\r\n }\r\n\r\n /**\r\n * Extract links from redirectors/link protectors\r\n *\r\n * @param link - The redirector link to extract from\r\n *\r\n * @example\r\n * ```ts\r\n * const links = await client.link.redirector('https://linkprotector.com/abc123')\r\n * ```\r\n */\r\n async redirector(link: string) {\r\n const data = await this.get<GetLinkRedirectorResponse>('/link/redirector', {\r\n link,\r\n })\r\n return data?.links\r\n }\r\n\r\n /**\r\n * Unlock a download link\r\n *\r\n * @param link - The link to unlock\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.link.unlock('https://example.com/file.zip')\r\n * if (result.link) {\r\n * console.log('Direct link:', result.link)\r\n * } else if (result.delayed) {\r\n * // Handle delayed generation\r\n * const delayedResult = await client.link.delayed(result.delayed)\r\n * }\r\n * ```\r\n */\r\n async unlock(link: string) {\r\n return this.get<GetLinkUnlockResponse>('/link/unlock', {\r\n link,\r\n })\r\n }\r\n\r\n /**\r\n * Unlock a link and automatically poll if delayed\r\n * Note: The API response format doesn't include a delayed field in the current OpenAPI spec.\r\n * This method will be updated once the delayed mechanism is documented.\r\n *\r\n * @param link - The link to unlock\r\n * @param _options - Polling options (currently unused)\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.link.unlockWithPolling('https://example.com/file.zip')\r\n * console.log('Direct link:', result.link)\r\n * ```\r\n */\r\n async unlockWithPolling(link: string, _options: PollOptions = {}) {\r\n // For now, just unlock without polling\r\n // TODO: Implement polling once delayed field is added to API response\r\n return this.unlock(link)\r\n }\r\n\r\n /**\r\n * Get streaming options for a generated link\r\n *\r\n * @param id - The generated link ID or streaming ID\r\n *\r\n * @example\r\n * ```ts\r\n * const streams = await client.link.streaming('abc123')\r\n * ```\r\n */\r\n async streaming(id: string) {\r\n return this.get<GetLinkStreamingResponse>('/link/streaming', {\r\n id,\r\n })\r\n }\r\n\r\n /**\r\n * Get the status/result of a delayed link generation\r\n *\r\n * @param id - The delayed generation ID\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.link.delayed('delayed_id_123')\r\n * ```\r\n */\r\n async delayed(id: string) {\r\n return this.get<GetLinkDelayedResponse>('/link/delayed', {\r\n id,\r\n })\r\n }\r\n}\r\n","import type {\r\n GetMagnetDeleteResponse,\r\n GetMagnetInstantResponse,\r\n GetMagnetRestartResponse,\r\n GetMagnetStatusResponse,\r\n GetMagnetUploadResponse,\r\n PostMagnetUploadFileResponse,\r\n} from '../generated/types.gen.js'\r\nimport { BaseResource } from '../base-resource.js'\r\n\r\n/**\r\n * Options for watching magnet status\r\n */\r\nexport interface WatchOptions {\r\n /**\r\n * Polling interval in milliseconds\r\n * @default 3000\r\n */\r\n interval?: number\r\n\r\n /**\r\n * Maximum number of polling attempts (0 = infinite)\r\n * @default 0\r\n */\r\n maxAttempts?: number\r\n\r\n /**\r\n * Callback called on each status update\r\n */\r\n onUpdate?: (status: any) => void\r\n\r\n /**\r\n * Stop watching when magnet reaches this status\r\n * @default 'Ready'\r\n */\r\n stopOnStatus?: string\r\n}\r\n\r\n/**\r\n * Magnet/Torrent resource for managing torrent downloads\r\n */\r\nexport class MagnetResource extends BaseResource {\r\n /**\r\n * Upload magnets by URI or hash\r\n *\r\n * @param magnets - Single magnet URI/hash or array of magnets\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.magnet.upload('magnet:?xt=urn:btih:...')\r\n * console.log('Magnet ID:', result.magnets[0].id)\r\n * ```\r\n */\r\n async upload(magnets: string | string[]) {\r\n const magnetsArray = Array.isArray(magnets) ? magnets : [magnets]\r\n return this.get<GetMagnetUploadResponse>('/magnet/upload', {\r\n magnets: magnetsArray,\r\n })\r\n }\r\n\r\n /**\r\n * Upload a torrent file\r\n *\r\n * @param file - The torrent file (Blob or File)\r\n * @param filename - Optional filename (defaults to 'torrent.torrent' for Blob, or file.name for File)\r\n *\r\n * @example\r\n * ```ts\r\n * const file = new File([buffer], 'torrent.torrent')\r\n * const result = await client.magnet.uploadFile(file)\r\n *\r\n * // Or with a Blob and custom filename\r\n * const blob = new Blob([buffer])\r\n * const result = await client.magnet.uploadFile(blob, 'my-torrent.torrent')\r\n * ```\r\n */\r\n async uploadFile(file: Blob | File, filename?: string) {\r\n const formData = new FormData()\r\n\r\n // Determine the filename to use\r\n const actualFilename = filename || (file instanceof File ? file.name : 'torrent.torrent')\r\n\r\n // Append with explicit filename\r\n formData.append('files[]', file, actualFilename)\r\n\r\n return this.postFormData<PostMagnetUploadFileResponse['data']>('/magnet/upload/file', formData)\r\n }\r\n\r\n /**\r\n * Get the status of one or more magnets\r\n *\r\n * @param id - Optional magnet ID to get status for a specific magnet\r\n *\r\n * @example\r\n * ```ts\r\n * // Get all magnets status\r\n * const allStatus = await client.magnet.status()\r\n *\r\n * // Get specific magnet status\r\n * const status = await client.magnet.status('123')\r\n * console.log(status.magnets[0]?.status) // 'Downloading', 'Ready', etc.\r\n * ```\r\n */\r\n async status(id?: string) {\r\n const params = id ? { id } : undefined\r\n const data = await this.get<GetMagnetStatusResponse>('/magnet/status', params)\r\n\r\n // Fix: AllDebrid API returns an object instead of array when filtering by ID\r\n // This is an API inconsistency, so we normalize it to always return an array\r\n if (data?.magnets && !Array.isArray(data.magnets)) {\r\n return {\r\n ...data,\r\n magnets: [data.magnets],\r\n }\r\n }\r\n\r\n return data\r\n }\r\n\r\n /**\r\n * Delete a magnet\r\n *\r\n * @param id - The magnet ID to delete (string)\r\n *\r\n * @example\r\n * ```ts\r\n * await client.magnet.delete('123')\r\n * ```\r\n */\r\n async delete(id: string) {\r\n return this.get<GetMagnetDeleteResponse>('/magnet/delete', {\r\n id,\r\n })\r\n }\r\n\r\n /**\r\n * Restart one or more failed magnets\r\n *\r\n * @param ids - Single magnet ID or array of magnet IDs to restart (strings)\r\n *\r\n * @example\r\n * ```ts\r\n * // Restart single magnet\r\n * await client.magnet.restart('123')\r\n *\r\n * // Restart multiple magnets\r\n * await client.magnet.restart(['123', '456'])\r\n * ```\r\n */\r\n async restart(ids: string | string[]) {\r\n const idsArray = Array.isArray(ids) ? ids : [ids]\r\n return this.get<GetMagnetRestartResponse>('/magnet/restart', {\r\n ids: idsArray,\r\n })\r\n }\r\n\r\n /**\r\n * Check instant availability of magnets\r\n *\r\n * @param magnets - Single magnet hash or array of hashes\r\n *\r\n * @example\r\n * ```ts\r\n * const available = await client.magnet.instant(['hash1', 'hash2'])\r\n * console.log(available.magnets)\r\n * ```\r\n */\r\n async instant(magnets: string | string[]) {\r\n const magnetsArray = Array.isArray(magnets) ? magnets : [magnets]\r\n return this.get<GetMagnetInstantResponse>('/magnet/instant', {\r\n magnets: magnetsArray,\r\n })\r\n }\r\n\r\n /**\r\n * Watch a magnet's status with automatic polling\r\n *\r\n * @param id - The magnet ID to watch (string)\r\n * @param options - Watch options\r\n *\r\n * @example\r\n * ```ts\r\n * await client.magnet.watch('123', {\r\n * onUpdate: (status) => console.log('Status:', status.magnets[0]?.status),\r\n * stopOnStatus: 'Ready'\r\n * })\r\n * ```\r\n */\r\n async watch(id: string, options: WatchOptions = {}) {\r\n const { interval = 3000, maxAttempts = 0, onUpdate, stopOnStatus = 'Ready' } = options\r\n\r\n let attempt = 0\r\n\r\n while (maxAttempts === 0 || attempt < maxAttempts) {\r\n attempt++\r\n\r\n const status = await this.status(id)\r\n onUpdate?.(status)\r\n\r\n // Check if we should stop (magnets is an array)\r\n const magnet = status?.magnets?.[0]\r\n if (magnet?.status === stopOnStatus) {\r\n return status\r\n }\r\n\r\n // Wait before next attempt\r\n await new Promise((resolve) => setTimeout(resolve, interval))\r\n }\r\n\r\n throw new Error(\r\n `Watch timeout: magnet did not reach '${stopOnStatus}' status after ${maxAttempts} attempts`,\r\n )\r\n }\r\n}\r\n","import type {\r\n GetUserHistoryDeleteResponse,\r\n GetUserHistoryResponse,\r\n GetUserHostsResponse,\r\n GetUserLinksDeleteResponse,\r\n GetUserLinksResponse,\r\n GetUserLinksSaveResponse,\r\n GetUserResponse,\r\n} from '../generated/types.gen.js'\r\nimport { BaseResource } from '../base-resource.js'\r\n\r\n/**\r\n * User resource for managing user account information\r\n */\r\nexport class UserResource extends BaseResource {\r\n /**\r\n * Get user profile information including premium status and quotas\r\n *\r\n * @example\r\n * ```ts\r\n * const user = await client.user.getInfo()\r\n * console.log(user.username, user.isPremium)\r\n * ```\r\n */\r\n async getInfo() {\r\n const data = await this.get<GetUserResponse>('/user')\r\n return data?.user\r\n }\r\n\r\n /**\r\n * Get available hosts for the current user based on their subscription\r\n *\r\n * @param hostOnly - If true, only return hosts data (exclude streams and redirectors)\r\n *\r\n * @example\r\n * ```ts\r\n * const hosts = await client.user.getHosts()\r\n * console.log(Object.keys(hosts.hosts))\r\n * ```\r\n */\r\n async getHosts(hostOnly?: boolean) {\r\n const params = hostOnly ? { hostOnly: '1' } : undefined\r\n return this.get<GetUserHostsResponse>('/user/hosts', params)\r\n }\r\n\r\n /**\r\n * Clear a specific notification by code\r\n *\r\n * @param code - The notification code to clear\r\n *\r\n * @example\r\n * ```ts\r\n * await client.user.clearNotification('SOME_NOTIF_CODE')\r\n * ```\r\n */\r\n async clearNotification(code: string) {\r\n await this.get('/user/notification/clear', { code })\r\n }\r\n\r\n // ============================================\r\n // Saved Links Management\r\n // ============================================\r\n\r\n /**\r\n * Get all saved links\r\n *\r\n * @example\r\n * ```ts\r\n * const savedLinks = await client.user.getLinks()\r\n * console.log(savedLinks.links)\r\n * ```\r\n */\r\n async getLinks() {\r\n return this.get<GetUserLinksResponse>('/user/links')\r\n }\r\n\r\n /**\r\n * Save a link for later use\r\n *\r\n * @param link - The link to save\r\n *\r\n * @example\r\n * ```ts\r\n * await client.user.saveLink('https://example.com/file.zip')\r\n * ```\r\n */\r\n async saveLink(link: string) {\r\n return this.get<GetUserLinksSaveResponse>('/user/links/save', { link })\r\n }\r\n\r\n /**\r\n * Delete a saved link\r\n *\r\n * @param link - The link to delete (can be the saved link ID or URL)\r\n *\r\n * @example\r\n * ```ts\r\n * await client.user.deleteLink('saved-link-id')\r\n * ```\r\n */\r\n async deleteLink(link: string) {\r\n return this.get<GetUserLinksDeleteResponse>('/user/links/delete', { link })\r\n }\r\n\r\n // ============================================\r\n // History Management\r\n // ============================================\r\n\r\n /**\r\n * Get user history (if enabled in account settings)\r\n *\r\n * @example\r\n * ```ts\r\n * const history = await client.user.getHistory()\r\n * console.log(history.links)\r\n * ```\r\n */\r\n async getHistory() {\r\n return this.get<GetUserHistoryResponse>('/user/history')\r\n }\r\n\r\n /**\r\n * Clear user history\r\n *\r\n * @example\r\n * ```ts\r\n * await client.user.clearHistory()\r\n * ```\r\n */\r\n async clearHistory() {\r\n return this.get<GetUserHistoryDeleteResponse>('/user/history/delete')\r\n }\r\n}\r\n","import type { AllDebridConfig, ApiResponse, ExtractData } from './types.js'\r\nimport wretch from 'wretch'\r\nimport { createTypedError, NetworkError } from './errors.js'\r\nimport { HostResource } from './resources/host.js'\r\nimport { LinkResource } from './resources/link.js'\r\nimport { MagnetResource } from './resources/magnet.js'\r\nimport { UserResource } from './resources/user.js'\r\n\r\nconst DEFAULT_BASE_URL = 'https://api.alldebrid.com/v4'\r\nconst DEFAULT_AGENT = '@alldebrid/sdk'\r\nconst DEFAULT_TIMEOUT = 30000\r\nconst DEFAULT_MAX_RETRIES = 3\r\n\r\n/**\r\n * Main AllDebrid client class\r\n */\r\nexport class AllDebridClient {\r\n private readonly config: Required<AllDebridConfig>\r\n\r\n /**\r\n * User resource for managing user account\r\n */\r\n public readonly user: UserResource\r\n\r\n /**\r\n * Link resource for unlocking and managing download links\r\n */\r\n public readonly link: LinkResource\r\n\r\n /**\r\n * Magnet resource for managing torrents\r\n */\r\n public readonly magnet: MagnetResource\r\n\r\n /**\r\n * Host resource for getting information about supported hosts\r\n */\r\n public readonly host: HostResource\r\n\r\n constructor(config: AllDebridConfig) {\r\n // Merge config with defaults\r\n this.config = {\r\n apiKey: config.apiKey,\r\n agent: config.agent ?? DEFAULT_AGENT,\r\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\r\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\r\n retry: config.retry ?? true,\r\n maxRetries: config.maxRetries ?? DEFAULT_MAX_RETRIES,\r\n }\r\n\r\n // Initialize resources\r\n this.user = new UserResource(this)\r\n this.link = new LinkResource(this)\r\n this.magnet = new MagnetResource(this)\r\n this.host = new HostResource(this)\r\n }\r\n\r\n /**\r\n * Build query string from params\r\n */\r\n private buildUrl(path: string, params?: Record<string, unknown>): string {\r\n const allParams = {\r\n agent: this.config.agent,\r\n ...params,\r\n }\r\n\r\n const query = new URLSearchParams()\r\n for (const [key, value] of Object.entries(allParams)) {\r\n if (value !== undefined && value !== null) {\r\n if (Array.isArray(value)) {\r\n value.forEach((v) => query.append(`${key}[]`, String(v)))\r\n } else {\r\n query.append(key, String(value))\r\n }\r\n }\r\n }\r\n\r\n const queryString = query.toString()\r\n return queryString ? `${path}?${queryString}` : path\r\n }\r\n\r\n /**\r\n * Make a GET request\r\n * @param T - The generated response type (e.g., GetLinkUnlockResponse)\r\n * @returns The extracted data from the response (without the { status, data } wrapper)\r\n */\r\n protected async get<T>(path: string, params?: Record<string, unknown>): Promise<ExtractData<T>> {\r\n try {\r\n const url = this.buildUrl(path, params)\r\n const json = await wretch(this.config.baseUrl)\r\n .auth(`Bearer ${this.config.apiKey}`)\r\n .url(url)\r\n .get()\r\n .json<ApiResponse<unknown>>()\r\n\r\n // Handle error responses\r\n if (json.status === 'error' && json.error) {\r\n throw createTypedError(json.error.code, json.error.message)\r\n }\r\n\r\n return json.data as ExtractData<T>\r\n } catch (error: any) {\r\n // Handle HTTP errors\r\n if (error.status === 401) {\r\n throw createTypedError('AUTH_BAD_APIKEY', 'Invalid API key or unauthorized access')\r\n }\r\n if (error.status === 403) {\r\n throw createTypedError('AUTH_BLOCKED', 'Access forbidden')\r\n }\r\n if (error.status === 429) {\r\n throw createTypedError('RATE_LIMITED', 'Too many requests')\r\n }\r\n\r\n // Re-throw if already our error type\r\n if (error.isAllDebridError) {\r\n throw error\r\n }\r\n\r\n // Wrap in NetworkError\r\n throw new NetworkError(error.message || 'Network error occurred', error.status)\r\n }\r\n }\r\n\r\n /**\r\n * Make a POST request\r\n * @param T - The generated response type\r\n * @returns The extracted data from the response (without the { status, data } wrapper)\r\n */\r\n protected async post<T>(\r\n path: string,\r\n body?: unknown,\r\n params?: Record<string, unknown>,\r\n ): Promise<ExtractData<T>> {\r\n try {\r\n const url = this.buildUrl(path, params)\r\n const json = await wretch(this.config.baseUrl)\r\n .auth(`Bearer ${this.config.apiKey}`)\r\n .url(url)\r\n .post(body)\r\n .json<ApiResponse<unknown>>()\r\n\r\n // Handle error responses\r\n if (json.status === 'error' && json.error) {\r\n throw createTypedError(json.error.code, json.error.message)\r\n }\r\n\r\n return json.data as ExtractData<T>\r\n } catch (error: any) {\r\n // Handle HTTP errors\r\n if (error.status === 401) {\r\n throw createTypedError('AUTH_BAD_APIKEY', 'Invalid API key or unauthorized access')\r\n }\r\n if (error.status === 403) {\r\n throw createTypedError('AUTH_BLOCKED', 'Access forbidden')\r\n }\r\n if (error.status === 429) {\r\n throw createTypedError('RATE_LIMITED', 'Too many requests')\r\n }\r\n\r\n // Re-throw if already our error type\r\n if (error.isAllDebridError) {\r\n throw error\r\n }\r\n\r\n // Wrap in NetworkError\r\n throw new NetworkError(error.message || 'Network error occurred', error.status)\r\n }\r\n }\r\n\r\n /**\r\n * Make a POST request with FormData (multipart/form-data)\r\n * @param T - The generated response type\r\n * @returns The extracted data from the response (without the { status, data } wrapper)\r\n */\r\n protected async postFormData<T>(\r\n path: string,\r\n formData: FormData,\r\n params?: Record<string, unknown>,\r\n ): Promise<ExtractData<T>> {\r\n try {\r\n const url = this.buildUrl(path, params)\r\n const json = await wretch(this.config.baseUrl)\r\n .auth(`Bearer ${this.config.apiKey}`)\r\n .url(url)\r\n .body(formData)\r\n .post()\r\n .json<ApiResponse<unknown>>()\r\n\r\n // Handle error responses\r\n if (json.status === 'error' && json.error) {\r\n throw createTypedError(json.error.code, json.error.message)\r\n }\r\n\r\n return json.data as ExtractData<T>\r\n } catch (error: any) {\r\n // Handle HTTP errors\r\n if (error.status === 401) {\r\n throw createTypedError('AUTH_BAD_APIKEY', 'Invalid API key or unauthorized access')\r\n }\r\n if (error.status === 403) {\r\n throw createTypedError('AUTH_BLOCKED', 'Access forbidden')\r\n }\r\n if (error.status === 429) {\r\n throw createTypedError('RATE_LIMITED', 'Too many requests')\r\n }\r\n\r\n // Re-throw if already our error type\r\n if (error.isAllDebridError) {\r\n throw error\r\n }\r\n\r\n // Wrap in NetworkError\r\n throw new NetworkError(error.message || 'Network error occurred', error.status)\r\n }\r\n }\r\n\r\n /**\r\n * Test the API connection\r\n */\r\n async ping(): Promise<boolean> {\r\n try {\r\n await this.get('/user')\r\n return true\r\n } catch {\r\n return false\r\n }\r\n }\r\n}\r\n"]}