newtqnia-node 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -10
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -31,9 +31,7 @@ Node.js:
|
|
|
31
31
|
```ts
|
|
32
32
|
import { NewTqniaClient } from "newtqnia-node";
|
|
33
33
|
|
|
34
|
-
const client = new NewTqniaClient(
|
|
35
|
-
apiKey: process.env.NEWTQNIA_API_KEY,
|
|
36
|
-
});
|
|
34
|
+
const client = new NewTqniaClient();
|
|
37
35
|
|
|
38
36
|
const digest = await client.news.latest({ locale: "en", limit: 5 });
|
|
39
37
|
for (const article of digest.articles) {
|
|
@@ -46,9 +44,7 @@ Deno:
|
|
|
46
44
|
```ts
|
|
47
45
|
import { NewTqniaClient } from "@newtqnia/newtqnia-node";
|
|
48
46
|
|
|
49
|
-
const client = new NewTqniaClient(
|
|
50
|
-
apiKey: Deno.env.get("NEWTQNIA_API_KEY"),
|
|
51
|
-
});
|
|
47
|
+
const client = new NewTqniaClient();
|
|
52
48
|
|
|
53
49
|
const digest = await client.news.latest({ locale: "en", limit: 5 });
|
|
54
50
|
for (const article of digest.articles) {
|
|
@@ -56,10 +52,10 @@ for (const article of digest.articles) {
|
|
|
56
52
|
}
|
|
57
53
|
```
|
|
58
54
|
|
|
59
|
-
Run the Deno example with
|
|
55
|
+
Run the Deno example with network access enabled:
|
|
60
56
|
|
|
61
57
|
```bash
|
|
62
|
-
deno run --allow-
|
|
58
|
+
deno run --allow-net example.ts
|
|
63
59
|
```
|
|
64
60
|
|
|
65
61
|
The public API currently exposes the two endpoints in NewTqnia's [OpenAPI document](https://newtqnia.com/openapi.yaml):
|
|
@@ -73,14 +69,46 @@ The API contract does not currently define free-text search, individual article
|
|
|
73
69
|
|
|
74
70
|
## Authentication
|
|
75
71
|
|
|
76
|
-
|
|
72
|
+
No API key is required to use the public news endpoints. The default client works without credentials:
|
|
77
73
|
|
|
78
|
-
|
|
74
|
+
```ts
|
|
75
|
+
const client = new NewTqniaClient();
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Optional NewTqnia API key
|
|
79
|
+
|
|
80
|
+
If you have a key from your [NewTqnia profile](https://newtqnia.com/en/account), pass it as `apiKey`. The SDK sends it in the `X-API-Key` header:
|
|
79
81
|
|
|
80
82
|
```ts
|
|
81
83
|
const client = new NewTqniaClient({
|
|
82
84
|
apiKey: process.env.NEWTQNIA_API_KEY,
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### RapidAPI users
|
|
89
|
+
|
|
90
|
+
`rapidApiKey` is only for users accessing NewTqnia through RapidAPI. It is not needed when calling the NewTqnia API directly.
|
|
91
|
+
|
|
92
|
+
Use the gateway URL, host, and key shown in your RapidAPI dashboard:
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
const rapidApiHost = process.env.RAPIDAPI_HOST!;
|
|
96
|
+
|
|
97
|
+
const client = new NewTqniaClient({
|
|
98
|
+
baseUrl: `https://${rapidApiHost}`,
|
|
83
99
|
rapidApiKey: process.env.RAPIDAPI_KEY,
|
|
100
|
+
defaultHeaders: {
|
|
101
|
+
"X-RapidAPI-Host": rapidApiHost,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
RapidAPI requires both `X-RapidAPI-Key` and `X-RapidAPI-Host`. The SDK sets `X-RapidAPI-Key` from `rapidApiKey`; supply the host shown by RapidAPI as demonstrated above. Keep all keys in environment variables and never expose them in browser code or commit them to source control.
|
|
107
|
+
|
|
108
|
+
## Configuration
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
const client = new NewTqniaClient({
|
|
84
112
|
application: "my-service",
|
|
85
113
|
website: "https://example.com",
|
|
86
114
|
baseUrl: "https://api.newtqnia.com",
|
package/dist/index.cjs
CHANGED
|
@@ -223,7 +223,7 @@ var NewTqniaClient = class {
|
|
|
223
223
|
initialDelayMs: options.retry?.initialDelayMs ?? 500,
|
|
224
224
|
maxDelayMs: options.retry?.maxDelayMs ?? 8e3
|
|
225
225
|
},
|
|
226
|
-
userAgent: options.userAgent ?? "newtqnia-node/1.1.
|
|
226
|
+
userAgent: options.userAgent ?? "newtqnia-node/1.1.1",
|
|
227
227
|
headers: options.defaultHeaders ?? {},
|
|
228
228
|
...options.signal ? { signal: options.signal } : {}
|
|
229
229
|
});
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/index.ts","../src/resources/news.ts","../src/utils/query.ts","../src/transport/transport.ts","../src/client/client.ts"],"names":["signal"],"mappings":"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","file":"index.cjs","sourcesContent":["export interface ErrorOptions {\n status?: number | undefined;\n requestId?: string | undefined;\n retryAfter?: number | undefined;\n code?: string | undefined;\n cause?: unknown | undefined;\n}\n\n/** Base class for all SDK errors. */\nexport class NewTqniaError extends Error {\n readonly status: number | undefined;\n readonly requestId: string | undefined;\n readonly retryAfter: number | undefined;\n readonly code: string | undefined;\n\n constructor(message: string, options: ErrorOptions = {}) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = new.target.name;\n this.status = options.status;\n this.requestId = options.requestId;\n this.retryAfter = options.retryAfter;\n this.code = options.code;\n }\n}\nexport class AuthenticationError extends NewTqniaError {}\nexport class AuthorizationError extends NewTqniaError {}\nexport class ValidationError extends NewTqniaError {}\nexport class NotFoundError extends NewTqniaError {}\nexport class ConflictError extends NewTqniaError {}\nexport class RateLimitError extends NewTqniaError {}\nexport class ServerError extends NewTqniaError {}\nexport class TimeoutError extends NewTqniaError {}\nexport class NetworkError extends NewTqniaError {}\n","import { ValidationError } from \"../errors/index.js\";\nimport type { Digest, NewsListParams } from \"../models/index.js\";\nimport type { Transport } from \"../transport/transport.js\";\n\n/** Access localized NewTqnia news collections. */\nexport class NewsResource {\n /** @internal */\n constructor(private readonly transport: Transport) {}\n\n /** Get articles published today using the Asia/Dubai day boundary. */\n today(params: NewsListParams = {}): Promise<Digest> {\n return this.get(\"today\", params);\n }\n\n /** Get the latest published articles. */\n latest(params: NewsListParams = {}): Promise<Digest> {\n return this.get(\"latest\", params);\n }\n\n private get(collection: \"today\" | \"latest\", params: NewsListParams): Promise<Digest> {\n if (params.locale !== undefined && params.locale !== \"en\" && params.locale !== \"ar\") {\n throw new ValidationError('locale must be \"en\" or \"ar\".');\n }\n if (params.limit !== undefined && (!Number.isInteger(params.limit) || params.limit < 1 || params.limit > 10)) {\n throw new ValidationError(\"limit must be an integer between 1 and 10.\");\n }\n if (params.category !== undefined && params.category.trim() === \"\") {\n throw new ValidationError(\"category cannot be empty.\");\n }\n return this.transport.request<Digest>({\n method: \"GET\",\n path: `/v1/news/${collection}`,\n query: { locale: params.locale, limit: params.limit, category: params.category },\n ...(params.signal ? { signal: params.signal } : {}),\n });\n }\n}\n","export function serializeQuery(values: Record<string, string | number | boolean | undefined>): string {\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) search.append(key, String(value));\n }\n return search.toString();\n}\n","import {\n AuthenticationError, AuthorizationError, ConflictError, NetworkError, NewTqniaError,\n NotFoundError, RateLimitError, ServerError, TimeoutError, ValidationError,\n} from \"../errors/index.js\";\nimport { serializeQuery } from \"../utils/query.js\";\nimport type { Fetch, RequestOptions, RetryOptions } from \"./types.js\";\n\nconst RETRYABLE = new Set([429, 500, 502, 503, 504]);\n\nexport interface TransportOptions {\n apiKey?: string;\n rapidApiKey?: string;\n application?: string;\n website?: string;\n baseUrl: string;\n timeout: number;\n fetch: Fetch;\n retry: Required<RetryOptions>;\n userAgent: string;\n headers: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class Transport {\n constructor(private readonly options: TransportOptions) {}\n\n async request<T>(request: RequestOptions): Promise<T> {\n const query = request.query ? serializeQuery(request.query) : \"\";\n const url = `${this.options.baseUrl}${request.path}${query ? `?${query}` : \"\"}`;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.options.retry.maxRetries; attempt += 1) {\n try {\n const response = await this.fetchOnce(url, request);\n if (response.ok) return await this.decode<T>(response);\n if (RETRYABLE.has(response.status) && attempt < this.options.retry.maxRetries) {\n await this.pause(this.retryDelay(response, attempt), request.signal);\n continue;\n }\n throw await this.apiError(response);\n } catch (error) {\n if (error instanceof NewTqniaError) throw error;\n if (this.wasCancelled(request.signal)) throw error;\n if (this.isTimeout(error)) throw new TimeoutError(`Request timed out after ${this.options.timeout}ms`, { cause: error });\n lastError = error;\n if (attempt < this.options.retry.maxRetries) {\n await this.pause(this.backoff(attempt), request.signal);\n continue;\n }\n }\n }\n throw new NetworkError(\"Unable to reach the NewTqnia API.\", { cause: lastError });\n }\n\n private async fetchOnce(url: string, request: RequestOptions): Promise<Response> {\n const timeout = AbortSignal.timeout(this.options.timeout);\n const signals = [timeout, this.options.signal, request.signal].filter((signal): signal is AbortSignal => signal !== undefined);\n const signal = this.combineSignals(signals);\n const headers = new Headers(this.options.headers);\n headers.set(\"Accept\", \"application/json\");\n headers.set(\"User-Agent\", this.options.userAgent);\n if (this.options.apiKey) headers.set(\"X-API-Key\", this.options.apiKey);\n if (this.options.rapidApiKey) headers.set(\"X-RapidAPI-Key\", this.options.rapidApiKey);\n if (this.options.application) headers.set(\"X-NewTqnia-Application\", this.options.application);\n if (this.options.website) headers.set(\"X-NewTqnia-Website\", this.options.website);\n return this.options.fetch(url, { method: request.method, headers, signal: signal ?? null });\n }\n\n private async decode<T>(response: Response): Promise<T> {\n try {\n return await response.json() as T;\n } catch (cause) {\n throw new NewTqniaError(\"The API returned invalid JSON.\", {\n status: response.status, requestId: this.requestId(response), cause,\n });\n }\n }\n\n private async apiError(response: Response): Promise<NewTqniaError> {\n const data = await response.json().catch(() => ({})) as Record<string, unknown>;\n const message = typeof data.message === \"string\" ? data.message : `NewTqnia API request failed with status ${response.status}.`;\n const retryAfter = this.parseRetryAfter(response.headers.get(\"retry-after\"));\n const options = {\n status: response.status,\n requestId: this.requestId(response),\n retryAfter,\n code: typeof data.code === \"string\" ? data.code : undefined,\n };\n if (response.status === 401) return new AuthenticationError(message, options);\n if (response.status === 403) return new AuthorizationError(message, options);\n if (response.status === 404) return new NotFoundError(message, options);\n if (response.status === 409) return new ConflictError(message, options);\n if (response.status === 422 || response.status === 400) return new ValidationError(message, options);\n if (response.status === 429) return new RateLimitError(message, options);\n if (response.status >= 500) return new ServerError(message, options);\n return new NewTqniaError(message, options);\n }\n\n private retryDelay(response: Response, attempt: number): number {\n return this.parseRetryAfter(response.headers.get(\"retry-after\")) ?? this.backoff(attempt);\n }\n private parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) return Math.max(0, seconds * 1000);\n const date = Date.parse(value);\n return Number.isNaN(date) ? undefined : Math.max(0, date - Date.now());\n }\n private backoff(attempt: number): number {\n const raw = this.options.retry.initialDelayMs * (2 ** attempt);\n return Math.min(raw, this.options.retry.maxDelayMs);\n }\n private async pause(ms: number, signal?: AbortSignal): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\"abort\", () => { clearTimeout(timer); reject(signal.reason); }, { once: true });\n });\n }\n private requestId(response: Response): string | undefined {\n return response.headers.get(\"x-request-id\") ?? undefined;\n }\n private combineSignals(signals: AbortSignal[]): AbortSignal | undefined {\n if (signals.length === 0) return undefined;\n if (signals.length === 1) return signals[0];\n const controller = new AbortController();\n const abort = (signal: AbortSignal) => {\n if (!controller.signal.aborted) controller.abort(signal.reason);\n };\n for (const signal of signals) {\n if (signal.aborted) {\n abort(signal);\n break;\n }\n signal.addEventListener(\"abort\", () => abort(signal), { once: true });\n }\n return controller.signal;\n }\n private wasCancelled(signal?: AbortSignal): boolean {\n return Boolean(signal?.aborted || this.options.signal?.aborted);\n }\n private isTimeout(error: unknown): boolean {\n return error instanceof DOMException && (error.name === \"TimeoutError\" || error.name === \"AbortError\")\n && !this.options.signal?.aborted;\n }\n}\n","import { ValidationError } from \"../errors/index.js\";\nimport { NewsResource } from \"../resources/news.js\";\nimport { Transport } from \"../transport/transport.js\";\nimport type { Fetch, RetryOptions } from \"../transport/types.js\";\n\nexport interface NewTqniaClientOptions {\n /** Optional NewTqnia API key sent as X-API-Key. */\n apiKey?: string;\n /** Optional RapidAPI key sent as X-RapidAPI-Key. */\n rapidApiKey?: string;\n /** Optional caller application name. */\n application?: string;\n /** Optional caller website origin. */\n website?: string;\n /** API origin. @default \"https://api.newtqnia.com\" */\n baseUrl?: string;\n /** Request timeout in milliseconds. @default 30000 */\n timeout?: number;\n /** Cancels every request made by this client. */\n signal?: AbortSignal;\n /** Custom Fetch-compatible implementation. */\n fetch?: Fetch;\n /** Retry behavior for rate limits, server errors, and temporary network failures. */\n retry?: RetryOptions;\n /** User-Agent header. @default \"newtqnia-node/1.1.0\" */\n userAgent?: string;\n /** Headers included with every request. */\n defaultHeaders?: Record<string, string>;\n}\n\n/** Official NewTqnia API client. */\nexport class NewTqniaClient {\n /** Localized news endpoints. */\n readonly news: NewsResource;\n\n constructor(options: NewTqniaClientOptions = {}) {\n const baseUrl = (options.baseUrl ?? \"https://api.newtqnia.com\").replace(/\\/+$/, \"\");\n this.validate(baseUrl, options.timeout);\n const transport = new Transport({\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n ...(options.rapidApiKey ? { rapidApiKey: options.rapidApiKey } : {}),\n ...(options.application ? { application: options.application } : {}),\n ...(options.website ? { website: options.website } : {}),\n baseUrl,\n timeout: options.timeout ?? 30_000,\n fetch: options.fetch ?? globalThis.fetch.bind(globalThis),\n retry: {\n maxRetries: options.retry?.maxRetries ?? 2,\n initialDelayMs: options.retry?.initialDelayMs ?? 500,\n maxDelayMs: options.retry?.maxDelayMs ?? 8_000,\n },\n userAgent: options.userAgent ?? \"newtqnia-node/1.1.0\",\n headers: options.defaultHeaders ?? {},\n ...(options.signal ? { signal: options.signal } : {}),\n });\n this.news = new NewsResource(transport);\n }\n\n private validate(baseUrl: string, timeout?: number): void {\n let url: URL;\n try { url = new URL(baseUrl); } catch { throw new ValidationError(\"baseUrl must be an absolute HTTP(S) URL.\"); }\n if (![\"http:\", \"https:\"].includes(url.protocol)) throw new ValidationError(\"baseUrl must be an absolute HTTP(S) URL.\");\n const local = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname);\n if (url.protocol !== \"https:\" && !local) throw new ValidationError(\"baseUrl must use HTTPS except for local development.\");\n if (timeout !== undefined && (!Number.isFinite(timeout) || timeout <= 0)) throw new ValidationError(\"timeout must be a positive number.\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/index.ts","../src/resources/news.ts","../src/utils/query.ts","../src/transport/transport.ts","../src/client/client.ts"],"names":["signal"],"mappings":"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","file":"index.cjs","sourcesContent":["export interface ErrorOptions {\n status?: number | undefined;\n requestId?: string | undefined;\n retryAfter?: number | undefined;\n code?: string | undefined;\n cause?: unknown | undefined;\n}\n\n/** Base class for all SDK errors. */\nexport class NewTqniaError extends Error {\n readonly status: number | undefined;\n readonly requestId: string | undefined;\n readonly retryAfter: number | undefined;\n readonly code: string | undefined;\n\n constructor(message: string, options: ErrorOptions = {}) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = new.target.name;\n this.status = options.status;\n this.requestId = options.requestId;\n this.retryAfter = options.retryAfter;\n this.code = options.code;\n }\n}\nexport class AuthenticationError extends NewTqniaError {}\nexport class AuthorizationError extends NewTqniaError {}\nexport class ValidationError extends NewTqniaError {}\nexport class NotFoundError extends NewTqniaError {}\nexport class ConflictError extends NewTqniaError {}\nexport class RateLimitError extends NewTqniaError {}\nexport class ServerError extends NewTqniaError {}\nexport class TimeoutError extends NewTqniaError {}\nexport class NetworkError extends NewTqniaError {}\n","import { ValidationError } from \"../errors/index.js\";\nimport type { Digest, NewsListParams } from \"../models/index.js\";\nimport type { Transport } from \"../transport/transport.js\";\n\n/** Access localized NewTqnia news collections. */\nexport class NewsResource {\n /** @internal */\n constructor(private readonly transport: Transport) {}\n\n /** Get articles published today using the Asia/Dubai day boundary. */\n today(params: NewsListParams = {}): Promise<Digest> {\n return this.get(\"today\", params);\n }\n\n /** Get the latest published articles. */\n latest(params: NewsListParams = {}): Promise<Digest> {\n return this.get(\"latest\", params);\n }\n\n private get(collection: \"today\" | \"latest\", params: NewsListParams): Promise<Digest> {\n if (params.locale !== undefined && params.locale !== \"en\" && params.locale !== \"ar\") {\n throw new ValidationError('locale must be \"en\" or \"ar\".');\n }\n if (params.limit !== undefined && (!Number.isInteger(params.limit) || params.limit < 1 || params.limit > 10)) {\n throw new ValidationError(\"limit must be an integer between 1 and 10.\");\n }\n if (params.category !== undefined && params.category.trim() === \"\") {\n throw new ValidationError(\"category cannot be empty.\");\n }\n return this.transport.request<Digest>({\n method: \"GET\",\n path: `/v1/news/${collection}`,\n query: { locale: params.locale, limit: params.limit, category: params.category },\n ...(params.signal ? { signal: params.signal } : {}),\n });\n }\n}\n","export function serializeQuery(values: Record<string, string | number | boolean | undefined>): string {\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) search.append(key, String(value));\n }\n return search.toString();\n}\n","import {\n AuthenticationError, AuthorizationError, ConflictError, NetworkError, NewTqniaError,\n NotFoundError, RateLimitError, ServerError, TimeoutError, ValidationError,\n} from \"../errors/index.js\";\nimport { serializeQuery } from \"../utils/query.js\";\nimport type { Fetch, RequestOptions, RetryOptions } from \"./types.js\";\n\nconst RETRYABLE = new Set([429, 500, 502, 503, 504]);\n\nexport interface TransportOptions {\n apiKey?: string;\n rapidApiKey?: string;\n application?: string;\n website?: string;\n baseUrl: string;\n timeout: number;\n fetch: Fetch;\n retry: Required<RetryOptions>;\n userAgent: string;\n headers: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class Transport {\n constructor(private readonly options: TransportOptions) {}\n\n async request<T>(request: RequestOptions): Promise<T> {\n const query = request.query ? serializeQuery(request.query) : \"\";\n const url = `${this.options.baseUrl}${request.path}${query ? `?${query}` : \"\"}`;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.options.retry.maxRetries; attempt += 1) {\n try {\n const response = await this.fetchOnce(url, request);\n if (response.ok) return await this.decode<T>(response);\n if (RETRYABLE.has(response.status) && attempt < this.options.retry.maxRetries) {\n await this.pause(this.retryDelay(response, attempt), request.signal);\n continue;\n }\n throw await this.apiError(response);\n } catch (error) {\n if (error instanceof NewTqniaError) throw error;\n if (this.wasCancelled(request.signal)) throw error;\n if (this.isTimeout(error)) throw new TimeoutError(`Request timed out after ${this.options.timeout}ms`, { cause: error });\n lastError = error;\n if (attempt < this.options.retry.maxRetries) {\n await this.pause(this.backoff(attempt), request.signal);\n continue;\n }\n }\n }\n throw new NetworkError(\"Unable to reach the NewTqnia API.\", { cause: lastError });\n }\n\n private async fetchOnce(url: string, request: RequestOptions): Promise<Response> {\n const timeout = AbortSignal.timeout(this.options.timeout);\n const signals = [timeout, this.options.signal, request.signal].filter((signal): signal is AbortSignal => signal !== undefined);\n const signal = this.combineSignals(signals);\n const headers = new Headers(this.options.headers);\n headers.set(\"Accept\", \"application/json\");\n headers.set(\"User-Agent\", this.options.userAgent);\n if (this.options.apiKey) headers.set(\"X-API-Key\", this.options.apiKey);\n if (this.options.rapidApiKey) headers.set(\"X-RapidAPI-Key\", this.options.rapidApiKey);\n if (this.options.application) headers.set(\"X-NewTqnia-Application\", this.options.application);\n if (this.options.website) headers.set(\"X-NewTqnia-Website\", this.options.website);\n return this.options.fetch(url, { method: request.method, headers, signal: signal ?? null });\n }\n\n private async decode<T>(response: Response): Promise<T> {\n try {\n return await response.json() as T;\n } catch (cause) {\n throw new NewTqniaError(\"The API returned invalid JSON.\", {\n status: response.status, requestId: this.requestId(response), cause,\n });\n }\n }\n\n private async apiError(response: Response): Promise<NewTqniaError> {\n const data = await response.json().catch(() => ({})) as Record<string, unknown>;\n const message = typeof data.message === \"string\" ? data.message : `NewTqnia API request failed with status ${response.status}.`;\n const retryAfter = this.parseRetryAfter(response.headers.get(\"retry-after\"));\n const options = {\n status: response.status,\n requestId: this.requestId(response),\n retryAfter,\n code: typeof data.code === \"string\" ? data.code : undefined,\n };\n if (response.status === 401) return new AuthenticationError(message, options);\n if (response.status === 403) return new AuthorizationError(message, options);\n if (response.status === 404) return new NotFoundError(message, options);\n if (response.status === 409) return new ConflictError(message, options);\n if (response.status === 422 || response.status === 400) return new ValidationError(message, options);\n if (response.status === 429) return new RateLimitError(message, options);\n if (response.status >= 500) return new ServerError(message, options);\n return new NewTqniaError(message, options);\n }\n\n private retryDelay(response: Response, attempt: number): number {\n return this.parseRetryAfter(response.headers.get(\"retry-after\")) ?? this.backoff(attempt);\n }\n private parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) return Math.max(0, seconds * 1000);\n const date = Date.parse(value);\n return Number.isNaN(date) ? undefined : Math.max(0, date - Date.now());\n }\n private backoff(attempt: number): number {\n const raw = this.options.retry.initialDelayMs * (2 ** attempt);\n return Math.min(raw, this.options.retry.maxDelayMs);\n }\n private async pause(ms: number, signal?: AbortSignal): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\"abort\", () => { clearTimeout(timer); reject(signal.reason); }, { once: true });\n });\n }\n private requestId(response: Response): string | undefined {\n return response.headers.get(\"x-request-id\") ?? undefined;\n }\n private combineSignals(signals: AbortSignal[]): AbortSignal | undefined {\n if (signals.length === 0) return undefined;\n if (signals.length === 1) return signals[0];\n const controller = new AbortController();\n const abort = (signal: AbortSignal) => {\n if (!controller.signal.aborted) controller.abort(signal.reason);\n };\n for (const signal of signals) {\n if (signal.aborted) {\n abort(signal);\n break;\n }\n signal.addEventListener(\"abort\", () => abort(signal), { once: true });\n }\n return controller.signal;\n }\n private wasCancelled(signal?: AbortSignal): boolean {\n return Boolean(signal?.aborted || this.options.signal?.aborted);\n }\n private isTimeout(error: unknown): boolean {\n return error instanceof DOMException && (error.name === \"TimeoutError\" || error.name === \"AbortError\")\n && !this.options.signal?.aborted;\n }\n}\n","import { ValidationError } from \"../errors/index.js\";\nimport { NewsResource } from \"../resources/news.js\";\nimport { Transport } from \"../transport/transport.js\";\nimport type { Fetch, RetryOptions } from \"../transport/types.js\";\n\nexport interface NewTqniaClientOptions {\n /** Optional NewTqnia API key sent as X-API-Key. */\n apiKey?: string;\n /** Optional RapidAPI key sent as X-RapidAPI-Key. */\n rapidApiKey?: string;\n /** Optional caller application name. */\n application?: string;\n /** Optional caller website origin. */\n website?: string;\n /** API origin. @default \"https://api.newtqnia.com\" */\n baseUrl?: string;\n /** Request timeout in milliseconds. @default 30000 */\n timeout?: number;\n /** Cancels every request made by this client. */\n signal?: AbortSignal;\n /** Custom Fetch-compatible implementation. */\n fetch?: Fetch;\n /** Retry behavior for rate limits, server errors, and temporary network failures. */\n retry?: RetryOptions;\n /** User-Agent header. @default \"newtqnia-node/1.1.1\" */\n userAgent?: string;\n /** Headers included with every request. */\n defaultHeaders?: Record<string, string>;\n}\n\n/** Official NewTqnia API client. */\nexport class NewTqniaClient {\n /** Localized news endpoints. */\n readonly news: NewsResource;\n\n constructor(options: NewTqniaClientOptions = {}) {\n const baseUrl = (options.baseUrl ?? \"https://api.newtqnia.com\").replace(/\\/+$/, \"\");\n this.validate(baseUrl, options.timeout);\n const transport = new Transport({\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n ...(options.rapidApiKey ? { rapidApiKey: options.rapidApiKey } : {}),\n ...(options.application ? { application: options.application } : {}),\n ...(options.website ? { website: options.website } : {}),\n baseUrl,\n timeout: options.timeout ?? 30_000,\n fetch: options.fetch ?? globalThis.fetch.bind(globalThis),\n retry: {\n maxRetries: options.retry?.maxRetries ?? 2,\n initialDelayMs: options.retry?.initialDelayMs ?? 500,\n maxDelayMs: options.retry?.maxDelayMs ?? 8_000,\n },\n userAgent: options.userAgent ?? \"newtqnia-node/1.1.1\",\n headers: options.defaultHeaders ?? {},\n ...(options.signal ? { signal: options.signal } : {}),\n });\n this.news = new NewsResource(transport);\n }\n\n private validate(baseUrl: string, timeout?: number): void {\n let url: URL;\n try { url = new URL(baseUrl); } catch { throw new ValidationError(\"baseUrl must be an absolute HTTP(S) URL.\"); }\n if (![\"http:\", \"https:\"].includes(url.protocol)) throw new ValidationError(\"baseUrl must be an absolute HTTP(S) URL.\");\n const local = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname);\n if (url.protocol !== \"https:\" && !local) throw new ValidationError(\"baseUrl must use HTTPS except for local development.\");\n if (timeout !== undefined && (!Number.isFinite(timeout) || timeout <= 0)) throw new ValidationError(\"timeout must be a positive number.\");\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -163,7 +163,7 @@ interface NewTqniaClientOptions {
|
|
|
163
163
|
fetch?: Fetch;
|
|
164
164
|
/** Retry behavior for rate limits, server errors, and temporary network failures. */
|
|
165
165
|
retry?: RetryOptions;
|
|
166
|
-
/** User-Agent header. @default "newtqnia-node/1.1.
|
|
166
|
+
/** User-Agent header. @default "newtqnia-node/1.1.1" */
|
|
167
167
|
userAgent?: string;
|
|
168
168
|
/** Headers included with every request. */
|
|
169
169
|
defaultHeaders?: Record<string, string>;
|
package/dist/index.d.ts
CHANGED
|
@@ -163,7 +163,7 @@ interface NewTqniaClientOptions {
|
|
|
163
163
|
fetch?: Fetch;
|
|
164
164
|
/** Retry behavior for rate limits, server errors, and temporary network failures. */
|
|
165
165
|
retry?: RetryOptions;
|
|
166
|
-
/** User-Agent header. @default "newtqnia-node/1.1.
|
|
166
|
+
/** User-Agent header. @default "newtqnia-node/1.1.1" */
|
|
167
167
|
userAgent?: string;
|
|
168
168
|
/** Headers included with every request. */
|
|
169
169
|
defaultHeaders?: Record<string, string>;
|
package/dist/index.js
CHANGED
|
@@ -221,7 +221,7 @@ var NewTqniaClient = class {
|
|
|
221
221
|
initialDelayMs: options.retry?.initialDelayMs ?? 500,
|
|
222
222
|
maxDelayMs: options.retry?.maxDelayMs ?? 8e3
|
|
223
223
|
},
|
|
224
|
-
userAgent: options.userAgent ?? "newtqnia-node/1.1.
|
|
224
|
+
userAgent: options.userAgent ?? "newtqnia-node/1.1.1",
|
|
225
225
|
headers: options.defaultHeaders ?? {},
|
|
226
226
|
...options.signal ? { signal: options.signal } : {}
|
|
227
227
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/index.ts","../src/resources/news.ts","../src/utils/query.ts","../src/transport/transport.ts","../src/client/client.ts"],"names":["signal"],"mappings":";AASO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EAC9B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiB,OAAA,GAAwB,EAAC,EAAG;AACvD,IAAA,KAAA,CAAM,OAAA,EAAS,QAAQ,KAAA,KAAU,MAAA,GAAY,SAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AACjF,IAAA,IAAA,CAAK,OAAO,GAAA,CAAA,MAAA,CAAW,IAAA;AACvB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAAA,EACtB;AACF;AACO,IAAM,mBAAA,GAAN,cAAkC,aAAA,CAAc;AAAC;AACjD,IAAM,kBAAA,GAAN,cAAiC,aAAA,CAAc;AAAC;AAChD,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAAC;AAC7C,IAAM,aAAA,GAAN,cAA4B,aAAA,CAAc;AAAC;AAC3C,IAAM,aAAA,GAAN,cAA4B,aAAA,CAAc;AAAC;AAC3C,IAAM,cAAA,GAAN,cAA6B,aAAA,CAAc;AAAC;AAC5C,IAAM,WAAA,GAAN,cAA0B,aAAA,CAAc;AAAC;AACzC,IAAM,YAAA,GAAN,cAA2B,aAAA,CAAc;AAAC;AAC1C,IAAM,YAAA,GAAN,cAA2B,aAAA,CAAc;AAAC;;;AC3B1C,IAAM,eAAN,MAAmB;AAAA;AAAA,EAExB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA;AAAA,EAG7B,KAAA,CAAM,MAAA,GAAyB,EAAC,EAAoB;AAClD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,MAAM,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,MAAA,CAAO,MAAA,GAAyB,EAAC,EAAoB;AACnD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AAAA,EAClC;AAAA,EAEQ,GAAA,CAAI,YAAgC,MAAA,EAAyC;AACnF,IAAA,IAAI,MAAA,CAAO,WAAW,MAAA,IAAa,MAAA,CAAO,WAAW,IAAA,IAAQ,MAAA,CAAO,WAAW,IAAA,EAAM;AACnF,MAAA,MAAM,IAAI,gBAAgB,8BAA8B,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,MAAA,CAAO,KAAA,KAAU,MAAA,KAAc,CAAC,OAAO,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA,IAAK,MAAA,CAAO,KAAA,GAAQ,CAAA,IAAK,MAAA,CAAO,QAAQ,EAAA,CAAA,EAAK;AAC5G,MAAA,MAAM,IAAI,gBAAgB,4CAA4C,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,OAAO,QAAA,KAAa,MAAA,IAAa,OAAO,QAAA,CAAS,IAAA,OAAW,EAAA,EAAI;AAClE,MAAA,MAAM,IAAI,gBAAgB,2BAA2B,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAgB;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,YAAY,UAAU,CAAA,CAAA;AAAA,MAC5B,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,MAAA,CAAO,QAAA,EAAS;AAAA,MAC/E,GAAI,OAAO,MAAA,GAAS,EAAE,QAAQ,MAAA,CAAO,MAAA,KAAW;AAAC,KAClD,CAAA;AAAA,EACH;AACF,CAAA;;;ACpCO,SAAS,eAAe,MAAA,EAAuE;AACpG,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,UAAU,MAAA,EAAW,MAAA,CAAO,OAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,OAAO,QAAA,EAAS;AACzB;;;ACCA,IAAM,SAAA,uBAAgB,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAgB5C,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,OAAA,EAA2B;AAA3B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAA4B;AAAA,EAA5B,OAAA;AAAA,EAE7B,MAAM,QAAW,OAAA,EAAqC;AACpD,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,GAAQ,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAA;AAC9D,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,EAAG,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA,CAAA;AAC7E,IAAA,IAAI,SAAA;AAEJ,IAAA,KAAA,IAAS,OAAA,GAAU,GAAG,OAAA,IAAW,IAAA,CAAK,QAAQ,KAAA,CAAM,UAAA,EAAY,WAAW,CAAA,EAAG;AAC5E,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,OAAO,CAAA;AAClD,QAAA,IAAI,SAAS,EAAA,EAAI,OAAO,MAAM,IAAA,CAAK,OAAU,QAAQ,CAAA;AACrD,QAAA,IAAI,SAAA,CAAU,IAAI,QAAA,CAAS,MAAM,KAAK,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,UAAA,EAAY;AAC7E,UAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,UAAA,CAAW,UAAU,OAAO,CAAA,EAAG,QAAQ,MAAM,CAAA;AACnE,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,MACpC,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,KAAA,YAAiB,eAAe,MAAM,KAAA;AAC1C,QAAA,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,MAAM,GAAG,MAAM,KAAA;AAC7C,QAAA,IAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,QAAS,IAAI,YAAA,CAAa,CAAA,wBAAA,EAA2B,IAAA,CAAK,QAAQ,OAAO,CAAA,EAAA,CAAA,EAAM,EAAE,KAAA,EAAO,OAAO,CAAA;AACvH,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,IAAI,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,UAAA,EAAY;AAC3C,UAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,OAAO,CAAA,EAAG,QAAQ,MAAM,CAAA;AACtD,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,IAAI,YAAA,CAAa,mCAAA,EAAqC,EAAE,KAAA,EAAO,WAAW,CAAA;AAAA,EAClF;AAAA,EAEA,MAAc,SAAA,CAAU,GAAA,EAAa,OAAA,EAA4C;AAC/E,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,QAAQ,OAAO,CAAA;AACxD,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,CAAO,CAACA,OAAAA,KAAkCA,YAAW,MAAS,CAAA;AAC7H,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAA,CAAK,QAAQ,OAAO,CAAA;AAChD,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,kBAAkB,CAAA;AACxC,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAChD,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAI,WAAA,EAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACrE,IAAA,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAa,OAAA,CAAQ,IAAI,gBAAA,EAAkB,IAAA,CAAK,QAAQ,WAAW,CAAA;AACpF,IAAA,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAa,OAAA,CAAQ,IAAI,wBAAA,EAA0B,IAAA,CAAK,QAAQ,WAAW,CAAA;AAC5F,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS,OAAA,CAAQ,IAAI,oBAAA,EAAsB,IAAA,CAAK,QAAQ,OAAO,CAAA;AAChF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAK,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,MAAA,IAAU,IAAA,EAAM,CAAA;AAAA,EAC5F;AAAA,EAEA,MAAc,OAAU,QAAA,EAAgC;AACtD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,cAAc,gCAAA,EAAkC;AAAA,QACxD,QAAQ,QAAA,CAAS,MAAA;AAAA,QAAQ,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,QAAG;AAAA,OAC/D,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,QAAA,EAA4C;AACjE,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACnD,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,OAAA,KAAY,WAAW,IAAA,CAAK,OAAA,GAAU,CAAA,wCAAA,EAA2C,QAAA,CAAS,MAAM,CAAA,CAAA,CAAA;AAC5H,IAAA,MAAM,aAAa,IAAA,CAAK,eAAA,CAAgB,SAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA;AAC3E,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,MAClC,UAAA;AAAA,MACA,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO;AAAA,KACpD;AACA,IAAA,IAAI,SAAS,MAAA,KAAW,GAAA,SAAY,IAAI,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC5E,IAAA,IAAI,SAAS,MAAA,KAAW,GAAA,SAAY,IAAI,kBAAA,CAAmB,SAAS,OAAO,CAAA;AAC3E,IAAA,IAAI,SAAS,MAAA,KAAW,GAAA,SAAY,IAAI,aAAA,CAAc,SAAS,OAAO,CAAA;AACtE,IAAA,IAAI,SAAS,MAAA,KAAW,GAAA,SAAY,IAAI,aAAA,CAAc,SAAS,OAAO,CAAA;AACtE,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,MAAA,KAAW,KAAK,OAAO,IAAI,eAAA,CAAgB,OAAA,EAAS,OAAO,CAAA;AACnG,IAAA,IAAI,SAAS,MAAA,KAAW,GAAA,SAAY,IAAI,cAAA,CAAe,SAAS,OAAO,CAAA;AACvE,IAAA,IAAI,SAAS,MAAA,IAAU,GAAA,SAAY,IAAI,WAAA,CAAY,SAAS,OAAO,CAAA;AACnE,IAAA,OAAO,IAAI,aAAA,CAAc,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,UAAA,CAAW,UAAoB,OAAA,EAAyB;AAC9D,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAAA,EAC1F;AAAA,EACQ,gBAAgB,KAAA,EAA0C;AAChE,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,IAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC5B,IAAA,IAAI,MAAA,CAAO,SAAS,OAAO,CAAA,SAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,GAAI,CAAA;AAC/D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC7B,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,EACvE;AAAA,EACQ,QAAQ,OAAA,EAAyB;AACvC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,iBAAkB,CAAA,IAAK,OAAA;AACtD,IAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,MAAM,UAAU,CAAA;AAAA,EACpD;AAAA,EACA,MAAc,KAAA,CAAM,EAAA,EAAY,MAAA,EAAqC;AACnE,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,EAAE,CAAA;AACpC,MAAA,MAAA,EAAQ,gBAAA,CAAiB,SAAS,MAAM;AAAE,QAAA,YAAA,CAAa,KAAK,CAAA;AAAG,QAAA,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,MAAG,CAAA,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IACzG,CAAC,CAAA;AAAA,EACH;AAAA,EACQ,UAAU,QAAA,EAAwC;AACxD,IAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,MAAA;AAAA,EACjD;AAAA,EACQ,eAAe,OAAA,EAAiD;AACtE,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACjC,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,QAAQ,CAAC,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAAwB;AACrC,MAAA,IAAI,CAAC,UAAA,CAAW,MAAA,CAAO,SAAS,UAAA,CAAW,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,IAChE,CAAA;AACA,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,KAAA,CAAM,MAAM,CAAA;AACZ,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IACtE;AACA,IAAA,OAAO,UAAA,CAAW,MAAA;AAAA,EACpB;AAAA,EACQ,aAAa,MAAA,EAA+B;AAClD,IAAA,OAAO,QAAQ,MAAA,EAAQ,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAAA,EAChE;AAAA,EACQ,UAAU,KAAA,EAAyB;AACzC,IAAA,OAAO,KAAA,YAAiB,YAAA,KAAiB,KAAA,CAAM,IAAA,KAAS,cAAA,IAAkB,KAAA,CAAM,IAAA,KAAS,YAAA,CAAA,IACpF,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,OAAA;AAAA,EAC7B;AACF,CAAA;;;ACjHO,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAEjB,IAAA;AAAA,EAET,WAAA,CAAY,OAAA,GAAiC,EAAC,EAAG;AAC/C,IAAA,MAAM,WAAW,OAAA,CAAQ,OAAA,IAAW,0BAAA,EAA4B,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAClF,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AACtC,IAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,MAC9B,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW,EAAC;AAAA,MACnD,GAAI,QAAQ,WAAA,GAAc,EAAE,aAAa,OAAA,CAAQ,WAAA,KAAgB,EAAC;AAAA,MAClE,GAAI,QAAQ,WAAA,GAAc,EAAE,aAAa,OAAA,CAAQ,WAAA,KAAgB,EAAC;AAAA,MAClE,GAAI,QAAQ,OAAA,GAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,KAAY,EAAC;AAAA,MACtD,OAAA;AAAA,MACA,OAAA,EAAS,QAAQ,OAAA,IAAW,GAAA;AAAA,MAC5B,OAAO,OAAA,CAAQ,KAAA,IAAS,UAAA,CAAW,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,MACxD,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,OAAA,CAAQ,KAAA,EAAO,UAAA,IAAc,CAAA;AAAA,QACzC,cAAA,EAAgB,OAAA,CAAQ,KAAA,EAAO,cAAA,IAAkB,GAAA;AAAA,QACjD,UAAA,EAAY,OAAA,CAAQ,KAAA,EAAO,UAAA,IAAc;AAAA,OAC3C;AAAA,MACA,SAAA,EAAW,QAAQ,SAAA,IAAa,qBAAA;AAAA,MAChC,OAAA,EAAS,OAAA,CAAQ,cAAA,IAAkB,EAAC;AAAA,MACpC,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,YAAA,CAAa,SAAS,CAAA;AAAA,EACxC;AAAA,EAEQ,QAAA,CAAS,SAAiB,OAAA,EAAwB;AACxD,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AAAE,MAAA,GAAA,GAAM,IAAI,IAAI,OAAO,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAE,MAAA,MAAM,IAAI,gBAAgB,0CAA0C,CAAA;AAAA,IAAG;AAC/G,IAAA,IAAI,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG,MAAM,IAAI,eAAA,CAAgB,0CAA0C,CAAA;AACrH,IAAA,MAAM,KAAA,GAAQ,CAAC,WAAA,EAAa,WAAA,EAAa,OAAO,CAAA,CAAE,QAAA,CAAS,IAAI,QAAQ,CAAA;AACvE,IAAA,IAAI,GAAA,CAAI,aAAa,QAAA,IAAY,CAAC,OAAO,MAAM,IAAI,gBAAgB,sDAAsD,CAAA;AACzH,IAAA,IAAI,OAAA,KAAY,MAAA,KAAc,CAAC,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,IAAK,OAAA,IAAW,CAAA,CAAA,EAAI,MAAM,IAAI,eAAA,CAAgB,oCAAoC,CAAA;AAAA,EAC1I;AACF","file":"index.js","sourcesContent":["export interface ErrorOptions {\n status?: number | undefined;\n requestId?: string | undefined;\n retryAfter?: number | undefined;\n code?: string | undefined;\n cause?: unknown | undefined;\n}\n\n/** Base class for all SDK errors. */\nexport class NewTqniaError extends Error {\n readonly status: number | undefined;\n readonly requestId: string | undefined;\n readonly retryAfter: number | undefined;\n readonly code: string | undefined;\n\n constructor(message: string, options: ErrorOptions = {}) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = new.target.name;\n this.status = options.status;\n this.requestId = options.requestId;\n this.retryAfter = options.retryAfter;\n this.code = options.code;\n }\n}\nexport class AuthenticationError extends NewTqniaError {}\nexport class AuthorizationError extends NewTqniaError {}\nexport class ValidationError extends NewTqniaError {}\nexport class NotFoundError extends NewTqniaError {}\nexport class ConflictError extends NewTqniaError {}\nexport class RateLimitError extends NewTqniaError {}\nexport class ServerError extends NewTqniaError {}\nexport class TimeoutError extends NewTqniaError {}\nexport class NetworkError extends NewTqniaError {}\n","import { ValidationError } from \"../errors/index.js\";\nimport type { Digest, NewsListParams } from \"../models/index.js\";\nimport type { Transport } from \"../transport/transport.js\";\n\n/** Access localized NewTqnia news collections. */\nexport class NewsResource {\n /** @internal */\n constructor(private readonly transport: Transport) {}\n\n /** Get articles published today using the Asia/Dubai day boundary. */\n today(params: NewsListParams = {}): Promise<Digest> {\n return this.get(\"today\", params);\n }\n\n /** Get the latest published articles. */\n latest(params: NewsListParams = {}): Promise<Digest> {\n return this.get(\"latest\", params);\n }\n\n private get(collection: \"today\" | \"latest\", params: NewsListParams): Promise<Digest> {\n if (params.locale !== undefined && params.locale !== \"en\" && params.locale !== \"ar\") {\n throw new ValidationError('locale must be \"en\" or \"ar\".');\n }\n if (params.limit !== undefined && (!Number.isInteger(params.limit) || params.limit < 1 || params.limit > 10)) {\n throw new ValidationError(\"limit must be an integer between 1 and 10.\");\n }\n if (params.category !== undefined && params.category.trim() === \"\") {\n throw new ValidationError(\"category cannot be empty.\");\n }\n return this.transport.request<Digest>({\n method: \"GET\",\n path: `/v1/news/${collection}`,\n query: { locale: params.locale, limit: params.limit, category: params.category },\n ...(params.signal ? { signal: params.signal } : {}),\n });\n }\n}\n","export function serializeQuery(values: Record<string, string | number | boolean | undefined>): string {\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) search.append(key, String(value));\n }\n return search.toString();\n}\n","import {\n AuthenticationError, AuthorizationError, ConflictError, NetworkError, NewTqniaError,\n NotFoundError, RateLimitError, ServerError, TimeoutError, ValidationError,\n} from \"../errors/index.js\";\nimport { serializeQuery } from \"../utils/query.js\";\nimport type { Fetch, RequestOptions, RetryOptions } from \"./types.js\";\n\nconst RETRYABLE = new Set([429, 500, 502, 503, 504]);\n\nexport interface TransportOptions {\n apiKey?: string;\n rapidApiKey?: string;\n application?: string;\n website?: string;\n baseUrl: string;\n timeout: number;\n fetch: Fetch;\n retry: Required<RetryOptions>;\n userAgent: string;\n headers: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class Transport {\n constructor(private readonly options: TransportOptions) {}\n\n async request<T>(request: RequestOptions): Promise<T> {\n const query = request.query ? serializeQuery(request.query) : \"\";\n const url = `${this.options.baseUrl}${request.path}${query ? `?${query}` : \"\"}`;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.options.retry.maxRetries; attempt += 1) {\n try {\n const response = await this.fetchOnce(url, request);\n if (response.ok) return await this.decode<T>(response);\n if (RETRYABLE.has(response.status) && attempt < this.options.retry.maxRetries) {\n await this.pause(this.retryDelay(response, attempt), request.signal);\n continue;\n }\n throw await this.apiError(response);\n } catch (error) {\n if (error instanceof NewTqniaError) throw error;\n if (this.wasCancelled(request.signal)) throw error;\n if (this.isTimeout(error)) throw new TimeoutError(`Request timed out after ${this.options.timeout}ms`, { cause: error });\n lastError = error;\n if (attempt < this.options.retry.maxRetries) {\n await this.pause(this.backoff(attempt), request.signal);\n continue;\n }\n }\n }\n throw new NetworkError(\"Unable to reach the NewTqnia API.\", { cause: lastError });\n }\n\n private async fetchOnce(url: string, request: RequestOptions): Promise<Response> {\n const timeout = AbortSignal.timeout(this.options.timeout);\n const signals = [timeout, this.options.signal, request.signal].filter((signal): signal is AbortSignal => signal !== undefined);\n const signal = this.combineSignals(signals);\n const headers = new Headers(this.options.headers);\n headers.set(\"Accept\", \"application/json\");\n headers.set(\"User-Agent\", this.options.userAgent);\n if (this.options.apiKey) headers.set(\"X-API-Key\", this.options.apiKey);\n if (this.options.rapidApiKey) headers.set(\"X-RapidAPI-Key\", this.options.rapidApiKey);\n if (this.options.application) headers.set(\"X-NewTqnia-Application\", this.options.application);\n if (this.options.website) headers.set(\"X-NewTqnia-Website\", this.options.website);\n return this.options.fetch(url, { method: request.method, headers, signal: signal ?? null });\n }\n\n private async decode<T>(response: Response): Promise<T> {\n try {\n return await response.json() as T;\n } catch (cause) {\n throw new NewTqniaError(\"The API returned invalid JSON.\", {\n status: response.status, requestId: this.requestId(response), cause,\n });\n }\n }\n\n private async apiError(response: Response): Promise<NewTqniaError> {\n const data = await response.json().catch(() => ({})) as Record<string, unknown>;\n const message = typeof data.message === \"string\" ? data.message : `NewTqnia API request failed with status ${response.status}.`;\n const retryAfter = this.parseRetryAfter(response.headers.get(\"retry-after\"));\n const options = {\n status: response.status,\n requestId: this.requestId(response),\n retryAfter,\n code: typeof data.code === \"string\" ? data.code : undefined,\n };\n if (response.status === 401) return new AuthenticationError(message, options);\n if (response.status === 403) return new AuthorizationError(message, options);\n if (response.status === 404) return new NotFoundError(message, options);\n if (response.status === 409) return new ConflictError(message, options);\n if (response.status === 422 || response.status === 400) return new ValidationError(message, options);\n if (response.status === 429) return new RateLimitError(message, options);\n if (response.status >= 500) return new ServerError(message, options);\n return new NewTqniaError(message, options);\n }\n\n private retryDelay(response: Response, attempt: number): number {\n return this.parseRetryAfter(response.headers.get(\"retry-after\")) ?? this.backoff(attempt);\n }\n private parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) return Math.max(0, seconds * 1000);\n const date = Date.parse(value);\n return Number.isNaN(date) ? undefined : Math.max(0, date - Date.now());\n }\n private backoff(attempt: number): number {\n const raw = this.options.retry.initialDelayMs * (2 ** attempt);\n return Math.min(raw, this.options.retry.maxDelayMs);\n }\n private async pause(ms: number, signal?: AbortSignal): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\"abort\", () => { clearTimeout(timer); reject(signal.reason); }, { once: true });\n });\n }\n private requestId(response: Response): string | undefined {\n return response.headers.get(\"x-request-id\") ?? undefined;\n }\n private combineSignals(signals: AbortSignal[]): AbortSignal | undefined {\n if (signals.length === 0) return undefined;\n if (signals.length === 1) return signals[0];\n const controller = new AbortController();\n const abort = (signal: AbortSignal) => {\n if (!controller.signal.aborted) controller.abort(signal.reason);\n };\n for (const signal of signals) {\n if (signal.aborted) {\n abort(signal);\n break;\n }\n signal.addEventListener(\"abort\", () => abort(signal), { once: true });\n }\n return controller.signal;\n }\n private wasCancelled(signal?: AbortSignal): boolean {\n return Boolean(signal?.aborted || this.options.signal?.aborted);\n }\n private isTimeout(error: unknown): boolean {\n return error instanceof DOMException && (error.name === \"TimeoutError\" || error.name === \"AbortError\")\n && !this.options.signal?.aborted;\n }\n}\n","import { ValidationError } from \"../errors/index.js\";\nimport { NewsResource } from \"../resources/news.js\";\nimport { Transport } from \"../transport/transport.js\";\nimport type { Fetch, RetryOptions } from \"../transport/types.js\";\n\nexport interface NewTqniaClientOptions {\n /** Optional NewTqnia API key sent as X-API-Key. */\n apiKey?: string;\n /** Optional RapidAPI key sent as X-RapidAPI-Key. */\n rapidApiKey?: string;\n /** Optional caller application name. */\n application?: string;\n /** Optional caller website origin. */\n website?: string;\n /** API origin. @default \"https://api.newtqnia.com\" */\n baseUrl?: string;\n /** Request timeout in milliseconds. @default 30000 */\n timeout?: number;\n /** Cancels every request made by this client. */\n signal?: AbortSignal;\n /** Custom Fetch-compatible implementation. */\n fetch?: Fetch;\n /** Retry behavior for rate limits, server errors, and temporary network failures. */\n retry?: RetryOptions;\n /** User-Agent header. @default \"newtqnia-node/1.1.0\" */\n userAgent?: string;\n /** Headers included with every request. */\n defaultHeaders?: Record<string, string>;\n}\n\n/** Official NewTqnia API client. */\nexport class NewTqniaClient {\n /** Localized news endpoints. */\n readonly news: NewsResource;\n\n constructor(options: NewTqniaClientOptions = {}) {\n const baseUrl = (options.baseUrl ?? \"https://api.newtqnia.com\").replace(/\\/+$/, \"\");\n this.validate(baseUrl, options.timeout);\n const transport = new Transport({\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n ...(options.rapidApiKey ? { rapidApiKey: options.rapidApiKey } : {}),\n ...(options.application ? { application: options.application } : {}),\n ...(options.website ? { website: options.website } : {}),\n baseUrl,\n timeout: options.timeout ?? 30_000,\n fetch: options.fetch ?? globalThis.fetch.bind(globalThis),\n retry: {\n maxRetries: options.retry?.maxRetries ?? 2,\n initialDelayMs: options.retry?.initialDelayMs ?? 500,\n maxDelayMs: options.retry?.maxDelayMs ?? 8_000,\n },\n userAgent: options.userAgent ?? \"newtqnia-node/1.1.0\",\n headers: options.defaultHeaders ?? {},\n ...(options.signal ? { signal: options.signal } : {}),\n });\n this.news = new NewsResource(transport);\n }\n\n private validate(baseUrl: string, timeout?: number): void {\n let url: URL;\n try { url = new URL(baseUrl); } catch { throw new ValidationError(\"baseUrl must be an absolute HTTP(S) URL.\"); }\n if (![\"http:\", \"https:\"].includes(url.protocol)) throw new ValidationError(\"baseUrl must be an absolute HTTP(S) URL.\");\n const local = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname);\n if (url.protocol !== \"https:\" && !local) throw new ValidationError(\"baseUrl must use HTTPS except for local development.\");\n if (timeout !== undefined && (!Number.isFinite(timeout) || timeout <= 0)) throw new ValidationError(\"timeout must be a positive number.\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/index.ts","../src/resources/news.ts","../src/utils/query.ts","../src/transport/transport.ts","../src/client/client.ts"],"names":["signal"],"mappings":"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","file":"index.js","sourcesContent":["export interface ErrorOptions {\n status?: number | undefined;\n requestId?: string | undefined;\n retryAfter?: number | undefined;\n code?: string | undefined;\n cause?: unknown | undefined;\n}\n\n/** Base class for all SDK errors. */\nexport class NewTqniaError extends Error {\n readonly status: number | undefined;\n readonly requestId: string | undefined;\n readonly retryAfter: number | undefined;\n readonly code: string | undefined;\n\n constructor(message: string, options: ErrorOptions = {}) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = new.target.name;\n this.status = options.status;\n this.requestId = options.requestId;\n this.retryAfter = options.retryAfter;\n this.code = options.code;\n }\n}\nexport class AuthenticationError extends NewTqniaError {}\nexport class AuthorizationError extends NewTqniaError {}\nexport class ValidationError extends NewTqniaError {}\nexport class NotFoundError extends NewTqniaError {}\nexport class ConflictError extends NewTqniaError {}\nexport class RateLimitError extends NewTqniaError {}\nexport class ServerError extends NewTqniaError {}\nexport class TimeoutError extends NewTqniaError {}\nexport class NetworkError extends NewTqniaError {}\n","import { ValidationError } from \"../errors/index.js\";\nimport type { Digest, NewsListParams } from \"../models/index.js\";\nimport type { Transport } from \"../transport/transport.js\";\n\n/** Access localized NewTqnia news collections. */\nexport class NewsResource {\n /** @internal */\n constructor(private readonly transport: Transport) {}\n\n /** Get articles published today using the Asia/Dubai day boundary. */\n today(params: NewsListParams = {}): Promise<Digest> {\n return this.get(\"today\", params);\n }\n\n /** Get the latest published articles. */\n latest(params: NewsListParams = {}): Promise<Digest> {\n return this.get(\"latest\", params);\n }\n\n private get(collection: \"today\" | \"latest\", params: NewsListParams): Promise<Digest> {\n if (params.locale !== undefined && params.locale !== \"en\" && params.locale !== \"ar\") {\n throw new ValidationError('locale must be \"en\" or \"ar\".');\n }\n if (params.limit !== undefined && (!Number.isInteger(params.limit) || params.limit < 1 || params.limit > 10)) {\n throw new ValidationError(\"limit must be an integer between 1 and 10.\");\n }\n if (params.category !== undefined && params.category.trim() === \"\") {\n throw new ValidationError(\"category cannot be empty.\");\n }\n return this.transport.request<Digest>({\n method: \"GET\",\n path: `/v1/news/${collection}`,\n query: { locale: params.locale, limit: params.limit, category: params.category },\n ...(params.signal ? { signal: params.signal } : {}),\n });\n }\n}\n","export function serializeQuery(values: Record<string, string | number | boolean | undefined>): string {\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) search.append(key, String(value));\n }\n return search.toString();\n}\n","import {\n AuthenticationError, AuthorizationError, ConflictError, NetworkError, NewTqniaError,\n NotFoundError, RateLimitError, ServerError, TimeoutError, ValidationError,\n} from \"../errors/index.js\";\nimport { serializeQuery } from \"../utils/query.js\";\nimport type { Fetch, RequestOptions, RetryOptions } from \"./types.js\";\n\nconst RETRYABLE = new Set([429, 500, 502, 503, 504]);\n\nexport interface TransportOptions {\n apiKey?: string;\n rapidApiKey?: string;\n application?: string;\n website?: string;\n baseUrl: string;\n timeout: number;\n fetch: Fetch;\n retry: Required<RetryOptions>;\n userAgent: string;\n headers: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class Transport {\n constructor(private readonly options: TransportOptions) {}\n\n async request<T>(request: RequestOptions): Promise<T> {\n const query = request.query ? serializeQuery(request.query) : \"\";\n const url = `${this.options.baseUrl}${request.path}${query ? `?${query}` : \"\"}`;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.options.retry.maxRetries; attempt += 1) {\n try {\n const response = await this.fetchOnce(url, request);\n if (response.ok) return await this.decode<T>(response);\n if (RETRYABLE.has(response.status) && attempt < this.options.retry.maxRetries) {\n await this.pause(this.retryDelay(response, attempt), request.signal);\n continue;\n }\n throw await this.apiError(response);\n } catch (error) {\n if (error instanceof NewTqniaError) throw error;\n if (this.wasCancelled(request.signal)) throw error;\n if (this.isTimeout(error)) throw new TimeoutError(`Request timed out after ${this.options.timeout}ms`, { cause: error });\n lastError = error;\n if (attempt < this.options.retry.maxRetries) {\n await this.pause(this.backoff(attempt), request.signal);\n continue;\n }\n }\n }\n throw new NetworkError(\"Unable to reach the NewTqnia API.\", { cause: lastError });\n }\n\n private async fetchOnce(url: string, request: RequestOptions): Promise<Response> {\n const timeout = AbortSignal.timeout(this.options.timeout);\n const signals = [timeout, this.options.signal, request.signal].filter((signal): signal is AbortSignal => signal !== undefined);\n const signal = this.combineSignals(signals);\n const headers = new Headers(this.options.headers);\n headers.set(\"Accept\", \"application/json\");\n headers.set(\"User-Agent\", this.options.userAgent);\n if (this.options.apiKey) headers.set(\"X-API-Key\", this.options.apiKey);\n if (this.options.rapidApiKey) headers.set(\"X-RapidAPI-Key\", this.options.rapidApiKey);\n if (this.options.application) headers.set(\"X-NewTqnia-Application\", this.options.application);\n if (this.options.website) headers.set(\"X-NewTqnia-Website\", this.options.website);\n return this.options.fetch(url, { method: request.method, headers, signal: signal ?? null });\n }\n\n private async decode<T>(response: Response): Promise<T> {\n try {\n return await response.json() as T;\n } catch (cause) {\n throw new NewTqniaError(\"The API returned invalid JSON.\", {\n status: response.status, requestId: this.requestId(response), cause,\n });\n }\n }\n\n private async apiError(response: Response): Promise<NewTqniaError> {\n const data = await response.json().catch(() => ({})) as Record<string, unknown>;\n const message = typeof data.message === \"string\" ? data.message : `NewTqnia API request failed with status ${response.status}.`;\n const retryAfter = this.parseRetryAfter(response.headers.get(\"retry-after\"));\n const options = {\n status: response.status,\n requestId: this.requestId(response),\n retryAfter,\n code: typeof data.code === \"string\" ? data.code : undefined,\n };\n if (response.status === 401) return new AuthenticationError(message, options);\n if (response.status === 403) return new AuthorizationError(message, options);\n if (response.status === 404) return new NotFoundError(message, options);\n if (response.status === 409) return new ConflictError(message, options);\n if (response.status === 422 || response.status === 400) return new ValidationError(message, options);\n if (response.status === 429) return new RateLimitError(message, options);\n if (response.status >= 500) return new ServerError(message, options);\n return new NewTqniaError(message, options);\n }\n\n private retryDelay(response: Response, attempt: number): number {\n return this.parseRetryAfter(response.headers.get(\"retry-after\")) ?? this.backoff(attempt);\n }\n private parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) return Math.max(0, seconds * 1000);\n const date = Date.parse(value);\n return Number.isNaN(date) ? undefined : Math.max(0, date - Date.now());\n }\n private backoff(attempt: number): number {\n const raw = this.options.retry.initialDelayMs * (2 ** attempt);\n return Math.min(raw, this.options.retry.maxDelayMs);\n }\n private async pause(ms: number, signal?: AbortSignal): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\"abort\", () => { clearTimeout(timer); reject(signal.reason); }, { once: true });\n });\n }\n private requestId(response: Response): string | undefined {\n return response.headers.get(\"x-request-id\") ?? undefined;\n }\n private combineSignals(signals: AbortSignal[]): AbortSignal | undefined {\n if (signals.length === 0) return undefined;\n if (signals.length === 1) return signals[0];\n const controller = new AbortController();\n const abort = (signal: AbortSignal) => {\n if (!controller.signal.aborted) controller.abort(signal.reason);\n };\n for (const signal of signals) {\n if (signal.aborted) {\n abort(signal);\n break;\n }\n signal.addEventListener(\"abort\", () => abort(signal), { once: true });\n }\n return controller.signal;\n }\n private wasCancelled(signal?: AbortSignal): boolean {\n return Boolean(signal?.aborted || this.options.signal?.aborted);\n }\n private isTimeout(error: unknown): boolean {\n return error instanceof DOMException && (error.name === \"TimeoutError\" || error.name === \"AbortError\")\n && !this.options.signal?.aborted;\n }\n}\n","import { ValidationError } from \"../errors/index.js\";\nimport { NewsResource } from \"../resources/news.js\";\nimport { Transport } from \"../transport/transport.js\";\nimport type { Fetch, RetryOptions } from \"../transport/types.js\";\n\nexport interface NewTqniaClientOptions {\n /** Optional NewTqnia API key sent as X-API-Key. */\n apiKey?: string;\n /** Optional RapidAPI key sent as X-RapidAPI-Key. */\n rapidApiKey?: string;\n /** Optional caller application name. */\n application?: string;\n /** Optional caller website origin. */\n website?: string;\n /** API origin. @default \"https://api.newtqnia.com\" */\n baseUrl?: string;\n /** Request timeout in milliseconds. @default 30000 */\n timeout?: number;\n /** Cancels every request made by this client. */\n signal?: AbortSignal;\n /** Custom Fetch-compatible implementation. */\n fetch?: Fetch;\n /** Retry behavior for rate limits, server errors, and temporary network failures. */\n retry?: RetryOptions;\n /** User-Agent header. @default \"newtqnia-node/1.1.1\" */\n userAgent?: string;\n /** Headers included with every request. */\n defaultHeaders?: Record<string, string>;\n}\n\n/** Official NewTqnia API client. */\nexport class NewTqniaClient {\n /** Localized news endpoints. */\n readonly news: NewsResource;\n\n constructor(options: NewTqniaClientOptions = {}) {\n const baseUrl = (options.baseUrl ?? \"https://api.newtqnia.com\").replace(/\\/+$/, \"\");\n this.validate(baseUrl, options.timeout);\n const transport = new Transport({\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n ...(options.rapidApiKey ? { rapidApiKey: options.rapidApiKey } : {}),\n ...(options.application ? { application: options.application } : {}),\n ...(options.website ? { website: options.website } : {}),\n baseUrl,\n timeout: options.timeout ?? 30_000,\n fetch: options.fetch ?? globalThis.fetch.bind(globalThis),\n retry: {\n maxRetries: options.retry?.maxRetries ?? 2,\n initialDelayMs: options.retry?.initialDelayMs ?? 500,\n maxDelayMs: options.retry?.maxDelayMs ?? 8_000,\n },\n userAgent: options.userAgent ?? \"newtqnia-node/1.1.1\",\n headers: options.defaultHeaders ?? {},\n ...(options.signal ? { signal: options.signal } : {}),\n });\n this.news = new NewsResource(transport);\n }\n\n private validate(baseUrl: string, timeout?: number): void {\n let url: URL;\n try { url = new URL(baseUrl); } catch { throw new ValidationError(\"baseUrl must be an absolute HTTP(S) URL.\"); }\n if (![\"http:\", \"https:\"].includes(url.protocol)) throw new ValidationError(\"baseUrl must be an absolute HTTP(S) URL.\");\n const local = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname);\n if (url.protocol !== \"https:\" && !local) throw new ValidationError(\"baseUrl must use HTTPS except for local development.\");\n if (timeout !== undefined && (!Number.isFinite(timeout) || timeout <= 0)) throw new ValidationError(\"timeout must be a positive number.\");\n }\n}\n"]}
|