@ariaflowagents/messaging-meta 0.8.1

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 (106) hide show
  1. package/README.md +236 -0
  2. package/dist/graph-api/client.d.ts +125 -0
  3. package/dist/graph-api/client.d.ts.map +1 -0
  4. package/dist/graph-api/client.js +204 -0
  5. package/dist/graph-api/client.js.map +1 -0
  6. package/dist/graph-api/errors.d.ts +41 -0
  7. package/dist/graph-api/errors.d.ts.map +1 -0
  8. package/dist/graph-api/errors.js +72 -0
  9. package/dist/graph-api/errors.js.map +1 -0
  10. package/dist/graph-api/index.d.ts +15 -0
  11. package/dist/graph-api/index.d.ts.map +1 -0
  12. package/dist/graph-api/index.js +11 -0
  13. package/dist/graph-api/index.js.map +1 -0
  14. package/dist/graph-api/rate-limiter.d.ts +90 -0
  15. package/dist/graph-api/rate-limiter.d.ts.map +1 -0
  16. package/dist/graph-api/rate-limiter.js +172 -0
  17. package/dist/graph-api/rate-limiter.js.map +1 -0
  18. package/dist/graph-api/retry.d.ts +55 -0
  19. package/dist/graph-api/retry.d.ts.map +1 -0
  20. package/dist/graph-api/retry.js +103 -0
  21. package/dist/graph-api/retry.js.map +1 -0
  22. package/dist/index.d.ts +36 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +38 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/instagram/client.d.ts +365 -0
  27. package/dist/instagram/client.d.ts.map +1 -0
  28. package/dist/instagram/client.js +857 -0
  29. package/dist/instagram/client.js.map +1 -0
  30. package/dist/instagram/format.d.ts +62 -0
  31. package/dist/instagram/format.d.ts.map +1 -0
  32. package/dist/instagram/format.js +92 -0
  33. package/dist/instagram/format.js.map +1 -0
  34. package/dist/instagram/ice-breakers.d.ts +63 -0
  35. package/dist/instagram/ice-breakers.d.ts.map +1 -0
  36. package/dist/instagram/ice-breakers.js +87 -0
  37. package/dist/instagram/ice-breakers.js.map +1 -0
  38. package/dist/instagram/index.d.ts +44 -0
  39. package/dist/instagram/index.d.ts.map +1 -0
  40. package/dist/instagram/index.js +46 -0
  41. package/dist/instagram/index.js.map +1 -0
  42. package/dist/instagram/types.d.ts +188 -0
  43. package/dist/instagram/types.d.ts.map +1 -0
  44. package/dist/instagram/types.js +19 -0
  45. package/dist/instagram/types.js.map +1 -0
  46. package/dist/messenger/client.d.ts +339 -0
  47. package/dist/messenger/client.d.ts.map +1 -0
  48. package/dist/messenger/client.js +782 -0
  49. package/dist/messenger/client.js.map +1 -0
  50. package/dist/messenger/format.d.ts +69 -0
  51. package/dist/messenger/format.d.ts.map +1 -0
  52. package/dist/messenger/format.js +98 -0
  53. package/dist/messenger/format.js.map +1 -0
  54. package/dist/messenger/index.d.ts +34 -0
  55. package/dist/messenger/index.d.ts.map +1 -0
  56. package/dist/messenger/index.js +35 -0
  57. package/dist/messenger/index.js.map +1 -0
  58. package/dist/messenger/types.d.ts +181 -0
  59. package/dist/messenger/types.d.ts.map +1 -0
  60. package/dist/messenger/types.js +10 -0
  61. package/dist/messenger/types.js.map +1 -0
  62. package/dist/server.d.ts +31 -0
  63. package/dist/server.d.ts.map +1 -0
  64. package/dist/server.js +29 -0
  65. package/dist/server.js.map +1 -0
  66. package/dist/webhook/index.d.ts +10 -0
  67. package/dist/webhook/index.d.ts.map +1 -0
  68. package/dist/webhook/index.js +8 -0
  69. package/dist/webhook/index.js.map +1 -0
  70. package/dist/webhook/normalizer.d.ts +169 -0
  71. package/dist/webhook/normalizer.d.ts.map +1 -0
  72. package/dist/webhook/normalizer.js +301 -0
  73. package/dist/webhook/normalizer.js.map +1 -0
  74. package/dist/webhook/verifier.d.ts +45 -0
  75. package/dist/webhook/verifier.d.ts.map +1 -0
  76. package/dist/webhook/verifier.js +62 -0
  77. package/dist/webhook/verifier.js.map +1 -0
  78. package/dist/whatsapp/client.d.ts +481 -0
  79. package/dist/whatsapp/client.d.ts.map +1 -0
  80. package/dist/whatsapp/client.js +1043 -0
  81. package/dist/whatsapp/client.js.map +1 -0
  82. package/dist/whatsapp/flows.d.ts +74 -0
  83. package/dist/whatsapp/flows.d.ts.map +1 -0
  84. package/dist/whatsapp/flows.js +77 -0
  85. package/dist/whatsapp/flows.js.map +1 -0
  86. package/dist/whatsapp/format.d.ts +78 -0
  87. package/dist/whatsapp/format.d.ts.map +1 -0
  88. package/dist/whatsapp/format.js +195 -0
  89. package/dist/whatsapp/format.js.map +1 -0
  90. package/dist/whatsapp/index.d.ts +39 -0
  91. package/dist/whatsapp/index.d.ts.map +1 -0
  92. package/dist/whatsapp/index.js +42 -0
  93. package/dist/whatsapp/index.js.map +1 -0
  94. package/dist/whatsapp/split.d.ts +35 -0
  95. package/dist/whatsapp/split.d.ts.map +1 -0
  96. package/dist/whatsapp/split.js +76 -0
  97. package/dist/whatsapp/split.js.map +1 -0
  98. package/dist/whatsapp/templates.d.ts +129 -0
  99. package/dist/whatsapp/templates.d.ts.map +1 -0
  100. package/dist/whatsapp/templates.js +125 -0
  101. package/dist/whatsapp/templates.js.map +1 -0
  102. package/dist/whatsapp/types.d.ts +440 -0
  103. package/dist/whatsapp/types.d.ts.map +1 -0
  104. package/dist/whatsapp/types.js +11 -0
  105. package/dist/whatsapp/types.js.map +1 -0
  106. package/package.json +31 -0
@@ -0,0 +1,365 @@
1
+ /**
2
+ * @module instagram/client
3
+ *
4
+ * Instagram Messaging API client implementing the {@link PlatformClient}
5
+ * interface from `@ariaflowagents/messaging`.
6
+ *
7
+ * Provides a complete, production-ready integration with Meta's Instagram
8
+ * Messaging API including:
9
+ *
10
+ * - Sending text, image, quick reply, and template messages
11
+ * - Webhook handling with HMAC-SHA256 signature verification
12
+ * - Generic template (carousel) and button template messages
13
+ * - Private replies to comments on posts and reels
14
+ * - Ice breaker management (set, get, delete)
15
+ * - Typing indicator support
16
+ * - Smart message splitting for the 1000-byte limit
17
+ * - Instagram-specific format conversion (plain text)
18
+ *
19
+ * Key differences from WhatsApp / Messenger:
20
+ * - Uses `graph.instagram.com` as the base URL (not `graph.facebook.com`).
21
+ * - Only IMAGE attachments are supported (no video, audio, or file).
22
+ * - Message limit is 1000 bytes (UTF-8 encoded), not characters.
23
+ * - Send response contains only `message_id` (no `recipient_id`).
24
+ * - Only `HUMAN_AGENT` message tag is supported (7-day window).
25
+ * - Ice breakers replace persistent menus.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * import { createInstagramClient } from '@ariaflowagents/messaging-meta/instagram';
30
+ *
31
+ * const client = createInstagramClient({
32
+ * accessToken: process.env.INSTAGRAM_ACCESS_TOKEN!,
33
+ * appSecret: process.env.META_APP_SECRET!,
34
+ * igId: process.env.INSTAGRAM_ACCOUNT_ID!,
35
+ * verifyToken: process.env.INSTAGRAM_VERIFY_TOKEN!,
36
+ * });
37
+ *
38
+ * client.onMessage(async (msg) => {
39
+ * await client.sendText(msg.from.id, `Echo: ${msg.text}`);
40
+ * });
41
+ * ```
42
+ */
43
+ import type { PlatformClient, SendResult, MediaPayload, MediaHandle, MediaDownload, MediaUploadOptions, InteractiveMessage, MessageHandler, StatusHandler, ReactionHandler, FormatConverter } from '@ariaflowagents/messaging';
44
+ import type { NormalizedMessage } from '../webhook/normalizer.js';
45
+ import type { InstagramClientConfig, InstagramQuickReply, InstagramGenericTemplate, InstagramButtonTemplate, PrivateReplyOptions, IceBreakerConfig, InstagramMessageTag } from './types.js';
46
+ /** Raw inbound type (the normalised message from the webhook). */
47
+ type InstagramInbound = NormalizedMessage;
48
+ /** Raw outbound type (arbitrary JSON payload). */
49
+ type InstagramOutbound = Record<string, unknown>;
50
+ /**
51
+ * Create a new {@link InstagramClient} instance.
52
+ *
53
+ * This is the recommended entry point. It constructs the client with all
54
+ * internal dependencies wired up (Graph API client, format converter).
55
+ *
56
+ * @param config - Instagram client configuration.
57
+ * @returns A fully configured {@link InstagramClient}.
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * const instagram = createInstagramClient({
62
+ * accessToken: process.env.INSTAGRAM_ACCESS_TOKEN!,
63
+ * appSecret: process.env.META_APP_SECRET!,
64
+ * igId: process.env.INSTAGRAM_ACCOUNT_ID!,
65
+ * verifyToken: process.env.INSTAGRAM_VERIFY_TOKEN!,
66
+ * });
67
+ * ```
68
+ */
69
+ export declare function createInstagramClient(config: InstagramClientConfig): InstagramClient;
70
+ /**
71
+ * Full-featured Instagram Messaging API client.
72
+ *
73
+ * Implements the `PlatformClient` interface from `@ariaflowagents/messaging`
74
+ * so it can be plugged into the messaging adapter layer, while also exposing
75
+ * Instagram-specific capabilities (quick replies, templates, ice breakers,
76
+ * private replies to comments).
77
+ *
78
+ * Use {@link createInstagramClient} to instantiate.
79
+ */
80
+ export declare class InstagramClient implements PlatformClient<InstagramClientConfig, string, InstagramInbound, InstagramOutbound> {
81
+ /** @inheritdoc */
82
+ readonly platform: "instagram";
83
+ private readonly graphApi;
84
+ private readonly config;
85
+ private readonly messageHandlers;
86
+ private readonly statusHandlers;
87
+ private readonly reactionHandlers;
88
+ private readonly formatConverterInstance;
89
+ private readonly mediaCache?;
90
+ constructor(config: InstagramClientConfig);
91
+ /** Instagram-specific format converter (plain text). */
92
+ get formatConverter(): FormatConverter;
93
+ /**
94
+ * Register a handler for inbound messages.
95
+ *
96
+ * Multiple handlers can be registered; they are called in order for
97
+ * each incoming message.
98
+ *
99
+ * @param handler - Callback invoked with the normalised message and raw payload.
100
+ */
101
+ onMessage(handler: MessageHandler<InstagramInbound>): void;
102
+ /**
103
+ * Register a handler for delivery/read status updates.
104
+ *
105
+ * @param handler - Callback invoked with the normalised status update.
106
+ */
107
+ onStatus(handler: StatusHandler): void;
108
+ /**
109
+ * Register a handler for reaction events.
110
+ *
111
+ * @param handler - Callback invoked with the normalised reaction data.
112
+ */
113
+ onReaction(handler: ReactionHandler): void;
114
+ /**
115
+ * Handle an incoming webhook request from Meta.
116
+ *
117
+ * - **GET** requests are treated as subscription verification challenges.
118
+ * - **POST** requests are validated via HMAC-SHA256 signature, normalised,
119
+ * and dispatched to registered handlers.
120
+ *
121
+ * @param request - The incoming HTTP request.
122
+ * @returns An HTTP response (200 OK, 401 Unauthorized, or 403 Forbidden).
123
+ */
124
+ handleWebhook(request: Request): Promise<Response>;
125
+ /**
126
+ * Handle webhook verification (GET) from Meta.
127
+ *
128
+ * @param request - The GET request with `hub.mode`, `hub.verify_token`, and `hub.challenge`.
129
+ * @returns 200 with the challenge string, or 403 Forbidden.
130
+ */
131
+ private handleVerification;
132
+ /**
133
+ * Send a text message.
134
+ *
135
+ * Long messages are automatically split at natural boundaries to stay
136
+ * within Instagram's 1000-byte (UTF-8) limit.
137
+ *
138
+ * @param to - Recipient IGSID (Instagram-scoped user ID).
139
+ * @param text - The text content to send.
140
+ * @returns The result of the last chunk sent.
141
+ */
142
+ sendText(to: string, text: string): Promise<SendResult>;
143
+ /**
144
+ * Send a media message.
145
+ *
146
+ * Instagram only supports IMAGE attachments. Attempting to send video,
147
+ * audio, document, or sticker media will throw a {@link MediaError}.
148
+ *
149
+ * @param to - Recipient IGSID.
150
+ * @param media - The media payload to send. Only `image` type is supported.
151
+ * @returns The send result.
152
+ * @throws {@link MediaError} if the media type is not `image`.
153
+ */
154
+ sendMedia(to: string, media: MediaPayload): Promise<SendResult>;
155
+ /**
156
+ * Send an interactive message (buttons or list).
157
+ *
158
+ * Converts the platform-agnostic {@link InteractiveMessage} into
159
+ * Instagram's template format:
160
+ * - `buttons` action type -> button template
161
+ * - `list` action type -> generic template (carousel)
162
+ *
163
+ * @param to - Recipient IGSID.
164
+ * @param msg - The interactive message definition.
165
+ * @returns The send result.
166
+ * @throws {@link MessagingError} if the interactive type is unsupported.
167
+ */
168
+ sendInteractive(to: string, msg: InteractiveMessage): Promise<SendResult>;
169
+ /**
170
+ * Send a raw platform-specific payload.
171
+ *
172
+ * This is an escape hatch for features not covered by the normalised
173
+ * interface. The payload is merged with the standard messaging envelope.
174
+ *
175
+ * @param to - Recipient IGSID.
176
+ * @param payload - Raw Instagram API payload fields.
177
+ * @returns The send result.
178
+ */
179
+ sendRaw(to: string, payload: InstagramOutbound): Promise<SendResult>;
180
+ /**
181
+ * Mark a message as read.
182
+ *
183
+ * Instagram Messaging API does not expose a dedicated mark-as-read
184
+ * endpoint. This method is a no-op that satisfies the {@link PlatformClient}
185
+ * interface.
186
+ *
187
+ * @param _messageId - The message ID (unused).
188
+ */
189
+ markAsRead(_messageId: string): Promise<void>;
190
+ /**
191
+ * Send a typing indicator (composing state) to a conversation.
192
+ *
193
+ * Uses the same `sender_action: "typing_on"` mechanism as Messenger.
194
+ *
195
+ * @param to - Recipient IGSID.
196
+ */
197
+ sendTypingIndicator(to: string): Promise<void>;
198
+ /**
199
+ * Upload media to Instagram for later use in messages.
200
+ *
201
+ * Note: Instagram image sending uses URL-based payloads. This method
202
+ * uploads via the Graph API and returns the media ID and URL if available.
203
+ *
204
+ * @param file - The file content as a Buffer or ReadableStream.
205
+ * @param options - Upload options including MIME type and optional filename.
206
+ * @returns A handle containing the platform-assigned media ID.
207
+ */
208
+ uploadMedia(file: Buffer | ReadableStream, options: MediaUploadOptions): Promise<MediaHandle>;
209
+ /**
210
+ * Download media from Instagram by its ID.
211
+ *
212
+ * Performs a two-step process: first retrieves the media URL via the
213
+ * Graph API, then downloads the binary content.
214
+ *
215
+ * @param mediaId - The Instagram media ID.
216
+ * @returns The downloaded media content, MIME type, and optional filename.
217
+ */
218
+ downloadMedia(mediaId: string): Promise<MediaDownload>;
219
+ /**
220
+ * Send a text message with quick reply buttons.
221
+ *
222
+ * Quick replies appear as tappable buttons below the message. Instagram
223
+ * supports a maximum of 13 quick replies per message, and only
224
+ * `content_type: "text"` is supported.
225
+ *
226
+ * @param to - Recipient IGSID.
227
+ * @param text - The text content displayed above the quick replies.
228
+ * @param replies - Array of quick reply options (max 13).
229
+ * @returns The send result.
230
+ */
231
+ sendQuickReplies(to: string, text: string, replies: InstagramQuickReply[]): Promise<SendResult>;
232
+ /**
233
+ * Send a generic template (carousel) message.
234
+ *
235
+ * Generic templates render as horizontally scrollable cards, each with
236
+ * an optional image, title, subtitle, default tap action, and buttons.
237
+ * Supports up to 10 elements.
238
+ *
239
+ * @param to - Recipient IGSID.
240
+ * @param template - The generic template configuration.
241
+ * @returns The send result.
242
+ */
243
+ sendGenericTemplate(to: string, template: InstagramGenericTemplate): Promise<SendResult>;
244
+ /**
245
+ * Send a button template message.
246
+ *
247
+ * Displays a text message with up to 3 buttons below it. Supports
248
+ * `postback` and `web_url` button types.
249
+ *
250
+ * @param to - Recipient IGSID.
251
+ * @param template - The button template configuration.
252
+ * @returns The send result.
253
+ */
254
+ sendButtonTemplate(to: string, template: InstagramButtonTemplate): Promise<SendResult>;
255
+ /**
256
+ * Send a private reply to a comment on a post or reel.
257
+ *
258
+ * Uses `recipient.comment_id` instead of `recipient.id` to initiate
259
+ * a DM thread from a comment. This is rate-limited to:
260
+ * - 100 calls/sec for live comments
261
+ * - 750 calls/hour for post/reel comments
262
+ *
263
+ * @param options - The private reply options (comment ID and text).
264
+ * @returns The send result.
265
+ */
266
+ sendPrivateReply(options: PrivateReplyOptions): Promise<SendResult>;
267
+ /**
268
+ * Ice breaker management operations.
269
+ *
270
+ * Ice breakers are conversation starters displayed when a user opens
271
+ * a DM thread for the first time. They deliver `messaging_postback`
272
+ * webhook events when tapped.
273
+ */
274
+ readonly iceBreakers: {
275
+ /**
276
+ * Set ice breakers for the Instagram professional account.
277
+ *
278
+ * Replaces any existing ice breakers with the provided configuration.
279
+ *
280
+ * @param breakers - Array of ice breaker configurations.
281
+ */
282
+ set: (breakers: IceBreakerConfig[]) => Promise<void>;
283
+ /**
284
+ * Get the current ice breaker configuration.
285
+ *
286
+ * @returns Array of ice breaker configurations currently set.
287
+ */
288
+ get: () => Promise<IceBreakerConfig[]>;
289
+ /**
290
+ * Delete all ice breakers for the Instagram professional account.
291
+ *
292
+ * Uses a POST with `_method=DELETE` override since the Graph API
293
+ * client does not expose a dedicated DELETE method.
294
+ */
295
+ delete: () => Promise<void>;
296
+ };
297
+ /**
298
+ * Send a text message with a message tag.
299
+ *
300
+ * Instagram only supports the `HUMAN_AGENT` tag, which extends the
301
+ * messaging window to 7 days for live agent handoff scenarios.
302
+ *
303
+ * @param to - Recipient IGSID.
304
+ * @param text - The text content to send.
305
+ * @param tag - The message tag (only `"HUMAN_AGENT"` is supported).
306
+ * @returns The send result.
307
+ */
308
+ sendTextWithTag(to: string, text: string, tag: InstagramMessageTag): Promise<SendResult>;
309
+ /**
310
+ * Returns a Hono sub-application that handles webhook routes.
311
+ *
312
+ * Mounts GET (verification) and POST (event delivery) handlers at the
313
+ * root path. Use this to integrate the webhook into an existing Hono app.
314
+ *
315
+ * Requires `hono` to be installed as a peer dependency. The import is
316
+ * performed dynamically to avoid a hard compile-time dependency.
317
+ *
318
+ * @returns A Hono application with webhook routes.
319
+ *
320
+ * @example
321
+ * ```ts
322
+ * import { Hono } from 'hono';
323
+ *
324
+ * const app = new Hono();
325
+ * app.route('/webhooks/instagram', client.webhookRouter());
326
+ * ```
327
+ */
328
+ webhookRouter(): any;
329
+ /**
330
+ * Convert a normalised webhook message to a platform-agnostic {@link InboundMessage}.
331
+ */
332
+ private toInboundMessage;
333
+ /**
334
+ * Convert a normalised webhook status to a platform-agnostic {@link StatusUpdate}.
335
+ */
336
+ private toStatusUpdate;
337
+ /**
338
+ * Convert a normalised webhook reaction to a platform-agnostic {@link ReactionData}.
339
+ */
340
+ private toReactionData;
341
+ /**
342
+ * Convert an {@link InstagramSendResponse} to a platform-agnostic {@link SendResult}.
343
+ *
344
+ * Note: Instagram send responses do NOT include `recipient_id` unlike Messenger.
345
+ */
346
+ private toSendResult;
347
+ /**
348
+ * Map an Instagram message type string to the normalised {@link InboundMessage} type union.
349
+ */
350
+ private mapMessageType;
351
+ /**
352
+ * Extract a text fallback from non-text message types (captions, button text, etc.).
353
+ */
354
+ private extractTextFallback;
355
+ /**
356
+ * Extract a {@link MediaReference} from a normalised message if it contains media.
357
+ */
358
+ private extractMedia;
359
+ /**
360
+ * Send a single text message (without splitting).
361
+ */
362
+ private sendSingleText;
363
+ }
364
+ export {};
365
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/instagram/client.ts"],"names":[],"mappings":"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"}