diff --git a/tiles/src/buckets.ts b/tiles/src/buckets.ts new file mode 100644 index 0000000..525348c --- /dev/null +++ b/tiles/src/buckets.ts @@ -0,0 +1,58 @@ +export type R2BucketRegion = 'apac' | 'eeur' | 'enam' | 'wnam' | 'weur'; + +export const preferredBuckets: { [key: string]: R2BucketRegion[] } = { + AMS: ['weur', 'eeur'], + ATL: ['enam'], + BKK: ['apac'], + BOM: ['apac'], + BOS: ['enam'], + BRU: ['eeur', 'weur'], + BUF: ['enam'], + CDG: ['eeur', 'weur'], + CPH: ['eeur', 'weur'], + DEN: ['enam', 'wnam'], + DFW: ['enam', 'wnam'], + DME: ['eeur', 'weur', 'apac'], + DUB: ['eeur', 'weur'], + DUS: ['eeur', 'weur'], + EWR: ['enam'], + EZE: ['enam', 'wnam'], + FRA: ['eeur', 'weur'], + GRU: ['enam'], + HAM: ['apac', 'weur', 'eeur'], + HKG: ['apac'], + HYD: ['apac'], + IAD: ['enam'], + IST: ['eeur', 'weur'], + KEF: ['eeur', 'weur'], + KHH: ['apac'], + KIX: ['apac'], + LAS: ['enam', 'wnam'], + LAX: ['wnam'], + LHR: ['eeur', 'weur'], + MAD: ['eeur', 'weur'], + MAN: ['eeur', 'weur'], + MBA: ['apac', 'weur', 'eeur'], + MIA: ['enam'], + MSP: ['enam', 'wnam'], + MUC: ['eeur', 'weur'], + MXP: ['eeur', 'weur'], + NRT: ['apac'], + ORD: ['enam', 'wnam'], + OSL: ['weur', 'eeur'], + OTP: ['eeur', 'apac'], + PER: ['apac'], + RIX: ['eeur', 'weur'], + SEA: ['enam', 'wnam'], + SIN: ['apac'], + SJC: ['wnam'], + SOF: ['eeur'], + STR: ['eeur', 'weur'], + SYD: ['apac', 'wnam'], + VIE: ['eeur', 'weur'], + WAW: ['eeur', 'weur'], + YUL: ['enam'], + YVR: ['wnam'], + YYZ: ['enam'], + ZRH: ['eeur', 'weur'], +}; diff --git a/tiles/src/index.ts b/tiles/src/index.ts index 99d23f8..f76abcc 100644 --- a/tiles/src/index.ts +++ b/tiles/src/index.ts @@ -1,3 +1,4 @@ +import { preferredBuckets, R2BucketRegion } from './buckets'; import { IMetricsRepository } from './interface'; import { PMTilesService } from './pmtiles/pmtiles.service'; import { @@ -117,17 +118,21 @@ async function handleRequest( const memCacheRepository = new MemCacheRepository(globalThis.memCache); const kvRepository = new CloudflareKVRepository(env.KV); - const storageRepository = new R2StorageRepository( - { - apac: env.BUCKET_APAC, - eeur: env.BUCKET_EEUR, - enam: env.BUCKET_ENAM, - wnam: env.BUCKET_WNAM, - weur: env.BUCKET_WEUR, - }, - env.PMTILES_FILE_NAME, - metrics, + const bucketMap: { [key in R2BucketRegion]: R2Bucket } = { + apac: env.BUCKET_APAC, + eeur: env.BUCKET_EEUR, + enam: env.BUCKET_ENAM, + wnam: env.BUCKET_WNAM, + weur: env.BUCKET_WEUR, + }; + const colo = request.cf?.colo || ''; + const buckets: R2BucketRegion[] = preferredBuckets[colo] || ['weur', 'eeur', 'enam', 'wnam', 'apac']; + console.log('Buckets', buckets); + const filteredBucketMap = Object.fromEntries( + Object.entries(bucketMap).filter(([key]) => buckets.includes(key as R2BucketRegion)), ); + + const storageRepository = new R2StorageRepository(filteredBucketMap, env.PMTILES_FILE_NAME, metrics); const pmTilesService = await metrics.monitorAsyncFunction({ name: 'pmtiles_init' }, PMTilesService.init)( storageRepository, memCacheRepository,