@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 +48 -30
- package/lib/Signal/lid-mapping.js +9 -1
- package/lib/Socket/group-protection.d.ts +146 -0
- package/lib/Socket/group-protection.js +571 -0
- package/lib/Socket/index.d.ts +1 -1
- package/lib/Socket/index.js +3 -1
- package/lib/Socket/messages-recv.js +47 -28
- package/lib/Socket/messages-send.js +10 -5
- package/lib/Socket/socket.js +7 -1
- package/lib/Socket/stone-call-audio.js +118 -0
- package/lib/Socket/stone-call-keys.js +96 -0
- package/lib/Socket/stone-call-signaling.js +127 -0
- package/lib/Socket/stone-calls.d.ts +76 -0
- package/lib/Socket/stone-calls.js +311 -0
- package/lib/Socket/stone-features.d.ts +13 -0
- package/lib/Socket/stone-features.js +85 -0
- package/lib/Socket/stone-pairing-state.js +7 -0
- package/lib/Socket/stone-voip-bridge.js +263 -0
- package/lib/Socket/stone-voip-codec.js +33 -0
- package/lib/Socket/stone-voip-group.js +112 -0
- package/lib/Socket/stone-voip-identity.js +26 -0
- package/lib/Socket/stone-voip-offer-audit.js +49 -0
- package/lib/Socket/stone-voip-transport.js +44 -0
- package/lib/Types/Events.d.ts +55 -0
- package/lib/Utils/messages-media.js +15 -1
- package/lib/Utils/validate-connection.js +2 -0
- package/package.json +20 -4
- package/lib/Socket/chats.js.bak +0 -1198
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.
|
|
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
|
-
##
|
|
41
|
+
## 🚀 Stone WPP 1.0.7 — novidades e melhorias
|
|
42
42
|
|
|
43
|
-
A
|
|
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
|
-
|
|
45
|
+
### 🆕 Novidades desta versão
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
**📞 VoIP — novo módulo experimental**
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
A Stone agora oferece a interface `stone.calls` para trabalhar com chamadas usando **a mesma conexão autenticada do WhatsApp**.
|
|
50
50
|
|
|
51
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
74
|
+
## 📚 Documentação
|
|
68
75
|
|
|
69
|
-
|
|
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
|
-
**
|
|
78
|
+
**[📖 Acessar a documentação completa](https://stone-wpp.squareweb.app/)**
|
|
74
79
|
|
|
75
|
-
|
|
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
|
-
|
|
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
|
-
## ⚡
|
|
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
|
|
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
|
-
|
|
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
|