fix(map): accept canonical gateway endpoints

This commit is contained in:
Codex
2026-07-29 17:24:46 +03:00
parent c293d748f5
commit bc1c0dd6e6
4 changed files with 132 additions and 44 deletions
@@ -0,0 +1,52 @@
import type { MapProviderId } from "./contracts.js";
import { MapRuntimeError } from "./runtime.js";
export type ProviderEndpoint = {
assetId: string;
type: "IMAGERY" | "TERRAIN" | "3DTILES";
externalType?: "BING";
credentialMode: "gateway";
url?: string;
options?: {
url?: string;
mapStyle?: string;
};
attributions: readonly unknown[];
};
export function parseProviderEndpoint(
document: Record<string, unknown>,
expectedAssetId: number,
providerId: MapProviderId,
): ProviderEndpoint {
const expectedType =
providerId === "imagery"
? "IMAGERY"
: providerId === "terrain"
? "TERRAIN"
: "3DTILES";
if (
document.assetId !== String(expectedAssetId) ||
document.type !== expectedType ||
document.credentialMode !== "gateway" ||
!Array.isArray(document.attributions)
) {
throw new MapRuntimeError("map_provider_contract_mismatch");
}
if (
(providerId === "imagery" &&
(document.externalType !== "BING" ||
!isEndpointOptions(document.options) ||
typeof document.options.url !== "string")) ||
(providerId !== "imagery" && typeof document.url !== "string")
) {
throw new MapRuntimeError("map_provider_contract_mismatch");
}
return document as ProviderEndpoint;
}
function isEndpointOptions(
value: unknown,
): value is NonNullable<ProviderEndpoint["options"]> {
return typeof value === "object" && value !== null && !Array.isArray(value);
}