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.
Files changed (240) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3677 -0
  3. package/dist/constants/constants.js +342 -0
  4. package/dist/constants/index.js +58 -0
  5. package/dist/core/client.js +419 -0
  6. package/dist/core/nav-chain.js +282 -0
  7. package/dist/core/repository.js +7 -0
  8. package/dist/core/request.js +390 -0
  9. package/dist/core/state.js +1473 -0
  10. package/dist/core/utils.js +786 -0
  11. package/dist/downloadMedia.js +381 -0
  12. package/dist/errors/index.d.ts +16 -0
  13. package/dist/errors/index.js +38 -0
  14. package/dist/errors/index.js.map +1 -0
  15. package/dist/extend.js +167 -0
  16. package/dist/fbns/fbns.client.d.ts +32 -0
  17. package/dist/fbns/fbns.client.events.d.ts +41 -0
  18. package/dist/fbns/fbns.client.events.js +3 -0
  19. package/dist/fbns/fbns.client.events.js.map +1 -0
  20. package/dist/fbns/fbns.client.js +252 -0
  21. package/dist/fbns/fbns.client.js.map +1 -0
  22. package/dist/fbns/fbns.device-auth.d.ts +17 -0
  23. package/dist/fbns/fbns.device-auth.js +54 -0
  24. package/dist/fbns/fbns.device-auth.js.map +1 -0
  25. package/dist/fbns/fbns.types.d.ts +83 -0
  26. package/dist/fbns/fbns.types.js +3 -0
  27. package/dist/fbns/fbns.types.js.map +1 -0
  28. package/dist/fbns/fbns.utilities.d.ts +2 -0
  29. package/dist/fbns/fbns.utilities.js +79 -0
  30. package/dist/fbns/fbns.utilities.js.map +1 -0
  31. package/dist/fbns/index.d.ts +4 -0
  32. package/dist/fbns/index.js +21 -0
  33. package/dist/fbns/index.js.map +1 -0
  34. package/dist/index.js +139 -0
  35. package/dist/mqtt-shim.d.ts +96 -0
  36. package/dist/mqtt-shim.js +15 -0
  37. package/dist/mqttot/index.d.ts +4 -0
  38. package/dist/mqttot/index.js +21 -0
  39. package/dist/mqttot/index.js.map +1 -0
  40. package/dist/mqttot/mqttot.client.d.ts +39 -0
  41. package/dist/mqttot/mqttot.client.js +318 -0
  42. package/dist/mqttot/mqttot.client.js.map +1 -0
  43. package/dist/mqttot/mqttot.connect.request.packet.d.ts +7 -0
  44. package/dist/mqttot/mqttot.connect.request.packet.js +9 -0
  45. package/dist/mqttot/mqttot.connect.request.packet.js.map +1 -0
  46. package/dist/mqttot/mqttot.connect.response.packet.d.ts +7 -0
  47. package/dist/mqttot/mqttot.connect.response.packet.js +24 -0
  48. package/dist/mqttot/mqttot.connect.response.packet.js.map +1 -0
  49. package/dist/mqttot/mqttot.connection.d.ts +57 -0
  50. package/dist/mqttot/mqttot.connection.js +79 -0
  51. package/dist/mqttot/mqttot.connection.js.map +1 -0
  52. package/dist/package.json +59 -0
  53. package/dist/realtime/commands/commands.d.ts +15 -0
  54. package/dist/realtime/commands/commands.js +71 -0
  55. package/dist/realtime/commands/commands.js.map +1 -0
  56. package/dist/realtime/commands/direct.commands.d.ts +75 -0
  57. package/dist/realtime/commands/direct.commands.js +417 -0
  58. package/dist/realtime/commands/direct.commands.js.map +1 -0
  59. package/dist/realtime/commands/enhanced.direct.commands.js +1731 -0
  60. package/dist/realtime/commands/enhanced.direct.commands.js.bak +967 -0
  61. package/dist/realtime/commands/index.d.ts +2 -0
  62. package/dist/realtime/commands/index.js +20 -0
  63. package/dist/realtime/commands/index.js.map +1 -0
  64. package/dist/realtime/delta-sync.manager.js +293 -0
  65. package/dist/realtime/features/dm-sender.js +88 -0
  66. package/dist/realtime/features/error-handler.js +185 -0
  67. package/dist/realtime/features/gap-handler.js +61 -0
  68. package/dist/realtime/features/persistent-logger.js +186 -0
  69. package/dist/realtime/features/presence.manager.js +66 -0
  70. package/dist/realtime/features/session-health-monitor.js +345 -0
  71. package/dist/realtime/index.js +30 -0
  72. package/dist/realtime/messages/app-presence.event.d.ts +9 -0
  73. package/dist/realtime/messages/app-presence.event.js +3 -0
  74. package/dist/realtime/messages/app-presence.event.js.map +1 -0
  75. package/dist/realtime/messages/index.d.ts +3 -0
  76. package/dist/realtime/messages/index.js +20 -0
  77. package/dist/realtime/messages/index.js.map +1 -0
  78. package/dist/realtime/messages/message-sync.message.d.ts +222 -0
  79. package/dist/realtime/messages/message-sync.message.js +43 -0
  80. package/dist/realtime/messages/message-sync.message.js.map +1 -0
  81. package/dist/realtime/messages/realtime-sub.direct.data.d.ts +11 -0
  82. package/dist/realtime/messages/realtime-sub.direct.data.js +3 -0
  83. package/dist/realtime/messages/realtime-sub.direct.data.js.map +1 -0
  84. package/dist/realtime/messages/thread-update.message.d.ts +68 -0
  85. package/dist/realtime/messages/thread-update.message.js +3 -0
  86. package/dist/realtime/messages/thread-update.message.js.map +1 -0
  87. package/dist/realtime/mixins/index.d.ts +3 -0
  88. package/dist/realtime/mixins/index.js +20 -0
  89. package/dist/realtime/mixins/index.js.map +1 -0
  90. package/dist/realtime/mixins/message-sync.mixin.d.ts +8 -0
  91. package/dist/realtime/mixins/message-sync.mixin.js +596 -0
  92. package/dist/realtime/mixins/message-sync.mixin.js.map +1 -0
  93. package/dist/realtime/mixins/mixin.d.ts +19 -0
  94. package/dist/realtime/mixins/mixin.js +41 -0
  95. package/dist/realtime/mixins/mixin.js.map +1 -0
  96. package/dist/realtime/mixins/presence-typing.mixin.js +33 -0
  97. package/dist/realtime/mixins/realtime-sub.mixin.d.ts +8 -0
  98. package/dist/realtime/mixins/realtime-sub.mixin.js +181 -0
  99. package/dist/realtime/mixins/realtime-sub.mixin.js.map +1 -0
  100. package/dist/realtime/parsers/graphql-parser.js +43 -0
  101. package/dist/realtime/parsers/graphql.parser.d.ts +15 -0
  102. package/dist/realtime/parsers/graphql.parser.js +22 -0
  103. package/dist/realtime/parsers/graphql.parser.js.map +1 -0
  104. package/dist/realtime/parsers/index.d.ts +6 -0
  105. package/dist/realtime/parsers/index.js +23 -0
  106. package/dist/realtime/parsers/index.js.map +1 -0
  107. package/dist/realtime/parsers/iris-parser.js +43 -0
  108. package/dist/realtime/parsers/iris.parser.d.ts +17 -0
  109. package/dist/realtime/parsers/iris.parser.js +10 -0
  110. package/dist/realtime/parsers/iris.parser.js.map +1 -0
  111. package/dist/realtime/parsers/json-parser.js +43 -0
  112. package/dist/realtime/parsers/json.parser.d.ts +6 -0
  113. package/dist/realtime/parsers/json.parser.js +10 -0
  114. package/dist/realtime/parsers/json.parser.js.map +1 -0
  115. package/dist/realtime/parsers/parser.d.ts +9 -0
  116. package/dist/realtime/parsers/parser.js +3 -0
  117. package/dist/realtime/parsers/parser.js.map +1 -0
  118. package/dist/realtime/parsers/region-hint-parser.js +43 -0
  119. package/dist/realtime/parsers/region-hint.parser.d.ts +12 -0
  120. package/dist/realtime/parsers/region-hint.parser.js +15 -0
  121. package/dist/realtime/parsers/region-hint.parser.js.map +1 -0
  122. package/dist/realtime/parsers/skywalker-parser.js +43 -0
  123. package/dist/realtime/parsers/skywalker.parser.d.ts +12 -0
  124. package/dist/realtime/parsers/skywalker.parser.js +15 -0
  125. package/dist/realtime/parsers/skywalker.parser.js.map +1 -0
  126. package/dist/realtime/parsers-advanced.js +158 -0
  127. package/dist/realtime/proto/common.proto +38 -0
  128. package/dist/realtime/proto/direct.proto +65 -0
  129. package/dist/realtime/proto/ig-messages.proto +83 -0
  130. package/dist/realtime/proto/iris.proto +188 -0
  131. package/dist/realtime/proto-parser.js +195 -0
  132. package/dist/realtime/protocols/iris.handshake.js +74 -0
  133. package/dist/realtime/protocols/proto-definitions.js +80 -0
  134. package/dist/realtime/protocols/skywalker.protocol.js +91 -0
  135. package/dist/realtime/realtime.client.events.js +3 -0
  136. package/dist/realtime/realtime.client.js +1915 -0
  137. package/dist/realtime/realtime.service.js +462 -0
  138. package/dist/realtime/reconnect.manager.js +88 -0
  139. package/dist/realtime/session.manager.js +121 -0
  140. package/dist/realtime/subscriptions/graphql.subscription.d.ts +47 -0
  141. package/dist/realtime/subscriptions/graphql.subscription.js +99 -0
  142. package/dist/realtime/subscriptions/graphql.subscription.js.map +1 -0
  143. package/dist/realtime/subscriptions/index.d.ts +2 -0
  144. package/dist/realtime/subscriptions/index.js +19 -0
  145. package/dist/realtime/subscriptions/index.js.map +1 -0
  146. package/dist/realtime/subscriptions/skywalker.subscription.d.ts +4 -0
  147. package/dist/realtime/subscriptions/skywalker.subscription.js +13 -0
  148. package/dist/realtime/subscriptions/skywalker.subscription.js.map +1 -0
  149. package/dist/realtime/topic-map.js +71 -0
  150. package/dist/realtime/topic.js +80 -0
  151. package/dist/repositories/account.repository.js +575 -0
  152. package/dist/repositories/bloks.repository.js +70 -0
  153. package/dist/repositories/captcha.repository.js +44 -0
  154. package/dist/repositories/challenge.repository.js +120 -0
  155. package/dist/repositories/clip.repository.js +165 -0
  156. package/dist/repositories/close-friends.repository.js +46 -0
  157. package/dist/repositories/collection.repository.js +68 -0
  158. package/dist/repositories/direct-thread.repository.js +446 -0
  159. package/dist/repositories/direct.repository.js +232 -0
  160. package/dist/repositories/explore.repository.js +70 -0
  161. package/dist/repositories/fbsearch.repository.js +140 -0
  162. package/dist/repositories/feed.repository.js +245 -0
  163. package/dist/repositories/friendship.repository.js +296 -0
  164. package/dist/repositories/fundraiser.repository.js +49 -0
  165. package/dist/repositories/hashtag.repository.js +99 -0
  166. package/dist/repositories/highlights.repository.js +121 -0
  167. package/dist/repositories/insights.repository.js +82 -0
  168. package/dist/repositories/location.repository.js +84 -0
  169. package/dist/repositories/media.repository.js +395 -0
  170. package/dist/repositories/multiple-accounts.repository.js +41 -0
  171. package/dist/repositories/news.repository.js +35 -0
  172. package/dist/repositories/note.repository.js +57 -0
  173. package/dist/repositories/notification.repository.js +79 -0
  174. package/dist/repositories/share.repository.js +35 -0
  175. package/dist/repositories/signup.repository.js +218 -0
  176. package/dist/repositories/story.repository.js +290 -0
  177. package/dist/repositories/timeline.repository.js +60 -0
  178. package/dist/repositories/totp.repository.js +139 -0
  179. package/dist/repositories/track.repository.js +53 -0
  180. package/dist/repositories/upload.repository.js +204 -0
  181. package/dist/repositories/user.repository.js +360 -0
  182. package/dist/sendmedia/index.js +27 -0
  183. package/dist/sendmedia/sendFile.js +72 -0
  184. package/dist/sendmedia/sendPhoto.js +142 -0
  185. package/dist/sendmedia/sendRavenPhoto.js +153 -0
  186. package/dist/sendmedia/sendRavenVideo.js +158 -0
  187. package/dist/sendmedia/uploadPhoto.js +107 -0
  188. package/dist/sendmedia/uploadfFile.js +130 -0
  189. package/dist/services/live.service.js +139 -0
  190. package/dist/services/search.service.js +115 -0
  191. package/dist/shared/index.js +96 -0
  192. package/dist/shared/shared.js +86 -0
  193. package/dist/thrift/index.d.ts +3 -0
  194. package/dist/thrift/index.js +20 -0
  195. package/dist/thrift/index.js.map +1 -0
  196. package/dist/thrift/thrift.d.ts +59 -0
  197. package/dist/thrift/thrift.js +101 -0
  198. package/dist/thrift/thrift.js.map +1 -0
  199. package/dist/thrift/thrift.reading.d.ts +41 -0
  200. package/dist/thrift/thrift.reading.js +327 -0
  201. package/dist/thrift/thrift.reading.js.map +1 -0
  202. package/dist/thrift/thrift.writing.d.ts +44 -0
  203. package/dist/thrift/thrift.writing.js +342 -0
  204. package/dist/thrift/thrift.writing.js.map +1 -0
  205. package/dist/types/index.js +285 -0
  206. package/dist/useMultiFileAuthState.js +1768 -0
  207. package/dist/utils/helper-1.js +1 -0
  208. package/dist/utils/helper-10.js +1 -0
  209. package/dist/utils/helper-11.js +1 -0
  210. package/dist/utils/helper-12.js +1 -0
  211. package/dist/utils/helper-13.js +1 -0
  212. package/dist/utils/helper-14.js +1 -0
  213. package/dist/utils/helper-15.js +1 -0
  214. package/dist/utils/helper-16.js +1 -0
  215. package/dist/utils/helper-17.js +1 -0
  216. package/dist/utils/helper-18.js +1 -0
  217. package/dist/utils/helper-19.js +1 -0
  218. package/dist/utils/helper-2.js +1 -0
  219. package/dist/utils/helper-20.js +1 -0
  220. package/dist/utils/helper-21.js +1 -0
  221. package/dist/utils/helper-22.js +1 -0
  222. package/dist/utils/helper-23.js +1 -0
  223. package/dist/utils/helper-24.js +1 -0
  224. package/dist/utils/helper-25.js +1 -0
  225. package/dist/utils/helper-26.js +1 -0
  226. package/dist/utils/helper-27.js +1 -0
  227. package/dist/utils/helper-28.js +1 -0
  228. package/dist/utils/helper-29.js +1 -0
  229. package/dist/utils/helper-3.js +1 -0
  230. package/dist/utils/helper-30.js +1 -0
  231. package/dist/utils/helper-4.js +1 -0
  232. package/dist/utils/helper-5.js +1 -0
  233. package/dist/utils/helper-6.js +1 -0
  234. package/dist/utils/helper-7.js +1 -0
  235. package/dist/utils/helper-8.js +1 -0
  236. package/dist/utils/helper-9.js +1 -0
  237. package/dist/utils/index.js +280 -0
  238. package/dist/utils/insta-mqtt-helper.js +128 -0
  239. package/examples/listen-to-messages.js +86 -0
  240. 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,8 @@
1
+ import { Mixin } from './mixin';
2
+ import { RealtimeClient } from '../realtime.client';
3
+ export declare class RealtimeSubMixin extends Mixin {
4
+ apply(client: RealtimeClient): void;
5
+ private handleRealtimeSub;
6
+ private emitDirectEvent;
7
+ get name(): string;
8
+ }
@@ -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,6 @@
1
+ export * from './graphql.parser';
2
+ export * from './iris.parser';
3
+ export * from './json.parser';
4
+ export * from './parser';
5
+ export * from './region-hint.parser';
6
+ export * from './skywalker.parser';
@@ -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,6 @@
1
+ /// <reference types="node" />
2
+ import { ParsedMessage, Parser } from './parser';
3
+ import { Topic } from '../../topic';
4
+ export declare class JsonParser implements Parser<any> {
5
+ parseMessage(topic: Topic, payload: Buffer): ParsedMessage<any>;
6
+ }
@@ -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,9 @@
1
+ /// <reference types="node" />
2
+ import { Topic } from '../../topic';
3
+ export interface Parser<T> {
4
+ parseMessage(topic: Topic, payload: Buffer): ParsedMessage<T>[] | ParsedMessage<T>;
5
+ }
6
+ export interface ParsedMessage<T> {
7
+ topic: Topic;
8
+ data: T;
9
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=parser.js.map
@@ -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
+ }