@trillboards/ads-sdk 2.1.0 → 2.2.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/CHANGELOG.md +18 -0
- package/README.md +9 -1
- package/dist/cli.js +2 -2
- package/dist/index.d.mts +45 -5
- package/dist/index.d.ts +45 -5
- package/dist/index.js +128 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +128 -11
- package/dist/index.mjs.map +1 -1
- package/dist/react-native.d.mts +2 -0
- package/dist/react-native.d.ts +2 -0
- package/dist/react-native.js +1 -0
- package/dist/react-native.js.map +1 -1
- package/dist/react-native.mjs +1 -0
- package/dist/react-native.mjs.map +1 -1
- package/dist/react.d.mts +6 -0
- package/dist/react.d.ts +6 -0
- package/dist/react.js +130 -8
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +130 -8
- package/dist/react.mjs.map +1 -1
- package/dist/server.js +6 -2
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +6 -2
- package/dist/server.mjs.map +1 -1
- package/dist/trillboards-lite.global.js +1 -1
- package/dist/trillboards-lite.global.js.map +1 -1
- package/package.json +19 -19
package/dist/server.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
var TrillboardsError = class extends Error {
|
|
5
5
|
constructor(message, options = {}) {
|
|
6
6
|
super(message);
|
|
7
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
7
8
|
this.name = "TrillboardsError";
|
|
8
9
|
this.type = options.type ?? "api_error";
|
|
9
10
|
this.code = options.code ?? "unknown_error";
|
|
@@ -15,12 +16,12 @@ var TrillboardsError = class extends Error {
|
|
|
15
16
|
var TrillboardsAuthenticationError = class extends TrillboardsError {
|
|
16
17
|
constructor(message) {
|
|
17
18
|
super(
|
|
18
|
-
message ?? "Invalid API key. Check your key at https://trillboards.com/developers",
|
|
19
|
+
message ?? "Invalid API key. Check your key at https://trillboards.com/support/developers",
|
|
19
20
|
{
|
|
20
21
|
type: "authentication_error",
|
|
21
22
|
code: "invalid_api_key",
|
|
22
23
|
statusCode: 401,
|
|
23
|
-
help: "https://trillboards.com/developers"
|
|
24
|
+
help: "https://trillboards.com/support/developers"
|
|
24
25
|
}
|
|
25
26
|
);
|
|
26
27
|
this.name = "TrillboardsAuthenticationError";
|
|
@@ -183,6 +184,9 @@ function createAuthenticatedFetch(apiKey, apiBase) {
|
|
|
183
184
|
throw error;
|
|
184
185
|
}
|
|
185
186
|
logger.debug(`${method} ${path} -> ${response.status} (${ms}ms)`);
|
|
187
|
+
if (response.status === 204) {
|
|
188
|
+
return void 0;
|
|
189
|
+
}
|
|
186
190
|
return response.json();
|
|
187
191
|
};
|
|
188
192
|
}
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/logger.ts","../src/server/fetchWithAuth.ts","../src/server/VastTagBuilder.ts","../src/server/TrackingBatch.ts","../src/server/AudienceClient.ts","../src/server/AnalyticsClient.ts","../src/server/AuctionClient.ts","../src/server/CreativeClient.ts","../src/server/PartnerClient.ts"],"names":[],"mappings":"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","file":"server.js","sourcesContent":["// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Structured error classes\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Base error class for all Trillboards SDK errors.\n * Mirrors the API error response shape: `{ type, code, message, param, help }`.\n */\nexport class TrillboardsError extends Error {\n readonly type: string;\n readonly code: string;\n readonly statusCode: number;\n readonly help?: string;\n readonly param?: string;\n\n constructor(\n message: string,\n options: {\n type?: string;\n code?: string;\n statusCode?: number;\n help?: string;\n param?: string;\n } = {},\n ) {\n super(message);\n this.name = 'TrillboardsError';\n this.type = options.type ?? 'api_error';\n this.code = options.code ?? 'unknown_error';\n this.statusCode = options.statusCode ?? 500;\n this.help = options.help;\n this.param = options.param;\n }\n}\n\n/** Thrown on HTTP 401 — invalid or missing API key. */\nexport class TrillboardsAuthenticationError extends TrillboardsError {\n constructor(message?: string) {\n super(\n message ?? 'Invalid API key. Check your key at https://trillboards.com/developers',\n {\n type: 'authentication_error',\n code: 'invalid_api_key',\n statusCode: 401,\n help: 'https://trillboards.com/developers',\n },\n );\n this.name = 'TrillboardsAuthenticationError';\n }\n}\n\n/** Thrown on HTTP 429 — rate limit exceeded. */\nexport class TrillboardsRateLimitError extends TrillboardsError {\n readonly retryAfter: number;\n\n constructor(retryAfter: number, message?: string) {\n super(\n message ?? `Rate limit exceeded. Retry after ${retryAfter} seconds.`,\n {\n type: 'rate_limit_error',\n code: 'rate_limited',\n statusCode: 429,\n },\n );\n this.name = 'TrillboardsRateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/** Thrown on HTTP 404 — resource not found. */\nexport class TrillboardsNotFoundError extends TrillboardsError {\n constructor(message?: string) {\n super(\n message ?? 'The requested resource was not found.',\n {\n type: 'not_found_error',\n code: 'resource_not_found',\n statusCode: 404,\n help: 'Verify the ID is correct and belongs to your account.',\n },\n );\n this.name = 'TrillboardsNotFoundError';\n }\n}\n\n/** Thrown on HTTP 400 — validation / bad request. */\nexport class TrillboardsValidationError extends TrillboardsError {\n constructor(message?: string, param?: string) {\n super(\n message ?? 'The request was invalid.',\n {\n type: 'validation_error',\n code: 'invalid_request',\n statusCode: 400,\n param,\n },\n );\n this.name = 'TrillboardsValidationError';\n }\n}\n","// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Lightweight debug logger\n// ─────────────────────────────────────────────────────────────\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nconst PREFIX = '[Trillboards]';\n\nclass Logger {\n private level: LogLevel = 'none';\n\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n debug(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.debug) {\n if (data !== undefined) {\n console.debug(PREFIX, message, data);\n } else {\n console.debug(PREFIX, message);\n }\n }\n }\n\n info(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.info) {\n if (data !== undefined) {\n console.info(PREFIX, message, data);\n } else {\n console.info(PREFIX, message);\n }\n }\n }\n\n warn(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.warn) {\n if (data !== undefined) {\n console.warn(PREFIX, message, data);\n } else {\n console.warn(PREFIX, message);\n }\n }\n }\n\n error(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.error) {\n if (data !== undefined) {\n console.error(PREFIX, message, data);\n } else {\n console.error(PREFIX, message);\n }\n }\n }\n}\n\n/** Singleton logger instance shared across the SDK. */\nexport const logger = new Logger();\n\n/** Set the global log level for the SDK. */\nexport function setLogLevel(level: LogLevel) {\n logger.setLevel(level);\n}\n","// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Shared authenticated fetch utility\n// ─────────────────────────────────────────────────────────────\n\nimport {\n TrillboardsError,\n TrillboardsAuthenticationError,\n TrillboardsRateLimitError,\n TrillboardsNotFoundError,\n TrillboardsValidationError,\n} from '../errors';\nimport { logger } from '../logger';\n\n/**\n * Parse a non-2xx response into the appropriate error class.\n *\n * Attempts to read a JSON body matching the API error shape\n * `{ error: { type, code, message, param, help } }`. Falls back\n * to a generic `TrillboardsError` when the body is unreadable.\n */\nasync function errorFromResponse(response: Response, path: string): Promise<TrillboardsError> {\n let body: any;\n try {\n body = await response.json();\n } catch {\n // body is not JSON — fall through to status-based error\n }\n\n const apiError = body?.error ?? body;\n const msg = apiError?.message ?? `API error: HTTP ${response.status}`;\n\n switch (response.status) {\n case 401:\n return new TrillboardsAuthenticationError(msg);\n case 429: {\n const retryHeader = response.headers.get('retry-after');\n const retryAfter = retryHeader ? parseInt(retryHeader, 10) : 60;\n return new TrillboardsRateLimitError(isNaN(retryAfter) ? 60 : retryAfter, msg);\n }\n case 404:\n return new TrillboardsNotFoundError(msg);\n case 400:\n return new TrillboardsValidationError(msg, apiError?.param);\n default:\n return new TrillboardsError(msg, {\n type: apiError?.type,\n code: apiError?.code,\n statusCode: response.status,\n help: apiError?.help,\n param: apiError?.param,\n });\n }\n}\n\n/**\n * Create a reusable authenticated fetch function bound to a\n * specific API key and base URL.\n *\n * - Strips trailing slashes from `apiBase` to avoid double-slash paths.\n * - Applies a 10-second timeout via `AbortSignal.timeout` unless\n * the caller provides their own `signal`.\n * - Always sends `Authorization: Bearer <key>` and\n * `Content-Type: application/json`.\n * - Throws structured `TrillboardsError` subclasses on non-2xx responses.\n * - Logs requests and responses when debug logging is active.\n */\nexport function createAuthenticatedFetch(apiKey: string, apiBase: string) {\n const base = apiBase.replace(/\\/+$/, '');\n\n return async (path: string, options?: RequestInit): Promise<any> => {\n const method = options?.method ?? 'GET';\n const start = Date.now();\n\n logger.debug(`${method} ${path}`, { base });\n\n const response = await globalThis.fetch(`${base}${path}`, {\n ...options,\n signal: options?.signal ?? AbortSignal.timeout(10000),\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n ...((options?.headers as Record<string, string>) ?? {}),\n },\n });\n\n const ms = Date.now() - start;\n\n if (!response.ok) {\n const error = await errorFromResponse(response, path);\n logger.debug(`${method} ${path} -> ${response.status} (${ms}ms) ERROR`);\n throw error;\n }\n\n logger.debug(`${method} ${path} -> ${response.status} (${ms}ms)`);\n\n return response.json();\n };\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface VastTagBuilderConfig {\n apiKey: string;\n apiBase?: string;\n}\n\nexport interface BuildTagOptions {\n deviceId: string;\n width?: number;\n height?: number;\n orientation?: 'portrait' | 'landscape';\n muted?: boolean;\n autoplay?: boolean;\n userAgent?: string;\n}\n\nexport interface VastTagResult {\n url: string;\n sources: Array<{\n name: string;\n vast_url: string;\n priority: number;\n timeout_ms: number;\n }>;\n auctionWinner?: {\n source: string;\n bid_price_cpm: number;\n vast_url: string;\n } | null;\n}\n\nexport class VastTagBuilder {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(config: VastTagBuilderConfig) {\n this.authFetch = createAuthenticatedFetch(config.apiKey, config.apiBase ?? 'https://api.trillboards.com/v1');\n }\n\n async buildTag(options: BuildTagOptions): Promise<VastTagResult> {\n const params = new URLSearchParams();\n if (options.width) params.set('slot_w', String(options.width));\n if (options.height) params.set('slot_h', String(options.height));\n if (options.orientation) params.set('orientation', options.orientation);\n if (options.muted !== undefined) params.set('muted', options.muted ? '1' : '0');\n if (options.autoplay !== undefined) params.set('autoplay', options.autoplay ? '1' : '0');\n if (options.userAgent) params.set('ua', options.userAgent);\n\n const query = params.toString();\n const path = `/partner/device/${options.deviceId}/ads${query ? `?${query}` : ''}`;\n\n const data = await this.authFetch(path);\n const hbs = data.data?.header_bidding_settings;\n\n return {\n url: hbs?.vast_tag_url ?? '',\n sources: (hbs?.vast_waterfall?.sources ?? []).map((s: any) => ({\n name: s.name,\n vast_url: s.vast_url,\n priority: s.priority,\n timeout_ms: s.timeout_ms,\n })),\n auctionWinner: hbs?.auction_winner ?? null,\n };\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface TrackingBatchConfig {\n apiKey: string;\n apiBase?: string;\n}\n\nexport interface ImpressionReport {\n adId: string;\n impressionId: string;\n deviceId: string;\n screenId?: string;\n duration: number;\n completed: boolean;\n timestamp: string;\n}\n\nexport interface TrackingResult {\n success: boolean;\n tracked: number;\n proofs: Array<{\n impressionId: string;\n proof: string;\n publicKeyUrl: string;\n }>;\n}\n\nexport class TrackingBatch {\n private apiBase: string;\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(config: TrackingBatchConfig) {\n this.apiBase = (config.apiBase ?? 'https://api.trillboards.com/v1').replace(/\\/+$/, '');\n this.authFetch = createAuthenticatedFetch(config.apiKey, config.apiBase ?? 'https://api.trillboards.com/v1');\n }\n\n async report(impressions: ImpressionReport[]): Promise<TrackingResult> {\n const data = await this.authFetch('/partner/tracking/batch', {\n method: 'POST',\n body: JSON.stringify({ impressions }),\n });\n\n return {\n success: data.success ?? true,\n tracked: data.data?.tracked ?? impressions.length,\n proofs: (data.data?.proofs ?? []).map((p: any) => ({\n impressionId: p.impression_id,\n proof: p.proof,\n publicKeyUrl: p.public_key_url ?? `${this.apiBase}/.well-known/public-key`,\n })),\n };\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface LiveAudience {\n face_count: number;\n attention_score: number;\n mood: string | null;\n income_level: string | null;\n purchase_intent: number | null;\n dwell_time_ms: number | null;\n timestamp: string;\n}\n\nexport interface AudiencePrediction {\n predicted_face_count: number;\n predicted_attention_score: number;\n predicted_mood: string | null;\n confidence: number;\n hour: number;\n dayOfWeek: number;\n}\n\nexport interface LookalikeScreen {\n screenId: string;\n similarity: number;\n audience_profile: Record<string, unknown>;\n}\n\nexport class AudienceClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async getLive(screenId: string): Promise<LiveAudience> {\n const data = await this.authFetch(`/partner/audience/live/${screenId}`);\n return data.data ?? data;\n }\n\n async predict(screenId: string, options: { hour: number; dayOfWeek: number }): Promise<AudiencePrediction> {\n const params = new URLSearchParams({\n hour: String(options.hour),\n day_of_week: String(options.dayOfWeek),\n });\n const data = await this.authFetch(`/partner/audience/predict/${screenId}?${params}`);\n return data.data ?? data;\n }\n\n async findLookalikes(screenId: string, options?: { limit?: number; minSimilarity?: number }): Promise<LookalikeScreen[]> {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.minSimilarity) params.set('min_similarity', String(options.minSimilarity));\n const query = params.toString();\n const data = await this.authFetch(`/partner/audience/lookalikes/${screenId}${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface ScreenDailyAnalytics {\n date: string;\n ads: {\n plays_started: number;\n plays_completed: number;\n completion_rate: number;\n programmatic_plays: number;\n direct_plays: number;\n };\n audience: {\n avg_face_count: number;\n avg_attention_score: number;\n peak_viewers: number;\n };\n earnings: {\n programmatic_cents: number;\n direct_cents: number;\n total_cents: number;\n };\n streaming: {\n seconds: number;\n uptime_percentage: number;\n };\n}\n\nexport interface EarningsData {\n screenId: string;\n period: string;\n impressions_count: number;\n cpm_rate: number;\n gross_revenue: number;\n earner_revenue: number;\n earner_share_rate: number;\n}\n\nexport class AnalyticsClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async getScreenDaily(screenId: string, options: { startDate: string; endDate: string }): Promise<ScreenDailyAnalytics[]> {\n const params = new URLSearchParams({\n start_date: options.startDate,\n end_date: options.endDate,\n });\n const data = await this.authFetch(`/partner/screens/${screenId}/analytics?${params}`);\n return data.data ?? [];\n }\n\n async getEarnings(options?: { screenId?: string; startDate?: string; endDate?: string }): Promise<EarningsData[]> {\n const params = new URLSearchParams();\n if (options?.screenId) params.set('screen_id', options.screenId);\n if (options?.startDate) params.set('start_date', options.startDate);\n if (options?.endDate) params.set('end_date', options.endDate);\n const query = params.toString();\n const data = await this.authFetch(`/partner/earnings${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface AuctionResult {\n auction_id: string;\n screen_id: string;\n timestamp: string;\n winning_bid: {\n bid_price_cpm: number;\n dsp_name: string;\n creative_id: string;\n vast_url: string;\n } | null;\n all_bids: Array<{\n dsp_name: string;\n bid_price_cpm: number;\n latency_ms: number;\n }>;\n latency_ms: number;\n floor_price_cpm: number;\n}\n\nexport class AuctionClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async list(options?: { screenId?: string; limit?: number; offset?: number }): Promise<AuctionResult[]> {\n const params = new URLSearchParams();\n if (options?.screenId) params.set('screen_id', options.screenId);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n const data = await this.authFetch(`/partner/auctions${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n\n async get(auctionId: string): Promise<AuctionResult> {\n const data = await this.authFetch(`/partner/auctions/${auctionId}`);\n return data.data ?? data;\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface CreativeReview {\n creative_id: string;\n advertiser_name: string;\n creative_url: string;\n status: 'pending' | 'approved' | 'flagged' | 'blocked';\n iab_categories: string[];\n age_rating: string | null;\n brand_detected: string | null;\n content_flags: string[];\n reviewed_at: string | null;\n created_at: string;\n}\n\nexport interface CreativeStats {\n total: number;\n pending: number;\n approved: number;\n flagged: number;\n blocked: number;\n}\n\nexport class CreativeClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async list(options?: { status?: string; limit?: number; offset?: number }): Promise<CreativeReview[]> {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n const data = await this.authFetch(`/openrtb/v1/creative-review${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n\n async getStats(): Promise<CreativeStats> {\n const data = await this.authFetch('/openrtb/v1/creative-review/stats');\n return data.data ?? data;\n }\n\n async block(creativeId: string, reason?: string): Promise<void> {\n await this.authFetch(`/openrtb/v1/creative-review/${creativeId}/block`, {\n method: 'POST',\n body: JSON.stringify({ reason }),\n });\n }\n\n async unblock(creativeId: string): Promise<void> {\n await this.authFetch(`/openrtb/v1/creative-review/${creativeId}/unblock`, {\n method: 'POST',\n });\n }\n}\n","import { VastTagBuilder } from './VastTagBuilder';\nimport { TrackingBatch } from './TrackingBatch';\nimport { AudienceClient } from './AudienceClient';\nimport { AnalyticsClient } from './AnalyticsClient';\nimport { AuctionClient } from './AuctionClient';\nimport { CreativeClient } from './CreativeClient';\nimport { createAuthenticatedFetch } from './fetchWithAuth';\nimport { TrillboardsError, TrillboardsAuthenticationError, TrillboardsValidationError } from '../errors';\nimport { logger, setLogLevel } from '../logger';\n\nexport interface PartnerClientConfig {\n apiKey?: string;\n apiBase?: string;\n debug?: boolean;\n}\n\nexport interface QuickStartResult {\n partner: {\n partner_id: string;\n name: string;\n slug: string;\n status: string;\n revenue_share_percent: number;\n };\n credentials: {\n api_key: string;\n api_key_prefix: string;\n warning: string;\n };\n device: {\n device_id: string;\n external_device_id: string;\n fingerprint: string;\n screen_id: string;\n name: string;\n status: string;\n embed_url: string;\n };\n integration: {\n sdk_snippet: string;\n iframe_snippet: string;\n embed_url: string;\n api_base: string;\n sdk_url: string;\n docs_url: string;\n };\n sdk_config: Record<string, unknown>;\n next_steps: string[];\n client: PartnerClient;\n}\n\nexport class PartnerClient {\n private apiKey: string;\n private apiBase: string;\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n readonly audience: AudienceClient;\n readonly analytics: AnalyticsClient;\n readonly auctions: AuctionClient;\n readonly creatives: CreativeClient;\n\n constructor(config: PartnerClientConfig = {}) {\n const debug = config.debug ?? (typeof process !== 'undefined' && process.env?.TRILLBOARDS_DEBUG === 'true');\n if (debug) {\n setLogLevel('debug');\n }\n\n const resolvedKey = config.apiKey\n ?? (typeof process !== 'undefined' ? process.env?.TRILLBOARDS_API_KEY : undefined);\n\n if (!resolvedKey) {\n throw new TrillboardsAuthenticationError(\n 'No API key provided. Pass apiKey in config or set TRILLBOARDS_API_KEY environment variable.',\n );\n }\n\n this.apiKey = resolvedKey;\n this.apiBase = config.apiBase ?? 'https://api.trillboards.com/v1';\n this.authFetch = createAuthenticatedFetch(this.apiKey, this.apiBase);\n\n this.audience = new AudienceClient(this.apiKey, this.apiBase);\n this.analytics = new AnalyticsClient(this.apiKey, this.apiBase);\n this.auctions = new AuctionClient(this.apiKey, this.apiBase);\n this.creatives = new CreativeClient(this.apiKey, this.apiBase);\n\n if (this.isTestMode) {\n logger.info('Test mode active');\n }\n\n logger.debug('PartnerClient initialized', {\n apiBase: this.apiBase,\n testMode: this.isTestMode,\n });\n }\n\n /** Returns `true` if the API key is a test key (`trb_test_*`). */\n get isTestMode(): boolean {\n return this.apiKey.startsWith('trb_test_');\n }\n\n /**\n * One-call onboarding: register a partner, create the first device,\n * and return a pre-authenticated `PartnerClient` instance ready to use.\n *\n * This calls `POST /v1/partner/quick-start` (public, no auth required).\n */\n static async quickStart(options: {\n companyName: string;\n email: string;\n deviceName?: string;\n apiBase?: string;\n debug?: boolean;\n }): Promise<QuickStartResult> {\n const base = (options.apiBase ?? 'https://api.trillboards.com/v1').replace(/\\/+$/, '');\n\n if (options.debug) {\n setLogLevel('debug');\n }\n\n logger.debug('QuickStart: registering partner', {\n company: options.companyName,\n email: options.email,\n });\n\n const response = await globalThis.fetch(`${base}/partner/quick-start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n company_name: options.companyName,\n email: options.email,\n device_name: options.deviceName,\n }),\n signal: AbortSignal.timeout(30000),\n });\n\n if (!response.ok) {\n let errorMsg = `Quick start failed: HTTP ${response.status}`;\n let errorCode = 'quick_start_failed';\n try {\n const body = await response.json();\n errorMsg = body?.error?.message ?? body?.message ?? errorMsg;\n errorCode = body?.error?.code ?? errorCode;\n } catch { /* ignore parse errors */ }\n\n if (response.status === 400) {\n throw new TrillboardsValidationError(errorMsg);\n }\n throw new TrillboardsError(errorMsg, {\n code: errorCode,\n statusCode: response.status,\n });\n }\n\n const json = await response.json();\n const data = json.data;\n\n const client = new PartnerClient({\n apiKey: data.credentials.api_key,\n apiBase: options.apiBase,\n debug: options.debug,\n });\n\n return { ...data, client };\n }\n\n createVastTagBuilder(): VastTagBuilder {\n return new VastTagBuilder({ apiKey: this.apiKey, apiBase: this.apiBase });\n }\n\n createTrackingBatch(): TrackingBatch {\n return new TrackingBatch({ apiKey: this.apiKey, apiBase: this.apiBase });\n }\n\n protected async fetch(path: string, options: RequestInit = {}): Promise<any> {\n return this.authFetch(path, options);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/logger.ts","../src/server/fetchWithAuth.ts","../src/server/VastTagBuilder.ts","../src/server/TrackingBatch.ts","../src/server/AudienceClient.ts","../src/server/AnalyticsClient.ts","../src/server/AuctionClient.ts","../src/server/CreativeClient.ts","../src/server/PartnerClient.ts"],"names":[],"mappings":"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","file":"server.js","sourcesContent":["// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Structured error classes\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Base error class for all Trillboards SDK errors.\n * Mirrors the API error response shape: `{ type, code, message, param, help }`.\n */\nexport class TrillboardsError extends Error {\n readonly type: string;\n readonly code: string;\n readonly statusCode: number;\n readonly help?: string;\n readonly param?: string;\n\n constructor(\n message: string,\n options: {\n type?: string;\n code?: string;\n statusCode?: number;\n help?: string;\n param?: string;\n } = {},\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = 'TrillboardsError';\n this.type = options.type ?? 'api_error';\n this.code = options.code ?? 'unknown_error';\n this.statusCode = options.statusCode ?? 500;\n this.help = options.help;\n this.param = options.param;\n }\n}\n\n/** Thrown on HTTP 401 — invalid or missing API key. */\nexport class TrillboardsAuthenticationError extends TrillboardsError {\n constructor(message?: string) {\n super(\n message ?? 'Invalid API key. Check your key at https://trillboards.com/support/developers',\n {\n type: 'authentication_error',\n code: 'invalid_api_key',\n statusCode: 401,\n help: 'https://trillboards.com/support/developers',\n },\n );\n this.name = 'TrillboardsAuthenticationError';\n }\n}\n\n/** Thrown on HTTP 429 — rate limit exceeded. */\nexport class TrillboardsRateLimitError extends TrillboardsError {\n readonly retryAfter: number;\n\n constructor(retryAfter: number, message?: string) {\n super(\n message ?? `Rate limit exceeded. Retry after ${retryAfter} seconds.`,\n {\n type: 'rate_limit_error',\n code: 'rate_limited',\n statusCode: 429,\n },\n );\n this.name = 'TrillboardsRateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/** Thrown on HTTP 404 — resource not found. */\nexport class TrillboardsNotFoundError extends TrillboardsError {\n constructor(message?: string) {\n super(\n message ?? 'The requested resource was not found.',\n {\n type: 'not_found_error',\n code: 'resource_not_found',\n statusCode: 404,\n help: 'Verify the ID is correct and belongs to your account.',\n },\n );\n this.name = 'TrillboardsNotFoundError';\n }\n}\n\n/** Thrown on HTTP 400 — validation / bad request. */\nexport class TrillboardsValidationError extends TrillboardsError {\n constructor(message?: string, param?: string) {\n super(\n message ?? 'The request was invalid.',\n {\n type: 'validation_error',\n code: 'invalid_request',\n statusCode: 400,\n param,\n },\n );\n this.name = 'TrillboardsValidationError';\n }\n}\n","// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Lightweight debug logger\n// ─────────────────────────────────────────────────────────────\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nconst PREFIX = '[Trillboards]';\n\nclass Logger {\n private level: LogLevel = 'none';\n\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n debug(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.debug) {\n if (data !== undefined) {\n console.debug(PREFIX, message, data);\n } else {\n console.debug(PREFIX, message);\n }\n }\n }\n\n info(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.info) {\n if (data !== undefined) {\n console.info(PREFIX, message, data);\n } else {\n console.info(PREFIX, message);\n }\n }\n }\n\n warn(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.warn) {\n if (data !== undefined) {\n console.warn(PREFIX, message, data);\n } else {\n console.warn(PREFIX, message);\n }\n }\n }\n\n error(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.error) {\n if (data !== undefined) {\n console.error(PREFIX, message, data);\n } else {\n console.error(PREFIX, message);\n }\n }\n }\n}\n\n/** Singleton logger instance shared across the SDK. */\nexport const logger = new Logger();\n\n/** Set the global log level for the SDK. */\nexport function setLogLevel(level: LogLevel) {\n logger.setLevel(level);\n}\n","// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Shared authenticated fetch utility\n// ─────────────────────────────────────────────────────────────\n\nimport {\n TrillboardsError,\n TrillboardsAuthenticationError,\n TrillboardsRateLimitError,\n TrillboardsNotFoundError,\n TrillboardsValidationError,\n} from '../errors';\nimport { logger } from '../logger';\n\n/**\n * Parse a non-2xx response into the appropriate error class.\n *\n * Attempts to read a JSON body matching the API error shape\n * `{ error: { type, code, message, param, help } }`. Falls back\n * to a generic `TrillboardsError` when the body is unreadable.\n */\nasync function errorFromResponse(response: Response, path: string): Promise<TrillboardsError> {\n let body: any;\n try {\n body = await response.json();\n } catch {\n // body is not JSON — fall through to status-based error\n }\n\n const apiError = body?.error ?? body;\n const msg = apiError?.message ?? `API error: HTTP ${response.status}`;\n\n switch (response.status) {\n case 401:\n return new TrillboardsAuthenticationError(msg);\n case 429: {\n const retryHeader = response.headers.get('retry-after');\n const retryAfter = retryHeader ? parseInt(retryHeader, 10) : 60;\n return new TrillboardsRateLimitError(isNaN(retryAfter) ? 60 : retryAfter, msg);\n }\n case 404:\n return new TrillboardsNotFoundError(msg);\n case 400:\n return new TrillboardsValidationError(msg, apiError?.param);\n default:\n return new TrillboardsError(msg, {\n type: apiError?.type,\n code: apiError?.code,\n statusCode: response.status,\n help: apiError?.help,\n param: apiError?.param,\n });\n }\n}\n\n/**\n * Create a reusable authenticated fetch function bound to a\n * specific API key and base URL.\n *\n * - Strips trailing slashes from `apiBase` to avoid double-slash paths.\n * - Applies a 10-second timeout via `AbortSignal.timeout` unless\n * the caller provides their own `signal`.\n * - Always sends `Authorization: Bearer <key>` and\n * `Content-Type: application/json`.\n * - Throws structured `TrillboardsError` subclasses on non-2xx responses.\n * - Logs requests and responses when debug logging is active.\n */\nexport function createAuthenticatedFetch(apiKey: string, apiBase: string) {\n const base = apiBase.replace(/\\/+$/, '');\n\n return async (path: string, options?: RequestInit): Promise<any> => {\n const method = options?.method ?? 'GET';\n const start = Date.now();\n\n logger.debug(`${method} ${path}`, { base });\n\n const response = await globalThis.fetch(`${base}${path}`, {\n ...options,\n signal: options?.signal ?? AbortSignal.timeout(10000),\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n ...((options?.headers as Record<string, string>) ?? {}),\n },\n });\n\n const ms = Date.now() - start;\n\n if (!response.ok) {\n const error = await errorFromResponse(response, path);\n logger.debug(`${method} ${path} -> ${response.status} (${ms}ms) ERROR`);\n throw error;\n }\n\n logger.debug(`${method} ${path} -> ${response.status} (${ms}ms)`);\n\n // 204 No Content — nothing to parse\n if (response.status === 204) {\n return undefined;\n }\n\n return response.json();\n };\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface VastTagBuilderConfig {\n apiKey: string;\n apiBase?: string;\n}\n\nexport interface BuildTagOptions {\n deviceId: string;\n width?: number;\n height?: number;\n orientation?: 'portrait' | 'landscape';\n muted?: boolean;\n autoplay?: boolean;\n userAgent?: string;\n}\n\nexport interface VastTagResult {\n url: string;\n sources: Array<{\n name: string;\n vast_url: string;\n priority: number;\n timeout_ms: number;\n }>;\n auctionWinner?: {\n source: string;\n bid_price_cpm: number;\n vast_url: string;\n } | null;\n}\n\nexport class VastTagBuilder {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(config: VastTagBuilderConfig) {\n this.authFetch = createAuthenticatedFetch(config.apiKey, config.apiBase ?? 'https://api.trillboards.com/v1');\n }\n\n async buildTag(options: BuildTagOptions): Promise<VastTagResult> {\n const params = new URLSearchParams();\n if (options.width) params.set('slot_w', String(options.width));\n if (options.height) params.set('slot_h', String(options.height));\n if (options.orientation) params.set('orientation', options.orientation);\n if (options.muted !== undefined) params.set('muted', options.muted ? '1' : '0');\n if (options.autoplay !== undefined) params.set('autoplay', options.autoplay ? '1' : '0');\n if (options.userAgent) params.set('ua', options.userAgent);\n\n const query = params.toString();\n const path = `/partner/device/${options.deviceId}/ads${query ? `?${query}` : ''}`;\n\n const data = await this.authFetch(path);\n const hbs = data.data?.header_bidding_settings;\n\n return {\n url: hbs?.vast_tag_url ?? '',\n sources: (hbs?.vast_waterfall?.sources ?? []).map((s: any) => ({\n name: s.name,\n vast_url: s.vast_url,\n priority: s.priority,\n timeout_ms: s.timeout_ms,\n })),\n auctionWinner: hbs?.auction_winner ?? null,\n };\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface TrackingBatchConfig {\n apiKey: string;\n apiBase?: string;\n}\n\nexport interface ImpressionReport {\n adId: string;\n impressionId: string;\n deviceId: string;\n screenId?: string;\n duration: number;\n completed: boolean;\n timestamp: string;\n}\n\nexport interface TrackingResult {\n success: boolean;\n tracked: number;\n proofs: Array<{\n impressionId: string;\n proof: string;\n publicKeyUrl: string;\n }>;\n}\n\nexport class TrackingBatch {\n private apiBase: string;\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(config: TrackingBatchConfig) {\n this.apiBase = (config.apiBase ?? 'https://api.trillboards.com/v1').replace(/\\/+$/, '');\n this.authFetch = createAuthenticatedFetch(config.apiKey, config.apiBase ?? 'https://api.trillboards.com/v1');\n }\n\n async report(impressions: ImpressionReport[]): Promise<TrackingResult> {\n const data = await this.authFetch('/partner/tracking/batch', {\n method: 'POST',\n body: JSON.stringify({ impressions }),\n });\n\n return {\n success: data.success ?? true,\n tracked: data.data?.tracked ?? impressions.length,\n proofs: (data.data?.proofs ?? []).map((p: any) => ({\n impressionId: p.impression_id,\n proof: p.proof,\n publicKeyUrl: p.public_key_url ?? `${this.apiBase}/.well-known/public-key`,\n })),\n };\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface LiveAudience {\n face_count: number;\n attention_score: number;\n mood: string | null;\n income_level: string | null;\n purchase_intent: number | null;\n dwell_time_ms: number | null;\n timestamp: string;\n}\n\nexport interface AudiencePrediction {\n predicted_face_count: number;\n predicted_attention_score: number;\n predicted_mood: string | null;\n confidence: number;\n hour: number;\n dayOfWeek: number;\n}\n\nexport interface LookalikeScreen {\n screenId: string;\n similarity: number;\n audience_profile: Record<string, unknown>;\n}\n\nexport class AudienceClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async getLive(screenId: string): Promise<LiveAudience> {\n const data = await this.authFetch(`/partner/audience/live/${screenId}`);\n return data.data ?? data;\n }\n\n async predict(screenId: string, options: { hour: number; dayOfWeek: number }): Promise<AudiencePrediction> {\n const params = new URLSearchParams({\n hour: String(options.hour),\n day_of_week: String(options.dayOfWeek),\n });\n const data = await this.authFetch(`/partner/audience/predict/${screenId}?${params}`);\n return data.data ?? data;\n }\n\n async findLookalikes(screenId: string, options?: { limit?: number; minSimilarity?: number }): Promise<LookalikeScreen[]> {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.minSimilarity) params.set('min_similarity', String(options.minSimilarity));\n const query = params.toString();\n const data = await this.authFetch(`/partner/audience/lookalikes/${screenId}${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface ScreenDailyAnalytics {\n date: string;\n ads: {\n plays_started: number;\n plays_completed: number;\n completion_rate: number;\n programmatic_plays: number;\n direct_plays: number;\n };\n audience: {\n avg_face_count: number;\n avg_attention_score: number;\n peak_viewers: number;\n };\n earnings: {\n programmatic_cents: number;\n direct_cents: number;\n total_cents: number;\n };\n streaming: {\n seconds: number;\n uptime_percentage: number;\n };\n}\n\nexport interface EarningsData {\n screenId: string;\n period: string;\n impressions_count: number;\n cpm_rate: number;\n gross_revenue: number;\n earner_revenue: number;\n earner_share_rate: number;\n}\n\nexport class AnalyticsClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async getScreenDaily(screenId: string, options: { startDate: string; endDate: string }): Promise<ScreenDailyAnalytics[]> {\n const params = new URLSearchParams({\n start_date: options.startDate,\n end_date: options.endDate,\n });\n const data = await this.authFetch(`/partner/screens/${screenId}/analytics?${params}`);\n return data.data ?? [];\n }\n\n async getEarnings(options?: { screenId?: string; startDate?: string; endDate?: string }): Promise<EarningsData[]> {\n const params = new URLSearchParams();\n if (options?.screenId) params.set('screen_id', options.screenId);\n if (options?.startDate) params.set('start_date', options.startDate);\n if (options?.endDate) params.set('end_date', options.endDate);\n const query = params.toString();\n const data = await this.authFetch(`/partner/earnings${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface AuctionResult {\n auction_id: string;\n screen_id: string;\n timestamp: string;\n winning_bid: {\n bid_price_cpm: number;\n dsp_name: string;\n creative_id: string;\n vast_url: string;\n } | null;\n all_bids: Array<{\n dsp_name: string;\n bid_price_cpm: number;\n latency_ms: number;\n }>;\n latency_ms: number;\n floor_price_cpm: number;\n}\n\nexport class AuctionClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async list(options?: { screenId?: string; limit?: number; offset?: number }): Promise<AuctionResult[]> {\n const params = new URLSearchParams();\n if (options?.screenId) params.set('screen_id', options.screenId);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n const data = await this.authFetch(`/partner/auctions${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n\n async get(auctionId: string): Promise<AuctionResult> {\n const data = await this.authFetch(`/partner/auctions/${auctionId}`);\n return data.data ?? data;\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface CreativeReview {\n creative_id: string;\n advertiser_name: string;\n creative_url: string;\n status: 'pending' | 'approved' | 'flagged' | 'blocked';\n iab_categories: string[];\n age_rating: string | null;\n brand_detected: string | null;\n content_flags: string[];\n reviewed_at: string | null;\n created_at: string;\n}\n\nexport interface CreativeStats {\n total: number;\n pending: number;\n approved: number;\n flagged: number;\n blocked: number;\n}\n\nexport class CreativeClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async list(options?: { status?: string; limit?: number; offset?: number }): Promise<CreativeReview[]> {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n const data = await this.authFetch(`/openrtb/v1/creative-review${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n\n async getStats(): Promise<CreativeStats> {\n const data = await this.authFetch('/openrtb/v1/creative-review/stats');\n return data.data ?? data;\n }\n\n async block(creativeId: string, reason?: string): Promise<void> {\n await this.authFetch(`/openrtb/v1/creative-review/${creativeId}/block`, {\n method: 'POST',\n body: JSON.stringify({ reason }),\n });\n }\n\n async unblock(creativeId: string): Promise<void> {\n await this.authFetch(`/openrtb/v1/creative-review/${creativeId}/unblock`, {\n method: 'POST',\n });\n }\n}\n","import { VastTagBuilder } from './VastTagBuilder';\nimport { TrackingBatch } from './TrackingBatch';\nimport { AudienceClient } from './AudienceClient';\nimport { AnalyticsClient } from './AnalyticsClient';\nimport { AuctionClient } from './AuctionClient';\nimport { CreativeClient } from './CreativeClient';\nimport { createAuthenticatedFetch } from './fetchWithAuth';\nimport { TrillboardsError, TrillboardsAuthenticationError, TrillboardsValidationError } from '../errors';\nimport { logger, setLogLevel } from '../logger';\n\nexport interface PartnerClientConfig {\n apiKey?: string;\n apiBase?: string;\n debug?: boolean;\n}\n\nexport interface QuickStartResult {\n partner: {\n partner_id: string;\n name: string;\n slug: string;\n status: string;\n revenue_share_percent: number;\n };\n credentials: {\n api_key: string;\n api_key_prefix: string;\n warning: string;\n };\n device: {\n device_id: string;\n external_device_id: string;\n fingerprint: string;\n screen_id: string;\n name: string;\n status: string;\n embed_url: string;\n };\n integration: {\n sdk_snippet: string;\n iframe_snippet: string;\n embed_url: string;\n api_base: string;\n sdk_url: string;\n docs_url: string;\n };\n sdk_config: Record<string, unknown>;\n next_steps: string[];\n client: PartnerClient;\n}\n\nexport class PartnerClient {\n private apiKey: string;\n private apiBase: string;\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n readonly audience: AudienceClient;\n readonly analytics: AnalyticsClient;\n readonly auctions: AuctionClient;\n readonly creatives: CreativeClient;\n\n constructor(config: PartnerClientConfig = {}) {\n const debug = config.debug ?? (typeof process !== 'undefined' && process.env?.TRILLBOARDS_DEBUG === 'true');\n if (debug) {\n setLogLevel('debug');\n }\n\n const resolvedKey = config.apiKey\n ?? (typeof process !== 'undefined' ? process.env?.TRILLBOARDS_API_KEY : undefined);\n\n if (!resolvedKey) {\n throw new TrillboardsAuthenticationError(\n 'No API key provided. Pass apiKey in config or set TRILLBOARDS_API_KEY environment variable.',\n );\n }\n\n this.apiKey = resolvedKey;\n this.apiBase = config.apiBase ?? 'https://api.trillboards.com/v1';\n this.authFetch = createAuthenticatedFetch(this.apiKey, this.apiBase);\n\n this.audience = new AudienceClient(this.apiKey, this.apiBase);\n this.analytics = new AnalyticsClient(this.apiKey, this.apiBase);\n this.auctions = new AuctionClient(this.apiKey, this.apiBase);\n this.creatives = new CreativeClient(this.apiKey, this.apiBase);\n\n if (this.isTestMode) {\n logger.info('Test mode active');\n }\n\n logger.debug('PartnerClient initialized', {\n apiBase: this.apiBase,\n testMode: this.isTestMode,\n });\n }\n\n /** Returns `true` if the API key is a test key (`trb_test_*`). */\n get isTestMode(): boolean {\n return this.apiKey.startsWith('trb_test_');\n }\n\n /**\n * One-call onboarding: register a partner, create the first device,\n * and return a pre-authenticated `PartnerClient` instance ready to use.\n *\n * This calls `POST /v1/partner/quick-start` (public, no auth required).\n */\n static async quickStart(options: {\n companyName: string;\n email: string;\n deviceName?: string;\n apiBase?: string;\n debug?: boolean;\n }): Promise<QuickStartResult> {\n const base = (options.apiBase ?? 'https://api.trillboards.com/v1').replace(/\\/+$/, '');\n\n if (options.debug) {\n setLogLevel('debug');\n }\n\n logger.debug('QuickStart: registering partner', {\n company: options.companyName,\n email: options.email,\n });\n\n const response = await globalThis.fetch(`${base}/partner/quick-start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n company_name: options.companyName,\n email: options.email,\n device_name: options.deviceName,\n }),\n signal: AbortSignal.timeout(30000),\n });\n\n if (!response.ok) {\n let errorMsg = `Quick start failed: HTTP ${response.status}`;\n let errorCode = 'quick_start_failed';\n try {\n const body = await response.json();\n errorMsg = body?.error?.message ?? body?.message ?? errorMsg;\n errorCode = body?.error?.code ?? errorCode;\n } catch { /* ignore parse errors */ }\n\n if (response.status === 400) {\n throw new TrillboardsValidationError(errorMsg);\n }\n throw new TrillboardsError(errorMsg, {\n code: errorCode,\n statusCode: response.status,\n });\n }\n\n const json = await response.json();\n const data = json.data;\n\n const client = new PartnerClient({\n apiKey: data.credentials.api_key,\n apiBase: options.apiBase,\n debug: options.debug,\n });\n\n return { ...data, client };\n }\n\n createVastTagBuilder(): VastTagBuilder {\n return new VastTagBuilder({ apiKey: this.apiKey, apiBase: this.apiBase });\n }\n\n createTrackingBatch(): TrackingBatch {\n return new TrackingBatch({ apiKey: this.apiKey, apiBase: this.apiBase });\n }\n\n protected async fetch(path: string, options: RequestInit = {}): Promise<any> {\n return this.authFetch(path, options);\n }\n}\n"]}
|
package/dist/server.mjs
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
var TrillboardsError = class extends Error {
|
|
3
3
|
constructor(message, options = {}) {
|
|
4
4
|
super(message);
|
|
5
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
5
6
|
this.name = "TrillboardsError";
|
|
6
7
|
this.type = options.type ?? "api_error";
|
|
7
8
|
this.code = options.code ?? "unknown_error";
|
|
@@ -13,12 +14,12 @@ var TrillboardsError = class extends Error {
|
|
|
13
14
|
var TrillboardsAuthenticationError = class extends TrillboardsError {
|
|
14
15
|
constructor(message) {
|
|
15
16
|
super(
|
|
16
|
-
message ?? "Invalid API key. Check your key at https://trillboards.com/developers",
|
|
17
|
+
message ?? "Invalid API key. Check your key at https://trillboards.com/support/developers",
|
|
17
18
|
{
|
|
18
19
|
type: "authentication_error",
|
|
19
20
|
code: "invalid_api_key",
|
|
20
21
|
statusCode: 401,
|
|
21
|
-
help: "https://trillboards.com/developers"
|
|
22
|
+
help: "https://trillboards.com/support/developers"
|
|
22
23
|
}
|
|
23
24
|
);
|
|
24
25
|
this.name = "TrillboardsAuthenticationError";
|
|
@@ -181,6 +182,9 @@ function createAuthenticatedFetch(apiKey, apiBase) {
|
|
|
181
182
|
throw error;
|
|
182
183
|
}
|
|
183
184
|
logger.debug(`${method} ${path} -> ${response.status} (${ms}ms)`);
|
|
185
|
+
if (response.status === 204) {
|
|
186
|
+
return void 0;
|
|
187
|
+
}
|
|
184
188
|
return response.json();
|
|
185
189
|
};
|
|
186
190
|
}
|
package/dist/server.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/logger.ts","../src/server/fetchWithAuth.ts","../src/server/VastTagBuilder.ts","../src/server/TrackingBatch.ts","../src/server/AudienceClient.ts","../src/server/AnalyticsClient.ts","../src/server/AuctionClient.ts","../src/server/CreativeClient.ts","../src/server/PartnerClient.ts"],"names":[],"mappings":"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","file":"server.mjs","sourcesContent":["// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Structured error classes\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Base error class for all Trillboards SDK errors.\n * Mirrors the API error response shape: `{ type, code, message, param, help }`.\n */\nexport class TrillboardsError extends Error {\n readonly type: string;\n readonly code: string;\n readonly statusCode: number;\n readonly help?: string;\n readonly param?: string;\n\n constructor(\n message: string,\n options: {\n type?: string;\n code?: string;\n statusCode?: number;\n help?: string;\n param?: string;\n } = {},\n ) {\n super(message);\n this.name = 'TrillboardsError';\n this.type = options.type ?? 'api_error';\n this.code = options.code ?? 'unknown_error';\n this.statusCode = options.statusCode ?? 500;\n this.help = options.help;\n this.param = options.param;\n }\n}\n\n/** Thrown on HTTP 401 — invalid or missing API key. */\nexport class TrillboardsAuthenticationError extends TrillboardsError {\n constructor(message?: string) {\n super(\n message ?? 'Invalid API key. Check your key at https://trillboards.com/developers',\n {\n type: 'authentication_error',\n code: 'invalid_api_key',\n statusCode: 401,\n help: 'https://trillboards.com/developers',\n },\n );\n this.name = 'TrillboardsAuthenticationError';\n }\n}\n\n/** Thrown on HTTP 429 — rate limit exceeded. */\nexport class TrillboardsRateLimitError extends TrillboardsError {\n readonly retryAfter: number;\n\n constructor(retryAfter: number, message?: string) {\n super(\n message ?? `Rate limit exceeded. Retry after ${retryAfter} seconds.`,\n {\n type: 'rate_limit_error',\n code: 'rate_limited',\n statusCode: 429,\n },\n );\n this.name = 'TrillboardsRateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/** Thrown on HTTP 404 — resource not found. */\nexport class TrillboardsNotFoundError extends TrillboardsError {\n constructor(message?: string) {\n super(\n message ?? 'The requested resource was not found.',\n {\n type: 'not_found_error',\n code: 'resource_not_found',\n statusCode: 404,\n help: 'Verify the ID is correct and belongs to your account.',\n },\n );\n this.name = 'TrillboardsNotFoundError';\n }\n}\n\n/** Thrown on HTTP 400 — validation / bad request. */\nexport class TrillboardsValidationError extends TrillboardsError {\n constructor(message?: string, param?: string) {\n super(\n message ?? 'The request was invalid.',\n {\n type: 'validation_error',\n code: 'invalid_request',\n statusCode: 400,\n param,\n },\n );\n this.name = 'TrillboardsValidationError';\n }\n}\n","// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Lightweight debug logger\n// ─────────────────────────────────────────────────────────────\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nconst PREFIX = '[Trillboards]';\n\nclass Logger {\n private level: LogLevel = 'none';\n\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n debug(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.debug) {\n if (data !== undefined) {\n console.debug(PREFIX, message, data);\n } else {\n console.debug(PREFIX, message);\n }\n }\n }\n\n info(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.info) {\n if (data !== undefined) {\n console.info(PREFIX, message, data);\n } else {\n console.info(PREFIX, message);\n }\n }\n }\n\n warn(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.warn) {\n if (data !== undefined) {\n console.warn(PREFIX, message, data);\n } else {\n console.warn(PREFIX, message);\n }\n }\n }\n\n error(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.error) {\n if (data !== undefined) {\n console.error(PREFIX, message, data);\n } else {\n console.error(PREFIX, message);\n }\n }\n }\n}\n\n/** Singleton logger instance shared across the SDK. */\nexport const logger = new Logger();\n\n/** Set the global log level for the SDK. */\nexport function setLogLevel(level: LogLevel) {\n logger.setLevel(level);\n}\n","// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Shared authenticated fetch utility\n// ─────────────────────────────────────────────────────────────\n\nimport {\n TrillboardsError,\n TrillboardsAuthenticationError,\n TrillboardsRateLimitError,\n TrillboardsNotFoundError,\n TrillboardsValidationError,\n} from '../errors';\nimport { logger } from '../logger';\n\n/**\n * Parse a non-2xx response into the appropriate error class.\n *\n * Attempts to read a JSON body matching the API error shape\n * `{ error: { type, code, message, param, help } }`. Falls back\n * to a generic `TrillboardsError` when the body is unreadable.\n */\nasync function errorFromResponse(response: Response, path: string): Promise<TrillboardsError> {\n let body: any;\n try {\n body = await response.json();\n } catch {\n // body is not JSON — fall through to status-based error\n }\n\n const apiError = body?.error ?? body;\n const msg = apiError?.message ?? `API error: HTTP ${response.status}`;\n\n switch (response.status) {\n case 401:\n return new TrillboardsAuthenticationError(msg);\n case 429: {\n const retryHeader = response.headers.get('retry-after');\n const retryAfter = retryHeader ? parseInt(retryHeader, 10) : 60;\n return new TrillboardsRateLimitError(isNaN(retryAfter) ? 60 : retryAfter, msg);\n }\n case 404:\n return new TrillboardsNotFoundError(msg);\n case 400:\n return new TrillboardsValidationError(msg, apiError?.param);\n default:\n return new TrillboardsError(msg, {\n type: apiError?.type,\n code: apiError?.code,\n statusCode: response.status,\n help: apiError?.help,\n param: apiError?.param,\n });\n }\n}\n\n/**\n * Create a reusable authenticated fetch function bound to a\n * specific API key and base URL.\n *\n * - Strips trailing slashes from `apiBase` to avoid double-slash paths.\n * - Applies a 10-second timeout via `AbortSignal.timeout` unless\n * the caller provides their own `signal`.\n * - Always sends `Authorization: Bearer <key>` and\n * `Content-Type: application/json`.\n * - Throws structured `TrillboardsError` subclasses on non-2xx responses.\n * - Logs requests and responses when debug logging is active.\n */\nexport function createAuthenticatedFetch(apiKey: string, apiBase: string) {\n const base = apiBase.replace(/\\/+$/, '');\n\n return async (path: string, options?: RequestInit): Promise<any> => {\n const method = options?.method ?? 'GET';\n const start = Date.now();\n\n logger.debug(`${method} ${path}`, { base });\n\n const response = await globalThis.fetch(`${base}${path}`, {\n ...options,\n signal: options?.signal ?? AbortSignal.timeout(10000),\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n ...((options?.headers as Record<string, string>) ?? {}),\n },\n });\n\n const ms = Date.now() - start;\n\n if (!response.ok) {\n const error = await errorFromResponse(response, path);\n logger.debug(`${method} ${path} -> ${response.status} (${ms}ms) ERROR`);\n throw error;\n }\n\n logger.debug(`${method} ${path} -> ${response.status} (${ms}ms)`);\n\n return response.json();\n };\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface VastTagBuilderConfig {\n apiKey: string;\n apiBase?: string;\n}\n\nexport interface BuildTagOptions {\n deviceId: string;\n width?: number;\n height?: number;\n orientation?: 'portrait' | 'landscape';\n muted?: boolean;\n autoplay?: boolean;\n userAgent?: string;\n}\n\nexport interface VastTagResult {\n url: string;\n sources: Array<{\n name: string;\n vast_url: string;\n priority: number;\n timeout_ms: number;\n }>;\n auctionWinner?: {\n source: string;\n bid_price_cpm: number;\n vast_url: string;\n } | null;\n}\n\nexport class VastTagBuilder {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(config: VastTagBuilderConfig) {\n this.authFetch = createAuthenticatedFetch(config.apiKey, config.apiBase ?? 'https://api.trillboards.com/v1');\n }\n\n async buildTag(options: BuildTagOptions): Promise<VastTagResult> {\n const params = new URLSearchParams();\n if (options.width) params.set('slot_w', String(options.width));\n if (options.height) params.set('slot_h', String(options.height));\n if (options.orientation) params.set('orientation', options.orientation);\n if (options.muted !== undefined) params.set('muted', options.muted ? '1' : '0');\n if (options.autoplay !== undefined) params.set('autoplay', options.autoplay ? '1' : '0');\n if (options.userAgent) params.set('ua', options.userAgent);\n\n const query = params.toString();\n const path = `/partner/device/${options.deviceId}/ads${query ? `?${query}` : ''}`;\n\n const data = await this.authFetch(path);\n const hbs = data.data?.header_bidding_settings;\n\n return {\n url: hbs?.vast_tag_url ?? '',\n sources: (hbs?.vast_waterfall?.sources ?? []).map((s: any) => ({\n name: s.name,\n vast_url: s.vast_url,\n priority: s.priority,\n timeout_ms: s.timeout_ms,\n })),\n auctionWinner: hbs?.auction_winner ?? null,\n };\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface TrackingBatchConfig {\n apiKey: string;\n apiBase?: string;\n}\n\nexport interface ImpressionReport {\n adId: string;\n impressionId: string;\n deviceId: string;\n screenId?: string;\n duration: number;\n completed: boolean;\n timestamp: string;\n}\n\nexport interface TrackingResult {\n success: boolean;\n tracked: number;\n proofs: Array<{\n impressionId: string;\n proof: string;\n publicKeyUrl: string;\n }>;\n}\n\nexport class TrackingBatch {\n private apiBase: string;\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(config: TrackingBatchConfig) {\n this.apiBase = (config.apiBase ?? 'https://api.trillboards.com/v1').replace(/\\/+$/, '');\n this.authFetch = createAuthenticatedFetch(config.apiKey, config.apiBase ?? 'https://api.trillboards.com/v1');\n }\n\n async report(impressions: ImpressionReport[]): Promise<TrackingResult> {\n const data = await this.authFetch('/partner/tracking/batch', {\n method: 'POST',\n body: JSON.stringify({ impressions }),\n });\n\n return {\n success: data.success ?? true,\n tracked: data.data?.tracked ?? impressions.length,\n proofs: (data.data?.proofs ?? []).map((p: any) => ({\n impressionId: p.impression_id,\n proof: p.proof,\n publicKeyUrl: p.public_key_url ?? `${this.apiBase}/.well-known/public-key`,\n })),\n };\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface LiveAudience {\n face_count: number;\n attention_score: number;\n mood: string | null;\n income_level: string | null;\n purchase_intent: number | null;\n dwell_time_ms: number | null;\n timestamp: string;\n}\n\nexport interface AudiencePrediction {\n predicted_face_count: number;\n predicted_attention_score: number;\n predicted_mood: string | null;\n confidence: number;\n hour: number;\n dayOfWeek: number;\n}\n\nexport interface LookalikeScreen {\n screenId: string;\n similarity: number;\n audience_profile: Record<string, unknown>;\n}\n\nexport class AudienceClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async getLive(screenId: string): Promise<LiveAudience> {\n const data = await this.authFetch(`/partner/audience/live/${screenId}`);\n return data.data ?? data;\n }\n\n async predict(screenId: string, options: { hour: number; dayOfWeek: number }): Promise<AudiencePrediction> {\n const params = new URLSearchParams({\n hour: String(options.hour),\n day_of_week: String(options.dayOfWeek),\n });\n const data = await this.authFetch(`/partner/audience/predict/${screenId}?${params}`);\n return data.data ?? data;\n }\n\n async findLookalikes(screenId: string, options?: { limit?: number; minSimilarity?: number }): Promise<LookalikeScreen[]> {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.minSimilarity) params.set('min_similarity', String(options.minSimilarity));\n const query = params.toString();\n const data = await this.authFetch(`/partner/audience/lookalikes/${screenId}${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface ScreenDailyAnalytics {\n date: string;\n ads: {\n plays_started: number;\n plays_completed: number;\n completion_rate: number;\n programmatic_plays: number;\n direct_plays: number;\n };\n audience: {\n avg_face_count: number;\n avg_attention_score: number;\n peak_viewers: number;\n };\n earnings: {\n programmatic_cents: number;\n direct_cents: number;\n total_cents: number;\n };\n streaming: {\n seconds: number;\n uptime_percentage: number;\n };\n}\n\nexport interface EarningsData {\n screenId: string;\n period: string;\n impressions_count: number;\n cpm_rate: number;\n gross_revenue: number;\n earner_revenue: number;\n earner_share_rate: number;\n}\n\nexport class AnalyticsClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async getScreenDaily(screenId: string, options: { startDate: string; endDate: string }): Promise<ScreenDailyAnalytics[]> {\n const params = new URLSearchParams({\n start_date: options.startDate,\n end_date: options.endDate,\n });\n const data = await this.authFetch(`/partner/screens/${screenId}/analytics?${params}`);\n return data.data ?? [];\n }\n\n async getEarnings(options?: { screenId?: string; startDate?: string; endDate?: string }): Promise<EarningsData[]> {\n const params = new URLSearchParams();\n if (options?.screenId) params.set('screen_id', options.screenId);\n if (options?.startDate) params.set('start_date', options.startDate);\n if (options?.endDate) params.set('end_date', options.endDate);\n const query = params.toString();\n const data = await this.authFetch(`/partner/earnings${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface AuctionResult {\n auction_id: string;\n screen_id: string;\n timestamp: string;\n winning_bid: {\n bid_price_cpm: number;\n dsp_name: string;\n creative_id: string;\n vast_url: string;\n } | null;\n all_bids: Array<{\n dsp_name: string;\n bid_price_cpm: number;\n latency_ms: number;\n }>;\n latency_ms: number;\n floor_price_cpm: number;\n}\n\nexport class AuctionClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async list(options?: { screenId?: string; limit?: number; offset?: number }): Promise<AuctionResult[]> {\n const params = new URLSearchParams();\n if (options?.screenId) params.set('screen_id', options.screenId);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n const data = await this.authFetch(`/partner/auctions${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n\n async get(auctionId: string): Promise<AuctionResult> {\n const data = await this.authFetch(`/partner/auctions/${auctionId}`);\n return data.data ?? data;\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface CreativeReview {\n creative_id: string;\n advertiser_name: string;\n creative_url: string;\n status: 'pending' | 'approved' | 'flagged' | 'blocked';\n iab_categories: string[];\n age_rating: string | null;\n brand_detected: string | null;\n content_flags: string[];\n reviewed_at: string | null;\n created_at: string;\n}\n\nexport interface CreativeStats {\n total: number;\n pending: number;\n approved: number;\n flagged: number;\n blocked: number;\n}\n\nexport class CreativeClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async list(options?: { status?: string; limit?: number; offset?: number }): Promise<CreativeReview[]> {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n const data = await this.authFetch(`/openrtb/v1/creative-review${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n\n async getStats(): Promise<CreativeStats> {\n const data = await this.authFetch('/openrtb/v1/creative-review/stats');\n return data.data ?? data;\n }\n\n async block(creativeId: string, reason?: string): Promise<void> {\n await this.authFetch(`/openrtb/v1/creative-review/${creativeId}/block`, {\n method: 'POST',\n body: JSON.stringify({ reason }),\n });\n }\n\n async unblock(creativeId: string): Promise<void> {\n await this.authFetch(`/openrtb/v1/creative-review/${creativeId}/unblock`, {\n method: 'POST',\n });\n }\n}\n","import { VastTagBuilder } from './VastTagBuilder';\nimport { TrackingBatch } from './TrackingBatch';\nimport { AudienceClient } from './AudienceClient';\nimport { AnalyticsClient } from './AnalyticsClient';\nimport { AuctionClient } from './AuctionClient';\nimport { CreativeClient } from './CreativeClient';\nimport { createAuthenticatedFetch } from './fetchWithAuth';\nimport { TrillboardsError, TrillboardsAuthenticationError, TrillboardsValidationError } from '../errors';\nimport { logger, setLogLevel } from '../logger';\n\nexport interface PartnerClientConfig {\n apiKey?: string;\n apiBase?: string;\n debug?: boolean;\n}\n\nexport interface QuickStartResult {\n partner: {\n partner_id: string;\n name: string;\n slug: string;\n status: string;\n revenue_share_percent: number;\n };\n credentials: {\n api_key: string;\n api_key_prefix: string;\n warning: string;\n };\n device: {\n device_id: string;\n external_device_id: string;\n fingerprint: string;\n screen_id: string;\n name: string;\n status: string;\n embed_url: string;\n };\n integration: {\n sdk_snippet: string;\n iframe_snippet: string;\n embed_url: string;\n api_base: string;\n sdk_url: string;\n docs_url: string;\n };\n sdk_config: Record<string, unknown>;\n next_steps: string[];\n client: PartnerClient;\n}\n\nexport class PartnerClient {\n private apiKey: string;\n private apiBase: string;\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n readonly audience: AudienceClient;\n readonly analytics: AnalyticsClient;\n readonly auctions: AuctionClient;\n readonly creatives: CreativeClient;\n\n constructor(config: PartnerClientConfig = {}) {\n const debug = config.debug ?? (typeof process !== 'undefined' && process.env?.TRILLBOARDS_DEBUG === 'true');\n if (debug) {\n setLogLevel('debug');\n }\n\n const resolvedKey = config.apiKey\n ?? (typeof process !== 'undefined' ? process.env?.TRILLBOARDS_API_KEY : undefined);\n\n if (!resolvedKey) {\n throw new TrillboardsAuthenticationError(\n 'No API key provided. Pass apiKey in config or set TRILLBOARDS_API_KEY environment variable.',\n );\n }\n\n this.apiKey = resolvedKey;\n this.apiBase = config.apiBase ?? 'https://api.trillboards.com/v1';\n this.authFetch = createAuthenticatedFetch(this.apiKey, this.apiBase);\n\n this.audience = new AudienceClient(this.apiKey, this.apiBase);\n this.analytics = new AnalyticsClient(this.apiKey, this.apiBase);\n this.auctions = new AuctionClient(this.apiKey, this.apiBase);\n this.creatives = new CreativeClient(this.apiKey, this.apiBase);\n\n if (this.isTestMode) {\n logger.info('Test mode active');\n }\n\n logger.debug('PartnerClient initialized', {\n apiBase: this.apiBase,\n testMode: this.isTestMode,\n });\n }\n\n /** Returns `true` if the API key is a test key (`trb_test_*`). */\n get isTestMode(): boolean {\n return this.apiKey.startsWith('trb_test_');\n }\n\n /**\n * One-call onboarding: register a partner, create the first device,\n * and return a pre-authenticated `PartnerClient` instance ready to use.\n *\n * This calls `POST /v1/partner/quick-start` (public, no auth required).\n */\n static async quickStart(options: {\n companyName: string;\n email: string;\n deviceName?: string;\n apiBase?: string;\n debug?: boolean;\n }): Promise<QuickStartResult> {\n const base = (options.apiBase ?? 'https://api.trillboards.com/v1').replace(/\\/+$/, '');\n\n if (options.debug) {\n setLogLevel('debug');\n }\n\n logger.debug('QuickStart: registering partner', {\n company: options.companyName,\n email: options.email,\n });\n\n const response = await globalThis.fetch(`${base}/partner/quick-start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n company_name: options.companyName,\n email: options.email,\n device_name: options.deviceName,\n }),\n signal: AbortSignal.timeout(30000),\n });\n\n if (!response.ok) {\n let errorMsg = `Quick start failed: HTTP ${response.status}`;\n let errorCode = 'quick_start_failed';\n try {\n const body = await response.json();\n errorMsg = body?.error?.message ?? body?.message ?? errorMsg;\n errorCode = body?.error?.code ?? errorCode;\n } catch { /* ignore parse errors */ }\n\n if (response.status === 400) {\n throw new TrillboardsValidationError(errorMsg);\n }\n throw new TrillboardsError(errorMsg, {\n code: errorCode,\n statusCode: response.status,\n });\n }\n\n const json = await response.json();\n const data = json.data;\n\n const client = new PartnerClient({\n apiKey: data.credentials.api_key,\n apiBase: options.apiBase,\n debug: options.debug,\n });\n\n return { ...data, client };\n }\n\n createVastTagBuilder(): VastTagBuilder {\n return new VastTagBuilder({ apiKey: this.apiKey, apiBase: this.apiBase });\n }\n\n createTrackingBatch(): TrackingBatch {\n return new TrackingBatch({ apiKey: this.apiKey, apiBase: this.apiBase });\n }\n\n protected async fetch(path: string, options: RequestInit = {}): Promise<any> {\n return this.authFetch(path, options);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/logger.ts","../src/server/fetchWithAuth.ts","../src/server/VastTagBuilder.ts","../src/server/TrackingBatch.ts","../src/server/AudienceClient.ts","../src/server/AnalyticsClient.ts","../src/server/AuctionClient.ts","../src/server/CreativeClient.ts","../src/server/PartnerClient.ts"],"names":[],"mappings":"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","file":"server.mjs","sourcesContent":["// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Structured error classes\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Base error class for all Trillboards SDK errors.\n * Mirrors the API error response shape: `{ type, code, message, param, help }`.\n */\nexport class TrillboardsError extends Error {\n readonly type: string;\n readonly code: string;\n readonly statusCode: number;\n readonly help?: string;\n readonly param?: string;\n\n constructor(\n message: string,\n options: {\n type?: string;\n code?: string;\n statusCode?: number;\n help?: string;\n param?: string;\n } = {},\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = 'TrillboardsError';\n this.type = options.type ?? 'api_error';\n this.code = options.code ?? 'unknown_error';\n this.statusCode = options.statusCode ?? 500;\n this.help = options.help;\n this.param = options.param;\n }\n}\n\n/** Thrown on HTTP 401 — invalid or missing API key. */\nexport class TrillboardsAuthenticationError extends TrillboardsError {\n constructor(message?: string) {\n super(\n message ?? 'Invalid API key. Check your key at https://trillboards.com/support/developers',\n {\n type: 'authentication_error',\n code: 'invalid_api_key',\n statusCode: 401,\n help: 'https://trillboards.com/support/developers',\n },\n );\n this.name = 'TrillboardsAuthenticationError';\n }\n}\n\n/** Thrown on HTTP 429 — rate limit exceeded. */\nexport class TrillboardsRateLimitError extends TrillboardsError {\n readonly retryAfter: number;\n\n constructor(retryAfter: number, message?: string) {\n super(\n message ?? `Rate limit exceeded. Retry after ${retryAfter} seconds.`,\n {\n type: 'rate_limit_error',\n code: 'rate_limited',\n statusCode: 429,\n },\n );\n this.name = 'TrillboardsRateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/** Thrown on HTTP 404 — resource not found. */\nexport class TrillboardsNotFoundError extends TrillboardsError {\n constructor(message?: string) {\n super(\n message ?? 'The requested resource was not found.',\n {\n type: 'not_found_error',\n code: 'resource_not_found',\n statusCode: 404,\n help: 'Verify the ID is correct and belongs to your account.',\n },\n );\n this.name = 'TrillboardsNotFoundError';\n }\n}\n\n/** Thrown on HTTP 400 — validation / bad request. */\nexport class TrillboardsValidationError extends TrillboardsError {\n constructor(message?: string, param?: string) {\n super(\n message ?? 'The request was invalid.',\n {\n type: 'validation_error',\n code: 'invalid_request',\n statusCode: 400,\n param,\n },\n );\n this.name = 'TrillboardsValidationError';\n }\n}\n","// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Lightweight debug logger\n// ─────────────────────────────────────────────────────────────\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nconst PREFIX = '[Trillboards]';\n\nclass Logger {\n private level: LogLevel = 'none';\n\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n debug(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.debug) {\n if (data !== undefined) {\n console.debug(PREFIX, message, data);\n } else {\n console.debug(PREFIX, message);\n }\n }\n }\n\n info(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.info) {\n if (data !== undefined) {\n console.info(PREFIX, message, data);\n } else {\n console.info(PREFIX, message);\n }\n }\n }\n\n warn(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.warn) {\n if (data !== undefined) {\n console.warn(PREFIX, message, data);\n } else {\n console.warn(PREFIX, message);\n }\n }\n }\n\n error(message: string, data?: unknown) {\n if (LEVEL_PRIORITY[this.level] <= LEVEL_PRIORITY.error) {\n if (data !== undefined) {\n console.error(PREFIX, message, data);\n } else {\n console.error(PREFIX, message);\n }\n }\n }\n}\n\n/** Singleton logger instance shared across the SDK. */\nexport const logger = new Logger();\n\n/** Set the global log level for the SDK. */\nexport function setLogLevel(level: LogLevel) {\n logger.setLevel(level);\n}\n","// ─────────────────────────────────────────────────────────────\n// @trillboards/ads-sdk — Shared authenticated fetch utility\n// ─────────────────────────────────────────────────────────────\n\nimport {\n TrillboardsError,\n TrillboardsAuthenticationError,\n TrillboardsRateLimitError,\n TrillboardsNotFoundError,\n TrillboardsValidationError,\n} from '../errors';\nimport { logger } from '../logger';\n\n/**\n * Parse a non-2xx response into the appropriate error class.\n *\n * Attempts to read a JSON body matching the API error shape\n * `{ error: { type, code, message, param, help } }`. Falls back\n * to a generic `TrillboardsError` when the body is unreadable.\n */\nasync function errorFromResponse(response: Response, path: string): Promise<TrillboardsError> {\n let body: any;\n try {\n body = await response.json();\n } catch {\n // body is not JSON — fall through to status-based error\n }\n\n const apiError = body?.error ?? body;\n const msg = apiError?.message ?? `API error: HTTP ${response.status}`;\n\n switch (response.status) {\n case 401:\n return new TrillboardsAuthenticationError(msg);\n case 429: {\n const retryHeader = response.headers.get('retry-after');\n const retryAfter = retryHeader ? parseInt(retryHeader, 10) : 60;\n return new TrillboardsRateLimitError(isNaN(retryAfter) ? 60 : retryAfter, msg);\n }\n case 404:\n return new TrillboardsNotFoundError(msg);\n case 400:\n return new TrillboardsValidationError(msg, apiError?.param);\n default:\n return new TrillboardsError(msg, {\n type: apiError?.type,\n code: apiError?.code,\n statusCode: response.status,\n help: apiError?.help,\n param: apiError?.param,\n });\n }\n}\n\n/**\n * Create a reusable authenticated fetch function bound to a\n * specific API key and base URL.\n *\n * - Strips trailing slashes from `apiBase` to avoid double-slash paths.\n * - Applies a 10-second timeout via `AbortSignal.timeout` unless\n * the caller provides their own `signal`.\n * - Always sends `Authorization: Bearer <key>` and\n * `Content-Type: application/json`.\n * - Throws structured `TrillboardsError` subclasses on non-2xx responses.\n * - Logs requests and responses when debug logging is active.\n */\nexport function createAuthenticatedFetch(apiKey: string, apiBase: string) {\n const base = apiBase.replace(/\\/+$/, '');\n\n return async (path: string, options?: RequestInit): Promise<any> => {\n const method = options?.method ?? 'GET';\n const start = Date.now();\n\n logger.debug(`${method} ${path}`, { base });\n\n const response = await globalThis.fetch(`${base}${path}`, {\n ...options,\n signal: options?.signal ?? AbortSignal.timeout(10000),\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n ...((options?.headers as Record<string, string>) ?? {}),\n },\n });\n\n const ms = Date.now() - start;\n\n if (!response.ok) {\n const error = await errorFromResponse(response, path);\n logger.debug(`${method} ${path} -> ${response.status} (${ms}ms) ERROR`);\n throw error;\n }\n\n logger.debug(`${method} ${path} -> ${response.status} (${ms}ms)`);\n\n // 204 No Content — nothing to parse\n if (response.status === 204) {\n return undefined;\n }\n\n return response.json();\n };\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface VastTagBuilderConfig {\n apiKey: string;\n apiBase?: string;\n}\n\nexport interface BuildTagOptions {\n deviceId: string;\n width?: number;\n height?: number;\n orientation?: 'portrait' | 'landscape';\n muted?: boolean;\n autoplay?: boolean;\n userAgent?: string;\n}\n\nexport interface VastTagResult {\n url: string;\n sources: Array<{\n name: string;\n vast_url: string;\n priority: number;\n timeout_ms: number;\n }>;\n auctionWinner?: {\n source: string;\n bid_price_cpm: number;\n vast_url: string;\n } | null;\n}\n\nexport class VastTagBuilder {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(config: VastTagBuilderConfig) {\n this.authFetch = createAuthenticatedFetch(config.apiKey, config.apiBase ?? 'https://api.trillboards.com/v1');\n }\n\n async buildTag(options: BuildTagOptions): Promise<VastTagResult> {\n const params = new URLSearchParams();\n if (options.width) params.set('slot_w', String(options.width));\n if (options.height) params.set('slot_h', String(options.height));\n if (options.orientation) params.set('orientation', options.orientation);\n if (options.muted !== undefined) params.set('muted', options.muted ? '1' : '0');\n if (options.autoplay !== undefined) params.set('autoplay', options.autoplay ? '1' : '0');\n if (options.userAgent) params.set('ua', options.userAgent);\n\n const query = params.toString();\n const path = `/partner/device/${options.deviceId}/ads${query ? `?${query}` : ''}`;\n\n const data = await this.authFetch(path);\n const hbs = data.data?.header_bidding_settings;\n\n return {\n url: hbs?.vast_tag_url ?? '',\n sources: (hbs?.vast_waterfall?.sources ?? []).map((s: any) => ({\n name: s.name,\n vast_url: s.vast_url,\n priority: s.priority,\n timeout_ms: s.timeout_ms,\n })),\n auctionWinner: hbs?.auction_winner ?? null,\n };\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface TrackingBatchConfig {\n apiKey: string;\n apiBase?: string;\n}\n\nexport interface ImpressionReport {\n adId: string;\n impressionId: string;\n deviceId: string;\n screenId?: string;\n duration: number;\n completed: boolean;\n timestamp: string;\n}\n\nexport interface TrackingResult {\n success: boolean;\n tracked: number;\n proofs: Array<{\n impressionId: string;\n proof: string;\n publicKeyUrl: string;\n }>;\n}\n\nexport class TrackingBatch {\n private apiBase: string;\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(config: TrackingBatchConfig) {\n this.apiBase = (config.apiBase ?? 'https://api.trillboards.com/v1').replace(/\\/+$/, '');\n this.authFetch = createAuthenticatedFetch(config.apiKey, config.apiBase ?? 'https://api.trillboards.com/v1');\n }\n\n async report(impressions: ImpressionReport[]): Promise<TrackingResult> {\n const data = await this.authFetch('/partner/tracking/batch', {\n method: 'POST',\n body: JSON.stringify({ impressions }),\n });\n\n return {\n success: data.success ?? true,\n tracked: data.data?.tracked ?? impressions.length,\n proofs: (data.data?.proofs ?? []).map((p: any) => ({\n impressionId: p.impression_id,\n proof: p.proof,\n publicKeyUrl: p.public_key_url ?? `${this.apiBase}/.well-known/public-key`,\n })),\n };\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface LiveAudience {\n face_count: number;\n attention_score: number;\n mood: string | null;\n income_level: string | null;\n purchase_intent: number | null;\n dwell_time_ms: number | null;\n timestamp: string;\n}\n\nexport interface AudiencePrediction {\n predicted_face_count: number;\n predicted_attention_score: number;\n predicted_mood: string | null;\n confidence: number;\n hour: number;\n dayOfWeek: number;\n}\n\nexport interface LookalikeScreen {\n screenId: string;\n similarity: number;\n audience_profile: Record<string, unknown>;\n}\n\nexport class AudienceClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async getLive(screenId: string): Promise<LiveAudience> {\n const data = await this.authFetch(`/partner/audience/live/${screenId}`);\n return data.data ?? data;\n }\n\n async predict(screenId: string, options: { hour: number; dayOfWeek: number }): Promise<AudiencePrediction> {\n const params = new URLSearchParams({\n hour: String(options.hour),\n day_of_week: String(options.dayOfWeek),\n });\n const data = await this.authFetch(`/partner/audience/predict/${screenId}?${params}`);\n return data.data ?? data;\n }\n\n async findLookalikes(screenId: string, options?: { limit?: number; minSimilarity?: number }): Promise<LookalikeScreen[]> {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.minSimilarity) params.set('min_similarity', String(options.minSimilarity));\n const query = params.toString();\n const data = await this.authFetch(`/partner/audience/lookalikes/${screenId}${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface ScreenDailyAnalytics {\n date: string;\n ads: {\n plays_started: number;\n plays_completed: number;\n completion_rate: number;\n programmatic_plays: number;\n direct_plays: number;\n };\n audience: {\n avg_face_count: number;\n avg_attention_score: number;\n peak_viewers: number;\n };\n earnings: {\n programmatic_cents: number;\n direct_cents: number;\n total_cents: number;\n };\n streaming: {\n seconds: number;\n uptime_percentage: number;\n };\n}\n\nexport interface EarningsData {\n screenId: string;\n period: string;\n impressions_count: number;\n cpm_rate: number;\n gross_revenue: number;\n earner_revenue: number;\n earner_share_rate: number;\n}\n\nexport class AnalyticsClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async getScreenDaily(screenId: string, options: { startDate: string; endDate: string }): Promise<ScreenDailyAnalytics[]> {\n const params = new URLSearchParams({\n start_date: options.startDate,\n end_date: options.endDate,\n });\n const data = await this.authFetch(`/partner/screens/${screenId}/analytics?${params}`);\n return data.data ?? [];\n }\n\n async getEarnings(options?: { screenId?: string; startDate?: string; endDate?: string }): Promise<EarningsData[]> {\n const params = new URLSearchParams();\n if (options?.screenId) params.set('screen_id', options.screenId);\n if (options?.startDate) params.set('start_date', options.startDate);\n if (options?.endDate) params.set('end_date', options.endDate);\n const query = params.toString();\n const data = await this.authFetch(`/partner/earnings${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface AuctionResult {\n auction_id: string;\n screen_id: string;\n timestamp: string;\n winning_bid: {\n bid_price_cpm: number;\n dsp_name: string;\n creative_id: string;\n vast_url: string;\n } | null;\n all_bids: Array<{\n dsp_name: string;\n bid_price_cpm: number;\n latency_ms: number;\n }>;\n latency_ms: number;\n floor_price_cpm: number;\n}\n\nexport class AuctionClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async list(options?: { screenId?: string; limit?: number; offset?: number }): Promise<AuctionResult[]> {\n const params = new URLSearchParams();\n if (options?.screenId) params.set('screen_id', options.screenId);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n const data = await this.authFetch(`/partner/auctions${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n\n async get(auctionId: string): Promise<AuctionResult> {\n const data = await this.authFetch(`/partner/auctions/${auctionId}`);\n return data.data ?? data;\n }\n}\n","import { createAuthenticatedFetch } from './fetchWithAuth';\n\nexport interface CreativeReview {\n creative_id: string;\n advertiser_name: string;\n creative_url: string;\n status: 'pending' | 'approved' | 'flagged' | 'blocked';\n iab_categories: string[];\n age_rating: string | null;\n brand_detected: string | null;\n content_flags: string[];\n reviewed_at: string | null;\n created_at: string;\n}\n\nexport interface CreativeStats {\n total: number;\n pending: number;\n approved: number;\n flagged: number;\n blocked: number;\n}\n\nexport class CreativeClient {\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n constructor(apiKey: string, apiBase: string) {\n this.authFetch = createAuthenticatedFetch(apiKey, apiBase);\n }\n\n async list(options?: { status?: string; limit?: number; offset?: number }): Promise<CreativeReview[]> {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const query = params.toString();\n const data = await this.authFetch(`/openrtb/v1/creative-review${query ? `?${query}` : ''}`);\n return data.data ?? [];\n }\n\n async getStats(): Promise<CreativeStats> {\n const data = await this.authFetch('/openrtb/v1/creative-review/stats');\n return data.data ?? data;\n }\n\n async block(creativeId: string, reason?: string): Promise<void> {\n await this.authFetch(`/openrtb/v1/creative-review/${creativeId}/block`, {\n method: 'POST',\n body: JSON.stringify({ reason }),\n });\n }\n\n async unblock(creativeId: string): Promise<void> {\n await this.authFetch(`/openrtb/v1/creative-review/${creativeId}/unblock`, {\n method: 'POST',\n });\n }\n}\n","import { VastTagBuilder } from './VastTagBuilder';\nimport { TrackingBatch } from './TrackingBatch';\nimport { AudienceClient } from './AudienceClient';\nimport { AnalyticsClient } from './AnalyticsClient';\nimport { AuctionClient } from './AuctionClient';\nimport { CreativeClient } from './CreativeClient';\nimport { createAuthenticatedFetch } from './fetchWithAuth';\nimport { TrillboardsError, TrillboardsAuthenticationError, TrillboardsValidationError } from '../errors';\nimport { logger, setLogLevel } from '../logger';\n\nexport interface PartnerClientConfig {\n apiKey?: string;\n apiBase?: string;\n debug?: boolean;\n}\n\nexport interface QuickStartResult {\n partner: {\n partner_id: string;\n name: string;\n slug: string;\n status: string;\n revenue_share_percent: number;\n };\n credentials: {\n api_key: string;\n api_key_prefix: string;\n warning: string;\n };\n device: {\n device_id: string;\n external_device_id: string;\n fingerprint: string;\n screen_id: string;\n name: string;\n status: string;\n embed_url: string;\n };\n integration: {\n sdk_snippet: string;\n iframe_snippet: string;\n embed_url: string;\n api_base: string;\n sdk_url: string;\n docs_url: string;\n };\n sdk_config: Record<string, unknown>;\n next_steps: string[];\n client: PartnerClient;\n}\n\nexport class PartnerClient {\n private apiKey: string;\n private apiBase: string;\n private authFetch: ReturnType<typeof createAuthenticatedFetch>;\n\n readonly audience: AudienceClient;\n readonly analytics: AnalyticsClient;\n readonly auctions: AuctionClient;\n readonly creatives: CreativeClient;\n\n constructor(config: PartnerClientConfig = {}) {\n const debug = config.debug ?? (typeof process !== 'undefined' && process.env?.TRILLBOARDS_DEBUG === 'true');\n if (debug) {\n setLogLevel('debug');\n }\n\n const resolvedKey = config.apiKey\n ?? (typeof process !== 'undefined' ? process.env?.TRILLBOARDS_API_KEY : undefined);\n\n if (!resolvedKey) {\n throw new TrillboardsAuthenticationError(\n 'No API key provided. Pass apiKey in config or set TRILLBOARDS_API_KEY environment variable.',\n );\n }\n\n this.apiKey = resolvedKey;\n this.apiBase = config.apiBase ?? 'https://api.trillboards.com/v1';\n this.authFetch = createAuthenticatedFetch(this.apiKey, this.apiBase);\n\n this.audience = new AudienceClient(this.apiKey, this.apiBase);\n this.analytics = new AnalyticsClient(this.apiKey, this.apiBase);\n this.auctions = new AuctionClient(this.apiKey, this.apiBase);\n this.creatives = new CreativeClient(this.apiKey, this.apiBase);\n\n if (this.isTestMode) {\n logger.info('Test mode active');\n }\n\n logger.debug('PartnerClient initialized', {\n apiBase: this.apiBase,\n testMode: this.isTestMode,\n });\n }\n\n /** Returns `true` if the API key is a test key (`trb_test_*`). */\n get isTestMode(): boolean {\n return this.apiKey.startsWith('trb_test_');\n }\n\n /**\n * One-call onboarding: register a partner, create the first device,\n * and return a pre-authenticated `PartnerClient` instance ready to use.\n *\n * This calls `POST /v1/partner/quick-start` (public, no auth required).\n */\n static async quickStart(options: {\n companyName: string;\n email: string;\n deviceName?: string;\n apiBase?: string;\n debug?: boolean;\n }): Promise<QuickStartResult> {\n const base = (options.apiBase ?? 'https://api.trillboards.com/v1').replace(/\\/+$/, '');\n\n if (options.debug) {\n setLogLevel('debug');\n }\n\n logger.debug('QuickStart: registering partner', {\n company: options.companyName,\n email: options.email,\n });\n\n const response = await globalThis.fetch(`${base}/partner/quick-start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n company_name: options.companyName,\n email: options.email,\n device_name: options.deviceName,\n }),\n signal: AbortSignal.timeout(30000),\n });\n\n if (!response.ok) {\n let errorMsg = `Quick start failed: HTTP ${response.status}`;\n let errorCode = 'quick_start_failed';\n try {\n const body = await response.json();\n errorMsg = body?.error?.message ?? body?.message ?? errorMsg;\n errorCode = body?.error?.code ?? errorCode;\n } catch { /* ignore parse errors */ }\n\n if (response.status === 400) {\n throw new TrillboardsValidationError(errorMsg);\n }\n throw new TrillboardsError(errorMsg, {\n code: errorCode,\n statusCode: response.status,\n });\n }\n\n const json = await response.json();\n const data = json.data;\n\n const client = new PartnerClient({\n apiKey: data.credentials.api_key,\n apiBase: options.apiBase,\n debug: options.debug,\n });\n\n return { ...data, client };\n }\n\n createVastTagBuilder(): VastTagBuilder {\n return new VastTagBuilder({ apiKey: this.apiKey, apiBase: this.apiBase });\n }\n\n createTrackingBatch(): TrackingBatch {\n return new TrackingBatch({ apiKey: this.apiKey, apiBase: this.apiBase });\n }\n\n protected async fetch(path: string, options: RequestInit = {}): Promise<any> {\n return this.authFetch(path, options);\n }\n}\n"]}
|