@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 CHANGED
@@ -1,21 +1,43 @@
1
1
  # @bravophone/webphone
2
2
 
3
- Webphone BRAVOPHONE embutível em qualquer página web. Uma linha de `<script>` e o
4
- softphone aparece como uma janela flutuante arrastável, com as mesmas
5
- funcionalidades da extensão de navegador.
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
- Bravophone.init({ token: 'TOKEN_DO_USUARIO' })
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, position: 'bottom-right' })
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 FIXA: │ │ │
60
- │ │ │ webphone.bravophone.com │ │ │
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` | `'hosted' \| 'srcdoc'` | `'hosted'` | Como o webphone é carregado — ver abaixo |
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
- | | `hosted` (padrão) | `srcdoc` |
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 |