You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.9 KiB
87 lines
2.9 KiB
// media.js
|
|
// Copyright (C) 2022 DTP Technologies, LLC
|
|
// License: Apache-2.0
|
|
|
|
'use strict';
|
|
|
|
const path = require('path');
|
|
require('dotenv').config({ path: path.resolve(__dirname, '..', '..', '.env') });
|
|
|
|
const mongoose = require('mongoose');
|
|
|
|
const { SitePlatform, SiteLog, SiteWorker } = require(path.join(__dirname, '..', '..', 'lib', 'site-lib'));
|
|
|
|
module.pkg = require(path.resolve(__dirname, '..', '..', 'package.json'));
|
|
module.config = {
|
|
environment: process.env.NODE_ENV,
|
|
root: path.resolve(__dirname, '..', '..'),
|
|
component: { logId: 'media-worker', index: 'mediaWorker', className: 'MediaWorker' },
|
|
};
|
|
|
|
/**
|
|
* Provides background media processing for the DTP ecosystem.
|
|
*
|
|
* Background media processing is simply a way of life for scalable Web
|
|
* architectures. You don't want to force your site member to sit there and
|
|
* watch a process run. You want to accept their file, toss it to storage, and
|
|
* create a job to have whatever work needs done performed.
|
|
*
|
|
* This obviously induces a variable amount of time from when the site member
|
|
* uploads the file until it's ready for online distribution. The system
|
|
* therefore facilitates ways to query the status of the job and to receive a
|
|
* notification when the work is complete.
|
|
*
|
|
* This worker serves as a starting point or demonstration of how to do
|
|
* background media processing at scale and in production. This is the exact
|
|
* code we use to run the Digital Telepresence Platform every day.
|
|
*/
|
|
class MediaWorker extends SiteWorker {
|
|
|
|
constructor (dtp) {
|
|
super(dtp, dtp.config.component);
|
|
}
|
|
|
|
async start ( ) {
|
|
await super.start();
|
|
|
|
if (process.argv[2]) {
|
|
const stickerId = mongoose.Types.ObjectId(process.argv[2]);
|
|
this.log.info('creating sticker processing job', { stickerId });
|
|
|
|
const queue = this.getJobQueue('media', this.dtp.config.jobQueues.media);
|
|
await queue.add('sticker-ingest', { stickerId });
|
|
}
|
|
|
|
await this.loadProcessor(path.join(__dirname, 'media', 'job', 'sticker-ingest.js'));
|
|
await this.loadProcessor(path.join(__dirname, 'media', 'job', 'sticker-delete.js'));
|
|
|
|
await this.loadProcessor(path.join(__dirname, 'media', 'job', 'attachment-ingest.js'));
|
|
await this.loadProcessor(path.join(__dirname, 'media', 'job', 'attachment-delete.js'));
|
|
|
|
await this.loadProcessor(path.join(__dirname, 'media', 'job', 'webpage-screenshot.js'));
|
|
|
|
await this.startProcessors();
|
|
}
|
|
|
|
async stop ( ) {
|
|
await super.stop();
|
|
}
|
|
}
|
|
|
|
(async ( ) => {
|
|
try {
|
|
module.log = new SiteLog(module, module.config.component);
|
|
await SitePlatform.startPlatform(module, module.config.component);
|
|
|
|
module.worker = new MediaWorker(module);
|
|
await module.worker.start();
|
|
|
|
module.log.info(`${module.pkg.name} v${module.pkg.version} ${module.config.component.name} started`);
|
|
} catch (error) {
|
|
module.log.error('failed to start worker', {
|
|
component: module.config.component,
|
|
error,
|
|
});
|
|
process.exit(-1);
|
|
}
|
|
})();
|