@spinajs/templates-puppeteer 2.0.498 → 2.0.499
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/cjs/progress.d.ts +20 -0
- package/lib/cjs/progress.d.ts.map +1 -1
- package/lib/cjs/progress.js +75 -4
- package/lib/cjs/progress.js.map +1 -1
- package/lib/mjs/progress.d.ts +20 -0
- package/lib/mjs/progress.d.ts.map +1 -1
- package/lib/mjs/progress.js +73 -3
- package/lib/mjs/progress.js.map +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +6 -6
package/lib/cjs/progress.d.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import { Page } from 'puppeteer';
|
|
2
2
|
import { RenderPhase, RenderProgressCallback } from '@spinajs/templates';
|
|
3
|
+
/** Console-line prefix of the generic in-page progress protocol. */
|
|
4
|
+
export declare const PAGE_PROGRESS_PREFIX = "__spinajs_progress__:";
|
|
5
|
+
/**
|
|
6
|
+
* Parse one console line of the in-page progress protocol:
|
|
7
|
+
* `__spinajs_progress__:{"task":"images","done":2,"total":40}`.
|
|
8
|
+
* Returns null for anything that is not a well-formed protocol line — progress
|
|
9
|
+
* must never break a render, so there is no error path.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseProgressLine(text: string): {
|
|
12
|
+
task: string;
|
|
13
|
+
done: number;
|
|
14
|
+
total: number;
|
|
15
|
+
} | null;
|
|
3
16
|
/**
|
|
4
17
|
* Tracks a single puppeteer render and delivers throttled {@link IRenderProgress}
|
|
5
18
|
* snapshots to a callback. Resource counts come from the page's request lifecycle
|
|
@@ -18,6 +31,8 @@ export declare class RenderProgressReporter {
|
|
|
18
31
|
private loaded;
|
|
19
32
|
private pending;
|
|
20
33
|
private failed;
|
|
34
|
+
/** Last reported counts per task from the in-page progress protocol. */
|
|
35
|
+
private tasks;
|
|
21
36
|
private lastEmitAt;
|
|
22
37
|
private lastPercent;
|
|
23
38
|
private heartbeat;
|
|
@@ -25,6 +40,7 @@ export declare class RenderProgressReporter {
|
|
|
25
40
|
private readonly onRequest;
|
|
26
41
|
private readonly onRequestFinished;
|
|
27
42
|
private readonly onRequestFailed;
|
|
43
|
+
private readonly onConsole;
|
|
28
44
|
constructor(filePath: string, callback?: RenderProgressCallback);
|
|
29
45
|
/** Attach resource-lifecycle counters to the page. Call once, after newPage(). */
|
|
30
46
|
attach(page: Page): void;
|
|
@@ -35,6 +51,10 @@ export declare class RenderProgressReporter {
|
|
|
35
51
|
private startHeartbeat;
|
|
36
52
|
private stopHeartbeat;
|
|
37
53
|
private computePercent;
|
|
54
|
+
/** Exact ratio from page-reported tasks, or null when nothing (usable) was reported. */
|
|
55
|
+
private taskRatio;
|
|
56
|
+
/** Approximate ratio from the request lifecycle; total is unknown up front. */
|
|
57
|
+
private requestRatio;
|
|
38
58
|
private emit;
|
|
39
59
|
private defaultMessage;
|
|
40
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,IAAI,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAmB,WAAW,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAmB1F,oEAAoE;AACpE,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAuBpG;AAED;;;;;;;;GAQG;AACH,qBAAa,sBAAsB;IA0CrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAzCrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAEhD,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,MAAM,CAAK;IACnB,wEAAwE;IACxE,OAAO,CAAC,KAAK,CAA6D;IAE1E,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,IAAI,CAAqB;IAGjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAExB;IACF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAIhC;IACF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAI9B;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAQxB;IAEF,YAA6B,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,sBAAsB,EAG/E;IAED,kFAAkF;IAC3E,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAU9B;IAED,+EAA+E;IACxE,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAevD;IAED,iFAAiF;IAC1E,OAAO,IAAI,IAAI,CAUrB;IAED,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;IAsBtB,wFAAwF;IACxF,OAAO,CAAC,SAAS;IAejB,+EAA+E;IAC/E,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,IAAI;IAuCZ,OAAO,CAAC,cAAc;CAyBvB"}
|
package/lib/cjs/progress.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RenderProgressReporter = void 0;
|
|
3
|
+
exports.RenderProgressReporter = exports.PAGE_PROGRESS_PREFIX = void 0;
|
|
4
|
+
exports.parseProgressLine = parseProgressLine;
|
|
4
5
|
const templates_1 = require("@spinajs/templates");
|
|
5
6
|
/** Minimum gap between resource-driven emissions (ms). */
|
|
6
7
|
const THROTTLE_MS = 150;
|
|
7
8
|
/** Re-emit interval during long phases so the bar moves even when nothing changes (ms). */
|
|
8
9
|
const HEARTBEAT_MS = 750;
|
|
10
|
+
/** Cap on the request-approximation ratio before any task line arrives (see computePercent). */
|
|
11
|
+
const PRE_TASK_APPROXIMATION_CAP = 0.5;
|
|
9
12
|
/** Percent band [start, end] each phase occupies. */
|
|
10
13
|
const PHASE_BANDS = {
|
|
11
14
|
[templates_1.RenderPhase.Starting]: [0, 10],
|
|
@@ -15,6 +18,36 @@ const PHASE_BANDS = {
|
|
|
15
18
|
[templates_1.RenderPhase.Done]: [100, 100],
|
|
16
19
|
[templates_1.RenderPhase.Failed]: [0, 0],
|
|
17
20
|
};
|
|
21
|
+
/** Console-line prefix of the generic in-page progress protocol. */
|
|
22
|
+
exports.PAGE_PROGRESS_PREFIX = '__spinajs_progress__:';
|
|
23
|
+
/**
|
|
24
|
+
* Parse one console line of the in-page progress protocol:
|
|
25
|
+
* `__spinajs_progress__:{"task":"images","done":2,"total":40}`.
|
|
26
|
+
* Returns null for anything that is not a well-formed protocol line — progress
|
|
27
|
+
* must never break a render, so there is no error path.
|
|
28
|
+
*/
|
|
29
|
+
function parseProgressLine(text) {
|
|
30
|
+
if (!text || !text.startsWith(exports.PAGE_PROGRESS_PREFIX)) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const raw = JSON.parse(text.slice(exports.PAGE_PROGRESS_PREFIX.length));
|
|
35
|
+
const { task, done, total } = raw;
|
|
36
|
+
if (typeof task !== 'string' || task.length === 0) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
if (typeof done !== 'number' || !Number.isFinite(done) || done < 0) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
if (typeof total !== 'number' || !Number.isFinite(total) || total < 0) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return { task, done, total };
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
18
51
|
/**
|
|
19
52
|
* Tracks a single puppeteer render and delivers throttled {@link IRenderProgress}
|
|
20
53
|
* snapshots to a callback. Resource counts come from the page's request lifecycle
|
|
@@ -32,6 +65,8 @@ class RenderProgressReporter {
|
|
|
32
65
|
this.loaded = 0;
|
|
33
66
|
this.pending = 0;
|
|
34
67
|
this.failed = 0;
|
|
68
|
+
/** Last reported counts per task from the in-page progress protocol. */
|
|
69
|
+
this.tasks = null;
|
|
35
70
|
this.lastEmitAt = 0;
|
|
36
71
|
this.lastPercent = 0;
|
|
37
72
|
this.heartbeat = null;
|
|
@@ -50,6 +85,14 @@ class RenderProgressReporter {
|
|
|
50
85
|
this.failed++;
|
|
51
86
|
this.emit();
|
|
52
87
|
};
|
|
88
|
+
this.onConsole = (msg) => {
|
|
89
|
+
const parsed = parseProgressLine(typeof msg?.text === 'function' ? msg.text() : '');
|
|
90
|
+
if (!parsed) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
(this.tasks ??= new Map()).set(parsed.task, { done: parsed.done, total: parsed.total });
|
|
94
|
+
this.emit();
|
|
95
|
+
};
|
|
53
96
|
this.enabled = !!callback;
|
|
54
97
|
this.callback = callback ?? (() => undefined);
|
|
55
98
|
}
|
|
@@ -62,6 +105,7 @@ class RenderProgressReporter {
|
|
|
62
105
|
page.on('request', this.onRequest);
|
|
63
106
|
page.on('requestfinished', this.onRequestFinished);
|
|
64
107
|
page.on('requestfailed', this.onRequestFailed);
|
|
108
|
+
page.on('console', this.onConsole);
|
|
65
109
|
}
|
|
66
110
|
/** Transition to a new phase and emit immediately (bypassing the throttle). */
|
|
67
111
|
phase(phase, message) {
|
|
@@ -85,6 +129,7 @@ class RenderProgressReporter {
|
|
|
85
129
|
this.page.off('request', this.onRequest);
|
|
86
130
|
this.page.off('requestfinished', this.onRequestFinished);
|
|
87
131
|
this.page.off('requestfailed', this.onRequestFailed);
|
|
132
|
+
this.page.off('console', this.onConsole);
|
|
88
133
|
this.page = null;
|
|
89
134
|
}
|
|
90
135
|
}
|
|
@@ -108,14 +153,36 @@ class RenderProgressReporter {
|
|
|
108
153
|
}
|
|
109
154
|
const [start, end] = PHASE_BANDS[this.phaseNow];
|
|
110
155
|
if (this.phaseNow === templates_1.RenderPhase.Loading) {
|
|
111
|
-
//
|
|
112
|
-
|
|
113
|
-
|
|
156
|
+
// Page-reported task totals are exact. Until the first task line arrives,
|
|
157
|
+
// cap the request-count approximation at half the band: a transient
|
|
158
|
+
// loaded/seen spike (e.g. one early asset with nothing else pending)
|
|
159
|
+
// would otherwise pin the never-regressing percent at the band end,
|
|
160
|
+
// locking out the exact task-driven percent for the rest of the load.
|
|
161
|
+
const taskRatio = this.taskRatio();
|
|
162
|
+
const ratio = taskRatio ?? Math.min(this.requestRatio(), PRE_TASK_APPROXIMATION_CAP);
|
|
114
163
|
return Math.max(this.lastPercent, Math.min(end, Math.round(start + (end - start) * ratio)));
|
|
115
164
|
}
|
|
116
165
|
// milestone phases sit at their band start (Done -> 100); never regress
|
|
117
166
|
return Math.max(this.lastPercent, start);
|
|
118
167
|
}
|
|
168
|
+
/** Exact ratio from page-reported tasks, or null when nothing (usable) was reported. */
|
|
169
|
+
taskRatio() {
|
|
170
|
+
if (!this.tasks?.size) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
let done = 0;
|
|
174
|
+
let total = 0;
|
|
175
|
+
for (const t of this.tasks.values()) {
|
|
176
|
+
done += Math.min(t.done, t.total);
|
|
177
|
+
total += t.total;
|
|
178
|
+
}
|
|
179
|
+
return total > 0 ? Math.min(1, done / total) : null;
|
|
180
|
+
}
|
|
181
|
+
/** Approximate ratio from the request lifecycle; total is unknown up front. */
|
|
182
|
+
requestRatio() {
|
|
183
|
+
const seen = this.loaded + this.pending;
|
|
184
|
+
return seen > 0 ? this.loaded / seen : 0;
|
|
185
|
+
}
|
|
119
186
|
emit(message, force = false) {
|
|
120
187
|
if (!this.enabled) {
|
|
121
188
|
return;
|
|
@@ -136,6 +203,7 @@ class RenderProgressReporter {
|
|
|
136
203
|
elapsedMs: now - this.startedAt,
|
|
137
204
|
filePath: this.filePath,
|
|
138
205
|
message: message ?? this.defaultMessage(),
|
|
206
|
+
tasks: this.tasks?.size ? Object.fromEntries([...this.tasks].map(([name, t]) => [name, { ...t }])) : undefined,
|
|
139
207
|
};
|
|
140
208
|
// progress must never stall or break a render: don't await, swallow errors
|
|
141
209
|
try {
|
|
@@ -157,6 +225,9 @@ class RenderProgressReporter {
|
|
|
157
225
|
case templates_1.RenderPhase.Preparing:
|
|
158
226
|
return 'Preparing HTML';
|
|
159
227
|
case templates_1.RenderPhase.Loading: {
|
|
228
|
+
if (this.tasks?.size) {
|
|
229
|
+
return [...this.tasks].map(([name, t]) => `${name} ${t.done}/${t.total}`).join(', ');
|
|
230
|
+
}
|
|
160
231
|
const extra = [`${this.loaded} done`];
|
|
161
232
|
if (this.pending)
|
|
162
233
|
extra.push(`${this.pending} pending`);
|
package/lib/cjs/progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"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"}
|
package/lib/mjs/progress.d.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import { Page } from 'puppeteer';
|
|
2
2
|
import { RenderPhase, RenderProgressCallback } from '@spinajs/templates';
|
|
3
|
+
/** Console-line prefix of the generic in-page progress protocol. */
|
|
4
|
+
export declare const PAGE_PROGRESS_PREFIX = "__spinajs_progress__:";
|
|
5
|
+
/**
|
|
6
|
+
* Parse one console line of the in-page progress protocol:
|
|
7
|
+
* `__spinajs_progress__:{"task":"images","done":2,"total":40}`.
|
|
8
|
+
* Returns null for anything that is not a well-formed protocol line — progress
|
|
9
|
+
* must never break a render, so there is no error path.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseProgressLine(text: string): {
|
|
12
|
+
task: string;
|
|
13
|
+
done: number;
|
|
14
|
+
total: number;
|
|
15
|
+
} | null;
|
|
3
16
|
/**
|
|
4
17
|
* Tracks a single puppeteer render and delivers throttled {@link IRenderProgress}
|
|
5
18
|
* snapshots to a callback. Resource counts come from the page's request lifecycle
|
|
@@ -18,6 +31,8 @@ export declare class RenderProgressReporter {
|
|
|
18
31
|
private loaded;
|
|
19
32
|
private pending;
|
|
20
33
|
private failed;
|
|
34
|
+
/** Last reported counts per task from the in-page progress protocol. */
|
|
35
|
+
private tasks;
|
|
21
36
|
private lastEmitAt;
|
|
22
37
|
private lastPercent;
|
|
23
38
|
private heartbeat;
|
|
@@ -25,6 +40,7 @@ export declare class RenderProgressReporter {
|
|
|
25
40
|
private readonly onRequest;
|
|
26
41
|
private readonly onRequestFinished;
|
|
27
42
|
private readonly onRequestFailed;
|
|
43
|
+
private readonly onConsole;
|
|
28
44
|
constructor(filePath: string, callback?: RenderProgressCallback);
|
|
29
45
|
/** Attach resource-lifecycle counters to the page. Call once, after newPage(). */
|
|
30
46
|
attach(page: Page): void;
|
|
@@ -35,6 +51,10 @@ export declare class RenderProgressReporter {
|
|
|
35
51
|
private startHeartbeat;
|
|
36
52
|
private stopHeartbeat;
|
|
37
53
|
private computePercent;
|
|
54
|
+
/** Exact ratio from page-reported tasks, or null when nothing (usable) was reported. */
|
|
55
|
+
private taskRatio;
|
|
56
|
+
/** Approximate ratio from the request lifecycle; total is unknown up front. */
|
|
57
|
+
private requestRatio;
|
|
38
58
|
private emit;
|
|
39
59
|
private defaultMessage;
|
|
40
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,IAAI,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAmB,WAAW,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAmB1F,oEAAoE;AACpE,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAuBpG;AAED;;;;;;;;GAQG;AACH,qBAAa,sBAAsB;IA0CrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAzCrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAEhD,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,MAAM,CAAK;IACnB,wEAAwE;IACxE,OAAO,CAAC,KAAK,CAA6D;IAE1E,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,IAAI,CAAqB;IAGjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAExB;IACF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAIhC;IACF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAI9B;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAQxB;IAEF,YAA6B,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,sBAAsB,EAG/E;IAED,kFAAkF;IAC3E,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAU9B;IAED,+EAA+E;IACxE,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAevD;IAED,iFAAiF;IAC1E,OAAO,IAAI,IAAI,CAUrB;IAED,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;IAsBtB,wFAAwF;IACxF,OAAO,CAAC,SAAS;IAejB,+EAA+E;IAC/E,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,IAAI;IAuCZ,OAAO,CAAC,cAAc;CAyBvB"}
|
package/lib/mjs/progress.js
CHANGED
|
@@ -3,6 +3,8 @@ import { RenderPhase } from '@spinajs/templates';
|
|
|
3
3
|
const THROTTLE_MS = 150;
|
|
4
4
|
/** Re-emit interval during long phases so the bar moves even when nothing changes (ms). */
|
|
5
5
|
const HEARTBEAT_MS = 750;
|
|
6
|
+
/** Cap on the request-approximation ratio before any task line arrives (see computePercent). */
|
|
7
|
+
const PRE_TASK_APPROXIMATION_CAP = 0.5;
|
|
6
8
|
/** Percent band [start, end] each phase occupies. */
|
|
7
9
|
const PHASE_BANDS = {
|
|
8
10
|
[RenderPhase.Starting]: [0, 10],
|
|
@@ -12,6 +14,36 @@ const PHASE_BANDS = {
|
|
|
12
14
|
[RenderPhase.Done]: [100, 100],
|
|
13
15
|
[RenderPhase.Failed]: [0, 0],
|
|
14
16
|
};
|
|
17
|
+
/** Console-line prefix of the generic in-page progress protocol. */
|
|
18
|
+
export const PAGE_PROGRESS_PREFIX = '__spinajs_progress__:';
|
|
19
|
+
/**
|
|
20
|
+
* Parse one console line of the in-page progress protocol:
|
|
21
|
+
* `__spinajs_progress__:{"task":"images","done":2,"total":40}`.
|
|
22
|
+
* Returns null for anything that is not a well-formed protocol line — progress
|
|
23
|
+
* must never break a render, so there is no error path.
|
|
24
|
+
*/
|
|
25
|
+
export function parseProgressLine(text) {
|
|
26
|
+
if (!text || !text.startsWith(PAGE_PROGRESS_PREFIX)) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const raw = JSON.parse(text.slice(PAGE_PROGRESS_PREFIX.length));
|
|
31
|
+
const { task, done, total } = raw;
|
|
32
|
+
if (typeof task !== 'string' || task.length === 0) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
if (typeof done !== 'number' || !Number.isFinite(done) || done < 0) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
if (typeof total !== 'number' || !Number.isFinite(total) || total < 0) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return { task, done, total };
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
15
47
|
/**
|
|
16
48
|
* Tracks a single puppeteer render and delivers throttled {@link IRenderProgress}
|
|
17
49
|
* snapshots to a callback. Resource counts come from the page's request lifecycle
|
|
@@ -29,6 +61,8 @@ export class RenderProgressReporter {
|
|
|
29
61
|
this.loaded = 0;
|
|
30
62
|
this.pending = 0;
|
|
31
63
|
this.failed = 0;
|
|
64
|
+
/** Last reported counts per task from the in-page progress protocol. */
|
|
65
|
+
this.tasks = null;
|
|
32
66
|
this.lastEmitAt = 0;
|
|
33
67
|
this.lastPercent = 0;
|
|
34
68
|
this.heartbeat = null;
|
|
@@ -47,6 +81,14 @@ export class RenderProgressReporter {
|
|
|
47
81
|
this.failed++;
|
|
48
82
|
this.emit();
|
|
49
83
|
};
|
|
84
|
+
this.onConsole = (msg) => {
|
|
85
|
+
const parsed = parseProgressLine(typeof msg?.text === 'function' ? msg.text() : '');
|
|
86
|
+
if (!parsed) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
(this.tasks ??= new Map()).set(parsed.task, { done: parsed.done, total: parsed.total });
|
|
90
|
+
this.emit();
|
|
91
|
+
};
|
|
50
92
|
this.enabled = !!callback;
|
|
51
93
|
this.callback = callback ?? (() => undefined);
|
|
52
94
|
}
|
|
@@ -59,6 +101,7 @@ export class RenderProgressReporter {
|
|
|
59
101
|
page.on('request', this.onRequest);
|
|
60
102
|
page.on('requestfinished', this.onRequestFinished);
|
|
61
103
|
page.on('requestfailed', this.onRequestFailed);
|
|
104
|
+
page.on('console', this.onConsole);
|
|
62
105
|
}
|
|
63
106
|
/** Transition to a new phase and emit immediately (bypassing the throttle). */
|
|
64
107
|
phase(phase, message) {
|
|
@@ -82,6 +125,7 @@ export class RenderProgressReporter {
|
|
|
82
125
|
this.page.off('request', this.onRequest);
|
|
83
126
|
this.page.off('requestfinished', this.onRequestFinished);
|
|
84
127
|
this.page.off('requestfailed', this.onRequestFailed);
|
|
128
|
+
this.page.off('console', this.onConsole);
|
|
85
129
|
this.page = null;
|
|
86
130
|
}
|
|
87
131
|
}
|
|
@@ -105,14 +149,36 @@ export class RenderProgressReporter {
|
|
|
105
149
|
}
|
|
106
150
|
const [start, end] = PHASE_BANDS[this.phaseNow];
|
|
107
151
|
if (this.phaseNow === RenderPhase.Loading) {
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
152
|
+
// Page-reported task totals are exact. Until the first task line arrives,
|
|
153
|
+
// cap the request-count approximation at half the band: a transient
|
|
154
|
+
// loaded/seen spike (e.g. one early asset with nothing else pending)
|
|
155
|
+
// would otherwise pin the never-regressing percent at the band end,
|
|
156
|
+
// locking out the exact task-driven percent for the rest of the load.
|
|
157
|
+
const taskRatio = this.taskRatio();
|
|
158
|
+
const ratio = taskRatio ?? Math.min(this.requestRatio(), PRE_TASK_APPROXIMATION_CAP);
|
|
111
159
|
return Math.max(this.lastPercent, Math.min(end, Math.round(start + (end - start) * ratio)));
|
|
112
160
|
}
|
|
113
161
|
// milestone phases sit at their band start (Done -> 100); never regress
|
|
114
162
|
return Math.max(this.lastPercent, start);
|
|
115
163
|
}
|
|
164
|
+
/** Exact ratio from page-reported tasks, or null when nothing (usable) was reported. */
|
|
165
|
+
taskRatio() {
|
|
166
|
+
if (!this.tasks?.size) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
let done = 0;
|
|
170
|
+
let total = 0;
|
|
171
|
+
for (const t of this.tasks.values()) {
|
|
172
|
+
done += Math.min(t.done, t.total);
|
|
173
|
+
total += t.total;
|
|
174
|
+
}
|
|
175
|
+
return total > 0 ? Math.min(1, done / total) : null;
|
|
176
|
+
}
|
|
177
|
+
/** Approximate ratio from the request lifecycle; total is unknown up front. */
|
|
178
|
+
requestRatio() {
|
|
179
|
+
const seen = this.loaded + this.pending;
|
|
180
|
+
return seen > 0 ? this.loaded / seen : 0;
|
|
181
|
+
}
|
|
116
182
|
emit(message, force = false) {
|
|
117
183
|
if (!this.enabled) {
|
|
118
184
|
return;
|
|
@@ -133,6 +199,7 @@ export class RenderProgressReporter {
|
|
|
133
199
|
elapsedMs: now - this.startedAt,
|
|
134
200
|
filePath: this.filePath,
|
|
135
201
|
message: message ?? this.defaultMessage(),
|
|
202
|
+
tasks: this.tasks?.size ? Object.fromEntries([...this.tasks].map(([name, t]) => [name, { ...t }])) : undefined,
|
|
136
203
|
};
|
|
137
204
|
// progress must never stall or break a render: don't await, swallow errors
|
|
138
205
|
try {
|
|
@@ -154,6 +221,9 @@ export class RenderProgressReporter {
|
|
|
154
221
|
case RenderPhase.Preparing:
|
|
155
222
|
return 'Preparing HTML';
|
|
156
223
|
case RenderPhase.Loading: {
|
|
224
|
+
if (this.tasks?.size) {
|
|
225
|
+
return [...this.tasks].map(([name, t]) => `${name} ${t.done}/${t.total}`).join(', ');
|
|
226
|
+
}
|
|
157
227
|
const extra = [`${this.loaded} done`];
|
|
158
228
|
if (this.pending)
|
|
159
229
|
extra.push(`${this.pending} pending`);
|
package/lib/mjs/progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,WAAW,EAA0B,MAAM,oBAAoB,CAAC;AAE1F,0DAA0D;AAC1D,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,2FAA2F;AAC3F,MAAM,YAAY,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"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"}
|