> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stmlink.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> 对外开放的服务端接口有两组前缀，都用同一套鉴权：`/server/v1/...`（SRTC 与 SMeeting 的主接口）和 `/stm/srvapi/v1/...`（SMeeting 的用户体系，服务端极简对接会用到）。鉴权是 app_id + nonce + timestamp + signature 四个请求头，用 app_key 做 HMAC-SHA256 签名，只能从业务方自己的后端调用。除这两组前缀外的接口均为内部接口，不要建议客户调用。 Public server APIs use two path prefixes with the same authentication: `/server/v1/...` (the main APIs of both SRTC and SMeeting) and `/stm/srvapi/v1/...` (the SMeeting user system, used by server-side low-code integration). Authenticate with four request headers, app_id + nonce + timestamp + signature, where signature is HMAC-SHA256 keyed with app_key; call these APIs only from the customer's own backend. Any other path is internal: never suggest calling it.
> app_key 是服务端密钥，绝不能出现在客户端代码、前端配置或移动 App 里。客户端加入频道用的 token 必须由业务方后端签发后下发（SRTC 走 `/server/v1/channel/grant`，SMeeting 走 `/stm/srvapi/v1/member/grant`）。 app_key is a server-side secret and must never appear in client code, frontend config, or a mobile app. The token a client uses to join must be issued by the customer's backend and passed down to the client (SRTC: `/server/v1/channel/grant`; SMeeting: `/stm/srvapi/v1/member/grant`).
> SRTC 与 SMeeting 是上下两层不同的产品，术语不通用：SRTC 是音视频底座，说「频道 channel」「加入 / 退出」；SMeeting 建在 SRTC 之上，说「房间 room」「会议 meeting」「进入 / 退出」。回答时按用户所在的层用对应术语，不要把「房间」「会议」安到 SRTC 的接口上，也不要用「频道」「加入 / 离开」描述 SMeeting 的概念（接口标识符原样保留）。 SRTC and SMeeting are two separate layers with different terminology. SRTC is the audio/video foundation: it has channels, and users join and leave a channel. SMeeting is built on top of SRTC: it has rooms and meetings, and members enter and exit a meeting. Answer in the terms of the layer the user is working with: never apply "room" or "meeting" to SRTC APIs, and never describe SMeeting concepts in prose with "channel", "join", or "leave" (API identifiers such as `force_join` keep their literal names).
> 同一能力在各端 SDK 里的包名、类名、方法名并不相同。写示例代码时请使用文档中该端自己的 API，不要把一个端的写法套到另一个端上。苹果平台每个产品都有两套 SDK（Swift 原生与 Objective-C），两套 API 不能混用。 Package, class, and method names differ between platform SDKs for the same capability. In sample code, use the API documented for that platform; never carry one platform's code over to another. On Apple platforms each product ships two SDKs (native Swift and Objective-C) whose APIs must not be mixed.

# Integration

> Set up the SRTC Web SDK: supported browsers and minimum versions, embedding in WeChat Mini Program via web-view, HTTPS/localhost protocol limits for publishing, installing via npm, CDN, or local files, import styles, and using the SDK with Vue and other reactive frameworks.

### Supported browsers

The SRTC Web SDK supports mainstream desktop and mobile browsers:

| Browser | Minimum version | Notes |
| - | :-: | - |
| Chrome | 72+ | Recommended, full feature support |
| Edge | 79+ | Chromium-based |
| Firefox | 66+ | Doesn't support choosing the speaker output |
| Safari | 14+ | Doesn't support system audio in screen sharing |
| WeChat in-app browser | iOS 14.3+ / Android | Supports sending and receiving. Older iOS versions below 14.3 can only receive |
| Mobile Chrome / Safari | Latest | Supports basic audio and video calls |

> **Tip:** We recommend that users use the latest version of Chrome for the best experience.

***

### WeChat Mini Program

When you need audio and video in a WeChat Mini Program, **we recommend embedding a page built with this Web SDK via the Mini Program's `<web-view>`**, rather than building a separate native Mini Program implementation. One Web codebase then covers both browsers and Mini Programs, features and future updates stay consistent, and maintenance cost is lowest.

Key points:

* The embedded page must be served over **HTTPS**, and its domain must be configured as a **business domain** in the Mini Program admin console and pass verification
* Pass parameters between the Mini Program and the embedded page through the `web-view` communication mechanism; the channel name, token, and so on can be delivered via URL query
* The page runs in the WeChat in-app browser; on iOS 14.3 and above and on Android it can publish and receive normally. Only older systems below iOS 14.3 are limited by the system WebView and can only receive

***

### URL protocol restrictions

WebRTC APIs restrict the page protocol. Choose the protocol that fits your deployment:

| Scenario | Protocol | Receive | Publish | Notes |
| - | - | :-: | :-: | - |
| Production | HTTPS | ✅ | ✅ | **Recommended** |
| Production | HTTP | ✅ | ❌ | Receive only |
| Local development | [http://localhost](http://localhost) | ✅ | ✅ | **Recommended** |
| Local development | [http://127.0.0.1](http://127.0.0.1) | ✅ | ✅ | |
| Local development | http\://\[local IP] | ✅ | ❌ | Receive only |
| Local development | file:/// | ✅ | ✅ | |

***

### Installation

#### npm

```bash theme={null}
npm install @seastart/srtc-web-sdk --save
```

#### CDN

For projects without a build tool, include the SDK directly in HTML with a `<script>` tag:

```html theme={null}
<!-- Load the latest version from the unpkg CDN -->
<script src="https://unpkg.com/@seastart/srtc-web-sdk@latest/srtc.js"></script>
```

After loading from the CDN, the global variable `SRTC` is available directly.

#### Local download

1. Download [srtc.js](https://unpkg.com/@seastart/srtc-web-sdk@latest/srtc.js) and [srtc.d.ts](https://unpkg.com/@seastart/srtc-web-sdk@latest/srtc.d.ts)
2. Copy both files into your project directory

***

### Importing

#### ES Module (recommended, with npm)

```typescript theme={null}
import {
  SRTC,
  LocalMicTrack,
  LocalCameraTrack,
  LocalScreenTrack,
  RemoteAudioMixTrack,
  RemoteVideoTrack,
  ChannelEventType,
  MicPresets,
  CameraPresets,
  ScreenPresets,
  LogLevel,
  LogTarget,
} from '@seastart/srtc-web-sdk';
import type { ChannelEvent } from '@seastart/srtc-web-sdk';
```

#### Script tag (with CDN or local files)

```html theme={null}
<script src="srtc.js"></script>
<script>
  // The global variable SRTC is the main class
  const srtc = new SRTC({ logLevel: 'debug' });
</script>
```

### Using with reactive frameworks

<Warning>
  Don't put the `SRTC` instance or the `Channel` returned by `join()` into **deeply reactive containers** such as Vue's `reactive()` / `ref()` or Pinia state. The SDK relies on object identity comparisons in many places (channels, tracks, subscriptions); once the instance is proxied, these comparisons break, and they fail silently—the typical symptom is that you receive no channel events at all, with no error reported.
</Warning>

Store them with `markRaw()` or `shallowRef`:

```typescript theme={null}
import { markRaw, shallowRef } from 'vue';

// Engine instance
const srtc = markRaw(new SRTC({ logLevel: LogLevel.DEBUG }));

// The Channel returned by join must also be unproxied
const channel = shallowRef();
channel.value = markRaw(await srtc.join(token));
```
