quickwin 3.0.0 → 3.0.1

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 (95) hide show
  1. package/lib/abort.d.ts +21 -0
  2. package/lib/assert.d.ts +2 -0
  3. package/lib/bitmap.d.ts +7 -0
  4. package/lib/cache-utils.d.ts +6 -0
  5. package/lib/certs.d.ts +1 -0
  6. package/lib/dpi.d.ts +9 -0
  7. package/lib/dumpRects.d.ts +2 -0
  8. package/lib/exec-log.d.ts +23 -0
  9. package/lib/fetch.d.ts +4 -0
  10. package/lib/ffi/bind.d.ts +70 -0
  11. package/lib/ffi/ctype.d.ts +117 -0
  12. package/lib/ffi/index.d.ts +2 -0
  13. package/lib/ffi/struct.d.ts +174 -0
  14. package/lib/http-common.d.ts +143 -0
  15. package/lib/http-server.d.ts +59 -0
  16. package/lib/polyfill.d.ts +22 -0
  17. package/lib/react-qw/components/Button.d.ts +9 -0
  18. package/lib/react-qw/components/CheckBox.d.ts +11 -0
  19. package/lib/react-qw/components/ComboBox.d.ts +11 -0
  20. package/lib/react-qw/components/DateTimePicker.d.ts +15 -0
  21. package/lib/react-qw/components/Input.d.ts +15 -0
  22. package/lib/react-qw/components/Link.d.ts +12 -0
  23. package/lib/react-qw/components/ListBox.d.ts +13 -0
  24. package/lib/react-qw/components/ListView.d.ts +37 -0
  25. package/lib/react-qw/components/PathPicker.d.ts +23 -0
  26. package/lib/react-qw/components/ProgressBar.d.ts +9 -0
  27. package/lib/react-qw/components/RadioButton.d.ts +11 -0
  28. package/lib/react-qw/components/ScrollView.d.ts +9 -0
  29. package/lib/react-qw/components/Slider.d.ts +12 -0
  30. package/lib/react-qw/components/Tab.d.ts +14 -0
  31. package/lib/react-qw/components/Tooltip.d.ts +7 -0
  32. package/lib/react-qw/components/TreeView.d.ts +18 -0
  33. package/lib/react-qw/components/index.d.ts +16 -0
  34. package/lib/react-qw/index.d.ts +24 -0
  35. package/lib/react-qw/layout.d.ts +29 -0
  36. package/lib/react-qw/nmhdr.d.ts +1 -0
  37. package/lib/react-qw/props.d.ts +2 -0
  38. package/lib/react-qw/reconciler.d.ts +21 -0
  39. package/lib/stream.d.ts +20 -0
  40. package/lib/text-codec.d.ts +39 -0
  41. package/lib/text-measure.d.ts +14 -0
  42. package/lib/url.d.ts +54 -0
  43. package/lib/websocket.d.ts +73 -0
  44. package/lib/windows/{advapi32.ts → advapi32.d.ts} +6 -21
  45. package/lib/windows/comctl32.d.ts +14 -0
  46. package/lib/windows/comdlg32.d.ts +4 -0
  47. package/lib/windows/{gdi32.ts → gdi32.d.ts} +161 -98
  48. package/lib/windows/{kernel32.ts → kernel32.d.ts} +138 -115
  49. package/lib/windows/{msimg32.ts → msimg32.d.ts} +11 -14
  50. package/lib/windows/ntdll.d.ts +5 -0
  51. package/lib/windows/ole32.d.ts +3 -0
  52. package/lib/windows/{psapi.ts → psapi.d.ts} +9 -18
  53. package/lib/windows/{shell32.ts → shell32.d.ts} +25 -24
  54. package/lib/windows/structs.d.ts +3141 -0
  55. package/lib/windows/{user32.ts → user32.d.ts} +196 -193
  56. package/lib/windows/version.d.ts +27 -0
  57. package/lib/windows/{winspool.ts → winspool.d.ts} +18 -32
  58. package/package.json +15 -6
  59. package/qwin-nowasm-x86.exe +0 -0
  60. package/qwin-nowasm.exe +0 -0
  61. package/qwin-x86.exe +0 -0
  62. package/qwin.exe +0 -0
  63. package/lib/abort.ts +0 -69
  64. package/lib/assert.ts +0 -7
  65. package/lib/bitmap.ts +0 -39
  66. package/lib/cache-utils.ts +0 -40
  67. package/lib/certs.ts +0 -258
  68. package/lib/dpi.ts +0 -31
  69. package/lib/dumpRects.ts +0 -34
  70. package/lib/exec-log.ts +0 -30
  71. package/lib/fetch.ts +0 -589
  72. package/lib/ffi/bind.ts +0 -540
  73. package/lib/ffi/ctype.ts +0 -371
  74. package/lib/ffi/index.ts +0 -6
  75. package/lib/ffi/struct.ts +0 -780
  76. package/lib/http-common.ts +0 -441
  77. package/lib/http-server.ts +0 -604
  78. package/lib/polyfill.ts +0 -171
  79. package/lib/react-qw/components/index.ts +0 -17
  80. package/lib/react-qw/index.ts +0 -96
  81. package/lib/react-qw/layout.ts +0 -111
  82. package/lib/react-qw/nmhdr.ts +0 -7
  83. package/lib/react-qw/props.ts +0 -41
  84. package/lib/react-qw/reconciler.ts +0 -379
  85. package/lib/stream.ts +0 -22
  86. package/lib/text-codec.ts +0 -171
  87. package/lib/text-measure.ts +0 -44
  88. package/lib/url.ts +0 -201
  89. package/lib/websocket.ts +0 -600
  90. package/lib/windows/comctl32.ts +0 -20
  91. package/lib/windows/comdlg32.ts +0 -10
  92. package/lib/windows/ntdll.ts +0 -11
  93. package/lib/windows/ole32.ts +0 -9
  94. package/lib/windows/structs.ts +0 -807
  95. package/lib/windows/version.ts +0 -35
@@ -0,0 +1,27 @@
1
+ /** 取文件版本资源大小
2
+ * @returns 字节数(0 = 文件无版本资源)
3
+ * @param args_0 lptstrFilename 文件路径(禁空)
4
+ * @param args_1 lpdwHandle 出参槽(Info 步的入参句柄,MSDN 恒 0 但仍须传),
5
+ * PtrArrayBuffer(4) + Uint32Array 读回 */
6
+ export declare const GetFileVersionInfoSize: (args_0: string | (number & {
7
+ readonly ptrBrand: "WCHAR";
8
+ }), args_1: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">) => number;
9
+ /** 读版本资源进缓冲
10
+ * @returns 成功 → 非 0
11
+ * @param args_0 lptstrFilename 文件路径(禁空)
12
+ * @param args_1 dwHandle Size 步读回的句柄(恒 0)
13
+ * @param args_2 dwLen 缓冲字节数(= Size 返回值)
14
+ * @param args_3 lpData 接收缓冲(PtrArrayBuffer(dwLen)) */
15
+ export declare const GetFileVersionInfo: (args_0: string | (number & {
16
+ readonly ptrBrand: "WCHAR";
17
+ }), args_1: number, args_2: number, args_3: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">) => number;
18
+ /** 在版本资源缓冲内查询子块
19
+ * @returns 成功 → 非 0
20
+ * @param args_0 pBlock Info 步的资源缓冲(PtrArrayBuffer 直传)
21
+ * @param args_1 lpszSubBlock 子块路径(禁空):'\\' = 根块 VS_FIXEDFILEINFO、
22
+ * '\\StringFileInfo\\040904B0\\FileVersion' 等字符串表项
23
+ * @param args_2 lplpBuffer 出参槽(块内偏移指针写回),PtrArrayBuffer(8)
24
+ * @param args_3 puLen 出参槽(块字节数,VS_FIXEDFILEINFO = 52),PtrArrayBuffer(4) */
25
+ export declare const VerQueryValue: (args_0: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">, args_1: string | (number & {
26
+ readonly ptrBrand: "WCHAR";
27
+ }), args_2: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">, args_3: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">) => number;
@@ -1,19 +1,3 @@
1
- // winspool.drv 绑定(打印后台处理:枚举 / 能力查询 / 原始作业链;品牌约定见
2
- // lib/windows/user32.ts 头注释):
3
- // - 打印机句柄(OpenPrinter 的 HPRINTER* 出参槽写回)位宽无关:出参槽 = <BYTE>ptr
4
- // 收 PtrArrayBuffer(8) + readPtr 读回 number,作业链句柄位 <>ptr 收宽(批 5 HKey 同型)
5
- // - 结构位按方向分流(结构定义见 ./structs.ts):DOC_INFO_1W 纯入参位注册 encoder →
6
- // 对象直传;PRINTER_INFO_2W 出参数组不注册 → structArray(PRINTER_INFO_2W).decode
7
- // (buf, count) 读回(缓冲尾部含字符串,须显式 count),指针字段跟进读字符串
8
- // - 枚举标注:DeviceCap 是单选查询位标枚举;PrinterEnum 是 LOCAL|CONNECTIONS 可组合
9
- // flags → 裸 u32 + JSDoc(组合 OR 结果不是枚举成员,位标枚举反而传不进)
10
- import { bind, type CodecMap } from '../ffi/bind.js'
11
- import { DOC_INFO_1W } from './structs.js'
12
-
13
- // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
14
- const b = <const S extends string, const LE extends CodecMap = {}>(name: string, sig: S, encoders?: LE) =>
15
- bind('winspool.drv', name, sig, encoders)
16
-
17
1
  /** 枚举打印队列(Level=2 → PRINTER_INFO_2W 数组);两段式:先
18
2
  * NULL+cbBuf 0 拿 pcbNeeded,再按需分配缓冲重调
19
3
  * @returns 成功 → 非 0
@@ -25,15 +9,12 @@ const b = <const S extends string, const LE extends CodecMap = {}>(name: string,
25
9
  * @param args_4 cbBuf 缓冲字节数
26
10
  * @param args_5 pcbNeeded 出参槽(需求字节数)PtrArrayBuffer(4)
27
11
  * @param args_6 pcReturned 出参槽(返回条数)PtrArrayBuffer(4) */
28
- export const EnumPrinters = /*@__PURE__*/ b('EnumPrintersW',
29
- 'u32 <WCHAR>ptr u32 <BYTE>ptr u32 <BYTE>ptr <BYTE>ptr -> i32')
30
-
12
+ export declare const EnumPrinters: (args_0: number, args_1: string | import("../ffi/ctype.js").MaybePtr<"WCHAR">, args_2: number, args_3: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">, args_4: number, args_5: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">, args_6: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">) => number;
31
13
  /** 取默认打印机名
32
14
  * @returns 成功 → 非 0,0 = 失败(缓冲不足时 pcchBuffer 带回所需长度)
33
15
  * @param args_0 pszBuffer 出参缓冲,WCHAR.alloc(n)、WCHAR.decode 读回
34
16
  * @param args_1 pcchBuffer 出入长度槽(入 = 缓冲 WCHAR 容量,出 = 实际长度),PtrArrayBuffer(4) */
35
- export const GetDefaultPrinter = /*@__PURE__*/ b('GetDefaultPrinterW', '<BYTE>ptr <BYTE>ptr -> i32')
36
-
17
+ export declare const GetDefaultPrinter: (args_0: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">, args_1: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">) => number;
37
18
  /** 查设备能力;nCapability 单选 DeviceCap.*
38
19
  * @returns 返回值随能力(数值能力 = 数值,
39
20
  * -1 = 失败)
@@ -42,39 +23,44 @@ export const GetDefaultPrinter = /*@__PURE__*/ b('GetDefaultPrinterW', '<BYTE>pt
42
23
  * @param args_2 nCapability 能力码(DeviceCap.HORZRES 等单选)
43
24
  * @param args_3 pOutput 字符串列表型能力的缓冲;数值型查询传 NULL
44
25
  * @param args_4 pDevmode DEVMODE,传 NULL */
45
- export const DeviceCapabilities = /*@__PURE__*/ b('DeviceCapabilitiesW',
46
- '<WCHAR>ptr! <WCHAR>ptr u32@DeviceCap <BYTE>ptr <>ptr -> i32')
47
-
26
+ export declare const DeviceCapabilities: (args_0: string | (number & {
27
+ readonly ptrBrand: "WCHAR";
28
+ }), args_1: string | import("../ffi/ctype.js").MaybePtr<"WCHAR">, args_2: import("../../constants.js").DeviceCap, args_3: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">, args_4: import("../ffi/ctype.js").MaybePtr<"">) => number;
48
29
  /** 打开打印机对象(不产生打印作业)
49
30
  * @returns 成功 → 非 0,hPrinter 写回
50
31
  * @param args_0 pPrinterName 打印机名(禁空)
51
32
  * @param args_1 phPrinter 出参槽(句柄写回),PtrArrayBuffer(8) + readPtr 读回
52
33
  * @param args_2 pDefault 默认值(Datatype/DevMode/DesiredAccess),传 NULL 全默认 */
53
- export const OpenPrinter = /*@__PURE__*/ b('OpenPrinterW', '<WCHAR>ptr! <BYTE>ptr <>ptr -> i32')
34
+ export declare const OpenPrinter: (args_0: string | (number & {
35
+ readonly ptrBrand: "WCHAR";
36
+ }), args_1: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">, args_2: import("../ffi/ctype.js").MaybePtr<"">) => number;
54
37
  /** 关闭打印机句柄
55
38
  * @returns 成功 → 非 0 */
56
- export const ClosePrinter = /*@__PURE__*/ b('ClosePrinter', '<>ptr -> i32')
39
+ export declare const ClosePrinter: (args_0: import("../ffi/ctype.js").MaybePtr<"">) => number;
57
40
  /** 起打印作业
58
41
  * @returns 作业 id(0 = 失败)
59
42
  * @param args_0 hPrinter 打印机句柄
60
43
  * @param args_1 dwLevel 固定 1(DOC_INFO_1W)
61
44
  * @param args_2 pDocInfo DOC_INFO_1W 对象(指针字段收裸地址 number:WCHAR.encode(s).ptr,
62
45
  * PAB 须在调用返回前保持引用) */
63
- export const StartDocPrinter = /*@__PURE__*/ b('StartDocPrinterW', '<>ptr u32 <DOC_INFO_1W>ptr -> u32',
64
- { DOC_INFO_1W })
46
+ export declare const StartDocPrinter: (args_0: import("../ffi/ctype.js").MaybePtr<"">, args_1: number, args_2: {
47
+ pDatatype?: import("../ffi/ctype.js").MaybePtr<""> | undefined;
48
+ pDocName?: import("../ffi/ctype.js").MaybePtr<""> | undefined;
49
+ pOutputFile?: import("../ffi/ctype.js").MaybePtr<""> | undefined;
50
+ } | import("../ffi/ctype.js").MaybePtr<"DOC_INFO_1W">) => number;
65
51
  /** 结束打印作业(提交)
66
52
  * @returns 成功 → 非 0 */
67
- export const EndDocPrinter = /*@__PURE__*/ b('EndDocPrinter', '<>ptr -> i32')
53
+ export declare const EndDocPrinter: (args_0: import("../ffi/ctype.js").MaybePtr<"">) => number;
68
54
  /** 起页
69
55
  * @returns 成功 → 非 0 */
70
- export const StartPagePrinter = /*@__PURE__*/ b('StartPagePrinter', '<>ptr -> i32')
56
+ export declare const StartPagePrinter: (args_0: import("../ffi/ctype.js").MaybePtr<"">) => number;
71
57
  /** 结束页
72
58
  * @returns 成功 → 非 0 */
73
- export const EndPagePrinter = /*@__PURE__*/ b('EndPagePrinter', '<>ptr -> i32')
59
+ export declare const EndPagePrinter: (args_0: import("../ffi/ctype.js").MaybePtr<"">) => number;
74
60
  /** 写作业数据(RAW 直写 spooler)
75
61
  * @returns 成功 → 非 0
76
62
  * @param args_0 hPrinter 打印机句柄
77
63
  * @param args_1 lpBuffer 数据缓冲(<BYTE>ptr,PtrArrayBuffer)
78
64
  * @param args_2 nNumberOfBytesToWrite 写入字节数
79
65
  * @param args_3 lpNumberOfBytesWritten 出参槽,PtrArrayBuffer(4) 读实际写入字节数 */
80
- export const WritePrinter = /*@__PURE__*/ b('WritePrinter', '<>ptr <BYTE>ptr u32 <BYTE>ptr -> i32')
66
+ export declare const WritePrinter: (args_0: import("../ffi/ctype.js").MaybePtr<"">, args_1: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">, args_2: number, args_3: import("../ffi/ctype.js").PtrArrayBuffer<any> | import("../ffi/ctype.js").MaybePtr<"BYTE">) => number;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "quickwin",
4
- "version": "3.0.0",
4
+ "version": "3.0.1",
5
5
  "description": "QuickJS Win32 runtime — GUI, networking, WASM, FFI, and more",
6
6
  "bin": {
7
7
  "quickwin": "qwin.exe",
@@ -34,18 +34,27 @@
34
34
  "type": "git",
35
35
  "url": "git+https://github.com/quickwinlabs/quickwin.git"
36
36
  },
37
+ "dependencies": {
38
+ "@types/react-reconciler": "^0.33.0",
39
+ "react-reconciler": "^0.33.0"
40
+ },
41
+ "peerDependencies": {
42
+ "@types/react": "^19.2.17",
43
+ "react": "^19.2.7"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "@types/react": {
47
+ "optional": true
48
+ }
49
+ },
37
50
  "devDependencies": {
38
51
  "@quickwinlabs/mupdf-wasm": "^1.28.0",
39
52
  "@types/node": "^24.13.2",
40
53
  "@types/react": "^19.2.17",
41
- "@types/react-reconciler": "^0.33.0",
42
54
  "@types/ws": "^8.18.1",
43
55
  "esbuild": "^0.28.0",
44
- "typescript": "^7.0.2"
45
- },
46
- "dependencies": {
47
56
  "react": "^19.2.7",
48
- "react-reconciler": "^0.33.0",
57
+ "typescript": "^7.0.2",
49
58
  "web-streams-polyfill": "^4.3.0",
50
59
  "ws": "^8.21.0"
51
60
  }
Binary file
package/qwin-nowasm.exe CHANGED
Binary file
package/qwin-x86.exe CHANGED
Binary file
package/qwin.exe CHANGED
Binary file
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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
- 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
- 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
- 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
- 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
- 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
- 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
- 0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE
152
- 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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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
- pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF
164
- FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt
165
- rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk
166
- 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
- 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
- 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
- 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
- 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
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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
- h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
181
- 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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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
- ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
194
- 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
- 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
- ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
197
- 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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
package/lib/dpi.ts DELETED
@@ -1,31 +0,0 @@
1
- // DPI 与系统字体 —— gui 模块下沉到 JS 层的两处复合逻辑(原 js_getScaleFactor /
2
- // js_createSystemDpiFont)。两者都只按「一次操作一次」调用,FFI 的固定溢价无感;
3
- // 留在 C 只会与 lib/windows 的绑定重复一层,遂收在此处单点实现。
4
- import { NULL, type Ptr } from './ffi/ctype.js'
5
- import { GetDC, ReleaseDC, SystemParametersInfo } from './windows/user32.js'
6
- import { GetDeviceCaps, CreateFontIndirect } from './windows/gdi32.js'
7
- import { NONCLIENTMETRICSW } from './windows/structs.js'
8
- import { DeviceCap, Spi } from '../constants'
9
-
10
- /** 屏幕缩放系数(96 DPI = 1):GetDC(NULL) → GetDeviceCaps(LOGPIXELSX) → ReleaseDC 成对释放 */
11
- export function getScaleFactor(): number {
12
- const hdc = GetDC(NULL)
13
- const dpi = hdc ? GetDeviceCaps(hdc, DeviceCap.LOGPIXELSX) : 96
14
- if (hdc) ReleaseDC(NULL, hdc)
15
- return dpi / 96
16
- }
17
-
18
- /** 系统消息字体(CreateFontIndirectW(NONCLIENTMETRICS.lfMessageFont))——界面控件的默认字体;
19
- * 出参位不注册 encoder:encode({cbSize}) 建缓冲带初值 → 传 .ptr → decode 读回。
20
- * cbSize/uiParam 必须与系统认知的结构尺寸一致:Vista+ 为 504(含尾部 iPaddedBorderWidth)、
21
- * XP/2003 为 500 —— 先按 504 试,失败退回 500(lfMessageFont 落在前 500 字节内,尾部留 0);
22
- * 两次都失败 → NULL,调用方按「无字体」处理(控件回落系统默认字体)。 */
23
- export function createSystemDpiFont(): Ptr<'HGDIOBJ'> | NULL {
24
- const ncm = NONCLIENTMETRICSW.encode({ cbSize: NONCLIENTMETRICSW.size })
25
- if (!SystemParametersInfo(Spi.GETNONCLIENTMETRICS, NONCLIENTMETRICSW.size, ncm, 0)) {
26
- const legacySize = NONCLIENTMETRICSW.size - 4
27
- NONCLIENTMETRICSW.encode({ cbSize: legacySize }, ncm)
28
- if (!SystemParametersInfo(Spi.GETNONCLIENTMETRICS, legacySize, ncm, 0)) return NULL
29
- }
30
- return CreateFontIndirect(NONCLIENTMETRICSW.decode(ncm).lfMessageFont)
31
- }