diff options
Diffstat (limited to 'resources/js/main.js')
| -rw-r--r-- | resources/js/main.js | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/resources/js/main.js b/resources/js/main.js new file mode 100644 index 0000000..14a64dc --- /dev/null +++ b/resources/js/main.js @@ -0,0 +1,302 @@ +import { io } from './socket.io.esm.min.js'; +import { drawScene } from './drawer.js'; + +const CHUNK_SIZE = 4 * 1024 * 1024; // 4MB chunks +const FILESIZE_THRESHOLD = 16 * 1024 * 1024; // 16MB // how big before use chunked upload +const MAXFILESIZE = 2048 * 1024 * 1024; // 2GB +const API_URL = 'http://192.168.4.32:9002'; +//const WS_URL = 'ws://localhost:80'; //10.50.231.35:80'; // belthelziquor.com:443'; //TODO get from cfg or env var +const WS_URL = 'wss://belthelziquor.com:443'; +//const API_URL = 'http://localhost:9002'; +const color_bg = "#dedede"; +//TODO change color based on time + +var ctx = null; +var cnv = null; +var W = 800; +var H = 600; +var socket = null; +var myID; + +var elemNumConnected; + +//each connected client. same format as server's model +var friends = { + +}; + +var me = [0,0]; //my cursor position +var myNickname = ''; + +var domElems = {}; + +function prepareFileInput(){ + var file_input = domElems.inputFile; + var files = file_input.files; + for (f in files) { + console.log(f); + } + //TODO validation + domElems.buttonFileUpload.enabled = true; +} + +//APP START HERE +$(document).ready(function() { + cnv = $('#bg')[0]; + if (cnv != null) { + getServerEnvVars(); + initDOM(); + + ctx = cnv.getContext("2d"); + W = window.outerWidth; + H = window.outerHeight; + cnv.width = W; + cnv.height = H; + ctx.fillStyle = color_bg; + ctx.fillRect(0,0,W,H); + + if (connectWebSocket()){ + setInterval(() => { + socket.emit('update_pos', {pos: me, nick: myNickname}); + }, 100); + } else { + console.error('Failed to connect web sockets'); + domElems.debugInfo.innerHTML = 'Unable to connect to web socket server'; + } + document.onmousemove = (e) => handleMouseMove(e); + setInterval(() => { + draw(); + }, 20); + window.addEventListener('resize', resizeCanvas); + } else { + console.error('Canvas element not found'); + } + +}); +/* +var canvas = document.getElementById('canvas');// $('#canvas')[0]; +console.log(canvas); +var context = canvas.getContext("2d"); +*/ + + + +function getServerEnvVars(){ + axios.get('/env').then((res)=>{ + console.log(res);//TODO set api url from this + }); +} + +//initial setup such as hiding/showing certain things +function initDOM(){ + $('#fileupload')[0].hidden = false; + domElems.numConnected = $('#numFriendsConnected')[0]; + domElems.inputFile = $('#f')[0]; + domElems.debugInfo = $('#debugInfo')[0]; + domElems.fileUploadResult = $('#fileupload_result')[0]; + domElems.inputFile.onchange = prepareFileInput; + domElems.buttonFileUpload = $('#button_fileupload')[0]; + //domElems.buttonFileUpload.enabled = false; + domElems.buttonFileUpload.onclick = uploadFile; + domElems.inputWho = $('#input_who')[0]; + domElems.inputWho.onchange = ()=> { myNickname = domElems.inputWho.value; }; +} + +function resizeCanvas() { + W = window.outerWidth; + H = window.outerHeight; + cnv.width = W; + cnv.height = H; +} + +//todo move the old code from file stuff etc to other file so that this file can be just for the canvas+graphics+networkedgame part of the client app +async function uploadFile() { + var files = domElems.inputFile.files; + domElems.buttonFileUpload.enabled = false; + let formData = new FormData(); + console.log(files); + for (let i = 0; i < files.length; i++) { + formData.append('f[]', files[i], files[i].name); + } + + axios.post('/f', formData, {headers: {'Content-Type': 'multipart/form-data'}}) + .then((res)=>{ + console.log(res); + domElems.fileUploadResult.innerHTML = 'File uploaded successfully<br>'; + res.data.files.forEach((f)=>{ + domElems.fileUploadResult.innerHTML += `<a href = "f/${f.filename}">${f.filename}</a><br>`; + }); + domElems.inputFile.value = null; + domElems.buttonFileUpload.enabled = true; + }) + .catch((err)=>{ + console.log(err); + domElems.fileUploadResult.innerHTML = 'Error uploading file'; + domElems.buttonFileUpload.enabled = true; + }); +} + +async function uploadFileChunked(f){ + const totalChunks = Math.ceil(file.size / CHUNK_SIZE); + const filename = file.name; + + for (let chunkNumber = 0; chunkNumber < totalChunks; chunkNumber++) { + const chunk = file.slice(chunkNumber * CHUNK_SIZE, (chunkNumber + 1) * CHUNK_SIZE); + const formData = new FormData(); + formData.append('file', chunk); + formData.append('filename', filename); + formData.append('chunkNumber', chunkNumber); + formData.append('totalChunks', totalChunks); + + try { + const response = await fetch(`${API_URL}/uploadfiles`, { + method: 'POST', + body: formData + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + updateProgress(chunkNumber + 1, totalChunks); + + } catch (error) { + console.error('Error uploading chunk:', error); + alert('Error uploading file. Please try again.'); + return; + } + } +} + +async function uploadFileSingle(f){ + const formData = new FormData(); + formData.append('f', f); + const res = await fetch(`${API_URL}/uploadfiles`, { + method: 'POST', + body: formData, + credentials: 'include' + }); + console.log(res); +} + +function updateProgress(currentChunk, totalChunks) { + const progressPercentage = Math.round((currentChunk / totalChunks) * 100); + document.getElementById('progress').textContent = `${progressPercentage}% uploaded`; +} + + +function connectWebSocket(){ + try { + socket = io(WS_URL, { + secure: true, + rejectUnauthorized: false + }); + socket.on('connect_error', (err) => { + console.log('connection error'); + console.log(err); + //TODO $('').textContent = err; + }); + socket.on('connect_failed', (err) => { + console.log('conn failed'); + console.log(err); + //TODO $('').textContent = err; + }); + socket.on('disconnect', (err) => { + console.log('disconnected'); + console.log(err); + //TODO $('').textContent = err; + }); + socket.on('connect', (err) => { + console.log('connected'); + if (err) console.log(err); + //TODO $('').textContent = 'Connected'; + socket.pingTimeout = 1000; + socket.pingInterval = 500; + }); + socket.on('syncCanvas', (data) => { + //TODO appShapes = data.shapes; + //TODO ClearBake(); + //TODO DrawCanvas(); + //TODO $('').textContent = 'Synced'; + }); + socket.on('init', (id) => { + myID = id; + }); + + //sync data from server. this is the data from server that should be replicated on each client + socket.on('sync_data', (data) => { + //data is a map of client id to client payload data (currently just the screen position) + friends = {}; + for (const cid in data){ + if (cid == myID){ + continue; + } + friends[cid] = data[cid]; + } + domElems.numConnected.innerHTML = Object.keys(friends).length + 1; + }); + return true; + } catch (err) { + console.error(err); + return false; + } +} + + +function draw() { + //draw background + ctx.fillStyle = color_bg; + ctx.fillRect(0,0,W,H); + + //draw me + ctx.fillStyle = "#000000"; + ctx.fillRect(me[0], me[1], 4, 4); + if (myNickname != ''){ + ctx.fillText(myNickname, me[0], me[1]); + } + + //draw friends + Object.keys(friends).forEach((fid)=>{ + ctx.fillStyle = "#050505"; + let x = friends[fid].pos[0]; + let y =friends[fid].pos[1]; + ctx.fillRect(x, y, 6, 6); + if (friends[fid].nick != ''){ + ctx.fillText(friends[fid].nick, x, y); + } + }); + + drawScene(ctx); + +} + +function getMousePos(canvas, evt) { + var rect = canvas.getBoundingClientRect(); + /*return { + x: evt.clientX - rect.left, + y: evt.clientY - rect.top + };*/ + return [evt.clientX - rect.left, evt.clientY - rect.top]; +} + + +function handleMouseMove(e) { + var eDoc, doc, body; + e = e || window.event; // IE-ism + // If pageX/Y aren't available and clientX/Y are, + // calculate pageX/Y - logic taken from jQuery. + // (This is to support old IE) + if (e.pageX == null && e.clientX != null) { + eventDoc = (e.target && e.target.ownerDocument) || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + e.pageX = e.clientX + + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - + (doc && doc.clientLeft || body && body.clientLeft || 0); + e.pageY = e.clientY + + (doc && doc.scrollTop || body && body.scrollTop || 0) - + (doc && doc.clientTop || body && body.clientTop || 0 ); + } + me = getMousePos(cnv, e); +}
\ No newline at end of file |
