naystack 1.8.12 → 1.8.14

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 (74) hide show
  1. package/README.md +189 -31
  2. package/dist/auth/index.cjs.js +158 -18
  3. package/dist/auth/index.d.mts +3 -1
  4. package/dist/auth/index.d.ts +3 -1
  5. package/dist/auth/index.esm.js +158 -18
  6. package/dist/auth/instagram/index.cjs.js +158 -18
  7. package/dist/auth/instagram/index.d.mts +6 -1
  8. package/dist/auth/instagram/index.d.ts +6 -1
  9. package/dist/auth/instagram/index.esm.js +158 -18
  10. package/dist/auth/instagram/route.cjs.js +158 -18
  11. package/dist/auth/instagram/route.d.mts +3 -1
  12. package/dist/auth/instagram/route.d.ts +3 -1
  13. package/dist/auth/instagram/route.esm.js +158 -18
  14. package/dist/auth/instagram/utils.cjs.js +2 -2
  15. package/dist/auth/instagram/utils.d.mts +13 -2
  16. package/dist/auth/instagram/utils.d.ts +13 -2
  17. package/dist/auth/instagram/utils.esm.js +2 -2
  18. package/dist/file/setup.d.mts +13 -5
  19. package/dist/file/setup.d.ts +13 -5
  20. package/dist/index.d.mts +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/socials/index.cjs.js +298 -72
  23. package/dist/socials/index.d.mts +6 -4
  24. package/dist/socials/index.d.ts +6 -4
  25. package/dist/socials/index.esm.js +296 -72
  26. package/dist/socials/instagram/getters.cjs.js +76 -25
  27. package/dist/socials/instagram/getters.d.mts +56 -6
  28. package/dist/socials/instagram/getters.d.ts +56 -6
  29. package/dist/socials/instagram/getters.esm.js +74 -25
  30. package/dist/socials/instagram/setters.cjs.js +192 -14
  31. package/dist/socials/instagram/setters.d.mts +43 -3
  32. package/dist/socials/instagram/setters.d.ts +43 -3
  33. package/dist/socials/instagram/setters.esm.js +191 -14
  34. package/dist/socials/instagram/types.d.mts +48 -11
  35. package/dist/socials/instagram/types.d.ts +48 -11
  36. package/dist/socials/instagram/utils.cjs.js +28 -15
  37. package/dist/socials/instagram/utils.d.mts +7 -18
  38. package/dist/socials/instagram/utils.d.ts +7 -18
  39. package/dist/socials/instagram/utils.esm.js +26 -14
  40. package/dist/socials/instagram/webhook.cjs.js +1 -1
  41. package/dist/socials/instagram/webhook.esm.js +1 -1
  42. package/dist/socials/meta/container.cjs.js +82 -0
  43. package/dist/socials/meta/container.d.mts +38 -0
  44. package/dist/socials/meta/container.d.ts +38 -0
  45. package/dist/socials/meta/container.esm.js +57 -0
  46. package/dist/socials/meta/request.cjs.js +60 -0
  47. package/dist/socials/meta/request.d.mts +50 -0
  48. package/dist/socials/meta/request.d.ts +50 -0
  49. package/dist/socials/meta/request.esm.js +34 -0
  50. package/dist/socials/meta/types.cjs.js +34 -0
  51. package/dist/socials/meta/types.d.mts +51 -0
  52. package/dist/socials/meta/types.d.ts +51 -0
  53. package/dist/socials/meta/types.esm.js +9 -0
  54. package/dist/socials/{meta-webhook.cjs.js → meta/webhook.cjs.js} +4 -4
  55. package/dist/socials/{meta-webhook.esm.js → meta/webhook.esm.js} +1 -1
  56. package/dist/socials/threads/getters.cjs.js +36 -11
  57. package/dist/socials/threads/getters.d.mts +23 -2
  58. package/dist/socials/threads/getters.d.ts +23 -2
  59. package/dist/socials/threads/getters.esm.js +35 -11
  60. package/dist/socials/threads/setters.cjs.js +150 -44
  61. package/dist/socials/threads/setters.d.mts +25 -34
  62. package/dist/socials/threads/setters.d.ts +25 -34
  63. package/dist/socials/threads/setters.esm.js +149 -41
  64. package/dist/socials/threads/types.d.mts +40 -1
  65. package/dist/socials/threads/types.d.ts +40 -1
  66. package/dist/socials/threads/utils.cjs.js +29 -11
  67. package/dist/socials/threads/utils.d.mts +8 -17
  68. package/dist/socials/threads/utils.d.ts +8 -17
  69. package/dist/socials/threads/utils.esm.js +27 -10
  70. package/dist/socials/threads/webhook.cjs.js +1 -1
  71. package/dist/socials/threads/webhook.esm.js +1 -1
  72. package/package.json +1 -1
  73. /package/dist/socials/{meta-webhook.d.mts → meta/webhook.d.mts} +0 -0
  74. /package/dist/socials/{meta-webhook.d.ts → meta/webhook.d.ts} +0 -0
@@ -1,36 +1,62 @@
1
- // src/socials/instagram/utils.ts
2
- function getInstagramURL(token, path, params) {
3
- return `https://graph.instagram.com/v23.0/${path}?${Object.keys(params).map((key) => `${key}=${params[key]}`).join("&")}&access_token=${token}`;
4
- }
5
- function getInstagramData(token, path, params = {}, postData) {
6
- return fetch(getInstagramURL(token, path, params), {
7
- method: postData ? "POST" : "GET",
8
- body: JSON.stringify(postData),
9
- headers: {
10
- Authorization: `Bearer ${token}`,
11
- "Content-Type": "application/json"
1
+ // src/socials/meta/request.ts
2
+ function createGraphClient(baseURL) {
3
+ const buildURL = (token, path, params = {}) => {
4
+ const search = new URLSearchParams();
5
+ for (const [key, value] of Object.entries(params)) {
6
+ if (value !== void 0) search.set(key, String(value));
12
7
  }
13
- }).then((res) => res.json());
8
+ search.set("access_token", token);
9
+ return `${baseURL}/${path}?${search.toString()}`;
10
+ };
11
+ const request = async (token, path, options = {}) => {
12
+ const response = await fetch(buildURL(token, path, options.params), {
13
+ method: options.method || (options.body ? "POST" : "GET"),
14
+ headers: {
15
+ Authorization: `Bearer ${token}`,
16
+ ...options.body ? { "Content-Type": "application/json" } : {}
17
+ },
18
+ ...options.body ? { body: JSON.stringify(options.body) } : {}
19
+ });
20
+ return response.json().catch(() => null);
21
+ };
22
+ return { buildURL, request };
23
+ }
24
+ function readGraphID(label, result) {
25
+ if (result?.error) {
26
+ console.error(`[naystack] ${label} failed: ${result.error.message}`);
27
+ return null;
28
+ }
29
+ return result?.id || null;
14
30
  }
15
31
 
32
+ // src/socials/instagram/utils.ts
33
+ var client = createGraphClient("https://graph.instagram.com/v23.0");
34
+ var getInstagramData = client.request;
35
+
16
36
  // src/socials/instagram/getters.ts
17
37
  var getInstagramUser = (token, id, fields) => {
18
38
  return getInstagramData(token, id || "me", {
19
- fields: fields ? fields.join(",") : "username,followers_count,media_count"
39
+ params: {
40
+ fields: fields ? fields.join(",") : "username,followers_count,media_count"
41
+ }
20
42
  });
21
43
  };
22
44
  var getInstagramMedia = (token, fields, limit = 12) => {
23
45
  return getInstagramData(token, "me/media", {
24
- fields: fields ? fields.join(",") : "like_count,comments_count,permalink",
25
- limit: limit?.toString()
46
+ params: {
47
+ fields: fields ? fields.join(",") : "like_count,comments_count,permalink",
48
+ limit
49
+ }
26
50
  });
27
51
  };
28
52
  var getInstagramConversations = async (token, limit = 25, cursor) => {
29
53
  const result = await getInstagramData(token, "me/conversations", {
30
- platform: "instagram",
31
- fields: "participants,messages,updated_time",
32
- limit: limit.toString(),
33
- ...cursor ? { after: cursor } : {}
54
+ params: {
55
+ platform: "instagram",
56
+ fields: "participants,messages,updated_time",
57
+ limit,
58
+ after: cursor
59
+ }
34
60
  });
35
61
  return {
36
62
  data: result?.data.map((item) => ({
@@ -46,8 +72,10 @@ var getInstagramConversationsByUser = (token, userID) => {
46
72
  token,
47
73
  "me/conversations",
48
74
  {
49
- fields: "participants,messages,updated_time",
50
- user_id: userID
75
+ params: {
76
+ fields: "participants,messages,updated_time",
77
+ user_id: userID
78
+ }
51
79
  }
52
80
  );
53
81
  };
@@ -56,9 +84,11 @@ var getInstagramConversationByUser = async (token, userID) => {
56
84
  return res?.data?.find((item) => item.participants?.data.length === 2);
57
85
  };
58
86
  var getInstagramConversation = async (token, id, cursor) => {
59
- const result = await getInstagramData(token, id + "", {
60
- fields: "participants,messages,updated_time",
61
- ...cursor ? { after: cursor } : {}
87
+ const result = await getInstagramData(token, id, {
88
+ params: {
89
+ fields: "participants,messages,updated_time",
90
+ after: cursor
91
+ }
62
92
  });
63
93
  return {
64
94
  messages: result?.messages?.data,
@@ -72,21 +102,191 @@ var getInstagramConversation = async (token, id, cursor) => {
72
102
  };
73
103
  var getInstagramMessage = (token, id, fields) => {
74
104
  return getInstagramData(token, id, {
75
- fields: fields ? fields.join(",") : "id,created_time,from,to,message"
105
+ params: {
106
+ fields: fields ? fields.join(",") : "id,created_time,from,to,message"
107
+ }
76
108
  });
77
109
  };
110
+ var getInstagramContainerStatus = async (token, id) => {
111
+ const result = await getInstagramData(token, id, { params: { fields: "status_code,status" } });
112
+ if (!result?.status_code) return null;
113
+ return {
114
+ status: result.status_code,
115
+ error: result.status_code === "ERROR" ? result.status : void 0
116
+ };
117
+ };
118
+ var canPublishToInstagram = async (token) => {
119
+ const result = await getInstagramData(
120
+ token,
121
+ "me/content_publishing_limit",
122
+ { params: { fields: "quota_usage" } }
123
+ );
124
+ if (!Array.isArray(result?.data)) {
125
+ console.error(
126
+ `[naystack] Instagram token cannot publish${result?.error ? `: ${result.error.message}` : ""}`
127
+ );
128
+ return false;
129
+ }
130
+ return true;
131
+ };
132
+
133
+ // src/socials/meta/container.ts
134
+ var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
135
+ async function waitForContainer(getState, { intervalMS = 5e3, timeoutMS = 3e5 } = {}) {
136
+ const deadline = Date.now() + timeoutMS;
137
+ let state = await getState();
138
+ if (!state) {
139
+ await sleep(2e3);
140
+ return null;
141
+ }
142
+ while (state?.status === "IN_PROGRESS" && Date.now() < deadline) {
143
+ await sleep(intervalMS);
144
+ state = await getState();
145
+ }
146
+ return state;
147
+ }
148
+ function createPublisher(platform) {
149
+ const isReady = async (token, id, label, wait) => {
150
+ const state = await waitForContainer(
151
+ () => platform.getStatus(token, id),
152
+ wait
153
+ );
154
+ if (state && state.status !== "FINISHED" && state.status !== "PUBLISHED") {
155
+ console.error(
156
+ `[naystack] ${platform.name} ${label} ${id} is ${state.status}${state.error ? `: ${state.error}` : ""}`
157
+ );
158
+ return false;
159
+ }
160
+ return true;
161
+ };
162
+ return {
163
+ /** Creates a container, waits for it to finish processing, then publishes it. */
164
+ publish: async (token, params, wait) => {
165
+ const containerID = await platform.createContainer(token, params);
166
+ if (!containerID) return null;
167
+ if (!await isReady(token, containerID, "container", wait)) return null;
168
+ return platform.publish(token, containerID);
169
+ },
170
+ /** Creates and awaits every carousel child, resolving to their ids — or `null` if any failed. */
171
+ createChildren: async (token, items, wait) => {
172
+ const children = [];
173
+ for (const item of items) {
174
+ const childID = await platform.createContainer(token, {
175
+ ...item,
176
+ is_carousel_item: true
177
+ });
178
+ if (!childID) return null;
179
+ if (!await isReady(token, childID, "carousel item", wait))
180
+ return null;
181
+ children.push(childID);
182
+ }
183
+ return children;
184
+ }
185
+ };
186
+ }
78
187
 
79
188
  // src/socials/instagram/setters.ts
189
+ var publisher = createPublisher({
190
+ name: "Instagram",
191
+ getStatus: getInstagramContainerStatus,
192
+ createContainer: async (token, params) => readGraphID(
193
+ "Instagram media container",
194
+ await getInstagramData(token, "me/media", {
195
+ params,
196
+ method: "POST"
197
+ })
198
+ ),
199
+ publish: async (token, creationID) => readGraphID(
200
+ "Instagram publish",
201
+ await getInstagramData(token, "me/media_publish", {
202
+ params: { creation_id: creationID },
203
+ method: "POST"
204
+ })
205
+ )
206
+ });
207
+ var mediaParams = (media) => ({
208
+ media_type: media.type === "video" /* Video */ ? "VIDEO" : void 0,
209
+ image_url: media.type === "photo" /* Photo */ ? media.url : void 0,
210
+ video_url: media.type === "video" /* Video */ ? media.url : void 0,
211
+ // Instagram accepts alt text on images only.
212
+ alt_text: media.type === "photo" /* Photo */ ? media.altText : void 0
213
+ });
214
+ var createInstagramPost = async (token, input) => {
215
+ const media = [input.media].flat();
216
+ const first = media[0];
217
+ if (!first) {
218
+ console.error(
219
+ "[naystack] Instagram posts need at least one image or video"
220
+ );
221
+ return null;
222
+ }
223
+ if (input.story) {
224
+ return publisher.publish(
225
+ token,
226
+ {
227
+ ...mediaParams(first),
228
+ media_type: "STORIES",
229
+ alt_text: void 0
230
+ },
231
+ input.wait
232
+ );
233
+ }
234
+ if (media.length > 1) {
235
+ const children = await publisher.createChildren(
236
+ token,
237
+ media.map(mediaParams),
238
+ input.wait
239
+ );
240
+ if (!children) return null;
241
+ return publisher.publish(
242
+ token,
243
+ {
244
+ media_type: "CAROUSEL",
245
+ children: children.join(","),
246
+ caption: input.caption
247
+ },
248
+ input.wait
249
+ );
250
+ }
251
+ if (first.type === "video" /* Video */) {
252
+ return publisher.publish(
253
+ token,
254
+ {
255
+ media_type: "REELS",
256
+ video_url: first.url,
257
+ caption: input.caption,
258
+ cover_url: input.coverURL,
259
+ thumb_offset: input.thumbOffset,
260
+ share_to_feed: input.shareToFeed,
261
+ audio_name: input.audioName,
262
+ collaborators: input.collaborators && JSON.stringify(input.collaborators)
263
+ },
264
+ input.wait
265
+ );
266
+ }
267
+ return publisher.publish(
268
+ token,
269
+ {
270
+ image_url: first.url,
271
+ caption: input.caption,
272
+ alt_text: first.altText,
273
+ location_id: input.locationID
274
+ },
275
+ input.wait
276
+ );
277
+ };
80
278
  var sendInstagramMessage = (token, to, text) => {
81
- return getInstagramData(token, "me/messages", void 0, {
82
- recipient: { id: to },
83
- message: {
84
- text
279
+ return getInstagramData(token, "me/messages", {
280
+ body: {
281
+ recipient: { id: to },
282
+ message: {
283
+ text
284
+ }
85
285
  }
86
286
  });
87
287
  };
88
288
 
89
- // src/socials/meta-webhook.ts
289
+ // src/socials/meta/webhook.ts
90
290
  import { NextResponse } from "next/server";
91
291
  var verifyWebhook = (secret) => (req) => {
92
292
  const params = req.nextUrl.searchParams;
@@ -115,69 +315,91 @@ var setupInstagramWebhook = (options) => {
115
315
  };
116
316
 
117
317
  // src/socials/threads/utils.ts
118
- function getThreadsURL(token, path, params) {
119
- return `https://graph.threads.net/v1.0/${path}?${Object.keys(params).map((key) => `${key}=${params[key]}`).join("&")}&access_token=${token}`;
120
- }
121
- function getThreadsData(token, path, params, method) {
122
- return fetch(getThreadsURL(token, path, params), {
123
- method: method || "GET"
124
- }).then((res) => res.json());
125
- }
318
+ var client2 = createGraphClient("https://graph.threads.net/v1.0");
319
+ var getThreadsData = client2.request;
126
320
 
127
321
  // src/socials/threads/getters.ts
128
322
  var getThread = (token, id, fields) => {
129
323
  return getThreadsData(token, id, {
130
- fields: fields ? fields.join(",") : "text,permalink,username"
324
+ params: { fields: fields ? fields.join(",") : "text,permalink,username" }
131
325
  });
132
326
  };
133
327
  var getThreads = (token, fields) => {
134
328
  return getThreadsData(token, "me/threads", {
135
- fields: fields ? fields.join(",") : "text,permalink,username"
329
+ params: { fields: fields ? fields.join(",") : "text,permalink,username" }
136
330
  }).then((res) => res?.data);
137
331
  };
138
332
  var getThreadsReplies = (token, id, fields) => {
139
333
  return getThreadsData(token, `${id}/replies`, {
140
- fields: fields ? fields.join(",") : "text,username,permalink"
334
+ params: { fields: fields ? fields.join(",") : "text,username,permalink" }
141
335
  }).then((res) => res?.data);
142
336
  };
337
+ var getThreadsContainerStatus = async (token, id) => {
338
+ const result = await getThreadsData(token, id, { params: { fields: "status,error_message" } });
339
+ if (!result?.status) return null;
340
+ return { status: result.status, error: result.error_message };
341
+ };
143
342
 
144
343
  // src/socials/threads/setters.ts
145
- function createContainer(token, text, reply_to_id) {
146
- return getThreadsData(
147
- token,
148
- "me/threads",
149
- {
150
- media_type: "TEXT",
151
- text,
152
- ...reply_to_id ? { reply_to_id } : {}
153
- },
154
- "POST"
155
- ).then((res) => res?.id);
156
- }
157
- function publishContainer(token, creation_id) {
158
- return getThreadsData(
344
+ var publisher2 = createPublisher({
345
+ name: "Threads",
346
+ getStatus: getThreadsContainerStatus,
347
+ createContainer: async (token, params) => readGraphID(
348
+ "Threads container",
349
+ await getThreadsData(token, "me/threads", {
350
+ params,
351
+ method: "POST"
352
+ })
353
+ ),
354
+ publish: async (token, creationID) => readGraphID(
355
+ "Threads publish",
356
+ await getThreadsData(token, "me/threads_publish", {
357
+ params: { creation_id: creationID },
358
+ method: "POST"
359
+ })
360
+ )
361
+ });
362
+ var mediaParams2 = (media) => ({
363
+ media_type: media ? media.type === "video" /* Video */ ? "VIDEO" : "IMAGE" : "TEXT",
364
+ image_url: media?.type === "photo" /* Photo */ ? media.url : void 0,
365
+ video_url: media?.type === "video" /* Video */ ? media.url : void 0,
366
+ alt_text: media?.altText
367
+ });
368
+ var createThreadsPost = async (token, input, replyToID) => {
369
+ const post = typeof input === "string" ? { text: input } : input;
370
+ const media = post.media ? [post.media].flat() : [];
371
+ const shared = {
372
+ text: post.text,
373
+ reply_to_id: post.replyToID || replyToID,
374
+ reply_control: post.replyControl
375
+ };
376
+ if (media.length > 1) {
377
+ const children = await publisher2.createChildren(
378
+ token,
379
+ media.map((item) => mediaParams2(item)),
380
+ post.wait
381
+ );
382
+ if (!children) return null;
383
+ return publisher2.publish(
384
+ token,
385
+ { ...shared, media_type: "CAROUSEL", children: children.join(",") },
386
+ post.wait
387
+ );
388
+ }
389
+ return publisher2.publish(
159
390
  token,
160
- "me/threads_publish",
161
391
  {
162
- creation_id
392
+ ...mediaParams2(media[0]),
393
+ ...shared,
394
+ link_attachment: post.linkAttachment
163
395
  },
164
- "POST"
165
- ).then((res) => res?.id);
166
- }
167
- var createThreadsPost = async (token, text, reply_to_id) => {
168
- const containerID = await createContainer(token, text, reply_to_id);
169
- if (!containerID) return null;
170
- await new Promise((resolve) => setTimeout(resolve, 2e3));
171
- return publishContainer(token, containerID);
396
+ post.wait
397
+ );
172
398
  };
173
- var createThread = async (token, threads) => {
399
+ var createThread = async (token, posts) => {
174
400
  const publishedIDs = [];
175
- for (const thread of threads) {
176
- const postID = await createThreadsPost(
177
- token,
178
- thread.split("\n").join("%0A"),
179
- publishedIDs.at(-1)
180
- );
401
+ for (const post of posts) {
402
+ const postID = await createThreadsPost(token, post, publishedIDs.at(-1));
181
403
  if (postID) publishedIDs.push(postID);
182
404
  }
183
405
  return publishedIDs[0];
@@ -199,6 +421,8 @@ var setupThreadsWebhook = (options) => {
199
421
  };
200
422
  };
201
423
  export {
424
+ canPublishToInstagram,
425
+ createInstagramPost,
202
426
  createThread,
203
427
  createThreadsPost,
204
428
  getInstagramConversation,
@@ -20,6 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/socials/instagram/getters.ts
21
21
  var getters_exports = {};
22
22
  __export(getters_exports, {
23
+ canPublishToInstagram: () => canPublishToInstagram,
24
+ getInstagramContainerStatus: () => getInstagramContainerStatus,
23
25
  getInstagramConversation: () => getInstagramConversation,
24
26
  getInstagramConversationByUser: () => getInstagramConversationByUser,
25
27
  getInstagramConversations: () => getInstagramConversations,
@@ -30,39 +32,58 @@ __export(getters_exports, {
30
32
  });
31
33
  module.exports = __toCommonJS(getters_exports);
32
34
 
33
- // src/socials/instagram/utils.ts
34
- function getInstagramURL(token, path, params) {
35
- return `https://graph.instagram.com/v23.0/${path}?${Object.keys(params).map((key) => `${key}=${params[key]}`).join("&")}&access_token=${token}`;
36
- }
37
- function getInstagramData(token, path, params = {}, postData) {
38
- return fetch(getInstagramURL(token, path, params), {
39
- method: postData ? "POST" : "GET",
40
- body: JSON.stringify(postData),
41
- headers: {
42
- Authorization: `Bearer ${token}`,
43
- "Content-Type": "application/json"
35
+ // src/socials/meta/request.ts
36
+ function createGraphClient(baseURL) {
37
+ const buildURL = (token, path, params = {}) => {
38
+ const search = new URLSearchParams();
39
+ for (const [key, value] of Object.entries(params)) {
40
+ if (value !== void 0) search.set(key, String(value));
44
41
  }
45
- }).then((res) => res.json());
42
+ search.set("access_token", token);
43
+ return `${baseURL}/${path}?${search.toString()}`;
44
+ };
45
+ const request = async (token, path, options = {}) => {
46
+ const response = await fetch(buildURL(token, path, options.params), {
47
+ method: options.method || (options.body ? "POST" : "GET"),
48
+ headers: {
49
+ Authorization: `Bearer ${token}`,
50
+ ...options.body ? { "Content-Type": "application/json" } : {}
51
+ },
52
+ ...options.body ? { body: JSON.stringify(options.body) } : {}
53
+ });
54
+ return response.json().catch(() => null);
55
+ };
56
+ return { buildURL, request };
46
57
  }
47
58
 
59
+ // src/socials/instagram/utils.ts
60
+ var client = createGraphClient("https://graph.instagram.com/v23.0");
61
+ var getInstagramData = client.request;
62
+
48
63
  // src/socials/instagram/getters.ts
49
64
  var getInstagramUser = (token, id, fields) => {
50
65
  return getInstagramData(token, id || "me", {
51
- fields: fields ? fields.join(",") : "username,followers_count,media_count"
66
+ params: {
67
+ fields: fields ? fields.join(",") : "username,followers_count,media_count"
68
+ }
52
69
  });
53
70
  };
54
71
  var getInstagramMedia = (token, fields, limit = 12) => {
55
72
  return getInstagramData(token, "me/media", {
56
- fields: fields ? fields.join(",") : "like_count,comments_count,permalink",
57
- limit: limit?.toString()
73
+ params: {
74
+ fields: fields ? fields.join(",") : "like_count,comments_count,permalink",
75
+ limit
76
+ }
58
77
  });
59
78
  };
60
79
  var getInstagramConversations = async (token, limit = 25, cursor) => {
61
80
  const result = await getInstagramData(token, "me/conversations", {
62
- platform: "instagram",
63
- fields: "participants,messages,updated_time",
64
- limit: limit.toString(),
65
- ...cursor ? { after: cursor } : {}
81
+ params: {
82
+ platform: "instagram",
83
+ fields: "participants,messages,updated_time",
84
+ limit,
85
+ after: cursor
86
+ }
66
87
  });
67
88
  return {
68
89
  data: result?.data.map((item) => ({
@@ -78,8 +99,10 @@ var getInstagramConversationsByUser = (token, userID) => {
78
99
  token,
79
100
  "me/conversations",
80
101
  {
81
- fields: "participants,messages,updated_time",
82
- user_id: userID
102
+ params: {
103
+ fields: "participants,messages,updated_time",
104
+ user_id: userID
105
+ }
83
106
  }
84
107
  );
85
108
  };
@@ -88,9 +111,11 @@ var getInstagramConversationByUser = async (token, userID) => {
88
111
  return res?.data?.find((item) => item.participants?.data.length === 2);
89
112
  };
90
113
  var getInstagramConversation = async (token, id, cursor) => {
91
- const result = await getInstagramData(token, id + "", {
92
- fields: "participants,messages,updated_time",
93
- ...cursor ? { after: cursor } : {}
114
+ const result = await getInstagramData(token, id, {
115
+ params: {
116
+ fields: "participants,messages,updated_time",
117
+ after: cursor
118
+ }
94
119
  });
95
120
  return {
96
121
  messages: result?.messages?.data,
@@ -104,11 +129,37 @@ var getInstagramConversation = async (token, id, cursor) => {
104
129
  };
105
130
  var getInstagramMessage = (token, id, fields) => {
106
131
  return getInstagramData(token, id, {
107
- fields: fields ? fields.join(",") : "id,created_time,from,to,message"
132
+ params: {
133
+ fields: fields ? fields.join(",") : "id,created_time,from,to,message"
134
+ }
108
135
  });
109
136
  };
137
+ var getInstagramContainerStatus = async (token, id) => {
138
+ const result = await getInstagramData(token, id, { params: { fields: "status_code,status" } });
139
+ if (!result?.status_code) return null;
140
+ return {
141
+ status: result.status_code,
142
+ error: result.status_code === "ERROR" ? result.status : void 0
143
+ };
144
+ };
145
+ var canPublishToInstagram = async (token) => {
146
+ const result = await getInstagramData(
147
+ token,
148
+ "me/content_publishing_limit",
149
+ { params: { fields: "quota_usage" } }
150
+ );
151
+ if (!Array.isArray(result?.data)) {
152
+ console.error(
153
+ `[naystack] Instagram token cannot publish${result?.error ? `: ${result.error.message}` : ""}`
154
+ );
155
+ return false;
156
+ }
157
+ return true;
158
+ };
110
159
  // Annotate the CommonJS export names for ESM import in node:
111
160
  0 && (module.exports = {
161
+ canPublishToInstagram,
162
+ getInstagramContainerStatus,
112
163
  getInstagramConversation,
113
164
  getInstagramConversationByUser,
114
165
  getInstagramConversations,