|
|
@@ -1,10 +1,12 @@
|
|
|
import { Hono, type Context } from "hono"
|
|
|
import { describeRoute, resolver, validator } from "hono-openapi"
|
|
|
import { streamSSE } from "hono/streaming"
|
|
|
+import { Effect } from "effect"
|
|
|
import z from "zod"
|
|
|
import { BusEvent } from "@/bus/bus-event"
|
|
|
import { SyncEvent } from "@/sync"
|
|
|
import { GlobalBus } from "@/bus/global"
|
|
|
+import { AppRuntime } from "@/effect/app-runtime"
|
|
|
import { AsyncQueue } from "@/util/queue"
|
|
|
import { Instance } from "../../project/instance"
|
|
|
import { Installation } from "@/installation"
|
|
|
@@ -290,25 +292,41 @@ export const GlobalRoutes = lazy(() =>
|
|
|
}),
|
|
|
),
|
|
|
async (c) => {
|
|
|
- const method = await Installation.method()
|
|
|
- if (method === "unknown") {
|
|
|
- return c.json({ success: false, error: "Unknown installation method" }, 400)
|
|
|
- }
|
|
|
- const target = c.req.valid("json").target || (await Installation.latest(method))
|
|
|
- const result = await Installation.upgrade(method, target)
|
|
|
- .then(() => ({ success: true as const, version: target }))
|
|
|
- .catch((e) => ({ success: false as const, error: e instanceof Error ? e.message : String(e) }))
|
|
|
- if (result.success) {
|
|
|
- GlobalBus.emit("event", {
|
|
|
- directory: "global",
|
|
|
- payload: {
|
|
|
- type: Installation.Event.Updated.type,
|
|
|
- properties: { version: target },
|
|
|
- },
|
|
|
- })
|
|
|
- return c.json(result)
|
|
|
+ const result = await AppRuntime.runPromise(
|
|
|
+ Installation.Service.use((svc) =>
|
|
|
+ Effect.gen(function* () {
|
|
|
+ const method = yield* svc.method()
|
|
|
+ if (method === "unknown") {
|
|
|
+ return { success: false as const, status: 400 as const, error: "Unknown installation method" }
|
|
|
+ }
|
|
|
+
|
|
|
+ const target = c.req.valid("json").target || (yield* svc.latest(method))
|
|
|
+ const result = yield* Effect.catch(
|
|
|
+ svc.upgrade(method, target).pipe(Effect.as({ success: true as const, version: target })),
|
|
|
+ (err) =>
|
|
|
+ Effect.succeed({
|
|
|
+ success: false as const,
|
|
|
+ status: 500 as const,
|
|
|
+ error: err instanceof Error ? err.message : String(err),
|
|
|
+ }),
|
|
|
+ )
|
|
|
+ if (!result.success) return result
|
|
|
+ return { ...result, status: 200 as const }
|
|
|
+ }),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ if (!result.success) {
|
|
|
+ return c.json({ success: false, error: result.error }, result.status)
|
|
|
}
|
|
|
- return c.json(result, 500)
|
|
|
+ const target = result.version
|
|
|
+ GlobalBus.emit("event", {
|
|
|
+ directory: "global",
|
|
|
+ payload: {
|
|
|
+ type: Installation.Event.Updated.type,
|
|
|
+ properties: { version: target },
|
|
|
+ },
|
|
|
+ })
|
|
|
+ return c.json({ success: true, version: target })
|
|
|
},
|
|
|
),
|
|
|
)
|