datafolder 1.0.10 → 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/{internal.md → Internal.md} +8 -1
- package/README.md +15 -1
- package/SKILL.md +191 -0
- package/SSD.md +3 -3
- package/package.json +2 -2
- 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/QyAclWriter.d.ts +1 -1
- package/src/QyBatch.d.ts +8 -11
- package/src/QyBatch.js +239 -211
- package/src/QyBinWriter.d.ts +2 -2
- 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 +5 -2
- package/src/QyKVData.js +126 -114
- package/src/QyKVDataCleaner.js +2 -2
- package/src/QyKVDataCleaner_Worker.js +37 -37
- 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/QyLogger.d.ts +1 -0
- package/src/QyLogger.js +1 -0
- 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 +12 -8
- 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.d.ts +1 -1
- package/src/QySnapshotCompactor_Worker.js +5 -5
- package/src/QySnapshotSaver.js +2 -2
- package/src/QySnapshotSaver_Worker.js +4 -4
- package/src/QySnapshots.d.ts +2 -2
- package/src/QySnapshots.js +38 -38
- 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 +5 -5
- 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
|
+
}
|