@looplay/sdk 0.1.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 +3 -0
- package/dist/looplay-sdk.cjs.js +638 -0
- package/dist/looplay-sdk.cjs.js.map +1 -0
- package/dist/looplay-sdk.esm.js +623 -0
- package/dist/looplay-sdk.esm.js.map +1 -0
- package/dist/looplay-sdk.min.js +2 -0
- package/dist/looplay-sdk.min.js.map +1 -0
- package/dist/types/apps/LooplaySDK.types.d.ts +21 -0
- package/dist/types/apps/api-client.d.ts +42 -0
- package/dist/types/apps/http.d.ts +26 -0
- package/dist/types/apps/index.d.ts +4 -0
- package/dist/types/apps/service-client.d.ts +35 -0
- package/dist/types/auth/index.d.ts +4 -0
- package/dist/types/auth/looplay-auth.d.ts +19 -0
- package/dist/types/auth/providers/index.d.ts +1 -0
- package/dist/types/auth/providers/telegram-auth-provider.d.ts +30 -0
- package/dist/types/auth/storage.d.ts +12 -0
- package/dist/types/auth/types.d.ts +46 -0
- package/dist/types/errors.d.ts +15 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/looplay-sdk.d.ts +38 -0
- package/dist/types/types.d.ts +13 -0
- package/package.json +40 -0
|
@@ -0,0 +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.cjs.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"]}
|