quickwin 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/README.en.md +3 -0
  2. package/README.md +2 -0
  3. package/lib/abort.d.ts +21 -0
  4. package/lib/assert.d.ts +2 -0
  5. package/lib/bitmap.d.ts +7 -0
  6. package/lib/cache-utils.d.ts +6 -0
  7. package/lib/certs.d.ts +1 -0
  8. package/lib/dpi.d.ts +9 -0
  9. package/lib/dumpRects.d.ts +2 -0
  10. package/lib/exec-log.d.ts +23 -0
  11. package/lib/fetch.d.ts +4 -0
  12. package/lib/ffi/bind.d.ts +70 -0
  13. package/lib/ffi/ctype.d.ts +117 -0
  14. package/lib/ffi/index.d.ts +2 -0
  15. package/lib/ffi/struct.d.ts +174 -0
  16. package/lib/http-common.d.ts +143 -0
  17. package/lib/http-server.d.ts +59 -0
  18. package/lib/polyfill.d.ts +22 -0
  19. package/lib/react-qw/components/Button.d.ts +9 -0
  20. package/lib/react-qw/components/CheckBox.d.ts +11 -0
  21. package/lib/react-qw/components/ComboBox.d.ts +11 -0
  22. package/lib/react-qw/components/DateTimePicker.d.ts +15 -0
  23. package/lib/react-qw/components/Input.d.ts +15 -0
  24. package/lib/react-qw/components/Link.d.ts +12 -0
  25. package/lib/react-qw/components/ListBox.d.ts +13 -0
  26. package/lib/react-qw/components/ListView.d.ts +37 -0
  27. package/lib/react-qw/components/PathPicker.d.ts +23 -0
  28. package/lib/react-qw/components/ProgressBar.d.ts +9 -0
  29. package/lib/react-qw/components/RadioButton.d.ts +11 -0
  30. package/lib/react-qw/components/ScrollView.d.ts +9 -0
  31. package/lib/react-qw/components/Slider.d.ts +12 -0
  32. package/lib/react-qw/components/Tab.d.ts +14 -0
  33. package/lib/react-qw/components/Tooltip.d.ts +7 -0
  34. package/lib/react-qw/components/TreeView.d.ts +18 -0
  35. package/lib/react-qw/components/index.d.ts +16 -0
  36. package/lib/react-qw/index.d.ts +24 -0
  37. package/lib/react-qw/layout.d.ts +29 -0
  38. package/lib/react-qw/nmhdr.d.ts +1 -0
  39. package/lib/react-qw/props.d.ts +2 -0
  40. package/lib/react-qw/reconciler.d.ts +21 -0
  41. package/lib/stream.d.ts +20 -0
  42. package/lib/text-codec.d.ts +39 -0
  43. package/lib/text-measure.d.ts +14 -0
  44. package/lib/url.d.ts +54 -0
  45. package/lib/websocket.d.ts +73 -0
  46. package/lib/windows/{advapi32.ts → advapi32.d.ts} +6 -21
  47. package/lib/windows/comctl32.d.ts +14 -0
  48. package/lib/windows/comdlg32.d.ts +4 -0
  49. package/lib/windows/{gdi32.ts → gdi32.d.ts} +161 -98
  50. package/lib/windows/{kernel32.ts → kernel32.d.ts} +138 -115
  51. package/lib/windows/{msimg32.ts → msimg32.d.ts} +11 -14
  52. package/lib/windows/ntdll.d.ts +5 -0
  53. package/lib/windows/ole32.d.ts +3 -0
  54. package/lib/windows/{psapi.ts → psapi.d.ts} +9 -18
  55. package/lib/windows/{shell32.ts → shell32.d.ts} +25 -24
  56. package/lib/windows/structs.d.ts +3141 -0
  57. package/lib/windows/{user32.ts → user32.d.ts} +196 -193
  58. package/lib/windows/version.d.ts +27 -0
  59. package/lib/windows/{winspool.ts → winspool.d.ts} +18 -32
  60. package/package.json +15 -8
  61. package/qwin-nowasm-x86.exe +0 -0
  62. package/qwin-nowasm.exe +0 -0
  63. package/qwin-x86.exe +0 -0
  64. package/qwin.exe +0 -0
  65. package/examples/PdfCanvas.js +0 -38
  66. package/examples/PdfCanvas.tsx +0 -54
  67. package/examples/execd/main.js +0 -23379
  68. package/examples/execd/tray.js +0 -192
  69. package/examples/execd/worker.js +0 -122
  70. package/examples/pdf_preview2.js +0 -398
  71. package/examples/pdf_preview2.ts +0 -353
  72. package/examples/pdf_viewer.js +0 -22515
  73. package/examples/pdf_viewer.tsx +0 -228
  74. package/examples/test_gallery.js +0 -18692
  75. package/examples/test_gallery.tsx +0 -291
  76. package/examples/test_react_lazy.js +0 -18560
  77. package/examples/test_react_lazy.tsx +0 -65
  78. package/examples/test_react_listbox.js +0 -18562
  79. package/examples/test_react_listbox.tsx +0 -73
  80. package/examples/test_root_window.js +0 -18532
  81. package/examples/test_root_window.tsx +0 -41
  82. package/examples/test_tab.js +0 -18563
  83. package/examples/test_tab.tsx +0 -77
  84. package/examples/tray_demo.js +0 -86
  85. package/examples/tray_demo.tsx +0 -89
  86. package/lib/abort.ts +0 -69
  87. package/lib/assert.ts +0 -7
  88. package/lib/bitmap.ts +0 -39
  89. package/lib/cache-utils.ts +0 -40
  90. package/lib/certs.ts +0 -258
  91. package/lib/dpi.ts +0 -31
  92. package/lib/dumpRects.ts +0 -34
  93. package/lib/exec-log.ts +0 -30
  94. package/lib/fetch.ts +0 -589
  95. package/lib/ffi/bind.ts +0 -540
  96. package/lib/ffi/ctype.ts +0 -371
  97. package/lib/ffi/index.ts +0 -6
  98. package/lib/ffi/struct.ts +0 -780
  99. package/lib/http-common.ts +0 -441
  100. package/lib/http-server.ts +0 -604
  101. package/lib/polyfill.ts +0 -171
  102. package/lib/react-qw/components/index.ts +0 -17
  103. package/lib/react-qw/index.ts +0 -96
  104. package/lib/react-qw/layout.ts +0 -111
  105. package/lib/react-qw/nmhdr.ts +0 -7
  106. package/lib/react-qw/props.ts +0 -41
  107. package/lib/react-qw/reconciler.ts +0 -379
  108. package/lib/stream.ts +0 -22
  109. package/lib/text-codec.ts +0 -171
  110. package/lib/text-measure.ts +0 -44
  111. package/lib/url.ts +0 -201
  112. package/lib/websocket.ts +0 -600
  113. package/lib/windows/comctl32.ts +0 -20
  114. package/lib/windows/comdlg32.ts +0 -10
  115. package/lib/windows/ntdll.ts +0 -11
  116. package/lib/windows/ole32.ts +0 -9
  117. package/lib/windows/structs.ts +0 -807
  118. package/lib/windows/version.ts +0 -35
  119. package/test/add.wasm +0 -0
  120. package/test/bench_ffi_callraw.js +0 -235
  121. package/test/bench_ffi_callraw.ts +0 -235
  122. package/test/bench_ffi_overhead.js +0 -139
  123. package/test/bench_ffi_overhead.ts +0 -141
  124. package/test/bench_sendmessage.js +0 -104
  125. package/test/bench_sendmessage.ts +0 -100
  126. package/test/bench_sendmessage_nonnull.js +0 -187
  127. package/test/bench_sendmessage_nonnull.ts +0 -188
  128. package/test/complex.wasm +0 -0
  129. package/test/complex_imports.wasm +0 -0
  130. package/test/debug/http_server_e2e.js +0 -31
  131. package/test/debug/minwasm.js +0 -52
  132. package/test/debug/mupdf_debug.js +0 -86
  133. package/test/debug/wasm.js +0 -122
  134. package/test/debug/wasm_export_debug.js +0 -54
  135. package/test/debug/wasm_names.js +0 -36
  136. package/test/example.pdf +0 -0
  137. package/test/global_imports.wasm +0 -0
  138. package/test/import_func.wasm +0 -0
  139. package/test/imports.wasm +0 -0
  140. package/test/mupdf-cdn.js +0 -40
  141. package/test/mupdf-cdn.ts +0 -43
  142. package/test/run.js +0 -111
  143. package/test/run.ts +0 -116
  144. package/test/sjlj.wasm +0 -0
  145. package/test/test_basic.js +0 -7
  146. package/test/test_basic.ts +0 -9
  147. package/test/test_basic_fetch.js +0 -63
  148. package/test/test_basic_fetch.ts +0 -59
  149. package/test/test_brotli.js +0 -48
  150. package/test/test_brotli.ts +0 -52
  151. package/test/test_fetch_cache.js +0 -169
  152. package/test/test_fetch_cache.ts +0 -187
  153. package/test/test_ffi.js +0 -157
  154. package/test/test_ffi.ts +0 -170
  155. package/test/test_ffi_abi.js +0 -290
  156. package/test/test_ffi_abi.ts +0 -274
  157. package/test/test_ffi_array.js +0 -116
  158. package/test/test_ffi_array.ts +0 -141
  159. package/test/test_ffi_bind.js +0 -656
  160. package/test/test_ffi_bind.ts +0 -670
  161. package/test/test_ffi_struct.js +0 -779
  162. package/test/test_ffi_struct.ts +0 -828
  163. package/test/test_ffi_struct_layout.js +0 -495
  164. package/test/test_ffi_struct_layout.ts +0 -543
  165. package/test/test_ffi_user32.js +0 -103
  166. package/test/test_ffi_user32.ts +0 -113
  167. package/test/test_ffi_windows.js +0 -172
  168. package/test/test_ffi_windows.ts +0 -187
  169. package/test/test_files.js +0 -102
  170. package/test/test_files.ts +0 -121
  171. package/test/test_frame_encoding.js +0 -128
  172. package/test/test_frame_encoding.ts +0 -132
  173. package/test/test_gdi_draw.js +0 -681
  174. package/test/test_gdi_draw.ts +0 -725
  175. package/test/test_helper.js +0 -91
  176. package/test/test_helper.ts +0 -88
  177. package/test/test_http_import.js +0 -96
  178. package/test/test_http_import.ts +0 -93
  179. package/test/test_http_server.js +0 -214
  180. package/test/test_http_server.ts +0 -211
  181. package/test/test_import_dir.js +0 -4
  182. package/test/test_import_dir.ts +0 -5
  183. package/test/test_ipv6.js +0 -134
  184. package/test/test_ipv6.ts +0 -130
  185. package/test/test_jsx.js +0 -1314
  186. package/test/test_meta_url.js +0 -3
  187. package/test/test_meta_url.ts +0 -4
  188. package/test/test_mupdf_render.js +0 -51
  189. package/test/test_mupdf_render.ts +0 -55
  190. package/test/test_mupdf_twice.js +0 -62
  191. package/test/test_mupdf_twice.ts +0 -65
  192. package/test/test_mupdf_wasm.js +0 -39
  193. package/test/test_mupdf_wasm.ts +0 -32
  194. package/test/test_net_event.js +0 -57
  195. package/test/test_net_event.ts +0 -56
  196. package/test/test_net_fetch.js +0 -384
  197. package/test/test_net_fetch.ts +0 -373
  198. package/test/test_net_websocket.js +0 -180
  199. package/test/test_net_websocket.ts +0 -164
  200. package/test/test_polyfill.js +0 -144
  201. package/test/test_polyfill.ts +0 -159
  202. package/test/test_printer.js +0 -137
  203. package/test/test_printer.ts +0 -148
  204. package/test/test_proc.js +0 -141
  205. package/test/test_proc.ts +0 -163
  206. package/test/test_react_complex.js +0 -18678
  207. package/test/test_react_counter.js +0 -18555
  208. package/test/test_react_flex.js +0 -18871
  209. package/test/test_react_hidden.js +0 -18560
  210. package/test/test_react_listview_link.js +0 -18590
  211. package/test/test_react_notify.js +0 -18797
  212. package/test/test_react_render.js +0 -18550
  213. package/test/test_registry.js +0 -74
  214. package/test/test_registry.ts +0 -95
  215. package/test/test_sysinfo.js +0 -122
  216. package/test/test_sysinfo.ts +0 -141
  217. package/test/test_url.js +0 -173
  218. package/test/test_url.ts +0 -183
  219. package/test/test_wasm_basic.js +0 -85
  220. package/test/test_wasm_basic.ts +0 -73
  221. package/test/test_wasm_import_global.js +0 -41
  222. package/test/test_wasm_import_global.ts +0 -45
  223. package/test/test_wasm_sjlj.js +0 -145
  224. package/test/test_wasm_sjlj.ts +0 -125
  225. package/test/test_wasm_types.js +0 -97
  226. package/test/test_wasm_types.ts +0 -124
  227. package/test/test_wolfssl_read.js +0 -203
  228. package/test/test_wolfssl_read.ts +0 -184
  229. package/test/test_worker.js +0 -21
  230. package/test/test_worker.ts +0 -24
  231. package/test/test_worker_concurrent.js +0 -45
  232. package/test/test_worker_concurrent.ts +0 -56
  233. package/test/test_worker_data_url.js +0 -46
  234. package/test/test_worker_data_url.ts +0 -51
  235. package/test/test_worker_fetch.js +0 -26
  236. package/test/test_worker_fetch.ts +0 -27
  237. package/test/test_worker_net.js +0 -69
  238. package/test/test_worker_net.ts +0 -66
  239. package/test/test_worker_wasm_concurrent.js +0 -44
  240. package/test/test_worker_wasm_concurrent.ts +0 -45
  241. package/test/types.wasm +0 -0
  242. package/test/worker_fetch.js +0 -13
  243. package/test/worker_fetch.ts +0 -13
  244. package/test/worker_helper.js +0 -1
  245. package/test/worker_helper.ts +0 -1
  246. package/test/worker_http.js +0 -18
  247. package/test/worker_http.ts +0 -20
  248. package/test/worker_import_lib.js +0 -12
  249. package/test/worker_import_lib.ts +0 -13
  250. package/test/worker_module.js +0 -16
  251. package/test/worker_module.ts +0 -17
  252. package/test/worker_wasm_concurrent.js +0 -22
  253. package/test/worker_wasm_concurrent.ts +0 -22
@@ -1,77 +0,0 @@
1
- import '../lib/polyfill.js'
2
- import * as gui from 'gui'
3
- import { useState } from 'react'
4
- import { render, Button, Tab } from '../lib/react-qw/index.js'
5
- import { ShowWindowCmd, WindowStyle, WmMsg } from '../constants'
6
- import { PostQuitMessage, ShowWindow } from '../lib/windows/user32.js'
7
-
8
- gui.RegisterClass('TabDemo', (hwnd, msg, wParam, lParam) => {
9
- if (!hwnd) return gui.DefWindowProc(hwnd, msg, wParam, lParam)
10
- if (msg === WmMsg.DESTROY) {
11
- PostQuitMessage(0)
12
- return 0
13
- }
14
- return gui.DefWindowProc(hwnd, msg, wParam, lParam)
15
- })
16
-
17
- function App() {
18
- const [tabIndex, setTabIndex] = useState(0)
19
-
20
- return (
21
- <w type="STATIC"
22
- ws={WindowStyle.VISIBLE}
23
- style={{ flexDirection: 'column', width: 600, height: 400, padding: 10 }}
24
- >
25
- <Tab
26
- tabs={[
27
- {
28
- title: 'Counter',
29
- content: (
30
- <w type="STATIC"
31
- ws={WindowStyle.VISIBLE | WindowStyle.CLIPCHILDREN}
32
- style={{ flexDirection: 'column', gap: 10, padding: 10, width: 580, height: 300 }}>
33
- <Button onClick={() => setTabIndex(1)}>Go to Tab 2</Button>
34
- </w>
35
- ),
36
- },
37
- {
38
- title: 'Buttons',
39
- content: (
40
- <w type="STATIC"
41
- ws={WindowStyle.VISIBLE | WindowStyle.CLIPCHILDREN}
42
- style={{ flexDirection: 'row', gap: 10, padding: 10, width: 580, height: 300, alignItems: 'stretch' }}>
43
- <Button onClick={() => setTabIndex(2)}>Go to Tab 3</Button>
44
- <Button onClick={() => setTabIndex(0)} style={{ width: 120 }}>Back</Button>
45
- </w>
46
- ),
47
- },
48
- {
49
- title: 'Final',
50
- content: (
51
- <w type="STATIC"
52
- ws={WindowStyle.VISIBLE | WindowStyle.CLIPCHILDREN}
53
- style={{ flexDirection: 'column', gap: 10, padding: 10, width: 580, height: 300 }}>
54
- <Button onClick={() => setTabIndex(0)}>Back to Tab 1</Button>
55
- <Button onClick={() => setTabIndex(1)}>Back to Tab 2</Button>
56
- </w>
57
- ),
58
- },
59
- ]}
60
- style={{ flexGrow: 1 }}
61
- selectedIndex={tabIndex}
62
- onChange={(i) => setTabIndex(i)}
63
- />
64
- </w>
65
- )
66
- }
67
-
68
- const hwnd = gui.CreateWindow(
69
- 'TabDemo', 'Tab Demo',
70
- WindowStyle.OVERLAPPEDWINDOW,
71
- 100, 100, 640, 480, null, null
72
- )
73
-
74
- if (hwnd) {
75
- ShowWindow(hwnd, ShowWindowCmd.SHOWNORMAL)
76
- render(<App />, hwnd)
77
- }
@@ -1,86 +0,0 @@
1
- import * as gui from 'gui';
2
- import * as std from 'std';
3
- import { NULL } from '../lib/ffi/ctype.js';
4
- import { GetCursorPos, CreatePopupMenu, AppendMenu, TrackPopupMenu, DestroyMenu, GetSystemMetrics, LoadImageOrdinal, PostQuitMessage, SetForegroundWindow, ShowWindow } from '../lib/windows/user32.js';
5
- import { NOTIFYICONDATAW, POINT } from '../lib/windows/structs.js';
6
- import { ShellNotifyIcon } from '../lib/windows/shell32.js';
7
- import { createSystemDpiFont } from '../lib/dpi.js';
8
- const WM_TRAY = 0x8001;
9
- gui.RegisterClass('TrayApp', (hwnd, msg, wParam, lParam) => {
10
- if (msg === WM_TRAY) {
11
- const evt = lParam;
12
- if (evt === 513 /* WmMsg.LBUTTONDOWN */) {
13
- ShowWindow(hwnd, 5 /* ShowWindowCmd.SHOW */);
14
- SetForegroundWindow(hwnd);
15
- }
16
- else if (evt === 516 /* WmMsg.RBUTTONDOWN */ || evt === 123 /* WmMsg.CONTEXTMENU */) {
17
- SetForegroundWindow(hwnd);
18
- const pt = POINT.alloc();
19
- const pos = GetCursorPos(pt.ptr) ? POINT.decode(pt) : null;
20
- const x = pos ? pos.x : 0;
21
- const y = pos ? pos.y : 0;
22
- const hMenu = CreatePopupMenu();
23
- if (hMenu !== NULL) {
24
- AppendMenu(hMenu, 0, 1, '显示窗口');
25
- AppendMenu(hMenu, 2048 /* MenuFlag.SEPARATOR */, 0, NULL);
26
- AppendMenu(hMenu, 0, 2, '退出');
27
- const cmd = TrackPopupMenu(hMenu, 256 /* TrackPopupMenuFlag.RETURNCMD */ | 2 /* TrackPopupMenuFlag.RIGHTBUTTON */, x, y, 0, hwnd, NULL);
28
- DestroyMenu(hMenu);
29
- if (cmd === 1) {
30
- ShowWindow(hwnd, 5 /* ShowWindowCmd.SHOW */);
31
- }
32
- else if (cmd === 2) {
33
- ShellNotifyIcon(2 /* NotifyIconCmd.DELETE */, { cbSize: NOTIFYICONDATAW.size, hWnd: hwnd, uID: 1 });
34
- PostQuitMessage(0);
35
- }
36
- }
37
- }
38
- return 0;
39
- }
40
- if (msg === 16 /* WmMsg.CLOSE */) {
41
- ShowWindow(hwnd, 0 /* ShowWindowCmd.HIDE */);
42
- return 0;
43
- }
44
- return gui.DefWindowProc(hwnd, msg, wParam, lParam);
45
- });
46
- // 创建窗口
47
- const W = 500, H = 400;
48
- const scr = [GetSystemMetrics(0 /* SysMetrics.CXSCREEN */), GetSystemMetrics(1 /* SysMetrics.CYSCREEN */)];
49
- const x = (scr[0] - W) >> 1;
50
- const y = (scr[1] - H) >> 1;
51
- const hwnd = gui.CreateWindow('TrayApp', '系统托盘示例', 13565952 /* WindowStyle.OVERLAPPEDWINDOW */, x, y, W, H, null, null);
52
- if (!hwnd)
53
- std.exit(0);
54
- ShowWindow(hwnd, 1 /* ShowWindowCmd.SHOWNORMAL */);
55
- // 添加说明文字
56
- const style = 1073741824 /* WindowStyle.CHILD */ | 268435456 /* WindowStyle.VISIBLE */ | 4 /* EditStyle.MULTILINE */ | 2048 /* EditStyle.READONLY */;
57
- const text = gui.CreateWindow('EDIT', 'QuickWin 系统托盘示例\r\n'
58
- + '\r\n'
59
- + '右键点击托盘图标打开上下文菜单。\r\n'
60
- + '关闭此窗口将隐藏到托盘。\r\n'
61
- + '从菜单中选择"显示窗口"恢复窗口,"退出"结束程序。', style, 15, 15, W - 30, H - 70, hwnd, null);
62
- if (text) {
63
- const font = createSystemDpiFont();
64
- if (font)
65
- gui.SendMessage(text, 48 /* WmMsg.SETFONT */, font, 1);
66
- }
67
- // LoadImageW 返回的句柄随 uType 变(HICON/HCURSOR/HBITMAP),绑定只能给裸地址档;
68
- // LoadAppIcon 的 HICON 是同一档的品牌子型,故变量按裸地址声明
69
- let hIcon = gui.LoadAppIcon();
70
- if (!hIcon)
71
- hIcon = LoadImageOrdinal(NULL, 32512 /* IDI.APPLICATION */, 1 /* ImageType.ICON */, 0, 0, 32768 /* LoadImageFlag.SHARED */);
72
- if (hIcon) {
73
- const ok = ShellNotifyIcon(0 /* NotifyIconCmd.ADD */, {
74
- cbSize: NOTIFYICONDATAW.size,
75
- hWnd: hwnd, uID: 1,
76
- uFlags: 1 /* NotifyIconFlag.MESSAGE */ | 2 /* NotifyIconFlag.ICON */,
77
- uCallbackMessage: WM_TRAY,
78
- hIcon,
79
- });
80
- std.out.printf('tray icon %s\n', ok ? 'added' : 'FAILED');
81
- std.out.flush();
82
- }
83
- else {
84
- std.out.printf('failed to load icon\n');
85
- std.out.flush();
86
- }
@@ -1,89 +0,0 @@
1
- import * as gui from 'gui'
2
- import * as std from 'std'
3
- import { NULL, type MaybePtr } from '../lib/ffi/ctype.js'
4
- import { GetCursorPos, CreatePopupMenu, AppendMenu, TrackPopupMenu, DestroyMenu, GetSystemMetrics, LoadImageOrdinal, PostQuitMessage, SetForegroundWindow, ShowWindow } from '../lib/windows/user32.js'
5
- import { NOTIFYICONDATAW, POINT } from '../lib/windows/structs.js'
6
- import { ShellNotifyIcon } from '../lib/windows/shell32.js'
7
- import { createSystemDpiFont } from '../lib/dpi.js'
8
- import { EditStyle, IDI, ImageType, LoadImageFlag, MenuFlag, NotifyIconCmd, NotifyIconFlag, ShowWindowCmd, SysMetrics, TrackPopupMenuFlag, WindowStyle, WmMsg } from '../constants'
9
-
10
- const WM_TRAY = 0x8001
11
-
12
- gui.RegisterClass('TrayApp', (hwnd, msg, wParam, lParam) => {
13
- if (msg === WM_TRAY) {
14
- const evt = lParam
15
- if (evt === WmMsg.LBUTTONDOWN) {
16
- ShowWindow(hwnd, ShowWindowCmd.SHOW)
17
- SetForegroundWindow(hwnd)
18
- } else if (evt === WmMsg.RBUTTONDOWN || evt === WmMsg.CONTEXTMENU) {
19
- SetForegroundWindow(hwnd)
20
- const pt = POINT.alloc()
21
- const pos = GetCursorPos(pt.ptr) ? POINT.decode(pt) : null
22
- const x = pos ? pos.x : 0
23
- const y = pos ? pos.y : 0
24
- const hMenu = CreatePopupMenu()
25
- if (hMenu !== NULL) {
26
- AppendMenu(hMenu, 0, 1, '显示窗口')
27
- AppendMenu(hMenu, MenuFlag.SEPARATOR, 0, NULL)
28
- AppendMenu(hMenu, 0, 2, '退出')
29
- const cmd = TrackPopupMenu(hMenu, TrackPopupMenuFlag.RETURNCMD | TrackPopupMenuFlag.RIGHTBUTTON, x, y, 0, hwnd, NULL)
30
- DestroyMenu(hMenu)
31
- if (cmd === 1) {
32
- ShowWindow(hwnd, ShowWindowCmd.SHOW)
33
- } else if (cmd === 2) {
34
- ShellNotifyIcon(NotifyIconCmd.DELETE, { cbSize: NOTIFYICONDATAW.size, hWnd: hwnd, uID: 1 })
35
- PostQuitMessage(0)
36
- }
37
- }
38
- }
39
- return 0
40
- }
41
- if (msg === WmMsg.CLOSE) {
42
- ShowWindow(hwnd, ShowWindowCmd.HIDE)
43
- return 0
44
- }
45
- return gui.DefWindowProc(hwnd, msg, wParam, lParam)
46
- })
47
-
48
- // 创建窗口
49
- const W = 500, H = 400
50
- const scr: [number, number] = [GetSystemMetrics(SysMetrics.CXSCREEN), GetSystemMetrics(SysMetrics.CYSCREEN)]
51
- const x = (scr[0] - W) >> 1
52
- const y = (scr[1] - H) >> 1
53
- const hwnd = gui.CreateWindow('TrayApp', '系统托盘示例', WindowStyle.OVERLAPPEDWINDOW, x, y, W, H, null, null)
54
- if (!hwnd) std.exit(0)
55
- ShowWindow(hwnd, ShowWindowCmd.SHOWNORMAL)
56
-
57
- // 添加说明文字
58
- const style = WindowStyle.CHILD | WindowStyle.VISIBLE | EditStyle.MULTILINE | EditStyle.READONLY
59
- const text = gui.CreateWindow('EDIT',
60
- 'QuickWin 系统托盘示例\r\n'
61
- + '\r\n'
62
- + '右键点击托盘图标打开上下文菜单。\r\n'
63
- + '关闭此窗口将隐藏到托盘。\r\n'
64
- + '从菜单中选择"显示窗口"恢复窗口,"退出"结束程序。',
65
- style, 15, 15, W - 30, H - 70, hwnd, null)
66
- if (text) {
67
- const font = createSystemDpiFont()
68
- if (font)
69
- gui.SendMessage(text, WmMsg.SETFONT, font, 1)
70
- }
71
-
72
- // LoadImageW 返回的句柄随 uType 变(HICON/HCURSOR/HBITMAP),绑定只能给裸地址档;
73
- // LoadAppIcon 的 HICON 是同一档的品牌子型,故变量按裸地址声明
74
- let hIcon: MaybePtr<''> | null = gui.LoadAppIcon()
75
- if (!hIcon) hIcon = LoadImageOrdinal(NULL, IDI.APPLICATION, ImageType.ICON, 0, 0, LoadImageFlag.SHARED)
76
- if (hIcon) {
77
- const ok = ShellNotifyIcon(NotifyIconCmd.ADD, {
78
- cbSize: NOTIFYICONDATAW.size,
79
- hWnd: hwnd, uID: 1,
80
- uFlags: NotifyIconFlag.MESSAGE | NotifyIconFlag.ICON,
81
- uCallbackMessage: WM_TRAY,
82
- hIcon,
83
- })
84
- std.out.printf('tray icon %s\n', ok ? 'added' : 'FAILED')
85
- std.out.flush()
86
- } else {
87
- std.out.printf('failed to load icon\n')
88
- std.out.flush()
89
- }
package/lib/abort.ts DELETED
@@ -1,69 +0,0 @@
1
- // ── Minimal AbortSignal / AbortController ──
2
- //
3
- // quickwin has no EventTarget/DOM runtime, so this is a self-contained,
4
- // dependency-free subset of the WHATWG API used for client-disconnect
5
- // notifications on the HTTP server (and fetch cancellation).
6
- //
7
- // Semantics mirror the web platform on the points that matter:
8
- // - abort() fires listeners synchronously (same call stack), once, idempotently;
9
- // - listeners registered AFTER the signal already aborted are ignored
10
- // (late listeners are never called); consumers must pre-check signal.aborted.
11
-
12
- export interface AbortEvent {
13
- readonly type: 'abort'
14
- readonly target: unknown
15
- }
16
-
17
- export class AbortSignal {
18
- private _aborted = false
19
- private _reason: unknown = undefined
20
- private _listeners: ((e: AbortEvent) => void)[] = []
21
- onabort: ((e: AbortEvent) => void) | null = null
22
-
23
- get aborted(): boolean {
24
- return this._aborted
25
- }
26
-
27
- get reason(): unknown {
28
- return this._reason
29
- }
30
-
31
- addEventListener(type: string, listener: (e: AbortEvent) => void): void {
32
- if (this._aborted || type !== 'abort') return
33
- this._listeners.push(listener)
34
- }
35
-
36
- removeEventListener(type: string, listener: (e: AbortEvent) => void): void {
37
- if (this._aborted || type !== 'abort') return
38
- const i = this._listeners.indexOf(listener)
39
- if (i >= 0) this._listeners.splice(i, 1)
40
- }
41
-
42
- /** @internal fired by AbortController.abort() */
43
- _fire(reason: unknown): void {
44
- if (this._aborted) return
45
- this._aborted = true
46
- this._reason = reason
47
- const ev: AbortEvent = { type: 'abort', target: this }
48
- const ls = this._listeners
49
- this._listeners = []
50
- if (this.onabort) {
51
- try { this.onabort(ev) } catch (e) { console.error('[abort] onabort handler error:', e) }
52
- }
53
- for (const l of ls) {
54
- try { l(ev) } catch (e) { console.error('[abort] listener error:', e) }
55
- }
56
- }
57
-
58
- throwIfAborted(): void {
59
- if (this._aborted) throw this._reason
60
- }
61
- }
62
-
63
- export class AbortController {
64
- readonly signal = new AbortSignal()
65
-
66
- abort(reason?: unknown): void {
67
- this.signal._fire(reason)
68
- }
69
- }
package/lib/assert.ts DELETED
@@ -1,7 +0,0 @@
1
- export function assertNonNullable<T>(v: T, msg?: string): asserts v is NonNullable<T> {
2
- if (v === null || v === undefined) throw new Error(msg ?? `Assert failed: unexpected ${v}`)
3
- }
4
-
5
- export function assertArrayBuffer(v: ArrayBufferLike): asserts v is ArrayBuffer {
6
- if (!(v instanceof ArrayBuffer)) throw new Error('Assert failed: expected ArrayBuffer')
7
- }
package/lib/bitmap.ts DELETED
@@ -1,39 +0,0 @@
1
- // 按像素建位图 —— gui 模块下沉到 JS 层的复合逻辑(原 js_createBitmapFromPixels)。
2
- // 旧 C 体是 CreateDIBSection + memcpy 直写位数据;FFI 侧没有「JS 缓冲 → 原生地址」的
3
- // 批量写原语(ffi 只导出 readBytes / writeByte,逐字节循环不值当),改用 GDI 自带的
4
- // SetDIBits 把调用方缓冲装进 DIB 段:ColorUse.RGB_COLORS 下 hdc 被忽略(MSDN:
5
- // "used only if the DIB_PAL_COLORS constant is set ... otherwise it is ignored"),
6
- // 双机实测传 NULL 可用、GetDIBits 读回逐字节一致(含 alpha),与旧 C 的 memcpy 等价。
7
- import { NULL, PtrArrayBuffer, type MaybePtr } from './ffi/ctype.js'
8
- import { CreateDIBSection, DeleteObject, SetDIBits } from './windows/gdi32.js'
9
- import { BITMAPINFOHEADER } from './windows/structs.js'
10
- import { ColorUse } from '../constants'
11
-
12
- /** 建 32bpp 自顶向下 DIB 段位图(像素为 BGRA,[B,G,R,A] 字节序,alpha 保留 —— 可喂
13
- * ImageListAdd(ILC_COLOR32) 等)。width/height ≤ 0 或像素缓冲不足 width*height*4 →
14
- * NULL(同旧 gui.CreateBitmapFromPixels 语义:非法入参静默返空,由调用方按「无图」处理);
15
- * GDI 失败同样返 NULL(已建的位图当场回收)。
16
- * 位图归调用方所有:用完 DeleteObject。 */
17
- export function createBitmapFromPixels(width: number, height: number, pixels: ArrayBuffer): MaybePtr<'HGDIOBJ'> {
18
- if (width <= 0 || height <= 0) return NULL
19
- const len = width * height * 4
20
- if (pixels.byteLength < len) return NULL
21
- // 32bpp BI_RGB:头部即全部(无颜色表);负 biHeight = 自顶向下,与 JS 缓冲行序一致
22
- const bi = BITMAPINFOHEADER.encode({
23
- biSize: BITMAPINFOHEADER.size,
24
- biWidth: width,
25
- biHeight: -height,
26
- biPlanes: 1,
27
- biBitCount: 32,
28
- })
29
- const hbm = CreateDIBSection(NULL, bi.ptr, ColorUse.RGB_COLORS, NULL, NULL, 0)
30
- if (!hbm) return NULL
31
- // 像素先落自有原生缓冲(BYTE.encode 需带 .ptr 的缓冲),再让 GDI 装进 DIB 段
32
- const src = new PtrArrayBuffer<'BYTE'>(len)
33
- new Uint8Array(src).set(new Uint8Array(pixels, 0, len))
34
- if (SetDIBits(NULL, hbm, 0, height, src, bi.ptr, ColorUse.RGB_COLORS) !== height) {
35
- DeleteObject(hbm)
36
- return NULL
37
- }
38
- return hbm
39
- }
@@ -1,40 +0,0 @@
1
- // ── INI-format cache helpers ──
2
-
3
- export interface IniCache {
4
- headers: Record<string, string>
5
- meta: Record<string, string>
6
- }
7
-
8
- export function parseIni(text: string): IniCache {
9
- const headers: Record<string, string> = {}
10
- const meta: Record<string, string> = {}
11
- let section = ''
12
- for (const line of text.split('\n')) {
13
- const trimmed = line.trim()
14
- if (trimmed === '[headers]') { section = 'headers'; continue }
15
- if (trimmed === '[meta]') { section = 'meta'; continue }
16
- if (!section || !trimmed) continue
17
- const colon = trimmed.indexOf(':')
18
- if (colon < 0) continue
19
- const key = trimmed.slice(0, colon).trim()
20
- const val = trimmed.slice(colon + 1).trim()
21
- if (section === 'headers') headers[key] = val
22
- else if (section === 'meta') meta[key] = val
23
- }
24
- return { headers, meta }
25
- }
26
-
27
- export function toIni(headers: Record<string, string>, meta: Record<string, string>): string {
28
- let s = ''
29
- if (Object.keys(headers).length > 0) {
30
- s += '[headers]\n'
31
- for (const k in headers) {
32
- s += k + ': ' + headers[k] + '\n'
33
- }
34
- }
35
- s += '[meta]\n'
36
- for (const k in meta) {
37
- s += k + ': ' + meta[k] + '\n'
38
- }
39
- return s
40
- }
package/lib/certs.ts DELETED
@@ -1,258 +0,0 @@
1
- // ── Trusted CA bundle ──
2
- //
3
- // XP SP3 ships a root store frozen in 2008, so modern chains terminate
4
- // in roots the OS does not know. Those roots are inlined here instead of
5
- // being read from disk at handshake time: they travel inside the JS
6
- // bundle and are pushed into wolfSSL's process-wide trust store as soon
7
- // as this module is imported.
8
- //
9
- // The process-wide store has a fixed QW_CA_SLOTS (16) capacity; this
10
- // bundle uses 8, leaving headroom for future anchors. If the bundle
11
- // ever outgrows it, raise QW_CA_SLOTS in src/quickjs-wolfssl.c first —
12
- // a full store throws at import time.
13
- //
14
- // Each anchor covers a different root hierarchy, and none is
15
- // interchangeable: wolfSSL resolves a CA by AKID/SKID and does not walk
16
- // every candidate, so a missing anchor fails the handshake with
17
- // ASN_NO_SIGNER_E rather than falling back.
18
- //
19
- // * GLOBALSIGN_R3 — cross-signed R3 (issued by R1, notAfter 2028-01-28,
20
- // SHA256 44:5E:EC:78:...:94:3D:4E:BB, RSA 2048). This is what the
21
- // post-2018 GlobalSign intermediates chain to: baidu.com, cdn.jsdelivr,
22
- // bilibili.com, jd.com.
23
- // * GLOBALSIGN_R1 — self-signed R1, the signer of the cross-signed R3.
24
- // * USERTRUST_ECC_CA — cross-signature parent of Sectigo Root E46
25
- // (github.com), EC P-384.
26
- // * DIGICERT_GLOBAL_G2 — cross-signature parent of Microsoft TLS RSA Root
27
- // G2 (bing.com), RSA 2048.
28
- // * GLOBALSIGN_R46, ISRG_X1, ISRG_X2 — the newer GlobalSign R46 and
29
- // Let's Encrypt hierarchies (taobao.com, qq.com).
30
- // * GTS_R4 — cross-signed GTS Root R4 (issued by GlobalSign Root CA,
31
- // notAfter 2028-01-28, EC P-256). unpkg.com and other properties
32
- // whose chains terminate at Google Trust Services (WE1/E5/E6
33
- // intermediates).
34
- //
35
- // Known limitation (wolfSSL, not the bundle): GLOBALSIGN_R46 and ISRG_X1
36
- // are RSA 4096, and this wolfSSL build compiles the SP bignum with
37
- // SP_INT_BITS=3072 (the default when no FFDHE >= 4096 is enabled, see
38
- // wolfcrypt/sp_int.h), so RSA_MAX_SIZE resolves to 3072 and wc_RsaVerify
39
- // rejects a 4096-bit key with WC_KEY_SIZE_E (-234). asn.c flattens every
40
- // crypto failure to ASN_SIG_CONFIRM_E, so those handshakes surface as
41
- // -155. Raising SP_INT_BITS to 4096 in WOLFSSL_CMAKE_OPTS clears it; until
42
- // then taobao.com, qq.com and bing.com fail.
43
- //
44
- // Import this module wherever the bundle needs to trust the public web.
45
- // It is a no-op side effect: entries are registered at import time and
46
- // picked up lazily by fetch()/WebSocket/the C module loader.
47
-
48
- import * as wolfssl from 'wolfssl'
49
-
50
- const GLOBALSIGN_R3 = `-----BEGIN CERTIFICATE-----
51
- MIIETjCCAzagAwIBAgINAe5fFp3/lzUrZGXWajANBgkqhkiG9w0BAQsFADBXMQsw
52
- CQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMH
53
- Um9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTE4MDkxOTAw
54
- MDAwMFoXDTI4MDEyODEyMDAwMFowTDEgMB4GA1UECxMXR2xvYmFsU2lnbiBSb290
55
- IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNp
56
- Z24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMJXaQeQZ4Ihb1wIO2
57
- hMoonv0FdhHFrYhy/EYCQ8eyip0EXyTLLkvhYIJG4VKrDIFHcGzdZNHr9SyjD4I9
58
- DCuul9e2FIYQebs7E4B3jAjhSdJqYi8fXvqWaN+JJ5U4nwbXPsnLJlkNc96wyOkm
59
- DoMVxu9bi9IEYMpJpij2aTv2y8gokeWdimFXN6x0FNx04Druci8unPvQu7/1PQDh
60
- BjPogiuuU6Y6FnOM3UEOIDrAtKeh6bJPkC4yYOlXy7kEkmho5TgmYHWyn3f/kRTv
61
- riBJ/K1AFUjRAjFhGV64l++td7dkmnq/X8ET75ti+w1s4FRpFqkD2m7pg5NxdsZp
62
- hYIXAgMBAAGjggEiMIIBHjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
63
- /zAdBgNVHQ4EFgQUj/BLf6guRSSuTVD6Y5qL3uLdG7wwHwYDVR0jBBgwFoAUYHtm
64
- GkUNl8qJUC99BM00qP/8/UswPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFo
65
- dHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9yb290cjEwMwYDVR0fBCwwKjAooCag
66
- JIYiaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9yb290LmNybDBHBgNVHSAEQDA+
67
- MDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5j
68
- b20vcmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBACNw6c/ivvVZrpRCb8RD
69
- M6rNPzq5ZBfyYgZLSPFAiAYXof6r0V88xjPy847dHx0+zBpgmYILrMf8fpqHKqV9
70
- D6ZX7qw7aoXW3r1AY/itpsiIsBL89kHfDwmXHjjqU5++BfQ+6tOfUBJ2vgmLwgtI
71
- fR4uUfaNU9OrH0Abio7tfftPeVZwXwzTjhuzp3ANNyuXlava4BJrHEDOxcd+7cJi
72
- WOx37XMiwor1hkOIreoTbv3Y/kIvuX1erRjvlJDKPSerJpSZdcfL03v3ykzTr1Eh
73
- kluEfSufFT90y1HonoMOFm8b50bOI7355KKL0jlrqnkckSziYSQtjipIcJDEHsXo
74
- 4HA=
75
- -----END CERTIFICATE-----
76
- `
77
-
78
- const GLOBALSIGN_R1 = `-----BEGIN CERTIFICATE-----
79
- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
80
- A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
81
- b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
82
- MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
83
- YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
84
- aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
85
- jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
86
- xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
87
- 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
88
- snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
89
- U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
90
- 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
91
- BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
92
- AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
93
- yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
94
- 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
95
- AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
96
- DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
97
- HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
98
- -----END CERTIFICATE-----
99
- `
100
-
101
- const USERTRUST_ECC_CA = `-----BEGIN CERTIFICATE-----
102
- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
103
- MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
104
- eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
105
- JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
106
- MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
107
- Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
108
- VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
109
- aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
110
- I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
111
- o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
112
- A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
113
- VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
114
- zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
115
- RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
116
- -----END CERTIFICATE-----`
117
-
118
- const DIGICERT_GLOBAL_G2 = `-----BEGIN CERTIFICATE-----
119
- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
120
- MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
121
- d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
122
- MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
123
- MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
124
- b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
125
- 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
126
- 2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
127
- 1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
128
- q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
129
- tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
130
- vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
131
- BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
132
- 5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
133
- 1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
134
- NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
135
- Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
136
- 8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
137
- pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
138
- MrY=
139
- -----END CERTIFICATE-----`
140
-
141
- const GLOBALSIGN_R46 = `-----BEGIN CERTIFICATE-----
142
- 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
- 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
- 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
- MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt
146
- 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
- AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ
148
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt
165
- 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
- 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
- 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
- 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
- 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
- vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6
171
- -----END CERTIFICATE-----`
172
-
173
- const ISRG_X1 = `-----BEGIN CERTIFICATE-----
174
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
203
- -----END CERTIFICATE-----`
204
-
205
- const ISRG_X2 = `-----BEGIN CERTIFICATE-----
206
- MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
207
- CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
208
- R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
209
- MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
210
- ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
211
- EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
212
- +1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
213
- ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
214
- AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
215
- zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
216
- tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
217
- /q4AaOeMSQ+2b1tbFfLn
218
- -----END CERTIFICATE-----`
219
-
220
- const GTS_R4 = `-----BEGIN CERTIFICATE-----
221
- MIIDejCCAmKgAwIBAgIQf+UwvzMTQ77dghYQST2KGzANBgkqhkiG9w0BAQsFADBX
222
- MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UE
223
- CxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIzMTEx
224
- NTAzNDMyMVoXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoT
225
- GUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFI0
226
- MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE83Rzp2iLYK5DuDXFgTB7S0md+8Fhzube
227
- Rr1r1WEYNa5A3XP3iZEwWus87oV8okB2O6nGuEfYKueSkWpz6bFyOZ8pn6KY019e
228
- WIZlD6GEZQbR3IvJx3PIjGov5cSr0R2Ko4H/MIH8MA4GA1UdDwEB/wQEAwIBhjAd
229
- BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDwYDVR0TAQH/BAUwAwEB/zAd
230
- BgNVHQ4EFgQUgEzW63T/STaj1dj8tT7FavCUHYwwHwYDVR0jBBgwFoAUYHtmGkUN
231
- l8qJUC99BM00qP/8/UswNgYIKwYBBQUHAQEEKjAoMCYGCCsGAQUFBzAChhpodHRw
232
- Oi8vaS5wa2kuZ29vZy9nc3IxLmNydDAtBgNVHR8EJjAkMCKgIKAehhxodHRwOi8v
233
- Yy5wa2kuZ29vZy9yL2dzcjEuY3JsMBMGA1UdIAQMMAowCAYGZ4EMAQIBMA0GCSqG
234
- SIb3DQEBCwUAA4IBAQAYQrsPBtYDh5bjP2OBDwmkoWhIDDkic574y04tfzHpn+cJ
235
- odI2D4SseesQ6bDrarZ7C30ddLibZatoKiws3UL9xnELz4ct92vID24FfVbiI1hY
236
- +SW6FoVHkNeWIP0GCbaM4C6uVdF5dTUsMVs/ZbzNnIdCp5Gxmx5ejvEau8otR/Cs
237
- kGN+hr/W5GvT1tMBjgWKZ1i4//emhA1JG1BbPzoLJQvyEotc03lXjTaCzv8mEbep
238
- 8RqZ7a2CPsgRbuvTPBwcOMBBmuFeU88+FSBX6+7iP0il8b4Z0QFqIwwMHfs/L6K1
239
- vepuoxtGzi4CZ68zJpiq1UvSqTbFJjtbD4seiMHl
240
- -----END CERTIFICATE-----`
241
-
242
- // Register at import time. Importers of this module get the anchors
243
- // without writing any code themselves. addTrustedCA only returns the
244
- // slot count (-1 when full/empty); the fatal-vs-not decision is ours.
245
- function trust(pem: string): void {
246
- if (wolfssl.addTrustedCA(pem) < 0)
247
- throw new Error('certs: trust store full or empty PEM')
248
- }
249
- trust(GLOBALSIGN_R3)
250
- trust(GLOBALSIGN_R1)
251
- trust(USERTRUST_ECC_CA)
252
- trust(DIGICERT_GLOBAL_G2)
253
- trust(GLOBALSIGN_R46)
254
- trust(ISRG_X1)
255
- trust(ISRG_X2)
256
- trust(GTS_R4)
257
-
258
- export const TRUSTED_CA_COUNT = 8