Abort requests [#608] (#625)

* Properly abort requests using AbortController

* add basic adapter tests

---------

Co-authored-by: Andrew Dassonville <dassonville.andrew@gmail.com>
This commit is contained in:
Brandon Liu
2025-12-24 17:33:11 +08:00
committed by GitHub
parent a5f8a89256
commit cabe8a898a
6 changed files with 536 additions and 405 deletions

119
js/test/adapter.test.ts Normal file
View File

@@ -0,0 +1,119 @@
import assert from "node:assert";
import { describe, mock, test } from "node:test";
import { PMTiles, Protocol } from "../src";
import { mockServer } from "./utils";
describe("Protocol", () => {
test("get TileJSON", async () => {
mockServer.reset();
const pmtiles = new PMTiles("http://localhost:1337/example.pmtiles");
const protocol = new Protocol();
protocol.add(pmtiles);
const result = await protocol.tilev4(
{
url: "pmtiles://http://localhost:1337/example.pmtiles",
type: "json",
},
new AbortController()
);
assert.deepStrictEqual(result.data, {
tiles: ["pmtiles://http://localhost:1337/example.pmtiles/{z}/{x}/{y}"],
minzoom: 0,
maxzoom: 0,
bounds: [0, 0, 0.9999999, 1],
});
assert.equal(mockServer.numRequests, 1);
});
test("get tile data", async () => {
const pmtiles = new PMTiles("http://localhost:1337/example.pmtiles");
const protocol = new Protocol();
protocol.add(pmtiles);
const result = await protocol.tilev4(
{
url: "pmtiles://http://localhost:1337/example.pmtiles/0/0/0",
type: "arrayBuffer",
},
new AbortController()
);
assert.ok(result.data instanceof Uint8Array);
assert.strictEqual(result.data.length, 49);
});
test("returns empty data for missing tile if errorOnMissingTile is false", async () => {
const pmtiles = new PMTiles("http://localhost:1337/example.pmtiles");
const protocol = new Protocol({ errorOnMissingTile: false });
protocol.add(pmtiles);
const result = await protocol.tilev4(
{
url: "pmtiles://http://localhost:1337/example.pmtiles/25/0/0",
type: "arrayBuffer",
},
new AbortController()
);
assert.ok(result.data instanceof Uint8Array);
assert.strictEqual(result.data.length, 0);
});
test("throws error for missing tile if errorOnMissingTile is true", async () => {
const pmtiles = new PMTiles("http://localhost:1337/example.pmtiles");
const protocol = new Protocol({ errorOnMissingTile: true });
protocol.add(pmtiles);
const promise = protocol.tilev4(
{
url: "pmtiles://http://localhost:1337/example.pmtiles/25/0/0",
type: "arrayBuffer",
},
new AbortController()
);
assert.rejects(promise, { message: "Tile not found." });
});
test("throws AbortError when AbortController is signaled while accessing TileJSON", async () => {
const pmtiles = new PMTiles("http://localhost:1337/example.pmtiles");
const protocol = new Protocol();
protocol.add(pmtiles);
const abortController = new AbortController();
const resultPromise = protocol.tilev4(
{
url: "pmtiles://http://localhost:1337/example.pmtiles",
type: "json",
},
abortController
);
abortController.abort();
await assert.rejects(resultPromise, { name: "AbortError" });
});
test("throws AbortError when AbortController is signaled while accessing tile data", async () => {
const pmtiles = new PMTiles("http://localhost:1337/example.pmtiles");
const protocol = new Protocol();
protocol.add(pmtiles);
const abortController = new AbortController();
const resultPromise = protocol.tilev4(
{
url: "pmtiles://http://localhost:1337/example.pmtiles/0/0/0",
type: "arrayBuffer",
},
abortController
);
abortController.abort();
await assert.rejects(resultPromise, { name: "AbortError" });
});
});