1818 */
1919
2020import {
21- _isValidExplicitDest ,
2221 AbortException ,
2322 AnnotationMode ,
2423 assert ,
@@ -29,7 +28,6 @@ import {
2928 RenderingIntentFlag ,
3029 setVerbosityLevel ,
3130 shadow ,
32- stringToBytes ,
3331 unreachable ,
3432 warn ,
3533} from "../shared/util.js" ;
@@ -47,6 +45,13 @@ import {
4745 StatTimer ,
4846} from "./display_utils.js" ;
4947import { FontFaceObject , FontLoader } from "./font_loader.js" ;
48+ import {
49+ getDataProp ,
50+ getFactoryUrlProp ,
51+ getUrlProp ,
52+ isRefProxy ,
53+ LoopbackPort ,
54+ } from "./api_utils.js" ;
5055import { MessageHandler , wrapReason } from "../shared/message_handler.js" ;
5156import {
5257 NodeCanvasFactory ,
@@ -71,7 +76,6 @@ import { PDFNodeStream } from "display-node_stream";
7176import { TextLayer } from "./text_layer.js" ;
7277import { XfaText } from "./xfa_text.js" ;
7378
74- const DEFAULT_RANGE_CHUNK_SIZE = 65536 ; // 2^16 = 65536
7579const RENDERING_CANCELLED_TIMEOUT = 100 ; // ms
7680
7781/**
@@ -111,7 +115,7 @@ const RENDERING_CANCELLED_TIMEOUT = 100; // ms
111115 * @property {PDFDataRangeTransport } [range] - Allows for using a custom range
112116 * transport implementation.
113117 * @property {number } [rangeChunkSize] - Specify maximum number of bytes fetched
114- * per range request. The default value is { @link DEFAULT_RANGE_CHUNK_SIZE} .
118+ * per range request. The default value is 65536 (= 2^16) .
115119 * @property {PDFWorker } [worker] - The worker that will be used for loading and
116120 * parsing the PDF data.
117121 * @property {number } [verbosity] - Controls the logging level; the constants
@@ -255,7 +259,7 @@ function getDocument(src = {}) {
255259 const rangeChunkSize =
256260 Number . isInteger ( src . rangeChunkSize ) && src . rangeChunkSize > 0
257261 ? src . rangeChunkSize
258- : DEFAULT_RANGE_CHUNK_SIZE ;
262+ : 2 ** 16 ;
259263 let worker = src . worker instanceof PDFWorker ? src . worker : null ;
260264 const verbosity = src . verbosity ;
261265 // Ignore "data:"-URLs, since they can't be used to recover valid absolute
@@ -507,94 +511,6 @@ function getDocument(src = {}) {
507511 return task ;
508512}
509513
510- function getUrlProp ( val ) {
511- if ( typeof PDFJSDev !== "undefined" && PDFJSDev . test ( "MOZCENTRAL" ) ) {
512- return null ; // The 'url' is unused with `PDFDataRangeTransport`.
513- }
514- if ( val instanceof URL ) {
515- return val . href ;
516- }
517- if ( typeof val === "string" ) {
518- if (
519- typeof PDFJSDev !== "undefined" &&
520- PDFJSDev . test ( "GENERIC" ) &&
521- isNodeJS
522- ) {
523- return val ; // Use the url as-is in Node.js environments.
524- }
525-
526- // The full path is required in the 'url' field.
527- const url = URL . parse ( val , window . location ) ;
528- if ( url ) {
529- return url . href ;
530- }
531- }
532- throw new Error (
533- "Invalid PDF url data: " +
534- "either string or URL-object is expected in the url property."
535- ) ;
536- }
537-
538- function getDataProp ( val ) {
539- // Converting string or array-like data to Uint8Array.
540- if (
541- typeof PDFJSDev !== "undefined" &&
542- PDFJSDev . test ( "GENERIC" ) &&
543- isNodeJS &&
544- typeof Buffer !== "undefined" && // eslint-disable-line no-undef
545- val instanceof Buffer // eslint-disable-line no-undef
546- ) {
547- throw new Error (
548- "Please provide binary data as `Uint8Array`, rather than `Buffer`."
549- ) ;
550- }
551- if ( val instanceof Uint8Array && val . byteLength === val . buffer . byteLength ) {
552- // Use the data as-is when it's already a Uint8Array that completely
553- // "utilizes" its underlying ArrayBuffer, to prevent any possible
554- // issues when transferring it to the worker-thread.
555- return val ;
556- }
557- if ( typeof val === "string" ) {
558- return stringToBytes ( val ) ;
559- }
560- if (
561- val instanceof ArrayBuffer ||
562- ArrayBuffer . isView ( val ) ||
563- ( typeof val === "object" && ! isNaN ( val ?. length ) )
564- ) {
565- return new Uint8Array ( val ) ;
566- }
567- throw new Error (
568- "Invalid PDF binary data: either TypedArray, " +
569- "string, or array-like object is expected in the data property."
570- ) ;
571- }
572-
573- function getFactoryUrlProp ( val ) {
574- if ( typeof val !== "string" ) {
575- return null ;
576- }
577- if ( val . endsWith ( "/" ) ) {
578- return val ;
579- }
580- throw new Error ( `Invalid factory url: "${ val } " must include trailing slash.` ) ;
581- }
582-
583- const isRefProxy = v =>
584- typeof v === "object" &&
585- Number . isInteger ( v ?. num ) &&
586- v . num >= 0 &&
587- Number . isInteger ( v ?. gen ) &&
588- v . gen >= 0 ;
589-
590- const isNameProxy = v => typeof v === "object" && typeof v ?. name === "string" ;
591-
592- const isValidExplicitDest = _isValidExplicitDest . bind (
593- null ,
594- /* validRef = */ isRefProxy ,
595- /* validName = */ isNameProxy
596- ) ;
597-
598514/**
599515 * @typedef {Object } OnProgressParameters
600516 * @property {number } loaded - Currently loaded number of bytes.
@@ -2012,54 +1928,6 @@ class PDFPageProxy {
20121928 }
20131929}
20141930
2015- class LoopbackPort {
2016- #listeners = new Map ( ) ;
2017-
2018- #deferred = Promise . resolve ( ) ;
2019-
2020- postMessage ( obj , transfer ) {
2021- const event = {
2022- data : structuredClone ( obj , transfer ? { transfer } : null ) ,
2023- } ;
2024-
2025- this . #deferred. then ( ( ) => {
2026- for ( const [ listener ] of this . #listeners) {
2027- listener . call ( this , event ) ;
2028- }
2029- } ) ;
2030- }
2031-
2032- addEventListener ( name , listener , options = null ) {
2033- let rmAbort = null ;
2034- if ( options ?. signal instanceof AbortSignal ) {
2035- const { signal } = options ;
2036- if ( signal . aborted ) {
2037- warn ( "LoopbackPort - cannot use an `aborted` signal." ) ;
2038- return ;
2039- }
2040- const onAbort = ( ) => this . removeEventListener ( name , listener ) ;
2041- rmAbort = ( ) => signal . removeEventListener ( "abort" , onAbort ) ;
2042-
2043- signal . addEventListener ( "abort" , onAbort ) ;
2044- }
2045- this . #listeners. set ( listener , rmAbort ) ;
2046- }
2047-
2048- removeEventListener ( name , listener ) {
2049- const rmAbort = this . #listeners. get ( listener ) ;
2050- rmAbort ?. ( ) ;
2051-
2052- this . #listeners. delete ( listener ) ;
2053- }
2054-
2055- terminate ( ) {
2056- for ( const [ , rmAbort ] of this . #listeners) {
2057- rmAbort ?. ( ) ;
2058- }
2059- this . #listeners. clear ( ) ;
2060- }
2061- }
2062-
20631931/**
20641932 * @typedef {Object } PDFWorkerParameters
20651933 * @property {string } [name] - The name of the worker.
@@ -3511,8 +3379,6 @@ const build =
35113379export {
35123380 build ,
35133381 getDocument ,
3514- isValidExplicitDest ,
3515- LoopbackPort ,
35163382 PDFDataRangeTransport ,
35173383 PDFDocumentLoadingTask ,
35183384 PDFDocumentProxy ,
0 commit comments