datafolder 1.0.11 → 1.0.13

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 (75) hide show
  1. package/README.md +16 -0
  2. package/package.json +1 -1
  3. package/scripts/airbnb.js +1 -1
  4. package/scripts/airbnb2.js +1 -1
  5. package/scripts/flights.js +2 -2
  6. package/scripts/flights2.js +4 -2
  7. package/src/QyAcl.d.ts +13 -7
  8. package/src/QyAcl.js +122 -138
  9. package/src/QyAclSaver.js +2 -2
  10. package/src/QyAclSaver_Worker.d.ts +2 -2
  11. package/src/QyBatch.d.ts +16 -12
  12. package/src/QyBatch.js +339 -228
  13. package/src/QyBinWriter.d.ts +1 -1
  14. package/src/QyBinWriter.js +15 -15
  15. package/src/QyCD.d.ts +2 -2
  16. package/src/QyCD.js +29 -29
  17. package/src/QyCache.d.ts +9 -1
  18. package/src/QyCache.js +110 -73
  19. package/src/QyCompressor.d.ts +2 -2
  20. package/src/QyCompressor.js +13 -13
  21. package/src/QyDB.d.ts +4 -22
  22. package/src/QyDB.js +49 -89
  23. package/src/QyDefaultOptions.js +2 -0
  24. package/src/QyDir.d.ts +1 -0
  25. package/src/QyDir.js +58 -30
  26. package/src/QyExpire.d.ts +15 -0
  27. package/src/QyExpire.js +105 -0
  28. package/src/QyExpireInfo.d.ts +10 -0
  29. package/src/QyExpireInfo.js +92 -0
  30. package/src/QyExpire_Worker.d.ts +19 -0
  31. package/src/QyExpire_Worker.js +112 -0
  32. package/src/QyFile.d.ts +1 -1
  33. package/src/QyFile.js +68 -42
  34. package/src/QyFileContentUtils.d.ts +1 -0
  35. package/src/QyFileContentUtils.js +108 -94
  36. package/src/QyItem.d.ts +7 -0
  37. package/src/QyItem.js +39 -15
  38. package/src/QyJsonSaver.d.ts +1 -1
  39. package/src/QyJsonSaver.js +1 -1
  40. package/src/QyKVData.d.ts +6 -1
  41. package/src/QyKVData.js +176 -157
  42. package/src/QyKVDataCleaner.js +2 -2
  43. package/src/QyKVDataSaver.js +2 -2
  44. package/src/QyKVDataSaver_Worker.d.ts +2 -2
  45. package/src/QyKVDataSaver_Worker.js +5 -5
  46. package/src/QyLogFileSaver.js +2 -2
  47. package/src/QyMessageWorker.d.ts +1 -1
  48. package/src/QyMessageWorker.js +10 -10
  49. package/src/QyMessager.d.ts +1 -1
  50. package/src/QyMessager.js +37 -36
  51. package/src/QyMessager_Run.js +9 -6
  52. package/src/QyQueue.js +8 -12
  53. package/src/QySaver.d.ts +1 -1
  54. package/src/QySaver.js +1 -1
  55. package/src/QySnapshotCompactor.js +2 -2
  56. package/src/QySnapshotCompactor_Worker.js +1 -1
  57. package/src/QySnapshotSaver.js +2 -2
  58. package/src/QySnapshotSaver_Worker.js +1 -1
  59. package/src/QyTrigger.d.ts +1 -1
  60. package/src/QyTrigger.js +20 -21
  61. package/src/QyUtils.d.ts +5 -2
  62. package/src/QyUtils.js +112 -98
  63. package/src/hackernews.js +1 -1
  64. package/src/simulate.js +6 -6
  65. package/src/simulate2.js +4 -4
  66. package/src/soc_pokec.js +1 -1
  67. package/static/codemirror.bundle/editor.bundle.js +49 -10
  68. package/static/datafolderui/QyUIFolderViewer.js +1 -5
  69. package/src/rpc/evalCode.js +0 -9
  70. package/src/rpc/getFileContent.js +0 -16
  71. package/src/rpc/getRpcFiles.js +0 -1
  72. package/src/rpc/getSubItems.js +0 -16
  73. package/src/rpc/getTriggerFiles.js +0 -1
  74. package/src/rpc/queryFiles.js +0 -10
  75. package/src/rpc/reloadRpc.js +0 -1
@@ -0,0 +1,92 @@
1
+ import {
2
+ getValByNamePath as i,
3
+ setValByNamePath as p,
4
+ delValByNamePath as l
5
+ } from "./QyFileContentUtils.js";
6
+
7
+ import {
8
+ isEmptyObj as T
9
+ } from "./QyUtils.js";
10
+
11
+ class e {
12
+ hashPropTimeMap = {};
13
+ secondTimeHashPropMap = {};
14
+ get isEmpty() {
15
+ return T(this.hashPropTimeMap);
16
+ }
17
+ setExpireInfo(e, a, r = void 0) {
18
+ var {
19
+ hashPropTimeMap: t,
20
+ secondTimeHashPropMap: s
21
+ } = this, o = r ? i(t, [ e, r ]) : t[e];
22
+ o != a && (r ? p(t, [ e, r ], a) : t[e] = a, p(s, h(a, e, r), 1), null != o) && l(s, h(o, e, r));
23
+ }
24
+ removeExpireInfo(e, a = void 0) {
25
+ var {
26
+ hashPropTimeMap: r,
27
+ secondTimeHashPropMap: t
28
+ } = this, s = a ? i(r, [ e, a ]) : r[e];
29
+ null != s && (a ? l(r, [ e, a ]) : delete r[e], l(t, h(s, e, a)));
30
+ }
31
+ processExpired(e, a, r, t) {
32
+ if (!(this.isEmpty || e <= a)) {
33
+ var {
34
+ hashPropTimeMap: s,
35
+ secondTimeHashPropMap: o
36
+ } = this, i = j(e), p = j(a), l = o, h = r, n = i;
37
+ for (let e = p; e < n - 1; ++e) {
38
+ var f = l[e];
39
+ if (f) {
40
+ for (var m of Object.values(f)) E(h, m);
41
+ delete l[e];
42
+ }
43
+ }
44
+ var v, d = o[i];
45
+ if (d) {
46
+ var u = e % 1e3;
47
+ for (let e = i != p ? 0 : a % 1e3 + 1; e <= u; ++e) {
48
+ var c = d[e];
49
+ c && (E(r, c), delete d[e]);
50
+ }
51
+ T(d) && delete o[i];
52
+ }
53
+ for (v in r) {
54
+ var P = r[v];
55
+ if (1 == P) delete s[v]; else {
56
+ var M, y = s[v];
57
+ for (M of P) delete y[M];
58
+ T(y) && (delete s[v], t.push(v));
59
+ }
60
+ }
61
+ }
62
+ }
63
+ }
64
+
65
+ function E(a, e) {
66
+ for (var r in e) {
67
+ var t = e[r];
68
+ if (1 == t) a[r] = 1; else {
69
+ let e = a[r];
70
+ (e = e || (a[r] = [])).push(...Object.keys(t));
71
+ }
72
+ }
73
+ }
74
+
75
+ function h(e, a, r = void 0) {
76
+ e = [ j(e), e % 1e3, a ];
77
+ return null != r && e.push(r), e;
78
+ }
79
+
80
+ function j(e) {
81
+ return Math.floor(e / 1e3);
82
+ }
83
+
84
+ function a(e) {
85
+ return e % 1e3;
86
+ }
87
+
88
+ export {
89
+ e as QyExpireInfo,
90
+ j as getSecond,
91
+ a as getSecondM
92
+ };
@@ -0,0 +1,19 @@
1
+ import { QyMessageWorker } from "./QyMessageWorker.ts";
2
+ import { QyExpireInfo } from "./QyExpireInfo.ts";
3
+ export default class QyExpire_Worker extends QyMessageWorker {
4
+ roundedStartTime: any;
5
+ checkedTime: number;
6
+ roundTimer: any;
7
+ secondInterval: any;
8
+ milliSecondInterval: any;
9
+ emptyHashList: any;
10
+ qyExpireInfo: QyExpireInfo;
11
+ constructor(options: any);
12
+ setRoundedStartTime(roundedStartTime: any): void;
13
+ setItemExpire(hashKey: any, expireTime: any): void;
14
+ removeItemExpire(hashKey: any): void;
15
+ setContentExpire(hashKey: any, flattedRelativeTimeObj: any): void;
16
+ removeContentExpire(hashKey: any, propNamePathStrList: any): void;
17
+ _op_start(): void;
18
+ _op_stop(): void;
19
+ }
@@ -0,0 +1,112 @@
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
+ getNowTime as r,
11
+ isEmptyObj as c
12
+ } from "./QyUtils.js";
13
+
14
+ import {
15
+ getSecond as d,
16
+ getSecondM as l,
17
+ QyExpireInfo as i
18
+ } from "./QyExpireInfo.js";
19
+
20
+ export default class extends e {
21
+ roundedStartTime;
22
+ checkedTime = 0;
23
+ roundTimer;
24
+ secondInterval;
25
+ milliSecondInterval;
26
+ emptyHashList = [];
27
+ qyExpireInfo = new i();
28
+ constructor(e) {
29
+ super(e = {
30
+ ...t("QyExpire_Worker"),
31
+ ...e
32
+ });
33
+ }
34
+ setRoundedStartTime(e) {
35
+ Object.assign(this, {
36
+ roundedStartTime: e,
37
+ checkedTime: 0
38
+ });
39
+ }
40
+ setItemExpire(e, t) {
41
+ var {
42
+ checkedTime: r,
43
+ qyExpireInfo: i
44
+ } = this, o = h(this), n = {};
45
+ t <= o ? n[e] = 1 : i.setExpireInfo(e, t), r || (this.checkedTime = o),
46
+ v(this, !1, o, n);
47
+ }
48
+ removeItemExpire(e) {
49
+ var t = this.qyExpireInfo;
50
+ t.isEmpty || (t.removeExpireInfo(e), v(this));
51
+ }
52
+ setContentExpire(e, t) {
53
+ var r, {
54
+ checkedTime: i,
55
+ qyExpireInfo: o,
56
+ emptyHashList: n
57
+ } = this, s = h(this);
58
+ let a;
59
+ for (r in t) {
60
+ var m = t[r];
61
+ m <= s ? a ? a.push(r) : a = [ r ] : o.setExpireInfo(e, m, r);
62
+ }
63
+ var p = a ? {
64
+ [e]: a
65
+ } : {};
66
+ o.hashPropTimeMap[e] || n.push(e), i || (this.checkedTime = s), v(this, !1, s, p);
67
+ }
68
+ removeContentExpire(e, t) {
69
+ var r = this.qyExpireInfo;
70
+ if (!r.isEmpty) {
71
+ for (var i of t) r.removeExpireInfo(e, i);
72
+ v(this);
73
+ }
74
+ }
75
+ _op_start() {}
76
+ _op_stop() {
77
+ u(this);
78
+ }
79
+ }
80
+
81
+ function h(e) {
82
+ return r() - e.roundedStartTime;
83
+ }
84
+
85
+ function v(e, t = !1, r = h(e), i = {}) {
86
+ var o, n, s, {
87
+ qyExpireInfo: a,
88
+ checkedTime: m,
89
+ emptyHashList: p
90
+ } = e;
91
+ m != r && (a.processExpired(r, m, i, p), e.checkedTime = r), c(i) || e.postParent("onExpired", i),
92
+ 0 < p.length && (e.postParent("onEmptyHashList", p), p.length = 0), a.isEmpty ? u(e) : c(a.secondTimeHashPropMap[d(r)]) ? (f(e),
93
+ t || e.secondInterval ? (n = e).secondInterval || (I(n), n.secondInterval = setInterval(() => v(n, !0), 1e3)) : (s = e,
94
+ m = 1e3 - l(r), s.roundTimer || (s.roundTimer = setTimeout(() => v(s, !0), m)))) : (o = e).milliSecondInterval || (I(o),
95
+ o.milliSecondInterval = setInterval(() => v(o), 1));
96
+ }
97
+
98
+ function I(e) {
99
+ var t = e.roundTimer;
100
+ t && (clearTimeout(t), e.roundTimer = void 0);
101
+ }
102
+
103
+ function f(e) {
104
+ var t = e.milliSecondInterval;
105
+ t && (clearInterval(t), e.milliSecondInterval = void 0);
106
+ }
107
+
108
+ function u(e) {
109
+ var t, r;
110
+ I(e), (r = (t = e).secondInterval) && (clearInterval(r), t.secondInterval = void 0),
111
+ f(e);
112
+ }
package/src/QyFile.d.ts CHANGED
@@ -14,8 +14,8 @@ export declare class QyFile extends QyItem {
14
14
  get isFile(): boolean;
15
15
  get contentAsText(): any;
16
16
  get clonedContent(): any;
17
- setContent(content: any): void;
18
17
  view(spec: string | undefined, noClone: any): any;
19
18
  prop(namePath: any, spec: string | undefined, noClone: any): any;
20
19
  unloadFileContent(): void;
20
+ ensureLoaded(): this | undefined;
21
21
  }
package/src/QyFile.js CHANGED
@@ -7,25 +7,31 @@ import {
7
7
  SpecialFilePaths as n,
8
8
  getContentKey as i,
9
9
  isNotNullObj as a,
10
- isSimpleType as C,
11
- fromSingleName as o
10
+ isSimpleType as h,
11
+ fromSingleName as s,
12
+ isEmptyObj as r,
13
+ getNowTime as l
12
14
  } from "./QyUtils.js";
13
15
 
14
16
  import {
15
- getValByNamePath as r
17
+ getValByNamePath as o
16
18
  } from "./QyFileContentUtils.js";
17
19
 
18
20
  import {
19
- QyIndexPropTree as s
21
+ QyIndexPropTree as f
20
22
  } from "./QyIndexPropTree.js";
21
23
 
22
- let d = Array.isArray, f = n.IndexPropPathsFileName, {
23
- $spec: h,
24
+ import {
25
+ handleExpiredProps as u
26
+ } from "./QyExpire.js";
27
+
28
+ let d = Array.isArray, C = n.IndexPropPathsFileName, {
29
+ $spec: p,
24
30
  $raw: c,
25
- $clone: l
31
+ $clone: y
26
32
  } = t;
27
33
 
28
- class u extends e {
34
+ class m extends e {
29
35
  _fileContentKey;
30
36
  _fileContent;
31
37
  cChangeId = 0;
@@ -44,10 +50,7 @@ class u extends e {
44
50
  return this._fileContentKey || (this._fileContentKey = i(this.fullPathHash));
45
51
  }
46
52
  get fileContent() {
47
- var e, t = this;
48
- return t.created && null == t._fileContent && !t.fileContentLoaded && (t.fileContentLoaded = !0,
49
- e = t.qyCache) && (t._fileContent = e.qyKVData.getValueSync(t.fileContentKey)),
50
- this.visited = !0, this._fileContent;
53
+ return this.ensureLoaded(), this.visited = !0, this._fileContent;
51
54
  }
52
55
  set fileContent(e) {
53
56
  this.visited = !0, this._fileContent = e;
@@ -59,12 +62,12 @@ class u extends e {
59
62
  fileContent: n,
60
63
  underHiddenFolder: i
61
64
  } = this;
62
- if (e && i && t == f) {
65
+ if (e && i && t == C) {
63
66
  e = this._qyIndexPropTree;
64
67
  if (e) return e;
65
- var r, l = this._qyIndexPropTree = new s();
66
- for (r in n) l.insert(o(r));
67
- return l;
68
+ var r, o = this._qyIndexPropTree = new f();
69
+ for (r in n) o.insert(s(r));
70
+ return o;
68
71
  }
69
72
  }
70
73
  get isFile() {
@@ -77,45 +80,68 @@ class u extends e {
77
80
  get clonedContent() {
78
81
  return structuredClone(this.fileContent);
79
82
  }
80
- setContent(e) {
81
- this.fileContent = e;
82
- }
83
- view(e = l, t) {
83
+ view(e = y, t) {
84
84
  var n = this.fileContent;
85
- return null == n || C(n) ? n : function t(n, i, r, l) {
85
+ return null == n || h(n) ? n : function t(n, i, r, o) {
86
86
  if (r === c) return i;
87
87
  if (null == r) return;
88
- if (C(r)) return r ? l ? i : structuredClone(i) : void 0;
88
+ if (h(r)) return r ? o ? i : structuredClone(i) : void 0;
89
89
  let e = r.$link;
90
- if (null != e) return y(n, i, e, r[h]);
91
- if (C(i)) return i;
90
+ if (null != e) return v(n, i, e, r[p]);
91
+ if (h(i)) return i;
92
92
  d(r) && (r = Object.fromEntries(r.filter(e => e).map(e => [ e, 1 ])));
93
- let o = d(i) ? [] : {};
93
+ let s = d(i) ? [] : {};
94
94
  let {
95
- $all: s,
95
+ $all: l,
96
96
  "**": a
97
97
  } = r;
98
- if (s || a) for (var f in i) {
99
- let e = r[f] ?? s ?? a;
100
- e && (o[f] = t(n, i[f], e, l));
98
+ if (l || a) for (var f in i) {
99
+ let e = r[f] ?? l ?? a;
100
+ e && (s[f] = t(n, i[f], e, o));
101
101
  } else for (var u in r) {
102
102
  let e = r[u];
103
- e && (o[u] = t(n, i[u], e, l));
103
+ e && (s[u] = t(n, i[u], e, o));
104
104
  }
105
- return o;
105
+ return s;
106
106
  }(this, n, e, t);
107
107
  }
108
- prop(e, t = l, n) {
108
+ prop(e, t = y, n) {
109
109
  var i;
110
- if (t) return e = r(this.fileContent, d(e) ? e : [ e ]), i = t.$link, null != i ? y(this, e, i, t[h], n) : n || t === c ? e : structuredClone(e);
110
+ if (t) return e = o(this.fileContent, d(e) ? e : [ e ]), i = t.$link, null != i ? v(this, e, i, t[p], n) : n || t === c ? e : structuredClone(e);
111
111
  }
112
112
  unloadFileContent() {
113
113
  this.created && this.fileContentLoaded && null != this._fileContent && (this._fileContent = void 0,
114
114
  this.fileContentLoaded = !1);
115
115
  }
116
+ ensureLoaded() {
117
+ if (this.created && null == this._fileContent && !this.fileContentLoaded) {
118
+ this.fileContentLoaded = !0;
119
+ var e = this.qyCache;
120
+ if (!e) return;
121
+ if (this._fileContent = e.qyKVData.getValueSync(this.fileContentKey),
122
+ !this.underHiddenFolder) {
123
+ var t, n, i = this;
124
+ !i.cExpireChecked && (i.cExpireChecked = !0, t = e.getExpireInfoFile(i.fullPathHash, "c")) && ({
125
+ expiredProps: t,
126
+ remainingExpireInfoObj: n
127
+ } = ((e, t = l()) => {
128
+ let n, i = {};
129
+ for (var r in e) {
130
+ var o = e[r];
131
+ o <= t ? n ? n.push(r) : n = [ r ] : i[r] = o;
132
+ }
133
+ return {
134
+ expiredProps: n,
135
+ remainingExpireInfoObj: i
136
+ };
137
+ })(t.fileContent), t && u(e.qyDB, i, t), r(n) || e.monitorContentExpire(i, n));
138
+ }
139
+ }
140
+ return this;
141
+ }
116
142
  }
117
143
 
118
- function p(e, t, n, i) {
144
+ function g(e, t, n, i) {
119
145
  if (e) {
120
146
  e = e.getFile(t);
121
147
  if (e) return e.view(n, i);
@@ -123,17 +149,17 @@ function p(e, t, n, i) {
123
149
  return t;
124
150
  }
125
151
 
126
- function y(e, t, n, i, r = !1) {
127
- let l = e.qyCache.getDir(n);
128
- if (d(t)) return t.map(e => p(l, e, i, r));
152
+ function v(e, t, n, i, r = !1) {
153
+ let o = e.qyCache.getDir(n);
154
+ if (d(t)) return t.map(e => g(o, e, i, r));
129
155
  if (a(t)) {
130
- var o, s = {};
131
- for (o in t) s[o] = p(l, o, i, r);
132
- return s;
156
+ var s, l = {};
157
+ for (s in t) l[s] = g(o, s, i, r);
158
+ return l;
133
159
  }
134
- return p(l, t, i, r);
160
+ return g(o, t, i, r);
135
161
  }
136
162
 
137
163
  export {
138
- u as QyFile
164
+ m as QyFile
139
165
  };
@@ -6,5 +6,6 @@ export declare function mergeContentAndGenDelta(oldContent: any, newContent: any
6
6
  };
7
7
  export declare function setValByNamePath(rootObj: any, namePath: any, value: any): any;
8
8
  export declare function getValByNamePath(obj: any, namePath: any): any;
9
+ export declare function delValByNamePath(obj: any, propPath: any, keepEmptyObj?: boolean, idx?: number): any;
9
10
  export declare function cleanContent(obj: any, shouldCleanMark?: boolean, strict?: boolean): any;
10
11
  export declare function objToDelMarks(obj: any): any;