# JS SDK 参考

## 初始化配置

| 字段 | 必填 | 说明 |
| --- | --- | --- |
| container | 是 | DOM 元素或 CSS 选择器，需有明确高度 |
| item | 是 | 检视三档只接受 `{inspect:string}`；editor 另可接受 `{query:string}` |
| tier | 是 | inspect / first_person / third_person / editor |
| getGrant | 是 | 异步回调，调用厂商后端获取短期凭证 |
| embedUrl | 否 | 默认 https://www.cs2view.com/embed；本地只允许 loopback HTTP |
| title | 否 | iframe 的无障碍名称 |
| timeoutMs | 否 | 握手超时，默认 20000；不是下载超时 |

`getGrant` 收到 `openId`、`item`、`tier`、`parentOrigin` 与 `AbortSignal`。取消后不要继续返回旧凭证。SDK 核验 iframe 来源、窗口身份、消息版本和 channel。

## 方法

| 方法 | 行为 |
| --- | --- |
| on(event, listener) | 注册事件，返回取消订阅函数 |
| load(item, tier?) | 创建一次新的收费访问，切换物品；即使参数相同也算新访问 |
| retry() | 重试当前访问的凭证申请或渲染，不自动创建新收费访问 |
| setView(view) | 切换已授权视角；未授权档位会抛错 |
| pause() | 暂停渲染；访问无固定时长限制 |
| resume() | 恢复；不创建新访问 |
| destroy() | 返回 Promise，通知关闭会话并移除 iframe，重复调用安全 |

iframe 重载会产生新的 openId 并重新申请进入。普通框架重渲染时请保留同一个实例。组件销毁时调用 destroy；切换物品时明确调用 load。

## 事件

| 事件 | 数据 | 含义 |
| --- | --- | --- |
| ready | openId | 查看器已准备握手，尚未扣费 |
| authorized | visitId、tier、expiresAt | 本次进入已获准，已产生计费用量；expiresAt 固定为 null |
| progress | percent、label | 加载进度；percent 可为空 |
| loaded | visitId | 当前物品已经显示 |
| error | code、message | 申请、加载或运行错误 |
| expired | code、message | 访问被关闭或撤销，需要用户重新进入；不表示计时到期 |
| view | view | 视角改变 |

隐藏标签页或离开可视区域时 SDK 自动暂停，手动 pause 的状态优先。暂停不会免除已经产生的费用，没有会话倒计时。

## 物品输入

```js
// 仅独立编辑器（tier:'editor'）可使用参数。
{query:'skin=skin%3A7%3A1171&wear=0.1&seed=50&scene=warehouse'}

// 三个检视档只能使用包含物品数据的 Steam 检视链接（编辑器也接受）。
{inspect:'steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20<hex>'}

// 也可提供对应的纯十六进制检视数据。
{inspect:'<hex>'}
```

仅 editor 的 query 支持物品、wear/seed、StatTrak、贴纸、挂件、探员、手套、场景和已授权视角等现有参数。旧的 S/A/D 或 M/A/D 链接不属于本版凭证输入范围。只读检视内不能改武器、手套、探员、印花、挂件或其参数；由厂商调用 load 传入新链接才能开启另一访问。嵌入页不显示 QQ 群、联系我们和 ICP。渲染器自身对不支持的物品属性仍可报错；通过凭证校验不等于游戏像素验收。
