@exileum/meta-mcp 6.0.0 → 8.0.0
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/README.md +44 -18
- package/dist/constants/fields.d.ts +6 -0
- package/dist/constants/fields.d.ts.map +1 -0
- package/dist/constants/fields.js +25 -0
- package/dist/constants/fields.js.map +1 -0
- package/dist/http-transport.d.ts +20 -0
- package/dist/http-transport.d.ts.map +1 -0
- package/dist/http-transport.js +228 -0
- package/dist/http-transport.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +77 -82
- package/dist/index.js.map +1 -1
- package/dist/prompts/index.d.ts +56 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +264 -41
- package/dist/prompts/index.js.map +1 -1
- package/dist/register-all.d.ts +4 -0
- package/dist/register-all.d.ts.map +1 -0
- package/dist/register-all.js +41 -0
- package/dist/register-all.js.map +1 -0
- package/dist/resources/instagram.d.ts.map +1 -1
- package/dist/resources/instagram.js +13 -4
- package/dist/resources/instagram.js.map +1 -1
- package/dist/resources/threads.d.ts.map +1 -1
- package/dist/resources/threads.js +13 -4
- package/dist/resources/threads.js.map +1 -1
- package/dist/services/meta-client.d.ts +76 -3
- package/dist/services/meta-client.d.ts.map +1 -1
- package/dist/services/meta-client.js +330 -46
- package/dist/services/meta-client.js.map +1 -1
- package/dist/shutdown.d.ts +18 -0
- package/dist/shutdown.d.ts.map +1 -0
- package/dist/shutdown.js +60 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/tools/annotations.d.ts +6 -0
- package/dist/tools/annotations.d.ts.map +1 -0
- package/dist/tools/annotations.js +27 -0
- package/dist/tools/annotations.js.map +1 -0
- package/dist/tools/instagram/comments.d.ts.map +1 -1
- package/dist/tools/instagram/comments.js +75 -50
- package/dist/tools/instagram/comments.js.map +1 -1
- package/dist/tools/instagram/hashtags.d.ts +1 -0
- package/dist/tools/instagram/hashtags.d.ts.map +1 -1
- package/dist/tools/instagram/hashtags.js +54 -36
- package/dist/tools/instagram/hashtags.js.map +1 -1
- package/dist/tools/instagram/media.d.ts.map +1 -1
- package/dist/tools/instagram/media.js +53 -34
- package/dist/tools/instagram/media.js.map +1 -1
- package/dist/tools/instagram/mentions.d.ts.map +1 -1
- package/dist/tools/instagram/mentions.js +22 -17
- package/dist/tools/instagram/mentions.js.map +1 -1
- package/dist/tools/instagram/messaging.d.ts.map +1 -1
- package/dist/tools/instagram/messaging.js +74 -50
- package/dist/tools/instagram/messaging.js.map +1 -1
- package/dist/tools/instagram/profile.d.ts +2 -0
- package/dist/tools/instagram/profile.d.ts.map +1 -1
- package/dist/tools/instagram/profile.js +63 -43
- package/dist/tools/instagram/profile.js.map +1 -1
- package/dist/tools/instagram/publishing.d.ts.map +1 -1
- package/dist/tools/instagram/publishing.js +202 -139
- package/dist/tools/instagram/publishing.js.map +1 -1
- package/dist/tools/meta/auth.d.ts.map +1 -1
- package/dist/tools/meta/auth.js +63 -21
- package/dist/tools/meta/auth.js.map +1 -1
- package/dist/tools/threads/insights.d.ts.map +1 -1
- package/dist/tools/threads/insights.js +22 -15
- package/dist/tools/threads/insights.js.map +1 -1
- package/dist/tools/threads/media.d.ts.map +1 -1
- package/dist/tools/threads/media.js +42 -70
- package/dist/tools/threads/media.js.map +1 -1
- package/dist/tools/threads/mentions.d.ts.map +1 -1
- package/dist/tools/threads/mentions.js +15 -16
- package/dist/tools/threads/mentions.js.map +1 -1
- package/dist/tools/threads/profile.d.ts +2 -0
- package/dist/tools/threads/profile.d.ts.map +1 -1
- package/dist/tools/threads/profile.js +18 -3
- package/dist/tools/threads/profile.js.map +1 -1
- package/dist/tools/threads/publishing.d.ts.map +1 -1
- package/dist/tools/threads/publishing.js +260 -157
- package/dist/tools/threads/publishing.js.map +1 -1
- package/dist/tools/threads/replies.d.ts.map +1 -1
- package/dist/tools/threads/replies.js +55 -45
- package/dist/tools/threads/replies.js.map +1 -1
- package/dist/utils/container.d.ts +16 -4
- package/dist/utils/container.d.ts.map +1 -1
- package/dist/utils/container.js +36 -6
- package/dist/utils/container.js.map +1 -1
- package/dist/utils/errors.d.ts +23 -3
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +32 -2
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.d.ts +28 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +32 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/params.d.ts +3 -0
- package/dist/utils/params.d.ts.map +1 -0
- package/dist/utils/params.js +14 -0
- package/dist/utils/params.js.map +1 -0
- package/dist/utils/progress.d.ts +42 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +35 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/response.d.ts +11 -0
- package/dist/utils/response.d.ts.map +1 -0
- package/dist/utils/response.js +6 -0
- package/dist/utils/response.js.map +1 -0
- package/package.json +5 -4
|
@@ -1,19 +1,77 @@
|
|
|
1
1
|
import { MetaConfig } from "../config.js";
|
|
2
|
+
import { Logger } from "../utils/logger.js";
|
|
2
3
|
export declare const DEFAULT_META_API_VERSION = "v25.0";
|
|
3
4
|
export declare const DEFAULT_THREADS_API_VERSION = "v1.0";
|
|
5
|
+
export declare const DEFAULT_MAX_RETRIES = 3;
|
|
6
|
+
export declare const DEFAULT_RETRY_BASE_DELAY_MS = 1000;
|
|
7
|
+
export declare const MAX_RETRY_DELAY_MS = 60000;
|
|
8
|
+
export declare const REQUEST_TIMEOUT_MS = 30000;
|
|
9
|
+
/**
|
|
10
|
+
* Parse a `Retry-After` response header value (RFC 7231 §7.1.3) into
|
|
11
|
+
* milliseconds. Returns `undefined` for missing or unparseable values so the
|
|
12
|
+
* caller falls back to the exponential-backoff schedule. Past dates and
|
|
13
|
+
* negative seconds clamp to `0` to absorb server time skew.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseRetryAfter(value: string | null, nowMs: number): number | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Exponential backoff `base * 2^attempt` with 0–25% jitter to spread
|
|
18
|
+
* concurrent clients and avoid thundering-herd reconnects. Capped at
|
|
19
|
+
* {@link MAX_RETRY_DELAY_MS}. `rand` is injectable for deterministic tests.
|
|
20
|
+
*/
|
|
21
|
+
export declare function computeBackoffDelay(attempt: number, baseDelayMs: number, rand?: () => number): number;
|
|
4
22
|
export interface MetaClientOptions {
|
|
5
23
|
metaApiVersion?: string;
|
|
6
24
|
threadsApiVersion?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Maximum number of retry attempts after the initial request fails with a
|
|
27
|
+
* transient error (HTTP 429/500/502/503/504 or a thrown network error).
|
|
28
|
+
* Total request count is `maxRetries + 1`. Set to `0` to disable retries
|
|
29
|
+
* entirely (matches pre-#61 behavior). Defaults to {@link DEFAULT_MAX_RETRIES}.
|
|
30
|
+
*/
|
|
31
|
+
maxRetries?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Base delay (ms) used by the exponential-backoff schedule between retries.
|
|
34
|
+
* Attempt N waits `baseDelayMs * 2^N` plus 0–25% jitter (capped at
|
|
35
|
+
* {@link MAX_RETRY_DELAY_MS}). Defaults to {@link DEFAULT_RETRY_BASE_DELAY_MS}.
|
|
36
|
+
* Tests pass `0` to make retries fire immediately without real waiting.
|
|
37
|
+
*/
|
|
38
|
+
retryBaseDelayMs?: number;
|
|
39
|
+
/**
|
|
40
|
+
* @internal — testing-only seam, not part of the stable API. Injection point
|
|
41
|
+
* for the sleep primitive used between retries. Defaults to a
|
|
42
|
+
* `setTimeout`-backed `Promise`.
|
|
43
|
+
*/
|
|
44
|
+
sleep?: (ms: number) => Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* @internal — testing-only seam, not part of the stable API. Injection point
|
|
47
|
+
* for the current-time source used when parsing the HTTP-date form of the
|
|
48
|
+
* `Retry-After` header. Defaults to `Date.now`.
|
|
49
|
+
*/
|
|
50
|
+
now?: () => number;
|
|
51
|
+
/**
|
|
52
|
+
* Structured-logging sink. Defaults to {@link NOOP_LOGGER}; `index.ts` injects
|
|
53
|
+
* a `createMcpLogger(server)` so request/error/rate-limit/audit events reach
|
|
54
|
+
* the MCP `notifications/message` channel (#62).
|
|
55
|
+
*/
|
|
56
|
+
logger?: Logger;
|
|
7
57
|
}
|
|
8
58
|
export interface RateLimit {
|
|
9
59
|
callCount?: number;
|
|
10
60
|
totalCpuTime?: number;
|
|
11
61
|
totalTime?: number;
|
|
12
62
|
}
|
|
63
|
+
export declare const RATE_LIMIT_SLOWDOWN_THRESHOLD = 80;
|
|
64
|
+
export declare const RATE_LIMIT_BACKOFF_THRESHOLD = 90;
|
|
65
|
+
export declare const RATE_LIMIT_SLOWDOWN_MS = 1000;
|
|
66
|
+
export declare const RATE_LIMIT_BACKOFF_MS = 5000;
|
|
67
|
+
export declare const RATE_LIMIT_SNAPSHOT_TTL_MS: number;
|
|
68
|
+
export declare const PROFILE_CACHE_TTL_MS: number;
|
|
69
|
+
export declare const HASHTAG_CACHE_TTL_MS: number;
|
|
13
70
|
export interface ClientResponse {
|
|
14
71
|
data: Record<string, unknown>;
|
|
15
72
|
rateLimit?: RateLimit;
|
|
16
73
|
}
|
|
74
|
+
export type HttpMethod = "GET" | "POST" | "DELETE";
|
|
17
75
|
/**
|
|
18
76
|
* Allowed value types for form-encoded query string and request body parameters.
|
|
19
77
|
* Non-primitive values (arrays, objects) must be serialized by the caller (JSON.stringify, .join(",") etc.)
|
|
@@ -54,13 +112,24 @@ export declare class MetaClient {
|
|
|
54
112
|
private igBase;
|
|
55
113
|
private fbBase;
|
|
56
114
|
private threadsBase;
|
|
115
|
+
private lastRateLimit?;
|
|
116
|
+
private lastRateLimitAt?;
|
|
117
|
+
private cache;
|
|
118
|
+
private maxRetries;
|
|
119
|
+
private retryBaseDelayMs;
|
|
120
|
+
private sleep;
|
|
121
|
+
private now;
|
|
122
|
+
private logger;
|
|
57
123
|
constructor(config: MetaConfig, options?: MetaClientOptions);
|
|
58
124
|
private parseRateLimit;
|
|
125
|
+
private maybeThrottle;
|
|
59
126
|
private appendFormParams;
|
|
60
127
|
private request;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
128
|
+
private auditMutation;
|
|
129
|
+
private requestRaw;
|
|
130
|
+
ig(method: HttpMethod, path: string, params?: FormParams, options?: RequestOptions): Promise<ClientResponse>;
|
|
131
|
+
threads(method: HttpMethod, path: string, params?: FormParams, options?: RequestOptions): Promise<ClientResponse>;
|
|
132
|
+
meta(method: HttpMethod, path: string, params?: FormParams, options?: RequestOptions): Promise<ClientResponse>;
|
|
64
133
|
/** Exchange short-lived Instagram token for long-lived token (60 days) */
|
|
65
134
|
igExchangeToken(shortToken: string): Promise<ClientResponse>;
|
|
66
135
|
/** Refresh a long-lived Instagram token (must be at least 24h old and not expired) */
|
|
@@ -73,5 +142,9 @@ export declare class MetaClient {
|
|
|
73
142
|
debugToken(inputToken: string): Promise<ClientResponse>;
|
|
74
143
|
get igUserId(): string;
|
|
75
144
|
get threadsUserId(): string;
|
|
145
|
+
updateConfig(partial: Partial<MetaConfig>): void;
|
|
146
|
+
getCached<T>(key: string): T | undefined;
|
|
147
|
+
setCache(key: string, data: unknown, ttlMs: number): void;
|
|
148
|
+
invalidateCache(prefix?: string): void;
|
|
76
149
|
}
|
|
77
150
|
//# sourceMappingURL=meta-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta-client.d.ts","sourceRoot":"","sources":["../../src/services/meta-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"meta-client.d.ts","sourceRoot":"","sources":["../../src/services/meta-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { MetaApiError } from "../utils/errors.js";
|
|
1
|
+
import { MetaApiError, MetaNetworkError, sanitizeRaw } from "../utils/errors.js";
|
|
2
|
+
import { NOOP_LOGGER } from "../utils/logger.js";
|
|
2
3
|
// Default Meta Graph API and Threads API versions — last verified 2026-05-06.
|
|
3
4
|
// The Graph API ships a new minor version every ~4 months and supports each
|
|
4
5
|
// for ~2 years; Threads runs a separate single-major-version track (v1.0 since
|
|
@@ -16,6 +17,53 @@ const API_VERSION_PATTERN = /^v\d+\.\d+$/;
|
|
|
16
17
|
// surface has no version segment; piping META_API_VERSION here would 404).
|
|
17
18
|
const IG_TOKEN_BASE = "https://graph.instagram.com";
|
|
18
19
|
const THREADS_TOKEN_BASE = "https://graph.threads.net";
|
|
20
|
+
// Retry policy for transient Meta API failures (#61). 429 is the explicit
|
|
21
|
+
// rate-limit signal; 502/503/504 are canonical gateway/availability errors;
|
|
22
|
+
// 500 is included because Meta's infrastructure routinely returns transient
|
|
23
|
+
// 500s during brief overloads alongside the more canonical 5xx codes. Every
|
|
24
|
+
// other 4xx is a permanent caller-side error (auth, validation) and fails fast.
|
|
25
|
+
const RETRYABLE_HTTP_STATUSES = new Set([429, 500, 502, 503, 504]);
|
|
26
|
+
export const DEFAULT_MAX_RETRIES = 3;
|
|
27
|
+
export const DEFAULT_RETRY_BASE_DELAY_MS = 1000;
|
|
28
|
+
// Cap so a malformed `Retry-After: 999999` (≈11 days) can't hang a tool.
|
|
29
|
+
export const MAX_RETRY_DELAY_MS = 60_000;
|
|
30
|
+
export const REQUEST_TIMEOUT_MS = 30_000;
|
|
31
|
+
/**
|
|
32
|
+
* Parse a `Retry-After` response header value (RFC 7231 §7.1.3) into
|
|
33
|
+
* milliseconds. Returns `undefined` for missing or unparseable values so the
|
|
34
|
+
* caller falls back to the exponential-backoff schedule. Past dates and
|
|
35
|
+
* negative seconds clamp to `0` to absorb server time skew.
|
|
36
|
+
*/
|
|
37
|
+
export function parseRetryAfter(value, nowMs) {
|
|
38
|
+
if (value === null)
|
|
39
|
+
return undefined;
|
|
40
|
+
const trimmed = value.trim();
|
|
41
|
+
if (trimmed === "")
|
|
42
|
+
return undefined;
|
|
43
|
+
if (/^-?\d+(\.\d+)?$/.test(trimmed)) {
|
|
44
|
+
const seconds = Number(trimmed);
|
|
45
|
+
if (Number.isFinite(seconds))
|
|
46
|
+
return Math.max(0, seconds * 1000);
|
|
47
|
+
}
|
|
48
|
+
const dateMs = Date.parse(trimmed);
|
|
49
|
+
if (!Number.isNaN(dateMs)) {
|
|
50
|
+
return Math.max(0, dateMs - nowMs);
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Exponential backoff `base * 2^attempt` with 0–25% jitter to spread
|
|
56
|
+
* concurrent clients and avoid thundering-herd reconnects. Capped at
|
|
57
|
+
* {@link MAX_RETRY_DELAY_MS}. `rand` is injectable for deterministic tests.
|
|
58
|
+
*/
|
|
59
|
+
export function computeBackoffDelay(attempt, baseDelayMs, rand = Math.random) {
|
|
60
|
+
const exponential = baseDelayMs * Math.pow(2, attempt);
|
|
61
|
+
const jitter = exponential * 0.25 * rand();
|
|
62
|
+
return Math.min(exponential + jitter, MAX_RETRY_DELAY_MS);
|
|
63
|
+
}
|
|
64
|
+
function defaultSleep(ms) {
|
|
65
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
66
|
+
}
|
|
19
67
|
function resolveApiVersion(envName, fallback, explicit) {
|
|
20
68
|
// Explicit MetaClientOptions value, if any, takes precedence over the env
|
|
21
69
|
// var; both go through the same regex check + warn-fallback so a malformed
|
|
@@ -31,6 +79,22 @@ function resolveApiVersion(envName, fallback, explicit) {
|
|
|
31
79
|
}
|
|
32
80
|
return raw;
|
|
33
81
|
}
|
|
82
|
+
// Pre-request throttle thresholds — Meta throttles at 100% usage on any of
|
|
83
|
+
// callCount / totalCpuTime / totalTime per
|
|
84
|
+
// https://developers.facebook.com/docs/graph-api/overview/rate-limiting/,
|
|
85
|
+
// so we back off well before the cliff.
|
|
86
|
+
export const RATE_LIMIT_SLOWDOWN_THRESHOLD = 80;
|
|
87
|
+
export const RATE_LIMIT_BACKOFF_THRESHOLD = 90;
|
|
88
|
+
export const RATE_LIMIT_SLOWDOWN_MS = 1000;
|
|
89
|
+
export const RATE_LIMIT_BACKOFF_MS = 5000;
|
|
90
|
+
// Meta's rate-limit window is rolling 1h — discard the snapshot after that so
|
|
91
|
+
// a long-idle client doesn't pay a spurious backoff on its first post-idle call.
|
|
92
|
+
export const RATE_LIMIT_SNAPSHOT_TTL_MS = 60 * 60 * 1000;
|
|
93
|
+
// Response cache TTLs (#90). Hashtag TTL matches Meta's 30-unique-hashtag /
|
|
94
|
+
// 7-day API quota so a session-long cache stays warm for the full quota window;
|
|
95
|
+
// profile TTL is kept short to bound follower-count staleness.
|
|
96
|
+
export const PROFILE_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
97
|
+
export const HASHTAG_CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
34
98
|
function parseMetaErrorBody(text) {
|
|
35
99
|
if (!text)
|
|
36
100
|
return undefined;
|
|
@@ -51,11 +115,43 @@ function parseMetaErrorBody(text) {
|
|
|
51
115
|
return undefined;
|
|
52
116
|
}
|
|
53
117
|
}
|
|
118
|
+
// Shape the `data` payload for an error-level log. method + path are safe (the
|
|
119
|
+
// access_token lives only in the query string, never the path); the message is
|
|
120
|
+
// passed through sanitizeRaw as a belt-and-suspenders guard against a token
|
|
121
|
+
// leaking from a Meta error body — the MCP logging spec forbids logging secrets.
|
|
122
|
+
function buildErrorLogData(error, method, path) {
|
|
123
|
+
const data = { method, path };
|
|
124
|
+
if (error instanceof MetaApiError) {
|
|
125
|
+
if (error.httpStatus !== undefined)
|
|
126
|
+
data.http_status = error.httpStatus;
|
|
127
|
+
if (error.apiCode !== undefined)
|
|
128
|
+
data.code = error.apiCode;
|
|
129
|
+
if (error.apiSubcode !== undefined)
|
|
130
|
+
data.subcode = error.apiSubcode;
|
|
131
|
+
if (error.apiType)
|
|
132
|
+
data.type = error.apiType;
|
|
133
|
+
if (error.fbtraceId)
|
|
134
|
+
data.fbtrace_id = error.fbtraceId;
|
|
135
|
+
}
|
|
136
|
+
else if (error instanceof MetaNetworkError) {
|
|
137
|
+
data.kind = error.kind;
|
|
138
|
+
}
|
|
139
|
+
data.message = sanitizeRaw(error instanceof Error ? error.message : String(error));
|
|
140
|
+
return data;
|
|
141
|
+
}
|
|
54
142
|
export class MetaClient {
|
|
55
143
|
config;
|
|
56
144
|
igBase;
|
|
57
145
|
fbBase;
|
|
58
146
|
threadsBase;
|
|
147
|
+
lastRateLimit;
|
|
148
|
+
lastRateLimitAt;
|
|
149
|
+
cache = new Map();
|
|
150
|
+
maxRetries;
|
|
151
|
+
retryBaseDelayMs;
|
|
152
|
+
sleep;
|
|
153
|
+
now;
|
|
154
|
+
logger;
|
|
59
155
|
constructor(config, options) {
|
|
60
156
|
this.config = config;
|
|
61
157
|
const metaVersion = resolveApiVersion("META_API_VERSION", DEFAULT_META_API_VERSION, options?.metaApiVersion);
|
|
@@ -63,6 +159,19 @@ export class MetaClient {
|
|
|
63
159
|
this.igBase = `https://graph.instagram.com/${metaVersion}`;
|
|
64
160
|
this.fbBase = `https://graph.facebook.com/${metaVersion}`;
|
|
65
161
|
this.threadsBase = `https://graph.threads.net/${threadsVersion}`;
|
|
162
|
+
// `Math.max(0, Infinity)` is `Infinity` (infinite loop) and `0 <= NaN` is
|
|
163
|
+
// `false` (loop body never runs); reject non-finite values and fall back.
|
|
164
|
+
const rawMaxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
165
|
+
this.maxRetries = Number.isFinite(rawMaxRetries)
|
|
166
|
+
? Math.max(0, rawMaxRetries)
|
|
167
|
+
: DEFAULT_MAX_RETRIES;
|
|
168
|
+
const rawBaseDelay = options?.retryBaseDelayMs ?? DEFAULT_RETRY_BASE_DELAY_MS;
|
|
169
|
+
this.retryBaseDelayMs = Number.isFinite(rawBaseDelay)
|
|
170
|
+
? Math.max(0, rawBaseDelay)
|
|
171
|
+
: DEFAULT_RETRY_BASE_DELAY_MS;
|
|
172
|
+
this.sleep = options?.sleep ?? defaultSleep;
|
|
173
|
+
this.now = options?.now ?? Date.now;
|
|
174
|
+
this.logger = options?.logger ?? NOOP_LOGGER;
|
|
66
175
|
}
|
|
67
176
|
parseRateLimit(headers) {
|
|
68
177
|
const usage = headers.get("x-app-usage");
|
|
@@ -70,16 +179,63 @@ export class MetaClient {
|
|
|
70
179
|
return undefined;
|
|
71
180
|
try {
|
|
72
181
|
const raw = JSON.parse(usage);
|
|
182
|
+
// `Number(undefined)` is NaN, `Number("92")` is 92 — coerce defensively
|
|
183
|
+
// so a future Meta API tweak (numbers shipped as strings) still produces
|
|
184
|
+
// a usable RateLimit instead of silently leaving fields `undefined`.
|
|
185
|
+
const num = (v) => {
|
|
186
|
+
if (v === undefined || v === null)
|
|
187
|
+
return undefined;
|
|
188
|
+
const n = Number(v);
|
|
189
|
+
return Number.isFinite(n) ? n : undefined;
|
|
190
|
+
};
|
|
73
191
|
return {
|
|
74
|
-
callCount: raw.call_count,
|
|
75
|
-
totalCpuTime: raw.total_cpu_time,
|
|
76
|
-
totalTime: raw.total_time,
|
|
192
|
+
callCount: num(raw.call_count),
|
|
193
|
+
totalCpuTime: num(raw.total_cpu_time),
|
|
194
|
+
totalTime: num(raw.total_time),
|
|
77
195
|
};
|
|
78
196
|
}
|
|
79
197
|
catch {
|
|
80
198
|
return undefined;
|
|
81
199
|
}
|
|
82
200
|
}
|
|
201
|
+
// Take `max(callCount, totalCpuTime, totalTime)` because Meta throttles on
|
|
202
|
+
// whichever quota hits 100% first. Concurrent calls at high usage both
|
|
203
|
+
// sleep their full delay and then fire together — acceptable for MCP's
|
|
204
|
+
// typically sequential call pattern, still safer than no throttling.
|
|
205
|
+
async maybeThrottle() {
|
|
206
|
+
const rl = this.lastRateLimit;
|
|
207
|
+
if (!rl)
|
|
208
|
+
return;
|
|
209
|
+
if (this.lastRateLimitAt !== undefined && Date.now() - this.lastRateLimitAt > RATE_LIMIT_SNAPSHOT_TTL_MS) {
|
|
210
|
+
this.lastRateLimit = undefined;
|
|
211
|
+
this.lastRateLimitAt = undefined;
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const max = Math.max(rl.callCount ?? 0, rl.totalCpuTime ?? 0, rl.totalTime ?? 0);
|
|
215
|
+
let delay;
|
|
216
|
+
if (max >= RATE_LIMIT_BACKOFF_THRESHOLD) {
|
|
217
|
+
delay = RATE_LIMIT_BACKOFF_MS;
|
|
218
|
+
}
|
|
219
|
+
else if (max >= RATE_LIMIT_SLOWDOWN_THRESHOLD) {
|
|
220
|
+
delay = RATE_LIMIT_SLOWDOWN_MS;
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const warning = {
|
|
226
|
+
message: `x-app-usage at ${max}%; delaying next request by ${delay}ms to stay under Meta's per-app quota`,
|
|
227
|
+
usage_pct: max,
|
|
228
|
+
delay_ms: delay,
|
|
229
|
+
};
|
|
230
|
+
if (rl.callCount !== undefined)
|
|
231
|
+
warning.call_count = rl.callCount;
|
|
232
|
+
if (rl.totalTime !== undefined)
|
|
233
|
+
warning.total_time = rl.totalTime;
|
|
234
|
+
if (rl.totalCpuTime !== undefined)
|
|
235
|
+
warning.total_cpu_time = rl.totalCpuTime;
|
|
236
|
+
this.logger.warning(warning);
|
|
237
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
238
|
+
}
|
|
83
239
|
// Used for both form bodies (POST/PUT) and query strings (GET/DELETE) — every
|
|
84
240
|
// entry ends up URL-encoded in `qs`. Skipping `""` must precede the typeof
|
|
85
241
|
// check so the type narrowing below stays correct after the filter.
|
|
@@ -96,9 +252,45 @@ export class MetaClient {
|
|
|
96
252
|
qs.set(k, String(v));
|
|
97
253
|
}
|
|
98
254
|
}
|
|
255
|
+
// Logging wrapper around the retry loop (#62): the terminal error is logged
|
|
256
|
+
// once here — transient retries `continue` inside requestRaw and never reach
|
|
257
|
+
// this catch.
|
|
99
258
|
async request(baseUrl, token, method, path, params, options) {
|
|
259
|
+
this.logger.debug({ method, path });
|
|
260
|
+
try {
|
|
261
|
+
const res = await this.requestRaw(baseUrl, token, method, path, params, options);
|
|
262
|
+
this.auditMutation(method, path, params, res.data);
|
|
263
|
+
return res;
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
this.logger.error(buildErrorLogData(err, method, path));
|
|
267
|
+
throw err;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Audit (info) for state-changing ops so they stay visible when a client
|
|
271
|
+
// raises the level above debug. The /threads check is gated on
|
|
272
|
+
// auto_publish_text because that endpoint ALSO creates the unpublished
|
|
273
|
+
// container in two-step flows — auditing the bare path would mislabel
|
|
274
|
+
// container creation as a publish (the two-step publish is caught by
|
|
275
|
+
// /threads_publish instead).
|
|
276
|
+
auditMutation(method, path, params, data) {
|
|
277
|
+
if (method === "DELETE") {
|
|
278
|
+
this.logger.info({ operation: "delete", method, path });
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
const isPublish = path.endsWith("/media_publish") ||
|
|
282
|
+
path.endsWith("/threads_publish") ||
|
|
283
|
+
path.endsWith("/repost") ||
|
|
284
|
+
(path.endsWith("/threads") && params?.auto_publish_text === true);
|
|
285
|
+
if (isPublish) {
|
|
286
|
+
const entry = { operation: "publish", method, path };
|
|
287
|
+
if (typeof data.id === "string")
|
|
288
|
+
entry.id = data.id;
|
|
289
|
+
this.logger.info(entry);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
async requestRaw(baseUrl, token, method, path, params, options) {
|
|
100
293
|
let url = `${baseUrl}${path}`;
|
|
101
|
-
const init = { method, signal: AbortSignal.timeout(30_000) };
|
|
102
294
|
const isWrite = method !== "GET" && method !== "DELETE";
|
|
103
295
|
const useJson = isWrite && options?.jsonBody !== undefined;
|
|
104
296
|
// `params` always lands in the URL query string (form body for POST/PUT,
|
|
@@ -113,61 +305,119 @@ export class MetaClient {
|
|
|
113
305
|
qs.set("access_token", token);
|
|
114
306
|
if (params)
|
|
115
307
|
this.appendFormParams(qs, params);
|
|
308
|
+
// Body/headers are stable strings reusable across retry attempts; only
|
|
309
|
+
// `signal` must be fresh per attempt — sharing an exhausted
|
|
310
|
+
// `AbortSignal.timeout` would silently abort every subsequent retry.
|
|
311
|
+
const baseInit = { method };
|
|
116
312
|
if (useJson) {
|
|
117
313
|
url += (url.includes("?") ? "&" : "?") + qs.toString();
|
|
118
|
-
|
|
119
|
-
|
|
314
|
+
baseInit.headers = { "Content-Type": "application/json" };
|
|
315
|
+
baseInit.body = JSON.stringify(options.jsonBody);
|
|
120
316
|
}
|
|
121
317
|
else if (isWrite) {
|
|
122
|
-
|
|
123
|
-
|
|
318
|
+
baseInit.headers = { "Content-Type": "application/x-www-form-urlencoded" };
|
|
319
|
+
baseInit.body = qs.toString();
|
|
124
320
|
}
|
|
125
321
|
else {
|
|
126
322
|
url += (url.includes("?") ? "&" : "?") + qs.toString();
|
|
127
323
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
const
|
|
155
|
-
|
|
324
|
+
// Retry loop (#61): total request count is `maxRetries + 1`. `attempt` is
|
|
325
|
+
// 0-based — `attempt = 0` is the initial request, `attempt = N` is the Nth
|
|
326
|
+
// retry. `computeBackoffDelay(attempt, …)` therefore produces the correct
|
|
327
|
+
// 1s / 2s / 4s schedule on attempts 0 / 1 / 2 before retries 1 / 2 / 3.
|
|
328
|
+
// The trailing `throw` after the loop is for TS control-flow narrowing.
|
|
329
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
330
|
+
// Pre-request throttle from #60 — runs before every attempt so a retry
|
|
331
|
+
// after a 429 still consults the most recent x-app-usage snapshot.
|
|
332
|
+
await this.maybeThrottle();
|
|
333
|
+
// Arm the 30s abort timer *after* the throttle sleep so a backoff at
|
|
334
|
+
// high x-app-usage doesn't eat into the actual network window (#60 review).
|
|
335
|
+
const init = { ...baseInit, signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS) };
|
|
336
|
+
let res;
|
|
337
|
+
try {
|
|
338
|
+
res = await fetch(url, init);
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
if (attempt < this.maxRetries) {
|
|
342
|
+
await this.sleep(computeBackoffDelay(attempt, this.retryBaseDelayMs));
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
// AbortSignal.timeout per WHATWG throws name="TimeoutError"; "AbortError"
|
|
346
|
+
// is defensive cover for environments using the older spelling, safe
|
|
347
|
+
// today because AbortSignal.timeout is the only abort source in this
|
|
348
|
+
// file — revisit if a caller-controlled AbortController is ever wired
|
|
349
|
+
// in, since user-aborted signals would then be misclassified (#72).
|
|
350
|
+
const isTimeout = err instanceof Error && (err.name === "TimeoutError" || err.name === "AbortError");
|
|
351
|
+
throw new MetaNetworkError({
|
|
352
|
+
kind: isTimeout ? "timeout" : "network",
|
|
353
|
+
endpoint: path,
|
|
354
|
+
method,
|
|
355
|
+
cause: err,
|
|
356
|
+
timeoutMs: REQUEST_TIMEOUT_MS,
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
// Parse rate-limit on every response (a 429 still carries `x-app-usage`);
|
|
360
|
+
// header-less responses (OAuth token endpoints) leave state intact.
|
|
361
|
+
const rateLimit = this.parseRateLimit(res.headers);
|
|
362
|
+
if (rateLimit) {
|
|
363
|
+
this.lastRateLimit = rateLimit;
|
|
364
|
+
this.lastRateLimitAt = Date.now();
|
|
365
|
+
}
|
|
366
|
+
if (!res.ok &&
|
|
367
|
+
RETRYABLE_HTTP_STATUSES.has(res.status) &&
|
|
368
|
+
attempt < this.maxRetries) {
|
|
369
|
+
const retryAfterMs = parseRetryAfter(res.headers.get("retry-after"), this.now());
|
|
370
|
+
const delay = retryAfterMs !== undefined
|
|
371
|
+
? Math.min(retryAfterMs, MAX_RETRY_DELAY_MS)
|
|
372
|
+
: computeBackoffDelay(attempt, this.retryBaseDelayMs);
|
|
373
|
+
// Release the connection — `cancel()` rejects on already-consumed bodies.
|
|
374
|
+
res.body?.cancel().catch(() => { });
|
|
375
|
+
await this.sleep(delay);
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
if (!res.ok) {
|
|
379
|
+
const text = await res.text().catch(() => "");
|
|
380
|
+
const parsed = parseMetaErrorBody(text);
|
|
381
|
+
const detail = parsed?.message ?? text;
|
|
156
382
|
throw new MetaApiError({
|
|
157
|
-
message: `Meta API
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
383
|
+
message: `Meta API ${method} ${path} (${res.status}): ${detail}`,
|
|
384
|
+
httpStatus: res.status,
|
|
385
|
+
apiCode: parsed?.code,
|
|
386
|
+
apiSubcode: parsed?.subcode,
|
|
387
|
+
apiType: parsed?.type,
|
|
388
|
+
fbtraceId: parsed?.fbtraceId,
|
|
162
389
|
endpoint: path,
|
|
163
390
|
method,
|
|
164
|
-
body:
|
|
391
|
+
body: text,
|
|
165
392
|
});
|
|
166
393
|
}
|
|
167
|
-
|
|
394
|
+
const contentType = res.headers.get("content-type") || "";
|
|
395
|
+
if (contentType.includes("application/json")) {
|
|
396
|
+
const data = (await res.json());
|
|
397
|
+
if (data.error) {
|
|
398
|
+
const err = data.error;
|
|
399
|
+
const apiCode = typeof err.code === "number" ? err.code : undefined;
|
|
400
|
+
const apiSubcode = typeof err.error_subcode === "number" ? err.error_subcode : undefined;
|
|
401
|
+
const apiType = typeof err.type === "string" ? err.type : undefined;
|
|
402
|
+
const apiMessage = typeof err.message === "string" ? err.message : String(err.message ?? "");
|
|
403
|
+
const fbtraceId = typeof err.fbtrace_id === "string" ? err.fbtrace_id : undefined;
|
|
404
|
+
throw new MetaApiError({
|
|
405
|
+
message: `Meta API error: ${apiMessage} (code ${apiCode ?? "?"})`,
|
|
406
|
+
apiCode,
|
|
407
|
+
apiSubcode,
|
|
408
|
+
apiType,
|
|
409
|
+
fbtraceId,
|
|
410
|
+
endpoint: path,
|
|
411
|
+
method,
|
|
412
|
+
body: JSON.stringify(err),
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
return { data, rateLimit };
|
|
416
|
+
}
|
|
417
|
+
const text = await res.text();
|
|
418
|
+
return { data: { raw: text, success: true }, rateLimit };
|
|
168
419
|
}
|
|
169
|
-
|
|
170
|
-
return { data: { raw: text, success: true }, rateLimit };
|
|
420
|
+
throw new Error("MetaClient: retry loop exited without resolution (unreachable)");
|
|
171
421
|
}
|
|
172
422
|
async ig(method, path, params, options) {
|
|
173
423
|
if (!this.config.instagramAccessToken) {
|
|
@@ -242,5 +492,39 @@ export class MetaClient {
|
|
|
242
492
|
}
|
|
243
493
|
return this.config.threadsUserId;
|
|
244
494
|
}
|
|
495
|
+
// Request methods re-read `this.config.<field>` per call, so mutating
|
|
496
|
+
// `this.config` is enough for runtime token rotation — no URL or token
|
|
497
|
+
// cache needs invalidation (#65). The response cache (#90), however, holds
|
|
498
|
+
// per-account profile data that no longer applies after the rotation.
|
|
499
|
+
updateConfig(partial) {
|
|
500
|
+
this.config = { ...this.config, ...partial };
|
|
501
|
+
this.invalidateCache();
|
|
502
|
+
}
|
|
503
|
+
// Expired entries are evicted lazily on read; the cache is bounded by use
|
|
504
|
+
// (≤2 profile keys + ≤30 hashtag keys per the 7-day API quota), so no
|
|
505
|
+
// background sweep is needed.
|
|
506
|
+
getCached(key) {
|
|
507
|
+
const entry = this.cache.get(key);
|
|
508
|
+
if (!entry)
|
|
509
|
+
return undefined;
|
|
510
|
+
if (Date.now() >= entry.expiry) {
|
|
511
|
+
this.cache.delete(key);
|
|
512
|
+
return undefined;
|
|
513
|
+
}
|
|
514
|
+
return entry.data;
|
|
515
|
+
}
|
|
516
|
+
setCache(key, data, ttlMs) {
|
|
517
|
+
this.cache.set(key, { data, expiry: Date.now() + ttlMs });
|
|
518
|
+
}
|
|
519
|
+
invalidateCache(prefix) {
|
|
520
|
+
if (prefix === undefined) {
|
|
521
|
+
this.cache.clear();
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
for (const key of this.cache.keys()) {
|
|
525
|
+
if (key.startsWith(prefix))
|
|
526
|
+
this.cache.delete(key);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
245
529
|
}
|
|
246
530
|
//# sourceMappingURL=meta-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta-client.js","sourceRoot":"","sources":["../../src/services/meta-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"meta-client.js","sourceRoot":"","sources":["../../src/services/meta-client.ts"],"names":[],"mappings":"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"}
|