Skip to content

Commit df63111

Browse files
committed
add cloudcmd for web based file management
1 parent f6b8680 commit df63111

File tree

5 files changed

+93
-35
lines changed

5 files changed

+93
-35
lines changed

index.js

+45-33
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,21 @@ var fs = require('fs');
55
var fsw = require('fs').promises;
66
var util = require('util');
77
var path = require('path');
8+
var cloudcmd = require('cloudcmd');
9+
var express = require('express');
10+
var app = require('express')();
11+
var http = require('http').Server(app);
12+
var baserouter = express.Router();
813
var { spawn } = require('child_process');
914
var { create } = require('ipfs-http-client');
1015
var ipfs = create();
1116

1217
// Default vars
18+
var baseUrl = process.env.SUBFOLDER || '/';
1319
if (fs.existsSync('/data')) {
1420
var dataRoot = '/data/';
1521
} else {
16-
var dataRoot = 'frontend/user/'
22+
var dataRoot = __dirname + '/frontend/user/'
1723
};
1824
var configPath = dataRoot + 'config/';
1925
var hashPath = dataRoot + 'hashes/';
@@ -32,42 +38,17 @@ var emus = [
3238
'segaGG', 'segaMD', 'segaMS',
3339
'segaSaturn', 'snes', 'vb', 'ws'
3440
];
35-
mimeTypes = {
36-
"html": "text/html",
37-
"jpeg": "image/jpeg",
38-
"jpg": "image/jpeg",
39-
"png": "image/png",
40-
"svg": "image/svg+xml",
41-
"json": "application/json",
42-
"js": "text/javascript",
43-
"css": "text/css"
44-
};
4541

4642
//// Http server ////
47-
var main = async function (req, res) {
48-
if (req.url == '/') {
49-
var url = '/public/index.html';
50-
} else {
51-
var url = req.url;
52-
}
53-
try {
54-
var mimeType = mimeTypes[url.split('?')[0].split('.').pop()];
55-
if (!mimeType) {
56-
mimeType = 'text/plain';
57-
}
58-
var data = await fsw.readFile(__dirname + decodeURI(url.split('?')[0]));
59-
res.writeHead(200, { "Content-Type": mimeType });
60-
res.end(data);
61-
} catch (err) {
62-
res.writeHead(404);
63-
res.end(JSON.stringify(err));
64-
};
65-
};
66-
var server = http.createServer(main);
67-
server.listen(3000);
43+
baserouter.use('/public', express.static(__dirname + '/public'));
44+
baserouter.get("/", function (req, res) {
45+
res.sendFile(__dirname + '/public/index.html');
46+
});
47+
app.use(baseUrl, baserouter);
48+
http.listen(3000);
6849

6950
//// socketIO comms ////
70-
io = socketIO(server);
51+
io = socketIO(http, {path: baseUrl + 'socket.io'});
7152
io.on('connection', async function (socket) {
7253
//// Functions ////
7354
// Send config list to client
@@ -344,6 +325,18 @@ io.on('connection', async function (socket) {
344325
getRoms(dir);
345326
};
346327

328+
// Render files page
329+
async function renderFiles() {
330+
var dirItems = await fsw.readdir(dataRoot);
331+
var dirs = [];
332+
for await (var item of dirItems) {
333+
if ((fs.lstatSync(dataRoot + item).isDirectory()) && (! /^\..*/.test(item))){
334+
dirs.push(item);
335+
};
336+
};
337+
socket.emit('renderfiledirs', dirs);
338+
};
339+
347340
// Incoming socket requests
348341
socket.on('renderconfigs', renderConfigs);
349342
socket.on('renderroms', renderRoms);
@@ -356,10 +349,29 @@ io.on('connection', async function (socket) {
356349
socket.on('addtoconfig', addToConfig);
357350
socket.on('downloadart', downloadArt);
358351
socket.on('usermeta', userMeta);
352+
socket.on('renderfiles', renderFiles);
359353
// Render landing page
360354
if (fs.existsSync(dataRoot + 'config/main.json')) {
361355
renderRoms();
362356
} else {
363357
renderLanding();
364358
};
365359
});
360+
361+
// Cloudcmd File browser
362+
baserouter.use('/files', cloudcmd({
363+
config: {
364+
root: dataRoot,
365+
prefix: baseUrl + 'files',
366+
terminal: false,
367+
console: false,
368+
configDialog: false,
369+
contact: false,
370+
auth: false,
371+
name: 'Files',
372+
log: false,
373+
keysPanel: false,
374+
oneFilePanel: true,
375+
}
376+
}));
377+

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
{
22
"name": "emulatorjs",
3-
"version": "0.3.0",
3+
"version": "0.4.0",
44
"description": "Rom and art management utility for generating configuration files for use with the EmulatorJS frontend",
55
"main": "index.js",
66
"author": "thelamer",
77
"dependencies": {
8+
"cloudcmd": "^15.9.8",
9+
"express": "^4.17.1",
810
"ipfs-http-client": "^53.0.1",
911
"socket.io": "^4.3.1"
1012
}

public/css/index.css

+9
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,15 @@
163163
text-align: center;
164164
}
165165

166+
/* File browsers */
167+
.browser {
168+
position:fixed;
169+
width: 85vw;
170+
top: 40px;
171+
right: 0;
172+
height:calc(100vh - 40px);
173+
}
174+
166175
/* CSS loading indicator */
167176
.loader,
168177
.loader:before,

public/index.html

+6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<div id="nav" class="nav">
1212
<div onclick="renderRoms()" class="top-item">Rom Management</div>
1313
<div onclick="renderConfigss()" class="top-item">Config Management</div>
14+
<div onclick="renderFiles()" class="top-item">File Management</div>
1415
</div>
1516
<div id="nav-buttons" class="nav-buttons"></div>
1617
</div>
@@ -77,6 +78,11 @@ <h1>Please Download the default fileset to begin:</h1>
7778
<button class="scanbutton hover" onclick="dlDefaultFiles()">Download</button>
7879
</div>
7980
</div>
81+
<div id="filelanding" class="hidden">
82+
<div class="centered">
83+
<h1>Choose a folder. Drag and drop files or right click to upload.</h1>
84+
</div>
85+
</div>
8086
<script src="socket.io/socket.io.js"></script>
8187
<script src="public/js/vendor/jquery.min.js"></script>
8288
<script src="public/js/vendor/jquery.modal.min.js"></script>

public/js/index.js

+30-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ socket.on('renderlanding', renderLanding);
1919
// Render modal data
2020
socket.on('modaldata', modalData);
2121
// Empty modal
22-
socket.on('emptymodal', emptyModal)
22+
socket.on('emptymodal', emptyModal);
23+
// Render file directories
24+
socket.on('renderfiledirs', renderFileDirs);
2325

2426
//// Functions ////
2527
// Grab a json file from the server
@@ -260,3 +262,30 @@ function renderLanding() {
260262
$('#main').append($('#landing').html());
261263
};
262264

265+
// Render file management
266+
function renderFiles() {
267+
$('#main').empty();
268+
$('#side').empty();
269+
$('#main').append('<div class="loader"></div>');
270+
socket.emit('renderfiles');
271+
};
272+
273+
// Render file directories
274+
function renderFileDirs(dirs) {
275+
$('#side').empty();
276+
$('#main').empty();
277+
$('#main').append($('#filelanding').html());
278+
$('#nav-buttons').empty();
279+
$.each(dirs, function(index, dir) {
280+
var sideLink = $('<div>').addClass('sideitem hover').attr('onclick', "renderFileBrowser('" + dir + "')").text(dir);
281+
$('#side').append(sideLink);
282+
});
283+
};
284+
285+
// Tell server to configure a file browser
286+
function renderFileBrowser(dir) {
287+
$('#main').empty();
288+
var url = window.location.href;
289+
var browser = $('<iframe>').attr('src', url + 'files/fs/' + dir).addClass('browser');
290+
$('#main').append(browser);
291+
};

0 commit comments

Comments
 (0)