Loading...
Loading...
This skill should be used when the user asks about "electrobun RPC", "defineElectrobunRPC", "Electroview.defineRPC", "ElectrobunRPCSchema", bun-to-renderer communication, or renderer-to-bun communication. Activates automatically when RPC code is present.
npx skill4agent add dexploarer/plugin-electrobun-dev electrobun-rpcrequestsmessages// src/shared/rpc-schema.ts
import type { ElectrobunRPCSchema, RPCSchema } from "electrobun/view";
// bun: what the BUN process handles (requests from renderer, messages from renderer)
// webview: what the WEBVIEW handles (requests from bun, messages from bun)
export type AppRPC = {
bun: RPCSchema<{
requests: {
getNotes: { args: {}; response: Note[] };
saveNote: { args: { id: string; title: string; content: string }; response: { success: boolean } };
deleteNote: { args: { id: string }; response: void };
};
messages: {
userIdleDetected: {};
};
}>;
webview: RPCSchema<{
requests: {
getSelectedText: { args: {}; response: string };
};
messages: {
menuAction: { action: string; role?: string };
noteUpdatedExternally: { id: string };
};
}>;
} & ElectrobunRPCSchema;import { BrowserView } from "electrobun/bun";
import type { AppRPC } from "../shared/rpc-schema";
const appRPC = BrowserView.defineRPC<AppRPC>({
maxRequestTime: 10000, // ms — set higher for file dialogs, heavy DB ops
handlers: {
requests: {
getNotes: async () => {
return await db.getAllNotes();
},
saveNote: async ({ id, title, content }) => {
await db.saveNote({ id, title, content });
return { success: true };
},
deleteNote: async ({ id }) => {
await db.deleteNote(id);
},
},
messages: {
userIdleDetected: () => {
console.log("User idle, saving state...");
},
},
},
});
// Pass rpc to BrowserView
const view = new BrowserView({ url: "...", rpc: appRPC });
// Send a message to renderer
view.rpc.send.menuAction({ action: "file-new" });
// Make a request to renderer
const selectedText = await view.rpc.request.getSelectedText({});// src/mainview/index.ts
import { Electroview } from "electrobun/view";
import type { AppRPC } from "../shared/rpc-schema";
const rpc = Electroview.defineRPC<AppRPC>({
maxRequestTime: 10000,
handlers: {
requests: {
getSelectedText: () => {
return window.getSelection()?.toString() ?? "";
},
},
messages: {
menuAction: ({ action, role }) => {
handleMenuAction(action ?? role ?? "unknown");
},
noteUpdatedExternally: ({ id }) => {
reloadNote(id);
},
},
},
});
// Make a request to bun
const notes = await rpc.request.getNotes({});
// Send a message to bun
rpc.send.userIdleDetected({});requestsmessagesmaxRequestTimedom-readyview.rpc.request.*maxRequestTimeElectroview.defineRPCrpc.request.*