@subscribe.dev/client
Version:
JavaScript/TypeScript client for SubscribeDev API - A drop-in for AI generation across 100+ models with built-in billing and rate limiting
1 lines • 47.9 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../../node_modules/eventemitter3/index.js","../src/errors.ts","../src/client.ts"],"sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","/**\n * Base error class for SubscribeDev client errors\n */\nexport class SubscribeDevError extends Error {\n public readonly code: string\n public readonly statusCode?: number\n public readonly details?: Record<string, any>\n public readonly requestId?: string\n\n constructor(\n message: string,\n code: string,\n statusCode?: number,\n details?: Record<string, any>,\n requestId?: string\n ) {\n super(message)\n this.name = 'SubscribeDevError'\n this.code = code\n this.statusCode = statusCode\n this.details = details\n this.requestId = requestId\n }\n}\n\n/**\n * Error thrown when account has insufficient balance\n */\nexport class InsufficientBalanceError extends SubscribeDevError {\n constructor(\n message: string,\n remainingCredits?: number,\n requiredCredits?: number,\n requestId?: string\n ) {\n super(message, 'INSUFFICIENT_BALANCE', 402, {\n remainingCredits,\n requiredCredits\n }, requestId)\n this.name = 'InsufficientBalanceError'\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded\n */\nexport class RateLimitError extends SubscribeDevError {\n public readonly resetTime?: string\n public readonly retryAfter?: number\n\n constructor(\n message: string,\n resetTime?: string,\n retryAfter?: number,\n requestId?: string\n ) {\n super(message, 'RATE_LIMIT_EXCEEDED', 429, {\n resetTime,\n retryAfter\n }, requestId)\n this.name = 'RateLimitError'\n this.resetTime = resetTime\n this.retryAfter = retryAfter\n }\n}\n\n/**\n * Error thrown for authentication failures\n */\nexport class AuthenticationError extends SubscribeDevError {\n constructor(message: string, requestId?: string) {\n super(message, 'AUTHENTICATION_FAILED', 401, undefined, requestId)\n this.name = 'AuthenticationError'\n }\n}\n\n/**\n * Error thrown when access to a resource is denied\n */\nexport class AccessDeniedError extends SubscribeDevError {\n constructor(message: string, requestId?: string) {\n super(message, 'ACCESS_DENIED', 403, undefined, requestId)\n this.name = 'AccessDeniedError'\n }\n}\n\n/**\n * Error thrown when a resource is not found\n */\nexport class NotFoundError extends SubscribeDevError {\n constructor(message: string, requestId?: string) {\n super(message, 'NOT_FOUND', 404, undefined, requestId)\n this.name = 'NotFoundError'\n }\n}\n\n/**\n * Error thrown for request validation failures\n */\nexport class ValidationError extends SubscribeDevError {\n constructor(message: string, details?: Record<string, any>, requestId?: string) {\n super(message, 'VALIDATION_ERROR', 400, details, requestId)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Error thrown when user is not subscribed (unsubscribed 402 error)\n */\nexport class UnsubscribedError extends SubscribeDevError {\n constructor(message: string, requestId?: string) {\n super(message, 'USER_UNSUBSCRIBED', 402, undefined, requestId)\n this.name = 'UnsubscribedError'\n }\n}","import PQueue from 'p-queue'\nimport pRetry from 'p-retry'\nimport { EventEmitter } from 'eventemitter3'\nimport type {\n SubscribeDevClientConfig,\n BalanceInfo,\n TransactionHistoryOptions,\n TransactionHistory,\n RateLimitInfo,\n Prediction,\n ProgressCallback,\n UserStorage,\n StorageOptions,\n SubscriptionStatus,\n MultimodalMessageContent,\n ChatMessage,\n ResponseFormat,\n SubscriptionPlansResponse,\n CheckoutSessionRequest,\n CheckoutSessionResponse,\n FreeSignupRequest,\n FreeSignupResponse,\n UsageLimits\n} from './types'\nimport {\n SubscribeDevError,\n InsufficientBalanceError,\n RateLimitError,\n AuthenticationError,\n AccessDeniedError,\n NotFoundError,\n ValidationError,\n UnsubscribedError\n} from './errors'\n\n/**\n * SubscribeDevClient - Drop-in replacement for Replicate.js with billing and rate limiting\n */\nexport class SubscribeDevClient extends EventEmitter {\n private readonly config: SubscribeDevClientConfig & {\n baseUrl: string\n timeout: number\n maxRetries: number\n debug: boolean\n }\n private readonly queue: PQueue\n private readonly fetch: typeof fetch\n\n constructor(config: SubscribeDevClientConfig) {\n super()\n \n // Set defaults\n this.config = {\n baseUrl: config.baseUrl || 'https://subscribedev.volterapp-dev.com',\n timeout: config.timeout || 300000, // 5 minutes\n maxRetries: config.maxRetries || 2,\n debug: config.debug || false,\n ...config\n }\n\n // Create request queue to handle rate limiting\n this.queue = new PQueue({\n concurrency: 10, // Max concurrent requests\n interval: 60000, // 1 minute\n intervalCap: 60 // Max requests per minute\n })\n\n // Use global fetch or polyfill - bind to preserve 'this' context for browsers\n this.fetch = globalThis.fetch?.bind(globalThis)\n if (!this.fetch) {\n throw new Error('fetch is not available. Please provide a fetch polyfill.')\n }\n\n this.debug('SubscribeDevClient initialized', { baseUrl: this.config.baseUrl })\n }\n\n get pricingUrl() {\n return `${this.config.baseUrl}/subscribe`\n }\n\n /**\n * Run a prediction (main method matching Replicate.js API)\n * Note: Now returns completed predictions directly - no polling needed\n */\n async run(\n model: string,\n options: {\n input: Record<string, any> // Can contain prompt OR messages array with multimodal content\n response_format?: ResponseFormat\n wait?: boolean // For compatibility - ignored since predictions complete synchronously\n }\n ): Promise<any> {\n const { input, response_format } = options\n\n this.debug('Starting prediction', { model, input, response_format })\n\n // Make direct API call and return output\n const requestPayload: any = {\n model,\n input: options.input\n }\n \n if (options.response_format) {\n requestPayload.response_format = options.response_format\n }\n \n const response = await this.makeRequest('POST', '/v1/run', requestPayload)\n\n this.debug('Prediction completed', { \n hasOutput: !!response.output \n })\n\n // Emit usage-changed event after successful run\n this.emit('usage-changed', { operation: 'run', model })\n\n // Return just the output from the API\n return response\n }\n\n /**\n * Create a new prediction\n */\n async createPrediction(\n model: string,\n options: { \n input: Record<string, any> // Supports multimodal messages array or simple prompt\n response_format?: ResponseFormat\n }\n ): Promise<Prediction> {\n return this.queue.add(async () => {\n return await pRetry(\n async () => {\n const requestPayload: any = {\n model,\n input: options.input\n }\n \n if (options.response_format) {\n requestPayload.response_format = options.response_format\n }\n \n const response = await this.makeRequest('POST', '/v1/run', requestPayload)\n\n // Emit usage-changed event after successful prediction creation\n this.emit('usage-changed', { operation: 'createPrediction', model })\n\n // API returns { output: ... }, create a synthetic prediction object\n const now = new Date().toISOString()\n return {\n id: `pred_${Math.random().toString(36).substring(2, 15)}`,\n created_at: now,\n started_at: now,\n completed_at: now,\n status: 'succeeded' as const,\n input: options.input,\n output: response.output,\n urls: {\n get: `${this.config.baseUrl}/v1/predictions/pred_${Math.random().toString(36).substring(2, 15)}`\n }\n }\n },\n {\n retries: this.config.maxRetries,\n onFailedAttempt: (error) => {\n this.debug('Prediction creation failed, retrying', { \n attempt: error.attemptNumber,\n error: error.message \n })\n },\n // @ts-ignore: Don't retry on UnsubscribedError\n shouldRetry: ((error: any) => {\n return !(error instanceof UnsubscribedError)\n }) as any,\n // Reduce retry delay to prevent timeouts\n factor: 1.5,\n minTimeout: 500,\n maxTimeout: 2000\n }\n )\n }) as Promise<Prediction>\n }\n\n /**\n * Get prediction status\n * @deprecated Since predictions now complete synchronously, this is mainly for historical lookups\n */\n async getPrediction(id: string): Promise<Prediction> {\n console.warn('[DEPRECATED] getPrediction() is deprecated. Predictions now complete synchronously in run().')\n return this.queue.add(async () => {\n const response = await this.makeRequest('GET', `/v1/predictions/${id}`)\n return this.transformResponse(response)\n }) as Promise<Prediction>\n }\n\n /**\n * Cancel a prediction\n */\n async cancelPrediction(id: string): Promise<Prediction> {\n return this.queue.add(async () => {\n const response = await this.makeRequest('POST', `/v1/predictions/${id}/cancel`)\n return this.transformResponse(response)\n }) as Promise<Prediction>\n }\n\n /**\n * Wait for prediction completion with optional progress callback\n * @deprecated Since predictions now complete synchronously, this method is no longer needed\n */\n async waitForPrediction(\n id: string,\n progressCallback?: ProgressCallback\n ): Promise<Prediction> {\n console.warn('[DEPRECATED] waitForPrediction() is deprecated. Predictions now complete synchronously in run().')\n this.debug('Waiting for prediction completion', { id })\n\n let attempts = 0\n const maxAttempts = 1800 // 30 minutes with 1s intervals\n \n while (attempts < maxAttempts) {\n const prediction = await this.getPrediction(id)\n \n if (progressCallback) {\n progressCallback(prediction)\n }\n\n // Check if prediction is complete\n if (['succeeded', 'failed', 'canceled'].includes(prediction.status)) {\n this.debug('Prediction completed', { id, status: prediction.status })\n return prediction\n }\n\n // Wait before next poll (exponential backoff up to 5s)\n const delay = Math.min(1000 + (attempts * 100), 5000)\n await new Promise(resolve => setTimeout(resolve, delay))\n attempts++\n }\n\n throw new SubscribeDevError(\n 'Prediction timeout - exceeded maximum wait time',\n 'PREDICTION_TIMEOUT',\n 408\n )\n }\n\n /**\n * Get account balance information\n */\n async getBalance(): Promise<BalanceInfo> {\n const response = await this.makeRequest('GET', '/v1/subscriptions/usage')\n const userBalance = response.credits?.userBalance\n return {\n allocatedCredits: userBalance?.allocatedCredits || 0,\n usedCredits: userBalance?.usedCredits || 0,\n remainingCredits: userBalance?.remainingCredits || 0\n }\n }\n\n /**\n * Get transaction history\n */\n async getTransactions(options: TransactionHistoryOptions = {}): Promise<TransactionHistory> {\n const params = new URLSearchParams()\n \n if (options.limit) params.set('limit', options.limit.toString())\n if (options.offset) params.set('offset', options.offset.toString())\n if (options.status) params.set('status', options.status)\n if (options.model) params.set('model', options.model)\n if (options.startDate) params.set('start_date', options.startDate)\n if (options.endDate) params.set('end_date', options.endDate)\n\n const url = `/v1/transactions${params.toString() ? '?' + params.toString() : ''}`\n return this.makeRequest('GET', url)\n }\n\n /**\n * Get rate limit information\n */\n async getRateLimits(): Promise<RateLimitInfo> {\n return this.makeRequest('GET', '/v1/rate-limits')\n }\n\n /**\n * Get user storage data using auth context\n */\n async getStorage(options: StorageOptions = {}): Promise<UserStorage> {\n const params = new URLSearchParams()\n \n if (options.appVersion) {\n params.set('appVersion', options.appVersion)\n }\n\n const url = `/v1/storage${params.toString() ? '?' + params.toString() : ''}`\n return this.makeRequest('GET', url)\n }\n\n /**\n * Update user storage data using auth context\n */\n async setStorage(\n sessionData: Record<string, any>, \n options: StorageOptions = {}\n ): Promise<UserStorage> {\n const params = new URLSearchParams()\n \n if (options.appVersion) {\n params.set('appVersion', options.appVersion)\n }\n\n const url = `/v1/storage${params.toString() ? '?' + params.toString() : ''}`\n return this.makeRequest('PUT', url, { sessionData })\n }\n\n /**\n * Delete user storage data using auth context\n */\n async deleteStorage(options: StorageOptions = {}): Promise<void> {\n const params = new URLSearchParams()\n \n if (options.appVersion) {\n params.set('appVersion', options.appVersion)\n }\n\n const url = `/v1/storage${params.toString() ? '?' + params.toString() : ''}`\n await this.makeRequest('DELETE', url)\n }\n\n /**\n * Browser convenience method: Persist session data locally and sync to server\n * Automatically saves the entire session object to localStorage and server\n */\n async persistSessionData(options: StorageOptions = {}): Promise<UserStorage> {\n if (typeof globalThis !== 'undefined' && typeof (globalThis as any).localStorage === 'undefined') {\n throw new Error('persistSessionData is only available in browser environments')\n }\n\n // Get current session data from server\n const serverData = await this.getStorage(options)\n \n // Store in localStorage for offline access\n const storageKey = `subscribeDev_session_${this.config.apiKey.slice(-8)}`\n ;(globalThis as any).localStorage.setItem(storageKey, JSON.stringify(serverData.sessionData))\n \n return serverData\n }\n\n /**\n * Browser convenience method: Get session data from server and update localStorage\n * Always fetches from server to ensure data is synchronized\n */\n async getSessionData(options: StorageOptions = {}): Promise<Record<string, any>> {\n // Always fetch from server to ensure synchronization\n const serverData = await this.getStorage(options)\n const sessionData = serverData.sessionData || {}\n \n // Update localStorage cache if in browser environment\n if (typeof globalThis !== 'undefined' && typeof (globalThis as any).localStorage !== 'undefined') {\n const storageKey = `subscribeDev_session_${this.config.apiKey.slice(-8)}`\n ;(globalThis as any).localStorage.setItem(storageKey, JSON.stringify(sessionData))\n }\n \n return sessionData\n }\n\n /**\n * Get user's subscription status using userKey authentication\n * Requires userKey to be provided in client configuration\n */\n async getSubscriptionStatus(): Promise<SubscriptionStatus> {\n console.log('[SubscribeDevClient] getSubscriptionStatus called')\n \n if (!this.config.userKey) {\n console.log('[SubscribeDevClient] No userKey provided, throwing ValidationError')\n throw new ValidationError(\n 'User key is required to get subscription status. Provide userKey in client configuration.',\n { method: 'getSubscriptionStatus' }\n )\n }\n\n console.log('[SubscribeDevClient] Making request to /v1/subscriptions/plan with userKey:', this.config.userKey.substring(0, 10) + '...')\n\n try {\n const response = await this.makeRequest('GET', '/v1/subscriptions/plan')\n console.log('[SubscribeDevClient] Received response:', {\n hasUserPlan: !!response.userPlan,\n planId: response.userPlan?.planId,\n status: response.userPlan?.status,\n hasPlanDetails: !!response.userPlan?.plan\n })\n \n const userPlan = response.userPlan\n \n // Handle case where user has no subscription (status: 'none')\n if (!userPlan || userPlan.status === 'none' || !userPlan.plan) {\n console.log('[SubscribeDevClient] User has no active subscription, returning none status')\n return {\n hasActiveSubscription: false,\n status: userPlan?.status || 'none'\n }\n }\n\n const result = {\n hasActiveSubscription: userPlan.status === 'active',\n plan: userPlan.plan ? {\n id: userPlan.plan.id || userPlan.planId,\n name: userPlan.plan.name,\n price: userPlan.plan.price,\n tokenLimit: userPlan.plan.tokenLimit || userPlan.plan.token_limit,\n subtitle: userPlan.plan.subtitle,\n description: userPlan.plan.description,\n features: userPlan.plan.features\n } : undefined,\n status: userPlan.status,\n startedAt: userPlan.startedAt,\n endsAt: userPlan.endsAt\n }\n\n console.log('[SubscribeDevClient] Returning subscription status:', {\n hasActiveSubscription: result.hasActiveSubscription,\n status: result.status,\n planName: result.plan?.name\n })\n\n return result\n } catch (error: any) {\n console.log('[SubscribeDevClient] Error in getSubscriptionStatus:', {\n errorType: error.constructor.name,\n message: error.message\n })\n \n // Re-throw any genuine errors\n throw error\n }\n }\n\n /**\n * Get available subscription plans for the project\n */\n async getSubscriptionPlans(): Promise<SubscriptionPlansResponse> {\n return this.makeRequest('GET', '/v1/subscriptions/status')\n }\n\n /**\n * Create a checkout session for subscription payment\n * Requires userKey to be provided in client configuration\n */\n async createCheckoutSession(request: CheckoutSessionRequest): Promise<CheckoutSessionResponse> {\n if (!this.config.userKey) {\n throw new ValidationError(\n 'User key is required to create checkout session. Provide userKey in client configuration.',\n { method: 'createCheckoutSession' }\n )\n }\n return this.makeRequest('POST', '/v1/subscriptions/checkout', request)\n }\n\n /**\n * Sign up for the free plan\n * Requires userKey to be provided in client configuration\n */\n async signupForFree(request: FreeSignupRequest): Promise<FreeSignupResponse> {\n if (!this.config.userKey) {\n throw new ValidationError(\n 'User key is required to sign up for free plan. Provide userKey in client configuration.',\n { method: 'signupForFree' }\n )\n }\n return this.makeRequest('POST', '/v1/subscriptions/free-signup', request)\n }\n\n /**\n * Cancel user subscription\n * Requires userKey to be provided in client configuration\n */\n async cancelSubscription(userId: string, cancelAtPeriodEnd: boolean = true): Promise<{ success: boolean; cancelledAt: string }> {\n if (!this.config.userKey) {\n throw new ValidationError(\n 'User key is required to cancel subscription. Provide userKey in client configuration.',\n { method: 'cancelSubscription' }\n )\n }\n return this.makeRequest('POST', `/v1/subscriptions/cancel/${userId}`, { cancelAtPeriodEnd })\n }\n\n /**\n * Get comprehensive usage limits and current consumption\n * Requires userKey to be provided in client configuration\n */\n async getUsageLimits(): Promise<UsageLimits> {\n if (!this.config.userKey) {\n throw new ValidationError(\n 'User key is required to get usage limits. Provide userKey in client configuration.',\n { method: 'getUsageLimits' }\n )\n }\n return this.makeRequest('GET', '/v1/subscriptions/usage')\n }\n\n /**\n * Get comprehensive usage information including credits, rate limits, and consumption\n * Alias for getUsageLimits() - Requires userKey to be provided in client configuration\n */\n async getUsage(): Promise<UsageLimits> {\n return this.getUsageLimits()\n }\n\n /**\n * Make authenticated HTTP request to SubscribeDev API\n */\n private async makeRequest(\n method: string,\n path: string,\n body?: any\n ): Promise<any> {\n const url = `${this.config.baseUrl}${path}`\n \n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `@subscribe.dev/client/0.1.0`\n }\n\n // Add user token if provided\n if (this.config.userKey) {\n headers['X-User-Token'] = this.config.userKey\n }\n\n const requestOptions: RequestInit = {\n method,\n headers,\n signal: AbortSignal.timeout(this.config.timeout)\n }\n\n if (body && ['POST', 'PUT', 'PATCH'].includes(method)) {\n requestOptions.body = JSON.stringify(body)\n }\n\n this.debug('Making request', { method, url, headers: { ...headers, Authorization: '[redacted]' } })\n\n const response = await this.fetch(url, requestOptions)\n \n // Handle response\n const responseText = await response.text()\n let responseData: any\n \n try {\n responseData = responseText ? JSON.parse(responseText) : null\n } catch {\n responseData = { error: { message: responseText } }\n }\n\n if (!response.ok) {\n this.handleErrorResponse(response, responseData)\n }\n\n this.debug('Request successful', { status: response.status, data: responseData })\n return responseData\n }\n\n /**\n * Handle error responses and throw appropriate error types\n */\n private handleErrorResponse(response: Response, data: any): never {\n const requestId = response.headers.get('x-request-id') || undefined\n const error = data?.error || {}\n const message = error.message || `HTTP ${response.status}`\n\n switch (response.status) {\n case 400:\n throw new ValidationError(message, error.details, requestId)\n case 401:\n throw new AuthenticationError(message, requestId)\n case 402:\n // Check if this is an unsubscribed error vs insufficient balance\n if (error.code === 'USER_UNSUBSCRIBED' || message.toLowerCase().includes('unsubscribed') || message.toLowerCase().includes('subscription')) {\n throw new UnsubscribedError(message, requestId)\n }\n throw new InsufficientBalanceError(\n message,\n error.details?.remainingCredits,\n error.details?.requiredCredits,\n requestId\n )\n case 403:\n throw new AccessDeniedError(message, requestId)\n case 404:\n throw new NotFoundError(message, requestId)\n case 429:\n throw new RateLimitError(\n message,\n error.details?.resetTime,\n error.details?.retryAfter,\n requestId\n )\n default:\n throw new SubscribeDevError(\n message,\n error.code || 'UNKNOWN_ERROR',\n response.status,\n error.details,\n requestId\n )\n }\n }\n\n /**\n * Transform API response to match Replicate.js format\n */\n private transformResponse(response: any): Prediction {\n return {\n id: response.id,\n version: response.version,\n created_at: response.created_at,\n started_at: response.started_at,\n completed_at: response.completed_at,\n status: response.status,\n input: response.input,\n output: response.output,\n error: response.error,\n logs: response.logs,\n metrics: response.metrics,\n // URLs are no longer included in completed predictions (use output field instead)\n urls: response.urls || undefined\n }\n }\n\n /**\n * Debug logging\n */\n private debug(message: string, data?: any) {\n if (this.config.debug) {\n console.log(`[SubscribeDevClient] ${message}`, data || '')\n }\n }\n\n\n /**\n * Static method to create client (for convenience)\n */\n static create(config: SubscribeDevClientConfig): SubscribeDevClient {\n return new SubscribeDevClient(config)\n }\n}"],"names":["has","prefix","Events","EE","fn","context","once","addListener","emitter","event","listener","evt","clearEvent","EventEmitter","names","events","name","handlers","i","l","ee","listeners","a1","a2","a3","a4","a5","len","args","length","j","module","SubscribeDevError","message","code","statusCode","details","requestId","InsufficientBalanceError","remainingCredits","requiredCredits","RateLimitError","resetTime","retryAfter","AuthenticationError","AccessDeniedError","NotFoundError","ValidationError","UnsubscribedError","SubscribeDevClient","config","PQueue","model","options","input","response_format","requestPayload","response","pRetry","now","error","id","progressCallback","attempts","maxAttempts","prediction","delay","resolve","userBalance","params","url","sessionData","serverData","storageKey","userPlan","result","request","userId","cancelAtPeriodEnd","method","path","body","headers","requestOptions","responseText","responseData","data"],"mappings":"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","x_google_ignoreList":[0]}