UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

61 lines (60 loc) 2.93 kB
import { v as requireActivePluginHttpRouteRegistry } from "./runtime-B2ROiq5l.js"; import { n as normalizePluginHttpPath, t as findOverlappingPluginHttpRoute } from "./http-route-overlap-D5FGt6xV.js"; import { AsyncLocalStorage } from "node:async_hooks"; //#region src/plugins/http-registry.ts const pluginHttpRouteRegistryScope = new AsyncLocalStorage(); function withPluginHttpRouteRegistry(registry, run) { return pluginHttpRouteRegistryScope.run(registry, run); } function registerPluginHttpRoute(params) { const registry = params.registry ?? pluginHttpRouteRegistryScope.getStore() ?? requireActivePluginHttpRouteRegistry(); 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 routeMatch = params.match ?? "exact"; const overlappingRoute = findOverlappingPluginHttpRoute(routes, { path: normalizedPath, match: routeMatch }); if (overlappingRoute && overlappingRoute.auth !== params.auth) { params.log?.(`plugin: route overlap denied at ${normalizedPath} (${routeMatch}, ${params.auth})${suffix}; overlaps ${overlappingRoute.path} (${overlappingRoute.match}, ${overlappingRoute.auth}) owned by ${overlappingRoute.pluginId ?? "unknown-plugin"} (${overlappingRoute.source ?? "unknown-source"})`); return () => {}; } const existingIndex = routes.findIndex((entry) => entry.path === normalizedPath && entry.match === routeMatch); if (existingIndex >= 0) { const existing = routes[existingIndex]; if (!existing) return () => {}; if (!params.replaceExisting) { params.log?.(`plugin: route conflict at ${normalizedPath} (${routeMatch})${suffix}; owned by ${existing.pluginId ?? "unknown-plugin"} (${existing.source ?? "unknown-source"})`); return () => {}; } if (existing.pluginId && params.pluginId && existing.pluginId !== params.pluginId) { params.log?.(`plugin: route replacement denied for ${normalizedPath} (${routeMatch})${suffix}; owned by ${existing.pluginId}`); return () => {}; } const pluginHint = params.pluginId ? ` (${params.pluginId})` : ""; params.log?.(`plugin: replacing stale webhook path ${normalizedPath} (${routeMatch})${suffix}${pluginHint}`); routes.splice(existingIndex, 1); } const entry = { path: normalizedPath, handler: params.handler, auth: params.auth, match: routeMatch, ...params.gatewayRuntimeScopeSurface ? { gatewayRuntimeScopeSurface: params.gatewayRuntimeScopeSurface } : {}, pluginId: params.pluginId, source: params.source }; routes.push(entry); return () => { const index = routes.indexOf(entry); if (index >= 0) routes.splice(index, 1); }; } //#endregion export { withPluginHttpRouteRegistry as n, registerPluginHttpRoute as t };