UNPKG

every-plugin

Version:
59 lines (57 loc) 1.94 kB
import { extractFromFiberFailure, formatORPCError } from "./runtime/errors.mjs"; import { ORPCError } from "@orpc/contract"; import { Effect } from "effect"; import { implement, onError } from "@orpc/server"; //#region src/plugin.ts 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 = {}) { return (config.initialize ?? (() => Effect.succeed({})))(pluginConfig, plugins).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; formatORPCError(error); 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 { createPlugin, withPlugins }; //# sourceMappingURL=plugin.mjs.map