@zeltjs/adapter-electron 0.11.0 → 0.12.0-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main/index.cjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
let _zeltjs_core = require("@zeltjs/core");
|
|
3
3
|
let ts_pattern = require("ts-pattern");
|
|
4
|
+
let node_async_hooks = require("node:async_hooks");
|
|
4
5
|
let _zeltjs_adapter_node = require("@zeltjs/adapter-node");
|
|
5
6
|
//#region src/main/electron.adaptor.ts
|
|
6
7
|
function _ts_decorate$3(decorators, target, key, desc) {
|
|
@@ -208,12 +209,12 @@ const toIpcResponse = async (response, method) => {
|
|
|
208
209
|
body
|
|
209
210
|
};
|
|
210
211
|
};
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
212
|
+
const ipcEventStorage = new node_async_hooks.AsyncLocalStorage();
|
|
213
|
+
const ipcEvent = () => ipcEventStorage.getStore();
|
|
214
|
+
const setupIpcBridge = (ipcMain, fetch, channel) => {
|
|
215
|
+
ipcMain.handle(channel, async (event, payload) => ipcEventStorage.run(event, () => (0, _zeltjs_core.runInContext)(async () => {
|
|
215
216
|
return toIpcResponse(await fetch(toRequest(payload, channel)), payload.method);
|
|
216
|
-
}));
|
|
217
|
+
})));
|
|
217
218
|
return () => {
|
|
218
219
|
ipcMain.removeHandler(channel);
|
|
219
220
|
};
|
package/dist/main/index.d.cts
CHANGED
|
@@ -94,18 +94,11 @@ declare class ElectronWindowRegistryService {
|
|
|
94
94
|
//#region src/main/ipc-bridge.d.ts
|
|
95
95
|
declare const toRequest: (payload: IpcFetchRequest, baseUrl: string) => Request;
|
|
96
96
|
declare const toIpcResponse: (response: Response, method: string) => Promise<IpcFetchResponse>;
|
|
97
|
-
declare module '@zeltjs/core' {
|
|
98
|
-
interface RequestContextSchema {
|
|
99
|
-
ipcEvent: IpcMainInvokeEvent;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
97
|
type IpcMainLike = {
|
|
103
98
|
handle(channel: string, listener: (event: IpcMainInvokeEvent, payload: IpcFetchRequest) => unknown): void;
|
|
104
99
|
removeHandler(channel: string): void;
|
|
105
100
|
};
|
|
106
|
-
/** @throws {ZeltContextNotAvailableError} */
|
|
107
101
|
declare const ipcEvent: () => IpcMainInvokeEvent | undefined;
|
|
108
|
-
/** @throws {ZeltContextNotAvailableError} */
|
|
109
102
|
declare const setupIpcBridge: (ipcMain: IpcMainLike, fetch: (request: Request) => Promise<Response>, channel: string) => (() => void);
|
|
110
103
|
//#endregion
|
|
111
104
|
//#region src/main/on-electron.exceptions.d.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/window.types.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.exceptions.ts","../../src/main/on-electron.ts"],"mappings":";;;;;;KAeY,aAAA;EAAA,SACD,GAAA,EAAK,GAAA;EAAA,SACL,OAAA,EAAS,OAAA;EAAA,SACT,QAAA,EAAU,QAAA;EAAA,SACV,KAAA,EAAO,KAAA;EAAA,SACP,MAAA,EAAQ,MAAA;EAAA,SACR,MAAA,EAAQ,MAAA;EAAA,SACR,IAAA,SAAa,IAAA;EAAA,SACb,mBAAA,GAAsB,OAAA,EAAS,+BAAA,KAAoC,aAAA;EAAA,SACnE,aAAA,QAAqB,aAAA;EAAA,SACrB,eAAA,GAAkB,WAAA,EAAa,WAAA,KAAgB,aAAA;EAAA,SAC/C,MAAA,GAAS,EAAA,aAAe,aAAA;EAAA,SACxB,gBAAA,QAAwB,aAAA;AAAA;AAAA,cAItB,eAAA,YAA2B,SAAA,CAAU,aAAA;EAAA,SACvC,KAAA,EAAO,UAAA,CAAW,aAAA;cAEf,gBAAA,GAAgB,gBAAA;EAItB,OAAA,CAAA,GAAW,OAAA,CAAQ,aAAA;EA8BzB,QAAA,CAAA;AAAA;;;cCjEW,kBAAA,SAA2B,UAAA;EAC7B,GAAA,CAAI,GAAA;AAAA;;;KCFH,QAAA;AAAA,KAEA,uBAAA;EAAA,SAAqC,MAAA;AAAA;AAAA,KAErC,YAAA;EAAA,SACD,EAAA;EAAA,SACA,MAAA,EAAQ,aAAA;EACjB,KAAA;EACA,KAAA;EACA,IAAA;EACA,WAAA;EACA,QAAA;EACA,SAAA,IAAa,SAAA;EACb,SAAA,CAAU,MAAA,EAAQ,OAAA,CAAQ,SAAA;EAC1B,QAAA,CAAS,IAAA;EACT,OAAA,CAAQ,GAAA;EACR,EAAA,CAAG,KAAA,8BAAmC,OAAA;EACtC,cAAA,CAAe,KAAA,8BAAmC,OAAA,MAAa,IAAA;EAC/D,WAAA;IACE,IAAA,CAAK,OAAA,aAAoB,IAAA;IACzB,oBAAA,CAAqB,OAAA,GAAU,OAAA;MAAW,GAAA;IAAA,MAAkB,uBAAA;EAAA;AAAA;AAAA,KAIpD,gBAAA;EACN,IAAA;EAAA,SAAuB,IAAA;AAAA;EACvB,IAAA;EAAA,SAAsB,GAAA;AAAA;AAAA,KAEhB,gBAAA;EAAA,SACD,EAAA,EAAI,QAAA;EAAA,SACJ,OAAA,EAAS,+BAAA;EAAA,SACT,UAAA,EAAY,gBAAA;AAAA;AAAA,KAGX,aAAA;EACV,IAAA,CAAK,UAAA,EAAY,gBAAA,GAAmB,YAAA;AAAA;;;cC9BzB,4BAAA,YAAwC,aAAA;EAAA,iBACtB,WAAA;cAAA,WAAA,GAAa,eAAA;EAE1C,IAAA,CAAK,UAAA,EAAY,gBAAA,GAAmB,YAAA;EAcpC,kBAAA,CAAmB,GAAA,EAAK,aAAA,GAAgB,YAAA;AAAA;;;cCnB7B,6BAAA;EAAA,iBAGkB,OAAA;EAAA,iBAFZ,OAAA;cAEY,OAAA,GAAO,4BAAA;EAEpC,IAAA,CAAK,UAAA,EAAY,gBAAA,GAAmB,YAAA;EAiBpC,KAAA,CAAM,EAAA,EAAI,QAAA;EAOV,QAAA,CAAA;EAQA,KAAA,CAAA;AAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/window.types.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.exceptions.ts","../../src/main/on-electron.ts"],"mappings":"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"}
|
package/dist/main/index.d.ts
CHANGED
|
@@ -94,18 +94,11 @@ declare class ElectronWindowRegistryService {
|
|
|
94
94
|
//#region src/main/ipc-bridge.d.ts
|
|
95
95
|
declare const toRequest: (payload: IpcFetchRequest, baseUrl: string) => Request;
|
|
96
96
|
declare const toIpcResponse: (response: Response, method: string) => Promise<IpcFetchResponse>;
|
|
97
|
-
declare module '@zeltjs/core' {
|
|
98
|
-
interface RequestContextSchema {
|
|
99
|
-
ipcEvent: IpcMainInvokeEvent;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
97
|
type IpcMainLike = {
|
|
103
98
|
handle(channel: string, listener: (event: IpcMainInvokeEvent, payload: IpcFetchRequest) => unknown): void;
|
|
104
99
|
removeHandler(channel: string): void;
|
|
105
100
|
};
|
|
106
|
-
/** @throws {ZeltContextNotAvailableError} */
|
|
107
101
|
declare const ipcEvent: () => IpcMainInvokeEvent | undefined;
|
|
108
|
-
/** @throws {ZeltContextNotAvailableError} */
|
|
109
102
|
declare const setupIpcBridge: (ipcMain: IpcMainLike, fetch: (request: Request) => Promise<Response>, channel: string) => (() => void);
|
|
110
103
|
//#endregion
|
|
111
104
|
//#region src/main/on-electron.exceptions.d.ts
|
package/dist/main/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/window.types.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.exceptions.ts","../../src/main/on-electron.ts"],"mappings":";;;;;;KAeY,aAAA;EAAA,SACD,GAAA,EAAK,GAAA;EAAA,SACL,OAAA,EAAS,OAAA;EAAA,SACT,QAAA,EAAU,QAAA;EAAA,SACV,KAAA,EAAO,KAAA;EAAA,SACP,MAAA,EAAQ,MAAA;EAAA,SACR,MAAA,EAAQ,MAAA;EAAA,SACR,IAAA,SAAa,IAAA;EAAA,SACb,mBAAA,GAAsB,OAAA,EAAS,+BAAA,KAAoC,aAAA;EAAA,SACnE,aAAA,QAAqB,aAAA;EAAA,SACrB,eAAA,GAAkB,WAAA,EAAa,WAAA,KAAgB,aAAA;EAAA,SAC/C,MAAA,GAAS,EAAA,aAAe,aAAA;EAAA,SACxB,gBAAA,QAAwB,aAAA;AAAA;AAAA,cAItB,eAAA,YAA2B,SAAA,CAAU,aAAA;EAAA,SACvC,KAAA,EAAO,UAAA,CAAW,aAAA;cAEf,gBAAA,GAAgB,gBAAA;EAItB,OAAA,CAAA,GAAW,OAAA,CAAQ,aAAA;EA8BzB,QAAA,CAAA;AAAA;;;cCjEW,kBAAA,SAA2B,UAAA;EAC7B,GAAA,CAAI,GAAA;AAAA;;;KCFH,QAAA;AAAA,KAEA,uBAAA;EAAA,SAAqC,MAAA;AAAA;AAAA,KAErC,YAAA;EAAA,SACD,EAAA;EAAA,SACA,MAAA,EAAQ,aAAA;EACjB,KAAA;EACA,KAAA;EACA,IAAA;EACA,WAAA;EACA,QAAA;EACA,SAAA,IAAa,SAAA;EACb,SAAA,CAAU,MAAA,EAAQ,OAAA,CAAQ,SAAA;EAC1B,QAAA,CAAS,IAAA;EACT,OAAA,CAAQ,GAAA;EACR,EAAA,CAAG,KAAA,8BAAmC,OAAA;EACtC,cAAA,CAAe,KAAA,8BAAmC,OAAA,MAAa,IAAA;EAC/D,WAAA;IACE,IAAA,CAAK,OAAA,aAAoB,IAAA;IACzB,oBAAA,CAAqB,OAAA,GAAU,OAAA;MAAW,GAAA;IAAA,MAAkB,uBAAA;EAAA;AAAA;AAAA,KAIpD,gBAAA;EACN,IAAA;EAAA,SAAuB,IAAA;AAAA;EACvB,IAAA;EAAA,SAAsB,GAAA;AAAA;AAAA,KAEhB,gBAAA;EAAA,SACD,EAAA,EAAI,QAAA;EAAA,SACJ,OAAA,EAAS,+BAAA;EAAA,SACT,UAAA,EAAY,gBAAA;AAAA;AAAA,KAGX,aAAA;EACV,IAAA,CAAK,UAAA,EAAY,gBAAA,GAAmB,YAAA;AAAA;;;cC9BzB,4BAAA,YAAwC,aAAA;EAAA,iBACtB,WAAA;cAAA,WAAA,GAAa,eAAA;EAE1C,IAAA,CAAK,UAAA,EAAY,gBAAA,GAAmB,YAAA;EAcpC,kBAAA,CAAmB,GAAA,EAAK,aAAA,GAAgB,YAAA;AAAA;;;cCnB7B,6BAAA;EAAA,iBAGkB,OAAA;EAAA,iBAFZ,OAAA;cAEY,OAAA,GAAO,4BAAA;EAEpC,IAAA,CAAK,UAAA,EAAY,gBAAA,GAAmB,YAAA;EAiBpC,KAAA,CAAM,EAAA,EAAI,QAAA;EAOV,QAAA,CAAA;EAQA,KAAA,CAAA;AAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/window.types.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.exceptions.ts","../../src/main/on-electron.ts"],"mappings":"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"}
|
package/dist/main/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Config, EnvAdaptor, HTTP_FEATURE_KEY, HttpFeature, Injectable, LifecycleManager,
|
|
1
|
+
import { Config, EnvAdaptor, HTTP_FEATURE_KEY, HttpFeature, Injectable, LifecycleManager, inject, runInContext } from "@zeltjs/core";
|
|
2
2
|
import { match } from "ts-pattern";
|
|
3
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
3
4
|
import { createListenForHttp } from "@zeltjs/adapter-node";
|
|
4
5
|
//#region src/main/electron.adaptor.ts
|
|
5
6
|
function _ts_decorate$3(decorators, target, key, desc) {
|
|
@@ -207,12 +208,12 @@ const toIpcResponse = async (response, method) => {
|
|
|
207
208
|
body
|
|
208
209
|
};
|
|
209
210
|
};
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
211
|
+
const ipcEventStorage = new AsyncLocalStorage();
|
|
212
|
+
const ipcEvent = () => ipcEventStorage.getStore();
|
|
213
|
+
const setupIpcBridge = (ipcMain, fetch, channel) => {
|
|
214
|
+
ipcMain.handle(channel, async (event, payload) => ipcEventStorage.run(event, () => runInContext(async () => {
|
|
214
215
|
return toIpcResponse(await fetch(toRequest(payload, channel)), payload.method);
|
|
215
|
-
}));
|
|
216
|
+
})));
|
|
216
217
|
return () => {
|
|
217
218
|
ipcMain.removeHandler(channel);
|
|
218
219
|
};
|
package/dist/main/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Injectable","inject","LifecycleManager","ElectronAdaptor","startup","app","BrowserWindow","BW","dialog","ipcMain","Menu","protocol","screen","shell","whenReady","createBrowserWindow","options","getAllWindows","fromWebContents","wc","fromId","id","getFocusedWindow","shutdown","ready","quit","lifecycleManager","register","Config","EnvAdaptor","ElectronEnvAdaptor","get","key","process","env","Injectable","inject","match","ElectronAdaptor","ElectronWindowRuntimeService","open","definition","handle","createWindowHandle","electronApp","ready","createBrowserWindow","options","loadTarget","type","loadURL","url","loadFile","path","win","id","native","close","focus","show","isDestroyed","getTitle","getBounds","setBounds","bounds","on","event","handler","with","e","exhaustive","removeListener","webContents","send","channel","args","setWindowOpenHandler","Injectable","inject","ElectronWindowRuntimeService","ElectronWindowRegistryService","open","definition","existing","windows","get","id","isDestroyed","focus","handle","runtime","set","on","delete","close","closeAll","values","count","size","Map","getContext","runInContext","setContext","match","BODY_FORBIDDEN_METHODS","Set","NO_BODY_STATUSES","TEXT_CONTENT_TYPE_PREFIXES","isTextContentType","contentType","some","prefix","startsWith","toBody","body","with","kind","value","exhaustive","toRequest","payload","baseUrl","headers","map","k","v","Request","replace","path","method","has","toIpcResponse","response","forEach","key","push","status","get","text","arrayBuffer","statusText","ipcEvent","setupIpcBridge","ipcMain","fetch","channel","handle","event","request","removeHandler","ZeltElectronIpcFeatureNotFoundError","Error","context","ipcFeature","name","Object","setPrototypeOf","prototype","createListenForHttp","HTTP_FEATURE_KEY","HttpFeature","ElectronAdaptor","ElectronEnvAdaptor","setupIpcBridge","ZeltElectronIpcFeatureNotFoundError","DEFAULT_IPC_CHANNEL","withCleanupOnError","cleanup","body","error","cleanupError","AggregateError","createElectronApp","readyApp","shutdown","base","electronApp","entry","getFeatureEntries","Object","defineProperty","key","value","capabilities","listen","fetch","callback","registerShutdown","configurable","enumerable","onElectron","app","options","createRuntime","configs","undefined","prebuilt","fallbackConfigs","warmup","removeIpcHandler","ipcFeature","ipcEntry","find","electronAdaptor","get","channel","ipcChannel","ready","ipcMain"],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.exceptions.ts","../../src/main/on-electron.ts"],"sourcesContent":["import type { Lifecycle, ReadyValue } from '@zeltjs/core';\nimport { Injectable, inject, LifecycleManager } from '@zeltjs/core';\nimport type {\n App,\n BrowserWindow,\n BrowserWindowConstructorOptions,\n Dialog,\n IpcMain,\n Menu,\n Protocol,\n Screen,\n Shell,\n WebContents,\n} from 'electron';\n\nexport type ElectronReady = {\n readonly app: App;\n readonly ipcMain: IpcMain;\n readonly protocol: Protocol;\n readonly shell: Shell;\n readonly screen: Screen;\n readonly dialog: Dialog;\n readonly Menu: typeof Menu;\n readonly createBrowserWindow: (options: BrowserWindowConstructorOptions) => BrowserWindow;\n readonly getAllWindows: () => BrowserWindow[];\n readonly fromWebContents: (webContents: WebContents) => BrowserWindow | null;\n readonly fromId: (id: number) => BrowserWindow | null;\n readonly getFocusedWindow: () => BrowserWindow | null;\n};\n\n@Injectable()\nexport class ElectronAdaptor implements Lifecycle<ElectronReady> {\n readonly ready: ReadyValue<ElectronReady>;\n\n constructor(lifecycleManager = inject(LifecycleManager)) {\n this.ready = lifecycleManager.register(this);\n }\n\n async startup(): Promise<ElectronReady> {\n const {\n app,\n BrowserWindow: BW,\n dialog,\n ipcMain,\n Menu,\n protocol,\n screen,\n shell,\n } = await import('electron');\n\n await app.whenReady();\n\n return {\n app,\n ipcMain,\n protocol,\n shell,\n screen,\n dialog,\n Menu,\n createBrowserWindow: (options: BrowserWindowConstructorOptions) => new BW(options),\n getAllWindows: () => BW.getAllWindows(),\n fromWebContents: (wc: WebContents) => BW.fromWebContents(wc),\n fromId: (id: number) => BW.fromId(id),\n getFocusedWindow: () => BW.getFocusedWindow(),\n };\n }\n\n shutdown(): void {\n this.ready.app.quit();\n }\n}\n","import { Config, EnvAdaptor } from '@zeltjs/core';\n\n@Config\nexport class ElectronEnvAdaptor extends EnvAdaptor {\n override get(key: string): string | undefined {\n return process.env[key];\n }\n}\n","import { Injectable, inject } from '@zeltjs/core';\nimport type { BrowserWindow } from 'electron';\nimport { match } from 'ts-pattern';\nimport { ElectronAdaptor } from './electron.adaptor';\nimport type { WindowDefinition, WindowHandle, WindowRuntime } from './window.types';\n\n@Injectable()\nexport class ElectronWindowRuntimeService implements WindowRuntime {\n constructor(private readonly electronApp: ElectronAdaptor = inject(ElectronAdaptor)) {}\n\n open(definition: WindowDefinition): WindowHandle {\n const handle = this.createWindowHandle(\n this.electronApp.ready.createBrowserWindow(definition.options),\n );\n\n if (definition.loadTarget.type === 'url') {\n handle.loadURL(definition.loadTarget.url);\n } else {\n handle.loadFile(definition.loadTarget.path);\n }\n\n return handle;\n }\n\n createWindowHandle(win: BrowserWindow): WindowHandle {\n return {\n id: win.id,\n native: win,\n close: () => win.close(),\n focus: () => win.focus(),\n show: () => win.show(),\n isDestroyed: () => win.isDestroyed(),\n getTitle: () => win.getTitle(),\n getBounds: () => win.getBounds(),\n setBounds: (bounds) => win.setBounds(bounds),\n loadFile: (path) => {\n void win.loadFile(path);\n },\n loadURL: (url) => {\n void win.loadURL(url);\n },\n on: (event, handler) => {\n match(event)\n .with('closed', (e) => win.on(e, handler))\n .with('ready-to-show', (e) => win.on(e, handler))\n .exhaustive();\n },\n removeListener: (event, handler) => {\n match(event)\n .with('closed', (e) => win.removeListener(e, handler))\n .with('ready-to-show', (e) => win.removeListener(e, handler))\n .exhaustive();\n },\n webContents: {\n send: (channel, ...args) => win.webContents.send(channel, ...args),\n setWindowOpenHandler: (handler) => win.webContents.setWindowOpenHandler(handler),\n },\n };\n }\n}\n","import { Injectable, inject } from '@zeltjs/core';\nimport { ElectronWindowRuntimeService } from './electron-window-runtime.service';\nimport type { WindowDefinition, WindowHandle, WindowId } from './window.types';\n\n@Injectable()\nexport class ElectronWindowRegistryService {\n private readonly windows = new Map<WindowId, WindowHandle>();\n\n constructor(private readonly runtime = inject(ElectronWindowRuntimeService)) {}\n\n open(definition: WindowDefinition): WindowHandle {\n const existing = this.windows.get(definition.id);\n if (existing && !existing.isDestroyed()) {\n existing.focus();\n return existing;\n }\n\n const handle = this.runtime.open(definition);\n this.windows.set(definition.id, handle);\n\n handle.on('closed', () => {\n this.windows.delete(definition.id);\n });\n\n return handle;\n }\n\n close(id: WindowId): void {\n const handle = this.windows.get(id);\n if (handle && !handle.isDestroyed()) {\n handle.close();\n }\n }\n\n closeAll(): void {\n for (const handle of this.windows.values()) {\n if (!handle.isDestroyed()) {\n handle.close();\n }\n }\n }\n\n count(): number {\n return this.windows.size;\n }\n}\n","import { getContext, runInContext, setContext } from '@zeltjs/core';\nimport type { IpcMainInvokeEvent } from 'electron';\nimport { match } from 'ts-pattern';\n\nimport type { IpcBody, IpcFetchRequest, IpcFetchResponse } from '../shared/ipc.types';\n\nconst BODY_FORBIDDEN_METHODS = new Set(['GET', 'HEAD']);\nconst NO_BODY_STATUSES = new Set([204, 205, 304]);\nconst TEXT_CONTENT_TYPE_PREFIXES = [\n 'text/',\n 'application/json',\n 'application/xml',\n 'application/javascript',\n 'application/x-www-form-urlencoded',\n];\n\nconst isTextContentType = (contentType: string): boolean =>\n TEXT_CONTENT_TYPE_PREFIXES.some((prefix) => contentType.startsWith(prefix));\n\nconst toBody = (body: IpcBody): BodyInit | null =>\n match(body)\n .with({ kind: 'none' }, () => null)\n .with({ kind: 'text' }, ({ value }) => value)\n .with({ kind: 'arrayBuffer' }, ({ value }) => value)\n .exhaustive();\n\nexport const toRequest = (payload: IpcFetchRequest, baseUrl: string): Request => {\n const headers: [string, string][] = payload.headers.map(([k, v]) => [k, v]);\n return new Request(baseUrl.replace(/\\/+$/, '') + payload.path, {\n method: payload.method,\n headers,\n body: BODY_FORBIDDEN_METHODS.has(payload.method) ? null : toBody(payload.body),\n });\n};\n\nexport const toIpcResponse = async (\n response: Response,\n method: string,\n): Promise<IpcFetchResponse> => {\n const headers: [string, string][] = [];\n response.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: IpcBody;\n if (NO_BODY_STATUSES.has(response.status) || method === 'HEAD') {\n body = { kind: 'none' };\n } else {\n const contentType = response.headers.get('content-type');\n if (contentType && isTextContentType(contentType)) {\n body = { kind: 'text', value: await response.text() };\n } else {\n body = { kind: 'arrayBuffer', value: await response.arrayBuffer() };\n }\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n };\n};\n\ndeclare module '@zeltjs/core' {\n interface RequestContextSchema {\n ipcEvent: IpcMainInvokeEvent;\n }\n}\n\ntype IpcMainLike = {\n handle(\n channel: string,\n listener: (event: IpcMainInvokeEvent, payload: IpcFetchRequest) => unknown,\n ): void;\n removeHandler(channel: string): void;\n};\n\n/** @throws {ZeltContextNotAvailableError} */\nexport const ipcEvent = (): IpcMainInvokeEvent | undefined => getContext('ipcEvent');\n\n/** @throws {ZeltContextNotAvailableError} */\nexport const setupIpcBridge = (\n ipcMain: IpcMainLike,\n fetch: (request: Request) => Promise<Response>,\n channel: string,\n): (() => void) => {\n ipcMain.handle(channel, async (event, payload) =>\n runInContext(async () => {\n setContext('ipcEvent', event);\n const request = toRequest(payload, channel);\n const response = await fetch(request);\n return toIpcResponse(response, payload.method);\n }),\n );\n\n return () => {\n ipcMain.removeHandler(channel);\n };\n};\n","type ZeltElectronIpcFeatureNotFoundContext = { readonly ipcFeature: string };\n\n/** No HttpFeature matches the `ipcFeature` key requested for IPC binding. */\nexport class ZeltElectronIpcFeatureNotFoundError extends Error {\n override readonly name = 'ZeltElectronIpcFeatureNotFoundError';\n readonly context: ZeltElectronIpcFeatureNotFoundContext;\n\n constructor(context: ZeltElectronIpcFeatureNotFoundContext) {\n super(`No HttpFeature registered with key \"${context.ipcFeature}\" to bind to the IPC bridge`);\n this.context = context;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import type { ListenOptions, ServerHandle } from '@zeltjs/adapter-node';\nimport { createListenForHttp } from '@zeltjs/adapter-node';\nimport type {\n ConfigClass,\n ConfiguredFeature,\n FeatureApp,\n FeatureReadyCapabilities,\n RuntimeApp,\n ZeltPrebuilt,\n} from '@zeltjs/core';\nimport { HTTP_FEATURE_KEY, HttpFeature } from '@zeltjs/core';\n\nimport { ElectronAdaptor } from './electron.adaptor';\nimport { ElectronEnvAdaptor } from './electron-env.adaptor';\nimport { setupIpcBridge } from './ipc-bridge';\nimport { ZeltElectronIpcFeatureNotFoundError } from './on-electron.exceptions';\n\nexport type { ServerHandle } from '@zeltjs/adapter-node';\nexport { ZeltElectronIpcFeatureNotFoundError } from './on-electron.exceptions';\n\ntype IpcChannel = `http://${string}` | `https://${string}`;\n\nexport type ElectronAppOptions<TIpcFeature extends string = string> = {\n readonly configs?: readonly ConfigClass<object>[];\n readonly warmup?: boolean;\n readonly prebuilt?: ZeltPrebuilt;\n readonly ipcChannel?: IpcChannel;\n readonly ipcFeature?: TIpcFeature;\n};\n\ntype HttpFeatureKeys<F extends readonly ConfiguredFeature[]> = Extract<\n F[number],\n HttpFeature<string>\n>['key'];\n\ntype EnvironmentElectronAppPart = {\n readonly shutdown: () => Promise<void>;\n};\n\ntype HttpElectronAppPart = {\n readonly listen: (portOrOptions?: number | ListenOptions) => Promise<ServerHandle>;\n};\n\ntype ElectronFeatureCapabilities<TFeature extends ConfiguredFeature> =\n FeatureReadyCapabilities<TFeature> &\n (TFeature extends HttpFeature<string> ? HttpElectronAppPart : unknown);\n\ntype ElectronNamespacedCapabilities<F extends readonly ConfiguredFeature[]> = {\n readonly [TFeature in F[number] as TFeature['key']]: ElectronFeatureCapabilities<TFeature>;\n};\n\nexport type OnElectronApp = RuntimeApp<readonly ConfiguredFeature[]> & EnvironmentElectronAppPart;\n\ntype ElectronAppForFeatures<F extends readonly ConfiguredFeature[]> = RuntimeApp<F> &\n EnvironmentElectronAppPart &\n ElectronNamespacedCapabilities<F>;\n\nconst DEFAULT_IPC_CHANNEL = 'http://zelt-ipc';\n\n// warmup already started feature-owned resources (e.g. DB connections); any setup failure\n// after createRuntime() must tear them down via cleanup so they aren't left leaked.\n/** @throws {AggregateError} */\nconst withCleanupOnError = async <T>(\n cleanup: () => Promise<void>,\n body: () => Promise<T>,\n): Promise<T> => {\n try {\n return await body();\n } catch (error) {\n try {\n await cleanup();\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n 'onElectron setup failed and runtime shutdown also failed',\n );\n }\n throw error;\n }\n};\n\nconst createElectronApp = (\n readyApp: RuntimeApp<readonly ConfiguredFeature[]>,\n shutdown: () => Promise<void>,\n): OnElectronApp => {\n const base: RuntimeApp<readonly ConfiguredFeature[]> & EnvironmentElectronAppPart = {\n ...readyApp,\n shutdown,\n };\n\n const electronApp: OnElectronApp = { ...base };\n\n for (const entry of readyApp.getFeatureEntries(HttpFeature)) {\n Object.defineProperty(electronApp, entry.key, {\n value: {\n ...entry.capabilities,\n listen: createListenForHttp(entry.capabilities.fetch, (callback) =>\n readyApp.registerShutdown(callback),\n ),\n },\n configurable: true,\n enumerable: true,\n });\n }\n\n return electronApp;\n};\n\nexport function onElectron<const F extends readonly ConfiguredFeature[]>(\n app: FeatureApp<F>,\n options?: ElectronAppOptions<HttpFeatureKeys<F>>,\n): Promise<ElectronAppForFeatures<F>>;\n\n/** @throws {ZeltContextNotAvailableError | ZeltElectronIpcFeatureNotFoundError | AggregateError} */\nexport async function onElectron<const F extends readonly ConfiguredFeature[]>(\n app: FeatureApp<F>,\n options: ElectronAppOptions = {},\n): Promise<OnElectronApp> {\n const readyApp = await app.createRuntime({\n ...(options.configs === undefined ? {} : { configs: options.configs }),\n ...(options.prebuilt === undefined ? {} : { prebuilt: options.prebuilt }),\n fallbackConfigs: [ElectronEnvAdaptor],\n warmup: options.warmup ?? true,\n });\n\n // declared outside the body so cleanup can remove the IPC handler even if a step\n // after setupIpcBridge (e.g. createElectronApp) throws before onElectron returns.\n let removeIpcHandler: (() => void) | undefined;\n\n return withCleanupOnError(\n async () => {\n removeIpcHandler?.();\n await readyApp.shutdown();\n },\n async () => {\n const ipcFeature = options.ipcFeature ?? HTTP_FEATURE_KEY;\n const ipcEntry = readyApp\n .getFeatureEntries(HttpFeature)\n .find((entry) => entry.key === ipcFeature);\n\n if (ipcEntry === undefined) {\n throw new ZeltElectronIpcFeatureNotFoundError({ ipcFeature });\n }\n\n const electronAdaptor = await readyApp.get(ElectronAdaptor);\n const channel = options.ipcChannel ?? DEFAULT_IPC_CHANNEL;\n\n removeIpcHandler = setupIpcBridge(\n electronAdaptor.ready.ipcMain,\n ipcEntry.capabilities.fetch,\n channel,\n );\n\n const shutdown = async (): Promise<void> => {\n removeIpcHandler?.();\n await readyApp.shutdown();\n };\n\n return createElectronApp(readyApp, shutdown);\n },\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Injectable","inject","LifecycleManager","ElectronAdaptor","startup","app","BrowserWindow","BW","dialog","ipcMain","Menu","protocol","screen","shell","whenReady","createBrowserWindow","options","getAllWindows","fromWebContents","wc","fromId","id","getFocusedWindow","shutdown","ready","quit","lifecycleManager","register","Config","EnvAdaptor","ElectronEnvAdaptor","get","key","process","env","Injectable","inject","match","ElectronAdaptor","ElectronWindowRuntimeService","open","definition","handle","createWindowHandle","electronApp","ready","createBrowserWindow","options","loadTarget","type","loadURL","url","loadFile","path","win","id","native","close","focus","show","isDestroyed","getTitle","getBounds","setBounds","bounds","on","event","handler","with","e","exhaustive","removeListener","webContents","send","channel","args","setWindowOpenHandler","Injectable","inject","ElectronWindowRuntimeService","ElectronWindowRegistryService","open","definition","existing","windows","get","id","isDestroyed","focus","handle","runtime","set","on","delete","close","closeAll","values","count","size","Map","AsyncLocalStorage","runInContext","match","BODY_FORBIDDEN_METHODS","Set","NO_BODY_STATUSES","TEXT_CONTENT_TYPE_PREFIXES","isTextContentType","contentType","some","prefix","startsWith","toBody","body","with","kind","value","exhaustive","toRequest","payload","baseUrl","headers","map","k","v","Request","replace","path","method","has","toIpcResponse","response","forEach","key","push","status","get","text","arrayBuffer","statusText","ipcEventStorage","ipcEvent","getStore","setupIpcBridge","ipcMain","fetch","channel","handle","event","run","request","removeHandler","ZeltElectronIpcFeatureNotFoundError","Error","context","ipcFeature","name","Object","setPrototypeOf","prototype","createListenForHttp","HTTP_FEATURE_KEY","HttpFeature","ElectronAdaptor","ElectronEnvAdaptor","setupIpcBridge","ZeltElectronIpcFeatureNotFoundError","DEFAULT_IPC_CHANNEL","withCleanupOnError","cleanup","body","error","cleanupError","AggregateError","createElectronApp","readyApp","shutdown","base","electronApp","entry","getFeatureEntries","Object","defineProperty","key","value","capabilities","listen","fetch","callback","registerShutdown","configurable","enumerable","onElectron","app","options","createRuntime","configs","undefined","prebuilt","fallbackConfigs","warmup","removeIpcHandler","ipcFeature","ipcEntry","find","electronAdaptor","get","channel","ipcChannel","ready","ipcMain"],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.exceptions.ts","../../src/main/on-electron.ts"],"sourcesContent":["import type { Lifecycle, ReadyValue } from '@zeltjs/core';\nimport { Injectable, inject, LifecycleManager } from '@zeltjs/core';\nimport type {\n App,\n BrowserWindow,\n BrowserWindowConstructorOptions,\n Dialog,\n IpcMain,\n Menu,\n Protocol,\n Screen,\n Shell,\n WebContents,\n} from 'electron';\n\nexport type ElectronReady = {\n readonly app: App;\n readonly ipcMain: IpcMain;\n readonly protocol: Protocol;\n readonly shell: Shell;\n readonly screen: Screen;\n readonly dialog: Dialog;\n readonly Menu: typeof Menu;\n readonly createBrowserWindow: (options: BrowserWindowConstructorOptions) => BrowserWindow;\n readonly getAllWindows: () => BrowserWindow[];\n readonly fromWebContents: (webContents: WebContents) => BrowserWindow | null;\n readonly fromId: (id: number) => BrowserWindow | null;\n readonly getFocusedWindow: () => BrowserWindow | null;\n};\n\n@Injectable()\nexport class ElectronAdaptor implements Lifecycle<ElectronReady> {\n readonly ready: ReadyValue<ElectronReady>;\n\n constructor(lifecycleManager = inject(LifecycleManager)) {\n this.ready = lifecycleManager.register(this);\n }\n\n async startup(): Promise<ElectronReady> {\n const {\n app,\n BrowserWindow: BW,\n dialog,\n ipcMain,\n Menu,\n protocol,\n screen,\n shell,\n } = await import('electron');\n\n await app.whenReady();\n\n return {\n app,\n ipcMain,\n protocol,\n shell,\n screen,\n dialog,\n Menu,\n createBrowserWindow: (options: BrowserWindowConstructorOptions) => new BW(options),\n getAllWindows: () => BW.getAllWindows(),\n fromWebContents: (wc: WebContents) => BW.fromWebContents(wc),\n fromId: (id: number) => BW.fromId(id),\n getFocusedWindow: () => BW.getFocusedWindow(),\n };\n }\n\n shutdown(): void {\n this.ready.app.quit();\n }\n}\n","import { Config, EnvAdaptor } from '@zeltjs/core';\n\n@Config\nexport class ElectronEnvAdaptor extends EnvAdaptor {\n override get(key: string): string | undefined {\n return process.env[key];\n }\n}\n","import { Injectable, inject } from '@zeltjs/core';\nimport type { BrowserWindow } from 'electron';\nimport { match } from 'ts-pattern';\nimport { ElectronAdaptor } from './electron.adaptor';\nimport type { WindowDefinition, WindowHandle, WindowRuntime } from './window.types';\n\n@Injectable()\nexport class ElectronWindowRuntimeService implements WindowRuntime {\n constructor(private readonly electronApp: ElectronAdaptor = inject(ElectronAdaptor)) {}\n\n open(definition: WindowDefinition): WindowHandle {\n const handle = this.createWindowHandle(\n this.electronApp.ready.createBrowserWindow(definition.options),\n );\n\n if (definition.loadTarget.type === 'url') {\n handle.loadURL(definition.loadTarget.url);\n } else {\n handle.loadFile(definition.loadTarget.path);\n }\n\n return handle;\n }\n\n createWindowHandle(win: BrowserWindow): WindowHandle {\n return {\n id: win.id,\n native: win,\n close: () => win.close(),\n focus: () => win.focus(),\n show: () => win.show(),\n isDestroyed: () => win.isDestroyed(),\n getTitle: () => win.getTitle(),\n getBounds: () => win.getBounds(),\n setBounds: (bounds) => win.setBounds(bounds),\n loadFile: (path) => {\n void win.loadFile(path);\n },\n loadURL: (url) => {\n void win.loadURL(url);\n },\n on: (event, handler) => {\n match(event)\n .with('closed', (e) => win.on(e, handler))\n .with('ready-to-show', (e) => win.on(e, handler))\n .exhaustive();\n },\n removeListener: (event, handler) => {\n match(event)\n .with('closed', (e) => win.removeListener(e, handler))\n .with('ready-to-show', (e) => win.removeListener(e, handler))\n .exhaustive();\n },\n webContents: {\n send: (channel, ...args) => win.webContents.send(channel, ...args),\n setWindowOpenHandler: (handler) => win.webContents.setWindowOpenHandler(handler),\n },\n };\n }\n}\n","import { Injectable, inject } from '@zeltjs/core';\nimport { ElectronWindowRuntimeService } from './electron-window-runtime.service';\nimport type { WindowDefinition, WindowHandle, WindowId } from './window.types';\n\n@Injectable()\nexport class ElectronWindowRegistryService {\n private readonly windows = new Map<WindowId, WindowHandle>();\n\n constructor(private readonly runtime = inject(ElectronWindowRuntimeService)) {}\n\n open(definition: WindowDefinition): WindowHandle {\n const existing = this.windows.get(definition.id);\n if (existing && !existing.isDestroyed()) {\n existing.focus();\n return existing;\n }\n\n const handle = this.runtime.open(definition);\n this.windows.set(definition.id, handle);\n\n handle.on('closed', () => {\n this.windows.delete(definition.id);\n });\n\n return handle;\n }\n\n close(id: WindowId): void {\n const handle = this.windows.get(id);\n if (handle && !handle.isDestroyed()) {\n handle.close();\n }\n }\n\n closeAll(): void {\n for (const handle of this.windows.values()) {\n if (!handle.isDestroyed()) {\n handle.close();\n }\n }\n }\n\n count(): number {\n return this.windows.size;\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport { runInContext } from '@zeltjs/core';\nimport type { IpcMainInvokeEvent } from 'electron';\nimport { match } from 'ts-pattern';\n\nimport type { IpcBody, IpcFetchRequest, IpcFetchResponse } from '../shared/ipc.types';\n\nconst BODY_FORBIDDEN_METHODS = new Set(['GET', 'HEAD']);\nconst NO_BODY_STATUSES = new Set([204, 205, 304]);\nconst TEXT_CONTENT_TYPE_PREFIXES = [\n 'text/',\n 'application/json',\n 'application/xml',\n 'application/javascript',\n 'application/x-www-form-urlencoded',\n];\n\nconst isTextContentType = (contentType: string): boolean =>\n TEXT_CONTENT_TYPE_PREFIXES.some((prefix) => contentType.startsWith(prefix));\n\nconst toBody = (body: IpcBody): BodyInit | null =>\n match(body)\n .with({ kind: 'none' }, () => null)\n .with({ kind: 'text' }, ({ value }) => value)\n .with({ kind: 'arrayBuffer' }, ({ value }) => value)\n .exhaustive();\n\nexport const toRequest = (payload: IpcFetchRequest, baseUrl: string): Request => {\n const headers: [string, string][] = payload.headers.map(([k, v]) => [k, v]);\n return new Request(baseUrl.replace(/\\/+$/, '') + payload.path, {\n method: payload.method,\n headers,\n body: BODY_FORBIDDEN_METHODS.has(payload.method) ? null : toBody(payload.body),\n });\n};\n\nexport const toIpcResponse = async (\n response: Response,\n method: string,\n): Promise<IpcFetchResponse> => {\n const headers: [string, string][] = [];\n response.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: IpcBody;\n if (NO_BODY_STATUSES.has(response.status) || method === 'HEAD') {\n body = { kind: 'none' };\n } else {\n const contentType = response.headers.get('content-type');\n if (contentType && isTextContentType(contentType)) {\n body = { kind: 'text', value: await response.text() };\n } else {\n body = { kind: 'arrayBuffer', value: await response.arrayBuffer() };\n }\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n };\n};\n\nconst ipcEventStorage = new AsyncLocalStorage<IpcMainInvokeEvent>();\n\ntype IpcMainLike = {\n handle(\n channel: string,\n listener: (event: IpcMainInvokeEvent, payload: IpcFetchRequest) => unknown,\n ): void;\n removeHandler(channel: string): void;\n};\n\nexport const ipcEvent = (): IpcMainInvokeEvent | undefined => ipcEventStorage.getStore();\n\nexport const setupIpcBridge = (\n ipcMain: IpcMainLike,\n fetch: (request: Request) => Promise<Response>,\n channel: string,\n): (() => void) => {\n ipcMain.handle(channel, async (event, payload) =>\n ipcEventStorage.run(event, () =>\n runInContext(async () => {\n const request = toRequest(payload, channel);\n const response = await fetch(request);\n return toIpcResponse(response, payload.method);\n }),\n ),\n );\n\n return () => {\n ipcMain.removeHandler(channel);\n };\n};\n","type ZeltElectronIpcFeatureNotFoundContext = { readonly ipcFeature: string };\n\n/** No HttpFeature matches the `ipcFeature` key requested for IPC binding. */\nexport class ZeltElectronIpcFeatureNotFoundError extends Error {\n override readonly name = 'ZeltElectronIpcFeatureNotFoundError';\n readonly context: ZeltElectronIpcFeatureNotFoundContext;\n\n constructor(context: ZeltElectronIpcFeatureNotFoundContext) {\n super(`No HttpFeature registered with key \"${context.ipcFeature}\" to bind to the IPC bridge`);\n this.context = context;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import type { ListenOptions, ServerHandle } from '@zeltjs/adapter-node';\nimport { createListenForHttp } from '@zeltjs/adapter-node';\nimport type {\n ConfigClass,\n ConfiguredFeature,\n FeatureApp,\n FeatureReadyCapabilities,\n RuntimeApp,\n ZeltPrebuilt,\n} from '@zeltjs/core';\nimport { HTTP_FEATURE_KEY, HttpFeature } from '@zeltjs/core';\n\nimport { ElectronAdaptor } from './electron.adaptor';\nimport { ElectronEnvAdaptor } from './electron-env.adaptor';\nimport { setupIpcBridge } from './ipc-bridge';\nimport { ZeltElectronIpcFeatureNotFoundError } from './on-electron.exceptions';\n\nexport type { ServerHandle } from '@zeltjs/adapter-node';\nexport { ZeltElectronIpcFeatureNotFoundError } from './on-electron.exceptions';\n\ntype IpcChannel = `http://${string}` | `https://${string}`;\n\nexport type ElectronAppOptions<TIpcFeature extends string = string> = {\n readonly configs?: readonly ConfigClass<object>[];\n readonly warmup?: boolean;\n readonly prebuilt?: ZeltPrebuilt;\n readonly ipcChannel?: IpcChannel;\n readonly ipcFeature?: TIpcFeature;\n};\n\ntype HttpFeatureKeys<F extends readonly ConfiguredFeature[]> = Extract<\n F[number],\n HttpFeature<string>\n>['key'];\n\ntype EnvironmentElectronAppPart = {\n readonly shutdown: () => Promise<void>;\n};\n\ntype HttpElectronAppPart = {\n readonly listen: (portOrOptions?: number | ListenOptions) => Promise<ServerHandle>;\n};\n\ntype ElectronFeatureCapabilities<TFeature extends ConfiguredFeature> =\n FeatureReadyCapabilities<TFeature> &\n (TFeature extends HttpFeature<string> ? HttpElectronAppPart : unknown);\n\ntype ElectronNamespacedCapabilities<F extends readonly ConfiguredFeature[]> = {\n readonly [TFeature in F[number] as TFeature['key']]: ElectronFeatureCapabilities<TFeature>;\n};\n\nexport type OnElectronApp = RuntimeApp<readonly ConfiguredFeature[]> & EnvironmentElectronAppPart;\n\ntype ElectronAppForFeatures<F extends readonly ConfiguredFeature[]> = RuntimeApp<F> &\n EnvironmentElectronAppPart &\n ElectronNamespacedCapabilities<F>;\n\nconst DEFAULT_IPC_CHANNEL = 'http://zelt-ipc';\n\n// warmup already started feature-owned resources (e.g. DB connections); any setup failure\n// after createRuntime() must tear them down via cleanup so they aren't left leaked.\n/** @throws {AggregateError} */\nconst withCleanupOnError = async <T>(\n cleanup: () => Promise<void>,\n body: () => Promise<T>,\n): Promise<T> => {\n try {\n return await body();\n } catch (error) {\n try {\n await cleanup();\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n 'onElectron setup failed and runtime shutdown also failed',\n );\n }\n throw error;\n }\n};\n\nconst createElectronApp = (\n readyApp: RuntimeApp<readonly ConfiguredFeature[]>,\n shutdown: () => Promise<void>,\n): OnElectronApp => {\n const base: RuntimeApp<readonly ConfiguredFeature[]> & EnvironmentElectronAppPart = {\n ...readyApp,\n shutdown,\n };\n\n const electronApp: OnElectronApp = { ...base };\n\n for (const entry of readyApp.getFeatureEntries(HttpFeature)) {\n Object.defineProperty(electronApp, entry.key, {\n value: {\n ...entry.capabilities,\n listen: createListenForHttp(entry.capabilities.fetch, (callback) =>\n readyApp.registerShutdown(callback),\n ),\n },\n configurable: true,\n enumerable: true,\n });\n }\n\n return electronApp;\n};\n\nexport function onElectron<const F extends readonly ConfiguredFeature[]>(\n app: FeatureApp<F>,\n options?: ElectronAppOptions<HttpFeatureKeys<F>>,\n): Promise<ElectronAppForFeatures<F>>;\n\n/** @throws {ZeltContextNotAvailableError | ZeltElectronIpcFeatureNotFoundError | AggregateError} */\nexport async function onElectron<const F extends readonly ConfiguredFeature[]>(\n app: FeatureApp<F>,\n options: ElectronAppOptions = {},\n): Promise<OnElectronApp> {\n const readyApp = await app.createRuntime({\n ...(options.configs === undefined ? {} : { configs: options.configs }),\n ...(options.prebuilt === undefined ? {} : { prebuilt: options.prebuilt }),\n fallbackConfigs: [ElectronEnvAdaptor],\n warmup: options.warmup ?? true,\n });\n\n // declared outside the body so cleanup can remove the IPC handler even if a step\n // after setupIpcBridge (e.g. createElectronApp) throws before onElectron returns.\n let removeIpcHandler: (() => void) | undefined;\n\n return withCleanupOnError(\n async () => {\n removeIpcHandler?.();\n await readyApp.shutdown();\n },\n async () => {\n const ipcFeature = options.ipcFeature ?? HTTP_FEATURE_KEY;\n const ipcEntry = readyApp\n .getFeatureEntries(HttpFeature)\n .find((entry) => entry.key === ipcFeature);\n\n if (ipcEntry === undefined) {\n throw new ZeltElectronIpcFeatureNotFoundError({ ipcFeature });\n }\n\n const electronAdaptor = await readyApp.get(ElectronAdaptor);\n const channel = options.ipcChannel ?? DEFAULT_IPC_CHANNEL;\n\n removeIpcHandler = setupIpcBridge(\n electronAdaptor.ready.ipcMain,\n ipcEntry.capabilities.fetch,\n channel,\n );\n\n const shutdown = async (): Promise<void> => {\n removeIpcHandler?.();\n await readyApp.shutdown();\n };\n\n return createElectronApp(readyApp, shutdown);\n },\n );\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zeltjs/adapter-electron",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0-canary.0",
|
|
4
4
|
"description": "Electron adapter for the Zelt framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
],
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"ts-pattern": "5.7.1",
|
|
53
|
-
"@zeltjs/
|
|
54
|
-
"@zeltjs/
|
|
53
|
+
"@zeltjs/core": "0.12.0-canary.0",
|
|
54
|
+
"@zeltjs/adapter-node": "0.12.0-canary.0"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@types/node": "22.19.17"
|