datafolder 1.0.4 → 1.0.6

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 (70) hide show
  1. package/README.md +13 -1
  2. package/data/sampleDataFolder/qykv/history/acl/1_acl.txt +1 -0
  3. package/data/sampleDataFolder/qykv/history/acl/2_acl.txt +1 -0
  4. package/data/sampleDataFolder/qykv/history/acl/3_acl.txt +1 -0
  5. package/data/sampleDataFolder/qykv/history/acl/4_acl.txt +1 -0
  6. package/data/sampleDataFolder/qykv/history/acl/5_acl.txt +1 -0
  7. package/data/sampleDataFolder/qykv/snapshot/1/1_pM.txt +0 -0
  8. package/data/sampleDataFolder/qykv/snapshot/1/1_prefixPM.txt +0 -0
  9. package/data/sampleDataFolder/qykv/snapshot/1/1_vL.txt +10 -0
  10. package/data/sampleDataFolder/qykv/snapshot/2/1_pM.txt +0 -0
  11. package/data/sampleDataFolder/qykv/snapshot/2/1_prefixPM.txt +0 -0
  12. package/data/sampleDataFolder/qykv/snapshot/2/1_vL.txt +1 -0
  13. package/data/sampleDataFolder/qykv/snapshot/3/1_pM.txt +0 -0
  14. package/data/sampleDataFolder/qykv/snapshot/3/1_prefixPM.txt +0 -0
  15. package/data/sampleDataFolder/qykv/snapshot/3/1_vL.txt +1 -0
  16. package/data/sampleDataFolder/qykv/snapshot/4/1_pM.txt +0 -0
  17. package/data/sampleDataFolder/qykv/snapshot/4/1_prefixPM.txt +0 -0
  18. package/data/sampleDataFolder/qykv/snapshot/4/1_vL.txt +1 -0
  19. package/data/sampleDataFolder/qykv/snapshot/4/2_pM.txt +0 -0
  20. package/data/sampleDataFolder/qykv/snapshot/4/2_prefixPM.txt +0 -0
  21. package/data/sampleDataFolder/qykv/snapshot/4/2_vL.txt +9 -0
  22. package/data/sampleDataFolder/qykv/snapshot/5/1_pM.txt +0 -0
  23. package/data/sampleDataFolder/qykv/snapshot/5/1_prefixPM.txt +0 -0
  24. package/data/sampleDataFolder/qykv/snapshot/5/1_vL.txt +55 -0
  25. package/data/sampleDataFolder/qykv/snapshot/info/1.json +1 -0
  26. package/data/sampleDataFolder/qykv/snapshot/info/2.json +1 -0
  27. package/data/sampleDataFolder/qykv/snapshot/info/3.json +1 -0
  28. package/data/sampleDataFolder/qykv/snapshot/info/4.json +1 -0
  29. package/data/sampleDataFolder/qykv/snapshot/info/5.json +1 -0
  30. package/data/sampleDataFolder/qylog/2026/02/15/08/change.txt +58 -0
  31. package/data/sampleDataFolder/qylog/2026/02/15/08/stderr.txt +11 -0
  32. package/data/sampleDataFolder/qylog/2026/02/15/08/stdout.txt +36 -0
  33. package/package.json +1 -1
  34. package/sample.js +19 -19
  35. package/src/QyAcl.js +44 -44
  36. package/src/QyAclSaver_Worker.js +2 -2
  37. package/src/QyAclWriter.js +1 -1
  38. package/src/QyBatch.js +1 -3
  39. package/src/QyBinWriter.js +65 -66
  40. package/src/QyCD.js +63 -27
  41. package/src/QyCache.js +33 -33
  42. package/src/QyDB.js +4 -30
  43. package/src/QyDefaultOptions.js +2 -1
  44. package/src/QyFetch.js +4 -22
  45. package/src/QyFileLogger.js +2 -2
  46. package/src/QyKVData.js +159 -183
  47. package/src/QyKVDataCleaner_Worker.js +15 -14
  48. package/src/QyKVDataSaver_Worker.js +16 -16
  49. package/src/QyLogFileSaver.js +1 -1
  50. package/src/QyLogFileSaver_Worker.js +2 -2
  51. package/src/QyMod.js +7 -7
  52. package/src/QyOpRunner.js +19 -16
  53. package/src/QySnapshotCompactor_Worker.js +37 -36
  54. package/src/QySnapshotSaver_Worker.js +2 -2
  55. package/src/QySnapshots.js +141 -139
  56. package/src/QyUnionNode.js +2 -2
  57. package/src/rpc/evalCode.js +4 -4
  58. package/src/rpc/getFileContent.js +4 -4
  59. package/src/rpc/getSubItems.js +12 -12
  60. package/src/rpc/queryFiles.js +1 -1
  61. package/static/codemirror.bundle/editor.bundle.js +27906 -0
  62. package/static/datafolderui/QyUIFolderTree.js +121 -145
  63. package/static/datafolderui/QyUIUtils.js +9 -4
  64. package/static/datafolderui/code-mirror.js +35 -0
  65. package/static/datafolderui/display-tree.js +52 -86
  66. package/static/datafolderui/explore-tree.js +66 -81
  67. package/static/datafolderui/index.css +7 -0
  68. package/static/datafolderui/index.html +1 -0
  69. package/static/datafolderui/main-page.js +34 -55
  70. package/static/datafolderui/query-editor.js +178 -198
package/README.md CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  datafolder is a lightweight JSON database, featuring an AI-friendly API for simple and human maintainable code generation, millisecond data response, with full index and trigger features supported, and the unique ability to browse and manage data as a folder tree directly in your browser. It works perfectly for a wide range of scenarios, from game/application backends to embedded systems to IoT to edge computing.
4
4
 
5
+ ### Changelog
6
+ 1.0.6 Added code mirror as the query editor.
7
+
5
8
  ## Installation
6
9
 
7
10
  ```javascript
@@ -103,6 +106,15 @@ dataFolder.batch
103
106
  ### 3. Powerful Query Support. Auto Create Needed Indexes
104
107
 
105
108
  ```javascript
109
+ // get all the training data in year 2026 with feedbackScore between 60 and 85.
110
+ dataFolder.queryFiles("traindata/2026/**", { feedbackScore: (x) => x >= 60 && x <= 85 });
111
+
112
+ // get training data of user_001 from July to Oct in year 2025, 2026 with feedbackScore higher than 90.
113
+ dataFolder.queryFiles(["traindata", { $in: [2025, 2026] }, { $gt: 6, $lte: 10 }], {
114
+ feedbackScore: { $gt: 90 },
115
+ userId: "user_0001",
116
+ });
117
+
106
118
  dataFolder.queryFiles("flights/**", { _from: "airports/LAX" });
107
119
  dataFolder.queryFiles(["flights", "*", "jan", (x) => x >= 5 && x <= 7], {
108
120
  $or: [{ _from: "airports/BIS" }, { _to: "airports/BIS" }],
@@ -177,4 +189,4 @@ Next time to bring up the UI:
177
189
  npm run ui
178
190
  ```
179
191
 
180
- Complex query examples can be found in the scripts folder source code.
192
+ Complex query examples can be found in the scripts folder source code.
@@ -0,0 +1 @@
1
+ ��{"A":{"d47DEQpj8HB":["traindata"],"dtUlkQZgl7o":["2026"],"dyIV17-jlAm":["1"],"dgtwaon715h":["20"],"f4c29u8q2PJ":["chat_0001"],"d4c29u8q2PJ":["chat_0001"],"f7_c5SOWlEi":["prompt","answer"]},"M":{"c7_c5SOWlEi":{"$rpl":{"userid":"user_0001","email":"a@b.com","feedbackScore":6,"address":{"city":"a","zipcode":678}}},"cHZTLuixYD7":"What is async/await?","cbjx7gmgpjt":"async/await is ..."}}
@@ -0,0 +1 @@
1
+ �){"M":{"c7_c5SOWlEi":{"feedbackScore":7}}}
@@ -0,0 +1 @@
1
+ �C{"M":{"c7_c5SOWlEi":{"feedbackScore":6,"address":{"zipcode":678}}}}
@@ -0,0 +1 @@
1
+ �){"M":{"c7_c5SOWlEi":{"feedbackScore":7}}}
@@ -0,0 +1,10 @@
1
+ {"userid":"user_0001","email":"a@b.com","feedbackScore":6,"address":{"city":"a","zipcode":678}}
2
+ 'What is async/await?
3
+ 'async/await is ...
4
+ ["traindata"]
5
+ ["chat_0001"]
6
+ ["20"]
7
+ ["2026"]
8
+ ["1"]
9
+ ["chat_0001"]
10
+ ["prompt","answer"]
@@ -0,0 +1 @@
1
+ {"userid":"user_0001","email":"a@b.com","feedbackScore":7,"address":{"city":"a","zipcode":678}}
@@ -0,0 +1 @@
1
+ {"userid":"user_0001","email":"a@b.com","feedbackScore":6,"address":{"city":"a","zipcode":678}}
@@ -0,0 +1 @@
1
+ {"userid":"user_0001","email":"a@b.com","feedbackScore":7,"address":{"city":"a","zipcode":678}}
@@ -0,0 +1,9 @@
1
+ {"userid":"user_0001","email":"a@b.com","feedbackScore":7,"address":{"city":"a","zipcode":678}}
2
+ 'What is async/await?
3
+ 'async/await is ...
4
+ ["chat_0001"]
5
+ ["20"]
6
+ ["2026"]
7
+ ["1"]
8
+ ["chat_0001"]
9
+ ["prompt","answer"]
@@ -0,0 +1,55 @@
1
+ 'let a = new Error("No such file");
2
+
3
+ module.exports = ({
4
+ filePath: e,
5
+ cChangeId: n
6
+ }) => {
7
+ var t, l, o, e = dataFolder.fileP(e);
8
+ return e ? ({
9
+ fileContent: e,
10
+ cChangeId: t,
11
+ fileContentKey: l
12
+ } = e, o = {}, n != t && (Object.assign(o, {
13
+ fileContent: e,
14
+ cChangeId: t
15
+ }), null == n) && (o.fileContentKey = l), o) : a;
16
+ };
17
+ 'module.exports = queryText => {
18
+ let {
19
+ folder,
20
+ value,
21
+ view,
22
+ limit,
23
+ cursor
24
+ } = eval("((x)=>x)(" + queryText + ")");
25
+ return dataFolder.queryTree(folder, value, view, limit, cursor);
26
+ };
27
+ 'module.exports = () => {};
28
+ 'let s = new Error("No such dir");
29
+
30
+ module.exports = ({
31
+ dirPath: a,
32
+ dChangeId: d,
33
+ fChangeId: e
34
+ }) => {
35
+ var r, a = dataFolder.dirP(a);
36
+ return a ? (r = {}, d || e || (r.fullPathHash = a.fullPathHash), d != a.dChangeId && Object.assign(r, {
37
+ subdirList: a.sortedSubdirList.map(a => a.name),
38
+ dChangeId: a.dChangeId
39
+ }), e != a.fChangeId && Object.assign(r, {
40
+ fileList: a.sortedFileList.map(a => a.name),
41
+ fChangeId: a.fChangeId
42
+ }), r) : s;
43
+ };
44
+ 'module.exports = r => {
45
+ try {
46
+ return new Function("dataFolder", `return (${r})();`)(dataFolder);
47
+ } catch (r) {
48
+ return {
49
+ error: r.message
50
+ };
51
+ }
52
+ };
53
+ ["traindata","%"]
54
+ ["rpc"]
55
+ ["evalCode","getSubItems","queryFiles","getFileContent","reloadRpc"]
@@ -0,0 +1 @@
1
+ {"maxChangeId":4,"pMVersion":1,"vLVersion":1,"totalCount":10,"outdatedCount":0,"outdated":"0%"}
@@ -0,0 +1 @@
1
+ {"maxChangeId":5,"pMVersion":1,"vLVersion":1,"totalCount":1,"outdatedCount":0,"outdated":"0%"}
@@ -0,0 +1 @@
1
+ {"maxChangeId":7,"pMVersion":1,"vLVersion":1,"totalCount":1,"outdatedCount":0,"outdated":"0%"}
@@ -0,0 +1 @@
1
+ {"maxChangeId":8,"pMVersion":1,"vLVersion":1,"totalCount":1,"outdatedCount":0,"outdated":"0%"}
@@ -0,0 +1 @@
1
+ {"maxChangeId":13,"pMVersion":1,"vLVersion":1,"totalCount":8,"outdatedCount":0,"outdated":"0%"}
@@ -0,0 +1,58 @@
1
+ 2026-02-15T08:50:18.312Z: 6 changes:
2
+ createDir "/traindata"
3
+ createDir "/traindata/2026"
4
+ createDir "/traindata/2026/1"
5
+ createDir "/traindata/2026/1/20"
6
+ createFile "/traindata/2026/1/20/chat_0001"
7
+ insert "/traindata/2026/1/20/chat_0001" undefined -> {"$rpl":{"userid":"user_0001","email":"a@b.com","feedbackScore":5,"address":{"city":"a","zipcode":123}}}
8
+ 2026-02-15T08:50:18.313Z: 3 changes:
9
+ createDir "/traindata/2026/1/20/chat_0001"
10
+ createFile "/traindata/2026/1/20/chat_0001/prompt"
11
+ insert "/traindata/2026/1/20/chat_0001/prompt" undefined -> "What is async/await?"
12
+ 2026-02-15T08:50:18.313Z: 2 changes:
13
+ createFile "/traindata/2026/1/20/chat_0001/answer"
14
+ insert "/traindata/2026/1/20/chat_0001/answer" undefined -> "async/await is ..."
15
+ 2026-02-15T08:50:18.317Z: 1 change:
16
+ insert "/traindata/2026/1/20/chat_0001" delta: {"feedbackScore":5,"address":{"zipcode":123}} -> {"feedbackScore":6,"address":{"zipcode":678}}
17
+ 2026-02-15T08:50:18.548Z: 1 change:
18
+ insert "/traindata/2026/1/20/chat_0001" delta: {"feedbackScore":6} -> {"feedbackScore":7}
19
+ 2026-02-15T08:50:23.921Z: 1 change:
20
+ insert "/traindata/2026/1/20/chat_0001" delta: {"feedbackScore":7,"address":{"zipcode":678}} -> {"feedbackScore":5,"address":{"zipcode":123}}
21
+ 2026-02-15T08:50:23.927Z: 1 change:
22
+ insert "/traindata/2026/1/20/chat_0001" delta: {"feedbackScore":5,"address":{"zipcode":123}} -> {"feedbackScore":6,"address":{"zipcode":678}}
23
+ 2026-02-15T08:50:24.106Z: 1 change:
24
+ insert "/traindata/2026/1/20/chat_0001" delta: {"feedbackScore":6} -> {"feedbackScore":7}
25
+ 2026-02-15T08:50:56.784Z: 4 changes:
26
+ createDir "/%"
27
+ createDir "/%/rpc"
28
+ createFile "/%/rpc/evalCode"
29
+ insert "/%/rpc/evalCode" undefined -> "module.exports = r => {\n try {\n return new Function(\"dataFolder\", `return (${r})();`)(dataFolder);\n } catch (r) {\n return {\n error: r.message\n };\n }\n};"
30
+ 2026-02-15T08:50:56.785Z: 2 changes:
31
+ createFile "/%/rpc/getFileContent"
32
+ insert "/%/rpc/getFileContent" undefined -> "let a = new Error(\"No such file\");\n\nmodule.exports = ({\n filePath: e,\n cChangeId: n\n}) => {\n var t, l, o, e = dataFolder.fileP(e);\n return e ? ({\n fileContent: e,\n cChangeId: t,\n fileContentKey: l\n } = e, o = {}, n != t && (Object.assign(o, {\n fileContent: e,\n cChangeId: t\n }), null == n) && (o.fileContentKey = l), o) : a;\n};"
33
+ 2026-02-15T08:50:56.786Z: 2 changes:
34
+ createFile "/%/rpc/getSubItems"
35
+ insert "/%/rpc/getSubItems" undefined -> "let s = new Error(\"No such dir\");\n\nmodule.exports = ({\n dirPath: a,\n dChangeId: d,\n fChangeId: e\n}) => {\n var r, a = dataFolder.dirP(a);\n return a ? (r = {}, d || e || (r.fullPathHash = a.fullPathHash), d != a.dChangeId && Object.assign(r, {\n subdirList: a.sortedSubdirList.map(a => a.name),\n dChangeId: a.dChangeId\n }), e != a.fChangeId && Object.assign(r, {\n fileList: a.sortedFileList.map(a => a.name),\n fChangeId: a.fChangeId\n }), r) : s;\n};"
36
+ 2026-02-15T08:50:56.787Z: 2 changes:
37
+ createFile "/%/rpc/queryFiles"
38
+ insert "/%/rpc/queryFiles" undefined -> "module.exports = queryText => {\n let {\n folder,\n value,\n view,\n limit,\n cursor\n } = eval(\"((x)=>x)(\" + queryText + \")\");\n return dataFolder.queryTree(folder, value, view, limit, cursor);\n};"
39
+ 2026-02-15T08:50:56.788Z: 2 changes:
40
+ createFile "/%/rpc/reloadRpc"
41
+ insert "/%/rpc/reloadRpc" undefined -> "module.exports = () => {};"
42
+ 2026-02-15T08:51:14.589Z: 4 changes:
43
+ createDir "/%"
44
+ createDir "/%/rpc"
45
+ createFile "/%/rpc/evalCode"
46
+ insert "/%/rpc/evalCode" undefined -> "module.exports = r => {\n try {\n return new Function(\"dataFolder\", `return (${r})();`)(dataFolder);\n } catch (r) {\n return {\n error: r.message\n };\n }\n};"
47
+ 2026-02-15T08:51:14.590Z: 2 changes:
48
+ createFile "/%/rpc/getSubItems"
49
+ insert "/%/rpc/getSubItems" undefined -> "let s = new Error(\"No such dir\");\n\nmodule.exports = ({\n dirPath: a,\n dChangeId: d,\n fChangeId: e\n}) => {\n var r, a = dataFolder.dirP(a);\n return a ? (r = {}, d || e || (r.fullPathHash = a.fullPathHash), d != a.dChangeId && Object.assign(r, {\n subdirList: a.sortedSubdirList.map(a => a.name),\n dChangeId: a.dChangeId\n }), e != a.fChangeId && Object.assign(r, {\n fileList: a.sortedFileList.map(a => a.name),\n fChangeId: a.fChangeId\n }), r) : s;\n};"
50
+ 2026-02-15T08:51:14.590Z: 2 changes:
51
+ createFile "/%/rpc/queryFiles"
52
+ insert "/%/rpc/queryFiles" undefined -> "module.exports = queryText => {\n let {\n folder,\n value,\n view,\n limit,\n cursor\n } = eval(\"((x)=>x)(\" + queryText + \")\");\n return dataFolder.queryTree(folder, value, view, limit, cursor);\n};"
53
+ 2026-02-15T08:51:14.591Z: 2 changes:
54
+ createFile "/%/rpc/getFileContent"
55
+ insert "/%/rpc/getFileContent" undefined -> "let a = new Error(\"No such file\");\n\nmodule.exports = ({\n filePath: e,\n cChangeId: n\n}) => {\n var t, l, o, e = dataFolder.fileP(e);\n return e ? ({\n fileContent: e,\n cChangeId: t,\n fileContentKey: l\n } = e, o = {}, n != t && (Object.assign(o, {\n fileContent: e,\n cChangeId: t\n }), null == n) && (o.fileContentKey = l), o) : a;\n};"
56
+ 2026-02-15T08:51:14.591Z: 2 changes:
57
+ createFile "/%/rpc/reloadRpc"
58
+ insert "/%/rpc/reloadRpc" undefined -> "module.exports = () => {};"
@@ -0,0 +1,11 @@
1
+ 2026-02-15T08:50:56.813Z fastify.js:70:16:error: Error: listen EADDRINUSE: address already in use ::1:3628
2
+ at Server.setupListenHandle [as _listen2] (node:net:2016:16)
3
+ at listenInCluster (node:net:2073:12)
4
+ at GetAddrInfoReqWrap.callback (node:net:2282:7)
5
+ at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:133:8) {
6
+ code: 'EADDRINUSE',
7
+ errno: -4091,
8
+ syscall: 'listen',
9
+ address: '::1',
10
+ port: 3628
11
+ }
@@ -0,0 +1,36 @@
1
+ 2026-02-15T08:50:18.307Z QyCache.js:138:79:log: Started.
2
+ 2026-02-15T08:50:18.314Z sample.js:17:9:log: user_0001 a@b.com 5 { city: 'a', zipcode: 123 }
3
+ 2026-02-15T08:50:18.317Z sample.js:20:9:log: { feedbackScore: 6, address: { city: 'a', zipcode: 678 } }
4
+ 2026-02-15T08:50:18.318Z sample.js:21:9:log: What is async/await?
5
+ 2026-02-15T08:50:18.319Z sample.js:22:9:log: async/await is ...
6
+ 2026-02-15T08:50:18.320Z QyCache.js:142:16:log: Stopping...
7
+ 2026-02-15T08:50:18.542Z QyCache.js:138:79:log: Started.
8
+ 2026-02-15T08:50:18.547Z sample.js:28:10:log: a@b.com 6
9
+ 2026-02-15T08:50:18.549Z sample.js:30:10:log: {
10
+ userid: 'user_0001',
11
+ email: 'a@b.com',
12
+ feedbackScore: 7,
13
+ address: { city: 'a', zipcode: 678 }
14
+ } What is async/await? async/await is ...
15
+ 2026-02-15T08:50:18.549Z QyCache.js:142:16:log: Stopping...
16
+ 2026-02-15T08:50:23.914Z QyCache.js:138:79:log: Started.
17
+ 2026-02-15T08:50:23.926Z sample.js:17:9:log: user_0001 a@b.com 5 { city: 'a', zipcode: 123 }
18
+ 2026-02-15T08:50:23.928Z sample.js:20:9:log: { feedbackScore: 6, address: { city: 'a', zipcode: 678 } }
19
+ 2026-02-15T08:50:23.929Z sample.js:21:9:log: What is async/await?
20
+ 2026-02-15T08:50:23.930Z sample.js:22:9:log: async/await is ...
21
+ 2026-02-15T08:50:23.930Z QyCache.js:142:16:log: Stopping...
22
+ 2026-02-15T08:50:24.104Z QyCache.js:138:79:log: Started.
23
+ 2026-02-15T08:50:24.106Z sample.js:28:10:log: a@b.com 6
24
+ 2026-02-15T08:50:24.107Z sample.js:30:10:log: {
25
+ userid: 'user_0001',
26
+ email: 'a@b.com',
27
+ feedbackScore: 7,
28
+ address: { city: 'a', zipcode: 678 }
29
+ } What is async/await? async/await is ...
30
+ 2026-02-15T08:50:24.107Z QyCache.js:142:16:log: Stopping...
31
+ 2026-02-15T08:50:56.776Z QyCache.js:138:79:log: Started.
32
+ 2026-02-15T08:51:14.579Z QyCache.js:138:79:log: Started.
33
+ 2026-02-15T08:51:14.612Z fastify.js:73:16:log: Example app listening on port 3628
34
+ 2026-02-15T08:51:14.617Z QySnapshots.js:242:93:log: combiningSnapshots:1,4
35
+ 2026-02-15T08:51:39.471Z fastify.js:24:10:log: SIGINT signal received: closing HTTP server
36
+ 2026-02-15T08:51:39.475Z QyCache.js:142:16:log: Stopping...
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datafolder",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "author": {
5
5
  "name": "lysh",
6
6
  "email": "datafolderdev@outlook.com"
package/sample.js CHANGED
@@ -5,33 +5,33 @@ run();
5
5
 
6
6
  async function run() {
7
7
  await dataFolder.start();
8
- dataFolder.insert("users/2026/user_0001", {
8
+ dataFolder.insert("traindata/2026/1/20/chat_0001", {
9
9
  userid: "user_0001",
10
10
  email: "a@b.com",
11
- password: "123",
12
- score: 5,
11
+ feedbackScore: 5,
13
12
  address: { city: "a", zipcode: 123 },
14
13
  });
15
- dataFolder.insert("users/2026/user_0002", {
16
- userid: "user_0002",
17
- email: "c@b.com",
18
- password: "333",
19
- score: 3,
20
- address: { city: "b", zipcode: 321 },
21
- });
22
- const { email, password, address, score } = dataFolder.view("users/2026/user_0002");
23
- logger.log(email, password, score, address);
14
+ dataFolder.insert("traindata/2026/1/20/chat_0001/prompt", "What is async/await?");
15
+ dataFolder.insert("traindata/2026/1/20/chat_0001/answer", "async/await is ...");
16
+ const { userid, email, address, feedbackScore } = dataFolder.view("traindata/2026/1/20/chat_0001");
17
+ logger.log(userid, email, feedbackScore, address);
24
18
  address.zipcode = 678;
25
- dataFolder.insert("users/2026/user_0002", { score: score + 1, address });
26
- logger.log(dataFolder.view("users/2026/user_0002", ["score", "address"]));
19
+ dataFolder.insert("traindata/2026/1/20/chat_0001", { feedbackScore: feedbackScore + 1, address });
20
+ logger.log(dataFolder.view("traindata/2026/1/20/chat_0001", ["feedbackScore", "address"]));
21
+ logger.log(dataFolder.view("traindata/2026/1/20/chat_0001/prompt"));
22
+ logger.log(dataFolder.view("traindata/2026/1/20/chat_0001/answer"));
27
23
  await dataFolder.stop();
28
24
  await dataFolder.start();
29
25
  {
30
- const file = dataFolder.file("users/2026/user_0002");
31
- const { email, password, score } = file.view();
32
- logger.log(email, password, score);
33
- dataFolder.insert(file, { score: score + 1 });
34
- logger.log(file.view());
26
+ const file = dataFolder.file("traindata/2026/1/20/chat_0001");
27
+ const { email, feedbackScore } = file.view();
28
+ logger.log(email, feedbackScore);
29
+ dataFolder.insert(file, { feedbackScore: feedbackScore + 1 });
30
+ logger.log(
31
+ file.view(),
32
+ dataFolder.view("traindata/2026/1/20/chat_0001/prompt"),
33
+ dataFolder.view("traindata/2026/1/20/chat_0001/answer"),
34
+ );
35
35
  }
36
36
  await dataFolder.stop();
37
37
  }
package/src/QyAcl.js CHANGED
@@ -2,13 +2,13 @@ import u from "node:fs/promises";
2
2
 
3
3
  import {
4
4
  mergeContent as m,
5
- mergeContentChanges as s,
5
+ mergeContentChanges as n,
6
6
  setValByNamePath as a
7
7
  } from "./QyFileContentUtils.js";
8
8
 
9
9
  import {
10
10
  isEmptyObj as g,
11
- arrayLast as n
11
+ arrayLast as s
12
12
  } from "./QyUtils.js";
13
13
 
14
14
  import {
@@ -20,14 +20,14 @@ function r(r, e) {
20
20
  A: r,
21
21
  R: t,
22
22
  M: a,
23
- D: n
23
+ D: s
24
24
  } = r;
25
- n && delete n[e], e.startsWith("c") ? a && delete a[e] : (r && delete r[e],
25
+ s && delete s[e], e.startsWith("c") ? a && delete a[e] : (r && delete r[e],
26
26
  t && delete t[e]);
27
27
  }
28
28
 
29
29
  function e(r, e) {
30
- var t, a, n, s, {
30
+ var t, a, s, n, {
31
31
  D: e,
32
32
  A: i,
33
33
  R: o,
@@ -38,27 +38,27 @@ function e(r, e) {
38
38
  var c, l = r[a] || (r[a] = {});
39
39
  for (c of i[a]) l[c] = 1;
40
40
  }
41
- for (n in o) {
42
- var u = r[n];
41
+ for (s in o) {
42
+ var u = r[s];
43
43
  if (u) {
44
- var d = o[n];
44
+ var d = o[s];
45
45
  if (d) {
46
46
  for (var h of d) delete u[h];
47
- g(u) && (r[n] = void 0);
47
+ g(u) && (r[s] = void 0);
48
48
  }
49
49
  }
50
50
  }
51
- for (s in f) r[s] = m(r[s], f[s]);
51
+ for (n in f) r[n] = m(r[n], f[n]);
52
52
  }
53
53
 
54
54
  function t(r, e) {
55
55
  var t, {
56
56
  D: r,
57
57
  A: a,
58
- R: n,
59
- M: s
58
+ R: s,
59
+ M: n
60
60
  } = r;
61
- for (t of [ r, a, n, s ]) for (var i in t) e(i);
61
+ for (t of [ r, a, s, n ]) for (var i in t) e(i);
62
62
  }
63
63
 
64
64
  class i {
@@ -85,10 +85,10 @@ class i {
85
85
 
86
86
  case "M":
87
87
  {
88
- var n = this.cmdArgAsMapObj;
89
- let r = n.M;
90
- n = (r = null == r ? n.M = {} : r)[e];
91
- r[e] = null != n ? s(n, t) : t;
88
+ var s = this.cmdArgAsMapObj;
89
+ let r = s.M;
90
+ s = (r = null == r ? s.M = {} : r)[e];
91
+ r[e] = null != s ? n(s, t) : t;
92
92
  break;
93
93
  }
94
94
 
@@ -100,15 +100,15 @@ class i {
100
100
  if (r) {
101
101
  ++this.batchSize;
102
102
  var e, t, a, {
103
- D: n,
104
- M: s
103
+ D: s,
104
+ M: n
105
105
  } = r;
106
- for (e in n) this.pushCmd("D", e);
106
+ for (e in s) this.pushCmd("D", e);
107
107
  for (t of [ "A", "R" ]) {
108
108
  var i, o = r[t];
109
109
  for (i in o) for (var f of o[i]) this.pushCmd(t, i, f);
110
110
  }
111
- for (a in s) this.pushCmd("M", a, s[a]);
111
+ for (a in n) this.pushCmd("M", a, n[a]);
112
112
  }
113
113
  return this;
114
114
  }
@@ -122,20 +122,20 @@ class i {
122
122
  for (r of [ "A", "R" ]) {
123
123
  var t, a = e[r];
124
124
  for (t in a) {
125
- var n = Object.keys(a[t]);
126
- 0 < n.length ? a[t] = n : delete a[t];
125
+ var s = Object.keys(a[t]);
126
+ 0 < s.length ? a[t] = s : delete a[t];
127
127
  }
128
128
  g(a) && delete e[r];
129
129
  }
130
130
  var {
131
- D: s,
131
+ D: n,
132
132
  M: i
133
133
  } = e;
134
- return s && g(s) && delete e.D, i && g(i) && delete e.M, e;
134
+ return n && g(n) && delete e.D, i && g(i) && delete e.M, e;
135
135
  }
136
136
  toAclBuffer(r) {
137
137
  var e, t = this.batchSize;
138
- if (0 < t) return r = r, t = t, e = this.takeCmdArgAsListObj(), e = Buffer.from(JSON.stringify(e) + "\n"),
138
+ if (0 < t) return r = r, t = t, e = this.takeCmdArgAsListObj(), e = Buffer.from(JSON.stringify(e)),
139
139
  Buffer.concat([ l([ r, t, e.length ]), e ]);
140
140
  }
141
141
  }
@@ -148,7 +148,7 @@ function f(r, e) {
148
148
  let t = r.cmdArgAsMapObj;
149
149
  if (t && e && !(e.length <= 1)) {
150
150
  for (let r = 0; r < e.length - 1; ++r) if (null == (t = t[e[r]])) return;
151
- delete t[n(e)];
151
+ delete t[s(e)];
152
152
  }
153
153
  }
154
154
 
@@ -163,19 +163,19 @@ async function c(e, r = !1, t = 0) {
163
163
  let A = [ 1, 2, 4, 8 ];
164
164
 
165
165
  function l(e) {
166
- var t = e.length, a = new Array(t), n = new Array(t);
167
- let s = t << 6, i = 1;
166
+ var t = e.length, a = new Array(t), s = new Array(t);
167
+ let n = t << 6, i = 1;
168
168
  for (let r = 0; r < t; ++r) {
169
- var o = a[r] = (o = e[r]) <= 255 ? 0 : o <= 65535 ? 1 : o <= 4294967295 ? 2 : 3, o = (s |= o << (r << 1),
170
- n[r] = A[o]);
169
+ var o = a[r] = (o = e[r]) <= 255 ? 0 : o <= 65535 ? 1 : o <= 4294967295 ? 2 : 3, o = (n |= o << (r << 1),
170
+ s[r] = A[o]);
171
171
  i += o;
172
172
  }
173
173
  var f = Buffer.allocUnsafe(i);
174
- f.writeUInt8(s);
174
+ f.writeUInt8(n);
175
175
  let c = 1;
176
176
  for (let r = 0; r < t; ++r) {
177
177
  h = d = u = l = void 0;
178
- var [ l, u, d, h = 0 ] = [ f, e[r], n[r], c ];
178
+ var [ l, u, d, h = 0 ] = [ f, e[r], s[r], c ];
179
179
  switch (d) {
180
180
  case 1:
181
181
  l.writeUInt8(u, h);
@@ -192,15 +192,15 @@ function l(e) {
192
192
  default:
193
193
  l.writeBigUInt64BE(BigInt(u), h);
194
194
  }
195
- c += n[r];
195
+ c += s[r];
196
196
  }
197
197
  return f;
198
198
  }
199
199
 
200
200
  function h(e, t, a) {
201
- var n = e.readUInt8(t), s = (++t, n >> 6 & 3);
202
- for (let r = 0; r < s; ++r) {
203
- var i = A[n >> (r << 1) & 3];
201
+ var s = e.readUInt8(t), n = (++t, s >> 6 & 3);
202
+ for (let r = 0; r < n; ++r) {
203
+ var i = A[s >> (r << 1) & 3];
204
204
  a[r] = ((r, e, t = 0) => {
205
205
  switch (e) {
206
206
  case 1:
@@ -220,25 +220,25 @@ function h(e, t, a) {
220
220
  return t;
221
221
  }
222
222
 
223
- async function v(t, r, a, n) {
224
- var s = [];
223
+ async function v(t, r, a, s) {
224
+ var n = [];
225
225
  for (let e = 0; e < r.length; ) {
226
226
  var i = [], o = h(r, e, i), [ i, f, c ] = i;
227
- if (i <= n) d.warn(`changeId ${i} <= currentChangeId ${n} at ${t}:${e}. Ignored.`),
227
+ if (i <= s) d.warn(`changeId ${i} <= currentChangeId ${s} at ${t}:${e}. Ignored.`),
228
228
  e = o + c; else {
229
- n + f != i && d.warn(`currentChangeId ${n} + batchSize ${f} != changeId ` + i);
229
+ s + f != i && d.warn(`currentChangeId ${s} + batchSize ${f} != changeId ` + i);
230
230
  try {
231
231
  var l = JSON.parse(r.subarray(o, o + c));
232
- s.push([ i, l ]), n = i, e = o + c;
232
+ n.push([ i, l ]), s = i, e = o + c;
233
233
  } catch (r) {
234
234
  if (d.error(`Parse ${t} failed at ${e}:`, r), a) return d.warn(`Autorepair by truncating ${t} to ` + e),
235
235
  null == (f = await u.truncate(t, e)) ? d.log("truncate success") : d.error("truncate failed:", f),
236
- s;
236
+ n;
237
237
  throw r;
238
238
  }
239
239
  }
240
240
  }
241
- return s;
241
+ return n;
242
242
  }
243
243
 
244
244
  export {
@@ -15,10 +15,10 @@ class r extends t {
15
15
  })
16
16
  });
17
17
  }
18
- async start(t) {
18
+ async _op_start(t) {
19
19
  await this.qyAclWriter.start(t);
20
20
  }
21
- async stop() {
21
+ async _op_stop() {
22
22
  await this.qyAclWriter.stop();
23
23
  }
24
24
  switch(t) {
@@ -17,7 +17,7 @@ class t extends r {
17
17
  ...r
18
18
  }, t), this.qyAclCmdGenerator = new e();
19
19
  }
20
- _getBinData(r, t) {
20
+ getBinData(r, t) {
21
21
  var e, s = this.qyAclCmdGenerator;
22
22
  for (e of r) s.pushCmdArgAsListObj(e);
23
23
  return s.toAclBuffer(t);
package/src/QyBatch.js CHANGED
@@ -235,9 +235,7 @@ ${r}
235
235
  modCode: t
236
236
  } = e, r = this._action_insert({
237
237
  item: e,
238
- content: {
239
- modCode: t
240
- }
238
+ content: t
241
239
  });
242
240
  return r && this.qyCache.insertRpc(e.name, t), r;
243
241
  }