@oldzy/conduit-electron-adapter 1.0.0 → 1.0.2

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
@@ -6,10 +6,11 @@ Electron IPC adapter for [@oldzy/conduit](https://github.com/oldzy/conduit), ena
6
6
 
7
7
  - 🔌 IPC-based communication between main and renderer processes
8
8
  - 🎯 Request/Response pattern with UUID tracking
9
- - 📡 Support for streaming responses
9
+ - 📡 Separate handlers for simple and streaming responses
10
10
  - 🚫 Request cancellation support
11
11
  - 💉 Automatic dependency injection for Electron App and IpcMain
12
12
  - 🔄 AbortController integration for async operations
13
+ - 🔒 Type-safe with TypeScript generics
13
14
 
14
15
  ## Installation
15
16
 
@@ -55,7 +56,7 @@ const mainWindow = new BrowserWindow({
55
56
  ```
56
57
 
57
58
  The preload script automatically:
58
- - Exposes `electronService` to the renderer via `contextBridge`
59
+ - Exposes `conduit` to the renderer via `contextBridge`
59
60
  - Handles all IPC listeners for streaming, errors, and cancellation
60
61
  - Manages request timeout (30 seconds)
61
62
  - Cleans up listeners automatically
@@ -63,32 +64,28 @@ The preload script automatically:
63
64
  ### Renderer Process
64
65
 
65
66
  ```typescript
66
- // TypeScript: add types to window
67
- declare global {
68
- interface Window {
69
- electronService: IElectronService;
70
- }
71
- }
72
-
73
- // Simple request/response
74
- const response = await window.electronService.send({
67
+ // Simple request/response (for SimpleHandler)
68
+ const response = await window.conduit.send<GetUserResponse>({
75
69
  uuid: crypto.randomUUID(),
76
- // ... your request data
70
+ type: 'GET_USER',
71
+ userId: '123'
77
72
  });
73
+ console.log(response.userName);
78
74
 
79
- // Streaming request with callback
80
- await window.electronService.send(
75
+ // Streaming request (for StreamingHandler)
76
+ await window.conduit.stream<LogChunkResponse>(
81
77
  {
82
78
  uuid: crypto.randomUUID(),
83
- // ... your request data
79
+ type: 'STREAM_LOGS',
80
+ filename: 'app.log'
84
81
  },
85
82
  (chunk) => {
86
- console.log('Received chunk:', chunk);
83
+ console.log('Received chunk:', chunk.line);
87
84
  }
88
85
  );
89
86
 
90
87
  // Cancel a request
91
- await window.electronService.cancel('request-uuid');
88
+ await window.conduit.cancel('request-uuid');
92
89
  ```
93
90
 
94
91
  ## API
@@ -96,34 +93,54 @@ await window.electronService.cancel('request-uuid');
96
93
  ### ElectronAdapter (Main Process)
97
94
 
98
95
  The adapter automatically:
99
- - Registers `conduit:send` IPC handler for sending requests
96
+ - Registers `conduit:send` IPC handler for simple requests (SimpleHandler)
97
+ - Registers `conduit:stream` IPC handler for streaming requests (StreamingHandler)
100
98
  - Registers `conduit:cancel` IPC handler for cancelling requests
101
99
  - Injects `ElectronApp` (app instance) and `IpcMain` into the service container
102
100
  - Manages streaming responses via IPC events
103
101
  - Handles request cancellation with AbortController
104
102
 
105
- ### IElectronService (Renderer Process)
103
+ ### IConduitService (Renderer Process)
104
+
105
+ The `window.conduit` object is automatically typed when you import the package:
106
+
107
+ ```typescript
108
+ import '@oldzy/conduit-electron-adapter';
109
+
110
+ // Now window.conduit is fully typed!
111
+ const response = await window.conduit.send<MyResponse>(request);
112
+ ```
106
113
 
107
114
  ```typescript
108
- interface IElectronService {
109
- send: (
115
+ interface IConduitService {
116
+ send: <TResponse extends BaseResponse>(
117
+ request: BaseRequest
118
+ ) => Promise<TResponse>;
119
+ stream: <TResponse extends BaseResponse>(
110
120
  request: BaseRequest,
111
- onData?: (response: BaseResponse) => void
112
- ) => Promise<BaseResponse | void>;
121
+ onData: (response: TResponse) => void
122
+ ) => Promise<void>;
113
123
  cancel: (requestUuid: string) => Promise<void>;
114
124
  }
115
125
  ```
116
126
 
117
- #### Methods
127
+ #### Methodstimeout (30s) and cleanup
128
+
129
+ - **`cancel(requestUuid)`** - Cancel a pending request by UUID
130
+
131
+ **Important**: Use `send()` for SimpleHandler and `stream()` for StreamingHandler. Using the wrong method will result in an error.
132
+
133
+ ### IPC Channels
118
134
 
119
- - **`send(request, onData?)`** - Send a request to the main process
120
- - Returns the response for simple requests
121
- - Calls `onData` callback for each chunk in streaming responses
122
- - Resolves when streaming is complete
123
- - Automatically handles timeout (30s) and cleanup
135
+ Internal channels (handled automatically by the preload script):
136
+ - `conduit:send` - Send a simple request (invoke) - returns response
137
+ - `conduit:stream` - Start a streaming request (invoke) - sends chunks via eventsuest (invoke) - sends chunks via eventsd cleanup
124
138
 
125
139
  - **`cancel(requestUuid)`** - Cancel a pending request by UUID
126
140
 
141
+ **Important**: Use `send()` for SimpleHandler and `stream()` for StreamingHandler. Using the wrong method will result in an error.
142
+ - **`cancel(requestUuid)`** - Cancel a pending request by UUID
143
+
127
144
  ### IPC Channels
128
145
 
129
146
  Internal channels (handled automatically by the preload script):
@@ -138,14 +155,16 @@ Internal channels (handled automatically by the preload script):
138
155
 
139
156
  ```typescript
140
157
  interface ErrorResponse {
141
- success: false;
142
- requestUuid: string;
143
- timestamp: Date;
144
- error: string;
145
- stack?: string;
158
+ class ErrorResponse extends BaseResponse {
159
+ constructor(
160
+ public requestUuid: string,
161
+ public error: string,
162
+ public stack?: string
163
+ );
146
164
  }
147
165
  ```
148
166
 
167
+ **Note**: The `window.conduit` type is automatically available when you import the package in your TypeScript files.
149
168
  ## License
150
169
 
151
170
  MIT
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { IApplicationAdapter, ServiceCollection, Application } from '@oldzy/conduit';
2
- export { IElectronService } from './preload.mjs';
1
+ import { IApplicationAdapter, ServiceCollection, Application, BaseResponse } from '@oldzy/conduit';
2
+ import { IConduitService } from './preload.mjs';
3
3
 
4
4
  declare class ElectronAdapter implements IApplicationAdapter {
5
5
  name: string;
@@ -7,19 +7,25 @@ declare class ElectronAdapter implements IApplicationAdapter {
7
7
  private requestControllers;
8
8
  configure(services: ServiceCollection): void | Promise<void>;
9
9
  initialize(app: Application): void | Promise<void>;
10
- private handleRequest;
10
+ private handleSendRequest;
11
+ private handleStreamRequest;
11
12
  private handleStream;
12
13
  private handleCancel;
13
14
  private createErrorResponse;
14
15
  dispose(): void | Promise<void>;
15
16
  }
16
17
 
17
- interface ErrorResponse {
18
- success: false;
18
+ declare class ErrorResponse extends BaseResponse {
19
19
  requestUuid: string;
20
- timestamp: Date;
21
20
  error: string;
22
- stack?: string;
21
+ stack?: string | undefined;
22
+ constructor(requestUuid: string, error: string, stack?: string | undefined);
23
23
  }
24
24
 
25
- export { ElectronAdapter, type ErrorResponse };
25
+ declare global {
26
+ interface Window {
27
+ conduit: IConduitService;
28
+ }
29
+ }
30
+
31
+ export { ElectronAdapter, ErrorResponse, IConduitService };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { IApplicationAdapter, ServiceCollection, Application } from '@oldzy/conduit';
2
- export { IElectronService } from './preload.js';
1
+ import { IApplicationAdapter, ServiceCollection, Application, BaseResponse } from '@oldzy/conduit';
2
+ import { IConduitService } from './preload.js';
3
3
 
4
4
  declare class ElectronAdapter implements IApplicationAdapter {
5
5
  name: string;
@@ -7,19 +7,25 @@ declare class ElectronAdapter implements IApplicationAdapter {
7
7
  private requestControllers;
8
8
  configure(services: ServiceCollection): void | Promise<void>;
9
9
  initialize(app: Application): void | Promise<void>;
10
- private handleRequest;
10
+ private handleSendRequest;
11
+ private handleStreamRequest;
11
12
  private handleStream;
12
13
  private handleCancel;
13
14
  private createErrorResponse;
14
15
  dispose(): void | Promise<void>;
15
16
  }
16
17
 
17
- interface ErrorResponse {
18
- success: false;
18
+ declare class ErrorResponse extends BaseResponse {
19
19
  requestUuid: string;
20
- timestamp: Date;
21
20
  error: string;
22
- stack?: string;
21
+ stack?: string | undefined;
22
+ constructor(requestUuid: string, error: string, stack?: string | undefined);
23
23
  }
24
24
 
25
- export { ElectronAdapter, type ErrorResponse };
25
+ declare global {
26
+ interface Window {
27
+ conduit: IConduitService;
28
+ }
29
+ }
30
+
31
+ export { ElectronAdapter, ErrorResponse, IConduitService };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  'use strict';var electron=require('electron'),conduit=require('@oldzy/conduit');/* conduit - MIT License */
2
- var c=Object.defineProperty;var h=(o,s,e)=>s in o?c(o,s,{enumerable:true,configurable:true,writable:true,value:e}):o[s]=e;var u=(o,s)=>c(o,"name",{value:s,configurable:true});var a=(o,s,e)=>h(o,typeof s!="symbol"?s+"":s,e);var l=class l{constructor(){a(this,"name","ElectronAdapter");a(this,"app");a(this,"requestControllers",new Map);}configure(s){s.addSingleton("ElectronApp",electron.app),s.addSingleton("IpcMain",electron.ipcMain);}initialize(s){if(this.app=s,!this.app)throw new Error("Application not initialized");electron.ipcMain.handle("conduit:send",async(e,n)=>await this.handleRequest(e,n)),electron.ipcMain.handle("conduit:cancel",async(e,n)=>{await this.handleCancel(e,n);});}async handleRequest(s,e){try{let n=new AbortController;this.requestControllers.set(e.uuid,n);let r=await this.app.send(e);if(r instanceof conduit.BaseResponse)return this.requestControllers.delete(e.uuid),r;await this.handleStream(s,e,r,n);}catch(n){let r=this.createErrorResponse(e.uuid,n);s.sender.send(`conduit:response:error:${e.uuid}`,r),this.requestControllers.delete(e.uuid);}}async handleStream(s,e,n,r){try{for await(let d of n){if(r.signal.aborted){s.sender.send(`conduit:response:cancelled:${e.uuid}`,{success:!1,requestUuid:e.uuid,error:"Request was cancelled"});return}s.sender.send(`conduit:response:data:${e.uuid}`,d);}s.sender.send(`conduit:response:complete:${e.uuid}`);}catch(d){if(r.signal.aborted)s.sender.send(`conduit:response:cancelled:${e.uuid}`,{success:false,requestUuid:e.uuid,error:"Request was cancelled"});else {let p=this.createErrorResponse(e.uuid,d);s.sender.send(`conduit:response:error:${e.uuid}`,p);}}finally{this.requestControllers.delete(e.uuid);}}async handleCancel(s,e){let n=this.requestControllers.get(e);n&&(n.abort(),this.requestControllers.delete(e),s.sender.send(`conduit:response:cancelled:${e}`,{success:false,requestUuid:e,error:"Request cancelled by user"}));}createErrorResponse(s,e){return {success:false,requestUuid:s,timestamp:new Date,error:e instanceof Error?e.message:"Unknown error",stack:e instanceof Error?e.stack:void 0}}dispose(){for(let[s,e]of this.requestControllers.entries())e.abort(),this.requestControllers.delete(s);electron.ipcMain.removeHandler("conduit:send"),electron.ipcMain.removeHandler("conduit:cancel");}};u(l,"ElectronAdapter");var i=l;exports.ElectronAdapter=i;
2
+ var h=Object.defineProperty;var f=(o,s,e)=>s in o?h(o,s,{enumerable:true,configurable:true,writable:true,value:e}):o[s]=e;var d=(o,s)=>h(o,"name",{value:s,configurable:true});var t=(o,s,e)=>f(o,typeof s!="symbol"?s+"":s,e);var w=Symbol("ERROR_RESPONSE"),u=class u extends conduit.BaseResponse{constructor(e,r,n){super(w);t(this,"requestUuid");t(this,"error");t(this,"stack");this.requestUuid=e,this.error=r,this.stack=n,this.success=false;}};d(u,"ErrorResponse");var c=u;var p=class p{constructor(){t(this,"name","ElectronAdapter");t(this,"app");t(this,"requestControllers",new Map);}configure(s){s.addSingleton("ElectronApp",electron.app),s.addSingleton("IpcMain",electron.ipcMain);}initialize(s){if(this.app=s,!this.app)throw new Error("Application not initialized");electron.ipcMain.handle("conduit:send",async(e,r)=>await this.handleSendRequest(e,r)),electron.ipcMain.handle("conduit:stream",async(e,r)=>{await this.handleStreamRequest(e,r);}),electron.ipcMain.handle("conduit:cancel",async(e,r)=>{await this.handleCancel(e,r);});}async handleSendRequest(s,e){try{return await this.app.send(e)}catch(r){throw this.createErrorResponse(e.uuid,r)}}async handleStreamRequest(s,e){let r=new AbortController;this.requestControllers.set(e.uuid,r);try{let n=await this.app.stream(e);await this.handleStream(s,e,n,r);}catch(n){let i=this.createErrorResponse(e.uuid,n);s.sender.send(`conduit:response:error:${e.uuid}`,i),this.requestControllers.delete(e.uuid);}}async handleStream(s,e,r,n){try{for await(let i of r){if(n.signal.aborted){s.sender.send(`conduit:response:cancelled:${e.uuid}`,{success:!1,requestUuid:e.uuid,error:"Request was cancelled"});return}s.sender.send(`conduit:response:data:${e.uuid}`,i);}s.sender.send(`conduit:response:complete:${e.uuid}`);}catch(i){if(n.signal.aborted)s.sender.send(`conduit:response:cancelled:${e.uuid}`,{success:false,requestUuid:e.uuid,error:"Request was cancelled"});else {let m=this.createErrorResponse(e.uuid,i);s.sender.send(`conduit:response:error:${e.uuid}`,m);}}finally{this.requestControllers.delete(e.uuid);}}async handleCancel(s,e){let r=this.requestControllers.get(e);r&&(r.abort(),this.requestControllers.delete(e),s.sender.send(`conduit:response:cancelled:${e}`,{success:false,requestUuid:e,error:"Request cancelled by user"}));}createErrorResponse(s,e){return new c(s,e instanceof Error?e.message:"Unknown error",e instanceof Error?e.stack:void 0)}dispose(){for(let[s,e]of this.requestControllers.entries())e.abort(),this.requestControllers.delete(s);electron.ipcMain.removeHandler("conduit:send"),electron.ipcMain.removeHandler("conduit:stream"),electron.ipcMain.removeHandler("conduit:cancel");}};d(p,"ElectronAdapter");var l=p;exports.ElectronAdapter=l;
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  import {app,ipcMain}from'electron';import {BaseResponse}from'@oldzy/conduit';/* conduit - MIT License */
2
- var c=Object.defineProperty;var h=(o,s,e)=>s in o?c(o,s,{enumerable:true,configurable:true,writable:true,value:e}):o[s]=e;var u=(o,s)=>c(o,"name",{value:s,configurable:true});var a=(o,s,e)=>h(o,typeof s!="symbol"?s+"":s,e);var l=class l{constructor(){a(this,"name","ElectronAdapter");a(this,"app");a(this,"requestControllers",new Map);}configure(s){s.addSingleton("ElectronApp",app),s.addSingleton("IpcMain",ipcMain);}initialize(s){if(this.app=s,!this.app)throw new Error("Application not initialized");ipcMain.handle("conduit:send",async(e,n)=>await this.handleRequest(e,n)),ipcMain.handle("conduit:cancel",async(e,n)=>{await this.handleCancel(e,n);});}async handleRequest(s,e){try{let n=new AbortController;this.requestControllers.set(e.uuid,n);let r=await this.app.send(e);if(r instanceof BaseResponse)return this.requestControllers.delete(e.uuid),r;await this.handleStream(s,e,r,n);}catch(n){let r=this.createErrorResponse(e.uuid,n);s.sender.send(`conduit:response:error:${e.uuid}`,r),this.requestControllers.delete(e.uuid);}}async handleStream(s,e,n,r){try{for await(let d of n){if(r.signal.aborted){s.sender.send(`conduit:response:cancelled:${e.uuid}`,{success:!1,requestUuid:e.uuid,error:"Request was cancelled"});return}s.sender.send(`conduit:response:data:${e.uuid}`,d);}s.sender.send(`conduit:response:complete:${e.uuid}`);}catch(d){if(r.signal.aborted)s.sender.send(`conduit:response:cancelled:${e.uuid}`,{success:false,requestUuid:e.uuid,error:"Request was cancelled"});else {let p=this.createErrorResponse(e.uuid,d);s.sender.send(`conduit:response:error:${e.uuid}`,p);}}finally{this.requestControllers.delete(e.uuid);}}async handleCancel(s,e){let n=this.requestControllers.get(e);n&&(n.abort(),this.requestControllers.delete(e),s.sender.send(`conduit:response:cancelled:${e}`,{success:false,requestUuid:e,error:"Request cancelled by user"}));}createErrorResponse(s,e){return {success:false,requestUuid:s,timestamp:new Date,error:e instanceof Error?e.message:"Unknown error",stack:e instanceof Error?e.stack:void 0}}dispose(){for(let[s,e]of this.requestControllers.entries())e.abort(),this.requestControllers.delete(s);ipcMain.removeHandler("conduit:send"),ipcMain.removeHandler("conduit:cancel");}};u(l,"ElectronAdapter");var i=l;export{i as ElectronAdapter};
2
+ var h=Object.defineProperty;var f=(o,s,e)=>s in o?h(o,s,{enumerable:true,configurable:true,writable:true,value:e}):o[s]=e;var d=(o,s)=>h(o,"name",{value:s,configurable:true});var t=(o,s,e)=>f(o,typeof s!="symbol"?s+"":s,e);var w=Symbol("ERROR_RESPONSE"),u=class u extends BaseResponse{constructor(e,r,n){super(w);t(this,"requestUuid");t(this,"error");t(this,"stack");this.requestUuid=e,this.error=r,this.stack=n,this.success=false;}};d(u,"ErrorResponse");var c=u;var p=class p{constructor(){t(this,"name","ElectronAdapter");t(this,"app");t(this,"requestControllers",new Map);}configure(s){s.addSingleton("ElectronApp",app),s.addSingleton("IpcMain",ipcMain);}initialize(s){if(this.app=s,!this.app)throw new Error("Application not initialized");ipcMain.handle("conduit:send",async(e,r)=>await this.handleSendRequest(e,r)),ipcMain.handle("conduit:stream",async(e,r)=>{await this.handleStreamRequest(e,r);}),ipcMain.handle("conduit:cancel",async(e,r)=>{await this.handleCancel(e,r);});}async handleSendRequest(s,e){try{return await this.app.send(e)}catch(r){throw this.createErrorResponse(e.uuid,r)}}async handleStreamRequest(s,e){let r=new AbortController;this.requestControllers.set(e.uuid,r);try{let n=await this.app.stream(e);await this.handleStream(s,e,n,r);}catch(n){let i=this.createErrorResponse(e.uuid,n);s.sender.send(`conduit:response:error:${e.uuid}`,i),this.requestControllers.delete(e.uuid);}}async handleStream(s,e,r,n){try{for await(let i of r){if(n.signal.aborted){s.sender.send(`conduit:response:cancelled:${e.uuid}`,{success:!1,requestUuid:e.uuid,error:"Request was cancelled"});return}s.sender.send(`conduit:response:data:${e.uuid}`,i);}s.sender.send(`conduit:response:complete:${e.uuid}`);}catch(i){if(n.signal.aborted)s.sender.send(`conduit:response:cancelled:${e.uuid}`,{success:false,requestUuid:e.uuid,error:"Request was cancelled"});else {let m=this.createErrorResponse(e.uuid,i);s.sender.send(`conduit:response:error:${e.uuid}`,m);}}finally{this.requestControllers.delete(e.uuid);}}async handleCancel(s,e){let r=this.requestControllers.get(e);r&&(r.abort(),this.requestControllers.delete(e),s.sender.send(`conduit:response:cancelled:${e}`,{success:false,requestUuid:e,error:"Request cancelled by user"}));}createErrorResponse(s,e){return new c(s,e instanceof Error?e.message:"Unknown error",e instanceof Error?e.stack:void 0)}dispose(){for(let[s,e]of this.requestControllers.entries())e.abort(),this.requestControllers.delete(s);ipcMain.removeHandler("conduit:send"),ipcMain.removeHandler("conduit:stream"),ipcMain.removeHandler("conduit:cancel");}};d(p,"ElectronAdapter");var l=p;export{l as ElectronAdapter};
@@ -1,8 +1,9 @@
1
- import { BaseRequest, BaseResponse } from '@oldzy/conduit';
1
+ import { BaseResponse, BaseRequest } from '@oldzy/conduit';
2
2
 
3
- interface IElectronService {
4
- send: (request: BaseRequest, onData?: (response: BaseResponse) => void) => Promise<BaseResponse | void>;
3
+ interface IConduitService {
4
+ send: <TResponse extends BaseResponse>(request: BaseRequest) => Promise<TResponse>;
5
+ stream: <TResponse extends BaseResponse>(request: BaseRequest, onData: (response: TResponse) => void) => Promise<void>;
5
6
  cancel: (requestUuid: string) => Promise<void>;
6
7
  }
7
8
 
8
- export type { IElectronService };
9
+ export type { IConduitService };
package/dist/preload.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { BaseRequest, BaseResponse } from '@oldzy/conduit';
1
+ import { BaseResponse, BaseRequest } from '@oldzy/conduit';
2
2
 
3
- interface IElectronService {
4
- send: (request: BaseRequest, onData?: (response: BaseResponse) => void) => Promise<BaseResponse | void>;
3
+ interface IConduitService {
4
+ send: <TResponse extends BaseResponse>(request: BaseRequest) => Promise<TResponse>;
5
+ stream: <TResponse extends BaseResponse>(request: BaseRequest, onData: (response: TResponse) => void) => Promise<void>;
5
6
  cancel: (requestUuid: string) => Promise<void>;
6
7
  }
7
8
 
8
- export type { IElectronService };
9
+ export type { IConduitService };
package/dist/preload.js CHANGED
@@ -1,2 +1,2 @@
1
1
  'use strict';var electron=require('electron');/* conduit - MIT License */
2
- var m=Object.defineProperty;var c=(e,o)=>m(e,"name",{value:o,configurable:true});function l(e,o){return setTimeout(()=>{e(),o({success:false,error:"The request timed out",timestamp:new Date});},3e4)}c(l,"setTimeoutError");electron.contextBridge.exposeInMainWorld("electronService",{send:c(async(e,o)=>new Promise(async(d,u)=>{let i=c(()=>{clearTimeout(s),electron.ipcRenderer.removeAllListeners(`conduit:response:data:${e.uuid}`),electron.ipcRenderer.removeAllListeners(`conduit:response:complete:${e.uuid}`),electron.ipcRenderer.removeAllListeners(`conduit:response:error:${e.uuid}`),electron.ipcRenderer.removeAllListeners(`conduit:response:cancelled:${e.uuid}`);},"cleanup"),s=l(i,u);electron.ipcRenderer.on(`conduit:response:data:${e.uuid}`,(t,r)=>{clearTimeout(s),s=l(i,u),o&&o(r);}),electron.ipcRenderer.on(`conduit:response:complete:${e.uuid}`,()=>{i(),d();}),electron.ipcRenderer.on(`conduit:response:error:${e.uuid}`,(t,r)=>{i(),u(r);}),electron.ipcRenderer.on(`conduit:response:cancelled:${e.uuid}`,(t,r)=>{i(),u(r);}),electron.ipcRenderer.invoke("conduit:send",e).then(t=>{t&&(i(),d(t));});}),"send"),cancel:c(async e=>electron.ipcRenderer.invoke("conduit:cancel",e),"cancel")});
2
+ var l=Object.defineProperty;var i=(e,r)=>l(e,"name",{value:r,configurable:true});function s(e,r){return setTimeout(()=>{e(),r(new Error("The request timed out"));},3e4)}i(s,"setTimeoutError");electron.contextBridge.exposeInMainWorld("conduit",{send:i(async e=>electron.ipcRenderer.invoke("conduit:send",e),"send"),stream:i(async(e,r)=>new Promise(async(a,t)=>{let o=i(()=>{clearTimeout(d),electron.ipcRenderer.removeAllListeners(`conduit:response:data:${e.uuid}`),electron.ipcRenderer.removeAllListeners(`conduit:response:complete:${e.uuid}`),electron.ipcRenderer.removeAllListeners(`conduit:response:error:${e.uuid}`),electron.ipcRenderer.removeAllListeners(`conduit:response:cancelled:${e.uuid}`);},"cleanup"),d=s(o,t);electron.ipcRenderer.on(`conduit:response:data:${e.uuid}`,(c,u)=>{clearTimeout(d),d=s(o,t),r(u);}),electron.ipcRenderer.on(`conduit:response:complete:${e.uuid}`,()=>{o(),a();}),electron.ipcRenderer.on(`conduit:response:error:${e.uuid}`,(c,u)=>{o(),t(u);}),electron.ipcRenderer.on(`conduit:response:cancelled:${e.uuid}`,(c,u)=>{o(),t(u);});try{await electron.ipcRenderer.invoke("conduit:stream",e);}catch(c){o(),t(c);}}),"stream"),cancel:i(async e=>electron.ipcRenderer.invoke("conduit:cancel",e),"cancel")});
package/dist/preload.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  import {contextBridge,ipcRenderer}from'electron';/* conduit - MIT License */
2
- var m=Object.defineProperty;var c=(e,o)=>m(e,"name",{value:o,configurable:true});function l(e,o){return setTimeout(()=>{e(),o({success:false,error:"The request timed out",timestamp:new Date});},3e4)}c(l,"setTimeoutError");contextBridge.exposeInMainWorld("electronService",{send:c(async(e,o)=>new Promise(async(d,u)=>{let i=c(()=>{clearTimeout(s),ipcRenderer.removeAllListeners(`conduit:response:data:${e.uuid}`),ipcRenderer.removeAllListeners(`conduit:response:complete:${e.uuid}`),ipcRenderer.removeAllListeners(`conduit:response:error:${e.uuid}`),ipcRenderer.removeAllListeners(`conduit:response:cancelled:${e.uuid}`);},"cleanup"),s=l(i,u);ipcRenderer.on(`conduit:response:data:${e.uuid}`,(t,r)=>{clearTimeout(s),s=l(i,u),o&&o(r);}),ipcRenderer.on(`conduit:response:complete:${e.uuid}`,()=>{i(),d();}),ipcRenderer.on(`conduit:response:error:${e.uuid}`,(t,r)=>{i(),u(r);}),ipcRenderer.on(`conduit:response:cancelled:${e.uuid}`,(t,r)=>{i(),u(r);}),ipcRenderer.invoke("conduit:send",e).then(t=>{t&&(i(),d(t));});}),"send"),cancel:c(async e=>ipcRenderer.invoke("conduit:cancel",e),"cancel")});
2
+ var l=Object.defineProperty;var i=(e,r)=>l(e,"name",{value:r,configurable:true});function s(e,r){return setTimeout(()=>{e(),r(new Error("The request timed out"));},3e4)}i(s,"setTimeoutError");contextBridge.exposeInMainWorld("conduit",{send:i(async e=>ipcRenderer.invoke("conduit:send",e),"send"),stream:i(async(e,r)=>new Promise(async(a,t)=>{let o=i(()=>{clearTimeout(d),ipcRenderer.removeAllListeners(`conduit:response:data:${e.uuid}`),ipcRenderer.removeAllListeners(`conduit:response:complete:${e.uuid}`),ipcRenderer.removeAllListeners(`conduit:response:error:${e.uuid}`),ipcRenderer.removeAllListeners(`conduit:response:cancelled:${e.uuid}`);},"cleanup"),d=s(o,t);ipcRenderer.on(`conduit:response:data:${e.uuid}`,(c,u)=>{clearTimeout(d),d=s(o,t),r(u);}),ipcRenderer.on(`conduit:response:complete:${e.uuid}`,()=>{o(),a();}),ipcRenderer.on(`conduit:response:error:${e.uuid}`,(c,u)=>{o(),t(u);}),ipcRenderer.on(`conduit:response:cancelled:${e.uuid}`,(c,u)=>{o(),t(u);});try{await ipcRenderer.invoke("conduit:stream",e);}catch(c){o(),t(c);}}),"stream"),cancel:i(async e=>ipcRenderer.invoke("conduit:cancel",e),"cancel")});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oldzy/conduit-electron-adapter",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Electron IPC adapter for @oldzy/conduit - enables seamless communication between main and renderer processes",
5
5
  "author": "oldzy",
6
6
  "license": "MIT",
@@ -36,7 +36,8 @@
36
36
  "test:coverage": "vitest --coverage",
37
37
  "test:watch": "vitest --watch",
38
38
  "lint": "eslint src",
39
- "prepublishOnly": "npm run build:prod && npm test"
39
+ "prepublishOnly": "npm run build:prod && npm test",
40
+ "publish:npm": "npm run build:prod && npm test && npm publish --access public"
40
41
  },
41
42
  "keywords": [
42
43
  "conduit",
@@ -64,10 +65,8 @@
64
65
  "vitest": "^4.0.9"
65
66
  },
66
67
  "dependencies": {
67
- "@oldzy/conduit": "^1.0.2",
68
- "electron": "^39.2.7",
69
- "reflect-metadata": "^0.2.2",
70
- "uuid": "^13.0.0"
68
+ "@oldzy/conduit": "^1.0.4",
69
+ "electron": "^39.2.7"
71
70
  },
72
71
  "engines": {
73
72
  "node": ">=18.0.0"