@viceme-ai/sdk 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -25
- package/dist/bootstrap.min.js +1 -1
- package/dist/bootstrap.min.js.map +1 -1
- package/dist/chunks/version-BbUa2jZV.js +38 -0
- package/dist/chunks/version-BbUa2jZV.js.map +1 -0
- package/dist/core/build-endpoints.d.ts +6 -0
- package/dist/core/build-endpoints.d.ts.map +1 -0
- package/dist/core/client.d.ts +9 -23
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/config.d.ts +4 -14
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/lifecycle.d.ts +2 -4
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/danmaku/anchor.d.ts +14 -0
- package/dist/danmaku/anchor.d.ts.map +1 -0
- package/dist/danmaku/index.d.ts +12 -0
- package/dist/danmaku/index.d.ts.map +1 -0
- package/dist/danmaku/mount.d.ts +5 -0
- package/dist/danmaku/mount.d.ts.map +1 -0
- package/dist/danmaku.js +202 -0
- package/dist/danmaku.js.map +1 -0
- package/dist/generated/public-contract.d.ts +68 -56
- package/dist/generated/public-contract.d.ts.map +1 -1
- package/dist/index.d.ts +3 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +96 -111
- package/dist/index.js.map +1 -1
- package/dist/loader/attributes.d.ts +1 -1
- package/dist/loader/attributes.d.ts.map +1 -1
- package/dist/loader/auto-loader.d.ts +6 -6
- package/dist/loader/auto-loader.d.ts.map +1 -1
- package/dist/loader/mount-handle.d.ts +2 -2
- package/dist/loader/mount-handle.d.ts.map +1 -1
- package/dist/loader/registry.d.ts +2 -2
- package/dist/manifest.json +27 -25
- package/dist/version.d.ts +1 -1
- package/dist/viceme.min.js +1 -1
- package/dist/viceme.min.js.map +1 -1
- package/package.json +7 -8
- package/dist/chunks/client-CfKmb4Lm.js +0 -275
- package/dist/chunks/client-CfKmb4Lm.js.map +0 -1
- package/dist/session/session.d.ts +0 -54
- package/dist/session/session.d.ts.map +0 -1
- package/dist/testing/test-adapter.d.ts +0 -57
- package/dist/testing/test-adapter.d.ts.map +0 -1
- package/dist/testing.d.ts +0 -9
- package/dist/testing.d.ts.map +0 -1
- package/dist/testing.js +0 -69
- package/dist/testing.js.map +0 -1
- package/dist/transport/transport.d.ts +0 -42
- package/dist/transport/transport.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"danmaku.js","sources":["../src/core/build-endpoints.ts","../src/danmaku/anchor.ts","../src/danmaku/mount.ts","../src/danmaku/index.ts"],"sourcesContent":["declare const __VICEME_BUILD_CN_WIDGET_ORIGIN__: string | undefined;\ndeclare const __VICEME_BUILD_GLOBAL_WIDGET_ORIGIN__: string | undefined;\n\n/** Hosted Shop origins baked into immutable release artifacts. */\nexport const BUILD_WIDGET_ORIGINS = {\n cn:\n typeof __VICEME_BUILD_CN_WIDGET_ORIGIN__ === 'string'\n ? __VICEME_BUILD_CN_WIDGET_ORIGIN__\n : 'https://viceme.cn',\n global:\n typeof __VICEME_BUILD_GLOBAL_WIDGET_ORIGIN__ === 'string'\n ? __VICEME_BUILD_GLOBAL_WIDGET_ORIGIN__\n : 'https://viceme.ai',\n} as const;\n","export interface DanmakuPageAnchor {\n /** Stable page-and-position key sent to the hosted danmaku runtime. */\n anchorKey: string;\n /** Human-readable 10% scroll bucket, useful for diagnostics. */\n scrollBucket: string;\n}\n\n/**\n * Build a stable page-position anchor without exposing the page URL.\n *\n * Canonical URLs and SPA hash routes participate in the local hash. Only the\n * resulting opaque key leaves the host page.\n */\nexport function readDanmakuPageAnchor(\n windowObject: Window = window,\n documentObject: Document = document,\n): DanmakuPageAnchor {\n const pageUrl = canonicalPageUrl(windowObject, documentObject);\n const bucket = scrollBucket(windowObject, documentObject);\n return {\n anchorKey: `page:${hashString(pageUrl)}:scroll:${bucket}`,\n scrollBucket: bucket,\n };\n}\n\nfunction canonicalPageUrl(windowObject: Window, documentObject: Document): string {\n const canonical = documentObject.querySelector<HTMLLinkElement>('link[rel=\"canonical\"][href]');\n const rawUrl = canonical?.href || windowObject.location.href;\n try {\n const url = new URL(rawUrl, windowObject.location.href);\n url.username = '';\n url.password = '';\n if (canonical && !url.hash && windowObject.location.hash) {\n url.hash = windowObject.location.hash;\n }\n return url.toString();\n } catch {\n return windowObject.location.href;\n }\n}\n\nfunction scrollBucket(windowObject: Window, documentObject: Document): string {\n const root = documentObject.documentElement;\n const body = documentObject.body;\n const scrollTop =\n windowObject.scrollY || windowObject.pageYOffset || root.scrollTop || body?.scrollTop || 0;\n const scrollHeight = Math.max(\n root.scrollHeight,\n root.offsetHeight,\n root.clientHeight,\n body?.scrollHeight ?? 0,\n body?.offsetHeight ?? 0,\n );\n const maxScroll = Math.max(0, scrollHeight - windowObject.innerHeight);\n if (maxScroll <= 1) return '0-100';\n\n const percent = Math.max(0, Math.min(99, (scrollTop / maxScroll) * 100));\n const start = Math.min(90, Math.floor(percent / 10) * 10);\n return `${start}-${start + 10}`;\n}\n\n/** Deterministic 64-bit-style hash encoded as at most 16 base36 characters. */\nfunction hashString(value: string): string {\n let high = 0xdeadbeef ^ value.length;\n let low = 0x41c6ce57 ^ value.length;\n for (let index = 0; index < value.length; index += 1) {\n const character = value.charCodeAt(index);\n high = Math.imul(high ^ character, 2654435761);\n low = Math.imul(low ^ character, 1597334677);\n }\n high = Math.imul(high ^ (high >>> 16), 2246822507);\n high ^= Math.imul(low ^ (low >>> 13), 3266489909);\n low = Math.imul(low ^ (low >>> 16), 2246822507);\n low ^= Math.imul(high ^ (high >>> 13), 3266489909);\n return (\n (low >>> 0).toString(36).padStart(7, '0') + (high >>> 0).toString(36).padStart(7, '0')\n ).slice(0, 16);\n}\n","import type { ViceMeClient } from '../core/client.ts';\nimport { BUILD_WIDGET_ORIGINS } from '../core/build-endpoints.ts';\nimport { ViceMeError } from '../core/errors.ts';\nimport type { CapabilityMountHandle, CapabilityMountOptions } from '../loader/mount-handle.ts';\nimport { SDK_VERSION } from '../version.ts';\nimport { readDanmakuPageAnchor, type DanmakuPageAnchor } from './anchor.ts';\n\ntype DanmakuFrameMode = 'stage' | 'controls' | 'modal';\n\ninterface DanmakuBridgeMessage {\n source?: unknown;\n action?: unknown;\n frameToken?: unknown;\n mode?: unknown;\n width?: unknown;\n height?: unknown;\n}\n\nconst CONTROLS_MIN_SIZE = 32;\nconst CONTROLS_BAR_HEIGHT = 56;\nconst CONTROLS_MAX_HEIGHT = 360;\nconst CONTROLS_MAX_WIDTH = 480;\nconst ANCHOR_DEBOUNCE_MS = 120;\nconst LOCATION_POLL_MS = 1_000;\nexport const FRAME_READY_TIMEOUT_MS = 8_000;\n\nexport async function mount(\n client: ViceMeClient,\n options: CapabilityMountOptions,\n): Promise<CapabilityMountHandle> {\n await client.ready();\n if (!client.hasCapability('danmaku')) {\n throw new ViceMeError({\n code: 'CAPABILITY_DISABLED',\n message: 'Danmaku is not available in this SDK build.',\n retryable: false,\n capability: 'danmaku',\n });\n }\n\n const documentObject = options.target.ownerDocument;\n const windowObject = documentObject.defaultView;\n if (!windowObject) {\n throw new ViceMeError({\n code: 'CONFIG_INVALID',\n message: 'Danmaku requires a browser document.',\n retryable: false,\n capability: 'danmaku',\n });\n }\n\n const widgetOrigin = BUILD_WIDGET_ORIGINS[client.region];\n let currentAnchor = readDanmakuPageAnchor(windowObject, documentObject);\n const locale =\n documentObject.documentElement.lang.trim() || windowObject.navigator.language || 'en';\n let destroyed = false;\n let anchorTimer: number | undefined;\n let readyTimer: number | undefined;\n let modalReadyTimer: number | undefined;\n let initialFramesReady = false;\n let modalAttempt = 0;\n let modalFrameToken = '';\n let modalReady = false;\n const loadedFrames = new WeakSet<HTMLIFrameElement>();\n const readyModes = new Set<DanmakuFrameMode>();\n\n const portal = documentObject.createElement('div');\n portal.dataset.vicemeDanmaku = 'mounted';\n portal.style.all = 'initial';\n portal.style.position = 'fixed';\n portal.style.inset = '0';\n portal.style.width = '100%';\n portal.style.height = '100%';\n portal.style.pointerEvents = 'none';\n portal.style.zIndex = '2147483000';\n portal.style.contain = 'layout style size';\n\n const shadow = portal.attachShadow({ mode: 'open' });\n const root = documentObject.createElement('div');\n root.style.boxSizing = 'border-box';\n root.style.position = 'fixed';\n root.style.inset = '0';\n root.style.width = '100%';\n root.style.height = '100%';\n root.style.pointerEvents = 'none';\n shadow.append(root);\n\n const frameUrl = (mode: DanmakuFrameMode): URL => {\n const url = new URL('/embed/danmaku', widgetOrigin);\n url.searchParams.set('mode', mode);\n url.searchParams.set('workKey', client.workKey);\n url.searchParams.set('theme', options.theme);\n url.searchParams.set('locale', locale);\n url.searchParams.set('sdk', SDK_VERSION);\n url.searchParams.set('anchorKey', currentAnchor.anchorKey);\n return url;\n };\n\n const createFrame = (\n mode: DanmakuFrameMode,\n title: string,\n source: string,\n ): HTMLIFrameElement => {\n const frame = documentObject.createElement('iframe');\n frame.title = title;\n frame.src = source;\n frame.loading = 'eager';\n frame.referrerPolicy = 'no-referrer';\n frame.setAttribute('allowtransparency', 'true');\n frame.setAttribute(\n 'sandbox',\n 'allow-forms allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts',\n );\n frame.dataset.mode = mode;\n frame.style.boxSizing = 'border-box';\n frame.style.colorScheme = 'normal';\n frame.style.position = 'fixed';\n frame.style.margin = '0';\n frame.style.border = '0';\n frame.style.background = 'transparent';\n frame.style.width = '100%';\n frame.style.zIndex = '2147483000';\n return frame;\n };\n\n const stage = createFrame('stage', 'ViceMe Danmaku', frameUrl('stage').toString());\n stage.setAttribute('aria-hidden', 'true');\n stage.style.inset = '0';\n stage.style.height = '100%';\n stage.style.pointerEvents = 'none';\n\n const controls = createFrame(\n 'controls',\n 'ViceMe Danmaku controls',\n frameUrl('controls').toString(),\n );\n controls.style.left = '50%';\n controls.style.bottom = 'env(safe-area-inset-bottom, 0px)';\n controls.style.maxWidth = `${CONTROLS_MAX_WIDTH}px`;\n controls.style.transform = 'translateX(-50%)';\n let controlsRequestedWidth = CONTROLS_MAX_WIDTH;\n let controlsRequestedHeight = CONTROLS_BAR_HEIGHT;\n const applyControlsSize = (): void => {\n const viewportWidth = Math.max(\n CONTROLS_MIN_SIZE,\n Math.floor(windowObject.innerWidth || CONTROLS_MAX_WIDTH),\n );\n controls.style.width = `${Math.min(controlsRequestedWidth, viewportWidth)}px`;\n controls.style.height = `${controlsRequestedHeight}px`;\n };\n applyControlsSize();\n controls.style.pointerEvents = 'none';\n\n const modal = createFrame('modal', 'ViceMe Danmaku dialog', 'about:blank');\n modal.dataset.src = frameUrl('modal').toString();\n modal.style.inset = '0';\n modal.style.height = '100%';\n modal.style.display = 'none';\n modal.style.pointerEvents = 'none';\n\n root.append(stage, controls, modal);\n\n const postAnchor = (frame: HTMLIFrameElement): void => {\n if (!loadedFrames.has(frame)) return;\n frame.contentWindow?.postMessage(\n {\n source: 'viceme-danmaku',\n action: 'anchor-change',\n anchorKey: currentAnchor.anchorKey,\n },\n widgetOrigin,\n );\n };\n const postAnchorToMountedFrames = (): void => {\n postAnchor(stage);\n postAnchor(controls);\n if (modal.getAttribute('src') !== 'about:blank') postAnchor(modal);\n };\n\n const refreshAnchor = (): DanmakuPageAnchor => {\n if (destroyed) return currentAnchor;\n const next = readDanmakuPageAnchor(windowObject, documentObject);\n if (next.anchorKey !== currentAnchor.anchorKey) {\n currentAnchor = next;\n postAnchorToMountedFrames();\n }\n return currentAnchor;\n };\n const scheduleAnchorRefresh = (): void => {\n if (anchorTimer !== undefined) windowObject.clearTimeout(anchorTimer);\n anchorTimer = windowObject.setTimeout(refreshAnchor, ANCHOR_DEBOUNCE_MS);\n };\n const handleWindowResize = (): void => {\n applyControlsSize();\n scheduleAnchorRefresh();\n };\n\n const frameLoaded = (event: Event): void => {\n const frame = event.currentTarget as HTMLIFrameElement;\n if (frame.getAttribute('src') === 'about:blank') return;\n loadedFrames.add(frame);\n postAnchor(frame);\n };\n stage.addEventListener('load', frameLoaded);\n controls.addEventListener('load', frameLoaded);\n modal.addEventListener('load', frameLoaded);\n\n const hideModal = (resetFrame = false): void => {\n if (modalReadyTimer !== undefined) {\n windowObject.clearTimeout(modalReadyTimer);\n modalReadyTimer = undefined;\n }\n modal.style.display = 'none';\n modal.style.pointerEvents = 'none';\n if (resetFrame) {\n modalFrameToken = '';\n modalReady = false;\n loadedFrames.delete(modal);\n modal.src = 'about:blank';\n }\n };\n\n let resolveInitialFrames: (() => void) | undefined;\n const initialFrameReadiness = new Promise<void>((resolve, reject) => {\n resolveInitialFrames = resolve;\n readyTimer = windowObject.setTimeout(() => {\n reject(\n new ViceMeError({\n code: 'INTERNAL_ERROR',\n message: 'Hosted danmaku frames did not become ready in time.',\n retryable: true,\n capability: 'danmaku',\n }),\n );\n }, FRAME_READY_TIMEOUT_MS);\n });\n\n const onMessage = (event: MessageEvent): void => {\n if (event.origin !== widgetOrigin) return;\n const fromStage = event.source === stage.contentWindow;\n const fromControls = event.source === controls.contentWindow;\n const fromModal = event.source === modal.contentWindow;\n if (!fromStage && !fromControls && !fromModal) return;\n\n const message = event.data as DanmakuBridgeMessage | null;\n if (!message || message.source !== 'viceme-danmaku') return;\n\n const sourceMode: DanmakuFrameMode = fromModal ? 'modal' : fromStage ? 'stage' : 'controls';\n if (message.action === 'frame-ready') {\n if (message.mode !== sourceMode) return;\n if (sourceMode === 'modal') {\n if (message.frameToken !== modalFrameToken) return;\n modalReady = true;\n if (modalReadyTimer !== undefined) {\n windowObject.clearTimeout(modalReadyTimer);\n modalReadyTimer = undefined;\n }\n if (modal.style.display === 'block') modal.style.pointerEvents = 'auto';\n return;\n }\n readyModes.add(sourceMode);\n if (readyModes.has('stage') && readyModes.has('controls') && !initialFramesReady) {\n initialFramesReady = true;\n if (readyTimer !== undefined) {\n windowObject.clearTimeout(readyTimer);\n readyTimer = undefined;\n }\n controls.style.pointerEvents = 'auto';\n resolveInitialFrames?.();\n }\n return;\n }\n if (message.action === 'resize-controls' && fromControls) {\n if (\n typeof message.width !== 'number' ||\n !Number.isInteger(message.width) ||\n message.width < CONTROLS_MIN_SIZE ||\n message.width > CONTROLS_MAX_WIDTH ||\n typeof message.height !== 'number' ||\n !Number.isInteger(message.height) ||\n message.height < CONTROLS_MIN_SIZE ||\n message.height > CONTROLS_MAX_HEIGHT\n ) {\n return;\n }\n controlsRequestedWidth = message.width;\n controlsRequestedHeight = message.height;\n applyControlsSize();\n }\n if (message.action === 'request-anchor') {\n postAnchor(fromModal ? modal : fromStage ? stage : controls);\n }\n if (message.action === 'open-modal' && fromControls) {\n if (!initialFramesReady) return;\n if (modal.getAttribute('src') === 'about:blank') {\n modalAttempt += 1;\n modalFrameToken = String(modalAttempt);\n const modalUrl = new URL(modal.dataset.src ?? 'about:blank');\n modalUrl.searchParams.set('frameToken', modalFrameToken);\n modal.src = modalUrl.toString();\n }\n modal.style.display = 'block';\n modal.style.pointerEvents = modalReady ? 'auto' : 'none';\n if (!modalReady) {\n if (modalReadyTimer !== undefined) windowObject.clearTimeout(modalReadyTimer);\n modalReadyTimer = windowObject.setTimeout(() => hideModal(true), FRAME_READY_TIMEOUT_MS);\n }\n }\n if (message.action === 'close-modal' && (fromModal || fromControls)) {\n hideModal(!modalReady);\n }\n };\n\n const locationPoll = windowObject.setInterval(refreshAnchor, LOCATION_POLL_MS);\n const cleanup = (): void => {\n if (destroyed) return;\n destroyed = true;\n if (anchorTimer !== undefined) windowObject.clearTimeout(anchorTimer);\n if (readyTimer !== undefined) windowObject.clearTimeout(readyTimer);\n if (modalReadyTimer !== undefined) windowObject.clearTimeout(modalReadyTimer);\n windowObject.clearInterval(locationPoll);\n windowObject.removeEventListener('message', onMessage);\n windowObject.removeEventListener('scroll', scheduleAnchorRefresh);\n windowObject.removeEventListener('resize', handleWindowResize);\n windowObject.removeEventListener('popstate', scheduleAnchorRefresh);\n windowObject.removeEventListener('hashchange', scheduleAnchorRefresh);\n stage.removeEventListener('load', frameLoaded);\n controls.removeEventListener('load', frameLoaded);\n modal.removeEventListener('load', frameLoaded);\n portal.remove();\n };\n\n windowObject.addEventListener('message', onMessage);\n windowObject.addEventListener('scroll', scheduleAnchorRefresh, { passive: true });\n windowObject.addEventListener('resize', handleWindowResize);\n windowObject.addEventListener('popstate', scheduleAnchorRefresh);\n windowObject.addEventListener('hashchange', scheduleAnchorRefresh);\n try {\n options.target.appendChild(portal);\n postAnchorToMountedFrames();\n await initialFrameReadiness;\n } catch (error) {\n cleanup();\n throw error;\n }\n\n return {\n capability: 'danmaku',\n destroy: cleanup,\n };\n}\n","import type { ViceMeClient } from '../core/client.ts';\nimport { mount } from './mount.ts';\n\nexport interface DanmakuMountOptions {\n target: Element;\n theme: 'light' | 'dark' | 'auto';\n}\n\nexport interface DanmakuMountHandle {\n readonly capability: 'danmaku';\n destroy(): void;\n}\n\nconst mounts = new WeakMap<ViceMeClient, WeakMap<Element, Promise<DanmakuMountHandle>>>();\n\n/** Explicit ESM/npm entry point; the CDN loader calls the same mount function. */\nexport function mountDanmaku(\n client: ViceMeClient,\n options: DanmakuMountOptions,\n): Promise<DanmakuMountHandle> {\n let byTarget = mounts.get(client);\n if (!byTarget) {\n byTarget = new WeakMap();\n mounts.set(client, byTarget);\n }\n const existing = byTarget.get(options.target);\n if (existing) return existing;\n\n const pending: Promise<DanmakuMountHandle> = mount(client, options)\n .then((raw) => {\n let destroyed = false;\n return {\n capability: 'danmaku' as const,\n destroy(): void {\n if (destroyed) return;\n destroyed = true;\n if (byTarget.get(options.target) === pending) byTarget.delete(options.target);\n raw.destroy();\n },\n };\n })\n .catch((error: unknown) => {\n if (byTarget.get(options.target) === pending) byTarget.delete(options.target);\n throw error;\n });\n byTarget.set(options.target, pending);\n return pending;\n}\n"],"names":["BUILD_WIDGET_ORIGINS","readDanmakuPageAnchor","windowObject","documentObject","pageUrl","canonicalPageUrl","bucket","scrollBucket","hashString","canonical","rawUrl","url","root","body","scrollTop","scrollHeight","maxScroll","percent","start","value","high","low","index","character","CONTROLS_MIN_SIZE","CONTROLS_BAR_HEIGHT","CONTROLS_MAX_HEIGHT","CONTROLS_MAX_WIDTH","ANCHOR_DEBOUNCE_MS","LOCATION_POLL_MS","FRAME_READY_TIMEOUT_MS","mount","client","options","ViceMeError","widgetOrigin","currentAnchor","locale","destroyed","anchorTimer","readyTimer","modalReadyTimer","initialFramesReady","modalAttempt","modalFrameToken","modalReady","loadedFrames","readyModes","portal","shadow","frameUrl","mode","SDK_VERSION","createFrame","title","source","frame","stage","controls","controlsRequestedWidth","controlsRequestedHeight","applyControlsSize","viewportWidth","modal","postAnchor","postAnchorToMountedFrames","refreshAnchor","next","scheduleAnchorRefresh","handleWindowResize","frameLoaded","event","hideModal","resetFrame","resolveInitialFrames","initialFrameReadiness","resolve","reject","onMessage","fromStage","fromControls","fromModal","message","sourceMode","modalUrl","locationPoll","cleanup","error","mounts","mountDanmaku","byTarget","existing","pending","raw"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* GENERATED FILE — DO NOT EDIT.
|
|
3
3
|
*
|
|
4
4
|
* Generated from contracts/public-capabilities.openapi.json
|
|
5
|
-
* (contractVersion 0.
|
|
5
|
+
* (contractVersion 0.4.0, sha256 3e487a33d9633e4d…)
|
|
6
6
|
* by scripts/generate-contracts.mjs. Regenerate with `pnpm contracts:generate`.
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
@@ -10,20 +10,18 @@
|
|
|
10
10
|
* Do not make direct changes to the file.
|
|
11
11
|
*/
|
|
12
12
|
export interface paths {
|
|
13
|
-
"/
|
|
13
|
+
"/v1/danmaku/messages": {
|
|
14
14
|
parameters: {
|
|
15
15
|
query?: never;
|
|
16
16
|
header?: never;
|
|
17
17
|
path?: never;
|
|
18
18
|
cookie?: never;
|
|
19
19
|
};
|
|
20
|
-
|
|
20
|
+
/** List public danmaku messages for one page-position anchor */
|
|
21
|
+
get: operations["listDanmakuMessages"];
|
|
21
22
|
put?: never;
|
|
22
|
-
/**
|
|
23
|
-
|
|
24
|
-
* @description Binds a short-lived capability token to the Work, the caller Origin, the enabled capability set, and an expiry. The workKey locates the Work; it is never an authorization credential. CORS: exact registered origins only, credentials disabled.
|
|
25
|
-
*/
|
|
26
|
-
post: operations["createWorkSession"];
|
|
23
|
+
/** Create a public danmaku message */
|
|
24
|
+
post: operations["createDanmakuMessage"];
|
|
27
25
|
delete?: never;
|
|
28
26
|
options?: never;
|
|
29
27
|
head?: never;
|
|
@@ -34,42 +32,40 @@ export interface paths {
|
|
|
34
32
|
export type webhooks = Record<string, never>;
|
|
35
33
|
export interface components {
|
|
36
34
|
schemas: {
|
|
37
|
-
/** @description Public opaque
|
|
35
|
+
/** @description Public opaque SDK Work key. */
|
|
38
36
|
WorkKey: string;
|
|
39
|
-
/** @description
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
/** @description Opaque page-position anchor derived by the external SDK. */
|
|
38
|
+
DanmakuAnchorKey: string;
|
|
39
|
+
DanmakuCursor: string;
|
|
40
|
+
DanmakuMessage: {
|
|
41
|
+
/** Format: uuid */
|
|
42
|
+
id: string;
|
|
42
43
|
workKey: components["schemas"]["WorkKey"];
|
|
44
|
+
content: string;
|
|
45
|
+
anchorKey: components["schemas"]["DanmakuAnchorKey"] | null;
|
|
46
|
+
/** Format: date-time */
|
|
47
|
+
createdAt: string;
|
|
43
48
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
[key: string]: unknown;
|
|
49
|
+
DanmakuMessagesResponse: {
|
|
50
|
+
items: components["schemas"]["DanmakuMessage"][];
|
|
51
|
+
nextCursor: components["schemas"]["DanmakuCursor"] | null;
|
|
52
|
+
total: number;
|
|
49
53
|
};
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
token?: string;
|
|
55
|
-
/** @description Epoch milliseconds when the token expires. */
|
|
56
|
-
expiresAt?: number;
|
|
57
|
-
} & {
|
|
58
|
-
[key: string]: unknown;
|
|
54
|
+
CreateDanmakuMessageRequest: {
|
|
55
|
+
workKey: components["schemas"]["WorkKey"];
|
|
56
|
+
content: string;
|
|
57
|
+
anchorKey?: components["schemas"]["DanmakuAnchorKey"];
|
|
59
58
|
};
|
|
60
59
|
ErrorBody: {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
retryable?: boolean;
|
|
66
|
-
requestId?: string;
|
|
67
|
-
};
|
|
60
|
+
statusCode: number;
|
|
61
|
+
code: string;
|
|
62
|
+
message: string | string[];
|
|
63
|
+
requestId: string;
|
|
68
64
|
};
|
|
69
65
|
};
|
|
70
66
|
responses: {
|
|
71
|
-
/** @description Invalid
|
|
72
|
-
|
|
67
|
+
/** @description Invalid query or body. */
|
|
68
|
+
BadRequest: {
|
|
73
69
|
headers: {
|
|
74
70
|
[name: string]: unknown;
|
|
75
71
|
};
|
|
@@ -77,16 +73,7 @@ export interface components {
|
|
|
77
73
|
"application/json": components["schemas"]["ErrorBody"];
|
|
78
74
|
};
|
|
79
75
|
};
|
|
80
|
-
/** @description
|
|
81
|
-
OriginNotAllowed: {
|
|
82
|
-
headers: {
|
|
83
|
-
[name: string]: unknown;
|
|
84
|
-
};
|
|
85
|
-
content: {
|
|
86
|
-
"application/json": components["schemas"]["ErrorBody"];
|
|
87
|
-
};
|
|
88
|
-
};
|
|
89
|
-
/** @description Unknown, private, or disabled work. */
|
|
76
|
+
/** @description Unknown, inactive, or non-PUBLIC danmaku work. */
|
|
90
77
|
WorkNotFound: {
|
|
91
78
|
headers: {
|
|
92
79
|
[name: string]: unknown;
|
|
@@ -95,7 +82,7 @@ export interface components {
|
|
|
95
82
|
"application/json": components["schemas"]["ErrorBody"];
|
|
96
83
|
};
|
|
97
84
|
};
|
|
98
|
-
/** @description
|
|
85
|
+
/** @description Danmaku write rate limit exceeded. */
|
|
99
86
|
RateLimited: {
|
|
100
87
|
headers: {
|
|
101
88
|
[name: string]: unknown;
|
|
@@ -104,7 +91,7 @@ export interface components {
|
|
|
104
91
|
"application/json": components["schemas"]["ErrorBody"];
|
|
105
92
|
};
|
|
106
93
|
};
|
|
107
|
-
/** @description
|
|
94
|
+
/** @description Unexpected Shop error. */
|
|
108
95
|
InternalError: {
|
|
109
96
|
headers: {
|
|
110
97
|
[name: string]: unknown;
|
|
@@ -121,7 +108,35 @@ export interface components {
|
|
|
121
108
|
}
|
|
122
109
|
export type $defs = Record<string, never>;
|
|
123
110
|
export interface operations {
|
|
124
|
-
|
|
111
|
+
listDanmakuMessages: {
|
|
112
|
+
parameters: {
|
|
113
|
+
query: {
|
|
114
|
+
workKey: components["schemas"]["WorkKey"];
|
|
115
|
+
anchorKey?: components["schemas"]["DanmakuAnchorKey"];
|
|
116
|
+
cursor?: components["schemas"]["DanmakuCursor"];
|
|
117
|
+
limit?: number;
|
|
118
|
+
};
|
|
119
|
+
header?: never;
|
|
120
|
+
path?: never;
|
|
121
|
+
cookie?: never;
|
|
122
|
+
};
|
|
123
|
+
requestBody?: never;
|
|
124
|
+
responses: {
|
|
125
|
+
/** @description Messages for the requested public work and anchor. */
|
|
126
|
+
200: {
|
|
127
|
+
headers: {
|
|
128
|
+
[name: string]: unknown;
|
|
129
|
+
};
|
|
130
|
+
content: {
|
|
131
|
+
"application/json": components["schemas"]["DanmakuMessagesResponse"];
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
400: components["responses"]["BadRequest"];
|
|
135
|
+
404: components["responses"]["WorkNotFound"];
|
|
136
|
+
500: components["responses"]["InternalError"];
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
createDanmakuMessage: {
|
|
125
140
|
parameters: {
|
|
126
141
|
query?: never;
|
|
127
142
|
header?: never;
|
|
@@ -130,26 +145,23 @@ export interface operations {
|
|
|
130
145
|
};
|
|
131
146
|
requestBody: {
|
|
132
147
|
content: {
|
|
133
|
-
"application/json": components["schemas"]["
|
|
148
|
+
"application/json": components["schemas"]["CreateDanmakuMessageRequest"];
|
|
134
149
|
};
|
|
135
150
|
};
|
|
136
151
|
responses: {
|
|
137
|
-
/** @description
|
|
152
|
+
/** @description Message created. */
|
|
138
153
|
201: {
|
|
139
154
|
headers: {
|
|
140
|
-
/** @description Server request id for support correlation. */
|
|
141
|
-
"x-request-id"?: string;
|
|
142
155
|
[name: string]: unknown;
|
|
143
156
|
};
|
|
144
157
|
content: {
|
|
145
|
-
"application/json": components["schemas"]["
|
|
158
|
+
"application/json": components["schemas"]["DanmakuMessage"];
|
|
146
159
|
};
|
|
147
160
|
};
|
|
148
|
-
400: components["responses"]["
|
|
149
|
-
403: components["responses"]["OriginNotAllowed"];
|
|
161
|
+
400: components["responses"]["BadRequest"];
|
|
150
162
|
404: components["responses"]["WorkNotFound"];
|
|
151
163
|
429: components["responses"]["RateLimited"];
|
|
152
|
-
|
|
164
|
+
500: components["responses"]["InternalError"];
|
|
153
165
|
};
|
|
154
166
|
};
|
|
155
167
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-contract.d.ts","sourceRoot":"","sources":["../../src/generated/public-contract.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH;;;GAGG;AAEH,MAAM,WAAW,KAAK;IAClB,
|
|
1
|
+
{"version":3,"file":"public-contract.d.ts","sourceRoot":"","sources":["../../src/generated/public-contract.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `@viceme-ai/sdk` public entry.
|
|
3
3
|
*
|
|
4
|
-
* Production consumers get
|
|
5
|
-
* lives under `@viceme-ai/sdk/testing`. Capability subpaths (danmaku, payment)
|
|
6
|
-
* are added only when the capability is real.
|
|
4
|
+
* Production consumers get a local public-danmaku client plus public types.
|
|
7
5
|
*/
|
|
8
|
-
import { resolveApiBaseUrl } from './core/config.ts';
|
|
9
6
|
import { ViceMeError, isViceMeError, type ViceMeErrorCode } from './core/errors.ts';
|
|
10
7
|
import type { ViceMeClient, ViceMeMountedInstance } from './core/client.ts';
|
|
11
8
|
import type { ViceMeRegion, ViceMeConfig } from './core/config.ts';
|
|
12
9
|
import type { ViceMeClientState } from './core/lifecycle.ts';
|
|
13
10
|
import { SDK_VERSION, API_MAJOR } from './version.ts';
|
|
14
|
-
export { ViceMeError, isViceMeError, SDK_VERSION, API_MAJOR
|
|
11
|
+
export { ViceMeError, isViceMeError, SDK_VERSION, API_MAJOR };
|
|
15
12
|
export type { ViceMeClient, ViceMeMountedInstance, ViceMeConfig, ViceMeRegion, ViceMeClientState, ViceMeErrorCode, };
|
|
16
13
|
/**
|
|
17
|
-
* Create a
|
|
14
|
+
* Create a local public-danmaku client for one Work.
|
|
18
15
|
*
|
|
19
16
|
* @example
|
|
20
17
|
* ```ts
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AAC9D,YAAY,EACV,YAAY,EACZ,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,eAAe,GAChB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY,CAG1D"}
|
package/dist/index.js
CHANGED
|
@@ -1,126 +1,111 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { A as w, S as
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
[403, "ORIGIN_NOT_ALLOWED"],
|
|
7
|
-
[404, "WORK_NOT_FOUND"],
|
|
8
|
-
[409, "CONFIG_INVALID"],
|
|
9
|
-
[422, "CONFIG_INVALID"],
|
|
10
|
-
[429, "RATE_LIMITED"]
|
|
11
|
-
]), m = /* @__PURE__ */ new Set([
|
|
12
|
-
"CONFIG_INVALID",
|
|
13
|
-
"WORK_NOT_FOUND",
|
|
14
|
-
"ORIGIN_NOT_ALLOWED",
|
|
15
|
-
"CAPABILITY_DISABLED",
|
|
16
|
-
"SESSION_EXPIRED",
|
|
17
|
-
"RATE_LIMITED",
|
|
18
|
-
"NETWORK_TIMEOUT",
|
|
19
|
-
"CHECKOUT_UNAVAILABLE",
|
|
20
|
-
"INTERNAL_ERROR"
|
|
21
|
-
]);
|
|
22
|
-
function T(o) {
|
|
23
|
-
if (typeof o != "object" || o === null) return {};
|
|
24
|
-
const e = o.error;
|
|
25
|
-
if (typeof e != "object" || e === null) return {};
|
|
26
|
-
const t = e, s = {};
|
|
27
|
-
return typeof t.code == "string" && m.has(t.code) && (s.code = t.code), typeof t.message == "string" && (s.message = t.message.slice(0, 200)), typeof t.retryable == "boolean" && (s.retryable = t.retryable), typeof t.requestId == "string" && (s.requestId = t.requestId), s;
|
|
1
|
+
import { c as i, V as n, a as o } from "./chunks/version-BbUa2jZV.js";
|
|
2
|
+
import { A as w, S as A, i as k } from "./chunks/version-BbUa2jZV.js";
|
|
3
|
+
const a = /* @__PURE__ */ new Set(["cn", "global"]);
|
|
4
|
+
function c(t) {
|
|
5
|
+
return typeof t == "string" && /^wrk_[A-Za-z0-9_-]{4,124}$/.test(t);
|
|
28
6
|
}
|
|
29
|
-
function
|
|
30
|
-
return typeof
|
|
7
|
+
function l(t) {
|
|
8
|
+
return typeof t == "string" && a.has(t);
|
|
31
9
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
10
|
+
function f(t) {
|
|
11
|
+
if (typeof t != "object" || t === null)
|
|
12
|
+
throw i("createViceMe expects a configuration object.");
|
|
13
|
+
const e = t, r = /* @__PURE__ */ new Set(["workKey", "region"]);
|
|
14
|
+
for (const s of Object.keys(e))
|
|
15
|
+
if (!r.has(s))
|
|
16
|
+
throw i(`Unknown configuration field "${s}".`);
|
|
17
|
+
if (!c(e.workKey))
|
|
18
|
+
throw i('Configuration field "workKey" must be a public work key ("wrk_…").');
|
|
19
|
+
if (!l(e.region))
|
|
20
|
+
throw i('Configuration field "region" must be "cn" or "global".');
|
|
21
|
+
return {
|
|
22
|
+
workKey: e.workKey,
|
|
23
|
+
region: e.region
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const h = {
|
|
27
|
+
CREATED: ["READY", "DESTROYED"],
|
|
28
|
+
READY: ["DEGRADED", "DESTROYED"],
|
|
29
|
+
DEGRADED: ["DESTROYED"],
|
|
30
|
+
DESTROYED: []
|
|
31
|
+
};
|
|
32
|
+
class E {
|
|
33
|
+
#e = "CREATED";
|
|
34
|
+
#t = /* @__PURE__ */ new Set();
|
|
35
|
+
get state() {
|
|
36
|
+
return this.#e;
|
|
37
|
+
}
|
|
38
|
+
get destroyed() {
|
|
39
|
+
return this.#e === "DESTROYED";
|
|
39
40
|
}
|
|
40
|
-
|
|
41
|
-
if (e
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}, t), d = () => s.abort(new I(!1));
|
|
48
|
-
e.signal?.addEventListener("abort", d, { once: !0 });
|
|
49
|
-
const l = this.#o();
|
|
50
|
-
try {
|
|
51
|
-
const r = await this.#t(`${this.#e}${e.path}`, {
|
|
52
|
-
method: e.method,
|
|
53
|
-
// Public API is CORS-only; credentials must stay off so Shop session
|
|
54
|
-
// cookies can never attach to public SDK requests.
|
|
55
|
-
credentials: "omit",
|
|
56
|
-
mode: "cors",
|
|
57
|
-
headers: {
|
|
58
|
-
"content-type": "application/json",
|
|
59
|
-
"x-client-request-id": l
|
|
60
|
-
},
|
|
61
|
-
body: e.body !== void 0 ? JSON.stringify(e.body) : void 0,
|
|
62
|
-
signal: s.signal
|
|
63
|
-
});
|
|
64
|
-
let a;
|
|
65
|
-
try {
|
|
66
|
-
a = await r.json();
|
|
67
|
-
} catch (n) {
|
|
68
|
-
if (e.signal?.aborted || c)
|
|
69
|
-
throw n;
|
|
70
|
-
a = void 0;
|
|
71
|
-
}
|
|
72
|
-
const u = r.headers.get("x-request-id") ?? void 0;
|
|
73
|
-
if (!r.ok) {
|
|
74
|
-
const n = T(a), E = n.code ?? h.get(r.status) ?? "INTERNAL_ERROR";
|
|
75
|
-
throw new i({
|
|
76
|
-
code: E,
|
|
77
|
-
message: n.message ?? "Public API request failed.",
|
|
78
|
-
retryable: n.retryable,
|
|
79
|
-
requestId: n.requestId ?? u
|
|
41
|
+
transition(e) {
|
|
42
|
+
if (e !== this.#e) {
|
|
43
|
+
if (!h[this.#e].includes(e))
|
|
44
|
+
throw new n({
|
|
45
|
+
code: "INTERNAL_ERROR",
|
|
46
|
+
message: `Illegal lifecycle transition ${this.#e} -> ${e}.`,
|
|
47
|
+
retryable: !1
|
|
80
48
|
});
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
} catch (r) {
|
|
84
|
-
throw e.signal?.aborted ? this.#s(e.signal) : c ? new i({
|
|
85
|
-
code: "NETWORK_TIMEOUT",
|
|
86
|
-
message: "Public API request timed out.",
|
|
87
|
-
retryable: !0,
|
|
88
|
-
requestId: l
|
|
89
|
-
}) : r instanceof i ? r : r instanceof DOMException && r.name === "AbortError" ? new DOMException("ViceMe request aborted by caller.", "AbortError") : new i({
|
|
90
|
-
code: "INTERNAL_ERROR",
|
|
91
|
-
message: "Public API request failed.",
|
|
92
|
-
retryable: !0,
|
|
93
|
-
requestId: l
|
|
94
|
-
});
|
|
95
|
-
} finally {
|
|
96
|
-
clearTimeout(f), e.signal?.removeEventListener("abort", d);
|
|
49
|
+
this.#e = e;
|
|
50
|
+
for (const r of this.#t) r(e);
|
|
97
51
|
}
|
|
98
52
|
}
|
|
99
|
-
/**
|
|
100
|
-
|
|
101
|
-
|
|
53
|
+
/** Any operation on a destroyed client must fail closed with this guard. */
|
|
54
|
+
assertAlive() {
|
|
55
|
+
if (this.destroyed) throw o();
|
|
56
|
+
}
|
|
57
|
+
subscribe(e) {
|
|
58
|
+
return this.#t.add(e), () => {
|
|
59
|
+
this.#t.delete(e);
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
clearListeners() {
|
|
63
|
+
this.#t.clear();
|
|
102
64
|
}
|
|
103
65
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
66
|
+
const D = /* @__PURE__ */ Symbol("ViceMeClient.markDegraded");
|
|
67
|
+
class d {
|
|
68
|
+
#e = new E();
|
|
69
|
+
#t;
|
|
70
|
+
#i;
|
|
71
|
+
constructor(e) {
|
|
72
|
+
this.#t = e;
|
|
73
|
+
}
|
|
74
|
+
get workKey() {
|
|
75
|
+
return this.#t.workKey;
|
|
76
|
+
}
|
|
77
|
+
get region() {
|
|
78
|
+
return this.#t.region;
|
|
79
|
+
}
|
|
80
|
+
get state() {
|
|
81
|
+
return this.#e.state;
|
|
82
|
+
}
|
|
83
|
+
ready() {
|
|
84
|
+
return this.#e.destroyed ? Promise.reject(o()) : (this.#i || (this.#e.transition("READY"), this.#i = Promise.resolve()), this.#i);
|
|
85
|
+
}
|
|
86
|
+
hasCapability(e) {
|
|
87
|
+
return !this.#e.destroyed && e === "danmaku";
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Internal: mark one capability unavailable without taking down the client
|
|
91
|
+
* (loader uses this when a feature chunk fails after the core is READY).
|
|
92
|
+
*/
|
|
93
|
+
[D]() {
|
|
94
|
+
this.#e.state === "READY" && this.#e.transition("DEGRADED");
|
|
95
|
+
}
|
|
96
|
+
destroy() {
|
|
97
|
+
this.#e.destroyed || (this.#e.transition("DESTROYED"), this.#e.clearListeners(), this.#i = void 0);
|
|
110
98
|
}
|
|
111
99
|
}
|
|
112
|
-
function
|
|
113
|
-
const e =
|
|
114
|
-
|
|
115
|
-
});
|
|
116
|
-
return new O({ config: e, transport: t });
|
|
100
|
+
function u(t) {
|
|
101
|
+
const e = f(t);
|
|
102
|
+
return new d(e);
|
|
117
103
|
}
|
|
118
104
|
export {
|
|
119
105
|
w as API_MAJOR,
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
p as resolveApiBaseUrl
|
|
106
|
+
A as SDK_VERSION,
|
|
107
|
+
n as ViceMeError,
|
|
108
|
+
u as createViceMe,
|
|
109
|
+
k as isViceMeError
|
|
125
110
|
};
|
|
126
111
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/transport/transport.ts","../src/index.ts"],"sourcesContent":["/**\n * HTTP transport for the public API.\n *\n * Responsibilities: request execution with timeout, abort, client request ids,\n * and normalization of every failure into the public `ViceMeError` model.\n * Capabilities and the loader never build their own `fetch` calls — they go\n * through a Transport so tests can swap in `createMemoryTransport`.\n */\n\nimport { ViceMeError, type ViceMeErrorCode } from '../core/errors.ts';\n\nexport interface TransportRequest {\n method: 'GET' | 'POST';\n /** Absolute path under the public API base, e.g. `/public/v1/work-sessions`. */\n path: string;\n /** JSON-serializable request body. */\n body?: unknown;\n signal?: AbortSignal;\n /** Per-request timeout; defaults to the transport default. */\n timeoutMs?: number;\n}\n\nexport interface TransportResponse {\n status: number;\n body?: unknown;\n /** Echoed server request id, when provided. */\n requestId?: string;\n}\n\nexport interface Transport {\n request(request: TransportRequest): Promise<TransportResponse>;\n}\n\nexport interface FetchTransportOptions {\n apiBaseUrl: string;\n /** Injectable for tests; defaults to global `fetch`. */\n fetchImpl?: typeof fetch;\n defaultTimeoutMs?: number;\n /** Injectable id generator (default: `crypto.randomUUID`). */\n generateRequestId?: () => string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nconst STATUS_CODE_MAP: ReadonlyMap<number, ViceMeErrorCode> = new Map([\n [400, 'CONFIG_INVALID'],\n [401, 'SESSION_EXPIRED'],\n [403, 'ORIGIN_NOT_ALLOWED'],\n [404, 'WORK_NOT_FOUND'],\n [409, 'CONFIG_INVALID'],\n [422, 'CONFIG_INVALID'],\n [429, 'RATE_LIMITED'],\n]);\n\nconst KNOWN_CODES: ReadonlySet<string> = new Set([\n 'CONFIG_INVALID',\n 'WORK_NOT_FOUND',\n 'ORIGIN_NOT_ALLOWED',\n 'CAPABILITY_DISABLED',\n 'SESSION_EXPIRED',\n 'RATE_LIMITED',\n 'NETWORK_TIMEOUT',\n 'CHECKOUT_UNAVAILABLE',\n 'INTERNAL_ERROR',\n]);\n\n/** Extract a stable error payload from a JSON error body, if well-formed. */\nfunction parseErrorBody(body: unknown): {\n code?: ViceMeErrorCode;\n message?: string;\n retryable?: boolean;\n requestId?: string;\n} {\n if (typeof body !== 'object' || body === null) return {};\n const error = (body as { error?: unknown }).error;\n if (typeof error !== 'object' || error === null) return {};\n const candidate = error as Record<string, unknown>;\n const result: {\n code?: ViceMeErrorCode;\n message?: string;\n retryable?: boolean;\n requestId?: string;\n } = {};\n if (typeof candidate.code === 'string' && KNOWN_CODES.has(candidate.code)) {\n result.code = candidate.code as ViceMeErrorCode;\n }\n if (typeof candidate.message === 'string') {\n result.message = candidate.message.slice(0, 200);\n }\n if (typeof candidate.retryable === 'boolean') {\n result.retryable = candidate.retryable;\n }\n if (typeof candidate.requestId === 'string') {\n result.requestId = candidate.requestId;\n }\n return result;\n}\n\nfunction defaultRequestId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `req-${Math.random().toString(36).slice(2)}`;\n}\n\nexport class FetchTransport implements Transport {\n readonly #apiBaseUrl: string;\n readonly #fetchImpl: typeof fetch;\n readonly #defaultTimeoutMs: number;\n readonly #generateRequestId: () => string;\n\n constructor(options: FetchTransportOptions) {\n this.#apiBaseUrl = options.apiBaseUrl.replace(/\\/+$/, '');\n this.#fetchImpl = options.fetchImpl ?? globalThis.fetch.bind(globalThis);\n this.#defaultTimeoutMs = options.defaultTimeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.#generateRequestId = options.generateRequestId ?? defaultRequestId;\n }\n\n async request(request: TransportRequest): Promise<TransportResponse> {\n // A pre-aborted signal must never reach the network. Preserve the\n // caller's abort reason when one was set.\n if (request.signal?.aborted) {\n throw this.#callerAbortError(request.signal);\n }\n const timeoutMs = request.timeoutMs ?? this.#defaultTimeoutMs;\n const controller = new AbortController();\n // Engine notes: Chrome/Firefox reject fetch with the abort reason and\n // WebKit may reject with a plain error — so timeout/abort classification\n // keys off our own timer/signal state, never off the exception shape.\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort(new TimeoutAbort());\n }, timeoutMs);\n const onOuterAbort = () => controller.abort(new TimeoutAbort(false));\n request.signal?.addEventListener('abort', onOuterAbort, { once: true });\n\n const requestId = this.#generateRequestId();\n try {\n const response = await this.#fetchImpl(`${this.#apiBaseUrl}${request.path}`, {\n method: request.method,\n // Public API is CORS-only; credentials must stay off so Shop session\n // cookies can never attach to public SDK requests.\n credentials: 'omit',\n mode: 'cors',\n headers: {\n 'content-type': 'application/json',\n 'x-client-request-id': requestId,\n },\n body: request.body !== undefined ? JSON.stringify(request.body) : undefined,\n signal: controller.signal,\n });\n\n // Body reading stays inside the same timeout/abort lifecycle: a server\n // that returns headers and then stalls the body still hits\n // NETWORK_TIMEOUT, caller abort still cancels the read, and a late\n // body can never outlive a destroyed client/session.\n let body: unknown;\n try {\n body = await response.json();\n } catch (error) {\n // A malformed/empty body is tolerated; a cancelled read must\n // propagate so the outer handler can classify it.\n if (request.signal?.aborted || timedOut) {\n throw error;\n }\n body = undefined;\n }\n\n const serverRequestId = response.headers.get('x-request-id') ?? undefined;\n if (!response.ok) {\n const parsed = parseErrorBody(body);\n const code = parsed.code ?? STATUS_CODE_MAP.get(response.status) ?? 'INTERNAL_ERROR';\n throw new ViceMeError({\n code,\n message: parsed.message ?? 'Public API request failed.',\n retryable: parsed.retryable,\n requestId: parsed.requestId ?? serverRequestId,\n });\n }\n return { status: response.status, body, requestId: serverRequestId };\n } catch (cause) {\n if (request.signal?.aborted) {\n throw this.#callerAbortError(request.signal);\n }\n if (timedOut) {\n throw new ViceMeError({\n code: 'NETWORK_TIMEOUT',\n message: 'Public API request timed out.',\n retryable: true,\n requestId,\n });\n }\n // Non-OK statuses already carry a normalized error — pass it through.\n if (cause instanceof ViceMeError) {\n throw cause;\n }\n if (cause instanceof DOMException && cause.name === 'AbortError') {\n throw new DOMException('ViceMe request aborted by caller.', 'AbortError');\n }\n throw new ViceMeError({\n code: 'INTERNAL_ERROR',\n message: 'Public API request failed.',\n retryable: true,\n requestId,\n });\n } finally {\n clearTimeout(timer);\n request.signal?.removeEventListener('abort', onOuterAbort);\n }\n }\n\n /** Caller-abort error that preserves the caller's own abort reason. */\n #callerAbortError(signal: AbortSignal): unknown {\n return signal.reason instanceof Error\n ? signal.reason\n : new DOMException('ViceMe request aborted by caller.', 'AbortError');\n }\n}\n\nexport function createFetchTransport(options: FetchTransportOptions): Transport {\n return new FetchTransport(options);\n}\n\n/** Internal marker distinguishing timeout aborts from caller aborts. */\nclass TimeoutAbort extends DOMException {\n constructor(timedOut = true) {\n super(timedOut ? 'ViceMe request timed out.' : 'ViceMe request aborted.', 'AbortError');\n }\n}\n","/**\n * `@viceme-ai/sdk` public entry.\n *\n * Production consumers get exactly `createViceMe` plus types. Test injection\n * lives under `@viceme-ai/sdk/testing`. Capability subpaths (danmaku, payment)\n * are added only when the capability is real.\n */\n\nimport { createFetchTransport } from './transport/transport.ts';\nimport { resolveApiBaseUrl, validatePublicConfig } from './core/config.ts';\nimport { ViceMeClientImpl } from './core/client.ts';\nimport { ViceMeError, isViceMeError, type ViceMeErrorCode } from './core/errors.ts';\nimport type { ViceMeClient, ViceMeMountedInstance } from './core/client.ts';\nimport type { ViceMeRegion, ViceMeConfig } from './core/config.ts';\nimport type { ViceMeClientState } from './core/lifecycle.ts';\nimport { SDK_VERSION, API_MAJOR } from './version.ts';\n\nexport { ViceMeError, isViceMeError, SDK_VERSION, API_MAJOR, resolveApiBaseUrl };\nexport type {\n ViceMeClient,\n ViceMeMountedInstance,\n ViceMeConfig,\n ViceMeRegion,\n ViceMeClientState,\n ViceMeErrorCode,\n};\n\n/**\n * Create a headless ViceMe client for one Work.\n *\n * @example\n * ```ts\n * const client = createViceMe({ workKey: 'wrk_public_xxx', region: 'cn' });\n * await client.ready();\n * client.destroy();\n * ```\n */\nexport function createViceMe(config: unknown): ViceMeClient {\n const validated = validatePublicConfig(config);\n const transport = createFetchTransport({\n apiBaseUrl: resolveApiBaseUrl(validated.region),\n });\n return new ViceMeClientImpl({ config: validated, transport });\n}\n"],"names":["DEFAULT_TIMEOUT_MS","STATUS_CODE_MAP","KNOWN_CODES","parseErrorBody","body","error","candidate","result","defaultRequestId","FetchTransport","#apiBaseUrl","#fetchImpl","#defaultTimeoutMs","#generateRequestId","options","request","#callerAbortError","timeoutMs","controller","timedOut","timer","TimeoutAbort","onOuterAbort","requestId","response","serverRequestId","parsed","code","ViceMeError","cause","signal","createFetchTransport","createViceMe","config","validated","validatePublicConfig","transport","resolveApiBaseUrl","ViceMeClientImpl"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/core/config.ts","../src/core/lifecycle.ts","../src/core/client.ts","../src/index.ts"],"sourcesContent":["/**\n * Public client configuration.\n *\n * Production `createViceMe()` accepts exactly `workKey` and `region`.\n * Endpoints, credentials, access policy, and provider state are not client\n * configuration: the hosted Shop runtime owns those concerns.\n */\n\nimport { configInvalid } from './errors.ts';\nexport type ViceMeRegion = 'cn' | 'global';\n\nexport interface ViceMeConfig {\n /** Public opaque work key (`wrk_…`). Locates a Work; it is not a secret. */\n workKey: string;\n /** Selects the hosted Shop region. */\n region: ViceMeRegion;\n}\n\nconst REGIONS: ReadonlySet<string> = new Set(['cn', 'global']);\n\nexport function isValidWorkKey(value: unknown): value is string {\n return typeof value === 'string' && /^wrk_[A-Za-z0-9_-]{4,124}$/.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']);\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('Configuration field \"workKey\" must be a public work key (\"wrk_…\").');\n }\n if (!isValidRegion(raw.region)) {\n throw configInvalid('Configuration field \"region\" must be \"cn\" or \"global\".');\n }\n return {\n workKey: raw.workKey,\n region: raw.region,\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 * Local ViceMe client for the public hosted danmaku capability.\n *\n * Initialization performs no network request. The static loader owns release\n * manifest/chunk loading, while the hosted iframe owns Shop API calls.\n */\n\nimport { clientDestroyed } from './errors.ts';\nimport { Lifecycle, type ViceMeClientState } from './lifecycle.ts';\nimport type { ViceMeConfig, ViceMeRegion } from './config.ts';\n\nconst MARK_DEGRADED = Symbol('ViceMeClient.markDegraded');\n\ninterface DegradableViceMeClient {\n [MARK_DEGRADED](): void;\n}\n\nexport interface ViceMeClient {\n readonly workKey: string;\n readonly region: ViceMeRegion;\n readonly state: ViceMeClientState;\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; not part of the client object's string-keyed surface. */\nexport function markClientDegraded(client: ViceMeClient): void {\n if (MARK_DEGRADED in client) {\n (client as ViceMeClient & DegradableViceMeClient)[MARK_DEGRADED]();\n }\n}\n\nexport class ViceMeClientImpl implements ViceMeClient {\n readonly #lifecycle = new Lifecycle();\n readonly #config: ViceMeConfig;\n #readyPromise: Promise<void> | undefined;\n\n constructor(config: ViceMeConfig) {\n this.#config = config;\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 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 hasCapability(name: string): boolean {\n return !this.#lifecycle.destroyed && name === 'danmaku';\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 [MARK_DEGRADED](): void {\n if (this.#lifecycle.state === 'READY') this.#lifecycle.transition('DEGRADED');\n }\n\n destroy(): void {\n if (this.#lifecycle.destroyed) return;\n this.#lifecycle.transition('DESTROYED');\n this.#lifecycle.clearListeners();\n this.#readyPromise = undefined;\n }\n}\n","/**\n * `@viceme-ai/sdk` public entry.\n *\n * Production consumers get a local public-danmaku client plus public types.\n */\n\nimport { validatePublicConfig } from './core/config.ts';\nimport { ViceMeClientImpl } from './core/client.ts';\nimport { ViceMeError, isViceMeError, type ViceMeErrorCode } from './core/errors.ts';\nimport type { ViceMeClient, ViceMeMountedInstance } from './core/client.ts';\nimport type { ViceMeRegion, ViceMeConfig } from './core/config.ts';\nimport type { ViceMeClientState } from './core/lifecycle.ts';\nimport { SDK_VERSION, API_MAJOR } from './version.ts';\n\nexport { ViceMeError, isViceMeError, SDK_VERSION, API_MAJOR };\nexport type {\n ViceMeClient,\n ViceMeMountedInstance,\n ViceMeConfig,\n ViceMeRegion,\n ViceMeClientState,\n ViceMeErrorCode,\n};\n\n/**\n * Create a local public-danmaku client for one Work.\n *\n * @example\n * ```ts\n * const client = createViceMe({ workKey: 'wrk_public_xxx', region: 'cn' });\n * await client.ready();\n * client.destroy();\n * ```\n */\nexport function createViceMe(config: unknown): ViceMeClient {\n const validated = validatePublicConfig(config);\n return new ViceMeClientImpl(validated);\n}\n"],"names":["REGIONS","isValidWorkKey","value","isValidRegion","validatePublicConfig","input","configInvalid","raw","known","key","ALLOWED_TRANSITIONS","Lifecycle","#state","#listeners","next","ViceMeError","listener","clientDestroyed","MARK_DEGRADED","ViceMeClientImpl","#lifecycle","#config","#readyPromise","config","name","createViceMe","validated"],"mappings":";;AAkBA,MAAMA,IAA+B,oBAAI,IAAI,CAAC,MAAM,QAAQ,CAAC;AAEtD,SAASC,EAAeC,GAAiC;AAC9D,SAAO,OAAOA,KAAU,YAAY,6BAA6B,KAAKA,CAAK;AAC7E;AAEO,SAASC,EAAcD,GAAuC;AACnE,SAAO,OAAOA,KAAU,YAAYF,EAAQ,IAAIE,CAAK;AACvD;AAMO,SAASE,EAAqBC,GAA8B;AACjE,MAAI,OAAOA,KAAU,YAAYA,MAAU;AACzC,UAAMC,EAAc,8CAA8C;AAEpE,QAAMC,IAAMF,GAENG,IAAQ,oBAAI,IAAI,CAAC,WAAW,QAAQ,CAAC;AAC3C,aAAWC,KAAO,OAAO,KAAKF,CAAG;AAC/B,QAAI,CAACC,EAAM,IAAIC,CAAG;AAChB,YAAMH,EAAc,gCAAgCG,CAAG,IAAI;AAG/D,MAAI,CAACR,EAAeM,EAAI,OAAO;AAC7B,UAAMD,EAAc,oEAAoE;AAE1F,MAAI,CAACH,EAAcI,EAAI,MAAM;AAC3B,UAAMD,EAAc,wDAAwD;AAE9E,SAAO;AAAA,IACL,SAASC,EAAI;AAAA,IACb,QAAQA,EAAI;AAAA,EAAA;AAEhB;ACvCA,MAAMG,IAAyF;AAAA,EAC7F,SAAS,CAAC,SAAS,WAAW;AAAA,EAC9B,OAAO,CAAC,YAAY,WAAW;AAAA,EAC/B,UAAU,CAAC,WAAW;AAAA,EACtB,WAAW,CAAA;AACb;AAIO,MAAMC,EAAU;AAAA,EACrBC,KAA4B;AAAA,EAC5BC,yBAAiB,IAAA;AAAA,EAEjB,IAAI,QAA2B;AAC7B,WAAO,KAAKD;AAAA,EACd;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAKA,OAAW;AAAA,EACzB;AAAA,EAEA,WAAWE,GAA+B;AACxC,QAAIA,MAAS,KAAKF,IAClB;AAAA,UAAI,CAACF,EAAoB,KAAKE,EAAM,EAAG,SAASE,CAAI;AAClD,cAAM,IAAIC,EAAY;AAAA,UACpB,MAAM;AAAA,UACN,SAAS,gCAAgC,KAAKH,EAAM,OAAOE,CAAI;AAAA,UAC/D,WAAW;AAAA,QAAA,CACZ;AAEH,WAAKF,KAASE;AACd,iBAAWE,KAAY,KAAKH,GAAY,CAAAG,EAASF,CAAI;AAAA;AAAA,EACvD;AAAA;AAAA,EAGA,cAAoB;AAClB,QAAI,KAAK,UAAW,OAAMG,EAAA;AAAA,EAC5B;AAAA,EAEA,UAAUD,GAAyC;AACjD,gBAAKH,GAAW,IAAIG,CAAQ,GACrB,MAAM;AACX,WAAKH,GAAW,OAAOG,CAAQ;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,iBAAuB;AACrB,SAAKH,GAAW,MAAA;AAAA,EAClB;AACF;ACrDA,MAAMK,2BAAuB,2BAA2B;AA4BjD,MAAMC,EAAyC;AAAA,EAC3CC,KAAa,IAAIT,EAAA;AAAA,EACjBU;AAAA,EACTC;AAAA,EAEA,YAAYC,GAAsB;AAChC,SAAKF,KAAUE;AAAA,EACjB;AAAA,EAEA,IAAI,UAAkB;AACpB,WAAO,KAAKF,GAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,SAAuB;AACzB,WAAO,KAAKA,GAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,QAA2B;AAC7B,WAAO,KAAKD,GAAW;AAAA,EACzB;AAAA,EAEA,QAAuB;AACrB,WAAI,KAAKA,GAAW,YAAkB,QAAQ,OAAOH,GAAiB,KACjE,KAAKK,OACR,KAAKF,GAAW,WAAW,OAAO,GAClC,KAAKE,KAAgB,QAAQ,QAAA,IAExB,KAAKA;AAAA,EACd;AAAA,EAEA,cAAcE,GAAuB;AACnC,WAAO,CAAC,KAAKJ,GAAW,aAAaI,MAAS;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,CAACN,CAAa,IAAU;AACtB,IAAI,KAAKE,GAAW,UAAU,WAAS,KAAKA,GAAW,WAAW,UAAU;AAAA,EAC9E;AAAA,EAEA,UAAgB;AACd,IAAI,KAAKA,GAAW,cACpB,KAAKA,GAAW,WAAW,WAAW,GACtC,KAAKA,GAAW,eAAA,GAChB,KAAKE,KAAgB;AAAA,EACvB;AACF;ACrDO,SAASG,EAAaF,GAA+B;AAC1D,QAAMG,IAAYtB,EAAqBmB,CAAM;AAC7C,SAAO,IAAIJ,EAAiBO,CAAS;AACvC;"}
|
|
@@ -11,7 +11,7 @@ export type ViceMeTheme = 'light' | 'dark' | 'auto';
|
|
|
11
11
|
export interface LoaderAttributes {
|
|
12
12
|
workKey: string;
|
|
13
13
|
region: ViceMeRegion;
|
|
14
|
-
/**
|
|
14
|
+
/** The only released public feature. */
|
|
15
15
|
features: string[];
|
|
16
16
|
/** CSS selector; required whenever features are declared. */
|
|
17
17
|
target?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../src/loader/attributes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../src/loader/attributes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,CAAC;CACpB;AAcD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAsDxE"}
|