datafolder 1.0.2 → 1.0.4

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 (84) hide show
  1. package/README.md +34 -31
  2. package/index.js +1 -3
  3. package/package.json +5 -3
  4. package/sample.js +37 -37
  5. package/scripts/airbnb.js +10 -11
  6. package/scripts/airbnb2.js +10 -11
  7. package/scripts/airbnb2_queries.js +20 -22
  8. package/scripts/airbnb_queries.js +23 -22
  9. package/scripts/downloadFile.js +29 -31
  10. package/scripts/express.js +7 -5
  11. package/scripts/fastify.js +12 -11
  12. package/scripts/flights.js +9 -9
  13. package/scripts/flights2.js +9 -9
  14. package/scripts/flights2_queries.js +107 -105
  15. package/scripts/flights_queries.js +113 -109
  16. package/src/QyAcl.js +153 -152
  17. package/src/QyAclSaver.js +16 -10
  18. package/src/QyAclSaver_Worker.js +21 -15
  19. package/src/QyAclWriter.js +23 -13
  20. package/src/QyBatch.js +298 -263
  21. package/src/QyBinWriter.js +49 -37
  22. package/src/QyCD.js +13 -14
  23. package/src/QyCache.js +177 -140
  24. package/src/QyCompressor.js +71 -45
  25. package/src/QyCompressor_Worker.js +17 -9
  26. package/src/QyDB.js +67 -12
  27. package/src/QyDefaultOptions.js +13 -10
  28. package/src/QyDir.js +89 -53
  29. package/src/QyFetch.js +27 -24
  30. package/src/QyFile.js +89 -77
  31. package/src/QyFileContentUtils.js +129 -132
  32. package/src/QyFileLogger.js +63 -41
  33. package/src/QyIndex.js +175 -197
  34. package/src/QyIndexPropTree.js +25 -25
  35. package/src/QyIntersectNode.js +34 -31
  36. package/src/QyItem.js +54 -52
  37. package/src/QyJsonSaver.js +12 -6
  38. package/src/QyKVData.js +279 -245
  39. package/src/QyKVDataCleaner.js +12 -6
  40. package/src/QyKVDataCleaner_Worker.js +77 -59
  41. package/src/QyKVDataLoader.js +67 -46
  42. package/src/QyKVDataSaver.js +15 -9
  43. package/src/QyKVDataSaver_Worker.js +83 -60
  44. package/src/QyLogFileSaver.js +12 -6
  45. package/src/QyLogFileSaver_Worker.js +24 -14
  46. package/src/QyLogger.js +51 -40
  47. package/src/QyMessageWorker.js +43 -29
  48. package/src/QyMessager.js +74 -54
  49. package/src/QyMessager_Run.js +20 -7
  50. package/src/QyMod.js +15 -11
  51. package/src/QyOpRunner.js +58 -41
  52. package/src/QyQueue.js +35 -30
  53. package/src/QySaver.js +52 -29
  54. package/src/QySnapshotCompactor.js +15 -9
  55. package/src/QySnapshotCompactor_Worker.js +131 -110
  56. package/src/QySnapshotSaver.js +15 -9
  57. package/src/QySnapshotSaver_Worker.js +125 -110
  58. package/src/QySnapshots.js +264 -242
  59. package/src/QyStructure.js +35 -27
  60. package/src/QyTrigger.js +62 -55
  61. package/src/QyUnionNode.js +54 -56
  62. package/src/QyUtils.js +170 -158
  63. package/src/QyWorker.js +34 -20
  64. package/src/hackernews.js +63 -71
  65. package/src/rpc/getFileContent.js +7 -7
  66. package/src/rpc/getSubItems.js +12 -28
  67. package/src/rpc/queryFiles.js +2 -25
  68. package/src/simulate.js +85 -80
  69. package/src/simulate2.js +77 -78
  70. package/src/soc_pokec.js +44 -32
  71. package/static/datafolderui/QyStyledElement.js +12 -12
  72. package/static/datafolderui/QyUIFolderTree.js +20 -20
  73. package/static/datafolderui/QyUIUtils.js +8 -8
  74. package/static/datafolderui/explore-tree.js +31 -31
  75. package/static/datafolderui/folder-tree.js +2 -2
  76. package/static/datafolderui/hscrpt.js +9 -17
  77. package/static/datafolderui/json-view.js +3 -5
  78. package/static/datafolderui/kv-input.js +15 -15
  79. package/static/datafolderui/list-input.js +17 -17
  80. package/static/datafolderui/main-page.js +18 -18
  81. package/static/datafolderui/num-input.js +5 -5
  82. package/static/datafolderui/query-editor.js +6 -1
  83. package/static/datafolderui/querySelectorShadowRoot.js +15 -19
  84. package/static/datafolderui/resizable-input.js +18 -18
package/src/QySaver.js CHANGED
@@ -1,11 +1,34 @@
1
- let fsPromises = require("node:fs/promises"), path = require("node:path"), logger = require("./QyLogger.js").logger, qyUtils = require("./QyUtils.js"), getDefaultOptions = require("./QyDefaultOptions.js").getDefaultOptions;
1
+ import s, {
2
+ readFile as i
3
+ } from "node:fs/promises";
2
4
 
3
- class QySaver {
5
+ import {
6
+ join as c
7
+ } from "node:path";
8
+
9
+ import {
10
+ logger as m
11
+ } from "./QyLogger.js";
12
+
13
+ import {
14
+ toBuffer as r,
15
+ folderOrFileExists as u,
16
+ getSizeStr as o,
17
+ sleep as g,
18
+ getSize as n,
19
+ ensureParentDir as l
20
+ } from "./QyUtils.js";
21
+
22
+ import {
23
+ getDefaultOptions as t
24
+ } from "./QyDefaultOptions.js";
25
+
26
+ class e {
4
27
  constructor(e, r) {
5
28
  Object.assign(this, {
6
29
  dataFolder: e,
7
30
  options: {
8
- ...getDefaultOptions("QySaver"),
31
+ ...t("QySaver"),
9
32
  ...r
10
33
  }
11
34
  });
@@ -17,67 +40,67 @@ class QySaver {
17
40
  return e;
18
41
  }
19
42
  processBeforeSave(e) {
20
- return qyUtils.toBuffer(e);
43
+ return r(e);
21
44
  }
22
45
  async loadFromFile(e, r) {
23
- var t = path.join(this.dataFolder, e);
24
- if (null != r && !await qyUtils.folderOrFileExists(t)) return r;
46
+ var t = c(this.dataFolder, e);
47
+ if (null != r && !await u(t)) return r;
25
48
  try {
26
- var a = await fsPromises.readFile(t);
27
- return logger.info(`Loading "${t}" succeeded. Total size:${qyUtils.getSizeStr(a.length)}.`),
49
+ var a = await i(t);
50
+ return m.info(`Loading "${t}" succeeded. Total size:${o(a.length)}.`),
28
51
  this.processAfterLoad(a, e);
29
52
  } catch (e) {
30
53
  if (null != r) return r;
31
- logger.error(`Loading "${t}" failed:`, e);
54
+ m.error(`Loading "${t}" failed:`, e);
32
55
  }
33
56
  }
34
57
  async saveToFile(e, t, r = !1) {
35
58
  var {
36
59
  dataFolder: a,
37
60
  options: i
38
- } = this, s = path.join(a, t);
39
- if (!r && await qyUtils.folderOrFileExists(s)) logger.error(s + " already exists."); else {
61
+ } = this, s = c(a, t);
62
+ if (!r && await u(s)) m.error(s + " already exists."); else {
40
63
  var {
41
64
  retryTimes: o,
42
- retryIntervalFactor: l,
43
- maxRetryInterval: n
44
- } = i, g = path.join(a, ".tmp", t), d = this.processBeforeSave(e, t);
65
+ retryIntervalFactor: n,
66
+ maxRetryInterval: l
67
+ } = i, d = c(a, ".tmp", t), f = this.processBeforeSave(e, t);
45
68
  let r;
46
69
  for (let e = 0; e < o; ++e) {
47
- if (await this._saveTmpFileAndRename(d, g, s)) return !0;
48
- r = r ? Math.min(n, r * l) : 1, logger.warn(`Retrying to create ${s} in ${r} seconds.`),
49
- await qyUtils.sleep(r);
70
+ if (await this._saveTmpFileAndRename(f, d, s)) return !0;
71
+ r = r ? Math.min(l, r * n) : 1, m.warn(`Retrying to create ${s} in ${r} seconds.`),
72
+ await g(r);
50
73
  }
51
- logger.error(`Failed to create ${t} after retrying ${o} times.`);
74
+ m.error(`Failed to create ${t} after retrying ${o} times.`);
52
75
  }
53
76
  return !1;
54
77
  }
55
78
  async _saveTmpFileAndRename(e, r, t) {
56
79
  var a = e.length;
57
- if (await this._saveContent(r, e) != a) logger.error(`Creating ${t} failed when trying to create ${r} first.`); else try {
58
- if (await fsPromises.rename(r, t), await qyUtils.getSize(t) === a) return logger.info(`Renaming ${r} to ${t} succeeded.`),
80
+ if (await this._saveContent(r, e) != a) m.error(`Creating ${t} failed when trying to create ${r} first.`); else try {
81
+ if (await s.rename(r, t), await n(t) === a) return m.info(`Renaming ${r} to ${t} succeeded.`),
59
82
  !0;
60
- logger.error(t + " size is not correct.");
83
+ m.error(t + " size is not correct.");
61
84
  } catch (e) {
62
- logger.error(`Renaming ${r} to ${t} failed:`, e);
85
+ m.error(`Renaming ${r} to ${t} failed:`, e);
63
86
  }
64
87
  return !1;
65
88
  }
66
89
  async _saveContent(r, e) {
67
90
  var t = e.length;
68
91
  try {
69
- await qyUtils.ensureParentDir(r), await fsPromises.writeFile(r, e, {
92
+ await l(r), await s.writeFile(r, e, {
70
93
  flush: !0
71
94
  });
72
- var a = `Saving ${r} size ` + qyUtils.getSizeStr(t), i = await qyUtils.getSize(r);
73
- return i === t ? logger.info(a + " succeeded.") : logger.warn(a + " failed."),
95
+ var a = `Saving ${r} size ` + o(t), i = await n(r);
96
+ return i === t ? m.info(a + " succeeded.") : m.warn(a + " failed."),
74
97
  i;
75
98
  } catch (e) {
76
- return logger.error(`Saving "${r}" failed:`, e), !1;
99
+ return m.error(`Saving "${r}" failed:`, e), !1;
77
100
  }
78
101
  }
79
102
  }
80
103
 
81
- Object.assign(module.exports, {
82
- QySaver: QySaver
83
- });
104
+ export {
105
+ e as QySaver
106
+ };
@@ -1,17 +1,23 @@
1
- let QyMessager = require("./QyMessager.js").QyMessager, getDefaultOptions = require("./QyDefaultOptions.js").getDefaultOptions;
1
+ import {
2
+ QyMessager as o
3
+ } from "./QyMessager.js";
2
4
 
3
- class QySnapshotCompactor extends QyMessager {
4
- constructor(s, o, t) {
5
- super(s, "QySnapshotCompactor_Worker.js", {
6
- kvFolder: o,
5
+ import {
6
+ getDefaultOptions as a
7
+ } from "./QyDefaultOptions.js";
8
+
9
+ class s extends o {
10
+ constructor(o, s, t) {
11
+ super(o, "QySnapshotCompactor_Worker.js", {
12
+ kvFolder: s,
7
13
  options: t = {
8
- ...getDefaultOptions("QySnapshotCompactor"),
14
+ ...a("QySnapshotCompactor"),
9
15
  ...t
10
16
  }
11
17
  }, t, [], [ "compactSnapshots", "saveSnapshotInfos" ]);
12
18
  }
13
19
  }
14
20
 
15
- Object.assign(module.exports, {
16
- QySnapshotCompactor: QySnapshotCompactor
17
- });
21
+ export {
22
+ s as QySnapshotCompactor
23
+ };
@@ -1,24 +1,48 @@
1
- let path = require("node:path"), fsPromises = require("node:fs/promises"), getDefaultOptions = require("./QyDefaultOptions.js").getDefaultOptions, QyMessageWorker = require("./QyMessageWorker.js").QyMessageWorker, QyKVDataCleaner = require("./QyKVDataCleaner.js").QyKVDataCleaner, QySnapshots = require("./QySnapshots.js").QySnapshots, {
2
- isEmptyObj,
3
- listToMap,
4
- readBufferAsync
5
- } = require("./QyUtils.js");
1
+ import {
2
+ join as t
3
+ } from "node:path";
6
4
 
7
- class QySnapshotCompactor_Worker extends QyMessageWorker {
5
+ import {
6
+ open as h
7
+ } from "node:fs/promises";
8
+
9
+ import {
10
+ getDefaultOptions as e
11
+ } from "./QyDefaultOptions.js";
12
+
13
+ import {
14
+ QyMessageWorker as a
15
+ } from "./QyMessageWorker.js";
16
+
17
+ import {
18
+ QyKVDataCleaner as p
19
+ } from "./QyKVDataCleaner.js";
20
+
21
+ import {
22
+ QySnapshots as n
23
+ } from "./QySnapshots.js";
24
+
25
+ import {
26
+ isEmptyObj as r,
27
+ listToMap as y,
28
+ readBufferAsync as l
29
+ } from "./QyUtils.js";
30
+
31
+ class s extends a {
8
32
  constructor({
9
33
  kvFolder: a,
10
34
  options: s
11
35
  }) {
12
36
  super(s = {
13
- ...getDefaultOptions("QySnapshotCompactor_Worker"),
37
+ ...e("QySnapshotCompactor_Worker"),
14
38
  ...s
15
39
  }, [], [ "compactSnapshots", "saveSnapshotInfos" ]);
16
- var e = path.join(a, "snapshot");
40
+ var o = t(a, "snapshot");
17
41
  Object.assign(this, {
18
42
  kvFolder: a,
19
- snapshotFolder: e,
20
- qySnapshots: new QySnapshots(e, s),
21
- qyKVDataCleaner: new QyKVDataCleaner(this, a, s),
43
+ snapshotFolder: o,
44
+ qySnapshots: new n(o, s),
45
+ qyKVDataCleaner: new p(this, a, s),
22
46
  pMInfoMap: {},
23
47
  vLInfoMap: {}
24
48
  });
@@ -29,123 +53,120 @@ class QySnapshotCompactor_Worker extends QyMessageWorker {
29
53
  async stop() {
30
54
  await this.qyKVDataCleaner.stop();
31
55
  }
32
- async _op_compactSnapshots(a, e, s) {
33
- var o = {}, t = [];
56
+ async _op_compactSnapshots(a, o, s) {
57
+ var t = {}, e = [];
34
58
  if (0 < a.length) {
35
- let s = o.pMUpdates = {};
36
- t.push(...a.map(a => this._compactPosMap(a, s)));
59
+ let s = t.pMUpdates = {};
60
+ e.push(...a.map(a => (async (a, s, o) => {
61
+ var {
62
+ qySnapshots: t,
63
+ pMInfoMap: e
64
+ } = a, {
65
+ snapshotNum: p,
66
+ info: n,
67
+ prefixPM: i
68
+ } = s;
69
+ (null == i || r(i) || await f(a, s)) && (await t.savePosMap(s),
70
+ e[p] = n, o[p] = s.prefixPM);
71
+ })(this, a, s)));
37
72
  }
38
- if (0 < e.length) {
39
- let s = o.vLUpdates = {};
40
- t.push(...e.map(a => this._compactValueList(a, s)));
73
+ if (0 < o.length) {
74
+ let s = t.vLUpdates = {};
75
+ e.push(...o.map(a => (async (a, s, o) => {
76
+ var t, {
77
+ qySnapshots: e,
78
+ vLInfoMap: p
79
+ } = a;
80
+ await f(a, s) && (await M(a, s), await e.saveKeyValueMap(s), {
81
+ snapshotNum: a,
82
+ info: e,
83
+ posMap: s,
84
+ prefixPM: t
85
+ } = s, p[a] = e, o[a] = {
86
+ posMap: s,
87
+ prefixPM: t
88
+ });
89
+ })(this, a, s)));
41
90
  }
42
- 0 < s.length && t.push(this._combinePMLoadedSnapshots(s, o)), await Promise.all(t),
43
- this.castParent("onCompactUpdates", o);
91
+ 0 < s.length && e.push((async (a, s, o) => {
92
+ var t, {
93
+ qySnapshots: e,
94
+ vLInfoMap: p
95
+ } = a, n = e.getMaxCombinedSnapshot(s), {
96
+ snapshotNum: i,
97
+ info: r,
98
+ keyValueMap: f
99
+ } = (await M(a, n), n), h = (Object.assign(n, {
100
+ posMap: void 0,
101
+ prefixPM: void 0
102
+ }), []);
103
+ for (t of s) t != n && (h.push(t.snapshotNum), await M(a, t), Object.assign(f, t.keyValueMap),
104
+ Object.assign(t, {
105
+ keyValueMap: void 0,
106
+ posMap: void 0,
107
+ prefixPM: void 0
108
+ }));
109
+ await e.saveKeyValueMap(n), p[i] = r, o.combineUpdate = {
110
+ snapshotNum: i,
111
+ combinedSnapshotNumList: h,
112
+ posMap: n.posMap
113
+ };
114
+ })(this, s, t)), await Promise.all(e), this.castParent("onCompactUpdates", t);
44
115
  }
45
116
  async _op_saveSnapshotInfos(a) {
46
- var s, e, {
47
- qySnapshots: o,
48
- pMInfoMap: t,
117
+ var s, o, {
118
+ qySnapshots: t,
119
+ pMInfoMap: e,
49
120
  vLInfoMap: p,
50
121
  qyKVDataCleaner: n
51
122
  } = this, i = (Object.assign(this, {
52
123
  pMInfoMap: {},
53
124
  vLInfoMap: {}
54
- }), listToMap(a)), r = [];
55
- for (s in t) s in i && r.push(o.saveSnapshotInfo(s, t[s]));
56
- for (e in p) e in i && r.push(o.saveSnapshotInfo(e, p[e]));
125
+ }), y(a)), r = [];
126
+ for (s in e) s in i && r.push(t.saveSnapshotInfo(s, e[s]));
127
+ for (o in p) o in i && r.push(t.saveSnapshotInfo(o, p[o]));
57
128
  if (0 < r.length) {
58
129
  await Promise.all(r);
59
- var h, l, M = [];
60
- for (h in t) {
61
- var f = t[h];
62
- M.push([ h, f.pMVersion ]);
130
+ var f, h, l = [];
131
+ for (f in e) {
132
+ var M = e[f];
133
+ l.push([ f, M.pMVersion ]);
63
134
  }
64
- for (l in p) {
65
- var y = p[l];
66
- M.push([ l, y.pMVersion ]), n.cleanVLFiles(l, y.vLVersion);
135
+ for (h in p) {
136
+ var v = p[h];
137
+ l.push([ h, v.pMVersion ]), n.cleanVLFiles(h, v.vLVersion);
67
138
  }
68
- n.cleanPMFiles(M);
139
+ n.cleanPMFiles(l);
69
140
  }
70
141
  }
71
- async _combinePMLoadedSnapshots(a, s) {
72
- var e, {
73
- qySnapshots: o,
74
- vLInfoMap: t
75
- } = this, p = o.getMaxCombinedSnapshot(a), {
76
- snapshotNum: n,
77
- info: i,
78
- keyValueMap: r
79
- } = (await this._loadKVMap(p), p), h = (Object.assign(p, {
80
- posMap: void 0,
81
- prefixPM: void 0
82
- }), []);
83
- for (e of a) e != p && (h.push(e.snapshotNum), await this._loadKVMap(e),
84
- Object.assign(r, e.keyValueMap), Object.assign(e, {
85
- keyValueMap: void 0,
86
- posMap: void 0,
87
- prefixPM: void 0
88
- }));
89
- await o.saveKeyValueMap(p), t[n] = i, s.combineUpdate = {
90
- snapshotNum: n,
91
- combinedSnapshotNumList: h,
92
- posMap: p.posMap
93
- };
94
- }
95
- async _compactValueList(a, s) {
96
- var e, o, {
97
- qySnapshots: t,
98
- vLInfoMap: p
99
- } = this;
100
- await this._loadPosMap(a) && (await this._loadKVMap(a), await t.saveKeyValueMap(a),
101
- {
102
- snapshotNum: t,
103
- info: a,
104
- posMap: e,
105
- prefixPM: o
106
- } = a, p[t] = a, s[t] = {
107
- posMap: e,
108
- prefixPM: o
109
- });
110
- }
111
- async _compactPosMap(a, s) {
112
- var {
113
- qySnapshots: e,
114
- pMInfoMap: o
115
- } = this, {
116
- snapshotNum: t,
117
- info: p,
118
- prefixPM: n
119
- } = a;
120
- (null == n || isEmptyObj(n) || await this._loadPosMap(a)) && (await e.savePosMap(a),
121
- o[t] = p, s[t] = a.prefixPM);
142
+ }
143
+
144
+ async function f(a, s) {
145
+ var o = a.qySnapshots;
146
+ let {
147
+ prefixPM: t,
148
+ posMap: e
149
+ } = s;
150
+ var p, n = o.getPMFilePath(s), i = await h(n);
151
+ for (p of Object.keys(t).sort()) {
152
+ var [ r, f ] = t[p], r = await l(n, i, r, f);
153
+ if (!r) return void i.close();
154
+ o.iterPMBuffer(r, (a, s) => e[a] = s);
122
155
  }
123
- async _loadPosMap(a) {
124
- var s = this.qySnapshots;
125
- let {
126
- prefixPM: e,
127
- posMap: o
128
- } = a;
129
- var t, p = s.getPMFilePath(a), n = await fsPromises.open(p);
130
- for (t of Object.keys(e).sort()) {
131
- var [ i, r ] = e[t], i = await readBufferAsync(p, n, i, r);
156
+ return i.close(), !0;
157
+ }
158
+
159
+ async function M(a, s) {
160
+ var o, a = a.qySnapshots, t = s.posMap, e = s.keyValueMap = {}, p = a.getVLFilePath(s), n = await h(p);
161
+ for (o of Object.keys(t).sort()) {
162
+ var [ i, r ] = t[o];
163
+ if (0 < r) {
164
+ i = await l(p, n, i, r);
132
165
  if (!i) return void n.close();
133
- s.iterPMBuffer(i, (a, s) => o[a] = s);
134
- }
135
- return n.close(), !0;
136
- }
137
- async _loadKVMap(a) {
138
- var s, e = this.qySnapshots, o = a.posMap, t = a.keyValueMap = {}, p = e.getVLFilePath(a), n = await fsPromises.open(p);
139
- for (s of Object.keys(o).sort()) {
140
- var [ i, r ] = o[s];
141
- if (0 < r) {
142
- i = await readBufferAsync(p, n, i, r);
143
- if (!i) return void n.close();
144
- t[s] = i;
145
- } else t[s] = void 0;
146
- }
147
- return n.close(), !0;
166
+ e[o] = i;
167
+ } else e[o] = void 0;
148
168
  }
169
+ return n.close(), !0;
149
170
  }
150
171
 
151
- module.exports = QySnapshotCompactor_Worker;
172
+ export default s;
@@ -1,17 +1,23 @@
1
- let QyMessager = require("./QyMessager.js").QyMessager, getDefaultOptions = require("./QyDefaultOptions.js").getDefaultOptions;
1
+ import {
2
+ QyMessager as s
3
+ } from "./QyMessager.js";
2
4
 
3
- class QySnapshotSaver extends QyMessager {
4
- constructor(e, s, a) {
5
- super(e, "QySnapshotSaver_Worker.js", {
6
- kvFolder: s,
5
+ import {
6
+ getDefaultOptions as o
7
+ } from "./QyDefaultOptions.js";
8
+
9
+ class e extends s {
10
+ constructor(s, e, a) {
11
+ super(s, "QySnapshotSaver_Worker.js", {
12
+ kvFolder: e,
7
13
  options: a = {
8
- ...getDefaultOptions("QySnapshotSaver"),
14
+ ...o("QySnapshotSaver"),
9
15
  ...a
10
16
  }
11
17
  }, a, [], [ "saveSnapshot", "castSave", "releaseSnapshot" ]);
12
18
  }
13
19
  }
14
20
 
15
- Object.assign(module.exports, {
16
- QySnapshotSaver: QySnapshotSaver
17
- });
21
+ export {
22
+ e as QySnapshotSaver
23
+ };