@osmix/router 0.0.2

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 (64) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +149 -0
  3. package/dist/src/algorithms/bidirectional.d.ts +19 -0
  4. package/dist/src/algorithms/bidirectional.d.ts.map +1 -0
  5. package/dist/src/algorithms/bidirectional.js +128 -0
  6. package/dist/src/algorithms/bidirectional.js.map +1 -0
  7. package/dist/src/algorithms/index.d.ts +17 -0
  8. package/dist/src/algorithms/index.d.ts.map +1 -0
  9. package/dist/src/algorithms/index.js +19 -0
  10. package/dist/src/algorithms/index.js.map +1 -0
  11. package/dist/src/algorithms/shortest-path.d.ts +24 -0
  12. package/dist/src/algorithms/shortest-path.d.ts.map +1 -0
  13. package/dist/src/algorithms/shortest-path.js +115 -0
  14. package/dist/src/algorithms/shortest-path.js.map +1 -0
  15. package/dist/src/binary-heap.d.ts +40 -0
  16. package/dist/src/binary-heap.d.ts.map +1 -0
  17. package/dist/src/binary-heap.js +122 -0
  18. package/dist/src/binary-heap.js.map +1 -0
  19. package/dist/src/graph.d.ts +135 -0
  20. package/dist/src/graph.d.ts.map +1 -0
  21. package/dist/src/graph.js +339 -0
  22. package/dist/src/graph.js.map +1 -0
  23. package/dist/src/index.d.ts +41 -0
  24. package/dist/src/index.d.ts.map +1 -0
  25. package/dist/src/index.js +41 -0
  26. package/dist/src/index.js.map +1 -0
  27. package/dist/src/router.d.ts +55 -0
  28. package/dist/src/router.d.ts.map +1 -0
  29. package/dist/src/router.js +189 -0
  30. package/dist/src/router.js.map +1 -0
  31. package/dist/src/types.d.ts +118 -0
  32. package/dist/src/types.d.ts.map +1 -0
  33. package/dist/src/types.js +5 -0
  34. package/dist/src/types.js.map +1 -0
  35. package/dist/src/utils.d.ts +20 -0
  36. package/dist/src/utils.d.ts.map +1 -0
  37. package/dist/src/utils.js +101 -0
  38. package/dist/src/utils.js.map +1 -0
  39. package/dist/test/algorithms.test.d.ts +2 -0
  40. package/dist/test/algorithms.test.d.ts.map +1 -0
  41. package/dist/test/algorithms.test.js +382 -0
  42. package/dist/test/algorithms.test.js.map +1 -0
  43. package/dist/test/router.bench.d.ts +2 -0
  44. package/dist/test/router.bench.d.ts.map +1 -0
  45. package/dist/test/router.bench.js +191 -0
  46. package/dist/test/router.bench.js.map +1 -0
  47. package/dist/test/router.test.d.ts +2 -0
  48. package/dist/test/router.test.d.ts.map +1 -0
  49. package/dist/test/router.test.js +515 -0
  50. package/dist/test/router.test.js.map +1 -0
  51. package/package.json +51 -0
  52. package/src/algorithms/bidirectional.ts +147 -0
  53. package/src/algorithms/index.ts +23 -0
  54. package/src/algorithms/shortest-path.ts +149 -0
  55. package/src/binary-heap.ts +147 -0
  56. package/src/graph.ts +414 -0
  57. package/src/index.ts +41 -0
  58. package/src/router.ts +262 -0
  59. package/src/types.ts +138 -0
  60. package/src/utils.ts +114 -0
  61. package/test/algorithms.test.ts +466 -0
  62. package/test/router.bench.ts +257 -0
  63. package/test/router.test.ts +738 -0
  64. package/tsconfig.json +9 -0
@@ -0,0 +1,515 @@
1
+ import { beforeAll, describe, expect, it } from "bun:test";
2
+ import { Osm } from "@osmix/core";
3
+ import { getFixtureFile, PBFs } from "@osmix/shared/test/fixtures";
4
+ import { fromPbf } from "osmix";
5
+ import { buildGraph, getTransferableBuffers, RoutingGraph } from "../src";
6
+ import { Router } from "../src/router";
7
+ /**
8
+ * Create a simple OSM with a routeable network
9
+ */
10
+ function createTestOsm() {
11
+ const osm = new Osm({ id: "test" });
12
+ // Create a simple grid network
13
+ // Nodes: 4 corners of a square
14
+ osm.nodes.addNode({ id: 1, lat: 0, lon: 0 });
15
+ osm.nodes.addNode({ id: 2, lat: 0, lon: 0.01 });
16
+ osm.nodes.addNode({ id: 3, lat: 0.01, lon: 0 });
17
+ osm.nodes.addNode({ id: 4, lat: 0.01, lon: 0.01 });
18
+ // Center intersection node
19
+ osm.nodes.addNode({ id: 5, lat: 0.005, lon: 0.005 });
20
+ osm.nodes.buildIndex();
21
+ osm.nodes.buildSpatialIndex();
22
+ // Create ways connecting the nodes
23
+ // Way 1: horizontal bottom (1 -> 2)
24
+ osm.ways.addWay({
25
+ id: 1,
26
+ refs: [1, 2],
27
+ tags: { highway: "primary" },
28
+ });
29
+ // Way 2: vertical left (1 -> 3)
30
+ osm.ways.addWay({
31
+ id: 2,
32
+ refs: [1, 3],
33
+ tags: { highway: "primary" },
34
+ });
35
+ // Way 3: horizontal top (3 -> 4)
36
+ osm.ways.addWay({
37
+ id: 3,
38
+ refs: [3, 4],
39
+ tags: { highway: "primary" },
40
+ });
41
+ // Way 4: vertical right (2 -> 4)
42
+ osm.ways.addWay({
43
+ id: 4,
44
+ refs: [2, 4],
45
+ tags: { highway: "primary" },
46
+ });
47
+ // Way 5: diagonal through center (1 -> 5 -> 4)
48
+ osm.ways.addWay({
49
+ id: 5,
50
+ refs: [1, 5, 4],
51
+ tags: { highway: "secondary" },
52
+ });
53
+ osm.ways.buildIndex();
54
+ osm.ways.buildSpatialIndex();
55
+ osm.buildIndexes();
56
+ return osm;
57
+ }
58
+ describe("Router", () => {
59
+ it("should create a router with default config", () => {
60
+ const osm = createTestOsm();
61
+ const router = new Router(osm, buildGraph(osm));
62
+ expect(router).toBeDefined();
63
+ });
64
+ it("should create a router with custom highway filter", () => {
65
+ const osm = createTestOsm();
66
+ const graph = buildGraph(osm, (tags) => tags?.["highway"] === "primary");
67
+ const router = new Router(osm, graph);
68
+ expect(router).toBeDefined();
69
+ });
70
+ it("should find a route between two nearby nodes", () => {
71
+ const osm = createTestOsm();
72
+ const graph = buildGraph(osm);
73
+ const router = new Router(osm, graph);
74
+ // Snap coordinates to nodes
75
+ const from = graph.findNearestRoutableNode(osm, [0, 0], 500);
76
+ const to = graph.findNearestRoutableNode(osm, [0, 0.01], 500);
77
+ expect(from).not.toBeNull();
78
+ expect(to).not.toBeNull();
79
+ // Route between node indexes
80
+ const path = router.route(from.nodeIndex, to.nodeIndex);
81
+ expect(path).not.toBeNull();
82
+ expect(path.length).toBeGreaterThan(0);
83
+ });
84
+ it("should return path segments with node and way info", () => {
85
+ const osm = createTestOsm();
86
+ const graph = buildGraph(osm);
87
+ const router = new Router(osm, graph);
88
+ const from = graph.findNearestRoutableNode(osm, [0, 0], 500);
89
+ const to = graph.findNearestRoutableNode(osm, [0.01, 0.01], 500);
90
+ const path = router.route(from.nodeIndex, to.nodeIndex);
91
+ expect(path).not.toBeNull();
92
+ if (path) {
93
+ // Verify path segments have required fields
94
+ for (const segment of path) {
95
+ expect(typeof segment.nodeIndex).toBe("number");
96
+ expect(typeof segment.cost).toBe("number");
97
+ }
98
+ // Build result to get coordinates
99
+ const result = router.buildResult(path);
100
+ expect(result.coordinates.length).toBeGreaterThan(0);
101
+ expect(Array.isArray(result.wayIndexes)).toBe(true);
102
+ expect(Array.isArray(result.nodeIndexes)).toBe(true);
103
+ }
104
+ });
105
+ it("should return null for unreachable destinations", () => {
106
+ const osm = new Osm({ id: "test" });
107
+ osm.nodes.addNode({ id: 1, lat: 0, lon: 0 });
108
+ osm.nodes.addNode({ id: 2, lat: 10, lon: 10 }); // Far away, no way connecting
109
+ osm.nodes.buildIndex();
110
+ osm.nodes.buildSpatialIndex();
111
+ osm.buildIndexes();
112
+ const graph = buildGraph(osm);
113
+ // Can't snap because no routable ways
114
+ const from = graph.findNearestRoutableNode(osm, [0, 0], 500);
115
+ const to = graph.findNearestRoutableNode(osm, [10, 10], 500);
116
+ expect(from).toBeNull();
117
+ expect(to).toBeNull();
118
+ });
119
+ it("should filter ways based on highway filter", () => {
120
+ const osm = createTestOsm();
121
+ // Only include primary highways
122
+ const graph = buildGraph(osm, (tags) => tags?.["highway"] === "primary");
123
+ const router = new Router(osm, graph);
124
+ const from = graph.findNearestRoutableNode(osm, [0, 0], 500);
125
+ const to = graph.findNearestRoutableNode(osm, [0.01, 0.01], 500);
126
+ const path = router.route(from.nodeIndex, to.nodeIndex);
127
+ // Should find a route using only primary ways
128
+ if (path) {
129
+ const result = router.buildResult(path);
130
+ // Way index 4 is the secondary highway (ID 5)
131
+ expect(result.wayIndexes).not.toContain(4);
132
+ }
133
+ });
134
+ it("should handle same start and end node", () => {
135
+ const osm = createTestOsm();
136
+ const graph = buildGraph(osm);
137
+ const router = new Router(osm, graph);
138
+ const from = graph.findNearestRoutableNode(osm, [0, 0], 500);
139
+ const path = router.route(from.nodeIndex, from.nodeIndex);
140
+ expect(path).not.toBeNull();
141
+ expect(path.length).toBe(1);
142
+ expect(path[0].nodeIndex).toBe(from.nodeIndex);
143
+ });
144
+ it("should use different algorithms", () => {
145
+ const osm = createTestOsm();
146
+ const graph = buildGraph(osm);
147
+ const router = new Router(osm, graph);
148
+ const from = graph.findNearestRoutableNode(osm, [0, 0], 500);
149
+ const to = graph.findNearestRoutableNode(osm, [0.01, 0.01], 500);
150
+ const path1 = router.route(from.nodeIndex, to.nodeIndex, {
151
+ algorithm: "dijkstra",
152
+ });
153
+ const path2 = router.route(from.nodeIndex, to.nodeIndex, {
154
+ algorithm: "astar",
155
+ });
156
+ const path3 = router.route(from.nodeIndex, to.nodeIndex, {
157
+ algorithm: "bidirectional",
158
+ });
159
+ // All should find a path
160
+ const paths = [path1, path2, path3].filter((p) => p !== null);
161
+ expect(paths.length).toBe(3);
162
+ // All paths should have segments
163
+ for (const path of paths) {
164
+ expect(path.length).toBeGreaterThan(0);
165
+ }
166
+ });
167
+ it("should support distance and time metrics", () => {
168
+ const osm = createTestOsm();
169
+ const graph = buildGraph(osm);
170
+ const router = new Router(osm, graph);
171
+ const from = graph.findNearestRoutableNode(osm, [0, 0], 500);
172
+ const to = graph.findNearestRoutableNode(osm, [0.01, 0.01], 500);
173
+ const path1 = router.route(from.nodeIndex, to.nodeIndex, {
174
+ metric: "distance",
175
+ });
176
+ const path2 = router.route(from.nodeIndex, to.nodeIndex, {
177
+ metric: "time",
178
+ });
179
+ // Both should find paths
180
+ expect(path1).not.toBeNull();
181
+ expect(path2).not.toBeNull();
182
+ });
183
+ });
184
+ describe("Router with Monaco PBF", () => {
185
+ const monacoPbf = PBFs["monaco"];
186
+ let monacoOsm;
187
+ beforeAll(async () => {
188
+ const pbfData = await getFixtureFile(monacoPbf.url);
189
+ monacoOsm = await fromPbf(pbfData);
190
+ });
191
+ it("should create a router from Monaco OSM data", () => {
192
+ const graph = buildGraph(monacoOsm);
193
+ const router = new Router(monacoOsm, graph);
194
+ expect(router).toBeDefined();
195
+ // 11,414 total edges in the graph (bidirectional edges counted separately)
196
+ expect(graph.edges).toBe(11_414);
197
+ });
198
+ it("should find routes between points in Monaco", () => {
199
+ const graph = buildGraph(monacoOsm);
200
+ const router = new Router(monacoOsm, graph);
201
+ // Use coordinates known to have routeable nodes nearby
202
+ const from = graph.findNearestRoutableNode(monacoOsm, [7.4229093, 43.7371175], 500);
203
+ const to = graph.findNearestRoutableNode(monacoOsm, [7.4259193, 43.7377731], 500);
204
+ expect(from).not.toBeNull();
205
+ expect(to).not.toBeNull();
206
+ const path = router.route(from.nodeIndex, to.nodeIndex);
207
+ expect(path).not.toBeNull();
208
+ expect(path.length).toBeGreaterThan(0);
209
+ // Build result and verify coordinates
210
+ const result = router.buildResult(path);
211
+ expect(result.coordinates.length).toBeGreaterThan(0);
212
+ expect(result.wayIndexes.length).toBeGreaterThan(0);
213
+ // Verify coordinates are in Monaco bbox
214
+ for (const coord of result.coordinates) {
215
+ expect(coord[0]).toBeGreaterThanOrEqual(7.4);
216
+ expect(coord[0]).toBeLessThanOrEqual(7.45);
217
+ expect(coord[1]).toBeGreaterThanOrEqual(43.72);
218
+ expect(coord[1]).toBeLessThanOrEqual(43.76);
219
+ }
220
+ });
221
+ it("should return routes with valid way indexes from Monaco", () => {
222
+ const graph = buildGraph(monacoOsm);
223
+ const router = new Router(monacoOsm, graph);
224
+ const from = graph.findNearestRoutableNode(monacoOsm, [7.4229093, 43.7371175], 500);
225
+ const to = graph.findNearestRoutableNode(monacoOsm, [7.4259193, 43.7377731], 500);
226
+ const path = router.route(from.nodeIndex, to.nodeIndex);
227
+ if (path) {
228
+ const result = router.buildResult(path);
229
+ // Verify way indexes are valid
230
+ for (const wayIndex of result.wayIndexes) {
231
+ const way = monacoOsm.ways.getByIndex(wayIndex);
232
+ expect(way).not.toBeNull();
233
+ expect(way?.tags?.["highway"]).toBeDefined();
234
+ }
235
+ }
236
+ });
237
+ it("should find routes using different algorithms in Monaco", () => {
238
+ const graph = buildGraph(monacoOsm);
239
+ const router = new Router(monacoOsm, graph);
240
+ const from = graph.findNearestRoutableNode(monacoOsm, [7.4229093, 43.7371175], 500);
241
+ const to = graph.findNearestRoutableNode(monacoOsm, [7.4259193, 43.7377731], 500);
242
+ const dijkstraPath = router.route(from.nodeIndex, to.nodeIndex, {
243
+ algorithm: "dijkstra",
244
+ });
245
+ const astarPath = router.route(from.nodeIndex, to.nodeIndex, {
246
+ algorithm: "astar",
247
+ });
248
+ const bidirectionalPath = router.route(from.nodeIndex, to.nodeIndex, {
249
+ algorithm: "bidirectional",
250
+ });
251
+ // All should find paths
252
+ const paths = [dijkstraPath, astarPath, bidirectionalPath].filter((p) => p !== null);
253
+ expect(paths.length).toBe(3);
254
+ // All paths should have segments
255
+ for (const path of paths) {
256
+ expect(path.length).toBeGreaterThan(0);
257
+ }
258
+ });
259
+ it("should handle time-based routing in Monaco", () => {
260
+ const graph = buildGraph(monacoOsm);
261
+ const router = new Router(monacoOsm, graph);
262
+ const from = graph.findNearestRoutableNode(monacoOsm, [7.4229093, 43.7371175], 500);
263
+ const to = graph.findNearestRoutableNode(monacoOsm, [7.4259193, 43.7377731], 500);
264
+ const path = router.route(from.nodeIndex, to.nodeIndex, {
265
+ metric: "time",
266
+ });
267
+ expect(path).not.toBeNull();
268
+ expect(path.length).toBeGreaterThan(0);
269
+ });
270
+ it("should return null when snap fails", () => {
271
+ const graph = buildGraph(monacoOsm);
272
+ // Point far outside Monaco
273
+ const farPoint = graph.findNearestRoutableNode(monacoOsm, [10.0, 50.0], 100);
274
+ expect(farPoint).toBeNull();
275
+ });
276
+ it("should calculate route statistics with getRouteStatistics()", () => {
277
+ const graph = buildGraph(monacoOsm);
278
+ const router = new Router(monacoOsm, graph);
279
+ const from = graph.findNearestRoutableNode(monacoOsm, [7.4229093, 43.7371175], 500);
280
+ const to = graph.findNearestRoutableNode(monacoOsm, [7.4259193, 43.7377731], 500);
281
+ const path = router.route(from.nodeIndex, to.nodeIndex);
282
+ expect(path).not.toBeNull();
283
+ const stats = router.getRouteStatistics(path);
284
+ // Should have positive distance and time
285
+ expect(stats.distance).toBeGreaterThan(0);
286
+ expect(stats.time).toBeGreaterThan(0);
287
+ // Distance should be reasonable for Monaco (< 10km)
288
+ expect(stats.distance).toBeLessThan(10_000);
289
+ });
290
+ it("should build path info with getRoutePathInfo()", () => {
291
+ const graph = buildGraph(monacoOsm);
292
+ const router = new Router(monacoOsm, graph);
293
+ const from = graph.findNearestRoutableNode(monacoOsm, [7.4229093, 43.7371175], 500);
294
+ const to = graph.findNearestRoutableNode(monacoOsm, [7.4259193, 43.7377731], 500);
295
+ const path = router.route(from.nodeIndex, to.nodeIndex);
296
+ expect(path).not.toBeNull();
297
+ const pathInfo = router.getRoutePathInfo(path);
298
+ // Should have at least one segment
299
+ expect(pathInfo.segments.length).toBeGreaterThan(0);
300
+ // Each segment should have required fields
301
+ for (const segment of pathInfo.segments) {
302
+ expect(Array.isArray(segment.wayIds)).toBe(true);
303
+ expect(segment.wayIds.length).toBeGreaterThan(0);
304
+ expect(typeof segment.name).toBe("string");
305
+ expect(typeof segment.highway).toBe("string");
306
+ expect(segment.distance).toBeGreaterThan(0);
307
+ expect(segment.time).toBeGreaterThan(0);
308
+ }
309
+ // Turn points should be coordinates
310
+ for (const turnPoint of pathInfo.turnPoints) {
311
+ expect(Array.isArray(turnPoint)).toBe(true);
312
+ expect(turnPoint.length).toBe(2);
313
+ expect(typeof turnPoint[0]).toBe("number");
314
+ expect(typeof turnPoint[1]).toBe("number");
315
+ }
316
+ });
317
+ it("should include stats in buildResult() when includeStats is true", () => {
318
+ const graph = buildGraph(monacoOsm);
319
+ const router = new Router(monacoOsm, graph);
320
+ const from = graph.findNearestRoutableNode(monacoOsm, [7.4229093, 43.7371175], 500);
321
+ const to = graph.findNearestRoutableNode(monacoOsm, [7.4259193, 43.7377731], 500);
322
+ const path = router.route(from.nodeIndex, to.nodeIndex);
323
+ expect(path).not.toBeNull();
324
+ // Without options - no stats
325
+ const resultWithoutStats = router.buildResult(path);
326
+ expect(resultWithoutStats.distance).toBeUndefined();
327
+ expect(resultWithoutStats.time).toBeUndefined();
328
+ // With includeStats: true
329
+ const resultWithStats = router.buildResult(path, { includeStats: true });
330
+ expect(resultWithStats.distance).toBeGreaterThan(0);
331
+ expect(resultWithStats.time).toBeGreaterThan(0);
332
+ });
333
+ it("should include path info in buildResult() when includePathInfo is true", () => {
334
+ const graph = buildGraph(monacoOsm);
335
+ const router = new Router(monacoOsm, graph);
336
+ const from = graph.findNearestRoutableNode(monacoOsm, [7.4229093, 43.7371175], 500);
337
+ const to = graph.findNearestRoutableNode(monacoOsm, [7.4259193, 43.7377731], 500);
338
+ const path = router.route(from.nodeIndex, to.nodeIndex);
339
+ expect(path).not.toBeNull();
340
+ // Without options - no path info
341
+ const resultWithoutPathInfo = router.buildResult(path);
342
+ expect(resultWithoutPathInfo.segments).toBeUndefined();
343
+ expect(resultWithoutPathInfo.turnPoints).toBeUndefined();
344
+ // With includePathInfo: true
345
+ const resultWithPathInfo = router.buildResult(path, {
346
+ includePathInfo: true,
347
+ });
348
+ expect(resultWithPathInfo.segments).toBeDefined();
349
+ expect(resultWithPathInfo.segments.length).toBeGreaterThan(0);
350
+ expect(resultWithPathInfo.turnPoints).toBeDefined();
351
+ });
352
+ it("should include both stats and path info when both options are true", () => {
353
+ const graph = buildGraph(monacoOsm);
354
+ const router = new Router(monacoOsm, graph);
355
+ const from = graph.findNearestRoutableNode(monacoOsm, [7.4229093, 43.7371175], 500);
356
+ const to = graph.findNearestRoutableNode(monacoOsm, [7.4259193, 43.7377731], 500);
357
+ const path = router.route(from.nodeIndex, to.nodeIndex);
358
+ expect(path).not.toBeNull();
359
+ const result = router.buildResult(path, {
360
+ includeStats: true,
361
+ includePathInfo: true,
362
+ });
363
+ // Should have coordinates (always present)
364
+ expect(result.coordinates.length).toBeGreaterThan(0);
365
+ // Should have stats
366
+ expect(result.distance).toBeGreaterThan(0);
367
+ expect(result.time).toBeGreaterThan(0);
368
+ // Should have path info
369
+ expect(result.segments).toBeDefined();
370
+ expect(result.segments.length).toBeGreaterThan(0);
371
+ expect(result.turnPoints).toBeDefined();
372
+ // Verify segment totals roughly match stats
373
+ const segmentDistanceSum = result.segments.reduce((sum, seg) => sum + seg.distance, 0);
374
+ const segmentTimeSum = result.segments.reduce((sum, seg) => sum + seg.time, 0);
375
+ expect(segmentDistanceSum).toBeCloseTo(result.distance, 1);
376
+ expect(segmentTimeSum).toBeCloseTo(result.time, 1);
377
+ });
378
+ it("should use default options from constructor", () => {
379
+ const graph = buildGraph(monacoOsm);
380
+ const router = new Router(monacoOsm, graph, {
381
+ includeStats: true,
382
+ includePathInfo: true,
383
+ });
384
+ const from = graph.findNearestRoutableNode(monacoOsm, [7.4229093, 43.7371175], 500);
385
+ const to = graph.findNearestRoutableNode(monacoOsm, [7.4259193, 43.7377731], 500);
386
+ const path = router.route(from.nodeIndex, to.nodeIndex);
387
+ expect(path).not.toBeNull();
388
+ // buildResult without options should use constructor defaults
389
+ const result = router.buildResult(path);
390
+ expect(result.distance).toBeGreaterThan(0);
391
+ expect(result.time).toBeGreaterThan(0);
392
+ expect(result.segments).toBeDefined();
393
+ expect(result.turnPoints).toBeDefined();
394
+ });
395
+ });
396
+ describe("RoutingGraph Serialization", () => {
397
+ it("should serialize and reconstruct graph correctly", () => {
398
+ const osm = new Osm({ id: "test" });
399
+ // Create a simple network
400
+ osm.nodes.addNode({ id: 1, lat: 0, lon: 0 });
401
+ osm.nodes.addNode({ id: 2, lat: 0, lon: 0.01 });
402
+ osm.nodes.addNode({ id: 3, lat: 0.01, lon: 0.01 });
403
+ osm.nodes.buildIndex();
404
+ osm.nodes.buildSpatialIndex();
405
+ osm.ways.addWay({
406
+ id: 1,
407
+ refs: [1, 2, 3],
408
+ tags: { highway: "primary" },
409
+ });
410
+ osm.ways.buildIndex();
411
+ osm.ways.buildSpatialIndex();
412
+ osm.buildIndexes();
413
+ // Build and compact the graph
414
+ const originalGraph = buildGraph(osm);
415
+ // Get transferables
416
+ const transferables = originalGraph.transferables();
417
+ // Verify transferables structure
418
+ expect(transferables.nodeCount).toBe(osm.nodes.size);
419
+ expect(transferables.edgeCount).toBe(originalGraph.edges);
420
+ // Buffers can be either ArrayBuffer or SharedArrayBuffer depending on runtime
421
+ const isBuffer = (b) => b instanceof ArrayBuffer || b instanceof SharedArrayBuffer;
422
+ expect(isBuffer(transferables.edgeOffsets)).toBe(true);
423
+ expect(isBuffer(transferables.edgeTargets)).toBe(true);
424
+ expect(isBuffer(transferables.edgeDistances)).toBe(true);
425
+ expect(isBuffer(transferables.edgeTimes)).toBe(true);
426
+ expect(isBuffer(transferables.routableBits)).toBe(true);
427
+ expect(isBuffer(transferables.intersectionBits)).toBe(true);
428
+ // Reconstruct graph from transferables
429
+ const reconstructedGraph = new RoutingGraph(transferables);
430
+ // Verify properties match
431
+ expect(reconstructedGraph.size).toBe(originalGraph.size);
432
+ expect(reconstructedGraph.edges).toBe(originalGraph.edges);
433
+ // Verify edges for each node match
434
+ for (let i = 0; i < osm.nodes.size; i++) {
435
+ const origEdges = originalGraph.getEdges(i);
436
+ const reconEdges = reconstructedGraph.getEdges(i);
437
+ expect(reconEdges.length).toBe(origEdges.length);
438
+ for (let j = 0; j < origEdges.length; j++) {
439
+ expect(reconEdges[j].targetNodeIndex).toBe(origEdges[j].targetNodeIndex);
440
+ expect(reconEdges[j].wayIndex).toBe(origEdges[j].wayIndex);
441
+ expect(reconEdges[j].distance).toBeCloseTo(origEdges[j].distance, 2);
442
+ expect(reconEdges[j].time).toBeCloseTo(origEdges[j].time, 2);
443
+ }
444
+ }
445
+ // Verify routable and intersection flags
446
+ expect(reconstructedGraph.isRoutable(0)).toBe(originalGraph.isRoutable(0));
447
+ expect(reconstructedGraph.isRoutable(1)).toBe(originalGraph.isRoutable(1));
448
+ expect(reconstructedGraph.isRoutable(2)).toBe(originalGraph.isRoutable(2));
449
+ expect(reconstructedGraph.isIntersection(0)).toBe(originalGraph.isIntersection(0));
450
+ expect(reconstructedGraph.isIntersection(1)).toBe(originalGraph.isIntersection(1));
451
+ });
452
+ it("should produce working router after reconstruction", () => {
453
+ const osm = new Osm({ id: "test" });
454
+ osm.nodes.addNode({ id: 1, lat: 0, lon: 0 });
455
+ osm.nodes.addNode({ id: 2, lat: 0, lon: 0.01 });
456
+ osm.nodes.addNode({ id: 3, lat: 0.01, lon: 0.01 });
457
+ osm.nodes.buildIndex();
458
+ osm.nodes.buildSpatialIndex();
459
+ osm.ways.addWay({
460
+ id: 1,
461
+ refs: [1, 2, 3],
462
+ tags: { highway: "primary" },
463
+ });
464
+ osm.ways.buildIndex();
465
+ osm.ways.buildSpatialIndex();
466
+ osm.buildIndexes();
467
+ const originalGraph = buildGraph(osm);
468
+ const transferables = originalGraph.transferables();
469
+ const reconstructedGraph = new RoutingGraph(transferables);
470
+ // Create routers with both graphs
471
+ const router1 = new Router(osm, originalGraph);
472
+ const router2 = new Router(osm, reconstructedGraph);
473
+ // Both should find the same route
474
+ const path1 = router1.route(0, 2);
475
+ const path2 = router2.route(0, 2);
476
+ expect(path1).not.toBeNull();
477
+ expect(path2).not.toBeNull();
478
+ expect(path1.length).toBe(path2.length);
479
+ for (let i = 0; i < path1.length; i++) {
480
+ expect(path1[i].nodeIndex).toBe(path2[i].nodeIndex);
481
+ }
482
+ });
483
+ it("should provide transferable buffers for postMessage", () => {
484
+ const osm = new Osm({ id: "test" });
485
+ osm.nodes.addNode({ id: 1, lat: 0, lon: 0 });
486
+ osm.nodes.addNode({ id: 2, lat: 0, lon: 0.01 });
487
+ osm.nodes.buildIndex();
488
+ osm.nodes.buildSpatialIndex();
489
+ osm.ways.addWay({
490
+ id: 1,
491
+ refs: [1, 2],
492
+ tags: { highway: "primary" },
493
+ });
494
+ osm.ways.buildIndex();
495
+ osm.ways.buildSpatialIndex();
496
+ osm.buildIndexes();
497
+ const graph = buildGraph(osm);
498
+ const transferables = graph.transferables();
499
+ const buffers = getTransferableBuffers(transferables);
500
+ // When SharedArrayBuffer is available, returns empty (they're shared, not transferred).
501
+ // When only ArrayBuffer is available, returns all 7 buffers.
502
+ const usesSharedArrayBuffer = typeof SharedArrayBuffer !== "undefined" &&
503
+ transferables.edgeOffsets instanceof SharedArrayBuffer;
504
+ if (usesSharedArrayBuffer) {
505
+ expect(buffers.length).toBe(0);
506
+ }
507
+ else {
508
+ expect(buffers.length).toBe(7);
509
+ for (const buffer of buffers) {
510
+ expect(buffer).toBeInstanceOf(ArrayBuffer);
511
+ }
512
+ }
513
+ });
514
+ });
515
+ //# sourceMappingURL=router.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.test.js","sourceRoot":"","sources":["../../test/router.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/package",
3
+ "name": "@osmix/router",
4
+ "type": "module",
5
+ "version": "0.0.2",
6
+ "description": "A routing engine for OSM data built on top of @osmix/core",
7
+ "main": "./src/index.ts",
8
+ "publishConfig": {
9
+ "access": "public",
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/index.js",
15
+ "types": "./dist/index.d.ts"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ]
23
+ },
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/conveyal/osmix.git"
28
+ },
29
+ "homepage": "https://github.com/conveyal/osmix#readme",
30
+ "bugs": {
31
+ "url": "https://github.com/conveyal/osmix/issues"
32
+ },
33
+ "sideEffects": false,
34
+ "scripts": {
35
+ "build": "tsc",
36
+ "bench": "bun run test/router.bench.ts",
37
+ "prepublishOnly": "tsc",
38
+ "test": "bun test",
39
+ "typecheck": "tsgo --noEmit"
40
+ },
41
+ "devDependencies": {
42
+ "@types/bun": "catalog:",
43
+ "mitata": "^1.0.34",
44
+ "osmix": "workspace:*",
45
+ "typescript": "catalog:"
46
+ },
47
+ "dependencies": {
48
+ "@osmix/core": "workspace:*",
49
+ "@osmix/shared": "workspace:*"
50
+ }
51
+ }