@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 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,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` | `'hosted' \| 'srcdoc'` | `'hosted'` | Como o webphone é carregado — ver abaixo |
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
- | | `hosted` (padrão) | `srcdoc` |
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:incoming` · `call:answered` · `call:ended` · `call:failed` ·
506
- `open` · `close` · `error`. Use `'*'` para receber todos como `{ event, payload }`.
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