Rebuild village production queue system

This commit is contained in:
2020-05-24 17:23:13 +03:00
parent f3a1e67906
commit 8bea617f5b
26 changed files with 520 additions and 336 deletions

View File

@ -1,7 +1,6 @@
import { DataStorage } from '../DataStorage';
import { Task, TaskList, TaskProvider, uniqTaskId } from './TaskProvider';
const NAMESPACE = 'tasks:v1';
const QUEUE_NAME = 'queue';
export class DataStorageTaskProvider implements TaskProvider {
@ -11,8 +10,8 @@ export class DataStorageTaskProvider implements TaskProvider {
this.storage = storage;
}
static create() {
return new DataStorageTaskProvider(new DataStorage(NAMESPACE));
static create(namespace: string) {
return new DataStorageTaskProvider(new DataStorage(namespace));
}
getTasks(): TaskList {

View File

@ -1,10 +1,11 @@
import { Args } from './Args';
import { uniqId } from '../utils';
import { ResourcesInterface } from '../Core/Resources';
export type TaskId = string;
let idSequence = 1;
let lastTimestamp: number | null = null;
let lastTimestamp: number | undefined = undefined;
export function uniqTaskId(): TaskId {
const ts = Math.floor(Date.now() / 1000);
@ -38,3 +39,15 @@ export interface TaskProvider {
getTasks(): TaskList;
setTasks(tasks: TaskList): void;
}
export interface TaskTransformer {
(task: Task): Task;
}
export function withTime(ts: number): TaskTransformer {
return (task: Task) => new Task(task.id, ts, task.name, task.args);
}
export function withResources(resources: ResourcesInterface): TaskTransformer {
return (task: Task) => new Task(task.id, task.ts, task.name, { ...task.args, resources });
}

View File

@ -11,14 +11,10 @@ export class TaskQueue {
this.logger = logger;
}
push(name: string, args: Args, ts: number): Task {
const id = uniqTaskId();
const task = new Task(id, ts, name, args);
this.logger.info('PUSH TASK', id, ts, name, args);
add(task: Task) {
let items = this.getItems();
items.push(task);
this.flushItems(items);
return task;
}
get(ts: number): Task | undefined {
@ -29,6 +25,11 @@ export class TaskQueue {
return readyItems[0];
}
findById(taskId: TaskId): Task | undefined {
const [matched, _] = this.split(t => t.id === taskId);
return matched.shift();
}
has(predicate: (t: Task) => boolean): boolean {
const [matched, _] = this.split(predicate);
return matched.length > 0;
@ -53,11 +54,6 @@ export class TaskQueue {
return this.getItems();
}
private shiftTask(id: TaskId): [Task | undefined, TaskList] {
const [a, b] = this.split(t => t.id === id);
return [a.shift(), b];
}
private split(predicate: (t: Task) => boolean): [TaskList, TaskList] {
const matched: TaskList = [];
const other: TaskList = [];