UNPKG

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
"use strict"; 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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