ionian/app.ts

140 lines
3.8 KiB
TypeScript
Raw Normal View History

2021-01-12 16:10:05 +09:00
import { app, BrowserWindow, session, dialog } from "electron";
2021-01-15 18:43:36 +09:00
import { get_setting } from "./src/SettingConfig";
2021-01-16 21:22:30 +09:00
import { create_server } from "./src/server";
2021-01-11 03:14:29 +09:00
import { getAdminAccessTokenValue,getAdminRefreshTokenValue, accessTokenName, refreshTokenName } from "./src/login";
2021-01-16 21:22:30 +09:00
import { join } from "path";
import { ipcMain } from 'electron';
import { UserAccessor } from "./src/model/mod";
function registerChannel(cntr: UserAccessor){
ipcMain.handle('reset_password', async(event,username:string,password:string)=>{
const user = await cntr.findUser(username);
if(user === undefined){
return false;
}
user.reset_password(password);
return true;
});
}
2021-01-10 03:04:30 +09:00
const setting = get_setting();
if (!setting.cli) {
2021-01-12 03:35:29 +09:00
let wnd: BrowserWindow | null = null;
2021-01-10 03:04:30 +09:00
const createWindow = async () => {
2021-01-12 03:35:29 +09:00
wnd = new BrowserWindow({
2021-01-10 03:04:30 +09:00
width: 800,
height: 600,
center: true,
useContentSize: true,
2021-01-16 21:22:30 +09:00
webPreferences:{
preload:join(__dirname,'preload.js'),
contextIsolation:true,
}
2021-01-10 03:04:30 +09:00
});
2021-01-15 18:43:36 +09:00
await wnd.loadURL(`data:text/html;base64,`+Buffer.from(loading_html).toString('base64'));
//await wnd.loadURL('../loading.html');
2021-01-16 21:22:30 +09:00
//set admin cookies.
2021-01-10 14:45:34 +09:00
await session.defaultSession.cookies.set({
url:`http://localhost:${setting.port}`,
2021-01-11 03:14:29 +09:00
name:accessTokenName,
value:getAdminAccessTokenValue(),
httpOnly: true,
secure: false,
sameSite:"strict"
});
await session.defaultSession.cookies.set({
url:`http://localhost:${setting.port}`,
name:refreshTokenName,
value:getAdminRefreshTokenValue(),
2021-01-10 14:45:34 +09:00
httpOnly: true,
secure: false,
sameSite:"strict"
});
2021-01-10 03:12:51 +09:00
try{
const server = await create_server();
2021-01-16 21:22:30 +09:00
server.start_server();
registerChannel(server.userController);
2021-01-12 03:35:29 +09:00
await wnd.loadURL(`http://localhost:${setting.port}`);
2021-01-10 03:12:51 +09:00
}
catch(e){
if(e instanceof Error){
2021-01-12 16:10:05 +09:00
await dialog.showMessageBox({
type: "error",
title:"error!",
message:e.message,
});
2021-01-10 03:12:51 +09:00
}
else{
2021-01-12 16:10:05 +09:00
await dialog.showMessageBox({
type: "error",
title:"error!",
message:String(e),
});
2021-01-10 03:12:51 +09:00
}
}
2021-01-12 03:35:29 +09:00
wnd.on("closed", () => {
wnd = null;
2021-01-10 03:04:30 +09:00
});
};
const isPrimary = app.requestSingleInstanceLock();
if (!isPrimary) {
app.quit(); //exit window
app.exit();
}
app.on("second-instance", () => {
2021-01-12 03:35:29 +09:00
if (wnd != null) {
if (wnd.isMinimized()) {
wnd.restore();
2021-01-10 03:04:30 +09:00
}
2021-01-12 03:35:29 +09:00
wnd.focus();
2021-01-10 03:04:30 +09:00
}
});
app.on("ready", (event, info) => {
createWindow();
});
app.on("window-all-closed", () => { // quit when all windows are closed
if (process.platform != "darwin") app.quit(); // (except leave MacOS app active until Cmd+Q)
});
app.on("activate", () => { // re-recreate window when dock icon is clicked and no other windows open
2021-01-12 03:35:29 +09:00
if (wnd == null) createWindow();
2021-01-10 03:04:30 +09:00
});
} else {
(async () => {
const server = await create_server();
2021-01-16 21:22:30 +09:00
server.start_server();
2021-01-10 03:04:30 +09:00
})();
}
2021-01-15 18:43:36 +09:00
const loading_html = `<!DOCTYPE html>
<html lang="ko"><head>
<meta charset="UTF-8">
<title>loading</title>
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'
fonts.googleapis.com; font-src 'self' fonts.gstatic.com">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<style>
body { margin-top: 100px; background-color: #3f51b5; color: #fff; text-align:center; }
h1 {
font: 2em 'Roboto', sans-serif;
margin-bottom: 40px;
}
#loading {
display: inline-block;
width: 50px;
height: 50px;
border: 3px solid rgba(255,255,255,.3);
border-radius: 50%;
border-top-color: #fff;
animation: spin 1s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg);}
}
</style>
<body>
<h1>Loading...</h1>
<div id="loading"></div>
</body>
</html>`;