datafolder 1.0.5 → 1.0.7

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 (49) hide show
  1. package/README.md +5 -0
  2. package/internal.md +119 -0
  3. package/package.json +2 -2
  4. package/sample.js +19 -19
  5. package/scripts/convertBinFiles.js +49 -0
  6. package/scripts/fastify.js +2 -2
  7. package/src/QyAcl.js +44 -44
  8. package/src/QyAclSaver_Worker.js +2 -2
  9. package/src/QyAclWriter.js +1 -1
  10. package/src/QyBatch.js +1 -3
  11. package/src/QyBinWriter.js +65 -66
  12. package/src/QyCD.js +72 -27
  13. package/src/QyCache.js +39 -33
  14. package/src/QyDB.js +4 -30
  15. package/src/QyDefaultOptions.js +2 -1
  16. package/src/QyFetch.js +4 -22
  17. package/src/QyFileLogger.js +2 -2
  18. package/src/QyKVData.js +168 -183
  19. package/src/QyKVDataCleaner_Worker.js +15 -14
  20. package/src/QyKVDataSaver_Worker.js +20 -20
  21. package/src/QyLogFileSaver.js +1 -1
  22. package/src/QyLogFileSaver_Worker.js +2 -2
  23. package/src/QyMod.js +7 -7
  24. package/src/QyOpRunner.js +19 -16
  25. package/src/QySnapshotCompactor_Worker.js +54 -52
  26. package/src/QySnapshotSaver_Worker.js +55 -53
  27. package/src/QySnapshots.js +157 -147
  28. package/src/QyUnionNode.js +2 -2
  29. package/src/rpc/evalCode.js +4 -4
  30. package/src/rpc/getFileContent.js +4 -4
  31. package/src/rpc/getSubItems.js +12 -12
  32. package/src/rpc/getTriggerFiles.js +1 -0
  33. package/src/rpc/queryFiles.js +1 -1
  34. package/src/soc_pokec.js +7 -7
  35. package/static/codemirror.bundle/editor.bundle.js +27906 -0
  36. package/static/datafolderui/QyStyledElement.js +6 -15
  37. package/static/datafolderui/QyUIFolderTree.js +130 -145
  38. package/static/datafolderui/QyUIFolderViewer.js +210 -0
  39. package/static/datafolderui/QyUIUtils.js +10 -5
  40. package/static/datafolderui/code-mirror.js +35 -0
  41. package/static/datafolderui/display-tree.js +21 -94
  42. package/static/datafolderui/explore-tree.js +66 -81
  43. package/static/datafolderui/folder-tree.js +71 -2
  44. package/static/datafolderui/index.css +7 -0
  45. package/static/datafolderui/index.html +1 -0
  46. package/static/datafolderui/json-view.js +7 -3
  47. package/static/datafolderui/main-page.js +42 -60
  48. package/static/datafolderui/query-editor.js +178 -198
  49. package/static/datafolderui/trigger-editor.js +30 -0
@@ -11,7 +11,7 @@ class s extends e {
11
11
  super(e, "QyLogFileSaver_Worker.js", s = {
12
12
  ...r("QyLogFileSaver"),
13
13
  ...s
14
- }, s, [ "switch" ], [ "save" ]);
14
+ }, s, [], [ "switch", "save" ]);
15
15
  }
16
16
  }
17
17
 
@@ -19,10 +19,10 @@ class i extends t {
19
19
  qyBinWriter: new r(t)
20
20
  });
21
21
  }
22
- async start(t) {
22
+ async _op_start(t) {
23
23
  await this.qyBinWriter.start(t);
24
24
  }
25
- async stop() {
25
+ async _op_stop() {
26
26
  await this.qyBinWriter.stop();
27
27
  }
28
28
  async switch(t) {
package/src/QyMod.js CHANGED
@@ -1,16 +1,16 @@
1
- import m from "node:module";
1
+ import a from "node:module";
2
2
 
3
3
  import {
4
- logger as a
4
+ logger as m
5
5
  } from "./QyLogger.js";
6
6
 
7
- function o(r, e, i, o) {
8
- if (i) try {
9
- var t = r + "_" + e, d = `_${t}_qydb`, l = (globalThis[d] = o, new m(e));
10
- return l._compile(`(function(qyDB){${i}})(${d});`, t + ".js"), delete globalThis[d],
7
+ function o(r, e, d, o) {
8
+ if (d) try {
9
+ var i = r + "_" + e, t = `_${i}_qydb`, l = (globalThis[t] = o, new a(e));
10
+ return l._compile(`(function(dataFolder){${d}})(${t});`, i + ".js"), delete globalThis[t],
11
11
  l.exports;
12
12
  } catch (o) {
13
- a.error("requireFromModCode failed:", r, e, i, o);
13
+ m.error("requireFromModCode failed:", r, e, d, o);
14
14
  }
15
15
  }
16
16
 
package/src/QyOpRunner.js CHANGED
@@ -9,23 +9,23 @@ import {
9
9
  } from "./QyLogger.js";
10
10
 
11
11
  import {
12
- getDefaultOptions as i
12
+ getDefaultOptions as r
13
13
  } from "./QyDefaultOptions.js";
14
14
 
15
15
  import {
16
- QyQueue as n
16
+ QyQueue as i
17
17
  } from "./QyQueue.js";
18
18
 
19
19
  class e extends s {
20
20
  constructor(s, t = [], e = []) {
21
21
  super(), s = {
22
- ...i("QyOpRunner"),
22
+ ...r("QyOpRunner"),
23
23
  ...s
24
24
  }, Object.assign(this, {
25
25
  options: s,
26
26
  running: !1,
27
- opQueue: new n(s)
28
- }), r(this, t, !0), r(this, e);
27
+ opQueue: new i(s)
28
+ }), n(this, t, !0), n(this, e), n(this, [ "start", "stop" ], !0);
29
29
  }
30
30
  get firstOp() {
31
31
  return this.opQueue.first;
@@ -50,38 +50,41 @@ class e extends s {
50
50
  for (var s = this.opQueue; !s.isEmpty; ) {
51
51
  var t = s.shift(), {
52
52
  opFunName: e,
53
- eventName: i,
54
- resolve: n,
55
- args: r
53
+ eventName: r,
54
+ resolve: i,
55
+ args: n
56
56
  } = t;
57
57
  if (e) {
58
58
  this.runningOp = t;
59
59
  try {
60
- var o = await (r ? this[e](...r) : this[e]());
61
- n && n(o), i && this.emit(i, o);
60
+ var o = await (n ? this[e](...n) : this[e]());
61
+ i && i(o), r && this.emit(r, o);
62
62
  } catch (s) {
63
- u.error(`Run ${e} failed:`, s), i && this.emit(i, s);
63
+ u.error(`Run ${e} failed:`, s), r && this.emit(r, s);
64
64
  }
65
65
  this.runningOp = void 0;
66
- } else n && n(), i && this.emit(i);
66
+ } else i && i(), r && this.emit(r);
67
67
  }
68
68
  this.running = !1;
69
69
  }
70
70
  }
71
71
  }
72
72
 
73
- function r(i, s, n) {
73
+ function n(r, s, i) {
74
74
  for (let e of s) {
75
75
  let t = "_op_" + e;
76
- i[e] || (i[e] = n ? (...s) => i.pushAndRunWithPromise({
76
+ if (r[e] || (r[e] = i ? (...s) => r.pushAndRunWithPromise({
77
77
  opName: e,
78
78
  opFunName: t,
79
79
  args: s
80
- }) : (...s) => i.pushAndRun({
80
+ }) : (...s) => r.pushAndRun({
81
81
  opName: e,
82
82
  opFunName: t,
83
83
  args: s
84
- })), i[t] || (i[t] = () => u.error(`Class method ${t} not implemented.`));
84
+ })), !r[t]) {
85
+ let s = r.constructor.name + " not implemented " + t;
86
+ r[t] = () => u.error(s), u.error(s);
87
+ }
85
88
  }
86
89
  }
87
90
 
@@ -3,7 +3,7 @@ import {
3
3
  } from "node:path";
4
4
 
5
5
  import {
6
- open as h
6
+ open as f
7
7
  } from "node:fs/promises";
8
8
 
9
9
  import {
@@ -19,12 +19,12 @@ import {
19
19
  } from "./QyKVDataCleaner.js";
20
20
 
21
21
  import {
22
- QySnapshots as n
22
+ QySnapshots as n,
23
+ iterPMBuffer as h
23
24
  } from "./QySnapshots.js";
24
25
 
25
26
  import {
26
27
  isEmptyObj as r,
27
- listToMap as y,
28
28
  readBufferAsync as l
29
29
  } from "./QyUtils.js";
30
30
 
@@ -44,13 +44,14 @@ class s extends a {
44
44
  qySnapshots: new n(o, s),
45
45
  qyKVDataCleaner: new p(this, a, s),
46
46
  pMInfoMap: {},
47
- vLInfoMap: {}
47
+ vLInfoMap: {},
48
+ combinedSnapshotNumList: []
48
49
  });
49
50
  }
50
- start() {
51
+ _op_start() {
51
52
  this.qyKVDataCleaner.start();
52
53
  }
53
- async stop() {
54
+ async _op_stop() {
54
55
  await this.qyKVDataCleaner.stop();
55
56
  }
56
57
  async _op_compactSnapshots(a, o, s) {
@@ -66,7 +67,7 @@ class s extends a {
66
67
  info: n,
67
68
  prefixPM: i
68
69
  } = s;
69
- (null == i || r(i) || await f(a, s)) && (await t.savePosMap(s),
70
+ (null == i || r(i) || await M(a, s)) && (await t.savePosMap(s),
70
71
  e[p] = n, o[p] = s.prefixPM);
71
72
  })(this, a, s)));
72
73
  }
@@ -77,7 +78,7 @@ class s extends a {
77
78
  qySnapshots: e,
78
79
  vLInfoMap: p
79
80
  } = a;
80
- await f(a, s) && (await M(a, s), await e.saveKeyValueMap(s), {
81
+ await M(a, s) && (await m(a, s), await e.saveKeyValueMap(s), {
81
82
  snapshotNum: a,
82
83
  info: e,
83
84
  posMap: s,
@@ -91,73 +92,74 @@ class s extends a {
91
92
  0 < s.length && e.push((async (a, s, o) => {
92
93
  var t, {
93
94
  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, {
95
+ vLInfoMap: p,
96
+ combinedSnapshotNumList: n
97
+ } = a, i = e.getMaxCombinedSnapshot(s), {
98
+ snapshotNum: r,
99
+ info: f,
100
+ keyValueMap: h
101
+ } = (await m(a, i), i);
102
+ Object.assign(i, {
100
103
  posMap: void 0,
101
104
  prefixPM: void 0
102
- }), []);
103
- for (t of s) t != n && (h.push(t.snapshotNum), await M(a, t), Object.assign(f, t.keyValueMap),
105
+ });
106
+ for (t of s) t != i && (n.push(t.snapshotNum), await m(a, t), Object.assign(h, t.keyValueMap),
104
107
  Object.assign(t, {
105
108
  keyValueMap: void 0,
106
109
  posMap: void 0,
107
110
  prefixPM: void 0
108
111
  }));
109
- await e.saveKeyValueMap(n), p[i] = r, o.combineUpdate = {
110
- snapshotNum: i,
111
- combinedSnapshotNumList: h,
112
- posMap: n.posMap
112
+ await e.saveKeyValueMap(i), p[r] = f, o.combineUpdate = {
113
+ snapshotNum: r,
114
+ combinedSnapshotNumList: n,
115
+ posMap: i.posMap
113
116
  };
114
117
  })(this, s, t)), await Promise.all(e), this.castParent("onCompactUpdates", t);
115
118
  }
116
- async _op_saveSnapshotInfos(a) {
117
- var s, o, {
118
- qySnapshots: t,
119
- pMInfoMap: e,
120
- vLInfoMap: p,
119
+ async _op_saveSnapshotInfos() {
120
+ var a, s, {
121
+ qySnapshots: o,
122
+ pMInfoMap: t,
123
+ vLInfoMap: e,
124
+ combinedSnapshotNumList: p,
121
125
  qyKVDataCleaner: n
122
126
  } = this, i = (Object.assign(this, {
123
127
  pMInfoMap: {},
124
128
  vLInfoMap: {}
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]));
128
- if (0 < r.length) {
129
- await Promise.all(r);
130
- var f, h, l = [];
131
- for (f in e) {
132
- var M = e[f];
133
- l.push([ f, M.pMVersion ]);
134
- }
135
- for (h in p) {
136
- var v = p[h];
137
- l.push([ h, v.pMVersion ]), n.cleanVLFiles(h, v.vLVersion);
138
- }
139
- n.cleanPMFiles(l);
129
+ }), []);
130
+ for (a in t) i.push(o.saveSnapshotInfo(a, t[a]));
131
+ for (s in e) i.push(o.saveSnapshotInfo(s, e[s]));
132
+ await Promise.all(i);
133
+ var r, f, h = [];
134
+ for (r in t) {
135
+ var l = t[r];
136
+ h.push([ r, l.pMVersion ]);
137
+ }
138
+ for (f in e) {
139
+ var M = e[f];
140
+ h.push([ f, M.pMVersion ]), n.cleanVLFiles(f, M.vLVersion);
140
141
  }
142
+ n.cleanPMFiles(h), 0 < p.length && (n.removeSnapshotsFiles(p), p.length = 0);
141
143
  }
142
144
  }
143
145
 
144
- async function f(a, s) {
145
- var o = a.qySnapshots;
146
+ async function M(a, s) {
147
+ a = a.qySnapshots;
146
148
  let {
147
- prefixPM: t,
148
- posMap: e
149
+ prefixPM: o,
150
+ posMap: t
149
151
  } = 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);
152
+ var e, p = a.getPMFilePath(s), n = await f(p);
153
+ for (e of Object.keys(o).sort()) {
154
+ var [ i, r ] = o[e], i = await l(p, n, i, r);
155
+ if (!i) return n.close(), !1;
156
+ h(i, (a, s) => t[a] = s);
155
157
  }
156
- return i.close(), !0;
158
+ return n.close(), !0;
157
159
  }
158
160
 
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
+ async function m(a, s) {
162
+ var o, a = a.qySnapshots, t = s.posMap, e = s.keyValueMap = {}, p = a.getVLFilePath(s), n = await f(p);
161
163
  for (o of Object.keys(t).sort()) {
162
164
  var [ i, r ] = t[o];
163
165
  if (0 < r) {
@@ -1,5 +1,5 @@
1
1
  import {
2
- join as e
2
+ join as t
3
3
  } from "node:path";
4
4
 
5
5
  import {
@@ -26,124 +26,126 @@ class s extends a {
26
26
  super(s = {
27
27
  ...o("QySnapshotSaver_Worker"),
28
28
  ...s
29
- }, [ "stop", "waitForSnapshotSaved" ]);
30
- var t = e(a, "snapshot");
29
+ }, [], [ "waitForSnapshotSaved" ]);
30
+ var e = t(a, "snapshot");
31
31
  Object.assign(this, {
32
32
  kvFolder: a,
33
- snapshotFolder: t,
34
- qySnapshots: new n(t, s),
33
+ snapshotFolder: e,
34
+ qySnapshots: new n(e, s),
35
35
  qyKVDataCleaner: new p(this, a, s),
36
- aclKeyValueMap: {}
36
+ aclKeyValueMap: {},
37
+ snapshotSavedChangeId: 0
37
38
  });
38
39
  }
39
- start(a, s, t) {
40
- this.maxChangeId = a, this.qyKVDataCleaner.start(), s && this.waitForSnapshotSaved(h(this, s, a, t));
40
+ _op_start(a, s, e) {
41
+ this.maxChangeId = a, this.qyKVDataCleaner.start(), s && this.waitForSnapshotSaved(h(this, s, a, e));
41
42
  }
42
- castSave(a, s, t) {
43
+ castSave(a, s, e) {
43
44
  var {
44
- aclKeyValueMap: e,
45
+ aclKeyValueMap: t,
45
46
  qySnapshots: o
46
47
  } = this;
47
- o.applyCmdObj(s, e, t), this.maxChangeId = a;
48
+ o.applyCmdObj(s, t, e), this.maxChangeId = a;
48
49
  }
49
50
  async saveSnapshot(a) {
50
51
  var {
51
52
  maxChangeId: s,
52
- aclKeyValueMap: t
53
+ aclKeyValueMap: e
53
54
  } = this;
54
- this.aclKeyValueMap = {}, this.waitForSnapshotSaved(h(this, a, s, t));
55
+ this.aclKeyValueMap = {}, this.waitForSnapshotSaved(h(this, a, s, e));
55
56
  }
56
57
  releaseSnapshot(a) {
57
- var s, t = this.qySnapshots, {
58
- numToSnapshotMap: e,
58
+ var s, e = this.qySnapshots, {
59
+ numToSnapshotMap: t,
59
60
  keyToSnapshotMap: o
60
- } = t, e = e[a], a = e.keyValueMap;
61
- for (s in delete e.keyValueMap, a) delete o[s];
62
- t.delSnapshot(e), global.gc && global.gc();
61
+ } = e, t = t[a], a = t.keyValueMap;
62
+ for (s in delete t.keyValueMap, a) delete o[s];
63
+ e.delSnapshot(t), global.gc && global.gc();
63
64
  }
64
65
  async _op_stop() {
65
66
  var {
66
67
  qySnapshots: a,
67
- qyKVDataCleaner: s
68
+ qyKVDataCleaner: s,
69
+ snapshotSavedChangeId: e
68
70
  } = this;
69
- a.closeAllFDs(), await s.stop();
71
+ return a.closeAllFDs(), await s.stop(), e;
70
72
  }
71
73
  async _op_waitForSnapshotSaved({
72
74
  saveMaxSnapshotInfoPromise: a,
73
75
  outdates: s
74
76
  }) {
75
- var t, {
77
+ var e, {
76
78
  snapshotNum: a,
77
- maxChangeId: e
79
+ maxChangeId: t
78
80
  } = await a, {
79
81
  emptySnapshotNumList: s,
80
82
  pMChangeList: o,
81
83
  vLChange: n,
82
84
  snapshotInfoMap: p,
83
85
  promises: h
84
- } = s, {
86
+ } = (this.snapshotSavedChangeId = t, s), {
85
87
  qyKVDataCleaner: r,
86
88
  qySnapshots: i,
87
89
  options: l
88
90
  } = this;
89
- for (t in r.cleanAclFiles(a), 0 < h.length && await Promise.all(h), h.length = 0,
90
- p) h.push(i.saveSnapshotInfo(t, p[t]));
91
+ for (e in r.cleanAclFiles(a), 0 < h.length && await Promise.all(h), h.length = 0,
92
+ p) h.push(i.saveSnapshotInfo(e, p[e]));
91
93
  0 < h.length && await Promise.all(h), 0 < s.length && r.removeSnapshotsFiles(s),
92
94
  0 < o.length && r.cleanPMFiles(o), 0 < n.length && r.cleanVLFiles(n[0], n[1]);
93
95
  let u;
94
96
  a = i.snapshotCount;
95
97
  0 < a && a >= l.maxInMemSnapshotCount && (delete (s = (a => {
96
- let s = a.qySnapshots.numToSnapshotMap, t;
97
- for (var e in s) {
98
- var o = s[e];
99
- (!t || t.snapshotNum > e) && (t = o);
98
+ let s = a.qySnapshots.numToSnapshotMap, e;
99
+ for (var t in s) {
100
+ var o = s[t];
101
+ (!e || e.snapshotNum > t) && (e = o);
100
102
  }
101
- return t;
103
+ return e;
102
104
  })(this)).prefixPM, delete (u = {
103
105
  ...s
104
106
  }).keyValueMap, delete s.posMap, s.isOut = !0, logger.info("Sending snapshot " + s.snapshotNum)),
105
- this.castParent("onSnapshotSavedChangeId", e, u);
107
+ this.castParent("onSnapshotSavedChangeId", t, u);
106
108
  }
107
109
  }
108
110
 
109
- function h(a, s, t, e) {
111
+ function h(a, s, e, t) {
110
112
  var o = (a => {
111
- var s, t = a.qySnapshots, {
112
- emptySnapshotNumList: e,
113
+ var s, e = a.qySnapshots, {
114
+ emptySnapshotNumList: t,
113
115
  combiningSnapshotList: a,
114
116
  pMCompactSnapshotList: o
115
- } = t.calOutdates(), n = {}, p = [], h = [], r = [];
117
+ } = e.calOutdates(), n = {}, p = [], h = [], r = [];
116
118
  for (s of o) {
117
119
  var {
118
120
  snapshotNum: i,
119
121
  info: l
120
122
  } = s;
121
- p.push(t.savePosMap(s)), h.push([ i, l.pMVersion ]), n[i] = {
123
+ p.push(e.savePosMap(s)), h.push([ i, l.pMVersion ]), n[i] = {
122
124
  ...l
123
125
  };
124
126
  }
125
- let u = a.length, m;
127
+ let u = a.length, S;
126
128
  if (0 < u) {
127
- var S, y = t.keyToSnapshotMap, {
128
- keyValueMap: d,
129
+ var m, d = e.keyToSnapshotMap, {
130
+ keyValueMap: y,
129
131
  info: o,
130
132
  snapshotNum: v
131
- } = m = t.getMaxCombinedSnapshot(a);
132
- for (S of a) if (m != S) {
133
+ } = S = e.getMaxCombinedSnapshot(a);
134
+ for (m of a) if (S != m) {
133
135
  var g, {
134
136
  keyValueMap: M,
135
137
  snapshotNum: f
136
- } = S;
137
- for (g in M) d[g] = M[g], y[g] = m;
138
- t.delSnapshot(S), e.push(f);
138
+ } = m;
139
+ for (g in M) y[g] = M[g], d[g] = S;
140
+ e.delSnapshot(m), t.push(f);
139
141
  }
140
- p.push(t.saveKeyValueMap(m)), h.push([ v, o.pMVersion ]), r.push(v, o.vLVersion),
142
+ p.push(e.saveKeyValueMap(S)), h.push([ v, o.pMVersion ]), r.push(v, o.vLVersion),
141
143
  n[v] = {
142
144
  ...o
143
145
  };
144
146
  }
145
147
  return {
146
- emptySnapshotNumList: e,
148
+ emptySnapshotNumList: t,
147
149
  pMChangeList: h,
148
150
  vLChange: r,
149
151
  snapshotInfoMap: n,
@@ -151,27 +153,27 @@ function h(a, s, t, e) {
151
153
  };
152
154
  })(a), s = {
153
155
  snapshotNum: s,
154
- keyValueMap: e,
156
+ keyValueMap: t,
155
157
  outdatedCount: 0,
156
158
  info: {
157
- maxChangeId: t,
159
+ maxChangeId: e,
158
160
  pMVersion: 0,
159
161
  vLVersion: 0
160
162
  }
161
- }, e = (a.qySnapshots.addMaxSnapshot(s), (async (a, s) => {
163
+ }, t = (a.qySnapshots.addMaxSnapshot(s), (async (a, s) => {
162
164
  await (a = a.qySnapshots).saveKeyValueMap(s);
163
165
  var {
164
166
  snapshotNum: s,
165
- info: t
167
+ info: e
166
168
  } = s;
167
- return await a.saveSnapshotInfo(s, t), logger.log("Created snapshot " + s),
169
+ return await a.saveSnapshotInfo(s, e), logger.log("Created snapshot " + s),
168
170
  {
169
171
  snapshotNum: s,
170
- maxChangeId: t.maxChangeId
172
+ maxChangeId: e.maxChangeId
171
173
  };
172
174
  })(a, s));
173
175
  return {
174
- saveMaxSnapshotInfoPromise: e,
176
+ saveMaxSnapshotInfoPromise: t,
175
177
  outdates: o
176
178
  };
177
179
  }