nodejs-insta-private-api-mqt 1.3.70
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/LICENSE +21 -0
- package/README.md +3677 -0
- package/dist/constants/constants.js +342 -0
- package/dist/constants/index.js +58 -0
- package/dist/core/client.js +419 -0
- package/dist/core/nav-chain.js +282 -0
- package/dist/core/repository.js +7 -0
- package/dist/core/request.js +390 -0
- package/dist/core/state.js +1473 -0
- package/dist/core/utils.js +786 -0
- package/dist/downloadMedia.js +381 -0
- package/dist/errors/index.d.ts +16 -0
- package/dist/errors/index.js +38 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/extend.js +167 -0
- package/dist/fbns/fbns.client.d.ts +32 -0
- package/dist/fbns/fbns.client.events.d.ts +41 -0
- package/dist/fbns/fbns.client.events.js +3 -0
- package/dist/fbns/fbns.client.events.js.map +1 -0
- package/dist/fbns/fbns.client.js +252 -0
- package/dist/fbns/fbns.client.js.map +1 -0
- package/dist/fbns/fbns.device-auth.d.ts +17 -0
- package/dist/fbns/fbns.device-auth.js +54 -0
- package/dist/fbns/fbns.device-auth.js.map +1 -0
- package/dist/fbns/fbns.types.d.ts +83 -0
- package/dist/fbns/fbns.types.js +3 -0
- package/dist/fbns/fbns.types.js.map +1 -0
- package/dist/fbns/fbns.utilities.d.ts +2 -0
- package/dist/fbns/fbns.utilities.js +79 -0
- package/dist/fbns/fbns.utilities.js.map +1 -0
- package/dist/fbns/index.d.ts +4 -0
- package/dist/fbns/index.js +21 -0
- package/dist/fbns/index.js.map +1 -0
- package/dist/index.js +139 -0
- package/dist/mqtt-shim.d.ts +96 -0
- package/dist/mqtt-shim.js +15 -0
- package/dist/mqttot/index.d.ts +4 -0
- package/dist/mqttot/index.js +21 -0
- package/dist/mqttot/index.js.map +1 -0
- package/dist/mqttot/mqttot.client.d.ts +39 -0
- package/dist/mqttot/mqttot.client.js +318 -0
- package/dist/mqttot/mqttot.client.js.map +1 -0
- package/dist/mqttot/mqttot.connect.request.packet.d.ts +7 -0
- package/dist/mqttot/mqttot.connect.request.packet.js +9 -0
- package/dist/mqttot/mqttot.connect.request.packet.js.map +1 -0
- package/dist/mqttot/mqttot.connect.response.packet.d.ts +7 -0
- package/dist/mqttot/mqttot.connect.response.packet.js +24 -0
- package/dist/mqttot/mqttot.connect.response.packet.js.map +1 -0
- package/dist/mqttot/mqttot.connection.d.ts +57 -0
- package/dist/mqttot/mqttot.connection.js +79 -0
- package/dist/mqttot/mqttot.connection.js.map +1 -0
- package/dist/package.json +59 -0
- package/dist/realtime/commands/commands.d.ts +15 -0
- package/dist/realtime/commands/commands.js +71 -0
- package/dist/realtime/commands/commands.js.map +1 -0
- package/dist/realtime/commands/direct.commands.d.ts +75 -0
- package/dist/realtime/commands/direct.commands.js +417 -0
- package/dist/realtime/commands/direct.commands.js.map +1 -0
- package/dist/realtime/commands/enhanced.direct.commands.js +1731 -0
- package/dist/realtime/commands/enhanced.direct.commands.js.bak +967 -0
- package/dist/realtime/commands/index.d.ts +2 -0
- package/dist/realtime/commands/index.js +20 -0
- package/dist/realtime/commands/index.js.map +1 -0
- package/dist/realtime/delta-sync.manager.js +293 -0
- package/dist/realtime/features/dm-sender.js +88 -0
- package/dist/realtime/features/error-handler.js +185 -0
- package/dist/realtime/features/gap-handler.js +61 -0
- package/dist/realtime/features/persistent-logger.js +186 -0
- package/dist/realtime/features/presence.manager.js +66 -0
- package/dist/realtime/features/session-health-monitor.js +345 -0
- package/dist/realtime/index.js +30 -0
- package/dist/realtime/messages/app-presence.event.d.ts +9 -0
- package/dist/realtime/messages/app-presence.event.js +3 -0
- package/dist/realtime/messages/app-presence.event.js.map +1 -0
- package/dist/realtime/messages/index.d.ts +3 -0
- package/dist/realtime/messages/index.js +20 -0
- package/dist/realtime/messages/index.js.map +1 -0
- package/dist/realtime/messages/message-sync.message.d.ts +222 -0
- package/dist/realtime/messages/message-sync.message.js +43 -0
- package/dist/realtime/messages/message-sync.message.js.map +1 -0
- package/dist/realtime/messages/realtime-sub.direct.data.d.ts +11 -0
- package/dist/realtime/messages/realtime-sub.direct.data.js +3 -0
- package/dist/realtime/messages/realtime-sub.direct.data.js.map +1 -0
- package/dist/realtime/messages/thread-update.message.d.ts +68 -0
- package/dist/realtime/messages/thread-update.message.js +3 -0
- package/dist/realtime/messages/thread-update.message.js.map +1 -0
- package/dist/realtime/mixins/index.d.ts +3 -0
- package/dist/realtime/mixins/index.js +20 -0
- package/dist/realtime/mixins/index.js.map +1 -0
- package/dist/realtime/mixins/message-sync.mixin.d.ts +8 -0
- package/dist/realtime/mixins/message-sync.mixin.js +596 -0
- package/dist/realtime/mixins/message-sync.mixin.js.map +1 -0
- package/dist/realtime/mixins/mixin.d.ts +19 -0
- package/dist/realtime/mixins/mixin.js +41 -0
- package/dist/realtime/mixins/mixin.js.map +1 -0
- package/dist/realtime/mixins/presence-typing.mixin.js +33 -0
- package/dist/realtime/mixins/realtime-sub.mixin.d.ts +8 -0
- package/dist/realtime/mixins/realtime-sub.mixin.js +181 -0
- package/dist/realtime/mixins/realtime-sub.mixin.js.map +1 -0
- package/dist/realtime/parsers/graphql-parser.js +43 -0
- package/dist/realtime/parsers/graphql.parser.d.ts +15 -0
- package/dist/realtime/parsers/graphql.parser.js +22 -0
- package/dist/realtime/parsers/graphql.parser.js.map +1 -0
- package/dist/realtime/parsers/index.d.ts +6 -0
- package/dist/realtime/parsers/index.js +23 -0
- package/dist/realtime/parsers/index.js.map +1 -0
- package/dist/realtime/parsers/iris-parser.js +43 -0
- package/dist/realtime/parsers/iris.parser.d.ts +17 -0
- package/dist/realtime/parsers/iris.parser.js +10 -0
- package/dist/realtime/parsers/iris.parser.js.map +1 -0
- package/dist/realtime/parsers/json-parser.js +43 -0
- package/dist/realtime/parsers/json.parser.d.ts +6 -0
- package/dist/realtime/parsers/json.parser.js +10 -0
- package/dist/realtime/parsers/json.parser.js.map +1 -0
- package/dist/realtime/parsers/parser.d.ts +9 -0
- package/dist/realtime/parsers/parser.js +3 -0
- package/dist/realtime/parsers/parser.js.map +1 -0
- package/dist/realtime/parsers/region-hint-parser.js +43 -0
- package/dist/realtime/parsers/region-hint.parser.d.ts +12 -0
- package/dist/realtime/parsers/region-hint.parser.js +15 -0
- package/dist/realtime/parsers/region-hint.parser.js.map +1 -0
- package/dist/realtime/parsers/skywalker-parser.js +43 -0
- package/dist/realtime/parsers/skywalker.parser.d.ts +12 -0
- package/dist/realtime/parsers/skywalker.parser.js +15 -0
- package/dist/realtime/parsers/skywalker.parser.js.map +1 -0
- package/dist/realtime/parsers-advanced.js +158 -0
- package/dist/realtime/proto/common.proto +38 -0
- package/dist/realtime/proto/direct.proto +65 -0
- package/dist/realtime/proto/ig-messages.proto +83 -0
- package/dist/realtime/proto/iris.proto +188 -0
- package/dist/realtime/proto-parser.js +195 -0
- package/dist/realtime/protocols/iris.handshake.js +74 -0
- package/dist/realtime/protocols/proto-definitions.js +80 -0
- package/dist/realtime/protocols/skywalker.protocol.js +91 -0
- package/dist/realtime/realtime.client.events.js +3 -0
- package/dist/realtime/realtime.client.js +1915 -0
- package/dist/realtime/realtime.service.js +462 -0
- package/dist/realtime/reconnect.manager.js +88 -0
- package/dist/realtime/session.manager.js +121 -0
- package/dist/realtime/subscriptions/graphql.subscription.d.ts +47 -0
- package/dist/realtime/subscriptions/graphql.subscription.js +99 -0
- package/dist/realtime/subscriptions/graphql.subscription.js.map +1 -0
- package/dist/realtime/subscriptions/index.d.ts +2 -0
- package/dist/realtime/subscriptions/index.js +19 -0
- package/dist/realtime/subscriptions/index.js.map +1 -0
- package/dist/realtime/subscriptions/skywalker.subscription.d.ts +4 -0
- package/dist/realtime/subscriptions/skywalker.subscription.js +13 -0
- package/dist/realtime/subscriptions/skywalker.subscription.js.map +1 -0
- package/dist/realtime/topic-map.js +71 -0
- package/dist/realtime/topic.js +80 -0
- package/dist/repositories/account.repository.js +575 -0
- package/dist/repositories/bloks.repository.js +70 -0
- package/dist/repositories/captcha.repository.js +44 -0
- package/dist/repositories/challenge.repository.js +120 -0
- package/dist/repositories/clip.repository.js +165 -0
- package/dist/repositories/close-friends.repository.js +46 -0
- package/dist/repositories/collection.repository.js +68 -0
- package/dist/repositories/direct-thread.repository.js +446 -0
- package/dist/repositories/direct.repository.js +232 -0
- package/dist/repositories/explore.repository.js +70 -0
- package/dist/repositories/fbsearch.repository.js +140 -0
- package/dist/repositories/feed.repository.js +245 -0
- package/dist/repositories/friendship.repository.js +296 -0
- package/dist/repositories/fundraiser.repository.js +49 -0
- package/dist/repositories/hashtag.repository.js +99 -0
- package/dist/repositories/highlights.repository.js +121 -0
- package/dist/repositories/insights.repository.js +82 -0
- package/dist/repositories/location.repository.js +84 -0
- package/dist/repositories/media.repository.js +395 -0
- package/dist/repositories/multiple-accounts.repository.js +41 -0
- package/dist/repositories/news.repository.js +35 -0
- package/dist/repositories/note.repository.js +57 -0
- package/dist/repositories/notification.repository.js +79 -0
- package/dist/repositories/share.repository.js +35 -0
- package/dist/repositories/signup.repository.js +218 -0
- package/dist/repositories/story.repository.js +290 -0
- package/dist/repositories/timeline.repository.js +60 -0
- package/dist/repositories/totp.repository.js +139 -0
- package/dist/repositories/track.repository.js +53 -0
- package/dist/repositories/upload.repository.js +204 -0
- package/dist/repositories/user.repository.js +360 -0
- package/dist/sendmedia/index.js +27 -0
- package/dist/sendmedia/sendFile.js +72 -0
- package/dist/sendmedia/sendPhoto.js +142 -0
- package/dist/sendmedia/sendRavenPhoto.js +153 -0
- package/dist/sendmedia/sendRavenVideo.js +158 -0
- package/dist/sendmedia/uploadPhoto.js +107 -0
- package/dist/sendmedia/uploadfFile.js +130 -0
- package/dist/services/live.service.js +139 -0
- package/dist/services/search.service.js +115 -0
- package/dist/shared/index.js +96 -0
- package/dist/shared/shared.js +86 -0
- package/dist/thrift/index.d.ts +3 -0
- package/dist/thrift/index.js +20 -0
- package/dist/thrift/index.js.map +1 -0
- package/dist/thrift/thrift.d.ts +59 -0
- package/dist/thrift/thrift.js +101 -0
- package/dist/thrift/thrift.js.map +1 -0
- package/dist/thrift/thrift.reading.d.ts +41 -0
- package/dist/thrift/thrift.reading.js +327 -0
- package/dist/thrift/thrift.reading.js.map +1 -0
- package/dist/thrift/thrift.writing.d.ts +44 -0
- package/dist/thrift/thrift.writing.js +342 -0
- package/dist/thrift/thrift.writing.js.map +1 -0
- package/dist/types/index.js +285 -0
- package/dist/useMultiFileAuthState.js +1768 -0
- package/dist/utils/helper-1.js +1 -0
- package/dist/utils/helper-10.js +1 -0
- package/dist/utils/helper-11.js +1 -0
- package/dist/utils/helper-12.js +1 -0
- package/dist/utils/helper-13.js +1 -0
- package/dist/utils/helper-14.js +1 -0
- package/dist/utils/helper-15.js +1 -0
- package/dist/utils/helper-16.js +1 -0
- package/dist/utils/helper-17.js +1 -0
- package/dist/utils/helper-18.js +1 -0
- package/dist/utils/helper-19.js +1 -0
- package/dist/utils/helper-2.js +1 -0
- package/dist/utils/helper-20.js +1 -0
- package/dist/utils/helper-21.js +1 -0
- package/dist/utils/helper-22.js +1 -0
- package/dist/utils/helper-23.js +1 -0
- package/dist/utils/helper-24.js +1 -0
- package/dist/utils/helper-25.js +1 -0
- package/dist/utils/helper-26.js +1 -0
- package/dist/utils/helper-27.js +1 -0
- package/dist/utils/helper-28.js +1 -0
- package/dist/utils/helper-29.js +1 -0
- package/dist/utils/helper-3.js +1 -0
- package/dist/utils/helper-30.js +1 -0
- package/dist/utils/helper-4.js +1 -0
- package/dist/utils/helper-5.js +1 -0
- package/dist/utils/helper-6.js +1 -0
- package/dist/utils/helper-7.js +1 -0
- package/dist/utils/helper-8.js +1 -0
- package/dist/utils/helper-9.js +1 -0
- package/dist/utils/index.js +280 -0
- package/dist/utils/insta-mqtt-helper.js +128 -0
- package/examples/listen-to-messages.js +86 -0
- package/package.json +82 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PresenceTypingMixin = void 0;
|
|
4
|
+
const presence_manager_1 = require("../features/presence.manager");
|
|
5
|
+
const skywalker_protocol_1 = require("../protocols/skywalker.protocol");
|
|
6
|
+
/**
|
|
7
|
+
* Mixin for handling Presence and Typing Indicators
|
|
8
|
+
*/
|
|
9
|
+
class PresenceTypingMixin {
|
|
10
|
+
apply(client) {
|
|
11
|
+
// Initialize managers
|
|
12
|
+
client.presenceManager = new presence_manager_1.PresenceManager(client);
|
|
13
|
+
client.skywalkerProtocol = new skywalker_protocol_1.SkywalkerProtocol(client);
|
|
14
|
+
|
|
15
|
+
// Add public methods
|
|
16
|
+
client.sendTyping = async (threadId, isTyping = true) => {
|
|
17
|
+
return client.skywalkerProtocol.sendTypingIndicator(threadId, isTyping);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
client.sendReaction = async (messageId, threadId, emoji) => {
|
|
21
|
+
return client.skywalkerProtocol.sendReaction(messageId, threadId, emoji);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
client.broadcastPresence = async (status = 'online') => {
|
|
25
|
+
return client.presenceManager.broadcastPresence(status);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get name() {
|
|
30
|
+
return 'Presence & Typing';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.PresenceTypingMixin = PresenceTypingMixin;
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RealtimeSubMixin - ENHANCED VERSION
|
|
4
|
+
*
|
|
5
|
+
* This file has been modified to include all MQTT features from instagram_mqtt library.
|
|
6
|
+
*
|
|
7
|
+
* CHANGES MADE (from instagram_mqtt compatibility):
|
|
8
|
+
* 1. Added import for subscriptions (QueryIDs) - was MISSING
|
|
9
|
+
* 2. Added client.mqtt.listen() approach for REALTIME_SUB topic - was MISSING
|
|
10
|
+
* 3. Added 'realtimeSub' event emission - was MISSING (only had 'subscription')
|
|
11
|
+
* 4. Added 'direct' topic processing - was MISSING
|
|
12
|
+
* 5. Added emitDirectEvent() method - was MISSING
|
|
13
|
+
* 6. Added QueryIDs-based event emission (directTyping, appPresence, etc.) - was MISSING
|
|
14
|
+
*
|
|
15
|
+
* PRESERVED:
|
|
16
|
+
* - Original 'subscription' event emission (for backwards compatibility)
|
|
17
|
+
* - Original on('message') approach with topicMap (extended, not replaced)
|
|
18
|
+
* - All existing retry logic and error handling
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.RealtimeSubMixin = void 0;
|
|
22
|
+
const mixin_1 = require("./mixin");
|
|
23
|
+
const constants_1 = require("../../constants");
|
|
24
|
+
const shared_1 = require("../../shared");
|
|
25
|
+
// ADDED: Import subscriptions for QueryIDs (was MISSING in nodejs-insta-private-api-mqt)
|
|
26
|
+
const subscriptions_1 = require("../subscriptions");
|
|
27
|
+
const mqtts_1 = require("mqtts");
|
|
28
|
+
|
|
29
|
+
class RealtimeSubMixin extends mixin_1.Mixin {
|
|
30
|
+
apply(client) {
|
|
31
|
+
(0, mixin_1.hook)(client, 'connect', {
|
|
32
|
+
post: async () => {
|
|
33
|
+
// Wait for MQTT client to be ready (PRESERVED from original)
|
|
34
|
+
let retries = 0;
|
|
35
|
+
while (!client.mqtt && retries < 50) {
|
|
36
|
+
await new Promise(r => setTimeout(r, 100));
|
|
37
|
+
retries++;
|
|
38
|
+
}
|
|
39
|
+
if (!client.mqtt) {
|
|
40
|
+
throw new mqtts_1.IllegalStateError('No mqtt client created after retries');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ADDED: Use client.mqtt.listen() for REALTIME_SUB topic (from instagram_mqtt)
|
|
44
|
+
// This is the approach used by instagram_mqtt for handling realtime subscriptions
|
|
45
|
+
if (client.mqtt.listen) {
|
|
46
|
+
client.mqtt.listen({
|
|
47
|
+
topic: constants_1.Topics.REALTIME_SUB.id,
|
|
48
|
+
transformer: async ({ payload }) => {
|
|
49
|
+
try {
|
|
50
|
+
return constants_1.Topics.REALTIME_SUB.parser.parseMessage(
|
|
51
|
+
constants_1.Topics.REALTIME_SUB,
|
|
52
|
+
await (0, shared_1.tryUnzipAsync)(payload)
|
|
53
|
+
);
|
|
54
|
+
} catch (err) {
|
|
55
|
+
// If transformer fails, return null so handler can skip
|
|
56
|
+
console.warn('[RealtimeSubMixin] transformer parse failed:', err?.message || err);
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
}, data => {
|
|
61
|
+
if (data) {
|
|
62
|
+
// ADDED: Call the instagram_mqtt compatible handler
|
|
63
|
+
this.handleRealtimeSubFromListen(client, data);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// PRESERVED: Original on('message') approach with topicMap (for backwards compatibility)
|
|
69
|
+
client.mqtt.on('message', async (msg) => {
|
|
70
|
+
const topicMap = client.mqtt?.topicMap;
|
|
71
|
+
const topic = topicMap?.get(msg.topic);
|
|
72
|
+
if (topic && topic.parser && !topic.noParse) {
|
|
73
|
+
try {
|
|
74
|
+
const unzipped = await (0, shared_1.tryUnzipAsync)(msg.payload);
|
|
75
|
+
const parsedMessages = topic.parser.parseMessage(topic, unzipped);
|
|
76
|
+
if (Array.isArray(parsedMessages)) {
|
|
77
|
+
parsedMessages.forEach(m => {
|
|
78
|
+
this.handleRealtimeSub(client, topic, m.data);
|
|
79
|
+
});
|
|
80
|
+
} else {
|
|
81
|
+
this.handleRealtimeSub(client, topic, parsedMessages.data);
|
|
82
|
+
}
|
|
83
|
+
} catch (e) {
|
|
84
|
+
console.error(`RealtimeSub parse error on ${topic.path}:`, e.message);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* ADDED: Handler compatible with instagram_mqtt's listen() approach
|
|
94
|
+
* This method handles data from client.mqtt.listen() and emits instagram_mqtt compatible events
|
|
95
|
+
*
|
|
96
|
+
* @param {Object} client - The realtime client instance
|
|
97
|
+
* @param {Object} param1 - The parsed data object containing { data, topic }
|
|
98
|
+
*/
|
|
99
|
+
handleRealtimeSubFromListen(client, { data, topic: messageTopic }) {
|
|
100
|
+
const { message } = data;
|
|
101
|
+
|
|
102
|
+
// ADDED: Emit 'realtimeSub' event (was MISSING - this is what instagram_mqtt does)
|
|
103
|
+
client.emit('realtimeSub', { data, topic: messageTopic });
|
|
104
|
+
|
|
105
|
+
// ADDED: Process message based on type (was MISSING)
|
|
106
|
+
if (typeof message === 'string') {
|
|
107
|
+
// If message is a string, parse it and emit direct event
|
|
108
|
+
this.emitDirectEvent(client, JSON.parse(message));
|
|
109
|
+
}
|
|
110
|
+
else if (message) {
|
|
111
|
+
const { topic, payload, json } = message;
|
|
112
|
+
switch (topic) {
|
|
113
|
+
case 'direct': {
|
|
114
|
+
// ADDED: Handle 'direct' topic specifically (was MISSING)
|
|
115
|
+
this.emitDirectEvent(client, json);
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
default: {
|
|
119
|
+
// ADDED: Emit QueryID-based events (was MISSING)
|
|
120
|
+
// This emits events like 'directTyping', 'appPresence', 'directStatus', etc.
|
|
121
|
+
const entries = Object.entries(subscriptions_1.QueryIDs);
|
|
122
|
+
const query = entries.find(e => e[1] === topic);
|
|
123
|
+
if (query) {
|
|
124
|
+
client.emit(query[0], json || payload);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* ADDED: Method to emit direct events (was MISSING from nodejs-insta-private-api-mqt)
|
|
133
|
+
* This method parses string values in parsed.data and emits 'direct' event for each
|
|
134
|
+
*
|
|
135
|
+
* @param {Object} client - The realtime client instance
|
|
136
|
+
* @param {Object} parsed - The parsed message object containing data array
|
|
137
|
+
*/
|
|
138
|
+
emitDirectEvent(client, parsed) {
|
|
139
|
+
if (!parsed || !parsed.data || !Array.isArray(parsed.data)) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
parsed.data = parsed.data.map((e) => {
|
|
144
|
+
if (typeof e.value === 'string') {
|
|
145
|
+
try {
|
|
146
|
+
e.value = JSON.parse(e.value);
|
|
147
|
+
} catch (parseErr) {
|
|
148
|
+
// If parsing fails, keep original value
|
|
149
|
+
console.warn('[RealtimeSubMixin] emitDirectEvent JSON parse failed:', parseErr?.message);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return e;
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// Emit 'direct' event for each data item
|
|
156
|
+
parsed.data.forEach((data) => client.emit('direct', data));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* PRESERVED: Original handler for on('message') approach (for backwards compatibility)
|
|
161
|
+
* This emits the 'subscription' event that existing code may depend on
|
|
162
|
+
*
|
|
163
|
+
* @param {Object} client - The realtime client instance
|
|
164
|
+
* @param {Object} topic - The topic object from topicMap
|
|
165
|
+
* @param {Object} data - The parsed message data
|
|
166
|
+
*/
|
|
167
|
+
handleRealtimeSub(client, topic, data) {
|
|
168
|
+
// PRESERVED: Emit 'subscription' event (original behavior)
|
|
169
|
+
client.emit('subscription', {
|
|
170
|
+
query: topic.path,
|
|
171
|
+
data: data,
|
|
172
|
+
topic: topic,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
get name() {
|
|
177
|
+
return 'Realtime Sub';
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
exports.RealtimeSubMixin = RealtimeSubMixin;
|
|
181
|
+
//# sourceMappingURL=realtime-sub.mixin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-sub.mixin.js","sourceRoot":"","sources":["../../../src/realtime/mixins/realtime-sub.mixin.ts"],"names":[],"mappings":";;;AAAA,mCAAsC;AAEtC,+CAAyC;AACzC,yCAA6C;AAE7C,oDAA4C;AAE5C,iCAA0C;AAE1C,MAAa,gBAAiB,SAAQ,aAAK;IACxC,KAAK,CAAC,MAAsB;QACzB,IAAA,YAAI,EAAC,MAAM,EAAE,SAAS,EAAE;YACrB,IAAI,EAAE,GAAG,EAAE;gBACR,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBAChB,MAAM,IAAI,yBAAiB,CAAC,wBAAwB,CAAC,CAAC;gBACzD,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,MAAM,CACf;oBACG,KAAK,EAAE,kBAAM,CAAC,YAAY,CAAC,EAAE;oBAC7B,WAAW,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAChC,kBAAM,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,kBAAM,CAAC,YAAY,EAAE,MAAM,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC;iBAC/F,EACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAC9C,CAAC;YACL,CAAC;SACH,CAAC,CAAC;IACN,CAAC;IAEO,iBAAiB,CAAC,MAAsB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAiC;QAC3G,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QAC1D,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACL,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YACzC,QAAQ,KAAK,EAAE,CAAC;gBACb,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACb,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBACnC,MAAM;gBACT,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;oBACP,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAQ,CAAC,CAAC;oBACzC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;oBAChD,IAAI,KAAK,EAAE,CAAC;wBACT,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAA0B,EAAE,IAAI,IAAI,OAAO,CAAC,CAAC;oBACnE,CAAC;gBACJ,CAAC;YACJ,CAAC;QACJ,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,MAAsB,EAAE,MAAW;QACxD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;YACtC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC/B,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAkC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,IAAI;QACL,OAAO,cAAc,CAAC;IACzB,CAAC;CACH;AAvDD,4CAuDC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses GraphQL messages from Instagram's realtime system.
|
|
5
|
+
* These messages contain GraphQL queries, mutations, and subscriptions.
|
|
6
|
+
*/
|
|
7
|
+
class GraphqlParser {
|
|
8
|
+
/**
|
|
9
|
+
* Parse a GraphQL message
|
|
10
|
+
* @param {Buffer|string} data - The raw message data
|
|
11
|
+
* @returns {Object} Parsed GraphQL data
|
|
12
|
+
*/
|
|
13
|
+
parse(data) {
|
|
14
|
+
try {
|
|
15
|
+
const message = Buffer.isBuffer(data) ? data.toString() : data;
|
|
16
|
+
|
|
17
|
+
// Try to parse as JSON first
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(message);
|
|
20
|
+
return {
|
|
21
|
+
type: 'graphql',
|
|
22
|
+
data: parsed,
|
|
23
|
+
raw: message
|
|
24
|
+
};
|
|
25
|
+
} catch (jsonError) {
|
|
26
|
+
// If not JSON, treat as GraphQL query string
|
|
27
|
+
return {
|
|
28
|
+
type: 'graphql',
|
|
29
|
+
data: { query: message },
|
|
30
|
+
raw: message
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
} catch (error) {
|
|
34
|
+
return {
|
|
35
|
+
type: 'graphql',
|
|
36
|
+
data: { error: error.message },
|
|
37
|
+
raw: data.toString()
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = GraphqlParser;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ParsedMessage, Parser } from './parser';
|
|
3
|
+
import { Topic } from '../../topic';
|
|
4
|
+
import { ThriftPacketDescriptor } from '../../thrift';
|
|
5
|
+
export declare class GraphqlParser implements Parser<GraphQlMessage> {
|
|
6
|
+
static descriptors: ThriftPacketDescriptor[];
|
|
7
|
+
parseMessage(topic: Topic, payload: Buffer): ParsedMessage<GraphQlMessage>;
|
|
8
|
+
}
|
|
9
|
+
export interface GraphQlMessage {
|
|
10
|
+
message: string | {
|
|
11
|
+
topic: string;
|
|
12
|
+
payload: string;
|
|
13
|
+
json: any;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GraphqlParser = void 0;
|
|
4
|
+
const thrift_1 = require("../../thrift");
|
|
5
|
+
const shared_1 = require("../../shared");
|
|
6
|
+
class GraphqlParser {
|
|
7
|
+
parseMessage(topic, payload) {
|
|
8
|
+
const message = (0, shared_1.isJson)(payload)
|
|
9
|
+
? payload.toString()
|
|
10
|
+
: (0, thrift_1.thriftReadToObject)(payload, GraphqlParser.descriptors) ?? '';
|
|
11
|
+
if (message.payload) {
|
|
12
|
+
message.json = JSON.parse(message.payload);
|
|
13
|
+
}
|
|
14
|
+
return { topic, data: { message } };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.GraphqlParser = GraphqlParser;
|
|
18
|
+
GraphqlParser.descriptors = [
|
|
19
|
+
thrift_1.ThriftDescriptors.binary('topic', 1),
|
|
20
|
+
thrift_1.ThriftDescriptors.binary('payload', 2),
|
|
21
|
+
];
|
|
22
|
+
//# sourceMappingURL=graphql.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql.parser.js","sourceRoot":"","sources":["../../../src/realtime/parsers/graphql.parser.ts"],"names":[],"mappings":";;;AAEA,yCAA6F;AAC7F,yCAAsC;AAEtC,MAAa,aAAa;IAMhB,YAAY,CAAC,KAAY,EAAE,OAAe;QAC9C,MAAM,OAAO,GAAQ,IAAA,eAAM,EAAC,OAAO,CAAC;YACjC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;YACpB,CAAC,CAAC,IAAA,2BAAkB,EAAqC,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACtG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;IACvC,CAAC;;AAdJ,sCAeC;AAdgB,yBAAW,GAA6B;IACnD,0BAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACpC,0BAAiB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;CACxC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./graphql.parser"), exports);
|
|
18
|
+
__exportStar(require("./iris.parser"), exports);
|
|
19
|
+
__exportStar(require("./json.parser"), exports);
|
|
20
|
+
__exportStar(require("./parser"), exports);
|
|
21
|
+
__exportStar(require("./region-hint.parser"), exports);
|
|
22
|
+
__exportStar(require("./skywalker.parser"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/realtime/parsers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,gDAA8B;AAC9B,gDAA8B;AAC9B,2CAAyB;AACzB,uDAAqC;AACrC,qDAAmC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Iris Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Iris messages from Instagram's realtime system.
|
|
5
|
+
* Iris is Instagram's internal messaging system for real-time updates.
|
|
6
|
+
*/
|
|
7
|
+
class IrisParser {
|
|
8
|
+
/**
|
|
9
|
+
* Parse an Iris message
|
|
10
|
+
* @param {Buffer|string} data - The raw message data
|
|
11
|
+
* @returns {Object} Parsed Iris data
|
|
12
|
+
*/
|
|
13
|
+
parse(data) {
|
|
14
|
+
try {
|
|
15
|
+
const message = Buffer.isBuffer(data) ? data.toString() : data;
|
|
16
|
+
|
|
17
|
+
// Try to parse as JSON first
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(message);
|
|
20
|
+
return {
|
|
21
|
+
type: 'iris',
|
|
22
|
+
data: parsed,
|
|
23
|
+
raw: message
|
|
24
|
+
};
|
|
25
|
+
} catch (jsonError) {
|
|
26
|
+
// If not JSON, treat as plain text
|
|
27
|
+
return {
|
|
28
|
+
type: 'iris',
|
|
29
|
+
data: { message: message },
|
|
30
|
+
raw: message
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
} catch (error) {
|
|
34
|
+
return {
|
|
35
|
+
type: 'iris',
|
|
36
|
+
data: { error: error.message },
|
|
37
|
+
raw: data.toString()
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = IrisParser;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ParsedMessage, Parser } from './parser';
|
|
3
|
+
import { Topic } from '../../topic';
|
|
4
|
+
export declare class IrisParser implements Parser<IrisParserData> {
|
|
5
|
+
parseMessage(topic: Topic, payload: Buffer): ParsedMessage<IrisParserData>[];
|
|
6
|
+
}
|
|
7
|
+
export interface IrisParserData {
|
|
8
|
+
event: 'patch' | string;
|
|
9
|
+
data?: any[];
|
|
10
|
+
message_type: number;
|
|
11
|
+
seq_id: number;
|
|
12
|
+
mutation_token: null | string;
|
|
13
|
+
realtime: boolean;
|
|
14
|
+
op?: 'add' | 'replace' | string;
|
|
15
|
+
path?: string;
|
|
16
|
+
sampled?: boolean;
|
|
17
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IrisParser = void 0;
|
|
4
|
+
class IrisParser {
|
|
5
|
+
parseMessage(topic, payload) {
|
|
6
|
+
return JSON.parse(payload.toString('utf8')).map((x) => ({ topic, data: x }));
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
exports.IrisParser = IrisParser;
|
|
10
|
+
//# sourceMappingURL=iris.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iris.parser.js","sourceRoot":"","sources":["../../../src/realtime/parsers/iris.parser.ts"],"names":[],"mappings":";;;AAGA,MAAa,UAAU;IACb,YAAY,CAAC,KAAY,EAAE,OAAe;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;CACH;AAJD,gCAIC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses JSON messages from Instagram's realtime system.
|
|
5
|
+
* This is a general-purpose parser for JSON-formatted messages.
|
|
6
|
+
*/
|
|
7
|
+
class JsonParser {
|
|
8
|
+
/**
|
|
9
|
+
* Parse a JSON message
|
|
10
|
+
* @param {Buffer|string} data - The raw message data
|
|
11
|
+
* @returns {Object} Parsed JSON data
|
|
12
|
+
*/
|
|
13
|
+
parse(data) {
|
|
14
|
+
try {
|
|
15
|
+
const message = Buffer.isBuffer(data) ? data.toString() : data;
|
|
16
|
+
|
|
17
|
+
// Try to parse as JSON
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(message);
|
|
20
|
+
return {
|
|
21
|
+
type: 'json',
|
|
22
|
+
data: parsed,
|
|
23
|
+
raw: message
|
|
24
|
+
};
|
|
25
|
+
} catch (jsonError) {
|
|
26
|
+
// If not valid JSON, return as plain text
|
|
27
|
+
return {
|
|
28
|
+
type: 'json',
|
|
29
|
+
data: { text: message },
|
|
30
|
+
raw: message
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
} catch (error) {
|
|
34
|
+
return {
|
|
35
|
+
type: 'json',
|
|
36
|
+
data: { error: error.message },
|
|
37
|
+
raw: data.toString()
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = JsonParser;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JsonParser = void 0;
|
|
4
|
+
class JsonParser {
|
|
5
|
+
parseMessage(topic, payload) {
|
|
6
|
+
return { topic, data: payload.length > 0 ? JSON.parse(payload.toString()) : {} };
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
exports.JsonParser = JsonParser;
|
|
10
|
+
//# sourceMappingURL=json.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.parser.js","sourceRoot":"","sources":["../../../src/realtime/parsers/json.parser.ts"],"names":[],"mappings":";;;AAGA,MAAa,UAAU;IACb,YAAY,CAAC,KAAY,EAAE,OAAe;QAC9C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpF,CAAC;CACH;AAJD,gCAIC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/realtime/parsers/parser.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Region Hint Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses region hint messages from Instagram's realtime system.
|
|
5
|
+
* These messages contain information about the user's region/location.
|
|
6
|
+
*/
|
|
7
|
+
class RegionHintParser {
|
|
8
|
+
/**
|
|
9
|
+
* Parse a region hint message
|
|
10
|
+
* @param {Buffer|string} data - The raw message data
|
|
11
|
+
* @returns {Object} Parsed region hint data
|
|
12
|
+
*/
|
|
13
|
+
parse(data) {
|
|
14
|
+
try {
|
|
15
|
+
const message = Buffer.isBuffer(data) ? data.toString() : data;
|
|
16
|
+
|
|
17
|
+
// Try to parse as JSON first
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(message);
|
|
20
|
+
return {
|
|
21
|
+
type: 'region_hint',
|
|
22
|
+
data: parsed,
|
|
23
|
+
raw: message
|
|
24
|
+
};
|
|
25
|
+
} catch (jsonError) {
|
|
26
|
+
// If not JSON, treat as plain text
|
|
27
|
+
return {
|
|
28
|
+
type: 'region_hint',
|
|
29
|
+
data: { hint: message },
|
|
30
|
+
raw: message
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
} catch (error) {
|
|
34
|
+
return {
|
|
35
|
+
type: 'region_hint',
|
|
36
|
+
data: { error: error.message },
|
|
37
|
+
raw: data.toString()
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = RegionHintParser;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ParsedMessage, Parser } from './parser';
|
|
3
|
+
import { Topic } from '../../topic';
|
|
4
|
+
import { ThriftToObjectResult } from '../../thrift';
|
|
5
|
+
export declare class RegionHintParser implements Parser<ThriftToObjectResult<{
|
|
6
|
+
hint: string;
|
|
7
|
+
}>> {
|
|
8
|
+
static descriptors: import("../../thrift").ThriftPacketDescriptor[];
|
|
9
|
+
parseMessage: (topic: Topic, payload: Buffer) => ParsedMessage<ThriftToObjectResult<{
|
|
10
|
+
hint: string;
|
|
11
|
+
}>>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RegionHintParser = void 0;
|
|
4
|
+
const thrift_1 = require("../../thrift");
|
|
5
|
+
class RegionHintParser {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.parseMessage = (topic, payload) => ({
|
|
8
|
+
topic,
|
|
9
|
+
data: (0, thrift_1.thriftReadToObject)(payload, RegionHintParser.descriptors),
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.RegionHintParser = RegionHintParser;
|
|
14
|
+
RegionHintParser.descriptors = [thrift_1.ThriftDescriptors.binary('hint', 1)];
|
|
15
|
+
//# sourceMappingURL=region-hint.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"region-hint.parser.js","sourceRoot":"","sources":["../../../src/realtime/parsers/region-hint.parser.ts"],"names":[],"mappings":";;;AAEA,yCAA2F;AAE3F,MAAa,gBAAgB;IAA7B;QAGU,iBAAY,GAAG,CAAC,KAAY,EAAE,OAAe,EAAyD,EAAE,CAAC,CAAC;YAC9G,KAAK;YACL,IAAI,EAAE,IAAA,2BAAkB,EAAC,OAAO,EAAE,gBAAgB,CAAC,WAAW,CAAC;SACjE,CAAC,CAAC;IACN,CAAC;;AAPD,4CAOC;AANgB,4BAAW,GAAG,CAAC,0BAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,AAAxC,CAAyC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skywalker Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Skywalker messages from Instagram's realtime system.
|
|
5
|
+
* Skywalker is Instagram's pub/sub system for real-time updates.
|
|
6
|
+
*/
|
|
7
|
+
class SkywalkerParser {
|
|
8
|
+
/**
|
|
9
|
+
* Parse a Skywalker message
|
|
10
|
+
* @param {Buffer|string} data - The raw message data
|
|
11
|
+
* @returns {Object} Parsed Skywalker data
|
|
12
|
+
*/
|
|
13
|
+
parse(data) {
|
|
14
|
+
try {
|
|
15
|
+
const message = Buffer.isBuffer(data) ? data.toString() : data;
|
|
16
|
+
|
|
17
|
+
// Try to parse as JSON first
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(message);
|
|
20
|
+
return {
|
|
21
|
+
type: 'skywalker',
|
|
22
|
+
data: parsed,
|
|
23
|
+
raw: message
|
|
24
|
+
};
|
|
25
|
+
} catch (jsonError) {
|
|
26
|
+
// If not JSON, treat as plain text
|
|
27
|
+
return {
|
|
28
|
+
type: 'skywalker',
|
|
29
|
+
data: { message: message },
|
|
30
|
+
raw: message
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
} catch (error) {
|
|
34
|
+
return {
|
|
35
|
+
type: 'skywalker',
|
|
36
|
+
data: { error: error.message },
|
|
37
|
+
raw: data.toString()
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = SkywalkerParser;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ParsedMessage, Parser } from './parser';
|
|
3
|
+
import { Topic } from '../../topic';
|
|
4
|
+
import { ThriftToObjectResult } from '../../thrift';
|
|
5
|
+
export declare class SkywalkerParser implements Parser<ThriftToObjectResult<SkywalkerResult>> {
|
|
6
|
+
static descriptors: import("../../thrift").ThriftPacketDescriptor[];
|
|
7
|
+
parseMessage(topic: Topic, payload: Buffer): ParsedMessage<ThriftToObjectResult<SkywalkerResult>>;
|
|
8
|
+
}
|
|
9
|
+
export interface SkywalkerResult {
|
|
10
|
+
topic: number;
|
|
11
|
+
payload: string;
|
|
12
|
+
}
|