@ifc-lite/parser 3.3.0 → 3.3.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/dist/parser.worker.d.ts.map +1 -1
- package/dist/parser.worker.js +11 -2
- package/dist/parser.worker.js.map +1 -1
- package/dist/spatial-hierarchy-builder.d.ts +13 -0
- package/dist/spatial-hierarchy-builder.d.ts.map +1 -1
- package/dist/spatial-hierarchy-builder.js +68 -18
- package/dist/spatial-hierarchy-builder.js.map +1 -1
- package/dist/wasm-init-retry.d.ts +45 -0
- package/dist/wasm-init-retry.d.ts.map +1 -0
- package/dist/wasm-init-retry.js +60 -0
- package/dist/wasm-init-retry.js.map +1 -0
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.worker.d.ts","sourceRoot":"","sources":["../src/parser.worker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parser.worker.d.ts","sourceRoot":"","sources":["../src/parser.worker.ts"],"names":[],"mappings":"AAsBA,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AAEnC,gFAAgF;AAChF,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,iBAAiB,CAAC;IAC1B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,uFAAuF;AACvF,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,kBAAkB,CAAC;IACzB,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,uCAAuC;AACvC,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,kFAAkF;AAClF,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,YAAY,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wFAAwF;AACxF,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,eAAe,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED,gCAAgC;AAChC,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,yBAAyB,GACjC,2BAA2B,GAC3B,6BAA6B,GAC7B,+BAA+B,GAC/B,2BAA2B,GAC3B,wBAAwB,CAAC"}
|
package/dist/parser.worker.js
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* because nesting workers serves no purpose and adds postMessage latency.
|
|
15
15
|
*/
|
|
16
16
|
import init, { IfcAPI } from '@ifc-lite/wasm';
|
|
17
|
+
import { initWasmWithRetry } from './wasm-init-retry.js';
|
|
17
18
|
import { IfcParser } from './index.js';
|
|
18
19
|
import { toTransport, transportByteSize, } from './data-store-transport.js';
|
|
19
20
|
function readJsHeapBytes() {
|
|
@@ -43,8 +44,16 @@ let initPromise = null;
|
|
|
43
44
|
async function ensureWasmScanApi() {
|
|
44
45
|
if (cachedFullScanApi)
|
|
45
46
|
return cachedFullScanApi;
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
// `init` is wrapped in `initWasmWithRetry` so a transient engine-binary
|
|
48
|
+
// download failure is retried once before failing. Clear `initPromise` on
|
|
49
|
+
// failure so a later call can recover (e.g. the network came back) instead
|
|
50
|
+
// of memoising the rejection forever.
|
|
51
|
+
if (!initPromise) {
|
|
52
|
+
initPromise = initWasmWithRetry(() => init(), { label: 'parser.worker' }).catch((err) => {
|
|
53
|
+
initPromise = null;
|
|
54
|
+
throw err;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
48
57
|
await initPromise;
|
|
49
58
|
const api = new IfcAPI();
|
|
50
59
|
cachedFullScanApi = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.worker.js","sourceRoot":"","sources":["../src/parser.worker.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;GAWG;AAEH,OAAO,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAEL,WAAW,EACX,iBAAiB,GAGlB,MAAM,2BAA2B,CAAC;AA0EnC,SAAS,eAAe;IACtB,MAAM,IAAI,GAAG,WAAoC,CAAC;IAClD,OAAO,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;AACrC,CAAC;AAED,SAAS,UAAU,CAAC,OAAkC,EAAE,SAA0B;IAChF,MAAM,CAAC,GAAG,IAAyB,CAAC;IACpC,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,IAAI,iBAAiB,GAAsD,IAAI,CAAC;AAChF,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C,KAAK,UAAU,iBAAiB;IAC9B,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAChD,IAAI,CAAC,WAAW;
|
|
1
|
+
{"version":3,"file":"parser.worker.js","sourceRoot":"","sources":["../src/parser.worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,5 +20,18 @@ export declare class SpatialHierarchyBuilder {
|
|
|
20
20
|
* Elevation is at attribute index 9 in IFC4 (after GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType)
|
|
21
21
|
*/
|
|
22
22
|
private extractElevation;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve a storey's elevation from its ObjectPlacement, used as a fallback when
|
|
25
|
+
* the Elevation attribute is null. Walks
|
|
26
|
+
* IfcBuildingStorey.ObjectPlacement (IfcLocalPlacement)
|
|
27
|
+
* -> RelativePlacement (IfcAxis2Placement3D)
|
|
28
|
+
* -> Location (IfcCartesianPoint).Coordinates[2]
|
|
29
|
+
* i.e. the storey's Z relative to its parent spatial container. That matches the
|
|
30
|
+
* semantics of the Elevation attribute (relative to the building), so it stays
|
|
31
|
+
* consistent with sibling storeys that DO carry the attribute, and it avoids
|
|
32
|
+
* folding in any site-level georeferencing Z. Returns the raw (unscaled) Z, or
|
|
33
|
+
* undefined when the placement chain can't be resolved.
|
|
34
|
+
*/
|
|
35
|
+
private extractPlacementElevation;
|
|
23
36
|
}
|
|
24
37
|
//# sourceMappingURL=spatial-hierarchy-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spatial-hierarchy-builder.d.ts","sourceRoot":"","sources":["../src/spatial-hierarchy-builder.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AAUjH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C,qBAAa,uBAAuB;IAClC;;;;OAIG;IACH,KAAK,CACH,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,iBAAiB,EAChC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE;QAAE,IAAI,EAAE;YAAE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;SAAE,CAAA;KAAE,EACxE,eAAe,GAAE,MAAY,GAC5B,gBAAgB;IA6HnB,OAAO,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"spatial-hierarchy-builder.d.ts","sourceRoot":"","sources":["../src/spatial-hierarchy-builder.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AAUjH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C,qBAAa,uBAAuB;IAClC;;;;OAIG;IACH,KAAK,CACH,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,iBAAiB,EAChC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE;QAAE,IAAI,EAAE;YAAE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;SAAE,CAAA;KAAE,EACxE,eAAe,GAAE,MAAY,GAC5B,gBAAgB;IA6HnB,OAAO,CAAC,SAAS;IA+JjB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA+CxB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,yBAAyB;CA0ClC"}
|
|
@@ -120,7 +120,15 @@ export class SpatialHierarchyBuilder {
|
|
|
120
120
|
// Extract elevation for storeys (apply unit scale to convert to meters)
|
|
121
121
|
let elevation;
|
|
122
122
|
if (typeEnum === IfcTypeEnum.IfcBuildingStorey) {
|
|
123
|
-
|
|
123
|
+
let rawElevation = this.extractElevation(expressId, source, entityIndex);
|
|
124
|
+
if (rawElevation === undefined) {
|
|
125
|
+
// The Elevation attribute is optional and is frequently left null (common
|
|
126
|
+
// in Revit / ArchiCAD exports). Fall back to the storey's Z from its
|
|
127
|
+
// ObjectPlacement so a storey without an explicit elevation still orders +
|
|
128
|
+
// lifts correctly in Exploded mode instead of being dropped from the sort,
|
|
129
|
+
// which made the model look like it had a single floor (#1289).
|
|
130
|
+
rawElevation = this.extractPlacementElevation(expressId, source, entityIndex);
|
|
131
|
+
}
|
|
124
132
|
if (rawElevation !== undefined) {
|
|
125
133
|
// Apply unit scale to convert to meters
|
|
126
134
|
elevation = rawElevation * lengthUnitScale;
|
|
@@ -232,24 +240,16 @@ export class SpatialHierarchyBuilder {
|
|
|
232
240
|
}
|
|
233
241
|
return undefined;
|
|
234
242
|
};
|
|
235
|
-
//
|
|
243
|
+
// Elevation is attribute index 9 for IfcBuildingStorey in both IFC2x3 and
|
|
244
|
+
// IFC4 (GlobalId, OwnerHistory, Name, Description, ObjectType,
|
|
245
|
+
// ObjectPlacement, Representation, LongName, CompositionType, Elevation).
|
|
246
|
+
// Read ONLY that slot: a previous "scan every attribute for a number < 10000"
|
|
247
|
+
// fallback wrongly treated reference attributes — parsed as bare express-id
|
|
248
|
+
// numbers (e.g. OwnerHistory #3628 -> 3628, or ObjectPlacement #7150) — as
|
|
249
|
+
// elevations, so a storey with a null Elevation got a garbage value instead
|
|
250
|
+
// of falling through to the ObjectPlacement-Z fallback below (#1289).
|
|
236
251
|
if (attrs.length > 9) {
|
|
237
|
-
|
|
238
|
-
if (elev !== undefined)
|
|
239
|
-
return elev;
|
|
240
|
-
}
|
|
241
|
-
// Try index 8 (in case of schema variations)
|
|
242
|
-
if (attrs.length > 8) {
|
|
243
|
-
const elev = extractNumber(attrs[8]);
|
|
244
|
-
if (elev !== undefined)
|
|
245
|
-
return elev;
|
|
246
|
-
}
|
|
247
|
-
// Fallback: search for first numeric value that looks like an elevation
|
|
248
|
-
for (let i = 0; i < attrs.length; i++) {
|
|
249
|
-
const elev = extractNumber(attrs[i]);
|
|
250
|
-
if (elev !== undefined && Math.abs(elev) < 10000) {
|
|
251
|
-
return elev;
|
|
252
|
-
}
|
|
252
|
+
return extractNumber(attrs[9]);
|
|
253
253
|
}
|
|
254
254
|
}
|
|
255
255
|
catch (error) {
|
|
@@ -262,5 +262,55 @@ export class SpatialHierarchyBuilder {
|
|
|
262
262
|
}
|
|
263
263
|
return undefined;
|
|
264
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* Resolve a storey's elevation from its ObjectPlacement, used as a fallback when
|
|
267
|
+
* the Elevation attribute is null. Walks
|
|
268
|
+
* IfcBuildingStorey.ObjectPlacement (IfcLocalPlacement)
|
|
269
|
+
* -> RelativePlacement (IfcAxis2Placement3D)
|
|
270
|
+
* -> Location (IfcCartesianPoint).Coordinates[2]
|
|
271
|
+
* i.e. the storey's Z relative to its parent spatial container. That matches the
|
|
272
|
+
* semantics of the Elevation attribute (relative to the building), so it stays
|
|
273
|
+
* consistent with sibling storeys that DO carry the attribute, and it avoids
|
|
274
|
+
* folding in any site-level georeferencing Z. Returns the raw (unscaled) Z, or
|
|
275
|
+
* undefined when the placement chain can't be resolved.
|
|
276
|
+
*/
|
|
277
|
+
extractPlacementElevation(expressId, source, entityIndex) {
|
|
278
|
+
try {
|
|
279
|
+
const extractor = new EntityExtractor(source);
|
|
280
|
+
const readAttrs = (id) => {
|
|
281
|
+
const ref = entityIndex.byId.get(id);
|
|
282
|
+
if (!ref)
|
|
283
|
+
return undefined;
|
|
284
|
+
return extractor.extractEntity(ref)?.attributes ?? undefined;
|
|
285
|
+
};
|
|
286
|
+
// IfcBuildingStorey.ObjectPlacement is attribute index 5.
|
|
287
|
+
const placementId = readAttrs(expressId)?.[5];
|
|
288
|
+
if (typeof placementId !== 'number')
|
|
289
|
+
return undefined;
|
|
290
|
+
// IfcLocalPlacement(PlacementRelTo, RelativePlacement) — RelativePlacement
|
|
291
|
+
// (index 1) is the IfcAxis2Placement3D carrying this storey's own offset.
|
|
292
|
+
const axisId = readAttrs(placementId)?.[1];
|
|
293
|
+
if (typeof axisId !== 'number')
|
|
294
|
+
return undefined;
|
|
295
|
+
// IfcAxis2Placement3D(Location, Axis, RefDirection) — Location (index 0) is
|
|
296
|
+
// an IfcCartesianPoint.
|
|
297
|
+
const locationId = readAttrs(axisId)?.[0];
|
|
298
|
+
if (typeof locationId !== 'number')
|
|
299
|
+
return undefined;
|
|
300
|
+
// IfcCartesianPoint.Coordinates (index 0) is a list [x, y, z].
|
|
301
|
+
const coords = readAttrs(locationId)?.[0];
|
|
302
|
+
if (Array.isArray(coords) && coords.length >= 3 && typeof coords[2] === 'number') {
|
|
303
|
+
return coords[2];
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
log.caught('Failed to extract placement elevation', error, {
|
|
308
|
+
operation: 'extractPlacementElevation',
|
|
309
|
+
entityId: expressId,
|
|
310
|
+
entityType: 'IfcBuildingStorey',
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
return undefined;
|
|
314
|
+
}
|
|
265
315
|
}
|
|
266
316
|
//# sourceMappingURL=spatial-hierarchy-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spatial-hierarchy-builder.js","sourceRoot":"","sources":["../src/spatial-hierarchy-builder.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"spatial-hierarchy-builder.js","sourceRoot":"","sources":["../src/spatial-hierarchy-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resilient one-shot retry around wasm-bindgen's `init()`.
|
|
3
|
+
*
|
|
4
|
+
* wasm-bindgen's streaming loader rethrows on a non-OK HTTP status or a failed
|
|
5
|
+
* fetch of `ifc-lite_bg.wasm` (it only falls back to `arrayBuffer`+`instantiate`
|
|
6
|
+
* for the wrong-MIME case), surfacing as `TypeError: Failed to execute
|
|
7
|
+
* 'compile' on 'WebAssembly': HTTP status code is not ok`. A transient blip — a
|
|
8
|
+
* cold CDN edge, a mid-deploy race, a flaky proxy/antivirus — can produce a
|
|
9
|
+
* one-off failure that a second attempt recovers.
|
|
10
|
+
*
|
|
11
|
+
* Extracted from the worker so it is unit-testable without a real wasm bundle.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* True when `message` looks like a transient transport/download failure of the
|
|
15
|
+
* engine binary (worth one retry) rather than a genuine corrupt-module or
|
|
16
|
+
* validation error (which must propagate immediately so real bugs aren't
|
|
17
|
+
* masked).
|
|
18
|
+
*
|
|
19
|
+
* Per the WebAssembly Web API, the streaming loader validates the HTTP response
|
|
20
|
+
* (status, MIME, CORS) and rejects with a `TypeError` BEFORE compiling, so only
|
|
21
|
+
* those transport failures are retry-worthy. Invalid bytes (corrupt module,
|
|
22
|
+
* wrong magic header) reject with a `CompileError` — retrying just refetches
|
|
23
|
+
* the same bad bytes, so those fail fast.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isTransientWasmLoadError(message: string): boolean;
|
|
26
|
+
export interface InitWasmRetryOptions {
|
|
27
|
+
/** Delay before the single retry. Default 300ms; pass 0 in tests. */
|
|
28
|
+
retryDelayMs?: number;
|
|
29
|
+
/** Injected sleep (tests pass an instant resolver). */
|
|
30
|
+
sleep?: (ms: number) => Promise<void>;
|
|
31
|
+
/** Injected logger (defaults to `console.warn`). */
|
|
32
|
+
warn?: (message: string) => void;
|
|
33
|
+
/** Context label for the log line. */
|
|
34
|
+
label?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Run `init` once; on a transient-looking failure, wait and retry exactly once.
|
|
38
|
+
* Non-transient failures propagate without a retry. The second failure (if any)
|
|
39
|
+
* propagates to the caller.
|
|
40
|
+
*
|
|
41
|
+
* @param init Thunk that performs the actual `init(...)` call (so callers can
|
|
42
|
+
* bind their own wasm URL / arguments).
|
|
43
|
+
*/
|
|
44
|
+
export declare function initWasmWithRetry(init: () => Promise<unknown>, options?: InitWasmRetryOptions): Promise<void>;
|
|
45
|
+
//# sourceMappingURL=wasm-init-retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-init-retry.d.ts","sourceRoot":"","sources":["../src/wasm-init-retry.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOjE;AAED,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,oDAAoD;IACpD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC5B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAYf"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* Resilient one-shot retry around wasm-bindgen's `init()`.
|
|
6
|
+
*
|
|
7
|
+
* wasm-bindgen's streaming loader rethrows on a non-OK HTTP status or a failed
|
|
8
|
+
* fetch of `ifc-lite_bg.wasm` (it only falls back to `arrayBuffer`+`instantiate`
|
|
9
|
+
* for the wrong-MIME case), surfacing as `TypeError: Failed to execute
|
|
10
|
+
* 'compile' on 'WebAssembly': HTTP status code is not ok`. A transient blip — a
|
|
11
|
+
* cold CDN edge, a mid-deploy race, a flaky proxy/antivirus — can produce a
|
|
12
|
+
* one-off failure that a second attempt recovers.
|
|
13
|
+
*
|
|
14
|
+
* Extracted from the worker so it is unit-testable without a real wasm bundle.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* True when `message` looks like a transient transport/download failure of the
|
|
18
|
+
* engine binary (worth one retry) rather than a genuine corrupt-module or
|
|
19
|
+
* validation error (which must propagate immediately so real bugs aren't
|
|
20
|
+
* masked).
|
|
21
|
+
*
|
|
22
|
+
* Per the WebAssembly Web API, the streaming loader validates the HTTP response
|
|
23
|
+
* (status, MIME, CORS) and rejects with a `TypeError` BEFORE compiling, so only
|
|
24
|
+
* those transport failures are retry-worthy. Invalid bytes (corrupt module,
|
|
25
|
+
* wrong magic header) reject with a `CompileError` — retrying just refetches
|
|
26
|
+
* the same bad bytes, so those fail fast.
|
|
27
|
+
*/
|
|
28
|
+
export function isTransientWasmLoadError(message) {
|
|
29
|
+
// Fail fast on genuine module-validation errors even if a transport-ish word
|
|
30
|
+
// somehow appears in the message.
|
|
31
|
+
if (/compileerror|validation error|magic (?:word|number)|invalid (?:wasm|module)/i.test(message)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return /HTTP status code is not ok|failed to fetch|network ?error|load failed/i.test(message);
|
|
35
|
+
}
|
|
36
|
+
const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
37
|
+
/**
|
|
38
|
+
* Run `init` once; on a transient-looking failure, wait and retry exactly once.
|
|
39
|
+
* Non-transient failures propagate without a retry. The second failure (if any)
|
|
40
|
+
* propagates to the caller.
|
|
41
|
+
*
|
|
42
|
+
* @param init Thunk that performs the actual `init(...)` call (so callers can
|
|
43
|
+
* bind their own wasm URL / arguments).
|
|
44
|
+
*/
|
|
45
|
+
export async function initWasmWithRetry(init, options = {}) {
|
|
46
|
+
const { retryDelayMs = 300, sleep = defaultSleep, warn = console.warn, label = 'wasm' } = options;
|
|
47
|
+
try {
|
|
48
|
+
await init();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
53
|
+
if (!isTransientWasmLoadError(msg))
|
|
54
|
+
throw err;
|
|
55
|
+
warn(`[${label}] WASM engine load failed (${msg}); retrying once`);
|
|
56
|
+
await sleep(retryDelayMs);
|
|
57
|
+
await init();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=wasm-init-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-init-retry.js","sourceRoot":"","sources":["../src/wasm-init-retry.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,6EAA6E;IAC7E,kCAAkC;IAClC,IAAI,8EAA8E,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACjG,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,wEAAwE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChG,CAAC;AAaD,MAAM,YAAY,GAAG,CAAC,EAAU,EAAiB,EAAE,CACjD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAA4B,EAC5B,UAAgC,EAAE;IAElC,MAAM,EAAE,YAAY,GAAG,GAAG,EAAE,KAAK,GAAG,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IAClG,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QAC9C,IAAI,CAAC,IAAI,KAAK,8BAA8B,GAAG,kBAAkB,CAAC,CAAC;QACnE,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1B,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/parser",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.2",
|
|
4
4
|
"description": "IFC/STEP parser for IFC-Lite",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
}
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@ifc-lite/data": "^2.
|
|
20
|
+
"@ifc-lite/data": "^2.2.0",
|
|
21
21
|
"@ifc-lite/encoding": "^1.14.7",
|
|
22
22
|
"@ifc-lite/ifcx": "^2.1.5",
|
|
23
|
-
"@ifc-lite/wasm": "^2.
|
|
23
|
+
"@ifc-lite/wasm": "^2.11.1"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"typescript": "^6.0.3",
|