@embedpdf/engines 2.0.0-next.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -9
- package/dist/browser-C6QEa8uk.cjs +2 -0
- package/dist/browser-C6QEa8uk.cjs.map +1 -0
- package/dist/browser-awZxztMA.js +76 -0
- package/dist/browser-awZxztMA.js.map +1 -0
- package/dist/{engine-B-RaFU77.js → direct-engine-DuLFAbiv.js} +211 -520
- package/dist/direct-engine-DuLFAbiv.js.map +1 -0
- package/dist/direct-engine-JeNRkc7w.cjs +2 -0
- package/dist/direct-engine-JeNRkc7w.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +301 -10
- package/dist/index.js.map +1 -1
- package/dist/lib/converters/browser.d.ts +33 -0
- package/dist/lib/converters/index.cjs +1 -1
- package/dist/lib/converters/index.cjs.map +1 -1
- package/dist/lib/converters/index.d.ts +3 -51
- package/dist/lib/converters/index.js +6 -1
- package/dist/lib/converters/index.js.map +1 -1
- package/dist/lib/converters/node.d.ts +51 -0
- package/dist/lib/converters/types.d.ts +6 -3
- package/dist/lib/image-encoder/image-encoder-worker.d.ts +24 -0
- package/dist/lib/image-encoder/index.d.ts +2 -0
- package/dist/lib/image-encoder/worker-pool.d.ts +61 -0
- package/dist/lib/orchestrator/index.d.ts +16 -0
- package/dist/lib/orchestrator/pdf-engine.d.ts +99 -0
- package/dist/lib/orchestrator/pdfium-native-runner.d.ts +65 -0
- package/dist/lib/orchestrator/remote-executor.d.ts +93 -0
- package/dist/lib/orchestrator/task-queue.d.ts +87 -0
- package/dist/lib/pdfium/engine.d.ts +52 -93
- package/dist/lib/pdfium/index.cjs +1 -1
- package/dist/lib/pdfium/index.cjs.map +1 -1
- package/dist/lib/pdfium/index.d.ts +6 -1
- package/dist/lib/pdfium/index.js +15 -8
- package/dist/lib/pdfium/index.js.map +1 -1
- package/dist/lib/pdfium/runner.d.ts +2 -2
- package/dist/lib/pdfium/web/direct-engine.cjs +1 -1
- package/dist/lib/pdfium/web/direct-engine.cjs.map +1 -1
- package/dist/lib/pdfium/web/direct-engine.d.ts +33 -2
- package/dist/lib/pdfium/web/direct-engine.js +5 -9
- package/dist/lib/pdfium/web/direct-engine.js.map +1 -1
- package/dist/lib/pdfium/web/worker-engine.cjs +1 -1
- package/dist/lib/pdfium/web/worker-engine.cjs.map +1 -1
- package/dist/lib/pdfium/web/worker-engine.d.ts +40 -4
- package/dist/lib/pdfium/web/worker-engine.js +412 -9
- package/dist/lib/pdfium/web/worker-engine.js.map +1 -1
- package/dist/lib/webworker/engine.cjs +1 -1
- package/dist/lib/webworker/engine.cjs.map +1 -1
- package/dist/lib/webworker/engine.d.ts +0 -6
- package/dist/lib/webworker/engine.js +0 -13
- package/dist/lib/webworker/engine.js.map +1 -1
- package/dist/lib/webworker/runner.d.ts +0 -12
- package/dist/pdf-engine-BVNF_Yo9.js +790 -0
- package/dist/pdf-engine-BVNF_Yo9.js.map +1 -0
- package/dist/pdf-engine-C3JeKij1.cjs +2 -0
- package/dist/pdf-engine-C3JeKij1.cjs.map +1 -0
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +5 -13
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +5 -13
- package/dist/react/index.js.map +1 -1
- package/dist/shared-preact/hooks/use-pdfium-engine.d.ts +1 -0
- package/dist/shared-react/hooks/use-pdfium-engine.d.ts +1 -0
- package/dist/svelte/index.cjs +1 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/index.js +3 -11
- package/dist/svelte/index.js.map +1 -1
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.js +3 -12
- package/dist/vue/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/engine-B-RaFU77.js.map +0 -1
- package/dist/engine-CXnLqg_9.cjs +0 -2
- package/dist/engine-CXnLqg_9.cjs.map +0 -1
- package/dist/index-Cp8_nZYM.js +0 -342
- package/dist/index-Cp8_nZYM.js.map +0 -1
- package/dist/index-DuHK0qLu.cjs +0 -2
- package/dist/index-DuHK0qLu.cjs.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
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"),a=require("./direct-engine-JeNRkc7w.cjs"),s=require("./lib/pdfium/web/worker-engine.cjs"),o=require("./browser-C6QEa8uk.cjs"),n=require("./pdf-engine-C3JeKij1.cjs"),c="WebWorkerEngineRunner",i="Engine";exports.DEFAULT_PDFIUM_WASM_URL=e.DEFAULT_PDFIUM_WASM_URL,exports.WebWorkerEngine=r.WebWorkerEngine,exports.WorkerTask=r.WorkerTask,exports.BitmapFormat=a.BitmapFormat,exports.PdfiumErrorCode=a.PdfiumErrorCode,exports.PdfiumNative=a.PdfiumNative,exports.RenderFlag=a.RenderFlag,exports.computeFormDrawParams=a.computeFormDrawParams,exports.createPdfiumDirectEngine=a.createPdfiumEngine,exports.isValidCustomKey=a.isValidCustomKey,exports.readArrayBuffer=a.readArrayBuffer,exports.readString=a.readString,exports.createPdfiumWorkerEngine=s.createPdfiumEngine,exports.ImageConverterError=o.ImageConverterError,exports.browserImageDataToBlobConverter=o.browserImageDataToBlobConverter,exports.createHybridImageConverter=o.createHybridImageConverter,exports.createWorkerPoolImageConverter=o.createWorkerPoolImageConverter,exports.PdfEngine=n.PdfEngine,exports.EngineRunner=class{constructor(e=new t.NoopLogger){this.logger=e,this.execute=async e=>{if(this.logger.debug(c,i,"runner start exeucte request"),!this.engine){const r={type:"reject",reason:{code:t.PdfErrorCode.NotReady,message:"engine has not started yet"}},a={id:e.id,type:"ExecuteResponse",data:{type:"error",value:r}};return void this.respond(a)}const r=this.engine,{name:a,args:s}=e.data;if(!r[a]){const r={type:"reject",reason:{code:t.PdfErrorCode.NotSupport,message:`engine method ${a} is not supported yet`}},s={id:e.id,type:"ExecuteResponse",data:{type:"error",value:r}};return void this.respond(s)}let o;switch(a){case"isSupport":o=r.isSupport(...s);break;case"destroy":o=r.destroy(...s);break;case"openDocumentUrl":o=r.openDocumentUrl(...s);break;case"openDocumentBuffer":o=r.openDocumentBuffer(...s);break;case"getDocPermissions":o=r.getDocPermissions(...s);break;case"getDocUserPermissions":o=r.getDocUserPermissions(...s);break;case"getMetadata":o=r.getMetadata(...s);break;case"setMetadata":o=r.setMetadata(...s);break;case"getBookmarks":o=r.getBookmarks(...s);break;case"setBookmarks":o=r.setBookmarks(...s);break;case"deleteBookmarks":o=r.deleteBookmarks(...s);break;case"getSignatures":o=r.getSignatures(...s);break;case"renderPage":o=r.renderPage(...s);break;case"renderPageRect":o=r.renderPageRect(...s);break;case"renderPageAnnotation":o=r.renderPageAnnotation(...s);break;case"renderThumbnail":o=r.renderThumbnail(...s);break;case"getAllAnnotations":o=r.getAllAnnotations(...s);break;case"getPageAnnotations":o=r.getPageAnnotations(...s);break;case"createPageAnnotation":o=r.createPageAnnotation(...s);break;case"updatePageAnnotation":o=r.updatePageAnnotation(...s);break;case"removePageAnnotation":o=r.removePageAnnotation(...s);break;case"getPageTextRects":o=r.getPageTextRects(...s);break;case"searchAllPages":o=r.searchAllPages(...s);break;case"closeDocument":o=r.closeDocument(...s);break;case"closeAllDocuments":o=r.closeAllDocuments(...s);break;case"saveAsCopy":o=r.saveAsCopy(...s);break;case"getAttachments":o=r.getAttachments(...s);break;case"addAttachment":o=r.addAttachment(...s);break;case"removeAttachment":o=r.removeAttachment(...s);break;case"readAttachmentContent":o=r.readAttachmentContent(...s);break;case"setFormFieldValue":o=r.setFormFieldValue(...s);break;case"flattenPage":o=r.flattenPage(...s);break;case"extractPages":o=r.extractPages(...s);break;case"extractText":o=r.extractText(...s);break;case"redactTextInRects":o=r.redactTextInRects(...s);break;case"getTextSlices":o=r.getTextSlices(...s);break;case"getPageGlyphs":o=r.getPageGlyphs(...s);break;case"getPageGeometry":o=r.getPageGeometry(...s);break;case"merge":o=r.merge(...s);break;case"mergePages":o=r.mergePages(...s);break;case"preparePrintDocument":o=r.preparePrintDocument(...s);break;default:const n={type:"reject",reason:{code:t.PdfErrorCode.NotSupport,message:`engine method ${a} is not supported`}},c={id:e.id,type:"ExecuteResponse",data:{type:"error",value:n}};return void this.respond(c)}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(c,i,"webworker receive message event: ",e.data);try{const r=e.data;if("ExecuteRequest"===r.type)this.execute(r)}catch(r){this.logger.info(c,i,"webworker met error when processing message event:",r)}}ready(){this.listen(),this.respond({id:"0",type:"ReadyResponse"}),this.logger.debug(c,i,"runner is ready")}respond(e){this.logger.debug(c,i,"runner respond: ",e),self.postMessage(e)}};
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 = engine.isSupport!(...args);\n break;\n case 'destroy':\n task = engine.destroy!(...args);\n break;\n case 'openDocumentUrl':\n task = engine.openDocumentUrl!(...args);\n break;\n case 'openDocumentBuffer':\n task = engine.openDocumentBuffer!(...args);\n break;\n case 'getDocPermissions':\n task = engine.getDocPermissions!(...args);\n break;\n case 'getDocUserPermissions':\n task = engine.getDocUserPermissions!(...args);\n break;\n case 'getMetadata':\n task = engine.getMetadata!(...args);\n break;\n case 'setMetadata':\n task = engine.setMetadata!(...args);\n break;\n case 'getBookmarks':\n task = engine.getBookmarks!(...args);\n break;\n case 'setBookmarks':\n task = engine.setBookmarks!(...args);\n break;\n case 'deleteBookmarks':\n task = engine.deleteBookmarks!(...args);\n break;\n case 'getSignatures':\n task = engine.getSignatures!(...args);\n break;\n case 'renderPage':\n task = engine.renderPage!(...args);\n break;\n case 'renderPageRect':\n task = engine.renderPageRect!(...args);\n break;\n case 'renderPageAnnotation':\n task = engine.renderPageAnnotation!(...args);\n break;\n case 'renderThumbnail':\n task = engine.renderThumbnail!(...args);\n break;\n case 'getAllAnnotations':\n task = engine.getAllAnnotations!(...args);\n break;\n case 'getPageAnnotations':\n task = engine.getPageAnnotations!(...args);\n break;\n case 'createPageAnnotation':\n task = engine.createPageAnnotation!(...args);\n break;\n case 'updatePageAnnotation':\n task = engine.updatePageAnnotation!(...args);\n break;\n case 'removePageAnnotation':\n task = engine.removePageAnnotation!(...args);\n break;\n case 'getPageTextRects':\n task = engine.getPageTextRects!(...args);\n break;\n case 'searchAllPages':\n task = engine.searchAllPages!(...args);\n break;\n case 'closeDocument':\n task = engine.closeDocument!(...args);\n break;\n case 'closeAllDocuments':\n task = engine.closeAllDocuments!(...args);\n break;\n case 'saveAsCopy':\n task = engine.saveAsCopy!(...args);\n break;\n case 'getAttachments':\n task = engine.getAttachments!(...args);\n break;\n case 'addAttachment':\n task = engine.addAttachment!(...args);\n break;\n case 'removeAttachment':\n task = engine.removeAttachment!(...args);\n break;\n case 'readAttachmentContent':\n task = engine.readAttachmentContent!(...args);\n break;\n case 'setFormFieldValue':\n task = engine.setFormFieldValue!(...args);\n break;\n case 'flattenPage':\n task = engine.flattenPage!(...args);\n break;\n case 'extractPages':\n task = engine.extractPages!(...args);\n break;\n case 'extractText':\n task = engine.extractText!(...args);\n break;\n case 'redactTextInRects':\n task = engine.redactTextInRects!(...args);\n break;\n case 'getTextSlices':\n task = engine.getTextSlices!(...args);\n break;\n case 'getPageGlyphs':\n task = engine.getPageGlyphs!(...args);\n break;\n case 'getPageGeometry':\n task = engine.getPageGeometry!(...args);\n break;\n case 'merge':\n task = engine.merge!(...args);\n break;\n case 'mergePages':\n task = engine.mergePages!(...args);\n break;\n case 'preparePrintDocument':\n task = engine.preparePrintDocument!(...args);\n break;\n default:\n // This should never be reached due to the earlier check, but provides exhaustiveness\n const error: PdfEngineError = {\n type: 'reject',\n reason: {\n code: PdfErrorCode.NotSupport,\n message: `engine method ${name} is not supported`,\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 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","isSupport","destroy","openDocumentUrl","openDocumentBuffer","getDocPermissions","getDocUserPermissions","getMetadata","setMetadata","getBookmarks","setBookmarks","deleteBookmarks","getSignatures","renderPage","renderPageRect","renderPageAnnotation","renderThumbnail","getAllAnnotations","getPageAnnotations","createPageAnnotation","updatePageAnnotation","removePageAnnotation","getPageTextRects","searchAllPages","closeDocument","closeAllDocuments","saveAsCopy","getAttachments","addAttachment","removeAttachment","readAttachmentContent","setFormFieldValue","flattenPage","extractPages","extractText","redactTextInRects","getTextSlices","getPageGlyphs","getPageGeometry","merge","mergePages","preparePrintDocument","onProgress","progress","wait","result","listen","self","onmessage","evt","handle","e","info","ready","postMessage"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,21 +1,312 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DEFAULT_PDFIUM_WASM_URL } from "./lib/pdfium/index.js";
|
|
2
2
|
import { WebWorkerEngine, WorkerTask } from "./lib/webworker/engine.js";
|
|
3
|
-
import {
|
|
3
|
+
import { NoopLogger, PdfErrorCode } from "@embedpdf/models";
|
|
4
|
+
import { B, P, a, R, d, c, i, b, r } from "./direct-engine-DuLFAbiv.js";
|
|
5
|
+
import { createPdfiumEngine } from "./lib/pdfium/web/worker-engine.js";
|
|
6
|
+
import { I, b as b2, a as a2, c as c2 } from "./browser-awZxztMA.js";
|
|
7
|
+
import { P as P2 } from "./pdf-engine-BVNF_Yo9.js";
|
|
8
|
+
const LOG_SOURCE = "WebWorkerEngineRunner";
|
|
9
|
+
const LOG_CATEGORY = "Engine";
|
|
10
|
+
class EngineRunner {
|
|
11
|
+
/**
|
|
12
|
+
* Create instance of EngineRunnder
|
|
13
|
+
* @param logger - logger instance
|
|
14
|
+
*/
|
|
15
|
+
constructor(logger = new NoopLogger()) {
|
|
16
|
+
this.logger = logger;
|
|
17
|
+
this.execute = async (request) => {
|
|
18
|
+
this.logger.debug(LOG_SOURCE, LOG_CATEGORY, "runner start exeucte request");
|
|
19
|
+
if (!this.engine) {
|
|
20
|
+
const error = {
|
|
21
|
+
type: "reject",
|
|
22
|
+
reason: {
|
|
23
|
+
code: PdfErrorCode.NotReady,
|
|
24
|
+
message: "engine has not started yet"
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const response = {
|
|
28
|
+
id: request.id,
|
|
29
|
+
type: "ExecuteResponse",
|
|
30
|
+
data: {
|
|
31
|
+
type: "error",
|
|
32
|
+
value: error
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
this.respond(response);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const engine = this.engine;
|
|
39
|
+
const { name, args } = request.data;
|
|
40
|
+
if (!engine[name]) {
|
|
41
|
+
const error = {
|
|
42
|
+
type: "reject",
|
|
43
|
+
reason: {
|
|
44
|
+
code: PdfErrorCode.NotSupport,
|
|
45
|
+
message: `engine method ${name} is not supported yet`
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const response = {
|
|
49
|
+
id: request.id,
|
|
50
|
+
type: "ExecuteResponse",
|
|
51
|
+
data: {
|
|
52
|
+
type: "error",
|
|
53
|
+
value: error
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
this.respond(response);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
let task;
|
|
60
|
+
switch (name) {
|
|
61
|
+
case "isSupport":
|
|
62
|
+
task = engine.isSupport(...args);
|
|
63
|
+
break;
|
|
64
|
+
case "destroy":
|
|
65
|
+
task = engine.destroy(...args);
|
|
66
|
+
break;
|
|
67
|
+
case "openDocumentUrl":
|
|
68
|
+
task = engine.openDocumentUrl(...args);
|
|
69
|
+
break;
|
|
70
|
+
case "openDocumentBuffer":
|
|
71
|
+
task = engine.openDocumentBuffer(...args);
|
|
72
|
+
break;
|
|
73
|
+
case "getDocPermissions":
|
|
74
|
+
task = engine.getDocPermissions(...args);
|
|
75
|
+
break;
|
|
76
|
+
case "getDocUserPermissions":
|
|
77
|
+
task = engine.getDocUserPermissions(...args);
|
|
78
|
+
break;
|
|
79
|
+
case "getMetadata":
|
|
80
|
+
task = engine.getMetadata(...args);
|
|
81
|
+
break;
|
|
82
|
+
case "setMetadata":
|
|
83
|
+
task = engine.setMetadata(...args);
|
|
84
|
+
break;
|
|
85
|
+
case "getBookmarks":
|
|
86
|
+
task = engine.getBookmarks(...args);
|
|
87
|
+
break;
|
|
88
|
+
case "setBookmarks":
|
|
89
|
+
task = engine.setBookmarks(...args);
|
|
90
|
+
break;
|
|
91
|
+
case "deleteBookmarks":
|
|
92
|
+
task = engine.deleteBookmarks(...args);
|
|
93
|
+
break;
|
|
94
|
+
case "getSignatures":
|
|
95
|
+
task = engine.getSignatures(...args);
|
|
96
|
+
break;
|
|
97
|
+
case "renderPage":
|
|
98
|
+
task = engine.renderPage(...args);
|
|
99
|
+
break;
|
|
100
|
+
case "renderPageRect":
|
|
101
|
+
task = engine.renderPageRect(...args);
|
|
102
|
+
break;
|
|
103
|
+
case "renderPageAnnotation":
|
|
104
|
+
task = engine.renderPageAnnotation(...args);
|
|
105
|
+
break;
|
|
106
|
+
case "renderThumbnail":
|
|
107
|
+
task = engine.renderThumbnail(...args);
|
|
108
|
+
break;
|
|
109
|
+
case "getAllAnnotations":
|
|
110
|
+
task = engine.getAllAnnotations(...args);
|
|
111
|
+
break;
|
|
112
|
+
case "getPageAnnotations":
|
|
113
|
+
task = engine.getPageAnnotations(...args);
|
|
114
|
+
break;
|
|
115
|
+
case "createPageAnnotation":
|
|
116
|
+
task = engine.createPageAnnotation(...args);
|
|
117
|
+
break;
|
|
118
|
+
case "updatePageAnnotation":
|
|
119
|
+
task = engine.updatePageAnnotation(...args);
|
|
120
|
+
break;
|
|
121
|
+
case "removePageAnnotation":
|
|
122
|
+
task = engine.removePageAnnotation(...args);
|
|
123
|
+
break;
|
|
124
|
+
case "getPageTextRects":
|
|
125
|
+
task = engine.getPageTextRects(...args);
|
|
126
|
+
break;
|
|
127
|
+
case "searchAllPages":
|
|
128
|
+
task = engine.searchAllPages(...args);
|
|
129
|
+
break;
|
|
130
|
+
case "closeDocument":
|
|
131
|
+
task = engine.closeDocument(...args);
|
|
132
|
+
break;
|
|
133
|
+
case "closeAllDocuments":
|
|
134
|
+
task = engine.closeAllDocuments(...args);
|
|
135
|
+
break;
|
|
136
|
+
case "saveAsCopy":
|
|
137
|
+
task = engine.saveAsCopy(...args);
|
|
138
|
+
break;
|
|
139
|
+
case "getAttachments":
|
|
140
|
+
task = engine.getAttachments(...args);
|
|
141
|
+
break;
|
|
142
|
+
case "addAttachment":
|
|
143
|
+
task = engine.addAttachment(...args);
|
|
144
|
+
break;
|
|
145
|
+
case "removeAttachment":
|
|
146
|
+
task = engine.removeAttachment(...args);
|
|
147
|
+
break;
|
|
148
|
+
case "readAttachmentContent":
|
|
149
|
+
task = engine.readAttachmentContent(...args);
|
|
150
|
+
break;
|
|
151
|
+
case "setFormFieldValue":
|
|
152
|
+
task = engine.setFormFieldValue(...args);
|
|
153
|
+
break;
|
|
154
|
+
case "flattenPage":
|
|
155
|
+
task = engine.flattenPage(...args);
|
|
156
|
+
break;
|
|
157
|
+
case "extractPages":
|
|
158
|
+
task = engine.extractPages(...args);
|
|
159
|
+
break;
|
|
160
|
+
case "extractText":
|
|
161
|
+
task = engine.extractText(...args);
|
|
162
|
+
break;
|
|
163
|
+
case "redactTextInRects":
|
|
164
|
+
task = engine.redactTextInRects(...args);
|
|
165
|
+
break;
|
|
166
|
+
case "getTextSlices":
|
|
167
|
+
task = engine.getTextSlices(...args);
|
|
168
|
+
break;
|
|
169
|
+
case "getPageGlyphs":
|
|
170
|
+
task = engine.getPageGlyphs(...args);
|
|
171
|
+
break;
|
|
172
|
+
case "getPageGeometry":
|
|
173
|
+
task = engine.getPageGeometry(...args);
|
|
174
|
+
break;
|
|
175
|
+
case "merge":
|
|
176
|
+
task = engine.merge(...args);
|
|
177
|
+
break;
|
|
178
|
+
case "mergePages":
|
|
179
|
+
task = engine.mergePages(...args);
|
|
180
|
+
break;
|
|
181
|
+
case "preparePrintDocument":
|
|
182
|
+
task = engine.preparePrintDocument(...args);
|
|
183
|
+
break;
|
|
184
|
+
default:
|
|
185
|
+
const error = {
|
|
186
|
+
type: "reject",
|
|
187
|
+
reason: {
|
|
188
|
+
code: PdfErrorCode.NotSupport,
|
|
189
|
+
message: `engine method ${name} is not supported`
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
const response = {
|
|
193
|
+
id: request.id,
|
|
194
|
+
type: "ExecuteResponse",
|
|
195
|
+
data: {
|
|
196
|
+
type: "error",
|
|
197
|
+
value: error
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
this.respond(response);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
task.onProgress((progress) => {
|
|
204
|
+
const response = {
|
|
205
|
+
id: request.id,
|
|
206
|
+
type: "ExecuteProgress",
|
|
207
|
+
data: progress
|
|
208
|
+
};
|
|
209
|
+
this.respond(response);
|
|
210
|
+
});
|
|
211
|
+
task.wait(
|
|
212
|
+
(result) => {
|
|
213
|
+
const response = {
|
|
214
|
+
id: request.id,
|
|
215
|
+
type: "ExecuteResponse",
|
|
216
|
+
data: {
|
|
217
|
+
type: "result",
|
|
218
|
+
value: result
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
this.respond(response);
|
|
222
|
+
},
|
|
223
|
+
(error) => {
|
|
224
|
+
const response = {
|
|
225
|
+
id: request.id,
|
|
226
|
+
type: "ExecuteResponse",
|
|
227
|
+
data: {
|
|
228
|
+
type: "error",
|
|
229
|
+
value: error
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
this.respond(response);
|
|
233
|
+
}
|
|
234
|
+
);
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Listening on post message
|
|
239
|
+
*/
|
|
240
|
+
listen() {
|
|
241
|
+
self.onmessage = (evt) => {
|
|
242
|
+
return this.handle(evt);
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Handle post message
|
|
247
|
+
*/
|
|
248
|
+
handle(evt) {
|
|
249
|
+
this.logger.debug(LOG_SOURCE, LOG_CATEGORY, "webworker receive message event: ", evt.data);
|
|
250
|
+
try {
|
|
251
|
+
const request = evt.data;
|
|
252
|
+
switch (request.type) {
|
|
253
|
+
case "ExecuteRequest":
|
|
254
|
+
this.execute(request);
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
} catch (e) {
|
|
258
|
+
this.logger.info(
|
|
259
|
+
LOG_SOURCE,
|
|
260
|
+
LOG_CATEGORY,
|
|
261
|
+
"webworker met error when processing message event:",
|
|
262
|
+
e
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Send the ready response when pdf engine is ready
|
|
268
|
+
* @returns
|
|
269
|
+
*
|
|
270
|
+
* @protected
|
|
271
|
+
*/
|
|
272
|
+
ready() {
|
|
273
|
+
this.listen();
|
|
274
|
+
this.respond({
|
|
275
|
+
id: "0",
|
|
276
|
+
type: "ReadyResponse"
|
|
277
|
+
});
|
|
278
|
+
this.logger.debug(LOG_SOURCE, LOG_CATEGORY, "runner is ready");
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Send back the response
|
|
282
|
+
* @param response - response that needs sent back
|
|
283
|
+
*
|
|
284
|
+
* @protected
|
|
285
|
+
*/
|
|
286
|
+
respond(response) {
|
|
287
|
+
this.logger.debug(LOG_SOURCE, LOG_CATEGORY, "runner respond: ", response);
|
|
288
|
+
self.postMessage(response);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
4
291
|
export {
|
|
5
292
|
B as BitmapFormat,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
P as
|
|
11
|
-
|
|
293
|
+
DEFAULT_PDFIUM_WASM_URL,
|
|
294
|
+
EngineRunner,
|
|
295
|
+
I as ImageConverterError,
|
|
296
|
+
P2 as PdfEngine,
|
|
297
|
+
P as PdfiumErrorCode,
|
|
298
|
+
a as PdfiumNative,
|
|
12
299
|
R as RenderFlag,
|
|
13
300
|
WebWorkerEngine,
|
|
14
301
|
WorkerTask,
|
|
15
|
-
|
|
302
|
+
b2 as browserImageDataToBlobConverter,
|
|
16
303
|
d as computeFormDrawParams,
|
|
304
|
+
a2 as createHybridImageConverter,
|
|
305
|
+
c as createPdfiumDirectEngine,
|
|
306
|
+
createPdfiumEngine as createPdfiumWorkerEngine,
|
|
307
|
+
c2 as createWorkerPoolImageConverter,
|
|
17
308
|
i as isValidCustomKey,
|
|
18
|
-
|
|
309
|
+
b as readArrayBuffer,
|
|
19
310
|
r as readString
|
|
20
311
|
};
|
|
21
312
|
//# 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 = engine.isSupport!(...args);\n break;\n case 'destroy':\n task = engine.destroy!(...args);\n break;\n case 'openDocumentUrl':\n task = engine.openDocumentUrl!(...args);\n break;\n case 'openDocumentBuffer':\n task = engine.openDocumentBuffer!(...args);\n break;\n case 'getDocPermissions':\n task = engine.getDocPermissions!(...args);\n break;\n case 'getDocUserPermissions':\n task = engine.getDocUserPermissions!(...args);\n break;\n case 'getMetadata':\n task = engine.getMetadata!(...args);\n break;\n case 'setMetadata':\n task = engine.setMetadata!(...args);\n break;\n case 'getBookmarks':\n task = engine.getBookmarks!(...args);\n break;\n case 'setBookmarks':\n task = engine.setBookmarks!(...args);\n break;\n case 'deleteBookmarks':\n task = engine.deleteBookmarks!(...args);\n break;\n case 'getSignatures':\n task = engine.getSignatures!(...args);\n break;\n case 'renderPage':\n task = engine.renderPage!(...args);\n break;\n case 'renderPageRect':\n task = engine.renderPageRect!(...args);\n break;\n case 'renderPageAnnotation':\n task = engine.renderPageAnnotation!(...args);\n break;\n case 'renderThumbnail':\n task = engine.renderThumbnail!(...args);\n break;\n case 'getAllAnnotations':\n task = engine.getAllAnnotations!(...args);\n break;\n case 'getPageAnnotations':\n task = engine.getPageAnnotations!(...args);\n break;\n case 'createPageAnnotation':\n task = engine.createPageAnnotation!(...args);\n break;\n case 'updatePageAnnotation':\n task = engine.updatePageAnnotation!(...args);\n break;\n case 'removePageAnnotation':\n task = engine.removePageAnnotation!(...args);\n break;\n case 'getPageTextRects':\n task = engine.getPageTextRects!(...args);\n break;\n case 'searchAllPages':\n task = engine.searchAllPages!(...args);\n break;\n case 'closeDocument':\n task = engine.closeDocument!(...args);\n break;\n case 'closeAllDocuments':\n task = engine.closeAllDocuments!(...args);\n break;\n case 'saveAsCopy':\n task = engine.saveAsCopy!(...args);\n break;\n case 'getAttachments':\n task = engine.getAttachments!(...args);\n break;\n case 'addAttachment':\n task = engine.addAttachment!(...args);\n break;\n case 'removeAttachment':\n task = engine.removeAttachment!(...args);\n break;\n case 'readAttachmentContent':\n task = engine.readAttachmentContent!(...args);\n break;\n case 'setFormFieldValue':\n task = engine.setFormFieldValue!(...args);\n break;\n case 'flattenPage':\n task = engine.flattenPage!(...args);\n break;\n case 'extractPages':\n task = engine.extractPages!(...args);\n break;\n case 'extractText':\n task = engine.extractText!(...args);\n break;\n case 'redactTextInRects':\n task = engine.redactTextInRects!(...args);\n break;\n case 'getTextSlices':\n task = engine.getTextSlices!(...args);\n break;\n case 'getPageGlyphs':\n task = engine.getPageGlyphs!(...args);\n break;\n case 'getPageGeometry':\n task = engine.getPageGeometry!(...args);\n break;\n case 'merge':\n task = engine.merge!(...args);\n break;\n case 'mergePages':\n task = engine.mergePages!(...args);\n break;\n case 'preparePrintDocument':\n task = engine.preparePrintDocument!(...args);\n break;\n default:\n // This should never be reached due to the earlier check, but provides exhaustiveness\n const error: PdfEngineError = {\n type: 'reject',\n reason: {\n code: PdfErrorCode.NotSupport,\n message: `engine method ${name} is not supported`,\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 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,33 @@
|
|
|
1
|
+
import { ImageDataConverter } from './types';
|
|
2
|
+
import { ImageEncoderWorkerPool } from '../image-encoder';
|
|
3
|
+
export declare class ImageConverterError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Main-thread Canvas-based image converter
|
|
8
|
+
* Simple and works everywhere, but blocks the main thread during encoding
|
|
9
|
+
*
|
|
10
|
+
* Use this as a fallback when worker-based encoding isn't available
|
|
11
|
+
*/
|
|
12
|
+
export declare const browserImageDataToBlobConverter: ImageDataConverter<Blob>;
|
|
13
|
+
/**
|
|
14
|
+
* Worker pool image converter using OffscreenCanvas in dedicated workers
|
|
15
|
+
* Non-blocking - encoding happens off the main thread
|
|
16
|
+
*
|
|
17
|
+
* This is the preferred approach for performance
|
|
18
|
+
*
|
|
19
|
+
* @param workerPool - Instance of ImageEncoderWorkerPool
|
|
20
|
+
* @returns ImageDataConverter function
|
|
21
|
+
*/
|
|
22
|
+
export declare function createWorkerPoolImageConverter(workerPool: ImageEncoderWorkerPool): ImageDataConverter<Blob>;
|
|
23
|
+
/**
|
|
24
|
+
* Hybrid converter: Worker pool (OffscreenCanvas) → Main thread Canvas fallback
|
|
25
|
+
*
|
|
26
|
+
* Best of both worlds:
|
|
27
|
+
* - Primary: Non-blocking worker-based encoding with OffscreenCanvas
|
|
28
|
+
* - Fallback: Main-thread Canvas for older browsers without OffscreenCanvas in workers
|
|
29
|
+
*
|
|
30
|
+
* @param workerPool - Instance of ImageEncoderWorkerPool
|
|
31
|
+
* @returns ImageDataConverter function
|
|
32
|
+
*/
|
|
33
|
+
export declare function createHybridImageConverter(workerPool: ImageEncoderWorkerPool): ImageDataConverter<Blob>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../browser-C6QEa8uk.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.ImageConverterError=e.ImageConverterError,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(),i=await e(n,a,o);return new Blob([r(i)],{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:i}=o,g=e(n,i);let s;switch(g.getContext("2d").putImageData(o,0,0),t){case"image/webp":s=g.toBuffer("image/webp");break;case"image/png":s=g.toBuffer("image/png");break;case"image/jpeg":s=g.toBuffer("image/jpeg");break;default:throw new Error(`Unsupported image type: ${t}`)}return s}},exports.createNodeImageDataToBufferConverter=function(e){return async(r,t="image/webp",a)=>{const o=r(),{width:n,height:i,data:g}=o;let s,u=e(Buffer.from(g),{raw:{width:n,height:i,channels:4}});switch(t){case"image/webp":s=await u.webp({quality:a}).toBuffer();break;case"image/png":s=await u.png().toBuffer();break;case"image/jpeg":s=await u.flatten({background:{r:255,g:255,b:255}}).jpeg({quality:a}).toBuffer();break;default:throw new Error(`Unsupported image type: ${t}`)}return s}};
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/lib/utils.ts","../../../src/lib/converters/
|
|
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,kTC4HO,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
|
-
|
|
2
|
-
|
|
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 { I, b, a, c } from "../../browser-awZxztMA.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
|
+
I as ImageConverterError,
|
|
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/
|
|
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;"}
|