electron-wcap 1.0.0 → 1.1.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.
Files changed (59) hide show
  1. package/README.md +16 -14
  2. package/common/errors.d.ts +1 -1
  3. package/common/errors.d.ts.map +1 -1
  4. package/common/errors.js +4 -0
  5. package/common/errors.js.map +1 -1
  6. package/common/interfaces.d.ts +1 -0
  7. package/common/interfaces.d.ts.map +1 -1
  8. package/common/protocol.d.ts +6 -1
  9. package/common/protocol.d.ts.map +1 -1
  10. package/common/protocol.js +16 -5
  11. package/common/protocol.js.map +1 -1
  12. package/esm/common/errors.d.ts +1 -1
  13. package/esm/common/errors.d.ts.map +1 -1
  14. package/esm/common/errors.js +4 -1
  15. package/esm/common/errors.js.map +1 -1
  16. package/esm/common/interfaces.d.ts +1 -0
  17. package/esm/common/interfaces.d.ts.map +1 -1
  18. package/esm/common/protocol.d.ts +6 -1
  19. package/esm/common/protocol.d.ts.map +1 -1
  20. package/esm/common/protocol.js +15 -6
  21. package/esm/common/protocol.js.map +1 -1
  22. package/esm/main/callback-registry.d.ts +1 -0
  23. package/esm/main/callback-registry.d.ts.map +1 -1
  24. package/esm/main/callback-registry.js +25 -11
  25. package/esm/main/callback-registry.js.map +1 -1
  26. package/esm/main/compiler.d.ts +4 -0
  27. package/esm/main/compiler.d.ts.map +1 -0
  28. package/esm/main/compiler.js +29 -0
  29. package/esm/main/compiler.js.map +1 -0
  30. package/esm/main/index.d.ts +1 -1
  31. package/esm/main/index.d.ts.map +1 -1
  32. package/esm/main/index.js +1 -1
  33. package/esm/main/provider.d.ts +2 -0
  34. package/esm/main/provider.d.ts.map +1 -1
  35. package/esm/main/provider.js +14 -27
  36. package/esm/main/provider.js.map +1 -1
  37. package/esm/preload/bridge.d.ts.map +1 -1
  38. package/esm/preload/bridge.js +7 -1
  39. package/esm/preload/bridge.js.map +1 -1
  40. package/main/callback-registry.d.ts +1 -0
  41. package/main/callback-registry.d.ts.map +1 -1
  42. package/main/callback-registry.js +24 -10
  43. package/main/callback-registry.js.map +1 -1
  44. package/main/compiler.d.ts +4 -0
  45. package/main/compiler.d.ts.map +1 -0
  46. package/main/compiler.js +30 -0
  47. package/main/compiler.js.map +1 -0
  48. package/main/index.d.ts +1 -1
  49. package/main/index.d.ts.map +1 -1
  50. package/main/index.js +2 -0
  51. package/main/index.js.map +1 -1
  52. package/main/provider.d.ts +2 -0
  53. package/main/provider.d.ts.map +1 -1
  54. package/main/provider.js +15 -26
  55. package/main/provider.js.map +1 -1
  56. package/package.json +5 -2
  57. package/preload/bridge.d.ts.map +1 -1
  58. package/preload/bridge.js +6 -0
  59. package/preload/bridge.js.map +1 -1
package/README.md CHANGED
@@ -18,6 +18,10 @@ npm add electron-wcap
18
18
 
19
19
  Requires **Electron** (peer dependency). Node 22+ and pnpm are recommended (see `volta` in `package.json`).
20
20
 
21
+ ## Example
22
+
23
+ - See [Web Applciation with theme swticher API](example/)
24
+
21
25
  ## Usage
22
26
 
23
27
  ### 1. Main process
@@ -80,6 +84,14 @@ The renderer can call the callback (possibly asynchronously); the call is sent t
80
84
  Returns a proxy that implements `ApiInterface` (and `Promisify<ApiInterface>` so methods are async). Each property access returns an async function that runs the corresponding method in the renderer via `webContents.executeJavaScript`.
81
85
  The proxy also has a readonly **`webContents`** property (the `WebContents` you passed in).
82
86
 
87
+ - **`removeAllCallbacks(apiProvider)`**
88
+ Removes all registered callbacks associated with this API provider (i.e. webContents).
89
+ Returns **`true`** if at least one callback was removed.
90
+
91
+ - **`removeCallback(apiProvider, name)`**
92
+ Removes registered callbacks associated with this API provider (i.e. webContents) and name.
93
+ Returns **`true`** if callback was removed.
94
+
83
95
  ### Preload (`electron-wcap/preload`)
84
96
 
85
97
  - **`enableCallbacks()`**
@@ -89,23 +101,13 @@ The renderer can call the callback (possibly asynchronously); the call is sent t
89
101
 
90
102
  - **Entry points**: Use `electron-wcap/main` in the main process and `electron-wcap/preload` in the preload script. Importing from `electron-wcap` alone throws an error that explains this.
91
103
  - **Callback names**: Callbacks you pass from main must be named (e.g. `function onData(x) { ... }`), not anonymous, so they can be registered and invoked by name.
92
- - **sandbox**: as Electron now deafult sandbox to `true`, you should disable sandoxing to use callbacks.
93
-
94
- ## Build
95
-
96
- From the repo:
97
-
98
- ```bash
99
- pnpm i
100
- pnpm build
101
- ```
104
+ - **Sandbox**: as Electron now deafult sandbox to `true`, you should disable sandoxing to use callbacks.
105
+ - **Reload webContents**: As the callback registry do not observes to webContents re/loading, you should manually drop and re-register callbacks after reloading or navigation.
102
106
 
103
- Output: `dist/` (CommonJS) and `dist/esm/` (ESM).
107
+ ## Develop
104
108
 
105
- ## Scripts
109
+ See [DEVELOP.md](./doc/DEVELOP.md).
106
110
 
107
- - `pnpm build` — Rollup build (CJS + ESM)
108
- - `pnpm lint` — Lint (editorconfig + ESLint)
109
111
 
110
112
  ## License
111
113
 
@@ -1,7 +1,7 @@
1
- export declare function unknownOptionsType(): Error;
2
1
  export declare function apiKeyNotExists(apiKey: string, webContentsId: number): Error;
3
2
  export declare function callbackNotRegistered(method: string, senderId: number): Error;
4
3
  export declare function nonInvocationRequest(): Error;
4
+ export declare function nonRemoveRequest(): Error;
5
5
  export declare function callbackWithoutName(): Error;
6
6
  export declare function callbackRegisteredAlready(callbackName: string, webContentsId: number): Error;
7
7
  export declare function bridgeNotRegistered(): Error;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/common/errors.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,IAAI,KAAK,CAE1C;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,KAAK,CAE5E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAE7E;AAED,wBAAgB,oBAAoB,IAAI,KAAK,CAE5C;AAED,wBAAgB,mBAAmB,IAAI,KAAK,CAE3C;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,KAAK,CAE5F;AAED,wBAAgB,mBAAmB,IAAI,KAAK,CAE3C;AAED,wBAAgB,cAAc,IAAI,KAAK,CAOtC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/common/errors.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,KAAK,CAE5E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAE7E;AAED,wBAAgB,oBAAoB,IAAI,KAAK,CAE5C;AAED,wBAAgB,gBAAgB,IAAI,KAAK,CAExC;AAED,wBAAgB,mBAAmB,IAAI,KAAK,CAE3C;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,KAAK,CAE5F;AAED,wBAAgB,mBAAmB,IAAI,KAAK,CAE3C;AAED,wBAAgB,cAAc,IAAI,KAAK,CAOtC"}
package/common/errors.js CHANGED
@@ -7,6 +7,9 @@ function callbackNotRegistered(method, senderId) {
7
7
  function nonInvocationRequest() {
8
8
  return Error('electron-wcap: got non callback invocation request');
9
9
  }
10
+ function nonRemoveRequest() {
11
+ return Error('electron-wcap: got non callback remove request');
12
+ }
10
13
  function callbackWithoutName() {
11
14
  return Error('electron-wcap: callback must have a name - use function decration syntax');
12
15
  }
@@ -32,4 +35,5 @@ exports.callbackRegisteredAlready = callbackRegisteredAlready;
32
35
  exports.callbackWithoutName = callbackWithoutName;
33
36
  exports.exportFromRoot = exportFromRoot;
34
37
  exports.nonInvocationRequest = nonInvocationRequest;
38
+ exports.nonRemoveRequest = nonRemoveRequest;
35
39
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sources":["../../src/common/errors.ts"],"sourcesContent":[null],"names":[],"mappings":"AAIM,SAAU,eAAe,CAAC,MAAc,EAAE,aAAqB,EAAA;IACpE,OAAO,KAAK,CAAC,CAAA,6BAAA,EAAiC,MAAO,sCAAuC,aAAc,CAAA,CAAA,CAAG,CAAC;AAC/G;AAEM,SAAU,qBAAqB,CAAC,MAAc,EAAE,QAAgB,EAAA;IACrE,OAAO,KAAK,CAAC,CAAA,yBAAA,EAA6B,MAAO,gCAAiC,QAAS,CAAA,CAAA,CAAG,CAAC;AAChG;SAEgB,oBAAoB,GAAA;AACnC,IAAA,OAAO,KAAK,CAAC,oDAAoD,CAAC;AACnE;SAEgB,mBAAmB,GAAA;AAClC,IAAA,OAAO,KAAK,CAAC,0EAA0E,CAAC;AACzF;AAEM,SAAU,yBAAyB,CAAC,YAAoB,EAAE,aAAqB,EAAA;IACpF,OAAO,KAAK,CAAC,CAAA,mCAAA,EAAuC,YAAa,yCAA0C,aAAc,CAAA,CAAA,CAAG,CAAC;AAC9H;SAEgB,mBAAmB,GAAA;AAClC,IAAA,OAAO,KAAK,CAAC,gGAAgG,CAAC;AAC/G;SAEgB,cAAc,GAAA;AAC7B,IAAA,OAAO,KAAK,CAAC,CAAA;;;;;AAKX,EAAA,CAAA,CAAC;AACJ;;;;;;;;;;"}
1
+ {"version":3,"file":"errors.js","sources":["../../src/common/errors.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAM,SAAU,eAAe,CAAC,MAAc,EAAE,aAAqB,EAAA;IACpE,OAAO,KAAK,CAAC,CAAA,6BAAA,EAAiC,MAAO,sCAAuC,aAAc,CAAA,CAAA,CAAG,CAAC;AAC/G;AAEM,SAAU,qBAAqB,CAAC,MAAc,EAAE,QAAgB,EAAA;IACrE,OAAO,KAAK,CAAC,CAAA,yBAAA,EAA6B,MAAO,gCAAiC,QAAS,CAAA,CAAA,CAAG,CAAC;AAChG;SAEgB,oBAAoB,GAAA;AACnC,IAAA,OAAO,KAAK,CAAC,oDAAoD,CAAC;AACnE;SAEgB,gBAAgB,GAAA;AAC/B,IAAA,OAAO,KAAK,CAAC,gDAAgD,CAAC;AAC/D;SAEgB,mBAAmB,GAAA;AAClC,IAAA,OAAO,KAAK,CAAC,0EAA0E,CAAC;AACzF;AAEM,SAAU,yBAAyB,CAAC,YAAoB,EAAE,aAAqB,EAAA;IACpF,OAAO,KAAK,CAAC,CAAA,mCAAA,EAAuC,YAAa,yCAA0C,aAAc,CAAA,CAAA,CAAG,CAAC;AAC9H;SAEgB,mBAAmB,GAAA;AAClC,IAAA,OAAO,KAAK,CAAC,gGAAgG,CAAC;AAC/G;SAEgB,cAAc,GAAA;AAC7B,IAAA,OAAO,KAAK,CAAC,CAAA;;;;;AAKX,EAAA,CAAA,CAAC;AACJ;;;;;;;;;;;"}
@@ -1,4 +1,5 @@
1
1
  export interface CallbackBridge {
2
2
  invoke(callbackName: string, ...args: unknown[]): unknown;
3
+ remove(callbackName: string): unknown;
3
4
  }
4
5
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/common/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;CAC1D"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/common/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC1D,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC"}
@@ -2,10 +2,15 @@ export interface CallbackInvokeRequest {
2
2
  method: string;
3
3
  args: unknown[];
4
4
  }
5
+ export interface CallbackRemoveRequest {
6
+ method: string;
7
+ }
5
8
  export interface DispatchedCallback {
6
9
  dispatchedCallbackName: string;
7
10
  }
8
11
  export declare function isCallbackInvokeRequest(msg: unknown): msg is CallbackInvokeRequest;
9
- export declare const BRIDGE_INVOKE_REQUEST_CHANNEL = "api-provider:bridge-request";
12
+ export declare function isCallbackRemoveRequest(msg: unknown): msg is CallbackRemoveRequest;
13
+ export declare const BRIDGE_INVOKE_REQUEST_CHANNEL = "electron-wcap:bridge-invoke-request";
14
+ export declare const BRIDGE_REMOVE_REQUEST_CHANNEL = "electron-wcap:bridge-remove-request";
10
15
  export declare const CALLBACK_BRIDGE_NAME = "__ElectronWCAPBridge__";
11
16
  //# sourceMappingURL=protocol.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/common/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IAClC,sBAAsB,EAAE,MAAM,CAAA;CAC9B;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,qBAAqB,CAMlF;AAED,eAAO,MAAM,6BAA6B,gCAAgC,CAAC;AAE3E,eAAO,MAAM,oBAAoB,2BAA2B,CAAC"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/common/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IAClC,sBAAsB,EAAE,MAAM,CAAA;CAC9B;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,qBAAqB,CAOlF;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,qBAAqB,CAKlF;AAED,eAAO,MAAM,6BAA6B,wCAAwC,CAAC;AACnF,eAAO,MAAM,6BAA6B,wCAAwC,CAAC;AAEnF,eAAO,MAAM,oBAAoB,2BAA2B,CAAC"}
@@ -1,13 +1,24 @@
1
1
  function isCallbackInvokeRequest(msg) {
2
- const mayBeRequest = msg;
3
- return mayBeRequest !== null &&
4
- typeof mayBeRequest.method === 'string' &&
5
- Array.isArray(mayBeRequest.args);
2
+ return msg !== null &&
3
+ typeof msg === 'object' &&
4
+ 'method' in msg &&
5
+ typeof msg.method === 'string' &&
6
+ 'args' in msg &&
7
+ Array.isArray(msg.args);
6
8
  }
7
- const BRIDGE_INVOKE_REQUEST_CHANNEL = 'api-provider:bridge-request';
9
+ function isCallbackRemoveRequest(msg) {
10
+ return msg !== null &&
11
+ typeof msg === 'object' &&
12
+ 'method' in msg &&
13
+ typeof msg.method === 'string';
14
+ }
15
+ const BRIDGE_INVOKE_REQUEST_CHANNEL = 'electron-wcap:bridge-invoke-request';
16
+ const BRIDGE_REMOVE_REQUEST_CHANNEL = 'electron-wcap:bridge-remove-request';
8
17
  const CALLBACK_BRIDGE_NAME = '__ElectronWCAPBridge__';
9
18
 
10
19
  exports.BRIDGE_INVOKE_REQUEST_CHANNEL = BRIDGE_INVOKE_REQUEST_CHANNEL;
20
+ exports.BRIDGE_REMOVE_REQUEST_CHANNEL = BRIDGE_REMOVE_REQUEST_CHANNEL;
11
21
  exports.CALLBACK_BRIDGE_NAME = CALLBACK_BRIDGE_NAME;
12
22
  exports.isCallbackInvokeRequest = isCallbackInvokeRequest;
23
+ exports.isCallbackRemoveRequest = isCallbackRemoveRequest;
13
24
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sources":["../../src/common/protocol.ts"],"sourcesContent":[null],"names":[],"mappings":"AASM,SAAU,uBAAuB,CAAC,GAAY,EAAA;IACnD,MAAM,YAAY,GAAG,GAA4B;IAEjD,OAAO,YAAY,KAAK,IAAI;AAC3B,QAAA,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ;AACvC,QAAA,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;AAClC;AAEO,MAAM,6BAA6B,GAAG;AAEtC,MAAM,oBAAoB,GAAG;;;;;;"}
1
+ {"version":3,"file":"protocol.js","sources":["../../src/common/protocol.ts"],"sourcesContent":[null],"names":[],"mappings":"AAaM,SAAU,uBAAuB,CAAC,GAAY,EAAA;IACnD,OAAO,GAAG,KAAK,IAAI;QAClB,OAAO,GAAG,KAAK,QAAQ;AACvB,QAAA,QAAQ,IAAI,GAAG;AACf,QAAA,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;AAC9B,QAAA,MAAM,IAAI,GAAG;AACb,QAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB;AAEM,SAAU,uBAAuB,CAAC,GAAY,EAAA;IACnD,OAAO,GAAG,KAAK,IAAI;QAClB,OAAO,GAAG,KAAK,QAAQ;AACvB,QAAA,QAAQ,IAAI,GAAG;AACf,QAAA,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;AAChC;AAEO,MAAM,6BAA6B,GAAG;AACtC,MAAM,6BAA6B,GAAG;AAEtC,MAAM,oBAAoB,GAAG;;;;;;;;"}
@@ -1,7 +1,7 @@
1
- export declare function unknownOptionsType(): Error;
2
1
  export declare function apiKeyNotExists(apiKey: string, webContentsId: number): Error;
3
2
  export declare function callbackNotRegistered(method: string, senderId: number): Error;
4
3
  export declare function nonInvocationRequest(): Error;
4
+ export declare function nonRemoveRequest(): Error;
5
5
  export declare function callbackWithoutName(): Error;
6
6
  export declare function callbackRegisteredAlready(callbackName: string, webContentsId: number): Error;
7
7
  export declare function bridgeNotRegistered(): Error;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/common/errors.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,IAAI,KAAK,CAE1C;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,KAAK,CAE5E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAE7E;AAED,wBAAgB,oBAAoB,IAAI,KAAK,CAE5C;AAED,wBAAgB,mBAAmB,IAAI,KAAK,CAE3C;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,KAAK,CAE5F;AAED,wBAAgB,mBAAmB,IAAI,KAAK,CAE3C;AAED,wBAAgB,cAAc,IAAI,KAAK,CAOtC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/common/errors.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,KAAK,CAE5E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAE7E;AAED,wBAAgB,oBAAoB,IAAI,KAAK,CAE5C;AAED,wBAAgB,gBAAgB,IAAI,KAAK,CAExC;AAED,wBAAgB,mBAAmB,IAAI,KAAK,CAE3C;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,KAAK,CAE5F;AAED,wBAAgB,mBAAmB,IAAI,KAAK,CAE3C;AAED,wBAAgB,cAAc,IAAI,KAAK,CAOtC"}
@@ -7,6 +7,9 @@ function callbackNotRegistered(method, senderId) {
7
7
  function nonInvocationRequest() {
8
8
  return Error('electron-wcap: got non callback invocation request');
9
9
  }
10
+ function nonRemoveRequest() {
11
+ return Error('electron-wcap: got non callback remove request');
12
+ }
10
13
  function callbackWithoutName() {
11
14
  return Error('electron-wcap: callback must have a name - use function decration syntax');
12
15
  }
@@ -25,5 +28,5 @@ function exportFromRoot() {
25
28
  `);
26
29
  }
27
30
 
28
- export { apiKeyNotExists, bridgeNotRegistered, callbackNotRegistered, callbackRegisteredAlready, callbackWithoutName, exportFromRoot, nonInvocationRequest };
31
+ export { apiKeyNotExists, bridgeNotRegistered, callbackNotRegistered, callbackRegisteredAlready, callbackWithoutName, exportFromRoot, nonInvocationRequest, nonRemoveRequest };
29
32
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sources":["../../../../src/common/errors.ts"],"sourcesContent":[null],"names":[],"mappings":"AAIM,SAAU,eAAe,CAAC,MAAc,EAAE,aAAqB,EAAA;IACpE,OAAO,KAAK,CAAC,CAAA,6BAAA,EAAiC,MAAO,sCAAuC,aAAc,CAAA,CAAA,CAAG,CAAC;AAC/G;AAEM,SAAU,qBAAqB,CAAC,MAAc,EAAE,QAAgB,EAAA;IACrE,OAAO,KAAK,CAAC,CAAA,yBAAA,EAA6B,MAAO,gCAAiC,QAAS,CAAA,CAAA,CAAG,CAAC;AAChG;SAEgB,oBAAoB,GAAA;AACnC,IAAA,OAAO,KAAK,CAAC,oDAAoD,CAAC;AACnE;SAEgB,mBAAmB,GAAA;AAClC,IAAA,OAAO,KAAK,CAAC,0EAA0E,CAAC;AACzF;AAEM,SAAU,yBAAyB,CAAC,YAAoB,EAAE,aAAqB,EAAA;IACpF,OAAO,KAAK,CAAC,CAAA,mCAAA,EAAuC,YAAa,yCAA0C,aAAc,CAAA,CAAA,CAAG,CAAC;AAC9H;SAEgB,mBAAmB,GAAA;AAClC,IAAA,OAAO,KAAK,CAAC,gGAAgG,CAAC;AAC/G;SAEgB,cAAc,GAAA;AAC7B,IAAA,OAAO,KAAK,CAAC,CAAA;;;;;AAKX,EAAA,CAAA,CAAC;AACJ;;;;"}
1
+ {"version":3,"file":"errors.js","sources":["../../../../src/common/errors.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAM,SAAU,eAAe,CAAC,MAAc,EAAE,aAAqB,EAAA;IACpE,OAAO,KAAK,CAAC,CAAA,6BAAA,EAAiC,MAAO,sCAAuC,aAAc,CAAA,CAAA,CAAG,CAAC;AAC/G;AAEM,SAAU,qBAAqB,CAAC,MAAc,EAAE,QAAgB,EAAA;IACrE,OAAO,KAAK,CAAC,CAAA,yBAAA,EAA6B,MAAO,gCAAiC,QAAS,CAAA,CAAA,CAAG,CAAC;AAChG;SAEgB,oBAAoB,GAAA;AACnC,IAAA,OAAO,KAAK,CAAC,oDAAoD,CAAC;AACnE;SAEgB,gBAAgB,GAAA;AAC/B,IAAA,OAAO,KAAK,CAAC,gDAAgD,CAAC;AAC/D;SAEgB,mBAAmB,GAAA;AAClC,IAAA,OAAO,KAAK,CAAC,0EAA0E,CAAC;AACzF;AAEM,SAAU,yBAAyB,CAAC,YAAoB,EAAE,aAAqB,EAAA;IACpF,OAAO,KAAK,CAAC,CAAA,mCAAA,EAAuC,YAAa,yCAA0C,aAAc,CAAA,CAAA,CAAG,CAAC;AAC9H;SAEgB,mBAAmB,GAAA;AAClC,IAAA,OAAO,KAAK,CAAC,gGAAgG,CAAC;AAC/G;SAEgB,cAAc,GAAA;AAC7B,IAAA,OAAO,KAAK,CAAC,CAAA;;;;;AAKX,EAAA,CAAA,CAAC;AACJ;;;;"}
@@ -1,4 +1,5 @@
1
1
  export interface CallbackBridge {
2
2
  invoke(callbackName: string, ...args: unknown[]): unknown;
3
+ remove(callbackName: string): unknown;
3
4
  }
4
5
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/common/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;CAC1D"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/common/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC1D,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC"}
@@ -2,10 +2,15 @@ export interface CallbackInvokeRequest {
2
2
  method: string;
3
3
  args: unknown[];
4
4
  }
5
+ export interface CallbackRemoveRequest {
6
+ method: string;
7
+ }
5
8
  export interface DispatchedCallback {
6
9
  dispatchedCallbackName: string;
7
10
  }
8
11
  export declare function isCallbackInvokeRequest(msg: unknown): msg is CallbackInvokeRequest;
9
- export declare const BRIDGE_INVOKE_REQUEST_CHANNEL = "api-provider:bridge-request";
12
+ export declare function isCallbackRemoveRequest(msg: unknown): msg is CallbackRemoveRequest;
13
+ export declare const BRIDGE_INVOKE_REQUEST_CHANNEL = "electron-wcap:bridge-invoke-request";
14
+ export declare const BRIDGE_REMOVE_REQUEST_CHANNEL = "electron-wcap:bridge-remove-request";
10
15
  export declare const CALLBACK_BRIDGE_NAME = "__ElectronWCAPBridge__";
11
16
  //# sourceMappingURL=protocol.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/common/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IAClC,sBAAsB,EAAE,MAAM,CAAA;CAC9B;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,qBAAqB,CAMlF;AAED,eAAO,MAAM,6BAA6B,gCAAgC,CAAC;AAE3E,eAAO,MAAM,oBAAoB,2BAA2B,CAAC"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/common/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IAClC,sBAAsB,EAAE,MAAM,CAAA;CAC9B;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,qBAAqB,CAOlF;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,qBAAqB,CAKlF;AAED,eAAO,MAAM,6BAA6B,wCAAwC,CAAC;AACnF,eAAO,MAAM,6BAA6B,wCAAwC,CAAC;AAEnF,eAAO,MAAM,oBAAoB,2BAA2B,CAAC"}
@@ -1,11 +1,20 @@
1
1
  function isCallbackInvokeRequest(msg) {
2
- const mayBeRequest = msg;
3
- return mayBeRequest !== null &&
4
- typeof mayBeRequest.method === 'string' &&
5
- Array.isArray(mayBeRequest.args);
2
+ return msg !== null &&
3
+ typeof msg === 'object' &&
4
+ 'method' in msg &&
5
+ typeof msg.method === 'string' &&
6
+ 'args' in msg &&
7
+ Array.isArray(msg.args);
6
8
  }
7
- const BRIDGE_INVOKE_REQUEST_CHANNEL = 'api-provider:bridge-request';
9
+ function isCallbackRemoveRequest(msg) {
10
+ return msg !== null &&
11
+ typeof msg === 'object' &&
12
+ 'method' in msg &&
13
+ typeof msg.method === 'string';
14
+ }
15
+ const BRIDGE_INVOKE_REQUEST_CHANNEL = 'electron-wcap:bridge-invoke-request';
16
+ const BRIDGE_REMOVE_REQUEST_CHANNEL = 'electron-wcap:bridge-remove-request';
8
17
  const CALLBACK_BRIDGE_NAME = '__ElectronWCAPBridge__';
9
18
 
10
- export { BRIDGE_INVOKE_REQUEST_CHANNEL, CALLBACK_BRIDGE_NAME, isCallbackInvokeRequest };
19
+ export { BRIDGE_INVOKE_REQUEST_CHANNEL, BRIDGE_REMOVE_REQUEST_CHANNEL, CALLBACK_BRIDGE_NAME, isCallbackInvokeRequest, isCallbackRemoveRequest };
11
20
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sources":["../../../../src/common/protocol.ts"],"sourcesContent":[null],"names":[],"mappings":"AASM,SAAU,uBAAuB,CAAC,GAAY,EAAA;IACnD,MAAM,YAAY,GAAG,GAA4B;IAEjD,OAAO,YAAY,KAAK,IAAI;AAC3B,QAAA,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ;AACvC,QAAA,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;AAClC;AAEO,MAAM,6BAA6B,GAAG;AAEtC,MAAM,oBAAoB,GAAG;;;;"}
1
+ {"version":3,"file":"protocol.js","sources":["../../../../src/common/protocol.ts"],"sourcesContent":[null],"names":[],"mappings":"AAaM,SAAU,uBAAuB,CAAC,GAAY,EAAA;IACnD,OAAO,GAAG,KAAK,IAAI;QAClB,OAAO,GAAG,KAAK,QAAQ;AACvB,QAAA,QAAQ,IAAI,GAAG;AACf,QAAA,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;AAC9B,QAAA,MAAM,IAAI,GAAG;AACb,QAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB;AAEM,SAAU,uBAAuB,CAAC,GAAY,EAAA;IACnD,OAAO,GAAG,KAAK,IAAI;QAClB,OAAO,GAAG,KAAK,QAAQ;AACvB,QAAA,QAAQ,IAAI,GAAG;AACf,QAAA,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;AAChC;AAEO,MAAM,6BAA6B,GAAG;AACtC,MAAM,6BAA6B,GAAG;AAEtC,MAAM,oBAAoB,GAAG;;;;"}
@@ -4,6 +4,7 @@ export declare class CallbackRegistry {
4
4
  constructor();
5
5
  registerCallback(webContents: WebContents, callback: (...args: unknown[]) => unknown): string;
6
6
  unregisterCallback(hostId: number, name: string): boolean;
7
+ unregisterAll(hostId: number): boolean;
7
8
  private watchForHost;
8
9
  }
9
10
  export declare function globalCallbacksRegistry(): CallbackRegistry;
@@ -1 +1 @@
1
- {"version":3,"file":"callback-registry.d.ts","sourceRoot":"","sources":["../../../src/main/callback-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,WAAW,EAAE,MAAM,UAAU,CAAC;AAKhD,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmE;;IAoB7F,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,MAAM;IAoB7F,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAUzD,OAAO,CAAC,YAAY;CAKpB;AAID,wBAAgB,uBAAuB,IAAI,gBAAgB,CAM1D"}
1
+ {"version":3,"file":"callback-registry.d.ts","sourceRoot":"","sources":["../../../src/main/callback-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,WAAW,EAAE,MAAM,UAAU,CAAC;AAKhD,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmE;;IA6B7F,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,MAAM;IAoB7F,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAgBzD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItC,OAAO,CAAC,YAAY;CAKpB;AAID,wBAAgB,uBAAuB,IAAI,gBAAgB,CAM1D"}
@@ -1,21 +1,28 @@
1
1
  import { ipcMain } from 'electron';
2
- import { BRIDGE_INVOKE_REQUEST_CHANNEL, isCallbackInvokeRequest } from '../common/protocol.js';
3
- import { callbackNotRegistered, nonInvocationRequest, callbackWithoutName, callbackRegisteredAlready } from '../common/errors.js';
2
+ import { nonInvocationRequest, callbackNotRegistered, nonRemoveRequest, callbackWithoutName, callbackRegisteredAlready } from '../common/errors.js';
3
+ import { BRIDGE_INVOKE_REQUEST_CHANNEL, isCallbackInvokeRequest, BRIDGE_REMOVE_REQUEST_CHANNEL, isCallbackRemoveRequest } from '../common/protocol.js';
4
4
 
5
5
  class CallbackRegistry {
6
6
  callbacks = new Map();
7
7
  constructor() {
8
8
  ipcMain.on(BRIDGE_INVOKE_REQUEST_CHANNEL, (event, msg) => {
9
- if (isCallbackInvokeRequest(msg)) {
10
- const callback = this.callbacks.get(event.sender.id)?.get(msg.method);
11
- if (!callback) {
12
- console.error(callbackNotRegistered(msg.method, event.sender.id));
13
- return;
14
- }
15
- event.returnValue = callback?.(...msg.args);
9
+ if (!isCallbackInvokeRequest(msg)) {
10
+ console.error(nonInvocationRequest());
16
11
  return;
17
12
  }
18
- console.error(nonInvocationRequest());
13
+ const callback = this.callbacks.get(event.sender.id)?.get(msg.method);
14
+ if (!callback) {
15
+ console.error(callbackNotRegistered(msg.method, event.sender.id));
16
+ return;
17
+ }
18
+ event.returnValue = callback(...msg.args);
19
+ });
20
+ ipcMain.on(BRIDGE_REMOVE_REQUEST_CHANNEL, (event, msg) => {
21
+ if (!isCallbackRemoveRequest(msg)) {
22
+ console.error(nonRemoveRequest());
23
+ return;
24
+ }
25
+ event.returnValue = this.unregisterCallback(event.sender.id, msg.method);
19
26
  });
20
27
  }
21
28
  registerCallback(webContents, callback) {
@@ -39,7 +46,14 @@ class CallbackRegistry {
39
46
  if (!callbacksByIdBucket) {
40
47
  return false;
41
48
  }
42
- return callbacksByIdBucket.delete(name);
49
+ const deleted = callbacksByIdBucket.delete(name);
50
+ if (!callbacksByIdBucket.size) {
51
+ this.callbacks.delete(hostId);
52
+ }
53
+ return deleted;
54
+ }
55
+ unregisterAll(hostId) {
56
+ return this.callbacks.delete(hostId);
43
57
  }
44
58
  watchForHost(webContents) {
45
59
  webContents.once('destroyed', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"callback-registry.js","sources":["../../../../src/main/callback-registry.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;MAKa,gBAAgB,CAAA;AACX,IAAA,SAAS,GAAG,IAAI,GAAG,EAAwD;AAE5F,IAAA,WAAA,GAAA;QACC,OAAO,CAAC,EAAE,CAAC,6BAA6B,EAAE,CAAC,KAA4B,EAAE,GAAY,KAAI;AACxF,YAAA,IAAI,uBAAuB,CAAC,GAAG,CAAC,EAAE;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;gBAErE,IAAI,CAAC,QAAQ,EAAE;AACd,oBAAA,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACjE;gBACD;gBAEA,KAAK,CAAC,WAAW,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;gBAC3C;YACD;AAEA,YAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC;AACtC,QAAA,CAAC,CAAC;IACH;IAEA,gBAAgB,CAAC,WAAwB,EAAE,QAAyC,EAAA;AACnF,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YACnB,MAAM,mBAAmB,EAAE;QAC5B;AAEA,QAAA,IAAI,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,mBAAmB,EAAE;AACzB,YAAA,mBAAmB,GAAG,IAAI,GAAG,EAA2C;YACxE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,mBAAmB,CAAC;AACvD,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;QAC/B;QAEA,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAC3C,MAAM,yBAAyB,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QAC/D;QAEA,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QAChD,OAAO,QAAQ,CAAC,IAAI;IACrB;IAEA,kBAAkB,CAAC,MAAc,EAAE,IAAY,EAAA;QAC9C,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;QAEtD,IAAI,CAAC,mBAAmB,EAAE;AACzB,YAAA,OAAO,KAAK;QACb;AAEA,QAAA,OAAO,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC;IACxC;AAEQ,IAAA,YAAY,CAAC,WAAwB,EAAA;AAC5C,QAAA,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,MAAK;YAClC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;AACtC,QAAA,CAAC,CAAC;IACH;AACA;AAED,IAAI,gBAAgB,GAA4B,IAAI;SAEpC,uBAAuB,GAAA;IACtC,IAAI,CAAC,gBAAgB,EAAE;AACtB,QAAA,gBAAgB,GAAG,IAAI,gBAAgB,EAAE;IAC1C;AAEA,IAAA,OAAO,gBAAgB;AACxB;;;;"}
1
+ {"version":3,"file":"callback-registry.js","sources":["../../../../src/main/callback-registry.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { CallbackRegistry } from './callback-registry';
2
+ export declare function compileInvoke<P extends unknown[]>(registry: CallbackRegistry, webContents: Electron.WebContents, apiKey: string, method: string, args: P): string;
3
+ export declare function compile<P extends unknown[]>(fn: (..._: P) => unknown, ...args: P): string;
4
+ //# sourceMappingURL=compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../../src/main/compiler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,wBAAgB,aAAa,CAAC,CAAC,SAAS,OAAO,EAAE,EAChD,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,QAAQ,CAAC,WAAW,EACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,CAAC,GAAG,MAAM,CAEhB;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAEzF"}
@@ -0,0 +1,29 @@
1
+ import { invoke } from './injectable.js';
2
+
3
+ function compileInvoke(registry, webContents, apiKey, method, args) {
4
+ return `(${invoke.toString()})("${apiKey}","${method}",[${serializeArguments(registry, webContents, args)}])`;
5
+ }
6
+ function compile(fn, ...args) {
7
+ return `(${fn.toString()})(${serializeArgumentsRaw(args)})`;
8
+ }
9
+ function serializeArguments(registry, webContents, args) {
10
+ const serialized = args.map((arg, index) => {
11
+ if (typeof arg === 'function') {
12
+ const dispatched = {
13
+ dispatchedCallbackName: registry.registerCallback(webContents, arg)
14
+ };
15
+ args[index] = dispatched;
16
+ }
17
+ return JSON.stringify(args[index]);
18
+ });
19
+ return serialized.join(',');
20
+ }
21
+ function serializeArgumentsRaw(...args) {
22
+ const serialized = args.map((arg) => {
23
+ return JSON.stringify(arg);
24
+ });
25
+ return serialized.join(',');
26
+ }
27
+
28
+ export { compile, compileInvoke };
29
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sources":["../../../../src/main/compiler.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIM,SAAU,aAAa,CAC5B,QAA0B,EAC1B,WAAiC,EACjC,MAAc,EACd,MAAc,EACd,IAAO,EAAA;AACP,IAAA,OAAO,IAAK,MAAM,CAAC,QAAQ,EAAG,CAAA,GAAA,EAAO,MAAO,CAAA,GAAA,EAAO,MAAO,MAAO,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAE,IAAI;AACtH;SAEgB,OAAO,CAAsB,EAAwB,EAAE,GAAG,IAAO,EAAA;IAChF,OAAO,CAAA,CAAA,EAAK,EAAE,CAAC,QAAQ,EAAG,CAAA,EAAA,EAAM,qBAAqB,CAAC,IAAI,CAAE,CAAA,CAAA,CAAG;AAChE;AAEA,SAAS,kBAAkB,CAAC,QAA0B,EAAE,WAAiC,EAAE,IAAe,EAAA;IACzG,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,KAAa,KAAI;AAC3D,QAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;AAC9B,YAAA,MAAM,UAAU,GAAuB;gBACtC,sBAAsB,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,GAAmC;aAClG;AAED,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,UAAU;QACzB;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnC,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AAC5B;AAEA,SAAS,qBAAqB,CAAC,GAAG,IAAe,EAAA;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAY,KAAI;AAC5C,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AAC3B,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AAC5B;;;;"}
@@ -1,3 +1,3 @@
1
- export { createApiProvider } from './provider';
1
+ export { createApiProvider, removeAllCallbacks, removeCallback } from './provider';
2
2
  export type { WebContentsApiProvider } from './provider';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/main/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/main/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnF,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC"}
package/esm/main/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { createApiProvider } from './provider.js';
1
+ export { createApiProvider, removeAllCallbacks, removeCallback } from './provider.js';
2
2
  //# sourceMappingURL=index.js.map
@@ -4,4 +4,6 @@ export type WebContentsApiProvider<T> = Promisify<T> & {
4
4
  readonly webContents: WebContents;
5
5
  };
6
6
  export declare function createApiProvider<ApiInterface>(webContents: WebContents, apiKey: string): WebContentsApiProvider<ApiInterface>;
7
+ export declare function removeAllCallbacks<T>(apiProvider: WebContentsApiProvider<T>): boolean;
8
+ export declare function removeCallback<T>(apiProvider: WebContentsApiProvider<T>, name: string): boolean;
7
9
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/main/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;CAAE,CAAC;AAmE7F,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAS9H"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/main/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;CAAE,CAAC;AA+C7F,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAS9H;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,OAAO,CAErF;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/F"}
@@ -1,6 +1,7 @@
1
- import { globalCallbacksRegistry } from './callback-registry.js';
2
- import { apiExists, invoke } from './injectable.js';
3
1
  import { apiKeyNotExists } from '../common/errors.js';
2
+ import { globalCallbacksRegistry } from './callback-registry.js';
3
+ import { compile, compileInvoke } from './compiler.js';
4
+ import { apiExists } from './injectable.js';
4
5
 
5
6
  class ApiProviderPropertiesHandler {
6
7
  webContents;
@@ -11,26 +12,6 @@ class ApiProviderPropertiesHandler {
11
12
  this.apiKey = apiKey;
12
13
  this.callbackRegistry = callbackRegistry;
13
14
  }
14
- compile(fn, ...args) {
15
- return `(${fn.toString()})(${this.serializeArguments(...args)})`;
16
- }
17
- ;
18
- serializeArguments(...args) {
19
- const serialized = args.map((arg) => {
20
- if (Array.isArray(arg)) {
21
- arg.forEach((value, index) => {
22
- if (typeof value === 'function') {
23
- const dispatched = {
24
- dispatchedCallbackName: this.callbackRegistry.registerCallback(this.webContents, value)
25
- };
26
- arg[index] = dispatched;
27
- }
28
- });
29
- }
30
- return JSON.stringify(arg);
31
- });
32
- return serialized.join(',');
33
- }
34
15
  }
35
16
  class ApiProviderProxyHandler {
36
17
  apiExistsAwaiter;
@@ -46,14 +27,14 @@ class ApiProviderProxyHandler {
46
27
  if (propertyProxy) {
47
28
  return propertyProxy;
48
29
  }
49
- const apiExistsClosure = this.apiExistsAwaiter;
30
+ const apiExistsAwaiterClosure = this.apiExistsAwaiter;
50
31
  // proxy context must be a function, to allow using handler 'apply'.
51
32
  const propProxy = new Proxy(() => { }, {
52
33
  async apply(_target, this_, args) {
53
- if (!(await apiExistsClosure)) {
34
+ if (!(await apiExistsAwaiterClosure)) {
54
35
  throw apiKeyNotExists(this_.apiKey, this_.webContents.id);
55
36
  }
56
- const injectable = this_.compile(invoke, this_.apiKey, propertyKey, args);
37
+ const injectable = compileInvoke(globalCallbacksRegistry(), this_.webContents, this_.apiKey, propertyKey, args);
57
38
  return this_.webContents.executeJavaScript(injectable);
58
39
  },
59
40
  });
@@ -63,11 +44,17 @@ class ApiProviderProxyHandler {
63
44
  }
64
45
  function createApiProvider(webContents, apiKey) {
65
46
  const propertiesHandler = new ApiProviderPropertiesHandler(webContents, apiKey, globalCallbacksRegistry());
66
- const checkApiExistsInjectable = propertiesHandler.compile(apiExists, apiKey);
47
+ const checkApiExistsInjectable = compile(apiExists, apiKey);
67
48
  const checkApiExistsPromise = webContents.executeJavaScript(checkApiExistsInjectable);
68
49
  const proxyHandler = new ApiProviderProxyHandler(checkApiExistsPromise);
69
50
  return new Proxy(propertiesHandler, proxyHandler);
70
51
  }
52
+ function removeAllCallbacks(apiProvider) {
53
+ return globalCallbacksRegistry().unregisterAll(apiProvider.webContents.id);
54
+ }
55
+ function removeCallback(apiProvider, name) {
56
+ return globalCallbacksRegistry().unregisterCallback(apiProvider.webContents.id, name);
57
+ }
71
58
 
72
- export { createApiProvider };
59
+ export { createApiProvider, removeAllCallbacks, removeCallback };
73
60
  //# sourceMappingURL=provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sources":["../../../../src/main/provider.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sources":["../../../../src/main/provider.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAUA,MAAM,4BAA4B,CAAA;AAEvB,IAAA,WAAA;AACA,IAAA,MAAA;AACA,IAAA,gBAAA;AAHV,IAAA,WAAA,CACU,WAAwB,EACxB,MAAc,EACd,gBAAkC,EAAA;QAFlC,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;IACvB;AACH;AAED,MAAM,uBAAuB,CAAA;AAGC,IAAA,gBAAA;IAFZ,UAAU,GAA4B,EAAE;AAEzD,IAAA,WAAA,CAA6B,gBAAkC,EAAA;QAAlC,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;IAAqB;IAElE,GAAG,CAAC,OAAqC,EAAE,WAA+C,EAAA;AACzF,QAAA,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,UAAU,EAAE;AACtF,YAAA,OAAO,OAAO,CAAC,WAAW,CAAC;QAC5B;QAEA,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAElD,IAAI,aAAa,EAAE;AAClB,YAAA,OAAO,aAAa;QACrB;AAEA,QAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,gBAAgB;;QAGrD,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,MAAK,EAAE,CAAC,EAAE;AACrC,YAAA,MAAM,KAAK,CAAC,OAAgB,EAAE,KAAmC,EAAE,IAAe,EAAA;AACjF,gBAAA,IAAI,EAAE,MAAM,uBAAuB,CAAC,EAAE;AACrC,oBAAA,MAAM,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1D;AAEA,gBAAA,MAAM,UAAU,GAAG,aAAa,CAAC,uBAAuB,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC;gBAE/G,OAAO,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC;YACvD,CAAC;AACD,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,SAAS;AAExC,QAAA,OAAO,SAAS;IACjB;AACA;AAEK,SAAU,iBAAiB,CAAe,WAAwB,EAAE,MAAc,EAAA;AACvF,IAAA,MAAM,iBAAiB,GAAG,IAAI,4BAA4B,CAAC,WAAW,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAE1G,MAAM,wBAAwB,GAAG,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3D,MAAM,qBAAqB,GAAG,WAAW,CAAC,iBAAiB,CAAC,wBAAwB,CAAqB;AAEzG,IAAA,MAAM,YAAY,GAAG,IAAI,uBAAuB,CAAC,qBAAqB,CAAC;AAEvE,IAAA,OAAO,IAAI,KAAK,CAAC,iBAAiB,EAAE,YAAY,CAAyC;AAC1F;AAEM,SAAU,kBAAkB,CAAI,WAAsC,EAAA;IAC3E,OAAO,uBAAuB,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;AAC3E;AAEM,SAAU,cAAc,CAAI,WAAsC,EAAE,IAAY,EAAA;AACrF,IAAA,OAAO,uBAAuB,EAAE,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC;AACtF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../../src/preload/bridge.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,IAAI,IAAI,CAWtC"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../../src/preload/bridge.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,IAAI,IAAI,CAkBtC"}
@@ -1,5 +1,5 @@
1
1
  import { contextBridge, ipcRenderer } from 'electron';
2
- import { CALLBACK_BRIDGE_NAME, BRIDGE_INVOKE_REQUEST_CHANNEL } from '../common/protocol.js';
2
+ import { CALLBACK_BRIDGE_NAME, BRIDGE_REMOVE_REQUEST_CHANNEL, BRIDGE_INVOKE_REQUEST_CHANNEL } from '../common/protocol.js';
3
3
 
4
4
  function enableCallbacks() {
5
5
  contextBridge.exposeInMainWorld(CALLBACK_BRIDGE_NAME, {
@@ -9,6 +9,12 @@ function enableCallbacks() {
9
9
  args
10
10
  };
11
11
  return ipcRenderer.sendSync(BRIDGE_INVOKE_REQUEST_CHANNEL, invokeRequest);
12
+ },
13
+ remove(callbackName) {
14
+ const removeRequest = {
15
+ method: callbackName,
16
+ };
17
+ return ipcRenderer.sendSync(BRIDGE_REMOVE_REQUEST_CHANNEL, removeRequest);
12
18
  }
13
19
  });
14
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","sources":["../../../../src/preload/bridge.ts"],"sourcesContent":[null],"names":[],"mappings":";;;SAIgB,eAAe,GAAA;AAC9B,IAAA,aAAa,CAAC,iBAAiB,CAAC,oBAAoB,EAAE;QACrD,MAAM,CAAC,YAAoB,EAAE,IAAe,EAAA;AAC3C,YAAA,MAAM,aAAa,GAA0B;AAC5C,gBAAA,MAAM,EAAE,YAAY;gBACpB;aACA;YAED,OAAO,WAAW,CAAC,QAAQ,CAAC,6BAA6B,EAAE,aAAa,CAAC;QAC1E;AACA,KAAA,CAAC;AACH;;;;"}
1
+ {"version":3,"file":"bridge.js","sources":["../../../../src/preload/bridge.ts"],"sourcesContent":[null],"names":[],"mappings":";;;SAIgB,eAAe,GAAA;AAC9B,IAAA,aAAa,CAAC,iBAAiB,CAAC,oBAAoB,EAAE;QACrD,MAAM,CAAC,YAAoB,EAAE,IAAe,EAAA;AAC3C,YAAA,MAAM,aAAa,GAA0B;AAC5C,gBAAA,MAAM,EAAE,YAAY;gBACpB;aACA;YAED,OAAO,WAAW,CAAC,QAAQ,CAAC,6BAA6B,EAAE,aAAa,CAAC;QAC1E,CAAC;AACD,QAAA,MAAM,CAAC,YAAoB,EAAA;AAC1B,YAAA,MAAM,aAAa,GAA0B;AAC5C,gBAAA,MAAM,EAAE,YAAY;aACpB;YAED,OAAO,WAAW,CAAC,QAAQ,CAAC,6BAA6B,EAAE,aAAa,CAAC;QAC1E;AACA,KAAA,CAAC;AACH;;;;"}
@@ -4,6 +4,7 @@ export declare class CallbackRegistry {
4
4
  constructor();
5
5
  registerCallback(webContents: WebContents, callback: (...args: unknown[]) => unknown): string;
6
6
  unregisterCallback(hostId: number, name: string): boolean;
7
+ unregisterAll(hostId: number): boolean;
7
8
  private watchForHost;
8
9
  }
9
10
  export declare function globalCallbacksRegistry(): CallbackRegistry;
@@ -1 +1 @@
1
- {"version":3,"file":"callback-registry.d.ts","sourceRoot":"","sources":["../../src/main/callback-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,WAAW,EAAE,MAAM,UAAU,CAAC;AAKhD,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmE;;IAoB7F,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,MAAM;IAoB7F,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAUzD,OAAO,CAAC,YAAY;CAKpB;AAID,wBAAgB,uBAAuB,IAAI,gBAAgB,CAM1D"}
1
+ {"version":3,"file":"callback-registry.d.ts","sourceRoot":"","sources":["../../src/main/callback-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,WAAW,EAAE,MAAM,UAAU,CAAC;AAKhD,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmE;;IA6B7F,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,MAAM;IAoB7F,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAgBzD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItC,OAAO,CAAC,YAAY;CAKpB;AAID,wBAAgB,uBAAuB,IAAI,gBAAgB,CAM1D"}
@@ -1,21 +1,28 @@
1
1
  const electron = require('electron');
2
- const protocol = require('../common/protocol.js');
3
2
  const errors = require('../common/errors.js');
3
+ const protocol = require('../common/protocol.js');
4
4
 
5
5
  class CallbackRegistry {
6
6
  callbacks = new Map();
7
7
  constructor() {
8
8
  electron.ipcMain.on(protocol.BRIDGE_INVOKE_REQUEST_CHANNEL, (event, msg) => {
9
- if (protocol.isCallbackInvokeRequest(msg)) {
10
- const callback = this.callbacks.get(event.sender.id)?.get(msg.method);
11
- if (!callback) {
12
- console.error(errors.callbackNotRegistered(msg.method, event.sender.id));
13
- return;
14
- }
15
- event.returnValue = callback?.(...msg.args);
9
+ if (!protocol.isCallbackInvokeRequest(msg)) {
10
+ console.error(errors.nonInvocationRequest());
16
11
  return;
17
12
  }
18
- console.error(errors.nonInvocationRequest());
13
+ const callback = this.callbacks.get(event.sender.id)?.get(msg.method);
14
+ if (!callback) {
15
+ console.error(errors.callbackNotRegistered(msg.method, event.sender.id));
16
+ return;
17
+ }
18
+ event.returnValue = callback(...msg.args);
19
+ });
20
+ electron.ipcMain.on(protocol.BRIDGE_REMOVE_REQUEST_CHANNEL, (event, msg) => {
21
+ if (!protocol.isCallbackRemoveRequest(msg)) {
22
+ console.error(errors.nonRemoveRequest());
23
+ return;
24
+ }
25
+ event.returnValue = this.unregisterCallback(event.sender.id, msg.method);
19
26
  });
20
27
  }
21
28
  registerCallback(webContents, callback) {
@@ -39,7 +46,14 @@ class CallbackRegistry {
39
46
  if (!callbacksByIdBucket) {
40
47
  return false;
41
48
  }
42
- return callbacksByIdBucket.delete(name);
49
+ const deleted = callbacksByIdBucket.delete(name);
50
+ if (!callbacksByIdBucket.size) {
51
+ this.callbacks.delete(hostId);
52
+ }
53
+ return deleted;
54
+ }
55
+ unregisterAll(hostId) {
56
+ return this.callbacks.delete(hostId);
43
57
  }
44
58
  watchForHost(webContents) {
45
59
  webContents.once('destroyed', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"callback-registry.js","sources":["../../src/main/callback-registry.ts"],"sourcesContent":[null],"names":["ipcMain","BRIDGE_INVOKE_REQUEST_CHANNEL","isCallbackInvokeRequest","callbackNotRegistered","nonInvocationRequest","callbackWithoutName","callbackRegisteredAlready"],"mappings":";;;;MAKa,gBAAgB,CAAA;AACX,IAAA,SAAS,GAAG,IAAI,GAAG,EAAwD;AAE5F,IAAA,WAAA,GAAA;QACCA,gBAAO,CAAC,EAAE,CAACC,sCAA6B,EAAE,CAAC,KAA4B,EAAE,GAAY,KAAI;AACxF,YAAA,IAAIC,gCAAuB,CAAC,GAAG,CAAC,EAAE;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;gBAErE,IAAI,CAAC,QAAQ,EAAE;AACd,oBAAA,OAAO,CAAC,KAAK,CAACC,4BAAqB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACjE;gBACD;gBAEA,KAAK,CAAC,WAAW,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;gBAC3C;YACD;AAEA,YAAA,OAAO,CAAC,KAAK,CAACC,2BAAoB,EAAE,CAAC;AACtC,QAAA,CAAC,CAAC;IACH;IAEA,gBAAgB,CAAC,WAAwB,EAAE,QAAyC,EAAA;AACnF,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YACnB,MAAMC,0BAAmB,EAAE;QAC5B;AAEA,QAAA,IAAI,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,mBAAmB,EAAE;AACzB,YAAA,mBAAmB,GAAG,IAAI,GAAG,EAA2C;YACxE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,mBAAmB,CAAC;AACvD,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;QAC/B;QAEA,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAC3C,MAAMC,gCAAyB,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QAC/D;QAEA,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QAChD,OAAO,QAAQ,CAAC,IAAI;IACrB;IAEA,kBAAkB,CAAC,MAAc,EAAE,IAAY,EAAA;QAC9C,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;QAEtD,IAAI,CAAC,mBAAmB,EAAE;AACzB,YAAA,OAAO,KAAK;QACb;AAEA,QAAA,OAAO,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC;IACxC;AAEQ,IAAA,YAAY,CAAC,WAAwB,EAAA;AAC5C,QAAA,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,MAAK;YAClC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;AACtC,QAAA,CAAC,CAAC;IACH;AACA;AAED,IAAI,gBAAgB,GAA4B,IAAI;SAEpC,uBAAuB,GAAA;IACtC,IAAI,CAAC,gBAAgB,EAAE;AACtB,QAAA,gBAAgB,GAAG,IAAI,gBAAgB,EAAE;IAC1C;AAEA,IAAA,OAAO,gBAAgB;AACxB;;;;;"}
1
+ {"version":3,"file":"callback-registry.js","sources":["../../src/main/callback-registry.ts"],"sourcesContent":[null],"names":["ipcMain","BRIDGE_INVOKE_REQUEST_CHANNEL","isCallbackInvokeRequest","nonInvocationRequest","callbackNotRegistered","BRIDGE_REMOVE_REQUEST_CHANNEL","isCallbackRemoveRequest","nonRemoveRequest","callbackWithoutName","callbackRegisteredAlready"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { CallbackRegistry } from './callback-registry';
2
+ export declare function compileInvoke<P extends unknown[]>(registry: CallbackRegistry, webContents: Electron.WebContents, apiKey: string, method: string, args: P): string;
3
+ export declare function compile<P extends unknown[]>(fn: (..._: P) => unknown, ...args: P): string;
4
+ //# sourceMappingURL=compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/main/compiler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,wBAAgB,aAAa,CAAC,CAAC,SAAS,OAAO,EAAE,EAChD,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,QAAQ,CAAC,WAAW,EACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,CAAC,GAAG,MAAM,CAEhB;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAEzF"}
@@ -0,0 +1,30 @@
1
+ const injectable = require('./injectable.js');
2
+
3
+ function compileInvoke(registry, webContents, apiKey, method, args) {
4
+ return `(${injectable.invoke.toString()})("${apiKey}","${method}",[${serializeArguments(registry, webContents, args)}])`;
5
+ }
6
+ function compile(fn, ...args) {
7
+ return `(${fn.toString()})(${serializeArgumentsRaw(args)})`;
8
+ }
9
+ function serializeArguments(registry, webContents, args) {
10
+ const serialized = args.map((arg, index) => {
11
+ if (typeof arg === 'function') {
12
+ const dispatched = {
13
+ dispatchedCallbackName: registry.registerCallback(webContents, arg)
14
+ };
15
+ args[index] = dispatched;
16
+ }
17
+ return JSON.stringify(args[index]);
18
+ });
19
+ return serialized.join(',');
20
+ }
21
+ function serializeArgumentsRaw(...args) {
22
+ const serialized = args.map((arg) => {
23
+ return JSON.stringify(arg);
24
+ });
25
+ return serialized.join(',');
26
+ }
27
+
28
+ exports.compile = compile;
29
+ exports.compileInvoke = compileInvoke;
30
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sources":["../../src/main/compiler.ts"],"sourcesContent":[null],"names":["invoke"],"mappings":";;AAIM,SAAU,aAAa,CAC5B,QAA0B,EAC1B,WAAiC,EACjC,MAAc,EACd,MAAc,EACd,IAAO,EAAA;AACP,IAAA,OAAO,IAAKA,iBAAM,CAAC,QAAQ,EAAG,CAAA,GAAA,EAAO,MAAO,CAAA,GAAA,EAAO,MAAO,MAAO,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAE,IAAI;AACtH;SAEgB,OAAO,CAAsB,EAAwB,EAAE,GAAG,IAAO,EAAA;IAChF,OAAO,CAAA,CAAA,EAAK,EAAE,CAAC,QAAQ,EAAG,CAAA,EAAA,EAAM,qBAAqB,CAAC,IAAI,CAAE,CAAA,CAAA,CAAG;AAChE;AAEA,SAAS,kBAAkB,CAAC,QAA0B,EAAE,WAAiC,EAAE,IAAe,EAAA;IACzG,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,KAAa,KAAI;AAC3D,QAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;AAC9B,YAAA,MAAM,UAAU,GAAuB;gBACtC,sBAAsB,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,GAAmC;aAClG;AAED,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,UAAU;QACzB;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnC,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AAC5B;AAEA,SAAS,qBAAqB,CAAC,GAAG,IAAe,EAAA;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAY,KAAI;AAC5C,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AAC3B,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AAC5B;;;;;"}
package/main/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { createApiProvider } from './provider';
1
+ export { createApiProvider, removeAllCallbacks, removeCallback } from './provider';
2
2
  export type { WebContentsApiProvider } from './provider';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/main/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/main/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnF,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC"}
package/main/index.js CHANGED
@@ -3,4 +3,6 @@ const provider = require('./provider.js');
3
3
 
4
4
 
5
5
  exports.createApiProvider = provider.createApiProvider;
6
+ exports.removeAllCallbacks = provider.removeAllCallbacks;
7
+ exports.removeCallback = provider.removeCallback;
6
8
  //# sourceMappingURL=index.js.map
package/main/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -4,4 +4,6 @@ export type WebContentsApiProvider<T> = Promisify<T> & {
4
4
  readonly webContents: WebContents;
5
5
  };
6
6
  export declare function createApiProvider<ApiInterface>(webContents: WebContents, apiKey: string): WebContentsApiProvider<ApiInterface>;
7
+ export declare function removeAllCallbacks<T>(apiProvider: WebContentsApiProvider<T>): boolean;
8
+ export declare function removeCallback<T>(apiProvider: WebContentsApiProvider<T>, name: string): boolean;
7
9
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/main/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;CAAE,CAAC;AAmE7F,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAS9H"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/main/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;CAAE,CAAC;AA+C7F,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAS9H;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,OAAO,CAErF;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/F"}
package/main/provider.js CHANGED
@@ -1,6 +1,7 @@
1
+ const errors = require('../common/errors.js');
1
2
  const callbackRegistry = require('./callback-registry.js');
3
+ const compiler = require('./compiler.js');
2
4
  const injectable = require('./injectable.js');
3
- const errors = require('../common/errors.js');
4
5
 
5
6
  class ApiProviderPropertiesHandler {
6
7
  webContents;
@@ -11,26 +12,6 @@ class ApiProviderPropertiesHandler {
11
12
  this.apiKey = apiKey;
12
13
  this.callbackRegistry = callbackRegistry;
13
14
  }
14
- compile(fn, ...args) {
15
- return `(${fn.toString()})(${this.serializeArguments(...args)})`;
16
- }
17
- ;
18
- serializeArguments(...args) {
19
- const serialized = args.map((arg) => {
20
- if (Array.isArray(arg)) {
21
- arg.forEach((value, index) => {
22
- if (typeof value === 'function') {
23
- const dispatched = {
24
- dispatchedCallbackName: this.callbackRegistry.registerCallback(this.webContents, value)
25
- };
26
- arg[index] = dispatched;
27
- }
28
- });
29
- }
30
- return JSON.stringify(arg);
31
- });
32
- return serialized.join(',');
33
- }
34
15
  }
35
16
  class ApiProviderProxyHandler {
36
17
  apiExistsAwaiter;
@@ -46,15 +27,15 @@ class ApiProviderProxyHandler {
46
27
  if (propertyProxy) {
47
28
  return propertyProxy;
48
29
  }
49
- const apiExistsClosure = this.apiExistsAwaiter;
30
+ const apiExistsAwaiterClosure = this.apiExistsAwaiter;
50
31
  // proxy context must be a function, to allow using handler 'apply'.
51
32
  const propProxy = new Proxy(() => { }, {
52
33
  async apply(_target, this_, args) {
53
- if (!(await apiExistsClosure)) {
34
+ if (!(await apiExistsAwaiterClosure)) {
54
35
  throw errors.apiKeyNotExists(this_.apiKey, this_.webContents.id);
55
36
  }
56
- const injectable$1 = this_.compile(injectable.invoke, this_.apiKey, propertyKey, args);
57
- return this_.webContents.executeJavaScript(injectable$1);
37
+ const injectable = compiler.compileInvoke(callbackRegistry.globalCallbacksRegistry(), this_.webContents, this_.apiKey, propertyKey, args);
38
+ return this_.webContents.executeJavaScript(injectable);
58
39
  },
59
40
  });
60
41
  this.properties[propertyKey] = propProxy;
@@ -63,11 +44,19 @@ class ApiProviderProxyHandler {
63
44
  }
64
45
  function createApiProvider(webContents, apiKey) {
65
46
  const propertiesHandler = new ApiProviderPropertiesHandler(webContents, apiKey, callbackRegistry.globalCallbacksRegistry());
66
- const checkApiExistsInjectable = propertiesHandler.compile(injectable.apiExists, apiKey);
47
+ const checkApiExistsInjectable = compiler.compile(injectable.apiExists, apiKey);
67
48
  const checkApiExistsPromise = webContents.executeJavaScript(checkApiExistsInjectable);
68
49
  const proxyHandler = new ApiProviderProxyHandler(checkApiExistsPromise);
69
50
  return new Proxy(propertiesHandler, proxyHandler);
70
51
  }
52
+ function removeAllCallbacks(apiProvider) {
53
+ return callbackRegistry.globalCallbacksRegistry().unregisterAll(apiProvider.webContents.id);
54
+ }
55
+ function removeCallback(apiProvider, name) {
56
+ return callbackRegistry.globalCallbacksRegistry().unregisterCallback(apiProvider.webContents.id, name);
57
+ }
71
58
 
72
59
  exports.createApiProvider = createApiProvider;
60
+ exports.removeAllCallbacks = removeAllCallbacks;
61
+ exports.removeCallback = removeCallback;
73
62
  //# sourceMappingURL=provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sources":["../../src/main/provider.ts"],"sourcesContent":[null],"names":["apiKeyNotExists","injectable","invoke","globalCallbacksRegistry","apiExists"],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sources":["../../src/main/provider.ts"],"sourcesContent":[null],"names":["apiKeyNotExists","compileInvoke","globalCallbacksRegistry","compile","apiExists"],"mappings":";;;;;AAUA,MAAM,4BAA4B,CAAA;AAEvB,IAAA,WAAA;AACA,IAAA,MAAA;AACA,IAAA,gBAAA;AAHV,IAAA,WAAA,CACU,WAAwB,EACxB,MAAc,EACd,gBAAkC,EAAA;QAFlC,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;IACvB;AACH;AAED,MAAM,uBAAuB,CAAA;AAGC,IAAA,gBAAA;IAFZ,UAAU,GAA4B,EAAE;AAEzD,IAAA,WAAA,CAA6B,gBAAkC,EAAA;QAAlC,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;IAAqB;IAElE,GAAG,CAAC,OAAqC,EAAE,WAA+C,EAAA;AACzF,QAAA,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,UAAU,EAAE;AACtF,YAAA,OAAO,OAAO,CAAC,WAAW,CAAC;QAC5B;QAEA,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAElD,IAAI,aAAa,EAAE;AAClB,YAAA,OAAO,aAAa;QACrB;AAEA,QAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,gBAAgB;;QAGrD,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,MAAK,EAAE,CAAC,EAAE;AACrC,YAAA,MAAM,KAAK,CAAC,OAAgB,EAAE,KAAmC,EAAE,IAAe,EAAA;AACjF,gBAAA,IAAI,EAAE,MAAM,uBAAuB,CAAC,EAAE;AACrC,oBAAA,MAAMA,sBAAe,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1D;AAEA,gBAAA,MAAM,UAAU,GAAGC,sBAAa,CAACC,wCAAuB,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC;gBAE/G,OAAO,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC;YACvD,CAAC;AACD,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,SAAS;AAExC,QAAA,OAAO,SAAS;IACjB;AACA;AAEK,SAAU,iBAAiB,CAAe,WAAwB,EAAE,MAAc,EAAA;AACvF,IAAA,MAAM,iBAAiB,GAAG,IAAI,4BAA4B,CAAC,WAAW,EAAE,MAAM,EAAEA,wCAAuB,EAAE,CAAC;IAE1G,MAAM,wBAAwB,GAAGC,gBAAO,CAACC,oBAAS,EAAE,MAAM,CAAC;IAC3D,MAAM,qBAAqB,GAAG,WAAW,CAAC,iBAAiB,CAAC,wBAAwB,CAAqB;AAEzG,IAAA,MAAM,YAAY,GAAG,IAAI,uBAAuB,CAAC,qBAAqB,CAAC;AAEvE,IAAA,OAAO,IAAI,KAAK,CAAC,iBAAiB,EAAE,YAAY,CAAyC;AAC1F;AAEM,SAAU,kBAAkB,CAAI,WAAsC,EAAA;IAC3E,OAAOF,wCAAuB,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;AAC3E;AAEM,SAAU,cAAc,CAAI,WAAsC,EAAE,IAAY,EAAA;AACrF,IAAA,OAAOA,wCAAuB,EAAE,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC;AACtF;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "electron-wcap",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "author": "Egor Kushnarev",
5
5
  "description": "Electron WebContent API Provider — call renderer APIs from the main process with support for passing callbacks.",
6
6
  "license": "MIT",
@@ -39,5 +39,8 @@
39
39
  }
40
40
  },
41
41
  "module": "./esm/main/index.js",
42
- "browser": "./esm/renderer/index.js"
42
+ "browser": "./esm/renderer/index.js",
43
+ "dependencies": {
44
+ "promisify-ts": "^1.0.1"
45
+ }
43
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/preload/bridge.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,IAAI,IAAI,CAWtC"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/preload/bridge.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,IAAI,IAAI,CAkBtC"}
package/preload/bridge.js CHANGED
@@ -9,6 +9,12 @@ function enableCallbacks() {
9
9
  args
10
10
  };
11
11
  return electron.ipcRenderer.sendSync(protocol.BRIDGE_INVOKE_REQUEST_CHANNEL, invokeRequest);
12
+ },
13
+ remove(callbackName) {
14
+ const removeRequest = {
15
+ method: callbackName,
16
+ };
17
+ return electron.ipcRenderer.sendSync(protocol.BRIDGE_REMOVE_REQUEST_CHANNEL, removeRequest);
12
18
  }
13
19
  });
14
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","sources":["../../src/preload/bridge.ts"],"sourcesContent":[null],"names":["contextBridge","CALLBACK_BRIDGE_NAME","ipcRenderer","BRIDGE_INVOKE_REQUEST_CHANNEL"],"mappings":";;;SAIgB,eAAe,GAAA;AAC9B,IAAAA,sBAAa,CAAC,iBAAiB,CAACC,6BAAoB,EAAE;QACrD,MAAM,CAAC,YAAoB,EAAE,IAAe,EAAA;AAC3C,YAAA,MAAM,aAAa,GAA0B;AAC5C,gBAAA,MAAM,EAAE,YAAY;gBACpB;aACA;YAED,OAAOC,oBAAW,CAAC,QAAQ,CAACC,sCAA6B,EAAE,aAAa,CAAC;QAC1E;AACA,KAAA,CAAC;AACH;;;;"}
1
+ {"version":3,"file":"bridge.js","sources":["../../src/preload/bridge.ts"],"sourcesContent":[null],"names":["contextBridge","CALLBACK_BRIDGE_NAME","ipcRenderer","BRIDGE_INVOKE_REQUEST_CHANNEL","BRIDGE_REMOVE_REQUEST_CHANNEL"],"mappings":";;;SAIgB,eAAe,GAAA;AAC9B,IAAAA,sBAAa,CAAC,iBAAiB,CAACC,6BAAoB,EAAE;QACrD,MAAM,CAAC,YAAoB,EAAE,IAAe,EAAA;AAC3C,YAAA,MAAM,aAAa,GAA0B;AAC5C,gBAAA,MAAM,EAAE,YAAY;gBACpB;aACA;YAED,OAAOC,oBAAW,CAAC,QAAQ,CAACC,sCAA6B,EAAE,aAAa,CAAC;QAC1E,CAAC;AACD,QAAA,MAAM,CAAC,YAAoB,EAAA;AAC1B,YAAA,MAAM,aAAa,GAA0B;AAC5C,gBAAA,MAAM,EAAE,YAAY;aACpB;YAED,OAAOD,oBAAW,CAAC,QAAQ,CAACE,sCAA6B,EAAE,aAAa,CAAC;QAC1E;AACA,KAAA,CAAC;AACH;;;;"}