UNPKG

twoot

Version:

toot and/or skeet. a lowest-common-denominator api for simplifying crossposting to mastodon and bsky

82 lines 3.42 kB
import { doToots, doToot } from "./toot.js"; import { doSkeets, doSkeet } from "./skeet.js"; import { formatRejection, formatMastoStatus, formatBskyStatus, } from "./util.js"; /** * @param statusOrStatuses A single status, or an array of statuses which will * be posted as a reply chain. * @param apiConfigOrConfigs The Mastodon and/or Bsky configuration(s). * Determines which accounts will be posted to. * @param globalConfig Global configuration for the Twoot call. * @returns */ export async function twoot(statusOrStatuses, apiConfigOrConfigs, globalConfig = {}) { const [isSingleAPIConfig, apiConfigs] = Array.isArray(apiConfigOrConfigs) ? [false, apiConfigOrConfigs] : [true, [apiConfigOrConfigs]]; let results; if (Array.isArray(statusOrStatuses)) { /* eslint-disable @typescript-eslint/only-throw-error */ const settledResults = await Promise.allSettled(apiConfigs.map((config) => config.type === "mastodon" ? doToots(statusOrStatuses, config).catch((e) => { throw [e, config]; }) : doSkeets(statusOrStatuses, config).catch((e) => { throw [e, config]; }))); /* eslint-enable @typescript-eslint/only-throw-error */ results = settledResults.map((r) => { if (r.status === "rejected") { return { type: "error", message: formatRejection(r) }; } if ("visibility" in r.value[0]) { const ss = r.value; return { type: "mastodon-chain", message: ss.map(formatMastoStatus).join("\n====\n"), statuses: ss, }; } const ss = r.value; return { type: "bsky-chain", message: ss.map(formatBskyStatus).join("\n====\n"), statuses: ss, }; }); } else { /* eslint-disable @typescript-eslint/only-throw-error */ const settledResults = await Promise.allSettled(apiConfigs.map((config) => config.type === "mastodon" ? doToot(statusOrStatuses, config).catch((e) => { throw [e, config]; }) : doSkeet(statusOrStatuses, config).catch((e) => { throw [e, config]; }))); /* eslint-enable @typescript-eslint/only-throw-error */ results = settledResults.map((r) => { if (r.status === "rejected") { return { type: "error", message: formatRejection(r) }; } if ("visibility" in r.value) { return { type: "mastodon", message: formatMastoStatus(r.value), status: r.value, }; } return { type: "bsky", message: formatBskyStatus(r.value), status: r.value, }; }); } const rejections = results.filter((r) => r.type === "error"); if (rejections.length === results.length || (rejections.length > 0 && globalConfig.rejectOnAnyFailure)) { throw new Error(`Failed to twoot:\n${JSON.stringify(results, undefined, 2)}`); } return isSingleAPIConfig ? results[0] : results; } //# sourceMappingURL=index.js.map