@embedpdf/engines 2.0.0-next.1 → 2.0.0-next.3

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 (76) hide show
  1. package/dist/browser-B5Y-F6il.cjs +2 -0
  2. package/dist/browser-B5Y-F6il.cjs.map +1 -0
  3. package/dist/browser-Cm3DA8l_.js +70 -0
  4. package/dist/browser-Cm3DA8l_.js.map +1 -0
  5. package/dist/{engine-B-RaFU77.js → direct-engine-BZRK27cv.js} +197 -508
  6. package/dist/direct-engine-BZRK27cv.js.map +1 -0
  7. package/dist/direct-engine-CZAhOupl.cjs +2 -0
  8. package/dist/direct-engine-CZAhOupl.cjs.map +1 -0
  9. package/dist/index.cjs +1 -1
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.js +283 -9
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/converters/browser.d.ts +32 -0
  14. package/dist/lib/converters/index.cjs +1 -1
  15. package/dist/lib/converters/index.cjs.map +1 -1
  16. package/dist/lib/converters/index.d.ts +3 -51
  17. package/dist/lib/converters/index.js +6 -1
  18. package/dist/lib/converters/index.js.map +1 -1
  19. package/dist/lib/converters/node.d.ts +51 -0
  20. package/dist/lib/converters/types.d.ts +6 -3
  21. package/dist/lib/image-encoder/image-encoder-worker.d.ts +24 -0
  22. package/dist/lib/image-encoder/index.d.ts +2 -0
  23. package/dist/lib/image-encoder/worker-pool.d.ts +61 -0
  24. package/dist/lib/orchestrator/index.d.ts +16 -0
  25. package/dist/lib/orchestrator/pdf-engine.d.ts +100 -0
  26. package/dist/lib/orchestrator/pdfium-native-runner.d.ts +65 -0
  27. package/dist/lib/orchestrator/remote-executor.d.ts +94 -0
  28. package/dist/lib/orchestrator/task-queue.d.ts +87 -0
  29. package/dist/lib/pdfium/engine.d.ts +50 -84
  30. package/dist/lib/pdfium/index.cjs +1 -1
  31. package/dist/lib/pdfium/index.cjs.map +1 -1
  32. package/dist/lib/pdfium/index.d.ts +5 -1
  33. package/dist/lib/pdfium/index.js +12 -7
  34. package/dist/lib/pdfium/index.js.map +1 -1
  35. package/dist/lib/pdfium/runner.d.ts +2 -2
  36. package/dist/lib/pdfium/web/direct-engine.cjs +1 -1
  37. package/dist/lib/pdfium/web/direct-engine.cjs.map +1 -1
  38. package/dist/lib/pdfium/web/direct-engine.d.ts +33 -2
  39. package/dist/lib/pdfium/web/direct-engine.js +5 -9
  40. package/dist/lib/pdfium/web/direct-engine.js.map +1 -1
  41. package/dist/lib/pdfium/web/worker-engine.cjs +1 -1
  42. package/dist/lib/pdfium/web/worker-engine.cjs.map +1 -1
  43. package/dist/lib/pdfium/web/worker-engine.d.ts +40 -4
  44. package/dist/lib/pdfium/web/worker-engine.js +415 -9
  45. package/dist/lib/pdfium/web/worker-engine.js.map +1 -1
  46. package/dist/lib/webworker/runner.d.ts +0 -12
  47. package/dist/pdf-engine-CrarIjJ6.cjs +2 -0
  48. package/dist/pdf-engine-CrarIjJ6.cjs.map +1 -0
  49. package/dist/pdf-engine-yZzBqL_l.js +798 -0
  50. package/dist/pdf-engine-yZzBqL_l.js.map +1 -0
  51. package/dist/preact/index.cjs +1 -1
  52. package/dist/preact/index.cjs.map +1 -1
  53. package/dist/preact/index.js +3 -3
  54. package/dist/preact/index.js.map +1 -1
  55. package/dist/react/index.cjs +1 -1
  56. package/dist/react/index.cjs.map +1 -1
  57. package/dist/react/index.js +3 -3
  58. package/dist/react/index.js.map +1 -1
  59. package/dist/shared-preact/hooks/use-pdfium-engine.d.ts +1 -0
  60. package/dist/shared-react/hooks/use-pdfium-engine.d.ts +1 -0
  61. package/dist/svelte/index.cjs +1 -1
  62. package/dist/svelte/index.cjs.map +1 -1
  63. package/dist/svelte/index.js +1 -1
  64. package/dist/svelte/index.js.map +1 -1
  65. package/dist/vue/index.cjs +1 -1
  66. package/dist/vue/index.cjs.map +1 -1
  67. package/dist/vue/index.js +2 -2
  68. package/dist/vue/index.js.map +1 -1
  69. package/package.json +3 -3
  70. package/dist/engine-B-RaFU77.js.map +0 -1
  71. package/dist/engine-CXnLqg_9.cjs +0 -2
  72. package/dist/engine-CXnLqg_9.cjs.map +0 -1
  73. package/dist/index-C3mv9vLs.js +0 -342
  74. package/dist/index-C3mv9vLs.js.map +0 -1
  75. package/dist/index-C4OBhnbs.cjs +0 -2
  76. package/dist/index-C4OBhnbs.cjs.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./index-C4OBhnbs.cjs"),e=require("./lib/webworker/engine.cjs"),o=require("./engine-CXnLqg_9.cjs");exports.DEFAULT_PDFIUM_WASM_URL=r.DEFAULT_PDFIUM_WASM_URL,exports.EngineRunner=r.EngineRunner,exports.PdfiumEngineRunner=r.PdfiumEngineRunner,exports.WebWorkerEngine=e.WebWorkerEngine,exports.WorkerTask=e.WorkerTask,exports.BitmapFormat=o.BitmapFormat,exports.OffscreenCanvasError=o.OffscreenCanvasError,exports.PdfiumEngine=o.PdfiumEngine,exports.PdfiumErrorCode=o.PdfiumErrorCode,exports.RenderFlag=o.RenderFlag,exports.browserImageDataToBlobConverter=o.browserImageDataToBlobConverter,exports.computeFormDrawParams=o.computeFormDrawParams,exports.isValidCustomKey=o.isValidCustomKey,exports.readArrayBuffer=o.readArrayBuffer,exports.readString=o.readString;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./lib/pdfium/index.cjs"),r=require("./lib/webworker/engine.cjs"),t=require("@embedpdf/models"),s=require("./direct-engine-CZAhOupl.cjs"),a=require("./lib/pdfium/web/worker-engine.cjs"),o=require("./browser-B5Y-F6il.cjs"),n="WebWorkerEngineRunner",i="Engine";exports.DEFAULT_PDFIUM_WASM_URL=e.DEFAULT_PDFIUM_WASM_URL,exports.WebWorkerEngine=r.WebWorkerEngine,exports.WorkerTask=r.WorkerTask,exports.BitmapFormat=s.BitmapFormat,exports.PdfiumErrorCode=s.PdfiumErrorCode,exports.PdfiumNative=s.PdfiumNative,exports.RenderFlag=s.RenderFlag,exports.computeFormDrawParams=s.computeFormDrawParams,exports.createPdfiumDirectEngine=s.createPdfiumEngine,exports.isValidCustomKey=s.isValidCustomKey,exports.readArrayBuffer=s.readArrayBuffer,exports.readString=s.readString,exports.createPdfiumWorkerEngine=a.createPdfiumEngine,exports.OffscreenCanvasError=o.OffscreenCanvasError,exports.browserImageDataToBlobConverter=o.browserImageDataToBlobConverter,exports.createHybridImageConverter=o.createHybridImageConverter,exports.createWorkerPoolImageConverter=o.createWorkerPoolImageConverter,exports.EngineRunner=class{constructor(e=new t.NoopLogger){this.logger=e,this.execute=async e=>{if(this.logger.debug(n,i,"runner start exeucte request"),!this.engine){const r={type:"reject",reason:{code:t.PdfErrorCode.NotReady,message:"engine has not started yet"}},s={id:e.id,type:"ExecuteResponse",data:{type:"error",value:r}};return void this.respond(s)}const r=this.engine,{name:s,args:a}=e.data;if(!r[s]){const r={type:"reject",reason:{code:t.PdfErrorCode.NotSupport,message:`engine method ${s} is not supported yet`}},a={id:e.id,type:"ExecuteResponse",data:{type:"error",value:r}};return void this.respond(a)}let o;switch(s){case"isSupport":case"initialize":case"destroy":case"openDocumentUrl":case"openDocumentBuffer":case"getDocPermissions":case"getDocUserPermissions":case"getMetadata":case"setMetadata":case"getBookmarks":case"setBookmarks":case"deleteBookmarks":case"getSignatures":case"renderPage":case"renderPageRect":case"renderPageAnnotation":case"renderThumbnail":case"getAllAnnotations":case"getPageAnnotations":case"createPageAnnotation":case"updatePageAnnotation":case"removePageAnnotation":case"getPageTextRects":case"searchAllPages":case"closeDocument":case"closeAllDocuments":case"saveAsCopy":case"getAttachments":case"addAttachment":case"removeAttachment":case"readAttachmentContent":case"setFormFieldValue":case"flattenPage":case"extractPages":case"extractText":case"redactTextInRects":case"getTextSlices":case"getPageGlyphs":case"getPageGeometry":case"merge":case"mergePages":case"preparePrintDocument":o=this.engine[s](...a)}o.onProgress(r=>{const t={id:e.id,type:"ExecuteProgress",data:r};this.respond(t)}),o.wait(r=>{const t={id:e.id,type:"ExecuteResponse",data:{type:"result",value:r}};this.respond(t)},r=>{const t={id:e.id,type:"ExecuteResponse",data:{type:"error",value:r}};this.respond(t)})}}listen(){self.onmessage=e=>this.handle(e)}handle(e){this.logger.debug(n,i,"webworker receive message event: ",e.data);try{const r=e.data;if("ExecuteRequest"===r.type)this.execute(r)}catch(r){this.logger.info(n,i,"webworker met error when processing message event:",r)}}ready(){this.listen(),this.respond({id:"0",type:"ReadyResponse"}),this.logger.debug(n,i,"runner is ready")}respond(e){this.logger.debug(n,i,"runner respond: ",e),self.postMessage(e)}};
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.cjs","sources":["../src/lib/webworker/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 * Request body that represent method calls of PdfEngine, it contains the\n * method name and arguments\n */\nexport type SpecificExecuteRequest<M extends PdfEngineMethodName> = {\n id: string;\n type: 'ExecuteRequest';\n data: {\n name: M;\n args: PdfEngineMethodArgs<M>;\n };\n};\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 progress of the task\n */\nexport interface ExecuteProgress<T = unknown> {\n /**\n * message id\n */\n id: string;\n /**\n * response type\n */\n type: 'ExecuteProgress';\n /**\n * response body\n */\n data: T;\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 | ExecuteProgress;\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 = async (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 'openDocumentBuffer':\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 'setMetadata':\n task = this.engine[name]!(...args);\n break;\n case 'getBookmarks':\n task = this.engine[name]!(...args);\n break;\n case 'setBookmarks':\n task = this.engine[name]!(...args);\n break;\n case 'deleteBookmarks':\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 'renderPageAnnotation':\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 '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 'closeAllDocuments':\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 'addAttachment':\n task = this.engine[name]!(...args);\n break;\n case 'removeAttachment':\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 'redactTextInRects':\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 case 'preparePrintDocument':\n task = this.engine[name]!(...args);\n break;\n }\n\n task.onProgress((progress) => {\n const response: ExecuteProgress = {\n id: request.id,\n type: 'ExecuteProgress',\n data: progress,\n };\n this.respond(response);\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"],"names":["LOG_SOURCE","LOG_CATEGORY","constructor","logger","NoopLogger","this","execute","async","request","debug","engine","error","type","reason","code","PdfErrorCode","NotReady","message","response","id","data","value","respond","name","args","NotSupport","task","onProgress","progress","wait","result","listen","self","onmessage","evt","handle","e","info","ready","postMessage"],"mappings":"8TAoIMA,EAAa,wBACbC,EAAe,k1BAMd,MAOL,WAAAC,CAAmBC,EAAiB,IAAIC,EAAAA,YAArBC,KAAAF,OAAAA,EAwDnBE,KAAAC,QAAUC,MAAOC,IAEf,GADAH,KAAKF,OAAOM,MAAMT,EAAYC,EAAc,iCACvCI,KAAKK,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,YADAN,KAAKiB,QAAQJ,EAEf,CAEA,MAAMR,EAASL,KAAKK,QACda,KAAEA,EAAAC,KAAMA,GAAShB,EAAQY,KAC/B,IAAKV,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,YADAN,KAAKiB,QAAQJ,EAEf,CAEA,IAAIQ,EACJ,OAAQH,GACN,IAAK,YAGL,IAAK,aAGL,IAAK,UAGL,IAAK,kBAGL,IAAK,qBAGL,IAAK,oBAGL,IAAK,wBAGL,IAAK,cAGL,IAAK,cAGL,IAAK,eAGL,IAAK,eAGL,IAAK,kBAGL,IAAK,gBAGL,IAAK,aAGL,IAAK,iBAGL,IAAK,uBAGL,IAAK,kBAGL,IAAK,oBAGL,IAAK,qBAGL,IAAK,uBAGL,IAAK,uBAGL,IAAK,uBAGL,IAAK,mBAGL,IAAK,iBAGL,IAAK,gBAGL,IAAK,oBAGL,IAAK,aAGL,IAAK,iBAGL,IAAK,gBAGL,IAAK,mBAGL,IAAK,wBAGL,IAAK,oBAGL,IAAK,cAGL,IAAK,eAGL,IAAK,cAGL,IAAK,oBAGL,IAAK,gBAGL,IAAK,gBAGL,IAAK,kBAGL,IAAK,QAGL,IAAK,aAGL,IAAK,uBACHG,EAAOrB,KAAKK,OAAOa,MAAUC,GAIjCE,EAAKC,WAAYC,IACf,MAAMV,EAA4B,CAChCC,GAAIX,EAAQW,GACZP,KAAM,kBACNQ,KAAMQ,GAERvB,KAAKiB,QAAQJ,KAGfQ,EAAKG,KACFC,IACC,MAAMZ,EAA4B,CAChCC,GAAIX,EAAQW,GACZP,KAAM,kBACNQ,KAAM,CACJR,KAAM,SACNS,MAAOS,IAGXzB,KAAKiB,QAAQJ,IAEdP,IACC,MAAMO,EAA4B,CAChCC,GAAIX,EAAQW,GACZP,KAAM,kBACNQ,KAAM,CACJR,KAAM,QACNS,MAAOV,IAGXN,KAAKiB,QAAQJ,KApQoC,CAKvD,MAAAa,GACEC,KAAKC,UAAaC,GACT7B,KAAK8B,OAAOD,EAEvB,CAKA,MAAAC,CAAOD,GACL7B,KAAKF,OAAOM,MAAMT,EAAYC,EAAc,oCAAqCiC,EAAId,MACrF,IACE,MAAMZ,EAAU0B,EAAId,KACpB,GACO,mBADCZ,EAAQI,KAEZP,KAAKC,QAAQE,EAGnB,OAAS4B,GACP/B,KAAKF,OAAOkC,KACVrC,EACAC,EACA,qDACAmC,EAEJ,CACF,CAQA,KAAAE,GACEjC,KAAK0B,SAEL1B,KAAKiB,QAAQ,CACXH,GAAI,IACJP,KAAM,kBAERP,KAAKF,OAAOM,MAAMT,EAAYC,EAAc,kBAC9C,CAgOA,OAAAqB,CAAQJ,GACNb,KAAKF,OAAOM,MAAMT,EAAYC,EAAc,mBAAoBiB,GAChEc,KAAKO,YAAYrB,EACnB"}
package/dist/index.js CHANGED
@@ -1,21 +1,295 @@
1
- import { D, E, P } from "./index-C3mv9vLs.js";
1
+ import { DEFAULT_PDFIUM_WASM_URL } from "./lib/pdfium/index.js";
2
2
  import { WebWorkerEngine, WorkerTask } from "./lib/webworker/engine.js";
3
- import { B, O, a, P as P2, R, b, d, i, c, r } from "./engine-B-RaFU77.js";
3
+ import { NoopLogger, PdfErrorCode } from "@embedpdf/models";
4
+ import { B, P, a, R, d, c, i, b, r } from "./direct-engine-BZRK27cv.js";
5
+ import { createPdfiumEngine } from "./lib/pdfium/web/worker-engine.js";
6
+ import { O, b as b2, a as a2, c as c2 } from "./browser-Cm3DA8l_.js";
7
+ const LOG_SOURCE = "WebWorkerEngineRunner";
8
+ const LOG_CATEGORY = "Engine";
9
+ class EngineRunner {
10
+ /**
11
+ * Create instance of EngineRunnder
12
+ * @param logger - logger instance
13
+ */
14
+ constructor(logger = new NoopLogger()) {
15
+ this.logger = logger;
16
+ this.execute = async (request) => {
17
+ this.logger.debug(LOG_SOURCE, LOG_CATEGORY, "runner start exeucte request");
18
+ if (!this.engine) {
19
+ const error = {
20
+ type: "reject",
21
+ reason: {
22
+ code: PdfErrorCode.NotReady,
23
+ message: "engine has not started yet"
24
+ }
25
+ };
26
+ const response = {
27
+ id: request.id,
28
+ type: "ExecuteResponse",
29
+ data: {
30
+ type: "error",
31
+ value: error
32
+ }
33
+ };
34
+ this.respond(response);
35
+ return;
36
+ }
37
+ const engine = this.engine;
38
+ const { name, args } = request.data;
39
+ if (!engine[name]) {
40
+ const error = {
41
+ type: "reject",
42
+ reason: {
43
+ code: PdfErrorCode.NotSupport,
44
+ message: `engine method ${name} is not supported yet`
45
+ }
46
+ };
47
+ const response = {
48
+ id: request.id,
49
+ type: "ExecuteResponse",
50
+ data: {
51
+ type: "error",
52
+ value: error
53
+ }
54
+ };
55
+ this.respond(response);
56
+ return;
57
+ }
58
+ let task;
59
+ switch (name) {
60
+ case "isSupport":
61
+ task = this.engine[name](...args);
62
+ break;
63
+ case "initialize":
64
+ task = this.engine[name](...args);
65
+ break;
66
+ case "destroy":
67
+ task = this.engine[name](...args);
68
+ break;
69
+ case "openDocumentUrl":
70
+ task = this.engine[name](...args);
71
+ break;
72
+ case "openDocumentBuffer":
73
+ task = this.engine[name](...args);
74
+ break;
75
+ case "getDocPermissions":
76
+ task = this.engine[name](...args);
77
+ break;
78
+ case "getDocUserPermissions":
79
+ task = this.engine[name](...args);
80
+ break;
81
+ case "getMetadata":
82
+ task = this.engine[name](...args);
83
+ break;
84
+ case "setMetadata":
85
+ task = this.engine[name](...args);
86
+ break;
87
+ case "getBookmarks":
88
+ task = this.engine[name](...args);
89
+ break;
90
+ case "setBookmarks":
91
+ task = this.engine[name](...args);
92
+ break;
93
+ case "deleteBookmarks":
94
+ task = this.engine[name](...args);
95
+ break;
96
+ case "getSignatures":
97
+ task = this.engine[name](...args);
98
+ break;
99
+ case "renderPage":
100
+ task = this.engine[name](...args);
101
+ break;
102
+ case "renderPageRect":
103
+ task = this.engine[name](...args);
104
+ break;
105
+ case "renderPageAnnotation":
106
+ task = this.engine[name](...args);
107
+ break;
108
+ case "renderThumbnail":
109
+ task = this.engine[name](...args);
110
+ break;
111
+ case "getAllAnnotations":
112
+ task = this.engine[name](...args);
113
+ break;
114
+ case "getPageAnnotations":
115
+ task = this.engine[name](...args);
116
+ break;
117
+ case "createPageAnnotation":
118
+ task = this.engine[name](...args);
119
+ break;
120
+ case "updatePageAnnotation":
121
+ task = this.engine[name](...args);
122
+ break;
123
+ case "removePageAnnotation":
124
+ task = this.engine[name](...args);
125
+ break;
126
+ case "getPageTextRects":
127
+ task = this.engine[name](...args);
128
+ break;
129
+ case "searchAllPages":
130
+ task = this.engine[name](...args);
131
+ break;
132
+ case "closeDocument":
133
+ task = this.engine[name](...args);
134
+ break;
135
+ case "closeAllDocuments":
136
+ task = this.engine[name](...args);
137
+ break;
138
+ case "saveAsCopy":
139
+ task = this.engine[name](...args);
140
+ break;
141
+ case "getAttachments":
142
+ task = this.engine[name](...args);
143
+ break;
144
+ case "addAttachment":
145
+ task = this.engine[name](...args);
146
+ break;
147
+ case "removeAttachment":
148
+ task = this.engine[name](...args);
149
+ break;
150
+ case "readAttachmentContent":
151
+ task = this.engine[name](...args);
152
+ break;
153
+ case "setFormFieldValue":
154
+ task = this.engine[name](...args);
155
+ break;
156
+ case "flattenPage":
157
+ task = this.engine[name](...args);
158
+ break;
159
+ case "extractPages":
160
+ task = this.engine[name](...args);
161
+ break;
162
+ case "extractText":
163
+ task = this.engine[name](...args);
164
+ break;
165
+ case "redactTextInRects":
166
+ task = this.engine[name](...args);
167
+ break;
168
+ case "getTextSlices":
169
+ task = this.engine[name](...args);
170
+ break;
171
+ case "getPageGlyphs":
172
+ task = this.engine[name](...args);
173
+ break;
174
+ case "getPageGeometry":
175
+ task = this.engine[name](...args);
176
+ break;
177
+ case "merge":
178
+ task = this.engine[name](...args);
179
+ break;
180
+ case "mergePages":
181
+ task = this.engine[name](...args);
182
+ break;
183
+ case "preparePrintDocument":
184
+ task = this.engine[name](...args);
185
+ break;
186
+ }
187
+ task.onProgress((progress) => {
188
+ const response = {
189
+ id: request.id,
190
+ type: "ExecuteProgress",
191
+ data: progress
192
+ };
193
+ this.respond(response);
194
+ });
195
+ task.wait(
196
+ (result) => {
197
+ const response = {
198
+ id: request.id,
199
+ type: "ExecuteResponse",
200
+ data: {
201
+ type: "result",
202
+ value: result
203
+ }
204
+ };
205
+ this.respond(response);
206
+ },
207
+ (error) => {
208
+ const response = {
209
+ id: request.id,
210
+ type: "ExecuteResponse",
211
+ data: {
212
+ type: "error",
213
+ value: error
214
+ }
215
+ };
216
+ this.respond(response);
217
+ }
218
+ );
219
+ };
220
+ }
221
+ /**
222
+ * Listening on post message
223
+ */
224
+ listen() {
225
+ self.onmessage = (evt) => {
226
+ return this.handle(evt);
227
+ };
228
+ }
229
+ /**
230
+ * Handle post message
231
+ */
232
+ handle(evt) {
233
+ this.logger.debug(LOG_SOURCE, LOG_CATEGORY, "webworker receive message event: ", evt.data);
234
+ try {
235
+ const request = evt.data;
236
+ switch (request.type) {
237
+ case "ExecuteRequest":
238
+ this.execute(request);
239
+ break;
240
+ }
241
+ } catch (e) {
242
+ this.logger.info(
243
+ LOG_SOURCE,
244
+ LOG_CATEGORY,
245
+ "webworker met error when processing message event:",
246
+ e
247
+ );
248
+ }
249
+ }
250
+ /**
251
+ * Send the ready response when pdf engine is ready
252
+ * @returns
253
+ *
254
+ * @protected
255
+ */
256
+ ready() {
257
+ this.listen();
258
+ this.respond({
259
+ id: "0",
260
+ type: "ReadyResponse"
261
+ });
262
+ this.logger.debug(LOG_SOURCE, LOG_CATEGORY, "runner is ready");
263
+ }
264
+ /**
265
+ * Send back the response
266
+ * @param response - response that needs sent back
267
+ *
268
+ * @protected
269
+ */
270
+ respond(response) {
271
+ this.logger.debug(LOG_SOURCE, LOG_CATEGORY, "runner respond: ", response);
272
+ self.postMessage(response);
273
+ }
274
+ }
4
275
  export {
5
276
  B as BitmapFormat,
6
- D as DEFAULT_PDFIUM_WASM_URL,
7
- E as EngineRunner,
277
+ DEFAULT_PDFIUM_WASM_URL,
278
+ EngineRunner,
8
279
  O as OffscreenCanvasError,
9
- a as PdfiumEngine,
10
- P as PdfiumEngineRunner,
11
- P2 as PdfiumErrorCode,
280
+ P as PdfiumErrorCode,
281
+ a as PdfiumNative,
12
282
  R as RenderFlag,
13
283
  WebWorkerEngine,
14
284
  WorkerTask,
15
- b as browserImageDataToBlobConverter,
285
+ b2 as browserImageDataToBlobConverter,
16
286
  d as computeFormDrawParams,
287
+ a2 as createHybridImageConverter,
288
+ c as createPdfiumDirectEngine,
289
+ createPdfiumEngine as createPdfiumWorkerEngine,
290
+ c2 as createWorkerPoolImageConverter,
17
291
  i as isValidCustomKey,
18
- c as readArrayBuffer,
292
+ b as readArrayBuffer,
19
293
  r as readString
20
294
  };
21
295
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/lib/webworker/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 * Request body that represent method calls of PdfEngine, it contains the\n * method name and arguments\n */\nexport type SpecificExecuteRequest<M extends PdfEngineMethodName> = {\n id: string;\n type: 'ExecuteRequest';\n data: {\n name: M;\n args: PdfEngineMethodArgs<M>;\n };\n};\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 progress of the task\n */\nexport interface ExecuteProgress<T = unknown> {\n /**\n * message id\n */\n id: string;\n /**\n * response type\n */\n type: 'ExecuteProgress';\n /**\n * response body\n */\n data: T;\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 | ExecuteProgress;\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 = async (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 'openDocumentBuffer':\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 'setMetadata':\n task = this.engine[name]!(...args);\n break;\n case 'getBookmarks':\n task = this.engine[name]!(...args);\n break;\n case 'setBookmarks':\n task = this.engine[name]!(...args);\n break;\n case 'deleteBookmarks':\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 'renderPageAnnotation':\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 '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 'closeAllDocuments':\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 'addAttachment':\n task = this.engine[name]!(...args);\n break;\n case 'removeAttachment':\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 'redactTextInRects':\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 case 'preparePrintDocument':\n task = this.engine[name]!(...args);\n break;\n }\n\n task.onProgress((progress) => {\n const response: ExecuteProgress = {\n id: request.id,\n type: 'ExecuteProgress',\n data: progress,\n };\n this.respond(response);\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"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { ImageConversionTypes } from '@embedpdf/models';
2
+ import { ImageDataConverter } from './types';
3
+ import { ImageEncoderWorkerPool } from '../image-encoder';
4
+ export declare class OffscreenCanvasError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ /**
8
+ * Browser-based image converter using OffscreenCanvas in the same thread
9
+ * This is the simplest approach but blocks the thread during encoding
10
+ */
11
+ export declare const browserImageDataToBlobConverter: ImageDataConverter<Blob>;
12
+ /**
13
+ * Create an image converter that uses a dedicated worker pool for encoding
14
+ * This prevents blocking the main/PDFium worker thread
15
+ *
16
+ * @param workerPool - Instance of ImageEncoderWorkerPool
17
+ * @returns ImageDataConverter function
18
+ */
19
+ export declare function createWorkerPoolImageConverter(workerPool: ImageEncoderWorkerPool): ImageDataConverter<Blob>;
20
+ /**
21
+ * Hybrid converter: tries worker pool first, falls back to WASM encoding
22
+ * This provides the best performance with graceful degradation
23
+ *
24
+ * @param workerPool - Instance of ImageEncoderWorkerPool
25
+ * @param wasmFallback - WASM-based encoding function
26
+ * @returns ImageDataConverter function
27
+ */
28
+ export declare function createHybridImageConverter(workerPool: ImageEncoderWorkerPool, wasmFallback: (imageData: {
29
+ data: Uint8ClampedArray;
30
+ width: number;
31
+ height: number;
32
+ }, imageType: ImageConversionTypes, quality?: number) => Blob): ImageDataConverter<Blob>;
@@ -1,2 +1,2 @@
1
- "use strict";function e(e){const{buffer:t,byteOffset:r,byteLength:a}=e;if(t instanceof ArrayBuffer)return t.slice(r,r+a);const n=new ArrayBuffer(a);return new Uint8Array(n).set(new Uint8Array(t,r,a)),n}Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),exports.createCustomImageDataToBlobConverter=function(t){return async(r,a="image/webp",n)=>{const o=r(),i=await t(o,a,n);return new Blob([e(i)],{type:a})}},exports.createCustomImageDataToBufferConverter=function(e){return async(t,r="image/webp",a)=>{const n=t();return await e(n,r,a)}},exports.createNodeCanvasImageDataToBlobConverter=function(e){return async(t,r="image/webp",a)=>{const n=t(),{width:o,height:i}=n,u=e(o,i);let f;switch(u.getContext("2d").putImageData(n,0,0),r){case"image/webp":f=u.toBuffer("image/webp");break;case"image/png":f=u.toBuffer("image/png");break;case"image/jpeg":f=u.toBuffer("image/jpeg");break;default:throw new Error(`Unsupported image type: ${r}`)}return f}},exports.createNodeImageDataToBufferConverter=function(e){return async(t,r="image/webp",a)=>{const n=t(),{width:o,height:i,data:u}=n;let f,g=e(Buffer.from(u),{raw:{width:o,height:i,channels:4}});switch(r){case"image/webp":f=await g.webp({quality:a}).toBuffer();break;case"image/png":f=await g.png().toBuffer();break;case"image/jpeg":f=await g.flatten({background:{r:255,g:255,b:255}}).jpeg({quality:a}).toBuffer();break;default:throw new Error(`Unsupported image type: ${r}`)}return f}};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../browser-B5Y-F6il.cjs");function r(e){const{buffer:r,byteOffset:t,byteLength:a}=e;if(r instanceof ArrayBuffer)return r.slice(t,t+a);const o=new ArrayBuffer(a);return new Uint8Array(o).set(new Uint8Array(r,t,a)),o}exports.OffscreenCanvasError=e.OffscreenCanvasError,exports.browserImageDataToBlobConverter=e.browserImageDataToBlobConverter,exports.createHybridImageConverter=e.createHybridImageConverter,exports.createWorkerPoolImageConverter=e.createWorkerPoolImageConverter,exports.createCustomImageDataToBlobConverter=function(e){return async(t,a="image/webp",o)=>{const n=t(),s=await e(n,a,o);return new Blob([r(s)],{type:a})}},exports.createCustomImageDataToBufferConverter=function(e){return async(r,t="image/webp",a)=>{const o=r();return await e(o,t,a)}},exports.createNodeCanvasImageDataToBlobConverter=function(e){return async(r,t="image/webp",a)=>{const o=r(),{width:n,height:s}=o,i=e(n,s);let g;switch(i.getContext("2d").putImageData(o,0,0),t){case"image/webp":g=i.toBuffer("image/webp");break;case"image/png":g=i.toBuffer("image/png");break;case"image/jpeg":g=i.toBuffer("image/jpeg");break;default:throw new Error(`Unsupported image type: ${t}`)}return g}},exports.createNodeImageDataToBufferConverter=function(e){return async(r,t="image/webp",a)=>{const o=r(),{width:n,height:s,data:i}=o;let g,f=e(Buffer.from(i),{raw:{width:n,height:s,channels:4}});switch(t){case"image/webp":g=await f.webp({quality:a}).toBuffer();break;case"image/png":g=await f.png().toBuffer();break;case"image/jpeg":g=await f.flatten({background:{r:255,g:255,b:255}}).jpeg({quality:a}).toBuffer();break;default:throw new Error(`Unsupported image type: ${t}`)}return g}};
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/lib/utils.ts","../../../src/lib/converters/index.ts"],"sourcesContent":["// Returns a plain ArrayBuffer (no SharedArrayBuffer), sliced to the view’s region.\nexport function toArrayBuffer(view: ArrayBufferView): ArrayBuffer {\n const { buffer, byteOffset, byteLength } = view;\n if (buffer instanceof ArrayBuffer) {\n return buffer.slice(byteOffset, byteOffset + byteLength);\n }\n // SharedArrayBuffer (or unknown) → copy once\n const ab = new ArrayBuffer(byteLength);\n new Uint8Array(ab).set(new Uint8Array(buffer as ArrayBufferLike, byteOffset, byteLength));\n return ab;\n}\n\n// Ensures ImageData gets a Uint8ClampedArray backed by a real ArrayBuffer.\nexport function toClampedRGBA(\n data: ArrayBufferView | Uint8Array | Uint8ClampedArray,\n): Uint8ClampedArray {\n if (data instanceof Uint8ClampedArray && data.buffer instanceof ArrayBuffer) return data;\n return new Uint8ClampedArray(toArrayBuffer(data as ArrayBufferView));\n}\n","import { PdfImage } from '@embedpdf/models';\nimport { toArrayBuffer } from '../utils';\nimport { ImageDataConverter, ImageConversionTypes, LazyImageData } from './types';\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 imageDataConverter = createNodeImageDataToBufferConverter(sharp);\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\n * ```\n */\nexport function createNodeImageDataToBufferConverter(\n sharp: any, // Using 'any' to avoid requiring sharp as a dependency\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\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\n .webp({\n quality: imageQuality,\n })\n .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 quality: imageQuality,\n })\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 imageDataConverter = createNodeCanvasImageDataToBlobConverter(createCanvas);\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\n * ```\n */\nexport function createNodeCanvasImageDataToBlobConverter(\n createCanvas: any, // Using 'any' to avoid requiring canvas as a dependency\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n _imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\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: (\n imageData: PdfImage,\n imageType?: ImageConversionTypes,\n imageQuality?: number,\n ) => Promise<Buffer>,\n): ImageDataConverter {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ) => {\n const imageData = getImageData();\n const bytes = await processor(imageData, imageType, imageQuality);\n return new Blob([toArrayBuffer(bytes)], { 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: (\n imageData: PdfImage,\n imageType: ImageConversionTypes,\n imageQuality?: number,\n ) => Promise<Buffer>,\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\n return await processor(imageData, imageType, imageQuality);\n };\n}\n"],"names":["toArrayBuffer","view","buffer","byteOffset","byteLength","ArrayBuffer","slice","ab","Uint8Array","set","processor","async","getImageData","imageType","imageQuality","imageData","bytes","Blob","type","createCanvas","_imageQuality","width","height","canvas","getContext","putImageData","toBuffer","Error","sharp","data","sharpInstance","Buffer","from","raw","channels","webp","quality","png","flatten","background","r","g","b","jpeg"],"mappings":"aACO,SAASA,EAAcC,GAC5B,MAAMC,OAAEA,EAAAC,WAAQA,EAAAC,WAAYA,GAAeH,EAC3C,GAAIC,aAAkBG,YACpB,OAAOH,EAAOI,MAAMH,EAAYA,EAAaC,GAG/C,MAAMG,EAAK,IAAIF,YAAYD,GAE3B,OADA,IAAII,WAAWD,GAAIE,IAAI,IAAID,WAAWN,EAA2BC,EAAYC,IACtEG,CACT,iHCwHO,SACLG,GAMA,OAAOC,MACLC,EACAC,EAAkC,aAClCC,KAEA,MAAMC,EAAYH,IACZI,QAAcN,EAAUK,EAAWF,EAAWC,GACpD,OAAO,IAAIG,KAAK,CAACjB,EAAcgB,IAAS,CAAEE,KAAML,IAEpD,iDAQO,SACLH,GAMA,OAAOC,MACLC,EACAC,EAAkC,aAClCC,KAEA,MAAMC,EAAYH,IAClB,aAAaF,EAAUK,EAAWF,EAAWC,GAEjD,mDAxFO,SACLK,GAEA,OAAOR,MACLC,EACAC,EAAkC,aAClCO,KAEA,MAAML,EAAYH,KACZS,MAAEA,EAAAC,OAAOA,GAAWP,EAGpBQ,EAASJ,EAAaE,EAAOC,GAKnC,IAAIpB,EACJ,OALYqB,EAAOC,WAAW,MAC1BC,aAAaV,EAAW,EAAG,GAIvBF,GACN,IAAK,aACHX,EAASqB,EAAOG,SAAS,cACzB,MACF,IAAK,YACHxB,EAASqB,EAAOG,SAAS,aACzB,MACF,IAAK,aACHxB,EAASqB,EAAOG,SAAS,cACzB,MACF,QACE,MAAM,IAAIC,MAAM,2BAA2Bd,KAG/C,OAAOX,EAEX,+CAlGO,SACL0B,GAEA,OAAOjB,MACLC,EACAC,EAAkC,aAClCC,KAEA,MAAMC,EAAYH,KACZS,MAAEA,EAAAC,OAAOA,EAAAO,KAAQA,GAASd,EAIhC,IASIb,EATA4B,EAAgBF,EAAMG,OAAOC,KAAKH,GAAO,CAC3CI,IAAK,CACHZ,QACAC,SACAY,SAAU,KAMd,OAAQrB,GACN,IAAK,aACHX,QAAe4B,EACZK,KAAK,CACJC,QAAStB,IAEVY,WACH,MACF,IAAK,YACHxB,QAAe4B,EAAcO,MAAMX,WACnC,MACF,IAAK,aAEHxB,QAAe4B,EACZQ,QAAQ,CAAEC,WAAY,CAAEC,EAAG,IAAKC,EAAG,IAAKC,EAAG,OAC3CC,KAAK,CACJP,QAAStB,IAEVY,WACH,MACF,QACE,MAAM,IAAIC,MAAM,2BAA2Bd,KAG/C,OAAOX,EAEX"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/lib/utils.ts","../../../src/lib/converters/node.ts"],"sourcesContent":["// Returns a plain ArrayBuffer (no SharedArrayBuffer), sliced to the view’s region.\nexport function toArrayBuffer(view: ArrayBufferView): ArrayBuffer {\n const { buffer, byteOffset, byteLength } = view;\n if (buffer instanceof ArrayBuffer) {\n return buffer.slice(byteOffset, byteOffset + byteLength);\n }\n // SharedArrayBuffer (or unknown) → copy once\n const ab = new ArrayBuffer(byteLength);\n new Uint8Array(ab).set(new Uint8Array(buffer as ArrayBufferLike, byteOffset, byteLength));\n return ab;\n}\n\n// Ensures ImageData gets a Uint8ClampedArray backed by a real ArrayBuffer.\nexport function toClampedRGBA(\n data: ArrayBufferView | Uint8Array | Uint8ClampedArray,\n): Uint8ClampedArray {\n if (data instanceof Uint8ClampedArray && data.buffer instanceof ArrayBuffer) return data;\n return new Uint8ClampedArray(toArrayBuffer(data as ArrayBufferView));\n}\n","import type { PdfImage, ImageConversionTypes } from '@embedpdf/models';\nimport { toArrayBuffer } from '../utils';\nimport type { ImageDataConverter, LazyImageData } from './types';\n\n// ============================================================================\n// Node.js Converters\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';\n *\n * const imageDataConverter = createNodeImageDataToBufferConverter(sharp);\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\n * ```\n */\nexport function createNodeImageDataToBufferConverter(\n sharp: any, // Using 'any' to avoid requiring sharp as a dependency\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\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\n .webp({\n quality: imageQuality,\n })\n .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 quality: imageQuality,\n })\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';\n *\n * const imageDataConverter = createNodeCanvasImageDataToBlobConverter(createCanvas);\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\n * ```\n */\nexport function createNodeCanvasImageDataToBlobConverter(\n createCanvas: any, // Using 'any' to avoid requiring canvas as a dependency\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n _imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\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: (\n imageData: PdfImage,\n imageType?: ImageConversionTypes,\n imageQuality?: number,\n ) => Promise<Buffer>,\n): ImageDataConverter {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ) => {\n const imageData = getImageData();\n const bytes = await processor(imageData, imageType, imageQuality);\n return new Blob([toArrayBuffer(bytes)], { 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: (\n imageData: PdfImage,\n imageType: ImageConversionTypes,\n imageQuality?: number,\n ) => Promise<Buffer>,\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\n return await processor(imageData, imageType, imageQuality);\n };\n}\n"],"names":["toArrayBuffer","view","buffer","byteOffset","byteLength","ArrayBuffer","slice","ab","Uint8Array","set","processor","async","getImageData","imageType","imageQuality","imageData","bytes","Blob","type","createCanvas","_imageQuality","width","height","canvas","getContext","putImageData","toBuffer","Error","sharp","data","sharpInstance","Buffer","from","raw","channels","webp","quality","png","flatten","background","r","g","b","jpeg"],"mappings":"8HACO,SAASA,EAAcC,GAC5B,MAAMC,OAAEA,EAAAC,WAAQA,EAAAC,WAAYA,GAAeH,EAC3C,GAAIC,aAAkBG,YACpB,OAAOH,EAAOI,MAAMH,EAAYA,EAAaC,GAG/C,MAAMG,EAAK,IAAIF,YAAYD,GAE3B,OADA,IAAII,WAAWD,GAAIE,IAAI,IAAID,WAAWN,EAA2BC,EAAYC,IACtEG,CACT,oTC4HO,SACLG,GAMA,OAAOC,MACLC,EACAC,EAAkC,aAClCC,KAEA,MAAMC,EAAYH,IACZI,QAAcN,EAAUK,EAAWF,EAAWC,GACpD,OAAO,IAAIG,KAAK,CAACjB,EAAcgB,IAAS,CAAEE,KAAML,IAEpD,iDAQO,SACLH,GAMA,OAAOC,MACLC,EACAC,EAAkC,aAClCC,KAEA,MAAMC,EAAYH,IAClB,aAAaF,EAAUK,EAAWF,EAAWC,GAEjD,mDAxFO,SACLK,GAEA,OAAOR,MACLC,EACAC,EAAkC,aAClCO,KAEA,MAAML,EAAYH,KACZS,MAAEA,EAAAC,OAAOA,GAAWP,EAGpBQ,EAASJ,EAAaE,EAAOC,GAKnC,IAAIpB,EACJ,OALYqB,EAAOC,WAAW,MAC1BC,aAAaV,EAAW,EAAG,GAIvBF,GACN,IAAK,aACHX,EAASqB,EAAOG,SAAS,cACzB,MACF,IAAK,YACHxB,EAASqB,EAAOG,SAAS,aACzB,MACF,IAAK,aACHxB,EAASqB,EAAOG,SAAS,cACzB,MACF,QACE,MAAM,IAAIC,MAAM,2BAA2Bd,KAG/C,OAAOX,EAEX,+CAlGO,SACL0B,GAEA,OAAOjB,MACLC,EACAC,EAAkC,aAClCC,KAEA,MAAMC,EAAYH,KACZS,MAAEA,EAAAC,OAAOA,EAAAO,KAAQA,GAASd,EAIhC,IASIb,EATA4B,EAAgBF,EAAMG,OAAOC,KAAKH,GAAO,CAC3CI,IAAK,CACHZ,QACAC,SACAY,SAAU,KAMd,OAAQrB,GACN,IAAK,aACHX,QAAe4B,EACZK,KAAK,CACJC,QAAStB,IAEVY,WACH,MACF,IAAK,YACHxB,QAAe4B,EAAcO,MAAMX,WACnC,MACF,IAAK,aAEHxB,QAAe4B,EACZQ,QAAQ,CAAEC,WAAY,CAAEC,EAAG,IAAKC,EAAG,IAAKC,EAAG,OAC3CC,KAAK,CACJP,QAAStB,IAEVY,WACH,MACF,QACE,MAAM,IAAIC,MAAM,2BAA2Bd,KAG/C,OAAOX,EAEX"}
@@ -1,51 +1,3 @@
1
- import { PdfImage } from '@embedpdf/models';
2
- import { ImageDataConverter, ImageConversionTypes } from './types';
3
- /**
4
- * Node.js implementation using Sharp
5
- * This requires the 'sharp' package to be installed
6
- *
7
- * @example
8
- * ```typescript
9
- * import sharp from 'sharp';
10
- * import { createNodeImageDataToBufferConverter } from '@embedpdf/engines/pdfium/image-converters';
11
- *
12
- * const imageDataConverter = createNodeImageDataToBufferConverter(sharp);
13
- * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });
14
- * ```
15
- */
16
- export declare function createNodeImageDataToBufferConverter(sharp: any): ImageDataConverter<Buffer>;
17
- /**
18
- * Alternative Node.js implementation using canvas (node-canvas)
19
- * This requires the 'canvas' package to be installed
20
- *
21
- * @example
22
- * ```typescript
23
- * import { createCanvas } from 'canvas';
24
- * import { createNodeCanvasImageDataToBlobConverter } from '@embedpdf/engines/pdfium/image-converters';
25
- *
26
- * const imageDataConverter = createNodeCanvasImageDataToBlobConverter(createCanvas);
27
- * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });
28
- * ```
29
- */
30
- export declare function createNodeCanvasImageDataToBlobConverter(createCanvas: any): ImageDataConverter<Buffer>;
31
- /**
32
- * Generic Node.js implementation that works with any image processing library
33
- * that can handle raw RGBA data
34
- *
35
- * @example
36
- * ```typescript
37
- * const converter = createCustomImageDataToBlobConverter(async (imageData) => {
38
- * // Your custom image processing logic here
39
- * // Return a Buffer that will be wrapped in a Blob
40
- * return processImageWithYourLibrary(imageData);
41
- * });
42
- * ```
43
- */
44
- export declare function createCustomImageDataToBlobConverter(processor: (imageData: PdfImage, imageType?: ImageConversionTypes, imageQuality?: number) => Promise<Buffer>): ImageDataConverter;
45
- /**
46
- * Create a custom converter that returns a Buffer
47
- * @param processor - function to process the image data
48
- * @param imageType - image type
49
- * @returns ImageDataToBlobConverter<Buffer>
50
- */
51
- export declare function createCustomImageDataToBufferConverter(processor: (imageData: PdfImage, imageType: ImageConversionTypes, imageQuality?: number) => Promise<Buffer>): ImageDataConverter<Buffer>;
1
+ export * from './types';
2
+ export * from './browser';
3
+ export * from './node';
@@ -1,3 +1,4 @@
1
+ import { O, b, a, c } from "../../browser-Cm3DA8l_.js";
1
2
  function toArrayBuffer(view) {
2
3
  const { buffer, byteOffset, byteLength } = view;
3
4
  if (buffer instanceof ArrayBuffer) {
@@ -78,9 +79,13 @@ function createCustomImageDataToBufferConverter(processor) {
78
79
  };
79
80
  }
80
81
  export {
82
+ O as OffscreenCanvasError,
83
+ b as browserImageDataToBlobConverter,
81
84
  createCustomImageDataToBlobConverter,
82
85
  createCustomImageDataToBufferConverter,
86
+ a as createHybridImageConverter,
83
87
  createNodeCanvasImageDataToBlobConverter,
84
- createNodeImageDataToBufferConverter
88
+ createNodeImageDataToBufferConverter,
89
+ c as createWorkerPoolImageConverter
85
90
  };
86
91
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/lib/utils.ts","../../../src/lib/converters/index.ts"],"sourcesContent":["// Returns a plain ArrayBuffer (no SharedArrayBuffer), sliced to the view’s region.\nexport function toArrayBuffer(view: ArrayBufferView): ArrayBuffer {\n const { buffer, byteOffset, byteLength } = view;\n if (buffer instanceof ArrayBuffer) {\n return buffer.slice(byteOffset, byteOffset + byteLength);\n }\n // SharedArrayBuffer (or unknown) → copy once\n const ab = new ArrayBuffer(byteLength);\n new Uint8Array(ab).set(new Uint8Array(buffer as ArrayBufferLike, byteOffset, byteLength));\n return ab;\n}\n\n// Ensures ImageData gets a Uint8ClampedArray backed by a real ArrayBuffer.\nexport function toClampedRGBA(\n data: ArrayBufferView | Uint8Array | Uint8ClampedArray,\n): Uint8ClampedArray {\n if (data instanceof Uint8ClampedArray && data.buffer instanceof ArrayBuffer) return data;\n return new Uint8ClampedArray(toArrayBuffer(data as ArrayBufferView));\n}\n","import { PdfImage } from '@embedpdf/models';\nimport { toArrayBuffer } from '../utils';\nimport { ImageDataConverter, ImageConversionTypes, LazyImageData } from './types';\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 imageDataConverter = createNodeImageDataToBufferConverter(sharp);\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\n * ```\n */\nexport function createNodeImageDataToBufferConverter(\n sharp: any, // Using 'any' to avoid requiring sharp as a dependency\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\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\n .webp({\n quality: imageQuality,\n })\n .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 quality: imageQuality,\n })\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 imageDataConverter = createNodeCanvasImageDataToBlobConverter(createCanvas);\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\n * ```\n */\nexport function createNodeCanvasImageDataToBlobConverter(\n createCanvas: any, // Using 'any' to avoid requiring canvas as a dependency\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n _imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\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: (\n imageData: PdfImage,\n imageType?: ImageConversionTypes,\n imageQuality?: number,\n ) => Promise<Buffer>,\n): ImageDataConverter {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ) => {\n const imageData = getImageData();\n const bytes = await processor(imageData, imageType, imageQuality);\n return new Blob([toArrayBuffer(bytes)], { 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: (\n imageData: PdfImage,\n imageType: ImageConversionTypes,\n imageQuality?: number,\n ) => Promise<Buffer>,\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\n return await processor(imageData, imageType, imageQuality);\n };\n}\n"],"names":[],"mappings":"AACO,SAAS,cAAc,MAAoC;AAChE,QAAM,EAAE,QAAQ,YAAY,WAAA,IAAe;AAC3C,MAAI,kBAAkB,aAAa;AACjC,WAAO,OAAO,MAAM,YAAY,aAAa,UAAU;AAAA,EACzD;AAEA,QAAM,KAAK,IAAI,YAAY,UAAU;AACrC,MAAI,WAAW,EAAE,EAAE,IAAI,IAAI,WAAW,QAA2B,YAAY,UAAU,CAAC;AACxF,SAAO;AACT;ACOO,SAAS,qCACd,OAC4B;AAC5B,SAAO,OACL,cACA,YAAkC,cAClC,iBACoB;AACpB,UAAM,YAAY,aAAA;AAClB,UAAM,EAAE,OAAO,QAAQ,KAAA,IAAS;AAIhC,QAAI,gBAAgB,MAAM,OAAO,KAAK,IAAI,GAAG;AAAA,MAC3C,KAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA,UAAU;AAAA;AAAA,MAAA;AAAA,IACZ,CACD;AAGD,QAAI;AACJ,YAAQ,WAAA;AAAA,MACN,KAAK;AACH,iBAAS,MAAM,cACZ,KAAK;AAAA,UACJ,SAAS;AAAA,QAAA,CACV,EACA,SAAA;AACH;AAAA,MACF,KAAK;AACH,iBAAS,MAAM,cAAc,IAAA,EAAM,SAAA;AACnC;AAAA,MACF,KAAK;AAEH,iBAAS,MAAM,cACZ,QAAQ,EAAE,YAAY,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAA,EAAI,CAAG,EAClD,KAAK;AAAA,UACJ,SAAS;AAAA,QAAA,CACV,EACA,SAAA;AACH;AAAA,MACF;AACE,cAAM,IAAI,MAAM,2BAA2B,SAAS,EAAE;AAAA,IAAA;AAG1D,WAAO;AAAA,EACT;AACF;AAeO,SAAS,yCACd,cAC4B;AAC5B,SAAO,OACL,cACA,YAAkC,cAClC,kBACoB;AACpB,UAAM,YAAY,aAAA;AAClB,UAAM,EAAE,OAAO,OAAA,IAAW;AAG1B,UAAM,SAAS,aAAa,OAAO,MAAM;AACzC,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,aAAa,WAAW,GAAG,CAAC;AAGhC,QAAI;AACJ,YAAQ,WAAA;AAAA,MACN,KAAK;AACH,iBAAS,OAAO,SAAS,YAAY;AACrC;AAAA,MACF,KAAK;AACH,iBAAS,OAAO,SAAS,WAAW;AACpC;AAAA,MACF,KAAK;AACH,iBAAS,OAAO,SAAS,YAAY;AACrC;AAAA,MACF;AACE,cAAM,IAAI,MAAM,2BAA2B,SAAS,EAAE;AAAA,IAAA;AAG1D,WAAO;AAAA,EACT;AACF;AAeO,SAAS,qCACd,WAKoB;AACpB,SAAO,OACL,cACA,YAAkC,cAClC,iBACG;AACH,UAAM,YAAY,aAAA;AAClB,UAAM,QAAQ,MAAM,UAAU,WAAW,WAAW,YAAY;AAChE,WAAO,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,GAAG,EAAE,MAAM,WAAW;AAAA,EAC7D;AACF;AAQO,SAAS,uCACd,WAK4B;AAC5B,SAAO,OACL,cACA,YAAkC,cAClC,iBACoB;AACpB,UAAM,YAAY,aAAA;AAClB,WAAO,MAAM,UAAU,WAAW,WAAW,YAAY;AAAA,EAC3D;AACF;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/lib/utils.ts","../../../src/lib/converters/node.ts"],"sourcesContent":["// Returns a plain ArrayBuffer (no SharedArrayBuffer), sliced to the view’s region.\nexport function toArrayBuffer(view: ArrayBufferView): ArrayBuffer {\n const { buffer, byteOffset, byteLength } = view;\n if (buffer instanceof ArrayBuffer) {\n return buffer.slice(byteOffset, byteOffset + byteLength);\n }\n // SharedArrayBuffer (or unknown) → copy once\n const ab = new ArrayBuffer(byteLength);\n new Uint8Array(ab).set(new Uint8Array(buffer as ArrayBufferLike, byteOffset, byteLength));\n return ab;\n}\n\n// Ensures ImageData gets a Uint8ClampedArray backed by a real ArrayBuffer.\nexport function toClampedRGBA(\n data: ArrayBufferView | Uint8Array | Uint8ClampedArray,\n): Uint8ClampedArray {\n if (data instanceof Uint8ClampedArray && data.buffer instanceof ArrayBuffer) return data;\n return new Uint8ClampedArray(toArrayBuffer(data as ArrayBufferView));\n}\n","import type { PdfImage, ImageConversionTypes } from '@embedpdf/models';\nimport { toArrayBuffer } from '../utils';\nimport type { ImageDataConverter, LazyImageData } from './types';\n\n// ============================================================================\n// Node.js Converters\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';\n *\n * const imageDataConverter = createNodeImageDataToBufferConverter(sharp);\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\n * ```\n */\nexport function createNodeImageDataToBufferConverter(\n sharp: any, // Using 'any' to avoid requiring sharp as a dependency\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\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\n .webp({\n quality: imageQuality,\n })\n .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 quality: imageQuality,\n })\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';\n *\n * const imageDataConverter = createNodeCanvasImageDataToBlobConverter(createCanvas);\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\n * ```\n */\nexport function createNodeCanvasImageDataToBlobConverter(\n createCanvas: any, // Using 'any' to avoid requiring canvas as a dependency\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n _imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\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: (\n imageData: PdfImage,\n imageType?: ImageConversionTypes,\n imageQuality?: number,\n ) => Promise<Buffer>,\n): ImageDataConverter {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ) => {\n const imageData = getImageData();\n const bytes = await processor(imageData, imageType, imageQuality);\n return new Blob([toArrayBuffer(bytes)], { 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: (\n imageData: PdfImage,\n imageType: ImageConversionTypes,\n imageQuality?: number,\n ) => Promise<Buffer>,\n): ImageDataConverter<Buffer> {\n return async (\n getImageData: LazyImageData,\n imageType: ImageConversionTypes = 'image/webp',\n imageQuality?: number,\n ): Promise<Buffer> => {\n const imageData = getImageData();\n return await processor(imageData, imageType, imageQuality);\n };\n}\n"],"names":[],"mappings":";AACO,SAAS,cAAc,MAAoC;AAChE,QAAM,EAAE,QAAQ,YAAY,WAAA,IAAe;AAC3C,MAAI,kBAAkB,aAAa;AACjC,WAAO,OAAO,MAAM,YAAY,aAAa,UAAU;AAAA,EACzD;AAEA,QAAM,KAAK,IAAI,YAAY,UAAU;AACrC,MAAI,WAAW,EAAE,EAAE,IAAI,IAAI,WAAW,QAA2B,YAAY,UAAU,CAAC;AACxF,SAAO;AACT;ACWO,SAAS,qCACd,OAC4B;AAC5B,SAAO,OACL,cACA,YAAkC,cAClC,iBACoB;AACpB,UAAM,YAAY,aAAA;AAClB,UAAM,EAAE,OAAO,QAAQ,KAAA,IAAS;AAIhC,QAAI,gBAAgB,MAAM,OAAO,KAAK,IAAI,GAAG;AAAA,MAC3C,KAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA,UAAU;AAAA;AAAA,MAAA;AAAA,IACZ,CACD;AAGD,QAAI;AACJ,YAAQ,WAAA;AAAA,MACN,KAAK;AACH,iBAAS,MAAM,cACZ,KAAK;AAAA,UACJ,SAAS;AAAA,QAAA,CACV,EACA,SAAA;AACH;AAAA,MACF,KAAK;AACH,iBAAS,MAAM,cAAc,IAAA,EAAM,SAAA;AACnC;AAAA,MACF,KAAK;AAEH,iBAAS,MAAM,cACZ,QAAQ,EAAE,YAAY,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAA,EAAI,CAAG,EAClD,KAAK;AAAA,UACJ,SAAS;AAAA,QAAA,CACV,EACA,SAAA;AACH;AAAA,MACF;AACE,cAAM,IAAI,MAAM,2BAA2B,SAAS,EAAE;AAAA,IAAA;AAG1D,WAAO;AAAA,EACT;AACF;AAeO,SAAS,yCACd,cAC4B;AAC5B,SAAO,OACL,cACA,YAAkC,cAClC,kBACoB;AACpB,UAAM,YAAY,aAAA;AAClB,UAAM,EAAE,OAAO,OAAA,IAAW;AAG1B,UAAM,SAAS,aAAa,OAAO,MAAM;AACzC,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,aAAa,WAAW,GAAG,CAAC;AAGhC,QAAI;AACJ,YAAQ,WAAA;AAAA,MACN,KAAK;AACH,iBAAS,OAAO,SAAS,YAAY;AACrC;AAAA,MACF,KAAK;AACH,iBAAS,OAAO,SAAS,WAAW;AACpC;AAAA,MACF,KAAK;AACH,iBAAS,OAAO,SAAS,YAAY;AACrC;AAAA,MACF;AACE,cAAM,IAAI,MAAM,2BAA2B,SAAS,EAAE;AAAA,IAAA;AAG1D,WAAO;AAAA,EACT;AACF;AAeO,SAAS,qCACd,WAKoB;AACpB,SAAO,OACL,cACA,YAAkC,cAClC,iBACG;AACH,UAAM,YAAY,aAAA;AAClB,UAAM,QAAQ,MAAM,UAAU,WAAW,WAAW,YAAY;AAChE,WAAO,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,GAAG,EAAE,MAAM,WAAW;AAAA,EAC7D;AACF;AAQO,SAAS,uCACd,WAK4B;AAC5B,SAAO,OACL,cACA,YAAkC,cAClC,iBACoB;AACpB,UAAM,YAAY,aAAA;AAClB,WAAO,MAAM,UAAU,WAAW,WAAW,YAAY;AAAA,EAC3D;AACF;"}