bunite-core 0.0.1 → 0.0.3
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/package.json +2 -2
- package/src/bun/core/App.ts +155 -15
- package/src/bun/core/BrowserView.ts +124 -44
- package/src/bun/core/BrowserWindow.ts +94 -47
- package/src/bun/core/Socket.ts +2 -1
- package/src/bun/core/SurfaceBrowserIPC.ts +65 -0
- package/src/bun/core/SurfaceManager.ts +201 -0
- package/src/bun/core/SurfaceRegistry.ts +60 -0
- package/src/bun/core/Utils.ts +275 -46
- package/src/bun/events/appEvents.ts +2 -1
- package/src/bun/events/webviewEvents.ts +1 -3
- package/src/bun/events/windowEvents.ts +2 -0
- package/src/bun/index.ts +4 -3
- package/src/bun/preload/inline.ts +19 -25
- package/src/bun/proc/native.ts +158 -122
- package/src/native/shared/callbacks.h +6 -6
- package/src/native/shared/ffi_exports.h +123 -119
- package/src/native/shared/log.h +24 -0
- package/src/native/shared/webview_storage.h +5 -5
- package/src/native/win/native_host_appres.cpp +258 -0
- package/src/native/win/native_host_cef.cpp +834 -0
- package/src/native/win/native_host_ffi.cpp +935 -0
- package/src/native/win/native_host_internal.h +285 -0
- package/src/native/win/native_host_runtime.cpp +286 -0
- package/src/native/win/native_host_utils.cpp +314 -0
- package/src/native/win/process_helper_win.cpp +126 -26
- package/src/preload/runtime.built.js +1 -1
- package/src/preload/runtime.ts +65 -42
- package/src/preload/tsconfig.json +2 -1
- package/src/preload/tsconfig.tsbuildinfo +1 -0
- package/src/preload/webviewElement.ts +307 -0
- package/src/shared/cefVersion.ts +2 -0
- package/src/shared/log.ts +40 -0
- package/src/shared/paths.ts +122 -52
- package/src/shared/rpc.ts +7 -1
- package/src/view/index.ts +8 -5
- package/src/native/shared/cef_response_filter.h +0 -116
- package/src/native/win/native_host.cpp +0 -2453
- package/src/types/config.ts +0 -29
package/src/bun/proc/native.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { existsSync } from "node:fs";
|
|
|
3
3
|
import { delimiter, join } from "node:path";
|
|
4
4
|
import { buniteEventEmitter } from "../events/eventEmitter";
|
|
5
5
|
import { resolveNativeArtifacts, type ResolvedNativeArtifacts } from "../../shared/paths";
|
|
6
|
+
import { log } from "../../shared/log";
|
|
6
7
|
|
|
7
8
|
export type NativeBootstrapOptions = {
|
|
8
9
|
allowStub?: boolean;
|
|
@@ -21,6 +22,8 @@ export type NativeRuntimeState = {
|
|
|
21
22
|
type CStringPointer = Pointer;
|
|
22
23
|
|
|
23
24
|
type NativeSymbols = {
|
|
25
|
+
bunite_abi_version: () => number;
|
|
26
|
+
bunite_set_log_level: (level: number) => void;
|
|
24
27
|
bunite_init: (
|
|
25
28
|
processHelperPath: CStringPointer,
|
|
26
29
|
cefDir: CStringPointer,
|
|
@@ -43,18 +46,20 @@ type NativeSymbols = {
|
|
|
43
46
|
hidden: boolean,
|
|
44
47
|
minimized: boolean,
|
|
45
48
|
maximized: boolean
|
|
46
|
-
) =>
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
) => boolean;
|
|
50
|
+
bunite_window_destroy: (windowId: number) => void;
|
|
51
|
+
bunite_window_reset_close_pending: (windowId: number) => void;
|
|
52
|
+
bunite_window_show: (windowId: number) => void;
|
|
53
|
+
bunite_window_close: (windowId: number) => void;
|
|
54
|
+
bunite_window_set_title: (windowId: number, title: CStringPointer) => void;
|
|
55
|
+
bunite_window_minimize: (windowId: number) => void;
|
|
56
|
+
bunite_window_unminimize: (windowId: number) => void;
|
|
57
|
+
bunite_window_is_minimized: (windowId: number) => boolean;
|
|
58
|
+
bunite_window_maximize: (windowId: number) => void;
|
|
59
|
+
bunite_window_unmaximize: (windowId: number) => void;
|
|
60
|
+
bunite_window_is_maximized: (windowId: number) => boolean;
|
|
56
61
|
bunite_window_set_frame: (
|
|
57
|
-
|
|
62
|
+
windowId: number,
|
|
58
63
|
x: number,
|
|
59
64
|
y: number,
|
|
60
65
|
width: number,
|
|
@@ -62,7 +67,7 @@ type NativeSymbols = {
|
|
|
62
67
|
) => void;
|
|
63
68
|
bunite_view_create: (
|
|
64
69
|
viewId: number,
|
|
65
|
-
|
|
70
|
+
windowId: number,
|
|
66
71
|
url: CStringPointer,
|
|
67
72
|
html: CStringPointer,
|
|
68
73
|
preload: CStringPointer,
|
|
@@ -73,24 +78,31 @@ type NativeSymbols = {
|
|
|
73
78
|
width: number,
|
|
74
79
|
height: number,
|
|
75
80
|
autoResize: boolean,
|
|
76
|
-
sandbox: boolean
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
sandbox: boolean,
|
|
82
|
+
preloadOriginsJson: CStringPointer
|
|
83
|
+
) => boolean;
|
|
84
|
+
bunite_register_appres_route: (path: CStringPointer) => void;
|
|
85
|
+
bunite_unregister_appres_route: (path: CStringPointer) => void;
|
|
80
86
|
bunite_complete_route_request: (requestId: number, html: CStringPointer) => void;
|
|
81
|
-
bunite_view_set_visible: (
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
bunite_view_set_visible: (viewId: number, visible: boolean) => void;
|
|
88
|
+
bunite_view_set_input_passthrough: (viewId: number, passthrough: boolean) => void;
|
|
89
|
+
bunite_view_set_mask_region: (viewId: number, rects: Pointer, count: number) => void;
|
|
90
|
+
bunite_view_bring_to_front: (viewId: number) => void;
|
|
91
|
+
bunite_view_set_bounds: (viewId: number, x: number, y: number, width: number, height: number) => void;
|
|
92
|
+
bunite_view_set_bounds_async: (viewId: number, x: number, y: number, width: number, height: number) => void;
|
|
93
|
+
bunite_view_set_anchor: (viewId: number, mode: number, inset: number) => void;
|
|
94
|
+
bunite_view_go_back: (viewId: number) => void;
|
|
95
|
+
bunite_view_reload: (viewId: number) => void;
|
|
96
|
+
bunite_view_execute_javascript: (viewId: number, script: CStringPointer) => void;
|
|
97
|
+
bunite_view_load_url: (viewId: number, url: CStringPointer) => void;
|
|
98
|
+
bunite_view_load_html: (viewId: number, html: CStringPointer) => void;
|
|
99
|
+
bunite_view_remove: (viewId: number) => void;
|
|
100
|
+
bunite_view_open_devtools: (viewId: number) => void;
|
|
101
|
+
bunite_view_close_devtools: (viewId: number) => void;
|
|
102
|
+
bunite_view_toggle_devtools: (viewId: number) => void;
|
|
92
103
|
bunite_complete_permission_request: (requestId: number, state: number) => void;
|
|
93
104
|
bunite_show_message_box: (
|
|
105
|
+
windowId: number,
|
|
94
106
|
type: CStringPointer,
|
|
95
107
|
title: CStringPointer,
|
|
96
108
|
message: CStringPointer,
|
|
@@ -99,16 +111,6 @@ type NativeSymbols = {
|
|
|
99
111
|
defaultId: number,
|
|
100
112
|
cancelId: number
|
|
101
113
|
) => number;
|
|
102
|
-
bunite_show_browser_message_box: (
|
|
103
|
-
type: CStringPointer,
|
|
104
|
-
title: CStringPointer,
|
|
105
|
-
message: CStringPointer,
|
|
106
|
-
detail: CStringPointer,
|
|
107
|
-
buttons: CStringPointer,
|
|
108
|
-
defaultId: number,
|
|
109
|
-
cancelId: number
|
|
110
|
-
) => number;
|
|
111
|
-
bunite_cancel_browser_message_box: (requestId: number) => void;
|
|
112
114
|
bunite_set_webview_event_handler: (handler: JSCallback) => void;
|
|
113
115
|
bunite_set_window_event_handler: (handler: JSCallback) => void;
|
|
114
116
|
};
|
|
@@ -121,6 +123,14 @@ const messageBoxButtonSeparator = "\x1f";
|
|
|
121
123
|
const unsetCancelId = -1;
|
|
122
124
|
|
|
123
125
|
const nativeSymbolDefinitions = {
|
|
126
|
+
bunite_abi_version: {
|
|
127
|
+
args: [],
|
|
128
|
+
returns: FFIType.i32
|
|
129
|
+
},
|
|
130
|
+
bunite_set_log_level: {
|
|
131
|
+
args: [FFIType.i32],
|
|
132
|
+
returns: FFIType.void
|
|
133
|
+
},
|
|
124
134
|
bunite_init: {
|
|
125
135
|
args: [FFIType.cstring, FFIType.cstring, FFIType.bool, FFIType.bool, FFIType.cstring],
|
|
126
136
|
returns: FFIType.bool
|
|
@@ -151,52 +161,60 @@ const nativeSymbolDefinitions = {
|
|
|
151
161
|
FFIType.bool,
|
|
152
162
|
FFIType.bool
|
|
153
163
|
],
|
|
154
|
-
returns: FFIType.
|
|
164
|
+
returns: FFIType.bool
|
|
165
|
+
},
|
|
166
|
+
bunite_window_destroy: {
|
|
167
|
+
args: [FFIType.u32],
|
|
168
|
+
returns: FFIType.void
|
|
169
|
+
},
|
|
170
|
+
bunite_window_reset_close_pending: {
|
|
171
|
+
args: [FFIType.u32],
|
|
172
|
+
returns: FFIType.void
|
|
155
173
|
},
|
|
156
174
|
bunite_window_show: {
|
|
157
|
-
args: [FFIType.
|
|
175
|
+
args: [FFIType.u32],
|
|
158
176
|
returns: FFIType.void
|
|
159
177
|
},
|
|
160
178
|
bunite_window_close: {
|
|
161
|
-
args: [FFIType.
|
|
179
|
+
args: [FFIType.u32],
|
|
162
180
|
returns: FFIType.void
|
|
163
181
|
},
|
|
164
182
|
bunite_window_set_title: {
|
|
165
|
-
args: [FFIType.
|
|
183
|
+
args: [FFIType.u32, FFIType.cstring],
|
|
166
184
|
returns: FFIType.void
|
|
167
185
|
},
|
|
168
186
|
bunite_window_minimize: {
|
|
169
|
-
args: [FFIType.
|
|
187
|
+
args: [FFIType.u32],
|
|
170
188
|
returns: FFIType.void
|
|
171
189
|
},
|
|
172
190
|
bunite_window_unminimize: {
|
|
173
|
-
args: [FFIType.
|
|
191
|
+
args: [FFIType.u32],
|
|
174
192
|
returns: FFIType.void
|
|
175
193
|
},
|
|
176
194
|
bunite_window_is_minimized: {
|
|
177
|
-
args: [FFIType.
|
|
195
|
+
args: [FFIType.u32],
|
|
178
196
|
returns: FFIType.bool
|
|
179
197
|
},
|
|
180
198
|
bunite_window_maximize: {
|
|
181
|
-
args: [FFIType.
|
|
199
|
+
args: [FFIType.u32],
|
|
182
200
|
returns: FFIType.void
|
|
183
201
|
},
|
|
184
202
|
bunite_window_unmaximize: {
|
|
185
|
-
args: [FFIType.
|
|
203
|
+
args: [FFIType.u32],
|
|
186
204
|
returns: FFIType.void
|
|
187
205
|
},
|
|
188
206
|
bunite_window_is_maximized: {
|
|
189
|
-
args: [FFIType.
|
|
207
|
+
args: [FFIType.u32],
|
|
190
208
|
returns: FFIType.bool
|
|
191
209
|
},
|
|
192
210
|
bunite_window_set_frame: {
|
|
193
|
-
args: [FFIType.
|
|
211
|
+
args: [FFIType.u32, FFIType.f64, FFIType.f64, FFIType.f64, FFIType.f64],
|
|
194
212
|
returns: FFIType.void
|
|
195
213
|
},
|
|
196
214
|
bunite_view_create: {
|
|
197
215
|
args: [
|
|
198
216
|
FFIType.u32,
|
|
199
|
-
FFIType.
|
|
217
|
+
FFIType.u32,
|
|
200
218
|
FFIType.cstring,
|
|
201
219
|
FFIType.cstring,
|
|
202
220
|
FFIType.cstring,
|
|
@@ -207,15 +225,16 @@ const nativeSymbolDefinitions = {
|
|
|
207
225
|
FFIType.f64,
|
|
208
226
|
FFIType.f64,
|
|
209
227
|
FFIType.bool,
|
|
210
|
-
FFIType.bool
|
|
228
|
+
FFIType.bool,
|
|
229
|
+
FFIType.cstring
|
|
211
230
|
],
|
|
212
|
-
returns: FFIType.
|
|
231
|
+
returns: FFIType.bool
|
|
213
232
|
},
|
|
214
|
-
|
|
233
|
+
bunite_register_appres_route: {
|
|
215
234
|
args: [FFIType.cstring],
|
|
216
235
|
returns: FFIType.void
|
|
217
236
|
},
|
|
218
|
-
|
|
237
|
+
bunite_unregister_appres_route: {
|
|
219
238
|
args: [FFIType.cstring],
|
|
220
239
|
returns: FFIType.void
|
|
221
240
|
},
|
|
@@ -224,47 +243,67 @@ const nativeSymbolDefinitions = {
|
|
|
224
243
|
returns: FFIType.void
|
|
225
244
|
},
|
|
226
245
|
bunite_view_set_visible: {
|
|
227
|
-
args: [FFIType.
|
|
246
|
+
args: [FFIType.u32, FFIType.bool],
|
|
247
|
+
returns: FFIType.void
|
|
248
|
+
},
|
|
249
|
+
bunite_view_set_input_passthrough: {
|
|
250
|
+
args: [FFIType.u32, FFIType.bool],
|
|
251
|
+
returns: FFIType.void
|
|
252
|
+
},
|
|
253
|
+
bunite_view_set_mask_region: {
|
|
254
|
+
args: [FFIType.u32, FFIType.pointer, FFIType.u32],
|
|
255
|
+
returns: FFIType.void
|
|
256
|
+
},
|
|
257
|
+
bunite_view_bring_to_front: {
|
|
258
|
+
args: [FFIType.u32],
|
|
228
259
|
returns: FFIType.void
|
|
229
260
|
},
|
|
230
261
|
bunite_view_set_bounds: {
|
|
231
|
-
args: [FFIType.
|
|
262
|
+
args: [FFIType.u32, FFIType.f64, FFIType.f64, FFIType.f64, FFIType.f64],
|
|
263
|
+
returns: FFIType.void
|
|
264
|
+
},
|
|
265
|
+
bunite_view_set_bounds_async: {
|
|
266
|
+
args: [FFIType.u32, FFIType.f64, FFIType.f64, FFIType.f64, FFIType.f64],
|
|
232
267
|
returns: FFIType.void
|
|
233
268
|
},
|
|
234
269
|
bunite_view_set_anchor: {
|
|
235
|
-
args: [FFIType.
|
|
270
|
+
args: [FFIType.u32, FFIType.i32, FFIType.f64],
|
|
236
271
|
returns: FFIType.void
|
|
237
272
|
},
|
|
238
273
|
bunite_view_go_back: {
|
|
239
|
-
args: [FFIType.
|
|
274
|
+
args: [FFIType.u32],
|
|
240
275
|
returns: FFIType.void
|
|
241
276
|
},
|
|
242
277
|
bunite_view_reload: {
|
|
243
|
-
args: [FFIType.
|
|
278
|
+
args: [FFIType.u32],
|
|
279
|
+
returns: FFIType.void
|
|
280
|
+
},
|
|
281
|
+
bunite_view_execute_javascript: {
|
|
282
|
+
args: [FFIType.u32, FFIType.cstring],
|
|
244
283
|
returns: FFIType.void
|
|
245
284
|
},
|
|
246
285
|
bunite_view_load_url: {
|
|
247
|
-
args: [FFIType.
|
|
286
|
+
args: [FFIType.u32, FFIType.cstring],
|
|
248
287
|
returns: FFIType.void
|
|
249
288
|
},
|
|
250
289
|
bunite_view_load_html: {
|
|
251
|
-
args: [FFIType.
|
|
290
|
+
args: [FFIType.u32, FFIType.cstring],
|
|
252
291
|
returns: FFIType.void
|
|
253
292
|
},
|
|
254
293
|
bunite_view_remove: {
|
|
255
|
-
args: [FFIType.
|
|
294
|
+
args: [FFIType.u32],
|
|
256
295
|
returns: FFIType.void
|
|
257
296
|
},
|
|
258
297
|
bunite_view_open_devtools: {
|
|
259
|
-
args: [FFIType.
|
|
298
|
+
args: [FFIType.u32],
|
|
260
299
|
returns: FFIType.void
|
|
261
300
|
},
|
|
262
301
|
bunite_view_close_devtools: {
|
|
263
|
-
args: [FFIType.
|
|
302
|
+
args: [FFIType.u32],
|
|
264
303
|
returns: FFIType.void
|
|
265
304
|
},
|
|
266
305
|
bunite_view_toggle_devtools: {
|
|
267
|
-
args: [FFIType.
|
|
306
|
+
args: [FFIType.u32],
|
|
268
307
|
returns: FFIType.void
|
|
269
308
|
},
|
|
270
309
|
bunite_complete_permission_request: {
|
|
@@ -273,6 +312,7 @@ const nativeSymbolDefinitions = {
|
|
|
273
312
|
},
|
|
274
313
|
bunite_show_message_box: {
|
|
275
314
|
args: [
|
|
315
|
+
FFIType.u32,
|
|
276
316
|
FFIType.cstring,
|
|
277
317
|
FFIType.cstring,
|
|
278
318
|
FFIType.cstring,
|
|
@@ -283,22 +323,6 @@ const nativeSymbolDefinitions = {
|
|
|
283
323
|
],
|
|
284
324
|
returns: FFIType.i32
|
|
285
325
|
},
|
|
286
|
-
bunite_show_browser_message_box: {
|
|
287
|
-
args: [
|
|
288
|
-
FFIType.cstring,
|
|
289
|
-
FFIType.cstring,
|
|
290
|
-
FFIType.cstring,
|
|
291
|
-
FFIType.cstring,
|
|
292
|
-
FFIType.cstring,
|
|
293
|
-
FFIType.i32,
|
|
294
|
-
FFIType.i32
|
|
295
|
-
],
|
|
296
|
-
returns: FFIType.u32
|
|
297
|
-
},
|
|
298
|
-
bunite_cancel_browser_message_box: {
|
|
299
|
-
args: [FFIType.u32],
|
|
300
|
-
returns: FFIType.void
|
|
301
|
-
},
|
|
302
326
|
bunite_set_webview_event_handler: {
|
|
303
327
|
args: [FFIType.function],
|
|
304
328
|
returns: FFIType.void
|
|
@@ -320,6 +344,19 @@ export function setRouteRequestHandler(handler: (requestId: number, path: string
|
|
|
320
344
|
routeRequestHandler = handler;
|
|
321
345
|
}
|
|
322
346
|
|
|
347
|
+
// Per-view deferred resolvers for "view-ready" (OnAfterCreated).
|
|
348
|
+
const viewReadyResolvers = new Map<number, () => void>();
|
|
349
|
+
|
|
350
|
+
export function waitForViewReady(viewId: number): Promise<void> {
|
|
351
|
+
return new Promise((resolve) => {
|
|
352
|
+
viewReadyResolvers.set(viewId, resolve);
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
export function cancelWaitForViewReady(viewId: number) {
|
|
357
|
+
viewReadyResolvers.delete(viewId);
|
|
358
|
+
}
|
|
359
|
+
|
|
323
360
|
export function toCString(value: string): CStringPointer {
|
|
324
361
|
const normalized = value.endsWith("\0") ? value : `${value}\0`;
|
|
325
362
|
const buffer = Buffer.from(normalized, "utf8");
|
|
@@ -365,7 +402,7 @@ function tryLoadNativeLibrary(artifacts: ResolvedNativeArtifacts) {
|
|
|
365
402
|
symbols: library.symbols as unknown as NativeSymbols
|
|
366
403
|
} satisfies LoadedNativeLibrary;
|
|
367
404
|
} catch (error) {
|
|
368
|
-
|
|
405
|
+
log.warn("Failed to load native library via FFI.", error);
|
|
369
406
|
return null;
|
|
370
407
|
}
|
|
371
408
|
}
|
|
@@ -427,19 +464,19 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
|
|
|
427
464
|
viewId
|
|
428
465
|
);
|
|
429
466
|
break;
|
|
430
|
-
case "message-box-response":
|
|
431
|
-
buniteEventEmitter.emitEvent(
|
|
432
|
-
buniteEventEmitter.events.webview.messageBoxResponse(
|
|
433
|
-
maybeParsePayload(payload) as { requestId: number; response: number }
|
|
434
|
-
),
|
|
435
|
-
viewId
|
|
436
|
-
);
|
|
437
|
-
break;
|
|
438
467
|
case "route-request": {
|
|
439
468
|
const parsed = maybeParsePayload(payload) as { requestId: number; path: string };
|
|
440
469
|
routeRequestHandler?.(parsed.requestId, parsed.path);
|
|
441
470
|
break;
|
|
442
471
|
}
|
|
472
|
+
case "view-ready": {
|
|
473
|
+
const resolver = viewReadyResolvers.get(viewId);
|
|
474
|
+
if (resolver) {
|
|
475
|
+
viewReadyResolvers.delete(viewId);
|
|
476
|
+
resolver();
|
|
477
|
+
}
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
443
480
|
}
|
|
444
481
|
},
|
|
445
482
|
{
|
|
@@ -460,6 +497,23 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
|
|
|
460
497
|
const parsedPayload = maybeParsePayload(payload);
|
|
461
498
|
|
|
462
499
|
switch (eventName) {
|
|
500
|
+
case "all-windows-closed":
|
|
501
|
+
buniteEventEmitter.emitEvent(
|
|
502
|
+
buniteEventEmitter.events.app.allWindowsClosed()
|
|
503
|
+
);
|
|
504
|
+
break;
|
|
505
|
+
case "close-requested": {
|
|
506
|
+
const crEvent = buniteEventEmitter.events.window.closeRequested({ id: windowId });
|
|
507
|
+
buniteEventEmitter.emitEvent(crEvent, windowId);
|
|
508
|
+
if (crEvent.responseWasSet && crEvent.response?.allow === false) {
|
|
509
|
+
nativeLibrary?.symbols.bunite_window_reset_close_pending(windowId);
|
|
510
|
+
} else {
|
|
511
|
+
queueMicrotask(() => {
|
|
512
|
+
nativeLibrary?.symbols.bunite_window_destroy(windowId);
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
463
517
|
case "close":
|
|
464
518
|
buniteEventEmitter.emitEvent(
|
|
465
519
|
buniteEventEmitter.events.window.close({ id: windowId }),
|
|
@@ -557,6 +611,14 @@ export async function initNativeRuntime(
|
|
|
557
611
|
nativeLibrary = hasNativeArtifacts ? tryLoadNativeLibrary(artifacts) : null;
|
|
558
612
|
|
|
559
613
|
if (nativeLibrary) {
|
|
614
|
+
const EXPECTED_ABI = 2;
|
|
615
|
+
const nativeAbi = nativeLibrary.symbols.bunite_abi_version();
|
|
616
|
+
if (nativeAbi !== EXPECTED_ABI) {
|
|
617
|
+
throw new Error(
|
|
618
|
+
`bunite native ABI mismatch: JS expects ${EXPECTED_ABI}, native reports ${nativeAbi}. ` +
|
|
619
|
+
`Rebuild native binaries with 'bun run build:native:win'.`
|
|
620
|
+
);
|
|
621
|
+
}
|
|
560
622
|
registerNativeCallbacks(nativeLibrary);
|
|
561
623
|
const chromiumFlagsJson = options.chromiumFlags
|
|
562
624
|
? JSON.stringify(options.chromiumFlags)
|
|
@@ -578,9 +640,7 @@ export async function initNativeRuntime(
|
|
|
578
640
|
}
|
|
579
641
|
|
|
580
642
|
if (!nativeLibrary) {
|
|
581
|
-
|
|
582
|
-
"[bunite] Native runtime packages were not found or could not be loaded. Initializing in stub mode."
|
|
583
|
-
);
|
|
643
|
+
log.warn("Native runtime packages were not found or could not be loaded. Initializing in stub mode.");
|
|
584
644
|
}
|
|
585
645
|
|
|
586
646
|
state = {
|
|
@@ -607,11 +667,15 @@ export function getNativeLibrary(): LoadedNativeLibrary | null {
|
|
|
607
667
|
return nativeLibrary;
|
|
608
668
|
}
|
|
609
669
|
|
|
670
|
+
export function setNativeLogLevel(level: number): void {
|
|
671
|
+
nativeLibrary?.symbols.bunite_set_log_level(level);
|
|
672
|
+
}
|
|
673
|
+
|
|
610
674
|
export function completePermissionRequest(requestId: number, stateValue: number): void {
|
|
611
675
|
nativeLibrary?.symbols.bunite_complete_permission_request(requestId, stateValue);
|
|
612
676
|
}
|
|
613
677
|
|
|
614
|
-
export function showNativeMessageBox(params: {
|
|
678
|
+
export function showNativeMessageBox(windowId: number, params: {
|
|
615
679
|
type?: string;
|
|
616
680
|
title?: string;
|
|
617
681
|
message?: string;
|
|
@@ -626,6 +690,7 @@ export function showNativeMessageBox(params: {
|
|
|
626
690
|
}
|
|
627
691
|
|
|
628
692
|
return native.symbols.bunite_show_message_box(
|
|
693
|
+
windowId,
|
|
629
694
|
toCString(params.type ?? "info"),
|
|
630
695
|
toCString(params.title ?? ""),
|
|
631
696
|
toCString(params.message ?? ""),
|
|
@@ -635,32 +700,3 @@ export function showNativeMessageBox(params: {
|
|
|
635
700
|
params.cancelId ?? unsetCancelId
|
|
636
701
|
);
|
|
637
702
|
}
|
|
638
|
-
|
|
639
|
-
export function requestBrowserMessageBox(params: {
|
|
640
|
-
type?: string;
|
|
641
|
-
title?: string;
|
|
642
|
-
message?: string;
|
|
643
|
-
detail?: string;
|
|
644
|
-
buttons?: string[];
|
|
645
|
-
defaultId?: number;
|
|
646
|
-
cancelId?: number;
|
|
647
|
-
}): number {
|
|
648
|
-
const native = getNativeLibrary();
|
|
649
|
-
if (!native) {
|
|
650
|
-
return 0;
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
return native.symbols.bunite_show_browser_message_box(
|
|
654
|
-
toCString(params.type ?? "info"),
|
|
655
|
-
toCString(params.title ?? ""),
|
|
656
|
-
toCString(params.message ?? ""),
|
|
657
|
-
toCString(params.detail ?? ""),
|
|
658
|
-
toCString((params.buttons ?? ["OK"]).join(messageBoxButtonSeparator)),
|
|
659
|
-
params.defaultId ?? 0,
|
|
660
|
-
params.cancelId ?? unsetCancelId
|
|
661
|
-
);
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
export function cancelBrowserMessageBoxRequest(requestId: number): void {
|
|
665
|
-
getNativeLibrary()?.symbols.bunite_cancel_browser_message_box(requestId);
|
|
666
|
-
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <cstdint>
|
|
4
|
-
|
|
5
|
-
typedef void (*BuniteWebviewEventHandler)(uint32_t view_id, const char* event_name, const char* payload);
|
|
6
|
-
typedef void (*BuniteWindowEventHandler)(uint32_t window_id, const char* event_name, const char* payload);
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <cstdint>
|
|
4
|
+
|
|
5
|
+
typedef void (*BuniteWebviewEventHandler)(uint32_t view_id, const char* event_name, const char* payload);
|
|
6
|
+
typedef void (*BuniteWindowEventHandler)(uint32_t window_id, const char* event_name, const char* payload);
|