@whanext/core 0.17.1 → 0.18.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/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.18.0
4
+
5
+ ### Provider Zapo
6
+
7
+ - O provider padrão foi migrado do Baileys para `zapo-js`, mantendo o contrato público `WhatsAppProvider`.
8
+ - Autenticação e chaves Signal passam a usar store SQLite persistente em `<auth>/state.sqlite`.
9
+ - Mensagens, replies, menções, mídia, view-once, reações, edição, revogação, pin, presença e grupos foram portados para as APIs do Zapo.
10
+ - Eventos `message_protocol`, `group`, `connection` e `voip_call_*` são normalizados para os eventos públicos já existentes do WhaNext.
11
+ - Chamadas continuam suportando rejeição pelo plugin oficial `@zapo-js/voip`.
12
+ - Mensagens do backlog marcadas pelo Zapo como `offline` são ignoradas por padrão; `processOfflineMessages: true` restaura o processamento deliberado do backlog.
13
+ - O cache recente passa a observar também `message_send`, permitindo reenvio de mensagens emitidas pela própria sessão.
14
+ - O carregamento do plugin `@zapo-js/voip` passa a ser dinâmico, evitando que uma instalação sem binário `wrtc` funcional derrube recursos que não usam chamadas.
15
+ - A tipagem de eventos VoIP deixa de perder a extensão de plugin do `WaClient`; `rejectCall` e `voip_call_*` passam por uma ponte tipada local.
16
+ - `recording` é preservado no chatstate conforme a API documentada do Zapo, com adaptação local para a declaração de tipos publicada.
17
+ - O mock do provider Zapo usa `vi.hoisted`, eliminando o acesso a `MockClient` antes da inicialização.
18
+
19
+ ### Migração
20
+
21
+ - Adicionado `MIGRATING_TO_ZAPO.md` com orientação para novo pareamento ou conversão das sessões multifile antigas.
22
+ - A versão do pacote passa para `0.18.0`.
23
+
3
24
  ## 0.17.1
4
25
 
5
26
  ### Fixed
package/CONTRIBUTING.md CHANGED
@@ -5,16 +5,16 @@ Obrigado pelo interesse em melhorar o projeto.
5
5
  ## Ambiente
6
6
 
7
7
  - Node.js 22.5 ou superior
8
- - npm compatível com o `package-lock.json`
8
+ - npm ou pnpm compatível com o projeto
9
9
 
10
10
  ```bash
11
- npm ci
11
+ npm install
12
12
  npm run check
13
13
  ```
14
14
 
15
15
  ## Princípios da API
16
16
 
17
- - Baileys permanece restrito ao provider interno.
17
+ - Zapo permanece restrito ao provider interno; a API pública continua independente da implementação.
18
18
  - A API pública usa modelos e erros do WhaNext.
19
19
  - Operações dependentes de estado retornam resultados tipados e idempotentes.
20
20
  - JID, LID e PN são resolvidos pela biblioteca.
@@ -0,0 +1,73 @@
1
+ # Migrando do Baileys para Zapo
2
+
3
+ A v0.18 troca o provider padrão do WhaNext para Zapo. A API pública de comandos, services, mensagens, grupos e multi-account permanece a mesma, mas o formato da sessão muda.
4
+
5
+ ## Sessões
6
+
7
+ O WhaNext v0.17 e anteriores usava o auth multifile do Baileys, normalmente com `creds.json` e vários arquivos de chaves. O Zapo usa um store persistente e, no provider padrão do WhaNext, esse store fica em:
8
+
9
+ ```text
10
+ <auth>/state.sqlite
11
+ ```
12
+
13
+ Não apague a pasta antiga antes de confirmar que a nova sessão conecta normalmente.
14
+
15
+ ## Opção 1: parear novamente
16
+
17
+ É o caminho mais simples para uma conta isolada:
18
+
19
+ 1. Faça backup da pasta de auth atual.
20
+ 2. Use um diretório limpo para a primeira execução da v0.18.
21
+ 3. Inicie o bot e gere um novo pairing code.
22
+ 4. Depois de validar mensagens, grupos, mídia e reconexão, arquive a sessão antiga.
23
+
24
+ ## Opção 2: converter a sessão existente
25
+
26
+ O projeto Zapo fornece o pacote `wa-store-migrate`, que converte o snapshot de autenticação do Baileys para o formato de store do Zapo sem exigir um novo pareamento.
27
+
28
+ Instale temporariamente no ambiente de migração:
29
+
30
+ ```bash
31
+ npm install wa-store-migrate
32
+ ```
33
+
34
+ A conversão oficial lê `{ creds, keys }` do auth multifile, chama `migrate({ from: 'baileys', to: 'zapo', data })` e grava o resultado em um store Zapo novo. Consulte o guia oficial **Migrating from Baileys** do Zapo para usar o exemplo atualizado da versão que estiver instalada.
35
+
36
+ No WhaNext, o destino deve ser o `state.sqlite` dentro do diretório `auth` da conta. O `sessionId` precisa ser estável:
37
+
38
+ - `default` em `create()` quando `accountId` não é informado;
39
+ - o `id` da conta em `createMulti()`.
40
+
41
+ Converta cada conta separadamente quando usar multi-account.
42
+
43
+ ## Mensagens recebidas após reconexão
44
+
45
+ O Zapo possui um fluxo explícito de mensagens offline após a conexão. O WhaNext v0.18 protege o router por padrão: eventos que o Zapo marca como `offline` não são encaminhados como mensagens novas. O timestamp da conexão atual também é usado como fallback defensivo quando essa marca não estiver disponível.
46
+
47
+ Se sua aplicação precisa processar deliberadamente o backlog recebido depois de ficar offline, habilite:
48
+
49
+ ```ts
50
+ const app = await create({
51
+ processOfflineMessages: true,
52
+ });
53
+ ```
54
+
55
+ ## Mídia
56
+
57
+ O provider usa `@zapo-js/media-utils`. Para processamento completo de imagem, vídeo, áudio e voice note, mantenha `ffmpeg` e `ffprobe` disponíveis no `PATH` do processo.
58
+
59
+ ## Chamadas
60
+
61
+ O suporte a `app.on('call')` e `rejectCall()` usa o plugin oficial `@zapo-js/voip`. As dependências de runtime do plugin já fazem parte do pacote do WhaNext v0.18.
62
+
63
+ ## Checklist de atualização
64
+
65
+ - faça backup do auth antigo;
66
+ - instale as dependências da v0.18;
67
+ - converta a sessão ou pareie novamente;
68
+ - valide uma mensagem privada e uma mensagem de grupo;
69
+ - valide LID/PN, reply e menções;
70
+ - valide download de imagem/vídeo e view-once;
71
+ - valide edit/delete se o bot usa anti-edit/anti-delete;
72
+ - valide chamada recebida se o bot usa anti-call;
73
+ - derrube e reconecte o processo e confirme que comandos antigos não são executados.
package/README.md CHANGED
@@ -31,7 +31,7 @@ await app.login({
31
31
 
32
32
  ## Por que WhaNext?
33
33
 
34
- - API pública sem objetos ou tipos crus do Baileys.
34
+ - API pública independente do provider, sem objetos ou tipos crus do Zapo.
35
35
  - Login por pairing code, sessão persistente e reconexão automática.
36
36
  - Uma ou várias contas independentes no mesmo processo com `createMulti()`.
37
37
  - Prefixo global e comandos declarativos com argumentos tipados.
@@ -55,6 +55,8 @@ await app.login({
55
55
  npm install @whanext/core
56
56
  ```
57
57
 
58
+ Atualizando da v0.17 ou anterior? Veja [`MIGRATING_TO_ZAPO.md`](./MIGRATING_TO_ZAPO.md) antes de reutilizar a pasta de sessão.
59
+
58
60
  ## Início rápido
59
61
 
60
62
  ```ts
@@ -306,7 +308,7 @@ if (app.isReady) {
306
308
 
307
309
  Toda mensagem possui `message.sender: User`. Menções ficam em `message.mentionedUsers`, e o remetente de um reply em `message.quoted?.sender`.
308
310
 
309
- O provider Baileys também classifica o payload em `message.contentKind`, sem exigir acesso aos tipos internos do Baileys ou download da mídia:
311
+ O provider oficial também classifica o payload em `message.contentKind`, sem exigir acesso aos tipos internos do Zapo ou download da mídia:
310
312
 
311
313
  ```ts
312
314
  app.on('message', async (message) => {
@@ -392,7 +394,7 @@ await app.message.buttons(chatId, {
392
394
  });
393
395
  ```
394
396
 
395
- Também funciona diretamente em replies de comandos, sem importar tipos do Baileys:
397
+ Também funciona diretamente em replies de comandos, sem importar tipos do provider:
396
398
 
397
399
  ```ts
398
400
  await ctx.reply({
@@ -441,7 +443,7 @@ await writeFile(`./downloads/${downloaded.fileName ?? message.id}`, downloaded.d
441
443
 
442
444
  `download()` aceita a `Message` recebida, uma `QuotedMessage` ou uma `MessageKey` e devolve o buffer junto dos metadados normalizados. A mídia deve ser baixada enquanto a mensagem ainda está no cache da instância; o provider tenta renovar a URL de mídia automaticamente quando necessário.
443
445
 
444
- Para visualização única citada, o provider oficial preserva os metadados do envelope sem expor tipos do Baileys:
446
+ Para visualização única citada, o provider oficial preserva os metadados do envelope sem expor tipos do Zapo:
445
447
 
446
448
  ```ts
447
449
  if (message.quoted?.isViewOnce && message.quoted.hasMedia) {
@@ -453,7 +455,7 @@ if (message.quoted?.isViewOnce && message.quoted.hasMedia) {
453
455
  }
454
456
  ```
455
457
 
456
- Isso também funciona quando a mídia de visualização única aparece dentro de envelopes `viewOnceMessageV2` ou `viewOnceMessageV2Extension`.
458
+ Isso também funciona quando a mídia de visualização única aparece dentro de envelopes `viewOnceMessage` ou `viewOnceMessageV2`.
457
459
 
458
460
  Stickers aceitam `Uint8Array`, URL ou caminho local e devem estar em WebP, inclusive para animações. Texto, imagem e vídeo aceitam `User` diretamente em `mentions`.
459
461
 
@@ -864,7 +866,7 @@ const app = await create({
864
866
 
865
867
  O cache padrão vive na instância do app, usa LRU limitado e elimina entradas expiradas durante as leituras. Consultas simultâneas dos mesmos metadados são agrupadas em uma única chamada ao WhatsApp. Eventos e mutações de grupo invalidam automaticamente entradas relacionadas.
866
868
 
867
- Os mesmos metadados também alimentam internamente o `cachedGroupMetadata` do Baileys. Em grupos aquecidos, isso remove a consulta de metadados do caminho de envio; mensagens continuam aguardando somente criptografia, upload quando houver mídia e confirmação da rede.
869
+ O cache público de metadados continua independente do provider. Eventos e mutações de grupo invalidam as entradas relacionadas, evitando consultas repetidas do bot enquanto os dados ainda estão dentro do TTL.
868
870
 
869
871
  Para observar um `MemoryCache` criado diretamente:
870
872
 
@@ -879,7 +881,7 @@ cache.prune();
879
881
 
880
882
  `stats()` informa `size`, `maxEntries`, `hits`, `misses`, `sets`, `evictions` e `expirations`.
881
883
 
882
- Para uma única instância, o cache padrão é suficiente mesmo com muitos grupos, desde que `memoryMaxEntries` seja dimensionado. Em várias instâncias/processos, use um `CacheStore` distribuído para o cache público; cada conexão mantém ainda um L1 local limitado para o caminho criptográfico do Baileys. Não compartilhe uma mesma sessão ativa entre processos.
884
+ Para uma única instância, o cache padrão é suficiente mesmo com muitos grupos, desde que `memoryMaxEntries` seja dimensionado. Em várias instâncias/processos, use um `CacheStore` distribuído para o cache público. Cada conexão Zapo mantém seu próprio store de sessão; não compartilhe a mesma sessão ativa entre processos.
883
885
 
884
886
  O cache interno de mensagens mantém até 1.000 mensagens por padrão para replies, reenvios do provider e downloads de mídia. Ajuste quando necessário:
885
887
 
package/dist/index.d.ts CHANGED
@@ -70,7 +70,7 @@ type MediaKind = 'image' | 'video' | 'audio' | 'document' | 'sticker';
70
70
  *
71
71
  * `media.kind` remains the source of truth for downloadable media.
72
72
  * `contentKind` additionally exposes non-media payloads such as locations,
73
- * contacts, polls and catalog/product messages without leaking Baileys types.
73
+ * contacts, polls and catalog/product messages without leaking provider-specific protocol types.
74
74
  */
75
75
  type MessageContentKind = 'text' | 'image' | 'video' | 'audio' | 'document' | 'sticker' | 'location' | 'contact' | 'poll' | 'catalog' | 'unknown';
76
76
  interface MessageMedia {
@@ -839,6 +839,7 @@ interface CreateOptions {
839
839
  router?: Omit<RouterOptions, 'prefix'>;
840
840
  reconnect?: ReconnectOptions;
841
841
  messageCacheSize?: number;
842
+ processOfflineMessages?: boolean;
842
843
  provider?: WhatsAppProvider;
843
844
  accountId?: string;
844
845
  }