{"version":3,"sources":["jsdelivr-header.js","/npm/tilelive-s3@6.5.0/lib/index.js"],"names":[],"mappings":"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","file":"/npm/tilelive-s3@6.5.0/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/tilelive-s3@6.5.0/lib/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","var fs = require('fs');\nvar url = require('url');\nvar path = require('path');\nvar qs = require('querystring');\nvar Buffer = require('buffer').Buffer;\nvar http = require('http');\nvar zlib = require('zlib');\nvar tiletype = require('tiletype');\nvar crypto = require('crypto');\nvar AWS = require('aws-sdk');\nvar AgentKeepAlive = require('agentkeepalive');\nvar s3urls = require('s3urls');\nvar utils = require('util');\nvar Emitter = require('events').EventEmitter;\nvar url = require('url');\n\nmodule.exports = S3;\n\nvar immediate = global.setImmediate || process.nextTick;\n\nvar defaultAgent = new AgentKeepAlive.HttpsAgent({\n    keepAlive: true,\n    maxSockets: 128,\n    keepAliveTimeout: 60000\n});\n\nif (process.env.AWS_S3_ENDPOINT) {\n    var protocol = url.parse(process.env.AWS_S3_ENDPOINT).protocol;\n    if (protocol === 'http:') {\n        defaultAgent = new AgentKeepAlive({\n            keepAlive: true,\n            maxSockets: 128,\n            keepAliveTimeout: 60000\n        });\n    }\n}\n\nutils.inherits(S3, Emitter);\nfunction S3(uri, callback) {\n    if (typeof uri === 'string') uri = url.parse(uri);\n    this._uri = uri;\n    this._cacheSolid;\n    this._cacheNotFound;\n    this._cacheMasks = {};\n    this._stats = { get: 0, put: 0, noop: 0, txin: 0, txout: 0 };\n    this._prepare = function(url) { return url };\n\n    // If a parsed uri of the form s3://[bucket]/[path template] is passed,\n    // assume that tiles are implied (no grids), and generate a data\n    // object containing an https://[bucket].s3.amazonaws.com/[path template]\n    // tiles key.\n\n    if (uri.protocol === 's3:' && uri.host) {\n        uri.host =\n        uri.hostname = uri.host + '.s3.amazonaws.com';\n        uri.protocol = 'https:';\n\n        // for node v0.12+ which encodes URI components token placeholders {z}\n        // when the uri is parsed.\n        var templateURL = decodeURIComponent(url.format(uri));\n        uri.data = {\n            tiles: [ templateURL ],\n            geocoder_data: templateURL.substr(0, templateURL.indexOf('/{z}/{x}/{y}'))\n        };\n\n        var query = typeof uri.query === 'string' ? qs.parse(uri.query) : (uri.query || {});\n        if (query && query.region === 'cn-north-1') {\n            uri.host =\n            uri.hostname = 's3.cn-north-1.amazonaws.com.cn';\n        };\n        uri.acl = query.acl || 'private';\n        uri.sse = query.sse;\n        uri.sseKmsId = query.sseKmsId;\n        if (query.timeout && /^[0-9]+$/.test(query.timeout)) {\n            uri.timeout = parseInt(query.timeout);\n        }\n        if (query.expires && /^[0-9]+$/.test(query.expires)) {\n            uri.expires = parseInt(query.expires, 10);\n        } else if (query.expires) {\n            uri.expires = query.expires;\n        }\n    }\n\n    var source = this;\n    if (uri.data) { return setup(null, uri.data); }\n    if (uri.pathname) return fs.readFile(uri.pathname, 'utf8', setup);\n    callback(new Error('Invalid URI'));\n\n    function setup(err, data) {\n        if (err) return callback(err);\n\n        source.data = typeof data === 'string' ? JSON.parse(data) : data;\n\n        ['tiles', 'grids'].forEach(function(key) {\n            if (!source.data[key] || !source.data[key].length) return;\n            var params = s3urls.fromUrl(source.data[key][0]);\n            if (!params.Bucket || !params.Key) err = new Error(key + ' must exist on S3');\n            if (source.bucket && params.Bucket !== source.bucket) err = new Error('buckets for tiles and grids must match');\n            source.bucket = params.Bucket;\n\n            var query = url.parse(source.data[key][0], true).query;\n            if (!query.region) return;\n            if (source.region && query.region !== source.region) err = new Error('buckets for tiles and grids must be in the same region');\n            source.region = query.region;\n        });\n\n        source.client = uri.client || new AWS.S3({\n            s3ForcePathStyle: !!process.env.AWS_S3_ENDPOINT,\n            region: source.region,\n            endpoint: process.env.AWS_S3_ENDPOINT,\n            maxRetries: 4,\n            httpOptions: {\n                timeout: 2000,\n                agent: defaultAgent\n            }\n        });\n\n        if (source.data.mtime) source.mtime = new Date(source.data.mtime);\n        if (source.data.prepare) source._prepare = Function('url,z,x,y', source.data.prepare);\n\n        source.acl = uri.acl || 'public-read';\n        source.sse = uri.sse;\n        source.sseKmsId = uri.sseKmsId;\n        source.expires = uri.expires && !isNaN(+new Date(uri.expires)) ? new Date(uri.expires) : undefined;\n        if (uri.timeout) source.client.config.httpOptions.timeout = uri.timeout;\n        if (uri.strict && uri.strict === true) source.strict = true;\n\n        source.open = true;\n        source.emit('open', err, source);\n        if (err) return callback(err);\n        callback(null, source);\n    }\n};\n\nfunction managedError(err, context, grid) {\n    if (!err) return false;\n\n    // If call context was passed from AWS SDK we may have access to the\n    // httpResponse headers to attach an x-amz-request-id. Attempt to do so.\n    if (context &&\n        context.httpResponse &&\n        context.httpResponse.headers) {\n        if (context.httpResponse.headers['x-amz-request-id']) {\n            err.amzRequestId = context.httpResponse.headers['x-amz-request-id'];\n        }\n        if (context.httpResponse.headers['x-amz-id-2']) {\n            err.amzId2 = context.httpResponse.headers['x-amz-id-2'];\n        }\n    }\n\n    var error, msg;\n    if (err.name === 'TimeoutError') {\n        if (err.message) msg = err.message;\n        error = new Error(msg || \"Timed out\");\n        error.statusCode = 504;\n        error.retryable = true;\n    } else if (err.statusCode === 404 || err.statusCode === 403) {\n        error = new Error(grid ? 'Grid does not exist' : 'Tile does not exist');\n        error.statusCode = err.statusCode;\n        error.retryable = false;\n    } else if (err.code === 'NetworkingError' && err.message === 'socket hang up') {\n        error = new Error(err.message);\n        error.statusCode = 500;\n        error.code = 'ECONNRESET';\n        error.retryable = true;\n    } else if (err.code === 'InternalError') {\n        error = new Error(err.message);\n        error.statusCode = 500;\n        error.code = 'InternalError';\n        error.retryable = true;\n    } else if (err.code === 'TruncatedResponseError') {\n        // This error is generated by tilelive-s3 -- it is not recognized as an\n        // error by aws-sdk. See S3.get below.\n        error = new Error('Content-Length does not match response body length');\n        error.statusCode = 500;\n        error.code = 'TruncatedResponseError',\n        error.retryable = true;\n    } else if (err.statusCode === 503 && !err.message) {\n        error = new Error('503 Unknown');\n        error.statusCode = 503;\n        error.retryable = true;\n    }\n\n    if (!error) return false;\n\n    if (error.statusCode >= 500 && err.amzRequestId) {\n        error.message = '[x-amz-request-id:' + err.amzRequestId + '] ' + error.message;\n        error.amzRequestId = err.amzRequestId;\n    }\n\n    if (error.statusCode >= 500 && err.amzId2) {\n        error.message = '[x-amz-id-2:' + err.amzId2 + '] ' + error.message;\n        error.amzId2 = err.amzId2;\n    }\n\n    Error.captureStackTrace(error, arguments.callee);\n    return error;\n}\n\nfunction onRetry(res) {\n    if (managedError(res.error, res)) res.error.retryable = managedError(res.error, res).retryable;\n}\n\nS3.registerProtocols = function(tilelive) {\n    tilelive.protocols['s3:'] = S3;\n};\n\nS3.list = function(filepath, callback) {\n    filepath = path.resolve(filepath);\n    fs.readdir(filepath, function(err, files) {\n        if (err && err.code === 'ENOENT') return callback(null, {});\n        if (err) return callback(err);\n        for (var result = {}, i = 0; i < files.length; i++) {\n            var name = files[i].match(/^([\\w-]+)\\.s3$/);\n            if (name) result[name[1]] = 's3://' + path.join(filepath, name[0]);\n        }\n        callback(null, result);\n    });\n};\n\nS3.findID = function(filepath, id, callback) {\n    filepath = path.resolve(filepath);\n    var file = path.join(filepath, id + '.s3');\n    fs.stat(file, function(err, stats) {\n        if (err) callback(err);\n        else callback(null, 's3://' + file);\n    });\n};\n\nS3.prototype._prepareURL = function(url, z, x, y) {\n    function pad(str) {\n        return str.length < 2 ? '0' + str : str;\n    }\n    return (this._prepare(url,z,x,y)\n        .replace(/\\{prefix\\}/g, (x % 16).toString(16) + (y % 16).toString(16))\n        .replace(/\\{prefix4\\}/g, pad((x % 256).toString(16)) + pad((y % 256).toString(16)))\n        .replace(/\\{z\\}/g, z)\n        .replace(/\\{x\\}/g, x)\n        .replace(/\\{y\\}/g, (this.data.scheme === 'tms') ? (1 << z) - 1 - y : y));\n};\n\nS3.prototype.get = function(url, callback) {\n    this.client.getObject(s3urls.fromUrl(url), function(err, response) {\n        if (err) return callback(err);\n\n        callback(null, response.Body, {\n            'content-type': response.ContentType,\n            'content-length': response.ContentLength,\n            'etag': response.ETag,\n            'last-modified': response.LastModified,\n            'cache-control': response.CacheControl,\n            'expires': S3.futurize(response.Expires)\n        });\n    })\n    .on('retry', onRetry)\n    .on('extractData', function(res) {\n        if (res.data.Body.length != res.data.ContentLength) {\n            res.data = null;\n            res.error = {\n                code: 'TruncatedResponseError',\n                message: 'Content-Length does not match response body length'\n            };\n        }\n    });\n};\n\nS3.prototype._loadTile = function(z, x, y, callback) {\n    if (!this.data) return callback(new Error('Tilesource not loaded'));\n    if (!this.data.tiles) return callback(new Error('No \"tiles\" key'));\n    if (this.strict) {\n      if (z < this.data.minzoom || z > this.data.maxzoom) return callback(new Error('Tile does not exist'));\n    }\n\n    var url = this._prepareURL(this.data.tiles[0], z, x, y);\n    this.get(url, function(err, data, headers) {\n        if (err) return callback(managedError(err, this) || err);\n\n        var modified = headers['last-modified'] ? new Date(headers['last-modified']) : new Date();\n        var responseHeaders = tiletype.headers(data);\n        responseHeaders['Last-Modified'] = modified;\n        responseHeaders.ETag = headers.etag || (headers['content-length'] + '-' + (+modified));\n        if (headers['cache-control']) {\n            responseHeaders['Cache-Control'] = headers['cache-control'];\n        }\n        if (headers['expires']) {\n            responseHeaders['Expires'] = headers['expires'];\n        }\n        callback(null, data, responseHeaders);\n    });\n};\n\n// Select a tile from S3. Scheme is XYZ.\nS3.prototype.getTile = function(z, x, y, callback) {\n    var s3 = this;\n    var finalize = function(err, data, headers) {\n        if (!err || err.message !== 'Tile does not exist' || !s3.data.notFound)\n            return callback(err, data, headers);\n        if (s3._cacheNotFound)\n            return callback(null, s3._cacheNotFound.data, s3._cacheNotFound.headers);\n        var z = s3.data.notFound[0];\n        var x = s3.data.notFound[1];\n        var y = s3.data.notFound[2];\n        s3._loadTile(z, x, y, function(err, data, headers) {\n            if (err) return callback(err);\n            s3._cacheNotFound = { data: data, headers: headers };\n            return callback(err, data, headers);\n        });\n    };\n    this._loadTile(z, x, y, finalize);\n};\n\nS3.prototype.getGrid = function(z, x, y, callback) {\n    if (!this.data) return callback(new Error('Gridsource not loaded'));\n    if (!this.data.grids) return callback(new Error('Grid does not exist'));\n\n    var url = this._prepareURL(this.data.grids[0], z, x, y);\n\n    this.get(url, function(err, grid, headers) {\n        if (err) return callback(managedError(err, this, true) || err);\n\n        var modified = headers['last-modified'] ? new Date(headers['last-modified']) : new Date();\n        var responseHeaders = {\n            'Content-Type': 'application/json',\n            'Last-Modified': modified,\n            'ETag': headers.etag || (headers['content-length'] + '-' + (+modified))\n        };\n        if (headers['cache-control']) {\n            responseHeaders['Cache-Control'] = headers['cache-control'];\n        }\n\n        try {\n            grid = JSON.parse(grid);\n        } catch(jsonerr) {\n            return callback(jsonerr);\n        }\n        return callback(null, grid, responseHeaders);\n    });\n};\n\n// Inserts a grid into the S3 store. Scheme is XYZ.\nS3.prototype.putGrid = function(z, x, y, data, callback) {\n    if (!this.data.grids || !this.data.grids.length) return callback(new Error('No \"grids\" key'));\n\n    var key = url.parse(this._prepareURL(this.data.grids[0], z, x, y)).pathname.slice(1);\n    var headers = {\n        'x-amz-acl': this.acl,\n        'x-amz-server-side-encryption': this.sse,\n        'x-amz-server-side-encryption-aws-kms-key-id': this.sseKmsId,\n        'Connection': 'keep-alive',\n        'Content-Type': 'application/json'\n    };\n    this.put(key, data, headers, callback);\n};\n\n// Inserts a tile into the S3 store. Scheme is XYZ.\nS3.prototype.putTile = function(z, x, y, data, callback) {\n    if (!this.data.tiles || !this.data.tiles.length) return callback(new Error('No \"tiles\" key'));\n\n    // Don't put solid tiles beyond fillzoom.\n    if (data.key && data.key < 0 && this.data.fillzoom && z > this.data.fillzoom) {\n        this._stats.noop++;\n        return immediate(function() { callback(); });\n    }\n    var key = url.parse(this._prepareURL(this.data.tiles[0], z, x, y)).pathname.slice(1);\n    var headers = tiletype.headers(data);\n    headers['x-amz-acl'] = this.acl;\n    headers['x-amz-server-side-encryption'] = this.sse;\n    headers['x-amz-server-side-encryption-aws-kms-key-id'] = this.sseKmsId;\n    headers['Connection'] = 'keep-alive';\n    headers['Content-Length'] = data.length;\n    if (this.expires) headers['Expires'] = this.expires;\n    this.put(key, data, headers, callback);\n};\n\n// Generic PUT method for S3 keys. Handles conditional GETs and\n// retries for failed requests.\nS3.prototype.put = function(key, data, headers, callback) {\n    if (!this.client) return callback(new Error('No S3 client found'));\n    var stats = this._stats;\n    var s3 = this.client;\n    var params = {\n        Bucket: this.bucket,\n        Key: key\n    };\n\n    (function get() {\n        var attempts = 5;\n        stats.get++;\n        var req = s3.getObject(params, function(err, response) {\n            if (err) return put();\n\n            stats.txin += response.Body.length;\n            var oldmd5 = crypto.createHash('md5').update(response.Body).digest('hex');\n            var newmd5 = crypto.createHash('md5').update(data).digest('hex');\n\n            if (oldmd5 === newmd5) {\n                stats.noop++;\n                return callback();\n            }\n\n            put();\n        }).on('retry', onRetry);\n    })();\n\n    function put() {\n        if (process.env.TILELIVE_S3_DRYRUN) {\n            stats.put++;\n            stats.txout += data.length;\n            return callback();\n        }\n\n        params.Body = data;\n        params.ACL = headers['x-amz-acl'];\n        if (headers['x-amz-server-side-encryption']) params.ServerSideEncryption = headers['x-amz-server-side-encryption'];\n        if (headers['x-amz-server-side-encryption-aws-kms-key-id']) params.SSEKMSKeyId = headers['x-amz-server-side-encryption-aws-kms-key-id'];\n        params.ContentType = headers['Content-Type'];\n        if (headers['Expires']) params.Expires = headers['Expires'];\n        if (headers['Content-Encoding']) params.ContentEncoding = headers['Content-Encoding'];\n\n        s3.putObject(params, function(err, response) {\n            if (err) return callback(managedError(err, this) || err);\n\n            stats.put++;\n            stats.txout += data.length;\n            callback();\n        }).on('retry', onRetry);\n    }\n};\n\nS3.prototype.getInfo = function(callback) {\n    if (!this.data) return callback(new Error('Tilesource not loaded'));\n\n    var data = {};\n    for (var key in this.data) switch (key) {\n    // These keys are actually used.\n    case 'notFound':\n    // These keys are removed for legacy compatibility.\n    case 'awsKey':\n    case 'awsSecret':\n    case 'maxSockets':\n    case 'reportStats':\n    case 'retry':\n    case 'conditional':\n    case 'dryrun':\n        break;\n    default:\n        data[key] = this.data[key];\n        break;\n    }\n    return callback(null, data);\n};\n\n// Insert/update metadata.\nS3.prototype.putInfo = function(data, callback) {\n    return callback();\n};\n\n// Enter write mode.\nS3.prototype.startWriting = function(callback) {\n    callback = callback || function() {};\n    AWS.config.getCredentials(callback);\n};\n\n// Leave write mode.\nS3.prototype.stopWriting = function(callback) {\n    if (!process.env.TILELIVE_S3_STATS) return callback && callback();\n\n    // @TODO let tilelive or tilemill expect a stats object\n    // and process output instead.\n    console.log('\\n');\n    if (process.env.TILELIVE_S3_DRYRUN) {\n        console.log('Dryrun (no PUTs)');\n        console.log('----------------');\n    } else {\n        console.log('S3 stats');\n        console.log('--------');\n    }\n    console.log('GET:    %s', this._stats.get);\n    console.log('PUT:    %s', this._stats.put);\n    console.log('No-op:  %s', this._stats.noop);\n    console.log('TX in:  %s', this._stats.txin);\n    console.log('TX out: %s', this._stats.txout);\n    console.log('');\n    return callback && callback();\n};\n\nS3.prototype.toJSON = function() {\n    return url.format(this._uri);\n};\n\nfunction prepareURI(uri, id) {\n    var prefix = (id%256).toString(16);\n    prefix = prefix.length < 2 ? '0' + prefix : prefix;\n    uri = url.parse(uri.replace('{prefix}', prefix));\n    return uri;\n};\n\n// Implements carmen#getGeocoderData method.\nS3.prototype.getGeocoderData = function(type, shard, callback) {\n    if (!this.data) return callback(new Error('Tilesource not loaded'));\n    if (!this.data.geocoder_data) return callback();\n\n    var extname = type === 'feature' ? '.json' : '.pbf';\n    var source = this;\n\n    // Parse carmen URL.\n    try {\n        var uri = prepareURI(this.data.geocoder_data, shard);\n        uri.pathname = path.join(uri.pathname, type + '/' + shard + extname);\n        this.get(url.format(uri), function(err, zdata) {\n            if (err) {\n                err = managedError(err, this) || err;\n                if (err.statusCode === 404 || err.statusCode === 403) {\n                    return callback();\n                } else {\n                    return callback(err);\n                }\n            }\n            zlib.inflate(zdata, function(err, data) {\n                if (err) return callback(err);\n                callback(null, data);\n            })\n        });\n    } catch (err) {\n        return callback(new Error('Carmen not supported'));\n    }\n};\n\n// Implements carmen#putGeocoderData method.\nS3.prototype.putGeocoderData = function(type, shard, data, callback) {\n    if (!this.data) return callback(new Error('Tilesource not loaded'));\n\n    var source = this;\n    var ctype = 'application/x-protobuf';\n    var extname = '.pbf';\n    if (type === 'feature') {\n        ctype = 'application/json';\n        extname = '.json';\n    }\n\n    // Parse carmen URL.\n    try {\n        var uri = prepareURI(this.data.geocoder_data, shard),\n            key = path.join(uri.pathname.slice(1), type + '/' + shard + extname),\n            headers = {\n                'x-amz-acl': source.acl,\n                'x-amz-server-side-encryption': source.sse,\n                'x-amz-server-side-encryption-aws-kms-key-id': source.sseKmsId,\n                'Connection': 'keep-alive',\n                'Content-Encoding': 'deflate',\n                'Content-Type': ctype\n            };\n        zlib.deflate(data, function(err, zdata) {\n            if (err) return callback(err);\n            headers['Content-Length'] = zdata.length;\n            source.put(key, zdata, headers, callback);\n        });\n    } catch (err) {\n        return callback(new Error('Carmen not supported'));\n    }\n};\n\n// Implements carmen#getIndexableDocs method.\nS3.prototype.getIndexableDocs = function(pointer, callback) {\n    if (!this.data) return callback(new Error('Tilesource not loaded'));\n\n    pointer = pointer || {};\n    pointer.shard = pointer.shard || 0;\n\n    var shardlevel = (this.data.geocoder_shardlevel || 0) + 1;\n    var limit = Math.pow(16, shardlevel);\n\n    // All shards have been read. Done.\n    if (pointer.shard >= limit) return callback(null, [], pointer);\n\n    this.getGeocoderData('feature', pointer.shard, function(err, buffer) {\n        if (err) return callback(err);\n        var data = buffer ? JSON.parse(buffer) : {};\n        var docs = [];\n        for (var a in data) {\n            var features = JSON.parse(data[a]);\n            for (var b in features) {\n                docs.push(features[b]);\n            }\n        }\n        pointer.shard++;\n        callback(null, docs, pointer);\n    });\n};\n\n// Ensure an Expires header is set in the future at the nearest +60s\n// interval from the original Expires time.\nS3.futurize = function(expires) {\n    if (!expires) return undefined;\n    now = new Date(Math.ceil(+new Date/1e3)*1e3);\n    expires = new Date(expires);\n    if (expires > now) {\n        return expires.toUTCString();\n    } else {\n        // Add N minutes\n        var extraMinutes = Math.ceil((now - Number(expires))/60e3) * 60e3;\n        return (new Date(Number(expires) + extraMinutes)).toUTCString();\n    }\n};\n"]}