electron-effect-rpc 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -1
- package/dist/kit.d.ts +5 -3
- package/dist/kit.d.ts.map +1 -1
- package/dist/kit.js +14 -3
- package/dist/preload-bridge.d.ts +34 -0
- package/dist/preload-bridge.d.ts.map +1 -0
- package/dist/preload-bridge.js +83 -0
- package/dist/preload.d.ts +1 -16
- package/dist/preload.d.ts.map +1 -1
- package/dist/preload.js +6 -70
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -108,11 +108,23 @@ void Effect.runPromise(
|
|
|
108
108
|
```ts
|
|
109
109
|
import { ipc } from "./shared-ipc.ts";
|
|
110
110
|
|
|
111
|
-
ipc.preload()
|
|
111
|
+
const { expose } = ipc.preload();
|
|
112
|
+
expose();
|
|
112
113
|
```
|
|
113
114
|
|
|
114
115
|
This exposes one global by default: `window.api`.
|
|
115
116
|
|
|
117
|
+
If your preload runtime is ESM-only and does not expose synchronous `require`,
|
|
118
|
+
pass the imported Electron module explicitly:
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
import * as electron from "electron";
|
|
122
|
+
import { ipc } from "./shared-ipc.ts";
|
|
123
|
+
|
|
124
|
+
const { expose } = ipc.preload({ electronModule: electron });
|
|
125
|
+
expose();
|
|
126
|
+
```
|
|
127
|
+
|
|
116
128
|
### 4) Renderer
|
|
117
129
|
|
|
118
130
|
```ts
|
package/dist/kit.d.ts
CHANGED
|
@@ -34,6 +34,10 @@ type IpcMainOptions<C extends RpcContract<readonly AnyMethod[], readonly AnyEven
|
|
|
34
34
|
readonly events?: EventPublisherDiagnostics;
|
|
35
35
|
};
|
|
36
36
|
};
|
|
37
|
+
type IpcPreloadOptions = {
|
|
38
|
+
readonly global?: string;
|
|
39
|
+
readonly electronModule?: unknown;
|
|
40
|
+
};
|
|
37
41
|
export type IpcMainHandle<C extends RpcContract<readonly AnyMethod[], readonly AnyEvent[], readonly AnyStreamMethod[]>> = {
|
|
38
42
|
readonly endpoint: RpcEndpoint;
|
|
39
43
|
readonly publisher: RpcEventPublisher<C>;
|
|
@@ -57,9 +61,7 @@ export type IpcKit<C extends RpcContract<readonly AnyMethod[], readonly AnyEvent
|
|
|
57
61
|
readonly streamBuffer: StreamBufferOptions;
|
|
58
62
|
};
|
|
59
63
|
readonly main: <R>(options: IpcMainOptions<C, R>) => IpcMainHandle<C>;
|
|
60
|
-
readonly preload: (options?: {
|
|
61
|
-
readonly global?: string;
|
|
62
|
-
}) => {
|
|
64
|
+
readonly preload: (options?: IpcPreloadOptions) => {
|
|
63
65
|
readonly global: string;
|
|
64
66
|
readonly bridge: IpcBridge;
|
|
65
67
|
readonly expose: () => void;
|
package/dist/kit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EACV,QAAQ,EACR,SAAS,EACT,eAAe,EACf,WAAW,EACX,eAAe,EAChB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"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"}
|
package/dist/kit.js
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
2
|
import { createEventPublisher, createRpcEndpoint } from "./main.js";
|
|
3
|
-
import {
|
|
3
|
+
import { createBridgeAdaptersFromBindings, exposeIpcBridgeFromBindings, resolveElectronRendererBindings, } from "./preload-bridge.js";
|
|
4
4
|
import { createEventSubscriber, createRpcClient, createStreamRpcClient } from "./renderer.js";
|
|
5
5
|
import { defaultChannelPrefix, } from "./types.js";
|
|
6
|
+
function loadElectronModule(electronModule) {
|
|
7
|
+
if (electronModule !== undefined) {
|
|
8
|
+
return electronModule;
|
|
9
|
+
}
|
|
10
|
+
if (typeof require === "function") {
|
|
11
|
+
return require("electron");
|
|
12
|
+
}
|
|
13
|
+
throw new Error("ipc.preload() could not load Electron synchronously. " +
|
|
14
|
+
"In ESM preload files, pass it explicitly: ipc.preload({ electronModule: electron }).");
|
|
15
|
+
}
|
|
6
16
|
export function createIpcKit(options) {
|
|
7
17
|
const normalizeStreamBuffer = (buffer) => {
|
|
8
18
|
if (!buffer || buffer.bufferSize === "unbounded") {
|
|
@@ -105,15 +115,16 @@ export function createIpcKit(options) {
|
|
|
105
115
|
};
|
|
106
116
|
};
|
|
107
117
|
const preload = (preloadOptions) => {
|
|
118
|
+
const bindings = resolveElectronRendererBindings(loadElectronModule(preloadOptions?.electronModule));
|
|
108
119
|
const global = preloadOptions?.global ?? bridgeGlobal;
|
|
109
|
-
const bridge =
|
|
120
|
+
const bridge = createBridgeAdaptersFromBindings(bindings, {
|
|
110
121
|
channelPrefix,
|
|
111
122
|
});
|
|
112
123
|
return {
|
|
113
124
|
global,
|
|
114
125
|
bridge,
|
|
115
126
|
expose: () => {
|
|
116
|
-
|
|
127
|
+
exposeIpcBridgeFromBindings(bindings, {
|
|
117
128
|
global,
|
|
118
129
|
channelPrefix,
|
|
119
130
|
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type ChannelPrefix, type EventSubscribe, type RpcInvoke } from "./types.ts";
|
|
2
|
+
export type BridgeAdapters = {
|
|
3
|
+
readonly invoke: RpcInvoke;
|
|
4
|
+
readonly subscribe: EventSubscribe;
|
|
5
|
+
readonly onStreamFrame: (listener: (frame: unknown) => void) => () => void;
|
|
6
|
+
};
|
|
7
|
+
export type BridgeAdaptersOptions = {
|
|
8
|
+
readonly channelPrefix?: ChannelPrefix;
|
|
9
|
+
};
|
|
10
|
+
export type BridgeExposureOptions = BridgeAdaptersOptions & {
|
|
11
|
+
readonly rpcGlobal?: string;
|
|
12
|
+
readonly eventsGlobal?: string;
|
|
13
|
+
};
|
|
14
|
+
export type IpcBridgeExposureOptions = BridgeAdaptersOptions & {
|
|
15
|
+
readonly global?: string;
|
|
16
|
+
};
|
|
17
|
+
type ContextBridgeLike = {
|
|
18
|
+
readonly exposeInMainWorld: (name: string, value: Record<string, unknown>) => void;
|
|
19
|
+
};
|
|
20
|
+
type IpcRendererLike = {
|
|
21
|
+
readonly invoke: (channel: string, payload: unknown) => Promise<unknown>;
|
|
22
|
+
readonly on: (channel: string, handler: (event: unknown, payload: unknown) => void) => void;
|
|
23
|
+
readonly removeListener: (channel: string, handler: (event: unknown, payload: unknown) => void) => void;
|
|
24
|
+
};
|
|
25
|
+
type ElectronRendererBindings = {
|
|
26
|
+
readonly contextBridge: ContextBridgeLike;
|
|
27
|
+
readonly ipcRenderer: IpcRendererLike;
|
|
28
|
+
};
|
|
29
|
+
export declare function resolveElectronRendererBindings(moduleCandidate: unknown): ElectronRendererBindings;
|
|
30
|
+
export declare function createBridgeAdaptersFromBindings(bindings: ElectronRendererBindings, options?: BridgeAdaptersOptions): BridgeAdapters;
|
|
31
|
+
export declare function exposeRpcBridgeFromBindings(bindings: ElectronRendererBindings, options?: BridgeExposureOptions): void;
|
|
32
|
+
export declare function exposeIpcBridgeFromBindings(bindings: ElectronRendererBindings, options?: IpcBridgeExposureOptions): void;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=preload-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preload-bridge.d.ts","sourceRoot":"","sources":["../src/preload-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;CAC5E,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,qBAAqB,GAAG;IAC1D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,qBAAqB,GAAG;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACpF,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,QAAQ,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;IAC5F,QAAQ,CAAC,cAAc,EAAE,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,KAChD,IAAI,CAAC;CACX,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;CACvC,CAAC;AAeF,wBAAgB,+BAA+B,CAC7C,eAAe,EAAE,OAAO,GACvB,wBAAwB,CAqB1B;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,wBAAwB,EAClC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,cAAc,CAgChB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,wBAAwB,EAClC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAiBN;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,wBAAwB,EAClC,OAAO,CAAC,EAAE,wBAAwB,GACjC,IAAI,CAaN"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { isRecord } from "./protocol.js";
|
|
2
|
+
import { defaultChannelPrefix, } from "./types.js";
|
|
3
|
+
function isContextBridgeLike(value) {
|
|
4
|
+
return isRecord(value) && typeof value.exposeInMainWorld === "function";
|
|
5
|
+
}
|
|
6
|
+
function isIpcRendererLike(value) {
|
|
7
|
+
return (isRecord(value) &&
|
|
8
|
+
typeof value.invoke === "function" &&
|
|
9
|
+
typeof value.on === "function" &&
|
|
10
|
+
typeof value.removeListener === "function");
|
|
11
|
+
}
|
|
12
|
+
export function resolveElectronRendererBindings(moduleCandidate) {
|
|
13
|
+
const moduleDefault = isRecord(moduleCandidate) ? moduleCandidate.default : undefined;
|
|
14
|
+
const source = isRecord(moduleCandidate)
|
|
15
|
+
? moduleCandidate
|
|
16
|
+
: isRecord(moduleDefault)
|
|
17
|
+
? moduleDefault
|
|
18
|
+
: undefined;
|
|
19
|
+
if (!source) {
|
|
20
|
+
throw new Error("electron-effect-rpc/preload requires Electron preload runtime bindings.");
|
|
21
|
+
}
|
|
22
|
+
const { contextBridge, ipcRenderer } = source;
|
|
23
|
+
if (!isContextBridgeLike(contextBridge) || !isIpcRendererLike(ipcRenderer)) {
|
|
24
|
+
throw new Error("electron-effect-rpc/preload requires Electron preload runtime bindings.");
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
contextBridge,
|
|
28
|
+
ipcRenderer,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function createBridgeAdaptersFromBindings(bindings, options) {
|
|
32
|
+
const channelPrefix = options?.channelPrefix ?? defaultChannelPrefix;
|
|
33
|
+
const { ipcRenderer } = bindings;
|
|
34
|
+
const invoke = (method, payload) => ipcRenderer.invoke(`${channelPrefix.rpc}${method}`, payload);
|
|
35
|
+
const subscribe = (event, listener) => {
|
|
36
|
+
const wrapped = (_event, payload) => listener(payload);
|
|
37
|
+
const channel = `${channelPrefix.event}${event}`;
|
|
38
|
+
ipcRenderer.on(channel, wrapped);
|
|
39
|
+
return () => {
|
|
40
|
+
ipcRenderer.removeListener(channel, wrapped);
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
const onStreamFrame = (listener) => {
|
|
44
|
+
const channel = `${channelPrefix.rpc}sf`;
|
|
45
|
+
const wrapped = (_event, frame) => listener(frame);
|
|
46
|
+
ipcRenderer.on(channel, wrapped);
|
|
47
|
+
return () => {
|
|
48
|
+
ipcRenderer.removeListener(channel, wrapped);
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
invoke,
|
|
53
|
+
subscribe,
|
|
54
|
+
onStreamFrame,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function exposeRpcBridgeFromBindings(bindings, options) {
|
|
58
|
+
const rpcGlobal = options?.rpcGlobal ?? "rpc";
|
|
59
|
+
const eventsGlobal = options?.eventsGlobal ?? "events";
|
|
60
|
+
const { contextBridge } = bindings;
|
|
61
|
+
const adapters = createBridgeAdaptersFromBindings(bindings, {
|
|
62
|
+
channelPrefix: options?.channelPrefix,
|
|
63
|
+
});
|
|
64
|
+
contextBridge.exposeInMainWorld(rpcGlobal, {
|
|
65
|
+
invoke: adapters.invoke,
|
|
66
|
+
onStreamFrame: adapters.onStreamFrame,
|
|
67
|
+
});
|
|
68
|
+
contextBridge.exposeInMainWorld(eventsGlobal, {
|
|
69
|
+
subscribe: adapters.subscribe,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
export function exposeIpcBridgeFromBindings(bindings, options) {
|
|
73
|
+
const global = options?.global ?? "api";
|
|
74
|
+
const { contextBridge } = bindings;
|
|
75
|
+
const adapters = createBridgeAdaptersFromBindings(bindings, {
|
|
76
|
+
channelPrefix: options?.channelPrefix,
|
|
77
|
+
});
|
|
78
|
+
contextBridge.exposeInMainWorld(global, {
|
|
79
|
+
invoke: adapters.invoke,
|
|
80
|
+
subscribe: adapters.subscribe,
|
|
81
|
+
onStreamFrame: adapters.onStreamFrame,
|
|
82
|
+
});
|
|
83
|
+
}
|
package/dist/preload.d.ts
CHANGED
|
@@ -1,19 +1,4 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
export type BridgeAdapters = {
|
|
3
|
-
readonly invoke: RpcInvoke;
|
|
4
|
-
readonly subscribe: EventSubscribe;
|
|
5
|
-
readonly onStreamFrame: (listener: (frame: unknown) => void) => () => void;
|
|
6
|
-
};
|
|
7
|
-
export type BridgeAdaptersOptions = {
|
|
8
|
-
readonly channelPrefix?: ChannelPrefix;
|
|
9
|
-
};
|
|
10
|
-
export type BridgeExposureOptions = BridgeAdaptersOptions & {
|
|
11
|
-
readonly rpcGlobal?: string;
|
|
12
|
-
readonly eventsGlobal?: string;
|
|
13
|
-
};
|
|
14
|
-
export type IpcBridgeExposureOptions = BridgeAdaptersOptions & {
|
|
15
|
-
readonly global?: string;
|
|
16
|
-
};
|
|
1
|
+
import { type BridgeAdapters, type BridgeAdaptersOptions, type BridgeExposureOptions, type IpcBridgeExposureOptions } from "./preload-bridge.ts";
|
|
17
2
|
export declare function createBridgeAdapters(options?: BridgeAdaptersOptions): BridgeAdapters;
|
|
18
3
|
export declare function exposeRpcBridge(options?: BridgeExposureOptions): void;
|
|
19
4
|
export declare function exposeIpcBridge(options?: IpcBridgeExposureOptions): void;
|
package/dist/preload.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preload.d.ts","sourceRoot":"","sources":["../src/preload.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"preload.d.ts","sourceRoot":"","sources":["../src/preload.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAC;AAM7B,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,cAAc,CAEpF;AAED,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAErE;AAED,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAExE"}
|
package/dist/preload.js
CHANGED
|
@@ -1,78 +1,14 @@
|
|
|
1
1
|
import * as electronModule from "electron";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
return isRecord(value) && typeof value.exposeInMainWorld === "function";
|
|
6
|
-
}
|
|
7
|
-
function isIpcRendererLike(value) {
|
|
8
|
-
return (isRecord(value) &&
|
|
9
|
-
typeof value.invoke === "function" &&
|
|
10
|
-
typeof value.on === "function" &&
|
|
11
|
-
typeof value.removeListener === "function");
|
|
12
|
-
}
|
|
13
|
-
function resolveElectronRendererBindings() {
|
|
14
|
-
const mod = electronModule;
|
|
15
|
-
const moduleDefault = isRecord(mod) ? mod.default : undefined;
|
|
16
|
-
const source = isRecord(moduleDefault) ? moduleDefault : isRecord(mod) ? mod : undefined;
|
|
17
|
-
if (!source) {
|
|
18
|
-
throw new Error("electron-effect-rpc/preload requires Electron preload runtime bindings.");
|
|
19
|
-
}
|
|
20
|
-
const { contextBridge, ipcRenderer } = source;
|
|
21
|
-
if (!isContextBridgeLike(contextBridge) || !isIpcRendererLike(ipcRenderer)) {
|
|
22
|
-
throw new Error("electron-effect-rpc/preload requires Electron preload runtime bindings.");
|
|
23
|
-
}
|
|
24
|
-
return { contextBridge, ipcRenderer };
|
|
2
|
+
import { createBridgeAdaptersFromBindings, exposeIpcBridgeFromBindings, exposeRpcBridgeFromBindings, resolveElectronRendererBindings, } from "./preload-bridge.js";
|
|
3
|
+
function resolveBindings() {
|
|
4
|
+
return resolveElectronRendererBindings(electronModule);
|
|
25
5
|
}
|
|
26
6
|
export function createBridgeAdapters(options) {
|
|
27
|
-
|
|
28
|
-
const { ipcRenderer } = resolveElectronRendererBindings();
|
|
29
|
-
const invoke = (method, payload) => ipcRenderer.invoke(`${channelPrefix.rpc}${method}`, payload);
|
|
30
|
-
const subscribe = (event, listener) => {
|
|
31
|
-
const wrapped = (_event, payload) => listener(payload);
|
|
32
|
-
const channel = `${channelPrefix.event}${event}`;
|
|
33
|
-
ipcRenderer.on(channel, wrapped);
|
|
34
|
-
return () => {
|
|
35
|
-
ipcRenderer.removeListener(channel, wrapped);
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
|
-
const onStreamFrame = (listener) => {
|
|
39
|
-
const channel = `${channelPrefix.rpc}sf`;
|
|
40
|
-
const wrapped = (_event, frame) => listener(frame);
|
|
41
|
-
ipcRenderer.on(channel, wrapped);
|
|
42
|
-
return () => {
|
|
43
|
-
ipcRenderer.removeListener(channel, wrapped);
|
|
44
|
-
};
|
|
45
|
-
};
|
|
46
|
-
return {
|
|
47
|
-
invoke,
|
|
48
|
-
subscribe,
|
|
49
|
-
onStreamFrame,
|
|
50
|
-
};
|
|
7
|
+
return createBridgeAdaptersFromBindings(resolveBindings(), options);
|
|
51
8
|
}
|
|
52
9
|
export function exposeRpcBridge(options) {
|
|
53
|
-
|
|
54
|
-
const eventsGlobal = options?.eventsGlobal ?? "events";
|
|
55
|
-
const { contextBridge } = resolveElectronRendererBindings();
|
|
56
|
-
const adapters = createBridgeAdapters({
|
|
57
|
-
channelPrefix: options?.channelPrefix,
|
|
58
|
-
});
|
|
59
|
-
contextBridge.exposeInMainWorld(rpcGlobal, {
|
|
60
|
-
invoke: adapters.invoke,
|
|
61
|
-
onStreamFrame: adapters.onStreamFrame,
|
|
62
|
-
});
|
|
63
|
-
contextBridge.exposeInMainWorld(eventsGlobal, {
|
|
64
|
-
subscribe: adapters.subscribe,
|
|
65
|
-
});
|
|
10
|
+
exposeRpcBridgeFromBindings(resolveBindings(), options);
|
|
66
11
|
}
|
|
67
12
|
export function exposeIpcBridge(options) {
|
|
68
|
-
|
|
69
|
-
const { contextBridge } = resolveElectronRendererBindings();
|
|
70
|
-
const adapters = createBridgeAdapters({
|
|
71
|
-
channelPrefix: options?.channelPrefix,
|
|
72
|
-
});
|
|
73
|
-
contextBridge.exposeInMainWorld(global, {
|
|
74
|
-
invoke: adapters.invoke,
|
|
75
|
-
subscribe: adapters.subscribe,
|
|
76
|
-
onStreamFrame: adapters.onStreamFrame,
|
|
77
|
-
});
|
|
13
|
+
exposeIpcBridgeFromBindings(resolveBindings(), options);
|
|
78
14
|
}
|