datafolder 1.0.9 → 1.0.10
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 +3 -1
- package/SSD.md +60 -0
- package/index.js +1 -0
- package/package.json +1 -1
- package/sample.js +4 -4
- package/scripts/airbnb.js +1 -0
- package/scripts/airbnb2.js +1 -0
- package/scripts/convertBinFiles.js +1 -0
- package/scripts/express.js +2 -1
- package/scripts/fastify.js +1 -0
- package/scripts/flights.js +1 -0
- package/scripts/flights2.js +1 -0
- package/scripts/flights_queries.js +1 -0
- package/src/QyAcl.d.ts +3 -3
- package/src/QyAcl.js +7 -7
- package/src/QyAclSaver_Worker.d.ts +1 -0
- package/src/QyAclSaver_Worker.js +1 -0
- package/src/QyAclWriter.d.ts +2 -1
- package/src/QyAclWriter.js +7 -6
- package/src/QyBatch.d.ts +29 -22
- package/src/QyBatch.js +85 -72
- package/src/QyBinWriter.d.ts +9 -4
- package/src/QyBinWriter.js +83 -70
- package/src/QyCD.d.ts +19 -19
- package/src/QyCD.js +2 -2
- package/src/QyCache.d.ts +22 -23
- package/src/QyCache.js +47 -36
- package/src/QyCompressor_Worker.js +2 -2
- package/src/QyDB.d.ts +6 -9
- package/src/QyDB.js +1 -1
- package/src/QyFile.d.ts +2 -0
- package/src/QyFile.js +42 -40
- package/src/QyFileContentUtils.d.ts +1 -4
- package/src/QyFileLogger.d.ts +4 -0
- package/src/QyFileLogger.js +30 -26
- package/src/QyIndex.d.ts +2 -2
- package/src/QyIndex.js +84 -80
- package/src/QyIndexPropTree.d.ts +4 -0
- package/src/QyIndexPropTree.js +19 -10
- package/src/QyIntersectNode.d.ts +1 -0
- package/src/QyIntersectNode.js +1 -0
- package/src/QyJsonSaver.d.ts +2 -2
- package/src/QyJsonSaver.js +4 -4
- package/src/QyKVData.d.ts +18 -1
- package/src/QyKVData.js +98 -78
- package/src/QyKVDataCleaner_Worker.d.ts +7 -1
- package/src/QyKVDataCleaner_Worker.js +69 -55
- package/src/QyKVDataLoader.d.ts +10 -2
- package/src/QyKVDataLoader.js +27 -21
- package/src/QyKVDataSaver_Worker.d.ts +10 -0
- package/src/QyKVDataSaver_Worker.js +23 -9
- package/src/QyLogFileSaver_Worker.d.ts +1 -0
- package/src/QyLogFileSaver_Worker.js +7 -6
- package/src/QyLogger.d.ts +20 -10
- package/src/QyLogger.js +110 -67
- package/src/QyMessageWorker.d.ts +1 -1
- package/src/QyMessageWorker.js +5 -5
- package/src/QyMessager.d.ts +5 -1
- package/src/QyMessager.js +6 -1
- package/src/QyMod.js +9 -8
- package/src/QyOpRunner.d.ts +5 -1
- package/src/QyOpRunner.js +7 -7
- package/src/QyQueue.d.ts +5 -1
- package/src/QyQueue.js +6 -7
- package/src/QySaver.d.ts +3 -0
- package/src/QySaver.js +26 -15
- package/src/QySnapshotCompactor_Worker.d.ts +7 -0
- package/src/QySnapshotCompactor_Worker.js +37 -26
- package/src/QySnapshotSaver_Worker.d.ts +8 -1
- package/src/QySnapshotSaver_Worker.js +21 -14
- package/src/QySnapshots.d.ts +19 -7
- package/src/QySnapshots.js +195 -172
- package/src/QyTrigger.d.ts +5 -1
- package/src/QyTrigger.js +44 -34
- package/src/QyUnionNode.d.ts +10 -1
- package/src/QyUnionNode.js +34 -36
- package/src/QyUtils.d.ts +2 -2
- package/src/QyUtils.js +116 -111
- package/src/simulate.js +34 -31
- package/src/simulate2.js +49 -46
- package/src/soc_pokec.js +17 -11
- package/static/codemirror.bundle/editor.bundle.js +2 -0
package/src/QyBatch.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "node:util";
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
|
-
mergeContentAndGenDelta as
|
|
6
|
+
mergeContentAndGenDelta as c,
|
|
7
7
|
objToDelMarks as i
|
|
8
8
|
} from "./QyFileContentUtils.js";
|
|
9
9
|
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
getSuffix as g,
|
|
16
16
|
SpecialFilePaths as t,
|
|
17
17
|
toSingleName as C,
|
|
18
|
-
isSimpleType as
|
|
18
|
+
isSimpleType as l
|
|
19
19
|
} from "./QyUtils.js";
|
|
20
20
|
|
|
21
21
|
import {
|
|
@@ -35,17 +35,28 @@ import {
|
|
|
35
35
|
} from "./QyCD.js";
|
|
36
36
|
|
|
37
37
|
import {
|
|
38
|
-
getPrefixPropPaths as
|
|
38
|
+
getPrefixPropPaths as y
|
|
39
39
|
} from "./QyIndexPropTree.js";
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
import {
|
|
42
|
+
logger as D
|
|
43
|
+
} from "./QyLogger.js";
|
|
44
|
+
|
|
45
|
+
let u = Array.isArray, f = e.$del, v = t.IndexPropPathsFileName, p = {
|
|
42
46
|
none: 0,
|
|
43
47
|
basic: 1,
|
|
44
48
|
delta: 2,
|
|
45
49
|
all: 3
|
|
46
50
|
};
|
|
47
51
|
|
|
48
|
-
class
|
|
52
|
+
class _ extends m {
|
|
53
|
+
fileLogLevel;
|
|
54
|
+
actionQueue;
|
|
55
|
+
changeId;
|
|
56
|
+
changeList;
|
|
57
|
+
syncList;
|
|
58
|
+
qyAclCmdGenerator;
|
|
59
|
+
qyCmdObjHistory;
|
|
49
60
|
constructor(e, t) {
|
|
50
61
|
super(e), t = {
|
|
51
62
|
...d("QyBatch"),
|
|
@@ -66,31 +77,31 @@ class v extends m {
|
|
|
66
77
|
return s(e) && (e = n(e)), this.createDirP(e, t);
|
|
67
78
|
}
|
|
68
79
|
createDirP(e, t = this.currentDir) {
|
|
69
|
-
return
|
|
80
|
+
return P(this, "createDir", this.qyCache?.getOrCreateDir(e, t));
|
|
70
81
|
}
|
|
71
82
|
delDir(e, t = this.currentDir) {
|
|
72
83
|
return s(e) && (e = n(e)), this.delDirP(e, t);
|
|
73
84
|
}
|
|
74
85
|
delDirP(e, t = this.currentDir) {
|
|
75
|
-
return
|
|
86
|
+
return P(this, "delDir", this.qyCache.getOrCreateDir(e, t));
|
|
76
87
|
}
|
|
77
88
|
createFile(e, t = this.currentDir) {
|
|
78
89
|
return s(e) && (e = n(e)), this.createFileP(e, t);
|
|
79
90
|
}
|
|
80
91
|
createFileP(e, t = this.currentDir) {
|
|
81
|
-
return
|
|
92
|
+
return P(this, "createFile", this.qyCache.getOrCreateFile(e, t));
|
|
82
93
|
}
|
|
83
94
|
delFile(e, t = this.currentDir) {
|
|
84
95
|
return s(e) && (e = n(e)), this.delFileP(e, t);
|
|
85
96
|
}
|
|
86
97
|
delFileP(e, t = this.currentDir) {
|
|
87
|
-
return
|
|
98
|
+
return P(this, "delFile", this.qyCache.getOrCreateFile(e, t));
|
|
88
99
|
}
|
|
89
100
|
createIndex(e, t, r = this.currentDir) {
|
|
90
101
|
return s(e) && (e = n(e)), this.createIndexP(e, t, r);
|
|
91
102
|
}
|
|
92
103
|
createIndexP(e, t, r = this.currentDir) {
|
|
93
|
-
return u(t) || (t = [ t ]),
|
|
104
|
+
return u(t) || (t = [ t ]), P(this, "createIndex", this.qyCache?.getOrCreateDir(e, r), {
|
|
94
105
|
indexPropPathList: t
|
|
95
106
|
});
|
|
96
107
|
}
|
|
@@ -98,7 +109,7 @@ class v extends m {
|
|
|
98
109
|
return s(e) && (e = n(e)), this.delIndexP(e, t, r);
|
|
99
110
|
}
|
|
100
111
|
delIndexP(e, t, r = this.currentDir) {
|
|
101
|
-
return
|
|
112
|
+
return P(this, "delIndex", this.qyCache.getOrCreateDir(e, r), {
|
|
102
113
|
indexPropPath: t
|
|
103
114
|
});
|
|
104
115
|
}
|
|
@@ -106,8 +117,8 @@ class v extends m {
|
|
|
106
117
|
return s(e) && (e = n(e)), this.insertP(e, t, r);
|
|
107
118
|
}
|
|
108
119
|
insertP(e, t, r = this.currentDir) {
|
|
109
|
-
return
|
|
110
|
-
content:
|
|
120
|
+
return P(this, "insert", this.qyCache.getOrCreateFile(e, r), {
|
|
121
|
+
content: l(t) ? t : structuredClone(t)
|
|
111
122
|
});
|
|
112
123
|
}
|
|
113
124
|
remove(e, t, r = this.currentDir) {
|
|
@@ -130,28 +141,28 @@ class v extends m {
|
|
|
130
141
|
return s(e) && (e = n(e)), this.delContentP(e, t);
|
|
131
142
|
}
|
|
132
143
|
delContentP(e, t = this.currentDir) {
|
|
133
|
-
return
|
|
144
|
+
return P(this, "delContent", this.qyCache.getOrCreateFile(e, t));
|
|
134
145
|
}
|
|
135
146
|
insertTrigger(e, t, r, i) {
|
|
136
147
|
return s(t) && (t = n(t)), r = (r = s(r) ? [ r ] : r).map(e => s(e) ? a(e) : e),
|
|
137
|
-
|
|
148
|
+
P(this, "insertTrigger", this.qyCache.getOrCreateTriggerFile(e), {
|
|
138
149
|
fileNamePath: t,
|
|
139
150
|
propNamePathList: r,
|
|
140
151
|
modCode: i
|
|
141
152
|
});
|
|
142
153
|
}
|
|
143
154
|
removeTrigger(e) {
|
|
144
|
-
return
|
|
155
|
+
return P(this, "removeTrigger", this.qyCache.getOrCreateTriggerFile(e));
|
|
145
156
|
}
|
|
146
157
|
insertRpc(e, t) {
|
|
147
|
-
return
|
|
158
|
+
return P(this, "insertRpc", this.qyCache.getOrCreateRpcFile(e), {
|
|
148
159
|
modCode: t
|
|
149
160
|
});
|
|
150
161
|
}
|
|
151
162
|
removeRpc(e) {
|
|
152
|
-
return
|
|
163
|
+
return P(this, "removeRpc", this.qyCache.getOrCreateRpcFile(e));
|
|
153
164
|
}
|
|
154
|
-
run(e) {
|
|
165
|
+
run(e = !1) {
|
|
155
166
|
var {
|
|
156
167
|
actionQueue: t,
|
|
157
168
|
fileLogLevel: r,
|
|
@@ -165,17 +176,17 @@ class v extends m {
|
|
|
165
176
|
changeList: t,
|
|
166
177
|
qyAclCmdGenerator: s,
|
|
167
178
|
qyCmdObjHistory: o,
|
|
168
|
-
syncList:
|
|
169
|
-
} = this,
|
|
170
|
-
if (0 ==
|
|
171
|
-
var h = g(
|
|
179
|
+
syncList: c
|
|
180
|
+
} = this, l = t.length;
|
|
181
|
+
if (0 == l) return i.decreaseChangeId(), 0;
|
|
182
|
+
var h = g(l), s = s.takeCmdArgAsListObj();
|
|
172
183
|
let d;
|
|
173
184
|
0 < r && (r = t.map(({
|
|
174
185
|
logStr: e
|
|
175
|
-
}) => e).join("\n"), d = new Date().toISOString() + `: ${
|
|
186
|
+
}) => e).join("\n"), d = new Date().toISOString() + `: ${l} change${h}:
|
|
176
187
|
${r}
|
|
177
188
|
`);
|
|
178
|
-
var m, u,
|
|
189
|
+
var m, u, l = i.save(a, s, d, (e => {
|
|
179
190
|
var t = e.syncList, r = t.length;
|
|
180
191
|
for (let e = 0; e < r; e += 2) {
|
|
181
192
|
var i, n = e + 1, a = t[e], s = t[n];
|
|
@@ -183,7 +194,7 @@ ${r}
|
|
|
183
194
|
t[n] = 0 < i.length ? i : void 0) : t[n] = s.fileContent;
|
|
184
195
|
}
|
|
185
196
|
if (0 < r) return t;
|
|
186
|
-
})(this), e), h = (
|
|
197
|
+
})(this), e), h = (c.length = 0, o.push(s), t.filter(({
|
|
187
198
|
item: e,
|
|
188
199
|
delta: t
|
|
189
200
|
}) => t && 0 < e.triggerNodes?.length));
|
|
@@ -192,7 +203,7 @@ ${r}
|
|
|
192
203
|
item: m,
|
|
193
204
|
delta: u
|
|
194
205
|
} of h) for (var f of m.triggerNodes) f.checkTrigger(m, u);
|
|
195
|
-
return e ?
|
|
206
|
+
return e ? l : a;
|
|
196
207
|
}
|
|
197
208
|
getTopHistoryCmdObj() {
|
|
198
209
|
return this.qyCmdObjHistory.top();
|
|
@@ -251,24 +262,23 @@ ${r}
|
|
|
251
262
|
var e, {
|
|
252
263
|
item: t,
|
|
253
264
|
indexPropPathList: r
|
|
254
|
-
} = t, i = this.qyCache.getOrCreateIndexDir(t), n = i.getOrCreateFile(
|
|
265
|
+
} = t, i = this.qyCache.getOrCreateIndexDir(t), n = i.getOrCreateFile(v), {
|
|
255
266
|
fileContent: a,
|
|
256
267
|
qyIndexPropTree: s
|
|
257
268
|
} = (n.created || this._action_createFile({
|
|
258
269
|
item: n
|
|
259
|
-
}), n), o = [],
|
|
270
|
+
}), n), o = [], c = {};
|
|
260
271
|
for (e of r) {
|
|
261
|
-
var
|
|
262
|
-
a && a[
|
|
272
|
+
var l = C(e);
|
|
273
|
+
a && a[l] || (o.push(e), c[l] = 1, s.insert(e));
|
|
263
274
|
}
|
|
264
275
|
if (0 != o.length) {
|
|
265
|
-
|
|
266
|
-
this._action_insert({
|
|
276
|
+
D.log(`Creating index ${JSON.stringify(o)} for ` + t.fullPath), this._action_insert({
|
|
267
277
|
item: n,
|
|
268
|
-
content:
|
|
278
|
+
content: c
|
|
269
279
|
});
|
|
270
280
|
{
|
|
271
|
-
var h, d = this, m = t, u = i, r =
|
|
281
|
+
var h, d = this, m = t, u = i, r = y(o);
|
|
272
282
|
let e;
|
|
273
283
|
for (h of r) {
|
|
274
284
|
var f = u.searchOrCreateSubdir(h);
|
|
@@ -294,7 +304,7 @@ ${r}
|
|
|
294
304
|
item: e,
|
|
295
305
|
indexPropPath: i
|
|
296
306
|
} = e, e = this.qyCache.getIndexDir(e);
|
|
297
|
-
e && ((r = e.getFile(
|
|
307
|
+
e && ((r = e.getFile(v)) ? (t = r.qyIndexPropTree, this._action_insert({
|
|
298
308
|
item: r,
|
|
299
309
|
content: {
|
|
300
310
|
[C(i)]: f
|
|
@@ -305,7 +315,7 @@ ${r}
|
|
|
305
315
|
item: e
|
|
306
316
|
}));
|
|
307
317
|
}
|
|
308
|
-
_action_delFile(e, t) {
|
|
318
|
+
_action_delFile(e, t = !1) {
|
|
309
319
|
e.actionName = "delFile";
|
|
310
320
|
var r = e.item;
|
|
311
321
|
if (!r.created) return !1;
|
|
@@ -316,7 +326,7 @@ ${r}
|
|
|
316
326
|
parentDir: i,
|
|
317
327
|
name: n
|
|
318
328
|
} = r;
|
|
319
|
-
return r.created = !1,
|
|
329
|
+
return r.created = !1, x(this, e), t || L(this, i, "R", i.fileMapKey, n),
|
|
320
330
|
!0;
|
|
321
331
|
}
|
|
322
332
|
_action_delDir(e) {
|
|
@@ -332,33 +342,33 @@ ${r}
|
|
|
332
342
|
fileMapKey: o
|
|
333
343
|
} = t;
|
|
334
344
|
if (a) {
|
|
335
|
-
|
|
336
|
-
for (var
|
|
337
|
-
item:
|
|
345
|
+
L(this, t, "D", o);
|
|
346
|
+
for (var c of t.fileList) this._action_delFile({
|
|
347
|
+
item: c
|
|
338
348
|
}, !0);
|
|
339
349
|
}
|
|
340
350
|
if (n) {
|
|
341
|
-
|
|
342
|
-
for (var
|
|
351
|
+
L(this, t, "D", s);
|
|
352
|
+
for (var l of t.allSubdirs()) {
|
|
343
353
|
let {
|
|
344
354
|
subdirMap: e,
|
|
345
355
|
fileMap: t,
|
|
346
356
|
subdirMapKey: r,
|
|
347
357
|
fileMapKey: i
|
|
348
|
-
} =
|
|
349
|
-
if (e &&
|
|
350
|
-
|
|
351
|
-
for (var h of
|
|
358
|
+
} = l;
|
|
359
|
+
if (e && L(this, l, "D", r), t) {
|
|
360
|
+
L(this, l, "D", i);
|
|
361
|
+
for (var h of l.fileList) this._action_delFile({
|
|
352
362
|
item: h
|
|
353
363
|
}, !0);
|
|
354
364
|
}
|
|
355
|
-
|
|
365
|
+
x(this, {
|
|
356
366
|
actionName: "delDir",
|
|
357
|
-
item:
|
|
358
|
-
}),
|
|
367
|
+
item: l
|
|
368
|
+
}), l.created = !1;
|
|
359
369
|
}
|
|
360
370
|
}
|
|
361
|
-
return !!r && (t.created = !1,
|
|
371
|
+
return !!r && (t.created = !1, x(this, e), L(this, r, "R", r.subdirMapKey, i),
|
|
362
372
|
!0);
|
|
363
373
|
}
|
|
364
374
|
_action_delContent(e) {
|
|
@@ -370,7 +380,7 @@ ${r}
|
|
|
370
380
|
oldValue: r,
|
|
371
381
|
newValue: f
|
|
372
382
|
}
|
|
373
|
-
}),
|
|
383
|
+
}), x(this, e), L(this, t, "D", t.fileContentKey), F(this, t, r), !0);
|
|
374
384
|
}
|
|
375
385
|
_action_insert(e) {
|
|
376
386
|
e.actionName = "insert";
|
|
@@ -378,20 +388,20 @@ ${r}
|
|
|
378
388
|
item: t,
|
|
379
389
|
content: r
|
|
380
390
|
} = e;
|
|
381
|
-
if (null == r) return
|
|
391
|
+
if (null == r) return D.warn(`Saving undefined to ${t.fullPath}. Not making any change.`),
|
|
382
392
|
!1;
|
|
383
393
|
t.created || this._action_createFile({
|
|
384
394
|
item: t
|
|
385
395
|
});
|
|
386
|
-
var i, n, r =
|
|
396
|
+
var i, n, r = c(t.fileContent, r), {
|
|
387
397
|
merged: a,
|
|
388
398
|
delta: s
|
|
389
399
|
} = r;
|
|
390
400
|
return !!s && ({
|
|
391
401
|
oldValue: s,
|
|
392
402
|
newValue: i
|
|
393
|
-
} = s, !!i) && (n = t.fileContentKey, null == a ?
|
|
394
|
-
Object.assign(e, r),
|
|
403
|
+
} = s, !!i) && (n = t.fileContentKey, null == a ? L(this, t, "D", n) : L(this, t, "M", n, i),
|
|
404
|
+
Object.assign(e, r), x(this, e), t.setContent(a), F(this, t, s, i, a), !0);
|
|
395
405
|
}
|
|
396
406
|
_action_createFile(e) {
|
|
397
407
|
e.actionName = "createFile";
|
|
@@ -401,7 +411,7 @@ ${r}
|
|
|
401
411
|
}), Object.assign(r, {
|
|
402
412
|
created: !0,
|
|
403
413
|
fileContentLoaded: !0
|
|
404
|
-
}),
|
|
414
|
+
}), x(this, e), L(this, t, "A", t.fileMapKey, r.name), !0);
|
|
405
415
|
}
|
|
406
416
|
_action_createDir(e) {
|
|
407
417
|
e.actionName = "createDir";
|
|
@@ -413,18 +423,18 @@ ${r}
|
|
|
413
423
|
created: !0,
|
|
414
424
|
subdirMapLoaded: !0,
|
|
415
425
|
fileMapLoaded: !0
|
|
416
|
-
}),
|
|
426
|
+
}), x(this, {
|
|
417
427
|
actionName: "createDir",
|
|
418
428
|
item: e
|
|
419
429
|
});
|
|
420
430
|
var i = e.parentDir;
|
|
421
|
-
|
|
431
|
+
L(this, i, "A", i.subdirMapKey, e.name);
|
|
422
432
|
}
|
|
423
433
|
return !0;
|
|
424
434
|
}
|
|
425
435
|
}
|
|
426
436
|
|
|
427
|
-
function
|
|
437
|
+
function P(e, t, r, i) {
|
|
428
438
|
return e.actionQueue.push({
|
|
429
439
|
actionName: t,
|
|
430
440
|
item: r,
|
|
@@ -432,7 +442,7 @@ function _(e, t, r, i) {
|
|
|
432
442
|
}), e;
|
|
433
443
|
}
|
|
434
444
|
|
|
435
|
-
function
|
|
445
|
+
function x(e, t) {
|
|
436
446
|
var {
|
|
437
447
|
changeList: e,
|
|
438
448
|
fileLogLevel: r
|
|
@@ -456,7 +466,7 @@ function P(e, t) {
|
|
|
456
466
|
})(t, r)), e.push(t);
|
|
457
467
|
}
|
|
458
468
|
|
|
459
|
-
function
|
|
469
|
+
function L(e, t, r, i, n = void 0) {
|
|
460
470
|
var {
|
|
461
471
|
qyAclCmdGenerator: e,
|
|
462
472
|
qyCache: a,
|
|
@@ -467,7 +477,7 @@ function x(e, t, r, i, n) {
|
|
|
467
477
|
a && a.qyKVData.removeKey(i) && s.push(i, t);
|
|
468
478
|
}
|
|
469
479
|
|
|
470
|
-
function F(e, t, r, i, n) {
|
|
480
|
+
function F(e, t, r, i = void 0, n = void 0) {
|
|
471
481
|
var {
|
|
472
482
|
underHiddenFolder: t,
|
|
473
483
|
name: a,
|
|
@@ -476,27 +486,27 @@ function F(e, t, r, i, n) {
|
|
|
476
486
|
if (!t) {
|
|
477
487
|
var o = e.qyCache.getIndexDir(s);
|
|
478
488
|
if (o) {
|
|
479
|
-
t = o.getFile(
|
|
480
|
-
if (t) for (var
|
|
489
|
+
t = o.getFile(v);
|
|
490
|
+
if (t) for (var c of t.qyIndexPropTree.getAllIndexPropPaths()) N(e, o.searchOrCreateSubdir(c), c, a, r, i, n);
|
|
481
491
|
}
|
|
482
492
|
}
|
|
483
493
|
}
|
|
484
494
|
|
|
485
|
-
function N(t, e, r, i, n, a, s) {
|
|
495
|
+
function N(t, e, r, i, n, a, s = void 0) {
|
|
486
496
|
e = h(e, r, i, n, a, s);
|
|
487
497
|
if (e) {
|
|
488
|
-
var o,
|
|
498
|
+
var o, c, l, {
|
|
489
499
|
toAddFileList: r,
|
|
490
500
|
toDelFileList: i
|
|
491
501
|
} = e;
|
|
492
502
|
for (o of r) t._action_createFile({
|
|
493
503
|
item: o
|
|
494
504
|
});
|
|
495
|
-
for (
|
|
496
|
-
item:
|
|
505
|
+
for (c of i) t._action_delFile({
|
|
506
|
+
item: c
|
|
497
507
|
});
|
|
498
|
-
for (
|
|
499
|
-
let e =
|
|
508
|
+
for (l of i) {
|
|
509
|
+
let e = l.parentDir;
|
|
500
510
|
for (;e.created && !e.isHiddenFolder && e.isEmpty; ) t._action_delDir({
|
|
501
511
|
item: e
|
|
502
512
|
}), e = e.parentDir;
|
|
@@ -505,6 +515,9 @@ function N(t, e, r, i, n, a, s) {
|
|
|
505
515
|
}
|
|
506
516
|
|
|
507
517
|
class O {
|
|
518
|
+
maxLength;
|
|
519
|
+
actionQueue;
|
|
520
|
+
nextPos;
|
|
508
521
|
constructor(e) {
|
|
509
522
|
Object.assign(this, {
|
|
510
523
|
maxLength: e,
|
|
@@ -530,5 +543,5 @@ class O {
|
|
|
530
543
|
}
|
|
531
544
|
|
|
532
545
|
export {
|
|
533
|
-
|
|
546
|
+
_ as QyBatch
|
|
534
547
|
};
|
package/src/QyBinWriter.d.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { QyOpRunner } from "./QyOpRunner.ts";
|
|
2
2
|
export declare class QyBinWriter extends QyOpRunner {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
_filePath: any;
|
|
4
|
+
_totalSavedSize: number;
|
|
5
|
+
fileHandle: any;
|
|
6
|
+
constructor(options?: any, filePath?: undefined);
|
|
7
|
+
get filePath(): any;
|
|
8
|
+
set filePath(val: any);
|
|
9
|
+
get totalSavedSize(): number;
|
|
10
|
+
set totalSavedSize(val: number);
|
|
6
11
|
save(changeId: any, data: any, needPromise: any): any;
|
|
7
12
|
truncate(): any;
|
|
8
13
|
switch(newFilePath: any): any;
|
|
9
|
-
getBinData(dataQueue: any): any;
|
|
14
|
+
getBinData(dataQueue: any, changeId?: undefined): any;
|
|
10
15
|
_op_start(filePath: any): Promise<this>;
|
|
11
16
|
_op_stop(): Promise<void>;
|
|
12
17
|
_op_save(changeId: any, dataQueue: any): Promise<void> | undefined;
|
package/src/QyBinWriter.js
CHANGED
|
@@ -3,149 +3,162 @@ import {
|
|
|
3
3
|
} from "node:fs/promises";
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
|
-
QyOpRunner as
|
|
6
|
+
QyOpRunner as t
|
|
7
7
|
} from "./QyOpRunner.js";
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
10
|
ensureParentDir as n,
|
|
11
11
|
getSize as o,
|
|
12
|
-
getSizeStr as
|
|
13
|
-
sleep as
|
|
12
|
+
getSizeStr as v,
|
|
13
|
+
sleep as _,
|
|
14
14
|
setPromise as l,
|
|
15
|
-
toBuffer as
|
|
15
|
+
toBuffer as S
|
|
16
16
|
} from "./QyUtils.js";
|
|
17
17
|
|
|
18
18
|
import {
|
|
19
19
|
getDefaultOptions as a
|
|
20
20
|
} from "./QyDefaultOptions.js";
|
|
21
21
|
|
|
22
|
+
import {
|
|
23
|
+
logger as y
|
|
24
|
+
} from "./QyLogger.js";
|
|
25
|
+
|
|
22
26
|
let h = Array.isArray;
|
|
23
27
|
|
|
24
|
-
class
|
|
25
|
-
|
|
28
|
+
class e extends t {
|
|
29
|
+
_filePath;
|
|
30
|
+
_totalSavedSize = 0;
|
|
31
|
+
fileHandle;
|
|
32
|
+
constructor(t = void 0, e = void 0) {
|
|
26
33
|
super({
|
|
27
34
|
...a("QyBinWriter"),
|
|
28
|
-
...
|
|
29
|
-
}), this.filePath =
|
|
35
|
+
...t
|
|
36
|
+
}), this.filePath = e, f(this);
|
|
37
|
+
}
|
|
38
|
+
get filePath() {
|
|
39
|
+
return this._filePath;
|
|
40
|
+
}
|
|
41
|
+
set filePath(t) {
|
|
42
|
+
this._filePath = t;
|
|
30
43
|
}
|
|
31
|
-
|
|
32
|
-
return this.
|
|
44
|
+
get totalSavedSize() {
|
|
45
|
+
return this._totalSavedSize;
|
|
33
46
|
}
|
|
34
|
-
|
|
35
|
-
|
|
47
|
+
set totalSavedSize(t) {
|
|
48
|
+
this._totalSavedSize = t;
|
|
36
49
|
}
|
|
37
|
-
save(
|
|
38
|
-
null ==
|
|
50
|
+
save(t, e, a) {
|
|
51
|
+
null == e && (e = t, t = 0);
|
|
39
52
|
var i, r = this.lastOp;
|
|
40
|
-
return "_op_save" === r?.opFunName ? (i = r.args, i[0] =
|
|
53
|
+
return "_op_save" === r?.opFunName ? (i = r.args, i[0] = t, i = i[1], h(e) ? i.push(...e) : i.push(e),
|
|
41
54
|
a && l(r), r.promise) : (i = {
|
|
42
55
|
opFunName: "_op_save",
|
|
43
|
-
args: [
|
|
56
|
+
args: [ t, h(e) ? e : [ e ] ]
|
|
44
57
|
}, a ? this.pushAndRunWithPromise(i) : this.pushAndRun(i));
|
|
45
58
|
}
|
|
46
59
|
truncate() {
|
|
47
|
-
var
|
|
48
|
-
return "_op_truncate" ===
|
|
60
|
+
var t = this.lastOp;
|
|
61
|
+
return "_op_truncate" === t?.opFunName ? t.promise : this.pushAndRunWithPromise({
|
|
49
62
|
opFunName: "_op_truncate"
|
|
50
63
|
});
|
|
51
64
|
}
|
|
52
|
-
switch(
|
|
53
|
-
var
|
|
54
|
-
return "_op_switch" ===
|
|
65
|
+
switch(t) {
|
|
66
|
+
var e = this.lastOp;
|
|
67
|
+
return "_op_switch" === e?.opFunName ? (e.args[0] = t, e.promise) : this.pushAndRunWithPromise({
|
|
55
68
|
opFunName: "_op_switch",
|
|
56
|
-
args: [
|
|
69
|
+
args: [ t ]
|
|
57
70
|
});
|
|
58
71
|
}
|
|
59
|
-
getBinData(e) {
|
|
60
|
-
var
|
|
61
|
-
return 0 ==
|
|
72
|
+
getBinData(t, e = 0) {
|
|
73
|
+
var a = t.length;
|
|
74
|
+
return 0 == a ? "" : 1 == a ? t[0] : Buffer.isBuffer(t[0]) ? Buffer.concat(t) : Buffer.concat(t.map(t => Buffer.from(t)));
|
|
62
75
|
}
|
|
63
|
-
async _op_start(
|
|
64
|
-
return await i(this,
|
|
76
|
+
async _op_start(t) {
|
|
77
|
+
return await i(this, t = t || this.filePath), this;
|
|
65
78
|
}
|
|
66
79
|
async _op_stop() {
|
|
67
80
|
var {
|
|
68
|
-
fileHandle:
|
|
69
|
-
filePath:
|
|
81
|
+
fileHandle: t,
|
|
82
|
+
filePath: e
|
|
70
83
|
} = this;
|
|
71
|
-
if (
|
|
72
|
-
await
|
|
73
|
-
} catch (
|
|
74
|
-
|
|
84
|
+
if (t) try {
|
|
85
|
+
await t.close(), this.fileHandle = void 0;
|
|
86
|
+
} catch (t) {
|
|
87
|
+
y.error(`Close ${e} failed:`, t);
|
|
75
88
|
}
|
|
76
|
-
|
|
89
|
+
f(this);
|
|
77
90
|
}
|
|
78
|
-
_op_save(
|
|
79
|
-
|
|
80
|
-
if (
|
|
91
|
+
_op_save(t, e) {
|
|
92
|
+
e = this.getBinData(e, t);
|
|
93
|
+
if (e) return (async (t, e, a) => {
|
|
81
94
|
let {
|
|
82
95
|
fileHandle: i,
|
|
83
96
|
totalSavedSize: r,
|
|
84
97
|
filePath: s,
|
|
85
98
|
options: n
|
|
86
|
-
} =
|
|
99
|
+
} = t, {
|
|
87
100
|
emitSaveEvent: o,
|
|
88
101
|
maxFileSize: l,
|
|
89
102
|
maxRetryInterval: h,
|
|
90
|
-
retryIntervalFactor:
|
|
91
|
-
} = n,
|
|
92
|
-
for (;"_op_truncate" !==
|
|
93
|
-
await i.appendFile(
|
|
103
|
+
retryIntervalFactor: f
|
|
104
|
+
} = n, p = S(a), u = p.length, c = `size ${v(u)} (MaxId:${e}) to ` + s, d;
|
|
105
|
+
for (;"_op_truncate" !== t.firstOp?.opFunName; ) try {
|
|
106
|
+
await i.appendFile(p, {
|
|
94
107
|
flush: !0
|
|
95
108
|
});
|
|
96
|
-
var
|
|
97
|
-
return o && 0 <
|
|
98
|
-
|
|
99
|
-
} catch (
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
await
|
|
109
|
+
var m = t.totalSavedSize = r + u;
|
|
110
|
+
return o && 0 < e && t.emit("save", e), void (!t.maxFileSizeEmitted && l && m > l && (t.maxFileSizeEmitted = !0,
|
|
111
|
+
t.emit("maxFileSize", m)));
|
|
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`),
|
|
115
|
+
await _(d);
|
|
103
116
|
}
|
|
104
|
-
})(this,
|
|
117
|
+
})(this, t, e);
|
|
105
118
|
}
|
|
106
119
|
async _op_truncate() {
|
|
107
120
|
var {
|
|
108
|
-
fileHandle:
|
|
109
|
-
filePath:
|
|
121
|
+
fileHandle: t,
|
|
122
|
+
filePath: e
|
|
110
123
|
} = this;
|
|
111
|
-
if (
|
|
112
|
-
await
|
|
113
|
-
} catch (
|
|
114
|
-
|
|
124
|
+
if (t) try {
|
|
125
|
+
await t.truncate(0), y.info("Truncated " + e);
|
|
126
|
+
} catch (t) {
|
|
127
|
+
y.error(`Truncate ${e} failed:`, t);
|
|
115
128
|
}
|
|
116
|
-
|
|
129
|
+
f(this);
|
|
117
130
|
}
|
|
118
|
-
async _op_switch(
|
|
131
|
+
async _op_switch(t) {
|
|
119
132
|
var {
|
|
120
|
-
fileHandle:
|
|
133
|
+
fileHandle: e,
|
|
121
134
|
filePath: a
|
|
122
135
|
} = this;
|
|
123
|
-
|
|
136
|
+
e && a == t || (await i(this, t), y.info(`Switched from ${a} to ` + t));
|
|
124
137
|
}
|
|
125
138
|
}
|
|
126
139
|
|
|
127
|
-
async function i(
|
|
140
|
+
async function i(t, e) {
|
|
128
141
|
var {
|
|
129
142
|
fileHandle: a,
|
|
130
143
|
options: i
|
|
131
|
-
} =
|
|
132
|
-
|
|
144
|
+
} = t;
|
|
145
|
+
f(t);
|
|
133
146
|
try {
|
|
134
|
-
a && (a.close(),
|
|
147
|
+
a && (a.close(), t.fileHandle = void 0), await n(e);
|
|
135
148
|
var r = i.append;
|
|
136
|
-
|
|
137
|
-
} catch (
|
|
138
|
-
|
|
149
|
+
t.fileHandle = await s(e, r ? "a" : "w"), t.filePath = e, r && (t.totalSavedSize = await o(e));
|
|
150
|
+
} catch (t) {
|
|
151
|
+
y.error(`Open ${e} failed:`, t);
|
|
139
152
|
}
|
|
140
153
|
}
|
|
141
154
|
|
|
142
|
-
function
|
|
143
|
-
Object.assign(
|
|
155
|
+
function f(t) {
|
|
156
|
+
Object.assign(t, {
|
|
144
157
|
totalSavedSize: 0,
|
|
145
158
|
maxFileSizeEmitted: !1
|
|
146
159
|
});
|
|
147
160
|
}
|
|
148
161
|
|
|
149
162
|
export {
|
|
150
|
-
|
|
163
|
+
e as QyBinWriter
|
|
151
164
|
};
|