Buckets:
| import { NodeHttpServer } from "@effect/platform-node" | |
| import { Credential } from "@opencode-ai/core/credential" | |
| import { PermissionSaved } from "@opencode-ai/core/permission/saved" | |
| import { Context, Layer, Option } from "effect" | |
| import * as Effect from "effect/Effect" | |
| import { HttpRouter, HttpServer } from "effect/unstable/http" | |
| import { createServer } from "node:http" | |
| import { createRoutes } from "@opencode-ai/server/routes" | |
| import { Commands } from "../commands" | |
| import { Runtime } from "../../framework/runtime" | |
| import { Daemon } from "../../services/daemon" | |
| export default Runtime.handler( | |
| Commands.commands.serve, | |
| Effect.fn("cli.serve")(function* (input) { | |
| return yield* Effect.scoped( | |
| Effect.gen(function* () { | |
| const daemon = yield* Daemon.Service | |
| const address = yield* listen(input.hostname, input.port, yield* daemon.password()) | |
| if (input.register) yield* daemon.register(address) | |
| console.log(`server listening on ${HttpServer.formatAddress(address)}`) | |
| return yield* Effect.never | |
| }), | |
| ) | |
| }), | |
| ) | |
| function listen(hostname: string, port: Option.Option<number>, password: string) { | |
| if (Option.isSome(port)) return bind(hostname, port.value, password) | |
| // Preserve the familiar default when available, but let the OS choose a free | |
| // port when another local server already owns 4096. | |
| return bind(hostname, 4096, password).pipe(Effect.catch(() => bind(hostname, 0, password))) | |
| } | |
| function bind(hostname: string, port: number, password: string) { | |
| return Layer.build( | |
| HttpRouter.serve(createRoutes(password), { disableListenLog: true, disableLogger: true }).pipe( | |
| Layer.provideMerge(NodeHttpServer.layer(() => createServer(), { port, host: hostname })), | |
| Layer.provide(Credential.defaultLayer), | |
| Layer.provide(PermissionSaved.defaultLayer), | |
| ), | |
| ).pipe(Effect.map((context) => Context.get(context, HttpServer.HttpServer).address)) | |
| } | |
Xet Storage Details
- Size:
- 1.94 kB
- Xet hash:
- 170921c3a36b9c6328ba564c621e3101d2332d1989c13befa5ed0ba4fc783add
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.