MCPcopy Index your code
hub / github.com/anomalyco/opencode / client

Function client

packages/opencode/src/util/rpc.ts:19–64  ·  view source on GitHub ↗
(target: {
  postMessage: (data: string) => void | null
  onmessage: ((this: Worker, ev: MessageEvent<any>) => any) | null
})

Source from the content-addressed store, hash-verified

17}
18
19export function client<T extends Definition>(target: {
20 postMessage: (data: string) => void | null
21 onmessage: ((this: Worker, ev: MessageEvent<any>) => any) | null
22}) {
23 const pending = new Map<number, (result: any) => void>()
24 const listeners = new Map<string, Set<(data: any) => void>>()
25 let id = 0
26 target.onmessage = async (evt) => {
27 const parsed = JSON.parse(evt.data)
28 if (parsed.type === "rpc.result") {
29 const resolve = pending.get(parsed.id)
30 if (resolve) {
31 resolve(parsed.result)
32 pending.delete(parsed.id)
33 }
34 }
35 if (parsed.type === "rpc.event") {
36 const handlers = listeners.get(parsed.event)
37 if (handlers) {
38 for (const handler of handlers) {
39 handler(parsed.data)
40 }
41 }
42 }
43 }
44 return {
45 call<Method extends keyof T>(method: Method, input: Parameters<T[Method]>[0]): Promise<ReturnType<T[Method]>> {
46 const requestId = id++
47 return new Promise((resolve) => {
48 pending.set(requestId, resolve)
49 target.postMessage(JSON.stringify({ type: "rpc.request", method, input, id: requestId }))
50 })
51 },
52 on<Data>(event: string, handler: (data: Data) => void) {
53 let handlers = listeners.get(event)
54 if (!handlers) {
55 handlers = new Set()
56 listeners.set(event, handlers)
57 }
58 handlers.add(handler)
59 return () => {
60 handlers!.delete(handler)
61 }
62 },
63 }
64}
65
66export * as Rpc from "./rpc"

Callers

nothing calls this directly

Calls 4

resolveFunction · 0.70
getMethod · 0.65
handlerFunction · 0.50
deleteMethod · 0.45

Tested by

no test coverage detected