@@ -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
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
+3
-3
@@ -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;
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
Generated
+71
-60
@@ -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
@@ -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\"",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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,
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
|
||||
@@ -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 () {
|
||||
|
||||
@@ -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'));
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -392,7 +392,6 @@ describe('template_maps', function () {
|
||||
});
|
||||
|
||||
it('instanciate templates', function () {
|
||||
// jshint maxcomplexity:7
|
||||
var tmap = new TemplateMaps(redisPool);
|
||||
assert.ok(tmap);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user