@embedpdf/engines 1.0.11 → 1.0.13

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 (104) hide show
  1. package/dist/engine-B0ZTENqz.js +5441 -0
  2. package/dist/engine-B0ZTENqz.js.map +1 -0
  3. package/dist/engine-BB5n-Wej.cjs +2 -0
  4. package/dist/engine-BB5n-Wej.cjs.map +1 -0
  5. package/dist/index.cjs +1 -5846
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.ts +1 -1613
  8. package/dist/index.js +339 -5824
  9. package/dist/index.js.map +1 -1
  10. package/dist/lib/converters/index.cjs +2 -0
  11. package/dist/lib/converters/index.cjs.map +1 -0
  12. package/dist/{converters.d.ts → lib/converters/index.d.ts} +7 -10
  13. package/dist/lib/converters/index.js +80 -0
  14. package/dist/{converters.cjs.map → lib/converters/index.js.map} +1 -1
  15. package/dist/lib/index.d.ts +7 -0
  16. package/dist/lib/mock/index.d.ts +25 -0
  17. package/dist/lib/pdfium/cache.d.ts +62 -0
  18. package/dist/{pdfium.d.ts → lib/pdfium/engine.d.ts} +124 -178
  19. package/dist/lib/pdfium/helper.d.ts +21 -0
  20. package/dist/lib/pdfium/index.cjs +2 -0
  21. package/dist/lib/pdfium/index.cjs.map +1 -0
  22. package/dist/lib/pdfium/index.d.ts +3 -0
  23. package/dist/lib/pdfium/index.js +13 -0
  24. package/dist/lib/pdfium/index.js.map +1 -0
  25. package/dist/lib/pdfium/runner.d.ts +16 -0
  26. package/dist/lib/pdfium/web/direct-engine.cjs +2 -0
  27. package/dist/lib/pdfium/web/direct-engine.cjs.map +1 -0
  28. package/dist/lib/pdfium/web/direct-engine.d.ts +3 -0
  29. package/dist/lib/pdfium/web/direct-engine.js +12 -0
  30. package/dist/lib/pdfium/web/direct-engine.js.map +1 -0
  31. package/dist/lib/pdfium/web/worker-engine.cjs +2 -0
  32. package/dist/lib/pdfium/web/worker-engine.cjs.map +1 -0
  33. package/dist/lib/pdfium/web/worker-engine.d.ts +7 -0
  34. package/dist/lib/pdfium/web/worker-engine.js +15 -0
  35. package/dist/lib/pdfium/web/worker-engine.js.map +1 -0
  36. package/dist/lib/pdfium/worker.d.ts +1 -0
  37. package/dist/lib/pdfium-engine.d.ts +1 -0
  38. package/dist/lib/webworker/engine.cjs +2 -0
  39. package/dist/lib/webworker/engine.cjs.map +1 -0
  40. package/dist/{worker.d.ts → lib/webworker/engine.d.ts} +4 -34
  41. package/dist/lib/webworker/engine.js +887 -0
  42. package/dist/lib/webworker/engine.js.map +1 -0
  43. package/dist/lib/webworker/index.d.ts +2 -0
  44. package/dist/lib/webworker/runner.d.ts +128 -0
  45. package/dist/lib/webworker-engine.d.ts +1 -0
  46. package/dist/preact/adapter.d.ts +1 -0
  47. package/dist/preact/index.cjs +2 -0
  48. package/dist/preact/index.cjs.map +1 -0
  49. package/dist/preact/index.d.ts +1 -0
  50. package/dist/preact/index.js +37 -0
  51. package/dist/preact/index.js.map +1 -0
  52. package/dist/react/adapter.d.ts +1 -0
  53. package/dist/react/index.cjs +2 -0
  54. package/dist/react/index.cjs.map +1 -0
  55. package/dist/react/index.d.ts +1 -0
  56. package/dist/react/index.js +37 -0
  57. package/dist/react/index.js.map +1 -0
  58. package/dist/runner-B-s0R7NN.js +269 -0
  59. package/dist/runner-B-s0R7NN.js.map +1 -0
  60. package/dist/runner-BBBtCHic.cjs +2 -0
  61. package/dist/runner-BBBtCHic.cjs.map +1 -0
  62. package/dist/shared-preact/hooks/index.d.ts +1 -0
  63. package/dist/{preact.d.ts → shared-preact/hooks/use-pdfium-engine.d.ts} +3 -5
  64. package/dist/shared-preact/index.d.ts +1 -0
  65. package/dist/shared-react/hooks/index.d.ts +1 -0
  66. package/dist/{react.d.ts → shared-react/hooks/use-pdfium-engine.d.ts} +3 -5
  67. package/dist/shared-react/index.d.ts +1 -0
  68. package/dist/vue/hooks/index.d.ts +1 -0
  69. package/dist/vue/hooks/use-pdfium-engine.d.ts +18 -0
  70. package/dist/vue/index.cjs +2 -0
  71. package/dist/vue/index.cjs.map +1 -0
  72. package/dist/vue/index.d.ts +1 -0
  73. package/dist/vue/index.js +39 -0
  74. package/dist/vue/index.js.map +1 -0
  75. package/package.json +41 -41
  76. package/dist/converters.cjs +0 -139
  77. package/dist/converters.js +0 -133
  78. package/dist/converters.js.map +0 -1
  79. package/dist/pdfium-direct-engine.cjs +0 -4400
  80. package/dist/pdfium-direct-engine.cjs.map +0 -1
  81. package/dist/pdfium-direct-engine.d.ts +0 -1091
  82. package/dist/pdfium-direct-engine.js +0 -4398
  83. package/dist/pdfium-direct-engine.js.map +0 -1
  84. package/dist/pdfium-worker-engine.cjs +0 -851
  85. package/dist/pdfium-worker-engine.cjs.map +0 -1
  86. package/dist/pdfium-worker-engine.d.ts +0 -314
  87. package/dist/pdfium-worker-engine.js +0 -849
  88. package/dist/pdfium-worker-engine.js.map +0 -1
  89. package/dist/pdfium.cjs +0 -4667
  90. package/dist/pdfium.cjs.map +0 -1
  91. package/dist/pdfium.js +0 -4661
  92. package/dist/pdfium.js.map +0 -1
  93. package/dist/preact.cjs +0 -41
  94. package/dist/preact.cjs.map +0 -1
  95. package/dist/preact.js +0 -39
  96. package/dist/preact.js.map +0 -1
  97. package/dist/react.cjs +0 -41
  98. package/dist/react.cjs.map +0 -1
  99. package/dist/react.js +0 -39
  100. package/dist/react.js.map +0 -1
  101. package/dist/worker.cjs +0 -839
  102. package/dist/worker.cjs.map +0 -1
  103. package/dist/worker.js +0 -836
  104. package/dist/worker.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-B-s0R7NN.js","sources":["../src/lib/webworker/runner.ts","../src/lib/pdfium/runner.ts"],"sourcesContent":["import {\n Logger,\n NoopLogger,\n PdfEngine,\n PdfEngineError,\n PdfEngineMethodArgs,\n PdfEngineMethodName,\n PdfEngineMethodReturnType,\n PdfErrorCode,\n TaskReturn,\n} from '@embedpdf/models';\n\n/**\n * Request body that represent method calls of PdfEngine, it contains the\n * method name and arguments\n */\nexport type PdfEngineMethodRequestBody = {\n [P in PdfEngineMethodName]: {\n name: P;\n args: PdfEngineMethodArgs<P>;\n };\n}[PdfEngineMethodName];\n\n/**\n * Response body that represent return value of PdfEngine\n */\nexport type PdfEngineMethodResponseBody = {\n [P in PdfEngineMethodName]: TaskReturn<PdfEngineMethodReturnType<P>>;\n}[PdfEngineMethodName];\n\n/**\n * Request that abort the specified task\n */\nexport interface AbortRequest {\n /**\n * message id\n */\n id: string;\n /**\n * request type\n */\n type: 'AbortRequest';\n}\n/**\n * Request that execute pdf engine method\n */\nexport interface ExecuteRequest {\n /**\n * message id\n */\n id: string;\n /**\n * request type\n */\n type: 'ExecuteRequest';\n /**\n * request body\n */\n data: PdfEngineMethodRequestBody;\n}\n/**\n * Response that execute pdf engine method\n */\nexport interface ExecuteResponse {\n /**\n * message id\n */\n id: string;\n /**\n * response type\n */\n type: 'ExecuteResponse';\n /**\n * response body\n */\n data: PdfEngineMethodResponseBody;\n}\n\n/**\n * Response that indicate engine is ready\n */\nexport interface ReadyResponse {\n /**\n * message id\n */\n id: string;\n /**\n * response type\n */\n type: 'ReadyResponse';\n}\n\n/**\n * Request type\n */\nexport type Request = ExecuteRequest | AbortRequest;\n/**\n * Response type\n */\nexport type Response = ExecuteResponse | ReadyResponse;\n\nconst LOG_SOURCE = 'WebWorkerEngineRunner';\nconst LOG_CATEGORY = 'Engine';\n\n/**\n * Pdf engine runner, it will execute pdf engine based on the request it received and\n * send back the response with post message\n */\nexport class EngineRunner {\n engine: PdfEngine | undefined;\n\n /**\n * Create instance of EngineRunnder\n * @param logger - logger instance\n */\n constructor(public logger: Logger = new NoopLogger()) {}\n\n /**\n * Listening on post message\n */\n listen() {\n self.onmessage = (evt: MessageEvent<Request>) => {\n return this.handle(evt);\n };\n }\n\n /**\n * Handle post message\n */\n handle(evt: MessageEvent<Request>) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'webworker receive message event: ', evt.data);\n try {\n const request = evt.data as Request;\n switch (request.type) {\n case 'ExecuteRequest':\n this.execute(request);\n break;\n }\n } catch (e) {\n this.logger.info(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'webworker met error when processing message event:',\n e,\n );\n }\n }\n\n /**\n * Send the ready response when pdf engine is ready\n * @returns\n *\n * @protected\n */\n ready() {\n this.listen();\n\n this.respond({\n id: '0',\n type: 'ReadyResponse',\n });\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'runner is ready');\n }\n\n /**\n * Execute the request\n * @param request - request that represent the pdf engine call\n * @returns\n *\n * @protected\n */\n execute = (request: ExecuteRequest) => {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'runner start exeucte request');\n if (!this.engine) {\n const error: PdfEngineError = {\n type: 'reject',\n reason: {\n code: PdfErrorCode.NotReady,\n message: 'engine has not started yet',\n },\n };\n const response: ExecuteResponse = {\n id: request.id,\n type: 'ExecuteResponse',\n data: {\n type: 'error',\n value: error,\n },\n };\n this.respond(response);\n return;\n }\n\n const engine = this.engine;\n const { name, args } = request.data;\n if (!engine[name]) {\n const error: PdfEngineError = {\n type: 'reject',\n reason: {\n code: PdfErrorCode.NotSupport,\n message: `engine method ${name} is not supported yet`,\n },\n };\n const response: ExecuteResponse = {\n id: request.id,\n type: 'ExecuteResponse',\n data: {\n type: 'error',\n value: error,\n },\n };\n this.respond(response);\n return;\n }\n\n let task: PdfEngineMethodReturnType<typeof name>;\n switch (name) {\n case 'isSupport':\n task = this.engine[name]!(...args);\n break;\n case 'initialize':\n task = this.engine[name]!(...args);\n break;\n case 'destroy':\n task = this.engine[name]!(...args);\n break;\n case 'openDocumentUrl':\n task = this.engine[name]!(...args);\n break;\n case 'openDocumentFromBuffer':\n task = this.engine[name]!(...args);\n break;\n case 'openDocumentFromLoader':\n task = this.engine[name]!(...args);\n break;\n case 'getDocPermissions':\n task = this.engine[name]!(...args);\n break;\n case 'getDocUserPermissions':\n task = this.engine[name]!(...args);\n break;\n case 'getMetadata':\n task = this.engine[name]!(...args);\n break;\n case 'getBookmarks':\n task = this.engine[name]!(...args);\n break;\n case 'getSignatures':\n task = this.engine[name]!(...args);\n break;\n case 'renderPage':\n task = this.engine[name]!(...args);\n break;\n case 'renderPageRect':\n task = this.engine[name]!(...args);\n break;\n case 'renderAnnotation':\n task = this.engine[name]!(...args);\n break;\n case 'renderThumbnail':\n task = this.engine[name]!(...args);\n break;\n case 'getAllAnnotations':\n task = this.engine[name]!(...args);\n break;\n case 'getPageAnnotations':\n task = this.engine[name]!(...args);\n break;\n case 'createPageAnnotation':\n task = this.engine[name]!(...args);\n break;\n case 'updatePageAnnotation':\n task = this.engine[name]!(...args);\n break;\n case 'removePageAnnotation':\n task = this.engine[name]!(...args);\n break;\n case 'updateAnnotationColor':\n task = this.engine[name]!(...args);\n break;\n case 'getPageTextRects':\n task = this.engine[name]!(...args);\n break;\n case 'searchAllPages':\n task = this.engine[name]!(...args);\n break;\n case 'closeDocument':\n task = this.engine[name]!(...args);\n break;\n case 'saveAsCopy':\n task = this.engine[name]!(...args);\n break;\n case 'getAttachments':\n task = this.engine[name]!(...args);\n break;\n case 'readAttachmentContent':\n task = this.engine[name]!(...args);\n break;\n case 'setFormFieldValue':\n task = this.engine[name]!(...args);\n break;\n case 'flattenPage':\n task = this.engine[name]!(...args);\n break;\n case 'extractPages':\n task = this.engine[name]!(...args);\n break;\n case 'extractText':\n task = this.engine[name]!(...args);\n break;\n case 'getTextSlices':\n task = this.engine[name]!(...args);\n break;\n case 'getPageGlyphs':\n task = this.engine[name]!(...args);\n break;\n case 'getPageGeometry':\n task = this.engine[name]!(...args);\n break;\n case 'merge':\n task = this.engine[name]!(...args);\n break;\n case 'mergePages':\n task = this.engine[name]!(...args);\n break;\n }\n\n task.wait(\n (result) => {\n const response: ExecuteResponse = {\n id: request.id,\n type: 'ExecuteResponse',\n data: {\n type: 'result',\n value: result,\n },\n };\n this.respond(response);\n },\n (error) => {\n const response: ExecuteResponse = {\n id: request.id,\n type: 'ExecuteResponse',\n data: {\n type: 'error',\n value: error,\n },\n };\n this.respond(response);\n },\n );\n };\n\n /**\n * Send back the response\n * @param response - response that needs sent back\n *\n * @protected\n */\n respond(response: Response) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'runner respond: ', response);\n self.postMessage(response);\n }\n}\n","import { init } from '@embedpdf/pdfium';\nimport { EngineRunner } from '../webworker/runner';\nimport { PdfiumEngine } from './engine';\n\n/**\n * EngineRunner for pdfium-based wasm engine\n */\nexport class PdfiumEngineRunner extends EngineRunner {\n /**\n * Create an instance of PdfiumEngineRunner\n * @param wasmBinary - wasm binary that contains the pdfium wasm file\n */\n constructor(private wasmBinary: ArrayBuffer) {\n super();\n }\n\n /**\n * Initialize runner\n */\n async prepare() {\n const wasmBinary = this.wasmBinary;\n const wasmModule = await init({ wasmBinary });\n this.engine = new PdfiumEngine(wasmModule);\n this.ready();\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("@embedpdf/pdfium"),t=require("@embedpdf/models"),s=require("./engine-BB5n-Wej.cjs"),a="WebWorkerEngineRunner",n="Engine";class r{constructor(e=new t.NoopLogger){this.logger=e,this.execute=e=>{if(this.logger.debug(a,n,"runner start exeucte request"),!this.engine){const s={type:"reject",reason:{code:t.PdfErrorCode.NotReady,message:"engine has not started yet"}},a={id:e.id,type:"ExecuteResponse",data:{type:"error",value:s}};return void this.respond(a)}const s=this.engine,{name:r,args:o}=e.data;if(!s[r]){const s={type:"reject",reason:{code:t.PdfErrorCode.NotSupport,message:`engine method ${r} is not supported yet`}},a={id:e.id,type:"ExecuteResponse",data:{type:"error",value:s}};return void this.respond(a)}let i;switch(r){case"isSupport":case"initialize":case"destroy":case"openDocumentUrl":case"openDocumentFromBuffer":case"openDocumentFromLoader":case"getDocPermissions":case"getDocUserPermissions":case"getMetadata":case"getBookmarks":case"getSignatures":case"renderPage":case"renderPageRect":case"renderAnnotation":case"renderThumbnail":case"getAllAnnotations":case"getPageAnnotations":case"createPageAnnotation":case"updatePageAnnotation":case"removePageAnnotation":case"updateAnnotationColor":case"getPageTextRects":case"searchAllPages":case"closeDocument":case"saveAsCopy":case"getAttachments":case"readAttachmentContent":case"setFormFieldValue":case"flattenPage":case"extractPages":case"extractText":case"getTextSlices":case"getPageGlyphs":case"getPageGeometry":case"merge":case"mergePages":i=this.engine[r](...o)}i.wait((t=>{const s={id:e.id,type:"ExecuteResponse",data:{type:"result",value:t}};this.respond(s)}),(t=>{const s={id:e.id,type:"ExecuteResponse",data:{type:"error",value:t}};this.respond(s)}))}}listen(){self.onmessage=e=>this.handle(e)}handle(e){this.logger.debug(a,n,"webworker receive message event: ",e.data);try{const t=e.data;if("ExecuteRequest"===t.type)this.execute(t)}catch(t){this.logger.info(a,n,"webworker met error when processing message event:",t)}}ready(){this.listen(),this.respond({id:"0",type:"ReadyResponse"}),this.logger.debug(a,n,"runner is ready")}respond(e){this.logger.debug(a,n,"runner respond: ",e),self.postMessage(e)}}exports.EngineRunner=r,exports.PdfiumEngineRunner=class extends r{constructor(e){super(),this.wasmBinary=e}async prepare(){const t=this.wasmBinary,a=await e.init({wasmBinary:t});this.engine=new s.PdfiumEngine(a),this.ready()}};
2
+ //# sourceMappingURL=runner-BBBtCHic.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-BBBtCHic.cjs","sources":["../src/lib/webworker/runner.ts","../src/lib/pdfium/runner.ts"],"sourcesContent":["import {\n Logger,\n NoopLogger,\n PdfEngine,\n PdfEngineError,\n PdfEngineMethodArgs,\n PdfEngineMethodName,\n PdfEngineMethodReturnType,\n PdfErrorCode,\n TaskReturn,\n} from '@embedpdf/models';\n\n/**\n * Request body that represent method calls of PdfEngine, it contains the\n * method name and arguments\n */\nexport type PdfEngineMethodRequestBody = {\n [P in PdfEngineMethodName]: {\n name: P;\n args: PdfEngineMethodArgs<P>;\n };\n}[PdfEngineMethodName];\n\n/**\n * Response body that represent return value of PdfEngine\n */\nexport type PdfEngineMethodResponseBody = {\n [P in PdfEngineMethodName]: TaskReturn<PdfEngineMethodReturnType<P>>;\n}[PdfEngineMethodName];\n\n/**\n * Request that abort the specified task\n */\nexport interface AbortRequest {\n /**\n * message id\n */\n id: string;\n /**\n * request type\n */\n type: 'AbortRequest';\n}\n/**\n * Request that execute pdf engine method\n */\nexport interface ExecuteRequest {\n /**\n * message id\n */\n id: string;\n /**\n * request type\n */\n type: 'ExecuteRequest';\n /**\n * request body\n */\n data: PdfEngineMethodRequestBody;\n}\n/**\n * Response that execute pdf engine method\n */\nexport interface ExecuteResponse {\n /**\n * message id\n */\n id: string;\n /**\n * response type\n */\n type: 'ExecuteResponse';\n /**\n * response body\n */\n data: PdfEngineMethodResponseBody;\n}\n\n/**\n * Response that indicate engine is ready\n */\nexport interface ReadyResponse {\n /**\n * message id\n */\n id: string;\n /**\n * response type\n */\n type: 'ReadyResponse';\n}\n\n/**\n * Request type\n */\nexport type Request = ExecuteRequest | AbortRequest;\n/**\n * Response type\n */\nexport type Response = ExecuteResponse | ReadyResponse;\n\nconst LOG_SOURCE = 'WebWorkerEngineRunner';\nconst LOG_CATEGORY = 'Engine';\n\n/**\n * Pdf engine runner, it will execute pdf engine based on the request it received and\n * send back the response with post message\n */\nexport class EngineRunner {\n engine: PdfEngine | undefined;\n\n /**\n * Create instance of EngineRunnder\n * @param logger - logger instance\n */\n constructor(public logger: Logger = new NoopLogger()) {}\n\n /**\n * Listening on post message\n */\n listen() {\n self.onmessage = (evt: MessageEvent<Request>) => {\n return this.handle(evt);\n };\n }\n\n /**\n * Handle post message\n */\n handle(evt: MessageEvent<Request>) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'webworker receive message event: ', evt.data);\n try {\n const request = evt.data as Request;\n switch (request.type) {\n case 'ExecuteRequest':\n this.execute(request);\n break;\n }\n } catch (e) {\n this.logger.info(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'webworker met error when processing message event:',\n e,\n );\n }\n }\n\n /**\n * Send the ready response when pdf engine is ready\n * @returns\n *\n * @protected\n */\n ready() {\n this.listen();\n\n this.respond({\n id: '0',\n type: 'ReadyResponse',\n });\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'runner is ready');\n }\n\n /**\n * Execute the request\n * @param request - request that represent the pdf engine call\n * @returns\n *\n * @protected\n */\n execute = (request: ExecuteRequest) => {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'runner start exeucte request');\n if (!this.engine) {\n const error: PdfEngineError = {\n type: 'reject',\n reason: {\n code: PdfErrorCode.NotReady,\n message: 'engine has not started yet',\n },\n };\n const response: ExecuteResponse = {\n id: request.id,\n type: 'ExecuteResponse',\n data: {\n type: 'error',\n value: error,\n },\n };\n this.respond(response);\n return;\n }\n\n const engine = this.engine;\n const { name, args } = request.data;\n if (!engine[name]) {\n const error: PdfEngineError = {\n type: 'reject',\n reason: {\n code: PdfErrorCode.NotSupport,\n message: `engine method ${name} is not supported yet`,\n },\n };\n const response: ExecuteResponse = {\n id: request.id,\n type: 'ExecuteResponse',\n data: {\n type: 'error',\n value: error,\n },\n };\n this.respond(response);\n return;\n }\n\n let task: PdfEngineMethodReturnType<typeof name>;\n switch (name) {\n case 'isSupport':\n task = this.engine[name]!(...args);\n break;\n case 'initialize':\n task = this.engine[name]!(...args);\n break;\n case 'destroy':\n task = this.engine[name]!(...args);\n break;\n case 'openDocumentUrl':\n task = this.engine[name]!(...args);\n break;\n case 'openDocumentFromBuffer':\n task = this.engine[name]!(...args);\n break;\n case 'openDocumentFromLoader':\n task = this.engine[name]!(...args);\n break;\n case 'getDocPermissions':\n task = this.engine[name]!(...args);\n break;\n case 'getDocUserPermissions':\n task = this.engine[name]!(...args);\n break;\n case 'getMetadata':\n task = this.engine[name]!(...args);\n break;\n case 'getBookmarks':\n task = this.engine[name]!(...args);\n break;\n case 'getSignatures':\n task = this.engine[name]!(...args);\n break;\n case 'renderPage':\n task = this.engine[name]!(...args);\n break;\n case 'renderPageRect':\n task = this.engine[name]!(...args);\n break;\n case 'renderAnnotation':\n task = this.engine[name]!(...args);\n break;\n case 'renderThumbnail':\n task = this.engine[name]!(...args);\n break;\n case 'getAllAnnotations':\n task = this.engine[name]!(...args);\n break;\n case 'getPageAnnotations':\n task = this.engine[name]!(...args);\n break;\n case 'createPageAnnotation':\n task = this.engine[name]!(...args);\n break;\n case 'updatePageAnnotation':\n task = this.engine[name]!(...args);\n break;\n case 'removePageAnnotation':\n task = this.engine[name]!(...args);\n break;\n case 'updateAnnotationColor':\n task = this.engine[name]!(...args);\n break;\n case 'getPageTextRects':\n task = this.engine[name]!(...args);\n break;\n case 'searchAllPages':\n task = this.engine[name]!(...args);\n break;\n case 'closeDocument':\n task = this.engine[name]!(...args);\n break;\n case 'saveAsCopy':\n task = this.engine[name]!(...args);\n break;\n case 'getAttachments':\n task = this.engine[name]!(...args);\n break;\n case 'readAttachmentContent':\n task = this.engine[name]!(...args);\n break;\n case 'setFormFieldValue':\n task = this.engine[name]!(...args);\n break;\n case 'flattenPage':\n task = this.engine[name]!(...args);\n break;\n case 'extractPages':\n task = this.engine[name]!(...args);\n break;\n case 'extractText':\n task = this.engine[name]!(...args);\n break;\n case 'getTextSlices':\n task = this.engine[name]!(...args);\n break;\n case 'getPageGlyphs':\n task = this.engine[name]!(...args);\n break;\n case 'getPageGeometry':\n task = this.engine[name]!(...args);\n break;\n case 'merge':\n task = this.engine[name]!(...args);\n break;\n case 'mergePages':\n task = this.engine[name]!(...args);\n break;\n }\n\n task.wait(\n (result) => {\n const response: ExecuteResponse = {\n id: request.id,\n type: 'ExecuteResponse',\n data: {\n type: 'result',\n value: result,\n },\n };\n this.respond(response);\n },\n (error) => {\n const response: ExecuteResponse = {\n id: request.id,\n type: 'ExecuteResponse',\n data: {\n type: 'error',\n value: error,\n },\n };\n this.respond(response);\n },\n );\n };\n\n /**\n * Send back the response\n * @param response - response that needs sent back\n *\n * @protected\n */\n respond(response: Response) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'runner respond: ', response);\n self.postMessage(response);\n }\n}\n","import { init } from '@embedpdf/pdfium';\nimport { EngineRunner } from '../webworker/runner';\nimport { PdfiumEngine } from './engine';\n\n/**\n * EngineRunner for pdfium-based wasm engine\n */\nexport class PdfiumEngineRunner extends EngineRunner {\n /**\n * Create an instance of PdfiumEngineRunner\n * @param wasmBinary - wasm binary that contains the pdfium wasm file\n */\n constructor(private wasmBinary: ArrayBuffer) {\n super();\n }\n\n /**\n * Initialize runner\n */\n async prepare() {\n const wasmBinary = this.wasmBinary;\n const wasmModule = await init({ wasmBinary });\n this.engine = new PdfiumEngine(wasmModule);\n this.ready();\n }\n}\n"],"names":["LOG_SOURCE","LOG_CATEGORY","EngineRunner","constructor","logger","NoopLogger","this","execute","request","debug","engine","error","type","reason","code","PdfErrorCode","NotReady","message","response","id","data","value","respond","name","args","NotSupport","task","wait","result","listen","self","onmessage","evt","handle","e","info","ready","postMessage","wasmBinary","super","prepare","wasmModule","init","PdfiumEngine"],"mappings":"kHAqGMA,EAAa,wBACbC,EAAe,SAMd,MAAMC,EAOX,WAAAC,CAAmBC,EAAiB,IAAIC,EAAAA,YAArBC,KAAAF,OAAAA,EAwDnBE,KAAAC,QAAWC,IAEL,GADJF,KAAKF,OAAOK,MAAMT,EAAYC,EAAc,iCACvCK,KAAKI,OAAQ,CAChB,MAAMC,EAAwB,CAC5BC,KAAM,SACNC,OAAQ,CACNC,KAAMC,EAAaA,aAAAC,SACnBC,QAAS,+BAGPC,EAA4B,CAChCC,GAAIX,EAAQW,GACZP,KAAM,kBACNQ,KAAM,CACJR,KAAM,QACNS,MAAOV,IAIX,YADAL,KAAKgB,QAAQJ,EACb,CAGF,MAAMR,EAASJ,KAAKI,QACda,KAAEA,EAAAC,KAAMA,GAAShB,EAAQY,KAC3B,IAACV,EAAOa,GAAO,CACjB,MAAMZ,EAAwB,CAC5BC,KAAM,SACNC,OAAQ,CACNC,KAAMC,EAAaA,aAAAU,WACnBR,QAAS,iBAAiBM,2BAGxBL,EAA4B,CAChCC,GAAIX,EAAQW,GACZP,KAAM,kBACNQ,KAAM,CACJR,KAAM,QACNS,MAAOV,IAIX,YADAL,KAAKgB,QAAQJ,EACb,CAGE,IAAAQ,EACJ,OAAQH,GACN,IAAK,YAGL,IAAK,aAGL,IAAK,UAGL,IAAK,kBAGL,IAAK,yBAGL,IAAK,yBAGL,IAAK,oBAGL,IAAK,wBAGL,IAAK,cAGL,IAAK,eAGL,IAAK,gBAGL,IAAK,aAGL,IAAK,iBAGL,IAAK,mBAGL,IAAK,kBAGL,IAAK,oBAGL,IAAK,qBAGL,IAAK,uBAGL,IAAK,uBAGL,IAAK,uBAGL,IAAK,wBAGL,IAAK,mBAGL,IAAK,iBAGL,IAAK,gBAGL,IAAK,aAGL,IAAK,iBAGL,IAAK,wBAGL,IAAK,oBAGL,IAAK,cAGL,IAAK,eAGL,IAAK,cAGL,IAAK,gBAGL,IAAK,gBAGL,IAAK,kBAGL,IAAK,QAGL,IAAK,aACHG,EAAOpB,KAAKI,OAAOa,MAAUC,GAI5BE,EAAAC,MACFC,IACC,MAAMV,EAA4B,CAChCC,GAAIX,EAAQW,GACZP,KAAM,kBACNQ,KAAM,CACJR,KAAM,SACNS,MAAOO,IAGXtB,KAAKgB,QAAQJ,EAAQ,IAEtBP,IACC,MAAMO,EAA4B,CAChCC,GAAIX,EAAQW,GACZP,KAAM,kBACNQ,KAAM,CACJR,KAAM,QACNS,MAAOV,IAGXL,KAAKgB,QAAQJ,EAAQ,GAEzB,CACF,CAvOA,MAAAW,GACOC,KAAAC,UAAaC,GACT1B,KAAK2B,OAAOD,EACrB,CAMF,MAAAC,CAAOD,GACL1B,KAAKF,OAAOK,MAAMT,EAAYC,EAAc,oCAAqC+B,EAAIZ,MACjF,IACF,MAAMZ,EAAUwB,EAAIZ,KACpB,GACO,mBADCZ,EAAQI,KAEZN,KAAKC,QAAQC,SAGV0B,GACP5B,KAAKF,OAAO+B,KACVnC,EACAC,EACA,qDACAiC,EACF,CACF,CASF,KAAAE,GACE9B,KAAKuB,SAELvB,KAAKgB,QAAQ,CACXH,GAAI,IACJP,KAAM,kBAERN,KAAKF,OAAOK,MAAMT,EAAYC,EAAc,kBAAiB,CAsM/D,OAAAqB,CAAQJ,GACNZ,KAAKF,OAAOK,MAAMT,EAAYC,EAAc,mBAAoBiB,GAChEY,KAAKO,YAAYnB,EAAQ,oDClWtB,cAAiChB,EAKtC,WAAAC,CAAoBmC,GACZC,QADYjC,KAAAgC,WAAAA,CAAA,CAOpB,aAAME,GACJ,MAAMF,EAAahC,KAAKgC,WAClBG,QAAmBC,OAAK,CAAEJ,eAC3BhC,KAAAI,OAAS,IAAIiC,EAAAA,aAAaF,GAC/BnC,KAAK8B,OAAM"}
@@ -0,0 +1 @@
1
+ export * from './use-pdfium-engine';
@@ -1,14 +1,12 @@
1
- import { PdfEngine, Logger } from '@embedpdf/models';
2
-
1
+ import { Logger, PdfEngine } from '@embedpdf/models';
3
2
  interface UsePdfiumEngineProps {
4
3
  wasmUrl?: string;
5
4
  worker?: boolean;
6
5
  logger?: Logger;
7
6
  }
8
- declare function usePdfiumEngine(config?: UsePdfiumEngineProps): {
7
+ export declare function usePdfiumEngine(config?: UsePdfiumEngineProps): {
9
8
  engine: PdfEngine<Blob> | null;
10
9
  isLoading: boolean;
11
10
  error: Error | null;
12
11
  };
13
-
14
- export { usePdfiumEngine };
12
+ export {};
@@ -0,0 +1 @@
1
+ export * from './hooks';
@@ -0,0 +1 @@
1
+ export * from './use-pdfium-engine';
@@ -1,14 +1,12 @@
1
- import { PdfEngine, Logger } from '@embedpdf/models';
2
-
1
+ import { Logger, PdfEngine } from '@embedpdf/models';
3
2
  interface UsePdfiumEngineProps {
4
3
  wasmUrl?: string;
5
4
  worker?: boolean;
6
5
  logger?: Logger;
7
6
  }
8
- declare function usePdfiumEngine(config?: UsePdfiumEngineProps): {
7
+ export declare function usePdfiumEngine(config?: UsePdfiumEngineProps): {
9
8
  engine: PdfEngine<Blob> | null;
10
9
  isLoading: boolean;
11
10
  error: Error | null;
12
11
  };
13
-
14
- export { usePdfiumEngine };
12
+ export {};
@@ -0,0 +1 @@
1
+ export * from './hooks';
@@ -0,0 +1 @@
1
+ export * from './use-pdfium-engine';
@@ -0,0 +1,18 @@
1
+ import { Ref } from 'vue';
2
+ import { Logger, PdfEngine } from '@embedpdf/models';
3
+ interface UsePdfiumEngineProps {
4
+ wasmUrl?: string;
5
+ worker?: boolean;
6
+ logger?: Logger;
7
+ }
8
+ interface UsePdfiumEngineResult {
9
+ engine: Ref<PdfEngine | null>;
10
+ isLoading: Ref<boolean>;
11
+ error: Ref<Error | null>;
12
+ }
13
+ /**
14
+ * Vue composable that loads a PdfiumEngine (worker or direct)
15
+ * and keeps its lifetime tied to the component.
16
+ */
17
+ export declare function usePdfiumEngine(props?: UsePdfiumEngineProps): UsePdfiumEngineResult;
18
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";Object.create,Object.defineProperty,Object.getOwnPropertyDescriptor,Object.getOwnPropertyNames,Object.getPrototypeOf,Object.prototype.hasOwnProperty;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),t="https://cdn.jsdelivr.net/npm/@embedpdf/pdfium@1.0.13/dist/pdfium.wasm";exports.usePdfiumEngine=function(n={}){const{wasmUrl:r=t,worker:o=!0,logger:i}=n,u=e.ref(null),a=e.ref(!0),l=e.ref(null);async function c(){try{const{createPdfiumEngine:e}=o?await import("@embedpdf/engines/pdfium-worker-engine"):await import("@embedpdf/engines/pdfium-direct-engine");u.value=await e(r,i),a.value=!1}catch(e){l.value=e,a.value=!1}}function d(){var e,t;null==(t=null==(e=u.value)?void 0:e.destroy)||t.call(e),u.value=null,a.value=!0,l.value=null}return e.onMounted(c),e.onBeforeUnmount(d),e.watch((()=>[r,o,i]),(()=>{d(),c()})),{engine:u,isLoading:a,error:l}};
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/vue/hooks/use-pdfium-engine.ts"],"sourcesContent":["import { ref, onMounted, onBeforeUnmount, watch, Ref } from 'vue';\nimport type { Logger, PdfEngine } from '@embedpdf/models';\n\nconst defaultWasmUrl =\n 'https://cdn.jsdelivr.net/npm/@embedpdf/pdfium@__PDFIUM_VERSION__/dist/pdfium.wasm';\n\ninterface UsePdfiumEngineProps {\n wasmUrl?: string;\n worker?: boolean;\n logger?: Logger;\n}\n\ninterface UsePdfiumEngineResult {\n engine: Ref<PdfEngine | null>;\n isLoading: Ref<boolean>;\n error: Ref<Error | null>;\n}\n\n/**\n * Vue composable that loads a PdfiumEngine (worker or direct)\n * and keeps its lifetime tied to the component.\n */\nexport function usePdfiumEngine(props: UsePdfiumEngineProps = {}): UsePdfiumEngineResult {\n const { wasmUrl = defaultWasmUrl, worker = true, logger } = props;\n\n const engine = ref<PdfEngine | null>(null);\n const isLoading = ref(true);\n const error = ref<Error | null>(null);\n\n /* create / destroy tied to component lifecycle ----------------- */\n onMounted(loadEngine);\n onBeforeUnmount(destroyEngine);\n\n /* re‑load if reactive props change ----------------------------- */\n watch(\n () => [wasmUrl, worker, logger] as const,\n () => {\n destroyEngine();\n loadEngine();\n },\n );\n\n async function loadEngine() {\n try {\n const { createPdfiumEngine } = worker\n ? await import('@embedpdf/engines/pdfium-worker-engine')\n : await import('@embedpdf/engines/pdfium-direct-engine');\n\n engine.value = await createPdfiumEngine(wasmUrl, logger);\n isLoading.value = false;\n } catch (e) {\n error.value = e as Error;\n isLoading.value = false;\n }\n }\n\n function destroyEngine() {\n engine.value?.destroy?.();\n engine.value = null;\n isLoading.value = true;\n error.value = null;\n }\n\n return { engine, isLoading, error };\n}\n"],"names":["defaultWasmUrl","props","wasmUrl","worker","logger","engine","ref","isLoading","error","async","loadEngine","createPdfiumEngine","import","value","e","destroyEngine","_b","_a","destroy","call","onMounted","onBeforeUnmount","vue","watch"],"mappings":"4PAGMA,EACJ,gGAkBc,SAAgBC,EAA8B,IAC5D,MAAMC,QAAEA,EAAUF,EAAAG,OAAgBA,GAAS,EAAAC,OAAMA,GAAWH,EAEtDI,EAASC,MAAsB,MAC/BC,EAAYD,OAAI,GAChBE,EAAQF,MAAkB,MAehCG,eAAeC,IACT,IACI,MAAAC,mBAAEA,GAAuBR,QACrBS,OAAO,gDACPA,OAAO,0CAEjBP,EAAOQ,YAAcF,EAAmBT,EAASE,GACjDG,EAAUM,OAAQ,QACXC,GACPN,EAAMK,MAAQC,EACdP,EAAUM,OAAQ,CAAA,CACpB,CAGF,SAASE,YACP,OAAOC,EAAP,OAAOC,EAAAZ,EAAAQ,gBAAOK,UAAdF,EAAAG,KAAAF,GACAZ,EAAOQ,MAAQ,KACfN,EAAUM,OAAQ,EAClBL,EAAMK,MAAQ,IAAA,CAGT,OAjCPO,EAAAA,UAAUV,GACVW,EAAAA,gBAAgBN,GAGhBO,EAAAC,OACE,IAAM,CAACrB,EAASC,EAAQC,KACxB,KACgBW,IACHL,GAAA,IAyBR,CAAEL,SAAQE,YAAWC,QAC9B"}
@@ -0,0 +1 @@
1
+ export * from './hooks';
@@ -0,0 +1,39 @@
1
+ import { ref, onMounted, onBeforeUnmount, watch } from "vue";
2
+ const defaultWasmUrl = "https://cdn.jsdelivr.net/npm/@embedpdf/pdfium@1.0.13/dist/pdfium.wasm";
3
+ function usePdfiumEngine(props = {}) {
4
+ const { wasmUrl = defaultWasmUrl, worker = true, logger } = props;
5
+ const engine = ref(null);
6
+ const isLoading = ref(true);
7
+ const error = ref(null);
8
+ onMounted(loadEngine);
9
+ onBeforeUnmount(destroyEngine);
10
+ watch(
11
+ () => [wasmUrl, worker, logger],
12
+ () => {
13
+ destroyEngine();
14
+ loadEngine();
15
+ }
16
+ );
17
+ async function loadEngine() {
18
+ try {
19
+ const { createPdfiumEngine } = worker ? await import("@embedpdf/engines/pdfium-worker-engine") : await import("@embedpdf/engines/pdfium-direct-engine");
20
+ engine.value = await createPdfiumEngine(wasmUrl, logger);
21
+ isLoading.value = false;
22
+ } catch (e) {
23
+ error.value = e;
24
+ isLoading.value = false;
25
+ }
26
+ }
27
+ function destroyEngine() {
28
+ var _a, _b;
29
+ (_b = (_a = engine.value) == null ? void 0 : _a.destroy) == null ? void 0 : _b.call(_a);
30
+ engine.value = null;
31
+ isLoading.value = true;
32
+ error.value = null;
33
+ }
34
+ return { engine, isLoading, error };
35
+ }
36
+ export {
37
+ usePdfiumEngine
38
+ };
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/vue/hooks/use-pdfium-engine.ts"],"sourcesContent":["import { ref, onMounted, onBeforeUnmount, watch, Ref } from 'vue';\nimport type { Logger, PdfEngine } from '@embedpdf/models';\n\nconst defaultWasmUrl =\n 'https://cdn.jsdelivr.net/npm/@embedpdf/pdfium@__PDFIUM_VERSION__/dist/pdfium.wasm';\n\ninterface UsePdfiumEngineProps {\n wasmUrl?: string;\n worker?: boolean;\n logger?: Logger;\n}\n\ninterface UsePdfiumEngineResult {\n engine: Ref<PdfEngine | null>;\n isLoading: Ref<boolean>;\n error: Ref<Error | null>;\n}\n\n/**\n * Vue composable that loads a PdfiumEngine (worker or direct)\n * and keeps its lifetime tied to the component.\n */\nexport function usePdfiumEngine(props: UsePdfiumEngineProps = {}): UsePdfiumEngineResult {\n const { wasmUrl = defaultWasmUrl, worker = true, logger } = props;\n\n const engine = ref<PdfEngine | null>(null);\n const isLoading = ref(true);\n const error = ref<Error | null>(null);\n\n /* create / destroy tied to component lifecycle ----------------- */\n onMounted(loadEngine);\n onBeforeUnmount(destroyEngine);\n\n /* re‑load if reactive props change ----------------------------- */\n watch(\n () => [wasmUrl, worker, logger] as const,\n () => {\n destroyEngine();\n loadEngine();\n },\n );\n\n async function loadEngine() {\n try {\n const { createPdfiumEngine } = worker\n ? await import('@embedpdf/engines/pdfium-worker-engine')\n : await import('@embedpdf/engines/pdfium-direct-engine');\n\n engine.value = await createPdfiumEngine(wasmUrl, logger);\n isLoading.value = false;\n } catch (e) {\n error.value = e as Error;\n isLoading.value = false;\n }\n }\n\n function destroyEngine() {\n engine.value?.destroy?.();\n engine.value = null;\n isLoading.value = true;\n error.value = null;\n }\n\n return { engine, isLoading, error };\n}\n"],"names":[],"mappings":";AAGA,MAAM,iBACJ;AAkBc,SAAA,gBAAgB,QAA8B,IAA2B;AACvF,QAAM,EAAE,UAAU,gBAAgB,SAAS,MAAM,WAAW;AAEtD,QAAA,SAAS,IAAsB,IAAI;AACnC,QAAA,YAAY,IAAI,IAAI;AACpB,QAAA,QAAQ,IAAkB,IAAI;AAGpC,YAAU,UAAU;AACpB,kBAAgB,aAAa;AAG7B;AAAA,IACE,MAAM,CAAC,SAAS,QAAQ,MAAM;AAAA,IAC9B,MAAM;AACU,oBAAA;AACH,iBAAA;AAAA,IAAA;AAAA,EAEf;AAEA,iBAAe,aAAa;AACtB,QAAA;AACI,YAAA,EAAE,mBAAmB,IAAI,SAC3B,MAAM,OAAO,wCAAwC,IACrD,MAAM,OAAO,wCAAwC;AAEzD,aAAO,QAAQ,MAAM,mBAAmB,SAAS,MAAM;AACvD,gBAAU,QAAQ;AAAA,aACX,GAAG;AACV,YAAM,QAAQ;AACd,gBAAU,QAAQ;AAAA,IAAA;AAAA,EACpB;AAGF,WAAS,gBAAgB;;AACvB,uBAAO,UAAP,mBAAc,YAAd;AACA,WAAO,QAAQ;AACf,cAAU,QAAQ;AAClB,UAAM,QAAQ;AAAA,EAAA;AAGT,SAAA,EAAE,QAAQ,WAAW,MAAM;AACpC;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embedpdf/engines",
3
- "version": "1.0.11",
3
+ "version": "1.0.13",
4
4
  "description": "Pluggable runtime layer that abstracts over multiple PDF engines (PDF-ium, Web Workers, mocks, etc.) to provide a unified API for rendering, search, annotation, and other document-level operations in EmbedPDF.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -13,39 +13,44 @@
13
13
  "require": "./dist/index.cjs"
14
14
  },
15
15
  "./pdfium": {
16
- "types": "./dist/pdfium.d.ts",
17
- "import": "./dist/pdfium.js",
18
- "require": "./dist/pdfium.cjs"
16
+ "types": "./dist/lib/pdfium/index.d.ts",
17
+ "import": "./dist/lib/pdfium/index.js",
18
+ "require": "./dist/lib/pdfium/index.cjs"
19
19
  },
20
20
  "./worker": {
21
- "types": "./dist/worker.d.ts",
22
- "import": "./dist/worker.js",
23
- "require": "./dist/worker.cjs"
21
+ "types": "./dist/lib/webworker/engine.d.ts",
22
+ "import": "./dist/lib/webworker/engine.js",
23
+ "require": "./dist/lib/webworker/engine.cjs"
24
24
  },
25
25
  "./converters": {
26
- "types": "./dist/converters.d.ts",
27
- "import": "./dist/converters.js",
28
- "require": "./dist/converters.cjs"
26
+ "types": "./dist/lib/converters/index.d.ts",
27
+ "import": "./dist/lib/converters/index.js",
28
+ "require": "./dist/lib/converters/index.cjs"
29
29
  },
30
30
  "./pdfium-direct-engine": {
31
- "types": "./dist/pdfium-direct-engine.d.ts",
32
- "import": "./dist/pdfium-direct-engine.js",
33
- "require": "./dist/pdfium-direct-engine.cjs"
31
+ "types": "./dist/lib/pdfium/web/direct-engine.d.ts",
32
+ "import": "./dist/lib/pdfium/web/direct-engine.js",
33
+ "require": "./dist/lib/pdfium/web/direct-engine.cjs"
34
34
  },
35
35
  "./pdfium-worker-engine": {
36
- "types": "./dist/pdfium-worker-engine.d.ts",
37
- "import": "./dist/pdfium-worker-engine.js",
38
- "require": "./dist/pdfium-worker-engine.cjs"
36
+ "types": "./dist/lib/pdfium/web/worker-engine.d.ts",
37
+ "import": "./dist/lib/pdfium/web/worker-engine.js",
38
+ "require": "./dist/lib/pdfium/web/worker-engine.cjs"
39
39
  },
40
40
  "./react": {
41
- "types": "./dist/react.d.ts",
42
- "import": "./dist/react.js",
43
- "require": "./dist/react.cjs"
41
+ "types": "./dist/react/index.d.ts",
42
+ "import": "./dist/react/index.js",
43
+ "require": "./dist/react/index.cjs"
44
44
  },
45
45
  "./preact": {
46
- "types": "./dist/preact.d.ts",
47
- "import": "./dist/preact.js",
48
- "require": "./dist/preact.cjs"
46
+ "types": "./dist/preact/index.d.ts",
47
+ "import": "./dist/preact/index.js",
48
+ "require": "./dist/preact/index.cjs"
49
+ },
50
+ "./vue": {
51
+ "types": "./dist/vue/index.d.ts",
52
+ "import": "./dist/vue/index.js",
53
+ "require": "./dist/vue/index.cjs"
49
54
  }
50
55
  },
51
56
  "keywords": [
@@ -69,39 +74,34 @@
69
74
  "author": "Bob Singor, Ji Chang",
70
75
  "license": "MIT",
71
76
  "devDependencies": {
72
- "@rollup/plugin-commonjs": "^28.0.6",
73
- "@rollup/plugin-node-resolve": "^15.2.1",
74
- "@rollup/plugin-replace": "^5.0.2",
75
- "@rollup/plugin-terser": "^0.4.3",
76
- "@rollup/plugin-typescript": "^11.1.2",
77
77
  "@types/jest": "^29.5.14",
78
78
  "@types/react": "^18.2.0",
79
- "del": "^8.0.0",
80
79
  "jest": "^29.7.0",
81
- "rollup": "^3.28.0",
82
- "rollup-plugin-dts": "^6.2.1",
83
80
  "ts-jest": "^29.2.5",
84
- "tsup": "^8.0.0",
85
- "typescript": "^5.0.0"
81
+ "typescript": "^5.0.0",
82
+ "@embedpdf/build": "1.0.0"
86
83
  },
87
84
  "dependencies": {
88
- "@embedpdf/models": "1.0.11",
89
- "@embedpdf/pdfium": "1.0.11"
85
+ "@embedpdf/models": "1.0.13",
86
+ "@embedpdf/pdfium": "1.0.13"
90
87
  },
91
88
  "peerDependencies": {
92
89
  "react": ">=16.8.0",
93
90
  "react-dom": ">=16.8.0",
94
- "preact": "^10.26.4"
91
+ "preact": "^10.26.4",
92
+ "vue": ">=3.2.0"
95
93
  },
96
94
  "publishConfig": {
97
95
  "access": "public"
98
96
  },
99
97
  "scripts": {
100
- "build": "rollup -c",
101
- "build:watch": "rollup -c -w",
102
- "clean": "PROJECT_CWD=$(pwd) pnpm -w p:clean",
103
- "lint": "PROJECT_CWD=$(pwd) pnpm -w p:lint",
104
- "lint:fix": "PROJECT_CWD=$(pwd) pnpm -w p:lint:fix",
105
- "typecheck": "PROJECT_CWD=$(pwd) pnpm -w p:typecheck"
98
+ "build:base": "vite build --mode base",
99
+ "build:react": "vite build --mode react",
100
+ "build:preact": "vite build --mode preact",
101
+ "build:vue": "vite build --mode vue",
102
+ "build": "pnpm run clean && concurrently -c auto -n base,react,preact,vue \"vite build --mode base\" \"vite build --mode react\" \"vite build --mode preact\" \"vite build --mode vue\"",
103
+ "clean": "rimraf dist",
104
+ "lint": "eslint src --color",
105
+ "lint:fix": "eslint src --color --fix"
106
106
  }
107
107
  }
@@ -1,139 +0,0 @@
1
- 'use strict';
2
-
3
- /**
4
- * Browser implementation using OffscreenCanvas
5
- * This is the default implementation used in browser environments
6
- */
7
- const browserImageDataToBlobConverter = (imageData, imageType = 'image/webp') => {
8
- // Check if we're in a browser environment
9
- if (typeof OffscreenCanvas === 'undefined') {
10
- throw new Error('OffscreenCanvas is not available in this environment. ' +
11
- 'This converter is intended for browser use only. ' +
12
- 'Please use createNodeImageDataToBlobConverter() or createNodeCanvasImageDataToBlobConverter() for Node.js.');
13
- }
14
- const off = new OffscreenCanvas(imageData.width, imageData.height);
15
- off.getContext('2d').putImageData(imageData, 0, 0);
16
- return off.convertToBlob({ type: imageType });
17
- };
18
- /**
19
- * Node.js implementation using Sharp
20
- * This requires the 'sharp' package to be installed
21
- *
22
- * @example
23
- * ```typescript
24
- * import sharp from 'sharp';
25
- * import { createNodeImageDataToBufferConverter } from '@embedpdf/engines/pdfium/image-converters';
26
- *
27
- * const converter = createNodeImageDataToBufferConverter(sharp);
28
- * const engine = new PdfiumEngine(pdfiumModule, logger, converter);
29
- * ```
30
- */
31
- function createNodeImageDataToBufferConverter(sharp) {
32
- return async (imageData, imageType = 'image/webp') => {
33
- const { width, height, data } = imageData;
34
- // Convert ImageData to Sharp format
35
- // ImageData uses RGBA format, Sharp expects the same
36
- let sharpInstance = sharp(Buffer.from(data), {
37
- raw: {
38
- width,
39
- height,
40
- channels: 4, // RGBA
41
- },
42
- });
43
- // Apply the appropriate format conversion based on imageType
44
- let buffer;
45
- switch (imageType) {
46
- case 'image/webp':
47
- buffer = await sharpInstance.webp().toBuffer();
48
- break;
49
- case 'image/png':
50
- buffer = await sharpInstance.png().toBuffer();
51
- break;
52
- case 'image/jpeg':
53
- // JPEG doesn't support transparency, so we need to composite onto a white background
54
- buffer = await sharpInstance
55
- .flatten({ background: { r: 255, g: 255, b: 255 } }) // Remove alpha channel with white background
56
- .jpeg()
57
- .toBuffer();
58
- break;
59
- default:
60
- throw new Error(`Unsupported image type: ${imageType}`);
61
- }
62
- return buffer;
63
- };
64
- }
65
- /**
66
- * Alternative Node.js implementation using canvas (node-canvas)
67
- * This requires the 'canvas' package to be installed
68
- *
69
- * @example
70
- * ```typescript
71
- * import { createCanvas } from 'canvas';
72
- * import { createNodeCanvasImageDataToBlobConverter } from '@embedpdf/engines/pdfium/image-converters';
73
- *
74
- * const converter = createNodeCanvasImageDataToBlobConverter(createCanvas, 'image/png');
75
- * const engine = new PdfiumEngine(pdfiumModule, logger, converter);
76
- * ```
77
- */
78
- function createNodeCanvasImageDataToBlobConverter(createCanvas) {
79
- return async (imageData, imageType = 'image/webp') => {
80
- const { width, height } = imageData;
81
- // Create a canvas and put the image data
82
- const canvas = createCanvas(width, height);
83
- const ctx = canvas.getContext('2d');
84
- ctx.putImageData(imageData, 0, 0);
85
- // Convert to buffer and create blob based on the requested type
86
- let buffer;
87
- switch (imageType) {
88
- case 'image/webp':
89
- buffer = canvas.toBuffer('image/webp');
90
- break;
91
- case 'image/png':
92
- buffer = canvas.toBuffer('image/png');
93
- break;
94
- case 'image/jpeg':
95
- buffer = canvas.toBuffer('image/jpeg');
96
- break;
97
- default:
98
- throw new Error(`Unsupported image type: ${imageType}`);
99
- }
100
- return buffer;
101
- };
102
- }
103
- /**
104
- * Generic Node.js implementation that works with any image processing library
105
- * that can handle raw RGBA data
106
- *
107
- * @example
108
- * ```typescript
109
- * const converter = createCustomImageDataToBlobConverter(async (imageData) => {
110
- * // Your custom image processing logic here
111
- * // Return a Buffer that will be wrapped in a Blob
112
- * return processImageWithYourLibrary(imageData);
113
- * });
114
- * ```
115
- */
116
- function createCustomImageDataToBlobConverter(processor) {
117
- return async (imageData, imageType = 'image/webp') => {
118
- const buffer = await processor(imageData);
119
- return new Blob([buffer], { type: imageType });
120
- };
121
- }
122
- /**
123
- * Create a custom converter that returns a Buffer
124
- * @param processor - function to process the image data
125
- * @param imageType - image type
126
- * @returns ImageDataToBlobConverter<Buffer>
127
- */
128
- function createCustomImageDataToBufferConverter(processor) {
129
- return async (imageData, imageType = 'image/webp') => {
130
- return await processor(imageData, imageType);
131
- };
132
- }
133
-
134
- exports.browserImageDataToBlobConverter = browserImageDataToBlobConverter;
135
- exports.createCustomImageDataToBlobConverter = createCustomImageDataToBlobConverter;
136
- exports.createCustomImageDataToBufferConverter = createCustomImageDataToBufferConverter;
137
- exports.createNodeCanvasImageDataToBlobConverter = createNodeCanvasImageDataToBlobConverter;
138
- exports.createNodeImageDataToBufferConverter = createNodeImageDataToBufferConverter;
139
- //# sourceMappingURL=converters.cjs.map
@@ -1,133 +0,0 @@
1
- /**
2
- * Browser implementation using OffscreenCanvas
3
- * This is the default implementation used in browser environments
4
- */
5
- const browserImageDataToBlobConverter = (imageData, imageType = 'image/webp') => {
6
- // Check if we're in a browser environment
7
- if (typeof OffscreenCanvas === 'undefined') {
8
- throw new Error('OffscreenCanvas is not available in this environment. ' +
9
- 'This converter is intended for browser use only. ' +
10
- 'Please use createNodeImageDataToBlobConverter() or createNodeCanvasImageDataToBlobConverter() for Node.js.');
11
- }
12
- const off = new OffscreenCanvas(imageData.width, imageData.height);
13
- off.getContext('2d').putImageData(imageData, 0, 0);
14
- return off.convertToBlob({ type: imageType });
15
- };
16
- /**
17
- * Node.js implementation using Sharp
18
- * This requires the 'sharp' package to be installed
19
- *
20
- * @example
21
- * ```typescript
22
- * import sharp from 'sharp';
23
- * import { createNodeImageDataToBufferConverter } from '@embedpdf/engines/pdfium/image-converters';
24
- *
25
- * const converter = createNodeImageDataToBufferConverter(sharp);
26
- * const engine = new PdfiumEngine(pdfiumModule, logger, converter);
27
- * ```
28
- */
29
- function createNodeImageDataToBufferConverter(sharp) {
30
- return async (imageData, imageType = 'image/webp') => {
31
- const { width, height, data } = imageData;
32
- // Convert ImageData to Sharp format
33
- // ImageData uses RGBA format, Sharp expects the same
34
- let sharpInstance = sharp(Buffer.from(data), {
35
- raw: {
36
- width,
37
- height,
38
- channels: 4, // RGBA
39
- },
40
- });
41
- // Apply the appropriate format conversion based on imageType
42
- let buffer;
43
- switch (imageType) {
44
- case 'image/webp':
45
- buffer = await sharpInstance.webp().toBuffer();
46
- break;
47
- case 'image/png':
48
- buffer = await sharpInstance.png().toBuffer();
49
- break;
50
- case 'image/jpeg':
51
- // JPEG doesn't support transparency, so we need to composite onto a white background
52
- buffer = await sharpInstance
53
- .flatten({ background: { r: 255, g: 255, b: 255 } }) // Remove alpha channel with white background
54
- .jpeg()
55
- .toBuffer();
56
- break;
57
- default:
58
- throw new Error(`Unsupported image type: ${imageType}`);
59
- }
60
- return buffer;
61
- };
62
- }
63
- /**
64
- * Alternative Node.js implementation using canvas (node-canvas)
65
- * This requires the 'canvas' package to be installed
66
- *
67
- * @example
68
- * ```typescript
69
- * import { createCanvas } from 'canvas';
70
- * import { createNodeCanvasImageDataToBlobConverter } from '@embedpdf/engines/pdfium/image-converters';
71
- *
72
- * const converter = createNodeCanvasImageDataToBlobConverter(createCanvas, 'image/png');
73
- * const engine = new PdfiumEngine(pdfiumModule, logger, converter);
74
- * ```
75
- */
76
- function createNodeCanvasImageDataToBlobConverter(createCanvas) {
77
- return async (imageData, imageType = 'image/webp') => {
78
- const { width, height } = imageData;
79
- // Create a canvas and put the image data
80
- const canvas = createCanvas(width, height);
81
- const ctx = canvas.getContext('2d');
82
- ctx.putImageData(imageData, 0, 0);
83
- // Convert to buffer and create blob based on the requested type
84
- let buffer;
85
- switch (imageType) {
86
- case 'image/webp':
87
- buffer = canvas.toBuffer('image/webp');
88
- break;
89
- case 'image/png':
90
- buffer = canvas.toBuffer('image/png');
91
- break;
92
- case 'image/jpeg':
93
- buffer = canvas.toBuffer('image/jpeg');
94
- break;
95
- default:
96
- throw new Error(`Unsupported image type: ${imageType}`);
97
- }
98
- return buffer;
99
- };
100
- }
101
- /**
102
- * Generic Node.js implementation that works with any image processing library
103
- * that can handle raw RGBA data
104
- *
105
- * @example
106
- * ```typescript
107
- * const converter = createCustomImageDataToBlobConverter(async (imageData) => {
108
- * // Your custom image processing logic here
109
- * // Return a Buffer that will be wrapped in a Blob
110
- * return processImageWithYourLibrary(imageData);
111
- * });
112
- * ```
113
- */
114
- function createCustomImageDataToBlobConverter(processor) {
115
- return async (imageData, imageType = 'image/webp') => {
116
- const buffer = await processor(imageData);
117
- return new Blob([buffer], { type: imageType });
118
- };
119
- }
120
- /**
121
- * Create a custom converter that returns a Buffer
122
- * @param processor - function to process the image data
123
- * @param imageType - image type
124
- * @returns ImageDataToBlobConverter<Buffer>
125
- */
126
- function createCustomImageDataToBufferConverter(processor) {
127
- return async (imageData, imageType = 'image/webp') => {
128
- return await processor(imageData, imageType);
129
- };
130
- }
131
-
132
- export { browserImageDataToBlobConverter, createCustomImageDataToBlobConverter, createCustomImageDataToBufferConverter, createNodeCanvasImageDataToBlobConverter, createNodeImageDataToBufferConverter };
133
- //# sourceMappingURL=converters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converters.js","sources":["../src/lib/converters/index.ts"],"sourcesContent":["/**\n * Function type for converting ImageData to Blob\n * In browser: uses OffscreenCanvas\n * In Node.js: can use Sharp or other image processing libraries\n */\nexport type ImageDataConverter<T = Blob> = (\n imageData: ImageData,\n imageType?: ImageConversionTypes,\n) => Promise<T>;\n\nexport type ImageConversionTypes = 'image/webp' | 'image/png' | 'image/jpeg';\n/**\n * Browser implementation using OffscreenCanvas\n * This is the default implementation used in browser environments\n */\nexport const browserImageDataToBlobConverter: ImageDataConverter = (\n imageData: ImageData,\n imageType: ImageConversionTypes = 'image/webp',\n): Promise<Blob> => {\n // Check if we're in a browser environment\n if (typeof OffscreenCanvas === 'undefined') {\n throw new Error(\n 'OffscreenCanvas is not available in this environment. ' +\n 'This converter is intended for browser use only. ' +\n 'Please use createNodeImageDataToBlobConverter() or createNodeCanvasImageDataToBlobConverter() for Node.js.',\n );\n }\n\n const off = new OffscreenCanvas(imageData.width, imageData.height);\n off.getContext('2d')!.putImageData(imageData, 0, 0);\n return off.convertToBlob({ type: imageType });\n};\n\n/**\n * Node.js implementation using Sharp\n * This requires the 'sharp' package to be installed\n *\n * @example\n * ```typescript\n * import sharp from 'sharp';\n * import { createNodeImageDataToBufferConverter } from '@embedpdf/engines/pdfium/image-converters';\n *\n * const converter = createNodeImageDataToBufferConverter(sharp);\n * const engine = new PdfiumEngine(pdfiumModule, logger, converter);\n * ```\n */\nexport function createNodeImageDataToBufferConverter(\n sharp: any, // Using 'any' to avoid requiring sharp as a dependency\n): ImageDataConverter<Buffer> {\n return async (\n imageData: ImageData,\n imageType: ImageConversionTypes = 'image/webp',\n ): Promise<Buffer> => {\n const { width, height, data } = imageData;\n\n // Convert ImageData to Sharp format\n // ImageData uses RGBA format, Sharp expects the same\n let sharpInstance = sharp(Buffer.from(data), {\n raw: {\n width,\n height,\n channels: 4, // RGBA\n },\n });\n\n // Apply the appropriate format conversion based on imageType\n let buffer: Buffer;\n switch (imageType) {\n case 'image/webp':\n buffer = await sharpInstance.webp().toBuffer();\n break;\n case 'image/png':\n buffer = await sharpInstance.png().toBuffer();\n break;\n case 'image/jpeg':\n // JPEG doesn't support transparency, so we need to composite onto a white background\n buffer = await sharpInstance\n .flatten({ background: { r: 255, g: 255, b: 255 } }) // Remove alpha channel with white background\n .jpeg()\n .toBuffer();\n break;\n default:\n throw new Error(`Unsupported image type: ${imageType}`);\n }\n\n return buffer;\n };\n}\n\n/**\n * Alternative Node.js implementation using canvas (node-canvas)\n * This requires the 'canvas' package to be installed\n *\n * @example\n * ```typescript\n * import { createCanvas } from 'canvas';\n * import { createNodeCanvasImageDataToBlobConverter } from '@embedpdf/engines/pdfium/image-converters';\n *\n * const converter = createNodeCanvasImageDataToBlobConverter(createCanvas, 'image/png');\n * const engine = new PdfiumEngine(pdfiumModule, logger, converter);\n * ```\n */\nexport function createNodeCanvasImageDataToBlobConverter(\n createCanvas: any, // Using 'any' to avoid requiring canvas as a dependency\n): ImageDataConverter<Buffer> {\n return async (\n imageData: ImageData,\n imageType: ImageConversionTypes = 'image/webp',\n ): Promise<Buffer> => {\n const { width, height } = imageData;\n\n // Create a canvas and put the image data\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext('2d');\n ctx.putImageData(imageData, 0, 0);\n\n // Convert to buffer and create blob based on the requested type\n let buffer: Buffer;\n switch (imageType) {\n case 'image/webp':\n buffer = canvas.toBuffer('image/webp');\n break;\n case 'image/png':\n buffer = canvas.toBuffer('image/png');\n break;\n case 'image/jpeg':\n buffer = canvas.toBuffer('image/jpeg');\n break;\n default:\n throw new Error(`Unsupported image type: ${imageType}`);\n }\n\n return buffer;\n };\n}\n\n/**\n * Generic Node.js implementation that works with any image processing library\n * that can handle raw RGBA data\n *\n * @example\n * ```typescript\n * const converter = createCustomImageDataToBlobConverter(async (imageData) => {\n * // Your custom image processing logic here\n * // Return a Buffer that will be wrapped in a Blob\n * return processImageWithYourLibrary(imageData);\n * });\n * ```\n */\nexport function createCustomImageDataToBlobConverter(\n processor: (imageData: ImageData) => Promise<Buffer>,\n): ImageDataConverter {\n return async (\n imageData: ImageData,\n imageType: ImageConversionTypes = 'image/webp',\n ): Promise<Blob> => {\n const buffer = await processor(imageData);\n return new Blob([buffer], { type: imageType });\n };\n}\n\n/**\n * Create a custom converter that returns a Buffer\n * @param processor - function to process the image data\n * @param imageType - image type\n * @returns ImageDataToBlobConverter<Buffer>\n */\nexport function createCustomImageDataToBufferConverter(\n processor: (imageData: ImageData, imageType: ImageConversionTypes) => Promise<Buffer>,\n): ImageDataConverter<Buffer> {\n return async (\n imageData: ImageData,\n imageType: ImageConversionTypes = 'image/webp',\n ): Promise<Buffer> => {\n return await processor(imageData, imageType);\n };\n}\n"],"names":[],"mappings":"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"}