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.
Files changed (39) hide show
  1. package/package.json +2 -2
  2. package/src/bun/core/App.ts +155 -15
  3. package/src/bun/core/BrowserView.ts +124 -44
  4. package/src/bun/core/BrowserWindow.ts +94 -47
  5. package/src/bun/core/Socket.ts +2 -1
  6. package/src/bun/core/SurfaceBrowserIPC.ts +65 -0
  7. package/src/bun/core/SurfaceManager.ts +201 -0
  8. package/src/bun/core/SurfaceRegistry.ts +60 -0
  9. package/src/bun/core/Utils.ts +275 -46
  10. package/src/bun/events/appEvents.ts +2 -1
  11. package/src/bun/events/webviewEvents.ts +1 -3
  12. package/src/bun/events/windowEvents.ts +2 -0
  13. package/src/bun/index.ts +4 -3
  14. package/src/bun/preload/inline.ts +19 -25
  15. package/src/bun/proc/native.ts +158 -122
  16. package/src/native/shared/callbacks.h +6 -6
  17. package/src/native/shared/ffi_exports.h +123 -119
  18. package/src/native/shared/log.h +24 -0
  19. package/src/native/shared/webview_storage.h +5 -5
  20. package/src/native/win/native_host_appres.cpp +258 -0
  21. package/src/native/win/native_host_cef.cpp +834 -0
  22. package/src/native/win/native_host_ffi.cpp +935 -0
  23. package/src/native/win/native_host_internal.h +285 -0
  24. package/src/native/win/native_host_runtime.cpp +286 -0
  25. package/src/native/win/native_host_utils.cpp +314 -0
  26. package/src/native/win/process_helper_win.cpp +126 -26
  27. package/src/preload/runtime.built.js +1 -1
  28. package/src/preload/runtime.ts +65 -42
  29. package/src/preload/tsconfig.json +2 -1
  30. package/src/preload/tsconfig.tsbuildinfo +1 -0
  31. package/src/preload/webviewElement.ts +307 -0
  32. package/src/shared/cefVersion.ts +2 -0
  33. package/src/shared/log.ts +40 -0
  34. package/src/shared/paths.ts +122 -52
  35. package/src/shared/rpc.ts +7 -1
  36. package/src/view/index.ts +8 -5
  37. package/src/native/shared/cef_response_filter.h +0 -116
  38. package/src/native/win/native_host.cpp +0 -2453
  39. package/src/types/config.ts +0 -29
@@ -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
- ) => Pointer;
47
- bunite_window_show: (windowPtr: Pointer) => void;
48
- bunite_window_close: (windowPtr: Pointer) => void;
49
- bunite_window_set_title: (windowPtr: Pointer, title: CStringPointer) => void;
50
- bunite_window_minimize: (windowPtr: Pointer) => void;
51
- bunite_window_unminimize: (windowPtr: Pointer) => void;
52
- bunite_window_is_minimized: (windowPtr: Pointer) => boolean;
53
- bunite_window_maximize: (windowPtr: Pointer) => void;
54
- bunite_window_unmaximize: (windowPtr: Pointer) => void;
55
- bunite_window_is_maximized: (windowPtr: Pointer) => boolean;
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
- windowPtr: Pointer,
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
- windowPtr: Pointer | null,
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
- ) => Pointer;
78
- bunite_register_view_route: (path: CStringPointer) => void;
79
- bunite_unregister_view_route: (path: CStringPointer) => void;
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: (viewPtr: Pointer, visible: boolean) => void;
82
- bunite_view_set_bounds: (viewPtr: Pointer, x: number, y: number, width: number, height: number) => void;
83
- bunite_view_set_anchor: (viewPtr: Pointer, mode: number, inset: number) => void;
84
- bunite_view_go_back: (viewPtr: Pointer) => void;
85
- bunite_view_reload: (viewPtr: Pointer) => void;
86
- bunite_view_load_url: (viewPtr: Pointer, url: CStringPointer) => void;
87
- bunite_view_load_html: (viewPtr: Pointer, html: CStringPointer) => void;
88
- bunite_view_remove: (viewPtr: Pointer) => void;
89
- bunite_view_open_devtools: (viewPtr: Pointer) => void;
90
- bunite_view_close_devtools: (viewPtr: Pointer) => void;
91
- bunite_view_toggle_devtools: (viewPtr: Pointer) => void;
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.ptr
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.ptr],
175
+ args: [FFIType.u32],
158
176
  returns: FFIType.void
159
177
  },
160
178
  bunite_window_close: {
161
- args: [FFIType.ptr],
179
+ args: [FFIType.u32],
162
180
  returns: FFIType.void
163
181
  },
164
182
  bunite_window_set_title: {
165
- args: [FFIType.ptr, FFIType.cstring],
183
+ args: [FFIType.u32, FFIType.cstring],
166
184
  returns: FFIType.void
167
185
  },
168
186
  bunite_window_minimize: {
169
- args: [FFIType.ptr],
187
+ args: [FFIType.u32],
170
188
  returns: FFIType.void
171
189
  },
172
190
  bunite_window_unminimize: {
173
- args: [FFIType.ptr],
191
+ args: [FFIType.u32],
174
192
  returns: FFIType.void
175
193
  },
176
194
  bunite_window_is_minimized: {
177
- args: [FFIType.ptr],
195
+ args: [FFIType.u32],
178
196
  returns: FFIType.bool
179
197
  },
180
198
  bunite_window_maximize: {
181
- args: [FFIType.ptr],
199
+ args: [FFIType.u32],
182
200
  returns: FFIType.void
183
201
  },
184
202
  bunite_window_unmaximize: {
185
- args: [FFIType.ptr],
203
+ args: [FFIType.u32],
186
204
  returns: FFIType.void
187
205
  },
188
206
  bunite_window_is_maximized: {
189
- args: [FFIType.ptr],
207
+ args: [FFIType.u32],
190
208
  returns: FFIType.bool
191
209
  },
192
210
  bunite_window_set_frame: {
193
- args: [FFIType.ptr, FFIType.f64, FFIType.f64, FFIType.f64, FFIType.f64],
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.ptr,
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.ptr
231
+ returns: FFIType.bool
213
232
  },
214
- bunite_register_view_route: {
233
+ bunite_register_appres_route: {
215
234
  args: [FFIType.cstring],
216
235
  returns: FFIType.void
217
236
  },
218
- bunite_unregister_view_route: {
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.ptr, FFIType.bool],
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.ptr, FFIType.f64, FFIType.f64, FFIType.f64, FFIType.f64],
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.ptr, FFIType.i32, FFIType.f64],
270
+ args: [FFIType.u32, FFIType.i32, FFIType.f64],
236
271
  returns: FFIType.void
237
272
  },
238
273
  bunite_view_go_back: {
239
- args: [FFIType.ptr],
274
+ args: [FFIType.u32],
240
275
  returns: FFIType.void
241
276
  },
242
277
  bunite_view_reload: {
243
- args: [FFIType.ptr],
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.ptr, FFIType.cstring],
286
+ args: [FFIType.u32, FFIType.cstring],
248
287
  returns: FFIType.void
249
288
  },
250
289
  bunite_view_load_html: {
251
- args: [FFIType.ptr, FFIType.cstring],
290
+ args: [FFIType.u32, FFIType.cstring],
252
291
  returns: FFIType.void
253
292
  },
254
293
  bunite_view_remove: {
255
- args: [FFIType.ptr],
294
+ args: [FFIType.u32],
256
295
  returns: FFIType.void
257
296
  },
258
297
  bunite_view_open_devtools: {
259
- args: [FFIType.ptr],
298
+ args: [FFIType.u32],
260
299
  returns: FFIType.void
261
300
  },
262
301
  bunite_view_close_devtools: {
263
- args: [FFIType.ptr],
302
+ args: [FFIType.u32],
264
303
  returns: FFIType.void
265
304
  },
266
305
  bunite_view_toggle_devtools: {
267
- args: [FFIType.ptr],
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
- console.warn("[bunite] Failed to load native library via FFI.", error);
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
- console.warn(
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);