@osmix/core 0.0.2 → 0.0.6

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 (165) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +118 -107
  3. package/dist/core/src/entities.d.ts +114 -0
  4. package/dist/core/src/entities.d.ts.map +1 -0
  5. package/dist/core/src/entities.js +152 -0
  6. package/dist/core/src/entities.js.map +1 -0
  7. package/dist/core/src/ids.d.ts +113 -0
  8. package/dist/core/src/ids.d.ts.map +1 -0
  9. package/dist/{src → core/src}/ids.js +96 -31
  10. package/dist/core/src/ids.js.map +1 -0
  11. package/dist/core/src/index.d.ts +32 -0
  12. package/dist/core/src/index.d.ts.map +1 -0
  13. package/dist/core/src/index.js +35 -0
  14. package/dist/core/src/index.js.map +1 -0
  15. package/dist/core/src/nodes.d.ts +101 -0
  16. package/dist/core/src/nodes.d.ts.map +1 -0
  17. package/dist/core/src/nodes.js +309 -0
  18. package/dist/core/src/nodes.js.map +1 -0
  19. package/dist/core/src/osm.d.ts +74 -0
  20. package/dist/core/src/osm.d.ts.map +1 -0
  21. package/dist/core/src/osm.js +120 -0
  22. package/dist/core/src/osm.js.map +1 -0
  23. package/dist/core/src/relations.d.ts +118 -0
  24. package/dist/core/src/relations.d.ts.map +1 -0
  25. package/dist/core/src/relations.js +412 -0
  26. package/dist/core/src/relations.js.map +1 -0
  27. package/dist/core/src/stringtable.d.ts +95 -0
  28. package/dist/core/src/stringtable.d.ts.map +1 -0
  29. package/dist/core/src/stringtable.js +170 -0
  30. package/dist/core/src/stringtable.js.map +1 -0
  31. package/dist/core/src/tags.d.ts +126 -0
  32. package/dist/core/src/tags.d.ts.map +1 -0
  33. package/dist/core/src/tags.js +228 -0
  34. package/dist/core/src/tags.js.map +1 -0
  35. package/dist/core/src/typed-arrays.d.ts +124 -0
  36. package/dist/core/src/typed-arrays.d.ts.map +1 -0
  37. package/dist/{src → core/src}/typed-arrays.js +88 -9
  38. package/dist/core/src/typed-arrays.js.map +1 -0
  39. package/dist/core/src/utils.d.ts +11 -0
  40. package/dist/core/src/utils.d.ts.map +1 -0
  41. package/dist/{src → core/src}/utils.js +8 -10
  42. package/dist/core/src/utils.js.map +1 -0
  43. package/dist/core/src/ways.d.ts +101 -0
  44. package/dist/core/src/ways.d.ts.map +1 -0
  45. package/dist/core/src/ways.js +336 -0
  46. package/dist/core/src/ways.js.map +1 -0
  47. package/dist/core/test/memory.test.d.ts +7 -0
  48. package/dist/core/test/memory.test.d.ts.map +1 -0
  49. package/dist/core/test/memory.test.js +29 -0
  50. package/dist/core/test/memory.test.js.map +1 -0
  51. package/dist/{test → core/test}/mock-osm.d.ts +3 -3
  52. package/dist/core/test/mock-osm.d.ts.map +1 -0
  53. package/dist/{test → core/test}/mock-osm.js +3 -3
  54. package/dist/core/test/mock-osm.js.map +1 -0
  55. package/dist/core/test/tags-search.test.d.ts +2 -0
  56. package/dist/core/test/tags-search.test.d.ts.map +1 -0
  57. package/dist/core/test/tags-search.test.js +56 -0
  58. package/dist/core/test/tags-search.test.js.map +1 -0
  59. package/dist/core/test/typed-arrays.test.d.ts.map +1 -0
  60. package/dist/{test → core/test}/typed-arrays.test.js +19 -17
  61. package/dist/core/test/typed-arrays.test.js.map +1 -0
  62. package/dist/osmix/src/extract.d.ts +43 -0
  63. package/dist/osmix/src/extract.d.ts.map +1 -0
  64. package/dist/osmix/src/extract.js +156 -0
  65. package/dist/osmix/src/extract.js.map +1 -0
  66. package/dist/osmix/src/pbf.d.ts +55 -0
  67. package/dist/osmix/src/pbf.d.ts.map +1 -0
  68. package/dist/osmix/src/pbf.js +187 -0
  69. package/dist/osmix/src/pbf.js.map +1 -0
  70. package/dist/osmix/src/utils.d.ts +36 -0
  71. package/dist/osmix/src/utils.d.ts.map +1 -0
  72. package/dist/osmix/src/utils.js +108 -0
  73. package/dist/osmix/src/utils.js.map +1 -0
  74. package/dist/osmix/test/extract.bench.d.ts.map +1 -0
  75. package/dist/{test → osmix/test}/extract.bench.js +8 -5
  76. package/dist/osmix/test/extract.bench.js.map +1 -0
  77. package/dist/osmix/test/extract.test.d.ts.map +1 -0
  78. package/dist/osmix/test/extract.test.js +392 -0
  79. package/dist/osmix/test/extract.test.js.map +1 -0
  80. package/package.json +10 -12
  81. package/src/entities.ts +138 -22
  82. package/src/ids.ts +117 -45
  83. package/src/index.ts +34 -5
  84. package/src/nodes.ts +237 -58
  85. package/src/osm.ts +174 -0
  86. package/src/relations.ts +383 -54
  87. package/src/stringtable.ts +111 -36
  88. package/src/tags.ts +207 -46
  89. package/src/typed-arrays.ts +97 -10
  90. package/src/types/geoflatbush.d.ts +37 -0
  91. package/src/types/geokdbush.d.ts +37 -0
  92. package/src/types/kdbush.d.ts +24 -6
  93. package/src/utils.ts +9 -14
  94. package/src/ways.ts +248 -84
  95. package/test/memory.test.ts +38 -0
  96. package/test/mock-osm.ts +8 -8
  97. package/test/tags-search.test.ts +60 -0
  98. package/test/typed-arrays.test.ts +5 -6
  99. package/tsconfig.json +7 -1
  100. package/dist/src/entities.d.ts +0 -26
  101. package/dist/src/entities.d.ts.map +0 -1
  102. package/dist/src/entities.js +0 -69
  103. package/dist/src/entities.js.map +0 -1
  104. package/dist/src/ids.d.ts +0 -50
  105. package/dist/src/ids.d.ts.map +0 -1
  106. package/dist/src/ids.js.map +0 -1
  107. package/dist/src/index.d.ts +0 -6
  108. package/dist/src/index.d.ts.map +0 -1
  109. package/dist/src/index.js +0 -7
  110. package/dist/src/index.js.map +0 -1
  111. package/dist/src/nodes.d.ts +0 -36
  112. package/dist/src/nodes.d.ts.map +0 -1
  113. package/dist/src/nodes.js +0 -171
  114. package/dist/src/nodes.js.map +0 -1
  115. package/dist/src/osmix.d.ts +0 -88
  116. package/dist/src/osmix.d.ts.map +0 -1
  117. package/dist/src/osmix.js +0 -438
  118. package/dist/src/osmix.js.map +0 -1
  119. package/dist/src/relations.d.ts +0 -31
  120. package/dist/src/relations.d.ts.map +0 -1
  121. package/dist/src/relations.js +0 -161
  122. package/dist/src/relations.js.map +0 -1
  123. package/dist/src/stringtable.d.ts +0 -37
  124. package/dist/src/stringtable.d.ts.map +0 -1
  125. package/dist/src/stringtable.js +0 -101
  126. package/dist/src/stringtable.js.map +0 -1
  127. package/dist/src/tags.d.ts +0 -33
  128. package/dist/src/tags.d.ts.map +0 -1
  129. package/dist/src/tags.js +0 -92
  130. package/dist/src/tags.js.map +0 -1
  131. package/dist/src/typed-arrays.d.ts +0 -50
  132. package/dist/src/typed-arrays.d.ts.map +0 -1
  133. package/dist/src/typed-arrays.js.map +0 -1
  134. package/dist/src/utils.d.ts +0 -4
  135. package/dist/src/utils.d.ts.map +0 -1
  136. package/dist/src/utils.js.map +0 -1
  137. package/dist/src/ways.d.ts +0 -42
  138. package/dist/src/ways.d.ts.map +0 -1
  139. package/dist/src/ways.js +0 -186
  140. package/dist/src/ways.js.map +0 -1
  141. package/dist/test/extract.bench.d.ts.map +0 -1
  142. package/dist/test/extract.bench.js.map +0 -1
  143. package/dist/test/extract.test.d.ts.map +0 -1
  144. package/dist/test/extract.test.js +0 -127
  145. package/dist/test/extract.test.js.map +0 -1
  146. package/dist/test/mock-osm.d.ts.map +0 -1
  147. package/dist/test/mock-osm.js.map +0 -1
  148. package/dist/test/read.test.d.ts +0 -2
  149. package/dist/test/read.test.d.ts.map +0 -1
  150. package/dist/test/read.test.js +0 -17
  151. package/dist/test/read.test.js.map +0 -1
  152. package/dist/test/typed-arrays.test.d.ts.map +0 -1
  153. package/dist/test/typed-arrays.test.js.map +0 -1
  154. package/dist/test/write.test.d.ts +0 -2
  155. package/dist/test/write.test.d.ts.map +0 -1
  156. package/dist/test/write.test.js +0 -55
  157. package/dist/test/write.test.js.map +0 -1
  158. package/src/osmix.ts +0 -556
  159. package/test/extract.bench.ts +0 -29
  160. package/test/extract.test.ts +0 -161
  161. package/test/read.test.ts +0 -22
  162. package/test/write.test.ts +0 -69
  163. /package/dist/{test → core/test}/typed-arrays.test.d.ts +0 -0
  164. /package/dist/{test → osmix/test}/extract.bench.d.ts +0 -0
  165. /package/dist/{test → osmix/test}/extract.test.d.ts +0 -0
@@ -0,0 +1,187 @@
1
+ /**
2
+ * PBF loading and serialization utilities.
3
+ *
4
+ * Provides functions for loading OSM PBF data into Osm indexes and
5
+ * serializing Osm indexes back to PBF format. Supports streaming
6
+ * for memory-efficient processing of large datasets.
7
+ *
8
+ * @module
9
+ */
10
+ import { Osm } from "@osmix/core/src/osm";
11
+ import { OsmBlocksToJsonTransformStream, OsmJsonToBlocksTransformStream, } from "@osmix/json";
12
+ import { OsmBlocksToPbfBytesTransformStream, OsmPbfBytesToBlocksTransformStream, readOsmPbf, } from "@osmix/pbf";
13
+ import { logProgress, progressEvent, } from "@osmix/shared/progress";
14
+ import { createReadableEntityStreamFromOsm } from "./utils";
15
+ /**
16
+ * Read only the header block from PBF data without parsing entities.
17
+ * Useful for previewing metadata before loading the entire dataset.
18
+ */
19
+ export async function readOsmPbfHeader(data) {
20
+ const { header } = await readOsmPbf(data);
21
+ return header;
22
+ }
23
+ /**
24
+ * Create a new Osm index from PBF data (stream or buffer).
25
+ * Parses all OSM entities, builds ID and tag indexes, and constructs spatial indexes.
26
+ * Supports optional bbox extraction and entity filtering during ingestion.
27
+ */
28
+ export async function fromPbf(data, options = {}, onProgress = logProgress) {
29
+ const createOsm = startCreateOsmFromPbf(data, options);
30
+ do {
31
+ const { value, done } = await createOsm.next();
32
+ if (done)
33
+ return value;
34
+ onProgress(value);
35
+ } while (true);
36
+ }
37
+ /**
38
+ * Parse raw PBF data into an Osm index.
39
+ * Yields progress events during parsing and index building.
40
+ * Returns the completed Osm instance when done.
41
+ */
42
+ export async function* startCreateOsmFromPbf(data, options = {}) {
43
+ const { extractBbox } = options;
44
+ const { header, blocks } = await readOsmPbf(data);
45
+ const osm = new Osm({
46
+ ...options,
47
+ header,
48
+ });
49
+ if (extractBbox) {
50
+ osm.header.bbox = {
51
+ left: extractBbox[0],
52
+ bottom: extractBbox[1],
53
+ right: extractBbox[2],
54
+ top: extractBbox[3],
55
+ };
56
+ }
57
+ let blockCount = 0;
58
+ for await (const block of blocks) {
59
+ const blockStringIndexMap = osm.stringTable.createBlockIndexMap(block.stringtable);
60
+ for (const group of block.primitivegroup) {
61
+ const { nodes, ways, relations, dense } = group;
62
+ if (nodes && nodes.length > 0)
63
+ throw Error("Nodes must be dense!");
64
+ if (dense) {
65
+ osm.nodes.addDenseNodes(dense, block, blockStringIndexMap, extractBbox
66
+ ? (node) => {
67
+ return (node.lon >= extractBbox[0] &&
68
+ node.lon <= extractBbox[2] &&
69
+ node.lat >= extractBbox[1] &&
70
+ node.lat <= extractBbox[3]);
71
+ }
72
+ : undefined);
73
+ }
74
+ if (ways.length > 0) {
75
+ // Nodes are finished, build their index.
76
+ if (!osm.nodes.isReady())
77
+ osm.nodes.buildIndex();
78
+ osm.ways.addWays(ways, blockStringIndexMap, extractBbox
79
+ ? (way) => {
80
+ const refs = way.refs.filter((ref) => osm.nodes.ids.has(ref));
81
+ if (refs.length === 0)
82
+ return null;
83
+ return {
84
+ ...way,
85
+ refs,
86
+ };
87
+ }
88
+ : undefined);
89
+ }
90
+ if (relations.length > 0) {
91
+ if (!osm.ways.isReady())
92
+ osm.ways.buildIndex();
93
+ osm.relations.addRelations(relations, blockStringIndexMap, extractBbox
94
+ ? (relation) => {
95
+ const members = relation.members.filter((member) => {
96
+ if (member.type === "node")
97
+ return osm.nodes.ids.has(member.ref);
98
+ if (member.type === "way")
99
+ return osm.ways.ids.has(member.ref);
100
+ return false;
101
+ });
102
+ if (members.length === 0)
103
+ return null;
104
+ return {
105
+ ...relation,
106
+ members,
107
+ };
108
+ }
109
+ : undefined);
110
+ }
111
+ }
112
+ blockCount++;
113
+ yield progressEvent(`Processed ${blockCount.toLocaleString()} blocks, ${osm.nodes.size.toLocaleString()} nodes, ${osm.ways.size.toLocaleString()} ways, and ${osm.relations.size.toLocaleString()} relations added.`);
114
+ }
115
+ yield progressEvent(`${osm.nodes.size.toLocaleString()} nodes, ${osm.ways.size.toLocaleString()} ways, and ${osm.relations.size.toLocaleString()} relations added.`);
116
+ yield progressEvent("Building ID and tag indexes...");
117
+ osm.buildIndexes();
118
+ // By default, build all spatial indexes.
119
+ if (!Array.isArray(options.buildSpatialIndexes)) {
120
+ yield progressEvent("Building all spatial indexes...");
121
+ osm.buildSpatialIndexes();
122
+ }
123
+ else if (options.buildSpatialIndexes.includes("node")) {
124
+ yield progressEvent("Building node spatial index...");
125
+ osm.nodes.buildSpatialIndex();
126
+ }
127
+ else if (options.buildSpatialIndexes.includes("way")) {
128
+ yield progressEvent("Building way spatial index...");
129
+ osm.ways.buildSpatialIndex();
130
+ }
131
+ else if (options.buildSpatialIndexes.includes("relation")) {
132
+ yield progressEvent("Building relation spatial index...");
133
+ osm.relations.buildSpatialIndex();
134
+ }
135
+ yield progressEvent(`Finished loading ${osm.id} PBF data into Osmix.`);
136
+ return osm;
137
+ }
138
+ /**
139
+ * Convert the OSM index to a ReadableStream of PBF-encoded bytes.
140
+ * Entities are streamed, transformed into PBF blocks, and encoded on the fly.
141
+ * Suitable for piping to file or network streams.
142
+ */
143
+ export function toPbfStream(osm) {
144
+ return createReadableEntityStreamFromOsm(osm)
145
+ .pipeThrough(new OsmJsonToBlocksTransformStream())
146
+ .pipeThrough(new OsmBlocksToPbfBytesTransformStream());
147
+ }
148
+ /**
149
+ * Convert the OSM index to a single in-memory PBF buffer.
150
+ * Collects all streamed chunks into a contiguous Uint8Array.
151
+ * For large datasets, prefer osmToPbfStream to avoid memory pressure.
152
+ */
153
+ export async function toPbfBuffer(osm) {
154
+ const chunks = [];
155
+ let byteLength = 0;
156
+ const writable = new WritableStream({
157
+ write(chunk) {
158
+ chunks.push(chunk);
159
+ byteLength += chunk.byteLength;
160
+ },
161
+ });
162
+ await toPbfStream(osm).pipeTo(writable);
163
+ const combined = new Uint8Array(byteLength);
164
+ let offset = 0;
165
+ for (const chunk of chunks) {
166
+ combined.set(chunk, offset);
167
+ offset += chunk.byteLength;
168
+ }
169
+ return combined;
170
+ }
171
+ /**
172
+ * Transform OSM PBF data into a stream of JSON entities.
173
+ */
174
+ export function transformOsmPbfToJson(data) {
175
+ const dataStream = data instanceof ReadableStream
176
+ ? data
177
+ : new ReadableStream({
178
+ start: (controller) => {
179
+ controller.enqueue(new Uint8Array(data));
180
+ controller.close();
181
+ },
182
+ });
183
+ return dataStream
184
+ .pipeThrough(new OsmPbfBytesToBlocksTransformStream())
185
+ .pipeThrough(new OsmBlocksToJsonTransformStream());
186
+ }
187
+ //# sourceMappingURL=pbf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pbf.js","sourceRoot":"","sources":["../../../../osmix/src/pbf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Utility functions for worker communication and data streaming.
3
+ *
4
+ * Provides helpers for collecting transferable buffers, feature detection,
5
+ * and converting Osm indexes to entity streams.
6
+ *
7
+ * @module
8
+ */
9
+ import type { Osm } from "@osmix/core";
10
+ import type { OsmPbfHeaderBlock } from "@osmix/pbf";
11
+ import type { OsmEntity } from "@osmix/shared/types";
12
+ /** Types that can be transferred between workers without copying. */
13
+ export type Transferables = ArrayBufferLike | ReadableStream;
14
+ /**
15
+ * Recursively collect all transferable values from a nested object.
16
+ * Searches for ArrayBuffers, TypedArray buffers, and ReadableStreams.
17
+ * Used to prepare data for zero-copy transfer to or from workers.
18
+ */
19
+ export declare function collectTransferables(value: unknown): Transferables[];
20
+ /**
21
+ * Wrap data with Comlink.transfer, automatically collecting transferable buffers.
22
+ * Enables zero-copy message passing for typed arrays and streams.
23
+ */
24
+ export declare function transfer<T>(data: T): T;
25
+ /**
26
+ * Feature-detect whether the browser supports transferable ReadableStreams.
27
+ * Attempts to post a stream through a MessageChannel; throws DataCloneError if unsupported.
28
+ */
29
+ export declare function supportsReadableStreamTransfer(): boolean;
30
+ /**
31
+ * Convert the `Osm` index to a `ReadableStream` of header and entity objects.
32
+ * Header is emitted first, followed by all entities in sorted order.
33
+ * Stream can be piped through transform streams for further processing.
34
+ */
35
+ export declare function createReadableEntityStreamFromOsm(osm: Osm): ReadableStream<OsmPbfHeaderBlock | OsmEntity>;
36
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../osmix/src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAGpD,qEAAqE;AACrE,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,cAAc,CAAA;AAE5D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,EAAE,CAiBpE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAElC;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAmBxD;AAkBD;;;;GAIG;AACH,wBAAgB,iCAAiC,CAChD,GAAG,EAAE,GAAG,GACN,cAAc,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAqB/C"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Utility functions for worker communication and data streaming.
3
+ *
4
+ * Provides helpers for collecting transferable buffers, feature detection,
5
+ * and converting Osm indexes to entity streams.
6
+ *
7
+ * @module
8
+ */
9
+ import { transfer as comlinkTransfer } from "comlink";
10
+ /**
11
+ * Recursively collect all transferable values from a nested object.
12
+ * Searches for ArrayBuffers, TypedArray buffers, and ReadableStreams.
13
+ * Used to prepare data for zero-copy transfer to or from workers.
14
+ */
15
+ export function collectTransferables(value) {
16
+ const transferables = [];
17
+ if (value instanceof ArrayBuffer)
18
+ transferables.push(value);
19
+ else if (value instanceof ReadableStream)
20
+ transferables.push(value);
21
+ else if (ArrayBuffer.isView(value))
22
+ transferables.push(value.buffer);
23
+ else if (Array.isArray(value)) {
24
+ for (const item of value) {
25
+ transferables.push(...collectTransferables(item));
26
+ }
27
+ }
28
+ else if (value && typeof value === "object") {
29
+ for (const item of Object.values(value)) {
30
+ transferables.push(...collectTransferables(item));
31
+ }
32
+ }
33
+ return transferables;
34
+ }
35
+ /**
36
+ * Wrap data with Comlink.transfer, automatically collecting transferable buffers.
37
+ * Enables zero-copy message passing for typed arrays and streams.
38
+ */
39
+ export function transfer(data) {
40
+ return comlinkTransfer(data, collectTransferables(data));
41
+ }
42
+ /**
43
+ * Feature-detect whether the browser supports transferable ReadableStreams.
44
+ * Attempts to post a stream through a MessageChannel; throws DataCloneError if unsupported.
45
+ */
46
+ export function supportsReadableStreamTransfer() {
47
+ // Require the basics first
48
+ if (typeof ReadableStream === "undefined" ||
49
+ typeof MessageChannel === "undefined")
50
+ return false;
51
+ const { port1 } = new MessageChannel();
52
+ try {
53
+ const rs = new ReadableStream(); // empty is fine for feature test
54
+ // If transferable streams are unsupported, this line throws a DataCloneError
55
+ port1.postMessage(rs, [rs]);
56
+ return true;
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ finally {
62
+ port1.close();
63
+ }
64
+ }
65
+ /**
66
+ * Create a generator that yields all entities in the `Osm` index, sorted by type and ID.
67
+ * Order: nodes first, then ways, then relations, each sorted by ID.
68
+ */
69
+ function* getAllEntitiesSorted(osm) {
70
+ for (const node of osm.nodes.sorted()) {
71
+ yield node;
72
+ }
73
+ for (const way of osm.ways.sorted()) {
74
+ yield way;
75
+ }
76
+ for (const relation of osm.relations.sorted()) {
77
+ yield relation;
78
+ }
79
+ }
80
+ /**
81
+ * Convert the `Osm` index to a `ReadableStream` of header and entity objects.
82
+ * Header is emitted first, followed by all entities in sorted order.
83
+ * Stream can be piped through transform streams for further processing.
84
+ */
85
+ export function createReadableEntityStreamFromOsm(osm) {
86
+ let headerEnqueued = false;
87
+ const entityGenerator = getAllEntitiesSorted(osm);
88
+ return new ReadableStream({
89
+ pull: async (controller) => {
90
+ if (!headerEnqueued) {
91
+ controller.enqueue({
92
+ ...osm.header,
93
+ writingprogram: "@osmix/core",
94
+ osmosis_replication_timestamp: Date.now(),
95
+ });
96
+ headerEnqueued = true;
97
+ }
98
+ const block = entityGenerator.next();
99
+ if (block.done) {
100
+ controller.close();
101
+ }
102
+ else {
103
+ controller.enqueue(block.value);
104
+ }
105
+ },
106
+ });
107
+ }
108
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../osmix/src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.bench.d.ts","sourceRoot":"","sources":["../../../../osmix/test/extract.bench.ts"],"names":[],"mappings":""}
@@ -1,6 +1,9 @@
1
+ import { beforeAll, describe } from "bun:test";
1
2
  import { getFixtureFile } from "@osmix/shared/test/fixtures";
2
- import { beforeAll, bench, describe } from "vitest";
3
- import { Osmix } from "../src/osmix";
3
+ // @ts-expect-error - bench is available at runtime but not in types
4
+ const { bench } = globalThis;
5
+ import { createExtract } from "../src/extract";
6
+ import { fromPbf } from "../src/pbf";
4
7
  const MONACO_BBOX = [7.4053929, 43.7232244, 7.4447259, 43.7543687];
5
8
  // const SEATTLE_BBOX: GeoBbox2D = [-122.33, 47.48, -122.29, 47.52]
6
9
  const BBOX = MONACO_BBOX;
@@ -12,12 +15,12 @@ beforeAll(async () => {
12
15
  describe("simple extract benchmark", () => {
13
16
  bench("two-step parse then extract", async () => {
14
17
  const data = buffer.slice(0);
15
- const full = await Osmix.fromPbf(data);
16
- full.extract(BBOX);
18
+ const full = await fromPbf(data);
19
+ createExtract(full, BBOX, "simple");
17
20
  });
18
21
  bench("streaming extract during parse", async () => {
19
22
  const data = buffer.slice(0);
20
- await Osmix.fromPbf(data, { extractBbox: BBOX });
23
+ await fromPbf(data, { extractBbox: BBOX });
21
24
  });
22
25
  });
23
26
  //# sourceMappingURL=extract.bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.bench.js","sourceRoot":"","sources":["../../../../osmix/test/extract.bench.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAG5D,oEAAoE;AACpE,MAAM,EAAE,KAAK,EAAE,GAAG,UAAuD,CAAA;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,MAAM,WAAW,GAAc,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AAC7E,mEAAmE;AAEnE,MAAM,IAAI,GAAG,WAAW,CAAA;AACxB,MAAM,GAAG,GAAG,YAAY,CAAA;AAExB,IAAI,MAAmC,CAAA;AAEvC,SAAS,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;AACnC,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACzC,KAAK,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;QAChC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,KAAK,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.test.d.ts","sourceRoot":"","sources":["../../../../osmix/test/extract.test.ts"],"names":[],"mappings":""}