@zeltjs/adapter-electron 0.11.0 → 0.12.0-canary.1

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.
@@ -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
- /** @throws {ZeltContextNotAvailableError} */ const ipcEvent = () => (0, _zeltjs_core.getContext)("ipcEvent");
212
- /** @throws {ZeltContextNotAvailableError} */ const setupIpcBridge = (ipcMain, fetch, channel) => {
213
- ipcMain.handle(channel, async (event, payload) => (0, _zeltjs_core.runInContext)(async () => {
214
- (0, _zeltjs_core.setContext)("ipcEvent", event);
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
  };
@@ -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":"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"}
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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"}
@@ -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.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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"}
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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"}
@@ -1,5 +1,6 @@
1
- import { Config, EnvAdaptor, HTTP_FEATURE_KEY, HttpFeature, Injectable, LifecycleManager, getContext, inject, runInContext, setContext } from "@zeltjs/core";
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
- /** @throws {ZeltContextNotAvailableError} */ const ipcEvent = () => getContext("ipcEvent");
211
- /** @throws {ZeltContextNotAvailableError} */ const setupIpcBridge = (ipcMain, fetch, channel) => {
212
- ipcMain.handle(channel, async (event, payload) => runInContext(async () => {
213
- setContext("ipcEvent", event);
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
  };
@@ -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":";;;;;;;;;;;;;AA+BA,IAAaG,kBAAb,MAAaA;CAOX,MAAMC,UAAkC;EACtC,MAAM,EACJC,KACAC,eAAeC,IACfC,QACAC,SACAC,MACAC,UACAC,QACAC,UACE,MAAM,OAAO;AAEjB,QAAMR,IAAIS,WAAS;AAEnB,SAAO;GACLT;GACAI;GACAE;GACAE;GACAD;GACAJ;GACAE;GACAK,sBAAsBC,YAA6C,IAAIT,GAAGS,QAAAA;GAC1EC,qBAAqBV,GAAGU,eAAa;GACrCC,kBAAkBC,OAAoBZ,GAAGW,gBAAgBC,GAAAA;GACzDC,SAASC,OAAed,GAAGa,OAAOC,GAAAA;GAClCC,wBAAwBf,GAAGe,kBAAgB;GAC7C;;CAGFC,WAAiB;AACf,OAAKC,MAAMnB,IAAIoB,MAAI;;CAnCrB,YAAYC,mBAAmBzB,OAAOC,iBAAiB,EAAE;AACvD,OAAKsB,QAAQE,iBAAiBC,SAAS,KAAI;;;;;;;;;;;;;;;;AChC/C,IAAaG,qBAAb,cAAwCD,WAAAA;CAC7BE,IAAIC,KAAiC;AAC5C,SAAOC,QAAQC,IAAIF;;;;;;;;;;;;;;;ACEvB,IAAaO,+BAAb,MAAaA;CAGXC,KAAKC,YAA4C;EAC/C,MAAMC,SAAS,KAAKC,mBAClB,KAAKC,YAAYC,MAAMC,oBAAoBL,WAAWM,QAAO,CAAA;AAG/D,MAAIN,WAAWO,WAAWC,SAAS,MACjCP,QAAOQ,QAAQT,WAAWO,WAAWG,IAAG;MAExCT,QAAOU,SAASX,WAAWO,WAAWK,KAAI;AAG5C,SAAOX;;CAGTC,mBAAmBW,KAAkC;AACnD,SAAO;GACLC,IAAID,IAAIC;GACRC,QAAQF;GACRG,aAAaH,IAAIG,OAAK;GACtBC,aAAaJ,IAAII,OAAK;GACtBC,YAAYL,IAAIK,MAAI;GACpBC,mBAAmBN,IAAIM,aAAW;GAClCC,gBAAgBP,IAAIO,UAAQ;GAC5BC,iBAAiBR,IAAIQ,WAAS;GAC9BC,YAAYC,WAAWV,IAAIS,UAAUC,OAAAA;GACrCZ,WAAWC,SAAAA;AACJC,QAAIF,SAASC,KAAAA;;GAEpBH,UAAUC,QAAAA;AACHG,QAAIJ,QAAQC,IAAAA;;GAEnBc,KAAKC,OAAOC,YAAAA;AACV9B,UAAM6B,MAAAA,CACHE,KAAK,WAAWC,MAAMf,IAAIW,GAAGI,GAAGF,QAAAA,CAAAA,CAChCC,KAAK,kBAAkBC,MAAMf,IAAIW,GAAGI,GAAGF,QAAAA,CAAAA,CACvCG,YAAU;;GAEfC,iBAAiBL,OAAOC,YAAAA;AACtB9B,UAAM6B,MAAAA,CACHE,KAAK,WAAWC,MAAMf,IAAIiB,eAAeF,GAAGF,QAAAA,CAAAA,CAC5CC,KAAK,kBAAkBC,MAAMf,IAAIiB,eAAeF,GAAGF,QAAAA,CAAAA,CACnDG,YAAU;;GAEfE,aAAa;IACXC,OAAOC,SAAS,GAAGC,SAASrB,IAAIkB,YAAYC,KAAKC,SAAAA,GAAYC,KAAAA;IAC7DC,uBAAuBT,YAAYb,IAAIkB,YAAYI,qBAAqBT,QAAAA;IAC1E;GACF;;CAjDF,YAAY,cAAgD/B,OAAOE,gBAAgB,EAAE;OAAxDM,cAAAA;;;;;;;;;;;;;;;;;;;ACH/B,IAAaoC,gCAAb,MAAaA;CAKXC,KAAKC,YAA4C;EAC/C,MAAMC,WAAW,KAAKC,QAAQC,IAAIH,WAAWI,GAAE;AAC/C,MAAIH,YAAY,CAACA,SAASI,aAAW,EAAI;AACvCJ,YAASK,OAAK;AACd,UAAOL;;EAGT,MAAMM,SAAS,KAAKC,QAAQT,KAAKC,WAAAA;AACjC,OAAKE,QAAQO,IAAIT,WAAWI,IAAIG,OAAAA;AAEhCA,SAAOG,GAAG,gBAAU;AAClB,QAAKR,QAAQS,OAAOX,WAAWI,GAAE;IACnC;AAEA,SAAOG;;CAGTK,MAAMR,IAAoB;EACxB,MAAMG,SAAS,KAAKL,QAAQC,IAAIC,GAAAA;AAChC,MAAIG,UAAU,CAACA,OAAOF,aAAW,CAC/BE,QAAOK,OAAK;;CAIhBC,WAAiB;AACf,OAAK,MAAMN,UAAU,KAAKL,QAAQY,QAAM,CACtC,KAAI,CAACP,OAAOF,aAAW,CACrBE,QAAOK,OAAK;;CAKlBG,QAAgB;AACd,SAAO,KAAKb,QAAQc;;CAnCtB,YAAY,UAA2BpB,OAAOC,6BAA6B,EAAE;OAAhDW,UAAAA;OAFZN,0BAAU,IAAIe,KAAAA;;;;;;;;;;ACAjC,MAAMK,yBAAyB,IAAIC,IAAI,CAAC,OAAO,OAAO,CAAA;AACtD,MAAMC,mBAAmB,IAAID,IAAI;CAAC;CAAK;CAAK;CAAI,CAAA;AAChD,MAAME,6BAA6B;CACjC;CACA;CACA;CACA;CACA;CACD;AAED,MAAMC,qBAAqBC,gBACzBF,2BAA2BG,MAAMC,WAAWF,YAAYG,WAAWD,OAAAA,CAAAA;AAErE,MAAME,UAAUC,SACdX,MAAMW,KAAAA,CACHC,KAAK,EAAEC,MAAM,QAAO,QAAS,KAAA,CAC7BD,KAAK,EAAEC,MAAM,QAAO,GAAI,EAAEC,YAAYA,MAAAA,CACtCF,KAAK,EAAEC,MAAM,eAAc,GAAI,EAAEC,YAAYA,MAAAA,CAC7CC,YAAU;AAEf,MAAaC,aAAaC,SAA0BC,YAAAA;CAClD,MAAMC,UAA8BF,QAAQE,QAAQC,KAAK,CAACC,GAAGC,OAAO,CAACD,GAAGC,EAAE,CAAA;AAC1E,QAAO,IAAIC,QAAQL,QAAQM,QAAQ,QAAQ,GAAA,GAAMP,QAAQQ,MAAM;EAC7DC,QAAQT,QAAQS;EAChBP;EACAR,MAAMV,uBAAuB0B,IAAIV,QAAQS,OAAM,GAAI,OAAOhB,OAAOO,QAAQN,KAAI;EAC/E,CAAA;;AAGF,MAAaiB,gBAAgB,OAC3BC,UACAH,WAAAA;CAEA,MAAMP,UAA8B,EAAE;AACtCU,UAASV,QAAQW,SAAShB,OAAOiB,QAAAA;AAC/BZ,UAAQa,KAAK,CAACD,KAAKjB,MAAM,CAAA;GAC3B;CAEA,IAAIH;AACJ,KAAIR,iBAAiBwB,IAAIE,SAASI,OAAM,IAAKP,WAAW,OACtDf,QAAO,EAAEE,MAAM,QAAO;MACjB;EACL,MAAMP,cAAcuB,SAASV,QAAQe,IAAI,eAAA;AACzC,MAAI5B,eAAeD,kBAAkBC,YAAAA,CACnCK,QAAO;GAAEE,MAAM;GAAQC,OAAO,MAAMe,SAASM,MAAI;GAAG;MAEpDxB,QAAO;GAAEE,MAAM;GAAeC,OAAO,MAAMe,SAASO,aAAW;GAAG;;AAItE,QAAO;EACLH,QAAQJ,SAASI;EACjBI,YAAYR,SAASQ;EACrBlB;EACAR;EACF;;8CAkBF,MAAa2B,iBAAiDzC,WAAW,WAAA;8CAGzE,MAAa0C,kBACXC,SACAC,OACAC,YAAAA;AAEAF,SAAQG,OAAOD,SAAS,OAAOE,OAAO3B,YACpCnB,aAAa,YAAA;AACXC,aAAW,YAAY6C,MAAAA;AAGvB,SAAOhB,cAAcC,MADEY,MADPzB,UAAUC,SAASyB,QACNG,CAAAA,EACE5B,QAAQS,OAAM;GAC/C,CAAA;AAGF,cAAO;AACLc,UAAQM,cAAcJ,QAAAA;;;;;8EC9F1B,IAAaK,sCAAb,cAAyDC,MAAAA;CAIvD,YAAYC,SAAgD;AAC1D,QAAM,uCAAuCA,QAAQC,WAAW,6BAA4B,EAAA,KAJ5EC,OAAO;AAKvB,OAAKF,UAAUA;AACfG,SAAOC,eAAe,MAAM,IAAA,OAAWC,UAAS;;;;;AC+CpD,MAAMQ,sBAAsB;gCAK5B,MAAMC,qBAAqB,OACzBC,SACAC,SAAAA;AAEA,KAAI;AACF,SAAO,MAAMA,MAAAA;UACNC,OAAO;AACd,MAAI;AACF,SAAMF,SAAAA;WACCG,cAAc;AACrB,SAAM,IAAIC,eACR,CAACF,OAAOC,aAAa,EACrB,2DAAA;;AAGJ,QAAMD;;;AAIV,MAAMG,qBACJC,UACAC,aAAAA;CAOA,MAAME,cAA6B;EAJjC,GAAGH;EACHC;EAG2C;AAE7C,MAAK,MAAMG,SAASJ,SAASK,kBAAkBlB,YAAAA,CAC7CmB,QAAOC,eAAeJ,aAAaC,MAAMI,KAAK;EAC5CC,OAAO;GACL,GAAGL,MAAMM;GACTC,QAAQ1B,oBAAoBmB,MAAMM,aAAaE,QAAQC,aACrDb,SAASc,iBAAiBD,SAAAA,CAAAA;GAE9B;EACAE,cAAc;EACdC,YAAY;EACd,CAAA;AAGF,QAAOb;;qGAST,eAAsBc,WACpBC,KACAC,UAA8B,EAAE,EAAA;CAEhC,MAAMnB,WAAW,MAAMkB,IAAIE,cAAc;EACvC,GAAID,QAAQE,YAAYC,KAAAA,IAAY,EAAC,GAAI,EAAED,SAASF,QAAQE,SAAS;EACrE,GAAIF,QAAQI,aAAaD,KAAAA,IAAY,EAAC,GAAI,EAAEC,UAAUJ,QAAQI,UAAU;EACxEC,iBAAiB,CAACnC,mBAAmB;EACrCoC,QAAQN,QAAQM,UAAU;EAC5B,CAAA;CAIA,IAAIC;AAEJ,QAAOjC,mBACL,YAAA;AACEiC,sBAAAA;AACA,QAAM1B,SAASC,UAAQ;IAEzB,YAAA;EACE,MAAM0B,aAAaR,QAAQQ,cAAczC;EACzC,MAAM0C,WAAW5B,SACdK,kBAAkBlB,YAAAA,CAClB0C,MAAMzB,UAAUA,MAAMI,QAAQmB,WAAAA;AAEjC,MAAIC,aAAaN,KAAAA,EACf,OAAM,IAAI/B,oCAAoC,EAAEoC,YAAW,CAAA;EAG7D,MAAMG,kBAAkB,MAAM9B,SAAS+B,IAAI3C,gBAAAA;EAC3C,MAAM4C,UAAUb,QAAQc,cAAczC;AAEtCkC,qBAAmBpC,eACjBwC,gBAAgBI,MAAMC,SACtBP,SAASlB,aAAaE,OACtBoB,QAAAA;EAGF,MAAM/B,WAAW,YAAA;AACfyB,uBAAAA;AACA,SAAM1B,SAASC,UAAQ;;AAGzB,SAAOF,kBAAkBC,UAAUC,SAAAA;GACrC"}
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":";;;;;;;;;;;;;;AA+BA,IAAaG,kBAAb,MAAaA;CAOX,MAAMC,UAAkC;EACtC,MAAM,EACJC,KACAC,eAAeC,IACfC,QACAC,SACAC,MACAC,UACAC,QACAC,UACE,MAAM,OAAO;AAEjB,QAAMR,IAAIS,WAAS;AAEnB,SAAO;GACLT;GACAI;GACAE;GACAE;GACAD;GACAJ;GACAE;GACAK,sBAAsBC,YAA6C,IAAIT,GAAGS,QAAAA;GAC1EC,qBAAqBV,GAAGU,eAAa;GACrCC,kBAAkBC,OAAoBZ,GAAGW,gBAAgBC,GAAAA;GACzDC,SAASC,OAAed,GAAGa,OAAOC,GAAAA;GAClCC,wBAAwBf,GAAGe,kBAAgB;GAC7C;;CAGFC,WAAiB;AACf,OAAKC,MAAMnB,IAAIoB,MAAI;;CAnCrB,YAAYC,mBAAmBzB,OAAOC,iBAAiB,EAAE;AACvD,OAAKsB,QAAQE,iBAAiBC,SAAS,KAAI;;;;;;;;;;;;;;;;AChC/C,IAAaG,qBAAb,cAAwCD,WAAAA;CAC7BE,IAAIC,KAAiC;AAC5C,SAAOC,QAAQC,IAAIF;;;;;;;;;;;;;;;ACEvB,IAAaO,+BAAb,MAAaA;CAGXC,KAAKC,YAA4C;EAC/C,MAAMC,SAAS,KAAKC,mBAClB,KAAKC,YAAYC,MAAMC,oBAAoBL,WAAWM,QAAO,CAAA;AAG/D,MAAIN,WAAWO,WAAWC,SAAS,MACjCP,QAAOQ,QAAQT,WAAWO,WAAWG,IAAG;MAExCT,QAAOU,SAASX,WAAWO,WAAWK,KAAI;AAG5C,SAAOX;;CAGTC,mBAAmBW,KAAkC;AACnD,SAAO;GACLC,IAAID,IAAIC;GACRC,QAAQF;GACRG,aAAaH,IAAIG,OAAK;GACtBC,aAAaJ,IAAII,OAAK;GACtBC,YAAYL,IAAIK,MAAI;GACpBC,mBAAmBN,IAAIM,aAAW;GAClCC,gBAAgBP,IAAIO,UAAQ;GAC5BC,iBAAiBR,IAAIQ,WAAS;GAC9BC,YAAYC,WAAWV,IAAIS,UAAUC,OAAAA;GACrCZ,WAAWC,SAAAA;AACJC,QAAIF,SAASC,KAAAA;;GAEpBH,UAAUC,QAAAA;AACHG,QAAIJ,QAAQC,IAAAA;;GAEnBc,KAAKC,OAAOC,YAAAA;AACV9B,UAAM6B,MAAAA,CACHE,KAAK,WAAWC,MAAMf,IAAIW,GAAGI,GAAGF,QAAAA,CAAAA,CAChCC,KAAK,kBAAkBC,MAAMf,IAAIW,GAAGI,GAAGF,QAAAA,CAAAA,CACvCG,YAAU;;GAEfC,iBAAiBL,OAAOC,YAAAA;AACtB9B,UAAM6B,MAAAA,CACHE,KAAK,WAAWC,MAAMf,IAAIiB,eAAeF,GAAGF,QAAAA,CAAAA,CAC5CC,KAAK,kBAAkBC,MAAMf,IAAIiB,eAAeF,GAAGF,QAAAA,CAAAA,CACnDG,YAAU;;GAEfE,aAAa;IACXC,OAAOC,SAAS,GAAGC,SAASrB,IAAIkB,YAAYC,KAAKC,SAAAA,GAAYC,KAAAA;IAC7DC,uBAAuBT,YAAYb,IAAIkB,YAAYI,qBAAqBT,QAAAA;IAC1E;GACF;;CAjDF,YAAY,cAAgD/B,OAAOE,gBAAgB,EAAE;OAAxDM,cAAAA;;;;;;;;;;;;;;;;;;;ACH/B,IAAaoC,gCAAb,MAAaA;CAKXC,KAAKC,YAA4C;EAC/C,MAAMC,WAAW,KAAKC,QAAQC,IAAIH,WAAWI,GAAE;AAC/C,MAAIH,YAAY,CAACA,SAASI,aAAW,EAAI;AACvCJ,YAASK,OAAK;AACd,UAAOL;;EAGT,MAAMM,SAAS,KAAKC,QAAQT,KAAKC,WAAAA;AACjC,OAAKE,QAAQO,IAAIT,WAAWI,IAAIG,OAAAA;AAEhCA,SAAOG,GAAG,gBAAU;AAClB,QAAKR,QAAQS,OAAOX,WAAWI,GAAE;IACnC;AAEA,SAAOG;;CAGTK,MAAMR,IAAoB;EACxB,MAAMG,SAAS,KAAKL,QAAQC,IAAIC,GAAAA;AAChC,MAAIG,UAAU,CAACA,OAAOF,aAAW,CAC/BE,QAAOK,OAAK;;CAIhBC,WAAiB;AACf,OAAK,MAAMN,UAAU,KAAKL,QAAQY,QAAM,CACtC,KAAI,CAACP,OAAOF,aAAW,CACrBE,QAAOK,OAAK;;CAKlBG,QAAgB;AACd,SAAO,KAAKb,QAAQc;;CAnCtB,YAAY,UAA2BpB,OAAOC,6BAA6B,EAAE;OAAhDW,UAAAA;OAFZN,0BAAU,IAAIe,KAAAA;;;;;;;;;;ACCjC,MAAMI,yBAAyB,IAAIC,IAAI,CAAC,OAAO,OAAO,CAAA;AACtD,MAAMC,mBAAmB,IAAID,IAAI;CAAC;CAAK;CAAK;CAAI,CAAA;AAChD,MAAME,6BAA6B;CACjC;CACA;CACA;CACA;CACA;CACD;AAED,MAAMC,qBAAqBC,gBACzBF,2BAA2BG,MAAMC,WAAWF,YAAYG,WAAWD,OAAAA,CAAAA;AAErE,MAAME,UAAUC,SACdX,MAAMW,KAAAA,CACHC,KAAK,EAAEC,MAAM,QAAO,QAAS,KAAA,CAC7BD,KAAK,EAAEC,MAAM,QAAO,GAAI,EAAEC,YAAYA,MAAAA,CACtCF,KAAK,EAAEC,MAAM,eAAc,GAAI,EAAEC,YAAYA,MAAAA,CAC7CC,YAAU;AAEf,MAAaC,aAAaC,SAA0BC,YAAAA;CAClD,MAAMC,UAA8BF,QAAQE,QAAQC,KAAK,CAACC,GAAGC,OAAO,CAACD,GAAGC,EAAE,CAAA;AAC1E,QAAO,IAAIC,QAAQL,QAAQM,QAAQ,QAAQ,GAAA,GAAMP,QAAQQ,MAAM;EAC7DC,QAAQT,QAAQS;EAChBP;EACAR,MAAMV,uBAAuB0B,IAAIV,QAAQS,OAAM,GAAI,OAAOhB,OAAOO,QAAQN,KAAI;EAC/E,CAAA;;AAGF,MAAaiB,gBAAgB,OAC3BC,UACAH,WAAAA;CAEA,MAAMP,UAA8B,EAAE;AACtCU,UAASV,QAAQW,SAAShB,OAAOiB,QAAAA;AAC/BZ,UAAQa,KAAK,CAACD,KAAKjB,MAAM,CAAA;GAC3B;CAEA,IAAIH;AACJ,KAAIR,iBAAiBwB,IAAIE,SAASI,OAAM,IAAKP,WAAW,OACtDf,QAAO,EAAEE,MAAM,QAAO;MACjB;EACL,MAAMP,cAAcuB,SAASV,QAAQe,IAAI,eAAA;AACzC,MAAI5B,eAAeD,kBAAkBC,YAAAA,CACnCK,QAAO;GAAEE,MAAM;GAAQC,OAAO,MAAMe,SAASM,MAAI;GAAG;MAEpDxB,QAAO;GAAEE,MAAM;GAAeC,OAAO,MAAMe,SAASO,aAAW;GAAG;;AAItE,QAAO;EACLH,QAAQJ,SAASI;EACjBI,YAAYR,SAASQ;EACrBlB;EACAR;EACF;;AAGF,MAAM2B,kBAAkB,IAAIxC,mBAAAA;AAU5B,MAAayC,iBAAiDD,gBAAgBE,UAAQ;AAEtF,MAAaC,kBACXC,SACAC,OACAC,YAAAA;AAEAF,SAAQG,OAAOD,SAAS,OAAOE,OAAO7B,YACpCqB,gBAAgBS,IAAID,aAClB/C,aAAa,YAAA;AAGX,SAAO6B,cAAcC,MADEc,MADP3B,UAAUC,SAAS2B,QACNI,CAAAA,EACE/B,QAAQS,OAAM;GAC/C,CAAA,CAAA;AAIJ,cAAO;AACLgB,UAAQO,cAAcL,QAAAA;;;;;8EC1F1B,IAAaM,sCAAb,cAAyDC,MAAAA;CAIvD,YAAYC,SAAgD;AAC1D,QAAM,uCAAuCA,QAAQC,WAAW,6BAA4B,EAAA,KAJ5EC,OAAO;AAKvB,OAAKF,UAAUA;AACfG,SAAOC,eAAe,MAAM,IAAA,OAAWC,UAAS;;;;;AC+CpD,MAAMQ,sBAAsB;gCAK5B,MAAMC,qBAAqB,OACzBC,SACAC,SAAAA;AAEA,KAAI;AACF,SAAO,MAAMA,MAAAA;UACNC,OAAO;AACd,MAAI;AACF,SAAMF,SAAAA;WACCG,cAAc;AACrB,SAAM,IAAIC,eACR,CAACF,OAAOC,aAAa,EACrB,2DAAA;;AAGJ,QAAMD;;;AAIV,MAAMG,qBACJC,UACAC,aAAAA;CAOA,MAAME,cAA6B;EAJjC,GAAGH;EACHC;EAG2C;AAE7C,MAAK,MAAMG,SAASJ,SAASK,kBAAkBlB,YAAAA,CAC7CmB,QAAOC,eAAeJ,aAAaC,MAAMI,KAAK;EAC5CC,OAAO;GACL,GAAGL,MAAMM;GACTC,QAAQ1B,oBAAoBmB,MAAMM,aAAaE,QAAQC,aACrDb,SAASc,iBAAiBD,SAAAA,CAAAA;GAE9B;EACAE,cAAc;EACdC,YAAY;EACd,CAAA;AAGF,QAAOb;;qGAST,eAAsBc,WACpBC,KACAC,UAA8B,EAAE,EAAA;CAEhC,MAAMnB,WAAW,MAAMkB,IAAIE,cAAc;EACvC,GAAID,QAAQE,YAAYC,KAAAA,IAAY,EAAC,GAAI,EAAED,SAASF,QAAQE,SAAS;EACrE,GAAIF,QAAQI,aAAaD,KAAAA,IAAY,EAAC,GAAI,EAAEC,UAAUJ,QAAQI,UAAU;EACxEC,iBAAiB,CAACnC,mBAAmB;EACrCoC,QAAQN,QAAQM,UAAU;EAC5B,CAAA;CAIA,IAAIC;AAEJ,QAAOjC,mBACL,YAAA;AACEiC,sBAAAA;AACA,QAAM1B,SAASC,UAAQ;IAEzB,YAAA;EACE,MAAM0B,aAAaR,QAAQQ,cAAczC;EACzC,MAAM0C,WAAW5B,SACdK,kBAAkBlB,YAAAA,CAClB0C,MAAMzB,UAAUA,MAAMI,QAAQmB,WAAAA;AAEjC,MAAIC,aAAaN,KAAAA,EACf,OAAM,IAAI/B,oCAAoC,EAAEoC,YAAW,CAAA;EAG7D,MAAMG,kBAAkB,MAAM9B,SAAS+B,IAAI3C,gBAAAA;EAC3C,MAAM4C,UAAUb,QAAQc,cAAczC;AAEtCkC,qBAAmBpC,eACjBwC,gBAAgBI,MAAMC,SACtBP,SAASlB,aAAaE,OACtBoB,QAAAA;EAGF,MAAM/B,WAAW,YAAA;AACfyB,uBAAAA;AACA,SAAM1B,SAASC,UAAQ;;AAGzB,SAAOF,kBAAkBC,UAAUC,SAAAA;GACrC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeltjs/adapter-electron",
3
- "version": "0.11.0",
3
+ "version": "0.12.0-canary.1",
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/adapter-node": "0.11.0",
54
- "@zeltjs/core": "0.11.0"
53
+ "@zeltjs/adapter-node": "0.12.0-canary.1",
54
+ "@zeltjs/core": "0.12.0-canary.1"
55
55
  },
56
56
  "devDependencies": {
57
57
  "@types/node": "22.19.17"