{"version":3,"sources":["jsdelivr-header.js","/npm/node-webhdfs@1.0.2/src/webhdfs.js"],"names":[],"mappings":"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","file":"/npm/node-webhdfs@1.0.2/src/webhdfs.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/node-webhdfs@1.0.2/src/webhdfs.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 _ = require('lodash');\r\nvar request = require('request');\r\n\r\nvar RemoteException = exports.RemoteException = require('./remoteexception.js');\r\n\r\nvar WebHDFSClient = exports.WebHDFSClient = function (options) {\r\n\r\n    // save specified options\r\n    this.options = _.defaults(options || {}, {\r\n\r\n        user: 'webuser',\r\n        namenode_port: 50070,\r\n        namenode_host: 'localhost',\r\n        path_prefix: '/webhdfs/v1',\r\n        high_availability: false,\r\n        default_backoff_period_ms: 500\r\n    });\r\n\r\n    if (Array.isArray(this.options.namenode_list) && this.options.namenode_list.length > 1) {\r\n        this.options.high_availability = true\r\n    }\r\n\r\n    // Set up the toggles for backoff and namenode switching\r\n    this._backoff_period_ms = this.options.default_backoff_period_ms;\r\n    this._switchedNameNodeClient = false;\r\n    // save formatted base api url\r\n    this.base_url = 'http://' + this.options.namenode_host + ':' + this.options.namenode_port + this.options.path_prefix;\r\n\r\n};\r\n\r\nWebHDFSClient.prototype._makeBaseUrl = function () {\r\n    this.base_url = 'http://' + this.options.namenode_host + ':' + this.options.namenode_port + this.options.path_prefix;\r\n};\r\n\r\n// Set up a toggle to determine if the backoff needs to be increased\r\nWebHDFSClient.prototype._switchedNameNodeClient = false;\r\n\r\nWebHDFSClient.prototype._changeNameNodeHost = function (callback) {\r\n    // If the last operation resulted in a changed NameNode, double the current backoff\r\n    if (this._switchedNameNodeClient) {\r\n        this._backoff_period_ms = this._backoff_period_ms * 2;\r\n    } else {\r\n        this._switchedNameNodeClient = true;\r\n    }\r\n    // Wait the backoff period\r\n    setTimeout(() => {\r\n        var host = this.options.namenode_host;\r\n        var list = this.options.namenode_list;\r\n        var index = list.indexOf(host) + 1;\r\n        //if empty start from the beginning of the\r\n        this.options.namenode_host = list[index] ? list[index] : list[0];\r\n        this._makeBaseUrl();\r\n        return callback();\r\n    }, this._backoff_period_ms)\r\n};\r\n\r\nvar _parseResponse = exports._parseResponse = function (self, fnName, args, bodyArgs, callback, justCheckErrors){\r\n    // forward request error\r\n    return function(error, response, body) {\r\n        // If a namenode process dies the connection will be refused, and if the namenode's server\r\n        // completely dies, it will be inaccessible from this client, even if there is a successful\r\n        // failover. Assumes namenodes provided in config are actual namenodes.\r\n        if (error) {\r\n            if (error.code === 'ECONNREFUSED' || error.code === 'ENOTFOUND') {\r\n                if (self.options.high_availability){\r\n                    //change client\r\n                    self._changeNameNodeHost(function () {\r\n                        return self[fnName].apply(self, args);\r\n                    });\r\n                    return true;\r\n                }\r\n                else {\r\n                    callback(error);\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (error) {\r\n            callback(error);\r\n            return true;\r\n        }\r\n\r\n        // exception handling\r\n        if (typeof body === 'object' && 'RemoteException' in body) {\r\n            if (self.options.high_availability && body.RemoteException.exception === 'StandbyException'){\r\n                //change client\r\n                self._changeNameNodeHost(function () {\r\n                    return self[fnName].apply(self, args);\r\n                });\r\n                return true;\r\n                //change client\r\n            }\r\n            else {\r\n                callback(new RemoteException(body));\r\n                return true;\r\n            }\r\n        }\r\n        // Reset Namenode switch toggle and backoff period if the operation is successful and the\r\n        // toggle had been on\r\n        if (self._switchedNameNodeClient) {\r\n            self._switchedNameNodeClient = false;\r\n            self._backoff_period_ms = self.options.default_backoff_period_ms;\r\n        }\r\n\r\n        if (justCheckErrors) {\r\n            return false;\r\n        }\r\n        // execute callback\r\n        callback(null, _.get(body, bodyArgs, body));\r\n        return true;\r\n    }\r\n}\r\n\r\n\r\n// ref: http://hadoop.apache.org/common/docs/stable1/webhdfs.html#DELETE\r\nWebHDFSClient.prototype.del = function (path, hdfsoptions, requestoptions, callback) {\r\n\r\n    // requestoptions may be omitted\r\n    if (callback === undefined && typeof(requestoptions) === 'function') {\r\n        callback = requestoptions;\r\n        requestoptions = undefined;\r\n    }\r\n\r\n    // hdfsoptions may be omitted\r\n    if (callback === undefined && typeof(hdfsoptions) === 'function') {\r\n        callback = hdfsoptions;\r\n        hdfsoptions = undefined;\r\n    }\r\n\r\n    var self = this;\r\n    var originalArgs = [path, hdfsoptions, requestoptions, callback];\r\n    var parseResponse = _parseResponse(self, 'del', originalArgs, 'boolean', callback);\r\n\r\n    // format request args\r\n    var args = _.defaults({\r\n        json: true,\r\n        uri: this.base_url + path,\r\n        qs: _.defaults({\r\n            op: 'delete',\r\n            'user.name': this.options.user\r\n        }, hdfsoptions || {})\r\n    }, requestoptions || {});\r\n    // send http request\r\n    request.del(args, parseResponse);\r\n};\r\n\r\n\r\n// ref: http://hadoop.apache.org/common/docs/stable1/webhdfs.html#LISTSTATUS\r\nWebHDFSClient.prototype.listStatus = function (path, hdfsoptions, requestoptions, callback) {\r\n\r\n    // requestoptions may be omitted\r\n    if (callback === undefined && typeof(requestoptions) === 'function') {\r\n        callback = requestoptions;\r\n        requestoptions = undefined;\r\n    }\r\n\r\n    // hdfsoptions may be omitted\r\n    if (callback === undefined && typeof(hdfsoptions) === 'function') {\r\n        callback = hdfsoptions;\r\n        hdfsoptions = undefined;\r\n    }\r\n\r\n    var self = this;\r\n    var originalArgs = [path, hdfsoptions, requestoptions, callback];\r\n    var parseResponse = _parseResponse(self, 'listStatus', originalArgs, 'FileStatuses.FileStatus', callback);\r\n\r\n    // format request args\r\n    var args = _.defaults({\r\n        json:true,\r\n        uri: this.base_url + path,\r\n        qs: _.defaults({\r\n            op: 'liststatus'\r\n        }, hdfsoptions || {})\r\n    }, requestoptions || {});\r\n    // send http request\r\n    request.get(args, parseResponse)\r\n};\r\n\r\n\r\n// ref: http://hadoop.apache.org/common/docs/stable1/webhdfs.html#GETFILESTATUS\r\nWebHDFSClient.prototype.getFileStatus = function (path, hdfsoptions, requestoptions, callback) {\r\n\r\n    // requestoptions may be omitted\r\n    if (callback === undefined && typeof(requestoptions) === 'function') {\r\n        callback = requestoptions;\r\n        requestoptions = undefined;\r\n    }\r\n\r\n    // hdfsoptions may be omitted\r\n    if (callback === undefined && typeof(hdfsoptions) === 'function') {\r\n        callback = hdfsoptions;\r\n        hdfsoptions = undefined;\r\n    }\r\n\r\n    var self = this;\r\n    var originalArgs = [path, hdfsoptions, requestoptions, callback];\r\n    var parseResponse = _parseResponse(self, 'getFileStatus', originalArgs, 'FileStatus', callback);\r\n\r\n    // format request args\r\n    var args = _.defaults({\r\n        json: true,\r\n        uri: this.base_url + path,\r\n        qs: _.defaults({\r\n            op: 'getfilestatus'\r\n        }, hdfsoptions || {})\r\n    }, requestoptions || {});\r\n    // send http request\r\n    request.get(args, parseResponse);\r\n};\r\n\r\n\r\n// ref: http://hadoop.apache.org/common/docs/stable1/webhdfs.html#GETCONTENTSUMMARY\r\nWebHDFSClient.prototype.getContentSummary = function (path, hdfsoptions, requestoptions, callback) {\r\n\r\n    // requestoptions may be omitted\r\n    if (callback === undefined && typeof(requestoptions) === 'function') {\r\n        callback = requestoptions;\r\n        requestoptions = undefined;\r\n    }\r\n\r\n    // hdfsoptions may be omitted\r\n    if (callback===undefined && typeof(hdfsoptions) === 'function') {\r\n        callback = hdfsoptions;\r\n        hdfsoptions = undefined;\r\n    }\r\n\r\n    var self = this;\r\n    var originalArgs = [path, hdfsoptions, requestoptions, callback];\r\n    var parseResponse = _parseResponse(self, 'getContentSummary', originalArgs, 'ContentSummary', callback);\r\n\r\n    // format request args\r\n    var args = _.defaults({\r\n        json: true,\r\n        uri: this.base_url + path,\r\n        qs: _.defaults({\r\n            op: 'getcontentsummary'\r\n        }, hdfsoptions || {})\r\n    }, requestoptions || {});\r\n    // send http request\r\n    request.get(args, parseResponse);\r\n};\r\n\r\n\r\n// ref: http://hadoop.apache.org/common/docs/stable1/webhdfs.html#GETFILECHECKSUM\r\nWebHDFSClient.prototype.getFileChecksum = function (path, hdfsoptions, requestoptions, callback) {\r\n\r\n    // requestoptions may be omitted\r\n    if (callback === undefined && typeof(requestoptions) === 'function') {\r\n        callback = requestoptions;\r\n        requestoptions = undefined;\r\n    }\r\n\r\n    // hdfsoptions may be omitted\r\n    if (callback === undefined && typeof(hdfsoptions) === 'function') {\r\n        callback = hdfsoptions;\r\n        hdfsoptions = undefined;\r\n    }\r\n\r\n    var self = this;\r\n    var originalArgs = [path, hdfsoptions, requestoptions, callback];\r\n    var parseResponse = _parseResponse(self, 'getFileChecksum', originalArgs, 'FileChecksum', callback);\r\n\r\n    // format request args\r\n    var args = _.defaults({\r\n        json: true,\r\n        uri: this.base_url + path,\r\n        qs: _.defaults({\r\n            op: 'getfilechecksum'\r\n        }, hdfsoptions || {})\r\n    }, requestoptions || {});\r\n    // send http request\r\n    request.get(args, parseResponse);\r\n};\r\n\r\n\r\n// ref: http://hadoop.apache.org/common/docs/stable1/webhdfs.html#GETHOMEDIRECTORY\r\nWebHDFSClient.prototype.getHomeDirectory = function (hdfsoptions, requestoptions, callback) {\r\n\r\n    // requestoptions may be omitted\r\n    if (callback === undefined && typeof(requestoptions) === 'function') {\r\n        callback = requestoptions;\r\n        requestoptions = undefined;\r\n    }\r\n\r\n    // hdfsoptions may be omitted\r\n    if (callback===undefined && typeof(hdfsoptions) === 'function') {\r\n        callback = hdfsoptions;\r\n        hdfsoptions = undefined;\r\n    }\r\n\r\n    var self = this;\r\n    var originalArgs = [hdfsoptions, requestoptions, callback];\r\n    var parseResponse = _parseResponse(self, 'getHomeDirectory', originalArgs, 'Path', callback);\r\n\r\n    // format request args\r\n    var args = _.defaults({\r\n        json: true,\r\n        uri: this.base_url,\r\n        qs: _.defaults({\r\n            op: 'gethomedirectory',\r\n            'user.name': this.options.user\r\n        }, hdfsoptions || {})\r\n    }, requestoptions || {});\r\n    // send http request\r\n    request.get(args, parseResponse);\r\n};\r\n\r\n// ref: http://hadoop.apache.org/common/docs/stable1/webhdfs.html#OPEN\r\nWebHDFSClient.prototype.open = function (path, hdfsoptions, requestoptions, callback) {\r\n\r\n    // requestoptions may be omitted\r\n    if (callback === undefined && typeof(requestoptions) === 'function') {\r\n        callback = requestoptions;\r\n        requestoptions = undefined;\r\n    }\r\n\r\n    // hdfsoptions may be omitted\r\n    if (callback === undefined && typeof(hdfsoptions) === 'function') {\r\n        callback = hdfsoptions;\r\n        hdfsoptions = undefined;\r\n    }\r\n\r\n    var self = this;\r\n    var originalArgs = [path, hdfsoptions, requestoptions, callback];\r\n    var parseResponse = _parseResponse(self, 'open', originalArgs, null, callback);\r\n    // format request args\r\n    var args = _.defaults({\r\n        json: true,\r\n        uri: this.base_url + path,\r\n        qs: _.defaults({\r\n            op: 'open'\r\n        }, hdfsoptions || {})\r\n    }, requestoptions || {});\r\n    // send http request\r\n    return request.get(args, parseResponse);\r\n};\r\n\r\n\r\n// ref: http://hadoop.apache.org/common/docs/stable1/webhdfs.html#RENAME\r\nWebHDFSClient.prototype.rename = function (path, destination, hdfsoptions, requestoptions, callback) {\r\n\r\n    // requestoptions may be omitted\r\n    if (callback === undefined && typeof(requestoptions) === 'function') {\r\n        callback = requestoptions;\r\n        requestoptions = undefined;\r\n    }\r\n\r\n    // hdfsoptions may be omitted\r\n    if (callback === undefined && typeof(hdfsoptions) === 'function') {\r\n        callback = hdfsoptions;\r\n        hdfsoptions = undefined;\r\n    }\r\n\r\n    var self = this;\r\n    var originalArgs = [path, hdfsoptions, requestoptions, callback];\r\n    var parseResponse = _parseResponse(self, 'rename', originalArgs, 'boolean', callback);\r\n\r\n    // format request args\r\n    var args = _.defaults({\r\n        json: true,\r\n        uri: this.base_url + path,\r\n        qs: _.defaults({\r\n            op: 'rename',\r\n            destination: destination,\r\n            'user.name': this.options.user\r\n        }, hdfsoptions || {})\r\n    }, requestoptions || {});\r\n    // send http request\r\n    request.put(args, parseResponse);\r\n};\r\n\r\n\r\n// ref: http://hadoop.apache.org/common/docs/stable1/webhdfs.html#MKDIRS\r\nWebHDFSClient.prototype.mkdirs = function (path, hdfsoptions, requestoptions, callback) {\r\n\r\n    // requestoptions may be omitted\r\n    if (callback === undefined && typeof(requestoptions) === 'function') {\r\n        callback = requestoptions;\r\n        requestoptions = undefined;\r\n    }\r\n\r\n    // hdfsoptions may be omitted\r\n    if (callback === undefined && typeof(hdfsoptions) === 'function') {\r\n        callback = hdfsoptions;\r\n        hdfsoptions = undefined;\r\n    }\r\n\r\n    var self = this;\r\n    var originalArgs = [path, hdfsoptions, requestoptions, callback];\r\n    var parseResponse = _parseResponse(self, 'mkdirs', originalArgs, 'boolean', callback);\r\n\r\n    // generate query string\r\n    var args = _.defaults({\r\n        json: true,\r\n        uri: this.base_url + path,\r\n        qs: _.defaults({\r\n            op: 'mkdirs',\r\n            'user.name': this.options.user\r\n        }, hdfsoptions || {})\r\n    }, requestoptions || {});\r\n    // send http request\r\n    request.put(args, parseResponse);\r\n};\r\n\r\n\r\n// ref: http://hadoop.apache.org/common/docs/stable1/webhdfs.html#APPEND\r\nWebHDFSClient.prototype.append = function (path, data, hdfsoptions, requestoptions, callback) {\r\n\r\n    // requestoptions may be omitted\r\n    if (callback === undefined && typeof(requestoptions) === 'function') {\r\n        callback = requestoptions;\r\n        requestoptions = undefined;\r\n    }\r\n\r\n    // hdfsoptions may be omitted\r\n    if (callback === undefined && typeof(hdfsoptions) === 'function') {\r\n        callback = hdfsoptions;\r\n        hdfsoptions = undefined;\r\n    }\r\n\r\n    var self = this;\r\n    var originalArgs = [path, hdfsoptions, requestoptions, callback];\r\n    var parseResponse = _parseResponse(self, 'append', originalArgs, null, callback, true);\r\n\r\n    // format request args\r\n    var args = _.defaults({\r\n        json: true,\r\n        followRedirect: false,\r\n        uri: this.base_url + path,\r\n        qs: _.defaults({\r\n            op: 'append',\r\n            'user.name': this.options.user\r\n        }, hdfsoptions || {})\r\n    }, requestoptions || {});\r\n\r\n    // send http request\r\n    request.post(args, function (error, response, body) {\r\n       var handled = parseResponse(error, response, body);\r\n       if (handled) {\r\n           // callback already called\r\n           return;\r\n       }\r\n       // check for HDFS server unreachable\r\n       else if (! response) {\r\n           return callback(new Error('no response'));\r\n       }\r\n       // check for expected redirect\r\n       else if (response.statusCode == 307) {\r\n            // format request args\r\n            args = _.defaults({\r\n                body: data,\r\n                uri: response.headers.location\r\n            }, requestoptions || {});\r\n\r\n            // send http request\r\n            request.post(args, function (error, response, body) {\r\n                // forward request error\r\n                var handled = parseResponse(error, response, body);\r\n                if (handled) {\r\n                    return;\r\n                }\r\n                // check for expected response\r\n                if (response && response.statusCode == 200) {\r\n                    return callback(null, true);\r\n                } else {\r\n                    return callback(new Error('expected http 200: ' + response ? response.body : response));\r\n                }\r\n            });\r\n        } else {\r\n            return callback(new Error('expected redirect'));\r\n        }\r\n    });\r\n};\r\n\r\n\r\n// ref: http://hadoop.apache.org/common/docs/stable1/webhdfs.html#CREATE\r\nWebHDFSClient.prototype.create = function (path, data, hdfsoptions, requestoptions, callback) {\r\n\r\n    // requestoptions may be omitted\r\n    if (callback === undefined && typeof(requestoptions) === 'function') {\r\n        callback = requestoptions;\r\n        requestoptions = undefined;\r\n    }\r\n\r\n    // hdfsoptions may be omitted\r\n    if (callback === undefined && typeof(hdfsoptions) === 'function') {\r\n        callback = hdfsoptions;\r\n        hdfsoptions = undefined;\r\n    }\r\n\r\n    var self = this;\r\n    var originalArgs = [path, hdfsoptions, requestoptions, callback];\r\n    var parseResponse = _parseResponse(self, 'create', originalArgs, null, callback, true);\r\n\r\n    // generate query string\r\n    var args = _.defaults({\r\n        json: true,\r\n        followRedirect: false,\r\n        uri: this.base_url + path,\r\n        qs: _.defaults({\r\n            op: 'create',\r\n            'user.name': this.options.user\r\n        }, hdfsoptions || {})\r\n    }, requestoptions || {});\r\n\r\n    // send http request\r\n    request.put(args, function (error, response, body) {\r\n        // forward request error\r\n        parseResponse(error, response, body);\r\n        if (error) {\r\n            // callback already called\r\n            return;\r\n        }\r\n        // check for HDFS server unreachable\r\n        else if (! response) {\r\n            return callback(new Error('expected response for HDFS'));\r\n        }\r\n        // check for expected redirect\r\n        else if (response.statusCode == 307) {\r\n            // generate query string\r\n            args = _.defaults({\r\n                body: data,\r\n                uri: response.headers.location\r\n            }, requestoptions || {});\r\n\r\n            // send http request\r\n            request.put(args, function (error, response, body) {\r\n                // forward request error\r\n                parseResponse(error, response, body);\r\n                if (error) {\r\n                    return;\r\n                }\r\n                // check for expected created response\r\n                if (response && response.statusCode == 201) {\r\n                    // execute callback\r\n                    return callback(null, response.headers.location);\r\n                } else {\r\n                    return callback(new Error('expected http 201 created'));\r\n                }\r\n            });\r\n        } else {\r\n            return callback(new Error('expected redirect'));\r\n        }\r\n    });\r\n};\r\n"]}