libpag 4.5.0 → 4.5.2
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/LICENSE.txt +1589 -0
- package/README.md +172 -10
- package/README.zh_CN.md +114 -15
- package/lib/libpag.cjs.js +5420 -6176
- package/lib/libpag.cjs.js.map +1 -1
- package/lib/libpag.esm.js +5420 -6176
- package/lib/libpag.esm.js.map +1 -1
- package/lib/libpag.min.js +1 -1
- package/lib/libpag.min.js.map +1 -1
- package/lib/libpag.umd.js +5420 -6176
- package/lib/libpag.umd.js.map +1 -1
- package/lib/libpag.wasm +0 -0
- package/package.json +23 -11
- package/src/.pag.wasm-mt.md5 +1 -0
- package/src/.pag.wasm.md5 +1 -1
- package/src/core/matrix.ts +1 -2
- package/src/core/video-reader.ts +73 -94
- package/src/interfaces.ts +8 -17
- package/src/pag-composition.ts +12 -5
- package/src/pag-file.ts +146 -129
- package/src/pag-font.ts +1 -3
- package/src/pag-image-layer.ts +1 -2
- package/src/pag-image.ts +1 -3
- package/src/pag-layer.ts +2 -3
- package/src/pag-player.ts +7 -6
- package/src/pag-solid-layer.ts +1 -2
- package/src/pag-surface.ts +1 -2
- package/src/pag-text-layer.ts +1 -2
- package/src/pag-view.ts +3 -14
- package/src/pag.ts +0 -6
- package/src/types.ts +46 -3
- package/src/utils/decorators.ts +0 -42
- package/src/utils/type-utils.ts +1 -9
- package/src/utils/ua.ts +0 -1
- package/src/wasm/libpag.js +7 -6
- package/src/wasm/libpag.wasm +0 -0
- package/src/wasm-mt/libpag.js +2 -0
- package/src/wasm-mt/libpag.wasm +0 -0
- package/src/wechat/pag-file.ts +1 -2
- package/src/wechat/pag-image.ts +0 -2
- package/src/wechat/pag-view.ts +1 -2
- package/types/third_party/tgfx/web/src/core/path-rasterizer.d.ts +4 -0
- package/types/third_party/tgfx/web/src/core/scaler-context.d.ts +9 -2
- package/types/third_party/tgfx/web/src/utils/decorators.d.ts +0 -2
- package/types/web/src/core/video-reader.d.ts +4 -3
- package/types/web/src/interfaces.d.ts +8 -15
- package/types/web/src/pag-composition.d.ts +3 -3
- package/types/web/src/pag-file.d.ts +4 -4
- package/types/web/src/pag-player.d.ts +2 -2
- package/types/web/src/pag-view.d.ts +1 -1
- package/types/web/src/types.d.ts +12 -3
- package/types/web/src/utils/decorators.d.ts +0 -2
- package/types/web/src/utils/ua.d.ts +0 -1
- package/types/web/tsconfig.json +19 -0
- package/lib/libpag.worker.cjs.js +0 -794
- package/lib/libpag.worker.cjs.js.map +0 -1
- package/lib/libpag.worker.esm.js +0 -789
- package/lib/libpag.worker.esm.js.map +0 -1
- package/lib/libpag.worker.js +0 -800
- package/lib/libpag.worker.js.map +0 -1
- package/lib/libpag.worker.min.js +0 -2
- package/lib/libpag.worker.min.js.map +0 -1
- package/src/worker/client.ts +0 -76
- package/src/worker/events.ts +0 -41
- package/src/worker/pag-file.ts +0 -90
- package/src/worker/pag-image.ts +0 -43
- package/src/worker/pag-view.ts +0 -171
- package/src/worker/utils.ts +0 -29
- package/src/worker/video-reader.ts +0 -62
- package/src/worker/worker.ts +0 -169
- package/types/third_party/tgfx/web/src/core/web-mask.d.ts +0 -26
- package/types/web/src/utils/canvas.d.ts +0 -4
- package/types/web/src/worker/client.d.ts +0 -16
- package/types/web/src/worker/events.d.ts +0 -32
- package/types/web/src/worker/pag-file.d.ts +0 -33
- package/types/web/src/worker/pag-image.d.ts +0 -8
- package/types/web/src/worker/pag-view.d.ts +0 -67
- package/types/web/src/worker/utils.d.ts +0 -7
- package/types/web/src/worker/video-reader.d.ts +0 -16
- package/types/web/src/worker/worker.d.ts +0 -13
package/lib/libpag.worker.cjs.js
DELETED
|
@@ -1,794 +0,0 @@
|
|
|
1
|
-
/////////////////////////////////////////////////////////////////////////////////////////////////
|
|
2
|
-
//
|
|
3
|
-
// Tencent is pleased to support the open source community by making libpag available.
|
|
4
|
-
//
|
|
5
|
-
// Copyright (C) 2025 Tencent. All rights reserved.
|
|
6
|
-
//
|
|
7
|
-
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
|
|
8
|
-
// except in compliance with the License. You may obtain a copy of the License at
|
|
9
|
-
//
|
|
10
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
//
|
|
12
|
-
// unless required by applicable law or agreed to in writing, software distributed under the
|
|
13
|
-
// license is distributed on an "as is" basis, without warranties or conditions of any kind,
|
|
14
|
-
// either express or implied. see the license for the specific language governing permissions
|
|
15
|
-
// and limitations under the license.
|
|
16
|
-
//
|
|
17
|
-
/////////////////////////////////////////////////////////////////////////////////////////////////
|
|
18
|
-
|
|
19
|
-
'use strict';
|
|
20
|
-
|
|
21
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
22
|
-
|
|
23
|
-
var WorkerMessageType = /* @__PURE__ */ ((WorkerMessageType2) => {
|
|
24
|
-
WorkerMessageType2["PAGInit"] = "PAGInit";
|
|
25
|
-
WorkerMessageType2["PAGView_init"] = "PAGView.init";
|
|
26
|
-
WorkerMessageType2["PAGView_duration"] = "PAGView.duration";
|
|
27
|
-
WorkerMessageType2["PAGView_play"] = "PAGView.play";
|
|
28
|
-
WorkerMessageType2["PAGView_pause"] = "PAGView.pause";
|
|
29
|
-
WorkerMessageType2["PAGView_stop"] = "PAGView.stop";
|
|
30
|
-
WorkerMessageType2["PAGView_setRepeatCount"] = "PAGView.setRepeatCount";
|
|
31
|
-
WorkerMessageType2["PAGView_getProgress"] = "PAGView.getProgress";
|
|
32
|
-
WorkerMessageType2["PAGView_currentFrame"] = "PAGView.currentFrame";
|
|
33
|
-
WorkerMessageType2["PAGView_setProgress"] = "PAGView.setProgress";
|
|
34
|
-
WorkerMessageType2["PAGView_scaleMode"] = "PAGView.scaleMode";
|
|
35
|
-
WorkerMessageType2["PAGView_setScaleMode"] = "PAGView.setScaleMode";
|
|
36
|
-
WorkerMessageType2["PAGView_flush"] = "PAGView.flush";
|
|
37
|
-
WorkerMessageType2["PAGView_getDebugData"] = "PAGView.getDebugData";
|
|
38
|
-
WorkerMessageType2["PAGView_destroy"] = "PAGView.destroy";
|
|
39
|
-
WorkerMessageType2["PAGFile_load"] = "PAGFile.load";
|
|
40
|
-
WorkerMessageType2["PAGFile_getTextData"] = "PAGFile.getTextData";
|
|
41
|
-
WorkerMessageType2["PAGFile_replaceText"] = "PAGFile.replaceText";
|
|
42
|
-
WorkerMessageType2["PAGFile_replaceImage"] = "PAGFile.replaceImage";
|
|
43
|
-
WorkerMessageType2["PAGFile_destroy"] = "PAGFile.destroy";
|
|
44
|
-
WorkerMessageType2["PAGImage_fromSource"] = "PAGImage.fromSource";
|
|
45
|
-
WorkerMessageType2["PAGImage_destroy"] = "PAGImage.destroy";
|
|
46
|
-
WorkerMessageType2["VideoReader_constructor"] = "VideoReader.constructor";
|
|
47
|
-
WorkerMessageType2["VideoReader_prepare"] = "VideoReader.prepare";
|
|
48
|
-
WorkerMessageType2["VideoReader_play"] = "VideoReader.play";
|
|
49
|
-
WorkerMessageType2["VideoReader_pause"] = "VideoReader.pause";
|
|
50
|
-
WorkerMessageType2["VideoReader_stop"] = "VideoReader.stop";
|
|
51
|
-
WorkerMessageType2["VideoReader_getError"] = "VideoReader.getError";
|
|
52
|
-
WorkerMessageType2["PAGModule_linkVideoReader"] = "PAGModule.linkVideoReader";
|
|
53
|
-
WorkerMessageType2["TextDocument_delete"] = "TextDocument.delete";
|
|
54
|
-
return WorkerMessageType2;
|
|
55
|
-
})(WorkerMessageType || {});
|
|
56
|
-
|
|
57
|
-
let messageCount = 0;
|
|
58
|
-
const generateMessageName = (name) => `${name}_${messageCount++}`;
|
|
59
|
-
const postMessage = (worker, message, callback, transfer = []) => {
|
|
60
|
-
return new Promise((resolve) => {
|
|
61
|
-
const name = generateMessageName(message.name);
|
|
62
|
-
const handle = (event) => {
|
|
63
|
-
if (event.data.name === name) {
|
|
64
|
-
worker.removeEventListener("message", handle);
|
|
65
|
-
resolve(callback(...event.data.args));
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
worker.addEventListener("message", handle);
|
|
69
|
-
worker.postMessage({ name, args: message.args }, transfer);
|
|
70
|
-
});
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
const VIDEO_DECODE_WAIT_FRAME = 3;
|
|
74
|
-
const VIDEO_DECODE_SEEK_TIMEOUT_FRAME = 12;
|
|
75
|
-
const VIDEO_PLAYBACK_RATE_MIN = 0.125;
|
|
76
|
-
const VIDEO_PLAYBACK_RATE_MAX = 4;
|
|
77
|
-
|
|
78
|
-
let eventHandlers = {};
|
|
79
|
-
const addListener = (node, event, handler, capture = false) => {
|
|
80
|
-
if (!(event in eventHandlers)) {
|
|
81
|
-
eventHandlers[event] = [];
|
|
82
|
-
}
|
|
83
|
-
eventHandlers[event]?.push({ node, handler, capture });
|
|
84
|
-
node.addEventListener(event, handler, capture);
|
|
85
|
-
};
|
|
86
|
-
const removeListener = (targetNode, event, targetHandler) => {
|
|
87
|
-
if (!(event in eventHandlers))
|
|
88
|
-
return;
|
|
89
|
-
eventHandlers[event]?.filter(({ node, handler }) => node === targetNode && handler === targetHandler).forEach(({ node, handler, capture }) => node.removeEventListener(event, handler, capture));
|
|
90
|
-
};
|
|
91
|
-
const removeAllListeners = (targetNode, event) => {
|
|
92
|
-
if (!(event in eventHandlers))
|
|
93
|
-
return;
|
|
94
|
-
eventHandlers[event]?.filter(({ node }) => node === targetNode).forEach(({ node, handler, capture }) => node.removeEventListener(event, handler, capture));
|
|
95
|
-
eventHandlers[event] = eventHandlers[event]?.filter(({ node }) => node !== targetNode);
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
const nav = navigator?.userAgent || "";
|
|
99
|
-
const ANDROID = /android|adr/i.test(nav);
|
|
100
|
-
const MOBILE = /(mobile)/i.test(nav) && ANDROID;
|
|
101
|
-
!(/(mobile)/i.test(nav) || MOBILE) && /Mac OS X/i.test(nav);
|
|
102
|
-
const IPHONE = /(iphone|ipad|ipod)/i.test(nav);
|
|
103
|
-
const WECHAT = /MicroMessenger/i.test(nav);
|
|
104
|
-
const SAFARI_OR_IOS_WEBVIEW = /^((?!chrome|android).)*safari/i.test(nav) || IPHONE;
|
|
105
|
-
const WORKER = typeof globalThis.importScripts === "function";
|
|
106
|
-
|
|
107
|
-
let PAGModule;
|
|
108
|
-
|
|
109
|
-
class BitmapImage {
|
|
110
|
-
constructor(bitmap) {
|
|
111
|
-
this.bitmap = bitmap;
|
|
112
|
-
}
|
|
113
|
-
setBitmap(bitmap) {
|
|
114
|
-
if (this.bitmap) {
|
|
115
|
-
this.bitmap.close();
|
|
116
|
-
}
|
|
117
|
-
this.bitmap = bitmap;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
class WorkerVideoReader {
|
|
122
|
-
constructor(proxyId) {
|
|
123
|
-
this.bitmap = null;
|
|
124
|
-
this.isSought = false;
|
|
125
|
-
this.isPlaying = false;
|
|
126
|
-
this.bitmapImage = new BitmapImage(null);
|
|
127
|
-
this.proxyId = proxyId;
|
|
128
|
-
}
|
|
129
|
-
prepare(targetFrame, playbackRate) {
|
|
130
|
-
return new Promise((resolve) => {
|
|
131
|
-
postMessage(
|
|
132
|
-
self,
|
|
133
|
-
{ name: WorkerMessageType.VideoReader_prepare, args: [this.proxyId, targetFrame, playbackRate] },
|
|
134
|
-
(res) => {
|
|
135
|
-
this.bitmapImage.setBitmap(res);
|
|
136
|
-
resolve();
|
|
137
|
-
}
|
|
138
|
-
);
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
getVideo() {
|
|
142
|
-
return this.bitmapImage;
|
|
143
|
-
}
|
|
144
|
-
onDestroy() {
|
|
145
|
-
self.postMessage({ name: "VideoReader.onDestroy", args: [this.proxyId] });
|
|
146
|
-
}
|
|
147
|
-
play() {
|
|
148
|
-
return new Promise((resolve) => {
|
|
149
|
-
postMessage(self, { name: WorkerMessageType.VideoReader_play, args: [this.proxyId] }, () => {
|
|
150
|
-
resolve();
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
pause() {
|
|
155
|
-
postMessage(self, { name: WorkerMessageType.VideoReader_pause, args: [this.proxyId] }, () => {
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
stop() {
|
|
159
|
-
postMessage(self, { name: WorkerMessageType.VideoReader_stop, args: [this.proxyId] }, () => {
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
getError() {
|
|
163
|
-
return new Promise((resolve) => {
|
|
164
|
-
postMessage(self, { name: WorkerMessageType.VideoReader_getError, args: [this.proxyId] }, (res) => {
|
|
165
|
-
resolve(res);
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const isInstanceOf = (value, type) => typeof type !== "undefined" && value instanceof type;
|
|
172
|
-
|
|
173
|
-
const UHD_RESOLUTION = 3840;
|
|
174
|
-
const getWechatNetwork = () => {
|
|
175
|
-
return new Promise((resolve) => {
|
|
176
|
-
window.WeixinJSBridge.invoke(
|
|
177
|
-
"getNetworkType",
|
|
178
|
-
{},
|
|
179
|
-
() => {
|
|
180
|
-
resolve();
|
|
181
|
-
},
|
|
182
|
-
() => {
|
|
183
|
-
resolve();
|
|
184
|
-
}
|
|
185
|
-
);
|
|
186
|
-
});
|
|
187
|
-
};
|
|
188
|
-
const waitVideoCanPlay = (videoElement) => {
|
|
189
|
-
return new Promise((resolve) => {
|
|
190
|
-
const canplayHandle = () => {
|
|
191
|
-
removeListener(videoElement, "canplay", canplayHandle);
|
|
192
|
-
clearTimeout(timer);
|
|
193
|
-
resolve(true);
|
|
194
|
-
};
|
|
195
|
-
addListener(videoElement, "canplay", canplayHandle);
|
|
196
|
-
const timer = setTimeout(() => {
|
|
197
|
-
removeListener(videoElement, "canplay", canplayHandle);
|
|
198
|
-
resolve(false);
|
|
199
|
-
}, 1e3);
|
|
200
|
-
});
|
|
201
|
-
};
|
|
202
|
-
class VideoReader {
|
|
203
|
-
constructor(source, width, height, frameRate, staticTimeRanges, isWorker = false) {
|
|
204
|
-
this.isSought = false;
|
|
205
|
-
this.isPlaying = false;
|
|
206
|
-
this.bitmap = null;
|
|
207
|
-
this.videoEl = null;
|
|
208
|
-
this.frameRate = 0;
|
|
209
|
-
this.canplay = false;
|
|
210
|
-
this.staticTimeRanges = null;
|
|
211
|
-
this.disablePlaybackRate = false;
|
|
212
|
-
this.error = null;
|
|
213
|
-
this.player = null;
|
|
214
|
-
this.width = 0;
|
|
215
|
-
this.height = 0;
|
|
216
|
-
this.bitmapCanvas = null;
|
|
217
|
-
this.bitmapCtx = null;
|
|
218
|
-
if (isInstanceOf(source, globalThis.HTMLVideoElement)) {
|
|
219
|
-
this.videoEl = source;
|
|
220
|
-
this.canplay = true;
|
|
221
|
-
} else {
|
|
222
|
-
this.videoEl = document.createElement("video");
|
|
223
|
-
this.videoEl.style.display = "none";
|
|
224
|
-
this.videoEl.muted = true;
|
|
225
|
-
this.videoEl.playsInline = true;
|
|
226
|
-
this.videoEl.preload = "auto";
|
|
227
|
-
this.videoEl.width = width;
|
|
228
|
-
this.videoEl.height = height;
|
|
229
|
-
waitVideoCanPlay(this.videoEl).then(() => {
|
|
230
|
-
this.canplay = true;
|
|
231
|
-
});
|
|
232
|
-
const blob = new Blob([source], { type: "video/mp4" });
|
|
233
|
-
this.videoEl.src = URL.createObjectURL(blob);
|
|
234
|
-
if (IPHONE) {
|
|
235
|
-
this.videoEl.load();
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
this.frameRate = frameRate;
|
|
239
|
-
this.width = width;
|
|
240
|
-
this.height = height;
|
|
241
|
-
this.staticTimeRanges = new StaticTimeRanges(staticTimeRanges);
|
|
242
|
-
if (UHD_RESOLUTION < width || UHD_RESOLUTION < height) {
|
|
243
|
-
this.disablePlaybackRate = true;
|
|
244
|
-
}
|
|
245
|
-
if (!isWorker) {
|
|
246
|
-
this.linkPlayer(PAGModule.currentPlayer);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
static async create(source, width, height, frameRate, staticTimeRanges) {
|
|
250
|
-
if (WORKER) {
|
|
251
|
-
const proxyId = await new Promise((resolve) => {
|
|
252
|
-
const uint8Array = source;
|
|
253
|
-
const buffer = uint8Array.buffer.slice(uint8Array.byteOffset, uint8Array.byteOffset + uint8Array.byteLength);
|
|
254
|
-
postMessage(
|
|
255
|
-
self,
|
|
256
|
-
{
|
|
257
|
-
name: WorkerMessageType.VideoReader_constructor,
|
|
258
|
-
args: [buffer, width, height, frameRate, staticTimeRanges, true]
|
|
259
|
-
},
|
|
260
|
-
(res) => {
|
|
261
|
-
resolve(res);
|
|
262
|
-
},
|
|
263
|
-
[buffer]
|
|
264
|
-
);
|
|
265
|
-
});
|
|
266
|
-
const videoReader = new WorkerVideoReader(proxyId);
|
|
267
|
-
PAGModule.currentPlayer?.linkVideoReader(videoReader);
|
|
268
|
-
return videoReader;
|
|
269
|
-
}
|
|
270
|
-
return new VideoReader(source, width, height, frameRate, staticTimeRanges);
|
|
271
|
-
}
|
|
272
|
-
async prepare(targetFrame, playbackRate) {
|
|
273
|
-
this.setError(null);
|
|
274
|
-
this.isSought = false;
|
|
275
|
-
const { currentTime } = this.videoEl;
|
|
276
|
-
const targetTime = targetFrame / this.frameRate;
|
|
277
|
-
if (currentTime === 0 && targetTime === 0) {
|
|
278
|
-
if (!this.canplay && !SAFARI_OR_IOS_WEBVIEW) {
|
|
279
|
-
await waitVideoCanPlay(this.videoEl);
|
|
280
|
-
} else {
|
|
281
|
-
try {
|
|
282
|
-
await this.play();
|
|
283
|
-
} catch (e) {
|
|
284
|
-
this.setError(e);
|
|
285
|
-
}
|
|
286
|
-
await new Promise((resolve) => {
|
|
287
|
-
requestAnimationFrame(() => {
|
|
288
|
-
this.pause();
|
|
289
|
-
resolve();
|
|
290
|
-
});
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
} else {
|
|
294
|
-
if (Math.round(targetTime * this.frameRate) === Math.round(currentTime * this.frameRate)) ; else if (this.staticTimeRanges?.contains(targetFrame)) {
|
|
295
|
-
await this.seek(targetTime, false);
|
|
296
|
-
return;
|
|
297
|
-
} else if (Math.abs(currentTime - targetTime) < 1 / this.frameRate * VIDEO_DECODE_WAIT_FRAME) ; else {
|
|
298
|
-
this.isSought = true;
|
|
299
|
-
await this.seek(targetTime);
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
const targetPlaybackRate = Math.min(Math.max(playbackRate, VIDEO_PLAYBACK_RATE_MIN), VIDEO_PLAYBACK_RATE_MAX);
|
|
304
|
-
if (!this.disablePlaybackRate && this.videoEl.playbackRate !== targetPlaybackRate) {
|
|
305
|
-
this.videoEl.playbackRate = targetPlaybackRate;
|
|
306
|
-
}
|
|
307
|
-
if (this.isPlaying && this.videoEl.paused) {
|
|
308
|
-
try {
|
|
309
|
-
await this.play();
|
|
310
|
-
} catch (e) {
|
|
311
|
-
this.setError(e);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
getVideo() {
|
|
316
|
-
return this.videoEl;
|
|
317
|
-
}
|
|
318
|
-
async generateBitmap() {
|
|
319
|
-
if (!this.bitmapCanvas) {
|
|
320
|
-
this.bitmapCanvas = new OffscreenCanvas(this.width, this.height);
|
|
321
|
-
this.bitmapCanvas.width = this.width;
|
|
322
|
-
this.bitmapCanvas.height = this.height;
|
|
323
|
-
this.bitmapCtx = this.bitmapCanvas.getContext("2d");
|
|
324
|
-
}
|
|
325
|
-
this.bitmapCtx?.fillRect(0, 0, this.width, this.height);
|
|
326
|
-
this.bitmapCtx?.drawImage(this.videoEl, 0, 0, this.width, this.height);
|
|
327
|
-
this.bitmap = await createImageBitmap(this.bitmapCanvas);
|
|
328
|
-
return this.bitmap;
|
|
329
|
-
}
|
|
330
|
-
async play() {
|
|
331
|
-
if (!this.videoEl.paused)
|
|
332
|
-
return;
|
|
333
|
-
if (WECHAT && window.WeixinJSBridge) {
|
|
334
|
-
await getWechatNetwork();
|
|
335
|
-
}
|
|
336
|
-
if (document.visibilityState !== "visible") {
|
|
337
|
-
const visibilityHandle = () => {
|
|
338
|
-
if (document.visibilityState === "visible") {
|
|
339
|
-
if (this.videoEl)
|
|
340
|
-
this.videoEl.play();
|
|
341
|
-
window.removeEventListener("visibilitychange", visibilityHandle);
|
|
342
|
-
}
|
|
343
|
-
};
|
|
344
|
-
window.addEventListener("visibilitychange", visibilityHandle);
|
|
345
|
-
throw new Error("The play() request was interrupted because the document was hidden!");
|
|
346
|
-
}
|
|
347
|
-
await this.videoEl?.play();
|
|
348
|
-
}
|
|
349
|
-
pause() {
|
|
350
|
-
this.isPlaying = false;
|
|
351
|
-
if (this.videoEl.paused)
|
|
352
|
-
return;
|
|
353
|
-
this.videoEl?.pause();
|
|
354
|
-
}
|
|
355
|
-
stop() {
|
|
356
|
-
this.isPlaying = false;
|
|
357
|
-
if (!this.videoEl.paused) {
|
|
358
|
-
this.videoEl?.pause();
|
|
359
|
-
}
|
|
360
|
-
this.videoEl.currentTime = 0;
|
|
361
|
-
}
|
|
362
|
-
getError() {
|
|
363
|
-
return this.error;
|
|
364
|
-
}
|
|
365
|
-
onDestroy() {
|
|
366
|
-
if (this.player) {
|
|
367
|
-
this.player.unlinkVideoReader(this);
|
|
368
|
-
}
|
|
369
|
-
removeAllListeners(this.videoEl, "playing");
|
|
370
|
-
removeAllListeners(this.videoEl, "timeupdate");
|
|
371
|
-
this.videoEl = null;
|
|
372
|
-
this.bitmapCanvas = null;
|
|
373
|
-
this.bitmapCtx = null;
|
|
374
|
-
}
|
|
375
|
-
seek(targetTime, play = true) {
|
|
376
|
-
return new Promise((resolve, reject) => {
|
|
377
|
-
if (!this.videoEl) {
|
|
378
|
-
reject(new Error("Video element is not initialized."));
|
|
379
|
-
return;
|
|
380
|
-
}
|
|
381
|
-
const onSeeked = () => {
|
|
382
|
-
removeListener(this.videoEl, "seeked", onSeeked);
|
|
383
|
-
clearTimeout(seekTimeout);
|
|
384
|
-
if (play) {
|
|
385
|
-
this.videoEl?.play().catch((e) => {
|
|
386
|
-
this.setError(e);
|
|
387
|
-
});
|
|
388
|
-
} else if (!play && !this.videoEl.paused) {
|
|
389
|
-
this.videoEl?.pause();
|
|
390
|
-
}
|
|
391
|
-
resolve();
|
|
392
|
-
};
|
|
393
|
-
const onCanPlay = () => {
|
|
394
|
-
removeListener(this.videoEl, "canplay", onCanPlay);
|
|
395
|
-
this.videoEl.currentTime = targetTime;
|
|
396
|
-
addListener(this.videoEl, "seeked", onSeeked);
|
|
397
|
-
};
|
|
398
|
-
const seekTimeout = setTimeout(() => {
|
|
399
|
-
removeListener(this.videoEl, "canplay", onCanPlay);
|
|
400
|
-
removeListener(this.videoEl, "seeked", onSeeked);
|
|
401
|
-
reject(new Error("Seek operation timed out."));
|
|
402
|
-
}, 1e3 / this.frameRate * VIDEO_DECODE_SEEK_TIMEOUT_FRAME);
|
|
403
|
-
if (this.videoEl.readyState < HTMLMediaElement.HAVE_FUTURE_DATA) {
|
|
404
|
-
addListener(this.videoEl, "canplay", onCanPlay);
|
|
405
|
-
} else {
|
|
406
|
-
this.videoEl.currentTime = targetTime;
|
|
407
|
-
addListener(this.videoEl, "seeked", onSeeked);
|
|
408
|
-
}
|
|
409
|
-
});
|
|
410
|
-
}
|
|
411
|
-
setError(e) {
|
|
412
|
-
this.error = e;
|
|
413
|
-
}
|
|
414
|
-
linkPlayer(player) {
|
|
415
|
-
this.player = player;
|
|
416
|
-
if (player) {
|
|
417
|
-
player.linkVideoReader(this);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
class StaticTimeRanges {
|
|
422
|
-
constructor(timeRanges) {
|
|
423
|
-
this.timeRanges = timeRanges;
|
|
424
|
-
}
|
|
425
|
-
contains(targetFrame) {
|
|
426
|
-
if (this.timeRanges.length === 0)
|
|
427
|
-
return false;
|
|
428
|
-
for (let timeRange of this.timeRanges) {
|
|
429
|
-
if (timeRange.start <= targetFrame && targetFrame < timeRange.end) {
|
|
430
|
-
return true;
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
return false;
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
const readFile = (file) => new Promise((resolve) => {
|
|
438
|
-
const reader = new FileReader();
|
|
439
|
-
reader.onload = () => {
|
|
440
|
-
resolve(reader.result);
|
|
441
|
-
};
|
|
442
|
-
reader.onerror = () => {
|
|
443
|
-
console.error(reader.error.message);
|
|
444
|
-
};
|
|
445
|
-
reader.readAsArrayBuffer(file);
|
|
446
|
-
});
|
|
447
|
-
const transferToArrayBuffer = (data) => {
|
|
448
|
-
if (isInstanceOf(data, globalThis.File)) {
|
|
449
|
-
return readFile(data);
|
|
450
|
-
} else if (isInstanceOf(data, globalThis.Blob)) {
|
|
451
|
-
return readFile(new File([data], ""));
|
|
452
|
-
} else if (isInstanceOf(data, globalThis.ArrayBuffer)) {
|
|
453
|
-
return Promise.resolve(data);
|
|
454
|
-
}
|
|
455
|
-
return Promise.resolve(null);
|
|
456
|
-
};
|
|
457
|
-
|
|
458
|
-
function destroyVerify(constructor) {
|
|
459
|
-
let functions = Object.getOwnPropertyNames(constructor.prototype).filter(
|
|
460
|
-
(name) => name !== "constructor" && typeof constructor.prototype[name] === "function"
|
|
461
|
-
);
|
|
462
|
-
const proxyFn = (target, methodName) => {
|
|
463
|
-
const fn = target[methodName];
|
|
464
|
-
target[methodName] = function(...args) {
|
|
465
|
-
if (this["isDestroyed"]) {
|
|
466
|
-
console.error(`Don't call ${methodName} of the ${constructor.name} that is destroyed.`);
|
|
467
|
-
return;
|
|
468
|
-
}
|
|
469
|
-
return fn.call(this, ...args);
|
|
470
|
-
};
|
|
471
|
-
};
|
|
472
|
-
functions.forEach((name) => proxyFn(constructor.prototype, name));
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
var __defProp$2 = Object.defineProperty;
|
|
476
|
-
var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor;
|
|
477
|
-
var __decorateClass$2 = (decorators, target, key, kind) => {
|
|
478
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$2(target, key) : target;
|
|
479
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
480
|
-
if (decorator = decorators[i])
|
|
481
|
-
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
482
|
-
if (kind && result)
|
|
483
|
-
__defProp$2(target, key, result);
|
|
484
|
-
return result;
|
|
485
|
-
};
|
|
486
|
-
exports.WorkerPAGFile = class {
|
|
487
|
-
constructor(worker, key) {
|
|
488
|
-
this.isDestroyed = false;
|
|
489
|
-
this.worker = worker;
|
|
490
|
-
this.key = key;
|
|
491
|
-
}
|
|
492
|
-
static async load(worker, data) {
|
|
493
|
-
const buffer = await transferToArrayBuffer(data);
|
|
494
|
-
if (!buffer)
|
|
495
|
-
throw new Error(
|
|
496
|
-
"Initialize PAGFile data type error, please put check data type must to be File \uFF5C Blob | ArrayBuffer!"
|
|
497
|
-
);
|
|
498
|
-
return await postMessage(
|
|
499
|
-
worker,
|
|
500
|
-
{ name: WorkerMessageType.PAGFile_load, args: [data] },
|
|
501
|
-
(key) => new exports.WorkerPAGFile(worker, key)
|
|
502
|
-
);
|
|
503
|
-
}
|
|
504
|
-
getTextData(editableTextIndex) {
|
|
505
|
-
return postMessage(
|
|
506
|
-
this.worker,
|
|
507
|
-
{ name: WorkerMessageType.PAGFile_getTextData, args: [this.key, editableTextIndex] },
|
|
508
|
-
(res) => {
|
|
509
|
-
res.delete = () => {
|
|
510
|
-
return postMessage(
|
|
511
|
-
this.worker,
|
|
512
|
-
{ name: WorkerMessageType.TextDocument_delete, args: [res.key] },
|
|
513
|
-
() => void 0
|
|
514
|
-
);
|
|
515
|
-
};
|
|
516
|
-
return res;
|
|
517
|
-
}
|
|
518
|
-
);
|
|
519
|
-
}
|
|
520
|
-
replaceText(editableTextIndex, textData) {
|
|
521
|
-
const textDocument = {};
|
|
522
|
-
for (const key in textData) {
|
|
523
|
-
if (key !== "delete") {
|
|
524
|
-
textDocument[key] = textData[key];
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
return postMessage(
|
|
528
|
-
this.worker,
|
|
529
|
-
{ name: WorkerMessageType.PAGFile_replaceText, args: [this.key, editableTextIndex, textDocument] },
|
|
530
|
-
() => void 0
|
|
531
|
-
);
|
|
532
|
-
}
|
|
533
|
-
replaceImage(editableImageIndex, pagImage) {
|
|
534
|
-
return postMessage(
|
|
535
|
-
this.worker,
|
|
536
|
-
{ name: WorkerMessageType.PAGFile_replaceImage, args: [this.key, editableImageIndex, pagImage.key] },
|
|
537
|
-
() => void 0
|
|
538
|
-
);
|
|
539
|
-
}
|
|
540
|
-
destroy() {
|
|
541
|
-
return postMessage(this.worker, { name: WorkerMessageType.PAGFile_destroy, args: [this.key] }, () => {
|
|
542
|
-
this.isDestroyed = true;
|
|
543
|
-
});
|
|
544
|
-
}
|
|
545
|
-
};
|
|
546
|
-
exports.WorkerPAGFile = __decorateClass$2([
|
|
547
|
-
destroyVerify
|
|
548
|
-
], exports.WorkerPAGFile);
|
|
549
|
-
|
|
550
|
-
const calculateDisplaySize = (canvas) => {
|
|
551
|
-
const styleDeclaration = globalThis.getComputedStyle(canvas, null);
|
|
552
|
-
const computedSize = {
|
|
553
|
-
width: Number(styleDeclaration.width.replace("px", "")),
|
|
554
|
-
height: Number(styleDeclaration.height.replace("px", ""))
|
|
555
|
-
};
|
|
556
|
-
if (computedSize.width > 0 && computedSize.height > 0) {
|
|
557
|
-
return computedSize;
|
|
558
|
-
} else {
|
|
559
|
-
const styleSize = {
|
|
560
|
-
width: Number(canvas.style.width.replace("px", "")),
|
|
561
|
-
height: Number(canvas.style.height.replace("px", ""))
|
|
562
|
-
};
|
|
563
|
-
if (styleSize.width > 0 && styleSize.height > 0) {
|
|
564
|
-
return styleSize;
|
|
565
|
-
} else {
|
|
566
|
-
return {
|
|
567
|
-
width: canvas.width,
|
|
568
|
-
height: canvas.height
|
|
569
|
-
};
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
};
|
|
573
|
-
|
|
574
|
-
var __defProp$1 = Object.defineProperty;
|
|
575
|
-
var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
|
|
576
|
-
var __decorateClass$1 = (decorators, target, key, kind) => {
|
|
577
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target;
|
|
578
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
579
|
-
if (decorator = decorators[i])
|
|
580
|
-
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
581
|
-
if (kind && result)
|
|
582
|
-
__defProp$1(target, key, result);
|
|
583
|
-
return result;
|
|
584
|
-
};
|
|
585
|
-
exports.WorkerPAGView = class {
|
|
586
|
-
constructor(worker, key) {
|
|
587
|
-
this.isDestroyed = false;
|
|
588
|
-
this.worker = worker;
|
|
589
|
-
this.key = key;
|
|
590
|
-
}
|
|
591
|
-
static init(file, canvas, initOptions) {
|
|
592
|
-
const options = {
|
|
593
|
-
...{
|
|
594
|
-
useScale: true,
|
|
595
|
-
useCanvas2D: false,
|
|
596
|
-
firstFrame: true
|
|
597
|
-
},
|
|
598
|
-
...initOptions
|
|
599
|
-
};
|
|
600
|
-
if (options.useScale) {
|
|
601
|
-
resizeCanvas(canvas);
|
|
602
|
-
}
|
|
603
|
-
const offscreen = canvas.transferControlToOffscreen();
|
|
604
|
-
return postMessage(
|
|
605
|
-
file.worker,
|
|
606
|
-
{ name: WorkerMessageType.PAGView_init, args: [file.key, offscreen, initOptions] },
|
|
607
|
-
(key) => new exports.WorkerPAGView(file.worker, key),
|
|
608
|
-
[offscreen]
|
|
609
|
-
);
|
|
610
|
-
}
|
|
611
|
-
duration() {
|
|
612
|
-
return postMessage(
|
|
613
|
-
this.worker,
|
|
614
|
-
{ name: WorkerMessageType.PAGView_duration, args: [this.key] },
|
|
615
|
-
(res) => res
|
|
616
|
-
);
|
|
617
|
-
}
|
|
618
|
-
play() {
|
|
619
|
-
return postMessage(this.worker, { name: WorkerMessageType.PAGView_play, args: [this.key] }, () => void 0);
|
|
620
|
-
}
|
|
621
|
-
pause() {
|
|
622
|
-
return postMessage(this.worker, { name: WorkerMessageType.PAGView_pause, args: [this.key] }, () => void 0);
|
|
623
|
-
}
|
|
624
|
-
stop() {
|
|
625
|
-
return postMessage(this.worker, { name: WorkerMessageType.PAGView_stop, args: [this.key] }, () => void 0);
|
|
626
|
-
}
|
|
627
|
-
setRepeatCount(repeatCount) {
|
|
628
|
-
return postMessage(
|
|
629
|
-
this.worker,
|
|
630
|
-
{ name: WorkerMessageType.PAGView_setRepeatCount, args: [this.key, repeatCount] },
|
|
631
|
-
() => void 0
|
|
632
|
-
);
|
|
633
|
-
}
|
|
634
|
-
getProgress() {
|
|
635
|
-
return postMessage(
|
|
636
|
-
this.worker,
|
|
637
|
-
{ name: WorkerMessageType.PAGView_getProgress, args: [this.key] },
|
|
638
|
-
(res) => res
|
|
639
|
-
);
|
|
640
|
-
}
|
|
641
|
-
currentFrame() {
|
|
642
|
-
return postMessage(
|
|
643
|
-
this.worker,
|
|
644
|
-
{ name: WorkerMessageType.PAGView_currentFrame, args: [this.key] },
|
|
645
|
-
(res) => res
|
|
646
|
-
);
|
|
647
|
-
}
|
|
648
|
-
setProgress(progress) {
|
|
649
|
-
return postMessage(
|
|
650
|
-
this.worker,
|
|
651
|
-
{
|
|
652
|
-
name: WorkerMessageType.PAGView_setProgress,
|
|
653
|
-
args: [this.key, progress]
|
|
654
|
-
},
|
|
655
|
-
() => void 0
|
|
656
|
-
);
|
|
657
|
-
}
|
|
658
|
-
scaleMode() {
|
|
659
|
-
return postMessage(
|
|
660
|
-
this.worker,
|
|
661
|
-
{ name: WorkerMessageType.PAGView_scaleMode, args: [this.key] },
|
|
662
|
-
(res) => res
|
|
663
|
-
);
|
|
664
|
-
}
|
|
665
|
-
setScaleMode(value) {
|
|
666
|
-
return postMessage(
|
|
667
|
-
this.worker,
|
|
668
|
-
{ name: WorkerMessageType.PAGView_setScaleMode, args: [this.key, value] },
|
|
669
|
-
() => void 0
|
|
670
|
-
);
|
|
671
|
-
}
|
|
672
|
-
flush() {
|
|
673
|
-
return postMessage(this.worker, { name: WorkerMessageType.PAGView_flush, args: [this.key] }, (res) => res);
|
|
674
|
-
}
|
|
675
|
-
getDebugData() {
|
|
676
|
-
return postMessage(
|
|
677
|
-
this.worker,
|
|
678
|
-
{ name: WorkerMessageType.PAGView_getDebugData, args: [this.key] },
|
|
679
|
-
(res) => res
|
|
680
|
-
);
|
|
681
|
-
}
|
|
682
|
-
destroy() {
|
|
683
|
-
postMessage(this.worker, { name: WorkerMessageType.PAGView_destroy, args: [this.key] }, () => {
|
|
684
|
-
this.isDestroyed = true;
|
|
685
|
-
});
|
|
686
|
-
}
|
|
687
|
-
};
|
|
688
|
-
exports.WorkerPAGView = __decorateClass$1([
|
|
689
|
-
destroyVerify
|
|
690
|
-
], exports.WorkerPAGView);
|
|
691
|
-
const resizeCanvas = (canvas) => {
|
|
692
|
-
const displaySize = calculateDisplaySize(canvas);
|
|
693
|
-
canvas.style.width = `${displaySize.width}px`;
|
|
694
|
-
canvas.style.height = `${displaySize.height}px`;
|
|
695
|
-
canvas.width = displaySize.width * globalThis.devicePixelRatio;
|
|
696
|
-
canvas.height = displaySize.height * globalThis.devicePixelRatio;
|
|
697
|
-
};
|
|
698
|
-
|
|
699
|
-
var __defProp = Object.defineProperty;
|
|
700
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
701
|
-
var __decorateClass = (decorators, target, key, kind) => {
|
|
702
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
703
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
704
|
-
if (decorator = decorators[i])
|
|
705
|
-
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
706
|
-
if (kind && result)
|
|
707
|
-
__defProp(target, key, result);
|
|
708
|
-
return result;
|
|
709
|
-
};
|
|
710
|
-
exports.WorkerPAGImage = class {
|
|
711
|
-
constructor(worker, key) {
|
|
712
|
-
this.isDestroyed = false;
|
|
713
|
-
this.worker = worker;
|
|
714
|
-
this.key = key;
|
|
715
|
-
}
|
|
716
|
-
static async fromSource(worker, source) {
|
|
717
|
-
const width = isInstanceOf(source, globalThis.HTMLVideoElement) ? source.videoWidth : source.width;
|
|
718
|
-
const height = isInstanceOf(source, globalThis.HTMLVideoElement) ? source.videoHeight : source.height;
|
|
719
|
-
const canvas = new OffscreenCanvas(width, height);
|
|
720
|
-
canvas.width = source.width;
|
|
721
|
-
canvas.height = source.height;
|
|
722
|
-
const ctx = canvas.getContext("2d");
|
|
723
|
-
ctx.drawImage(source, 0, 0, source.width, source.height);
|
|
724
|
-
const bitmap = await createImageBitmap(canvas);
|
|
725
|
-
return postMessage(
|
|
726
|
-
worker,
|
|
727
|
-
{ name: WorkerMessageType.PAGImage_fromSource, args: [bitmap] },
|
|
728
|
-
(key) => new exports.WorkerPAGImage(worker, key),
|
|
729
|
-
[bitmap]
|
|
730
|
-
);
|
|
731
|
-
}
|
|
732
|
-
destroy() {
|
|
733
|
-
return postMessage(this.worker, { name: WorkerMessageType.PAGImage_destroy, args: [this.key] }, () => {
|
|
734
|
-
this.isDestroyed = true;
|
|
735
|
-
});
|
|
736
|
-
}
|
|
737
|
-
};
|
|
738
|
-
exports.WorkerPAGImage = __decorateClass([
|
|
739
|
-
destroyVerify
|
|
740
|
-
], exports.WorkerPAGImage);
|
|
741
|
-
|
|
742
|
-
const MAX_ACTIVE_WORKER_CONTEXTS = 4;
|
|
743
|
-
const videoReaders = [];
|
|
744
|
-
const createPAGWorker = (pagWorkerOptions = {}) => {
|
|
745
|
-
let scriptUrl = pagWorkerOptions.locateFile ? pagWorkerOptions.locateFile("libpag.js") : "libpag.js";
|
|
746
|
-
const option = {};
|
|
747
|
-
if (pagWorkerOptions.locateFile) {
|
|
748
|
-
option.fileUrl = pagWorkerOptions.locateFile("libpag.wasm");
|
|
749
|
-
}
|
|
750
|
-
const worker = new Worker(scriptUrl, pagWorkerOptions.workerOptions);
|
|
751
|
-
return postMessage(worker, { name: WorkerMessageType.PAGInit, args: [option] }, () => {
|
|
752
|
-
addGlobalWorkerListener(worker);
|
|
753
|
-
return worker;
|
|
754
|
-
});
|
|
755
|
-
};
|
|
756
|
-
const addGlobalWorkerListener = (worker) => {
|
|
757
|
-
const handle = (event) => {
|
|
758
|
-
if (event.data.name.includes(WorkerMessageType.VideoReader_constructor)) {
|
|
759
|
-
const videoReader = new VideoReader(
|
|
760
|
-
...event.data.args
|
|
761
|
-
);
|
|
762
|
-
videoReaders.push(videoReader);
|
|
763
|
-
worker.postMessage({ name: event.data.name, args: [videoReaders.length - 1] });
|
|
764
|
-
return;
|
|
765
|
-
}
|
|
766
|
-
if (event.data.name.includes(WorkerMessageType.VideoReader_prepare)) {
|
|
767
|
-
const [proxyId, targetFrame, playbackRate] = event.data.args;
|
|
768
|
-
videoReaders[proxyId].prepare(targetFrame, playbackRate).then(() => {
|
|
769
|
-
videoReaders[proxyId].generateBitmap().then((bitmap) => {
|
|
770
|
-
worker.postMessage({ name: event.data.name, args: [bitmap] }, [bitmap]);
|
|
771
|
-
});
|
|
772
|
-
});
|
|
773
|
-
}
|
|
774
|
-
if (event.data.name.includes(WorkerMessageType.VideoReader_play)) {
|
|
775
|
-
videoReaders[event.data.args[0]].play().then((res) => {
|
|
776
|
-
worker.postMessage({ name: event.data.name, args: [res] });
|
|
777
|
-
});
|
|
778
|
-
}
|
|
779
|
-
if (event.data.name.includes(WorkerMessageType.VideoReader_pause)) {
|
|
780
|
-
videoReaders[event.data.args[0]].pause();
|
|
781
|
-
}
|
|
782
|
-
if (event.data.name.includes(WorkerMessageType.VideoReader_stop)) {
|
|
783
|
-
videoReaders[event.data.args[0]].stop();
|
|
784
|
-
}
|
|
785
|
-
if (event.data.name.includes(WorkerMessageType.VideoReader_getError)) {
|
|
786
|
-
worker.postMessage({ name: event.data.name, args: [videoReaders[event.data.args[0]].getError()] });
|
|
787
|
-
}
|
|
788
|
-
};
|
|
789
|
-
worker.addEventListener("message", handle);
|
|
790
|
-
};
|
|
791
|
-
|
|
792
|
-
exports.MAX_ACTIVE_WORKER_CONTEXTS = MAX_ACTIVE_WORKER_CONTEXTS;
|
|
793
|
-
exports.createPAGWorker = createPAGWorker;
|
|
794
|
-
//# sourceMappingURL=libpag.worker.cjs.js.map
|