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 CHANGED
@@ -108,11 +108,23 @@ void Effect.runPromise(
108
108
  ```ts
109
109
  import { ipc } from "./shared-ipc.ts";
110
110
 
111
- ipc.preload().expose();
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":"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"}
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 { exposeIpcBridge, createBridgeAdapters } from "./preload.js";
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 = createBridgeAdapters({
120
+ const bridge = createBridgeAdaptersFromBindings(bindings, {
110
121
  channelPrefix,
111
122
  });
112
123
  return {
113
124
  global,
114
125
  bridge,
115
126
  expose: () => {
116
- exposeIpcBridge({
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 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
- };
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;
@@ -1 +1 @@
1
- {"version":3,"file":"preload.d.ts","sourceRoot":"","sources":["../src/preload.ts"],"names":[],"mappings":"AAGA,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;AAoDF,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,cAAc,CAgCpF;AAED,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAiBrE;AAED,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAaxE"}
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 { isRecord } from "./protocol.js";
3
- import { defaultChannelPrefix, } from "./types.js";
4
- function isContextBridgeLike(value) {
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
- const channelPrefix = options?.channelPrefix ?? defaultChannelPrefix;
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
- const rpcGlobal = options?.rpcGlobal ?? "rpc";
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
- const global = options?.global ?? "api";
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "electron-effect-rpc",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Typed IPC RPC for Electron, built on Effect and @effect/schema",
5
5
  "keywords": [
6
6
  "effect",