refactor(discord): lazy-load channel send seams

This commit is contained in:
Vincent Koc 2026-04-04 11:50:15 +09:00
parent e249a852ae
commit bf1b1d63bd
1 changed files with 25 additions and 14 deletions

View File

@ -38,7 +38,6 @@ import {
listDiscordDirectoryGroupsFromConfig,
listDiscordDirectoryPeersFromConfig,
} from "./directory-config.js";
import { listDiscordDirectoryGroupsLive, listDiscordDirectoryPeersLive } from "./directory-live.js";
import { shouldSuppressLocalDiscordExecApprovalPrompt } from "./exec-approvals.js";
import {
resolveDiscordGroupRequireMention,
@ -70,7 +69,6 @@ import {
} from "./runtime-api.js";
import { getDiscordRuntime } from "./runtime.js";
import { collectDiscordSecurityAuditFindings } from "./security-audit.js";
import { fetchChannelPermissionsDiscord, sendMessageDiscord, sendPollDiscord } from "./send.js";
import { normalizeExplicitDiscordSessionKey } from "./session-key-normalization.js";
import { discordSetupAdapter } from "./setup-core.js";
import { createDiscordPluginBase, discordConfigAdapter } from "./shared.js";
@ -78,7 +76,7 @@ import { collectDiscordStatusIssues } from "./status-issues.js";
import { parseDiscordTarget } from "./targets.js";
import { DiscordUiContainer } from "./ui.js";
type DiscordSendFn = typeof sendMessageDiscord;
type DiscordSendFn = typeof import("./send.js").sendMessageDiscord;
type DiscordCarbonModule = typeof import("@buape/carbon");
type DiscordTextDisplay = InstanceType<DiscordCarbonModule["TextDisplay"]>;
type DiscordSeparator = InstanceType<DiscordCarbonModule["Separator"]>;
@ -88,6 +86,8 @@ let discordProviderRuntimePromise:
| undefined;
let discordProbeRuntimePromise: Promise<typeof import("./probe.runtime.js")> | undefined;
let discordAuditModulePromise: Promise<typeof import("./audit.js")> | undefined;
let discordSendModulePromise: Promise<typeof import("./send.js")> | undefined;
let discordDirectoryLiveModulePromise: Promise<typeof import("./directory-live.js")> | undefined;
let discordCarbonModuleCache: DiscordCarbonModule | null = null;
const require = createRequire(import.meta.url);
@ -107,6 +107,16 @@ async function loadDiscordAuditModule() {
return await discordAuditModulePromise;
}
async function loadDiscordSendModule() {
discordSendModulePromise ??= import("./send.js");
return await discordSendModulePromise;
}
async function loadDiscordDirectoryLiveModule() {
discordDirectoryLiveModulePromise ??= import("./directory-live.js");
return await discordDirectoryLiveModulePromise;
}
function loadDiscordCarbonModule() {
discordCarbonModuleCache ??= require("@buape/carbon") as DiscordCarbonModule;
return discordCarbonModuleCache;
@ -132,11 +142,11 @@ function resolveOptionalDiscordRuntime() {
}
}
function resolveDiscordSend(deps?: { [channelId: string]: unknown }): DiscordSendFn {
async function resolveDiscordSend(deps?: { [channelId: string]: unknown }): Promise<DiscordSendFn> {
return (
resolveOutboundSendDep<DiscordSendFn>(deps, "discord") ??
resolveOptionalDiscordRuntime()?.channel?.discord?.sendMessageDiscord ??
sendMessageDiscord
(await loadDiscordSendModule()).sendMessageDiscord
);
}
@ -447,10 +457,7 @@ export const discordPlugin: ChannelPlugin<ResolvedDiscordAccount, DiscordProbe>
listPeers: async (params) => listDiscordDirectoryPeersFromConfig(params),
listGroups: async (params) => listDiscordDirectoryGroupsFromConfig(params),
...createRuntimeDirectoryLiveAdapter({
getRuntime: () => ({
listDirectoryGroupsLive: listDiscordDirectoryGroupsLive,
listDirectoryPeersLive: listDiscordDirectoryPeersLive,
}),
getRuntime: loadDiscordDirectoryLiveModule,
listPeersLive: (runtime) => runtime.listDirectoryPeersLive,
listGroupsLive: (runtime) => runtime.listDirectoryGroupsLive,
}),
@ -609,7 +616,9 @@ export const discordPlugin: ChannelPlugin<ResolvedDiscordAccount, DiscordProbe>
};
}
try {
const perms = await fetchChannelPermissionsDiscord(parsedTarget.id, {
const perms = await (
await loadDiscordSendModule()
).fetchChannelPermissionsDiscord(parsedTarget.id, {
token,
accountId: account.accountId ?? undefined,
});
@ -763,7 +772,7 @@ export const discordPlugin: ChannelPlugin<ResolvedDiscordAccount, DiscordProbe>
message: PAIRING_APPROVED_MESSAGE,
normalizeAllowEntry: createPairingPrefixStripper(/^(discord|user):/i),
notify: async ({ id, message }) => {
await sendMessageDiscord(`user:${id}`, message);
await (await loadDiscordSendModule()).sendMessageDiscord(`user:${id}`, message);
},
},
},
@ -796,7 +805,7 @@ export const discordPlugin: ChannelPlugin<ResolvedDiscordAccount, DiscordProbe>
attachedResults: {
channel: "discord",
sendText: async ({ cfg, to, text, accountId, deps, replyToId, silent }) => {
const send = resolveDiscordSend(deps);
const send = await resolveDiscordSend(deps);
return await send(to, text, {
verbose: false,
cfg,
@ -816,7 +825,7 @@ export const discordPlugin: ChannelPlugin<ResolvedDiscordAccount, DiscordProbe>
replyToId,
silent,
}) => {
const send = resolveDiscordSend(deps);
const send = await resolveDiscordSend(deps);
return await send(to, text, {
verbose: false,
cfg,
@ -828,7 +837,9 @@ export const discordPlugin: ChannelPlugin<ResolvedDiscordAccount, DiscordProbe>
});
},
sendPoll: async ({ cfg, to, poll, accountId, silent }) =>
await sendPollDiscord(to, poll, {
await (
await loadDiscordSendModule()
).sendPollDiscord(to, poll, {
cfg,
accountId: accountId ?? undefined,
silent: silent ?? undefined,