Skip to content

Commit 0741760

Browse files
committed
feat: add 'raw' event support for debugging raw events from LightSpeed and whatsmeow
1 parent da43bbb commit 0741760

File tree

5 files changed

+257
-67
lines changed

5 files changed

+257
-67
lines changed

DOCS.md

Lines changed: 65 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
* [`disconnected`](#event-disconnected) 🔵🟢
7979
* [`error`](#event-error) 🔵🟢
8080
* [`deviceDataChanged`](#event-deviceDataChanged) 🟢
81+
* [`raw`](#event-raw) 🔵🟢
8182
* [Types](#types)
8283

8384
---
@@ -1370,6 +1371,7 @@ if (attachment.stickerId === THUMBS_UP_STICKER_IDS.LARGE) {
13701371
| `e2eeReceipt` || 🟢 | Message read (E2EE) |
13711372
| `e2eeConnected` || 🟢 | E2EE connection successful |
13721373
| `deviceDataChanged` || 🟢 | Device data changed |
1374+
| `raw` | 🔵 | 🟢 | Raw event from LightSpeed/whatsmeow |
13731375
| `fullyReady` | 🔵 | 🟢 | Client fully ready |
13741376
| `disconnected` | 🔵 | 🟢 | Disconnected |
13751377
| `error` | 🔵 | 🟢 | Error occurred |
@@ -1720,6 +1722,39 @@ This event is only emitted when you initialize the client with the `deviceData`
17201722

17211723
---
17221724

1725+
<a name="event-raw"></a>
1726+
## Event: 'raw'
1727+
1728+
> 🔵🟢 **Both Socket and E2EE** - All raw events from LightSpeed and whatsmeow
1729+
1730+
Emitted for all incoming events from the LightSpeed (regular messages) and whatsmeow (E2EE) channels. This is useful for debugging or accessing raw event data that may not be processed by standard event handlers.
1731+
1732+
```typescript
1733+
client.on('raw', (data) => {
1734+
console.log(`Raw event from ${data.from}: ${data.type}`)
1735+
console.log(data.data)
1736+
})
1737+
```
1738+
1739+
__Data object__
1740+
1741+
* `from`: `'lightspeed'` | `'whatsmeow'` - Source channel of the event
1742+
* `type`: string - Name of the event type (e.g., `"Event_Ready"`, `"FBMessage"`)
1743+
* `data`: unknown - Raw event data (structure depends on the source)
1744+
1745+
__Event sources__
1746+
1747+
| Source | Description |
1748+
|--------|-------------|
1749+
| `lightspeed` | Events from LightSpeed protocol (regular Messenger) |
1750+
| `whatsmeow` | Events from whatsmeow library (E2EE via WhatsApp protocol) |
1751+
1752+
__Note__
1753+
1754+
This event is emitted before the standard event handlers process the event. The raw data structure may vary depending on the source and event type. Use this for debugging or handling events not explicitly supported by the library.
1755+
1756+
---
1757+
17231758
# Types
17241759

17251760
## Cookies
@@ -1734,22 +1769,41 @@ interface Cookies {
17341769
}
17351770
```
17361771

1737-
## Message
1772+
## BaseMessage
1773+
1774+
Base interface shared by regular and E2EE messages.
17381775

17391776
```typescript
1740-
interface Message {
1741-
id: string
1742-
threadId: number
1743-
senderId: number
1744-
text: string
1745-
timestampMs: number
1746-
isE2EE?: boolean
1747-
chatJid?: string
1748-
senderJid?: string
1777+
interface BaseMessage {
1778+
id: string // Message ID
1779+
threadId: number // Thread ID (Facebook numeric ID)
1780+
senderId: number // Sender's Facebook ID
1781+
text: string // Message text content
1782+
timestampMs: number // Timestamp in milliseconds
17491783
attachments?: Attachment[]
17501784
replyTo?: ReplyTo
17511785
mentions?: Mention[]
1752-
isAdminMsg?: boolean
1786+
}
1787+
```
1788+
1789+
## Message
1790+
1791+
Regular message (non-E2EE). Extends [BaseMessage](#basemessage). Received via the `message` event.
1792+
1793+
```typescript
1794+
interface Message extends BaseMessage {
1795+
isAdminMsg?: boolean // Whether this is an admin/system message
1796+
}
1797+
```
1798+
1799+
## E2EEMessage
1800+
1801+
End-to-end encrypted message. Extends [BaseMessage](#basemessage). Received via the `e2eeMessage` event.
1802+
1803+
```typescript
1804+
interface E2EEMessage extends BaseMessage {
1805+
chatJid: string // Chat JID (required for E2EE operations)
1806+
senderJid: string // Sender JID (required for E2EE operations)
17531807
}
17541808
```
17551809

DOCS_VI.md

Lines changed: 65 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
* [`disconnected`](#event-disconnected) 🔵🟢
7979
* [`error`](#event-error) 🔵🟢
8080
* [`deviceDataChanged`](#event-deviceDataChanged) 🟢
81+
* [`raw`](#event-raw) 🔵🟢
8182
* [Types](#types)
8283

8384
---
@@ -1370,6 +1371,7 @@ if (attachment.stickerId === THUMBS_UP_STICKER_IDS.LARGE) {
13701371
| `e2eeReceipt` || 🟢 | Tin nhắn đã đọc (E2EE) |
13711372
| `e2eeConnected` || 🟢 | Kết nối E2EE thành công |
13721373
| `deviceDataChanged` || 🟢 | Device data thay đổi |
1374+
| `raw` | 🔵 | 🟢 | Event thô từ LightSpeed/whatsmeow |
13731375
| `fullyReady` | 🔵 | 🟢 | Client hoàn toàn sẵn sàng |
13741376
| `disconnected` | 🔵 | 🟢 | Mất kết nối |
13751377
| `error` | 🔵 | 🟢 | Có lỗi xảy ra |
@@ -1720,6 +1722,39 @@ Event này chỉ được phát ra khi bạn khởi tạo client với option `d
17201722

17211723
---
17221724

1725+
<a name="event-raw"></a>
1726+
## Event: 'raw'
1727+
1728+
> 🔵🟢 **Cả Socket và E2EE** - Tất cả event thô từ LightSpeed và whatsmeow
1729+
1730+
Phát ra cho tất cả các event đến từ kênh LightSpeed (tin nhắn thường) và whatsmeow (E2EE). Hữu ích cho việc debug hoặc truy cập dữ liệu event thô không được xử lý bởi các event handler tiêu chuẩn.
1731+
1732+
```typescript
1733+
client.on('raw', (data) => {
1734+
console.log(`Raw event từ ${data.from}: ${data.type}`)
1735+
console.log(data.data)
1736+
})
1737+
```
1738+
1739+
__Data object__
1740+
1741+
* `from`: `'lightspeed'` | `'whatsmeow'` - Kênh nguồn của event
1742+
* `type`: string - Tên loại event (ví dụ: `"Event_Ready"`, `"FBMessage"`)
1743+
* `data`: unknown - Dữ liệu event thô (cấu trúc phụ thuộc vào nguồn)
1744+
1745+
__Nguồn event__
1746+
1747+
| Nguồn | Mô tả |
1748+
|--------|-------------|
1749+
| `lightspeed` | Event từ giao thức LightSpeed (Messenger thường) |
1750+
| `whatsmeow` | Event từ thư viện whatsmeow (E2EE qua giao thức WhatsApp) |
1751+
1752+
__Lưu ý__
1753+
1754+
Event này được phát ra trước khi các event handler tiêu chuẩn xử lý event. Cấu trúc dữ liệu thô có thể thay đổi tùy thuộc vào nguồn và loại event. Sử dụng để debug hoặc xử lý các event không được thư viện hỗ trợ rõ ràng.
1755+
1756+
---
1757+
17231758
# Types
17241759

17251760
## Cookies
@@ -1734,22 +1769,41 @@ interface Cookies {
17341769
}
17351770
```
17361771

1737-
## Message
1772+
## BaseMessage
1773+
1774+
Interface cơ sở dùng chung cho tin nhắn thường và E2EE.
17381775

17391776
```typescript
1740-
interface Message {
1741-
id: string
1742-
threadId: number
1743-
senderId: number
1744-
text: string
1745-
timestampMs: number
1746-
isE2EE?: boolean
1747-
chatJid?: string
1748-
senderJid?: string
1777+
interface BaseMessage {
1778+
id: string // ID tin nhắn
1779+
threadId: number // Thread ID (Facebook numeric ID)
1780+
senderId: number // Facebook ID của người gửi
1781+
text: string // Nội dung văn bản
1782+
timestampMs: number // Timestamp tính bằng milliseconds
17491783
attachments?: Attachment[]
17501784
replyTo?: ReplyTo
17511785
mentions?: Mention[]
1752-
isAdminMsg?: boolean
1786+
}
1787+
```
1788+
1789+
## Message
1790+
1791+
Tin nhắn thường (không E2EE). Kế thừa [BaseMessage](#basemessage). Nhận qua event `message`.
1792+
1793+
```typescript
1794+
interface Message extends BaseMessage {
1795+
isAdminMsg?: boolean // Có phải tin nhắn hệ thống không
1796+
}
1797+
```
1798+
1799+
## E2EEMessage
1800+
1801+
Tin nhắn mã hóa đầu cuối. Kế thừa [BaseMessage](#basemessage). Nhận qua event `e2eeMessage`.
1802+
1803+
```typescript
1804+
interface E2EEMessage extends BaseMessage {
1805+
chatJid: string // Chat JID (bắt buộc cho các thao tác E2EE)
1806+
senderJid: string // Sender JID (bắt buộc cho các thao tác E2EE)
17531807
}
17541808
```
17551809

bridge-go/bridge/events.go

Lines changed: 66 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"net/url"
7+
"reflect"
78
"strconv"
89
"strings"
910
"time"
@@ -33,22 +34,23 @@ const (
3334
type EventType string
3435

3536
const (
36-
EventTypeReady EventType = "ready"
37-
EventTypeReconnected EventType = "reconnected"
38-
EventTypeDisconnected EventType = "disconnected"
39-
EventTypeError EventType = "error"
40-
EventTypeMessage EventType = "message"
41-
EventTypeMessageEdit EventType = "messageEdit"
42-
EventTypeMessageUnsend EventType = "messageUnsend"
43-
EventTypeReaction EventType = "reaction"
44-
EventTypeTyping EventType = "typing"
45-
EventTypePresence EventType = "presence"
46-
EventTypeReadReceipt EventType = "readReceipt"
47-
EventTypeE2EEConnected EventType = "e2eeConnected"
48-
EventTypeE2EEMessage EventType = "e2eeMessage"
49-
EventTypeE2EEReaction EventType = "e2eeReaction"
50-
EventTypeE2EEReceipt EventType = "e2eeReceipt"
51-
EventDeviceDataChanged EventType = "deviceDataChanged"
37+
EventTypeReady EventType = "ready"
38+
EventTypeReconnected EventType = "reconnected"
39+
EventTypeDisconnected EventType = "disconnected"
40+
EventTypeError EventType = "error"
41+
EventTypeRaw EventType = "raw"
42+
EventTypeMessage EventType = "message"
43+
EventTypeMessageEdit EventType = "messageEdit"
44+
EventTypeMessageUnsend EventType = "messageUnsend"
45+
EventTypeReaction EventType = "reaction"
46+
EventTypeTyping EventType = "typing"
47+
EventTypePresence EventType = "presence"
48+
EventTypeReadReceipt EventType = "readReceipt"
49+
EventTypeE2EEConnected EventType = "e2eeConnected"
50+
EventTypeE2EEMessage EventType = "e2eeMessage"
51+
EventTypeE2EEReaction EventType = "e2eeReaction"
52+
EventTypeE2EEReceipt EventType = "e2eeReceipt"
53+
EventDeviceDataChanged EventType = "deviceDataChanged"
5254
)
5355

5456
// Event represents a generic event
@@ -118,16 +120,13 @@ type Mention struct {
118120
Type string `json:"type,omitempty"` // "user", "page", "group"
119121
}
120122

121-
// Message represents a message
123+
// Message represents a regular (non-E2EE) message
122124
type Message struct {
123125
ID string `json:"id"`
124126
ThreadID int64 `json:"threadId"`
125127
SenderID int64 `json:"senderId"`
126128
Text string `json:"text"`
127129
TimestampMs int64 `json:"timestampMs"`
128-
IsE2EE bool `json:"isE2EE,omitempty"`
129-
ChatJID string `json:"chatJid,omitempty"`
130-
SenderJID string `json:"senderJid,omitempty"`
131130
Attachments []*Attachment `json:"attachments,omitempty"`
132131
ReplyTo *ReplyTo `json:"replyTo,omitempty"`
133132
Mentions []*Mention `json:"mentions,omitempty"`
@@ -173,10 +172,29 @@ type ErrorEvent struct {
173172
Code int `json:"code,omitempty"`
174173
}
175174

176-
// E2EEMessage represents an E2EE message
175+
// RawEventSource represents the source of a raw event
176+
type RawEventSource string
177+
178+
const (
179+
RawEventSourceLightSpeed RawEventSource = "lightspeed" // LightSpeed events (non-E2EE)
180+
RawEventSourceWhatsmeow RawEventSource = "whatsmeow" // WhatsApp/WhatsMe events (E2EE)
181+
)
182+
183+
// RawEvent represents a raw event from internal sources
184+
// This is useful for debugging or handling events not explicitly supported
185+
type RawEvent struct {
186+
// From indicates the source of the event
187+
From RawEventSource `json:"from"`
188+
// Type is the Go type name of the original event
189+
Type string `json:"type"`
190+
// Data contains the raw event data (JSON serialized)
191+
Data interface{} `json:"data"`
192+
}
193+
194+
// E2EEMessage represents an end-to-end encrypted message
177195
type E2EEMessage struct {
178196
ID string `json:"id"`
179-
ThreadID int64 `json:"threadId"` // For compatibility with regular messages
197+
ThreadID int64 `json:"threadId"`
180198
ChatJID string `json:"chatJid"`
181199
SenderJID string `json:"senderJid"`
182200
SenderID int64 `json:"senderId"`
@@ -185,11 +203,29 @@ type E2EEMessage struct {
185203
Attachments []*Attachment `json:"attachments,omitempty"`
186204
ReplyTo *ReplyTo `json:"replyTo,omitempty"`
187205
Mentions []*Mention `json:"mentions,omitempty"`
188-
DebugType string `json:"debugType,omitempty"` // Debug: raw message type from protobuf
206+
}
207+
208+
// getEventTypeName returns the type name of an event
209+
func getEventTypeName(evt any) string {
210+
if evt == nil {
211+
return "nil"
212+
}
213+
t := reflect.TypeOf(evt)
214+
if t.Kind() == reflect.Ptr {
215+
return t.Elem().Name()
216+
}
217+
return t.Name()
189218
}
190219

191220
// handleEvent handles messagix events
192221
func (c *Client) handleEvent(ctx context.Context, evt any) {
222+
// Emit raw event for all incoming LightSpeed events
223+
c.emitEvent(EventTypeRaw, &RawEvent{
224+
From: RawEventSourceLightSpeed,
225+
Type: getEventTypeName(evt),
226+
Data: evt,
227+
})
228+
193229
switch e := evt.(type) {
194230
case *messagix.Event_Ready:
195231
c.emitEvent(EventTypeReady, map[string]any{
@@ -616,6 +652,13 @@ func (c *Client) convertBlobAttachment(blob *table.LSInsertBlobAttachment) *Atta
616652

617653
// handleE2EEEvent handles WhatsApp E2EE events
618654
func (c *Client) handleE2EEEvent(evt interface{}) {
655+
// Emit raw event for all incoming whatsmeow events
656+
c.emitEvent(EventTypeRaw, &RawEvent{
657+
From: RawEventSourceWhatsmeow,
658+
Type: getEventTypeName(evt),
659+
Data: evt,
660+
})
661+
619662
switch e := evt.(type) {
620663
case *events.Connected:
621664
c.emitEvent(EventTypeE2EEConnected, nil)
@@ -1027,13 +1070,9 @@ func (c *Client) extractE2EEMessage(e *events.FBMessage, senderID int64) *E2EEMe
10271070
}
10281071

10291072
if e.Message == nil {
1030-
msg.DebugType = "nil"
10311073
return msg
10321074
}
10331075

1034-
// Set debug type from actual message type
1035-
msg.DebugType = fmt.Sprintf("%T", e.Message)
1036-
10371076
// Extract from ConsumerApplication
10381077
if ca, ok := e.Message.(*waConsumerApplication.ConsumerApplication); ok {
10391078
if p := ca.GetPayload(); p != nil {
@@ -1162,7 +1201,6 @@ func (c *Client) extractE2EEMessage(e *events.FBMessage, senderID int64) *E2EEMe
11621201

11631202
// Try Content first (link shares, etc.)
11641203
if content := payload.GetContent(); content != nil {
1165-
msg.DebugType = fmt.Sprintf("%T -> Content/%T", e.Message, content.GetContent())
11661204
// ExtendedContentMessage - used for link shares and location sharing
11671205
if extMsg := content.GetExtendedContentMessage(); extMsg != nil {
11681206
targetType := extMsg.GetTargetType()

0 commit comments

Comments
 (0)