@mlightcad/libredwg-web 0.7.3 → 0.7.4

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.
@@ -12,6 +12,7 @@ export declare class LibreDwgConverter {
12
12
  getConversionStats(): {
13
13
  unknownEntityCount: number;
14
14
  };
15
+ private safeObjectTio;
15
16
  private convertHeader;
16
17
  private convertClasses;
17
18
  private convertAppId;
@@ -1,5 +1,5 @@
1
1
  import { HEADER_VARIABLES } from '../database';
2
- import { Dwg_Object_Type } from '../types';
2
+ import { Dwg_Object_Supertype, Dwg_Object_Type } from '../types';
3
3
  import { LibreEntityConverter } from './entityConverter';
4
4
  import { idToString, isModelSpace, isPaperSpace } from './utils';
5
5
  /**
@@ -56,7 +56,7 @@ export class LibreDwgConverter {
56
56
  for (let i = 0; i < num_objects; i++) {
57
57
  const obj = libredwg.dwg_get_object(data, i);
58
58
  if (obj) {
59
- const tio = libredwg.dwg_object_to_object_tio(obj);
59
+ const tio = this.safeObjectTio(obj);
60
60
  if (tio) {
61
61
  const fixedtype = libredwg.dwg_object_get_fixedtype(obj);
62
62
  switch (fixedtype) {
@@ -83,7 +83,7 @@ export class LibreDwgConverter {
83
83
  for (let i = 0; i < num_objects; i++) {
84
84
  const obj = libredwg.dwg_get_object(data, i);
85
85
  if (obj) {
86
- const tio = libredwg.dwg_object_to_object_tio(obj);
86
+ const tio = this.safeObjectTio(obj);
87
87
  if (tio) {
88
88
  const fixedtype = libredwg.dwg_object_get_fixedtype(obj);
89
89
  switch (fixedtype) {
@@ -156,6 +156,20 @@ export class LibreDwgConverter {
156
156
  unknownEntityCount: this.entityConverter.unknownEntityCount
157
157
  };
158
158
  }
159
+ safeObjectTio(obj) {
160
+ const libredwg = this.libredwg;
161
+ try {
162
+ if (libredwg.dwg_object_get_supertype(obj) !=
163
+ Dwg_Object_Supertype.DWG_SUPERTYPE_OBJECT) {
164
+ return null;
165
+ }
166
+ const tio = libredwg.dwg_object_to_object_tio(obj);
167
+ return tio ? tio : null;
168
+ }
169
+ catch {
170
+ return null;
171
+ }
172
+ }
159
173
  convertHeader(data, header) {
160
174
  const libredwg = this.libredwg;
161
175
  HEADER_VARIABLES.forEach(name => {
@@ -172,10 +186,10 @@ export class LibreDwgConverter {
172
186
  name == 'DIMSTYLE' ||
173
187
  name == 'DIMTXSTY' ||
174
188
  name == 'TEXTSTYLE') {
175
- value = !!value ? libredwg.dwg_ref_get_object_name(value) : '';
189
+ value = value ? libredwg.dwg_ref_get_object_name(value) : '';
176
190
  }
177
191
  else if (name == 'DRAGVS') {
178
- value = !!value ? libredwg.dwg_ref_get_absref(value) : 2;
192
+ value = value ? libredwg.dwg_ref_get_absref(value) : 2;
179
193
  }
180
194
  // @ts-expect-error header variable name
181
195
  header[name] = value;
@@ -892,7 +906,7 @@ export class LibreDwgConverter {
892
906
  const viewportId = idToString(libredwg.dwg_ref_get_absref(active_viewport_ref));
893
907
  const named_ucs_ref = libredwg.dwg_dynapi_entity_value(item, 'named_ucs')
894
908
  .data;
895
- const namedUcsId = !!named_ucs_ref
909
+ const namedUcsId = named_ucs_ref
896
910
  ? idToString(libredwg.dwg_ref_get_absref(named_ucs_ref))
897
911
  : undefined;
898
912
  // BITCODE_H base_ucs;
@@ -1,4 +1,4 @@
1
- import { DwgDatabase, DwgEntity, DwgClassLookup } from '../database';
1
+ import { DwgClassLookup, DwgDatabase, DwgEntity } from '../database';
2
2
  import { LibreDwgEx } from '../libredwg';
3
3
  import { Dwg_Object_Ptr } from '../types';
4
4
  export declare class LibreEntityConverter {
package/lib/libredwg.js CHANGED
@@ -2,7 +2,7 @@ import createModule from '../wasm/libredwg-web.js';
2
2
  import { LibreDwgConverter } from './converter';
3
3
  import { dwgCodePageToEncoding, dwgVersions } from './database';
4
4
  import { SvgConverter } from './svg';
5
- import { Dwg_File_Type, Dwg_Object_Type } from './types';
5
+ import { Dwg_Error, Dwg_File_Type, Dwg_Object_Type } from './types';
6
6
  export { createModule };
7
7
  export var DwgThumbnailImageType;
8
8
  (function (DwgThumbnailImageType) {
@@ -32,8 +32,12 @@ export class LibreDwg {
32
32
  try {
33
33
  this.wasmInstance.FS.writeFile(fileName, new Uint8Array(fileContent));
34
34
  const result = this.wasmInstance.dwg_read_file(fileName);
35
+ if (result.error & Dwg_Error.OUTOFMEM) {
36
+ this.wasmInstance.dwg_abandon(result.data);
37
+ throw new Error('Failed to decode DWG: out of WASM memory. Rebuild with pnpm build:wasm (INITIAL_MEMORY=1GB) or use a smaller file.');
38
+ }
35
39
  if (result.error != 0) {
36
- console.log('Open dwg file with error code: ', result.error);
40
+ console.warn('Open dwg file with error code:', result.error);
37
41
  }
38
42
  return result.data;
39
43
  }
@@ -168,7 +172,20 @@ export class LibreDwg {
168
172
  * @param data Pointer to Dwg_Data instance.
169
173
  */
170
174
  dwg_free(data) {
171
- this.wasmInstance.dwg_free(data);
175
+ if (!data) {
176
+ return;
177
+ }
178
+ try {
179
+ this.wasmInstance.dwg_free(data);
180
+ }
181
+ catch {
182
+ try {
183
+ this.wasmInstance.dwg_abandon(data);
184
+ }
185
+ catch {
186
+ // best effort; wasm heap may already be corrupt
187
+ }
188
+ }
172
189
  }
173
190
  /**
174
191
  * Frees the object (all three structs and its fields)
@@ -2,6 +2,23 @@ export declare enum Dwg_Object_Supertype {
2
2
  DWG_SUPERTYPE_ENTITY = 0,
3
3
  DWG_SUPERTYPE_OBJECT = 1
4
4
  }
5
+ /** Bit flags returned by dwg_read_file (see include/dwg.h DWG_ERROR). */
6
+ export declare enum Dwg_Error {
7
+ WRONGCRC = 1,
8
+ NOTYETSUPPORTED = 2,
9
+ UNHANDLEDCLASS = 4,
10
+ INVALIDTYPE = 8,
11
+ INVALIDHANDLE = 16,
12
+ INVALIDEED = 32,
13
+ VALUEOUTOFBOUNDS = 64,
14
+ CLASSESNOTFOUND = 128,
15
+ SECTIONNOTFOUND = 256,
16
+ PAGENOTFOUND = 512,
17
+ INTERNALERROR = 1024,
18
+ INVALIDDWG = 2048,
19
+ IOERROR = 4096,
20
+ OUTOFMEM = 8192
21
+ }
5
22
  export declare enum Dwg_Object_Type {
6
23
  DWG_TYPE_UNUSED = 0,
7
24
  DWG_TYPE_TEXT = 1,
@@ -3,6 +3,24 @@ export var Dwg_Object_Supertype;
3
3
  Dwg_Object_Supertype[Dwg_Object_Supertype["DWG_SUPERTYPE_ENTITY"] = 0] = "DWG_SUPERTYPE_ENTITY";
4
4
  Dwg_Object_Supertype[Dwg_Object_Supertype["DWG_SUPERTYPE_OBJECT"] = 1] = "DWG_SUPERTYPE_OBJECT";
5
5
  })(Dwg_Object_Supertype || (Dwg_Object_Supertype = {}));
6
+ /** Bit flags returned by dwg_read_file (see include/dwg.h DWG_ERROR). */
7
+ export var Dwg_Error;
8
+ (function (Dwg_Error) {
9
+ Dwg_Error[Dwg_Error["WRONGCRC"] = 1] = "WRONGCRC";
10
+ Dwg_Error[Dwg_Error["NOTYETSUPPORTED"] = 2] = "NOTYETSUPPORTED";
11
+ Dwg_Error[Dwg_Error["UNHANDLEDCLASS"] = 4] = "UNHANDLEDCLASS";
12
+ Dwg_Error[Dwg_Error["INVALIDTYPE"] = 8] = "INVALIDTYPE";
13
+ Dwg_Error[Dwg_Error["INVALIDHANDLE"] = 16] = "INVALIDHANDLE";
14
+ Dwg_Error[Dwg_Error["INVALIDEED"] = 32] = "INVALIDEED";
15
+ Dwg_Error[Dwg_Error["VALUEOUTOFBOUNDS"] = 64] = "VALUEOUTOFBOUNDS";
16
+ Dwg_Error[Dwg_Error["CLASSESNOTFOUND"] = 128] = "CLASSESNOTFOUND";
17
+ Dwg_Error[Dwg_Error["SECTIONNOTFOUND"] = 256] = "SECTIONNOTFOUND";
18
+ Dwg_Error[Dwg_Error["PAGENOTFOUND"] = 512] = "PAGENOTFOUND";
19
+ Dwg_Error[Dwg_Error["INTERNALERROR"] = 1024] = "INTERNALERROR";
20
+ Dwg_Error[Dwg_Error["INVALIDDWG"] = 2048] = "INVALIDDWG";
21
+ Dwg_Error[Dwg_Error["IOERROR"] = 4096] = "IOERROR";
22
+ Dwg_Error[Dwg_Error["OUTOFMEM"] = 8192] = "OUTOFMEM";
23
+ })(Dwg_Error || (Dwg_Error = {}));
6
24
  export var Dwg_Object_Type;
7
25
  (function (Dwg_Object_Type) {
8
26
  Dwg_Object_Type[Dwg_Object_Type["DWG_TYPE_UNUSED"] = 0] = "DWG_TYPE_UNUSED";
package/package.json CHANGED
@@ -3,9 +3,12 @@
3
3
  "description": "A DWG/DXF JavaScript parser based on libredwg",
4
4
  "license": "GPL-3.0",
5
5
  "private": false,
6
- "version": "0.7.3",
6
+ "version": "0.7.4",
7
7
  "author": "MLight Lee <mlight.lee@outlook.com>",
8
8
  "type": "module",
9
+ "engines": {
10
+ "node": ">=20"
11
+ },
9
12
  "repository": {
10
13
  "type": "git",
11
14
  "url": "https://github.com/mlightcad/libredwg-web"
@@ -41,6 +44,7 @@
41
44
  "require": "./dist/libredwg-web.umd.cjs"
42
45
  },
43
46
  "devDependencies": {
47
+ "@eslint/js": "^9.9.1",
44
48
  "@typescript-eslint/parser": "^8.4.0",
45
49
  "eslint": "^9.9.1",
46
50
  "eslint-config-prettier": "^9.1.0",
@@ -70,15 +74,18 @@
70
74
  "demo": "live-server examples --entry-file=index.html",
71
75
  "doc": "typedoc",
72
76
  "build": "tsc && vite build && cp -rf wasm examples/ && cp -rf dist examples/",
73
- "build:prepare": "mkdir -p ../../build-wasm && cd ../../build-wasm && emconfigure ../configure CFLAGS=\"-O2 -sUSE_ZLIB=1\" CC=emcc --enable-release --disable-docs --disable-write --disable-python --disable-bindings --disable-shared --disable-json --enable-partial --enable-experimental",
77
+ "build:prepare": "mkdir -p ../../build-wasm && cd ../../build-wasm && emconfigure ../configure CFLAGS=\"-O2 -sUSE_ZLIB=1 -DNDEBUG\" CC=emcc --enable-release --disable-docs --disable-write --disable-python --disable-bindings --disable-shared --disable-json --enable-partial --enable-experimental",
74
78
  "build:obj": "cd ../../build-wasm && emmake make",
75
- "build:wasm": "cd ../../build-wasm && emcc ../bindings/javascript/embind/*.cpp src/*.o -O2 -lembind -std=c++17 -Isrc -I../src -I../include -o libredwg-web.js -s ALLOW_MEMORY_GROWTH=1 -s EXPORT_ES6=1 -s MODULARIZE=1 -s EXPORT_NAME=\"createModule\" -sEXPORTED_RUNTIME_METHODS=FS,ENV,ccall,cwrap,UTF8ToString,stringToNewUTF8,setValue --emit-tsd libredwg-web.d.ts",
79
+ "build:wasm": "cd ../../build-wasm && emcc ../bindings/javascript/embind/*.cpp src/*.o -O2 -lembind -std=c++17 -Isrc -I../src -I../include -o libredwg-web.js -s ALLOW_MEMORY_GROWTH=1 -s INITIAL_MEMORY=1GB -s MAXIMUM_MEMORY=4GB -s MALLOC=mimalloc -s EXPORT_ES6=1 -s MODULARIZE=1 -s EXPORT_NAME=\"createModule\" -sEXPORTED_RUNTIME_METHODS=FS,ENV,ccall,cwrap,UTF8ToString,stringToNewUTF8,setValue --emit-tsd libredwg-web.d.ts",
76
80
  "clean": "rm -rf ../../build-wasm ./docs ./dist ./lib",
77
81
  "copy": "cp -f ../../build-wasm/libredwg-web.d.ts ../../build-wasm/libredwg-web.js ../../build-wasm/libredwg-web.wasm wasm/ && cp -f ../../build-wasm/libredwg-web.js src/",
78
82
  "format": "prettier --config ./.prettierrc.js --write src/**/*.{ts,js}",
79
83
  "install:emsdk": "cd $EMSDK && ./emsdk install latest && ./emsdk activate latest",
80
84
  "link": "node script/create-symlink.js ./wasm/libredwg-web.js ./src/libredwg-web.js",
81
85
  "lint": "eslint src/",
82
- "lint:fix": "eslint --fix --quiet src/"
86
+ "lint:fix": "eslint --fix --quiet src/",
87
+ "test": "node --test test/node-api.test.mjs",
88
+ "test:node": "pnpm build && pnpm test",
89
+ "publish:npm": "pnpm publish --access public --no-git-checks"
83
90
  }
84
91
  }
@@ -224,6 +224,26 @@ declare class FSNode {
224
224
  get isDevice(): any;
225
225
  }
226
226
  interface WasmModule {
227
+ __Znwm(_0: number): number;
228
+ __ZdlPvm(_0: number, _1: number): void;
229
+ _strndup(_0: number, _1: number): number;
230
+ __ZdaPv(_0: number): void;
231
+ __ZdaPvm(_0: number, _1: number): void;
232
+ __ZdlPv(_0: number): void;
233
+ _emscripten_builtin_malloc(_0: number): number;
234
+ __Znam(_0: number): number;
235
+ __ZnamSt11align_val_t(_0: number, _1: number): number;
236
+ __ZnwmSt11align_val_t(_0: number, _1: number): number;
237
+ ___libc_calloc(_0: number, _1: number): number;
238
+ ___libc_free(_0: number): void;
239
+ ___libc_malloc(_0: number): number;
240
+ ___libc_realloc(_0: number, _1: number): number;
241
+ _emscripten_builtin_calloc(_0: number, _1: number): number;
242
+ _emscripten_builtin_free(_0: number): void;
243
+ _emscripten_builtin_realloc(_0: number, _1: number): number;
244
+ _malloc_size(_0: number): number;
245
+ _malloc_usable_size(_0: number): number;
246
+ _reallocf(_0: number, _1: number): number;
227
247
  }
228
248
 
229
249
  type EmbindString = ArrayBuffer|Uint8Array|Uint8ClampedArray|Int8Array|string;
@@ -389,6 +409,7 @@ interface EmbindModule {
389
409
  dwg_get_next_object(_0: number, _1: Dwg_Object_Type, _2: number): number;
390
410
  dwg_resolve_jump(_0: number): number;
391
411
  dwg_free(_0: number): void;
412
+ dwg_abandon(_0: number): void;
392
413
  dwg_free_object(_0: number): void;
393
414
  dwg_new_ref(_0: number): number;
394
415
  dwg_dup_handleref(_0: number, _1: number): number;