@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.
- package/README.md +51 -23
- package/dist/adapt.d.ts +72 -0
- package/dist/adapt.d.ts.map +1 -0
- package/dist/adapt.js +68 -0
- package/dist/adapt.js.map +1 -0
- package/dist/glb-color.d.ts +15 -0
- package/dist/glb-color.d.ts.map +1 -0
- package/dist/glb-color.js +18 -0
- package/dist/glb-color.js.map +1 -0
- package/dist/glb.d.ts.map +1 -1
- package/dist/glb.js +3 -3
- package/dist/glb.js.map +1 -1
- package/dist/index.d.ts +18 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -5
- package/dist/index.js.map +1 -1
- package/dist/reader.js +1 -1
- package/dist/reader.js.map +1 -1
- package/dist/sections/geometry.d.ts.map +1 -1
- package/dist/sections/geometry.js +49 -0
- package/dist/sections/geometry.js.map +1 -1
- package/dist/sections/properties.d.ts.map +1 -1
- package/dist/sections/properties.js +23 -26
- package/dist/sections/properties.js.map +1 -1
- package/dist/sections/quantities.d.ts.map +1 -1
- package/dist/sections/quantities.js +26 -25
- package/dist/sections/quantities.js.map +1 -1
- package/dist/sections/relationships.d.ts +25 -2
- package/dist/sections/relationships.d.ts.map +1 -1
- package/dist/sections/relationships.js +150 -16
- package/dist/sections/relationships.js.map +1 -1
- package/dist/types.d.ts +37 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +37 -1
- package/dist/types.js.map +1 -1
- package/package.json +5 -4
|
@@ -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":"AAAA;;+DAE+D;AAS/D;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAkB;IAK/C,MAAM,WAAW,GAAe,EAAE,CAAC;IACnC,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAEvC,yDAAyD;QACzD,IAAI,WAAW,GAAG,gBAAgB,IAAI,UAAU,GAAG,eAAe,EAAE,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,eAAe,IAAI,CAAC,SAAS,wBAAwB,CAAC,CAAC;YACvG,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,+EAA+E;QAC/E,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,eAAe,IAAI,CAAC,SAAS,uCAAuC,IAAI,CAAC,OAAO,CAAC,MAAM,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YACxK,SAAS;QACX,CAAC;QAED,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,mBAAmB,IAAI,WAAW,CAAC;QACnC,oBAAoB,IAAI,UAAU,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB,EAAE,IAAc;IAClE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEnC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAEvC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAChC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE/B,qBAAqB;IACrB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,iDAAiD;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAE5B,2EAA2E;IAC3E,wEAAwE;IACxE,2EAA2E;IAC3E,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC;IAE3C,2EAA2E;IAC3E,4EAA4E;IAC5E,8DAA8D;IAC9D,EAAE;IACF,4EAA4E;IAC5E,6EAA6E;IAC7E,4EAA4E;IAC5E,4EAA4E;IAC5E,0CAA0C;IAC1C,EAAE;IACF,8EAA8E;IAC9E,wEAAwE;IACxE,8EAA8E;IAC9E,0EAA0E;IAC1E,6DAA6D;IAC7D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,IAAI,gBAAgB,CAAC,CAAC;IAC5D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC,CAAC;IAExD,sEAAsE;IACtE,mEAAmE;IACnE,yEAAyE;IACzE,+CAA+C;IAC/C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,wBAAwB;IACxB,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,OAAO,CACL,CAAC,GAAG,CAAC,GAAG,CAAC,GAAc,qCAAqC;QAC5D,EAAE,GAAqB,cAAc;QACrC,CAAC,GAAG,YAAY,GAAO,iBAAiB;QACxC,CAAC,GAAsB,gBAAgB;QACvC,CAAC,GAAsB,2CAA2C;QAClE,EAAE,GAAqB,eAAe;QACtC,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAoB,EAAE,IAAoB;IAC5E,eAAe;IACf,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAEpC,kBAAkB;IAClB,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAEvC,iBAAiB;IACjB,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAEtC,4DAA4D;IAC5D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,iCAAiC;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC;IACpD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,UAAU,EAAE,CAAC;QACf,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,aAAc,CAAC,CAAC;IACzC,CAAC;IAED,oCAAoC;IACpC,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC;IAChE,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,mBAAmB,EAAE,CAAC;QACxB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAiB,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,MAAoB,EAAE,CAAO;IAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,SAAS,CAAC,MAAoB,EAAE,IAAU;IACjD,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;wBAEwB;AACxB,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAEpC,gDAAgD;AAChD,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,6BAA6B;AACnE,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,4BAA4B;AAEjE;mEACmE;AACnE,MAAM,qBAAqB,GAAG,UAAU,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAS,sBAAsB,CAC7B,MAAoB,EACpB,KAA8B,EAC9B,SAAiB,EACjB,SAAiB;IAEjB,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,KAAK,qBAAqB,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CACb,uBAAuB,SAAS,eAAe,SAAS,2BAA2B;gBACjF,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,4BAA4B,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE,OAAe,EAAE,YAAoB,CAAC;IACzF,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAEvC,mCAAmC;IACnC,IAAI,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,8BAA8B,WAAW,oBAAoB,gBAAgB,YAAY,SAAS,wDAAwD,CAAC,CAAC;IAC9K,CAAC;IACD,IAAI,UAAU,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,oBAAoB,eAAe,YAAY,SAAS,wDAAwD,CAAC,CAAC;IAC3K,CAAC;IAED,MAAM,KAAK,GAAqC;QAC9C,MAAM,CAAC,WAAW,EAAE;QACpB,MAAM,CAAC,WAAW,EAAE;QACpB,MAAM,CAAC,WAAW,EAAE;QACpB,MAAM,CAAC,WAAW,EAAE;KACrB,CAAC;IAEF,oCAAoC;IACpC,IAAI,OAAO,GAAuB,SAAS,CAAC;IAC5C,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,SAAS,CAAC;IAC7C,CAAC;IAED,qEAAqE;IACrE,yEAAyE;IACzE,0EAA0E;IAC1E,MAAM,aAAa,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5D,6DAA6D;IAC7D,yEAAyE;IACzE,8EAA8E;IAC9E,8EAA8E;IAC9E,gEAAgE;IAChE,IAAI,cAAkC,CAAC;IACvC,IAAI,UAA8B,CAAC;IACnC,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAChC,mEAAmE;QACnE,kEAAkE;QAClE,IAAI,GAAG,KAAK,gBAAgB;YAAE,cAAc,GAAG,GAAG,CAAC;QACnD,IAAI,GAAG,KAAK,gBAAgB;YAAE,UAAU,GAAG,GAAG,CAAC;IACjD,CAAC;IAED,+EAA+E;IAC/E,IAAI,MAA4C,CAAC;IACjD,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;YAAE,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAEnD,wEAAwE;IACxE,0EAA0E;IAC1E,4EAA4E;IAC5E,6EAA6E;IAC7E,wEAAwE;IACxE,qEAAqE;IACrE,qEAAqE;IACrE,yEAAyE;IACzE,yEAAyE;IACzE,2EAA2E;IAC3E,4EAA4E;IAC5E,yEAAyE;IACzE,0EAA0E;IAC1E,6BAA6B;IAC7B,sBAAsB,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACrE,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAEjE,OAAO;QACL,SAAS;QACT,SAAS;QACT,OAAO;QACP,OAAO;QACP,KAAK;QACL,OAAO;QACP,aAAa;QACb,4EAA4E;QAC5E,qDAAqD;QACrD,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAoB,EAAE,UAAkB,CAAC;IAC1E,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,mBAAmB,GAAG,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAErD,mCAAmC;IACnC,IAAI,aAA+B,CAAC;IACpC,IAAI,gBAAoC,CAAC;IAEzC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;YAC7B,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;YAC7B,gBAAgB,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW;QACX,cAAc;QACd,aAAa;QACb,mBAAmB;QACnB,aAAa;QACb,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,MAAoB;IACpC,OAAO;QACL,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE;QACvB,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE;QACvB,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,MAAoB;IACpC,OAAO;QACL,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC;QACrB,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC;KACtB,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../src/sections/properties.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA;;+DAE+D;AAO/D,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../../src/sections/properties.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAO/D,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGvG;;;;GAIG;AACH,IAAI,qBAAqB,GAAG,KAAK,CAAC;AAElC,iFAAiF;AACjF,MAAM,UAAU,4BAA4B;IAC1C,qBAAqB,GAAG,KAAK,CAAC;AAChC,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe,EAAE,GAAY;IAC7D,IAAI,qBAAqB;QAAE,OAAO;IAClC,qBAAqB,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,IAAI,CACV,2EAA2E;QACzE,gDAAgD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,EACzF,GAAG,CACJ,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB,EAAE,UAAyB;IAC7E,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;IAE/B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE1B,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAE1C,qBAAqB;IACrB,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAC3C,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IACzC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE,OAAoB;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAElC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAE5C,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAExD,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAiB,EAAE;QACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,iBAAiB,CAAC,MAAM,CAAC;YAC9B,KAAK,iBAAiB,CAAC,KAAK,CAAC;YAC7B,KAAK,iBAAiB,CAAC,UAAU,CAAC;YAClC,KAAK,iBAAiB,CAAC,IAAI,CAAC;YAC5B,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5B,mEAAmE;gBACnE,uEAAuE;gBACvE,mEAAmE;gBACnE,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAC5B,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAChE,CAAC;YACD,KAAK,iBAAiB,CAAC,IAAI;gBACzB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,KAAK,iBAAiB,CAAC,OAAO;gBAC5B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;YACvB,KAAK,iBAAiB,CAAC,OAAO,CAAC;YAC/B,KAAK,iBAAiB,CAAC,OAAO;gBAC5B,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC/B,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC;YAChD,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5B,wDAAwD;gBACxD,oEAAoE;gBACpE,qEAAqE;gBACrE,mEAAmE;gBACnE,+CAA+C;gBAC/C,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAC5B,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAClD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChC,IAAI,OAAO,KAAK,EAAE;oBAAE,OAAO,IAAI,CAAC;gBAChC,IAAI,CAAC;oBACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC7B,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBACvC,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YACD;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,KAAK;QACL,QAAQ;QACR,QAAQ;QACR,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,SAAS;QACT,QAAQ;QACR,SAAS;QACT,MAAM;QACN,WAAW;QACX,SAAS;QACT,SAAS;QAET,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE;YACnB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAC7C,OAAO,2BAA2B,CAChC,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC/B,CAAC;QACJ,CAAC;QAED,gBAAgB,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACnC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEtC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC;oBAC3D,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAED,cAAc,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,OAAO,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAC;YAE3B,2EAA2E;YAC3E,2EAA2E;YAC3E,MAAM,OAAO,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChE,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAC;YAEjD,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,IAAI,OAAO,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,OAAO;oBAAE,SAAS;gBACxD,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;oBACtD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,MAAoB,EAAE,KAA4B;IACpE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QAClC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,SAAS,CAAC,MAAoB,EAAE,QAAgB,EAAE,IAAY;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,eAAe,QAAQ,YAAY,GAAG,GAAG;oBAC1E,qBAAqB,QAAQ,EAAE,CAClC,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quantities.d.ts","sourceRoot":"","sources":["../../src/sections/quantities.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA;;+DAE+D;AAO/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;
|
|
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
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
217
|
+
const result = [];
|
|
96
218
|
for (let i = offset; i < offset + count; i++) {
|
|
97
219
|
if (type === undefined || edgeTypes[i] === type) {
|
|
98
|
-
|
|
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
|
|
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 = {
|