@bravophone/webphone 0.2.0 → 0.3.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/README.md +89 -13
- package/dist/bravophone.mjs +352 -300
- package/dist/bravophone.umd.js +33 -10
- package/host/popup.js +1 -1
- package/host/styles/theme-fixes.css +10 -4
- package/package.json +4 -2
- package/types/index.d.ts +9 -1
package/README.md
CHANGED
|
@@ -1,21 +1,43 @@
|
|
|
1
1
|
# @bravophone/webphone
|
|
2
2
|
|
|
3
|
-
Webphone BRAVOPHONE embutível em qualquer página web
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
Webphone BRAVOPHONE embutível em qualquer página web: o softphone aparece como
|
|
4
|
+
uma janela flutuante arrastável, com as mesmas funcionalidades da extensão de
|
|
5
|
+
navegador.
|
|
6
6
|
|
|
7
7
|
```html
|
|
8
|
-
<script src="https://cdn.jsdelivr.net/npm/@bravophone/webphone@0.1"></script>
|
|
9
8
|
<script>
|
|
10
|
-
|
|
9
|
+
// Resolve a versão publicada e carrega o bundle dela.
|
|
10
|
+
// Duas etapas de propósito: a consulta tem 5 min de cache, o bundle é
|
|
11
|
+
// immutable. Assim as correções chegam em minutos, sem revalidar 30 kB a cada
|
|
12
|
+
// visita — e sem os 7 dias de cache que a URL sem versão carrega.
|
|
13
|
+
fetch('https://data.jsdelivr.com/v1/packages/npm/@bravophone/webphone/resolved')
|
|
14
|
+
.then((r) => r.json())
|
|
15
|
+
.then(({ version }) => {
|
|
16
|
+
const s = document.createElement('script')
|
|
17
|
+
s.src = `https://cdn.jsdelivr.net/npm/@bravophone/webphone@${version}/dist/bravophone.umd.js`
|
|
18
|
+
s.onload = () => Bravophone.init({ token: TOKEN_DO_USUARIO })
|
|
19
|
+
s.onerror = () => console.error('Bravophone: falha ao carregar do CDN')
|
|
20
|
+
document.head.appendChild(s)
|
|
21
|
+
})
|
|
11
22
|
</script>
|
|
12
23
|
```
|
|
13
24
|
|
|
25
|
+
Cole **inline**, não como arquivo externo — um arquivo externo teria o mesmo
|
|
26
|
+
problema de cache que este trecho existe para evitar.
|
|
27
|
+
Detalhes em [Manter o cliente sempre atualizado](#manter-o-cliente-sempre-atualizado).
|
|
28
|
+
|
|
29
|
+
Para travar numa versão (integração de terceiros, ou build com SRI):
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<script src="https://cdn.jsdelivr.net/npm/@bravophone/webphone@0.3.0/dist/bravophone.umd.js"></script>
|
|
33
|
+
<script>Bravophone.init({ token: TOKEN_DO_USUARIO })</script>
|
|
34
|
+
```
|
|
35
|
+
|
|
14
36
|
```js
|
|
15
37
|
// ou via npm
|
|
16
38
|
import Bravophone from '@bravophone/webphone'
|
|
17
39
|
|
|
18
|
-
Bravophone.init({ token
|
|
40
|
+
Bravophone.init({ token })
|
|
19
41
|
Bravophone.on('call:incoming', ({ number }) => console.log('ligação de', number))
|
|
20
42
|
await Bravophone.call('11987654321')
|
|
21
43
|
```
|
|
@@ -55,9 +77,9 @@ todas — é o [`host/shim/chrome-shim.js`](host/shim/chrome-shim.js).
|
|
|
55
77
|
│ │ Shadow DOM · janela arrastável │ │
|
|
56
78
|
│ │ API pública · ponte postMessage │ │
|
|
57
79
|
│ │ │ │
|
|
58
|
-
│ │ ┌─ <iframe>
|
|
59
|
-
│ │ │ origem
|
|
60
|
-
│ │ │
|
|
80
|
+
│ │ ┌─ <iframe srcdoc> ───────────┐ │ │
|
|
81
|
+
│ │ │ origem: a do próprio site │ │ │
|
|
82
|
+
│ │ │ arquivos: CDN (jsDelivr) │ │ │
|
|
61
83
|
│ │ │ │ │ │
|
|
62
84
|
│ │ │ chrome-shim.js │ │ │
|
|
63
85
|
│ │ │ libwebphone.js (604 KB) │ │ │
|
|
@@ -255,6 +277,7 @@ carrega (o mock em `?host=mock` continua funcionando).
|
|
|
255
277
|
| `npm start` | Sobe as duas origens locais (5173 site, 5174 host) |
|
|
256
278
|
| `npm test` | 100 asserções: shim, geometria da janela e aba de abertura |
|
|
257
279
|
| `npm run audit:theme` | Procura texto invisível no tema escuro |
|
|
280
|
+
| `npm run purge` | Limpa o cache do CDN nas URLs sem versão fixa (roda sozinho após o publish) |
|
|
258
281
|
|
|
259
282
|
Abra **http://localhost:5173/**.
|
|
260
283
|
|
|
@@ -330,6 +353,55 @@ um major não quebre a página deles.
|
|
|
330
353
|
|
|
331
354
|
---
|
|
332
355
|
|
|
356
|
+
## Manter o cliente sempre atualizado
|
|
357
|
+
|
|
358
|
+
A intuição diz para usar a URL sem versão. **É a pior escolha para isso**, e os
|
|
359
|
+
headers do CDN mostram por quê:
|
|
360
|
+
|
|
361
|
+
```
|
|
362
|
+
sem versão / @0.2 → max-age=604800 (7 dias no navegador do usuário)
|
|
363
|
+
@0.2.1 exata → immutable (eterno, mas fixo)
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
A URL sem versão é entregue com sete dias de cache **na máquina de quem
|
|
367
|
+
acessa**. Publicar uma correção não alcança essa pessoa: `npm run purge` limpa
|
|
368
|
+
as bordas do CDN, não o cache que já está no navegador dela.
|
|
369
|
+
|
|
370
|
+
O caminho que resolve é [`examples/loader-latest.js`](examples/loader-latest.js),
|
|
371
|
+
que separa as duas coisas:
|
|
372
|
+
|
|
373
|
+
1. pergunta ao CDN qual é a versão atual — resposta com **5 min** de cache;
|
|
374
|
+
2. carrega o bundle daquela versão **exata** — URL imutável, cache eterno.
|
|
375
|
+
|
|
376
|
+
Uma publicação chega em até cinco minutos, e o arquivo pesado vem de um cache
|
|
377
|
+
que nunca precisa ser revalidado. O custo é uma requisição de ~1 kB antes do
|
|
378
|
+
bundle, quase sempre servida do cache.
|
|
379
|
+
|
|
380
|
+
```js
|
|
381
|
+
const { version } = await (await fetch(
|
|
382
|
+
'https://data.jsdelivr.com/v1/packages/npm/@bravophone/webphone/resolved'
|
|
383
|
+
)).json()
|
|
384
|
+
|
|
385
|
+
const s = document.createElement('script')
|
|
386
|
+
s.src = `https://cdn.jsdelivr.net/npm/@bravophone/webphone@${version}/dist/bravophone.umd.js`
|
|
387
|
+
document.head.appendChild(s)
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
Cole isso **inline** na página, não como arquivo externo — um arquivo externo
|
|
391
|
+
teria o mesmo problema de cache que estamos evitando.
|
|
392
|
+
|
|
393
|
+
Os assets do webphone acompanham automaticamente: o `public_path` é gravado com
|
|
394
|
+
a versão do pacote, então carregar o SDK 0.2.1 carrega o host 0.2.1.
|
|
395
|
+
|
|
396
|
+
## Documentação
|
|
397
|
+
|
|
398
|
+
| Documento | Para quem |
|
|
399
|
+
|---|---|
|
|
400
|
+
| [`docs/api.html`](docs/api.html) | Referência completa da API — abra no navegador |
|
|
401
|
+
| [`docs/PARA-IA.md`](docs/PARA-IA.md) | Contexto para um agente de IA implementar a integração |
|
|
402
|
+
| [`examples/integracao.html`](examples/integracao.html) | Exemplo pronto para colar numa página |
|
|
403
|
+
| [`examples/loader.js`](examples/loader.js) | Carregar o SDK por JavaScript (SPA, Tag Manager) |
|
|
404
|
+
|
|
333
405
|
## API
|
|
334
406
|
|
|
335
407
|
### `Bravophone.init(options)`
|
|
@@ -337,7 +409,7 @@ um major não quebre a página deles.
|
|
|
337
409
|
| Opção | Tipo | Padrão | Descrição |
|
|
338
410
|
|---|---|---|---|
|
|
339
411
|
| `token` | `string` | — | Token de sessão emitido pelo seu backend |
|
|
340
|
-
| `mode` | `'
|
|
412
|
+
| `mode` | `'srcdoc' \| 'hosted'` | `'srcdoc'` | Como o webphone é carregado — ver abaixo |
|
|
341
413
|
| `hostUrl` | `string` | `https://webphone.bravophone.com/` | Origem do webphone (só no modo `hosted`) |
|
|
342
414
|
| `position` | `string` | `'bottom-right'` | Canto inicial |
|
|
343
415
|
| `open` | `boolean` | `false` | Abrir já visível |
|
|
@@ -376,7 +448,7 @@ Bravophone.init({ token }) // hospedado (padrão)
|
|
|
376
448
|
Bravophone.init({ token, mode: 'srcdoc' }) // na origem do próprio site
|
|
377
449
|
```
|
|
378
450
|
|
|
379
|
-
| | `
|
|
451
|
+
| | `srcdoc` (padrão) | `hosted` |
|
|
380
452
|
|---|---|---|
|
|
381
453
|
| Onde o iframe roda | `webphone.bravophone.com` | origem do próprio site |
|
|
382
454
|
| De onde vêm os arquivos | do host | do CDN, travados nesta versão |
|
|
@@ -502,8 +574,12 @@ const off = Bravophone.on('call:incoming', (call) => { /* … */ })
|
|
|
502
574
|
off() // remove o listener
|
|
503
575
|
```
|
|
504
576
|
|
|
505
|
-
`ready` · `state` · `call:
|
|
506
|
-
`
|
|
577
|
+
`ready` · `state` · `call:dialing` · `call:incoming` · `call:answered` ·
|
|
578
|
+
`call:ended` · `resize` · `reveal` · `open` · `close` · `error`.
|
|
579
|
+
Use `'*'` para receber todos como `{ event, payload }`.
|
|
580
|
+
|
|
581
|
+
Uma chamada que não completa chega como `call:ended`: o estado do bundle não
|
|
582
|
+
distingue desligar de falhar.
|
|
507
583
|
|
|
508
584
|
---
|
|
509
585
|
|