@file-viewer/doc 2.1.10

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.
@@ -0,0 +1,19 @@
1
+ import type { MsDocParseOptions, MsDocParseResult, MsDocParseToHtmlOptions, MsDocRenderOptions, MsDocRenderResult, MsDocWorkerClientLike, WorkerLike } from './types.js';
2
+ /**
3
+ * Thin typed wrapper around a module worker so applications can offload
4
+ * expensive binary parsing without having to manage message correlation.
5
+ */
6
+ export declare class MsDocWorkerClient implements MsDocWorkerClientLike {
7
+ private readonly worker;
8
+ private readonly pending;
9
+ private seq;
10
+ constructor(worker: WorkerLike);
11
+ static create(url?: URL, workerOptions?: WorkerOptions): MsDocWorkerClient;
12
+ private handleMessage;
13
+ private handleError;
14
+ private request;
15
+ parse(input: ArrayBuffer | ArrayBufferView, options?: MsDocParseOptions): Promise<MsDocParseResult>;
16
+ parseToHtml(input: ArrayBuffer | ArrayBufferView, options?: MsDocParseToHtmlOptions): Promise<MsDocRenderResult>;
17
+ render(parsed: MsDocParseResult, options?: MsDocRenderOptions): Promise<MsDocRenderResult>;
18
+ destroy(): void;
19
+ }
@@ -0,0 +1,71 @@
1
+ function toArrayBuffer(input) {
2
+ if (input instanceof ArrayBuffer)
3
+ return input.slice(0);
4
+ if (ArrayBuffer.isView(input)) {
5
+ const bytes = new Uint8Array(input.byteLength);
6
+ bytes.set(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));
7
+ return bytes.buffer;
8
+ }
9
+ throw new TypeError('Expected ArrayBuffer or TypedArray');
10
+ }
11
+ /**
12
+ * Thin typed wrapper around a module worker so applications can offload
13
+ * expensive binary parsing without having to manage message correlation.
14
+ */
15
+ export class MsDocWorkerClient {
16
+ worker;
17
+ pending = new Map();
18
+ seq = 0;
19
+ constructor(worker) {
20
+ this.worker = worker;
21
+ this.handleMessage = this.handleMessage.bind(this);
22
+ this.handleError = this.handleError.bind(this);
23
+ worker.addEventListener('message', this.handleMessage);
24
+ worker.addEventListener('error', this.handleError);
25
+ }
26
+ static create(url = new URL('./worker.js', import.meta.url), workerOptions = {}) {
27
+ return new MsDocWorkerClient(new Worker(url, { type: 'module', ...workerOptions }));
28
+ }
29
+ handleMessage(event) {
30
+ const data = (event.data ?? {});
31
+ const id = typeof data.id === 'number' ? data.id : -1;
32
+ if (!this.pending.has(id))
33
+ return;
34
+ const current = this.pending.get(id);
35
+ this.pending.delete(id);
36
+ if (data.ok)
37
+ current.resolve(data.result);
38
+ else
39
+ current.reject(new Error(data.error || 'Worker request failed'));
40
+ }
41
+ handleError(event) {
42
+ for (const { reject } of this.pending.values()) {
43
+ reject(event.error || new Error(event.message || 'Worker crashed'));
44
+ }
45
+ this.pending.clear();
46
+ }
47
+ request(type, payload, transfer = []) {
48
+ const id = ++this.seq;
49
+ return new Promise((resolve, reject) => {
50
+ this.pending.set(id, { resolve: resolve, reject });
51
+ this.worker.postMessage({ id, type, ...payload }, transfer);
52
+ });
53
+ }
54
+ parse(input, options = {}) {
55
+ const buffer = toArrayBuffer(input);
56
+ return this.request('parse', { buffer, options }, [buffer]);
57
+ }
58
+ parseToHtml(input, options = {}) {
59
+ const buffer = toArrayBuffer(input);
60
+ return this.request('parseToHtml', { buffer, options }, [buffer]);
61
+ }
62
+ render(parsed, options = {}) {
63
+ return this.request('render', { parsed, options });
64
+ }
65
+ destroy() {
66
+ this.worker.removeEventListener('message', this.handleMessage);
67
+ this.worker.removeEventListener('error', this.handleError);
68
+ this.worker.terminate();
69
+ this.pending.clear();
70
+ }
71
+ }
@@ -0,0 +1 @@
1
+ export {};
package/dist/worker.js ADDED
@@ -0,0 +1,36 @@
1
+ import { parseMsDoc } from './msdoc/parser.js';
2
+ import { renderMsDoc } from './render/html.js';
3
+ const workerScope = self;
4
+ workerScope.addEventListener('message', (event) => {
5
+ const message = event.data ?? {};
6
+ const id = typeof message.id === 'number' ? message.id : -1;
7
+ const type = message.type;
8
+ try {
9
+ let result;
10
+ if (type === 'parse') {
11
+ const buffer = message.buffer;
12
+ const options = message.options;
13
+ result = parseMsDoc(buffer, options ?? {});
14
+ }
15
+ else if (type === 'render') {
16
+ const parsed = message.parsed;
17
+ const options = message.options;
18
+ result = renderMsDoc(parsed, options ?? {});
19
+ }
20
+ else if (type === 'parseToHtml') {
21
+ const buffer = message.buffer;
22
+ const options = message.options;
23
+ const parseOptions = options?.parseOptions ?? {};
24
+ const renderOptions = options?.renderOptions ?? {};
25
+ result = renderMsDoc(parseMsDoc(buffer, parseOptions), renderOptions);
26
+ }
27
+ else {
28
+ throw new Error(`Unsupported worker request type: ${String(type)}`);
29
+ }
30
+ workerScope.postMessage({ id, ok: true, result });
31
+ }
32
+ catch (error) {
33
+ const errorMessage = error instanceof Error ? error.message : String(error);
34
+ workerScope.postMessage({ id, ok: false, error: errorMessage });
35
+ }
36
+ });
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "@file-viewer/doc",
3
+ "version": "2.1.10",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "Browser-native legacy MS-DOC (.doc) parser and HTML renderer extracted from the public msdoc-viewer 0.2.0 line.",
7
+ "keywords": [
8
+ "file-viewer",
9
+ "doc",
10
+ "ms-doc",
11
+ "ole",
12
+ "cfb",
13
+ "word",
14
+ "document-preview",
15
+ "document-viewer",
16
+ "file-preview",
17
+ "self-hosted",
18
+ "offline-first"
19
+ ],
20
+ "publishConfig": {
21
+ "access": "public",
22
+ "registry": "https://registry.npmjs.org/"
23
+ },
24
+ "author": {
25
+ "name": "Wangyu",
26
+ "email": "wybaby168@gmail.com"
27
+ },
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/flyfish-dev/docjs.git",
31
+ "directory": "packages/renderers/doc"
32
+ },
33
+ "homepage": "https://github.com/flyfish-dev/docjs",
34
+ "bugs": {
35
+ "url": "https://github.com/flyfish-dev/docjs/issues"
36
+ },
37
+ "funding": {
38
+ "type": "individual",
39
+ "url": "https://dev.flyfish.group/shop"
40
+ },
41
+ "main": "./dist/index.js",
42
+ "module": "./dist/index.js",
43
+ "types": "./dist/index.d.ts",
44
+ "sideEffects": false,
45
+ "exports": {
46
+ ".": {
47
+ "types": "./dist/index.d.ts",
48
+ "import": "./dist/index.js",
49
+ "default": "./dist/index.js"
50
+ },
51
+ "./worker": {
52
+ "types": "./dist/worker.d.ts",
53
+ "import": "./dist/worker.js",
54
+ "default": "./dist/worker.js"
55
+ },
56
+ "./package.json": "./package.json"
57
+ },
58
+ "files": [
59
+ "dist",
60
+ "README.md",
61
+ "README.en.md",
62
+ "LICENSE"
63
+ ],
64
+ "devDependencies": {
65
+ "typescript": "^6.0.3"
66
+ },
67
+ "license": "MIT",
68
+ "scripts": {
69
+ "build": "tsc -b tsconfig.json",
70
+ "type-check": "tsc -b tsconfig.json",
71
+ "verify:github-34": "pnpm build && node scripts/verify-github-34.mjs"
72
+ }
73
+ }