wynn/ts/src/cmd/worker.ts
a 79cea96292
Some checks failed
commit-tag / commit-tag-image (push) Failing after 16s
its a matrix now
2025-03-02 17:55:01 -06:00

150 lines
3.3 KiB
TypeScript

import { Command } from 'clipanion';
import { c } from '#/di';
import { runMigrations } from '#/services/pg/migrations';
// di
import "#/services/temporal"
import { NativeConnection, Worker } from '@temporalio/worker';
import * as activities from '../activities';
import path from 'path';
import { Client, ScheduleNotFoundError, ScheduleOptions, ScheduleOverlapPolicy } from '@temporalio/client';
import { workflowSyncAllGuilds, workflowSyncGuilds, workflowSyncOnline, workflowSyncGuildLeaderboardInfo } from '#/workflows';
import { PG } from '#/services/pg';
import { config } from '#/config';
const schedules: ScheduleOptions[] = [
{
scheduleId: "update-guild-players",
action: {
type: 'startWorkflow',
workflowType: workflowSyncGuilds,
taskQueue: 'wynn-worker',
},
policies: {
overlap: ScheduleOverlapPolicy.SKIP,
},
spec: {
intervals: [{
every: '15 minutes',
}]
},
},
{
scheduleId: "update_guild_leaderboards",
action: {
type: 'startWorkflow',
workflowType: workflowSyncGuildLeaderboardInfo,
taskQueue: 'wynn-worker',
},
policies: {
overlap: ScheduleOverlapPolicy.SKIP,
},
spec: {
intervals: [{
every: '5 minutes',
}]
},
},
{
scheduleId: "update-all-guilds",
action: {
type: 'startWorkflow',
workflowType: workflowSyncAllGuilds,
taskQueue: 'wynn-worker',
},
policies: {
overlap: ScheduleOverlapPolicy.SKIP,
},
spec: {
intervals: [{
every: '1 hour',
}]
},
},
{
scheduleId: "update-online-players",
action: {
type: 'startWorkflow',
workflowType: workflowSyncOnline,
taskQueue: 'wynn-worker',
},
policies: {
overlap: ScheduleOverlapPolicy.SKIP,
},
spec: {
intervals: [{
every: '31 seconds',
}]
},
},
]
const addSchedules = async (c: Client) => {
for(const o of schedules) {
const handle = c.schedule.getHandle(o.scheduleId)
try {
const desc = await handle.describe();
console.log(desc)
}catch(e: any){
if(e instanceof ScheduleNotFoundError) {
await c.schedule.create(o)
}else {
throw e;
}
}
}
}
export class WorkerCommand extends Command {
static paths = [['worker']];
async execute() {
const { db } = await c.getAsync(PG);
await runMigrations(db);
const client = await c.getAsync(Client);
// schedules
await addSchedules(client);
const connection = await NativeConnection.connect({
address: config.TEMPORAL_HOSTPORT,
})
const worker = await Worker.create({
connection,
namespace: config.TEMPORAL_NAMESPACE,
workflowsPath: require.resolve('../workflows'),
bundlerOptions: {
webpackConfigHook: (config)=>{
if(!config.resolve) config.resolve = {};
if(!config.resolve.alias) config.resolve.alias = {};
config.resolve!.alias = {
"#":path.resolve(process.cwd(),'src/'),
...config.resolve!.alias,
}
return config;
}},
taskQueue: 'wynn-worker',
stickyQueueScheduleToStartTimeout: 5 * 1000,
activities
});
await worker.run();
console.log("worked.run exited");
await db.end();
await connection.close();
}
}