@bldrs-ai/conway 1.560.1539 → 1.566.1541

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.
@@ -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.560.1539";
33
+ var versionString = "Conway v1.566.1541";
34
34
 
35
35
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
36
36
  var wasmType = "";
@@ -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.560.1539";
14968
+ var versionString = "Conway v1.566.1541";
14969
14969
 
14970
14970
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
14971
14971
  function pThreadsAllowed() {
@@ -89338,6 +89338,9 @@ var FACES_FIELD_DEPTH = 4;
89338
89338
  var REL_AGGREGATES_RELATED_OFFSET = 5;
89339
89339
  var REL_AGGREGATES_RELATED_BASE = 4;
89340
89340
  var REL_AGGREGATES_RELATED_DEPTH = 3;
89341
+ var REL_AGGREGATES_RELATING_OFFSET = 4;
89342
+ var REL_AGGREGATES_RELATING_BASE = 4;
89343
+ var REL_AGGREGATES_RELATING_DEPTH = 3;
89341
89344
  var REL_ASSOCIATES_RELATED_OFFSET = 4;
89342
89345
  var REL_ASSOCIATES_RELATED_BASE = 4;
89343
89346
  var REL_ASSOCIATES_RELATED_DEPTH = 2;
@@ -93909,23 +93912,67 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
93909
93912
  return !isFace(id) && typeID !== entity_types_ifc_gen_default.IFCPOLYGONALFACESET && typeID !== entity_types_ifc_gen_default.IFCTRIANGULATEDFACESET;
93910
93913
  };
93911
93914
  const claimed = /* @__PURE__ */ new Set();
93912
- const visited = await this.model.ensureResidentClosureByLocalID(localID, extra, seen, descend, leafSpans, isFace, claimed);
93915
+ let visited;
93916
+ try {
93917
+ visited = await this.model.ensureResidentClosureByLocalID(localID, extra, seen, descend, leafSpans, isFace, claimed);
93918
+ } catch (error) {
93919
+ if (seen !== void 0) {
93920
+ try {
93921
+ await this.pageStyleSeeds_(localID, claimed, seen, descend, isFace, leafSpans);
93922
+ } catch {
93923
+ }
93924
+ }
93925
+ throw error;
93926
+ }
93927
+ await this.pageStyleSeeds_(localID, claimed, visited, descend, isFace, leafSpans);
93928
+ await this.ensureResidentVisitedFacesetPayloads_(claimed, visited, leafSpans);
93929
+ return visited;
93930
+ }
93931
+ /**
93932
+ * Page the styled-item and material-definition records seeded by
93933
+ * `claimed` — the records ONE closure walk actually paged — so the
93934
+ * synchronous extract that follows can read them.
93935
+ *
93936
+ * `claimed`, not the walk's returned set: the walk returns the CALLER'S
93937
+ * set, which the aggregate prefetch shares across every related product
93938
+ * of one IfcRelAggregates (see ensureResidentForAggregateExtract).
93939
+ * Scanning that per product is O(products x model), not O(product) — on
93940
+ * SKYLARK250 (1,992 products under two relationships, ~3,000 records of
93941
+ * closure each) it reaches ~6 M lookups on the last product and costs
93942
+ * minutes before the first mesh, inside one un-yielding await chain
93943
+ * (conway#561). Every record lands in exactly one walk's `claimed`, so
93944
+ * the union of seeds collected across the walks sharing a set is
93945
+ * unchanged; only the repetition goes. Same distinction conway#526 drew
93946
+ * for {@link ensureResidentVisitedFacesetPayloads_}.
93947
+ *
93948
+ * That "exactly one walk" holds only for walks that COMPLETE, which is
93949
+ * why the aborted path calls this too — see the catch in
93950
+ * {@link ensureResidentForProductExtractUnguarded_}.
93951
+ *
93952
+ * @param localID The product whose walk claimed these records.
93953
+ * @param claimed Records this walk paged.
93954
+ * @param seen The set the walk pinned through, extended by this one.
93955
+ * @param descend Closure-walk descent predicate.
93956
+ * @param isFace Closure-walk packed-leaf predicate.
93957
+ * @param leafSpans Optional out-array of coalesced pin ranges.
93958
+ * @return {Promise<void>} Resolves when the seeds are resident.
93959
+ */
93960
+ async pageStyleSeeds_(localID, claimed, seen, descend, isFace, leafSpans) {
93913
93961
  const styleExtra = [];
93914
- for (const visitedID of visited) {
93915
- const styled = this.materials.styledItemMap.get(visitedID);
93962
+ for (const claimedID of claimed) {
93963
+ const styled = this.materials.styledItemMap.get(claimedID);
93916
93964
  if (styled !== void 0) {
93917
93965
  styleExtra.push(styled);
93918
93966
  }
93919
- const definition = this.materials.materialDefinitionsMap.get(visitedID);
93967
+ const definition = this.materials.materialDefinitionsMap.get(claimedID);
93920
93968
  if (definition !== void 0) {
93921
93969
  styleExtra.push(definition);
93922
93970
  }
93923
93971
  }
93924
- if (styleExtra.length > 0) {
93925
- await this.model.ensureResidentClosureByLocalID(localID, styleExtra, visited, descend, leafSpans, isFace, claimed);
93972
+ if (styleExtra.length === 0) {
93973
+ return;
93926
93974
  }
93927
- await this.ensureResidentVisitedFacesetPayloads_(claimed, visited, leafSpans);
93928
- return visited;
93975
+ await this.model.ensureResidentClosureByLocalID(localID, styleExtra, seen, descend, leafSpans, isFace, claimed);
93929
93976
  }
93930
93977
  /**
93931
93978
  * Page a faceset's Coordinates record and its Faces[] run as one
@@ -93987,7 +94034,16 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
93987
94034
  * acquire: the relationship, the relating product (and its voids)
93988
94035
  * and every related product.
93989
94036
  *
94037
+ * The whole relationship at once, which is what a caller that extracts
94038
+ * it in one synchronous call needs. A caller that steps the
94039
+ * relationship (the demand pump, through
94040
+ * {@link extractRelAggregateGeometryIncremental}) wants
94041
+ * {@link beginAggregateExtract} instead: this one pins every related
94042
+ * product's closure simultaneously, which on an aggregate-structured
94043
+ * model is the whole file (conway#561 §5).
94044
+ *
93990
94045
  * @param relAggregate The relationship to prefetch.
94046
+ * @param leafSpans Coalesced Faces[] pin ranges — caller unpins.
93991
94047
  * @return {Promise<Set<number>>} Pinned local IDs — caller must unpin
93992
94048
  * after extract.
93993
94049
  */
@@ -93996,11 +94052,163 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
93996
94052
  return /* @__PURE__ */ new Set();
93997
94053
  }
93998
94054
  const pinned = /* @__PURE__ */ new Set();
93999
- const hop = [];
94055
+ await this.ensureResidentForAggregateBase(relAggregate, pinned, leafSpans);
94056
+ const products = this.relatedAggregateProductLocalIDs(relAggregate);
94057
+ if (products === void 0) {
94058
+ await this.ensureResidentForRelatedObjectsByGetter(relAggregate, pinned, leafSpans);
94059
+ return pinned;
94060
+ }
94061
+ await this.ensureResidentForAggregateProducts(products, 0, products.length, pinned, leafSpans);
94062
+ return pinned;
94063
+ }
94064
+ /**
94065
+ * The part of an aggregate prefetch that has to be resident for the
94066
+ * WHOLE relationship: the relationship record itself and the relating
94067
+ * product's closure (its rel-voids become the master override every
94068
+ * related product is cut with).
94069
+ *
94070
+ * Only the RELATING object's record is paged ahead of the getter that
94071
+ * hydrates it, deliberately — not the relationship's whole 1-hop, which
94072
+ * is what this used to do. On a model whose products are all aggregate
94073
+ * targets the 1-hop is every related product's record, scattered the
94074
+ * length of the file, so pinning it pins essentially every chunk before
94075
+ * a single mesh exists: 384 MiB held against a 64 MiB window on
94076
+ * SKYLARK250 (conway#561 §5). The related records are paged by the
94077
+ * caller instead, per product or per wave.
94078
+ *
94079
+ * Seam for {@link AggregateExtractPager}, which lives in this module.
94080
+ *
94081
+ * @param relAggregate The relationship to prefetch.
94082
+ * @param pinned Set to extend — caller unpins.
94083
+ * @param leafSpans Coalesced Faces[] pin ranges — caller unpins.
94084
+ * @return {Promise<void>} Resolves when the base is resident.
94085
+ */
94086
+ async ensureResidentForAggregateBase(relAggregate, pinned, leafSpans) {
94087
+ if (!this.model.isSourceExternal) {
94088
+ return;
94089
+ }
94000
94090
  this.model.pinByLocalID(relAggregate.localID);
94001
94091
  pinned.add(relAggregate.localID);
94092
+ await this.model.ensureResidentByLocalID(relAggregate.localID);
94093
+ const relatingLocalID = relAggregate.extractReferenceLocalID(REL_AGGREGATES_RELATING_OFFSET, REL_AGGREGATES_RELATING_BASE, REL_AGGREGATES_RELATING_DEPTH, true);
94094
+ if (relatingLocalID !== null) {
94095
+ this.model.pinByLocalID(relatingLocalID);
94096
+ await this.model.ensureResidentByLocalID(relatingLocalID);
94097
+ }
94098
+ try {
94099
+ const relating = relAggregate.RelatingObject;
94100
+ if (relating !== null && relating !== void 0) {
94101
+ await this.ensureResidentForProductExtract(relating.localID, pinned, leafSpans);
94102
+ }
94103
+ } finally {
94104
+ if (relatingLocalID !== null) {
94105
+ this.model.unpinByLocalID(relatingLocalID);
94106
+ }
94107
+ }
94108
+ }
94109
+ /**
94110
+ * The local IDs one relationship's aggregates pass will actually extract:
94111
+ * its RelatedObjects that are `IfcProduct`s, in record order.
94112
+ *
94113
+ * The n-th entry is the product
94114
+ * {@link extractRelAggregateGeometryIncremental} extracts for its n-th
94115
+ * yield — that pass materialises every related object, extracts and
94116
+ * yields for the ones that are products, and walks past the rest. So a
94117
+ * prefetch keyed on this list is in exact lockstep with the stepper, and
94118
+ * a run of non-products between two products costs it nothing.
94119
+ *
94120
+ * **Non-products are dropped, not skipped-but-paged.** Deciding an entry
94121
+ * is not a product costs no source bytes: `getTypedElementByExpressID`
94122
+ * builds its descriptor from the columns, and only
94123
+ * {@link extractProductGeometry} — products only — reads a record. Swept
94124
+ * that exact path (materialise as `IfcObjectDefinition`, test
94125
+ * `instanceof IfcProduct`) over every record of SKYLARK250 (7,818,778),
94126
+ * SEESTRASSE (294,704) and the whole in-repo corpus behind a deliberately
94127
+ * exhausted 4 KiB x 4 window: 0 throws, 0 store bytes read. Paging a
94128
+ * non-product's closure is therefore work that serves nothing — and it is
94129
+ * unbounded work, because a wave that had to span a run of them would
94130
+ * page the whole run at once, `waveSize` notwithstanding (conway#566
94131
+ * review). An `IfcTypeObject` carrying `RepresentationMaps` measures
94132
+ * 1,607 records of closure on its own.
94133
+ *
94134
+ * Classification goes through {@link relatedProductByExpressID_}, the same
94135
+ * call the pass itself makes — one test rather than two that have to
94136
+ * agree. A typeID-column test does NOT agree: a STEP complex instance is
94137
+ * recorded as type 0 (`EXTERNALMAPPINGCONTAINER`) while the pass finds the
94138
+ * `IfcProduct` among its `multiMapping` variants, and the product would
94139
+ * then be extracted without ever being paged (conway#566 review).
94140
+ *
94141
+ * Note {@link aggregateTargetLocalIDs} still reads the column, and has the
94142
+ * same blind spot — a complex product is not deferred, so it is extracted
94143
+ * by both passes. That is pre-existing and independent of paging: it costs
94144
+ * a duplicate extraction, not a non-resident read.
94145
+ *
94146
+ * Seam for {@link AggregateExtractPager}, which lives in this module.
94147
+ *
94148
+ * @param relAggregate The relationship to read.
94149
+ * @return {number[] | undefined} The related products' local IDs, or
94150
+ * undefined when the list holds something only the generated getter can
94151
+ * resolve (see {@link relatedObjectExpressIDs_}).
94152
+ */
94153
+ relatedAggregateProductLocalIDs(relAggregate) {
94154
+ const relatedExpressIDs = this.relatedObjectExpressIDs_(relAggregate);
94155
+ if (relatedExpressIDs === void 0) {
94156
+ return void 0;
94157
+ }
94158
+ const productLocalIDs = [];
94159
+ for (const relatedExpressID of relatedExpressIDs) {
94160
+ let relatedProduct;
94161
+ try {
94162
+ relatedProduct = this.relatedProductByExpressID_(relatedExpressID);
94163
+ } catch {
94164
+ break;
94165
+ }
94166
+ if (relatedProduct !== void 0) {
94167
+ productLocalIDs.push(relatedProduct.localID);
94168
+ }
94169
+ }
94170
+ return productLocalIDs;
94171
+ }
94172
+ /**
94173
+ * Page the closures of a contiguous run of
94174
+ * {@link relatedAggregateProductLocalIDs} entries.
94175
+ *
94176
+ * Seam for {@link AggregateExtractPager}, which lives in this module.
94177
+ *
94178
+ * @param productLocalIDs The related products, in record order.
94179
+ * @param from First index to page.
94180
+ * @param to One past the last index to page.
94181
+ * @param pinned Set to extend — caller unpins.
94182
+ * @param leafSpans Coalesced Faces[] pin ranges — caller unpins.
94183
+ * @return {Promise<void>} Resolves when the run is resident.
94184
+ */
94185
+ async ensureResidentForAggregateProducts(productLocalIDs, from, to, pinned, leafSpans) {
94186
+ for (let where = from; where < to; ++where) {
94187
+ await this.ensureResidentForProductExtract(productLocalIDs[where], pinned, leafSpans);
94188
+ }
94189
+ }
94190
+ /**
94191
+ * Whole-relationship prefetch for a RelatedObjects list that
94192
+ * {@link relatedAggregateProductLocalIDs} could not read as references — an
94193
+ * inline entity, `$` or junk.
94194
+ *
94195
+ * Only the generated getter can resolve (or reject) such a list, and it
94196
+ * materialises the whole array at once, so there is no per-entry cursor
94197
+ * to page against: this path keeps the pre-#561 shape, whole 1-hop and
94198
+ * all, because it is the one case that genuinely cannot be paged
94199
+ * incrementally. It is also the path that needs the 1-hop pinned — the
94200
+ * getter reads every related record while it materialises them.
94201
+ *
94202
+ * Seam for {@link AggregateExtractPager}, which lives in this module.
94203
+ *
94204
+ * @param relAggregate The relationship to prefetch.
94205
+ * @param pinned Set to extend — caller unpins.
94206
+ * @param leafSpans Coalesced Faces[] pin ranges — caller unpins.
94207
+ * @return {Promise<void>} Resolves when the relationship is resident.
94208
+ */
94209
+ async ensureResidentForRelatedObjectsByGetter(relAggregate, pinned, leafSpans) {
94210
+ const hop = [];
94002
94211
  try {
94003
- await this.model.ensureResidentByLocalID(relAggregate.localID);
94004
94212
  for (const expressID of this.model.referencedExpressIDs(relAggregate.localID)) {
94005
94213
  const localID = this.model.resolveExpressID(expressID);
94006
94214
  if (localID === void 0 || pinned.has(localID)) {
@@ -94010,34 +94218,37 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
94010
94218
  hop.push(localID);
94011
94219
  await this.model.ensureResidentByLocalID(localID);
94012
94220
  }
94013
- const relating = relAggregate.RelatingObject;
94014
- if (relating !== null && relating !== void 0) {
94015
- await this.ensureResidentForProductExtract(relating.localID, pinned, leafSpans);
94016
- }
94017
- const relatedExpressIDs = this.relatedObjectExpressIDs_(relAggregate);
94018
- if (relatedExpressIDs === void 0) {
94019
- const related = relAggregate.RelatedObjects;
94020
- if (related !== null && related !== void 0) {
94021
- for (const product of related) {
94022
- await this.ensureResidentForProductExtract(product.localID, pinned, leafSpans);
94023
- }
94024
- }
94025
- } else {
94026
- for (const relatedExpressID of relatedExpressIDs) {
94027
- const relatedLocalID = this.model.resolveExpressID(relatedExpressID);
94028
- if (relatedLocalID === void 0) {
94029
- continue;
94030
- }
94031
- await this.ensureResidentForProductExtract(relatedLocalID, pinned, leafSpans);
94221
+ const related = relAggregate.RelatedObjects;
94222
+ if (related !== null && related !== void 0) {
94223
+ for (const product of related) {
94224
+ await this.ensureResidentForProductExtract(product.localID, pinned, leafSpans);
94032
94225
  }
94033
94226
  }
94034
- return pinned;
94035
94227
  } finally {
94036
94228
  for (const localID of hop) {
94037
94229
  this.model.unpinByLocalID(localID);
94038
94230
  }
94039
94231
  }
94040
94232
  }
94233
+ /**
94234
+ * Begin a WAVE-PAGED residency for one relationship, for a caller that
94235
+ * steps it through {@link extractRelAggregateGeometryIncremental}.
94236
+ *
94237
+ * The windowed twin of {@link ensureResidentForAggregateExtract}: same
94238
+ * records, paged a wave at a time as the stepper reaches them and
94239
+ * released a wave at a time behind it, instead of all of them before the
94240
+ * first step. See {@link AggregateExtractPager}.
94241
+ *
94242
+ * @param relAggregate The relationship to prefetch.
94243
+ * @param waveSize Related products paged and held at once.
94244
+ * @return {Promise<AggregateExtractPager>} The paging handle — caller
94245
+ * must {@link AggregateExtractPager.release} it.
94246
+ */
94247
+ async beginAggregateExtract(relAggregate, waveSize = _IfcGeometryExtraction.AGGREGATE_PREFETCH_WAVE_SIZE_) {
94248
+ const pager = new AggregateExtractPager(this, relAggregate, waveSize);
94249
+ await pager.begin();
94250
+ return pager;
94251
+ }
94041
94252
  /**
94042
94253
  * The whole-model walk's SECOND product pass, shared with the demand
94043
94254
  * pump: for every IfcRelAggregates, re-extract the related products
@@ -94096,6 +94307,47 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
94096
94307
  });
94097
94308
  return allReferences ? expressIDs : void 0;
94098
94309
  }
94310
+ /**
94311
+ * How the rel-aggregates pass classifies ONE `RelatedObjects` entry: the
94312
+ * product it will extract, or undefined for an entry it walks past.
94313
+ *
94314
+ * **The single definition of "is this related object a product".** Both
94315
+ * the pass itself ({@link extractRelAggregateGeometryIncremental}) and the
94316
+ * prefetch that has to page ahead of it
94317
+ * ({@link relatedAggregateProductLocalIDs}) go through here, so they
94318
+ * cannot disagree — which they did, twice, when the prefetch derived its
94319
+ * own answer from the typeID column. A STEP complex/external-mapping
94320
+ * instance is the case that breaks a column test: the parser records the
94321
+ * container as type 0 (`EXTERNALMAPPINGCONTAINER`, see step_parser.ts)
94322
+ * while `getTypedElementByExpressID` searches the entry's `multiMapping`
94323
+ * variants and hands back the `IfcProduct` among them. On a windowed
94324
+ * source a prefetch that missed one would leave the pass reading a
94325
+ * non-resident record, and its permissive catch abandons the REST of the
94326
+ * relationship — geometry lost with a log line, not an error
94327
+ * (conway#566 review).
94328
+ *
94329
+ * Materialising the entry is what makes the two agree, and it is cheap:
94330
+ * `getTypedElementByExpressID` builds from the columns and reads no
94331
+ * source bytes. Measured by sweeping this exact call over every record of
94332
+ * SKYLARK250 (7,818,778), SEESTRASSE (294,704) and the in-repo corpus
94333
+ * behind a deliberately exhausted 4 KiB x 4 window — 0 throws, 0 store
94334
+ * bytes. The pass materialises every entry anyway; the prefetch just
94335
+ * reaches them first.
94336
+ *
94337
+ * @param relatedExpressID The RelatedObjects entry to classify.
94338
+ * @throws {Error} When the reference resolves to nothing, or to something
94339
+ * that is not an `IfcObjectDefinition` — what the generated getter throws
94340
+ * for the same entry, and what the pass has always thrown here.
94341
+ * @return {IfcProduct | undefined} The product to extract, or undefined
94342
+ * for a related object that is not one.
94343
+ */
94344
+ relatedProductByExpressID_(relatedExpressID) {
94345
+ const relatedObject = this.model.getTypedElementByExpressID(relatedExpressID, IfcObjectDefinition);
94346
+ if (relatedObject === void 0) {
94347
+ throw new Error("Value in STEP was incorrectly typed");
94348
+ }
94349
+ return relatedObject instanceof IfcProduct ? relatedObject : void 0;
94350
+ }
94099
94351
  /**
94100
94352
  * Extract one IfcRelAggregates' related products with the relating
94101
94353
  * object's ("master") rel-voids — the shared per-item body of the
@@ -94155,12 +94407,9 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
94155
94407
  }
94156
94408
  } else {
94157
94409
  for (const relatedExpressID of relatedExpressIDs) {
94158
- const relatedObject = this.model.getTypedElementByExpressID(relatedExpressID, IfcObjectDefinition);
94159
- if (relatedObject === void 0) {
94160
- throw new Error("Value in STEP was incorrectly typed");
94161
- }
94162
- if (relatedObject instanceof IfcProduct) {
94163
- this.extractProductGeometry(relatedObject, masterRelVoids);
94410
+ const relatedProduct = this.relatedProductByExpressID_(relatedExpressID);
94411
+ if (relatedProduct !== void 0) {
94412
+ this.extractProductGeometry(relatedProduct, masterRelVoids);
94164
94413
  yield ++extractedCount;
94165
94414
  }
94166
94415
  }
@@ -94432,6 +94681,98 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
94432
94681
  }
94433
94682
  };
94434
94683
  IfcGeometryExtraction.AGGREGATE_TARGET_WAVE_SIZE_ = 512;
94684
+ IfcGeometryExtraction.AGGREGATE_PREFETCH_WAVE_SIZE_ = 8;
94685
+ var AggregateExtractPager = class {
94686
+ /**
94687
+ * Construct paging for one relationship.
94688
+ *
94689
+ * @param extraction_ The extraction whose model is being paged.
94690
+ * @param relAggregate_ The relationship this pages for.
94691
+ * @param waveSize Related products paged and held at once.
94692
+ */
94693
+ constructor(extraction_, relAggregate_, waveSize) {
94694
+ this.extraction_ = extraction_;
94695
+ this.relAggregate_ = relAggregate_;
94696
+ this.basePins_ = /* @__PURE__ */ new Set();
94697
+ this.baseSpans_ = [];
94698
+ this.wavePins_ = /* @__PURE__ */ new Set();
94699
+ this.waveSpans_ = [];
94700
+ this.waveStart_ = 0;
94701
+ this.pagedThrough_ = 0;
94702
+ this.released_ = false;
94703
+ this.waveSize_ = Math.max(1, Math.floor(waveSize));
94704
+ }
94705
+ /**
94706
+ * Page what has to be resident for every step of this relationship.
94707
+ *
94708
+ * @return {Promise<void>} Resolves when the base is resident.
94709
+ */
94710
+ async begin() {
94711
+ if (!this.extraction_.model.isSourceExternal) {
94712
+ return;
94713
+ }
94714
+ await this.extraction_.ensureResidentForAggregateBase(this.relAggregate_, this.basePins_, this.baseSpans_);
94715
+ this.products_ = this.extraction_.relatedAggregateProductLocalIDs(this.relAggregate_);
94716
+ if (this.products_ !== void 0) {
94717
+ return;
94718
+ }
94719
+ await this.extraction_.ensureResidentForRelatedObjectsByGetter(this.relAggregate_, this.basePins_, this.baseSpans_);
94720
+ }
94721
+ /**
94722
+ * Make the product the stepper extracts for yield `step` resident,
94723
+ * rolling the wave forward if it does not already cover it.
94724
+ *
94725
+ * At most `waveSize` product closures are pinned at any moment, whatever
94726
+ * the related-object list holds between them.
94727
+ *
94728
+ * @param step Zero-based index of the stepper's next yield.
94729
+ * @return {Promise<void>} Resolves when that product is resident.
94730
+ */
94731
+ async ensureForStep(step) {
94732
+ const products = this.products_;
94733
+ if (products === void 0 || step >= products.length) {
94734
+ return;
94735
+ }
94736
+ if (step < this.pagedThrough_) {
94737
+ return;
94738
+ }
94739
+ this.releaseWave_();
94740
+ this.waveStart_ = step;
94741
+ this.pagedThrough_ = Math.min(products.length, step + this.waveSize_);
94742
+ await this.extraction_.ensureResidentForAggregateProducts(products, this.waveStart_, this.pagedThrough_, this.wavePins_, this.waveSpans_);
94743
+ }
94744
+ /**
94745
+ * Drop every pin this holds. Idempotent.
94746
+ */
94747
+ release() {
94748
+ if (this.released_) {
94749
+ return;
94750
+ }
94751
+ this.released_ = true;
94752
+ this.releaseWave_();
94753
+ const model = this.extraction_.model;
94754
+ model.releaseSourceViews(this.basePins_);
94755
+ model.unpinLocalIDs(this.basePins_);
94756
+ this.basePins_.clear();
94757
+ for (const span of this.baseSpans_) {
94758
+ model.unpinAddressRange(span.address, span.length);
94759
+ }
94760
+ this.baseSpans_.length = 0;
94761
+ }
94762
+ /**
94763
+ * Drop the current wave's pins and views.
94764
+ */
94765
+ releaseWave_() {
94766
+ const model = this.extraction_.model;
94767
+ model.releaseSourceViews(this.wavePins_);
94768
+ model.unpinLocalIDs(this.wavePins_);
94769
+ for (const span of this.waveSpans_) {
94770
+ model.unpinAddressRange(span.address, span.length);
94771
+ }
94772
+ this.wavePins_ = /* @__PURE__ */ new Set();
94773
+ this.waveSpans_ = [];
94774
+ }
94775
+ };
94435
94776
 
94436
94777
  // compiled/src/ifc/ifc_property_extraction.js
94437
94778
  var PropertyExtractResult;
@@ -15943,7 +15943,7 @@ var ParsingBuffer = class {
15943
15943
  };
15944
15944
 
15945
15945
  // compiled/src/version/version.js
15946
- var versionString = "Conway v1.560.1539";
15946
+ var versionString = "Conway v1.566.1541";
15947
15947
 
15948
15948
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
15949
15949
  function pThreadsAllowed() {
@@ -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.560.1539";
947
+ var versionString = "Conway v1.566.1541";
948
948
 
949
949
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
950
950
  var wasmType = "";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=aggregate_prefetch_paging.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate_prefetch_paging.test.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/aggregate_prefetch_paging.test.ts"],"names":[],"mappings":""}