first commit

This commit is contained in:
Sas Andy
2025-02-11 16:39:53 +07:00
commit 9a67dfeb84
7 changed files with 3993 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
# Start Generation Here
dist/
# End Generation Here
# Start Generation Here
node_modules/
# End Generation Here

23
index.html Normal file
View File

@@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'"
/>
<meta
http-equiv="X-Content-Security-Policy"
content="default-src 'self'; script-src 'self'"
/>
<title>Hello from Electron renderer!</title>
</head>
<body>
<iframe
src="https://devcpone.aplikasi.web.id/one-ui/test/vuex/cpone-antrian/"
width="100%"
height="500px"
></iframe>
</body>
</html>

130
main.js Normal file
View File

@@ -0,0 +1,130 @@
const { app, BrowserWindow, session } = require('electron/main')
const WebSocket = require('ws')
const path = require('path')
// Variabel global untuk menyimpan domain
let userDomain = '';
let wsPort = '9099';
let mainWindow = null;
const createSetupWindow = () => {
const setupWindow = new BrowserWindow({
width: 400,
height: 300,
webPreferences: {
nodeIntegration: true,
contextIsolation: false
}
});
setupWindow.loadFile('setup.html');
// Terima domain dari window setup
const { ipcMain } = require('electron');
ipcMain.on('submit-domain', (event, domain, port) => {
userDomain = domain;
wsPort = port || '9099';
setupWindow.close();
// Buat window utama setelah mendapat domain
createMainWindow();
});
}
const createMainWindow = () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
autoplayPolicy: 'no-user-gesture-required',
webSecurity: false,
nodeIntegration: true,
nodeIntegrationInWorker: true,
contextIsolation: false,
allowRunningInsecureContent: true
}
})
mainWindow.webContents.session.setPermissionRequestHandler((webContents, permission, callback) => {
if (permission === 'media') {
callback(true);
}
});
// Set CSP dengan domain yang sudah diinput
mainWindow.webContents.session.webRequest.onHeadersReceived((details, callback) => {
callback({
responseHeaders: {
...details.responseHeaders,
'Content-Security-Policy': [`default-src 'self' 'unsafe-inline' 'unsafe-eval' https://${userDomain} wss://${userDomain}:${wsPort} ws://${userDomain}:${wsPort}`]
}
})
});
session.defaultSession.webRequest.onHeadersReceived((details, callback) => {
callback({
responseHeaders: {
...details.responseHeaders,
'Content-Security-Policy': [`default-src 'self' 'unsafe-inline' 'unsafe-eval' https://${userDomain} wss://${userDomain}:${wsPort} ws://${userDomain}:${wsPort}`]
}
})
});
mainWindow.webContents.session.webRequest.onBeforeSendHeaders((details, callback) => {
callback({
requestHeaders: {
...details.requestHeaders,
'Access-Control-Allow-Origin': '*'
}
});
});
// Load URL dengan domain yang sudah diinput
mainWindow.loadURL(`https://${userDomain}/one-ui/test/vuex/cpone-antrian/`);
// Inisialisasi WebSocket setelah window utama dibuat
connectWebSocket();
}
app.on('certificate-error', (event, webContents, url, error, certificate, callback) => {
event.preventDefault();
callback(true);
});
app.whenReady().then(() => {
createSetupWindow() // Mulai dengan window setup terlebih dahulu
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createSetupWindow()
}
})
})
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})
function connectWebSocket() {
try {
ws = new WebSocket(`wss://${userDomain}:${wsPort}/`);
ws.addEventListener('open', (event) => {
console.log('WebSocket Connected');
});
ws.addEventListener('error', (error) => {
console.error('WebSocket Error:', error);
});
ws.addEventListener('close', (event) => {
console.log('WebSocket Closed:', event.code, event.reason);
setTimeout(connectWebSocket, 5000);
});
} catch (error) {
console.error('Error creating WebSocket:', error);
setTimeout(connectWebSocket, 5000);
}
}

3748
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

23
package.json Normal file
View File

@@ -0,0 +1,23 @@
{
"name": "queue-display-sampling",
"version": "1.0.0",
"description": "queue display sampling",
"main": "main.js",
"scripts": {
"start": "electron .",
"build": "electron-builder",
"build:win": "electron-builder --win",
"build:mac": "electron-builder --mac",
"build:linux": "electron-builder --linux"
},
"author": "sas",
"license": "ISC",
"devDependencies": {
"electron": "^34.1.1",
"electron-builder": "^24.13.3"
},
"dependencies": {
"electron-updater": "^6.1.7",
"ws": "^8.18.0"
}
}

0
readme.md Normal file
View File

63
setup.html Normal file
View File

@@ -0,0 +1,63 @@
<!DOCTYPE html>
<html>
<head>
<title>Setup Domain</title>
<style>
body {
font-family: Arial, sans-serif;
padding: 20px;
}
.form-group {
margin-bottom: 15px;
}
label {
display: block;
margin-bottom: 5px;
}
input {
width: 100%;
padding: 8px;
margin-bottom: 10px;
}
button {
padding: 10px 20px;
background-color: #4caf50;
color: white;
border: none;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}
</style>
</head>
<body>
<div class="form-group">
<label for="domain">Domain (tanpa https://)</label>
<input
type="text"
id="domain"
placeholder="Contoh: devcpone.aplikasi.web.id"
/>
</div>
<div class="form-group">
<label for="port">Port WebSocket</label>
<input type="text" id="port" value="9099" />
</div>
<button onclick="submitDomain()">Simpan</button>
<script>
const { ipcRenderer } = require("electron");
function submitDomain() {
const domain = document.getElementById("domain").value;
const port = document.getElementById("port").value;
if (domain) {
ipcRenderer.send("submit-domain", domain, port);
} else {
alert("Mohon masukkan domain");
}
}
</script>
</body>
</html>