@bravophone/webphone 0.3.0 → 0.4.1

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
@@ -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
- fetch('https://data.jsdelivr.com/v1/packages/npm/@bravophone/webphone/resolved')
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({ token: TOKEN_DO_USUARIO })
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
- `api.bravophone.com`, `reports.teambravotech.com` e `devices.wavoip.com` sai com
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`, `reports.teambravotech.com` e
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,62 @@ 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
+ // A segunda metade: sem ela o app fica na tela de login, mesmo com o
435
+ // vxToken válido. O checkToken do webphone exige as duas.
436
+ extension: { username: '…', password: '…', server: '…' },
437
+ },
438
+ })
439
+ ```
440
+
441
+ **Onde a credencial SIP fica.** O `extension` viaja apenas pela ponte
442
+ (`postMessage`) e é aplicado no store em memória do webphone. Ele **não** entra
443
+ no HTML do iframe nem no `localStorage` — a senha não fica legível no DOM da sua
444
+ página. As outras sete chaves são pré-gravadas no storage, porque é de lá que o
445
+ bundle as lê.
446
+
447
+ O SDK grava essas chaves onde o bundle as procura, **antes** dele avaliar — a
448
+ sessão já sobe autenticada, sem piscar a tela de login.
449
+
450
+ `token: '…'` continua aceito como atalho para `{ vxToken }`, mas **sozinho não
451
+ basta**: o webphone carrega, não registra, e o RouteSelector avisa "faça login
452
+ pelo webphone" — justamente o que a auto-autenticação existe para evitar.
453
+
396
454
  ## Documentação
397
455
 
398
456
  | Documento | Para quem |
@@ -458,7 +516,7 @@ Bravophone.init({ token, mode: 'srcdoc' }) // na origem do próprio site
458
516
  | Você precisa manter | o domínio do host | nada |
459
517
 
460
518
  **Antes de oferecer o `srcdoc` a um cliente, a origem dele precisa estar na
461
- allowlist de CORS de `api.bravophone.com`, `reports.teambravotech.com` e
519
+ allowlist de CORS de `api.bravophone.com`, `pabx.teambravotech.com` e
462
520
  `devices.wavoip.com`.** Sem isso o webphone carrega, aparece na tela e não
463
521
  registra — o navegador descarta as respostas. Isso é trabalho no **nosso**
464
522
  backend: o integrador não tem como liberar CORS de um servidor que não é dele.