underpost 2.7.1 → 2.7.2
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.
- package/.dockerignore +13 -13
- package/.env.development +7 -7
- package/.env.production +7 -7
- package/.env.test +7 -7
- package/.github/workflows/publish.yml +26 -0
- package/.nycrc +9 -9
- package/.prettierignore +12 -12
- package/.prettierrc +9 -9
- package/.vscode/extensions.json +72 -72
- package/.vscode/settings.json +100 -99
- package/Dockerfile +89 -89
- package/LICENSE +21 -21
- package/README.md +96 -96
- package/bin/db.js +172 -119
- package/bin/deploy.js +582 -661
- package/bin/dns.js +1 -1
- package/bin/file.js +92 -92
- package/bin/index.js +53 -53
- package/bin/install.js +398 -357
- package/bin/shortcut.js +44 -44
- package/bin/ssl.js +65 -64
- package/bin/util.js +182 -182
- package/bin/vs.js +35 -35
- package/conf.js +251 -249
- package/docker-compose.yml +67 -67
- package/jsconfig.json +7 -7
- package/jsdoc.json +32 -32
- package/nodemon.json +6 -6
- package/package.json +137 -132
- package/prometheus.yml +36 -36
- package/setup.sh +24 -24
- package/src/api/core/core.controller.js +69 -69
- package/src/api/core/core.model.js +11 -11
- package/src/api/core/core.router.js +23 -23
- package/src/api/core/core.service.js +29 -29
- package/src/api/crypto/crypto.controller.js +51 -51
- package/src/api/crypto/crypto.model.js +23 -23
- package/src/api/crypto/crypto.router.js +20 -20
- package/src/api/crypto/crypto.service.js +64 -64
- package/src/api/default/default.controller.js +69 -69
- package/src/api/default/default.model.js +20 -20
- package/src/api/default/default.router.js +23 -23
- package/src/api/default/default.service.js +31 -31
- package/src/api/file/file.controller.js +53 -51
- package/src/api/file/file.model.js +19 -19
- package/src/api/file/file.router.js +21 -20
- package/src/api/file/file.service.js +76 -70
- package/src/api/instance/instance.controller.js +69 -69
- package/src/api/instance/instance.model.js +36 -36
- package/src/api/instance/instance.router.js +33 -33
- package/src/api/instance/instance.service.js +48 -48
- package/src/api/test/test.controller.js +59 -59
- package/src/api/test/test.model.js +14 -14
- package/src/api/test/test.router.js +21 -21
- package/src/api/test/test.service.js +35 -35
- package/src/api/user/user.build.js +16 -0
- package/src/api/user/user.controller.js +70 -70
- package/src/api/user/user.model.js +65 -65
- package/src/api/user/user.router.js +345 -345
- package/src/api/user/user.service.js +479 -479
- package/src/api.js +23 -23
- package/src/client/Default.index.js +40 -40
- package/src/client/components/core/Account.js +290 -290
- package/src/client/components/core/AgGrid.js +160 -160
- package/src/client/components/core/Auth.js +19 -19
- package/src/client/components/core/Badge.js +32 -32
- package/src/client/components/core/BlockChain.js +41 -41
- package/src/client/components/core/Blog.js +9 -9
- package/src/client/components/core/BtnIcon.js +101 -94
- package/src/client/components/core/CalendarCore.js +458 -319
- package/src/client/components/core/Chat.js +64 -64
- package/src/client/components/core/ColorPalette.js +5267 -5267
- package/src/client/components/core/CommonJs.js +735 -732
- package/src/client/components/core/Content.js +193 -49
- package/src/client/components/core/Css.js +1064 -1027
- package/src/client/components/core/CssCore.js +817 -796
- package/src/client/components/core/D3Chart.js +44 -44
- package/src/client/components/core/Docs.js +229 -229
- package/src/client/components/core/DropDown.js +164 -164
- package/src/client/components/core/EventsUI.js +46 -54
- package/src/client/components/core/FileExplorer.js +699 -624
- package/src/client/components/core/FullScreen.js +45 -45
- package/src/client/components/core/Input.js +346 -259
- package/src/client/components/core/JoyStick.js +77 -77
- package/src/client/components/core/Keyboard.js +73 -73
- package/src/client/components/core/LoadingAnimation.js +179 -157
- package/src/client/components/core/LogIn.js +187 -181
- package/src/client/components/core/LogOut.js +58 -52
- package/src/client/components/core/Logger.js +26 -26
- package/src/client/components/core/Modal.js +1612 -1596
- package/src/client/components/core/NotificationManager.js +84 -84
- package/src/client/components/core/Panel.js +613 -413
- package/src/client/components/core/PanelForm.js +468 -0
- package/src/client/components/core/Polyhedron.js +162 -162
- package/src/client/components/core/Recover.js +204 -204
- package/src/client/components/core/Responsive.js +53 -53
- package/src/client/components/core/RichText.js +51 -27
- package/src/client/components/core/Router.js +76 -77
- package/src/client/components/core/Scroll.js +34 -0
- package/src/client/components/core/SignUp.js +125 -125
- package/src/client/components/core/SocketIo.js +72 -72
- package/src/client/components/core/Stream.js +113 -113
- package/src/client/components/core/ToggleSwitch.js +87 -87
- package/src/client/components/core/ToolTip.js +26 -26
- package/src/client/components/core/Translate.js +437 -408
- package/src/client/components/core/Validator.js +100 -100
- package/src/client/components/core/VanillaJs.js +460 -457
- package/src/client/components/core/Wallet.js +106 -106
- package/src/client/components/core/Webhook.js +25 -25
- package/src/client/components/core/Worker.js +272 -272
- package/src/client/components/default/CommonDefault.js +29 -29
- package/src/client/components/default/CssDefault.js +13 -13
- package/src/client/components/default/ElementsDefault.js +38 -38
- package/src/client/components/default/LogInDefault.js +41 -41
- package/src/client/components/default/LogOutDefault.js +28 -28
- package/src/client/components/default/MenuDefault.js +389 -389
- package/src/client/components/default/RoutesDefault.js +48 -48
- package/src/client/components/default/SettingsDefault.js +16 -16
- package/src/client/components/default/SignUpDefault.js +9 -9
- package/src/client/components/default/SocketIoDefault.js +54 -54
- package/src/client/components/default/TranslateDefault.js +7 -7
- package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
- package/src/client/public/default/browserconfig.xml +11 -11
- package/src/client/public/default/manifest.webmanifest +68 -68
- package/src/client/public/default/plantuml/client-conf.svg +1 -0
- package/src/client/public/default/plantuml/client-schema.svg +1 -0
- package/src/client/public/default/plantuml/cron-conf.svg +1 -0
- package/src/client/public/default/plantuml/cron-schema.svg +1 -0
- package/src/client/public/default/plantuml/server-conf.svg +1 -0
- package/src/client/public/default/plantuml/server-schema.svg +1 -0
- package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
- package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
- package/src/client/public/default/sitemap +147 -147
- package/src/client/public/default/yandex-browser-manifest.json +8 -8
- package/src/client/public/doc/sitemap +147 -147
- package/src/client/public/test/sitemap +147 -147
- package/src/client/services/core/core.service.js +170 -152
- package/src/client/services/crypto/crypto.service.js +70 -70
- package/src/client/services/default/default.management.js +345 -345
- package/src/client/services/default/default.service.js +89 -89
- package/src/client/services/file/file.service.js +70 -70
- package/src/client/services/instance/instance.management.js +74 -74
- package/src/client/services/instance/instance.service.js +89 -89
- package/src/client/services/test/test.service.js +70 -70
- package/src/client/services/user/user.management.js +50 -50
- package/src/client/services/user/user.service.js +89 -89
- package/src/client/ssr/Render.js +16 -16
- package/src/client/ssr/body-components/CacheControl.js +114 -113
- package/src/client/ssr/body-components/DefaultSplashScreen.js +79 -79
- package/src/client/ssr/email-components/DefaultRecoverEmail.js +21 -21
- package/src/client/ssr/email-components/DefaultVerifyEmail.js +17 -17
- package/src/client/ssr/head-components/Css.js +241 -241
- package/src/client/ssr/head-components/DefaultScripts.js +3 -3
- package/src/client/ssr/head-components/Microdata.js +11 -11
- package/src/client/ssr/head-components/Production.js +1 -1
- package/src/client/ssr/head-components/PwaDefault.js +59 -59
- package/src/client/ssr/head-components/Seo.js +14 -14
- package/src/client/sw/default.sw.js +201 -201
- package/src/client/sw/template.sw.js +84 -84
- package/src/client.build.js +22 -22
- package/src/client.dev.js +21 -21
- package/src/cron.js +25 -25
- package/src/db/DataBaseProvider.js +34 -34
- package/src/db/mariadb/MariaDB.js +33 -33
- package/src/db/mongo/MongooseDB.js +46 -46
- package/src/dns.js +22 -22
- package/src/index.js +42 -29
- package/src/mailer/EmailRender.js +69 -69
- package/src/mailer/MailerProvider.js +96 -96
- package/src/proxy.js +22 -22
- package/src/runtime/lampp/Lampp.js +69 -44
- package/src/runtime/nginx/Nginx.js +3 -3
- package/src/runtime/xampp/Xampp.js +49 -49
- package/src/server/auth.js +235 -204
- package/src/server/backup.js +101 -94
- package/src/server/client-build-live.js +72 -72
- package/src/server/client-build.js +705 -699
- package/src/server/client-dev-server.js +60 -58
- package/src/server/client-formatted.js +48 -48
- package/src/server/client-icons.js +149 -150
- package/src/server/conf.js +860 -611
- package/src/server/dns.js +98 -98
- package/src/server/downloader.js +42 -42
- package/src/server/logger.js +180 -180
- package/src/server/network.js +122 -122
- package/src/server/peer.js +33 -33
- package/src/server/process.js +66 -66
- package/src/server/prompt-optimizer.js +28 -28
- package/src/server/proxy.js +118 -118
- package/src/server/runtime.js +444 -393
- package/src/server/ssl.js +109 -107
- package/src/server.js +25 -25
- package/src/ws/IoInterface.js +45 -45
- package/src/ws/IoServer.js +39 -39
- package/src/ws/core/channels/core.ws.chat.js +23 -23
- package/src/ws/core/channels/core.ws.mailer.js +35 -35
- package/src/ws/core/channels/core.ws.stream.js +31 -31
- package/src/ws/core/core.ws.connection.js +28 -28
- package/src/ws/core/core.ws.emit.js +14 -14
- package/src/ws/core/core.ws.server.js +24 -24
- package/src/ws/core/management/core.ws.chat.js +8 -8
- package/src/ws/core/management/core.ws.mailer.js +16 -16
- package/src/ws/core/management/core.ws.stream.js +8 -8
- package/src/ws/default/channels/default.ws.main.js +16 -16
- package/src/ws/default/default.ws.connection.js +22 -22
- package/src/ws/default/default.ws.emit.js +14 -14
- package/src/ws/default/default.ws.server.js +20 -20
- package/src/ws/default/management/default.ws.main.js +8 -8
- package/startup.js +11 -11
- package/supervisord-openssh-server.conf +4 -4
- package/test/api.test.js +60 -60
|
@@ -1,272 +1,272 @@
|
|
|
1
|
-
import { BtnIcon } from './BtnIcon.js';
|
|
2
|
-
import { s4 } from './CommonJs.js';
|
|
3
|
-
import { EventsUI } from './EventsUI.js';
|
|
4
|
-
import { LoadingAnimation } from './LoadingAnimation.js';
|
|
5
|
-
import { loggerFactory } from './Logger.js';
|
|
6
|
-
import { LoadRouter } from './Router.js';
|
|
7
|
-
import { Translate } from './Translate.js';
|
|
8
|
-
import { getProxyPath, htmls, s } from './VanillaJs.js';
|
|
9
|
-
|
|
10
|
-
const logger = loggerFactory(import.meta);
|
|
11
|
-
|
|
12
|
-
const Worker = {
|
|
13
|
-
devMode: () => location.origin.match('localhost') || location.origin.match('127.0.0.1'),
|
|
14
|
-
instance: async function ({ router, render }) {
|
|
15
|
-
logger.warn('Init');
|
|
16
|
-
navigator.serviceWorker.addEventListener('controllerchange', () => {
|
|
17
|
-
logger.info('The controller of current browsing context has changed.');
|
|
18
|
-
});
|
|
19
|
-
navigator.serviceWorker.ready.then((worker) => {
|
|
20
|
-
logger.info('Ready', worker);
|
|
21
|
-
// event message
|
|
22
|
-
navigator.serviceWorker.addEventListener('message', (event) => {
|
|
23
|
-
logger.info('Received event message', event.data);
|
|
24
|
-
const { status } = event.data;
|
|
25
|
-
|
|
26
|
-
switch (status) {
|
|
27
|
-
case 'loader':
|
|
28
|
-
{
|
|
29
|
-
LoadingAnimation.RenderCurrentSrcLoad(event);
|
|
30
|
-
}
|
|
31
|
-
break;
|
|
32
|
-
|
|
33
|
-
default:
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
// if (navigator.serviceWorker.controller)
|
|
39
|
-
// navigator.serviceWorker.controller.postMessage({
|
|
40
|
-
// title: 'Hello from Client event message',
|
|
41
|
-
// });
|
|
42
|
-
|
|
43
|
-
// broadcast message
|
|
44
|
-
// const channel = new BroadcastChannel('sw-messages');
|
|
45
|
-
// channel.addEventListener('message', (event) => {
|
|
46
|
-
// logger.info('Received broadcast message', event.data);
|
|
47
|
-
// });
|
|
48
|
-
// channel.postMessage({ title: 'Hello from Client broadcast message' });
|
|
49
|
-
// channel.close();
|
|
50
|
-
});
|
|
51
|
-
const isInstall = await this.status();
|
|
52
|
-
if (!isInstall) await this.install();
|
|
53
|
-
else await this.update();
|
|
54
|
-
// else if (location.hostname === 'localhost') await this.update();
|
|
55
|
-
this.RouterInstance = router();
|
|
56
|
-
await render();
|
|
57
|
-
LoadRouter(this.RouterInstance);
|
|
58
|
-
LoadingAnimation.removeSplashScreen();
|
|
59
|
-
if (this.devMode()) {
|
|
60
|
-
const delayLiveReload = 1250;
|
|
61
|
-
// Dev mode
|
|
62
|
-
|
|
63
|
-
window.addEventListener('visibilitychange', (event) => {
|
|
64
|
-
if (document.visibilityState === 'visible') {
|
|
65
|
-
Worker.reload(delayLiveReload);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
window.addEventListener('focus', function () {
|
|
69
|
-
// Worker.reload(delayLiveReload);
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
window.serviceWorkerReady = true;
|
|
73
|
-
},
|
|
74
|
-
// Get the current service worker registration.
|
|
75
|
-
getRegistration: async function () {
|
|
76
|
-
return await navigator.serviceWorker.getRegistration();
|
|
77
|
-
},
|
|
78
|
-
reload: async function (timeOut = 3000) {
|
|
79
|
-
return await new Promise((resolve) => {
|
|
80
|
-
if (navigator.serviceWorker && navigator.serviceWorker.controller)
|
|
81
|
-
navigator.serviceWorker.controller.postMessage({
|
|
82
|
-
status: 'skipWaiting',
|
|
83
|
-
});
|
|
84
|
-
// (location.href = `${location.origin}${location.pathname}${location.search}`)
|
|
85
|
-
setTimeout(() => resolve(location.reload()), timeOut);
|
|
86
|
-
});
|
|
87
|
-
},
|
|
88
|
-
update: async function () {
|
|
89
|
-
const isInstall = await this.status();
|
|
90
|
-
if (isInstall) {
|
|
91
|
-
const cacheNames = await caches.keys();
|
|
92
|
-
for (const cacheName of cacheNames) {
|
|
93
|
-
if (cacheName.match('components/') || cacheName.match('services/') || cacheName.match('.index.js')) {
|
|
94
|
-
await caches.delete(cacheName);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
this.updateServiceWorker();
|
|
98
|
-
}
|
|
99
|
-
},
|
|
100
|
-
updateServiceWorker: function () {},
|
|
101
|
-
status: function () {
|
|
102
|
-
let status = false;
|
|
103
|
-
return new Promise((resolve, reject) => {
|
|
104
|
-
if ('serviceWorker' in navigator) {
|
|
105
|
-
navigator.serviceWorker
|
|
106
|
-
.getRegistrations()
|
|
107
|
-
.then((registrations) => {
|
|
108
|
-
for (const registration of registrations) {
|
|
109
|
-
if (registration.installing) logger.info('installing', registration);
|
|
110
|
-
else if (registration.waiting) logger.info('waiting', registration);
|
|
111
|
-
else if (registration.active) {
|
|
112
|
-
logger.info('active', registration);
|
|
113
|
-
this.updateServiceWorker = () => registration.update();
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
if (registrations.length > 0) status = true;
|
|
117
|
-
})
|
|
118
|
-
.catch((...args) => {
|
|
119
|
-
logger.error(...args);
|
|
120
|
-
return resolve(false);
|
|
121
|
-
})
|
|
122
|
-
.finally((...args) => {
|
|
123
|
-
logger.info('Finally status', args);
|
|
124
|
-
return resolve(status);
|
|
125
|
-
});
|
|
126
|
-
} else {
|
|
127
|
-
logger.warn('Disabled');
|
|
128
|
-
return resolve(false);
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
},
|
|
132
|
-
install: function () {
|
|
133
|
-
return new Promise((resolve, reject) => {
|
|
134
|
-
if ('serviceWorker' in navigator) {
|
|
135
|
-
navigator.serviceWorker
|
|
136
|
-
.register(`/sw.js`, {
|
|
137
|
-
// scope: getProxyPath(),
|
|
138
|
-
// scope: '/',
|
|
139
|
-
type: 'module',
|
|
140
|
-
})
|
|
141
|
-
.then((...args) => {
|
|
142
|
-
logger.warn('Already Registered', args);
|
|
143
|
-
})
|
|
144
|
-
.catch((...args) => {
|
|
145
|
-
logger.error(...args);
|
|
146
|
-
return resolve(args);
|
|
147
|
-
})
|
|
148
|
-
.finally((...args) => {
|
|
149
|
-
logger.info('Finally install', args);
|
|
150
|
-
return resolve(args);
|
|
151
|
-
});
|
|
152
|
-
} else {
|
|
153
|
-
logger.warn('Disabled');
|
|
154
|
-
return resolve();
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
},
|
|
158
|
-
uninstall: function () {
|
|
159
|
-
return new Promise(async (resolve, reject) => {
|
|
160
|
-
if ('serviceWorker' in navigator) {
|
|
161
|
-
navigator.serviceWorker
|
|
162
|
-
.getRegistrations()
|
|
163
|
-
.then(async (registrations) => {
|
|
164
|
-
const cacheNames = await caches.keys();
|
|
165
|
-
for (const cacheName of cacheNames) await caches.delete(cacheName);
|
|
166
|
-
for (const registration of registrations) {
|
|
167
|
-
logger.info('remove', registration);
|
|
168
|
-
registration.unregister();
|
|
169
|
-
}
|
|
170
|
-
})
|
|
171
|
-
.catch((...args) => {
|
|
172
|
-
logger.error(...args);
|
|
173
|
-
return resolve(args);
|
|
174
|
-
})
|
|
175
|
-
.finally((...args) => {
|
|
176
|
-
logger.info('Finally uninstall', args);
|
|
177
|
-
return resolve(args);
|
|
178
|
-
});
|
|
179
|
-
} else {
|
|
180
|
-
logger.warn('Disabled');
|
|
181
|
-
return resolve();
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
},
|
|
185
|
-
notificationActive: false,
|
|
186
|
-
notificationRequestPermission: function () {
|
|
187
|
-
return new Promise((resolve, reject) =>
|
|
188
|
-
Notification.requestPermission().then((result) => {
|
|
189
|
-
if (result === 'granted') {
|
|
190
|
-
this.notificationActive = true;
|
|
191
|
-
resolve(true);
|
|
192
|
-
} else {
|
|
193
|
-
this.notificationActive = false;
|
|
194
|
-
resolve(false);
|
|
195
|
-
}
|
|
196
|
-
}),
|
|
197
|
-
);
|
|
198
|
-
},
|
|
199
|
-
notificationShow: function () {
|
|
200
|
-
Notification.requestPermission().then((result) => {
|
|
201
|
-
if (result === 'granted') {
|
|
202
|
-
navigator.serviceWorker.ready.then((registration) => {
|
|
203
|
-
registration.showNotification('Vibration Sample', {
|
|
204
|
-
body: 'Buzz! Buzz!',
|
|
205
|
-
icon: '../images/touch/chrome-touch-icon.png',
|
|
206
|
-
vibrate: [200, 100, 200, 100, 200, 100, 200],
|
|
207
|
-
tag: 'vibration-sample',
|
|
208
|
-
requireInteraction: true, // boolean to manually close the notification
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
},
|
|
214
|
-
// TODO: GPS management
|
|
215
|
-
RenderSetting: async function () {
|
|
216
|
-
setTimeout(() => {
|
|
217
|
-
EventsUI.onClick(`.btn-clean-cache`, async (e) => {
|
|
218
|
-
e.preventDefault();
|
|
219
|
-
// await this.update();
|
|
220
|
-
localStorage.clear();
|
|
221
|
-
await this.uninstall();
|
|
222
|
-
await this.reload();
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
return html` <div class="in">
|
|
226
|
-
${await BtnIcon.Render({
|
|
227
|
-
class: 'inl section-mp btn-custom btn-install-service-controller hide',
|
|
228
|
-
label: html`<i class="fas fa-download"></i> ${Translate.Render('Install control service')}`,
|
|
229
|
-
})}
|
|
230
|
-
${await BtnIcon.Render({
|
|
231
|
-
class: 'inl section-mp btn-custom btn-uninstall-service-controller hide',
|
|
232
|
-
label: html`<i class="far fa-trash-alt"></i> ${Translate.Render('Uninstall control service')}`,
|
|
233
|
-
})}
|
|
234
|
-
${await BtnIcon.Render({
|
|
235
|
-
class: 'inl section-mp btn-custom btn-clean-cache',
|
|
236
|
-
label: html`<i class="fa-solid fa-broom"></i> ${Translate.Render('clean-cache')}`,
|
|
237
|
-
})}
|
|
238
|
-
${await BtnIcon.Render({
|
|
239
|
-
class: 'inl section-mp btn-custom btn-reload hide',
|
|
240
|
-
label: html`<i class="fas fa-sync-alt"></i> ${Translate.Render('Reload')}`,
|
|
241
|
-
})}
|
|
242
|
-
</div>`;
|
|
243
|
-
return;
|
|
244
|
-
s(`.btn-uninstall-service-controller`).classList.add('hide');
|
|
245
|
-
EventsUI.onClick(`.btn-install-service-controller`, async (e) => {
|
|
246
|
-
e.preventDefault();
|
|
247
|
-
const result = await this.install();
|
|
248
|
-
s(`.btn-install-service-controller`).classList.add('hide');
|
|
249
|
-
s(`.btn-uninstall-service-controller`).classList.remove('hide');
|
|
250
|
-
});
|
|
251
|
-
EventsUI.onClick(`.btn-uninstall-service-controller`, async (e) => {
|
|
252
|
-
e.preventDefault();
|
|
253
|
-
const result = await this.uninstall();
|
|
254
|
-
s(`.btn-uninstall-service-controller`).classList.add('hide');
|
|
255
|
-
s(`.btn-install-service-controller`).classList.remove('hide');
|
|
256
|
-
});
|
|
257
|
-
EventsUI.onClick(`.btn-reload`, async (e) => {
|
|
258
|
-
e.preventDefault();
|
|
259
|
-
location.reload();
|
|
260
|
-
});
|
|
261
|
-
const workerStatus = await this.status();
|
|
262
|
-
if (workerStatus) {
|
|
263
|
-
s(`.btn-install-service-controller`).classList.add('hide');
|
|
264
|
-
s(`.btn-uninstall-service-controller`).classList.remove('hide');
|
|
265
|
-
} else {
|
|
266
|
-
s(`.btn-uninstall-service-controller`).classList.add('hide');
|
|
267
|
-
s(`.btn-install-service-controller`).classList.remove('hide');
|
|
268
|
-
}
|
|
269
|
-
},
|
|
270
|
-
};
|
|
271
|
-
|
|
272
|
-
export { Worker };
|
|
1
|
+
import { BtnIcon } from './BtnIcon.js';
|
|
2
|
+
import { s4 } from './CommonJs.js';
|
|
3
|
+
import { EventsUI } from './EventsUI.js';
|
|
4
|
+
import { LoadingAnimation } from './LoadingAnimation.js';
|
|
5
|
+
import { loggerFactory } from './Logger.js';
|
|
6
|
+
import { LoadRouter } from './Router.js';
|
|
7
|
+
import { Translate } from './Translate.js';
|
|
8
|
+
import { getProxyPath, htmls, s } from './VanillaJs.js';
|
|
9
|
+
|
|
10
|
+
const logger = loggerFactory(import.meta);
|
|
11
|
+
|
|
12
|
+
const Worker = {
|
|
13
|
+
devMode: () => location.origin.match('localhost') || location.origin.match('127.0.0.1'),
|
|
14
|
+
instance: async function ({ router, render }) {
|
|
15
|
+
logger.warn('Init');
|
|
16
|
+
navigator.serviceWorker.addEventListener('controllerchange', () => {
|
|
17
|
+
logger.info('The controller of current browsing context has changed.');
|
|
18
|
+
});
|
|
19
|
+
navigator.serviceWorker.ready.then((worker) => {
|
|
20
|
+
logger.info('Ready', worker);
|
|
21
|
+
// event message
|
|
22
|
+
navigator.serviceWorker.addEventListener('message', (event) => {
|
|
23
|
+
logger.info('Received event message', event.data);
|
|
24
|
+
const { status } = event.data;
|
|
25
|
+
|
|
26
|
+
switch (status) {
|
|
27
|
+
case 'loader':
|
|
28
|
+
{
|
|
29
|
+
LoadingAnimation.RenderCurrentSrcLoad(event);
|
|
30
|
+
}
|
|
31
|
+
break;
|
|
32
|
+
|
|
33
|
+
default:
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// if (navigator.serviceWorker.controller)
|
|
39
|
+
// navigator.serviceWorker.controller.postMessage({
|
|
40
|
+
// title: 'Hello from Client event message',
|
|
41
|
+
// });
|
|
42
|
+
|
|
43
|
+
// broadcast message
|
|
44
|
+
// const channel = new BroadcastChannel('sw-messages');
|
|
45
|
+
// channel.addEventListener('message', (event) => {
|
|
46
|
+
// logger.info('Received broadcast message', event.data);
|
|
47
|
+
// });
|
|
48
|
+
// channel.postMessage({ title: 'Hello from Client broadcast message' });
|
|
49
|
+
// channel.close();
|
|
50
|
+
});
|
|
51
|
+
const isInstall = await this.status();
|
|
52
|
+
if (!isInstall) await this.install();
|
|
53
|
+
else await this.update();
|
|
54
|
+
// else if (location.hostname === 'localhost') await this.update();
|
|
55
|
+
this.RouterInstance = router();
|
|
56
|
+
await render();
|
|
57
|
+
LoadRouter(this.RouterInstance);
|
|
58
|
+
LoadingAnimation.removeSplashScreen();
|
|
59
|
+
if (this.devMode()) {
|
|
60
|
+
const delayLiveReload = 1250;
|
|
61
|
+
// Dev mode
|
|
62
|
+
|
|
63
|
+
window.addEventListener('visibilitychange', (event) => {
|
|
64
|
+
if (document.visibilityState === 'visible') {
|
|
65
|
+
Worker.reload(delayLiveReload);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
window.addEventListener('focus', function () {
|
|
69
|
+
// Worker.reload(delayLiveReload);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
window.serviceWorkerReady = true;
|
|
73
|
+
},
|
|
74
|
+
// Get the current service worker registration.
|
|
75
|
+
getRegistration: async function () {
|
|
76
|
+
return await navigator.serviceWorker.getRegistration();
|
|
77
|
+
},
|
|
78
|
+
reload: async function (timeOut = 3000) {
|
|
79
|
+
return await new Promise((resolve) => {
|
|
80
|
+
if (navigator.serviceWorker && navigator.serviceWorker.controller)
|
|
81
|
+
navigator.serviceWorker.controller.postMessage({
|
|
82
|
+
status: 'skipWaiting',
|
|
83
|
+
});
|
|
84
|
+
// (location.href = `${location.origin}${location.pathname}${location.search}`)
|
|
85
|
+
setTimeout(() => resolve(location.reload()), timeOut);
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
update: async function () {
|
|
89
|
+
const isInstall = await this.status();
|
|
90
|
+
if (isInstall) {
|
|
91
|
+
const cacheNames = await caches.keys();
|
|
92
|
+
for (const cacheName of cacheNames) {
|
|
93
|
+
if (cacheName.match('components/') || cacheName.match('services/') || cacheName.match('.index.js')) {
|
|
94
|
+
await caches.delete(cacheName);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
this.updateServiceWorker();
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
updateServiceWorker: function () {},
|
|
101
|
+
status: function () {
|
|
102
|
+
let status = false;
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
if ('serviceWorker' in navigator) {
|
|
105
|
+
navigator.serviceWorker
|
|
106
|
+
.getRegistrations()
|
|
107
|
+
.then((registrations) => {
|
|
108
|
+
for (const registration of registrations) {
|
|
109
|
+
if (registration.installing) logger.info('installing', registration);
|
|
110
|
+
else if (registration.waiting) logger.info('waiting', registration);
|
|
111
|
+
else if (registration.active) {
|
|
112
|
+
logger.info('active', registration);
|
|
113
|
+
this.updateServiceWorker = () => registration.update();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (registrations.length > 0) status = true;
|
|
117
|
+
})
|
|
118
|
+
.catch((...args) => {
|
|
119
|
+
logger.error(...args);
|
|
120
|
+
return resolve(false);
|
|
121
|
+
})
|
|
122
|
+
.finally((...args) => {
|
|
123
|
+
logger.info('Finally status', args);
|
|
124
|
+
return resolve(status);
|
|
125
|
+
});
|
|
126
|
+
} else {
|
|
127
|
+
logger.warn('Disabled');
|
|
128
|
+
return resolve(false);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
},
|
|
132
|
+
install: function () {
|
|
133
|
+
return new Promise((resolve, reject) => {
|
|
134
|
+
if ('serviceWorker' in navigator) {
|
|
135
|
+
navigator.serviceWorker
|
|
136
|
+
.register(`/sw.js`, {
|
|
137
|
+
// scope: getProxyPath(),
|
|
138
|
+
// scope: '/',
|
|
139
|
+
type: 'module',
|
|
140
|
+
})
|
|
141
|
+
.then((...args) => {
|
|
142
|
+
logger.warn('Already Registered', args);
|
|
143
|
+
})
|
|
144
|
+
.catch((...args) => {
|
|
145
|
+
logger.error(...args);
|
|
146
|
+
return resolve(args);
|
|
147
|
+
})
|
|
148
|
+
.finally((...args) => {
|
|
149
|
+
logger.info('Finally install', args);
|
|
150
|
+
return resolve(args);
|
|
151
|
+
});
|
|
152
|
+
} else {
|
|
153
|
+
logger.warn('Disabled');
|
|
154
|
+
return resolve();
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
uninstall: function () {
|
|
159
|
+
return new Promise(async (resolve, reject) => {
|
|
160
|
+
if ('serviceWorker' in navigator) {
|
|
161
|
+
navigator.serviceWorker
|
|
162
|
+
.getRegistrations()
|
|
163
|
+
.then(async (registrations) => {
|
|
164
|
+
const cacheNames = await caches.keys();
|
|
165
|
+
for (const cacheName of cacheNames) await caches.delete(cacheName);
|
|
166
|
+
for (const registration of registrations) {
|
|
167
|
+
logger.info('remove', registration);
|
|
168
|
+
registration.unregister();
|
|
169
|
+
}
|
|
170
|
+
})
|
|
171
|
+
.catch((...args) => {
|
|
172
|
+
logger.error(...args);
|
|
173
|
+
return resolve(args);
|
|
174
|
+
})
|
|
175
|
+
.finally((...args) => {
|
|
176
|
+
logger.info('Finally uninstall', args);
|
|
177
|
+
return resolve(args);
|
|
178
|
+
});
|
|
179
|
+
} else {
|
|
180
|
+
logger.warn('Disabled');
|
|
181
|
+
return resolve();
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
},
|
|
185
|
+
notificationActive: false,
|
|
186
|
+
notificationRequestPermission: function () {
|
|
187
|
+
return new Promise((resolve, reject) =>
|
|
188
|
+
Notification.requestPermission().then((result) => {
|
|
189
|
+
if (result === 'granted') {
|
|
190
|
+
this.notificationActive = true;
|
|
191
|
+
resolve(true);
|
|
192
|
+
} else {
|
|
193
|
+
this.notificationActive = false;
|
|
194
|
+
resolve(false);
|
|
195
|
+
}
|
|
196
|
+
}),
|
|
197
|
+
);
|
|
198
|
+
},
|
|
199
|
+
notificationShow: function () {
|
|
200
|
+
Notification.requestPermission().then((result) => {
|
|
201
|
+
if (result === 'granted') {
|
|
202
|
+
navigator.serviceWorker.ready.then((registration) => {
|
|
203
|
+
registration.showNotification('Vibration Sample', {
|
|
204
|
+
body: 'Buzz! Buzz!',
|
|
205
|
+
icon: '../images/touch/chrome-touch-icon.png',
|
|
206
|
+
vibrate: [200, 100, 200, 100, 200, 100, 200],
|
|
207
|
+
tag: 'vibration-sample',
|
|
208
|
+
requireInteraction: true, // boolean to manually close the notification
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
},
|
|
214
|
+
// TODO: GPS management
|
|
215
|
+
RenderSetting: async function () {
|
|
216
|
+
setTimeout(() => {
|
|
217
|
+
EventsUI.onClick(`.btn-clean-cache`, async (e) => {
|
|
218
|
+
e.preventDefault();
|
|
219
|
+
// await this.update();
|
|
220
|
+
localStorage.clear();
|
|
221
|
+
await this.uninstall();
|
|
222
|
+
await this.reload();
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
return html` <div class="in">
|
|
226
|
+
${await BtnIcon.Render({
|
|
227
|
+
class: 'inl section-mp btn-custom btn-install-service-controller hide',
|
|
228
|
+
label: html`<i class="fas fa-download"></i> ${Translate.Render('Install control service')}`,
|
|
229
|
+
})}
|
|
230
|
+
${await BtnIcon.Render({
|
|
231
|
+
class: 'inl section-mp btn-custom btn-uninstall-service-controller hide',
|
|
232
|
+
label: html`<i class="far fa-trash-alt"></i> ${Translate.Render('Uninstall control service')}`,
|
|
233
|
+
})}
|
|
234
|
+
${await BtnIcon.Render({
|
|
235
|
+
class: 'inl section-mp btn-custom btn-clean-cache',
|
|
236
|
+
label: html`<i class="fa-solid fa-broom"></i> ${Translate.Render('clean-cache')}`,
|
|
237
|
+
})}
|
|
238
|
+
${await BtnIcon.Render({
|
|
239
|
+
class: 'inl section-mp btn-custom btn-reload hide',
|
|
240
|
+
label: html`<i class="fas fa-sync-alt"></i> ${Translate.Render('Reload')}`,
|
|
241
|
+
})}
|
|
242
|
+
</div>`;
|
|
243
|
+
return;
|
|
244
|
+
s(`.btn-uninstall-service-controller`).classList.add('hide');
|
|
245
|
+
EventsUI.onClick(`.btn-install-service-controller`, async (e) => {
|
|
246
|
+
e.preventDefault();
|
|
247
|
+
const result = await this.install();
|
|
248
|
+
s(`.btn-install-service-controller`).classList.add('hide');
|
|
249
|
+
s(`.btn-uninstall-service-controller`).classList.remove('hide');
|
|
250
|
+
});
|
|
251
|
+
EventsUI.onClick(`.btn-uninstall-service-controller`, async (e) => {
|
|
252
|
+
e.preventDefault();
|
|
253
|
+
const result = await this.uninstall();
|
|
254
|
+
s(`.btn-uninstall-service-controller`).classList.add('hide');
|
|
255
|
+
s(`.btn-install-service-controller`).classList.remove('hide');
|
|
256
|
+
});
|
|
257
|
+
EventsUI.onClick(`.btn-reload`, async (e) => {
|
|
258
|
+
e.preventDefault();
|
|
259
|
+
location.reload();
|
|
260
|
+
});
|
|
261
|
+
const workerStatus = await this.status();
|
|
262
|
+
if (workerStatus) {
|
|
263
|
+
s(`.btn-install-service-controller`).classList.add('hide');
|
|
264
|
+
s(`.btn-uninstall-service-controller`).classList.remove('hide');
|
|
265
|
+
} else {
|
|
266
|
+
s(`.btn-uninstall-service-controller`).classList.add('hide');
|
|
267
|
+
s(`.btn-install-service-controller`).classList.remove('hide');
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
export { Worker };
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
const ModelElement = {
|
|
2
|
-
user: () => {
|
|
3
|
-
return {
|
|
4
|
-
user: {
|
|
5
|
-
_id: '',
|
|
6
|
-
},
|
|
7
|
-
};
|
|
8
|
-
},
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
const BaseElement = () => {
|
|
12
|
-
return {
|
|
13
|
-
user: {
|
|
14
|
-
main: {
|
|
15
|
-
model: {
|
|
16
|
-
...ModelElement.user(),
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
chat: {},
|
|
21
|
-
mailer: {},
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const DefaultParams = {
|
|
26
|
-
EVENT_CALLBACK_TIME: 45,
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export { BaseElement, ModelElement, DefaultParams };
|
|
1
|
+
const ModelElement = {
|
|
2
|
+
user: () => {
|
|
3
|
+
return {
|
|
4
|
+
user: {
|
|
5
|
+
_id: '',
|
|
6
|
+
},
|
|
7
|
+
};
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const BaseElement = () => {
|
|
12
|
+
return {
|
|
13
|
+
user: {
|
|
14
|
+
main: {
|
|
15
|
+
model: {
|
|
16
|
+
...ModelElement.user(),
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
chat: {},
|
|
21
|
+
mailer: {},
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const DefaultParams = {
|
|
26
|
+
EVENT_CALLBACK_TIME: 45,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export { BaseElement, ModelElement, DefaultParams };
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
const CssDefaultDark = {
|
|
2
|
-
theme: 'default-dark',
|
|
3
|
-
dark: true,
|
|
4
|
-
render: async () => html` <style></style> `,
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
const CssDefaultLight = {
|
|
8
|
-
theme: 'default-light',
|
|
9
|
-
dark: false,
|
|
10
|
-
render: async () => html` <style></style> `,
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export { CssDefaultDark, CssDefaultLight };
|
|
1
|
+
const CssDefaultDark = {
|
|
2
|
+
theme: 'default-dark',
|
|
3
|
+
dark: true,
|
|
4
|
+
render: async () => html` <style></style> `,
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
const CssDefaultLight = {
|
|
8
|
+
theme: 'default-light',
|
|
9
|
+
dark: false,
|
|
10
|
+
render: async () => html` <style></style> `,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { CssDefaultDark, CssDefaultLight };
|