@ifc-lite/parser 2.2.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.
Files changed (52) hide show
  1. package/dist/columnar-parser-indexes.d.ts.map +1 -1
  2. package/dist/columnar-parser-indexes.js +7 -0
  3. package/dist/columnar-parser-indexes.js.map +1 -1
  4. package/dist/columnar-parser-relationships.d.ts.map +1 -1
  5. package/dist/columnar-parser-relationships.js +8 -1
  6. package/dist/columnar-parser-relationships.js.map +1 -1
  7. package/dist/columnar-parser.d.ts +13 -2
  8. package/dist/columnar-parser.d.ts.map +1 -1
  9. package/dist/columnar-parser.js +77 -7
  10. package/dist/columnar-parser.js.map +1 -1
  11. package/dist/compact-entity-index.d.ts.map +1 -1
  12. package/dist/compact-entity-index.js +11 -1
  13. package/dist/compact-entity-index.js.map +1 -1
  14. package/dist/data-store-transport.d.ts +127 -0
  15. package/dist/data-store-transport.d.ts.map +1 -0
  16. package/dist/data-store-transport.js +330 -0
  17. package/dist/data-store-transport.js.map +1 -0
  18. package/dist/entity-extractor.d.ts.map +1 -1
  19. package/dist/entity-extractor.js +2 -1
  20. package/dist/entity-extractor.js.map +1 -1
  21. package/dist/entity-refs-from-index.d.ts +18 -0
  22. package/dist/entity-refs-from-index.d.ts.map +1 -0
  23. package/dist/entity-refs-from-index.js +92 -0
  24. package/dist/entity-refs-from-index.js.map +1 -0
  25. package/dist/index.d.ts +19 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +61 -14
  28. package/dist/index.js.map +1 -1
  29. package/dist/material-resolver.d.ts +21 -1
  30. package/dist/material-resolver.d.ts.map +1 -1
  31. package/dist/material-resolver.js +16 -1
  32. package/dist/material-resolver.js.map +1 -1
  33. package/dist/on-demand-extractors.d.ts +7 -0
  34. package/dist/on-demand-extractors.d.ts.map +1 -1
  35. package/dist/on-demand-extractors.js +85 -8
  36. package/dist/on-demand-extractors.js.map +1 -1
  37. package/dist/parser.worker.d.ts +59 -1
  38. package/dist/parser.worker.d.ts.map +1 -1
  39. package/dist/parser.worker.js +204 -25
  40. package/dist/parser.worker.js.map +1 -1
  41. package/dist/scan-worker-inline.d.ts +1 -1
  42. package/dist/scan-worker-inline.d.ts.map +1 -1
  43. package/dist/scan-worker-inline.js.map +1 -1
  44. package/dist/tokenizer.d.ts +0 -4
  45. package/dist/tokenizer.d.ts.map +1 -1
  46. package/dist/tokenizer.js +2 -1
  47. package/dist/tokenizer.js.map +1 -1
  48. package/dist/worker-parser.d.ts +57 -13
  49. package/dist/worker-parser.d.ts.map +1 -1
  50. package/dist/worker-parser.js +166 -45
  51. package/dist/worker-parser.js.map +1 -1
  52. 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;AAEvD,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;IAgC/C,OAAO,CAAC,eAAe;IAiDvB,OAAO,CAAC,mBAAmB;CA0F5B"}
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"}
@@ -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 = new TextDecoder().decode(this.buffer.subarray(ref.byteOffset, ref.byteOffset + ref.byteLength));
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":"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"}
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