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
@@ -11,7 +11,7 @@ export declare class QyBinWriter extends QyOpRunner {
11
11
  save(changeId: any, data: any, needPromise: any): any;
12
12
  truncate(): any;
13
13
  switch(newFilePath: any): any;
14
- getBinData(dataQueue: any, changeId?: undefined): any;
14
+ getBinData(dataQueue: any[], changeId?: undefined): any;
15
15
  _op_start(filePath: any): Promise<this>;
16
16
  _op_stop(): Promise<void>;
17
17
  _op_save(changeId: any, dataQueue: any): Promise<void> | undefined;
@@ -20,10 +20,10 @@ import {
20
20
  } from "./QyDefaultOptions.js";
21
21
 
22
22
  import {
23
- logger as y
23
+ logger as g
24
24
  } from "./QyLogger.js";
25
25
 
26
- let h = Array.isArray;
26
+ var {} = Array;
27
27
 
28
28
  class e extends t {
29
29
  _filePath;
@@ -48,12 +48,12 @@ class e extends t {
48
48
  this._totalSavedSize = t;
49
49
  }
50
50
  save(t, e, a) {
51
- null == e && (e = t, t = 0);
51
+ null == e && ([ e, t ] = [ t, 0 ]);
52
52
  var i, r = this.lastOp;
53
- return "_op_save" === r?.opFunName ? (i = r.args, i[0] = t, i = i[1], h(e) ? i.push(...e) : i.push(e),
53
+ return "_op_save" === r?.opFunName ? (i = r.args, i[0] = t, i[1].push(e),
54
54
  a && l(r), r.promise) : (i = {
55
55
  opFunName: "_op_save",
56
- args: [ t, h(e) ? e : [ e ] ]
56
+ args: [ t, [ e ] ]
57
57
  }, a ? this.pushAndRunWithPromise(i) : this.pushAndRun(i));
58
58
  }
59
59
  truncate() {
@@ -70,7 +70,7 @@ class e extends t {
70
70
  });
71
71
  }
72
72
  getBinData(t, e = 0) {
73
- var a = t.length;
73
+ var a = (t = t.flat()).length;
74
74
  return 0 == a ? "" : 1 == a ? t[0] : Buffer.isBuffer(t[0]) ? Buffer.concat(t) : Buffer.concat(t.map(t => Buffer.from(t)));
75
75
  }
76
76
  async _op_start(t) {
@@ -84,7 +84,7 @@ class e extends t {
84
84
  if (t) try {
85
85
  await t.close(), this.fileHandle = void 0;
86
86
  } catch (t) {
87
- y.error(`Close ${e} failed:`, t);
87
+ g.error(`Close ${e} failed:`, t);
88
88
  }
89
89
  f(this);
90
90
  }
@@ -99,8 +99,8 @@ class e extends t {
99
99
  } = t, {
100
100
  emitSaveEvent: o,
101
101
  maxFileSize: l,
102
- maxRetryInterval: h,
103
- retryIntervalFactor: f
102
+ maxRetryInterval: f,
103
+ retryIntervalFactor: h
104
104
  } = n, p = S(a), u = p.length, c = `size ${v(u)} (MaxId:${e}) to ` + s, d;
105
105
  for (;"_op_truncate" !== t.firstOp?.opFunName; ) try {
106
106
  await i.appendFile(p, {
@@ -110,8 +110,8 @@ class e extends t {
110
110
  return o && 0 < e && t.emit("save", e), void (!t.maxFileSizeEmitted && l && m > l && (t.maxFileSizeEmitted = !0,
111
111
  t.emit("maxFileSize", m)));
112
112
  } catch (t) {
113
- y.error(`Saving ${c} failed:`, t, "Truncated back to " + r), await i.truncate(r),
114
- d = d ? Math.min(h, d * f) : 1, y.log(`Retry in ${d} seconds`),
113
+ g.error(`Saving ${c} failed:`, t, "Truncated back to " + r), await i.truncate(r),
114
+ d = d ? Math.min(f, d * h) : 1, g.log(`Retry in ${d} seconds`),
115
115
  await _(d);
116
116
  }
117
117
  })(this, t, e);
@@ -122,9 +122,9 @@ class e extends t {
122
122
  filePath: e
123
123
  } = this;
124
124
  if (t) try {
125
- await t.truncate(0), y.info("Truncated " + e);
125
+ await t.truncate(0), g.info("Truncated " + e);
126
126
  } catch (t) {
127
- y.error(`Truncate ${e} failed:`, t);
127
+ g.error(`Truncate ${e} failed:`, t);
128
128
  }
129
129
  f(this);
130
130
  }
@@ -133,7 +133,7 @@ class e extends t {
133
133
  fileHandle: e,
134
134
  filePath: a
135
135
  } = this;
136
- e && a == t || (await i(this, t), y.info(`Switched from ${a} to ` + t));
136
+ e && a == t || (await i(this, t), g.info(`Switched from ${a} to ` + t));
137
137
  }
138
138
  }
139
139
 
@@ -148,7 +148,7 @@ async function i(t, e) {
148
148
  var r = i.append;
149
149
  t.fileHandle = await s(e, r ? "a" : "w"), t.filePath = e, r && (t.totalSavedSize = await o(e));
150
150
  } catch (t) {
151
- y.error(`Open ${e} failed:`, t);
151
+ g.error(`Open ${e} failed:`, t);
152
152
  }
153
153
  }
154
154
 
package/src/QyCD.d.ts CHANGED
@@ -9,7 +9,7 @@ export declare class QyCD {
9
9
  cdP(namePath: string | string[] | QyDir, parentDir?: any): this;
10
10
  dir(namePath: string | string[], parentDir?: any): QyDir | undefined;
11
11
  dirP(namePath: string | string[], parentDir?: any): QyDir | undefined;
12
- indexDir(indexHostDirNamePath: string | string[] | QyDir, namePath: string | string[], parentDir?: any): QyDir | undefined;
12
+ indexDir(indexHostDirNamePath: string | string[] | QyDir, namePath: string | any[], parentDir?: any): QyDir | undefined;
13
13
  indexDirP(indexHostDirNamePath: string | string[] | QyDir, namePath: string | string[], parentDir?: any): QyDir | undefined;
14
14
  file(namePath: string | string[], parentDir?: any): QyFile | undefined;
15
15
  fileP(namePath: string | string[], parentDir?: any): QyFile | undefined;
@@ -19,7 +19,7 @@ export declare class QyCD {
19
19
  get rpcFileList(): any;
20
20
  view(namePath: any, spec?: undefined, parentDir?: any): any;
21
21
  viewP(namePath: any, spec: any, parentDir?: any): any;
22
- queryFiles(indexHostDirNamePath: any, queryObj: any, limit: any, cursor: any, parentDir?: any): any;
22
+ queryFiles(indexHostDirNamePath: any, queryObj: any, limit?: number | undefined, cursor?: number | undefined, parentDir?: any): any;
23
23
  queryFilesMulti(indexHostDirNamePathMulti: any, limit: any, cursor: any, parentDir?: any): any;
24
24
  queryTree(indexHostDirNamePath: any, queryObj: any, view: any, limit: any, cursor: any, parentDir?: any): {
25
25
  tree: any;
package/src/QyCD.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import {
2
- isString as i,
2
+ isString as t,
3
3
  pathSplit as s
4
4
  } from "./QyUtils.js";
5
5
 
@@ -10,29 +10,29 @@ class r {
10
10
  this.qyCache = r;
11
11
  }
12
12
  cd(r, e = this.currentDir) {
13
- return i(r) && (r = s(r)), this.cdP(r, e);
13
+ return t(r) && (r = s(r)), this.cdP(r, e);
14
14
  }
15
15
  cdP(r, e = this.currentDir) {
16
16
  return this.currentDir = this.qyCache?.getOrCreateDir(r, e), this;
17
17
  }
18
18
  dir(r, e = this.currentDir) {
19
- return i(r) && (r = s(r)), this.dirP(r, e);
19
+ return t(r) && (r = s(r)), this.dirP(r, e);
20
20
  }
21
21
  dirP(r, e = this.currentDir) {
22
22
  return this.qyCache?.getDir(r, e);
23
23
  }
24
- indexDir(r, e, t = this.currentDir) {
25
- return i(r) && (r = s(r)), i(e) && (e = s(e)), this.indexDirP(r, e, t);
24
+ indexDir(r, e, i = this.currentDir) {
25
+ return t(r) && (r = s(r)), t(e) && (e = s(e)), this.indexDirP(r, e, i);
26
26
  }
27
- indexDirP(r, e, t = this.currentDir) {
28
- var i = this.qyCache, r = i?.getDir(r, t);
27
+ indexDirP(r, e, i = this.currentDir) {
28
+ var t = this.qyCache, r = t?.getDir(r, i);
29
29
  if (r) {
30
- t = i?.getIndexDir(r);
31
- if (t) return e && 0 != e.length ? i?.getDir(e, t) : t;
30
+ i = t?.getIndexDir(r);
31
+ if (i) return e && 0 != e.length ? t?.getDir(e, i) : i;
32
32
  }
33
33
  }
34
34
  file(r, e = this.currentDir) {
35
- return i(r) && (r = s(r)), this.fileP(r, e);
35
+ return t(r) && (r = s(r)), this.fileP(r, e);
36
36
  }
37
37
  fileP(r, e = this.currentDir) {
38
38
  return this.qyCache?.getFile(r, e);
@@ -49,23 +49,23 @@ class r {
49
49
  get rpcFileList() {
50
50
  return this.qyCache.rpcFileList;
51
51
  }
52
- view(r, e = void 0, t = this.currentDir) {
53
- return i(r) && (r = s(r)), this.viewP(r, e, t);
52
+ view(r, e = void 0, i = this.currentDir) {
53
+ return t(r) && (r = s(r)), this.viewP(r, e, i);
54
54
  }
55
- viewP(r, e, t = this.currentDir) {
56
- return this.qyCache.getFile(r, t)?.view(e);
55
+ viewP(r, e, i = this.currentDir) {
56
+ return this.qyCache.getFile(r, i)?.view(e);
57
57
  }
58
- queryFiles(r, e, t, i, s = this.currentDir) {
59
- return this.qyCache.queryFiles(r, e, t, i, s);
58
+ queryFiles(r, e, i = void 0, t = void 0, s = this.currentDir) {
59
+ return this.qyCache.queryFiles(r, e, i, t, s);
60
60
  }
61
- queryFilesMulti(r, e, t, i = this.currentDir) {
62
- return this.qyCache.queryFilesMulti(r, e, t, i);
61
+ queryFilesMulti(r, e, i, t = this.currentDir) {
62
+ return this.qyCache.queryFilesMulti(r, e, i, t);
63
63
  }
64
- queryTree(r, e, t, i, s, h = this.currentDir) {
65
- return n(this.qyCache.queryFiles(r, e, i, s, h), t);
64
+ queryTree(r, e, i, t, s, h = this.currentDir) {
65
+ return n(this.qyCache.queryFiles(r, e, t, s, h), i);
66
66
  }
67
- queryTreeMulti(r, e, t, i, s = this.currentDir) {
68
- return n(this.qyCache.queryFilesMulti(r, t, i, s), e);
67
+ queryTreeMulti(r, e, i, t, s = this.currentDir) {
68
+ return n(this.qyCache.queryFilesMulti(r, i, t, s), e);
69
69
  }
70
70
  resetCurrentDir() {
71
71
  this.currentDir = void 0;
@@ -75,10 +75,10 @@ class r {
75
75
  }
76
76
  }
77
77
 
78
- function n(r, t) {
79
- var i, s = {};
80
- for (i of r) {
81
- var h, n = i.parentList;
78
+ function n(r, i) {
79
+ var t, s = {};
80
+ for (t of r) {
81
+ var h, n = t.parentList;
82
82
  let e = s;
83
83
  for (h of n) {
84
84
  var {
@@ -91,9 +91,9 @@ function n(r, t) {
91
91
  });
92
92
  }
93
93
  let r = e.fileMap;
94
- (r = r || (e.fileMap = {}))[i.name] = {
95
- fileContent: i.view(t, !0),
96
- fileContentKey: i.fileContentKey
94
+ (r = r || (e.fileMap = {}))[t.name] = {
95
+ fileContent: t.view(i, !0),
96
+ fileContentKey: t.fileContentKey
97
97
  };
98
98
  }
99
99
  return {
package/src/QyCache.d.ts CHANGED
@@ -11,6 +11,7 @@ export declare class QyCache extends EventEmitter {
11
11
  triggerRootDir: any;
12
12
  rpcRootDir: any;
13
13
  indexRootDir: any;
14
+ expireRootDir: any;
14
15
  exclusiveFilePath: any;
15
16
  qyKVData: any;
16
17
  qyFileLogger: any;
@@ -20,7 +21,7 @@ export declare class QyCache extends EventEmitter {
20
21
  stop(): Promise<this>;
21
22
  increaseChangeId(): any;
22
23
  decreaseChangeId(): void;
23
- save(changeId: any, cmdArgAsListObj: any, logText: any, syncList: any, needPromise: any): any;
24
+ save(changeId: any, cmdArgAsListChanges: any, logText: any, syncList: any, needPromise: any): any;
24
25
  getFile(namePath: QyFile | string | string[], parentDir?: any): QyFile | undefined;
25
26
  getDir(namePath: QyDir | string | string[], parentDir?: any): QyDir | undefined;
26
27
  getOrCreateFile(namePath: QyFile | string | string[], parentDir?: any): QyFile;
@@ -29,6 +30,8 @@ export declare class QyCache extends EventEmitter {
29
30
  getOrCreateIndexDir(indexHostDir: any): any;
30
31
  getTriggerFile(triggerName: any): any;
31
32
  getOrCreateTriggerFile(triggerName: any): any;
33
+ getExpireInfoFile(fullPathHash: any, isDir?: boolean): any;
34
+ getOrCreateExpireInfoFile(fullPathHash: any, isDir?: boolean): any;
32
35
  get triggerFileList(): any;
33
36
  getRpcFile(rpcFunName: any): any;
34
37
  getOrCreateRpcFile(rpcFunName: any): any;
@@ -40,4 +43,6 @@ export declare class QyCache extends EventEmitter {
40
43
  queryFiles(indexHostDirNamePath: any, queryObj: any, limit: any, cursor: any, parentDir?: any): never[];
41
44
  queryFilesMulti(indexHostDirNamePathMulti: any, limit: any, cursor: any, parentDir?: any): never[];
42
45
  callRpc(rpcFunName: any, args: any, body: any): Promise<any>;
46
+ monitorContentExpire(file: any, flattedAbsSecondObj: any): void;
47
+ unmonitorContentExpire(file: any, flattedDelObj: any): void;
43
48
  }
package/src/QyCache.js CHANGED
@@ -18,12 +18,12 @@ import {
18
18
 
19
19
  import {
20
20
  QyTriggerNode as f,
21
- updateTriggerNodes as g
21
+ updateTriggerNodes as n
22
22
  } from "./QyTrigger.js";
23
23
 
24
24
  import {
25
25
  isString as C,
26
- lockExclusiveFilePath as q,
26
+ lockExclusiveFilePath as x,
27
27
  unlockExclusiveFilePath as i
28
28
  } from "./QyUtils.js";
29
29
 
@@ -32,39 +32,40 @@ import {
32
32
  } from "./QyStructure.js";
33
33
 
34
34
  import {
35
- getIndexPropPaths as n,
35
+ getIndexPropPaths as g,
36
36
  parseNamePathAndQuery as l
37
37
  } from "./QyIndex.js";
38
38
 
39
39
  import {
40
- getDefaultOptions as d
40
+ getDefaultOptions as p
41
41
  } from "./QyDefaultOptions.js";
42
42
 
43
43
  import {
44
- ensureDir as x,
44
+ ensureDir as q,
45
45
  SpecialFilePaths as e
46
46
  } from "./QyUtils.js";
47
47
 
48
48
  import {
49
- QueryCounter as p
49
+ QueryCounter as u
50
50
  } from "./QyUnionNode.js";
51
51
 
52
52
  import {
53
- QyKVDataLoader as Q
53
+ QyKVDataLoader as O
54
54
  } from "./QyKVDataLoader.js";
55
55
 
56
56
  import {
57
- requireFromModCode as u
57
+ requireFromModCode as d
58
58
  } from "./QyMod.js";
59
59
 
60
60
  import {
61
- logger as S
61
+ logger as Q
62
62
  } from "./QyLogger.js";
63
63
 
64
64
  let {
65
- IndexDirPath: L,
66
- TriggerDirPath: P,
67
- RpcDirPath: O
65
+ IndexDirPath: S,
66
+ TriggerDirPath: L,
67
+ RpcDirPath: P,
68
+ ExpireDirPath: j
68
69
  } = e;
69
70
 
70
71
  class t extends r {
@@ -77,13 +78,14 @@ class t extends r {
77
78
  triggerRootDir;
78
79
  rpcRootDir;
79
80
  indexRootDir;
81
+ expireRootDir;
80
82
  exclusiveFilePath;
81
83
  qyKVData;
82
84
  qyFileLogger;
83
85
  rpcFunMap = {};
84
86
  constructor(r, e, t) {
85
87
  super(), e = {
86
- ...d("QyCache"),
88
+ ...p("QyCache"),
87
89
  ...e
88
90
  };
89
91
  var i = v(r, "qykv");
@@ -109,16 +111,16 @@ class t extends r {
109
111
  exclusiveFilePath: a,
110
112
  rootDir: s
111
113
  } = this;
112
- S.log(`Starting at ${r}...`);
114
+ Q.log(`Starting at ${r}...`);
113
115
  try {
114
- await x(e), o.start();
116
+ await q(e), o.start();
115
117
  var [ {
116
- maxChangeId: g,
117
- loadedMaxAclNum: n,
118
+ maxChangeId: n,
119
+ loadedMaxAclNum: g,
118
120
  qySnapshots: l,
119
- aclKeyValueMap: d
120
- } ] = await Promise.all([ ((r, e) => (r = new Q(r, e)).load())(e, t), q(a) ]);
121
- i.start(g, n, l, d);
121
+ aclKeyValueMap: p
122
+ } ] = await Promise.all([ ((r, e) => (r = new O(r, e)).load())(e, t), x(a) ]);
123
+ i.start(n, g, l, p);
122
124
  } catch (r) {
123
125
  throw o.stop(), r;
124
126
  }
@@ -128,22 +130,18 @@ class t extends r {
128
130
  fileMap: i
129
131
  } = e;
130
132
  for (var o of t) r(o);
131
- }(s), this.indexRootDir = s.searchOrCreateSubdir(L);
132
- var p = this, e = p.rootDir;
133
- e.triggerNodes = [ new f() ], p.triggerRootDir = e.searchOrCreateSubdir(P);
134
- for (u of p.triggerRootDir.fileList) {
133
+ }(s), this.indexRootDir = s.searchOrCreateSubdir(S), this.expireRootDir = s.searchOrCreateSubdir(j);
134
+ var u = this, e = u.rootDir;
135
+ e.triggerNodes = [ new f() ];
136
+ for (d of (e = u.triggerRootDir = e.searchOrCreateSubdir(L)).fileList) {
135
137
  var {
136
- name: u,
138
+ name: d,
137
139
  fileContent: h
138
- } = u, {
139
- fileNamePath: h,
140
- propNamePathList: c,
141
- modCode: D
142
- } = h;
143
- p.insertTriggerToTree(u, h, c, D);
140
+ } = d, [ h, c, D ] = h;
141
+ u.insertTriggerToTree(d, h, c, D);
144
142
  }
145
143
  var y = this;
146
- y.rpcRootDir = y.rootDir.searchOrCreateSubdir(O);
144
+ y.rpcRootDir = y.rootDir.searchOrCreateSubdir(P);
147
145
  for (F of y.rpcRootDir.fileList) {
148
146
  var {
149
147
  name: F,
@@ -151,27 +149,28 @@ class t extends r {
151
149
  } = F;
152
150
  C(m) && y.insertRpc(F, m);
153
151
  }
154
- return t.dumpStructureAtStart && await R(v(r, "qystruct"), s), S.log("Started."),
152
+ return t.dumpStructureAtStart && await R(v(r, "qystruct"), s), Q.log("Started."),
155
153
  this;
156
154
  }
157
155
  async stop() {
158
- S.log("Stopping...");
156
+ Q.log("Stopping...");
159
157
  var {
160
158
  qyKVData: r,
161
159
  qyFileLogger: e,
162
160
  exclusiveFilePath: t
163
161
  } = this;
164
- return await r.stop(), S.log("qyFileLogger stopped."), await e.stop(), i(t),
162
+ return await r.stop(), Q.log("QyFileLogger stopped."), await e.stop(), i(t),
165
163
  Object.assign(this, {
166
164
  rootDir: void 0,
167
165
  indexRootDir: void 0,
166
+ expireRootDir: void 0,
167
+ triggerRootDir: void 0,
168
+ rpcRootDir: void 0,
168
169
  qyKVData: void 0,
169
170
  rpcFunMap: void 0,
170
171
  qyDB: void 0,
171
- qyFileLogger: void 0,
172
- triggerRootDir: void 0,
173
- rpcRootDir: void 0
174
- }), S.log("Stopped."), this;
172
+ qyFileLogger: void 0
173
+ }), Q.log("Stopped."), this;
175
174
  }
176
175
  increaseChangeId() {
177
176
  return this.qyKVData.increaseChangeId();
@@ -199,10 +198,10 @@ class t extends r {
199
198
  return r.isDir ? r : C(r) ? e.getOrCreateSubdir(r) : e.searchOrCreateSubdir(r);
200
199
  }
201
200
  getIndexDir(r) {
202
- return this.indexRootDir?.getSubdir(r.fullPathHash);
201
+ return this.indexRootDir.searchSubdir(c(r.fullPathHash));
203
202
  }
204
203
  getOrCreateIndexDir(r) {
205
- return this.indexRootDir?.getOrCreateSubdir(r.fullPathHash);
204
+ return this.indexRootDir.searchOrCreateSubdir(c(r.fullPathHash));
206
205
  }
207
206
  getTriggerFile(r) {
208
207
  return this.triggerRootDir.getFile(r);
@@ -210,6 +209,12 @@ class t extends r {
210
209
  getOrCreateTriggerFile(r) {
211
210
  return this.triggerRootDir.getOrCreateFile(r);
212
211
  }
212
+ getExpireInfoFile(r, e = !1) {
213
+ return this.expireRootDir.searchFile(h(r, e));
214
+ }
215
+ getOrCreateExpireInfoFile(r, e = !1) {
216
+ return this.expireRootDir.searchOrCreateFile(h(r, e));
217
+ }
213
218
  get triggerFileList() {
214
219
  return this.triggerRootDir.fileList;
215
220
  }
@@ -226,45 +231,59 @@ class t extends r {
226
231
  var {
227
232
  rootDir: o,
228
233
  qyDB: a
229
- } = this, i = u("trigger", r, i, a);
230
- o.triggerNodes[0].insertTrigger(r, e, t, i), g(o, e);
234
+ } = this, i = d("trigger", r, i, a);
235
+ o.triggerNodes[0].insertTrigger(r, e, t, i), n(o, e);
231
236
  }
232
237
  removeTriggerFromTree(r, e) {
233
238
  var t = this.rootDir;
234
- t.triggerNodes[0].removeTrigger(r, e) && g(t, e);
239
+ t.triggerNodes[0].removeTrigger(r, e) && n(t, e);
235
240
  }
236
241
  insertRpc(r, e) {
237
242
  var {
238
243
  rpcFunMap: t,
239
244
  qyDB: i
240
- } = this, e = u("rpc", r, e, i);
245
+ } = this, e = d("rpc", r, e, i);
241
246
  e && (t[r] = e);
242
247
  }
243
248
  removeRpc(r) {
244
249
  delete this.rpcFunMap[r];
245
250
  }
246
251
  queryFiles(r, e, t, i, o = this.rootDir) {
247
- var a = [], t = (C(e) && !t && (t = 1), new p(t, i)), i = this.options.queryAutoCreateIndex;
248
- return h(r, e, a, t, o, i), a;
252
+ var a = [], t = (C(e) && !t && (t = 1), new u(t, i)), i = this.options.queryAutoCreateIndex;
253
+ return D(r, e, a, t, o, i), a;
249
254
  }
250
255
  queryFilesMulti(r, e, t, i = this.rootDir) {
251
- var o, a, s = [], g = new p(e, t), n = this.options.queryAutoCreateIndex;
252
- for ([ o, a ] of r) h(o, a, s, g, i, n);
256
+ var o, a, s = [], n = new u(e, t), g = this.options.queryAutoCreateIndex;
257
+ for ([ o, a ] of r) D(o, a, s, n, i, g);
253
258
  return s;
254
259
  }
255
260
  async callRpc(e, r, t) {
256
261
  var i, o = this.rpcFunMap[e];
257
- if (!o) return S.warn(i = `RPC ${e} not implemented.`), new Error(i);
262
+ if (!o) return Q.warn(i = `RPC ${e} not implemented.`), new Error(i);
258
263
  try {
259
264
  return await o(r, t);
260
265
  } catch (r) {
261
- return S.error(`Calling RPC ${e} failed:`, r), r;
266
+ return Q.error(`Calling RPC ${e} failed:`, r), r;
262
267
  }
263
268
  }
269
+ monitorContentExpire(r, e) {
270
+ this.qyKVData.monitorContentExpire(r, e);
271
+ }
272
+ unmonitorContentExpire(r, e) {
273
+ this.qyKVData.unmonitorContentExpire(r, e);
274
+ }
275
+ }
276
+
277
+ function h(r, e) {
278
+ return [ e ? "d" : "f", r.substring(0, 2), r ];
279
+ }
280
+
281
+ function c(r) {
282
+ return [ r[0], r ];
264
283
  }
265
284
 
266
- function h(r, e, t, i, o, a) {
267
- e && (a = a ? n(e) : void 0, l(r, o, a, e, t, i));
285
+ function D(r, e, t, i, o, a) {
286
+ e && (a = a ? g(e) : void 0, l(r, o, a, e, t, i));
268
287
  }
269
288
 
270
289
  export {
@@ -1,6 +1,6 @@
1
1
  export declare const Zip_File_Extension = ".gz";
2
- export declare function compressFile(srcFilePath: any, destFilePath: any, options: any): any;
3
- export declare function decompressFile(srcFilePath: any, destFilePath: any, options: any): any;
2
+ export declare function compressFile(srcFilePath: any, destFilePath?: any, options?: any): any;
3
+ export declare function decompressFile(srcFilePath: any, destFilePath?: any, options?: any): any;
4
4
  export declare function runOperation({ operation, srcFilePath, destFilePath, options }: {
5
5
  operation: any;
6
6
  srcFilePath: any;
@@ -1,5 +1,5 @@
1
1
  import {
2
- extname as t
2
+ extname as i
3
3
  } from "node:path";
4
4
 
5
5
  import {
@@ -27,7 +27,7 @@ import {
27
27
  } from "./QyLogger.js";
28
28
 
29
29
  import {
30
- isNotNullObj as i,
30
+ isNotNullObj as t,
31
31
  folderOrFileExists as l,
32
32
  ensureParentDir as f
33
33
  } from "./QyUtils.js";
@@ -38,8 +38,8 @@ import {
38
38
 
39
39
  let g = r(e), o = ".gz", h = "QyCompressor_Worker.ts";
40
40
 
41
- function w(e, r, o) {
42
- return i(r) && (o = r, r = void 0), r = r || e + ".gz", o = o || {}, e.endsWith(".gz") ? (p.log(e + " already ends with .gz."),
41
+ function w(e, r = void 0, o = void 0) {
42
+ return t(r) && (o = r, r = void 0), r = r || e + ".gz", o = o || {}, e.endsWith(".gz") ? (p.log(e + " already ends with .gz."),
43
43
  !1) : r.endsWith(".gz") ? c(h, {
44
44
  operation: "compress",
45
45
  srcFilePath: e,
@@ -48,9 +48,9 @@ function w(e, r, o) {
48
48
  }).promise : (p.log(r + " doesn't end with .gz."), !1);
49
49
  }
50
50
 
51
- function z(e, r, o) {
52
- return e.endsWith(".gz") ? (i(r) && (o = r, r = void 0), r = r || e.replace(new RegExp(".gz$"), ""),
53
- o = o || {}, ".gz" == t(r) ? (p.log(r + " already ends with .gz."), !1) : c(h, {
51
+ function z(e, r = void 0, o = void 0) {
52
+ return e.endsWith(".gz") ? (t(r) && (o = r, r = void 0), r = r || e.replace(new RegExp(".gz$"), ""),
53
+ o = o || {}, ".gz" == i(r) ? (p.log(r + " already ends with .gz."), !1) : c(h, {
54
54
  operation: "decompress",
55
55
  srcFilePath: e,
56
56
  destFilePath: r,
@@ -62,16 +62,16 @@ async function u({
62
62
  operation: e,
63
63
  srcFilePath: r,
64
64
  destFilePath: o,
65
- options: t
65
+ options: i
66
66
  }) {
67
67
  var {
68
- removeSrcAfterSuccess: t,
69
- override: i
70
- } = t;
68
+ removeSrcAfterSuccess: i,
69
+ override: t
70
+ } = i;
71
71
  if (!await l(r)) throw new Error(r + " doesn't exist.");
72
- if (!i && await l(o)) throw new Error(o + " already exists.");
72
+ if (!t && await l(o)) throw new Error(o + " already exists.");
73
73
  if (await f(o), await g(n(r), ("compress" == e ? s : a)(), d(o)), p.info(e + `ed ${r} to ${o}.`),
74
- t) try {
74
+ i) try {
75
75
  await m.unlink(r), p.info("Unlinked " + r);
76
76
  } catch (e) {
77
77
  p.error(`Failed to unlink ${r}:`, e);
package/src/QyDB.d.ts CHANGED
@@ -10,30 +10,9 @@ export declare class QyDB extends QyCD {
10
10
  constructor(rootFolder?: string, options?: {});
11
11
  start(options?: {}): Promise<this>;
12
12
  stop(): Promise<void>;
13
+ get currentBatch(): any;
13
14
  createDir(namePath: string | string[]): QyDir;
14
- createDirP(namePath: string | string[]): QyDir;
15
15
  createFile(namePath: string | string[]): QyFile;
16
- createFileP(namePath: string | string[]): QyFile;
17
- createIndex(indexHostDirNamePath: string | string[] | QyDir, indexPropPathList: string[] | string[][]): any;
18
- createIndexP(indexHostDirNamePath: string | string[] | QyDir, indexPropPathList: string[][]): any;
19
- delIndex(indexHostDirNamePath: string | string[] | QyDir, indexPropPath: string | string[]): any;
20
- delIndexP(indexHostDirNamePath: any, indexPropPath: any): any;
21
- insert(namePath: any, content: any): any;
22
- insertP(namePath: any, content: any): any;
23
- remove(namePath: any, content: any): any;
24
- removeP(namePath: any, content: any): any;
25
- replace(namePath: any, content: any): any;
26
- replaceP(namePath: any, content: any): any;
27
- delDir(namePath: any): any;
28
- delDirP(namePath: any): any;
29
- delFile(namePath: any): any;
30
- delFileP(namePath: any): any;
31
- delContent(namePath: any): any;
32
- delContentP(namePath: any): any;
33
- insertTrigger(triggerName: any, fileNamePath: any, propNamePathList: any, modCode: any): any;
34
- removeTrigger(triggerName: any): any;
35
- insertRpc(rpcFunName: any, modCode: any): any;
36
- removeRpc(rpcFunName: any): any;
37
16
  on(eventName: any, listener: any): any;
38
17
  callRpc(rpcFunName: any, args: any, body?: undefined): any;
39
18
  }