@lynker-desktop/electron-window-manager 0.0.4-alpha.7 → 0.0.4-alpha.72

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/esm/main/index.js CHANGED
@@ -1,8 +1,20 @@
1
- import _ from 'lodash';
2
- import { BrowserWindow, BrowserView } from 'electron';
1
+ import lodash from 'lodash';
2
+ import { app, session, BrowserWindow, BrowserView, webContents } from 'electron';
3
3
  import * as remote from '@electron/remote/main';
4
4
  import eIpc from '@lynker-desktop/electron-ipc/main';
5
5
 
6
+ const getCustomSession = (() => {
7
+ let customSession;
8
+ return () => {
9
+ if (!customSession) {
10
+ customSession = session.fromPartition('persist:__global_main_session__');
11
+ }
12
+ return customSession;
13
+ };
14
+ })();
15
+ app.on('ready', () => {
16
+ getCustomSession();
17
+ });
6
18
  if (!remote.isInitialized()) {
7
19
  remote.initialize();
8
20
  }
@@ -10,50 +22,158 @@ const enable = (win) => {
10
22
  remote.enable(win);
11
23
  };
12
24
  class WindowsManager {
13
- constructor(preload) {
25
+ constructor(preload, loadingViewUrl, errorViewUrl) {
14
26
  this.preload = preload;
15
27
  this.windows = new Map();
28
+ this.loadingViewUrl = `${loadingViewUrl ?? ''}`;
29
+ this.errorViewUrl = `${errorViewUrl ?? ''}`;
16
30
  }
17
31
  create(options) {
18
- const { name = 'anonymous', loadingView, browserWindow: browserWindowOptions = {}, openDevTools = false, preventOriginClose = false, } = options;
19
- const window = new BrowserWindow(_.merge({
20
- acceptFirstMouse: true,
21
- }, browserWindowOptions, {
22
- webPreferences: {
23
- plugins: true,
24
- nodeIntegration: true,
25
- contextIsolation: false,
26
- backgroundThrottling: false,
27
- nativeWindowOpen: false,
28
- webSecurity: false,
29
- preload: browserWindowOptions?.webPreferences?.preload || this.preload,
30
- }
31
- }));
32
- remote.enable(window.webContents);
33
- window._name = name;
34
- if (loadingView?.url) {
35
- this._setLoadingView(window, options);
36
- }
37
- window.on('close', (event) => {
38
- if (preventOriginClose) {
39
- event.preventDefault();
40
- return;
32
+ let window;
33
+ try {
34
+ const { type = 'BW', name = 'anonymous', url, loadingView = { url: undefined }, errorView = { url: undefined }, browserWindow: browserWindowOptions, openDevTools = false, preventOriginClose = false, } = options;
35
+ options.type = type;
36
+ try {
37
+ loadingView.url = `${loadingView?.url ?? this.loadingViewUrl}`;
38
+ lodash.merge(options, {
39
+ loadingView,
40
+ });
41
41
  }
42
- this.windows.delete(window.id);
43
- });
44
- window.webContents.on('dom-ready', () => {
45
- if (openDevTools) {
46
- window.webContents.openDevTools();
42
+ catch (error) {
43
+ log('error', 'loadingView error:', loadingView, this.loadingViewUrl);
47
44
  }
48
- });
49
- this.windows.set(window.id, window);
50
- if (/^file/gi.test(options.url)) {
51
- window.loadFile(options.url);
45
+ try {
46
+ errorView.url = `${errorView?.url ?? this.errorViewUrl}`;
47
+ lodash.merge(options, {
48
+ errorView,
49
+ });
50
+ }
51
+ catch (error) {
52
+ log('error', 'errorView error:', errorView, this.errorViewUrl);
53
+ }
54
+ let parentWin = undefined;
55
+ if (typeof browserWindowOptions?.parent === 'number') {
56
+ parentWin = BrowserWindow.fromId(browserWindowOptions?.parent) || undefined;
57
+ if (parentWin) {
58
+ browserWindowOptions.parent = parentWin;
59
+ }
60
+ else {
61
+ browserWindowOptions.parent = undefined;
62
+ }
63
+ }
64
+ log('log', 'create 1: ', options);
65
+ log('log', 'create 2: ', `parentWin: ${parentWin?.id}`);
66
+ window = type === 'BV' ?
67
+ new BrowserView(lodash.merge((browserWindowOptions || {}), {
68
+ parent: undefined,
69
+ webPreferences: {
70
+ // session: getCustomSession(),
71
+ plugins: true,
72
+ nodeIntegration: true,
73
+ contextIsolation: false,
74
+ backgroundThrottling: false,
75
+ nativeWindowOpen: false,
76
+ webSecurity: false,
77
+ preload: browserWindowOptions?.webPreferences?.preload || this.preload,
78
+ }
79
+ }))
80
+ : new BrowserWindow(lodash.merge({
81
+ acceptFirstMouse: true,
82
+ }, (browserWindowOptions || {}), {
83
+ parent: parentWin,
84
+ webPreferences: {
85
+ // session: getCustomSession(),
86
+ plugins: true,
87
+ nodeIntegration: true,
88
+ contextIsolation: false,
89
+ backgroundThrottling: false,
90
+ nativeWindowOpen: false,
91
+ webSecurity: false,
92
+ preload: browserWindowOptions?.webPreferences?.preload || this.preload,
93
+ }
94
+ }));
95
+ try {
96
+ remote.enable(window.webContents);
97
+ }
98
+ catch (error) {
99
+ log('error', 'enable: ', error);
100
+ }
101
+ // @ts-ignore
102
+ try {
103
+ window.id = window.id || window.webContents.id;
104
+ }
105
+ catch (error) {
106
+ // log('error', 'set id: ', error)
107
+ }
108
+ window._type = type;
109
+ window._name = name;
110
+ window._extraData = `${options?.extraData || ''}`;
111
+ log('log', 'create 5: ', window.id, window._name);
112
+ if (loadingView?.url) {
113
+ if (type === 'BW') {
114
+ // @ts-ignore
115
+ this._setLoadingView(window, options);
116
+ }
117
+ }
118
+ if (errorView?.url) {
119
+ const showErrorView = lodash.debounce(() => {
120
+ const _url = window?.webContents?.getURL?.() || url;
121
+ /**
122
+ * 判断是否是错误视图
123
+ */
124
+ const isErrorView = `${_url}`.toUpperCase().startsWith(`${errorView?.url}`.toUpperCase());
125
+ if (!isErrorView && _url) {
126
+ // @ts-ignore
127
+ window.loadURL ? window.loadURL(`${errorView?.url}`) : window.webContents.loadURL(`${errorView?.url}`);
128
+ window.webContents.executeJavaScript(`
129
+ var key = '__ELECTRON_WINDOW_MANAGER_DID_FAIL_LOAD_URL__';
130
+ window[key] = "${_url}";
131
+ sessionStorage.setItem(key, "${_url}");
132
+ `);
133
+ }
134
+ }, 300);
135
+ window.webContents.on('did-fail-load', () => {
136
+ showErrorView();
137
+ });
138
+ window.webContents.on('did-start-loading', () => {
139
+ showErrorView.cancel();
140
+ });
141
+ }
142
+ window.webContents.on('close', () => {
143
+ this.windows.set(window.id, null);
144
+ this.windows.delete(window.id);
145
+ });
146
+ window.webContents.on('destroyed', () => {
147
+ this.windows.set(window.id, null);
148
+ this.windows.delete(window.id);
149
+ });
150
+ window.webContents.on('dom-ready', () => {
151
+ if (openDevTools) {
152
+ window.webContents.openDevTools();
153
+ }
154
+ });
155
+ if (type === 'BW') {
156
+ // @ts-ignore
157
+ window.on('closed', () => {
158
+ log('log', 'closed', window.id, window._name);
159
+ this.windows.set(window.id, null);
160
+ this.windows.delete(window.id);
161
+ });
162
+ }
163
+ if (type === 'BV') {
164
+ parentWin?.addBrowserView(window);
165
+ log('log', 'create - addBrowserView', parentWin, window);
166
+ }
167
+ // @ts-ignore
168
+ window.loadURL ? window.loadURL(options.url) : window.webContents.loadURL(options.url);
169
+ // @ts-ignore
170
+ window.focus ? window.focus() : window.webContents.focus();
171
+ this.windows.set(window.id || window.webContents.id, window);
172
+ log('log', 'create', this.windows.keys());
52
173
  }
53
- else {
54
- window.loadURL(options.url);
174
+ catch (error) {
175
+ log('error', 'create', error);
55
176
  }
56
- window.focus();
57
177
  return window;
58
178
  }
59
179
  _setLoadingView(window, createOptions) {
@@ -61,6 +181,7 @@ class WindowsManager {
61
181
  const { loadingView, preventOriginNavigate = false, } = createOptions;
62
182
  let _loadingView = new BrowserView({
63
183
  webPreferences: {
184
+ // session: getCustomSession(),
64
185
  contextIsolation: false,
65
186
  nodeIntegration: true,
66
187
  // 允许loadURL与文件路径在开发环境
@@ -79,9 +200,10 @@ class WindowsManager {
79
200
  width: viewWidth || 10,
80
201
  height: viewHeight || 10,
81
202
  });
203
+ log('log', 'loadLoadingView', window._name, loadingView);
82
204
  _loadingView.webContents.loadURL(loadingView?.url || '');
83
205
  };
84
- const onFailure = () => {
206
+ const onFailure = lodash.debounce(() => {
85
207
  if (_loadingView.webContents && !_loadingView.webContents.isDestroyed()) {
86
208
  _loadingView.webContents.close();
87
209
  }
@@ -91,9 +213,9 @@ class WindowsManager {
91
213
  if (window) {
92
214
  window.removeBrowserView(_loadingView);
93
215
  }
94
- };
216
+ }, 300);
95
217
  loadLoadingView();
96
- window.on('resize', _.debounce(() => {
218
+ window.on('resize', lodash.debounce(() => {
97
219
  if (_loadingView.webContents && !_loadingView.webContents.isDestroyed()) {
98
220
  if (window.isDestroyed()) {
99
221
  return;
@@ -123,61 +245,123 @@ class WindowsManager {
123
245
  window.webContents.on('crashed', onFailure);
124
246
  window.webContents.on('unresponsive', onFailure);
125
247
  window.webContents.on('did-fail-load', onFailure);
248
+ window.webContents.on('did-finish-load', onFailure);
249
+ window.webContents.on('did-stop-loading', onFailure);
126
250
  }
127
251
  }
128
- get(name) {
129
- let win = undefined;
130
- this.windows.forEach((i) => {
131
- if (i._name === name) {
132
- win = i;
252
+ get(idOrName) {
253
+ log('log', 'get', idOrName);
254
+ let win;
255
+ this.windows.forEach((i, key) => {
256
+ try {
257
+ if (!(i && i?.webContents?.isDestroyed && !i?.webContents?.isDestroyed?.())) {
258
+ this.windows.set(key, null);
259
+ this.windows.delete(key);
260
+ i = null;
261
+ }
133
262
  }
134
- });
135
- return win;
136
- }
137
- getById(id) {
138
- let win = undefined;
139
- this.windows.forEach((i) => {
140
- if (i.id === id) {
141
- win = i;
263
+ catch (error) {
264
+ log('error', 'get');
265
+ }
266
+ if (typeof idOrName === 'number') {
267
+ if (i?.id === idOrName) {
268
+ win = i;
269
+ }
270
+ }
271
+ else if (typeof idOrName === 'string') {
272
+ if (i?._name === idOrName) {
273
+ win = i;
274
+ }
142
275
  }
143
276
  });
144
- return win;
277
+ // @ts-ignore
278
+ if (win && win?.webContents?.isDestroyed && !win?.webContents?.isDestroyed?.()) {
279
+ return win;
280
+ }
281
+ return undefined;
145
282
  }
146
283
  getAll() {
284
+ log('log', 'getAll');
285
+ this.windows.forEach((win, key) => {
286
+ log('log', 'getAll', key, win, win?.webContents?.isDestroyed, win?.webContents?.isDestroyed?.());
287
+ if (!(win && win?.webContents?.isDestroyed && !win?.webContents?.isDestroyed?.())) {
288
+ this.windows.set(key, null);
289
+ this.windows.delete(key);
290
+ }
291
+ });
147
292
  return this.windows;
148
293
  }
149
- close(name) {
294
+ close(idOrName) {
295
+ log('log', 'close', idOrName);
150
296
  let win = undefined;
151
297
  this.windows.forEach((i) => {
152
- if (i._name === name) {
153
- win = i;
298
+ if (typeof idOrName === 'number') {
299
+ if (i?.id === idOrName) {
300
+ win = i;
301
+ }
302
+ }
303
+ else if (typeof idOrName === 'string') {
304
+ if (i?._name === idOrName) {
305
+ win = i;
306
+ }
154
307
  }
155
308
  });
156
309
  // @ts-ignore
157
310
  win && this.windows.delete(win?.id);
158
311
  // @ts-ignore
159
- return win && win?.destroy();
312
+ if (win) {
313
+ // @ts-ignore
314
+ if (win._type === 'BV') {
315
+ this.windows.forEach(i => {
316
+ if (i?._type === 'BW') {
317
+ const _win = i;
318
+ _win.removeBrowserView(win);
319
+ }
320
+ });
321
+ }
322
+ // @ts-ignore
323
+ win?.webContent?.close?.();
324
+ // @ts-ignore
325
+ win?.close?.();
326
+ // @ts-ignore
327
+ win?.destroy?.();
328
+ }
329
+ return true;
160
330
  }
161
- closeById(id) {
162
- let win = undefined;
163
- this.windows.forEach((i) => {
164
- if (i.id === id) {
165
- win = i;
331
+ closeAll() {
332
+ log('log', 'closeAll');
333
+ this.windows.forEach((win) => {
334
+ try {
335
+ win && this.windows.delete(win?.id);
336
+ // @ts-ignore
337
+ if (win._type === 'BV') {
338
+ this.windows.forEach(i => {
339
+ if (i?._type === 'BW') {
340
+ const _win = i;
341
+ _win.removeBrowserView(win);
342
+ }
343
+ });
344
+ }
345
+ // @ts-ignore
346
+ win?.webContent?.close?.();
347
+ // @ts-ignore
348
+ win?.close?.();
349
+ // @ts-ignore
350
+ win?.destroy?.();
351
+ }
352
+ catch (error) {
166
353
  }
167
354
  });
168
- // @ts-ignore
169
- win && this.windows.delete(win?.id);
170
- // @ts-ignore
171
- return win && win?.destroy();
172
355
  }
173
356
  getPreload() {
357
+ log('log', 'getPreload');
174
358
  return this.preload;
175
359
  }
176
360
  }
177
361
  // @ts-ignore
178
362
  global['__ELECTRON_WINDOWS_MANAGER__'] = undefined;
179
363
  let isInitialized = false;
180
- const initialize = (preload) => {
364
+ const initialize = (preload, loadingViewUrl, errorViewUrl) => {
181
365
  // @ts-ignore
182
366
  if (isInitialized && global['__ELECTRON_WINDOWS_MANAGER__']) {
183
367
  // @ts-ignore
@@ -185,38 +369,45 @@ const initialize = (preload) => {
185
369
  }
186
370
  isInitialized = true;
187
371
  // @ts-ignore
188
- const wm = global['__ELECTRON_WINDOWS_MANAGER__'] = new WindowsManager(preload);
372
+ const wm = global['__ELECTRON_WINDOWS_MANAGER__'] = new WindowsManager(preload, loadingViewUrl, errorViewUrl);
189
373
  eIpc.mainIPC.handleRenderer('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', async (data) => {
190
374
  if (data?.type === 'create') {
191
375
  const opt = data;
192
376
  const findWin = wm.get(opt.data.name);
193
377
  if (findWin) {
194
- findWin.focus();
378
+ // @ts-ignore
379
+ findWin?.focus?.();
380
+ findWin?.webContents.focus?.();
381
+ if (opt.data.url && findWin.webContents.getURL() !== opt.data.url) {
382
+ findWin.webContents.loadURL(opt.data.url);
383
+ /** fix: url hash 无法正常加载 */
384
+ setTimeout(() => {
385
+ findWin.webContents.reload();
386
+ }, 100);
387
+ }
195
388
  return {
196
- winId: findWin?.id,
197
- winName: findWin?._name,
389
+ winId: Number(`${findWin?.id || -1}`),
390
+ winName: `${findWin?._name || ''}`,
391
+ winType: `${findWin?._type || ''}`,
392
+ winExtraData: `${findWin?._extraData || ''}`,
198
393
  };
199
394
  }
200
395
  const res = wm.create(opt.data);
201
396
  return {
202
- winId: Number(res.id),
203
- winName: res._name,
397
+ winId: Number(`${res.id || -1}`),
398
+ winName: `${res?._name || ''}`,
399
+ winType: `${res?._type || ''}`,
400
+ winExtraData: `${res?._extraData || ''}`,
204
401
  };
205
402
  }
206
403
  if (data?.type === 'get') {
207
404
  const opt = data;
208
405
  const res = wm.get(opt?.data);
209
406
  return {
210
- winId: res?.id ? Number(res?.id) : -1,
211
- winName: res?._name ? res?._name : '',
212
- };
213
- }
214
- if (data?.type === 'getById') {
215
- const opt = data;
216
- const res = wm.getById(opt?.data);
217
- return {
218
- winId: res?.id ? Number(res?.id) : -1,
219
- winName: res?._name ? res?._name : '',
407
+ winId: Number(`${res?.id || -1}`),
408
+ winName: `${res?._name || ''}`,
409
+ winType: `${res?._type || ''}`,
410
+ winExtraData: `${res?._extraData || ''}`,
220
411
  };
221
412
  }
222
413
  if (data?.type === 'getAll') {
@@ -225,8 +416,10 @@ const initialize = (preload) => {
225
416
  res.forEach(i => {
226
417
  // @ts-ignore
227
418
  obj[i.id] = {
228
- winId: i?.id ? Number(i?.id) : -1,
229
- winName: i?._name ? i?._name : '',
419
+ winId: Number(`${i?.id || -1}`),
420
+ winName: `${i?._name || ''}`,
421
+ winType: `${i?._type || ''}`,
422
+ winExtraData: `${i?._extraData || ''}`,
230
423
  };
231
424
  });
232
425
  return obj;
@@ -236,11 +429,36 @@ const initialize = (preload) => {
236
429
  const res = wm.close(opt?.data);
237
430
  return res;
238
431
  }
239
- if (data?.type === 'closeById') {
240
- const opt = data;
241
- const res = wm.closeById(opt?.data);
432
+ if (data?.type === 'closeAll') {
433
+ const res = wm.closeAll();
242
434
  return res;
243
435
  }
436
+ if (data?.type === 'getWindowForWebContentId') {
437
+ const opt = data;
438
+ const targetWebContents = webContents.fromId(opt.data);
439
+ if (targetWebContents) {
440
+ let win = BrowserWindow.fromWebContents(targetWebContents);
441
+ if (!win) {
442
+ // 获取所有的 BrowserWindows
443
+ let allWindows = BrowserWindow.getAllWindows();
444
+ // 遍历所有窗口,检查每个窗口的 BrowserView
445
+ for (let _win of allWindows) {
446
+ let views = _win.getBrowserViews();
447
+ // 遍历窗口的所有 BrowserView
448
+ for (let view of views) {
449
+ if (view.webContents === targetWebContents) {
450
+ win = _win;
451
+ break;
452
+ }
453
+ }
454
+ if (win)
455
+ break;
456
+ }
457
+ }
458
+ return win?.id;
459
+ }
460
+ return undefined;
461
+ }
244
462
  if (data?.type === 'getPreload') {
245
463
  const res = wm.getPreload();
246
464
  return res;
@@ -249,6 +467,15 @@ const initialize = (preload) => {
249
467
  });
250
468
  return wm;
251
469
  };
470
+ const log = (type, ...data) => {
471
+ const key = `[electron-window-manager]: `;
472
+ try {
473
+ console[type](key, ...data);
474
+ }
475
+ catch (error) {
476
+ console.error(key, error);
477
+ }
478
+ };
252
479
 
253
- export { WindowsManager, enable, initialize, isInitialized };
480
+ export { WindowsManager, enable, getCustomSession, initialize, isInitialized };
254
481
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/main/index.ts"],"sourcesContent":["import _ from 'lodash'\nimport { BrowserWindow, BrowserView, WebContents } from 'electron'\nimport * as remote from '@electron/remote/main'\nimport eIpc from '@lynker-desktop/electron-ipc/main'\nimport type { ElectronWindowsManagerOptions, WindowItem } from '../common';\n\nif (!remote.isInitialized()) {\n remote.initialize();\n}\n\nexport const enable = (win: WebContents) => {\n remote.enable(win)\n}\n\nexport class WindowsManager {\n preload?: string;\n windows: Map<number, WindowItem>;\n constructor(preload?: string) {\n this.preload = preload;\n this.windows = new Map();\n }\n\n create(options: ElectronWindowsManagerOptions) {\n const {\n name = 'anonymous',\n loadingView,\n browserWindow: browserWindowOptions = {},\n openDevTools = false,\n preventOriginClose = false,\n } = options;\n const window = new BrowserWindow(\n _.merge(\n {\n acceptFirstMouse: true,\n },\n browserWindowOptions,\n {\n webPreferences: {\n plugins: true,\n nodeIntegration: true,\n contextIsolation: false,\n backgroundThrottling: false,\n nativeWindowOpen: false,\n webSecurity: false,\n preload: browserWindowOptions?.webPreferences?.preload || this.preload,\n }\n },\n )\n ) as WindowItem;\n remote.enable(window.webContents);\n window._name = name;\n if (loadingView?.url) {\n this._setLoadingView(window, options);\n }\n window.on('close', (event) => {\n if (preventOriginClose) {\n event.preventDefault();\n return;\n }\n this.windows.delete(window.id)\n });\n window.webContents.on('dom-ready', () => {\n if (openDevTools) {\n window.webContents.openDevTools();\n }\n });\n this.windows.set(window.id, window);\n if (/^file/gi.test(options.url)) {\n window.loadFile(options.url)\n } else {\n window.loadURL(options.url)\n }\n window.focus();\n return window;\n }\n\n _setLoadingView(window: WindowItem, createOptions: ElectronWindowsManagerOptions) {\n if (createOptions) {\n const {\n loadingView,\n preventOriginNavigate = false,\n } = createOptions;\n let _loadingView = new BrowserView({\n webPreferences: {\n contextIsolation: false,\n nodeIntegration: true,\n // 允许loadURL与文件路径在开发环境\n webSecurity: false,\n }\n });\n\n if (window.isDestroyed()) {\n return;\n }\n\n const loadLoadingView = () => {\n const [ viewWidth, viewHeight ] = window.getSize();\n window.setBrowserView(_loadingView);\n _loadingView.setBounds({\n x: 0,\n y: 0,\n width: viewWidth || 10,\n height: viewHeight || 10,\n });\n _loadingView.webContents.loadURL(loadingView?.url || '');\n };\n\n const onFailure = () => {\n if (_loadingView.webContents && !_loadingView.webContents.isDestroyed()) {\n _loadingView.webContents.close();\n }\n if (window.isDestroyed()) {\n return;\n }\n\n if (window) {\n window.removeBrowserView(_loadingView);\n }\n };\n\n loadLoadingView();\n\n window.on('resize', _.debounce(() => {\n if (_loadingView.webContents && !_loadingView.webContents.isDestroyed()) {\n if (window.isDestroyed()) {\n return;\n }\n const [ viewWidth, viewHeight ] = window.getSize();\n _loadingView.setBounds({ x: 0, y: 0, width: viewWidth || 10, height: viewHeight || 10 });\n }\n }, 500));\n\n window.webContents.on('will-navigate', (e) => {\n if (preventOriginNavigate) {\n e.preventDefault();\n return;\n }\n if (window.isDestroyed()) {\n return;\n }\n if (_loadingView.webContents && !_loadingView.webContents.isDestroyed()) {\n window.setBrowserView(_loadingView);\n } else {\n // if loadingView has been destroyed\n _loadingView = new BrowserView();\n loadLoadingView();\n }\n });\n window.webContents.on('dom-ready', onFailure);\n window.webContents.on('crashed', onFailure);\n window.webContents.on('unresponsive', onFailure);\n window.webContents.on('did-fail-load', onFailure);\n }\n }\n\n get(name: string): WindowItem | undefined {\n let win: WindowItem | undefined = undefined;\n this.windows.forEach((i: WindowItem) => {\n if (i._name === name) {\n win = i;\n }\n })\n return win;\n }\n\n getById(id: number): WindowItem | undefined {\n let win: WindowItem | undefined = undefined;\n this.windows.forEach((i: WindowItem) => {\n if (i.id === id) {\n win = i;\n }\n })\n return win;\n }\n\n getAll(): Map<number, WindowItem> {\n return this.windows;\n }\n\n close(name: string) {\n let win: WindowItem | undefined = undefined;\n this.windows.forEach((i: WindowItem) => {\n if (i._name === name) {\n win = i;\n }\n })\n // @ts-ignore\n win && this.windows.delete(win?.id)\n // @ts-ignore\n return win && win?.destroy();\n }\n\n closeById(id: number) {\n let win: WindowItem | undefined = undefined;\n this.windows.forEach((i: WindowItem) => {\n if (i.id === id) {\n win = i;\n }\n })\n // @ts-ignore\n win && this.windows.delete(win?.id)\n // @ts-ignore\n return win && win?.destroy();\n }\n\n getPreload() {\n return this.preload;\n }\n}\n// @ts-ignore\nglobal['__ELECTRON_WINDOWS_MANAGER__'] = undefined;\n\nexport let isInitialized = false;\n\nexport const initialize = (preload?: string): WindowsManager => {\n // @ts-ignore\n if (isInitialized && global['__ELECTRON_WINDOWS_MANAGER__']) {\n // @ts-ignore\n return global['__ELECTRON_WINDOWS_MANAGER__'];\n }\n isInitialized = true;\n // @ts-ignore\n const wm = global['__ELECTRON_WINDOWS_MANAGER__'] = new WindowsManager(preload)\n eIpc.mainIPC.handleRenderer('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', async (data: any) => {\n if (data?.type === 'create') {\n const opt = data as {\n type: 'create';\n data: ElectronWindowsManagerOptions\n };\n const findWin = wm.get(opt.data.name);\n if (findWin) {\n findWin.focus();\n return {\n winId: findWin?.id,\n winName: findWin?._name,\n };\n }\n const res = wm.create(opt.data)\n return {\n winId: Number(res.id),\n winName: res._name,\n };\n }\n if (data?.type === 'get') {\n const opt = data as {\n type: 'get';\n data: string;\n };\n const res = wm.get(opt?.data)\n return {\n winId: res?.id ? Number(res?.id) : -1,\n winName: res?._name ? res?._name : '',\n };\n }\n\n if (data?.type === 'getById') {\n const opt = data as {\n type: 'get';\n data: number;\n };\n const res = wm.getById(opt?.data)\n return {\n winId: res?.id ? Number(res?.id) : -1,\n winName: res?._name ? res?._name : '',\n };\n }\n\n if (data?.type === 'getAll') {\n const opt = data as {\n type: 'getAll';\n data: any;\n };\n const res = wm.getAll()\n const obj = {}\n res.forEach(i => {\n // @ts-ignore\n obj[i.id] = {\n winId: i?.id ? Number(i?.id) : -1,\n winName: i?._name ? i?._name : '',\n }\n })\n return obj;\n }\n\n if (data?.type === 'close') {\n const opt = data as {\n type: 'close';\n data: string;\n };\n const res = wm.close(opt?.data)\n return res;\n }\n\n if (data?.type === 'closeById') {\n const opt = data as {\n type: 'closeById';\n data: number;\n };\n const res = wm.closeById(opt?.data)\n return res;\n }\n\n if (data?.type === 'getPreload') {\n const opt = data as {\n type: 'getPreload';\n data: number;\n };\n const res = wm.getPreload()\n return res;\n }\n\n return undefined\n })\n return wm;\n}\n"],"names":[],"mappings":";;;;;AAMA,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE;IAC3B,MAAM,CAAC,UAAU,EAAE,CAAC;AACtB,CAAC;AAEY,MAAA,MAAM,GAAG,CAAC,GAAgB,KAAI;AACzC,IAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACpB,EAAC;MAEY,cAAc,CAAA;AAGzB,IAAA,WAAA,CAAY,OAAgB,EAAA;AAC1B,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;KAC1B;AAED,IAAA,MAAM,CAAC,OAAsC,EAAA;QAC3C,MAAM,EACJ,IAAI,GAAG,WAAW,EAClB,WAAW,EACX,aAAa,EAAE,oBAAoB,GAAG,EAAE,EACxC,YAAY,GAAG,KAAK,EACpB,kBAAkB,GAAG,KAAK,GAC3B,GAAG,OAAO,CAAC;QACZ,MAAM,MAAM,GAAG,IAAI,aAAa,CAC9B,CAAC,CAAC,KAAK,CACL;AACE,YAAA,gBAAgB,EAAE,IAAI;AACvB,SAAA,EACD,oBAAoB,EACpB;AACE,YAAA,cAAc,EAAE;AACd,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,eAAe,EAAE,IAAI;AACrB,gBAAA,gBAAgB,EAAE,KAAK;AACvB,gBAAA,oBAAoB,EAAE,KAAK;AAC3B,gBAAA,gBAAgB,EAAE,KAAK;AACvB,gBAAA,WAAW,EAAE,KAAK;gBAClB,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO;AACvE,aAAA;AACF,SAAA,CACF,CACY,CAAC;AAChB,QAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAClC,QAAA,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;AACpB,QAAA,IAAI,WAAW,EAAE,GAAG,EAAE;AACpB,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SACvC;QACD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;YAC3B,IAAI,kBAAkB,EAAE;gBACtB,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO;aACR;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAChC,SAAC,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,MAAK;YACtC,IAAI,YAAY,EAAE;AAChB,gBAAA,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;aACnC;AACH,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC/B,YAAA,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;SAC7B;aAAM;AACL,YAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;SAC5B;QACD,MAAM,CAAC,KAAK,EAAE,CAAC;AACf,QAAA,OAAO,MAAM,CAAC;KACf;IAED,eAAe,CAAC,MAAkB,EAAE,aAA4C,EAAA;QAC9E,IAAI,aAAa,EAAE;YACjB,MAAM,EACJ,WAAW,EACX,qBAAqB,GAAG,KAAK,GAC9B,GAAG,aAAa,CAAC;AAClB,YAAA,IAAI,YAAY,GAAG,IAAI,WAAW,CAAC;AACjC,gBAAA,cAAc,EAAE;AACd,oBAAA,gBAAgB,EAAE,KAAK;AACvB,oBAAA,eAAe,EAAE,IAAI;;AAErB,oBAAA,WAAW,EAAE,KAAK;AACnB,iBAAA;AACF,aAAA,CAAC,CAAC;AAEH,YAAA,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE;gBACxB,OAAO;aACR;YAED,MAAM,eAAe,GAAG,MAAK;gBAC3B,MAAM,CAAE,SAAS,EAAE,UAAU,CAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;AACnD,gBAAA,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;gBACpC,YAAY,CAAC,SAAS,CAAC;AACrB,oBAAA,CAAC,EAAE,CAAC;AACJ,oBAAA,CAAC,EAAE,CAAC;oBACJ,KAAK,EAAE,SAAS,IAAI,EAAE;oBACtB,MAAM,EAAE,UAAU,IAAI,EAAE;AACzB,iBAAA,CAAC,CAAC;gBACH,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAC3D,aAAC,CAAC;YAEF,MAAM,SAAS,GAAG,MAAK;AACrB,gBAAA,IAAI,YAAY,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE;AACvE,oBAAA,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;iBAClC;AACD,gBAAA,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE;oBACxB,OAAO;iBACR;gBAED,IAAI,MAAM,EAAE;AACV,oBAAA,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;iBACxC;AACH,aAAC,CAAC;AAEF,YAAA,eAAe,EAAE,CAAC;YAElB,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAK;AAClC,gBAAA,IAAI,YAAY,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE;AACvE,oBAAA,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE;wBACxB,OAAO;qBACR;oBACD,MAAM,CAAE,SAAS,EAAE,UAAU,CAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnD,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC;iBAC1F;AACH,aAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAET,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,KAAI;gBAC3C,IAAI,qBAAqB,EAAE;oBACzB,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,OAAO;iBACR;AACD,gBAAA,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE;oBACxB,OAAO;iBACR;AACD,gBAAA,IAAI,YAAY,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE;AACvE,oBAAA,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;iBACrC;qBAAM;;AAEL,oBAAA,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC;AACjC,oBAAA,eAAe,EAAE,CAAC;iBACnB;AACH,aAAC,CAAC,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC5C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;SACnD;KACF;AAED,IAAA,GAAG,CAAC,IAAY,EAAA;QACd,IAAI,GAAG,GAA2B,SAAS,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAa,KAAI;AACrC,YAAA,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE;gBACpB,GAAG,GAAG,CAAC,CAAC;aACT;AACH,SAAC,CAAC,CAAA;AACF,QAAA,OAAO,GAAG,CAAC;KACZ;AAED,IAAA,OAAO,CAAC,EAAU,EAAA;QAChB,IAAI,GAAG,GAA2B,SAAS,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAa,KAAI;AACrC,YAAA,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;gBACf,GAAG,GAAG,CAAC,CAAC;aACT;AACH,SAAC,CAAC,CAAA;AACF,QAAA,OAAO,GAAG,CAAC;KACZ;IAED,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC;KACrB;AAED,IAAA,KAAK,CAAC,IAAY,EAAA;QAChB,IAAI,GAAG,GAA2B,SAAS,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAa,KAAI;AACrC,YAAA,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE;gBACpB,GAAG,GAAG,CAAC,CAAC;aACT;AACH,SAAC,CAAC,CAAA;;QAEF,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;;AAEnC,QAAA,OAAO,GAAG,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC;KAC9B;AAED,IAAA,SAAS,CAAC,EAAU,EAAA;QAClB,IAAI,GAAG,GAA2B,SAAS,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAa,KAAI;AACrC,YAAA,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;gBACf,GAAG,GAAG,CAAC,CAAC;aACT;AACH,SAAC,CAAC,CAAA;;QAEF,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;;AAEnC,QAAA,OAAO,GAAG,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC;KAC9B;IAED,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;KACrB;AACF,CAAA;AACD;AACA,MAAM,CAAC,8BAA8B,CAAC,GAAG,SAAS,CAAC;AAE5C,IAAI,aAAa,GAAG,MAAM;AAEpB,MAAA,UAAU,GAAG,CAAC,OAAgB,KAAoB;;AAE7D,IAAA,IAAI,aAAa,IAAI,MAAM,CAAC,8BAA8B,CAAC,EAAE;;AAE3D,QAAA,OAAO,MAAM,CAAC,8BAA8B,CAAC,CAAC;KAC/C;IACD,aAAa,GAAG,IAAI,CAAC;;AAErB,IAAA,MAAM,EAAE,GAAG,MAAM,CAAC,8BAA8B,CAAC,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAA;IAC/E,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,yCAAyC,EAAE,OAAO,IAAS,KAAI;AACzF,QAAA,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE;YAC3B,MAAM,GAAG,GAAG,IAGX,CAAC;AACF,YAAA,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,OAAO,EAAE;gBACX,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO;oBACL,KAAK,EAAE,OAAO,EAAE,EAAE;oBAClB,OAAO,EAAE,OAAO,EAAE,KAAK;iBACxB,CAAC;aACH;YACD,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC/B,OAAO;AACL,gBAAA,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,EAAE,GAAG,CAAC,KAAK;aACnB,CAAC;SACH;AACD,QAAA,IAAI,IAAI,EAAE,IAAI,KAAK,KAAK,EAAE;YACxB,MAAM,GAAG,GAAG,IAGX,CAAC;YACF,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAC7B,OAAQ;AACN,gBAAA,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AACrC,gBAAA,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,GAAG,EAAE;aACtC,CAAC;SACH;AAED,QAAA,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE;YAC5B,MAAM,GAAG,GAAG,IAGX,CAAC;YACF,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACjC,OAAQ;AACN,gBAAA,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AACrC,gBAAA,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,GAAG,EAAE;aACtC,CAAC;SACH;AAED,QAAA,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE;AAK3B,YAAA,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,CAAA;YACvB,MAAM,GAAG,GAAG,EAAE,CAAA;AACd,YAAA,GAAG,CAAC,OAAO,CAAC,CAAC,IAAG;;AAEd,gBAAA,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG;AACV,oBAAA,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AACjC,oBAAA,OAAO,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE;iBAClC,CAAA;AACH,aAAC,CAAC,CAAA;AACF,YAAA,OAAO,GAAG,CAAC;SACZ;AAED,QAAA,IAAI,IAAI,EAAE,IAAI,KAAK,OAAO,EAAE;YAC1B,MAAM,GAAG,GAAG,IAGX,CAAC;YACF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AAC/B,YAAA,OAAQ,GAAG,CAAC;SACb;AAED,QAAA,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW,EAAE;YAC9B,MAAM,GAAG,GAAG,IAGX,CAAC;YACF,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AACnC,YAAA,OAAO,GAAG,CAAC;SACZ;AAED,QAAA,IAAI,IAAI,EAAE,IAAI,KAAK,YAAY,EAAE;AAK/B,YAAA,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,EAAE,CAAA;AAC3B,YAAA,OAAO,GAAG,CAAC;SACZ;AAED,QAAA,OAAO,SAAS,CAAA;AAClB,KAAC,CAAC,CAAA;AACF,IAAA,OAAO,EAAE,CAAC;AACZ;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/main/index.ts"],"sourcesContent":["import lodash from 'lodash'\nimport { app, BrowserWindow, BrowserView, WebContents, BrowserWindowConstructorOptions, session, Session, webContents } from 'electron'\nimport * as remote from '@electron/remote/main'\nimport eIpc from '@lynker-desktop/electron-ipc/main'\nimport type { ElectronWindowsManagerOptions, BWItem, BVItem } from '../common';\n\nexport const getCustomSession = (() => {\n let customSession: Session;\n return () => {\n if (!customSession) {\n customSession = session.fromPartition('persist:__global_main_session__');\n }\n return customSession;\n }\n})();\n\napp.on('ready', () => {\n getCustomSession();\n});\n\nif (!remote.isInitialized()) {\n remote.initialize();\n}\n\nexport const enable = (win: WebContents) => {\n remote.enable(win)\n}\n\nexport class WindowsManager {\n loadingViewUrl: string | undefined;\n errorViewUrl: string | undefined;\n preload?: string;\n windows: Map<number, BWItem | BVItem | null>;\n constructor(preload?: string, loadingViewUrl?: string, errorViewUrl?: string) {\n this.preload = preload;\n this.windows = new Map();\n this.loadingViewUrl = `${loadingViewUrl ?? ''}`;\n this.errorViewUrl = `${errorViewUrl ?? ''}`;\n }\n\n create(options: ElectronWindowsManagerOptions) {\n let window: any;\n try {\n const {\n type = 'BW',\n name = 'anonymous',\n url,\n loadingView = {url: undefined},\n errorView = {url: undefined},\n browserWindow: browserWindowOptions,\n openDevTools = false,\n preventOriginClose = false,\n } = options;\n options.type = type;\n try {\n loadingView.url = `${loadingView?.url ?? this.loadingViewUrl}`;\n lodash.merge(\n options,\n {\n loadingView,\n }\n )\n } catch (error) {\n log('error', 'loadingView error:', loadingView, this.loadingViewUrl);\n }\n try {\n errorView.url = `${errorView?.url ?? this.errorViewUrl}`;\n lodash.merge(\n options,\n {\n errorView,\n }\n )\n } catch (error) {\n log('error', 'errorView error:', errorView, this.errorViewUrl);\n }\n let parentWin:BrowserWindowConstructorOptions['parent'] = undefined;\n if (typeof browserWindowOptions?.parent === 'number') {\n parentWin = BrowserWindow.fromId(browserWindowOptions?.parent) || undefined;\n if (parentWin) {\n browserWindowOptions.parent = parentWin;\n } else {\n browserWindowOptions.parent = undefined;\n }\n }\n log('log', 'create 1: ', options);\n log('log', 'create 2: ', `parentWin: ${parentWin?.id}`);\n window = type === 'BV' ?\n new BrowserView(\n lodash.merge(\n (browserWindowOptions || {}),\n {\n parent: undefined,\n webPreferences: {\n // session: getCustomSession(),\n plugins: true,\n nodeIntegration: true,\n contextIsolation: false,\n backgroundThrottling: false,\n nativeWindowOpen: false,\n webSecurity: false,\n preload: browserWindowOptions?.webPreferences?.preload || this.preload,\n }\n },\n )\n ) as BVItem\n : new BrowserWindow(\n lodash.merge(\n {\n acceptFirstMouse: true,\n },\n (browserWindowOptions || {}),\n {\n parent: parentWin,\n webPreferences: {\n // session: getCustomSession(),\n plugins: true,\n nodeIntegration: true,\n contextIsolation: false,\n backgroundThrottling: false,\n nativeWindowOpen: false,\n webSecurity: false,\n preload: browserWindowOptions?.webPreferences?.preload || this.preload,\n }\n },\n )\n ) as BWItem;\n try {\n remote.enable(window.webContents);\n } catch (error) {\n log('error', 'enable: ', error)\n }\n // @ts-ignore\n try {\n window.id = window.id || window.webContents.id;\n } catch (error) {\n // log('error', 'set id: ', error)\n }\n window._type = type;\n window._name = name;\n window._extraData = `${options?.extraData || ''}`;\n log('log', 'create 5: ', window.id, window._name);\n if (loadingView?.url) {\n if (type === 'BW') {\n // @ts-ignore\n this._setLoadingView(window, options);\n }\n }\n if (errorView?.url) {\n const showErrorView = lodash.debounce(() => {\n const _url = window?.webContents?.getURL?.() || url;\n /**\n * 判断是否是错误视图\n */\n const isErrorView = `${_url}`.toUpperCase().startsWith(`${errorView?.url}`.toUpperCase());\n if (!isErrorView && _url) {\n // @ts-ignore\n window.loadURL ? window.loadURL(`${errorView?.url}`) : window.webContents.loadURL(`${errorView?.url}`);\n window.webContents.executeJavaScript(`\n var key = '__ELECTRON_WINDOW_MANAGER_DID_FAIL_LOAD_URL__';\n window[key] = \"${_url}\";\n sessionStorage.setItem(key, \"${_url}\");\n `);\n }\n }, 300);\n window.webContents.on('did-fail-load', () => {\n showErrorView();\n });\n window.webContents.on('did-start-loading', () => {\n showErrorView.cancel();\n });\n }\n window.webContents.on('close', () => {\n this.windows.set(window.id, null)\n this.windows.delete(window.id)\n })\n window.webContents.on('destroyed', () => {\n this.windows.set(window.id, null)\n this.windows.delete(window.id)\n })\n window.webContents.on('dom-ready', () => {\n if (openDevTools) {\n window.webContents.openDevTools();\n }\n });\n if (type === 'BW') {\n // @ts-ignore\n window.on('closed', () => {\n log('log', 'closed', window.id, window._name);\n this.windows.set(window.id, null)\n this.windows.delete(window.id)\n });\n }\n if (type === 'BV') {\n parentWin?.addBrowserView(window);\n log('log', 'create - addBrowserView', parentWin, window)\n }\n // @ts-ignore\n window.loadURL ? window.loadURL(options.url) : window.webContents.loadURL(options.url);\n // @ts-ignore\n window.focus ? window.focus() : window.webContents.focus();\n this.windows.set(window.id || window.webContents.id, window);\n log('log', 'create', this.windows.keys())\n } catch (error) {\n log('error', 'create', error)\n }\n\n return window;\n }\n\n _setLoadingView(window: BWItem, createOptions: ElectronWindowsManagerOptions) {\n if (createOptions) {\n const {\n loadingView,\n preventOriginNavigate = false,\n } = createOptions;\n let _loadingView = new BrowserView({\n webPreferences: {\n // session: getCustomSession(),\n contextIsolation: false,\n nodeIntegration: true,\n // 允许loadURL与文件路径在开发环境\n webSecurity: false,\n }\n });\n\n if (window.isDestroyed()) {\n return;\n }\n\n const loadLoadingView = () => {\n const [ viewWidth, viewHeight ] = window.getSize();\n window.setBrowserView(_loadingView);\n _loadingView.setBounds({\n x: 0,\n y: 0,\n width: viewWidth || 10,\n height: viewHeight || 10,\n });\n log('log', 'loadLoadingView', window._name, loadingView);\n _loadingView.webContents.loadURL(loadingView?.url || '')\n };\n\n const onFailure = lodash.debounce(() => {\n if (_loadingView.webContents && !_loadingView.webContents.isDestroyed()) {\n _loadingView.webContents.close();\n }\n if (window.isDestroyed()) {\n return;\n }\n\n if (window) {\n window.removeBrowserView(_loadingView);\n }\n }, 300);\n\n loadLoadingView();\n\n window.on('resize', lodash.debounce(() => {\n if (_loadingView.webContents && !_loadingView.webContents.isDestroyed()) {\n if (window.isDestroyed()) {\n return;\n }\n const [ viewWidth, viewHeight ] = window.getSize();\n _loadingView.setBounds({ x: 0, y: 0, width: viewWidth || 10, height: viewHeight || 10 });\n }\n }, 500));\n\n window.webContents.on('will-navigate', (e) => {\n if (preventOriginNavigate) {\n e.preventDefault();\n return;\n }\n if (window.isDestroyed()) {\n return;\n }\n if (_loadingView.webContents && !_loadingView.webContents.isDestroyed()) {\n window.setBrowserView(_loadingView);\n } else {\n // if loadingView has been destroyed\n _loadingView = new BrowserView();\n loadLoadingView();\n }\n });\n window.webContents.on('dom-ready', onFailure);\n window.webContents.on('crashed', onFailure);\n window.webContents.on('unresponsive', onFailure);\n window.webContents.on('did-fail-load', onFailure);\n window.webContents.on('did-finish-load', onFailure);\n window.webContents.on('did-stop-loading', onFailure);\n }\n }\n\n get(idOrName: string | number): BWItem | BVItem | undefined {\n log('log', 'get', idOrName);\n let win: BWItem | BVItem ;\n this.windows.forEach((i, key) => {\n try {\n if (!(i && i?.webContents?.isDestroyed && !i?.webContents?.isDestroyed?.())) {\n this.windows.set(key, null)\n this.windows.delete(key)\n i = null;\n }\n } catch (error) {\n log('error', 'get');\n }\n\n if (typeof idOrName === 'number') {\n if (i?.id === idOrName) {\n win = i;\n }\n } else if (typeof idOrName === 'string') {\n if (i?._name === idOrName) {\n win = i;\n }\n }\n })\n // @ts-ignore\n if (win && win?.webContents?.isDestroyed && !win?.webContents?.isDestroyed?.()) {\n return win;\n }\n return undefined;\n }\n\n getAll() {\n log('log', 'getAll');\n this.windows.forEach((win, key) => {\n log('log', 'getAll', key, win, win?.webContents?.isDestroyed, win?.webContents?.isDestroyed?.());\n if (!(win && win?.webContents?.isDestroyed && !win?.webContents?.isDestroyed?.())) {\n this.windows.set(key, null)\n this.windows.delete(key)\n }\n })\n return this.windows;\n }\n\n close(idOrName: string | number) {\n log('log', 'close', idOrName);\n let win: BWItem | BVItem | undefined = undefined;\n this.windows.forEach((i) => {\n if (typeof idOrName === 'number') {\n if (i?.id === idOrName) {\n win = i;\n }\n } else if (typeof idOrName === 'string') {\n if (i?._name === idOrName) {\n win = i;\n }\n }\n })\n // @ts-ignore\n win && this.windows.delete(win?.id)\n // @ts-ignore\n if (win) {\n // @ts-ignore\n if (win._type === 'BV') {\n this.windows.forEach(i => {\n if (i?._type === 'BW') {\n const _win = i as BWItem;\n _win.removeBrowserView(win as BVItem);\n }\n })\n }\n // @ts-ignore\n win?.webContent?.close?.();\n // @ts-ignore\n win?.close?.();\n // @ts-ignore\n win?.destroy?.();\n }\n return true;\n }\n\n closeAll() {\n log('log', 'closeAll');\n this.windows.forEach((win) => {\n try {\n win && this.windows.delete(win?.id)\n // @ts-ignore\n if (win._type === 'BV') {\n this.windows.forEach(i => {\n if (i?._type === 'BW') {\n const _win = i as BWItem;\n _win.removeBrowserView(win as BVItem);\n }\n })\n }\n // @ts-ignore\n win?.webContent?.close?.();\n // @ts-ignore\n win?.close?.();\n // @ts-ignore\n win?.destroy?.();\n } catch (error) {\n\n }\n })\n }\n\n getPreload() {\n log('log', 'getPreload');\n return this.preload;\n }\n}\n// @ts-ignore\nglobal['__ELECTRON_WINDOWS_MANAGER__'] = undefined;\n\nexport let isInitialized = false;\n\nexport const initialize = (preload?: string, loadingViewUrl?: string, errorViewUrl?: string): WindowsManager => {\n // @ts-ignore\n if (isInitialized && global['__ELECTRON_WINDOWS_MANAGER__']) {\n // @ts-ignore\n return global['__ELECTRON_WINDOWS_MANAGER__'];\n }\n isInitialized = true;\n // @ts-ignore\n const wm = global['__ELECTRON_WINDOWS_MANAGER__'] = new WindowsManager(preload, loadingViewUrl, errorViewUrl)\n eIpc.mainIPC.handleRenderer('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', async (data: any) => {\n if (data?.type === 'create') {\n const opt = data as {\n type: 'create';\n data: ElectronWindowsManagerOptions\n };\n const findWin = wm.get(opt.data.name);\n if (findWin) {\n // @ts-ignore\n findWin?.focus?.();\n findWin?.webContents.focus?.();\n if (opt.data.url && findWin.webContents.getURL() !== opt.data.url) {\n findWin.webContents.loadURL(opt.data.url)\n /** fix: url hash 无法正常加载 */\n setTimeout(()=> {\n findWin.webContents.reload();\n }, 100);\n }\n return {\n winId: Number(`${findWin?.id || - 1}`),\n winName: `${findWin?._name || ''}`,\n winType: `${findWin?._type || ''}`,\n winExtraData: `${findWin?._extraData || ''}`,\n };\n }\n const res = wm.create(opt.data)\n return {\n winId: Number(`${res.id || -1}`),\n winName: `${res?._name || ''}`,\n winType: `${res?._type || ''}`,\n winExtraData: `${res?._extraData || ''}`,\n };\n }\n if (data?.type === 'get') {\n const opt = data as {\n type: 'get';\n data: string | number;\n };\n const res = wm.get(opt?.data)\n return {\n winId: Number(`${res?.id || -1}`),\n winName: `${res?._name || ''}`,\n winType: `${res?._type || ''}`,\n winExtraData: `${res?._extraData || ''}`,\n };\n }\n\n if (data?.type === 'getAll') {\n const opt = data as {\n type: 'getAll';\n data: any;\n };\n const res = wm.getAll()\n const obj = {}\n res.forEach(i => {\n // @ts-ignore\n obj[i.id] = {\n winId: Number(`${i?.id || -1}`),\n winName: `${i?._name || ''}`,\n winType: `${i?._type || ''}`,\n winExtraData: `${i?._extraData || ''}`,\n }\n })\n return obj;\n }\n\n if (data?.type === 'close') {\n const opt = data as {\n type: 'close';\n data: string | number;\n };\n const res = wm.close(opt?.data)\n return res;\n }\n\n if (data?.type === 'closeAll') {\n const opt = data as {\n type: 'closeAll';\n data: undefined;\n };\n const res = wm.closeAll()\n return res;\n }\n\n if (data?.type === 'getWindowForWebContentId') {\n const opt = data as {\n type: 'getWindowForWebContentId';\n data: number;\n };\n const targetWebContents = webContents.fromId(opt.data);\n if (targetWebContents) {\n let win = BrowserWindow.fromWebContents(targetWebContents)\n if (!win) {\n // 获取所有的 BrowserWindows\n let allWindows = BrowserWindow.getAllWindows();\n\n // 遍历所有窗口,检查每个窗口的 BrowserView\n for (let _win of allWindows) {\n let views = _win.getBrowserViews();\n\n // 遍历窗口的所有 BrowserView\n for (let view of views) {\n if (view.webContents === targetWebContents) {\n win = _win;\n break;\n }\n }\n\n if (win) break;\n }\n }\n return win?.id;\n }\n return undefined;\n }\n\n if (data?.type === 'getPreload') {\n const opt = data as {\n type: 'getPreload';\n data: number;\n };\n const res = wm.getPreload()\n return res;\n }\n\n return undefined\n })\n return wm;\n}\n\nconst log = (type: 'log' | 'error', ...data: any[]) => {\n const key = `[electron-window-manager]: `\n try {\n console[type](key, ...data);\n } catch (error) {\n console.error(key, error)\n }\n}\n"],"names":[],"mappings":"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"}