Move all Slack channel implementation files from src/slack/ to extensions/slack/src/ and replace originals with shim re-exports. This follows the extension migration pattern for channel plugins. - Copy all .ts files to extensions/slack/src/ (preserving directory structure: monitor/, http/, monitor/events/, monitor/message-handler/) - Transform import paths: external src/ imports use relative paths back to src/, internal slack imports stay relative within extension - Replace all src/slack/ files with shim re-exports pointing to the extension copies - Update tsconfig.plugin-sdk.dts.json rootDir from "src" to "." so the DTS build can follow shim chains into extensions/ - Update write-plugin-sdk-entry-dts.ts re-export path accordingly - Preserve extensions/slack/index.ts, package.json, openclaw.plugin.json, src/channel.ts, src/runtime.ts, src/channel.test.ts (untouched)
50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
|
|
export type SlackHttpRequestHandler = (
|
|
req: IncomingMessage,
|
|
res: ServerResponse,
|
|
) => Promise<void> | void;
|
|
|
|
type RegisterSlackHttpHandlerArgs = {
|
|
path?: string | null;
|
|
handler: SlackHttpRequestHandler;
|
|
log?: (message: string) => void;
|
|
accountId?: string;
|
|
};
|
|
|
|
const slackHttpRoutes = new Map<string, SlackHttpRequestHandler>();
|
|
|
|
export function normalizeSlackWebhookPath(path?: string | null): string {
|
|
const trimmed = path?.trim();
|
|
if (!trimmed) {
|
|
return "/slack/events";
|
|
}
|
|
return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
}
|
|
|
|
export function registerSlackHttpHandler(params: RegisterSlackHttpHandlerArgs): () => void {
|
|
const normalizedPath = normalizeSlackWebhookPath(params.path);
|
|
if (slackHttpRoutes.has(normalizedPath)) {
|
|
const suffix = params.accountId ? ` for account "${params.accountId}"` : "";
|
|
params.log?.(`slack: webhook path ${normalizedPath} already registered${suffix}`);
|
|
return () => {};
|
|
}
|
|
slackHttpRoutes.set(normalizedPath, params.handler);
|
|
return () => {
|
|
slackHttpRoutes.delete(normalizedPath);
|
|
};
|
|
}
|
|
|
|
export async function handleSlackHttpRequest(
|
|
req: IncomingMessage,
|
|
res: ServerResponse,
|
|
): Promise<boolean> {
|
|
const url = new URL(req.url ?? "/", "http://localhost");
|
|
const handler = slackHttpRoutes.get(url.pathname);
|
|
if (!handler) {
|
|
return false;
|
|
}
|
|
await handler(req, res);
|
|
return true;
|
|
}
|