'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); });