textbrowser 0.39.0 → 0.40.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,166 +0,0 @@
1
- (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
- typeof define === 'function' && define.amd ? define(factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.activateCallback = factory());
5
- }(this, (function () { 'use strict';
6
-
7
- /* eslint-env worker */
8
-
9
- const {ceil} = Math;
10
- const arrayChunk = (arr, size) => {
11
- return [...Array.from({length: ceil(arr.length / size)})].map((_, i) => {
12
- const offset = i * size;
13
- return arr.slice(offset, offset + size);
14
- });
15
- };
16
-
17
- // Todo: If fetching fails here (or in install), e.g., because activate event
18
- // never completed
19
- // to cache, de-register and re-register (?); how to detect if all
20
- // files in cache?
21
- // Todo: Check `oldVersion` and run this first if still too old
22
-
23
- /**
24
- * @callback Logger
25
- * @param {...any} args
26
- * @returns {void}
27
- */
28
-
29
- /**
30
- * @param {PlainObject} cfg
31
- * @param {string} cfg.namespace
32
- * @param {string[]} cfg.files
33
- * @param {Logger} cfg.log
34
- * @param {string} [cfg.basePath=""]
35
- * @returns {Promise<void>}
36
- */
37
- async function activateCallback ({
38
- namespace, files, log, basePath = ''
39
- }) {
40
- // Now we know we have the files cached, we can postpone
41
- // the `indexedDB` processing (which will work offline
42
- // anyways); also important to avoid conflicts with
43
- // already-running versions upon future sw updates
44
- log('Activate: Callback called');
45
- const r = await fetch(files);
46
- const {groups} = await r.json();
47
-
48
- const addJSONFetch = (arr, path) => {
49
- arr.push(
50
- (async () => (await fetch(basePath + path)).json())()
51
- );
52
- };
53
-
54
- const dataFileNames = [];
55
- const dataFiles = [];
56
- const schemaFiles = [];
57
- const metadataFiles = [];
58
- groups.forEach(
59
- ({files: fileObjs, metadataBaseDirectory, schemaBaseDirectory}) => {
60
- fileObjs.forEach(({file: {$ref: filePath}, metadataFile, schemaFile, name}) => {
61
- // We don't i18nize the name here
62
- dataFileNames.push(name);
63
- addJSONFetch(dataFiles, filePath);
64
- addJSONFetch(metadataFiles, metadataBaseDirectory + '/' + metadataFile);
65
- addJSONFetch(schemaFiles, schemaBaseDirectory + '/' + schemaFile);
66
- });
67
- }
68
- );
69
- const promises = await Promise.all([
70
- ...dataFiles, ...schemaFiles, ...metadataFiles
71
- ]);
72
- const chunked = arrayChunk(promises, dataFiles.length);
73
- const [
74
- dataFileResponses, schemaFileResponses, metadataFileResponses
75
- ] = chunked;
76
-
77
- log('Activate: Files fetched');
78
- const dbName = namespace + '-textbrowser-cache-data';
79
- indexedDB.deleteDatabase(dbName);
80
- return new Promise((resolve, reject) => {
81
- const req = indexedDB.open(dbName);
82
- req.addEventListener('upgradeneeded', ({target: {result: db}}) => {
83
- db.onversionchange = () => {
84
- db.close();
85
- const err = new Error('versionchange');
86
- err.type = 'versionchange';
87
- reject(err);
88
- };
89
- dataFileResponses.forEach(({data: tableRows}, i) => {
90
- const dataFileName = dataFileNames[i];
91
- const store = db.createObjectStore('files-to-cache-' + dataFileName);
92
-
93
- const schemaFileResponse = schemaFileResponses[i];
94
- const metadataFileResponse = metadataFileResponses[i];
95
- const fieldItems = schemaFileResponse.items.items;
96
-
97
- let browseFields = metadataFileResponse.table.browse_fields;
98
- browseFields = Array.isArray(browseFields) ? browseFields : [browseFields];
99
-
100
- const columnIndexes = [];
101
- browseFields.forEach((browseFieldSetObj) => {
102
- if (typeof browseFieldSetObj === 'string') {
103
- browseFieldSetObj = {set: [browseFieldSetObj]};
104
- }
105
- if (!browseFieldSetObj.name) {
106
- browseFieldSetObj.name = browseFieldSetObj.set.join(',');
107
- }
108
- const browseFieldSetName = browseFieldSetObj.name;
109
- const browseFieldSetIndexes = browseFieldSetObj.set.map((browseField) => {
110
- // Need to convert to columns for numbers
111
- // to become valid key paths
112
- return 'c' + (
113
- fieldItems.findIndex((item) => item.title === browseField)
114
- );
115
- });
116
- columnIndexes.push(...browseFieldSetIndexes);
117
-
118
- log(
119
- 'Activate: Creating index:',
120
- dataFileName,
121
- 'browseFields-' + browseFieldSetName,
122
- browseFieldSetIndexes
123
- );
124
-
125
- // No need for using `presort` as our index will sort anyways
126
- store.createIndex(
127
- 'browseFields-' + browseFieldSetName,
128
- browseFieldSetIndexes
129
- );
130
- });
131
-
132
- const uniqueColumnIndexes = [...new Set(columnIndexes)];
133
-
134
- tableRows.forEach((tableRow, j) => {
135
- // Todo: Optionally send notice when complete
136
- // To take advantage of indexes on our arrays, we
137
- // need to transform them to objects! See https://github.com/w3c/IndexedDB/issues/209
138
- const objRow = {
139
- value: tableRow
140
- };
141
- uniqueColumnIndexes.forEach((colIdx) => {
142
- objRow[colIdx] = tableRow[colIdx.slice(1)];
143
- });
144
- // log('objRow', objRow);
145
- store.put(objRow, j);
146
- });
147
- });
148
- });
149
- req.addEventListener('success', ({target: {result: db}}) => {
150
- log('Activate: Database set-up complete', db);
151
- // Todo: Replace this with `ready()` check
152
- // in calling code?
153
- resolve();
154
- });
155
- const onerr = ({error = new Error('dbError')}) => {
156
- error.type = 'dbError';
157
- reject(error);
158
- };
159
- req.addEventListener('blocked', onerr);
160
- req.addEventListener('error', onerr);
161
- });
162
- }
163
-
164
- return activateCallback;
165
-
166
- })));