@meerrec/cli 0.0.0-stage → 2.0.2
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/LICENSE +201 -0
- package/README.md +142 -2
- package/dist/args.d.ts +48 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +256 -0
- package/dist/args.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/convert.d.ts +27 -0
- package/dist/convert.d.ts.map +1 -0
- package/dist/convert.js +69 -0
- package/dist/convert.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +15 -0
- package/dist/errors.js.map +1 -0
- package/dist/expand.d.ts +25 -0
- package/dist/expand.d.ts.map +1 -0
- package/dist/expand.js +148 -0
- package/dist/expand.js.map +1 -0
- package/dist/formats.d.ts +26 -0
- package/dist/formats.d.ts.map +1 -0
- package/dist/formats.js +71 -0
- package/dist/formats.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/pool.d.ts +36 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +149 -0
- package/dist/pool.js.map +1 -0
- package/dist/progress.d.ts +30 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +67 -0
- package/dist/progress.js.map +1 -0
- package/dist/run.d.ts +10 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +138 -0
- package/dist/run.js.map +1 -0
- package/dist/runtime-deno.d.ts +17 -0
- package/dist/runtime-deno.d.ts.map +1 -0
- package/dist/runtime-deno.js +116 -0
- package/dist/runtime-deno.js.map +1 -0
- package/dist/runtime-node.d.ts +13 -0
- package/dist/runtime-node.d.ts.map +1 -0
- package/dist/runtime-node.js +30 -0
- package/dist/runtime-node.js.map +1 -0
- package/dist/runtime.d.ts +45 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +41 -0
- package/dist/runtime.js.map +1 -0
- package/dist/wasm.d.ts +23 -0
- package/dist/wasm.d.ts.map +1 -0
- package/dist/wasm.js +50 -0
- package/dist/wasm.js.map +1 -0
- package/dist/worker-deno.d.ts +10 -0
- package/dist/worker-deno.d.ts.map +1 -0
- package/dist/worker-deno.js +28 -0
- package/dist/worker-deno.js.map +1 -0
- package/dist/worker-protocol.d.ts +20 -0
- package/dist/worker-protocol.d.ts.map +1 -0
- package/dist/worker-protocol.js +7 -0
- package/dist/worker-protocol.js.map +1 -0
- package/dist/worker.d.ts +10 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +28 -0
- package/dist/worker.js.map +1 -0
- package/package.json +50 -3
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Граница рантайма CLI: Node/Bun и Deno.
|
|
3
|
+
*
|
|
4
|
+
* Общий код (`convert`, `run`, `wasm`) работает только с интерфейсами этого
|
|
5
|
+
* модуля. Всё, что зависит от рантайма — пул воркеров, чтение wasm-байтов и
|
|
6
|
+
* число ядер — живёт в `runtime-node.ts` / `runtime-deno.ts`. Выбор
|
|
7
|
+
* реализации динамический: `node:worker_threads` не должен попадать в граф
|
|
8
|
+
* модулей Deno, где его нет.
|
|
9
|
+
*
|
|
10
|
+
* Bun идёт по Node-ветке: он реализует нужные `node:*`-модули, отдельный
|
|
11
|
+
* адаптер заводится только при фактической несовместимости.
|
|
12
|
+
*/
|
|
13
|
+
import type { ConvertJob, ConvertResult } from './convert.js';
|
|
14
|
+
/** Рантайм, под которым запущен CLI. */
|
|
15
|
+
export type RuntimeKind = 'node' | 'bun' | 'deno';
|
|
16
|
+
/** Пул воркеров глазами `run`: очередь задач и остановка. */
|
|
17
|
+
export interface PoolBackend {
|
|
18
|
+
submit(job: ConvertJob): Promise<ConvertResult>;
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
/** Всё, что CLI спрашивает у рантайма. */
|
|
22
|
+
export interface CliRuntime {
|
|
23
|
+
/** Создать пул; `workerUrl` — URL входа воркера строкой (Node/Bun). */
|
|
24
|
+
createPool(workerUrl: string, size: number): PoolBackend;
|
|
25
|
+
/** Байты `.wasm`, лежащего рядом с клеем `jsSpecifier`. */
|
|
26
|
+
loadWasmBytes(jsSpecifier: string): Promise<Uint8Array>;
|
|
27
|
+
/** Доступные ядра: умолчание `--workers`. */
|
|
28
|
+
availableParallelism(): number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Определить рантайм по глобалям.
|
|
32
|
+
*
|
|
33
|
+
* `Deno` проверяется первым: в Deno с включённой Node-совместимостью может
|
|
34
|
+
* быть и `process.versions`. `process` читается через каст, чтобы модуль не
|
|
35
|
+
* зависел от типов конкретного рантайма.
|
|
36
|
+
*/
|
|
37
|
+
export declare function detectRuntime(): RuntimeKind;
|
|
38
|
+
/**
|
|
39
|
+
* Взять реализацию рантайма, загрузив её один раз на процесс.
|
|
40
|
+
*
|
|
41
|
+
* Импорт динамический: статический `runtime-node.ts` притянул бы
|
|
42
|
+
* `node:worker_threads` в Deno, где модуль не загрузится.
|
|
43
|
+
*/
|
|
44
|
+
export declare function loadRuntime(): Promise<CliRuntime>;
|
|
45
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE9D,wCAAwC;AACxC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAElD,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAChD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,0CAA0C;AAC1C,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAEzD,2DAA2D;IAC3D,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAExD,6CAA6C;IAC7C,oBAAoB,IAAI,MAAM,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,WAAW,CAK3C;AAID;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC,CAMjD"}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Граница рантайма CLI: Node/Bun и Deno.
|
|
3
|
+
*
|
|
4
|
+
* Общий код (`convert`, `run`, `wasm`) работает только с интерфейсами этого
|
|
5
|
+
* модуля. Всё, что зависит от рантайма — пул воркеров, чтение wasm-байтов и
|
|
6
|
+
* число ядер — живёт в `runtime-node.ts` / `runtime-deno.ts`. Выбор
|
|
7
|
+
* реализации динамический: `node:worker_threads` не должен попадать в граф
|
|
8
|
+
* модулей Deno, где его нет.
|
|
9
|
+
*
|
|
10
|
+
* Bun идёт по Node-ветке: он реализует нужные `node:*`-модули, отдельный
|
|
11
|
+
* адаптер заводится только при фактической несовместимости.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Определить рантайм по глобалям.
|
|
15
|
+
*
|
|
16
|
+
* `Deno` проверяется первым: в Deno с включённой Node-совместимостью может
|
|
17
|
+
* быть и `process.versions`. `process` читается через каст, чтобы модуль не
|
|
18
|
+
* зависел от типов конкретного рантайма.
|
|
19
|
+
*/
|
|
20
|
+
export function detectRuntime() {
|
|
21
|
+
if ('Deno' in globalThis)
|
|
22
|
+
return 'deno';
|
|
23
|
+
// Глобалы рантаймов типизированы по-разному; читаем только поле Bun.
|
|
24
|
+
const globals = globalThis;
|
|
25
|
+
return globals.process?.versions?.bun === undefined ? 'node' : 'bun';
|
|
26
|
+
}
|
|
27
|
+
let runtime;
|
|
28
|
+
/**
|
|
29
|
+
* Взять реализацию рантайма, загрузив её один раз на процесс.
|
|
30
|
+
*
|
|
31
|
+
* Импорт динамический: статический `runtime-node.ts` притянул бы
|
|
32
|
+
* `node:worker_threads` в Deno, где модуль не загрузится.
|
|
33
|
+
*/
|
|
34
|
+
export function loadRuntime() {
|
|
35
|
+
runtime ??=
|
|
36
|
+
detectRuntime() === 'deno'
|
|
37
|
+
? import('./runtime-deno.js').then((module) => module.createRuntime())
|
|
38
|
+
: import('./runtime-node.js').then((module) => module.createRuntime());
|
|
39
|
+
return runtime;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAyBH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,MAAM,IAAI,UAAU;QAAE,OAAO,MAAM,CAAC;IACxC,qEAAqE;IACrE,MAAM,OAAO,GAAG,UAAsE,CAAC;IACvF,OAAO,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AACvE,CAAC;AAED,IAAI,OAAwC,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,aAAa,EAAE,KAAK,MAAM;YACxB,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YACtE,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAC3E,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/wasm.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Загрузка wasm-модулей.
|
|
3
|
+
*
|
|
4
|
+
* Модули собраны `wasm-pack --target web`: клей — обычный ESM, а `init()`
|
|
5
|
+
* по умолчанию идёт за `.wasm` через `fetch(new URL(..., import.meta.url))`.
|
|
6
|
+
* В Node `fetch` не умеет `file:`, поэтому путь не отдаём вовсе — читаем
|
|
7
|
+
* файл сами и передаём байты: `__wbg_load` для не-`Response` зовёт
|
|
8
|
+
* `WebAssembly.instantiate` напрямую. Как читать байты, решает рантайм
|
|
9
|
+
* (`runtime.ts`): Node/Bun — `createRequire`, Deno — `import.meta.resolve`.
|
|
10
|
+
* Сборка под `--target nodejs` не нужна, и общий `scripts/build-wasm.sh` не
|
|
11
|
+
* трогается.
|
|
12
|
+
*
|
|
13
|
+
* Промис кешируется на процесс (или на воркер): модуль грузится один раз на
|
|
14
|
+
* много файлов, а не на каждый.
|
|
15
|
+
*/
|
|
16
|
+
type PdfWasm = typeof import('@meerrec/wasm-pdf');
|
|
17
|
+
type DocxWasm = typeof import('@meerrec/wasm-docx');
|
|
18
|
+
/** Модуль экспорта в PDF (и XLSX, и DOCX). */
|
|
19
|
+
export declare function loadPdfWasm(): Promise<PdfWasm>;
|
|
20
|
+
/** Модуль экспорта DOCX в Markdown/HTML/текст. */
|
|
21
|
+
export declare function loadDocxWasm(): Promise<DocxWasm>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=wasm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../src/wasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,KAAK,OAAO,GAAG,cAAc,mBAAmB,CAAC,CAAC;AAClD,KAAK,QAAQ,GAAG,cAAc,oBAAoB,CAAC,CAAC;AAKpD,8CAA8C;AAC9C,wBAAgB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAG9C;AAED,kDAAkD;AAClD,wBAAgB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAGhD"}
|
package/dist/wasm.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Загрузка wasm-модулей.
|
|
3
|
+
*
|
|
4
|
+
* Модули собраны `wasm-pack --target web`: клей — обычный ESM, а `init()`
|
|
5
|
+
* по умолчанию идёт за `.wasm` через `fetch(new URL(..., import.meta.url))`.
|
|
6
|
+
* В Node `fetch` не умеет `file:`, поэтому путь не отдаём вовсе — читаем
|
|
7
|
+
* файл сами и передаём байты: `__wbg_load` для не-`Response` зовёт
|
|
8
|
+
* `WebAssembly.instantiate` напрямую. Как читать байты, решает рантайм
|
|
9
|
+
* (`runtime.ts`): Node/Bun — `createRequire`, Deno — `import.meta.resolve`.
|
|
10
|
+
* Сборка под `--target nodejs` не нужна, и общий `scripts/build-wasm.sh` не
|
|
11
|
+
* трогается.
|
|
12
|
+
*
|
|
13
|
+
* Промис кешируется на процесс (или на воркер): модуль грузится один раз на
|
|
14
|
+
* много файлов, а не на каждый.
|
|
15
|
+
*/
|
|
16
|
+
import { loadRuntime } from './runtime.js';
|
|
17
|
+
let pdfModule;
|
|
18
|
+
let docxModule;
|
|
19
|
+
/** Модуль экспорта в PDF (и XLSX, и DOCX). */
|
|
20
|
+
export function loadPdfWasm() {
|
|
21
|
+
pdfModule ??= initPdf();
|
|
22
|
+
return pdfModule;
|
|
23
|
+
}
|
|
24
|
+
/** Модуль экспорта DOCX в Markdown/HTML/текст. */
|
|
25
|
+
export function loadDocxWasm() {
|
|
26
|
+
docxModule ??= initDocx();
|
|
27
|
+
return docxModule;
|
|
28
|
+
}
|
|
29
|
+
async function initPdf() {
|
|
30
|
+
const module = await import('@meerrec/wasm-pdf');
|
|
31
|
+
await module.default({ module_or_path: await wasmBytes('@meerrec/wasm-pdf/pkg/doc_converter_pdf_wasm.js') });
|
|
32
|
+
return module;
|
|
33
|
+
}
|
|
34
|
+
async function initDocx() {
|
|
35
|
+
const module = await import('@meerrec/wasm-docx');
|
|
36
|
+
await module.default({ module_or_path: await wasmBytes('@meerrec/wasm-docx/pkg/doc_converter_docx_wasm.js') });
|
|
37
|
+
return module;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Байты `.wasm`, лежащего рядом со своим клеем.
|
|
41
|
+
*
|
|
42
|
+
* Путь ищет рантайм: в pnpm-раскладке пакет лежит в сторе, и склеенная из
|
|
43
|
+
* `import.meta.url` дорожка туда не ведёт. Подпуть `./pkg/*` объявлен в
|
|
44
|
+
* `exports` обоих wasm-пакетов.
|
|
45
|
+
*/
|
|
46
|
+
async function wasmBytes(jsSpecifier) {
|
|
47
|
+
const runtime = await loadRuntime();
|
|
48
|
+
return runtime.loadWasmBytes(jsSpecifier);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=wasm.js.map
|
package/dist/wasm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm.js","sourceRoot":"","sources":["../src/wasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAK3C,IAAI,SAAuC,CAAC;AAC5C,IAAI,UAAyC,CAAC;AAE9C,8CAA8C;AAC9C,MAAM,UAAU,WAAW;IACzB,SAAS,KAAK,OAAO,EAAE,CAAC;IACxB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,YAAY;IAC1B,UAAU,KAAK,QAAQ,EAAE,CAAC;IAC1B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACjD,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC,iDAAiD,CAAC,EAAE,CAAC,CAAC;IAC7G,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAClD,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC,mDAAmD,CAAC,EAAE,CAAC,CAAC;IAC/G,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,SAAS,CAAC,WAAmB;IAC1C,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;IACpC,OAAO,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Точка входа воркера пула под Deno.
|
|
3
|
+
*
|
|
4
|
+
* Зеркало `worker.ts` без `node:worker_threads`: Deno запускает веб-воркер,
|
|
5
|
+
* поэтому канал — `self.onmessage` / `self.postMessage`, а протокол тот же
|
|
6
|
+
* (`worker-protocol.ts`). Воркер живёт долго и переиспользует wasm-модуль,
|
|
7
|
+
* как и Node-версия.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=worker-deno.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-deno.d.ts","sourceRoot":"","sources":["../src/worker-deno.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Точка входа воркера пула под Deno.
|
|
3
|
+
*
|
|
4
|
+
* Зеркало `worker.ts` без `node:worker_threads`: Deno запускает веб-воркер,
|
|
5
|
+
* поэтому канал — `self.onmessage` / `self.postMessage`, а протокол тот же
|
|
6
|
+
* (`worker-protocol.ts`). Воркер живёт долго и переиспользует wasm-модуль,
|
|
7
|
+
* как и Node-версия.
|
|
8
|
+
*/
|
|
9
|
+
import { convertFile } from './convert.js';
|
|
10
|
+
const scope = globalThis;
|
|
11
|
+
if (typeof scope.postMessage !== 'function') {
|
|
12
|
+
throw new Error('worker-deno.js is meant to run as a web worker');
|
|
13
|
+
}
|
|
14
|
+
const port = scope;
|
|
15
|
+
port.onmessage = (event) => {
|
|
16
|
+
void handle(event.data);
|
|
17
|
+
};
|
|
18
|
+
async function handle(message) {
|
|
19
|
+
try {
|
|
20
|
+
const result = await convertFile(message.job);
|
|
21
|
+
port.postMessage({ id: message.id, ok: true, result });
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
const text = error instanceof Error ? error.message : String(error);
|
|
25
|
+
port.postMessage({ id: message.id, ok: false, error: text });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=worker-deno.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-deno.js","sourceRoot":"","sources":["../src/worker-deno.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAS3C,MAAM,KAAK,GAAG,UAA6C,CAAC;AAC5D,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;IAC5C,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,IAAI,GAAG,KAAoB,CAAC;AAClC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;IACzB,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,KAAK,UAAU,MAAM,CAAC,OAAsB;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAA2B,CAAC,CAAC;IAClF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAA2B,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Сообщения main ↔ worker пула. Отдельный модуль, чтобы пул и воркер
|
|
3
|
+
* сходились по типам, а `worker_threads` не тянулся в main только ради
|
|
4
|
+
* описания протокола.
|
|
5
|
+
*/
|
|
6
|
+
import type { ConvertJob, ConvertResult } from './convert.js';
|
|
7
|
+
export interface WorkerRequest {
|
|
8
|
+
id: number;
|
|
9
|
+
job: ConvertJob;
|
|
10
|
+
}
|
|
11
|
+
export type WorkerResponse = {
|
|
12
|
+
id: number;
|
|
13
|
+
ok: true;
|
|
14
|
+
result: ConvertResult;
|
|
15
|
+
} | {
|
|
16
|
+
id: number;
|
|
17
|
+
ok: false;
|
|
18
|
+
error: string;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=worker-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-protocol.d.ts","sourceRoot":"","sources":["../src/worker-protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAC/C;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-protocol.js","sourceRoot":"","sources":["../src/worker-protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/dist/worker.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Точка входа воркера пула.
|
|
3
|
+
*
|
|
4
|
+
* Воркер живёт долго и обрабатывает много файлов подряд: wasm-модуль
|
|
5
|
+
* (`convert` → `wasm.ts`) грузится при первой задаче и остаётся в памяти
|
|
6
|
+
* воркера, поэтому за файл не платят ни загрузкой, ни инициализацией.
|
|
7
|
+
* Задачи воркер получает по одной — их раздаёт пул.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
package/dist/worker.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Точка входа воркера пула.
|
|
3
|
+
*
|
|
4
|
+
* Воркер живёт долго и обрабатывает много файлов подряд: wasm-модуль
|
|
5
|
+
* (`convert` → `wasm.ts`) грузится при первой задаче и остаётся в памяти
|
|
6
|
+
* воркера, поэтому за файл не платят ни загрузкой, ни инициализацией.
|
|
7
|
+
* Задачи воркер получает по одной — их раздаёт пул.
|
|
8
|
+
*/
|
|
9
|
+
import { parentPort } from 'node:worker_threads';
|
|
10
|
+
import { convertFile } from './convert.js';
|
|
11
|
+
const port = parentPort;
|
|
12
|
+
if (port === null) {
|
|
13
|
+
throw new Error('worker.js is meant to run as a worker thread');
|
|
14
|
+
}
|
|
15
|
+
port.on('message', (message) => {
|
|
16
|
+
void handle(message);
|
|
17
|
+
});
|
|
18
|
+
async function handle(message) {
|
|
19
|
+
try {
|
|
20
|
+
const result = await convertFile(message.job);
|
|
21
|
+
port.postMessage({ id: message.id, ok: true, result });
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
const text = error instanceof Error ? error.message : String(error);
|
|
25
|
+
port.postMessage({ id: message.id, ok: false, error: text });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;IAClB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;AAClE,CAAC;AAED,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAsB,EAAE,EAAE;IAC5C,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,MAAM,CAAC,OAAsB;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAK,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAA2B,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,IAAK,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAA2B,CAAC,CAAC;IACzF,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meerrec/cli",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "2.0.2",
|
|
4
|
+
"description": "Command-line converter: DOCX to PDF/Markdown/HTML/text, XLSX to PDF, with a worker pool for batch runs.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/meerrec/wasm-converter.git",
|
|
9
|
+
"directory": "packages/cli"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/meerrec/wasm-converter#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/meerrec/wasm-converter/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"bin": {
|
|
17
|
+
"doc-converter": "./dist/cli.js"
|
|
18
|
+
},
|
|
19
|
+
"main": "./dist/index.js",
|
|
20
|
+
"module": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"import": "./dist/index.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"README.md",
|
|
31
|
+
"LICENSE"
|
|
32
|
+
],
|
|
33
|
+
"sideEffects": false,
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=20"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@meerrec/core": "2.0.2",
|
|
39
|
+
"@meerrec/wasm-pdf": "2.0.2",
|
|
40
|
+
"@meerrec/wasm-docx": "2.0.2"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^22.9.0",
|
|
44
|
+
"typescript": "^5.6.3",
|
|
45
|
+
"vitest": "^2.1.4"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"build": "tsc -p tsconfig.build.json && chmod +x dist/cli.js",
|
|
49
|
+
"test": "vitest run",
|
|
50
|
+
"typecheck": "tsc --noEmit",
|
|
51
|
+
"clean": "rm -rf dist"
|
|
52
|
+
}
|
|
6
53
|
}
|