Spaces:
Running
Running
Commit
·
40f2f07
1
Parent(s):
c760b14
Add async flow
Browse files- app.js +68 -31
- index.html +22 -7
- package-lock.json +0 -0
- package.json +2 -1
app.js
CHANGED
|
@@ -8,7 +8,7 @@ const { ZipFiles, UnzipFiles } = require('common-utils');
|
|
| 8 |
const OracleStorage = require('./common-creds/oracle/storage.json');
|
| 9 |
const axios = require('axios');
|
| 10 |
const { spawn, exec } = require('child_process');
|
| 11 |
-
|
| 12 |
let pl = {
|
| 13 |
onLog: console.log
|
| 14 |
}
|
|
@@ -77,6 +77,7 @@ function render() {
|
|
| 77 |
})
|
| 78 |
}
|
| 79 |
|
|
|
|
| 80 |
|
| 81 |
function modifyFiles(originalManuscript) {
|
| 82 |
|
|
@@ -94,28 +95,43 @@ function modifyFiles(originalManuscript) {
|
|
| 94 |
fs.writeFileSync(fnameTarget, SequentialSceneText.replace("{getScene(contents[0])}", seqScene));
|
| 95 |
|
| 96 |
}
|
|
|
|
| 97 |
async function extract(filePath) {
|
| 98 |
await UnzipFiles(filePath, './public')
|
| 99 |
}
|
| 100 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
const app = express()
|
| 102 |
app.all('/clear', async (req, res) => {
|
| 103 |
-
const foldersToPreserve = ['assets', 'mp3'];
|
| 104 |
let cacheDirPath = path.join(__dirname, "./public")
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
const filePath = path.join(cacheDirPath, file);
|
| 108 |
-
if (fs.statSync(filePath).isDirectory()) {
|
| 109 |
-
if (!foldersToPreserve.includes(file)) {
|
| 110 |
-
fs.rmdirSync(filePath, { recursive: true });
|
| 111 |
-
console.log(`Deleted directory: ${filePath}`);
|
| 112 |
-
}
|
| 113 |
-
} else {
|
| 114 |
-
fs.unlinkSync(filePath);
|
| 115 |
-
console.log(`Deleted file: ${filePath}`);
|
| 116 |
-
}
|
| 117 |
-
|
| 118 |
-
});
|
| 119 |
res.send("Cache Cleared")
|
| 120 |
})
|
| 121 |
|
|
@@ -125,14 +141,26 @@ app.all('/config', (req, res) => {
|
|
| 125 |
})
|
| 126 |
})
|
| 127 |
|
|
|
|
| 128 |
let waiter = new Promise((resolve) => {
|
| 129 |
resolve()
|
| 130 |
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 131 |
app.all('/render', async (req, res) => {
|
| 132 |
await waiter
|
| 133 |
-
let resolver = () => {
|
|
|
|
|
|
|
| 134 |
waiter = new Promise((resolve) => {
|
| 135 |
-
resolver =
|
|
|
|
|
|
|
|
|
|
| 136 |
})
|
| 137 |
const perf = new PerformanceRecorder()
|
| 138 |
perf.reset()
|
|
@@ -155,23 +183,25 @@ app.all('/render', async (req, res) => {
|
|
| 155 |
})
|
| 156 |
}
|
| 157 |
let manuObj = JSON.parse(fs.readFileSync(manuFile).toString())
|
|
|
|
|
|
|
| 158 |
modifyFiles(manuObj)
|
| 159 |
const uploader = new FileUploader('oracle', OracleStorage.semibit_media)
|
| 160 |
-
|
| 161 |
if (!skipRender) {
|
| 162 |
-
|
| 163 |
-
|
|
|
|
| 164 |
'content-type': 'application/json'
|
| 165 |
})
|
| 166 |
let cb = async (result) => {
|
| 167 |
perf.end()
|
| 168 |
console.log('Took', perf.elapsedString(), 'to render')
|
| 169 |
-
|
| 170 |
-
let uploadResult = await uploader.upload(
|
| 171 |
-
sendToObserver(
|
| 172 |
res.write(JSON.stringify({
|
| 173 |
status: result,
|
| 174 |
-
job_id:
|
| 175 |
url: uploadResult.url,
|
| 176 |
time_taken: perf.elapsedString()
|
| 177 |
}))
|
|
@@ -182,13 +212,20 @@ app.all('/render', async (req, res) => {
|
|
| 182 |
cb = async () => {
|
| 183 |
console.log('Took', perf.elapsedString(), 'to render')
|
| 184 |
resolver()
|
| 185 |
-
|
| 186 |
-
let uploadResult = await uploader.upload(
|
| 187 |
-
sendToObserver(
|
| 188 |
-
|
| 189 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
}
|
| 191 |
-
doRender(
|
| 192 |
}
|
| 193 |
else {
|
| 194 |
console.log('Skipping render')
|
|
@@ -196,7 +233,7 @@ app.all('/render', async (req, res) => {
|
|
| 196 |
res.send({
|
| 197 |
status: result,
|
| 198 |
message: 'render skipped',
|
| 199 |
-
job_id:
|
| 200 |
})
|
| 201 |
}
|
| 202 |
|
|
|
|
| 8 |
const OracleStorage = require('./common-creds/oracle/storage.json');
|
| 9 |
const axios = require('axios');
|
| 10 |
const { spawn, exec } = require('child_process');
|
| 11 |
+
const { FireStoreDB } = require('multi-db-orm')
|
| 12 |
let pl = {
|
| 13 |
onLog: console.log
|
| 14 |
}
|
|
|
|
| 77 |
})
|
| 78 |
}
|
| 79 |
|
| 80 |
+
const db = new FireStoreDB(path.join(__dirname, 'common-creds/firebase/semibitmedia.json'))
|
| 81 |
|
| 82 |
function modifyFiles(originalManuscript) {
|
| 83 |
|
|
|
|
| 95 |
fs.writeFileSync(fnameTarget, SequentialSceneText.replace("{getScene(contents[0])}", seqScene));
|
| 96 |
|
| 97 |
}
|
| 98 |
+
|
| 99 |
async function extract(filePath) {
|
| 100 |
await UnzipFiles(filePath, './public')
|
| 101 |
}
|
| 102 |
|
| 103 |
+
async function generateOutputBundle(jobId) {
|
| 104 |
+
let outDir = path.join(__dirname, 'out')
|
| 105 |
+
let outFile = path.join(__dirname, 'out', `${jobId}.zip`)
|
| 106 |
+
let manuFile = path.join(__dirname, `public/original_manuscript.json`)
|
| 107 |
+
fs.copyFileSync(manuFile, path.join(__dirname, 'out', `original_manuscript.json`))
|
| 108 |
+
let outputFiles = fs.readdirSync(outDir)
|
| 109 |
+
.map(fname => {
|
| 110 |
+
const filePath = path.join(outDir, fname);
|
| 111 |
+
return filePath
|
| 112 |
+
})
|
| 113 |
+
await ZipFiles(outputFiles, outFile)
|
| 114 |
+
return outFile
|
| 115 |
+
}
|
| 116 |
+
|
| 117 |
+
async function notify(jobId, origManu, outputUrl, status, time_taken) {
|
| 118 |
+
origManu.meta.render = {
|
| 119 |
+
output_url: outputUrl,
|
| 120 |
+
status: status,
|
| 121 |
+
time_taken: time_taken,
|
| 122 |
+
id: jobId
|
| 123 |
+
}
|
| 124 |
+
if (origManu.meta.callback_url) {
|
| 125 |
+
let cbRes = await axios.post(origManu.meta.callback_url, origManu.meta)
|
| 126 |
+
console.log('On Render Completed Callback', cbRes.data)
|
| 127 |
+
}
|
| 128 |
+
}
|
| 129 |
+
|
| 130 |
const app = express()
|
| 131 |
app.all('/clear', async (req, res) => {
|
| 132 |
+
const foldersToPreserve = ['assets', 'mp3', 'original_manuscript.json'];
|
| 133 |
let cacheDirPath = path.join(__dirname, "./public")
|
| 134 |
+
Utils.clearFolder(cacheDirPath, foldersToPreserve)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
res.send("Cache Cleared")
|
| 136 |
})
|
| 137 |
|
|
|
|
| 141 |
})
|
| 142 |
})
|
| 143 |
|
| 144 |
+
var currentRenderJobId = undefined
|
| 145 |
let waiter = new Promise((resolve) => {
|
| 146 |
resolve()
|
| 147 |
})
|
| 148 |
+
app.all('/busy', async (req, res) => {
|
| 149 |
+
res.send({
|
| 150 |
+
job_id: currentRenderJobId,
|
| 151 |
+
busy: currentRenderJobId != undefined
|
| 152 |
+
})
|
| 153 |
+
})
|
| 154 |
app.all('/render', async (req, res) => {
|
| 155 |
await waiter
|
| 156 |
+
let resolver = () => {
|
| 157 |
+
currentRenderJobId = undefined
|
| 158 |
+
}
|
| 159 |
waiter = new Promise((resolve) => {
|
| 160 |
+
resolver = () => {
|
| 161 |
+
currentRenderJobId = undefined
|
| 162 |
+
resolve()
|
| 163 |
+
}
|
| 164 |
})
|
| 165 |
const perf = new PerformanceRecorder()
|
| 166 |
perf.reset()
|
|
|
|
| 183 |
})
|
| 184 |
}
|
| 185 |
let manuObj = JSON.parse(fs.readFileSync(manuFile).toString())
|
| 186 |
+
currentRenderJobId = manuObj.id
|
| 187 |
+
let jobID = manuObj.id
|
| 188 |
modifyFiles(manuObj)
|
| 189 |
const uploader = new FileUploader('oracle', OracleStorage.semibit_media)
|
|
|
|
| 190 |
if (!skipRender) {
|
| 191 |
+
Utils.clearFolder(path.join(__dirname, 'out'))
|
| 192 |
+
res.writeHead(200, jobID, {
|
| 193 |
+
'job_id': jobID,
|
| 194 |
'content-type': 'application/json'
|
| 195 |
})
|
| 196 |
let cb = async (result) => {
|
| 197 |
perf.end()
|
| 198 |
console.log('Took', perf.elapsedString(), 'to render')
|
| 199 |
+
let outFile = await generateOutputBundle(jobID)
|
| 200 |
+
let uploadResult = await uploader.upload(outFile)
|
| 201 |
+
sendToObserver(jobID, uploadResult.url)
|
| 202 |
res.write(JSON.stringify({
|
| 203 |
status: result,
|
| 204 |
+
job_id: jobID,
|
| 205 |
url: uploadResult.url,
|
| 206 |
time_taken: perf.elapsedString()
|
| 207 |
}))
|
|
|
|
| 212 |
cb = async () => {
|
| 213 |
console.log('Took', perf.elapsedString(), 'to render')
|
| 214 |
resolver()
|
| 215 |
+
let outFile = await generateOutputBundle(jobID)
|
| 216 |
+
let uploadResult = await uploader.upload(outFile)
|
| 217 |
+
sendToObserver(jobID, uploadResult.url)
|
| 218 |
+
notify(jobID, manuObj, uploadResult.url, 'SUCCESS', perf.elapsedString())
|
| 219 |
}
|
| 220 |
+
res.write(JSON.stringify({
|
| 221 |
+
status: 'SCHEDULED',
|
| 222 |
+
message: 'render started',
|
| 223 |
+
job_id: jobID,
|
| 224 |
+
callback_url: manuObj.meta.callback_url
|
| 225 |
+
}))
|
| 226 |
+
res.end()
|
| 227 |
}
|
| 228 |
+
doRender(jobID, cb)
|
| 229 |
}
|
| 230 |
else {
|
| 231 |
console.log('Skipping render')
|
|
|
|
| 233 |
res.send({
|
| 234 |
status: result,
|
| 235 |
message: 'render skipped',
|
| 236 |
+
job_id: jobID
|
| 237 |
})
|
| 238 |
}
|
| 239 |
|
index.html
CHANGED
|
@@ -37,9 +37,21 @@
|
|
| 37 |
|
| 38 |
<script src="https://code.getmdl.io/1.3.0/material.min.js"></script>
|
| 39 |
<script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
async function uploadFile() {
|
| 41 |
-
const fileInput = document.getElementById('fileInput');
|
| 42 |
-
const statusMessage = document.getElementById('statusMessage');
|
| 43 |
|
| 44 |
if (fileInput.files.length === 0) {
|
| 45 |
statusMessage.textContent = 'Please select a file.';
|
|
@@ -86,12 +98,7 @@
|
|
| 86 |
statusMessage.textContent = 'Error uploading file: ' + error.message;
|
| 87 |
}
|
| 88 |
}
|
| 89 |
-
</script>
|
| 90 |
-
|
| 91 |
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
<script>
|
| 95 |
const socket = io();
|
| 96 |
const subscriptionForm = document.getElementById('subscribeJob');
|
| 97 |
subscriptionForm.addEventListener('click', (event) => {
|
|
@@ -110,6 +117,14 @@
|
|
| 110 |
str = JSON.stringify(str)
|
| 111 |
listItem.textContent = `${str}`;
|
| 112 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
</script>
|
| 114 |
</body>
|
| 115 |
|
|
|
|
| 37 |
|
| 38 |
<script src="https://code.getmdl.io/1.3.0/material.min.js"></script>
|
| 39 |
<script>
|
| 40 |
+
function getParameterByName(name, url) {
|
| 41 |
+
if (!url) url = window.location.href;
|
| 42 |
+
name = name.replace(/[\[\]]/g, '\\$&');
|
| 43 |
+
var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
|
| 44 |
+
results = regex.exec(url);
|
| 45 |
+
if (!results) return null;
|
| 46 |
+
if (!results[2]) return '';
|
| 47 |
+
return decodeURIComponent(results[2].replace(/\+/g, ' '));
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
const fileInput = document.getElementById('fileInput');
|
| 51 |
+
const statusMessage = document.getElementById('statusMessage');
|
| 52 |
+
|
| 53 |
+
|
| 54 |
async function uploadFile() {
|
|
|
|
|
|
|
| 55 |
|
| 56 |
if (fileInput.files.length === 0) {
|
| 57 |
statusMessage.textContent = 'Please select a file.';
|
|
|
|
| 98 |
statusMessage.textContent = 'Error uploading file: ' + error.message;
|
| 99 |
}
|
| 100 |
}
|
|
|
|
|
|
|
| 101 |
|
|
|
|
|
|
|
|
|
|
| 102 |
const socket = io();
|
| 103 |
const subscriptionForm = document.getElementById('subscribeJob');
|
| 104 |
subscriptionForm.addEventListener('click', (event) => {
|
|
|
|
| 117 |
str = JSON.stringify(str)
|
| 118 |
listItem.textContent = `${str}`;
|
| 119 |
});
|
| 120 |
+
|
| 121 |
+
|
| 122 |
+
var jobId = getParameterByName('job_id');
|
| 123 |
+
if (jobId) {
|
| 124 |
+
document.getElementById('jobId').value = jobId
|
| 125 |
+
const subscriptionForm = document.getElementById('subscribeJob');
|
| 126 |
+
subscriptionForm.click()
|
| 127 |
+
}
|
| 128 |
</script>
|
| 129 |
</body>
|
| 130 |
|
package-lock.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
package.json
CHANGED
|
@@ -51,6 +51,7 @@
|
|
| 51 |
"firebase-functions": "^4.4.1",
|
| 52 |
"fs-extra": "^11.1.1",
|
| 53 |
"i": "^0.3.7",
|
|
|
|
| 54 |
"npm": "^9.8.1",
|
| 55 |
"path": "^0.12.7",
|
| 56 |
"react": "^18.0.0",
|
|
@@ -67,4 +68,4 @@
|
|
| 67 |
"zod": "^3.21.4"
|
| 68 |
},
|
| 69 |
"packageManager": "npm@8.19.4"
|
| 70 |
-
}
|
|
|
|
| 51 |
"firebase-functions": "^4.4.1",
|
| 52 |
"fs-extra": "^11.1.1",
|
| 53 |
"i": "^0.3.7",
|
| 54 |
+
"multi-db-orm": "^1.3.0",
|
| 55 |
"npm": "^9.8.1",
|
| 56 |
"path": "^0.12.7",
|
| 57 |
"react": "^18.0.0",
|
|
|
|
| 68 |
"zod": "^3.21.4"
|
| 69 |
},
|
| 70 |
"packageManager": "npm@8.19.4"
|
| 71 |
+
}
|