File tree Expand file tree Collapse file tree
Open diff view settings
Expand file tree Collapse file tree
Open diff view settings
Original file line number Diff line number Diff line change @@ -53,4 +53,65 @@ if (typeof Uint8Array.prototype.toHex === 'undefined') {
5353 } )
5454}
5555
56+ // `ReadableStream` async iteration is used by PDF.js v5.6+ in `getTextContent`
57+ // and `decompressSignature`. Not yet supported in Safari (all versions).
58+ if (
59+ typeof ReadableStream !== 'undefined'
60+ && typeof ReadableStream . prototype [ Symbol . asyncIterator ] === 'undefined'
61+ ) {
62+ const asyncIterator = function ( { preventCancel = false } = { } ) {
63+ const reader = this . getReader ( )
64+ let isFinished = false
65+ let ongoing = Promise . resolve ( )
66+ const next = ( ) => {
67+ if ( isFinished )
68+ return Promise . resolve ( { value : undefined , done : true } )
69+ return reader . read ( ) . then (
70+ ( result ) => {
71+ if ( result . done ) {
72+ isFinished = true
73+ reader . releaseLock ( )
74+ }
75+ return result
76+ } ,
77+ ( error ) => {
78+ isFinished = true
79+ reader . releaseLock ( )
80+ throw error
81+ } ,
82+ )
83+ }
84+ const doReturn = ( value ) => {
85+ if ( isFinished )
86+ return Promise . resolve ( { value, done : true } )
87+ isFinished = true
88+ if ( preventCancel ) {
89+ reader . releaseLock ( )
90+ return Promise . resolve ( { value, done : true } )
91+ }
92+ const cancelPromise = reader . cancel ( value )
93+ reader . releaseLock ( )
94+ return cancelPromise . then ( ( ) => ( { value, done : true } ) )
95+ }
96+ return {
97+ next ( ) {
98+ return ( ongoing = ongoing . then ( next , next ) )
99+ } ,
100+ return ( value ) {
101+ return ( ongoing = ongoing . then ( ( ) => doReturn ( value ) , ( ) => doReturn ( value ) ) )
102+ } ,
103+ [ Symbol . asyncIterator ] ( ) {
104+ return this
105+ } ,
106+ }
107+ }
108+ for ( const key of [ Symbol . asyncIterator , 'values' ] ) {
109+ Object . defineProperty ( ReadableStream . prototype , key , {
110+ value : asyncIterator ,
111+ writable : true ,
112+ configurable : true ,
113+ } )
114+ }
115+ }
116+
56117export const polyfills = true
You can’t perform that action at this time.
0 commit comments