@bldrs-ai/conway 1.520.1486 → 1.529.1492

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 (49) hide show
  1. package/compiled/examples/browser-bundled.cjs +36 -6
  2. package/compiled/examples/cli-bundled.cjs +81 -13
  3. package/compiled/examples/cli-step-bundled.cjs +53 -23
  4. package/compiled/examples/validator-bundled.cjs +36 -6
  5. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_curve.gen.d.ts +2 -2
  6. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_curve.gen.d.ts.map +1 -1
  7. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_curve.gen.js +2 -2
  8. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_surface.gen.d.ts +3 -3
  9. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_surface.gen.d.ts.map +1 -1
  10. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_surface.gen.js +3 -3
  11. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/composite_curve.gen.d.ts +1 -1
  12. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/composite_curve.gen.d.ts.map +1 -1
  13. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/composite_curve.gen.js +1 -1
  14. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_2d.gen.d.ts +1 -1
  15. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_2d.gen.d.ts.map +1 -1
  16. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_2d.gen.js +1 -1
  17. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_3d.gen.d.ts +1 -1
  18. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_3d.gen.d.ts.map +1 -1
  19. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_3d.gen.js +1 -1
  20. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_surface.gen.d.ts +1 -1
  21. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_surface.gen.d.ts.map +1 -1
  22. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_surface.gen.js +1 -1
  23. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/schema_ap214.gen.js +11 -11
  24. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/shape_aspect.gen.d.ts +1 -1
  25. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/shape_aspect.gen.d.ts.map +1 -1
  26. package/compiled/src/AP214E3_2010/AP214E3_2010_gen/shape_aspect.gen.js +1 -1
  27. package/compiled/src/AP214E3_2010/ap214_logical_attribute.test.d.ts +2 -0
  28. package/compiled/src/AP214E3_2010/ap214_logical_attribute.test.d.ts.map +1 -0
  29. package/compiled/src/AP214E3_2010/ap214_logical_attribute.test.js +114 -0
  30. package/compiled/src/ifc/ifc4_gen/IfcLogical.gen.d.ts +1 -1
  31. package/compiled/src/ifc/ifc4_gen/IfcLogical.gen.d.ts.map +1 -1
  32. package/compiled/src/ifc/ifc4_gen/IfcLogical.gen.js +1 -1
  33. package/compiled/src/ifc/ifc4_gen/IfcRelInterferesElements.gen.d.ts +1 -1
  34. package/compiled/src/ifc/ifc4_gen/IfcRelInterferesElements.gen.d.ts.map +1 -1
  35. package/compiled/src/ifc/ifc4_gen/IfcRelInterferesElements.gen.js +1 -1
  36. package/compiled/src/ifc/ifc4_gen/schema_ifc.gen.js +2 -2
  37. package/compiled/src/ifc/ifc_demand_extraction.test.js +129 -0
  38. package/compiled/src/ifc/ifc_geometry_extraction.d.ts +31 -2
  39. package/compiled/src/ifc/ifc_geometry_extraction.d.ts.map +1 -1
  40. package/compiled/src/ifc/ifc_geometry_extraction.js +68 -7
  41. package/compiled/src/step/step_entity_base.d.ts +10 -3
  42. package/compiled/src/step/step_entity_base.d.ts.map +1 -1
  43. package/compiled/src/step/step_entity_base.js +21 -0
  44. package/compiled/src/step/step_model_base.d.ts +9 -1
  45. package/compiled/src/step/step_model_base.d.ts.map +1 -1
  46. package/compiled/src/step/step_model_base.js +10 -1
  47. package/compiled/src/version/version.js +1 -1
  48. package/compiled/tsconfig.tsbuildinfo +1 -1
  49. package/package.json +1 -1
@@ -30,7 +30,7 @@ var import_node_process = require("node:process");
30
30
  var readline = __toESM(require("node:readline"), 1);
31
31
 
32
32
  // compiled/src/version/version.js
33
- var versionString = "Conway v1.520.1486";
33
+ var versionString = "Conway v1.529.1492";
34
34
 
35
35
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
36
36
  var wasmType = "";
@@ -5812,9 +5812,17 @@ var StepModelBase = class _StepModelBase {
5812
5812
  * extract reads `IfcIndexedPolygonalFace.CoordIndex` as integers —
5813
5813
  * following those faces pinned ~78k records per PSB product. If
5814
5814
  * omitted, `!descend` children use this span path (test helper).
5815
+ * @param claimed Optional out-set of the IDs *this call* claimed and
5816
+ * awaited residency for — a strict subset of `seen`. When `seen` is
5817
+ * shared across concurrent walks (a batch of products sharing mapped
5818
+ * geometry), an ID another walk claimed is skipped here and is NOT
5819
+ * resident yet from this call's point of view: that walk's pin holds
5820
+ * the chunk once it lands, but its read is still in flight. Anything
5821
+ * that must synchronously read a record's bytes after this returns
5822
+ * has to iterate `claimed`, never `seen` (conway#526).
5815
5823
  * @return {Promise<Set<number>>} The local IDs that were visited.
5816
5824
  */
5817
- async ensureResidentClosureByLocalID(localID, extraLocalIDs, seen = /* @__PURE__ */ new Set(), descend, leafSpans, spanLeaf) {
5825
+ async ensureResidentClosureByLocalID(localID, extraLocalIDs, seen = /* @__PURE__ */ new Set(), descend, leafSpans, spanLeaf, claimed) {
5818
5826
  if (!this.isSourceExternal) {
5819
5827
  return seen;
5820
5828
  }
@@ -5839,6 +5847,7 @@ var StepModelBase = class _StepModelBase {
5839
5847
  seen.add(id);
5840
5848
  this.pinByLocalID(id);
5841
5849
  wave.push(id);
5850
+ claimed?.add(id);
5842
5851
  }
5843
5852
  frontier.length = 0;
5844
5853
  if (wave.length === 0) {
@@ -11282,6 +11291,27 @@ var StepEntityBase = class {
11282
11291
  }
11283
11292
  return value;
11284
11293
  }
11294
+ /**
11295
+ * Extract a number at the particular vtable offset (i.e. the position
11296
+ * in the matching step object).
11297
+ *
11298
+ * Used by other extraction methods with wrappers to perform
11299
+ * semantically correct extraction.
11300
+ *
11301
+ * Unlike the other extractors this has a single signature rather than an
11302
+ * optional/non-optional overload pair, because LOGICAL is three-valued:
11303
+ * `.U.` is a legitimate value that reads as null, so a non-optional LOGICAL
11304
+ * is null-valued too and `optional` only decides whether a *missing* value
11305
+ * throws. The old `optional: false` overload promised a bare `boolean` and
11306
+ * was a lie for exactly the `.U.` case this extractor exists to handle.
11307
+ *
11308
+ * @param offset The offset in the vtable to extract from
11309
+ * @param baseOffset The base offset in the vtable to extract from
11310
+ * @param depth The depth of the vtable to extract from
11311
+ * @param optional Is this an optional field?
11312
+ * @return {boolean | null} The extracted logical, or null for `.U.` and for
11313
+ * an absent optional.
11314
+ */
11285
11315
  extractLogical(offset, baseOffset, depth, optional) {
11286
11316
  const [cursor, endCursor, buffer] = this.getOffsetAndEndCursor(offset, baseOffset, depth);
11287
11317
  const value = stepExtractLogical(buffer, cursor, endCursor);
@@ -15423,7 +15453,7 @@ var IfcLogical = class extends StepEntityBase {
15423
15453
  }
15424
15454
  get Value() {
15425
15455
  if (this.Value_ === void 0) {
15426
- this.Value_ = this.extractBoolean(0, 0, 0, false);
15456
+ this.Value_ = this.extractLogical(0, 0, 0, false);
15427
15457
  }
15428
15458
  return this.Value_;
15429
15459
  }
@@ -26545,7 +26575,7 @@ var IfcRelInterferesElements = class extends IfcRelConnects {
26545
26575
  }
26546
26576
  get ImpliedOrder() {
26547
26577
  if (this.ImpliedOrder_ === void 0) {
26548
- this.ImpliedOrder_ = this.extractBoolean(8, 4, 3, false);
26578
+ this.ImpliedOrder_ = this.extractLogical(8, 4, 3, false);
26549
26579
  }
26550
26580
  return this.ImpliedOrder_;
26551
26581
  }
@@ -64813,7 +64843,7 @@ var descriptions = [
64813
64843
  },
64814
64844
  ImpliedOrder: {
64815
64845
  kind: f.BOOLEAN,
64816
- optional: false,
64846
+ optional: true,
64817
64847
  derived: false,
64818
64848
  offset: 8
64819
64849
  }
@@ -69785,7 +69815,7 @@ var descriptions = [
69785
69815
  fields: {
69786
69816
  Value: {
69787
69817
  kind: f.BOOLEAN,
69788
- optional: false,
69818
+ optional: true,
69789
69819
  derived: false,
69790
69820
  offset: 0
69791
69821
  }
@@ -14965,7 +14965,7 @@ ${t5.join("\n")}` : "";
14965
14965
  var import_process = require("process");
14966
14966
 
14967
14967
  // compiled/src/version/version.js
14968
- var versionString = "Conway v1.520.1486";
14968
+ var versionString = "Conway v1.529.1492";
14969
14969
 
14970
14970
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
14971
14971
  function pThreadsAllowed() {
@@ -21695,9 +21695,17 @@ var StepModelBase = class _StepModelBase {
21695
21695
  * extract reads `IfcIndexedPolygonalFace.CoordIndex` as integers —
21696
21696
  * following those faces pinned ~78k records per PSB product. If
21697
21697
  * omitted, `!descend` children use this span path (test helper).
21698
+ * @param claimed Optional out-set of the IDs *this call* claimed and
21699
+ * awaited residency for — a strict subset of `seen`. When `seen` is
21700
+ * shared across concurrent walks (a batch of products sharing mapped
21701
+ * geometry), an ID another walk claimed is skipped here and is NOT
21702
+ * resident yet from this call's point of view: that walk's pin holds
21703
+ * the chunk once it lands, but its read is still in flight. Anything
21704
+ * that must synchronously read a record's bytes after this returns
21705
+ * has to iterate `claimed`, never `seen` (conway#526).
21698
21706
  * @return {Promise<Set<number>>} The local IDs that were visited.
21699
21707
  */
21700
- async ensureResidentClosureByLocalID(localID, extraLocalIDs, seen = /* @__PURE__ */ new Set(), descend, leafSpans, spanLeaf) {
21708
+ async ensureResidentClosureByLocalID(localID, extraLocalIDs, seen = /* @__PURE__ */ new Set(), descend, leafSpans, spanLeaf, claimed) {
21701
21709
  if (!this.isSourceExternal) {
21702
21710
  return seen;
21703
21711
  }
@@ -21722,6 +21730,7 @@ var StepModelBase = class _StepModelBase {
21722
21730
  seen.add(id);
21723
21731
  this.pinByLocalID(id);
21724
21732
  wave.push(id);
21733
+ claimed?.add(id);
21725
21734
  }
21726
21735
  frontier.length = 0;
21727
21736
  if (wave.length === 0) {
@@ -27219,6 +27228,27 @@ var StepEntityBase = class {
27219
27228
  }
27220
27229
  return value;
27221
27230
  }
27231
+ /**
27232
+ * Extract a number at the particular vtable offset (i.e. the position
27233
+ * in the matching step object).
27234
+ *
27235
+ * Used by other extraction methods with wrappers to perform
27236
+ * semantically correct extraction.
27237
+ *
27238
+ * Unlike the other extractors this has a single signature rather than an
27239
+ * optional/non-optional overload pair, because LOGICAL is three-valued:
27240
+ * `.U.` is a legitimate value that reads as null, so a non-optional LOGICAL
27241
+ * is null-valued too and `optional` only decides whether a *missing* value
27242
+ * throws. The old `optional: false` overload promised a bare `boolean` and
27243
+ * was a lie for exactly the `.U.` case this extractor exists to handle.
27244
+ *
27245
+ * @param offset The offset in the vtable to extract from
27246
+ * @param baseOffset The base offset in the vtable to extract from
27247
+ * @param depth The depth of the vtable to extract from
27248
+ * @param optional Is this an optional field?
27249
+ * @return {boolean | null} The extracted logical, or null for `.U.` and for
27250
+ * an absent optional.
27251
+ */
27222
27252
  extractLogical(offset, baseOffset, depth, optional) {
27223
27253
  const [cursor, endCursor, buffer] = this.getOffsetAndEndCursor(offset, baseOffset, depth);
27224
27254
  const value = stepExtractLogical(buffer, cursor, endCursor);
@@ -31360,7 +31390,7 @@ var IfcLogical = class extends StepEntityBase {
31360
31390
  }
31361
31391
  get Value() {
31362
31392
  if (this.Value_ === void 0) {
31363
- this.Value_ = this.extractBoolean(0, 0, 0, false);
31393
+ this.Value_ = this.extractLogical(0, 0, 0, false);
31364
31394
  }
31365
31395
  return this.Value_;
31366
31396
  }
@@ -42482,7 +42512,7 @@ var IfcRelInterferesElements = class extends IfcRelConnects {
42482
42512
  }
42483
42513
  get ImpliedOrder() {
42484
42514
  if (this.ImpliedOrder_ === void 0) {
42485
- this.ImpliedOrder_ = this.extractBoolean(8, 4, 3, false);
42515
+ this.ImpliedOrder_ = this.extractLogical(8, 4, 3, false);
42486
42516
  }
42487
42517
  return this.ImpliedOrder_;
42488
42518
  }
@@ -80750,7 +80780,7 @@ var descriptions = [
80750
80780
  },
80751
80781
  ImpliedOrder: {
80752
80782
  kind: f.BOOLEAN,
80753
- optional: false,
80783
+ optional: true,
80754
80784
  derived: false,
80755
80785
  offset: 8
80756
80786
  }
@@ -85722,7 +85752,7 @@ var descriptions = [
85722
85752
  fields: {
85723
85753
  Value: {
85724
85754
  kind: f.BOOLEAN,
85725
- optional: false,
85755
+ optional: true,
85726
85756
  derived: false,
85727
85757
  offset: 0
85728
85758
  }
@@ -93239,6 +93269,24 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
93239
93269
  if (!this.model.isSourceExternal) {
93240
93270
  return seen ?? /* @__PURE__ */ new Set();
93241
93271
  }
93272
+ try {
93273
+ return await this.ensureResidentForProductExtractUnguarded_(localID, seen, leafSpans);
93274
+ } catch (error) {
93275
+ logger_default.error(`Error paging product localID ${localID} for extract: ${error instanceof Error ? error.message : String(error)}`);
93276
+ return seen ?? /* @__PURE__ */ new Set();
93277
+ }
93278
+ }
93279
+ /**
93280
+ * {@link ensureResidentForProductExtract} without the per-product
93281
+ * fault containment — split out so the guard cannot accidentally
93282
+ * swallow a failure raised by its own bookkeeping.
93283
+ *
93284
+ * @param localID The product's local ID.
93285
+ * @param seen Optional set to extend.
93286
+ * @param leafSpans Coalesced Faces[] pin ranges — caller unpins.
93287
+ * @return {Promise<Set<number>>} Pinned local IDs.
93288
+ */
93289
+ async ensureResidentForProductExtractUnguarded_(localID, seen, leafSpans) {
93242
93290
  const extra = [];
93243
93291
  const voids = this.productToVoidGeometryMap.get(localID);
93244
93292
  if (voids !== void 0) {
@@ -93256,7 +93304,8 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
93256
93304
  const typeID = this.model.typeIDOf(id);
93257
93305
  return !isFace(id) && typeID !== entity_types_ifc_gen_default.IFCPOLYGONALFACESET && typeID !== entity_types_ifc_gen_default.IFCTRIANGULATEDFACESET;
93258
93306
  };
93259
- const visited = await this.model.ensureResidentClosureByLocalID(localID, extra, seen, descend, leafSpans, isFace);
93307
+ const claimed = /* @__PURE__ */ new Set();
93308
+ const visited = await this.model.ensureResidentClosureByLocalID(localID, extra, seen, descend, leafSpans, isFace, claimed);
93260
93309
  const styleExtra = [];
93261
93310
  for (const visitedID of visited) {
93262
93311
  const styled = this.materials.styledItemMap.get(visitedID);
@@ -93269,9 +93318,9 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
93269
93318
  }
93270
93319
  }
93271
93320
  if (styleExtra.length > 0) {
93272
- await this.model.ensureResidentClosureByLocalID(localID, styleExtra, visited, descend, leafSpans, isFace);
93321
+ await this.model.ensureResidentClosureByLocalID(localID, styleExtra, visited, descend, leafSpans, isFace, claimed);
93273
93322
  }
93274
- await this.ensureResidentVisitedFacesetPayloads_(visited, leafSpans);
93323
+ await this.ensureResidentVisitedFacesetPayloads_(claimed, visited, leafSpans);
93275
93324
  return visited;
93276
93325
  }
93277
93326
  /**
@@ -93279,16 +93328,35 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
93279
93328
  * or more tight address spans. The generic closure visits the
93280
93329
  * faceset but does not scan Faces[].
93281
93330
  *
93282
- * @param visited Faceset local IDs already pinned (and the set to
93283
- * extend with Coordinates).
93331
+ * **Iterates `claimed`, not `visited`, and re-ensures before the
93332
+ * scan** both halves of conway#526. `referencedExpressIDs` is a
93333
+ * SYNCHRONOUS acquire of the faceset's own bytes, and when a batch
93334
+ * prefetches products concurrently through one shared `visited` set
93335
+ * (`extractGeometryBatchAsync`'s Promise.all over 8 products), the
93336
+ * closure walk skips any ID a sibling product already claimed. That
93337
+ * sibling has pinned the range but its read may still be in flight,
93338
+ * so scanning the shared set threw
93339
+ * `StepBufferNotResidentError: STEP source range [...] is not
93340
+ * resident` out of the prefetch and killed the whole load — a pin
93341
+ * reserves a chunk against eviction, it does not make it resident.
93342
+ * Iterating this call's own claims fixes that (and drops the
93343
+ * quadratic re-scan of every sibling's facesets); the `await` below
93344
+ * makes the guarantee local rather than inherited, since a resident
93345
+ * chunk costs only a microtask there.
93346
+ *
93347
+ * @param claimed Faceset local IDs this call claimed and awaited.
93348
+ * @param visited The (possibly shared) visited set — read for
93349
+ * Coordinates de-duplication and extended with the ones pinned here,
93350
+ * so the caller's unpin covers them.
93284
93351
  * @param leafSpans Coalesced Faces[] pin ranges — caller unpins.
93285
93352
  */
93286
- async ensureResidentVisitedFacesetPayloads_(visited, leafSpans) {
93287
- for (const localID of visited) {
93353
+ async ensureResidentVisitedFacesetPayloads_(claimed, visited, leafSpans) {
93354
+ for (const localID of claimed) {
93288
93355
  const typeID = this.model.typeIDOf(localID);
93289
93356
  if (typeID !== entity_types_ifc_gen_default.IFCPOLYGONALFACESET && typeID !== entity_types_ifc_gen_default.IFCTRIANGULATEDFACESET) {
93290
93357
  continue;
93291
93358
  }
93359
+ await this.model.ensureResidentByLocalID(localID);
93292
93360
  const refs = this.model.referencedExpressIDs(localID);
93293
93361
  if (refs.length === 0) {
93294
93362
  continue;
@@ -15943,7 +15943,7 @@ var ParsingBuffer = class {
15943
15943
  };
15944
15944
 
15945
15945
  // compiled/src/version/version.js
15946
- var versionString = "Conway v1.520.1486";
15946
+ var versionString = "Conway v1.529.1492";
15947
15947
 
15948
15948
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
15949
15949
  function pThreadsAllowed() {
@@ -21434,9 +21434,17 @@ var StepModelBase = class _StepModelBase {
21434
21434
  * extract reads `IfcIndexedPolygonalFace.CoordIndex` as integers —
21435
21435
  * following those faces pinned ~78k records per PSB product. If
21436
21436
  * omitted, `!descend` children use this span path (test helper).
21437
+ * @param claimed Optional out-set of the IDs *this call* claimed and
21438
+ * awaited residency for — a strict subset of `seen`. When `seen` is
21439
+ * shared across concurrent walks (a batch of products sharing mapped
21440
+ * geometry), an ID another walk claimed is skipped here and is NOT
21441
+ * resident yet from this call's point of view: that walk's pin holds
21442
+ * the chunk once it lands, but its read is still in flight. Anything
21443
+ * that must synchronously read a record's bytes after this returns
21444
+ * has to iterate `claimed`, never `seen` (conway#526).
21437
21445
  * @return {Promise<Set<number>>} The local IDs that were visited.
21438
21446
  */
21439
- async ensureResidentClosureByLocalID(localID, extraLocalIDs, seen = /* @__PURE__ */ new Set(), descend, leafSpans, spanLeaf) {
21447
+ async ensureResidentClosureByLocalID(localID, extraLocalIDs, seen = /* @__PURE__ */ new Set(), descend, leafSpans, spanLeaf, claimed) {
21440
21448
  if (!this.isSourceExternal) {
21441
21449
  return seen;
21442
21450
  }
@@ -21461,6 +21469,7 @@ var StepModelBase = class _StepModelBase {
21461
21469
  seen.add(id);
21462
21470
  this.pinByLocalID(id);
21463
21471
  wave.push(id);
21472
+ claimed?.add(id);
21464
21473
  }
21465
21474
  frontier.length = 0;
21466
21475
  if (wave.length === 0) {
@@ -23107,6 +23116,27 @@ var StepEntityBase = class {
23107
23116
  }
23108
23117
  return value;
23109
23118
  }
23119
+ /**
23120
+ * Extract a number at the particular vtable offset (i.e. the position
23121
+ * in the matching step object).
23122
+ *
23123
+ * Used by other extraction methods with wrappers to perform
23124
+ * semantically correct extraction.
23125
+ *
23126
+ * Unlike the other extractors this has a single signature rather than an
23127
+ * optional/non-optional overload pair, because LOGICAL is three-valued:
23128
+ * `.U.` is a legitimate value that reads as null, so a non-optional LOGICAL
23129
+ * is null-valued too and `optional` only decides whether a *missing* value
23130
+ * throws. The old `optional: false` overload promised a bare `boolean` and
23131
+ * was a lie for exactly the `.U.` case this extractor exists to handle.
23132
+ *
23133
+ * @param offset The offset in the vtable to extract from
23134
+ * @param baseOffset The base offset in the vtable to extract from
23135
+ * @param depth The depth of the vtable to extract from
23136
+ * @param optional Is this an optional field?
23137
+ * @return {boolean | null} The extracted logical, or null for `.U.` and for
23138
+ * an absent optional.
23139
+ */
23110
23140
  extractLogical(offset, baseOffset, depth, optional) {
23111
23141
  const [cursor, endCursor, buffer] = this.getOffsetAndEndCursor(offset, baseOffset, depth);
23112
23142
  const value = stepExtractLogical(buffer, cursor, endCursor);
@@ -24776,7 +24806,7 @@ var shape_aspect = class _shape_aspect extends StepEntityBase {
24776
24806
  }
24777
24807
  get product_definitional() {
24778
24808
  if (this.product_definitional_ === void 0) {
24779
- this.product_definitional_ = this.extractBoolean(3, 0, 0, false);
24809
+ this.product_definitional_ = this.extractLogical(3, 0, 0, false);
24780
24810
  }
24781
24811
  return this.product_definitional_;
24782
24812
  }
@@ -47613,7 +47643,7 @@ var offset_curve_2d = class _offset_curve_2d extends curve {
47613
47643
  }
47614
47644
  get self_intersect() {
47615
47645
  if (this.self_intersect_ === void 0) {
47616
- this.self_intersect_ = this.extractBoolean(3, 1, 3, false);
47646
+ this.self_intersect_ = this.extractLogical(3, 1, 3, false);
47617
47647
  }
47618
47648
  return this.self_intersect_;
47619
47649
  }
@@ -47652,7 +47682,7 @@ var offset_curve_3d = class _offset_curve_3d extends curve {
47652
47682
  }
47653
47683
  get self_intersect() {
47654
47684
  if (this.self_intersect_ === void 0) {
47655
- this.self_intersect_ = this.extractBoolean(3, 1, 3, false);
47685
+ this.self_intersect_ = this.extractLogical(3, 1, 3, false);
47656
47686
  }
47657
47687
  return this.self_intersect_;
47658
47688
  }
@@ -48699,7 +48729,7 @@ var offset_surface = class _offset_surface extends surface {
48699
48729
  }
48700
48730
  get self_intersect() {
48701
48731
  if (this.self_intersect_ === void 0) {
48702
- this.self_intersect_ = this.extractBoolean(3, 1, 3, false);
48732
+ this.self_intersect_ = this.extractLogical(3, 1, 3, false);
48703
48733
  }
48704
48734
  return this.self_intersect_;
48705
48735
  }
@@ -49470,13 +49500,13 @@ var b_spline_curve = class _b_spline_curve extends bounded_curve {
49470
49500
  }
49471
49501
  get closed_curve() {
49472
49502
  if (this.closed_curve_ === void 0) {
49473
- this.closed_curve_ = this.extractBoolean(4, 1, 4, false);
49503
+ this.closed_curve_ = this.extractLogical(4, 1, 4, false);
49474
49504
  }
49475
49505
  return this.closed_curve_;
49476
49506
  }
49477
49507
  get self_intersect() {
49478
49508
  if (this.self_intersect_ === void 0) {
49479
- this.self_intersect_ = this.extractBoolean(5, 1, 4, false);
49509
+ this.self_intersect_ = this.extractLogical(5, 1, 4, false);
49480
49510
  }
49481
49511
  return this.self_intersect_;
49482
49512
  }
@@ -49560,19 +49590,19 @@ var b_spline_surface = class _b_spline_surface extends bounded_surface {
49560
49590
  }
49561
49591
  get u_closed() {
49562
49592
  if (this.u_closed_ === void 0) {
49563
- this.u_closed_ = this.extractBoolean(5, 1, 4, false);
49593
+ this.u_closed_ = this.extractLogical(5, 1, 4, false);
49564
49594
  }
49565
49595
  return this.u_closed_;
49566
49596
  }
49567
49597
  get v_closed() {
49568
49598
  if (this.v_closed_ === void 0) {
49569
- this.v_closed_ = this.extractBoolean(6, 1, 4, false);
49599
+ this.v_closed_ = this.extractLogical(6, 1, 4, false);
49570
49600
  }
49571
49601
  return this.v_closed_;
49572
49602
  }
49573
49603
  get self_intersect() {
49574
49604
  if (this.self_intersect_ === void 0) {
49575
- this.self_intersect_ = this.extractBoolean(7, 1, 4, false);
49605
+ this.self_intersect_ = this.extractLogical(7, 1, 4, false);
49576
49606
  }
49577
49607
  return this.self_intersect_;
49578
49608
  }
@@ -49797,7 +49827,7 @@ var composite_curve = class _composite_curve extends bounded_curve {
49797
49827
  }
49798
49828
  get self_intersect() {
49799
49829
  if (this.self_intersect_ === void 0) {
49800
- this.self_intersect_ = this.extractBoolean(2, 1, 4, false);
49830
+ this.self_intersect_ = this.extractLogical(2, 1, 4, false);
49801
49831
  }
49802
49832
  return this.self_intersect_;
49803
49833
  }
@@ -58366,7 +58396,7 @@ var descriptions = [
58366
58396
  },
58367
58397
  product_definitional: {
58368
58398
  kind: f.BOOLEAN,
58369
- optional: false,
58399
+ optional: true,
58370
58400
  derived: false,
58371
58401
  offset: 3
58372
58402
  },
@@ -63775,13 +63805,13 @@ var descriptions = [
63775
63805
  },
63776
63806
  closed_curve: {
63777
63807
  kind: f.BOOLEAN,
63778
- optional: false,
63808
+ optional: true,
63779
63809
  derived: false,
63780
63810
  offset: 4
63781
63811
  },
63782
63812
  self_intersect: {
63783
63813
  kind: f.BOOLEAN,
63784
- optional: false,
63814
+ optional: true,
63785
63815
  derived: false,
63786
63816
  offset: 5
63787
63817
  },
@@ -63910,19 +63940,19 @@ var descriptions = [
63910
63940
  },
63911
63941
  u_closed: {
63912
63942
  kind: f.BOOLEAN,
63913
- optional: false,
63943
+ optional: true,
63914
63944
  derived: false,
63915
63945
  offset: 5
63916
63946
  },
63917
63947
  v_closed: {
63918
63948
  kind: f.BOOLEAN,
63919
- optional: false,
63949
+ optional: true,
63920
63950
  derived: false,
63921
63951
  offset: 6
63922
63952
  },
63923
63953
  self_intersect: {
63924
63954
  kind: f.BOOLEAN,
63925
- optional: false,
63955
+ optional: true,
63926
63956
  derived: false,
63927
63957
  offset: 7
63928
63958
  },
@@ -64731,7 +64761,7 @@ var descriptions = [
64731
64761
  },
64732
64762
  self_intersect: {
64733
64763
  kind: f.BOOLEAN,
64734
- optional: false,
64764
+ optional: true,
64735
64765
  derived: false,
64736
64766
  offset: 2
64737
64767
  },
@@ -64742,7 +64772,7 @@ var descriptions = [
64742
64772
  },
64743
64773
  closed_curve: {
64744
64774
  kind: f.BOOLEAN,
64745
- optional: false,
64775
+ optional: true,
64746
64776
  derived: true
64747
64777
  }
64748
64778
  },
@@ -67128,7 +67158,7 @@ var descriptions = [
67128
67158
  },
67129
67159
  self_intersect: {
67130
67160
  kind: f.BOOLEAN,
67131
- optional: false,
67161
+ optional: true,
67132
67162
  derived: false,
67133
67163
  offset: 3
67134
67164
  }
@@ -67155,7 +67185,7 @@ var descriptions = [
67155
67185
  },
67156
67186
  self_intersect: {
67157
67187
  kind: f.BOOLEAN,
67158
- optional: false,
67188
+ optional: true,
67159
67189
  derived: false,
67160
67190
  offset: 3
67161
67191
  },
@@ -73653,7 +73683,7 @@ var descriptions = [
73653
73683
  },
73654
73684
  self_intersect: {
73655
73685
  kind: f.BOOLEAN,
73656
- optional: false,
73686
+ optional: true,
73657
73687
  derived: false,
73658
73688
  offset: 3
73659
73689
  }
@@ -944,7 +944,7 @@ var EntityTypesIfcCount = 909;
944
944
  var entity_types_ifc_gen_default = EntityTypesIfc;
945
945
 
946
946
  // compiled/src/version/version.js
947
- var versionString = "Conway v1.520.1486";
947
+ var versionString = "Conway v1.529.1492";
948
948
 
949
949
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
950
950
  var wasmType = "";
@@ -5810,9 +5810,17 @@ var StepModelBase = class _StepModelBase {
5810
5810
  * extract reads `IfcIndexedPolygonalFace.CoordIndex` as integers —
5811
5811
  * following those faces pinned ~78k records per PSB product. If
5812
5812
  * omitted, `!descend` children use this span path (test helper).
5813
+ * @param claimed Optional out-set of the IDs *this call* claimed and
5814
+ * awaited residency for — a strict subset of `seen`. When `seen` is
5815
+ * shared across concurrent walks (a batch of products sharing mapped
5816
+ * geometry), an ID another walk claimed is skipped here and is NOT
5817
+ * resident yet from this call's point of view: that walk's pin holds
5818
+ * the chunk once it lands, but its read is still in flight. Anything
5819
+ * that must synchronously read a record's bytes after this returns
5820
+ * has to iterate `claimed`, never `seen` (conway#526).
5813
5821
  * @return {Promise<Set<number>>} The local IDs that were visited.
5814
5822
  */
5815
- async ensureResidentClosureByLocalID(localID, extraLocalIDs, seen = /* @__PURE__ */ new Set(), descend, leafSpans, spanLeaf) {
5823
+ async ensureResidentClosureByLocalID(localID, extraLocalIDs, seen = /* @__PURE__ */ new Set(), descend, leafSpans, spanLeaf, claimed) {
5816
5824
  if (!this.isSourceExternal) {
5817
5825
  return seen;
5818
5826
  }
@@ -5837,6 +5845,7 @@ var StepModelBase = class _StepModelBase {
5837
5845
  seen.add(id);
5838
5846
  this.pinByLocalID(id);
5839
5847
  wave.push(id);
5848
+ claimed?.add(id);
5840
5849
  }
5841
5850
  frontier.length = 0;
5842
5851
  if (wave.length === 0) {
@@ -11280,6 +11289,27 @@ var StepEntityBase = class {
11280
11289
  }
11281
11290
  return value;
11282
11291
  }
11292
+ /**
11293
+ * Extract a number at the particular vtable offset (i.e. the position
11294
+ * in the matching step object).
11295
+ *
11296
+ * Used by other extraction methods with wrappers to perform
11297
+ * semantically correct extraction.
11298
+ *
11299
+ * Unlike the other extractors this has a single signature rather than an
11300
+ * optional/non-optional overload pair, because LOGICAL is three-valued:
11301
+ * `.U.` is a legitimate value that reads as null, so a non-optional LOGICAL
11302
+ * is null-valued too and `optional` only decides whether a *missing* value
11303
+ * throws. The old `optional: false` overload promised a bare `boolean` and
11304
+ * was a lie for exactly the `.U.` case this extractor exists to handle.
11305
+ *
11306
+ * @param offset The offset in the vtable to extract from
11307
+ * @param baseOffset The base offset in the vtable to extract from
11308
+ * @param depth The depth of the vtable to extract from
11309
+ * @param optional Is this an optional field?
11310
+ * @return {boolean | null} The extracted logical, or null for `.U.` and for
11311
+ * an absent optional.
11312
+ */
11283
11313
  extractLogical(offset, baseOffset, depth, optional) {
11284
11314
  const [cursor, endCursor, buffer] = this.getOffsetAndEndCursor(offset, baseOffset, depth);
11285
11315
  const value = stepExtractLogical(buffer, cursor, endCursor);
@@ -15421,7 +15451,7 @@ var IfcLogical = class extends StepEntityBase {
15421
15451
  }
15422
15452
  get Value() {
15423
15453
  if (this.Value_ === void 0) {
15424
- this.Value_ = this.extractBoolean(0, 0, 0, false);
15454
+ this.Value_ = this.extractLogical(0, 0, 0, false);
15425
15455
  }
15426
15456
  return this.Value_;
15427
15457
  }
@@ -26543,7 +26573,7 @@ var IfcRelInterferesElements = class extends IfcRelConnects {
26543
26573
  }
26544
26574
  get ImpliedOrder() {
26545
26575
  if (this.ImpliedOrder_ === void 0) {
26546
- this.ImpliedOrder_ = this.extractBoolean(8, 4, 3, false);
26576
+ this.ImpliedOrder_ = this.extractLogical(8, 4, 3, false);
26547
26577
  }
26548
26578
  return this.ImpliedOrder_;
26549
26579
  }
@@ -64811,7 +64841,7 @@ var descriptions = [
64811
64841
  },
64812
64842
  ImpliedOrder: {
64813
64843
  kind: f.BOOLEAN,
64814
- optional: false,
64844
+ optional: true,
64815
64845
  derived: false,
64816
64846
  offset: 8
64817
64847
  }
@@ -69783,7 +69813,7 @@ var descriptions = [
69783
69813
  fields: {
69784
69814
  Value: {
69785
69815
  kind: f.BOOLEAN,
69786
- optional: false,
69816
+ optional: true,
69787
69817
  derived: false,
69788
69818
  offset: 0
69789
69819
  }
@@ -15,8 +15,8 @@ export declare class b_spline_curve extends bounded_curve {
15
15
  get degree(): number;
16
16
  get control_points_list(): Array<cartesian_point>;
17
17
  get curve_form(): b_spline_curve_form;
18
- get closed_curve(): boolean;
19
- get self_intersect(): boolean;
18
+ get closed_curve(): boolean | null;
19
+ get self_intersect(): boolean | null;
20
20
  get upper_index_on_control_points(): number;
21
21
  get control_points(): Array<cartesian_point>;
22
22
  constructor(localID: number, internalReference: StepEntityInternalReference<EntityTypesAP214>, model: StepModelBase<EntityTypesAP214, StepEntityBase<EntityTypesAP214>>, multiReference?: StepEntityInternalReference<EntityTypesAP214>[]);
@@ -1 +1 @@
1
- {"version":3,"file":"b_spline_curve.gen.d.ts","sourceRoot":"","sources":["../../../../src/AP214E3_2010/AP214E3_2010_gen/b_spline_curve.gen.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAE,mBAAmB,EAAsC,MAAM,SAAS,CAAA;AAajF,OAAO,gBAAgB,MAAM,0BAA0B,CAAA;AACvD,OAAO,2BAA2B,MAAM,2CAA2C,CAAA;AACnF,OAAO,cAAc,MAAM,6BAA6B,CAAA;AACxD,OAAO,aAAa,MAAM,4BAA4B,CAAA;AAItD,qBAAc,cAAe,SAAQ,aAAa;IAChD,IAAW,IAAI,IAAI,gBAAgB,CAElC;IACD,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,oBAAoB,CAAC,CAAyB;IACtD,OAAO,CAAC,WAAW,CAAC,CAAsB;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAU;IAChC,OAAO,CAAC,eAAe,CAAC,CAAU;IAElC,IAAW,MAAM,IAAK,MAAM,CAM3B;IAED,IAAW,mBAAmB,IAAK,KAAK,CAAC,eAAe,CAAC,CA+BxD;IAED,IAAW,UAAU,IAAK,mBAAmB,CAM5C;IAED,IAAW,YAAY,IAAK,OAAO,CAMlC;IAED,IAAW,cAAc,IAAK,OAAO,CAMpC;IAED,IAAW,6BAA6B,IAAK,MAAM,CAElD;IAED,IAAW,cAAc,IAAK,KAAK,CAAC,eAAe,CAAC,CAEnD;gBAEC,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,2BAA2B,CAAE,gBAAgB,CAAE,EAClE,KAAK,EAAE,aAAa,CAAE,gBAAgB,EAAE,cAAc,CAAE,gBAAgB,CAAE,CAAE,EAC5E,cAAc,CAAC,EAAE,2BAA2B,CAAE,gBAAgB,CAAE,EAAE;IAqBpE,gBAAuB,KAAK,qBAC0J;IAEtL,gBAAuB,YAAY,EAAE,gBAAgB,CACpB;CAClC"}
1
+ {"version":3,"file":"b_spline_curve.gen.d.ts","sourceRoot":"","sources":["../../../../src/AP214E3_2010/AP214E3_2010_gen/b_spline_curve.gen.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAE,mBAAmB,EAAsC,MAAM,SAAS,CAAA;AAajF,OAAO,gBAAgB,MAAM,0BAA0B,CAAA;AACvD,OAAO,2BAA2B,MAAM,2CAA2C,CAAA;AACnF,OAAO,cAAc,MAAM,6BAA6B,CAAA;AACxD,OAAO,aAAa,MAAM,4BAA4B,CAAA;AAItD,qBAAc,cAAe,SAAQ,aAAa;IAChD,IAAW,IAAI,IAAI,gBAAgB,CAElC;IACD,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,oBAAoB,CAAC,CAAyB;IACtD,OAAO,CAAC,WAAW,CAAC,CAAsB;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAC,CAAiB;IAEzC,IAAW,MAAM,IAAK,MAAM,CAM3B;IAED,IAAW,mBAAmB,IAAK,KAAK,CAAC,eAAe,CAAC,CA+BxD;IAED,IAAW,UAAU,IAAK,mBAAmB,CAM5C;IAED,IAAW,YAAY,IAAK,OAAO,GAAG,IAAI,CAMzC;IAED,IAAW,cAAc,IAAK,OAAO,GAAG,IAAI,CAM3C;IAED,IAAW,6BAA6B,IAAK,MAAM,CAElD;IAED,IAAW,cAAc,IAAK,KAAK,CAAC,eAAe,CAAC,CAEnD;gBAEC,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,2BAA2B,CAAE,gBAAgB,CAAE,EAClE,KAAK,EAAE,aAAa,CAAE,gBAAgB,EAAE,cAAc,CAAE,gBAAgB,CAAE,CAAE,EAC5E,cAAc,CAAC,EAAE,2BAA2B,CAAE,gBAAgB,CAAE,EAAE;IAqBpE,gBAAuB,KAAK,qBAC0J;IAEtL,gBAAuB,YAAY,EAAE,gBAAgB,CACpB;CAClC"}
@@ -50,13 +50,13 @@ export class b_spline_curve extends bounded_curve {
50
50
  }
51
51
  get closed_curve() {
52
52
  if (this.closed_curve_ === void 0) {
53
- this.closed_curve_ = this.extractBoolean(4, 1, 4, false);
53
+ this.closed_curve_ = this.extractLogical(4, 1, 4, false);
54
54
  }
55
55
  return this.closed_curve_;
56
56
  }
57
57
  get self_intersect() {
58
58
  if (this.self_intersect_ === void 0) {
59
- this.self_intersect_ = this.extractBoolean(5, 1, 4, false);
59
+ this.self_intersect_ = this.extractLogical(5, 1, 4, false);
60
60
  }
61
61
  return this.self_intersect_;
62
62
  }
@@ -18,9 +18,9 @@ export declare class b_spline_surface extends bounded_surface {
18
18
  get v_degree(): number;
19
19
  get control_points_list(): Array<Array<cartesian_point>>;
20
20
  get surface_form(): b_spline_surface_form;
21
- get u_closed(): boolean;
22
- get v_closed(): boolean;
23
- get self_intersect(): boolean;
21
+ get u_closed(): boolean | null;
22
+ get v_closed(): boolean | null;
23
+ get self_intersect(): boolean | null;
24
24
  get u_upper(): number;
25
25
  get v_upper(): number;
26
26
  get control_points(): Array<Array<cartesian_point>>;