geotiff
Version:
GeoTIFF image decoding in JavaScript
89 lines • 3.27 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.HttpClient = void 0;
const http_1 = __importDefault(require("http"));
const https_1 = __importDefault(require("https"));
const url_1 = __importDefault(require("url"));
const base_js_1 = require("./base.js");
const utils_js_1 = require("../../utils.js");
class HttpResponse extends base_js_1.BaseResponse {
/**
* BaseResponse facade for node HTTP/HTTPS API Response
* @param {import('http').IncomingMessage} response
* @param {Promise<ArrayBuffer>} dataPromise
*/
constructor(response, dataPromise) {
super();
this.response = response;
this.dataPromise = dataPromise;
}
get status() {
return /** @type {number} */ (this.response.statusCode);
}
/**
* @param {string} name
* @returns {string|undefined}
*/
getHeader(name) {
const value = this.response.headers[name];
return Array.isArray(value) ? value.join(', ') : value;
}
async getData() {
const data = await this.dataPromise;
return data;
}
}
class HttpClient extends base_js_1.BaseClient {
/** @param {string} url */
constructor(url) {
super(url);
this.parsedUrl = url_1.default.parse(this.url);
this.httpApi = (this.parsedUrl.protocol === 'http:' ? http_1.default : https_1.default);
}
/**
* @param {Object<string, string>} headers
* @param {AbortSignal} [signal]
* @returns {Promise<HttpResponse>}
*/
constructRequest(headers, signal) {
return new Promise((resolve, reject) => {
const request = this.httpApi.get({
...this.parsedUrl,
headers,
}, (response) => {
const dataPromise = new Promise((resolveData) => {
/** @type {Uint8Array[]} */
const chunks = [];
// collect chunks
response.on('data', (chunk) => {
chunks.push(chunk);
});
// concatenate all chunks and resolve the promise with the resulting buffer
response.on('end', () => {
const data = Buffer.concat(chunks).buffer;
resolveData(data);
});
response.on('error', reject);
});
resolve(new HttpResponse(response, dataPromise));
});
request.on('error', reject);
if (signal) {
if (signal.aborted) {
request.destroy(new utils_js_1.AbortError('Request aborted'));
}
signal.addEventListener('abort', () => request.destroy(new utils_js_1.AbortError('Request aborted')));
}
});
}
async request({ headers = {}, signal = undefined } = {}) {
const response = await this.constructRequest(headers, signal);
return response;
}
}
exports.HttpClient = HttpClient;
//# sourceMappingURL=http.js.map
//# sourceMappingURL=http.js.map