shiveshnavin commited on
Commit
40f2f07
·
1 Parent(s): c760b14

Add async flow

Browse files
Files changed (4) hide show
  1. app.js +68 -31
  2. index.html +22 -7
  3. package-lock.json +0 -0
  4. 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
- fs.readdirSync(cacheDirPath).forEach(file => {
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 = resolve
 
 
 
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
- res.writeHead(200, manuObj.id, {
163
- 'job_id': manuObj.id,
 
164
  'content-type': 'application/json'
165
  })
166
  let cb = async (result) => {
167
  perf.end()
168
  console.log('Took', perf.elapsedString(), 'to render')
169
- fs.renameSync('out/video.mp4', `out/${manuObj.id}.mp4`)
170
- let uploadResult = await uploader.upload(`out/${manuObj.id}.mp4`)
171
- sendToObserver(manuObj.id, uploadResult.url)
172
  res.write(JSON.stringify({
173
  status: result,
174
- job_id: manuObj.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
- fs.renameSync('out/video.mp4', `out/${manuObj.id}.mp4`)
186
- let uploadResult = await uploader.upload(`out/${manuObj.id}.mp4`)
187
- sendToObserver(manuObj.id, uploadResult.url)
188
- //todo > publish webhook
189
  }
 
 
 
 
 
 
 
190
  }
191
- doRender(manuObj.id, cb)
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: manuObj.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
+ }