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.
Files changed (62) hide show
  1. package/README.md +12 -0
  2. package/package.json +1 -1
  3. package/scripts/flights2.js +2 -0
  4. package/src/QyAcl.d.ts +13 -7
  5. package/src/QyAcl.js +122 -138
  6. package/src/QyAclSaver.js +2 -2
  7. package/src/QyAclSaver_Worker.d.ts +2 -2
  8. package/src/QyBatch.d.ts +8 -11
  9. package/src/QyBatch.js +239 -211
  10. package/src/QyBinWriter.d.ts +1 -1
  11. package/src/QyBinWriter.js +15 -15
  12. package/src/QyCD.d.ts +2 -2
  13. package/src/QyCD.js +29 -29
  14. package/src/QyCache.d.ts +6 -1
  15. package/src/QyCache.js +72 -53
  16. package/src/QyCompressor.d.ts +2 -2
  17. package/src/QyCompressor.js +13 -13
  18. package/src/QyDB.d.ts +1 -22
  19. package/src/QyDB.js +23 -78
  20. package/src/QyDefaultOptions.js +5 -0
  21. package/src/QyDir.js +26 -27
  22. package/src/QyExpire.d.ts +21 -0
  23. package/src/QyExpire.js +113 -0
  24. package/src/QyExpireClock.d.ts +15 -0
  25. package/src/QyExpireClock.js +53 -0
  26. package/src/QyExpire_Worker.d.ts +20 -0
  27. package/src/QyExpire_Worker.js +127 -0
  28. package/src/QyFile.js +36 -25
  29. package/src/QyFileContentUtils.js +21 -21
  30. package/src/QyItem.d.ts +1 -0
  31. package/src/QyItem.js +15 -9
  32. package/src/QyJsonSaver.d.ts +1 -1
  33. package/src/QyJsonSaver.js +1 -1
  34. package/src/QyKVData.d.ts +4 -1
  35. package/src/QyKVData.js +148 -136
  36. package/src/QyKVDataCleaner.js +2 -2
  37. package/src/QyKVDataSaver.js +2 -2
  38. package/src/QyKVDataSaver_Worker.d.ts +2 -2
  39. package/src/QyKVDataSaver_Worker.js +5 -5
  40. package/src/QyLogFileSaver.js +2 -2
  41. package/src/QyMessageWorker.d.ts +1 -1
  42. package/src/QyMessageWorker.js +10 -10
  43. package/src/QyMessager.d.ts +1 -1
  44. package/src/QyMessager.js +37 -36
  45. package/src/QyMessager_Run.js +9 -6
  46. package/src/QyQueue.js +8 -12
  47. package/src/QySaver.d.ts +1 -1
  48. package/src/QySaver.js +1 -1
  49. package/src/QySnapshotCompactor.js +2 -2
  50. package/src/QySnapshotCompactor_Worker.js +1 -1
  51. package/src/QySnapshotSaver.js +2 -2
  52. package/src/QySnapshotSaver_Worker.js +1 -1
  53. package/src/QyTrigger.d.ts +1 -1
  54. package/src/QyTrigger.js +20 -21
  55. package/src/QyUtils.d.ts +3 -2
  56. package/src/QyUtils.js +93 -86
  57. package/src/hackernews.js +1 -1
  58. package/src/simulate.js +6 -6
  59. package/src/simulate2.js +4 -4
  60. package/src/soc_pokec.js +1 -1
  61. package/static/codemirror.bundle/editor.bundle.js +43 -9
  62. 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 n
14
+ QyCache as a
15
15
  } from "./QyCache.js";
16
16
 
17
17
  import {
18
- getDefaultOptions as a
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 m
27
+ __dirname as c
28
28
  } from "./QyUtils.js";
29
29
 
30
- let d = e(m, "../data/sampleDataFolder");
30
+ let h = e(c, "../data/sampleDataFolder");
31
31
 
32
- class h extends t {
32
+ class n extends t {
33
33
  rootFolder;
34
34
  options;
35
35
  fetch;
36
36
  batch;
37
37
  _immediate;
38
- constructor(e = d, t) {
39
- s(e) && (t = e, e = d), super(), this.options = {
40
- ...a("QyDB"),
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 n(this.rootFolder, e, this), Object.assign(this, {
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
- createDir(e) {
72
- return this._immediate.createDir(e).run(), this.dir(e);
75
+ get currentBatch() {
76
+ var {
77
+ batch: e,
78
+ _immediate: t
79
+ } = this;
80
+ return e.running ? e : t;
73
81
  }
74
- createDirP(e) {
75
- return this._immediate.createDirP(e).run(), this.dirP(e);
82
+ createDir(e) {
83
+ return this.currentBatch.createDir(e).run(), this.dir(e);
76
84
  }
77
85
  createFile(e) {
78
- return this._immediate.createFile(e).run(), this.file(e);
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
- h as QyDB
97
+ n as QyDB
153
98
  };
@@ -1,3 +1,5 @@
1
+ import "./QyExpire.js";
2
+
1
3
  var e = {
2
4
  append: !1,
3
5
  retryIntervalFactor: 2,
@@ -54,6 +56,9 @@ let t = {
54
56
  },
55
57
  QyKVDataSaver_Worker: {
56
58
  noAcl: !1
59
+ },
60
+ QyExpireClock: {
61
+ expireInterval: 1e3
57
62
  }
58
63
  };
59
64
 
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 a
13
+ QyFile as s
15
14
  } from "./QyFile.js";
16
15
 
17
- let u = r.HiddenFolderName;
16
+ let a = r.HiddenFolderName;
18
17
 
19
- class h extends e {
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 o(this), this._fileCount;
38
+ return n(this), this._fileCount;
40
39
  }
41
40
  get subdirCount() {
42
- return n(this), this._subdirCount;
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 == u;
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 n(this), this._subdirMap;
59
+ return l(this), this._subdirMap;
61
60
  }
62
61
  get fileMap() {
63
- return o(this), this._fileMap;
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 h(e, i, this), this.setChildTriggerNodes(r)),
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 a(e, i, this), this.setChildTriggerNodes(r)),
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(s(e));
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(s(e), i);
112
+ return this.searchOrCreateSubdir(e, i, e.length - 1).getOrCreateFile(e.at(-1), i);
114
113
  }
115
114
  get subdirList() {
116
- return l(this, "_subdirList", this.subdirMapChangeCount, () => this.created && this.subdirMap ? Object.values(this.subdirMap).filter(e => e.created) : []);
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 l(this, "_subdirNameList", this.subdirMapChangeCount, () => this.subdirList.map(e => e.name));
118
+ return h(this, "_subdirNameList", this.subdirMapChangeCount, () => this.subdirList.map(e => e.name));
120
119
  }
121
120
  get sortedSubdirList() {
122
- return l(this, "_sortedSubdirList", this.subdirMapChangeCount, () => this.subdirList.sort((e, i) => e.cmp(i)));
121
+ return h(this, "_sortedSubdirList", this.subdirMapChangeCount, () => this.subdirList.sort((e, i) => e.cmp(i)));
123
122
  }
124
123
  get sortedSubdirNameList() {
125
- return l(this, "_sortedSubdirNameList", this.subdirMapChangeCount, () => this.sortedSubdirList.map(e => e.nameNum));
124
+ return h(this, "_sortedSubdirNameList", this.subdirMapChangeCount, () => this.sortedSubdirList.map(e => e.nameNum));
126
125
  }
127
126
  get fileList() {
128
- return l(this, "_fileList", this.fileMapChangeCount, () => this.created && this.fileMap ? Object.values(this.fileMap).filter(e => e.created) : []);
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 l(this, "_fileNameList", this.fileMapChangeCount, () => this.fileList.map(e => e.name));
130
+ return h(this, "_fileNameList", this.fileMapChangeCount, () => this.fileList.map(e => e.name));
132
131
  }
133
132
  get sortedFileList() {
134
- return l(this, "_sortedFileList", this.fileMapChangeCount, () => this.fileList.sort((e, i) => e.cmp(i)));
133
+ return h(this, "_sortedFileList", this.fileMapChangeCount, () => this.fileList.sort((e, i) => e.cmp(i)));
135
134
  }
136
135
  get sortedFileNameList() {
137
- return l(this, "_sortedFileNameList", this.fileMapChangeCount, () => this.sortedFileList.map(e => e.nameNum));
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 l(e, i, t, r) {
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 n(e) {
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 h(t, !0, e);
205
+ for (t in i) r[t] = new u(t, !0, e);
207
206
  }
208
207
  }
209
208
  }
210
209
  }
211
210
 
212
- function o(e) {
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 a(t, !0, e);
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
- h as QyDir
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;
@@ -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
+ }