@file-viewer/core 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/LICENSE +160 -0
  2. package/README.en.md +78 -0
  3. package/README.md +83 -0
  4. package/dist/assets.d.ts +62 -0
  5. package/dist/assets.js +260 -0
  6. package/dist/browser.d.ts +1 -0
  7. package/dist/browser.js +1 -0
  8. package/dist/capabilities.d.ts +24 -0
  9. package/dist/capabilities.js +95 -0
  10. package/dist/document.d.ts +9 -0
  11. package/dist/document.js +86 -0
  12. package/dist/documentDom/anchors.d.ts +7 -0
  13. package/dist/documentDom/anchors.js +196 -0
  14. package/dist/documentDom/index.d.ts +5 -0
  15. package/dist/documentDom/index.js +3 -0
  16. package/dist/documentDom/providers.d.ts +13 -0
  17. package/dist/documentDom/providers.js +52 -0
  18. package/dist/documentDom/scroll.d.ts +12 -0
  19. package/dist/documentDom/scroll.js +42 -0
  20. package/dist/documentDom.d.ts +5 -0
  21. package/dist/documentDom.js +3 -0
  22. package/dist/documentEvents.d.ts +73 -0
  23. package/dist/documentEvents.js +150 -0
  24. package/dist/documentSearch.d.ts +50 -0
  25. package/dist/documentSearch.js +459 -0
  26. package/dist/documentZoom.d.ts +47 -0
  27. package/dist/documentZoom.js +184 -0
  28. package/dist/export.d.ts +26 -0
  29. package/dist/export.js +466 -0
  30. package/dist/formats.d.ts +305 -0
  31. package/dist/formats.js +207 -0
  32. package/dist/headless.d.ts +25 -0
  33. package/dist/headless.js +14 -0
  34. package/dist/index.d.ts +78 -0
  35. package/dist/index.js +118 -0
  36. package/dist/lifecycleFacade.d.ts +46 -0
  37. package/dist/lifecycleFacade.js +68 -0
  38. package/dist/loading.d.ts +59 -0
  39. package/dist/loading.js +489 -0
  40. package/dist/operations.d.ts +287 -0
  41. package/dist/operations.js +485 -0
  42. package/dist/options.d.ts +16 -0
  43. package/dist/options.js +92 -0
  44. package/dist/presentation.d.ts +14 -0
  45. package/dist/presentation.js +16 -0
  46. package/dist/printLayout.d.ts +19 -0
  47. package/dist/printLayout.js +83 -0
  48. package/dist/registry.d.ts +2 -0
  49. package/dist/registry.js +63 -0
  50. package/dist/rendererDispatcher.d.ts +21 -0
  51. package/dist/rendererDispatcher.js +42 -0
  52. package/dist/rendererHandler.d.ts +165 -0
  53. package/dist/rendererHandler.js +354 -0
  54. package/dist/renderers/archive.d.ts +2 -0
  55. package/dist/renderers/archive.js +547 -0
  56. package/dist/renderers/archiveCache.d.ts +10 -0
  57. package/dist/renderers/archiveCache.js +96 -0
  58. package/dist/renderers/archiveFallback.d.ts +7 -0
  59. package/dist/renderers/archiveFallback.js +166 -0
  60. package/dist/renderers/archiveShared.d.ts +23 -0
  61. package/dist/renderers/archiveShared.js +71 -0
  62. package/dist/renderers/audio.d.ts +8 -0
  63. package/dist/renderers/audio.js +219 -0
  64. package/dist/renderers/cad.d.ts +2 -0
  65. package/dist/renderers/cad.js +445 -0
  66. package/dist/renderers/code.d.ts +11 -0
  67. package/dist/renderers/code.js +233 -0
  68. package/dist/renderers/data.d.ts +7 -0
  69. package/dist/renderers/data.js +370 -0
  70. package/dist/renderers/drawing.d.ts +10 -0
  71. package/dist/renderers/drawing.js +537 -0
  72. package/dist/renderers/eda.d.ts +2 -0
  73. package/dist/renderers/eda.js +434 -0
  74. package/dist/renderers/edaParser.d.ts +77 -0
  75. package/dist/renderers/edaParser.js +569 -0
  76. package/dist/renderers/email.d.ts +2 -0
  77. package/dist/renderers/email.js +463 -0
  78. package/dist/renderers/epub.d.ts +2 -0
  79. package/dist/renderers/epub.js +330 -0
  80. package/dist/renderers/geo.d.ts +2 -0
  81. package/dist/renderers/geo.js +284 -0
  82. package/dist/renderers/image.d.ts +2 -0
  83. package/dist/renderers/image.js +179 -0
  84. package/dist/renderers/index.d.ts +21 -0
  85. package/dist/renderers/index.js +207 -0
  86. package/dist/renderers/markdown.d.ts +2 -0
  87. package/dist/renderers/markdown.js +83 -0
  88. package/dist/renderers/model.d.ts +2 -0
  89. package/dist/renderers/model.js +566 -0
  90. package/dist/renderers/ofd.d.ts +2 -0
  91. package/dist/renderers/ofd.js +255 -0
  92. package/dist/renderers/openDocument.d.ts +2 -0
  93. package/dist/renderers/openDocument.js +122 -0
  94. package/dist/renderers/pdf.d.ts +3 -0
  95. package/dist/renderers/pdf.js +846 -0
  96. package/dist/renderers/pdfStyles.d.ts +1 -0
  97. package/dist/renderers/pdfStyles.js +1 -0
  98. package/dist/renderers/pptx.d.ts +2 -0
  99. package/dist/renderers/pptx.js +202 -0
  100. package/dist/renderers/spreadsheet/state.d.ts +80 -0
  101. package/dist/renderers/spreadsheet/state.js +96 -0
  102. package/dist/renderers/spreadsheet/view.d.ts +25 -0
  103. package/dist/renderers/spreadsheet/view.js +833 -0
  104. package/dist/renderers/spreadsheet/worker/index.d.ts +2 -0
  105. package/dist/renderers/spreadsheet/worker/index.js +1 -0
  106. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.d.ts +73 -0
  107. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.js +623 -0
  108. package/dist/renderers/spreadsheet/worker/sheetjs/color.d.ts +2 -0
  109. package/dist/renderers/spreadsheet/worker/sheetjs/color.js +73 -0
  110. package/dist/renderers/spreadsheet/worker/sheetjs/index.d.ts +1 -0
  111. package/dist/renderers/spreadsheet/worker/sheetjs/index.js +1 -0
  112. package/dist/renderers/spreadsheet/worker/sheetjs/parser.d.ts +18 -0
  113. package/dist/renderers/spreadsheet/worker/sheetjs/parser.js +106 -0
  114. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.d.ts +1 -0
  115. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.js +11 -0
  116. package/dist/renderers/spreadsheet/worker/type.d.ts +57 -0
  117. package/dist/renderers/spreadsheet/worker/type.js +1 -0
  118. package/dist/renderers/spreadsheet.d.ts +3 -0
  119. package/dist/renderers/spreadsheet.js +929 -0
  120. package/dist/renderers/typst.d.ts +8 -0
  121. package/dist/renderers/typst.js +415 -0
  122. package/dist/renderers/umd/parser.d.ts +30 -0
  123. package/dist/renderers/umd/parser.js +408 -0
  124. package/dist/renderers/umd.d.ts +2 -0
  125. package/dist/renderers/umd.js +297 -0
  126. package/dist/renderers/video.d.ts +8 -0
  127. package/dist/renderers/video.js +108 -0
  128. package/dist/renderers/wordDoc.d.ts +5 -0
  129. package/dist/renderers/wordDoc.js +284 -0
  130. package/dist/renderers/wordDocx.d.ts +5 -0
  131. package/dist/renderers/wordDocx.js +501 -0
  132. package/dist/renderers/wordDocx.worker.d.ts +1 -0
  133. package/dist/renderers/wordDocx.worker.js +96 -0
  134. package/dist/source.d.ts +18 -0
  135. package/dist/source.js +152 -0
  136. package/dist/sourceLoading.d.ts +566 -0
  137. package/dist/sourceLoading.js +918 -0
  138. package/dist/state.d.ts +16 -0
  139. package/dist/state.js +81 -0
  140. package/dist/types.d.ts +446 -0
  141. package/dist/types.js +1 -0
  142. package/dist/viewer.d.ts +8 -0
  143. package/dist/viewer.js +285 -0
  144. package/dist/viewerOperations.d.ts +88 -0
  145. package/dist/viewerOperations.js +242 -0
  146. package/dist/watermark.d.ts +15 -0
  147. package/dist/watermark.js +81 -0
  148. package/dist/worker.d.ts +34 -0
  149. package/dist/worker.js +101 -0
  150. package/package.json +109 -0
  151. package/vendor/ofd/dltech/jbig2/arithmetic_decoder.js +183 -0
  152. package/vendor/ofd/dltech/jbig2/ccitt.js +1070 -0
  153. package/vendor/ofd/dltech/jbig2/compatibility.js +12 -0
  154. package/vendor/ofd/dltech/jbig2/core_utils.js +180 -0
  155. package/vendor/ofd/dltech/jbig2/is_node.js +27 -0
  156. package/vendor/ofd/dltech/jbig2/jbig2.js +2589 -0
  157. package/vendor/ofd/dltech/jbig2/jbig2_stream.js +81 -0
  158. package/vendor/ofd/dltech/jbig2/primitives.js +387 -0
  159. package/vendor/ofd/dltech/jbig2/stream.js +1348 -0
  160. package/vendor/ofd/dltech/jbig2/util.js +972 -0
  161. package/vendor/ofd/dltech/ofd/ofd.d.ts +11 -0
  162. package/vendor/ofd/dltech/ofd/ofd.js +100 -0
  163. package/vendor/ofd/dltech/ofd/ofd_parser.js +395 -0
  164. package/vendor/ofd/dltech/ofd/ofd_render.js +473 -0
  165. package/vendor/ofd/dltech/ofd/ofd_util.js +350 -0
  166. package/vendor/ofd/dltech/ofd/pipeline.js +26 -0
@@ -0,0 +1,918 @@
1
+ import { buildFileViewerLifecycleContext, } from './operations.js';
2
+ import { FILE_VIEWER_PREVIEW_MESSAGES, } from './state.js';
3
+ import { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, getExtension, normalizeFilename, readFileViewerBuffer, resolveFileViewerSourceFilename, wrapFileViewerFileRef, } from './source.js';
4
+ export const DEFAULT_PDF_RANGE_CHUNK_SIZE = 64 * 1024;
5
+ export const DEFAULT_FILE_VIEWER_STREAMING_PDF_FILENAME = 'preview.pdf';
6
+ export const FILE_VIEWER_REMOTE_MISSING_DATA_ERROR_MESSAGE = '文件下载失败';
7
+ export const FILE_VIEWER_PREVIEW_LOAD_ERROR_PREFIXES = {
8
+ local: '读取文件异常',
9
+ load: '加载文件异常',
10
+ stream: '加载 PDF 流式预览异常',
11
+ };
12
+ export const resolveFileViewerPreviewLoadErrorMessage = ({ kind, error, formatErrorMessage, prefixes, }) => {
13
+ var _a;
14
+ return formatErrorMessage((_a = prefixes === null || prefixes === void 0 ? void 0 : prefixes[kind]) !== null && _a !== void 0 ? _a : FILE_VIEWER_PREVIEW_LOAD_ERROR_PREFIXES[kind], error);
15
+ };
16
+ export const resolveFileViewerMissingRemoteDataErrorMessage = ({ message = FILE_VIEWER_REMOTE_MISSING_DATA_ERROR_MESSAGE, } = {}) => message;
17
+ export const DEFAULT_FILE_VIEWER_PREVIEW_LOAD_ERROR_LOGGER = error => {
18
+ if (typeof console !== 'undefined' && typeof console.error === 'function') {
19
+ console.error(error);
20
+ }
21
+ };
22
+ export const reportFileViewerPreviewLoadError = ({ onLogError = DEFAULT_FILE_VIEWER_PREVIEW_LOAD_ERROR_LOGGER, onErrorMessage, ...messageInput }) => {
23
+ onLogError === null || onLogError === void 0 ? void 0 : onLogError(messageInput.error);
24
+ const message = resolveFileViewerPreviewLoadErrorMessage(messageInput);
25
+ onErrorMessage === null || onErrorMessage === void 0 ? void 0 : onErrorMessage(message);
26
+ return message;
27
+ };
28
+ export const reportFileViewerMissingRemoteData = ({ onErrorMessage, ...messageInput } = {}) => {
29
+ const message = resolveFileViewerMissingRemoteDataErrorMessage(messageInput);
30
+ onErrorMessage === null || onErrorMessage === void 0 ? void 0 : onErrorMessage(message);
31
+ return message;
32
+ };
33
+ export const createFileViewerRequestController = () => {
34
+ let version = 0;
35
+ let activeAbortController = null;
36
+ return {
37
+ get version() {
38
+ return version;
39
+ },
40
+ createVersion() {
41
+ version += 1;
42
+ activeAbortController === null || activeAbortController === void 0 ? void 0 : activeAbortController.abort();
43
+ activeAbortController = null;
44
+ return version;
45
+ },
46
+ isCurrent(nextVersion) {
47
+ return nextVersion === version;
48
+ },
49
+ createAbortController() {
50
+ activeAbortController = typeof AbortController === 'function'
51
+ ? new AbortController()
52
+ : null;
53
+ return activeAbortController;
54
+ },
55
+ clearAbortController(controller) {
56
+ if (activeAbortController === controller) {
57
+ activeAbortController = null;
58
+ }
59
+ },
60
+ abort() {
61
+ activeAbortController === null || activeAbortController === void 0 ? void 0 : activeAbortController.abort();
62
+ activeAbortController = null;
63
+ },
64
+ };
65
+ };
66
+ export const createFileViewerRequestScope = (requestController = createFileViewerRequestController()) => {
67
+ return {
68
+ requestController,
69
+ getCurrentVersion: () => requestController.version,
70
+ isCurrentRequest: version => requestController.isCurrent(version),
71
+ };
72
+ };
73
+ export const isFileViewerAbortError = (error) => {
74
+ if (typeof DOMException !== 'undefined' && error instanceof DOMException && error.name === 'AbortError') {
75
+ return true;
76
+ }
77
+ if (!error || typeof error !== 'object') {
78
+ return false;
79
+ }
80
+ const candidate = error;
81
+ return candidate.__CANCEL__ === true ||
82
+ candidate.code === 'ERR_CANCELED' ||
83
+ candidate.name === 'AbortError' ||
84
+ candidate.name === 'CanceledError';
85
+ };
86
+ export const hasFileViewerPreviewSource = ({ file, url, } = {}) => {
87
+ return !!file || !!url;
88
+ };
89
+ export const resolveFileViewerPreviewRequestReason = (input = {}) => {
90
+ return hasFileViewerPreviewSource(input) ? 'replace' : 'reset';
91
+ };
92
+ export const normalizeFileViewerSourceUrl = (sourceUrl) => {
93
+ return sourceUrl || null;
94
+ };
95
+ export const createFileViewerEmptyPreviewState = () => {
96
+ return {
97
+ filename: '',
98
+ file: null,
99
+ buffer: null,
100
+ sourceUrl: null,
101
+ renderedReady: false,
102
+ progressiveReady: false,
103
+ };
104
+ };
105
+ export const createFileViewerPreviewRequestResetState = () => {
106
+ return {
107
+ file: null,
108
+ buffer: null,
109
+ sourceUrl: null,
110
+ progressiveReady: false,
111
+ };
112
+ };
113
+ export const createFileViewerPreviewStateTarget = ({ filename, file, buffer, sourceUrl, renderedReady, progressiveReady, }) => {
114
+ return {
115
+ get filename() {
116
+ return filename.get();
117
+ },
118
+ set filename(value) {
119
+ filename.set(value);
120
+ },
121
+ get file() {
122
+ return file.get();
123
+ },
124
+ set file(value) {
125
+ file.set(value);
126
+ },
127
+ get buffer() {
128
+ return buffer.get();
129
+ },
130
+ set buffer(value) {
131
+ buffer.set(value);
132
+ },
133
+ get sourceUrl() {
134
+ return sourceUrl.get();
135
+ },
136
+ set sourceUrl(value) {
137
+ sourceUrl.set(value);
138
+ },
139
+ get renderedReady() {
140
+ return renderedReady.get();
141
+ },
142
+ set renderedReady(value) {
143
+ renderedReady.set(value);
144
+ },
145
+ get progressiveReady() {
146
+ return progressiveReady.get();
147
+ },
148
+ set progressiveReady(value) {
149
+ progressiveReady.set(value);
150
+ },
151
+ };
152
+ };
153
+ export const applyFileViewerPreviewRequestResetState = (target, state = createFileViewerPreviewRequestResetState()) => {
154
+ target.file = state.file;
155
+ target.buffer = state.buffer;
156
+ target.sourceUrl = state.sourceUrl;
157
+ target.progressiveReady = state.progressiveReady;
158
+ return target;
159
+ };
160
+ export const commitFileViewerPreviewRequestStartState = ({ reason = 'replace', requestController, previewTarget, onClearRenderedContent, onClearError, }) => {
161
+ const version = requestController.createVersion();
162
+ onClearRenderedContent === null || onClearRenderedContent === void 0 ? void 0 : onClearRenderedContent(reason);
163
+ applyFileViewerPreviewRequestResetState(previewTarget);
164
+ onClearError === null || onClearError === void 0 ? void 0 : onClearError();
165
+ return version;
166
+ };
167
+ export const cancelFileViewerPreviewRequest = ({ reason = 'component-unmount', requestController, previewTarget, onClearRenderedContent, onClearError, }) => {
168
+ return commitFileViewerPreviewRequestStartState({
169
+ reason,
170
+ requestController,
171
+ previewTarget,
172
+ onClearRenderedContent,
173
+ onClearError,
174
+ });
175
+ };
176
+ export const runFileViewerPreviewSourceChange = ({ onRefreshPreview, } = {}) => {
177
+ return onRefreshPreview === null || onRefreshPreview === void 0 ? void 0 : onRefreshPreview();
178
+ };
179
+ export const runFileViewerPreviewComponentUnmount = ({ reason = 'component-unmount', onCancelPreview, onResetLoading, onStopZoomObserver, } = {}) => {
180
+ onCancelPreview === null || onCancelPreview === void 0 ? void 0 : onCancelPreview(reason);
181
+ onResetLoading === null || onResetLoading === void 0 ? void 0 : onResetLoading();
182
+ onStopZoomObserver === null || onStopZoomObserver === void 0 ? void 0 : onStopZoomObserver();
183
+ return {
184
+ reason,
185
+ };
186
+ };
187
+ export const applyFileViewerEmptyPreviewState = (target, state = createFileViewerEmptyPreviewState()) => {
188
+ target.filename = state.filename;
189
+ target.renderedReady = state.renderedReady;
190
+ applyFileViewerPreviewRequestResetState(target, state);
191
+ return target;
192
+ };
193
+ export const commitFileViewerEmptyPreviewResetState = ({ previewTarget, state, reason, onClearRenderedContent, onResetLoading, }) => {
194
+ applyFileViewerEmptyPreviewState(previewTarget, state);
195
+ onClearRenderedContent === null || onClearRenderedContent === void 0 ? void 0 : onClearRenderedContent(reason);
196
+ onResetLoading === null || onResetLoading === void 0 ? void 0 : onResetLoading();
197
+ return previewTarget;
198
+ };
199
+ export const runFileViewerPreviewRequest = async ({ file, url, reason = resolveFileViewerPreviewRequestReason({ file, url }), requestController, previewTarget, onPreviewLocalFile, onPreviewRemoteFile, onClearRenderedContent, onClearError, onResetLoading, }) => {
200
+ const version = commitFileViewerPreviewRequestStartState({
201
+ reason,
202
+ requestController,
203
+ previewTarget,
204
+ onClearRenderedContent,
205
+ onClearError,
206
+ });
207
+ if (file) {
208
+ const result = await onPreviewLocalFile(file, version);
209
+ return {
210
+ status: 'file',
211
+ version,
212
+ reason,
213
+ file,
214
+ url: null,
215
+ result,
216
+ };
217
+ }
218
+ if (url) {
219
+ const result = await onPreviewRemoteFile(url, version);
220
+ return {
221
+ status: 'url',
222
+ version,
223
+ reason,
224
+ file: null,
225
+ url,
226
+ result,
227
+ };
228
+ }
229
+ const result = commitFileViewerEmptyPreviewResetState({
230
+ previewTarget,
231
+ onClearRenderedContent,
232
+ onResetLoading,
233
+ });
234
+ return {
235
+ status: 'reset',
236
+ version,
237
+ reason,
238
+ file: null,
239
+ url: null,
240
+ result,
241
+ };
242
+ };
243
+ export const createFileViewerReadPreviewState = ({ file, buffer, sourceUrl, fallbackFilename = '', }) => ({
244
+ filename: resolveFileViewerSourceFilename({ file, fallback: fallbackFilename }),
245
+ file,
246
+ buffer,
247
+ sourceUrl: normalizeFileViewerSourceUrl(sourceUrl),
248
+ });
249
+ export const applyFileViewerReadPreviewState = (target, state) => {
250
+ target.filename = state.filename;
251
+ target.file = state.file;
252
+ target.buffer = state.buffer;
253
+ target.sourceUrl = state.sourceUrl;
254
+ return target;
255
+ };
256
+ export const applyFileViewerPreviewSourceUrlState = (target, sourceUrl) => {
257
+ target.sourceUrl = normalizeFileViewerSourceUrl(sourceUrl);
258
+ return target;
259
+ };
260
+ export const applyFileViewerPreviewFilenameState = (target, filename, fallbackFilename = '') => {
261
+ target.filename = resolveFileViewerSourceFilename({ filename, fallback: fallbackFilename });
262
+ return target;
263
+ };
264
+ export const applyFileViewerRenderReadinessState = (target, state) => {
265
+ if (typeof state.renderedReady === 'boolean') {
266
+ target.renderedReady = state.renderedReady;
267
+ }
268
+ if (typeof state.progressiveReady === 'boolean') {
269
+ target.progressiveReady = state.progressiveReady;
270
+ }
271
+ return target;
272
+ };
273
+ export const commitFileViewerRenderCompleteState = ({ version, session, buildState, readinessTarget, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, }) => {
274
+ onSession === null || onSession === void 0 ? void 0 : onSession(session !== null && session !== void 0 ? session : null);
275
+ const completeState = buildState();
276
+ applyFileViewerRenderReadinessState(readinessTarget, completeState.readiness);
277
+ onActiveDocumentContext === null || onActiveDocumentContext === void 0 ? void 0 : onActiveDocumentContext(completeState.lifecycleContext);
278
+ onLifecycle === null || onLifecycle === void 0 ? void 0 : onLifecycle(completeState.lifecycleContext);
279
+ onClearLoadStarted === null || onClearLoadStarted === void 0 ? void 0 : onClearLoadStarted(version);
280
+ return completeState;
281
+ };
282
+ export const runFileViewerReadAndRenderFile = async ({ file, version, sourceUrl, source = sourceUrl ? 'url' : 'file', fallbackFilename = '', previewTarget, isCurrent, mountRenderedContent, destroyRenderSession, buildRenderCompleteState, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, }) => {
283
+ const buffer = await readFileViewerBuffer(file);
284
+ if (!isCurrent(version)) {
285
+ return {
286
+ stale: true,
287
+ buffer,
288
+ session: null,
289
+ complete: null,
290
+ };
291
+ }
292
+ applyFileViewerReadPreviewState(previewTarget, createFileViewerReadPreviewState({
293
+ file,
294
+ buffer,
295
+ sourceUrl,
296
+ fallbackFilename,
297
+ }));
298
+ const session = await mountRenderedContent(buffer, file, version, sourceUrl);
299
+ if (!isCurrent(version)) {
300
+ destroyRenderSession === null || destroyRenderSession === void 0 ? void 0 : destroyRenderSession(session);
301
+ return {
302
+ stale: true,
303
+ buffer,
304
+ session,
305
+ complete: null,
306
+ };
307
+ }
308
+ const complete = commitFileViewerRenderCompleteState({
309
+ version,
310
+ session,
311
+ readinessTarget: previewTarget,
312
+ buildState: () => buildRenderCompleteState({
313
+ version,
314
+ source,
315
+ file,
316
+ sourceUrl,
317
+ }),
318
+ onSession,
319
+ onActiveDocumentContext,
320
+ onLifecycle,
321
+ onClearLoadStarted,
322
+ });
323
+ return {
324
+ stale: false,
325
+ buffer,
326
+ session,
327
+ complete,
328
+ };
329
+ };
330
+ export const runFileViewerStreamingPdfPreview = async ({ url, version, filename, previewTarget, isCurrent, mountRenderedContent, destroyRenderSession, buildRenderCompleteState, loadingMessage = FILE_VIEWER_PREVIEW_MESSAGES.streamingPdf, onStartLoading, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, onStopLoading, onError, }) => {
331
+ let placeholderFile = null;
332
+ onStartLoading === null || onStartLoading === void 0 ? void 0 : onStartLoading(loadingMessage);
333
+ try {
334
+ placeholderFile = createFileViewerStreamingPdfPlaceholderFile(filename);
335
+ applyFileViewerPreviewSourceUrlState(previewTarget, url);
336
+ const session = await mountRenderedContent(new ArrayBuffer(0), placeholderFile, version, url, url);
337
+ if (!isCurrent(version)) {
338
+ destroyRenderSession === null || destroyRenderSession === void 0 ? void 0 : destroyRenderSession(session);
339
+ return {
340
+ status: 'stale',
341
+ placeholderFile,
342
+ session,
343
+ complete: null,
344
+ error: null,
345
+ };
346
+ }
347
+ const complete = commitFileViewerRenderCompleteState({
348
+ version,
349
+ session,
350
+ readinessTarget: previewTarget,
351
+ buildState: () => buildRenderCompleteState({
352
+ version,
353
+ source: 'url',
354
+ sourceUrl: url,
355
+ }),
356
+ onSession,
357
+ onActiveDocumentContext,
358
+ onLifecycle,
359
+ onClearLoadStarted,
360
+ });
361
+ return {
362
+ status: 'ready',
363
+ placeholderFile,
364
+ session,
365
+ complete,
366
+ error: null,
367
+ };
368
+ }
369
+ catch (error) {
370
+ if (!isCurrent(version)) {
371
+ return {
372
+ status: 'stale',
373
+ placeholderFile,
374
+ session: null,
375
+ complete: null,
376
+ error: null,
377
+ };
378
+ }
379
+ onError === null || onError === void 0 ? void 0 : onError(error);
380
+ return {
381
+ status: 'error',
382
+ placeholderFile,
383
+ session: null,
384
+ complete: null,
385
+ error,
386
+ };
387
+ }
388
+ finally {
389
+ finalizeFileViewerPreviewLoadState({
390
+ version,
391
+ isCurrent,
392
+ onClearLoadStarted,
393
+ onStopLoading,
394
+ });
395
+ }
396
+ };
397
+ export const runFileViewerLocalFilePreview = async ({ source, version, currentFilename, fallbackFilename, previewTarget, isCurrent, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, onMarkLoadStarted, onStartLoading, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, onStopLoading, onError, }) => {
398
+ const localSource = resolveFileViewerFileRefSourcePlan({
399
+ source,
400
+ currentFilename,
401
+ fallbackFilename,
402
+ });
403
+ const { file } = localSource;
404
+ commitFileViewerLoadStartState({
405
+ version,
406
+ filename: localSource.filename,
407
+ filenameTarget: previewTarget,
408
+ buildState: () => buildLoadStartState({
409
+ version,
410
+ source: 'file',
411
+ file,
412
+ }),
413
+ onMarkLoadStarted,
414
+ onLifecycle,
415
+ onStartLoading,
416
+ });
417
+ try {
418
+ const read = await runFileViewerReadAndRenderFile({
419
+ file,
420
+ version,
421
+ source: 'file',
422
+ previewTarget,
423
+ isCurrent,
424
+ mountRenderedContent,
425
+ destroyRenderSession,
426
+ buildRenderCompleteState: input => buildRenderCompleteState({
427
+ version: input.version,
428
+ source: 'file',
429
+ file,
430
+ }),
431
+ onSession,
432
+ onActiveDocumentContext,
433
+ onLifecycle,
434
+ onClearLoadStarted,
435
+ });
436
+ if (read.stale) {
437
+ return {
438
+ status: 'stale',
439
+ source: localSource,
440
+ read,
441
+ error: null,
442
+ };
443
+ }
444
+ return {
445
+ status: 'ready',
446
+ source: localSource,
447
+ read,
448
+ error: null,
449
+ };
450
+ }
451
+ catch (error) {
452
+ if (!isCurrent(version)) {
453
+ return {
454
+ status: 'stale',
455
+ source: localSource,
456
+ read: null,
457
+ error: null,
458
+ };
459
+ }
460
+ onError === null || onError === void 0 ? void 0 : onError(error);
461
+ return {
462
+ status: 'error',
463
+ source: localSource,
464
+ read: null,
465
+ error,
466
+ };
467
+ }
468
+ finally {
469
+ finalizeFileViewerPreviewLoadState({
470
+ version,
471
+ isCurrent,
472
+ onClearLoadStarted,
473
+ onStopLoading,
474
+ });
475
+ }
476
+ };
477
+ export const runFileViewerRemoteFilePreview = async ({ url, version, pageHref, streaming, previewTarget, requestController, isCurrent, downloadFile, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, onMarkLoadStarted, onStartLoading, onSetLoadingMessage, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, onStopLoading, onMissingData, onError, }) => {
478
+ const remoteSource = resolveFileViewerRemoteSourcePlan({
479
+ pageHref,
480
+ streaming,
481
+ url,
482
+ });
483
+ commitFileViewerLoadStartState({
484
+ version,
485
+ filename: remoteSource.filename,
486
+ filenameTarget: previewTarget,
487
+ buildState: () => buildLoadStartState({
488
+ version,
489
+ source: 'url',
490
+ sourceUrl: url,
491
+ }),
492
+ onMarkLoadStarted,
493
+ onLifecycle,
494
+ onStartLoading,
495
+ });
496
+ if (remoteSource.streamPdf) {
497
+ const stream = await runFileViewerStreamingPdfPreview({
498
+ url,
499
+ version,
500
+ filename: remoteSource.filename,
501
+ previewTarget,
502
+ isCurrent,
503
+ mountRenderedContent,
504
+ destroyRenderSession,
505
+ buildRenderCompleteState: input => buildRenderCompleteState({
506
+ version: input.version,
507
+ source: 'url',
508
+ sourceUrl: url,
509
+ }),
510
+ onStartLoading,
511
+ onSession,
512
+ onActiveDocumentContext,
513
+ onLifecycle,
514
+ onClearLoadStarted,
515
+ onStopLoading,
516
+ onError: error => onError === null || onError === void 0 ? void 0 : onError(error, 'stream'),
517
+ });
518
+ if (stream.status === 'ready') {
519
+ return {
520
+ status: 'stream',
521
+ remoteSource,
522
+ download: null,
523
+ read: null,
524
+ stream,
525
+ error: null,
526
+ };
527
+ }
528
+ if (stream.status === 'error') {
529
+ return {
530
+ status: 'error',
531
+ remoteSource,
532
+ download: null,
533
+ read: null,
534
+ stream,
535
+ error: stream.error,
536
+ };
537
+ }
538
+ return {
539
+ status: 'stale',
540
+ remoteSource,
541
+ download: null,
542
+ read: null,
543
+ stream,
544
+ error: null,
545
+ };
546
+ }
547
+ const controller = requestController.createAbortController();
548
+ try {
549
+ const data = await downloadFile({
550
+ url,
551
+ signal: controller === null || controller === void 0 ? void 0 : controller.signal,
552
+ });
553
+ const download = commitFileViewerRemoteDownloadState({
554
+ version,
555
+ data,
556
+ currentFilename: remoteSource.filename,
557
+ isCurrent,
558
+ onMissingData,
559
+ onSetLoadingMessage,
560
+ });
561
+ if (download.stale) {
562
+ return {
563
+ status: 'stale',
564
+ remoteSource,
565
+ download,
566
+ read: null,
567
+ stream: null,
568
+ error: null,
569
+ };
570
+ }
571
+ if (download.missing) {
572
+ return {
573
+ status: 'missing',
574
+ remoteSource,
575
+ download,
576
+ read: null,
577
+ stream: null,
578
+ error: null,
579
+ };
580
+ }
581
+ const read = await runFileViewerReadAndRenderFile({
582
+ file: download.source.file,
583
+ version,
584
+ source: 'url',
585
+ sourceUrl: url,
586
+ previewTarget,
587
+ isCurrent,
588
+ mountRenderedContent,
589
+ destroyRenderSession,
590
+ buildRenderCompleteState: input => buildRenderCompleteState({
591
+ version: input.version,
592
+ source: 'url',
593
+ file: input.file,
594
+ sourceUrl: url,
595
+ }),
596
+ onSession,
597
+ onActiveDocumentContext,
598
+ onLifecycle,
599
+ onClearLoadStarted,
600
+ });
601
+ if (read.stale) {
602
+ return {
603
+ status: 'stale',
604
+ remoteSource,
605
+ download,
606
+ read,
607
+ stream: null,
608
+ error: null,
609
+ };
610
+ }
611
+ return {
612
+ status: 'ready',
613
+ remoteSource,
614
+ download,
615
+ read,
616
+ stream: null,
617
+ error: null,
618
+ };
619
+ }
620
+ catch (error) {
621
+ if (!isCurrent(version) || isFileViewerAbortError(error)) {
622
+ return {
623
+ status: 'stale',
624
+ remoteSource,
625
+ download: null,
626
+ read: null,
627
+ stream: null,
628
+ error: null,
629
+ };
630
+ }
631
+ onError === null || onError === void 0 ? void 0 : onError(error, 'load');
632
+ return {
633
+ status: 'error',
634
+ remoteSource,
635
+ download: null,
636
+ read: null,
637
+ stream: null,
638
+ error,
639
+ };
640
+ }
641
+ finally {
642
+ requestController.clearAbortController(controller);
643
+ finalizeFileViewerPreviewLoadState({
644
+ version,
645
+ isCurrent,
646
+ onClearLoadStarted,
647
+ onStopLoading,
648
+ });
649
+ }
650
+ };
651
+ export const createFileViewerSourceLoadingActionHandlers = ({ getFile, getUrl, getCurrentFilename, getPdfStreaming, getPageHref, previewTarget, requestController, downloadFile, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, formatErrorMessage, onMarkLoadStarted, onClearLoadStarted, onStartLoading, onSetLoadingMessage, onStopLoading, onShowError, onClearError, onResetLoading, onClearRenderedContent, onSession, onActiveDocumentContext, onLifecycle, }) => {
652
+ const isCurrentRequest = (version) => requestController.isCurrent(version);
653
+ const previewLocalFile = async (source, version) => {
654
+ var _a;
655
+ return await runFileViewerLocalFilePreview({
656
+ source,
657
+ version,
658
+ currentFilename: (_a = getCurrentFilename === null || getCurrentFilename === void 0 ? void 0 : getCurrentFilename()) !== null && _a !== void 0 ? _a : previewTarget.filename,
659
+ previewTarget,
660
+ isCurrent: isCurrentRequest,
661
+ mountRenderedContent,
662
+ destroyRenderSession,
663
+ buildLoadStartState: input => buildLoadStartState({
664
+ version: input.version,
665
+ source: 'file',
666
+ file: input.file,
667
+ }),
668
+ buildRenderCompleteState: input => buildRenderCompleteState({
669
+ version: input.version,
670
+ source: 'file',
671
+ file: input.file,
672
+ }),
673
+ onMarkLoadStarted,
674
+ onStartLoading,
675
+ onSession,
676
+ onActiveDocumentContext,
677
+ onLifecycle,
678
+ onClearLoadStarted,
679
+ onStopLoading,
680
+ onError: error => {
681
+ reportFileViewerPreviewLoadError({
682
+ kind: 'local',
683
+ error,
684
+ formatErrorMessage,
685
+ onErrorMessage: onShowError,
686
+ });
687
+ },
688
+ });
689
+ };
690
+ const previewRemoteFile = async (url, version) => {
691
+ return await runFileViewerRemoteFilePreview({
692
+ url,
693
+ version,
694
+ pageHref: getPageHref === null || getPageHref === void 0 ? void 0 : getPageHref(),
695
+ streaming: getPdfStreaming === null || getPdfStreaming === void 0 ? void 0 : getPdfStreaming(),
696
+ previewTarget,
697
+ requestController,
698
+ isCurrent: isCurrentRequest,
699
+ downloadFile,
700
+ mountRenderedContent,
701
+ destroyRenderSession,
702
+ buildLoadStartState: input => buildLoadStartState({
703
+ version: input.version,
704
+ source: 'url',
705
+ sourceUrl: input.sourceUrl,
706
+ }),
707
+ buildRenderCompleteState: input => buildRenderCompleteState({
708
+ version: input.version,
709
+ source: 'url',
710
+ file: input.file,
711
+ sourceUrl: input.sourceUrl,
712
+ }),
713
+ onMarkLoadStarted,
714
+ onStartLoading,
715
+ onSetLoadingMessage,
716
+ onSession,
717
+ onActiveDocumentContext,
718
+ onLifecycle,
719
+ onClearLoadStarted,
720
+ onStopLoading,
721
+ onMissingData: () => {
722
+ reportFileViewerMissingRemoteData({
723
+ onErrorMessage: onShowError,
724
+ });
725
+ },
726
+ onError: (error, kind) => {
727
+ reportFileViewerPreviewLoadError({
728
+ kind,
729
+ error,
730
+ formatErrorMessage,
731
+ onErrorMessage: onShowError,
732
+ });
733
+ },
734
+ });
735
+ };
736
+ const resetViewer = (reason) => {
737
+ return commitFileViewerEmptyPreviewResetState({
738
+ previewTarget,
739
+ reason,
740
+ onClearRenderedContent,
741
+ onResetLoading,
742
+ });
743
+ };
744
+ const refreshPreview = async () => {
745
+ return await runFileViewerPreviewRequest({
746
+ file: getFile(),
747
+ url: getUrl(),
748
+ requestController,
749
+ previewTarget,
750
+ onPreviewLocalFile: previewLocalFile,
751
+ onPreviewRemoteFile: previewRemoteFile,
752
+ onClearRenderedContent,
753
+ onClearError,
754
+ onResetLoading,
755
+ });
756
+ };
757
+ const cancelPreview = (reason = 'component-unmount') => {
758
+ return cancelFileViewerPreviewRequest({
759
+ reason,
760
+ requestController,
761
+ previewTarget,
762
+ onClearRenderedContent,
763
+ onClearError,
764
+ });
765
+ };
766
+ return {
767
+ isCurrentRequest,
768
+ previewLocalFile,
769
+ previewRemoteFile,
770
+ resetViewer,
771
+ refreshPreview,
772
+ cancelPreview,
773
+ };
774
+ };
775
+ export const finalizeFileViewerPreviewLoadState = ({ version, isCurrent, onClearLoadStarted, onStopLoading, }) => {
776
+ onClearLoadStarted === null || onClearLoadStarted === void 0 ? void 0 : onClearLoadStarted(version);
777
+ if (isCurrent(version)) {
778
+ onStopLoading === null || onStopLoading === void 0 ? void 0 : onStopLoading();
779
+ }
780
+ };
781
+ export const resolveFileViewerLoadStartMessage = (source) => {
782
+ return source === 'url'
783
+ ? FILE_VIEWER_PREVIEW_MESSAGES.downloading
784
+ : FILE_VIEWER_PREVIEW_MESSAGES.reading;
785
+ };
786
+ export const commitFileViewerLoadStartState = ({ version, filename, fallbackFilename, filenameTarget, buildState, onMarkLoadStarted, onLifecycle, onStartLoading, }) => {
787
+ if (filenameTarget) {
788
+ applyFileViewerPreviewFilenameState(filenameTarget, filename, fallbackFilename);
789
+ }
790
+ onMarkLoadStarted === null || onMarkLoadStarted === void 0 ? void 0 : onMarkLoadStarted(version);
791
+ const loadStartState = buildState();
792
+ onLifecycle === null || onLifecycle === void 0 ? void 0 : onLifecycle(loadStartState.lifecycleContext);
793
+ onStartLoading === null || onStartLoading === void 0 ? void 0 : onStartLoading(loadStartState.loadingMessage);
794
+ return loadStartState;
795
+ };
796
+ export const createFileViewerLoadStartState = ({ version, source, filename, file, sourceUrl, bufferSize, loadingMessage, timestamp, }) => {
797
+ return {
798
+ loadingMessage: loadingMessage || resolveFileViewerLoadStartMessage(source),
799
+ lifecycleContext: buildFileViewerLifecycleContext({
800
+ phase: 'load-start',
801
+ version,
802
+ source,
803
+ file,
804
+ filename,
805
+ url: normalizeFileViewerSourceUrl(sourceUrl) || undefined,
806
+ bufferSize,
807
+ timestamp,
808
+ }),
809
+ };
810
+ };
811
+ export const createFileViewerRenderCompleteState = ({ version, source, filename, file, sourceUrl, bufferSize, startedAt, timestamp, lifecycleState, }) => {
812
+ return {
813
+ readiness: {
814
+ renderedReady: true,
815
+ progressiveReady: false,
816
+ },
817
+ lifecycleContext: buildFileViewerLifecycleContext({
818
+ phase: 'load-complete',
819
+ version,
820
+ source,
821
+ file,
822
+ filename,
823
+ url: normalizeFileViewerSourceUrl(sourceUrl) || undefined,
824
+ bufferSize,
825
+ startedAt: startedAt !== null && startedAt !== void 0 ? startedAt : lifecycleState === null || lifecycleState === void 0 ? void 0 : lifecycleState.getLoadStartedAt(version),
826
+ timestamp,
827
+ }),
828
+ };
829
+ };
830
+ export const resolveFileViewerFileRefSourcePlan = ({ source, currentFilename, fallbackFilename = DEFAULT_FILE_VIEWER_SOURCE_FILENAME, }) => {
831
+ const file = wrapFileViewerFileRef(source, currentFilename || fallbackFilename);
832
+ return {
833
+ file,
834
+ filename: resolveFileViewerSourceFilename({ file, fallback: fallbackFilename }),
835
+ };
836
+ };
837
+ export const normalizePdfStreamingMode = (mode) => {
838
+ if (mode === true || mode === false || mode === 'same-origin') {
839
+ return mode;
840
+ }
841
+ return 'same-origin';
842
+ };
843
+ export const isSameOriginUrl = (url, pageHref) => {
844
+ try {
845
+ const target = new URL(url, pageHref);
846
+ const page = new URL(pageHref);
847
+ return target.origin === page.origin;
848
+ }
849
+ catch {
850
+ return false;
851
+ }
852
+ };
853
+ export const shouldStreamPdfUrl = ({ extension, pageHref, streaming, url, }) => {
854
+ if (extension.toLowerCase() !== 'pdf') {
855
+ return false;
856
+ }
857
+ const mode = normalizePdfStreamingMode(streaming);
858
+ if (mode === false) {
859
+ return false;
860
+ }
861
+ if (mode === true) {
862
+ return true;
863
+ }
864
+ return isSameOriginUrl(url, pageHref);
865
+ };
866
+ export const resolveFileViewerPageHref = (locationLike) => {
867
+ return (locationLike === null || locationLike === void 0 ? void 0 : locationLike.href) || undefined;
868
+ };
869
+ export const resolveFileViewerRemoteSourcePlan = ({ filename, fallbackFilename = DEFAULT_FILE_VIEWER_SOURCE_FILENAME, pageHref, streaming, url, }) => {
870
+ const nextFilename = normalizeFilename(filename || url, fallbackFilename);
871
+ const extension = getExtension(nextFilename);
872
+ return {
873
+ url,
874
+ filename: nextFilename,
875
+ extension,
876
+ streamPdf: pageHref
877
+ ? shouldStreamPdfUrl({
878
+ extension,
879
+ pageHref,
880
+ streaming,
881
+ url,
882
+ })
883
+ : false,
884
+ };
885
+ };
886
+ export const commitFileViewerRemoteDownloadState = ({ version, data, currentFilename, fallbackFilename, isCurrent, onMissingData, onSetLoadingMessage, }) => {
887
+ if (!isCurrent(version)) {
888
+ return {
889
+ stale: true,
890
+ missing: false,
891
+ source: null,
892
+ };
893
+ }
894
+ if (!data) {
895
+ onMissingData === null || onMissingData === void 0 ? void 0 : onMissingData();
896
+ return {
897
+ stale: false,
898
+ missing: true,
899
+ source: null,
900
+ };
901
+ }
902
+ onSetLoadingMessage === null || onSetLoadingMessage === void 0 ? void 0 : onSetLoadingMessage(FILE_VIEWER_PREVIEW_MESSAGES.reading);
903
+ return {
904
+ stale: false,
905
+ missing: false,
906
+ source: resolveFileViewerFileRefSourcePlan({
907
+ source: data,
908
+ currentFilename,
909
+ fallbackFilename,
910
+ }),
911
+ };
912
+ };
913
+ export const createFileViewerStreamingPdfPlaceholderFile = (filename) => {
914
+ if (typeof Blob === 'undefined') {
915
+ throw new Error('Blob is not available in the current execution environment.');
916
+ }
917
+ return wrapFileViewerFileRef(new Blob([], { type: 'application/pdf' }), normalizeFilename(filename, DEFAULT_FILE_VIEWER_STREAMING_PDF_FILENAME));
918
+ };