@ifc-lite/cache 3.0.6 → 3.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.
Files changed (40) hide show
  1. package/README.md +51 -23
  2. package/dist/adapt.d.ts +72 -0
  3. package/dist/adapt.d.ts.map +1 -0
  4. package/dist/adapt.js +68 -0
  5. package/dist/adapt.js.map +1 -0
  6. package/dist/glb-color.d.ts +15 -0
  7. package/dist/glb-color.d.ts.map +1 -0
  8. package/dist/glb-color.js +18 -0
  9. package/dist/glb-color.js.map +1 -0
  10. package/dist/glb.d.ts.map +1 -1
  11. package/dist/glb.js +3 -3
  12. package/dist/glb.js.map +1 -1
  13. package/dist/index.d.ts +18 -5
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +17 -5
  16. package/dist/index.js.map +1 -1
  17. package/dist/reader.js +2 -2
  18. package/dist/reader.js.map +1 -1
  19. package/dist/sections/entities.d.ts +11 -2
  20. package/dist/sections/entities.d.ts.map +1 -1
  21. package/dist/sections/entities.js +35 -107
  22. package/dist/sections/entities.js.map +1 -1
  23. package/dist/sections/geometry.d.ts.map +1 -1
  24. package/dist/sections/geometry.js +92 -0
  25. package/dist/sections/geometry.js.map +1 -1
  26. package/dist/sections/properties.d.ts.map +1 -1
  27. package/dist/sections/properties.js +23 -26
  28. package/dist/sections/properties.js.map +1 -1
  29. package/dist/sections/quantities.d.ts.map +1 -1
  30. package/dist/sections/quantities.js +26 -25
  31. package/dist/sections/quantities.js.map +1 -1
  32. package/dist/sections/relationships.d.ts +25 -2
  33. package/dist/sections/relationships.d.ts.map +1 -1
  34. package/dist/sections/relationships.js +150 -16
  35. package/dist/sections/relationships.js.map +1 -1
  36. package/dist/types.d.ts +67 -1
  37. package/dist/types.d.ts.map +1 -1
  38. package/dist/types.js +67 -1
  39. package/dist/types.js.map +1 -1
  40. package/package.json +5 -4
@@ -1,7 +1,8 @@
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 { IfcTypeEnum, IfcTypeEnumToString, IfcTypeEnumFromString, IFC_ENTITY_NAMES } from '@ifc-lite/data';
4
+ import { entityTableFromColumns } from '@ifc-lite/data';
5
+ import { FORMAT_VERSION } from '../types.js';
5
6
  /**
6
7
  * Write EntityTable to buffer
7
8
  * Format:
@@ -18,11 +19,16 @@ import { IfcTypeEnum, IfcTypeEnumToString, IfcTypeEnumFromString, IFC_ENTITY_NAM
18
19
  * - geometryIndex: Int32Array[count]
19
20
  * - typeRangeCount: uint16
20
21
  * - typeRanges: [type:uint16, start:uint32, end:uint32][]
22
+ * - rawTypeName: Uint32Array[count] (string indices; v15+ only)
21
23
  *
22
24
  * The typeRanges triples are vestigial on read: `readEntities` derives the
23
25
  * spans from the typeEnum column instead, because pre-#3101 caches stored
24
26
  * `start + count` here and the format version does not distinguish them.
25
27
  * They are still written so the section layout is unchanged.
28
+ *
29
+ * `rawTypeName` is appended AFTER the typeRanges triples rather than beside
30
+ * the other columns so the v14 prefix stays byte-identical; a v15 reader
31
+ * handed a v14 section simply stops where the old section ended.
26
32
  */
27
33
  export function writeEntities(writer, entities) {
28
34
  const count = entities.count;
@@ -47,11 +53,23 @@ export function writeEntities(writer, entities) {
47
53
  writer.writeUint32(range.start);
48
54
  writer.writeUint32(range.end);
49
55
  }
56
+ // Raw IFC class names (v15+). Most concrete IFC product classes have no
57
+ // `IfcTypeEnum` member, so without this column `getTypeName` can only
58
+ // answer 'Unknown' for them after a cache load, while the live parser
59
+ // table answers with the real class. A table built without the column
60
+ // (server hydration) writes zeroes, which read back as the empty string
61
+ // and degrade to the same enum-only answer as before.
62
+ const raw = entities.rawTypeName;
63
+ writer.writeTypedArray(raw && raw.length >= count ? raw.subarray(0, count) : new Uint32Array(count));
50
64
  }
51
65
  /**
52
- * Read EntityTable from buffer
66
+ * Read EntityTable from buffer.
67
+ *
68
+ * `version` is the cache header's FORMAT_VERSION. v15+ sections carry a
69
+ * trailing `rawTypeName` column; older ones stop after the typeRanges
70
+ * triples and must not be read past.
53
71
  */
54
- export function readEntities(reader, strings) {
72
+ export function readEntities(reader, strings, version = FORMAT_VERSION) {
55
73
  const count = reader.readUint32();
56
74
  // Read columnar arrays
57
75
  const expressId = reader.readUint32Array(count);
@@ -69,55 +87,24 @@ export function readEntities(reader, strings) {
69
87
  // caches written before #3101 hold `start + count`, later ones hold a
70
88
  // `[firstRow, lastRow + 1]` span, and FORMAT_VERSION was deliberately not
71
89
  // bumped (header.ts accepts any version <= FORMAT_VERSION by design), so
72
- // both vintages arrive here indistinguishable. The spans are derived from
73
- // the live typeEnum column below instead.
90
+ // both vintages arrive here indistinguishable. `entityTableFromColumns`
91
+ // derives the spans from the live typeEnum column instead, which is why
92
+ // `typeRanges` is deliberately left off the columns object below.
74
93
  const typeRangeCount = reader.readUint16();
75
94
  for (let i = 0; i < typeRangeCount; i++) {
76
95
  reader.readUint16(); // type
77
96
  reader.readUint32(); // start
78
97
  reader.readUint32(); // end (or count, for a pre-#3101 cache)
79
98
  }
80
- // Build EntityTable with methods
81
- const HAS_GEOMETRY = 0b00000001;
82
- // Build correct per-type index arrays. Every row of a type is listed, so
83
- // this survives IFC files that interleave types unlike the serialized
84
- // typeRanges, which cannot express more than one contiguous run per type.
85
- const typeIndices = new Map();
86
- for (let i = 0; i < count; i++) {
87
- const t = typeEnum[i];
88
- let arr = typeIndices.get(t);
89
- if (!arr) {
90
- arr = [];
91
- typeIndices.set(t, arr);
92
- }
93
- arr.push(i);
94
- }
95
- // Derive the spans from the same index arrays, so the one structure that
96
- // survives interleaving feeds both getByType() and the public typeRanges.
97
- const typeRanges = new Map();
98
- for (const [type, indices] of typeIndices) {
99
- typeRanges.set(type, { start: indices[0], end: indices[indices.length - 1] + 1 });
100
- }
101
- // PRE-BUILD INDEX MAP: O(n) once, then O(1) lookups
102
- // This eliminates O(n²) when getName/hasGeometry are called for every entity
103
- const idToIndex = new Map();
104
- for (let i = 0; i < count; i++) {
105
- idToIndex.set(expressId[i], i);
106
- }
107
- const indexOfId = (id) => {
108
- return idToIndex.get(id) ?? -1;
109
- };
110
- // Build GlobalId → expressId map for BCF integration
111
- const globalIdToExpressId = new Map();
112
- for (let i = 0; i < count; i++) {
113
- const gidString = strings.get(globalId[i]);
114
- if (gidString) {
115
- globalIdToExpressId.set(gidString, expressId[i]);
116
- }
117
- }
118
- // Additive display-class overrides (UI retype). See entity-table.ts.
119
- const typeOverrides = new Map();
120
- return {
99
+ // Raw IFC class names, v15+ only (see writeEntities). Left undefined for
100
+ // older sections, where the bytes are simply not there — reading them
101
+ // would consume whatever section follows.
102
+ const rawTypeName = version >= 15 ? reader.readUint32Array(count) : undefined;
103
+ // One shared implementation with the live parser table. Keeping a second
104
+ // copy here is what let the `rawTypeName` fallback go missing from cache
105
+ // loads while the parser had it: every entity of a class absent from
106
+ // `IfcTypeEnum` came back as 'Unknown'.
107
+ return entityTableFromColumns({
121
108
  count,
122
109
  expressId,
123
110
  typeEnum,
@@ -129,66 +116,7 @@ export function readEntities(reader, strings) {
129
116
  containedInStorey,
130
117
  definedByType,
131
118
  geometryIndex,
132
- typeRanges,
133
- getGlobalId: (id) => {
134
- const idx = indexOfId(id);
135
- return idx >= 0 ? strings.get(globalId[idx]) : '';
136
- },
137
- getName: (id) => {
138
- const idx = indexOfId(id);
139
- return idx >= 0 ? strings.get(name[idx]) : '';
140
- },
141
- getDescription: (id) => {
142
- const idx = indexOfId(id);
143
- return idx >= 0 ? strings.get(description[idx]) : '';
144
- },
145
- getObjectType: (id) => {
146
- const idx = indexOfId(id);
147
- return idx >= 0 ? strings.get(objectType[idx]) : '';
148
- },
149
- getTypeName: (id) => {
150
- const override = typeOverrides.get(id);
151
- if (override !== undefined)
152
- return override;
153
- const idx = indexOfId(id);
154
- return idx >= 0 ? IfcTypeEnumToString(typeEnum[idx]) : 'Unknown';
155
- },
156
- hasGeometry: (id) => {
157
- const idx = indexOfId(id);
158
- return idx >= 0 ? (flags[idx] & HAS_GEOMETRY) !== 0 : false;
159
- },
160
- getByType: (type) => {
161
- const indices = typeIndices.get(type);
162
- if (!indices)
163
- return [];
164
- const ids = new Array(indices.length);
165
- for (let i = 0; i < indices.length; i++) {
166
- ids[i] = expressId[indices[i]];
167
- }
168
- return ids;
169
- },
170
- getTypeEnum: (id) => {
171
- const override = typeOverrides.get(id);
172
- if (override !== undefined)
173
- return IfcTypeEnumFromString(override);
174
- const idx = indexOfId(id);
175
- return idx >= 0 ? typeEnum[idx] : IfcTypeEnum.Unknown;
176
- },
177
- setTypeOverride: (id, typeName) => {
178
- if (typeName === null)
179
- typeOverrides.delete(id);
180
- // Canonicalise on the way in, matching `entityTableFromColumns`
181
- // (packages/data/src/entity-table.ts). `getTypeName` echoes the
182
- // override back verbatim and consumers like
183
- // `isSpatialStructureTypeName` match the PascalCase form, so storing
184
- // the caller's raw UPPERCASE token makes a retyped entity invisible to
185
- // them. All three EntityTable implementations must agree here.
186
- else
187
- typeOverrides.set(id, IFC_ENTITY_NAMES[typeName.toUpperCase()] ?? typeName.toUpperCase());
188
- },
189
- getExpressIdByGlobalId: (gid) => {
190
- return globalIdToExpressId.get(gid) ?? -1;
191
- },
192
- };
119
+ rawTypeName,
120
+ }, strings);
193
121
  }
194
122
  //# sourceMappingURL=entities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/sections/entities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/sections/entities.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/sections/geometry.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG;IAClD,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CA6BA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAoC1E;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAU3D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CA0BpF;AAiBD,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,QAAQ,CAsDrG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,MAAU,GAAG,cAAc,CA2B5F"}
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/sections/geometry.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG;IAClD,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CA6BA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAsD1E;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAW3D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CA0BpF;AAgED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,QAAQ,CA2FrG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,MAAU,GAAG,cAAc,CA2B5F"}
@@ -52,6 +52,23 @@ export function writeMeshRecord(writer, mesh) {
52
52
  // view-mode filter sees every cache-restored mesh as class 0: instanced
53
53
  // type-library geometry reappears in Model mode and the switch disappears.
54
54
  writer.writeUint8(mesh.geometryClass ?? 0);
55
+ // Write the two DISJOINT source ids (v14+, #3199): the representation item
56
+ // this piece was tessellated from, or the material layer it slices. Written
57
+ // unconditionally as two u32 so the record stays fixed-shape.
58
+ //
59
+ // The absent sentinel is 0xFFFFFFFF, NOT 0, and the reason is worth keeping
60
+ // straight because it CHANGED during #3199. `layers.rs` decodes a layer with
61
+ // no material — an air gap — as `material_id = 0`, so 0 reached this writer
62
+ // and the first draft encoded "absent" as 0, which silently dropped exactly
63
+ // those layers: the valid-but-falsy trap.
64
+ //
65
+ // The producer now filters it instead (`with_style_metadata` maps a source id
66
+ // of 0 to `None`, because `#0` is not a STEP instance name), so nothing
67
+ // upstream emits 0 today. This layer does NOT rely on that: an encoding whose
68
+ // absence marker is a value the domain can produce is one upstream change
69
+ // away from being wrong again, and 0xFFFFFFFF costs nothing.
70
+ writer.writeUint32(mesh.geometryItemId ?? ABSENT_SOURCE_ID);
71
+ writer.writeUint32(mesh.materialId ?? ABSENT_SOURCE_ID);
55
72
  // Write per-element local-frame origin (v6+, 3×f64): world = origin +
56
73
  // position. [0,0,0] for absolute meshes. Without it a cache from a
57
74
  // local-frame load restores small local positions with no origin → every
@@ -71,6 +88,7 @@ export function meshRecordByteLength(mesh) {
71
88
  16 + // color f32x4
72
89
  4 + ifcTypeBytes + // ifcType string
73
90
  1 + // geometryClass
91
+ 8 + // geometryItemId + materialId u32x2 (v14+)
74
92
  24 + // origin f64x3
75
93
  mesh.positions.byteLength + mesh.normals.byteLength + mesh.indices.byteLength);
76
94
  }
@@ -105,9 +123,46 @@ function writeAABB(writer, aabb) {
105
123
  writeVec3(writer, aabb.min);
106
124
  writeVec3(writer, aabb.max);
107
125
  }
126
+ /** Absent marker for the v14 source ids. Not 0 — `layers.rs` uses 0 for a
127
+ * material-free layer, so 0 is a real value (#3199). No STEP express id can
128
+ * reach 0xFFFFFFFF. */
129
+ const ABSENT_SOURCE_ID = 0xffffffff;
108
130
  // Maximum reasonable values for sanity checking
109
131
  const MAX_VERTEX_COUNT = 100_000_000; // 100M vertices max per mesh
110
132
  const MAX_INDEX_COUNT = 300_000_000; // 300M indices max per mesh
133
+ /** IEEE-754 single-precision: a value is NaN or ±Infinity exactly when its
134
+ * 8 exponent bits are all set, regardless of sign or mantissa. */
135
+ const FLOAT32_EXPONENT_MASK = 0x7f800000;
136
+ /**
137
+ * Throw if any value in a decoded vertex-data array is non-finite (NaN or
138
+ * ±Infinity). A legitimately-produced mesh never contains one (the WASM
139
+ * geometry pipeline does not emit NaN/Infinity vertices), so a hit here means
140
+ * corrupted or adversarial cache bytes, not a valid-but-unusual model.
141
+ *
142
+ * Checked via the raw bit pattern (a `Uint32Array` VIEW over the same buffer,
143
+ * no copy) rather than `Number.isFinite(values[i])` or a chain of
144
+ * `v !== v || v === Infinity || v === -Infinity` float comparisons: this
145
+ * runs on every cache read's hot path (once per mesh, over every
146
+ * position/normal float). Measured on a real 5,927-mesh/473K-vertex fixture
147
+ * (dental_clinic.ifc, `pnpm --filter @ifc-lite/cache exec node` a throwaway
148
+ * write+read harness, 20 iterations after 4 warmup reads): the bitwise
149
+ * exponent test was the fastest of the three forms tried, but a full linear
150
+ * scan of every position/normal float still measured ~15-20% over an
151
+ * unguarded read's ~30ms baseline for this fixture (see the changeset for
152
+ * the exact before/after numbers). Kept despite the cost: it is the only
153
+ * guard in this package that closes a mis-parse (not just a bounds/shape)
154
+ * class of corruption, and the viewer's cache-restore path already falls
155
+ * back to a fresh parse on any reader throw (see `readMeshRecord`'s callers).
156
+ */
157
+ function assertFiniteVertexData(values, field, meshIndex, expressId) {
158
+ const bits = new Uint32Array(values.buffer, values.byteOffset, values.length);
159
+ for (let i = 0; i < bits.length; i++) {
160
+ if ((bits[i] & FLOAT32_EXPONENT_MASK) === FLOAT32_EXPONENT_MASK) {
161
+ throw new Error(`Invalid cache: mesh ${meshIndex} (expressId=${expressId}) has a non-finite value ` +
162
+ `(${values[i]}) in ${field}[${i}]. Cache may be corrupted.`);
163
+ }
164
+ }
165
+ }
111
166
  /** Read one per-mesh record (see writeMeshRecord for the layout). */
112
167
  export function readMeshRecord(reader, version, meshIndex = 0) {
113
168
  const expressId = reader.readUint32();
@@ -135,6 +190,23 @@ export function readMeshRecord(reader, version, meshIndex = 0) {
135
190
  // Older caches default to 0 (occurrence); v4 entries are bypassed by the
136
191
  // viewer's bumped cache key, so they re-mesh fresh rather than load here.
137
192
  const geometryClass = version >= 5 ? reader.readUint8() : 0;
193
+ // Read the two disjoint source ids (version 14+, #3199). See
194
+ // ABSENT_SOURCE_ID for what "absent" is encoded as, and why it is not 0.
195
+ // Older caches predate the fields entirely and leave both undefined, which is
196
+ // the same state the runtime uses where the identity is genuinely merged away
197
+ // -- so a v13 cache degrades to "unknown", never to a WRONG id.
198
+ let geometryItemId;
199
+ let materialId;
200
+ if (version >= 14) {
201
+ const gid = reader.readUint32();
202
+ const mid = reader.readUint32();
203
+ // Compared against the sentinel, never for truthiness: 0 is a real
204
+ // material-layer id (an air gap) and must survive the round trip.
205
+ if (gid !== ABSENT_SOURCE_ID)
206
+ geometryItemId = gid;
207
+ if (mid !== ABSENT_SOURCE_ID)
208
+ materialId = mid;
209
+ }
138
210
  // Read per-element local-frame origin (version 6+); world = origin + position.
139
211
  let origin;
140
212
  if (version >= 6) {
@@ -147,6 +219,22 @@ export function readMeshRecord(reader, version, meshIndex = 0) {
147
219
  const positions = reader.readFloat32Array(vertexCount * 3);
148
220
  const normals = reader.readFloat32Array(vertexCount * 3);
149
221
  const indices = reader.readUint32Array(indexCount);
222
+ // Reject a NaN/Infinity-bombed vertex region instead of letting it flow
223
+ // downstream unfiltered. Structural guards elsewhere in this package (the
224
+ // chunk directory's contiguity check, string-offset monotonicity, row-index
225
+ // bounds) all validate that declared SHAPES are self-consistent, but none of
226
+ // them constrain the numeric DOMAIN of a position/normal float once its
227
+ // slot is legitimately in range -- a byte-flip that lands inside the
228
+ // position array itself passes every existing check and decodes as a
229
+ // syntactically valid, semantically poisoned float. Left unchecked, that
230
+ // reaches `packages/spatial`'s BVH (a NaN aggregate bound silently hides
231
+ // valid SIBLING meshes under the same node until #3547's NaN-safe compare)
232
+ // and the renderer/picking path, neither of which re-validates cache input.
233
+ // Failing here, at the boundary where untrusted bytes become a MeshData,
234
+ // keeps that contract in one place instead of relying on every downstream
235
+ // consumer to defend itself.
236
+ assertFiniteVertexData(positions, 'positions', meshIndex, expressId);
237
+ assertFiniteVertexData(normals, 'normals', meshIndex, expressId);
150
238
  return {
151
239
  expressId,
152
240
  positions,
@@ -155,6 +243,10 @@ export function readMeshRecord(reader, version, meshIndex = 0) {
155
243
  color,
156
244
  ifcType,
157
245
  geometryClass,
246
+ // Spread only the one that is set, so the disjointness the format preserves
247
+ // survives into the object a consumer reads (#3199).
248
+ ...(geometryItemId !== undefined ? { geometryItemId } : {}),
249
+ ...(materialId !== undefined ? { materialId } : {}),
158
250
  ...(origin ? { origin } : {}),
159
251
  };
160
252
  }
@@ -1 +1 @@
1
- {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/sections/geometry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/sections/geometry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../src/sections/properties.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAA8B,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7F,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAStE,iFAAiF;AACjF,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAYD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,GAAG,IAAI,CAoBrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,aAAa,CAgJxF"}
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../src/sections/properties.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAiB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAStE,iFAAiF;AACjF,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAYD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,GAAG,IAAI,CAoBrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,aAAa,CAgIxF"}
@@ -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 { comparePropertyValues, PropertyValueType } from '@ifc-lite/data';
4
+ import { comparePropertyValues, groupPropertySetsByInstance, PropertyValueType } from '@ifc-lite/data';
5
5
  /**
6
6
  * List-value parse failures are per-property on a cache-rehydration path, so
7
7
  * the warning is latched: a corrupt cache would otherwise emit one line per
@@ -69,9 +69,9 @@ export function readProperties(reader, strings) {
69
69
  const valueInt = reader.readInt32Array(count);
70
70
  const valueBool = reader.readUint8Array(count);
71
71
  const unitId = reader.readInt32Array(count);
72
- const entityIndex = readIndex(reader);
73
- const psetIndex = readIndex(reader);
74
- const propIndex = readIndex(reader);
72
+ const entityIndex = readIndex(reader, count, 'entityIndex');
73
+ const psetIndex = readIndex(reader, count, 'psetIndex');
74
+ const propIndex = readIndex(reader, count, 'propIndex');
75
75
  const getPropertyValue = (idx) => {
76
76
  const type = propType[idx];
77
77
  switch (type) {
@@ -135,26 +135,7 @@ export function readProperties(reader, strings) {
135
135
  propIndex,
136
136
  getForEntity: (id) => {
137
137
  const rowIndices = entityIndex.get(id) || [];
138
- const psets = new Map();
139
- for (const idx of rowIndices) {
140
- const psetNameStr = strings.get(psetName[idx]);
141
- const psetGlobalIdStr = strings.get(psetGlobalId[idx]);
142
- if (!psets.has(psetNameStr)) {
143
- psets.set(psetNameStr, {
144
- name: psetNameStr,
145
- globalId: psetGlobalIdStr,
146
- properties: [],
147
- });
148
- }
149
- const pset = psets.get(psetNameStr);
150
- const propNameStr = strings.get(propName[idx]);
151
- pset.properties.push({
152
- name: propNameStr,
153
- type: propType[idx],
154
- value: getPropertyValue(idx),
155
- });
156
- }
157
- return Array.from(psets.values());
138
+ return groupPropertySetsByInstance(rowIndices, psetName, psetGlobalId, propName, propType, strings, (idx) => getPropertyValue(idx));
158
139
  },
159
140
  getPropertyValue: (id, pset, prop) => {
160
141
  const rowIndices = entityIndex.get(id) || [];
@@ -200,7 +181,18 @@ function writeIndex(writer, index) {
200
181
  }
201
182
  }
202
183
  }
203
- function readIndex(reader) {
184
+ /**
185
+ * Read a row-index table (entityIndex/psetIndex/propIndex): key -> row
186
+ * indices into the parallel column arrays. Each row index MUST be < rowCount
187
+ * — the column arrays (entityId, psetName, propType, valueString, ...) are
188
+ * fixed-size `Uint32Array`/`Float64Array`s, so an out-of-range read returns
189
+ * `undefined` instead of throwing (`arr[idx]` on a typed array never throws).
190
+ * A corrupt cache with an inflated row index would otherwise flow `undefined`
191
+ * names and types into `getForEntity` results silently instead of failing the
192
+ * cache load. Same defect shape, and same fix, as `entity-index.ts`'s
193
+ * `typeIndex` bounds check.
194
+ */
195
+ function readIndex(reader, rowCount, name) {
204
196
  const size = reader.readUint32();
205
197
  const index = new Map();
206
198
  for (let i = 0; i < size; i++) {
@@ -208,7 +200,12 @@ function readIndex(reader) {
208
200
  const valueCount = reader.readUint32();
209
201
  const values = [];
210
202
  for (let j = 0; j < valueCount; j++) {
211
- values.push(reader.readUint32());
203
+ const rowIndex = reader.readUint32();
204
+ if (rowIndex >= rowCount) {
205
+ throw new Error(`Corrupt cache PropertyTable ${name}: row index ${rowIndex} for key ${key} ` +
206
+ `exceeds row count ${rowCount}`);
207
+ }
208
+ values.push(rowIndex);
212
209
  }
213
210
  index.set(key, values);
214
211
  }
@@ -1 +1 @@
1
- {"version":3,"file":"properties.js","sourceRoot":"","sources":["../../src/sections/properties.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"properties.js","sourceRoot":"","sources":["../../src/sections/properties.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"quantities.d.ts","sourceRoot":"","sources":["../../src/sections/quantities.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAe,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,GAAG,IAAI,CAiBrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,aAAa,CAwHxF"}
1
+ {"version":3,"file":"quantities.d.ts","sourceRoot":"","sources":["../../src/sections/quantities.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,GAAG,IAAI,CAkBrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,aAAa,CA4GxF"}
@@ -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 { comparePropertyValues } from '@ifc-lite/data';
4
+ import { comparePropertyValues, groupQuantitySetsByInstance } from '@ifc-lite/data';
5
5
  /**
6
6
  * Write QuantityTable to buffer
7
7
  */
@@ -10,6 +10,7 @@ export function writeQuantities(writer, quantities) {
10
10
  writer.writeUint32(count);
11
11
  writer.writeTypedArray(quantities.entityId);
12
12
  writer.writeTypedArray(quantities.qsetName);
13
+ writer.writeTypedArray(quantities.qsetGlobalId);
13
14
  writer.writeTypedArray(quantities.quantityName);
14
15
  writer.writeTypedArray(quantities.quantityType);
15
16
  writer.writeTypedArray(quantities.value);
@@ -27,18 +28,20 @@ export function readQuantities(reader, strings) {
27
28
  const count = reader.readUint32();
28
29
  const entityId = reader.readUint32Array(count);
29
30
  const qsetName = reader.readUint32Array(count);
31
+ const qsetGlobalId = reader.readUint32Array(count);
30
32
  const quantityName = reader.readUint32Array(count);
31
33
  const quantityType = reader.readUint8Array(count);
32
34
  const value = reader.readFloat64Array(count);
33
35
  const unitId = reader.readInt32Array(count);
34
36
  const formula = reader.readUint32Array(count);
35
- const entityIndex = readIndex(reader);
36
- const qsetIndex = readIndex(reader);
37
- const quantityIndex = readIndex(reader);
37
+ const entityIndex = readIndex(reader, count, 'entityIndex');
38
+ const qsetIndex = readIndex(reader, count, 'qsetIndex');
39
+ const quantityIndex = readIndex(reader, count, 'quantityIndex');
38
40
  return {
39
41
  count,
40
42
  entityId,
41
43
  qsetName,
44
+ qsetGlobalId,
42
45
  quantityName,
43
46
  quantityType,
44
47
  value,
@@ -49,25 +52,7 @@ export function readQuantities(reader, strings) {
49
52
  quantityIndex,
50
53
  getForEntity: (id) => {
51
54
  const rowIndices = entityIndex.get(id) || [];
52
- const qsets = new Map();
53
- for (const idx of rowIndices) {
54
- const qsetNameStr = strings.get(qsetName[idx]);
55
- if (!qsets.has(qsetNameStr)) {
56
- qsets.set(qsetNameStr, {
57
- name: qsetNameStr,
58
- quantities: [],
59
- });
60
- }
61
- const qset = qsets.get(qsetNameStr);
62
- const quantNameStr = strings.get(quantityName[idx]);
63
- qset.quantities.push({
64
- name: quantNameStr,
65
- type: quantityType[idx],
66
- value: value[idx],
67
- formula: formula[idx] > 0 ? strings.get(formula[idx]) : undefined,
68
- });
69
- }
70
- return Array.from(qsets.values());
55
+ return groupQuantitySetsByInstance(rowIndices, qsetName, qsetGlobalId, quantityName, quantityType, value, formula, strings);
71
56
  },
72
57
  getQuantityValue: (id, qset, quant) => {
73
58
  const rowIndices = entityIndex.get(id) || [];
@@ -135,7 +120,18 @@ function writeIndex(writer, index) {
135
120
  }
136
121
  }
137
122
  }
138
- function readIndex(reader) {
123
+ /**
124
+ * Read a row-index table (entityIndex/qsetIndex/quantityIndex): key -> row
125
+ * indices into the parallel column arrays. Each row index MUST be < rowCount
126
+ * — the column arrays (entityId, qsetName, quantityType, value, ...) are
127
+ * fixed-size typed arrays, so an out-of-range read returns `undefined`
128
+ * instead of throwing. A corrupt cache with an inflated row index would
129
+ * otherwise flow `undefined` names and values into `getForEntity` results and
130
+ * `NaN` into `sumByType` silently instead of failing the cache load. Same
131
+ * defect shape, and same fix, as `entity-index.ts`'s `typeIndex` bounds
132
+ * check and `properties.ts`'s equivalent guard.
133
+ */
134
+ function readIndex(reader, rowCount, name) {
139
135
  const size = reader.readUint32();
140
136
  const index = new Map();
141
137
  for (let i = 0; i < size; i++) {
@@ -143,7 +139,12 @@ function readIndex(reader) {
143
139
  const valueCount = reader.readUint32();
144
140
  const values = [];
145
141
  for (let j = 0; j < valueCount; j++) {
146
- values.push(reader.readUint32());
142
+ const rowIndex = reader.readUint32();
143
+ if (rowIndex >= rowCount) {
144
+ throw new Error(`Corrupt cache QuantityTable ${name}: row index ${rowIndex} for key ${key} ` +
145
+ `exceeds row count ${rowCount}`);
146
+ }
147
+ values.push(rowIndex);
147
148
  }
148
149
  index.set(key, values);
149
150
  }