@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.
Files changed (209) hide show
  1. package/README.md +55 -0
  2. package/dist/zapp-cli.js +9471 -0
  3. package/native/src/app/app.zc +490 -0
  4. package/native/src/event/event.zc +24 -0
  5. package/native/src/event/events.zc +70 -0
  6. package/native/src/platform/darwin/backend.zc +923 -0
  7. package/native/src/platform/darwin/backend_bootstrap.zc +9 -0
  8. package/native/src/platform/darwin/bootstrap.zc +9 -0
  9. package/native/src/platform/darwin/engine_jsc.zc +86 -0
  10. package/native/src/platform/darwin/engine_qjs.zc +92 -0
  11. package/native/src/platform/darwin/platform.zc +156 -0
  12. package/native/src/platform/darwin/webview.zc +550 -0
  13. package/native/src/platform/darwin/webview_bootstrap.zc +9 -0
  14. package/native/src/platform/darwin/window.zc +1223 -0
  15. package/native/src/platform/darwin/worker/common.zc +223 -0
  16. package/native/src/platform/darwin/worker/core/base64_core.zc +29 -0
  17. package/native/src/platform/darwin/worker/core/crypto_core.zc +19 -0
  18. package/native/src/platform/darwin/worker/core/encoding_core.zc +32 -0
  19. package/native/src/platform/darwin/worker/core/fetch_core.zc +145 -0
  20. package/native/src/platform/darwin/worker/core/url_core.zc +69 -0
  21. package/native/src/platform/darwin/worker/core/websocket_core.zc +179 -0
  22. package/native/src/platform/darwin/worker/dispatch.zc +55 -0
  23. package/native/src/platform/darwin/worker/jsc/base64_jsc.zc +39 -0
  24. package/native/src/platform/darwin/worker/jsc/crypto_jsc.zc +49 -0
  25. package/native/src/platform/darwin/worker/jsc/encoding_jsc.zc +86 -0
  26. package/native/src/platform/darwin/worker/jsc/fetch_jsc.zc +149 -0
  27. package/native/src/platform/darwin/worker/jsc/url_jsc.zc +54 -0
  28. package/native/src/platform/darwin/worker/jsc/websocket_jsc.zc +127 -0
  29. package/native/src/platform/darwin/worker/jsc.zc +670 -0
  30. package/native/src/platform/darwin/worker/mod.zc +30 -0
  31. package/native/src/platform/darwin/worker/qjs/fetch_qjs.zc +233 -0
  32. package/native/src/platform/darwin/worker/qjs/qjs_macros.zc +23 -0
  33. package/native/src/platform/darwin/worker/qjs/websocket_qjs.zc +223 -0
  34. package/native/src/platform/darwin/worker/qjs.zc +1053 -0
  35. package/native/src/platform/darwin/worker/timers.zc +149 -0
  36. package/native/src/platform/darwin/worker/timers_qjs.zc +209 -0
  37. package/native/src/platform/platform.zc +64 -0
  38. package/native/src/platform/shared/log.zc +156 -0
  39. package/native/src/platform/shared/worker/qjs/base64_qjs.zc +38 -0
  40. package/native/src/platform/shared/worker/qjs/crypto_qjs.zc +44 -0
  41. package/native/src/platform/shared/worker/qjs/encoding_qjs.zc +95 -0
  42. package/native/src/platform/shared/worker/qjs/url_qjs.zc +65 -0
  43. package/native/src/platform/shared/worker_registry.zc +206 -0
  44. package/native/src/platform/window.zc +446 -0
  45. package/native/src/platform/windows/backend.zc +452 -0
  46. package/native/src/platform/windows/backend_bootstrap.zc +9 -0
  47. package/native/src/platform/windows/bootstrap.zc +9 -0
  48. package/native/src/platform/windows/engine_qjs.zc +60 -0
  49. package/native/src/platform/windows/platform.zc +387 -0
  50. package/native/src/platform/windows/webview.zc +1175 -0
  51. package/native/src/platform/windows/webview_bootstrap.zc +9 -0
  52. package/native/src/platform/windows/window.zc +1271 -0
  53. package/native/src/platform/windows/worker/common.zc +409 -0
  54. package/native/src/platform/windows/worker/core/base64_core.zc +52 -0
  55. package/native/src/platform/windows/worker/core/crypto_core.zc +34 -0
  56. package/native/src/platform/windows/worker/core/encoding_core.zc +60 -0
  57. package/native/src/platform/windows/worker/core/fetch_core.zc +274 -0
  58. package/native/src/platform/windows/worker/core/url_core.zc +216 -0
  59. package/native/src/platform/windows/worker/core/websocket_core.zc +343 -0
  60. package/native/src/platform/windows/worker/dispatch.zc +34 -0
  61. package/native/src/platform/windows/worker/mod.zc +46 -0
  62. package/native/src/platform/windows/worker/qjs/fetch_qjs.zc +255 -0
  63. package/native/src/platform/windows/worker/qjs/websocket_qjs.zc +263 -0
  64. package/native/src/platform/windows/worker/qjs.zc +1049 -0
  65. package/native/src/platform/windows/worker/timers_qjs.zc +288 -0
  66. package/native/src/platform/worker.zc +8 -0
  67. package/native/src/service/service.zc +228 -0
  68. package/native/vendor/quickjs-ng/.gitattributes +4 -0
  69. package/native/vendor/quickjs-ng/.github/dependabot.yml +7 -0
  70. package/native/vendor/quickjs-ng/.github/workflows/ci.yml +812 -0
  71. package/native/vendor/quickjs-ng/.github/workflows/docs.yml +49 -0
  72. package/native/vendor/quickjs-ng/.github/workflows/release.yml +162 -0
  73. package/native/vendor/quickjs-ng/.github/workflows/test-docs.yml +23 -0
  74. package/native/vendor/quickjs-ng/.github/workflows/tsan.yml +32 -0
  75. package/native/vendor/quickjs-ng/.github/workflows/valgrind.yml +33 -0
  76. package/native/vendor/quickjs-ng/.gitmodules +5 -0
  77. package/native/vendor/quickjs-ng/CMakeLists.txt +553 -0
  78. package/native/vendor/quickjs-ng/LICENSE +24 -0
  79. package/native/vendor/quickjs-ng/Makefile +149 -0
  80. package/native/vendor/quickjs-ng/amalgam.js +53 -0
  81. package/native/vendor/quickjs-ng/api-test.c +927 -0
  82. package/native/vendor/quickjs-ng/builtin-array-fromasync.h +119 -0
  83. package/native/vendor/quickjs-ng/builtin-array-fromasync.js +36 -0
  84. package/native/vendor/quickjs-ng/builtin-iterator-zip-keyed.h +332 -0
  85. package/native/vendor/quickjs-ng/builtin-iterator-zip-keyed.js +194 -0
  86. package/native/vendor/quickjs-ng/builtin-iterator-zip.h +337 -0
  87. package/native/vendor/quickjs-ng/builtin-iterator-zip.js +210 -0
  88. package/native/vendor/quickjs-ng/ctest.c +17 -0
  89. package/native/vendor/quickjs-ng/cutils.h +2013 -0
  90. package/native/vendor/quickjs-ng/cxxtest.cc +2 -0
  91. package/native/vendor/quickjs-ng/dtoa.c +1619 -0
  92. package/native/vendor/quickjs-ng/dtoa.h +87 -0
  93. package/native/vendor/quickjs-ng/examples/fib.c +67 -0
  94. package/native/vendor/quickjs-ng/examples/fib_module.js +10 -0
  95. package/native/vendor/quickjs-ng/examples/hello.js +1 -0
  96. package/native/vendor/quickjs-ng/examples/hello_module.js +6 -0
  97. package/native/vendor/quickjs-ng/examples/meson.build +17 -0
  98. package/native/vendor/quickjs-ng/examples/pi_bigint.js +118 -0
  99. package/native/vendor/quickjs-ng/examples/point.c +154 -0
  100. package/native/vendor/quickjs-ng/examples/test_fib.js +8 -0
  101. package/native/vendor/quickjs-ng/examples/test_point.js +43 -0
  102. package/native/vendor/quickjs-ng/fuzz.c +51 -0
  103. package/native/vendor/quickjs-ng/gen/function_source.c +81 -0
  104. package/native/vendor/quickjs-ng/gen/hello.c +53 -0
  105. package/native/vendor/quickjs-ng/gen/hello_module.c +106 -0
  106. package/native/vendor/quickjs-ng/gen/repl.c +3053 -0
  107. package/native/vendor/quickjs-ng/gen/standalone.c +324 -0
  108. package/native/vendor/quickjs-ng/gen/test_fib.c +81 -0
  109. package/native/vendor/quickjs-ng/libregexp-opcode.h +58 -0
  110. package/native/vendor/quickjs-ng/libregexp.c +2687 -0
  111. package/native/vendor/quickjs-ng/libregexp.h +98 -0
  112. package/native/vendor/quickjs-ng/libunicode-table.h +4707 -0
  113. package/native/vendor/quickjs-ng/libunicode.c +1746 -0
  114. package/native/vendor/quickjs-ng/libunicode.h +126 -0
  115. package/native/vendor/quickjs-ng/list.h +107 -0
  116. package/native/vendor/quickjs-ng/lre-test.c +73 -0
  117. package/native/vendor/quickjs-ng/meson.build +684 -0
  118. package/native/vendor/quickjs-ng/meson_options.txt +6 -0
  119. package/native/vendor/quickjs-ng/qjs-wasi-reactor.c +208 -0
  120. package/native/vendor/quickjs-ng/qjs.c +748 -0
  121. package/native/vendor/quickjs-ng/qjsc.c +673 -0
  122. package/native/vendor/quickjs-ng/quickjs-atom.h +267 -0
  123. package/native/vendor/quickjs-ng/quickjs-c-atomics.h +54 -0
  124. package/native/vendor/quickjs-ng/quickjs-libc.c +4986 -0
  125. package/native/vendor/quickjs-ng/quickjs-libc.h +79 -0
  126. package/native/vendor/quickjs-ng/quickjs-opcode.h +369 -0
  127. package/native/vendor/quickjs-ng/quickjs.c +60259 -0
  128. package/native/vendor/quickjs-ng/quickjs.h +1419 -0
  129. package/native/vendor/quickjs-ng/repl.js +1927 -0
  130. package/native/vendor/quickjs-ng/run-test262.c +2417 -0
  131. package/native/vendor/quickjs-ng/standalone.js +129 -0
  132. package/native/vendor/quickjs-ng/tests/assert.js +49 -0
  133. package/native/vendor/quickjs-ng/tests/bug1221.js +16 -0
  134. package/native/vendor/quickjs-ng/tests/bug1296.js +12 -0
  135. package/native/vendor/quickjs-ng/tests/bug1297.js +22 -0
  136. package/native/vendor/quickjs-ng/tests/bug1301.js +21 -0
  137. package/native/vendor/quickjs-ng/tests/bug1302.js +24 -0
  138. package/native/vendor/quickjs-ng/tests/bug1305.js +26 -0
  139. package/native/vendor/quickjs-ng/tests/bug1318.js +54 -0
  140. package/native/vendor/quickjs-ng/tests/bug1352.js +8 -0
  141. package/native/vendor/quickjs-ng/tests/bug1354.js +6 -0
  142. package/native/vendor/quickjs-ng/tests/bug1355.js +58 -0
  143. package/native/vendor/quickjs-ng/tests/bug1368.js +9 -0
  144. package/native/vendor/quickjs-ng/tests/bug39/1.js +6 -0
  145. package/native/vendor/quickjs-ng/tests/bug39/2.js +6 -0
  146. package/native/vendor/quickjs-ng/tests/bug39/3.js +7 -0
  147. package/native/vendor/quickjs-ng/tests/bug488-upstream.js +7 -0
  148. package/native/vendor/quickjs-ng/tests/bug633/0.js +7 -0
  149. package/native/vendor/quickjs-ng/tests/bug633/1.js +4 -0
  150. package/native/vendor/quickjs-ng/tests/bug633/2.js +4 -0
  151. package/native/vendor/quickjs-ng/tests/bug633/3.js +4 -0
  152. package/native/vendor/quickjs-ng/tests/bug645/0.js +4 -0
  153. package/native/vendor/quickjs-ng/tests/bug645/1.js +9 -0
  154. package/native/vendor/quickjs-ng/tests/bug645/2.js +7 -0
  155. package/native/vendor/quickjs-ng/tests/bug648.js +13 -0
  156. package/native/vendor/quickjs-ng/tests/bug652.js +4 -0
  157. package/native/vendor/quickjs-ng/tests/bug741.js +19 -0
  158. package/native/vendor/quickjs-ng/tests/bug775.js +7 -0
  159. package/native/vendor/quickjs-ng/tests/bug776.js +7 -0
  160. package/native/vendor/quickjs-ng/tests/bug832.js +2 -0
  161. package/native/vendor/quickjs-ng/tests/bug858.js +26 -0
  162. package/native/vendor/quickjs-ng/tests/bug904.js +6 -0
  163. package/native/vendor/quickjs-ng/tests/bug988.js +7 -0
  164. package/native/vendor/quickjs-ng/tests/bug999.js +3 -0
  165. package/native/vendor/quickjs-ng/tests/destructured-export.js +8 -0
  166. package/native/vendor/quickjs-ng/tests/detect_module/0.js +1 -0
  167. package/native/vendor/quickjs-ng/tests/detect_module/1.js +2 -0
  168. package/native/vendor/quickjs-ng/tests/detect_module/2.js +1 -0
  169. package/native/vendor/quickjs-ng/tests/detect_module/3.js +8 -0
  170. package/native/vendor/quickjs-ng/tests/detect_module/4.js +3 -0
  171. package/native/vendor/quickjs-ng/tests/empty.js +0 -0
  172. package/native/vendor/quickjs-ng/tests/fixture_cyclic_import.js +2 -0
  173. package/native/vendor/quickjs-ng/tests/fixture_string_exports.js +12 -0
  174. package/native/vendor/quickjs-ng/tests/function_source.js +14 -0
  175. package/native/vendor/quickjs-ng/tests/microbench.js +1267 -0
  176. package/native/vendor/quickjs-ng/tests/null_or_undefined.js +38 -0
  177. package/native/vendor/quickjs-ng/tests/str-pad-leak.js +5 -0
  178. package/native/vendor/quickjs-ng/tests/test_bigint.js +107 -0
  179. package/native/vendor/quickjs-ng/tests/test_bjson.js +366 -0
  180. package/native/vendor/quickjs-ng/tests/test_builtin.js +1314 -0
  181. package/native/vendor/quickjs-ng/tests/test_closure.js +220 -0
  182. package/native/vendor/quickjs-ng/tests/test_cyclic_import.js +12 -0
  183. package/native/vendor/quickjs-ng/tests/test_domexception.js +35 -0
  184. package/native/vendor/quickjs-ng/tests/test_language.js +755 -0
  185. package/native/vendor/quickjs-ng/tests/test_loop.js +367 -0
  186. package/native/vendor/quickjs-ng/tests/test_queue_microtask.js +39 -0
  187. package/native/vendor/quickjs-ng/tests/test_std.js +340 -0
  188. package/native/vendor/quickjs-ng/tests/test_string_exports.js +25 -0
  189. package/native/vendor/quickjs-ng/tests/test_worker.js +43 -0
  190. package/native/vendor/quickjs-ng/tests/test_worker_module.js +30 -0
  191. package/native/vendor/quickjs-ng/tests.conf +14 -0
  192. package/native/vendor/quickjs-ng/unicode_download.sh +19 -0
  193. package/native/vendor/quickjs-ng/unicode_gen.c +3108 -0
  194. package/native/vendor/quickjs-ng/unicode_gen_def.h +310 -0
  195. package/native/vendor/quickjs-ng/update-version.sh +32 -0
  196. package/native/vendor/webview2/include/WebView2.h +60636 -0
  197. package/native/vendor/webview2/include/WebView2EnvironmentOptions.h +406 -0
  198. package/package.json +33 -0
  199. package/src/backend.ts +139 -0
  200. package/src/build-config.ts +87 -0
  201. package/src/build.ts +276 -0
  202. package/src/common.ts +195 -0
  203. package/src/config.ts +89 -0
  204. package/src/dev.ts +164 -0
  205. package/src/generate.ts +200 -0
  206. package/src/icons.ts +116 -0
  207. package/src/init.ts +190 -0
  208. package/src/package.ts +150 -0
  209. package/src/zapp-cli.ts +263 -0
@@ -0,0 +1,95 @@
1
+ // Shared QJS wrapper for TextEncoder/TextDecoder. Delegates to platform-specific core/encoding_core.zc.
2
+
3
+ raw {
4
+ #if defined(ZAPP_WORKER_ENGINE_QJS)
5
+ #include "quickjs.h"
6
+ uint8_t* zapp_core_text_encode(const char* input, size_t* out_len);
7
+ char* zapp_core_text_decode(const uint8_t* bytes, size_t len);
8
+
9
+ static JSValue qjs_bridge_textEncode(JSContext* ctx, JSValue this_val, int argc, JSValue* argv) {
10
+ (void)this_val;
11
+ if (argc < 1) return JS_NewArrayBufferCopy(ctx, NULL, 0);
12
+ const char* str = JS_ToCString(ctx, argv[0]);
13
+ if (!str) return JS_NewArrayBufferCopy(ctx, NULL, 0);
14
+
15
+ size_t len = 0;
16
+ uint8_t* bytes = zapp_core_text_encode(str, &len);
17
+ JS_FreeCString(ctx, str);
18
+
19
+ if (!bytes || len == 0) {
20
+ free(bytes);
21
+ JSValue global = JS_GetGlobalObject(ctx);
22
+ JSValue u8ctor = JS_GetPropertyStr(ctx, global, "Uint8Array");
23
+ JSValue arg = JS_NewInt32(ctx, 0);
24
+ JSValue result = JS_CallConstructor(ctx, u8ctor, 1, &arg);
25
+ JS_FreeValue(ctx, arg);
26
+ JS_FreeValue(ctx, u8ctor);
27
+ JS_FreeValue(ctx, global);
28
+ return result;
29
+ }
30
+
31
+ JSValue global = JS_GetGlobalObject(ctx);
32
+ JSValue u8ctor = JS_GetPropertyStr(ctx, global, "Uint8Array");
33
+ JSValue lenArg = JS_NewInt32(ctx, (int32_t)len);
34
+ JSValue u8arr = JS_CallConstructor(ctx, u8ctor, 1, &lenArg);
35
+ JS_FreeValue(ctx, lenArg);
36
+
37
+ size_t u8size = 0;
38
+ uint8_t* u8ptr = JS_GetArrayBuffer(ctx, &u8size,
39
+ JS_GetPropertyStr(ctx, u8arr, "buffer"));
40
+ if (u8ptr && u8size >= len) {
41
+ memcpy(u8ptr, bytes, len);
42
+ } else {
43
+ for (size_t i = 0; i < len; i++) {
44
+ JS_SetPropertyUint32(ctx, u8arr, (uint32_t)i, JS_NewInt32(ctx, bytes[i]));
45
+ }
46
+ }
47
+
48
+ free(bytes);
49
+ JS_FreeValue(ctx, u8ctor);
50
+ JS_FreeValue(ctx, global);
51
+ return u8arr;
52
+ }
53
+
54
+ static JSValue qjs_bridge_textDecode(JSContext* ctx, JSValue this_val, int argc, JSValue* argv) {
55
+ (void)this_val;
56
+ if (argc < 1) return JS_NewString(ctx, "");
57
+
58
+ size_t len = 0;
59
+ uint8_t* bytes = JS_GetArrayBuffer(ctx, &len, argv[0]);
60
+
61
+ if (!bytes) {
62
+ JSValue bufProp = JS_GetPropertyStr(ctx, argv[0], "buffer");
63
+ if (!JS_IsUndefined(bufProp)) {
64
+ size_t bufLen = 0;
65
+ uint8_t* bufPtr = JS_GetArrayBuffer(ctx, &bufLen, bufProp);
66
+ JSValue offsetVal = JS_GetPropertyStr(ctx, argv[0], "byteOffset");
67
+ JSValue lengthVal = JS_GetPropertyStr(ctx, argv[0], "byteLength");
68
+ int32_t offset = 0, length = 0;
69
+ JS_ToInt32(ctx, &offset, offsetVal);
70
+ JS_ToInt32(ctx, &length, lengthVal);
71
+ JS_FreeValue(ctx, offsetVal);
72
+ JS_FreeValue(ctx, lengthVal);
73
+
74
+ if (bufPtr && offset >= 0 && length > 0 && (size_t)(offset + length) <= bufLen) {
75
+ bytes = bufPtr + offset;
76
+ len = (size_t)length;
77
+ }
78
+ }
79
+ JS_FreeValue(ctx, bufProp);
80
+ }
81
+
82
+ if (!bytes || len == 0) return JS_NewString(ctx, "");
83
+
84
+ char* decoded = zapp_core_text_decode(bytes, len);
85
+ JSValue result = JS_NewString(ctx, decoded);
86
+ free(decoded);
87
+ return result;
88
+ }
89
+
90
+ void zapp_qjs_encoding_install(JSContext* ctx, JSValue bridge) {
91
+ JS_SetPropertyStr(ctx, bridge, "textEncode", JS_NewCFunction(ctx, qjs_bridge_textEncode, "textEncode", 1));
92
+ JS_SetPropertyStr(ctx, bridge, "textDecode", JS_NewCFunction(ctx, qjs_bridge_textDecode, "textDecode", 1));
93
+ }
94
+ #endif
95
+ }
@@ -0,0 +1,65 @@
1
+ // Shared QJS wrapper for URL parsing. Delegates to platform-specific core/url_core.zc.
2
+
3
+ raw {
4
+ #if defined(ZAPP_WORKER_ENGINE_QJS)
5
+ #include "quickjs.h"
6
+ #ifndef ZAPP_URL_PARSED_DEFINED
7
+ #define ZAPP_URL_PARSED_DEFINED 1
8
+ typedef struct zapp_url_parsed {
9
+ char* href;
10
+ char* protocol;
11
+ char* host;
12
+ char* hostname;
13
+ char* port;
14
+ char* pathname;
15
+ char* search;
16
+ char* hash;
17
+ char* origin;
18
+ char* username;
19
+ char* password;
20
+ } zapp_url_parsed_t;
21
+ #endif
22
+
23
+ int zapp_core_url_parse(const char* url_str, const char* base_str, zapp_url_parsed_t* out);
24
+ void zapp_core_url_free(zapp_url_parsed_t* c);
25
+
26
+ static JSValue qjs_bridge_urlParse(JSContext* ctx, JSValue this_val, int argc, JSValue* argv) {
27
+ (void)this_val;
28
+ if (argc < 1) return JS_NULL;
29
+
30
+ const char* urlStr = JS_ToCString(ctx, argv[0]);
31
+ if (!urlStr) return JS_NULL;
32
+
33
+ const char* baseStr = NULL;
34
+ if (argc >= 2 && !JS_IsUndefined(argv[1]) && !JS_IsNull(argv[1])) {
35
+ baseStr = JS_ToCString(ctx, argv[1]);
36
+ }
37
+
38
+ zapp_url_parsed_t c;
39
+ int err = zapp_core_url_parse(urlStr, baseStr, &c);
40
+ JS_FreeCString(ctx, urlStr);
41
+ if (baseStr) JS_FreeCString(ctx, baseStr);
42
+
43
+ if (err != 0) return JS_NULL;
44
+
45
+ JSValue obj = JS_NewObject(ctx);
46
+ JS_SetPropertyStr(ctx, obj, "href", JS_NewString(ctx, c.href));
47
+ JS_SetPropertyStr(ctx, obj, "protocol", JS_NewString(ctx, c.protocol));
48
+ JS_SetPropertyStr(ctx, obj, "host", JS_NewString(ctx, c.host));
49
+ JS_SetPropertyStr(ctx, obj, "hostname", JS_NewString(ctx, c.hostname));
50
+ JS_SetPropertyStr(ctx, obj, "port", JS_NewString(ctx, c.port));
51
+ JS_SetPropertyStr(ctx, obj, "pathname", JS_NewString(ctx, c.pathname));
52
+ JS_SetPropertyStr(ctx, obj, "search", JS_NewString(ctx, c.search));
53
+ JS_SetPropertyStr(ctx, obj, "hash", JS_NewString(ctx, c.hash));
54
+ JS_SetPropertyStr(ctx, obj, "origin", JS_NewString(ctx, c.origin));
55
+ JS_SetPropertyStr(ctx, obj, "username", JS_NewString(ctx, c.username));
56
+ JS_SetPropertyStr(ctx, obj, "password", JS_NewString(ctx, c.password));
57
+ zapp_core_url_free(&c);
58
+ return obj;
59
+ }
60
+
61
+ void zapp_qjs_url_install(JSContext* ctx, JSValue bridge) {
62
+ JS_SetPropertyStr(ctx, bridge, "urlParse", JS_NewCFunction(ctx, qjs_bridge_urlParse, "urlParse", 2));
63
+ }
64
+ #endif
65
+ }
@@ -0,0 +1,206 @@
1
+ // Worker Registry - Tracks per-window worker counters for logging
2
+
3
+ include <string.h>
4
+
5
+ raw {
6
+ #define ZAPP_MAX_WINDOWS 64
7
+ #define ZAPP_MAX_WORKER_ID_LEN 256
8
+
9
+ typedef struct {
10
+ char owner_id[ZAPP_MAX_WORKER_ID_LEN];
11
+ int window_id;
12
+ int next_worker_id;
13
+ } zapp_window_worker_counter_t;
14
+
15
+ static zapp_window_worker_counter_t g_window_worker_counters[ZAPP_MAX_WINDOWS];
16
+ static int g_window_counter_count = 0;
17
+ static int g_next_window_id = 1;
18
+
19
+ // Extract owner_id from worker_id (format: owner:ctx:zw-N)
20
+ static void zapp_extract_owner_id(const char* worker_id, char* owner_buf, size_t buf_len) {
21
+ if (!worker_id || !owner_buf || buf_len == 0) {
22
+ if (owner_buf && buf_len > 0) owner_buf[0] = '\0';
23
+ return;
24
+ }
25
+
26
+ // Find first colon
27
+ const char* colon = strchr(worker_id, ':');
28
+ if (!colon) {
29
+ strncpy(owner_buf, worker_id, buf_len - 1);
30
+ owner_buf[buf_len - 1] = '\0';
31
+ return;
32
+ }
33
+
34
+ size_t owner_len = colon - worker_id;
35
+ if (owner_len >= buf_len) owner_len = buf_len - 1;
36
+ strncpy(owner_buf, worker_id, owner_len);
37
+ owner_buf[owner_len] = '\0';
38
+ }
39
+
40
+ // Get window ID for an owner (creates if not exists)
41
+ static int zapp_get_window_id(const char* owner_id) {
42
+ if (!owner_id || owner_id[0] == '\0') return -1;
43
+
44
+ // Find existing window
45
+ for (int i = 0; i < g_window_counter_count; i++) {
46
+ if (strcmp(g_window_worker_counters[i].owner_id, owner_id) == 0) {
47
+ return g_window_worker_counters[i].window_id;
48
+ }
49
+ }
50
+
51
+ // Create new window entry
52
+ if (g_window_counter_count < ZAPP_MAX_WINDOWS) {
53
+ strncpy(g_window_worker_counters[g_window_counter_count].owner_id, owner_id, ZAPP_MAX_WORKER_ID_LEN - 1);
54
+ g_window_worker_counters[g_window_counter_count].owner_id[ZAPP_MAX_WORKER_ID_LEN - 1] = '\0';
55
+ g_window_worker_counters[g_window_counter_count].window_id = g_next_window_id++;
56
+ g_window_worker_counters[g_window_counter_count].next_worker_id = 0;
57
+ g_window_counter_count++;
58
+ return g_window_worker_counters[g_window_counter_count - 1].window_id;
59
+ }
60
+
61
+ return -1; // Too many windows
62
+ }
63
+
64
+ // Get or create a counter for a window (by owner_id)
65
+ static int zapp_get_next_worker_id(const char* owner_id) {
66
+ if (!owner_id || owner_id[0] == '\0') return -1;
67
+
68
+ // Find existing counter
69
+ for (int i = 0; i < g_window_counter_count; i++) {
70
+ if (strcmp(g_window_worker_counters[i].owner_id, owner_id) == 0) {
71
+ return ++g_window_worker_counters[i].next_worker_id;
72
+ }
73
+ }
74
+
75
+ // Create new counter (also assigns window ID)
76
+ if (g_window_counter_count < ZAPP_MAX_WINDOWS) {
77
+ strncpy(g_window_worker_counters[g_window_counter_count].owner_id, owner_id, ZAPP_MAX_WORKER_ID_LEN - 1);
78
+ g_window_worker_counters[g_window_counter_count].owner_id[ZAPP_MAX_WORKER_ID_LEN - 1] = '\0';
79
+ g_window_worker_counters[g_window_counter_count].window_id = g_next_window_id++;
80
+ g_window_worker_counters[g_window_counter_count].next_worker_id = 1;
81
+ g_window_counter_count++;
82
+ return 1;
83
+ }
84
+
85
+ return -1; // Too many windows
86
+ }
87
+
88
+ // Get both window ID and next worker ID in one call
89
+ static void zapp_get_window_and_worker_id(const char* owner_id, int* out_window_id, int* out_worker_id) {
90
+ if (!owner_id || owner_id[0] == '\0') {
91
+ if (out_window_id) *out_window_id = -1;
92
+ if (out_worker_id) *out_worker_id = -1;
93
+ return;
94
+ }
95
+
96
+ // Find existing
97
+ for (int i = 0; i < g_window_counter_count; i++) {
98
+ if (strcmp(g_window_worker_counters[i].owner_id, owner_id) == 0) {
99
+ if (out_window_id) *out_window_id = g_window_worker_counters[i].window_id;
100
+ if (out_worker_id) *out_worker_id = ++g_window_worker_counters[i].next_worker_id;
101
+ return;
102
+ }
103
+ }
104
+
105
+ // Create new
106
+ if (g_window_counter_count < ZAPP_MAX_WINDOWS) {
107
+ strncpy(g_window_worker_counters[g_window_counter_count].owner_id, owner_id, ZAPP_MAX_WORKER_ID_LEN - 1);
108
+ g_window_worker_counters[g_window_counter_count].owner_id[ZAPP_MAX_WORKER_ID_LEN - 1] = '\0';
109
+ g_window_worker_counters[g_window_counter_count].window_id = g_next_window_id++;
110
+ g_window_worker_counters[g_window_counter_count].next_worker_id = 1;
111
+ if (out_window_id) *out_window_id = g_window_worker_counters[g_window_counter_count].window_id;
112
+ if (out_worker_id) *out_worker_id = 1;
113
+ g_window_counter_count++;
114
+ return;
115
+ }
116
+
117
+ if (out_window_id) *out_window_id = -1;
118
+ if (out_worker_id) *out_worker_id = -1;
119
+ }
120
+
121
+ // Reset counter for a window (when window closes)
122
+ static void zapp_reset_window_workers(const char* owner_id) {
123
+ if (!owner_id) return;
124
+
125
+ for (int i = 0; i < g_window_counter_count; i++) {
126
+ if (strcmp(g_window_worker_counters[i].owner_id, owner_id) == 0) {
127
+ // Shift remaining counters
128
+ for (int j = i; j < g_window_counter_count - 1; j++) {
129
+ memcpy(&g_window_worker_counters[j], &g_window_worker_counters[j + 1], sizeof(zapp_window_worker_counter_t));
130
+ }
131
+ g_window_counter_count--;
132
+ return;
133
+ }
134
+ }
135
+ }
136
+
137
+ // Reset all counters
138
+ static void zapp_reset_all_window_workers(void) {
139
+ g_window_counter_count = 0;
140
+ g_next_window_id = 1;
141
+ }
142
+
143
+ // --- Per-worker ID registry (register once, lookup many) ---
144
+
145
+ #define ZAPP_MAX_REGISTERED_WORKERS 512
146
+
147
+ typedef struct {
148
+ char worker_id[ZAPP_MAX_WORKER_ID_LEN];
149
+ int window_id;
150
+ int worker_seq_id;
151
+ } zapp_registered_worker_t;
152
+
153
+ static zapp_registered_worker_t g_registered_workers[ZAPP_MAX_REGISTERED_WORKERS];
154
+ static int g_registered_worker_count = 0;
155
+
156
+ static void zapp_worker_register(const char* worker_id) {
157
+ if (!worker_id || worker_id[0] == '\0') return;
158
+ if (g_registered_worker_count >= ZAPP_MAX_REGISTERED_WORKERS) return;
159
+
160
+ for (int i = 0; i < g_registered_worker_count; i++) {
161
+ if (strcmp(g_registered_workers[i].worker_id, worker_id) == 0) return;
162
+ }
163
+
164
+ char owner_buf[256];
165
+ zapp_extract_owner_id(worker_id, owner_buf, sizeof(owner_buf));
166
+
167
+ int win_id = -1, seq_id = -1;
168
+ zapp_get_window_and_worker_id(owner_buf, &win_id, &seq_id);
169
+
170
+ zapp_registered_worker_t* w = &g_registered_workers[g_registered_worker_count++];
171
+ strncpy(w->worker_id, worker_id, ZAPP_MAX_WORKER_ID_LEN - 1);
172
+ w->worker_id[ZAPP_MAX_WORKER_ID_LEN - 1] = '\0';
173
+ w->window_id = win_id;
174
+ w->worker_seq_id = seq_id;
175
+ }
176
+
177
+ static void zapp_worker_lookup(const char* worker_id, int* out_window_id, int* out_worker_seq_id) {
178
+ if (!worker_id || worker_id[0] == '\0') {
179
+ if (out_window_id) *out_window_id = -1;
180
+ if (out_worker_seq_id) *out_worker_seq_id = -1;
181
+ return;
182
+ }
183
+ for (int i = 0; i < g_registered_worker_count; i++) {
184
+ if (strcmp(g_registered_workers[i].worker_id, worker_id) == 0) {
185
+ if (out_window_id) *out_window_id = g_registered_workers[i].window_id;
186
+ if (out_worker_seq_id) *out_worker_seq_id = g_registered_workers[i].worker_seq_id;
187
+ return;
188
+ }
189
+ }
190
+ if (out_window_id) *out_window_id = -1;
191
+ if (out_worker_seq_id) *out_worker_seq_id = -1;
192
+ }
193
+
194
+ static void zapp_worker_unregister(const char* worker_id) {
195
+ if (!worker_id) return;
196
+ for (int i = 0; i < g_registered_worker_count; i++) {
197
+ if (strcmp(g_registered_workers[i].worker_id, worker_id) == 0) {
198
+ for (int j = i; j < g_registered_worker_count - 1; j++) {
199
+ memcpy(&g_registered_workers[j], &g_registered_workers[j + 1], sizeof(zapp_registered_worker_t));
200
+ }
201
+ g_registered_worker_count--;
202
+ return;
203
+ }
204
+ }
205
+ }
206
+ }