smspva-sdk 0.1.0-alpha.1 → 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,27 +1,36 @@
1
- # SMSPVA JavaScript / TypeScript SDK
1
+ # SMSPVA JavaScript and TypeScript SDK
2
2
 
3
- [![CI](https://github.com/SMSPVA/smspva-js/actions/workflows/ci.yml/badge.svg)](https://github.com/SMSPVA/smspva-js/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) ![Status: alpha](https://img.shields.io/badge/status-alpha-orange.svg)
3
+ [![CI](https://github.com/SMSPVA/smspva-js/actions/workflows/ci.yml/badge.svg)](https://github.com/SMSPVA/smspva-js/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/SMSPVA/smspva-js/blob/main/LICENSE) ![Status: alpha](https://img.shields.io/badge/status-alpha-orange.svg)
4
4
 
5
- Node.js 22.16+, ESM and CommonJS, with TypeScript declarations. Covers all 56 methods: Activation V2 (20), Rental (22) and Private Email (14). Alternative API is excluded. This is an alpha release. Use the explicit version or the `alpha` tag when installing.
5
+ Official JavaScript and TypeScript client for [SMSPVA](https://smspva.com/), a service for receiving verification SMS, renting phone numbers and renting private email addresses. Use the asynchronous client in Node.js applications, with ESM and CommonJS builds and TypeScript declarations included.
6
+
7
+ Requires Node.js 22.16 or later. Uses native fetch and has no runtime dependencies. This package is an alpha release.
6
8
 
7
9
  ## Installation
8
10
 
9
11
  ```sh
10
12
  npm install smspva-sdk@alpha
11
- # Or pin the first alpha:
12
- npm install smspva-sdk@0.1.0-alpha.1
13
+ # Or pin this release:
14
+ npm install smspva-sdk@0.1.0-alpha.2
13
15
  ```
14
16
 
15
- Build and install from source:
17
+ ## API coverage
16
18
 
17
- ```sh
18
- git clone https://github.com/SMSPVA/smspva-js.git
19
- cd smspva-js
20
- npm ci
21
- npm run build
22
- # In the application that will use the SDK:
23
- npm install /absolute/path/to/smspva-js
24
- ```
19
+ The SDK provides 56 methods across three APIs:
20
+
21
+ | API | Methods | Use it to |
22
+ | --- | --- | --- |
23
+ | Activation V2 | 20 | Request a number, check availability and receive verification SMS. |
24
+ | Rental | 22 | Manage [phone number rentals](https://smspva.com/rent) and retrieve messages for existing orders. |
25
+ | Private Email | 14 | Check providers and services, manage [private email rentals](https://smspva.com/rent-mail.html), and read incoming messages. |
26
+
27
+ Country, service and provider lists come from the live API. Availability and prices can change. Alternative API is not included.
28
+
29
+ ## Quickstart
30
+
31
+ [Sign in to your SMSPVA account](https://smspva.com/signin.html) and open **Profile and ApiKey** from the account menu. Set the key as the **SMSPVA_API_KEY** environment variable before running a protected request. Keep it on your server and out of source control.
32
+
33
+ The examples below read your balance and reference data; they do not create an order.
25
34
 
26
35
  ```js
27
36
  import { SMSPVA } from 'smspva-sdk';
@@ -105,13 +114,13 @@ The default request timeout is 30 seconds, covering fetch and body reading. Set
105
114
 
106
115
  All generated request and response types are exported from the package. The complete method index is in `METHODS.md`. The generated source is committed. `npm run build` compiles it without needing the documentation source.
107
116
 
108
- ## License
109
-
110
- MIT. See [LICENSE](LICENSE).
111
-
112
117
  ## Development
113
118
 
119
+ To build from source and run the local checks:
120
+
114
121
  ```sh
122
+ git clone https://github.com/SMSPVA/smspva-js.git
123
+ cd smspva-js
115
124
  npm ci
116
125
  npm run build
117
126
  npm test
@@ -121,10 +130,12 @@ npm pack
121
130
 
122
131
  Tests use synthetic fixtures and local HTTP servers; they do not buy numbers or call the production API.
123
132
 
124
- ## Documentation
133
+ ## Documentation and support
125
134
 
126
- [API documentation](https://docs.smspva.com)
135
+ Read the [SMSPVA API documentation](https://docs.smspva.com/) for endpoint parameters, response codes and the activation, rental and email workflows. The [method index](https://github.com/SMSPVA/smspva-js/blob/main/METHODS.md) maps every SDK method to its API operation.
127
136
 
128
- The new documentation is being prepared in English, Spanish and Chinese. Localized links will be added when it is deployed.
137
+ For account, billing or service questions, visit the [SMSPVA help center](https://smspva.com/help.html). Report SDK bugs through this repository's issues, without API keys or private message content.
138
+
139
+ ## License
129
140
 
130
- The SDK covers Activation V2, Rental and Private Email. Alternative API is not supported.
141
+ MIT. See [LICENSE](https://github.com/SMSPVA/smspva-js/blob/main/LICENSE).
@@ -1 +1 @@
1
- {"version":3,"file":"polling.cjs","sourceRoot":"","sources":["../../.checks/cjs/polling.cts"],"names":[],"mappings":";;;;;AAAA,6CAAoF;AAIpF,mBAA0B,KAAc;IACtC,MAAM,CAAC,GAAC,KAA+B,CAAC;IACxC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAG,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,KAAG,sBAAsB,CAAC;AAC7E,CAAC;AACD,mBAA0B,KAAc,IAA2B,OAAO,CAAC,CAAC,KAAK,IAAK,KAAsB,CAAC,MAAM,KAAG,CAAC,CAAC,CAAC,CAAC;AAE1H,SAAS,KAAK,CAAC,EAAU,EAAE,MAAoB;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAC,MAAM,EAAC,EAAE;QACnC,MAAM,IAAI,GAAC,GAAE,EAAE,GAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAC,IAAI,CAAC,CAAC,CAAA,MAAM,CAAC,IAAI,2BAAc,CAAC,YAAY,EAAC,uBAAuB,EAAC,IAAI,EAAC,SAAS,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC;QAChK,MAAM,KAAK,GAAC,UAAU,CAAC,GAAE,EAAE,GAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAC,IAAI,CAAC,CAAC,CAAA,OAAO,EAAE,CAAC,CAAA,CAAC,EAAC,EAAE,CAAC,CAAC;QACtF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,CAAC;QACnD,IAAG,MAAM,EAAE,OAAO;YAAC,IAAI,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AACM,KAAK,qBAAqB,SAAoB,EAAE,OAA0B;IAC/E,MAAM,QAAQ,GAAC,OAAO,CAAC,UAAU,IAAE,IAAI,CAAC;IACxC,IAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAE,QAAQ,GAAC,IAAI;QAAC,MAAM,IAAI,4BAAe,CAAC,iDAAiD,CAAC,CAAC;IAC1H,IAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;QAAC,MAAM,IAAI,4BAAe,CAAC,4DAA4D,CAAC,CAAC;IAC/H,MAAM,QAAQ,GAAC,WAAW,CAAC,GAAG,EAAE,GAAC,CAAC,OAAO,CAAC,SAAS,GAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAChE,OAAM,WAAW,CAAC,GAAG,EAAE,GAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,SAAS,GAAC,QAAQ,GAAC,WAAW,CAAC,GAAG,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAC,MAAM,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAC,EAAC,OAAO,EAAC,OAAO,CAAC,OAAO,EAAC,UAAU,EAAC,OAAO,CAAC,UAAU,EAAC,EAAC,EAAC,GAAG,OAAO,EAAC,SAAS,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,IAAE,SAAS,CAAC,SAAS,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,CAAC;QACpN,IAAG,CAAC,SAAS,CAAC,MAAM,CAAC;YAAC,OAAO,MAAkE,CAAC;QAChG,MAAM,IAAI,GAAC,QAAQ,GAAC,WAAW,CAAC,GAAG,EAAE,CAAC;QACtC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAC,IAAI,CAAC,CAAC,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChE,IAAG,IAAI,IAAE,QAAQ;YAAC,MAAM,IAAI,gCAAmB,EAAE,CAAC;IACpD,CAAC;IACD,MAAM,IAAI,gCAAmB,EAAE,CAAC;AAClC,CAAC","sourcesContent":["import { PollingTimeoutError, TransportError, ValidationError } from './errors.cjs';\r\nimport { Transport, type RequestOptions } from './transport.cjs';\r\nimport type { ActivationPending, ActivationReceiveSmsResponse, EmailNoStock } from './types.cjs';\r\n\r\nexport function isPending(value: unknown): value is ActivationPending {\r\n const v=value as ActivationPending|null;\r\n return !!v && v.statusCode===202 && v.error?.type==='SMS_NOT_YET_RECEIVED';\r\n}\r\nexport function isNoStock(value: unknown): value is EmailNoStock { return !!value && (value as EmailNoStock).status===2; }\r\nexport interface WaitForSmsOptions extends RequestOptions { orderid: number; expiresAt: number; intervalMs?: number; partnerkey?: string }\r\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\r\n return new Promise((resolve,reject)=>{\r\n const stop=()=>{clearTimeout(timer);signal?.removeEventListener('abort',stop);reject(new TransportError('activation','activation.receiveSms',true,'aborted'));};\r\n const timer=setTimeout(()=>{signal?.removeEventListener('abort',stop);resolve();},ms);\r\n signal?.addEventListener('abort',stop,{once:true});\r\n if(signal?.aborted)stop();\r\n });\r\n}\r\nexport async function waitForSms(transport: Transport, options: WaitForSmsOptions): Promise<Exclude<ActivationReceiveSmsResponse, ActivationPending>> {\r\n const interval=options.intervalMs??5000;\r\n if(!Number.isFinite(interval)||interval<5000)throw new ValidationError('intervalMs must be at least 5000 in this helper');\r\n if(!Number.isFinite(options.expiresAt))throw new ValidationError('expiresAt must be a finite epoch timestamp in milliseconds');\r\n const deadline=performance.now()+(options.expiresAt-Date.now());\r\n while(performance.now()<deadline) {\r\n const remaining=deadline-performance.now();\r\n const result=await transport.request('activation.receiveSms',{orderid:options.orderid,partnerkey:options.partnerkey},{...options,timeoutMs:Math.max(1,Math.min(options.timeoutMs??transport.timeoutMs,remaining))});\r\n if(!isPending(result))return result as Exclude<ActivationReceiveSmsResponse, ActivationPending>;\r\n const left=deadline-performance.now();\r\n await sleep(Math.max(0,Math.min(interval,left)),options.signal);\r\n if(left<=interval)throw new PollingTimeoutError();\r\n }\r\n throw new PollingTimeoutError();\r\n}\r\n"]}
1
+ {"version":3,"file":"polling.cjs","sourceRoot":"","sources":["../../.checks/cjs/polling.cts"],"names":[],"mappings":"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","sourcesContent":["import { PollingTimeoutError, TransportError, ValidationError } from './errors.cjs';\nimport { Transport, type RequestOptions } from './transport.cjs';\nimport type { ActivationPending, ActivationReceiveSmsResponse, EmailNoStock } from './types.cjs';\n\nexport function isPending(value: unknown): value is ActivationPending {\n const v=value as ActivationPending|null;\n return !!v && v.statusCode===202 && v.error?.type==='SMS_NOT_YET_RECEIVED';\n}\nexport function isNoStock(value: unknown): value is EmailNoStock { return !!value && (value as EmailNoStock).status===2; }\nexport interface WaitForSmsOptions extends RequestOptions { orderid: number; expiresAt: number; intervalMs?: number; partnerkey?: string }\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve,reject)=>{\n const stop=()=>{clearTimeout(timer);signal?.removeEventListener('abort',stop);reject(new TransportError('activation','activation.receiveSms',true,'aborted'));};\n const timer=setTimeout(()=>{signal?.removeEventListener('abort',stop);resolve();},ms);\n signal?.addEventListener('abort',stop,{once:true});\n if(signal?.aborted)stop();\n });\n}\nexport async function waitForSms(transport: Transport, options: WaitForSmsOptions): Promise<Exclude<ActivationReceiveSmsResponse, ActivationPending>> {\n const interval=options.intervalMs??5000;\n if(!Number.isFinite(interval)||interval<5000)throw new ValidationError('intervalMs must be at least 5000 in this helper');\n if(!Number.isFinite(options.expiresAt))throw new ValidationError('expiresAt must be a finite epoch timestamp in milliseconds');\n const deadline=performance.now()+(options.expiresAt-Date.now());\n while(performance.now()<deadline) {\n const remaining=deadline-performance.now();\n const result=await transport.request('activation.receiveSms',{orderid:options.orderid,partnerkey:options.partnerkey},{...options,timeoutMs:Math.max(1,Math.min(options.timeoutMs??transport.timeoutMs,remaining))});\n if(!isPending(result))return result as Exclude<ActivationReceiveSmsResponse, ActivationPending>;\n const left=deadline-performance.now();\n await sleep(Math.max(0,Math.min(interval,left)),options.signal);\n if(left<=interval)throw new PollingTimeoutError();\n }\n throw new PollingTimeoutError();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transport.cjs","sourceRoot":"","sources":["../../.checks/cjs/transport.cts"],"names":[],"mappings":"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","sourcesContent":["import { operations } from './contracts.cjs';\r\nimport { ApiError, ProtocolError, RequestTimeoutError, TransportError, ValidationError, type Family } from './errors.cjs';\r\n\r\nexport interface Schema { type?: string; enum?: unknown[]; minimum?: number; maximum?: number; minLength?: number; maxLength?: number; pattern?: string; [key: string]: unknown }\r\nexport interface Operation {\r\n family: Family; jsName: string; pyName: string; slug: string; path: string; method: string; baseUrl: string;\r\n auth: 'required' | 'optional' | 'none'; action?: string; stateful: boolean; pending: boolean; noStock: boolean;\r\n params: Array<{ name: string; in: string; required: boolean; omitEmpty?: boolean; schema: Schema }>;\r\n}\r\nexport interface ClientOptions {\r\n apiKey?: string; timeoutMs?: number; activationBaseUrl?: string; rentalBaseUrl?: string; emailBaseUrl?: string;\r\n /** Injectable HTTP transport for tests. Account requests belong on your server. */\r\n fetch?: typeof globalThis.fetch;\r\n}\r\nexport interface RequestOptions { timeoutMs?: number; signal?: AbortSignal; useApiKey?: boolean }\r\nexport function positiveTimeout(value: number): number {\r\n if (!Number.isFinite(value) || value <= 0 || value > 2_147_483_647) throw new ValidationError('timeoutMs must be finite, positive and at most 2147483647');\r\n return value;\r\n}\r\nfunction baseUrl(value: string): string {\r\n let url: URL;\r\n try { url = new URL(value); } catch { throw new ValidationError('Invalid SDK base URL'); }\r\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new ValidationError('Base URL must use HTTP(S) without credentials, query or fragment');\r\n return url.href.replace(/\\/$/, '');\r\n}\r\nexport class Transport {\r\n readonly timeoutMs: number;\r\n #apiKey?: string;\r\n #fetch: typeof globalThis.fetch;\r\n #base: Partial<Record<Family, string>>;\r\n constructor(options: ClientOptions) {\r\n if (options.apiKey !== undefined && (typeof options.apiKey !== 'string' || !options.apiKey || /[\\r\\n]/.test(options.apiKey))) throw new ValidationError('apiKey must be a non-empty string without line breaks');\r\n this.#apiKey = options.apiKey;\r\n this.timeoutMs = positiveTimeout(options.timeoutMs ?? 30_000);\r\n this.#fetch = options.fetch ?? globalThis.fetch;\r\n if (!this.#fetch) throw new ValidationError('A fetch implementation is required');\r\n this.#base = {};\r\n for (const family of ['activation','rental','email'] as const) {\r\n const value = options[`${family}BaseUrl`];\r\n if (value !== undefined) this.#base[family] = baseUrl(value);\r\n }\r\n }\r\n async request(key: string, input: object, options: RequestOptions = {}): Promise<Record<string, unknown>> {\r\n const op = operations[key];\r\n if (!op) throw new ValidationError('Unknown SDK operation');\r\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new ValidationError('Parameters must be an object');\r\n const params = input as Record<string, unknown>;\r\n const allowed = new Set(op.params.map(p => p.name));\r\n if (Object.keys(params).some(name => !allowed.has(name))) throw new ValidationError('Unexpected request parameter');\r\n const query = new URLSearchParams();\r\n const headers: Record<string,string> = { Accept: 'application/json' };\r\n let path = op.path;\r\n if (op.action) query.set('method', op.action);\r\n for (const p of op.params) {\r\n const value = params[p.name];\r\n if (value === undefined || value === null || (p.omitEmpty && value === '')) {\r\n if (p.required) throw new ValidationError(`Missing required parameter: ${p.name}`);\r\n continue;\r\n }\r\n const s=p.schema;\r\n if ((s.type==='integer' && (typeof value!=='number' || !Number.isSafeInteger(value))) ||\r\n (s.type==='number' && (typeof value!=='number' || !Number.isFinite(value))) ||\r\n (s.type==='string' && typeof value!=='string') || (s.type==='boolean' && typeof value!=='boolean')) throw new ValidationError(`Invalid type for parameter: ${p.name}`);\r\n if ((s.enum && !s.enum.includes(value)) || (typeof value==='number' && ((s.minimum!==undefined && value<s.minimum)||(s.maximum!==undefined && value>s.maximum))) ||\r\n (typeof value==='string' && ((s.minLength!==undefined && value.length<s.minLength)||(s.maxLength!==undefined && value.length>s.maxLength)||(s.pattern && !new RegExp(s.pattern).test(value))))) throw new ValidationError(`Invalid value for parameter: ${p.name}`);\r\n const text=String(value);\r\n if (p.in==='path') { if(text==='.'||text==='..')throw new ValidationError(`Invalid path parameter: ${p.name}`); path=path.replace('{'+p.name+'}', encodeURIComponent(text)); }\r\n else if (p.in==='header') { if(/[\\r\\n]/.test(text))throw new ValidationError(`Invalid header: ${p.name}`); headers[p.name]=text; }\r\n else query.set(p.name,text);\r\n }\r\n if (op.auth==='required' && !this.#apiKey) throw new ValidationError('Set apiKey for this operation');\r\n if (this.#apiKey && op.auth!=='none' && (op.auth==='required' || options.useApiKey!==false)) {\r\n if (op.family==='activation') headers.apikey=this.#apiKey; else query.set('apikey',this.#apiKey);\r\n }\r\n const url=(this.#base[op.family]??baseUrl(op.baseUrl))+path+(query.size?'?'+query:'');\r\n const timeout=positiveTimeout(options.timeoutMs??this.timeoutMs);\r\n const controller=new AbortController();\r\n let timedOut=false;\r\n const abort=()=>controller.abort();\r\n options.signal?.addEventListener('abort',abort,{once:true});\r\n if(options.signal?.aborted) controller.abort();\r\n const timer=setTimeout(()=>{timedOut=true;controller.abort();},timeout);\r\n let response: Response, text: string;\r\n try {\r\n if (controller.signal.aborted) throw new Error('Aborted');\r\n response=await this.#fetch(url,{method:op.method,headers,signal:controller.signal,redirect:'manual',credentials:'omit'});\r\n text=await response.text();\r\n } catch {\r\n if(timedOut)throw new RequestTimeoutError(op.family,key,op.stateful,'timeout');\r\n throw new TransportError(op.family,key,op.stateful,options.signal?.aborted?'aborted':'network');\r\n } finally { clearTimeout(timer);options.signal?.removeEventListener('abort',abort); }\r\n let body: unknown;\r\n try { body=JSON.parse(text); } catch { throw new ProtocolError(op.family,key,response.status); }\r\n if(!body || typeof body!=='object' || Array.isArray(body))throw new ProtocolError(op.family,key,response.status);\r\n const result=body as Record<string,unknown>;\r\n const error=result.error && typeof result.error==='object' ? result.error as Record<string,unknown> : {};\r\n const status=op.family==='activation'?result.statusCode:result.status;\r\n const code=typeof error.type==='string'?error.type:typeof result.errorid==='number'?result.errorid:typeof status==='number'?status:response.status;\r\n if (!response.ok) throw new ApiError(op.family,key,response.status,code,result);\r\n if (typeof status!=='number' || !Number.isInteger(status))throw new ProtocolError(op.family,key,response.status);\r\n if (op.pending && response.status===202 && status===202 && error.type==='SMS_NOT_YET_RECEIVED') return result;\r\n if (op.noStock && response.status===200 && status===2) return result;\r\n if (op.family==='activation' ? (status!==200 || !!result.error) : status!==1) throw new ApiError(op.family,key,response.status,code,result);\r\n return result;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"transport.cjs","sourceRoot":"","sources":["../../.checks/cjs/transport.cts"],"names":[],"mappings":"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","sourcesContent":["import { operations } from './contracts.cjs';\nimport { ApiError, ProtocolError, RequestTimeoutError, TransportError, ValidationError, type Family } from './errors.cjs';\n\nexport interface Schema { type?: string; enum?: unknown[]; minimum?: number; maximum?: number; minLength?: number; maxLength?: number; pattern?: string; [key: string]: unknown }\nexport interface Operation {\n family: Family; jsName: string; pyName: string; slug: string; path: string; method: string; baseUrl: string;\n auth: 'required' | 'optional' | 'none'; action?: string; stateful: boolean; pending: boolean; noStock: boolean;\n params: Array<{ name: string; in: string; required: boolean; omitEmpty?: boolean; schema: Schema }>;\n}\nexport interface ClientOptions {\n apiKey?: string; timeoutMs?: number; activationBaseUrl?: string; rentalBaseUrl?: string; emailBaseUrl?: string;\n /** Injectable HTTP transport for tests. Account requests belong on your server. */\n fetch?: typeof globalThis.fetch;\n}\nexport interface RequestOptions { timeoutMs?: number; signal?: AbortSignal; useApiKey?: boolean }\nexport function positiveTimeout(value: number): number {\n if (!Number.isFinite(value) || value <= 0 || value > 2_147_483_647) throw new ValidationError('timeoutMs must be finite, positive and at most 2147483647');\n return value;\n}\nfunction baseUrl(value: string): string {\n let url: URL;\n try { url = new URL(value); } catch { throw new ValidationError('Invalid SDK base URL'); }\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new ValidationError('Base URL must use HTTP(S) without credentials, query or fragment');\n return url.href.replace(/\\/$/, '');\n}\nexport class Transport {\n readonly timeoutMs: number;\n #apiKey?: string;\n #fetch: typeof globalThis.fetch;\n #base: Partial<Record<Family, string>>;\n constructor(options: ClientOptions) {\n if (options.apiKey !== undefined && (typeof options.apiKey !== 'string' || !options.apiKey || /[\\r\\n]/.test(options.apiKey))) throw new ValidationError('apiKey must be a non-empty string without line breaks');\n this.#apiKey = options.apiKey;\n this.timeoutMs = positiveTimeout(options.timeoutMs ?? 30_000);\n this.#fetch = options.fetch ?? globalThis.fetch;\n if (!this.#fetch) throw new ValidationError('A fetch implementation is required');\n this.#base = {};\n for (const family of ['activation','rental','email'] as const) {\n const value = options[`${family}BaseUrl`];\n if (value !== undefined) this.#base[family] = baseUrl(value);\n }\n }\n async request(key: string, input: object, options: RequestOptions = {}): Promise<Record<string, unknown>> {\n const op = operations[key];\n if (!op) throw new ValidationError('Unknown SDK operation');\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new ValidationError('Parameters must be an object');\n const params = input as Record<string, unknown>;\n const allowed = new Set(op.params.map(p => p.name));\n if (Object.keys(params).some(name => !allowed.has(name))) throw new ValidationError('Unexpected request parameter');\n const query = new URLSearchParams();\n const headers: Record<string,string> = { Accept: 'application/json' };\n let path = op.path;\n if (op.action) query.set('method', op.action);\n for (const p of op.params) {\n const value = params[p.name];\n if (value === undefined || value === null || (p.omitEmpty && value === '')) {\n if (p.required) throw new ValidationError(`Missing required parameter: ${p.name}`);\n continue;\n }\n const s=p.schema;\n if ((s.type==='integer' && (typeof value!=='number' || !Number.isSafeInteger(value))) ||\n (s.type==='number' && (typeof value!=='number' || !Number.isFinite(value))) ||\n (s.type==='string' && typeof value!=='string') || (s.type==='boolean' && typeof value!=='boolean')) throw new ValidationError(`Invalid type for parameter: ${p.name}`);\n if ((s.enum && !s.enum.includes(value)) || (typeof value==='number' && ((s.minimum!==undefined && value<s.minimum)||(s.maximum!==undefined && value>s.maximum))) ||\n (typeof value==='string' && ((s.minLength!==undefined && value.length<s.minLength)||(s.maxLength!==undefined && value.length>s.maxLength)||(s.pattern && !new RegExp(s.pattern).test(value))))) throw new ValidationError(`Invalid value for parameter: ${p.name}`);\n const text=String(value);\n if (p.in==='path') { if(text==='.'||text==='..')throw new ValidationError(`Invalid path parameter: ${p.name}`); path=path.replace('{'+p.name+'}', encodeURIComponent(text)); }\n else if (p.in==='header') { if(/[\\r\\n]/.test(text))throw new ValidationError(`Invalid header: ${p.name}`); headers[p.name]=text; }\n else query.set(p.name,text);\n }\n if (op.auth==='required' && !this.#apiKey) throw new ValidationError('Set apiKey for this operation');\n if (this.#apiKey && op.auth!=='none' && (op.auth==='required' || options.useApiKey!==false)) {\n if (op.family==='activation') headers.apikey=this.#apiKey; else query.set('apikey',this.#apiKey);\n }\n const url=(this.#base[op.family]??baseUrl(op.baseUrl))+path+(query.size?'?'+query:'');\n const timeout=positiveTimeout(options.timeoutMs??this.timeoutMs);\n const controller=new AbortController();\n let timedOut=false;\n const abort=()=>controller.abort();\n options.signal?.addEventListener('abort',abort,{once:true});\n if(options.signal?.aborted) controller.abort();\n const timer=setTimeout(()=>{timedOut=true;controller.abort();},timeout);\n let response: Response, text: string;\n try {\n if (controller.signal.aborted) throw new Error('Aborted');\n response=await this.#fetch(url,{method:op.method,headers,signal:controller.signal,redirect:'manual',credentials:'omit'});\n text=await response.text();\n } catch {\n if(timedOut)throw new RequestTimeoutError(op.family,key,op.stateful,'timeout');\n throw new TransportError(op.family,key,op.stateful,options.signal?.aborted?'aborted':'network');\n } finally { clearTimeout(timer);options.signal?.removeEventListener('abort',abort); }\n let body: unknown;\n try { body=JSON.parse(text); } catch { throw new ProtocolError(op.family,key,response.status); }\n if(!body || typeof body!=='object' || Array.isArray(body))throw new ProtocolError(op.family,key,response.status);\n const result=body as Record<string,unknown>;\n const error=result.error && typeof result.error==='object' ? result.error as Record<string,unknown> : {};\n const status=op.family==='activation'?result.statusCode:result.status;\n const code=typeof error.type==='string'?error.type:typeof result.errorid==='number'?result.errorid:typeof status==='number'?status:response.status;\n if (!response.ok) throw new ApiError(op.family,key,response.status,code,result);\n if (typeof status!=='number' || !Number.isInteger(status))throw new ProtocolError(op.family,key,response.status);\n if (op.pending && response.status===202 && status===202 && error.type==='SMS_NOT_YET_RECEIVED') return result;\n if (op.noStock && response.status===200 && status===2) return result;\n if (op.family==='activation' ? (status!==200 || !!result.error) : status!==1) throw new ApiError(op.family,key,response.status,code,result);\n return result;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"polling.js","sourceRoot":"","sources":["../../src/polling.ts"],"names":[],"mappings":"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","sourcesContent":["import { PollingTimeoutError, TransportError, ValidationError } from './errors.js';\r\nimport { Transport, type RequestOptions } from './transport.js';\r\nimport type { ActivationPending, ActivationReceiveSmsResponse, EmailNoStock } from './types.js';\r\n\r\nexport function isPending(value: unknown): value is ActivationPending {\r\n const v=value as ActivationPending|null;\r\n return !!v && v.statusCode===202 && v.error?.type==='SMS_NOT_YET_RECEIVED';\r\n}\r\nexport function isNoStock(value: unknown): value is EmailNoStock { return !!value && (value as EmailNoStock).status===2; }\r\nexport interface WaitForSmsOptions extends RequestOptions { orderid: number; expiresAt: number; intervalMs?: number; partnerkey?: string }\r\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\r\n return new Promise((resolve,reject)=>{\r\n const stop=()=>{clearTimeout(timer);signal?.removeEventListener('abort',stop);reject(new TransportError('activation','activation.receiveSms',true,'aborted'));};\r\n const timer=setTimeout(()=>{signal?.removeEventListener('abort',stop);resolve();},ms);\r\n signal?.addEventListener('abort',stop,{once:true});\r\n if(signal?.aborted)stop();\r\n });\r\n}\r\nexport async function waitForSms(transport: Transport, options: WaitForSmsOptions): Promise<Exclude<ActivationReceiveSmsResponse, ActivationPending>> {\r\n const interval=options.intervalMs??5000;\r\n if(!Number.isFinite(interval)||interval<5000)throw new ValidationError('intervalMs must be at least 5000 in this helper');\r\n if(!Number.isFinite(options.expiresAt))throw new ValidationError('expiresAt must be a finite epoch timestamp in milliseconds');\r\n const deadline=performance.now()+(options.expiresAt-Date.now());\r\n while(performance.now()<deadline) {\r\n const remaining=deadline-performance.now();\r\n const result=await transport.request('activation.receiveSms',{orderid:options.orderid,partnerkey:options.partnerkey},{...options,timeoutMs:Math.max(1,Math.min(options.timeoutMs??transport.timeoutMs,remaining))});\r\n if(!isPending(result))return result as Exclude<ActivationReceiveSmsResponse, ActivationPending>;\r\n const left=deadline-performance.now();\r\n await sleep(Math.max(0,Math.min(interval,left)),options.signal);\r\n if(left<=interval)throw new PollingTimeoutError();\r\n }\r\n throw new PollingTimeoutError();\r\n}\r\n"]}
1
+ {"version":3,"file":"polling.js","sourceRoot":"","sources":["../../src/polling.ts"],"names":[],"mappings":"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","sourcesContent":["import { PollingTimeoutError, TransportError, ValidationError } from './errors.js';\nimport { Transport, type RequestOptions } from './transport.js';\nimport type { ActivationPending, ActivationReceiveSmsResponse, EmailNoStock } from './types.js';\n\nexport function isPending(value: unknown): value is ActivationPending {\n const v=value as ActivationPending|null;\n return !!v && v.statusCode===202 && v.error?.type==='SMS_NOT_YET_RECEIVED';\n}\nexport function isNoStock(value: unknown): value is EmailNoStock { return !!value && (value as EmailNoStock).status===2; }\nexport interface WaitForSmsOptions extends RequestOptions { orderid: number; expiresAt: number; intervalMs?: number; partnerkey?: string }\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve,reject)=>{\n const stop=()=>{clearTimeout(timer);signal?.removeEventListener('abort',stop);reject(new TransportError('activation','activation.receiveSms',true,'aborted'));};\n const timer=setTimeout(()=>{signal?.removeEventListener('abort',stop);resolve();},ms);\n signal?.addEventListener('abort',stop,{once:true});\n if(signal?.aborted)stop();\n });\n}\nexport async function waitForSms(transport: Transport, options: WaitForSmsOptions): Promise<Exclude<ActivationReceiveSmsResponse, ActivationPending>> {\n const interval=options.intervalMs??5000;\n if(!Number.isFinite(interval)||interval<5000)throw new ValidationError('intervalMs must be at least 5000 in this helper');\n if(!Number.isFinite(options.expiresAt))throw new ValidationError('expiresAt must be a finite epoch timestamp in milliseconds');\n const deadline=performance.now()+(options.expiresAt-Date.now());\n while(performance.now()<deadline) {\n const remaining=deadline-performance.now();\n const result=await transport.request('activation.receiveSms',{orderid:options.orderid,partnerkey:options.partnerkey},{...options,timeoutMs:Math.max(1,Math.min(options.timeoutMs??transport.timeoutMs,remaining))});\n if(!isPending(result))return result as Exclude<ActivationReceiveSmsResponse, ActivationPending>;\n const left=deadline-performance.now();\n await sleep(Math.max(0,Math.min(interval,left)),options.signal);\n if(left<=interval)throw new PollingTimeoutError();\n }\n throw new PollingTimeoutError();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { operations } from './contracts.js';\r\nimport { ApiError, ProtocolError, RequestTimeoutError, TransportError, ValidationError, type Family } from './errors.js';\r\n\r\nexport interface Schema { type?: string; enum?: unknown[]; minimum?: number; maximum?: number; minLength?: number; maxLength?: number; pattern?: string; [key: string]: unknown }\r\nexport interface Operation {\r\n family: Family; jsName: string; pyName: string; slug: string; path: string; method: string; baseUrl: string;\r\n auth: 'required' | 'optional' | 'none'; action?: string; stateful: boolean; pending: boolean; noStock: boolean;\r\n params: Array<{ name: string; in: string; required: boolean; omitEmpty?: boolean; schema: Schema }>;\r\n}\r\nexport interface ClientOptions {\r\n apiKey?: string; timeoutMs?: number; activationBaseUrl?: string; rentalBaseUrl?: string; emailBaseUrl?: string;\r\n /** Injectable HTTP transport for tests. Account requests belong on your server. */\r\n fetch?: typeof globalThis.fetch;\r\n}\r\nexport interface RequestOptions { timeoutMs?: number; signal?: AbortSignal; useApiKey?: boolean }\r\nexport function positiveTimeout(value: number): number {\r\n if (!Number.isFinite(value) || value <= 0 || value > 2_147_483_647) throw new ValidationError('timeoutMs must be finite, positive and at most 2147483647');\r\n return value;\r\n}\r\nfunction baseUrl(value: string): string {\r\n let url: URL;\r\n try { url = new URL(value); } catch { throw new ValidationError('Invalid SDK base URL'); }\r\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new ValidationError('Base URL must use HTTP(S) without credentials, query or fragment');\r\n return url.href.replace(/\\/$/, '');\r\n}\r\nexport class Transport {\r\n readonly timeoutMs: number;\r\n #apiKey?: string;\r\n #fetch: typeof globalThis.fetch;\r\n #base: Partial<Record<Family, string>>;\r\n constructor(options: ClientOptions) {\r\n if (options.apiKey !== undefined && (typeof options.apiKey !== 'string' || !options.apiKey || /[\\r\\n]/.test(options.apiKey))) throw new ValidationError('apiKey must be a non-empty string without line breaks');\r\n this.#apiKey = options.apiKey;\r\n this.timeoutMs = positiveTimeout(options.timeoutMs ?? 30_000);\r\n this.#fetch = options.fetch ?? globalThis.fetch;\r\n if (!this.#fetch) throw new ValidationError('A fetch implementation is required');\r\n this.#base = {};\r\n for (const family of ['activation','rental','email'] as const) {\r\n const value = options[`${family}BaseUrl`];\r\n if (value !== undefined) this.#base[family] = baseUrl(value);\r\n }\r\n }\r\n async request(key: string, input: object, options: RequestOptions = {}): Promise<Record<string, unknown>> {\r\n const op = operations[key];\r\n if (!op) throw new ValidationError('Unknown SDK operation');\r\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new ValidationError('Parameters must be an object');\r\n const params = input as Record<string, unknown>;\r\n const allowed = new Set(op.params.map(p => p.name));\r\n if (Object.keys(params).some(name => !allowed.has(name))) throw new ValidationError('Unexpected request parameter');\r\n const query = new URLSearchParams();\r\n const headers: Record<string,string> = { Accept: 'application/json' };\r\n let path = op.path;\r\n if (op.action) query.set('method', op.action);\r\n for (const p of op.params) {\r\n const value = params[p.name];\r\n if (value === undefined || value === null || (p.omitEmpty && value === '')) {\r\n if (p.required) throw new ValidationError(`Missing required parameter: ${p.name}`);\r\n continue;\r\n }\r\n const s=p.schema;\r\n if ((s.type==='integer' && (typeof value!=='number' || !Number.isSafeInteger(value))) ||\r\n (s.type==='number' && (typeof value!=='number' || !Number.isFinite(value))) ||\r\n (s.type==='string' && typeof value!=='string') || (s.type==='boolean' && typeof value!=='boolean')) throw new ValidationError(`Invalid type for parameter: ${p.name}`);\r\n if ((s.enum && !s.enum.includes(value)) || (typeof value==='number' && ((s.minimum!==undefined && value<s.minimum)||(s.maximum!==undefined && value>s.maximum))) ||\r\n (typeof value==='string' && ((s.minLength!==undefined && value.length<s.minLength)||(s.maxLength!==undefined && value.length>s.maxLength)||(s.pattern && !new RegExp(s.pattern).test(value))))) throw new ValidationError(`Invalid value for parameter: ${p.name}`);\r\n const text=String(value);\r\n if (p.in==='path') { if(text==='.'||text==='..')throw new ValidationError(`Invalid path parameter: ${p.name}`); path=path.replace('{'+p.name+'}', encodeURIComponent(text)); }\r\n else if (p.in==='header') { if(/[\\r\\n]/.test(text))throw new ValidationError(`Invalid header: ${p.name}`); headers[p.name]=text; }\r\n else query.set(p.name,text);\r\n }\r\n if (op.auth==='required' && !this.#apiKey) throw new ValidationError('Set apiKey for this operation');\r\n if (this.#apiKey && op.auth!=='none' && (op.auth==='required' || options.useApiKey!==false)) {\r\n if (op.family==='activation') headers.apikey=this.#apiKey; else query.set('apikey',this.#apiKey);\r\n }\r\n const url=(this.#base[op.family]??baseUrl(op.baseUrl))+path+(query.size?'?'+query:'');\r\n const timeout=positiveTimeout(options.timeoutMs??this.timeoutMs);\r\n const controller=new AbortController();\r\n let timedOut=false;\r\n const abort=()=>controller.abort();\r\n options.signal?.addEventListener('abort',abort,{once:true});\r\n if(options.signal?.aborted) controller.abort();\r\n const timer=setTimeout(()=>{timedOut=true;controller.abort();},timeout);\r\n let response: Response, text: string;\r\n try {\r\n if (controller.signal.aborted) throw new Error('Aborted');\r\n response=await this.#fetch(url,{method:op.method,headers,signal:controller.signal,redirect:'manual',credentials:'omit'});\r\n text=await response.text();\r\n } catch {\r\n if(timedOut)throw new RequestTimeoutError(op.family,key,op.stateful,'timeout');\r\n throw new TransportError(op.family,key,op.stateful,options.signal?.aborted?'aborted':'network');\r\n } finally { clearTimeout(timer);options.signal?.removeEventListener('abort',abort); }\r\n let body: unknown;\r\n try { body=JSON.parse(text); } catch { throw new ProtocolError(op.family,key,response.status); }\r\n if(!body || typeof body!=='object' || Array.isArray(body))throw new ProtocolError(op.family,key,response.status);\r\n const result=body as Record<string,unknown>;\r\n const error=result.error && typeof result.error==='object' ? result.error as Record<string,unknown> : {};\r\n const status=op.family==='activation'?result.statusCode:result.status;\r\n const code=typeof error.type==='string'?error.type:typeof result.errorid==='number'?result.errorid:typeof status==='number'?status:response.status;\r\n if (!response.ok) throw new ApiError(op.family,key,response.status,code,result);\r\n if (typeof status!=='number' || !Number.isInteger(status))throw new ProtocolError(op.family,key,response.status);\r\n if (op.pending && response.status===202 && status===202 && error.type==='SMS_NOT_YET_RECEIVED') return result;\r\n if (op.noStock && response.status===200 && status===2) return result;\r\n if (op.family==='activation' ? (status!==200 || !!result.error) : status!==1) throw new ApiError(op.family,key,response.status,code,result);\r\n return result;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { operations } from './contracts.js';\nimport { ApiError, ProtocolError, RequestTimeoutError, TransportError, ValidationError, type Family } from './errors.js';\n\nexport interface Schema { type?: string; enum?: unknown[]; minimum?: number; maximum?: number; minLength?: number; maxLength?: number; pattern?: string; [key: string]: unknown }\nexport interface Operation {\n family: Family; jsName: string; pyName: string; slug: string; path: string; method: string; baseUrl: string;\n auth: 'required' | 'optional' | 'none'; action?: string; stateful: boolean; pending: boolean; noStock: boolean;\n params: Array<{ name: string; in: string; required: boolean; omitEmpty?: boolean; schema: Schema }>;\n}\nexport interface ClientOptions {\n apiKey?: string; timeoutMs?: number; activationBaseUrl?: string; rentalBaseUrl?: string; emailBaseUrl?: string;\n /** Injectable HTTP transport for tests. Account requests belong on your server. */\n fetch?: typeof globalThis.fetch;\n}\nexport interface RequestOptions { timeoutMs?: number; signal?: AbortSignal; useApiKey?: boolean }\nexport function positiveTimeout(value: number): number {\n if (!Number.isFinite(value) || value <= 0 || value > 2_147_483_647) throw new ValidationError('timeoutMs must be finite, positive and at most 2147483647');\n return value;\n}\nfunction baseUrl(value: string): string {\n let url: URL;\n try { url = new URL(value); } catch { throw new ValidationError('Invalid SDK base URL'); }\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new ValidationError('Base URL must use HTTP(S) without credentials, query or fragment');\n return url.href.replace(/\\/$/, '');\n}\nexport class Transport {\n readonly timeoutMs: number;\n #apiKey?: string;\n #fetch: typeof globalThis.fetch;\n #base: Partial<Record<Family, string>>;\n constructor(options: ClientOptions) {\n if (options.apiKey !== undefined && (typeof options.apiKey !== 'string' || !options.apiKey || /[\\r\\n]/.test(options.apiKey))) throw new ValidationError('apiKey must be a non-empty string without line breaks');\n this.#apiKey = options.apiKey;\n this.timeoutMs = positiveTimeout(options.timeoutMs ?? 30_000);\n this.#fetch = options.fetch ?? globalThis.fetch;\n if (!this.#fetch) throw new ValidationError('A fetch implementation is required');\n this.#base = {};\n for (const family of ['activation','rental','email'] as const) {\n const value = options[`${family}BaseUrl`];\n if (value !== undefined) this.#base[family] = baseUrl(value);\n }\n }\n async request(key: string, input: object, options: RequestOptions = {}): Promise<Record<string, unknown>> {\n const op = operations[key];\n if (!op) throw new ValidationError('Unknown SDK operation');\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new ValidationError('Parameters must be an object');\n const params = input as Record<string, unknown>;\n const allowed = new Set(op.params.map(p => p.name));\n if (Object.keys(params).some(name => !allowed.has(name))) throw new ValidationError('Unexpected request parameter');\n const query = new URLSearchParams();\n const headers: Record<string,string> = { Accept: 'application/json' };\n let path = op.path;\n if (op.action) query.set('method', op.action);\n for (const p of op.params) {\n const value = params[p.name];\n if (value === undefined || value === null || (p.omitEmpty && value === '')) {\n if (p.required) throw new ValidationError(`Missing required parameter: ${p.name}`);\n continue;\n }\n const s=p.schema;\n if ((s.type==='integer' && (typeof value!=='number' || !Number.isSafeInteger(value))) ||\n (s.type==='number' && (typeof value!=='number' || !Number.isFinite(value))) ||\n (s.type==='string' && typeof value!=='string') || (s.type==='boolean' && typeof value!=='boolean')) throw new ValidationError(`Invalid type for parameter: ${p.name}`);\n if ((s.enum && !s.enum.includes(value)) || (typeof value==='number' && ((s.minimum!==undefined && value<s.minimum)||(s.maximum!==undefined && value>s.maximum))) ||\n (typeof value==='string' && ((s.minLength!==undefined && value.length<s.minLength)||(s.maxLength!==undefined && value.length>s.maxLength)||(s.pattern && !new RegExp(s.pattern).test(value))))) throw new ValidationError(`Invalid value for parameter: ${p.name}`);\n const text=String(value);\n if (p.in==='path') { if(text==='.'||text==='..')throw new ValidationError(`Invalid path parameter: ${p.name}`); path=path.replace('{'+p.name+'}', encodeURIComponent(text)); }\n else if (p.in==='header') { if(/[\\r\\n]/.test(text))throw new ValidationError(`Invalid header: ${p.name}`); headers[p.name]=text; }\n else query.set(p.name,text);\n }\n if (op.auth==='required' && !this.#apiKey) throw new ValidationError('Set apiKey for this operation');\n if (this.#apiKey && op.auth!=='none' && (op.auth==='required' || options.useApiKey!==false)) {\n if (op.family==='activation') headers.apikey=this.#apiKey; else query.set('apikey',this.#apiKey);\n }\n const url=(this.#base[op.family]??baseUrl(op.baseUrl))+path+(query.size?'?'+query:'');\n const timeout=positiveTimeout(options.timeoutMs??this.timeoutMs);\n const controller=new AbortController();\n let timedOut=false;\n const abort=()=>controller.abort();\n options.signal?.addEventListener('abort',abort,{once:true});\n if(options.signal?.aborted) controller.abort();\n const timer=setTimeout(()=>{timedOut=true;controller.abort();},timeout);\n let response: Response, text: string;\n try {\n if (controller.signal.aborted) throw new Error('Aborted');\n response=await this.#fetch(url,{method:op.method,headers,signal:controller.signal,redirect:'manual',credentials:'omit'});\n text=await response.text();\n } catch {\n if(timedOut)throw new RequestTimeoutError(op.family,key,op.stateful,'timeout');\n throw new TransportError(op.family,key,op.stateful,options.signal?.aborted?'aborted':'network');\n } finally { clearTimeout(timer);options.signal?.removeEventListener('abort',abort); }\n let body: unknown;\n try { body=JSON.parse(text); } catch { throw new ProtocolError(op.family,key,response.status); }\n if(!body || typeof body!=='object' || Array.isArray(body))throw new ProtocolError(op.family,key,response.status);\n const result=body as Record<string,unknown>;\n const error=result.error && typeof result.error==='object' ? result.error as Record<string,unknown> : {};\n const status=op.family==='activation'?result.statusCode:result.status;\n const code=typeof error.type==='string'?error.type:typeof result.errorid==='number'?result.errorid:typeof status==='number'?status:response.status;\n if (!response.ok) throw new ApiError(op.family,key,response.status,code,result);\n if (typeof status!=='number' || !Number.isInteger(status))throw new ProtocolError(op.family,key,response.status);\n if (op.pending && response.status===202 && status===202 && error.type==='SMS_NOT_YET_RECEIVED') return result;\n if (op.noStock && response.status===200 && status===2) return result;\n if (op.family==='activation' ? (status!==200 || !!result.error) : status!==1) throw new ApiError(op.family,key,response.status,code,result);\n return result;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "smspva-sdk",
3
- "version": "0.1.0-alpha.1",
4
- "description": "SMSPVA Activation V2, Rental and Private Email clients for Node.js and TypeScript",
3
+ "version": "0.1.0-alpha.2",
4
+ "description": "Official JavaScript and TypeScript SDK for SMSPVA SMS activation, phone number rental and private email APIs",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "engines": {
@@ -43,7 +43,7 @@
43
43
  "bugs": {
44
44
  "url": "https://github.com/SMSPVA/smspva-js/issues"
45
45
  },
46
- "homepage": "https://github.com/SMSPVA/smspva-js#readme",
46
+ "homepage": "https://smspva.com/",
47
47
  "publishConfig": {
48
48
  "access": "public",
49
49
  "tag": "alpha"
@@ -51,7 +51,9 @@
51
51
  "keywords": [
52
52
  "smspva",
53
53
  "sms",
54
+ "verification",
54
55
  "activation",
56
+ "phone-number",
55
57
  "rental",
56
58
  "email",
57
59
  "typescript",