@tmsoft/webphone 1.1.25 → 2.0.6

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 CHANGED
@@ -1,215 +1,194 @@
1
- # WebPhone Library (`@tmsoft/webphone`)
1
+ # @tmsoft/webphone
2
2
 
3
- [![NPM Version](https://img.shields.io/npm/v/@tmsoft/webphone)](https://www.npmjs.com/package/@tmsoft/webphone)
3
+ [![npm version](https://img.shields.io/npm/v/@tmsoft/webphone.svg)](https://www.npmjs.com/package/@tmsoft/webphone)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
4
5
 
5
- Librería para Vue 3 con un componente `WebPhone` (softphone) basado en SIP y WebRTC. Incluye teclado DTMF, selección de dispositivos de audio, control de volúmenes y estado de conexión.
6
+ SIP softphone component for Vue 3 and Web Components.
6
7
 
8
+ ## Installation
7
9
 
8
- ### Características
9
- - Integración SIP sobre WebSocket (basado en JsSIP)
10
- - Audio WebRTC con manejo de permisos de micrófono
11
- - Teclado DTMF y estado de llamada (entrante/saliente/en curso)
12
- - Gestión de dispositivos de audio (micrófonos y altavoces)
13
- - Reconexión y manejo de estado SIP
14
- - Diseño compacto y dependencias UI mínimas (PrimeVue para botones/inputs)
15
-
16
-
17
- ### Requisitos
18
- - Vue 3.5+
19
- - PrimeVue 4.x y PrimeIcons 7.x (peer dependencies)
20
- - @vueuse/core 13.x (peer dependency)
21
- - Servidor SIP con WebSocket habilitado (por ejemplo, Asterisk en `/asterisk/ws`, puerto 8089 por defecto)
22
- - Navegador con HTTPS y permisos de micrófono
23
-
24
-
25
- ## Instalación
26
-
27
- Instale el paquete y los peer dependencies:
28
-
29
- ```sh
30
- npm install @tmsoft/webphone primevue primeicons @vueuse/core
31
- # o
32
- yarn add @tmsoft/webphone primevue primeicons @vueuse/core
33
- # o
34
- pnpm add @tmsoft/webphone primevue primeicons @vueuse/core
35
- ```
36
-
37
- Los estilos del componente se inyectan automáticamente en tiempo de ejecución. No es necesario configurar Tailwind en su proyecto para usar esta librería.
38
-
39
-
40
- ## Uso
41
-
42
- Puede utilizar la librería como plugin global o importar el componente localmente.
43
-
44
- ### Opción A: Plugin global
45
- `main.ts`:
46
-
47
- ```ts
48
- import { createApp } from 'vue'
49
- import App from './App.vue'
50
- import WebphonePlugin from '@tmsoft/webphone'
51
-
52
- const app = createApp(App)
53
- app.use(WebphonePlugin)
54
- app.mount('#app')
10
+ ```bash
11
+ npm install @tmsoft/webphone
55
12
  ```
56
13
 
57
- Luego, en cualquier componente:
58
-
59
- ```vue
60
- <script setup lang="ts">
61
- const extension = '1001'
62
- const password = 'supersecret'
63
- const domain = 'sip.example.com' // ver normalización de dominio más abajo
64
- </script>
65
-
66
- <template>
67
- <WebPhone :extension="extension" :password="password" :domain="domain" />
68
- </template>
69
- ```
14
+ ## Usage
70
15
 
71
- ### Opción B: Importación local del componente
16
+ ### Vue 3
72
17
 
73
18
  ```vue
74
19
  <script setup lang="ts">
75
20
  import { WebPhone } from '@tmsoft/webphone'
21
+ import type { WebPhoneContact } from '@tmsoft/webphone'
76
22
 
77
- const extension = '1001'
78
- const password = 'supersecret'
79
- const domain = 'sip.example.com'
23
+ const contacts: WebPhoneContact[] = [
24
+ { name: 'Support', number: '1000', type: 'extension' },
25
+ { name: 'Sales', number: '2000', type: 'extension' },
26
+ ]
80
27
  </script>
81
28
 
82
29
  <template>
83
- <WebPhone :extension="extension" :password="password" :domain="domain" />
30
+ <WebPhone
31
+ host="pbx.example.com"
32
+ extension="1001"
33
+ password="your-password"
34
+ :contacts="contacts"
35
+ @back="handleBack"
36
+ />
84
37
  </template>
85
38
  ```
86
39
 
40
+ ### Web Component
87
41
 
88
- ## API del componente
42
+ ```html
43
+ <script src="https://unpkg.com/@tmsoft/webphone/dist/webphone.component.js"></script>
44
+
45
+ <web-phone
46
+ host="pbx.example.com"
47
+ extension="1001"
48
+ password="your-password"
49
+ contacts='[{"name":"Support","number":"1000","type":"extension"}]'
50
+ ></web-phone>
51
+ ```
89
52
 
90
- ### Props
53
+ ## Props
54
+
55
+ | Prop | Type | Required | Default | Description |
56
+ | ----------- | -------------------------------- | -------- | -------- | ---------------------------------------------------------------------------------------------------- |
57
+ | `host` | `string` | Yes | — | SIP server host (e.g., `pbx.example.com`). WebSocket URL is built as `wss://<host>:8089/asterisk/ws` |
58
+ | `extension` | `string` | Yes | — | SIP extension for registration and calls |
59
+ | `password` | `string` | Yes | — | SIP password |
60
+ | `mode` | `'webcall' \| 'call' \| 'video'` | No | `'call'` | Operating mode |
61
+ | `logo` | `string` | No | — | Logo URL or base64 for `webcall` mode |
62
+ | `to` | `string` | No | — | Destination number for `webcall` mode. Auto-dials when SIP registration is active (~2s) |
63
+ | `contacts` | `WebPhoneContact[]` | No | `[]` | Contact list |
64
+
65
+ ## Modes
66
+
67
+ | Mode | Description |
68
+ | --------- | ------------------------------------------------------------------------------------------------------------------------- |
69
+ | `call` | Standard softphone with keypad, contacts, and call history. Full-featured interface for making and receiving audio calls. |
70
+ | `video` | Same as `call` mode but with video support enabled. Displays local and remote video streams during calls. |
71
+ | `webcall` | Simplified click-to-call widget. Requires `to` and `logo` props. Ideal for embedding a quick-call button on websites. |
72
+
73
+ ## Types
74
+
75
+ ```typescript
76
+ interface WebPhoneContact {
77
+ name: string
78
+ number: string
79
+ type?: 'tool' | 'extension' | 'contact' | 'voicemail'
80
+ }
81
+ ```
91
82
 
92
- | Propiedad | Tipo | Requerida | Default | Descripción |
93
- |------------|--------------------------------------|-----------|-----------|-------------|
94
- | `extension`| `string` | Sí | — | Extensión del usuario para registrar y originar llamadas SIP. |
95
- | `password` | `string` | Sí | — | Contraseña SIP de la extensión. |
96
- | `domain` | `string` | Sí | — | Dominio o URL del servidor SIP. Se normaliza automáticamente (ver detalle). |
97
- | `mode` | `'webcall' \| 'call' \| 'video'` | No | `'webcall'` | Modo de uso. Nota: `video` aún no inicia video de forma automática. |
98
- | `image` | `string` | No | — | URL o base64 para mostrar un logotipo en modo `webcall`. |
99
- | `to` | `string` | No | — | Número destino en modo `webcall`. Si se define, se origina la llamada automáticamente cuando el registro SIP está activo (≈ 2 s). |
100
- | `callback` | `(event: MouseEvent) => void` | No | — | Reservado. Actualmente no se utiliza en el componente. |
83
+ ## Emits
101
84
 
85
+ | Emit | Description |
86
+ | ------ | ----------------------------------- |
87
+ | `back` | Emitted when back button is pressed |
102
88
 
103
- ### Normalización de `domain`
104
- El componente acepta distintos formatos y construye automáticamente la URL WebSocket para SIP:
105
- - Si recibe solo host (por ejemplo, `pbx.midominio.com`), se asume `wss://pbx.midominio.com:8089/asterisk/ws`.
106
- - Si recibe `http://host[:puerto]` se usa `ws://host[:puerto]/asterisk/ws`.
107
- - Si recibe `https://host[:puerto]` se usa `wss://host[:puerto]/asterisk/ws`.
108
- - Si indica explícitamente un puerto, se respeta (de lo contrario, se usa 8089 por defecto para Asterisk).
89
+ ## Examples
109
90
 
110
- Además, el URI SIP se compone como `sip:<extension>@<host[:puerto]>`.
91
+ ### Call Mode (Default)
111
92
 
93
+ Standard softphone with full interface.
112
94
 
113
- ### Slots
114
- - `back-button`: slot para renderizar un control de navegación en la cabecera cuando `mode === 'webcall'`.
95
+ ```vue
96
+ <WebPhone
97
+ host="pbx.example.com"
98
+ extension="1001"
99
+ password="secret"
100
+ mode="call"
101
+ :contacts="contacts"
102
+ />
103
+ ```
115
104
 
105
+ ### Video Mode
116
106
 
117
- ## Uso via CDN
107
+ Softphone with video support.
118
108
 
119
- ### ES Module (recomendado)
109
+ ```vue
110
+ <WebPhone
111
+ host="pbx.example.com"
112
+ extension="1001"
113
+ password="secret"
114
+ mode="video"
115
+ :contacts="contacts"
116
+ />
117
+ ```
120
118
 
121
- ```html
122
- <script type="module">
123
- import { createApp } from 'vue'
124
- import WebphonePlugin from 'https://cdn.jsdelivr.net/npm/@tmsoft/webphone/dist/webphone.es.js'
119
+ ### WebCall Mode
125
120
 
126
- const App = {
127
- template: '<WebPhone extension="1001" password="supersecret" domain="sip.example.com" />'
128
- }
121
+ Click-to-call widget for websites.
129
122
 
130
- createApp(App).use(WebphonePlugin).mount('#app')
131
- </script>
123
+ ```vue
124
+ <WebPhone
125
+ host="pbx.example.com"
126
+ extension="1001"
127
+ password="secret"
128
+ mode="webcall"
129
+ to="5551234567"
130
+ logo="https://your-site.com/logo.png"
131
+ />
132
132
  ```
133
133
 
134
- ### UMD
135
-
136
134
  ```html
137
- <!-- Vue 3 UMD -->
138
- <script src="https://unpkg.com/vue@3"></script>
139
- <!-- WebPhone UMD -->
140
- <script src="https://cdn.jsdelivr.net/npm/@tmsoft/webphone/dist/webphone.umd.js"></script>
141
- <script>
142
- const app = Vue.createApp({
143
- template: '<WebPhone extension="1001" password="supersecret" domain="sip.example.com" />'
144
- })
145
- // El paquete UMD expone 'WebPhone' como global; la función por defecto es el plugin
146
- app.use(WebPhone.default)
147
- app.mount('#app')
148
- </script>
135
+ <!-- Web Component -->
136
+ <web-phone
137
+ host="pbx.example.com"
138
+ extension="1001"
139
+ password="secret"
140
+ mode="webcall"
141
+ to="5551234567"
142
+ logo="https://your-site.com/logo.png"
143
+ ></web-phone>
149
144
  ```
150
145
 
151
- ### Sin frameworks: Web Component (`<web-phone />`)
146
+ ## Development
152
147
 
153
- Para incrustar el softphone en una página HTML sin inicializar Vue ni otros frameworks, use el build UMD específico del Web Component:
148
+ ### Prerequisites
154
149
 
155
- ```html
156
- <!-- Carga el Web Component listo para usar -->
157
- <script src="https://cdn.jsdelivr.net/npm/@tmsoft/webphone/dist/webphone-element.umd.js"></script>
150
+ - Node.js ^20.19.0 || >=22.12.0
151
+ - Yarn
158
152
 
159
- <!-- Úselo directamente en el DOM -->
160
- <web-phone extension="1001" password="supersecret" domain="sip.example.com" mode="webcall" to="099999999" image="https://example.com/logo.png"></web-phone>
153
+ ### Setup
154
+
155
+ ```bash
156
+ # Install dependencies
157
+ yarn install
158
+
159
+ # Start development server
160
+ yarn dev
161
161
  ```
162
162
 
163
- Notas:
164
- - Los atributos del elemento corresponden a las props del componente (`extension`, `password`, `domain`, `mode`, `image`, `to`).
165
- - El build del Web Component incluye internamente Vue, PrimeVue y estilos necesarios; no requiere inicialización adicional.
163
+ ### Scripts
166
164
 
165
+ | Command | Description |
166
+ | -------------------- | ------------------------------ |
167
+ | `yarn dev` | Start development server |
168
+ | `yarn build` | Build for production |
169
+ | `yarn build:lib` | Build library for distribution |
170
+ | `yarn test:unit` | Run unit tests in watch mode |
171
+ | `yarn test:coverage` | Run tests with coverage report |
172
+ | `yarn lint` | Run ESLint |
173
+ | `yarn type-check` | Run TypeScript type checking |
167
174
 
168
- ## Desarrollo
175
+ ### Testing
169
176
 
170
- Scripts principales:
177
+ The project uses Vitest for unit testing with the following coverage thresholds:
171
178
 
172
- ```sh
173
- npm run dev # entorno de desarrollo
174
- npm run build # compila ESM/CJS y UMD
175
- npm run preview # vista previa local de la build
176
- npm run test:unit # pruebas unitarias (Vitest)
177
- npm run test:e2e # pruebas E2E (Playwright)
178
- npm run lint # lint con ESLint
179
- npm run format # formateo con Prettier
180
- ```
179
+ - Statements: 80%
180
+ - Branches: 70%
181
+ - Functions: 70%
182
+ - Lines: 80%
181
183
 
182
- La salida de distribución se genera en `dist/`:
183
- - `webphone.es.js` (ES Module)
184
- - `webphone.cjs.js` (CommonJS)
185
- - `webphone.umd.js` (UMD)
186
- - `index.d.ts` (tipos TypeScript)
187
-
188
-
189
- ## Publicación en NPM
190
-
191
- Pasos sugeridos para publicar una versión:
192
-
193
- 1. Autentíquese en NPM (una vez por entorno):
194
- ```sh
195
- npm login
196
- ```
197
- 2. Compile el paquete:
198
- ```sh
199
- npm run build
200
- ```
201
- 3. Publique con incremento de patch automático:
202
- ```sh
203
- npm run publish:lib
204
- ```
205
- Este script ejecuta `npm version patch` y `npm publish --access public`.
206
-
207
- Para publicar en un registro local (por ejemplo, Verdaccio):
208
- ```sh
209
- npm run publish:local
210
- ```
184
+ ```bash
185
+ # Run tests
186
+ yarn test:unit
211
187
 
188
+ # Run tests with coverage
189
+ yarn test:coverage
190
+ ```
212
191
 
213
- ## Licencia
192
+ ## License
214
193
 
215
- MIT.
194
+ MIT
package/dist/favicon.ico CHANGED
Binary file
package/dist/index.d.ts CHANGED
@@ -1,68 +1,2 @@
1
- import { ComponentOptionsMixin } from 'vue';
2
- import { ComponentProvideOptions } from 'vue';
3
- import { DefineComponent } from 'vue';
4
- import { PublicProps } from 'vue';
5
-
6
- declare const __VLS_component: DefineComponent<WebphoneProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<WebphoneProps> & Readonly<{}>, {
7
- mode: "webcall" | "call" | "video";
8
- }, {}, {}, {}, string, ComponentProvideOptions, false, {
9
- playerRef: HTMLAudioElement;
10
- ringerRef: HTMLAudioElement;
11
- backRingerRef: HTMLAudioElement;
12
- viewerRef: HTMLVideoElement;
13
- selfViewerRef: HTMLVideoElement;
14
- transcriptRef: HTMLDivElement;
15
- }, any>;
16
-
17
- declare function __VLS_template(): {
18
- attrs: Partial<{}>;
19
- slots: {
20
- 'back-button'?(_: {}): any;
21
- };
22
- refs: {
23
- playerRef: HTMLAudioElement;
24
- ringerRef: HTMLAudioElement;
25
- backRingerRef: HTMLAudioElement;
26
- viewerRef: HTMLVideoElement;
27
- selfViewerRef: HTMLVideoElement;
28
- transcriptRef: HTMLDivElement;
29
- };
30
- rootEl: any;
31
- };
32
-
33
- declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
34
-
35
- declare type __VLS_WithTemplateSlots<T, S> = T & {
36
- new (): {
37
- $slots: S;
38
- };
39
- };
40
-
41
- export declare const WebPhone: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
42
-
43
- declare interface WebphoneProps {
44
- extension: string;
45
- password: string;
46
- domain: string;
47
- mode: 'webcall' | 'call' | 'video';
48
- image?: string;
49
- to?: string;
50
- callback?: (event: MouseEvent) => void;
51
- /**
52
- * (Opcional) Habilita la vista de múltiples canales de llamada
53
- * Si es false o no se especifica, usa la vista de canal único tradicional
54
- */
55
- multiChannel?: boolean;
56
- /**
57
- * (Opcional) Endpoint backend que devuelve el token efímero para OpenAI Realtime.
58
- * Si se provee, se asigna a window.__WEBPHONE_TRANSCRIPTION_TOKEN_URL__ automáticamente.
59
- */
60
- transcriptionTokenUrl?: string;
61
- /**
62
- * (Opcional) API key para solicitar el token efímero al endpoint indicado en `transcriptionTokenUrl`.
63
- * Se envía en el header `api-key`.
64
- */
65
- transcriptionTokenApiKey?: string;
66
- }
67
-
68
- export { }
1
+ export * from './lib/index'
2
+ export {}
@@ -0,0 +1,3 @@
1
+ import { default as WebPhone } from '../src/components/WebPhone.vue';
2
+ export { WebPhone };
3
+ export * from './types';
@@ -0,0 +1,17 @@
1
+ export interface WebPhoneContact {
2
+ name: string;
3
+ number: string;
4
+ type?: 'tool' | 'extension' | 'contact' | 'voicemail';
5
+ }
6
+ export interface WebPhoneProps {
7
+ host?: string;
8
+ extension?: string;
9
+ password?: string;
10
+ to?: string;
11
+ mode?: 'webcall' | 'call' | 'video';
12
+ logo?: string;
13
+ contacts?: WebPhoneContact[];
14
+ }
15
+ export interface WebPhoneEmits {
16
+ back: () => void;
17
+ }
@@ -0,0 +1,155 @@
1
+ type __VLS_Props = {
2
+ host?: string;
3
+ extension?: string;
4
+ password?: string;
5
+ to?: string;
6
+ mode?: 'webcall' | 'call' | 'video';
7
+ logo?: string;
8
+ contacts?: {
9
+ name: string;
10
+ number: string;
11
+ type?: 'tool' | 'extension' | 'contact' | 'voicemail';
12
+ }[];
13
+ };
14
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
15
+ back: () => any;
16
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
17
+ onBack?: (() => any) | undefined;
18
+ }>, {
19
+ contacts: {
20
+ name: string;
21
+ number: string;
22
+ type?: "tool" | "extension" | "contact" | "voicemail";
23
+ }[];
24
+ mode: "webcall" | "call" | "video";
25
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
26
+ phoneRef: HTMLDivElement;
27
+ standardHandleRef: HTMLDivElement;
28
+ webcallHandleRef: HTMLDivElement;
29
+ remoteVideoRef: HTMLVideoElement;
30
+ localVideoRef: HTMLVideoElement;
31
+ documentPipRef: ({
32
+ $: import('vue').ComponentInternalInstance;
33
+ $data: {};
34
+ $props: {
35
+ readonly remoteStream: MediaStream | null;
36
+ readonly localStream: MediaStream | null;
37
+ readonly hasVideo: boolean;
38
+ readonly remoteNumber: string;
39
+ readonly isConnected: boolean;
40
+ readonly callStatus: "idle" | "calling" | "incoming" | "connected" | "held";
41
+ readonly isMuted: boolean;
42
+ readonly isHeld: boolean;
43
+ readonly destination?: string | undefined;
44
+ readonly isVideo?: boolean | undefined;
45
+ readonly active?: boolean | undefined;
46
+ readonly autoOpenOnBlur?: boolean | undefined;
47
+ readonly onToggleMute?: (() => any) | undefined;
48
+ readonly onToggleHold?: (() => any) | undefined;
49
+ readonly onTransfer?: (() => any) | undefined;
50
+ readonly "onUpdate:active"?: ((isActive: boolean) => any) | undefined;
51
+ readonly onHangup?: (() => any) | undefined;
52
+ readonly onAnswer?: ((video: boolean) => any) | undefined;
53
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
54
+ $attrs: {
55
+ [x: string]: unknown;
56
+ };
57
+ $refs: {
58
+ [x: string]: unknown;
59
+ };
60
+ $slots: Readonly<{
61
+ [name: string]: import('vue').Slot<any> | undefined;
62
+ }>;
63
+ $root: import('vue').ComponentPublicInstance | null;
64
+ $parent: import('vue').ComponentPublicInstance | null;
65
+ $host: Element | null;
66
+ $emit: ((event: "toggleMute") => void) & ((event: "toggleHold") => void) & ((event: "transfer") => void) & ((event: "update:active", isActive: boolean) => void) & ((event: "hangup") => void) & ((event: "answer", video: boolean) => void);
67
+ $el: any;
68
+ $options: import('vue').ComponentOptionsBase<Readonly<{
69
+ remoteStream: MediaStream | null;
70
+ localStream: MediaStream | null;
71
+ hasVideo: boolean;
72
+ remoteNumber: string;
73
+ isConnected: boolean;
74
+ callStatus: "idle" | "calling" | "incoming" | "connected" | "held";
75
+ isMuted: boolean;
76
+ isHeld: boolean;
77
+ destination?: string;
78
+ isVideo?: boolean;
79
+ active?: boolean;
80
+ autoOpenOnBlur?: boolean;
81
+ }> & Readonly<{
82
+ onToggleMute?: (() => any) | undefined;
83
+ onToggleHold?: (() => any) | undefined;
84
+ onTransfer?: (() => any) | undefined;
85
+ "onUpdate:active"?: ((isActive: boolean) => any) | undefined;
86
+ onHangup?: (() => any) | undefined;
87
+ onAnswer?: ((video: boolean) => any) | undefined;
88
+ }>, {
89
+ open: () => Promise<void>;
90
+ close: () => void;
91
+ toggle: () => void;
92
+ isActive: import('vue').Ref<boolean, boolean>;
93
+ isSupported: import('vue').Ref<boolean, boolean>;
94
+ canUsePip: import('vue').ComputedRef<boolean>;
95
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
96
+ toggleMute: () => any;
97
+ toggleHold: () => any;
98
+ transfer: () => any;
99
+ "update:active": (isActive: boolean) => any;
100
+ hangup: () => any;
101
+ answer: (video: boolean) => any;
102
+ }, string, {}, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
103
+ beforeCreate?: (() => void) | (() => void)[];
104
+ created?: (() => void) | (() => void)[];
105
+ beforeMount?: (() => void) | (() => void)[];
106
+ mounted?: (() => void) | (() => void)[];
107
+ beforeUpdate?: (() => void) | (() => void)[];
108
+ updated?: (() => void) | (() => void)[];
109
+ activated?: (() => void) | (() => void)[];
110
+ deactivated?: (() => void) | (() => void)[];
111
+ beforeDestroy?: (() => void) | (() => void)[];
112
+ beforeUnmount?: (() => void) | (() => void)[];
113
+ destroyed?: (() => void) | (() => void)[];
114
+ unmounted?: (() => void) | (() => void)[];
115
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
116
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
117
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
118
+ };
119
+ $forceUpdate: () => void;
120
+ $nextTick: typeof import('vue').nextTick;
121
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
122
+ } & Readonly<{}> & Omit<Readonly<{
123
+ remoteStream: MediaStream | null;
124
+ localStream: MediaStream | null;
125
+ hasVideo: boolean;
126
+ remoteNumber: string;
127
+ isConnected: boolean;
128
+ callStatus: "idle" | "calling" | "incoming" | "connected" | "held";
129
+ isMuted: boolean;
130
+ isHeld: boolean;
131
+ destination?: string;
132
+ isVideo?: boolean;
133
+ active?: boolean;
134
+ autoOpenOnBlur?: boolean;
135
+ }> & Readonly<{
136
+ onToggleMute?: (() => any) | undefined;
137
+ onToggleHold?: (() => any) | undefined;
138
+ onTransfer?: (() => any) | undefined;
139
+ "onUpdate:active"?: ((isActive: boolean) => any) | undefined;
140
+ onHangup?: (() => any) | undefined;
141
+ onAnswer?: ((video: boolean) => any) | undefined;
142
+ }>, "close" | "toggle" | "open" | "isActive" | "isSupported" | "canUsePip"> & import('vue').ShallowUnwrapRef<{
143
+ open: () => Promise<void>;
144
+ close: () => void;
145
+ toggle: () => void;
146
+ isActive: import('vue').Ref<boolean, boolean>;
147
+ isSupported: import('vue').Ref<boolean, boolean>;
148
+ canUsePip: import('vue').ComputedRef<boolean>;
149
+ }> & {} & import('vue').ComponentCustomProperties & {} & {
150
+ $slots: {
151
+ default?(_: {}): any;
152
+ };
153
+ }) | null;
154
+ }, any>;
155
+ export default _default;