@pixelume/sdk 0.4.0 → 0.6.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.
Files changed (35) hide show
  1. package/CHANGELOG.md +62 -1
  2. package/README.md +97 -19
  3. package/dist/core/PixelumeClient.d.ts +10 -2
  4. package/dist/core/PixelumeClient.js +20 -2
  5. package/dist/core/PixelumeClient.js.map +1 -1
  6. package/dist/core/config.d.ts +18 -1
  7. package/dist/core/config.js +99 -0
  8. package/dist/core/config.js.map +1 -1
  9. package/dist/core/errors.d.ts +5 -0
  10. package/dist/core/errors.js.map +1 -1
  11. package/dist/core/types.d.ts +78 -0
  12. package/dist/core/types.js.map +1 -1
  13. package/dist/index.d.ts +2 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/modules/analytics/AnalyticsModule.d.ts +93 -0
  16. package/dist/modules/analytics/AnalyticsModule.js +461 -0
  17. package/dist/modules/analytics/AnalyticsModule.js.map +1 -0
  18. package/dist/modules/analytics/AnalyticsProvider.d.ts +51 -0
  19. package/dist/modules/analytics/AnalyticsProvider.js +23 -0
  20. package/dist/modules/analytics/AnalyticsProvider.js.map +1 -0
  21. package/dist/modules/analytics/PostHogAnalyticsProvider.d.ts +39 -0
  22. package/dist/modules/analytics/PostHogAnalyticsProvider.js +255 -0
  23. package/dist/modules/analytics/PostHogAnalyticsProvider.js.map +1 -0
  24. package/dist/modules/analytics/events.d.ts +30 -0
  25. package/dist/modules/analytics/events.js +153 -0
  26. package/dist/modules/analytics/events.js.map +1 -0
  27. package/dist/modules/auth/AuthModule.d.ts +20 -1
  28. package/dist/modules/auth/AuthModule.js +305 -21
  29. package/dist/modules/auth/AuthModule.js.map +1 -1
  30. package/dist/ui/widget.js +15 -5
  31. package/dist/ui/widget.js.map +1 -1
  32. package/dist/version.d.ts +1 -1
  33. package/dist/version.js +1 -1
  34. package/dist/version.js.map +1 -1
  35. package/package.json +4 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AuthModule.js","sourceRoot":"","sources":["../../../src/modules/auth/AuthModule.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n parseEmptyResponse,\n parseOAuthTokenResponse,\n parsePlayerEnvelope,\n} from '../../contracts/index.js';\nimport {\n PixelumeAuthError,\n PixelumeConfigError,\n isPixelumeError,\n type PixelumeError,\n} from '../../core/errors.js';\nimport type {\n PixelumeBrowserAdapter,\n PixelumeRequestOptions,\n PixelumeSessionStorage,\n} from '../../core/types.js';\nimport type { ResolvedConfig } from '../../core/config.js';\nimport type { HttpClient } from '../../http/HttpClient.js';\nimport {\n SessionManager,\n browserResumeSource,\n type PixelumeSessionListener,\n type PixelumeSessionState,\n} from './SessionManager.js';\n\nconst AUTHORIZATION_REQUEST_TTL_MS = 10 * 60_000;\nconst CALLBACK_PARAMETERS = ['code', 'state', 'error', 'error_description'] as const;\n\nexport interface PixelumePlayer {\n readonly id: string;\n readonly displayName: string;\n readonly avatarUrl: string | null;\n}\n\nexport type PixelumeAnonymousReason = 'visitor' | 'cancelled' | 'expired' | 'logged_out' | 'error';\n\nexport type PixelumeAuthState =\n | { readonly status: 'uninitialized'; readonly player: null }\n | { readonly status: 'redirecting'; readonly player: null }\n | { readonly status: 'exchanging'; readonly player: null }\n | {\n readonly status: 'anonymous';\n readonly player: null;\n readonly reason: PixelumeAnonymousReason;\n readonly error: PixelumeError | null;\n }\n | { readonly status: 'authenticated'; readonly player: PixelumePlayer };\n\nexport type PixelumeAuthListener = (state: PixelumeAuthState, previous: PixelumeAuthState) => void;\n\n/**\n * OAuth scope requested at login. `profile` identifies the player; `profile saves` also allows\n * Cloud Saves and requires `saves` to be enabled for the game in the Pixelume Game Registry.\n */\nexport type PixelumeScopeRequest = 'profile' | 'profile saves';\n\nexport interface PixelumeLoginOptions {\n /** Defaults to the client `scope` option (`profile` unless configured). */\n readonly scope?: PixelumeScopeRequest;\n}\n\nexport interface PixelumeAuthApi {\n /** Current synchronous authentication state. */\n readonly state: PixelumeAuthState;\n /** Starts a top-level redirect to the API authorization endpoint. */\n login(options?: PixelumeLoginOptions): Promise<void>;\n /** Returns the current player, revalidating the memory-only access token with the API. */\n getPlayer(options?: PixelumeRequestOptions): Promise<PixelumePlayer | null>;\n /**\n * Revokes this game's authorization (refresh token family and access tokens) and clears local\n * authentication state. The central Pixelume session in the portal is not affected.\n */\n logout(options?: PixelumeRequestOptions): Promise<void>;\n /** Subscribes to state changes. The returned function removes the listener. */\n subscribe(listener: PixelumeAuthListener): () => void;\n /**\n * Token lifecycle of the signed-in player (scopes, expiry, renewal in flight, last transient\n * renewal error). Never exposes tokens.\n */\n readonly session: PixelumeSessionState;\n /** Subscribes to `session` changes. The returned function removes the listener. */\n subscribeSession(listener: PixelumeSessionListener): () => void;\n /**\n * Renews the access token now. Renewal is automatic; call this only to renew ahead of a\n * critical operation. Rejects with the transient error (the session is kept and retried) or\n * with `PixelumeAuthError` when there is no session or it ended.\n */\n refresh(options?: PixelumeRequestOptions): Promise<void>;\n}\n\ninterface PendingAuthorization {\n readonly version: 1;\n readonly state: string;\n readonly verifier: string;\n readonly redirectUri: string;\n readonly createdAt: number;\n}\n\nexport class AuthModule implements PixelumeAuthApi {\n readonly #http: HttpClient;\n readonly #config: ResolvedConfig;\n readonly #listeners = new Set<PixelumeAuthListener>();\n #state: PixelumeAuthState = Object.freeze({ status: 'uninitialized', player: null });\n readonly #session: SessionManager;\n #initializePromise: Promise<PixelumeAuthState> | null = null;\n #loginPromise: Promise<void> | null = null;\n #playerPromise: Promise<PixelumePlayer | null> | null = null;\n #logoutPromise: Promise<void> | null = null;\n\n constructor(http: HttpClient, config: ResolvedConfig) {\n this.#http = http;\n this.#config = config;\n const browser = config.browser;\n this.#session = new SessionManager({\n http,\n clientId: () => this.#requireClientId(),\n resume:\n browser !== undefined && typeof browser.subscribeResume === 'function'\n ? (onResume) => browser.subscribeResume?.(onResume) ?? (() => undefined)\n : browserResumeSource(),\n onEnded: (error) => {\n this.#setState(anonymous('expired', error));\n },\n });\n }\n\n get state(): PixelumeAuthState {\n return this.#state;\n }\n\n get session(): PixelumeSessionState {\n return this.#session.state;\n }\n\n /** @internal Shared with feature modules that call Bearer-protected routes. */\n get sessionManager(): SessionManager {\n return this.#session;\n }\n\n subscribeSession(listener: PixelumeSessionListener): () => void {\n return this.#session.subscribe(listener);\n }\n\n refresh(options: PixelumeRequestOptions = {}): Promise<void> {\n return this.#session.refresh(options);\n }\n\n /** @internal Releases timers/listeners and drops credentials from memory (no revocation). */\n dispose(): void {\n this.#session.dispose();\n this.#listeners.clear();\n }\n\n initialize(): Promise<PixelumeAuthState> {\n this.#initializePromise ??= this.#doInitialize();\n return this.#initializePromise;\n }\n\n subscribe(listener: PixelumeAuthListener): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n login(options: PixelumeLoginOptions = {}): Promise<void> {\n const scope: unknown = options.scope ?? this.#config.scope;\n if (scope !== 'profile' && scope !== 'profile saves') {\n return Promise.reject(\n new PixelumeConfigError('Pixelume Auth scope must be \"profile\" or \"profile saves\"'),\n );\n }\n this.#loginPromise ??= this.#doLogin(scope).finally(() => {\n this.#loginPromise = null;\n });\n return this.#loginPromise;\n }\n\n getPlayer(options: PixelumeRequestOptions = {}): Promise<PixelumePlayer | null> {\n if (!this.#session.active) return Promise.resolve(null);\n this.#playerPromise ??= this.#fetchPlayer(options).finally(() => {\n this.#playerPromise = null;\n });\n return this.#playerPromise;\n }\n\n logout(options: PixelumeRequestOptions = {}): Promise<void> {\n this.#logoutPromise ??= this.#doLogout(options).finally(() => {\n this.#logoutPromise = null;\n });\n return this.#logoutPromise;\n }\n\n async #doInitialize(): Promise<PixelumeAuthState> {\n try {\n const browser = this.#browser();\n const callback = this.#readCallback(browser.currentUrl());\n if (callback !== null) {\n await this.#handleCallback(browser, callback);\n } else if (this.#config.restoreSession) {\n const scope = this.#readSessionHint(browser.sessionStorage);\n if (scope === null) {\n this.#setState(anonymous('visitor'));\n } else {\n this.#removeSessionHint(browser.sessionStorage);\n await this.login({ scope });\n }\n } else {\n this.#setState(anonymous('visitor'));\n }\n } catch (error) {\n const failure = isPixelumeError(error)\n ? error\n : new PixelumeAuthError('browser_unavailable', { cause: error });\n this.#setState(anonymous('error', failure));\n }\n return this.#state;\n }\n\n async #doLogin(scope: PixelumeScopeRequest): Promise<void> {\n const clientId = this.#requireClientId();\n const redirectUri = this.#requireRedirectUri();\n const browser = this.#browser();\n let pending = this.#readPending(browser.sessionStorage);\n if (pending === null || pending.redirectUri !== redirectUri || this.#isExpired(pending)) {\n pending = {\n version: 1,\n state: randomBase64Url(browser.crypto),\n verifier: randomBase64Url(browser.crypto),\n redirectUri,\n createdAt: Date.now(),\n };\n this.#writePending(browser.sessionStorage, pending);\n }\n const challenge = await sha256Base64Url(browser.crypto, pending.verifier);\n const authorization = new URL('/v1/oauth/authorize', this.#config.apiUrl);\n authorization.search = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n state: pending.state,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n scope,\n }).toString();\n this.#setState(Object.freeze({ status: 'redirecting', player: null }));\n try {\n browser.navigate(authorization.toString());\n } catch (cause) {\n this.#removePending(browser.sessionStorage);\n throw new PixelumeAuthError('browser_unavailable', { cause });\n }\n }\n\n async #handleCallback(\n browser: PixelumeBrowserAdapter,\n callback: {\n readonly url: URL;\n readonly code: string | null;\n readonly error: string | null;\n readonly invalid: boolean;\n },\n ): Promise<void> {\n const pending = this.#readPending(browser.sessionStorage);\n this.#removePending(browser.sessionStorage);\n this.#cleanCallback(browser, callback.url);\n\n if (callback.invalid) throw new PixelumeAuthError('invalid_callback');\n if (pending === null || this.#isExpired(pending)) {\n this.#removeSessionHint(browser.sessionStorage);\n throw new PixelumeAuthError(pending === null ? 'invalid_callback' : 'authorization_expired');\n }\n if (\n pending.redirectUri !== this.#config.redirectUri ||\n (callback.code !== null && !/^[A-Za-z0-9_-]{43,128}$/u.test(callback.code))\n ) {\n throw new PixelumeAuthError('invalid_callback');\n }\n const returnedState = singleParameter(callback.url, 'state');\n if (returnedState === null || returnedState !== pending.state) {\n this.#removeSessionHint(browser.sessionStorage);\n throw new PixelumeAuthError('state_mismatch');\n }\n if (callback.error !== null) {\n this.#removeSessionHint(browser.sessionStorage);\n if (callback.error === 'access_denied') {\n this.#setState(anonymous('cancelled'));\n return;\n }\n throw new PixelumeAuthError('invalid_callback');\n }\n if (callback.code === null) throw new PixelumeAuthError('invalid_callback');\n\n this.#setState(Object.freeze({ status: 'exchanging', player: null }));\n const response = await this.#http.request({\n method: 'POST',\n path: '/v1/oauth/token',\n credentials: 'omit',\n form: {\n grant_type: 'authorization_code',\n code: callback.code,\n client_id: this.#requireClientId(),\n redirect_uri: pending.redirectUri,\n code_verifier: pending.verifier,\n },\n parse: parseOAuthTokenResponse,\n });\n this.#session.start(response.data);\n const player = await this.getPlayer();\n if (player !== null) {\n const scope = response.data.scopes.includes('saves') ? 'profile saves' : 'profile';\n this.#writeSessionHint(browser.sessionStorage, scope);\n }\n }\n\n async #fetchPlayer(options: PixelumeRequestOptions): Promise<PixelumePlayer | null> {\n try {\n const response = await this.#session.authorizedRequest({\n method: 'GET',\n path: '/v1/oauth/userinfo',\n signal: options.signal,\n timeoutMs: options.timeoutMs,\n parse: parsePlayerEnvelope,\n });\n const player = Object.freeze({ ...response.data.player });\n const current = this.#state;\n // Keep the same object when nothing changed, so renewals do not look like a new login.\n if (current.status === 'authenticated' && samePlayer(current.player, player)) {\n return current.player;\n }\n this.#setState(Object.freeze({ status: 'authenticated', player }));\n return player;\n } catch (error) {\n // The session ended (expired/revoked); the state already reflects it.\n if (error instanceof PixelumeAuthError) return null;\n throw error;\n }\n }\n\n async #doLogout(options: PixelumeRequestOptions): Promise<void> {\n const token = this.#session.reset();\n const browser = this.#optionalBrowser();\n if (browser) {\n this.#removePending(browser.sessionStorage);\n this.#removeSessionHint(browser.sessionStorage);\n }\n this.#setState(anonymous('logged_out'));\n if (token === null) return;\n // Revoking any token of the family revokes all of it; the refresh token is the preferred hint.\n await this.#http.request({\n method: 'POST',\n path: '/v1/oauth/revoke',\n credentials: 'omit',\n form: {\n token: token.refreshToken ?? token.accessToken,\n token_type_hint: token.refreshToken === null ? 'access_token' : 'refresh_token',\n client_id: this.#requireClientId(),\n },\n signal: options.signal,\n timeoutMs: options.timeoutMs,\n parse: parseEmptyResponse,\n });\n }\n\n #readCallback(value: string): {\n readonly url: URL;\n readonly code: string | null;\n readonly error: string | null;\n readonly invalid: boolean;\n } | null {\n const redirectUri = this.#config.redirectUri;\n if (redirectUri === null) return null;\n const current = new URL(value);\n const expected = new URL(redirectUri);\n if (current.origin !== expected.origin || current.pathname !== expected.pathname) return null;\n const hasCallbackParameter = CALLBACK_PARAMETERS.some((key) => current.searchParams.has(key));\n if (!hasCallbackParameter) return null;\n const code = singleParameter(current, 'code');\n const error = singleParameter(current, 'error');\n return {\n url: current,\n code,\n error,\n invalid: !sameCallbackBase(current, expected) || (code === null) === (error === null),\n };\n }\n\n #cleanCallback(browser: PixelumeBrowserAdapter, url: URL): void {\n const clean = new URL(url.toString());\n for (const key of CALLBACK_PARAMETERS) clean.searchParams.delete(key);\n browser.replaceUrl(`${clean.pathname}${clean.search}${clean.hash}`);\n }\n\n #browser(): PixelumeBrowserAdapter {\n const browser = this.#optionalBrowser();\n if (!browser) throw new PixelumeAuthError('browser_unavailable');\n if (\n typeof browser.crypto.getRandomValues !== 'function' ||\n typeof browser.crypto.subtle.digest !== 'function'\n ) {\n throw new PixelumeAuthError('crypto_unavailable');\n }\n return browser;\n }\n\n #optionalBrowser(): PixelumeBrowserAdapter | null {\n if (this.#config.browser) return this.#config.browser;\n try {\n if (\n typeof globalThis.location === 'undefined' ||\n typeof globalThis.history === 'undefined' ||\n typeof globalThis.sessionStorage === 'undefined' ||\n typeof globalThis.crypto === 'undefined'\n ) {\n return null;\n }\n return {\n currentUrl: () => globalThis.location.href,\n navigate: (url) => {\n globalThis.location.assign(url);\n },\n replaceUrl: (url) => {\n globalThis.history.replaceState(globalThis.history.state, '', url);\n },\n sessionStorage: globalThis.sessionStorage,\n crypto: globalThis.crypto,\n };\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #requireClientId(): string {\n if (this.#config.clientId === null) {\n throw new PixelumeConfigError('Pixelume Auth requires clientId or gameId');\n }\n return this.#config.clientId;\n }\n\n #requireRedirectUri(): string {\n if (this.#config.redirectUri === null) {\n throw new PixelumeAuthError('browser_unavailable');\n }\n return this.#config.redirectUri;\n }\n\n #pendingKey(): string {\n return `pixelume.oauth.pending.${this.#config.clientId ?? 'unconfigured'}`;\n }\n\n #hintKey(): string {\n return `pixelume.oauth.session.${this.#config.clientId ?? 'unconfigured'}`;\n }\n\n #readPending(storage: PixelumeSessionStorage): PendingAuthorization | null {\n try {\n const raw = storage.getItem(this.#pendingKey());\n if (raw === null) return null;\n const value: unknown = JSON.parse(raw);\n if (!isPendingAuthorization(value)) {\n storage.removeItem(this.#pendingKey());\n return null;\n }\n return value;\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #writePending(storage: PixelumeSessionStorage, pending: PendingAuthorization): void {\n try {\n storage.setItem(this.#pendingKey(), JSON.stringify(pending));\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #removePending(storage: PixelumeSessionStorage): void {\n try {\n storage.removeItem(this.#pendingKey());\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n /** The hint is non-secret: only \"a session existed\" and the scope that was granted. */\n #readSessionHint(storage: PixelumeSessionStorage): PixelumeScopeRequest | null {\n try {\n const value = storage.getItem(this.#hintKey());\n if (value === '1' || value === 'profile') return 'profile';\n if (value === 'profile saves') return 'profile saves';\n return null;\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #writeSessionHint(storage: PixelumeSessionStorage, scope: PixelumeScopeRequest): void {\n try {\n storage.setItem(this.#hintKey(), scope);\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #removeSessionHint(storage: PixelumeSessionStorage): void {\n try {\n storage.removeItem(this.#hintKey());\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #isExpired(pending: PendingAuthorization): boolean {\n const now = Date.now();\n return (\n pending.createdAt > now + 60_000 || pending.createdAt + AUTHORIZATION_REQUEST_TTL_MS < now\n );\n }\n\n #setState(state: PixelumeAuthState): void {\n const previous = this.#state;\n if (sameState(previous, state)) return;\n this.#state = state;\n for (const listener of [...this.#listeners]) listener(state, previous);\n }\n}\n\nfunction anonymous(\n reason: PixelumeAnonymousReason,\n error: PixelumeError | null = null,\n): PixelumeAuthState {\n return Object.freeze({ status: 'anonymous', player: null, reason, error });\n}\n\nfunction samePlayer(left: PixelumePlayer, right: PixelumePlayer): boolean {\n return (\n left.id === right.id &&\n left.displayName === right.displayName &&\n left.avatarUrl === right.avatarUrl\n );\n}\n\nfunction isPendingAuthorization(value: unknown): value is PendingAuthorization {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const pending = value as Record<string, unknown>;\n return (\n pending.version === 1 &&\n typeof pending.state === 'string' &&\n /^[A-Za-z0-9_-]{43}$/u.test(pending.state) &&\n typeof pending.verifier === 'string' &&\n /^[A-Za-z0-9_-]{43}$/u.test(pending.verifier) &&\n typeof pending.redirectUri === 'string' &&\n typeof pending.createdAt === 'number' &&\n Number.isFinite(pending.createdAt)\n );\n}\n\nfunction sameCallbackBase(current: URL, expected: URL): boolean {\n if (current.origin !== expected.origin || current.pathname !== expected.pathname) return false;\n const currentBase = new URL(current.toString());\n for (const key of CALLBACK_PARAMETERS) currentBase.searchParams.delete(key);\n currentBase.hash = '';\n const expectedBase = new URL(expected.toString());\n expectedBase.hash = '';\n return currentBase.toString() === expectedBase.toString();\n}\n\nfunction singleParameter(url: URL, name: string): string | null {\n const values = url.searchParams.getAll(name);\n if (values.length !== 1 || values[0] === '') return null;\n return values[0] ?? null;\n}\n\nfunction randomBase64Url(crypto: Crypto): string {\n const bytes = crypto.getRandomValues(new Uint8Array(32));\n return bytesToBase64Url(bytes);\n}\n\nasync function sha256Base64Url(crypto: Crypto, value: string): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return bytesToBase64Url(new Uint8Array(digest));\n}\n\nfunction bytesToBase64Url(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/u, '');\n}\n\nfunction sameState(left: PixelumeAuthState, right: PixelumeAuthState): boolean {\n if (left.status !== right.status) return false;\n if (left.status === 'authenticated' && right.status === 'authenticated') {\n return left.player === right.player;\n }\n if (left.status === 'anonymous' && right.status === 'anonymous') {\n return left.reason === right.reason && left.error === right.error;\n }\n return true;\n}\n"]}
1
+ {"version":3,"file":"AuthModule.js","sourceRoot":"","sources":["../../../src/modules/auth/AuthModule.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n parseEmptyResponse,\n parseOAuthTokenResponse,\n parsePlayerEnvelope,\n} from '../../contracts/index.js';\nimport {\n PixelumeAuthError,\n PixelumeConfigError,\n isPixelumeError,\n type PixelumeError,\n} from '../../core/errors.js';\nimport type {\n PixelumeBrowserAdapter,\n PixelumeRequestOptions,\n PixelumeSessionStorage,\n} from '../../core/types.js';\nimport type { ResolvedConfig } from '../../core/config.js';\nimport type { HttpClient } from '../../http/HttpClient.js';\nimport {\n SessionManager,\n browserResumeSource,\n type PixelumeSessionListener,\n type PixelumeSessionState,\n} from './SessionManager.js';\n\nconst AUTHORIZATION_REQUEST_TTL_MS = 10 * 60_000;\nconst CALLBACK_PARAMETERS = ['code', 'state', 'error', 'error_description'] as const;\n/** `prompt=none` answers meaning \"the central session cannot authorize without a screen\". */\nconst SESSION_ENDED_ERRORS = new Set([\n 'login_required',\n 'consent_required',\n 'interaction_required',\n]);\n\nexport interface PixelumePlayer {\n readonly id: string;\n readonly displayName: string;\n readonly avatarUrl: string | null;\n}\n\n/**\n * Why there is no signed-in player:\n * - `visitor`: no login to restore in this tab/browser (or restoration is off). Not proof that the\n * central session ended.\n * - `cancelled`: the player cancelled the login in the portal.\n * - `expired`: a session that was running ended (renewal refused).\n * - `logged_out`: `auth.logout()`.\n * - `session_ended`: a cross-session restoration attempt found no valid central session\n * (`login_required`); the hint was removed and no further automatic attempt is made.\n * - `offline`: a cross-session restoration could not run or finish for lack of connectivity. The\n * hint is kept; the next start (or `login()`) tries again. Local progress is untouched.\n * - `error`: anything else; see `error`.\n */\nexport type PixelumeAnonymousReason =\n 'visitor' | 'cancelled' | 'expired' | 'logged_out' | 'session_ended' | 'offline' | 'error';\n\n/**\n * `restoring: true` marks the silent cross-session attempt (`restoreAcrossSessions`): the page is\n * leaving for a brief round trip without UI, or completing it. Interactive logins omit it.\n */\nexport type PixelumeAuthState =\n | { readonly status: 'uninitialized'; readonly player: null }\n | { readonly status: 'redirecting'; readonly player: null; readonly restoring?: true }\n | { readonly status: 'exchanging'; readonly player: null; readonly restoring?: true }\n | {\n readonly status: 'anonymous';\n readonly player: null;\n readonly reason: PixelumeAnonymousReason;\n readonly error: PixelumeError | null;\n }\n | { readonly status: 'authenticated'; readonly player: PixelumePlayer };\n\nexport type PixelumeAuthListener = (state: PixelumeAuthState, previous: PixelumeAuthState) => void;\n\n/**\n * OAuth scope requested at login. `profile` identifies the player; `profile saves` also allows\n * Cloud Saves and requires `saves` to be enabled for the game in the Pixelume Game Registry.\n */\nexport type PixelumeScopeRequest = 'profile' | 'profile saves';\n\nexport interface PixelumeLoginOptions {\n /** Defaults to the client `scope` option (`profile` unless configured). */\n readonly scope?: PixelumeScopeRequest;\n}\n\nexport interface PixelumeAuthApi {\n /** Current synchronous authentication state. */\n readonly state: PixelumeAuthState;\n /** Starts a top-level redirect to the API authorization endpoint. */\n login(options?: PixelumeLoginOptions): Promise<void>;\n /** Returns the current player, revalidating the memory-only access token with the API. */\n getPlayer(options?: PixelumeRequestOptions): Promise<PixelumePlayer | null>;\n /**\n * Revokes this game's authorization (refresh token family and access tokens) and clears local\n * authentication state. The central Pixelume session in the portal is not affected.\n */\n logout(options?: PixelumeRequestOptions): Promise<void>;\n /** Subscribes to state changes. The returned function removes the listener. */\n subscribe(listener: PixelumeAuthListener): () => void;\n /**\n * Token lifecycle of the signed-in player (scopes, expiry, renewal in flight, last transient\n * renewal error). Never exposes tokens.\n */\n readonly session: PixelumeSessionState;\n /** Subscribes to `session` changes. The returned function removes the listener. */\n subscribeSession(listener: PixelumeSessionListener): () => void;\n /**\n * Renews the access token now. Renewal is automatic; call this only to renew ahead of a\n * critical operation. Rejects with the transient error (the session is kept and retried) or\n * with `PixelumeAuthError` when there is no session or it ended.\n */\n refresh(options?: PixelumeRequestOptions): Promise<void>;\n}\n\ninterface PendingAuthorization {\n readonly version: 1;\n readonly state: string;\n readonly verifier: string;\n readonly redirectUri: string;\n readonly createdAt: number;\n /** Present on silent (`prompt=none`) attempts only. */\n readonly silent?: true;\n /** Scope of a silent attempt, to adjust the hint after `invalid_scope`. */\n readonly scope?: PixelumeScopeRequest;\n /** Same-origin path, query and hash of the page that started a silent attempt. */\n readonly returnTo?: string;\n}\n\n/** Non-secret cross-session hint kept in persistent storage. Never contains tokens or identity. */\ninterface PersistentHint {\n readonly version: 1;\n readonly scope: PixelumeScopeRequest;\n /** Time of the last successful authorization on this browser. */\n readonly at: number;\n}\n\nexport class AuthModule implements PixelumeAuthApi {\n readonly #http: HttpClient;\n readonly #config: ResolvedConfig;\n readonly #listeners = new Set<PixelumeAuthListener>();\n #state: PixelumeAuthState = Object.freeze({ status: 'uninitialized', player: null });\n readonly #session: SessionManager;\n #initializePromise: Promise<PixelumeAuthState> | null = null;\n #loginPromise: Promise<void> | null = null;\n #playerPromise: Promise<PixelumePlayer | null> | null = null;\n #logoutPromise: Promise<void> | null = null;\n /** True while a callback of a silent attempt is being completed. */\n #completingRestore = false;\n readonly #resume: ((onResume: () => void) => () => void) | null;\n #stopRestoreWatch: (() => void) | null = null;\n\n constructor(http: HttpClient, config: ResolvedConfig) {\n this.#http = http;\n this.#config = config;\n const browser = config.browser;\n this.#resume =\n browser !== undefined && typeof browser.subscribeResume === 'function'\n ? (onResume) => browser.subscribeResume?.(onResume) ?? (() => undefined)\n : browserResumeSource();\n this.#session = new SessionManager({\n http,\n clientId: () => this.#requireClientId(),\n resume: this.#resume,\n onEnded: (error) => {\n this.#setState(anonymous('expired', error));\n },\n });\n }\n\n get state(): PixelumeAuthState {\n return this.#state;\n }\n\n get session(): PixelumeSessionState {\n return this.#session.state;\n }\n\n /** @internal Shared with feature modules that call Bearer-protected routes. */\n get sessionManager(): SessionManager {\n return this.#session;\n }\n\n subscribeSession(listener: PixelumeSessionListener): () => void {\n return this.#session.subscribe(listener);\n }\n\n refresh(options: PixelumeRequestOptions = {}): Promise<void> {\n return this.#session.refresh(options);\n }\n\n /** @internal Releases timers/listeners and drops credentials from memory (no revocation). */\n dispose(): void {\n this.#stopRestoreWatch?.();\n this.#stopRestoreWatch = null;\n this.#session.dispose();\n this.#listeners.clear();\n }\n\n initialize(): Promise<PixelumeAuthState> {\n this.#initializePromise ??= this.#doInitialize();\n return this.#initializePromise;\n }\n\n subscribe(listener: PixelumeAuthListener): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n login(options: PixelumeLoginOptions = {}): Promise<void> {\n const scope: unknown = options.scope ?? this.#config.scope;\n if (scope !== 'profile' && scope !== 'profile saves') {\n return Promise.reject(\n new PixelumeConfigError('Pixelume Auth scope must be \"profile\" or \"profile saves\"'),\n );\n }\n this.#loginPromise ??= this.#doLogin(scope, false).finally(() => {\n this.#loginPromise = null;\n });\n return this.#loginPromise;\n }\n\n getPlayer(options: PixelumeRequestOptions = {}): Promise<PixelumePlayer | null> {\n if (!this.#session.active) return Promise.resolve(null);\n this.#playerPromise ??= this.#fetchPlayer(options).finally(() => {\n this.#playerPromise = null;\n });\n return this.#playerPromise;\n }\n\n logout(options: PixelumeRequestOptions = {}): Promise<void> {\n this.#logoutPromise ??= this.#doLogout(options).finally(() => {\n this.#logoutPromise = null;\n });\n return this.#logoutPromise;\n }\n\n async #doInitialize(): Promise<PixelumeAuthState> {\n try {\n const browser = this.#browser();\n const callback = this.#readCallback(browser.currentUrl());\n if (callback !== null) {\n await this.#handleCallback(browser, callback);\n } else {\n const persistent = this.#persistentStorage(browser);\n if (this.#config.crossSessionRestore !== null && persistent !== null) {\n await this.#restoreAcrossSessions(browser, persistent, this.#config.crossSessionRestore);\n } else {\n // The feature was turned off: do not leave a stale hint behind.\n if (persistent !== null) this.#removePersistentHint(persistent);\n await this.#restoreSameTab(browser);\n }\n }\n } catch (error) {\n const failure = isPixelumeError(error)\n ? error\n : new PixelumeAuthError('browser_unavailable', { cause: error });\n const offline =\n this.#completingRestore && (failure.kind === 'network' || failure.kind === 'timeout');\n this.#setState(anonymous(offline ? 'offline' : 'error', failure));\n } finally {\n this.#completingRestore = false;\n }\n return this.#state;\n }\n\n /** Behaviour without `restoreAcrossSessions` (unchanged since 0.2): same-tab reload only. */\n async #restoreSameTab(browser: PixelumeBrowserAdapter): Promise<void> {\n const scope = this.#config.restoreSession\n ? this.#readSessionHint(browser.sessionStorage)\n : null;\n if (scope === null) {\n this.#setState(anonymous('visitor'));\n return;\n }\n this.#removeSessionHint(browser.sessionStorage);\n await this.login({ scope });\n }\n\n /**\n * At most one silent (`prompt=none`) attempt per start, driven by the tab hint (reload) or the\n * persistent hint (new tab, reopened browser). A per-tab marker stops a second attempt while a\n * previous one did not come back (navigation error, back button), so it can never loop.\n */\n async #restoreAcrossSessions(\n browser: PixelumeBrowserAdapter,\n persistent: PixelumeSessionStorage,\n options: { readonly maxAgeMs: number },\n ): Promise<void> {\n const tabScope = this.#config.restoreSession\n ? this.#readSessionHint(browser.sessionStorage)\n : null;\n const hint = this.#readPersistentHint(persistent, options.maxAgeMs);\n const remembered = tabScope ?? hint?.scope ?? null;\n if (remembered === null) {\n this.#setState(anonymous('visitor'));\n return;\n }\n if (this.#recentRestoreAttempt(browser.sessionStorage)) {\n this.#setState(anonymous('visitor'));\n return;\n }\n if (!isOnline(browser)) {\n this.#setState(anonymous('offline'));\n return;\n }\n // Never ask silently for more than both the game and the previous grant allow.\n const scope: PixelumeScopeRequest =\n remembered === 'profile saves' && this.#config.scope === 'profile saves'\n ? 'profile saves'\n : 'profile';\n this.#removeSessionHint(browser.sessionStorage);\n await this.#doLogin(scope, true);\n }\n\n async #doLogin(scope: PixelumeScopeRequest, silent: boolean): Promise<void> {\n const clientId = this.#requireClientId();\n const redirectUri = this.#requireRedirectUri();\n const browser = this.#browser();\n let pending = this.#readPending(browser.sessionStorage);\n if (\n silent ||\n pending === null ||\n pending.redirectUri !== redirectUri ||\n pending.silent === true ||\n this.#isExpired(pending)\n ) {\n const returnTo = silent ? sameOriginPath(browser.currentUrl(), redirectUri) : null;\n pending = {\n version: 1,\n state: randomBase64Url(browser.crypto),\n verifier: randomBase64Url(browser.crypto),\n redirectUri,\n createdAt: Date.now(),\n ...(silent ? { silent: true as const, scope } : {}),\n ...(returnTo === null ? {} : { returnTo }),\n };\n this.#writePending(browser.sessionStorage, pending);\n }\n const challenge = await sha256Base64Url(browser.crypto, pending.verifier);\n const authorization = new URL('/v1/oauth/authorize', this.#config.apiUrl);\n authorization.search = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n state: pending.state,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n scope,\n ...(silent ? { prompt: 'none' } : {}),\n }).toString();\n if (silent) this.#writeRestoreAttempt(browser.sessionStorage);\n this.#setState(\n Object.freeze(\n silent\n ? { status: 'redirecting', player: null, restoring: true as const }\n : { status: 'redirecting', player: null },\n ),\n );\n try {\n browser.navigate(authorization.toString());\n } catch (cause) {\n this.#removePending(browser.sessionStorage);\n throw new PixelumeAuthError('browser_unavailable', { cause });\n }\n if (silent) this.#watchInterruptedRestore();\n }\n\n /**\n * If the page comes back without leaving (back/forward cache, navigation error then \"back\"),\n * the silent attempt is over: become a visitor instead of staying in `redirecting`. The per-tab\n * marker stays, so the next start does not try again right away.\n */\n #watchInterruptedRestore(): void {\n this.#stopRestoreWatch?.();\n if (this.#resume === null) return;\n const stop = this.#resume(() => {\n const current = this.#state;\n if (current.status === 'redirecting' && current.restoring === true) {\n this.#setState(anonymous('visitor'));\n }\n stop();\n if (this.#stopRestoreWatch === stop) this.#stopRestoreWatch = null;\n });\n this.#stopRestoreWatch = stop;\n }\n\n async #handleCallback(\n browser: PixelumeBrowserAdapter,\n callback: {\n readonly url: URL;\n readonly code: string | null;\n readonly error: string | null;\n readonly invalid: boolean;\n },\n ): Promise<void> {\n const pending = this.#readPending(browser.sessionStorage);\n this.#removePending(browser.sessionStorage);\n this.#removeRestoreAttempt(browser.sessionStorage);\n const silent = pending?.silent === true && !this.#isExpired(pending);\n this.#cleanCallback(browser, callback.url, silent ? (pending.returnTo ?? null) : null);\n this.#completingRestore = silent;\n\n if (callback.invalid) throw new PixelumeAuthError('invalid_callback');\n if (pending === null || this.#isExpired(pending)) {\n this.#removeSessionHint(browser.sessionStorage);\n throw new PixelumeAuthError(pending === null ? 'invalid_callback' : 'authorization_expired');\n }\n if (\n pending.redirectUri !== this.#config.redirectUri ||\n (callback.code !== null && !/^[A-Za-z0-9_-]{43,128}$/u.test(callback.code))\n ) {\n throw new PixelumeAuthError('invalid_callback');\n }\n const returnedState = singleParameter(callback.url, 'state');\n if (returnedState === null || returnedState !== pending.state) {\n this.#removeSessionHint(browser.sessionStorage);\n throw new PixelumeAuthError('state_mismatch');\n }\n if (callback.error !== null) {\n this.#removeSessionHint(browser.sessionStorage);\n const persistent = this.#persistentStorage(browser);\n if (silent) {\n this.#completingRestore = false;\n if (SESSION_ENDED_ERRORS.has(callback.error)) {\n if (persistent !== null) this.#removePersistentHint(persistent);\n this.#setState(anonymous('session_ended'));\n return;\n }\n if (callback.error === 'invalid_scope' && pending.scope === 'profile saves') {\n // The game no longer allows `saves`: the next start tries `profile` only.\n if (persistent !== null) this.#downgradePersistentHint(persistent);\n } else if (persistent !== null) {\n this.#removePersistentHint(persistent);\n }\n throw new PixelumeAuthError('restore_rejected');\n }\n if (persistent !== null) this.#removePersistentHint(persistent);\n if (callback.error === 'access_denied') {\n this.#setState(anonymous('cancelled'));\n return;\n }\n throw new PixelumeAuthError('invalid_callback');\n }\n if (callback.code === null) throw new PixelumeAuthError('invalid_callback');\n\n this.#setState(\n Object.freeze(\n silent\n ? { status: 'exchanging', player: null, restoring: true as const }\n : { status: 'exchanging', player: null },\n ),\n );\n const response = await this.#http.request({\n method: 'POST',\n path: '/v1/oauth/token',\n credentials: 'omit',\n form: {\n grant_type: 'authorization_code',\n code: callback.code,\n client_id: this.#requireClientId(),\n redirect_uri: pending.redirectUri,\n code_verifier: pending.verifier,\n },\n parse: parseOAuthTokenResponse,\n });\n this.#session.start(response.data);\n const player = await this.getPlayer();\n if (player !== null) {\n const scope = response.data.scopes.includes('saves') ? 'profile saves' : 'profile';\n this.#writeSessionHint(browser.sessionStorage, scope);\n const persistent = this.#persistentStorage(browser);\n if (this.#config.crossSessionRestore !== null && persistent !== null) {\n this.#writePersistentHint(persistent, scope);\n }\n }\n }\n\n async #fetchPlayer(options: PixelumeRequestOptions): Promise<PixelumePlayer | null> {\n try {\n const response = await this.#session.authorizedRequest({\n method: 'GET',\n path: '/v1/oauth/userinfo',\n signal: options.signal,\n timeoutMs: options.timeoutMs,\n parse: parsePlayerEnvelope,\n });\n const player = Object.freeze({ ...response.data.player });\n const current = this.#state;\n // Keep the same object when nothing changed, so renewals do not look like a new login.\n if (current.status === 'authenticated' && samePlayer(current.player, player)) {\n return current.player;\n }\n this.#setState(Object.freeze({ status: 'authenticated', player }));\n return player;\n } catch (error) {\n // The session ended (expired/revoked); the state already reflects it.\n if (error instanceof PixelumeAuthError) return null;\n throw error;\n }\n }\n\n async #doLogout(options: PixelumeRequestOptions): Promise<void> {\n const token = this.#session.reset();\n const browser = this.#optionalBrowser();\n if (browser) {\n this.#removePending(browser.sessionStorage);\n this.#removeSessionHint(browser.sessionStorage);\n const persistent = this.#persistentStorage(browser);\n if (persistent !== null) this.#removePersistentHint(persistent);\n }\n this.#setState(anonymous('logged_out'));\n if (token === null) return;\n // Revoking any token of the family revokes all of it; the refresh token is the preferred hint.\n await this.#http.request({\n method: 'POST',\n path: '/v1/oauth/revoke',\n credentials: 'omit',\n form: {\n token: token.refreshToken ?? token.accessToken,\n token_type_hint: token.refreshToken === null ? 'access_token' : 'refresh_token',\n client_id: this.#requireClientId(),\n },\n signal: options.signal,\n timeoutMs: options.timeoutMs,\n parse: parseEmptyResponse,\n });\n }\n\n #readCallback(value: string): {\n readonly url: URL;\n readonly code: string | null;\n readonly error: string | null;\n readonly invalid: boolean;\n } | null {\n const redirectUri = this.#config.redirectUri;\n if (redirectUri === null) return null;\n const current = new URL(value);\n const expected = new URL(redirectUri);\n if (current.origin !== expected.origin || current.pathname !== expected.pathname) return null;\n const hasCallbackParameter = CALLBACK_PARAMETERS.some((key) => current.searchParams.has(key));\n if (!hasCallbackParameter) return null;\n const code = singleParameter(current, 'code');\n const error = singleParameter(current, 'error');\n return {\n url: current,\n code,\n error,\n invalid: !sameCallbackBase(current, expected) || (code === null) === (error === null),\n };\n }\n\n /** Removes the callback fields; a silent attempt returns to the page that started it. */\n #cleanCallback(browser: PixelumeBrowserAdapter, url: URL, returnTo: string | null): void {\n if (returnTo !== null && isSafeReturnPath(returnTo)) {\n browser.replaceUrl(returnTo);\n return;\n }\n const clean = new URL(url.toString());\n for (const key of CALLBACK_PARAMETERS) clean.searchParams.delete(key);\n browser.replaceUrl(`${clean.pathname}${clean.search}${clean.hash}`);\n }\n\n #browser(): PixelumeBrowserAdapter {\n const browser = this.#optionalBrowser();\n if (!browser) throw new PixelumeAuthError('browser_unavailable');\n if (\n typeof browser.crypto.getRandomValues !== 'function' ||\n typeof browser.crypto.subtle.digest !== 'function'\n ) {\n throw new PixelumeAuthError('crypto_unavailable');\n }\n return browser;\n }\n\n #optionalBrowser(): PixelumeBrowserAdapter | null {\n if (this.#config.browser) return this.#config.browser;\n try {\n if (\n typeof globalThis.location === 'undefined' ||\n typeof globalThis.history === 'undefined' ||\n typeof globalThis.sessionStorage === 'undefined' ||\n typeof globalThis.crypto === 'undefined'\n ) {\n return null;\n }\n return {\n currentUrl: () => globalThis.location.href,\n navigate: (url) => {\n globalThis.location.assign(url);\n },\n replaceUrl: (url) => {\n globalThis.history.replaceState(globalThis.history.state, '', url);\n },\n sessionStorage: globalThis.sessionStorage,\n get persistentStorage() {\n try {\n return typeof globalThis.localStorage === 'undefined' ? null : globalThis.localStorage;\n } catch {\n // Blocked storage (privacy settings, sandboxed frames).\n return null;\n }\n },\n crypto: globalThis.crypto,\n };\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #requireClientId(): string {\n if (this.#config.clientId === null) {\n throw new PixelumeConfigError('Pixelume Auth requires clientId or gameId');\n }\n return this.#config.clientId;\n }\n\n #requireRedirectUri(): string {\n if (this.#config.redirectUri === null) {\n throw new PixelumeAuthError('browser_unavailable');\n }\n return this.#config.redirectUri;\n }\n\n #pendingKey(): string {\n return `pixelume.oauth.pending.${this.#config.clientId ?? 'unconfigured'}`;\n }\n\n #hintKey(): string {\n return `pixelume.oauth.session.${this.#config.clientId ?? 'unconfigured'}`;\n }\n\n #persistentHintKey(): string {\n return `pixelume.oauth.restore.${this.#config.clientId ?? 'unconfigured'}`;\n }\n\n #restoreAttemptKey(): string {\n return `pixelume.oauth.restore-attempt.${this.#config.clientId ?? 'unconfigured'}`;\n }\n\n #persistentStorage(browser: PixelumeBrowserAdapter): PixelumeSessionStorage | null {\n try {\n return browser.persistentStorage ?? null;\n } catch {\n return null;\n }\n }\n\n /**\n * Persistent-hint helpers never throw: an unavailable `localStorage` only disables\n * cross-session restoration, it must not break the login itself.\n */\n #readPersistentHint(storage: PixelumeSessionStorage, maxAgeMs: number): PersistentHint | null {\n try {\n const raw = storage.getItem(this.#persistentHintKey());\n if (raw === null) return null;\n const value: unknown = JSON.parse(raw);\n const now = Date.now();\n if (!isPersistentHint(value) || value.at > now + 60_000 || value.at + maxAgeMs < now) {\n storage.removeItem(this.#persistentHintKey());\n return null;\n }\n return value;\n } catch {\n this.#removePersistentHint(storage);\n return null;\n }\n }\n\n #writePersistentHint(storage: PixelumeSessionStorage, scope: PixelumeScopeRequest): void {\n const hint: PersistentHint = { version: 1, scope, at: Date.now() };\n try {\n storage.setItem(this.#persistentHintKey(), JSON.stringify(hint));\n } catch {\n // Quota or blocked storage: the next new tab simply starts as a visitor.\n }\n }\n\n #downgradePersistentHint(storage: PixelumeSessionStorage): void {\n try {\n const raw = storage.getItem(this.#persistentHintKey());\n const value: unknown = raw === null ? null : JSON.parse(raw);\n if (!isPersistentHint(value)) return;\n storage.setItem(\n this.#persistentHintKey(),\n JSON.stringify({ ...value, scope: 'profile' } satisfies PersistentHint),\n );\n } catch {\n this.#removePersistentHint(storage);\n }\n }\n\n #removePersistentHint(storage: PixelumeSessionStorage): void {\n try {\n storage.removeItem(this.#persistentHintKey());\n } catch {\n // Nothing else to do.\n }\n }\n\n #recentRestoreAttempt(storage: PixelumeSessionStorage): boolean {\n const raw = storage.getItem(this.#restoreAttemptKey());\n if (raw === null) return false;\n const at = Number(raw);\n const now = Date.now();\n if (!Number.isFinite(at) || at > now + 60_000 || at + AUTHORIZATION_REQUEST_TTL_MS < now) {\n storage.removeItem(this.#restoreAttemptKey());\n return false;\n }\n return true;\n }\n\n #writeRestoreAttempt(storage: PixelumeSessionStorage): void {\n try {\n storage.setItem(this.#restoreAttemptKey(), String(Date.now()));\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #removeRestoreAttempt(storage: PixelumeSessionStorage): void {\n try {\n storage.removeItem(this.#restoreAttemptKey());\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #readPending(storage: PixelumeSessionStorage): PendingAuthorization | null {\n try {\n const raw = storage.getItem(this.#pendingKey());\n if (raw === null) return null;\n const value: unknown = JSON.parse(raw);\n if (!isPendingAuthorization(value)) {\n storage.removeItem(this.#pendingKey());\n return null;\n }\n return value;\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #writePending(storage: PixelumeSessionStorage, pending: PendingAuthorization): void {\n try {\n storage.setItem(this.#pendingKey(), JSON.stringify(pending));\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #removePending(storage: PixelumeSessionStorage): void {\n try {\n storage.removeItem(this.#pendingKey());\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n /** The hint is non-secret: only \"a session existed\" and the scope that was granted. */\n #readSessionHint(storage: PixelumeSessionStorage): PixelumeScopeRequest | null {\n try {\n const value = storage.getItem(this.#hintKey());\n if (value === '1' || value === 'profile') return 'profile';\n if (value === 'profile saves') return 'profile saves';\n return null;\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #writeSessionHint(storage: PixelumeSessionStorage, scope: PixelumeScopeRequest): void {\n try {\n storage.setItem(this.#hintKey(), scope);\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #removeSessionHint(storage: PixelumeSessionStorage): void {\n try {\n storage.removeItem(this.#hintKey());\n } catch (cause) {\n throw new PixelumeAuthError('storage_unavailable', { cause });\n }\n }\n\n #isExpired(pending: PendingAuthorization): boolean {\n const now = Date.now();\n return (\n pending.createdAt > now + 60_000 || pending.createdAt + AUTHORIZATION_REQUEST_TTL_MS < now\n );\n }\n\n #setState(state: PixelumeAuthState): void {\n const previous = this.#state;\n if (sameState(previous, state)) return;\n this.#state = state;\n for (const listener of [...this.#listeners]) listener(state, previous);\n }\n}\n\nfunction anonymous(\n reason: PixelumeAnonymousReason,\n error: PixelumeError | null = null,\n): PixelumeAuthState {\n return Object.freeze({ status: 'anonymous', player: null, reason, error });\n}\n\nfunction samePlayer(left: PixelumePlayer, right: PixelumePlayer): boolean {\n return (\n left.id === right.id &&\n left.displayName === right.displayName &&\n left.avatarUrl === right.avatarUrl\n );\n}\n\nfunction isPersistentHint(value: unknown): value is PersistentHint {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const hint = value as Record<string, unknown>;\n return (\n hint.version === 1 &&\n (hint.scope === 'profile' || hint.scope === 'profile saves') &&\n typeof hint.at === 'number' &&\n Number.isFinite(hint.at)\n );\n}\n\nfunction isOnline(browser: PixelumeBrowserAdapter): boolean {\n try {\n if (typeof browser.isOnline === 'function') return browser.isOnline();\n const navigator = Reflect.get(globalThis, 'navigator') as { onLine?: unknown } | undefined;\n return navigator?.onLine !== false;\n } catch {\n return true;\n }\n}\n\n/** Path, query and hash of `current` when it is on the redirect URI's origin; null otherwise. */\nfunction sameOriginPath(current: string, redirectUri: string): string | null {\n try {\n const url = new URL(current);\n if (url.origin !== new URL(redirectUri).origin) return null;\n for (const key of CALLBACK_PARAMETERS) url.searchParams.delete(key);\n const path = `${url.pathname}${url.search}${url.hash}`;\n return isSafeReturnPath(path) ? path : null;\n } catch {\n return null;\n }\n}\n\nfunction isSafeReturnPath(value: string): boolean {\n return (\n value.startsWith('/') &&\n !value.startsWith('//') &&\n !value.includes('\\\\') &&\n value.length <= 2048\n );\n}\n\nfunction isPendingAuthorization(value: unknown): value is PendingAuthorization {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const pending = value as Record<string, unknown>;\n return (\n (pending.silent === undefined || pending.silent === true) &&\n (pending.scope === undefined ||\n pending.scope === 'profile' ||\n pending.scope === 'profile saves') &&\n (pending.returnTo === undefined ||\n (typeof pending.returnTo === 'string' && isSafeReturnPath(pending.returnTo))) &&\n pending.version === 1 &&\n typeof pending.state === 'string' &&\n /^[A-Za-z0-9_-]{43}$/u.test(pending.state) &&\n typeof pending.verifier === 'string' &&\n /^[A-Za-z0-9_-]{43}$/u.test(pending.verifier) &&\n typeof pending.redirectUri === 'string' &&\n typeof pending.createdAt === 'number' &&\n Number.isFinite(pending.createdAt)\n );\n}\n\nfunction sameCallbackBase(current: URL, expected: URL): boolean {\n if (current.origin !== expected.origin || current.pathname !== expected.pathname) return false;\n const currentBase = new URL(current.toString());\n for (const key of CALLBACK_PARAMETERS) currentBase.searchParams.delete(key);\n currentBase.hash = '';\n const expectedBase = new URL(expected.toString());\n expectedBase.hash = '';\n return currentBase.toString() === expectedBase.toString();\n}\n\nfunction singleParameter(url: URL, name: string): string | null {\n const values = url.searchParams.getAll(name);\n if (values.length !== 1 || values[0] === '') return null;\n return values[0] ?? null;\n}\n\nfunction randomBase64Url(crypto: Crypto): string {\n const bytes = crypto.getRandomValues(new Uint8Array(32));\n return bytesToBase64Url(bytes);\n}\n\nasync function sha256Base64Url(crypto: Crypto, value: string): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return bytesToBase64Url(new Uint8Array(digest));\n}\n\nfunction bytesToBase64Url(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/u, '');\n}\n\nfunction sameState(left: PixelumeAuthState, right: PixelumeAuthState): boolean {\n if (left.status !== right.status) return false;\n if (left.status === 'authenticated' && right.status === 'authenticated') {\n return left.player === right.player;\n }\n if (left.status === 'anonymous' && right.status === 'anonymous') {\n return left.reason === right.reason && left.error === right.error;\n }\n if (\n (left.status === 'redirecting' && right.status === 'redirecting') ||\n (left.status === 'exchanging' && right.status === 'exchanging')\n ) {\n return left.restoring === right.restoring;\n }\n return true;\n}\n"]}
package/dist/ui/widget.js CHANGED
@@ -179,7 +179,7 @@ export function mountPixelumeWidget(pixelume, options = {}) {
179
179
  if (state.status === 'uninitialized' ||
180
180
  state.status === 'redirecting' ||
181
181
  state.status === 'exchanging') {
182
- renderLoading(document, content, state.status);
182
+ renderLoading(document, content, state.status !== 'uninitialized' && state.restoring === true ? 'restoring' : state.status);
183
183
  return;
184
184
  }
185
185
  if (state.status === 'authenticated') {
@@ -388,9 +388,12 @@ function anonymousNotice(state) {
388
388
  if (error.kind === 'auth' && Reflect.get(error, 'reason') === 'game_unavailable') {
389
389
  return 'O acesso deste jogo à Pixelume está indisponível no momento. Você pode continuar jogando.';
390
390
  }
391
- // An ended session is already explained by the "expired" title and message.
392
- if (state.reason === 'expired')
391
+ // Ended sessions and lack of connectivity are already explained by the title and message.
392
+ if (state.reason === 'expired' ||
393
+ state.reason === 'session_ended' ||
394
+ state.reason === 'offline') {
393
395
  return null;
396
+ }
394
397
  return 'Não foi possível verificar sua conta. Você pode continuar jogando e tentar novamente.';
395
398
  }
396
399
  function renderLoading(document, content, status) {
@@ -398,6 +401,7 @@ function renderLoading(document, content, status) {
398
401
  uninitialized: 'Preparando sua conta…',
399
402
  redirecting: 'Abrindo o Pixelume Auth…',
400
403
  exchanging: 'Concluindo a entrada…',
404
+ restoring: 'Conectando à sua conta Pixelume…',
401
405
  };
402
406
  content.setAttribute('aria-busy', 'true');
403
407
  const visual = document.createElement('div');
@@ -417,8 +421,10 @@ function playerInitial(displayName) {
417
421
  function anonymousTitle(state) {
418
422
  if (state.reason === 'logged_out')
419
423
  return 'Você saiu deste jogo';
420
- if (state.reason === 'expired')
424
+ if (state.reason === 'expired' || state.reason === 'session_ended')
421
425
  return 'Sua sessão expirou';
426
+ if (state.reason === 'offline')
427
+ return 'Sem conexão';
422
428
  if (state.reason === 'cancelled')
423
429
  return 'Entrada cancelada';
424
430
  return 'Sua conta Pixelume';
@@ -426,8 +432,12 @@ function anonymousTitle(state) {
426
432
  function anonymousMessage(state) {
427
433
  if (state.reason === 'logged_out')
428
434
  return 'Entre novamente quando quiser.';
429
- if (state.reason === 'expired')
435
+ if (state.reason === 'expired' || state.reason === 'session_ended') {
430
436
  return 'Entre novamente para continuar com sua conta.';
437
+ }
438
+ if (state.reason === 'offline') {
439
+ return 'Você pode continuar jogando. Entre com sua conta quando a conexão voltar.';
440
+ }
431
441
  if (state.reason === 'cancelled')
432
442
  return 'Você pode continuar como visitante ou tentar novamente.';
433
443
  return 'Entre pelo portal seguro da Pixelume. Sua senha nunca passa pelo jogo.';
@@ -1 +1 @@
1
- {"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/ui/widget.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PixelumeClient } from '../core/PixelumeClient.js';\nimport type { PixelumeAuthState } from '../modules/auth/AuthModule.js';\nimport type { PixelumeSessionState } from '../modules/auth/SessionManager.js';\nimport type { PixelumeSavesActivity } from '../modules/saves/SavesModule.js';\nimport { WIDGET_STYLES } from './styles.js';\n\nexport type PixelumeWidgetPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\nexport interface PixelumeWidgetOptions {\n /** Corner used by the widget. Defaults to `bottom-right`. */\n readonly position?: PixelumeWidgetPosition;\n /** Distance from the selected edges in CSS pixels. Defaults to `16`. */\n readonly offset?: number;\n /** Mount target. Defaults to `document.body`; custom targets should establish a containing block. */\n readonly container?: HTMLElement;\n /** Visual treatment. `pixel` is currently the only supported theme. */\n readonly theme?: 'pixel';\n /** Stacking order for the host. Defaults to `2147483000`. */\n readonly zIndex?: number;\n}\n\nexport interface PixelumeWidgetController {\n /** The Shadow DOM host created by the widget. */\n readonly element: HTMLElement;\n /** Hides the widget and closes its panel without changing authentication state. */\n hide(): void;\n /** Shows a previously hidden widget. */\n show(): void;\n /** Removes DOM/listeners/subscriptions. Safe to call more than once. */\n destroy(): void;\n}\n\nconst DEFAULT_POSITION: PixelumeWidgetPosition = 'bottom-right';\nconst DEFAULT_OFFSET = 16;\nconst DEFAULT_Z_INDEX = 2_147_483_000;\nconst POSITIONS: readonly PixelumeWidgetPosition[] = [\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n];\n\ninterface MountedWidget {\n readonly container: HTMLElement;\n readonly controller: PixelumeWidgetController;\n}\n\nconst widgetsByClient = new WeakMap<object, MountedWidget>();\nconst widgetsByContainer = new WeakMap<HTMLElement, object>();\nlet nextWidgetId = 1;\n\n/**\n * Mounts the optional Pixelume account widget. Importing this module alone has no DOM side effects.\n * Repeating the call with the same client and container returns the existing controller.\n */\nexport function mountPixelumeWidget(\n pixelume: PixelumeClient,\n options: PixelumeWidgetOptions = {},\n): PixelumeWidgetController {\n assertClient(pixelume);\n const document = resolveDocument(options.container);\n const container = options.container ?? document.body;\n\n const mounted = widgetsByClient.get(pixelume);\n if (mounted) {\n if (mounted.container === container) return mounted.controller;\n throw new Error('This Pixelume client already has a widget mounted in another container');\n }\n const containerOwner = widgetsByContainer.get(container);\n if (containerOwner) {\n throw new Error('This container already has a Pixelume widget mounted');\n }\n\n const position = resolvePosition(options.position);\n const offset = resolveNumber('offset', options.offset, DEFAULT_OFFSET, 0, 256);\n const zIndex = resolveNumber('zIndex', options.zIndex, DEFAULT_Z_INDEX, 0, 2_147_483_647);\n const theme: unknown = options.theme;\n if (theme !== undefined && theme !== 'pixel') {\n throw new Error('Pixelume widget theme must be \"pixel\"');\n }\n\n const host = document.createElement('div');\n host.dataset.pixelumeWidget = '';\n host.dataset.position = position;\n host.style.setProperty('--pixelume-offset', `${offset}px`);\n host.style.setProperty('--pixelume-z-index', String(zIndex));\n if (options.container) host.dataset.contained = '';\n\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = WIDGET_STYLES;\n\n const root = document.createElement('div');\n root.className = 'root';\n\n const panelId = `pixelume-widget-panel-${nextWidgetId++}`;\n const trigger = button(document, 'trigger', 'Abrir conta Pixelume');\n trigger.type = 'button';\n trigger.setAttribute('aria-expanded', 'false');\n trigger.setAttribute('aria-controls', panelId);\n const triggerMark = document.createElement('span');\n triggerMark.className = 'mark';\n triggerMark.setAttribute('aria-hidden', 'true');\n const triggerLabel = document.createElement('span');\n triggerLabel.className = 'trigger-label';\n triggerLabel.textContent = 'Pixelume';\n const presence = document.createElement('span');\n presence.className = 'presence';\n presence.setAttribute('aria-hidden', 'true');\n trigger.append(triggerMark, triggerLabel, presence);\n\n const panel = document.createElement('section');\n panel.className = 'panel';\n panel.id = panelId;\n panel.hidden = true;\n panel.setAttribute('aria-label', 'Conta Pixelume');\n panel.setAttribute('aria-live', 'polite');\n\n const header = document.createElement('div');\n header.className = 'panel-header';\n const brand = document.createElement('span');\n brand.className = 'brand';\n const brandMark = document.createElement('span');\n brandMark.className = 'mark';\n brandMark.setAttribute('aria-hidden', 'true');\n const brandText = document.createElement('span');\n brandText.textContent = 'Pixelume';\n brand.append(brandMark, brandText);\n const close = button(document, 'close', 'Fechar painel da conta');\n close.type = 'button';\n close.textContent = '×';\n close.setAttribute('aria-hidden', 'false');\n header.append(brand, close);\n\n const content = document.createElement('div');\n content.className = 'content';\n panel.append(header, content);\n root.append(trigger, panel);\n shadow.append(style, root);\n\n let destroyed = false;\n let panelOpen = false;\n let pendingAction: 'login' | 'logout' | null = null;\n let localError: string | null = null;\n let removeDocumentKeydown: (() => void) | null = null;\n\n const onDocumentKeydown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || !panelOpen) return;\n event.preventDefault();\n event.stopPropagation();\n closePanel(true);\n };\n\n const openPanel = (): void => {\n if (destroyed || panelOpen) return;\n panelOpen = true;\n panel.hidden = false;\n trigger.setAttribute('aria-expanded', 'true');\n document.addEventListener('keydown', onDocumentKeydown, true);\n removeDocumentKeydown = () => {\n document.removeEventListener('keydown', onDocumentKeydown, true);\n };\n close.focus();\n };\n\n function closePanel(restoreFocus: boolean): void {\n if (!panelOpen) return;\n panelOpen = false;\n panel.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n removeDocumentKeydown?.();\n removeDocumentKeydown = null;\n if (restoreFocus && !host.hidden) trigger.focus();\n }\n\n const togglePanel = (): void => {\n if (panelOpen) closePanel(true);\n else openPanel();\n };\n\n const runLogin = async (): Promise<void> => {\n if (destroyed || pendingAction) return;\n pendingAction = 'login';\n localError = null;\n render(pixelume.auth.state);\n try {\n await pixelume.auth.login();\n } catch {\n localError =\n 'Não foi possível abrir a entrada agora. Você pode continuar jogando e tentar novamente.';\n } finally {\n pendingAction = null;\n render(pixelume.auth.state);\n }\n };\n\n const runLogout = async (): Promise<void> => {\n if (destroyed || pendingAction) return;\n pendingAction = 'logout';\n localError = null;\n render(pixelume.auth.state);\n try {\n await pixelume.auth.logout();\n } catch {\n localError =\n 'Você saiu deste jogo, mas não foi possível confirmar a revogação no servidor. Tente novamente mais tarde.';\n } finally {\n pendingAction = null;\n render(pixelume.auth.state);\n }\n };\n\n const render = (state: PixelumeAuthState): void => {\n if (destroyed) return;\n content.replaceChildren();\n content.removeAttribute('aria-busy');\n const authenticated = state.status === 'authenticated';\n trigger.toggleAttribute('data-authenticated', authenticated);\n trigger.setAttribute(\n 'aria-label',\n authenticated\n ? `Abrir conta Pixelume. Conectado como ${state.player.displayName}`\n : 'Abrir conta Pixelume',\n );\n\n if (\n state.status === 'uninitialized' ||\n state.status === 'redirecting' ||\n state.status === 'exchanging'\n ) {\n renderLoading(document, content, state.status);\n return;\n }\n\n if (state.status === 'authenticated') {\n const session = sessionState();\n const identity = document.createElement('div');\n identity.className = 'identity';\n const avatar = document.createElement('span');\n avatar.className = 'avatar';\n avatar.setAttribute('aria-hidden', 'true');\n avatar.textContent = playerInitial(state.player.displayName);\n const copy = document.createElement('div');\n copy.className = 'state-copy';\n copy.append(\n textElement(document, 'p', 'title', `Olá, ${state.player.displayName}!`),\n textElement(document, 'p', 'message', 'Sua conta está conectada a este jogo.'),\n );\n identity.append(avatar, copy);\n content.append(identity);\n if (session?.error) {\n content.append(\n notice(\n document,\n 'Não conseguimos falar com a Pixelume agora. Sua conta continua conectada e tentaremos de novo automaticamente.',\n ),\n );\n }\n const sync = syncMessage(savesActivity());\n if (sync) content.append(status(document, sync));\n if (localError) content.append(notice(document, localError));\n const logout = button(document, 'action secondary', 'Sair da conta Pixelume neste jogo');\n logout.type = 'button';\n logout.textContent = pendingAction === 'logout' ? 'Saindo…' : 'Sair deste jogo';\n logout.disabled = pendingAction !== null;\n logout.addEventListener('click', () => void runLogout());\n content.append(logout);\n return;\n }\n\n const copy = document.createElement('div');\n copy.className = 'state-copy';\n copy.append(\n textElement(document, 'p', 'title', anonymousTitle(state)),\n textElement(document, 'p', 'message', anonymousMessage(state)),\n );\n content.append(copy);\n const failure = localError ?? anonymousNotice(state);\n if (failure) content.append(notice(document, failure));\n const login = button(document, 'action', 'Entrar com Pixelume');\n login.type = 'button';\n login.textContent = pendingAction === 'login' ? 'Abrindo Pixelume…' : 'Entrar com Pixelume';\n login.disabled = pendingAction !== null;\n login.addEventListener('click', () => void runLogin());\n content.append(login);\n };\n\n const unsubscribe = pixelume.auth.subscribe((state) => {\n localError = null;\n render(state);\n });\n // Optional sources (absent in custom/mocked clients): token renewal and explicit Saves calls.\n const auth = pixelume.auth as Partial<typeof pixelume.auth>;\n const saves = (pixelume as Partial<Pick<PixelumeClient, 'saves'>>).saves;\n const sessionState = (): PixelumeSessionState | null => auth.session ?? null;\n const savesActivity = (): PixelumeSavesActivity | null => saves?.activity ?? null;\n const rerender = (): void => {\n render(pixelume.auth.state);\n };\n const unsubscribeSession =\n typeof auth.subscribeSession === 'function' ? auth.subscribeSession(rerender) : null;\n const unsubscribeSaves =\n typeof saves?.subscribe === 'function' ? saves.subscribe(rerender) : null;\n\n const stopInputPropagation = (event: Event): void => {\n event.stopPropagation();\n };\n const closeFromButton = (): void => {\n closePanel(true);\n };\n const isolatedEvents = [\n 'click',\n 'pointerdown',\n 'pointerup',\n 'touchstart',\n 'touchend',\n 'keydown',\n 'keyup',\n ] as const;\n for (const eventName of isolatedEvents) host.addEventListener(eventName, stopInputPropagation);\n trigger.addEventListener('click', togglePanel);\n close.addEventListener('click', closeFromButton);\n\n const controller: PixelumeWidgetController = Object.freeze({\n element: host,\n hide(): void {\n if (destroyed) return;\n closePanel(false);\n host.hidden = true;\n },\n show(): void {\n if (destroyed) return;\n host.hidden = false;\n },\n destroy(): void {\n if (destroyed) return;\n destroyed = true;\n closePanel(false);\n removeDocumentKeydown?.();\n removeDocumentKeydown = null;\n unsubscribe();\n unsubscribeSession?.();\n unsubscribeSaves?.();\n trigger.removeEventListener('click', togglePanel);\n close.removeEventListener('click', closeFromButton);\n for (const eventName of isolatedEvents)\n host.removeEventListener(eventName, stopInputPropagation);\n host.remove();\n widgetsByClient.delete(pixelume);\n widgetsByContainer.delete(container);\n },\n });\n\n render(pixelume.auth.state);\n container.append(host);\n widgetsByClient.set(pixelume, { container, controller });\n widgetsByContainer.set(container, pixelume);\n return controller;\n}\n\nfunction assertClient(value: unknown): asserts value is PixelumeClient {\n if (typeof value !== 'object' || value === null)\n throw new TypeError('Pixelume widget requires a client');\n const auth = Reflect.get(value, 'auth') as unknown;\n if (typeof auth !== 'object' || auth === null)\n throw new TypeError('Pixelume widget requires client.auth');\n for (const method of ['login', 'logout', 'subscribe'] as const) {\n if (typeof Reflect.get(auth, method) !== 'function') {\n throw new TypeError(`Pixelume widget requires client.auth.${method}()`);\n }\n }\n}\n\nfunction resolveDocument(container: HTMLElement | undefined): Document {\n if (container) {\n if (typeof container.attachShadow !== 'function') {\n throw new TypeError('Pixelume widget container must be an HTMLElement');\n }\n return container.ownerDocument;\n }\n const candidate = Reflect.get(globalThis, 'document') as unknown;\n if (typeof candidate !== 'object' || candidate === null || !('createElement' in candidate)) {\n throw new Error('Pixelume widget can only be mounted in a browser document');\n }\n return candidate as Document;\n}\n\nfunction resolvePosition(value: PixelumeWidgetPosition | undefined): PixelumeWidgetPosition {\n if (value === undefined) return DEFAULT_POSITION;\n if (!POSITIONS.includes(value)) {\n throw new Error(`Pixelume widget position must be one of: ${POSITIONS.join(', ')}`);\n }\n return value;\n}\n\nfunction resolveNumber(\n name: string,\n value: number | undefined,\n fallback: number,\n minimum: number,\n maximum: number,\n): number {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || value < minimum || value > maximum) {\n throw new Error(`Pixelume widget ${name} must be an integer from ${minimum} to ${maximum}`);\n }\n return value;\n}\n\nfunction button(document: Document, className: string, label: string): HTMLButtonElement {\n const element = document.createElement('button');\n element.className = className;\n element.setAttribute('aria-label', label);\n return element;\n}\n\nfunction textElement(\n document: Document,\n tag: 'p',\n className: string,\n text: string,\n): HTMLParagraphElement {\n const element = document.createElement(tag);\n element.className = className;\n element.textContent = text;\n return element;\n}\n\nfunction notice(document: Document, text: string): HTMLParagraphElement {\n const element = textElement(document, 'p', 'notice', text);\n element.setAttribute('role', 'alert');\n return element;\n}\n\nfunction status(document: Document, text: string): HTMLParagraphElement {\n const element = textElement(document, 'p', 'message sync', text);\n element.setAttribute('role', 'status');\n return element;\n}\n\n/** Cloud status only after the game explicitly saved or deleted; nothing is simulated. */\nfunction syncMessage(activity: PixelumeSavesActivity | null): string | null {\n if (activity === null) return null;\n if (activity.pendingWrites > 0) return 'Salvando na nuvem…';\n const last = activity.last;\n if (last === null || (last.operation !== 'save' && last.operation !== 'delete')) return null;\n if (last.outcome === 'conflict') {\n return 'Há um progresso mais recente na nuvem. O jogo vai decidir o que manter.';\n }\n if (last.outcome === 'error') return 'Não foi possível salvar na nuvem agora.';\n const time = new Date(last.at).toLocaleTimeString('pt-BR', {\n hour: '2-digit',\n minute: '2-digit',\n });\n return last.operation === 'save'\n ? `Progresso salvo na nuvem às ${time}.`\n : `Save removido da nuvem às ${time}.`;\n}\n\nfunction anonymousNotice(\n state: Extract<PixelumeAuthState, { status: 'anonymous' }>,\n): string | null {\n const error = state.error;\n if (error === null) return null;\n if (error.kind === 'auth' && Reflect.get(error, 'reason') === 'game_unavailable') {\n return 'O acesso deste jogo à Pixelume está indisponível no momento. Você pode continuar jogando.';\n }\n // An ended session is already explained by the \"expired\" title and message.\n if (state.reason === 'expired') return null;\n return 'Não foi possível verificar sua conta. Você pode continuar jogando e tentar novamente.';\n}\n\nfunction renderLoading(\n document: Document,\n content: HTMLElement,\n status: 'uninitialized' | 'redirecting' | 'exchanging',\n): void {\n const labels = {\n uninitialized: 'Preparando sua conta…',\n redirecting: 'Abrindo o Pixelume Auth…',\n exchanging: 'Concluindo a entrada…',\n } as const;\n content.setAttribute('aria-busy', 'true');\n const visual = document.createElement('div');\n visual.className = 'loading';\n visual.setAttribute('aria-hidden', 'true');\n for (let index = 0; index < 2; index += 1) {\n const line = document.createElement('span');\n line.className = 'loading-line';\n visual.append(line);\n }\n const label = textElement(document, 'p', 'sr-only', labels[status]);\n content.append(visual, label);\n}\n\nfunction playerInitial(displayName: string): string {\n return Array.from(displayName.trim())[0]?.toLocaleUpperCase('pt-BR') ?? 'P';\n}\n\nfunction anonymousTitle(state: Extract<PixelumeAuthState, { status: 'anonymous' }>): string {\n if (state.reason === 'logged_out') return 'Você saiu deste jogo';\n if (state.reason === 'expired') return 'Sua sessão expirou';\n if (state.reason === 'cancelled') return 'Entrada cancelada';\n return 'Sua conta Pixelume';\n}\n\nfunction anonymousMessage(state: Extract<PixelumeAuthState, { status: 'anonymous' }>): string {\n if (state.reason === 'logged_out') return 'Entre novamente quando quiser.';\n if (state.reason === 'expired') return 'Entre novamente para continuar com sua conta.';\n if (state.reason === 'cancelled')\n return 'Você pode continuar como visitante ou tentar novamente.';\n return 'Entre pelo portal seguro da Pixelume. Sua senha nunca passa pelo jogo.';\n}\n"]}
1
+ {"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/ui/widget.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA4B5C,MAAM,gBAAgB,GAA2B,cAAc,CAAC;AAChE,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,eAAe,GAAG,aAAa,CAAC;AACtC,MAAM,SAAS,GAAsC;IACnD,UAAU;IACV,WAAW;IACX,aAAa;IACb,cAAc;CACf,CAAC;AAOF,MAAM,eAAe,GAAG,IAAI,OAAO,EAAyB,CAAC;AAC7D,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAuB,CAAC;AAC9D,IAAI,YAAY,GAAG,CAAC,CAAC;AAErB;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAwB,EACxB,UAAiC,EAAE;IAEnC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC;IAErD,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,UAAU,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAY,OAAO,CAAC,KAAK,CAAC;IACrC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,CAAC,cAAc,GAAG,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,mBAAmB,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,IAAI,OAAO,CAAC,SAAS;QAAE,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC;IAEnD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,WAAW,GAAG,aAAa,CAAC;IAElC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;IAExB,MAAM,OAAO,GAAG,yBAAyB,YAAY,EAAE,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;IACpE,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC;IACxB,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACnD,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC;IAC/B,WAAW,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACpD,YAAY,CAAC,SAAS,GAAG,eAAe,CAAC;IACzC,YAAY,CAAC,WAAW,GAAG,UAAU,CAAC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAChD,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC;IACnB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACnD,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC;IAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACjD,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC;IAC7B,SAAS,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACjD,SAAS,CAAC,WAAW,GAAG,UAAU,CAAC;IACnC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,wBAAwB,CAAC,CAAC;IAClE,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;IACtB,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;IACxB,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE5B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5B,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE3B,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,aAAa,GAA8B,IAAI,CAAC;IACpD,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,qBAAqB,GAAwB,IAAI,CAAC;IAEtD,MAAM,iBAAiB,GAAG,CAAC,KAAoB,EAAQ,EAAE;QACvD,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,SAAS;YAAE,OAAO;QACjD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAS,EAAE;QAC3B,IAAI,SAAS,IAAI,SAAS;YAAE,OAAO;QACnC,SAAS,GAAG,IAAI,CAAC;QACjB,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QACrB,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC9C,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC9D,qBAAqB,GAAG,GAAG,EAAE;YAC3B,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QACnE,CAAC,CAAC;QACF,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC;IAEF,SAAS,UAAU,CAAC,YAAqB;QACvC,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,SAAS,GAAG,KAAK,CAAC;QAClB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAC/C,qBAAqB,EAAE,EAAE,CAAC;QAC1B,qBAAqB,GAAG,IAAI,CAAC;QAC7B,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,KAAK,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,IAAI,SAAS;YAAE,UAAU,CAAC,IAAI,CAAC,CAAC;;YAC3B,SAAS,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;QACzC,IAAI,SAAS,IAAI,aAAa;YAAE,OAAO;QACvC,aAAa,GAAG,OAAO,CAAC;QACxB,UAAU,GAAG,IAAI,CAAC;QAClB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;gBACR,yFAAyF,CAAC;QAC9F,CAAC;gBAAS,CAAC;YACT,aAAa,GAAG,IAAI,CAAC;YACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,IAAmB,EAAE;QAC1C,IAAI,SAAS,IAAI,aAAa;YAAE,OAAO;QACvC,aAAa,GAAG,QAAQ,CAAC;QACzB,UAAU,GAAG,IAAI,CAAC;QAClB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;gBACR,2GAA2G,CAAC;QAChH,CAAC;gBAAS,CAAC;YACT,aAAa,GAAG,IAAI,CAAC;YACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,KAAwB,EAAQ,EAAE;QAChD,IAAI,SAAS;YAAE,OAAO;QACtB,OAAO,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,KAAK,eAAe,CAAC;QACvD,OAAO,CAAC,eAAe,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;QAC7D,OAAO,CAAC,YAAY,CAClB,YAAY,EACZ,aAAa;YACX,CAAC,CAAC,wCAAwC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE;YACpE,CAAC,CAAC,sBAAsB,CAC3B,CAAC;QAEF,IACE,KAAK,CAAC,MAAM,KAAK,eAAe;YAChC,KAAK,CAAC,MAAM,KAAK,aAAa;YAC9B,KAAK,CAAC,MAAM,KAAK,YAAY,EAC7B,CAAC;YACD,aAAa,CACX,QAAQ,EACR,OAAO,EACP,KAAK,CAAC,MAAM,KAAK,eAAe,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAC1F,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC/C,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC;YAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;YAC5B,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;YAC9B,IAAI,CAAC,MAAM,CACT,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,EACxE,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,uCAAuC,CAAC,CAC/E,CAAC;YACF,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzB,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,MAAM,CACZ,MAAM,CACJ,QAAQ,EACR,gHAAgH,CACjH,CACF,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC,CAAC;YAC1C,IAAI,IAAI;gBAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YACjD,IAAI,UAAU;gBAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,kBAAkB,EAAE,mCAAmC,CAAC,CAAC;YACzF,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;YACvB,MAAM,CAAC,WAAW,GAAG,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC;YAChF,MAAM,CAAC,QAAQ,GAAG,aAAa,KAAK,IAAI,CAAC;YACzC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;QAC9B,IAAI,CAAC,MAAM,CACT,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,EAC1D,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAC/D,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,OAAO,GAAG,UAAU,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,OAAO;YAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;QAChE,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;QACtB,KAAK,CAAC,WAAW,GAAG,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,qBAAqB,CAAC;QAC5F,KAAK,CAAC,QAAQ,GAAG,aAAa,KAAK,IAAI,CAAC;QACxC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;QACpD,UAAU,GAAG,IAAI,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,8FAA8F;IAC9F,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAqC,CAAC;IAC5D,MAAM,KAAK,GAAI,QAAmD,CAAC,KAAK,CAAC;IACzE,MAAM,YAAY,GAAG,GAAgC,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IAC7E,MAAM,aAAa,GAAG,GAAiC,EAAE,CAAC,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC;IAClF,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC;IACF,MAAM,kBAAkB,GACtB,OAAO,IAAI,CAAC,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvF,MAAM,gBAAgB,GACpB,OAAO,KAAK,EAAE,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE5E,MAAM,oBAAoB,GAAG,CAAC,KAAY,EAAQ,EAAE;QAClD,KAAK,CAAC,eAAe,EAAE,CAAC;IAC1B,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,GAAS,EAAE;QACjC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,cAAc,GAAG;QACrB,OAAO;QACP,aAAa;QACb,WAAW;QACX,YAAY;QACZ,UAAU;QACV,SAAS;QACT,OAAO;KACC,CAAC;IACX,KAAK,MAAM,SAAS,IAAI,cAAc;QAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAC/F,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC/C,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAEjD,MAAM,UAAU,GAA6B,MAAM,CAAC,MAAM,CAAC;QACzD,OAAO,EAAE,IAAI;QACb,IAAI;YACF,IAAI,SAAS;gBAAE,OAAO;YACtB,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI;YACF,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC;QACD,OAAO;YACL,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,qBAAqB,EAAE,EAAE,CAAC;YAC1B,qBAAqB,GAAG,IAAI,CAAC;YAC7B,WAAW,EAAE,CAAC;YACd,kBAAkB,EAAE,EAAE,CAAC;YACvB,gBAAgB,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAClD,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YACpD,KAAK,MAAM,SAAS,IAAI,cAAc;gBACpC,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IACzD,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC5C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAC7C,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAY,CAAC;IACnD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAC3C,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IAC9D,KAAK,MAAM,MAAM,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAU,EAAE,CAAC;QAC/D,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;YACpD,MAAM,IAAI,SAAS,CAAC,wCAAwC,MAAM,IAAI,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,SAAkC;IACzD,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,OAAO,SAAS,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACjD,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,SAAS,CAAC,aAAa,CAAC;IACjC,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAY,CAAC;IACjE,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,SAAqB,CAAC;AAC/B,CAAC;AAED,SAAS,eAAe,CAAC,KAAyC;IAChE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,gBAAgB,CAAC;IACjD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,4CAA4C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CACpB,IAAY,EACZ,KAAyB,EACzB,QAAgB,EAChB,OAAe,EACf,OAAe;IAEf,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,4BAA4B,OAAO,OAAO,OAAO,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,QAAkB,EAAE,SAAiB,EAAE,KAAa;IAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAClB,QAAkB,EAClB,GAAQ,EACR,SAAiB,EACjB,IAAY;IAEZ,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,MAAM,CAAC,QAAkB,EAAE,IAAY;IAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,MAAM,CAAC,QAAkB,EAAE,IAAY;IAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,0FAA0F;AAC1F,SAAS,WAAW,CAAC,QAAsC;IACzD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,QAAQ,CAAC,aAAa,GAAG,CAAC;QAAE,OAAO,oBAAoB,CAAC;IAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7F,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,yEAAyE,CAAC;IACnF,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;QAAE,OAAO,yCAAyC,CAAC;IAC/E,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACzD,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,SAAS,KAAK,MAAM;QAC9B,CAAC,CAAC,+BAA+B,IAAI,GAAG;QACxC,CAAC,CAAC,6BAA6B,IAAI,GAAG,CAAC;AAC3C,CAAC;AAED,SAAS,eAAe,CACtB,KAA0D;IAE1D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,kBAAkB,EAAE,CAAC;QACjF,OAAO,2FAA2F,CAAC;IACrG,CAAC;IACD,0FAA0F;IAC1F,IACE,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,KAAK,CAAC,MAAM,KAAK,eAAe;QAChC,KAAK,CAAC,MAAM,KAAK,SAAS,EAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,uFAAuF,CAAC;AACjG,CAAC;AAED,SAAS,aAAa,CACpB,QAAkB,EAClB,OAAoB,EACpB,MAAoE;IAEpE,MAAM,MAAM,GAAG;QACb,aAAa,EAAE,uBAAuB;QACtC,WAAW,EAAE,0BAA0B;QACvC,UAAU,EAAE,uBAAuB;QACnC,SAAS,EAAE,kCAAkC;KACrC,CAAC;IACX,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CAAC,WAAmB;IACxC,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,KAA0D;IAChF,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY;QAAE,OAAO,sBAAsB,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,eAAe;QAAE,OAAO,oBAAoB,CAAC;IAChG,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC;IACrD,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,mBAAmB,CAAC;IAC7D,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA0D;IAClF,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY;QAAE,OAAO,gCAAgC,CAAC;IAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QACnE,OAAO,+CAA+C,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,2EAA2E,CAAC;IACrF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;QAC9B,OAAO,yDAAyD,CAAC;IACnE,OAAO,wEAAwE,CAAC;AAClF,CAAC","sourcesContent":["import type { PixelumeClient } from '../core/PixelumeClient.js';\nimport type { PixelumeAuthState } from '../modules/auth/AuthModule.js';\nimport type { PixelumeSessionState } from '../modules/auth/SessionManager.js';\nimport type { PixelumeSavesActivity } from '../modules/saves/SavesModule.js';\nimport { WIDGET_STYLES } from './styles.js';\n\nexport type PixelumeWidgetPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\nexport interface PixelumeWidgetOptions {\n /** Corner used by the widget. Defaults to `bottom-right`. */\n readonly position?: PixelumeWidgetPosition;\n /** Distance from the selected edges in CSS pixels. Defaults to `16`. */\n readonly offset?: number;\n /** Mount target. Defaults to `document.body`; custom targets should establish a containing block. */\n readonly container?: HTMLElement;\n /** Visual treatment. `pixel` is currently the only supported theme. */\n readonly theme?: 'pixel';\n /** Stacking order for the host. Defaults to `2147483000`. */\n readonly zIndex?: number;\n}\n\nexport interface PixelumeWidgetController {\n /** The Shadow DOM host created by the widget. */\n readonly element: HTMLElement;\n /** Hides the widget and closes its panel without changing authentication state. */\n hide(): void;\n /** Shows a previously hidden widget. */\n show(): void;\n /** Removes DOM/listeners/subscriptions. Safe to call more than once. */\n destroy(): void;\n}\n\nconst DEFAULT_POSITION: PixelumeWidgetPosition = 'bottom-right';\nconst DEFAULT_OFFSET = 16;\nconst DEFAULT_Z_INDEX = 2_147_483_000;\nconst POSITIONS: readonly PixelumeWidgetPosition[] = [\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n];\n\ninterface MountedWidget {\n readonly container: HTMLElement;\n readonly controller: PixelumeWidgetController;\n}\n\nconst widgetsByClient = new WeakMap<object, MountedWidget>();\nconst widgetsByContainer = new WeakMap<HTMLElement, object>();\nlet nextWidgetId = 1;\n\n/**\n * Mounts the optional Pixelume account widget. Importing this module alone has no DOM side effects.\n * Repeating the call with the same client and container returns the existing controller.\n */\nexport function mountPixelumeWidget(\n pixelume: PixelumeClient,\n options: PixelumeWidgetOptions = {},\n): PixelumeWidgetController {\n assertClient(pixelume);\n const document = resolveDocument(options.container);\n const container = options.container ?? document.body;\n\n const mounted = widgetsByClient.get(pixelume);\n if (mounted) {\n if (mounted.container === container) return mounted.controller;\n throw new Error('This Pixelume client already has a widget mounted in another container');\n }\n const containerOwner = widgetsByContainer.get(container);\n if (containerOwner) {\n throw new Error('This container already has a Pixelume widget mounted');\n }\n\n const position = resolvePosition(options.position);\n const offset = resolveNumber('offset', options.offset, DEFAULT_OFFSET, 0, 256);\n const zIndex = resolveNumber('zIndex', options.zIndex, DEFAULT_Z_INDEX, 0, 2_147_483_647);\n const theme: unknown = options.theme;\n if (theme !== undefined && theme !== 'pixel') {\n throw new Error('Pixelume widget theme must be \"pixel\"');\n }\n\n const host = document.createElement('div');\n host.dataset.pixelumeWidget = '';\n host.dataset.position = position;\n host.style.setProperty('--pixelume-offset', `${offset}px`);\n host.style.setProperty('--pixelume-z-index', String(zIndex));\n if (options.container) host.dataset.contained = '';\n\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = WIDGET_STYLES;\n\n const root = document.createElement('div');\n root.className = 'root';\n\n const panelId = `pixelume-widget-panel-${nextWidgetId++}`;\n const trigger = button(document, 'trigger', 'Abrir conta Pixelume');\n trigger.type = 'button';\n trigger.setAttribute('aria-expanded', 'false');\n trigger.setAttribute('aria-controls', panelId);\n const triggerMark = document.createElement('span');\n triggerMark.className = 'mark';\n triggerMark.setAttribute('aria-hidden', 'true');\n const triggerLabel = document.createElement('span');\n triggerLabel.className = 'trigger-label';\n triggerLabel.textContent = 'Pixelume';\n const presence = document.createElement('span');\n presence.className = 'presence';\n presence.setAttribute('aria-hidden', 'true');\n trigger.append(triggerMark, triggerLabel, presence);\n\n const panel = document.createElement('section');\n panel.className = 'panel';\n panel.id = panelId;\n panel.hidden = true;\n panel.setAttribute('aria-label', 'Conta Pixelume');\n panel.setAttribute('aria-live', 'polite');\n\n const header = document.createElement('div');\n header.className = 'panel-header';\n const brand = document.createElement('span');\n brand.className = 'brand';\n const brandMark = document.createElement('span');\n brandMark.className = 'mark';\n brandMark.setAttribute('aria-hidden', 'true');\n const brandText = document.createElement('span');\n brandText.textContent = 'Pixelume';\n brand.append(brandMark, brandText);\n const close = button(document, 'close', 'Fechar painel da conta');\n close.type = 'button';\n close.textContent = '×';\n close.setAttribute('aria-hidden', 'false');\n header.append(brand, close);\n\n const content = document.createElement('div');\n content.className = 'content';\n panel.append(header, content);\n root.append(trigger, panel);\n shadow.append(style, root);\n\n let destroyed = false;\n let panelOpen = false;\n let pendingAction: 'login' | 'logout' | null = null;\n let localError: string | null = null;\n let removeDocumentKeydown: (() => void) | null = null;\n\n const onDocumentKeydown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || !panelOpen) return;\n event.preventDefault();\n event.stopPropagation();\n closePanel(true);\n };\n\n const openPanel = (): void => {\n if (destroyed || panelOpen) return;\n panelOpen = true;\n panel.hidden = false;\n trigger.setAttribute('aria-expanded', 'true');\n document.addEventListener('keydown', onDocumentKeydown, true);\n removeDocumentKeydown = () => {\n document.removeEventListener('keydown', onDocumentKeydown, true);\n };\n close.focus();\n };\n\n function closePanel(restoreFocus: boolean): void {\n if (!panelOpen) return;\n panelOpen = false;\n panel.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n removeDocumentKeydown?.();\n removeDocumentKeydown = null;\n if (restoreFocus && !host.hidden) trigger.focus();\n }\n\n const togglePanel = (): void => {\n if (panelOpen) closePanel(true);\n else openPanel();\n };\n\n const runLogin = async (): Promise<void> => {\n if (destroyed || pendingAction) return;\n pendingAction = 'login';\n localError = null;\n render(pixelume.auth.state);\n try {\n await pixelume.auth.login();\n } catch {\n localError =\n 'Não foi possível abrir a entrada agora. Você pode continuar jogando e tentar novamente.';\n } finally {\n pendingAction = null;\n render(pixelume.auth.state);\n }\n };\n\n const runLogout = async (): Promise<void> => {\n if (destroyed || pendingAction) return;\n pendingAction = 'logout';\n localError = null;\n render(pixelume.auth.state);\n try {\n await pixelume.auth.logout();\n } catch {\n localError =\n 'Você saiu deste jogo, mas não foi possível confirmar a revogação no servidor. Tente novamente mais tarde.';\n } finally {\n pendingAction = null;\n render(pixelume.auth.state);\n }\n };\n\n const render = (state: PixelumeAuthState): void => {\n if (destroyed) return;\n content.replaceChildren();\n content.removeAttribute('aria-busy');\n const authenticated = state.status === 'authenticated';\n trigger.toggleAttribute('data-authenticated', authenticated);\n trigger.setAttribute(\n 'aria-label',\n authenticated\n ? `Abrir conta Pixelume. Conectado como ${state.player.displayName}`\n : 'Abrir conta Pixelume',\n );\n\n if (\n state.status === 'uninitialized' ||\n state.status === 'redirecting' ||\n state.status === 'exchanging'\n ) {\n renderLoading(\n document,\n content,\n state.status !== 'uninitialized' && state.restoring === true ? 'restoring' : state.status,\n );\n return;\n }\n\n if (state.status === 'authenticated') {\n const session = sessionState();\n const identity = document.createElement('div');\n identity.className = 'identity';\n const avatar = document.createElement('span');\n avatar.className = 'avatar';\n avatar.setAttribute('aria-hidden', 'true');\n avatar.textContent = playerInitial(state.player.displayName);\n const copy = document.createElement('div');\n copy.className = 'state-copy';\n copy.append(\n textElement(document, 'p', 'title', `Olá, ${state.player.displayName}!`),\n textElement(document, 'p', 'message', 'Sua conta está conectada a este jogo.'),\n );\n identity.append(avatar, copy);\n content.append(identity);\n if (session?.error) {\n content.append(\n notice(\n document,\n 'Não conseguimos falar com a Pixelume agora. Sua conta continua conectada e tentaremos de novo automaticamente.',\n ),\n );\n }\n const sync = syncMessage(savesActivity());\n if (sync) content.append(status(document, sync));\n if (localError) content.append(notice(document, localError));\n const logout = button(document, 'action secondary', 'Sair da conta Pixelume neste jogo');\n logout.type = 'button';\n logout.textContent = pendingAction === 'logout' ? 'Saindo…' : 'Sair deste jogo';\n logout.disabled = pendingAction !== null;\n logout.addEventListener('click', () => void runLogout());\n content.append(logout);\n return;\n }\n\n const copy = document.createElement('div');\n copy.className = 'state-copy';\n copy.append(\n textElement(document, 'p', 'title', anonymousTitle(state)),\n textElement(document, 'p', 'message', anonymousMessage(state)),\n );\n content.append(copy);\n const failure = localError ?? anonymousNotice(state);\n if (failure) content.append(notice(document, failure));\n const login = button(document, 'action', 'Entrar com Pixelume');\n login.type = 'button';\n login.textContent = pendingAction === 'login' ? 'Abrindo Pixelume…' : 'Entrar com Pixelume';\n login.disabled = pendingAction !== null;\n login.addEventListener('click', () => void runLogin());\n content.append(login);\n };\n\n const unsubscribe = pixelume.auth.subscribe((state) => {\n localError = null;\n render(state);\n });\n // Optional sources (absent in custom/mocked clients): token renewal and explicit Saves calls.\n const auth = pixelume.auth as Partial<typeof pixelume.auth>;\n const saves = (pixelume as Partial<Pick<PixelumeClient, 'saves'>>).saves;\n const sessionState = (): PixelumeSessionState | null => auth.session ?? null;\n const savesActivity = (): PixelumeSavesActivity | null => saves?.activity ?? null;\n const rerender = (): void => {\n render(pixelume.auth.state);\n };\n const unsubscribeSession =\n typeof auth.subscribeSession === 'function' ? auth.subscribeSession(rerender) : null;\n const unsubscribeSaves =\n typeof saves?.subscribe === 'function' ? saves.subscribe(rerender) : null;\n\n const stopInputPropagation = (event: Event): void => {\n event.stopPropagation();\n };\n const closeFromButton = (): void => {\n closePanel(true);\n };\n const isolatedEvents = [\n 'click',\n 'pointerdown',\n 'pointerup',\n 'touchstart',\n 'touchend',\n 'keydown',\n 'keyup',\n ] as const;\n for (const eventName of isolatedEvents) host.addEventListener(eventName, stopInputPropagation);\n trigger.addEventListener('click', togglePanel);\n close.addEventListener('click', closeFromButton);\n\n const controller: PixelumeWidgetController = Object.freeze({\n element: host,\n hide(): void {\n if (destroyed) return;\n closePanel(false);\n host.hidden = true;\n },\n show(): void {\n if (destroyed) return;\n host.hidden = false;\n },\n destroy(): void {\n if (destroyed) return;\n destroyed = true;\n closePanel(false);\n removeDocumentKeydown?.();\n removeDocumentKeydown = null;\n unsubscribe();\n unsubscribeSession?.();\n unsubscribeSaves?.();\n trigger.removeEventListener('click', togglePanel);\n close.removeEventListener('click', closeFromButton);\n for (const eventName of isolatedEvents)\n host.removeEventListener(eventName, stopInputPropagation);\n host.remove();\n widgetsByClient.delete(pixelume);\n widgetsByContainer.delete(container);\n },\n });\n\n render(pixelume.auth.state);\n container.append(host);\n widgetsByClient.set(pixelume, { container, controller });\n widgetsByContainer.set(container, pixelume);\n return controller;\n}\n\nfunction assertClient(value: unknown): asserts value is PixelumeClient {\n if (typeof value !== 'object' || value === null)\n throw new TypeError('Pixelume widget requires a client');\n const auth = Reflect.get(value, 'auth') as unknown;\n if (typeof auth !== 'object' || auth === null)\n throw new TypeError('Pixelume widget requires client.auth');\n for (const method of ['login', 'logout', 'subscribe'] as const) {\n if (typeof Reflect.get(auth, method) !== 'function') {\n throw new TypeError(`Pixelume widget requires client.auth.${method}()`);\n }\n }\n}\n\nfunction resolveDocument(container: HTMLElement | undefined): Document {\n if (container) {\n if (typeof container.attachShadow !== 'function') {\n throw new TypeError('Pixelume widget container must be an HTMLElement');\n }\n return container.ownerDocument;\n }\n const candidate = Reflect.get(globalThis, 'document') as unknown;\n if (typeof candidate !== 'object' || candidate === null || !('createElement' in candidate)) {\n throw new Error('Pixelume widget can only be mounted in a browser document');\n }\n return candidate as Document;\n}\n\nfunction resolvePosition(value: PixelumeWidgetPosition | undefined): PixelumeWidgetPosition {\n if (value === undefined) return DEFAULT_POSITION;\n if (!POSITIONS.includes(value)) {\n throw new Error(`Pixelume widget position must be one of: ${POSITIONS.join(', ')}`);\n }\n return value;\n}\n\nfunction resolveNumber(\n name: string,\n value: number | undefined,\n fallback: number,\n minimum: number,\n maximum: number,\n): number {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || value < minimum || value > maximum) {\n throw new Error(`Pixelume widget ${name} must be an integer from ${minimum} to ${maximum}`);\n }\n return value;\n}\n\nfunction button(document: Document, className: string, label: string): HTMLButtonElement {\n const element = document.createElement('button');\n element.className = className;\n element.setAttribute('aria-label', label);\n return element;\n}\n\nfunction textElement(\n document: Document,\n tag: 'p',\n className: string,\n text: string,\n): HTMLParagraphElement {\n const element = document.createElement(tag);\n element.className = className;\n element.textContent = text;\n return element;\n}\n\nfunction notice(document: Document, text: string): HTMLParagraphElement {\n const element = textElement(document, 'p', 'notice', text);\n element.setAttribute('role', 'alert');\n return element;\n}\n\nfunction status(document: Document, text: string): HTMLParagraphElement {\n const element = textElement(document, 'p', 'message sync', text);\n element.setAttribute('role', 'status');\n return element;\n}\n\n/** Cloud status only after the game explicitly saved or deleted; nothing is simulated. */\nfunction syncMessage(activity: PixelumeSavesActivity | null): string | null {\n if (activity === null) return null;\n if (activity.pendingWrites > 0) return 'Salvando na nuvem…';\n const last = activity.last;\n if (last === null || (last.operation !== 'save' && last.operation !== 'delete')) return null;\n if (last.outcome === 'conflict') {\n return 'Há um progresso mais recente na nuvem. O jogo vai decidir o que manter.';\n }\n if (last.outcome === 'error') return 'Não foi possível salvar na nuvem agora.';\n const time = new Date(last.at).toLocaleTimeString('pt-BR', {\n hour: '2-digit',\n minute: '2-digit',\n });\n return last.operation === 'save'\n ? `Progresso salvo na nuvem às ${time}.`\n : `Save removido da nuvem às ${time}.`;\n}\n\nfunction anonymousNotice(\n state: Extract<PixelumeAuthState, { status: 'anonymous' }>,\n): string | null {\n const error = state.error;\n if (error === null) return null;\n if (error.kind === 'auth' && Reflect.get(error, 'reason') === 'game_unavailable') {\n return 'O acesso deste jogo à Pixelume está indisponível no momento. Você pode continuar jogando.';\n }\n // Ended sessions and lack of connectivity are already explained by the title and message.\n if (\n state.reason === 'expired' ||\n state.reason === 'session_ended' ||\n state.reason === 'offline'\n ) {\n return null;\n }\n return 'Não foi possível verificar sua conta. Você pode continuar jogando e tentar novamente.';\n}\n\nfunction renderLoading(\n document: Document,\n content: HTMLElement,\n status: 'uninitialized' | 'redirecting' | 'exchanging' | 'restoring',\n): void {\n const labels = {\n uninitialized: 'Preparando sua conta…',\n redirecting: 'Abrindo o Pixelume Auth…',\n exchanging: 'Concluindo a entrada…',\n restoring: 'Conectando à sua conta Pixelume…',\n } as const;\n content.setAttribute('aria-busy', 'true');\n const visual = document.createElement('div');\n visual.className = 'loading';\n visual.setAttribute('aria-hidden', 'true');\n for (let index = 0; index < 2; index += 1) {\n const line = document.createElement('span');\n line.className = 'loading-line';\n visual.append(line);\n }\n const label = textElement(document, 'p', 'sr-only', labels[status]);\n content.append(visual, label);\n}\n\nfunction playerInitial(displayName: string): string {\n return Array.from(displayName.trim())[0]?.toLocaleUpperCase('pt-BR') ?? 'P';\n}\n\nfunction anonymousTitle(state: Extract<PixelumeAuthState, { status: 'anonymous' }>): string {\n if (state.reason === 'logged_out') return 'Você saiu deste jogo';\n if (state.reason === 'expired' || state.reason === 'session_ended') return 'Sua sessão expirou';\n if (state.reason === 'offline') return 'Sem conexão';\n if (state.reason === 'cancelled') return 'Entrada cancelada';\n return 'Sua conta Pixelume';\n}\n\nfunction anonymousMessage(state: Extract<PixelumeAuthState, { status: 'anonymous' }>): string {\n if (state.reason === 'logged_out') return 'Entre novamente quando quiser.';\n if (state.reason === 'expired' || state.reason === 'session_ended') {\n return 'Entre novamente para continuar com sua conta.';\n }\n if (state.reason === 'offline') {\n return 'Você pode continuar jogando. Entre com sua conta quando a conexão voltar.';\n }\n if (state.reason === 'cancelled')\n return 'Você pode continuar como visitante ou tentar novamente.';\n return 'Entre pelo portal seguro da Pixelume. Sua senha nunca passa pelo jogo.';\n}\n"]}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** Version of the SDK package. Kept in sync with `package.json` (checked by tests and by the release workflow). */
2
- export declare const SDK_VERSION = "0.4.0";
2
+ export declare const SDK_VERSION = "0.6.0";
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Version of the SDK package. Kept in sync with `package.json` (checked by tests and by the release workflow). */
2
- export const SDK_VERSION = '0.4.0';
2
+ export const SDK_VERSION = '0.6.0';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mHAAmH;AACnH,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC","sourcesContent":["/** Version of the SDK package. Kept in sync with `package.json` (checked by tests and by the release workflow). */\nexport const SDK_VERSION = '0.4.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mHAAmH;AACnH,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC","sourcesContent":["/** Version of the SDK package. Kept in sync with `package.json` (checked by tests and by the release workflow). */\nexport const SDK_VERSION = '0.6.0';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixelume/sdk",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "SDK TypeScript da Pixelume para jogos web: core headless, SSO com PKCE e widget oficial opcional.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "Erickson Nascimento",
@@ -71,5 +71,8 @@
71
71
  "typescript": "6.0.3",
72
72
  "typescript-eslint": "8.71.2",
73
73
  "vitest": "5.0.4"
74
+ },
75
+ "dependencies": {
76
+ "posthog-js": "1.435.8"
74
77
  }
75
78
  }