Merge pull request #1158 from CartoDB/get-tile-promises

Version  9.0.0
This commit is contained in:
Daniel G. Aubert
2020-04-05 13:23:18 +02:00
committed by GitHub
40 changed files with 226 additions and 367 deletions
+16 -3
View File
@@ -1,12 +1,25 @@
# Changelog
## 8.1.2
## 9.0.0
Released 2020-mm-dd
Breaking changes:
- Remove `/version` endpoint
Announcements:
- Upgrade camshaft to [`0.65.3`](https://github.com/CartoDB/camshaft/blob/0.65.3/CHANGELOG.md#0653):
- Fix noisy message logs while checking analyses' limits.
- Fix CI setup, explicit use of PGPORT while creating the PostgreSQL cluster.
- Fix noisy message logs while checking analyses' limits
- Fix CI setup, explicit use of PGPORT while creating the PostgreSQL cluster
- Upgrades major windshaft release version [`windshaft@6.0.0`](https://github.com/CartoDB/Windshaft/releases/tag/6.0.0)
- Fix test where `http-fallback-image` renderer was failing quietly
- Fix stat `named map providers` cache count
- Use new signature for `onTileErrorStrategy`. Required by `windshaft@6.0.0`
- Extract `onTileErrorStrategy` to a module
- In tests, stop using mapnik module exposed by windshaft and require it from development dependencies
- Stop using `MapStore` from `windshaft` while testing and create a custom one instead
- Rename NamedMapProviderReporter by NamedMapProviderCacheReporter
- Remove `bootstrapFonts` at process startup (now done in `windshaft@6.0.0`)
- Stop checking the installed version of some dependencies while testing
## 8.1.1
Released 2020-02-17
+1 -2
View File
@@ -6,12 +6,11 @@ var path = require('path');
var fs = require('fs');
var _ = require('underscore');
var semver = require('semver');
// TODO: research it it's still needed
const setICUEnvVariable = require('./lib/utils/icu-data-env-setter');
// jshint undef:false
var log = console.log.bind(console);
var logError = console.error.bind(console);
// jshint undef:true
var nodejsVersion = process.versions.node;
const { engines } = require('./package.json');
+15 -80
View File
@@ -1,13 +1,11 @@
'use strict';
const path = require('path');
const { Router: router } = require('express');
const RedisPool = require('redis-mpool');
const cartodbRedis = require('cartodb-redis');
const windshaft = require('windshaft');
const { factory: windshaftFactory } = require('windshaft');
const PgConnection = require('../backends/pg-connection');
const AnalysisBackend = require('../backends/analysis');
@@ -22,9 +20,7 @@ const UserLimitsBackend = require('../backends/user-limits');
const OverviewsMetadataBackend = require('../backends/overviews-metadata');
const FilterStatsApi = require('../backends/filter-stats');
const TablesExtentBackend = require('../backends/tables-extent');
const ClusterBackend = require('../backends/cluster');
const PubSubMetricsBackend = require('../backends/pubsub-metrics');
const LayergroupAffectedTablesCache = require('../cache/layergroup-affected-tables');
@@ -33,7 +29,7 @@ const VarnishHttpCacheBackend = require('../cache/backend/varnish-http');
const FastlyCacheBackend = require('../cache/backend/fastly');
const NamedMapProviderCache = require('../cache/named-map-provider-cache');
const NamedMapsCacheEntry = require('../cache/model/named-maps-entry');
const NamedMapProviderReporter = require('../stats/reporter/named-map-provider');
const NamedMapProviderCacheReporter = require('../stats/reporter/named-map-provider-cache');
const SqlWrapMapConfigAdapter = require('../models/mapconfig/adapter/sql-wrap-mapconfig-adapter');
const MapConfigNamedLayersAdapter = require('../models/mapconfig/adapter/mapconfig-named-layers-adapter');
@@ -66,6 +62,8 @@ const pubSubMetrics = require('./middlewares/pubsub-metrics');
const MapRouter = require('./map/map-router');
const TemplateRouter = require('./template/template-router');
const getOnTileErrorStrategy = require('../utils/on-tile-error-strategy');
module.exports = class ApiRouter {
constructor ({ serverOptions, environmentOptions }) {
this.serverOptions = serverOptions;
@@ -85,36 +83,22 @@ module.exports = class ApiRouter {
global.statsClient.gauge(keyPrefix + 'waiting', status.waiting);
});
const metadataBackend = cartodbRedis({ pool: redisPool });
const pgConnection = new PgConnection(metadataBackend);
const windshaftLogger = environmentOptions.log_windshaft && global.log4js
? global.log4js.getLogger('[windshaft]')
: null;
const mapStore = new windshaft.storage.MapStore({
pool: redisPool,
expire_time: serverOptions.grainstore.default_layergroup_ttl,
const { rendererCache, tileBackend, attributesBackend, previewBackend, mapBackend, mapStore } = windshaftFactory({
rendererOptions: serverOptions,
redisPool,
onTileErrorStrategy: getOnTileErrorStrategy({ enabled: environmentOptions.enabledFeatures.onTileErrorStrategy }),
logger: windshaftLogger
});
const rendererFactory = createRendererFactory({ redisPool, serverOptions, environmentOptions });
const rendererCacheOpts = Object.assign({
ttl: 60000, // 60 seconds TTL by default
statsInterval: 60000 // reports stats every milliseconds defined here
}, serverOptions.renderCache || {});
const rendererCache = new windshaft.cache.RendererCache(rendererFactory, rendererCacheOpts);
const rendererStatsReporter = new RendererStatsReporter(rendererCache, rendererCacheOpts.statsInterval);
const rendererStatsReporter = new RendererStatsReporter(rendererCache, serverOptions.renderCache.statsInterval);
rendererStatsReporter.start();
const tileBackend = new windshaft.backend.Tile(rendererCache);
const attributesBackend = new windshaft.backend.Attributes();
const concurrency = serverOptions.renderer.mapnik.poolSize +
serverOptions.renderer.mapnik.poolMaxWaitingClients;
const previewBackend = new windshaft.backend.Preview(rendererCache, { concurrency });
const mapValidatorBackend = new windshaft.backend.MapValidator(tileBackend, attributesBackend);
const mapBackend = new windshaft.backend.Map(rendererCache, mapStore, mapValidatorBackend);
const metadataBackend = cartodbRedis({ pool: redisPool });
const pgConnection = new PgConnection(metadataBackend);
const surrogateKeysCacheBackends = createSurrogateKeysCacheBackends(serverOptions);
const surrogateKeysCache = new SurrogateKeysCache(surrogateKeysCacheBackends);
@@ -171,12 +155,11 @@ module.exports = class ApiRouter {
layergroupAffectedTablesCache
);
const namedMapProviderReporter = new NamedMapProviderReporter({
const namedMapProviderCacheReporter = new NamedMapProviderCacheReporter({
namedMapProviderCache,
intervalInMilliseconds: rendererCacheOpts.statsInterval
intervalInMilliseconds: serverOptions.renderCache.statsInterval
});
namedMapProviderReporter.start();
namedMapProviderCacheReporter.start();
const collaborators = {
analysisStatusBackend,
@@ -291,51 +274,3 @@ function createSurrogateKeysCacheBackends (serverOptions) {
return cacheBackends;
}
const timeoutErrorTilePath = path.join(__dirname, '/../../assets/render-timeout-fallback.png');
const timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, { encoding: null });
function createRendererFactory ({ redisPool, serverOptions, environmentOptions }) {
var onTileErrorStrategy;
if (environmentOptions.enabledFeatures.onTileErrorStrategy !== false) {
onTileErrorStrategy = function onTileErrorStrategy$TimeoutTile (err, tile, headers, stats, format, callback) {
function isRenderTimeoutError (err) {
return err.message === 'Render timed out';
}
function isDatasourceTimeoutError (err) {
return err.message && err.message.match(/canceling statement due to statement timeout/i);
}
function isTimeoutError (err) {
return isRenderTimeoutError(err) || isDatasourceTimeoutError(err);
}
function isRasterFormat (format) {
return format === 'png' || format === 'jpg';
}
if (isTimeoutError(err) && isRasterFormat(format)) {
return callback(null, timeoutErrorTile, {
'Content-Type': 'image/png'
}, {});
} else {
return callback(err, tile, headers, stats);
}
};
}
const rendererFactory = new windshaft.renderer.Factory({
onTileErrorStrategy: onTileErrorStrategy,
mapnik: {
redisPool: redisPool,
grainstore: serverOptions.grainstore,
mapnik: serverOptions.renderer.mapnik
},
http: serverOptions.renderer.http,
mvt: serverOptions.renderer.mvt,
torque: serverOptions.renderer.torque
});
return rendererFactory;
}
-3
View File
@@ -5,8 +5,6 @@ const debug = require('debug')('windshaft:cartodb:error-middleware');
module.exports = function errorMiddleware (/* options */) {
return function error (err, req, res, next) {
// jshint unused:false
// jshint maxcomplexity:9
var allErrors = Array.isArray(err) ? err : [err];
allErrors = populateLimitErrors(allErrors);
@@ -115,7 +113,6 @@ module.exports.findStatusCode = findStatusCode;
function statusFromErrorMessage (errMsg) {
// Find an appropriate statusCode based on message
// jshint maxcomplexity:7
var statusCode = 400;
if (errMsg.indexOf('permission denied') !== -1) {
statusCode = 403;
+1 -1
View File
@@ -83,7 +83,7 @@ TemplateMaps.prototype._redisCmd = function (redisFunc, redisArgs, callback) {
var _reValidNameIdentifier = /^[a-z0-9][0-9a-z_-]*$/i;
var _reValidPlaceholderIdentifier = /^[a-z][0-9a-z_]*$/i;
// jshint maxcomplexity:15
TemplateMaps.prototype._checkInvalidTemplate = function (template) {
if (template.version !== '0.0.1') {
return new Error('Unsupported template version ' + template.version);
@@ -15,7 +15,6 @@ function AnalysisMapConfigAdapter (analysisBackend) {
module.exports = AnalysisMapConfigAdapter;
AnalysisMapConfigAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) {
// jshint maxcomplexity:7
var self = this;
if (!shouldAdaptLayers(requestMapConfig)) {
+1 -3
View File
@@ -5,10 +5,9 @@ var HealthCheck = require('./monitoring/health-check');
var WELCOME_MSG = 'This is the CartoDB Maps API, ' +
'see the documentation at http://docs.cartodb.com/cartodb-platform/maps-api.html';
function ServerInfoController (versions) {
function ServerInfoController () {
this.healthConfig = global.environment.health || {};
this.healthCheck = new HealthCheck(global.environment.disabled_file);
this.versions = versions || {};
}
module.exports = ServerInfoController;
@@ -16,7 +15,6 @@ module.exports = ServerInfoController;
ServerInfoController.prototype.route = function (monitorRouter) {
monitorRouter.get('/health', this.health.bind(this));
monitorRouter.get('/', this.welcome.bind(this));
monitorRouter.get('/version', this.version.bind(this));
};
ServerInfoController.prototype.welcome = function (req, res) {
+2 -2
View File
@@ -102,8 +102,8 @@ module.exports = {
},
statsd: global.environment.statsd,
renderCache: {
ttl: rendererConfig.cache_ttl,
statsInterval: rendererConfig.statsInterval
ttl: rendererConfig.cache_ttl || 60000,
statsInterval: rendererConfig.statsInterval || 60000
},
renderer: {
mvt: Object.assign({ dbPoolParams: global.environment.postgres.pool }, rendererConfig.mvt),
+1 -72
View File
@@ -1,16 +1,9 @@
'use strict';
const _ = require('underscore');
const semver = require('semver');
const express = require('express');
const windshaft = require('windshaft');
const { mapnik } = windshaft;
const jsonReplacer = require('./utils/json-replacer');
const ApiRouter = require('./api/api-router');
const ServerInfoController = require('./server-info-controller');
const StatsClient = require('./stats/client');
module.exports = function createServer (serverOptions) {
@@ -21,10 +14,6 @@ module.exports = function createServer (serverOptions) {
// Make stats client globally accessible
global.statsClient = StatsClient.getInstance(serverOptions.statsd);
serverOptions.grainstore.mapnik_version = mapnikVersion(serverOptions);
bootstrapFonts(serverOptions);
const app = express();
app.enable('jsonp callback');
@@ -34,70 +23,10 @@ module.exports = function createServer (serverOptions) {
const apiRouter = new ApiRouter({ serverOptions, environmentOptions: global.environment });
// TODO: remove it before releasing next major version
if (!Array.isArray(serverOptions.routes.api)) {
serverOptions.routes.api = [serverOptions.routes.api];
}
apiRouter.route(app, serverOptions.routes.api);
const versions = getAndValidateVersions(serverOptions);
const serverInfoController = new ServerInfoController(versions);
const serverInfoController = new ServerInfoController();
serverInfoController.route(app);
return app;
};
function bootstrapFonts (opts) {
// Set carto renderer configuration for MMLStore
opts.grainstore.carto_env = opts.grainstore.carto_env || {};
var cenv = opts.grainstore.carto_env;
cenv.validation_data = cenv.validation_data || {};
if (!cenv.validation_data.fonts) {
mapnik.register_system_fonts();
mapnik.register_default_fonts();
cenv.validation_data.fonts = _.keys(mapnik.fontFiles());
}
}
function mapnikVersion (opts) {
return opts.grainstore.mapnik_version || mapnik.versions.mapnik;
}
function getAndValidateVersions (options) {
var warn = console.warn.bind(console); // jshint ignore:line
var packageDefinition = require('../package.json');
var declaredDependencies = packageDefinition.dependencies || {};
var installedDependenciesVersions = {
camshaft: require('camshaft').version,
grainstore: windshaft.grainstore.version(),
mapnik: windshaft.mapnik.versions.mapnik,
node_mapnik: windshaft.mapnik.version,
'turbo-carto': require('turbo-carto').version,
windshaft: windshaft.version,
windshaft_cartodb: packageDefinition.version
};
if (process.env.NODE_ENV !== 'test') {
var dependenciesToValidate = ['camshaft', 'turbo-carto', 'windshaft'];
dependenciesToValidate.forEach(function (depName) {
var declaredDependencyVersion = declaredDependencies[depName];
var installedDependencyVersion = installedDependenciesVersions[depName];
if (!semver.satisfies(installedDependencyVersion, declaredDependencyVersion)) {
warn(`Dependency="${depName}" installed version="${installedDependencyVersion}" does ` +
`not match declared version="${declaredDependencyVersion}". Check your installation.`);
}
});
// Be nice and warn if configured mapnik version is != installed mapnik version
if (windshaft.mapnik.versions.mapnik !== options.grainstore.mapnik_version) {
warn('WARNING: detected mapnik version (' + windshaft.mapnik.versions.mapnik + ')' +
' != configured mapnik version (' + options.grainstore.mapnik_version + ')');
}
}
return installedDependenciesVersions;
}
@@ -2,10 +2,10 @@
const statKeyTemplate = ctx => `windshaft.named-map-provider-cache.${ctx.metric}`;
module.exports = class NamedMapProviderReporter {
module.exports = class NamedMapProviderCacheReporter {
constructor ({ namedMapProviderCache, intervalInMilliseconds } = {}) {
this.namedMapProviderCache = namedMapProviderCache;
this.intervalInMilliseconds = intervalInMilliseconds;
this.intervalInMilliseconds = intervalInMilliseconds || 60000;
this.intervalId = null;
}
@@ -14,8 +14,8 @@ module.exports = class NamedMapProviderReporter {
const { statsClient: stats } = global;
this.intervalId = setInterval(() => {
stats.gauge(statKeyTemplate({ metric: 'named-map.count' }), cache.length);
const providers = cache.dump();
stats.gauge(statKeyTemplate({ metric: 'named-map.count' }), providers.length);
const namedMapInstantiations = providers.reduce((acc, { v: providers }) => {
acc += Object.keys(providers).length;
+7 -43
View File
@@ -6,8 +6,6 @@
// - the mapnik-pool status: count, unused and waiting
// - the internally cached objects: png and grid
var _ = require('underscore');
function RendererStatsReporter (rendererCache, statsInterval) {
this.rendererCache = rendererCache;
this.statsInterval = statsInterval || 6e4;
@@ -17,50 +15,16 @@ function RendererStatsReporter (rendererCache, statsInterval) {
module.exports = RendererStatsReporter;
RendererStatsReporter.prototype.start = function () {
var self = this;
this.renderersStatsIntervalId = setInterval(function () {
var rendererCacheEntries = self.rendererCache.renderers;
this.renderersStatsIntervalId = setInterval(() => {
const rendererStats = this.rendererCache.getStats();
if (!rendererCacheEntries) {
return null;
}
global.statsClient.gauge('windshaft.rendercache.count', _.keys(rendererCacheEntries).length);
var renderersStats = _.reduce(rendererCacheEntries, function (_rendererStats, cacheEntry) {
var stats = cacheEntry.renderer && cacheEntry.renderer.getStats && cacheEntry.renderer.getStats();
if (!stats) {
return _rendererStats;
}
_rendererStats.pool.count += stats.pool.count;
_rendererStats.pool.unused += stats.pool.unused;
_rendererStats.pool.waiting += stats.pool.waiting;
_rendererStats.cache.grid += stats.cache.grid;
_rendererStats.cache.png += stats.cache.png;
return _rendererStats;
},
{
pool: {
count: 0,
unused: 0,
waiting: 0
},
cache: {
png: 0,
grid: 0
for (const [stat, value] of rendererStats) {
if (stat.startsWith('rendercache')) {
global.statsClient.gauge(`windshaft.${stat}`, value);
} else {
global.statsClient.gauge(`windshaft.mapnik-${stat}`, value);
}
}
);
global.statsClient.gauge('windshaft.mapnik-cache.png', renderersStats.cache.png);
global.statsClient.gauge('windshaft.mapnik-cache.grid', renderersStats.cache.grid);
global.statsClient.gauge('windshaft.mapnik-pool.count', renderersStats.pool.count);
global.statsClient.gauge('windshaft.mapnik-pool.unused', renderersStats.pool.unused);
global.statsClient.gauge('windshaft.mapnik-pool.waiting', renderersStats.pool.waiting);
}, this.statsInterval);
this.rendererCache.on('err', rendererCacheErrorListener);
+37
View File
@@ -0,0 +1,37 @@
'use strict';
const path = require('path');
const timeoutErrorTilePath = path.join(__dirname, '/../../assets/render-timeout-fallback.png');
const timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, { encoding: null });
module.exports = function getOnTileErrorStrategy ({ enabled }) {
let onTileErrorStrategy;
if (enabled !== false) {
onTileErrorStrategy = async function onTileErrorStrategy$TimeoutTile (err, format) {
function isRenderTimeoutError (err) {
return err.message === 'Render timed out';
}
function isDatasourceTimeoutError (err) {
return err.message && err.message.match(/canceling statement due to statement timeout/i);
}
function isTimeoutError (err) {
return isRenderTimeoutError(err) || isDatasourceTimeoutError(err);
}
function isRasterFormat (format) {
return format === 'png' || format === 'jpg';
}
if (isTimeoutError(err) && isRasterFormat(format)) {
return { buffer: timeoutErrorTile, headers: { 'Content-Type': 'image/png' }, stats: {} };
} else {
throw err;
}
};
}
return onTileErrorStrategy;
};
+71 -60
View File
@@ -1,6 +1,6 @@
{
"name": "windshaft-cartodb",
"version": "8.1.2",
"version": "9.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -165,9 +165,9 @@
}
},
"@carto/cartonik": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@carto/cartonik/-/cartonik-0.7.0.tgz",
"integrity": "sha512-LD5HBx3/hUL4492I++rspGJh2bcoOjLAHBE8cOLi2fyqIK0NS5bekXrz9mEWY/Ie9xLDeKn9s89FTbl7IhrLrw==",
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@carto/cartonik/-/cartonik-0.8.0.tgz",
"integrity": "sha512-avB1IyTxy04lN2lyyUdQPhCPRHTH4IcauhUOVFlhLOrQhxbkfrf/VXdE8dJsdlI4w6U1pTiHpiq++5+yZr2gyQ==",
"requires": {
"@carto/mapnik": "3.6.2-carto.16",
"@mapbox/sphericalmercator": "^1.1.0",
@@ -534,9 +534,9 @@
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
@@ -790,9 +790,9 @@
}
},
"canvas": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.0.tgz",
"integrity": "sha512-bEO9f1ThmbknLPxCa8Es7obPlN9W3stB1bo7njlhOFKIdUTldeTqXCh9YclCPAi2pSQs84XA0jq/QEZXSzgyMw==",
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz",
"integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==",
"requires": {
"nan": "^2.14.0",
"node-pre-gyp": "^0.11.0",
@@ -800,9 +800,9 @@
},
"dependencies": {
"glob": {
"version": "7.1.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
"integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -841,7 +841,7 @@
},
"carto": {
"version": "github:cartodb/carto#85881d99dd7fcf2c4e16478b04db67108d27a50c",
"from": "github:cartodb/carto#master",
"from": "github:cartodb/carto#0.15.1-cdb5",
"requires": {
"mapnik-reference": "~6.0.2",
"optimist": "~0.6.0",
@@ -949,9 +949,9 @@
"dev": true
},
"chownr": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz",
"integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw=="
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
},
"chroma-js": {
"version": "1.1.1",
@@ -4331,9 +4331,9 @@
"integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg=="
},
"underscore": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
"integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg=="
"version": "1.9.2",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz",
"integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ=="
}
}
},
@@ -4361,9 +4361,9 @@
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
},
"mimic-response": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.0.0.tgz",
"integrity": "sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ=="
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
"integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="
},
"minimatch": {
"version": "3.0.4",
@@ -4502,9 +4502,9 @@
"optional": true
},
"needle": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz",
"integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz",
"integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==",
"requires": {
"debug": "^3.2.6",
"iconv-lite": "^0.4.4",
@@ -4640,9 +4640,9 @@
},
"dependencies": {
"glob": {
"version": "7.1.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
"integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -4668,9 +4668,9 @@
"integrity": "sha1-J6WTSHY9CvegN6wqAx/vPwUQE9M="
},
"nopt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
"integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
"requires": {
"abbrev": "1",
"osenv": "^0.1.4"
@@ -4688,17 +4688,26 @@
}
},
"npm-bundled": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz",
"integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g=="
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
"integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
"requires": {
"npm-normalize-package-bin": "^1.0.1"
}
},
"npm-normalize-package-bin": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
"integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
},
"npm-packlist": {
"version": "1.4.6",
"resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz",
"integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==",
"version": "1.4.8",
"resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
"integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
"requires": {
"ignore-walk": "^3.0.1",
"npm-bundled": "^1.0.1"
"npm-bundled": "^1.0.1",
"npm-normalize-package-bin": "^1.0.1"
}
},
"npm-run-path": {
@@ -5466,9 +5475,9 @@
},
"dependencies": {
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
}
}
},
@@ -6396,6 +6405,22 @@
"d3": "3.5.17",
"turbo-carto": "^0.21.1",
"turf-jenks": "~1.0.1"
},
"dependencies": {
"carto": {
"version": "github:cartodb/carto#85881d99dd7fcf2c4e16478b04db67108d27a50c",
"from": "github:cartodb/carto#master",
"requires": {
"mapnik-reference": "~6.0.2",
"optimist": "~0.6.0",
"underscore": "1.8.3"
}
},
"underscore": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
"integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
}
}
},
"tough-cookie": {
@@ -6594,11 +6619,11 @@
"integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU="
},
"windshaft": {
"version": "5.6.4",
"resolved": "https://registry.npmjs.org/windshaft/-/windshaft-5.6.4.tgz",
"integrity": "sha512-W+SbKM5CjpuPXMrLUXzZms6yDk0aQeIs3eAd75Ih6SYwiJo12/vxkHqMe+0KZnVj6JE/oe53tVfWHRibE70NJA==",
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/windshaft/-/windshaft-6.0.0.tgz",
"integrity": "sha512-7GnPRZsJuHEnwC/Yp+QvMIyK/EhLqABs2RNz0iQsShqS5gdsxHCIp+koG2r31ujrl4T8JDFCT5Y2Q4yQC70EaA==",
"requires": {
"@carto/cartonik": "^0.7.0",
"@carto/cartonik": "^0.8.0",
"@carto/mapnik": "3.6.2-carto.16",
"canvas": "^2.4.1",
"carto": "github:cartodb/carto#0.15.1-cdb5",
@@ -6612,15 +6637,6 @@
"torque.js": "3.1.1"
},
"dependencies": {
"carto": {
"version": "github:cartodb/carto#85881d99dd7fcf2c4e16478b04db67108d27a50c",
"from": "github:cartodb/carto#0.15.1-cdb5",
"requires": {
"mapnik-reference": "~6.0.2",
"optimist": "~0.6.0",
"underscore": "1.8.3"
}
},
"cartodb-query-tables": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/cartodb-query-tables/-/cartodb-query-tables-0.6.3.tgz",
@@ -6628,11 +6644,6 @@
"requires": {
"decimal.js": "10.2.0"
}
},
"underscore": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
"integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
}
}
},
+5 -4
View File
@@ -1,7 +1,7 @@
{
"private": true,
"name": "windshaft-cartodb",
"version": "8.1.2",
"version": "9.0.0",
"description": "CARTO Maps API tiler",
"keywords": [
"carto",
@@ -60,10 +60,11 @@
"step-profiler": "0.3.0",
"turbo-carto": "0.21.2",
"underscore": "1.6.0",
"windshaft": "5.6.4",
"windshaft": "^6.0.0",
"yargs": "11.1.0"
},
"devDependencies": {
"@carto/mapnik": "^3.6.2-carto.16",
"eslint": "^6.5.1",
"eslint-config-standard": "^14.1.0",
"eslint-plugin-import": "^2.18.2",
@@ -75,9 +76,9 @@
"nock": "9.2.6",
"nyc": "^14.1.1",
"redis": "2.8.0",
"sinon": "^9.0.0",
"step": "1.0.0",
"strftime": "0.10.0",
"sinon": "^9.0.0"
"strftime": "0.10.0"
},
"scripts": {
"lint:fix": "eslint --fix app.js \"lib/**/*.js\" \"test/**/*.js\"",
+1 -1
View File
@@ -4,7 +4,7 @@ require('../../support/test-helper');
const assert = require('../../support/assert');
const TestClient = require('../../support/test-client');
const mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
const PERMISSION_DENIED_RESPONSE = {
status: 403,
+1 -1
View File
@@ -6,7 +6,7 @@ var fs = require('fs');
var assert = require('../support/assert');
var TestClient = require('../support/test-client');
var serverOptions = require('../../lib/server-options');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var IMAGE_TOLERANCE_PER_MIL = 5;
var CARTOCSS_LABELS = [
-9
View File
@@ -302,15 +302,6 @@ describe('get requests with cache headers', function () {
);
});
it('/version', function (done) {
assert.response(
server,
getRequest('/version'),
statusOkResponse,
noCacheHeaders(done)
);
});
it('/health', function (done) {
assert.response(
server,
+1 -1
View File
@@ -8,7 +8,7 @@ var step = require('step');
var strftime = require('strftime');
var redisStatsDb = 5;
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var semver = require('semver');
var helper = require('../support/test-helper');
@@ -9,7 +9,7 @@ var serverOptions = require('../../lib/server-options');
var RedisPool = require('redis-mpool');
var TemplateMaps = require('../../lib/backends/template-maps');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var IMAGE_TOLERANCE = 20;
@@ -6,7 +6,7 @@ const request = require('request');
const assert = require('assert');
const Server = require('../../lib/server');
const serverOptions = require('../../lib/server-options');
const { mapnik } = require('windshaft');
const mapnik = require('@carto/mapnik');
const helper = require('../support/test-helper');
const namedTileUrlTemplate = (ctx) => {
@@ -5,7 +5,7 @@ var RedisPool = require('redis-mpool');
var querystring = require('querystring');
var assert = require('../support/assert');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var CartodbWindshaft = require('../../lib/server');
var serverOptions = require('../../lib/server-options');
var TemplateMaps = require('../../lib/backends/template-maps');
+1 -1
View File
@@ -4,7 +4,7 @@ require('../support/test-helper');
const helper = require('../support/test-helper');
var assert = require('../support/assert');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var CartodbWindshaft = require('../../lib/server');
var serverOptions = require('../../lib/server-options');
@@ -5,7 +5,7 @@ var testHelper = require('../support/test-helper');
var RedisPool = require('redis-mpool');
var assert = require('../support/assert');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var CartodbWindshaft = require('../../lib/server');
var serverOptions = require('../../lib/server-options');
var TemplateMaps = require('../../lib/backends/template-maps');
+1 -1
View File
@@ -5,7 +5,7 @@ var RedisPool = require('redis-mpool');
var querystring = require('querystring');
var assert = require('../support/assert');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var CartodbWindshaft = require('../../lib/server');
var serverOptions = require('../../lib/server-options');
var TemplateMaps = require('../../lib/backends/template-maps');
@@ -12,7 +12,7 @@ var RedisPool = require('redis-mpool');
var step = require('step');
var windshaft = require('windshaft');
const MapStore = require('../support/map-store');
describe('overviews metadata for named maps', function () {
var server;
@@ -127,10 +127,7 @@ describe('overviews metadata for named maps', function () {
var next = this;
var mapStore = new windshaft.storage.MapStore({
pool: redisPool,
expire_time: 500000
});
const mapStore = new MapStore(redisPool);
mapStore.load(LayergroupToken.parse(layergroupId).token, function (err, mapConfig) {
assert.ifError(err);
assert.deepStrictEqual(nonOverviewsLayer, mapConfig._cfg.layers[1]);
+5 -9
View File
@@ -12,7 +12,7 @@ var RedisPool = require('redis-mpool');
var step = require('step');
var windshaft = require('windshaft');
const MapStore = require('../support/map-store');
describe('overviews metadata', function () {
var server;
@@ -82,10 +82,8 @@ describe('overviews metadata', function () {
assert.ifError(err);
var next = this;
var mapStore = new windshaft.storage.MapStore({
pool: redisPool,
expire_time: 500000
});
const mapStore = new MapStore(redisPool);
mapStore.load(LayergroupToken.parse(expectedToken).token, function (err, mapConfig) {
assert.ifError(err);
assert.deepStrictEqual(nonOverviewsLayer, mapConfig._cfg.layers[1]);
@@ -275,10 +273,8 @@ describe('overviews metadata with filters', function () {
assert.ifError(err);
var next = this;
var mapStore = new windshaft.storage.MapStore({
pool: redisPool,
expire_time: 500000
});
const mapStore = new MapStore(redisPool);
mapStore.load(LayergroupToken.parse(expectedToken).token, function (err, mapConfig) {
assert.ifError(err);
assert.strictEqual(mapConfig._cfg.layers[0].type, 'cartodb');
+1 -1
View File
@@ -6,7 +6,7 @@ var assert = require('../../support/assert');
var _ = require('underscore');
var querystring = require('querystring');
var step = require('step');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var cartodbServer = require('../../../lib/server');
var ServerOptions = require('./support/ported-server-options');
var LayergroupToken = require('../../../lib/models/layergroup-token');
+1 -1
View File
@@ -3,7 +3,7 @@
var testHelper = require('../../support/test-helper');
var assert = require('../../support/assert');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var cartodbServer = require('../../../lib/server');
var ServerOptions = require('./support/ported-server-options');
@@ -3,7 +3,7 @@
var testHelper = require('../../support/test-helper');
var assert = require('../../support/assert');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var semver = require('semver');
var cartodbServer = require('../../../lib/server');
var ServerOptions = require('./support/ported-server-options');
-23
View File
@@ -35,29 +35,6 @@ describe('server', function () {
}, function () { done(); });
});
/// /////////////////////////////////////////////////////////////////
//
// GET VERSION
//
/// /////////////////////////////////////////////////////////////////
it('get /version returns versions', function (done) {
assert.response(server, {
url: '/version',
method: 'GET'
}, {
status: 200
}, function (res) {
var parsed = JSON.parse(res.body);
assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'windshaft'), "No 'windshaft' version in " + parsed);
assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'grainstore'), "No 'grainstore' version in " + parsed);
assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'node_mapnik'), "No 'node_mapnik' version in " + parsed);
assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'mapnik'), "No 'mapnik' version in " + parsed);
// TODO: check actual versions ?
done();
});
});
/// /////////////////////////////////////////////////////////////////
//
// GET GRID
@@ -2,7 +2,7 @@
var _ = require('underscore');
var serverOptions = require('../../../../lib/server-options');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var OverviewsQueryRewriter = require('../../../../lib/utils/overviews-query-rewriter');
var overviewsQueryRewriter = new OverviewsQueryRewriter({
zoom_level: 'CDB_ZoomFromScale(!scale_denominator!)'
@@ -41,7 +41,7 @@ module.exports = _.extend({}, serverOptions, {
whitelist: ['http://127.0.0.1:8033/{s}/{z}/{x}/{y}.png'],
fallbackImage: {
type: 'fs',
src: path.join(__dirname, '/../../test/fixtures/http/basemap.png')
src: path.join(__dirname, '/../../../fixtures/http/basemap.png')
}
}
},
@@ -7,7 +7,7 @@ var step = require('step');
var assert = require('../../../support/assert');
var _ = require('underscore');
var querystring = require('querystring');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var CartodbServer = require('../../../../lib/server');
var PortedServerOptions = require('./ported-server-options');
-17
View File
@@ -39,23 +39,6 @@ describe('server', function () {
}
);
});
it('get call to server returns 200', function (done) {
assert.response(server, {
url: '/version',
method: 'GET'
}, {
status: 200
}, function (res) {
var parsed = JSON.parse(res.body);
assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'windshaft_cartodb'), "No 'windshaft_cartodb' version in " + parsed);
assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'windshaft'), "No 'windshaft' version in " + parsed);
assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'grainstore'), "No 'grainstore' version in " + parsed);
assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'node_mapnik'), "No 'node_mapnik' version in " + parsed);
assert.ok(Object.prototype.hasOwnProperty.call(parsed, 'mapnik'), "No 'mapnik' version in " + parsed);
done();
});
});
});
describe('server old_api', function () {
@@ -6,7 +6,7 @@ var LayergroupToken = require('../../../lib/models/layergroup-token');
var testHelper = require('../../support/test-helper');
var CartodbWindshaft = require('../../../lib/server');
var serverOptions = require('../../../lib/server-options');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var IMAGE_TOLERANCE_PER_MIL = 10;
describe('turbo-carto for named maps', function () {
+1 -3
View File
@@ -7,7 +7,7 @@ var fs = require('fs');
var path = require('path');
var util = require('util');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var request = require('request');
@@ -95,7 +95,6 @@ assert.response = function (server, req, res, callback) {
var listener = server.listen(port, host);
listener.on('error', callback);
listener.on('listening', function onServerListening () {
// jshint maxcomplexity:9
const { address: host, port } = listener.address();
const address = `${host}:${port}`;
@@ -186,7 +185,6 @@ function validateResponse (response, expected) {
// @param tolerance number of tolerated grid cell differences
assert.utfgridEqualsFile = function (buffer, fileB, tolerance, callback) {
// jshint maxcomplexity:9
fs.writeFileSync('/tmp/grid.json', buffer, 'binary'); // <-- to debug/update
var expectedJson = JSON.parse(fs.readFileSync(fileB, 'utf8'));
+38
View File
@@ -0,0 +1,38 @@
'use strict';
const { MapConfig } = require('windshaft').model;
// Windshaft no longer provides the MapStore class to be used just for testing purposes
// This class provides just the method needed to load a map-config from redis
// It should be replaced by a new module @carto/map-config-storage (to be published)
module.exports = class MapStore {
constructor (pool) {
this.pool = pool;
}
load (token, callback) {
const db = 0;
this.pool.acquire(db, (err, client) => {
if (err) {
return callback(err);
}
client.get(`map_cfg|${token}`, (err, data) => {
this.pool.release(db, client);
if (err) {
return callback(err);
}
let mapConfig;
try {
mapConfig = MapConfig.create(JSON.parse(data));
} catch (err) {
return callback(err);
}
return callback(null, mapConfig);
});
});
}
};
+1 -3
View File
@@ -5,7 +5,7 @@ var step = require('step');
const { URL } = require('url');
var PSQL = require('cartodb-psql');
var _ = require('underscore');
var mapnik = require('windshaft').mapnik;
const mapnik = require('@carto/mapnik');
var LayergroupToken = require('../../lib/models/layergroup-token');
@@ -821,7 +821,6 @@ TestClient.prototype.getTile = function (z, x, y, params, callback) {
);
},
function getTileResult (err, layergroupId) {
// jshint maxcomplexity:13
assert.ifError(err);
self.keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0;
@@ -931,7 +930,6 @@ TestClient.prototype.getTile = function (z, x, y, params, callback) {
};
TestClient.prototype.getLayergroup = function (params, callback) {
// jshint maxcomplexity: 7
var self = this;
if (!callback) {
+2 -3
View File
@@ -8,14 +8,13 @@ var cartodbRedis = require('cartodb-redis');
var PgConnection = require('../../lib/backends/pg-connection');
var AuthBackend = require('../../lib/backends/auth');
var TemplateMaps = require('../../lib/backends/template-maps');
const MapStore = require('../support/map-store');
const cleanUpQueryParamsMiddleware = require('../../lib/api/middlewares/clean-up-query-params');
const authorizeMiddleware = require('../../lib/api/middlewares/authorize');
const dbConnSetupMiddleware = require('../../lib/api/middlewares/db-conn-setup');
const credentialsMiddleware = require('../../lib/api/middlewares/credentials');
var windshaft = require('windshaft');
describe('prepare-context', function () {
var testUser = _.template(global.environment.postgres_auth_user, { user_id: 1 });
var testPubuser = global.environment.postgres.user;
@@ -28,7 +27,7 @@ describe('prepare-context', function () {
before(function () {
var redisPool = new RedisPool(global.environment.redis);
var mapStore = new windshaft.storage.MapStore();
var mapStore = new MapStore(redisPool);
var metadataBackend = cartodbRedis({ pool: redisPool });
var pgConnection = new PgConnection(metadataBackend);
var templateMaps = new TemplateMaps(redisPool);
@@ -1,7 +1,7 @@
'use strict';
const assert = require('assert');
const NamedMapProviderReporter = require('../../../../lib/stats/reporter/named-map-provider');
const NamedMapProviderReporter = require('../../../../lib/stats/reporter/named-map-provider-cache');
describe('named-map-provider-reporter', function () {
it('should report metrics every 100 ms', function (done) {
-1
View File
@@ -392,7 +392,6 @@ describe('template_maps', function () {
});
it('instanciate templates', function () {
// jshint maxcomplexity:7
var tmap = new TemplateMaps(redisPool);
assert.ok(tmap);