kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
160 lines (155 loc) • 18 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getDuckDB = exports.DEBUG = void 0;
exports.initializeDuckDb = initializeDuckDb;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _duckdbWasm = _interopRequireWildcard(require("@duckdb/duckdb-wasm"));
var duckdb = _duckdbWasm;
var _perf = require("./utils/perf");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
// SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
// git@github.com:holdenmatt/duckdb-wasm-kit.git
var DEBUG;
var DuckDB;
/**
* Initialize DuckDB, ensuring we only initialize it once.
*
* @param debug If true, log DuckDB logs and elapsed times to the console.
* @param config An optional DuckDBConfig object.
*/
function initializeDuckDb(_x) {
return _initializeDuckDb2.apply(this, arguments);
}
/**
* Initialize DuckDB with a browser-specific Wasm bundle.
*/
function _initializeDuckDb2() {
_initializeDuckDb2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(options) {
var _ref3, _ref3$debug, debug, config;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
_ref3 = options || {}, _ref3$debug = _ref3.debug, debug = _ref3$debug === void 0 ? false : _ref3$debug, config = _ref3.config;
exports.DEBUG = DEBUG = debug;
if (DuckDB === undefined) {
DuckDB = _initializeDuckDb(config);
}
return _context3.abrupt("return", DuckDB);
case 4:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return _initializeDuckDb2.apply(this, arguments);
}
var _initializeDuckDb = /*#__PURE__*/function () {
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(config) {
var start, JSDELIVR_BUNDLES, bundle, worker_url, worker, logger, db, res, buffer, fileNameMatch;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
start = performance.now(); // Select a bundle based on browser checks
JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles();
_context.next = 4;
return duckdb.selectBundle(JSDELIVR_BUNDLES);
case 4:
bundle = _context.sent;
if (bundle.mainWorker) {
_context.next = 7;
break;
}
throw new Error('Failed to initialize DuckDB');
case 7:
worker_url = URL.createObjectURL(new Blob(["importScripts(\"".concat(bundle.mainWorker, "\");")], {
type: 'text/javascript'
})); // Instantiate the async version of DuckDB-wasm
worker = new Worker(worker_url);
logger = DEBUG ? new duckdb.ConsoleLogger() : new duckdb.VoidLogger();
db = new _duckdbWasm.AsyncDuckDB(logger, worker);
_context.next = 13;
return db.instantiate(bundle.mainModule, bundle.pthreadWorker);
case 13:
URL.revokeObjectURL(worker_url);
if (!config) {
_context.next = 28;
break;
}
if (!config.path) {
_context.next = 26;
break;
}
_context.next = 18;
return fetch(config.path);
case 18:
res = _context.sent;
_context.next = 21;
return res.arrayBuffer();
case 21:
buffer = _context.sent;
fileNameMatch = config.path.match(/[^/]*$/);
if (fileNameMatch) {
config.path = fileNameMatch[0];
}
_context.next = 26;
return db.registerFileBuffer(config.path, new Uint8Array(buffer));
case 26:
_context.next = 28;
return db.open(config);
case 28:
if (DEBUG) {
(0, _perf.logElapsedTime)('DuckDB initialized', start);
if (config) {
console.debug("DuckDbConfig: ".concat(JSON.stringify(config, null, 2)));
}
}
return _context.abrupt("return", db);
case 30:
case "end":
return _context.stop();
}
}, _callee);
}));
return function _initializeDuckDb(_x2) {
return _ref.apply(this, arguments);
};
}();
/**
* Get the instance of DuckDB, initializing it if needed.
*
* Typically `useDuckDB` is used in React components instead, but this
* method provides access outside of React contexts.
*/
var getDuckDB = exports.getDuckDB = /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
if (!DuckDB) {
_context2.next = 4;
break;
}
return _context2.abrupt("return", DuckDB);
case 4:
_context2.next = 6;
return initializeDuckDb();
case 6:
return _context2.abrupt("return", _context2.sent);
case 7:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return function getDuckDB() {
return _ref2.apply(this, arguments);
};
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZHVja2RiV2FzbSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsImR1Y2tkYiIsIl9wZXJmIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiREVCVUciLCJEdWNrREIiLCJpbml0aWFsaXplRHVja0RiIiwiX3giLCJfaW5pdGlhbGl6ZUR1Y2tEYjIiLCJhcHBseSIsImFyZ3VtZW50cyIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlMyIsIm9wdGlvbnMiLCJfcmVmMyIsIl9yZWYzJGRlYnVnIiwiZGVidWciLCJjb25maWciLCJ3cmFwIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwicHJldiIsIm5leHQiLCJleHBvcnRzIiwidW5kZWZpbmVkIiwiX2luaXRpYWxpemVEdWNrRGIiLCJhYnJ1cHQiLCJzdG9wIiwiX3JlZiIsIl9jYWxsZWUiLCJzdGFydCIsIkpTREVMSVZSX0JVTkRMRVMiLCJidW5kbGUiLCJ3b3JrZXJfdXJsIiwid29ya2VyIiwibG9nZ2VyIiwiZGIiLCJyZXMiLCJidWZmZXIiLCJmaWxlTmFtZU1hdGNoIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInBlcmZvcm1hbmNlIiwibm93IiwiZ2V0SnNEZWxpdnJCdW5kbGVzIiwic2VsZWN0QnVuZGxlIiwic2VudCIsIm1haW5Xb3JrZXIiLCJFcnJvciIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJjb25jYXQiLCJ0eXBlIiwiV29ya2VyIiwiQ29uc29sZUxvZ2dlciIsIlZvaWRMb2dnZXIiLCJBc3luY0R1Y2tEQiIsImluc3RhbnRpYXRlIiwibWFpbk1vZHVsZSIsInB0aHJlYWRXb3JrZXIiLCJyZXZva2VPYmplY3RVUkwiLCJwYXRoIiwiZmV0Y2giLCJhcnJheUJ1ZmZlciIsIm1hdGNoIiwicmVnaXN0ZXJGaWxlQnVmZmVyIiwiVWludDhBcnJheSIsIm9wZW4iLCJsb2dFbGFwc2VkVGltZSIsImNvbnNvbGUiLCJKU09OIiwic3RyaW5naWZ5IiwiX3gyIiwiZ2V0RHVja0RCIiwiX3JlZjIiLCJfY2FsbGVlMiIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9pbml0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIGdpdEBnaXRodWIuY29tOmhvbGRlbm1hdHQvZHVja2RiLXdhc20ta2l0LmdpdFxuaW1wb3J0ICogYXMgZHVja2RiIGZyb20gJ0BkdWNrZGIvZHVja2RiLXdhc20nO1xuaW1wb3J0IHtBc3luY0R1Y2tEQiwgRHVja0RCQ29uZmlnfSBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcbmltcG9ydCB7bG9nRWxhcHNlZFRpbWV9IGZyb20gJy4vdXRpbHMvcGVyZic7XG5cbmV4cG9ydCBsZXQgREVCVUc6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbmxldCBEdWNrREI6IFByb21pc2U8QXN5bmNEdWNrREI+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEluaXRpYWxpemUgRHVja0RCLCBlbnN1cmluZyB3ZSBvbmx5IGluaXRpYWxpemUgaXQgb25jZS5cbiAqXG4gKiBAcGFyYW0gZGVidWcgSWYgdHJ1ZSwgbG9nIER1Y2tEQiBsb2dzIGFuZCBlbGFwc2VkIHRpbWVzIHRvIHRoZSBjb25zb2xlLlxuICogQHBhcmFtIGNvbmZpZyBBbiBvcHRpb25hbCBEdWNrREJDb25maWcgb2JqZWN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUR1Y2tEYihvcHRpb25zPzoge1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIGNvbmZpZz86IER1Y2tEQkNvbmZpZztcbn0pOiBQcm9taXNlPEFzeW5jRHVja0RCPiB7XG4gIGNvbnN0IHtkZWJ1ZyA9IGZhbHNlLCBjb25maWd9ID0gb3B0aW9ucyB8fCB7fTtcbiAgREVCVUcgPSBkZWJ1ZztcblxuICBpZiAoRHVja0RCID09PSB1bmRlZmluZWQpIHtcbiAgICBEdWNrREIgPSBfaW5pdGlhbGl6ZUR1Y2tEYihjb25maWcpO1xuICB9XG4gIHJldHVybiBEdWNrREI7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBEdWNrREIgd2l0aCBhIGJyb3dzZXItc3BlY2lmaWMgV2FzbSBidW5kbGUuXG4gKi9cbmNvbnN0IF9pbml0aWFsaXplRHVja0RiID0gYXN5bmMgKGNvbmZpZz86IER1Y2tEQkNvbmZpZyk6IFByb21pc2U8QXN5bmNEdWNrREI+ID0+IHtcbiAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAvLyBTZWxlY3QgYSBidW5kbGUgYmFzZWQgb24gYnJvd3NlciBjaGVja3NcbiAgY29uc3QgSlNERUxJVlJfQlVORExFUyA9IGR1Y2tkYi5nZXRKc0RlbGl2ckJ1bmRsZXMoKTtcbiAgY29uc3QgYnVuZGxlID0gYXdhaXQgZHVja2RiLnNlbGVjdEJ1bmRsZShKU0RFTElWUl9CVU5ETEVTKTtcbiAgaWYgKCFidW5kbGUubWFpbldvcmtlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgRHVja0RCJyk7XG4gIH1cblxuICBjb25zdCB3b3JrZXJfdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChcbiAgICBuZXcgQmxvYihbYGltcG9ydFNjcmlwdHMoXCIke2J1bmRsZS5tYWluV29ya2VyfVwiKTtgXSwge1xuICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCdcbiAgICB9KVxuICApO1xuXG4gIC8vIEluc3RhbnRpYXRlIHRoZSBhc3luYyB2ZXJzaW9uIG9mIER1Y2tEQi13YXNtXG4gIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyX3VybCk7XG4gIGNvbnN0IGxvZ2dlciA9IERFQlVHID8gbmV3IGR1Y2tkYi5Db25zb2xlTG9nZ2VyKCkgOiBuZXcgZHVja2RiLlZvaWRMb2dnZXIoKTtcbiAgY29uc3QgZGIgPSBuZXcgQXN5bmNEdWNrREIobG9nZ2VyLCB3b3JrZXIpO1xuICBhd2FpdCBkYi5pbnN0YW50aWF0ZShidW5kbGUubWFpbk1vZHVsZSwgYnVuZGxlLnB0aHJlYWRXb3JrZXIpO1xuICBVUkwucmV2b2tlT2JqZWN0VVJMKHdvcmtlcl91cmwpO1xuXG4gIGlmIChjb25maWcpIHtcbiAgICBpZiAoY29uZmlnLnBhdGgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGNvbmZpZy5wYXRoKTtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpO1xuICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbmZpZy5wYXRoLm1hdGNoKC9bXi9dKiQvKTtcbiAgICAgIGlmIChmaWxlTmFtZU1hdGNoKSB7XG4gICAgICAgIGNvbmZpZy5wYXRoID0gZmlsZU5hbWVNYXRjaFswXTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZUJ1ZmZlcihjb25maWcucGF0aCwgbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgfVxuICAgIGF3YWl0IGRiLm9wZW4oY29uZmlnKTtcbiAgfVxuXG4gIGlmIChERUJVRykge1xuICAgIGxvZ0VsYXBzZWRUaW1lKCdEdWNrREIgaW5pdGlhbGl6ZWQnLCBzdGFydCk7XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhgRHVja0RiQ29uZmlnOiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMil9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkYjtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBpbnN0YW5jZSBvZiBEdWNrREIsIGluaXRpYWxpemluZyBpdCBpZiBuZWVkZWQuXG4gKlxuICogVHlwaWNhbGx5IGB1c2VEdWNrREJgIGlzIHVzZWQgaW4gUmVhY3QgY29tcG9uZW50cyBpbnN0ZWFkLCBidXQgdGhpc1xuICogbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyBvdXRzaWRlIG9mIFJlYWN0IGNvbnRleHRzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RHVja0RCID0gYXN5bmMgKCk6IFByb21pc2U8QXN5bmNEdWNrREI+ID0+IHtcbiAgaWYgKER1Y2tEQikge1xuICAgIHJldHVybiBEdWNrREI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGF3YWl0IGluaXRpYWxpemVEdWNrRGIoKTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFJQSxJQUFBQSxXQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFBOEMsSUFBQUMsTUFBQSxHQUFBSCxXQUFBO0FBRTlDLElBQUFJLEtBQUEsR0FBQUYsT0FBQTtBQUE0QyxTQUFBRyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUwsd0JBQUFLLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdB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
;