-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathstorage-helper.js
114 lines (104 loc) · 3.98 KB
/
storage-helper.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*!
* MIT License
*
* Copyright (c) 2018 Pablo Klaschka
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
const storage = require('uxp').storage;
const fs = storage.localFileSystem;
let data;
/**
* Reads the current value from the storage file
* @param dataFile - the reference to the storage file
* @return {Promise<any>} resolves with the data for the file on success, rejects otherwise
*/
async function readStorageFile(dataFile) {
return JSON.parse((await dataFile.read({format: storage.formats.utf8})).toString());
}
class storageHelper {
/**
* Creates a data file if none was previously existent.
* @return {Promise<storage.File>} The data file
* @private
*/
static async init() {
let dataFolder = await fs.getDataFolder();
try {
let returnFile = await dataFolder.getEntry('storage.json');
data = await readStorageFile(returnFile);
return returnFile;
} catch (e) {
const file = await dataFolder.createEntry('storage.json', {type: storage.types.file, overwrite: true});
if (file.isFile) {
await file.write('{}', {append: false});
data = {};
return file;
} else {
throw new Error('Storage file storage.json was not a file.');
}
}
}
/**
* Retrieves a value from storage. Saves default value if none is set.
* @param {string} key The identifier
* @param {*} defaultValue The default value. Gets saved and returned if no value was previously set for the speciefied key.
* @return {Promise<*>} The value retrieved from storage. If none is saved, the `defaultValue` is returned.
*/
static async get(key, defaultValue) {
if (!data) {
const dataFile = await this.init();
await readStorageFile(dataFile);
}
if (data[key] === undefined) {
await this.set(key, defaultValue);
return defaultValue;
} else {
return data[key];
}
}
/**
* Saves a certain key-value-pair to the storage.
* @param {string} key The identifier
* @param {*} value The value that get's saved
* @return {Promise<void>}
*/
static async set(key, value) {
const dataFile = await this.init();
data[key] = value;
return await dataFile.write(JSON.stringify(data), {append: false, format: storage.formats.utf8})
}
/**
* Deletes a certain key-value-pair from the storage
* @param {string} key The key of the deleted pair
* @return {Promise<void>}
*/
static async delete(key) {
return await this.set(key, undefined);
}
/**
* Resets (i.e. purges) all stored settings.
* @returns {Promise<void>}
*/
static async reset() {
const dataFile = await this.init();
return await dataFile.write('{}', {append: false, format: storage.formats.utf8})
}
}
module.exports = storageHelper;