@ifc-lite/parser 5.0.0 → 5.2.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/dist/classification-resolver.d.ts +28 -2
- package/dist/classification-resolver.d.ts.map +1 -1
- package/dist/classification-resolver.js +49 -6
- package/dist/classification-resolver.js.map +1 -1
- package/dist/columnar-entity-preparation.d.ts +22 -0
- package/dist/columnar-entity-preparation.d.ts.map +1 -0
- package/dist/columnar-entity-preparation.js +192 -0
- package/dist/columnar-entity-preparation.js.map +1 -0
- package/dist/columnar-parser-root-attributes.d.ts +66 -0
- package/dist/columnar-parser-root-attributes.d.ts.map +1 -0
- package/dist/columnar-parser-root-attributes.js +245 -0
- package/dist/columnar-parser-root-attributes.js.map +1 -0
- package/dist/columnar-parser.d.ts +17 -63
- package/dist/columnar-parser.d.ts.map +1 -1
- package/dist/columnar-parser.js +371 -779
- package/dist/columnar-parser.js.map +1 -1
- package/dist/compact-entity-index-columns.d.ts +17 -0
- package/dist/compact-entity-index-columns.d.ts.map +1 -0
- package/dist/compact-entity-index-columns.js +15 -0
- package/dist/compact-entity-index-columns.js.map +1 -0
- package/dist/compact-entity-index-transport.d.ts +2 -12
- package/dist/compact-entity-index-transport.d.ts.map +1 -1
- package/dist/compact-entity-index-transport.js +1 -11
- package/dist/compact-entity-index-transport.js.map +1 -1
- package/dist/compact-entity-index.d.ts +7 -0
- package/dist/compact-entity-index.d.ts.map +1 -1
- package/dist/compact-entity-index.js +20 -32
- package/dist/compact-entity-index.js.map +1 -1
- package/dist/data-store-transport.d.ts +9 -16
- package/dist/data-store-transport.d.ts.map +1 -1
- package/dist/data-store-transport.js +14 -20
- package/dist/data-store-transport.js.map +1 -1
- package/dist/entity-refs-from-index.d.ts +10 -0
- package/dist/entity-refs-from-index.d.ts.map +1 -1
- package/dist/entity-refs-from-index.js +64 -49
- package/dist/entity-refs-from-index.js.map +1 -1
- package/dist/entity-scanner.d.ts +5 -0
- package/dist/entity-scanner.d.ts.map +1 -1
- package/dist/entity-scanner.js +20 -7
- package/dist/entity-scanner.js.map +1 -1
- package/dist/entity-type-byte-interner.d.ts +12 -0
- package/dist/entity-type-byte-interner.d.ts.map +1 -0
- package/dist/entity-type-byte-interner.js +66 -0
- package/dist/entity-type-byte-interner.js.map +1 -0
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/on-demand-extractors.d.ts +1 -1
- package/dist/on-demand-extractors.d.ts.map +1 -1
- package/dist/on-demand-georeferencing.d.ts +3 -3
- package/dist/on-demand-georeferencing.js +27 -4
- package/dist/on-demand-georeferencing.js.map +1 -1
- package/dist/parser.worker.d.ts +6 -3
- package/dist/parser.worker.d.ts.map +1 -1
- package/dist/parser.worker.js +36 -13
- package/dist/parser.worker.js.map +1 -1
- package/dist/prepass-source-fingerprint.d.ts +3 -0
- package/dist/prepass-source-fingerprint.d.ts.map +1 -0
- package/dist/prepass-source-fingerprint.js +13 -0
- package/dist/prepass-source-fingerprint.js.map +1 -0
- package/dist/select-entity-columns.d.ts +7 -0
- package/dist/select-entity-columns.d.ts.map +1 -0
- package/dist/select-entity-columns.js +43 -0
- package/dist/select-entity-columns.js.map +1 -0
- package/dist/spatial-hierarchy-builder.d.ts +6 -8
- package/dist/spatial-hierarchy-builder.d.ts.map +1 -1
- package/dist/spatial-hierarchy-builder.js +4 -0
- package/dist/spatial-hierarchy-builder.js.map +1 -1
- package/dist/spatial-hierarchy-canonical-parent.d.ts +36 -0
- package/dist/spatial-hierarchy-canonical-parent.d.ts.map +1 -0
- package/dist/spatial-hierarchy-canonical-parent.js +63 -0
- package/dist/spatial-hierarchy-canonical-parent.js.map +1 -0
- package/dist/worker-index-publication.d.ts +43 -0
- package/dist/worker-index-publication.d.ts.map +1 -0
- package/dist/worker-index-publication.js +129 -0
- package/dist/worker-index-publication.js.map +1 -0
- package/dist/worker-parser.d.ts +5 -2
- package/dist/worker-parser.d.ts.map +1 -1
- package/dist/worker-parser.js +30 -12
- package/dist/worker-parser.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
import { IfcTypeEnum, RelationshipType, isSpatialStructureType } from '@ifc-lite/data';
|
|
5
|
+
/**
|
|
6
|
+
* Resolve each spatial-structure entity's ONE canonical parent, globally,
|
|
7
|
+
* before any recursion starts - so the result cannot depend on traversal
|
|
8
|
+
* order. Mirrors apps/server's `canonical_parent` (`spatial.rs`, #3973):
|
|
9
|
+
*
|
|
10
|
+
* 1. IfcRelAggregates always wins over mere containment. A child aggregated
|
|
11
|
+
* by more than one parent (a malformed file) resolves to the parent
|
|
12
|
+
* whose `IfcRelAggregates` was declared FIRST in the file - STEP does
|
|
13
|
+
* not require express ids to ascend with declaration position, so a
|
|
14
|
+
* lowest-express-id tie-break can disagree with declaration order (a
|
|
15
|
+
* legally-valid file can declare a high-id relationship before a
|
|
16
|
+
* low-id one). `relationships.inverse.getEdges` returns edges in
|
|
17
|
+
* declaration order: `RelationshipGraphBuilder.addEdge` is called by
|
|
18
|
+
* the parser while it scans `IfcRel*` records in file/byte order (see
|
|
19
|
+
* `columnar-parser.ts`'s relationship loop), and `buildCSR`'s counting
|
|
20
|
+
* sort is stable per key (`relationship-graph.ts`) - it scatters edges
|
|
21
|
+
* for the same child in the order they were appended, never
|
|
22
|
+
* reordering by id. So `edges[0]` for a given child is the
|
|
23
|
+
* first-declared parent edge; no id comparison is needed or correct.
|
|
24
|
+
* 2. Only when a child has NO aggregates edge at all does a containment edge
|
|
25
|
+
* (IfcRelContainedInSpatialStructure targeting a spatial-structure type -
|
|
26
|
+
* the Revit Family/Dynamo `IfcSpace`/`IfcSpatialZone` pattern, #1075)
|
|
27
|
+
* get to claim it, with the same first-declared tie-break.
|
|
28
|
+
*
|
|
29
|
+
* `SpatialHierarchyBuilder.buildNode`'s `addSpatialChild` then only recurses
|
|
30
|
+
* into a child from its canonical parent - every other parent that also
|
|
31
|
+
* names the child drops the edge instead of adding an empty-stub duplicate
|
|
32
|
+
* (#4095).
|
|
33
|
+
*/
|
|
34
|
+
export function computeCanonicalParent(entities, relationships) {
|
|
35
|
+
const canonicalParent = new Map();
|
|
36
|
+
const claimFirstDeclaredParent = (predicate, relType) => {
|
|
37
|
+
for (const childId of relationships.inverse.offsets.keys()) {
|
|
38
|
+
if (canonicalParent.has(childId) || !predicate(childId))
|
|
39
|
+
continue;
|
|
40
|
+
const edges = relationships.inverse.getEdges(childId, relType);
|
|
41
|
+
if (edges.length === 0)
|
|
42
|
+
continue;
|
|
43
|
+
// `edges[0]` is the first-declared edge of this type for this child -
|
|
44
|
+
// see the doc comment above for why the CSR preserves declaration
|
|
45
|
+
// order here. This mirrors apps/server's `canonical_parent`
|
|
46
|
+
// (`spatial.rs`), which does `entry(...).or_insert(...)` while
|
|
47
|
+
// iterating relationships in file-scan order: first occurrence wins.
|
|
48
|
+
const winner = edges[0];
|
|
49
|
+
// Inverse edges flip source/target, so `target` here is the original
|
|
50
|
+
// relationship's `relating_id` (the parent).
|
|
51
|
+
canonicalParent.set(childId, winner.target);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
// Pass 1: aggregation, unconditionally - it always wins.
|
|
55
|
+
claimFirstDeclaredParent(() => true, RelationshipType.Aggregates);
|
|
56
|
+
// Pass 2: promotion-by-containment, only for children aggregation left unclaimed.
|
|
57
|
+
claimFirstDeclaredParent((childId) => {
|
|
58
|
+
const childType = entities.getTypeEnum(childId);
|
|
59
|
+
return isSpatialStructureType(childType) && childType !== IfcTypeEnum.IfcProject;
|
|
60
|
+
}, RelationshipType.ContainsElements);
|
|
61
|
+
return canonicalParent;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=spatial-hierarchy-canonical-parent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spatial-hierarchy-canonical-parent.js","sourceRoot":"","sources":["../src/spatial-hierarchy-canonical-parent.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAQ/D,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEvF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAqB,EAAE,aAAgC;IAC5F,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAElD,MAAM,wBAAwB,GAAG,CAC/B,SAAuC,EACvC,OAAyB,EACnB,EAAE;QACR,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3D,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAAE,SAAS;YAClE,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACjC,sEAAsE;YACtE,kEAAkE;YAClE,4DAA4D;YAC5D,+DAA+D;YAC/D,qEAAqE;YACrE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,qEAAqE;YACrE,6CAA6C;YAC7C,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC;IAEF,yDAAyD;IACzD,wBAAwB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAClE,kFAAkF;IAClF,wBAAwB,CACtB,CAAC,OAAO,EAAE,EAAE;QACV,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,sBAAsB,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,WAAW,CAAC,UAAU,CAAC;IACnF,CAAC,EACD,gBAAgB,CAAC,gBAAgB,CAClC,CAAC;IAEF,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { IfcDataStore } from './columnar-parser.js';
|
|
2
|
+
import { type CompactEntityIndexColumns } from './compact-entity-index-transport.js';
|
|
3
|
+
import { type DataStoreTransport } from './data-store-transport.js';
|
|
4
|
+
import type { IfcSourceBytes } from './source-bytes.js';
|
|
5
|
+
interface PackedIndex {
|
|
6
|
+
format: 'packed-index-v1';
|
|
7
|
+
byId: CompactEntityIndexColumns;
|
|
8
|
+
names: string[];
|
|
9
|
+
offsets: Uint32Array;
|
|
10
|
+
ids: Uint32Array | Float64Array;
|
|
11
|
+
}
|
|
12
|
+
interface IndexReference {
|
|
13
|
+
format: 'published-index-v1';
|
|
14
|
+
}
|
|
15
|
+
export type WorkerStorePayload = Omit<DataStoreTransport, 'entityIndex'> & {
|
|
16
|
+
entityIndex: DataStoreTransport['entityIndex'] | PackedIndex | IndexReference;
|
|
17
|
+
};
|
|
18
|
+
/** #3985: canonical parser primary columns/byType are immutable after the
|
|
19
|
+
* spatial callback. Deferred atoms get a separate final index. This publisher
|
|
20
|
+
* must not be used by a producer that edits published numeric columns in place.
|
|
21
|
+
* Public receiver arrays and LRU entries are never the retained wire seed.
|
|
22
|
+
*/
|
|
23
|
+
export declare class WorkerIndexPublisher {
|
|
24
|
+
private readonly enabled;
|
|
25
|
+
private published?;
|
|
26
|
+
constructor(enabled: boolean);
|
|
27
|
+
serialize(store: IfcDataStore, final: boolean): {
|
|
28
|
+
payload: WorkerStorePayload;
|
|
29
|
+
transfers: Transferable[];
|
|
30
|
+
transportBytes: number;
|
|
31
|
+
};
|
|
32
|
+
/** Call only after the partial postMessage succeeds. */
|
|
33
|
+
publishedPartial(store: IfcDataStore): void;
|
|
34
|
+
}
|
|
35
|
+
/** One instance per parse request, never a federation/global cache. */
|
|
36
|
+
export declare class WorkerIndexReceiver {
|
|
37
|
+
private seed?;
|
|
38
|
+
capturePartial(payload: WorkerStorePayload): void;
|
|
39
|
+
hydrate(payload: WorkerStorePayload, source: IfcSourceBytes): IfcDataStore;
|
|
40
|
+
clear(): void;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=worker-index-publication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-index-publication.d.ts","sourceRoot":"","sources":["../src/worker-index-publication.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAA+B,KAAK,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAClH,OAAO,EAAiD,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACnH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,UAAU,WAAW;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,yBAAyB,CAAC;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;IACrB,GAAG,EAAE,WAAW,GAAG,YAAY,CAAC;CACjC;AACD,UAAU,cAAc;IAAG,MAAM,EAAE,oBAAoB,CAAA;CAAE;AACzD,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,GAAG;IACzE,WAAW,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,WAAW,GAAG,cAAc,CAAC;CAC/E,CAAC;AA2BF;;;;GAIG;AACH,qBAAa,oBAAoB;IAOnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,SAAS,CAAC,CAIhB;gBAE2B,OAAO,EAAE,OAAO;IAE7C,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,kBAAkB,CAAC;QAAC,SAAS,EAAE,YAAY,EAAE,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE;IAwClI,wDAAwD;IACxD,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;CAQ5C;AAED,uEAAuE;AACvE,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAc;IAE3B,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAMjD,OAAO,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,GAAG,YAAY;IAsB1E,KAAK,IAAI,IAAI;CACd"}
|
|
@@ -0,0 +1,129 @@
|
|
|
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
|
+
import { CompactEntityIndex } from './compact-entity-index.js';
|
|
5
|
+
import { compactEntityIndexToColumns } from './compact-entity-index-transport.js';
|
|
6
|
+
import { fromTransport, toTransport, transportByteSize } from './data-store-transport.js';
|
|
7
|
+
function packIndex(store, byId) {
|
|
8
|
+
const entries = [...store.entityIndex.byType];
|
|
9
|
+
let count = 0;
|
|
10
|
+
let u32 = true;
|
|
11
|
+
for (const [, values] of entries) {
|
|
12
|
+
count += values.length;
|
|
13
|
+
for (const id of values) {
|
|
14
|
+
if (!Number.isInteger(id) || id < 0 || id > 0xffffffff || Object.is(id, -0))
|
|
15
|
+
u32 = false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (count > 0xffffffff)
|
|
19
|
+
throw new Error('Packed byType index exceeds u32 offset capacity');
|
|
20
|
+
// Arbitrary number[] producers retain their numbers, including NaN/-0 and
|
|
21
|
+
// IDs above u32. Canonical parser IDs use the compact representation.
|
|
22
|
+
const ids = u32 ? new Uint32Array(count) : new Float64Array(count);
|
|
23
|
+
const offsets = new Uint32Array(entries.length + 1);
|
|
24
|
+
let offset = 0;
|
|
25
|
+
for (let i = 0; i < entries.length; i++) {
|
|
26
|
+
offsets[i] = offset;
|
|
27
|
+
ids.set(entries[i][1], offset);
|
|
28
|
+
offset += entries[i][1].length;
|
|
29
|
+
}
|
|
30
|
+
offsets[entries.length] = offset;
|
|
31
|
+
return { format: 'packed-index-v1', byId, names: entries.map(([name]) => name), offsets, ids };
|
|
32
|
+
}
|
|
33
|
+
/** #3985: canonical parser primary columns/byType are immutable after the
|
|
34
|
+
* spatial callback. Deferred atoms get a separate final index. This publisher
|
|
35
|
+
* must not be used by a producer that edits published numeric columns in place.
|
|
36
|
+
* Public receiver arrays and LRU entries are never the retained wire seed.
|
|
37
|
+
*/
|
|
38
|
+
export class WorkerIndexPublisher {
|
|
39
|
+
enabled;
|
|
40
|
+
published;
|
|
41
|
+
constructor(enabled) {
|
|
42
|
+
this.enabled = enabled;
|
|
43
|
+
}
|
|
44
|
+
serialize(store, final) {
|
|
45
|
+
// TODO(remove-by: all supported parser-worker clients negotiate packed-index-v1, parser maintainers), #3985.
|
|
46
|
+
if (!this.enabled) {
|
|
47
|
+
const envelope = toTransport(store);
|
|
48
|
+
return { ...envelope, transfers: final ? envelope.transfers : [], transportBytes: transportByteSize(envelope.payload) };
|
|
49
|
+
}
|
|
50
|
+
if (!(store.entityIndex.byId instanceof CompactEntityIndex)) {
|
|
51
|
+
throw new Error('Worker publication requires CompactEntityIndex');
|
|
52
|
+
}
|
|
53
|
+
const byId = compactEntityIndexToColumns(store.entityIndex.byId);
|
|
54
|
+
const previous = this.published;
|
|
55
|
+
const entries = [...store.entityIndex.byType];
|
|
56
|
+
const reference = final && previous && previous.index === store.entityIndex
|
|
57
|
+
&& previous.columns.expressIds === byId.expressIds
|
|
58
|
+
&& previous.columns.byteOffsets === byId.byteOffsets
|
|
59
|
+
&& previous.columns.byteLengths === byId.byteLengths
|
|
60
|
+
&& previous.columns.typeIndices === byId.typeIndices
|
|
61
|
+
&& previous.columns.typeStrings.length === byId.typeStrings.length
|
|
62
|
+
&& previous.columns.typeStrings.every((name, i) => name === byId.typeStrings[i])
|
|
63
|
+
&& previous.entries.length === store.entityIndex.byType.size
|
|
64
|
+
&& previous.entries.every(([name, values, length], i) => entries[i][0] === name && entries[i][1] === values && values.length === length);
|
|
65
|
+
const envelope = toTransport(store, { byId, byType: [] });
|
|
66
|
+
const entityIndex = reference
|
|
67
|
+
? { format: 'published-index-v1' } : packIndex(store, byId);
|
|
68
|
+
const primaryBuffers = new Set([
|
|
69
|
+
byId.expressIds.buffer, byId.byteOffsets.buffer, byId.byteLengths.buffer, byId.typeIndices.buffer,
|
|
70
|
+
]);
|
|
71
|
+
// #3985: even a referenced index keeps its original ABs in this final
|
|
72
|
+
// transfer list. Unreachable transfers detach/dispose worker ownership at
|
|
73
|
+
// successful publication, without adding another main-thread index.
|
|
74
|
+
// This does not promise when the browser reclaims physical backing.
|
|
75
|
+
const transfers = final ? envelope.transfers : [];
|
|
76
|
+
if (entityIndex.format === 'packed-index-v1')
|
|
77
|
+
transfers.push(entityIndex.ids.buffer, entityIndex.offsets.buffer);
|
|
78
|
+
// Count reachable payload bytes, excluding detached disposal-only backing.
|
|
79
|
+
const transportBytes = transportByteSize(envelope.payload)
|
|
80
|
+
- (reference ? [...primaryBuffers].reduce((sum, buffer) => sum + (buffer instanceof ArrayBuffer ? buffer.byteLength : 0), 0) : 0)
|
|
81
|
+
+ (entityIndex.format === 'packed-index-v1' ? entityIndex.ids.byteLength + entityIndex.offsets.byteLength : 0);
|
|
82
|
+
return { payload: { ...envelope.payload, entityIndex }, transfers, transportBytes };
|
|
83
|
+
}
|
|
84
|
+
/** Call only after the partial postMessage succeeds. */
|
|
85
|
+
publishedPartial(store) {
|
|
86
|
+
if (!this.enabled || !(store.entityIndex.byId instanceof CompactEntityIndex))
|
|
87
|
+
return;
|
|
88
|
+
this.published = {
|
|
89
|
+
index: store.entityIndex,
|
|
90
|
+
columns: compactEntityIndexToColumns(store.entityIndex.byId),
|
|
91
|
+
entries: [...store.entityIndex.byType].map(([name, values]) => [name, values, values.length]),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** One instance per parse request, never a federation/global cache. */
|
|
96
|
+
export class WorkerIndexReceiver {
|
|
97
|
+
seed;
|
|
98
|
+
capturePartial(payload) {
|
|
99
|
+
if ('format' in payload.entityIndex && payload.entityIndex.format === 'packed-index-v1') {
|
|
100
|
+
this.seed = payload.entityIndex;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
hydrate(payload, source) {
|
|
104
|
+
const index = payload.entityIndex;
|
|
105
|
+
if (!('format' in index))
|
|
106
|
+
return fromTransport({ ...payload, entityIndex: index }, source);
|
|
107
|
+
const packed = index.format === 'published-index-v1' ? this.seed : index;
|
|
108
|
+
if (!packed)
|
|
109
|
+
throw new Error('Final parser index references a missing partial publication');
|
|
110
|
+
if (packed.offsets.length !== packed.names.length + 1 || packed.offsets[0] !== 0
|
|
111
|
+
|| packed.offsets[packed.names.length] !== packed.ids.length) {
|
|
112
|
+
throw new Error('Invalid packed parser index offsets');
|
|
113
|
+
}
|
|
114
|
+
const byType = new Map();
|
|
115
|
+
for (let i = 0; i < packed.names.length; i++) {
|
|
116
|
+
const start = packed.offsets[i], end = packed.offsets[i + 1];
|
|
117
|
+
if (end < start || end > packed.ids.length || byType.has(packed.names[i])) {
|
|
118
|
+
throw new Error('Invalid packed parser index range or duplicate type');
|
|
119
|
+
}
|
|
120
|
+
const values = new Array(end - start);
|
|
121
|
+
for (let row = start; row < end; row++)
|
|
122
|
+
values[row - start] = packed.ids[row];
|
|
123
|
+
byType.set(packed.names[i], values);
|
|
124
|
+
}
|
|
125
|
+
return fromTransport({ ...payload, entityIndex: { byId: packed.byId, byType: [] } }, source, byType);
|
|
126
|
+
}
|
|
127
|
+
clear() { this.seed = undefined; }
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=worker-index-publication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-index-publication.js","sourceRoot":"","sources":["../src/worker-index-publication.ts"],"names":[],"mappings":"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"}
|
package/dist/worker-parser.d.ts
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* 2. Caller constructs a `WorkerParser` and calls `parseColumnar(sab, …)`.
|
|
9
9
|
* 3. The worker emits `progress`, `diagnostic`, optional `partial-store`,
|
|
10
10
|
* then `complete` (or `error`). This wrapper resolves the returned
|
|
11
|
-
* Promise
|
|
11
|
+
* Promise after receiving `complete` and hydrating the result. The
|
|
12
|
+
* completed worker is terminated before receiver reconstruction.
|
|
12
13
|
*
|
|
13
14
|
* On `partial-store` the wrapper invokes `options.onSpatialReady` so the
|
|
14
15
|
* viewer can render the spatial-hierarchy panel before the full parse
|
|
@@ -16,8 +17,10 @@
|
|
|
16
17
|
*/
|
|
17
18
|
import type { IfcDataStore } from './columnar-parser.js';
|
|
18
19
|
import type { ParseOptions } from './index.js';
|
|
19
|
-
import {
|
|
20
|
+
import type { ParserMemorySnapshot } from './data-store-transport.js';
|
|
20
21
|
export interface WorkerParserOptions extends ParseOptions {
|
|
22
|
+
/** Fresh per-request 16-byte prepass fingerprint cell; never awaited. */
|
|
23
|
+
sourceFingerprint?: SharedArrayBuffer;
|
|
21
24
|
/** Override the worker URL. Default: bundler-resolved `parser.worker.ts`. */
|
|
22
25
|
workerUrl?: URL | string;
|
|
23
26
|
/** Optional callback receiving the per-parse memory snapshot at completion. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-parser.d.ts","sourceRoot":"","sources":["../src/worker-parser.ts"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"worker-parser.d.ts","sourceRoot":"","sources":["../src/worker-parser.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAQtE,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,6EAA6E;IAC7E,SAAS,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC;IACzB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC5D;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,CAMT;IAEhB;;;;;;;OAOG;IACH,MAAM,CAAC,WAAW,IAAI,OAAO;gBAOjB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,GAAG,GAAG,MAAM,CAAA;KAAO;IAQtD;;;;;;OAMG;IACH,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,YAAY,CAAC;IA0KlG;;;;;;;;;;;;;;;OAeG;IACH,cAAc,CACZ,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,WAAW,EACpB,gBAAgB,CAAC,EAAE,MAAM,EACzB,oBAAoB,CAAC,EAAE,MAAM,GAC5B,IAAI;IAmBP,gEAAgE;IAChE,SAAS,IAAI,IAAI;CAUlB"}
|
package/dist/worker-parser.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
-
import {
|
|
4
|
+
import { WorkerIndexReceiver } from './worker-index-publication.js';
|
|
5
5
|
import { contiguousSourceBytes } from './source-bytes.js';
|
|
6
6
|
import { restashWasmPanicLocation } from './wasm-panic-forward.js';
|
|
7
7
|
export class WorkerParser {
|
|
@@ -70,8 +70,16 @@ export class WorkerParser {
|
|
|
70
70
|
// on exactly the models #2183 is about. The previous code got one hash by
|
|
71
71
|
// memoising on the shared Uint8Array; sharing the accessor is the same
|
|
72
72
|
// guarantee without the side table.
|
|
73
|
-
|
|
73
|
+
let sourceBytes;
|
|
74
|
+
const indexReceiver = new WorkerIndexReceiver();
|
|
75
|
+
const hydrate = (payload) => {
|
|
76
|
+
// #3983: the worker hashes the source before the first UI publication.
|
|
77
|
+
// Retain one accessor across partial/full stores and compression swaps.
|
|
78
|
+
sourceBytes ??= contiguousSourceBytes(new Uint8Array(source), payload.sourceContentKey ?? undefined);
|
|
79
|
+
return indexReceiver.hydrate(payload, sourceBytes);
|
|
80
|
+
};
|
|
74
81
|
const settle = (cleanup) => {
|
|
82
|
+
indexReceiver.clear();
|
|
75
83
|
worker.onmessage = null;
|
|
76
84
|
worker.onerror = null;
|
|
77
85
|
worker.onmessageerror = null;
|
|
@@ -89,10 +97,11 @@ export class WorkerParser {
|
|
|
89
97
|
options.onDiagnostic?.(msg.message);
|
|
90
98
|
return;
|
|
91
99
|
case 'partial-store': {
|
|
92
|
-
if (!options.onSpatialReady)
|
|
93
|
-
return;
|
|
94
100
|
try {
|
|
95
|
-
|
|
101
|
+
indexReceiver.capturePartial(msg.payload);
|
|
102
|
+
if (!options.onSpatialReady)
|
|
103
|
+
return;
|
|
104
|
+
const partial = hydrate(msg.payload);
|
|
96
105
|
options.onSpatialReady(partial);
|
|
97
106
|
}
|
|
98
107
|
catch (err) {
|
|
@@ -104,18 +113,21 @@ export class WorkerParser {
|
|
|
104
113
|
}
|
|
105
114
|
case 'complete': {
|
|
106
115
|
try {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
116
|
+
// #3985: the received message owns its transferred columns. Stop
|
|
117
|
+
// the completed sender before allocating receiver collections;
|
|
118
|
+
// retain indexReceiver's partial seed until hydration completes.
|
|
119
|
+
worker.terminate();
|
|
120
|
+
if (this.worker === worker)
|
|
111
121
|
this.worker = null;
|
|
112
|
-
|
|
122
|
+
const dataStore = hydrate(msg.payload);
|
|
123
|
+
options.onMemorySnapshot?.(msg.memory);
|
|
124
|
+
settle(() => { });
|
|
113
125
|
resolve(dataStore);
|
|
114
126
|
}
|
|
115
127
|
catch (err) {
|
|
116
128
|
settle(() => {
|
|
117
|
-
worker
|
|
118
|
-
|
|
129
|
+
if (this.worker === worker)
|
|
130
|
+
this.worker = null;
|
|
119
131
|
});
|
|
120
132
|
reject(new Error(`complete hydrate failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
121
133
|
}
|
|
@@ -172,6 +184,8 @@ export class WorkerParser {
|
|
|
172
184
|
}
|
|
173
185
|
const input = {
|
|
174
186
|
type: 'parse',
|
|
187
|
+
sourceFingerprint: options.sourceFingerprint,
|
|
188
|
+
indexTransport: 'packed-index-v1',
|
|
175
189
|
id,
|
|
176
190
|
source,
|
|
177
191
|
yieldIntervalMs: options.yieldIntervalMs,
|
|
@@ -234,6 +248,10 @@ export class WorkerParser {
|
|
|
234
248
|
/** Terminate the worker if running. Safe to call repeatedly. */
|
|
235
249
|
terminate() {
|
|
236
250
|
if (this.worker) {
|
|
251
|
+
// Drop the per-request hydration closure, including its packed index seed.
|
|
252
|
+
this.worker.onmessage = null;
|
|
253
|
+
this.worker.onerror = null;
|
|
254
|
+
this.worker.onmessageerror = null;
|
|
237
255
|
this.worker.terminate();
|
|
238
256
|
this.worker = null;
|
|
239
257
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-parser.js","sourceRoot":"","sources":["../src/worker-parser.ts"],"names":[],"mappings":"AAAA;;+DAE+D;
|
|
1
|
+
{"version":3,"file":"worker-parser.js","sourceRoot":"","sources":["../src/worker-parser.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/parser",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.2.0",
|
|
4
4
|
"description": "IFC/STEP parser for IFC-Lite",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@ifc-lite/data": "^4.0.0",
|
|
23
23
|
"@ifc-lite/encoding": "^2.2.0",
|
|
24
24
|
"@ifc-lite/ifcx": "^4.0.0",
|
|
25
|
-
"@ifc-lite/wasm": "^6.
|
|
25
|
+
"@ifc-lite/wasm": "^6.4.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"typescript": "^6.0.3",
|