mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-20 09:14:22 +01:00
add global.event.subscribe() to sdk
This commit is contained in:
10
packages/opencode/src/bus/global.ts
Normal file
10
packages/opencode/src/bus/global.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { EventEmitter } from "events"
|
||||||
|
|
||||||
|
export const GlobalBus = new EventEmitter<{
|
||||||
|
event: [
|
||||||
|
{
|
||||||
|
directory: string
|
||||||
|
payload: any
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}>()
|
||||||
@@ -2,6 +2,7 @@ import z from "zod"
|
|||||||
import type { ZodType } from "zod"
|
import type { ZodType } from "zod"
|
||||||
import { Log } from "../util/log"
|
import { Log } from "../util/log"
|
||||||
import { Instance } from "../project/instance"
|
import { Instance } from "../project/instance"
|
||||||
|
import { GlobalBus } from "./global"
|
||||||
|
|
||||||
export namespace Bus {
|
export namespace Bus {
|
||||||
const log = Log.create({ service: "bus" })
|
const log = Log.create({ service: "bus" })
|
||||||
@@ -65,6 +66,10 @@ export namespace Bus {
|
|||||||
pending.push(sub(payload))
|
pending.push(sub(payload))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
GlobalBus.emit("event", {
|
||||||
|
directory: Instance.directory,
|
||||||
|
payload,
|
||||||
|
})
|
||||||
return Promise.all(pending)
|
return Promise.all(pending)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import type { ContentfulStatusCode } from "hono/utils/http-status"
|
|||||||
import { TuiEvent } from "@/cli/cmd/tui/event"
|
import { TuiEvent } from "@/cli/cmd/tui/event"
|
||||||
import { Snapshot } from "@/snapshot"
|
import { Snapshot } from "@/snapshot"
|
||||||
import { SessionSummary } from "@/session/summary"
|
import { SessionSummary } from "@/session/summary"
|
||||||
|
import { GlobalBus } from "@/bus/global"
|
||||||
|
|
||||||
const ERRORS = {
|
const ERRORS = {
|
||||||
400: {
|
400: {
|
||||||
@@ -117,6 +118,51 @@ export namespace Server {
|
|||||||
timer.stop()
|
timer.stop()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.get(
|
||||||
|
"/global/event",
|
||||||
|
describeRoute({
|
||||||
|
description: "Get events",
|
||||||
|
operationId: "global.event.subscribe",
|
||||||
|
responses: {
|
||||||
|
200: {
|
||||||
|
description: "Event stream",
|
||||||
|
content: {
|
||||||
|
"text/event-stream": {
|
||||||
|
schema: resolver(
|
||||||
|
Bus.payloads().meta({
|
||||||
|
ref: "Event",
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
async (c) => {
|
||||||
|
log.info("global event connected")
|
||||||
|
return streamSSE(c, async (stream) => {
|
||||||
|
stream.writeSSE({
|
||||||
|
data: JSON.stringify({
|
||||||
|
type: "server.connected",
|
||||||
|
properties: {},
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
async function handler(event: any) {
|
||||||
|
await stream.writeSSE({
|
||||||
|
data: JSON.stringify(event),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
GlobalBus.on("event", handler)
|
||||||
|
await new Promise<void>((resolve) => {
|
||||||
|
stream.onAbort(() => {
|
||||||
|
GlobalBus.off("event", handler)
|
||||||
|
resolve()
|
||||||
|
log.info("global event disconnected")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
)
|
||||||
.use(async (c, next) => {
|
.use(async (c, next) => {
|
||||||
const directory = c.req.query("directory") ?? process.cwd()
|
const directory = c.req.query("directory") ?? process.cwd()
|
||||||
return Instance.provide({
|
return Instance.provide({
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
import type { Options as ClientOptions, TDataShape, Client } from "./client/index.js"
|
import type { Options as ClientOptions, TDataShape, Client } from "./client/index.js"
|
||||||
import type {
|
import type {
|
||||||
|
GlobalEventButtData,
|
||||||
|
GlobalEventButtResponses,
|
||||||
ProjectListData,
|
ProjectListData,
|
||||||
ProjectListResponses,
|
ProjectListResponses,
|
||||||
ProjectCurrentData,
|
ProjectCurrentData,
|
||||||
@@ -175,6 +177,32 @@ class _HeyApiClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Event extends _HeyApiClient {
|
||||||
|
/**
|
||||||
|
* Get events
|
||||||
|
*/
|
||||||
|
public butt<ThrowOnError extends boolean = false>(options?: Options<GlobalEventButtData, ThrowOnError>) {
|
||||||
|
return (options?.client ?? this._client).get.sse<GlobalEventButtResponses, unknown, ThrowOnError>({
|
||||||
|
url: "/global/event",
|
||||||
|
...options,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get events
|
||||||
|
*/
|
||||||
|
public subscribe<ThrowOnError extends boolean = false>(options?: Options<EventSubscribeData, ThrowOnError>) {
|
||||||
|
return (options?.client ?? this._client).get.sse<EventSubscribeResponses, unknown, ThrowOnError>({
|
||||||
|
url: "/event",
|
||||||
|
...options,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Global extends _HeyApiClient {
|
||||||
|
event = new Event({ client: this._client })
|
||||||
|
}
|
||||||
|
|
||||||
class Project extends _HeyApiClient {
|
class Project extends _HeyApiClient {
|
||||||
/**
|
/**
|
||||||
* List all projects
|
* List all projects
|
||||||
@@ -828,18 +856,6 @@ class Auth extends _HeyApiClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Event extends _HeyApiClient {
|
|
||||||
/**
|
|
||||||
* Get events
|
|
||||||
*/
|
|
||||||
public subscribe<ThrowOnError extends boolean = false>(options?: Options<EventSubscribeData, ThrowOnError>) {
|
|
||||||
return (options?.client ?? this._client).get.sse<EventSubscribeResponses, unknown, ThrowOnError>({
|
|
||||||
url: "/event",
|
|
||||||
...options,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class OpencodeClient extends _HeyApiClient {
|
export class OpencodeClient extends _HeyApiClient {
|
||||||
/**
|
/**
|
||||||
* Respond to a permission request
|
* Respond to a permission request
|
||||||
@@ -860,6 +876,7 @@ export class OpencodeClient extends _HeyApiClient {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
global = new Global({ client: this._client })
|
||||||
project = new Project({ client: this._client })
|
project = new Project({ client: this._client })
|
||||||
config = new Config({ client: this._client })
|
config = new Config({ client: this._client })
|
||||||
tool = new Tool({ client: this._client })
|
tool = new Tool({ client: this._client })
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user