wangzhibo
2023-10-31 86070cd00485c47a2c5c3ffa4a9bae6648dd05c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/pages/Overview.tsx");import { template as _$template } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { createComponent as _$createComponent } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { memo as _$memo } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { insert as _$insert } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { $$component as _$$component } from "/@solid-refresh";
import { $$refresh as _$$refresh } from "/@solid-refresh";
import { $$registry as _$$registry } from "/@solid-refresh";
const _REGISTRY = _$$registry();
const _tmpl$ = /*#__PURE__*/_$template(`<div class="stat flex-1 place-items-center"><div class="stat-title text-primary-content"></div><div class="stat-value text-2xl text-primary-content lg:text-3xl">`),
  _tmpl$2 = /*#__PURE__*/_$template(`<div class="flex flex-col gap-2"><div class="stats stats-vertical w-full grid-cols-2 bg-primary shadow lg:stats-horizontal lg:flex"></div><div class="rounded-box flex flex-col gap-2 bg-base-300 py-4 lg:flex-row"><div class=flex-1></div><div class=flex-1>`);
import { makeTimer } from "/node_modules/.vite/deps/@solid-primitives_timer.js?v=50652594";
import byteSize from "/node_modules/.vite/deps/byte-size.js?v=b5a96bd7";
import __vite__cjsImport9_lodash from "/node_modules/.vite/deps/lodash.js?v=dbaf0206"; const merge = __vite__cjsImport9_lodash["merge"];
import { SolidApexCharts } from "/node_modules/solid-apexcharts/dist/dev.jsx";
import { batch, children, createEffect, createMemo, createSignal } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
import { CHART_MAX_XAXIS, DEFAULT_CHART_OPTIONS } from "/src/constants/index.ts";
import { useI18n } from "/src/i18n/index.tsx";
import { latestConnectionMsg, useWsRequest } from "/src/signals/index.ts";
const TrafficWidget = _$$component(_REGISTRY, "TrafficWidget", props => (() => {
  const _el$ = _tmpl$(),
    _el$2 = _el$.firstChild,
    _el$3 = _el$2.nextSibling;
  _$insert(_el$2, () => props.label);
  _$insert(_el$3, children(() => props.children));
  return _el$;
})(), {
  location: "src\\pages\\Overview.tsx:19:63"
});
export default (() => {
  const [t] = useI18n();
  const [traffics, setTraffics] = createSignal([]);
  const [memories, setMemories] = createSignal([]);
 
  // https://github.com/apexcharts/apexcharts.js/blob/main/samples/source/line/realtime.xml
  // TODO: needs a better way
  makeTimer(() => {
    batch(() => {
      setTraffics(traffics => traffics.slice(-CHART_MAX_XAXIS));
      setMemories(memo => memo.slice(-CHART_MAX_XAXIS));
    });
  },
  // we shrink the chart data array size down every minute to prevent memory leaks
  60 * 1000, setInterval);
  const traffic = useWsRequest('traffic');
  createEffect(() => {
    const t = traffic();
    if (t) setTraffics(traffics => [...traffics, t]);
  });
  const trafficChartOptions = createMemo(() => merge({
    title: {
      text: t('traffic')
    }
  }, DEFAULT_CHART_OPTIONS));
  const trafficChartSeries = createMemo(() => [{
    name: t('down'),
    data: traffics().map(t => t.down)
  }, {
    name: t('up'),
    data: traffics().map(t => t.up)
  }]);
  const memory = useWsRequest('memory');
  createEffect(() => {
    const m = memory()?.inuse;
    if (m) setMemories(memories => [...memories, m]);
  });
  const memoryChartOptions = createMemo(() => merge({
    title: {
      text: t('memory')
    }
  }, DEFAULT_CHART_OPTIONS));
  const memoryChartSeries = createMemo(() => [{
    name: t('memory'),
    data: memories()
  }]);
  return (() => {
    const _el$4 = _tmpl$2(),
      _el$5 = _el$4.firstChild,
      _el$6 = _el$5.nextSibling,
      _el$7 = _el$6.firstChild,
      _el$8 = _el$7.nextSibling;
    _$insert(_el$5, _$createComponent(TrafficWidget, {
      get label() {
        return t('upload');
      },
      get children() {
        return [_$memo(() => byteSize(traffic()?.up || 0).toString()), "/s"];
      }
    }), null);
    _$insert(_el$5, _$createComponent(TrafficWidget, {
      get label() {
        return t('download');
      },
      get children() {
        return [_$memo(() => byteSize(traffic()?.down || 0).toString()), "/s"];
      }
    }), null);
    _$insert(_el$5, _$createComponent(TrafficWidget, {
      get label() {
        return t('uploadTotal');
      },
      get children() {
        return byteSize(latestConnectionMsg()?.uploadTotal || 0).toString();
      }
    }), null);
    _$insert(_el$5, _$createComponent(TrafficWidget, {
      get label() {
        return t('downloadTotal');
      },
      get children() {
        return byteSize(latestConnectionMsg()?.downloadTotal || 0).toString();
      }
    }), null);
    _$insert(_el$5, _$createComponent(TrafficWidget, {
      get label() {
        return t('activeConnections');
      },
      get children() {
        return latestConnectionMsg()?.connections?.length || 0;
      }
    }), null);
    _$insert(_el$5, _$createComponent(TrafficWidget, {
      get label() {
        return t('memoryUsage');
      },
      get children() {
        return byteSize(memory()?.inuse || 0).toString();
      }
    }), null);
    _$insert(_el$7, _$createComponent(SolidApexCharts, {
      type: "area",
      get options() {
        return trafficChartOptions();
      },
      get series() {
        return trafficChartSeries();
      }
    }));
    _$insert(_el$8, _$createComponent(SolidApexCharts, {
      type: "line",
      get options() {
        return memoryChartOptions();
      },
      get series() {
        return memoryChartSeries();
      }
    }));
    return _el$4;
  })();
});
if (import.meta.hot) {
  _$$refresh("vite", import.meta.hot, _REGISTRY);
  import.meta.hot.accept();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYWtlVGltZXIiLCJieXRlU2l6ZSIsIm1lcmdlIiwiU29saWRBcGV4Q2hhcnRzIiwiYmF0Y2giLCJjaGlsZHJlbiIsImNyZWF0ZUVmZmVjdCIsImNyZWF0ZU1lbW8iLCJjcmVhdGVTaWduYWwiLCJDSEFSVF9NQVhfWEFYSVMiLCJERUZBVUxUX0NIQVJUX09QVElPTlMiLCJ1c2VJMThuIiwibGF0ZXN0Q29ubmVjdGlvbk1zZyIsInVzZVdzUmVxdWVzdCIsIlRyYWZmaWNXaWRnZXQiLCJfJCRjb21wb25lbnQiLCJfUkVHSVNUUlkiLCJwcm9wcyIsIl9lbCQiLCJfdG1wbCQiLCJfZWwkMiIsImZpcnN0Q2hpbGQiLCJfZWwkMyIsIm5leHRTaWJsaW5nIiwiXyRpbnNlcnQiLCJsYWJlbCIsImxvY2F0aW9uIiwidCIsInRyYWZmaWNzIiwic2V0VHJhZmZpY3MiLCJtZW1vcmllcyIsInNldE1lbW9yaWVzIiwic2xpY2UiLCJtZW1vIiwic2V0SW50ZXJ2YWwiLCJ0cmFmZmljIiwidHJhZmZpY0NoYXJ0T3B0aW9ucyIsInRpdGxlIiwidGV4dCIsInRyYWZmaWNDaGFydFNlcmllcyIsIm5hbWUiLCJkYXRhIiwibWFwIiwiZG93biIsInVwIiwibWVtb3J5IiwibSIsImludXNlIiwibWVtb3J5Q2hhcnRPcHRpb25zIiwibWVtb3J5Q2hhcnRTZXJpZXMiLCJfZWwkNCIsIl90bXBsJDIiLCJfZWwkNSIsIl9lbCQ2IiwiX2VsJDciLCJfZWwkOCIsIl8kY3JlYXRlQ29tcG9uZW50IiwiXyRtZW1vIiwidG9TdHJpbmciLCJ1cGxvYWRUb3RhbCIsImRvd25sb2FkVG90YWwiLCJjb25uZWN0aW9ucyIsImxlbmd0aCIsInR5cGUiLCJvcHRpb25zIiwic2VyaWVzIiwiaW1wb3J0IiwibWV0YSIsImhvdCIsIl8kJHJlZnJlc2giLCJhY2NlcHQiXSwic291cmNlcyI6WyJPdmVydmlldy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWFrZVRpbWVyIH0gZnJvbSAnQHNvbGlkLXByaW1pdGl2ZXMvdGltZXInXHJcbmltcG9ydCB0eXBlIHsgQXBleE9wdGlvbnMgfSBmcm9tICdhcGV4Y2hhcnRzJ1xyXG5pbXBvcnQgYnl0ZVNpemUgZnJvbSAnYnl0ZS1zaXplJ1xyXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgU29saWRBcGV4Q2hhcnRzIH0gZnJvbSAnc29saWQtYXBleGNoYXJ0cydcclxuaW1wb3J0IHtcclxuICBKU1gsXHJcbiAgUGFyZW50Q29tcG9uZW50LFxyXG4gIGJhdGNoLFxyXG4gIGNoaWxkcmVuLFxyXG4gIGNyZWF0ZUVmZmVjdCxcclxuICBjcmVhdGVNZW1vLFxyXG4gIGNyZWF0ZVNpZ25hbCxcclxufSBmcm9tICdzb2xpZC1qcydcclxuaW1wb3J0IHsgQ0hBUlRfTUFYX1hBWElTLCBERUZBVUxUX0NIQVJUX09QVElPTlMgfSBmcm9tICd+L2NvbnN0YW50cydcclxuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gJ34vaTE4bidcclxuaW1wb3J0IHsgbGF0ZXN0Q29ubmVjdGlvbk1zZywgdXNlV3NSZXF1ZXN0IH0gZnJvbSAnfi9zaWduYWxzJ1xyXG5cclxuY29uc3QgVHJhZmZpY1dpZGdldDogUGFyZW50Q29tcG9uZW50PHsgbGFiZWw6IEpTWC5FbGVtZW50IH0+ID0gKHByb3BzKSA9PiAoXHJcbiAgPGRpdiBjbGFzcz1cInN0YXQgZmxleC0xIHBsYWNlLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInN0YXQtdGl0bGUgdGV4dC1wcmltYXJ5LWNvbnRlbnRcIj57cHJvcHMubGFiZWx9PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3RhdC12YWx1ZSB0ZXh0LTJ4bCB0ZXh0LXByaW1hcnktY29udGVudCBsZzp0ZXh0LTN4bFwiPlxyXG4gICAgICB7Y2hpbGRyZW4oKCkgPT4gcHJvcHMuY2hpbGRyZW4pKCl9XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuKVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xyXG4gIGNvbnN0IFt0XSA9IHVzZUkxOG4oKVxyXG5cclxuICBjb25zdCBbdHJhZmZpY3MsIHNldFRyYWZmaWNzXSA9IGNyZWF0ZVNpZ25hbDx7IGRvd246IG51bWJlcjsgdXA6IG51bWJlciB9W10+KFxyXG4gICAgW10sXHJcbiAgKVxyXG4gIGNvbnN0IFttZW1vcmllcywgc2V0TWVtb3JpZXNdID0gY3JlYXRlU2lnbmFsPG51bWJlcltdPihbXSlcclxuXHJcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwZXhjaGFydHMvYXBleGNoYXJ0cy5qcy9ibG9iL21haW4vc2FtcGxlcy9zb3VyY2UvbGluZS9yZWFsdGltZS54bWxcclxuICAvLyBUT0RPOiBuZWVkcyBhIGJldHRlciB3YXlcclxuICBtYWtlVGltZXIoXHJcbiAgICAoKSA9PiB7XHJcbiAgICAgIGJhdGNoKCgpID0+IHtcclxuICAgICAgICBzZXRUcmFmZmljcygodHJhZmZpY3MpID0+IHRyYWZmaWNzLnNsaWNlKC1DSEFSVF9NQVhfWEFYSVMpKVxyXG4gICAgICAgIHNldE1lbW9yaWVzKChtZW1vKSA9PiBtZW1vLnNsaWNlKC1DSEFSVF9NQVhfWEFYSVMpKVxyXG4gICAgICB9KVxyXG4gICAgfSxcclxuICAgIC8vIHdlIHNocmluayB0aGUgY2hhcnQgZGF0YSBhcnJheSBzaXplIGRvd24gZXZlcnkgbWludXRlIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXHJcbiAgICA2MCAqIDEwMDAsXHJcbiAgICBzZXRJbnRlcnZhbCxcclxuICApXHJcblxyXG4gIGNvbnN0IHRyYWZmaWMgPSB1c2VXc1JlcXVlc3Q8eyBkb3duOiBudW1iZXI7IHVwOiBudW1iZXIgfT4oJ3RyYWZmaWMnKVxyXG5cclxuICBjcmVhdGVFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgdCA9IHRyYWZmaWMoKVxyXG5cclxuICAgIGlmICh0KSBzZXRUcmFmZmljcygodHJhZmZpY3MpID0+IFsuLi50cmFmZmljcywgdF0pXHJcbiAgfSlcclxuXHJcbiAgY29uc3QgdHJhZmZpY0NoYXJ0T3B0aW9ucyA9IGNyZWF0ZU1lbW88QXBleE9wdGlvbnM+KCgpID0+XHJcbiAgICBtZXJnZSh7IHRpdGxlOiB7IHRleHQ6IHQoJ3RyYWZmaWMnKSB9IH0sIERFRkFVTFRfQ0hBUlRfT1BUSU9OUyksXHJcbiAgKVxyXG5cclxuICBjb25zdCB0cmFmZmljQ2hhcnRTZXJpZXMgPSBjcmVhdGVNZW1vKCgpID0+IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogdCgnZG93bicpLFxyXG4gICAgICBkYXRhOiB0cmFmZmljcygpLm1hcCgodCkgPT4gdC5kb3duKSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6IHQoJ3VwJyksXHJcbiAgICAgIGRhdGE6IHRyYWZmaWNzKCkubWFwKCh0KSA9PiB0LnVwKSxcclxuICAgIH0sXHJcbiAgXSlcclxuXHJcbiAgY29uc3QgbWVtb3J5ID0gdXNlV3NSZXF1ZXN0PHsgaW51c2U6IG51bWJlciB9PignbWVtb3J5JylcclxuXHJcbiAgY3JlYXRlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IG0gPSBtZW1vcnkoKT8uaW51c2VcclxuXHJcbiAgICBpZiAobSkgc2V0TWVtb3JpZXMoKG1lbW9yaWVzKSA9PiBbLi4ubWVtb3JpZXMsIG1dKVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IG1lbW9yeUNoYXJ0T3B0aW9ucyA9IGNyZWF0ZU1lbW88QXBleE9wdGlvbnM+KCgpID0+XHJcbiAgICBtZXJnZSh7IHRpdGxlOiB7IHRleHQ6IHQoJ21lbW9yeScpIH0gfSwgREVGQVVMVF9DSEFSVF9PUFRJT05TKSxcclxuICApXHJcblxyXG4gIGNvbnN0IG1lbW9yeUNoYXJ0U2VyaWVzID0gY3JlYXRlTWVtbygoKSA9PiBbXHJcbiAgICB7IG5hbWU6IHQoJ21lbW9yeScpLCBkYXRhOiBtZW1vcmllcygpIH0sXHJcbiAgXSlcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0cyBzdGF0cy12ZXJ0aWNhbCB3LWZ1bGwgZ3JpZC1jb2xzLTIgYmctcHJpbWFyeSBzaGFkb3cgbGc6c3RhdHMtaG9yaXpvbnRhbCBsZzpmbGV4XCI+XHJcbiAgICAgICAgPFRyYWZmaWNXaWRnZXQgbGFiZWw9e3QoJ3VwbG9hZCcpfT5cclxuICAgICAgICAgIHtieXRlU2l6ZSh0cmFmZmljKCk/LnVwIHx8IDApLnRvU3RyaW5nKCl9L3NcclxuICAgICAgICA8L1RyYWZmaWNXaWRnZXQ+XHJcblxyXG4gICAgICAgIDxUcmFmZmljV2lkZ2V0IGxhYmVsPXt0KCdkb3dubG9hZCcpfT5cclxuICAgICAgICAgIHtieXRlU2l6ZSh0cmFmZmljKCk/LmRvd24gfHwgMCkudG9TdHJpbmcoKX0vc1xyXG4gICAgICAgIDwvVHJhZmZpY1dpZGdldD5cclxuXHJcbiAgICAgICAgPFRyYWZmaWNXaWRnZXQgbGFiZWw9e3QoJ3VwbG9hZFRvdGFsJyl9PlxyXG4gICAgICAgICAge2J5dGVTaXplKGxhdGVzdENvbm5lY3Rpb25Nc2coKT8udXBsb2FkVG90YWwgfHwgMCkudG9TdHJpbmcoKX1cclxuICAgICAgICA8L1RyYWZmaWNXaWRnZXQ+XHJcblxyXG4gICAgICAgIDxUcmFmZmljV2lkZ2V0IGxhYmVsPXt0KCdkb3dubG9hZFRvdGFsJyl9PlxyXG4gICAgICAgICAge2J5dGVTaXplKGxhdGVzdENvbm5lY3Rpb25Nc2coKT8uZG93bmxvYWRUb3RhbCB8fCAwKS50b1N0cmluZygpfVxyXG4gICAgICAgIDwvVHJhZmZpY1dpZGdldD5cclxuXHJcbiAgICAgICAgPFRyYWZmaWNXaWRnZXQgbGFiZWw9e3QoJ2FjdGl2ZUNvbm5lY3Rpb25zJyl9PlxyXG4gICAgICAgICAge2xhdGVzdENvbm5lY3Rpb25Nc2coKT8uY29ubmVjdGlvbnM/Lmxlbmd0aCB8fCAwfVxyXG4gICAgICAgIDwvVHJhZmZpY1dpZGdldD5cclxuXHJcbiAgICAgICAgPFRyYWZmaWNXaWRnZXQgbGFiZWw9e3QoJ21lbW9yeVVzYWdlJyl9PlxyXG4gICAgICAgICAge2J5dGVTaXplKG1lbW9yeSgpPy5pbnVzZSB8fCAwKS50b1N0cmluZygpfVxyXG4gICAgICAgIDwvVHJhZmZpY1dpZGdldD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm91bmRlZC1ib3ggZmxleCBmbGV4LWNvbCBnYXAtMiBiZy1iYXNlLTMwMCBweS00IGxnOmZsZXgtcm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxyXG4gICAgICAgICAgPFNvbGlkQXBleENoYXJ0c1xyXG4gICAgICAgICAgICB0eXBlPVwiYXJlYVwiXHJcbiAgICAgICAgICAgIG9wdGlvbnM9e3RyYWZmaWNDaGFydE9wdGlvbnMoKX1cclxuICAgICAgICAgICAgc2VyaWVzPXt0cmFmZmljQ2hhcnRTZXJpZXMoKX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxyXG4gICAgICAgICAgPFNvbGlkQXBleENoYXJ0c1xyXG4gICAgICAgICAgICB0eXBlPVwibGluZVwiXHJcbiAgICAgICAgICAgIG9wdGlvbnM9e21lbW9yeUNoYXJ0T3B0aW9ucygpfVxyXG4gICAgICAgICAgICBzZXJpZXM9e21lbW9yeUNoYXJ0U2VyaWVzKCl9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIClcclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxTQUFTQSxTQUFTLFFBQVEseUJBQXlCO0FBRW5ELE9BQU9DLFFBQVEsTUFBTSxXQUFXO0FBQ2hDLFNBQVNDLEtBQUssUUFBUSxRQUFRO0FBQzlCLFNBQVNDLGVBQWUsUUFBUSxrQkFBa0I7QUFDbEQsU0FHRUMsS0FBSyxFQUNMQyxRQUFRLEVBQ1JDLFlBQVksRUFDWkMsVUFBVSxFQUNWQyxZQUFZLFFBQ1AsVUFBVTtBQUNqQixTQUFTQyxlQUFlLEVBQUVDLHFC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