@stone-wpp/ofc 1.0.5 → 1.0.7

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
@@ -18,7 +18,7 @@
18
18
 
19
19
  <br>
20
20
 
21
- <a href="https://github.com/dylan-Modz/stone-wpp-ofc"><img src="https://img.shields.io/badge/VERS%C3%83O-1.0.5-00BFFF?style=for-the-badge&logo=github&logoColor=white&labelColor=111820" alt="Versão 1.0.5 do código no GitHub"></a>
21
+ <a href="https://github.com/dylan-Modz/stone-wpp-ofc"><img src="https://img.shields.io/badge/VERS%C3%83O-1.0.7-00BFFF?style=for-the-badge&logo=github&logoColor=white&labelColor=111820" alt="Versão 1.0.7 do código no GitHub"></a>
22
22
  <img src="https://img.shields.io/badge/NODE.JS-20%2B-111820?style=for-the-badge&logo=node.js&logoColor=00BFFF" alt="Node.js 20 ou superior">
23
23
  <img src="https://img.shields.io/badge/LICENSE-MIT-00BFFF?style=for-the-badge&labelColor=111820" alt="Licença MIT">
24
24
 
@@ -38,53 +38,73 @@
38
38
 
39
39
  ---
40
40
 
41
- ## 📚 DOCUMENTAÇÃO COMPLETA
41
+ ## 🚀 Stone WPP 1.0.7 — novidades e melhorias
42
42
 
43
- A documentação principal da **Stone WPP** está disponível no nosso site oficial, com navegação por categorias, pesquisa e exemplos. Em vez de repetir todos os tutoriais aqui no npm, centralizamos as explicações no site para você encontrar cada recurso no lugar certo.
43
+ A **1.0.7** apresenta um módulo totalmente novo de chamadas e aperfeiçoa recursos que a Stone WPP já oferecia.
44
44
 
45
- <div align="center">
45
+ ### 🆕 Novidades desta versão
46
46
 
47
- ### **[🌐 ABRIR DOCUMENTAÇÃO — STONE WPP](https://stone-wpp.squareweb.app/)**
47
+ **📞 VoIP — novo módulo experimental**
48
48
 
49
- **https://stone-wpp.squareweb.app/**
49
+ A Stone agora oferece a interface `stone.calls` para trabalhar com chamadas usando **a mesma conexão autenticada do WhatsApp**.
50
50
 
51
- </div>
51
+ - **Chamadas de voz:** iniciar, atender, recusar e encerrar ligações.
52
+ - **Música e áudio:** carregar arquivos de áudio e transmitir áudio em tempo real, conforme o suporte do ambiente.
53
+ - **Eventos de chamadas:** acompanhar ligações recebidas, alterações de estado e encerramentos.
54
+ - **Links e convites:** gerar links de chamada de voz ou vídeo e compartilhá-los com grupos.
55
+ - **Chamadas em grupo:** novas interfaces para iniciar, entrar e sair de chamadas, ainda em caráter experimental.
56
+ - **Controle do módulo:** consultar a disponibilidade dos recursos com `getVoipStatus()` e `getCapabilities()`.
52
57
 
53
- | O que você encontra | Conteúdo |
54
- | :--- | :--- |
55
- | 🚀 **Primeiros passos** | Instalação, configuração e uso inicial. |
56
- | 🔐 **Autenticação** | Sessão, conexão e reconexão. |
57
- | 💬 **Mensagens** | Envio, recebimento e eventos. |
58
- | 🧩 **Botões** | Exemplos e referências das mensagens interativas. |
59
- | 👥 **Grupos e comunidades** | Operações e gerenciamento. |
60
- | 📢 **Canais** | Métodos e recursos disponíveis. |
61
- | ⚙️ **Outros módulos** | API, DataLayer (armazenamento), Extensions (extensões) e funcionalidades relacionadas. |
58
+ > **VoIP é uma funcionalidade nova e experimental.** Alguns recursos, especialmente as chamadas em grupo, dependem da compatibilidade com o WhatsApp e podem não estar disponíveis em todos os ambientes.
59
+
60
+ **🔎 Novas ferramentas de diagnóstico**
61
+
62
+ - `resolveJidMapping(jid)` — consulta o mapeamento conhecido entre identificadores PN e LID.
63
+ - `inspectSignalSession(jid)` — consulta a existência de uma sessão criptográfica Signal.
62
64
 
63
- > **Importante:** a Stone WPP está em desenvolvimento. Consulte a documentação para conhecer os recursos disponíveis e suas limitações. Nem todas as funções planejadas estão implementadas.
65
+ ### 🛠️ Melhorias nas funções que já existiam
66
+
67
+ - **Downloads de mídia:** recuperação aprimorada quando a URL direta responde com HTTP 403, 404 ou 410, tentando a URL original quando possível.
68
+ - **Arquivos e descriptografia:** identificação mais clara de mídias sem chave e limites de espera para evitar processamento preso em tentativas de recuperação.
69
+ - **Identificadores PN/LID:** tratamento aprimorado dos JIDs de usuários e dispositivos nas respostas da sincronização USync.
70
+ - **Estabilidade e integração:** ajustes no tratamento dos eventos e na consistência das informações de sessão, mantendo os recursos de mensagens, grupos e canais.
64
71
 
65
72
  ---
66
73
 
67
- ## 📦 INSTALAÇÃO PELO NPM
74
+ ## 📚 Documentação
68
75
 
69
- ```bash
70
- npm install @stone-wpp/ofc
71
- ```
76
+ O site oficial concentra os guias, exemplos e referências das funções disponíveis na Stone WPP.
72
77
 
73
- **Requisitos:** Node.js **20+**. Biblioteca em JavaScript com suporte a ES Modules.
78
+ **[📖 Acessar a documentação completa](https://stone-wpp.squareweb.app/)**
74
79
 
75
- Para instalar no **Termux**, dentro da pasta da sua aplicação:
80
+ | Área | O que você encontra |
81
+ | :--- | :--- |
82
+ | Conexão e autenticação | Sessão, eventos e reconexão |
83
+ | Mensagens e mídias | Envio, recebimento, downloads e arquivos |
84
+ | Grupos e comunidades | Administração e operações de grupos |
85
+ | Canais | Recursos de canais do WhatsApp |
86
+ | Chamadas | Métodos e eventos do novo módulo VoIP |
87
+ | Outros módulos | API, armazenamento e extensões |
88
+
89
+ ---
90
+
91
+ ## 📦 Instalação
92
+
93
+ **Requisito:** Node.js 20 ou superior.
76
94
 
77
95
  ```bash
78
- pkg update -y
79
- pkg install nodejs-lts git -y
80
96
  npm install @stone-wpp/ofc
81
97
  ```
82
98
 
83
- No Android, algumas dependências podem exigir suporte nativo. Prefira instalar na pasta privada do Termux.
99
+ Para utilizar o código disponível diretamente no GitHub:
100
+
101
+ ```bash
102
+ npm install github:dylan-Modz/stone-wpp-ofc#main
103
+ ```
84
104
 
85
105
  ---
86
106
 
87
- ## ⚡ EXEMPLO RÁPIDO
107
+ ## ⚡ Exemplo rápido
88
108
 
89
109
  ```js
90
110
  import createStone, { useMultiFileAuthState } from '@stone-wpp/ofc'
@@ -99,9 +119,7 @@ stone.ev.on('connection.update', ({ connection }) => {
99
119
  })
100
120
  ```
101
121
 
102
- Para entender cada método, opções de conexão, eventos e exemplos, acesse a **[documentação oficial](https://stone-wpp.squareweb.app/)**.
103
-
104
- > A Stone WPP é uma **biblioteca**, não um bot pronto. Não possui `npm start` próprio. Proteja suas sessões e credenciais; não as publique em repositórios.
122
+ Para explorar os métodos e exemplos de integração, consulte a **[documentação oficial](https://stone-wpp.squareweb.app/)**.
105
123
 
106
124
  ---
107
125
 
@@ -182,7 +182,15 @@ export class LIDMappingStore {
182
182
  const lidUser = jidDecode(pair.lid)?.user;
183
183
  if (!lidUser)
184
184
  continue;
185
- for (const device of usyncFetch[pair.pn]) {
185
+ // USync may reply with a device-specific PN instead of the normalized request.
186
+ // Resolve both forms to avoid iterating over an undefined device list.
187
+ const normalizedPairPn = jidNormalizedUser(pair.pn);
188
+ const devices = usyncFetch[normalizedPairPn] ?? usyncFetch[pair.pn];
189
+ if (!devices?.length) {
190
+ this.logger.warn({ pn: pair.pn }, 'USync returned an unmatched PN mapping');
191
+ continue;
192
+ }
193
+ for (const device of devices) {
186
194
  const deviceSpecificLid = `${lidUser}${!!device ? `:${device}` : ``}@${device === 99 ? 'hosted.lid' : 'lid'}`;
187
195
  this.logger.trace(`getLIDForPN: USYNC success for ${pair.pn} → ${deviceSpecificLid} (user mapping with device ${device})`);
188
196
  const deviceSpecificPn = `${pnUser}${!!device ? `:${device}` : ``}@${device === 99 ? 'hosted' : 's.whatsapp.net'}`;
@@ -0,0 +1,146 @@
1
+ export type GroupProtectionMode = 'alert' | 'delete' | 'remove' | 'protect'
2
+
3
+ /** Persistência opcional: utilize createStoneStore({ type: 'json' | 'sqlite', path }). */
4
+ export interface GroupProtectionStore {
5
+ get<T = unknown>(key: string): Promise<T | undefined>
6
+ set(key: string, value: unknown): Promise<boolean>
7
+ }
8
+
9
+ export interface GroupProtectionHistoryEntry {
10
+ type: 'alert' | 'action'
11
+ jid: string
12
+ participant: string | null
13
+ reason: string | null
14
+ severity: string | null
15
+ action: string | null
16
+ mode: string | null
17
+ deleted: boolean
18
+ removed: boolean
19
+ locked: boolean
20
+ receivedAt: number
21
+ }
22
+
23
+ export interface GroupProtectionMonitor {
24
+ ev: {
25
+ on(name: string, fn: (...args: any[]) => void): unknown
26
+ off(name: string, fn: (...args: any[]) => void): unknown
27
+ }
28
+ }
29
+
30
+ /** Cria/recria sessão auxiliar do próprio usuário. O aplicativo ainda persiste a autenticação. */
31
+ export interface GroupProtectionMonitorPairing {
32
+ create(args: { jid: string; attempt: number }): Promise<GroupProtectionMonitor>
33
+ /** Número com DDI para solicitar o código somente se a sessão não estiver registrada. */
34
+ phoneNumber?: string
35
+ /** Callback privado: mostre o código ao titular para confirmação no WhatsApp. */
36
+ onPairingCode?: (info: { jid: string; index: number; code: string }) => void | Promise<void>
37
+ }
38
+
39
+ export interface GroupProtectionOptions {
40
+ /** Desativada por padrão; chamar com {enabled: true} para ativar. */
41
+ enabled?: boolean
42
+ /** alert: apenas eventos. delete: apaga; remove: apaga + remove membro; protect: fecha temporariamente + apaga + remove. */
43
+ mode?: GroupProtectionMode
44
+ /** Mínimo de mensagens de pagamento do mesmo remetente por janela (padrão: 3). */
45
+ paymentBurst?: number
46
+ /** Mínimo de mensagens totais por janela (padrão: 14). */
47
+ messageBurst?: number
48
+ /** Janela de detecção em milissegundos (padrão: 8000). */
49
+ windowMs?: number
50
+ /** Tempo de fechamento temporário no modo protect (padrão: 12000). */
51
+ lockMs?: number
52
+ observeInvisible?: boolean
53
+ observePayments?: boolean
54
+ observeQuotes?: boolean
55
+ observeFlood?: boolean
56
+ /** Se true, publica um aviso do bot e edita o aviso ao concluir as ações. */
57
+ editNotice?: boolean
58
+ /** Até três sockets adicionais já autenticados e presentes nos grupos. */
59
+ monitors?: GroupProtectionMonitor[]
60
+ /** Factories de até 3 sessões extras já autenticadas; reconecta em queda temporária.
61
+ * O próprio aplicativo deve criar os sockets e persistir as credenciais.
62
+ * Logout não causa novo pareamento automático. */
63
+ monitorFactories?: Array<
64
+ ((args: { jid: string; attempt: number }) => Promise<GroupProtectionMonitor>)
65
+ | GroupProtectionMonitorPairing
66
+ >
67
+ monitorReconnectMs?: number
68
+ /** Recibos de retry são tratados apenas como telemetria, nunca prova de ataque. */
69
+ observeReceipts?: boolean
70
+ receiptBurst?: number
71
+ /** JIDs imunes a remoção (PN e LID são comparados separadamente). */
72
+ immunity?: string[]
73
+ /** Limite de registros mantidos por grupo, entre 20 e 500. */
74
+ historyLimit?: number
75
+ /** StoneStore opcional para persistir regras e histórico. */
76
+ store?: GroupProtectionStore
77
+ /** Restaura regras previamente salvas no store; requer store. */
78
+ restore?: boolean
79
+ /** Consulta o histórico sem modificar as configurações; requer store ou ativação prévia. */
80
+ getHistory?: boolean
81
+ /** Limita linhas retornadas na consulta de histórico. */
82
+ limit?: number
83
+ }
84
+
85
+ export interface GroupProtectionStatus {
86
+ jid: string
87
+ enabled: boolean
88
+ mode?: GroupProtectionMode
89
+ paymentBurst?: number
90
+ messageBurst?: number
91
+ windowMs?: number
92
+ lockMs?: number
93
+ observeInvisible?: boolean
94
+ observePayments?: boolean
95
+ observeQuotes?: boolean
96
+ observeFlood?: boolean
97
+ observeReceipts?: boolean
98
+ receiptBurst?: number
99
+ immunity?: string[]
100
+ historyLimit?: number
101
+ history?: GroupProtectionHistoryEntry[]
102
+ restored?: boolean
103
+ monitorCount: number
104
+ alerts: number
105
+ actions: number
106
+ }
107
+
108
+ export interface GroupProtectionAlert {
109
+ jid: string
110
+ participant: string
111
+ messageId: string
112
+ reason: 'payment' | 'flood' | 'invisible-suspected' | 'quoted-payment' | 'receipt-suspected'
113
+ severity: 'low' | 'medium' | 'high'
114
+ verified: boolean
115
+ source: string
116
+ evidence: Record<string, unknown>
117
+ mode: GroupProtectionMode
118
+ receivedAt: number
119
+ }
120
+
121
+ export interface GroupProtectionAction {
122
+ jid: string
123
+ participant?: string
124
+ messageId?: string
125
+ action?: 'reopen'
126
+ attemptedMode?: GroupProtectionMode
127
+ deleted?: boolean
128
+ removed?: boolean
129
+ locked?: boolean
130
+ ok?: boolean
131
+ error?: string
132
+ deleteError?: string
133
+ removeError?: string
134
+ lockError?: string
135
+ noticeEdited?: boolean
136
+ noticeError?: string
137
+ noticeEditError?: string
138
+ }
139
+
140
+ export interface GroupProtectionMethods {
141
+ /** Configura, consulta, restaura, desativa ou consulta histórico por grupo.
142
+ * Persistência exige store explícito; login de monitores exige autenticação prévia. */
143
+ groupProtection(jid: string, options?: GroupProtectionOptions): Promise<GroupProtectionStatus>
144
+ }
145
+
146
+ export declare function createGroupProtectionMethods(socket: unknown): GroupProtectionMethods