twoot
Version:
toot and/or skeet. a lowest-common-denominator api for simplifying crossposting to mastodon and bsky
82 lines • 3.42 kB
JavaScript
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