@serve.zone/dcrouter 11.13.0 → 11.14.0

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 (201) hide show
  1. package/dist_serve/bundle.js +2 -2
  2. package/package.json +1 -1
  3. package/readme.md +107 -3
  4. package/ts/00_commitinfo_data.ts +1 -1
  5. package/ts_web/00_commitinfo_data.ts +1 -1
  6. package/ts_web/readme.md +17 -0
  7. package/ts_web/router.ts +1 -1
  8. package/dist_ts/00_commitinfo_data.d.ts +0 -8
  9. package/dist_ts/00_commitinfo_data.js +0 -9
  10. package/dist_ts/cache/classes.cache.cleaner.d.ts +0 -47
  11. package/dist_ts/cache/classes.cache.cleaner.js +0 -130
  12. package/dist_ts/cache/classes.cached.document.d.ts +0 -76
  13. package/dist_ts/cache/classes.cached.document.js +0 -100
  14. package/dist_ts/cache/classes.cachedb.d.ts +0 -60
  15. package/dist_ts/cache/classes.cachedb.js +0 -126
  16. package/dist_ts/cache/documents/classes.cached.email.d.ts +0 -125
  17. package/dist_ts/cache/documents/classes.cached.email.js +0 -337
  18. package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +0 -119
  19. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +0 -323
  20. package/dist_ts/cache/documents/index.d.ts +0 -2
  21. package/dist_ts/cache/documents/index.js +0 -3
  22. package/dist_ts/cache/index.d.ts +0 -4
  23. package/dist_ts/cache/index.js +0 -7
  24. package/dist_ts/classes.cert-provision-scheduler.d.ts +0 -54
  25. package/dist_ts/classes.cert-provision-scheduler.js +0 -118
  26. package/dist_ts/classes.dcrouter.d.ts +0 -386
  27. package/dist_ts/classes.dcrouter.js +0 -1682
  28. package/dist_ts/classes.storage-cert-manager.d.ts +0 -18
  29. package/dist_ts/classes.storage-cert-manager.js +0 -43
  30. package/dist_ts/config/classes.api-token-manager.d.ts +0 -46
  31. package/dist_ts/config/classes.api-token-manager.js +0 -150
  32. package/dist_ts/config/classes.route-config-manager.d.ts +0 -38
  33. package/dist_ts/config/classes.route-config-manager.js +0 -256
  34. package/dist_ts/config/index.d.ts +0 -3
  35. package/dist_ts/config/index.js +0 -5
  36. package/dist_ts/config/validator.d.ts +0 -104
  37. package/dist_ts/config/validator.js +0 -152
  38. package/dist_ts/errors/base.errors.d.ts +0 -224
  39. package/dist_ts/errors/base.errors.js +0 -320
  40. package/dist_ts/errors/error-handler.d.ts +0 -98
  41. package/dist_ts/errors/error-handler.js +0 -282
  42. package/dist_ts/errors/error.codes.d.ts +0 -115
  43. package/dist_ts/errors/error.codes.js +0 -136
  44. package/dist_ts/errors/index.d.ts +0 -54
  45. package/dist_ts/errors/index.js +0 -136
  46. package/dist_ts/errors/reputation.errors.d.ts +0 -183
  47. package/dist_ts/errors/reputation.errors.js +0 -292
  48. package/dist_ts/http3/http3-route-augmentation.d.ts +0 -50
  49. package/dist_ts/http3/http3-route-augmentation.js +0 -98
  50. package/dist_ts/http3/index.d.ts +0 -1
  51. package/dist_ts/http3/index.js +0 -2
  52. package/dist_ts/index.d.ts +0 -8
  53. package/dist_ts/index.js +0 -29
  54. package/dist_ts/logger.d.ts +0 -21
  55. package/dist_ts/logger.js +0 -81
  56. package/dist_ts/monitoring/classes.metricscache.d.ts +0 -32
  57. package/dist_ts/monitoring/classes.metricscache.js +0 -63
  58. package/dist_ts/monitoring/classes.metricsmanager.d.ts +0 -184
  59. package/dist_ts/monitoring/classes.metricsmanager.js +0 -744
  60. package/dist_ts/monitoring/index.d.ts +0 -1
  61. package/dist_ts/monitoring/index.js +0 -2
  62. package/dist_ts/opsserver/classes.opsserver.d.ts +0 -38
  63. package/dist_ts/opsserver/classes.opsserver.js +0 -87
  64. package/dist_ts/opsserver/handlers/admin.handler.d.ts +0 -31
  65. package/dist_ts/opsserver/handlers/admin.handler.js +0 -180
  66. package/dist_ts/opsserver/handlers/api-token.handler.d.ts +0 -6
  67. package/dist_ts/opsserver/handlers/api-token.handler.js +0 -62
  68. package/dist_ts/opsserver/handlers/certificate.handler.d.ts +0 -32
  69. package/dist_ts/opsserver/handlers/certificate.handler.js +0 -421
  70. package/dist_ts/opsserver/handlers/config.handler.d.ts +0 -7
  71. package/dist_ts/opsserver/handlers/config.handler.js +0 -192
  72. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +0 -30
  73. package/dist_ts/opsserver/handlers/email-ops.handler.js +0 -227
  74. package/dist_ts/opsserver/handlers/index.d.ts +0 -12
  75. package/dist_ts/opsserver/handlers/index.js +0 -13
  76. package/dist_ts/opsserver/handlers/logs.handler.d.ts +0 -25
  77. package/dist_ts/opsserver/handlers/logs.handler.js +0 -256
  78. package/dist_ts/opsserver/handlers/radius.handler.d.ts +0 -6
  79. package/dist_ts/opsserver/handlers/radius.handler.js +0 -295
  80. package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +0 -6
  81. package/dist_ts/opsserver/handlers/remoteingress.handler.js +0 -156
  82. package/dist_ts/opsserver/handlers/route-management.handler.d.ts +0 -14
  83. package/dist_ts/opsserver/handlers/route-management.handler.js +0 -117
  84. package/dist_ts/opsserver/handlers/security.handler.d.ts +0 -9
  85. package/dist_ts/opsserver/handlers/security.handler.js +0 -233
  86. package/dist_ts/opsserver/handlers/stats.handler.d.ts +0 -11
  87. package/dist_ts/opsserver/handlers/stats.handler.js +0 -403
  88. package/dist_ts/opsserver/handlers/vpn.handler.d.ts +0 -6
  89. package/dist_ts/opsserver/handlers/vpn.handler.js +0 -199
  90. package/dist_ts/opsserver/helpers/guards.d.ts +0 -27
  91. package/dist_ts/opsserver/helpers/guards.js +0 -43
  92. package/dist_ts/opsserver/index.d.ts +0 -1
  93. package/dist_ts/opsserver/index.js +0 -2
  94. package/dist_ts/paths.d.ts +0 -26
  95. package/dist_ts/paths.js +0 -45
  96. package/dist_ts/plugins.d.ts +0 -81
  97. package/dist_ts/plugins.js +0 -115
  98. package/dist_ts/radius/classes.accounting.manager.d.ts +0 -231
  99. package/dist_ts/radius/classes.accounting.manager.js +0 -462
  100. package/dist_ts/radius/classes.radius.server.d.ts +0 -171
  101. package/dist_ts/radius/classes.radius.server.js +0 -386
  102. package/dist_ts/radius/classes.vlan.manager.d.ts +0 -128
  103. package/dist_ts/radius/classes.vlan.manager.js +0 -279
  104. package/dist_ts/radius/index.d.ts +0 -13
  105. package/dist_ts/radius/index.js +0 -14
  106. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +0 -94
  107. package/dist_ts/remoteingress/classes.remoteingress-manager.js +0 -271
  108. package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +0 -59
  109. package/dist_ts/remoteingress/classes.tunnel-manager.js +0 -165
  110. package/dist_ts/remoteingress/index.d.ts +0 -2
  111. package/dist_ts/remoteingress/index.js +0 -3
  112. package/dist_ts/security/classes.contentscanner.d.ts +0 -164
  113. package/dist_ts/security/classes.contentscanner.js +0 -642
  114. package/dist_ts/security/classes.ipreputationchecker.d.ts +0 -160
  115. package/dist_ts/security/classes.ipreputationchecker.js +0 -537
  116. package/dist_ts/security/classes.securitylogger.d.ts +0 -144
  117. package/dist_ts/security/classes.securitylogger.js +0 -235
  118. package/dist_ts/security/index.d.ts +0 -3
  119. package/dist_ts/security/index.js +0 -4
  120. package/dist_ts/sms/classes.smsservice.d.ts +0 -15
  121. package/dist_ts/sms/classes.smsservice.js +0 -72
  122. package/dist_ts/sms/config/sms.config.d.ts +0 -93
  123. package/dist_ts/sms/config/sms.config.js +0 -2
  124. package/dist_ts/sms/config/sms.schema.d.ts +0 -5
  125. package/dist_ts/sms/config/sms.schema.js +0 -121
  126. package/dist_ts/sms/index.d.ts +0 -1
  127. package/dist_ts/sms/index.js +0 -2
  128. package/dist_ts/storage/classes.storagemanager.d.ts +0 -83
  129. package/dist_ts/storage/classes.storagemanager.js +0 -348
  130. package/dist_ts/storage/index.d.ts +0 -1
  131. package/dist_ts/storage/index.js +0 -3
  132. package/dist_ts/vpn/classes.vpn-manager.d.ts +0 -113
  133. package/dist_ts/vpn/classes.vpn-manager.js +0 -297
  134. package/dist_ts/vpn/index.d.ts +0 -1
  135. package/dist_ts/vpn/index.js +0 -2
  136. package/dist_ts_apiclient/classes.apitoken.d.ts +0 -41
  137. package/dist_ts_apiclient/classes.apitoken.js +0 -115
  138. package/dist_ts_apiclient/classes.certificate.d.ts +0 -57
  139. package/dist_ts_apiclient/classes.certificate.js +0 -69
  140. package/dist_ts_apiclient/classes.config.d.ts +0 -7
  141. package/dist_ts_apiclient/classes.config.js +0 -11
  142. package/dist_ts_apiclient/classes.dcrouterapiclient.d.ts +0 -41
  143. package/dist_ts_apiclient/classes.dcrouterapiclient.js +0 -81
  144. package/dist_ts_apiclient/classes.email.d.ts +0 -30
  145. package/dist_ts_apiclient/classes.email.js +0 -52
  146. package/dist_ts_apiclient/classes.logs.d.ts +0 -21
  147. package/dist_ts_apiclient/classes.logs.js +0 -14
  148. package/dist_ts_apiclient/classes.radius.d.ts +0 -59
  149. package/dist_ts_apiclient/classes.radius.js +0 -95
  150. package/dist_ts_apiclient/classes.remoteingress.d.ts +0 -54
  151. package/dist_ts_apiclient/classes.remoteingress.js +0 -136
  152. package/dist_ts_apiclient/classes.route.d.ts +0 -42
  153. package/dist_ts_apiclient/classes.route.js +0 -154
  154. package/dist_ts_apiclient/classes.stats.d.ts +0 -47
  155. package/dist_ts_apiclient/classes.stats.js +0 -38
  156. package/dist_ts_apiclient/index.d.ts +0 -10
  157. package/dist_ts_apiclient/index.js +0 -14
  158. package/dist_ts_apiclient/plugins.d.ts +0 -3
  159. package/dist_ts_apiclient/plugins.js +0 -5
  160. package/dist_ts_web/00_commitinfo_data.d.ts +0 -8
  161. package/dist_ts_web/00_commitinfo_data.js +0 -9
  162. package/dist_ts_web/appstate.d.ts +0 -238
  163. package/dist_ts_web/appstate.js +0 -1174
  164. package/dist_ts_web/elements/index.d.ts +0 -13
  165. package/dist_ts_web/elements/index.js +0 -14
  166. package/dist_ts_web/elements/ops-dashboard.d.ts +0 -23
  167. package/dist_ts_web/elements/ops-dashboard.js +0 -323
  168. package/dist_ts_web/elements/ops-view-apitokens.d.ts +0 -13
  169. package/dist_ts_web/elements/ops-view-apitokens.js +0 -371
  170. package/dist_ts_web/elements/ops-view-certificates.d.ts +0 -22
  171. package/dist_ts_web/elements/ops-view-certificates.js +0 -528
  172. package/dist_ts_web/elements/ops-view-config.d.ts +0 -19
  173. package/dist_ts_web/elements/ops-view-config.js +0 -339
  174. package/dist_ts_web/elements/ops-view-emails.d.ts +0 -21
  175. package/dist_ts_web/elements/ops-view-emails.js +0 -165
  176. package/dist_ts_web/elements/ops-view-logs.d.ts +0 -13
  177. package/dist_ts_web/elements/ops-view-logs.js +0 -159
  178. package/dist_ts_web/elements/ops-view-network.d.ts +0 -71
  179. package/dist_ts_web/elements/ops-view-network.js +0 -764
  180. package/dist_ts_web/elements/ops-view-overview.d.ts +0 -22
  181. package/dist_ts_web/elements/ops-view-overview.js +0 -456
  182. package/dist_ts_web/elements/ops-view-remoteingress.d.ts +0 -20
  183. package/dist_ts_web/elements/ops-view-remoteingress.js +0 -494
  184. package/dist_ts_web/elements/ops-view-routes.d.ts +0 -12
  185. package/dist_ts_web/elements/ops-view-routes.js +0 -404
  186. package/dist_ts_web/elements/ops-view-security.d.ts +0 -21
  187. package/dist_ts_web/elements/ops-view-security.js +0 -574
  188. package/dist_ts_web/elements/ops-view-vpn.d.ts +0 -14
  189. package/dist_ts_web/elements/ops-view-vpn.js +0 -369
  190. package/dist_ts_web/elements/shared/css.d.ts +0 -1
  191. package/dist_ts_web/elements/shared/css.js +0 -10
  192. package/dist_ts_web/elements/shared/index.d.ts +0 -2
  193. package/dist_ts_web/elements/shared/index.js +0 -3
  194. package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +0 -5
  195. package/dist_ts_web/elements/shared/ops-sectionheading.js +0 -82
  196. package/dist_ts_web/index.d.ts +0 -1
  197. package/dist_ts_web/index.js +0 -10
  198. package/dist_ts_web/plugins.d.ts +0 -6
  199. package/dist_ts_web/plugins.js +0 -11
  200. package/dist_ts_web/router.d.ts +0 -19
  201. package/dist_ts_web/router.js +0 -91
@@ -1,764 +0,0 @@
1
- var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
- function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
- var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
- var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
- var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
- var _, done = false;
7
- for (var i = decorators.length - 1; i >= 0; i--) {
8
- var context = {};
9
- for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
- for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
- context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
- var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
- if (kind === "accessor") {
14
- if (result === void 0) continue;
15
- if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
- if (_ = accept(result.get)) descriptor.get = _;
17
- if (_ = accept(result.set)) descriptor.set = _;
18
- if (_ = accept(result.init)) initializers.unshift(_);
19
- }
20
- else if (_ = accept(result)) {
21
- if (kind === "field") initializers.unshift(_);
22
- else descriptor[key] = _;
23
- }
24
- }
25
- if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
- done = true;
27
- };
28
- var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
- var useValue = arguments.length > 2;
30
- for (var i = 0; i < initializers.length; i++) {
31
- value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
- }
33
- return useValue ? value : void 0;
34
- };
35
- import { DeesElement, property, html, customElement, css, state, cssManager } from '@design.estate/dees-element';
36
- import * as appstate from '../appstate.js';
37
- import * as interfaces from '../../dist_ts_interfaces/index.js';
38
- import { viewHostCss } from './shared/css.js';
39
- import {} from '@design.estate/dees-catalog';
40
- let OpsViewNetwork = (() => {
41
- let _classDecorators = [customElement('ops-view-network')];
42
- let _classDescriptor;
43
- let _classExtraInitializers = [];
44
- let _classThis;
45
- let _classSuper = DeesElement;
46
- let _statsState_decorators;
47
- let _statsState_initializers = [];
48
- let _statsState_extraInitializers = [];
49
- let _networkState_decorators;
50
- let _networkState_initializers = [];
51
- let _networkState_extraInitializers = [];
52
- let _networkRequests_decorators;
53
- let _networkRequests_initializers = [];
54
- let _networkRequests_extraInitializers = [];
55
- let _trafficDataIn_decorators;
56
- let _trafficDataIn_initializers = [];
57
- let _trafficDataIn_extraInitializers = [];
58
- let _trafficDataOut_decorators;
59
- let _trafficDataOut_initializers = [];
60
- let _trafficDataOut_extraInitializers = [];
61
- var OpsViewNetwork = class extends _classSuper {
62
- static { _classThis = this; }
63
- static {
64
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
65
- _statsState_decorators = [state()];
66
- _networkState_decorators = [state()];
67
- _networkRequests_decorators = [state()];
68
- _trafficDataIn_decorators = [state()];
69
- _trafficDataOut_decorators = [state()];
70
- __esDecorate(this, null, _statsState_decorators, { kind: "accessor", name: "statsState", static: false, private: false, access: { has: obj => "statsState" in obj, get: obj => obj.statsState, set: (obj, value) => { obj.statsState = value; } }, metadata: _metadata }, _statsState_initializers, _statsState_extraInitializers);
71
- __esDecorate(this, null, _networkState_decorators, { kind: "accessor", name: "networkState", static: false, private: false, access: { has: obj => "networkState" in obj, get: obj => obj.networkState, set: (obj, value) => { obj.networkState = value; } }, metadata: _metadata }, _networkState_initializers, _networkState_extraInitializers);
72
- __esDecorate(this, null, _networkRequests_decorators, { kind: "accessor", name: "networkRequests", static: false, private: false, access: { has: obj => "networkRequests" in obj, get: obj => obj.networkRequests, set: (obj, value) => { obj.networkRequests = value; } }, metadata: _metadata }, _networkRequests_initializers, _networkRequests_extraInitializers);
73
- __esDecorate(this, null, _trafficDataIn_decorators, { kind: "accessor", name: "trafficDataIn", static: false, private: false, access: { has: obj => "trafficDataIn" in obj, get: obj => obj.trafficDataIn, set: (obj, value) => { obj.trafficDataIn = value; } }, metadata: _metadata }, _trafficDataIn_initializers, _trafficDataIn_extraInitializers);
74
- __esDecorate(this, null, _trafficDataOut_decorators, { kind: "accessor", name: "trafficDataOut", static: false, private: false, access: { has: obj => "trafficDataOut" in obj, get: obj => obj.trafficDataOut, set: (obj, value) => { obj.trafficDataOut = value; } }, metadata: _metadata }, _trafficDataOut_initializers, _trafficDataOut_extraInitializers);
75
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
76
- OpsViewNetwork = _classThis = _classDescriptor.value;
77
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
78
- }
79
- #statsState_accessor_storage = __runInitializers(this, _statsState_initializers, appstate.statsStatePart.getState());
80
- get statsState() { return this.#statsState_accessor_storage; }
81
- set statsState(value) { this.#statsState_accessor_storage = value; }
82
- #networkState_accessor_storage = (__runInitializers(this, _statsState_extraInitializers), __runInitializers(this, _networkState_initializers, appstate.networkStatePart.getState()));
83
- get networkState() { return this.#networkState_accessor_storage; }
84
- set networkState(value) { this.#networkState_accessor_storage = value; }
85
- #networkRequests_accessor_storage = (__runInitializers(this, _networkState_extraInitializers), __runInitializers(this, _networkRequests_initializers, []));
86
- get networkRequests() { return this.#networkRequests_accessor_storage; }
87
- set networkRequests(value) { this.#networkRequests_accessor_storage = value; }
88
- #trafficDataIn_accessor_storage = (__runInitializers(this, _networkRequests_extraInitializers), __runInitializers(this, _trafficDataIn_initializers, []));
89
- get trafficDataIn() { return this.#trafficDataIn_accessor_storage; }
90
- set trafficDataIn(value) { this.#trafficDataIn_accessor_storage = value; }
91
- #trafficDataOut_accessor_storage = (__runInitializers(this, _trafficDataIn_extraInitializers), __runInitializers(this, _trafficDataOut_initializers, []));
92
- get trafficDataOut() { return this.#trafficDataOut_accessor_storage; }
93
- set trafficDataOut(value) { this.#trafficDataOut_accessor_storage = value; }
94
- // Track if we need to update the chart to avoid unnecessary re-renders
95
- lastChartUpdate = (__runInitializers(this, _trafficDataOut_extraInitializers), 0);
96
- chartUpdateThreshold = 1000; // Minimum ms between chart updates
97
- trafficUpdateTimer = null;
98
- requestsPerSecHistory = []; // Track requests/sec over time for trend
99
- historyLoaded = false; // Whether server-side throughput history has been loaded
100
- visibilityHandler = null;
101
- constructor() {
102
- super();
103
- this.subscribeToStateParts();
104
- this.initializeTrafficData();
105
- this.updateNetworkData();
106
- this.startTrafficUpdateTimer();
107
- }
108
- async connectedCallback() {
109
- await super.connectedCallback();
110
- // Pause/resume traffic timer when tab visibility changes
111
- this.visibilityHandler = () => {
112
- if (document.hidden) {
113
- this.stopTrafficUpdateTimer();
114
- }
115
- else {
116
- this.startTrafficUpdateTimer();
117
- }
118
- };
119
- document.addEventListener('visibilitychange', this.visibilityHandler);
120
- // When network view becomes visible, ensure we fetch network data
121
- await appstate.networkStatePart.dispatchAction(appstate.fetchNetworkStatsAction, null);
122
- }
123
- async disconnectedCallback() {
124
- await super.disconnectedCallback();
125
- this.stopTrafficUpdateTimer();
126
- if (this.visibilityHandler) {
127
- document.removeEventListener('visibilitychange', this.visibilityHandler);
128
- this.visibilityHandler = null;
129
- }
130
- }
131
- subscribeToStateParts() {
132
- // Subscribe and track unsubscribe functions
133
- const statsUnsubscribe = appstate.statsStatePart.select().subscribe((state) => {
134
- this.statsState = state;
135
- this.updateNetworkData();
136
- });
137
- this.rxSubscriptions.push(statsUnsubscribe);
138
- const networkUnsubscribe = appstate.networkStatePart.select().subscribe((state) => {
139
- this.networkState = state;
140
- this.updateNetworkData();
141
- });
142
- this.rxSubscriptions.push(networkUnsubscribe);
143
- }
144
- initializeTrafficData() {
145
- const now = Date.now();
146
- // Fixed 5 minute time range
147
- const range = 5 * 60 * 1000; // 5 minutes
148
- const bucketSize = range / 60; // 60 data points
149
- // Initialize with empty data points for both in and out
150
- const emptyData = Array.from({ length: 60 }, (_, i) => {
151
- const time = now - ((59 - i) * bucketSize);
152
- return {
153
- x: new Date(time).toISOString(),
154
- y: 0,
155
- };
156
- });
157
- this.trafficDataIn = [...emptyData];
158
- this.trafficDataOut = emptyData.map(point => ({ ...point }));
159
- }
160
- /**
161
- * Load server-side throughput history into the chart.
162
- * Called once when history data first arrives from the Rust engine.
163
- * This pre-populates the chart so users see historical data immediately
164
- * instead of starting from all zeros.
165
- */
166
- loadThroughputHistory() {
167
- const history = this.networkState.throughputHistory;
168
- if (!history || history.length === 0)
169
- return;
170
- this.historyLoaded = true;
171
- // Convert history points to chart data format (bytes/sec → Mbit/s)
172
- const historyIn = history.map(p => ({
173
- x: new Date(p.timestamp).toISOString(),
174
- y: Math.round((p.in * 8) / 1000000 * 10) / 10,
175
- }));
176
- const historyOut = history.map(p => ({
177
- x: new Date(p.timestamp).toISOString(),
178
- y: Math.round((p.out * 8) / 1000000 * 10) / 10,
179
- }));
180
- // Use history as the chart data, keeping the most recent 60 points (5 min window)
181
- const sliceStart = Math.max(0, historyIn.length - 60);
182
- this.trafficDataIn = historyIn.slice(sliceStart);
183
- this.trafficDataOut = historyOut.slice(sliceStart);
184
- // If fewer than 60 points, pad the front with zeros
185
- if (this.trafficDataIn.length < 60) {
186
- const now = Date.now();
187
- const range = 5 * 60 * 1000;
188
- const bucketSize = range / 60;
189
- const padCount = 60 - this.trafficDataIn.length;
190
- const firstTimestamp = this.trafficDataIn.length > 0
191
- ? new Date(this.trafficDataIn[0].x).getTime()
192
- : now;
193
- const padIn = Array.from({ length: padCount }, (_, i) => ({
194
- x: new Date(firstTimestamp - ((padCount - i) * bucketSize)).toISOString(),
195
- y: 0,
196
- }));
197
- const padOut = padIn.map(p => ({ ...p }));
198
- this.trafficDataIn = [...padIn, ...this.trafficDataIn];
199
- this.trafficDataOut = [...padOut, ...this.trafficDataOut];
200
- }
201
- }
202
- static styles = [
203
- cssManager.defaultStyles,
204
- viewHostCss,
205
- css `
206
- .networkContainer {
207
- display: flex;
208
- flex-direction: column;
209
- gap: 24px;
210
- }
211
-
212
-
213
- .protocolBadge {
214
- display: inline-flex;
215
- align-items: center;
216
- padding: 4px 8px;
217
- border-radius: 4px;
218
- font-size: 12px;
219
- font-weight: 500;
220
- }
221
-
222
- .protocolBadge.http {
223
- background: ${cssManager.bdTheme('#e3f2fd', '#1a2c3a')};
224
- color: ${cssManager.bdTheme('#1976d2', '#5a9fd4')};
225
- }
226
-
227
- .protocolBadge.https {
228
- background: ${cssManager.bdTheme('#e8f5e9', '#1a3a1a')};
229
- color: ${cssManager.bdTheme('#388e3c', '#66bb6a')};
230
- }
231
-
232
- .protocolBadge.tcp {
233
- background: ${cssManager.bdTheme('#fff3e0', '#3a2a1a')};
234
- color: ${cssManager.bdTheme('#f57c00', '#ff9933')};
235
- }
236
-
237
- .protocolBadge.smtp {
238
- background: ${cssManager.bdTheme('#f3e5f5', '#2a1a3a')};
239
- color: ${cssManager.bdTheme('#7b1fa2', '#ba68c8')};
240
- }
241
-
242
- .protocolBadge.dns {
243
- background: ${cssManager.bdTheme('#e0f2f1', '#1a3a3a')};
244
- color: ${cssManager.bdTheme('#00796b', '#4db6ac')};
245
- }
246
-
247
- .protocolBadge.h1 {
248
- background: ${cssManager.bdTheme('#e3f2fd', '#1a2c3a')};
249
- color: ${cssManager.bdTheme('#1976d2', '#5a9fd4')};
250
- }
251
-
252
- .protocolBadge.h2 {
253
- background: ${cssManager.bdTheme('#e8f5e9', '#1a3a1a')};
254
- color: ${cssManager.bdTheme('#388e3c', '#66bb6a')};
255
- }
256
-
257
- .protocolBadge.h3 {
258
- background: ${cssManager.bdTheme('#f3e5f5', '#2a1a3a')};
259
- color: ${cssManager.bdTheme('#7b1fa2', '#ba68c8')};
260
- }
261
-
262
- .protocolBadge.unknown {
263
- background: ${cssManager.bdTheme('#f5f5f5', '#2a2a2a')};
264
- color: ${cssManager.bdTheme('#757575', '#999999')};
265
- }
266
-
267
- .suppressionBadge {
268
- display: inline-flex;
269
- align-items: center;
270
- padding: 2px 6px;
271
- border-radius: 3px;
272
- font-size: 11px;
273
- font-weight: 500;
274
- background: ${cssManager.bdTheme('#fff3e0', '#3a2a1a')};
275
- color: ${cssManager.bdTheme('#f57c00', '#ff9933')};
276
- margin-left: 4px;
277
- }
278
-
279
- .statusBadge {
280
- display: inline-flex;
281
- align-items: center;
282
- padding: 4px 8px;
283
- border-radius: 4px;
284
- font-size: 12px;
285
- font-weight: 500;
286
- }
287
-
288
- .statusBadge.success {
289
- background: ${cssManager.bdTheme('#e8f5e9', '#1a3a1a')};
290
- color: ${cssManager.bdTheme('#388e3c', '#66bb6a')};
291
- }
292
-
293
- .statusBadge.error {
294
- background: ${cssManager.bdTheme('#ffebee', '#3a1a1a')};
295
- color: ${cssManager.bdTheme('#d32f2f', '#ff6666')};
296
- }
297
-
298
- .statusBadge.warning {
299
- background: ${cssManager.bdTheme('#fff3e0', '#3a2a1a')};
300
- color: ${cssManager.bdTheme('#f57c00', '#ff9933')};
301
- }
302
- `,
303
- ];
304
- render() {
305
- return html `
306
- <ops-sectionheading>Network Activity</ops-sectionheading>
307
-
308
- <div class="networkContainer">
309
- <!-- Stats Grid -->
310
- ${this.renderNetworkStats()}
311
-
312
- <!-- Traffic Chart -->
313
- <dees-chart-area
314
- .label=${'Network Traffic'}
315
- .series=${[
316
- {
317
- name: 'Inbound',
318
- data: this.trafficDataIn,
319
- color: '#22c55e', // Green for download
320
- },
321
- {
322
- name: 'Outbound',
323
- data: this.trafficDataOut,
324
- color: '#8b5cf6', // Purple for upload
325
- }
326
- ]}
327
- .stacked=${false}
328
- .yAxisFormatter=${(val) => `${val} Mbit/s`}
329
- .tooltipFormatter=${(point) => {
330
- const mbps = point.y || 0;
331
- const seriesName = point.series?.name || 'Throughput';
332
- const timestamp = new Date(point.x).toLocaleTimeString();
333
- return `
334
- <div style="padding: 8px;">
335
- <div style="font-weight: bold; margin-bottom: 4px;">${timestamp}</div>
336
- <div>${seriesName}: ${mbps.toFixed(2)} Mbit/s</div>
337
- </div>
338
- `;
339
- }}
340
- ></dees-chart-area>
341
-
342
- <!-- Top IPs Section -->
343
- ${this.renderTopIPs()}
344
-
345
- <!-- Backend Protocols Section -->
346
- ${this.renderBackendProtocols()}
347
-
348
- <!-- Requests Table -->
349
- <dees-table
350
- .data=${this.networkRequests}
351
- .displayFunction=${(req) => ({
352
- Time: new Date(req.timestamp).toLocaleTimeString(),
353
- Protocol: html `<span class="protocolBadge ${req.protocol}">${req.protocol.toUpperCase()}</span>`,
354
- Method: req.method,
355
- 'Host:Port': `${req.hostname}:${req.port}`,
356
- Path: this.truncateUrl(req.url),
357
- Status: this.renderStatus(req.statusCode),
358
- Duration: `${req.duration}ms`,
359
- 'In/Out': `${this.formatBytes(req.bytesIn)} / ${this.formatBytes(req.bytesOut)}`,
360
- 'Remote IP': req.remoteIp,
361
- })}
362
- .dataActions=${[
363
- {
364
- name: 'View Details',
365
- iconName: 'fa:magnifyingGlass',
366
- type: ['inRow', 'doubleClick', 'contextmenu'],
367
- actionFunc: async (actionData) => {
368
- await this.showRequestDetails(actionData.item);
369
- }
370
- }
371
- ]}
372
- heading1="Recent Network Activity"
373
- heading2="Recent network requests"
374
- searchable
375
- .pagination=${true}
376
- .paginationSize=${50}
377
- dataName="request"
378
- ></dees-table>
379
- </div>
380
- `;
381
- }
382
- async showRequestDetails(request) {
383
- const { DeesModal } = await import('@design.estate/dees-catalog');
384
- await DeesModal.createAndShow({
385
- heading: 'Request Details',
386
- content: html `
387
- <div style="padding: 20px;">
388
- <dees-dataview-codebox
389
- .heading=${'Request Information'}
390
- progLang="json"
391
- .codeToDisplay=${JSON.stringify({
392
- id: request.id,
393
- timestamp: new Date(request.timestamp).toISOString(),
394
- protocol: request.protocol,
395
- method: request.method,
396
- url: request.url,
397
- hostname: request.hostname,
398
- port: request.port,
399
- statusCode: request.statusCode,
400
- duration: `${request.duration}ms`,
401
- bytesIn: request.bytesIn,
402
- bytesOut: request.bytesOut,
403
- remoteIp: request.remoteIp,
404
- route: request.route,
405
- }, null, 2)}
406
- ></dees-dataview-codebox>
407
- </div>
408
- `,
409
- menuOptions: [
410
- {
411
- name: 'Copy Request ID',
412
- iconName: 'lucide:Copy',
413
- action: async () => {
414
- await navigator.clipboard.writeText(request.id);
415
- }
416
- }
417
- ]
418
- });
419
- }
420
- renderStatus(statusCode) {
421
- if (!statusCode) {
422
- return html `<span class="statusBadge warning">N/A</span>`;
423
- }
424
- const statusClass = statusCode >= 200 && statusCode < 300 ? 'success' :
425
- statusCode >= 400 ? 'error' : 'warning';
426
- return html `<span class="statusBadge ${statusClass}">${statusCode}</span>`;
427
- }
428
- truncateUrl(url, maxLength = 50) {
429
- if (url.length <= maxLength)
430
- return url;
431
- return url.substring(0, maxLength - 3) + '...';
432
- }
433
- formatNumber(num) {
434
- if (num >= 1000000) {
435
- return (num / 1000000).toFixed(1) + 'M';
436
- }
437
- else if (num >= 1000) {
438
- return (num / 1000).toFixed(1) + 'K';
439
- }
440
- return num.toFixed(0);
441
- }
442
- formatBytes(bytes) {
443
- const units = ['B', 'KB', 'MB', 'GB'];
444
- let size = bytes;
445
- let unitIndex = 0;
446
- while (size >= 1024 && unitIndex < units.length - 1) {
447
- size /= 1024;
448
- unitIndex++;
449
- }
450
- return `${size.toFixed(1)} ${units[unitIndex]}`;
451
- }
452
- formatBitsPerSecond(bytesPerSecond) {
453
- const bitsPerSecond = bytesPerSecond * 8; // Convert bytes to bits
454
- const units = ['bit/s', 'kbit/s', 'Mbit/s', 'Gbit/s'];
455
- let size = bitsPerSecond;
456
- let unitIndex = 0;
457
- while (size >= 1000 && unitIndex < units.length - 1) {
458
- size /= 1000; // Use 1000 for bits (not 1024)
459
- unitIndex++;
460
- }
461
- return `${size.toFixed(1)} ${units[unitIndex]}`;
462
- }
463
- calculateThroughput() {
464
- // Use real throughput data from network state
465
- return {
466
- in: this.networkState.throughputRate.bytesInPerSecond,
467
- out: this.networkState.throughputRate.bytesOutPerSecond,
468
- };
469
- }
470
- renderNetworkStats() {
471
- // Use server-side requests/sec from SmartProxy's Rust engine
472
- const reqPerSec = this.networkState.requestsPerSecond || 0;
473
- const throughput = this.calculateThroughput();
474
- const activeConnections = this.statsState.serverStats?.activeConnections || 0;
475
- // Build trend data from pre-computed history (mutated in updateNetworkData, not here)
476
- const trendData = [...this.requestsPerSecHistory];
477
- while (trendData.length < 20) {
478
- trendData.unshift(0);
479
- }
480
- const tiles = [
481
- {
482
- id: 'connections',
483
- title: 'Active Connections',
484
- value: activeConnections,
485
- type: 'number',
486
- icon: 'lucide:Plug',
487
- color: activeConnections > 100 ? '#f59e0b' : '#22c55e',
488
- description: `Total: ${this.networkState.requestsTotal || this.statsState.serverStats?.totalConnections || 0}`,
489
- actions: [
490
- {
491
- name: 'View Details',
492
- iconName: 'fa:magnifyingGlass',
493
- action: async () => {
494
- },
495
- },
496
- ],
497
- },
498
- {
499
- id: 'requests',
500
- title: 'Requests/sec',
501
- value: reqPerSec,
502
- type: 'trend',
503
- icon: 'lucide:ChartLine',
504
- color: '#3b82f6',
505
- trendData: trendData,
506
- description: `Total: ${this.formatNumber(this.networkState.requestsTotal || 0)} requests`,
507
- },
508
- {
509
- id: 'throughputIn',
510
- title: 'Throughput In',
511
- value: this.formatBitsPerSecond(throughput.in),
512
- unit: '',
513
- type: 'number',
514
- icon: 'lucide:Download',
515
- color: '#22c55e',
516
- description: `Total: ${this.formatBytes(this.networkState.totalBytes?.in || 0)}`,
517
- },
518
- {
519
- id: 'throughputOut',
520
- title: 'Throughput Out',
521
- value: this.formatBitsPerSecond(throughput.out),
522
- unit: '',
523
- type: 'number',
524
- icon: 'lucide:Upload',
525
- color: '#8b5cf6',
526
- description: `Total: ${this.formatBytes(this.networkState.totalBytes?.out || 0)}`,
527
- },
528
- ];
529
- return html `
530
- <dees-statsgrid
531
- .tiles=${tiles}
532
- .minTileWidth=${200}
533
- .gridActions=${[
534
- {
535
- name: 'Export Data',
536
- iconName: 'lucide:FileOutput',
537
- action: async () => {
538
- console.log('Export feature coming soon');
539
- },
540
- },
541
- ]}
542
- ></dees-statsgrid>
543
- `;
544
- }
545
- renderTopIPs() {
546
- if (this.networkState.topIPs.length === 0) {
547
- return html ``;
548
- }
549
- // Build per-IP bandwidth lookup
550
- const bandwidthByIP = new Map();
551
- if (this.networkState.throughputByIP) {
552
- for (const entry of this.networkState.throughputByIP) {
553
- bandwidthByIP.set(entry.ip, { in: entry.in, out: entry.out });
554
- }
555
- }
556
- // Calculate total connections across all top IPs
557
- const totalConnections = this.networkState.topIPs.reduce((sum, ipData) => sum + ipData.count, 0);
558
- return html `
559
- <dees-table
560
- .data=${this.networkState.topIPs}
561
- .displayFunction=${(ipData) => {
562
- const bw = bandwidthByIP.get(ipData.ip);
563
- return {
564
- 'IP Address': ipData.ip,
565
- 'Connections': ipData.count,
566
- 'Bandwidth In': bw ? this.formatBitsPerSecond(bw.in) : '0 bit/s',
567
- 'Bandwidth Out': bw ? this.formatBitsPerSecond(bw.out) : '0 bit/s',
568
- 'Share': totalConnections > 0 ? ((ipData.count / totalConnections) * 100).toFixed(1) + '%' : '0%',
569
- };
570
- }}
571
- heading1="Top Connected IPs"
572
- heading2="IPs with most active connections and bandwidth"
573
- .pagination=${false}
574
- dataName="ip"
575
- ></dees-table>
576
- `;
577
- }
578
- renderBackendProtocols() {
579
- const backends = this.networkState.backends;
580
- if (!backends || backends.length === 0) {
581
- return html ``;
582
- }
583
- return html `
584
- <dees-table
585
- .data=${backends}
586
- .displayFunction=${(item) => {
587
- const totalErrors = item.connectErrors + item.handshakeErrors + item.requestErrors;
588
- const protocolClass = item.protocol.toLowerCase().replace(/[^a-z0-9]/g, '');
589
- return {
590
- 'Backend': item.backend,
591
- 'Domain': item.domain || '-',
592
- 'Protocol': html `
593
- <span class="protocolBadge ${protocolClass}">${item.protocol.toUpperCase()}</span>
594
- ${item.h2Suppressed ? html `<span class="suppressionBadge" title="H2 suppressed: ${item.h2ConsecutiveFailures ?? 0} failures, cooldown ${item.h2CooldownRemainingSecs ?? 0}s">H2 suppressed</span>` : ''}
595
- ${item.h3Suppressed ? html `<span class="suppressionBadge" title="H3 suppressed: ${item.h3ConsecutiveFailures ?? 0} failures, cooldown ${item.h3CooldownRemainingSecs ?? 0}s">H3 suppressed</span>` : ''}
596
- `,
597
- 'Active': item.activeConnections,
598
- 'Total': this.formatNumber(item.totalConnections),
599
- 'Avg Connect': item.avgConnectTimeMs > 0 ? `${item.avgConnectTimeMs.toFixed(1)}ms` : '-',
600
- 'Pool Hit Rate': item.poolHitRate > 0 ? `${(item.poolHitRate * 100).toFixed(1)}%` : '-',
601
- 'Errors': totalErrors > 0
602
- ? html `<span class="statusBadge error">${totalErrors}</span>`
603
- : html `<span class="statusBadge success">0</span>`,
604
- 'Cache Age': item.cacheAgeSecs != null ? `${Math.round(item.cacheAgeSecs)}s` : '-',
605
- };
606
- }}
607
- .dataActions=${[
608
- {
609
- name: 'View Details',
610
- iconName: 'lucide:info',
611
- type: ['inRow', 'doubleClick', 'contextmenu'],
612
- actionFunc: async (actionData) => {
613
- await this.showBackendDetails(actionData.item);
614
- }
615
- }
616
- ]}
617
- heading1="Backend Protocols"
618
- heading2="Auto-detected backend protocols and connection pool health"
619
- searchable
620
- .pagination=${false}
621
- dataName="backend"
622
- ></dees-table>
623
- `;
624
- }
625
- async showBackendDetails(backend) {
626
- const { DeesModal } = await import('@design.estate/dees-catalog');
627
- await DeesModal.createAndShow({
628
- heading: `Backend: ${backend.backend}`,
629
- content: html `
630
- <div style="padding: 20px;">
631
- <dees-dataview-codebox
632
- .heading=${'Backend Details'}
633
- progLang="json"
634
- .codeToDisplay=${JSON.stringify({
635
- backend: backend.backend,
636
- domain: backend.domain,
637
- protocol: backend.protocol,
638
- activeConnections: backend.activeConnections,
639
- totalConnections: backend.totalConnections,
640
- avgConnectTimeMs: backend.avgConnectTimeMs,
641
- poolHitRate: backend.poolHitRate,
642
- errors: {
643
- connect: backend.connectErrors,
644
- handshake: backend.handshakeErrors,
645
- request: backend.requestErrors,
646
- h2Failures: backend.h2Failures,
647
- },
648
- suppression: {
649
- h2Suppressed: backend.h2Suppressed,
650
- h3Suppressed: backend.h3Suppressed,
651
- h2CooldownRemainingSecs: backend.h2CooldownRemainingSecs,
652
- h3CooldownRemainingSecs: backend.h3CooldownRemainingSecs,
653
- h2ConsecutiveFailures: backend.h2ConsecutiveFailures,
654
- h3ConsecutiveFailures: backend.h3ConsecutiveFailures,
655
- },
656
- h3Port: backend.h3Port,
657
- cacheAgeSecs: backend.cacheAgeSecs,
658
- }, null, 2)}
659
- ></dees-dataview-codebox>
660
- </div>
661
- `,
662
- menuOptions: [
663
- {
664
- name: 'Copy Backend Key',
665
- iconName: 'lucide:Copy',
666
- action: async () => {
667
- await navigator.clipboard.writeText(backend.backend);
668
- }
669
- }
670
- ]
671
- });
672
- }
673
- async updateNetworkData() {
674
- // Track requests/sec history for the trend sparkline (moved out of render)
675
- const reqPerSec = this.networkState.requestsPerSecond || 0;
676
- this.requestsPerSecHistory.push(reqPerSec);
677
- if (this.requestsPerSecHistory.length > 20) {
678
- this.requestsPerSecHistory.shift();
679
- }
680
- // Only update if connections changed significantly
681
- const newConnectionCount = this.networkState.connections.length;
682
- const oldConnectionCount = this.networkRequests.length;
683
- // Check if we need to update the network requests array
684
- const shouldUpdate = newConnectionCount !== oldConnectionCount ||
685
- newConnectionCount === 0 ||
686
- (newConnectionCount > 0 && this.networkRequests.length === 0);
687
- if (shouldUpdate) {
688
- // Convert connection data to network requests format
689
- if (newConnectionCount > 0) {
690
- this.networkRequests = this.networkState.connections.map((conn, index) => ({
691
- id: conn.id,
692
- timestamp: conn.startTime,
693
- method: 'GET', // Default method for proxy connections
694
- url: '/',
695
- hostname: conn.remoteAddress,
696
- port: conn.protocol === 'https' ? 443 : 80,
697
- protocol: conn.protocol === 'https' || conn.protocol === 'http' ? conn.protocol : 'tcp',
698
- statusCode: conn.state === 'connected' ? 200 : undefined,
699
- duration: Date.now() - conn.startTime,
700
- bytesIn: conn.bytesReceived,
701
- bytesOut: conn.bytesSent,
702
- remoteIp: conn.remoteAddress,
703
- route: 'proxy',
704
- }));
705
- }
706
- else {
707
- this.networkRequests = [];
708
- }
709
- }
710
- // Load server-side throughput history into chart (once)
711
- if (!this.historyLoaded && this.networkState.throughputHistory && this.networkState.throughputHistory.length > 0) {
712
- this.loadThroughputHistory();
713
- }
714
- }
715
- startTrafficUpdateTimer() {
716
- this.stopTrafficUpdateTimer(); // Clear any existing timer
717
- this.trafficUpdateTimer = setInterval(() => {
718
- // Add a new data point every second
719
- this.addTrafficDataPoint();
720
- }, 1000); // Update every second
721
- }
722
- addTrafficDataPoint() {
723
- const now = Date.now();
724
- // Throttle chart updates to avoid excessive re-renders
725
- if (now - this.lastChartUpdate < this.chartUpdateThreshold) {
726
- return;
727
- }
728
- const throughput = this.calculateThroughput();
729
- // Convert to Mbps (bytes * 8 / 1,000,000)
730
- const throughputInMbps = (throughput.in * 8) / 1000000;
731
- const throughputOutMbps = (throughput.out * 8) / 1000000;
732
- // Add new data points
733
- const timestamp = new Date(now).toISOString();
734
- const newDataPointIn = {
735
- x: timestamp,
736
- y: Math.round(throughputInMbps * 10) / 10
737
- };
738
- const newDataPointOut = {
739
- x: timestamp,
740
- y: Math.round(throughputOutMbps * 10) / 10
741
- };
742
- // In-place mutation then reassign for Lit reactivity (avoids 4 intermediate arrays)
743
- if (this.trafficDataIn.length >= 60) {
744
- this.trafficDataIn.shift();
745
- this.trafficDataOut.shift();
746
- }
747
- this.trafficDataIn = [...this.trafficDataIn, newDataPointIn];
748
- this.trafficDataOut = [...this.trafficDataOut, newDataPointOut];
749
- this.lastChartUpdate = now;
750
- }
751
- stopTrafficUpdateTimer() {
752
- if (this.trafficUpdateTimer) {
753
- clearInterval(this.trafficUpdateTimer);
754
- this.trafficUpdateTimer = null;
755
- }
756
- }
757
- static {
758
- __runInitializers(_classThis, _classExtraInitializers);
759
- }
760
- };
761
- return OpsViewNetwork = _classThis;
762
- })();
763
- export { OpsViewNetwork };
764
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctbmV0d29yay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9vcHMtdmlldy1uZXR3b3JrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUF1QixHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RJLE9BQU8sS0FBSyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxLQUFLLFVBQVUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFtQixNQUFNLDZCQUE2QixDQUFDO0lBeUJqRCxjQUFjOzRCQUQxQixhQUFhLENBQUMsa0JBQWtCLENBQUM7Ozs7c0JBQ0UsV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs4QkFBbkIsU0FBUSxXQUFXOzs7O3NDQUM1QyxLQUFLLEVBQUU7d0NBR1AsS0FBSyxFQUFFOzJDQUlQLEtBQUssRUFBRTt5Q0FHUCxLQUFLLEVBQUU7MENBR1AsS0FBSyxFQUFFO1lBWlIsbUxBQVMsVUFBVSw2QkFBVixVQUFVLCtGQUF1QztZQUcxRCx5TEFBUyxZQUFZLDZCQUFaLFlBQVksbUdBQXlDO1lBSTlELGtNQUFTLGVBQWUsNkJBQWYsZUFBZSx5R0FBeUI7WUFHakQsNExBQVMsYUFBYSw2QkFBYixhQUFhLHFHQUFnRDtZQUd0RSwrTEFBUyxjQUFjLDZCQUFkLGNBQWMsdUdBQWdEO1lBZnpFLDZLQXF1QkM7Ozs7UUFudUJDLGlGQUFzQixRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRyxFQUFDO1FBQTFELElBQVMsVUFBVSxnREFBdUM7UUFBMUQsSUFBUyxVQUFVLHNEQUF1QztRQUcxRCw4SUFBd0IsUUFB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