The Instagram connector existed but was never registered, so Channels showed it as "provider unavailable" and publishing could not resolve it. - Register createInstagramConnector in the connections registry and the publishing registry; add the connector-runtime publishing policy (idempotency "none": media_publish has no key, never replay). - The Facebook app credentials identify the Hub, not a collective: read them only from INSTAGRAM_CLIENT_ID / INSTAGRAM_CLIENT_SECRET. Drop the clientId/clientSecret connect fields and stop copying the app secret into each connection's vault entry. The provider is connectable only when both are set (connectEnabled + connectNote). - Fail the connect when several Instagram accounts are granted instead of silently publishing as the first Page's account. - Fix the connector package's pre-existing lint errors (it now ships in api). - Tests: contract cases for env-only credentials and the multi-account refusal; connections integration case for provider gating and the Facebook dialog redirect. - docs/oauth-connect.md: Instagram setup, callback URI and limits. Not in this change: publishing images needs a public plaintext JPEG URL that Meta downloads, and storage is client-side encrypted, so presigned S3 URLs cannot serve it. Until a short-lived media endpoint exists, publishing to Instagram fails with an explicit error. Token refresh via ig_refresh_token on graph.facebook.com also needs checking against Facebook Login tokens.
20 lines
1.4 KiB
TypeScript
20 lines
1.4 KiB
TypeScript
import { ConnectorRegistry, type CredentialAccessor } from "@tactical-media-broadcast-hub/connector-sdk";
|
|
// eslint-disable-next-line no-restricted-syntax -- Connector composition boundary.
|
|
import { createInstagramConnector } from "@tactical-media-broadcast-hub/connector-instagram";
|
|
// eslint-disable-next-line no-restricted-syntax -- Connector composition boundary.
|
|
import { createMastodonConnector } from "@tactical-media-broadcast-hub/connector-mastodon";
|
|
// eslint-disable-next-line no-restricted-syntax -- Connector composition boundary.
|
|
import { createPeerTubeConnector } from "../../../../packages/connector-peertube/src/index.js";
|
|
// eslint-disable-next-line no-restricted-syntax -- Connector composition boundary.
|
|
import { createTelegramConnector } from "@tactical-media-broadcast-hub/connector-telegram";
|
|
|
|
/** Composition boundary only: services resolve manifests rather than branch on providers. */
|
|
export function connectionRegistry(credentials: CredentialAccessor, fetchImpl: typeof fetch = fetch): ConnectorRegistry {
|
|
const registry = new ConnectorRegistry();
|
|
const options = { credentials, fetchImpl, env: process.env };
|
|
registry.register(createMastodonConnector(options));
|
|
registry.register(createPeerTubeConnector(options));
|
|
registry.register(createTelegramConnector(options));
|
|
registry.register(createInstagramConnector(options));
|
|
return registry;
|
|
}
|