Skip to content

Commit 24db6cf

Browse files
author
Bjornskjald
committed
2.2.0: Added MessageRemoveEvent
2 parents 17f23f0 + 8610f49 commit 24db6cf

File tree

6 files changed

+84
-23
lines changed

6 files changed

+84
-23
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "libfb",
3-
"version": "2.1.1",
3+
"version": "2.2.0",
44
"description": "Facebook MQTT library for Node.js",
55
"repository": "https://github.com/ChatPlug/libfb-js",
66
"main": "dist/index.js",

src/Client.ts

Lines changed: 57 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ import { AttachmentNotFoundError, AttachmentURLMissingError } from './types/Erro
1616
import StrictEventEmitter from 'strict-event-emitter-types'
1717
import ClientEvents from './ClientEvents'
1818
import * as Payloads from './mqtt/payloads'
19+
import DeviceId from './types/DeviceId'
1920

2021
const debugLog = debug('fblib')
2122

2223
export interface ClientOptions {
2324
selfListen?: boolean
2425
session?: Session
26+
deviceId?: DeviceId
2527
}
2628

2729
type ClientEmitter = StrictEventEmitter<EventEmitter, ClientEvents>
@@ -51,6 +53,10 @@ export default class Client extends (EventEmitter as { new(): ClientEmitter }) {
5153
session = { tokens: null, deviceId: null }
5254
}
5355

56+
if (options.deviceId) {
57+
session.deviceId = options.deviceId
58+
}
59+
5460
if (!session.deviceId) {
5561
const deviceId = makeDeviceId()
5662
session.deviceId = deviceId
@@ -215,29 +221,62 @@ export default class Client extends (EventEmitter as { new(): ClientEmitter }) {
215221
}
216222

217223
private async createQueue (seqId: number) {
218-
const obj = {
219-
delta_batch_size: 125,
220-
max_deltas_able_to_process: 1250,
221-
sync_api_version: 3,
222-
encoding: 'JSON',
223224

225+
// sync_api_version 3: You receive /t_ms payloads as json
226+
// sync_api_version 10: You receiove /t_ms payloads as thrift,
227+
// and connectQueue() does not have to be called.
228+
// Note that connectQueue() should always use 10 instead.
229+
230+
const obj = (
231+
{
224232
initial_titan_sequence_id: seqId,
225-
device_id: this.session.deviceId.deviceId,
233+
delta_batch_size: 125,
234+
device_params: {
235+
image_sizes: {
236+
0: '4096x4096',
237+
4: '312x312',
238+
1: '768x768',
239+
2: '420x420',
240+
3: '312x312'
241+
},
242+
animated_image_format: 'WEBP,GIF',
243+
animated_image_sizes: {
244+
0: '4096x4096',
245+
4: '312x312',
246+
1: '768x768',
247+
2: '420x420',
248+
3: '312x312'
249+
}
250+
},
226251
entity_fbid: this.session.tokens.uid,
227-
252+
sync_api_version: 3, // Must be 3 instead of 10 to receive json payloads
253+
encoding: 'JSON', // Must be removed if using sync_api_version 10
228254
queue_params: {
229-
buzz_on_deltas_enabled: 'false',
255+
// Array of numbers -> Some bitwise encoding scheme -> base64. Numbers range from 0 to 67
256+
// Decides what type of /t_ms delta messages you get. Flags unknown, copy-pasted from app.
257+
client_delta_sync_bitmask: 'Amvr2dBlf7PNgA',
230258
graphql_query_hashes: {
231-
xma_query_id: '10153919431161729'
259+
xma_query_id: '306810703252313'
232260
},
233-
234261
graphql_query_params: {
235-
'10153919431161729': {
236-
xma_id: '<ID>'
262+
306810703252313: {
263+
xma_id: '<ID>',
264+
small_preview_width: 624,
265+
small_preview_height: 312,
266+
large_preview_width: 1536,
267+
large_preview_height: 768,
268+
full_screen_width: 4096,
269+
full_screen_height: 4096,
270+
blur: 0.0,
271+
nt_context: {
272+
styles_id: 'fe1fd5357bb40c81777dc915dfbd6aa4',
273+
pixel_ratio: 3.0
274+
}
237275
}
238276
}
239277
}
240278
}
279+
)
241280

242281
await this.mqttApi.sendPublish(
243282
'/messenger_sync_create_queue',
@@ -246,10 +285,15 @@ export default class Client extends (EventEmitter as { new(): ClientEmitter }) {
246285
}
247286

248287
private async connectQueue (seqId) {
288+
289+
// If createQueue() uses sync_api_version 10, this does not need to be called, and you will not receive json payloads.
290+
// If this does not use sync_api_version 10, you will not receive all messages (e.g. reactions )
291+
// Send the thrift-equivalent payload to /t_ms_gd and you will receive mostly thrift-encoded payloads instead.
292+
249293
const obj = {
250294
delta_batch_size: 125,
251295
max_deltas_able_to_process: 1250,
252-
sync_api_version: 3,
296+
sync_api_version: 10, // Must be 10 to receive some messages
253297
encoding: 'JSON',
254298

255299
last_seq_id: seqId,

src/ClientEvents.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ import {
1818
ChangeThreadThemeEvent,
1919
DeliveryReceiptEvent,
2020
ReadReceiptEvent,
21-
EventType
21+
EventType,
22+
MessageRemoveEvent
2223
} from './types/Events'
2324

2425
export default interface ClientEvents {
@@ -46,4 +47,6 @@ export default interface ClientEvents {
4647

4748
deliveryReceiptEvent: (deliveryReceiptEvent: DeliveryReceiptEvent) => void,
4849
readReceiptEvent: (readReceiptEvent: ReadReceiptEvent) => void
50+
51+
messageRemoveEvent: (messageRemoveEvent: MessageRemoveEvent) => void
4952
}

src/types/Events.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ export type EventType = (
1919
'changeThreadThemeEvent' |
2020

2121
'deliveryReceiptEvent' |
22-
'readReceiptEvent'
22+
'readReceiptEvent' |
23+
'messageRemoveEvent'
2324
)
2425

2526
export interface Event {
@@ -70,3 +71,5 @@ export interface DeliveryReceiptEvent extends Event {
7071
export interface ReadReceiptEvent extends Event {
7172
receiverId: string
7273
}
74+
75+
export interface MessageRemoveEvent extends MessageEvent {}

src/types/events/parseDeltaEvent.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,28 @@ import {
44
ThreadNameEvent
55
} from './ThreadEvents'
66
import {
7-
Event,
8-
DeliveryReceiptEvent,
9-
ReadReceiptEvent,
10-
EventType
7+
Event,
8+
DeliveryReceiptEvent,
9+
ReadReceiptEvent,
10+
EventType,
11+
MessageRemoveEvent
1112
} from '../Events'
1213
import parseAdminMessage from './parseAdminMessage'
1314
import { getThreadId } from '../Message'
1415

1516
export default function parseDeltaEvent (event: any): { type: EventType, event: Event } {
1617
if (event.deltaAdminTextMessage) return parseAdminMessage(event.deltaAdminTextMessage)
1718

19+
if (event.deltaReplaceMessage) {
20+
const delta = event.deltaReplaceMessage
21+
if (delta.newMessage.messageMetadata.unsendType) {
22+
return {
23+
type: 'messageRemoveEvent',
24+
event: getEventMetadata(delta.newMessage) as MessageRemoveEvent
25+
}
26+
}
27+
}
28+
1829
if (event.deltaThreadName) {
1930
const delta = event.deltaThreadName
2031
return {
@@ -32,7 +43,7 @@ export default function parseDeltaEvent (event: any): { type: EventType, event:
3243
type: 'deliveryReceiptEvent',
3344
event: {
3445
threadId: getThreadId(delta),
35-
receiverId: delta.actorFbId || getThreadId(delta)
46+
receiverId: delta.actorFbId.toString() || getThreadId(delta)
3647
} as DeliveryReceiptEvent
3748
}
3849
}
@@ -43,7 +54,7 @@ export default function parseDeltaEvent (event: any): { type: EventType, event:
4354
type: 'readReceiptEvent',
4455
event: {
4556
threadId: getThreadId(delta),
46-
receiverId: delta.actorFbId || getThreadId(delta)
57+
receiverId: delta.actorFbId.toString() || getThreadId(delta)
4758
} as ReadReceiptEvent
4859
}
4960
}

0 commit comments

Comments
 (0)