UNPKG

every-plugin

Version:
61 lines (59 loc) 2.1 kB
import { extractFromFiberFailure, formatORPCError } from "./runtime/errors.mjs"; import { ORPCError } from "@orpc/contract"; import { Context, Effect } from "effect"; import { implement, onError } from "@orpc/server"; //#region src/plugin.ts var PluginIdTag = class extends Context.Tag("PluginId")() {}; const createPlugin = function createPlugin(config) { const configSchema = { variables: config.variables, secrets: config.secrets, context: config.context }; class CreatedPlugin { /** set during instantiation - registry key */ id; contract = config.contract; configSchema = configSchema; _deps = null; initialize(pluginConfig, plugins = {}, tools) { return (config.initialize ?? (() => Effect.succeed({})))(pluginConfig, plugins, tools).pipe(Effect.tap((deps) => Effect.sync(() => { this._deps = deps; })), Effect.map(() => this._deps), Effect.mapError((error) => error)); } shutdown() { const self = this; return Effect.gen(function* () { if (config.shutdown && self._deps) yield* config.shutdown(self._deps).pipe(Effect.catchAll((error) => Effect.logWarning(`Plugin shutdown hook failed for ${self.id}`, error))); self._deps = null; }); } createRouter(deps) { const base = implement(config.contract).$context(); const errorMiddleware = onError((error) => { const unwrapped = extractFromFiberFailure(error); if (unwrapped !== error && unwrapped instanceof ORPCError) throw unwrapped; const formatted = formatORPCError(error); if (formatted) console.error(formatted); throw error; }); const builder = base.use(errorMiddleware); return config.createRouter(deps, builder); } } const PluginConstructor = CreatedPlugin; PluginConstructor.binding = { contract: config.contract, variables: config.variables, secrets: config.secrets, context: config.context }; return PluginConstructor; }; function withPlugins() { return (config) => createPlugin(config); } createPlugin.withPlugins = withPlugins; //#endregion export { PluginIdTag, createPlugin, withPlugins }; //# sourceMappingURL=plugin.mjs.map