chore(core): integrate task_context with ws no-op

This commit is contained in:
Elian Doran 2026-01-06 16:09:21 +02:00
parent 18416eb89a
commit c94c54c641
No known key found for this signature in database
4 changed files with 86 additions and 78 deletions

View File

@ -1,79 +1,2 @@
"use strict";
import type { TaskData, TaskResult, TaskType, WebSocketMessage } from "@triliumnext/commons";
import ws from "./ws.js";
// taskId => TaskContext
const taskContexts: Record<string, TaskContext<any>> = {};
class TaskContext<T extends TaskType> {
private taskId: string;
private taskType: TaskType;
private progressCount: number;
private lastSentCountTs: number;
data: TaskData<T>;
noteDeletionHandlerTriggered: boolean;
constructor(taskId: string, taskType: T, data: TaskData<T>) {
this.taskId = taskId;
this.taskType = taskType;
this.data = data;
this.noteDeletionHandlerTriggered = false;
// progressCount is meant to represent just some progress - to indicate the task is not stuck
this.progressCount = -1; // we're incrementing immediately
this.lastSentCountTs = 0; // 0 will guarantee the first message will be sent
// just the fact this has been initialized is a progress which should be sent to clients
// this is esp. important when importing big files/images which take a long time to upload/process
// which means that first "real" increaseProgressCount() will be called quite late and user is without
// feedback until then
this.increaseProgressCount();
}
static getInstance<T extends TaskType>(taskId: string, taskType: T, data: TaskData<T>): TaskContext<T> {
if (!taskContexts[taskId]) {
taskContexts[taskId] = new TaskContext(taskId, taskType, data);
}
return taskContexts[taskId];
}
increaseProgressCount() {
this.progressCount++;
if (Date.now() - this.lastSentCountTs >= 300 && this.taskId !== "no-progress-reporting") {
this.lastSentCountTs = Date.now();
ws.sendMessageToAllClients({
type: "taskProgressCount",
taskId: this.taskId,
taskType: this.taskType,
data: this.data,
progressCount: this.progressCount
} as WebSocketMessage);
}
}
reportError(message: string) {
ws.sendMessageToAllClients({
type: "taskError",
taskId: this.taskId,
taskType: this.taskType,
data: this.data,
message
} as WebSocketMessage);
}
taskSucceeded(result: TaskResult<T>) {
ws.sendMessageToAllClients({
type: "taskSucceeded",
taskId: this.taskId,
taskType: this.taskType,
data: this.data,
result
} as WebSocketMessage);
}
}
import { TaskContext } from "@triliumnext/core";
export default TaskContext;

View File

@ -29,6 +29,7 @@ export { default as note_types } from "./services/note_types";
export { default as tree } from "./services/tree";
export { default as cloning } from "./services/cloning";
export { default as handlers } from "./services/handlers";
export { default as TaskContext } from "./services/task_context";
export { default as becca } from "./becca/becca";
export { default as becca_loader } from "./becca/becca_loader";

View File

@ -0,0 +1,79 @@
"use strict";
import type { TaskData, TaskResult, TaskType, WebSocketMessage } from "@triliumnext/commons";
import ws from "./ws.js";
// taskId => TaskContext
const taskContexts: Record<string, TaskContext<any>> = {};
class TaskContext<T extends TaskType> {
private taskId: string;
private taskType: TaskType;
private progressCount: number;
private lastSentCountTs: number;
data: TaskData<T>;
noteDeletionHandlerTriggered: boolean;
constructor(taskId: string, taskType: T, data: TaskData<T>) {
this.taskId = taskId;
this.taskType = taskType;
this.data = data;
this.noteDeletionHandlerTriggered = false;
// progressCount is meant to represent just some progress - to indicate the task is not stuck
this.progressCount = -1; // we're incrementing immediately
this.lastSentCountTs = 0; // 0 will guarantee the first message will be sent
// just the fact this has been initialized is a progress which should be sent to clients
// this is esp. important when importing big files/images which take a long time to upload/process
// which means that first "real" increaseProgressCount() will be called quite late and user is without
// feedback until then
this.increaseProgressCount();
}
static getInstance<T extends TaskType>(taskId: string, taskType: T, data: TaskData<T>): TaskContext<T> {
if (!taskContexts[taskId]) {
taskContexts[taskId] = new TaskContext(taskId, taskType, data);
}
return taskContexts[taskId];
}
increaseProgressCount() {
this.progressCount++;
if (Date.now() - this.lastSentCountTs >= 300 && this.taskId !== "no-progress-reporting") {
this.lastSentCountTs = Date.now();
ws.sendMessageToAllClients({
type: "taskProgressCount",
taskId: this.taskId,
taskType: this.taskType,
data: this.data,
progressCount: this.progressCount
} as WebSocketMessage);
}
}
reportError(message: string) {
ws.sendMessageToAllClients({
type: "taskError",
taskId: this.taskId,
taskType: this.taskType,
data: this.data,
message
} as WebSocketMessage);
}
taskSucceeded(result: TaskResult<T>) {
ws.sendMessageToAllClients({
type: "taskSucceeded",
taskId: this.taskId,
taskType: this.taskType,
data: this.data,
result
} as WebSocketMessage);
}
}
export default TaskContext;

View File

@ -0,0 +1,5 @@
export default {
sendMessageToAllClients(message: object) {
console.warn("Ignored ws", message);
}
}