95 lines
2.7 KiB
TypeScript
95 lines
2.7 KiB
TypeScript
|
|
'use strict'
|
|
|
|
import { build } from './app.ts'
|
|
import 'dotenv/config'
|
|
|
|
import { makeWorkerUtils, type WorkerUtils, Runner, RunnerOptions, run as graphileRun } from 'graphile-worker'
|
|
import { join, dirname } from 'node:path';
|
|
import { fileURLToPath } from 'url';
|
|
import { getPackageVersion } from '@futureporn/utils';
|
|
import type { GraphileConfig } from "graphile-config";
|
|
import type {} from "graphile-worker";
|
|
import start_recording from './tasks/start_recording.ts';
|
|
import { stop_recording } from './tasks/stop_recording.ts';
|
|
import record from './tasks/record.ts'
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
const version = getPackageVersion(join(__dirname, '../package.json'))
|
|
|
|
if (!process.env.FUNCTION) throw new Error(`FUNCTION env var was missing. FUNCTION env var must be either 'api' or 'worker'.`);
|
|
if (!process.env.WORKER_CONNECTION_STRING) throw new Error(`WORKER_CONNECTION_STRING env var was missing`);
|
|
const connectionString = process.env.WORKER_CONNECTION_STRING!
|
|
const concurrency = (process.env?.WORKER_CONCURRENCY) ? parseInt(process.env.WORKER_CONCURRENCY) : 1
|
|
const preset: GraphileConfig.Preset = {
|
|
worker: {
|
|
connectionString: process.env.WORKER_CONNECTION_STRING,
|
|
concurrentJobs: concurrency,
|
|
fileExtensions: [".js", ".ts"],
|
|
},
|
|
};
|
|
|
|
|
|
async function api() {
|
|
if (!process.env.PORT) throw new Error('PORT is missing in env');
|
|
console.log(`api FUNCTION listening on PORT ${process.env.PORT}`)
|
|
const PORT = parseInt(process.env.PORT!)
|
|
|
|
const fastifyOpts = {
|
|
logger: {
|
|
level: 'info',
|
|
transport: {
|
|
target: 'pino-pretty'
|
|
}
|
|
}
|
|
}
|
|
|
|
const server = build(fastifyOpts, connectionString)
|
|
|
|
server.listen({ port: PORT }, (err) => {
|
|
if (err) {
|
|
server.log.error(err)
|
|
process.exit(1)
|
|
}
|
|
})
|
|
}
|
|
|
|
async function worker(workerUtils: WorkerUtils) {
|
|
const runnerOptions: RunnerOptions = {
|
|
preset,
|
|
concurrency,
|
|
// taskDirectory: join(__dirname, 'tasks'),
|
|
taskList: {
|
|
'record': record,
|
|
'start_recording': start_recording,
|
|
'stop_recording': stop_recording
|
|
}
|
|
}
|
|
|
|
const runner = await graphileRun(runnerOptions)
|
|
if (!runner) throw new Error('failed to initialize graphile worker');
|
|
await runner.promise
|
|
}
|
|
|
|
|
|
async function main() {
|
|
|
|
const workerUtils = await makeWorkerUtils({ connectionString })
|
|
await workerUtils.migrate()
|
|
|
|
console.log(`@futureporn/capture version ${version} (FUNCTION=${process.env.FUNCTION})`)
|
|
if (process.env.FUNCTION === 'api') {
|
|
api()
|
|
} else if (process.env.FUNCTION === 'worker') {
|
|
worker(workerUtils)
|
|
} else {
|
|
throw new Error('process.env.FUNCTION must be either api or worker. got '+process.env.FUNCTION)
|
|
}
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error('there was an error!')
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|