1 | ;
|
2 |
|
3 | var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
4 |
|
5 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6 |
|
7 | var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {
|
8 | return new (P || (P = Promise))(function (resolve, reject) {
|
9 | function fulfilled(value) {
|
10 | try {
|
11 | step(generator.next(value));
|
12 | } catch (e) {
|
13 | reject(e);
|
14 | }
|
15 | }
|
16 | function rejected(value) {
|
17 | try {
|
18 | step(generator.throw(value));
|
19 | } catch (e) {
|
20 | reject(e);
|
21 | }
|
22 | }
|
23 | function step(result) {
|
24 | result.done ? resolve(result.value) : new P(function (resolve) {
|
25 | resolve(result.value);
|
26 | }).then(fulfilled, rejected);
|
27 | }
|
28 | step((generator = generator.apply(thisArg, _arguments)).next());
|
29 | });
|
30 | };
|
31 | var dexie_1 = require('dexie');
|
32 | var typestore_1 = require('typestore');
|
33 | var IndexedDBRepoPlugin_1 = require("./IndexedDBRepoPlugin");
|
34 | var log = typestore_1.Log.create(__filename);
|
35 | /**
|
36 | * Default options
|
37 | */
|
38 | exports.LocalStorageOptionDefaults = {
|
39 | databaseName: 'typestore-db',
|
40 | version: 1
|
41 | };
|
42 | /**
|
43 | * Uses dexie under the covers - its a mature library - and i'm lazy
|
44 | */
|
45 |
|
46 | var IndexedDBPlugin = function () {
|
47 | function IndexedDBPlugin() {
|
48 | var opts = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
|
49 |
|
50 | _classCallCheck(this, IndexedDBPlugin);
|
51 |
|
52 | this.opts = opts;
|
53 | this.type = typestore_1.PluginType.Store;
|
54 | this.repoPlugins = {};
|
55 | this.opts = Object.assign({}, exports.LocalStorageOptionDefaults, opts);
|
56 |
|
57 | for (var _len = arguments.length, supportedModels = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
58 | supportedModels[_key - 1] = arguments[_key];
|
59 | }
|
60 |
|
61 | this.supportedModels = supportedModels;
|
62 | }
|
63 |
|
64 | _createClass(IndexedDBPlugin, [{
|
65 | key: 'newDexie',
|
66 | value: function newDexie() {
|
67 | return new dexie_1.default(this.opts.databaseName, this.opts.provider);
|
68 | }
|
69 | }, {
|
70 | key: 'open',
|
71 | value: function open() {
|
72 | this.internalDb = this.newDexie();
|
73 | return this.internalDb;
|
74 | }
|
75 | }, {
|
76 | key: 'handle',
|
77 | value: function handle(eventType) {
|
78 | switch (eventType) {
|
79 | case typestore_1.PluginEventType.RepoInit:
|
80 | return typestore_1.repoAttachIfSupported(arguments.length <= 1 ? undefined : arguments[1], this);
|
81 | }
|
82 | return false;
|
83 | }
|
84 | }, {
|
85 | key: 'table',
|
86 | value: function table(modelType) {
|
87 | var table = this.tables[modelType.name];
|
88 | if (!table) throw new Error('Unable to find a table definition for ' + modelType.name);
|
89 | return table;
|
90 | }
|
91 | }, {
|
92 | key: 'init',
|
93 | value: function init(coordinator, opts) {
|
94 | return __awaiter(this, void 0, void 0, regeneratorRuntime.mark(function _callee() {
|
95 | return regeneratorRuntime.wrap(function _callee$(_context) {
|
96 | while (1) {
|
97 | switch (_context.prev = _context.next) {
|
98 | case 0:
|
99 | this.coordinator = coordinator;
|
100 | return _context.abrupt('return', coordinator);
|
101 |
|
102 | case 2:
|
103 | case 'end':
|
104 | return _context.stop();
|
105 | }
|
106 | }
|
107 | }, _callee, this);
|
108 | }));
|
109 | }
|
110 | }, {
|
111 | key: 'start',
|
112 | value: function start() {
|
113 | return __awaiter(this, void 0, void 0, regeneratorRuntime.mark(function _callee2() {
|
114 | var _this = this;
|
115 |
|
116 | var models, schemaAttrNameMap, schema,
|
117 | // Check for an existing database, version, schema
|
118 | version;
|
119 | return regeneratorRuntime.wrap(function _callee2$(_context2) {
|
120 | while (1) {
|
121 | switch (_context2.prev = _context2.next) {
|
122 | case 0:
|
123 | models = this.coordinator.getModels();
|
124 | // 1. Create the current schema config
|
125 | // TODO: Should only use indexed attributes for schema
|
126 |
|
127 | schemaAttrNameMap = {};
|
128 | schema = models.reduce(function (newSchema, modelType) {
|
129 | // Get all the known attributes for the table
|
130 | var attrs = modelType.options.attrs.filter(function (attr) {
|
131 | return !attr.transient;
|
132 | });
|
133 | schemaAttrNameMap[modelType.name] = attrs.map(function (attr) {
|
134 | return attr.name;
|
135 | });
|
136 | var attrDescs = attrs.map(function (attr) {
|
137 | var index = attr.index;
|
138 | var name = attr.name;
|
139 | var primaryKey = attr.primaryKey;
|
140 | var isArray = attr.isArray;var unique = primaryKey || index && index.unique;var prefix = unique ? '&' : isArray ? '*' : '';
|
141 | return '' + prefix + name;
|
142 | });
|
143 | // Added the attribute descriptor to the new schema
|
144 | newSchema[modelType.name] = attrDescs.join(',');
|
145 | log.debug('Created schema for ' + modelType.name, newSchema[modelType.name]);
|
146 | return newSchema;
|
147 | }, {});
|
148 | version = this.opts.version;
|
149 | _context2.next = 6;
|
150 | return new Promise(function (resolve, reject) {
|
151 | var db = _this.newDexie();
|
152 | db.open().then(function () {
|
153 | log.info('Opened existing database', db.name, ' with existing version ', db.verno);
|
154 | var tables = db.tables,
|
155 | tableNames = tables.map(function (table) {
|
156 | return table.name;
|
157 | }),
|
158 | newTableNames = Object.keys(schema),
|
159 |
|
160 | // New table defined
|
161 | newTable = !newTableNames.every(function (tableName) {
|
162 | return tableNames.includes(tableName);
|
163 | }),
|
164 |
|
165 | // Table removed??
|
166 | removedTable = !tableNames.every(function (tableName) {
|
167 | return newTableNames.includes(tableName);
|
168 | });
|
169 | var attrChanged = false;
|
170 | // If no new tables then check indexes
|
171 | if (!newTable && !removedTable) {
|
172 | var _iteratorNormalCompletion = true;
|
173 | var _didIteratorError = false;
|
174 | var _iteratorError = undefined;
|
175 |
|
176 | try {
|
177 | var _loop = function _loop() {
|
178 | var table = _step.value;
|
179 | var newAttrNames = schemaAttrNameMap[table.name];var _table$schema = table.schema;
|
180 | var indexes = _table$schema.indexes;
|
181 | var primKey = _table$schema.primKey;var oldAttrNames = indexes.map(function (index) {
|
182 | return index.name;
|
183 | }).concat([primKey.name]);
|
184 | if (newAttrNames.length !== oldAttrNames.length || !oldAttrNames.every(function (attrName) {
|
185 | return newAttrNames.includes(attrName);
|
186 | })) {
|
187 | log.info('Attributes have changed on table, bumping version. New attrs ', newAttrNames, ' old attr names ', oldAttrNames);
|
188 | attrChanged = true;
|
189 | return 'break';
|
190 | }
|
191 | };
|
192 |
|
193 | for (var _iterator = tables[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
194 | var _ret = _loop();
|
195 |
|
196 | if (_ret === 'break') break;
|
197 | }
|
198 | } catch (err) {
|
199 | _didIteratorError = true;
|
200 | _iteratorError = err;
|
201 | } finally {
|
202 | try {
|
203 | if (!_iteratorNormalCompletion && _iterator.return) {
|
204 | _iterator.return();
|
205 | }
|
206 | } finally {
|
207 | if (_didIteratorError) {
|
208 | throw _iteratorError;
|
209 | }
|
210 | }
|
211 | }
|
212 | }
|
213 | if (attrChanged || newTable || removedTable) {
|
214 | log.info('Schema changes detected, bumping version, everntually auto-upgrade', attrChanged, newTable, removedTable);
|
215 | version = db.verno + 1;
|
216 | }
|
217 | log.debug('Closing db check');
|
218 | db.close();
|
219 | resolve(true);
|
220 | }).catch('NoSuchDatabaseError', function (e) {
|
221 | log.info('Database does not exist, creating: ', _this.opts.databaseName);
|
222 | resolve(false);
|
223 | }).catch(function (e) {
|
224 | log.error("Unknown error", e);
|
225 | reject(e);
|
226 | });
|
227 | });
|
228 |
|
229 | case 6:
|
230 | // Table needs to be created
|
231 | log.debug('Creating schema', schema);
|
232 | this.open().version(version).stores(schema);
|
233 | _context2.next = 10;
|
234 | return new Promise(function (resolve, reject) {
|
235 | _this.internalDb.open().then(resolve).catch(reject);
|
236 | });
|
237 |
|
238 | case 10:
|
239 | this.tables = models.reduce(function (newTables, modelType) {
|
240 | newTables[modelType.name] = _this.internalDb.table(modelType.name);
|
241 | return newTables;
|
242 | }, {});
|
243 | log.debug('IndexedDB store is ready');
|
244 | return _context2.abrupt('return', this.coordinator);
|
245 |
|
246 | case 13:
|
247 | case 'end':
|
248 | return _context2.stop();
|
249 | }
|
250 | }
|
251 | }, _callee2, this);
|
252 | }));
|
253 | }
|
254 | }, {
|
255 | key: 'stop',
|
256 | value: function stop() {
|
257 | return __awaiter(this, void 0, void 0, regeneratorRuntime.mark(function _callee3() {
|
258 | return regeneratorRuntime.wrap(function _callee3$(_context3) {
|
259 | while (1) {
|
260 | switch (_context3.prev = _context3.next) {
|
261 | case 0:
|
262 | if (!this.internalDb) {
|
263 | _context3.next = 3;
|
264 | break;
|
265 | }
|
266 |
|
267 | _context3.next = 3;
|
268 | return this.internalDb.close();
|
269 |
|
270 | case 3:
|
271 | return _context3.abrupt('return', this.coordinator);
|
272 |
|
273 | case 4:
|
274 | case 'end':
|
275 | return _context3.stop();
|
276 | }
|
277 | }
|
278 | }, _callee3, this);
|
279 | }));
|
280 | }
|
281 | }, {
|
282 | key: 'syncModels',
|
283 | value: function syncModels() {
|
284 | log.debug('Currently the localstorage plugin does not sync models');
|
285 | return Promise.resolve(this.coordinator);
|
286 | }
|
287 | /**
|
288 | * Initialize a new repo
|
289 | * TODO: verify this logic works - just reading it makes me think we could be
|
290 | * asked to init a repo a second time with the same type and do nothing
|
291 | *
|
292 | * @param repo
|
293 | * @returns {T}
|
294 | */
|
295 |
|
296 | }, {
|
297 | key: 'initRepo',
|
298 | value: function initRepo(repo) {
|
299 | var plugin = this.repoPlugins[repo.modelType.name];
|
300 | if (plugin) return plugin.repo;
|
301 | plugin = new IndexedDBRepoPlugin_1.IndexedDBRepoPlugin(this, repo);
|
302 | return plugin.repo;
|
303 | }
|
304 | }, {
|
305 | key: 'db',
|
306 | get: function get() {
|
307 | return this.internalDb;
|
308 | }
|
309 | }]);
|
310 |
|
311 | return IndexedDBPlugin;
|
312 | }();
|
313 |
|
314 | exports.IndexedDBPlugin = IndexedDBPlugin;
|
315 | //# sourceMappingURL=data:application/json;base64,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O0FBQUEsa0VBRzVCLEtBQUssV0FIdUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBaEMsRUFBUDtBQUtIOzs7cUNBQ1k7QUFDVCxnQkFBSSxLQUFKLENBQVUsd0RBQVY7QUFDQSxtQkFBTyxRQUFRLE9BQVIsQ0FBZ0IsS0FBSyxXQUFyQixDQUFQO0FBQ0g7Ozs7Ozs7Ozs7OztpQ0FTUSxJLEVBQU07QUFDWCxnQkFBSSxTQUFTLEtBQUssV0FBTCxDQUFpQixLQUFLLFNBQUwsQ0FBZSxJQUFoQyxDQUFiO0FBQ0EsZ0JBQUksTUFBSixFQUNJLE9BQU8sT0FBTyxJQUFkO0FBQ0oscUJBQVMsSUFBSSxzQkFBc0IsbUJBQTFCLENBQThDLElBQTlDLEVBQW9ELElBQXBELENBQVQ7QUFDQSxtQkFBTyxPQUFPLElBQWQ7QUFDSDs7OzRCQTVIUTtBQUNMLG1CQUFPLEtBQUssVUFBWjtBQUNIOzs7Ozs7QUE0SEwsUUFBUSxlQUFSLEdBQTBCLGVBQTFCIiwiZmlsZSI6IkluZGV4ZWREQlBsdWdpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IudGhyb3codmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cykpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuY29uc3QgZGV4aWVfMSA9IHJlcXVpcmUoJ2RleGllJyk7XG5jb25zdCB0eXBlc3RvcmVfMSA9IHJlcXVpcmUoJ3R5cGVzdG9yZScpO1xuY29uc3QgSW5kZXhlZERCUmVwb1BsdWdpbl8xID0gcmVxdWlyZShcIi4vSW5kZXhlZERCUmVwb1BsdWdpblwiKTtcbmNvbnN0IGxvZyA9IHR5cGVzdG9yZV8xLkxvZy5jcmVhdGUoX19maWxlbmFtZSk7XG4vKipcbiAqIERlZmF1bHQgb3B0aW9uc1xuICovXG5leHBvcnRzLkxvY2FsU3RvcmFnZU9wdGlvbkRlZmF1bHRzID0ge1xuICAgIGRhdGFiYXNlTmFtZTogJ3R5cGVzdG9yZS1kYicsXG4gICAgdmVyc2lvbjogMVxufTtcbi8qKlxuICogVXNlcyBkZXhpZSB1bmRlciB0aGUgY292ZXJzIC0gaXRzIGEgbWF0dXJlIGxpYnJhcnkgLSBhbmQgaSdtIGxhenlcbiAqL1xuY2xhc3MgSW5kZXhlZERCUGx1Z2luIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30sIC4uLnN1cHBvcnRlZE1vZGVscykge1xuICAgICAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlc3RvcmVfMS5QbHVnaW5UeXBlLlN0b3JlO1xuICAgICAgICB0aGlzLnJlcG9QbHVnaW5zID0ge307XG4gICAgICAgIHRoaXMub3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIGV4cG9ydHMuTG9jYWxTdG9yYWdlT3B0aW9uRGVmYXVsdHMsIG9wdHMpO1xuICAgICAgICB0aGlzLnN1cHBvcnRlZE1vZGVscyA9IHN1cHBvcnRlZE1vZGVscztcbiAgICB9XG4gICAgbmV3RGV4aWUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgZGV4aWVfMS5kZWZhdWx0KHRoaXMub3B0cy5kYXRhYmFzZU5hbWUsIHRoaXMub3B0cy5wcm92aWRlcik7XG4gICAgfVxuICAgIG9wZW4oKSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxEYiA9IHRoaXMubmV3RGV4aWUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxEYjtcbiAgICB9XG4gICAgZ2V0IGRiKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbERiO1xuICAgIH1cbiAgICBoYW5kbGUoZXZlbnRUeXBlLCAuLi5hcmdzKSB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIHR5cGVzdG9yZV8xLlBsdWdpbkV2ZW50VHlwZS5SZXBvSW5pdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZXN0b3JlXzEucmVwb0F0dGFjaElmU3VwcG9ydGVkKGFyZ3NbMF0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGFibGUobW9kZWxUeXBlKSB7XG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMudGFibGVzW21vZGVsVHlwZS5uYW1lXTtcbiAgICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgYSB0YWJsZSBkZWZpbml0aW9uIGZvciAke21vZGVsVHlwZS5uYW1lfWApO1xuICAgICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuICAgIGluaXQoY29vcmRpbmF0b3IsIG9wdHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRoaXMuY29vcmRpbmF0b3IgPSBjb29yZGluYXRvcjtcbiAgICAgICAgICAgIHJldHVybiBjb29yZGluYXRvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZWxzID0gdGhpcy5jb29yZGluYXRvci5nZXRNb2RlbHMoKTtcbiAgICAgICAgICAgIC8vIDEuIENyZWF0ZSB0aGUgY3VycmVudCBzY2hlbWEgY29uZmlnXG4gICAgICAgICAgICAvLyBUT0RPOiBTaG91bGQgb25seSB1c2UgaW5kZXhlZCBhdHRyaWJ1dGVzIGZvciBzY2hlbWFcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYUF0dHJOYW1lTWFwID0ge307XG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSBtb2RlbHMucmVkdWNlKChuZXdTY2hlbWEsIG1vZGVsVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEdldCBhbGwgdGhlIGtub3duIGF0dHJpYnV0ZXMgZm9yIHRoZSB0YWJsZVxuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJzID0gbW9kZWxUeXBlLm9wdGlvbnMuYXR0cnNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihhdHRyID0+ICFhdHRyLnRyYW5zaWVudCk7XG4gICAgICAgICAgICAgICAgc2NoZW1hQXR0ck5hbWVNYXBbbW9kZWxUeXBlLm5hbWVdID0gYXR0cnMubWFwKGF0dHIgPT4gYXR0ci5uYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyRGVzY3MgPSBhdHRycy5tYXAoKGF0dHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpbmRleCwgbmFtZSwgcHJpbWFyeUtleSwgaXNBcnJheSB9ID0gYXR0ciwgdW5pcXVlID0gcHJpbWFyeUtleSB8fCAoaW5kZXggJiYgaW5kZXgudW5pcXVlKSwgcHJlZml4ID0gKCh1bmlxdWUpID8gJyYnIDogKGlzQXJyYXkpID8gJyonIDogJycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7cHJlZml4fSR7bmFtZX1gO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIEFkZGVkIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRvciB0byB0aGUgbmV3IHNjaGVtYVxuICAgICAgICAgICAgICAgIG5ld1NjaGVtYVttb2RlbFR5cGUubmFtZV0gPSBhdHRyRGVzY3Muam9pbignLCcpO1xuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhgQ3JlYXRlZCBzY2hlbWEgZm9yICR7bW9kZWxUeXBlLm5hbWV9YCwgbmV3U2NoZW1hW21vZGVsVHlwZS5uYW1lXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1NjaGVtYTtcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBhbiBleGlzdGluZyBkYXRhYmFzZSwgdmVyc2lvbiwgc2NoZW1hXG4gICAgICAgICAgICBsZXQgeyB2ZXJzaW9uIH0gPSB0aGlzLm9wdHM7XG4gICAgICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSB0aGlzLm5ld0RleGllKCk7XG4gICAgICAgICAgICAgICAgZGIub3BlbigpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oJ09wZW5lZCBleGlzdGluZyBkYXRhYmFzZScsIGRiLm5hbWUsICcgd2l0aCBleGlzdGluZyB2ZXJzaW9uICcsIGRiLnZlcm5vKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFibGVzID0gZGIudGFibGVzLCB0YWJsZU5hbWVzID0gdGFibGVzLm1hcCh0YWJsZSA9PiB0YWJsZS5uYW1lKSwgbmV3VGFibGVOYW1lcyA9IE9iamVjdC5rZXlzKHNjaGVtYSksIFxuICAgICAgICAgICAgICAgICAgICAvLyBOZXcgdGFibGUgZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICBuZXdUYWJsZSA9ICFuZXdUYWJsZU5hbWVzLmV2ZXJ5KHRhYmxlTmFtZSA9PiB0YWJsZU5hbWVzLmluY2x1ZGVzKHRhYmxlTmFtZSkpLCBcbiAgICAgICAgICAgICAgICAgICAgLy8gVGFibGUgcmVtb3ZlZD8/XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWRUYWJsZSA9ICF0YWJsZU5hbWVzLmV2ZXJ5KHRhYmxlTmFtZSA9PiBuZXdUYWJsZU5hbWVzLmluY2x1ZGVzKHRhYmxlTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXR0ckNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm8gbmV3IHRhYmxlcyB0aGVuIGNoZWNrIGluZGV4ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdUYWJsZSAmJiAhcmVtb3ZlZFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0YWJsZSBvZiB0YWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdBdHRyTmFtZXMgPSBzY2hlbWFBdHRyTmFtZU1hcFt0YWJsZS5uYW1lXSwgeyBpbmRleGVzLCBwcmltS2V5IH0gPSB0YWJsZS5zY2hlbWEsIG9sZEF0dHJOYW1lcyA9IGluZGV4ZXMubWFwKGluZGV4ID0+IGluZGV4Lm5hbWUpLmNvbmNhdChbcHJpbUtleS5uYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0F0dHJOYW1lcy5sZW5ndGggIT09IG9sZEF0dHJOYW1lcy5sZW5ndGggfHwgIW9sZEF0dHJOYW1lcy5ldmVyeShhdHRyTmFtZSA9PiBuZXdBdHRyTmFtZXMuaW5jbHVkZXMoYXR0ck5hbWUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygnQXR0cmlidXRlcyBoYXZlIGNoYW5nZWQgb24gdGFibGUsIGJ1bXBpbmcgdmVyc2lvbi4gIE5ldyBhdHRycyAnLCBuZXdBdHRyTmFtZXMsICcgb2xkIGF0dHIgbmFtZXMgJywgb2xkQXR0ck5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJDaGFuZ2VkIHx8IG5ld1RhYmxlIHx8IHJlbW92ZWRUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oJ1NjaGVtYSBjaGFuZ2VzIGRldGVjdGVkLCBidW1waW5nIHZlcnNpb24sIGV2ZXJudHVhbGx5IGF1dG8tdXBncmFkZScsIGF0dHJDaGFuZ2VkLCBuZXdUYWJsZSwgcmVtb3ZlZFRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBkYi52ZXJubyArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCdDbG9zaW5nIGRiIGNoZWNrJyk7XG4gICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCdOb1N1Y2hEYXRhYmFzZUVycm9yJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oJ0RhdGFiYXNlIGRvZXMgbm90IGV4aXN0LCBjcmVhdGluZzogJywgdGhpcy5vcHRzLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoXCJVbmtub3duIGVycm9yXCIsIGUpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFRhYmxlIG5lZWRzIHRvIGJlIGNyZWF0ZWRcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgc2NoZW1hYCwgc2NoZW1hKTtcbiAgICAgICAgICAgIHRoaXMub3BlbigpXG4gICAgICAgICAgICAgICAgLnZlcnNpb24odmVyc2lvbilcbiAgICAgICAgICAgICAgICAuc3RvcmVzKHNjaGVtYSk7XG4gICAgICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbERiLm9wZW4oKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGFibGVzID0gbW9kZWxzLnJlZHVjZSgobmV3VGFibGVzLCBtb2RlbFR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICBuZXdUYWJsZXNbbW9kZWxUeXBlLm5hbWVdID0gdGhpcy5pbnRlcm5hbERiLnRhYmxlKG1vZGVsVHlwZS5uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3VGFibGVzO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgbG9nLmRlYnVnKCdJbmRleGVkREIgc3RvcmUgaXMgcmVhZHknKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdG9yO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmludGVybmFsRGIpXG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy5pbnRlcm5hbERiLmNsb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN5bmNNb2RlbHMoKSB7XG4gICAgICAgIGxvZy5kZWJ1ZygnQ3VycmVudGx5IHRoZSBsb2NhbHN0b3JhZ2UgcGx1Z2luIGRvZXMgbm90IHN5bmMgbW9kZWxzJyk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5jb29yZGluYXRvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgcmVwb1xuICAgICAqIFRPRE86IHZlcmlmeSB0aGlzIGxvZ2ljIHdvcmtzIC0ganVzdCByZWFkaW5nIGl0IG1ha2VzIG1lIHRoaW5rIHdlIGNvdWxkIGJlXG4gICAgICogIGFza2VkIHRvIGluaXQgYSByZXBvIGEgc2Vjb25kIHRpbWUgd2l0aCB0aGUgc2FtZSB0eXBlIGFuZCBkbyBub3RoaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVwb1xuICAgICAqIEByZXR1cm5zIHtUfVxuICAgICAqL1xuICAgIGluaXRSZXBvKHJlcG8pIHtcbiAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMucmVwb1BsdWdpbnNbcmVwby5tb2RlbFR5cGUubmFtZV07XG4gICAgICAgIGlmIChwbHVnaW4pXG4gICAgICAgICAgICByZXR1cm4gcGx1Z2luLnJlcG87XG4gICAgICAgIHBsdWdpbiA9IG5ldyBJbmRleGVkREJSZXBvUGx1Z2luXzEuSW5kZXhlZERCUmVwb1BsdWdpbih0aGlzLCByZXBvKTtcbiAgICAgICAgcmV0dXJuIHBsdWdpbi5yZXBvO1xuICAgIH1cbn1cbmV4cG9ydHMuSW5kZXhlZERCUGx1Z2luID0gSW5kZXhlZERCUGx1Z2luO1xuIl19
|
316 | //# sourceMappingURL=IndexedDBPlugin.js.map
|