Answer the review: share a graph request asked again, by its range and its drawn list
Graph requests were never shared, on the grounds that the scene never asks for the same graph twice. It does: turning the layer off and on while the worker is busy asks again for the graph already waiting. The new request superseded the old one, and the old one's rejection handler, which finds its request by range and drawn list, wiped the state of the new one: the layer stayed on with no graph. An identical request now shares the outstanding promise, a graph being the same when its range matches and its drawn list is the very same array. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016jxMkwA2rbicdGxHosecYi
This commit is contained in:
@@ -148,12 +148,38 @@ describe('RoutingClient with a worker', () => {
|
||||
const { client, worker } = clientWithFake();
|
||||
const once = client.route(100, 104, 1.5, 8);
|
||||
const again = client.route(100, 104, 1.5, 8);
|
||||
const widerRange = client.route(100, 104, 2.5, 8);
|
||||
|
||||
expect(worker.requests).toHaveLength(1);
|
||||
worker.answer({ kind: 'route', requestId: worker.requests[0].requestId, route: null, neededRangePc: 4 });
|
||||
|
||||
expect(await again).toEqual(await once);
|
||||
expect(worker.requests).toHaveLength(1);
|
||||
await flush();
|
||||
// The same two stars at another range is another question.
|
||||
expect(worker.requests.map((request) => request.rangePc)).toEqual([1.5, 2.5]);
|
||||
worker.answer({ kind: 'route', requestId: worker.requests[1].requestId, route: null, neededRangePc: null });
|
||||
await expect(widerRange).resolves.toEqual({ route: null, neededRangePc: null });
|
||||
client.dispose();
|
||||
});
|
||||
|
||||
// Turning the layer off and on again while the worker is busy asks for the same graph twice. Were
|
||||
// the second to replace the first, the first's rejection would wipe the scene's record of the second.
|
||||
it('shares a graph already on its way for the same range and the same list of drawn stars', async () => {
|
||||
const { client, worker } = clientWithFake();
|
||||
const drawn = Uint32Array.of(0, 1, 2);
|
||||
const building = client.links(3, drawn);
|
||||
const waiting = client.links(5, drawn);
|
||||
const again = client.links(5, drawn);
|
||||
const sameAsBuilding = client.links(3, drawn);
|
||||
|
||||
worker.answer({ kind: 'links', requestId: worker.requests[0].requestId, segments: new Float32Array(6) });
|
||||
await expect(building).resolves.toHaveLength(6);
|
||||
await expect(sameAsBuilding).resolves.toHaveLength(6);
|
||||
await flush();
|
||||
worker.answer({ kind: 'links', requestId: worker.requests[1].requestId, segments: new Float32Array(12) });
|
||||
await expect(waiting).resolves.toHaveLength(12);
|
||||
await expect(again).resolves.toHaveLength(12);
|
||||
expect(worker.requests.map((request) => request.kind === 'links' && request.rangePc)).toEqual([3, 5]);
|
||||
client.dispose();
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user