@basemaps/lambda-tiler 6.29.0 → 6.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/build/__tests__/config.data.d.ts +11 -0
  3. package/build/__tests__/config.data.d.ts.map +1 -0
  4. package/build/__tests__/config.data.js +112 -0
  5. package/build/__tests__/config.data.js.map +1 -0
  6. package/build/__tests__/index.test.js +5 -14
  7. package/build/__tests__/index.test.js.map +1 -0
  8. package/build/__tests__/tile.style.json.test.js +1 -0
  9. package/build/__tests__/tile.style.json.test.js.map +1 -0
  10. package/build/__tests__/wmts.capability.test.d.ts +1 -1
  11. package/build/__tests__/wmts.capability.test.d.ts.map +1 -1
  12. package/build/__tests__/wmts.capability.test.js +286 -125
  13. package/build/__tests__/wmts.capability.test.js.map +1 -0
  14. package/build/__tests__/xyz.util.d.ts +7 -11
  15. package/build/__tests__/xyz.util.d.ts.map +1 -1
  16. package/build/__tests__/xyz.util.js +14 -42
  17. package/build/__tests__/xyz.util.js.map +1 -0
  18. package/build/index.d.ts +0 -2
  19. package/build/index.d.ts.map +1 -1
  20. package/build/index.js +68 -41
  21. package/build/index.js.map +1 -0
  22. package/build/routes/__tests__/attribution.test.js +351 -399
  23. package/build/routes/__tests__/attribution.test.js.map +1 -0
  24. package/build/routes/__tests__/fonts.test.js +17 -3
  25. package/build/routes/__tests__/fonts.test.js.map +1 -0
  26. package/build/routes/__tests__/health.test.js +17 -13
  27. package/build/routes/__tests__/health.test.js.map +1 -0
  28. package/build/routes/__tests__/imagery.test.js +1 -0
  29. package/build/routes/__tests__/imagery.test.js.map +1 -0
  30. package/build/routes/__tests__/memory.fs.js +1 -0
  31. package/build/routes/__tests__/memory.fs.js.map +1 -0
  32. package/build/routes/__tests__/sprites.test.js +7 -0
  33. package/build/routes/__tests__/sprites.test.js.map +1 -0
  34. package/build/routes/__tests__/tile.json.test.d.ts +2 -0
  35. package/build/routes/__tests__/tile.json.test.d.ts.map +1 -0
  36. package/build/routes/__tests__/tile.json.test.js +124 -0
  37. package/build/routes/__tests__/tile.json.test.js.map +1 -0
  38. package/build/routes/__tests__/tile.style.json.test.d.ts +2 -0
  39. package/build/routes/__tests__/tile.style.json.test.d.ts.map +1 -0
  40. package/build/routes/__tests__/tile.style.json.test.js +95 -0
  41. package/build/routes/__tests__/tile.style.json.test.js.map +1 -0
  42. package/build/routes/__tests__/wmts.test.js +37 -27
  43. package/build/routes/__tests__/wmts.test.js.map +1 -0
  44. package/build/{__tests__ → routes/__tests__}/xyz.test.d.ts +0 -0
  45. package/build/routes/__tests__/xyz.test.d.ts.map +1 -0
  46. package/build/routes/__tests__/xyz.test.js +99 -0
  47. package/build/routes/__tests__/xyz.test.js.map +1 -0
  48. package/build/routes/attribution.d.ts +7 -5
  49. package/build/routes/attribution.d.ts.map +1 -1
  50. package/build/routes/attribution.js +50 -91
  51. package/build/routes/attribution.js.map +1 -0
  52. package/build/routes/fonts.d.ts +1 -1
  53. package/build/routes/fonts.d.ts.map +1 -1
  54. package/build/routes/fonts.js +33 -10
  55. package/build/routes/fonts.js.map +1 -0
  56. package/build/routes/health.d.ts +3 -3
  57. package/build/routes/health.d.ts.map +1 -1
  58. package/build/routes/health.js +16 -13
  59. package/build/routes/health.js.map +1 -0
  60. package/build/routes/imagery.d.ts +8 -1
  61. package/build/routes/imagery.d.ts.map +1 -1
  62. package/build/routes/imagery.js +17 -17
  63. package/build/routes/imagery.js.map +1 -0
  64. package/build/routes/ping.d.ts +3 -0
  65. package/build/routes/ping.d.ts.map +1 -0
  66. package/build/routes/ping.js +7 -0
  67. package/build/routes/ping.js.map +1 -0
  68. package/build/routes/sprites.d.ts.map +1 -1
  69. package/build/routes/sprites.js +22 -22
  70. package/build/routes/sprites.js.map +1 -0
  71. package/build/routes/tile.json.d.ts +7 -1
  72. package/build/routes/tile.json.d.ts.map +1 -1
  73. package/build/routes/tile.json.js +19 -22
  74. package/build/routes/tile.json.js.map +1 -0
  75. package/build/routes/tile.style.json.d.ts +6 -1
  76. package/build/routes/tile.style.json.d.ts.map +1 -1
  77. package/build/routes/tile.style.json.js +11 -13
  78. package/build/routes/tile.style.json.js.map +1 -0
  79. package/build/routes/tile.wmts.d.ts +9 -3
  80. package/build/routes/tile.wmts.d.ts.map +1 -1
  81. package/build/routes/tile.wmts.js +37 -50
  82. package/build/routes/tile.wmts.js.map +1 -0
  83. package/build/routes/tile.xyz.d.ts +14 -4
  84. package/build/routes/tile.xyz.d.ts.map +1 -1
  85. package/build/routes/tile.xyz.js +22 -17
  86. package/build/routes/tile.xyz.js.map +1 -0
  87. package/build/routes/tile.xyz.raster.d.ts +11 -0
  88. package/build/routes/tile.xyz.raster.d.ts.map +1 -0
  89. package/build/routes/tile.xyz.raster.js +90 -0
  90. package/build/routes/tile.xyz.raster.js.map +1 -0
  91. package/build/routes/tile.xyz.vector.d.ts +8 -0
  92. package/build/routes/tile.xyz.vector.d.ts.map +1 -0
  93. package/build/routes/tile.xyz.vector.js +46 -0
  94. package/build/routes/tile.xyz.vector.js.map +1 -0
  95. package/build/routes/version.d.ts +3 -0
  96. package/build/routes/version.d.ts.map +1 -0
  97. package/build/routes/version.js +9 -0
  98. package/build/routes/version.js.map +1 -0
  99. package/build/util/__test__/validate.test.d.ts +2 -0
  100. package/build/util/__test__/validate.test.d.ts.map +1 -0
  101. package/build/util/__test__/validate.test.js +66 -0
  102. package/build/util/__test__/validate.test.js.map +1 -0
  103. package/build/util/cotar.serve.d.ts +20 -0
  104. package/build/util/cotar.serve.d.ts.map +1 -0
  105. package/build/util/cotar.serve.js +41 -0
  106. package/build/util/cotar.serve.js.map +1 -0
  107. package/build/util/etag.d.ts +6 -0
  108. package/build/util/etag.d.ts.map +1 -0
  109. package/build/util/etag.js +20 -0
  110. package/build/util/etag.js.map +1 -0
  111. package/build/util/response.d.ts +4 -0
  112. package/build/util/response.d.ts.map +1 -0
  113. package/build/util/response.js +4 -0
  114. package/build/util/response.js.map +1 -0
  115. package/build/util/source.cache.d.ts +28 -0
  116. package/build/util/source.cache.d.ts.map +1 -0
  117. package/build/util/source.cache.js +53 -0
  118. package/build/util/source.cache.js.map +1 -0
  119. package/build/{source.tracer.d.ts → util/source.tracer.d.ts} +1 -0
  120. package/build/util/source.tracer.d.ts.map +1 -0
  121. package/build/{source.tracer.js → util/source.tracer.js} +4 -0
  122. package/build/util/source.tracer.js.map +1 -0
  123. package/build/util/swapping.lru.d.ts +21 -0
  124. package/build/util/swapping.lru.d.ts.map +1 -0
  125. package/build/util/swapping.lru.js +56 -0
  126. package/build/util/swapping.lru.js.map +1 -0
  127. package/build/util/validate.d.ts +46 -0
  128. package/build/util/validate.d.ts.map +1 -0
  129. package/build/util/validate.js +107 -0
  130. package/build/util/validate.js.map +1 -0
  131. package/build/wmts.capability.d.ts +27 -13
  132. package/build/wmts.capability.d.ts.map +1 -1
  133. package/build/wmts.capability.js +156 -55
  134. package/build/wmts.capability.js.map +1 -0
  135. package/dist/index.js +89 -73
  136. package/dist/node_modules/.package-lock.json +1 -1
  137. package/dist/package-lock.json +2 -2
  138. package/dist/package.json +1 -1
  139. package/package.json +10 -10
  140. package/src/__tests__/config.data.ts +120 -0
  141. package/src/__tests__/index.test.ts +4 -20
  142. package/src/__tests__/wmts.capability.test.ts +312 -139
  143. package/src/__tests__/xyz.util.ts +17 -45
  144. package/src/index.ts +75 -41
  145. package/src/routes/__tests__/attribution.test.ts +356 -403
  146. package/src/routes/__tests__/fonts.test.ts +18 -3
  147. package/src/routes/__tests__/health.test.ts +17 -13
  148. package/src/routes/__tests__/sprites.test.ts +6 -1
  149. package/src/routes/__tests__/tile.json.test.ts +145 -0
  150. package/src/routes/__tests__/tile.style.json.test.ts +105 -0
  151. package/src/routes/__tests__/wmts.test.ts +44 -34
  152. package/src/routes/__tests__/xyz.test.ts +119 -0
  153. package/src/routes/attribution.ts +59 -111
  154. package/src/routes/fonts.ts +32 -10
  155. package/src/routes/health.ts +17 -16
  156. package/src/routes/imagery.ts +18 -15
  157. package/src/routes/ping.ts +8 -0
  158. package/src/routes/sprites.ts +20 -22
  159. package/src/routes/tile.json.ts +24 -19
  160. package/src/routes/tile.style.json.ts +15 -12
  161. package/src/routes/tile.wmts.ts +41 -44
  162. package/src/routes/tile.xyz.raster.ts +106 -0
  163. package/src/routes/tile.xyz.ts +31 -16
  164. package/src/routes/tile.xyz.vector.ts +47 -0
  165. package/src/routes/version.ts +8 -0
  166. package/src/util/__test__/validate.test.ts +74 -0
  167. package/src/util/cotar.serve.ts +46 -0
  168. package/src/util/etag.ts +20 -0
  169. package/src/util/response.ts +4 -0
  170. package/src/util/source.cache.ts +71 -0
  171. package/src/{source.tracer.ts → util/source.tracer.ts} +4 -0
  172. package/src/util/swapping.lru.ts +63 -0
  173. package/src/util/validate.ts +126 -0
  174. package/src/wmts.capability.ts +170 -68
  175. package/tsconfig.tsbuildinfo +1 -1
  176. package/build/__tests__/route.test.d.ts +0 -2
  177. package/build/__tests__/route.test.d.ts.map +0 -1
  178. package/build/__tests__/route.test.js +0 -20
  179. package/build/__tests__/tiff.cache.test.d.ts +0 -2
  180. package/build/__tests__/tiff.cache.test.d.ts.map +0 -1
  181. package/build/__tests__/tiff.cache.test.js +0 -58
  182. package/build/__tests__/tile.cache.key.test.d.ts +0 -2
  183. package/build/__tests__/tile.cache.key.test.d.ts.map +0 -1
  184. package/build/__tests__/tile.cache.key.test.js +0 -48
  185. package/build/__tests__/tile.set.cache.test.d.ts +0 -2
  186. package/build/__tests__/tile.set.cache.test.d.ts.map +0 -1
  187. package/build/__tests__/tile.set.cache.test.js +0 -123
  188. package/build/__tests__/tile.set.test.d.ts +0 -2
  189. package/build/__tests__/tile.set.test.d.ts.map +0 -1
  190. package/build/__tests__/tile.set.test.js +0 -11
  191. package/build/__tests__/xyz.test.d.ts.map +0 -1
  192. package/build/__tests__/xyz.test.js +0 -306
  193. package/build/api.key.d.ts +0 -2
  194. package/build/api.key.d.ts.map +0 -1
  195. package/build/api.key.js +0 -23
  196. package/build/cli/dump.d.ts +0 -2
  197. package/build/cli/dump.d.ts.map +0 -1
  198. package/build/cli/dump.js +0 -47
  199. package/build/cli/tile.set.local.d.ts +0 -12
  200. package/build/cli/tile.set.local.d.ts.map +0 -1
  201. package/build/cli/tile.set.local.js +0 -39
  202. package/build/router.d.ts +0 -15
  203. package/build/router.d.ts.map +0 -1
  204. package/build/router.js +0 -49
  205. package/build/routes/api.d.ts +0 -5
  206. package/build/routes/api.d.ts.map +0 -1
  207. package/build/routes/api.js +0 -16
  208. package/build/routes/esri/rest.d.ts +0 -10
  209. package/build/routes/esri/rest.d.ts.map +0 -1
  210. package/build/routes/esri/rest.js +0 -87
  211. package/build/routes/response.d.ts +0 -4
  212. package/build/routes/response.d.ts.map +0 -1
  213. package/build/routes/response.js +0 -3
  214. package/build/routes/tile.d.ts +0 -3
  215. package/build/routes/tile.d.ts.map +0 -1
  216. package/build/routes/tile.etag.d.ts +0 -11
  217. package/build/routes/tile.etag.d.ts.map +0 -1
  218. package/build/routes/tile.etag.js +0 -29
  219. package/build/routes/tile.js +0 -27
  220. package/build/source.tracer.d.ts.map +0 -1
  221. package/build/tiff.cache.d.ts +0 -17
  222. package/build/tiff.cache.d.ts.map +0 -1
  223. package/build/tiff.cache.js +0 -45
  224. package/build/tile.set.cache.d.ts +0 -21
  225. package/build/tile.set.cache.d.ts.map +0 -1
  226. package/build/tile.set.cache.js +0 -100
  227. package/build/tile.set.d.ts +0 -4
  228. package/build/tile.set.d.ts.map +0 -1
  229. package/build/tile.set.js +0 -1
  230. package/build/tile.set.raster.d.ts +0 -49
  231. package/build/tile.set.raster.d.ts.map +0 -1
  232. package/build/tile.set.raster.js +0 -186
  233. package/build/tile.set.vector.d.ts +0 -25
  234. package/build/tile.set.vector.d.ts.map +0 -1
  235. package/build/tile.set.vector.js +0 -71
  236. package/build/validate.d.ts +0 -16
  237. package/build/validate.d.ts.map +0 -1
  238. package/build/validate.js +0 -31
  239. package/src/__tests__/route.test.ts +0 -24
  240. package/src/__tests__/tiff.cache.test.ts +0 -73
  241. package/src/__tests__/tile.cache.key.test.ts +0 -56
  242. package/src/__tests__/tile.set.cache.test.ts +0 -146
  243. package/src/__tests__/tile.set.test.ts +0 -12
  244. package/src/__tests__/xyz.test.ts +0 -362
  245. package/src/api.key.ts +0 -23
  246. package/src/cli/dump.ts +0 -61
  247. package/src/cli/tile.set.local.ts +0 -51
  248. package/src/router.ts +0 -58
  249. package/src/routes/api.ts +0 -19
  250. package/src/routes/esri/rest.ts +0 -90
  251. package/src/routes/response.ts +0 -4
  252. package/src/routes/tile.etag.ts +0 -36
  253. package/src/routes/tile.ts +0 -23
  254. package/src/tiff.cache.ts +0 -51
  255. package/src/tile.set.cache.ts +0 -111
  256. package/src/tile.set.raster.ts +0 -228
  257. package/src/tile.set.ts +0 -4
  258. package/src/tile.set.vector.ts +0 -79
  259. package/src/validate.ts +0 -32
@@ -0,0 +1,99 @@
1
+ import { Config, ConfigProviderMemory } from '@basemaps/config';
2
+ import { LogConfig } from '@basemaps/shared';
3
+ import { round } from '@basemaps/test/build/rounding.js';
4
+ import o from 'ospec';
5
+ import sinon from 'sinon';
6
+ import { handler } from '../../index.js';
7
+ import { Etag } from '../../util/etag.js';
8
+ import { FakeData } from '../../__tests__/config.data.js';
9
+ import { Api, mockRequest } from '../../__tests__/xyz.util.js';
10
+ const sandbox = sinon.createSandbox();
11
+ const TileSetNames = ['aerial', 'aerial:ōtorohanga_urban_2021_0-1m_RGB', '01FYWKAJ86W9P7RWM1VB62KD0H'];
12
+ o.spec('/v1/tiles', () => {
13
+ const config = new ConfigProviderMemory();
14
+ o.beforeEach(() => {
15
+ LogConfig.get().level = 'silent';
16
+ Config.setConfigProvider(config);
17
+ config.objects.clear();
18
+ for (const tileSetName of TileSetNames)
19
+ config.put(FakeData.tileSetRaster(tileSetName));
20
+ sandbox.stub(Etag, 'key').returns('fakeEtag');
21
+ });
22
+ o.afterEach(() => {
23
+ sandbox.restore();
24
+ });
25
+ o('should export handler', async () => {
26
+ const base = await import('../../index.js');
27
+ o(typeof base.handler).equals('function');
28
+ });
29
+ TileSetNames.forEach((tileSetName) => {
30
+ o(`should generate a tile/v1/tiles/${tileSetName}/global-mercator/0/0/0.png`, async () => {
31
+ const request = mockRequest(`/v1/tiles/${tileSetName}/global-mercator/0/0/0.png`, 'get', Api.header);
32
+ const res = await handler.router.handle(request);
33
+ o(res.status).equals(200);
34
+ o(res.header('content-type')).equals('image/png');
35
+ o(res.header('eTaG')).equals('fakeEtag');
36
+ // Validate the session information has been set correctly
37
+ o(request.logContext['tileSet']).equals(tileSetName);
38
+ o(request.logContext['xyz']).deepEquals({ x: 0, y: 0, z: 0 });
39
+ o(round(request.logContext['location'])).deepEquals({ lat: 0, lon: 0 });
40
+ });
41
+ });
42
+ o('should generate a tile 0,0,0 for webp', async () => {
43
+ const request = mockRequest('/v1/tiles/aerial/3857/0/0/0.webp', 'get', Api.header);
44
+ const res = await handler.router.handle(request);
45
+ o(res.status).equals(200);
46
+ o(res.header('content-type')).equals('image/webp');
47
+ o(res.header('eTaG')).equals('fakeEtag');
48
+ // o(res.body).equals(rasterMockBuffer.toString('base64'));
49
+ // Validate the session information has been set correctly
50
+ o(request.logContext['xyz']).deepEquals({ x: 0, y: 0, z: 0 });
51
+ o(round(request.logContext['location'])).deepEquals({ lat: 0, lon: 0 });
52
+ });
53
+ ['png', 'webp', 'jpeg', 'avif'].forEach((fmt) => {
54
+ o(`should 200 with empty ${fmt} if a tile is out of bounds`, async () => {
55
+ // tiler.tile = async () => [];
56
+ const res = await handler.router.handle(mockRequest(`/v1/tiles/aerial/global-mercator/0/0/0.${fmt}`, 'get', Api.header));
57
+ o(res.status).equals(200);
58
+ o(res.header('content-type')).equals(`image/${fmt}`);
59
+ o(res.header('etag')).notEquals(undefined);
60
+ o(res.header('cache-control')).equals('public, max-age=604800, stale-while-revalidate=86400');
61
+ // o(rasterMock.calls.length).equals(1);
62
+ });
63
+ });
64
+ o('should 304 if a tile is not modified', async () => {
65
+ const key = 'fakeEtag';
66
+ const request = mockRequest('/v1/tiles/aerial/global-mercator/0/0/0.png', 'get', {
67
+ 'if-none-match': key,
68
+ ...Api.header,
69
+ });
70
+ const res = await handler.router.handle(request);
71
+ o(res.status).equals(304);
72
+ o(res.header('eTaG')).equals(undefined);
73
+ o(request.logContext['cache']).deepEquals({ match: key, hit: true });
74
+ });
75
+ o('should 404 if a tile is outside of the range', async () => {
76
+ const res = await handler.router.handle(mockRequest('/v1/tiles/aerial/global-mercator/25/0/0.png', 'get', Api.header));
77
+ o(res.status).equals(404);
78
+ const resB = await handler.router.handle(mockRequest('/v1/tiles/aerial/2193/17/0/0.png', 'get', Api.header));
79
+ o(resB.status).equals(404);
80
+ });
81
+ o('should support utf8 tilesets', async () => {
82
+ const fakeTileSet = FakeData.tileSetRaster('🦄 🌈');
83
+ config.put(fakeTileSet);
84
+ const req = mockRequest('/v1/tiles/🦄 🌈/global-mercator/0/0/0.png', 'get', Api.header);
85
+ o(req.path).equals('/v1/tiles/%F0%9F%A6%84%20%F0%9F%8C%88/global-mercator/0/0/0.png');
86
+ const res = await handler.router.handle(req);
87
+ o(res.status).equals(200);
88
+ o(res.header('content-type')).equals('image/png');
89
+ o(res.header('etag')).notEquals(undefined);
90
+ o(res.header('cache-control')).equals('public, max-age=604800, stale-while-revalidate=86400');
91
+ });
92
+ ['/favicon.ico', '/index.html', '/foo/bar'].forEach((path) => {
93
+ o('should 404 on invalid paths: ' + path, async () => {
94
+ const res = await handler.router.handle(mockRequest(path, 'get', Api.header));
95
+ o(res.status).equals(404);
96
+ });
97
+ });
98
+ });
99
+ //# sourceMappingURL=xyz.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xyz.test.js","sourceRoot":"","sources":["../../../src/routes/__tests__/xyz.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
- import { ConfigImagery, ConfigLayer, ConfigProvider } from '@basemaps/config';
2
- import { AttributionCollection, StacCollection, StacExtent } from '@basemaps/geo';
3
1
  import { LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
4
- import { TileSetRaster } from '../tile.set.raster.js';
5
- export declare function createAttributionCollection(tileSet: TileSetRaster, stac: StacCollection | null | undefined, imagery: ConfigImagery, layer: ConfigLayer, host: ConfigProvider, extent: StacExtent): AttributionCollection;
2
+ export interface TileAttributionGet {
3
+ Params: {
4
+ tileSet: string;
5
+ tileMatrix: string;
6
+ };
7
+ }
6
8
  /**
7
9
  * Create a LambdaHttpResponse for a attribution request
8
10
  */
9
- export declare function attribution(req: LambdaHttpRequest): Promise<LambdaHttpResponse>;
11
+ export declare function tileAttributionGet(req: LambdaHttpRequest<TileAttributionGet>): Promise<LambdaHttpResponse>;
10
12
  //# sourceMappingURL=attribution.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/routes/attribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAe,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EACL,qBAAqB,EAOrB,cAAc,EACd,UAAU,EAEX,MAAM,eAAe,CAAC;AAYvB,OAAO,EAAc,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAInF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA2DtD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACvC,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,UAAU,GACjB,qBAAqB,CAqBvB;AAkFD;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkCrF"}
1
+ {"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/routes/attribution.ts"],"names":[],"mappings":"AAcA,OAAO,EAAc,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAqInF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAyBhH"}
@@ -1,14 +1,13 @@
1
1
  import { TileSetType } from '@basemaps/config';
2
2
  import { Bounds, GoogleTms, Stac, TileMatrixSet, } from '@basemaps/geo';
3
- import { CompositeError, Config, extractYearRangeFromName, fsa, Projection, setNameAndProjection, tileAttributionFromPath, titleizeImageryName, } from '@basemaps/shared';
3
+ import { Config, extractYearRangeFromName, Projection, titleizeImageryName } from '@basemaps/shared';
4
4
  import { multiPolygonToWgs84, union, Wgs84 } from '@linzjs/geojson';
5
5
  import { HttpHeader, LambdaHttpResponse } from '@linzjs/lambda';
6
- import { createHash } from 'crypto';
7
- import { Router } from '../router.js';
8
- import { TileSets } from '../tile.set.cache.js';
6
+ import { Etag } from '../util/etag.js';
7
+ import { NotFound, NotModified } from '../util/response.js';
8
+ import { Validate } from '../util/validate.js';
9
9
  /** Amount to pad imagery bounds to avoid fragmenting polygons */
10
10
  const SmoothPadding = 1 + 1e-10; // about 1/100th of a millimeter at equator
11
- const NotFound = new LambdaHttpResponse(404, 'Not Found');
12
11
  const Precision = 10 ** 8;
13
12
  /**
14
13
  * Limit precision to 8 decimal places.
@@ -42,83 +41,33 @@ function createCoordinates(bbox, files, proj) {
42
41
  const roundToWgs84 = (p) => roundPair(proj.toWgs84(p));
43
42
  return multiPolygonToWgs84(coordinates, roundToWgs84);
44
43
  }
45
- async function readStac(uri) {
46
- try {
47
- return await fsa.readJson(uri);
48
- }
49
- catch (err) {
50
- if (CompositeError.isCompositeError(err) && err.code < 500) {
51
- return null;
52
- }
53
- throw err;
54
- }
55
- }
56
- export function createAttributionCollection(tileSet, stac, imagery, layer, host, extent) {
57
- var _a, _b, _c, _d;
58
- const tileMatrix = tileSet.tileMatrix;
59
- return {
60
- stac_version: Stac.Version,
61
- license: (_a = stac === null || stac === void 0 ? void 0 : stac.license) !== null && _a !== void 0 ? _a : Stac.License,
62
- id: imagery.id,
63
- providers: (_b = stac === null || stac === void 0 ? void 0 : stac.providers) !== null && _b !== void 0 ? _b : [
64
- { name: host.serviceProvider.name, url: host.serviceProvider.site, roles: ['host'] },
65
- ],
66
- title: (_c = stac === null || stac === void 0 ? void 0 : stac.title) !== null && _c !== void 0 ? _c : titleizeImageryName(imagery.name),
67
- description: (_d = stac === null || stac === void 0 ? void 0 : stac.description) !== null && _d !== void 0 ? _d : 'No description',
68
- extent,
69
- links: [],
70
- summaries: {
71
- 'linz:zoom': {
72
- min: TileMatrixSet.convertZoomLevel(layer.minZoom ? layer.minZoom : 0, GoogleTms, tileMatrix, true),
73
- max: TileMatrixSet.convertZoomLevel(layer.maxZoom ? layer.maxZoom : 32, GoogleTms, tileMatrix, true),
74
- },
75
- 'linz:priority': [1000 + tileSet.tileSet.layers.indexOf(layer)],
76
- },
77
- };
78
- }
79
44
  /**
80
45
  * Build a Single File STAC for the given TileSet.
81
46
  *
82
47
  * For now this is the minimal set required for attribution. This can be embellished later with
83
48
  * links and assets for a more comprehensive STAC file.
84
49
  */
85
- async function tileSetAttribution(tileSet) {
86
- const proj = Projection.get(tileSet.tileMatrix);
87
- const stacFiles = new Map();
50
+ async function tileSetAttribution(req, tileSet, tileMatrix) {
51
+ var _a, _b, _c, _d;
52
+ const proj = Projection.get(tileMatrix);
88
53
  const cols = [];
89
54
  const items = [];
90
- // read all stac files in parallel
91
- for (const layer of tileSet.tileSet.layers) {
92
- const imgId = layer[proj.epsg.code];
93
- if (imgId == null)
94
- continue;
95
- const im = tileSet.imagery.get(imgId);
96
- if (im == null)
97
- continue;
98
- if (stacFiles.get(im.uri) == null) {
99
- stacFiles.set(im.uri, readStac(fsa.join(im.uri, 'collection.json')));
100
- }
101
- }
55
+ const imagery = await Config.getAllImagery(tileSet.layers, [tileMatrix.projection]);
102
56
  const host = await Config.Provider.get(Config.Provider.id('linz'));
103
57
  if (host == null)
104
58
  return null;
105
- for (const layer of tileSet.tileSet.layers) {
59
+ for (const layer of tileSet.layers) {
106
60
  const imgId = layer[proj.epsg.code];
107
61
  if (imgId == null)
108
62
  continue;
109
- const im = tileSet.imagery.get(imgId);
63
+ const im = imagery.get(imgId);
110
64
  if (im == null)
111
65
  continue;
112
- const stac = await stacFiles.get(im.uri);
113
66
  const bbox = proj.boundsToWgs84BoundingBox(im.bounds).map(roundNumber);
114
- let interval = stac === null || stac === void 0 ? void 0 : stac.extent.temporal.interval;
115
- if (interval == null) {
116
- const years = extractYearRangeFromName(im.name);
117
- if (years[0] === -1) {
118
- throw new Error('Missing date in imagery name: ' + im.name);
119
- }
120
- interval = [years.map((y) => `${y}-01-01T00:00:00Z`)];
121
- }
67
+ const years = extractYearRangeFromName(im.name);
68
+ if (years[0] === -1)
69
+ throw new Error('Missing date in imagery name: ' + im.name);
70
+ const interval = [years.map((y) => `${y}-01-01T00:00:00Z`)];
122
71
  const extent = { spatial: { bbox: [bbox] }, temporal: { interval } };
123
72
  items.push({
124
73
  type: 'Feature',
@@ -128,26 +77,40 @@ async function tileSetAttribution(tileSet) {
128
77
  assets: {},
129
78
  links: [],
130
79
  bbox,
131
- geometry: {
132
- type: 'MultiPolygon',
133
- coordinates: createCoordinates(bbox, im.files, proj),
134
- },
80
+ geometry: { type: 'MultiPolygon', coordinates: createCoordinates(bbox, im.files, proj) },
135
81
  properties: {
136
- title: titleizeImageryName(im.name),
82
+ title: (_a = im.title) !== null && _a !== void 0 ? _a : titleizeImageryName(im.name),
83
+ category: im.category,
137
84
  datetime: null,
138
85
  start_datetime: interval[0][0],
139
86
  end_datetime: interval[0][1],
140
87
  },
141
88
  });
142
- cols.push(createAttributionCollection(tileSet, stac, im, layer, host, extent));
89
+ const zoomMin = TileMatrixSet.convertZoomLevel(layer.minZoom ? layer.minZoom : 0, GoogleTms, tileMatrix, true);
90
+ const zoomMax = TileMatrixSet.convertZoomLevel(layer.maxZoom ? layer.maxZoom : 32, GoogleTms, tileMatrix, true);
91
+ cols.push({
92
+ stac_version: Stac.Version,
93
+ license: Stac.License,
94
+ id: im.id,
95
+ providers: [{ name: host.serviceProvider.name, url: host.serviceProvider.site, roles: ['host'] }],
96
+ title: (_b = im.title) !== null && _b !== void 0 ? _b : titleizeImageryName(im.name),
97
+ description: 'No description',
98
+ extent,
99
+ links: [],
100
+ summaries: {
101
+ 'linz:category': im.category,
102
+ 'linz:zoom': { min: zoomMin, max: zoomMax },
103
+ 'linz:priority': [1000 + tileSet.layers.indexOf(layer)],
104
+ },
105
+ });
143
106
  }
144
107
  return {
145
108
  id: tileSet.id,
146
109
  type: 'FeatureCollection',
147
110
  stac_version: Stac.Version,
148
111
  stac_extensions: ['single-file-stac'],
149
- title: tileSet.title,
150
- description: tileSet.description,
112
+ title: (_c = tileSet.title) !== null && _c !== void 0 ? _c : 'No title',
113
+ description: (_d = tileSet.description) !== null && _d !== void 0 ? _d : 'No Description',
151
114
  features: items,
152
115
  collections: cols,
153
116
  links: [],
@@ -156,32 +119,28 @@ async function tileSetAttribution(tileSet) {
156
119
  /**
157
120
  * Create a LambdaHttpResponse for a attribution request
158
121
  */
159
- export async function attribution(req) {
160
- const action = Router.action(req);
161
- const data = tileAttributionFromPath(action.rest);
162
- if (data == null)
163
- return NotFound;
164
- setNameAndProjection(req, data);
122
+ export async function tileAttributionGet(req) {
123
+ const tileMatrix = Validate.getTileMatrixSet(req.params.tileMatrix);
124
+ if (tileMatrix == null)
125
+ throw new LambdaHttpResponse(404, 'Tile Matrix not found');
165
126
  req.timer.start('tileset:load');
166
- const tileSet = await TileSets.get(data.name, data.tileMatrix);
127
+ const tileSet = await Config.TileSet.get(Config.TileSet.id(req.params.tileSet));
167
128
  req.timer.end('tileset:load');
168
129
  if (tileSet == null || tileSet.type === TileSetType.Vector)
169
- return NotFound;
170
- const cacheKey = createHash('sha256').update(JSON.stringify(tileSet.tileSet)).digest('base64');
171
- const ifNoneMatch = req.header(HttpHeader.IfNoneMatch);
172
- if (ifNoneMatch != null && ifNoneMatch.indexOf(cacheKey) > -1) {
173
- req.set('cache', { key: cacheKey, hit: true, match: ifNoneMatch });
174
- return new LambdaHttpResponse(304, 'Not modified');
175
- }
130
+ return NotFound();
131
+ const cacheKey = Etag.key(tileSet);
132
+ if (Etag.isNotModified(req, cacheKey))
133
+ return NotModified();
176
134
  req.timer.start('stac:load');
177
- const attributions = await tileSetAttribution(tileSet);
135
+ const attributions = await tileSetAttribution(req, tileSet, tileMatrix);
178
136
  req.timer.end('stac:load');
179
137
  if (attributions == null)
180
- return NotFound;
138
+ return NotFound();
181
139
  const response = new LambdaHttpResponse(200, 'ok');
182
140
  response.header(HttpHeader.ETag, cacheKey);
183
- // Keep fresh for one day; otherwise use cache but refresh cache for next time
184
- response.header(HttpHeader.CacheControl, 'public, max-age=86400, stale-while-revalidate=604800');
141
+ // Keep fresh for 7 days; otherwise use cache but refresh cache for next time
142
+ response.header(HttpHeader.CacheControl, 'public, max-age=604800, stale-while-revalidate=86400');
185
143
  response.json(attributions);
186
144
  return response;
187
145
  }
146
+ //# sourceMappingURL=attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribution.js","sourceRoot":"","sources":["../../src/routes/attribution.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,6 @@ interface FontGet {
8
8
  export declare function fontGet(req: LambdaHttpRequest<FontGet>): Promise<LambdaHttpResponse>;
9
9
  /** Get the unique name of folders is a path that contain .pbf files */
10
10
  export declare function getFonts(fontPath: string): Promise<string[]>;
11
- export declare function fontList(): Promise<LambdaHttpResponse>;
11
+ export declare function fontList(req: LambdaHttpRequest): Promise<LambdaHttpResponse>;
12
12
  export {};
13
13
  //# sourceMappingURL=fonts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../../src/routes/fonts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIvE,UAAU,OAAO;IACf,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAa1F;AAED,uEAAuE;AACvE,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYlE;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAa5D"}
1
+ {"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../../src/routes/fonts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAMnF,UAAU,OAAO;IACf,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAyB1F;AAED,uEAAuE;AACvE,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYlE;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqBlF"}
@@ -1,20 +1,34 @@
1
1
  import { Env } from '@basemaps/shared';
2
2
  import { fsa } from '@chunkd/fs';
3
- import { LambdaHttpResponse } from '@linzjs/lambda';
3
+ import { HttpHeader, LambdaHttpResponse } from '@linzjs/lambda';
4
4
  import path from 'path';
5
- import { NotFound } from './response.js';
5
+ import { isGzip, serveFromCotar } from '../util/cotar.serve.js';
6
+ import { Etag } from '../util/etag.js';
7
+ import { NotFound, NotModified } from '../util/response.js';
6
8
  export async function fontGet(req) {
7
9
  const assetLocation = Env.get(Env.AssetLocation);
8
10
  if (assetLocation == null)
9
- return NotFound;
11
+ return NotFound();
12
+ const targetFile = path.join('fonts', req.params.fontStack, req.params.range) + '.pbf';
13
+ if (assetLocation.endsWith('.tar.co')) {
14
+ return serveFromCotar(req, assetLocation, targetFile, 'application/x-protobuf');
15
+ }
10
16
  try {
11
- const filePath = fsa.join(assetLocation, path.join('fonts', req.params.fontStack, req.params.range)) + '.pbf';
17
+ const filePath = fsa.join(assetLocation, targetFile);
12
18
  const buf = await fsa.read(filePath);
13
- return LambdaHttpResponse.ok().buffer(buf, 'application/x-protobuf');
19
+ const cacheKey = Etag.key(buf);
20
+ if (Etag.isNotModified(req, cacheKey))
21
+ return NotModified();
22
+ const response = LambdaHttpResponse.ok().buffer(buf, 'application/x-protobuf');
23
+ response.header(HttpHeader.ETag, cacheKey);
24
+ response.header(HttpHeader.CacheControl, 'public, max-age=604800, stale-while-revalidate=86400');
25
+ if (isGzip(buf))
26
+ response.header(HttpHeader.ContentEncoding, 'gzip');
27
+ return response;
14
28
  }
15
29
  catch (e) {
16
30
  if (e.code === 404)
17
- return NotFound;
31
+ return NotFound();
18
32
  throw e;
19
33
  }
20
34
  }
@@ -33,18 +47,27 @@ export async function getFonts(fontPath) {
33
47
  // Ensure the fonts are alphabetical
34
48
  return [...fonts].sort();
35
49
  }
36
- export async function fontList() {
50
+ export async function fontList(req) {
37
51
  const assetLocation = Env.get(Env.AssetLocation);
38
52
  if (assetLocation == null)
39
- return NotFound;
53
+ return NotFound();
54
+ if (assetLocation.endsWith('.tar.co'))
55
+ return serveFromCotar(req, assetLocation, 'fonts.json', 'application/json');
40
56
  try {
41
57
  const filePath = fsa.join(assetLocation, '/fonts');
42
58
  const fonts = await getFonts(filePath);
43
- return LambdaHttpResponse.ok().buffer(JSON.stringify(fonts), 'application/json');
59
+ const cacheKey = Etag.key(fonts);
60
+ if (Etag.isNotModified(req, cacheKey))
61
+ return NotModified();
62
+ const response = LambdaHttpResponse.ok().buffer(JSON.stringify(fonts), 'application/json');
63
+ response.header(HttpHeader.ETag, cacheKey);
64
+ response.header(HttpHeader.CacheControl, 'public, max-age=604800, stale-while-revalidate=86400');
65
+ return response;
44
66
  }
45
67
  catch (e) {
46
68
  if (e.code === 404)
47
- return NotFound;
69
+ return NotFound();
48
70
  throw e;
49
71
  }
50
72
  }
73
+ //# sourceMappingURL=fonts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../src/routes/fonts.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
- import { TileDataXyz } from '@basemaps/shared';
3
2
  import { LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
4
- interface TestTile extends TileDataXyz {
3
+ import { TileXyz } from '../util/validate.js';
4
+ interface TestTile extends TileXyz {
5
5
  buf?: Buffer;
6
6
  }
7
7
  export declare const TestTiles: TestTile[];
@@ -14,6 +14,6 @@ export declare function updateExpectedTile(test: TestTile, newTileData: Buffer,
14
14
  *
15
15
  * @throws LambdaHttpResponse for failure health test
16
16
  */
17
- export declare function Health(req: LambdaHttpRequest): Promise<LambdaHttpResponse>;
17
+ export declare function healthGet(req: LambdaHttpRequest): Promise<LambdaHttpResponse>;
18
18
  export {};
19
19
  //# sourceMappingURL=health.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAY,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAc,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAQnF,UAAU,QAAS,SAAQ,WAAW;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,SAAS,EAAE,QAAQ,EAG/B,CAAC;AAGF,wBAAsB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAYnE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/G;AAED;;;;;;GAMG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgChF"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":";AAEA,OAAO,EAAc,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAMnF,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG9C,UAAU,QAAS,SAAQ,OAAO;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,SAAS,EAAE,QAAQ,EAG/B,CAAC;AAGF,wBAAsB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAanE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/G;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6BnF"}
@@ -1,21 +1,22 @@
1
- import { GoogleTms, Nztm2000QuadTms, ImageFormat } from '@basemaps/geo';
2
- import { TileType } from '@basemaps/shared';
1
+ import { Config } from '@basemaps/config';
2
+ import { GoogleTms, ImageFormat, Nztm2000QuadTms } from '@basemaps/geo';
3
3
  import { HttpHeader, LambdaHttpResponse } from '@linzjs/lambda';
4
4
  import * as fs from 'fs';
5
5
  import * as path from 'path';
6
6
  import PixelMatch from 'pixelmatch';
7
7
  import Sharp from 'sharp';
8
8
  import url from 'url';
9
- import { TileSets } from '../tile.set.cache.js';
9
+ import { TileXyzRaster } from './tile.xyz.raster.js';
10
10
  export const TestTiles = [
11
- { type: TileType.Tile, name: 'health', tileMatrix: GoogleTms, ext: ImageFormat.Png, x: 252, y: 156, z: 8 },
12
- { type: TileType.Tile, name: 'health', tileMatrix: Nztm2000QuadTms, ext: ImageFormat.Png, x: 30, y: 33, z: 6 },
11
+ { tileSet: 'health', tileMatrix: GoogleTms, tileType: ImageFormat.Png, tile: { x: 252, y: 156, z: 8 } },
12
+ { tileSet: 'health', tileMatrix: Nztm2000QuadTms, tileType: ImageFormat.Png, tile: { x: 30, y: 33, z: 6 } },
13
13
  ];
14
14
  const TileSize = 256;
15
15
  export async function getTestBuffer(test) {
16
16
  if (Buffer.isBuffer(test.buf))
17
17
  return test.buf;
18
- const expectedFile = `static/expected_tile_${test.tileMatrix.identifier}_${test.x}_${test.y}_z${test.z}.${test.ext}`;
18
+ const tile = test.tile;
19
+ const expectedFile = `static/expected_tile_${test.tileMatrix.identifier}_${tile.x}_${tile.y}_z${tile.z}.${test.tileType}`;
19
20
  // Initiate test img buffer if not defined
20
21
  try {
21
22
  return await fs.promises.readFile(expectedFile);
@@ -28,7 +29,8 @@ export async function getTestBuffer(test) {
28
29
  }
29
30
  }
30
31
  export async function updateExpectedTile(test, newTileData, difference) {
31
- const expectedFileName = `static/expected_tile_${test.tileMatrix.identifier}_${test.x}_${test.y}_z${test.z}.${test.ext}`;
32
+ const tile = test.tile;
33
+ const expectedFileName = `static/expected_tile_${test.tileMatrix.identifier}_${tile.x}_${tile.y}_z${tile.z}.${test.tileType}`;
32
34
  await fs.promises.writeFile(expectedFileName, newTileData);
33
35
  const imgPng = await Sharp(difference, { raw: { width: TileSize, height: TileSize, channels: 4 } })
34
36
  .png()
@@ -42,13 +44,13 @@ export async function updateExpectedTile(test, newTileData, difference) {
42
44
  *
43
45
  * @throws LambdaHttpResponse for failure health test
44
46
  */
45
- export async function Health(req) {
47
+ export async function healthGet(req) {
48
+ const tileSet = await Config.TileSet.get(Config.TileSet.id('health'));
49
+ if (tileSet == null)
50
+ throw new LambdaHttpResponse(500, 'TileSet: "health" not found');
46
51
  for (const test of TestTiles) {
47
- const tileSet = await TileSets.get('health', test.tileMatrix);
48
- if (tileSet == null)
49
- throw new LambdaHttpResponse(500, 'TileSet: "health" not found');
50
52
  // Get the parse response tile to raw buffer
51
- const response = await tileSet.tile(req, test);
53
+ const response = await TileXyzRaster.tile(req, tileSet, test);
52
54
  if (response.status !== 200)
53
55
  return new LambdaHttpResponse(500, response.statusDescription);
54
56
  if (!Buffer.isBuffer(response._body))
@@ -63,7 +65,7 @@ export async function Health(req) {
63
65
  if (missMatchedPixels) {
64
66
  /** Uncomment this to overwite the expected files */
65
67
  // await updateExpectedTile(test, response._body as Buffer, outputBuffer);
66
- req.log.error({ missMatchedPixels, projection: test.tileMatrix.identifier, xyz: { x: test.x, y: test.y, z: test.z } }, 'Health:MissMatch');
68
+ req.log.error({ missMatchedPixels, projection: test.tileMatrix.identifier, xyz: test.tile }, 'Health:MissMatch');
67
69
  return new LambdaHttpResponse(500, 'TileSet does not match.');
68
70
  }
69
71
  }
@@ -72,3 +74,4 @@ export async function Health(req) {
72
74
  OkResponse.header(HttpHeader.CacheControl, 'no-store');
73
75
  return OkResponse;
74
76
  }
77
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
1
  import { LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
2
2
  export declare function isAllowedFile(f: string): boolean;
3
+ interface ImageryGet {
4
+ Params: {
5
+ imageryId: string;
6
+ fileName: string;
7
+ };
8
+ }
3
9
  /**
4
10
  * Get metadata around the imagery such as the source bounding box or the bounding box of the COGS
5
11
  *
@@ -10,5 +16,6 @@ export declare function isAllowedFile(f: string): boolean;
10
16
  * - /v1/imagery/:imageryId/collection.json - STAC Collection
11
17
  * - /v1/imagery/:imageryId/15-32659-21603.json - STAC Item
12
18
  */
13
- export declare function Imagery(req: LambdaHttpRequest): Promise<LambdaHttpResponse>;
19
+ export declare function imageryGet(req: LambdaHttpRequest<ImageryGet>): Promise<LambdaHttpResponse>;
20
+ export {};
14
21
  //# sourceMappingURL=imagery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"imagery.d.ts","sourceRoot":"","sources":["../../src/routes/imagery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAUnF,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAKhD;AAED;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0BjF"}
1
+ {"version":3,"file":"imagery.d.ts","sourceRoot":"","sources":["../../src/routes/imagery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASnF,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAKhD;AAED,UAAU,UAAU;IAClB,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,iBAAiB,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0BhG"}