@bravophone/webphone 0.2.1 → 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 +74 -11
- package/dist/bravophone.mjs +167 -161
- package/dist/bravophone.umd.js +4 -4
- package/host/popup.js +1 -1
- package/package.json +4 -2
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,46 @@ 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
|
+
|
|
333
396
|
## Documentação
|
|
334
397
|
|
|
335
398
|
| Documento | Para quem |
|
|
@@ -346,7 +409,7 @@ um major não quebre a página deles.
|
|
|
346
409
|
| Opção | Tipo | Padrão | Descrição |
|
|
347
410
|
|---|---|---|---|
|
|
348
411
|
| `token` | `string` | — | Token de sessão emitido pelo seu backend |
|
|
349
|
-
| `mode` | `'
|
|
412
|
+
| `mode` | `'srcdoc' \| 'hosted'` | `'srcdoc'` | Como o webphone é carregado — ver abaixo |
|
|
350
413
|
| `hostUrl` | `string` | `https://webphone.bravophone.com/` | Origem do webphone (só no modo `hosted`) |
|
|
351
414
|
| `position` | `string` | `'bottom-right'` | Canto inicial |
|
|
352
415
|
| `open` | `boolean` | `false` | Abrir já visível |
|
|
@@ -385,7 +448,7 @@ Bravophone.init({ token }) // hospedado (padrão)
|
|
|
385
448
|
Bravophone.init({ token, mode: 'srcdoc' }) // na origem do próprio site
|
|
386
449
|
```
|
|
387
450
|
|
|
388
|
-
| | `
|
|
451
|
+
| | `srcdoc` (padrão) | `hosted` |
|
|
389
452
|
|---|---|---|
|
|
390
453
|
| Onde o iframe roda | `webphone.bravophone.com` | origem do próprio site |
|
|
391
454
|
| De onde vêm os arquivos | do host | do CDN, travados nesta versão |
|