1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

add some more docs, change names to handleRpc and invokeRpc

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2021-05-21 11:31:56 -04:00
parent ccac859b0b
commit fa87d9edbd
3 changed files with 21 additions and 17 deletions

View File

@ -7,12 +7,12 @@ For example, if a user logs into a service that your extension is a facade for a
IPC channels are blocked off per extension. IPC channels are blocked off per extension.
Meaning that each extension can only communicate with itself. Meaning that each extension can only communicate with itself.
## Types of IPC ## Types of Communication
There are two flavours of IPC that are provided: There are two flavours of communication that are provided:
- Event based - Event based (IPC)
- Request based - Request based (RPC)
### Event Based IPC ### Event Based IPC
@ -42,8 +42,8 @@ To register either a handler or a listener, you should do something like the fol
`main.ts`: `main.ts`:
```typescript ```typescript
import { LensMainExtension, Interface, Types, Store } from "@k8slens/extensions"; import { LensMainExtension } from "@k8slens/extensions";
import { registerListeners, IpcMain } from "./helpers/main"; import { IpcMain } from "./helpers/main";
export class ExampleExtensionMain extends LensMainExtension { export class ExampleExtensionMain extends LensMainExtension {
onActivate() { onActivate() {
@ -59,9 +59,9 @@ Lens will automatically clean up that store and all the handlers on deactivation
`helpers/main.ts`: `helpers/main.ts`:
```typescript ```typescript
import { Store } from "@k8slens/extensions"; import { Ipc, Types } from "@k8slens/extensions";
export class IpcMain extends Store.MainIpcStore { export class IpcMain extends Ipc.IpcMain {
constructor(extension: LensMainExtension) { constructor(extension: LensMainExtension) {
super(extension); super(extension);
@ -81,7 +81,7 @@ It should be able to just call `getInstance()` everywhere in your extension as n
`renderer.ts`: `renderer.ts`:
```typescript ```typescript
import { LensRendererExtension, Interface, Types } from "@k8slens/extensions"; import { LensRendererExtension } from "@k8slens/extensions";
import { IpcRenderer } from "./helpers/renderer"; import { IpcRenderer } from "./helpers/renderer";
export class ExampleExtensionRenderer extends LensRendererExtension { export class ExampleExtensionRenderer extends LensRendererExtension {
@ -99,9 +99,9 @@ It is also needed to create an instance to broadcast messages too.
`helpers/renderer.ts`: `helpers/renderer.ts`:
```typescript ```typescript
import { Store } from "@k8slens/extensions"; import { Ipc } from "@k8slens/extensions";
export class IpcMain extends Store.RendererIpcStore {} export class IpcRenderer extends Ipc.IpcRenderer {}
``` ```
It is necessary to create child classes of these `abstract class`'s in your extension before you can use them. It is necessary to create child classes of these `abstract class`'s in your extension before you can use them.
@ -112,10 +112,10 @@ As this example shows: the channel names *must* be the same.
It should also be noted that "listeners" and "handlers" are specific to either `LensRendererExtension` and `LensMainExtension`. It should also be noted that "listeners" and "handlers" are specific to either `LensRendererExtension` and `LensMainExtension`.
There is no behind the scenes transfer of these functions. There is no behind the scenes transfer of these functions.
If you want to register a "handler" you would call `Store.MainIpcStore.handleIpc(...)` instead. If you want to register a "handler" you would call `Ipc.IpcMain.handleRpc(...)` instead.
The cleanup of these handlers is handled by Lens itself. The cleanup of these handlers is handled by Lens itself.
`Store.RendererIpcStore.broadcastIpc(...)` and `Store.MainIpcStore.broadcastIpc(...)` sends an event to all renderer frames and to main. `Ipc.IpcRenderer.broadcastIpc(...)` and `Ipc.IpcMain.broadcastIpc(...)` sends an event to all renderer frames and to main.
Because of this, no matter where you broadcast from, all listeners in `main` and `renderer` will be notified. Because of this, no matter where you broadcast from, all listeners in `main` and `renderer` will be notified.
### Allowed Values ### Allowed Values
@ -128,4 +128,4 @@ This means that more types than what are JSON serializable can be used, but not
Calling IPC is very simple. Calling IPC is very simple.
If you are meaning to do an event based call, merely call `broadcastIpc(<channel>, ...<args>)` from within your extension. If you are meaning to do an event based call, merely call `broadcastIpc(<channel>, ...<args>)` from within your extension.
If you are meaning to do a request based call from `renderer`, you should do `const res = await Store.RendererIpcStore.invokeIpc(<channel>, ...<args>));` instead. If you are meaning to do a request based call from `renderer`, you should do `const res = await Ipc.IpcRenderer.invokeRpc(<channel>, ...<args>));` instead.

View File

@ -52,7 +52,7 @@ export abstract class IpcMain extends IpcRegistrar {
* @param channel The name of the RPC * @param channel The name of the RPC
* @param handler The remote procedure that is called * @param handler The remote procedure that is called
*/ */
handleIpc(channel: string, handler: (event: Electron.IpcMainInvokeEvent, ...args: any[]) => any): void { handleRpc(channel: string, handler: (event: Electron.IpcMainInvokeEvent, ...args: any[]) => any): void {
const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`;
ipcMain.handle(prefixedChannel, handler); ipcMain.handle(prefixedChannel, handler);

View File

@ -32,7 +32,9 @@ export abstract class IpcRenderer extends IpcRegistrar {
} }
/** /**
* Listen for broadcasts within your extension * Listen for broadcasts within your extension.
* If the lifetime of the listener should be tied to the mounted lifetime of
* a component then putting the returned value in a `disposeOnUnmount` call will suffice.
* @param channel The channel to listen for broadcasts on * @param channel The channel to listen for broadcasts on
* @param listener The function that will be called with the arguments of the broadcast * @param listener The function that will be called with the arguments of the broadcast
* @returns An optional disopser, Lens will cleanup even if this is not called * @returns An optional disopser, Lens will cleanup even if this is not called
@ -49,11 +51,13 @@ export abstract class IpcRenderer extends IpcRegistrar {
/** /**
* Request main to execute its function over the `channel` channel. * Request main to execute its function over the `channel` channel.
* This function only interacts with functions registered via `Ipc.IpcMain.handleRpc`
* An error will be thrown if no function has been registered on `main` with this channel ID.
* @param channel The channel to invoke a RPC on * @param channel The channel to invoke a RPC on
* @param args The arguments to pass to the RPC * @param args The arguments to pass to the RPC
* @returns A promise of the resulting value * @returns A promise of the resulting value
*/ */
invokeIpc(channel: string, ...args: any[]): Promise<any> { invokeRpc(channel: string, ...args: any[]): Promise<any> {
const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`;
return ipcRenderer.invoke(prefixedChannel, ...args); return ipcRenderer.invoke(prefixedChannel, ...args);