@bldrs-ai/conway 1.529.1492 → 1.530.1503

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 (51) hide show
  1. package/compiled/examples/browser-bundled.cjs +19 -19
  2. package/compiled/examples/cli-bundled.cjs +19 -19
  3. package/compiled/examples/cli-step-bundled.cjs +17 -15
  4. package/compiled/examples/validator-bundled.cjs +19 -19
  5. package/compiled/src/ifc/ifc_spatial_skeleton.d.ts +145 -0
  6. package/compiled/src/ifc/ifc_spatial_skeleton.d.ts.map +1 -0
  7. package/compiled/src/ifc/ifc_spatial_skeleton.js +266 -0
  8. package/compiled/src/ifc/ifc_spatial_skeleton.test.d.ts +2 -0
  9. package/compiled/src/ifc/ifc_spatial_skeleton.test.d.ts.map +1 -0
  10. package/compiled/src/ifc/ifc_spatial_skeleton.test.js +199 -0
  11. package/compiled/src/ifc/ifc_stream_open.d.ts +41 -5
  12. package/compiled/src/ifc/ifc_stream_open.d.ts.map +1 -1
  13. package/compiled/src/ifc/ifc_stream_open.js +29 -2
  14. package/compiled/src/ifc/ifc_stream_open.test.js +26 -1
  15. package/compiled/src/index.d.ts +7 -3
  16. package/compiled/src/index.d.ts.map +1 -1
  17. package/compiled/src/index.js +6 -2
  18. package/compiled/src/namespace_surface.test.js +6 -1
  19. package/compiled/src/step/parsing/prefix_type_index.d.ts +124 -0
  20. package/compiled/src/step/parsing/prefix_type_index.d.ts.map +1 -0
  21. package/compiled/src/step/parsing/prefix_type_index.js +207 -0
  22. package/compiled/src/step/parsing/prefix_type_index.test.d.ts +2 -0
  23. package/compiled/src/step/parsing/prefix_type_index.test.d.ts.map +1 -0
  24. package/compiled/src/step/parsing/prefix_type_index.test.js +298 -0
  25. package/compiled/src/step/parsing/record_event.d.ts +23 -0
  26. package/compiled/src/step/parsing/record_event.d.ts.map +1 -0
  27. package/compiled/src/step/parsing/record_event.js +1 -0
  28. package/compiled/src/step/parsing/record_field_cursor.d.ts +94 -0
  29. package/compiled/src/step/parsing/record_field_cursor.d.ts.map +1 -0
  30. package/compiled/src/step/parsing/record_field_cursor.js +189 -0
  31. package/compiled/src/step/parsing/step_parser.d.ts +9 -6
  32. package/compiled/src/step/parsing/step_parser.d.ts.map +1 -1
  33. package/compiled/src/step/parsing/step_parser.js +21 -14
  34. package/compiled/src/step/parsing/streaming_index_builder.d.ts +13 -5
  35. package/compiled/src/step/parsing/streaming_index_builder.d.ts.map +1 -1
  36. package/compiled/src/step/parsing/streaming_index_builder.js +9 -4
  37. package/compiled/src/step/parsing/streaming_record_dispatcher.d.ts +24 -8
  38. package/compiled/src/step/parsing/streaming_record_dispatcher.d.ts.map +1 -1
  39. package/compiled/src/step/parsing/streaming_record_dispatcher.js +34 -13
  40. package/compiled/src/stream/index.d.ts +12 -5
  41. package/compiled/src/stream/index.d.ts.map +1 -1
  42. package/compiled/src/stream/index.js +11 -4
  43. package/compiled/src/version/version.js +1 -1
  44. package/compiled/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +1 -1
  46. package/compiled/src/step/parsing/incremental_type_index.d.ts +0 -64
  47. package/compiled/src/step/parsing/incremental_type_index.d.ts.map +0 -1
  48. package/compiled/src/step/parsing/incremental_type_index.js +0 -92
  49. package/compiled/src/step/parsing/incremental_type_index.test.d.ts +0 -2
  50. package/compiled/src/step/parsing/incremental_type_index.test.d.ts.map +0 -1
  51. package/compiled/src/step/parsing/incremental_type_index.test.js +0 -55
@@ -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.529.1492";
33
+ var versionString = "Conway v1.530.1503";
34
34
 
35
35
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
36
36
  var wasmType = "";
@@ -2626,10 +2626,12 @@ var StepParser = class extends StepHeaderParser {
2626
2626
  * buffer; the callback may rebase the buffer's window in place. Must be
2627
2627
  * synchronous on this driver — a returned Promise is a caller bug.
2628
2628
  * @param onRecordIndexed Called as each top-level record is indexed, with
2629
- * its localID, expressID and typeID (0 for external-mapping records) — the
2630
- * seam for incremental semantic consumers (type index, roots registry,
2631
- * names skeleton). Must be synchronous and cheap; expensive work belongs on
2632
- * a demand queue, not the parse path.
2629
+ * its localID, expressID, typeID (0 for external-mapping records) and the
2630
+ * record's bytes as an un-materialised `(buffer, byteOffset, byteLength)`
2631
+ * window view — the seam for incremental semantic consumers (type index,
2632
+ * roots registry, names skeleton). See {@link RecordEventHandler} for the
2633
+ * window-lifetime rule. Must be synchronous and cheap; expensive work
2634
+ * belongs on a demand queue, not the parse path.
2633
2635
  * @param onProgress Optional byte-cursor progress callback.
2634
2636
  * @return {BlockParseResult} The parsing result, including the index and result enum.
2635
2637
  */
@@ -2913,11 +2915,6 @@ var StepParser = class extends StepHeaderParser {
2913
2915
  if (!charws(SEMICOLON)) {
2914
2916
  return syntaxError();
2915
2917
  }
2916
- {
2917
- const recordLen = input2.address - startElement2;
2918
- onRecordIndexed?.(topLevelCount, expressID, 0, input2.buffer.subarray(input2.cursor - recordLen, input2.cursor));
2919
- }
2920
- ++topLevelCount;
2921
2918
  pushEntry({
2922
2919
  address: startElement2,
2923
2920
  length: input2.address - startElement2,
@@ -2927,6 +2924,11 @@ var StepParser = class extends StepHeaderParser {
2927
2924
  inlineEntities: inlineElements,
2928
2925
  multiMapping: multiElements
2929
2926
  });
2927
+ {
2928
+ const recordLen = input2.address - startElement2;
2929
+ onRecordIndexed?.(topLevelCount, expressID, 0, input2.buffer, input2.cursor - recordLen, recordLen);
2930
+ }
2931
+ ++topLevelCount;
2930
2932
  multiElements = void 0;
2931
2933
  continue;
2932
2934
  }
@@ -3006,11 +3008,6 @@ var StepParser = class extends StepHeaderParser {
3006
3008
  if (!charws(SEMICOLON)) {
3007
3009
  return syntaxError();
3008
3010
  }
3009
- {
3010
- const recordLen = input2.address - startElement;
3011
- onRecordIndexed?.(topLevelCount, expressID, foundItem, input2.buffer.subarray(input2.cursor - recordLen, input2.cursor));
3012
- }
3013
- ++topLevelCount;
3014
3011
  pushEntry({
3015
3012
  address: startElement,
3016
3013
  length: input2.address - startElement,
@@ -3018,6 +3015,11 @@ var StepParser = class extends StepHeaderParser {
3018
3015
  expressID,
3019
3016
  inlineEntities: inlineElements
3020
3017
  });
3018
+ {
3019
+ const recordLen = input2.address - startElement;
3020
+ onRecordIndexed?.(topLevelCount, expressID, foundItem, input2.buffer, input2.cursor - recordLen, recordLen);
3021
+ }
3022
+ ++topLevelCount;
3021
3023
  }
3022
3024
  return parseResult2(ParseResult.INCOMPLETE);
3023
3025
  }
@@ -72163,13 +72165,11 @@ async function buildIndexStreamingAsync(source, parser211, pool3, onRecordIndexe
72163
72165
  };
72164
72166
  }
72165
72167
  }
72166
- function buildColumnarIndexStreaming(source, parser211, pool3, onRecordIndexed) {
72167
- const sink = new ColumnarIndexSink();
72168
+ function buildColumnarIndexStreaming(source, parser211, pool3, onRecordIndexed, sink = new ColumnarIndexSink()) {
72168
72169
  const { header, result, stats } = buildIndexStreaming(source, parser211, pool3, onRecordIndexed, sink);
72169
72170
  return { header, columns: sink.finalize(), result, stats };
72170
72171
  }
72171
- async function buildColumnarIndexStreamingAsync(source, parser211, pool3, onRecordIndexed, onProgress, yieldIntervalMs) {
72172
- const sink = new ColumnarIndexSink();
72172
+ async function buildColumnarIndexStreamingAsync(source, parser211, pool3, onRecordIndexed, onProgress, yieldIntervalMs, sink = new ColumnarIndexSink()) {
72173
72173
  const { header, result, stats } = await buildIndexStreamingAsync(source, parser211, pool3, onRecordIndexed, sink, onProgress, yieldIntervalMs);
72174
72174
  return { header, columns: sink.finalize(), result, stats };
72175
72175
  }
@@ -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.529.1492";
14968
+ var versionString = "Conway v1.530.1503";
14969
14969
 
14970
14970
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
14971
14971
  function pThreadsAllowed() {
@@ -18462,10 +18462,12 @@ var StepParser = class extends StepHeaderParser {
18462
18462
  * buffer; the callback may rebase the buffer's window in place. Must be
18463
18463
  * synchronous on this driver — a returned Promise is a caller bug.
18464
18464
  * @param onRecordIndexed Called as each top-level record is indexed, with
18465
- * its localID, expressID and typeID (0 for external-mapping records) — the
18466
- * seam for incremental semantic consumers (type index, roots registry,
18467
- * names skeleton). Must be synchronous and cheap; expensive work belongs on
18468
- * a demand queue, not the parse path.
18465
+ * its localID, expressID, typeID (0 for external-mapping records) and the
18466
+ * record's bytes as an un-materialised `(buffer, byteOffset, byteLength)`
18467
+ * window view — the seam for incremental semantic consumers (type index,
18468
+ * roots registry, names skeleton). See {@link RecordEventHandler} for the
18469
+ * window-lifetime rule. Must be synchronous and cheap; expensive work
18470
+ * belongs on a demand queue, not the parse path.
18469
18471
  * @param onProgress Optional byte-cursor progress callback.
18470
18472
  * @return {BlockParseResult} The parsing result, including the index and result enum.
18471
18473
  */
@@ -18749,11 +18751,6 @@ var StepParser = class extends StepHeaderParser {
18749
18751
  if (!charws(SEMICOLON)) {
18750
18752
  return syntaxError();
18751
18753
  }
18752
- {
18753
- const recordLen = input.address - startElement2;
18754
- onRecordIndexed?.(topLevelCount, expressID, 0, input.buffer.subarray(input.cursor - recordLen, input.cursor));
18755
- }
18756
- ++topLevelCount;
18757
18754
  pushEntry({
18758
18755
  address: startElement2,
18759
18756
  length: input.address - startElement2,
@@ -18763,6 +18760,11 @@ var StepParser = class extends StepHeaderParser {
18763
18760
  inlineEntities: inlineElements,
18764
18761
  multiMapping: multiElements
18765
18762
  });
18763
+ {
18764
+ const recordLen = input.address - startElement2;
18765
+ onRecordIndexed?.(topLevelCount, expressID, 0, input.buffer, input.cursor - recordLen, recordLen);
18766
+ }
18767
+ ++topLevelCount;
18766
18768
  multiElements = void 0;
18767
18769
  continue;
18768
18770
  }
@@ -18842,11 +18844,6 @@ var StepParser = class extends StepHeaderParser {
18842
18844
  if (!charws(SEMICOLON)) {
18843
18845
  return syntaxError();
18844
18846
  }
18845
- {
18846
- const recordLen = input.address - startElement;
18847
- onRecordIndexed?.(topLevelCount, expressID, foundItem, input.buffer.subarray(input.cursor - recordLen, input.cursor));
18848
- }
18849
- ++topLevelCount;
18850
18847
  pushEntry({
18851
18848
  address: startElement,
18852
18849
  length: input.address - startElement,
@@ -18854,6 +18851,11 @@ var StepParser = class extends StepHeaderParser {
18854
18851
  expressID,
18855
18852
  inlineEntities: inlineElements
18856
18853
  });
18854
+ {
18855
+ const recordLen = input.address - startElement;
18856
+ onRecordIndexed?.(topLevelCount, expressID, foundItem, input.buffer, input.cursor - recordLen, recordLen);
18857
+ }
18858
+ ++topLevelCount;
18857
18859
  }
18858
18860
  return parseResult(ParseResult.INCOMPLETE);
18859
18861
  }
@@ -88131,13 +88133,11 @@ async function buildIndexStreamingAsync(source, parser210, pool3, onRecordIndexe
88131
88133
  };
88132
88134
  }
88133
88135
  }
88134
- function buildColumnarIndexStreaming(source, parser210, pool3, onRecordIndexed) {
88135
- const sink = new ColumnarIndexSink();
88136
+ function buildColumnarIndexStreaming(source, parser210, pool3, onRecordIndexed, sink = new ColumnarIndexSink()) {
88136
88137
  const { header, result, stats } = buildIndexStreaming(source, parser210, pool3, onRecordIndexed, sink);
88137
88138
  return { header, columns: sink.finalize(), result, stats };
88138
88139
  }
88139
- async function buildColumnarIndexStreamingAsync(source, parser210, pool3, onRecordIndexed, onProgress, yieldIntervalMs) {
88140
- const sink = new ColumnarIndexSink();
88140
+ async function buildColumnarIndexStreamingAsync(source, parser210, pool3, onRecordIndexed, onProgress, yieldIntervalMs, sink = new ColumnarIndexSink()) {
88141
88141
  const { header, result, stats } = await buildIndexStreamingAsync(source, parser210, pool3, onRecordIndexed, sink, onProgress, yieldIntervalMs);
88142
88142
  return { header, columns: sink.finalize(), result, stats };
88143
88143
  }
@@ -15943,7 +15943,7 @@ var ParsingBuffer = class {
15943
15943
  };
15944
15944
 
15945
15945
  // compiled/src/version/version.js
15946
- var versionString = "Conway v1.529.1492";
15946
+ var versionString = "Conway v1.530.1503";
15947
15947
 
15948
15948
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
15949
15949
  function pThreadsAllowed() {
@@ -18365,10 +18365,12 @@ var StepParser = class extends StepHeaderParser {
18365
18365
  * buffer; the callback may rebase the buffer's window in place. Must be
18366
18366
  * synchronous on this driver — a returned Promise is a caller bug.
18367
18367
  * @param onRecordIndexed Called as each top-level record is indexed, with
18368
- * its localID, expressID and typeID (0 for external-mapping records) — the
18369
- * seam for incremental semantic consumers (type index, roots registry,
18370
- * names skeleton). Must be synchronous and cheap; expensive work belongs on
18371
- * a demand queue, not the parse path.
18368
+ * its localID, expressID, typeID (0 for external-mapping records) and the
18369
+ * record's bytes as an un-materialised `(buffer, byteOffset, byteLength)`
18370
+ * window view — the seam for incremental semantic consumers (type index,
18371
+ * roots registry, names skeleton). See {@link RecordEventHandler} for the
18372
+ * window-lifetime rule. Must be synchronous and cheap; expensive work
18373
+ * belongs on a demand queue, not the parse path.
18372
18374
  * @param onProgress Optional byte-cursor progress callback.
18373
18375
  * @return {BlockParseResult} The parsing result, including the index and result enum.
18374
18376
  */
@@ -18652,11 +18654,6 @@ var StepParser = class extends StepHeaderParser {
18652
18654
  if (!charws(SEMICOLON)) {
18653
18655
  return syntaxError();
18654
18656
  }
18655
- {
18656
- const recordLen = input.address - startElement2;
18657
- onRecordIndexed?.(topLevelCount, expressID, 0, input.buffer.subarray(input.cursor - recordLen, input.cursor));
18658
- }
18659
- ++topLevelCount;
18660
18657
  pushEntry({
18661
18658
  address: startElement2,
18662
18659
  length: input.address - startElement2,
@@ -18666,6 +18663,11 @@ var StepParser = class extends StepHeaderParser {
18666
18663
  inlineEntities: inlineElements,
18667
18664
  multiMapping: multiElements
18668
18665
  });
18666
+ {
18667
+ const recordLen = input.address - startElement2;
18668
+ onRecordIndexed?.(topLevelCount, expressID, 0, input.buffer, input.cursor - recordLen, recordLen);
18669
+ }
18670
+ ++topLevelCount;
18669
18671
  multiElements = void 0;
18670
18672
  continue;
18671
18673
  }
@@ -18745,11 +18747,6 @@ var StepParser = class extends StepHeaderParser {
18745
18747
  if (!charws(SEMICOLON)) {
18746
18748
  return syntaxError();
18747
18749
  }
18748
- {
18749
- const recordLen = input.address - startElement;
18750
- onRecordIndexed?.(topLevelCount, expressID, foundItem, input.buffer.subarray(input.cursor - recordLen, input.cursor));
18751
- }
18752
- ++topLevelCount;
18753
18750
  pushEntry({
18754
18751
  address: startElement,
18755
18752
  length: input.address - startElement,
@@ -18757,6 +18754,11 @@ var StepParser = class extends StepHeaderParser {
18757
18754
  expressID,
18758
18755
  inlineEntities: inlineElements
18759
18756
  });
18757
+ {
18758
+ const recordLen = input.address - startElement;
18759
+ onRecordIndexed?.(topLevelCount, expressID, foundItem, input.buffer, input.cursor - recordLen, recordLen);
18760
+ }
18761
+ ++topLevelCount;
18760
18762
  }
18761
18763
  return parseResult(ParseResult.INCOMPLETE);
18762
18764
  }
@@ -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.529.1492";
947
+ var versionString = "Conway v1.530.1503";
948
948
 
949
949
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
950
950
  var wasmType = "";
@@ -3540,10 +3540,12 @@ var StepParser = class extends StepHeaderParser {
3540
3540
  * buffer; the callback may rebase the buffer's window in place. Must be
3541
3541
  * synchronous on this driver — a returned Promise is a caller bug.
3542
3542
  * @param onRecordIndexed Called as each top-level record is indexed, with
3543
- * its localID, expressID and typeID (0 for external-mapping records) — the
3544
- * seam for incremental semantic consumers (type index, roots registry,
3545
- * names skeleton). Must be synchronous and cheap; expensive work belongs on
3546
- * a demand queue, not the parse path.
3543
+ * its localID, expressID, typeID (0 for external-mapping records) and the
3544
+ * record's bytes as an un-materialised `(buffer, byteOffset, byteLength)`
3545
+ * window view — the seam for incremental semantic consumers (type index,
3546
+ * roots registry, names skeleton). See {@link RecordEventHandler} for the
3547
+ * window-lifetime rule. Must be synchronous and cheap; expensive work
3548
+ * belongs on a demand queue, not the parse path.
3547
3549
  * @param onProgress Optional byte-cursor progress callback.
3548
3550
  * @return {BlockParseResult} The parsing result, including the index and result enum.
3549
3551
  */
@@ -3827,11 +3829,6 @@ var StepParser = class extends StepHeaderParser {
3827
3829
  if (!charws(SEMICOLON)) {
3828
3830
  return syntaxError();
3829
3831
  }
3830
- {
3831
- const recordLen = input.address - startElement2;
3832
- onRecordIndexed?.(topLevelCount, expressID, 0, input.buffer.subarray(input.cursor - recordLen, input.cursor));
3833
- }
3834
- ++topLevelCount;
3835
3832
  pushEntry({
3836
3833
  address: startElement2,
3837
3834
  length: input.address - startElement2,
@@ -3841,6 +3838,11 @@ var StepParser = class extends StepHeaderParser {
3841
3838
  inlineEntities: inlineElements,
3842
3839
  multiMapping: multiElements
3843
3840
  });
3841
+ {
3842
+ const recordLen = input.address - startElement2;
3843
+ onRecordIndexed?.(topLevelCount, expressID, 0, input.buffer, input.cursor - recordLen, recordLen);
3844
+ }
3845
+ ++topLevelCount;
3844
3846
  multiElements = void 0;
3845
3847
  continue;
3846
3848
  }
@@ -3920,11 +3922,6 @@ var StepParser = class extends StepHeaderParser {
3920
3922
  if (!charws(SEMICOLON)) {
3921
3923
  return syntaxError();
3922
3924
  }
3923
- {
3924
- const recordLen = input.address - startElement;
3925
- onRecordIndexed?.(topLevelCount, expressID, foundItem, input.buffer.subarray(input.cursor - recordLen, input.cursor));
3926
- }
3927
- ++topLevelCount;
3928
3925
  pushEntry({
3929
3926
  address: startElement,
3930
3927
  length: input.address - startElement,
@@ -3932,6 +3929,11 @@ var StepParser = class extends StepHeaderParser {
3932
3929
  expressID,
3933
3930
  inlineEntities: inlineElements
3934
3931
  });
3932
+ {
3933
+ const recordLen = input.address - startElement;
3934
+ onRecordIndexed?.(topLevelCount, expressID, foundItem, input.buffer, input.cursor - recordLen, recordLen);
3935
+ }
3936
+ ++topLevelCount;
3935
3937
  }
3936
3938
  return parseResult2(ParseResult.INCOMPLETE);
3937
3939
  }
@@ -72161,13 +72163,11 @@ async function buildIndexStreamingAsync(source, parser211, pool3, onRecordIndexe
72161
72163
  };
72162
72164
  }
72163
72165
  }
72164
- function buildColumnarIndexStreaming(source, parser211, pool3, onRecordIndexed) {
72165
- const sink = new ColumnarIndexSink();
72166
+ function buildColumnarIndexStreaming(source, parser211, pool3, onRecordIndexed, sink = new ColumnarIndexSink()) {
72166
72167
  const { header, result, stats } = buildIndexStreaming(source, parser211, pool3, onRecordIndexed, sink);
72167
72168
  return { header, columns: sink.finalize(), result, stats };
72168
72169
  }
72169
- async function buildColumnarIndexStreamingAsync(source, parser211, pool3, onRecordIndexed, onProgress, yieldIntervalMs) {
72170
- const sink = new ColumnarIndexSink();
72170
+ async function buildColumnarIndexStreamingAsync(source, parser211, pool3, onRecordIndexed, onProgress, yieldIntervalMs, sink = new ColumnarIndexSink()) {
72171
72171
  const { header, result, stats } = await buildIndexStreamingAsync(source, parser211, pool3, onRecordIndexed, sink, onProgress, yieldIntervalMs);
72172
72172
  return { header, columns: sink.finalize(), result, stats };
72173
72173
  }
@@ -0,0 +1,145 @@
1
+ import EntityTypesIfc from "./ifc4_gen/entity_types_ifc.gen.js";
2
+ import IfcStepParser from "./ifc_step_parser.js";
3
+ import { StreamingRecordDispatcher } from "../step/parsing/streaming_record_dispatcher.js";
4
+ /** One node of the skeleton: what a tree row needs, and nothing else. */
5
+ export interface SkeletonNode {
6
+ /** The record's express ID. */
7
+ expressID: number;
8
+ /** The record's concrete type. */
9
+ type: EntityTypesIfc;
10
+ /** `Name`, when the record carried one. */
11
+ name?: string;
12
+ /** `LongName`, for spatial elements that carried one. */
13
+ longName?: string;
14
+ /** `GlobalId`, when the record carried one. */
15
+ globalId?: string;
16
+ /** Children, in the order their relationships were parsed. */
17
+ children: SkeletonNode[];
18
+ }
19
+ /**
20
+ * The spatial **names skeleton** (M2, issue #393): project → site → building →
21
+ * storey → product, with names, built from the streaming parse's record events
22
+ * so the tree can be shown while the model is still loading.
23
+ *
24
+ * This is the one standard consumer that genuinely belongs on the event path,
25
+ * and the reason is the record's *bytes*. Everything else M2 wanted —
26
+ * membership, counts, ids — is in the columnar index and is cheaper (and, for
27
+ * complex records, only correct) when derived from a prefix snapshot; see
28
+ * {@link import('../step/parsing/prefix_type_index').PrefixTypeIndex}. Names
29
+ * and relationship edges are not in the columns, and after the parse they cost
30
+ * a second pass that pages every relationship and every named record back in
31
+ * through the windowed provider — which is exactly what Share's post-parse
32
+ * `'names'` sweep does today.
33
+ *
34
+ * What runs per record is deliberately small: tokenize the record's attribute
35
+ * list, copy out at most three short strings, and append two integers per
36
+ * edge. Nothing is resolved and no tree is built until {@link tree} is called —
37
+ * "resolvable" therefore means "present when you asked", and a file that
38
+ * forward-references its way through the spatial hierarchy simply resolves at
39
+ * end of stream, with no pending-reference table to maintain.
40
+ *
41
+ * Idempotence: the streaming builder's grow-and-restart re-fires records from
42
+ * localID 0. A non-ascending localID is taken as that restart and clears both
43
+ * the nodes and the edge columns, so a restarted parse rebuilds rather than
44
+ * doubling its edges.
45
+ */
46
+ export declare class IfcSpatialSkeleton {
47
+ private readonly nodes_;
48
+ private edgeParents_;
49
+ private edgeChildren_;
50
+ private edgeCount_;
51
+ private readonly cursor_;
52
+ private lastLocalID_;
53
+ /**
54
+ * @param parser The IFC parser whose tokenizer reads the record bytes.
55
+ * Defaults to the singleton the streaming open uses.
56
+ */
57
+ constructor(parser?: IfcStepParser);
58
+ /**
59
+ * Subscribe this skeleton to a dispatcher — the object definitions it names
60
+ * and the two relationship types it draws edges from.
61
+ *
62
+ * @param dispatcher The dispatcher fed by the streaming parse.
63
+ */
64
+ subscribe(dispatcher: StreamingRecordDispatcher<EntityTypesIfc>): void;
65
+ /**
66
+ * @return {number} Nodes seen so far (children not yet linked).
67
+ */
68
+ get nodeCount(): number;
69
+ /**
70
+ * @return {number} Containment edges captured so far.
71
+ */
72
+ get edgeCount(): number;
73
+ /**
74
+ * Record a named object definition. Bound for direct use as a subscription.
75
+ *
76
+ * @param localID The record's dense local ID.
77
+ * @param expressID The record's express ID.
78
+ * @param typeID The record's concrete type.
79
+ * @param buffer The live parse window holding the record.
80
+ * @param byteOffset Offset of the record's attribute list in `buffer`.
81
+ * @param byteLength Length of the attribute list.
82
+ */
83
+ private readonly handleObject;
84
+ /**
85
+ * Where this type keeps `LongName`, if it has one.
86
+ *
87
+ * @param typeID The record's concrete type.
88
+ * @return {number | undefined} The attribute index, or undefined for types
89
+ * that carry no `LongName` at all.
90
+ */
91
+ private longNameAttribute;
92
+ /**
93
+ * Record the containment edges of one relationship. Bound for direct use as
94
+ * a subscription.
95
+ *
96
+ * @param localID The record's dense local ID.
97
+ * @param expressID The record's express ID.
98
+ * @param typeID The record's concrete type.
99
+ * @param buffer The live parse window holding the record.
100
+ * @param byteOffset Offset of the record's attribute list in `buffer`.
101
+ * @param byteLength Length of the attribute list.
102
+ */
103
+ private readonly handleRelationship;
104
+ /**
105
+ * Reset if the parse restarted. localIDs ascend strictly within a run, so a
106
+ * localID that does not exceed the last one seen means the streaming
107
+ * builder hit its grow-and-restart valve and is re-firing from 0. Testing
108
+ * for `localID === 0` would not do: this consumer only sees its subscribed
109
+ * types, and record 0 is rarely one of them.
110
+ *
111
+ * @param localID The record's dense local ID.
112
+ */
113
+ private noteRestart;
114
+ /**
115
+ * Append one containment edge, growing the columns as needed.
116
+ *
117
+ * @param parent Express ID of the containing entity.
118
+ * @param child Express ID of the contained entity.
119
+ */
120
+ private pushEdge;
121
+ /**
122
+ * Look one node up without building the tree.
123
+ *
124
+ * @param expressID The express ID.
125
+ * @return {SkeletonNode | undefined} The node, if it has been parsed.
126
+ */
127
+ node(expressID: number): SkeletonNode | undefined;
128
+ /**
129
+ * Build the tree over everything parsed so far and return its roots — nodes
130
+ * that are nobody's child. That is the project once it has been seen, plus
131
+ * whatever a prefix has not reached the parent of yet, plus the object
132
+ * definitions that genuinely hang outside the spatial hierarchy (type
133
+ * objects, ungrouped actors); a caller that wants strictly the spatial tree
134
+ * should walk down from the project's express ID rather than treat every
135
+ * root as spatial.
136
+ *
137
+ * Each call relinks children from the edge columns, so a caller may call it
138
+ * repeatedly as the parse advances; the returned nodes are the live ones, so
139
+ * a previously returned tree is not a snapshot.
140
+ *
141
+ * @return {SkeletonNode[]} The roots, in parse order.
142
+ */
143
+ tree(): SkeletonNode[];
144
+ }
145
+ //# sourceMappingURL=ifc_spatial_skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifc_spatial_skeleton.d.ts","sourceRoot":"","sources":["../../../src/ifc/ifc_spatial_skeleton.ts"],"names":[],"mappings":"AAEA,OAAO,cAAc,MAAM,iCAAiC,CAAA;AAQ5D,OAAO,aAAa,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAA;AAwCvF,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAE3B,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAA;IAEjB,kCAAkC;IAClC,IAAI,EAAE,cAAc,CAAA;IAEpB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,8DAA8D;IAC9D,QAAQ,EAAE,YAAY,EAAE,CAAA;CACzB;AAGD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,kBAAkB;IAE7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IAEzD,OAAO,CAAC,YAAY,CAAmC;IAEvD,OAAO,CAAC,aAAa,CAAmC;IAExD,OAAO,CAAC,UAAU,CAAI;IAEtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAE3D,OAAO,CAAC,YAAY,CAAK;IAEzB;;;OAGG;gBACU,MAAM,GAAE,aAAsC;IAI3D;;;;;OAKG;IACI,SAAS,CAAE,UAAU,EAAE,yBAAyB,CAAC,cAAc,CAAC,GAAI,IAAI;IAM/E;;OAEG;IACH,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;OAEG;IACH,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CA6C5B;IAED;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAoClC;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,WAAW;IASnB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAiBhB;;;;;OAKG;IACI,IAAI,CAAE,SAAS,EAAE,MAAM,GAAI,YAAY,GAAG,SAAS;IAI1D;;;;;;;;;;;;;;OAcG;IACI,IAAI,IAAI,YAAY,EAAE;CAgC9B"}