every-plugin
Version:
59 lines (57 loc) • 1.94 kB
JavaScript
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