datafolder 1.0.14 → 1.0.16
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.
- package/README.md +4 -0
- package/package.json +3 -2
- package/src/QyAcl.d.ts +4 -4
- package/src/QyAcl.js +92 -93
- package/src/QyAclSaver_Worker.d.ts +2 -2
- package/src/QyAclWriter.d.ts +3 -2
- package/src/QyAclWriter.js +14 -5
- package/src/QyBatch.js +0 -2
- package/src/QyBinWriter.js +0 -2
- package/src/QyCD.d.ts +1 -1
- package/src/QyCache.d.ts +1 -1
- package/src/QyCache.js +25 -23
- package/src/QyDefaultOptions.js +3 -2
- package/src/QyExpire.js +1 -3
- package/src/QyFileLogger.js +6 -7
- package/src/QyItem.js +1 -1
- package/src/QyKVData.d.ts +2 -2
- package/src/QyKVData.js +2 -2
- package/src/QyKVDataCleaner_Worker.js +49 -49
- package/src/QyKVDataLoader.d.ts +1 -1
- package/src/QyKVDataLoader.js +18 -18
- package/src/QyKVDataSaver_Worker.d.ts +2 -2
- package/src/QyKVDataSaver_Worker.js +5 -14
- package/src/QyMessageWorker.js +24 -25
- package/src/QyMessager.d.ts +3 -3
- package/src/QyMessager.js +29 -29
- package/src/QyMod.d.ts +1 -1
- package/src/QyMod.js +6 -6
- package/src/QyOpRunner.d.ts +1 -1
- package/src/QyOpRunner.js +3 -2
- package/src/QyQueue.d.ts +1 -1
- package/src/QyQueue.js +5 -5
- package/src/QySaver.d.ts +1 -1
- package/src/QySaver.js +1 -1
- package/src/QySnapshotCompactor_Worker.js +5 -5
- package/src/QySnapshotSaver_Worker.d.ts +1 -1
- package/src/QySnapshotSaver_Worker.js +2 -2
- package/src/QySnapshots.d.ts +1 -1
- package/src/QySnapshots.js +6 -6
- package/src/QyUnionNode.d.ts +1 -1
- package/src/QyUnionNode.js +1 -1
- package/static/codemirror.bundle/editor.bundle.js +155 -87
- package/test/testQyGraphQL.js +198 -0
package/README.md
CHANGED
|
@@ -4,6 +4,10 @@ datafolder is a lightning fluid JSON database for high speed SSDs, featuring an
|
|
|
4
4
|
|
|
5
5
|
### Changelog
|
|
6
6
|
|
|
7
|
+
1.0.16 Add GraphQL sample data test (test/testQyGraphQL.js) to show how to write complex queries.
|
|
8
|
+
|
|
9
|
+
1.0.15 Use [Workers](https://nodejs.org/docs/latest/api/worker_threads.html) to implement snapshot compactor, expire service, outdated data cleaner etc.
|
|
10
|
+
|
|
7
11
|
1.0.14 Expire supports specifying milliseconds.
|
|
8
12
|
|
|
9
13
|
1.0.13 Added expire support to delete a dir in a specific future time.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "datafolder",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "lysh",
|
|
6
6
|
"email": "datafolderdev@outlook.com"
|
|
@@ -52,7 +52,8 @@
|
|
|
52
52
|
"scripts": {
|
|
53
53
|
"ui": "start http://localhost:3628/datafolderui/index.html && node ./scripts/fastify.js",
|
|
54
54
|
"airbnb": "node ./scripts/airbnb2.js && start http://localhost:3628/datafolderui/index.html && node ./scripts/fastify.js",
|
|
55
|
-
"types:check": "tsc --noEmit"
|
|
55
|
+
"types:check": "tsc --noEmit",
|
|
56
|
+
"test": "node --test --experimental-test-coverage --test-coverage-exclude \"test/testQyAirBnB_Ubuntu.ts\" \"test/*\""
|
|
56
57
|
},
|
|
57
58
|
"type": "module"
|
|
58
59
|
}
|
package/src/QyAcl.d.ts
CHANGED
|
@@ -4,20 +4,20 @@ export declare const CmdNames: {
|
|
|
4
4
|
R: number;
|
|
5
5
|
D: number;
|
|
6
6
|
};
|
|
7
|
-
export declare function
|
|
8
|
-
export declare function
|
|
9
|
-
export declare function iterCmdKeys(cmdArgAsListChanges: any, fun: any): void;
|
|
7
|
+
export declare function applyAclChange(aclKeyValueMap: any, cmdArgAsListObj: any): void;
|
|
8
|
+
export declare function iterCmdKeys(cmdArgAsListObj: any, fun: any): void;
|
|
10
9
|
export declare class QyAclCmdGenerator {
|
|
11
10
|
cmdArgAsMapChanges: any[];
|
|
12
11
|
cmdCount: number;
|
|
13
12
|
batchSize: number;
|
|
14
13
|
constructor();
|
|
15
14
|
pushCmd(cmdName: number, cmdHashKey: string, cmdArg?: any): void;
|
|
16
|
-
pushCmdArgAsListObj(
|
|
15
|
+
pushCmdArgAsListObj(cmdArgAsListObj: any): this;
|
|
17
16
|
takeCmdArgAsListObj(): any[];
|
|
18
17
|
toAclBuffer(changeId: any): Buffer<ArrayBuffer> | undefined;
|
|
19
18
|
}
|
|
20
19
|
export declare function readAclFile(aclFilePath: any, autoRepairAclFile?: boolean, currentChangeId?: number): Promise<any[]>;
|
|
21
20
|
export declare function numsToBuffer(nums: any): Buffer<ArrayBuffer>;
|
|
22
21
|
export declare function bufferToNums(buffer: any, offset: any, nums: any): any;
|
|
22
|
+
export declare function toAclBuffer(changeId: any, batchSize: any, cmdArgAsListObjStr: any): Buffer<ArrayBuffer>;
|
|
23
23
|
export declare function readAclBuffer(aclFilePath: any, contentBuffer: any, autoRepairAclFile: any, currentChangeId: any): Promise<any[]>;
|
package/src/QyAcl.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import h from "node:fs/promises";
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
mergeContent as g,
|
|
@@ -7,11 +7,12 @@ import {
|
|
|
7
7
|
} from "./QyFileContentUtils.js";
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
|
-
isEmptyObj as m
|
|
10
|
+
isEmptyObj as m,
|
|
11
|
+
toBuffer as n
|
|
11
12
|
} from "./QyUtils.js";
|
|
12
13
|
|
|
13
14
|
import {
|
|
14
|
-
logger as
|
|
15
|
+
logger as l
|
|
15
16
|
} from "./QyLogger.js";
|
|
16
17
|
|
|
17
18
|
let f = {
|
|
@@ -21,74 +22,68 @@ let f = {
|
|
|
21
22
|
D: 3
|
|
22
23
|
};
|
|
23
24
|
|
|
24
|
-
function r(r,
|
|
25
|
-
var [
|
|
26
|
-
|
|
27
|
-
a && delete a[e]);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function e(r, e) {
|
|
31
|
-
var t, a, n, s, [ i, o, f, e ] = e;
|
|
32
|
-
for (t in e) null != r[t] && (r[t] = void 0);
|
|
25
|
+
function r(r, t) {
|
|
26
|
+
var e, a, n, s, [ i, o, f, t ] = t;
|
|
27
|
+
for (e in t) null != r[e] && (r[e] = void 0);
|
|
33
28
|
for (a in o) {
|
|
34
|
-
var c,
|
|
35
|
-
for (c of o[a])
|
|
29
|
+
var c, u = r[a] || (r[a] = {});
|
|
30
|
+
for (c of o[a]) u[c] = 1;
|
|
36
31
|
}
|
|
37
32
|
for (n in f) {
|
|
38
|
-
var
|
|
39
|
-
if (
|
|
40
|
-
var
|
|
41
|
-
if (
|
|
42
|
-
for (var d of
|
|
43
|
-
m(
|
|
33
|
+
var h = r[n];
|
|
34
|
+
if (h) {
|
|
35
|
+
var l = f[n];
|
|
36
|
+
if (l) {
|
|
37
|
+
for (var d of l) delete h[d];
|
|
38
|
+
m(h) && (r[n] = void 0);
|
|
44
39
|
}
|
|
45
40
|
}
|
|
46
41
|
}
|
|
47
42
|
for (s in i) r[s] = g(r[s], i[s]);
|
|
48
43
|
}
|
|
49
44
|
|
|
50
|
-
function t(r,
|
|
51
|
-
for (var
|
|
45
|
+
function t(r, t) {
|
|
46
|
+
for (var e of r) for (var a in e) t(a);
|
|
52
47
|
}
|
|
53
48
|
|
|
54
|
-
class
|
|
49
|
+
class e {
|
|
55
50
|
cmdArgAsMapChanges = [];
|
|
56
51
|
cmdCount = 0;
|
|
57
52
|
batchSize = 0;
|
|
58
53
|
constructor() {}
|
|
59
|
-
pushCmd(r,
|
|
54
|
+
pushCmd(r, t, e = void 0) {
|
|
60
55
|
switch (++this.cmdCount, r) {
|
|
61
56
|
case f.A:
|
|
62
|
-
i(this, [ f.A,
|
|
57
|
+
i(this, [ f.A, t, e ]), o(this, [ f.R, t, e ]);
|
|
63
58
|
break;
|
|
64
59
|
|
|
65
60
|
case f.R:
|
|
66
|
-
i(this, [ f.R,
|
|
61
|
+
i(this, [ f.R, t, e ]), o(this, [ f.A, t, e ]);
|
|
67
62
|
break;
|
|
68
63
|
|
|
69
64
|
case f.D:
|
|
70
|
-
if (i(this, [ f.D,
|
|
65
|
+
if (i(this, [ f.D, t ]), t.startsWith("c")) o(this, [ f.M, t ]); else for (var a of [ f.A, f.R ]) o(this, [ a, t ]);
|
|
71
66
|
break;
|
|
72
67
|
|
|
73
68
|
case f.M:
|
|
74
69
|
{
|
|
75
70
|
var n = this.cmdArgAsMapChanges;
|
|
76
71
|
let [ r ] = n;
|
|
77
|
-
n = (r = null == r ? n[f.M] = {} : r)[
|
|
78
|
-
r[
|
|
72
|
+
n = (r = null == r ? n[f.M] = {} : r)[t];
|
|
73
|
+
r[t] = null != n ? s(n, e) : e;
|
|
79
74
|
break;
|
|
80
75
|
}
|
|
81
76
|
|
|
82
77
|
default:
|
|
83
|
-
|
|
78
|
+
l.error(`unsupported cmdName:${r}, called with ${t} ` + e), --this.cmdCount;
|
|
84
79
|
}
|
|
85
80
|
}
|
|
86
81
|
pushCmdArgAsListObj(r) {
|
|
87
82
|
if (r) {
|
|
88
|
-
for (var
|
|
89
|
-
for (var
|
|
90
|
-
var a, n = r[
|
|
91
|
-
for (a in n) for (var s of n[a]) this.pushCmd(
|
|
83
|
+
for (var t in ++this.batchSize, r[f.D]) this.pushCmd(f.D, t);
|
|
84
|
+
for (var e of [ f.A, f.R ]) {
|
|
85
|
+
var a, n = r[e];
|
|
86
|
+
for (a in n) for (var s of n[a]) this.pushCmd(e, a, s);
|
|
92
87
|
}
|
|
93
88
|
var i, [ o ] = r;
|
|
94
89
|
for (i in o) this.pushCmd(f.M, i, o[i]);
|
|
@@ -96,123 +91,127 @@ class n {
|
|
|
96
91
|
return this;
|
|
97
92
|
}
|
|
98
93
|
takeCmdArgAsListObj() {
|
|
99
|
-
var r,
|
|
94
|
+
var r, t = this.cmdArgAsMapChanges;
|
|
100
95
|
Object.assign(this, {
|
|
101
96
|
cmdArgAsMapChanges: [],
|
|
102
97
|
cmdCount: 0,
|
|
103
98
|
batchSize: 0
|
|
104
99
|
});
|
|
105
100
|
for (r of [ f.A, f.R ]) {
|
|
106
|
-
var
|
|
107
|
-
for (
|
|
108
|
-
var n = Object.keys(a[
|
|
109
|
-
0 < n.length ? a[
|
|
101
|
+
var e, a = t[r];
|
|
102
|
+
for (e in a) {
|
|
103
|
+
var n = Object.keys(a[e]);
|
|
104
|
+
0 < n.length ? a[e] = n : delete a[e];
|
|
110
105
|
}
|
|
111
|
-
m(a) && delete
|
|
106
|
+
m(a) && delete t[r];
|
|
112
107
|
}
|
|
113
|
-
var s =
|
|
114
|
-
return s && m(s) && delete
|
|
108
|
+
var s = t[f.D], s = (s && m(s) && delete t[f.D], t[f.M]);
|
|
109
|
+
return s && m(s) && delete t[f.M], t;
|
|
115
110
|
}
|
|
116
111
|
toAclBuffer(r) {
|
|
117
|
-
var
|
|
118
|
-
if (0 < t) return r
|
|
119
|
-
Buffer.concat([ h([ r, t, e.length ]), e ]);
|
|
112
|
+
var t = this.batchSize;
|
|
113
|
+
if (0 < t) return A(r, t, JSON.stringify(this.takeCmdArgAsListObj()));
|
|
120
114
|
}
|
|
121
115
|
}
|
|
122
116
|
|
|
123
|
-
function i(r,
|
|
124
|
-
a(r.cmdArgAsMapChanges,
|
|
117
|
+
function i(r, t, e = 1) {
|
|
118
|
+
a(r.cmdArgAsMapChanges, t, e);
|
|
125
119
|
}
|
|
126
120
|
|
|
127
|
-
function o(r,
|
|
128
|
-
let
|
|
129
|
-
if (
|
|
130
|
-
for (let r = 0; r <
|
|
131
|
-
delete t
|
|
121
|
+
function o(r, t) {
|
|
122
|
+
let e = r.cmdArgAsMapChanges;
|
|
123
|
+
if (e && t && !(t.length <= 1)) {
|
|
124
|
+
for (let r = 0; r < t.length - 1; ++r) if (null == (e = e[t[r]])) return;
|
|
125
|
+
delete e[t.at(-1)];
|
|
132
126
|
}
|
|
133
127
|
}
|
|
134
128
|
|
|
135
|
-
async function c(
|
|
129
|
+
async function c(t, r = !1, e = 0) {
|
|
136
130
|
try {
|
|
137
|
-
return await
|
|
131
|
+
return await p(t, await h.readFile(t), r, e);
|
|
138
132
|
} catch (r) {
|
|
139
|
-
throw
|
|
133
|
+
throw l.error(`Reading ${t} failed:`, r), r;
|
|
140
134
|
}
|
|
141
135
|
}
|
|
142
136
|
|
|
143
137
|
let v = [ 1, 2, 4, 8 ];
|
|
144
138
|
|
|
145
|
-
function
|
|
146
|
-
var
|
|
147
|
-
let s =
|
|
148
|
-
for (let r = 0; r <
|
|
149
|
-
var o = a[r] = (o =
|
|
139
|
+
function u(t) {
|
|
140
|
+
var e = t.length, a = new Array(e), n = new Array(e);
|
|
141
|
+
let s = e << 6, i = 1;
|
|
142
|
+
for (let r = 0; r < e; ++r) {
|
|
143
|
+
var o = a[r] = (o = t[r]) <= 255 ? 0 : o <= 65535 ? 1 : o <= 4294967295 ? 2 : 3, o = (s |= o << (r << 1),
|
|
150
144
|
n[r] = v[o]);
|
|
151
145
|
i += o;
|
|
152
146
|
}
|
|
153
147
|
var f = Buffer.allocUnsafe(i);
|
|
154
148
|
f.writeUInt8(s);
|
|
155
149
|
let c = 1;
|
|
156
|
-
for (let r = 0; r <
|
|
157
|
-
d =
|
|
158
|
-
var [ h, l,
|
|
159
|
-
switch (
|
|
150
|
+
for (let r = 0; r < e; ++r) {
|
|
151
|
+
d = l = h = u = void 0;
|
|
152
|
+
var [ u, h, l, d = 0 ] = [ f, t[r], n[r], c ];
|
|
153
|
+
switch (l) {
|
|
160
154
|
case 1:
|
|
161
|
-
|
|
155
|
+
u.writeUInt8(h, d);
|
|
162
156
|
break;
|
|
163
157
|
|
|
164
158
|
case 2:
|
|
165
|
-
|
|
159
|
+
u.writeUInt16BE(h, d);
|
|
166
160
|
break;
|
|
167
161
|
|
|
168
162
|
case 4:
|
|
169
|
-
|
|
163
|
+
u.writeUInt32BE(h, d);
|
|
170
164
|
break;
|
|
171
165
|
|
|
172
166
|
default:
|
|
173
|
-
|
|
167
|
+
u.writeBigUInt64BE(BigInt(h), d);
|
|
174
168
|
}
|
|
175
169
|
c += n[r];
|
|
176
170
|
}
|
|
177
171
|
return f;
|
|
178
172
|
}
|
|
179
173
|
|
|
180
|
-
function d(
|
|
181
|
-
var n =
|
|
174
|
+
function d(t, e, a) {
|
|
175
|
+
var n = t.readUInt8(e), s = (++e, n >> 6 & 3);
|
|
182
176
|
for (let r = 0; r < s; ++r) {
|
|
183
177
|
var i = v[n >> (r << 1) & 3];
|
|
184
|
-
a[r] = ((r,
|
|
185
|
-
switch (
|
|
178
|
+
a[r] = ((r, t, e = 0) => {
|
|
179
|
+
switch (t) {
|
|
186
180
|
case 1:
|
|
187
|
-
return r.readUInt8(
|
|
181
|
+
return r.readUInt8(e);
|
|
188
182
|
|
|
189
183
|
case 2:
|
|
190
|
-
return r.readUInt16BE(
|
|
184
|
+
return r.readUInt16BE(e);
|
|
191
185
|
|
|
192
186
|
case 4:
|
|
193
|
-
return r.readUInt32BE(
|
|
187
|
+
return r.readUInt32BE(e);
|
|
194
188
|
|
|
195
189
|
default:
|
|
196
|
-
return Number(r.readBigUInt64BE(
|
|
190
|
+
return Number(r.readBigUInt64BE(e));
|
|
197
191
|
}
|
|
198
|
-
})(
|
|
192
|
+
})(t, i, e), e += i;
|
|
199
193
|
}
|
|
200
|
-
return
|
|
194
|
+
return e;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function A(r, t, e) {
|
|
198
|
+
e = n(e);
|
|
199
|
+
return Buffer.concat([ u([ r, t, e.length ]), e ]);
|
|
201
200
|
}
|
|
202
201
|
|
|
203
|
-
async function
|
|
202
|
+
async function p(e, r, a, n) {
|
|
204
203
|
var s = [];
|
|
205
|
-
for (let
|
|
206
|
-
var i = [], o = d(r,
|
|
207
|
-
if (i <= n)
|
|
208
|
-
|
|
209
|
-
n + f != i &&
|
|
204
|
+
for (let t = 0; t < r.length; ) {
|
|
205
|
+
var i = [], o = d(r, t, i), [ i, f, c ] = i;
|
|
206
|
+
if (i <= n) l.warn(`changeId ${i} <= currentChangeId ${n} at ${e}:${t}. Ignored.`),
|
|
207
|
+
t = o + c; else {
|
|
208
|
+
n + f != i && l.warn(`currentChangeId ${n} + batchSize ${f} != changeId ` + i);
|
|
210
209
|
try {
|
|
211
|
-
var
|
|
212
|
-
s.push([ i,
|
|
210
|
+
var u = JSON.parse(r.subarray(o, o + c));
|
|
211
|
+
s.push([ i, u ]), n = i, t = o + c;
|
|
213
212
|
} catch (r) {
|
|
214
|
-
if (
|
|
215
|
-
null == (f = await
|
|
213
|
+
if (l.error(`Parse ${e} failed at ${t}:`, r), a) return l.warn(`Autorepair by truncating ${e} to ` + t),
|
|
214
|
+
null == (f = await h.truncate(e, t)) ? l.log("truncate success") : l.error("truncate failed:", f),
|
|
216
215
|
s;
|
|
217
216
|
throw r;
|
|
218
217
|
}
|
|
@@ -223,12 +222,12 @@ async function A(t, r, a, n) {
|
|
|
223
222
|
|
|
224
223
|
export {
|
|
225
224
|
f as CmdNames,
|
|
226
|
-
r as
|
|
227
|
-
e as applyAclChange,
|
|
225
|
+
r as applyAclChange,
|
|
228
226
|
t as iterCmdKeys,
|
|
229
|
-
|
|
227
|
+
e as QyAclCmdGenerator,
|
|
230
228
|
c as readAclFile,
|
|
231
|
-
|
|
229
|
+
u as numsToBuffer,
|
|
232
230
|
d as bufferToNums,
|
|
233
|
-
A as
|
|
231
|
+
A as toAclBuffer,
|
|
232
|
+
p as readAclBuffer
|
|
234
233
|
};
|
|
@@ -5,6 +5,6 @@ export default class QyAclSaver_Worker extends QyMessageWorker {
|
|
|
5
5
|
_op_start(aclFilePath: any): Promise<void>;
|
|
6
6
|
_op_stop(): Promise<void>;
|
|
7
7
|
switch(aclFilePath: any): void;
|
|
8
|
-
callSave(changeId: any,
|
|
9
|
-
castSave(changeId: any,
|
|
8
|
+
callSave(changeId: any, cmdArgAsListObjStr: any): Promise<void>;
|
|
9
|
+
castSave(changeId: any, cmdArgAsListObjStr: any): void;
|
|
10
10
|
}
|
package/src/QyAclWriter.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { QyBinWriter } from "./QyBinWriter.ts";
|
|
2
|
+
import { QyAclCmdGenerator } from "./QyAcl.ts";
|
|
2
3
|
export declare class QyAclWriter extends QyBinWriter {
|
|
3
|
-
qyAclCmdGenerator:
|
|
4
|
+
qyAclCmdGenerator: QyAclCmdGenerator;
|
|
4
5
|
constructor(options: any, filePath?: any);
|
|
5
|
-
getBinData(dataQueue: any, changeId: any):
|
|
6
|
+
getBinData(dataQueue: any, changeId: any): Buffer<ArrayBuffer> | undefined;
|
|
6
7
|
}
|
package/src/QyAclWriter.js
CHANGED
|
@@ -3,7 +3,8 @@ import {
|
|
|
3
3
|
} from "./QyBinWriter.js";
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
|
-
QyAclCmdGenerator as e
|
|
6
|
+
QyAclCmdGenerator as e,
|
|
7
|
+
toAclBuffer as f
|
|
7
8
|
} from "./QyAcl.js";
|
|
8
9
|
|
|
9
10
|
import {
|
|
@@ -18,10 +19,18 @@ class t extends r {
|
|
|
18
19
|
...r
|
|
19
20
|
}, t), this.qyAclCmdGenerator = new e();
|
|
20
21
|
}
|
|
21
|
-
getBinData(
|
|
22
|
-
var e,
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
getBinData(t, r) {
|
|
23
|
+
var e, {
|
|
24
|
+
qyAclCmdGenerator: o,
|
|
25
|
+
options: s
|
|
26
|
+
} = this, a = t.length;
|
|
27
|
+
if (a < s.minBatchSize) {
|
|
28
|
+
var i = new Array(a), n = r - a + 1;
|
|
29
|
+
for (let r = 0; r < a; ++r) i[r] = f(n + r, 1, t[r]);
|
|
30
|
+
return Buffer.concat(i);
|
|
31
|
+
}
|
|
32
|
+
for (e of t) o.pushCmdArgAsListObj(JSON.parse(e));
|
|
33
|
+
return o.toAclBuffer(r);
|
|
25
34
|
}
|
|
26
35
|
}
|
|
27
36
|
|
package/src/QyBatch.js
CHANGED
package/src/QyBinWriter.js
CHANGED
package/src/QyCD.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export declare class QyCD {
|
|
|
17
17
|
get triggerFileList(): any;
|
|
18
18
|
rpcFile(rpcName: any): any;
|
|
19
19
|
get rpcFileList(): any;
|
|
20
|
-
view(namePath: any, spec?:
|
|
20
|
+
view(namePath: any, spec?: any, parentDir?: any): any;
|
|
21
21
|
viewP(namePath: any, spec: any, parentDir?: any): any;
|
|
22
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;
|
package/src/QyCache.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ export declare class QyCache extends EventEmitter {
|
|
|
21
21
|
stop(): Promise<this>;
|
|
22
22
|
increaseChangeId(): any;
|
|
23
23
|
decreaseChangeId(): void;
|
|
24
|
-
save(changeId: any,
|
|
24
|
+
save(changeId: any, cmdArgAsListObj: any, logText: any, syncList: any, needPromise: any): any;
|
|
25
25
|
getFile(namePath: QyFile | string | string[], parentDir?: any): QyFile | undefined;
|
|
26
26
|
getDir(namePath: QyDir | string | string[], parentDir?: any): QyDir | undefined;
|
|
27
27
|
getOrCreateFile(namePath: QyFile | string | string[], parentDir?: any): QyFile;
|
package/src/QyCache.js
CHANGED
|
@@ -50,7 +50,7 @@ import {
|
|
|
50
50
|
} from "./QyUnionNode.js";
|
|
51
51
|
|
|
52
52
|
import {
|
|
53
|
-
QyKVDataLoader as
|
|
53
|
+
QyKVDataLoader as O
|
|
54
54
|
} from "./QyKVDataLoader.js";
|
|
55
55
|
|
|
56
56
|
import {
|
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
} from "./QyMod.js";
|
|
59
59
|
|
|
60
60
|
import {
|
|
61
|
-
logger as
|
|
61
|
+
logger as Q
|
|
62
62
|
} from "./QyLogger.js";
|
|
63
63
|
|
|
64
64
|
let {
|
|
@@ -89,24 +89,26 @@ class o extends r {
|
|
|
89
89
|
super(), e = {
|
|
90
90
|
...h("QyCache"),
|
|
91
91
|
...e
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
[
|
|
98
|
-
|
|
99
|
-
|
|
92
|
+
}, o = new p("", !0, void 0, i = this), a = m.at(-1), s = F.at(-1), l = new p(D, !0, o),
|
|
93
|
+
n = new p(a, !0, l), g = new p(s, !0, l), o._subdirMap = {
|
|
94
|
+
[D]: l
|
|
95
|
+
}, l._subdirMap = {
|
|
96
|
+
[a]: n,
|
|
97
|
+
[s]: g
|
|
98
|
+
}, Object.assign(i, {
|
|
99
|
+
rootDir: o,
|
|
100
|
+
expireRootDir: n,
|
|
101
|
+
indexRootDir: g
|
|
102
|
+
});
|
|
103
|
+
var i, o, a, s, n, g, l = v(r, "qykv");
|
|
104
|
+
Object.assign(this, {
|
|
100
105
|
rootFolder: r,
|
|
101
106
|
options: e,
|
|
102
107
|
qyDB: t,
|
|
103
|
-
kvFolder:
|
|
104
|
-
rootDir: s,
|
|
105
|
-
expireRootDir: g,
|
|
106
|
-
indexRootDir: l,
|
|
108
|
+
kvFolder: l,
|
|
107
109
|
rpcFolder: v(r, "rpc"),
|
|
108
110
|
exclusiveFilePath: v(r, ".opened"),
|
|
109
|
-
qyKVData: new d(
|
|
111
|
+
qyKVData: new d(l, e, this),
|
|
110
112
|
qyFileLogger: new u(v(r, "qylog"), e)
|
|
111
113
|
});
|
|
112
114
|
}
|
|
@@ -120,7 +122,7 @@ class o extends r {
|
|
|
120
122
|
exclusiveFilePath: a,
|
|
121
123
|
rootDir: s
|
|
122
124
|
} = this;
|
|
123
|
-
|
|
125
|
+
Q.log(`Starting at ${r}...`);
|
|
124
126
|
try {
|
|
125
127
|
await R(e), o.start();
|
|
126
128
|
var [ {
|
|
@@ -128,7 +130,7 @@ class o extends r {
|
|
|
128
130
|
loadedMaxAclNum: g,
|
|
129
131
|
qySnapshots: l,
|
|
130
132
|
aclKeyValueMap: p
|
|
131
|
-
} ] = await Promise.all([ ((r, e) => (r = new
|
|
133
|
+
} ] = await Promise.all([ ((r, e) => (r = new O(r, e)).load())(e, t), C(a) ]);
|
|
132
134
|
i.start(n, g, l, p);
|
|
133
135
|
} catch (r) {
|
|
134
136
|
throw o.stop(), r;
|
|
@@ -158,17 +160,17 @@ class o extends r {
|
|
|
158
160
|
} = m;
|
|
159
161
|
x(y) && F.insertRpc(m, y);
|
|
160
162
|
}
|
|
161
|
-
return t.dumpStructureAtStart && await q(v(r, "qystruct"), s),
|
|
163
|
+
return t.dumpStructureAtStart && await q(v(r, "qystruct"), s), Q.log("Started."),
|
|
162
164
|
this;
|
|
163
165
|
}
|
|
164
166
|
async stop() {
|
|
165
|
-
|
|
167
|
+
Q.log("Stopping...");
|
|
166
168
|
var {
|
|
167
169
|
qyKVData: r,
|
|
168
170
|
qyFileLogger: e,
|
|
169
171
|
exclusiveFilePath: t
|
|
170
172
|
} = this;
|
|
171
|
-
return await r.stop(),
|
|
173
|
+
return await r.stop(), Q.log("QyFileLogger stopped."), await e.stop(), i(t),
|
|
172
174
|
Object.assign(this, {
|
|
173
175
|
rootDir: void 0,
|
|
174
176
|
indexRootDir: void 0,
|
|
@@ -179,7 +181,7 @@ class o extends r {
|
|
|
179
181
|
rpcFunMap: void 0,
|
|
180
182
|
qyDB: void 0,
|
|
181
183
|
qyFileLogger: void 0
|
|
182
|
-
}),
|
|
184
|
+
}), Q.log("Stopped."), this;
|
|
183
185
|
}
|
|
184
186
|
increaseChangeId() {
|
|
185
187
|
return this.qyKVData.increaseChangeId();
|
|
@@ -271,11 +273,11 @@ class o extends r {
|
|
|
271
273
|
}
|
|
272
274
|
async callRpc(e, r, t) {
|
|
273
275
|
var i, o = this.rpcFunMap[e];
|
|
274
|
-
if (!o) return
|
|
276
|
+
if (!o) return Q.warn(i = `RPC ${e} not implemented.`), new Error(i);
|
|
275
277
|
try {
|
|
276
278
|
return await o(r, t);
|
|
277
279
|
} catch (r) {
|
|
278
|
-
return
|
|
280
|
+
return Q.error(`Calling RPC ${e} failed:`, r), r;
|
|
279
281
|
}
|
|
280
282
|
}
|
|
281
283
|
monitorItemExpire(r, e) {
|
package/src/QyDefaultOptions.js
CHANGED
package/src/QyExpire.js
CHANGED
package/src/QyFileLogger.js
CHANGED
|
@@ -31,8 +31,7 @@ class a extends t {
|
|
|
31
31
|
(e = {
|
|
32
32
|
...i("QyFileLogger"),
|
|
33
33
|
...e
|
|
34
|
-
}).append = !e.clearLogAtStart, super(e,
|
|
35
|
-
Object.assign(this, {
|
|
34
|
+
}).append = !e.clearLogAtStart, super(e), Object.assign(this, {
|
|
36
35
|
logFileFolder: t,
|
|
37
36
|
qyLogFileSaver: new s(this, e)
|
|
38
37
|
});
|
|
@@ -44,12 +43,12 @@ class a extends t {
|
|
|
44
43
|
return this.dateDirPath;
|
|
45
44
|
}
|
|
46
45
|
async _op_start() {
|
|
47
|
-
var t = new Date(), t = (this.timeoutRef = setTimeout(this.switch.bind(this),
|
|
46
|
+
var t = new Date(), t = (this.timeoutRef = setTimeout(this.switch.bind(this), l(t)),
|
|
48
47
|
this.dateDirPath = n(this, t));
|
|
49
48
|
this.qyLogFileSaver.start(r(t, "change.txt")), await this.startFileConsole(t);
|
|
50
49
|
}
|
|
51
50
|
switch() {
|
|
52
|
-
var t = new Date(), t = (this.timeoutRef = setTimeout(this.switch.bind(this),
|
|
51
|
+
var t = new Date(), t = (this.timeoutRef = setTimeout(this.switch.bind(this), l(t)),
|
|
53
52
|
n(this, t));
|
|
54
53
|
return this.dateDirPath != t && (this.dateDirPath = t, this.qyLogFileSaver.switch(r(t, "change.txt")),
|
|
55
54
|
this.switchFileConsole(t)), this;
|
|
@@ -68,14 +67,14 @@ class a extends t {
|
|
|
68
67
|
|
|
69
68
|
function n(t, e) {
|
|
70
69
|
var i = e.getUTCFullYear(), s = e.getUTCMonth() + 1, o = e.getUTCDate(), e = e.getUTCHours();
|
|
71
|
-
return r(t.logFileFolder, i.toString(),
|
|
70
|
+
return r(t.logFileFolder, i.toString(), h(s), h(o), h(e));
|
|
72
71
|
}
|
|
73
72
|
|
|
74
|
-
function
|
|
73
|
+
function h(t) {
|
|
75
74
|
return t.toString().padStart(2, "0");
|
|
76
75
|
}
|
|
77
76
|
|
|
78
|
-
function
|
|
77
|
+
function l(t) {
|
|
79
78
|
return 1e3 * (60 * (60 - t.getUTCMinutes()) - t.getUTCSeconds());
|
|
80
79
|
}
|
|
81
80
|
|