@16x/webphone-sdk 3.0.1 → 3.1.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/CHANGELOG.md +39 -22
- package/LICENSE +1 -2
- package/README.md +113 -113
- package/dist/{CCBarClient-BdbynNBi.js → CCBarClient-CcPfEToZ.js} +431 -179
- package/dist/CCBarClient-DCQ8XjcL.cjs +1 -0
- package/dist/{Diagnostics-BYVvmxil.cjs → Diagnostics-D38Hm3NT.cjs} +1 -1
- package/dist/{Diagnostics-Cw2HVrCD.js → Diagnostics-Di049OpT.js} +9 -9
- package/dist/JsSipAdapter-BBRrDaM4.cjs +1 -0
- package/dist/{JsSipAdapter-GHzVSCDh.js → JsSipAdapter-Bke1Qjfe.js} +37 -25
- package/dist/SharedWorkerProtocol-39dch6xL.cjs +1 -0
- package/dist/{SharedWorkerProtocol-BqUafs8d.js → SharedWorkerProtocol-DKVQ5-po.js} +31 -17
- package/dist/core/CCBarClient.d.ts +36 -4
- package/dist/core/CallManager.d.ts +2 -0
- package/dist/{createJsSipFactory-yttVU3d6.js → createJsSipFactory-9CPsweDR.js} +4 -1
- package/dist/{createJsSipFactory-2X4FBIU2.cjs → createJsSipFactory-Dr8HbLl-.cjs} +1 -1
- package/dist/diagnostics/Diagnostics.d.ts +1 -0
- package/dist/diagnostics/index.cjs +1 -1
- package/dist/diagnostics/index.d.ts +1 -1
- package/dist/diagnostics/index.js +3 -6
- package/dist/errors/CCBarError.d.ts +6 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +9 -139
- package/dist/index.umd.js +17 -17
- package/dist/legacy/index.cjs +1 -1
- package/dist/legacy/index.js +2 -2
- package/dist/shared/SharedWorkerProtocol.d.ts +2 -0
- package/dist/shared-worker.cjs +1 -1
- package/dist/shared-worker.js +13 -6
- package/dist/styles.css +7 -7
- package/dist/types.d.ts +5 -0
- package/dist/ui/XCallCCBarElement.d.ts +2 -0
- package/dist/ui/index.cjs +1 -1
- package/dist/ui/index.js +138 -130
- package/dist/version.d.ts +1 -0
- package/package.json +111 -107
- package/dist/CCBarClient-DKWdvgf5.cjs +0 -1
- package/dist/CCBarError-CIqJE8zK.cjs +0 -1
- package/dist/CCBarError-DSbPw2dA.js +0 -14
- package/dist/JsSipAdapter-jtGdoXrm.cjs +0 -1
- package/dist/SharedWorkerProtocol-CYN0AprP.cjs +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,22 +1,39 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
##
|
|
4
|
-
|
|
5
|
-
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
-
|
|
19
|
-
- `
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 3.1.0 - 2026-09-21
|
|
4
|
+
|
|
5
|
+
- 新增可选构造参数 `sessionProvider`:由接入方提供会话(`createSession` / 可选 `refreshSession`
|
|
6
|
+
/ `setAgentStatus`),SDK 不再要求必须存在 `/webphone/v1/sessions`。用于把 SDK 接到自建或旧平台
|
|
7
|
+
(例如 `token/fs` + `seat/account/get` 那一套)上,`tokenProvider` 与 `sessionProvider` 二选一。
|
|
8
|
+
- `sessionProvider` 缺省 `refreshSession` 时用 `createSession` 重建;缺省 `setAgentStatus` 时抛
|
|
9
|
+
`CAPABILITY_NOT_SUPPORTED`,不静默失败;没有提供任何来源时构造即报 `CONFIG_INVALID`。
|
|
10
|
+
- `transport.ticket` 为空时不再声明 `xcall-ticket.` 子协议,只发 `sip`:旧平台把凭据放在
|
|
11
|
+
WSS URL 的 `?token=` 上,多余子协议会让握手带上一个平台不认识的协议名。
|
|
12
|
+
- REGISTER 的 `register_expires` 改为按 `session.sip.registerExpires` 走(原先前端写死 300 秒),
|
|
13
|
+
会话没给或给了非正数时才回退 300。平台侧要按自己的注册策略下发这个值。
|
|
14
|
+
- 打包脚本在缺少 `zip` 命令的环境(如未装 zip 的 Windows)回退到系统自带 `tar`,交付包仍为 `.zip`。
|
|
15
|
+
|
|
16
|
+
## 3.0.2 - 2026-09-21
|
|
17
|
+
|
|
18
|
+
- 修复 disconnect 后仍挂着的 `online`/`offline` 监听,以及 `deletedSessions` 墓碑无限增长。
|
|
19
|
+
- `CallManager` 在通话结束通知完成后删除 terminal 记账;`dispose` 仍会清空剩余 maps。
|
|
20
|
+
- `WebPhoneApi` 的 fetch 使用 `credentials: 'omit'`;SIP `wssUrl` 仅允许 `wss:` 或 loopback `ws:`。
|
|
21
|
+
- React / Vue 在应用卸载时 `dispose()`;Vanilla default-ui 与 Mobile H5 通过 `ownsClient` 在组件卸载时释放。
|
|
22
|
+
- 传入 `sharedWorker` 时 `CCBarClient` 会 attach 同源 Worker,并在 `dispose()` 时先 detach 再关闭端口;SIP 仍是单标签页。
|
|
23
|
+
- 诊断报告中的 SDK 版本与 `@16x/webphone-sdk@3.0.2` 对齐。
|
|
24
|
+
|
|
25
|
+
## 3.0.1 - 2026-09-19
|
|
26
|
+
|
|
27
|
+
- 以 `@16x/webphone-sdk` 发布到 npmjs:https://www.npmjs.com/package/@16x/webphone-sdk
|
|
28
|
+
- 发布 WebPhone SDK 3.0.1,包含 WSS ticket 通过 `Sec-WebSocket-Protocol` 传递及 API 主机相对路径解析修复。
|
|
29
|
+
|
|
30
|
+
## 0.1.0 - 2026-09-18
|
|
31
|
+
|
|
32
|
+
- 完成 Headless Core 生命周期、SIP/通话控制、媒体设备、重连与脱敏诊断能力。
|
|
33
|
+
- 提供 ESM、CJS、UMD、类型声明及根入口、`/ui`、`/legacy`、`/diagnostics`、`/styles.css` 导出。
|
|
34
|
+
- 新增旧 `CCBarSDK` 兼容层,按设计映射连接、拨号、当前通话控制和坐席状态方法。
|
|
35
|
+
- `insideCall(number)` 在当前 `DialOptions` 不支持 `type` 时保留原目标号码,不添加隐式前缀。
|
|
36
|
+
- `setBu()` 改为抛出明确的 `DeprecatedError`,不允许浏览器伪造忙碌状态。
|
|
37
|
+
- Legacy 弃用警告仅在开发构建中按方法输出一次;生产构建保持安静。
|
|
38
|
+
- 显式导入 `/legacy` 时才在浏览器附加 `window.CCBarSDK`,并保持 SSR 导入安全。
|
|
39
|
+
- 增加 50 次初始化、连接、拨号、结束和销毁生命周期资源回收测试。
|
package/LICENSE
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
Copyright 16X. All rights reserved.
|
|
2
|
-
Private customer distribution only. No redistribution or sublicensing without written permission.
|
|
1
|
+
Copyright 16X. All rights reserved.
|
package/README.md
CHANGED
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
# CCBar WebPhone SDK Core
|
|
2
|
-
|
|
3
|
-
`@16x/webphone-sdk` 是 CCBar WebPhone 的 TypeScript SDK。Core 提供无 UI 的连接、通话、媒体设备、重连和脱敏诊断能力,可用于 Vue、React、原生 Web 与受支持的移动浏览器。
|
|
4
|
-
|
|
5
|
-
## 安装
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install @16x/webphone-sdk
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
浏览器只应接收客户服务端签发的短期 WebPhone Access Token。不要把 `appSecret`、固定 SIP 密码或 TURN 密码写入前端代码、示例、日志或构建产物。客户从安装到首通的完整路径见 `docs/quick-start.md`,PC/H5 选择见 `docs/guides/mobile-h5.md`。
|
|
14
|
-
|
|
15
|
-
## Core 快速开始
|
|
16
|
-
|
|
17
|
-
```ts
|
|
18
|
-
import { CCBarClient } from '@16x/webphone-sdk';
|
|
19
|
-
|
|
20
|
-
const client = new CCBarClient({
|
|
21
|
-
platform: 'web',
|
|
22
|
-
tokenProvider: async () => {
|
|
23
|
-
const response = await fetch('/api/webphone-token', {
|
|
24
|
-
method: 'POST',
|
|
25
|
-
credentials: 'include',
|
|
26
|
-
});
|
|
27
|
-
if (!response.ok) throw new Error('获取外呼凭证失败');
|
|
28
|
-
return response.json();
|
|
29
|
-
},
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
await client.initialize();
|
|
33
|
-
await client.connect();
|
|
34
|
-
|
|
35
|
-
const call = await client.dial({ destination: '13800138000' });
|
|
36
|
-
await call.hangup();
|
|
37
|
-
|
|
38
|
-
await client.disconnect();
|
|
39
|
-
await client.dispose();
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
在 SPA 中应由应用级容器持有一个 `CCBarClient`。`connect()`、`disconnect()` 和 `dispose()` 支持幂等调用;组件卸载或应用退出时必须调用 `dispose()` 释放 Timer、Listener、WebSocket、PeerConnection、Track 和 Audio 资源。
|
|
43
|
-
|
|
44
|
-
根入口与 `/diagnostics` 可在 SSR/Node 导入阶段安全加载,不会访问 `window`、`document` 或 `navigator`。浏览器媒体能力只在初始化或后续操作时检测。
|
|
45
|
-
|
|
46
|
-
## 主要 API
|
|
47
|
-
|
|
48
|
-
- `CCBarClient.initialize/connect/disconnect/dispose`
|
|
49
|
-
- `CCBarClient.dial/getCalls/getActiveCall/setActiveCall`
|
|
50
|
-
- `CCBarClient.setAgentStatus`
|
|
51
|
-
- `CCBarClient.media` 设备与音频控制
|
|
52
|
-
- `CCBarClient.on/off` 类型化事件
|
|
53
|
-
- `CCBarClient.getDiagnostics` 脱敏诊断报告
|
|
54
|
-
- `CCBarCall.mute/unmute/hold/resume/sendDtmf/transfer/hangup`
|
|
55
|
-
|
|
56
|
-
PC Web 支持完整 Core 通话能力。移动 H5 首期仅承诺受支持系统浏览器中的前台单路外呼;来电、保持、转接、后台和锁屏通话不在承诺范围内。
|
|
57
|
-
|
|
58
|
-
## Legacy Adapter
|
|
59
|
-
|
|
60
|
-
只有显式导入 Legacy 子路径才会在浏览器附加 `window.CCBarSDK`;根入口没有该副作用。Legacy 子路径同样可以安全地在 SSR 中导入。
|
|
61
|
-
|
|
62
|
-
```ts
|
|
63
|
-
import { CCBarSDK } from '@16x/webphone-sdk/legacy';
|
|
64
|
-
|
|
65
|
-
const legacy = new CCBarSDK({
|
|
66
|
-
platform: 'web',
|
|
67
|
-
tokenProvider: async () => fetch('/api/webphone-token', {
|
|
68
|
-
method: 'POST',
|
|
69
|
-
credentials: 'include',
|
|
70
|
-
}).then(response => response.json()),
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
await legacy.login();
|
|
74
|
-
const call = await legacy.call('13800138000');
|
|
75
|
-
await legacy.hangup();
|
|
76
|
-
await legacy.signOut();
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
旧方法映射如下:
|
|
80
|
-
|
|
81
|
-
| Legacy | Core |
|
|
82
|
-
|---|---|
|
|
83
|
-
| `getToken()` / `getAccount()` / `login()` | `client.connect()` |
|
|
84
|
-
| `call(number)` | `client.dial({ destination: number })` |
|
|
85
|
-
| `insideCall(number)` | `client.dial({ destination: number, type: 'extension' })` |
|
|
86
|
-
| `answer()` | 当前 `call.answer()` |
|
|
87
|
-
| `hangup()` | 当前 `call.hangup()` |
|
|
88
|
-
| `holdCall()` / `unholdCall()` | 当前 `call.hold()` / `call.resume()` |
|
|
89
|
-
| `transSo(number)` | 当前 `call.transfer({ target: number, type: 'blind' })` |
|
|
90
|
-
| `setId()` / `setRe()` | `client.setAgentStatus('available' / 'break')` |
|
|
91
|
-
| `signOut()` | `client.disconnect()` 后 `client.dispose()` |
|
|
92
|
-
|
|
93
|
-
`insideCall(number)` 会使用 `type: 'extension'` 标记 SIP 呼叫,浏览器不拼接客户前缀;后端按当前会话租户解析分机并路由到同租户坐席。普通 `dial()` 不传 type,继续按外呼处理。
|
|
94
|
-
|
|
95
|
-
`setBu()` 不会伪造 `busy`。该方法抛出 `DeprecatedError`,因为忙碌状态应由通话状态或服务端状态策略驱动。所有 Legacy 方法仅在开发构建中各警告一次,生产构建不输出弃用日志。`signOut()` 是终态操作;如需保留实例以便重新连接,请直接使用 Core 的 `disconnect()`。
|
|
96
|
-
|
|
97
|
-
## 开发与验收
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
npm run lint
|
|
101
|
-
npm run typecheck
|
|
102
|
-
npm test
|
|
103
|
-
npm run build
|
|
104
|
-
npm run pack:check
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
正式包通过 `exports` 提供根入口、`/ui`、`/legacy`、`/diagnostics` 和 `/styles.css`,不包含测试、示例、Source Map 或凭证文件。
|
|
108
|
-
|
|
109
|
-
## License
|
|
110
|
-
|
|
111
|
-
Copyright 16X. All rights reserved.
|
|
112
|
-
|
|
113
|
-
Private customer distribution only. No redistribution or sublicensing without written permission.
|
|
1
|
+
# CCBar WebPhone SDK Core
|
|
2
|
+
|
|
3
|
+
`@16x/webphone-sdk` 是 CCBar WebPhone 的 TypeScript SDK。Core 提供无 UI 的连接、通话、媒体设备、重连和脱敏诊断能力,可用于 Vue、React、原生 Web 与受支持的移动浏览器。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @16x/webphone-sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
公开包地址:[https://www.npmjs.com/package/@16x/webphone-sdk](https://www.npmjs.com/package/@16x/webphone-sdk)。任何人都可以直接安装,不需要 token。
|
|
12
|
+
|
|
13
|
+
浏览器只应接收客户服务端签发的短期 WebPhone Access Token。不要把 `appSecret`、固定 SIP 密码或 TURN 密码写入前端代码、示例、日志或构建产物。客户从安装到首通的完整路径见 `docs/quick-start.md`,PC/H5 选择见 `docs/guides/mobile-h5.md`。
|
|
14
|
+
|
|
15
|
+
## Core 快速开始
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { CCBarClient } from '@16x/webphone-sdk';
|
|
19
|
+
|
|
20
|
+
const client = new CCBarClient({
|
|
21
|
+
platform: 'web',
|
|
22
|
+
tokenProvider: async () => {
|
|
23
|
+
const response = await fetch('/api/webphone-token', {
|
|
24
|
+
method: 'POST',
|
|
25
|
+
credentials: 'include',
|
|
26
|
+
});
|
|
27
|
+
if (!response.ok) throw new Error('获取外呼凭证失败');
|
|
28
|
+
return response.json();
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
await client.initialize();
|
|
33
|
+
await client.connect();
|
|
34
|
+
|
|
35
|
+
const call = await client.dial({ destination: '13800138000' });
|
|
36
|
+
await call.hangup();
|
|
37
|
+
|
|
38
|
+
await client.disconnect();
|
|
39
|
+
await client.dispose();
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
在 SPA 中应由应用级容器持有一个 `CCBarClient`。`connect()`、`disconnect()` 和 `dispose()` 支持幂等调用;组件卸载或应用退出时必须调用 `dispose()` 释放 Timer、Listener、WebSocket、PeerConnection、Track 和 Audio 资源。
|
|
43
|
+
|
|
44
|
+
根入口与 `/diagnostics` 可在 SSR/Node 导入阶段安全加载,不会访问 `window`、`document` 或 `navigator`。浏览器媒体能力只在初始化或后续操作时检测。
|
|
45
|
+
|
|
46
|
+
## 主要 API
|
|
47
|
+
|
|
48
|
+
- `CCBarClient.initialize/connect/disconnect/dispose`
|
|
49
|
+
- `CCBarClient.dial/getCalls/getActiveCall/setActiveCall`
|
|
50
|
+
- `CCBarClient.setAgentStatus`
|
|
51
|
+
- `CCBarClient.media` 设备与音频控制
|
|
52
|
+
- `CCBarClient.on/off` 类型化事件
|
|
53
|
+
- `CCBarClient.getDiagnostics` 脱敏诊断报告
|
|
54
|
+
- `CCBarCall.mute/unmute/hold/resume/sendDtmf/transfer/hangup`
|
|
55
|
+
|
|
56
|
+
PC Web 支持完整 Core 通话能力。移动 H5 首期仅承诺受支持系统浏览器中的前台单路外呼;来电、保持、转接、后台和锁屏通话不在承诺范围内。
|
|
57
|
+
|
|
58
|
+
## Legacy Adapter
|
|
59
|
+
|
|
60
|
+
只有显式导入 Legacy 子路径才会在浏览器附加 `window.CCBarSDK`;根入口没有该副作用。Legacy 子路径同样可以安全地在 SSR 中导入。
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
import { CCBarSDK } from '@16x/webphone-sdk/legacy';
|
|
64
|
+
|
|
65
|
+
const legacy = new CCBarSDK({
|
|
66
|
+
platform: 'web',
|
|
67
|
+
tokenProvider: async () => fetch('/api/webphone-token', {
|
|
68
|
+
method: 'POST',
|
|
69
|
+
credentials: 'include',
|
|
70
|
+
}).then(response => response.json()),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await legacy.login();
|
|
74
|
+
const call = await legacy.call('13800138000');
|
|
75
|
+
await legacy.hangup();
|
|
76
|
+
await legacy.signOut();
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
旧方法映射如下:
|
|
80
|
+
|
|
81
|
+
| Legacy | Core |
|
|
82
|
+
|---|---|
|
|
83
|
+
| `getToken()` / `getAccount()` / `login()` | `client.connect()` |
|
|
84
|
+
| `call(number)` | `client.dial({ destination: number })` |
|
|
85
|
+
| `insideCall(number)` | `client.dial({ destination: number, type: 'extension' })` |
|
|
86
|
+
| `answer()` | 当前 `call.answer()` |
|
|
87
|
+
| `hangup()` | 当前 `call.hangup()` |
|
|
88
|
+
| `holdCall()` / `unholdCall()` | 当前 `call.hold()` / `call.resume()` |
|
|
89
|
+
| `transSo(number)` | 当前 `call.transfer({ target: number, type: 'blind' })` |
|
|
90
|
+
| `setId()` / `setRe()` | `client.setAgentStatus('available' / 'break')` |
|
|
91
|
+
| `signOut()` | `client.disconnect()` 后 `client.dispose()` |
|
|
92
|
+
|
|
93
|
+
`insideCall(number)` 会使用 `type: 'extension'` 标记 SIP 呼叫,浏览器不拼接客户前缀;后端按当前会话租户解析分机并路由到同租户坐席。普通 `dial()` 不传 type,继续按外呼处理。
|
|
94
|
+
|
|
95
|
+
`setBu()` 不会伪造 `busy`。该方法抛出 `DeprecatedError`,因为忙碌状态应由通话状态或服务端状态策略驱动。所有 Legacy 方法仅在开发构建中各警告一次,生产构建不输出弃用日志。`signOut()` 是终态操作;如需保留实例以便重新连接,请直接使用 Core 的 `disconnect()`。
|
|
96
|
+
|
|
97
|
+
## 开发与验收
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
npm run lint
|
|
101
|
+
npm run typecheck
|
|
102
|
+
npm test
|
|
103
|
+
npm run build
|
|
104
|
+
npm run pack:check
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
正式包通过 `exports` 提供根入口、`/ui`、`/legacy`、`/diagnostics` 和 `/styles.css`,不包含测试、示例、Source Map 或凭证文件。
|
|
108
|
+
|
|
109
|
+
## License
|
|
110
|
+
|
|
111
|
+
Copyright 16X. All rights reserved.
|
|
112
|
+
|
|
113
|
+
Private customer distribution only. No redistribution or sublicensing without written permission.
|