@file-viewer/core 2.1.16 → 2.1.17

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.
@@ -575,6 +575,10 @@ export interface FileViewerDocumentChunk {
575
575
  export interface FileViewerComponentProps {
576
576
  file?: FileViewerFileRef;
577
577
  url?: string;
578
+ name?: string;
579
+ filename?: string;
580
+ type?: string;
581
+ size?: number;
578
582
  options?: FileViewerOptions;
579
583
  }
580
584
  export interface FileViewerComponentEventMap {
@@ -29,6 +29,9 @@ export const clearFileViewerRenderSurface = (container) => {
29
29
  export const createFileViewerRenderTarget = (container, options = {}) => {
30
30
  const target = container.ownerDocument.createElement('div');
31
31
  target.className = options.className || DEFAULT_FILE_VIEWER_RENDER_TARGET_CLASS;
32
+ target.style.width = '100%';
33
+ target.style.minWidth = '0';
34
+ target.style.minHeight = '0';
32
35
  container.appendChild(target);
33
36
  return target;
34
37
  };
@@ -12,7 +12,7 @@ import { DEFAULT_FILE_VIEWER_DOWNLOAD_FILENAME, DEFAULT_FILE_VIEWER_EXPORT_FILEN
12
12
  import { applyFileViewerZoomAvailability, createUnsupportedAvailability, getRendererAvailability, } from '../registry/capabilities.js';
13
13
  import { buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, runFileViewerBeforeOperation, runFileViewerLifecycleHook, } from '../lifecycle/operations.js';
14
14
  import { collectFileViewerRendererPlugins, createRendererRegistry, getFileViewerAutoRendererPresetVersion, hasFileViewerRendererPresetName, installFileViewerRendererPlugins, listFileViewerAutoRendererPresets, resolveFileViewerRendererPresetInputs, } from '../registry/registry.js';
15
- import { createFileRenderHandlerLoader, applyFileViewerRenderSurfaceState, createFileViewerRenderSurfaceState, } from '../rendering/handler.js';
15
+ import { createFileRenderHandlerLoader, applyFileViewerRenderSurfaceState, createFileViewerRenderSurfaceState, createFileViewerRenderTarget, removeFileViewerRenderTarget, } from '../rendering/handler.js';
16
16
  import { createFileViewerCoreRendererRegistry } from '../renderers/index.js';
17
17
  import { createFileViewerRequestScope } from '../source/loading.js';
18
18
  import { normalizeSource } from '../source/index.js';
@@ -93,6 +93,7 @@ export const createViewer = (container, createOptions = {}) => {
93
93
  let installedAutoRenderersEnabled = resolveAutoRenderersEnabled(options);
94
94
  let installedAutoRendererVersion = -1;
95
95
  let currentSource = null;
96
+ let currentRenderTarget = null;
96
97
  const renderSurfaceState = createFileViewerRenderSurfaceState();
97
98
  const requestScope = createFileViewerRequestScope();
98
99
  const documentTarget = {
@@ -179,6 +180,32 @@ export const createViewer = (container, createOptions = {}) => {
179
180
  forcedWatermarkContainerPosition = false;
180
181
  }
181
182
  };
183
+ const removeRenderTarget = (target = currentRenderTarget) => {
184
+ if (!target) {
185
+ return;
186
+ }
187
+ removeFileViewerRenderTarget(container, target);
188
+ if (currentRenderTarget === target) {
189
+ currentRenderTarget = null;
190
+ }
191
+ };
192
+ const createRenderTarget = (fillHeight = true) => {
193
+ const target = createFileViewerRenderTarget(container);
194
+ if (fillHeight) {
195
+ target.style.height = '100%';
196
+ }
197
+ currentRenderTarget = target;
198
+ return target;
199
+ };
200
+ const disposeStaleSession = async (session, target) => {
201
+ var _a;
202
+ try {
203
+ await ((_a = session === null || session === void 0 ? void 0 : session.destroy) === null || _a === void 0 ? void 0 : _a.call(session));
204
+ }
205
+ finally {
206
+ removeRenderTarget(target);
207
+ }
208
+ };
182
209
  const syncWatermarkOverlay = () => {
183
210
  const inlineStyle = buildFileViewerWatermarkInlineStyle(options.watermark);
184
211
  if (!inlineStyle) {
@@ -352,15 +379,20 @@ export const createViewer = (container, createOptions = {}) => {
352
379
  zoomController.observe();
353
380
  viewStateController.observe();
354
381
  const destroyCurrent = async (reason = 'replace') => {
355
- var _a, _b;
356
- if (!currentSource) {
382
+ var _a;
383
+ const session = renderSurfaceState.session;
384
+ const target = currentRenderTarget;
385
+ if (!currentSource && !session && !target) {
357
386
  return;
358
387
  }
359
388
  const source = currentSource;
360
389
  const startedAt = Date.now();
361
390
  const version = requestScope.getCurrentVersion();
362
- await emitLifecycle(options, createOptions.onEvent, 'unload-start', source, version, startedAt, reason);
363
- await ((_b = (_a = renderSurfaceState.session) === null || _a === void 0 ? void 0 : _a.destroy) === null || _b === void 0 ? void 0 : _b.call(_a));
391
+ if (source) {
392
+ await emitLifecycle(options, createOptions.onEvent, 'unload-start', source, version, startedAt, reason);
393
+ }
394
+ await ((_a = session === null || session === void 0 ? void 0 : session.destroy) === null || _a === void 0 ? void 0 : _a.call(session));
395
+ removeRenderTarget(target || undefined);
364
396
  currentSource = null;
365
397
  applyFileViewerRenderSurfaceState(renderSurfaceState, {
366
398
  session: null,
@@ -371,36 +403,59 @@ export const createViewer = (container, createOptions = {}) => {
371
403
  zoomController.clearProvider();
372
404
  viewStateController.clearProvider();
373
405
  emitZoomAndOperationAvailabilityChange();
374
- await emitLifecycle(options, createOptions.onEvent, 'unload-complete', source, version, startedAt, reason);
406
+ if (source) {
407
+ await emitLifecycle(options, createOptions.onEvent, 'unload-complete', source, version, startedAt, reason);
408
+ }
375
409
  };
376
410
  return {
377
411
  container,
378
412
  async load(source) {
413
+ const version = requestScope.requestController.createVersion();
379
414
  await destroyCurrent('replace');
380
415
  await ensureRendererPluginsInstalled();
416
+ if (!requestScope.isCurrentRequest(version)) {
417
+ return null;
418
+ }
381
419
  const normalized = normalizeSource(source);
382
420
  currentSource = normalized;
383
- const version = requestScope.requestController.createVersion();
384
421
  const renderer = registry.getByExtension(normalized.extension);
385
422
  const startedAt = Date.now();
386
423
  await emitLifecycle(options, createOptions.onEvent, 'load-start', normalized, version, startedAt);
424
+ const target = createRenderTarget((renderer === null || renderer === void 0 ? void 0 : renderer.id) !== 'office-presentation');
387
425
  if (!(renderer === null || renderer === void 0 ? void 0 : renderer.load)) {
388
- renderMissingRendererState(container, normalized.extension, options);
426
+ renderMissingRendererState(target, normalized.extension, options);
389
427
  applyFileViewerRenderSurfaceState(renderSurfaceState, { session: null });
390
428
  syncWatermarkOverlay();
391
429
  emitZoomAndOperationAvailabilityChange();
392
430
  await emitLifecycle(options, createOptions.onEvent, 'load-complete', normalized, version, startedAt);
393
431
  return null;
394
432
  }
395
- const session = await renderer.load({
396
- source: normalized,
397
- surface: { container },
398
- options,
399
- signal: createOptions.signal,
400
- registerExportAdapter: adapter => {
401
- applyFileViewerRenderSurfaceState(renderSurfaceState, { exportAdapter: adapter });
402
- },
403
- });
433
+ let session;
434
+ try {
435
+ session = await renderer.load({
436
+ source: normalized,
437
+ surface: { container: target },
438
+ options,
439
+ signal: createOptions.signal,
440
+ registerExportAdapter: adapter => {
441
+ if (requestScope.isCurrentRequest(version)) {
442
+ applyFileViewerRenderSurfaceState(renderSurfaceState, { exportAdapter: adapter });
443
+ }
444
+ },
445
+ });
446
+ }
447
+ catch (error) {
448
+ if (!requestScope.isCurrentRequest(version)) {
449
+ removeRenderTarget(target);
450
+ return null;
451
+ }
452
+ removeRenderTarget(target);
453
+ throw error;
454
+ }
455
+ if (!requestScope.isCurrentRequest(version)) {
456
+ await disposeStaleSession(session, target);
457
+ return null;
458
+ }
404
459
  applyFileViewerRenderSurfaceState(renderSurfaceState, { session });
405
460
  syncWatermarkOverlay();
406
461
  zoomController.refreshProvider();
@@ -411,6 +466,7 @@ export const createViewer = (container, createOptions = {}) => {
411
466
  return session;
412
467
  },
413
468
  async destroy(reason = 'component-unmount') {
469
+ requestScope.requestController.createVersion();
414
470
  await destroyCurrent(reason);
415
471
  documentActions.destroyDocumentFeatures();
416
472
  zoomController.destroy();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/core",
3
- "version": "2.1.16",
3
+ "version": "2.1.17",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Framework-neutral modular TypeScript core for Flyfish File Viewer renderer orchestration, lifecycle APIs, search, zoom, print, and export",
@@ -35,7 +35,7 @@
35
35
  },
36
36
  "funding": {
37
37
  "type": "individual",
38
- "url": "https://dev.flyfish.group/shop"
38
+ "url": "https://dev.flyfish.group/donate?source=npm"
39
39
  },
40
40
  "homepage": "https://doc.file-viewer.app/",
41
41
  "main": "./dist/index.js",