Skip to content

Commit 55637e4

Browse files
committed
move module installer startup to background process, fixes : 69
1 parent 23cac76 commit 55637e4

3 files changed

Lines changed: 86 additions & 34 deletions

File tree

module_installer/formatter.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
const { exec, execSync } = require("child_process");
2+
const path=require('path')
3+
const os= require('os')
4+
const fs = require('fs')
5+
const formatter=require(__dirname+'/'+'formatModuleInfo.js')
6+
const modules_url ="https://modules.magicmirror.builders/data/modules.json"
7+
const module_form_template=__dirname+"/module_schema_template.json"
8+
const module_selector_form=__dirname+"/module_selector_schema.json"
9+
const module_url_hash=__dirname+"/../module_url_hash.json"
10+
const modules_location=__dirname+"/../../../modules"
11+
const formTail = ", \"installable\":[]\n}}"
12+
13+
async function buildFormData(/*NodeHelper,*/ sortOrder, debug){
14+
// get the latest data from the 3rd party repo
15+
//console.log("entered buildformdata")
16+
const response = await fetch(modules_url);
17+
if (!response.ok) {
18+
const message = `An error occured: ${response.status}`;
19+
throw new Error(message);
20+
}
21+
//console.log("fetch conmpleted")
22+
// we need the json
23+
const responseData = await response.json();
24+
//console.log("have form data l="+responseData.length)
25+
26+
// Extract modules array from the new API structure
27+
const modulesArray = responseData.modules || responseData;
28+
29+
// format in category and in category sorted as requested (date or time)
30+
let data = await formatter(modulesArray, sortOrder, debug)
31+
//console.log("back from formatter")
32+
// make the form for the installer page
33+
let newformdata=fs.readFileSync(module_form_template)+'"categories":'+JSON.stringify(data.categories,null,2)+formTail
34+
// save it for page load
35+
formdata=newformdata
36+
// write it out for next time start
37+
// write it out to be loaded by installer page
38+
fs.writeFileSync(module_selector_form, newformdata)
39+
// write out the updated url hash (adds/deletes done twice a day)
40+
fs.writeFileSync(module_url_hash, JSON.stringify(data.hash, null, 2))
41+
// async, return something
42+
return true
43+
}
44+
45+
let sortOrder=process.argv[2];
46+
let debug= false
47+
//console.log("args=",process.argv)
48+
if(process.argv.length>2){
49+
if(process.argv[3]==='debug')
50+
debug = true
51+
}
52+
// check to see if url hash exists, and is complete
53+
fs.stat(module_url_hash, (err, stats) => {
54+
//console.log("module hash stat rc="+err)
55+
if (!err){ // found it, background process not processing
56+
if(stats.size>200000){ // if large, should be done processing
57+
//console.log("module hash stat size="+stats.size)
58+
buildFormData(sortOrder, debug) // so we can check and update
59+
}
60+
}
61+
});

module_installer/geturlcontents.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
#!/bin/bash
1+
#!/bin/bash
22

33
curl_found=$(which curl | wc -l)
44
wget_found=$(which wget | wc -l)
55

66
url=$1
77

8-
if [ $curl_found -gt 0 ]; then
9-
curl -sL $url stdout 2>/dev/null
10-
elif [ $wget_found -gt 0 ]; then
8+
if [ $wget_found -gt 0 ]; then
119
wget -O - $url 2>/dev/null
10+
elif [ $curl_found -gt 0 ]; then
11+
curl -sL $url stdout 2>/dev/null
1212
fi
1313

module_installer/runserver.js

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ var processList=[]
3434
let in_docker_container = false
3535

3636
// the generated module list form
37-
let formdata
37+
let formdata=null
3838

3939
const Configurator_in_config_file = false
4040

@@ -151,34 +151,15 @@ async function setupServer(expressApp, sortOrder){
151151
}
152152

153153
async function buildFormData(/*NodeHelper,*/ sortOrder){
154+
// used to do this inline, but it blocked MM startup,
155+
// takes minutes to sync the initial module list
154156
// get the latest data from the 3rd party repo
155-
//console.log("entered buildformdata")
156-
const response = await fetch(modules_url);
157-
if (!response.ok) {
158-
const message = `An error occured: ${response.status}`;
159-
throw new Error(message);
160-
}
161-
//console.log("fetch conmpleted")
162-
// we need the json
163-
const responseData = await response.json();
164-
//console.log("have form data l="+responseData.length)
165-
166-
// Extract modules array from the new API structure
167-
const modulesArray = responseData.modules || responseData;
168-
169-
// format in category and in category sorted as requested (date or time)
170-
let data = await formatter(modulesArray, sortOrder, true /*local_debug*/)
171-
//console.log("back from formatter")
172-
// make the form for the installer page
173-
let newformdata=fs.readFileSync(module_form_template)+'"categories":'+JSON.stringify(data.categories,null,2)+formTail
174-
// save it for page load
175-
formdata=newformdata
176-
// write it out for next time start
177-
// write it out to be loaded by installer page
178-
fs.writeFileSync(module_selector_form, newformdata)
179-
// write out the updated url hash (adds/deletes done twice a day)
180-
fs.writeFileSync(module_url_hash, JSON.stringify(data.hash, null, 2))
181-
// async, return something
157+
// execute the 3rd party module jsonform creator in the background
158+
const cmdstring="node "+__dirname+"/formatter.js "+sortOrder
159+
//console.log("cmdstring="+cmdstring+" cwd="+process.cwd())
160+
exec(cmdstring, { cwd: __dirname })
161+
// indicate we are working on new data
162+
formdata=null;
182163
return true
183164
}
184165

@@ -222,14 +203,24 @@ function handleConnection(socket, type) {
222203
console.log("cancel requested")
223204
console.log("cancel received, closing installer")
224205
socket.emit("close")
225-
// setTimeout(()=>{process.exit(1)}, 3000)
226206
}
227207
});
228208

229209
// when the page askes for form
230210
socket.on("getForm", () => {
231211
if(local_debug)
232-
console.log("form requested")
212+
console.log("installer form requested")
213+
// if we haven't loaded the 3rd party modules form for installer
214+
if(!formdata){
215+
// if the file exists
216+
if(fs.statSync(module_selector_form))
217+
// load it as text
218+
formdata=fs.readFileSync(module_selector_form, "utf8");
219+
else
220+
// for didn't exist, don't send junk
221+
// user will have to hit refresh to load the page html which will request again
222+
return
223+
}
233224
// send it via socket io, string data
234225
socket.emit("json", "'" + formdata + "'");
235226
});

0 commit comments

Comments
 (0)