@ifc-lite/parser 2.3.0 → 2.4.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/columnar-parser-indexes.d.ts.map +1 -1
- package/dist/columnar-parser-indexes.js +7 -0
- package/dist/columnar-parser-indexes.js.map +1 -1
- package/dist/columnar-parser-relationships.d.ts.map +1 -1
- package/dist/columnar-parser-relationships.js +8 -1
- package/dist/columnar-parser-relationships.js.map +1 -1
- package/dist/columnar-parser.d.ts +13 -2
- package/dist/columnar-parser.d.ts.map +1 -1
- package/dist/columnar-parser.js +77 -7
- package/dist/columnar-parser.js.map +1 -1
- package/dist/compact-entity-index.d.ts.map +1 -1
- package/dist/compact-entity-index.js +11 -1
- package/dist/compact-entity-index.js.map +1 -1
- package/dist/data-store-transport.d.ts +127 -0
- package/dist/data-store-transport.d.ts.map +1 -0
- package/dist/data-store-transport.js +330 -0
- package/dist/data-store-transport.js.map +1 -0
- package/dist/entity-extractor.d.ts.map +1 -1
- package/dist/entity-extractor.js +2 -1
- package/dist/entity-extractor.js.map +1 -1
- package/dist/entity-refs-from-index.d.ts +18 -0
- package/dist/entity-refs-from-index.d.ts.map +1 -0
- package/dist/entity-refs-from-index.js +92 -0
- package/dist/entity-refs-from-index.js.map +1 -0
- package/dist/index.d.ts +18 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +61 -14
- package/dist/index.js.map +1 -1
- package/dist/material-resolver.d.ts +21 -1
- package/dist/material-resolver.d.ts.map +1 -1
- package/dist/material-resolver.js +16 -1
- package/dist/material-resolver.js.map +1 -1
- package/dist/on-demand-extractors.d.ts +7 -0
- package/dist/on-demand-extractors.d.ts.map +1 -1
- package/dist/on-demand-extractors.js +85 -8
- package/dist/on-demand-extractors.js.map +1 -1
- package/dist/parser.worker.d.ts +59 -1
- package/dist/parser.worker.d.ts.map +1 -1
- package/dist/parser.worker.js +204 -25
- package/dist/parser.worker.js.map +1 -1
- package/dist/scan-worker-inline.d.ts +1 -1
- package/dist/scan-worker-inline.d.ts.map +1 -1
- package/dist/scan-worker-inline.js.map +1 -1
- package/dist/tokenizer.d.ts +0 -4
- package/dist/tokenizer.d.ts.map +1 -1
- package/dist/tokenizer.js +2 -1
- package/dist/tokenizer.js.map +1 -1
- package/dist/worker-parser.d.ts +57 -13
- package/dist/worker-parser.d.ts.map +1 -1
- package/dist/worker-parser.js +166 -45
- package/dist/worker-parser.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker-boundary transport for `IfcDataStore`.
|
|
3
|
+
*
|
|
4
|
+
* `IfcDataStore` carries closures (`entities.getName`, `relationships.getRelated`,
|
|
5
|
+
* `spatialHierarchy.getPath`, …) that the structured-clone algorithm strips
|
|
6
|
+
* silently. This module separates the clone-safe column data from the
|
|
7
|
+
* closures: `toTransport` returns a POJO + transferable list to ship across
|
|
8
|
+
* a `postMessage` boundary; `fromTransport` reconstructs a live `IfcDataStore`
|
|
9
|
+
* with closures rebuilt on the receiving thread.
|
|
10
|
+
*
|
|
11
|
+
* The `source` buffer is intentionally NOT included in the transferable list
|
|
12
|
+
* because both the parser worker and the geometry workers read from the same
|
|
13
|
+
* `SharedArrayBuffer` upstream of the parser. Callers are responsible for
|
|
14
|
+
* keeping a `Uint8Array` view of that SAB on the main thread and supplying
|
|
15
|
+
* it to `fromTransport`.
|
|
16
|
+
*/
|
|
17
|
+
import { type EntityTable, type EntityTableColumns, type PropertyTable, type PropertyTableColumns, type QuantityTable, type QuantityTableColumns, type RelationshipGraph, type RelationshipGraphColumns, type SpatialHierarchy } from '@ifc-lite/data';
|
|
18
|
+
import type { EntityRef } from './types.js';
|
|
19
|
+
import type { IfcDataStore } from './columnar-parser.js';
|
|
20
|
+
/**
|
|
21
|
+
* Plain-data column representation of a `CompactEntityIndex`. Holds the
|
|
22
|
+
* five backing arrays plus the deduplicated type-string list. All four
|
|
23
|
+
* typed arrays are transferable.
|
|
24
|
+
*/
|
|
25
|
+
export interface CompactEntityIndexColumns {
|
|
26
|
+
expressIds: Uint32Array;
|
|
27
|
+
byteOffsets: Uint32Array;
|
|
28
|
+
byteLengths: Uint32Array;
|
|
29
|
+
typeIndices: Uint16Array;
|
|
30
|
+
typeStrings: string[];
|
|
31
|
+
}
|
|
32
|
+
interface SerializedSpatialNode {
|
|
33
|
+
expressId: number;
|
|
34
|
+
type: number;
|
|
35
|
+
name: string;
|
|
36
|
+
elevation?: number;
|
|
37
|
+
children: SerializedSpatialNode[];
|
|
38
|
+
elements: number[];
|
|
39
|
+
}
|
|
40
|
+
export interface SpatialHierarchyColumns {
|
|
41
|
+
project: SerializedSpatialNode;
|
|
42
|
+
byStorey: Array<[number, number[]]>;
|
|
43
|
+
byBuilding: Array<[number, number[]]>;
|
|
44
|
+
bySite: Array<[number, number[]]>;
|
|
45
|
+
bySpace: Array<[number, number[]]>;
|
|
46
|
+
storeyElevations: Array<[number, number]>;
|
|
47
|
+
storeyHeights: Array<[number, number]>;
|
|
48
|
+
elementToStorey: Array<[number, number]>;
|
|
49
|
+
}
|
|
50
|
+
export declare function spatialHierarchyToColumns(hierarchy: SpatialHierarchy): SpatialHierarchyColumns;
|
|
51
|
+
export declare function spatialHierarchyFromColumns(columns: SpatialHierarchyColumns): SpatialHierarchy;
|
|
52
|
+
export interface ParserMemorySnapshot {
|
|
53
|
+
/** `performance.memory.usedJSHeapSize` from inside the parser worker (Chromium). */
|
|
54
|
+
jsHeapBytes?: number;
|
|
55
|
+
/** Per-realm bytes from `performance.measureUserAgentSpecificMemory()` (cross-origin-isolated). */
|
|
56
|
+
uaMemoryBytes?: number;
|
|
57
|
+
/** Total byte length of all transferable typed arrays in the payload. */
|
|
58
|
+
transportBytes: number;
|
|
59
|
+
/** Source buffer byteLength (unchanged by parse, included for the receiver's overall accounting). */
|
|
60
|
+
sourceBytes: number;
|
|
61
|
+
/** Wall-clock parse duration in milliseconds. */
|
|
62
|
+
parseTimeMs: number;
|
|
63
|
+
}
|
|
64
|
+
export interface DataStoreTransport {
|
|
65
|
+
fileSize: number;
|
|
66
|
+
schemaVersion: IfcDataStore['schemaVersion'];
|
|
67
|
+
entityCount: number;
|
|
68
|
+
parseTime: number;
|
|
69
|
+
entityIndex: {
|
|
70
|
+
byId: CompactEntityIndexColumns;
|
|
71
|
+
byType: Array<[string, number[]]>;
|
|
72
|
+
};
|
|
73
|
+
deferredEntityIndex?: CompactEntityIndexColumns;
|
|
74
|
+
strings: string[];
|
|
75
|
+
entities: EntityTableColumns;
|
|
76
|
+
properties: PropertyTableColumns;
|
|
77
|
+
quantities: QuantityTableColumns;
|
|
78
|
+
relationships: RelationshipGraphColumns;
|
|
79
|
+
spatialHierarchy?: SpatialHierarchyColumns;
|
|
80
|
+
onDemandPropertyMap: Array<[number, number[]]>;
|
|
81
|
+
onDemandQuantityMap: Array<[number, number[]]>;
|
|
82
|
+
onDemandClassificationMap: Array<[number, number[]]>;
|
|
83
|
+
onDemandMaterialMap: Array<[number, number]>;
|
|
84
|
+
onDemandDocumentMap: Array<[number, number[]]>;
|
|
85
|
+
memory?: ParserMemorySnapshot;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Shape of the value `toTransport` returns: the cloneable payload plus the
|
|
89
|
+
* list of `Transferable` buffers that should be moved (rather than copied)
|
|
90
|
+
* via `postMessage(payload, transfers)`.
|
|
91
|
+
*/
|
|
92
|
+
export interface DataStoreTransportEnvelope {
|
|
93
|
+
payload: DataStoreTransport;
|
|
94
|
+
transfers: Transferable[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Pull every typed-array buffer out of a `DataStoreTransport` into a flat
|
|
98
|
+
* array suitable for the `postMessage` transfer list. Order is not
|
|
99
|
+
* meaningful — the structured-clone algorithm matches by buffer identity.
|
|
100
|
+
*
|
|
101
|
+
* Exported so the parser worker can append additional buffers (e.g. memory
|
|
102
|
+
* snapshot byte arrays) before posting.
|
|
103
|
+
*/
|
|
104
|
+
export declare function collectTransferables(payload: DataStoreTransport): Transferable[];
|
|
105
|
+
/**
|
|
106
|
+
* Convert a live `IfcDataStore` into a structured-clone-safe payload plus a
|
|
107
|
+
* list of buffers to move via `postMessage(payload, transfers)`.
|
|
108
|
+
*
|
|
109
|
+
* `source` is dropped from the payload because the parser worker and main
|
|
110
|
+
* thread both view the same upstream `SharedArrayBuffer`. Callers must
|
|
111
|
+
* reattach `source` on the receiving side when calling `fromTransport`.
|
|
112
|
+
*/
|
|
113
|
+
export declare function toTransport(store: IfcDataStore): DataStoreTransportEnvelope;
|
|
114
|
+
/**
|
|
115
|
+
* Reconstruct a live `IfcDataStore` (closures rebuilt) from a
|
|
116
|
+
* `DataStoreTransport` payload and the `source` buffer view that lives on
|
|
117
|
+
* the receiving thread.
|
|
118
|
+
*/
|
|
119
|
+
export declare function fromTransport(payload: DataStoreTransport, source: Uint8Array): IfcDataStore;
|
|
120
|
+
/**
|
|
121
|
+
* Convenience: compute the byte-size of the transferable payload so the
|
|
122
|
+
* receiver can record it in the memory accounting snapshot.
|
|
123
|
+
*/
|
|
124
|
+
export declare function transportByteSize(payload: DataStoreTransport): number;
|
|
125
|
+
export type { EntityTable, PropertyTable, QuantityTable, RelationshipGraph, SpatialHierarchy };
|
|
126
|
+
export type { EntityRef };
|
|
127
|
+
//# sourceMappingURL=data-store-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-store-transport.d.ts","sourceRoot":"","sources":["../src/data-store-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,330 @@
|
|
|
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
|
+
* Worker-boundary transport for `IfcDataStore`.
|
|
6
|
+
*
|
|
7
|
+
* `IfcDataStore` carries closures (`entities.getName`, `relationships.getRelated`,
|
|
8
|
+
* `spatialHierarchy.getPath`, …) that the structured-clone algorithm strips
|
|
9
|
+
* silently. This module separates the clone-safe column data from the
|
|
10
|
+
* closures: `toTransport` returns a POJO + transferable list to ship across
|
|
11
|
+
* a `postMessage` boundary; `fromTransport` reconstructs a live `IfcDataStore`
|
|
12
|
+
* with closures rebuilt on the receiving thread.
|
|
13
|
+
*
|
|
14
|
+
* The `source` buffer is intentionally NOT included in the transferable list
|
|
15
|
+
* because both the parser worker and the geometry workers read from the same
|
|
16
|
+
* `SharedArrayBuffer` upstream of the parser. Callers are responsible for
|
|
17
|
+
* keeping a `Uint8Array` view of that SAB on the main thread and supplying
|
|
18
|
+
* it to `fromTransport`.
|
|
19
|
+
*/
|
|
20
|
+
import { StringTable, entityTableFromColumns, entityTableToColumns, propertyTableFromColumns, propertyTableToColumns, quantityTableFromColumns, quantityTableToColumns, relationshipGraphFromColumns, relationshipGraphToColumns, } from '@ifc-lite/data';
|
|
21
|
+
import { CompactEntityIndex } from './compact-entity-index.js';
|
|
22
|
+
function compactEntityIndexToColumns(index) {
|
|
23
|
+
// CompactEntityIndex stores its arrays as private fields; access them
|
|
24
|
+
// through the prototype's documented columns. We rely on the public
|
|
25
|
+
// constructor's parameter order to define this contract.
|
|
26
|
+
const internal = index;
|
|
27
|
+
return {
|
|
28
|
+
expressIds: internal.expressIds,
|
|
29
|
+
byteOffsets: internal.byteOffsets,
|
|
30
|
+
byteLengths: internal.byteLengths,
|
|
31
|
+
typeIndices: internal.typeIndices,
|
|
32
|
+
typeStrings: internal.typeStrings.slice(),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function compactEntityIndexFromColumns(columns) {
|
|
36
|
+
return new CompactEntityIndex(columns.expressIds, columns.byteOffsets, columns.byteLengths, columns.typeIndices, columns.typeStrings);
|
|
37
|
+
}
|
|
38
|
+
function serializeSpatialNode(node) {
|
|
39
|
+
return {
|
|
40
|
+
expressId: node.expressId,
|
|
41
|
+
type: node.type,
|
|
42
|
+
name: node.name,
|
|
43
|
+
elevation: node.elevation,
|
|
44
|
+
children: node.children.map(serializeSpatialNode),
|
|
45
|
+
elements: [...node.elements],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function deserializeSpatialNode(node) {
|
|
49
|
+
return {
|
|
50
|
+
expressId: node.expressId,
|
|
51
|
+
type: node.type,
|
|
52
|
+
name: node.name,
|
|
53
|
+
elevation: node.elevation,
|
|
54
|
+
children: node.children.map(deserializeSpatialNode),
|
|
55
|
+
elements: [...node.elements],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function spatialHierarchyToColumns(hierarchy) {
|
|
59
|
+
return {
|
|
60
|
+
project: serializeSpatialNode(hierarchy.project),
|
|
61
|
+
byStorey: [...hierarchy.byStorey.entries()].map(([id, els]) => [id, [...els]]),
|
|
62
|
+
byBuilding: [...hierarchy.byBuilding.entries()].map(([id, els]) => [id, [...els]]),
|
|
63
|
+
bySite: [...hierarchy.bySite.entries()].map(([id, els]) => [id, [...els]]),
|
|
64
|
+
bySpace: [...hierarchy.bySpace.entries()].map(([id, els]) => [id, [...els]]),
|
|
65
|
+
storeyElevations: [...hierarchy.storeyElevations.entries()],
|
|
66
|
+
storeyHeights: [...hierarchy.storeyHeights.entries()],
|
|
67
|
+
elementToStorey: [...hierarchy.elementToStorey.entries()],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function spatialHierarchyFromColumns(columns) {
|
|
71
|
+
const project = deserializeSpatialNode(columns.project);
|
|
72
|
+
const byStorey = new Map(columns.byStorey.map(([id, els]) => [id, [...els]]));
|
|
73
|
+
const byBuilding = new Map(columns.byBuilding.map(([id, els]) => [id, [...els]]));
|
|
74
|
+
const bySite = new Map(columns.bySite.map(([id, els]) => [id, [...els]]));
|
|
75
|
+
const bySpace = new Map(columns.bySpace.map(([id, els]) => [id, [...els]]));
|
|
76
|
+
const storeyElevations = new Map(columns.storeyElevations);
|
|
77
|
+
const storeyHeights = new Map(columns.storeyHeights);
|
|
78
|
+
const elementToStorey = new Map(columns.elementToStorey);
|
|
79
|
+
// elementToSpace is the inverse of bySpace and is what `getContainingSpace`
|
|
80
|
+
// queries. Only this direction is shipped over the wire because it is
|
|
81
|
+
// O(unique-spaces) and trivially derivable from `bySpace`.
|
|
82
|
+
const elementToSpace = new Map();
|
|
83
|
+
for (const [spaceId, elementIds] of bySpace) {
|
|
84
|
+
for (const elementId of elementIds) {
|
|
85
|
+
elementToSpace.set(elementId, spaceId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
project,
|
|
90
|
+
byStorey,
|
|
91
|
+
byBuilding,
|
|
92
|
+
bySite,
|
|
93
|
+
bySpace,
|
|
94
|
+
storeyElevations,
|
|
95
|
+
storeyHeights,
|
|
96
|
+
elementToStorey,
|
|
97
|
+
getStoreyElements(storeyId) {
|
|
98
|
+
return byStorey.get(storeyId) ?? [];
|
|
99
|
+
},
|
|
100
|
+
getStoreyByElevation(z) {
|
|
101
|
+
let best = null;
|
|
102
|
+
let bestDistance = Number.POSITIVE_INFINITY;
|
|
103
|
+
for (const [storeyId, elevation] of storeyElevations) {
|
|
104
|
+
const distance = Math.abs(elevation - z);
|
|
105
|
+
if (distance < bestDistance) {
|
|
106
|
+
bestDistance = distance;
|
|
107
|
+
best = storeyId;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return best;
|
|
111
|
+
},
|
|
112
|
+
getContainingSpace(elementId) {
|
|
113
|
+
return elementToSpace.get(elementId) ?? null;
|
|
114
|
+
},
|
|
115
|
+
getPath(elementId) {
|
|
116
|
+
const path = [];
|
|
117
|
+
const walk = (node) => {
|
|
118
|
+
path.push(node);
|
|
119
|
+
if (node.elements.includes(elementId))
|
|
120
|
+
return true;
|
|
121
|
+
for (const child of node.children) {
|
|
122
|
+
if (walk(child))
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
path.pop();
|
|
126
|
+
return false;
|
|
127
|
+
};
|
|
128
|
+
walk(project);
|
|
129
|
+
return path;
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Pull every typed-array buffer out of a `DataStoreTransport` into a flat
|
|
135
|
+
* array suitable for the `postMessage` transfer list. Order is not
|
|
136
|
+
* meaningful — the structured-clone algorithm matches by buffer identity.
|
|
137
|
+
*
|
|
138
|
+
* Exported so the parser worker can append additional buffers (e.g. memory
|
|
139
|
+
* snapshot byte arrays) before posting.
|
|
140
|
+
*/
|
|
141
|
+
export function collectTransferables(payload) {
|
|
142
|
+
const list = [];
|
|
143
|
+
const push = (buf) => {
|
|
144
|
+
if (buf && buf instanceof ArrayBuffer)
|
|
145
|
+
list.push(buf);
|
|
146
|
+
};
|
|
147
|
+
push(payload.entityIndex.byId.expressIds.buffer);
|
|
148
|
+
push(payload.entityIndex.byId.byteOffsets.buffer);
|
|
149
|
+
push(payload.entityIndex.byId.byteLengths.buffer);
|
|
150
|
+
push(payload.entityIndex.byId.typeIndices.buffer);
|
|
151
|
+
if (payload.deferredEntityIndex) {
|
|
152
|
+
push(payload.deferredEntityIndex.expressIds.buffer);
|
|
153
|
+
push(payload.deferredEntityIndex.byteOffsets.buffer);
|
|
154
|
+
push(payload.deferredEntityIndex.byteLengths.buffer);
|
|
155
|
+
push(payload.deferredEntityIndex.typeIndices.buffer);
|
|
156
|
+
}
|
|
157
|
+
// EntityTableColumns
|
|
158
|
+
for (const arr of [
|
|
159
|
+
payload.entities.expressId,
|
|
160
|
+
payload.entities.typeEnum,
|
|
161
|
+
payload.entities.globalId,
|
|
162
|
+
payload.entities.name,
|
|
163
|
+
payload.entities.description,
|
|
164
|
+
payload.entities.objectType,
|
|
165
|
+
payload.entities.flags,
|
|
166
|
+
payload.entities.containedInStorey,
|
|
167
|
+
payload.entities.definedByType,
|
|
168
|
+
payload.entities.geometryIndex,
|
|
169
|
+
])
|
|
170
|
+
push(arr.buffer);
|
|
171
|
+
if (payload.entities.rawTypeName)
|
|
172
|
+
push(payload.entities.rawTypeName.buffer);
|
|
173
|
+
// PropertyTableColumns
|
|
174
|
+
for (const arr of [
|
|
175
|
+
payload.properties.entityId,
|
|
176
|
+
payload.properties.psetName,
|
|
177
|
+
payload.properties.psetGlobalId,
|
|
178
|
+
payload.properties.propName,
|
|
179
|
+
payload.properties.propType,
|
|
180
|
+
payload.properties.valueString,
|
|
181
|
+
payload.properties.valueReal,
|
|
182
|
+
payload.properties.valueInt,
|
|
183
|
+
payload.properties.valueBool,
|
|
184
|
+
payload.properties.unitId,
|
|
185
|
+
])
|
|
186
|
+
push(arr.buffer);
|
|
187
|
+
// QuantityTableColumns
|
|
188
|
+
for (const arr of [
|
|
189
|
+
payload.quantities.entityId,
|
|
190
|
+
payload.quantities.qsetName,
|
|
191
|
+
payload.quantities.quantityName,
|
|
192
|
+
payload.quantities.quantityType,
|
|
193
|
+
payload.quantities.value,
|
|
194
|
+
payload.quantities.unitId,
|
|
195
|
+
payload.quantities.formula,
|
|
196
|
+
])
|
|
197
|
+
push(arr.buffer);
|
|
198
|
+
// RelationshipGraphColumns
|
|
199
|
+
for (const half of [payload.relationships.forward, payload.relationships.inverse]) {
|
|
200
|
+
push(half.edgeTargets.buffer);
|
|
201
|
+
push(half.edgeTypes.buffer);
|
|
202
|
+
push(half.edgeRelIds.buffer);
|
|
203
|
+
}
|
|
204
|
+
// De-duplicate: a typed array sliced from another aliases the same
|
|
205
|
+
// buffer, and listing the same Transferable twice throws.
|
|
206
|
+
const seen = new Set();
|
|
207
|
+
const unique = [];
|
|
208
|
+
for (const t of list) {
|
|
209
|
+
if (!seen.has(t)) {
|
|
210
|
+
seen.add(t);
|
|
211
|
+
unique.push(t);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return unique;
|
|
215
|
+
}
|
|
216
|
+
function sumBytes(payload) {
|
|
217
|
+
let total = 0;
|
|
218
|
+
for (const transferable of collectTransferables(payload)) {
|
|
219
|
+
if (transferable instanceof ArrayBuffer)
|
|
220
|
+
total += transferable.byteLength;
|
|
221
|
+
}
|
|
222
|
+
return total;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Convert a live `IfcDataStore` into a structured-clone-safe payload plus a
|
|
226
|
+
* list of buffers to move via `postMessage(payload, transfers)`.
|
|
227
|
+
*
|
|
228
|
+
* `source` is dropped from the payload because the parser worker and main
|
|
229
|
+
* thread both view the same upstream `SharedArrayBuffer`. Callers must
|
|
230
|
+
* reattach `source` on the receiving side when calling `fromTransport`.
|
|
231
|
+
*/
|
|
232
|
+
export function toTransport(store) {
|
|
233
|
+
const byTypeEntries = [];
|
|
234
|
+
for (const [key, value] of store.entityIndex.byType) {
|
|
235
|
+
byTypeEntries.push([key, [...value]]);
|
|
236
|
+
}
|
|
237
|
+
const compactById = store.entityIndex.byId;
|
|
238
|
+
if (!(compactById instanceof CompactEntityIndex)) {
|
|
239
|
+
throw new Error('toTransport requires CompactEntityIndex (the lite parser path always provides one)');
|
|
240
|
+
}
|
|
241
|
+
const payload = {
|
|
242
|
+
fileSize: store.fileSize,
|
|
243
|
+
schemaVersion: store.schemaVersion,
|
|
244
|
+
entityCount: store.entityCount,
|
|
245
|
+
parseTime: store.parseTime,
|
|
246
|
+
entityIndex: {
|
|
247
|
+
byId: compactEntityIndexToColumns(compactById),
|
|
248
|
+
byType: byTypeEntries,
|
|
249
|
+
},
|
|
250
|
+
deferredEntityIndex: store.deferredEntityIndex instanceof CompactEntityIndex
|
|
251
|
+
? compactEntityIndexToColumns(store.deferredEntityIndex)
|
|
252
|
+
: undefined,
|
|
253
|
+
strings: store.strings.getAll(),
|
|
254
|
+
entities: entityTableToColumns(store.entities),
|
|
255
|
+
properties: propertyTableToColumns(store.properties),
|
|
256
|
+
quantities: quantityTableToColumns(store.quantities),
|
|
257
|
+
relationships: relationshipGraphToColumns(store.relationships),
|
|
258
|
+
spatialHierarchy: store.spatialHierarchy
|
|
259
|
+
? spatialHierarchyToColumns(store.spatialHierarchy)
|
|
260
|
+
: undefined,
|
|
261
|
+
onDemandPropertyMap: store.onDemandPropertyMap
|
|
262
|
+
? [...store.onDemandPropertyMap.entries()].map(([k, v]) => [k, [...v]])
|
|
263
|
+
: [],
|
|
264
|
+
onDemandQuantityMap: store.onDemandQuantityMap
|
|
265
|
+
? [...store.onDemandQuantityMap.entries()].map(([k, v]) => [k, [...v]])
|
|
266
|
+
: [],
|
|
267
|
+
onDemandClassificationMap: store.onDemandClassificationMap
|
|
268
|
+
? [...store.onDemandClassificationMap.entries()].map(([k, v]) => [k, [...v]])
|
|
269
|
+
: [],
|
|
270
|
+
onDemandMaterialMap: store.onDemandMaterialMap
|
|
271
|
+
? [...store.onDemandMaterialMap.entries()]
|
|
272
|
+
: [],
|
|
273
|
+
onDemandDocumentMap: store.onDemandDocumentMap
|
|
274
|
+
? [...store.onDemandDocumentMap.entries()].map(([k, v]) => [k, [...v]])
|
|
275
|
+
: [],
|
|
276
|
+
};
|
|
277
|
+
return { payload, transfers: collectTransferables(payload) };
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Reconstruct a live `IfcDataStore` (closures rebuilt) from a
|
|
281
|
+
* `DataStoreTransport` payload and the `source` buffer view that lives on
|
|
282
|
+
* the receiving thread.
|
|
283
|
+
*/
|
|
284
|
+
export function fromTransport(payload, source) {
|
|
285
|
+
const strings = StringTable.fromArray(payload.strings);
|
|
286
|
+
const entities = entityTableFromColumns(payload.entities, strings);
|
|
287
|
+
const properties = propertyTableFromColumns(payload.properties, strings);
|
|
288
|
+
const quantities = quantityTableFromColumns(payload.quantities, strings);
|
|
289
|
+
const relationships = relationshipGraphFromColumns(payload.relationships);
|
|
290
|
+
const byIdIndex = compactEntityIndexFromColumns(payload.entityIndex.byId);
|
|
291
|
+
const byType = new Map(payload.entityIndex.byType.map(([k, v]) => [k, [...v]]));
|
|
292
|
+
const deferredEntityIndex = payload.deferredEntityIndex
|
|
293
|
+
? compactEntityIndexFromColumns(payload.deferredEntityIndex)
|
|
294
|
+
: undefined;
|
|
295
|
+
const spatialHierarchy = payload.spatialHierarchy
|
|
296
|
+
? spatialHierarchyFromColumns(payload.spatialHierarchy)
|
|
297
|
+
: undefined;
|
|
298
|
+
const store = {
|
|
299
|
+
fileSize: payload.fileSize,
|
|
300
|
+
schemaVersion: payload.schemaVersion,
|
|
301
|
+
entityCount: payload.entityCount,
|
|
302
|
+
parseTime: payload.parseTime,
|
|
303
|
+
source,
|
|
304
|
+
entityIndex: {
|
|
305
|
+
byId: byIdIndex,
|
|
306
|
+
byType,
|
|
307
|
+
},
|
|
308
|
+
deferredEntityIndex: deferredEntityIndex,
|
|
309
|
+
strings,
|
|
310
|
+
entities,
|
|
311
|
+
properties,
|
|
312
|
+
quantities,
|
|
313
|
+
relationships,
|
|
314
|
+
spatialHierarchy,
|
|
315
|
+
onDemandPropertyMap: new Map(payload.onDemandPropertyMap.map(([k, v]) => [k, [...v]])),
|
|
316
|
+
onDemandQuantityMap: new Map(payload.onDemandQuantityMap.map(([k, v]) => [k, [...v]])),
|
|
317
|
+
onDemandClassificationMap: new Map(payload.onDemandClassificationMap.map(([k, v]) => [k, [...v]])),
|
|
318
|
+
onDemandMaterialMap: new Map(payload.onDemandMaterialMap),
|
|
319
|
+
onDemandDocumentMap: new Map(payload.onDemandDocumentMap.map(([k, v]) => [k, [...v]])),
|
|
320
|
+
};
|
|
321
|
+
return store;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Convenience: compute the byte-size of the transferable payload so the
|
|
325
|
+
* receiver can record it in the memory accounting snapshot.
|
|
326
|
+
*/
|
|
327
|
+
export function transportByteSize(payload) {
|
|
328
|
+
return sumBytes(payload);
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=data-store-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-store-transport.js","sourceRoot":"","sources":["../src/data-store-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-extractor.d.ts","sourceRoot":"","sources":["../src/entity-extractor.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"entity-extractor.d.ts","sourceRoot":"","sources":["../src/entity-extractor.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvD,YAAY,EAAE,SAAS,EAAE,CAAC;AAO1B,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAI9B;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI;IAkC/C,OAAO,CAAC,eAAe;IAiDvB,OAAO,CAAC,mBAAmB;CA0F5B"}
|
package/dist/entity-extractor.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { createLogger } from '@ifc-lite/data';
|
|
8
8
|
import { decodeIfcString } from '@ifc-lite/encoding';
|
|
9
|
+
import { safeUtf8Decode } from '@ifc-lite/data';
|
|
9
10
|
const log = createLogger('EntityExtractor');
|
|
10
11
|
/** Maximum recursion depth for parsing nested structures (prevents DoS via deeply nested data) */
|
|
11
12
|
const MAX_PARSE_DEPTH = 100;
|
|
@@ -19,7 +20,7 @@ export class EntityExtractor {
|
|
|
19
20
|
*/
|
|
20
21
|
extractEntity(ref) {
|
|
21
22
|
try {
|
|
22
|
-
const entityText =
|
|
23
|
+
const entityText = safeUtf8Decode(this.buffer, ref.byteOffset, ref.byteOffset + ref.byteLength);
|
|
23
24
|
// Parse: #ID = TYPE(attr1, attr2, ...)
|
|
24
25
|
const match = entityText.match(/^#(\d+)\s*=\s*(\w+)\((.*)\)/);
|
|
25
26
|
if (!match)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-extractor.js","sourceRoot":"","sources":["../src/entity-extractor.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"entity-extractor.js","sourceRoot":"","sources":["../src/entity-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthesize `EntityRef[]` from a pre-built entity index (ids/starts/lengths
|
|
3
|
+
* column arrays produced by the streaming geometry pre-pass) WITHOUT a
|
|
4
|
+
* second WASM scan of the source.
|
|
5
|
+
*
|
|
6
|
+
* The pre-pass already walked the file once and emitted these three column
|
|
7
|
+
* arrays; the parser worker reuses them so its own `scanEntitiesFastBytes`
|
|
8
|
+
* call — which on a 986 MB / 14 M-entity file takes ~10 s under WASM
|
|
9
|
+
* contention with the geometry workers — can be skipped entirely.
|
|
10
|
+
*
|
|
11
|
+
* Cost: ~1–2 s for 14 M entities. Almost all of it is the per-entity type
|
|
12
|
+
* extraction (find `=`, find `(`, intern). Type interning hits ~99.99 % on
|
|
13
|
+
* real IFC files (≈776 unique type names across 14 M entities) so we
|
|
14
|
+
* allocate one JS string per unique type.
|
|
15
|
+
*/
|
|
16
|
+
import type { EntityRef } from './types.js';
|
|
17
|
+
export declare function buildEntityRefsFromIndex(source: Uint8Array, ids: Uint32Array, starts: Uint32Array, lengths: Uint32Array): EntityRef[];
|
|
18
|
+
//# sourceMappingURL=entity-refs-from-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-refs-from-index.d.ts","sourceRoot":"","sources":["../src/entity-refs-from-index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAoB5C,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,WAAW,GACnB,SAAS,EAAE,CA+Eb"}
|
|
@@ -0,0 +1,92 @@
|
|
|
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
|
+
const EQ = 0x3d;
|
|
5
|
+
const LPAREN = 0x28;
|
|
6
|
+
const SPACE = 0x20;
|
|
7
|
+
const TAB = 0x09;
|
|
8
|
+
const LF = 0x0a;
|
|
9
|
+
const CR = 0x0d;
|
|
10
|
+
function bytesToAsciiKey(bytes, start, end) {
|
|
11
|
+
// String.fromCharCode loop is the fastest portable way to build a short
|
|
12
|
+
// ASCII string from a byte range without allocating an intermediate
|
|
13
|
+
// typed-array slice. Type names are ≤ ~30 chars so the loop is tight.
|
|
14
|
+
let s = '';
|
|
15
|
+
for (let i = start; i < end; i++) {
|
|
16
|
+
s += String.fromCharCode(bytes[i]);
|
|
17
|
+
}
|
|
18
|
+
return s;
|
|
19
|
+
}
|
|
20
|
+
export function buildEntityRefsFromIndex(source, ids, starts, lengths) {
|
|
21
|
+
const n = ids.length;
|
|
22
|
+
// Fail fast on malformed input from the transport layer rather than
|
|
23
|
+
// silently emitting refs with `type: ''` and truncated byte ranges.
|
|
24
|
+
// The pre-pass-emitted SAB triple should always have matching
|
|
25
|
+
// lengths; mismatch here means corruption upstream that the parser
|
|
26
|
+
// cannot recover from. Spans that point past `source.length` are
|
|
27
|
+
// also rejected — clamping them would yield a malformed index.
|
|
28
|
+
if (starts.length !== n || lengths.length !== n) {
|
|
29
|
+
throw new Error(`buildEntityRefsFromIndex: column-length mismatch (ids=${n}, starts=${starts.length}, lengths=${lengths.length}); pre-pass entity-index is corrupted`);
|
|
30
|
+
}
|
|
31
|
+
const sourceLen = source.length;
|
|
32
|
+
const refs = new Array(n);
|
|
33
|
+
const intern = new Map();
|
|
34
|
+
// The columns arrive in HashMap-iteration order from the Rust pre-pass
|
|
35
|
+
// (random). Downstream `buildCompactEntityIndexAsync` checks whether
|
|
36
|
+
// expressIds are ascending and pays an O(N log N) object sort if not
|
|
37
|
+
// — on 14 M entries that's ~8 s. Pre-sort an index permutation (typed
|
|
38
|
+
// array sort with comparator is ~1 s) so refs come out ID-ordered and
|
|
39
|
+
// the downstream check passes cheaply. Same end state, cost paid here
|
|
40
|
+
// once instead of as a slower object sort later.
|
|
41
|
+
const order = new Uint32Array(n);
|
|
42
|
+
for (let i = 0; i < n; i++)
|
|
43
|
+
order[i] = i;
|
|
44
|
+
order.sort((a, b) => ids[a] - ids[b]);
|
|
45
|
+
for (let oi = 0; oi < n; oi++) {
|
|
46
|
+
const i = order[oi];
|
|
47
|
+
const start = starts[i];
|
|
48
|
+
const len = lengths[i];
|
|
49
|
+
// Reject spans that walk off the end of the source. Clamping
|
|
50
|
+
// (the original behavior) would silently emit refs with
|
|
51
|
+
// truncated byte ranges and empty type names — better to fail
|
|
52
|
+
// loudly so the corrupted source/index is surfaced.
|
|
53
|
+
if (start > sourceLen || start + len > sourceLen) {
|
|
54
|
+
throw new Error(`buildEntityRefsFromIndex: out-of-bounds span at index ${i} (id=${ids[i]}, start=${start}, len=${len}, source=${sourceLen})`);
|
|
55
|
+
}
|
|
56
|
+
const limit = start + len;
|
|
57
|
+
// Skip past `#<digits>=` to find the type token.
|
|
58
|
+
let p = start;
|
|
59
|
+
while (p < limit && source[p] !== EQ)
|
|
60
|
+
p++;
|
|
61
|
+
p++;
|
|
62
|
+
while (p < limit && (source[p] === SPACE || source[p] === TAB))
|
|
63
|
+
p++;
|
|
64
|
+
const typeStart = p;
|
|
65
|
+
while (p < limit
|
|
66
|
+
&& source[p] !== LPAREN
|
|
67
|
+
&& source[p] !== SPACE
|
|
68
|
+
&& source[p] !== TAB
|
|
69
|
+
&& source[p] !== LF
|
|
70
|
+
&& source[p] !== CR)
|
|
71
|
+
p++;
|
|
72
|
+
const typeEnd = p;
|
|
73
|
+
const key = bytesToAsciiKey(source, typeStart, typeEnd);
|
|
74
|
+
let interned = intern.get(key);
|
|
75
|
+
if (interned === undefined) {
|
|
76
|
+
intern.set(key, key);
|
|
77
|
+
interned = key;
|
|
78
|
+
}
|
|
79
|
+
refs[oi] = {
|
|
80
|
+
expressId: ids[i],
|
|
81
|
+
type: interned,
|
|
82
|
+
byteOffset: start,
|
|
83
|
+
byteLength: len,
|
|
84
|
+
// Line numbers aren't computed here — the columnar parser only uses
|
|
85
|
+
// them in diagnostic output. Skipping the newline-counting pass saves
|
|
86
|
+
// ~500 ms on 14 M entities. Set to 0 as a sentinel "unknown".
|
|
87
|
+
lineNumber: 0,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return refs;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=entity-refs-from-index.js.map
|