@whanext/core 0.17.1 → 0.18.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/CHANGELOG.md +28 -0
- package/CONTRIBUTING.md +3 -3
- package/MIGRATING_TO_ZAPO.md +73 -0
- package/README.md +9 -7
- package/dist/index.d.ts +2 -1
- package/dist/index.js +727 -817
- package/dist/index.js.map +1 -1
- package/package.json +12 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.18.1
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Corrige a geração de código de pareamento no Zapo quando o servidor disponibiliza primeiro o fluxo QR (`auth_qr`) em vez de emitir `auth_pairing_required`.
|
|
8
|
+
- O provider agora considera tanto `auth_pairing_required` quanto `auth_qr` como sinais válidos de que `client.auth.requestPairingCode()` pode ser chamado.
|
|
9
|
+
|
|
10
|
+
## 0.18.0
|
|
11
|
+
|
|
12
|
+
### Provider Zapo
|
|
13
|
+
|
|
14
|
+
- O provider padrão foi migrado do Baileys para `zapo-js`, mantendo o contrato público `WhatsAppProvider`.
|
|
15
|
+
- Autenticação e chaves Signal passam a usar store SQLite persistente em `<auth>/state.sqlite`.
|
|
16
|
+
- 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.
|
|
17
|
+
- Eventos `message_protocol`, `group`, `connection` e `voip_call_*` são normalizados para os eventos públicos já existentes do WhaNext.
|
|
18
|
+
- Chamadas continuam suportando rejeição pelo plugin oficial `@zapo-js/voip`.
|
|
19
|
+
- Mensagens do backlog marcadas pelo Zapo como `offline` são ignoradas por padrão; `processOfflineMessages: true` restaura o processamento deliberado do backlog.
|
|
20
|
+
- O cache recente passa a observar também `message_send`, permitindo reenvio de mensagens emitidas pela própria sessão.
|
|
21
|
+
- 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.
|
|
22
|
+
- 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.
|
|
23
|
+
- `recording` é preservado no chatstate conforme a API documentada do Zapo, com adaptação local para a declaração de tipos publicada.
|
|
24
|
+
- O mock do provider Zapo usa `vi.hoisted`, eliminando o acesso a `MockClient` antes da inicialização.
|
|
25
|
+
|
|
26
|
+
### Migração
|
|
27
|
+
|
|
28
|
+
- Adicionado `MIGRATING_TO_ZAPO.md` com orientação para novo pareamento ou conversão das sessões multifile antigas.
|
|
29
|
+
- A versão do pacote passa para `0.18.0`.
|
|
30
|
+
|
|
3
31
|
## 0.17.1
|
|
4
32
|
|
|
5
33
|
### 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
|
|
8
|
+
- npm ou pnpm compatível com o projeto
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
|
-
npm
|
|
11
|
+
npm install
|
|
12
12
|
npm run check
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
## Princípios da API
|
|
16
16
|
|
|
17
|
-
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 `
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
}
|