@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,170 @@
1
+ /**
2
+ * Deduplicated UTF-8 string storage.
3
+ *
4
+ * Strings are stored in a flat buffer and referenced by index.
5
+ * Supports fast deduplication (string→index) and lazy reconstruction (index→string).
6
+ *
7
+ * @module
8
+ */
9
+ import { ResizeableTypedArray as RTA } from "./typed-arrays";
10
+ /**
11
+ * Append-only deduplicated string table.
12
+ *
13
+ * Limits: Max string length 65,535 bytes.
14
+ * Rebuilds reverse index lazily after transfer.
15
+ */
16
+ export default class StringTable {
17
+ /** UTF-8 encoder for string→bytes conversion */
18
+ enc = new TextEncoder();
19
+ /** UTF-8 decoder for bytes→string conversion */
20
+ dec = new TextDecoder(); // UTF-8
21
+ // ─── Serializable State ────────────────────────────────────────────────────
22
+ /** Concatenated UTF-8 bytes of all strings */
23
+ bytes;
24
+ /** Maps string index → byte offset in bytes array */
25
+ start;
26
+ /** Maps string index → byte length */
27
+ count;
28
+ // ─── Builder State (string → index) ────────────────────────────────────────
29
+ /** Forward lookup: string → index (populated during add) */
30
+ stringToIndex = new Map();
31
+ /** Whether the reverse index has been built (lazy after transfer) */
32
+ reverseIndexBuilt = false;
33
+ // ─── Retrieval Cache (index → string) ──────────────────────────────────────
34
+ /** Cache of decoded strings to avoid repeated UTF-8 decoding */
35
+ indexToString = new Map();
36
+ /**
37
+ * Create a new StringTable.
38
+ */
39
+ constructor(opts) {
40
+ this.bytes = opts?.bytes
41
+ ? RTA.from(Uint8Array, opts.bytes)
42
+ : new RTA(Uint8Array);
43
+ this.start = opts?.start
44
+ ? RTA.from(Uint32Array, opts.start)
45
+ : new RTA(Uint32Array);
46
+ this.count = opts?.count
47
+ ? RTA.from(Uint16Array, opts.count)
48
+ : new RTA(Uint16Array);
49
+ }
50
+ /**
51
+ * Get transferable objects for passing to another thread.
52
+ */
53
+ transferables() {
54
+ return {
55
+ bytes: this.bytes.array.buffer,
56
+ start: this.start.array.buffer,
57
+ count: this.count.array.buffer,
58
+ };
59
+ }
60
+ /**
61
+ * Add a string to the table and return its index.
62
+ */
63
+ add(str) {
64
+ const existingIndex = this.stringToIndex.get(str);
65
+ if (existingIndex !== undefined)
66
+ return existingIndex;
67
+ const startIndex = this.start.length;
68
+ const encoded = this.enc.encode(str);
69
+ this.start.push(this.bytes.length);
70
+ this.bytes.pushMany(encoded);
71
+ this.count.push(encoded.length);
72
+ this.stringToIndex.set(str, startIndex);
73
+ return startIndex;
74
+ }
75
+ /**
76
+ * Decode all the strings in a primitive block and add them to the string table.
77
+ * Return a mapping of block index -> string table index
78
+ */
79
+ createBlockIndexMap(blockStringtable) {
80
+ const index = new Uint32Array(blockStringtable.length);
81
+ for (let i = 0; i < blockStringtable.length; i++) {
82
+ const bytesString = blockStringtable[i];
83
+ const str = this.dec.decode(bytesString);
84
+ const existingIndex = this.stringToIndex.get(str);
85
+ if (existingIndex !== undefined) {
86
+ index[i] = existingIndex;
87
+ continue;
88
+ }
89
+ index[i] = this.add(str);
90
+ }
91
+ return index;
92
+ }
93
+ /**
94
+ * Get a string by its index.
95
+ * Caches results to avoid repeated UTF-8 decoding.
96
+ */
97
+ get(index) {
98
+ const string = this.indexToString.get(index);
99
+ if (string)
100
+ return string;
101
+ const bytes = this.getBytes(index);
102
+ const tempBuffer = new ArrayBuffer(bytes.byteLength);
103
+ const tempBytes = new Uint8Array(tempBuffer);
104
+ tempBytes.set(bytes);
105
+ const decoded = this.dec.decode(tempBytes);
106
+ this.indexToString.set(index, decoded);
107
+ return decoded;
108
+ }
109
+ /**
110
+ * Get the raw UTF-8 bytes of a string.
111
+ * Returns a subarray view (not a copy).
112
+ */
113
+ getBytes(index) {
114
+ if (index < 0 || index >= this.length)
115
+ throw Error(`String index out of range: ${index}`);
116
+ const start = this.start.at(index);
117
+ const count = this.count.at(index);
118
+ return this.bytes.array.subarray(start, start + count);
119
+ }
120
+ /** Number of strings in the table. */
121
+ get length() {
122
+ return this.start.length;
123
+ }
124
+ /**
125
+ * Finalize the string table by compacting internal arrays.
126
+ *
127
+ * This releases unused buffer capacity and marks the reverse index as built
128
+ * (since all strings were added before this call).
129
+ */
130
+ buildIndex() {
131
+ this.bytes.compact();
132
+ this.start.compact();
133
+ this.count.compact();
134
+ this.reverseIndexBuilt = true;
135
+ }
136
+ /**
137
+ * Convert the string table to an OSM PBF string table.
138
+ */
139
+ toOsmPbfStringTable() {
140
+ const stringTable = [];
141
+ for (let i = 0; i < this.length; i++) {
142
+ stringTable.push(this.getBytes(i));
143
+ }
144
+ return stringTable;
145
+ }
146
+ /**
147
+ * Lazily build the reverse index (string → index).
148
+ * Decodes all strings once to populate the lookup map.
149
+ */
150
+ ensureReverseIndex() {
151
+ if (this.reverseIndexBuilt)
152
+ return;
153
+ // Decode all strings and populate the forward lookup map
154
+ for (let i = 0; i < this.length; i++) {
155
+ this.stringToIndex.set(this.get(i), i);
156
+ }
157
+ this.reverseIndexBuilt = true;
158
+ }
159
+ /**
160
+ * Find the index of a string.
161
+ */
162
+ find(str) {
163
+ const existing = this.stringToIndex.get(str);
164
+ if (existing !== undefined)
165
+ return existing;
166
+ this.ensureReverseIndex();
167
+ return this.stringToIndex.get(str) ?? -1;
168
+ }
169
+ }
170
+ //# sourceMappingURL=stringtable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringtable.js","sourceRoot":"","sources":["../../../src/stringtable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Tag storage and lookup.
3
+ *
4
+ * Stores key=value pairs using string table indices. Supports:
5
+ * 1. **Entity → Tags**: Retrieve tags for a given entity.
6
+ * 2. **Key → Entities**: Find entities with a specific tag key.
7
+ *
8
+ * @module
9
+ */
10
+ import type { OsmTags } from "@osmix/shared/types";
11
+ import StringTable from "./stringtable";
12
+ import { type BufferType } from "./typed-arrays";
13
+ /**
14
+ * Serializable state for worker transfer.
15
+ */
16
+ export interface TagsTransferables<T extends BufferType = BufferType> {
17
+ /** Maps entity index → start position in tagKeys/tagVals. */
18
+ tagStart: T;
19
+ /** Maps entity index → number of tags. */
20
+ tagCount: T;
21
+ /** Flattened tag key indices. */
22
+ tagKeys: T;
23
+ /** Flattened tag value indices. */
24
+ tagVals: T;
25
+ /** Flattened entity indices for reverse key lookup. */
26
+ keyEntities: T;
27
+ /** Maps key index → start position in keyEntities. */
28
+ keyIndexStart: T;
29
+ /** Maps key index → count of entities with that key. */
30
+ keyIndexCount: T;
31
+ }
32
+ /**
33
+ * Bidirectional tag storage.
34
+ *
35
+ * Limits: Max 255 tags per entity.
36
+ * Note: String indices reference a shared `StringTable`.
37
+ */
38
+ export declare class Tags {
39
+ /** Reference to the shared string table for key/value storage */
40
+ private stringTable;
41
+ /** Maps entity index → start position in tagKeys/tagVals */
42
+ private tagStart;
43
+ /** Maps entity index → number of tags (max 255) */
44
+ private tagCount;
45
+ /** All tag key string indices, concatenated */
46
+ private tagKeys;
47
+ /** All tag value string indices, concatenated (parallel to tagKeys) */
48
+ private tagVals;
49
+ /**
50
+ * Flattened array of entity indices that have each tag key.
51
+ * Indexed via keyIndexStart and keyIndexCount.
52
+ */
53
+ private keyEntities;
54
+ /** Maps key string index → start position in keyEntities */
55
+ private keyIndexStart;
56
+ /** Maps key string index → count of entities with that key */
57
+ private keyIndexCount;
58
+ /**
59
+ * Temporary map used during ingestion to collect entity indices per key.
60
+ * Converted to flat arrays during buildIndex() and then cleared.
61
+ */
62
+ private keyEntityIndexBuilder;
63
+ /** Whether buildIndex() has been called */
64
+ private indexBuilt;
65
+ /**
66
+ * Create a new Tags index.
67
+ */
68
+ constructor(stringTable: StringTable, transferables?: TagsTransferables);
69
+ /**
70
+ * Add tags to an entity.
71
+ */
72
+ addTags(index: number, tags?: OsmTags): [number[], number[]];
73
+ /**
74
+ * Add tags to an entity using key and value indexes.
75
+ */
76
+ addTagKeysAndValues(index: number, keys: number[], values: number[]): void;
77
+ /**
78
+ * Finalize the tag index.
79
+ *
80
+ * Compacts arrays and builds the reverse key→entity index.
81
+ * Must be called before `hasKey()`.
82
+ */
83
+ buildIndex(): void;
84
+ /**
85
+ * Check if the index is built and ready for use.
86
+ */
87
+ isReady(): boolean;
88
+ /**
89
+ * Get the number of tags for an entity.
90
+ */
91
+ cardinality(index: number): number;
92
+ /**
93
+ * Get the tags for an entity.
94
+ */
95
+ getTags(index: number): OsmTags | undefined;
96
+ /**
97
+ * Get tags from key and value indexes.
98
+ */
99
+ getTagsFromIndices(keys: number[], values: number[]): OsmTags;
100
+ /**
101
+ * Find the index of a tag key.
102
+ */
103
+ find(key: string): number;
104
+ /**
105
+ * Get all entity indexes that have a specific tag key.
106
+ */
107
+ hasKey(keyIndex: number): number[];
108
+ /**
109
+ * Create a unique composite index for a key=value pair.
110
+ * Uses row-major indexing: `key * width + val`.
111
+ */
112
+ kvToIndex(key: number, val: number): number;
113
+ /**
114
+ * Get transferable objects for passing to another thread.
115
+ */
116
+ transferables(): TagsTransferables;
117
+ /**
118
+ * Get the approximate memory requirements for a given number of tags in bytes.
119
+ */
120
+ static getBytesRequired(count: number): number;
121
+ /**
122
+ * Reconstruct a Tags index from transferable objects.
123
+ */
124
+ static fromTransferables(stringTable: StringTable, transferables: TagsTransferables): Tags;
125
+ }
126
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/tags.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,WAAW,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,KAAK,UAAU,EAA+B,MAAM,gBAAgB,CAAA;AAE7E;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU;IACnE,6DAA6D;IAC7D,QAAQ,EAAE,CAAC,CAAA;IACX,0CAA0C;IAC1C,QAAQ,EAAE,CAAC,CAAA;IACX,iCAAiC;IACjC,OAAO,EAAE,CAAC,CAAA;IACV,mCAAmC;IACnC,OAAO,EAAE,CAAC,CAAA;IAEV,uDAAuD;IACvD,WAAW,EAAE,CAAC,CAAA;IACd,sDAAsD;IACtD,aAAa,EAAE,CAAC,CAAA;IAChB,wDAAwD;IACxD,aAAa,EAAE,CAAC,CAAA;CAChB;AAED;;;;;GAKG;AACH,qBAAa,IAAI;IAChB,iEAAiE;IACjE,OAAO,CAAC,WAAW,CAAiC;IAGpD,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAkB;IAClC,mDAAmD;IACnD,OAAO,CAAC,QAAQ,CAAiB;IACjC,+CAA+C;IAC/C,OAAO,CAAC,OAAO,CAAkB;IACjC,uEAAuE;IACvE,OAAO,CAAC,OAAO,CAAkB;IAGjC;;;OAGG;IACH,OAAO,CAAC,WAAW,CAAkB;IAErC,4DAA4D;IAC5D,OAAO,CAAC,aAAa,CAAkB;IACvC,8DAA8D;IAC9D,OAAO,CAAC,aAAa,CAAkB;IAEvC;;;OAGG;IACH,OAAO,CAAC,qBAAqB,CAA8B;IAE3D,2CAA2C;IAC3C,OAAO,CAAC,UAAU,CAAQ;IAE1B;;OAEG;gBACS,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,iBAAiB;IAsBvE;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC;IAgB5D;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;IAgBnE;;;;;OAKG;IACH,UAAU;IAoBV;;OAEG;IACH,OAAO;IAIP;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIlC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAuB3C;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO;IAY7D;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIzB;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAOlC;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAKlC;;OAEG;IACH,aAAa,IAAI,iBAAiB;IAYlC;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM;IAOrC;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACvB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,iBAAiB;CAMjC"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Tag storage and lookup.
3
+ *
4
+ * Stores key=value pairs using string table indices. Supports:
5
+ * 1. **Entity → Tags**: Retrieve tags for a given entity.
6
+ * 2. **Key → Entities**: Find entities with a specific tag key.
7
+ *
8
+ * @module
9
+ */
10
+ import StringTable from "./stringtable";
11
+ import { ResizeableTypedArray as RTA } from "./typed-arrays";
12
+ /**
13
+ * Bidirectional tag storage.
14
+ *
15
+ * Limits: Max 255 tags per entity.
16
+ * Note: String indices reference a shared `StringTable`.
17
+ */
18
+ export class Tags {
19
+ /** Reference to the shared string table for key/value storage */
20
+ stringTable = new StringTable();
21
+ // ─── Entity → Tag Lookup ───────────────────────────────────────────────────
22
+ /** Maps entity index → start position in tagKeys/tagVals */
23
+ tagStart;
24
+ /** Maps entity index → number of tags (max 255) */
25
+ tagCount;
26
+ /** All tag key string indices, concatenated */
27
+ tagKeys;
28
+ /** All tag value string indices, concatenated (parallel to tagKeys) */
29
+ tagVals;
30
+ // ─── Key → Entity Reverse Lookup ───────────────────────────────────────────
31
+ /**
32
+ * Flattened array of entity indices that have each tag key.
33
+ * Indexed via keyIndexStart and keyIndexCount.
34
+ */
35
+ keyEntities;
36
+ /** Maps key string index → start position in keyEntities */
37
+ keyIndexStart;
38
+ /** Maps key string index → count of entities with that key */
39
+ keyIndexCount;
40
+ /**
41
+ * Temporary map used during ingestion to collect entity indices per key.
42
+ * Converted to flat arrays during buildIndex() and then cleared.
43
+ */
44
+ keyEntityIndexBuilder = new Map();
45
+ /** Whether buildIndex() has been called */
46
+ indexBuilt = false;
47
+ /**
48
+ * Create a new Tags index.
49
+ */
50
+ constructor(stringTable, transferables) {
51
+ this.stringTable = stringTable;
52
+ if (transferables) {
53
+ this.tagStart = RTA.from(Uint32Array, transferables.tagStart);
54
+ this.tagCount = RTA.from(Uint8Array, transferables.tagCount);
55
+ this.tagKeys = RTA.from(Uint32Array, transferables.tagKeys);
56
+ this.tagVals = RTA.from(Uint32Array, transferables.tagVals);
57
+ this.keyEntities = RTA.from(Uint32Array, transferables.keyEntities);
58
+ this.keyIndexStart = RTA.from(Uint32Array, transferables.keyIndexStart);
59
+ this.keyIndexCount = RTA.from(Uint32Array, transferables.keyIndexCount);
60
+ this.indexBuilt = true;
61
+ }
62
+ else {
63
+ this.tagStart = new RTA(Uint32Array);
64
+ this.tagCount = new RTA(Uint8Array);
65
+ this.tagKeys = new RTA(Uint32Array);
66
+ this.tagVals = new RTA(Uint32Array);
67
+ this.keyEntities = new RTA(Uint32Array);
68
+ this.keyIndexStart = new RTA(Uint32Array);
69
+ this.keyIndexCount = new RTA(Uint32Array);
70
+ }
71
+ }
72
+ /**
73
+ * Add tags to an entity.
74
+ */
75
+ addTags(index, tags) {
76
+ const tagKeys = [];
77
+ const tagValues = [];
78
+ if (tags) {
79
+ for (const [key, value] of Object.entries(tags)) {
80
+ tagKeys.push(this.stringTable.add(key));
81
+ tagValues.push(this.stringTable.add(String(value)));
82
+ }
83
+ }
84
+ this.addTagKeysAndValues(index, tagKeys, tagValues);
85
+ return [tagKeys, tagValues];
86
+ }
87
+ /**
88
+ * Add tags to an entity using key and value indexes.
89
+ */
90
+ addTagKeysAndValues(index, keys, values) {
91
+ this.tagStart.set(index, this.tagKeys.length);
92
+ this.tagCount.set(index, keys.length);
93
+ this.tagKeys.pushMany(keys);
94
+ this.tagVals.pushMany(values);
95
+ keys.forEach((key) => {
96
+ const keyEntities = this.keyEntityIndexBuilder.get(key);
97
+ if (keyEntities) {
98
+ keyEntities.push(index);
99
+ }
100
+ else {
101
+ this.keyEntityIndexBuilder.set(key, [index]);
102
+ }
103
+ });
104
+ }
105
+ /**
106
+ * Finalize the tag index.
107
+ *
108
+ * Compacts arrays and builds the reverse key→entity index.
109
+ * Must be called before `hasKey()`.
110
+ */
111
+ buildIndex() {
112
+ this.tagStart.compact();
113
+ this.tagCount.compact();
114
+ this.tagKeys.compact();
115
+ this.tagVals.compact();
116
+ // Convert the builder map to flat arrays for the reverse index
117
+ for (const [keyIndex, entityIndexes] of this.keyEntityIndexBuilder) {
118
+ this.keyIndexStart.set(keyIndex, this.keyEntities.length);
119
+ this.keyIndexCount.set(keyIndex, entityIndexes.length);
120
+ this.keyEntities.pushMany(entityIndexes);
121
+ }
122
+ this.keyIndexStart.compact();
123
+ this.keyIndexCount.compact();
124
+ this.keyEntityIndexBuilder.clear();
125
+ this.indexBuilt = true;
126
+ }
127
+ /**
128
+ * Check if the index is built and ready for use.
129
+ */
130
+ isReady() {
131
+ return this.indexBuilt;
132
+ }
133
+ /**
134
+ * Get the number of tags for an entity.
135
+ */
136
+ cardinality(index) {
137
+ return this.tagCount.at(index) ?? 0;
138
+ }
139
+ /**
140
+ * Get the tags for an entity.
141
+ */
142
+ getTags(index) {
143
+ const tagCount = this.tagCount.at(index) ?? 0;
144
+ if (tagCount === 0)
145
+ return;
146
+ const tagStart = this.tagStart.at(index) ?? 0;
147
+ const tagKeyIndexes = this.tagKeys.array.slice(tagStart, tagStart + tagCount);
148
+ const tagValIndexes = this.tagVals.array.slice(tagStart, tagStart + tagCount);
149
+ const tags = {};
150
+ for (let i = 0; i < tagCount; i++) {
151
+ const keyIndex = tagKeyIndexes[i];
152
+ const valIndex = tagValIndexes[i];
153
+ if (keyIndex === undefined || valIndex === undefined)
154
+ throw Error("Tag key or value not found");
155
+ tags[this.stringTable.get(keyIndex)] = this.stringTable.get(valIndex);
156
+ }
157
+ return tags;
158
+ }
159
+ /**
160
+ * Get tags from key and value indexes.
161
+ */
162
+ getTagsFromIndices(keys, values) {
163
+ const tags = {};
164
+ for (let i = 0; i < keys.length; i++) {
165
+ const keyIndex = keys[i];
166
+ const valIndex = values[i];
167
+ if (keyIndex === undefined || valIndex === undefined)
168
+ throw Error("Tag key or value not found");
169
+ tags[this.stringTable.get(keyIndex)] = this.stringTable.get(valIndex);
170
+ }
171
+ return tags;
172
+ }
173
+ /**
174
+ * Find the index of a tag key.
175
+ */
176
+ find(key) {
177
+ return this.stringTable.find(key);
178
+ }
179
+ /**
180
+ * Get all entity indexes that have a specific tag key.
181
+ */
182
+ hasKey(keyIndex) {
183
+ if (keyIndex < 0)
184
+ return [];
185
+ const start = this.keyIndexStart.at(keyIndex) ?? 0;
186
+ const count = this.keyIndexCount.at(keyIndex) ?? 0;
187
+ return Array.from(this.keyEntities.array.subarray(start, start + count));
188
+ }
189
+ /**
190
+ * Create a unique composite index for a key=value pair.
191
+ * Uses row-major indexing: `key * width + val`.
192
+ */
193
+ kvToIndex(key, val) {
194
+ const width = this.stringTable.length;
195
+ return key * width + val;
196
+ }
197
+ /**
198
+ * Get transferable objects for passing to another thread.
199
+ */
200
+ transferables() {
201
+ return {
202
+ tagStart: this.tagStart.array.buffer,
203
+ tagCount: this.tagCount.array.buffer,
204
+ tagKeys: this.tagKeys.array.buffer,
205
+ tagVals: this.tagVals.array.buffer,
206
+ keyEntities: this.keyEntities.array.buffer,
207
+ keyIndexStart: this.keyIndexStart.array.buffer,
208
+ keyIndexCount: this.keyIndexCount.array.buffer,
209
+ };
210
+ }
211
+ /**
212
+ * Get the approximate memory requirements for a given number of tags in bytes.
213
+ */
214
+ static getBytesRequired(count) {
215
+ return (count * Uint32Array.BYTES_PER_ELEMENT + // tagStart
216
+ count * Uint8Array.BYTES_PER_ELEMENT // tagCount
217
+ );
218
+ }
219
+ /**
220
+ * Reconstruct a Tags index from transferable objects.
221
+ */
222
+ static fromTransferables(stringTable, transferables) {
223
+ const tagIndex = new Tags(stringTable, transferables);
224
+ tagIndex.indexBuilt = true;
225
+ return tagIndex;
226
+ }
227
+ }
228
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../../src/tags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Resizable typed array utilities.
3
+ *
4
+ * Wraps typed arrays with automatic buffer expansion (ArrayList semantics).
5
+ * Uses SharedArrayBuffer (if available) for zero-copy worker transfer.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * Use SharedArrayBuffer if the runtime supports it, otherwise fall back to ArrayBuffer.
11
+ * SharedArrayBuffer enables zero-copy transfer between workers.
12
+ */
13
+ export declare const BufferConstructor: SharedArrayBufferConstructor | ArrayBufferConstructor;
14
+ /** The buffer type used by this runtime (SharedArrayBuffer or ArrayBuffer). */
15
+ export type BufferType = InstanceType<typeof BufferConstructor>;
16
+ /**
17
+ * Union of all standard typed array types.
18
+ * Generic over buffer type to preserve SharedArrayBuffer compatibility.
19
+ */
20
+ export type TypedArray<B extends BufferType = BufferType> = Int8Array<B> | Uint8Array<B> | Uint8ClampedArray<B> | Int16Array<B> | Uint16Array<B> | Int32Array<B> | Uint32Array<B> | Float32Array<B> | Float64Array<B>;
21
+ /**
22
+ * Constructor interface for typed arrays.
23
+ */
24
+ export interface TypedArrayConstructor<T extends TypedArray<BufferType> = TypedArray<BufferType>> {
25
+ new (buffer: BufferType): T;
26
+ readonly BYTES_PER_ELEMENT: number;
27
+ }
28
+ /**
29
+ * Float64Array for storing OSM IDs.
30
+ *
31
+ * OSM IDs are 64-bit integers. JavaScript's number type (IEEE 754 double)
32
+ * can exactly represent integers up to 2^53, which covers all current OSM IDs.
33
+ * Float64Array allows typed array operations while maintaining precision.
34
+ */
35
+ export declare const IdArrayType: Float64ArrayConstructor;
36
+ /**
37
+ * Uint32Array for storing array indices.
38
+ *
39
+ * Internal indices into typed arrays never exceed 2^32 elements,
40
+ * so Uint32Array provides the best balance of range and memory efficiency.
41
+ */
42
+ export declare const IndexArrayType: Uint32ArrayConstructor;
43
+ /**
44
+ * Initial buffer size for ResizeableTypedArray.
45
+ * 1 MiB provides reasonable initial capacity while avoiding excessive memory allocation.
46
+ */
47
+ export declare const DEFAULT_BUFFER_SIZE: number;
48
+ /**
49
+ * Auto-expanding typed array wrapper.
50
+ *
51
+ * - `push()` appends elements, doubling buffer size as needed.
52
+ * - `compact()` shrinks buffer to fit data.
53
+ * - Supports growable SharedArrayBuffer and resizable ArrayBuffer.
54
+ */
55
+ export declare class ResizeableTypedArray<TA extends TypedArray> {
56
+ /** The typed array constructor for this instance */
57
+ ArrayType: TypedArrayConstructor<TA>;
58
+ /** The current typed array view into the buffer */
59
+ array: TA;
60
+ /** Number of items actually stored (may be less than array.length) */
61
+ items: number;
62
+ /** The underlying ArrayBuffer or SharedArrayBuffer */
63
+ buffer: BufferType;
64
+ /** Current buffer size in bytes */
65
+ bufferSize: number;
66
+ /** Maximum byte length for growable buffers */
67
+ maxByteLength: number;
68
+ /** Buffer constructor (SharedArrayBuffer or ArrayBuffer) */
69
+ BC: SharedArrayBufferConstructor | ArrayBufferConstructor;
70
+ /**
71
+ * Reconstruct a ResizeableTypedArray from an existing buffer.
72
+ *
73
+ * Used after transferring buffers between workers. The resulting array
74
+ * is considered "compacted" with items = array.length.
75
+ *
76
+ * @param ArrayType - The typed array constructor.
77
+ * @param buffer - The existing buffer to wrap.
78
+ * @returns A new ResizeableTypedArray wrapping the buffer.
79
+ */
80
+ static from<TA extends TypedArray>(ArrayType: TypedArrayConstructor<TA>, buffer: BufferType): ResizeableTypedArray<TA>;
81
+ /**
82
+ * Create a new ResizeableTypedArray with an empty buffer.
83
+ *
84
+ * @param ArrayType - The typed array constructor (e.g., Float64Array).
85
+ * @param BC - Buffer constructor to use (defaults to SharedArrayBuffer if available).
86
+ */
87
+ constructor(ArrayType: TypedArrayConstructor<TA>, BC?: SharedArrayBufferConstructor | ArrayBufferConstructor);
88
+ /**
89
+ * Iterate over the array values.
90
+ */
91
+ [Symbol.iterator](): ArrayIterator<number>;
92
+ /**
93
+ * Double the buffer capacity.
94
+ * Uses in-place grow/resize if supported, otherwise allocates new buffer and copies.
95
+ */
96
+ expandArray(): void;
97
+ /**
98
+ * Get the value at an index. Handles negative indices.
99
+ */
100
+ at(index: number): number;
101
+ /**
102
+ * Get a slice of the array.
103
+ */
104
+ slice(start: number, end: number): Int8Array<ArrayBuffer> | Uint8Array<ArrayBuffer> | Uint8ClampedArray<ArrayBuffer> | Int16Array<ArrayBuffer> | Uint16Array<ArrayBuffer> | Int32Array<ArrayBuffer> | Uint32Array<ArrayBuffer> | Float32Array<ArrayBuffer> | Float64Array<ArrayBuffer>;
105
+ get length(): number;
106
+ /**
107
+ * Push a value to the end of the array.
108
+ */
109
+ push(value: number): number;
110
+ /**
111
+ * Set a value at a specific index. Expands array if needed.
112
+ */
113
+ set(index: number, value: number): void;
114
+ /**
115
+ * Push multiple values to the end of the array.
116
+ */
117
+ pushMany(values: number[] | TypedArray): void;
118
+ /**
119
+ * Shrink the buffer to exactly fit stored items.
120
+ * Buffer becomes fixed-length after compacting.
121
+ */
122
+ compact(): TA;
123
+ }
124
+ //# sourceMappingURL=typed-arrays.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed-arrays.d.ts","sourceRoot":"","sources":["../../../src/typed-arrays.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB,uDAGa,CAAA;AAE3C,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE/D;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,IACrD,SAAS,CAAC,CAAC,CAAC,GACZ,UAAU,CAAC,CAAC,CAAC,GACb,iBAAiB,CAAC,CAAC,CAAC,GACpB,UAAU,CAAC,CAAC,CAAC,GACb,WAAW,CAAC,CAAC,CAAC,GACd,UAAU,CAAC,CAAC,CAAC,GACb,WAAW,CAAC,CAAC,CAAC,GACd,YAAY,CAAC,CAAC,CAAC,GACf,YAAY,CAAC,CAAC,CAAC,CAAA;AAElB;;GAEG;AACH,MAAM,WAAW,qBAAqB,CACrC,CAAC,SAAS,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC;IAEzD,KAAK,MAAM,EAAE,UAAU,GAAG,CAAC,CAAA;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;CAClC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,yBAAe,CAAA;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,wBAAc,CAAA;AAEzC;;;GAGG;AACH,eAAO,MAAM,mBAAmB,QAAU,CAAA;AAE1C;;;;;;GAMG;AACH,qBAAa,oBAAoB,CAAC,EAAE,SAAS,UAAU;IACtD,oDAAoD;IACpD,SAAS,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAA;IACpC,mDAAmD;IACnD,KAAK,EAAE,EAAE,CAAA;IACT,sEAAsE;IACtE,KAAK,SAAI;IAET,sDAAsD;IACtD,MAAM,EAAE,UAAU,CAAA;IAClB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAA;IAErB,4DAA4D;IAC5D,EAAE,EAAE,4BAA4B,GAAG,sBAAsB,CAAA;IAEzD;;;;;;;;;OASG;IACH,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,UAAU,EAChC,SAAS,EAAE,qBAAqB,CAAC,EAAE,CAAC,EACpC,MAAM,EAAE,UAAU;IAYnB;;;;;OAKG;gBAEF,SAAS,EAAE,qBAAqB,CAAC,EAAE,CAAC,EACpC,EAAE,GACC,4BAA4B,GAC5B,sBAA0C;IAY9C;;OAEG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC;IAI1C;;;OAGG;IACH,WAAW;IAwBX;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IASzB;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAIhC,IAAI,MAAM,WAET;IAED;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQ3B;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAShC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU;IAMtC;;;OAGG;IACH,OAAO;CAgBP"}