datafolder 1.0.6 → 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 (57) hide show
  1. package/README.md +3 -1
  2. package/internal.md +119 -0
  3. package/package.json +2 -2
  4. package/scripts/convertBinFiles.js +49 -0
  5. package/scripts/fastify.js +2 -2
  6. package/src/QyCD.js +19 -10
  7. package/src/QyCache.js +6 -0
  8. package/src/QyFetch.js +1 -1
  9. package/src/QyKVData.js +21 -12
  10. package/src/QyKVDataSaver_Worker.js +7 -7
  11. package/src/QySnapshotCompactor_Worker.js +19 -18
  12. package/src/QySnapshotSaver_Worker.js +54 -52
  13. package/src/QySnapshots.js +72 -64
  14. package/src/rpc/getTriggerFiles.js +1 -0
  15. package/src/soc_pokec.js +7 -7
  16. package/static/datafolderui/QyStyledElement.js +6 -15
  17. package/static/datafolderui/QyUIFolderTree.js +71 -62
  18. package/static/datafolderui/QyUIFolderViewer.js +210 -0
  19. package/static/datafolderui/QyUIUtils.js +1 -1
  20. package/static/datafolderui/display-tree.js +18 -57
  21. package/static/datafolderui/explore-tree.js +10 -10
  22. package/static/datafolderui/folder-tree.js +71 -2
  23. package/static/datafolderui/json-view.js +7 -3
  24. package/static/datafolderui/main-page.js +22 -19
  25. package/static/datafolderui/query-editor.js +1 -1
  26. package/static/datafolderui/trigger-editor.js +30 -0
  27. package/data/sampleDataFolder/qykv/history/acl/1_acl.txt +0 -1
  28. package/data/sampleDataFolder/qykv/history/acl/2_acl.txt +0 -1
  29. package/data/sampleDataFolder/qykv/history/acl/3_acl.txt +0 -1
  30. package/data/sampleDataFolder/qykv/history/acl/4_acl.txt +0 -1
  31. package/data/sampleDataFolder/qykv/history/acl/5_acl.txt +0 -1
  32. package/data/sampleDataFolder/qykv/snapshot/1/1_pM.txt +0 -0
  33. package/data/sampleDataFolder/qykv/snapshot/1/1_prefixPM.txt +0 -0
  34. package/data/sampleDataFolder/qykv/snapshot/1/1_vL.txt +0 -10
  35. package/data/sampleDataFolder/qykv/snapshot/2/1_pM.txt +0 -0
  36. package/data/sampleDataFolder/qykv/snapshot/2/1_prefixPM.txt +0 -0
  37. package/data/sampleDataFolder/qykv/snapshot/2/1_vL.txt +0 -1
  38. package/data/sampleDataFolder/qykv/snapshot/3/1_pM.txt +0 -0
  39. package/data/sampleDataFolder/qykv/snapshot/3/1_prefixPM.txt +0 -0
  40. package/data/sampleDataFolder/qykv/snapshot/3/1_vL.txt +0 -1
  41. package/data/sampleDataFolder/qykv/snapshot/4/1_pM.txt +0 -0
  42. package/data/sampleDataFolder/qykv/snapshot/4/1_prefixPM.txt +0 -0
  43. package/data/sampleDataFolder/qykv/snapshot/4/1_vL.txt +0 -1
  44. package/data/sampleDataFolder/qykv/snapshot/4/2_pM.txt +0 -0
  45. package/data/sampleDataFolder/qykv/snapshot/4/2_prefixPM.txt +0 -0
  46. package/data/sampleDataFolder/qykv/snapshot/4/2_vL.txt +0 -9
  47. package/data/sampleDataFolder/qykv/snapshot/5/1_pM.txt +0 -0
  48. package/data/sampleDataFolder/qykv/snapshot/5/1_prefixPM.txt +0 -0
  49. package/data/sampleDataFolder/qykv/snapshot/5/1_vL.txt +0 -55
  50. package/data/sampleDataFolder/qykv/snapshot/info/1.json +0 -1
  51. package/data/sampleDataFolder/qykv/snapshot/info/2.json +0 -1
  52. package/data/sampleDataFolder/qykv/snapshot/info/3.json +0 -1
  53. package/data/sampleDataFolder/qykv/snapshot/info/4.json +0 -1
  54. package/data/sampleDataFolder/qykv/snapshot/info/5.json +0 -1
  55. package/data/sampleDataFolder/qylog/2026/02/15/08/change.txt +0 -58
  56. package/data/sampleDataFolder/qylog/2026/02/15/08/stderr.txt +0 -11
  57. package/data/sampleDataFolder/qylog/2026/02/15/08/stdout.txt +0 -36
@@ -1,11 +1,13 @@
1
1
  import {
2
- h as o
2
+ h as d
3
3
  } from "./hscrpt.js";
4
4
 
5
5
  import "./explore-tree.js";
6
6
 
7
7
  import "./query-editor.js";
8
8
 
9
+ import "./trigger-editor.js";
10
+
9
11
  let l = {
10
12
  brandName: "datafolder UI",
11
13
  tabNames: [ "Explore", "Query", "RPC", "Triggers" ]
@@ -20,45 +22,46 @@ customElements.define("main-page", class extends HTMLElement {
20
22
  brandName: e,
21
23
  tabNames: t
22
24
  } = l;
23
- this.append(o("nav", {
25
+ this.append(d("nav", {
24
26
  classList: "navbar bg-body-tertiary"
25
- }, [ ((e, t, a) => o("div", {
27
+ }, [ ((e, t, a) => d("div", {
26
28
  classList: "container-fluid"
27
- }, [ (e => o("a", {
29
+ }, [ (e => d("a", {
28
30
  classList: "navbar-brand"
29
- }, [ e ]))(t), ((e, t) => o("ul", {
31
+ }, [ e ]))(t), ((e, t) => d("ul", {
30
32
  classList: "nav nav-pills me-auto mb-2 mb-lg-0"
31
- }, e.tabButtons = t.map(e => o("button", {
33
+ }, e.tabButtons = t.map(e => d("button", {
32
34
  classList: "nav-link",
33
35
  id: `pills-${e}-tab`,
34
36
  "data-bs-toggle": "pill",
35
37
  "data-bs-target": "#pills-" + e,
36
38
  type: "button",
37
39
  role: "tab"
38
- }, [ e ]))))(e, a) ]))(this, e, t) ]), o("div", {
40
+ }, [ e ]))))(e, a) ]))(this, e, t) ]), d("div", {
39
41
  classList: "tab-content",
40
42
  id: "pills-tabContent"
41
- }, this.tabDivs = t.map(e => o("div", {
43
+ }, this.tabDivs = t.map(e => d("div", {
42
44
  classList: "tab-pane",
43
45
  id: "pills-" + e,
44
46
  role: "tabpanel"
45
47
  }))));
46
48
  let {
47
49
  tabButtons: [ a, s ],
48
- tabDivs: [ n, i ]
50
+ tabDivs: [ i, n, , r ]
49
51
  } = this;
50
52
  bootstrap.Tab.getOrCreateInstance(a).show();
51
- e = o("explore-tree");
52
- n.appendChild(e);
53
- let r = o("query-editor");
54
- i.appendChild(r), Object.assign(this, {
53
+ e = d("explore-tree");
54
+ i.appendChild(e);
55
+ let o = d("query-editor");
56
+ n.appendChild(o);
57
+ t = d("trigger-editor"), r.append(t), Object.assign(this, {
55
58
  exploreTree: e,
56
- queryEditor: r
57
- }), r.addEventListener("run", () => s.click());
58
- t = () => this.onSizeChange();
59
- document.addEventListener("DOMContentLoaded", t), window.addEventListener("resize", t),
59
+ queryEditor: o,
60
+ triggerEditor: t
61
+ }), o.addEventListener("run", () => s.click()), e = () => this.onSizeChange();
62
+ document.addEventListener("DOMContentLoaded", e), window.addEventListener("resize", e),
60
63
  s.addEventListener("shown.bs.tab", () => {
61
- r.onSizeChange();
64
+ o.onSizeChange();
62
65
  });
63
66
  }
64
67
  onSizeChange() {
@@ -68,7 +71,7 @@ customElements.define("main-page", class extends HTMLElement {
68
71
  } = this;
69
72
  e.onSizeChange(), t.onSizeChange();
70
73
  }
71
- }), document.body.append(o("main-page"));
74
+ }), document.body.append(d("main-page"));
72
75
 
73
76
  import {
74
77
  rpc as e
@@ -139,7 +139,7 @@ customElements.define("query-editor", class extends HTMLElement {
139
139
  r && Object.assign(e, JSON.parse(r)), Object.assign(t, {
140
140
  queryFunctions: e,
141
141
  queryId: 0,
142
- funName: "getFlightsByDate",
142
+ funName: "getHotels",
143
143
  dropdownItemMap: {}
144
144
  }), this.append(n("div", {
145
145
  classList: "btn-toolbar",
@@ -0,0 +1,30 @@
1
+ import {
2
+ h as e
3
+ } from "./hscrpt.js";
4
+
5
+ import {
6
+ rpc as t
7
+ } from "./QyUIUtils.js";
8
+
9
+ import "./display-tree.js";
10
+
11
+ customElements.define("trigger-editor", class extends HTMLElement {
12
+ constructor() {
13
+ super();
14
+ }
15
+ compose() {
16
+ this.append(e("div", [ this.displayTree = e("display-tree", {
17
+ isTriggerEditor: !0
18
+ }) ])), (async e => {
19
+ var s, i, r;
20
+ e.isShowing || (e.isShowing = !0, {
21
+ tree: s,
22
+ count: i,
23
+ error: r
24
+ } = await t("getTriggerFiles"), e = e.displayTree, r ? e.showMsg(r) : e.showTree(s, i));
25
+ })(this);
26
+ }
27
+ onSizeChange() {
28
+ this.displayTree.onSizeChange();
29
+ }
30
+ });
@@ -1 +0,0 @@
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 ..."}}
@@ -1 +0,0 @@
1
- �){"M":{"c7_c5SOWlEi":{"feedbackScore":7}}}
@@ -1 +0,0 @@
1
- �C{"M":{"c7_c5SOWlEi":{"feedbackScore":6,"address":{"zipcode":678}}}}
@@ -1 +0,0 @@
1
- �){"M":{"c7_c5SOWlEi":{"feedbackScore":7}}}
@@ -1,10 +0,0 @@
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"]
@@ -1 +0,0 @@
1
- {"userid":"user_0001","email":"a@b.com","feedbackScore":7,"address":{"city":"a","zipcode":678}}
@@ -1 +0,0 @@
1
- {"userid":"user_0001","email":"a@b.com","feedbackScore":6,"address":{"city":"a","zipcode":678}}
@@ -1 +0,0 @@
1
- {"userid":"user_0001","email":"a@b.com","feedbackScore":7,"address":{"city":"a","zipcode":678}}
@@ -1,9 +0,0 @@
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"]
@@ -1,55 +0,0 @@
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"]
@@ -1 +0,0 @@
1
- {"maxChangeId":4,"pMVersion":1,"vLVersion":1,"totalCount":10,"outdatedCount":0,"outdated":"0%"}
@@ -1 +0,0 @@
1
- {"maxChangeId":5,"pMVersion":1,"vLVersion":1,"totalCount":1,"outdatedCount":0,"outdated":"0%"}
@@ -1 +0,0 @@
1
- {"maxChangeId":7,"pMVersion":1,"vLVersion":1,"totalCount":1,"outdatedCount":0,"outdated":"0%"}
@@ -1 +0,0 @@
1
- {"maxChangeId":8,"pMVersion":1,"vLVersion":1,"totalCount":1,"outdatedCount":0,"outdated":"0%"}
@@ -1 +0,0 @@
1
- {"maxChangeId":13,"pMVersion":1,"vLVersion":1,"totalCount":8,"outdatedCount":0,"outdated":"0%"}
@@ -1,58 +0,0 @@
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 = () => {};"
@@ -1,11 +0,0 @@
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
- }
@@ -1,36 +0,0 @@
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...