mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-12 23:40:45 +00:00
54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
import { normalizePluginHttpPath } from "./http-path.js";
|
|
import type { PluginHttpRouteRegistration, PluginRegistry } from "./registry.js";
|
|
import { requireActivePluginRegistry } from "./runtime.js";
|
|
|
|
export type PluginHttpRouteHandler = (
|
|
req: IncomingMessage,
|
|
res: ServerResponse,
|
|
) => Promise<void> | void;
|
|
|
|
export function registerPluginHttpRoute(params: {
|
|
path?: string | null;
|
|
fallbackPath?: string | null;
|
|
handler: PluginHttpRouteHandler;
|
|
pluginId?: string;
|
|
source?: string;
|
|
accountId?: string;
|
|
log?: (message: string) => void;
|
|
registry?: PluginRegistry;
|
|
}): () => void {
|
|
const registry = params.registry ?? requireActivePluginRegistry();
|
|
const routes = registry.httpRoutes ?? [];
|
|
registry.httpRoutes = routes;
|
|
|
|
const normalizedPath = normalizePluginHttpPath(params.path, params.fallbackPath);
|
|
const suffix = params.accountId ? ` for account "${params.accountId}"` : "";
|
|
if (!normalizedPath) {
|
|
params.log?.(`plugin: webhook path missing${suffix}`);
|
|
return () => {};
|
|
}
|
|
|
|
const existingIndex = routes.findIndex((entry) => entry.path === normalizedPath);
|
|
if (existingIndex >= 0) {
|
|
const pluginHint = params.pluginId ? ` (${params.pluginId})` : "";
|
|
params.log?.(`plugin: replacing stale webhook path ${normalizedPath}${suffix}${pluginHint}`);
|
|
routes.splice(existingIndex, 1);
|
|
}
|
|
|
|
const entry: PluginHttpRouteRegistration = {
|
|
path: normalizedPath,
|
|
handler: params.handler,
|
|
pluginId: params.pluginId,
|
|
source: params.source,
|
|
};
|
|
routes.push(entry);
|
|
|
|
return () => {
|
|
const index = routes.indexOf(entry);
|
|
if (index >= 0) {
|
|
routes.splice(index, 1);
|
|
}
|
|
};
|
|
}
|