mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-25 11:44:22 +01:00
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
export namespace Rpc {
|
|
type Definition = {
|
|
[method: string]: (input: any) => any
|
|
}
|
|
|
|
export function listen(rpc: Definition) {
|
|
onmessage = async (evt) => {
|
|
const parsed = JSON.parse(evt.data)
|
|
if (parsed.type === "rpc.request") {
|
|
const result = await rpc[parsed.method](parsed.input)
|
|
postMessage(JSON.stringify({ type: "rpc.result", result, id: parsed.id }))
|
|
}
|
|
}
|
|
}
|
|
|
|
export function client<T extends Definition>(target: {
|
|
postMessage: (data: string) => void | null
|
|
onmessage: ((this: Worker, ev: MessageEvent<any>) => any) | null
|
|
}) {
|
|
const pending = new Map<number, (result: any) => void>()
|
|
let id = 0
|
|
target.onmessage = async (evt) => {
|
|
const parsed = JSON.parse(evt.data)
|
|
if (parsed.type === "rpc.result") {
|
|
const resolve = pending.get(parsed.id)
|
|
if (resolve) {
|
|
resolve(parsed.result)
|
|
pending.delete(parsed.id)
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
call<Method extends keyof T>(
|
|
method: Method,
|
|
input: Parameters<T[Method]>[0],
|
|
): Promise<ReturnType<T[Method]>> {
|
|
const requestId = id++
|
|
return new Promise((resolve) => {
|
|
pending.set(requestId, resolve)
|
|
target.postMessage(JSON.stringify({ type: "rpc.request", method, input, id: requestId }))
|
|
})
|
|
},
|
|
}
|
|
}
|
|
}
|