@softomnitel/omnicall-kit 0.1.2 → 0.1.3
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 +58 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -39,6 +39,7 @@ console.log(snapshot.revision);
|
|
|
39
39
|
- [Основные понятия](#основные-понятия)
|
|
40
40
|
- [Состояния и события](#состояния-и-события)
|
|
41
41
|
- [API Reference](#api-reference)
|
|
42
|
+
- [Форматы успешных ответов](#форматы-успешных-ответов)
|
|
42
43
|
- [Рецепты](#рецепты)
|
|
43
44
|
- [Ошибки и FAQ](#ошибки-и-faq)
|
|
44
45
|
- [Миграция и совместимость](#миграция-и-совместимость)
|
|
@@ -66,7 +67,7 @@ npm install @softomnitel/omnicall-kit
|
|
|
66
67
|
закрытом npm registry:
|
|
67
68
|
|
|
68
69
|
```bash
|
|
69
|
-
npm install @softomnitel/omnicall-kit@0.1.
|
|
70
|
+
npm install @softomnitel/omnicall-kit@0.1.3
|
|
70
71
|
```
|
|
71
72
|
|
|
72
73
|
Пакет ESM-only. Импортируйте его через `import`, а не `require`.
|
|
@@ -101,7 +102,7 @@ const client = createOmniCallClient({
|
|
|
101
102
|
url: 'ws://127.0.0.1:17341/omnicall/v1/ws',
|
|
102
103
|
origin: window.location.origin,
|
|
103
104
|
application: { name: 'my-crm', version: '1.0.0' },
|
|
104
|
-
sdkVersion: '0.1.
|
|
105
|
+
sdkVersion: '0.1.3',
|
|
105
106
|
requestedProfile: 'call_controller',
|
|
106
107
|
requestedCapabilities: [
|
|
107
108
|
'session.read.redacted',
|
|
@@ -206,6 +207,61 @@ console.log(result.callId, result.revision);
|
|
|
206
207
|
Не повторяйте автоматически `originate`, `hangup`, `logout` или
|
|
207
208
|
`activateProfile` после reconnect. Эти действия могут сработать дважды.
|
|
208
209
|
|
|
210
|
+
## Форматы успешных ответов
|
|
211
|
+
|
|
212
|
+
Асинхронная команда либо завершается типизированным успешным результатом, либо
|
|
213
|
+
отклоняет `Promise` с `OmniCallClientError`. Ошибка никогда не приходит как
|
|
214
|
+
частично успешный объект. Поле `revision` в успешном результате — версия Desktop
|
|
215
|
+
после команды; перед следующей мутацией всё равно получите свежий snapshot, если
|
|
216
|
+
события или другая вкладка могли изменить состояние.
|
|
217
|
+
|
|
218
|
+
| Команда | Успешный ответ | Как обрабатывать |
|
|
219
|
+
| --- | --- | --- |
|
|
220
|
+
| `calls.*` | `{ callId, revision }` | Команда принята для этого звонка. Фазу звонка показывайте по событию или snapshot, а не предполагаемому результату команды. |
|
|
221
|
+
| `operator.getReasons()` | `{ reasons: [{ id, label, kind }], revision }` | Фильтруйте по `kind`; в следующую команду передавайте выбранный числовой `id`. |
|
|
222
|
+
| `operator.changeStatus()` | `{ accepted: true, kind, targetStatus, reasonId, revision }` | Обязательно ветвитесь по `kind`: `applied` меняет статус сейчас, `reserved` только бронирует `targetStatus`/`reasonId` до конца обращения. |
|
|
223
|
+
| `operator.finishAppeal()` | Та же форма, что у `changeStatus()` | Разрешён только при `post_call_processing`; применяет бронь либо Desktop-default Ready. |
|
|
224
|
+
| `account.logout()` | `{ loggedOut: true, revision }` | Очищайте UI сессии после ответа/события или подтверждающего snapshot. `interaction_required` — это отклонение Promise, а не вариант успеха. |
|
|
225
|
+
| `account.activateProfile()` | `{ activated: true, mode, profileLabel?, alreadyAuthenticated?, revision }` | `alreadyAuthenticated: true` — успешный no-op. В ответе никогда нет пароля или ключа OCP. |
|
|
226
|
+
| `window.show()` / `hide()` / `getState()` | `{ visible, revision }` | Используйте фактическое `visible`; `show()` и `getState()` не требуют `expectedRevision`. |
|
|
227
|
+
|
|
228
|
+
### Смена статуса и резервирование
|
|
229
|
+
|
|
230
|
+
`changeStatus()` — единственная публичная команда для намерения Ready/Break.
|
|
231
|
+
Не создавайте отдельный reserve API и не решайте на стороне CRM, занят ли оператор:
|
|
232
|
+
Desktop сам выбирает результат.
|
|
233
|
+
|
|
234
|
+
```ts
|
|
235
|
+
const result = await client.operator.changeStatus({
|
|
236
|
+
target: 'break',
|
|
237
|
+
reasonId: 12,
|
|
238
|
+
expectedRevision: await getRevision()
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
if (result.kind === 'applied') {
|
|
242
|
+
// targetStatus применён сейчас; обновление UI всё равно подтвердят событие/snapshot.
|
|
243
|
+
} else {
|
|
244
|
+
// Бронь после текущего обращения: текущий статус-chip не становится Break.
|
|
245
|
+
// result.targetStatus и result.reasonId — забронированные значения.
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
При `kind: 'reserved'` текущий публичный статус может остаться `unknown` во
|
|
250
|
+
время звонка или стать `post_call_processing` после него. Долгоживущую бронь
|
|
251
|
+
восстанавливайте только из свежего
|
|
252
|
+
`snapshot.sections.operator?.reservedTarget` /
|
|
253
|
+
`reservedReasonId` или `operator:status-changed`, особенно после reconnect.
|
|
254
|
+
|
|
255
|
+
Когда snapshot показывает `post_call_processing`, вызовите
|
|
256
|
+
`finishAppeal({ expectedRevision })`. Его успешный ответ имеет ту же форму:
|
|
257
|
+
`kind: 'applied'`, `targetStatus` и `reasonId` — значения, фактически применённые
|
|
258
|
+
Desktop. Вне post-call команда отклоняется `conflict`
|
|
259
|
+
(`failure_kind: 'not_in_post_call_processing'`); ждите корректный snapshot, а не
|
|
260
|
+
повторяйте запрос в цикле.
|
|
261
|
+
|
|
262
|
+
`error.details` остаётся расширяемым объектом. Не разбирайте его произвольные
|
|
263
|
+
поля: используйте type guard и `read*Details` из раздела API Reference.
|
|
264
|
+
|
|
209
265
|
## Состояния и события
|
|
210
266
|
|
|
211
267
|
### Состояния подключения
|