slimsdk 0.2.0 → 0.2.1

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.
@@ -0,0 +1,760 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ // src/config/global.ts
8
+ var app = document.querySelector("#app");
9
+
10
+ // src/config/index.ts
11
+ var cfg = {
12
+ UNIX_TIME: 0,
13
+ app: {
14
+ UUID: "",
15
+ NAME: "",
16
+ SECRET: "",
17
+ VERSION: "",
18
+ RELEASE: "",
19
+ CALLBACK: ""
20
+ },
21
+ api: {
22
+ URL: "",
23
+ TOKEN: ""
24
+ },
25
+ hub: {
26
+ LOGIN: "https://wkrh.info/oauth/v1/authorize",
27
+ OAUTH: "https://wkrh.info:8850/oauth/v1",
28
+ API: "https://wkrh.info:8850/api/v1",
29
+ WSS: "wss://wkrh.info:8855/ws",
30
+ UUID: ""
31
+ },
32
+ hwl: {
33
+ HOST: "ws://localhost:8844/ws",
34
+ FILE: "https://wkrh.info/app/hwlink/hwlink_setup.exe"
35
+ },
36
+ user: {
37
+ sub: 0,
38
+ name: "",
39
+ utyp: "",
40
+ unit: "",
41
+ unit_id: 0,
42
+ role_id: 0,
43
+ metadata: {
44
+ emp_type: "",
45
+ emp_level: "",
46
+ position: ""
47
+ },
48
+ picture: ""
49
+ }
50
+ };
51
+
52
+ // src/svchub/oauth/index.ts
53
+ var oauth_exports = {};
54
+ __export(oauth_exports, {
55
+ authMW: () => authMW,
56
+ callback: () => callback,
57
+ login: () => login,
58
+ logout: () => logout
59
+ });
60
+
61
+ // src/lib/cookie.ts
62
+ var removeItem = (key) => {
63
+ document.cookie = `${key}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;
64
+ };
65
+ var clear = () => {
66
+ document.cookie.split(";").forEach((cookie) => {
67
+ const eqPos = cookie.indexOf("=");
68
+ const name = eqPos > -1 ? cookie.substring(0, eqPos) : cookie;
69
+ removeItem(name);
70
+ });
71
+ };
72
+
73
+ // src/svchub/oauth/template.ts
74
+ var tempLogout = (
75
+ /*html*/
76
+ `
77
+ <div id="page-logout">
78
+ <div id="content">
79
+ <div class="logo">
80
+ <img src="https://cdn.jsdelivr.net/npm/slimsdk/dist/assets/icon/icon-02.png">
81
+ </div>
82
+ <button id="btn-login" class="lg">\u0E40\u0E02\u0E49\u0E32\u0E23\u0E30\u0E1A\u0E1A\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07</button>
83
+ </div>
84
+ <!-- loader -->
85
+ <div id="loader"></div>
86
+ </div>
87
+ <style>
88
+ #app:has(#page-logout) {
89
+ padding: 0;
90
+ }
91
+ #page-logout {
92
+ width: 100%;
93
+ height: 100%;
94
+ position: fixed;
95
+ display: flex;
96
+ flex-direction: column;
97
+ justify-content: center;
98
+ align-items: center;
99
+ background-position: center;
100
+ background-repeat: no-repeat;
101
+ background-size: cover;
102
+ background-image: url('https://cdn.jsdelivr.net/npm/slimsdk/dist/assets/bg/bg-01.jpg');
103
+ }
104
+ #page-logout #content {
105
+ display: none;
106
+ text-align: center;
107
+ animation: fadeIn 0.4s;
108
+ }
109
+ #page-logout #content .logo {
110
+ margin: auto;
111
+ width: 150px;
112
+ height: 150px;
113
+ margin-bottom: 20px;
114
+ border-radius: 50%;
115
+ background-color: rgba(255, 255, 255, 0.2);
116
+ box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2),
117
+ 0 6px 20px 0 rgba(0, 0, 0, 0.19);
118
+ }
119
+ #page-logout #content .logo img {
120
+ width: 100%;
121
+ height: 100%;
122
+ border-radius: 50%;
123
+ }
124
+ #page-logout #content #btn-login {
125
+ box-shadow: rgba(0, 0, 0, 0.16) 0px 3px 6px,
126
+ rgba(0, 0, 0, 0.23) 0px 3px 6px;
127
+ }
128
+ #page-logout #loader {
129
+ width: 110px;
130
+ height: 110px;
131
+ border-radius: 50%;
132
+ border: 11px solid #E5E7EB;
133
+ border-color: #E5E7EB #06B6D4 #E5E7EB #06B6D4;
134
+ animation: spin 2s linear infinite;
135
+ }
136
+ </style>
137
+ `
138
+ );
139
+
140
+ // src/lib/utility.ts
141
+ var jwtParse = (token) => {
142
+ try {
143
+ return JSON.parse(atob(token.split(".")[1]));
144
+ } catch {
145
+ return null;
146
+ }
147
+ };
148
+
149
+ // src/svchub/api/auth/index.ts
150
+ var auth_exports = {};
151
+ __export(auth_exports, {
152
+ getToken: () => getToken,
153
+ getUserInfo: () => getUserInfo
154
+ });
155
+ var getToken = (params) => new Promise((resolve, reject) => {
156
+ fetch(cfg.hub.OAUTH + "/token", {
157
+ method: "POST",
158
+ headers: { "Content-Type": "application/json; charset=utf-8" },
159
+ body: JSON.stringify(params)
160
+ }).then((resp) => {
161
+ if (!resp.ok) throw resp;
162
+ return resp.json();
163
+ }).then((json) => {
164
+ resolve(json);
165
+ }).catch((err) => reject(err));
166
+ });
167
+ var getUserInfo = (token) => new Promise((resolve, reject) => {
168
+ let headers = cfg.api.HEADERS;
169
+ if (token) headers = new Headers({
170
+ "Content-Type": "application/json; charset=utf-8",
171
+ "Authorization": `Bearer ${token}`
172
+ });
173
+ fetch(cfg.hub.OAUTH + "/userinfo", {
174
+ method: "GET",
175
+ headers
176
+ }).then((resp) => {
177
+ if (!resp.ok) throw resp;
178
+ return resp.json();
179
+ }).then((json) => {
180
+ resolve(json);
181
+ }).catch((err) => reject(err));
182
+ });
183
+
184
+ // src/svchub/oauth/midware.ts
185
+ var IGNORE = ["__NOT_FOUND__", "login", "logout", "callback"];
186
+ var authMW = async (route, ignore) => {
187
+ ignore?.forEach((val) => IGNORE.push(val));
188
+ if (IGNORE.includes(route)) {
189
+ console.log("ignore :", route);
190
+ return;
191
+ }
192
+ const token = localStorage.getItem("ACCESS_TOKEN");
193
+ if (!token) {
194
+ gotoLogin();
195
+ throw "token not exist";
196
+ }
197
+ try {
198
+ const jwt = jwtParse(token);
199
+ const exp = Number(jwt?.exp) * 1e3;
200
+ if (isNaN(exp)) throw "err";
201
+ const now = Date.now();
202
+ if (now >= exp) throw "err";
203
+ } catch {
204
+ gotoLogin();
205
+ }
206
+ cfg.api.TOKEN = token;
207
+ cfg.api.HEADERS = new Headers({
208
+ "Content-Type": "application/json; charset=utf-8",
209
+ "Authorization": `Bearer ${cfg.api.TOKEN}`
210
+ });
211
+ const session = sessionStorage.getItem("ACCESS_SESSION");
212
+ if (!session) {
213
+ await getUserInfo().then((resp) => {
214
+ const data = resp.data;
215
+ setProfile(data);
216
+ sessionStorage.setItem("ACCESS_SESSION", JSON.stringify(data));
217
+ }).catch(() => gotoLogin());
218
+ } else {
219
+ const data = JSON.parse(session);
220
+ setProfile(data);
221
+ }
222
+ };
223
+ var setProfile = (user) => {
224
+ cfg.user.sub = user.sub;
225
+ cfg.user.name = user.name;
226
+ cfg.user.utyp = user.utyp;
227
+ cfg.user.unit = user.unit;
228
+ cfg.user.unit_id = user.unit_id;
229
+ cfg.user.role_id = user.role_id;
230
+ cfg.user.picture = user.picture ? user.picture : "";
231
+ if (user.metadata) cfg.user.metadata = user.metadata;
232
+ };
233
+ var gotoLogin = () => {
234
+ clear();
235
+ localStorage.clear();
236
+ sessionStorage.clear();
237
+ window.location.replace("/login");
238
+ throw "not logged in";
239
+ };
240
+
241
+ // src/svchub/oauth/index.ts
242
+ var app2 = document.querySelector("#app");
243
+ var login = () => {
244
+ clearCache();
245
+ const state = Math.random().toString(36).slice(-8);
246
+ sessionStorage.setItem("OAUTH_STATE", state);
247
+ const query = new URLSearchParams({
248
+ response_type: "token",
249
+ client_id: cfg.app.UUID,
250
+ redirect_uri: cfg.app.CALLBACK,
251
+ state
252
+ }).toString();
253
+ const url = `${cfg.hub.LOGIN}?${query}`;
254
+ window.location.replace(url);
255
+ };
256
+ var logout = () => {
257
+ clearCache();
258
+ if (!app2) return;
259
+ app2.innerHTML = tempLogout;
260
+ app2.classList.add("full-page");
261
+ const content = app2.querySelector("#content");
262
+ const loader = app2.querySelector("#loader");
263
+ new Promise((r) => setTimeout(r, 400)).then(() => {
264
+ content.style.display = "block";
265
+ loader.style.display = "none";
266
+ });
267
+ app2.querySelector("#btn-login").onclick = () => {
268
+ window.location.replace("/login");
269
+ };
270
+ };
271
+ var callback = () => {
272
+ const search = window.location.search;
273
+ const query = new URLSearchParams(search);
274
+ const state = query.get("state");
275
+ const session = sessionStorage.getItem("OAUTH_STATE");
276
+ if (state !== session) {
277
+ window.location.replace("/login");
278
+ }
279
+ clearCache();
280
+ const code = query.get("code");
281
+ const token = query.get("token");
282
+ if (code) {
283
+ }
284
+ if (token) {
285
+ localStorage.setItem("ACCESS_TOKEN", token);
286
+ }
287
+ window.location.replace("/");
288
+ };
289
+ var clearCache = () => {
290
+ clear();
291
+ localStorage.clear();
292
+ sessionStorage.clear();
293
+ };
294
+
295
+ // src/svchub/api/index.ts
296
+ var api_exports = {};
297
+ __export(api_exports, {
298
+ auth: () => auth_exports
299
+ });
300
+
301
+ // src/svchub/wss/index.ts
302
+ var wss_exports = {};
303
+ __export(wss_exports, {
304
+ checkUpdate: () => checkUpdate,
305
+ newTask: () => newTask
306
+ });
307
+
308
+ // src/mod/dialog/index.ts
309
+ var app3 = document.querySelector("#app");
310
+ var toast = (message, params) => new Promise((resolve) => {
311
+ if (!app3) return;
312
+ const doc = params && params?.target ? params.target : app3;
313
+ const type = params && params?.type ? params.type : "success";
314
+ let color = "";
315
+ let icon = "";
316
+ if (type == "success") {
317
+ color = "green";
318
+ icon = "&#xf058;";
319
+ }
320
+ if (type == "failure") {
321
+ color = "red";
322
+ icon = "&#xf057;";
323
+ }
324
+ if (type == "warning") {
325
+ color = "orange";
326
+ icon = "&#xf06a;";
327
+ }
328
+ if (type == "info") {
329
+ color = "blue";
330
+ icon = "&#xf05a;";
331
+ }
332
+ const toast2 = document.createElement("div");
333
+ toast2.className = `slim-toast ${color}`;
334
+ toast2.innerHTML = /*html*/
335
+ `
336
+ <i class="icon">${icon}</i>
337
+ <span class="text">${message}</span>
338
+ `;
339
+ doc.appendChild(toast2);
340
+ toast2.classList.add("show");
341
+ let count = 0;
342
+ toast2.onanimationend = () => {
343
+ count++;
344
+ if (count == 2) {
345
+ toast2.remove();
346
+ resolve();
347
+ }
348
+ };
349
+ });
350
+
351
+ // src/lib/dateTime.ts
352
+ var TH_MONTH = [
353
+ "\u0E21\u0E01\u0E23\u0E32\u0E04\u0E21",
354
+ "\u0E01\u0E38\u0E21\u0E20\u0E32\u0E1E\u0E31\u0E19\u0E18\u0E4C",
355
+ "\u0E21\u0E35\u0E19\u0E32\u0E04\u0E21",
356
+ "\u0E40\u0E21\u0E29\u0E32\u0E22\u0E19",
357
+ "\u0E1E\u0E24\u0E29\u0E20\u0E32\u0E04\u0E21",
358
+ "\u0E21\u0E34\u0E16\u0E38\u0E19\u0E32\u0E22\u0E19",
359
+ "\u0E01\u0E23\u0E01\u0E0E\u0E32\u0E04\u0E21",
360
+ "\u0E2A\u0E34\u0E07\u0E2B\u0E32\u0E04\u0E21",
361
+ "\u0E01\u0E31\u0E19\u0E22\u0E32\u0E22\u0E19",
362
+ "\u0E15\u0E38\u0E25\u0E32\u0E04\u0E21",
363
+ "\u0E1E\u0E24\u0E28\u0E08\u0E34\u0E01\u0E32\u0E22\u0E19",
364
+ "\u0E18\u0E31\u0E19\u0E27\u0E32\u0E04\u0E21"
365
+ ];
366
+ var TH_MONTH_SHORT = [
367
+ "\u0E21.\u0E04.",
368
+ "\u0E01.\u0E1E.",
369
+ "\u0E21\u0E35.\u0E04.",
370
+ "\u0E40\u0E21.\u0E22.",
371
+ "\u0E1E.\u0E04.",
372
+ "\u0E21\u0E34.\u0E22.",
373
+ "\u0E01.\u0E04.",
374
+ "\u0E2A.\u0E04.",
375
+ "\u0E01.\u0E22.",
376
+ "\u0E15.\u0E04.",
377
+ "\u0E1E.\u0E22.",
378
+ "\u0E18.\u0E04."
379
+ ];
380
+ var timeToStr = (unixtime, format = "") => {
381
+ if (typeof unixtime != "number") {
382
+ return "";
383
+ }
384
+ const unix = new Date(Number(unixtime));
385
+ const yy = unix.getFullYear();
386
+ const mm = String(unix.getMonth() + 1).padStart(2, "0");
387
+ const dd = String(unix.getDate()).padStart(2, "0");
388
+ const H = String(unix.getHours()).padStart(2, "0");
389
+ const M = String(unix.getMinutes()).padStart(2, "0");
390
+ const S = String(unix.getSeconds()).padStart(2, "0");
391
+ if (format == "date") {
392
+ return `${yy}-${mm}-${dd}`;
393
+ }
394
+ if (format == "time") {
395
+ return `${H}:${M}:${S}`;
396
+ }
397
+ return `${yy}-${mm}-${dd} ${H}:${M}:${S}`;
398
+ };
399
+ var thaiDate = (date, format = 0) => {
400
+ if (typeof date == "string" && date.indexOf("0000-00-00") >= 0) {
401
+ return "";
402
+ }
403
+ if (typeof date == "string") {
404
+ date = date.trim();
405
+ date = date.replace(" ", "T");
406
+ }
407
+ const dt = new Date(date);
408
+ if (isNaN(dt.getTime())) return "";
409
+ const yy = dt.getFullYear() + 543;
410
+ const mm = String(dt.getMonth() + 1).padStart(2, "0");
411
+ const dd = String(dt.getDate()).padStart(2, "0");
412
+ const H = String(dt.getHours()).padStart(2, "0");
413
+ const M = String(dt.getMinutes()).padStart(2, "0");
414
+ const S = String(dt.getSeconds()).padStart(2, "0");
415
+ if (format == 0) return `${dd}/${mm}/${yy}`;
416
+ if (format == 1) return `${dd}/${mm}/${yy} ${H}:${M}`;
417
+ if (format == 2) return `${dd}/${mm}/${yy} ${H}:${M}:${S}`;
418
+ if (format == 10) return `${dd} ${TH_MONTH[Number(mm) - 1]} ${yy}`;
419
+ if (format == 11) return `${dd} ${TH_MONTH_SHORT[Number(mm) - 1]} ${String(yy).slice(-2)}`;
420
+ if (format == 12) return `${dd} ${TH_MONTH[Number(mm) - 1]} ${yy} \u0E40\u0E27\u0E25\u0E32 ${H}:${M} \u0E19.`;
421
+ if (format == 13) return `${dd} ${TH_MONTH_SHORT[Number(mm) - 1]} ${String(yy).slice(-2)} ${H}:${M}`;
422
+ if (format == 20) return `${TH_MONTH[Number(mm) - 1]} ${yy}`;
423
+ if (format == 21) return `${TH_MONTH_SHORT[Number(mm) - 1]} ${yy}`;
424
+ if (format == 22) return `${TH_MONTH_SHORT[Number(mm) - 1]} ${String(yy).slice(-2)}`;
425
+ return "";
426
+ };
427
+
428
+ // src/svchub/wss/index.ts
429
+ var newTask = (worker) => {
430
+ if (!window.Worker) return;
431
+ cfg.hub.TASK = new worker();
432
+ cfg.hub.TASK.postMessage({
433
+ head: "INIT",
434
+ data: {
435
+ url: cfg.hub.WSS,
436
+ app: cfg.app.NAME,
437
+ uid: cfg.app.UUID,
438
+ ver: cfg.app.VERSION
439
+ }
440
+ });
441
+ cfg.hub.TASK.addEventListener("message", (e) => {
442
+ const json = e.data;
443
+ const head = json.head ? json.head : "";
444
+ const data = json.data ? json.data : "";
445
+ if (head == "ACCEPT") {
446
+ rspAccept(data);
447
+ cfg.hub.TASK?.postMessage({
448
+ head: "VERIFY",
449
+ data: cfg.api.TOKEN
450
+ });
451
+ }
452
+ if (head == "DISCON") rspDiscon();
453
+ if (head == "LATEST") rspLatest(data);
454
+ if (head == "BRDMSG") rspBrdMsg(data);
455
+ if (head == "VERIFY" && data != "200 OK") {
456
+ console.log(head, data);
457
+ }
458
+ });
459
+ };
460
+ var checkUpdate = (min = 10) => {
461
+ return setInterval(() => {
462
+ cfg.hub.TASK?.postMessage({
463
+ head: "LATEST",
464
+ data: {
465
+ app: cfg.app.NAME,
466
+ uid: cfg.app.UUID
467
+ }
468
+ });
469
+ }, 1e3 * 60 * min);
470
+ };
471
+ var rspBrdMsg = (brd) => {
472
+ if (brd.cmd == "LOGS") console.log(brd.msg);
473
+ if (brd.cmd == "TIME") setTime(brd.msg);
474
+ if (brd.cmd == "RESULT" && brd.to == cfg.hub.UUID) {
475
+ console.log(brd.cmd, "From:", brd.from);
476
+ console.log(brd.msg);
477
+ }
478
+ if (brd.cmd == "CONRST" && (brd.to == cfg.hub.UUID || brd.to == "@all")) {
479
+ sessionStorage.clear();
480
+ window.location.reload();
481
+ }
482
+ if (brd.cmd == "LOGOUT" && (brd.to == cfg.hub.UUID || brd.to == "@all")) {
483
+ localStorage.clear();
484
+ sessionStorage.clear();
485
+ window.location.reload();
486
+ }
487
+ if (brd.cmd == "NOTIFY" && (brd.to == cfg.hub.UUID || brd.to == "@all")) {
488
+ brdNotify(brd.msg);
489
+ }
490
+ if (brd.cmd == "") console.log(brd.msg);
491
+ };
492
+ var rspAccept = (data) => {
493
+ cfg.hub.UUID = data.uuid ? data.uuid : "";
494
+ console.log("hub-uuid:", cfg.hub.UUID);
495
+ const boxTime = document.querySelector("#topbar #box-time");
496
+ if (boxTime) boxTime.classList.remove("offline");
497
+ toast("\u0E40\u0E0A\u0E37\u0E48\u0E2D\u0E21\u0E15\u0E48\u0E2D Server \u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08.!", { type: "success" });
498
+ };
499
+ var rspDiscon = () => {
500
+ const boxTime = document.querySelector("#topbar #box-time");
501
+ if (boxTime) {
502
+ boxTime.classList.add("offline");
503
+ const svTime = boxTime.querySelector("#sv-time");
504
+ const svDate = boxTime.querySelector("#sv-date");
505
+ if (svTime) svTime.innerText = "server";
506
+ if (svDate) svDate.innerText = "OFFLINE";
507
+ }
508
+ toast("\u0E02\u0E32\u0E14\u0E01\u0E32\u0E23\u0E40\u0E0A\u0E37\u0E48\u0E2D\u0E21\u0E15\u0E48\u0E2D Server.!", { type: "failure" });
509
+ };
510
+ var rspLatest = (data) => {
511
+ if (cfg.app.UUID == data.appuuid && cfg.app.NAME == data.appname) {
512
+ const path = window.location.pathname;
513
+ if (path != "/changelog" && cfg.app.RELEASE != data.release) {
514
+ window.location.replace("/changelog");
515
+ }
516
+ }
517
+ };
518
+ var setTime = (data) => {
519
+ if (typeof data.unix != "number") return;
520
+ cfg.UNIX_TIME = Number(data.unix);
521
+ const svTime = document.querySelector("#topbar #box-time #sv-time");
522
+ const svDate = document.querySelector("#topbar #box-time #sv-date");
523
+ if (svTime && svDate) {
524
+ const [date, time] = timeToStr(cfg.UNIX_TIME).split(" ");
525
+ svTime.innerText = time;
526
+ svDate.innerText = thaiDate(date, 11);
527
+ }
528
+ };
529
+ var brdNotify = (data) => {
530
+ const title = data.title ? data.title : "Hub Notify";
531
+ const icon = data.icon ? data.icon : "https://cdn.jsdelivr.net/npm/slimsdk/dist/assets/icon/icon-06.png";
532
+ const body = data.body ? data.body : "";
533
+ if (!body) return;
534
+ Notification.requestPermission().then((res) => {
535
+ if (res == "granted") {
536
+ new Notification(title, { body, icon });
537
+ }
538
+ }).catch((err) => console.error(err));
539
+ };
540
+
541
+ // src/page/index.ts
542
+ var app4 = document.querySelector("#app");
543
+ var pageSpin = (
544
+ /*html*/
545
+ `
546
+ <div class="lds-spinner">
547
+ <div></div><div></div><div></div><div></div>
548
+ <div></div><div></div><div></div><div></div>
549
+ <div></div><div></div><div></div><div></div>
550
+ </div>
551
+ `
552
+ );
553
+ var smallSpin = `<div class="spinner s32"></div>`;
554
+ var loading = (size = "default") => {
555
+ if (!app4) return;
556
+ if (!app4.querySelector("#page-loader")) {
557
+ const loader = document.createElement("div");
558
+ loader.id = "page-loader";
559
+ loader.className = "overlay center";
560
+ loader.innerHTML = size == "default" ? pageSpin : smallSpin;
561
+ app4.appendChild(loader);
562
+ }
563
+ const content = app4.querySelector("#app-content");
564
+ if (content) content.style.display = "none";
565
+ };
566
+ var ready = (delay = 400) => {
567
+ new Promise((r) => setTimeout(r, delay)).then(() => {
568
+ clearLoader(true);
569
+ });
570
+ };
571
+ var clearLoader = (showContent) => {
572
+ if (!app4) return;
573
+ const loader = app4.querySelector("#page-loader");
574
+ if (loader) {
575
+ loader.style.animation = "fade-out 0.4s forwards";
576
+ loader.onanimationend = () => loader.remove();
577
+ }
578
+ const content = app4.querySelector("#app-content");
579
+ if (content) content.style.display = showContent ? "block" : "none";
580
+ };
581
+
582
+ // src/svchub/hwlink/template.ts
583
+ var template = (
584
+ /*html*/
585
+ `
586
+ <div id="page-svchub" class="cover">
587
+ <div class="cover-bar">Hardware Link</div>
588
+ <div class="cover-body border">
589
+ <!-- svcinfo -->
590
+ <div id="svcinfo">
591
+ <div class="box-tb">
592
+ <div class="topic">HwLink</div>
593
+ <div class="text" id="hwlink">:</div>
594
+ </div>
595
+ <div class="box-tb">
596
+ <div class="topic">AutoUp</div>
597
+ <div class="text" id="autoup">:</div>
598
+ </div>
599
+ <div class="box-tb">
600
+ <div class="topic">CSUUID</div>
601
+ <div class="text" id="csuuid">:</div>
602
+ </div>
603
+ </div>
604
+ <hr>
605
+ <!-- device -->
606
+ <div id="device">
607
+ <div class="box-tb">
608
+ <div class="topic">\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19</div>
609
+ <div class="text" id="">:</div>
610
+ </div>
611
+ <div class="box-tb">
612
+ <div class="topic">\u0E01\u0E25\u0E38\u0E48\u0E21\u0E07\u0E32\u0E19</div>
613
+ <div class="text" id="">:</div>
614
+ </div>
615
+ <div class="box-tb">
616
+ <div class="topic">\u0E0A\u0E37\u0E48\u0E2D\u0E2D\u0E38\u0E1B\u0E01\u0E23\u0E13\u0E4C</div>
617
+ <div class="text" id="">:</div>
618
+ </div>
619
+ <div class="box-tb">
620
+ <div class="topic">\u0E40\u0E25\u0E02\u0E17\u0E23\u0E31\u0E1E\u0E22\u0E4C\u0E2A\u0E34\u0E19</div>
621
+ <div class="text" id="">:</div>
622
+ </div>
623
+ <button id="btn-edit" class="circle sm blue"
624
+ shadow="true">&#xf5ae;</button>
625
+ </div>
626
+ <hr>
627
+ <!-- hwinfo -->
628
+ <div id="hwinfo">
629
+ <div class="box-tb">
630
+ <div class="topic">Hostname</div>
631
+ <div class="text" id="host">:</div>
632
+ </div>
633
+ <div class="box-tb">
634
+ <div class="topic">Platform</div>
635
+ <div class="text" id="os">:</div>
636
+ </div>
637
+ <div class="box-tb">
638
+ <div class="topic">CpuModel</div>
639
+ <div class="text" id="cpu">:</div>
640
+ </div>
641
+ <div class="box-tb">
642
+ <div class="topic">Memory</div>
643
+ <div class="text" id="mem">:</div>
644
+ </div>
645
+ <div class="box-tb">
646
+ <div class="topic">Uptime</div>
647
+ <div class="text" id="uptime">:</div>
648
+ </div>
649
+ </div>
650
+ <hr>
651
+ <!-- x -->
652
+ <div id="">
653
+ <div class="box-tb">
654
+ <div class="topic">SmartCard</div>
655
+ <div class="text" id="">:</div>
656
+ </div>
657
+ <div class="box-tb">
658
+ <div class="topic">Biometric</div>
659
+ <div class="text" id="">:</div>
660
+ </div>
661
+ </div>
662
+ </div>
663
+ </div>
664
+ <style>
665
+ #page-svchub {
666
+ margin: auto;
667
+ max-width: 600px;
668
+ min-width: 480px;
669
+ line-height: 1.5;
670
+ }
671
+ #page-svchub .topic {
672
+ float: left;
673
+ width: 100px;
674
+ font-weight: 600;
675
+ }
676
+ #page-svchub .text {
677
+ float: left;
678
+ width: calc(100% - 100px);
679
+ }
680
+ #page-svchub #device {
681
+ position: relative;
682
+ }
683
+ #page-svchub #btn-edit {
684
+ position: absolute;
685
+ top: 0;
686
+ right: 0;
687
+ }
688
+ </style>
689
+ `
690
+ );
691
+
692
+ // src/svchub/hwlink/index.ts
693
+ var app5 = document.querySelector("#app");
694
+ var isREADY;
695
+ var WSSVC;
696
+ var hwLink = () => {
697
+ if (!app5) return;
698
+ const content = document.createElement("div");
699
+ content.id = "app-content";
700
+ content.innerHTML = template;
701
+ app5.classList.add("full-page");
702
+ app5.appendChild(content);
703
+ isREADY = false;
704
+ loading();
705
+ wsSvc();
706
+ };
707
+ var wsSvc = () => {
708
+ WSSVC = new WebSocket(cfg.hwl.HOST);
709
+ WSSVC.onopen = () => {
710
+ hwinfo();
711
+ T_hwinfo = setInterval(hwinfo, 1e3 * 10);
712
+ };
713
+ WSSVC.onclose = () => {
714
+ clearInterval(T_hwinfo);
715
+ setTimeout(wsSvc, 1e3 * 10);
716
+ };
717
+ WSSVC.onmessage = (e) => {
718
+ const resp = JSON.parse(e.data);
719
+ const head = resp.head ? resp.head : "";
720
+ const data = resp.data ? resp.data : "";
721
+ if (head == "CSUUID") {
722
+ if (!isREADY) {
723
+ isREADY = true;
724
+ ready();
725
+ }
726
+ }
727
+ if (head == "HWINFO") setHwInfo(data);
728
+ };
729
+ let T_hwinfo;
730
+ const hwinfo = () => WSSVC.send('{"head": "HWINFO"}');
731
+ };
732
+ var setHwInfo = (data) => {
733
+ if (!app5) return;
734
+ const svc = data.svc;
735
+ app5.querySelector("#hwlink").innerText = `: ${svc.hwlink}`;
736
+ app5.querySelector("#autoup").innerText = `: ${svc.autoup}`;
737
+ app5.querySelector("#csuuid").innerText = `: ${data.csuuid}`;
738
+ const cpu = data.cpu;
739
+ const mem = data.mem;
740
+ const hwinfo = app5.querySelector("#hwinfo");
741
+ const uptime = Number(data.uptime);
742
+ const hh = Math.floor(uptime / 3600);
743
+ const mm = Math.floor(uptime % 3600 / 60);
744
+ const memUsed = (Number(mem.used) / 1024 / 1024 / 1024).toFixed(1);
745
+ const memTotal = (Number(mem.total) / 1024 / 1024 / 1024).toFixed(1);
746
+ const mem_text = `${memUsed}/${memTotal} GB (${mem.percent}%)`;
747
+ hwinfo.querySelector("#host").innerText = `: ${data.hostname}`;
748
+ hwinfo.querySelector("#os").innerText = `: ${data.platform}`;
749
+ hwinfo.querySelector("#cpu").innerText = `: ${cpu.model}`;
750
+ app5.querySelector("#mem").innerText = `: ${mem_text}`;
751
+ app5.querySelector("#uptime").innerText = `: ${hh} h ${mm} m`;
752
+ };
753
+ export {
754
+ api_exports as apiHub,
755
+ cfg,
756
+ hwLink,
757
+ oauth_exports as oauth,
758
+ wss_exports as wssHub
759
+ };
760
+ //# sourceMappingURL=index.js.map