fix(outlines): harden shared cache and provider lifecycle

This commit is contained in:
manjunath22466 committed 2026-10-02 22:32:46 +05:30
1 parent 9559e7a282
commit 177b5951a0
27 files changed
+3363 -248

No files matched your search

+13
View File
@@ -11,6 +11,7 @@ import {
sampleGroundHeight,
} from './annotationResolver.js';
import { ringCentroid } from './drawMode.js';
import { phaseTiming } from '../sources/phaseTiming.js';
// Dev convenience: expose the app's Cesium instance for console/preview probing
// (single shared module instance — avoids dual-Cesium state bugs when testing).
@@ -679,6 +680,7 @@ export function createAnnotationEngine({
if (!annotations.has(anno.id)) return; // mark replaced/removed while resolving
anno.pendingOutline = false;
anno.outlineUnavailable = isUnavailableCapability(fp);
const installStart = performance.now();
if (anno.outlineUnavailable) renderer.update(anno);
if (fp && !anno.outlineUnavailable) {
anno.ring = fp.ring;
@@ -726,6 +728,17 @@ export function createAnnotationEngine({
}
}
renderer.sync(annotations);
if (fp && !anno.outlineUnavailable)
phaseTiming(
'install',
installStart,
{
kind: anno.footprintKind || null,
parts: anno.polygons?.length || (anno.ring ? 1 : 0),
points: anno.ring?.length || 0,
},
'outlines',
);
// Final outcome → the voice layer (place names ride as structured DATA fields).
// 'failed' covers both the definitive no-polygon and an exhausted transient
// retry — either way the mark honestly stays a point.
+10 -2
View File
@@ -6,7 +6,9 @@
// request reaches any Overpass endpoint.
import test from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { mkdtempSync, readFileSync, rmSync } from 'node:fs';
import os from 'node:os';
import path from 'node:path';
import { Readable } from 'node:stream';
import {
createOutlineRungs,
@@ -20,7 +22,10 @@ import { createNominatimOutlineClient } from '../sources/nominatimOutlines.js';
import { createApplicationRequestServices } from '../services/requests.js';
import { overpassProxy } from '../../server/providers/overpass.js';
import { geocodeProxy } from '../../server/providers/regional/place.js';
import { createNominatimGate } from '../../server/providers/regional/nominatimGate.js';
import {
createGateStateStore,
createNominatimGate,
} from '../../server/providers/regional/nominatimGate.js';
const TILES = [6745, 6746].map((y) =>
decodeOpenFreeMapOutlineTile(
@@ -332,6 +337,8 @@ test('default settings: outline, street and building asks send nothing to Overpa
t.mock.method(globalThis, 'fetch', async (url) => assert.fail(`unexpected network request ${url}`));
const upstream = [];
const stateDir = mkdtempSync(path.join(os.tmpdir(), 'gev-outline-rungs-'));
t.after(() => rmSync(stateDir, { recursive: true, force: true }));
const gate = createNominatimGate({
settings: { endpoint: 'https://nominatim.openstreetmap.org/search', isPublic: true, dailyCap: 50 },
fetchImpl: async (url) => {
@@ -339,6 +346,7 @@ test('default settings: outline, street and building asks send nothing to Overpa
const q = new URL(url).searchParams.get('q');
return Response.json(NOMINATIM_ROWS[q] || []);
},
usage: createGateStateStore({ file: path.join(stateDir, 'state.json') }),
sleep: async () => {},
});
const handlers = routes(overpassProxy(), geocodeProxy({ gate }));