bunite-core 0.17.1 → 0.17.2

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,10 +1,14 @@
1
- import { CString, dlopen, FFIType, JSCallback, ptr, type Pointer } from "bun:ffi";
1
+ import { CString, dlopen, FFIType, JSCallback, type Pointer, ptr } from "bun:ffi";
2
2
  import { existsSync } from "node:fs";
3
3
  import { delimiter, join } from "node:path";
4
4
  import { buniteEventEmitter } from "./events/eventEmitter";
5
- import { resolveNativeArtifacts, type ResolvedNativeArtifacts, type WindowsEngine } from "./paths";
6
- import { resolvePackageRoot } from "./paths";
7
5
  import { log } from "./log";
6
+ import {
7
+ type ResolvedNativeArtifacts,
8
+ resolveNativeArtifacts,
9
+ resolvePackageRoot,
10
+ type WindowsEngine,
11
+ } from "./paths";
8
12
 
9
13
  export type NativeBootstrapOptions = {
10
14
  hideConsole?: boolean;
@@ -36,7 +40,7 @@ type NativeSymbols = {
36
40
  cefDir: CStringPointer,
37
41
  hideConsole: boolean,
38
42
  popupBlocking: boolean,
39
- engineConfigJson: CStringPointer
43
+ engineConfigJson: CStringPointer,
40
44
  ) => boolean;
41
45
  bunite_run_loop: () => void;
42
46
  bunite_pump_once: () => void;
@@ -53,7 +57,7 @@ type NativeSymbols = {
53
57
  transparent: boolean,
54
58
  hidden: boolean,
55
59
  minimized: boolean,
56
- maximized: boolean
60
+ maximized: boolean,
57
61
  ) => boolean;
58
62
  bunite_window_destroy: (windowId: number) => void;
59
63
  bunite_window_reset_close_pending: (windowId: number) => void;
@@ -71,7 +75,7 @@ type NativeSymbols = {
71
75
  x: number,
72
76
  y: number,
73
77
  width: number,
74
- height: number
78
+ height: number,
75
79
  ) => void;
76
80
  bunite_window_begin_move_drag: (windowId: number) => void;
77
81
  bunite_view_create: (
@@ -88,7 +92,7 @@ type NativeSymbols = {
88
92
  height: number,
89
93
  autoResize: boolean,
90
94
  sandbox: boolean,
91
- preloadOriginsJson: CStringPointer
95
+ preloadOriginsJson: CStringPointer,
92
96
  ) => boolean;
93
97
  bunite_register_appres_route: (path: CStringPointer) => void;
94
98
  bunite_unregister_appres_route: (path: CStringPointer) => void;
@@ -97,54 +101,106 @@ type NativeSymbols = {
97
101
  bunite_view_set_input_passthrough: (viewId: number, passthrough: boolean) => void;
98
102
  bunite_view_set_mask_region: (viewId: number, rects: Pointer, count: number) => void;
99
103
  bunite_view_bring_to_front: (viewId: number) => void;
100
- bunite_view_set_bounds: (viewId: number, x: number, y: number, width: number, height: number) => void;
101
- bunite_view_set_bounds_async: (viewId: number, x: number, y: number, width: number, height: number) => void;
104
+ bunite_view_set_bounds: (
105
+ viewId: number,
106
+ x: number,
107
+ y: number,
108
+ width: number,
109
+ height: number,
110
+ ) => void;
111
+ bunite_view_set_bounds_async: (
112
+ viewId: number,
113
+ x: number,
114
+ y: number,
115
+ width: number,
116
+ height: number,
117
+ ) => void;
102
118
  bunite_view_go_back: (viewId: number) => void;
103
119
  bunite_view_reload: (viewId: number) => void;
104
120
  bunite_view_execute_javascript: (viewId: number, script: CStringPointer) => void;
105
121
  bunite_view_evaluate: (viewId: number, requestId: number, script: CStringPointer) => void;
106
122
  bunite_view_click: (
107
- viewId: number, x: number, y: number,
108
- button: number, clickCount: number, modifiers: number
123
+ viewId: number,
124
+ x: number,
125
+ y: number,
126
+ button: number,
127
+ clickCount: number,
128
+ modifiers: number,
109
129
  ) => void;
110
130
  bunite_view_type: (viewId: number, text: CStringPointer) => void;
111
131
  bunite_view_press: (
112
- viewId: number, windowsVkCode: number, macKeyCode: number,
113
- key: CStringPointer, code: CStringPointer, character: CStringPointer,
114
- modifiers: number, action: number, extended: boolean, location: number
132
+ viewId: number,
133
+ windowsVkCode: number,
134
+ macKeyCode: number,
135
+ key: CStringPointer,
136
+ code: CStringPointer,
137
+ character: CStringPointer,
138
+ modifiers: number,
139
+ action: number,
140
+ extended: boolean,
141
+ location: number,
115
142
  ) => void;
116
143
  bunite_view_scroll: (
117
- viewId: number, dx: number, dy: number,
118
- x: number, y: number, modifiers: number
144
+ viewId: number,
145
+ dx: number,
146
+ dy: number,
147
+ x: number,
148
+ y: number,
149
+ modifiers: number,
119
150
  ) => void;
120
151
  bunite_view_mouse: (
121
- viewId: number, action: number, x: number, y: number,
122
- button: number, modifiers: number
152
+ viewId: number,
153
+ action: number,
154
+ x: number,
155
+ y: number,
156
+ button: number,
157
+ modifiers: number,
123
158
  ) => void;
124
159
  bunite_view_respond_dialog: (
125
- viewId: number, requestId: number, accept: boolean, text: CStringPointer
160
+ viewId: number,
161
+ requestId: number,
162
+ accept: boolean,
163
+ text: CStringPointer,
126
164
  ) => void;
127
165
  bunite_view_screenshot: (
128
- viewId: number, requestId: number, format: CStringPointer, quality: number
166
+ viewId: number,
167
+ requestId: number,
168
+ format: CStringPointer,
169
+ quality: number,
129
170
  ) => void;
130
171
  bunite_view_accessibility_snapshot: (
131
- viewId: number, requestId: number, interestingOnly: number
172
+ viewId: number,
173
+ requestId: number,
174
+ interestingOnly: number,
132
175
  ) => void;
133
176
  bunite_view_list_frames: (viewId: number, requestId: number) => void;
134
177
  bunite_view_evaluate_in_frame: (
135
- viewId: number, requestId: number, script: CStringPointer, frameId: CStringPointer
178
+ viewId: number,
179
+ requestId: number,
180
+ script: CStringPointer,
181
+ frameId: CStringPointer,
136
182
  ) => void;
137
183
  bunite_view_resolve_and_click: (
138
- viewId: number, requestId: number,
139
- selector: CStringPointer, frameId: CStringPointer,
140
- button: number, clickCount: number, modifiers: number
184
+ viewId: number,
185
+ requestId: number,
186
+ selector: CStringPointer,
187
+ frameId: CStringPointer,
188
+ button: number,
189
+ clickCount: number,
190
+ modifiers: number,
141
191
  ) => void;
142
192
  bunite_view_set_download_policy: (
143
- viewId: number, policy: number, downloadDir: CStringPointer
193
+ viewId: number,
194
+ policy: number,
195
+ downloadDir: CStringPointer,
144
196
  ) => void;
145
197
  bunite_view_popup_accept: (
146
- newViewId: number, hostWindowId: number,
147
- x: number, y: number, w: number, h: number,
198
+ newViewId: number,
199
+ hostWindowId: number,
200
+ x: number,
201
+ y: number,
202
+ w: number,
203
+ h: number,
148
204
  ) => void;
149
205
  bunite_view_popup_dismiss: (newViewId: number) => void;
150
206
  bunite_view_capabilities: (viewId: number) => number;
@@ -166,39 +222,39 @@ type LoadedNativeLibrary = {
166
222
  const nativeSymbolDefinitions = {
167
223
  bunite_abi_version: {
168
224
  args: [],
169
- returns: FFIType.i32
225
+ returns: FFIType.i32,
170
226
  },
171
227
  bunite_engine_name: {
172
228
  args: [],
173
- returns: FFIType.cstring
229
+ returns: FFIType.cstring,
174
230
  },
175
231
  bunite_engine_version: {
176
232
  args: [],
177
- returns: FFIType.cstring
233
+ returns: FFIType.cstring,
178
234
  },
179
235
  bunite_set_log_level: {
180
236
  args: [FFIType.i32],
181
- returns: FFIType.void
237
+ returns: FFIType.void,
182
238
  },
183
239
  bunite_init: {
184
240
  args: [FFIType.cstring, FFIType.bool, FFIType.bool, FFIType.cstring],
185
- returns: FFIType.bool
241
+ returns: FFIType.bool,
186
242
  },
187
243
  bunite_run_loop: {
188
244
  args: [],
189
- returns: FFIType.void
245
+ returns: FFIType.void,
190
246
  },
191
247
  bunite_pump_once: {
192
248
  args: [],
193
- returns: FFIType.void
249
+ returns: FFIType.void,
194
250
  },
195
251
  bunite_quit: {
196
252
  args: [],
197
- returns: FFIType.void
253
+ returns: FFIType.void,
198
254
  },
199
255
  bunite_free_cstring: {
200
256
  args: [FFIType.ptr],
201
- returns: FFIType.void
257
+ returns: FFIType.void,
202
258
  },
203
259
  bunite_window_create: {
204
260
  args: [
@@ -212,61 +268,61 @@ const nativeSymbolDefinitions = {
212
268
  FFIType.bool,
213
269
  FFIType.bool,
214
270
  FFIType.bool,
215
- FFIType.bool
271
+ FFIType.bool,
216
272
  ],
217
- returns: FFIType.bool
273
+ returns: FFIType.bool,
218
274
  },
219
275
  bunite_window_destroy: {
220
276
  args: [FFIType.u32],
221
- returns: FFIType.void
277
+ returns: FFIType.void,
222
278
  },
223
279
  bunite_window_reset_close_pending: {
224
280
  args: [FFIType.u32],
225
- returns: FFIType.void
281
+ returns: FFIType.void,
226
282
  },
227
283
  bunite_window_show: {
228
284
  args: [FFIType.u32],
229
- returns: FFIType.void
285
+ returns: FFIType.void,
230
286
  },
231
287
  bunite_window_close: {
232
288
  args: [FFIType.u32],
233
- returns: FFIType.void
289
+ returns: FFIType.void,
234
290
  },
235
291
  bunite_window_set_title: {
236
292
  args: [FFIType.u32, FFIType.cstring],
237
- returns: FFIType.void
293
+ returns: FFIType.void,
238
294
  },
239
295
  bunite_window_minimize: {
240
296
  args: [FFIType.u32],
241
- returns: FFIType.void
297
+ returns: FFIType.void,
242
298
  },
243
299
  bunite_window_unminimize: {
244
300
  args: [FFIType.u32],
245
- returns: FFIType.void
301
+ returns: FFIType.void,
246
302
  },
247
303
  bunite_window_is_minimized: {
248
304
  args: [FFIType.u32],
249
- returns: FFIType.bool
305
+ returns: FFIType.bool,
250
306
  },
251
307
  bunite_window_maximize: {
252
308
  args: [FFIType.u32],
253
- returns: FFIType.void
309
+ returns: FFIType.void,
254
310
  },
255
311
  bunite_window_unmaximize: {
256
312
  args: [FFIType.u32],
257
- returns: FFIType.void
313
+ returns: FFIType.void,
258
314
  },
259
315
  bunite_window_is_maximized: {
260
316
  args: [FFIType.u32],
261
- returns: FFIType.bool
317
+ returns: FFIType.bool,
262
318
  },
263
319
  bunite_window_set_frame: {
264
320
  args: [FFIType.u32, FFIType.f64, FFIType.f64, FFIType.f64, FFIType.f64],
265
- returns: FFIType.void
321
+ returns: FFIType.void,
266
322
  },
267
323
  bunite_window_begin_move_drag: {
268
324
  args: [FFIType.u32],
269
- returns: FFIType.void
325
+ returns: FFIType.void,
270
326
  },
271
327
  bunite_view_create: {
272
328
  args: [
@@ -283,158 +339,177 @@ const nativeSymbolDefinitions = {
283
339
  FFIType.f64,
284
340
  FFIType.bool,
285
341
  FFIType.bool,
286
- FFIType.cstring
342
+ FFIType.cstring,
287
343
  ],
288
- returns: FFIType.bool
344
+ returns: FFIType.bool,
289
345
  },
290
346
  bunite_register_appres_route: {
291
347
  args: [FFIType.cstring],
292
- returns: FFIType.void
348
+ returns: FFIType.void,
293
349
  },
294
350
  bunite_unregister_appres_route: {
295
351
  args: [FFIType.cstring],
296
- returns: FFIType.void
352
+ returns: FFIType.void,
297
353
  },
298
354
  bunite_complete_route_request: {
299
355
  args: [FFIType.u32, FFIType.cstring],
300
- returns: FFIType.void
356
+ returns: FFIType.void,
301
357
  },
302
358
  bunite_view_set_visible: {
303
359
  args: [FFIType.u32, FFIType.bool],
304
- returns: FFIType.void
360
+ returns: FFIType.void,
305
361
  },
306
362
  bunite_view_set_input_passthrough: {
307
363
  args: [FFIType.u32, FFIType.bool],
308
- returns: FFIType.void
364
+ returns: FFIType.void,
309
365
  },
310
366
  bunite_view_set_mask_region: {
311
367
  args: [FFIType.u32, FFIType.pointer, FFIType.u32],
312
- returns: FFIType.void
368
+ returns: FFIType.void,
313
369
  },
314
370
  bunite_view_bring_to_front: {
315
371
  args: [FFIType.u32],
316
- returns: FFIType.void
372
+ returns: FFIType.void,
317
373
  },
318
374
  bunite_view_set_bounds: {
319
375
  args: [FFIType.u32, FFIType.f64, FFIType.f64, FFIType.f64, FFIType.f64],
320
- returns: FFIType.void
376
+ returns: FFIType.void,
321
377
  },
322
378
  bunite_view_set_bounds_async: {
323
379
  args: [FFIType.u32, FFIType.f64, FFIType.f64, FFIType.f64, FFIType.f64],
324
- returns: FFIType.void
380
+ returns: FFIType.void,
325
381
  },
326
382
  bunite_view_go_back: {
327
383
  args: [FFIType.u32],
328
- returns: FFIType.void
384
+ returns: FFIType.void,
329
385
  },
330
386
  bunite_view_reload: {
331
387
  args: [FFIType.u32],
332
- returns: FFIType.void
388
+ returns: FFIType.void,
333
389
  },
334
390
  bunite_view_execute_javascript: {
335
391
  args: [FFIType.u32, FFIType.cstring],
336
- returns: FFIType.void
392
+ returns: FFIType.void,
337
393
  },
338
394
  bunite_view_evaluate: {
339
395
  args: [FFIType.u32, FFIType.u32, FFIType.cstring],
340
- returns: FFIType.void
396
+ returns: FFIType.void,
341
397
  },
342
398
  bunite_view_click: {
343
399
  args: [FFIType.u32, FFIType.f64, FFIType.f64, FFIType.i32, FFIType.i32, FFIType.u32],
344
- returns: FFIType.void
400
+ returns: FFIType.void,
345
401
  },
346
402
  bunite_view_type: {
347
403
  args: [FFIType.u32, FFIType.cstring],
348
- returns: FFIType.void
404
+ returns: FFIType.void,
349
405
  },
350
406
  bunite_view_press: {
351
- args: [FFIType.u32, FFIType.i32, FFIType.i32, FFIType.cstring, FFIType.cstring, FFIType.cstring, FFIType.u32, FFIType.i32, FFIType.bool, FFIType.i32],
352
- returns: FFIType.void
407
+ args: [
408
+ FFIType.u32,
409
+ FFIType.i32,
410
+ FFIType.i32,
411
+ FFIType.cstring,
412
+ FFIType.cstring,
413
+ FFIType.cstring,
414
+ FFIType.u32,
415
+ FFIType.i32,
416
+ FFIType.bool,
417
+ FFIType.i32,
418
+ ],
419
+ returns: FFIType.void,
353
420
  },
354
421
  bunite_view_scroll: {
355
422
  args: [FFIType.u32, FFIType.f64, FFIType.f64, FFIType.f64, FFIType.f64, FFIType.u32],
356
- returns: FFIType.void
423
+ returns: FFIType.void,
357
424
  },
358
425
  bunite_view_mouse: {
359
426
  args: [FFIType.u32, FFIType.i32, FFIType.f64, FFIType.f64, FFIType.i32, FFIType.u32],
360
- returns: FFIType.void
427
+ returns: FFIType.void,
361
428
  },
362
429
  bunite_view_respond_dialog: {
363
430
  args: [FFIType.u32, FFIType.u32, FFIType.bool, FFIType.cstring],
364
- returns: FFIType.void
431
+ returns: FFIType.void,
365
432
  },
366
433
  bunite_view_screenshot: {
367
434
  args: [FFIType.u32, FFIType.u32, FFIType.cstring, FFIType.i32],
368
- returns: FFIType.void
435
+ returns: FFIType.void,
369
436
  },
370
437
  bunite_view_accessibility_snapshot: {
371
438
  args: [FFIType.u32, FFIType.u32, FFIType.i32],
372
- returns: FFIType.void
439
+ returns: FFIType.void,
373
440
  },
374
441
  bunite_view_list_frames: {
375
442
  args: [FFIType.u32, FFIType.u32],
376
- returns: FFIType.void
443
+ returns: FFIType.void,
377
444
  },
378
445
  bunite_view_evaluate_in_frame: {
379
446
  args: [FFIType.u32, FFIType.u32, FFIType.cstring, FFIType.cstring],
380
- returns: FFIType.void
447
+ returns: FFIType.void,
381
448
  },
382
449
  bunite_view_resolve_and_click: {
383
- args: [FFIType.u32, FFIType.u32, FFIType.cstring, FFIType.cstring, FFIType.i32, FFIType.i32, FFIType.u32],
384
- returns: FFIType.void
450
+ args: [
451
+ FFIType.u32,
452
+ FFIType.u32,
453
+ FFIType.cstring,
454
+ FFIType.cstring,
455
+ FFIType.i32,
456
+ FFIType.i32,
457
+ FFIType.u32,
458
+ ],
459
+ returns: FFIType.void,
385
460
  },
386
461
  bunite_view_set_download_policy: {
387
462
  args: [FFIType.u32, FFIType.i32, FFIType.cstring],
388
- returns: FFIType.void
463
+ returns: FFIType.void,
389
464
  },
390
465
  bunite_view_popup_accept: {
391
466
  args: [FFIType.u32, FFIType.u32, FFIType.f64, FFIType.f64, FFIType.f64, FFIType.f64],
392
- returns: FFIType.void
467
+ returns: FFIType.void,
393
468
  },
394
469
  bunite_view_popup_dismiss: {
395
470
  args: [FFIType.u32],
396
- returns: FFIType.void
471
+ returns: FFIType.void,
397
472
  },
398
473
  bunite_view_capabilities: {
399
474
  args: [FFIType.u32],
400
- returns: FFIType.u32
475
+ returns: FFIType.u32,
401
476
  },
402
477
  bunite_view_load_url: {
403
478
  args: [FFIType.u32, FFIType.cstring],
404
- returns: FFIType.void
479
+ returns: FFIType.void,
405
480
  },
406
481
  bunite_view_load_html: {
407
482
  args: [FFIType.u32, FFIType.cstring],
408
- returns: FFIType.void
483
+ returns: FFIType.void,
409
484
  },
410
485
  bunite_view_remove: {
411
486
  args: [FFIType.u32],
412
- returns: FFIType.void
487
+ returns: FFIType.void,
413
488
  },
414
489
  bunite_view_open_devtools: {
415
490
  args: [FFIType.u32],
416
- returns: FFIType.void
491
+ returns: FFIType.void,
417
492
  },
418
493
  bunite_view_close_devtools: {
419
494
  args: [FFIType.u32],
420
- returns: FFIType.void
495
+ returns: FFIType.void,
421
496
  },
422
497
  bunite_view_toggle_devtools: {
423
498
  args: [FFIType.u32],
424
- returns: FFIType.void
499
+ returns: FFIType.void,
425
500
  },
426
501
  bunite_complete_permission_request: {
427
502
  args: [FFIType.u32, FFIType.u32],
428
- returns: FFIType.void
503
+ returns: FFIType.void,
429
504
  },
430
505
  bunite_set_webview_event_handler: {
431
506
  args: [FFIType.function],
432
- returns: FFIType.void
507
+ returns: FFIType.void,
433
508
  },
434
509
  bunite_set_window_event_handler: {
435
510
  args: [FFIType.function],
436
- returns: FFIType.void
437
- }
511
+ returns: FFIType.void,
512
+ },
438
513
  } as const;
439
514
 
440
515
  let state: NativeRuntimeState | null = null;
@@ -451,12 +526,14 @@ export function setRouteRequestHandler(handler: (requestId: number, path: string
451
526
  export type NativeEvaluateResult = {
452
527
  requestId: number;
453
528
  ok: boolean;
454
- value?: string; // raw JSON string when ok
529
+ value?: string; // raw JSON string when ok
455
530
  code?: string;
456
531
  message?: string;
457
532
  };
458
533
  let evaluateResultHandler: ((viewId: number, result: NativeEvaluateResult) => void) | null = null;
459
- export function setEvaluateResultHandler(handler: (viewId: number, result: NativeEvaluateResult) => void) {
534
+ export function setEvaluateResultHandler(
535
+ handler: (viewId: number, result: NativeEvaluateResult) => void,
536
+ ) {
460
537
  evaluateResultHandler = handler;
461
538
  }
462
539
 
@@ -469,20 +546,27 @@ export type NativeScreenshotResult = {
469
546
  code?: string;
470
547
  message?: string;
471
548
  };
472
- let screenshotResultHandler: ((viewId: number, result: NativeScreenshotResult) => void) | null = null;
473
- export function setScreenshotResultHandler(handler: (viewId: number, result: NativeScreenshotResult) => void) {
549
+ let screenshotResultHandler: ((viewId: number, result: NativeScreenshotResult) => void) | null =
550
+ null;
551
+ export function setScreenshotResultHandler(
552
+ handler: (viewId: number, result: NativeScreenshotResult) => void,
553
+ ) {
474
554
  screenshotResultHandler = handler;
475
555
  }
476
556
 
477
557
  export type NativeAccessibilityResult = {
478
558
  requestId: number;
479
559
  ok: boolean;
480
- tree?: unknown; // CDP Accessibility.AXNode tree as JSON value
560
+ tree?: unknown; // CDP Accessibility.AXNode tree as JSON value
481
561
  code?: string;
482
562
  message?: string;
483
563
  };
484
- let accessibilityResultHandler: ((viewId: number, result: NativeAccessibilityResult) => void) | null = null;
485
- export function setAccessibilityResultHandler(handler: (viewId: number, result: NativeAccessibilityResult) => void) {
564
+ let accessibilityResultHandler:
565
+ | ((viewId: number, result: NativeAccessibilityResult) => void)
566
+ | null = null;
567
+ export function setAccessibilityResultHandler(
568
+ handler: (viewId: number, result: NativeAccessibilityResult) => void,
569
+ ) {
486
570
  accessibilityResultHandler = handler;
487
571
  }
488
572
 
@@ -494,8 +578,11 @@ export type NativeListFramesResult = {
494
578
  code?: string;
495
579
  message?: string;
496
580
  };
497
- let listFramesResultHandler: ((viewId: number, result: NativeListFramesResult) => void) | null = null;
498
- export function setListFramesResultHandler(handler: (viewId: number, result: NativeListFramesResult) => void) {
581
+ let listFramesResultHandler: ((viewId: number, result: NativeListFramesResult) => void) | null =
582
+ null;
583
+ export function setListFramesResultHandler(
584
+ handler: (viewId: number, result: NativeListFramesResult) => void,
585
+ ) {
499
586
  listFramesResultHandler = handler;
500
587
  }
501
588
 
@@ -507,8 +594,12 @@ export type NativeResolveAndClickResult = {
507
594
  code?: string;
508
595
  message?: string;
509
596
  };
510
- let resolveAndClickResultHandler: ((viewId: number, result: NativeResolveAndClickResult) => void) | null = null;
511
- export function setResolveAndClickResultHandler(handler: (viewId: number, result: NativeResolveAndClickResult) => void) {
597
+ let resolveAndClickResultHandler:
598
+ | ((viewId: number, result: NativeResolveAndClickResult) => void)
599
+ | null = null;
600
+ export function setResolveAndClickResultHandler(
601
+ handler: (viewId: number, result: NativeResolveAndClickResult) => void,
602
+ ) {
512
603
  resolveAndClickResultHandler = handler;
513
604
  }
514
605
 
@@ -525,7 +616,9 @@ export type NativeDownloadEvent = {
525
616
  reason?: string;
526
617
  };
527
618
  let downloadEventHandler: ((viewId: number, event: NativeDownloadEvent) => void) | null = null;
528
- export function setDownloadEventHandler(handler: (viewId: number, event: NativeDownloadEvent) => void) {
619
+ export function setDownloadEventHandler(
620
+ handler: (viewId: number, event: NativeDownloadEvent) => void,
621
+ ) {
529
622
  downloadEventHandler = handler;
530
623
  }
531
624
 
@@ -558,12 +651,14 @@ export function toCString(value: string): CStringPointer {
558
651
  function applyEnvironment(artifacts: ResolvedNativeArtifacts) {
559
652
  // CEF needs engine dir on PATH (libcef.dll) and ICU_DATA pointing at resources.
560
653
  // WebView2 needs the directory containing WebView2Loader.dll on PATH.
561
- const engineBinaryDir = artifacts.cefDir && existsSync(join(artifacts.cefDir, "Release", "libcef.dll"))
562
- ? join(artifacts.cefDir, "Release")
563
- : artifacts.cefDir;
564
- const engineResourceDir = artifacts.cefDir && existsSync(join(artifacts.cefDir, "Resources", "resources.pak"))
565
- ? join(artifacts.cefDir, "Resources")
566
- : artifacts.cefDir;
654
+ const engineBinaryDir =
655
+ artifacts.cefDir && existsSync(join(artifacts.cefDir, "Release", "libcef.dll"))
656
+ ? join(artifacts.cefDir, "Release")
657
+ : artifacts.cefDir;
658
+ const engineResourceDir =
659
+ artifacts.cefDir && existsSync(join(artifacts.cefDir, "Resources", "resources.pak"))
660
+ ? join(artifacts.cefDir, "Resources")
661
+ : artifacts.cefDir;
567
662
 
568
663
  if (engineResourceDir && !process.env.ICU_DATA) {
569
664
  process.env.ICU_DATA = engineResourceDir;
@@ -592,7 +687,7 @@ function tryLoadNativeLibrary(artifacts: ResolvedNativeArtifacts) {
592
687
  try {
593
688
  const library = dlopen(artifacts.nativeLibPath, nativeSymbolDefinitions as any);
594
689
  return {
595
- symbols: library.symbols as unknown as NativeSymbols
690
+ symbols: library.symbols as unknown as NativeSymbols,
596
691
  } satisfies LoadedNativeLibrary;
597
692
  } catch (error) {
598
693
  log.warn("Failed to load native library via FFI.", error);
@@ -626,35 +721,35 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
626
721
  case "will-navigate":
627
722
  buniteEventEmitter.emitEvent(
628
723
  buniteEventEmitter.events.webview.willNavigate({ detail: payload }),
629
- viewId
724
+ viewId,
630
725
  );
631
726
  break;
632
727
  case "did-navigate":
633
728
  buniteEventEmitter.emitEvent(
634
729
  buniteEventEmitter.events.webview.didNavigate({ detail: payload }),
635
- viewId
730
+ viewId,
636
731
  );
637
732
  break;
638
733
  case "dom-ready":
639
734
  buniteEventEmitter.emitEvent(
640
735
  buniteEventEmitter.events.webview.domReady({ detail: payload }),
641
- viewId
736
+ viewId,
642
737
  );
643
738
  break;
644
739
  case "new-window-open":
645
740
  buniteEventEmitter.emitEvent(
646
741
  buniteEventEmitter.events.webview.newWindowOpen({
647
- detail: maybeParsePayload(payload) as string | { url: string }
742
+ detail: maybeParsePayload(payload) as string | { url: string },
648
743
  }),
649
- viewId
744
+ viewId,
650
745
  );
651
746
  break;
652
747
  case "permission-requested":
653
748
  buniteEventEmitter.emitEvent(
654
749
  buniteEventEmitter.events.webview.permissionRequested(
655
- maybeParsePayload(payload) as { requestId: number; kind: number; url?: string }
750
+ maybeParsePayload(payload) as { requestId: number; kind: number; url?: string },
656
751
  ),
657
- viewId
752
+ viewId,
658
753
  );
659
754
  break;
660
755
  case "route-request": {
@@ -672,8 +767,11 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
672
767
  }
673
768
  case "evaluate-result": {
674
769
  const parsed = maybeParsePayload(payload) as {
675
- requestId: number; ok: boolean;
676
- value?: string; code?: string; message?: string;
770
+ requestId: number;
771
+ ok: boolean;
772
+ value?: string;
773
+ code?: string;
774
+ message?: string;
677
775
  };
678
776
  evaluateResultHandler?.(viewId, parsed);
679
777
  break;
@@ -703,7 +801,7 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
703
801
  downloadEventHandler?.(viewId, parsed);
704
802
  buniteEventEmitter.emitEvent(
705
803
  buniteEventEmitter.events.webview.downloadEvent(parsed),
706
- viewId
804
+ viewId,
707
805
  );
708
806
  break;
709
807
  }
@@ -715,7 +813,7 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
715
813
  };
716
814
  buniteEventEmitter.emitEvent(
717
815
  buniteEventEmitter.events.webview.popupRequested(parsed),
718
- viewId
816
+ viewId,
719
817
  );
720
818
  break;
721
819
  }
@@ -723,29 +821,30 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
723
821
  const parsed = maybeParsePayload(payload) as { title: string };
724
822
  buniteEventEmitter.emitEvent(
725
823
  buniteEventEmitter.events.webview.titleChanged({ detail: parsed.title }),
726
- viewId
824
+ viewId,
727
825
  );
728
826
  break;
729
827
  }
730
828
  case "load-start":
731
829
  buniteEventEmitter.emitEvent(
732
830
  buniteEventEmitter.events.webview.loadStart({ detail: payload }),
733
- viewId
831
+ viewId,
734
832
  );
735
833
  break;
736
834
  case "load-finish":
737
835
  buniteEventEmitter.emitEvent(
738
836
  buniteEventEmitter.events.webview.loadFinish({ detail: payload }),
739
- viewId
837
+ viewId,
740
838
  );
741
839
  break;
742
840
  case "load-fail": {
743
841
  const parsed = maybeParsePayload(payload) as { url?: string; reason?: string };
744
842
  buniteEventEmitter.emitEvent(
745
843
  buniteEventEmitter.events.webview.loadFail({
746
- url: parsed.url ?? "", reason: parsed.reason,
844
+ url: parsed.url ?? "",
845
+ reason: parsed.reason,
747
846
  }),
748
- viewId
847
+ viewId,
749
848
  );
750
849
  break;
751
850
  }
@@ -756,10 +855,7 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
756
855
  message: string;
757
856
  defaultPrompt?: string;
758
857
  };
759
- buniteEventEmitter.emitEvent(
760
- buniteEventEmitter.events.webview.dialog(parsed),
761
- viewId
762
- );
858
+ buniteEventEmitter.emitEvent(buniteEventEmitter.events.webview.dialog(parsed), viewId);
763
859
  break;
764
860
  }
765
861
  case "console-message": {
@@ -770,7 +866,7 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
770
866
  };
771
867
  buniteEventEmitter.emitEvent(
772
868
  buniteEventEmitter.events.webview.consoleMessage(parsed),
773
- viewId
869
+ viewId,
774
870
  );
775
871
  break;
776
872
  }
@@ -779,8 +875,8 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
779
875
  {
780
876
  args: [FFIType.u32, FFIType.cstring, FFIType.cstring],
781
877
  returns: FFIType.void,
782
- threadsafe: true
783
- }
878
+ threadsafe: true,
879
+ },
784
880
  );
785
881
  }
786
882
 
@@ -795,9 +891,7 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
795
891
 
796
892
  switch (eventName) {
797
893
  case "all-windows-closed":
798
- buniteEventEmitter.emitEvent(
799
- buniteEventEmitter.events.app.allWindowsClosed()
800
- );
894
+ buniteEventEmitter.emitEvent(buniteEventEmitter.events.app.allWindowsClosed());
801
895
  break;
802
896
  case "close-requested": {
803
897
  const crEvent = buniteEventEmitter.events.window.closeRequested({ id: windowId });
@@ -814,24 +908,29 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
814
908
  case "close":
815
909
  buniteEventEmitter.emitEvent(
816
910
  buniteEventEmitter.events.window.close({ id: windowId }),
817
- windowId
911
+ windowId,
818
912
  );
819
913
  break;
820
914
  case "focus":
821
915
  buniteEventEmitter.emitEvent(
822
916
  buniteEventEmitter.events.window.focus({ id: windowId }),
823
- windowId
917
+ windowId,
824
918
  );
825
919
  break;
826
920
  case "blur":
827
921
  buniteEventEmitter.emitEvent(
828
922
  buniteEventEmitter.events.window.blur({ id: windowId }),
829
- windowId
923
+ windowId,
830
924
  );
831
925
  break;
832
926
  case "move":
833
927
  if (parsedPayload && typeof parsedPayload === "object") {
834
- const { x = 0, y = 0, maximized = false, minimized = false } = parsedPayload as {
928
+ const {
929
+ x = 0,
930
+ y = 0,
931
+ maximized = false,
932
+ minimized = false,
933
+ } = parsedPayload as {
835
934
  x?: number;
836
935
  y?: number;
837
936
  maximized?: boolean;
@@ -839,13 +938,20 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
839
938
  };
840
939
  buniteEventEmitter.emitEvent(
841
940
  buniteEventEmitter.events.window.move({ id: windowId, x, y, maximized, minimized }),
842
- windowId
941
+ windowId,
843
942
  );
844
943
  }
845
944
  break;
846
945
  case "resize":
847
946
  if (parsedPayload && typeof parsedPayload === "object") {
848
- const { x = 0, y = 0, width = 0, height = 0, maximized = false, minimized = false } = parsedPayload as {
947
+ const {
948
+ x = 0,
949
+ y = 0,
950
+ width = 0,
951
+ height = 0,
952
+ maximized = false,
953
+ minimized = false,
954
+ } = parsedPayload as {
849
955
  x?: number;
850
956
  y?: number;
851
957
  width?: number;
@@ -861,9 +967,9 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
861
967
  width,
862
968
  height,
863
969
  maximized,
864
- minimized
970
+ minimized,
865
971
  }),
866
- windowId
972
+ windowId,
867
973
  );
868
974
  }
869
975
  break;
@@ -872,8 +978,8 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
872
978
  {
873
979
  args: [FFIType.u32, FFIType.cstring, FFIType.cstring],
874
980
  returns: FFIType.void,
875
- threadsafe: true
876
- }
981
+ threadsafe: true,
982
+ },
877
983
  );
878
984
  }
879
985
 
@@ -882,7 +988,7 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
882
988
  }
883
989
 
884
990
  export async function initNativeRuntime(
885
- options: NativeBootstrapOptions = {}
991
+ options: NativeBootstrapOptions = {},
886
992
  ): Promise<NativeRuntimeState> {
887
993
  if (state) {
888
994
  return state;
@@ -890,7 +996,7 @@ export async function initNativeRuntime(
890
996
 
891
997
  const artifacts = resolveNativeArtifacts(options.engine);
892
998
  const hasNativeArtifacts = Boolean(
893
- artifacts.nativeLibPath && existsSync(artifacts.nativeLibPath)
999
+ artifacts.nativeLibPath && existsSync(artifacts.nativeLibPath),
894
1000
  );
895
1001
 
896
1002
  applyEnvironment(artifacts);
@@ -902,19 +1008,21 @@ export async function initNativeRuntime(
902
1008
  resolvePackageRoot("bunite-cef-win-x64") != null
903
1009
  ) {
904
1010
  log.warn(
905
- "[bunite] Detected bunite-cef-win-x64. Windows default engine is now \"webview2\" — " +
906
- "this app is currently running on WebView2. " +
907
- "To stay on CEF: pass engine: \"cef\" to AppRuntime. " +
908
- "To accept the new default: drop bunite-cef-win-x64 from dependencies."
1011
+ '[bunite] Detected bunite-cef-win-x64. Windows default engine is now "webview2" — ' +
1012
+ "this app is currently running on WebView2. " +
1013
+ 'To stay on CEF: pass engine: "cef" to AppRuntime. ' +
1014
+ "To accept the new default: drop bunite-cef-win-x64 from dependencies.",
909
1015
  );
910
1016
  }
911
1017
 
912
1018
  if (!hasNativeArtifacts) {
913
- const engineSuffix = artifacts.engine === "cef" ? " (engine=cef requires bunite-cef-win-x64)" : "";
1019
+ const engineSuffix =
1020
+ artifacts.engine === "cef" ? " (engine=cef requires bunite-cef-win-x64)" : "";
914
1021
  throw new Error(
915
1022
  "bunite: native runtime not found. Install the platform package " +
916
- `(bunite-native-${process.platform === "win32" ? "win" : process.platform === "darwin" ? "mac" : "linux"}-<arch>)` +
917
- engineSuffix + "."
1023
+ `(bunite-native-${process.platform === "win32" ? "win" : process.platform === "darwin" ? "mac" : "linux"}-<arch>)` +
1024
+ engineSuffix +
1025
+ ".",
918
1026
  );
919
1027
  }
920
1028
 
@@ -928,7 +1036,7 @@ export async function initNativeRuntime(
928
1036
  if (nativeAbi !== EXPECTED_ABI) {
929
1037
  throw new Error(
930
1038
  `bunite native ABI mismatch: JS expects ${EXPECTED_ABI}, native reports ${nativeAbi}. ` +
931
- `Rebuild native binaries with 'bun run build:native:win'.`
1039
+ `Rebuild native binaries with 'bun run build:native:win'.`,
932
1040
  );
933
1041
  }
934
1042
  registerNativeCallbacks(nativeLibrary);
@@ -937,19 +1045,19 @@ export async function initNativeRuntime(
937
1045
  toCString(artifacts.cefDir ?? ""),
938
1046
  options.hideConsole ?? false,
939
1047
  options.popupBlocking ?? false,
940
- toCString(engineConfigJson)
1048
+ toCString(engineConfigJson),
941
1049
  );
942
1050
  if (!initOk) {
943
1051
  throw new Error(
944
1052
  "bunite: native runtime failed to initialize " +
945
- `(engine dir: ${artifacts.cefDir || "<unset>"}). ` +
946
- "Verify CEF binaries are available, or set BUNITE_CEF_DIR."
1053
+ `(engine dir: ${artifacts.cefDir || "<unset>"}). ` +
1054
+ "Verify CEF binaries are available, or set BUNITE_CEF_DIR.",
947
1055
  );
948
1056
  }
949
1057
 
950
1058
  state = {
951
1059
  initialized: true,
952
- artifacts
1060
+ artifacts,
953
1061
  };
954
1062
  return state;
955
1063
  }