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.
- package/.eslintrc.js +2 -0
- package/.ncurc.js +8 -0
- package/CHANGES.md +32 -0
- package/README.md +21 -16
- package/dist/WorkInfo-es.js +4659 -0
- package/dist/activateCallback-es.js +158 -0
- package/dist/index-es.js +83 -85
- package/dist/index-es.min.js +1 -1
- package/dist/index-umd.js +84 -86
- package/dist/index-umd.min.js +1 -1
- package/package.json +44 -44
- package/resources/index.js +1 -1
- package/resources/utils/Metadata.js +6 -1
- package/resources/utils/ServiceWorker.js +3 -1
- package/resources/workDisplay.js +0 -1
- package/server/main-cjs.js +186 -26
- package/server/main.js +1 -3
- package/sw-sample.js +17 -24
- package/.remarkrc +0 -11
- package/dist/WorkInfo-umd.js +0 -4666
- package/dist/activateCallback-umd.js +0 -166
|
@@ -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
|
-
})));
|