Rebuild village production queue system
This commit is contained in:
@ -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 {
|
||||
|
@ -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 });
|
||||
}
|
||||
|
@ -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 = [];
|
||||
|
Reference in New Issue
Block a user