@vnejs/plugins.core.storage 0.1.0 → 0.1.2
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/const/events.js +7 -0
- package/const/params.js +3 -0
- package/index.js +6 -1
- package/modules/actions.js +46 -0
- package/modules/get.js +38 -0
- package/modules/rm.js +36 -0
- package/modules/set.js +54 -0
- package/modules/storage.js +8 -111
- package/package.json +1 -5
package/const/events.js
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
export const SUBSCRIBE_EVENTS = {
|
|
2
2
|
SET: "vne:storage:set",
|
|
3
3
|
SET_ALL: "vne:storage:set_all",
|
|
4
|
+
|
|
4
5
|
GET: "vne:storage:get",
|
|
5
6
|
GET_ALL: "vne:storage:get_all",
|
|
7
|
+
|
|
6
8
|
RM: "vne:storage:rm",
|
|
9
|
+
RM_ALL: "vne:storage:rm_all",
|
|
10
|
+
|
|
11
|
+
KEYS: "vne:storage:keys",
|
|
12
|
+
INIT: "vne:storage:init",
|
|
7
13
|
CHANGED: "vne:storage:changed",
|
|
14
|
+
|
|
8
15
|
IMPORT: "vne:storage:import",
|
|
9
16
|
EXPORT: "vne:storage:export",
|
|
10
17
|
CLEAR: "vne:storage:clear",
|
package/const/params.js
ADDED
package/index.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { regPlugin } from "@vnejs/shared";
|
|
2
2
|
|
|
3
3
|
import { SUBSCRIBE_EVENTS } from "./const/events";
|
|
4
|
+
import * as params from "./const/params";
|
|
4
5
|
|
|
5
6
|
import { Storage } from "./modules/storage";
|
|
7
|
+
import { StorageGet } from "./modules/get";
|
|
8
|
+
import { StorageSet } from "./modules/set";
|
|
9
|
+
import { StorageActions } from "./modules/actions";
|
|
10
|
+
import { StorageRm } from "./modules/rm";
|
|
6
11
|
|
|
7
|
-
regPlugin("STORAGE", { events: SUBSCRIBE_EVENTS }, [Storage]);
|
|
12
|
+
regPlugin("STORAGE", { events: SUBSCRIBE_EVENTS, params }, [Storage, StorageGet, StorageSet, StorageRm, StorageActions]);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Module } from "@vnejs/module";
|
|
2
|
+
|
|
3
|
+
export class StorageActions extends Module {
|
|
4
|
+
name = "storage.actions";
|
|
5
|
+
|
|
6
|
+
subscribe = () => {
|
|
7
|
+
this.on(this.EVENTS.STORAGE.EXPORT, this.onStorageExport);
|
|
8
|
+
this.on(this.EVENTS.STORAGE.IMPORT, this.onStorageImport);
|
|
9
|
+
this.on(this.EVENTS.STORAGE.CLEAR, this.onStorageClear);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
onStorageExport = async () => {
|
|
13
|
+
await this.emit(this.EVENTS.STORAGE.INIT);
|
|
14
|
+
|
|
15
|
+
const state = await this.emitOne(this.EVENTS.STORAGE.GET_ALL);
|
|
16
|
+
|
|
17
|
+
await this.emit(this.EVENTS.SYSTEM.FILE_LOAD, { obj: state, name: "state" });
|
|
18
|
+
|
|
19
|
+
return state;
|
|
20
|
+
};
|
|
21
|
+
onStorageImport = async () => {
|
|
22
|
+
await this.emit(this.EVENTS.STORAGE.INIT);
|
|
23
|
+
|
|
24
|
+
const newStorage = await this.emitOne(this.EVENTS.SYSTEM.FILE_READ);
|
|
25
|
+
if (!newStorage) return;
|
|
26
|
+
|
|
27
|
+
const keys = await this.emitOne(this.EVENTS.STORAGE.KEYS);
|
|
28
|
+
|
|
29
|
+
await Promise.all(keys.map(this.emitRm));
|
|
30
|
+
await Promise.all(Object.keys(newStorage).map((key) => this.emitSet(key, newStorage[key])));
|
|
31
|
+
|
|
32
|
+
return this.emit(this.EVENTS.SYSTEM.RELOAD);
|
|
33
|
+
};
|
|
34
|
+
onStorageClear = async () => {
|
|
35
|
+
await this.emit(this.EVENTS.STORAGE.INIT);
|
|
36
|
+
|
|
37
|
+
const keys = await this.emitOne(this.EVENTS.STORAGE.KEYS);
|
|
38
|
+
|
|
39
|
+
await Promise.all(keys.map(this.emitRm));
|
|
40
|
+
|
|
41
|
+
return this.emit(this.EVENTS.SYSTEM.RELOAD);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
emitRm = (key) => this.emit(this.EVENTS.STORAGE.RM, { key });
|
|
45
|
+
emitSet = (key, value) => this.emit(this.EVENTS.STORAGE.SET, { key, value });
|
|
46
|
+
}
|
package/modules/get.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import localforage from "localforage";
|
|
2
|
+
|
|
3
|
+
import { Module } from "@vnejs/module";
|
|
4
|
+
|
|
5
|
+
export class StorageGet extends Module {
|
|
6
|
+
name = "storage.get";
|
|
7
|
+
|
|
8
|
+
subscribe = () => {
|
|
9
|
+
this.on(this.EVENTS.STORAGE.GET, this.onStorageGet);
|
|
10
|
+
this.on(this.EVENTS.STORAGE.GET_ALL, this.onStorageGetAll);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
onStorageGet = async ({ prefix = "", key = "" } = {}) => {
|
|
14
|
+
await this.emit(this.EVENTS.STORAGE.INIT);
|
|
15
|
+
|
|
16
|
+
return this.getItem(key, prefix);
|
|
17
|
+
};
|
|
18
|
+
onStorageGetAll = async ({ prefix = "" } = {}) => {
|
|
19
|
+
await this.emit(this.EVENTS.STORAGE.INIT);
|
|
20
|
+
|
|
21
|
+
const result = {};
|
|
22
|
+
const keys = await this.getKeys(prefix);
|
|
23
|
+
|
|
24
|
+
await Promise.all(keys.map((key) => this.setResultKey(result, prefix, key)));
|
|
25
|
+
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
setResultKey = async (result, prefix, key) => {
|
|
30
|
+
result[prefix ? key.slice(prefix.length + 1) : key] = await this.getItem(key);
|
|
31
|
+
};
|
|
32
|
+
getKeys = async (prefix) => {
|
|
33
|
+
const keys = await this.emitOne(this.EVENTS.STORAGE.KEYS);
|
|
34
|
+
|
|
35
|
+
return prefix ? keys.filter((key) => key.startsWith(prefix)) : keys;
|
|
36
|
+
};
|
|
37
|
+
getItem = (key, prefix) => localforage.getItem(prefix ? `${prefix}.${key}` : key);
|
|
38
|
+
}
|
package/modules/rm.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import localforage from "localforage";
|
|
2
|
+
|
|
3
|
+
import { Module } from "@vnejs/module";
|
|
4
|
+
|
|
5
|
+
export class StorageRm extends Module {
|
|
6
|
+
name = "storage.rm";
|
|
7
|
+
|
|
8
|
+
subscribe = () => {
|
|
9
|
+
this.on(this.EVENTS.STORAGE.RM, this.onStorageRm);
|
|
10
|
+
this.on(this.EVENTS.STORAGE.RM_ALL, this.onStorageRmAll);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
onStorageRm = async ({ prefix = "", key = "" } = {}) => {
|
|
14
|
+
await this.emit(this.EVENTS.STORAGE.INIT);
|
|
15
|
+
|
|
16
|
+
await this.removeKey(prefix ? `${prefix}.${key}` : key);
|
|
17
|
+
|
|
18
|
+
this.emit(this.EVENTS.STORAGE.CHANGED);
|
|
19
|
+
};
|
|
20
|
+
onStorageRmAll = async ({ prefix = "" } = {}) => {
|
|
21
|
+
await this.emit(this.EVENTS.STORAGE.INIT);
|
|
22
|
+
|
|
23
|
+
const keys = await this.getKeys(prefix);
|
|
24
|
+
|
|
25
|
+
await Promise.all(keys.map(this.removeKey));
|
|
26
|
+
|
|
27
|
+
this.emit(this.EVENTS.STORAGE.CHANGED);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
getKeys = async (prefix) => {
|
|
31
|
+
const keys = await this.emitOne(this.EVENTS.STORAGE.KEYS);
|
|
32
|
+
|
|
33
|
+
return prefix ? keys.filter((key) => key.startsWith(prefix)) : keys;
|
|
34
|
+
};
|
|
35
|
+
removeKey = (key) => localforage.removeItem(key);
|
|
36
|
+
}
|
package/modules/set.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import localforage from "localforage";
|
|
2
|
+
|
|
3
|
+
import { Module } from "@vnejs/module";
|
|
4
|
+
|
|
5
|
+
const eqTrue = (i) => i === true;
|
|
6
|
+
|
|
7
|
+
export class StorageSet extends Module {
|
|
8
|
+
name = "storage.set";
|
|
9
|
+
|
|
10
|
+
subscribe = () => {
|
|
11
|
+
this.on(this.EVENTS.STORAGE.SET, this.onStorageSet);
|
|
12
|
+
this.on(this.EVENTS.STORAGE.SET_ALL, this.onStorageSetAll);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
onStorageSet = async ({ prefix, key, value } = {}) => {
|
|
16
|
+
await this.emit(this.EVENTS.STORAGE.INIT);
|
|
17
|
+
|
|
18
|
+
await this.setItem(prefix ? `${prefix}.${key}` : key, value);
|
|
19
|
+
|
|
20
|
+
this.emit(this.EVENTS.STORAGE.CHANGED);
|
|
21
|
+
};
|
|
22
|
+
onStorageSetAll = async ({ storage } = {}) => {
|
|
23
|
+
await this.emit(this.EVENTS.STORAGE.INIT);
|
|
24
|
+
|
|
25
|
+
const keys = await this.emitOne(this.EVENTS.STORAGE.KEYS);
|
|
26
|
+
|
|
27
|
+
const arrSet = await Promise.all(Object.entries(storage).map(this.setNewValueBykey));
|
|
28
|
+
const arrRm = await Promise.all(keys.map((key) => this.removeOldValue(storage, key)));
|
|
29
|
+
|
|
30
|
+
this.emit(this.EVENTS.STORAGE.CHANGED);
|
|
31
|
+
|
|
32
|
+
return [...arrSet, ...arrRm].some(eqTrue);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
setNewValueBykey = async ([key, oldValue]) => {
|
|
36
|
+
const value = await this.emitOne(this.EVENTS.STORAGE.GET, { key });
|
|
37
|
+
|
|
38
|
+
if (value === oldValue) return false;
|
|
39
|
+
|
|
40
|
+
await this.setItem(key, oldValue);
|
|
41
|
+
|
|
42
|
+
return true;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
removeOldValue = async (storage, key) => {
|
|
46
|
+
if (storage[key] !== undefined) return false;
|
|
47
|
+
|
|
48
|
+
await this.emit(this.EVENTS.STORAGE.RM, { key });
|
|
49
|
+
|
|
50
|
+
return true;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
setItem = (key, value) => localforage.setItem(key, value);
|
|
54
|
+
}
|
package/modules/storage.js
CHANGED
|
@@ -6,124 +6,21 @@ export class Storage extends Module {
|
|
|
6
6
|
name = "storage";
|
|
7
7
|
|
|
8
8
|
subscribe = () => {
|
|
9
|
-
this.on(this.EVENTS.STORAGE.
|
|
10
|
-
this.on(this.EVENTS.STORAGE.
|
|
11
|
-
this.on(this.EVENTS.STORAGE.
|
|
12
|
-
this.on(this.EVENTS.STORAGE.RM, this.onStorageRm);
|
|
13
|
-
this.on(this.EVENTS.STORAGE.EXPORT, this.onStorageExport);
|
|
14
|
-
this.on(this.EVENTS.STORAGE.IMPORT, this.onStorageImport);
|
|
15
|
-
this.on(this.EVENTS.STORAGE.CLEAR, this.onStorageClear);
|
|
9
|
+
this.on(this.EVENTS.STORAGE.KEYS, this.onStorageKeys);
|
|
10
|
+
this.on(this.EVENTS.STORAGE.INIT, this.onStorageInit);
|
|
11
|
+
this.on(this.EVENTS.STORAGE.CHANGED, this.onStorageChanged);
|
|
16
12
|
};
|
|
17
13
|
init = () =>
|
|
18
14
|
new Promise((resolve) => {
|
|
19
|
-
const
|
|
15
|
+
const name = `vne_store_${this.PARAMS.STORAGE.GAMENAME}`;
|
|
20
16
|
|
|
21
|
-
const name = `vne_store_${gameName}`;
|
|
22
17
|
localforage.ready(resolve);
|
|
23
|
-
localforage.config({ driver: localforage.INDEXEDDB, name, storeName: name, description: name, version });
|
|
18
|
+
localforage.config({ driver: localforage.INDEXEDDB, name, storeName: name, description: name, version: this.PARAMS.STORAGE.VERSION });
|
|
24
19
|
});
|
|
25
20
|
|
|
26
|
-
|
|
27
|
-
if (!this.isReady) await this.waitIsReady();
|
|
21
|
+
onStorageChanged = () => this.emit(this.EVENTS.LOGS.EMIT, { module: this.name, value: { action: "changed" } });
|
|
28
22
|
|
|
29
|
-
|
|
23
|
+
onStorageInit = () => !this.isReady && this.waitIsReady();
|
|
30
24
|
|
|
31
|
-
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
onStorageSetAll = async ({ storage }) => {
|
|
35
|
-
if (!this.isReady) await this.waitIsReady();
|
|
36
|
-
|
|
37
|
-
let wasChanged = false;
|
|
38
|
-
|
|
39
|
-
await Promise.all(
|
|
40
|
-
Object.keys(storage).map(async (key) => {
|
|
41
|
-
const value = await localforage.getItem(key);
|
|
42
|
-
if (value !== storage[key]) {
|
|
43
|
-
wasChanged = true;
|
|
44
|
-
await localforage.setItem(key, storage[key]);
|
|
45
|
-
}
|
|
46
|
-
}),
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
const keys = await localforage.keys();
|
|
50
|
-
|
|
51
|
-
await Promise.all(
|
|
52
|
-
keys.map(async (key) => {
|
|
53
|
-
if (storage[key] === undefined) {
|
|
54
|
-
wasChanged = true;
|
|
55
|
-
await localforage.removeItem(key);
|
|
56
|
-
}
|
|
57
|
-
}),
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
await this.emit(this.EVENTS.STORAGE.CHANGED);
|
|
61
|
-
|
|
62
|
-
return wasChanged;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
onStorageGet = async ({ prefix = "", key = "" } = {}) => {
|
|
66
|
-
if (!this.isReady) await this.waitIsReady();
|
|
67
|
-
|
|
68
|
-
const result = {};
|
|
69
|
-
|
|
70
|
-
if (key) {
|
|
71
|
-
const keyWithPrefix = prefix ? `${prefix}.${key}` : key;
|
|
72
|
-
|
|
73
|
-
result[key] = await localforage.getItem(keyWithPrefix);
|
|
74
|
-
} else {
|
|
75
|
-
const keys = await localforage.keys();
|
|
76
|
-
const realKeys = prefix ? keys.filter((key) => key.startsWith(prefix)) : keys;
|
|
77
|
-
|
|
78
|
-
await Promise.all(
|
|
79
|
-
realKeys.map(async (key) => {
|
|
80
|
-
result[prefix ? key.slice(prefix.length + 1) : key] = await localforage.getItem(key);
|
|
81
|
-
}),
|
|
82
|
-
);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return result;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
onStorageRm = async ({ prefix = "", key = "" } = {}) => {
|
|
89
|
-
if (!this.isReady) await this.waitIsReady();
|
|
90
|
-
|
|
91
|
-
localforage.removeItem(`${prefix}.${key}`);
|
|
92
|
-
|
|
93
|
-
this.emit(this.EVENTS.STORAGE.CHANGED);
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
onStorageExport = async () => {
|
|
97
|
-
if (!this.isReady) await this.waitIsReady();
|
|
98
|
-
|
|
99
|
-
const state = await this.emitOne(this.EVENTS.STORAGE.GET);
|
|
100
|
-
|
|
101
|
-
await this.emit(this.EVENTS.SYSTEM.FILE_LOAD, { obj: state, name: "state" });
|
|
102
|
-
|
|
103
|
-
return state;
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
onStorageImport = async () => {
|
|
107
|
-
if (!this.isReady) await this.waitIsReady();
|
|
108
|
-
|
|
109
|
-
const newStorage = await this.emitOne(this.EVENTS.SYSTEM.FILE_READ);
|
|
110
|
-
if (!newStorage) return;
|
|
111
|
-
|
|
112
|
-
const keys = await localforage.keys();
|
|
113
|
-
|
|
114
|
-
await Promise.all(keys.map((key) => localforage.removeItem(key)));
|
|
115
|
-
await Promise.all(Object.keys(newStorage).map((key) => localforage.setItem(key, newStorage[key])));
|
|
116
|
-
|
|
117
|
-
await this.emit(this.EVENTS.SYSTEM.RELOAD);
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
onStorageClear = async () => {
|
|
121
|
-
if (!this.isReady) await this.waitIsReady();
|
|
122
|
-
|
|
123
|
-
const keys = await localforage.keys();
|
|
124
|
-
|
|
125
|
-
await Promise.all(keys.map((key) => localforage.removeItem(key)));
|
|
126
|
-
|
|
127
|
-
await this.emit(this.EVENTS.SYSTEM.RELOAD);
|
|
128
|
-
};
|
|
25
|
+
onStorageKeys = () => localforage.keys();
|
|
129
26
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vnejs/plugins.core.storage",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
@@ -16,9 +16,5 @@
|
|
|
16
16
|
"description": "",
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"localforage": "1.10.0"
|
|
19
|
-
},
|
|
20
|
-
"peerDependencies": {
|
|
21
|
-
"@vnejs/shared": "*",
|
|
22
|
-
"@vnejs/module": "*"
|
|
23
19
|
}
|
|
24
20
|
}
|