18
18
*/
19
19
20
20
import {
21
- _isValidExplicitDest ,
22
21
AbortException ,
23
22
AnnotationMode ,
24
23
assert ,
@@ -29,7 +28,6 @@ import {
29
28
RenderingIntentFlag ,
30
29
setVerbosityLevel ,
31
30
shadow ,
32
- stringToBytes ,
33
31
unreachable ,
34
32
warn ,
35
33
} from "../shared/util.js" ;
@@ -47,6 +45,13 @@ import {
47
45
StatTimer ,
48
46
} from "./display_utils.js" ;
49
47
import { FontFaceObject , FontLoader } from "./font_loader.js" ;
48
+ import {
49
+ getDataProp ,
50
+ getFactoryUrlProp ,
51
+ getUrlProp ,
52
+ isRefProxy ,
53
+ LoopbackPort ,
54
+ } from "./api_utils.js" ;
50
55
import { MessageHandler , wrapReason } from "../shared/message_handler.js" ;
51
56
import {
52
57
NodeCanvasFactory ,
@@ -71,7 +76,6 @@ import { PDFNodeStream } from "display-node_stream";
71
76
import { TextLayer } from "./text_layer.js" ;
72
77
import { XfaText } from "./xfa_text.js" ;
73
78
74
- const DEFAULT_RANGE_CHUNK_SIZE = 65536 ; // 2^16 = 65536
75
79
const RENDERING_CANCELLED_TIMEOUT = 100 ; // ms
76
80
77
81
/**
@@ -111,7 +115,7 @@ const RENDERING_CANCELLED_TIMEOUT = 100; // ms
111
115
* @property {PDFDataRangeTransport } [range] - Allows for using a custom range
112
116
* transport implementation.
113
117
* @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) .
115
119
* @property {PDFWorker } [worker] - The worker that will be used for loading and
116
120
* parsing the PDF data.
117
121
* @property {number } [verbosity] - Controls the logging level; the constants
@@ -255,7 +259,7 @@ function getDocument(src = {}) {
255
259
const rangeChunkSize =
256
260
Number . isInteger ( src . rangeChunkSize ) && src . rangeChunkSize > 0
257
261
? src . rangeChunkSize
258
- : DEFAULT_RANGE_CHUNK_SIZE ;
262
+ : 2 ** 16 ;
259
263
let worker = src . worker instanceof PDFWorker ? src . worker : null ;
260
264
const verbosity = src . verbosity ;
261
265
// Ignore "data:"-URLs, since they can't be used to recover valid absolute
@@ -507,94 +511,6 @@ function getDocument(src = {}) {
507
511
return task ;
508
512
}
509
513
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
-
598
514
/**
599
515
* @typedef {Object } OnProgressParameters
600
516
* @property {number } loaded - Currently loaded number of bytes.
@@ -2012,54 +1928,6 @@ class PDFPageProxy {
2012
1928
}
2013
1929
}
2014
1930
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
-
2063
1931
/**
2064
1932
* @typedef {Object } PDFWorkerParameters
2065
1933
* @property {string } [name] - The name of the worker.
@@ -3511,8 +3379,6 @@ const build =
3511
3379
export {
3512
3380
build ,
3513
3381
getDocument ,
3514
- isValidExplicitDest ,
3515
- LoopbackPort ,
3516
3382
PDFDataRangeTransport ,
3517
3383
PDFDocumentLoadingTask ,
3518
3384
PDFDocumentProxy ,
0 commit comments