@bravophone/webphone 0.3.0 → 0.4.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 +53 -5
- package/dist/bravophone.mjs +308 -275
- package/dist/bravophone.umd.js +39 -20
- package/host/js/bravophone-route-selector.js +1 -1
- package/host/popup.js +3 -3
- package/host/shim/guest-bridge.js +23 -7
- package/package.json +2 -2
- package/types/index.d.ts +23 -2
package/README.md
CHANGED
|
@@ -10,12 +10,17 @@ navegador.
|
|
|
10
10
|
// Duas etapas de propósito: a consulta tem 5 min de cache, o bundle é
|
|
11
11
|
// immutable. Assim as correções chegam em minutos, sem revalidar 30 kB a cada
|
|
12
12
|
// visita — e sem os 7 dias de cache que a URL sem versão carrega.
|
|
13
|
-
|
|
13
|
+
// cache:'no-store' na CONSULTA (~1 kB): sem ele, a resposta fica até 5 min
|
|
14
|
+
// no navegador e uma publicação recém-saída não aparece — foi o que exigiu
|
|
15
|
+
// Ctrl+Shift+R nos testes. O bundle continua vindo de cache immutable, então
|
|
16
|
+
// o custo é uma requisição pequena por carregamento, não 30 kB.
|
|
17
|
+
fetch('https://data.jsdelivr.com/v1/packages/npm/@bravophone/webphone/resolved',
|
|
18
|
+
{ cache: 'no-store' })
|
|
14
19
|
.then((r) => r.json())
|
|
15
20
|
.then(({ version }) => {
|
|
16
21
|
const s = document.createElement('script')
|
|
17
22
|
s.src = `https://cdn.jsdelivr.net/npm/@bravophone/webphone@${version}/dist/bravophone.umd.js`
|
|
18
|
-
s.onload = () => Bravophone.init({
|
|
23
|
+
s.onload = () => Bravophone.init({ session: SESSAO_DO_LOGIN })
|
|
19
24
|
s.onerror = () => console.error('Bravophone: falha ao carregar do CDN')
|
|
20
25
|
document.head.appendChild(s)
|
|
21
26
|
})
|
|
@@ -100,7 +105,7 @@ Testei mentalmente as duas rotas; o iframe ganha em quatro frentes de uma vez:
|
|
|
100
105
|
1. **CSS.** O bundle traz Tailwind + `dark-theme.css` globais. Injetado na página do
|
|
101
106
|
cliente, ele quebraria o site do cliente — e o CSS do cliente quebraria o webphone.
|
|
102
107
|
2. **CORS, e este é o argumento decisivo.** Dentro do iframe, todo request para
|
|
103
|
-
`
|
|
108
|
+
`pabx.teambravotech.com` e `devices.wavoip.com` sai com
|
|
104
109
|
`Origin: https://webphone.bravophone.com` — **uma origem só, fixa**. Sem iframe,
|
|
105
110
|
cada cliente novo exigiria liberar mais uma origem no CORS de três backends. Com
|
|
106
111
|
iframe, a lista de origens do backend nunca cresce.
|
|
@@ -331,7 +336,7 @@ sync, ou versione por query string); `index.html` sempre com `no-cache`.
|
|
|
331
336
|
|
|
332
337
|
### 2. Backends — CORS
|
|
333
338
|
|
|
334
|
-
Liberar **uma única origem** em `api.bravophone.com`, `
|
|
339
|
+
Liberar **uma única origem** em `api.bravophone.com`, `pabx.teambravotech.com` e
|
|
335
340
|
`devices.wavoip.com`:
|
|
336
341
|
|
|
337
342
|
```
|
|
@@ -390,9 +395,52 @@ document.head.appendChild(s)
|
|
|
390
395
|
Cole isso **inline** na página, não como arquivo externo — um arquivo externo
|
|
391
396
|
teria o mesmo problema de cache que estamos evitando.
|
|
392
397
|
|
|
398
|
+
### Se uma publicação não aparecer
|
|
399
|
+
|
|
400
|
+
Três caches diferentes, do mais provável ao menos:
|
|
401
|
+
|
|
402
|
+
| O que está velho | Como saber | Solução |
|
|
403
|
+
|---|---|---|
|
|
404
|
+
| **A consulta de versão** | `Bravophone.version` mostra a anterior | Já resolvido: o snippet usa `cache: 'no-store'` |
|
|
405
|
+
| **A página do integrador** | o próprio snippet mudou e não teve efeito | Não sirva o HTML com `max-age` longo |
|
|
406
|
+
| **O bundle** | — | Não acontece: a URL é versionada e `immutable` |
|
|
407
|
+
|
|
408
|
+
Durante o desenvolvimento, `Ctrl+Shift+R` limpa os três de uma vez — foi o que
|
|
409
|
+
funcionou nos primeiros testes. Em produção não há como pedir isso ao usuário,
|
|
410
|
+
e é por isso que o `no-store` está na consulta: sem ele, quem carregou a página
|
|
411
|
+
nos últimos cinco minutos continua na versão anterior.
|
|
412
|
+
|
|
413
|
+
Se ainda assim algo ficar para trás, `npm run purge` limpa as bordas do CDN —
|
|
414
|
+
mas lembre que ele não alcança o navegador de ninguém.
|
|
415
|
+
|
|
393
416
|
Os assets do webphone acompanham automaticamente: o `public_path` é gravado com
|
|
394
417
|
a versão do pacote, então carregar o SDK 0.2.1 carrega o host 0.2.1.
|
|
395
418
|
|
|
419
|
+
## A sessão que o webphone espera
|
|
420
|
+
|
|
421
|
+
`init()` recebe a resposta do `/api/voxfree/login` inteira:
|
|
422
|
+
|
|
423
|
+
```js
|
|
424
|
+
Bravophone.init({
|
|
425
|
+
session: {
|
|
426
|
+
vxToken: '…', // obrigatório
|
|
427
|
+
expiresIn: 3600, // segundos
|
|
428
|
+
sip: '…', // sem isto o webphone não registra
|
|
429
|
+
ramal: '…', // idem
|
|
430
|
+
tenant: '…',
|
|
431
|
+
clienteId: '…',
|
|
432
|
+
ramaisUrl: '…',
|
|
433
|
+
},
|
|
434
|
+
})
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
O SDK grava essas chaves onde o bundle as procura, **antes** dele avaliar — a
|
|
438
|
+
sessão já sobe autenticada, sem piscar a tela de login.
|
|
439
|
+
|
|
440
|
+
`token: '…'` continua aceito como atalho para `{ vxToken }`, mas **sozinho não
|
|
441
|
+
basta**: o webphone carrega, não registra, e o RouteSelector avisa "faça login
|
|
442
|
+
pelo webphone" — justamente o que a auto-autenticação existe para evitar.
|
|
443
|
+
|
|
396
444
|
## Documentação
|
|
397
445
|
|
|
398
446
|
| Documento | Para quem |
|
|
@@ -458,7 +506,7 @@ Bravophone.init({ token, mode: 'srcdoc' }) // na origem do próprio site
|
|
|
458
506
|
| Você precisa manter | o domínio do host | nada |
|
|
459
507
|
|
|
460
508
|
**Antes de oferecer o `srcdoc` a um cliente, a origem dele precisa estar na
|
|
461
|
-
allowlist de CORS de `api.bravophone.com`, `
|
|
509
|
+
allowlist de CORS de `api.bravophone.com`, `pabx.teambravotech.com` e
|
|
462
510
|
`devices.wavoip.com`.** Sem isso o webphone carrega, aparece na tela e não
|
|
463
511
|
registra — o navegador descarta as respostas. Isso é trabalho no **nosso**
|
|
464
512
|
backend: o integrador não tem como liberar CORS de um servidor que não é dele.
|