@qianxiang-ai/fu-report-image-export-engine 1.1.8 → 1.1.10
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/dist/controller.d.ts.map +1 -1
- package/dist/controller.js +107 -71
- package/dist/controller.js.map +1 -1
- package/dist/image-dimensions.d.ts +7 -0
- package/dist/image-dimensions.d.ts.map +1 -0
- package/dist/image-dimensions.js +175 -0
- package/dist/image-dimensions.js.map +1 -0
- package/dist/memory-budget.d.ts.map +1 -1
- package/dist/memory-budget.js +2 -1
- package/dist/memory-budget.js.map +1 -1
- package/dist/resource-lru.d.ts +1 -0
- package/dist/resource-lru.d.ts.map +1 -1
- package/dist/resource-lru.js +8 -0
- package/dist/resource-lru.js.map +1 -1
- package/dist/snapshot.d.ts.map +1 -1
- package/dist/snapshot.js +3 -2
- package/dist/snapshot.js.map +1 -1
- package/dist/stream-encoder.js +6 -9
- package/dist/stream-encoder.js.map +1 -1
- package/dist/tile-renderer.d.ts.map +1 -1
- package/dist/tile-renderer.js +100 -111
- package/dist/tile-renderer.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
package/dist/controller.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,YAAY,CAAA;AAGnB,OAAO,KAAK,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAEnG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAA;IACtC,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAAA;IACtD,SAAS,IAAI,IAAI,CAAA;IACjB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,2BAA2B,CAAC,KAAK,IAAI,GAAG,IAAI,CAAA;IAC7G,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAA;CAC7E;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAA;IACtC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,uBAAuB,CAAA;IACtD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CACrC;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,0BAA0B,EACnC,YAAY,GAAE,+BAAoC,GACjD,OAAO,CAAC,yBAAyB,CAAC,
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,YAAY,CAAA;AAGnB,OAAO,KAAK,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAEnG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAA;IACtC,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAAA;IACtD,SAAS,IAAI,IAAI,CAAA;IACjB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,2BAA2B,CAAC,KAAK,IAAI,GAAG,IAAI,CAAA;IAC7G,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAA;CAC7E;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAA;IACtC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,uBAAuB,CAAA;IACtD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CACrC;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,0BAA0B,EACnC,YAAY,GAAE,+BAAoC,GACjD,OAAO,CAAC,yBAAyB,CAAC,CAsJpC;AAED,wBAAgB,yBAAyB,CAAC,cAAc,SAAgB,GAAG,uBAAuB,CAOjG"}
|
package/dist/controller.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { FuReportImageExportError } from './types.js';
|
|
1
|
+
import { FuReportImageExportError, assertFuReportImageContentSupported } from './types.js';
|
|
2
2
|
import { FU_REPORT_IMAGE_WASM_SHA256, FU_REPORT_IMAGE_WORKER_PROTOCOL } from './wasm-kernel.js';
|
|
3
3
|
export async function exportFuReportImage(snapshot, options, dependencies = {}) {
|
|
4
4
|
if (options.runtimeBuildId !== options.clientBuildId) {
|
|
5
5
|
throw new FuReportImageExportError('EXPORT_BUILD_MISMATCH', 'runtime-config 与当前页面 buildId 不一致');
|
|
6
6
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const worker = dependencies.workerFactory?.() ?? createFuReportImageWorker(options.clientBuildId);
|
|
7
|
+
assertFuReportImageContentSupported(snapshot);
|
|
8
|
+
const target = dependencies.target ?? await selectFuReportOutputTarget(options.filename ?? defaultFilename(options.format), options.format, dependencies.blobLimitBytes, dependencies.forceBlobFallback);
|
|
10
9
|
return new Promise((resolve, reject) => {
|
|
10
|
+
let worker;
|
|
11
11
|
let settled = false;
|
|
12
12
|
let writing = Promise.resolve();
|
|
13
13
|
let started = false;
|
|
@@ -15,97 +15,131 @@ export async function exportFuReportImage(snapshot, options, dependencies = {})
|
|
|
15
15
|
const startupTimeout = setTimeout(() => {
|
|
16
16
|
void fail(new FuReportImageExportError('EXPORT_WORKER_CRASH', '图片导出 Worker 启动超时'));
|
|
17
17
|
}, 10_000);
|
|
18
|
-
const cancel = () =>
|
|
19
|
-
options.signal?.addEventListener('abort', cancel, { once: true });
|
|
18
|
+
const cancel = () => void fail(new FuReportImageExportError('EXPORT_CANCELLED', '图片导出已取消'));
|
|
20
19
|
const cleanup = () => {
|
|
21
20
|
clearTimeout(startupTimeout);
|
|
22
21
|
if (responseTimeout)
|
|
23
22
|
clearTimeout(responseTimeout);
|
|
24
23
|
options.signal?.removeEventListener('abort', cancel);
|
|
25
|
-
worker
|
|
24
|
+
worker?.terminate();
|
|
26
25
|
};
|
|
27
26
|
const fail = async (error) => {
|
|
28
27
|
if (settled)
|
|
29
28
|
return;
|
|
30
29
|
settled = true;
|
|
31
|
-
|
|
30
|
+
try {
|
|
31
|
+
worker?.postMessage({ type: 'cancel', reason: error.code });
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Worker 可能已经失效,仍须终止线程并中止文件流。
|
|
35
|
+
}
|
|
36
|
+
cleanup();
|
|
32
37
|
try {
|
|
33
38
|
await writing.catch(() => undefined);
|
|
34
39
|
await target.abort(error);
|
|
35
40
|
}
|
|
36
41
|
catch (cleanupError) {
|
|
37
|
-
cleanup();
|
|
38
42
|
reject(new FuReportImageExportError('EXPORT_PARTIAL_FILE_CLEANUP_FAILED', '图片导出失败,且未能确认临时文件已清理', { cause: cleanupError }));
|
|
39
43
|
return;
|
|
40
44
|
}
|
|
41
|
-
cleanup();
|
|
42
45
|
reject(error);
|
|
43
46
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (
|
|
53
|
-
return;
|
|
54
|
-
if (message.protocol !== FU_REPORT_IMAGE_WORKER_PROTOCOL
|
|
55
|
-
|| (message.workerBuildId !== options.clientBuildId && message.workerBuildId !== 'development')
|
|
56
|
-
|| message.wasmSha256 !== FU_REPORT_IMAGE_WASM_SHA256) {
|
|
57
|
-
void fail(new FuReportImageExportError('EXPORT_BUILD_MISMATCH', '图片导出 Worker 版本握手失败'));
|
|
47
|
+
try {
|
|
48
|
+
throwIfCancelled(options.signal);
|
|
49
|
+
const activeWorker = worker = dependencies.workerFactory?.() ?? createFuReportImageWorker(options.clientBuildId);
|
|
50
|
+
options.signal?.addEventListener('abort', cancel, { once: true });
|
|
51
|
+
activeWorker.addEventListener('error', event => {
|
|
52
|
+
void fail(new FuReportImageExportError('EXPORT_WORKER_CRASH', event.message || '图片导出 Worker 崩溃'));
|
|
53
|
+
});
|
|
54
|
+
activeWorker.addEventListener('message', event => {
|
|
55
|
+
if (settled)
|
|
58
56
|
return;
|
|
59
|
-
|
|
60
|
-
started
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
57
|
+
const message = event.data;
|
|
58
|
+
if (started)
|
|
59
|
+
armResponseTimeout();
|
|
60
|
+
if (message.type === 'ready') {
|
|
61
|
+
if (started)
|
|
62
|
+
return;
|
|
63
|
+
if (message.protocol !== FU_REPORT_IMAGE_WORKER_PROTOCOL
|
|
64
|
+
|| (message.workerBuildId !== options.clientBuildId && message.workerBuildId !== 'development')
|
|
65
|
+
|| message.wasmSha256 !== FU_REPORT_IMAGE_WASM_SHA256) {
|
|
66
|
+
void fail(new FuReportImageExportError('EXPORT_BUILD_MISMATCH', '图片导出 Worker 版本握手失败'));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
started = true;
|
|
70
|
+
clearTimeout(startupTimeout);
|
|
71
|
+
armResponseTimeout();
|
|
72
|
+
const { signal: _signal, ...workerOptions } = options;
|
|
75
73
|
try {
|
|
76
|
-
|
|
77
|
-
|
|
74
|
+
activeWorker.postMessage({
|
|
75
|
+
type: 'start',
|
|
76
|
+
protocol: FU_REPORT_IMAGE_WORKER_PROTOCOL,
|
|
77
|
+
snapshot,
|
|
78
|
+
options: workerOptions,
|
|
79
|
+
wasmSha256: FU_REPORT_IMAGE_WASM_SHA256
|
|
80
|
+
});
|
|
78
81
|
}
|
|
79
82
|
catch (error) {
|
|
80
|
-
|
|
81
|
-
type: 'write-ack', chunkId: message.chunkId,
|
|
82
|
-
error: error instanceof Error ? error.message : '文件写入失败'
|
|
83
|
-
});
|
|
84
|
-
throw error;
|
|
83
|
+
void fail(workerStartupError(error));
|
|
85
84
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (message.type === 'chunk') {
|
|
88
|
+
clearResponseTimeout();
|
|
89
|
+
writing = writing.then(async () => {
|
|
90
|
+
if (settled)
|
|
91
|
+
return;
|
|
92
|
+
try {
|
|
93
|
+
await target.write(new Uint8Array(message.bytes));
|
|
94
|
+
if (settled)
|
|
95
|
+
return;
|
|
96
|
+
armResponseTimeout();
|
|
97
|
+
activeWorker.postMessage({ type: 'write-ack', chunkId: message.chunkId });
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
activeWorker.postMessage({
|
|
101
|
+
type: 'write-ack', chunkId: message.chunkId,
|
|
102
|
+
error: error instanceof Error ? error.message : '文件写入失败'
|
|
103
|
+
});
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}).catch(error => {
|
|
107
|
+
void fail(new FuReportImageExportError('EXPORT_WRITE_FAILED', error instanceof Error ? error.message : '图片文件写入失败', { cause: error }));
|
|
108
|
+
});
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (message.type === 'error') {
|
|
112
|
+
void fail(new FuReportImageExportError(message.code, message.message));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (message.type === 'done') {
|
|
116
|
+
clearResponseTimeout();
|
|
117
|
+
writing = writing.then(async () => {
|
|
118
|
+
if (settled)
|
|
119
|
+
return;
|
|
120
|
+
await target.close();
|
|
121
|
+
if (settled)
|
|
122
|
+
return;
|
|
123
|
+
settled = true;
|
|
124
|
+
cleanup();
|
|
125
|
+
resolve({ ...message.result, usedFileSystemAccess: target.usesFileSystemAccess });
|
|
126
|
+
}).catch(error => void fail(new FuReportImageExportError('EXPORT_WRITE_FAILED', error instanceof Error ? error.message : '图片文件提交失败', { cause: error })));
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
// 覆盖创建 Worker 期间已发生的取消。
|
|
130
|
+
if (options.signal?.aborted)
|
|
131
|
+
cancel();
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
void fail(workerStartupError(error));
|
|
135
|
+
}
|
|
136
|
+
function clearResponseTimeout() {
|
|
107
137
|
if (responseTimeout)
|
|
108
138
|
clearTimeout(responseTimeout);
|
|
139
|
+
responseTimeout = undefined;
|
|
140
|
+
}
|
|
141
|
+
function armResponseTimeout() {
|
|
142
|
+
clearResponseTimeout();
|
|
109
143
|
responseTimeout = setTimeout(() => {
|
|
110
144
|
void fail(new FuReportImageExportError('EXPORT_WORKER_CRASH', '图片导出 Worker 响应超时'));
|
|
111
145
|
}, 30_000);
|
|
@@ -193,12 +227,14 @@ class BlobDownloadTarget {
|
|
|
193
227
|
}
|
|
194
228
|
async abort() { this.chunks.length = 0; this.bytes = 0; }
|
|
195
229
|
}
|
|
196
|
-
function
|
|
197
|
-
|
|
198
|
-
return `${stem}.${format === 'png' ? 'png' : 'jpg'}`;
|
|
230
|
+
function defaultFilename(format) {
|
|
231
|
+
return `fu-report-export.${format === 'png' ? 'png' : 'jpg'}`;
|
|
199
232
|
}
|
|
200
233
|
function throwIfCancelled(signal) {
|
|
201
234
|
if (signal?.aborted)
|
|
202
235
|
throw new FuReportImageExportError('EXPORT_CANCELLED', '图片导出已取消');
|
|
203
236
|
}
|
|
237
|
+
function workerStartupError(error) {
|
|
238
|
+
return error instanceof FuReportImageExportError ? error : new FuReportImageExportError('EXPORT_WORKER_CRASH', error instanceof Error ? error.message : '图片导出 Worker 启动失败', { cause: error });
|
|
239
|
+
}
|
|
204
240
|
//# sourceMappingURL=controller.js.map
|
package/dist/controller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,wBAAwB,EAAE,mCAAmC,EAAE,MAAM,YAAY,CAAA;AAC1F,OAAO,EAAE,2BAA2B,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAA;AAwB/F,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgC,EAChC,OAAmC,EACnC,eAAgD,EAAE;IAElD,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC;QACrD,MAAM,IAAI,wBAAwB,CAAC,uBAAuB,EAAE,kCAAkC,CAAC,CAAA;IACjG,CAAC;IACD,mCAAmC,CAAC,QAAQ,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,MAAM,0BAA0B,CACpE,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EACnD,OAAO,CAAC,MAAM,EACd,YAAY,CAAC,cAAc,EAC3B,YAAY,CAAC,iBAAiB,CAC/B,CAAA;IACD,OAAO,IAAI,OAAO,CAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAChE,IAAI,MAA2C,CAAA;QAC/C,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;QAC/B,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,eAA0D,CAAA;QAC9D,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACrC,KAAK,IAAI,CAAC,IAAI,wBAAwB,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC,CAAA;QACpF,CAAC,EAAE,MAAM,CAAC,CAAA;QACV,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,wBAAwB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAA;QAE3F,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,cAAc,CAAC,CAAA;YAC5B,IAAI,eAAe;gBAAE,YAAY,CAAC,eAAe,CAAC,CAAA;YAClD,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACpD,MAAM,EAAE,SAAS,EAAE,CAAA;QACrB,CAAC,CAAA;QACD,MAAM,IAAI,GAAG,KAAK,EAAE,KAA+B,EAAE,EAAE;YACrD,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,IAAI,CAAC;gBACH,MAAM,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;YAC7D,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;YACD,OAAO,EAAE,CAAA;YACT,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;gBACpC,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC3B,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,wBAAwB,CACjC,oCAAoC,EACpC,qBAAqB,EACrB,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC,CAAA;gBACF,OAAM;YACR,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAA;QACf,CAAC,CAAA;QAED,IAAI,CAAC;YACH,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YAChC,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,EAAE,IAAI,yBAAyB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;YAChH,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACjE,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;gBAC7C,KAAK,IAAI,CAAC,IAAI,wBAAwB,CAAC,qBAAqB,EAAE,KAAK,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,CAAA;YACnG,CAAC,CAAC,CAAA;YACF,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;gBAC/C,IAAI,OAAO;oBAAE,OAAM;gBACnB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAA;gBAC1B,IAAI,OAAO;oBAAE,kBAAkB,EAAE,CAAA;gBACjC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC7B,IAAI,OAAO;wBAAE,OAAM;oBACnB,IAAI,OAAO,CAAC,QAAQ,KAAK,+BAA+B;2BACjD,CAAC,OAAO,CAAC,aAAa,KAAK,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,KAAK,aAAa,CAAC;2BAC5F,OAAO,CAAC,UAAU,KAAK,2BAA2B,EAAE,CAAC;wBAC1D,KAAK,IAAI,CAAC,IAAI,wBAAwB,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,CAAC,CAAA;wBACtF,OAAM;oBACR,CAAC;oBACD,OAAO,GAAG,IAAI,CAAA;oBACd,YAAY,CAAC,cAAc,CAAC,CAAA;oBAC5B,kBAAkB,EAAE,CAAA;oBACpB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAA;oBACrD,IAAI,CAAC;wBACH,YAAY,CAAC,WAAW,CAAC;4BACvB,IAAI,EAAE,OAAO;4BACb,QAAQ,EAAE,+BAA+B;4BACzC,QAAQ;4BACR,OAAO,EAAE,aAAa;4BACtB,UAAU,EAAE,2BAA2B;yBACxC,CAAC,CAAA;oBACJ,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,KAAK,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAA;oBACtC,CAAC;oBACD,OAAM;gBACR,CAAC;gBACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC7B,oBAAoB,EAAE,CAAA;oBACtB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;wBAChC,IAAI,OAAO;4BAAE,OAAM;wBACnB,IAAI,CAAC;4BACH,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;4BACjD,IAAI,OAAO;gCAAE,OAAM;4BACnB,kBAAkB,EAAE,CAAA;4BACpB,YAAY,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;wBAC3E,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,YAAY,CAAC,WAAW,CAAC;gCACvB,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO;gCAC3C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;6BACzD,CAAC,CAAA;4BACF,MAAM,KAAK,CAAA;wBACb,CAAC;oBACH,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;wBACf,KAAK,IAAI,CAAC,IAAI,wBAAwB,CACpC,qBAAqB,EACrB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EACnD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC,CAAA;oBACJ,CAAC,CAAC,CAAA;oBACF,OAAM;gBACR,CAAC;gBACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC7B,KAAK,IAAI,CAAC,IAAI,wBAAwB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;oBACtE,OAAM;gBACR,CAAC;gBACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC5B,oBAAoB,EAAE,CAAA;oBACtB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;wBAChC,IAAI,OAAO;4BAAE,OAAM;wBACnB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;wBACpB,IAAI,OAAO;4BAAE,OAAM;wBACnB,OAAO,GAAG,IAAI,CAAA;wBACd,OAAO,EAAE,CAAA;wBACT,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAA;oBACnF,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,wBAAwB,CACtD,qBAAqB,EACrB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EACnD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC,CAAC,CAAA;gBACL,CAAC;YACH,CAAC,CAAC,CAAA;YACF,wBAAwB;YACxB,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;gBAAE,MAAM,EAAE,CAAA;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAA;QACtC,CAAC;QAED,SAAS,oBAAoB;YAC3B,IAAI,eAAe;gBAAE,YAAY,CAAC,eAAe,CAAC,CAAA;YAClD,eAAe,GAAG,SAAS,CAAA;QAC7B,CAAC;QAED,SAAS,kBAAkB;YACzB,oBAAoB,EAAE,CAAA;YACtB,eAAe,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,KAAK,IAAI,CAAC,IAAI,wBAAwB,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC,CAAA;YACpF,CAAC,EAAE,MAAM,CAAC,CAAA;QACZ,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,cAAc,GAAG,aAAa;IACtE,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,wBAAwB,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAA;IAC/E,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACtE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,wBAAwB;KAC/C,CAA4B,CAAA;AAC/B,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,QAAgB,EAChB,MAA4C,EAC5C,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EACjC,iBAAiB,GAAG,KAAK;IAEzB,MAAM,MAAM,GAAI,UAId,CAAC,kBAAkB,CAAA;IACrB,IAAI,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,SAAS,CAAC,cAAc,CAAA;QAC3C,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,IAAI,wBAAwB,CAAC,iCAAiC,EAAE,iBAAiB,CAAC,CAAA;QAC1F,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAA;QAC1D,MAAM,SAAS,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;QACpD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B,aAAa,EAAE,QAAQ;YACvB,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;SAChF,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAA;QAC9C,OAAO,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IACvC,CAAC;IACD,OAAO,IAAI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE,cAAc,CAAC,CAAA;AACxG,CAAC;AAQD,MAAM,gBAAgB;IAGS;IAFpB,oBAAoB,GAAG,IAAI,CAAA;IAEpC,YAA6B,QAAoF;QAApF,aAAQ,GAAR,QAAQ,CAA4E;IAAG,CAAC;IAErH,KAAK,CAAC,KAAiB,IAAmB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC;IAC7E,KAAK,KAAoB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA,CAAC,CAAC;IACvD,KAAK,CAAC,MAAgB,IAAmB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA,CAAC,CAAC;CAC9E;AAED,MAAM,kBAAkB;IAMH;IACA;IACA;IAPV,oBAAoB,GAAG,KAAK,CAAA;IACpB,MAAM,GAAkB,EAAE,CAAA;IACnC,KAAK,GAAG,CAAC,CAAA;IAEjB,YACmB,QAAgB,EAChB,IAAY,EACZ,KAAa;QAFb,aAAQ,GAAR,QAAQ,CAAQ;QAChB,SAAI,GAAJ,IAAI,CAAQ;QACZ,UAAK,GAAL,KAAK,CAAQ;IAC7B,CAAC;IAEJ,KAAK,CAAC,KAAK,CAAC,KAAiB;QAC3B,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/C,MAAM,IAAI,wBAAwB,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,CAAA;QACtF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,MAAqB,CAAC,CAAA;QACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QACvD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;YAC1C,MAAM,CAAC,IAAI,GAAG,GAAG,CAAA;YACjB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;YAC/B,MAAM,CAAC,GAAG,GAAG,UAAU,CAAA;YACvB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAA;YACpB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC5B,MAAM,CAAC,KAAK,EAAE,CAAA;YACd,MAAM,CAAC,MAAM,EAAE,CAAA;YACf,4CAA4C;YAC5C,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;YACxB,MAAM,KAAK,CAAA;QACb,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;YACtB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,KAAoB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA,CAAC,CAAC;CACxE;AAED,SAAS,eAAe,CAAC,MAA4C;IACnE,OAAO,oBAAoB,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAA;AAC/D,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAoB;IAC5C,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,IAAI,wBAAwB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAA;AACxF,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,wBAAwB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,wBAAwB,CACrF,qBAAqB,EACrB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAC3D,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface FuReportImageDimensions {
|
|
2
|
+
readonly width: number;
|
|
3
|
+
readonly height: number;
|
|
4
|
+
}
|
|
5
|
+
/** 仅读取容器头部,不调用图片解码器;每次读取最多 32 字节。 */
|
|
6
|
+
export declare function readFuReportImageDimensions(blob: Blob): Promise<FuReportImageDimensions>;
|
|
7
|
+
//# sourceMappingURL=image-dimensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-dimensions.d.ts","sourceRoot":"","sources":["../src/image-dimensions.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,uBAAuB;IAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAE5F,qCAAqC;AACrC,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA0I9F"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { FuReportImageExportError } from './types.js';
|
|
2
|
+
/** 仅读取容器头部,不调用图片解码器;每次读取最多 32 字节。 */
|
|
3
|
+
export async function readFuReportImageDimensions(blob) {
|
|
4
|
+
let reads = 0;
|
|
5
|
+
const read = async (offset, length) => {
|
|
6
|
+
if (++reads > 4096 || !Number.isSafeInteger(offset) || offset < 0 || length > 32
|
|
7
|
+
|| offset + length > blob.size)
|
|
8
|
+
throw invalidImage();
|
|
9
|
+
return new DataView(await blob.slice(offset, offset + length).arrayBuffer());
|
|
10
|
+
};
|
|
11
|
+
const text = (view, offset, count) => String.fromCharCode(...Array.from({ length: count }, (_, index) => view.getUint8(offset + index)));
|
|
12
|
+
const dimensions = (width, height) => {
|
|
13
|
+
if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height) || width <= 0 || height <= 0
|
|
14
|
+
|| !Number.isSafeInteger(width * height * 4))
|
|
15
|
+
throw invalidImage();
|
|
16
|
+
return { width, height };
|
|
17
|
+
};
|
|
18
|
+
try {
|
|
19
|
+
const head = await read(0, Math.min(32, blob.size));
|
|
20
|
+
if (head.byteLength >= 24 && head.getUint32(0) === 0x89504e47
|
|
21
|
+
&& head.getUint32(4) === 0x0d0a1a0a && text(head, 12, 4) === 'IHDR') {
|
|
22
|
+
return dimensions(head.getUint32(16), head.getUint32(20));
|
|
23
|
+
}
|
|
24
|
+
if (head.byteLength >= 10 && ['GIF87a', 'GIF89a'].includes(text(head, 0, 6))) {
|
|
25
|
+
const screen = dimensions(head.getUint16(6, true), head.getUint16(8, true));
|
|
26
|
+
const packed = (await read(10, 3)).getUint8(0);
|
|
27
|
+
let offset = 13 + ((packed & 0x80) ? 3 * (1 << ((packed & 7) + 1)) : 0);
|
|
28
|
+
// 浏览器解码首帧时可能按图像描述符扩展画布,逻辑屏幕尺寸不能单独作为预算。
|
|
29
|
+
while (offset < blob.size) {
|
|
30
|
+
const kind = (await read(offset, 1)).getUint8(0);
|
|
31
|
+
if (kind === 0x2c) {
|
|
32
|
+
const frame = await read(offset + 1, 9);
|
|
33
|
+
const size = dimensions(frame.getUint16(4, true), frame.getUint16(6, true));
|
|
34
|
+
return dimensions(Math.max(screen.width, frame.getUint16(0, true) + size.width), Math.max(screen.height, frame.getUint16(2, true) + size.height));
|
|
35
|
+
}
|
|
36
|
+
if (kind !== 0x21)
|
|
37
|
+
throw invalidImage();
|
|
38
|
+
// 扩展块由标签和若干有长度前缀的数据子块组成,以零长度终止。
|
|
39
|
+
await read(offset + 1, 1);
|
|
40
|
+
offset += 2;
|
|
41
|
+
for (;;) {
|
|
42
|
+
const length = (await read(offset++, 1)).getUint8(0);
|
|
43
|
+
if (!length)
|
|
44
|
+
break;
|
|
45
|
+
offset += length;
|
|
46
|
+
if (offset >= blob.size)
|
|
47
|
+
throw invalidImage();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
throw invalidImage();
|
|
51
|
+
}
|
|
52
|
+
if (head.byteLength >= 2 && head.getUint16(0) === 0xffd8) {
|
|
53
|
+
let offset = 2;
|
|
54
|
+
while (offset < blob.size) {
|
|
55
|
+
const marker = await read(offset, 2);
|
|
56
|
+
if (marker.getUint8(0) !== 0xff)
|
|
57
|
+
throw invalidImage();
|
|
58
|
+
const code = marker.getUint8(1);
|
|
59
|
+
if (code === 0xff) {
|
|
60
|
+
offset++;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (code === 0xda || code === 0xd9)
|
|
64
|
+
throw invalidImage();
|
|
65
|
+
if (code === 0x01 || (code >= 0xd0 && code <= 0xd8)) {
|
|
66
|
+
offset += 2;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const length = (await read(offset + 2, 2)).getUint16(0);
|
|
70
|
+
if (length < 2 || offset + 2 + length > blob.size)
|
|
71
|
+
throw invalidImage();
|
|
72
|
+
if ([0xc0, 0xc1, 0xc2, 0xc3, 0xc5, 0xc6, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf].includes(code)) {
|
|
73
|
+
if (length < 8)
|
|
74
|
+
throw invalidImage();
|
|
75
|
+
const frame = await read(offset + 2, 7);
|
|
76
|
+
return dimensions(frame.getUint16(5), frame.getUint16(3));
|
|
77
|
+
}
|
|
78
|
+
offset += 2 + length;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (head.byteLength >= 12 && text(head, 0, 4) === 'RIFF' && text(head, 8, 4) === 'WEBP') {
|
|
82
|
+
let offset = 12;
|
|
83
|
+
while (offset + 8 <= blob.size) {
|
|
84
|
+
const chunk = await read(offset, 8);
|
|
85
|
+
const kind = text(chunk, 0, 4), length = chunk.getUint32(4, true);
|
|
86
|
+
if (offset + 8 + length > blob.size)
|
|
87
|
+
throw invalidImage();
|
|
88
|
+
const data = await read(offset + 8, Math.min(length, 10));
|
|
89
|
+
const uint24 = (at) => data.getUint8(at) + data.getUint8(at + 1) * 256 + data.getUint8(at + 2) * 65536;
|
|
90
|
+
if (kind === 'VP8X')
|
|
91
|
+
return dimensions(uint24(4) + 1, uint24(7) + 1);
|
|
92
|
+
if (kind === 'VP8L' && data.getUint8(0) === 0x2f) {
|
|
93
|
+
const bits = data.getUint32(1, true);
|
|
94
|
+
return dimensions((bits & 0x3fff) + 1, ((bits >>> 14) & 0x3fff) + 1);
|
|
95
|
+
}
|
|
96
|
+
if (kind === 'VP8 ' && uint24(3) === 0x2a019d) {
|
|
97
|
+
return dimensions(data.getUint16(6, true) & 0x3fff, data.getUint16(8, true) & 0x3fff);
|
|
98
|
+
}
|
|
99
|
+
offset += 8 + length + (length % 2);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (head.byteLength >= 26 && text(head, 0, 2) === 'BM') {
|
|
103
|
+
return head.getUint32(14, true) === 12
|
|
104
|
+
? dimensions(head.getUint16(18, true), head.getUint16(20, true))
|
|
105
|
+
: dimensions(head.getInt32(18, true), Math.abs(head.getInt32(22, true)));
|
|
106
|
+
}
|
|
107
|
+
if (head.byteLength >= 6 && head.getUint16(0) === 0 && [1, 2].includes(head.getUint16(2, true))) {
|
|
108
|
+
const count = head.getUint16(4, true);
|
|
109
|
+
if (!count || 6 + count * 16 > blob.size)
|
|
110
|
+
throw invalidImage();
|
|
111
|
+
let largest = dimensions(1, 1);
|
|
112
|
+
for (let index = 0; index < count; index++) {
|
|
113
|
+
const entry = await read(6 + index * 16, 16);
|
|
114
|
+
let size = dimensions(entry.getUint8(0) || 256, entry.getUint8(1) || 256);
|
|
115
|
+
const offset = entry.getUint32(12, true), length = entry.getUint32(8, true);
|
|
116
|
+
if (offset < 6 + count * 16 || offset + length > blob.size || length < 24)
|
|
117
|
+
throw invalidImage();
|
|
118
|
+
const data = await read(offset, 24);
|
|
119
|
+
if (data.getUint32(0) === 0x89504e47 && text(data, 12, 4) === 'IHDR') {
|
|
120
|
+
size = dimensions(data.getUint32(16), data.getUint32(20));
|
|
121
|
+
}
|
|
122
|
+
else if (data.getUint32(0, true) >= 40) {
|
|
123
|
+
size = dimensions(data.getInt32(4, true), Math.abs(data.getInt32(8, true)) / 2);
|
|
124
|
+
}
|
|
125
|
+
if (size.width * size.height > largest.width * largest.height)
|
|
126
|
+
largest = size;
|
|
127
|
+
}
|
|
128
|
+
return largest;
|
|
129
|
+
}
|
|
130
|
+
// AVIF/HEIF 的尺寸位于 meta/iprp/ipco/ispe,跳过压缩数据盒,禁止任意字节搜索。
|
|
131
|
+
if (head.byteLength >= 8 && text(head, 4, 4) === 'ftyp') {
|
|
132
|
+
let largest;
|
|
133
|
+
const boxes = async (start, end, depth) => {
|
|
134
|
+
if (depth > 4)
|
|
135
|
+
throw invalidImage();
|
|
136
|
+
for (let offset = start; offset + 8 <= end;) {
|
|
137
|
+
const box = await read(offset, 8);
|
|
138
|
+
let length = box.getUint32(0), header = 8;
|
|
139
|
+
if (length === 1) {
|
|
140
|
+
length = Number((await read(offset + 8, 8)).getBigUint64(0));
|
|
141
|
+
header = 16;
|
|
142
|
+
}
|
|
143
|
+
else if (length === 0)
|
|
144
|
+
length = end - offset;
|
|
145
|
+
if (!Number.isSafeInteger(length) || length < header || offset + length > end)
|
|
146
|
+
throw invalidImage();
|
|
147
|
+
const kind = text(box, 4, 4), body = offset + header;
|
|
148
|
+
if (kind === 'ispe' && depth === 3 && length >= header + 12) {
|
|
149
|
+
const data = await read(body, 12);
|
|
150
|
+
const size = dimensions(data.getUint32(4), data.getUint32(8));
|
|
151
|
+
if (!largest || size.width * size.height > largest.width * largest.height)
|
|
152
|
+
largest = size;
|
|
153
|
+
}
|
|
154
|
+
else if ((depth === 0 && kind === 'meta') || (depth === 1 && kind === 'iprp') || (depth === 2 && kind === 'ipco')) {
|
|
155
|
+
await boxes(body + (kind === 'meta' ? 4 : 0), offset + length, depth + 1);
|
|
156
|
+
}
|
|
157
|
+
offset += length;
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
await boxes(0, blob.size, 0);
|
|
161
|
+
if (largest)
|
|
162
|
+
return largest;
|
|
163
|
+
}
|
|
164
|
+
throw invalidImage();
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (error instanceof FuReportImageExportError)
|
|
168
|
+
throw error;
|
|
169
|
+
throw invalidImage();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function invalidImage() {
|
|
173
|
+
return new FuReportImageExportError('EXPORT_UNSUPPORTED', '图片格式或尺寸元数据无效,无法安全预留解码预算');
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=image-dimensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-dimensions.js","sourceRoot":"","sources":["../src/image-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAIrD,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,IAAU;IAC1D,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,IAAI,GAAG,KAAK,EAAE,MAAc,EAAE,MAAc,EAAqB,EAAE;QACvE,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE;eACzE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI;YAAE,MAAM,YAAY,EAAE,CAAA;QACxD,OAAO,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;IAC9E,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,CAAC,IAAc,EAAE,MAAc,EAAE,KAAa,EAAU,EAAE,CACrE,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACpG,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,MAAc,EAA2B,EAAE;QAC5E,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC;eACvF,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;YAAE,MAAM,YAAY,EAAE,CAAA;QACtE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IAC1B,CAAC,CAAA;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACnD,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,UAAU;eACtD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACxE,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;YAC3E,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC9C,IAAI,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvE,uCAAuC;YACvC,OAAO,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAChD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAClB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;oBACvC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;oBAC3E,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAC7E,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,IAAI,IAAI,KAAK,IAAI;oBAAE,MAAM,YAAY,EAAE,CAAA;gBACvC,gCAAgC;gBAChC,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;gBACzB,MAAM,IAAI,CAAC,CAAA;gBACX,SAAS,CAAC;oBACR,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;oBACpD,IAAI,CAAC,MAAM;wBAAE,MAAK;oBAClB,MAAM,IAAI,MAAM,CAAA;oBAChB,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI;wBAAE,MAAM,YAAY,EAAE,CAAA;gBAC/C,CAAC;YACH,CAAC;YACD,MAAM,YAAY,EAAE,CAAA;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACzD,IAAI,MAAM,GAAG,CAAC,CAAA;YACd,OAAO,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;gBACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI;oBAAE,MAAM,YAAY,EAAE,CAAA;gBACrD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAC/B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAAC,MAAM,EAAE,CAAC;oBAAC,SAAQ;gBAAC,CAAC;gBACzC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;oBAAE,MAAM,YAAY,EAAE,CAAA;gBACxD,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;oBAAC,MAAM,IAAI,CAAC,CAAC;oBAAC,SAAQ;gBAAC,CAAC;gBAC9E,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;gBACvD,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI;oBAAE,MAAM,YAAY,EAAE,CAAA;gBACvE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClG,IAAI,MAAM,GAAG,CAAC;wBAAE,MAAM,YAAY,EAAE,CAAA;oBACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;oBACvC,OAAO,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC3D,CAAC;gBACD,MAAM,IAAI,CAAC,GAAG,MAAM,CAAA;YACtB,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACxF,IAAI,MAAM,GAAG,EAAE,CAAA;YACf,OAAO,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;gBACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;gBACjE,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI;oBAAE,MAAM,YAAY,EAAE,CAAA;gBACzD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAA;gBACzD,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA;gBAC9G,IAAI,IAAI,KAAK,MAAM;oBAAE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACpE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBACjD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;oBACpC,OAAO,UAAU,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtE,CAAC;gBACD,IAAI,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC9C,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;gBACvF,CAAC;gBACD,MAAM,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YACrC,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE;gBACpC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAChE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5E,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAChG,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YACrC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI;gBAAE,MAAM,YAAY,EAAE,CAAA;YAC9D,IAAI,OAAO,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,CAAA;gBAC5C,IAAI,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAA;gBACzE,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;gBAC3E,IAAI,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,IAAI,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,GAAG,EAAE;oBAAE,MAAM,YAAY,EAAE,CAAA;gBAC/F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;gBACnC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;oBACrE,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC3D,CAAC;qBAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBACzC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACjF,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM;oBAAE,OAAO,GAAG,IAAI,CAAA;YAC/E,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,wDAAwD;QACxD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACxD,IAAI,OAA4C,CAAA;YAChD,MAAM,KAAK,GAAG,KAAK,EAAE,KAAa,EAAE,GAAW,EAAE,KAAa,EAAiB,EAAE;gBAC/E,IAAI,KAAK,GAAG,CAAC;oBAAE,MAAM,YAAY,EAAE,CAAA;gBACnC,KAAK,IAAI,MAAM,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;oBAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;oBACjC,IAAI,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAA;oBACzC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;wBAAC,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;wBAAC,MAAM,GAAG,EAAE,CAAA;oBAAC,CAAC;yBAC1F,IAAI,MAAM,KAAK,CAAC;wBAAE,MAAM,GAAG,GAAG,GAAG,MAAM,CAAA;oBAC5C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,GAAG,GAAG;wBAAE,MAAM,YAAY,EAAE,CAAA;oBACnG,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;oBACpD,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,IAAI,MAAM,GAAG,EAAE,EAAE,CAAC;wBAC5D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;wBACjC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;wBAC7D,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM;4BAAE,OAAO,GAAG,IAAI,CAAA;oBAC3F,CAAC;yBAAM,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;wBACpH,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;oBAC3E,CAAC;oBACD,MAAM,IAAI,MAAM,CAAA;gBAClB,CAAC;YACH,CAAC,CAAA;YACD,MAAM,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC5B,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAA;QAC7B,CAAC;QACD,MAAM,YAAY,EAAE,CAAA;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,wBAAwB;YAAE,MAAM,KAAK,CAAA;QAC1D,MAAM,YAAY,EAAE,CAAA;IACtB,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,IAAI,wBAAwB,CAAC,oBAAoB,EAAE,yBAAyB,CAAC,CAAA;AACtF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-budget.d.ts","sourceRoot":"","sources":["../src/memory-budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAGxD,MAAM,MAAM,kBAAkB,GAC1B,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,CAAA;AAErB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CACjC;AAED,eAAO,MAAM,sCAAsC,EAAE,0BAenD,CAAA;AAEF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAA;IAC9D,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAA;CAC5D;AAED,qBAAa,0BAA0B;IACrC,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAA;IAC3C,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;gBAEvB,MAAM,GAAE,0BAAmE;IAIvF,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"memory-budget.d.ts","sourceRoot":"","sources":["../src/memory-budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAGxD,MAAM,MAAM,kBAAkB,GAC1B,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,CAAA;AAErB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CACjC;AAED,eAAO,MAAM,sCAAsC,EAAE,0BAenD,CAAA;AAEF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAA;IAC9D,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAA;CAC5D;AAED,qBAAa,0BAA0B;IACrC,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAA;IAC3C,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;gBAEvB,MAAM,GAAE,0BAAmE;IAIvF,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAuBxD,OAAO,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI;IAmB7D,QAAQ,IAAI,4BAA4B;IAIxC,KAAK,IAAI,IAAI;CAId"}
|
package/dist/memory-budget.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FuReportImageExportError } from './types.js';
|
|
1
|
+
import { FuReportImageExportError, assertFuReportImageContentSupported } from './types.js';
|
|
2
2
|
export const DEFAULT_FU_REPORT_EXPORT_MEMORY_LIMITS = Object.freeze({
|
|
3
3
|
maximumArea: 400_000_000,
|
|
4
4
|
maximumEdge: 32_767,
|
|
@@ -24,6 +24,7 @@ export class FuReportExportMemoryBudget {
|
|
|
24
24
|
this.limits = limits;
|
|
25
25
|
}
|
|
26
26
|
validateSnapshot(snapshot) {
|
|
27
|
+
assertFuReportImageContentSupported(snapshot);
|
|
27
28
|
if (snapshot.width > this.limits.maximumEdge || snapshot.height > this.limits.maximumEdge) {
|
|
28
29
|
throw new FuReportImageExportError('EXPORT_EDGE_LIMIT', '图片边长超过浏览器导出上限');
|
|
29
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-budget.js","sourceRoot":"","sources":["../src/memory-budget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"memory-budget.js","sourceRoot":"","sources":["../src/memory-budget.ts"],"names":[],"mappings":"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"}
|
package/dist/resource-lru.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export declare class FuReportStripResourceLru<T extends FuReportClosableResource
|
|
|
8
8
|
constructor(maximumBytes: number);
|
|
9
9
|
get(key: string): T | undefined;
|
|
10
10
|
set(key: string, value: T, bytes: number): void;
|
|
11
|
+
makeRoom(bytes: number): boolean;
|
|
11
12
|
clear(): void;
|
|
12
13
|
get size(): number;
|
|
13
14
|
get byteLength(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-lru.d.ts","sourceRoot":"","sources":["../src/resource-lru.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,KAAK,IAAI,IAAI,CAAA;CACd;AAOD,qBAAa,wBAAwB,CAAC,CAAC,SAAS,wBAAwB;IAI1D,OAAO,CAAC,QAAQ,CAAC,YAAY;IAHzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,KAAK,CAAI;gBAEY,YAAY,EAAE,MAAM;IAEjD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAQ/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"resource-lru.d.ts","sourceRoot":"","sources":["../src/resource-lru.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,KAAK,IAAI,IAAI,CAAA;CACd;AAOD,qBAAa,wBAAwB,CAAC,CAAC,SAAS,wBAAwB;IAI1D,OAAO,CAAC,QAAQ,CAAC,YAAY;IAHzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,KAAK,CAAI;gBAEY,YAAY,EAAE,MAAM;IAEjD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAQ/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiB/C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMhC,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI,MAAM,CAA6B;IAC/C,IAAI,UAAU,IAAI,MAAM,CAAsB;IAE9C,OAAO,CAAC,WAAW;CAOpB"}
|
package/dist/resource-lru.js
CHANGED
|
@@ -29,6 +29,14 @@ export class FuReportStripResourceLru {
|
|
|
29
29
|
while (this.bytes > this.maximumBytes)
|
|
30
30
|
this.evictOldest();
|
|
31
31
|
}
|
|
32
|
+
// 在申请新资源预算前释放旧缓存,避免预算检查阻断淘汰。
|
|
33
|
+
makeRoom(bytes) {
|
|
34
|
+
if (!Number.isSafeInteger(bytes) || bytes < 0 || bytes > this.maximumBytes)
|
|
35
|
+
return false;
|
|
36
|
+
while (this.bytes + bytes > this.maximumBytes)
|
|
37
|
+
this.evictOldest();
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
32
40
|
clear() {
|
|
33
41
|
for (const entry of this.entries.values())
|
|
34
42
|
entry.value.close();
|
package/dist/resource-lru.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-lru.js","sourceRoot":"","sources":["../src/resource-lru.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,wBAAwB;IAIN;IAHZ,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC9C,KAAK,GAAG,CAAC,CAAA;IAEjB,YAA6B,YAAoB;QAApB,iBAAY,GAAZ,YAAY,CAAQ;IAAG,CAAC;IAErD,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC5B,OAAO,KAAK,CAAC,KAAK,CAAA;IACpB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAE,KAAa;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YACtB,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAA;YAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9B,KAAK,CAAC,KAAK,EAAE,CAAA;YACb,OAAM;QACR,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAA;QACnB,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,WAAW,EAAE,CAAA;IAC3D,CAAC;IAED,KAAK;QACH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAC9D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;IAChB,CAAC;IAED,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA,CAAC,CAAC;IAC/C,IAAI,UAAU,KAAa,OAAO,IAAI,CAAC,KAAK,CAAA,CAAC,CAAC;IAEtC,WAAW;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAuC,CAAA;QACnF,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QACtB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/B,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"resource-lru.js","sourceRoot":"","sources":["../src/resource-lru.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,wBAAwB;IAIN;IAHZ,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC9C,KAAK,GAAG,CAAC,CAAA;IAEjB,YAA6B,YAAoB;QAApB,iBAAY,GAAZ,YAAY,CAAQ;IAAG,CAAC;IAErD,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC5B,OAAO,KAAK,CAAC,KAAK,CAAA;IACpB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAE,KAAa;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YACtB,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAA;YAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9B,KAAK,CAAC,KAAK,EAAE,CAAA;YACb,OAAM;QACR,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAA;QACnB,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,WAAW,EAAE,CAAA;IAC3D,CAAC;IAED,6BAA6B;IAC7B,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAA;QACxF,OAAO,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,WAAW,EAAE,CAAA;QACjE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK;QACH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAC9D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;IAChB,CAAC;IAED,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA,CAAC,CAAC;IAC/C,IAAI,UAAU,KAAa,OAAO,IAAI,CAAC,KAAK,CAAA,CAAC,CAAC;IAEtC,WAAW;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAuC,CAAA;QACnF,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QACtB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/B,CAAC;CACF"}
|
package/dist/snapshot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,oBAAoB,EAErB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,KAAK,EACV,kBAAkB,EAGlB,sBAAsB,EAIvB,MAAM,YAAY,CAAA;AAGnB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAA;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,oBAAoB,EAErB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,KAAK,EACV,kBAAkB,EAGlB,sBAAsB,EAIvB,MAAM,YAAY,CAAA;AAGnB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAA;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CA8CxB"}
|
package/dist/snapshot.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FuReportImageExportError } from './types.js';
|
|
1
|
+
import { FuReportImageExportError, assertFuReportImageContentSupported } from './types.js';
|
|
2
2
|
export function createFuReportRenderSnapshot(document, options = {}) {
|
|
3
3
|
const scope = options.scope ?? 'active-sheet';
|
|
4
4
|
const sheetGap = integerWithin(options.sheetGap ?? 24, 0, 256);
|
|
@@ -43,6 +43,7 @@ export function createFuReportRenderSnapshot(document, options = {}) {
|
|
|
43
43
|
fonts: [...fonts].sort((left, right) => left.localeCompare(right)),
|
|
44
44
|
counters: mutable
|
|
45
45
|
};
|
|
46
|
+
assertFuReportImageContentSupported(snapshot);
|
|
46
47
|
return deepFreeze(snapshot);
|
|
47
48
|
}
|
|
48
49
|
function createSheetScene(sheet, x, y, baseOrigin, resources, fonts, counters) {
|
|
@@ -52,7 +53,7 @@ function createSheetScene(sheet, x, y, baseOrigin, resources, fonts, counters) {
|
|
|
52
53
|
counters.glyphs = safeAdd(counters.glyphs, Array.from(cell.text).length);
|
|
53
54
|
primitives.push({
|
|
54
55
|
kind: 'cell', id: cell.id, bounds: { ...cell.bounds }, contentBox: { ...cell.contentBox },
|
|
55
|
-
zIndex: cell.zIndex, text: cell.text, background: cell.style.background,
|
|
56
|
+
zIndex: cell.zIndex, text: cell.text, whiteSpace: cell.style.whiteSpace, richText: cell.richText, background: cell.style.background,
|
|
56
57
|
color: cell.style.color, fontFamily: cell.style.fontFamily,
|
|
57
58
|
fontSize: cell.style.fontSize, fontWeight: cell.style.fontWeight,
|
|
58
59
|
fontStyle: cell.style.fontStyle, textAlign: cell.style.textAlign,
|