@zappdev/cli 0.1.0
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 +55 -0
- package/dist/zapp-cli.js +9471 -0
- package/native/src/app/app.zc +490 -0
- package/native/src/event/event.zc +24 -0
- package/native/src/event/events.zc +70 -0
- package/native/src/platform/darwin/backend.zc +923 -0
- package/native/src/platform/darwin/backend_bootstrap.zc +9 -0
- package/native/src/platform/darwin/bootstrap.zc +9 -0
- package/native/src/platform/darwin/engine_jsc.zc +86 -0
- package/native/src/platform/darwin/engine_qjs.zc +92 -0
- package/native/src/platform/darwin/platform.zc +156 -0
- package/native/src/platform/darwin/webview.zc +550 -0
- package/native/src/platform/darwin/webview_bootstrap.zc +9 -0
- package/native/src/platform/darwin/window.zc +1223 -0
- package/native/src/platform/darwin/worker/common.zc +223 -0
- package/native/src/platform/darwin/worker/core/base64_core.zc +29 -0
- package/native/src/platform/darwin/worker/core/crypto_core.zc +19 -0
- package/native/src/platform/darwin/worker/core/encoding_core.zc +32 -0
- package/native/src/platform/darwin/worker/core/fetch_core.zc +145 -0
- package/native/src/platform/darwin/worker/core/url_core.zc +69 -0
- package/native/src/platform/darwin/worker/core/websocket_core.zc +179 -0
- package/native/src/platform/darwin/worker/dispatch.zc +55 -0
- package/native/src/platform/darwin/worker/jsc/base64_jsc.zc +39 -0
- package/native/src/platform/darwin/worker/jsc/crypto_jsc.zc +49 -0
- package/native/src/platform/darwin/worker/jsc/encoding_jsc.zc +86 -0
- package/native/src/platform/darwin/worker/jsc/fetch_jsc.zc +149 -0
- package/native/src/platform/darwin/worker/jsc/url_jsc.zc +54 -0
- package/native/src/platform/darwin/worker/jsc/websocket_jsc.zc +127 -0
- package/native/src/platform/darwin/worker/jsc.zc +670 -0
- package/native/src/platform/darwin/worker/mod.zc +30 -0
- package/native/src/platform/darwin/worker/qjs/fetch_qjs.zc +233 -0
- package/native/src/platform/darwin/worker/qjs/qjs_macros.zc +23 -0
- package/native/src/platform/darwin/worker/qjs/websocket_qjs.zc +223 -0
- package/native/src/platform/darwin/worker/qjs.zc +1053 -0
- package/native/src/platform/darwin/worker/timers.zc +149 -0
- package/native/src/platform/darwin/worker/timers_qjs.zc +209 -0
- package/native/src/platform/platform.zc +64 -0
- package/native/src/platform/shared/log.zc +156 -0
- package/native/src/platform/shared/worker/qjs/base64_qjs.zc +38 -0
- package/native/src/platform/shared/worker/qjs/crypto_qjs.zc +44 -0
- package/native/src/platform/shared/worker/qjs/encoding_qjs.zc +95 -0
- package/native/src/platform/shared/worker/qjs/url_qjs.zc +65 -0
- package/native/src/platform/shared/worker_registry.zc +206 -0
- package/native/src/platform/window.zc +446 -0
- package/native/src/platform/windows/backend.zc +452 -0
- package/native/src/platform/windows/backend_bootstrap.zc +9 -0
- package/native/src/platform/windows/bootstrap.zc +9 -0
- package/native/src/platform/windows/engine_qjs.zc +60 -0
- package/native/src/platform/windows/platform.zc +387 -0
- package/native/src/platform/windows/webview.zc +1175 -0
- package/native/src/platform/windows/webview_bootstrap.zc +9 -0
- package/native/src/platform/windows/window.zc +1271 -0
- package/native/src/platform/windows/worker/common.zc +409 -0
- package/native/src/platform/windows/worker/core/base64_core.zc +52 -0
- package/native/src/platform/windows/worker/core/crypto_core.zc +34 -0
- package/native/src/platform/windows/worker/core/encoding_core.zc +60 -0
- package/native/src/platform/windows/worker/core/fetch_core.zc +274 -0
- package/native/src/platform/windows/worker/core/url_core.zc +216 -0
- package/native/src/platform/windows/worker/core/websocket_core.zc +343 -0
- package/native/src/platform/windows/worker/dispatch.zc +34 -0
- package/native/src/platform/windows/worker/mod.zc +46 -0
- package/native/src/platform/windows/worker/qjs/fetch_qjs.zc +255 -0
- package/native/src/platform/windows/worker/qjs/websocket_qjs.zc +263 -0
- package/native/src/platform/windows/worker/qjs.zc +1049 -0
- package/native/src/platform/windows/worker/timers_qjs.zc +288 -0
- package/native/src/platform/worker.zc +8 -0
- package/native/src/service/service.zc +228 -0
- package/native/vendor/quickjs-ng/.gitattributes +4 -0
- package/native/vendor/quickjs-ng/.github/dependabot.yml +7 -0
- package/native/vendor/quickjs-ng/.github/workflows/ci.yml +812 -0
- package/native/vendor/quickjs-ng/.github/workflows/docs.yml +49 -0
- package/native/vendor/quickjs-ng/.github/workflows/release.yml +162 -0
- package/native/vendor/quickjs-ng/.github/workflows/test-docs.yml +23 -0
- package/native/vendor/quickjs-ng/.github/workflows/tsan.yml +32 -0
- package/native/vendor/quickjs-ng/.github/workflows/valgrind.yml +33 -0
- package/native/vendor/quickjs-ng/.gitmodules +5 -0
- package/native/vendor/quickjs-ng/CMakeLists.txt +553 -0
- package/native/vendor/quickjs-ng/LICENSE +24 -0
- package/native/vendor/quickjs-ng/Makefile +149 -0
- package/native/vendor/quickjs-ng/amalgam.js +53 -0
- package/native/vendor/quickjs-ng/api-test.c +927 -0
- package/native/vendor/quickjs-ng/builtin-array-fromasync.h +119 -0
- package/native/vendor/quickjs-ng/builtin-array-fromasync.js +36 -0
- package/native/vendor/quickjs-ng/builtin-iterator-zip-keyed.h +332 -0
- package/native/vendor/quickjs-ng/builtin-iterator-zip-keyed.js +194 -0
- package/native/vendor/quickjs-ng/builtin-iterator-zip.h +337 -0
- package/native/vendor/quickjs-ng/builtin-iterator-zip.js +210 -0
- package/native/vendor/quickjs-ng/ctest.c +17 -0
- package/native/vendor/quickjs-ng/cutils.h +2013 -0
- package/native/vendor/quickjs-ng/cxxtest.cc +2 -0
- package/native/vendor/quickjs-ng/dtoa.c +1619 -0
- package/native/vendor/quickjs-ng/dtoa.h +87 -0
- package/native/vendor/quickjs-ng/examples/fib.c +67 -0
- package/native/vendor/quickjs-ng/examples/fib_module.js +10 -0
- package/native/vendor/quickjs-ng/examples/hello.js +1 -0
- package/native/vendor/quickjs-ng/examples/hello_module.js +6 -0
- package/native/vendor/quickjs-ng/examples/meson.build +17 -0
- package/native/vendor/quickjs-ng/examples/pi_bigint.js +118 -0
- package/native/vendor/quickjs-ng/examples/point.c +154 -0
- package/native/vendor/quickjs-ng/examples/test_fib.js +8 -0
- package/native/vendor/quickjs-ng/examples/test_point.js +43 -0
- package/native/vendor/quickjs-ng/fuzz.c +51 -0
- package/native/vendor/quickjs-ng/gen/function_source.c +81 -0
- package/native/vendor/quickjs-ng/gen/hello.c +53 -0
- package/native/vendor/quickjs-ng/gen/hello_module.c +106 -0
- package/native/vendor/quickjs-ng/gen/repl.c +3053 -0
- package/native/vendor/quickjs-ng/gen/standalone.c +324 -0
- package/native/vendor/quickjs-ng/gen/test_fib.c +81 -0
- package/native/vendor/quickjs-ng/libregexp-opcode.h +58 -0
- package/native/vendor/quickjs-ng/libregexp.c +2687 -0
- package/native/vendor/quickjs-ng/libregexp.h +98 -0
- package/native/vendor/quickjs-ng/libunicode-table.h +4707 -0
- package/native/vendor/quickjs-ng/libunicode.c +1746 -0
- package/native/vendor/quickjs-ng/libunicode.h +126 -0
- package/native/vendor/quickjs-ng/list.h +107 -0
- package/native/vendor/quickjs-ng/lre-test.c +73 -0
- package/native/vendor/quickjs-ng/meson.build +684 -0
- package/native/vendor/quickjs-ng/meson_options.txt +6 -0
- package/native/vendor/quickjs-ng/qjs-wasi-reactor.c +208 -0
- package/native/vendor/quickjs-ng/qjs.c +748 -0
- package/native/vendor/quickjs-ng/qjsc.c +673 -0
- package/native/vendor/quickjs-ng/quickjs-atom.h +267 -0
- package/native/vendor/quickjs-ng/quickjs-c-atomics.h +54 -0
- package/native/vendor/quickjs-ng/quickjs-libc.c +4986 -0
- package/native/vendor/quickjs-ng/quickjs-libc.h +79 -0
- package/native/vendor/quickjs-ng/quickjs-opcode.h +369 -0
- package/native/vendor/quickjs-ng/quickjs.c +60259 -0
- package/native/vendor/quickjs-ng/quickjs.h +1419 -0
- package/native/vendor/quickjs-ng/repl.js +1927 -0
- package/native/vendor/quickjs-ng/run-test262.c +2417 -0
- package/native/vendor/quickjs-ng/standalone.js +129 -0
- package/native/vendor/quickjs-ng/tests/assert.js +49 -0
- package/native/vendor/quickjs-ng/tests/bug1221.js +16 -0
- package/native/vendor/quickjs-ng/tests/bug1296.js +12 -0
- package/native/vendor/quickjs-ng/tests/bug1297.js +22 -0
- package/native/vendor/quickjs-ng/tests/bug1301.js +21 -0
- package/native/vendor/quickjs-ng/tests/bug1302.js +24 -0
- package/native/vendor/quickjs-ng/tests/bug1305.js +26 -0
- package/native/vendor/quickjs-ng/tests/bug1318.js +54 -0
- package/native/vendor/quickjs-ng/tests/bug1352.js +8 -0
- package/native/vendor/quickjs-ng/tests/bug1354.js +6 -0
- package/native/vendor/quickjs-ng/tests/bug1355.js +58 -0
- package/native/vendor/quickjs-ng/tests/bug1368.js +9 -0
- package/native/vendor/quickjs-ng/tests/bug39/1.js +6 -0
- package/native/vendor/quickjs-ng/tests/bug39/2.js +6 -0
- package/native/vendor/quickjs-ng/tests/bug39/3.js +7 -0
- package/native/vendor/quickjs-ng/tests/bug488-upstream.js +7 -0
- package/native/vendor/quickjs-ng/tests/bug633/0.js +7 -0
- package/native/vendor/quickjs-ng/tests/bug633/1.js +4 -0
- package/native/vendor/quickjs-ng/tests/bug633/2.js +4 -0
- package/native/vendor/quickjs-ng/tests/bug633/3.js +4 -0
- package/native/vendor/quickjs-ng/tests/bug645/0.js +4 -0
- package/native/vendor/quickjs-ng/tests/bug645/1.js +9 -0
- package/native/vendor/quickjs-ng/tests/bug645/2.js +7 -0
- package/native/vendor/quickjs-ng/tests/bug648.js +13 -0
- package/native/vendor/quickjs-ng/tests/bug652.js +4 -0
- package/native/vendor/quickjs-ng/tests/bug741.js +19 -0
- package/native/vendor/quickjs-ng/tests/bug775.js +7 -0
- package/native/vendor/quickjs-ng/tests/bug776.js +7 -0
- package/native/vendor/quickjs-ng/tests/bug832.js +2 -0
- package/native/vendor/quickjs-ng/tests/bug858.js +26 -0
- package/native/vendor/quickjs-ng/tests/bug904.js +6 -0
- package/native/vendor/quickjs-ng/tests/bug988.js +7 -0
- package/native/vendor/quickjs-ng/tests/bug999.js +3 -0
- package/native/vendor/quickjs-ng/tests/destructured-export.js +8 -0
- package/native/vendor/quickjs-ng/tests/detect_module/0.js +1 -0
- package/native/vendor/quickjs-ng/tests/detect_module/1.js +2 -0
- package/native/vendor/quickjs-ng/tests/detect_module/2.js +1 -0
- package/native/vendor/quickjs-ng/tests/detect_module/3.js +8 -0
- package/native/vendor/quickjs-ng/tests/detect_module/4.js +3 -0
- package/native/vendor/quickjs-ng/tests/empty.js +0 -0
- package/native/vendor/quickjs-ng/tests/fixture_cyclic_import.js +2 -0
- package/native/vendor/quickjs-ng/tests/fixture_string_exports.js +12 -0
- package/native/vendor/quickjs-ng/tests/function_source.js +14 -0
- package/native/vendor/quickjs-ng/tests/microbench.js +1267 -0
- package/native/vendor/quickjs-ng/tests/null_or_undefined.js +38 -0
- package/native/vendor/quickjs-ng/tests/str-pad-leak.js +5 -0
- package/native/vendor/quickjs-ng/tests/test_bigint.js +107 -0
- package/native/vendor/quickjs-ng/tests/test_bjson.js +366 -0
- package/native/vendor/quickjs-ng/tests/test_builtin.js +1314 -0
- package/native/vendor/quickjs-ng/tests/test_closure.js +220 -0
- package/native/vendor/quickjs-ng/tests/test_cyclic_import.js +12 -0
- package/native/vendor/quickjs-ng/tests/test_domexception.js +35 -0
- package/native/vendor/quickjs-ng/tests/test_language.js +755 -0
- package/native/vendor/quickjs-ng/tests/test_loop.js +367 -0
- package/native/vendor/quickjs-ng/tests/test_queue_microtask.js +39 -0
- package/native/vendor/quickjs-ng/tests/test_std.js +340 -0
- package/native/vendor/quickjs-ng/tests/test_string_exports.js +25 -0
- package/native/vendor/quickjs-ng/tests/test_worker.js +43 -0
- package/native/vendor/quickjs-ng/tests/test_worker_module.js +30 -0
- package/native/vendor/quickjs-ng/tests.conf +14 -0
- package/native/vendor/quickjs-ng/unicode_download.sh +19 -0
- package/native/vendor/quickjs-ng/unicode_gen.c +3108 -0
- package/native/vendor/quickjs-ng/unicode_gen_def.h +310 -0
- package/native/vendor/quickjs-ng/update-version.sh +32 -0
- package/native/vendor/webview2/include/WebView2.h +60636 -0
- package/native/vendor/webview2/include/WebView2EnvironmentOptions.h +406 -0
- package/package.json +33 -0
- package/src/backend.ts +139 -0
- package/src/build-config.ts +87 -0
- package/src/build.ts +276 -0
- package/src/common.ts +195 -0
- package/src/config.ts +89 -0
- package/src/dev.ts +164 -0
- package/src/generate.ts +200 -0
- package/src/icons.ts +116 -0
- package/src/init.ts +190 -0
- package/src/package.ts +150 -0
- package/src/zapp-cli.ts +263 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import "../platform.zc";
|
|
2
|
+
|
|
3
|
+
@cfg(ZAPP_WORKER_ENGINE_QJS)
|
|
4
|
+
import "./backend_bootstrap.zc";
|
|
5
|
+
@cfg(ZAPP_WORKER_ENGINE_QJS)
|
|
6
|
+
import "./engine_qjs.zc";
|
|
7
|
+
|
|
8
|
+
raw {
|
|
9
|
+
#ifdef _WIN32
|
|
10
|
+
#ifdef ZAPP_WORKER_ENGINE_QJS
|
|
11
|
+
#include <windows.h>
|
|
12
|
+
#include <stdio.h>
|
|
13
|
+
#include <stdlib.h>
|
|
14
|
+
#include <string.h>
|
|
15
|
+
#include "quickjs.h"
|
|
16
|
+
#include "quickjs-libc.h"
|
|
17
|
+
|
|
18
|
+
extern void* engine_qjs_create_ctx(void* rt);
|
|
19
|
+
extern int engine_qjs_eval(void* ctx, const char* utf8, size_t len, const char* filename);
|
|
20
|
+
extern const char* engine_qjs_get_exception_message(void* ctx);
|
|
21
|
+
extern void engine_qjs_free_ctx(void* ctx);
|
|
22
|
+
|
|
23
|
+
extern void zapp_handle_message(void* app, char* msg);
|
|
24
|
+
extern void* app_get_active(void);
|
|
25
|
+
extern void zapp_post_to_ui_thread(const char* wire);
|
|
26
|
+
extern char* zapp_json_get_string(const char* json, const char* key);
|
|
27
|
+
extern const char* zapp_windows_backend_bootstrap_script(void);
|
|
28
|
+
|
|
29
|
+
extern void zapp_windows_qjs_dispatch(void (*func)(void*), void* data);
|
|
30
|
+
extern void zapp_windows_qjs_drain_jobs(void* ctx, const char* label);
|
|
31
|
+
extern void zapp_windows_qjs_timers_install(JSContext* ctx, JSValue bridge, const char* worker_id);
|
|
32
|
+
extern void zapp_windows_qjs_timers_cancel(const char* workerId);
|
|
33
|
+
extern void zapp_qjs_crypto_install(JSContext* ctx, JSValue bridge);
|
|
34
|
+
extern void zapp_qjs_encoding_install(JSContext* ctx, JSValue bridge);
|
|
35
|
+
extern void zapp_qjs_url_install(JSContext* ctx, JSValue bridge);
|
|
36
|
+
extern void zapp_qjs_base64_install(JSContext* ctx, JSValue bridge);
|
|
37
|
+
extern void zapp_windows_qjs_fetch_install(JSContext* ctx, JSValue bridge, const char* worker_id);
|
|
38
|
+
extern void zapp_windows_qjs_websocket_install(JSContext* ctx, JSValue bridge, const char* worker_id);
|
|
39
|
+
|
|
40
|
+
extern void zapp_windows_qjs_ensure_init(void);
|
|
41
|
+
extern JSRuntime* qjs_rt;
|
|
42
|
+
|
|
43
|
+
extern void zapp_log_backend(int level, const char* message);
|
|
44
|
+
#ifndef ZAPP_LOG_ERROR
|
|
45
|
+
#define ZAPP_LOG_ERROR 0
|
|
46
|
+
#define ZAPP_LOG_WARN 1
|
|
47
|
+
#define ZAPP_LOG_INFO 2
|
|
48
|
+
#define ZAPP_LOG_DEBUG 3
|
|
49
|
+
#define ZAPP_LOG_TRACE 4
|
|
50
|
+
#endif
|
|
51
|
+
|
|
52
|
+
static JSContext* zapp_be_ctx = NULL;
|
|
53
|
+
static const char* zapp_be_id = "__zapp_backend__";
|
|
54
|
+
|
|
55
|
+
static void zapp_be_call_bridge(const char* methodName, int argc, JSValue* argv) {
|
|
56
|
+
if (zapp_be_ctx == NULL || methodName == NULL) return;
|
|
57
|
+
|
|
58
|
+
JSValue global = JS_GetGlobalObject(zapp_be_ctx);
|
|
59
|
+
JSValue symbol = JS_GetPropertyStr(zapp_be_ctx, global, "Symbol");
|
|
60
|
+
JSValue symbolFor = JS_GetPropertyStr(zapp_be_ctx, symbol, "for");
|
|
61
|
+
JSValue arg = JS_NewString(zapp_be_ctx, "zapp.bridge");
|
|
62
|
+
JSValue bridgeSym = JS_Call(zapp_be_ctx, symbolFor, symbol, 1, &arg);
|
|
63
|
+
JSAtom bridgeAtom = JS_ValueToAtom(zapp_be_ctx, bridgeSym);
|
|
64
|
+
JSValue bridge = JS_GetProperty(zapp_be_ctx, global, bridgeAtom);
|
|
65
|
+
|
|
66
|
+
if (JS_IsObject(bridge)) {
|
|
67
|
+
JSValue fn = JS_GetPropertyStr(zapp_be_ctx, bridge, methodName);
|
|
68
|
+
if (JS_IsFunction(zapp_be_ctx, fn)) {
|
|
69
|
+
JSValue ret = JS_Call(zapp_be_ctx, fn, bridge, argc, argv);
|
|
70
|
+
if (JS_IsException(ret)) {
|
|
71
|
+
JSValue exc = JS_GetException(zapp_be_ctx);
|
|
72
|
+
const char* str = JS_ToCString(zapp_be_ctx, exc);
|
|
73
|
+
char err_buf[512];
|
|
74
|
+
snprintf(err_buf, sizeof(err_buf), "bridge.%s threw: %s", methodName, str ? str : "unknown");
|
|
75
|
+
zapp_log_backend(ZAPP_LOG_ERROR, err_buf);
|
|
76
|
+
if (str) JS_FreeCString(zapp_be_ctx, str);
|
|
77
|
+
JS_FreeValue(zapp_be_ctx, exc);
|
|
78
|
+
}
|
|
79
|
+
JS_FreeValue(zapp_be_ctx, ret);
|
|
80
|
+
zapp_windows_qjs_drain_jobs(zapp_be_ctx, methodName);
|
|
81
|
+
}
|
|
82
|
+
JS_FreeValue(zapp_be_ctx, fn);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
JS_FreeAtom(zapp_be_ctx, bridgeAtom);
|
|
86
|
+
JS_FreeValue(zapp_be_ctx, bridge);
|
|
87
|
+
JS_FreeValue(zapp_be_ctx, bridgeSym);
|
|
88
|
+
JS_FreeValue(zapp_be_ctx, arg);
|
|
89
|
+
JS_FreeValue(zapp_be_ctx, symbolFor);
|
|
90
|
+
JS_FreeValue(zapp_be_ctx, symbol);
|
|
91
|
+
JS_FreeValue(zapp_be_ctx, global);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
static JSValue qjs_be_console_log(JSContext* ctx, JSValue this_val, int argc, JSValue* argv, int magic, JSValue* func_data) {
|
|
95
|
+
(void)this_val; (void)func_data;
|
|
96
|
+
char buf[4096];
|
|
97
|
+
size_t offset = 0;
|
|
98
|
+
for (int i = 0; i < argc && offset < sizeof(buf) - 1; i++) {
|
|
99
|
+
const char* str = JS_ToCString(ctx, argv[i]);
|
|
100
|
+
if (str) {
|
|
101
|
+
int n = snprintf(buf + offset, sizeof(buf) - offset, "%s%s", i > 0 ? " " : "", str);
|
|
102
|
+
if (n > 0) offset += (size_t)n;
|
|
103
|
+
JS_FreeCString(ctx, str);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
buf[offset] = '\0';
|
|
107
|
+
int level = (magic >= ZAPP_LOG_ERROR && magic <= ZAPP_LOG_TRACE) ? magic : ZAPP_LOG_INFO;
|
|
108
|
+
zapp_log_backend(level, buf);
|
|
109
|
+
return JS_UNDEFINED;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static JSValue qjs_be_emitToHost(JSContext* ctx, JSValue this_val, int argc, JSValue* argv) {
|
|
113
|
+
(void)this_val;
|
|
114
|
+
if (argc < 2) return JS_UNDEFINED;
|
|
115
|
+
|
|
116
|
+
const char* name = JS_ToCString(ctx, argv[0]);
|
|
117
|
+
if (!name) return JS_UNDEFINED;
|
|
118
|
+
|
|
119
|
+
const char* payloadStr = JS_ToCString(ctx, argv[1]);
|
|
120
|
+
const char* payload = payloadStr ? payloadStr : "{}";
|
|
121
|
+
|
|
122
|
+
// Internal events: build wire string, post to UI thread
|
|
123
|
+
if (strcmp(name, "__zapp_window_create") == 0 ||
|
|
124
|
+
strcmp(name, "__zapp_window_action") == 0 ||
|
|
125
|
+
strcmp(name, "__zapp_app_action") == 0 ||
|
|
126
|
+
strcmp(name, "__zapp_app_configure") == 0) {
|
|
127
|
+
|
|
128
|
+
char wire[4096];
|
|
129
|
+
if (strcmp(name, "__zapp_window_create") == 0) {
|
|
130
|
+
snprintf(wire, sizeof(wire), "window\ncreate\n%s", payload);
|
|
131
|
+
} else if (strcmp(name, "__zapp_window_action") == 0) {
|
|
132
|
+
char* action = zapp_json_get_string(payload, "action");
|
|
133
|
+
if (action) {
|
|
134
|
+
snprintf(wire, sizeof(wire), "window\n%s\n%s", action, payload);
|
|
135
|
+
free(action);
|
|
136
|
+
} else { wire[0] = '\0'; }
|
|
137
|
+
} else if (strcmp(name, "__zapp_app_action") == 0) {
|
|
138
|
+
char* action = zapp_json_get_string(payload, "action");
|
|
139
|
+
if (action) {
|
|
140
|
+
snprintf(wire, sizeof(wire), "app\n%s\n{}", action);
|
|
141
|
+
free(action);
|
|
142
|
+
} else { wire[0] = '\0'; }
|
|
143
|
+
} else {
|
|
144
|
+
snprintf(wire, sizeof(wire), "app\nconfigure\n%s", payload);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (wire[0]) zapp_post_to_ui_thread(wire);
|
|
148
|
+
|
|
149
|
+
JS_FreeCString(ctx, name);
|
|
150
|
+
if (payloadStr) JS_FreeCString(ctx, payloadStr);
|
|
151
|
+
return JS_UNDEFINED;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Regular event emission
|
|
155
|
+
void* app = app_get_active();
|
|
156
|
+
if (app) {
|
|
157
|
+
size_t len = strlen("emit\n") + strlen(name) + 1 + strlen(payload) + 1;
|
|
158
|
+
char* wire = (char*)malloc(len);
|
|
159
|
+
snprintf(wire, len, "emit\n%s\n%s", name, payload);
|
|
160
|
+
zapp_handle_message(app, wire);
|
|
161
|
+
free(wire);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
JS_FreeCString(ctx, name);
|
|
165
|
+
if (payloadStr) JS_FreeCString(ctx, payloadStr);
|
|
166
|
+
return JS_UNDEFINED;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
static JSValue qjs_be_invokeToHost(JSContext* ctx, JSValue this_val, int argc, JSValue* argv) {
|
|
170
|
+
(void)this_val;
|
|
171
|
+
if (argc < 2) return JS_UNDEFINED;
|
|
172
|
+
const char* name = JS_ToCString(ctx, argv[0]);
|
|
173
|
+
if (!name) return JS_UNDEFINED;
|
|
174
|
+
|
|
175
|
+
JSValue global = JS_GetGlobalObject(ctx);
|
|
176
|
+
JSValue JSON = JS_GetPropertyStr(ctx, global, "JSON");
|
|
177
|
+
JSValue stringify = JS_GetPropertyStr(ctx, JSON, "stringify");
|
|
178
|
+
JSValue jsonVal = JS_Call(ctx, stringify, JSON, 1, &argv[1]);
|
|
179
|
+
const char* payload = JS_ToCString(ctx, jsonVal);
|
|
180
|
+
const char* p = payload ? payload : "{}";
|
|
181
|
+
|
|
182
|
+
void* app = app_get_active();
|
|
183
|
+
if (app) {
|
|
184
|
+
size_t len = strlen("invoke\n") + strlen(name) + 1 + strlen(p) + 1;
|
|
185
|
+
char* wire = (char*)malloc(len);
|
|
186
|
+
snprintf(wire, len, "invoke\n%s\n%s", name, p);
|
|
187
|
+
zapp_handle_message(app, wire);
|
|
188
|
+
free(wire);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (payload) JS_FreeCString(ctx, payload);
|
|
192
|
+
JS_FreeValue(ctx, jsonVal);
|
|
193
|
+
JS_FreeValue(ctx, stringify);
|
|
194
|
+
JS_FreeValue(ctx, JSON);
|
|
195
|
+
JS_FreeValue(ctx, global);
|
|
196
|
+
JS_FreeCString(ctx, name);
|
|
197
|
+
return JS_UNDEFINED;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
static JSValue qjs_be_reportError(JSContext* ctx, JSValue this_val, int argc, JSValue* argv) {
|
|
201
|
+
(void)this_val;
|
|
202
|
+
if (argc < 1) return JS_UNDEFINED;
|
|
203
|
+
const char* msg = JS_ToCString(ctx, argv[0]);
|
|
204
|
+
zapp_log_backend(ZAPP_LOG_ERROR, msg ? msg : "unknown");
|
|
205
|
+
if (msg) JS_FreeCString(ctx, msg);
|
|
206
|
+
return JS_UNDEFINED;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
static JSValue qjs_be_bridge_consoleLog(JSContext* ctx, JSValue this_val, int argc, JSValue* argv) {
|
|
210
|
+
(void)this_val;
|
|
211
|
+
const char* level_str = (argc >= 1) ? JS_ToCString(ctx, argv[0]) : NULL;
|
|
212
|
+
const char* msg = (argc >= 2) ? JS_ToCString(ctx, argv[1]) : NULL;
|
|
213
|
+
|
|
214
|
+
int level_int = ZAPP_LOG_INFO;
|
|
215
|
+
if (level_str) {
|
|
216
|
+
if (strcmp(level_str, "error") == 0) level_int = ZAPP_LOG_ERROR;
|
|
217
|
+
else if (strcmp(level_str, "warn") == 0) level_int = ZAPP_LOG_WARN;
|
|
218
|
+
else if (strcmp(level_str, "debug") == 0) level_int = ZAPP_LOG_DEBUG;
|
|
219
|
+
else if (strcmp(level_str, "trace") == 0) level_int = ZAPP_LOG_TRACE;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
zapp_log_backend(level_int, msg ? msg : "");
|
|
223
|
+
if (level_str) JS_FreeCString(ctx, level_str);
|
|
224
|
+
if (msg) JS_FreeCString(ctx, msg);
|
|
225
|
+
return JS_UNDEFINED;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
static JSValue qjs_be_noop(JSContext* ctx, JSValue this_val, int argc, JSValue* argv) {
|
|
229
|
+
(void)ctx; (void)this_val; (void)argc; (void)argv;
|
|
230
|
+
return JS_UNDEFINED;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Create backend data (dispatched to QJS thread)
|
|
234
|
+
typedef struct {
|
|
235
|
+
void* app_ptr;
|
|
236
|
+
char* script_source;
|
|
237
|
+
int* result;
|
|
238
|
+
HANDLE done_event;
|
|
239
|
+
} ZappBackendCreateData;
|
|
240
|
+
|
|
241
|
+
static void zapp_backend_create_on_thread(void* data) {
|
|
242
|
+
ZappBackendCreateData* d = (ZappBackendCreateData*)data;
|
|
243
|
+
|
|
244
|
+
void* ctx_opaque = engine_qjs_create_ctx(qjs_rt);
|
|
245
|
+
if (!ctx_opaque) {
|
|
246
|
+
zapp_log_backend(ZAPP_LOG_ERROR, "failed to create QJS context");
|
|
247
|
+
*d->result = -1;
|
|
248
|
+
SetEvent(d->done_event);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
JSContext* ctx = (JSContext*)ctx_opaque;
|
|
253
|
+
zapp_be_ctx = ctx;
|
|
254
|
+
|
|
255
|
+
JSValue global = JS_GetGlobalObject(ctx);
|
|
256
|
+
|
|
257
|
+
// console — each method routes through zapp_log_backend with appropriate level
|
|
258
|
+
JSValue consoleObj = JS_NewObject(ctx);
|
|
259
|
+
JS_SetPropertyStr(ctx, consoleObj, "log", JS_NewCFunctionData(ctx, qjs_be_console_log, 1, ZAPP_LOG_INFO, 0, NULL));
|
|
260
|
+
JS_SetPropertyStr(ctx, consoleObj, "info", JS_NewCFunctionData(ctx, qjs_be_console_log, 1, ZAPP_LOG_INFO, 0, NULL));
|
|
261
|
+
JS_SetPropertyStr(ctx, consoleObj, "warn", JS_NewCFunctionData(ctx, qjs_be_console_log, 1, ZAPP_LOG_WARN, 0, NULL));
|
|
262
|
+
JS_SetPropertyStr(ctx, consoleObj, "error", JS_NewCFunctionData(ctx, qjs_be_console_log, 1, ZAPP_LOG_ERROR, 0, NULL));
|
|
263
|
+
JS_SetPropertyStr(ctx, consoleObj, "debug", JS_NewCFunctionData(ctx, qjs_be_console_log, 1, ZAPP_LOG_DEBUG, 0, NULL));
|
|
264
|
+
JS_SetPropertyStr(ctx, consoleObj, "trace", JS_NewCFunctionData(ctx, qjs_be_console_log, 1, ZAPP_LOG_TRACE, 0, NULL));
|
|
265
|
+
JS_SetPropertyStr(ctx, global, "console", consoleObj);
|
|
266
|
+
|
|
267
|
+
// bridge
|
|
268
|
+
JSValue bridge = JS_NewObject(ctx);
|
|
269
|
+
|
|
270
|
+
JS_SetPropertyStr(ctx, bridge, "emitToHost", JS_NewCFunction(ctx, qjs_be_emitToHost, "emitToHost", 2));
|
|
271
|
+
JS_SetPropertyStr(ctx, bridge, "invokeToHost", JS_NewCFunction(ctx, qjs_be_invokeToHost, "invokeToHost", 2));
|
|
272
|
+
JS_SetPropertyStr(ctx, bridge, "reportError", JS_NewCFunction(ctx, qjs_be_reportError, "reportError", 1));
|
|
273
|
+
JS_SetPropertyStr(ctx, bridge, "consoleLog", JS_NewCFunction(ctx, qjs_be_bridge_consoleLog, "consoleLog", 2));
|
|
274
|
+
|
|
275
|
+
JSValue noop = JS_NewCFunction(ctx, qjs_be_noop, "noop", 0);
|
|
276
|
+
JS_SetPropertyStr(ctx, bridge, "postMessage", JS_DupValue(ctx, noop));
|
|
277
|
+
JS_SetPropertyStr(ctx, bridge, "closeWorker", JS_DupValue(ctx, noop));
|
|
278
|
+
JS_SetPropertyStr(ctx, bridge, "syncWait", JS_DupValue(ctx, noop));
|
|
279
|
+
JS_SetPropertyStr(ctx, bridge, "syncNotify", JS_DupValue(ctx, noop));
|
|
280
|
+
JS_SetPropertyStr(ctx, bridge, "syncCancel", noop);
|
|
281
|
+
|
|
282
|
+
zapp_windows_qjs_timers_install(ctx, bridge, zapp_be_id);
|
|
283
|
+
zapp_windows_qjs_fetch_install(ctx, bridge, zapp_be_id);
|
|
284
|
+
zapp_qjs_crypto_install(ctx, bridge);
|
|
285
|
+
zapp_qjs_encoding_install(ctx, bridge);
|
|
286
|
+
zapp_qjs_url_install(ctx, bridge);
|
|
287
|
+
zapp_qjs_base64_install(ctx, bridge);
|
|
288
|
+
zapp_windows_qjs_websocket_install(ctx, bridge, zapp_be_id);
|
|
289
|
+
|
|
290
|
+
JS_SetPropertyStr(ctx, global, "globalThis", JS_DupValue(ctx, global));
|
|
291
|
+
JS_SetPropertyStr(ctx, global, "self", JS_DupValue(ctx, global));
|
|
292
|
+
JS_SetPropertyStr(ctx, global, "__zappWorkerDispatchId", JS_NewString(ctx, zapp_be_id));
|
|
293
|
+
JS_SetPropertyStr(ctx, global, "__zappBridge", bridge);
|
|
294
|
+
|
|
295
|
+
// Inject config
|
|
296
|
+
{
|
|
297
|
+
extern char* app_get_bootstrap_name(void);
|
|
298
|
+
extern bool app_get_bootstrap_application_should_terminate_after_last_window_closed(void);
|
|
299
|
+
extern bool app_get_bootstrap_web_content_inspectable(void);
|
|
300
|
+
extern int app_get_bootstrap_max_workers(void);
|
|
301
|
+
|
|
302
|
+
char configScript[1024];
|
|
303
|
+
const char* appName = app_get_bootstrap_name();
|
|
304
|
+
snprintf(configScript, sizeof(configScript),
|
|
305
|
+
"globalThis.__zappConfig={name:'%s',"
|
|
306
|
+
"applicationShouldTerminateAfterLastWindowClosed:%s,"
|
|
307
|
+
"webContentInspectable:%s,"
|
|
308
|
+
"maxWorkers:%d};",
|
|
309
|
+
appName ? appName : "Zapp",
|
|
310
|
+
app_get_bootstrap_application_should_terminate_after_last_window_closed() ? "true" : "false",
|
|
311
|
+
app_get_bootstrap_web_content_inspectable() ? "true" : "false",
|
|
312
|
+
app_get_bootstrap_max_workers()
|
|
313
|
+
);
|
|
314
|
+
engine_qjs_eval(ctx, configScript, strlen(configScript), "<config>");
|
|
315
|
+
zapp_windows_qjs_drain_jobs(ctx, "config");
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// Bootstrap
|
|
319
|
+
const char* bootstrap = zapp_windows_backend_bootstrap_script();
|
|
320
|
+
int err = engine_qjs_eval(ctx, bootstrap, strlen(bootstrap), "backend-bootstrap.js");
|
|
321
|
+
if (err != 0) {
|
|
322
|
+
const char* msg = engine_qjs_get_exception_message(ctx);
|
|
323
|
+
char boot_err[256];
|
|
324
|
+
snprintf(boot_err, sizeof(boot_err), "bootstrap failed: %s", msg ? msg : "unknown");
|
|
325
|
+
zapp_log_backend(ZAPP_LOG_ERROR, boot_err);
|
|
326
|
+
zapp_windows_qjs_timers_cancel(zapp_be_id);
|
|
327
|
+
engine_qjs_free_ctx(ctx);
|
|
328
|
+
zapp_be_ctx = NULL;
|
|
329
|
+
JS_FreeValue(ctx, global);
|
|
330
|
+
*d->result = -1;
|
|
331
|
+
SetEvent(d->done_event);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
zapp_windows_qjs_drain_jobs(ctx, "bootstrap");
|
|
335
|
+
|
|
336
|
+
// User script
|
|
337
|
+
size_t srcLen = strlen(d->script_source);
|
|
338
|
+
size_t totalLen = srcLen + 256;
|
|
339
|
+
char* wrapped = (char*)malloc(totalLen);
|
|
340
|
+
snprintf(wrapped, totalLen,
|
|
341
|
+
"(async function(){\n%s\n})()"
|
|
342
|
+
".catch(function(e){"
|
|
343
|
+
"var b=globalThis[Symbol.for('zapp.bridge')];"
|
|
344
|
+
"if(b&&b.reportError)b.reportError(String(e));"
|
|
345
|
+
"else console.error('[backend] unhandled:',e);"
|
|
346
|
+
"});", d->script_source);
|
|
347
|
+
err = engine_qjs_eval(ctx, wrapped, strlen(wrapped), "backend.js");
|
|
348
|
+
free(wrapped);
|
|
349
|
+
if (err != 0) {
|
|
350
|
+
const char* msg = engine_qjs_get_exception_message(ctx);
|
|
351
|
+
char script_err[256];
|
|
352
|
+
snprintf(script_err, sizeof(script_err), "script error: %s", msg ? msg : "unknown");
|
|
353
|
+
zapp_log_backend(ZAPP_LOG_ERROR, script_err);
|
|
354
|
+
}
|
|
355
|
+
zapp_windows_qjs_drain_jobs(ctx, "backend-script");
|
|
356
|
+
|
|
357
|
+
JS_FreeValue(ctx, global);
|
|
358
|
+
*d->result = 0;
|
|
359
|
+
SetEvent(d->done_event);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
int32_t zapp_backend_context_create(void* app_ptr, char* script_source) {
|
|
363
|
+
if (app_ptr == NULL || script_source == NULL) return -1;
|
|
364
|
+
|
|
365
|
+
zapp_windows_qjs_ensure_init();
|
|
366
|
+
|
|
367
|
+
int result = -1;
|
|
368
|
+
HANDLE doneEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
|
|
369
|
+
|
|
370
|
+
ZappBackendCreateData* d = (ZappBackendCreateData*)calloc(1, sizeof(ZappBackendCreateData));
|
|
371
|
+
d->app_ptr = app_ptr;
|
|
372
|
+
d->script_source = script_source;
|
|
373
|
+
d->result = &result;
|
|
374
|
+
d->done_event = doneEvent;
|
|
375
|
+
|
|
376
|
+
zapp_windows_qjs_dispatch(zapp_backend_create_on_thread, d);
|
|
377
|
+
WaitForSingleObject(doneEvent, INFINITE);
|
|
378
|
+
CloseHandle(doneEvent);
|
|
379
|
+
free(d);
|
|
380
|
+
|
|
381
|
+
return result;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
void zapp_backend_deliver_event(const char* name, const char* payload) {
|
|
385
|
+
if (zapp_be_ctx == NULL || name == NULL) return;
|
|
386
|
+
JSValue args[2];
|
|
387
|
+
args[0] = JS_NewString(zapp_be_ctx, name);
|
|
388
|
+
args[1] = JS_NewString(zapp_be_ctx, payload ? payload : "{}");
|
|
389
|
+
zapp_be_call_bridge("deliverEvent", 2, args);
|
|
390
|
+
JS_FreeValue(zapp_be_ctx, args[0]);
|
|
391
|
+
JS_FreeValue(zapp_be_ctx, args[1]);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
static void zapp_be_dispatch_window_result_on_thread(void* data) {
|
|
395
|
+
char* payload = (char*)data;
|
|
396
|
+
if (zapp_be_ctx == NULL || payload == NULL) { free(payload); return; }
|
|
397
|
+
JSValue args[1];
|
|
398
|
+
args[0] = JS_NewString(zapp_be_ctx, payload);
|
|
399
|
+
zapp_be_call_bridge("dispatchWindowResult", 1, args);
|
|
400
|
+
JS_FreeValue(zapp_be_ctx, args[0]);
|
|
401
|
+
zapp_windows_qjs_drain_jobs(zapp_be_ctx, "window-result");
|
|
402
|
+
free(payload);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
void zapp_backend_dispatch_window_result(const char* payload_json) {
|
|
406
|
+
if (zapp_be_ctx == NULL || payload_json == NULL) return;
|
|
407
|
+
char* copy = _strdup(payload_json);
|
|
408
|
+
zapp_windows_qjs_dispatch(zapp_be_dispatch_window_result_on_thread, copy);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
static void zapp_be_dispatch_window_ready_on_thread(void* data) {
|
|
412
|
+
char* window_id = (char*)data;
|
|
413
|
+
if (zapp_be_ctx == NULL || window_id == NULL) { free(window_id); return; }
|
|
414
|
+
JSValue args[1];
|
|
415
|
+
args[0] = JS_NewString(zapp_be_ctx, window_id);
|
|
416
|
+
zapp_be_call_bridge("dispatchWindowReady", 1, args);
|
|
417
|
+
JS_FreeValue(zapp_be_ctx, args[0]);
|
|
418
|
+
zapp_windows_qjs_drain_jobs(zapp_be_ctx, "window-ready");
|
|
419
|
+
free(window_id);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
void zapp_backend_dispatch_window_ready(const char* window_id) {
|
|
423
|
+
if (zapp_be_ctx == NULL || window_id == NULL) return;
|
|
424
|
+
char* copy = _strdup(window_id);
|
|
425
|
+
zapp_windows_qjs_dispatch(zapp_be_dispatch_window_ready_on_thread, copy);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
void zapp_backend_context_destroy(void) {
|
|
429
|
+
if (zapp_be_ctx == NULL) return;
|
|
430
|
+
zapp_windows_qjs_timers_cancel(zapp_be_id);
|
|
431
|
+
engine_qjs_free_ctx(zapp_be_ctx);
|
|
432
|
+
zapp_be_ctx = NULL;
|
|
433
|
+
}
|
|
434
|
+
#else /* !ZAPP_WORKER_ENGINE_QJS */
|
|
435
|
+
// No-op stubs when QJS is not enabled
|
|
436
|
+
int32_t zapp_backend_context_create(void* app_ptr, char* script_source) {
|
|
437
|
+
(void)app_ptr; (void)script_source;
|
|
438
|
+
return -1;
|
|
439
|
+
}
|
|
440
|
+
void zapp_backend_deliver_event(const char* name, const char* payload) {
|
|
441
|
+
(void)name; (void)payload;
|
|
442
|
+
}
|
|
443
|
+
void zapp_backend_dispatch_window_result(const char* payload_json) {
|
|
444
|
+
(void)payload_json;
|
|
445
|
+
}
|
|
446
|
+
void zapp_backend_dispatch_window_ready(const char* window_id) {
|
|
447
|
+
(void)window_id;
|
|
448
|
+
}
|
|
449
|
+
void zapp_backend_context_destroy(void) {}
|
|
450
|
+
#endif /* ZAPP_WORKER_ENGINE_QJS */
|
|
451
|
+
#endif /* _WIN32 */
|
|
452
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// AUTO-GENERATED FILE. DO NOT EDIT.
|
|
2
|
+
// Source of truth: `packages/bootstrap/src/backend.ts`
|
|
3
|
+
// Generated: `2026-03-22T07:58:05.471Z`
|
|
4
|
+
|
|
5
|
+
raw {
|
|
6
|
+
const char* zapp_windows_backend_bootstrap_script(void) {
|
|
7
|
+
return "(()=>{var{defineProperty:W,getOwnPropertyNames:q,getOwnPropertyDescriptor:k}=Object,C=Object.prototype.hasOwnProperty;var j=new WeakMap,m=(F)=>{var G=j.get(F),J;if(G)return G;if(G=W({},\"__esModule\",{value:!0}),F&&typeof F===\"object\"||typeof F===\"function\")q(F).map((K)=>!C.call(G,K)&&W(G,K,{get:()=>F[K],enumerable:!(J=k(F,K))||J.enumerable}));return j.set(F,G),G};var l={},Q=globalThis,X=Q.__zappBridge?\?{};try{delete Q.__zappBridge}catch{}var{syncWait:f,syncNotify:v,syncCancel:S}=X,y=(F)=>{if(typeof F===\"string\")return F;try{return String(F)}catch{return\"unknown error\"}},b=(F)=>{try{let G=F instanceof Error?F.message:y(F);X.reportError?.(G)}catch{try{X.reportError?.(\"Backend error\")}catch{}}};try{Object.defineProperty(Q,Symbol.for(\"zapp.context\"),{value:\"backend\",enumerable:!1,configurable:!1,writable:!1})}catch{Q[Symbol.for(\"zapp.context\")]=\"backend\"}var w=Q.__zappConfig,_=w?{...w}:{name:\"Zapp App\",applicationShouldTerminateAfterLastWindowClosed:!1,webContentInspectable:!0};try{delete Q.__zappConfig}catch{}X.getConfig=()=>({..._});X.mergeConfig=(F)=>{if(F&&typeof F===\"object\"){if(typeof F.name===\"string\")_.name=F.name;if(typeof F.applicationShouldTerminateAfterLastWindowClosed===\"boolean\")_.applicationShouldTerminateAfterLastWindowClosed=F.applicationShouldTerminateAfterLastWindowClosed;if(typeof F.webContentInspectable===\"boolean\")_.webContentInspectable=F.webContentInspectable;if(typeof F.maxWorkers===\"number\")_.maxWorkers=F.maxWorkers}};if(typeof Q.Event!==\"function\")Q.Event=function(G,J){if(this.type=String(G?\?\"\"),this.defaultPrevented=!1,J)for(let K of Object.keys(J))this[K]=J[K]};if(typeof Q.MessageEvent!==\"function\"){let F=Q.Event;Q.MessageEvent=function(J,K){F.call(this,J,K),this.data=K?.data,this.ports=K?.ports?\?[]}}if(typeof Q.AbortSignal!==\"function\"){let F=function(){this.aborted=!1,this.reason=void 0,this._listeners=[]};F.prototype.addEventListener=function(G,J){if(G===\"abort\"&&typeof J===\"function\")this._listeners.push(J)},F.prototype.removeEventListener=function(G,J){if(G===\"abort\")this._listeners=this._listeners.filter((K)=>K!==J)},Q.AbortSignal=F}if(typeof Q.AbortController!==\"function\"){let F=Q.AbortSignal;Q.AbortController=function(){this.signal=new F},Q.AbortController.prototype.abort=function(G){let J=this.signal;if(J.aborted)return;J.aborted=!0,J.reason=G;let K=(J._listeners?\?[]).slice();J._listeners=[];for(let O of K)try{O()}catch{}}}if(typeof Q.CustomEvent!==\"function\"){let F=Q.Event;Q.CustomEvent=function(J,K){F.call(this,J,K),this.detail=K?.detail?\?null},Q.CustomEvent.prototype=Object.create(Q.Event.prototype)}if(typeof Q.TextEncoder!==\"function\"){let F=X.textEncode;Q.TextEncoder=function(){},Q.TextEncoder.prototype.encoding=\"utf-8\",Q.TextEncoder.prototype.encode=function(G){if(!G)return new Uint8Array(0);if(F)return F(String(G));let J=String(G),K=[];for(let O=0;O<J.length;O++){let Y=J.charCodeAt(O);if(Y<128)K.push(Y);else if(Y<2048)K.push(192|Y>>6,128|Y&63);else if(Y>=55296&&Y<=56319&&O+1<J.length){let T=J.charCodeAt(++O);Y=65536+(Y-55296<<10)+(T-56320),K.push(240|Y>>18,128|Y>>12&63,128|Y>>6&63,128|Y&63)}else K.push(224|Y>>12,128|Y>>6&63,128|Y&63)}return new Uint8Array(K)},Q.TextEncoder.prototype.encodeInto=function(G,J){let K=Q.TextEncoder.prototype.encode(G),O=Math.min(K.length,J.length);return J.set(K.subarray(0,O)),{read:G.length,written:O}}}if(typeof Q.TextDecoder!==\"function\"){let F=X.textDecode;Q.TextDecoder=function(){},Q.TextDecoder.prototype.encoding=\"utf-8\",Q.TextDecoder.prototype.decode=function(G){if(!G)return\"\";if(F)return F(G);let J=G instanceof Uint8Array?G:new Uint8Array(G),K=[],O=0;while(O<J.length){let Y=J[O];if(Y<128)K.push(String.fromCharCode(Y)),O++;else if((Y&224)===192)K.push(String.fromCharCode((Y&31)<<6|J[O+1]&63)),O+=2;else if((Y&240)===224)K.push(String.fromCharCode((Y&15)<<12|(J[O+1]&63)<<6|J[O+2]&63)),O+=3;else if((Y&248)===240){let $=((Y&7)<<18|(J[O+1]&63)<<12|(J[O+2]&63)<<6|J[O+3]&63)-65536;K.push(String.fromCharCode(55296+($>>10),56320+($&1023))),O+=4}else K.push(\"�\"),O++}return K.join(\"\")}}if(typeof Q.URL!==\"function\"){let G=function(J,K){let O=F?.(String(J),K!=null?String(K):void 0);if(!O)throw TypeError(`Invalid URL: ${J}`);this.href=O.href,this.protocol=O.protocol,this.host=O.host,this.hostname=O.hostname,this.port=O.port,this.pathname=O.pathname,this.search=O.search,this.hash=O.hash,this.origin=O.origin,this.username=O.username,this.password=O.password},F=X.urlParse;G.prototype.toString=function(){return this.href},G.prototype.toJSON=function(){return this.href},Q.URL=G}if(typeof Q.atob!==\"function\"){let F=X.atob;Q.atob=(G)=>{if(F)return F(String(G));throw Error(\"atob not available\")}}if(typeof Q.btoa!==\"function\"){let F=X.btoa;Q.btoa=(G)=>{if(F)return F(String(G));throw Error(\"btoa not available\")}}if(typeof Q.Headers!==\"function\"){let F=function(G){let J={};if(Array.isArray(G))for(let[K,O]of G)J[String(K).toLowerCase()]=String(O);else if(G&&typeof G===\"object\")for(let K of Object.keys(G))J[K.toLowerCase()]=String(G[K]);this._map=J};F.prototype.get=function(G){return this._map[String(G).toLowerCase()]?\?null},F.prototype.set=function(G,J){this._map[String(G).toLowerCase()]=String(J)},F.prototype.has=function(G){return String(G).toLowerCase()in this._map},F.prototype.delete=function(G){delete this._map[String(G).toLowerCase()]},F.prototype.forEach=function(G){let J=this._map;for(let K of Object.keys(J))G(J[K],K)},F.prototype.entries=function*(){let G=this._map;for(let J of Object.keys(G))yield[J,G[J]]},F.prototype[Symbol.iterator]=F.prototype.entries,Q.Headers=F}if(typeof Q.WebSocket!==\"function\"){let $=function(D,N){let V=this;V.url=String(D),V.readyState=0,V.bufferedAmount=0,V.extensions=\"\",V.protocol=\"\",V.binaryType=\"arraybuffer\",V.onopen=null,V.onmessage=null,V.onerror=null,V.onclose=null;let Z={};V.addEventListener=(R,z)=>{(Z[R]?\?=[]).push(z)},V.removeEventListener=(R,z)=>{Z[R]=(Z[R]?\?[]).filter((U)=>U!==z)},V.dispatchEvent=(R)=>{let z=String(R?.type?\?\"\"),U=V[`on${z}`];if(typeof U===\"function\")try{U(R)}catch{}for(let L of(Z[z]?\?[]).slice())try{L(R)}catch{}return!0};let M=N==null?void 0:typeof N===\"string\"?[N]:N;if(!F){Q.setTimeout(()=>{V.readyState=3;let R=typeof Q.Event===\"function\"?new Q.Event(\"error\"):{type:\"error\"};V.dispatchEvent(R)},0);return}let E=F(String(D),M,(R)=>{let z=String(R.type?\?\"\");if(z===\"open\"){V.readyState=1;let U=typeof Q.Event===\"function\"?new Q.Event(\"open\"):{type:\"open\"};V.dispatchEvent(U)}else if(z===\"message\"){if(V.readyState!==1)return;let U=R.data;if(R.binary===!0&&Array.isArray(U))U=new Uint8Array(U).buffer;let h=typeof Q.MessageEvent===\"function\"?new Q.MessageEvent(\"message\",{data:U}):{type:\"message\",data:U};V.dispatchEvent(h)}else if(z===\"error\"){let U=typeof Q.Event===\"function\"?new Q.Event(\"error\"):{type:\"error\"};V.dispatchEvent(U)}else if(z===\"close\"){V.readyState=3;let U={type:\"close\",code:R.code?\?1000,reason:R.reason?\?\"\",wasClean:R.wasClean?\?!0};V.dispatchEvent(U)}});V._wsId=E},F=X.wsConnect,G=X.wsSend,J=X.wsClose,K=0,O=1,Y=2,T=3;$.prototype.send=function(D){if(this.readyState!==1)throw Error(\"WebSocket is not open\");let N=this._wsId;if(D instanceof ArrayBuffer||D instanceof Uint8Array){let Z=D instanceof Uint8Array?D:new Uint8Array(D);G?.(N,Z,!0)}else G?.(N,String(D),!1)},$.prototype.close=function(D,N){if(this.readyState===3||this.readyState===2)return;this.readyState=2;let V=this._wsId;J?.(V,D,N)},$.CONNECTING=0,$.OPEN=1,$.CLOSING=2,$.CLOSED=3,$.prototype.CONNECTING=0,$.prototype.OPEN=1,$.prototype.CLOSING=2,$.prototype.CLOSED=3,Q.WebSocket=$}Q.setTimeout=(F,G,...J)=>{if(typeof F!==\"function\")return 0;return X.setTimer?.(()=>F(...J),Number(G?\?0),!1)?\?0};Q.clearTimeout=(F)=>{if(typeof F===\"number\")X.clearTimer?.(F)};Q.setInterval=(F,G,...J)=>{if(typeof F!==\"function\")return 0;return X.setTimer?.(()=>F(...J),Number(G?\?0),!0)?\?0};Q.clearInterval=Q.clearTimeout;if(typeof Q.crypto>\"u\")Q.crypto={getRandomValues:(F)=>X.getRandomValues?.(F)?\?F,randomUUID:()=>X.randomUUID?.()?\?\"00000000-0000-0000-0000-000000000000\"};{let{Headers:F,TextEncoder:G}=Q,J=(K,O,Y,T)=>{let $=F?new F(T):T,D=!1,N=()=>{if(D)throw TypeError(\"Body already consumed\");return D=!0,K};return{ok:O>=200&&O<300,status:O,statusText:Y,headers:$,url:\"\",redirected:!1,type:\"basic\",bodyUsed:!1,text:()=>{let V=N();return Promise.resolve(V)},json:()=>{let V=N();return Promise.resolve(JSON.parse(V))},arrayBuffer:()=>{let V=N();if(G){let E=new G;return Promise.resolve(E.encode(V).buffer)}let Z=new ArrayBuffer(V.length),M=new Uint8Array(Z);for(let E=0;E<V.length;E++)M[E]=V.charCodeAt(E)&255;return Promise.resolve(Z)},blob:()=>Promise.reject(Error(\"Blob not supported in this context\")),clone:()=>J(K,O,Y,T)}};if(typeof Q.fetch>\"u\")Q.fetch=(K,O)=>new Promise((Y,T)=>{let $=\"\",D=\"GET\",N={},V;if(typeof K===\"string\")$=K;else if(K&&typeof K===\"object\"){let Z=K;if(typeof Z.url===\"string\")$=Z.url,D=Z.method||\"GET\",V=Z.body;else if(typeof Z.href===\"string\")$=Z.href}if(O){if(O.method)D=O.method;if(O.body)if(typeof O.body===\"string\")V=O.body;else if(O.body instanceof ArrayBuffer||O.body instanceof Uint8Array){let Z=O.body instanceof Uint8Array?O.body:new Uint8Array(O.body),M=Q.TextDecoder;V=M?new M().decode(Z):String.fromCharCode(...Z)}else V=JSON.stringify(O.body);if(O.headers&&typeof O.headers===\"object\")if(typeof O.headers.forEach===\"function\")O.headers.forEach((Z,M)=>{N[M]=String(Z)});else for(let[Z,M]of Object.entries(O.headers))N[Z]=String(M)}if(!X.fetch)return T(Error(\"fetch not available\"));X.fetch($,{method:D,headers:N,body:V},(Z)=>{let M=Z.body?\?\"\";if(Z.body_base64&&typeof Q.atob===\"function\")try{M=Q.atob(Z.body_base64)}catch{}Y(J(M,Z.status,Z.statusText,Z.headers))},(Z)=>T(Error(Z)))})}{let F=(G)=>(...J)=>{let K=J.map((O)=>{if(typeof O===\"string\")return O;try{return JSON.stringify(O)}catch{return String(O)}}).join(\" \");X.consoleLog?.(G,K)};Q.console={log:F(\"log\"),info:F(\"info\"),warn:F(\"warn\"),error:F(\"error\"),debug:F(\"debug\")}}var A={},c=0,H=`backend-${Date.now()}-${Math.random().toString(36).slice(2)}`,x=()=>\"__zapp_backend__\",I=Object.freeze({emit:(F,G)=>{return X.emitToHost?.(F,G),!0},invoke:(F,G)=>{return X.invokeToHost?.(F,G),!0},on:(F,G)=>{let J=++c;return(A[F]?\?=[]).push({id:J,fn:G}),()=>{A[F]=(A[F]?\?[]).filter((K)=>K.id!==J)}}});try{Object.defineProperty(Q,\"__zapp\",{value:I,enumerable:!0,configurable:!1,writable:!1})}catch{Q.__zapp=I}var P={};X.syncWait=(F)=>new Promise((G,J)=>{let K=typeof F?.key===\"string\"?F.key.trim():\"\";if(!K){J(Error(\"Sync key must be a non-empty string.\"));return}if(F?.signal?.aborted){J(Error(\"Sync wait aborted.\"));return}let O=`${H}:sync-${Date.now()}-${Math.random().toString(36).slice(2)}`,Y=F?.timeoutMs==null?null:Math.max(1,Math.min(300000,Math.floor(Number(F.timeoutMs)))),T=Y==null?void 0:Q.setTimeout(()=>{delete P[O],J(Error(\"Sync wait transport timed out.\"))},Y+5000);if(P[O]={resolve:G,reject:J,timer:T},f?.({id:O,key:K,timeoutMs:Y,targetWorkerId:x()}),F?.signal?.addEventListener)F.signal.addEventListener(\"abort\",()=>{let $=P[O];if(!$)return;if($.timer)Q.clearTimeout($.timer);delete P[O],S?.({id:O,targetWorkerId:x()}),J(Error(\"Sync wait aborted.\"))})});X.syncNotify=(F)=>{let G=typeof F?.key===\"string\"?F.key.trim():\"\";if(!G)return!1;return v?.({key:G,count:Math.max(1,Math.min(65535,Math.floor(Number(F?.count?\?1)))),targetWorkerId:x()})?\?!1};X.syncCancel=(F)=>{let G=typeof F?.id===\"string\"?F.id.trim():\"\";if(!G)return!1;return S?.({id:G,targetWorkerId:x()})?\?!1};var B={},u=0;X.windowCreate=(F)=>new Promise((G,J)=>{let K=`${H}:win-${++u}`,O=Q.setTimeout(()=>{delete B[K],J(Error(\"Window creation timed out.\"))},15000);B[K]={resolve:G,reject:J,timer:O},X.emitToHost?.(\"__zapp_window_create\",JSON.stringify({requestId:K,options:F}))});X.windowAction=(F,G,J)=>{X.emitToHost?.(\"__zapp_window_action\",JSON.stringify({windowId:F,action:G,...J}))};X.appAction=(F)=>{X.emitToHost?.(\"__zapp_app_action\",JSON.stringify({action:F}))};X.appConfigure=(F)=>{if(!F||typeof F!==\"object\")return;X.emitToHost?.(\"__zapp_app_configure\",JSON.stringify(F))};X.dispatchWindowResult=(F)=>{let G=F;if(typeof G===\"string\")try{G=JSON.parse(G)}catch{return}if(!G||typeof G!==\"object\")return;let J=G;if(typeof J.requestId!==\"string\")return;let K=B[J.requestId];if(!K)return;if(K.timer)Q.clearTimeout(K.timer);if(delete B[J.requestId],J.ok===!1)K.reject(Error(J.error?\?\"Window creation failed.\"));else K.resolve({id:J.id?\?\"\"})};try{Object.defineProperty(Q,Symbol.for(\"zapp.bridge\"),{value:X,enumerable:!1,configurable:!0,writable:!1})}catch{Q[Symbol.for(\"zapp.bridge\")]=X}X.dispatchSyncResult=(F)=>{let G=F;if(typeof G===\"string\")try{G=JSON.parse(G)}catch{return}if(!G||typeof G!==\"object\")return;let J=G;if(typeof J.id!==\"string\"||!J.id)return;let K=P[J.id];if(!K)return;if(K.timer)Q.clearTimeout(K.timer);if(delete P[J.id],!J.ok){K.reject(Error(\"Sync wait failed.\"));return}if(J.status===\"cancelled\"){K.reject(Error(\"Sync wait aborted.\"));return}K.resolve(J.status===\"timed-out\"?\"timed-out\":\"notified\")};X.deliverEvent=(F,G)=>{let J=A[F];if(!J||J.length===0)return;let K=G;if(typeof K===\"string\")try{K=JSON.parse(K)}catch{}if(K&&typeof K===\"object\"){let O=K;if(O.__zapp_internal_meta){if(O.__zapp_internal_meta.sourceCtxId===H)return;K=O.data}}for(let O of J.slice())try{O.fn(K)}catch(Y){b(Y)}};})();\n";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// AUTO-GENERATED FILE. DO NOT EDIT.
|
|
2
|
+
// Source of truth: `packages/bootstrap/src/worker.ts`
|
|
3
|
+
// Generated: `2026-03-22T07:58:05.469Z`
|
|
4
|
+
|
|
5
|
+
raw {
|
|
6
|
+
const char* zapp_windows_worker_bootstrap_script(void) {
|
|
7
|
+
return "(()=>{var{defineProperty:S,getOwnPropertyNames:f,getOwnPropertyDescriptor:h}=Object,C=Object.prototype.hasOwnProperty;var L=new WeakMap,m=(J)=>{var G=L.get(J),K;if(G)return G;if(G=S({},\"__esModule\",{value:!0}),J&&typeof J===\"object\"||typeof J===\"function\")f(J).map((O)=>!C.call(G,O)&&S(G,O,{get:()=>J[O],enumerable:!(K=h(J,O))||K.enumerable}));return L.set(J,G),G};var l={},Q=globalThis,Y=Q.__zappBridge?\?{};try{delete Q.__zappBridge}catch{}var{syncWait:v,syncNotify:y,syncCancel:q}=Y,b=(J)=>{if(typeof J===\"string\")return J;try{return String(J)}catch{return\"unknown error\"}},j=(J)=>{try{let G=J instanceof Error?J.message:b(J);Y.reportError?.(G)}catch{try{Y.reportError?.(\"Worker error\")}catch{}}};{let J=Y.consoleLog;if(J){let G=typeof Q.console===\"object\"&&Q.console?Q.console:null,K=(...V)=>V.map((X)=>{if(typeof X===\"string\")return X;try{return JSON.stringify(X)}catch{return String(X)}}).join(\" \"),O=(V)=>{let X=G?.[V];return(...N)=>{if(J(V,K(...N)),typeof X===\"function\")try{X.apply(G,N)}catch{}}};Q.console={log:O(\"log\"),info:O(\"info\"),warn:O(\"warn\"),error:O(\"error\"),debug:O(\"debug\"),trace:O(\"trace\"),dir:O(\"dir\"),assert:(V,...X)=>{if(!V){if(J(\"assert\",\"Assertion failed: \"+K(...X)),typeof G?.assert===\"function\")try{G.assert.call(G,V,...X)}catch{}}},time:G?.time?\?(()=>{}),timeEnd:G?.timeEnd?\?(()=>{}),timeLog:G?.timeLog?\?(()=>{}),group:G?.group?\?(()=>{}),groupEnd:G?.groupEnd?\?(()=>{}),groupCollapsed:G?.groupCollapsed?\?(()=>{}),clear:G?.clear?\?(()=>{}),count:G?.count?\?(()=>{}),countReset:G?.countReset?\?(()=>{}),table:O(\"table\")}}}if(typeof Q.Event!==\"function\")Q.Event=function(G,K){if(this.type=String(G?\?\"\"),this.defaultPrevented=!1,K)for(let O of Object.keys(K))this[O]=K[O]};if(typeof Q.MessageEvent!==\"function\"){let J=Q.Event;Q.MessageEvent=function(K,O){J.call(this,K,O),this.data=O?.data,this.ports=O?.ports?\?[]}}if(typeof Q.AbortSignal!==\"function\"){let J=function(){this.aborted=!1,this.reason=void 0,this._listeners=[]};J.prototype.addEventListener=function(G,K){if(G===\"abort\"&&typeof K===\"function\")this._listeners.push(K)},J.prototype.removeEventListener=function(G,K){if(G===\"abort\")this._listeners=this._listeners.filter((O)=>O!==K)},Q.AbortSignal=J}if(typeof Q.AbortController!==\"function\"){let J=Q.AbortSignal;Q.AbortController=function(){this.signal=new J},Q.AbortController.prototype.abort=function(G){let K=this.signal;if(K.aborted)return;K.aborted=!0,K.reason=G;let O=(K._listeners?\?[]).slice();K._listeners=[];for(let V of O)try{V()}catch{}}}if(typeof Q.CustomEvent!==\"function\"){let J=Q.Event;Q.CustomEvent=function(K,O){J.call(this,K,O),this.detail=O?.detail?\?null},Q.CustomEvent.prototype=Object.create(Q.Event.prototype)}if(typeof Q.TextEncoder!==\"function\"){let J=Y.textEncode;Q.TextEncoder=function(){},Q.TextEncoder.prototype.encoding=\"utf-8\",Q.TextEncoder.prototype.encode=function(G){if(!G)return new Uint8Array(0);if(J)return J(String(G));let K=String(G),O=[];for(let V=0;V<K.length;V++){let X=K.charCodeAt(V);if(X<128)O.push(X);else if(X<2048)O.push(192|X>>6,128|X&63);else if(X>=55296&&X<=56319&&V+1<K.length){let N=K.charCodeAt(++V);X=65536+(X-55296<<10)+(N-56320),O.push(240|X>>18,128|X>>12&63,128|X>>6&63,128|X&63)}else O.push(224|X>>12,128|X>>6&63,128|X&63)}return new Uint8Array(O)},Q.TextEncoder.prototype.encodeInto=function(G,K){let O=Q.TextEncoder.prototype.encode(G),V=Math.min(O.length,K.length);return K.set(O.subarray(0,V)),{read:G.length,written:V}}}if(typeof Q.TextDecoder!==\"function\"){let J=Y.textDecode;Q.TextDecoder=function(){},Q.TextDecoder.prototype.encoding=\"utf-8\",Q.TextDecoder.prototype.decode=function(G){if(!G)return\"\";if(J)return J(G);let K=G instanceof Uint8Array?G:new Uint8Array(G),O=[],V=0;while(V<K.length){let X=K[V];if(X<128)O.push(String.fromCharCode(X)),V++;else if((X&224)===192)O.push(String.fromCharCode((X&31)<<6|K[V+1]&63)),V+=2;else if((X&240)===224)O.push(String.fromCharCode((X&15)<<12|(K[V+1]&63)<<6|K[V+2]&63)),V+=3;else if((X&248)===240){let F=((X&7)<<18|(K[V+1]&63)<<12|(K[V+2]&63)<<6|K[V+3]&63)-65536;O.push(String.fromCharCode(55296+(F>>10),56320+(F&1023))),V+=4}else O.push(\"�\"),V++}return O.join(\"\")}}if(typeof Q.URL!==\"function\"){let G=function(K,O){let V=J?.(String(K),O!=null?String(O):void 0);if(!V)throw TypeError(`Invalid URL: ${K}`);this.href=V.href,this.protocol=V.protocol,this.host=V.host,this.hostname=V.hostname,this.port=V.port,this.pathname=V.pathname,this.search=V.search,this.hash=V.hash,this.origin=V.origin,this.username=V.username,this.password=V.password},J=Y.urlParse;G.prototype.toString=function(){return this.href},G.prototype.toJSON=function(){return this.href},Q.URL=G}if(typeof Q.atob!==\"function\"){let J=Y.atob;Q.atob=(G)=>{if(J)return J(String(G));throw Error(\"atob not available\")}}if(typeof Q.btoa!==\"function\"){let J=Y.btoa;Q.btoa=(G)=>{if(J)return J(String(G));throw Error(\"btoa not available\")}}if(typeof Q.Headers!==\"function\"){let J=function(G){let K={};if(Array.isArray(G))for(let[O,V]of G)K[String(O).toLowerCase()]=String(V);else if(G&&typeof G===\"object\")for(let O of Object.keys(G))K[O.toLowerCase()]=String(G[O]);this._map=K};J.prototype.get=function(G){return this._map[String(G).toLowerCase()]?\?null},J.prototype.set=function(G,K){this._map[String(G).toLowerCase()]=String(K)},J.prototype.has=function(G){return String(G).toLowerCase()in this._map},J.prototype.delete=function(G){delete this._map[String(G).toLowerCase()]},J.prototype.forEach=function(G){let K=this._map;for(let O of Object.keys(K))G(K[O],O)},J.prototype.entries=function*(){let G=this._map;for(let K of Object.keys(G))yield[K,G[K]]},J.prototype[Symbol.iterator]=J.prototype.entries,Q.Headers=J}if(typeof Q.WebSocket!==\"function\"){let F=function(R,U){let Z=this;Z.url=String(R),Z.readyState=0,Z.bufferedAmount=0,Z.extensions=\"\",Z.protocol=\"\",Z.binaryType=\"arraybuffer\",Z.onopen=null,Z.onmessage=null,Z.onerror=null,Z.onclose=null;let $={};Z.addEventListener=(B,T)=>{($[B]?\?=[]).push(T)},Z.removeEventListener=(B,T)=>{$[B]=($[B]?\?[]).filter((D)=>D!==T)},Z.dispatchEvent=(B)=>{let T=String(B?.type?\?\"\"),D=Z[`on${T}`];if(typeof D===\"function\")try{D(B)}catch{}for(let w of($[T]?\?[]).slice())try{w(B)}catch{}return!0};let M=U==null?void 0:typeof U===\"string\"?[U]:U;if(!J){Q.setTimeout(()=>{Z.readyState=3;let B=typeof Q.Event===\"function\"?new Q.Event(\"error\"):{type:\"error\"};Z.dispatchEvent(B)},0);return}let P=J(String(R),M,(B)=>{let T=String(B.type?\?\"\");if(T===\"open\"){Z.readyState=1;let D=typeof Q.Event===\"function\"?new Q.Event(\"open\"):{type:\"open\"};Z.dispatchEvent(D)}else if(T===\"message\"){if(Z.readyState!==1)return;let D=B.data;if(B.binary===!0&&Array.isArray(D))D=new Uint8Array(D).buffer;let k=typeof Q.MessageEvent===\"function\"?new Q.MessageEvent(\"message\",{data:D}):{type:\"message\",data:D};Z.dispatchEvent(k)}else if(T===\"error\"){let D=typeof Q.Event===\"function\"?new Q.Event(\"error\"):{type:\"error\"};Z.dispatchEvent(D)}else if(T===\"close\"){Z.readyState=3;let D={type:\"close\",code:B.code?\?1000,reason:B.reason?\?\"\",wasClean:B.wasClean?\?!0};Z.dispatchEvent(D)}});Z._wsId=P},J=Y.wsConnect,G=Y.wsSend,K=Y.wsClose,O=0,V=1,X=2,N=3;F.prototype.send=function(R){if(this.readyState!==1)throw Error(\"WebSocket is not open\");let U=this._wsId;if(R instanceof ArrayBuffer||R instanceof Uint8Array){let $=R instanceof Uint8Array?R:new Uint8Array(R);G?.(U,$,!0)}else G?.(U,String(R),!1)},F.prototype.close=function(R,U){if(this.readyState===3||this.readyState===2)return;this.readyState=2;let Z=this._wsId;K?.(Z,R,U)},F.CONNECTING=0,F.OPEN=1,F.CLOSING=2,F.CLOSED=3,F.prototype.CONNECTING=0,F.prototype.OPEN=1,F.prototype.CLOSING=2,F.prototype.CLOSED=3,Q.WebSocket=F}Q.setTimeout=(J,G,...K)=>{if(typeof J!==\"function\")return 0;return Y.setTimer?.(()=>J(...K),Number(G?\?0),!1)?\?0};Q.clearTimeout=(J)=>{if(typeof J===\"number\")Y.clearTimer?.(J)};Q.setInterval=(J,G,...K)=>{if(typeof J!==\"function\")return 0;return Y.setTimer?.(()=>J(...K),Number(G?\?0),!0)?\?0};Q.clearInterval=Q.clearTimeout;Q.postMessage=(J)=>{Y.postMessage?.(J)};Q.close=()=>{Y.closeWorker?.()};if(typeof Q.crypto>\"u\")Q.crypto={getRandomValues:(J)=>Y.getRandomValues?.(J)?\?J,randomUUID:()=>Y.randomUUID?.()?\?\"00000000-0000-0000-0000-000000000000\"};{let{Headers:J,TextEncoder:G}=Q,K=(O,V,X,N)=>{let F=J?new J(N):N,R=!1,U=()=>{if(R)throw TypeError(\"Body already consumed\");return R=!0,O};return{ok:V>=200&&V<300,status:V,statusText:X,headers:F,url:\"\",redirected:!1,type:\"basic\",bodyUsed:!1,text:()=>{let Z=U();return Promise.resolve(Z)},json:()=>{let Z=U();return Promise.resolve(JSON.parse(Z))},arrayBuffer:()=>{let Z=U();if(G){let P=new G;return Promise.resolve(P.encode(Z).buffer)}let $=new ArrayBuffer(Z.length),M=new Uint8Array($);for(let P=0;P<Z.length;P++)M[P]=Z.charCodeAt(P)&255;return Promise.resolve($)},blob:()=>Promise.reject(Error(\"Blob not supported in this context\")),clone:()=>K(O,V,X,N)}};if(typeof Q.fetch>\"u\")Q.fetch=(O,V)=>new Promise((X,N)=>{let F=\"\",R=\"GET\",U={},Z;if(typeof O===\"string\")F=O;else if(O&&typeof O===\"object\"){let $=O;if(typeof $.url===\"string\")F=$.url,R=$.method||\"GET\",Z=$.body;else if(typeof $.href===\"string\")F=$.href}if(V){if(V.method)R=V.method;if(V.body)if(typeof V.body===\"string\")Z=V.body;else if(V.body instanceof ArrayBuffer||V.body instanceof Uint8Array){let $=V.body instanceof Uint8Array?V.body:new Uint8Array(V.body),M=Q.TextDecoder;Z=M?new M().decode($):String.fromCharCode(...$)}else Z=JSON.stringify(V.body);if(V.headers&&typeof V.headers===\"object\")if(typeof V.headers.forEach===\"function\")V.headers.forEach(($,M)=>{U[M]=String($)});else for(let[$,M]of Object.entries(V.headers))U[$]=String(M)}if(!Y.fetch)return N(Error(\"fetch not available\"));Y.fetch(F,{method:R,headers:U,body:Z},($)=>{let M=$.body?\?\"\";if($.body_base64&&typeof Q.atob===\"function\")try{M=Q.atob($.body_base64)}catch{}X(K(M,$.status,$.statusText,$.headers))},($)=>N(Error($)))})}var z={},u=0,W=`ctx-${Date.now()}-${Math.random().toString(36).slice(2)}`,E=()=>String(Q.__zappWorkerDispatchId?\?\"\"),I=Object.freeze({emit:(J,G)=>{return Y.emitToHost?.(J,G),!0},invoke:(J,G)=>{return Y.invokeToHost?.(J,G),!0},on:(J,G)=>{let K=++u;return(z[J]?\?=[]).push({id:K,fn:G}),()=>{z[J]=(z[J]?\?[]).filter((O)=>O.id!==K)}}});try{Object.defineProperty(Q,\"__zapp\",{value:I,enumerable:!0,configurable:!1,writable:!1})}catch{Q.__zapp=I}var A={};Q.send=(J,G)=>{Q.postMessage({__zapp_channel:J,data:G})};Q.receive=(J,G)=>{return(A[J]?\?=[]).push(G),()=>{A[J]=(A[J]?\?[]).filter((K)=>K!==G)}};var _={};Y.syncWait=(J)=>new Promise((G,K)=>{let O=typeof J?.key===\"string\"?J.key.trim():\"\";if(!O){K(Error(\"Sync key must be a non-empty string.\"));return}if(J?.signal?.aborted){K(Error(\"Sync wait aborted.\"));return}let V=`${W}:sync-${Date.now()}-${Math.random().toString(36).slice(2)}`,X=J?.timeoutMs==null?null:Math.max(1,Math.min(300000,Math.floor(Number(J.timeoutMs)))),N=X==null?void 0:Q.setTimeout(()=>{delete _[V],K(Error(\"Sync wait transport timed out.\"))},X+5000);if(_[V]={resolve:G,reject:K,timer:N},v?.({id:V,key:O,timeoutMs:X,targetWorkerId:E()}),J?.signal?.addEventListener)J.signal.addEventListener(\"abort\",()=>{let F=_[V];if(!F)return;if(F.timer)Q.clearTimeout(F.timer);delete _[V],q?.({id:V,targetWorkerId:E()}),K(Error(\"Sync wait aborted.\"))})});Y.syncNotify=(J)=>{let G=typeof J?.key===\"string\"?J.key.trim():\"\";if(!G)return!1;return y?.({key:G,count:Math.max(1,Math.min(65535,Math.floor(Number(J?.count?\?1)))),targetWorkerId:E()})?\?!1};Y.syncCancel=(J)=>{let G=typeof J?.id===\"string\"?J.id.trim():\"\";if(!G)return!1;return q?.({id:G,targetWorkerId:E()})?\?!1};var x={},c=0;Y.windowCreate=(J)=>new Promise((G,K)=>{let O=`${W}:win-${++c}`,V=Q.setTimeout(()=>{delete x[O],K(Error(\"Window creation timed out.\"))},15000);x[O]={resolve:G,reject:K,timer:V},Y.emitToHost?.(\"__zapp_window_create\",JSON.stringify({requestId:O,options:J}))});Y.windowAction=(J,G,K)=>{Y.emitToHost?.(\"__zapp_window_action\",JSON.stringify({windowId:J,action:G,...K}))};Y.appAction=(J)=>{Y.emitToHost?.(\"__zapp_app_action\",JSON.stringify({action:J}))};Y.dispatchWindowResult=(J)=>{let G=J;if(typeof G===\"string\")try{G=JSON.parse(G)}catch{return}if(!G||typeof G!==\"object\")return;let K=G;if(typeof K.requestId!==\"string\")return;let O=x[K.requestId];if(!O)return;if(O.timer)Q.clearTimeout(O.timer);if(delete x[K.requestId],K.ok===!1)O.reject(Error(K.error?\?\"Window creation failed.\"));else O.resolve({id:K.id?\?\"\"})};try{Object.defineProperty(Q,Symbol.for(\"zapp.bridge\"),{value:Y,enumerable:!1,configurable:!0,writable:!1})}catch{Q[Symbol.for(\"zapp.bridge\")]=Y}var H=new Map;Y.dispatchMessage=(J,G)=>{if(J&&typeof J===\"object\"&&J.__zapp_channel){let{__zapp_channel:O,data:V}=J,X=(N,F)=>{if(G)Y.postMessage?.({__zapp_channel:N,data:F},G);else Q.postMessage({__zapp_channel:N,data:F})};for(let N of(A[O]?\?[]).slice())try{N(V,X)}catch{}return}let K=typeof Q.MessageEvent===\"function\"?new Q.MessageEvent(\"message\",{data:J}):{type:\"message\",data:J};if(typeof Q.onmessage===\"function\")try{Q.onmessage(K)}catch(O){j(O)}};Y.dispatchConnect=(J)=>{let G={_id:J,postMessage:(O)=>Y.postMessage?.(O,J),onmessage:null,onclose:null,start(){},close(){}};H.set(J,G);let K=typeof Q.MessageEvent===\"function\"?new Q.MessageEvent(\"connect\",{ports:[G]}):{type:\"connect\",ports:[G]};if(typeof Q.onconnect===\"function\")try{Q.onconnect(K)}catch(O){j(O)}};Y.dispatchDisconnect=(J)=>{let G=H.get(J);if(G){if(G.onclose)try{G.onclose({type:\"close\"})}catch{}H.delete(J)}};Y.dispatchSyncResult=(J)=>{let G=J;if(typeof G===\"string\")try{G=JSON.parse(G)}catch{return}if(!G||typeof G!==\"object\")return;let K=G;if(typeof K.id!==\"string\"||!K.id)return;let O=_[K.id];if(!O)return;if(O.timer)Q.clearTimeout(O.timer);if(delete _[K.id],!K.ok){O.reject(Error(\"Sync wait failed.\"));return}if(K.status===\"cancelled\"){O.reject(Error(\"Sync wait aborted.\"));return}O.resolve(K.status===\"timed-out\"?\"timed-out\":\"notified\")};Y.deliverEvent=(J,G)=>{let K=z[J];if(!K||K.length===0)return;let O=G;if(typeof O===\"string\")try{O=JSON.parse(O)}catch{}if(O&&typeof O===\"object\"){let V=O;if(V.__zapp_internal_meta){if(V.__zapp_internal_meta.sourceCtxId===W)return;O=V.data}}for(let V of K.slice())try{V.fn(O)}catch(X){j(X)}};})();\n";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Engine adapter for QuickJS on Windows.
|
|
2
|
+
// No type renaming needed since we don't have JavaScriptCore in the same TU.
|
|
3
|
+
|
|
4
|
+
raw {
|
|
5
|
+
#if defined(_WIN32) && defined(ZAPP_WORKER_ENGINE_QJS)
|
|
6
|
+
#include "quickjs.h"
|
|
7
|
+
#include "quickjs-libc.h"
|
|
8
|
+
#include <string.h>
|
|
9
|
+
#include <stdlib.h>
|
|
10
|
+
|
|
11
|
+
#define ENGINE_QJS_MSG_MAX 4096
|
|
12
|
+
static char g_engine_qjs_last_message[ENGINE_QJS_MSG_MAX] = {0};
|
|
13
|
+
|
|
14
|
+
void* engine_qjs_create_ctx(void* rt) {
|
|
15
|
+
if (!rt) return NULL;
|
|
16
|
+
JSRuntime* qrt = (JSRuntime*)rt;
|
|
17
|
+
JSContext* ctx = JS_NewContext(qrt);
|
|
18
|
+
if (!ctx) return NULL;
|
|
19
|
+
js_std_add_helpers(ctx, 0, NULL);
|
|
20
|
+
js_init_module_std(ctx, "std");
|
|
21
|
+
js_init_module_os(ctx, "os");
|
|
22
|
+
return (void*)ctx;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
int engine_qjs_eval(void* ctx_opaque, const char* utf8, size_t len, const char* filename) {
|
|
26
|
+
if (!ctx_opaque || !utf8) return -1;
|
|
27
|
+
g_engine_qjs_last_message[0] = '\0';
|
|
28
|
+
JSContext* ctx = (JSContext*)ctx_opaque;
|
|
29
|
+
JSValue ret = JS_Eval(ctx, utf8, (int)(len > 0x7fffffff ? 0x7fffffff : len),
|
|
30
|
+
filename ? filename : "<script>", JS_EVAL_TYPE_GLOBAL);
|
|
31
|
+
if (JS_IsException(ret)) {
|
|
32
|
+
JSValue exc = JS_GetException(ctx);
|
|
33
|
+
const char* str = JS_ToCString(ctx, exc);
|
|
34
|
+
if (str) {
|
|
35
|
+
size_t n = strlen(str);
|
|
36
|
+
if (n >= ENGINE_QJS_MSG_MAX) n = ENGINE_QJS_MSG_MAX - 1;
|
|
37
|
+
memcpy(g_engine_qjs_last_message, str, n);
|
|
38
|
+
g_engine_qjs_last_message[n] = '\0';
|
|
39
|
+
JS_FreeCString(ctx, str);
|
|
40
|
+
}
|
|
41
|
+
JS_FreeValue(ctx, exc);
|
|
42
|
+
JS_FreeValue(ctx, ret);
|
|
43
|
+
return -1;
|
|
44
|
+
}
|
|
45
|
+
JS_FreeValue(ctx, ret);
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const char* engine_qjs_get_exception_message(void* ctx_opaque) {
|
|
50
|
+
(void)ctx_opaque;
|
|
51
|
+
return g_engine_qjs_last_message[0] ? g_engine_qjs_last_message : NULL;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
void engine_qjs_free_ctx(void* ctx_opaque) {
|
|
55
|
+
if (!ctx_opaque) return;
|
|
56
|
+
JSContext* ctx = (JSContext*)ctx_opaque;
|
|
57
|
+
JS_FreeContext(ctx);
|
|
58
|
+
}
|
|
59
|
+
#endif
|
|
60
|
+
}
|