Files
eh-downloader/frontend/wailsjs/go/models.ts
T
toor 0f927147cd feat: EH Downloader 用 Go + Wails v2 重写
原 Electron 版在这台 Windows 机器上无法启动(0x80000003 崩在 V8 初始化),
整个业务逻辑用 Go 重写,前端界面与协议结论完全保留。

- internal/eh: 协议核心,画廊页分页 -> /s/ -> hath 直链 -> 下载
- internal/core: 并发引擎 / 状态存储 / 目录模板 / 油猴桥口
- app.go: Wails 绑定层,替代 Electron IPC
- frontend/js/api.js: 适配层,renderer.js 一行未改
- 37 个测试,含 httptest 模拟 EH 的端到端链路验证

相比 Electron 版:90MB -> 12.4MB,180MB 内存 -> 27MB,构建 90s -> 2s。

顺带修掉原版代理探测的 bug(永远返回第一个端口,从不等连接结果)。
2026-10-08 23:28:16 +08:00

175 lines
4.6 KiB
TypeScript

export namespace core {
export class FailedItem {
page: number;
file: string;
error: string;
static createFrom(source: any = {}) {
return new FailedItem(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.page = source["page"];
this.file = source["file"];
this.error = source["error"];
}
}
export class Settings {
downloadRoot: string;
proxy: string;
proxyMode: string;
concurrency: number;
timeout: number;
xres: string;
bridgePort: number;
dirTemplate: string;
_probed: boolean;
static createFrom(source: any = {}) {
return new Settings(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.downloadRoot = source["downloadRoot"];
this.proxy = source["proxy"];
this.proxyMode = source["proxyMode"];
this.concurrency = source["concurrency"];
this.timeout = source["timeout"];
this.xres = source["xres"];
this.bridgePort = source["bridgePort"];
this.dirTemplate = source["dirTemplate"];
this._probed = source["_probed"];
}
}
export class Task {
gid: string;
token: string;
raw: string;
title: string;
status: string;
done: number;
failed: number;
totalPages: number;
error: string;
dir: string;
pages: Record<string, string>;
failedList: FailedItem[];
selected: boolean;
createdAt: number;
updatedAt: number;
static createFrom(source: any = {}) {
return new Task(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.gid = source["gid"];
this.token = source["token"];
this.raw = source["raw"];
this.title = source["title"];
this.status = source["status"];
this.done = source["done"];
this.failed = source["failed"];
this.totalPages = source["totalPages"];
this.error = source["error"];
this.dir = source["dir"];
this.pages = source["pages"];
this.failedList = this.convertValues(source["failedList"], FailedItem);
this.selected = source["selected"];
this.createdAt = source["createdAt"];
this.updatedAt = source["updatedAt"];
}
convertValues(a: any, classs: any, asMap: boolean = false): any {
if (!a) {
return a;
}
if (a.slice && a.map) {
return (a as any[]).map(elem => this.convertValues(elem, classs));
} else if ("object" === typeof a) {
if (asMap) {
for (const key of Object.keys(a)) {
a[key] = new classs(a[key]);
}
return a;
}
return new classs(a);
}
return a;
}
}
}
export namespace main {
export class AddTasksResult {
added: number;
skipped: number;
warning: string;
static createFrom(source: any = {}) {
return new AddTasksResult(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.added = source["added"];
this.skipped = source["skipped"];
this.warning = source["warning"];
}
}
export class DirPreviewResult {
ok: boolean;
path: string;
error: string;
static createFrom(source: any = {}) {
return new DirPreviewResult(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.ok = source["ok"];
this.path = source["path"];
this.error = source["error"];
}
}
export class StartResult {
started: boolean;
reason: string;
count: number;
static createFrom(source: any = {}) {
return new StartResult(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.started = source["started"];
this.reason = source["reason"];
this.count = source["count"];
}
}
export class StatusResult {
running: boolean;
queued: number;
static createFrom(source: any = {}) {
return new StatusResult(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.running = source["running"];
this.queued = source["queued"];
}
}
}