summaryrefslogtreecommitdiffstats
path: root/remote/test/puppeteer/packages/puppeteer-core/src/common/util.ts
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:14:29 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:14:29 +0000
commitfbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8 (patch)
tree4c1ccaf5486d4f2009f9a338a98a83e886e29c97 /remote/test/puppeteer/packages/puppeteer-core/src/common/util.ts
parentReleasing progress-linux version 124.0.1-1~progress7.99u1. (diff)
downloadfirefox-fbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8.tar.xz
firefox-fbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8.zip
Merging upstream version 125.0.1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'remote/test/puppeteer/packages/puppeteer-core/src/common/util.ts')
-rw-r--r--remote/test/puppeteer/packages/puppeteer-core/src/common/util.ts113
1 files changed, 74 insertions, 39 deletions
diff --git a/remote/test/puppeteer/packages/puppeteer-core/src/common/util.ts b/remote/test/puppeteer/packages/puppeteer-core/src/common/util.ts
index 2c8f76f664..f84453c612 100644
--- a/remote/test/puppeteer/packages/puppeteer-core/src/common/util.ts
+++ b/remote/test/puppeteer/packages/puppeteer-core/src/common/util.ts
@@ -5,13 +5,19 @@
*/
import type FS from 'fs/promises';
-import type {Readable} from 'stream';
-import {map, NEVER, Observable, timer} from '../../third_party/rxjs/rxjs.js';
+import type {OperatorFunction} from '../../third_party/rxjs/rxjs.js';
+import {
+ filter,
+ from,
+ map,
+ mergeMap,
+ NEVER,
+ Observable,
+ timer,
+} from '../../third_party/rxjs/rxjs.js';
import type {CDPSession} from '../api/CDPSession.js';
-import {isNode} from '../environment.js';
import {assert} from '../util/assert.js';
-import {isErrorLike} from '../util/ErrorLike.js';
import {debug} from './Debug.js';
import {TimeoutError} from './Errors.js';
@@ -209,29 +215,39 @@ export async function importFSPromises(): Promise<typeof FS> {
* @internal
*/
export async function getReadableAsBuffer(
- readable: Readable,
+ readable: ReadableStream<Uint8Array>,
path?: string
): Promise<Buffer | null> {
- const buffers = [];
+ const buffers: Uint8Array[] = [];
+ const reader = readable.getReader();
if (path) {
const fs = await importFSPromises();
const fileHandle = await fs.open(path, 'w+');
try {
- for await (const chunk of readable) {
- buffers.push(chunk);
- await fileHandle.writeFile(chunk);
+ while (true) {
+ const {done, value} = await reader.read();
+ if (done) {
+ break;
+ }
+ buffers.push(value);
+ await fileHandle.writeFile(value);
}
} finally {
await fileHandle.close();
}
} else {
- for await (const chunk of readable) {
- buffers.push(chunk);
+ while (true) {
+ const {done, value} = await reader.read();
+ if (done) {
+ break;
+ }
+ buffers.push(value);
}
}
try {
return Buffer.concat(buffers);
} catch (error) {
+ debugError(error);
return null;
}
}
@@ -239,39 +255,34 @@ export async function getReadableAsBuffer(
/**
* @internal
*/
+
+/**
+ * @internal
+ */
export async function getReadableFromProtocolStream(
client: CDPSession,
handle: string
-): Promise<Readable> {
- // TODO: Once Node 18 becomes the lowest supported version, we can migrate to
- // ReadableStream.
- if (!isNode) {
- throw new Error('Cannot create a stream outside of Node.js environment.');
- }
+): Promise<ReadableStream<Uint8Array>> {
+ return new ReadableStream({
+ async pull(controller) {
+ function getUnit8Array(data: string, isBase64: boolean): Uint8Array {
+ if (isBase64) {
+ return Uint8Array.from(atob(data), m => {
+ return m.codePointAt(0)!;
+ });
+ }
+ const encoder = new TextEncoder();
+ return encoder.encode(data);
+ }
- const {Readable} = await import('stream');
+ const {data, base64Encoded, eof} = await client.send('IO.read', {
+ handle,
+ });
- let eof = false;
- return new Readable({
- async read(size: number) {
+ controller.enqueue(getUnit8Array(data, base64Encoded ?? false));
if (eof) {
- return;
- }
-
- try {
- const response = await client.send('IO.read', {handle, size});
- this.push(response.data, response.base64Encoded ? 'base64' : undefined);
- if (response.eof) {
- eof = true;
- await client.send('IO.close', {handle});
- this.push(null);
- }
- } catch (error) {
- if (isErrorLike(error)) {
- this.destroy(error);
- return;
- }
- throw error;
+ await client.send('IO.close', {handle});
+ controller.close();
}
},
});
@@ -349,7 +360,8 @@ export function parsePDFOptions(
pageRanges: '',
preferCSSPageSize: false,
omitBackground: false,
- tagged: false,
+ outline: false,
+ tagged: true,
};
let width = 8.5;
@@ -375,6 +387,11 @@ export function parsePDFOptions(
convertPrintParameterToInches(options.margin?.right, lengthUnit) || 0,
};
+ // Quirk https://bugs.chromium.org/p/chromium/issues/detail?id=840455#c44
+ if (options.outline) {
+ options.tagged = true;
+ }
+
return {
...defaults,
...options,
@@ -445,3 +462,21 @@ export function fromEmitterEvent<
};
});
}
+
+/**
+ * @internal
+ */
+export function filterAsync<T>(
+ predicate: (value: T) => boolean | PromiseLike<boolean>
+): OperatorFunction<T, T> {
+ return mergeMap<T, Observable<T>>((value): Observable<T> => {
+ return from(Promise.resolve(predicate(value))).pipe(
+ filter(isMatch => {
+ return isMatch;
+ }),
+ map(() => {
+ return value;
+ })
+ );
+ });
+}