@ifc-lite/cache 3.1.0 → 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.
@@ -130,6 +130,39 @@ const ABSENT_SOURCE_ID = 0xffffffff;
130
130
  // Maximum reasonable values for sanity checking
131
131
  const MAX_VERTEX_COUNT = 100_000_000; // 100M vertices max per mesh
132
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
+ }
133
166
  /** Read one per-mesh record (see writeMeshRecord for the layout). */
134
167
  export function readMeshRecord(reader, version, meshIndex = 0) {
135
168
  const expressId = reader.readUint32();
@@ -186,6 +219,22 @@ export function readMeshRecord(reader, version, meshIndex = 0) {
186
219
  const positions = reader.readFloat32Array(vertexCount * 3);
187
220
  const normals = reader.readFloat32Array(vertexCount * 3);
188
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);
189
238
  return {
190
239
  expressId,
191
240
  positions,
@@ -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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"quantities.js","sourceRoot":"","sources":["../../src/sections/quantities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quantities.js","sourceRoot":"","sources":["../../src/sections/quantities.ts"],"names":[],"mappings":"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"}
@@ -12,10 +12,33 @@ import { BufferWriter, BufferReader } from '../utils/buffer-utils.js';
12
12
  * - edgeTargets: Uint32Array[edgeCount]
13
13
  * - edgeTypes: Uint16Array[edgeCount]
14
14
  * - edgeRelIds: Uint32Array[edgeCount]
15
+ * - shadowedGroupCount: uint32 (v18+, #3782: edges collapsed from more
16
+ * than one IfcRel* instance — see RelationshipGraphBuilder.addEdge)
17
+ * - shadowedEdgeIndex: Uint32Array[shadowedGroupCount]
18
+ * - shadowedGroupOffsets: Uint32Array[shadowedGroupCount + 1]
19
+ * - shadowedIdCount: uint32
20
+ * - shadowedRelIds: Uint32Array[shadowedIdCount]
21
+ *
22
+ * A v17 reader stops after edgeRelIds — the trailing shadow section is new
23
+ * bytes it never asks for, and the section table's own size field bounds
24
+ * how far a stray future read could reach. A v18+ reader given a v17
25
+ * section (should one ever reach it — the cache LOOKUP key embeds
26
+ * FORMAT_VERSION, so normal load paths never do) must not attempt the
27
+ * shadow read at all; see the `version` parameter on `readRelationships`.
15
28
  */
16
29
  export declare function writeRelationships(writer: BufferWriter, graph: RelationshipGraph): void;
17
30
  /**
18
- * Read RelationshipGraph from buffer
31
+ * Read RelationshipGraph from buffer. `version` is the cache header's
32
+ * FORMAT_VERSION — v17 sections have no shadow-id trailer (see
33
+ * `writeEdges`'s doc comment); pass the header's actual version so a v17
34
+ * section isn't misread as a v18+ one.
35
+ *
36
+ * Required, not defaulted to `FORMAT_VERSION`: a forgotten argument would
37
+ * silently read every buffer as the CURRENT version, the unsafe direction —
38
+ * a real v17 blob would be misread as v18 and hit `validateShadowedColumns`
39
+ * on bytes that were never written as a trailer at all (#3782 round 3
40
+ * review). `reader.ts`'s only call site already threads `header.version`
41
+ * through.
19
42
  */
20
- export declare function readRelationships(reader: BufferReader): RelationshipGraph;
43
+ export declare function readRelationships(reader: BufferReader, version: number): RelationshipGraph;
21
44
  //# sourceMappingURL=relationships.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../../src/sections/relationships.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAA0B,MAAM,gBAAgB,CAAC;AAEhF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAMvF;AAgCD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,iBAAiB,CA+BzE"}
1
+ {"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../../src/sections/relationships.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAA0B,MAAM,gBAAgB,CAAC;AAEhF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAMvF;AA+CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAqC1F"}
@@ -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 { RelationshipType } from '@ifc-lite/data';
4
+ import { RelationshipType, binarySearchU32 } from '@ifc-lite/data';
5
5
  /**
6
6
  * Write RelationshipGraph to buffer
7
7
  * Format (for each direction - forward and inverse):
@@ -11,6 +11,19 @@ import { RelationshipType } from '@ifc-lite/data';
11
11
  * - edgeTargets: Uint32Array[edgeCount]
12
12
  * - edgeTypes: Uint16Array[edgeCount]
13
13
  * - edgeRelIds: Uint32Array[edgeCount]
14
+ * - shadowedGroupCount: uint32 (v18+, #3782: edges collapsed from more
15
+ * than one IfcRel* instance — see RelationshipGraphBuilder.addEdge)
16
+ * - shadowedEdgeIndex: Uint32Array[shadowedGroupCount]
17
+ * - shadowedGroupOffsets: Uint32Array[shadowedGroupCount + 1]
18
+ * - shadowedIdCount: uint32
19
+ * - shadowedRelIds: Uint32Array[shadowedIdCount]
20
+ *
21
+ * A v17 reader stops after edgeRelIds — the trailing shadow section is new
22
+ * bytes it never asks for, and the section table's own size field bounds
23
+ * how far a stray future read could reach. A v18+ reader given a v17
24
+ * section (should one ever reach it — the cache LOOKUP key embeds
25
+ * FORMAT_VERSION, so normal load paths never do) must not attempt the
26
+ * shadow read at all; see the `version` parameter on `readRelationships`.
14
27
  */
15
28
  export function writeRelationships(writer, graph) {
16
29
  // Write forward edges
@@ -34,13 +47,34 @@ function writeEdges(writer, edges) {
34
47
  writer.writeTypedArray(edges.edgeTargets);
35
48
  writer.writeTypedArray(edges.edgeTypes);
36
49
  writer.writeTypedArray(edges.edgeRelIds);
50
+ // Shadowed rel ids: sparse (absent whenever no edge in this half collapsed
51
+ // more than one IfcRel* instance), so this costs 4 bytes on the
52
+ // overwhelming majority of graphs.
53
+ const shadowedEdgeIndex = edges.shadowedEdgeIndex ?? new Uint32Array(0);
54
+ const shadowedGroupOffsets = edges.shadowedGroupOffsets ?? new Uint32Array([0]);
55
+ const shadowedRelIds = edges.shadowedRelIds ?? new Uint32Array(0);
56
+ writer.writeUint32(shadowedEdgeIndex.length);
57
+ writer.writeTypedArray(shadowedEdgeIndex);
58
+ writer.writeTypedArray(shadowedGroupOffsets);
59
+ writer.writeUint32(shadowedRelIds.length);
60
+ writer.writeTypedArray(shadowedRelIds);
37
61
  }
38
62
  /**
39
- * Read RelationshipGraph from buffer
63
+ * Read RelationshipGraph from buffer. `version` is the cache header's
64
+ * FORMAT_VERSION — v17 sections have no shadow-id trailer (see
65
+ * `writeEdges`'s doc comment); pass the header's actual version so a v17
66
+ * section isn't misread as a v18+ one.
67
+ *
68
+ * Required, not defaulted to `FORMAT_VERSION`: a forgotten argument would
69
+ * silently read every buffer as the CURRENT version, the unsafe direction —
70
+ * a real v17 blob would be misread as v18 and hit `validateShadowedColumns`
71
+ * on bytes that were never written as a trailer at all (#3782 round 3
72
+ * review). `reader.ts`'s only call site already threads `header.version`
73
+ * through.
40
74
  */
41
- export function readRelationships(reader) {
42
- const forward = readEdges(reader);
43
- const inverse = readEdges(reader);
75
+ export function readRelationships(reader, version) {
76
+ const forward = readEdges(reader, version);
77
+ const inverse = readEdges(reader, version);
44
78
  return {
45
79
  forward,
46
80
  inverse,
@@ -58,15 +92,71 @@ export function readRelationships(reader) {
58
92
  const edges = forward.getEdges(sourceId);
59
93
  return edges
60
94
  .filter((e) => e.target === targetId)
61
- .map((e) => ({
62
- relationshipId: e.relationshipId,
63
- type: e.type,
64
- typeName: relationshipTypeToString(e.type),
65
- }));
95
+ .map((e) => {
96
+ const info = {
97
+ relationshipId: e.relationshipId,
98
+ type: e.type,
99
+ typeName: relationshipTypeToString(e.type),
100
+ };
101
+ if (e.shadowedRelationshipIds !== undefined) {
102
+ info.shadowedRelationshipIds = e.shadowedRelationshipIds;
103
+ }
104
+ return info;
105
+ });
66
106
  },
67
107
  };
68
108
  }
69
- function readEdges(reader) {
109
+ /**
110
+ * Fail fast on a corrupt shadowed-rel-ids trailer (v18+, #3782), the same
111
+ * way the (offset, count) guard above does for the base edge arrays:
112
+ * `readUint32Array` only bounds-checks against the buffer's remaining
113
+ * bytes, it says nothing about whether the VALUES it read are internally
114
+ * consistent. Without this, `getEdges`'s `binarySearchU32` +
115
+ * `shadowedRelIds.subarray(...)` silently attaches the wrong ids to the
116
+ * wrong edge, clamps or overruns the slice, or (an out-of-range
117
+ * `shadowedEdgeIndex` entry) drops a group's shadowed ids entirely — every
118
+ * one of those is wrong data returned without an error, not a crash.
119
+ *
120
+ * Checks, in the order a corrupt encoder is most likely to break them:
121
+ * - `shadowedGroupOffsets.length === shadowedEdgeIndex.length + 1`
122
+ * - `shadowedGroupOffsets[0] === 0`
123
+ * - `shadowedGroupOffsets` strictly increasing (equal neighbours would be
124
+ * an empty group, which `buildShadowedColumns` never emits — see its
125
+ * "present implies non-empty" invariant)
126
+ * - `shadowedGroupOffsets[last] === shadowedRelIds.length`
127
+ * - `shadowedEdgeIndex` strictly ascending and every entry `< edgeCount`
128
+ */
129
+ function validateShadowedColumns(shadowedEdgeIndex, shadowedGroupOffsets, shadowedRelIds, edgeCount) {
130
+ const groupCount = shadowedEdgeIndex.length;
131
+ if (shadowedGroupOffsets.length !== groupCount + 1) {
132
+ throw new Error(`Corrupt cache RelationshipGraph: shadowedGroupOffsets has ${shadowedGroupOffsets.length} ` +
133
+ `entries, expected ${groupCount + 1} for ${groupCount} shadowed group(s)`);
134
+ }
135
+ if (shadowedGroupOffsets[0] !== 0) {
136
+ throw new Error(`Corrupt cache RelationshipGraph: shadowedGroupOffsets[0] must be 0, got ${shadowedGroupOffsets[0]}`);
137
+ }
138
+ if (shadowedGroupOffsets[groupCount] !== shadowedRelIds.length) {
139
+ throw new Error(`Corrupt cache RelationshipGraph: shadowedGroupOffsets[${groupCount}] ` +
140
+ `(${shadowedGroupOffsets[groupCount]}) does not match shadowedRelIds length ${shadowedRelIds.length}`);
141
+ }
142
+ let prevEdgeIndex = -1;
143
+ for (let g = 0; g < groupCount; g++) {
144
+ const edgeIndex = shadowedEdgeIndex[g];
145
+ if (edgeIndex <= prevEdgeIndex) {
146
+ throw new Error(`Corrupt cache RelationshipGraph: shadowedEdgeIndex is not strictly ascending ` +
147
+ `at group ${g} (${edgeIndex} <= ${prevEdgeIndex})`);
148
+ }
149
+ if (edgeIndex >= edgeCount) {
150
+ throw new Error(`Corrupt cache RelationshipGraph: shadowedEdgeIndex[${g}] = ${edgeIndex} is out of range for edgeCount ${edgeCount}`);
151
+ }
152
+ prevEdgeIndex = edgeIndex;
153
+ if (shadowedGroupOffsets[g + 1] <= shadowedGroupOffsets[g]) {
154
+ throw new Error(`Corrupt cache RelationshipGraph: shadowed group ${g} is empty ` +
155
+ `[${shadowedGroupOffsets[g]}, ${shadowedGroupOffsets[g + 1]})`);
156
+ }
157
+ }
158
+ }
159
+ function readEdges(reader, version) {
70
160
  const nodeCount = reader.readUint32();
71
161
  const offsets = new Map();
72
162
  const counts = new Map();
@@ -81,28 +171,67 @@ function readEdges(reader) {
81
171
  const edgeTargets = reader.readUint32Array(edgeCount);
82
172
  const edgeTypes = reader.readUint16Array(edgeCount);
83
173
  const edgeRelIds = reader.readUint32Array(edgeCount);
84
- return {
174
+ // Fail fast on a corrupt cache: each node's (offset, count) pair is an
175
+ // independent field from `edgeCount` — `BufferReader`'s own bounds checks
176
+ // (see its `ensureAvailable` doc comment) only guarantee the edge arrays
177
+ // themselves are `edgeCount` long, they say nothing about whether a given
178
+ // node's range stays inside that. Without this check, `getEdges` below
179
+ // reads `edgeTargets[i]` for `i` past the array's end — a plain JS typed-
180
+ // array index-out-of-bounds, which silently yields `undefined` rather than
181
+ // throwing — and returns edges with an `undefined` target/type/
182
+ // relationshipId mixed in with the real ones instead of failing loudly.
183
+ // Mirrors the same-shaped guards already in `strings.ts` (offset
184
+ // monotonicity) and `entity-index.ts` (typeIndex range).
185
+ for (const [entityId, offset] of offsets) {
186
+ const count = counts.get(entityId) ?? 0;
187
+ if (offset + count > edgeCount) {
188
+ throw new Error(`Corrupt cache RelationshipGraph: entity ${entityId}'s edge range ` +
189
+ `[${offset}, ${offset + count}) exceeds edge array length ${edgeCount}`);
190
+ }
191
+ }
192
+ let shadowedEdgeIndex;
193
+ let shadowedGroupOffsets;
194
+ let shadowedRelIds;
195
+ if (version >= 18) {
196
+ const shadowedGroupCount = reader.readUint32();
197
+ shadowedEdgeIndex = reader.readUint32Array(shadowedGroupCount);
198
+ shadowedGroupOffsets = reader.readUint32Array(shadowedGroupCount + 1);
199
+ const shadowedIdCount = reader.readUint32();
200
+ shadowedRelIds = reader.readUint32Array(shadowedIdCount);
201
+ validateShadowedColumns(shadowedEdgeIndex, shadowedGroupOffsets, shadowedRelIds, edgeCount);
202
+ }
203
+ const edges = {
85
204
  offsets,
86
205
  counts,
87
206
  edgeTargets,
88
207
  edgeTypes,
89
208
  edgeRelIds,
209
+ shadowedEdgeIndex,
210
+ shadowedGroupOffsets,
211
+ shadowedRelIds,
90
212
  getEdges(entityId, type) {
91
213
  const offset = offsets.get(entityId);
92
214
  if (offset === undefined)
93
215
  return [];
94
216
  const count = counts.get(entityId);
95
- const edges = [];
217
+ const result = [];
96
218
  for (let i = offset; i < offset + count; i++) {
97
219
  if (type === undefined || edgeTypes[i] === type) {
98
- edges.push({
220
+ const edge = {
99
221
  target: edgeTargets[i],
100
222
  type: edgeTypes[i],
101
223
  relationshipId: edgeRelIds[i],
102
- });
224
+ };
225
+ if (shadowedEdgeIndex && shadowedGroupOffsets && shadowedRelIds) {
226
+ const g = binarySearchU32(shadowedEdgeIndex, i);
227
+ if (g !== -1) {
228
+ edge.shadowedRelationshipIds = Array.from(shadowedRelIds.subarray(shadowedGroupOffsets[g], shadowedGroupOffsets[g + 1]));
229
+ }
230
+ }
231
+ result.push(edge);
103
232
  }
104
233
  }
105
- return edges;
234
+ return result;
106
235
  },
107
236
  getTargets(entityId, type) {
108
237
  return this.getEdges(entityId, type).map((e) => e.target);
@@ -111,6 +240,11 @@ function readEdges(reader) {
111
240
  return offsets.has(entityId);
112
241
  },
113
242
  };
243
+ // `shadowedEdgeIndex`/etc. are `undefined` (not present) on a pre-#3782
244
+ // cache read (version < 18) — matches `RelationshipEdges`'s optional
245
+ // fields exactly, so `edges` above satisfies the interface either way
246
+ // without a cast.
247
+ return edges;
114
248
  }
115
249
  function relationshipTypeToString(type) {
116
250
  const names = {