@looplay/sdk 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -1
- package/dist/looplay-sdk.cjs.js +330 -32
- package/dist/looplay-sdk.cjs.js.map +1 -1
- package/dist/looplay-sdk.esm.js +330 -33
- package/dist/looplay-sdk.esm.js.map +1 -1
- package/dist/looplay-sdk.min.js +3 -1
- package/dist/looplay-sdk.min.js.map +1 -1
- package/dist/types/apps/api-client.d.ts +13 -0
- package/dist/types/apps/http.d.ts +2 -0
- package/dist/types/apps/service-client.d.ts +14 -4
- package/dist/types/auth/jwt.d.ts +2 -0
- package/dist/types/iframe/iframe-auth.d.ts +58 -0
- package/dist/types/iframe/index.d.ts +2 -0
- package/dist/types/iframe/types.d.ts +48 -0
- package/dist/types/index.d.ts +3 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/auth/storage.ts","../src/auth/looplay-auth.ts","../src/apps/http.ts","../src/apps/service-client.ts","../src/apps/api-client.ts","../src/looplay-sdk.ts","../src/auth/providers/telegram-auth-provider.ts"],"names":["text","fetch"],"mappings":"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","file":"looplay-sdk.esm.js","sourcesContent":["export class LooplaySDKError extends Error {\n constructor(message?: string) {\n super(message);\n this.name = 'LooplaySDKError';\n }\n}\n\nexport class NotInitializedError extends LooplaySDKError {\n constructor() {\n super('LooplaySDK not initialized. Call init({ gameId }) first.');\n this.name = 'NotInitializedError';\n }\n}\n\nexport class MissingBaseUrlError extends LooplaySDKError {\n constructor() {\n super('Missing baseUrl. Provide `baseUrl` to enable HTTP integration.');\n this.name = 'MissingBaseUrlError';\n }\n}\n\nexport class MissingAuthError extends LooplaySDKError {\n constructor() {\n super('Missing auth. Provide `auth` options to enable user login/session.');\n this.name = 'MissingAuthError';\n }\n}\n\nexport class NotAuthenticatedError extends LooplaySDKError {\n constructor() {\n super('Not authenticated. Login is required for this operation.');\n this.name = 'NotAuthenticatedError';\n }\n}\n","import type { AuthStorage } from './types';\n\nexport class MemoryAuthStorage implements AuthStorage {\n private readonly map = new Map<string, string>();\n\n async getItem(key: string): Promise<string | null> {\n return this.map.has(key) ? (this.map.get(key) as string) : null;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.map.set(key, value);\n }\n\n async removeItem(key: string): Promise<void> {\n this.map.delete(key);\n }\n}\n\nexport class BrowserLocalStorageAuthStorage implements AuthStorage {\n async getItem(key: string): Promise<string | null> {\n if (typeof window === 'undefined' || !window.localStorage) return null;\n return window.localStorage.getItem(key);\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) return;\n window.localStorage.setItem(key, value);\n }\n\n async removeItem(key: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) return;\n window.localStorage.removeItem(key);\n }\n}\n","import { LooplaySDKError } from '../errors';\nimport {\n type AuthEventName,\n type AuthLoginParams,\n type AuthProvider,\n type AuthStorage,\n type LooplayAuthOptions,\n type LooplaySession\n} from './types';\nimport { MemoryAuthStorage } from './storage';\n\nclass InvalidSessionError extends LooplaySDKError {\n constructor() {\n super('Invalid session returned by auth provider');\n this.name = 'InvalidSessionError';\n }\n}\n\ntype Listener = (session: LooplaySession | null) => void;\n\nexport class LooplayAuth {\n private readonly provider: AuthProvider;\n private readonly storage: AuthStorage;\n private readonly key: string;\n\n private session: LooplaySession | null = null;\n private readonly listeners = new Set<Listener>();\n\n constructor(options: LooplayAuthOptions) {\n this.provider = options.provider;\n this.storage = options.storage ?? new MemoryAuthStorage();\n this.key = `${options.storageKeyPrefix ?? 'looplay'}:auth:session`;\n }\n\n async init(): Promise<void> {\n await this.provider.init?.();\n await this.restoreFromStorage();\n\n // Keep provider in sync with restored session (if any).\n await this.provider.onSessionChanged?.(this.session);\n }\n\n getSession(): LooplaySession | null {\n return this.session;\n }\n\n async login(params?: AuthLoginParams): Promise<LooplaySession> {\n const result = await this.provider.login(params);\n\n if (!result?.session?.user?.id) {\n throw new InvalidSessionError();\n }\n\n await this.setSession(result.session, 'login');\n return result.session;\n }\n\n async logout(): Promise<void> {\n await this.provider.logout();\n await this.setSession(null, 'logout');\n }\n\n async getAccessToken(): Promise<string | undefined> {\n if (!this.session) return undefined;\n\n const now = Date.now();\n const isExpired =\n typeof this.session.expiresAt === 'number' && this.session.expiresAt <= now;\n\n if (!isExpired) return this.session.accessToken;\n\n if (!this.provider.refresh) return this.session.accessToken;\n\n const refreshed = await this.provider.refresh();\n const next = { ...this.session, ...refreshed };\n await this.setSession(next, 'sessionChanged');\n\n return next.accessToken;\n }\n\n on(eventName: AuthEventName, listener: Listener): () => void {\n // eventName reserved for future filtering; for now notify on any change\n void eventName;\n\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private async restoreFromStorage(): Promise<void> {\n const raw = await this.storage.getItem(this.key);\n if (!raw) return;\n\n try {\n const parsed = JSON.parse(raw) as LooplaySession;\n if (parsed?.user?.id) {\n this.session = parsed;\n }\n } catch {\n // ignore corrupted cache\n await this.storage.removeItem(this.key);\n }\n }\n\n private async setSession(next: LooplaySession | null, event: AuthEventName): Promise<void> {\n this.session = next;\n\n await this.provider.onSessionChanged?.(this.session);\n\n if (next) {\n await this.storage.setItem(this.key, JSON.stringify(next));\n } else {\n await this.storage.removeItem(this.key);\n }\n\n for (const listener of this.listeners) {\n listener(this.session);\n }\n\n // reserved for future event-specific hooks\n void event;\n }\n}\n","export type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\nexport interface HttpClientOptions {\n baseUrl: string;\n fetch?: FetchLike;\n defaultHeaders?: Record<string, string>;\n}\n\nexport class HttpError extends Error {\n readonly status: number;\n readonly bodyText?: string;\n\n constructor(message: string, status: number, bodyText?: string) {\n super(message);\n this.name = 'HttpError';\n this.status = status;\n this.bodyText = bodyText;\n }\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly fetchFn: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '');\n this.fetchFn = options.fetch ?? fetch;\n this.defaultHeaders = options.defaultHeaders ?? {};\n }\n\n async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n path: string,\n options?: {\n query?: Record<string, string | number | boolean | undefined>;\n headers?: Record<string, string | undefined>;\n bearerToken?: string;\n body?: unknown;\n }\n ): Promise<T> {\n const url = this.buildUrl(path, options?.query);\n\n const headers: Record<string, string> = this.mergeHeaders(\n this.defaultHeaders,\n options?.headers\n );\n\n if (options?.bearerToken) {\n headers.Authorization = `Bearer ${options.bearerToken}`;\n }\n\n let body: BodyInit | undefined;\n if (options?.body !== undefined) {\n headers['Content-Type'] = headers['Content-Type'] ?? 'application/json';\n body = JSON.stringify(options.body);\n }\n\n const res = await this.fetchFn(url, { method, headers, body });\n\n if (!res.ok) {\n const text = await this.safeText(res);\n throw new HttpError(`HTTP ${res.status} ${res.statusText}`, res.status, text);\n }\n\n // Some endpoints may return empty body.\n const text = await this.safeText(res);\n if (!text) return undefined as T;\n\n return JSON.parse(text) as T;\n }\n\n private mergeHeaders(\n ...sources: Array<Record<string, string | undefined> | undefined>\n ): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const src of sources) {\n if (!src) continue;\n for (const [key, value] of Object.entries(src)) {\n if (value === undefined) continue;\n result[key] = value;\n }\n }\n\n return result;\n }\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n ): string {\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${this.baseUrl}${normalizedPath}`);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n }\n\n return url.toString();\n }\n\n private async safeText(res: Response): Promise<string> {\n try {\n return await res.text();\n } catch {\n return '';\n }\n }\n}\n","import { HttpClient, type HttpClientOptions } from './http';\nimport type {\n AuthResultDto,\n EmitGameEventRequest,\n EmitGameEventResponse,\n PagingResponse,\n RefreshTokenRequest,\n TelegramLoginRequest,\n TrackGamePlayRequest,\n TrackMatchEndRequest,\n} from './LooplaySDK.types';\n\nexport interface ServiceClientOptions extends HttpClientOptions {}\n\n/**\n * Low-level HTTP client that maps 1:1 to backend routes.\n * Methods requiring user auth accept `bearerToken` explicitly.\n */\nexport class ServiceClient {\n private readonly http: HttpClient;\n\n constructor(options: ServiceClientOptions) {\n this.http = new HttpClient(options);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Auth\n // ─────────────────────────────────────────────────────────────────────────────\n\n async telegramLogin(telegramInitData: string): Promise<AuthResultDto> {\n const body: TelegramLoginRequest = { telegramInitData };\n return this.http.request('POST', '/account/telegram-login', { body });\n }\n\n async refresh(refreshToken: string): Promise<AuthResultDto> {\n const body: RefreshTokenRequest = { refreshToken };\n return this.http.request('POST', '/account/refresh', { body });\n }\n\n async logout(refreshToken: string): Promise<boolean> {\n const body: RefreshTokenRequest = { refreshToken };\n return this.http.request('POST', '/account/logout', { body });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Games\n // ─────────────────────────────────────────────────────────────────────────────\n\n async listGames(query?: Record<string, any>): Promise<PagingResponse<any>> {\n return this.http.request('GET', '/games', { query });\n }\n\n async getGameDetail(gameId: string, bearerToken: string): Promise<any> {\n return this.http.request('GET', `/games/${encodeURIComponent(gameId)}`, {\n bearerToken,\n });\n }\n\n async listRecentPlayed(\n bearerToken: string,\n query?: Record<string, any>\n ): Promise<PagingResponse<any>> {\n return this.http.request('GET', '/games/recent-play', { bearerToken, query });\n }\n\n async trackPlay(\n bearerToken: string,\n gameId: string,\n playTimeSeconds?: number\n ): Promise<boolean> {\n const body: TrackGamePlayRequest = { playTimeSeconds };\n await this.http.request('POST', `/games/${encodeURIComponent(gameId)}/play`, {\n bearerToken,\n body,\n });\n return true;\n }\n\n async trackMatchEnd(\n bearerToken: string,\n gameId: string,\n body: TrackMatchEndRequest\n ): Promise<boolean> {\n await this.http.request('POST', `/games/${encodeURIComponent(gameId)}/end`, {\n bearerToken,\n body,\n });\n return true;\n }\n\n async emitGameEvent(\n bearerToken: string,\n gameId: string,\n body: EmitGameEventRequest\n ): Promise<EmitGameEventResponse> {\n return this.http.request('POST', `/games/${encodeURIComponent(gameId)}/emit`, {\n bearerToken,\n body,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Balance\n // ─────────────────────────────────────────────────────────────────────────────\n\n async getBalances(bearerToken: string, query?: Record<string, any>): Promise<any> {\n return this.http.request('GET', '/balance', { bearerToken, query });\n }\n\n async getBalanceHistory(\n bearerToken: string,\n query?: Record<string, any>\n ): Promise<PagingResponse<any>> {\n return this.http.request('GET', '/balance/history', { bearerToken, query });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // User\n // ─────────────────────────────────────────────────────────────────────────────\n\n async getMyProfile(bearerToken: string): Promise<any> {\n return this.http.request('GET', '/user/profile', { bearerToken });\n }\n\n async getMyBalance(bearerToken: string): Promise<any> {\n return this.http.request('GET', '/user/balance', { bearerToken });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Referrals\n // ─────────────────────────────────────────────────────────────────────────────\n\n async listReferrals(\n bearerToken: string,\n query?: Record<string, any>\n ): Promise<PagingResponse<any>> {\n return this.http.request('GET', '/referrals', { bearerToken, query });\n }\n\n async setReferral(bearerToken: string, body: Record<string, any>): Promise<boolean> {\n return this.http.request('POST', '/referrals/set', { bearerToken, body });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Tasks / Quests\n // ─────────────────────────────────────────────────────────────────────────────\n\n async listTasks(bearerToken: string): Promise<any[]> {\n return this.http.request('GET', '/task', { bearerToken });\n }\n\n async listFinishedTasks(bearerToken: string): Promise<any[]> {\n return this.http.request('GET', '/task/finished', { bearerToken });\n }\n\n async startTask(bearerToken: string, body: Record<string, any>): Promise<any> {\n return this.http.request('POST', '/task/start', { bearerToken, body });\n }\n\n async claimTask(bearerToken: string, body: Record<string, any>): Promise<any> {\n return this.http.request('POST', '/task/claim', { bearerToken, body });\n }\n\n async getPlatformQuests(\n bearerToken: string,\n query?: Record<string, any>\n ): Promise<any> {\n return this.http.request('GET', '/quest/platform', { bearerToken, query });\n }\n\n async getCampaignQuests(\n bearerToken: string,\n query?: Record<string, any>\n ): Promise<any> {\n return this.http.request('GET', '/quest/campaign', { bearerToken, query });\n }\n\n async claimQuest(bearerToken: string, questProgressId: string): Promise<any> {\n return this.http.request('POST', `/quest/${encodeURIComponent(questProgressId)}/claim`, {\n bearerToken,\n });\n }\n\n async claimMilestone(\n bearerToken: string,\n milestoneId: string,\n body: Record<string, any>\n ): Promise<any> {\n return this.http.request(\n 'POST',\n `/quest/milestone/${encodeURIComponent(milestoneId)}/claim`,\n {\n bearerToken,\n body,\n }\n );\n }\n}\n","import { MissingBaseUrlError, NotAuthenticatedError } from '../errors';\nimport type {\n EmitGameEventRequest,\n EmitGameEventResponse,\n GameEventKey,\n PagingResponse,\n TrackMatchEndRequest,\n} from './LooplaySDK.types';\nimport { ServiceClient } from './service-client';\nimport type { ServiceClientOptions } from './service-client';\n\nexport interface ApiClientOptions extends Omit<ServiceClientOptions, 'baseUrl'> {\n baseUrl?: string;\n getAccessToken?: () => Promise<string | undefined>;\n}\n\n/**\n * High-level API client that injects user auth automatically.\n */\nexport class ApiClient {\n private readonly raw: ServiceClient;\n private readonly getAccessToken?: () => Promise<string | undefined>;\n\n constructor(options: ApiClientOptions) {\n if (!options.baseUrl) throw new MissingBaseUrlError();\n\n this.raw = new ServiceClient({\n baseUrl: options.baseUrl,\n fetch: options.fetch,\n defaultHeaders: options.defaultHeaders,\n });\n\n this.getAccessToken = options.getAccessToken;\n }\n\n /** Expose the underlying route-level client (requires manual bearerToken passing). */\n unsafeRaw(): ServiceClient {\n return this.raw;\n }\n\n // Public endpoints\n async listGames(query?: Record<string, any>): Promise<PagingResponse<any>> {\n return this.raw.listGames(query);\n }\n\n // Authenticated endpoints\n private async requireToken(): Promise<string> {\n const token = await this.getAccessToken?.();\n if (!token) throw new NotAuthenticatedError();\n return token;\n }\n\n async getGameDetail(gameId: string): Promise<any> {\n const token = await this.requireToken();\n return this.raw.getGameDetail(gameId, token);\n }\n\n async listRecentPlayed(query?: Record<string, any>): Promise<PagingResponse<any>> {\n const token = await this.requireToken();\n return this.raw.listRecentPlayed(token, query);\n }\n\n async trackPlay(gameId: string, playTimeSeconds?: number): Promise<boolean> {\n const token = await this.requireToken();\n return this.raw.trackPlay(token, gameId, playTimeSeconds);\n }\n\n async trackMatch(gameId: string, body: TrackMatchEndRequest): Promise<boolean> {\n const token = await this.requireToken();\n return this.raw.trackMatchEnd(token, gameId, body);\n }\n\n async emit(\n gameId: string,\n actionCode: GameEventKey | string,\n opts?: { value?: number; refId?: string; payload?: Record<string, unknown> }\n ): Promise<EmitGameEventResponse> {\n const token = await this.requireToken();\n const body: EmitGameEventRequest = {\n actionCode,\n value: opts?.value,\n refId: opts?.refId,\n payload: opts?.payload,\n };\n return this.raw.emitGameEvent(token, gameId, body);\n }\n\n async getMyProfile(): Promise<any> {\n const token = await this.requireToken();\n return this.raw.getMyProfile(token);\n }\n\n async getMyBalance(): Promise<any> {\n const token = await this.requireToken();\n return this.raw.getMyBalance(token);\n }\n\n async getBalances(query?: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.getBalances(token, query);\n }\n\n async getBalanceHistory(query?: Record<string, any>): Promise<PagingResponse<any>> {\n const token = await this.requireToken();\n return this.raw.getBalanceHistory(token, query);\n }\n\n async listReferrals(query?: Record<string, any>): Promise<PagingResponse<any>> {\n const token = await this.requireToken();\n return this.raw.listReferrals(token, query);\n }\n\n async setReferral(body: Record<string, any>): Promise<boolean> {\n const token = await this.requireToken();\n return this.raw.setReferral(token, body);\n }\n\n async listTasks(): Promise<any[]> {\n const token = await this.requireToken();\n return this.raw.listTasks(token);\n }\n\n async listFinishedTasks(): Promise<any[]> {\n const token = await this.requireToken();\n return this.raw.listFinishedTasks(token);\n }\n\n async startTask(body: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.startTask(token, body);\n }\n\n async claimTask(body: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.claimTask(token, body);\n }\n\n async getPlatformQuests(query?: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.getPlatformQuests(token, query);\n }\n\n async getCampaignQuests(query?: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.getCampaignQuests(token, query);\n }\n\n async claimQuest(questProgressId: string): Promise<any> {\n const token = await this.requireToken();\n return this.raw.claimQuest(token, questProgressId);\n }\n\n async claimMilestone(milestoneId: string, body: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.claimMilestone(token, milestoneId, body);\n }\n}\n","import type { LooplayInitParams, LooplaySDKCreateOptions } from './types';\nimport { LooplayAuth } from './auth/looplay-auth';\nimport { ApiClient } from './apps/api-client';\nimport type { EmitGameEventResponse, GameEventKey } from './apps/LooplaySDK.types';\nimport { MissingAuthError, MissingBaseUrlError, NotInitializedError } from './errors';\n\nexport class LooplaySDK {\n readonly auth?: LooplayAuth;\n readonly api?: ApiClient;\n\n private gameId?: string;\n private initialized = false;\n\n constructor(options: LooplaySDKCreateOptions = {}) {\n const { auth, baseUrl, fetch, defaultHeaders } = options;\n\n if (auth) {\n this.auth = new LooplayAuth(auth);\n }\n\n if (baseUrl) {\n this.api = new ApiClient({\n baseUrl,\n fetch,\n defaultHeaders,\n getAccessToken: async () => this.auth?.getAccessToken(),\n });\n }\n }\n\n async init(params: LooplayInitParams): Promise<void> {\n this.gameId = params.gameId;\n await this.auth?.init();\n await this.verifyGameId(params);\n this.initialized = true;\n }\n\n async getAccessToken(): Promise<string | undefined> {\n return this.auth?.getAccessToken();\n }\n\n getGameId(): string | undefined {\n return this.gameId;\n }\n\n async getMyProfile(): Promise<any> {\n this.assertInitialized();\n if (!this.api) throw new MissingBaseUrlError();\n return this.api.getMyProfile();\n }\n\n async trackPlay(playTimeSeconds?: number): Promise<boolean> {\n this.assertInitialized();\n if (!this.api) throw new MissingBaseUrlError();\n if (!this.gameId) throw new NotInitializedError();\n return this.api.trackPlay(this.gameId, playTimeSeconds);\n }\n\n /**\n * Report that a match/round ended.\n * Maps to PLAY_MATCH (and WIN_MATCH when isWin=true).\n * matchId is the idempotency anchor — safe to call twice with the same matchId.\n */\n async trackMatch(\n matchId: string,\n opts: { durationSeconds: number; isCompleted?: boolean; isWin?: boolean }\n ): Promise<boolean> {\n this.assertInitialized();\n if (!this.api) throw new MissingBaseUrlError();\n if (!this.gameId) throw new NotInitializedError();\n return this.api.trackMatch(this.gameId, {\n matchId,\n matchDurationSeconds: opts.durationSeconds,\n isCompleted: opts.isCompleted,\n isWin: opts.isWin,\n });\n }\n\n /**\n * Emit a custom action event (CUSTOM_ACTION metric).\n * Use GameEventKey for platform-defined codes; custom strings for game-specific quests.\n * Pass refId to make the call idempotent — same refId = same event, dedup-safe.\n */\n async emit(\n actionCode: GameEventKey | string,\n opts?: { value?: number; refId?: string; payload?: Record<string, unknown> }\n ): Promise<EmitGameEventResponse> {\n this.assertInitialized();\n if (!this.api) throw new MissingBaseUrlError();\n if (!this.gameId) throw new NotInitializedError();\n return this.api.emit(this.gameId, actionCode, opts);\n }\n\n private assertInitialized(): void {\n if (!this.initialized) throw new NotInitializedError();\n }\n\n private async verifyGameId(params: LooplayInitParams): Promise<void> {\n if ((params.verifyMode ?? 'none') === 'none') return;\n // strict: requires auth + calls GET /games/:id\n if (!this.auth) throw new MissingAuthError();\n if (!this.api) throw new MissingBaseUrlError();\n await this.api.getGameDetail(params.gameId);\n }\n}\n","import { LooplaySDKError } from '../../errors';\nimport { ServiceClient, type ServiceClientOptions } from '../../apps/service-client';\nimport type {\n AuthLoginParams,\n AuthLoginResult,\n AuthProvider,\n LooplaySession,\n LooplayUser\n} from '../types';\n\nexport interface TelegramAuthLoginParams extends AuthLoginParams {\n telegramInitData?: string;\n}\n\nexport interface TelegramAuthProviderOptions extends ServiceClientOptions {\n /**\n * Optional override for how to read Telegram init data.\n * If omitted, provider will try `params.telegramInitData` then `globalThis.Telegram.WebApp.initData`.\n */\n getTelegramInitData?: () => string | undefined;\n\n /**\n * Optional mapper from backend user payload to LooplayUser.\n * If omitted, provider will try common fields like id/_id/userId/telegramId.\n */\n mapUser?: (rawUser: Record<string, any>) => LooplayUser;\n}\n\nclass MissingTelegramInitDataError extends LooplaySDKError {\n constructor() {\n super('Missing Telegram init data');\n this.name = 'MissingTelegramInitDataError';\n }\n}\n\nclass MissingRefreshTokenError extends LooplaySDKError {\n constructor() {\n super('Missing refresh token');\n this.name = 'MissingRefreshTokenError';\n }\n}\n\nfunction decodeJwtExpMs(token: string | undefined): number | undefined {\n if (!token) return undefined;\n const parts = token.split('.');\n if (parts.length < 2) return undefined;\n\n try {\n const payload = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n const padded = payload + '==='.slice((payload.length + 3) % 4);\n if (typeof (globalThis as any).atob !== 'function') return undefined;\n\n const json = (globalThis as any).atob(padded) as string;\n const parsed = JSON.parse(json) as { exp?: number };\n if (typeof parsed.exp !== 'number') return undefined;\n return parsed.exp * 1000;\n } catch {\n return undefined;\n }\n}\n\nexport class TelegramAuthProvider implements AuthProvider {\n readonly id = 'telegram';\n\n private readonly client: ServiceClient;\n private readonly getTelegramInitData?: () => string | undefined;\n private readonly mapUser?: (rawUser: Record<string, any>) => LooplayUser;\n\n private session: LooplaySession | null = null;\n\n constructor(options: TelegramAuthProviderOptions) {\n this.client = new ServiceClient(options);\n this.getTelegramInitData = options.getTelegramInitData;\n this.mapUser = options.mapUser;\n }\n\n onSessionChanged = (session: LooplaySession | null): void => {\n this.session = session;\n };\n\n async login(params?: TelegramAuthLoginParams): Promise<AuthLoginResult> {\n const initData =\n params?.telegramInitData ??\n this.getTelegramInitData?.() ??\n (globalThis as any)?.Telegram?.WebApp?.initData;\n\n if (!initData) throw new MissingTelegramInitDataError();\n\n const result = await this.client.telegramLogin(initData);\n\n const rawUser = (result.user ?? {}) as Record<string, any>;\n const user = this.mapUser ? this.mapUser(rawUser) : this.defaultMapUser(rawUser);\n\n const session: LooplaySession = {\n user,\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n expiresAt: decodeJwtExpMs(result.accessToken)\n };\n\n this.session = session;\n return { session };\n }\n\n async refresh(): Promise<Pick<LooplaySession, 'accessToken' | 'refreshToken' | 'expiresAt'>> {\n const currentSession = this.session;\n const refreshToken = currentSession?.refreshToken;\n if (!currentSession || !refreshToken) throw new MissingRefreshTokenError();\n\n const result = await this.client.refresh(refreshToken);\n\n const next = {\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n expiresAt: decodeJwtExpMs(result.accessToken)\n } satisfies Pick<LooplaySession, 'accessToken' | 'refreshToken' | 'expiresAt'>;\n\n this.session = { ...currentSession, ...next };\n return next;\n }\n\n async logout(): Promise<void> {\n const refreshToken = this.session?.refreshToken;\n\n if (refreshToken) {\n try {\n await this.client.logout(refreshToken);\n } catch {\n // best-effort\n }\n }\n\n this.session = null;\n }\n\n private defaultMapUser(raw: Record<string, any>): LooplayUser {\n const id = raw.id ?? raw._id ?? raw.userId ?? raw.telegramId;\n if (id === undefined || id === null || String(id).trim() === '') {\n throw new LooplaySDKError('Missing user id from auth response');\n }\n\n return {\n id: String(id),\n displayName: raw.displayName ?? raw.username ?? raw.name,\n avatarUrl: raw.avatarUrl ?? raw.photoUrl ?? raw.avatar\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/auth/storage.ts","../src/auth/looplay-auth.ts","../src/apps/http.ts","../src/apps/service-client.ts","../src/apps/api-client.ts","../src/looplay-sdk.ts","../src/auth/jwt.ts","../src/auth/providers/telegram-auth-provider.ts","../src/iframe/iframe-auth.ts"],"names":["text"],"mappings":"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","file":"looplay-sdk.esm.js","sourcesContent":["export class LooplaySDKError extends Error {\n constructor(message?: string) {\n super(message);\n this.name = 'LooplaySDKError';\n }\n}\n\nexport class NotInitializedError extends LooplaySDKError {\n constructor() {\n super('LooplaySDK not initialized. Call init({ gameId }) first.');\n this.name = 'NotInitializedError';\n }\n}\n\nexport class MissingBaseUrlError extends LooplaySDKError {\n constructor() {\n super('Missing baseUrl. Provide `baseUrl` to enable HTTP integration.');\n this.name = 'MissingBaseUrlError';\n }\n}\n\nexport class MissingAuthError extends LooplaySDKError {\n constructor() {\n super('Missing auth. Provide `auth` options to enable user login/session.');\n this.name = 'MissingAuthError';\n }\n}\n\nexport class NotAuthenticatedError extends LooplaySDKError {\n constructor() {\n super('Not authenticated. Login is required for this operation.');\n this.name = 'NotAuthenticatedError';\n }\n}\n","import type { AuthStorage } from './types';\n\nexport class MemoryAuthStorage implements AuthStorage {\n private readonly map = new Map<string, string>();\n\n async getItem(key: string): Promise<string | null> {\n return this.map.has(key) ? (this.map.get(key) as string) : null;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.map.set(key, value);\n }\n\n async removeItem(key: string): Promise<void> {\n this.map.delete(key);\n }\n}\n\nexport class BrowserLocalStorageAuthStorage implements AuthStorage {\n async getItem(key: string): Promise<string | null> {\n if (typeof window === 'undefined' || !window.localStorage) return null;\n return window.localStorage.getItem(key);\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) return;\n window.localStorage.setItem(key, value);\n }\n\n async removeItem(key: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) return;\n window.localStorage.removeItem(key);\n }\n}\n","import { LooplaySDKError } from '../errors';\nimport {\n type AuthEventName,\n type AuthLoginParams,\n type AuthProvider,\n type AuthStorage,\n type LooplayAuthOptions,\n type LooplaySession\n} from './types';\nimport { MemoryAuthStorage } from './storage';\n\nclass InvalidSessionError extends LooplaySDKError {\n constructor() {\n super('Invalid session returned by auth provider');\n this.name = 'InvalidSessionError';\n }\n}\n\ntype Listener = (session: LooplaySession | null) => void;\n\nexport class LooplayAuth {\n private readonly provider: AuthProvider;\n private readonly storage: AuthStorage;\n private readonly key: string;\n\n private session: LooplaySession | null = null;\n private readonly listeners = new Set<Listener>();\n\n constructor(options: LooplayAuthOptions) {\n this.provider = options.provider;\n this.storage = options.storage ?? new MemoryAuthStorage();\n this.key = `${options.storageKeyPrefix ?? 'looplay'}:auth:session`;\n }\n\n async init(): Promise<void> {\n await this.provider.init?.();\n await this.restoreFromStorage();\n\n // Keep provider in sync with restored session (if any).\n await this.provider.onSessionChanged?.(this.session);\n }\n\n getSession(): LooplaySession | null {\n return this.session;\n }\n\n async login(params?: AuthLoginParams): Promise<LooplaySession> {\n const result = await this.provider.login(params);\n\n if (!result?.session?.user?.id) {\n throw new InvalidSessionError();\n }\n\n await this.setSession(result.session, 'login');\n return result.session;\n }\n\n async logout(): Promise<void> {\n await this.provider.logout();\n await this.setSession(null, 'logout');\n }\n\n async getAccessToken(): Promise<string | undefined> {\n if (!this.session) return undefined;\n\n const now = Date.now();\n const isExpired =\n typeof this.session.expiresAt === 'number' && this.session.expiresAt <= now;\n\n if (!isExpired) return this.session.accessToken;\n\n if (!this.provider.refresh) return this.session.accessToken;\n\n const refreshed = await this.provider.refresh();\n const next = { ...this.session, ...refreshed };\n await this.setSession(next, 'sessionChanged');\n\n return next.accessToken;\n }\n\n on(eventName: AuthEventName, listener: Listener): () => void {\n // eventName reserved for future filtering; for now notify on any change\n void eventName;\n\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private async restoreFromStorage(): Promise<void> {\n const raw = await this.storage.getItem(this.key);\n if (!raw) return;\n\n try {\n const parsed = JSON.parse(raw) as LooplaySession;\n if (parsed?.user?.id) {\n this.session = parsed;\n }\n } catch {\n // ignore corrupted cache\n await this.storage.removeItem(this.key);\n }\n }\n\n private async setSession(next: LooplaySession | null, event: AuthEventName): Promise<void> {\n this.session = next;\n\n await this.provider.onSessionChanged?.(this.session);\n\n if (next) {\n await this.storage.setItem(this.key, JSON.stringify(next));\n } else {\n await this.storage.removeItem(this.key);\n }\n\n for (const listener of this.listeners) {\n listener(this.session);\n }\n\n // reserved for future event-specific hooks\n void event;\n }\n}\n","export type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\nexport interface HttpClientOptions {\n baseUrl: string;\n fetch?: FetchLike;\n defaultHeaders?: Record<string, string>;\n}\n\nfunction getFetchFn(fetchOverride?: FetchLike): FetchLike {\n if (fetchOverride) {\n if (typeof window !== 'undefined' && fetchOverride === window.fetch) {\n return window.fetch.bind(window);\n }\n\n return fetchOverride;\n }\n\n return globalThis.fetch.bind(globalThis);\n}\n\nexport class HttpError extends Error {\n readonly status: number;\n readonly bodyText?: string;\n\n constructor(message: string, status: number, bodyText?: string) {\n super(message);\n this.name = 'HttpError';\n this.status = status;\n this.bodyText = bodyText;\n }\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly fetchFn: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '');\n this.fetchFn = getFetchFn(options.fetch);\n this.defaultHeaders = options.defaultHeaders ?? {};\n }\n\n async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n path: string,\n options?: {\n query?: Record<string, string | number | boolean | undefined>;\n headers?: Record<string, string | undefined>;\n bearerToken?: string;\n /** Anonymous device id, used when there is no `bearerToken` (no logged-in user). */\n anonId?: string;\n body?: unknown;\n }\n ): Promise<T> {\n const url = this.buildUrl(path, options?.query);\n\n const headers: Record<string, string> = this.mergeHeaders(\n this.defaultHeaders,\n options?.headers\n );\n\n if (options?.bearerToken) {\n headers.Authorization = `Bearer ${options.bearerToken}`;\n } else if (options?.anonId) {\n headers['x-looplay-anon-id'] = options.anonId;\n }\n\n let body: BodyInit | undefined;\n if (options?.body !== undefined) {\n headers['Content-Type'] = headers['Content-Type'] ?? 'application/json';\n body = JSON.stringify(options.body);\n }\n\n const res = await this.fetchFn(url, { method, headers, body });\n\n if (!res.ok) {\n const text = await this.safeText(res);\n throw new HttpError(`HTTP ${res.status} ${res.statusText}`, res.status, text);\n }\n\n // Some endpoints may return empty body.\n const text = await this.safeText(res);\n if (!text) return undefined as T;\n\n return JSON.parse(text) as T;\n }\n\n private mergeHeaders(\n ...sources: Array<Record<string, string | undefined> | undefined>\n ): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const src of sources) {\n if (!src) continue;\n for (const [key, value] of Object.entries(src)) {\n if (value === undefined) continue;\n result[key] = value;\n }\n }\n\n return result;\n }\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n ): string {\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${this.baseUrl}${normalizedPath}`);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n }\n\n return url.toString();\n }\n\n private async safeText(res: Response): Promise<string> {\n try {\n return await res.text();\n } catch {\n return '';\n }\n }\n}\n","import { HttpClient, type HttpClientOptions } from './http';\nimport type {\n AuthResultDto,\n EmitGameEventRequest,\n EmitGameEventResponse,\n PagingResponse,\n RefreshTokenRequest,\n TelegramLoginRequest,\n TrackGamePlayRequest,\n TrackMatchEndRequest,\n} from './LooplaySDK.types';\n\nexport interface ServiceClientOptions extends HttpClientOptions {}\n\n/**\n * Auth for the tracking endpoints (`play`/`end`/`emit`), which accept either\n * a real user's `bearerToken` (full tracking, eligible for quest/reward) or\n * an `anonId` for an unauthenticated device (analytics-only — the backend\n * never awards quest/reward progress to an anonymous id).\n */\nexport interface TrackingAuth {\n bearerToken?: string;\n anonId?: string;\n}\n\n/**\n * Low-level HTTP client that maps 1:1 to backend routes.\n * Methods requiring user auth accept `bearerToken` explicitly.\n */\nexport class ServiceClient {\n private readonly http: HttpClient;\n\n constructor(options: ServiceClientOptions) {\n this.http = new HttpClient(options);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Auth\n // ─────────────────────────────────────────────────────────────────────────────\n\n async telegramLogin(telegramInitData: string): Promise<AuthResultDto> {\n const body: TelegramLoginRequest = { telegramInitData };\n return this.http.request('POST', '/account/telegram-login', { body });\n }\n\n async refresh(refreshToken: string): Promise<AuthResultDto> {\n const body: RefreshTokenRequest = { refreshToken };\n return this.http.request('POST', '/account/refresh', { body });\n }\n\n async logout(refreshToken: string): Promise<boolean> {\n const body: RefreshTokenRequest = { refreshToken };\n return this.http.request('POST', '/account/logout', { body });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Games\n // ─────────────────────────────────────────────────────────────────────────────\n\n async listGames(query?: Record<string, any>): Promise<PagingResponse<any>> {\n return this.http.request('GET', '/games', { query });\n }\n\n async getGameDetail(gameId: string, bearerToken?: string): Promise<any> {\n return this.http.request('GET', `/games/${encodeURIComponent(gameId)}`, {\n bearerToken,\n });\n }\n\n async listRecentPlayed(\n bearerToken: string,\n query?: Record<string, any>\n ): Promise<PagingResponse<any>> {\n return this.http.request('GET', '/games/recent-play', { bearerToken, query });\n }\n\n async trackPlay(\n auth: TrackingAuth,\n gameId: string,\n playTimeSeconds?: number\n ): Promise<boolean> {\n const body: TrackGamePlayRequest = { playTimeSeconds };\n await this.http.request('POST', `/games/${encodeURIComponent(gameId)}/play`, {\n ...auth,\n body,\n });\n return true;\n }\n\n async trackMatchEnd(\n auth: TrackingAuth,\n gameId: string,\n body: TrackMatchEndRequest\n ): Promise<boolean> {\n await this.http.request('POST', `/games/${encodeURIComponent(gameId)}/end`, {\n ...auth,\n body,\n });\n return true;\n }\n\n async emitGameEvent(\n auth: TrackingAuth,\n gameId: string,\n body: EmitGameEventRequest\n ): Promise<EmitGameEventResponse> {\n return this.http.request('POST', `/games/${encodeURIComponent(gameId)}/emit`, {\n ...auth,\n body,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Balance\n // ─────────────────────────────────────────────────────────────────────────────\n\n async getBalances(bearerToken: string, query?: Record<string, any>): Promise<any> {\n return this.http.request('GET', '/balance', { bearerToken, query });\n }\n\n async getBalanceHistory(\n bearerToken: string,\n query?: Record<string, any>\n ): Promise<PagingResponse<any>> {\n return this.http.request('GET', '/balance/history', { bearerToken, query });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // User\n // ─────────────────────────────────────────────────────────────────────────────\n\n async getMyProfile(bearerToken: string): Promise<any> {\n return this.http.request('GET', '/user/profile', { bearerToken });\n }\n\n async getMyBalance(bearerToken: string): Promise<any> {\n return this.http.request('GET', '/user/balance', { bearerToken });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Referrals\n // ─────────────────────────────────────────────────────────────────────────────\n\n async listReferrals(\n bearerToken: string,\n query?: Record<string, any>\n ): Promise<PagingResponse<any>> {\n return this.http.request('GET', '/referrals', { bearerToken, query });\n }\n\n async setReferral(bearerToken: string, body: Record<string, any>): Promise<boolean> {\n return this.http.request('POST', '/referrals/set', { bearerToken, body });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Tasks / Quests\n // ─────────────────────────────────────────────────────────────────────────────\n\n async listTasks(bearerToken: string): Promise<any[]> {\n return this.http.request('GET', '/task', { bearerToken });\n }\n\n async listFinishedTasks(bearerToken: string): Promise<any[]> {\n return this.http.request('GET', '/task/finished', { bearerToken });\n }\n\n async startTask(bearerToken: string, body: Record<string, any>): Promise<any> {\n return this.http.request('POST', '/task/start', { bearerToken, body });\n }\n\n async claimTask(bearerToken: string, body: Record<string, any>): Promise<any> {\n return this.http.request('POST', '/task/claim', { bearerToken, body });\n }\n\n async getPlatformQuests(\n bearerToken: string,\n query?: Record<string, any>\n ): Promise<any> {\n return this.http.request('GET', '/quest/platform', { bearerToken, query });\n }\n\n async getCampaignQuests(\n bearerToken: string,\n query?: Record<string, any>\n ): Promise<any> {\n return this.http.request('GET', '/quest/campaign', { bearerToken, query });\n }\n\n async claimQuest(bearerToken: string, questProgressId: string): Promise<any> {\n return this.http.request('POST', `/quest/${encodeURIComponent(questProgressId)}/claim`, {\n bearerToken,\n });\n }\n\n async claimMilestone(\n bearerToken: string,\n milestoneId: string,\n body: Record<string, any>\n ): Promise<any> {\n return this.http.request(\n 'POST',\n `/quest/milestone/${encodeURIComponent(milestoneId)}/claim`,\n {\n bearerToken,\n body,\n }\n );\n }\n}\n","import { MissingBaseUrlError, NotAuthenticatedError } from '../errors';\nimport type {\n EmitGameEventRequest,\n EmitGameEventResponse,\n GameEventKey,\n PagingResponse,\n TrackMatchEndRequest,\n} from './LooplaySDK.types';\nimport { ServiceClient, type TrackingAuth } from './service-client';\nimport type { ServiceClientOptions } from './service-client';\n\nexport interface ApiClientOptions extends Omit<ServiceClientOptions, 'baseUrl'> {\n baseUrl?: string;\n getAccessToken?: () => Promise<string | undefined>;\n /**\n * Resolves an anonymous device id, used for the tracking endpoints\n * (`trackPlay`/`trackMatch`/`emit`) when `getAccessToken` yields nothing.\n * Anonymous tracking is analytics-only — see `TrackingAuth`.\n */\n getAnonymousId?: () => string | undefined;\n}\n\n/**\n * High-level API client that injects user auth automatically.\n */\nexport class ApiClient {\n private readonly raw: ServiceClient;\n private readonly getAccessToken?: () => Promise<string | undefined>;\n private readonly getAnonymousId?: () => string | undefined;\n\n constructor(options: ApiClientOptions) {\n if (!options.baseUrl) throw new MissingBaseUrlError();\n\n this.raw = new ServiceClient({\n baseUrl: options.baseUrl,\n fetch: options.fetch,\n defaultHeaders: options.defaultHeaders,\n });\n\n this.getAccessToken = options.getAccessToken;\n this.getAnonymousId = options.getAnonymousId;\n }\n\n /** Expose the underlying route-level client (requires manual bearerToken passing). */\n unsafeRaw(): ServiceClient {\n return this.raw;\n }\n\n // Public endpoints\n async listGames(query?: Record<string, any>): Promise<PagingResponse<any>> {\n return this.raw.listGames(query);\n }\n\n // Authenticated endpoints\n private async requireToken(): Promise<string> {\n const token = await this.getAccessToken?.();\n if (!token) throw new NotAuthenticatedError();\n return token;\n }\n\n /**\n * Resolves auth for the tracking endpoints: a real bearer token if logged\n * in, otherwise an anonymous device id. Throws only when neither is\n * available — anonymous tracking still requires *some* identity.\n */\n private async resolveTrackingAuth(): Promise<TrackingAuth> {\n const bearerToken = await this.getAccessToken?.();\n if (bearerToken) return { bearerToken };\n\n const anonId = this.getAnonymousId?.();\n if (anonId) return { anonId };\n\n throw new NotAuthenticatedError();\n }\n\n async getGameDetail(gameId: string): Promise<any> {\n const token = await this.getAccessToken?.();\n return this.raw.getGameDetail(gameId, token);\n }\n\n async listRecentPlayed(query?: Record<string, any>): Promise<PagingResponse<any>> {\n const token = await this.requireToken();\n return this.raw.listRecentPlayed(token, query);\n }\n\n async trackPlay(gameId: string, playTimeSeconds?: number): Promise<boolean> {\n const auth = await this.resolveTrackingAuth();\n return this.raw.trackPlay(auth, gameId, playTimeSeconds);\n }\n\n async trackMatch(gameId: string, body: TrackMatchEndRequest): Promise<boolean> {\n const auth = await this.resolveTrackingAuth();\n return this.raw.trackMatchEnd(auth, gameId, body);\n }\n\n async emit(\n gameId: string,\n actionCode: GameEventKey | string,\n opts?: { value?: number; refId?: string; payload?: Record<string, unknown> }\n ): Promise<EmitGameEventResponse> {\n const auth = await this.resolveTrackingAuth();\n const body: EmitGameEventRequest = {\n actionCode,\n value: opts?.value,\n refId: opts?.refId,\n payload: opts?.payload,\n };\n return this.raw.emitGameEvent(auth, gameId, body);\n }\n\n async getMyProfile(): Promise<any> {\n const token = await this.requireToken();\n return this.raw.getMyProfile(token);\n }\n\n async getMyBalance(): Promise<any> {\n const token = await this.requireToken();\n return this.raw.getMyBalance(token);\n }\n\n async getBalances(query?: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.getBalances(token, query);\n }\n\n async getBalanceHistory(query?: Record<string, any>): Promise<PagingResponse<any>> {\n const token = await this.requireToken();\n return this.raw.getBalanceHistory(token, query);\n }\n\n async listReferrals(query?: Record<string, any>): Promise<PagingResponse<any>> {\n const token = await this.requireToken();\n return this.raw.listReferrals(token, query);\n }\n\n async setReferral(body: Record<string, any>): Promise<boolean> {\n const token = await this.requireToken();\n return this.raw.setReferral(token, body);\n }\n\n async listTasks(): Promise<any[]> {\n const token = await this.requireToken();\n return this.raw.listTasks(token);\n }\n\n async listFinishedTasks(): Promise<any[]> {\n const token = await this.requireToken();\n return this.raw.listFinishedTasks(token);\n }\n\n async startTask(body: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.startTask(token, body);\n }\n\n async claimTask(body: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.claimTask(token, body);\n }\n\n async getPlatformQuests(query?: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.getPlatformQuests(token, query);\n }\n\n async getCampaignQuests(query?: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.getCampaignQuests(token, query);\n }\n\n async claimQuest(questProgressId: string): Promise<any> {\n const token = await this.requireToken();\n return this.raw.claimQuest(token, questProgressId);\n }\n\n async claimMilestone(milestoneId: string, body: Record<string, any>): Promise<any> {\n const token = await this.requireToken();\n return this.raw.claimMilestone(token, milestoneId, body);\n }\n}\n","import type { LooplayInitParams, LooplaySDKCreateOptions } from './types';\nimport { LooplayAuth } from './auth/looplay-auth';\nimport { ApiClient } from './apps/api-client';\nimport type { EmitGameEventResponse, GameEventKey } from './apps/LooplaySDK.types';\nimport { MissingAuthError, MissingBaseUrlError, NotInitializedError } from './errors';\n\nexport class LooplaySDK {\n readonly auth?: LooplayAuth;\n readonly api?: ApiClient;\n\n private gameId?: string;\n private initialized = false;\n\n constructor(options: LooplaySDKCreateOptions = {}) {\n const { auth, baseUrl, fetch, defaultHeaders } = options;\n\n if (auth) {\n this.auth = new LooplayAuth(auth);\n }\n\n if (baseUrl) {\n this.api = new ApiClient({\n baseUrl,\n fetch,\n defaultHeaders,\n getAccessToken: async () => this.auth?.getAccessToken(),\n });\n }\n }\n\n async init(params: LooplayInitParams): Promise<void> {\n this.gameId = params.gameId;\n await this.auth?.init();\n await this.verifyGameId(params);\n this.initialized = true;\n }\n\n async getAccessToken(): Promise<string | undefined> {\n return this.auth?.getAccessToken();\n }\n\n getGameId(): string | undefined {\n return this.gameId;\n }\n\n async getMyProfile(): Promise<any> {\n this.assertInitialized();\n if (!this.api) throw new MissingBaseUrlError();\n return this.api.getMyProfile();\n }\n\n async trackPlay(playTimeSeconds?: number): Promise<boolean> {\n this.assertInitialized();\n if (!this.api) throw new MissingBaseUrlError();\n if (!this.gameId) throw new NotInitializedError();\n return this.api.trackPlay(this.gameId, playTimeSeconds);\n }\n\n /**\n * Report that a match/round ended.\n * Maps to PLAY_MATCH (and WIN_MATCH when isWin=true).\n * matchId is the idempotency anchor — safe to call twice with the same matchId.\n */\n async trackMatch(\n matchId: string,\n opts: { durationSeconds: number; isCompleted?: boolean; isWin?: boolean }\n ): Promise<boolean> {\n this.assertInitialized();\n if (!this.api) throw new MissingBaseUrlError();\n if (!this.gameId) throw new NotInitializedError();\n return this.api.trackMatch(this.gameId, {\n matchId,\n matchDurationSeconds: opts.durationSeconds,\n isCompleted: opts.isCompleted,\n isWin: opts.isWin,\n });\n }\n\n /**\n * Emit a custom action event (CUSTOM_ACTION metric).\n * Use GameEventKey for platform-defined codes; custom strings for game-specific quests.\n * Pass refId to make the call idempotent — same refId = same event, dedup-safe.\n */\n async emit(\n actionCode: GameEventKey | string,\n opts?: { value?: number; refId?: string; payload?: Record<string, unknown> }\n ): Promise<EmitGameEventResponse> {\n this.assertInitialized();\n if (!this.api) throw new MissingBaseUrlError();\n if (!this.gameId) throw new NotInitializedError();\n return this.api.emit(this.gameId, actionCode, opts);\n }\n\n private assertInitialized(): void {\n if (!this.initialized) throw new NotInitializedError();\n }\n\n private async verifyGameId(params: LooplayInitParams): Promise<void> {\n if ((params.verifyMode ?? 'none') === 'none') return;\n // strict: requires auth + calls GET /games/:id\n if (!this.auth) throw new MissingAuthError();\n if (!this.api) throw new MissingBaseUrlError();\n await this.api.getGameDetail(params.gameId);\n }\n}\n","export function decodeJwtClaims(token: string | undefined): Record<string, unknown> | undefined {\n if (!token) return undefined;\n const parts = token.split('.');\n if (parts.length < 2) return undefined;\n\n try {\n const payload = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n const padded = payload + '==='.slice((payload.length + 3) % 4);\n if (typeof (globalThis as any).atob !== 'function') return undefined;\n\n const json = (globalThis as any).atob(padded) as string;\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nexport function decodeJwtExpMs(token: string | undefined): number | undefined {\n const exp = decodeJwtClaims(token)?.exp;\n return typeof exp === 'number' ? exp * 1000 : undefined;\n}\n","import { LooplaySDKError } from '../../errors';\nimport { ServiceClient, type ServiceClientOptions } from '../../apps/service-client';\nimport { decodeJwtExpMs } from '../jwt';\nimport type {\n AuthLoginParams,\n AuthLoginResult,\n AuthProvider,\n LooplaySession,\n LooplayUser\n} from '../types';\n\nexport interface TelegramAuthLoginParams extends AuthLoginParams {\n telegramInitData?: string;\n}\n\nexport interface TelegramAuthProviderOptions extends ServiceClientOptions {\n /**\n * Optional override for how to read Telegram init data.\n * If omitted, provider will try `params.telegramInitData` then `globalThis.Telegram.WebApp.initData`.\n */\n getTelegramInitData?: () => string | undefined;\n\n /**\n * Optional mapper from backend user payload to LooplayUser.\n * If omitted, provider will try common fields like id/_id/userId/telegramId.\n */\n mapUser?: (rawUser: Record<string, any>) => LooplayUser;\n}\n\nclass MissingTelegramInitDataError extends LooplaySDKError {\n constructor() {\n super('Missing Telegram init data');\n this.name = 'MissingTelegramInitDataError';\n }\n}\n\nclass MissingRefreshTokenError extends LooplaySDKError {\n constructor() {\n super('Missing refresh token');\n this.name = 'MissingRefreshTokenError';\n }\n}\n\nexport class TelegramAuthProvider implements AuthProvider {\n readonly id = 'telegram';\n\n private readonly client: ServiceClient;\n private readonly getTelegramInitData?: () => string | undefined;\n private readonly mapUser?: (rawUser: Record<string, any>) => LooplayUser;\n\n private session: LooplaySession | null = null;\n\n constructor(options: TelegramAuthProviderOptions) {\n this.client = new ServiceClient(options);\n this.getTelegramInitData = options.getTelegramInitData;\n this.mapUser = options.mapUser;\n }\n\n onSessionChanged = (session: LooplaySession | null): void => {\n this.session = session;\n };\n\n async login(params?: TelegramAuthLoginParams): Promise<AuthLoginResult> {\n const initData =\n params?.telegramInitData ??\n this.getTelegramInitData?.() ??\n (globalThis as any)?.Telegram?.WebApp?.initData;\n\n if (!initData) throw new MissingTelegramInitDataError();\n\n const result = await this.client.telegramLogin(initData);\n\n const rawUser = (result.user ?? {}) as Record<string, any>;\n const user = this.mapUser ? this.mapUser(rawUser) : this.defaultMapUser(rawUser);\n\n const session: LooplaySession = {\n user,\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n expiresAt: decodeJwtExpMs(result.accessToken)\n };\n\n this.session = session;\n return { session };\n }\n\n async refresh(): Promise<Pick<LooplaySession, 'accessToken' | 'refreshToken' | 'expiresAt'>> {\n const currentSession = this.session;\n const refreshToken = currentSession?.refreshToken;\n if (!currentSession || !refreshToken) throw new MissingRefreshTokenError();\n\n const result = await this.client.refresh(refreshToken);\n\n const next = {\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n expiresAt: decodeJwtExpMs(result.accessToken)\n } satisfies Pick<LooplaySession, 'accessToken' | 'refreshToken' | 'expiresAt'>;\n\n this.session = { ...currentSession, ...next };\n return next;\n }\n\n async logout(): Promise<void> {\n const refreshToken = this.session?.refreshToken;\n\n if (refreshToken) {\n try {\n await this.client.logout(refreshToken);\n } catch {\n // best-effort\n }\n }\n\n this.session = null;\n }\n\n private defaultMapUser(raw: Record<string, any>): LooplayUser {\n const id = raw.id ?? raw._id ?? raw.userId ?? raw.telegramId;\n if (id === undefined || id === null || String(id).trim() === '') {\n throw new LooplaySDKError('Missing user id from auth response');\n }\n\n return {\n id: String(id),\n displayName: raw.displayName ?? raw.username ?? raw.name,\n avatarUrl: raw.avatarUrl ?? raw.photoUrl ?? raw.avatar\n };\n }\n}\n","import { ApiClient } from '../apps/api-client';\nimport type { EmitGameEventResponse, GameEventKey } from '../apps/LooplaySDK.types';\nimport type {\n EmitGameEventOptions,\n LooplayIframeAuthListener,\n LooplayIframeAuthOptions,\n LooplayIframeAuthState,\n TrackMatchOptions,\n} from './types';\n\nconst DEFAULT_ANON_ID_STORAGE_KEY = 'looplay:anon-id';\nconst DEFAULT_ANONYMOUS_FALLBACK_TIMEOUT_MS = 4000;\n\nconst INITIAL_STATE: LooplayIframeAuthState = {\n jwt: null,\n gameId: null,\n apiUrl: null,\n anonymousId: null,\n origin: null,\n receivedAt: null,\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst toOptionalString = (value: unknown): string | null => {\n if (typeof value !== 'string') return null;\n const normalized = value.trim();\n return normalized ? normalized : null;\n};\n\nfunction generateAnonymousId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n\n // Fallback UUID v4 for environments without crypto.randomUUID (older\n // browsers, non-secure contexts). Not cryptographically strong, but only\n // used as an anonymous, non-sensitive device identifier.\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nfunction readStoredAnonymousId(key: string): string | null {\n if (typeof window === 'undefined' || !window.localStorage) return null;\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction writeStoredAnonymousId(key: string, value: string): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // Private browsing, storage full, or blocked — the id just won't\n // persist across reloads; tracking for this session still works.\n }\n}\n\n/**\n * Handles auth for games that may run in two contexts:\n *\n * 1. Embedded as an iframe inside the Looplay web app — the host page\n * pushes `{ type: 'LOOPLAY_AUTH', jwt, gameId, apiUrl }` via postMessage\n * in response to a `LOOPLAY_AUTH_REQUEST`. Tracking calls use the real\n * user's bearer token (full tracking, eligible for quest/reward).\n * 2. Standalone — published anywhere else, or the parent never responds.\n * Falls back to an anonymous, locally-generated device id. Tracking\n * still works (the backend records it for analytics), but never feeds\n * the quest/reward engine.\n *\n * Either way, `appId` (issued to the creator after registering the game)\n * is required to track — see `LooplayIframeAuthOptions.appId`.\n */\nexport class LooplayIframeAuth {\n private state: LooplayIframeAuthState = INITIAL_STATE;\n private initialized = false;\n private lifecycleTrackingInitialized = false;\n private lastGameStartedKey: string | null = null;\n private client: ApiClient | null = null;\n private readonly listeners = new Set<LooplayIframeAuthListener>();\n private readonly options: LooplayIframeAuthOptions;\n private messageListener: ((event: MessageEvent<unknown>) => void) | null = null;\n private anonymousFallbackTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: LooplayIframeAuthOptions = {}) {\n this.options = options;\n }\n\n getState(): LooplayIframeAuthState {\n return this.state;\n }\n\n getJwt(): string | null {\n return this.state.jwt;\n }\n\n getApiUrl(): string | null {\n return this.options.apiUrl ?? this.state.apiUrl;\n }\n\n /** Resolves to the configured `appId`, falling back to whatever the parent pushed as `gameId`. */\n getGameId(): string | null {\n return this.options.appId ?? this.state.gameId;\n }\n\n getAnonymousId(): string | null {\n return this.state.anonymousId;\n }\n\n /** True once authenticated (bearer) or anonymous tracking is ready, given a configured `apiUrl`/`appId`. */\n canTrack(): boolean {\n if (!this.getApiUrl() || !this.getGameId()) return false;\n return Boolean(this.state.jwt || this.state.anonymousId);\n }\n\n subscribe(listener: LooplayIframeAuthListener): () => void {\n this.listeners.add(listener);\n listener(this.state);\n return () => this.listeners.delete(listener);\n }\n\n requestAuth(): void {\n if (typeof window === 'undefined' || window.parent === window) {\n this.debug('standalone mode detected; auth request skipped');\n return;\n }\n\n this.debug('requesting auth from parent', { targetOrigin: this.resolveParentOrigin() ?? '*' });\n window.parent.postMessage({ type: 'LOOPLAY_AUTH_REQUEST' }, this.resolveParentOrigin() ?? '*');\n }\n\n /** Idempotent; attaches the postMessage listener (if embedded) and arms the anonymous fallback. */\n init(): void {\n if (this.initialized || typeof window === 'undefined') return;\n this.initialized = true;\n\n const isEmbedded = window.parent !== window;\n this.debug('auth listener initialized', {\n isIframe: isEmbedded,\n parentOrigin: this.resolveParentOrigin(),\n });\n\n if (!isEmbedded) {\n // No parent frame to push auth at all — go anonymous right away.\n this.activateAnonymousMode();\n return;\n }\n\n const parentOrigin = this.resolveParentOrigin();\n\n if (!parentOrigin) {\n // `document.referrer` can be empty (Referrer-Policy, browser privacy\n // settings, extensions), which silently disables the origin check\n // below and lets any window that is literally `window.parent` push\n // auth. Pass `parentOrigin` explicitly to keep this check effective.\n console.warn(\n '[LooplaySDK] LooplayIframeAuth could not resolve a parent origin to verify postMessage ' +\n 'against (document.referrer is empty). Auth messages from window.parent will be accepted ' +\n 'regardless of origin. Pass `parentOrigin` explicitly to harden this.'\n );\n }\n\n this.messageListener = (event: MessageEvent<unknown>) => {\n if (event.source !== window.parent) return;\n if (parentOrigin && event.origin !== parentOrigin) {\n this.debug('ignored auth message from unexpected origin', {\n expectedOrigin: parentOrigin,\n receivedOrigin: event.origin,\n });\n return;\n }\n if (!isRecord(event.data) || event.data.type !== 'LOOPLAY_AUTH') return;\n\n this.handleAuthMessage(event.data, event.origin);\n };\n\n window.addEventListener('message', this.messageListener);\n\n // The host page might be an older protocol version, slow, or simply not\n // respond — don't leave the game untrackable forever.\n this.anonymousFallbackTimer = setTimeout(() => {\n if (this.state.jwt) return;\n this.activateAnonymousMode();\n }, this.options.anonymousFallbackTimeoutMs ?? DEFAULT_ANONYMOUS_FALLBACK_TIMEOUT_MS);\n\n this.requestAuth();\n }\n\n /** Removes the postMessage listener, cancels timers, and clears subscribers; safe to call multiple times. */\n dispose(): void {\n if (typeof window !== 'undefined' && this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n }\n if (this.anonymousFallbackTimer !== null) {\n clearTimeout(this.anonymousFallbackTimer);\n }\n\n this.messageListener = null;\n this.anonymousFallbackTimer = null;\n this.initialized = false;\n this.lifecycleTrackingInitialized = false;\n this.listeners.clear();\n }\n\n /** Lazily builds (and rebuilds on auth change) the `ApiClient` bound to the current auth mode. */\n getClient(): ApiClient {\n if (this.client) return this.client;\n\n const baseUrl = this.getApiUrl();\n\n this.debug('creating sdk ApiClient', { baseUrl });\n this.client = new ApiClient({\n baseUrl: baseUrl ?? undefined,\n getAccessToken: async () => this.getJwt() ?? undefined,\n getAnonymousId: () => this.getAnonymousId() ?? undefined,\n });\n\n return this.client;\n }\n\n trackPlay(playTimeSeconds?: number): Promise<boolean> {\n const gameId = this.getGameId();\n if (!this.canTrack() || !gameId) {\n this.debug('trackPlay skipped; auth is not ready', { hasGameId: Boolean(gameId) });\n return Promise.resolve(false);\n }\n\n this.debug('trackPlay dispatched', { gameId, playTimeSeconds });\n return this.getClient().trackPlay(gameId, playTimeSeconds);\n }\n\n trackMatch(matchId: string, opts: TrackMatchOptions): Promise<boolean> {\n const gameId = this.getGameId();\n if (!this.canTrack() || !gameId) {\n this.debug('trackMatch skipped; auth is not ready', { matchId });\n return Promise.resolve(false);\n }\n\n this.debug('trackMatch dispatched', { gameId, matchId, ...opts });\n return this.getClient().trackMatch(gameId, {\n matchId,\n matchDurationSeconds: opts.durationSeconds,\n isCompleted: opts.isCompleted,\n isWin: opts.isWin,\n });\n }\n\n emitGameEvent(\n actionCode: GameEventKey | string,\n opts?: EmitGameEventOptions\n ): Promise<EmitGameEventResponse | null> {\n const gameId = this.getGameId();\n if (!this.canTrack() || !gameId) {\n this.debug('emitGameEvent skipped; auth is not ready', { actionCode });\n return Promise.resolve(null);\n }\n\n this.debug('emitGameEvent dispatched', { gameId, actionCode, ...opts });\n return this.getClient().emit(gameId, actionCode, opts);\n }\n\n /** Idempotent; auto-emits GAME_STARTED exactly once per distinct auth session (bearer or anonymous). */\n initLifecycleTracking(): void {\n if (this.lifecycleTrackingInitialized || typeof window === 'undefined') return;\n this.lifecycleTrackingInitialized = true;\n this.debug('lifecycle tracking initialized');\n\n this.subscribe(() => {\n const key = this.getTrackingKey();\n if (!key || this.lastGameStartedKey === key) return;\n\n this.lastGameStartedKey = key;\n this.debug('auto GAME_STARTED dispatch');\n void this.emitGameEvent('GAME_STARTED');\n });\n }\n\n private getTrackingKey(): string | null {\n const gameId = this.getGameId();\n const apiUrl = this.getApiUrl();\n const identity = this.state.jwt ?? this.state.anonymousId;\n if (!gameId || !apiUrl || !identity) return null;\n return `${apiUrl}\\n${gameId}\\n${identity}`;\n }\n\n /** Generates (or restores) a persisted anonymous device id and activates anonymous tracking. */\n private activateAnonymousMode(): void {\n if (this.state.anonymousId) return;\n\n const key = this.options.anonymousIdStorageKey ?? DEFAULT_ANON_ID_STORAGE_KEY;\n const anonymousId = readStoredAnonymousId(key) ?? generateAnonymousId();\n writeStoredAnonymousId(key, anonymousId);\n\n this.lastGameStartedKey = null;\n this.setState({ ...this.state, anonymousId, receivedAt: Date.now() });\n this.debug('anonymous tracking mode active', { anonymousId });\n }\n\n private handleAuthMessage(data: Record<string, unknown>, origin: string): void {\n if (this.anonymousFallbackTimer !== null) {\n clearTimeout(this.anonymousFallbackTimer);\n this.anonymousFallbackTimer = null;\n }\n\n const jwt = toOptionalString(data.jwt);\n const gameId = toOptionalString(data.gameId);\n const apiUrl = toOptionalString(data.apiUrl);\n\n if (!jwt || !gameId || !apiUrl) {\n this.lastGameStartedKey = null;\n this.setState({ ...this.state, jwt: null, gameId: null, apiUrl: null, origin, receivedAt: Date.now() });\n this.debug('auth cleared by parent; falling back to anonymous tracking');\n this.activateAnonymousMode();\n return;\n }\n\n this.lastGameStartedKey = null;\n this.setState({\n jwt,\n gameId,\n apiUrl,\n anonymousId: null,\n origin,\n receivedAt: Date.now(),\n });\n }\n\n private setState(next: LooplayIframeAuthState): void {\n this.state = next;\n this.client = null;\n this.debug('auth state updated', {\n gameId: this.getGameId(),\n apiUrl: this.getApiUrl(),\n origin: next.origin,\n hasJwt: Boolean(next.jwt),\n hasAnonymousId: Boolean(next.anonymousId),\n });\n this.listeners.forEach((listener) => listener(next));\n }\n\n private resolveParentOrigin(): string | null {\n if (this.options.parentOrigin) return this.options.parentOrigin;\n if (typeof document === 'undefined' || !document.referrer) return null;\n\n try {\n return new URL(document.referrer).origin;\n } catch {\n return null;\n }\n }\n\n private debug(message: string, details?: Record<string, unknown>): void {\n this.options.onDebug?.(message, details);\n }\n}\n"]}
|
package/dist/looplay-sdk.min.js
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
var LooplaySDK=(function(exports){'use strict';var a=class extends Error{constructor(e){super(e),this.name="LooplaySDKError";}},l=class extends a{constructor(){super("LooplaySDK not initialized. Call init({ gameId }) first."),this.name="NotInitializedError";}},o=class extends a{constructor(){super("Missing baseUrl. Provide `baseUrl` to enable HTTP integration."),this.name="MissingBaseUrlError";}},m=class extends a{constructor(){super("Missing auth. Provide `auth` options to enable user login/session."),this.name="MissingAuthError";}},d=class extends a{constructor(){super("Not authenticated. Login is required for this operation."),this.name="NotAuthenticatedError";}};var g=class{map=new Map;async getItem(e){return this.map.has(e)?this.map.get(e):null}async setItem(e,t){this.map.set(e,t);}async removeItem(e){this.map.delete(e);}},R=class{async getItem(e){return typeof window>"u"||!window.localStorage?null:window.localStorage.getItem(e)}async setItem(e,t){typeof window>"u"||!window.localStorage||window.localStorage.setItem(e,t);}async removeItem(e){typeof window>"u"||!window.localStorage||window.localStorage.removeItem(e);}};var P=class extends a{constructor(){super("Invalid session returned by auth provider"),this.name="InvalidSessionError";}},p=class{provider;storage;key;session=null;listeners=new Set;constructor(e){this.provider=e.provider,this.storage=e.storage??new g,this.key=`${e.storageKeyPrefix??"looplay"}:auth:session`;}async init(){await this.provider.init?.(),await this.restoreFromStorage(),await this.provider.onSessionChanged?.(this.session);}getSession(){return this.session}async login(e){let t=await this.provider.login(e);if(!t?.session?.user?.id)throw new P;return await this.setSession(t.session,"login"),t.session}async logout(){await this.provider.logout(),await this.setSession(null,"logout");}async getAccessToken(){if(!this.session)return;let e=Date.now();if(!(typeof this.session.expiresAt=="number"&&this.session.expiresAt<=e))return this.session.accessToken;if(!this.provider.refresh)return this.session.accessToken;let s=await this.provider.refresh(),r={...this.session,...s};return await this.setSession(r,"sessionChanged"),r.accessToken}on(e,t){return this.listeners.add(t),()=>this.listeners.delete(t)}async restoreFromStorage(){let e=await this.storage.getItem(this.key);if(e)try{let t=JSON.parse(e);t?.user?.id&&(this.session=t);}catch{await this.storage.removeItem(this.key);}}async setSession(e,t){this.session=e,await this.provider.onSessionChanged?.(this.session),e?await this.storage.setItem(this.key,JSON.stringify(e)):await this.storage.removeItem(this.key);for(let s of this.listeners)s(this.session);}};var T=class extends Error{status;bodyText;constructor(e,t,s){super(e),this.name="HttpError",this.status=t,this.bodyText=s;}},y=class{baseUrl;fetchFn;defaultHeaders;constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.fetchFn=e.fetch??fetch,this.defaultHeaders=e.defaultHeaders??{};}async request(e,t,s){let r=this.buildUrl(t,s?.query),i=this.mergeHeaders(this.defaultHeaders,s?.headers);s?.bearerToken&&(i.Authorization=`Bearer ${s.bearerToken}`);let c;s?.body!==void 0&&(i["Content-Type"]=i["Content-Type"]??"application/json",c=JSON.stringify(s.body));let u=await this.fetchFn(r,{method:e,headers:i,body:c});if(!u.ok){let q=await this.safeText(u);throw new T(`HTTP ${u.status} ${u.statusText}`,u.status,q)}let v=await this.safeText(u);if(v)return JSON.parse(v)}mergeHeaders(...e){let t={};for(let s of e)if(s)for(let[r,i]of Object.entries(s))i!==void 0&&(t[r]=i);return t}buildUrl(e,t){let s=e.startsWith("/")?e:`/${e}`,r=new URL(`${this.baseUrl}${s}`);if(t)for(let[i,c]of Object.entries(t))c!==void 0&&r.searchParams.set(i,String(c));return r.toString()}async safeText(e){try{return await e.text()}catch{return ""}}};var h=class{http;constructor(e){this.http=new y(e);}async telegramLogin(e){let t={telegramInitData:e};return this.http.request("POST","/account/telegram-login",{body:t})}async refresh(e){let t={refreshToken:e};return this.http.request("POST","/account/refresh",{body:t})}async logout(e){let t={refreshToken:e};return this.http.request("POST","/account/logout",{body:t})}async listGames(e){return this.http.request("GET","/games",{query:e})}async getGameDetail(e,t){return this.http.request("GET",`/games/${encodeURIComponent(e)}`,{bearerToken:t})}async listRecentPlayed(e,t){return this.http.request("GET","/games/recent-play",{bearerToken:e,query:t})}async trackPlay(e,t,s){let r={playTimeSeconds:s};return await this.http.request("POST",`/games/${encodeURIComponent(t)}/play`,{bearerToken:e,body:r}),true}async trackMatchEnd(e,t,s){return await this.http.request("POST",`/games/${encodeURIComponent(t)}/end`,{bearerToken:e,body:s}),true}async emitGameEvent(e,t,s){return this.http.request("POST",`/games/${encodeURIComponent(t)}/emit`,{bearerToken:e,body:s})}async getBalances(e,t){return this.http.request("GET","/balance",{bearerToken:e,query:t})}async getBalanceHistory(e,t){return this.http.request("GET","/balance/history",{bearerToken:e,query:t})}async getMyProfile(e){return this.http.request("GET","/user/profile",{bearerToken:e})}async getMyBalance(e){return this.http.request("GET","/user/balance",{bearerToken:e})}async listReferrals(e,t){return this.http.request("GET","/referrals",{bearerToken:e,query:t})}async setReferral(e,t){return this.http.request("POST","/referrals/set",{bearerToken:e,body:t})}async listTasks(e){return this.http.request("GET","/task",{bearerToken:e})}async listFinishedTasks(e){return this.http.request("GET","/task/finished",{bearerToken:e})}async startTask(e,t){return this.http.request("POST","/task/start",{bearerToken:e,body:t})}async claimTask(e,t){return this.http.request("POST","/task/claim",{bearerToken:e,body:t})}async getPlatformQuests(e,t){return this.http.request("GET","/quest/platform",{bearerToken:e,query:t})}async getCampaignQuests(e,t){return this.http.request("GET","/quest/campaign",{bearerToken:e,query:t})}async claimQuest(e,t){return this.http.request("POST",`/quest/${encodeURIComponent(t)}/claim`,{bearerToken:e})}async claimMilestone(e,t,s){return this.http.request("POST",`/quest/milestone/${encodeURIComponent(t)}/claim`,{bearerToken:e,body:s})}};var f=class{raw;getAccessToken;constructor(e){if(!e.baseUrl)throw new o;this.raw=new h({baseUrl:e.baseUrl,fetch:e.fetch,defaultHeaders:e.defaultHeaders}),this.getAccessToken=e.getAccessToken;}unsafeRaw(){return this.raw}async listGames(e){return this.raw.listGames(e)}async requireToken(){let e=await this.getAccessToken?.();if(!e)throw new d;return e}async getGameDetail(e){let t=await this.requireToken();return this.raw.getGameDetail(e,t)}async listRecentPlayed(e){let t=await this.requireToken();return this.raw.listRecentPlayed(t,e)}async trackPlay(e,t){let s=await this.requireToken();return this.raw.trackPlay(s,e,t)}async trackMatch(e,t){let s=await this.requireToken();return this.raw.trackMatchEnd(s,e,t)}async emit(e,t,s){let r=await this.requireToken(),i={actionCode:t,value:s?.value,refId:s?.refId,payload:s?.payload};return this.raw.emitGameEvent(r,e,i)}async getMyProfile(){let e=await this.requireToken();return this.raw.getMyProfile(e)}async getMyBalance(){let e=await this.requireToken();return this.raw.getMyBalance(e)}async getBalances(e){let t=await this.requireToken();return this.raw.getBalances(t,e)}async getBalanceHistory(e){let t=await this.requireToken();return this.raw.getBalanceHistory(t,e)}async listReferrals(e){let t=await this.requireToken();return this.raw.listReferrals(t,e)}async setReferral(e){let t=await this.requireToken();return this.raw.setReferral(t,e)}async listTasks(){let e=await this.requireToken();return this.raw.listTasks(e)}async listFinishedTasks(){let e=await this.requireToken();return this.raw.listFinishedTasks(e)}async startTask(e){let t=await this.requireToken();return this.raw.startTask(t,e)}async claimTask(e){let t=await this.requireToken();return this.raw.claimTask(t,e)}async getPlatformQuests(e){let t=await this.requireToken();return this.raw.getPlatformQuests(t,e)}async getCampaignQuests(e){let t=await this.requireToken();return this.raw.getCampaignQuests(t,e)}async claimQuest(e){let t=await this.requireToken();return this.raw.claimQuest(t,e)}async claimMilestone(e,t){let s=await this.requireToken();return this.raw.claimMilestone(s,e,t)}};var S=class{auth;api;gameId;initialized=false;constructor(e={}){let{auth:t,baseUrl:s,fetch:r,defaultHeaders:i}=e;t&&(this.auth=new p(t)),s&&(this.api=new f({baseUrl:s,fetch:r,defaultHeaders:i,getAccessToken:async()=>this.auth?.getAccessToken()}));}async init(e){this.gameId=e.gameId,await this.auth?.init(),await this.verifyGameId(e),this.initialized=true;}async getAccessToken(){return this.auth?.getAccessToken()}getGameId(){return this.gameId}async getMyProfile(){if(this.assertInitialized(),!this.api)throw new o;return this.api.getMyProfile()}async trackPlay(e){if(this.assertInitialized(),!this.api)throw new o;if(!this.gameId)throw new l;return this.api.trackPlay(this.gameId,e)}async trackMatch(e,t){if(this.assertInitialized(),!this.api)throw new o;if(!this.gameId)throw new l;return this.api.trackMatch(this.gameId,{matchId:e,matchDurationSeconds:t.durationSeconds,isCompleted:t.isCompleted,isWin:t.isWin})}async emit(e,t){if(this.assertInitialized(),!this.api)throw new o;if(!this.gameId)throw new l;return this.api.emit(this.gameId,e,t)}assertInitialized(){if(!this.initialized)throw new l}async verifyGameId(e){if((e.verifyMode??"none")!=="none"){if(!this.auth)throw new m;if(!this.api)throw new o;await this.api.getGameDetail(e.gameId);}}};var w=class extends a{constructor(){super("Missing Telegram init data"),this.name="MissingTelegramInitDataError";}},k=class extends a{constructor(){super("Missing refresh token"),this.name="MissingRefreshTokenError";}};function b(n){if(!n)return;let e=n.split(".");if(!(e.length<2))try{let t=e[1].replace(/-/g,"+").replace(/_/g,"/"),s=t+"===".slice((t.length+3)%4);if(typeof globalThis.atob!="function")return;let r=globalThis.atob(s),i=JSON.parse(r);return typeof i.exp!="number"?void 0:i.exp*1e3}catch{return}}var x=class{id="telegram";client;getTelegramInitData;mapUser;session=null;constructor(e){this.client=new h(e),this.getTelegramInitData=e.getTelegramInitData,this.mapUser=e.mapUser;}onSessionChanged=e=>{this.session=e;};async login(e){let t=e?.telegramInitData??this.getTelegramInitData?.()??globalThis?.Telegram?.WebApp?.initData;if(!t)throw new w;let s=await this.client.telegramLogin(t),r=s.user??{},c={user:this.mapUser?this.mapUser(r):this.defaultMapUser(r),accessToken:s.accessToken,refreshToken:s.refreshToken,expiresAt:b(s.accessToken)};return this.session=c,{session:c}}async refresh(){let e=this.session,t=e?.refreshToken;if(!e||!t)throw new k;let s=await this.client.refresh(t),r={accessToken:s.accessToken,refreshToken:s.refreshToken,expiresAt:b(s.accessToken)};return this.session={...e,...r},r}async logout(){let e=this.session?.refreshToken;if(e)try{await this.client.logout(e);}catch{}this.session=null;}defaultMapUser(e){let t=e.id??e._id??e.userId??e.telegramId;if(t==null||String(t).trim()==="")throw new a("Missing user id from auth response");return {id:String(t),displayName:e.displayName??e.username??e.name,avatarUrl:e.avatarUrl??e.photoUrl??e.avatar}}};exports.ApiClient=f;exports.BrowserLocalStorageAuthStorage=R;exports.HttpClient=y;exports.HttpError=T;exports.LooplayAuth=p;exports.LooplaySDK=S;exports.LooplaySDKError=a;exports.MemoryAuthStorage=g;exports.MissingAuthError=m;exports.MissingBaseUrlError=o;exports.NotAuthenticatedError=d;exports.NotInitializedError=l;exports.ServiceClient=h;exports.TelegramAuthProvider=x;return exports;})({});//# sourceMappingURL=looplay-sdk.min.js.map
|
|
1
|
+
var LooplaySDK=(function(exports){'use strict';var a=class extends Error{constructor(e){super(e),this.name="LooplaySDKError";}},u=class extends a{constructor(){super("LooplaySDK not initialized. Call init({ gameId }) first."),this.name="NotInitializedError";}},o=class extends a{constructor(){super("Missing baseUrl. Provide `baseUrl` to enable HTTP integration."),this.name="MissingBaseUrlError";}},g=class extends a{constructor(){super("Missing auth. Provide `auth` options to enable user login/session."),this.name="MissingAuthError";}},m=class extends a{constructor(){super("Not authenticated. Login is required for this operation."),this.name="NotAuthenticatedError";}};var p=class{map=new Map;async getItem(e){return this.map.has(e)?this.map.get(e):null}async setItem(e,t){this.map.set(e,t);}async removeItem(e){this.map.delete(e);}},b=class{async getItem(e){return typeof window>"u"||!window.localStorage?null:window.localStorage.getItem(e)}async setItem(e,t){typeof window>"u"||!window.localStorage||window.localStorage.setItem(e,t);}async removeItem(e){typeof window>"u"||!window.localStorage||window.localStorage.removeItem(e);}};var w=class extends a{constructor(){super("Invalid session returned by auth provider"),this.name="InvalidSessionError";}},y=class{provider;storage;key;session=null;listeners=new Set;constructor(e){this.provider=e.provider,this.storage=e.storage??new p,this.key=`${e.storageKeyPrefix??"looplay"}:auth:session`;}async init(){await this.provider.init?.(),await this.restoreFromStorage(),await this.provider.onSessionChanged?.(this.session);}getSession(){return this.session}async login(e){let t=await this.provider.login(e);if(!t?.session?.user?.id)throw new w;return await this.setSession(t.session,"login"),t.session}async logout(){await this.provider.logout(),await this.setSession(null,"logout");}async getAccessToken(){if(!this.session)return;let e=Date.now();if(!(typeof this.session.expiresAt=="number"&&this.session.expiresAt<=e))return this.session.accessToken;if(!this.provider.refresh)return this.session.accessToken;let s=await this.provider.refresh(),i={...this.session,...s};return await this.setSession(i,"sessionChanged"),i.accessToken}on(e,t){return this.listeners.add(t),()=>this.listeners.delete(t)}async restoreFromStorage(){let e=await this.storage.getItem(this.key);if(e)try{let t=JSON.parse(e);t?.user?.id&&(this.session=t);}catch{await this.storage.removeItem(this.key);}}async setSession(e,t){this.session=e,await this.provider.onSessionChanged?.(this.session),e?await this.storage.setItem(this.key,JSON.stringify(e)):await this.storage.removeItem(this.key);for(let s of this.listeners)s(this.session);}};function L(n){return n?typeof window<"u"&&n===window.fetch?window.fetch.bind(window):n:globalThis.fetch.bind(globalThis)}var T=class extends Error{status;bodyText;constructor(e,t,s){super(e),this.name="HttpError",this.status=t,this.bodyText=s;}},f=class{baseUrl;fetchFn;defaultHeaders;constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.fetchFn=L(e.fetch),this.defaultHeaders=e.defaultHeaders??{};}async request(e,t,s){let i=this.buildUrl(t,s?.query),r=this.mergeHeaders(this.defaultHeaders,s?.headers);s?.bearerToken?r.Authorization=`Bearer ${s.bearerToken}`:s?.anonId&&(r["x-looplay-anon-id"]=s.anonId);let l;s?.body!==void 0&&(r["Content-Type"]=r["Content-Type"]??"application/json",l=JSON.stringify(s.body));let c=await this.fetchFn(i,{method:e,headers:r,body:l});if(!c.ok){let E=await this.safeText(c);throw new T(`HTTP ${c.status} ${c.statusText}`,c.status,E)}let A=await this.safeText(c);if(A)return JSON.parse(A)}mergeHeaders(...e){let t={};for(let s of e)if(s)for(let[i,r]of Object.entries(s))r!==void 0&&(t[i]=r);return t}buildUrl(e,t){let s=e.startsWith("/")?e:`/${e}`,i=new URL(`${this.baseUrl}${s}`);if(t)for(let[r,l]of Object.entries(t))l!==void 0&&i.searchParams.set(r,String(l));return i.toString()}async safeText(e){try{return await e.text()}catch{return ""}}};var d=class{http;constructor(e){this.http=new f(e);}async telegramLogin(e){let t={telegramInitData:e};return this.http.request("POST","/account/telegram-login",{body:t})}async refresh(e){let t={refreshToken:e};return this.http.request("POST","/account/refresh",{body:t})}async logout(e){let t={refreshToken:e};return this.http.request("POST","/account/logout",{body:t})}async listGames(e){return this.http.request("GET","/games",{query:e})}async getGameDetail(e,t){return this.http.request("GET",`/games/${encodeURIComponent(e)}`,{bearerToken:t})}async listRecentPlayed(e,t){return this.http.request("GET","/games/recent-play",{bearerToken:e,query:t})}async trackPlay(e,t,s){let i={playTimeSeconds:s};return await this.http.request("POST",`/games/${encodeURIComponent(t)}/play`,{...e,body:i}),true}async trackMatchEnd(e,t,s){return await this.http.request("POST",`/games/${encodeURIComponent(t)}/end`,{...e,body:s}),true}async emitGameEvent(e,t,s){return this.http.request("POST",`/games/${encodeURIComponent(t)}/emit`,{...e,body:s})}async getBalances(e,t){return this.http.request("GET","/balance",{bearerToken:e,query:t})}async getBalanceHistory(e,t){return this.http.request("GET","/balance/history",{bearerToken:e,query:t})}async getMyProfile(e){return this.http.request("GET","/user/profile",{bearerToken:e})}async getMyBalance(e){return this.http.request("GET","/user/balance",{bearerToken:e})}async listReferrals(e,t){return this.http.request("GET","/referrals",{bearerToken:e,query:t})}async setReferral(e,t){return this.http.request("POST","/referrals/set",{bearerToken:e,body:t})}async listTasks(e){return this.http.request("GET","/task",{bearerToken:e})}async listFinishedTasks(e){return this.http.request("GET","/task/finished",{bearerToken:e})}async startTask(e,t){return this.http.request("POST","/task/start",{bearerToken:e,body:t})}async claimTask(e,t){return this.http.request("POST","/task/claim",{bearerToken:e,body:t})}async getPlatformQuests(e,t){return this.http.request("GET","/quest/platform",{bearerToken:e,query:t})}async getCampaignQuests(e,t){return this.http.request("GET","/quest/campaign",{bearerToken:e,query:t})}async claimQuest(e,t){return this.http.request("POST",`/quest/${encodeURIComponent(t)}/claim`,{bearerToken:e})}async claimMilestone(e,t,s){return this.http.request("POST",`/quest/milestone/${encodeURIComponent(t)}/claim`,{bearerToken:e,body:s})}};var h=class{raw;getAccessToken;getAnonymousId;constructor(e){if(!e.baseUrl)throw new o;this.raw=new d({baseUrl:e.baseUrl,fetch:e.fetch,defaultHeaders:e.defaultHeaders}),this.getAccessToken=e.getAccessToken,this.getAnonymousId=e.getAnonymousId;}unsafeRaw(){return this.raw}async listGames(e){return this.raw.listGames(e)}async requireToken(){let e=await this.getAccessToken?.();if(!e)throw new m;return e}async resolveTrackingAuth(){let e=await this.getAccessToken?.();if(e)return {bearerToken:e};let t=this.getAnonymousId?.();if(t)return {anonId:t};throw new m}async getGameDetail(e){let t=await this.getAccessToken?.();return this.raw.getGameDetail(e,t)}async listRecentPlayed(e){let t=await this.requireToken();return this.raw.listRecentPlayed(t,e)}async trackPlay(e,t){let s=await this.resolveTrackingAuth();return this.raw.trackPlay(s,e,t)}async trackMatch(e,t){let s=await this.resolveTrackingAuth();return this.raw.trackMatchEnd(s,e,t)}async emit(e,t,s){let i=await this.resolveTrackingAuth(),r={actionCode:t,value:s?.value,refId:s?.refId,payload:s?.payload};return this.raw.emitGameEvent(i,e,r)}async getMyProfile(){let e=await this.requireToken();return this.raw.getMyProfile(e)}async getMyBalance(){let e=await this.requireToken();return this.raw.getMyBalance(e)}async getBalances(e){let t=await this.requireToken();return this.raw.getBalances(t,e)}async getBalanceHistory(e){let t=await this.requireToken();return this.raw.getBalanceHistory(t,e)}async listReferrals(e){let t=await this.requireToken();return this.raw.listReferrals(t,e)}async setReferral(e){let t=await this.requireToken();return this.raw.setReferral(t,e)}async listTasks(){let e=await this.requireToken();return this.raw.listTasks(e)}async listFinishedTasks(){let e=await this.requireToken();return this.raw.listFinishedTasks(e)}async startTask(e){let t=await this.requireToken();return this.raw.startTask(t,e)}async claimTask(e){let t=await this.requireToken();return this.raw.claimTask(t,e)}async getPlatformQuests(e){let t=await this.requireToken();return this.raw.getPlatformQuests(t,e)}async getCampaignQuests(e){let t=await this.requireToken();return this.raw.getCampaignQuests(t,e)}async claimQuest(e){let t=await this.requireToken();return this.raw.claimQuest(t,e)}async claimMilestone(e,t){let s=await this.requireToken();return this.raw.claimMilestone(s,e,t)}};var R=class{auth;api;gameId;initialized=false;constructor(e={}){let{auth:t,baseUrl:s,fetch:i,defaultHeaders:r}=e;t&&(this.auth=new y(t)),s&&(this.api=new h({baseUrl:s,fetch:i,defaultHeaders:r,getAccessToken:async()=>this.auth?.getAccessToken()}));}async init(e){this.gameId=e.gameId,await this.auth?.init(),await this.verifyGameId(e),this.initialized=true;}async getAccessToken(){return this.auth?.getAccessToken()}getGameId(){return this.gameId}async getMyProfile(){if(this.assertInitialized(),!this.api)throw new o;return this.api.getMyProfile()}async trackPlay(e){if(this.assertInitialized(),!this.api)throw new o;if(!this.gameId)throw new u;return this.api.trackPlay(this.gameId,e)}async trackMatch(e,t){if(this.assertInitialized(),!this.api)throw new o;if(!this.gameId)throw new u;return this.api.trackMatch(this.gameId,{matchId:e,matchDurationSeconds:t.durationSeconds,isCompleted:t.isCompleted,isWin:t.isWin})}async emit(e,t){if(this.assertInitialized(),!this.api)throw new o;if(!this.gameId)throw new u;return this.api.emit(this.gameId,e,t)}assertInitialized(){if(!this.initialized)throw new u}async verifyGameId(e){if((e.verifyMode??"none")!=="none"){if(!this.auth)throw new g;if(!this.api)throw new o;await this.api.getGameDetail(e.gameId);}}};function G(n){if(!n)return;let e=n.split(".");if(!(e.length<2))try{let t=e[1].replace(/-/g,"+").replace(/_/g,"/"),s=t+"===".slice((t.length+3)%4);if(typeof globalThis.atob!="function")return;let i=globalThis.atob(s);return JSON.parse(i)}catch{return}}function k(n){let e=G(n)?.exp;return typeof e=="number"?e*1e3:void 0}var v=class extends a{constructor(){super("Missing Telegram init data"),this.name="MissingTelegramInitDataError";}},P=class extends a{constructor(){super("Missing refresh token"),this.name="MissingRefreshTokenError";}},x=class{id="telegram";client;getTelegramInitData;mapUser;session=null;constructor(e){this.client=new d(e),this.getTelegramInitData=e.getTelegramInitData,this.mapUser=e.mapUser;}onSessionChanged=e=>{this.session=e;};async login(e){let t=e?.telegramInitData??this.getTelegramInitData?.()??globalThis?.Telegram?.WebApp?.initData;if(!t)throw new v;let s=await this.client.telegramLogin(t),i=s.user??{},l={user:this.mapUser?this.mapUser(i):this.defaultMapUser(i),accessToken:s.accessToken,refreshToken:s.refreshToken,expiresAt:k(s.accessToken)};return this.session=l,{session:l}}async refresh(){let e=this.session,t=e?.refreshToken;if(!e||!t)throw new P;let s=await this.client.refresh(t),i={accessToken:s.accessToken,refreshToken:s.refreshToken,expiresAt:k(s.accessToken)};return this.session={...e,...i},i}async logout(){let e=this.session?.refreshToken;if(e)try{await this.client.logout(e);}catch{}this.session=null;}defaultMapUser(e){let t=e.id??e._id??e.userId??e.telegramId;if(t==null||String(t).trim()==="")throw new a("Missing user id from auth response");return {id:String(t),displayName:e.displayName??e.username??e.name,avatarUrl:e.avatarUrl??e.photoUrl??e.avatar}}};var U="looplay:anon-id",q=4e3,O={jwt:null,gameId:null,apiUrl:null,anonymousId:null,origin:null,receivedAt:null},M=n=>typeof n=="object"&&n!==null,I=n=>{if(typeof n!="string")return null;let e=n.trim();return e||null};function C(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{let e=Math.random()*16|0;return (n==="x"?e:e&3|8).toString(16)})}function D(n){if(typeof window>"u"||!window.localStorage)return null;try{return window.localStorage.getItem(n)}catch{return null}}function K(n,e){if(!(typeof window>"u"||!window.localStorage))try{window.localStorage.setItem(n,e);}catch{}}var S=class{state=O;initialized=false;lifecycleTrackingInitialized=false;lastGameStartedKey=null;client=null;listeners=new Set;options;messageListener=null;anonymousFallbackTimer=null;constructor(e={}){this.options=e;}getState(){return this.state}getJwt(){return this.state.jwt}getApiUrl(){return this.options.apiUrl??this.state.apiUrl}getGameId(){return this.options.appId??this.state.gameId}getAnonymousId(){return this.state.anonymousId}canTrack(){return !this.getApiUrl()||!this.getGameId()?false:!!(this.state.jwt||this.state.anonymousId)}subscribe(e){return this.listeners.add(e),e(this.state),()=>this.listeners.delete(e)}requestAuth(){if(typeof window>"u"||window.parent===window){this.debug("standalone mode detected; auth request skipped");return}this.debug("requesting auth from parent",{targetOrigin:this.resolveParentOrigin()??"*"}),window.parent.postMessage({type:"LOOPLAY_AUTH_REQUEST"},this.resolveParentOrigin()??"*");}init(){if(this.initialized||typeof window>"u")return;this.initialized=true;let e=window.parent!==window;if(this.debug("auth listener initialized",{isIframe:e,parentOrigin:this.resolveParentOrigin()}),!e){this.activateAnonymousMode();return}let t=this.resolveParentOrigin();t||console.warn("[LooplaySDK] LooplayIframeAuth could not resolve a parent origin to verify postMessage against (document.referrer is empty). Auth messages from window.parent will be accepted regardless of origin. Pass `parentOrigin` explicitly to harden this."),this.messageListener=s=>{if(s.source===window.parent){if(t&&s.origin!==t){this.debug("ignored auth message from unexpected origin",{expectedOrigin:t,receivedOrigin:s.origin});return}!M(s.data)||s.data.type!=="LOOPLAY_AUTH"||this.handleAuthMessage(s.data,s.origin);}},window.addEventListener("message",this.messageListener),this.anonymousFallbackTimer=setTimeout(()=>{this.state.jwt||this.activateAnonymousMode();},this.options.anonymousFallbackTimeoutMs??q),this.requestAuth();}dispose(){typeof window<"u"&&this.messageListener&&window.removeEventListener("message",this.messageListener),this.anonymousFallbackTimer!==null&&clearTimeout(this.anonymousFallbackTimer),this.messageListener=null,this.anonymousFallbackTimer=null,this.initialized=false,this.lifecycleTrackingInitialized=false,this.listeners.clear();}getClient(){if(this.client)return this.client;let e=this.getApiUrl();return this.debug("creating sdk ApiClient",{baseUrl:e}),this.client=new h({baseUrl:e??void 0,getAccessToken:async()=>this.getJwt()??void 0,getAnonymousId:()=>this.getAnonymousId()??void 0}),this.client}trackPlay(e){let t=this.getGameId();return !this.canTrack()||!t?(this.debug("trackPlay skipped; auth is not ready",{hasGameId:!!t}),Promise.resolve(false)):(this.debug("trackPlay dispatched",{gameId:t,playTimeSeconds:e}),this.getClient().trackPlay(t,e))}trackMatch(e,t){let s=this.getGameId();return !this.canTrack()||!s?(this.debug("trackMatch skipped; auth is not ready",{matchId:e}),Promise.resolve(false)):(this.debug("trackMatch dispatched",{gameId:s,matchId:e,...t}),this.getClient().trackMatch(s,{matchId:e,matchDurationSeconds:t.durationSeconds,isCompleted:t.isCompleted,isWin:t.isWin}))}emitGameEvent(e,t){let s=this.getGameId();return !this.canTrack()||!s?(this.debug("emitGameEvent skipped; auth is not ready",{actionCode:e}),Promise.resolve(null)):(this.debug("emitGameEvent dispatched",{gameId:s,actionCode:e,...t}),this.getClient().emit(s,e,t))}initLifecycleTracking(){this.lifecycleTrackingInitialized||typeof window>"u"||(this.lifecycleTrackingInitialized=true,this.debug("lifecycle tracking initialized"),this.subscribe(()=>{let e=this.getTrackingKey();!e||this.lastGameStartedKey===e||(this.lastGameStartedKey=e,this.debug("auto GAME_STARTED dispatch"),this.emitGameEvent("GAME_STARTED"));}));}getTrackingKey(){let e=this.getGameId(),t=this.getApiUrl(),s=this.state.jwt??this.state.anonymousId;return !e||!t||!s?null:`${t}
|
|
2
|
+
${e}
|
|
3
|
+
${s}`}activateAnonymousMode(){if(this.state.anonymousId)return;let e=this.options.anonymousIdStorageKey??U,t=D(e)??C();K(e,t),this.lastGameStartedKey=null,this.setState({...this.state,anonymousId:t,receivedAt:Date.now()}),this.debug("anonymous tracking mode active",{anonymousId:t});}handleAuthMessage(e,t){this.anonymousFallbackTimer!==null&&(clearTimeout(this.anonymousFallbackTimer),this.anonymousFallbackTimer=null);let s=I(e.jwt),i=I(e.gameId),r=I(e.apiUrl);if(!s||!i||!r){this.lastGameStartedKey=null,this.setState({...this.state,jwt:null,gameId:null,apiUrl:null,origin:t,receivedAt:Date.now()}),this.debug("auth cleared by parent; falling back to anonymous tracking"),this.activateAnonymousMode();return}this.lastGameStartedKey=null,this.setState({jwt:s,gameId:i,apiUrl:r,anonymousId:null,origin:t,receivedAt:Date.now()});}setState(e){this.state=e,this.client=null,this.debug("auth state updated",{gameId:this.getGameId(),apiUrl:this.getApiUrl(),origin:e.origin,hasJwt:!!e.jwt,hasAnonymousId:!!e.anonymousId}),this.listeners.forEach(t=>t(e));}resolveParentOrigin(){if(this.options.parentOrigin)return this.options.parentOrigin;if(typeof document>"u"||!document.referrer)return null;try{return new URL(document.referrer).origin}catch{return null}}debug(e,t){this.options.onDebug?.(e,t);}};exports.ApiClient=h;exports.BrowserLocalStorageAuthStorage=b;exports.HttpClient=f;exports.HttpError=T;exports.LooplayAuth=y;exports.LooplayIframeAuth=S;exports.LooplaySDK=R;exports.LooplaySDKError=a;exports.MemoryAuthStorage=p;exports.MissingAuthError=g;exports.MissingBaseUrlError=o;exports.NotAuthenticatedError=m;exports.NotInitializedError=u;exports.ServiceClient=d;exports.TelegramAuthProvider=x;return exports;})({});//# sourceMappingURL=looplay-sdk.min.js.map
|
|
2
4
|
//# sourceMappingURL=looplay-sdk.min.js.map
|