@embedpdf/plugin-document-manager 2.0.0-next.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 (68) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.cjs +2 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +466 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/document-manager-plugin.d.ts +45 -0
  8. package/dist/lib/index.d.ts +7 -0
  9. package/dist/lib/manifest.d.ts +4 -0
  10. package/dist/lib/types.d.ts +80 -0
  11. package/dist/preact/adapter.d.ts +5 -0
  12. package/dist/preact/core.d.ts +1 -0
  13. package/dist/preact/index.cjs +2 -0
  14. package/dist/preact/index.cjs.map +1 -0
  15. package/dist/preact/index.d.ts +1 -0
  16. package/dist/preact/index.js +136 -0
  17. package/dist/preact/index.js.map +1 -0
  18. package/dist/react/adapter.d.ts +2 -0
  19. package/dist/react/core.d.ts +1 -0
  20. package/dist/react/index.cjs +2 -0
  21. package/dist/react/index.cjs.map +1 -0
  22. package/dist/react/index.d.ts +1 -0
  23. package/dist/react/index.js +135 -0
  24. package/dist/react/index.js.map +1 -0
  25. package/dist/shared/components/document-content.d.ts +27 -0
  26. package/dist/shared/components/document-context.d.ts +42 -0
  27. package/dist/shared/components/file-picker.d.ts +1 -0
  28. package/dist/shared/components/index.d.ts +3 -0
  29. package/dist/shared/hooks/index.d.ts +1 -0
  30. package/dist/shared/hooks/use-document-manager.d.ts +23 -0
  31. package/dist/shared/index.d.ts +4 -0
  32. package/dist/shared-preact/components/document-content.d.ts +27 -0
  33. package/dist/shared-preact/components/document-context.d.ts +42 -0
  34. package/dist/shared-preact/components/file-picker.d.ts +1 -0
  35. package/dist/shared-preact/components/index.d.ts +3 -0
  36. package/dist/shared-preact/hooks/index.d.ts +1 -0
  37. package/dist/shared-preact/hooks/use-document-manager.d.ts +23 -0
  38. package/dist/shared-preact/index.d.ts +4 -0
  39. package/dist/shared-react/components/document-content.d.ts +27 -0
  40. package/dist/shared-react/components/document-context.d.ts +42 -0
  41. package/dist/shared-react/components/file-picker.d.ts +1 -0
  42. package/dist/shared-react/components/index.d.ts +3 -0
  43. package/dist/shared-react/hooks/index.d.ts +1 -0
  44. package/dist/shared-react/hooks/use-document-manager.d.ts +23 -0
  45. package/dist/shared-react/index.d.ts +4 -0
  46. package/dist/svelte/components/DocumentContent.svelte.d.ts +15 -0
  47. package/dist/svelte/components/DocumentContext.svelte.d.ts +18 -0
  48. package/dist/svelte/components/FilePicker.svelte.d.ts +3 -0
  49. package/dist/svelte/components/index.d.ts +3 -0
  50. package/dist/svelte/hooks/index.d.ts +1 -0
  51. package/dist/svelte/hooks/use-document-manager.svelte.d.ts +26 -0
  52. package/dist/svelte/index.cjs +2 -0
  53. package/dist/svelte/index.cjs.map +1 -0
  54. package/dist/svelte/index.d.ts +4 -0
  55. package/dist/svelte/index.js +175 -0
  56. package/dist/svelte/index.js.map +1 -0
  57. package/dist/vue/components/document-content.vue.d.ts +29 -0
  58. package/dist/vue/components/document-context.vue.d.ts +28 -0
  59. package/dist/vue/components/file-picker.vue.d.ts +3 -0
  60. package/dist/vue/components/index.d.ts +3 -0
  61. package/dist/vue/hooks/index.d.ts +1 -0
  62. package/dist/vue/hooks/use-document-manager.d.ts +17 -0
  63. package/dist/vue/index.cjs +2 -0
  64. package/dist/vue/index.cjs.map +1 -0
  65. package/dist/vue/index.d.ts +4 -0
  66. package/dist/vue/index.js +169 -0
  67. package/dist/vue/index.js.map +1 -0
  68. package/package.json +80 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 CloudPDF
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),t=require("@embedpdf/models"),o=class extends e.BasePlugin{constructor(t,o,n){super(t,o),this.id=t,this.documentOpened$=e.createBehaviorEmitter(),this.documentClosed$=e.createBehaviorEmitter(),this.activeDocumentChanged$=e.createBehaviorEmitter(),this.documentError$=e.createBehaviorEmitter(),this.documentOrderChanged$=e.createBehaviorEmitter(),this.openFileRequest$=e.createEmitter(),this.loadOptions=new Map,this.maxDocuments=null==n?void 0:n.maxDocuments}buildCapability(){return{openFileDialog:e=>this.openFileDialog(e),openDocumentUrl:e=>this.openDocumentUrl(e),openDocumentBuffer:e=>this.openDocumentBuffer(e),retryDocument:(e,t)=>this.retryDocument(e,t),closeDocument:e=>this.closeDocument(e),closeAllDocuments:()=>this.closeAllDocuments(),setActiveDocument:t=>{if(!this.isDocumentOpen(t))throw new Error(`Cannot set active document: ${t} is not open`);this.dispatchCoreAction(e.setActiveDocument(t))},getActiveDocumentId:()=>this.coreState.core.activeDocumentId,getActiveDocument:()=>{var e;const t=this.coreState.core.activeDocumentId;return t?(null==(e=this.coreState.core.documents[t])?void 0:e.document)??null:null},getDocumentOrder:()=>this.coreState.core.documentOrder,moveDocument:(t,o)=>{this.dispatchCoreAction(e.moveDocument(t,o))},swapDocuments:(t,o)=>{const n=this.coreState.core.documentOrder,r=n.indexOf(t),s=n.indexOf(o);if(-1===r||-1===s)throw new Error("One or both documents not found in order");const c=[...n];[c[r],c[s]]=[c[s],c[r]],this.dispatchCoreAction(e.reorderDocuments(c))},getDocument:e=>{var t;return(null==(t=this.coreState.core.documents[e])?void 0:t.document)??null},getDocumentState:e=>this.coreState.core.documents[e]??null,getOpenDocuments:()=>this.coreState.core.documentOrder.map(e=>this.coreState.core.documents[e]).filter(e=>null!==e),isDocumentOpen:e=>this.isDocumentOpen(e),getDocumentCount:()=>Object.keys(this.coreState.core.documents).length,getDocumentIndex:e=>this.coreState.core.documentOrder.indexOf(e),onDocumentOpened:this.documentOpened$.on,onDocumentClosed:this.documentClosed$.on,onDocumentError:this.documentError$.on,onActiveDocumentChanged:this.activeDocumentChanged$.on,onDocumentOrderChanged:this.documentOrderChanged$.on}}isDocumentOpen(e){return!!this.coreState.core.documents[e]}onDocumentLoaded(e){const t=this.coreState.core.documents[e];t&&"loaded"===t.status&&(this.loadOptions.delete(e),this.documentOpened$.emit(t),this.logger.info("DocumentManagerPlugin","DocumentOpened",`Document ${e} opened successfully`,{name:t.name}))}onDocumentClosed(e){this.loadOptions.delete(e),this.documentClosed$.emit(e),this.logger.info("DocumentManagerPlugin","DocumentClosed",`Document ${e} closed`)}onActiveDocumentChanged(e,t){this.activeDocumentChanged$.emit({previousDocumentId:e,currentDocumentId:t}),this.logger.info("DocumentManagerPlugin","ActiveDocumentChanged",`Active document changed from ${e} to ${t}`)}onCoreStoreUpdated(e,t){e.core.documentOrder!==t.core.documentOrder&&this.documentOrderChanged$.emit({order:t.core.documentOrder})}onOpenFileRequest(e){return this.openFileRequest$.on(e)}openDocumentUrl(o){const n=new t.Task,r=o.documentId||this.generateDocumentId(),s=this.checkDocumentLimit();if(s)return n.reject(s),n;const c=this.extractNameFromUrl(o.url);this.loadOptions.set(r,o),this.dispatchCoreAction(e.startLoadingDocument(r,c,o.scale,o.rotation,!!o.password,o.autoActivate)),this.logger.info("DocumentManagerPlugin","OpenDocumentUrl",`Starting to load document from URL: ${o.url}`,{documentId:r,passwordProvided:!!o.password});const i={id:r,url:o.url},a=this.engine.openDocumentUrl(i,{password:o.password,mode:o.mode,requestOptions:o.requestOptions});return n.resolve({documentId:r,task:a}),this.handleLoadTask(r,a,"OpenDocumentUrl"),n}openDocumentBuffer(o){const n=new t.Task,r=this.checkDocumentLimit();if(r)return n.reject(r),n;const s=o.documentId||this.generateDocumentId();this.loadOptions.set(s,o),this.dispatchCoreAction(e.startLoadingDocument(s,o.name,o.scale,o.rotation,!!o.password,o.autoActivate)),this.logger.info("DocumentManagerPlugin","OpenDocumentBuffer",`Starting to load document from buffer: ${o.name}`,{documentId:s,passwordProvided:!!o.password});const c={id:s,content:o.buffer},i=this.engine.openDocumentBuffer(c,{password:o.password});return n.resolve({documentId:s,task:i}),this.handleLoadTask(s,i,"OpenDocumentBuffer"),n}retryDocument(o,n){const r=new t.Task,s=this.validateRetry(o);if(!s.valid)return r.reject(s.error),r;const c={...this.loadOptions.get(o),...(null==n?void 0:n.password)&&{password:n.password}};this.loadOptions.set(o,c),this.dispatchCoreAction(e.retryLoadingDocument(o,!!(null==n?void 0:n.password))),this.logger.info("DocumentManagerPlugin","RetryDocument",`Retrying to load document ${o}`,{passwordProvided:!!(null==n?void 0:n.password)});const i="url"in c?this.retryUrlDocument(o,c):this.retryBufferDocument(o,c);return r.resolve({documentId:o,task:i}),this.handleLoadTask(o,i,"RetryDocument"),r}openFileDialog(e){const o=new t.Task;return this.openFileRequest$.emit({task:o,options:e}),o}closeDocument(o){const n=new t.Task,r=this.coreState.core.documents[o];return r?("loaded"===r.status&&r.document?this.engine.closeDocument(r.document).wait(()=>{this.dispatchCoreAction(e.closeDocument(o)),n.resolve()},e=>{this.logger.error("DocumentManagerPlugin","CloseDocument",`Failed to close document ${o}`,e),n.fail(e)}):(this.logger.info("DocumentManagerPlugin","CloseDocument",`Closing document ${o} in ${r.status} state (skipping engine close)`),this.dispatchCoreAction(e.closeDocument(o)),n.resolve()),n):(this.logger.warn("DocumentManagerPlugin","CloseDocument",`Cannot close document ${o}: not found in state`),n.resolve(),n)}closeAllDocuments(){const e=Object.keys(this.coreState.core.documents),o=e.map(e=>this.closeDocument(e));return this.logger.info("DocumentManagerPlugin","CloseAllDocuments",`Closing ${e.length} documents`),t.Task.all(o)}checkDocumentLimit(){return this.maxDocuments&&Object.keys(this.coreState.core.documents).length>=this.maxDocuments?{code:t.PdfErrorCode.Unknown,message:`Maximum number of documents (${this.maxDocuments}) reached`}:null}validateRetry(e){const o=this.coreState.core.documents[e];return o?"loaded"===o.status?{valid:!1,error:{code:t.PdfErrorCode.Unknown,message:`Document ${e} is already loaded successfully`}}:"error"!==o.status?{valid:!1,error:{code:t.PdfErrorCode.Unknown,message:`Document ${e} is not in error state (current state: ${o.status})`}}:this.loadOptions.has(e)?{valid:!0}:{valid:!1,error:{code:t.PdfErrorCode.Unknown,message:`No retry information available for document ${e}`}}:{valid:!1,error:{code:t.PdfErrorCode.NotFound,message:`Document ${e} not found`}}}retryUrlDocument(e,t){const o={id:e,url:t.url};return this.engine.openDocumentUrl(o,{password:t.password,mode:t.mode,requestOptions:t.requestOptions})}retryBufferDocument(e,t){const o={id:e,content:t.buffer};return this.engine.openDocumentBuffer(o,{password:t.password})}handleLoadTask(t,o,n){o.wait(o=>{this.dispatchCoreAction(e.setDocumentLoaded(t,o))},e=>{this.handleLoadError(t,e,n)})}handleLoadError(t,o,n){var r,s,c;const i=(null==(r=o.reason)?void 0:r.message)||"Failed to load document";this.logger.error("DocumentManagerPlugin",n,"Failed to load document",o),this.dispatchCoreAction(e.setDocumentError(t,i,null==(s=o.reason)?void 0:s.code,o.reason)),this.documentError$.emit({documentId:t,message:i,code:null==(c=o.reason)?void 0:c.code,reason:o.reason})}generateDocumentId(){return`doc-${Date.now()}-${Math.random().toString(36).substr(2,9)}`}extractNameFromUrl(e){try{const t=new URL(e),o=t.pathname.split("/").pop()||"document.pdf";return decodeURIComponent(o)}catch{return"document.pdf"}}async initialize(e){var t;if(this.logger.info("DocumentManagerPlugin","Initialize","Document Manager Plugin initialized",{maxDocuments:this.maxDocuments,initialDocumentsCount:(null==(t=e.initialDocuments)?void 0:t.length)??0}),e.initialDocuments&&e.initialDocuments.length>0)for(const n of e.initialDocuments)try{"buffer"in n?this.openDocumentBuffer(n):"url"in n&&this.openDocumentUrl(n)}catch(o){this.logger.error("DocumentManagerPlugin","Initialize","Failed to initiate initial document load",o)}}async destroy(){await this.closeAllDocuments().toPromise(),this.loadOptions.clear(),this.documentOpened$.clear(),this.documentClosed$.clear(),this.activeDocumentChanged$.clear(),this.documentOrderChanged$.clear(),this.documentError$.clear(),super.destroy()}};o.id="document-manager";let n=o;const r="document-manager",s={id:r,name:"Document Manager Plugin",version:"1.0.0",provides:["document-manager"],requires:[],optional:[],defaultConfig:{enabled:!0,maxDocuments:10}},c={manifest:s,create:(e,t)=>new n(r,e,t),reducer:e=>e,initialState:{}};exports.DOCUMENT_MANAGER_PLUGIN_ID=r,exports.DocumentManagerPlugin=n,exports.DocumentManagerPluginPackage=c,exports.manifest=s;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/lib/document-manager-plugin.ts","../src/lib/manifest.ts","../src/lib/index.ts"],"sourcesContent":["import {\n BasePlugin,\n PluginRegistry,\n createBehaviorEmitter,\n startLoadingDocument,\n setDocumentLoaded,\n setDocumentError,\n retryLoadingDocument,\n closeDocument as closeDocumentAction,\n setActiveDocument as setActiveDocumentAction,\n moveDocument as moveDocumentAction,\n reorderDocuments as reorderDocumentsAction,\n DocumentState,\n Unsubscribe,\n Listener,\n createEmitter,\n} from '@embedpdf/core';\nimport {\n PdfDocumentObject,\n Task,\n PdfFile,\n PdfFileUrl,\n PdfErrorReason,\n PdfErrorCode,\n} from '@embedpdf/models';\n\nimport {\n DocumentManagerPluginConfig,\n DocumentManagerCapability,\n DocumentChangeEvent,\n DocumentOrderChangeEvent,\n LoadDocumentUrlOptions,\n LoadDocumentBufferOptions,\n RetryOptions,\n DocumentErrorEvent,\n OpenDocumentResponse,\n OpenFileDialogOptions,\n} from './types';\n\nexport class DocumentManagerPlugin extends BasePlugin<\n DocumentManagerPluginConfig,\n DocumentManagerCapability\n> {\n static readonly id = 'document-manager' as const;\n\n private readonly documentOpened$ = createBehaviorEmitter<DocumentState>();\n private readonly documentClosed$ = createBehaviorEmitter<string>();\n private readonly activeDocumentChanged$ = createBehaviorEmitter<DocumentChangeEvent>();\n private readonly documentError$ = createBehaviorEmitter<DocumentErrorEvent>();\n\n private readonly documentOrderChanged$ = createBehaviorEmitter<DocumentOrderChangeEvent>();\n\n private readonly openFileRequest$ = createEmitter<{\n task: Task<OpenDocumentResponse, PdfErrorReason>;\n options?: OpenFileDialogOptions;\n }>();\n\n private maxDocuments?: number;\n\n private loadOptions = new Map<string, LoadDocumentUrlOptions | LoadDocumentBufferOptions>();\n\n constructor(\n public readonly id: string,\n registry: PluginRegistry,\n config?: DocumentManagerPluginConfig,\n ) {\n super(id, registry);\n this.maxDocuments = config?.maxDocuments;\n }\n\n protected buildCapability(): DocumentManagerCapability {\n return {\n // Document lifecycle - orchestration only\n openFileDialog: (options) => this.openFileDialog(options),\n openDocumentUrl: (options) => this.openDocumentUrl(options),\n openDocumentBuffer: (options) => this.openDocumentBuffer(options),\n retryDocument: (documentId, options) => this.retryDocument(documentId, options),\n closeDocument: (documentId) => this.closeDocument(documentId),\n closeAllDocuments: () => this.closeAllDocuments(),\n\n setActiveDocument: (documentId) => {\n if (!this.isDocumentOpen(documentId)) {\n throw new Error(`Cannot set active document: ${documentId} is not open`);\n }\n this.dispatchCoreAction(setActiveDocumentAction(documentId));\n },\n\n getActiveDocumentId: () => this.coreState.core.activeDocumentId,\n getActiveDocument: () => {\n const activeId = this.coreState.core.activeDocumentId;\n if (!activeId) return null;\n return this.coreState.core.documents[activeId]?.document ?? null;\n },\n\n getDocumentOrder: () => this.coreState.core.documentOrder,\n\n moveDocument: (documentId, toIndex) => {\n this.dispatchCoreAction(moveDocumentAction(documentId, toIndex));\n },\n\n swapDocuments: (id1, id2) => {\n const order = this.coreState.core.documentOrder;\n const index1 = order.indexOf(id1);\n const index2 = order.indexOf(id2);\n\n if (index1 === -1 || index2 === -1) {\n throw new Error('One or both documents not found in order');\n }\n\n const newOrder = [...order];\n [newOrder[index1], newOrder[index2]] = [newOrder[index2], newOrder[index1]];\n\n this.dispatchCoreAction(reorderDocumentsAction(newOrder));\n },\n\n getDocument: (documentId) => {\n return this.coreState.core.documents[documentId]?.document ?? null;\n },\n\n getDocumentState: (documentId) => {\n return this.coreState.core.documents[documentId] ?? null;\n },\n\n getOpenDocuments: () => {\n return this.coreState.core.documentOrder\n .map((documentId) => this.coreState.core.documents[documentId])\n .filter((state): state is DocumentState => state !== null);\n },\n\n isDocumentOpen: (documentId) => this.isDocumentOpen(documentId),\n\n getDocumentCount: () => {\n return Object.keys(this.coreState.core.documents).length;\n },\n\n getDocumentIndex: (documentId) => {\n return this.coreState.core.documentOrder.indexOf(documentId);\n },\n\n // Events\n onDocumentOpened: this.documentOpened$.on,\n onDocumentClosed: this.documentClosed$.on,\n onDocumentError: this.documentError$.on,\n onActiveDocumentChanged: this.activeDocumentChanged$.on,\n onDocumentOrderChanged: this.documentOrderChanged$.on,\n };\n }\n\n /**\n * Check if a document is currently open\n */\n private isDocumentOpen(documentId: string): boolean {\n return !!this.coreState.core.documents[documentId];\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoaded(documentId: string): void {\n const docState = this.coreState.core.documents[documentId];\n if (!docState || docState.status !== 'loaded') return;\n\n // Clean up load options to free memory\n this.loadOptions.delete(documentId);\n\n // Emit opened event\n this.documentOpened$.emit(docState);\n\n this.logger.info(\n 'DocumentManagerPlugin',\n 'DocumentOpened',\n `Document ${documentId} opened successfully`,\n { name: docState.name },\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Clean up load options\n this.loadOptions.delete(documentId);\n\n // Emit closed event\n this.documentClosed$.emit(documentId);\n\n this.logger.info('DocumentManagerPlugin', 'DocumentClosed', `Document ${documentId} closed`);\n }\n\n protected override onActiveDocumentChanged(\n previousId: string | null,\n currentId: string | null,\n ): void {\n this.activeDocumentChanged$.emit({\n previousDocumentId: previousId,\n currentDocumentId: currentId,\n });\n\n this.logger.info(\n 'DocumentManagerPlugin',\n 'ActiveDocumentChanged',\n `Active document changed from ${previousId} to ${currentId}`,\n );\n }\n\n protected override onCoreStoreUpdated(oldState: any, newState: any): void {\n // Emit order change event if order changed\n if (oldState.core.documentOrder !== newState.core.documentOrder) {\n this.documentOrderChanged$.emit({\n order: newState.core.documentOrder,\n });\n }\n }\n\n public onOpenFileRequest(\n handler: Listener<{\n task: Task<OpenDocumentResponse, PdfErrorReason>;\n options?: OpenFileDialogOptions;\n }>,\n ): Unsubscribe {\n return this.openFileRequest$.on(handler);\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Loading (orchestration only - no state management)\n // ─────────────────────────────────────────────────────────\n\n private openDocumentUrl(\n options: LoadDocumentUrlOptions,\n ): Task<OpenDocumentResponse, PdfErrorReason> {\n const task = new Task<OpenDocumentResponse, PdfErrorReason>();\n\n const documentId = options.documentId || this.generateDocumentId();\n\n // Check limit\n const limitError = this.checkDocumentLimit();\n if (limitError) {\n task.reject(limitError);\n return task;\n }\n\n const documentName = this.extractNameFromUrl(options.url);\n\n // Store options for potential retry\n this.loadOptions.set(documentId, options);\n\n this.dispatchCoreAction(\n startLoadingDocument(\n documentId,\n documentName,\n options.scale,\n options.rotation,\n !!options.password,\n options.autoActivate,\n ),\n );\n\n this.logger.info(\n 'DocumentManagerPlugin',\n 'OpenDocumentUrl',\n `Starting to load document from URL: ${options.url}`,\n { documentId, passwordProvided: !!options.password },\n );\n\n // Create file object and call engine\n const file: PdfFileUrl = {\n id: documentId,\n url: options.url,\n };\n const engineTask = this.engine.openDocumentUrl(file, {\n password: options.password,\n mode: options.mode,\n requestOptions: options.requestOptions,\n });\n\n task.resolve({\n documentId,\n task: engineTask,\n });\n\n // Handle result\n this.handleLoadTask(documentId, engineTask, 'OpenDocumentUrl');\n\n return task;\n }\n\n private openDocumentBuffer(\n options: LoadDocumentBufferOptions,\n ): Task<OpenDocumentResponse, PdfErrorReason> {\n const task = new Task<OpenDocumentResponse, PdfErrorReason>();\n\n const limitError = this.checkDocumentLimit();\n if (limitError) {\n task.reject(limitError);\n return task;\n }\n\n const documentId = options.documentId || this.generateDocumentId();\n\n // Store options for potential retry\n this.loadOptions.set(documentId, options);\n\n this.dispatchCoreAction(\n startLoadingDocument(\n documentId,\n options.name,\n options.scale,\n options.rotation,\n !!options.password,\n options.autoActivate,\n ),\n );\n\n this.logger.info(\n 'DocumentManagerPlugin',\n 'OpenDocumentBuffer',\n `Starting to load document from buffer: ${options.name}`,\n { documentId, passwordProvided: !!options.password },\n );\n\n // Create file object and call engine\n const file: PdfFile = {\n id: documentId,\n content: options.buffer,\n };\n const engineTask = this.engine.openDocumentBuffer(file, {\n password: options.password,\n });\n\n task.resolve({\n documentId,\n task: engineTask,\n });\n\n // Handle result\n this.handleLoadTask(documentId, engineTask, 'OpenDocumentBuffer');\n\n return task;\n }\n\n private retryDocument(\n documentId: string,\n retryOptions?: RetryOptions,\n ): Task<OpenDocumentResponse, PdfErrorReason> {\n const task = new Task<OpenDocumentResponse, PdfErrorReason>();\n\n // Validate retry\n const validation = this.validateRetry(documentId);\n if (!validation.valid) {\n task.reject(validation.error!);\n return task;\n }\n\n const originalOptions = this.loadOptions.get(documentId)!;\n\n // Merge retry options (e.g., new password)\n const mergedOptions = {\n ...originalOptions,\n ...(retryOptions?.password && { password: retryOptions.password }),\n };\n\n // Update stored options\n this.loadOptions.set(documentId, mergedOptions);\n\n // Set back to loading state\n this.dispatchCoreAction(retryLoadingDocument(documentId, !!retryOptions?.password));\n\n this.logger.info(\n 'DocumentManagerPlugin',\n 'RetryDocument',\n `Retrying to load document ${documentId}`,\n { passwordProvided: !!retryOptions?.password },\n );\n\n // Execute retry based on type\n const engineTask =\n 'url' in mergedOptions\n ? this.retryUrlDocument(documentId, mergedOptions)\n : this.retryBufferDocument(documentId, mergedOptions);\n\n task.resolve({\n documentId,\n task: engineTask,\n });\n\n // Handle result\n this.handleLoadTask(documentId, engineTask, 'RetryDocument');\n\n return task;\n }\n\n private openFileDialog(\n options?: OpenFileDialogOptions,\n ): Task<OpenDocumentResponse, PdfErrorReason> {\n const task = new Task<OpenDocumentResponse, PdfErrorReason>();\n this.openFileRequest$.emit({ task, options });\n return task;\n }\n\n private closeDocument(documentId: string): Task<void, PdfErrorReason> {\n const task = new Task<void, PdfErrorReason>();\n\n const docState = this.coreState.core.documents[documentId];\n if (!docState) {\n this.logger.warn(\n 'DocumentManagerPlugin',\n 'CloseDocument',\n `Cannot close document ${documentId}: not found in state`,\n );\n task.resolve();\n return task;\n }\n\n // ✅ SIMPLIFIED: Just dispatch - reducer calculates next active!\n if (docState.status === 'loaded' && docState.document) {\n this.engine.closeDocument(docState.document).wait(\n () => {\n this.dispatchCoreAction(closeDocumentAction(documentId));\n task.resolve();\n },\n (error) => {\n this.logger.error(\n 'DocumentManagerPlugin',\n 'CloseDocument',\n `Failed to close document ${documentId}`,\n error,\n );\n task.fail(error);\n },\n );\n } else {\n // Document is not loaded (error, loading, etc.), just clean up state\n this.logger.info(\n 'DocumentManagerPlugin',\n 'CloseDocument',\n `Closing document ${documentId} in ${docState.status} state (skipping engine close)`,\n );\n this.dispatchCoreAction(closeDocumentAction(documentId));\n task.resolve();\n }\n\n return task;\n }\n\n private closeAllDocuments(): Task<void[], PdfErrorReason> {\n const documentIds = Object.keys(this.coreState.core.documents);\n const tasks = documentIds.map((documentId) => this.closeDocument(documentId));\n\n this.logger.info(\n 'DocumentManagerPlugin',\n 'CloseAllDocuments',\n `Closing ${documentIds.length} documents`,\n );\n\n return Task.all(tasks);\n }\n\n // ─────────────────────────────────────────────────────────\n // Helper Methods\n // ─────────────────────────────────────────────────────────\n\n private checkDocumentLimit(): PdfErrorReason | null {\n if (\n this.maxDocuments &&\n Object.keys(this.coreState.core.documents).length >= this.maxDocuments\n ) {\n return {\n code: PdfErrorCode.Unknown,\n message: `Maximum number of documents (${this.maxDocuments}) reached`,\n };\n }\n return null;\n }\n\n private validateRetry(documentId: string): {\n valid: boolean;\n error?: PdfErrorReason;\n } {\n const docState = this.coreState.core.documents[documentId];\n\n if (!docState) {\n return {\n valid: false,\n error: {\n code: PdfErrorCode.NotFound,\n message: `Document ${documentId} not found`,\n },\n };\n }\n\n if (docState.status === 'loaded') {\n return {\n valid: false,\n error: {\n code: PdfErrorCode.Unknown,\n message: `Document ${documentId} is already loaded successfully`,\n },\n };\n }\n\n if (docState.status !== 'error') {\n return {\n valid: false,\n error: {\n code: PdfErrorCode.Unknown,\n message: `Document ${documentId} is not in error state (current state: ${docState.status})`,\n },\n };\n }\n\n if (!this.loadOptions.has(documentId)) {\n return {\n valid: false,\n error: {\n code: PdfErrorCode.Unknown,\n message: `No retry information available for document ${documentId}`,\n },\n };\n }\n\n return { valid: true };\n }\n\n private retryUrlDocument(\n documentId: string,\n options: LoadDocumentUrlOptions,\n ): Task<PdfDocumentObject, PdfErrorReason> {\n const file: PdfFileUrl = {\n id: documentId,\n url: options.url,\n };\n\n return this.engine.openDocumentUrl(file, {\n password: options.password,\n mode: options.mode,\n requestOptions: options.requestOptions,\n });\n }\n\n private retryBufferDocument(\n documentId: string,\n options: LoadDocumentBufferOptions,\n ): Task<PdfDocumentObject, PdfErrorReason> {\n const file: PdfFile = {\n id: documentId,\n content: options.buffer,\n };\n\n return this.engine.openDocumentBuffer(file, {\n password: options.password,\n });\n }\n\n private handleLoadTask(\n documentId: string,\n engineTask: Task<PdfDocumentObject, PdfErrorReason>,\n context: string,\n ): void {\n engineTask.wait(\n (pdfDocument) => {\n this.dispatchCoreAction(setDocumentLoaded(documentId, pdfDocument));\n },\n (error) => {\n this.handleLoadError(documentId, error, context);\n },\n );\n }\n\n private handleLoadError(documentId: string, error: any, context: string): void {\n const errorMessage = error.reason?.message || 'Failed to load document';\n\n this.logger.error('DocumentManagerPlugin', context, 'Failed to load document', error);\n\n this.dispatchCoreAction(\n setDocumentError(documentId, errorMessage, error.reason?.code, error.reason),\n );\n\n this.documentError$.emit({\n documentId,\n message: errorMessage,\n code: error.reason?.code,\n reason: error.reason,\n });\n }\n\n private generateDocumentId(): string {\n return `doc-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private extractNameFromUrl(url: string): string {\n try {\n const urlObj = new URL(url);\n const pathname = urlObj.pathname;\n const filename = pathname.split('/').pop() || 'document.pdf';\n return decodeURIComponent(filename);\n } catch {\n return 'document.pdf';\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Plugin Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(config: DocumentManagerPluginConfig): Promise<void> {\n this.logger.info('DocumentManagerPlugin', 'Initialize', 'Document Manager Plugin initialized', {\n maxDocuments: this.maxDocuments,\n initialDocumentsCount: config.initialDocuments?.length ?? 0,\n });\n\n // Handle initial documents from config\n if (config.initialDocuments && config.initialDocuments.length > 0) {\n // Process strictly in order\n for (const docConfig of config.initialDocuments) {\n try {\n // Type guard to distinguish between URL and Buffer options\n if ('buffer' in docConfig) {\n this.openDocumentBuffer(docConfig);\n } else if ('url' in docConfig) {\n this.openDocumentUrl(docConfig);\n }\n } catch (error) {\n this.logger.error(\n 'DocumentManagerPlugin',\n 'Initialize',\n 'Failed to initiate initial document load',\n error,\n );\n }\n }\n }\n }\n\n async destroy(): Promise<void> {\n // Close all documents\n await this.closeAllDocuments().toPromise();\n\n // Clear load options\n this.loadOptions.clear();\n\n // Clear emitters\n this.documentOpened$.clear();\n this.documentClosed$.clear();\n this.activeDocumentChanged$.clear();\n this.documentOrderChanged$.clear();\n this.documentError$.clear();\n\n super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { DocumentManagerPluginConfig } from './types';\n\nexport const DOCUMENT_MANAGER_PLUGIN_ID = 'document-manager';\n\nexport const manifest: PluginManifest<DocumentManagerPluginConfig> = {\n id: DOCUMENT_MANAGER_PLUGIN_ID,\n name: 'Document Manager Plugin',\n version: '1.0.0',\n provides: ['document-manager'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n maxDocuments: 10,\n },\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { DocumentManagerPlugin } from './document-manager-plugin';\nimport { manifest, DOCUMENT_MANAGER_PLUGIN_ID } from './manifest';\nimport { DocumentManagerPluginConfig } from './types';\n\nexport const DocumentManagerPluginPackage: PluginPackage<\n DocumentManagerPlugin,\n DocumentManagerPluginConfig\n> = {\n manifest,\n create: (registry, config) =>\n new DocumentManagerPlugin(DOCUMENT_MANAGER_PLUGIN_ID, registry, config),\n reducer: (state) => state,\n initialState: {},\n};\n\nexport * from './document-manager-plugin';\nexport * from './types';\nexport * from './manifest';\n"],"names":["_DocumentManagerPlugin","BasePlugin","constructor","id","registry","config","super","this","documentOpened$","createBehaviorEmitter","documentClosed$","activeDocumentChanged$","documentError$","documentOrderChanged$","openFileRequest$","createEmitter","loadOptions","Map","maxDocuments","buildCapability","openFileDialog","options","openDocumentUrl","openDocumentBuffer","retryDocument","documentId","closeDocument","closeAllDocuments","setActiveDocument","isDocumentOpen","Error","dispatchCoreAction","setActiveDocumentAction","getActiveDocumentId","coreState","core","activeDocumentId","getActiveDocument","activeId","_a","documents","document","getDocumentOrder","documentOrder","moveDocument","toIndex","moveDocumentAction","swapDocuments","id1","id2","order","index1","indexOf","index2","newOrder","reorderDocumentsAction","getDocument","getDocumentState","getOpenDocuments","map","filter","state","getDocumentCount","Object","keys","length","getDocumentIndex","onDocumentOpened","on","onDocumentClosed","onDocumentError","onActiveDocumentChanged","onDocumentOrderChanged","onDocumentLoaded","docState","status","delete","emit","logger","info","name","previousId","currentId","previousDocumentId","currentDocumentId","onCoreStoreUpdated","oldState","newState","onOpenFileRequest","handler","task","Task","generateDocumentId","limitError","checkDocumentLimit","reject","documentName","extractNameFromUrl","url","set","startLoadingDocument","scale","rotation","password","autoActivate","passwordProvided","file","engineTask","engine","mode","requestOptions","resolve","handleLoadTask","content","buffer","retryOptions","validation","validateRetry","valid","error","mergedOptions","get","retryLoadingDocument","retryUrlDocument","retryBufferDocument","wait","closeDocumentAction","fail","warn","documentIds","tasks","all","code","PdfErrorCode","Unknown","message","has","NotFound","context","pdfDocument","setDocumentLoaded","handleLoadError","errorMessage","reason","setDocumentError","_b","_c","Date","now","Math","random","toString","substr","urlObj","URL","filename","pathname","split","pop","decodeURIComponent","initialize","initialDocumentsCount","initialDocuments","docConfig","destroy","toPromise","clear","DocumentManagerPlugin","DOCUMENT_MANAGER_PLUGIN_ID","manifest","version","provides","requires","optional","defaultConfig","enabled","DocumentManagerPluginPackage","create","reducer","initialState"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './lib';
package/dist/index.js ADDED
@@ -0,0 +1,466 @@
1
+ import { BasePlugin, createBehaviorEmitter, createEmitter, reorderDocuments, moveDocument, setActiveDocument, startLoadingDocument, retryLoadingDocument, closeDocument, setDocumentLoaded, setDocumentError } from "@embedpdf/core";
2
+ import { Task, PdfErrorCode } from "@embedpdf/models";
3
+ const _DocumentManagerPlugin = class _DocumentManagerPlugin extends BasePlugin {
4
+ constructor(id, registry, config) {
5
+ super(id, registry);
6
+ this.id = id;
7
+ this.documentOpened$ = createBehaviorEmitter();
8
+ this.documentClosed$ = createBehaviorEmitter();
9
+ this.activeDocumentChanged$ = createBehaviorEmitter();
10
+ this.documentError$ = createBehaviorEmitter();
11
+ this.documentOrderChanged$ = createBehaviorEmitter();
12
+ this.openFileRequest$ = createEmitter();
13
+ this.loadOptions = /* @__PURE__ */ new Map();
14
+ this.maxDocuments = config == null ? void 0 : config.maxDocuments;
15
+ }
16
+ buildCapability() {
17
+ return {
18
+ // Document lifecycle - orchestration only
19
+ openFileDialog: (options) => this.openFileDialog(options),
20
+ openDocumentUrl: (options) => this.openDocumentUrl(options),
21
+ openDocumentBuffer: (options) => this.openDocumentBuffer(options),
22
+ retryDocument: (documentId, options) => this.retryDocument(documentId, options),
23
+ closeDocument: (documentId) => this.closeDocument(documentId),
24
+ closeAllDocuments: () => this.closeAllDocuments(),
25
+ setActiveDocument: (documentId) => {
26
+ if (!this.isDocumentOpen(documentId)) {
27
+ throw new Error(`Cannot set active document: ${documentId} is not open`);
28
+ }
29
+ this.dispatchCoreAction(setActiveDocument(documentId));
30
+ },
31
+ getActiveDocumentId: () => this.coreState.core.activeDocumentId,
32
+ getActiveDocument: () => {
33
+ var _a;
34
+ const activeId = this.coreState.core.activeDocumentId;
35
+ if (!activeId) return null;
36
+ return ((_a = this.coreState.core.documents[activeId]) == null ? void 0 : _a.document) ?? null;
37
+ },
38
+ getDocumentOrder: () => this.coreState.core.documentOrder,
39
+ moveDocument: (documentId, toIndex) => {
40
+ this.dispatchCoreAction(moveDocument(documentId, toIndex));
41
+ },
42
+ swapDocuments: (id1, id2) => {
43
+ const order = this.coreState.core.documentOrder;
44
+ const index1 = order.indexOf(id1);
45
+ const index2 = order.indexOf(id2);
46
+ if (index1 === -1 || index2 === -1) {
47
+ throw new Error("One or both documents not found in order");
48
+ }
49
+ const newOrder = [...order];
50
+ [newOrder[index1], newOrder[index2]] = [newOrder[index2], newOrder[index1]];
51
+ this.dispatchCoreAction(reorderDocuments(newOrder));
52
+ },
53
+ getDocument: (documentId) => {
54
+ var _a;
55
+ return ((_a = this.coreState.core.documents[documentId]) == null ? void 0 : _a.document) ?? null;
56
+ },
57
+ getDocumentState: (documentId) => {
58
+ return this.coreState.core.documents[documentId] ?? null;
59
+ },
60
+ getOpenDocuments: () => {
61
+ return this.coreState.core.documentOrder.map((documentId) => this.coreState.core.documents[documentId]).filter((state) => state !== null);
62
+ },
63
+ isDocumentOpen: (documentId) => this.isDocumentOpen(documentId),
64
+ getDocumentCount: () => {
65
+ return Object.keys(this.coreState.core.documents).length;
66
+ },
67
+ getDocumentIndex: (documentId) => {
68
+ return this.coreState.core.documentOrder.indexOf(documentId);
69
+ },
70
+ // Events
71
+ onDocumentOpened: this.documentOpened$.on,
72
+ onDocumentClosed: this.documentClosed$.on,
73
+ onDocumentError: this.documentError$.on,
74
+ onActiveDocumentChanged: this.activeDocumentChanged$.on,
75
+ onDocumentOrderChanged: this.documentOrderChanged$.on
76
+ };
77
+ }
78
+ /**
79
+ * Check if a document is currently open
80
+ */
81
+ isDocumentOpen(documentId) {
82
+ return !!this.coreState.core.documents[documentId];
83
+ }
84
+ // ─────────────────────────────────────────────────────────
85
+ // Document Lifecycle Hooks (from BasePlugin)
86
+ // ─────────────────────────────────────────────────────────
87
+ onDocumentLoaded(documentId) {
88
+ const docState = this.coreState.core.documents[documentId];
89
+ if (!docState || docState.status !== "loaded") return;
90
+ this.loadOptions.delete(documentId);
91
+ this.documentOpened$.emit(docState);
92
+ this.logger.info(
93
+ "DocumentManagerPlugin",
94
+ "DocumentOpened",
95
+ `Document ${documentId} opened successfully`,
96
+ { name: docState.name }
97
+ );
98
+ }
99
+ onDocumentClosed(documentId) {
100
+ this.loadOptions.delete(documentId);
101
+ this.documentClosed$.emit(documentId);
102
+ this.logger.info("DocumentManagerPlugin", "DocumentClosed", `Document ${documentId} closed`);
103
+ }
104
+ onActiveDocumentChanged(previousId, currentId) {
105
+ this.activeDocumentChanged$.emit({
106
+ previousDocumentId: previousId,
107
+ currentDocumentId: currentId
108
+ });
109
+ this.logger.info(
110
+ "DocumentManagerPlugin",
111
+ "ActiveDocumentChanged",
112
+ `Active document changed from ${previousId} to ${currentId}`
113
+ );
114
+ }
115
+ onCoreStoreUpdated(oldState, newState) {
116
+ if (oldState.core.documentOrder !== newState.core.documentOrder) {
117
+ this.documentOrderChanged$.emit({
118
+ order: newState.core.documentOrder
119
+ });
120
+ }
121
+ }
122
+ onOpenFileRequest(handler) {
123
+ return this.openFileRequest$.on(handler);
124
+ }
125
+ // ─────────────────────────────────────────────────────────
126
+ // Document Loading (orchestration only - no state management)
127
+ // ─────────────────────────────────────────────────────────
128
+ openDocumentUrl(options) {
129
+ const task = new Task();
130
+ const documentId = options.documentId || this.generateDocumentId();
131
+ const limitError = this.checkDocumentLimit();
132
+ if (limitError) {
133
+ task.reject(limitError);
134
+ return task;
135
+ }
136
+ const documentName = this.extractNameFromUrl(options.url);
137
+ this.loadOptions.set(documentId, options);
138
+ this.dispatchCoreAction(
139
+ startLoadingDocument(
140
+ documentId,
141
+ documentName,
142
+ options.scale,
143
+ options.rotation,
144
+ !!options.password,
145
+ options.autoActivate
146
+ )
147
+ );
148
+ this.logger.info(
149
+ "DocumentManagerPlugin",
150
+ "OpenDocumentUrl",
151
+ `Starting to load document from URL: ${options.url}`,
152
+ { documentId, passwordProvided: !!options.password }
153
+ );
154
+ const file = {
155
+ id: documentId,
156
+ url: options.url
157
+ };
158
+ const engineTask = this.engine.openDocumentUrl(file, {
159
+ password: options.password,
160
+ mode: options.mode,
161
+ requestOptions: options.requestOptions
162
+ });
163
+ task.resolve({
164
+ documentId,
165
+ task: engineTask
166
+ });
167
+ this.handleLoadTask(documentId, engineTask, "OpenDocumentUrl");
168
+ return task;
169
+ }
170
+ openDocumentBuffer(options) {
171
+ const task = new Task();
172
+ const limitError = this.checkDocumentLimit();
173
+ if (limitError) {
174
+ task.reject(limitError);
175
+ return task;
176
+ }
177
+ const documentId = options.documentId || this.generateDocumentId();
178
+ this.loadOptions.set(documentId, options);
179
+ this.dispatchCoreAction(
180
+ startLoadingDocument(
181
+ documentId,
182
+ options.name,
183
+ options.scale,
184
+ options.rotation,
185
+ !!options.password,
186
+ options.autoActivate
187
+ )
188
+ );
189
+ this.logger.info(
190
+ "DocumentManagerPlugin",
191
+ "OpenDocumentBuffer",
192
+ `Starting to load document from buffer: ${options.name}`,
193
+ { documentId, passwordProvided: !!options.password }
194
+ );
195
+ const file = {
196
+ id: documentId,
197
+ content: options.buffer
198
+ };
199
+ const engineTask = this.engine.openDocumentBuffer(file, {
200
+ password: options.password
201
+ });
202
+ task.resolve({
203
+ documentId,
204
+ task: engineTask
205
+ });
206
+ this.handleLoadTask(documentId, engineTask, "OpenDocumentBuffer");
207
+ return task;
208
+ }
209
+ retryDocument(documentId, retryOptions) {
210
+ const task = new Task();
211
+ const validation = this.validateRetry(documentId);
212
+ if (!validation.valid) {
213
+ task.reject(validation.error);
214
+ return task;
215
+ }
216
+ const originalOptions = this.loadOptions.get(documentId);
217
+ const mergedOptions = {
218
+ ...originalOptions,
219
+ ...(retryOptions == null ? void 0 : retryOptions.password) && { password: retryOptions.password }
220
+ };
221
+ this.loadOptions.set(documentId, mergedOptions);
222
+ this.dispatchCoreAction(retryLoadingDocument(documentId, !!(retryOptions == null ? void 0 : retryOptions.password)));
223
+ this.logger.info(
224
+ "DocumentManagerPlugin",
225
+ "RetryDocument",
226
+ `Retrying to load document ${documentId}`,
227
+ { passwordProvided: !!(retryOptions == null ? void 0 : retryOptions.password) }
228
+ );
229
+ const engineTask = "url" in mergedOptions ? this.retryUrlDocument(documentId, mergedOptions) : this.retryBufferDocument(documentId, mergedOptions);
230
+ task.resolve({
231
+ documentId,
232
+ task: engineTask
233
+ });
234
+ this.handleLoadTask(documentId, engineTask, "RetryDocument");
235
+ return task;
236
+ }
237
+ openFileDialog(options) {
238
+ const task = new Task();
239
+ this.openFileRequest$.emit({ task, options });
240
+ return task;
241
+ }
242
+ closeDocument(documentId) {
243
+ const task = new Task();
244
+ const docState = this.coreState.core.documents[documentId];
245
+ if (!docState) {
246
+ this.logger.warn(
247
+ "DocumentManagerPlugin",
248
+ "CloseDocument",
249
+ `Cannot close document ${documentId}: not found in state`
250
+ );
251
+ task.resolve();
252
+ return task;
253
+ }
254
+ if (docState.status === "loaded" && docState.document) {
255
+ this.engine.closeDocument(docState.document).wait(
256
+ () => {
257
+ this.dispatchCoreAction(closeDocument(documentId));
258
+ task.resolve();
259
+ },
260
+ (error) => {
261
+ this.logger.error(
262
+ "DocumentManagerPlugin",
263
+ "CloseDocument",
264
+ `Failed to close document ${documentId}`,
265
+ error
266
+ );
267
+ task.fail(error);
268
+ }
269
+ );
270
+ } else {
271
+ this.logger.info(
272
+ "DocumentManagerPlugin",
273
+ "CloseDocument",
274
+ `Closing document ${documentId} in ${docState.status} state (skipping engine close)`
275
+ );
276
+ this.dispatchCoreAction(closeDocument(documentId));
277
+ task.resolve();
278
+ }
279
+ return task;
280
+ }
281
+ closeAllDocuments() {
282
+ const documentIds = Object.keys(this.coreState.core.documents);
283
+ const tasks = documentIds.map((documentId) => this.closeDocument(documentId));
284
+ this.logger.info(
285
+ "DocumentManagerPlugin",
286
+ "CloseAllDocuments",
287
+ `Closing ${documentIds.length} documents`
288
+ );
289
+ return Task.all(tasks);
290
+ }
291
+ // ─────────────────────────────────────────────────────────
292
+ // Helper Methods
293
+ // ─────────────────────────────────────────────────────────
294
+ checkDocumentLimit() {
295
+ if (this.maxDocuments && Object.keys(this.coreState.core.documents).length >= this.maxDocuments) {
296
+ return {
297
+ code: PdfErrorCode.Unknown,
298
+ message: `Maximum number of documents (${this.maxDocuments}) reached`
299
+ };
300
+ }
301
+ return null;
302
+ }
303
+ validateRetry(documentId) {
304
+ const docState = this.coreState.core.documents[documentId];
305
+ if (!docState) {
306
+ return {
307
+ valid: false,
308
+ error: {
309
+ code: PdfErrorCode.NotFound,
310
+ message: `Document ${documentId} not found`
311
+ }
312
+ };
313
+ }
314
+ if (docState.status === "loaded") {
315
+ return {
316
+ valid: false,
317
+ error: {
318
+ code: PdfErrorCode.Unknown,
319
+ message: `Document ${documentId} is already loaded successfully`
320
+ }
321
+ };
322
+ }
323
+ if (docState.status !== "error") {
324
+ return {
325
+ valid: false,
326
+ error: {
327
+ code: PdfErrorCode.Unknown,
328
+ message: `Document ${documentId} is not in error state (current state: ${docState.status})`
329
+ }
330
+ };
331
+ }
332
+ if (!this.loadOptions.has(documentId)) {
333
+ return {
334
+ valid: false,
335
+ error: {
336
+ code: PdfErrorCode.Unknown,
337
+ message: `No retry information available for document ${documentId}`
338
+ }
339
+ };
340
+ }
341
+ return { valid: true };
342
+ }
343
+ retryUrlDocument(documentId, options) {
344
+ const file = {
345
+ id: documentId,
346
+ url: options.url
347
+ };
348
+ return this.engine.openDocumentUrl(file, {
349
+ password: options.password,
350
+ mode: options.mode,
351
+ requestOptions: options.requestOptions
352
+ });
353
+ }
354
+ retryBufferDocument(documentId, options) {
355
+ const file = {
356
+ id: documentId,
357
+ content: options.buffer
358
+ };
359
+ return this.engine.openDocumentBuffer(file, {
360
+ password: options.password
361
+ });
362
+ }
363
+ handleLoadTask(documentId, engineTask, context) {
364
+ engineTask.wait(
365
+ (pdfDocument) => {
366
+ this.dispatchCoreAction(setDocumentLoaded(documentId, pdfDocument));
367
+ },
368
+ (error) => {
369
+ this.handleLoadError(documentId, error, context);
370
+ }
371
+ );
372
+ }
373
+ handleLoadError(documentId, error, context) {
374
+ var _a, _b, _c;
375
+ const errorMessage = ((_a = error.reason) == null ? void 0 : _a.message) || "Failed to load document";
376
+ this.logger.error("DocumentManagerPlugin", context, "Failed to load document", error);
377
+ this.dispatchCoreAction(
378
+ setDocumentError(documentId, errorMessage, (_b = error.reason) == null ? void 0 : _b.code, error.reason)
379
+ );
380
+ this.documentError$.emit({
381
+ documentId,
382
+ message: errorMessage,
383
+ code: (_c = error.reason) == null ? void 0 : _c.code,
384
+ reason: error.reason
385
+ });
386
+ }
387
+ generateDocumentId() {
388
+ return `doc-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
389
+ }
390
+ extractNameFromUrl(url) {
391
+ try {
392
+ const urlObj = new URL(url);
393
+ const pathname = urlObj.pathname;
394
+ const filename = pathname.split("/").pop() || "document.pdf";
395
+ return decodeURIComponent(filename);
396
+ } catch {
397
+ return "document.pdf";
398
+ }
399
+ }
400
+ // ─────────────────────────────────────────────────────────
401
+ // Plugin Lifecycle
402
+ // ─────────────────────────────────────────────────────────
403
+ async initialize(config) {
404
+ var _a;
405
+ this.logger.info("DocumentManagerPlugin", "Initialize", "Document Manager Plugin initialized", {
406
+ maxDocuments: this.maxDocuments,
407
+ initialDocumentsCount: ((_a = config.initialDocuments) == null ? void 0 : _a.length) ?? 0
408
+ });
409
+ if (config.initialDocuments && config.initialDocuments.length > 0) {
410
+ for (const docConfig of config.initialDocuments) {
411
+ try {
412
+ if ("buffer" in docConfig) {
413
+ this.openDocumentBuffer(docConfig);
414
+ } else if ("url" in docConfig) {
415
+ this.openDocumentUrl(docConfig);
416
+ }
417
+ } catch (error) {
418
+ this.logger.error(
419
+ "DocumentManagerPlugin",
420
+ "Initialize",
421
+ "Failed to initiate initial document load",
422
+ error
423
+ );
424
+ }
425
+ }
426
+ }
427
+ }
428
+ async destroy() {
429
+ await this.closeAllDocuments().toPromise();
430
+ this.loadOptions.clear();
431
+ this.documentOpened$.clear();
432
+ this.documentClosed$.clear();
433
+ this.activeDocumentChanged$.clear();
434
+ this.documentOrderChanged$.clear();
435
+ this.documentError$.clear();
436
+ super.destroy();
437
+ }
438
+ };
439
+ _DocumentManagerPlugin.id = "document-manager";
440
+ let DocumentManagerPlugin = _DocumentManagerPlugin;
441
+ const DOCUMENT_MANAGER_PLUGIN_ID = "document-manager";
442
+ const manifest = {
443
+ id: DOCUMENT_MANAGER_PLUGIN_ID,
444
+ name: "Document Manager Plugin",
445
+ version: "1.0.0",
446
+ provides: ["document-manager"],
447
+ requires: [],
448
+ optional: [],
449
+ defaultConfig: {
450
+ enabled: true,
451
+ maxDocuments: 10
452
+ }
453
+ };
454
+ const DocumentManagerPluginPackage = {
455
+ manifest,
456
+ create: (registry, config) => new DocumentManagerPlugin(DOCUMENT_MANAGER_PLUGIN_ID, registry, config),
457
+ reducer: (state) => state,
458
+ initialState: {}
459
+ };
460
+ export {
461
+ DOCUMENT_MANAGER_PLUGIN_ID,
462
+ DocumentManagerPlugin,
463
+ DocumentManagerPluginPackage,
464
+ manifest
465
+ };
466
+ //# sourceMappingURL=index.js.map