Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
Kit Langton
80fee8691d refactor: unwrap FileWatcher namespace + self-reexport 2026-04-16 19:42:43 -04:00

View file

@ -19,11 +19,10 @@ import { Log } from "../util"
declare const OPENCODE_LIBC: string | undefined declare const OPENCODE_LIBC: string | undefined
export namespace FileWatcher { const log = Log.create({ service: "file.watcher" })
const log = Log.create({ service: "file.watcher" }) const SUBSCRIBE_TIMEOUT_MS = 10_000
const SUBSCRIBE_TIMEOUT_MS = 10_000
export const Event = { export const Event = {
Updated: BusEvent.define( Updated: BusEvent.define(
"file.watcher.updated", "file.watcher.updated",
z.object({ z.object({
@ -31,9 +30,9 @@ export namespace FileWatcher {
event: z.union([z.literal("add"), z.literal("change"), z.literal("unlink")]), event: z.union([z.literal("add"), z.literal("change"), z.literal("unlink")]),
}), }),
), ),
} }
const watcher = lazy((): typeof import("@parcel/watcher") | undefined => { const watcher = lazy((): typeof import("@parcel/watcher") | undefined => {
try { try {
const binding = require( const binding = require(
`@parcel/watcher-${process.platform}-${process.arch}${process.platform === "linux" ? `-${OPENCODE_LIBC || "glibc"}` : ""}`, `@parcel/watcher-${process.platform}-${process.arch}${process.platform === "linux" ? `-${OPENCODE_LIBC || "glibc"}` : ""}`,
@ -43,30 +42,30 @@ export namespace FileWatcher {
log.error("failed to load watcher binding", { error }) log.error("failed to load watcher binding", { error })
return return
} }
}) })
function getBackend() { function getBackend() {
if (process.platform === "win32") return "windows" if (process.platform === "win32") return "windows"
if (process.platform === "darwin") return "fs-events" if (process.platform === "darwin") return "fs-events"
if (process.platform === "linux") return "inotify" if (process.platform === "linux") return "inotify"
} }
function protecteds(dir: string) { function protecteds(dir: string) {
return Protected.paths().filter((item) => { return Protected.paths().filter((item) => {
const rel = path.relative(dir, item) const rel = path.relative(dir, item)
return rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel) return rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel)
}) })
} }
export const hasNativeBinding = () => !!watcher() export const hasNativeBinding = () => !!watcher()
export interface Interface { export interface Interface {
readonly init: () => Effect.Effect<void> readonly init: () => Effect.Effect<void>
} }
export class Service extends Context.Service<Service, Interface>()("@opencode/FileWatcher") {} export class Service extends Context.Service<Service, Interface>()("@opencode/FileWatcher") {}
export const layer = Layer.effect( export const layer = Layer.effect(
Service, Service,
Effect.gen(function* () { Effect.gen(function* () {
const config = yield* Config.Service const config = yield* Config.Service
@ -157,7 +156,8 @@ export namespace FileWatcher {
}), }),
}) })
}), }),
) )
export const defaultLayer = layer.pipe(Layer.provide(Config.defaultLayer), Layer.provide(Git.defaultLayer)) export const defaultLayer = layer.pipe(Layer.provide(Config.defaultLayer), Layer.provide(Git.defaultLayer))
}
export * as FileWatcher from "./watcher"