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.
- package/lib/abort.d.ts +21 -0
- package/lib/assert.d.ts +2 -0
- package/lib/bitmap.d.ts +7 -0
- package/lib/cache-utils.d.ts +6 -0
- package/lib/certs.d.ts +1 -0
- package/lib/dpi.d.ts +9 -0
- package/lib/dumpRects.d.ts +2 -0
- package/lib/exec-log.d.ts +23 -0
- package/lib/fetch.d.ts +4 -0
- package/lib/ffi/bind.d.ts +70 -0
- package/lib/ffi/ctype.d.ts +117 -0
- package/lib/ffi/index.d.ts +2 -0
- package/lib/ffi/struct.d.ts +174 -0
- package/lib/http-common.d.ts +143 -0
- package/lib/http-server.d.ts +59 -0
- package/lib/polyfill.d.ts +22 -0
- package/lib/react-qw/components/Button.d.ts +9 -0
- package/lib/react-qw/components/CheckBox.d.ts +11 -0
- package/lib/react-qw/components/ComboBox.d.ts +11 -0
- package/lib/react-qw/components/DateTimePicker.d.ts +15 -0
- package/lib/react-qw/components/Input.d.ts +15 -0
- package/lib/react-qw/components/Link.d.ts +12 -0
- package/lib/react-qw/components/ListBox.d.ts +13 -0
- package/lib/react-qw/components/ListView.d.ts +37 -0
- package/lib/react-qw/components/PathPicker.d.ts +23 -0
- package/lib/react-qw/components/ProgressBar.d.ts +9 -0
- package/lib/react-qw/components/RadioButton.d.ts +11 -0
- package/lib/react-qw/components/ScrollView.d.ts +9 -0
- package/lib/react-qw/components/Slider.d.ts +12 -0
- package/lib/react-qw/components/Tab.d.ts +14 -0
- package/lib/react-qw/components/Tooltip.d.ts +7 -0
- package/lib/react-qw/components/TreeView.d.ts +18 -0
- package/lib/react-qw/components/index.d.ts +16 -0
- package/lib/react-qw/index.d.ts +24 -0
- package/lib/react-qw/layout.d.ts +29 -0
- package/lib/react-qw/nmhdr.d.ts +1 -0
- package/lib/react-qw/props.d.ts +2 -0
- package/lib/react-qw/reconciler.d.ts +21 -0
- package/lib/stream.d.ts +20 -0
- package/lib/text-codec.d.ts +39 -0
- package/lib/text-measure.d.ts +14 -0
- package/lib/url.d.ts +54 -0
- package/lib/websocket.d.ts +73 -0
- package/lib/windows/{advapi32.ts → advapi32.d.ts} +6 -21
- package/lib/windows/comctl32.d.ts +14 -0
- package/lib/windows/comdlg32.d.ts +4 -0
- package/lib/windows/{gdi32.ts → gdi32.d.ts} +161 -98
- package/lib/windows/{kernel32.ts → kernel32.d.ts} +138 -115
- package/lib/windows/{msimg32.ts → msimg32.d.ts} +11 -14
- package/lib/windows/ntdll.d.ts +5 -0
- package/lib/windows/ole32.d.ts +3 -0
- package/lib/windows/{psapi.ts → psapi.d.ts} +9 -18
- package/lib/windows/{shell32.ts → shell32.d.ts} +25 -24
- package/lib/windows/structs.d.ts +3141 -0
- package/lib/windows/{user32.ts → user32.d.ts} +196 -193
- package/lib/windows/version.d.ts +27 -0
- package/lib/windows/{winspool.ts → winspool.d.ts} +18 -32
- package/package.json +15 -6
- package/qwin-nowasm-x86.exe +0 -0
- package/qwin-nowasm.exe +0 -0
- package/qwin-x86.exe +0 -0
- package/qwin.exe +0 -0
- package/lib/abort.ts +0 -69
- package/lib/assert.ts +0 -7
- package/lib/bitmap.ts +0 -39
- package/lib/cache-utils.ts +0 -40
- package/lib/certs.ts +0 -258
- package/lib/dpi.ts +0 -31
- package/lib/dumpRects.ts +0 -34
- package/lib/exec-log.ts +0 -30
- package/lib/fetch.ts +0 -589
- package/lib/ffi/bind.ts +0 -540
- package/lib/ffi/ctype.ts +0 -371
- package/lib/ffi/index.ts +0 -6
- package/lib/ffi/struct.ts +0 -780
- package/lib/http-common.ts +0 -441
- package/lib/http-server.ts +0 -604
- package/lib/polyfill.ts +0 -171
- package/lib/react-qw/components/index.ts +0 -17
- package/lib/react-qw/index.ts +0 -96
- package/lib/react-qw/layout.ts +0 -111
- package/lib/react-qw/nmhdr.ts +0 -7
- package/lib/react-qw/props.ts +0 -41
- package/lib/react-qw/reconciler.ts +0 -379
- package/lib/stream.ts +0 -22
- package/lib/text-codec.ts +0 -171
- package/lib/text-measure.ts +0 -44
- package/lib/url.ts +0 -201
- package/lib/websocket.ts +0 -600
- package/lib/windows/comctl32.ts +0 -20
- package/lib/windows/comdlg32.ts +0 -10
- package/lib/windows/ntdll.ts +0 -11
- package/lib/windows/ole32.ts +0 -9
- package/lib/windows/structs.ts +0 -807
- 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
|
|
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
|
|
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
|
|
46
|
-
|
|
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
|
|
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
|
|
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
|
|
64
|
-
|
|
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
|
|
53
|
+
export declare const EndDocPrinter: (args_0: import("../ffi/ctype.js").MaybePtr<"">) => number;
|
|
68
54
|
/** 起页
|
|
69
55
|
* @returns 成功 → 非 0 */
|
|
70
|
-
export const StartPagePrinter
|
|
56
|
+
export declare const StartPagePrinter: (args_0: import("../ffi/ctype.js").MaybePtr<"">) => number;
|
|
71
57
|
/** 结束页
|
|
72
58
|
* @returns 成功 → 非 0 */
|
|
73
|
-
export const EndPagePrinter
|
|
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
|
|
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.
|
|
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
|
-
"
|
|
57
|
+
"typescript": "^7.0.2",
|
|
49
58
|
"web-streams-polyfill": "^4.3.0",
|
|
50
59
|
"ws": "^8.21.0"
|
|
51
60
|
}
|
package/qwin-nowasm-x86.exe
CHANGED
|
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
|
-
}
|
package/lib/cache-utils.ts
DELETED
|
@@ -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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
-
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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
-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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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
-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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
|
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
|
-
}
|