@itwin/core-electron 4.0.0-dev.10 → 4.0.0-dev.101

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 (51) hide show
  1. package/CHANGELOG.md +59 -1
  2. package/lib/cjs/ElectronBackend.d.ts +1 -1
  3. package/lib/cjs/ElectronBackend.js +21 -17
  4. package/lib/cjs/ElectronBackend.js.map +1 -1
  5. package/lib/cjs/ElectronFrontend.d.ts +1 -1
  6. package/lib/cjs/ElectronFrontend.js +21 -17
  7. package/lib/cjs/ElectronFrontend.js.map +1 -1
  8. package/lib/cjs/__DOC_ONLY__.d.ts +19 -3
  9. package/lib/cjs/__DOC_ONLY__.d.ts.map +1 -1
  10. package/lib/cjs/__DOC_ONLY__.js +42 -22
  11. package/lib/cjs/__DOC_ONLY__.js.map +1 -1
  12. package/lib/cjs/backend/ElectronHost.d.ts +107 -104
  13. package/lib/cjs/backend/ElectronHost.d.ts.map +1 -1
  14. package/lib/cjs/backend/ElectronHost.js +240 -242
  15. package/lib/cjs/backend/ElectronHost.js.map +1 -1
  16. package/lib/cjs/backend/ElectronPreload.d.ts +1 -1
  17. package/lib/cjs/backend/ElectronPreload.js +39 -39
  18. package/lib/cjs/backend/ElectronPreload.js.map +1 -1
  19. package/lib/cjs/common/ElectronIpcInterface.d.ts +10 -7
  20. package/lib/cjs/common/ElectronIpcInterface.d.ts.map +1 -1
  21. package/lib/cjs/common/ElectronIpcInterface.js +12 -5
  22. package/lib/cjs/common/ElectronIpcInterface.js.map +1 -1
  23. package/lib/cjs/common/ElectronIpcTransport.d.ts +44 -44
  24. package/lib/cjs/common/ElectronIpcTransport.js +186 -186
  25. package/lib/cjs/common/ElectronIpcTransport.js.map +1 -1
  26. package/lib/cjs/common/ElectronPush.d.ts +17 -20
  27. package/lib/cjs/common/ElectronPush.d.ts.map +1 -1
  28. package/lib/cjs/common/ElectronPush.js +45 -48
  29. package/lib/cjs/common/ElectronPush.js.map +1 -1
  30. package/lib/cjs/common/ElectronRpcManager.d.ts +23 -26
  31. package/lib/cjs/common/ElectronRpcManager.d.ts.map +1 -1
  32. package/lib/cjs/common/ElectronRpcManager.js +56 -65
  33. package/lib/cjs/common/ElectronRpcManager.js.map +1 -1
  34. package/lib/cjs/common/ElectronRpcProtocol.d.ts +34 -34
  35. package/lib/cjs/common/ElectronRpcProtocol.js +58 -58
  36. package/lib/cjs/common/ElectronRpcProtocol.js.map +1 -1
  37. package/lib/cjs/common/ElectronRpcRequest.d.ts +19 -19
  38. package/lib/cjs/common/ElectronRpcRequest.js +56 -56
  39. package/lib/cjs/common/ITwinElectronApi.d.ts +13 -10
  40. package/lib/cjs/common/ITwinElectronApi.d.ts.map +1 -1
  41. package/lib/cjs/common/ITwinElectronApi.js +6 -6
  42. package/lib/cjs/common/ITwinElectronApi.js.map +1 -1
  43. package/lib/cjs/frontend/ElectronApp.d.ts +38 -35
  44. package/lib/cjs/frontend/ElectronApp.d.ts.map +1 -1
  45. package/lib/cjs/frontend/ElectronApp.js +76 -75
  46. package/lib/cjs/frontend/ElectronApp.js.map +1 -1
  47. package/package.json +25 -26
  48. package/lib/cjs/common/ElectronManagerLoggerCategory.d.ts +0 -11
  49. package/lib/cjs/common/ElectronManagerLoggerCategory.d.ts.map +0 -1
  50. package/lib/cjs/common/ElectronManagerLoggerCategory.js +0 -19
  51. package/lib/cjs/common/ElectronManagerLoggerCategory.js.map +0 -1
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=ElectronPreload.d.ts.map
@@ -1,40 +1,40 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- /*---------------------------------------------------------------------------------------------
4
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
5
- * See LICENSE.md in the project root for license terms and full copyright notice.
6
- *--------------------------------------------------------------------------------------------*/
7
- const electron_1 = require("electron");
8
- /**
9
- * This file is loaded as an Electron preload script
10
- * (see https://www.electronjs.org/docs/api/browser-window#class-browserwindow) from ElectronMain.ts
11
- */
12
- function checkPrefix(channel) {
13
- if (!channel.startsWith("itwin."))
14
- throw new Error(`illegal channel name '${channel}'`);
15
- }
16
- /** the implementation of the private api between the frontend (renderer) and backend (main) iTwin.js processes in Electron. */
17
- const frontendApi = {
18
- send(channel, ...data) {
19
- checkPrefix(channel);
20
- electron_1.ipcRenderer.send(channel, ...data);
21
- },
22
- addListener(channel, listener) {
23
- checkPrefix(channel);
24
- return electron_1.ipcRenderer.addListener(channel, listener);
25
- },
26
- removeListener(channel, listener) {
27
- return electron_1.ipcRenderer.removeListener(channel, listener);
28
- },
29
- once(channel, listener) {
30
- checkPrefix(channel);
31
- return electron_1.ipcRenderer.once(channel, listener);
32
- },
33
- async invoke(channel, ...data) {
34
- checkPrefix(channel);
35
- return electron_1.ipcRenderer.invoke(channel, ...data);
36
- },
37
- };
38
- // this adds the frontendApi object under the name `window.itwinjs` in the frontend Electron process.
39
- electron_1.contextBridge.exposeInMainWorld("itwinjs", frontendApi);
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const electron_1 = require("electron");
8
+ /**
9
+ * This file is loaded as an Electron preload script
10
+ * (see https://www.electronjs.org/docs/api/browser-window#class-browserwindow) from ElectronMain.ts
11
+ */
12
+ function checkPrefix(channel) {
13
+ if (!channel.startsWith("itwin."))
14
+ throw new Error(`illegal channel name '${channel}'`);
15
+ }
16
+ /** the implementation of the private api between the frontend (renderer) and backend (main) iTwin.js processes in Electron. */
17
+ const frontendApi = {
18
+ send(channel, ...data) {
19
+ checkPrefix(channel);
20
+ electron_1.ipcRenderer.send(channel, ...data);
21
+ },
22
+ addListener(channel, listener) {
23
+ checkPrefix(channel);
24
+ return electron_1.ipcRenderer.addListener(channel, listener);
25
+ },
26
+ removeListener(channel, listener) {
27
+ return electron_1.ipcRenderer.removeListener(channel, listener);
28
+ },
29
+ once(channel, listener) {
30
+ checkPrefix(channel);
31
+ return electron_1.ipcRenderer.once(channel, listener);
32
+ },
33
+ async invoke(channel, ...data) {
34
+ checkPrefix(channel);
35
+ return electron_1.ipcRenderer.invoke(channel, ...data);
36
+ },
37
+ };
38
+ // this adds the frontendApi object under the name `window.itwinjs` in the frontend Electron process.
39
+ electron_1.contextBridge.exposeInMainWorld("itwinjs", frontendApi);
40
40
  //# sourceMappingURL=ElectronPreload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ElectronPreload.js","sourceRoot":"","sources":["../../../src/backend/ElectronPreload.ts"],"names":[],"mappings":";;AAAA;;;+FAG+F;AAC/F,uCAAsD;AAGtD;;;GAGG;AAEH,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,+HAA+H;AAC/H,MAAM,WAAW,GAAqB;IACpC,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,sBAAW,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,WAAW,CAAC,OAAe,EAAE,QAA0B;QACrD,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,sBAAW,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IACD,cAAc,CAAC,OAAe,EAAE,QAA0B;QACxD,OAAO,sBAAW,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,OAAe,EAAE,QAA0B;QAC9C,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,sBAAW,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,GAAG,IAAW;QAC1C,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,sBAAW,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF,CAAC;AAEF,qGAAqG;AACrG,wBAAa,CAAC,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { contextBridge, ipcRenderer } from \"electron\";\r\nimport type { ElectronListener, ITwinElectronApi } from \"../common/ITwinElectronApi\";\r\n\r\n/**\r\n * This file is loaded as an Electron preload script\r\n * (see https://www.electronjs.org/docs/api/browser-window#class-browserwindow) from ElectronMain.ts\r\n */\r\n\r\nfunction checkPrefix(channel: string) {\r\n if (!channel.startsWith(\"itwin.\"))\r\n throw new Error(`illegal channel name '${channel}'`);\r\n}\r\n\r\n/** the implementation of the private api between the frontend (renderer) and backend (main) iTwin.js processes in Electron. */\r\nconst frontendApi: ITwinElectronApi = {\r\n send(channel: string, ...data: any[]) {\r\n checkPrefix(channel);\r\n ipcRenderer.send(channel, ...data);\r\n },\r\n addListener(channel: string, listener: ElectronListener) {\r\n checkPrefix(channel);\r\n return ipcRenderer.addListener(channel, listener);\r\n },\r\n removeListener(channel: string, listener: ElectronListener) {\r\n return ipcRenderer.removeListener(channel, listener);\r\n },\r\n once(channel: string, listener: ElectronListener) {\r\n checkPrefix(channel);\r\n return ipcRenderer.once(channel, listener);\r\n },\r\n async invoke(channel: string, ...data: any[]): Promise<any> {\r\n checkPrefix(channel);\r\n return ipcRenderer.invoke(channel, ...data);\r\n },\r\n};\r\n\r\n// this adds the frontendApi object under the name `window.itwinjs` in the frontend Electron process.\r\ncontextBridge.exposeInMainWorld(\"itwinjs\", frontendApi);\r\n"]}
1
+ {"version":3,"file":"ElectronPreload.js","sourceRoot":"","sources":["../../../src/backend/ElectronPreload.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;AAE/F,uCAAsD;AAGtD;;;GAGG;AAEH,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,+HAA+H;AAC/H,MAAM,WAAW,GAAqB;IACpC,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,sBAAW,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,WAAW,CAAC,OAAe,EAAE,QAA0B;QACrD,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,sBAAW,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IACD,cAAc,CAAC,OAAe,EAAE,QAA0B;QACxD,OAAO,sBAAW,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,OAAe,EAAE,QAA0B;QAC9C,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,sBAAW,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,GAAG,IAAW;QAC1C,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,sBAAW,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF,CAAC;AAEF,qGAAqG;AACrG,wBAAa,CAAC,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { contextBridge, ipcRenderer } from \"electron\";\r\nimport type { ElectronListener, ITwinElectronApi } from \"../common/ITwinElectronApi\";\r\n\r\n/**\r\n * This file is loaded as an Electron preload script\r\n * (see https://www.electronjs.org/docs/api/browser-window#class-browserwindow) from ElectronMain.ts\r\n */\r\n\r\nfunction checkPrefix(channel: string) {\r\n if (!channel.startsWith(\"itwin.\"))\r\n throw new Error(`illegal channel name '${channel}'`);\r\n}\r\n\r\n/** the implementation of the private api between the frontend (renderer) and backend (main) iTwin.js processes in Electron. */\r\nconst frontendApi: ITwinElectronApi = {\r\n send(channel: string, ...data: any[]) {\r\n checkPrefix(channel);\r\n ipcRenderer.send(channel, ...data);\r\n },\r\n addListener(channel: string, listener: ElectronListener) {\r\n checkPrefix(channel);\r\n return ipcRenderer.addListener(channel, listener);\r\n },\r\n removeListener(channel: string, listener: ElectronListener) {\r\n return ipcRenderer.removeListener(channel, listener);\r\n },\r\n once(channel: string, listener: ElectronListener) {\r\n checkPrefix(channel);\r\n return ipcRenderer.once(channel, listener);\r\n },\r\n async invoke(channel: string, ...data: any[]): Promise<any> {\r\n checkPrefix(channel);\r\n return ipcRenderer.invoke(channel, ...data);\r\n },\r\n};\r\n\r\n// this adds the frontendApi object under the name `window.itwinjs` in the frontend Electron process.\r\ncontextBridge.exposeInMainWorld(\"itwinjs\", frontendApi);\r\n"]}
@@ -1,8 +1,11 @@
1
- import { AsyncMethodsOf } from "@itwin/core-bentley";
2
- /** @internal */
3
- export declare const dialogChannel = "electron-dialog";
4
- /** Asynchronous methods of dialog module in an Electron app.
5
- * @beta
6
- */
7
- export declare type DialogModuleMethod = AsyncMethodsOf<Electron.Dialog>;
1
+ /** @packageDocumentation
2
+ * @module RpcInterface
3
+ */
4
+ import { AsyncMethodsOf } from "@itwin/core-bentley";
5
+ /** @internal */
6
+ export declare const dialogChannel = "electron-dialog";
7
+ /** Asynchronous methods of dialog module in an Electron app.
8
+ * @beta
9
+ */
10
+ export type DialogModuleMethod = AsyncMethodsOf<Electron.Dialog>;
8
11
  //# sourceMappingURL=ElectronIpcInterface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ElectronIpcInterface.d.ts","sourceRoot":"","sources":["../../../src/common/ElectronIpcInterface.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,gBAAgB;AAChB,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C;;GAEG;AACH,oBAAY,kBAAkB,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"ElectronIpcInterface.d.ts","sourceRoot":"","sources":["../../../src/common/ElectronIpcInterface.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,gBAAgB;AAChB,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC"}
@@ -1,6 +1,13 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.dialogChannel = void 0;
4
- /** @internal */
5
- exports.dialogChannel = "electron-dialog";
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module RpcInterface
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.dialogChannel = void 0;
11
+ /** @internal */
12
+ exports.dialogChannel = "electron-dialog";
6
13
  //# sourceMappingURL=ElectronIpcInterface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ElectronIpcInterface.js","sourceRoot":"","sources":["../../../src/common/ElectronIpcInterface.ts"],"names":[],"mappings":";;;AAMA,gBAAgB;AACH,QAAA,aAAa,GAAG,iBAAiB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { AsyncMethodsOf } from \"@itwin/core-bentley\";\r\n\r\n/** @internal */\r\nexport const dialogChannel = \"electron-dialog\";\r\n\r\n/** Asynchronous methods of dialog module in an Electron app.\r\n * @beta\r\n */\r\nexport type DialogModuleMethod = AsyncMethodsOf<Electron.Dialog>;\r\n"]}
1
+ {"version":3,"file":"ElectronIpcInterface.js","sourceRoot":"","sources":["../../../src/common/ElectronIpcInterface.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH,gBAAgB;AACH,QAAA,aAAa,GAAG,iBAAiB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\nimport { AsyncMethodsOf } from \"@itwin/core-bentley\";\r\n\r\n/** @internal */\r\nexport const dialogChannel = \"electron-dialog\";\r\n\r\n/** Asynchronous methods of dialog module in an Electron app.\r\n * @beta\r\n */\r\nexport type DialogModuleMethod = AsyncMethodsOf<Electron.Dialog>;\r\n"]}
@@ -1,45 +1,45 @@
1
- import { RpcRequestFulfillment, RpcSerializedValue, SerializedRpcRequest } from "@itwin/core-common";
2
- import { ElectronRpcProtocol } from "./ElectronRpcProtocol";
3
- /** @internal */
4
- export interface IpcTransportMessage {
5
- id: string;
6
- parameters?: RpcSerializedValue;
7
- result?: RpcSerializedValue;
8
- }
9
- /** @internal */
10
- export declare abstract class ElectronIpcTransport<TIn extends IpcTransportMessage = IpcTransportMessage, TOut extends IpcTransportMessage = IpcTransportMessage> {
11
- private _partials;
12
- private _removeListeners;
13
- protected _protocol: ElectronRpcProtocol;
14
- get protocol(): ElectronRpcProtocol;
15
- sendRequest(request: SerializedRpcRequest): void;
16
- constructor(protocol: ElectronRpcProtocol);
17
- protected setupPush(): void;
18
- private _setupDataChannel;
19
- private _setupObjectsChannel;
20
- private _extractValue;
21
- private _send;
22
- protected performSend(channel: string, message: any, evt: any): void;
23
- protected abstract handleComplete(id: string, evt: any): void;
24
- /** @internal */
25
- sendResponse(message: TOut, evt: any): void;
26
- protected loadMessage(id: string): TIn;
27
- cleanup(): void;
28
- }
29
- /** @internal */
30
- export declare class FrontendIpcTransport extends ElectronIpcTransport<RpcRequestFulfillment> {
31
- private _pushTransport?;
32
- protected setupPush(): void;
33
- protected handleComplete(id: string): Promise<void>;
34
- }
35
- /** @internal */
36
- export declare class BackendIpcTransport extends ElectronIpcTransport<SerializedRpcRequest, RpcRequestFulfillment> {
37
- private _browserWindow;
38
- protected setupPush(): void;
39
- protected handleComplete(id: string, evt: any): Promise<void>;
40
- protected performSend(channel: string, message: any, evt: any): void;
41
- private _requireBrowserWindow;
42
- }
43
- /** @internal */
44
- export declare function initializeIpc(protocol: ElectronRpcProtocol): ElectronIpcTransport<IpcTransportMessage, IpcTransportMessage>;
1
+ import { RpcRequestFulfillment, RpcSerializedValue, SerializedRpcRequest } from "@itwin/core-common";
2
+ import { ElectronRpcProtocol } from "./ElectronRpcProtocol";
3
+ /** @internal */
4
+ export interface IpcTransportMessage {
5
+ id: string;
6
+ parameters?: RpcSerializedValue;
7
+ result?: RpcSerializedValue;
8
+ }
9
+ /** @internal */
10
+ export declare abstract class ElectronIpcTransport<TIn extends IpcTransportMessage = IpcTransportMessage, TOut extends IpcTransportMessage = IpcTransportMessage> {
11
+ private _partials;
12
+ private _removeListeners;
13
+ protected _protocol: ElectronRpcProtocol;
14
+ get protocol(): ElectronRpcProtocol;
15
+ sendRequest(request: SerializedRpcRequest): void;
16
+ constructor(protocol: ElectronRpcProtocol);
17
+ protected setupPush(): void;
18
+ private _setupDataChannel;
19
+ private _setupObjectsChannel;
20
+ private _extractValue;
21
+ private _send;
22
+ protected performSend(channel: string, message: any, evt: any): void;
23
+ protected abstract handleComplete(id: string, evt: any): void;
24
+ /** @internal */
25
+ sendResponse(message: TOut, evt: any): void;
26
+ protected loadMessage(id: string): TIn;
27
+ cleanup(): void;
28
+ }
29
+ /** @internal */
30
+ export declare class FrontendIpcTransport extends ElectronIpcTransport<RpcRequestFulfillment> {
31
+ private _pushTransport?;
32
+ protected setupPush(): void;
33
+ protected handleComplete(id: string): Promise<void>;
34
+ }
35
+ /** @internal */
36
+ export declare class BackendIpcTransport extends ElectronIpcTransport<SerializedRpcRequest, RpcRequestFulfillment> {
37
+ private _browserWindow;
38
+ protected setupPush(): void;
39
+ protected handleComplete(id: string, evt: any): Promise<void>;
40
+ protected performSend(channel: string, message: any, evt: any): void;
41
+ private _requireBrowserWindow;
42
+ }
43
+ /** @internal */
44
+ export declare function initializeIpc(protocol: ElectronRpcProtocol): ElectronIpcTransport<IpcTransportMessage, IpcTransportMessage>;
45
45
  //# sourceMappingURL=ElectronIpcTransport.d.ts.map
@@ -1,187 +1,187 @@
1
- "use strict";
2
- /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.initializeIpc = exports.BackendIpcTransport = exports.FrontendIpcTransport = exports.ElectronIpcTransport = void 0;
8
- const core_bentley_1 = require("@itwin/core-bentley");
9
- const core_common_1 = require("@itwin/core-common");
10
- const ElectronPush_1 = require("./ElectronPush");
11
- const ElectronRpcManager_1 = require("./ElectronRpcManager");
12
- const OBJECTS_CHANNEL = (0, core_common_1.iTwinChannel)("rpc.objects");
13
- const DATA_CHANNEL = (0, core_common_1.iTwinChannel)("rpc.data");
14
- /** @internal */
15
- class ElectronIpcTransport {
16
- constructor(protocol) {
17
- this._removeListeners = [];
18
- this._protocol = protocol;
19
- this._partials = new Map();
20
- this._setupDataChannel();
21
- this._setupObjectsChannel();
22
- this.setupPush();
23
- }
24
- get protocol() { return this._protocol; }
25
- sendRequest(request) {
26
- const value = this._extractValue(request);
27
- this._send(request, value);
28
- }
29
- setupPush() { }
30
- _setupDataChannel() {
31
- const removeListener = this.protocol.ipcSocket.addListener(DATA_CHANNEL, async (evt, chunk) => {
32
- let pending = this._partials.get(chunk.id);
33
- if (!pending) {
34
- pending = [];
35
- this._partials.set(chunk.id, pending);
36
- }
37
- if (Array.isArray(pending)) {
38
- pending.push(chunk);
39
- }
40
- else {
41
- ++pending.received;
42
- const value = this._extractValue(pending.message);
43
- value.data[chunk.index] = chunk.data;
44
- if (pending.received === (value.chunks || 0)) {
45
- this.handleComplete(pending.message.id, evt);
46
- }
47
- }
48
- });
49
- this._removeListeners.push(removeListener);
50
- }
51
- _setupObjectsChannel() {
52
- const removeListener = this.protocol.ipcSocket.addListener(OBJECTS_CHANNEL, async (evt, message) => {
53
- const pending = this._partials.get(message.id);
54
- if (pending && !Array.isArray(pending)) {
55
- throw new core_common_1.IModelError(core_bentley_1.BentleyStatus.ERROR, `Message already received for id "${message.id}".`);
56
- }
57
- const partial = { message, received: 0 };
58
- this._partials.set(message.id, partial);
59
- const value = this._extractValue(partial.message);
60
- if (pending && Array.isArray(pending)) {
61
- for (const chunk of pending) {
62
- ++partial.received;
63
- value.data[chunk.index] = chunk.data;
64
- }
65
- }
66
- if (partial.received === (value.chunks || 0)) {
67
- this.handleComplete(message.id, evt);
68
- }
69
- });
70
- this._removeListeners.push(removeListener);
71
- }
72
- _extractValue(t) {
73
- if (t.parameters) {
74
- return t.parameters;
75
- }
76
- if (t.result) {
77
- return t.result;
78
- }
79
- throw new core_common_1.IModelError(core_bentley_1.BentleyStatus.ERROR, "Unknown value type.");
80
- }
81
- _send(message, value, evt) {
82
- const chunks = value.data;
83
- if (chunks.length) {
84
- value.chunks = chunks.length;
85
- value.data = [];
86
- }
87
- this.performSend(OBJECTS_CHANNEL, message, evt);
88
- for (let index = 0; index !== chunks.length; ++index) {
89
- const chunk = { id: message.id, index, data: chunks[index] };
90
- this.performSend(DATA_CHANNEL, chunk, evt);
91
- }
92
- }
93
- performSend(channel, message, evt) {
94
- (evt ? evt.sender : this.protocol.ipcSocket).send(channel, message);
95
- }
96
- /** @internal */
97
- sendResponse(message, evt) {
98
- const value = this._extractValue(message);
99
- this._send(message, value, evt);
100
- }
101
- loadMessage(id) {
102
- const partial = this._partials.get(id);
103
- if (!partial || Array.isArray(partial)) {
104
- throw new core_common_1.IModelError(core_bentley_1.BentleyStatus.ERROR, `Incomplete transmission for id "${id}".`);
105
- }
106
- this._partials.delete(id);
107
- return partial.message;
108
- }
109
- cleanup() {
110
- this._removeListeners.forEach((removeListener) => removeListener());
111
- }
112
- }
113
- exports.ElectronIpcTransport = ElectronIpcTransport;
114
- /** @internal */
115
- class FrontendIpcTransport extends ElectronIpcTransport {
116
- setupPush() {
117
- const pushTransport = new ElectronPush_1.ElectronPushTransport(this);
118
- this._pushTransport = pushTransport;
119
- core_common_1.RpcPushChannel.setup(pushTransport);
120
- }
121
- async handleComplete(id) {
122
- const message = this.loadMessage(id);
123
- if (this._pushTransport && this._pushTransport.consume(message)) {
124
- return;
125
- }
126
- const protocol = this._protocol;
127
- const request = protocol.requests.get(message.id);
128
- request.notifyResponse(message);
129
- }
130
- }
131
- exports.FrontendIpcTransport = FrontendIpcTransport;
132
- /** @internal */
133
- class BackendIpcTransport extends ElectronIpcTransport {
134
- setupPush() {
135
- core_common_1.RpcPushConnection.for = (channel, client) => new ElectronPush_1.ElectronPushConnection(channel, client, this);
136
- core_common_1.RpcPushChannel.enabled = true;
137
- }
138
- async handleComplete(id, evt) {
139
- const message = this.loadMessage(id);
140
- let response;
141
- try {
142
- const protocol = this._protocol;
143
- response = await protocol.fulfill(message);
144
- }
145
- catch (err) {
146
- response = await core_common_1.RpcRequestFulfillment.forUnknownError(message, err);
147
- }
148
- const raw = response.rawResult;
149
- response.rawResult = undefined; // Otherwise, it will be serialized in IPC layer and large responses will then crash the app
150
- this.sendResponse(response, evt);
151
- response.rawResult = raw;
152
- }
153
- performSend(channel, message, evt) {
154
- if (evt) {
155
- return super.performSend(channel, message, evt);
156
- }
157
- this._requireBrowserWindow();
158
- const target = ElectronRpcManager_1.ElectronRpcConfiguration.targetWindowId;
159
- const windows = target ? [this._browserWindow.fromId(target)] : this._browserWindow.getAllWindows();
160
- windows.forEach((window) => window.webContents.send(channel, message));
161
- }
162
- _requireBrowserWindow() {
163
- if (this._browserWindow) {
164
- return;
165
- }
166
- try { // Wrapping require in a try/catch signals to webpack that this is only an optional dependency
167
- this._browserWindow = require("electron").BrowserWindow; // eslint-disable-line @typescript-eslint/no-var-requires
168
- }
169
- catch (err) {
170
- throw new core_common_1.IModelError(core_bentley_1.BentleyStatus.ERROR, `Error requiring electron`, () => core_bentley_1.BentleyError.getErrorProps(err));
171
- }
172
- }
173
- }
174
- exports.BackendIpcTransport = BackendIpcTransport;
175
- let transport;
176
- /** @internal */
177
- function initializeIpc(protocol) {
178
- if (transport && transport.protocol !== protocol) {
179
- transport.cleanup();
180
- transport = undefined;
181
- }
182
- if (undefined === transport)
183
- transport = core_bentley_1.ProcessDetector.isElectronAppFrontend ? new FrontendIpcTransport(protocol) : new BackendIpcTransport(protocol);
184
- return transport;
185
- }
186
- exports.initializeIpc = initializeIpc;
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.initializeIpc = exports.BackendIpcTransport = exports.FrontendIpcTransport = exports.ElectronIpcTransport = void 0;
8
+ const core_bentley_1 = require("@itwin/core-bentley");
9
+ const core_common_1 = require("@itwin/core-common");
10
+ const ElectronPush_1 = require("./ElectronPush");
11
+ const ElectronRpcManager_1 = require("./ElectronRpcManager");
12
+ const OBJECTS_CHANNEL = (0, core_common_1.iTwinChannel)("rpc.objects");
13
+ const DATA_CHANNEL = (0, core_common_1.iTwinChannel)("rpc.data");
14
+ /** @internal */
15
+ class ElectronIpcTransport {
16
+ get protocol() { return this._protocol; }
17
+ sendRequest(request) {
18
+ const value = this._extractValue(request);
19
+ this._send(request, value);
20
+ }
21
+ constructor(protocol) {
22
+ this._removeListeners = [];
23
+ this._protocol = protocol;
24
+ this._partials = new Map();
25
+ this._setupDataChannel();
26
+ this._setupObjectsChannel();
27
+ this.setupPush();
28
+ }
29
+ setupPush() { }
30
+ _setupDataChannel() {
31
+ const removeListener = this.protocol.ipcSocket.addListener(DATA_CHANNEL, async (evt, chunk) => {
32
+ let pending = this._partials.get(chunk.id);
33
+ if (!pending) {
34
+ pending = [];
35
+ this._partials.set(chunk.id, pending);
36
+ }
37
+ if (Array.isArray(pending)) {
38
+ pending.push(chunk);
39
+ }
40
+ else {
41
+ ++pending.received;
42
+ const value = this._extractValue(pending.message);
43
+ value.data[chunk.index] = chunk.data;
44
+ if (pending.received === (value.chunks || 0)) {
45
+ this.handleComplete(pending.message.id, evt);
46
+ }
47
+ }
48
+ });
49
+ this._removeListeners.push(removeListener);
50
+ }
51
+ _setupObjectsChannel() {
52
+ const removeListener = this.protocol.ipcSocket.addListener(OBJECTS_CHANNEL, async (evt, message) => {
53
+ const pending = this._partials.get(message.id);
54
+ if (pending && !Array.isArray(pending)) {
55
+ throw new core_common_1.IModelError(core_bentley_1.BentleyStatus.ERROR, `Message already received for id "${message.id}".`);
56
+ }
57
+ const partial = { message, received: 0 };
58
+ this._partials.set(message.id, partial);
59
+ const value = this._extractValue(partial.message);
60
+ if (pending && Array.isArray(pending)) {
61
+ for (const chunk of pending) {
62
+ ++partial.received;
63
+ value.data[chunk.index] = chunk.data;
64
+ }
65
+ }
66
+ if (partial.received === (value.chunks || 0)) {
67
+ this.handleComplete(message.id, evt);
68
+ }
69
+ });
70
+ this._removeListeners.push(removeListener);
71
+ }
72
+ _extractValue(t) {
73
+ if (t.parameters) {
74
+ return t.parameters;
75
+ }
76
+ if (t.result) {
77
+ return t.result;
78
+ }
79
+ throw new core_common_1.IModelError(core_bentley_1.BentleyStatus.ERROR, "Unknown value type.");
80
+ }
81
+ _send(message, value, evt) {
82
+ const chunks = value.data;
83
+ if (chunks.length) {
84
+ value.chunks = chunks.length;
85
+ value.data = [];
86
+ }
87
+ this.performSend(OBJECTS_CHANNEL, message, evt);
88
+ for (let index = 0; index !== chunks.length; ++index) {
89
+ const chunk = { id: message.id, index, data: chunks[index] };
90
+ this.performSend(DATA_CHANNEL, chunk, evt);
91
+ }
92
+ }
93
+ performSend(channel, message, evt) {
94
+ (evt ? evt.sender : this.protocol.ipcSocket).send(channel, message);
95
+ }
96
+ /** @internal */
97
+ sendResponse(message, evt) {
98
+ const value = this._extractValue(message);
99
+ this._send(message, value, evt);
100
+ }
101
+ loadMessage(id) {
102
+ const partial = this._partials.get(id);
103
+ if (!partial || Array.isArray(partial)) {
104
+ throw new core_common_1.IModelError(core_bentley_1.BentleyStatus.ERROR, `Incomplete transmission for id "${id}".`);
105
+ }
106
+ this._partials.delete(id);
107
+ return partial.message;
108
+ }
109
+ cleanup() {
110
+ this._removeListeners.forEach((removeListener) => removeListener());
111
+ }
112
+ }
113
+ exports.ElectronIpcTransport = ElectronIpcTransport;
114
+ /** @internal */
115
+ class FrontendIpcTransport extends ElectronIpcTransport {
116
+ setupPush() {
117
+ const pushTransport = new ElectronPush_1.ElectronPushTransport(this);
118
+ this._pushTransport = pushTransport;
119
+ core_common_1.RpcPushChannel.setup(pushTransport);
120
+ }
121
+ async handleComplete(id) {
122
+ const message = this.loadMessage(id);
123
+ if (this._pushTransport && this._pushTransport.consume(message)) {
124
+ return;
125
+ }
126
+ const protocol = this._protocol;
127
+ const request = protocol.requests.get(message.id);
128
+ request.notifyResponse(message);
129
+ }
130
+ }
131
+ exports.FrontendIpcTransport = FrontendIpcTransport;
132
+ /** @internal */
133
+ class BackendIpcTransport extends ElectronIpcTransport {
134
+ setupPush() {
135
+ core_common_1.RpcPushConnection.for = (channel, client) => new ElectronPush_1.ElectronPushConnection(channel, client, this);
136
+ core_common_1.RpcPushChannel.enabled = true;
137
+ }
138
+ async handleComplete(id, evt) {
139
+ const message = this.loadMessage(id);
140
+ let response;
141
+ try {
142
+ const protocol = this._protocol;
143
+ response = await protocol.fulfill(message);
144
+ }
145
+ catch (err) {
146
+ response = await core_common_1.RpcRequestFulfillment.forUnknownError(message, err);
147
+ }
148
+ const raw = response.rawResult;
149
+ response.rawResult = undefined; // Otherwise, it will be serialized in IPC layer and large responses will then crash the app
150
+ this.sendResponse(response, evt);
151
+ response.rawResult = raw;
152
+ }
153
+ performSend(channel, message, evt) {
154
+ if (evt) {
155
+ return super.performSend(channel, message, evt);
156
+ }
157
+ this._requireBrowserWindow();
158
+ const target = ElectronRpcManager_1.ElectronRpcConfiguration.targetWindowId;
159
+ const windows = target ? [this._browserWindow.fromId(target)] : this._browserWindow.getAllWindows();
160
+ windows.forEach((window) => window.webContents.send(channel, message));
161
+ }
162
+ _requireBrowserWindow() {
163
+ if (this._browserWindow) {
164
+ return;
165
+ }
166
+ try { // Wrapping require in a try/catch signals to webpack that this is only an optional dependency
167
+ this._browserWindow = require("electron").BrowserWindow; // eslint-disable-line @typescript-eslint/no-var-requires
168
+ }
169
+ catch (err) {
170
+ throw new core_common_1.IModelError(core_bentley_1.BentleyStatus.ERROR, `Error requiring electron`, () => core_bentley_1.BentleyError.getErrorProps(err));
171
+ }
172
+ }
173
+ }
174
+ exports.BackendIpcTransport = BackendIpcTransport;
175
+ let transport;
176
+ /** @internal */
177
+ function initializeIpc(protocol) {
178
+ if (transport && transport.protocol !== protocol) {
179
+ transport.cleanup();
180
+ transport = undefined;
181
+ }
182
+ if (undefined === transport)
183
+ transport = core_bentley_1.ProcessDetector.isElectronAppFrontend ? new FrontendIpcTransport(protocol) : new BackendIpcTransport(protocol);
184
+ return transport;
185
+ }
186
+ exports.initializeIpc = initializeIpc;
187
187
  //# sourceMappingURL=ElectronIpcTransport.js.map