ewvjs 1.0.18 → 1.0.20

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/README.md CHANGED
@@ -13,6 +13,7 @@
13
13
  - ⚡ **Node.js Integration**: Call Node.js functions directly from your frontend code.
14
14
  - 🖱️ **Context Menus**: Customizable native right-click context menus.
15
15
  - 📦 **Packaging**: Built-in CLI tool to package your app into a standalone executable.
16
+ - 🔄 **Auto Update**: Download a hosted manifest and atomically swap in a packaged app update.
16
17
  - 🔧 **Native Bindings**: High-performance C# bindings via `node-api-dotnet`.
17
18
  - 🖼️ **Customization**: Support for frameless windows, transparency, vibrancy, and more.
18
19
 
@@ -95,6 +96,37 @@ Exposes a Node.js function to the frontend.
95
96
  * `name` (string): The name of the function as it will appear in `window.ewvjs.api`.
96
97
  * `callback` (function): The Node.js function to execute. Can be async.
97
98
 
99
+ ### `autoUpdateFromManifest(manifestUrl)`
100
+
101
+ Downloads an update manifest, fetches the packaged app ZIP, stages it, and performs an atomic directory swap from a detached PowerShell helper after the current process exits. The helper then relaunches the app.
102
+
103
+ **Manifest format:**
104
+
105
+ ```json
106
+ {
107
+ "version": "0.0.2",
108
+ "url": "https://example.com/updater_test/update_balbal.zip"
109
+ }
110
+ ```
111
+
112
+ **Usage:**
113
+
114
+ ```javascript
115
+ const result = await ewvjs.autoUpdateFromManifest('https://example.com/manifest.json');
116
+
117
+ if (result.updated) {
118
+ console.log('Updated to', result.version);
119
+ } else {
120
+ console.error('Update failed:', result.error);
121
+ }
122
+ ```
123
+
124
+ **Notes:**
125
+
126
+ * The archive is extracted with Windows `tar`.
127
+ * The running app cannot overwrite itself directly, so the helper process handles the swap.
128
+ * A backup copy is kept during the swap to reduce the chance of update failure leaving the install broken.
129
+
98
130
  ### Window Options
99
131
 
100
132
  ```typescript
package/dist/types.d.ts CHANGED
@@ -40,5 +40,22 @@ export interface WindowOptions {
40
40
  additional_args?: string;
41
41
  jsCallback?: (message: any) => void;
42
42
  debug?: boolean;
43
+ on_close?: () => void;
44
+ on_show?: () => void;
45
+ on_hide?: () => void;
46
+ on_resize?: (size: {
47
+ width: number;
48
+ height: number;
49
+ state: string;
50
+ }) => void;
51
+ on_move?: (pos: {
52
+ x: number;
53
+ y: number;
54
+ }) => void;
55
+ on_focus?: () => void;
56
+ on_blur?: () => void;
57
+ on_maximize?: () => void;
58
+ on_minimize?: () => void;
59
+ on_restore?: () => void;
43
60
  }
44
61
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC7E,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B"}
package/dist/webview.d.ts CHANGED
@@ -12,6 +12,14 @@ export declare class WebView {
12
12
  private _resolveOnce;
13
13
  private _httpServers;
14
14
  constructor();
15
+ autoUpdateFromManifest(manifestUrl: string): Promise<{
16
+ updated: boolean;
17
+ version?: string;
18
+ error?: string;
19
+ }>;
20
+ private _buildUpdateHelperScript;
21
+ private _fetchJson;
22
+ private _downloadFile;
15
23
  create_window(title: string, url_or_html?: string, options?: Partial<WindowOptions>): Promise<Window>;
16
24
  start(): Promise<void>;
17
25
  private _cleanup;
@@ -1 +1 @@
1
- {"version":3,"file":"webview.d.ts","sourceRoot":"","sources":["../src/webview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAU3C,qBAAa,OAAO;IACnB,QAAQ,EAAE,GAAG,CAAC;IACd,iBAAiB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,CAAM;IACpD,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,YAAY,CAAuC;;IAUrD,aAAa,CAClB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,MAAW,EACxB,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GAClC,OAAO,CAAC,MAAM,CAAC;IAgBZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,OAAO,CAAC,QAAQ;IAyBhB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAIpC,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,iBAAiB;YAiDX,mBAAmB;CAwCjC"}
1
+ {"version":3,"file":"webview.d.ts","sourceRoot":"","sources":["../src/webview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAa3C,qBAAa,OAAO;IACnB,QAAQ,EAAE,GAAG,CAAC;IACd,iBAAiB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,CAAM;IACpD,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,YAAY,CAAuC;;IAUrD,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA0DlH,OAAO,CAAC,wBAAwB;IAiDhC,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,aAAa;IAsBf,aAAa,CAClB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,MAAW,EACxB,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GAClC,OAAO,CAAC,MAAM,CAAC;IAgBZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,OAAO,CAAC,QAAQ;IAyBhB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAIpC,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,iBAAiB;YAiDX,mBAAmB;CAwCjC"}
package/dist/webview.js CHANGED
@@ -1,10 +1,13 @@
1
1
  import { WindowsPlatform } from "./platforms/windows.js";
2
2
  import { Window } from "./window.js";
3
3
  import * as http from "http";
4
+ import * as https from "https";
4
5
  import * as fs from "fs";
6
+ import * as os from "os";
5
7
  import * as path from "path";
6
8
  import mime from "mime-types";
7
9
  import { fileURLToPath } from 'url';
10
+ import * as child_process from 'child_process';
8
11
  const __filename = fileURLToPath(import.meta.url);
9
12
  const __dirname = path.dirname(__filename);
10
13
  export class WebView {
@@ -24,6 +27,141 @@ export class WebView {
24
27
  throw new Error("Platform not supported: " + process.platform);
25
28
  }
26
29
  }
30
+ async autoUpdateFromManifest(manifestUrl) {
31
+ try {
32
+ const manifestData = await this._fetchJson(manifestUrl);
33
+ if (!manifestData || !manifestData.url) {
34
+ return { updated: false, error: 'Invalid manifest: missing url' };
35
+ }
36
+ const downloadUrl = manifestData.url;
37
+ const version = manifestData.version;
38
+ // download zip to temp file
39
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ewvjs-update-'));
40
+ const zipPath = path.join(tmpDir, 'update.zip');
41
+ await this._downloadFile(downloadUrl, zipPath);
42
+ // extract zip to temp extract dir
43
+ const extractDir = path.join(tmpDir, 'extracted');
44
+ fs.mkdirSync(extractDir);
45
+ // Use system `tar` to extract the downloaded archive. Fail if tar is not available.
46
+ try {
47
+ child_process.execFileSync('tar', ['-xf', zipPath, '-C', extractDir], { stdio: 'ignore' });
48
+ }
49
+ catch (e) {
50
+ return { updated: false, error: 'Extraction failed: system tar not available or failed: ' + (e && e.message ? e.message : String(e)) };
51
+ }
52
+ // determine target dir
53
+ const isPkg = typeof process.pkg !== 'undefined';
54
+ const targetDir = isPkg ? path.dirname(process.execPath) : path.resolve(__dirname, '..');
55
+ const restartExe = process.execPath;
56
+ const restartArgsJson = JSON.stringify(process.argv.slice(1));
57
+ const helperScriptPath = path.join(tmpDir, 'ewvjs-update-helper.ps1');
58
+ fs.writeFileSync(helperScriptPath, this._buildUpdateHelperScript(), 'utf8');
59
+ const helper = child_process.spawn('powershell.exe', [
60
+ '-NoProfile',
61
+ '-ExecutionPolicy',
62
+ 'Bypass',
63
+ '-File',
64
+ helperScriptPath,
65
+ extractDir,
66
+ targetDir,
67
+ String(process.pid),
68
+ restartExe,
69
+ restartArgsJson,
70
+ targetDir,
71
+ ], { detached: true, stdio: 'ignore' });
72
+ helper.unref();
73
+ return { updated: true, version };
74
+ }
75
+ catch (err) {
76
+ return { updated: false, error: err && err.message ? err.message : String(err) };
77
+ }
78
+ }
79
+ _buildUpdateHelperScript() {
80
+ return `param(
81
+ [string]\$StagingDir,
82
+ [string]\$TargetDir,
83
+ [int]\$MainPid,
84
+ [string]\$RestartExe,
85
+ [string]\$RestartArgsJson,
86
+ [string]\$WorkingDir
87
+ )
88
+
89
+ \$ErrorActionPreference = 'Stop'
90
+
91
+ while ($true) {
92
+ try {
93
+ Get-Process -Id \$MainPid -ErrorAction Stop | Out-Null
94
+ Start-Sleep -Milliseconds 250
95
+ } catch {
96
+ break
97
+ }
98
+ }
99
+
100
+ Start-Sleep -Milliseconds 500
101
+
102
+ \$parentDir = Split-Path -Path \$TargetDir -Parent
103
+ \$targetName = Split-Path -Path \$TargetDir -Leaf
104
+ \$backupDir = Join-Path -Path \$parentDir -ChildPath ($targetName + '.bak.' + ([DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds()))
105
+
106
+ if (Test-Path -LiteralPath \$backupDir) {
107
+ Remove-Item -LiteralPath \$backupDir -Recurse -Force
108
+ }
109
+
110
+ try {
111
+ Move-Item -LiteralPath \$TargetDir -Destination \$backupDir
112
+ Move-Item -LiteralPath \$StagingDir -Destination \$TargetDir
113
+
114
+ \$restartArgs = @()
115
+ if (-not [string]::IsNullOrWhiteSpace(\$RestartArgsJson)) {
116
+ \$restartArgs = \$RestartArgsJson | ConvertFrom-Json
117
+ }
118
+
119
+ Start-Process -FilePath \$RestartExe -ArgumentList \$restartArgs -WorkingDirectory \$WorkingDir
120
+ } catch {
121
+ if ((Test-Path -LiteralPath \$backupDir) -and -not (Test-Path -LiteralPath \$TargetDir)) {
122
+ Move-Item -LiteralPath \$backupDir -Destination \$TargetDir -Force
123
+ }
124
+ throw
125
+ }`;
126
+ }
127
+ _fetchJson(urlStr) {
128
+ return new Promise((resolve, reject) => {
129
+ const client = urlStr.startsWith('https:') ? https : http;
130
+ client.get(urlStr, (res) => {
131
+ let data = '';
132
+ res.on('data', (chunk) => (data += chunk));
133
+ res.on('end', () => {
134
+ try {
135
+ resolve(JSON.parse(data));
136
+ }
137
+ catch (e) {
138
+ reject(e);
139
+ }
140
+ });
141
+ }).on('error', reject);
142
+ });
143
+ }
144
+ _downloadFile(urlStr, destPath) {
145
+ return new Promise((resolve, reject) => {
146
+ const client = urlStr.startsWith('https:') ? https : http;
147
+ const file = fs.createWriteStream(destPath);
148
+ const req = client.get(urlStr, (res) => {
149
+ if (res.statusCode && res.statusCode >= 400) {
150
+ file.close();
151
+ return reject(new Error('Download failed: ' + res.statusCode));
152
+ }
153
+ res.pipe(file);
154
+ file.on('finish', () => {
155
+ file.close();
156
+ resolve();
157
+ });
158
+ });
159
+ req.on('error', (err) => {
160
+ file.close();
161
+ reject(err);
162
+ });
163
+ });
164
+ }
27
165
  async create_window(title, url_or_html = "", options = {}) {
28
166
  const opts = await this._buildWindowOptions(title, url_or_html, options);
29
167
  const window = new Window(this.platform, opts, this.exposed_functions);
package/dist/window.d.ts CHANGED
@@ -10,6 +10,23 @@ export declare class Window {
10
10
  private _isClosed;
11
11
  private _pendingApiInjection;
12
12
  on_context_menu: (items: any[]) => ContextMenuItem[] | null | Promise<ContextMenuItem[] | null>;
13
+ on_close: () => void;
14
+ on_show: () => void;
15
+ on_hide: () => void;
16
+ on_resize: (size: {
17
+ width: number;
18
+ height: number;
19
+ state: string;
20
+ }) => void;
21
+ on_move: (pos: {
22
+ x: number;
23
+ y: number;
24
+ }) => void;
25
+ on_focus: () => void;
26
+ on_blur: () => void;
27
+ on_maximize: () => void;
28
+ on_minimize: () => void;
29
+ on_restore: () => void;
13
30
  constructor(platform: any, options: WindowOptions, exposedFunctions: {
14
31
  [key: string]: Function;
15
32
  });
@@ -1 +1 @@
1
- {"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../src/window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG5D,qBAAa,MAAM;IAClB,QAAQ,EAAE,GAAG,CAAC;IACd,OAAO,EAAE,aAAa,CAAC;IAEvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,oBAAoB,CAAuB;IAEnD,eAAe,EAAE,CAChB,KAAK,EAAE,GAAG,EAAE,KACR,eAAe,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,CAC3D;gBAGL,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE;IAkB9C,IAAI,MAAM,kBAET;IAED,IAAI,SAAS,YAEZ;IAEK,GAAG;YAiBK,KAAK;IAoCb,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAS/D,KAAK;IAQL,OAAO;IAKP,QAAQ;IAGR,OAAO;IAGP,QAAQ;IAGR,KAAK;IAGL,IAAI;IAGJ,IAAI;IAKJ,OAAO;IAGP,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAGrC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAIpC,UAAU;IAGV,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAIxC,WAAW;IAGX,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAGhC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAKzB,QAAQ,CAAC,KAAK,EAAE,MAAM;IAKtB,YAAY;IAGZ,YAAY;IAKZ,OAAO,CAAC,QAAQ,EAAE,MAAM;IAKxB,UAAU;IAGV,SAAS,CACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAW,EACnB,IAAI,GAAE,MAAY;IAIb,YAAY;YAIJ,WAAW;IA2DzB,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,gBAAgB;YAOV,kBAAkB;YAYlB,sBAAsB;YAmBtB,oBAAoB;YAUpB,kBAAkB;IAUhC,OAAO,CAAC,YAAY;CAkBpB"}
1
+ {"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../src/window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG5D,qBAAa,MAAM;IAClB,QAAQ,EAAE,GAAG,CAAC;IACd,OAAO,EAAE,aAAa,CAAC;IAEvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,oBAAoB,CAAuB;IAEnD,eAAe,EAAE,CAChB,KAAK,EAAE,GAAG,EAAE,KACR,eAAe,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,CAC3D;IAEN,QAAQ,EAAE,MAAM,IAAI,CAAY;IAChC,OAAO,EAAE,MAAM,IAAI,CAAY;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAY;IAC/B,SAAS,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CACjE;IACV,OAAO,EAAE,CAAC,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAY;IAC5D,QAAQ,EAAE,MAAM,IAAI,CAAY;IAChC,OAAO,EAAE,MAAM,IAAI,CAAY;IAC/B,WAAW,EAAE,MAAM,IAAI,CAAY;IACnC,WAAW,EAAE,MAAM,IAAI,CAAY;IACnC,UAAU,EAAE,MAAM,IAAI,CAAY;gBAGjC,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE;IA8B9C,IAAI,MAAM,kBAET;IAED,IAAI,SAAS,YAEZ;IAEK,GAAG;YAiBK,KAAK;IAoCb,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAS/D,KAAK;IAQL,OAAO;IAKP,QAAQ;IAGR,OAAO;IAGP,QAAQ;IAGR,KAAK;IAGL,IAAI;IAGJ,IAAI;IAKJ,OAAO;IAGP,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAGrC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAIpC,UAAU;IAGV,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAIxC,WAAW;IAGX,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAGhC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAKzB,QAAQ,CAAC,KAAK,EAAE,MAAM;IAKtB,YAAY;IAGZ,YAAY;IAKZ,OAAO,CAAC,QAAQ,EAAE,MAAM;IAKxB,UAAU;IAGV,SAAS,CACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAW,EACnB,IAAI,GAAE,MAAY;IAIb,YAAY;YAIJ,WAAW;IAwFzB,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,gBAAgB;YAOV,kBAAkB;YAYlB,sBAAsB;YAmBtB,oBAAoB;YAUpB,kBAAkB;IAUhC,OAAO,CAAC,YAAY;CAkBpB"}
package/dist/window.js CHANGED
@@ -10,10 +10,41 @@ export class Window {
10
10
  _isClosed = false;
11
11
  _pendingApiInjection = null;
12
12
  on_context_menu = () => null;
13
+ on_close = () => { };
14
+ on_show = () => { };
15
+ on_hide = () => { };
16
+ on_resize = () => { };
17
+ on_move = () => { };
18
+ on_focus = () => { };
19
+ on_blur = () => { };
20
+ on_maximize = () => { };
21
+ on_minimize = () => { };
22
+ on_restore = () => { };
13
23
  constructor(platform, options, exposedFunctions) {
14
24
  this.platform = platform;
15
25
  this.options = { ...options };
16
26
  this._exposedFunctions = exposedFunctions;
27
+ // Initialize event callbacks from options
28
+ if (options.on_close)
29
+ this.on_close = options.on_close;
30
+ if (options.on_show)
31
+ this.on_show = options.on_show;
32
+ if (options.on_hide)
33
+ this.on_hide = options.on_hide;
34
+ if (options.on_resize)
35
+ this.on_resize = options.on_resize;
36
+ if (options.on_move)
37
+ this.on_move = options.on_move;
38
+ if (options.on_focus)
39
+ this.on_focus = options.on_focus;
40
+ if (options.on_blur)
41
+ this.on_blur = options.on_blur;
42
+ if (options.on_maximize)
43
+ this.on_maximize = options.on_maximize;
44
+ if (options.on_minimize)
45
+ this.on_minimize = options.on_minimize;
46
+ if (options.on_restore)
47
+ this.on_restore = options.on_restore;
17
48
  this._closedPromise = new Promise((resolve) => {
18
49
  this._resolveClosed = resolve;
19
50
  });
@@ -174,9 +205,41 @@ export class Window {
174
205
  // Handle special messages
175
206
  if (funcName === "closed") {
176
207
  this._isClosed = true;
208
+ this.on_close();
177
209
  this._resolveClosed();
178
210
  return null;
179
211
  }
212
+ if (funcName === "resized") {
213
+ const size = params[0];
214
+ this.on_resize(size);
215
+ if (size.state === "maximized")
216
+ this.on_maximize();
217
+ else if (size.state === "minimized")
218
+ this.on_minimize();
219
+ else if (size.state === "normal")
220
+ this.on_restore();
221
+ return null;
222
+ }
223
+ if (funcName === "moved") {
224
+ this.on_move(params[0]);
225
+ return null;
226
+ }
227
+ if (funcName === "visibility_changed") {
228
+ const visible = params[0];
229
+ if (visible)
230
+ this.on_show();
231
+ else
232
+ this.on_hide();
233
+ return null;
234
+ }
235
+ if (funcName === "focus_changed") {
236
+ const focused = params[0];
237
+ if (focused)
238
+ this.on_focus();
239
+ else
240
+ this.on_blur();
241
+ return null;
242
+ }
180
243
  if (funcName === "dom_ready") {
181
244
  return null;
182
245
  }
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ewvjs",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "description": "Embedded WebView for JavaScript - Edge WebView2 bindings for Node.js",
5
5
  "workspaces": [
6
6
  "packages/*"
@@ -48,11 +48,11 @@
48
48
  ],
49
49
  "devDependencies": {
50
50
  "@types/mime-types": "^3.0.1",
51
- "@types/node": "^25.2.0",
51
+ "@types/node": "^25.9.1",
52
52
  "typescript": "^5.9.3"
53
53
  },
54
54
  "dependencies": {
55
55
  "mime-types": "^3.0.2",
56
56
  "node-api-dotnet": "^0.9.19"
57
57
  }
58
- }
58
+ }