@vaadin-component-factory/vcf-pdf-viewer 3.1.0 → 3.2.0
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/package.json +22 -16
- package/pdfjs/dist/event_utils.js +207 -0
- package/pdfjs/dist/genericl10n.js +2395 -0
- package/pdfjs/dist/message_handler.js +325 -190
- package/pdfjs/dist/node_stream.js +2 -494
- package/pdfjs/dist/node_stream2.js +1754 -0
- package/pdfjs/dist/pdf.js +19294 -11168
- package/pdfjs/dist/pdf.worker.js +23 -0
- package/pdfjs/dist/pdf_link_service.js +222 -378
- package/pdfjs/dist/pdf_rendering_queue.js +61 -62
- package/pdfjs/dist/pdf_thumbnail_viewer.js +214 -399
- package/pdfjs/dist/pdf_viewer.js +3432 -2295
- package/pdfjs/dist/ui_utils.js +209 -480
- package/pdfjs/dist/util.js +382 -568
- package/pdfjs/dist/worker.js +41580 -42492
- package/src/vcf-pdf-viewer.js +157 -19
|
@@ -1,4 +1,244 @@
|
|
|
1
|
-
import { c as assert,
|
|
1
|
+
import { F as FeatureTest, l as ImageKind, c as assert, u as unreachable, t as UnknownErrorException, v as UnexpectedResponseException, P as PasswordException, M as MissingPDFException, m as AbortException } from './util.js';
|
|
2
|
+
|
|
3
|
+
/* Copyright 2014 Opera Software ASA
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*
|
|
18
|
+
* Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.
|
|
19
|
+
* Hashes roughly 100 KB per millisecond on i7 3.4 GHz.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
const SEED = 0xc3d2e1f0;
|
|
23
|
+
// Workaround for missing math precision in JS.
|
|
24
|
+
const MASK_HIGH = 0xffff0000;
|
|
25
|
+
const MASK_LOW = 0xffff;
|
|
26
|
+
class MurmurHash3_64 {
|
|
27
|
+
constructor(seed) {
|
|
28
|
+
this.h1 = seed ? seed & 0xffffffff : SEED;
|
|
29
|
+
this.h2 = seed ? seed & 0xffffffff : SEED;
|
|
30
|
+
}
|
|
31
|
+
update(input) {
|
|
32
|
+
let data, length;
|
|
33
|
+
if (typeof input === "string") {
|
|
34
|
+
data = new Uint8Array(input.length * 2);
|
|
35
|
+
length = 0;
|
|
36
|
+
for (let i = 0, ii = input.length; i < ii; i++) {
|
|
37
|
+
const code = input.charCodeAt(i);
|
|
38
|
+
if (code <= 0xff) {
|
|
39
|
+
data[length++] = code;
|
|
40
|
+
} else {
|
|
41
|
+
data[length++] = code >>> 8;
|
|
42
|
+
data[length++] = code & 0xff;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
} else if (ArrayBuffer.isView(input)) {
|
|
46
|
+
data = input.slice();
|
|
47
|
+
length = data.byteLength;
|
|
48
|
+
} else {
|
|
49
|
+
throw new Error("Invalid data format, must be a string or TypedArray.");
|
|
50
|
+
}
|
|
51
|
+
const blockCounts = length >> 2;
|
|
52
|
+
const tailLength = length - blockCounts * 4;
|
|
53
|
+
// We don't care about endianness here.
|
|
54
|
+
const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);
|
|
55
|
+
let k1 = 0,
|
|
56
|
+
k2 = 0;
|
|
57
|
+
let h1 = this.h1,
|
|
58
|
+
h2 = this.h2;
|
|
59
|
+
const C1 = 0xcc9e2d51,
|
|
60
|
+
C2 = 0x1b873593;
|
|
61
|
+
const C1_LOW = C1 & MASK_LOW,
|
|
62
|
+
C2_LOW = C2 & MASK_LOW;
|
|
63
|
+
for (let i = 0; i < blockCounts; i++) {
|
|
64
|
+
if (i & 1) {
|
|
65
|
+
k1 = dataUint32[i];
|
|
66
|
+
k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
|
|
67
|
+
k1 = k1 << 15 | k1 >>> 17;
|
|
68
|
+
k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
|
|
69
|
+
h1 ^= k1;
|
|
70
|
+
h1 = h1 << 13 | h1 >>> 19;
|
|
71
|
+
h1 = h1 * 5 + 0xe6546b64;
|
|
72
|
+
} else {
|
|
73
|
+
k2 = dataUint32[i];
|
|
74
|
+
k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;
|
|
75
|
+
k2 = k2 << 15 | k2 >>> 17;
|
|
76
|
+
k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;
|
|
77
|
+
h2 ^= k2;
|
|
78
|
+
h2 = h2 << 13 | h2 >>> 19;
|
|
79
|
+
h2 = h2 * 5 + 0xe6546b64;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
k1 = 0;
|
|
83
|
+
switch (tailLength) {
|
|
84
|
+
case 3:
|
|
85
|
+
k1 ^= data[blockCounts * 4 + 2] << 16;
|
|
86
|
+
/* falls through */
|
|
87
|
+
case 2:
|
|
88
|
+
k1 ^= data[blockCounts * 4 + 1] << 8;
|
|
89
|
+
/* falls through */
|
|
90
|
+
case 1:
|
|
91
|
+
k1 ^= data[blockCounts * 4];
|
|
92
|
+
/* falls through */
|
|
93
|
+
|
|
94
|
+
k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
|
|
95
|
+
k1 = k1 << 15 | k1 >>> 17;
|
|
96
|
+
k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
|
|
97
|
+
if (blockCounts & 1) {
|
|
98
|
+
h1 ^= k1;
|
|
99
|
+
} else {
|
|
100
|
+
h2 ^= k1;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
this.h1 = h1;
|
|
104
|
+
this.h2 = h2;
|
|
105
|
+
}
|
|
106
|
+
hexdigest() {
|
|
107
|
+
let h1 = this.h1,
|
|
108
|
+
h2 = this.h2;
|
|
109
|
+
h1 ^= h2 >>> 1;
|
|
110
|
+
h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;
|
|
111
|
+
h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;
|
|
112
|
+
h1 ^= h2 >>> 1;
|
|
113
|
+
h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;
|
|
114
|
+
h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;
|
|
115
|
+
h1 ^= h2 >>> 1;
|
|
116
|
+
return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* Copyright 2022 Mozilla Foundation
|
|
121
|
+
*
|
|
122
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
123
|
+
* you may not use this file except in compliance with the License.
|
|
124
|
+
* You may obtain a copy of the License at
|
|
125
|
+
*
|
|
126
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
127
|
+
*
|
|
128
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
129
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
130
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
131
|
+
* See the License for the specific language governing permissions and
|
|
132
|
+
* limitations under the License.
|
|
133
|
+
*/
|
|
134
|
+
function convertToRGBA(params) {
|
|
135
|
+
switch (params.kind) {
|
|
136
|
+
case ImageKind.GRAYSCALE_1BPP:
|
|
137
|
+
return convertBlackAndWhiteToRGBA(params);
|
|
138
|
+
case ImageKind.RGB_24BPP:
|
|
139
|
+
return convertRGBToRGBA(params);
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
function convertBlackAndWhiteToRGBA({
|
|
144
|
+
src,
|
|
145
|
+
srcPos = 0,
|
|
146
|
+
dest,
|
|
147
|
+
width,
|
|
148
|
+
height,
|
|
149
|
+
nonBlackColor = 0xffffffff,
|
|
150
|
+
inverseDecode = false
|
|
151
|
+
}) {
|
|
152
|
+
const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;
|
|
153
|
+
const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor];
|
|
154
|
+
const widthInSource = width >> 3;
|
|
155
|
+
const widthRemainder = width & 7;
|
|
156
|
+
const srcLength = src.length;
|
|
157
|
+
dest = new Uint32Array(dest.buffer);
|
|
158
|
+
let destPos = 0;
|
|
159
|
+
for (let i = 0; i < height; i++) {
|
|
160
|
+
for (const max = srcPos + widthInSource; srcPos < max; srcPos++) {
|
|
161
|
+
const elem = srcPos < srcLength ? src[srcPos] : 255;
|
|
162
|
+
dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping;
|
|
163
|
+
dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping;
|
|
164
|
+
dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping;
|
|
165
|
+
dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping;
|
|
166
|
+
dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping;
|
|
167
|
+
dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping;
|
|
168
|
+
dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping;
|
|
169
|
+
dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping;
|
|
170
|
+
}
|
|
171
|
+
if (widthRemainder === 0) {
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const elem = srcPos < srcLength ? src[srcPos++] : 255;
|
|
175
|
+
for (let j = 0; j < widthRemainder; j++) {
|
|
176
|
+
dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
srcPos,
|
|
181
|
+
destPos
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function convertRGBToRGBA({
|
|
185
|
+
src,
|
|
186
|
+
srcPos = 0,
|
|
187
|
+
dest,
|
|
188
|
+
destPos = 0,
|
|
189
|
+
width,
|
|
190
|
+
height
|
|
191
|
+
}) {
|
|
192
|
+
let i = 0;
|
|
193
|
+
const len32 = src.length >> 2;
|
|
194
|
+
const src32 = new Uint32Array(src.buffer, srcPos, len32);
|
|
195
|
+
if (FeatureTest.isLittleEndian) {
|
|
196
|
+
// It's a way faster to do the shuffle manually instead of working
|
|
197
|
+
// component by component with some Uint8 arrays.
|
|
198
|
+
for (; i < len32 - 2; i += 3, destPos += 4) {
|
|
199
|
+
const s1 = src32[i]; // R2B1G1R1
|
|
200
|
+
const s2 = src32[i + 1]; // G3R3B2G2
|
|
201
|
+
const s3 = src32[i + 2]; // B4G4R4B3
|
|
202
|
+
|
|
203
|
+
dest[destPos] = s1 | 0xff000000;
|
|
204
|
+
dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000;
|
|
205
|
+
dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000;
|
|
206
|
+
dest[destPos + 3] = s3 >>> 8 | 0xff000000;
|
|
207
|
+
}
|
|
208
|
+
for (let j = i * 4, jj = src.length; j < jj; j += 3) {
|
|
209
|
+
dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000;
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
for (; i < len32 - 2; i += 3, destPos += 4) {
|
|
213
|
+
const s1 = src32[i]; // R1G1B1R2
|
|
214
|
+
const s2 = src32[i + 1]; // G2B2R3G3
|
|
215
|
+
const s3 = src32[i + 2]; // B3R4G4B4
|
|
216
|
+
|
|
217
|
+
dest[destPos] = s1 | 0xff;
|
|
218
|
+
dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff;
|
|
219
|
+
dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff;
|
|
220
|
+
dest[destPos + 3] = s3 << 8 | 0xff;
|
|
221
|
+
}
|
|
222
|
+
for (let j = i * 4, jj = src.length; j < jj; j += 3) {
|
|
223
|
+
dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
srcPos,
|
|
228
|
+
destPos
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
function grayToRGBA(src, dest) {
|
|
232
|
+
if (FeatureTest.isLittleEndian) {
|
|
233
|
+
for (let i = 0, ii = src.length; i < ii; i++) {
|
|
234
|
+
dest[i] = src[i] * 0x10101 | 0xff000000;
|
|
235
|
+
}
|
|
236
|
+
} else {
|
|
237
|
+
for (let i = 0, ii = src.length; i < ii; i++) {
|
|
238
|
+
dest[i] = src[i] * 0x1010100 | 0x000000ff;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
2
242
|
|
|
3
243
|
/* Copyright 2018 Mozilla Foundation
|
|
4
244
|
*
|
|
@@ -30,34 +270,25 @@ const StreamKind = {
|
|
|
30
270
|
PULL_COMPLETE: 7,
|
|
31
271
|
START_COMPLETE: 8
|
|
32
272
|
};
|
|
33
|
-
|
|
34
273
|
function wrapReason(reason) {
|
|
35
|
-
if (typeof
|
|
36
|
-
|
|
37
|
-
} else {
|
|
38
|
-
if (typeof reason !== "object" || reason === null) {
|
|
39
|
-
return reason;
|
|
40
|
-
}
|
|
274
|
+
if (!(reason instanceof Error || typeof reason === "object" && reason !== null)) {
|
|
275
|
+
unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.');
|
|
41
276
|
}
|
|
42
|
-
|
|
43
277
|
switch (reason.name) {
|
|
44
278
|
case "AbortException":
|
|
45
279
|
return new AbortException(reason.message);
|
|
46
|
-
|
|
47
280
|
case "MissingPDFException":
|
|
48
281
|
return new MissingPDFException(reason.message);
|
|
49
|
-
|
|
282
|
+
case "PasswordException":
|
|
283
|
+
return new PasswordException(reason.message, reason.code);
|
|
50
284
|
case "UnexpectedResponseException":
|
|
51
285
|
return new UnexpectedResponseException(reason.message, reason.status);
|
|
52
|
-
|
|
53
286
|
case "UnknownErrorException":
|
|
54
287
|
return new UnknownErrorException(reason.message, reason.details);
|
|
55
|
-
|
|
56
288
|
default:
|
|
57
289
|
return new UnknownErrorException(reason.message, reason.toString());
|
|
58
290
|
}
|
|
59
291
|
}
|
|
60
|
-
|
|
61
292
|
class MessageHandler {
|
|
62
293
|
constructor(sourceName, targetName, comObj) {
|
|
63
294
|
this.sourceName = sourceName;
|
|
@@ -65,35 +296,26 @@ class MessageHandler {
|
|
|
65
296
|
this.comObj = comObj;
|
|
66
297
|
this.callbackId = 1;
|
|
67
298
|
this.streamId = 1;
|
|
68
|
-
this.postMessageTransfers = true;
|
|
69
299
|
this.streamSinks = Object.create(null);
|
|
70
300
|
this.streamControllers = Object.create(null);
|
|
71
301
|
this.callbackCapabilities = Object.create(null);
|
|
72
302
|
this.actionHandler = Object.create(null);
|
|
73
|
-
|
|
74
303
|
this._onComObjOnMessage = event => {
|
|
75
304
|
const data = event.data;
|
|
76
|
-
|
|
77
305
|
if (data.targetName !== this.sourceName) {
|
|
78
306
|
return;
|
|
79
307
|
}
|
|
80
|
-
|
|
81
308
|
if (data.stream) {
|
|
82
|
-
this
|
|
83
|
-
|
|
309
|
+
this.#processStreamMessage(data);
|
|
84
310
|
return;
|
|
85
311
|
}
|
|
86
|
-
|
|
87
312
|
if (data.callback) {
|
|
88
313
|
const callbackId = data.callbackId;
|
|
89
314
|
const capability = this.callbackCapabilities[callbackId];
|
|
90
|
-
|
|
91
315
|
if (!capability) {
|
|
92
316
|
throw new Error(`Cannot resolve callback ${callbackId}`);
|
|
93
317
|
}
|
|
94
|
-
|
|
95
318
|
delete this.callbackCapabilities[callbackId];
|
|
96
|
-
|
|
97
319
|
if (data.callback === CallbackKind.DATA) {
|
|
98
320
|
capability.resolve(data.data);
|
|
99
321
|
} else if (data.callback === CallbackKind.ERROR) {
|
|
@@ -101,16 +323,12 @@ class MessageHandler {
|
|
|
101
323
|
} else {
|
|
102
324
|
throw new Error("Unexpected callback case");
|
|
103
325
|
}
|
|
104
|
-
|
|
105
326
|
return;
|
|
106
327
|
}
|
|
107
|
-
|
|
108
328
|
const action = this.actionHandler[data.action];
|
|
109
|
-
|
|
110
329
|
if (!action) {
|
|
111
330
|
throw new Error(`Unknown action from worker: ${data.action}`);
|
|
112
331
|
}
|
|
113
|
-
|
|
114
332
|
if (data.callbackId) {
|
|
115
333
|
const cbSourceName = this.sourceName;
|
|
116
334
|
const cbTargetName = data.sourceName;
|
|
@@ -135,48 +353,40 @@ class MessageHandler {
|
|
|
135
353
|
});
|
|
136
354
|
return;
|
|
137
355
|
}
|
|
138
|
-
|
|
139
356
|
if (data.streamId) {
|
|
140
|
-
this
|
|
141
|
-
|
|
357
|
+
this.#createStreamSink(data);
|
|
142
358
|
return;
|
|
143
359
|
}
|
|
144
|
-
|
|
145
360
|
action(data.data);
|
|
146
361
|
};
|
|
147
|
-
|
|
148
362
|
comObj.addEventListener("message", this._onComObjOnMessage);
|
|
149
363
|
}
|
|
150
|
-
|
|
151
364
|
on(actionName, handler) {
|
|
152
|
-
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("
|
|
365
|
+
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
|
|
153
366
|
assert(typeof handler === "function", 'MessageHandler.on: Expected "handler" to be a function.');
|
|
154
367
|
}
|
|
155
|
-
|
|
156
368
|
const ah = this.actionHandler;
|
|
157
|
-
|
|
158
369
|
if (ah[actionName]) {
|
|
159
370
|
throw new Error(`There is already an actionName called "${actionName}"`);
|
|
160
371
|
}
|
|
161
|
-
|
|
162
372
|
ah[actionName] = handler;
|
|
163
373
|
}
|
|
374
|
+
|
|
164
375
|
/**
|
|
165
376
|
* Sends a message to the comObj to invoke the action with the supplied data.
|
|
166
377
|
* @param {string} actionName - Action to call.
|
|
167
378
|
* @param {JSON} data - JSON data to send.
|
|
168
379
|
* @param {Array} [transfers] - List of transfers/ArrayBuffers.
|
|
169
380
|
*/
|
|
170
|
-
|
|
171
|
-
|
|
172
381
|
send(actionName, data, transfers) {
|
|
173
|
-
this.
|
|
382
|
+
this.comObj.postMessage({
|
|
174
383
|
sourceName: this.sourceName,
|
|
175
384
|
targetName: this.targetName,
|
|
176
385
|
action: actionName,
|
|
177
386
|
data
|
|
178
387
|
}, transfers);
|
|
179
388
|
}
|
|
389
|
+
|
|
180
390
|
/**
|
|
181
391
|
* Sends a message to the comObj to invoke the action with the supplied data.
|
|
182
392
|
* Expects that the other side will callback with the response.
|
|
@@ -185,15 +395,12 @@ class MessageHandler {
|
|
|
185
395
|
* @param {Array} [transfers] - List of transfers/ArrayBuffers.
|
|
186
396
|
* @returns {Promise} Promise to be resolved with response data.
|
|
187
397
|
*/
|
|
188
|
-
|
|
189
|
-
|
|
190
398
|
sendWithPromise(actionName, data, transfers) {
|
|
191
399
|
const callbackId = this.callbackId++;
|
|
192
|
-
const capability =
|
|
400
|
+
const capability = Promise.withResolvers();
|
|
193
401
|
this.callbackCapabilities[callbackId] = capability;
|
|
194
|
-
|
|
195
402
|
try {
|
|
196
|
-
this.
|
|
403
|
+
this.comObj.postMessage({
|
|
197
404
|
sourceName: this.sourceName,
|
|
198
405
|
targetName: this.targetName,
|
|
199
406
|
action: actionName,
|
|
@@ -203,9 +410,9 @@ class MessageHandler {
|
|
|
203
410
|
} catch (ex) {
|
|
204
411
|
capability.reject(ex);
|
|
205
412
|
}
|
|
206
|
-
|
|
207
413
|
return capability.promise;
|
|
208
414
|
}
|
|
415
|
+
|
|
209
416
|
/**
|
|
210
417
|
* Sends a message to the comObj to invoke the action with the supplied data.
|
|
211
418
|
* Expect that the other side will callback to signal 'start_complete'.
|
|
@@ -216,16 +423,14 @@ class MessageHandler {
|
|
|
216
423
|
* @param {Array} [transfers] - List of transfers/ArrayBuffers.
|
|
217
424
|
* @returns {ReadableStream} ReadableStream to read data in chunks.
|
|
218
425
|
*/
|
|
219
|
-
|
|
220
|
-
|
|
221
426
|
sendWithStream(actionName, data, queueingStrategy, transfers) {
|
|
222
|
-
const streamId = this.streamId
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
427
|
+
const streamId = this.streamId++,
|
|
428
|
+
sourceName = this.sourceName,
|
|
429
|
+
targetName = this.targetName,
|
|
430
|
+
comObj = this.comObj;
|
|
226
431
|
return new ReadableStream({
|
|
227
432
|
start: controller => {
|
|
228
|
-
const startCapability =
|
|
433
|
+
const startCapability = Promise.withResolvers();
|
|
229
434
|
this.streamControllers[streamId] = {
|
|
230
435
|
controller,
|
|
231
436
|
startCall: startCapability,
|
|
@@ -233,21 +438,19 @@ class MessageHandler {
|
|
|
233
438
|
cancelCall: null,
|
|
234
439
|
isClosed: false
|
|
235
440
|
};
|
|
236
|
-
|
|
237
|
-
this._postMessage({
|
|
441
|
+
comObj.postMessage({
|
|
238
442
|
sourceName,
|
|
239
443
|
targetName,
|
|
240
444
|
action: actionName,
|
|
241
445
|
streamId,
|
|
242
446
|
data,
|
|
243
447
|
desiredSize: controller.desiredSize
|
|
244
|
-
}, transfers);
|
|
245
|
-
|
|
246
|
-
|
|
448
|
+
}, transfers);
|
|
449
|
+
// Return Promise for Async process, to signal success/failure.
|
|
247
450
|
return startCapability.promise;
|
|
248
451
|
},
|
|
249
452
|
pull: controller => {
|
|
250
|
-
const pullCapability =
|
|
453
|
+
const pullCapability = Promise.withResolvers();
|
|
251
454
|
this.streamControllers[streamId].pullCall = pullCapability;
|
|
252
455
|
comObj.postMessage({
|
|
253
456
|
sourceName,
|
|
@@ -255,14 +458,14 @@ class MessageHandler {
|
|
|
255
458
|
stream: StreamKind.PULL,
|
|
256
459
|
streamId,
|
|
257
460
|
desiredSize: controller.desiredSize
|
|
258
|
-
});
|
|
461
|
+
});
|
|
462
|
+
// Returning Promise will not call "pull"
|
|
259
463
|
// again until current pull is resolved.
|
|
260
|
-
|
|
261
464
|
return pullCapability.promise;
|
|
262
465
|
},
|
|
263
466
|
cancel: reason => {
|
|
264
467
|
assert(reason instanceof Error, "cancel must have a valid reason");
|
|
265
|
-
const cancelCapability =
|
|
468
|
+
const cancelCapability = Promise.withResolvers();
|
|
266
469
|
this.streamControllers[streamId].cancelCall = cancelCapability;
|
|
267
470
|
this.streamControllers[streamId].isClosed = true;
|
|
268
471
|
comObj.postMessage({
|
|
@@ -271,41 +474,34 @@ class MessageHandler {
|
|
|
271
474
|
stream: StreamKind.CANCEL,
|
|
272
475
|
streamId,
|
|
273
476
|
reason: wrapReason(reason)
|
|
274
|
-
});
|
|
275
|
-
|
|
477
|
+
});
|
|
478
|
+
// Return Promise to signal success or failure.
|
|
276
479
|
return cancelCapability.promise;
|
|
277
480
|
}
|
|
278
481
|
}, queueingStrategy);
|
|
279
482
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
const action = this.actionHandler[data.action];
|
|
288
|
-
const streamId = data.streamId;
|
|
289
|
-
const sourceName = this.sourceName;
|
|
290
|
-
const targetName = data.sourceName;
|
|
291
|
-
const comObj = this.comObj;
|
|
483
|
+
#createStreamSink(data) {
|
|
484
|
+
const streamId = data.streamId,
|
|
485
|
+
sourceName = this.sourceName,
|
|
486
|
+
targetName = data.sourceName,
|
|
487
|
+
comObj = this.comObj;
|
|
488
|
+
const self = this,
|
|
489
|
+
action = this.actionHandler[data.action];
|
|
292
490
|
const streamSink = {
|
|
293
491
|
enqueue(chunk, size = 1, transfers) {
|
|
294
492
|
if (this.isCancelled) {
|
|
295
493
|
return;
|
|
296
494
|
}
|
|
297
|
-
|
|
298
495
|
const lastDesiredSize = this.desiredSize;
|
|
299
|
-
this.desiredSize -= size;
|
|
496
|
+
this.desiredSize -= size;
|
|
497
|
+
// Enqueue decreases the desiredSize property of sink,
|
|
300
498
|
// so when it changes from positive to negative,
|
|
301
499
|
// set ready as unresolved promise.
|
|
302
|
-
|
|
303
500
|
if (lastDesiredSize > 0 && this.desiredSize <= 0) {
|
|
304
|
-
this.sinkCapability =
|
|
501
|
+
this.sinkCapability = Promise.withResolvers();
|
|
305
502
|
this.ready = this.sinkCapability.promise;
|
|
306
503
|
}
|
|
307
|
-
|
|
308
|
-
self._postMessage({
|
|
504
|
+
comObj.postMessage({
|
|
309
505
|
sourceName,
|
|
310
506
|
targetName,
|
|
311
507
|
stream: StreamKind.ENQUEUE,
|
|
@@ -313,12 +509,10 @@ class MessageHandler {
|
|
|
313
509
|
chunk
|
|
314
510
|
}, transfers);
|
|
315
511
|
},
|
|
316
|
-
|
|
317
512
|
close() {
|
|
318
513
|
if (this.isCancelled) {
|
|
319
514
|
return;
|
|
320
515
|
}
|
|
321
|
-
|
|
322
516
|
this.isCancelled = true;
|
|
323
517
|
comObj.postMessage({
|
|
324
518
|
sourceName,
|
|
@@ -328,14 +522,11 @@ class MessageHandler {
|
|
|
328
522
|
});
|
|
329
523
|
delete self.streamSinks[streamId];
|
|
330
524
|
},
|
|
331
|
-
|
|
332
525
|
error(reason) {
|
|
333
526
|
assert(reason instanceof Error, "error must have a valid reason");
|
|
334
|
-
|
|
335
527
|
if (this.isCancelled) {
|
|
336
528
|
return;
|
|
337
529
|
}
|
|
338
|
-
|
|
339
530
|
this.isCancelled = true;
|
|
340
531
|
comObj.postMessage({
|
|
341
532
|
sourceName,
|
|
@@ -345,8 +536,7 @@ class MessageHandler {
|
|
|
345
536
|
reason: wrapReason(reason)
|
|
346
537
|
});
|
|
347
538
|
},
|
|
348
|
-
|
|
349
|
-
sinkCapability: createPromiseCapability(),
|
|
539
|
+
sinkCapability: Promise.withResolvers(),
|
|
350
540
|
onPull: null,
|
|
351
541
|
onCancel: null,
|
|
352
542
|
isCancelled: false,
|
|
@@ -376,39 +566,31 @@ class MessageHandler {
|
|
|
376
566
|
});
|
|
377
567
|
});
|
|
378
568
|
}
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
const sourceName = this.sourceName;
|
|
387
|
-
const targetName = data.sourceName;
|
|
388
|
-
const comObj = this.comObj;
|
|
389
|
-
|
|
569
|
+
#processStreamMessage(data) {
|
|
570
|
+
const streamId = data.streamId,
|
|
571
|
+
sourceName = this.sourceName,
|
|
572
|
+
targetName = data.sourceName,
|
|
573
|
+
comObj = this.comObj;
|
|
574
|
+
const streamController = this.streamControllers[streamId],
|
|
575
|
+
streamSink = this.streamSinks[streamId];
|
|
390
576
|
switch (data.stream) {
|
|
391
577
|
case StreamKind.START_COMPLETE:
|
|
392
578
|
if (data.success) {
|
|
393
|
-
|
|
579
|
+
streamController.startCall.resolve();
|
|
394
580
|
} else {
|
|
395
|
-
|
|
581
|
+
streamController.startCall.reject(wrapReason(data.reason));
|
|
396
582
|
}
|
|
397
|
-
|
|
398
583
|
break;
|
|
399
|
-
|
|
400
584
|
case StreamKind.PULL_COMPLETE:
|
|
401
585
|
if (data.success) {
|
|
402
|
-
|
|
586
|
+
streamController.pullCall.resolve();
|
|
403
587
|
} else {
|
|
404
|
-
|
|
588
|
+
streamController.pullCall.reject(wrapReason(data.reason));
|
|
405
589
|
}
|
|
406
|
-
|
|
407
590
|
break;
|
|
408
|
-
|
|
409
591
|
case StreamKind.PULL:
|
|
410
592
|
// Ignore any pull after close is called.
|
|
411
|
-
if (!
|
|
593
|
+
if (!streamSink) {
|
|
412
594
|
comObj.postMessage({
|
|
413
595
|
sourceName,
|
|
414
596
|
targetName,
|
|
@@ -417,22 +599,17 @@ class MessageHandler {
|
|
|
417
599
|
success: true
|
|
418
600
|
});
|
|
419
601
|
break;
|
|
420
|
-
}
|
|
421
|
-
// so when it changes
|
|
422
|
-
// set ready property as resolved promise.
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
this.streamSinks[streamId].desiredSize = data.desiredSize;
|
|
431
|
-
const {
|
|
432
|
-
onPull
|
|
433
|
-
} = this.streamSinks[data.streamId];
|
|
602
|
+
}
|
|
603
|
+
// Pull increases the desiredSize property of sink, so when it changes
|
|
604
|
+
// from negative to positive, set ready property as resolved promise.
|
|
605
|
+
if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {
|
|
606
|
+
streamSink.sinkCapability.resolve();
|
|
607
|
+
}
|
|
608
|
+
// Reset desiredSize property of sink on every pull.
|
|
609
|
+
streamSink.desiredSize = data.desiredSize;
|
|
434
610
|
new Promise(function (resolve) {
|
|
435
|
-
|
|
611
|
+
var _streamSink$onPull;
|
|
612
|
+
resolve((_streamSink$onPull = streamSink.onPull) === null || _streamSink$onPull === void 0 ? void 0 : _streamSink$onPull.call(streamSink));
|
|
436
613
|
}).then(function () {
|
|
437
614
|
comObj.postMessage({
|
|
438
615
|
sourceName,
|
|
@@ -451,60 +628,42 @@ class MessageHandler {
|
|
|
451
628
|
});
|
|
452
629
|
});
|
|
453
630
|
break;
|
|
454
|
-
|
|
455
631
|
case StreamKind.ENQUEUE:
|
|
456
|
-
assert(
|
|
457
|
-
|
|
458
|
-
if (this.streamControllers[streamId].isClosed) {
|
|
632
|
+
assert(streamController, "enqueue should have stream controller");
|
|
633
|
+
if (streamController.isClosed) {
|
|
459
634
|
break;
|
|
460
635
|
}
|
|
461
|
-
|
|
462
|
-
this.streamControllers[streamId].controller.enqueue(data.chunk);
|
|
636
|
+
streamController.controller.enqueue(data.chunk);
|
|
463
637
|
break;
|
|
464
|
-
|
|
465
638
|
case StreamKind.CLOSE:
|
|
466
|
-
assert(
|
|
467
|
-
|
|
468
|
-
if (this.streamControllers[streamId].isClosed) {
|
|
639
|
+
assert(streamController, "close should have stream controller");
|
|
640
|
+
if (streamController.isClosed) {
|
|
469
641
|
break;
|
|
470
642
|
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
this
|
|
474
|
-
|
|
475
|
-
this._deleteStreamController(streamId);
|
|
476
|
-
|
|
643
|
+
streamController.isClosed = true;
|
|
644
|
+
streamController.controller.close();
|
|
645
|
+
this.#deleteStreamController(streamController, streamId);
|
|
477
646
|
break;
|
|
478
|
-
|
|
479
647
|
case StreamKind.ERROR:
|
|
480
|
-
assert(
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
this._deleteStreamController(streamId);
|
|
484
|
-
|
|
648
|
+
assert(streamController, "error should have stream controller");
|
|
649
|
+
streamController.controller.error(wrapReason(data.reason));
|
|
650
|
+
this.#deleteStreamController(streamController, streamId);
|
|
485
651
|
break;
|
|
486
|
-
|
|
487
652
|
case StreamKind.CANCEL_COMPLETE:
|
|
488
653
|
if (data.success) {
|
|
489
|
-
|
|
654
|
+
streamController.cancelCall.resolve();
|
|
490
655
|
} else {
|
|
491
|
-
|
|
656
|
+
streamController.cancelCall.reject(wrapReason(data.reason));
|
|
492
657
|
}
|
|
493
|
-
|
|
494
|
-
this._deleteStreamController(streamId);
|
|
495
|
-
|
|
658
|
+
this.#deleteStreamController(streamController, streamId);
|
|
496
659
|
break;
|
|
497
|
-
|
|
498
660
|
case StreamKind.CANCEL:
|
|
499
|
-
if (!
|
|
661
|
+
if (!streamSink) {
|
|
500
662
|
break;
|
|
501
663
|
}
|
|
502
|
-
|
|
503
|
-
const {
|
|
504
|
-
onCancel
|
|
505
|
-
} = this.streamSinks[data.streamId];
|
|
506
664
|
new Promise(function (resolve) {
|
|
507
|
-
|
|
665
|
+
var _streamSink$onCancel;
|
|
666
|
+
resolve((_streamSink$onCancel = streamSink.onCancel) === null || _streamSink$onCancel === void 0 ? void 0 : _streamSink$onCancel.call(streamSink, wrapReason(data.reason)));
|
|
508
667
|
}).then(function () {
|
|
509
668
|
comObj.postMessage({
|
|
510
669
|
sourceName,
|
|
@@ -522,48 +681,24 @@ class MessageHandler {
|
|
|
522
681
|
reason: wrapReason(reason)
|
|
523
682
|
});
|
|
524
683
|
});
|
|
525
|
-
|
|
526
|
-
|
|
684
|
+
streamSink.sinkCapability.reject(wrapReason(data.reason));
|
|
685
|
+
streamSink.isCancelled = true;
|
|
527
686
|
delete this.streamSinks[streamId];
|
|
528
687
|
break;
|
|
529
|
-
|
|
530
688
|
default:
|
|
531
689
|
throw new Error("Unexpected stream case");
|
|
532
690
|
}
|
|
533
691
|
}
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
*/
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
async _deleteStreamController(streamId) {
|
|
692
|
+
async #deleteStreamController(streamController, streamId) {
|
|
693
|
+
var _streamController$sta, _streamController$pul, _streamController$can;
|
|
540
694
|
// Delete the `streamController` only when the start, pull, and cancel
|
|
541
695
|
// capabilities have settled, to prevent `TypeError`s.
|
|
542
|
-
await Promise.allSettled([
|
|
543
|
-
return capability && capability.promise;
|
|
544
|
-
}));
|
|
696
|
+
await Promise.allSettled([(_streamController$sta = streamController.startCall) === null || _streamController$sta === void 0 ? void 0 : _streamController$sta.promise, (_streamController$pul = streamController.pullCall) === null || _streamController$pul === void 0 ? void 0 : _streamController$pul.promise, (_streamController$can = streamController.cancelCall) === null || _streamController$can === void 0 ? void 0 : _streamController$can.promise]);
|
|
545
697
|
delete this.streamControllers[streamId];
|
|
546
698
|
}
|
|
547
|
-
/**
|
|
548
|
-
* Sends raw message to the comObj.
|
|
549
|
-
* @param {Object} message - Raw message.
|
|
550
|
-
* @param transfers List of transfers/ArrayBuffers, or undefined.
|
|
551
|
-
* @private
|
|
552
|
-
*/
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
_postMessage(message, transfers) {
|
|
556
|
-
if (transfers && this.postMessageTransfers) {
|
|
557
|
-
this.comObj.postMessage(message, transfers);
|
|
558
|
-
} else {
|
|
559
|
-
this.comObj.postMessage(message);
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
|
|
563
699
|
destroy() {
|
|
564
700
|
this.comObj.removeEventListener("message", this._onComObjOnMessage);
|
|
565
701
|
}
|
|
566
|
-
|
|
567
702
|
}
|
|
568
703
|
|
|
569
|
-
export {
|
|
704
|
+
export { MurmurHash3_64 as M, MessageHandler as a, convertToRGBA as b, convertBlackAndWhiteToRGBA as c, grayToRGBA as g };
|