@dshtrading/client-ui-updater 0.6.3 → 0.7.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/client.js +22 -22
- package/lib/updater-service.d.ts +15 -0
- package/lib/updater-service.js +38 -3
- package/package.json +10 -10
package/lib/client.js
CHANGED
|
@@ -140,35 +140,35 @@ window.__ModuleLoader__.load({
|
|
|
140
140
|
document.head.appendChild(tag);
|
|
141
141
|
}
|
|
142
142
|
var updater_panel_module_css_default = {
|
|
143
|
-
"notes": "SgPada_notes",
|
|
144
|
-
"availableMeta": "SgPada_availableMeta",
|
|
145
|
-
"availableCard": "SgPada_availableCard",
|
|
146
|
-
"doneTitle": "SgPada_doneTitle",
|
|
147
|
-
"lead": "SgPada_lead",
|
|
148
143
|
"doneMeta": "SgPada_doneMeta",
|
|
144
|
+
"doneTitle": "SgPada_doneTitle",
|
|
145
|
+
"availableCard": "SgPada_availableCard",
|
|
146
|
+
"errorText": "SgPada_errorText",
|
|
147
|
+
"statusRow": "SgPada_statusRow",
|
|
149
148
|
"versions": "SgPada_versions",
|
|
150
|
-
"
|
|
151
|
-
"link": "SgPada_link",
|
|
152
|
-
"availableTitle": "SgPada_availableTitle",
|
|
153
|
-
"progressTrack": "SgPada_progressTrack",
|
|
154
|
-
"actions": "SgPada_actions",
|
|
149
|
+
"upd-slide": "SgPada_upd-slide",
|
|
155
150
|
"root": "SgPada_root",
|
|
156
|
-
"
|
|
151
|
+
"statusTextError": "SgPada_statusTextError",
|
|
152
|
+
"versionValue": "SgPada_versionValue",
|
|
153
|
+
"progressWrap": "SgPada_progressWrap",
|
|
157
154
|
"progressFill": "SgPada_progressFill",
|
|
158
|
-
"
|
|
155
|
+
"progressTrack": "SgPada_progressTrack",
|
|
156
|
+
"lead": "SgPada_lead",
|
|
157
|
+
"availableMeta": "SgPada_availableMeta",
|
|
158
|
+
"progressIndeterminate": "SgPada_progressIndeterminate",
|
|
159
159
|
"notesTitle": "SgPada_notesTitle",
|
|
160
|
-
"progressWrap": "SgPada_progressWrap",
|
|
161
|
-
"statusTextError": "SgPada_statusTextError",
|
|
162
|
-
"statusTextOk": "SgPada_statusTextOk",
|
|
163
160
|
"doneCard": "SgPada_doneCard",
|
|
161
|
+
"availableTitle": "SgPada_availableTitle",
|
|
162
|
+
"link": "SgPada_link",
|
|
164
163
|
"statusText": "SgPada_statusText",
|
|
165
|
-
"
|
|
164
|
+
"notes": "SgPada_notes",
|
|
166
165
|
"primaryButton": "SgPada_primaryButton",
|
|
167
|
-
"
|
|
168
|
-
"
|
|
166
|
+
"versionLabel": "SgPada_versionLabel",
|
|
167
|
+
"actions": "SgPada_actions",
|
|
168
|
+
"statusTextOk": "SgPada_statusTextOk",
|
|
169
169
|
"secondaryButton": "SgPada_secondaryButton",
|
|
170
|
-
"
|
|
171
|
-
"
|
|
170
|
+
"progressLabel": "SgPada_progressLabel",
|
|
171
|
+
"versionItem": "SgPada_versionItem"
|
|
172
172
|
};
|
|
173
173
|
//#endregion
|
|
174
174
|
//#region src/client/UpdaterPanel.tsx
|
|
@@ -452,11 +452,11 @@ window.__ModuleLoader__.load({
|
|
|
452
452
|
document.head.appendChild(tag);
|
|
453
453
|
}
|
|
454
454
|
var updater_dialog_module_css_default = {
|
|
455
|
-
"header": "Sd___q_header",
|
|
456
455
|
"title": "Sd___q_title",
|
|
456
|
+
"mask": "Sd___q_mask",
|
|
457
457
|
"body": "Sd___q_body",
|
|
458
458
|
"close": "Sd___q_close",
|
|
459
|
-
"
|
|
459
|
+
"header": "Sd___q_header",
|
|
460
460
|
"panel": "Sd___q_panel",
|
|
461
461
|
"overlay": "Sd___q_overlay"
|
|
462
462
|
};
|
package/lib/updater-service.d.ts
CHANGED
|
@@ -97,6 +97,12 @@ declare class UpdaterService {
|
|
|
97
97
|
constructor(options: UpdaterServiceOptions);
|
|
98
98
|
/** Load persisted check state + schedule auto checks. Idempotent. */
|
|
99
99
|
start(): void;
|
|
100
|
+
/**
|
|
101
|
+
* 启动对账:state.json 里的 available 是上次检查那一刻的结论,装着的版本一变就不再
|
|
102
|
+
* 成立(增量更新、手动换包、完整安装包 reseed 都会)。不写回去,state.json 与右缘
|
|
103
|
+
* 红点会一直声称「有新版本」,直到下一次检查。
|
|
104
|
+
*/
|
|
105
|
+
private reconcilePersistedAvailability;
|
|
100
106
|
dispose(): void;
|
|
101
107
|
/**
|
|
102
108
|
* Check GitHub for a newer stable release. Non-forced calls honor the TTL
|
|
@@ -119,6 +125,15 @@ declare class UpdaterService {
|
|
|
119
125
|
/** The full pipeline; only called via apply() (single-flight owner). */
|
|
120
126
|
private runApply;
|
|
121
127
|
private installedVersionOf;
|
|
128
|
+
/**
|
|
129
|
+
* 磁盘上真正装着的家族版本(本包自己的 manifest):env.familyVersion 只是宿主启动
|
|
130
|
+
* 那一刻的快照,增量 apply 之后进程里仍是旧值,拿它比版本会把刚装好的那一版继续
|
|
131
|
+
* 报成「有新版本」。非 profile 环境(dev checkout / 手装 headless)没有 packagesRoot,
|
|
132
|
+
* 回落启动快照——那里也没有增量通道。
|
|
133
|
+
*/
|
|
134
|
+
private installedFamilyVersion;
|
|
135
|
+
/** 「发布版比磁盘上的家族版本新」——available 的唯一判据(检查、快照、apply 三处共用)。 */
|
|
136
|
+
private availabilityOf;
|
|
122
137
|
/** Unzip into a staging dir under the profile and cross-check the manifest. */
|
|
123
138
|
private stagePackages;
|
|
124
139
|
/** Stream the payload zip with progress; verify sha256 + byte length. */
|
package/lib/updater-service.js
CHANGED
|
@@ -120,6 +120,7 @@ var UpdaterService = class {
|
|
|
120
120
|
/** Load persisted check state + schedule auto checks. Idempotent. */
|
|
121
121
|
start() {
|
|
122
122
|
if (this.disposed || this.timers.length > 0) return;
|
|
123
|
+
this.reconcilePersistedAvailability();
|
|
123
124
|
if (this.env.supported) {
|
|
124
125
|
const initialTimer = setTimeout(() => {
|
|
125
126
|
this.check(false).catch(() => void 0);
|
|
@@ -132,6 +133,21 @@ var UpdaterService = class {
|
|
|
132
133
|
this.timers.push(initialTimer, intervalTimer);
|
|
133
134
|
}
|
|
134
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* 启动对账:state.json 里的 available 是上次检查那一刻的结论,装着的版本一变就不再
|
|
138
|
+
* 成立(增量更新、手动换包、完整安装包 reseed 都会)。不写回去,state.json 与右缘
|
|
139
|
+
* 红点会一直声称「有新版本」,直到下一次检查。
|
|
140
|
+
*/
|
|
141
|
+
reconcilePersistedAvailability() {
|
|
142
|
+
if (this.checkState.latest === void 0) return;
|
|
143
|
+
const derived = this.availabilityOf(this.checkState.latest);
|
|
144
|
+
if (derived === this.checkState.available) return;
|
|
145
|
+
this.checkState = {
|
|
146
|
+
...this.checkState,
|
|
147
|
+
available: derived
|
|
148
|
+
};
|
|
149
|
+
this.persistCheck();
|
|
150
|
+
}
|
|
135
151
|
dispose() {
|
|
136
152
|
this.disposed = true;
|
|
137
153
|
for (const timer of this.timers.splice(0)) {
|
|
@@ -155,7 +171,7 @@ var UpdaterService = class {
|
|
|
155
171
|
...this.options.github?.timeoutMs === void 0 ? {} : { timeoutMs: this.options.github.timeoutMs }
|
|
156
172
|
});
|
|
157
173
|
const latest = release === void 0 ? void 0 : this.latestOf(release);
|
|
158
|
-
const available =
|
|
174
|
+
const available = this.availabilityOf(latest);
|
|
159
175
|
this.rateLimitedUntil = 0;
|
|
160
176
|
this.checkState = {
|
|
161
177
|
at: new Date(this.now()).toISOString(),
|
|
@@ -219,7 +235,7 @@ var UpdaterService = class {
|
|
|
219
235
|
async apply() {
|
|
220
236
|
if (this.applyInFlight || this.applyState.phase === "running") throw new UpdaterError("UPDATER_BUSY", "an update is already in progress");
|
|
221
237
|
if (!this.env.supported || this.env.profileRoot === void 0 || this.env.packagesRoot === void 0) throw new UpdaterError("UPDATER_UNSUPPORTED", "incremental update requires a desktop-seeded profile");
|
|
222
|
-
if (this.checkState.status !== "ok" || this.checkState.
|
|
238
|
+
if (this.checkState.status !== "ok" || this.checkState.latest === void 0 || !this.availabilityOf(this.checkState.latest)) throw new UpdaterError("UPDATER_NO_UPDATE", "no newer release is available");
|
|
223
239
|
if (this.checkState.latest.payloadAvailable !== true) throw new UpdaterError("UPDATER_PAYLOAD_UNAVAILABLE", "this release does not carry the incremental payload");
|
|
224
240
|
this.applyInFlight = true;
|
|
225
241
|
const target = this.checkState.latest;
|
|
@@ -354,6 +370,22 @@ var UpdaterService = class {
|
|
|
354
370
|
return "missing";
|
|
355
371
|
}
|
|
356
372
|
}
|
|
373
|
+
/**
|
|
374
|
+
* 磁盘上真正装着的家族版本(本包自己的 manifest):env.familyVersion 只是宿主启动
|
|
375
|
+
* 那一刻的快照,增量 apply 之后进程里仍是旧值,拿它比版本会把刚装好的那一版继续
|
|
376
|
+
* 报成「有新版本」。非 profile 环境(dev checkout / 手装 headless)没有 packagesRoot,
|
|
377
|
+
* 回落启动快照——那里也没有增量通道。
|
|
378
|
+
*/
|
|
379
|
+
installedFamilyVersion() {
|
|
380
|
+
const packagesRoot = this.env.packagesRoot;
|
|
381
|
+
if (packagesRoot === void 0) return this.env.familyVersion;
|
|
382
|
+
const installed = this.installedVersionOf(path.join(packagesRoot, "client-ui-updater"));
|
|
383
|
+
return installed === "unknown" || installed === "missing" ? this.env.familyVersion : installed;
|
|
384
|
+
}
|
|
385
|
+
/** 「发布版比磁盘上的家族版本新」——available 的唯一判据(检查、快照、apply 三处共用)。 */
|
|
386
|
+
availabilityOf(latest) {
|
|
387
|
+
return latest?.version !== void 0 && isNewerVersion(latest.version, this.installedFamilyVersion());
|
|
388
|
+
}
|
|
357
389
|
/** Unzip into a staging dir under the profile and cross-check the manifest. */
|
|
358
390
|
stagePackages(zipBytes, manifest, profileRoot) {
|
|
359
391
|
let entries;
|
|
@@ -468,7 +500,10 @@ var UpdaterService = class {
|
|
|
468
500
|
profileRoot: this.env.profileRoot,
|
|
469
501
|
supported: this.env.supported
|
|
470
502
|
},
|
|
471
|
-
check:
|
|
503
|
+
check: {
|
|
504
|
+
...this.checkState,
|
|
505
|
+
available: this.availabilityOf(this.checkState.latest)
|
|
506
|
+
},
|
|
472
507
|
apply: this.applyState,
|
|
473
508
|
progress: this.applyState.phase === "running" ? this.progress : void 0
|
|
474
509
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dshtrading/client-ui-updater",
|
|
3
3
|
"description": "dsh-trading auto-update plugin: GitHub Releases version check with release notes, incremental update of the @dshtrading/* plugin family inside a desktop-seeded profile (vendor payload zip, per-package swap), and the software-update dialog opened from the trading sidebar's update entry. Browser half registers the shell.overlay dialog; node half registers the /dshtrading/api/updater routes and the update engine.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.7.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"types": "./lib/index.d.ts",
|
|
@@ -25,13 +25,13 @@
|
|
|
25
25
|
"license": "PolyForm-Noncommercial-1.0.0",
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"fflate": "^0.8.2",
|
|
28
|
-
"@dshtrading/dsh-home": "^0.
|
|
28
|
+
"@dshtrading/dsh-home": "^0.7.1"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
|
-
"@deepseek-ai/cordis": ">=4.
|
|
32
|
-
"@deepseek-ai/dsh-client-locale": ">=0.2.
|
|
33
|
-
"@deepseek-ai/dsh-client-ui-layout": ">=0.2.
|
|
34
|
-
"@deepseek-ai/dsh-client-ui-slots": ">=0.2.
|
|
31
|
+
"@deepseek-ai/cordis": ">=4.1.0",
|
|
32
|
+
"@deepseek-ai/dsh-client-locale": ">=0.2.2-rc.1",
|
|
33
|
+
"@deepseek-ai/dsh-client-ui-layout": ">=0.2.2-rc.1",
|
|
34
|
+
"@deepseek-ai/dsh-client-ui-slots": ">=0.2.2-rc.1",
|
|
35
35
|
"react": "^18.2.0",
|
|
36
36
|
"@types/react": "~18.3.1"
|
|
37
37
|
},
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@deepseek-ai/cordis": "^4.0
|
|
49
|
-
"@deepseek-ai/dsh-client-locale": "0.2.
|
|
50
|
-
"@deepseek-ai/dsh-client-ui-layout": "0.2.
|
|
51
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.2.
|
|
48
|
+
"@deepseek-ai/cordis": "^4.1.0",
|
|
49
|
+
"@deepseek-ai/dsh-client-locale": "0.2.2-rc.1",
|
|
50
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.2.2-rc.1",
|
|
51
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.2-rc.1",
|
|
52
52
|
"@types/node": "^24.0.0",
|
|
53
53
|
"@types/react": "~18.3.1",
|
|
54
54
|
"lightningcss": "^1.0.0",
|