@viceme-ai/sdk 0.6.1 → 0.6.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-DEg6YouY.js","sources":["../../src/core/config.ts","../../src/core/lifecycle.ts","../../src/session/session.ts","../../src/core/presentation.ts","../../src/core/capabilities.ts","../../src/core/client.ts"],"sourcesContent":["/**\n * Public client configuration.\n *\n * Production `createViceMe()` accepts exactly `workKey`, `region`, and\n * `signal`. Anything else (transport, clock, request ids, base URLs) is a\n * testing-only concern and lives in `@viceme-ai/sdk/testing`, so Agents can\n * never bake temporary or internal endpoints into user projects.\n */\n\nimport { configInvalid } from './errors.ts';\nimport { BUILD_API_BASE_URLS } from './build-endpoints.ts';\nexport type ViceMeRegion = 'cn' | 'global';\n\nexport interface ViceMeConfig {\n /** Public opaque test or live Work key. It is not a secret. */\n workKey: string;\n /** Routes public API and CDN traffic. */\n region: ViceMeRegion;\n /** Optional abort signal owned by the host page. */\n signal?: AbortSignal;\n}\n\nconst REGIONS: ReadonlySet<string> = new Set(['cn', 'global']);\n\n/**\n * Public API origins per region. These are the only production endpoints the\n * SDK may contact; B1 confirms final hostnames and any change happens here in\n * one place (never via a public `apiBaseUrl` option).\n */\nexport const PUBLIC_API_BASE_URLS: Readonly<Record<ViceMeRegion, string>> = {\n cn: BUILD_API_BASE_URLS.cn,\n global: BUILD_API_BASE_URLS.global,\n};\n\nexport function resolveApiBaseUrl(region: ViceMeRegion): string {\n return PUBLIC_API_BASE_URLS[region];\n}\n\nexport function isValidWorkKey(value: unknown): value is string {\n return typeof value === 'string' && /^wrk_(?:test|live)_[A-Za-z0-9_-]{4,119}$/.test(value);\n}\n\nexport function isValidRegion(value: unknown): value is ViceMeRegion {\n return typeof value === 'string' && REGIONS.has(value);\n}\n\n/**\n * Validate unknown input as a public client config. Throws a CONFIG_INVALID\n * ViceMeError that never echoes values back beyond the offending field name.\n */\nexport function validatePublicConfig(input: unknown): ViceMeConfig {\n if (typeof input !== 'object' || input === null) {\n throw configInvalid('createViceMe expects a configuration object.');\n }\n const raw = input as Record<string, unknown>;\n\n const known = new Set(['workKey', 'region', 'signal']);\n for (const key of Object.keys(raw)) {\n if (!known.has(key)) {\n throw configInvalid(`Unknown configuration field \"${key}\".`);\n }\n }\n if (!isValidWorkKey(raw.workKey)) {\n throw configInvalid(\n 'Configuration field \"workKey\" must start with \"wrk_test_\" or \"wrk_live_\".',\n );\n }\n if (!isValidRegion(raw.region)) {\n throw configInvalid('Configuration field \"region\" must be \"cn\" or \"global\".');\n }\n if (raw.signal !== undefined && !(raw.signal instanceof AbortSignal)) {\n throw configInvalid('Configuration field \"signal\" must be an AbortSignal.');\n }\n return {\n workKey: raw.workKey,\n region: raw.region,\n signal: raw.signal,\n };\n}\n","/**\n * Client lifecycle state machine.\n *\n * ```text\n * CREATED -> READY -> DESTROYED\n * READY -> DEGRADED (single capability unavailable; host page keeps working)\n * ```\n *\n * State is exposed read-only; consumers can never assign it directly.\n */\n\nimport { ViceMeError, clientDestroyed } from './errors.ts';\n\nexport type ViceMeClientState = 'CREATED' | 'READY' | 'DEGRADED' | 'DESTROYED';\n\nconst ALLOWED_TRANSITIONS: Readonly<Record<ViceMeClientState, readonly ViceMeClientState[]>> = {\n CREATED: ['READY', 'DESTROYED'],\n READY: ['DEGRADED', 'DESTROYED'],\n DEGRADED: ['DESTROYED'],\n DESTROYED: [],\n};\n\nexport type LifecycleListener = (state: ViceMeClientState) => void;\n\nexport class Lifecycle {\n #state: ViceMeClientState = 'CREATED';\n #listeners = new Set<LifecycleListener>();\n\n get state(): ViceMeClientState {\n return this.#state;\n }\n\n get destroyed(): boolean {\n return this.#state === 'DESTROYED';\n }\n\n transition(next: ViceMeClientState): void {\n if (next === this.#state) return;\n if (!ALLOWED_TRANSITIONS[this.#state]!.includes(next)) {\n throw new ViceMeError({\n code: 'INTERNAL_ERROR',\n message: `Illegal lifecycle transition ${this.#state} -> ${next}.`,\n retryable: false,\n });\n }\n this.#state = next;\n for (const listener of this.#listeners) listener(next);\n }\n\n /** Any operation on a destroyed client must fail closed with this guard. */\n assertAlive(): void {\n if (this.destroyed) throw clientDestroyed();\n }\n\n subscribe(listener: LifecycleListener): () => void {\n this.#listeners.add(listener);\n return () => {\n this.#listeners.delete(listener);\n };\n }\n\n clearListeners(): void {\n this.#listeners.clear();\n }\n}\n","/**\n * Public visitor session.\n *\n * ```text\n * SDK + workKey + Origin -> POST /v1/public/work-sdk/sessions\n * -> short-lived capability token -> public capability calls\n * ```\n *\n * The token lives in memory only (never localStorage/cookies), is bound to the\n * Work, Origin, capability set, and expiry by the server, and is dropped on\n * `destroy()`. `workKey` locates the Work — it is never an authorization\n * credential.\n */\n\nimport { clientDestroyed, ViceMeError } from '../core/errors.ts';\nimport type { Transport, TransportRequest, TransportResponse } from '../transport/transport.ts';\nexport interface CreateWorkSessionRequestDto {\n workKey: string;\n}\n\nexport interface WorkDescriptor {\n key: string;\n /** Capability names enabled for this work. */\n capabilities: string[];\n}\n\nexport interface WorkSessionSnapshot {\n work: WorkDescriptor;\n /** Opaque short-lived capability token; memory-only. */\n token?: string;\n /** Epoch milliseconds when the token expires, when provided by the server. */\n expiresAt?: number;\n user?: WorkUser;\n userToken?: string;\n}\n\nexport interface WorkUser {\n subject: string;\n nickname: string | null;\n avatarUrl: string | null;\n}\n\nexport interface SessionManagerOptions {\n workKey: string;\n transport: Transport;\n signal?: AbortSignal;\n timeoutMs?: number;\n /** Injectable clock for tests. */\n now?: () => number;\n}\n\nfunction parseSessionResponse(body: unknown, workKey: string): WorkSessionSnapshot {\n if (typeof body !== 'object' || body === null) {\n throw malformedSessionResponse();\n }\n const raw = body as Record<string, unknown>;\n if (\n typeof raw.workKey !== 'string' ||\n !Array.isArray(raw.capabilities) ||\n !raw.capabilities.every((c) => typeof c === 'string')\n ) {\n throw malformedSessionResponse();\n }\n if (raw.workKey !== workKey) {\n throw new ViceMeError({\n code: 'WORK_NOT_FOUND',\n message: 'Work-session response did not match the requested work key.',\n retryable: false,\n });\n }\n const snapshot: WorkSessionSnapshot = {\n work: {\n key: raw.workKey,\n capabilities: raw.capabilities as string[],\n },\n };\n // Unknown extra fields are allowed and ignored (forward compatibility).\n if (typeof raw.token === 'string') snapshot.token = raw.token;\n if (typeof raw.expiresAt === 'string') {\n const expiresAt = new Date(raw.expiresAt).getTime();\n if (!Number.isNaN(expiresAt)) snapshot.expiresAt = expiresAt;\n }\n return snapshot;\n}\n\nfunction malformedSessionResponse(): ViceMeError {\n return new ViceMeError({\n code: 'INTERNAL_ERROR',\n message: 'Malformed work-session response.',\n retryable: true,\n });\n}\n\nfunction sessionInvalidated(): ViceMeError {\n return new ViceMeError({\n code: 'SESSION_EXPIRED',\n message: 'The work session was invalidated before it completed.',\n retryable: true,\n });\n}\n\nexport class SessionManager {\n readonly #options: SessionManagerOptions;\n readonly #now: () => number;\n #snapshot: WorkSessionSnapshot | undefined;\n #pending: Promise<WorkSessionSnapshot> | undefined;\n #generation = 0;\n #destroyed = false;\n\n constructor(options: SessionManagerOptions) {\n this.#options = options;\n this.#now = options.now ?? (() => Date.now());\n }\n\n get snapshot(): WorkSessionSnapshot | undefined {\n return this.#snapshot;\n }\n\n /** True when the cached snapshot's server-provided expiry has passed. */\n #isExpired(): boolean {\n const expiresAt = this.#snapshot?.expiresAt;\n return expiresAt !== undefined && expiresAt <= this.#now();\n }\n\n /**\n * Establish (or return the established) public session.\n *\n * A cached snapshot is reused only while it is unexpired; an expired\n * snapshot is dropped and re-authenticated. Concurrent callers share one\n * in-flight request (single flight).\n */\n establish(): Promise<WorkSessionSnapshot> {\n if (this.#destroyed) return Promise.reject(clientDestroyed());\n if (this.#snapshot) {\n if (!this.#isExpired()) return Promise.resolve(this.#snapshot);\n this.#snapshot = undefined;\n }\n if (this.#pending) return this.#pending;\n const generation = this.#generation;\n const pending = this.#options.transport\n .request({\n method: 'POST',\n path: '/v1/public/work-sdk/sessions',\n body: { workKey: this.#options.workKey } satisfies CreateWorkSessionRequestDto,\n signal: this.#options.signal,\n timeoutMs: this.#options.timeoutMs,\n })\n .then((response) => {\n this.#assertCurrent(generation);\n const snapshot = parseSessionResponse(response.body, this.#options.workKey);\n this.#assertCurrent(generation);\n this.#snapshot = snapshot;\n return snapshot;\n })\n .finally(() => {\n if (this.#pending === pending) this.#pending = undefined;\n });\n this.#pending = pending;\n return pending;\n }\n\n async request(\n request: Omit<TransportRequest, 'authorization' | 'userAuthorization' | 'signal'>,\n ): Promise<TransportResponse> {\n const snapshot = await this.establish();\n if (!snapshot.token) throw malformedSessionResponse();\n try {\n return await this.#requestWithSnapshot(request, snapshot);\n } catch (error) {\n if (this.#destroyed) throw clientDestroyed();\n if (!(error instanceof ViceMeError) || error.code !== 'SESSION_EXPIRED') throw error;\n if (this.#snapshot === snapshot) this.invalidate();\n const refreshed = await this.establish();\n if (!refreshed.token) throw malformedSessionResponse();\n return this.#requestWithSnapshot(request, refreshed);\n }\n }\n\n authenticate(input: { userToken: string; user: WorkUser }): void {\n this.#assertAlive();\n if (!this.#snapshot) throw malformedSessionResponse();\n this.#snapshot = {\n ...this.#snapshot,\n userToken: input.userToken,\n user: input.user,\n };\n }\n\n async signOut(): Promise<void> {\n this.#assertAlive();\n this.invalidate();\n await this.establish();\n }\n\n /** Drop the token; next `establish()` re-authenticates. */\n invalidate(): void {\n this.#generation += 1;\n this.#snapshot = undefined;\n this.#pending = undefined;\n }\n\n /** Hard cleanup: forget the token and pending work. */\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n this.#generation += 1;\n this.#snapshot = undefined;\n this.#pending = undefined;\n }\n\n #assertAlive(): void {\n if (this.#destroyed) throw clientDestroyed();\n }\n\n #assertCurrent(generation: number): void {\n this.#assertAlive();\n if (generation !== this.#generation) throw sessionInvalidated();\n }\n\n async #requestWithSnapshot(\n request: Omit<TransportRequest, 'authorization' | 'userAuthorization' | 'signal'>,\n snapshot: WorkSessionSnapshot,\n ): Promise<TransportResponse> {\n this.#assertAlive();\n try {\n const response = await this.#options.transport.request({\n ...request,\n authorization: snapshot.token,\n userAuthorization: snapshot.userToken,\n signal: this.#options.signal,\n });\n this.#assertAlive();\n return response;\n } catch (error) {\n if (this.#destroyed) throw clientDestroyed();\n throw error;\n }\n }\n}\n","import type { FollowTarget } from './capabilities.ts';\nimport { isViceMeError } from './errors.ts';\n\nexport type AccessInteractionAction = 'SIGN_IN' | 'FOLLOW' | 'CHECKOUT';\n\nexport interface AccessInteraction {\n featureKey: string;\n reason: string;\n action: AccessInteractionAction;\n followTarget?: FollowTarget;\n /** Client-owned lifecycle signal; abort closes any active hosted surface. */\n signal?: AbortSignal;\n perform(): Promise<AccessActionResult>;\n}\n\nexport interface AccessCompletedAction {\n type: 'completed';\n}\n\nexport interface AccessFrameAction {\n type: 'frame';\n url: string;\n completion: Promise<void>;\n cancel(): void;\n}\n\nexport interface AccessExternalAction {\n type: 'external';\n completion: Promise<void>;\n cancel(): void;\n}\n\nexport type AccessActionResult = AccessCompletedAction | AccessFrameAction | AccessExternalAction;\n\nexport type AccessPresentationResult = 'acted' | 'dismissed';\n\n/** Internal interaction seam used by the ViceMe layer and deterministic tests. */\nexport type AccessPresenter = (interaction: AccessInteraction) => Promise<AccessPresentationResult>;\n\nconst ELEMENT_NAME = 'viceme-access-layer';\nconst PROFILE_DESCRIPTION_LIMIT = 50;\n\ninterface AccessLayerElement extends HTMLElement {\n interaction: AccessInteraction;\n}\n\nfunction actionCopy(action: AccessInteractionAction): {\n description: string;\n label: string;\n} {\n switch (action) {\n case 'SIGN_IN':\n return {\n description: '',\n label: '授权',\n };\n case 'FOLLOW':\n return {\n description: '',\n label: '关注',\n };\n case 'CHECKOUT':\n return {\n description: '',\n label: '打开支付',\n };\n }\n}\n\nfunction actionErrorCopy(error: unknown): string {\n if (!isViceMeError(error)) return '操作未完成,请重试。';\n switch (error.code) {\n case 'CONFIG_INVALID':\n return '微信授权配置无效,请稍后重试。';\n case 'AUTH_CANCELLED':\n return '微信授权已取消,请重试。';\n case 'SESSION_EXPIRED':\n return '授权会话已过期,请重试。';\n case 'NETWORK_TIMEOUT':\n return '网络连接超时,请重试。';\n default:\n return error.requestId\n ? `操作未完成,请重试。请求 ID:${error.requestId}`\n : '操作未完成,请重试。';\n }\n}\n\nfunction ensureAccessLayerElement(): void {\n if (customElements.get(ELEMENT_NAME)) return;\n\n class ViceMeAccessLayerElement extends HTMLElement implements AccessLayerElement {\n interaction!: AccessInteraction;\n\n connectedCallback(): void {\n const copy = actionCopy(this.interaction.action);\n const shadow = this.attachShadow({ mode: 'open' });\n shadow.innerHTML = `\n <style>\n :host {\n position: fixed;\n inset: 0;\n z-index: 2147483000;\n display: grid;\n align-items: end;\n color: #18181b;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif;\n font-size: 16px;\n line-height: 1.5;\n }\n [data-viceme='backdrop'] {\n position: absolute;\n inset: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n }\n [data-viceme='panel'] {\n position: relative;\n box-sizing: border-box;\n display: flex;\n width: 100%;\n max-height: min(92dvh, 46rem);\n flex-direction: column;\n overflow: auto;\n border-radius: 1.25rem 1.25rem 0 0;\n background: #ffffff;\n color: #18181b;\n padding: 3.75rem 1.25rem calc(1.25rem + env(safe-area-inset-bottom));\n box-shadow: 0 -1rem 3rem rgb(0 0 0 / 18%);\n }\n [data-viceme='content'] { display: flex; min-height: 0; flex-direction: column; }\n [data-viceme='close'] {\n position: absolute;\n top: 0.75rem;\n left: 0.75rem;\n width: 2.75rem;\n height: 2.75rem;\n border: 0;\n border-radius: 999px;\n padding: 0;\n background: transparent;\n color: #52525b;\n font-size: 2rem;\n font-weight: 400;\n line-height: 1;\n }\n [data-viceme='description'] { margin: 0.75rem 0 1.25rem; color: #71717a; line-height: 1.6; }\n [data-viceme='profile'] {\n display: none;\n margin: 0;\n border: 1px solid #e4e4e7;\n border-radius: 1rem;\n padding: 1.5rem;\n background: #ffffff;\n box-shadow: 0 0.75rem 2rem rgb(0 0 0 / 6%);\n text-align: center;\n }\n [data-viceme='profile'][data-visible='true'] { display: block; }\n [data-viceme='avatar'] {\n display: block;\n width: 5.5rem;\n height: 5.5rem;\n margin: 0 auto 1rem;\n border-radius: 999px;\n object-fit: cover;\n background: #f4f4f5;\n }\n [data-viceme='avatar-fallback'] {\n display: grid;\n width: 5.5rem;\n height: 5.5rem;\n margin: 0 auto 1rem;\n place-items: center;\n border-radius: 999px;\n background: #f4f4f5;\n color: #18181b;\n font-size: 2rem;\n font-weight: 700;\n }\n [data-viceme='avatar'][hidden], [data-viceme='avatar-fallback'][hidden] { display: none; }\n [data-viceme='profile-summary'] {\n display: flex;\n min-width: 0;\n align-items: baseline;\n justify-content: center;\n gap: 0.5rem;\n }\n [data-viceme='profile-name'] { margin: 0; font-size: 1.375rem; font-weight: 700; }\n [data-viceme='profile-separator'], [data-viceme='profile-stats'] {\n color: #71717a;\n }\n [data-viceme='profile-description'] {\n margin: 0.25rem 0 0;\n overflow-wrap: anywhere;\n color: #71717a;\n }\n [data-viceme='profile-description']:empty { display: none; }\n [data-viceme='profile-stats'] {\n margin: 0;\n font-size: 0.875rem;\n }\n [data-viceme='profile-header'] { min-width: 0; }\n [data-viceme='panel'][data-action='SIGN_IN'] [data-viceme='description'] { display: none; }\n [data-viceme='panel'][data-action='SIGN_IN'] [data-viceme='profile'][data-visible='true'] {\n display: block;\n border: 0;\n padding: 0;\n background: transparent;\n box-shadow: none;\n text-align: center;\n }\n [data-viceme='panel'][data-action='SIGN_IN'] [data-viceme='profile-name'] {\n font-size: 1.125rem;\n }\n [data-viceme='panel'][data-action='SIGN_IN'] [data-viceme='profile-description'] {\n margin-top: 0.75rem;\n line-height: 1.625;\n }\n [data-viceme='panel'][data-action='SIGN_IN'] [data-viceme='action'] {\n width: 100%;\n }\n [data-viceme='actions'] {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n margin-top: 1.25rem;\n }\n button {\n box-sizing: border-box;\n display: inline-flex;\n height: 3.25rem;\n align-items: center;\n justify-content: center;\n border-radius: 0.75rem;\n padding: 0.625rem 1rem;\n font: 600 1rem/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif;\n cursor: pointer;\n }\n button:focus-visible, iframe:focus-visible { outline: 2px solid #18181b; outline-offset: 2px; }\n [data-viceme='action'] {\n width: min(11rem, 48%);\n border: 1px solid #18181b;\n background: #18181b;\n color: #ffffff;\n }\n [data-viceme='action']:hover { background: #3f3f46; border-color: #3f3f46; }\n [data-viceme='actions'][data-single='true'] [data-viceme='action'] { width: 100%; }\n button:disabled { cursor: wait; opacity: 0.5; }\n button[hidden] { display: none; }\n [data-viceme='error'] { margin: 0.75rem 0 0; color: #b91c1c; font-size: 0.875rem; }\n [data-viceme='error']:empty { display: none; }\n [data-viceme='frame'] {\n display: none;\n width: 100%;\n min-height: 0;\n flex: 1 1 auto;\n border: 0;\n border-radius: 0.75rem;\n background: #ffffff;\n }\n [data-viceme='panel'][data-frame='true'] {\n height: min(92dvh, 46rem);\n max-height: 92dvh;\n overflow: hidden;\n }\n [data-viceme='panel'][data-frame='true'] [data-viceme='content'] { display: none; }\n [data-viceme='panel'][data-frame='true'] [data-viceme='frame'] { display: block; }\n @media (min-width: 48rem) {\n :host { place-items: center; padding: 1.5rem; }\n [data-viceme='panel'] {\n width: min(24rem, 100%);\n border-radius: 1.25rem;\n padding: 3.75rem 1.25rem 1.25rem;\n box-shadow: 0 1.5rem 4rem rgb(0 0 0 / 24%);\n }\n [data-viceme='panel'][data-frame='true'] { width: min(30rem, 100%); }\n [data-viceme='panel'][data-action='SIGN_IN'] { width: min(30rem, 100%); }\n [data-viceme='panel'][data-action='CHECKOUT'][data-frame='true'] {\n width: min(42rem, 100%);\n }\n }\n @media (prefers-reduced-motion: no-preference) {\n [data-viceme='panel'] { animation: viceme-enter 160ms ease-out; }\n @keyframes viceme-enter { from { opacity: 0; transform: translateY(1rem); } }\n }\n </style>\n <button data-viceme=\"backdrop\" type=\"button\" tabindex=\"-1\" aria-label=\"关闭\"></button>\n <section data-viceme=\"panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"ViceMe 授权\">\n <button data-viceme=\"close\" type=\"button\" aria-label=\"关闭\">×</button>\n <div data-viceme=\"content\">\n <p data-viceme=\"description\"></p>\n <section data-viceme=\"profile\" aria-label=\"创作者\">\n <div data-viceme=\"profile-header\">\n <img data-viceme=\"avatar\" hidden />\n <span data-viceme=\"avatar-fallback\" aria-hidden=\"true\"></span>\n <div data-viceme=\"profile-summary\">\n <p data-viceme=\"profile-name\"></p>\n <span data-viceme=\"profile-separator\" aria-hidden=\"true\">·</span>\n <p data-viceme=\"profile-stats\"></p>\n </div>\n </div>\n <p data-viceme=\"profile-description\"></p>\n </section>\n <p data-viceme=\"error\" role=\"alert\" aria-live=\"polite\"></p>\n <div data-viceme=\"actions\">\n <button data-viceme=\"action\" type=\"button\"></button>\n </div>\n </div>\n <iframe data-viceme=\"frame\" title=\"\" referrerpolicy=\"no-referrer\" allow=\"payment\"></iframe>\n </section>\n `;\n const panel = shadow.querySelector<HTMLElement>(\"[data-viceme='panel']\")!;\n panel.dataset.action = this.interaction.action;\n panel.dataset.frame = 'false';\n const description = shadow.querySelector<HTMLElement>(\"[data-viceme='description']\")!;\n description.textContent = copy.description;\n const action = shadow.querySelector<HTMLButtonElement>(\"[data-viceme='action']\")!;\n const mainActions = action.parentElement!;\n const closeAction = shadow.querySelector<HTMLButtonElement>(\"[data-viceme='close']\")!;\n const backdrop = shadow.querySelector<HTMLButtonElement>(\"[data-viceme='backdrop']\")!;\n const error = shadow.querySelector<HTMLElement>(\"[data-viceme='error']\")!;\n const frame = shadow.querySelector<HTMLIFrameElement>(\"[data-viceme='frame']\")!;\n const profile = shadow.querySelector<HTMLElement>(\"[data-viceme='profile']\")!;\n const avatar = shadow.querySelector<HTMLImageElement>(\"[data-viceme='avatar']\")!;\n const avatarFallback = shadow.querySelector<HTMLElement>(\"[data-viceme='avatar-fallback']\")!;\n const profileName = shadow.querySelector<HTMLElement>(\"[data-viceme='profile-name']\")!;\n const profileDescription = shadow.querySelector<HTMLElement>(\n \"[data-viceme='profile-description']\",\n )!;\n const profileStats = shadow.querySelector<HTMLElement>(\"[data-viceme='profile-stats']\")!;\n action.textContent = copy.label;\n action.hidden = false;\n mainActions.dataset.single = 'true';\n const idleActionLabel = copy.label;\n frame.title = this.interaction.action === 'SIGN_IN' ? '登录授权' : '支付';\n\n const target = this.interaction.followTarget;\n if (target) {\n panel.setAttribute(\n 'aria-label',\n this.interaction.action === 'SIGN_IN'\n ? `授权 ${target.displayName}`\n : `关注 ${target.displayName}`,\n );\n profile.dataset.visible = 'true';\n profileName.textContent = target.displayName;\n const descriptionCharacters = [...(target.description ?? '')];\n profileDescription.textContent =\n descriptionCharacters.length > PROFILE_DESCRIPTION_LIMIT\n ? `${descriptionCharacters.slice(0, PROFILE_DESCRIPTION_LIMIT).join('')}…`\n : descriptionCharacters.join('');\n if (descriptionCharacters.length > PROFILE_DESCRIPTION_LIMIT) {\n profileDescription.title = target.description!;\n }\n profileStats.textContent = `${target.workCount} 个作品`;\n avatarFallback.textContent = target.displayName.trim().slice(0, 1) || 'V';\n if (target.avatarUrl) {\n avatar.src = target.avatarUrl;\n avatar.alt = `${target.displayName}的头像`;\n avatar.hidden = false;\n avatarFallback.hidden = true;\n }\n }\n\n let activeAction: AccessFrameAction | AccessExternalAction | null = null;\n let closed = false;\n const close = (result: AccessPresentationResult) => {\n if (closed) return;\n closed = true;\n this.interaction.signal?.removeEventListener('abort', dismissLayer);\n this.dispatchEvent(new CustomEvent('viceme:access-layer-close', { detail: result }));\n };\n const dismissLayer = () => {\n activeAction?.cancel();\n close('dismissed');\n };\n this.interaction.signal?.addEventListener('abort', dismissLayer, { once: true });\n if (this.interaction.signal?.aborted) queueMicrotask(dismissLayer);\n backdrop.addEventListener('click', dismissLayer);\n closeAction.addEventListener('click', dismissLayer);\n this.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') dismissLayer();\n if (event.key === 'Tab') {\n event.preventDefault();\n if (activeAction?.type === 'frame') {\n frame.focus();\n return;\n }\n const focusable = [closeAction, ...(action.hidden ? [] : [action])];\n const available = focusable.filter((element) => !element.disabled && !element.hidden);\n if (available.length === 0) return;\n const currentIndex = available.indexOf(shadow.activeElement as HTMLButtonElement);\n const direction = event.shiftKey ? -1 : 1;\n available[(currentIndex + direction + available.length) % available.length]?.focus();\n }\n });\n const performAction = async () => {\n action.disabled = true;\n action.setAttribute('aria-busy', 'true');\n action.textContent = '正在打开…';\n error.textContent = '';\n try {\n const result = await this.interaction.perform();\n // The layer may close while an async action is still being created.\n // Cancel that late action immediately so its timers/listeners cannot\n // outlive the client-owned presentation surface.\n if (closed || this.interaction.signal?.aborted) {\n if (result.type !== 'completed') result.cancel();\n return;\n }\n if (result.type === 'frame') {\n activeAction = result;\n panel.dataset.frame = 'true';\n frame.src = result.url;\n frame.focus();\n await result.completion;\n } else if (result.type === 'external') {\n activeAction = result;\n await result.completion;\n }\n close('acted');\n } catch (caught) {\n if (closed) return;\n activeAction?.cancel();\n activeAction = null;\n panel.dataset.frame = 'false';\n frame.removeAttribute('src');\n error.textContent = actionErrorCopy(caught);\n action.hidden = false;\n action.disabled = false;\n action.removeAttribute('aria-busy');\n action.textContent = idleActionLabel;\n action.focus();\n }\n };\n action.addEventListener('click', performAction);\n queueMicrotask(() => action.focus());\n }\n }\n\n customElements.define(ELEMENT_NAME, ViceMeAccessLayerElement);\n}\n\nexport const defaultAccessPresenter: AccessPresenter = async (interaction) => {\n if (typeof document === 'undefined' || typeof customElements === 'undefined') {\n return 'dismissed';\n }\n if (interaction.signal?.aborted) return 'dismissed';\n ensureAccessLayerElement();\n const element = document.createElement(ELEMENT_NAME) as AccessLayerElement;\n element.interaction = interaction;\n const previousOverflow = document.documentElement.style.overflow;\n const previousFocus =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n document.documentElement.style.overflow = 'hidden';\n document.body.append(element);\n try {\n return await new Promise<AccessPresentationResult>((resolve) => {\n element.addEventListener(\n 'viceme:access-layer-close',\n (event) => resolve((event as CustomEvent<AccessPresentationResult>).detail),\n { once: true },\n );\n });\n } finally {\n element.remove();\n document.documentElement.style.overflow = previousOverflow;\n previousFocus?.focus();\n }\n};\n","import { clientDestroyed, ViceMeError } from './errors.ts';\nimport {\n defaultAccessPresenter,\n type AccessActionResult,\n type AccessFrameAction,\n type AccessPresenter,\n} from './presentation.ts';\nimport type { SessionManager, WorkUser } from '../session/session.ts';\n\nexport interface AuthState {\n authenticated: boolean;\n user: WorkUser | null;\n}\n\nexport interface FollowState {\n following: boolean;\n followedAt: string | null;\n target: FollowTarget;\n}\n\nexport interface FollowTarget {\n kind: 'CREATOR' | 'USER';\n displayName: string;\n avatarUrl: string | null;\n description: string | null;\n workCount: number;\n}\n\nexport type AccessReason =\n | 'PUBLIC'\n | 'OWNER'\n | 'FOLLOWING'\n | 'ENTITLED'\n | 'AUTH_REQUIRED'\n | 'FOLLOW_REQUIRED'\n | 'PURCHASE_REQUIRED'\n | 'FEATURE_NOT_FOUND'\n | 'FEATURE_DISABLED';\n\nexport interface AccessDecision {\n allowed: boolean;\n reason: AccessReason;\n nextAction: 'SIGN_IN' | 'FOLLOW' | 'CHECKOUT' | null;\n}\n\nexport type AccessPolicyType = 'PUBLIC' | 'FOLLOW_OWNER' | 'WORK_ENTITLEMENT';\n\nexport interface AccessFeaturePresentation {\n featureKey: string;\n title: string;\n policy: { type: AccessPolicyType };\n price: { amountCents: number; currency: 'CNY' } | null;\n}\n\nexport interface CheckoutOptions {\n featureKey: string;\n locale?: 'zh-CN' | 'en-US';\n}\n\nexport interface CheckoutResult {\n checkoutUrl: string;\n alreadyOwned: boolean;\n expiresAt: string | null;\n}\n\nexport interface AuthCapability {\n getState(): Promise<AuthState>;\n signIn(): Promise<AuthState>;\n signOut(): Promise<void>;\n}\n\nexport interface FollowCapability {\n getState(): Promise<FollowState>;\n follow(): Promise<FollowState>;\n unfollow(): Promise<FollowState>;\n}\n\nexport interface AccessCapability {\n getFeatures(): Promise<AccessFeaturePresentation[]>;\n check(featureKey: string): Promise<AccessDecision>;\n checkMany(featureKeys: string[]): Promise<Record<string, AccessDecision>>;\n require(featureKey: string): Promise<AccessDecision>;\n refresh(): Promise<void>;\n}\n\nexport interface CheckoutCapability {\n open(options: CheckoutOptions): Promise<CheckoutResult>;\n}\n\ninterface CapabilityDeps {\n session: SessionManager;\n workKey: string;\n widgetOrigin: string;\n now: () => number;\n presenter?: AccessPresenter;\n signal: AbortSignal;\n ready: () => Promise<void>;\n}\n\nfunction objectBody(value: unknown): Record<string, unknown> {\n if (typeof value !== 'object' || value === null) throw malformedResponse();\n return value as Record<string, unknown>;\n}\n\nfunction malformedResponse(): ViceMeError {\n return new ViceMeError({\n code: 'INTERNAL_ERROR',\n message: 'Malformed public API response.',\n retryable: true,\n });\n}\n\nfunction parseUser(value: unknown): WorkUser {\n const body = objectBody(value);\n if (\n typeof body.id !== 'string' ||\n !(typeof body.displayName === 'string' || body.displayName === null) ||\n !(typeof body.avatarUrl === 'string' || body.avatarUrl === null)\n ) {\n throw malformedResponse();\n }\n return {\n subject: body.id,\n nickname: body.displayName,\n avatarUrl: body.avatarUrl,\n };\n}\n\nfunction parseFollowState(value: unknown): FollowState {\n const body = objectBody(value);\n if (\n typeof body.following !== 'boolean' ||\n !(typeof body.followedAt === 'string' || body.followedAt === null)\n ) {\n throw malformedResponse();\n }\n const target = objectBody(body.creator);\n if (\n typeof target.displayName !== 'string' ||\n !(typeof target.avatarUrl === 'string' || target.avatarUrl === null) ||\n !(typeof target.description === 'string' || target.description === null) ||\n !Number.isInteger(target.publishedWorkCount) ||\n (target.publishedWorkCount as number) < 0\n ) {\n throw malformedResponse();\n }\n return {\n following: body.following,\n followedAt: body.followedAt,\n target: {\n kind: 'CREATOR',\n displayName: target.displayName,\n avatarUrl: target.avatarUrl,\n description: target.description,\n workCount: target.publishedWorkCount as number,\n },\n };\n}\n\nfunction parseDecision(value: unknown): AccessDecision {\n const body = objectBody(value);\n const reasons: ReadonlySet<string> = new Set([\n 'PUBLIC',\n 'OWNER',\n 'FOLLOWING',\n 'ENTITLED',\n 'AUTH_REQUIRED',\n 'FOLLOW_REQUIRED',\n 'PURCHASE_REQUIRED',\n 'FEATURE_NOT_FOUND',\n 'FEATURE_DISABLED',\n ]);\n const actions: ReadonlySet<unknown> = new Set([null, 'SIGN_IN', 'FOLLOW', 'CHECKOUT']);\n if (\n typeof body.allowed !== 'boolean' ||\n typeof body.reason !== 'string' ||\n !reasons.has(body.reason) ||\n !actions.has(body.nextAction)\n ) {\n throw malformedResponse();\n }\n return {\n allowed: body.allowed,\n reason: body.reason as AccessReason,\n nextAction: body.nextAction as AccessDecision['nextAction'],\n };\n}\n\nfunction parseFeaturePresentation(value: unknown): AccessFeaturePresentation {\n const body = objectBody(value);\n if (\n typeof body.featureKey !== 'string' ||\n !/^[a-z][a-z0-9_-]{1,63}$/.test(body.featureKey) ||\n typeof body.title !== 'string' ||\n body.title.trim().length === 0 ||\n body.title.length > 120 ||\n !(\n body.policyType === 'PUBLIC' ||\n body.policyType === 'FOLLOW_OWNER' ||\n body.policyType === 'WORK_ENTITLEMENT'\n )\n ) {\n throw malformedResponse();\n }\n const price = body.price === null ? null : objectBody(body.price);\n if (\n price !== null &&\n (!Number.isInteger(price.amountCents) ||\n (price.amountCents as number) <= 0 ||\n price.currency !== 'CNY')\n ) {\n throw malformedResponse();\n }\n if ((body.policyType === 'WORK_ENTITLEMENT') !== (price !== null)) {\n throw malformedResponse();\n }\n return {\n featureKey: body.featureKey,\n title: body.title,\n policy: { type: body.policyType },\n price: price === null ? null : { amountCents: price.amountCents as number, currency: 'CNY' },\n };\n}\n\nfunction randomVerifier(): string {\n const bytes = crypto.getRandomValues(new Uint8Array(32));\n return base64Url(bytes);\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/, '');\n}\n\nfunction resolveLocale(): 'zh-CN' | 'en-US' {\n return typeof document !== 'undefined' && document.documentElement.lang.toLowerCase() === 'en-us'\n ? 'en-US'\n : 'zh-CN';\n}\n\nexport function createCapabilities(deps: CapabilityDeps): {\n auth: AuthCapability;\n follow: FollowCapability;\n access: AccessCapability;\n checkout: CheckoutCapability;\n} {\n const cancelled = () =>\n new ViceMeError({\n code: 'AUTH_CANCELLED',\n message: 'The interactive action was cancelled.',\n retryable: false,\n });\n\n const present = (\n interaction: Omit<Parameters<AccessPresenter>[0], 'signal'>,\n ): ReturnType<AccessPresenter> => {\n if (deps.signal.aborted) return Promise.reject(clientDestroyed());\n let onAbort: (() => void) | undefined;\n const cancellation = new Promise<never>((_resolve, reject) => {\n onAbort = () => reject(clientDestroyed());\n deps.signal.addEventListener('abort', onAbort, { once: true });\n if (deps.signal.aborted) onAbort();\n });\n let presentation: ReturnType<AccessPresenter>;\n try {\n presentation = (deps.presenter ?? defaultAccessPresenter)({\n ...interaction,\n signal: deps.signal,\n });\n } catch (error) {\n presentation = Promise.reject(error);\n }\n return Promise.race([presentation, cancellation])\n .then((result) => {\n if (deps.signal.aborted) throw clientDestroyed();\n return result;\n })\n .finally(() => {\n if (onAbort) deps.signal.removeEventListener('abort', onAbort);\n });\n };\n\n const embeddedFrame = (\n url: string,\n completionOrigin: string,\n channel: string,\n type: 'auth',\n initialization: Record<string, unknown>,\n complete: (data: Record<string, unknown>) => Promise<void>,\n ): AccessFrameAction => {\n if (typeof window === 'undefined') {\n throw new ViceMeError({\n code: 'CONFIG_INVALID',\n message: 'Interactive access requires a browser window.',\n retryable: false,\n });\n }\n let active = true;\n let settle!: () => void;\n let fail!: (error: unknown) => void;\n const cleanup = () => {\n if (!active) return;\n active = false;\n window.removeEventListener('message', receive);\n };\n const completion = new Promise<void>((resolve, reject) => {\n settle = resolve;\n fail = reject;\n });\n const receive = (event: MessageEvent) => {\n if (!active || event.origin !== completionOrigin) return;\n if (typeof event.data !== 'object' || event.data === null) return;\n const data = event.data as Record<string, unknown>;\n if (data.workKey !== deps.workKey || data.channel !== channel) return;\n if (data.type === `viceme:${type}:ready`) {\n if (event.source && 'postMessage' in event.source) {\n (event.source as WindowProxy).postMessage(\n {\n type: `viceme:${type}:init`,\n workKey: deps.workKey,\n channel,\n ...initialization,\n },\n completionOrigin,\n );\n }\n return;\n }\n if (data.type === `viceme:${type}:cancelled`) {\n cleanup();\n fail(cancelled());\n return;\n }\n if (data.type !== `viceme:${type}:complete`) return;\n cleanup();\n void complete(data).then(settle, fail);\n };\n window.addEventListener('message', receive);\n return {\n type: 'frame',\n url,\n completion,\n cancel() {\n cleanup();\n settle();\n },\n };\n };\n\n const startSignIn = async (): Promise<AccessActionResult> => {\n await deps.ready();\n if (typeof window === 'undefined') {\n throw new ViceMeError({\n code: 'CONFIG_INVALID',\n message: 'Interactive access requires a browser window.',\n retryable: false,\n });\n }\n const channel = randomVerifier();\n const authorizationUrl = new URL('/sdk/login', deps.widgetOrigin);\n authorizationUrl.search = new URLSearchParams({\n workKey: deps.workKey,\n channel,\n parentOrigin: window.location.origin,\n locale: resolveLocale(),\n }).toString();\n const workSessionToken = deps.session.snapshot?.token;\n if (!workSessionToken) throw malformedResponse();\n return embeddedFrame(\n authorizationUrl.toString(),\n deps.widgetOrigin,\n channel,\n 'auth',\n { workSessionToken },\n async (data) => {\n if (typeof data.userToken !== 'string') {\n throw malformedResponse();\n }\n deps.session.authenticate({ userToken: data.userToken, user: parseUser(data.user) });\n },\n );\n };\n\n const getFollowState = async (): Promise<FollowState> => {\n await deps.ready();\n return parseFollowState(\n (await deps.session.request({ method: 'GET', path: '/v1/public/work-sdk/follow' })).body,\n );\n };\n\n const updateFollow = async (): Promise<FollowState> => {\n await deps.ready();\n return parseFollowState(\n (await deps.session.request({ method: 'PUT', path: '/v1/public/work-sdk/follow' })).body,\n );\n };\n\n const auth: AuthCapability = {\n async getState() {\n await deps.ready();\n const user = deps.session.snapshot?.user ?? null;\n return { authenticated: user !== null, user };\n },\n async signIn() {\n const result = await present({\n featureKey: 'auth',\n reason: 'AUTH_REQUIRED',\n action: 'SIGN_IN',\n perform: startSignIn,\n });\n if (result === 'dismissed') throw cancelled();\n return this.getState();\n },\n async signOut() {\n await deps.ready();\n await deps.session.signOut();\n },\n };\n\n const follow: FollowCapability = {\n getState: getFollowState,\n follow: updateFollow,\n unfollow: async () => {\n throw new ViceMeError({\n code: 'CAPABILITY_DISABLED',\n message: 'Unfollow is not exposed by website access.',\n retryable: false,\n });\n },\n };\n\n const checkMany = async (featureKeys: string[]): Promise<Record<string, AccessDecision>> => {\n await deps.ready();\n const response = objectBody(\n (\n await deps.session.request({\n method: 'POST',\n path: '/v1/public/work-sdk/access/check',\n body: { featureKeys },\n })\n ).body,\n );\n const raw = objectBody(response.decisions);\n return Object.fromEntries(\n Object.entries(raw).map(([key, value]) => [key, parseDecision(value)]),\n );\n };\n\n const createCheckout = async (\n featureKey: string,\n options: Omit<CheckoutOptions, 'featureKey'> = {},\n ): Promise<CheckoutResult> => {\n await deps.ready();\n const body = {\n featureKey,\n locale: options.locale ?? 'zh-CN',\n };\n const response = objectBody(\n (\n await deps.session.request({\n method: 'POST',\n path: '/v1/public/work-sdk/checkout',\n body,\n })\n ).body,\n );\n if (\n typeof response.checkoutUrl !== 'string' ||\n typeof response.alreadyOwned !== 'boolean' ||\n !(\n response.expiresAt === null ||\n (typeof response.expiresAt === 'string' && !Number.isNaN(Date.parse(response.expiresAt)))\n ) ||\n response.alreadyOwned !== (response.expiresAt === null)\n ) {\n throw malformedResponse();\n }\n let checkoutUrl: URL;\n try {\n checkoutUrl = new URL(response.checkoutUrl);\n } catch {\n throw malformedResponse();\n }\n if (\n !response.alreadyOwned &&\n (checkoutUrl.protocol !== 'https:' || checkoutUrl.origin !== deps.widgetOrigin)\n ) {\n throw malformedResponse();\n }\n return {\n checkoutUrl: response.checkoutUrl,\n alreadyOwned: response.alreadyOwned,\n expiresAt: response.expiresAt,\n };\n };\n\n const openCheckout = (result: CheckoutResult, featureKey: string): AccessActionResult => {\n if (result.alreadyOwned) return { type: 'completed' };\n const expiresAt = Date.parse(result.expiresAt!);\n if (typeof window === 'undefined') {\n throw new ViceMeError({\n code: 'CONFIG_INVALID',\n message: 'Hosted checkout requires a browser window.',\n retryable: false,\n });\n }\n\n let active = true;\n let pollTimer: ReturnType<typeof setTimeout> | undefined;\n let expiryTimer: ReturnType<typeof setTimeout> | undefined;\n let settle!: () => void;\n let fail!: (error: unknown) => void;\n const completion = new Promise<void>((resolve, reject) => {\n settle = resolve;\n fail = reject;\n });\n const cleanup = () => {\n if (pollTimer) clearTimeout(pollTimer);\n if (expiryTimer) clearTimeout(expiryTimer);\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n const expire = () => {\n if (!active) return;\n active = false;\n cleanup();\n fail(\n new ViceMeError({\n code: 'SESSION_EXPIRED',\n message: 'Hosted checkout session expired.',\n retryable: true,\n }),\n );\n };\n const schedule = () => {\n if (!active || document.visibilityState === 'hidden') return;\n const remaining = expiresAt - deps.now();\n if (remaining <= 0) {\n expire();\n return;\n }\n pollTimer = setTimeout(() => void poll(), Math.min(1_500, remaining));\n };\n const poll = async () => {\n if (!active) return;\n try {\n const decision = (await checkMany([featureKey]))[featureKey];\n if (!decision) throw malformedResponse();\n if (decision.allowed) {\n active = false;\n cleanup();\n settle();\n return;\n }\n schedule();\n } catch (error) {\n active = false;\n cleanup();\n fail(error);\n }\n };\n function handleVisibilityChange() {\n if (!active) return;\n if (document.visibilityState === 'hidden') {\n if (pollTimer) clearTimeout(pollTimer);\n pollTimer = undefined;\n return;\n }\n schedule();\n }\n document.addEventListener('visibilitychange', handleVisibilityChange);\n const remaining = expiresAt - deps.now();\n if (remaining <= 0) expire();\n else {\n expiryTimer = setTimeout(expire, remaining);\n schedule();\n }\n return {\n type: 'frame',\n url: result.checkoutUrl,\n completion,\n cancel() {\n if (!active) return;\n active = false;\n cleanup();\n settle();\n },\n };\n };\n\n const checkout: CheckoutCapability = {\n async open(options) {\n const checkoutResult = await createCheckout(options.featureKey, options);\n if (checkoutResult.alreadyOwned) return checkoutResult;\n const presented = await present({\n featureKey: options.featureKey,\n reason: 'PURCHASE_REQUIRED',\n action: 'CHECKOUT',\n perform: async () => openCheckout(checkoutResult, options.featureKey),\n });\n if (presented === 'dismissed') throw cancelled();\n return checkoutResult;\n },\n };\n\n const access: AccessCapability = {\n async getFeatures() {\n await deps.ready();\n const response = objectBody(\n (\n await deps.session.request({\n method: 'GET',\n path: '/v1/public/work-sdk/access/features',\n })\n ).body,\n );\n if (!Array.isArray(response.features) || response.features.length > 100) {\n throw malformedResponse();\n }\n return response.features.map(parseFeaturePresentation);\n },\n async check(featureKey) {\n const decisions = await checkMany([featureKey]);\n const decision = decisions[featureKey];\n if (!decision) throw malformedResponse();\n return decision;\n },\n checkMany,\n async require(featureKey) {\n let decision = await this.check(featureKey);\n for (\n let attempts = 0;\n !decision.allowed && decision.nextAction && attempts < 3;\n attempts += 1\n ) {\n const nextAction = decision.nextAction;\n const followTarget = nextAction === 'FOLLOW' ? (await follow.getState()).target : undefined;\n const checkoutResult =\n nextAction === 'CHECKOUT' ? await createCheckout(featureKey) : undefined;\n if (checkoutResult?.alreadyOwned) {\n decision = await this.check(featureKey);\n continue;\n }\n const result = await present({\n featureKey,\n reason: decision.reason,\n action: nextAction,\n ...(followTarget ? { followTarget } : {}),\n perform: async () => {\n if (nextAction === 'SIGN_IN') {\n return startSignIn();\n } else if (nextAction === 'FOLLOW') {\n await follow.follow();\n return { type: 'completed' };\n } else {\n return openCheckout(checkoutResult!, featureKey);\n }\n },\n });\n if (result === 'dismissed') return decision;\n decision = await this.check(featureKey);\n }\n return decision;\n },\n async refresh() {\n await deps.ready();\n },\n };\n\n return { auth, follow, access, checkout };\n}\n","/**\n * ViceMe client for hosted capabilities and optional website access.\n *\n * `ready()` and access checks remain headless. Interactive authentication and\n * checkout touch `window` only when the caller explicitly invokes them. `ready()` is\n * Hosted capability initialization stays local and synchronous. Website\n * access establishes its Work session lazily on the first access operation.\n * `ready()` is idempotent per instance (shares one promise), `destroy()` is idempotent and\n * synchronously cancels requests and subscriptions; every business method on a\n * destroyed client fails with `CLIENT_DESTROYED`.\n */\n\nimport { clientDestroyed } from './errors.ts';\nimport { Lifecycle, type ViceMeClientState } from './lifecycle.ts';\nimport type { ViceMeConfig, ViceMeRegion } from './config.ts';\nimport { SessionManager } from '../session/session.ts';\nimport type { Transport } from '../transport/transport.ts';\nimport { API_MAJOR, SDK_VERSION } from '../version.ts';\nimport {\n createCapabilities,\n type AccessCapability,\n type AuthCapability,\n type CheckoutCapability,\n} from './capabilities.ts';\nimport type { AccessPresenter } from './presentation.ts';\nimport { BUILD_WIDGET_ORIGINS } from './build-endpoints.ts';\n\nexport interface ViceMeClient {\n readonly version: string;\n readonly workKey: string;\n readonly region: ViceMeRegion;\n readonly state: ViceMeClientState;\n readonly auth: AuthCapability;\n readonly access: AccessCapability;\n readonly checkout: CheckoutCapability;\n ready(): Promise<void>;\n hasCapability(name: string): boolean;\n destroy(): void;\n}\n\nexport interface ViceMeMountedInstance {\n readonly instanceKey: string;\n readonly capability: string;\n destroy(): void;\n}\n\n/** Internal loader hook; keeps degradation outside the public client contract. */\nexport function markClientDegraded(client: ViceMeClient): void {\n if (client instanceof ViceMeClientImpl) client.markDegraded();\n}\n\n/** Marker so in-flight requests cancelled by `destroy()` map to CLIENT_DESTROYED. */\nclass DestroySignalReason extends DOMException {\n constructor() {\n super('ViceMe client destroyed.', 'AbortError');\n }\n}\n\nexport interface ViceMeClientDeps {\n config: ViceMeConfig;\n transport: Transport;\n /** Interaction override for the testing entry only. */\n presenter?: AccessPresenter;\n /** Injectable clock (testing only). */\n now?: () => number;\n}\n\nexport class ViceMeClientImpl implements ViceMeClient {\n readonly #lifecycle = new Lifecycle();\n readonly #session: SessionManager;\n readonly #config: ViceMeConfig;\n readonly #internalSignal = new AbortController();\n #readyPromise: Promise<void> | undefined;\n readonly auth: AuthCapability;\n readonly access: AccessCapability;\n readonly checkout: CheckoutCapability;\n /** Detaches the caller-signal listener; undefined when none was attached. */\n #detachCallerAbort: (() => void) | undefined;\n\n constructor(deps: ViceMeClientDeps) {\n this.#config = deps.config;\n this.#session = new SessionManager({\n workKey: deps.config.workKey,\n transport: deps.transport,\n signal: this.#internalSignal.signal,\n ...(deps.now !== undefined ? { now: deps.now } : {}),\n });\n const capabilities = createCapabilities({\n session: this.#session,\n workKey: deps.config.workKey,\n widgetOrigin: BUILD_WIDGET_ORIGINS[deps.config.region],\n now: deps.now ?? (() => Date.now()),\n presenter: deps.presenter,\n signal: this.#internalSignal.signal,\n ready: () => this.#readyAccess(),\n });\n this.auth = capabilities.auth;\n this.access = capabilities.access;\n this.checkout = capabilities.checkout;\n const callerSignal = deps.config.signal;\n if (callerSignal) {\n // Propagate the caller's own abort reason when one was set.\n const abortInternal = () => {\n this.#internalSignal.abort(\n callerSignal.reason instanceof Error\n ? callerSignal.reason\n : new DOMException('Caller signal aborted.', 'AbortError'),\n );\n };\n // An already-aborted signal never fires the listener; check\n // synchronously so a pre-cancelled caller cannot issue session\n // requests or reach the network at all.\n if (callerSignal.aborted) abortInternal();\n else {\n callerSignal.addEventListener('abort', abortInternal, { once: true });\n this.#detachCallerAbort = () => {\n callerSignal.removeEventListener('abort', abortInternal);\n };\n }\n }\n }\n\n get version(): string {\n return SDK_VERSION;\n }\n\n get workKey(): string {\n return this.#config.workKey;\n }\n\n get region(): ViceMeRegion {\n return this.#config.region;\n }\n\n get state(): ViceMeClientState {\n return this.#lifecycle.state;\n }\n\n /** Internal: public API major, used by the loader registry namespace. */\n get apiMajor(): number {\n return API_MAJOR;\n }\n\n ready(): Promise<void> {\n if (this.#lifecycle.destroyed) return Promise.reject(clientDestroyed());\n if (!this.#readyPromise) {\n this.#lifecycle.transition('READY');\n this.#readyPromise = Promise.resolve();\n }\n return this.#readyPromise;\n }\n\n async #readyAccess(): Promise<void> {\n if (this.#lifecycle.destroyed) throw clientDestroyed();\n await this.ready();\n try {\n await this.#session.establish();\n if (this.#lifecycle.destroyed) throw clientDestroyed();\n } catch (error) {\n if (this.#lifecycle.destroyed) throw clientDestroyed();\n this.#session.invalidate();\n throw error;\n }\n }\n\n hasCapability(name: string): boolean {\n if (this.#lifecycle.destroyed) return false;\n const capabilities = this.#session.snapshot?.work.capabilities;\n return name === 'danmaku' || name === 'tip' || capabilities?.includes(name) === true;\n }\n\n /** Names of capabilities enabled for this work (empty before `ready()`). */\n get capabilities(): readonly string[] {\n return this.#session.snapshot?.work.capabilities ?? [];\n }\n\n /**\n * Internal: mark one capability unavailable without taking down the client\n * (loader uses this when a feature chunk fails after the core is READY).\n */\n markDegraded(): void {\n if (this.#lifecycle.state === 'READY') this.#lifecycle.transition('DEGRADED');\n }\n\n /** Internal: session snapshot access for capability modules. */\n get sessionSnapshot() {\n return this.#session.snapshot;\n }\n\n destroy(): void {\n if (this.#lifecycle.destroyed) return;\n this.#lifecycle.transition('DESTROYED');\n this.#internalSignal.abort(new DestroySignalReason());\n this.#session.destroy();\n this.#lifecycle.clearListeners();\n this.#readyPromise = undefined;\n // A destroyed client must not stay reachable through the caller's own\n // (possibly long-lived, never-aborting) signal.\n this.#detachCallerAbort?.();\n this.#detachCallerAbort = undefined;\n }\n}\n"],"names":["REGIONS","PUBLIC_API_BASE_URLS","BUILD_API_BASE_URLS","resolveApiBaseUrl","region","isValidWorkKey","value","isValidRegion","validatePublicConfig","input","configInvalid","raw","known","key","ALLOWED_TRANSITIONS","Lifecycle","#state","#listeners","next","ViceMeError","listener","clientDestroyed","parseSessionResponse","body","workKey","malformedSessionResponse","snapshot","expiresAt","sessionInvalidated","SessionManager","#options","#now","#snapshot","#pending","#generation","#destroyed","options","#isExpired","generation","pending","response","#assertCurrent","request","#requestWithSnapshot","error","refreshed","#assertAlive","ELEMENT_NAME","PROFILE_DESCRIPTION_LIMIT","actionCopy","action","actionErrorCopy","isViceMeError","ensureAccessLayerElement","ViceMeAccessLayerElement","copy","shadow","panel","description","mainActions","closeAction","backdrop","frame","profile","avatar","avatarFallback","profileName","profileDescription","profileStats","idleActionLabel","target","descriptionCharacters","activeAction","closed","close","result","dismissLayer","event","available","element","currentIndex","direction","performAction","caught","defaultAccessPresenter","interaction","previousOverflow","previousFocus","resolve","objectBody","malformedResponse","parseUser","parseFollowState","parseDecision","reasons","actions","parseFeaturePresentation","price","randomVerifier","bytes","base64Url","binary","byte","resolveLocale","createCapabilities","deps","cancelled","present","onAbort","cancellation","_resolve","reject","presentation","embeddedFrame","url","completionOrigin","channel","type","initialization","complete","active","settle","fail","cleanup","receive","completion","data","startSignIn","authorizationUrl","workSessionToken","getFollowState","updateFollow","auth","user","follow","checkMany","featureKeys","createCheckout","featureKey","checkoutUrl","openCheckout","pollTimer","expiryTimer","handleVisibilityChange","expire","schedule","remaining","poll","decision","attempts","nextAction","followTarget","checkoutResult","DestroySignalReason","ViceMeClientImpl","#lifecycle","#session","#config","#internalSignal","#readyPromise","#detachCallerAbort","capabilities","BUILD_WIDGET_ORIGINS","#readyAccess","callerSignal","abortInternal","SDK_VERSION","API_MAJOR","name"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ const s = "0.6.2", o = 1;
2
+ export {
3
+ o as A,
4
+ s as S
5
+ };
6
+ //# sourceMappingURL=version-BJiUVcir.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version-uPTHb89K.js","sources":["../../src/version.ts"],"sourcesContent":["/**\n * Single source of truth for the SDK runtime version.\n *\n * Kept in sync with `packages/sdk/package.json#version`; a unit test enforces\n * the match so the loader, release manifest, and npm metadata can never drift.\n */\nexport const SDK_VERSION = '0.6.1';\n\n/** Public API major carried by this build (loader namespace `v1`). */\nexport const API_MAJOR = 1;\n"],"names":["SDK_VERSION","API_MAJOR"],"mappings":"AAMO,MAAMA,IAAc,SAGdC,IAAY;"}
1
+ {"version":3,"file":"version-BJiUVcir.js","sources":["../../src/version.ts"],"sourcesContent":["/**\n * Single source of truth for the SDK runtime version.\n *\n * Kept in sync with `packages/sdk/package.json#version`; a unit test enforces\n * the match so the loader, release manifest, and npm metadata can never drift.\n */\nexport const SDK_VERSION = '0.6.2';\n\n/** Public API major carried by this build (loader namespace `v1`). */\nexport const API_MAJOR = 1;\n"],"names":["SDK_VERSION","API_MAJOR"],"mappings":"AAMO,MAAMA,IAAc,SAGdC,IAAY;"}
@@ -69,6 +69,7 @@ interface CapabilityDeps {
69
69
  widgetOrigin: string;
70
70
  now: () => number;
71
71
  presenter?: AccessPresenter;
72
+ signal: AbortSignal;
72
73
  ready: () => Promise<void>;
73
74
  }
74
75
  export declare function createCapabilities(deps: CapabilityDeps): {
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/core/capabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/core/capabilities.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAa,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAE7D;AASD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,uDAAuD;IACvD,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,gBAAiB,YAAW,YAAY;;IAMnD,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;gBAI1B,IAAI,EAAE,gBAAgB;IA0ClC,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,MAAM,IAAI,YAAY,CAEzB;IAED,IAAI,KAAK,IAAI,iBAAiB,CAE7B;IAED,yEAAyE;IACzE,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAMpC,4EAA4E;IAC5E,IAAI,YAAY,IAAI,SAAS,MAAM,EAAE,CAEpC;IAED;;;OAGG;IACH,YAAY,IAAI,IAAI;IAIpB,gEAAgE;IAChE,IAAI,eAAe,oEAElB;IAED,OAAO,IAAI,IAAI;CAYhB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAa,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAE7D;AASD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,uDAAuD;IACvD,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,gBAAiB,YAAW,YAAY;;IAMnD,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;gBAI1B,IAAI,EAAE,gBAAgB;IA2ClC,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,MAAM,IAAI,YAAY,CAEzB;IAED,IAAI,KAAK,IAAI,iBAAiB,CAE7B;IAED,yEAAyE;IACzE,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAMpC,4EAA4E;IAC5E,IAAI,YAAY,IAAI,SAAS,MAAM,EAAE,CAEpC;IAED;;;OAGG;IACH,YAAY,IAAI,IAAI;IAIpB,gEAAgE;IAChE,IAAI,eAAe,oEAElB;IAED,OAAO,IAAI,IAAI;CAYhB"}
@@ -5,6 +5,8 @@ export interface AccessInteraction {
5
5
  reason: string;
6
6
  action: AccessInteractionAction;
7
7
  followTarget?: FollowTarget;
8
+ /** Client-owned lifecycle signal; abort closes any active hosted surface. */
9
+ signal?: AbortSignal;
8
10
  perform(): Promise<AccessActionResult>;
9
11
  }
10
12
  export interface AccessCompletedAction {
@@ -1 +1 @@
1
- {"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../src/core/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,uBAAuB,CAAC;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;AAElG,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,WAAW,CAAC;AAE7D,kFAAkF;AAClF,MAAM,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,iBAAiB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAwYpG,eAAO,MAAM,sBAAsB,EAAE,eAyBpC,CAAC"}
1
+ {"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../src/core/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,uBAAuB,CAAC;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;AAElG,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,WAAW,CAAC;AAE7D,kFAAkF;AAClF,MAAM,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,iBAAiB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAsZpG,eAAO,MAAM,sBAAsB,EAAE,eA0BpC,CAAC"}
package/dist/danmaku.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { B as re } from "./chunks/build-endpoints-NrDmg6jf.js";
2
2
  import { c as S, V as P } from "./chunks/errors-C7DfLKcF.js";
3
- import { S as ae } from "./chunks/version-uPTHb89K.js";
3
+ import { S as ae } from "./chunks/version-BJiUVcir.js";
4
4
  function Z(a = window, t = document) {
5
5
  const r = ne(a, t), e = oe(a, t);
6
6
  return {
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { V as n } from "./chunks/errors-C7DfLKcF.js";
2
2
  import { i as L } from "./chunks/errors-C7DfLKcF.js";
3
- import { v as A, V as b, r as h } from "./chunks/client-w9vih8Ng.js";
4
- import { A as S, S as V } from "./chunks/version-uPTHb89K.js";
3
+ import { v as A, V as b, r as h } from "./chunks/client-DEg6YouY.js";
4
+ import { A as S, S as V } from "./chunks/version-BJiUVcir.js";
5
5
  const m = 1e4, p = /* @__PURE__ */ new Map([
6
6
  [400, "CONFIG_INVALID"],
7
7
  [401, "SESSION_EXPIRED"],
@@ -1 +1 @@
1
- {"version":3,"file":"auto-loader.d.ts","sourceRoot":"","sources":["../../src/loader/auto-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAA+B,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIrF,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAAC;IACpE,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE;QAER,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAAC;KACtD,CAAC;CACH;AAoFD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CA4CxE;AA4ID,wBAAsB,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiK5E;AAkBD,iBAAS,SAAS,IAAI,IAAI,CAYzB;AAKD,eAAO,MAAM,mBAAmB,kBAAY,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"auto-loader.d.ts","sourceRoot":"","sources":["../../src/loader/auto-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAA+B,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIrF,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAAC;IACpE,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE;QAER,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAAC;KACtD,CAAC;CACH;AAoFD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CA4CxE;AAuJD,wBAAsB,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiK5E;AAkBD,iBAAS,SAAS,IAAI,IAAI,CAYzB;AAKD,eAAO,MAAM,mBAAmB,kBAAY,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.6.1",
2
+ "version": "0.6.2",
3
3
  "apiMajor": 1,
4
4
  "loader": "viceme.min.js",
5
5
  "features": {
@@ -13,11 +13,11 @@
13
13
  "bytes": 230,
14
14
  "gzipBytes": 159
15
15
  },
16
- "chunks/client-w9vih8Ng.js": {
17
- "sha256": "d5d2055edab3704624cf1f0d2c7fc3b53e12c8aec4419cf157c67aa2bbe140e3",
18
- "sri": "sha384-e9q0fHf007gUtpBij/AuW7GnJeWrDTPL7ISSSj3RYpIPSqttBhSX6jqu3CQ3d6+c",
19
- "bytes": 32187,
20
- "gzipBytes": 9248
16
+ "chunks/client-DEg6YouY.js": {
17
+ "sha256": "d35c2c69e23e5bbd3a113083df0db68d03323a340065be6f8f87a2017432c1bb",
18
+ "sri": "sha384-MKGyUeyBeAunVfXciJyVaLyHEM7Qt5tQ7XkWVqTctd01dJd6Vph+ToYvibz6grwS",
19
+ "bytes": 33685,
20
+ "gzipBytes": 9574
21
21
  },
22
22
  "chunks/errors-C7DfLKcF.js": {
23
23
  "sha256": "6ed053a2ab0ff6d4969ed644fb4e4ae89e850526f32c7841294a964447d2d1f3",
@@ -31,29 +31,29 @@
31
31
  "bytes": 1379,
32
32
  "gzipBytes": 657
33
33
  },
34
- "chunks/version-uPTHb89K.js": {
35
- "sha256": "38207f0a24b1a5f60acc14d42afcbf4bf6dd5e9987ebbdc0be8c87675273a32a",
36
- "sri": "sha384-g9VDhGsUW9+Du12VzQKOcdjVABD69hU7r3TggIPxILVu+Tq/J+Llahe6rID/pbKt",
34
+ "chunks/version-BJiUVcir.js": {
35
+ "sha256": "1c8340a6661079e55c36fe2c107c575e02a899c2474340f5990064a05bc9422a",
36
+ "sri": "sha384-y0A3Ed2ezeauYVAgzCnUvzeSmA8nIoWwP/yVLwHhTeY6ztRmhWHpthklGWH6orwb",
37
37
  "bytes": 102,
38
38
  "gzipBytes": 119
39
39
  },
40
40
  "danmaku.js": {
41
- "sha256": "c9f8ccf65f3336051493a49301c69a3c142ac725dacb2140dbca4ed30e9d5c93",
42
- "sri": "sha384-bsmueOay0/7dRIPoiTpukNrSj71vOd2Eeeu2tt0vamqEm0KMmnRCz40hv1LXF7lq",
41
+ "sha256": "6436a689488cb007150bda79eaa531eac3bffbf1846f35fcfefa1651ea0be1e0",
42
+ "sri": "sha384-ekmNwC6UH0xwZaU3oCzYd03fhe7U3DL64x/AHEd60n4ltI4Dcppn6KIUlA9G6HIS",
43
43
  "bytes": 9435,
44
- "gzipBytes": 3333
44
+ "gzipBytes": 3332
45
45
  },
46
46
  "index.js": {
47
- "sha256": "7fa7ab1ae4ee2654b59f94e145769d250840ec0357ffa3c5c43280b9b3502ab0",
48
- "sri": "sha384-vICEFVk/GTP19AMqcEr7UPmtox9vhMSOSw09kbQPC5Dw/rzOtt3Mpe+yKaqG/72N",
47
+ "sha256": "947f0bdf17286fb56e91f96b15a0c702dcb15fdb1cee189b6eadcb1b57d267f9",
48
+ "sri": "sha384-J+IVeXs0cUSZ4saGKoCv433E+u0IBtOMW61dJB8AZnFXQleeHCplhztSsmI50uUO",
49
49
  "bytes": 4472,
50
- "gzipBytes": 1843
50
+ "gzipBytes": 1842
51
51
  },
52
52
  "testing.js": {
53
- "sha256": "ae847ee45afdac730b434b817a08a9e0fa62813aa38ec4af4835b5a13fe50216",
54
- "sri": "sha384-PvBjUlvnL1XR1aqsdt2uwIfl5LsSHYDc76CgtoK7mtV1TIieS8KKWLOoLvJ8pqCs",
53
+ "sha256": "f62f3af0ffe136c761bba770036a974cd0ef06120c868f4731bb28ef554f8c95",
54
+ "sri": "sha384-f918nfcqBL6FYcRqhZoSOuC0Kxx8JDrk+ktjGOsQXrDBMfCnsQ4kW2oI5q0xa4yw",
55
55
  "bytes": 2300,
56
- "gzipBytes": 1023
56
+ "gzipBytes": 1025
57
57
  },
58
58
  "tip.js": {
59
59
  "sha256": "914f81e73d445ce2910999d48be7630a802413c49c04cf6ddbd3608d787d4845",
@@ -68,10 +68,10 @@
68
68
  "gzipBytes": 540
69
69
  },
70
70
  "viceme.min.js": {
71
- "sha256": "c2198ffa8ab0818c626b022811116a5f59a2e5428ab5c1f24f3357fb354d51f5",
72
- "sri": "sha384-ee/C2+knsv0kUw3QfdHb3VQ53i0YBfl/wce2xDHoIdlUZCADYhjiDrj7ODemd4zw",
73
- "bytes": 38058,
74
- "gzipBytes": 11804
71
+ "sha256": "e91067abd2f2503b0e3a5023aded9d86b5ae20dc60014bd46896038c43ce27b5",
72
+ "sri": "sha384-SGXBd5vG3joMBWNTH/UEL/Ewa3pM7rhyrT+od5vQVWYpLwwS/HVXk0IzO2x8G0ql",
73
+ "bytes": 39247,
74
+ "gzipBytes": 12118
75
75
  }
76
76
  }
77
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAChG,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,cAAc,CAAC;IACrB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AA4CD,qBAAa,cAAc;;gBAMb,OAAO,EAAE,qBAAqB;IAK1C,IAAI,QAAQ,IAAI,mBAAmB,GAAG,SAAS,CAE9C;IAQD;;;;;;OAMG;IACH,SAAS,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAwBnC,OAAO,CACX,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,eAAe,GAAG,mBAAmB,GAAG,QAAQ,CAAC,GAChF,OAAO,CAAC,iBAAiB,CAAC;IAwB7B,YAAY,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,IAAI;IAS1D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,2DAA2D;IAC3D,UAAU,IAAI,IAAI;IAIlB,uDAAuD;IACvD,OAAO,IAAI,IAAI;CAIhB"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAChG,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,cAAc,CAAC;IACrB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAoDD,qBAAa,cAAc;;gBAQb,OAAO,EAAE,qBAAqB;IAK1C,IAAI,QAAQ,IAAI,mBAAmB,GAAG,SAAS,CAE9C;IAQD;;;;;;OAMG;IACH,SAAS,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA8BnC,OAAO,CACX,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,eAAe,GAAG,mBAAmB,GAAG,QAAQ,CAAC,GAChF,OAAO,CAAC,iBAAiB,CAAC;IAe7B,YAAY,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,IAAI;IAU1D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,2DAA2D;IAC3D,UAAU,IAAI,IAAI;IAMlB,uDAAuD;IACvD,OAAO,IAAI,IAAI;CAoChB"}
package/dist/testing.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as i } from "./chunks/errors-C7DfLKcF.js";
2
- import { i as l, a as u, V as k } from "./chunks/client-w9vih8Ng.js";
2
+ import { i as l, a as u, V as k } from "./chunks/client-DEg6YouY.js";
3
3
  function g(e) {
4
4
  const s = [], o = [...e.sessionFailures ?? []], a = e.latencyMs ?? 0;
5
5
  return {
package/dist/version.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * Kept in sync with `packages/sdk/package.json#version`; a unit test enforces
5
5
  * the match so the loader, release manifest, and npm metadata can never drift.
6
6
  */
7
- export declare const SDK_VERSION = "0.6.1";
7
+ export declare const SDK_VERSION = "0.6.2";
8
8
  /** Public API major carried by this build (loader namespace `v1`). */
9
9
  export declare const API_MAJOR = 1;
10
10
  //# sourceMappingURL=version.d.ts.map
@@ -1,4 +1,4 @@
1
- (function(){"use strict";const ne=new Set(["RATE_LIMITED","NETWORK_TIMEOUT","CHECKOUT_UNAVAILABLE","INTERNAL_ERROR"]);class g extends Error{code;retryable;requestId;capability;constructor(e){super(e.message),this.name="ViceMeError",this.code=e.code,this.retryable=e.retryable??ne.has(e.code),this.requestId=e.requestId,this.capability=e.capability}toJSON(){const e={code:this.code,retryable:this.retryable};return this.requestId!==void 0&&(e.requestId=this.requestId),this.capability!==void 0&&(e.capability=this.capability),e}}function ae(t){return t instanceof g}function y(t){return new g({code:"CONFIG_INVALID",message:t,retryable:!1})}function D(){return new g({code:"CLIENT_DESTROYED",message:"ViceMe client has been destroyed.",retryable:!1})}const G={cn:"https://api.viceme.cn",global:"https://api.viceme.ai"},oe={cn:"https://viceme.cn",global:"https://viceme.ai"},se=new Set(["cn","global"]),ce={cn:G.cn,global:G.global};function le(t){return ce[t]}function H(t){return typeof t=="string"&&/^wrk_(?:test|live)_[A-Za-z0-9_-]{4,119}$/.test(t)}function z(t){return typeof t=="string"&&se.has(t)}function de(t){if(typeof t!="object"||t===null)throw y("createViceMe expects a configuration object.");const e=t,r=new Set(["workKey","region","signal"]);for(const i of Object.keys(e))if(!r.has(i))throw y(`Unknown configuration field "${i}".`);if(!H(e.workKey))throw y('Configuration field "workKey" must start with "wrk_test_" or "wrk_live_".');if(!z(e.region))throw y('Configuration field "region" must be "cn" or "global".');if(e.signal!==void 0&&!(e.signal instanceof AbortSignal))throw y('Configuration field "signal" must be an AbortSignal.');return{workKey:e.workKey,region:e.region,signal:e.signal}}const ue=new Set(["data-viceme-work","data-viceme-region","data-viceme-features","data-viceme-target","data-viceme-theme","data-viceme-loader"]),fe=new Set(["light","dark","auto"]),Y=["danmaku","tip"];function me(t){for(const b of t.getAttributeNames())if(b.startsWith("data-viceme-")&&!ue.has(b))throw y(`Unknown loader attribute "${b}".`);const e=t.getAttribute("data-viceme-work");if(!H(e))throw y('Loader attribute "data-viceme-work" must be a public Work key.');const r=t.getAttribute("data-viceme-region");if(!z(r))throw y('Loader attribute "data-viceme-region" must be "cn" or "global".');const i=t.getAttribute("data-viceme-features"),a=i?.split(",")??[],f=new Set(a);if(!i||/\s/.test(i)||a.length!==f.size||a.some(b=>!Y.includes(b)))throw y('Loader attribute "data-viceme-features" must contain each of "danmaku" and "tip" at most once.');const n=Y.filter(b=>f.has(b)),o=t.getAttribute("data-viceme-target");if(o==="")throw y('Loader attribute "data-viceme-target" must be a CSS selector.');if(o===null)throw y('Loader attribute "data-viceme-target" is required when features are declared.');try{t.matches(o)}catch{throw y('Loader attribute "data-viceme-target" is not a valid CSS selector.')}const d=t.getAttribute("data-viceme-theme");if(d!==null&&!fe.has(d))throw y('Loader attribute "data-viceme-theme" must be "light", "dark", or "auto".');return{workKey:e,region:r,features:n,target:o,theme:d??"auto"}}function F(t,e,r){return`v${t}+${e}+${r}`}class he{#e=new Map;#t=new Map;#r=new Map;#i=0;getClient(e){return this.#e.get(e)}registerClient(e){this.#e.set(e.clientKey,e)}unregisterClient(e){this.#e.delete(e)}getInstance(e){return this.#t.get(e)}findInstance(e,r,i){return this.#r.get(`${e}::${r}`)?.get(i)}registerInstance(e,r,i,a){const f=`${e}::${r}`;let n=this.#r.get(f);n===void 0&&(n=new WeakMap,this.#r.set(f,n));const o=n.get(i);if(o)return o;this.#i+=1;const d={instanceKey:`${e}::${r}::el${this.#i}`,clientKey:e,capability:r,host:i,raw:a,destroyed:!1};return this.#t.set(d.instanceKey,d),n.set(i,d),d}removeInstance(e){const r=this.#t.get(e);if(r)return this.#t.delete(e),this.#r.get(`${r.clientKey}::${r.capability}`)?.delete(r.host),r}instancesForClient(e){return[...this.#t.values()].filter(r=>r.clientKey===e)}}const ye=new Map([["viceme:ready",new Set(["clientKey","workKey","capabilities","version"])],["viceme:capability-ready",new Set(["clientKey","instanceKey","capability","version"])],["viceme:error",new Set(["clientKey","instanceKey","capability","code","retryable","requestId"])],["viceme:destroyed",new Set(["clientKey","instanceKey","capability"])],["viceme:widget-close",new Set(["workId"])],["viceme:tip-paid",new Set(["status","work","amountCents","currency"])]]);function pe(t,e){if(t==="viceme:tip-paid"){const a=e;return{status:a.status,work:{id:a.work.id,title:a.work.title},amountCents:a.amountCents,currency:a.currency}}const r=ye.get(t),i={};for(const[a,f]of Object.entries(e))r.has(a)&&f!==void 0&&(i[a]=f);return i}function K(t,e,r){const i=new CustomEvent(e,{detail:pe(e,r),bubbles:!0,composed:!0,cancelable:!1});t.dispatchEvent(i)}const we={CREATED:["READY","DESTROYED"],READY:["DEGRADED","DESTROYED"],DEGRADED:["DESTROYED"],DESTROYED:[]};class ge{#e="CREATED";#t=new Set;get state(){return this.#e}get destroyed(){return this.#e==="DESTROYED"}transition(e){if(e!==this.#e){if(!we[this.#e].includes(e))throw new g({code:"INTERNAL_ERROR",message:`Illegal lifecycle transition ${this.#e} -> ${e}.`,retryable:!1});this.#e=e;for(const r of this.#t)r(e)}}assertAlive(){if(this.destroyed)throw D()}subscribe(e){return this.#t.add(e),()=>{this.#t.delete(e)}}clearListeners(){this.#t.clear()}}function be(t,e){if(typeof t!="object"||t===null)throw x();const r=t;if(typeof r.workKey!="string"||!Array.isArray(r.capabilities)||!r.capabilities.every(a=>typeof a=="string"))throw x();if(r.workKey!==e)throw new g({code:"WORK_NOT_FOUND",message:"Work-session response did not match the requested work key.",retryable:!1});const i={work:{key:r.workKey,capabilities:r.capabilities}};if(typeof r.token=="string"&&(i.token=r.token),typeof r.expiresAt=="string"){const a=new Date(r.expiresAt).getTime();Number.isNaN(a)||(i.expiresAt=a)}return i}function x(){return new g({code:"INTERNAL_ERROR",message:"Malformed work-session response.",retryable:!0})}class ve{#e;#t;#r;#i;constructor(e){this.#e=e,this.#t=e.now??(()=>Date.now())}get snapshot(){return this.#r}#n(){const e=this.#r?.expiresAt;return e!==void 0&&e<=this.#t()}establish(){if(this.#r){if(!this.#n())return Promise.resolve(this.#r);this.#r=void 0}return this.#i??=this.#e.transport.request({method:"POST",path:"/v1/public/work-sdk/sessions",body:{workKey:this.#e.workKey},signal:this.#e.signal,timeoutMs:this.#e.timeoutMs}).then(e=>{const r=be(e.body,this.#e.workKey);return this.#r=r,r}).finally(()=>{this.#i=void 0}),this.#i}async request(e){const r=await this.establish();if(!r.token)throw x();try{return await this.#e.transport.request({...e,authorization:r.token,userAuthorization:r.userToken,signal:this.#e.signal})}catch(i){if(!(i instanceof g)||i.code!=="SESSION_EXPIRED")throw i;this.#r===r&&this.invalidate();const a=await this.establish();if(!a.token)throw x();return this.#e.transport.request({...e,authorization:a.token,userAuthorization:a.userToken,signal:this.#e.signal})}}authenticate(e){if(!this.#r)throw x();this.#r={...this.#r,userToken:e.userToken,user:e.user}}async signOut(){this.invalidate(),await this.establish()}invalidate(){this.#r=void 0}destroy(){this.invalidate(),this.#i=void 0}}const Q="0.6.1",M=1,$="viceme-access-layer",j=50;function Ee(t){switch(t){case"SIGN_IN":return{description:"",label:"授权"};case"FOLLOW":return{description:"",label:"关注"};case"CHECKOUT":return{description:"",label:"打开支付"}}}function Ie(t){if(!ae(t))return"操作未完成,请重试。";switch(t.code){case"CONFIG_INVALID":return"微信授权配置无效,请稍后重试。";case"AUTH_CANCELLED":return"微信授权已取消,请重试。";case"SESSION_EXPIRED":return"授权会话已过期,请重试。";case"NETWORK_TIMEOUT":return"网络连接超时,请重试。";default:return t.requestId?`操作未完成,请重试。请求 ID:${t.requestId}`:"操作未完成,请重试。"}}function ke(){if(customElements.get($))return;class t extends HTMLElement{interaction;connectedCallback(){const r=Ee(this.interaction.action),i=this.attachShadow({mode:"open"});i.innerHTML=`
1
+ (function(){"use strict";const ne=new Set(["RATE_LIMITED","NETWORK_TIMEOUT","CHECKOUT_UNAVAILABLE","INTERNAL_ERROR"]);class w extends Error{code;retryable;requestId;capability;constructor(e){super(e.message),this.name="ViceMeError",this.code=e.code,this.retryable=e.retryable??ne.has(e.code),this.requestId=e.requestId,this.capability=e.capability}toJSON(){const e={code:this.code,retryable:this.retryable};return this.requestId!==void 0&&(e.requestId=this.requestId),this.capability!==void 0&&(e.capability=this.capability),e}}function ae(t){return t instanceof w}function g(t){return new w({code:"CONFIG_INVALID",message:t,retryable:!1})}function T(){return new w({code:"CLIENT_DESTROYED",message:"ViceMe client has been destroyed.",retryable:!1})}const G={cn:"https://api.viceme.cn",global:"https://api.viceme.ai"},oe={cn:"https://viceme.cn",global:"https://viceme.ai"},se=new Set(["cn","global"]),ce={cn:G.cn,global:G.global};function le(t){return ce[t]}function H(t){return typeof t=="string"&&/^wrk_(?:test|live)_[A-Za-z0-9_-]{4,119}$/.test(t)}function Y(t){return typeof t=="string"&&se.has(t)}function de(t){if(typeof t!="object"||t===null)throw g("createViceMe expects a configuration object.");const e=t,r=new Set(["workKey","region","signal"]);for(const i of Object.keys(e))if(!r.has(i))throw g(`Unknown configuration field "${i}".`);if(!H(e.workKey))throw g('Configuration field "workKey" must start with "wrk_test_" or "wrk_live_".');if(!Y(e.region))throw g('Configuration field "region" must be "cn" or "global".');if(e.signal!==void 0&&!(e.signal instanceof AbortSignal))throw g('Configuration field "signal" must be an AbortSignal.');return{workKey:e.workKey,region:e.region,signal:e.signal}}const ue=new Set(["data-viceme-work","data-viceme-region","data-viceme-features","data-viceme-target","data-viceme-theme","data-viceme-loader"]),fe=new Set(["light","dark","auto"]),z=["danmaku","tip"];function me(t){for(const b of t.getAttributeNames())if(b.startsWith("data-viceme-")&&!ue.has(b))throw g(`Unknown loader attribute "${b}".`);const e=t.getAttribute("data-viceme-work");if(!H(e))throw g('Loader attribute "data-viceme-work" must be a public Work key.');const r=t.getAttribute("data-viceme-region");if(!Y(r))throw g('Loader attribute "data-viceme-region" must be "cn" or "global".');const i=t.getAttribute("data-viceme-features"),a=i?.split(",")??[],f=new Set(a);if(!i||/\s/.test(i)||a.length!==f.size||a.some(b=>!z.includes(b)))throw g('Loader attribute "data-viceme-features" must contain each of "danmaku" and "tip" at most once.');const n=z.filter(b=>f.has(b)),c=t.getAttribute("data-viceme-target");if(c==="")throw g('Loader attribute "data-viceme-target" must be a CSS selector.');if(c===null)throw g('Loader attribute "data-viceme-target" is required when features are declared.');try{t.matches(c)}catch{throw g('Loader attribute "data-viceme-target" is not a valid CSS selector.')}const d=t.getAttribute("data-viceme-theme");if(d!==null&&!fe.has(d))throw g('Loader attribute "data-viceme-theme" must be "light", "dark", or "auto".');return{workKey:e,region:r,features:n,target:c,theme:d??"auto"}}function $(t,e,r){return`v${t}+${e}+${r}`}class he{#e=new Map;#t=new Map;#r=new Map;#i=0;getClient(e){return this.#e.get(e)}registerClient(e){this.#e.set(e.clientKey,e)}unregisterClient(e){this.#e.delete(e)}getInstance(e){return this.#t.get(e)}findInstance(e,r,i){return this.#r.get(`${e}::${r}`)?.get(i)}registerInstance(e,r,i,a){const f=`${e}::${r}`;let n=this.#r.get(f);n===void 0&&(n=new WeakMap,this.#r.set(f,n));const c=n.get(i);if(c)return c;this.#i+=1;const d={instanceKey:`${e}::${r}::el${this.#i}`,clientKey:e,capability:r,host:i,raw:a,destroyed:!1};return this.#t.set(d.instanceKey,d),n.set(i,d),d}removeInstance(e){const r=this.#t.get(e);if(r)return this.#t.delete(e),this.#r.get(`${r.clientKey}::${r.capability}`)?.delete(r.host),r}instancesForClient(e){return[...this.#t.values()].filter(r=>r.clientKey===e)}}const ye=new Map([["viceme:ready",new Set(["clientKey","workKey","capabilities","version"])],["viceme:capability-ready",new Set(["clientKey","instanceKey","capability","version"])],["viceme:error",new Set(["clientKey","instanceKey","capability","code","retryable","requestId"])],["viceme:destroyed",new Set(["clientKey","instanceKey","capability"])],["viceme:widget-close",new Set(["workId"])],["viceme:tip-paid",new Set(["status","work","amountCents","currency"])]]);function pe(t,e){if(t==="viceme:tip-paid"){const a=e;return{status:a.status,work:{id:a.work.id,title:a.work.title},amountCents:a.amountCents,currency:a.currency}}const r=ye.get(t),i={};for(const[a,f]of Object.entries(e))r.has(a)&&f!==void 0&&(i[a]=f);return i}function P(t,e,r){const i=new CustomEvent(e,{detail:pe(e,r),bubbles:!0,composed:!0,cancelable:!1});t.dispatchEvent(i)}const ge={CREATED:["READY","DESTROYED"],READY:["DEGRADED","DESTROYED"],DEGRADED:["DESTROYED"],DESTROYED:[]};class we{#e="CREATED";#t=new Set;get state(){return this.#e}get destroyed(){return this.#e==="DESTROYED"}transition(e){if(e!==this.#e){if(!ge[this.#e].includes(e))throw new w({code:"INTERNAL_ERROR",message:`Illegal lifecycle transition ${this.#e} -> ${e}.`,retryable:!1});this.#e=e;for(const r of this.#t)r(e)}}assertAlive(){if(this.destroyed)throw T()}subscribe(e){return this.#t.add(e),()=>{this.#t.delete(e)}}clearListeners(){this.#t.clear()}}function be(t,e){if(typeof t!="object"||t===null)throw x();const r=t;if(typeof r.workKey!="string"||!Array.isArray(r.capabilities)||!r.capabilities.every(a=>typeof a=="string"))throw x();if(r.workKey!==e)throw new w({code:"WORK_NOT_FOUND",message:"Work-session response did not match the requested work key.",retryable:!1});const i={work:{key:r.workKey,capabilities:r.capabilities}};if(typeof r.token=="string"&&(i.token=r.token),typeof r.expiresAt=="string"){const a=new Date(r.expiresAt).getTime();Number.isNaN(a)||(i.expiresAt=a)}return i}function x(){return new w({code:"INTERNAL_ERROR",message:"Malformed work-session response.",retryable:!0})}function ve(){return new w({code:"SESSION_EXPIRED",message:"The work session was invalidated before it completed.",retryable:!0})}class Ee{#e;#t;#r;#i;#n=0;#a=!1;constructor(e){this.#e=e,this.#t=e.now??(()=>Date.now())}get snapshot(){return this.#r}#s(){const e=this.#r?.expiresAt;return e!==void 0&&e<=this.#t()}establish(){if(this.#a)return Promise.reject(T());if(this.#r){if(!this.#s())return Promise.resolve(this.#r);this.#r=void 0}if(this.#i)return this.#i;const e=this.#n,r=this.#e.transport.request({method:"POST",path:"/v1/public/work-sdk/sessions",body:{workKey:this.#e.workKey},signal:this.#e.signal,timeoutMs:this.#e.timeoutMs}).then(i=>{this.#c(e);const a=be(i.body,this.#e.workKey);return this.#c(e),this.#r=a,a}).finally(()=>{this.#i===r&&(this.#i=void 0)});return this.#i=r,r}async request(e){const r=await this.establish();if(!r.token)throw x();try{return await this.#l(e,r)}catch(i){if(this.#a)throw T();if(!(i instanceof w)||i.code!=="SESSION_EXPIRED")throw i;this.#r===r&&this.invalidate();const a=await this.establish();if(!a.token)throw x();return this.#l(e,a)}}authenticate(e){if(this.#o(),!this.#r)throw x();this.#r={...this.#r,userToken:e.userToken,user:e.user}}async signOut(){this.#o(),this.invalidate(),await this.establish()}invalidate(){this.#n+=1,this.#r=void 0,this.#i=void 0}destroy(){this.#a||(this.#a=!0,this.#n+=1,this.#r=void 0,this.#i=void 0)}#o(){if(this.#a)throw T()}#c(e){if(this.#o(),e!==this.#n)throw ve()}async#l(e,r){this.#o();try{const i=await this.#e.transport.request({...e,authorization:r.token,userAuthorization:r.userToken,signal:this.#e.signal});return this.#o(),i}catch(i){throw this.#a?T():i}}}const X="0.6.2",K=1,j="viceme-access-layer",B=50;function Ie(t){switch(t){case"SIGN_IN":return{description:"",label:"授权"};case"FOLLOW":return{description:"",label:"关注"};case"CHECKOUT":return{description:"",label:"打开支付"}}}function ke(t){if(!ae(t))return"操作未完成,请重试。";switch(t.code){case"CONFIG_INVALID":return"微信授权配置无效,请稍后重试。";case"AUTH_CANCELLED":return"微信授权已取消,请重试。";case"SESSION_EXPIRED":return"授权会话已过期,请重试。";case"NETWORK_TIMEOUT":return"网络连接超时,请重试。";default:return t.requestId?`操作未完成,请重试。请求 ID:${t.requestId}`:"操作未完成,请重试。"}}function Ae(){if(customElements.get(j))return;class t extends HTMLElement{interaction;connectedCallback(){const r=Ie(this.interaction.action),i=this.attachShadow({mode:"open"});i.innerHTML=`
2
2
  <style>
3
3
  :host {
4
4
  position: fixed;
@@ -212,5 +212,5 @@
212
212
  </div>
213
213
  <iframe data-viceme="frame" title="" referrerpolicy="no-referrer" allow="payment"></iframe>
214
214
  </section>
215
- `;const a=i.querySelector("[data-viceme='panel']");a.dataset.action=this.interaction.action,a.dataset.frame="false";const f=i.querySelector("[data-viceme='description']");f.textContent=r.description;const n=i.querySelector("[data-viceme='action']"),o=n.parentElement,d=i.querySelector("[data-viceme='close']"),b=i.querySelector("[data-viceme='backdrop']"),N=i.querySelector("[data-viceme='error']"),s=i.querySelector("[data-viceme='frame']"),C=i.querySelector("[data-viceme='profile']"),c=i.querySelector("[data-viceme='avatar']"),u=i.querySelector("[data-viceme='avatar-fallback']"),p=i.querySelector("[data-viceme='profile-name']"),l=i.querySelector("[data-viceme='profile-description']"),w=i.querySelector("[data-viceme='profile-stats']");n.textContent=r.label,n.hidden=!1,o.dataset.single="true";const A=r.label;s.title=this.interaction.action==="SIGN_IN"?"登录授权":"支付";const h=this.interaction.followTarget;if(h){a.setAttribute("aria-label",this.interaction.action==="SIGN_IN"?`授权 ${h.displayName}`:`关注 ${h.displayName}`),C.dataset.visible="true",p.textContent=h.displayName;const m=[...h.description??""];l.textContent=m.length>j?`${m.slice(0,j).join("")}…`:m.join(""),m.length>j&&(l.title=h.description),w.textContent=`${h.workCount} 个作品`,u.textContent=h.displayName.trim().slice(0,1)||"V",h.avatarUrl&&(c.src=h.avatarUrl,c.alt=`${h.displayName}的头像`,c.hidden=!1,u.hidden=!0)}let E=null;const _=m=>{this.dispatchEvent(new CustomEvent("viceme:access-layer-close",{detail:m}))},T=()=>{E?.cancel(),_("dismissed")};b.addEventListener("click",T),d.addEventListener("click",T),this.addEventListener("keydown",m=>{if(m.key==="Escape"&&T(),m.key==="Tab"){if(m.preventDefault(),E?.type==="frame"){s.focus();return}const I=[d,...n.hidden?[]:[n]].filter(q=>!q.disabled&&!q.hidden);if(I.length===0)return;const P=I.indexOf(i.activeElement),R=m.shiftKey?-1:1;I[(P+R+I.length)%I.length]?.focus()}});const U=async()=>{n.disabled=!0,n.setAttribute("aria-busy","true"),n.textContent="正在打开…",N.textContent="";try{const m=await this.interaction.perform();m.type==="frame"?(E=m,a.dataset.frame="true",s.src=m.url,s.focus(),await m.completion):m.type==="external"&&(E=m,await m.completion),_("acted")}catch(m){E?.cancel(),E=null,a.dataset.frame="false",s.removeAttribute("src"),N.textContent=Ie(m),n.hidden=!1,n.disabled=!1,n.removeAttribute("aria-busy"),n.textContent=A,n.focus()}};n.addEventListener("click",U),queueMicrotask(()=>n.focus())}}customElements.define($,t)}const B=async t=>{if(typeof document>"u"||typeof customElements>"u")return"dismissed";ke();const e=document.createElement($);e.interaction=t;const r=document.documentElement.style.overflow,i=document.activeElement instanceof HTMLElement?document.activeElement:null;document.documentElement.style.overflow="hidden",document.body.append(e);try{return await new Promise(a=>{e.addEventListener("viceme:access-layer-close",f=>a(f.detail),{once:!0})})}finally{e.remove(),document.documentElement.style.overflow=r,i?.focus()}};function O(t){if(typeof t!="object"||t===null)throw k();return t}function k(){return new g({code:"INTERNAL_ERROR",message:"Malformed public API response.",retryable:!0})}function Ae(t){const e=O(t);if(typeof e.id!="string"||!(typeof e.displayName=="string"||e.displayName===null)||!(typeof e.avatarUrl=="string"||e.avatarUrl===null))throw k();return{subject:e.id,nickname:e.displayName,avatarUrl:e.avatarUrl}}function X(t){const e=O(t);if(typeof e.following!="boolean"||!(typeof e.followedAt=="string"||e.followedAt===null))throw k();const r=O(e.creator);if(typeof r.displayName!="string"||!(typeof r.avatarUrl=="string"||r.avatarUrl===null)||!(typeof r.description=="string"||r.description===null)||!Number.isInteger(r.publishedWorkCount)||r.publishedWorkCount<0)throw k();return{following:e.following,followedAt:e.followedAt,target:{kind:"CREATOR",displayName:r.displayName,avatarUrl:r.avatarUrl,description:r.description,workCount:r.publishedWorkCount}}}function Te(t){const e=O(t),r=new Set(["PUBLIC","OWNER","FOLLOWING","ENTITLED","AUTH_REQUIRED","FOLLOW_REQUIRED","PURCHASE_REQUIRED","FEATURE_NOT_FOUND","FEATURE_DISABLED"]),i=new Set([null,"SIGN_IN","FOLLOW","CHECKOUT"]);if(typeof e.allowed!="boolean"||typeof e.reason!="string"||!r.has(e.reason)||!i.has(e.nextAction))throw k();return{allowed:e.allowed,reason:e.reason,nextAction:e.nextAction}}function Se(t){const e=O(t);if(typeof e.featureKey!="string"||!/^[a-z][a-z0-9_-]{1,63}$/.test(e.featureKey)||typeof e.title!="string"||e.title.trim().length===0||e.title.length>120||!(e.policyType==="PUBLIC"||e.policyType==="FOLLOW_OWNER"||e.policyType==="WORK_ENTITLEMENT"))throw k();const r=e.price===null?null:O(e.price);if(r!==null&&(!Number.isInteger(r.amountCents)||r.amountCents<=0||r.currency!=="CNY")||e.policyType==="WORK_ENTITLEMENT"!=(r!==null))throw k();return{featureKey:e.featureKey,title:e.title,policy:{type:e.policyType},price:r===null?null:{amountCents:r.amountCents,currency:"CNY"}}}function Ne(){const t=crypto.getRandomValues(new Uint8Array(32));return Re(t)}function Re(t){let e="";for(const r of t)e+=String.fromCharCode(r);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function Oe(){return typeof document<"u"&&document.documentElement.lang.toLowerCase()==="en-us"?"en-US":"zh-CN"}function Le(t){const e=()=>new g({code:"AUTH_CANCELLED",message:"The interactive action was cancelled.",retryable:!1}),r=(c,u,p,l,w,A)=>{if(typeof window>"u")throw new g({code:"CONFIG_INVALID",message:"Interactive access requires a browser window.",retryable:!1});let h=!0,E,_;const T=()=>{h&&(h=!1,window.removeEventListener("message",m))},U=new Promise((S,I)=>{E=S,_=I}),m=S=>{if(!h||S.origin!==u||typeof S.data!="object"||S.data===null)return;const I=S.data;if(!(I.workKey!==t.workKey||I.channel!==p)){if(I.type===`viceme:${l}:ready`){S.source&&"postMessage"in S.source&&S.source.postMessage({type:`viceme:${l}:init`,workKey:t.workKey,channel:p,...w},u);return}if(I.type===`viceme:${l}:cancelled`){T(),_(e());return}I.type===`viceme:${l}:complete`&&(T(),A(I).then(E,_))}};return window.addEventListener("message",m),{type:"frame",url:c,completion:U,cancel(){T(),E()}}},i=async()=>{if(await t.ready(),typeof window>"u")throw new g({code:"CONFIG_INVALID",message:"Interactive access requires a browser window.",retryable:!1});const c=Ne(),u=new URL("/sdk/login",t.widgetOrigin);u.search=new URLSearchParams({workKey:t.workKey,channel:c,parentOrigin:window.location.origin,locale:Oe()}).toString();const p=t.session.snapshot?.token;if(!p)throw k();return r(u.toString(),t.widgetOrigin,c,"auth",{workSessionToken:p},async l=>{if(typeof l.userToken!="string")throw k();t.session.authenticate({userToken:l.userToken,user:Ae(l.user)})})},a=async()=>(await t.ready(),X((await t.session.request({method:"GET",path:"/v1/public/work-sdk/follow"})).body)),f=async()=>(await t.ready(),X((await t.session.request({method:"PUT",path:"/v1/public/work-sdk/follow"})).body)),n={async getState(){await t.ready();const c=t.session.snapshot?.user??null;return{authenticated:c!==null,user:c}},async signIn(){if(await(t.presenter??B)({featureKey:"auth",reason:"AUTH_REQUIRED",action:"SIGN_IN",perform:i})==="dismissed")throw e();return this.getState()},async signOut(){await t.ready(),await t.session.signOut()}},o={getState:a,follow:f,unfollow:async()=>{throw new g({code:"CAPABILITY_DISABLED",message:"Unfollow is not exposed by website access.",retryable:!1})}},d=async c=>{await t.ready();const u=O((await t.session.request({method:"POST",path:"/v1/public/work-sdk/access/check",body:{featureKeys:c}})).body),p=O(u.decisions);return Object.fromEntries(Object.entries(p).map(([l,w])=>[l,Te(w)]))},b=async(c,u={})=>{await t.ready();const p={featureKey:c,locale:u.locale??"zh-CN"},l=O((await t.session.request({method:"POST",path:"/v1/public/work-sdk/checkout",body:p})).body);if(typeof l.checkoutUrl!="string"||typeof l.alreadyOwned!="boolean"||!(l.expiresAt===null||typeof l.expiresAt=="string"&&!Number.isNaN(Date.parse(l.expiresAt)))||l.alreadyOwned!==(l.expiresAt===null))throw k();let w;try{w=new URL(l.checkoutUrl)}catch{throw k()}if(!l.alreadyOwned&&(w.protocol!=="https:"||w.origin!==t.widgetOrigin))throw k();return{checkoutUrl:l.checkoutUrl,alreadyOwned:l.alreadyOwned,expiresAt:l.expiresAt}},N=(c,u)=>{if(c.alreadyOwned)return{type:"completed"};const p=Date.parse(c.expiresAt);if(typeof window>"u")throw new g({code:"CONFIG_INVALID",message:"Hosted checkout requires a browser window.",retryable:!1});let l=!0,w,A,h,E;const _=new Promise((R,q)=>{h=R,E=q}),T=()=>{w&&clearTimeout(w),A&&clearTimeout(A),document.removeEventListener("visibilitychange",I)},U=()=>{l&&(l=!1,T(),E(new g({code:"SESSION_EXPIRED",message:"Hosted checkout session expired.",retryable:!0})))},m=()=>{if(!l||document.visibilityState==="hidden")return;const R=p-t.now();if(R<=0){U();return}w=setTimeout(()=>{S()},Math.min(1500,R))},S=async()=>{if(l)try{const R=(await d([u]))[u];if(!R)throw k();if(R.allowed){l=!1,T(),h();return}m()}catch(R){l=!1,T(),E(R)}};function I(){if(l){if(document.visibilityState==="hidden"){w&&clearTimeout(w),w=void 0;return}m()}}document.addEventListener("visibilitychange",I);const P=p-t.now();return P<=0?U():(A=setTimeout(U,P),m()),{type:"frame",url:c.checkoutUrl,completion:_,cancel(){l&&(l=!1,T(),h())}}};return{auth:n,follow:o,access:{async getFeatures(){await t.ready();const c=O((await t.session.request({method:"GET",path:"/v1/public/work-sdk/access/features"})).body);if(!Array.isArray(c.features)||c.features.length>100)throw k();return c.features.map(Se)},async check(c){const p=(await d([c]))[c];if(!p)throw k();return p},checkMany:d,async require(c){let u=await this.check(c);const p=t.presenter??B;for(let l=0;!u.allowed&&u.nextAction&&l<3;l+=1){const w=u.nextAction,A=w==="FOLLOW"?(await o.getState()).target:void 0,h=w==="CHECKOUT"?await b(c):void 0;if(h?.alreadyOwned){u=await this.check(c);continue}if(await p({featureKey:c,reason:u.reason,action:w,...A?{followTarget:A}:{},perform:async()=>w==="SIGN_IN"?i():w==="FOLLOW"?(await o.follow(),{type:"completed"}):N(h,c)})==="dismissed")return u;u=await this.check(c)}return u},async refresh(){await t.ready()}},checkout:{async open(c){const u=await b(c.featureKey,c);if(u.alreadyOwned)return u;if(await(t.presenter??B)({featureKey:c.featureKey,reason:"PURCHASE_REQUIRED",action:"CHECKOUT",perform:async()=>N(u,c.featureKey)})==="dismissed")throw e();return u}}}}function J(t){t instanceof Z&&t.markDegraded()}class Ce extends DOMException{constructor(){super("ViceMe client destroyed.","AbortError")}}class Z{#e=new ge;#t;#r;#i=new AbortController;#n;auth;access;checkout;#a;constructor(e){this.#r=e.config,this.#t=new ve({workKey:e.config.workKey,transport:e.transport,signal:this.#i.signal,...e.now!==void 0?{now:e.now}:{}});const r=Le({session:this.#t,workKey:e.config.workKey,widgetOrigin:oe[e.config.region],now:e.now??(()=>Date.now()),presenter:e.presenter,ready:()=>this.#o()});this.auth=r.auth,this.access=r.access,this.checkout=r.checkout;const i=e.config.signal;if(i){const a=()=>{this.#i.abort(i.reason instanceof Error?i.reason:new DOMException("Caller signal aborted.","AbortError"))};i.aborted?a():(i.addEventListener("abort",a,{once:!0}),this.#a=()=>{i.removeEventListener("abort",a)})}}get version(){return Q}get workKey(){return this.#r.workKey}get region(){return this.#r.region}get state(){return this.#e.state}get apiMajor(){return M}ready(){return this.#e.destroyed?Promise.reject(D()):(this.#n||(this.#e.transition("READY"),this.#n=Promise.resolve()),this.#n)}async#o(){if(this.#e.destroyed)throw D();await this.ready();try{if(await this.#t.establish(),this.#e.destroyed)throw D()}catch(e){throw this.#e.destroyed?D():(this.#t.invalidate(),e)}}hasCapability(e){if(this.#e.destroyed)return!1;const r=this.#t.snapshot?.work.capabilities;return e==="danmaku"||e==="tip"||r?.includes(e)===!0}get capabilities(){return this.#t.snapshot?.work.capabilities??[]}markDegraded(){this.#e.state==="READY"&&this.#e.transition("DEGRADED")}get sessionSnapshot(){return this.#t.snapshot}destroy(){this.#e.destroyed||(this.#e.transition("DESTROYED"),this.#i.abort(new Ce),this.#t.destroy(),this.#e.clearListeners(),this.#n=void 0,this.#a?.(),this.#a=void 0)}}const _e=1e4,De=new Map([[400,"CONFIG_INVALID"],[401,"SESSION_EXPIRED"],[403,"CAPABILITY_DISABLED"],[404,"WORK_NOT_FOUND"],[409,"CONFIG_INVALID"],[422,"CONFIG_INVALID"],[429,"RATE_LIMITED"]]),Ue=new Set(["CONFIG_INVALID","WORK_NOT_FOUND","CAPABILITY_DISABLED","SESSION_EXPIRED","AUTH_REQUIRED","AUTH_CANCELLED","RETURN_URL_NOT_ALLOWED","RATE_LIMITED","NETWORK_TIMEOUT","CHECKOUT_UNAVAILABLE","INTERNAL_ERROR"]);function xe(t){if(typeof t!="object"||t===null)return{};const e=t,r=typeof e.error=="object"&&e.error!==null?e.error:e,i={};return typeof r.code=="string"&&Ue.has(r.code)&&(i.code=r.code),typeof r.message=="string"&&(i.message=r.message.slice(0,200)),typeof r.retryable=="boolean"&&(i.retryable=r.retryable),typeof r.requestId=="string"&&(i.requestId=r.requestId),i}function Me(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`req-${Math.random().toString(36).slice(2)}`}class Ke{#e;#t;#r;#i;constructor(e){this.#e=e.apiBaseUrl.replace(/\/+$/,""),this.#t=e.fetchImpl??globalThis.fetch.bind(globalThis),this.#r=e.defaultTimeoutMs??_e,this.#i=e.generateRequestId??Me}async request(e){if(e.signal?.aborted)throw this.#n(e.signal);const r=e.timeoutMs??this.#r,i=new AbortController;let a=!1;const f=setTimeout(()=>{a=!0,i.abort(new ee)},r),n=()=>i.abort(new ee(!1));e.signal?.addEventListener("abort",n,{once:!0});const o=this.#i();try{const d=await this.#t(`${this.#e}${e.path}`,{method:e.method,credentials:"omit",mode:"cors",headers:{"content-type":"application/json","x-client-request-id":o,...e.authorization!==void 0?{authorization:`Bearer ${e.authorization}`}:{},...e.userAuthorization!==void 0?{"x-viceme-user-token":e.userAuthorization}:{}},body:e.body!==void 0?JSON.stringify(e.body):void 0,signal:i.signal});let b;try{b=await d.json()}catch(s){if(e.signal?.aborted||a)throw s;b=void 0}const N=d.headers.get("x-request-id")??void 0;if(!d.ok){const s=xe(b),C=s.code??De.get(d.status)??"INTERNAL_ERROR";throw new g({code:C,message:s.message??"Public API request failed.",retryable:s.retryable,requestId:s.requestId??N})}return{status:d.status,body:b,requestId:N}}catch(d){throw e.signal?.aborted?this.#n(e.signal):a?new g({code:"NETWORK_TIMEOUT",message:"Public API request timed out.",retryable:!0,requestId:o}):d instanceof g?d:d instanceof DOMException&&d.name==="AbortError"?new DOMException("ViceMe request aborted by caller.","AbortError"):new g({code:"INTERNAL_ERROR",message:"Public API request failed.",retryable:!0,requestId:o})}finally{clearTimeout(f),e.signal?.removeEventListener("abort",n)}}#n(e){return e.reason instanceof Error?e.reason:new DOMException("ViceMe request aborted by caller.","AbortError")}}function Pe(t){return new Ke(t)}class ee extends DOMException{constructor(e=!0){super(e?"ViceMe request timed out.":"ViceMe request aborted.","AbortError")}}function qe(t){const e=de(t),r=le(e.region),i=Pe({apiBaseUrl:r});return new Z({config:e,transport:i})}const Fe=8e3,$e=8e3,te={danmaku:"danmaku.js",tip:"tip.js"},je={danmaku:"mountDanmaku",tip:"mountTip"},re=Symbol.for("viceme.loader.state.v1");function v(){const e=globalThis[re];if(e)return e;const r={registry:new he,queue:{current:Promise.resolve()}};return Object.defineProperty(globalThis,re,{value:r,writable:!0,configurable:!0,enumerable:!1}),r}function V(t){if(!t.destroyed){t.destroyed=!0,v().registry.removeInstance(t.instanceKey);try{t.raw.destroy()}finally{K(t.host,"viceme:destroyed",{clientKey:t.clientKey,instanceKey:t.instanceKey,capability:t.capability})}}}function Be(t){return{instanceKey:t.instanceKey,capability:t.capability,destroy:()=>V(t)}}function W(t,e,r){Object.defineProperty(t,e,{value:r,writable:!0,configurable:!0,enumerable:!1})}function Ve(t){let r=globalThis.ViceMe;r||(r={},W(globalThis,"ViceMe",r));let i=r.versions;i||(i={},W(r,"versions",i));const a=i[`v${M}`];if(a)return a;const f={version:t,whenReady(n){const o=v().registry.getClient(n);return o?o.ready.then(()=>o.client):Promise.reject(y(`Unknown clientKey "${n}".`))},getInstance(n){const o=v().registry.getInstance(n);return o?Be(o):void 0},destroyInstance(n){const o=v().registry.getInstance(n);o&&V(o)},destroyClient(n){for(const d of v().registry.instancesForClient(n))V(d);const o=v().registry.getClient(n);for(const d of o?.pendingMounts??[])d.abort();v().registry.unregisterClient(n),o?.client.destroy()}};return W(i,`v${M}`,f),f}function We(){return document.readyState!=="loading"?Promise.resolve():new Promise(t=>{document.addEventListener("DOMContentLoaded",()=>t(),{once:!0})})}async function Ge(t){let e;try{e=await He(t)}catch{e={ok:!1,status:0}}return{manifest:await ze(e),baseUrl:t}}function He(t){const e=typeof AbortSignal<"u"&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(Fe):void 0;return fetch(t,{credentials:"omit",signal:e})}async function ze(t){if(!t.ok)throw y(`Release manifest is not available (HTTP ${t.status}).`);const e=await t.json();if(typeof e!="object"||e===null||typeof e.version!="string"||typeof e.apiMajor!="number"||typeof e.features!="object"||e.features===null)throw y("Release manifest is malformed.");const r=e;if(r.version!==Q)throw y("Release manifest version does not match this loader.");if(r.apiMajor!==M)throw y("Release manifest major version does not match this loader.");const i=Object.keys(r.features).sort();if(i.length!==2||i[0]!=="danmaku"||i[1]!=="tip"||r.features.danmaku!==te.danmaku||r.features.tip!==te.tip)throw y("Release manifest features must be exactly danmaku.js and tip.js.");return r}const Ye=new Set(["CONFIG_INVALID","CAPABILITY_DISABLED","CLIENT_DESTROYED","INTERNAL_ERROR"]);function Qe(t){if(typeof t=="object"&&t!==null){const e=t;if(typeof e.code=="string"&&Ye.has(e.code)&&typeof e.retryable=="boolean"){const r={code:e.code,retryable:e.retryable};return typeof e.requestId=="string"&&(r.requestId=e.requestId),typeof e.capability=="string"&&(r.capability=e.capability),r}}return{code:"INTERNAL_ERROR",retryable:!0}}function L(t,e,r={}){K(t,"viceme:error",{...Qe(e),...r})}function Xe(t,e,r){let i,a;const f=new Promise((n,o)=>{if(a=()=>o(D()),e.signal.aborted){a();return}e.signal.addEventListener("abort",a,{once:!0}),i=globalThis.setTimeout(()=>{o(new g({code:"INTERNAL_ERROR",message:`Capability "${r}" did not load and mount in time.`,retryable:!0,capability:r})),e.abort()},$e)});return Promise.race([t,f]).finally(()=>{i!==void 0&&globalThis.clearTimeout(i),a&&e.signal.removeEventListener("abort",a)})}async function Je(t){let e;try{e=me(t)}catch(s){L(document,s);return}if(!t.src){L(document,y("Loader script requires a src URL."));return}const r=new URL("manifest.json",t.src);let i,a;try{({manifest:i,baseUrl:a}=await Ge(r))}catch(s){L(document,s,{clientKey:F(M,e.region,e.workKey)});return}await We();let f;try{const s=document.querySelectorAll(e.target);if(s.length===0)throw y(`Loader target "${e.target}" matched no element; no node was created.`);if(s.length>1)throw y(`Loader target "${e.target}" matched ${s.length} elements; exactly one is required.`);f=s[0]}catch(s){L(document,s,{clientKey:F(i.apiMajor,e.region,e.workKey)});return}const n=F(i.apiMajor,e.region,e.workKey);Ve(i.version);let o=v().registry.getClient(n),d;if(o)d=o.client;else{try{d=qe({workKey:e.workKey,region:e.region})}catch(C){L(f,C,{clientKey:n});return}const s=d.ready();s.catch(()=>{}),o={clientKey:n,client:d,ready:s,pendingMounts:new Set},v().registry.registerClient(o)}try{await o.ready}catch(s){v().registry.unregisterClient(n),d.destroy(),L(f,s,{clientKey:n});return}if(v().registry.getClient(n)!==o)return;const b=async s=>{if(v().registry.findInstance(n,s,f))return;const C=i.features[s];if(typeof C!="string"){J(d),L(f,new g({code:"CAPABILITY_DISABLED",message:`Capability "${s}" is not part of this release.`,retryable:!1,capability:s}),{clientKey:n,capability:s});return}const c=new AbortController;o.pendingMounts.add(c);try{const u=(async()=>{const A=await import(new URL(C,a).href),h=je[s],E=A[h];if(typeof E!="function")throw y(`Capability chunk "${s}" does not export ${h}().`);if(v().registry.getClient(n)!==o)throw D();return await E(d,{target:f,theme:e.theme,signal:c.signal})})(),p=await Xe(u,c,s);if(v().registry.getClient(n)!==o){p.destroy();return}const l=v().registry.registerInstance(n,s,f,p);return K(f,"viceme:capability-ready",{clientKey:n,instanceKey:l.instanceKey,capability:s,version:i.version}),s}catch(u){if(v().registry.getClient(n)!==o)return;J(d),L(f,u,{clientKey:n,capability:s});return}finally{o.pendingMounts.delete(c)}},N=(await Promise.all(e.features.map(b))).filter(s=>s!==void 0);N.length>0&&v().registry.getClient(n)===o&&K(f,"viceme:ready",{clientKey:n,workKey:e.workKey,capabilities:N,version:i.version})}function Ze(t){const{queue:e}=v(),r=e.current.then(()=>Je(t));return e.current=r.catch(()=>{}),r}function ie(){if(typeof document>"u")return;let t=document.currentScript instanceof HTMLScriptElement?document.currentScript:null;if(!t){const e=document.querySelectorAll("script[data-viceme-loader]");e.length===1&&(t=e[0]??null)}t&&Ze(t).catch(e=>{L(document,e)})}ie();const et=ie})();
215
+ `;const a=i.querySelector("[data-viceme='panel']");a.dataset.action=this.interaction.action,a.dataset.frame="false";const f=i.querySelector("[data-viceme='description']");f.textContent=r.description;const n=i.querySelector("[data-viceme='action']"),c=n.parentElement,d=i.querySelector("[data-viceme='close']"),b=i.querySelector("[data-viceme='backdrop']"),N=i.querySelector("[data-viceme='error']"),o=i.querySelector("[data-viceme='frame']"),_=i.querySelector("[data-viceme='profile']"),D=i.querySelector("[data-viceme='avatar']"),l=i.querySelector("[data-viceme='avatar-fallback']"),u=i.querySelector("[data-viceme='profile-name']"),h=i.querySelector("[data-viceme='profile-description']"),s=i.querySelector("[data-viceme='profile-stats']");n.textContent=r.label,n.hidden=!1,c.dataset.single="true";const y=r.label;o.title=this.interaction.action==="SIGN_IN"?"登录授权":"支付";const p=this.interaction.followTarget;if(p){a.setAttribute("aria-label",this.interaction.action==="SIGN_IN"?`授权 ${p.displayName}`:`关注 ${p.displayName}`),_.dataset.visible="true",u.textContent=p.displayName;const m=[...p.description??""];h.textContent=m.length>B?`${m.slice(0,B).join("")}…`:m.join(""),m.length>B&&(h.title=p.description),s.textContent=`${p.workCount} 个作品`,l.textContent=p.displayName.trim().slice(0,1)||"V",p.avatarUrl&&(D.src=p.avatarUrl,D.alt=`${p.displayName}的头像`,D.hidden=!1,l.hidden=!0)}let E=null,S=!1;const U=m=>{S||(S=!0,this.interaction.signal?.removeEventListener("abort",A),this.dispatchEvent(new CustomEvent("viceme:access-layer-close",{detail:m})))},A=()=>{E?.cancel(),U("dismissed")};this.interaction.signal?.addEventListener("abort",A,{once:!0}),this.interaction.signal?.aborted&&queueMicrotask(A),b.addEventListener("click",A),d.addEventListener("click",A),this.addEventListener("keydown",m=>{if(m.key==="Escape"&&A(),m.key==="Tab"){if(m.preventDefault(),E?.type==="frame"){o.focus();return}const I=[d,...n.hidden?[]:[n]].filter(F=>!F.disabled&&!F.hidden);if(I.length===0)return;const q=I.indexOf(i.activeElement),O=m.shiftKey?-1:1;I[(q+O+I.length)%I.length]?.focus()}});const M=async()=>{n.disabled=!0,n.setAttribute("aria-busy","true"),n.textContent="正在打开…",N.textContent="";try{const m=await this.interaction.perform();if(S||this.interaction.signal?.aborted){m.type!=="completed"&&m.cancel();return}m.type==="frame"?(E=m,a.dataset.frame="true",o.src=m.url,o.focus(),await m.completion):m.type==="external"&&(E=m,await m.completion),U("acted")}catch(m){if(S)return;E?.cancel(),E=null,a.dataset.frame="false",o.removeAttribute("src"),N.textContent=ke(m),n.hidden=!1,n.disabled=!1,n.removeAttribute("aria-busy"),n.textContent=y,n.focus()}};n.addEventListener("click",M),queueMicrotask(()=>n.focus())}}customElements.define(j,t)}const Te=async t=>{if(typeof document>"u"||typeof customElements>"u"||t.signal?.aborted)return"dismissed";Ae();const e=document.createElement(j);e.interaction=t;const r=document.documentElement.style.overflow,i=document.activeElement instanceof HTMLElement?document.activeElement:null;document.documentElement.style.overflow="hidden",document.body.append(e);try{return await new Promise(a=>{e.addEventListener("viceme:access-layer-close",f=>a(f.detail),{once:!0})})}finally{e.remove(),document.documentElement.style.overflow=r,i?.focus()}};function L(t){if(typeof t!="object"||t===null)throw k();return t}function k(){return new w({code:"INTERNAL_ERROR",message:"Malformed public API response.",retryable:!0})}function Se(t){const e=L(t);if(typeof e.id!="string"||!(typeof e.displayName=="string"||e.displayName===null)||!(typeof e.avatarUrl=="string"||e.avatarUrl===null))throw k();return{subject:e.id,nickname:e.displayName,avatarUrl:e.avatarUrl}}function Q(t){const e=L(t);if(typeof e.following!="boolean"||!(typeof e.followedAt=="string"||e.followedAt===null))throw k();const r=L(e.creator);if(typeof r.displayName!="string"||!(typeof r.avatarUrl=="string"||r.avatarUrl===null)||!(typeof r.description=="string"||r.description===null)||!Number.isInteger(r.publishedWorkCount)||r.publishedWorkCount<0)throw k();return{following:e.following,followedAt:e.followedAt,target:{kind:"CREATOR",displayName:r.displayName,avatarUrl:r.avatarUrl,description:r.description,workCount:r.publishedWorkCount}}}function Re(t){const e=L(t),r=new Set(["PUBLIC","OWNER","FOLLOWING","ENTITLED","AUTH_REQUIRED","FOLLOW_REQUIRED","PURCHASE_REQUIRED","FEATURE_NOT_FOUND","FEATURE_DISABLED"]),i=new Set([null,"SIGN_IN","FOLLOW","CHECKOUT"]);if(typeof e.allowed!="boolean"||typeof e.reason!="string"||!r.has(e.reason)||!i.has(e.nextAction))throw k();return{allowed:e.allowed,reason:e.reason,nextAction:e.nextAction}}function Ne(t){const e=L(t);if(typeof e.featureKey!="string"||!/^[a-z][a-z0-9_-]{1,63}$/.test(e.featureKey)||typeof e.title!="string"||e.title.trim().length===0||e.title.length>120||!(e.policyType==="PUBLIC"||e.policyType==="FOLLOW_OWNER"||e.policyType==="WORK_ENTITLEMENT"))throw k();const r=e.price===null?null:L(e.price);if(r!==null&&(!Number.isInteger(r.amountCents)||r.amountCents<=0||r.currency!=="CNY")||e.policyType==="WORK_ENTITLEMENT"!=(r!==null))throw k();return{featureKey:e.featureKey,title:e.title,policy:{type:e.policyType},price:r===null?null:{amountCents:r.amountCents,currency:"CNY"}}}function Oe(){const t=crypto.getRandomValues(new Uint8Array(32));return Le(t)}function Le(t){let e="";for(const r of t)e+=String.fromCharCode(r);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function Ce(){return typeof document<"u"&&document.documentElement.lang.toLowerCase()==="en-us"?"en-US":"zh-CN"}function _e(t){const e=()=>new w({code:"AUTH_CANCELLED",message:"The interactive action was cancelled.",retryable:!1}),r=l=>{if(t.signal.aborted)return Promise.reject(T());let u;const h=new Promise((y,p)=>{u=()=>p(T()),t.signal.addEventListener("abort",u,{once:!0}),t.signal.aborted&&u()});let s;try{s=(t.presenter??Te)({...l,signal:t.signal})}catch(y){s=Promise.reject(y)}return Promise.race([s,h]).then(y=>{if(t.signal.aborted)throw T();return y}).finally(()=>{u&&t.signal.removeEventListener("abort",u)})},i=(l,u,h,s,y,p)=>{if(typeof window>"u")throw new w({code:"CONFIG_INVALID",message:"Interactive access requires a browser window.",retryable:!1});let E=!0,S,U;const A=()=>{E&&(E=!1,window.removeEventListener("message",m))},M=new Promise((R,I)=>{S=R,U=I}),m=R=>{if(!E||R.origin!==u||typeof R.data!="object"||R.data===null)return;const I=R.data;if(!(I.workKey!==t.workKey||I.channel!==h)){if(I.type===`viceme:${s}:ready`){R.source&&"postMessage"in R.source&&R.source.postMessage({type:`viceme:${s}:init`,workKey:t.workKey,channel:h,...y},u);return}if(I.type===`viceme:${s}:cancelled`){A(),U(e());return}I.type===`viceme:${s}:complete`&&(A(),p(I).then(S,U))}};return window.addEventListener("message",m),{type:"frame",url:l,completion:M,cancel(){A(),S()}}},a=async()=>{if(await t.ready(),typeof window>"u")throw new w({code:"CONFIG_INVALID",message:"Interactive access requires a browser window.",retryable:!1});const l=Oe(),u=new URL("/sdk/login",t.widgetOrigin);u.search=new URLSearchParams({workKey:t.workKey,channel:l,parentOrigin:window.location.origin,locale:Ce()}).toString();const h=t.session.snapshot?.token;if(!h)throw k();return i(u.toString(),t.widgetOrigin,l,"auth",{workSessionToken:h},async s=>{if(typeof s.userToken!="string")throw k();t.session.authenticate({userToken:s.userToken,user:Se(s.user)})})},f=async()=>(await t.ready(),Q((await t.session.request({method:"GET",path:"/v1/public/work-sdk/follow"})).body)),n=async()=>(await t.ready(),Q((await t.session.request({method:"PUT",path:"/v1/public/work-sdk/follow"})).body)),c={async getState(){await t.ready();const l=t.session.snapshot?.user??null;return{authenticated:l!==null,user:l}},async signIn(){if(await r({featureKey:"auth",reason:"AUTH_REQUIRED",action:"SIGN_IN",perform:a})==="dismissed")throw e();return this.getState()},async signOut(){await t.ready(),await t.session.signOut()}},d={getState:f,follow:n,unfollow:async()=>{throw new w({code:"CAPABILITY_DISABLED",message:"Unfollow is not exposed by website access.",retryable:!1})}},b=async l=>{await t.ready();const u=L((await t.session.request({method:"POST",path:"/v1/public/work-sdk/access/check",body:{featureKeys:l}})).body),h=L(u.decisions);return Object.fromEntries(Object.entries(h).map(([s,y])=>[s,Re(y)]))},N=async(l,u={})=>{await t.ready();const h={featureKey:l,locale:u.locale??"zh-CN"},s=L((await t.session.request({method:"POST",path:"/v1/public/work-sdk/checkout",body:h})).body);if(typeof s.checkoutUrl!="string"||typeof s.alreadyOwned!="boolean"||!(s.expiresAt===null||typeof s.expiresAt=="string"&&!Number.isNaN(Date.parse(s.expiresAt)))||s.alreadyOwned!==(s.expiresAt===null))throw k();let y;try{y=new URL(s.checkoutUrl)}catch{throw k()}if(!s.alreadyOwned&&(y.protocol!=="https:"||y.origin!==t.widgetOrigin))throw k();return{checkoutUrl:s.checkoutUrl,alreadyOwned:s.alreadyOwned,expiresAt:s.expiresAt}},o=(l,u)=>{if(l.alreadyOwned)return{type:"completed"};const h=Date.parse(l.expiresAt);if(typeof window>"u")throw new w({code:"CONFIG_INVALID",message:"Hosted checkout requires a browser window.",retryable:!1});let s=!0,y,p,E,S;const U=new Promise((O,F)=>{E=O,S=F}),A=()=>{y&&clearTimeout(y),p&&clearTimeout(p),document.removeEventListener("visibilitychange",I)},M=()=>{s&&(s=!1,A(),S(new w({code:"SESSION_EXPIRED",message:"Hosted checkout session expired.",retryable:!0})))},m=()=>{if(!s||document.visibilityState==="hidden")return;const O=h-t.now();if(O<=0){M();return}y=setTimeout(()=>{R()},Math.min(1500,O))},R=async()=>{if(s)try{const O=(await b([u]))[u];if(!O)throw k();if(O.allowed){s=!1,A(),E();return}m()}catch(O){s=!1,A(),S(O)}};function I(){if(s){if(document.visibilityState==="hidden"){y&&clearTimeout(y),y=void 0;return}m()}}document.addEventListener("visibilitychange",I);const q=h-t.now();return q<=0?M():(p=setTimeout(M,q),m()),{type:"frame",url:l.checkoutUrl,completion:U,cancel(){s&&(s=!1,A(),E())}}};return{auth:c,follow:d,access:{async getFeatures(){await t.ready();const l=L((await t.session.request({method:"GET",path:"/v1/public/work-sdk/access/features"})).body);if(!Array.isArray(l.features)||l.features.length>100)throw k();return l.features.map(Ne)},async check(l){const h=(await b([l]))[l];if(!h)throw k();return h},checkMany:b,async require(l){let u=await this.check(l);for(let h=0;!u.allowed&&u.nextAction&&h<3;h+=1){const s=u.nextAction,y=s==="FOLLOW"?(await d.getState()).target:void 0,p=s==="CHECKOUT"?await N(l):void 0;if(p?.alreadyOwned){u=await this.check(l);continue}if(await r({featureKey:l,reason:u.reason,action:s,...y?{followTarget:y}:{},perform:async()=>s==="SIGN_IN"?a():s==="FOLLOW"?(await d.follow(),{type:"completed"}):o(p,l)})==="dismissed")return u;u=await this.check(l)}return u},async refresh(){await t.ready()}},checkout:{async open(l){const u=await N(l.featureKey,l);if(u.alreadyOwned)return u;if(await r({featureKey:l.featureKey,reason:"PURCHASE_REQUIRED",action:"CHECKOUT",perform:async()=>o(u,l.featureKey)})==="dismissed")throw e();return u}}}}function J(t){t instanceof Z&&t.markDegraded()}class De extends DOMException{constructor(){super("ViceMe client destroyed.","AbortError")}}class Z{#e=new we;#t;#r;#i=new AbortController;#n;auth;access;checkout;#a;constructor(e){this.#r=e.config,this.#t=new Ee({workKey:e.config.workKey,transport:e.transport,signal:this.#i.signal,...e.now!==void 0?{now:e.now}:{}});const r=_e({session:this.#t,workKey:e.config.workKey,widgetOrigin:oe[e.config.region],now:e.now??(()=>Date.now()),presenter:e.presenter,signal:this.#i.signal,ready:()=>this.#s()});this.auth=r.auth,this.access=r.access,this.checkout=r.checkout;const i=e.config.signal;if(i){const a=()=>{this.#i.abort(i.reason instanceof Error?i.reason:new DOMException("Caller signal aborted.","AbortError"))};i.aborted?a():(i.addEventListener("abort",a,{once:!0}),this.#a=()=>{i.removeEventListener("abort",a)})}}get version(){return X}get workKey(){return this.#r.workKey}get region(){return this.#r.region}get state(){return this.#e.state}get apiMajor(){return K}ready(){return this.#e.destroyed?Promise.reject(T()):(this.#n||(this.#e.transition("READY"),this.#n=Promise.resolve()),this.#n)}async#s(){if(this.#e.destroyed)throw T();await this.ready();try{if(await this.#t.establish(),this.#e.destroyed)throw T()}catch(e){throw this.#e.destroyed?T():(this.#t.invalidate(),e)}}hasCapability(e){if(this.#e.destroyed)return!1;const r=this.#t.snapshot?.work.capabilities;return e==="danmaku"||e==="tip"||r?.includes(e)===!0}get capabilities(){return this.#t.snapshot?.work.capabilities??[]}markDegraded(){this.#e.state==="READY"&&this.#e.transition("DEGRADED")}get sessionSnapshot(){return this.#t.snapshot}destroy(){this.#e.destroyed||(this.#e.transition("DESTROYED"),this.#i.abort(new De),this.#t.destroy(),this.#e.clearListeners(),this.#n=void 0,this.#a?.(),this.#a=void 0)}}const Ue=1e4,Me=new Map([[400,"CONFIG_INVALID"],[401,"SESSION_EXPIRED"],[403,"CAPABILITY_DISABLED"],[404,"WORK_NOT_FOUND"],[409,"CONFIG_INVALID"],[422,"CONFIG_INVALID"],[429,"RATE_LIMITED"]]),xe=new Set(["CONFIG_INVALID","WORK_NOT_FOUND","CAPABILITY_DISABLED","SESSION_EXPIRED","AUTH_REQUIRED","AUTH_CANCELLED","RETURN_URL_NOT_ALLOWED","RATE_LIMITED","NETWORK_TIMEOUT","CHECKOUT_UNAVAILABLE","INTERNAL_ERROR"]);function Ke(t){if(typeof t!="object"||t===null)return{};const e=t,r=typeof e.error=="object"&&e.error!==null?e.error:e,i={};return typeof r.code=="string"&&xe.has(r.code)&&(i.code=r.code),typeof r.message=="string"&&(i.message=r.message.slice(0,200)),typeof r.retryable=="boolean"&&(i.retryable=r.retryable),typeof r.requestId=="string"&&(i.requestId=r.requestId),i}function Pe(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`req-${Math.random().toString(36).slice(2)}`}class qe{#e;#t;#r;#i;constructor(e){this.#e=e.apiBaseUrl.replace(/\/+$/,""),this.#t=e.fetchImpl??globalThis.fetch.bind(globalThis),this.#r=e.defaultTimeoutMs??Ue,this.#i=e.generateRequestId??Pe}async request(e){if(e.signal?.aborted)throw this.#n(e.signal);const r=e.timeoutMs??this.#r,i=new AbortController;let a=!1;const f=setTimeout(()=>{a=!0,i.abort(new ee)},r),n=()=>i.abort(new ee(!1));e.signal?.addEventListener("abort",n,{once:!0});const c=this.#i();try{const d=await this.#t(`${this.#e}${e.path}`,{method:e.method,credentials:"omit",mode:"cors",headers:{"content-type":"application/json","x-client-request-id":c,...e.authorization!==void 0?{authorization:`Bearer ${e.authorization}`}:{},...e.userAuthorization!==void 0?{"x-viceme-user-token":e.userAuthorization}:{}},body:e.body!==void 0?JSON.stringify(e.body):void 0,signal:i.signal});let b;try{b=await d.json()}catch(o){if(e.signal?.aborted||a)throw o;b=void 0}const N=d.headers.get("x-request-id")??void 0;if(!d.ok){const o=Ke(b),_=o.code??Me.get(d.status)??"INTERNAL_ERROR";throw new w({code:_,message:o.message??"Public API request failed.",retryable:o.retryable,requestId:o.requestId??N})}return{status:d.status,body:b,requestId:N}}catch(d){throw e.signal?.aborted?this.#n(e.signal):a?new w({code:"NETWORK_TIMEOUT",message:"Public API request timed out.",retryable:!0,requestId:c}):d instanceof w?d:d instanceof DOMException&&d.name==="AbortError"?new DOMException("ViceMe request aborted by caller.","AbortError"):new w({code:"INTERNAL_ERROR",message:"Public API request failed.",retryable:!0,requestId:c})}finally{clearTimeout(f),e.signal?.removeEventListener("abort",n)}}#n(e){return e.reason instanceof Error?e.reason:new DOMException("ViceMe request aborted by caller.","AbortError")}}function Fe(t){return new qe(t)}class ee extends DOMException{constructor(e=!0){super(e?"ViceMe request timed out.":"ViceMe request aborted.","AbortError")}}function $e(t){const e=de(t),r=le(e.region),i=Fe({apiBaseUrl:r});return new Z({config:e,transport:i})}const je=8e3,Be=8e3,te={danmaku:"danmaku.js",tip:"tip.js"},Ve={danmaku:"mountDanmaku",tip:"mountTip"},re=Symbol.for("viceme.loader.state.v1");function v(){const e=globalThis[re];if(e)return e;const r={registry:new he,queue:{current:Promise.resolve()}};return Object.defineProperty(globalThis,re,{value:r,writable:!0,configurable:!0,enumerable:!1}),r}function V(t){if(!t.destroyed){t.destroyed=!0,v().registry.removeInstance(t.instanceKey);try{t.raw.destroy()}finally{P(t.host,"viceme:destroyed",{clientKey:t.clientKey,instanceKey:t.instanceKey,capability:t.capability})}}}function We(t){return{instanceKey:t.instanceKey,capability:t.capability,destroy:()=>V(t)}}function W(t,e,r){Object.defineProperty(t,e,{value:r,writable:!0,configurable:!0,enumerable:!1})}function Ge(t){let r=globalThis.ViceMe;r||(r={},W(globalThis,"ViceMe",r));let i=r.versions;i||(i={},W(r,"versions",i));const a=i[`v${K}`];if(a)return a;const f={version:t,whenReady(n){const c=v().registry.getClient(n);return c?c.ready.then(()=>c.client):Promise.reject(g(`Unknown clientKey "${n}".`))},getInstance(n){const c=v().registry.getInstance(n);return c?We(c):void 0},destroyInstance(n){const c=v().registry.getInstance(n);c&&V(c)},destroyClient(n){for(const d of v().registry.instancesForClient(n))V(d);const c=v().registry.getClient(n);for(const d of c?.pendingMounts??[])d.abort();v().registry.unregisterClient(n),c?.client.destroy()}};return W(i,`v${K}`,f),f}function He(){return document.readyState!=="loading"?Promise.resolve():new Promise(t=>{document.addEventListener("DOMContentLoaded",()=>t(),{once:!0})})}async function Ye(t){const e=new AbortController,r=globalThis.setTimeout(()=>e.abort(),je);try{let i;try{i=await fetch(t,{credentials:"omit",signal:e.signal})}catch{if(e.signal.aborted)throw new w({code:"INTERNAL_ERROR",message:"Release manifest request timed out.",retryable:!0});i={ok:!1,status:0}}return{manifest:await ze(i),baseUrl:t}}finally{globalThis.clearTimeout(r)}}async function ze(t){if(!t.ok)throw g(`Release manifest is not available (HTTP ${t.status}).`);const e=await t.json();if(typeof e!="object"||e===null||typeof e.version!="string"||typeof e.apiMajor!="number"||typeof e.features!="object"||e.features===null)throw g("Release manifest is malformed.");const r=e;if(r.version!==X)throw g("Release manifest version does not match this loader.");if(r.apiMajor!==K)throw g("Release manifest major version does not match this loader.");const i=Object.keys(r.features).sort();if(i.length!==2||i[0]!=="danmaku"||i[1]!=="tip"||r.features.danmaku!==te.danmaku||r.features.tip!==te.tip)throw g("Release manifest features must be exactly danmaku.js and tip.js.");return r}const Xe=new Set(["CONFIG_INVALID","CAPABILITY_DISABLED","CLIENT_DESTROYED","INTERNAL_ERROR"]);function Qe(t){if(typeof t=="object"&&t!==null){const e=t;if(typeof e.code=="string"&&Xe.has(e.code)&&typeof e.retryable=="boolean"){const r={code:e.code,retryable:e.retryable};return typeof e.requestId=="string"&&(r.requestId=e.requestId),typeof e.capability=="string"&&(r.capability=e.capability),r}}return{code:"INTERNAL_ERROR",retryable:!0}}function C(t,e,r={}){P(t,"viceme:error",{...Qe(e),...r})}function Je(t,e,r){let i,a;const f=new Promise((n,c)=>{if(a=()=>c(T()),e.signal.aborted){a();return}e.signal.addEventListener("abort",a,{once:!0}),i=globalThis.setTimeout(()=>{c(new w({code:"INTERNAL_ERROR",message:`Capability "${r}" did not load and mount in time.`,retryable:!0,capability:r})),e.abort()},Be)});return Promise.race([t,f]).finally(()=>{i!==void 0&&globalThis.clearTimeout(i),a&&e.signal.removeEventListener("abort",a)})}async function Ze(t){let e;try{e=me(t)}catch(o){C(document,o);return}if(!t.src){C(document,g("Loader script requires a src URL."));return}const r=new URL("manifest.json",t.src);let i,a;try{({manifest:i,baseUrl:a}=await Ye(r))}catch(o){C(document,o,{clientKey:$(K,e.region,e.workKey)});return}await He();let f;try{const o=document.querySelectorAll(e.target);if(o.length===0)throw g(`Loader target "${e.target}" matched no element; no node was created.`);if(o.length>1)throw g(`Loader target "${e.target}" matched ${o.length} elements; exactly one is required.`);f=o[0]}catch(o){C(document,o,{clientKey:$(i.apiMajor,e.region,e.workKey)});return}const n=$(i.apiMajor,e.region,e.workKey);Ge(i.version);let c=v().registry.getClient(n),d;if(c)d=c.client;else{try{d=$e({workKey:e.workKey,region:e.region})}catch(_){C(f,_,{clientKey:n});return}const o=d.ready();o.catch(()=>{}),c={clientKey:n,client:d,ready:o,pendingMounts:new Set},v().registry.registerClient(c)}try{await c.ready}catch(o){v().registry.unregisterClient(n),d.destroy(),C(f,o,{clientKey:n});return}if(v().registry.getClient(n)!==c)return;const b=async o=>{if(v().registry.findInstance(n,o,f))return;const _=i.features[o];if(typeof _!="string"){J(d),C(f,new w({code:"CAPABILITY_DISABLED",message:`Capability "${o}" is not part of this release.`,retryable:!1,capability:o}),{clientKey:n,capability:o});return}const D=new AbortController;c.pendingMounts.add(D);try{const l=(async()=>{const y=await import(new URL(_,a).href),p=Ve[o],E=y[p];if(typeof E!="function")throw g(`Capability chunk "${o}" does not export ${p}().`);if(v().registry.getClient(n)!==c)throw T();return await E(d,{target:f,theme:e.theme,signal:D.signal})})(),u=await Je(l,D,o);if(v().registry.getClient(n)!==c){u.destroy();return}const h=v().registry.registerInstance(n,o,f,u);return P(f,"viceme:capability-ready",{clientKey:n,instanceKey:h.instanceKey,capability:o,version:i.version}),o}catch(l){if(v().registry.getClient(n)!==c)return;J(d),C(f,l,{clientKey:n,capability:o});return}finally{c.pendingMounts.delete(D)}},N=(await Promise.all(e.features.map(b))).filter(o=>o!==void 0);N.length>0&&v().registry.getClient(n)===c&&P(f,"viceme:ready",{clientKey:n,workKey:e.workKey,capabilities:N,version:i.version})}function et(t){const{queue:e}=v(),r=e.current.then(()=>Ze(t));return e.current=r.catch(()=>{}),r}function ie(){if(typeof document>"u")return;let t=document.currentScript instanceof HTMLScriptElement?document.currentScript:null;if(!t){const e=document.querySelectorAll("script[data-viceme-loader]");e.length===1&&(t=e[0]??null)}t&&et(t).catch(e=>{C(document,e)})}ie();const tt=ie})();
216
216
  //# sourceMappingURL=viceme.min.js.map