datafolder 1.0.11 → 1.0.12
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/README.md +12 -0
- package/package.json +1 -1
- package/scripts/flights2.js +2 -0
- package/src/QyAcl.d.ts +13 -7
- package/src/QyAcl.js +122 -138
- package/src/QyAclSaver.js +2 -2
- package/src/QyAclSaver_Worker.d.ts +2 -2
- package/src/QyBatch.d.ts +8 -11
- package/src/QyBatch.js +239 -211
- package/src/QyBinWriter.d.ts +1 -1
- package/src/QyBinWriter.js +15 -15
- package/src/QyCD.d.ts +2 -2
- package/src/QyCD.js +29 -29
- package/src/QyCache.d.ts +6 -1
- package/src/QyCache.js +72 -53
- package/src/QyCompressor.d.ts +2 -2
- package/src/QyCompressor.js +13 -13
- package/src/QyDB.d.ts +1 -22
- package/src/QyDB.js +23 -78
- package/src/QyDefaultOptions.js +5 -0
- package/src/QyDir.js +26 -27
- package/src/QyExpire.d.ts +21 -0
- package/src/QyExpire.js +113 -0
- package/src/QyExpireClock.d.ts +15 -0
- package/src/QyExpireClock.js +53 -0
- package/src/QyExpire_Worker.d.ts +20 -0
- package/src/QyExpire_Worker.js +127 -0
- package/src/QyFile.js +36 -25
- package/src/QyFileContentUtils.js +21 -21
- package/src/QyItem.d.ts +1 -0
- package/src/QyItem.js +15 -9
- package/src/QyJsonSaver.d.ts +1 -1
- package/src/QyJsonSaver.js +1 -1
- package/src/QyKVData.d.ts +4 -1
- package/src/QyKVData.js +148 -136
- package/src/QyKVDataCleaner.js +2 -2
- package/src/QyKVDataSaver.js +2 -2
- package/src/QyKVDataSaver_Worker.d.ts +2 -2
- package/src/QyKVDataSaver_Worker.js +5 -5
- package/src/QyLogFileSaver.js +2 -2
- package/src/QyMessageWorker.d.ts +1 -1
- package/src/QyMessageWorker.js +10 -10
- package/src/QyMessager.d.ts +1 -1
- package/src/QyMessager.js +37 -36
- package/src/QyMessager_Run.js +9 -6
- package/src/QyQueue.js +8 -12
- package/src/QySaver.d.ts +1 -1
- package/src/QySaver.js +1 -1
- package/src/QySnapshotCompactor.js +2 -2
- package/src/QySnapshotCompactor_Worker.js +1 -1
- package/src/QySnapshotSaver.js +2 -2
- package/src/QySnapshotSaver_Worker.js +1 -1
- package/src/QyTrigger.d.ts +1 -1
- package/src/QyTrigger.js +20 -21
- package/src/QyUtils.d.ts +3 -2
- package/src/QyUtils.js +93 -86
- package/src/hackernews.js +1 -1
- package/src/simulate.js +6 -6
- package/src/simulate2.js +4 -4
- package/src/soc_pokec.js +1 -1
- package/static/codemirror.bundle/editor.bundle.js +43 -9
- package/static/datafolderui/QyUIFolderViewer.js +1 -5
package/src/QyDB.js
CHANGED
|
@@ -11,11 +11,11 @@ import {
|
|
|
11
11
|
} from "./QyBatch.js";
|
|
12
12
|
|
|
13
13
|
import {
|
|
14
|
-
QyCache as
|
|
14
|
+
QyCache as a
|
|
15
15
|
} from "./QyCache.js";
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
|
-
getDefaultOptions as
|
|
18
|
+
getDefaultOptions as o
|
|
19
19
|
} from "./QyDefaultOptions.js";
|
|
20
20
|
|
|
21
21
|
import {
|
|
@@ -24,29 +24,33 @@ import {
|
|
|
24
24
|
|
|
25
25
|
import {
|
|
26
26
|
isNotNullObj as s,
|
|
27
|
-
__dirname as
|
|
27
|
+
__dirname as c
|
|
28
28
|
} from "./QyUtils.js";
|
|
29
29
|
|
|
30
|
-
let
|
|
30
|
+
let h = e(c, "../data/sampleDataFolder");
|
|
31
31
|
|
|
32
|
-
class
|
|
32
|
+
class n extends t {
|
|
33
33
|
rootFolder;
|
|
34
34
|
options;
|
|
35
35
|
fetch;
|
|
36
36
|
batch;
|
|
37
37
|
_immediate;
|
|
38
|
-
constructor(e =
|
|
39
|
-
s(e) && (t = e, e =
|
|
40
|
-
...
|
|
38
|
+
constructor(e = h, t) {
|
|
39
|
+
s(e) && (t = e, e = h), super(), this.options = {
|
|
40
|
+
...o("QyDB"),
|
|
41
41
|
...t
|
|
42
42
|
}, this.rootFolder = e;
|
|
43
|
+
for (let r of [ "createIndex", "delIndex", "insert", "remove", "replace", "delDir", "delFile", "delContent", "insertTrigger", "removeTrigger", "insertRpc", "removeRpc", "expireFile", "expireContent", "removeFileExpire", "removeContentExpire" ]) this[r] = (...e) => {
|
|
44
|
+
var t = this.currentBatch;
|
|
45
|
+
return t[r].apply(t, e).run();
|
|
46
|
+
};
|
|
43
47
|
}
|
|
44
48
|
async start(e) {
|
|
45
49
|
var t;
|
|
46
50
|
return this.qyCache || (e = {
|
|
47
51
|
...this.options,
|
|
48
52
|
...e
|
|
49
|
-
}, t = new
|
|
53
|
+
}, t = new a(this.rootFolder, e, this), Object.assign(this, {
|
|
50
54
|
qyCache: t,
|
|
51
55
|
fetch: new r(t),
|
|
52
56
|
batch: new i(t, e),
|
|
@@ -68,77 +72,18 @@ class h extends t {
|
|
|
68
72
|
_immediate: void 0
|
|
69
73
|
}));
|
|
70
74
|
}
|
|
71
|
-
|
|
72
|
-
|
|
75
|
+
get currentBatch() {
|
|
76
|
+
var {
|
|
77
|
+
batch: e,
|
|
78
|
+
_immediate: t
|
|
79
|
+
} = this;
|
|
80
|
+
return e.running ? e : t;
|
|
73
81
|
}
|
|
74
|
-
|
|
75
|
-
return this.
|
|
82
|
+
createDir(e) {
|
|
83
|
+
return this.currentBatch.createDir(e).run(), this.dir(e);
|
|
76
84
|
}
|
|
77
85
|
createFile(e) {
|
|
78
|
-
return this.
|
|
79
|
-
}
|
|
80
|
-
createFileP(e) {
|
|
81
|
-
return this._immediate.createFileP(e).run(), this.fileP(e);
|
|
82
|
-
}
|
|
83
|
-
createIndex(e, t) {
|
|
84
|
-
return this._immediate.createIndex(e, t).run();
|
|
85
|
-
}
|
|
86
|
-
createIndexP(e, t) {
|
|
87
|
-
return this._immediate.createIndexP(e, t).run();
|
|
88
|
-
}
|
|
89
|
-
delIndex(e, t) {
|
|
90
|
-
return this._immediate.delIndex(e, t).run();
|
|
91
|
-
}
|
|
92
|
-
delIndexP(e, t) {
|
|
93
|
-
return this._immediate.delIndexP(e, t).run();
|
|
94
|
-
}
|
|
95
|
-
insert(e, t) {
|
|
96
|
-
return this._immediate.insert(e, t).run();
|
|
97
|
-
}
|
|
98
|
-
insertP(e, t) {
|
|
99
|
-
return this._immediate.insertP(e, t).run();
|
|
100
|
-
}
|
|
101
|
-
remove(e, t) {
|
|
102
|
-
return this._immediate.remove(e, t).run();
|
|
103
|
-
}
|
|
104
|
-
removeP(e, t) {
|
|
105
|
-
return this._immediate.removeP(e, t).run();
|
|
106
|
-
}
|
|
107
|
-
replace(e, t) {
|
|
108
|
-
return this._immediate.replace(e, t).run();
|
|
109
|
-
}
|
|
110
|
-
replaceP(e, t) {
|
|
111
|
-
return this._immediate.replaceP(e, t).run();
|
|
112
|
-
}
|
|
113
|
-
delDir(e) {
|
|
114
|
-
return this._immediate.delDir(e).run();
|
|
115
|
-
}
|
|
116
|
-
delDirP(e) {
|
|
117
|
-
return this._immediate.delDirP(e).run();
|
|
118
|
-
}
|
|
119
|
-
delFile(e) {
|
|
120
|
-
return this._immediate.delFile(e).run();
|
|
121
|
-
}
|
|
122
|
-
delFileP(e) {
|
|
123
|
-
return this._immediate.delFileP(e).run();
|
|
124
|
-
}
|
|
125
|
-
delContent(e) {
|
|
126
|
-
return this._immediate.delContent(e).run();
|
|
127
|
-
}
|
|
128
|
-
delContentP(e) {
|
|
129
|
-
return this._immediate.delContentP(e).run();
|
|
130
|
-
}
|
|
131
|
-
insertTrigger(e, t, r, i) {
|
|
132
|
-
return this._immediate.insertTrigger(e, t, r, i).run();
|
|
133
|
-
}
|
|
134
|
-
removeTrigger(e) {
|
|
135
|
-
return this._immediate.removeTrigger(e).run();
|
|
136
|
-
}
|
|
137
|
-
insertRpc(e, t) {
|
|
138
|
-
return this._immediate.insertRpc(e, t).run();
|
|
139
|
-
}
|
|
140
|
-
removeRpc(e) {
|
|
141
|
-
return this._immediate.removeRpc(e).run();
|
|
86
|
+
return this.currentBatch.createFile(e).run(), this.file(e);
|
|
142
87
|
}
|
|
143
88
|
on(e, t) {
|
|
144
89
|
return this.qyCache?.on(e, t);
|
|
@@ -149,5 +94,5 @@ class h extends t {
|
|
|
149
94
|
}
|
|
150
95
|
|
|
151
96
|
export {
|
|
152
|
-
|
|
97
|
+
n as QyDB
|
|
153
98
|
};
|
package/src/QyDefaultOptions.js
CHANGED
package/src/QyDir.js
CHANGED
|
@@ -6,17 +6,16 @@ import {
|
|
|
6
6
|
getSubdirMapKey as i,
|
|
7
7
|
getFileMapKey as t,
|
|
8
8
|
SpecialFilePaths as r,
|
|
9
|
-
arrayLast as s,
|
|
10
9
|
isString as d
|
|
11
10
|
} from "./QyUtils.js";
|
|
12
11
|
|
|
13
12
|
import {
|
|
14
|
-
QyFile as
|
|
13
|
+
QyFile as s
|
|
15
14
|
} from "./QyFile.js";
|
|
16
15
|
|
|
17
|
-
let
|
|
16
|
+
let a = r.HiddenFolderName;
|
|
18
17
|
|
|
19
|
-
class
|
|
18
|
+
class u extends e {
|
|
20
19
|
_subdirCount = 0;
|
|
21
20
|
_fileCount = 0;
|
|
22
21
|
subdirMapChangeCount = 0;
|
|
@@ -36,10 +35,10 @@ class h extends e {
|
|
|
36
35
|
++i.subdirMapChangeCount);
|
|
37
36
|
}
|
|
38
37
|
get fileCount() {
|
|
39
|
-
return
|
|
38
|
+
return n(this), this._fileCount;
|
|
40
39
|
}
|
|
41
40
|
get subdirCount() {
|
|
42
|
-
return
|
|
41
|
+
return l(this), this._subdirCount;
|
|
43
42
|
}
|
|
44
43
|
get isDir() {
|
|
45
44
|
return !0;
|
|
@@ -48,7 +47,7 @@ class h extends e {
|
|
|
48
47
|
return 0 == this.fileCount && 0 == this.subdirCount;
|
|
49
48
|
}
|
|
50
49
|
get isHiddenFolder() {
|
|
51
|
-
return this.name ==
|
|
50
|
+
return this.name == a;
|
|
52
51
|
}
|
|
53
52
|
get subdirMapKey() {
|
|
54
53
|
return this._subdirMapKey || (this._subdirMapKey = i(this.fullPathHash));
|
|
@@ -57,10 +56,10 @@ class h extends e {
|
|
|
57
56
|
return this._fileMapKey || (this._fileMapKey = t(this.fullPathHash));
|
|
58
57
|
}
|
|
59
58
|
get subdirMap() {
|
|
60
|
-
return
|
|
59
|
+
return l(this), this._subdirMap;
|
|
61
60
|
}
|
|
62
61
|
get fileMap() {
|
|
63
|
-
return
|
|
62
|
+
return n(this), this._fileMap;
|
|
64
63
|
}
|
|
65
64
|
getSubdir(e) {
|
|
66
65
|
var i;
|
|
@@ -80,13 +79,13 @@ class h extends e {
|
|
|
80
79
|
if ("/" === e) return this.qyCache?.rootDir || this;
|
|
81
80
|
let t = this.subdirMap;
|
|
82
81
|
var r = (t = t || (this._subdirMap = {}))[e];
|
|
83
|
-
return r || (r = t[e] = new
|
|
82
|
+
return r || (r = t[e] = new u(e, i, this), this.setChildTriggerNodes(r)),
|
|
84
83
|
r;
|
|
85
84
|
}
|
|
86
85
|
getOrCreateFile(e, i = !1) {
|
|
87
86
|
let t = this.fileMap;
|
|
88
87
|
var r = (t = t || (this._fileMap = {}))[e];
|
|
89
|
-
return r || (r = t[e] = new
|
|
88
|
+
return r || (r = t[e] = new s(e, i, this), this.setChildTriggerNodes(r)),
|
|
90
89
|
r;
|
|
91
90
|
}
|
|
92
91
|
searchSubdir(i, t = i.length) {
|
|
@@ -107,34 +106,34 @@ class h extends e {
|
|
|
107
106
|
}
|
|
108
107
|
searchFile(e) {
|
|
109
108
|
var i = this.searchSubdir(e, e.length - 1);
|
|
110
|
-
if (i) return i.getFile(
|
|
109
|
+
if (i) return i.getFile(e.at(-1));
|
|
111
110
|
}
|
|
112
111
|
searchOrCreateFile(e, i = !1) {
|
|
113
|
-
return this.searchOrCreateSubdir(e, i, e.length - 1).getOrCreateFile(
|
|
112
|
+
return this.searchOrCreateSubdir(e, i, e.length - 1).getOrCreateFile(e.at(-1), i);
|
|
114
113
|
}
|
|
115
114
|
get subdirList() {
|
|
116
|
-
return
|
|
115
|
+
return h(this, "_subdirList", this.subdirMapChangeCount, () => this.created && this.subdirMap ? Object.values(this.subdirMap).filter(e => e.created) : []);
|
|
117
116
|
}
|
|
118
117
|
get subdirNameList() {
|
|
119
|
-
return
|
|
118
|
+
return h(this, "_subdirNameList", this.subdirMapChangeCount, () => this.subdirList.map(e => e.name));
|
|
120
119
|
}
|
|
121
120
|
get sortedSubdirList() {
|
|
122
|
-
return
|
|
121
|
+
return h(this, "_sortedSubdirList", this.subdirMapChangeCount, () => this.subdirList.sort((e, i) => e.cmp(i)));
|
|
123
122
|
}
|
|
124
123
|
get sortedSubdirNameList() {
|
|
125
|
-
return
|
|
124
|
+
return h(this, "_sortedSubdirNameList", this.subdirMapChangeCount, () => this.sortedSubdirList.map(e => e.nameNum));
|
|
126
125
|
}
|
|
127
126
|
get fileList() {
|
|
128
|
-
return
|
|
127
|
+
return h(this, "_fileList", this.fileMapChangeCount, () => this.created && this.fileMap ? Object.values(this.fileMap).filter(e => e.created) : []);
|
|
129
128
|
}
|
|
130
129
|
get fileNameList() {
|
|
131
|
-
return
|
|
130
|
+
return h(this, "_fileNameList", this.fileMapChangeCount, () => this.fileList.map(e => e.name));
|
|
132
131
|
}
|
|
133
132
|
get sortedFileList() {
|
|
134
|
-
return
|
|
133
|
+
return h(this, "_sortedFileList", this.fileMapChangeCount, () => this.fileList.sort((e, i) => e.cmp(i)));
|
|
135
134
|
}
|
|
136
135
|
get sortedFileNameList() {
|
|
137
|
-
return
|
|
136
|
+
return h(this, "_sortedFileNameList", this.fileMapChangeCount, () => this.sortedFileList.map(e => e.nameNum));
|
|
138
137
|
}
|
|
139
138
|
*allSubdirs() {
|
|
140
139
|
var e, i, t = this.subdirList;
|
|
@@ -190,12 +189,12 @@ class h extends e {
|
|
|
190
189
|
}
|
|
191
190
|
}
|
|
192
191
|
|
|
193
|
-
function
|
|
192
|
+
function h(e, i, t, r) {
|
|
194
193
|
var e = e.cache, s = i + "ChangeCount";
|
|
195
194
|
return e[i] && e[s] == t || (e[i] = r(), e[s] = t), e[i];
|
|
196
195
|
}
|
|
197
196
|
|
|
198
|
-
function
|
|
197
|
+
function l(e) {
|
|
199
198
|
if (e.created && !e._subdirMap && !e.subdirMapLoaded) {
|
|
200
199
|
e.subdirMapLoaded = !0;
|
|
201
200
|
var i = e.qyCache;
|
|
@@ -203,13 +202,13 @@ function n(e) {
|
|
|
203
202
|
i = i.qyKVData.getValueSync(e.subdirMapKey);
|
|
204
203
|
if (i) {
|
|
205
204
|
var t, r = e._subdirMap = {};
|
|
206
|
-
for (t in i) r[t] = new
|
|
205
|
+
for (t in i) r[t] = new u(t, !0, e);
|
|
207
206
|
}
|
|
208
207
|
}
|
|
209
208
|
}
|
|
210
209
|
}
|
|
211
210
|
|
|
212
|
-
function
|
|
211
|
+
function n(e) {
|
|
213
212
|
if (e.created && !e._fileMap && !e.fileMapLoaded) {
|
|
214
213
|
e.fileMapLoaded = !0;
|
|
215
214
|
var i = e.qyCache;
|
|
@@ -217,12 +216,12 @@ function o(e) {
|
|
|
217
216
|
i = i.qyKVData.getValueSync(e.fileMapKey);
|
|
218
217
|
if (i) {
|
|
219
218
|
var t, r = e._fileMap = {};
|
|
220
|
-
for (t in i) r[t] = new
|
|
219
|
+
for (t in i) r[t] = new s(t, !0, e);
|
|
221
220
|
}
|
|
222
221
|
}
|
|
223
222
|
}
|
|
224
223
|
}
|
|
225
224
|
|
|
226
225
|
export {
|
|
227
|
-
|
|
226
|
+
u as QyDir
|
|
228
227
|
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { QyMessager } from "./QyMessager.ts";
|
|
2
|
+
export declare const WholeFileProp = "[\"\"]";
|
|
3
|
+
export declare class QyExpire extends QyMessager {
|
|
4
|
+
qyCache: any;
|
|
5
|
+
hashToFileMap: {};
|
|
6
|
+
maxSecond: number;
|
|
7
|
+
startTime: any;
|
|
8
|
+
constructor(qyCache: any, options?: any);
|
|
9
|
+
monitorContentExpire(file: any, flattedAbsSecondObj: any): void;
|
|
10
|
+
unmonitorContentExpire(file: any, flattedDelObj: any): void;
|
|
11
|
+
onExpireEmpty(maxSecond: any): void;
|
|
12
|
+
onFileAllExpireRemoved(fullPathHash: any): void;
|
|
13
|
+
onContentExpired(expiredInfoMap: any): void;
|
|
14
|
+
}
|
|
15
|
+
export declare function flatObj(obj: any, path?: any[], flatted?: {}): {};
|
|
16
|
+
export declare function analyzeExpireInfo(expireInfoObj: any, nowSeconds?: number): {
|
|
17
|
+
expiredProps: any[];
|
|
18
|
+
remainingExpireInfoObj: {};
|
|
19
|
+
toDeleteFile: any;
|
|
20
|
+
};
|
|
21
|
+
export declare function handleExpiredProps(qyDB: any, file: any, expiredProps: any, toDeleteFile: any): void;
|
package/src/QyExpire.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import {
|
|
2
|
+
QyMessager as e
|
|
3
|
+
} from "./QyMessager.js";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
getDefaultOptions as i
|
|
7
|
+
} from "./QyDefaultOptions.js";
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
getNowSeconds as a,
|
|
11
|
+
isSimpleType as o
|
|
12
|
+
} from "./QyUtils.js";
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
setValByNamePath as s
|
|
16
|
+
} from "./QyFileContentUtils.js";
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
SpecialOperators as t
|
|
20
|
+
} from "./QyUtils.js";
|
|
21
|
+
|
|
22
|
+
import "./QyLogger.js";
|
|
23
|
+
|
|
24
|
+
import "node:util";
|
|
25
|
+
|
|
26
|
+
let n = t.$del, r = '[""]';
|
|
27
|
+
|
|
28
|
+
class p extends e {
|
|
29
|
+
qyCache;
|
|
30
|
+
hashToFileMap = {};
|
|
31
|
+
maxSecond = 0;
|
|
32
|
+
startTime;
|
|
33
|
+
constructor(e, t = void 0) {
|
|
34
|
+
super("QyExpire_Worker", t = {
|
|
35
|
+
...i("QyExpire"),
|
|
36
|
+
...t
|
|
37
|
+
}, t, [], [ "setStartTime", "setContentExpire", "removeContentExpire" ]),
|
|
38
|
+
Object.assign(this, {
|
|
39
|
+
qyCache: e
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
monitorContentExpire(e, t) {
|
|
43
|
+
(s = this).startTime || s.setStartTime(s.startTime = a());
|
|
44
|
+
var i, {
|
|
45
|
+
startTime: r,
|
|
46
|
+
hashToFileMap: s
|
|
47
|
+
} = this;
|
|
48
|
+
for (i in t) {
|
|
49
|
+
var o = t[i] - r;
|
|
50
|
+
(t[i] = o) > this.maxSecond && (this.maxSecond = o);
|
|
51
|
+
}
|
|
52
|
+
var n = e.fullPathHash;
|
|
53
|
+
this.setContentExpire(n, t), s[n] = e;
|
|
54
|
+
}
|
|
55
|
+
unmonitorContentExpire(e, t) {
|
|
56
|
+
this.startTime && this.removeCOntentExpire(e.fullPathHash, Object.keys(t));
|
|
57
|
+
}
|
|
58
|
+
onExpireEmpty(e) {
|
|
59
|
+
e == this.maxSecond && Object.assign(this, {
|
|
60
|
+
startTime: void 0,
|
|
61
|
+
maxSecond: 0
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
onFileAllExpireRemoved(e) {
|
|
65
|
+
delete this.hashToFileMap[e];
|
|
66
|
+
}
|
|
67
|
+
onContentExpired(e) {
|
|
68
|
+
var t, {
|
|
69
|
+
qyCache: i,
|
|
70
|
+
hashToFileMap: r
|
|
71
|
+
} = this, s = i.qyDB;
|
|
72
|
+
for (t in e) {
|
|
73
|
+
var {
|
|
74
|
+
expiredProps: o,
|
|
75
|
+
toDeleteFile: n
|
|
76
|
+
} = e[t];
|
|
77
|
+
h(s, r[t], o, n);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function l(e, t = [], i = {}) {
|
|
83
|
+
if (o(e)) i[JSON.stringify(t)] = e; else {
|
|
84
|
+
var r, s = t.length;
|
|
85
|
+
for (r in e) t.push(r), l(e[r], t, i), t.length = s;
|
|
86
|
+
}
|
|
87
|
+
return i;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function m(e, t = a()) {
|
|
91
|
+
var i, r = [], s = {}, o = e['[""]'], o = o && o <= t;
|
|
92
|
+
for (i in e) {
|
|
93
|
+
var n = e[i];
|
|
94
|
+
n <= t ? r.push(i) : s[i] = n;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
expiredProps: r,
|
|
98
|
+
remainingExpireInfoObj: s,
|
|
99
|
+
toDeleteFile: o
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function h(e, t, i, r) {
|
|
104
|
+
r && e.delFile(t), 0 < i.length && (e.removeContentExpire(t, i, !0), r || e.insert(t, i.reduce((e, t) => s(e, JSON.parse(t), n), {}), !0));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export {
|
|
108
|
+
r as WholeFileProp,
|
|
109
|
+
p as QyExpire,
|
|
110
|
+
l as flatObj,
|
|
111
|
+
m as analyzeExpireInfo,
|
|
112
|
+
h as handleExpiredProps
|
|
113
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import EventEmitter from "node:events";
|
|
2
|
+
export declare const ExpiredEventName = "expired";
|
|
3
|
+
export declare class QyExpireClock extends EventEmitter {
|
|
4
|
+
startTime: number;
|
|
5
|
+
seconds: number;
|
|
6
|
+
expireMap: {};
|
|
7
|
+
interval: any;
|
|
8
|
+
options: any;
|
|
9
|
+
constructor(options?: any);
|
|
10
|
+
start(): void;
|
|
11
|
+
stop(): void;
|
|
12
|
+
get currentTime(): number;
|
|
13
|
+
addExpire(expireSeconds: any): void;
|
|
14
|
+
inc(deltaSeconds?: number): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import t from "node:events";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
getDefaultOptions as e
|
|
5
|
+
} from "./QyDefaultOptions.js";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
getNowSeconds as s
|
|
9
|
+
} from "./QyUtils.js";
|
|
10
|
+
|
|
11
|
+
let i = "expired";
|
|
12
|
+
|
|
13
|
+
class r extends t {
|
|
14
|
+
startTime = 0;
|
|
15
|
+
seconds = 0;
|
|
16
|
+
expireMap = {};
|
|
17
|
+
interval;
|
|
18
|
+
options;
|
|
19
|
+
constructor(t = void 0) {
|
|
20
|
+
super(), this.options = {
|
|
21
|
+
...e("QyExpireClock"),
|
|
22
|
+
...t
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
start() {
|
|
26
|
+
this.startTime = s(), this.interval = setInterval(this.inc.bind(this), this.options.expireInterval);
|
|
27
|
+
}
|
|
28
|
+
stop() {
|
|
29
|
+
var t = this.interval;
|
|
30
|
+
t && (clearInterval(t), this.interval = void 0);
|
|
31
|
+
}
|
|
32
|
+
get currentTime() {
|
|
33
|
+
return this.startTime + this.seconds;
|
|
34
|
+
}
|
|
35
|
+
addExpire(t) {
|
|
36
|
+
var {
|
|
37
|
+
startTime: e,
|
|
38
|
+
currentTime: i,
|
|
39
|
+
expireMap: s
|
|
40
|
+
} = this;
|
|
41
|
+
t <= i ? this.emit("expired", t) : s[t - e] = 1;
|
|
42
|
+
}
|
|
43
|
+
inc(e = s() - this.currentTime) {
|
|
44
|
+
var i = this.expireMap;
|
|
45
|
+
for (let t = 0; t < e; ++t) i[++this.seconds] && (this.emit("expired", this.currentTime),
|
|
46
|
+
delete i[this.seconds]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export {
|
|
51
|
+
i as ExpiredEventName,
|
|
52
|
+
r as QyExpireClock
|
|
53
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { QyMessageWorker } from "./QyMessageWorker.ts";
|
|
2
|
+
export default class QyExpire_Worker extends QyMessageWorker {
|
|
3
|
+
startTime: any;
|
|
4
|
+
seconds: number;
|
|
5
|
+
maxSecond: number;
|
|
6
|
+
interval: any;
|
|
7
|
+
hashPropSecondMap: {};
|
|
8
|
+
secondHashPropMap: {};
|
|
9
|
+
hashSecondMap: {};
|
|
10
|
+
secondDirMap: {};
|
|
11
|
+
emptyFileHashList: never[];
|
|
12
|
+
constructor(options: any);
|
|
13
|
+
get currentTime(): any;
|
|
14
|
+
setStartTime(startTime: any): void;
|
|
15
|
+
setContentExpire(fullPathHash: any, flattedRelativeSecondObj: any): void;
|
|
16
|
+
removeContentExpire(fullPathHash: any, propNamePathStrList: any): void;
|
|
17
|
+
_inc(deltaSeconds?: number): void;
|
|
18
|
+
_op_start(): void;
|
|
19
|
+
_op_stop(): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getDefaultOptions as t
|
|
3
|
+
} from "./QyDefaultOptions.js";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
QyMessageWorker as e
|
|
7
|
+
} from "./QyMessageWorker.js";
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
getValByNamePath as x,
|
|
11
|
+
setValByNamePath as y
|
|
12
|
+
} from "./QyFileContentUtils.js";
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
getNowSeconds as v,
|
|
16
|
+
isEmptyObj as a
|
|
17
|
+
} from "./QyUtils.js";
|
|
18
|
+
|
|
19
|
+
import "./QyLogger.js";
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
WholeFileProp as P
|
|
23
|
+
} from "./QyExpire.js";
|
|
24
|
+
|
|
25
|
+
var {} = Array;
|
|
26
|
+
|
|
27
|
+
export default class extends e {
|
|
28
|
+
startTime;
|
|
29
|
+
seconds = 0;
|
|
30
|
+
maxSecond = 0;
|
|
31
|
+
interval;
|
|
32
|
+
hashPropSecondMap = {};
|
|
33
|
+
secondHashPropMap = {};
|
|
34
|
+
hashSecondMap = {};
|
|
35
|
+
secondDirMap = {};
|
|
36
|
+
emptyFileHashList = [];
|
|
37
|
+
constructor(e) {
|
|
38
|
+
super(e = {
|
|
39
|
+
...t("QyExpire_Worker"),
|
|
40
|
+
...e
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
get currentTime() {
|
|
44
|
+
return this.startTime + this.seconds;
|
|
45
|
+
}
|
|
46
|
+
setStartTime(e) {
|
|
47
|
+
Object.assign(this, {
|
|
48
|
+
startTime: e,
|
|
49
|
+
seconds: 0
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
setContentExpire(e, t) {
|
|
53
|
+
var s, {
|
|
54
|
+
interval: r,
|
|
55
|
+
options: o,
|
|
56
|
+
seconds: i
|
|
57
|
+
} = this, a = (r || (this.interval = setInterval(this._inc.bind(this), o.expireInterval)),
|
|
58
|
+
[]);
|
|
59
|
+
let n;
|
|
60
|
+
for (s in t) {
|
|
61
|
+
var p = t[s];
|
|
62
|
+
if (p <= i) a.push(s), s == P && (n = !0); else {
|
|
63
|
+
f = m = v = c = d = h = l = void 0;
|
|
64
|
+
var l = this, h = e, d = s, c = p, {
|
|
65
|
+
hashPropSecondMap: v,
|
|
66
|
+
secondHashPropMap: m
|
|
67
|
+
} = l, f = x(v, [ h, d ]);
|
|
68
|
+
c != f && (y(v, [ h, d ], c), y(m, [ c, h, d ], 1), null != f && u(l, f, h, d),
|
|
69
|
+
c > l.maxSecond) && (l.maxSecond = c);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
0 < a.length && (r = {
|
|
73
|
+
expiredProps: a
|
|
74
|
+
}, n && (r.toDeleteFile = !0), this.postParent("onContentExpired", r));
|
|
75
|
+
}
|
|
76
|
+
removeContentExpire(e, t) {
|
|
77
|
+
var s, r, o;
|
|
78
|
+
if (this.interval) for (var i of t) s = this, r = e, i = i, o = void 0,
|
|
79
|
+
o = s.hashPropSecondMap, null != (o = x(o, [ r, i ])) && (m(s, r, i), u(s, o, r, i));
|
|
80
|
+
}
|
|
81
|
+
_inc(t = v() - this.currentTime) {
|
|
82
|
+
for (let e = 0; e < t; ++e) {
|
|
83
|
+
++this.seconds, a = p = h = l = n = i = o = r = s = void 0;
|
|
84
|
+
var s = this, r = this.seconds, o = s.secondHashPropMap, i = o[r];
|
|
85
|
+
if (i) {
|
|
86
|
+
var a, n = {};
|
|
87
|
+
for (a in i) {
|
|
88
|
+
var p, l = Object.keys(i[a]), h = {
|
|
89
|
+
expiredProps: l
|
|
90
|
+
};
|
|
91
|
+
for (p of l) m(s, a, p), p == P && (h.toDeleteFile = !0);
|
|
92
|
+
n[a] = h;
|
|
93
|
+
}
|
|
94
|
+
s.postParent("onContentExpired", n), delete o[r];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
var {
|
|
98
|
+
emptyFileHashList: e,
|
|
99
|
+
maxSecond: d,
|
|
100
|
+
interval: c
|
|
101
|
+
} = this;
|
|
102
|
+
0 < e.length && (this.postParent("onFileAllExpireRemoved", e), e.length = 0),
|
|
103
|
+
this.seconds > d && (this.postParent("onExpireEmpty", d), clearInterval(c),
|
|
104
|
+
Object.assign(this, {
|
|
105
|
+
interval: void 0,
|
|
106
|
+
maxSecond: 0
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
_op_start() {}
|
|
110
|
+
_op_stop() {
|
|
111
|
+
var e = this.interval;
|
|
112
|
+
e && (clearInterval(e), this.interval = void 0);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function m(e, t, s) {
|
|
117
|
+
var {
|
|
118
|
+
hashPropSecondMap: e,
|
|
119
|
+
emptyFileHashList: r
|
|
120
|
+
} = e;
|
|
121
|
+
delete e[t][s], a(e[t]) && (delete e[t], r.push(t));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function u(e, t, s, r) {
|
|
125
|
+
var e = e.secondHashPropMap, o = e[t], i = o[s];
|
|
126
|
+
delete i[r], a(i) && (delete o[s], a(o)) && delete e[t];
|
|
127
|
+
}
|