diff --git a/services/web/frontend/js/features/pdf-preview/util/output-files.js b/services/web/frontend/js/features/pdf-preview/util/output-files.js index 9d2bd7e879..0e261b272f 100644 --- a/services/web/frontend/js/features/pdf-preview/util/output-files.js +++ b/services/web/frontend/js/features/pdf-preview/util/output-files.js @@ -3,6 +3,7 @@ import BibLogParser from '../../../ide/log-parser/bib-log-parser' import { enablePdfCaching } from './pdf-caching-flags' import { debugConsole } from '@/utils/debugging' import { dirname, findEntityByPath } from '@/features/file-tree/util/path' +import '@/utils/readable-stream-async-iterator-polyfill' // Warnings that may disappear after a second LaTeX pass const TRANSIENT_WARNING_REGEX = /^(Reference|Citation).+undefined on input line/ diff --git a/services/web/frontend/js/utils/readable-stream-async-iterator-polyfill.ts b/services/web/frontend/js/utils/readable-stream-async-iterator-polyfill.ts new file mode 100644 index 0000000000..4f2e6d4528 --- /dev/null +++ b/services/web/frontend/js/utils/readable-stream-async-iterator-polyfill.ts @@ -0,0 +1,44 @@ +// @ts-nocheck +/** + * A polyfill for `ReadableStream.protototype[Symbol.asyncIterator]`, + * aligning as closely as possible to the specification. + * + * from https://gist.github.com/MattiasBuelens/496fc1d37adb50a733edd43853f2f60e + * + * @see https://streams.spec.whatwg.org/#rs-asynciterator + * @see https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream#async_iteration + */ + +ReadableStream.prototype.values ??= function ({ preventCancel = false } = {}) { + const reader = this.getReader() + return { + async next() { + try { + const result = await reader.read() + if (result.done) { + reader.releaseLock() + } + return result + } catch (e) { + reader.releaseLock() + throw e + } + }, + async return(value) { + if (!preventCancel) { + const cancelPromise = reader.cancel(value) + reader.releaseLock() + await cancelPromise + } else { + reader.releaseLock() + } + return { done: true, value } + }, + [Symbol.asyncIterator]() { + return this + }, + } +} + +ReadableStream.prototype[Symbol.asyncIterator] ??= + ReadableStream.prototype.values