66 lines · 2.1 KB · TypeScript
RawDownload
/* oxlint-disable executor/no-effect-escape-hatch -- boundary: HttpApi handler adapter maps plugin extension failures into InternalError */import { Context, Effect } from "effect";import { HttpApiBuilder } from "effect/unstable/httpapi"; import { addGroup, capture } from "@executor-js/api";import { InternalError } from "@executor-js/sdk/shared";import type { AppsExtension } from "./apps-plugin";import { AppsGroup } from "./routes"; export class AppsExtensionService extends Context.Service<AppsExtensionService, AppsExtension>()(  "AppsExtensionService",) {} const ExecutorApiWithApps = addGroup(AppsGroup); const captureUnexpected = <A, E, R>(  effect: Effect.Effect<A, E, R>,): Effect.Effect<A, InternalError, R> =>  capture(effect.pipe(Effect.catch((cause: unknown) => Effect.die(cause)))); export const AppsHandlers = HttpApiBuilder.group(ExecutorApiWithApps, "apps", (handlers) =>  handlers    .handle("listSources", () =>      captureUnexpected(        Effect.gen(function* () {          const ext = yield* AppsExtensionService;          const sources = yield* ext.listSources();          return { sources };        }),      ),    )    .handle("createSource", ({ payload }) =>      captureUnexpected(        Effect.gen(function* () {          const ext = yield* AppsExtensionService;          const source = yield* ext.createSource(payload);          return { source };        }),      ),    )    .handle("getSource", ({ params }) =>      captureUnexpected(        Effect.gen(function* () {          const ext = yield* AppsExtensionService;          const source = yield* ext.getSource(params.slug);          return { source };        }),      ),    )    .handle("deleteSource", ({ params }) =>      captureUnexpected(        Effect.gen(function* () {          const ext = yield* AppsExtensionService;          return yield* ext.deleteSource(params.slug);        }),      ),    )    .handle("syncSource", ({ params }) =>      captureUnexpected(        Effect.gen(function* () {          const ext = yield* AppsExtensionService;          return yield* ext.syncSource(params.slug);        }),      ),    ),);