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
package/README.en.md CHANGED
@@ -157,6 +157,9 @@ Both sides must set `onmessage = null` when communication is complete. This rele
157
157
 
158
158
  ## Examples
159
159
 
160
+ The example scripts live in the repository (**not shipped in the npm package**,
161
+ which only carries the exes, main.js, lib and the type declarations):
162
+
160
163
  ```bash
161
164
  .\qwin.exe examples/tray_demo.js # system tray app
162
165
  .\qwin.exe examples/pdf_preview2.js # PDF reader with mupdf
package/README.md CHANGED
@@ -155,6 +155,8 @@ parent.onmessage = (e) => {
155
155
 
156
156
  ## 示例
157
157
 
158
+ 示例脚本在仓库里(**不随 npm 包发布**,包内只有 exe、main.js、lib 与类型声明):
159
+
158
160
  ```bash
159
161
  .\qwin.exe examples/tray_demo.js # 系统托盘应用
160
162
  .\qwin.exe examples/pdf_preview2.js # 基于 mupdf 的 PDF 阅读器
package/lib/abort.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ export interface AbortEvent {
2
+ readonly type: 'abort';
3
+ readonly target: unknown;
4
+ }
5
+ export declare class AbortSignal {
6
+ private _aborted;
7
+ private _reason;
8
+ private _listeners;
9
+ onabort: ((e: AbortEvent) => void) | null;
10
+ get aborted(): boolean;
11
+ get reason(): unknown;
12
+ addEventListener(type: string, listener: (e: AbortEvent) => void): void;
13
+ removeEventListener(type: string, listener: (e: AbortEvent) => void): void;
14
+ /** @internal fired by AbortController.abort() */
15
+ _fire(reason: unknown): void;
16
+ throwIfAborted(): void;
17
+ }
18
+ export declare class AbortController {
19
+ readonly signal: AbortSignal;
20
+ abort(reason?: unknown): void;
21
+ }
@@ -0,0 +1,2 @@
1
+ export declare function assertNonNullable<T>(v: T, msg?: string): asserts v is NonNullable<T>;
2
+ export declare function assertArrayBuffer(v: ArrayBufferLike): asserts v is ArrayBuffer;
@@ -0,0 +1,7 @@
1
+ import { type MaybePtr } from './ffi/ctype.js';
2
+ /** 建 32bpp 自顶向下 DIB 段位图(像素为 BGRA,[B,G,R,A] 字节序,alpha 保留 —— 可喂
3
+ * ImageListAdd(ILC_COLOR32) 等)。width/height ≤ 0 或像素缓冲不足 width*height*4 →
4
+ * NULL(同旧 gui.CreateBitmapFromPixels 语义:非法入参静默返空,由调用方按「无图」处理);
5
+ * GDI 失败同样返 NULL(已建的位图当场回收)。
6
+ * 位图归调用方所有:用完 DeleteObject。 */
7
+ export declare function createBitmapFromPixels(width: number, height: number, pixels: ArrayBuffer): MaybePtr<'HGDIOBJ'>;
@@ -0,0 +1,6 @@
1
+ export interface IniCache {
2
+ headers: Record<string, string>;
3
+ meta: Record<string, string>;
4
+ }
5
+ export declare function parseIni(text: string): IniCache;
6
+ export declare function toIni(headers: Record<string, string>, meta: Record<string, string>): string;
package/lib/certs.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare const TRUSTED_CA_COUNT = 8;
package/lib/dpi.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { NULL, type Ptr } from './ffi/ctype.js';
2
+ /** 屏幕缩放系数(96 DPI = 1):GetDC(NULL) → GetDeviceCaps(LOGPIXELSX) → ReleaseDC 成对释放 */
3
+ export declare function getScaleFactor(): number;
4
+ /** 系统消息字体(CreateFontIndirectW(NONCLIENTMETRICS.lfMessageFont))——界面控件的默认字体;
5
+ * 出参位不注册 encoder:encode({cbSize}) 建缓冲带初值 → 传 .ptr → decode 读回。
6
+ * cbSize/uiParam 必须与系统认知的结构尺寸一致:Vista+ 为 504(含尾部 iPaddedBorderWidth)、
7
+ * XP/2003 为 500 —— 先按 504 试,失败退回 500(lfMessageFont 落在前 500 字节内,尾部留 0);
8
+ * 两次都失败 → NULL,调用方按「无字体」处理(控件回落系统默认字体)。 */
9
+ export declare function createSystemDpiFont(): Ptr<'HGDIOBJ'> | NULL;
@@ -0,0 +1,2 @@
1
+ import * as gui from 'gui';
2
+ export declare function startDumpRects(rootHwnd: gui.HWND, intervalMs?: number): void;
@@ -0,0 +1,23 @@
1
+ export interface LogEntry {
2
+ /** epoch 秒 */
3
+ ts: number;
4
+ /** 展示用命令/请求描述 */
5
+ cmd: string;
6
+ /** HTTP 状态码(401/404/500/504 等);异常终止用 -1 */
7
+ status: number;
8
+ /** X-Exit-Code(子进程退出码);无则 null */
9
+ exit: number | null;
10
+ /** 耗时 ms */
11
+ durMs: number;
12
+ /** 附加说明(如超时/拒绝原因) */
13
+ note?: string;
14
+ }
15
+ /** 请求日志:固定容量环形缓冲,GUI ListBox 每行一条。 */
16
+ export declare class RequestLog {
17
+ private readonly cap;
18
+ private buf;
19
+ constructor(cap?: number);
20
+ get size(): number;
21
+ push(e: LogEntry): void;
22
+ list(): LogEntry[];
23
+ }
package/lib/fetch.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ declare global {
2
+ var fetch: (url: string | Request, init?: RequestInit) => Promise<Response>;
3
+ }
4
+ export {};
@@ -0,0 +1,70 @@
1
+ import '../text-codec.js';
2
+ import { ArgJsTypeOfToken, RetJsTypeOfToken, type Ptr, PtrArrayBuffer } from './ctype.js';
3
+ type Codec<N extends string = string, V = unknown, T = unknown> = {
4
+ encode?(v: V, buf?: PtrArrayBuffer<any>): PtrArrayBuffer<any>;
5
+ decode?(p: Ptr<N> | ArrayBuffer): V;
6
+ alloc?(a: T): PtrArrayBuffer<N>;
7
+ };
8
+ export type CodecMap = Record<string, {
9
+ encode?(v: any, buf?: PtrArrayBuffer<any>): PtrArrayBuffer<any>;
10
+ decode?(p: any): any;
11
+ alloc?(a: any): PtrArrayBuffer<any>;
12
+ }>;
13
+ type ParseArgStr<S extends string, L, Acc extends unknown[] = []> = S extends `${infer F} ${infer R}` ? ParseArgStr<R, L, [...Acc, ArgJsTypeOfToken<F, L>]> : S extends '' ? Acc : [...Acc, ArgJsTypeOfToken<S, L>];
14
+ type EncodeValue<T> = 'encode' extends keyof T ? (T extends {
15
+ encode?: (v: infer V, ...r: any[]) => ArrayBuffer;
16
+ } ? V : never) : never;
17
+ type DecodeValue<T> = 'decode' extends keyof T ? (T extends {
18
+ decode?: (p: any, ...r: any[]) => infer V;
19
+ } ? V : never) : never;
20
+ type BindEncoders<M> = {
21
+ [K in keyof M]: EncodeValue<M[K]>;
22
+ } & {
23
+ WCHAR: string;
24
+ BYTE: PtrArrayBuffer<any>;
25
+ };
26
+ type BindDecoders<M> = {
27
+ [K in keyof M]: DecodeValue<M[K]>;
28
+ } & {
29
+ WCHAR: string;
30
+ };
31
+ type BindFn<S extends string, E, D> = S extends `${infer ArgStr} -> ${infer RetStr}` ? ((...args: ParseArgStr<ArgStr, E>) => RetJsTypeOfToken<RetStr, D>) : never;
32
+ /** 内建 UTF-16 编解码:encode 入参序列化(UTF-16LE + NUL);decode 双态单参——
33
+ * 品牌指针逐字节读到 NUL(野指针无终止 4MiB 上限 fail-fast)、ArrayBuffer 直读到
34
+ * NUL 或末尾(out 参数未写 NUL 时按读满处理);alloc 预分配返回带 .ptr 的
35
+ * PtrArrayBuffer(a = 字符数,缺省 256)。类型取必需形态——
36
+ * 内建三件齐备,调用无需空断言。刻意 Pick 而非 Required<Codec>:只声明消费的
37
+ * 三件(encode/decode/alloc),新增可选能力位不被拉成必填。 */
38
+ export declare const WCHAR: Required<Pick<Codec<'WCHAR', string, number>, 'encode' | 'decode' | 'alloc'>>;
39
+ /** 内建字节缓冲:encode identity 直通(收 PtrArrayBuffer、原地存活,native 写回同一
40
+ * buffer);alloc 预分配返回带 .ptr 的 PtrArrayBuffer(a = 字节数)。无 decode——
41
+ * 地址不携带长度(无终止符),读回直接在 buffer 上 DataView / TypedArray 取。 */
42
+ export declare const BYTE: Required<Pick<Codec<'BYTE', PtrArrayBuffer<any>, number>, 'encode' | 'alloc'>>;
43
+ /** 绑定单个函数。encoders/decoders 是两张可选布局表(结构上是 Codec):
44
+ * encoders 喂入参位(encode 值域 → 形参类型),decoders 喂返回位(decode 值域
45
+ * → 返回 V | null,替代 Ptr | null)。decoders 缺省时回退到 encoders——双向 codec
46
+ * 只需传一次(与运行时 `decoders ?? encoders` 同构:都只在实参缺省时生效,
47
+ * 显式传空对象不 fallback)。内建 WCHAR/BYTE 无条件参与两张表。 */
48
+ export declare function bind<const S extends string, const LE extends CodecMap = {}, const LD extends CodecMap = LE>(dll: string, name: string, sig: S, encoders?: LE, decoders?: LD): BindFn<S, BindEncoders<LE>, BindDecoders<LD>>;
49
+ /** 批量绑定(map = 函数名 → 签名串)。encoders/decoders 语义同 bind()。 */
50
+ export declare function bindLib<const M extends Record<string, string>, const LE extends CodecMap = {}, const LD extends CodecMap = LE>(dll: string, map: M, encoders?: LE, decoders?: LD): { [K in keyof M]: BindFn<M[K], BindEncoders<LE>, BindDecoders<LD>>; };
51
+ /** 把 JS 函数变成可传给 Win32 API 的函数指针(同步同线程回调)。
52
+ * sig 为回调签名:实参只许 BasicKind(ptr 槽 0 保真读回 NULL | Ptr),
53
+ * 返回只许 void|u8..u64|i8..i64|f32|f64|ptr(u64/i64 走 EDX:EAX,x64 走 RAX)。
54
+ * '!' 标记位运行时校验(与 bind 调用位同语义,见 dispatchClosure):参数位 C 传入 0
55
+ * → 打印诊断并跳过回调;返回位 fn 返回 0 → 保持结果槽 0。
56
+ * opts.stdcall 仅 ia32 有效(默认 true,Win32 回调标准 CALLBACK);msvcrt 等
57
+ * cdecl 库回调传 { stdcall: false }。x64 恒由调用方清栈,无需指定。
58
+ * 参数上限:x64 至多 16 个、ia32 栈区至多 64 字节(C 桩定长捕获窗),超限抛错。
59
+ * 返回 { ptr, dispose }:ptr 即函数指针(传给 API 的 ptr 参数);dispose 注销
60
+ * 并释放回调函数,幂等;闭包期间回调被强引用,不会被 GC 回收。
61
+ * 注意:dispose 后 ptr 不得再被任何 native 方引用。
62
+ * 从未 dispose 就丢弃通道(整个返回对象或解构出来的 dispose 均算)
63
+ * → 打印泄漏警告(只警告、不自动释放,见 leakRegistry)。 */
64
+ export declare function closure<S extends string>(sig: S, fn: BindFn<S, {}, {}>, opts?: {
65
+ stdcall?: boolean;
66
+ }): {
67
+ ptr: number;
68
+ dispose(): void;
69
+ };
70
+ export {};
@@ -0,0 +1,117 @@
1
+ declare const C_BASIC_TYPE: readonly ['void', 'u8', 'i8', 'u16', 'i16', 'u32', 'i32', 'u64', 'i64', 'f32', 'f64', 'ptr'];
2
+ export type C_BasicType = (typeof C_BASIC_TYPE)[number];
3
+ export type C_BasicType_No_Void = Exclude<C_BasicType, 'void'>;
4
+ export type C_BasicType_Token = Exclude<C_BasicType, 'ptr'> | `<${string}>ptr` | `<${string}>ptr!` | `<${string}>`;
5
+ export type C_BasicType_Token_No_Void = Exclude<C_BasicType_Token, 'void'>;
6
+ export declare function isCPtrToken(t: string): t is `<${string}>ptr` | `${string}ptr!` | `${string}ptr@${string}`;
7
+ export declare function isCValToken(t: string): t is `<${string}>`;
8
+ export declare function valName<const N extends string>(t: `<${N}>`): N;
9
+ export declare function ptrName<const N extends string>(t: `<${N}>ptr` | `<${N}>ptr!`): N;
10
+ /**
11
+ * @description `<${string}>ptr` / `<${string}>ptr!` -> 'ptr'。按值形 `<${string}>` 无
12
+ * 标量槽等价物 —— 运行时 throw(返回位由 parseSig 拒、closure 入参位由 closure() 拒,
13
+ * 正常路径不可达),返回类型同时 Exclude 掉按值形:消费方(readRet / dispatchClosure
14
+ * 的 IA32_ARG_SIZE 索引)拿不到会误导编译期的标量误判。
15
+ */
16
+ export declare const cTokenToType: <const T extends string>(t: T) => Exclude<T, `<${string}>ptr` | `<${string}>ptr!` | `<${string}>`> | 'ptr';
17
+ export type C_Number = Exclude<C_BasicType, 'void' | 'ptr'>;
18
+ export type C_Integer = Exclude<C_Number, 'f32' | 'f64'>;
19
+ export type Encoding = 'utf-8' | 'utf-16le';
20
+ type First = '_' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z';
21
+ export type SimpleToken = C_Number | `${C_Number}@${keyof EnumMap}` | `<${string}>ptr` | `${string}ptr!` | `<${string}>ptr@${keyof EnumMap}`;
22
+ export type SimpleMember = {
23
+ [K: `${First}${string}`]: SimpleValue;
24
+ [K: `$${string}`]: C_Struct | C_Union;
25
+ };
26
+ export interface C_Struct {
27
+ '#': 'struct';
28
+ '#pack'?: number;
29
+ [K: `${First}${string}`]: SimpleValue;
30
+ [K: `$${string}`]: C_Struct | C_Union;
31
+ }
32
+ export interface C_Union {
33
+ '#': 'union';
34
+ '#pack'?: number;
35
+ [K: `${First}${string}`]: SimpleValue;
36
+ [K: `$${string}`]: C_Struct | C_Union;
37
+ }
38
+ export type C_Array = {
39
+ '#': 'array';
40
+ element: SimpleValue;
41
+ length: number;
42
+ };
43
+ export type SimpleValue = SimpleToken | `${SimpleToken}[${number}]` | `${C_Number}:${number}` | `${'u8' | 'u16'}[${number}]@${Encoding}` | C_Struct | C_Union | C_Array;
44
+ export declare const PTR_SIZE: number;
45
+ export declare const SizeAlign: Record<C_Number, number>;
46
+ export type Ptr<T extends string> = '' extends T ? number : number & {
47
+ readonly ptrBrand: T;
48
+ };
49
+ /** NULL 品牌零:0 的品牌形态 —— 全 FFI 层唯一的空指针字面量(对应 C 的 NULL 宏,
50
+ * 运行时就是 0)。JS 的 null 不在指针值域:类型层禁收,运行时不做 null→0 转换
51
+ * (动态 null 在参数槽 / 写槽处 fail-loud 报错)。 */
52
+ export type NULL = 0 & {
53
+ readonly ptrBrand: 'NULL';
54
+ };
55
+ export declare const NULL: NULL;
56
+ /** 唯一指针类型:参数位 / 返回位 / struct 字段 / closure 双侧通用。
57
+ * C→JS 0 保真(readScalar 不做 0→null);JS→C 空位写 NULL(写槽即 0)。
58
+ * 传参前由 tsc 收窄掉空位(truthy / === NULL / === 0)。 */
59
+ export type MaybePtr<T extends string> = NULL | Ptr<T>;
60
+ export type C_TypeJsTypeMap = {
61
+ u8: number;
62
+ i8: number;
63
+ u16: number;
64
+ i16: number;
65
+ u32: number;
66
+ i32: number;
67
+ i64: bigint;
68
+ u64: bigint;
69
+ f32: number;
70
+ f64: number;
71
+ };
72
+ export type TokenArgJsTypeMap = C_TypeJsTypeMap;
73
+ export type TokenReturnJsTypeMap = C_TypeJsTypeMap & {
74
+ void: void;
75
+ };
76
+ /** token 枚举标注('u32@Name' / '<>ptr@Name')的值域表 —— 全局 interface 声明合并:
77
+ * 预填由 tools/gen_enum_map.sh 从 quickwin_const.d.ts 提取(quickwin_enum_map.d.ts),
78
+ * 用户在自己的 .d.ts 里直接扩展(interface EnumMap { MyEnum: import('...').MyEnum })——
79
+ * 勿用 declare module:用户 import specifier 形态五花八门,模块匹配不上;全局合并对
80
+ * 「按枚举名索引」的 token 语义才成立。消费点(bind Arg/Ret、struct 字段)统一以
81
+ * `infer E extends keyof EnumMap` 收紧后直接索引本表 —— 值域类型不分参数/返回语境
82
+ * (拦异种枚举、域外字面量靠枚举类型自身的 nominal);未知枚举名由词汇/分支约束
83
+ * 挡在外面:struct 定义点 ∉ SimpleValue,bind 签名落链末 map[never] 塌 never
84
+ * (参数位)/ unknown(返回位——never 是 bottom 会被任意使用放行,反而危险)。 */
85
+ declare global {
86
+ interface EnumMap {
87
+ }
88
+ }
89
+ export type ArgJsTypeOfToken<K extends string, L> = K extends `<${infer N}>ptr!` ? Ptr<N> | L[N & keyof L] : K extends `<${string}>ptr@${infer E extends keyof EnumMap}` ? EnumMap[E] : K extends `<${infer N}>ptr` ? MaybePtr<N> | L[N & keyof L] : K extends `<${infer N}>` ? L[N & keyof L] : K extends `${C_Number}@${infer E extends keyof EnumMap}` ? EnumMap[E] : TokenArgJsTypeMap[K & keyof TokenArgJsTypeMap] extends never ? never : TokenArgJsTypeMap[K & keyof TokenArgJsTypeMap];
90
+ export type RetJsTypeOfToken<K extends string, D> = K extends `<${infer N}>ptr!` ? (D[N & keyof D] extends never ? Ptr<N> : D[N & keyof D]) : K extends `<${string}>ptr@${infer E extends keyof EnumMap}` ? EnumMap[E] : K extends `<${infer N}>ptr` ? (D[N & keyof D] extends never ? MaybePtr<N> : D[N & keyof D] | NULL) : K extends `${C_Number}@${infer E extends keyof EnumMap}` ? EnumMap[E] : TokenReturnJsTypeMap[K & keyof TokenReturnJsTypeMap] extends never ? unknown : TokenReturnJsTypeMap[K & keyof TokenReturnJsTypeMap];
91
+ export declare function normToken(t: string): C_BasicType_Token;
92
+ export declare function readScalar(dv: DataView, off: number, k: C_BasicType_No_Void): number | bigint | null;
93
+ type Entry = {
94
+ [K in C_BasicType_No_Void]: {
95
+ k: K;
96
+ v: (C_TypeJsTypeMap & {
97
+ ptr: number;
98
+ })[K];
99
+ };
100
+ }[C_BasicType_No_Void];
101
+ /** 内存写:按 sizeof 精确写,供 struct 字段编码用。小整数只占自己的字节,
102
+ * 否则 `{a:u8,b:u8}` 这类紧凑布局会被 setUint32 越界覆盖相邻字段。 */
103
+ export declare function writeScalar(dv: DataView, off: number, { k, v }: Entry): void;
104
+ /** 槽写:供 bind 的参数槽/返回槽用。小整数扩展到 4 字节 —— 可变参数按 int 提升读,
105
+ * `i8 = -1` 必须给 `0xFFFFFFFF` 而非 `0x000000FF`。u32/i32/u64/i64/f32/f64/ptr
106
+ * 槽宽 == sizeof,直接委托 writeScalar。 */
107
+ export declare function writeSlot(dv: DataView, off: number, e: Entry): void;
108
+ /** buffer + 品牌指针合一:一个引用既是 ArrayBuffer(喂 decode / encode(v, buf) 复用)
109
+ * 又带 `.ptr` 直接喂 <N>ptr 形参 —— 替代旧 { buf, ptr } 结构包装。
110
+ * `ptr` 是构造时快照(与旧 StructAlloc 同性质:底层数据不可 detach/transfer)。
111
+ * 品牌 N 由创建方声明:struct def 的 alloc()/encode() 返回值在类型层带 def 的 N(不可伪造);
112
+ * 直接 new 属自报品牌,仅限内部/原型场景 —— 生产路径一律走 def.alloc()。 */
113
+ export declare class PtrArrayBuffer<N extends string> extends ArrayBuffer {
114
+ readonly ptr: Ptr<N>;
115
+ constructor(byteLength: number);
116
+ }
117
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './bind.js';
2
+ export * from './struct.js';
@@ -0,0 +1,174 @@
1
+ import '../text-codec.js';
2
+ import { C_BasicType_No_Void, C_TypeJsTypeMap, MaybePtr, PtrArrayBuffer, type C_Array, type C_Integer, type C_Number, type C_Struct, type C_Union, type Encoding, type Ptr, type SimpleMember, type SimpleToken } from './ctype.js';
3
+ type N = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53;
4
+ type ValOf<T> = T extends `<${infer B}>ptr!` ? Ptr<B> : T extends `<${string}>ptr@${infer E extends keyof EnumMap}` ? EnumMap[E] : T extends `<${infer B}>ptr` ? MaybePtr<B> : T extends `${infer U}@${infer E extends keyof EnumMap}` ? (U extends C_Number ? EnumMap[E] : never) : T extends C_Number ? C_TypeJsTypeMap[T] : never;
5
+ type BitShape<T extends string, W extends number> = T extends C_Integer ? (W extends N ? number : bigint) : never;
6
+ type ShapeOfValue<V> = V extends infer T extends SimpleToken ? ValOf<T> : V extends `${infer U}[${infer L}]@${infer E}` ? (U extends 'u8' | 'u16' ? (L extends `${number}` ? (E extends Encoding ? string : never) : never) : never) : V extends `${infer T extends SimpleToken}[${infer L extends number}]` ? Tuple<ShapeOfValue<T>, L> : V extends `${infer T extends SimpleToken}:${infer W extends number}` ? BitShape<T, W> : V extends {
7
+ '#': 'array';
8
+ element: infer E;
9
+ length: infer L extends number;
10
+ } ? Tuple<ShapeOfValue<E>, L> : V extends {
11
+ '#': 'struct' | 'union';
12
+ } ? ShapeOfC<V> : never;
13
+ type Tuple<T, N extends number, R extends T[] = []> = number extends N ? T[] : R['length'] extends N ? R : R['length'] extends 64 ? T[] : Tuple<T, N, [...R, T]>;
14
+ type DollarKeys<T> = {
15
+ [K in keyof T]: K extends `$${string}` ? K : never;
16
+ }[keyof T];
17
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
18
+ type Lift<T> = {
19
+ [K in keyof T as K extends `$${string}` ? never : K]: T[K] extends readonly unknown[] ? T[K] : T[K] extends number ? T[K] : T[K] extends object ? Lift<T[K]> : T[K];
20
+ } & UnionToIntersection<{
21
+ [K in DollarKeys<T>]: Lift<T[K]>;
22
+ }[DollarKeys<T>]>;
23
+ type FieldKey<K> = K extends `#${string}` ? never : K extends `${infer B}@${string}` ? B : K;
24
+ type _ShapeOfC<M> = {
25
+ [K in keyof M as FieldKey<K>]: ShapeOfValue<M[K]>;
26
+ };
27
+ type ShapeOfC<M> = Lift<_ShapeOfC<M>>;
28
+ export type DeepPartial<T> = T extends readonly unknown[] ? T : T extends number | string | boolean | bigint | symbol ? T : {
29
+ [K in keyof T]?: DeepPartial<T[K]>;
30
+ };
31
+ type IsSubtreeMandatory<D> = D extends {
32
+ '#': 'array';
33
+ element: infer E;
34
+ } ? IsSubtreeMandatory<E> : D extends {
35
+ '#': 'struct' | 'union';
36
+ } ? (true extends {
37
+ [K in keyof D]-?: IsSubtreeMandatory<D[K]> extends true ? true : false;
38
+ }[keyof D] ? true : false) : D extends `${string}[${number}]@${string}` ? false : D extends `${infer TK extends SimpleToken}[${string}]` ? IsSubtreeMandatory<TK> : D extends `${string}:${number}` ? false : D extends `<${string}>ptr!` ? true : D extends `<${string}>ptr@${infer E extends keyof EnumMap}` ? (0 extends EnumMap[E] ? false : true) : D extends `${infer U}@${infer E extends keyof EnumMap}` ? (U extends C_Number ? (0 extends EnumMap[E] ? false : true) : false) : false;
39
+ type MandatoryDeclKeys<T> = {
40
+ [K in keyof T]-?: IsSubtreeMandatory<T[K]> extends true ? FieldKey<K> : never;
41
+ }[keyof T];
42
+ type EncodeValOfT<D> = D extends {
43
+ '#': 'struct' | 'union';
44
+ } ? EncodeShapeOfC<D> : ShapeOfValue<D>;
45
+ type EncodeShapeOfC<T> = DeepPartial<ShapeOfC<T>> & {
46
+ [K in keyof T as IsSubtreeMandatory<T[K]> extends true ? FieldKey<K> : never]-?: EncodeValOfT<T[K]>;
47
+ };
48
+ type EncodeIn<T extends {
49
+ '#': 'struct' | 'union';
50
+ }> = [
51
+ MandatoryDeclKeys<T>
52
+ ] extends [never] ? DeepPartial<ShapeOfC<T>> : EncodeShapeOfC<T>;
53
+ type FieldType = {
54
+ tag: 'basic';
55
+ kind: C_BasicType_No_Void;
56
+ } | {
57
+ tag: 'bitfield';
58
+ unit: C_Integer;
59
+ bit: number;
60
+ width: number;
61
+ } | {
62
+ tag: 'string';
63
+ encoding: Encoding;
64
+ } | {
65
+ tag: 'struct' | 'union';
66
+ fields: Field[];
67
+ } | {
68
+ tag: 'array';
69
+ elementType: FieldType;
70
+ elementSize: number;
71
+ };
72
+ export type Field = {
73
+ name: string;
74
+ offset: number;
75
+ size: number;
76
+ type: FieldType;
77
+ /** '!' 标注字段(原文 token `<X>ptr!`):decode 读出 0 当场 throw(后置兜底 ——
78
+ * C 没填 / 拿未填充槽 decode 都在这里拦,见 doDecode)。 */
79
+ nonnull?: true;
80
+ };
81
+ export type Fields = Field[];
82
+ export type StructDef<T extends {
83
+ '#': 'struct' | 'union';
84
+ }, N extends string = ''> = {
85
+ readonly fields: Fields;
86
+ readonly size: number;
87
+ readonly structAlign: number;
88
+ decode(buf: ArrayBuffer | Ptr<N>): ShapeOfC<T>;
89
+ /** n(默认 1)= 按本布局 size 步长连续分配 n 个元素的零填充缓冲(出参数组场景,
90
+ * 品牌 .ptr 直接喂 <N>ptr 位)。n < 1 / 非整数运行时 throw ——
91
+ * 任何路径都不产出 PAB(0)(其 .ptr 是"非 0 的 1 字节堆指针",会骗过 C 的 NULL
92
+ * 防御;空位语义由调用方显式传 NULL)。 */
93
+ alloc(n?: number): PtrArrayBuffer<N>;
94
+ encode(v: EncodeIn<T>): PtrArrayBuffer<N>;
95
+ encode(v: EncodeIn<T>, buf: PtrArrayBuffer<any>, offset?: number): PtrArrayBuffer<any>;
96
+ offsetOf(name: string): number;
97
+ };
98
+ type Layout = {
99
+ size: number;
100
+ maxEffectiveAlign: number;
101
+ fields: Fields;
102
+ };
103
+ export declare function computeArray(t: C_Array): {
104
+ align: number;
105
+ size: number;
106
+ };
107
+ export declare function computeStructLayout(t: C_Struct | C_Union): Layout;
108
+ /** 聚合对齐上限(pack 压 maxAlign,语义同 MSVC #pragma pack)。 */
109
+ export type AggOpts = {
110
+ pack?: number;
111
+ };
112
+ /** def 的类型经方法签名索引提取(StructDef 不再挂 __struct 成员 —— T 只活在签名里):
113
+ * encode 重载末条首参 = EncodeIn<T>、decode 返回 = ShapeOfC<T>、alloc 返回 = PAB<N>、
114
+ * decode 首参剥 ArrayBuffer = Ptr<N>(裸地址形)。 */
115
+ type EncInOf<D extends StructDef<any, any>> = Parameters<D['encode']>[0];
116
+ type DecOf<D extends StructDef<any, any>> = ReturnType<D['decode']>;
117
+ type PABOf<D extends StructDef<any, any>> = ReturnType<D['alloc']>;
118
+ type AddrOf<D extends StructDef<any, any>> = Exclude<Parameters<D['decode']>[0], ArrayBuffer>;
119
+ /** decode 双态重载:有 byteLength 的 buffer 形 count 可缺省(自算);裸地址无长度
120
+ * 信息,count 必填(类型层拦,缺省调用编译红)。 */
121
+ type StructArrayDecode<D extends StructDef<any, any>> = {
122
+ (p: ArrayBuffer, count?: number): DecOf<D>[];
123
+ (p: AddrOf<D>, count: number): DecOf<D>[];
124
+ };
125
+ /** 结构/联合体的数组编解码对工厂:返回 `{ encode, decode }`。
126
+ * encode —— 单值 encoder 的数组版:收元素数组 → 按本布局 size 步长紧密排列
127
+ * (stride = size,已含尾部对齐 padding),返回带品牌 .ptr 的 PAB —— 与 C 的
128
+ * `const T apt[]` 同构。值域刻意收普通数组(调用方持有的 `const pts = [...]` 变量
129
+ * 直传,非空元组会拒之);[] / 非数组 / 单对象运行时 throw —— 任何路径都不产出
130
+ * PAB(0)(其 .ptr 是"非 0 的 1 字节堆指针",会骗过 C 的 NULL 防御;空位语义由
131
+ * 调用方显式传 NULL)。注册进 bind 的 encoders 表(`{ POINT: structArray(POINT) }`)
132
+ * 后,普通 `<POINT>ptr` 位的值域即元素数组(值域由 encoder 推导,token/引擎/类型层
133
+ * 零数组概念);直接调用 `.encode(els).ptr` 亦可。
134
+ * decode —— 出参数组读回(与 def.decode 的 ArrayBuffer/地址双态对称):
135
+ * - buffer 形(含 PAB):count? 缺省自算 byteLength/size —— 要求整数倍,% ≠ 0
136
+ * throw(混合缓冲如 EnumPrinters 的"结构 + 尾部字符串"必须显式 count);显式
137
+ * count 校验 count*size ≤ byteLength(写错 count → 越界读的防线,buf 形可校才
138
+ * 校;不验品牌,与 def.decode 的 buffer 形同款)。
139
+ * - 裸地址形:count 必填(地址无长度信息),逐字节拷读(def.decode 的 number 形
140
+ * 同机制);长度不可校 → 信任 C 的 count。
141
+ * - count = 0 → [](读 0 个真空安全,与 encode 禁空的 PAB(0) 理由刻意不对称)。
142
+ * 实现:encode 走纯公开 API(alloc + encode offset 循环);decode 直接读 def.fields
143
+ * (createStruct 暴露的布局 IR,与 def.decode 同一份,无需重算)。 */
144
+ export declare function structArray<D extends StructDef<any, any>>(def: D): {
145
+ encode: (els: readonly EncInOf<D>[]) => PABOf<D>;
146
+ decode: StructArrayDecode<D>;
147
+ };
148
+ /** 平铺字段表定义结构体(token/`X[n]`/`unit:width`/`'#'` 声明均可,见 ctype.ts §4)。
149
+ * 给 name 则 alloc().ptr 与 decode 入参带 Ptr<name> 品牌。DECL 常量可直传(
150
+ * `struct('X', X_DECL)`)—— 参数交叉 `{ '#'?: 'struct' }` 锁 kind:传 union/array
151
+ * DECL 时 '#' 字面类型交叉成 never,编译期即报错。 */
152
+ type StructOf<M, N extends string = ''> = StructDef<{
153
+ '#': 'struct';
154
+ '#pack'?: number;
155
+ } & M, N>;
156
+ type UnionOf<M, N extends string = ''> = StructDef<{
157
+ '#': 'union';
158
+ '#pack'?: number;
159
+ } & M, N>;
160
+ export declare function struct<const M extends SimpleMember>(member: M & {
161
+ '#'?: 'struct';
162
+ }, opts?: AggOpts): StructOf<M>;
163
+ export declare function struct<const N extends string, const M extends SimpleMember>(name: N, member: M & {
164
+ '#'?: 'struct';
165
+ }, opts?: AggOpts): StructOf<M, N>;
166
+ /** 平铺字段表定义联合体;布局/读写与 struct 相同,仅成员偏移重叠。DECL 常量可直传,
167
+ * 参数交叉 `{ '#'?: 'union' }` 锁 kind(struct 侧镜像,理由见上)。 */
168
+ export declare function union<const M extends SimpleMember>(member: M & {
169
+ '#'?: 'union';
170
+ }, opts?: AggOpts): UnionOf<M>;
171
+ export declare function union<const N extends string, const M extends SimpleMember>(name: N, member: M & {
172
+ '#'?: 'union';
173
+ }, opts?: AggOpts): UnionOf<M, N>;
174
+ export {};
@@ -0,0 +1,143 @@
1
+ import './polyfill.js';
2
+ import './stream.js';
3
+ export declare function _concat(parts: Uint8Array[]): Uint8Array<ArrayBuffer>;
4
+ export declare function _toReadableStream(body: BodyInit): ReadableStream<Uint8Array>;
5
+ export declare function _readStream(stream: ReadableStream<Uint8Array>): Promise<Uint8Array<ArrayBuffer>>;
6
+ export declare function _hasChunkedEnd(data: Uint8Array): boolean;
7
+ export declare function decodeChunked(data: Uint8Array): Uint8Array;
8
+ export declare class HeadersImpl {
9
+ private _headers;
10
+ constructor(init?: HeadersInit);
11
+ append(name: string, value: string): void;
12
+ delete(name: string): void;
13
+ get(name: string): string | null;
14
+ has(name: string): boolean;
15
+ set(name: string, value: string): void;
16
+ forEach(callback: (value: string, name: string, headers: HeadersImpl) => void): void;
17
+ entries(): IterableIterator<[string, string]>;
18
+ keys(): IterableIterator<string>;
19
+ values(): IterableIterator<string>;
20
+ [Symbol.iterator](): IterableIterator<[string, string]>;
21
+ }
22
+ export declare class RequestImpl {
23
+ readonly url: string;
24
+ readonly method: string;
25
+ readonly headers: HeadersImpl;
26
+ private _body;
27
+ readonly redirect: RequestRedirect;
28
+ readonly timeout: number;
29
+ readonly maxRedirects: number;
30
+ private _bodyConsumed;
31
+ readonly integrity: string;
32
+ readonly keepalive: boolean;
33
+ readonly mode: string;
34
+ readonly cache: string;
35
+ readonly credentials: string;
36
+ readonly referrer: string;
37
+ readonly referrerPolicy: string;
38
+ readonly signal: AbortSignal | null;
39
+ readonly rejectUnauthorized: boolean;
40
+ readonly destination: string;
41
+ get body(): ReadableStream<Uint8Array> | null;
42
+ get bodyUsed(): boolean;
43
+ constructor(input: string | RequestImpl, init?: RequestInit);
44
+ arrayBuffer(): Promise<ArrayBuffer>;
45
+ json<T = unknown>(): Promise<T>;
46
+ text(): Promise<string>;
47
+ clone(): RequestImpl;
48
+ }
49
+ export declare class ResponseImpl {
50
+ readonly status: number;
51
+ readonly statusText: string;
52
+ readonly ok: boolean;
53
+ private _headers;
54
+ _redirected: boolean;
55
+ private _type;
56
+ _url: string;
57
+ private _body;
58
+ private _bodyConsumed;
59
+ private _trailers;
60
+ get body(): ReadableStream<Uint8Array>;
61
+ get bodyUsed(): boolean;
62
+ /** Trailing headers to emit after a chunked body (Promise resolves to
63
+ * a HeadersInit), when a `Trailer` declaration header is present. */
64
+ get trailers(): Promise<HeadersInit> | undefined;
65
+ get headers(): HeadersImpl;
66
+ get redirected(): boolean;
67
+ get type(): ResponseType;
68
+ get url(): string;
69
+ constructor(body?: BodyInit | null, init?: ResponseInit);
70
+ text(): Promise<string>;
71
+ json<T = unknown>(): Promise<T>;
72
+ arrayBuffer(): Promise<ArrayBuffer>;
73
+ bytes(): Promise<Uint8Array>;
74
+ clone(): Response;
75
+ _applyDecompressedBody(stream: ReadableStream<Uint8Array>, _body: ArrayBuffer, newHeaders: HeadersImpl): void;
76
+ }
77
+ declare global {
78
+ type HeadersInit = [string, string][] | Record<string, string> | Headers;
79
+ type BodyInit = ReadableStream<Uint8Array> | string | ArrayBuffer | ArrayBufferView;
80
+ type RequestRedirect = 'error' | 'follow' | 'manual';
81
+ type RequestCache = 'default' | 'force-cache' | 'no-cache' | 'no-store' | 'only-if-cached' | 'reload';
82
+ type RequestCredentials = 'include' | 'omit' | 'same-origin';
83
+ type RequestMode = 'cors' | 'navigate' | 'no-cors' | 'same-origin';
84
+ type ResponseType = 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect';
85
+ interface AbortSignal {
86
+ readonly aborted: boolean;
87
+ readonly reason: unknown;
88
+ onabort: ((event: {
89
+ type: 'abort';
90
+ target: unknown;
91
+ }) => void) | null;
92
+ addEventListener(type: 'abort', listener: (e: {
93
+ type: 'abort';
94
+ target: unknown;
95
+ }) => void): void;
96
+ removeEventListener(type: 'abort', listener: (e: {
97
+ type: 'abort';
98
+ target: unknown;
99
+ }) => void): void;
100
+ throwIfAborted(): void;
101
+ }
102
+ interface RequestInit {
103
+ body?: BodyInit | null;
104
+ cache?: RequestCache;
105
+ credentials?: RequestCredentials;
106
+ headers?: HeadersInit;
107
+ integrity?: string;
108
+ keepalive?: boolean;
109
+ method?: string;
110
+ mode?: RequestMode;
111
+ redirect?: RequestRedirect;
112
+ referrer?: string;
113
+ referrerPolicy?: string;
114
+ signal?: AbortSignal | null;
115
+ window?: null;
116
+ timeout?: number;
117
+ maxRedirects?: number;
118
+ /** Non-standard: when false, TLS certificate verification is skipped
119
+ * (mirrors Node's https.request rejectUnauthorized option). */
120
+ rejectUnauthorized?: boolean;
121
+ }
122
+ interface ResponseInit {
123
+ status?: number;
124
+ statusText?: string;
125
+ headers?: HeadersInit;
126
+ /** Non-standard: trailing headers, resolved after the body streams.
127
+ * http-server emits them (Node addTrailers semantics) when a `Trailer`
128
+ * declaration header is present and the body is chunk-framed. */
129
+ trailers?: Promise<HeadersInit>;
130
+ }
131
+ interface Headers extends HeadersImpl {
132
+ }
133
+ var Headers: typeof HeadersImpl;
134
+ interface Response extends Omit<ResponseImpl, '_url' | '_redirected' | '_applyDecompressedBody'> {
135
+ }
136
+ interface ResponseConstructor {
137
+ new (body?: BodyInit | null, init?: ResponseInit): Response;
138
+ }
139
+ var Response: ResponseConstructor;
140
+ interface Request extends RequestImpl {
141
+ }
142
+ var Request: typeof RequestImpl;
143
+ }