bunqueue 2.6.115 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -0
- package/dist/application/cleanupTasks.js +24 -1
- package/dist/application/cleanupTasks.js.map +1 -1
- package/dist/client/workflow/engine.d.ts +26 -0
- package/dist/client/workflow/engine.d.ts.map +1 -0
- package/dist/client/workflow/engine.js +62 -0
- package/dist/client/workflow/engine.js.map +1 -0
- package/dist/client/workflow/executor.d.ts +32 -0
- package/dist/client/workflow/executor.d.ts.map +1 -0
- package/dist/client/workflow/executor.js +247 -0
- package/dist/client/workflow/executor.js.map +1 -0
- package/dist/client/workflow/index.d.ts +22 -0
- package/dist/client/workflow/index.d.ts.map +1 -0
- package/dist/client/workflow/index.js +21 -0
- package/dist/client/workflow/index.js.map +1 -0
- package/dist/client/workflow/store.d.ts +16 -0
- package/dist/client/workflow/store.d.ts.map +1 -0
- package/dist/client/workflow/store.js +105 -0
- package/dist/client/workflow/store.js.map +1 -0
- package/dist/client/workflow/types.d.ts +100 -0
- package/dist/client/workflow/types.d.ts.map +1 -0
- package/dist/client/workflow/types.js +5 -0
- package/dist/client/workflow/types.js.map +1 -0
- package/dist/client/workflow/workflow.d.ts +23 -0
- package/dist/client/workflow/workflow.d.ts.map +1 -0
- package/dist/client/workflow/workflow.js +73 -0
- package/dist/client/workflow/workflow.js.map +1 -0
- package/dist/infrastructure/cloud/cloudAgent.d.ts +3 -1
- package/dist/infrastructure/cloud/cloudAgent.d.ts.map +1 -1
- package/dist/infrastructure/cloud/cloudAgent.js +17 -1
- package/dist/infrastructure/cloud/cloudAgent.js.map +1 -1
- package/dist/infrastructure/cloud/commandHandler.d.ts +6 -1
- package/dist/infrastructure/cloud/commandHandler.d.ts.map +1 -1
- package/dist/infrastructure/cloud/commandHandler.js +22 -1
- package/dist/infrastructure/cloud/commandHandler.js.map +1 -1
- package/dist/infrastructure/cloud/commands.d.ts.map +1 -1
- package/dist/infrastructure/cloud/commands.js +91 -10
- package/dist/infrastructure/cloud/commands.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkflowStore - SQLite persistence for workflow executions
|
|
3
|
+
*/
|
|
4
|
+
import { Database } from 'bun:sqlite';
|
|
5
|
+
import { Packr, Unpackr } from 'msgpackr';
|
|
6
|
+
const packr = new Packr({ structuredClone: true });
|
|
7
|
+
const unpackr = new Unpackr({ structuredClone: true });
|
|
8
|
+
function pack(data) {
|
|
9
|
+
return packr.pack(data);
|
|
10
|
+
}
|
|
11
|
+
function unpack(buf) {
|
|
12
|
+
if (!buf)
|
|
13
|
+
return null;
|
|
14
|
+
return unpackr.unpack(buf);
|
|
15
|
+
}
|
|
16
|
+
const CREATE_TABLE = `
|
|
17
|
+
CREATE TABLE IF NOT EXISTS workflow_executions (
|
|
18
|
+
id TEXT PRIMARY KEY,
|
|
19
|
+
workflow_name TEXT NOT NULL,
|
|
20
|
+
state TEXT NOT NULL DEFAULT 'running',
|
|
21
|
+
input BLOB,
|
|
22
|
+
steps BLOB,
|
|
23
|
+
current_node_index INTEGER NOT NULL DEFAULT 0,
|
|
24
|
+
resolved_steps BLOB,
|
|
25
|
+
signals BLOB,
|
|
26
|
+
created_at INTEGER NOT NULL,
|
|
27
|
+
updated_at INTEGER NOT NULL
|
|
28
|
+
)`;
|
|
29
|
+
const CREATE_IDX_NAME = `CREATE INDEX IF NOT EXISTS idx_wf_name ON workflow_executions(workflow_name)`;
|
|
30
|
+
const CREATE_IDX_STATE = `CREATE INDEX IF NOT EXISTS idx_wf_state ON workflow_executions(state)`;
|
|
31
|
+
export class WorkflowStore {
|
|
32
|
+
db;
|
|
33
|
+
stmts;
|
|
34
|
+
constructor(dbPath) {
|
|
35
|
+
this.db = new Database(dbPath ?? ':memory:', { create: true });
|
|
36
|
+
this.db.run('PRAGMA journal_mode = WAL');
|
|
37
|
+
this.db.run(CREATE_TABLE);
|
|
38
|
+
this.db.run(CREATE_IDX_NAME);
|
|
39
|
+
this.db.run(CREATE_IDX_STATE);
|
|
40
|
+
this.stmts = {
|
|
41
|
+
upsert: this.db.prepare(`
|
|
42
|
+
INSERT OR REPLACE INTO workflow_executions
|
|
43
|
+
(id, workflow_name, state, input, steps, current_node_index, resolved_steps, signals, created_at, updated_at)
|
|
44
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
45
|
+
`),
|
|
46
|
+
get: this.db.prepare(`SELECT * FROM workflow_executions WHERE id = ?`),
|
|
47
|
+
updateState: this.db.prepare(`
|
|
48
|
+
UPDATE workflow_executions
|
|
49
|
+
SET state = ?, steps = ?, current_node_index = ?, resolved_steps = ?, signals = ?, updated_at = ?
|
|
50
|
+
WHERE id = ?
|
|
51
|
+
`),
|
|
52
|
+
list: this.db.prepare(`SELECT * FROM workflow_executions ORDER BY created_at DESC LIMIT 100`),
|
|
53
|
+
listByName: this.db.prepare(`SELECT * FROM workflow_executions WHERE workflow_name = ? ORDER BY created_at DESC LIMIT 100`),
|
|
54
|
+
listByState: this.db.prepare(`SELECT * FROM workflow_executions WHERE state = ? ORDER BY created_at DESC LIMIT 100`),
|
|
55
|
+
listByBoth: this.db.prepare(`SELECT * FROM workflow_executions WHERE workflow_name = ? AND state = ? ORDER BY created_at DESC LIMIT 100`),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
save(exec) {
|
|
59
|
+
this.stmts.upsert.run(exec.id, exec.workflowName, exec.state, pack(exec.input), pack(exec.steps), exec.currentNodeIndex, exec.resolvedSteps ? pack(exec.resolvedSteps) : null, pack(exec.signals), exec.createdAt, exec.updatedAt);
|
|
60
|
+
}
|
|
61
|
+
get(id) {
|
|
62
|
+
const row = this.stmts.get.get(id);
|
|
63
|
+
return row ? this.rowToExecution(row) : null;
|
|
64
|
+
}
|
|
65
|
+
update(exec) {
|
|
66
|
+
exec.updatedAt = Date.now();
|
|
67
|
+
this.stmts.updateState.run(exec.state, pack(exec.steps), exec.currentNodeIndex, exec.resolvedSteps ? pack(exec.resolvedSteps) : null, pack(exec.signals), exec.updatedAt, exec.id);
|
|
68
|
+
}
|
|
69
|
+
list(workflowName, state) {
|
|
70
|
+
let rows;
|
|
71
|
+
if (workflowName && state) {
|
|
72
|
+
rows = this.stmts.listByBoth.all(workflowName, state);
|
|
73
|
+
}
|
|
74
|
+
else if (workflowName) {
|
|
75
|
+
rows = this.stmts.listByName.all(workflowName);
|
|
76
|
+
}
|
|
77
|
+
else if (state) {
|
|
78
|
+
rows = this.stmts.listByState.all(state);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
rows = this.stmts.list.all();
|
|
82
|
+
}
|
|
83
|
+
return rows.map((r) => this.rowToExecution(r));
|
|
84
|
+
}
|
|
85
|
+
close() {
|
|
86
|
+
this.db.close();
|
|
87
|
+
}
|
|
88
|
+
rowToExecution(row) {
|
|
89
|
+
return {
|
|
90
|
+
id: row.id,
|
|
91
|
+
workflowName: row.workflow_name,
|
|
92
|
+
state: row.state,
|
|
93
|
+
input: unpack(row.input),
|
|
94
|
+
steps: unpack(row.steps) ?? {},
|
|
95
|
+
currentNodeIndex: row.current_node_index,
|
|
96
|
+
resolvedSteps: row.resolved_steps
|
|
97
|
+
? unpack(row.resolved_steps)
|
|
98
|
+
: undefined,
|
|
99
|
+
signals: unpack(row.signals) ?? {},
|
|
100
|
+
createdAt: row.created_at,
|
|
101
|
+
updatedAt: row.updated_at,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/client/workflow/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Engine Types
|
|
3
|
+
*/
|
|
4
|
+
import type { ConnectionOptions } from '../types';
|
|
5
|
+
/** Context passed to step handlers */
|
|
6
|
+
export interface StepContext<TInput = unknown> {
|
|
7
|
+
/** Original workflow input */
|
|
8
|
+
readonly input: TInput;
|
|
9
|
+
/** Results from completed steps (step name → result) */
|
|
10
|
+
readonly steps: Readonly<Record<string, unknown>>;
|
|
11
|
+
/** Signals received via engine.signal() */
|
|
12
|
+
readonly signals: Readonly<Record<string, unknown>>;
|
|
13
|
+
/** Current execution ID */
|
|
14
|
+
readonly executionId: string;
|
|
15
|
+
}
|
|
16
|
+
/** Step handler function */
|
|
17
|
+
export type StepHandler<TInput = unknown, TResult = unknown> = (ctx: StepContext<TInput>) => Promise<TResult> | TResult;
|
|
18
|
+
/** Compensate handler (rollback on failure) */
|
|
19
|
+
export type CompensateHandler<TInput = unknown> = (ctx: StepContext<TInput>) => Promise<void> | void;
|
|
20
|
+
/** Options for a single step */
|
|
21
|
+
export interface StepOptions<TInput = unknown> {
|
|
22
|
+
retry?: number;
|
|
23
|
+
timeout?: number;
|
|
24
|
+
compensate?: CompensateHandler<TInput>;
|
|
25
|
+
}
|
|
26
|
+
/** Internal step definition */
|
|
27
|
+
export interface StepDefinition {
|
|
28
|
+
name: string;
|
|
29
|
+
handler: StepHandler;
|
|
30
|
+
compensate?: CompensateHandler;
|
|
31
|
+
retry: number;
|
|
32
|
+
timeout: number;
|
|
33
|
+
}
|
|
34
|
+
/** Branch condition function */
|
|
35
|
+
export type BranchCondition = (ctx: StepContext) => string;
|
|
36
|
+
/** Internal branch definition */
|
|
37
|
+
export interface BranchDefinition {
|
|
38
|
+
condition: BranchCondition;
|
|
39
|
+
paths: Map<string, StepDefinition[]>;
|
|
40
|
+
}
|
|
41
|
+
/** Workflow node (discriminated union) */
|
|
42
|
+
export type WorkflowNode = {
|
|
43
|
+
type: 'step';
|
|
44
|
+
def: StepDefinition;
|
|
45
|
+
} | {
|
|
46
|
+
type: 'branch';
|
|
47
|
+
def: BranchDefinition;
|
|
48
|
+
} | {
|
|
49
|
+
type: 'waitFor';
|
|
50
|
+
event: string;
|
|
51
|
+
timeout?: number;
|
|
52
|
+
};
|
|
53
|
+
/** Execution state */
|
|
54
|
+
export type ExecutionState = 'running' | 'waiting' | 'completed' | 'failed' | 'compensating';
|
|
55
|
+
/** Step execution state */
|
|
56
|
+
export type StepState = 'pending' | 'running' | 'completed' | 'failed';
|
|
57
|
+
/** Record of a step's execution */
|
|
58
|
+
export interface StepRecord {
|
|
59
|
+
status: StepState;
|
|
60
|
+
result?: unknown;
|
|
61
|
+
error?: string;
|
|
62
|
+
startedAt?: number;
|
|
63
|
+
completedAt?: number;
|
|
64
|
+
}
|
|
65
|
+
/** Full execution state */
|
|
66
|
+
export interface Execution {
|
|
67
|
+
id: string;
|
|
68
|
+
workflowName: string;
|
|
69
|
+
state: ExecutionState;
|
|
70
|
+
input: unknown;
|
|
71
|
+
steps: Record<string, StepRecord>;
|
|
72
|
+
currentNodeIndex: number;
|
|
73
|
+
/** Flattened step list for branch resolution */
|
|
74
|
+
resolvedSteps?: string[];
|
|
75
|
+
signals: Record<string, unknown>;
|
|
76
|
+
createdAt: number;
|
|
77
|
+
updatedAt: number;
|
|
78
|
+
}
|
|
79
|
+
/** Engine configuration */
|
|
80
|
+
export interface EngineOptions {
|
|
81
|
+
embedded?: boolean;
|
|
82
|
+
dataPath?: string;
|
|
83
|
+
connection?: ConnectionOptions;
|
|
84
|
+
/** Internal queue name (default: __wf:steps) */
|
|
85
|
+
queueName?: string;
|
|
86
|
+
/** Worker concurrency (default: 5) */
|
|
87
|
+
concurrency?: number;
|
|
88
|
+
}
|
|
89
|
+
/** Handle returned from engine.start() */
|
|
90
|
+
export interface RunHandle {
|
|
91
|
+
id: string;
|
|
92
|
+
workflowName: string;
|
|
93
|
+
}
|
|
94
|
+
/** Internal job data for step execution */
|
|
95
|
+
export interface StepJobData {
|
|
96
|
+
executionId: string;
|
|
97
|
+
workflowName: string;
|
|
98
|
+
nodeIndex: number;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/workflow/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/client/workflow/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow - DSL builder for defining workflow step graphs
|
|
3
|
+
* Pure data structure, no side effects.
|
|
4
|
+
*/
|
|
5
|
+
import type { WorkflowNode, StepHandler, StepOptions, BranchCondition } from './types';
|
|
6
|
+
export declare class Workflow<TInput = unknown> {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly nodes: WorkflowNode[];
|
|
9
|
+
constructor(name: string);
|
|
10
|
+
/** Add a step to the workflow */
|
|
11
|
+
step(name: string, handler: StepHandler<TInput>, options?: StepOptions<TInput>): this;
|
|
12
|
+
/** Add a branch point — call .path() after this to define paths */
|
|
13
|
+
branch(condition: BranchCondition): this;
|
|
14
|
+
/** Define a branch path (must follow a .branch() call) */
|
|
15
|
+
path(name: string, builder: (w: Workflow<TInput>) => Workflow<TInput>): this;
|
|
16
|
+
/** Wait for an external signal before continuing */
|
|
17
|
+
waitFor(event: string, options?: {
|
|
18
|
+
timeout?: number;
|
|
19
|
+
}): this;
|
|
20
|
+
/** Get flat list of step names for validation */
|
|
21
|
+
getStepNames(): string[];
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../../src/client/workflow/workflow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAEX,WAAW,EAEX,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,qBAAa,QAAQ,CAAC,MAAM,GAAG,OAAO;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAM;gBAExB,IAAI,EAAE,MAAM;IAIxB,iCAAiC;IACjC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAcrF,mEAAmE;IACnE,MAAM,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAQxC,0DAA0D;IAC1D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;IAc5E,oDAAoD;IACpD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAS5D,iDAAiD;IACjD,YAAY,IAAI,MAAM,EAAE;CAazB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow - DSL builder for defining workflow step graphs
|
|
3
|
+
* Pure data structure, no side effects.
|
|
4
|
+
*/
|
|
5
|
+
export class Workflow {
|
|
6
|
+
name;
|
|
7
|
+
nodes = [];
|
|
8
|
+
constructor(name) {
|
|
9
|
+
this.name = name;
|
|
10
|
+
}
|
|
11
|
+
/** Add a step to the workflow */
|
|
12
|
+
step(name, handler, options) {
|
|
13
|
+
this.nodes.push({
|
|
14
|
+
type: 'step',
|
|
15
|
+
def: {
|
|
16
|
+
name,
|
|
17
|
+
handler: handler,
|
|
18
|
+
compensate: options?.compensate,
|
|
19
|
+
retry: options?.retry ?? 3,
|
|
20
|
+
timeout: options?.timeout ?? 30_000,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
/** Add a branch point — call .path() after this to define paths */
|
|
26
|
+
branch(condition) {
|
|
27
|
+
this.nodes.push({
|
|
28
|
+
type: 'branch',
|
|
29
|
+
def: { condition, paths: new Map() },
|
|
30
|
+
});
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
/** Define a branch path (must follow a .branch() call) */
|
|
34
|
+
path(name, builder) {
|
|
35
|
+
const lastNode = this.nodes[this.nodes.length - 1];
|
|
36
|
+
if (lastNode?.type !== 'branch') {
|
|
37
|
+
throw new Error('path() must follow a branch() call');
|
|
38
|
+
}
|
|
39
|
+
const sub = new Workflow(`${this.name}:${name}`);
|
|
40
|
+
builder(sub);
|
|
41
|
+
const steps = sub.nodes
|
|
42
|
+
.filter((n) => n.type === 'step')
|
|
43
|
+
.map((n) => n.def);
|
|
44
|
+
lastNode.def.paths.set(name, steps);
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
/** Wait for an external signal before continuing */
|
|
48
|
+
waitFor(event, options) {
|
|
49
|
+
this.nodes.push({
|
|
50
|
+
type: 'waitFor',
|
|
51
|
+
event,
|
|
52
|
+
timeout: options?.timeout,
|
|
53
|
+
});
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
/** Get flat list of step names for validation */
|
|
57
|
+
getStepNames() {
|
|
58
|
+
const names = [];
|
|
59
|
+
for (const node of this.nodes) {
|
|
60
|
+
if (node.type === 'step') {
|
|
61
|
+
names.push(node.def.name);
|
|
62
|
+
}
|
|
63
|
+
else if (node.type === 'branch') {
|
|
64
|
+
for (const steps of node.def.paths.values()) {
|
|
65
|
+
for (const s of steps)
|
|
66
|
+
names.push(s.name);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return names;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../../src/client/workflow/workflow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,OAAO,QAAQ;IACV,IAAI,CAAS;IACb,KAAK,GAAmB,EAAE,CAAC;IAEpC,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,iCAAiC;IACjC,IAAI,CAAC,IAAY,EAAE,OAA4B,EAAE,OAA6B;QAC5E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE;gBACH,IAAI;gBACJ,OAAO,EAAE,OAAsB;gBAC/B,UAAU,EAAE,OAAO,EAAE,UAA2C;gBAChE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,MAAM;aACpC;SACF,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mEAAmE;IACnE,MAAM,CAAC,SAA0B;QAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE;SACrC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0DAA0D;IAC1D,IAAI,CAAC,IAAY,EAAE,OAAkD;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAA6B,CAAC;QAC/E,IAAI,QAAQ,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAS,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,KAAK,GAAqB,GAAG,CAAC,KAAK;aACtC,MAAM,CAAC,CAAC,CAAC,EAA8C,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAC5E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACrB,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oDAAoD;IACpD,OAAO,CAAC,KAAa,EAAE,OAA8B;QACnD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,SAAS;YACf,KAAK;YACL,OAAO,EAAE,OAAO,EAAE,OAAO;SAC1B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iDAAiD;IACjD,YAAY;QACV,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC5C,KAAK,MAAM,CAAC,IAAI,KAAK;wBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* Zero overhead when disabled (BUNQUEUE_CLOUD_URL not set).
|
|
10
10
|
*/
|
|
11
11
|
import type { QueueManager } from '../../application/queueManager';
|
|
12
|
-
import type { CloudConfig } from './types';
|
|
12
|
+
import type { CloudConfig, CloudSnapshot } from './types';
|
|
13
13
|
import { type ServerHandles } from './snapshotCollector';
|
|
14
14
|
export declare class CloudAgent {
|
|
15
15
|
private readonly queueManager;
|
|
@@ -49,5 +49,7 @@ export declare class CloudAgent {
|
|
|
49
49
|
/** Redact sensitive fields from job data */
|
|
50
50
|
private redactData;
|
|
51
51
|
getInstanceId(): string;
|
|
52
|
+
/** Collect a fresh snapshot on demand (used by snapshot:get command) */
|
|
53
|
+
getSnapshot(): Promise<CloudSnapshot>;
|
|
52
54
|
}
|
|
53
55
|
//# sourceMappingURL=cloudAgent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudAgent.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cloud/cloudAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"cloudAgent.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cloud/cloudAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,KAAK,EAAE,WAAW,EAAc,aAAa,EAAE,MAAM,SAAS,CAAC;AAEtE,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQ1E,qBAAa,UAAU;IAiBnB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAhB/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,gBAAgB,CAA+C;IACvE,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;gBAG7B,YAAY,EAAE,YAAY,EAC3C,MAAM,EAAE,WAAW;IAQrB,8CAA8C;IAC9C,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAI9C,8EAA8E;IAC9E,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAS/E,iEAAiE;IACjE,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,GAAG,UAAU;IAMpF,0BAA0B;IAC1B,KAAK,IAAI,IAAI;IA6Cb,gEAAgE;IAC1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyC3B,8DAA8D;IAC9D,OAAO,CAAC,eAAe;IAQvB,mDAAmD;IACnD,OAAO,CAAC,YAAY;IAWpB,2CAA2C;YAC7B,YAAY;IAyB1B,8DAA8D;IAC9D,OAAO,CAAC,iBAAiB;IAiCzB,4CAA4C;IAC5C,OAAO,CAAC,UAAU;IAclB,aAAa,IAAI,MAAM;IAIvB,wEAAwE;IAClE,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC;CAY5C"}
|
|
@@ -76,8 +76,11 @@ export class CloudAgent {
|
|
|
76
76
|
if (this.wsSender) {
|
|
77
77
|
if (this.config.remoteCommands) {
|
|
78
78
|
cloudLog.info('Remote commands enabled');
|
|
79
|
+
const commandContext = {
|
|
80
|
+
getSnapshot: () => this.getSnapshot(),
|
|
81
|
+
};
|
|
79
82
|
this.wsSender.setCommandHandler((cmd) => {
|
|
80
|
-
handleCommand(this.queueManager, cmd)
|
|
83
|
+
handleCommand(this.queueManager, cmd, commandContext)
|
|
81
84
|
.then((result) => {
|
|
82
85
|
this.wsSender?.sendRaw(result);
|
|
83
86
|
// HTTP ingest disabled — dashboard uses WS commands
|
|
@@ -223,5 +226,18 @@ export class CloudAgent {
|
|
|
223
226
|
getInstanceId() {
|
|
224
227
|
return this.instanceId;
|
|
225
228
|
}
|
|
229
|
+
/** Collect a fresh snapshot on demand (used by snapshot:get command) */
|
|
230
|
+
async getSnapshot() {
|
|
231
|
+
const snapshot = await collectSnapshot({
|
|
232
|
+
queueManager: this.queueManager,
|
|
233
|
+
instanceId: this.instanceId,
|
|
234
|
+
instanceName: this.config.instanceName,
|
|
235
|
+
startedAt: this.startedAt,
|
|
236
|
+
sequenceId: ++this.sequenceId,
|
|
237
|
+
serverHandles: this.serverHandles,
|
|
238
|
+
includeHeavy: true,
|
|
239
|
+
});
|
|
240
|
+
return snapshot;
|
|
241
|
+
}
|
|
226
242
|
}
|
|
227
243
|
//# sourceMappingURL=cloudAgent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudAgent.js","sourceRoot":"","sources":["../../../src/infrastructure/cloud/cloudAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAsB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"cloudAgent.js","sourceRoot":"","sources":["../../../src/infrastructure/cloud/cloudAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* All commands are whitelisted — unknown actions are rejected.
|
|
7
7
|
*/
|
|
8
8
|
import type { QueueManager } from '../../application/queueManager';
|
|
9
|
+
import type { CloudSnapshot } from './types';
|
|
9
10
|
/** Incoming command from dashboard (fields at top level) */
|
|
10
11
|
export interface CloudCommand {
|
|
11
12
|
type: 'command';
|
|
@@ -42,6 +43,10 @@ export interface CloudCommandResult {
|
|
|
42
43
|
data?: unknown;
|
|
43
44
|
error?: string;
|
|
44
45
|
}
|
|
46
|
+
/** Optional context for commands that need more than QueueManager */
|
|
47
|
+
export interface CommandContext {
|
|
48
|
+
getSnapshot?: () => Promise<CloudSnapshot>;
|
|
49
|
+
}
|
|
45
50
|
/** Process a command and return the result */
|
|
46
|
-
export declare function handleCommand(queueManager: QueueManager, cmd: CloudCommand): Promise<CloudCommandResult>;
|
|
51
|
+
export declare function handleCommand(queueManager: QueueManager, cmd: CloudCommand, context?: CommandContext): Promise<CloudCommandResult>;
|
|
47
52
|
//# sourceMappingURL=commandHandler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandHandler.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cloud/commandHandler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"commandHandler.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cloud/commandHandler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7C,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,oCAAoC;AACpC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,gBAAgB,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6BD,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;CAC5C;AAED,8CAA8C;AAC9C,wBAAsB,aAAa,CACjC,YAAY,EAAE,YAAY,EAC1B,GAAG,EAAE,YAAY,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAoD7B"}
|
|
@@ -33,7 +33,28 @@ function camelKeys(obj, isUserData = false) {
|
|
|
33
33
|
return obj;
|
|
34
34
|
}
|
|
35
35
|
/** Process a command and return the result */
|
|
36
|
-
export async function handleCommand(queueManager, cmd) {
|
|
36
|
+
export async function handleCommand(queueManager, cmd, context) {
|
|
37
|
+
// Handle snapshot:get directly — needs CloudAgent context
|
|
38
|
+
if (cmd.action === 'snapshot:get' && context?.getSnapshot) {
|
|
39
|
+
try {
|
|
40
|
+
const snapshot = await context.getSnapshot();
|
|
41
|
+
cloudLog.info('Remote command executed', { action: cmd.action, id: cmd.id });
|
|
42
|
+
return { type: 'command_result', id: cmd.id, success: true, data: snapshot };
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
cloudLog.error('Remote command failed', {
|
|
46
|
+
action: cmd.action,
|
|
47
|
+
id: cmd.id,
|
|
48
|
+
error: String(err),
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
type: 'command_result',
|
|
52
|
+
id: cmd.id,
|
|
53
|
+
success: false,
|
|
54
|
+
error: err instanceof Error ? err.message : String(err),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
37
58
|
const handler = COMMANDS[cmd.action];
|
|
38
59
|
if (!handler) {
|
|
39
60
|
cloudLog.warn('Unknown remote command', { action: cmd.action, id: cmd.id });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandHandler.js","sourceRoot":"","sources":["../../../src/infrastructure/cloud/commandHandler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"commandHandler.js","sourceRoot":"","sources":["../../../src/infrastructure/cloud/commandHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cloud/commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,KAAK,OAAO,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cloud/commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,KAAK,OAAO,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC;AA6EhE,+BAA+B;AAC/B,eAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuRrD,CAAC"}
|
|
@@ -13,23 +13,65 @@ function deriveState(j) {
|
|
|
13
13
|
return 'delayed';
|
|
14
14
|
return 'waiting';
|
|
15
15
|
}
|
|
16
|
-
/** Helper: map job to
|
|
16
|
+
/** Helper: map job to frontend format (field names aligned with dashboard) */
|
|
17
|
+
// eslint-disable-next-line complexity
|
|
17
18
|
function mapJob(j) {
|
|
18
19
|
const data = j.data;
|
|
20
|
+
const state = deriveState(j);
|
|
21
|
+
const processTime = j.completedAt && j.startedAt ? j.completedAt - j.startedAt : undefined;
|
|
19
22
|
return {
|
|
20
23
|
id: String(j.id),
|
|
21
24
|
name: data?.name ?? 'default',
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
queueName: j.queue,
|
|
26
|
+
_queue: j.queue,
|
|
27
|
+
state,
|
|
28
|
+
_status: state,
|
|
29
|
+
data: data !== undefined ? JSON.stringify(data) : undefined,
|
|
25
30
|
priority: j.priority,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
31
|
+
timestamp: j.createdAt,
|
|
32
|
+
processedOn: j.startedAt ?? undefined,
|
|
33
|
+
finishedOn: j.completedAt ?? undefined,
|
|
34
|
+
runAt: j.runAt,
|
|
35
|
+
failedReason: state === 'active' && j.attempts > 0 ? `Retry ${j.attempts}/${j.maxAttempts}` : undefined,
|
|
36
|
+
attemptsMade: j.attempts,
|
|
30
37
|
maxAttempts: j.maxAttempts,
|
|
31
|
-
|
|
32
|
-
|
|
38
|
+
backoff: j.backoff,
|
|
39
|
+
timeout: j.timeout ?? undefined,
|
|
40
|
+
ttl: j.ttl ?? undefined,
|
|
41
|
+
duration: processTime,
|
|
42
|
+
waitTime: j.startedAt ? j.startedAt - j.createdAt : undefined,
|
|
43
|
+
totalDuration: j.completedAt ? j.completedAt - j.createdAt : undefined,
|
|
44
|
+
progress: j.progress || undefined,
|
|
45
|
+
progressMessage: j.progressMessage ?? undefined,
|
|
46
|
+
customId: j.customId ?? undefined,
|
|
47
|
+
uniqueKey: j.uniqueKey ?? undefined,
|
|
48
|
+
tags: j.tags.length > 0 ? j.tags : undefined,
|
|
49
|
+
groupId: j.groupId ?? undefined,
|
|
50
|
+
parentId: j.parentId ? String(j.parentId) : undefined,
|
|
51
|
+
childrenIds: j.childrenIds.length > 0 ? j.childrenIds.map(String) : undefined,
|
|
52
|
+
dependsOn: j.dependsOn.length > 0 ? j.dependsOn.map(String) : undefined,
|
|
53
|
+
childrenCompleted: j.childrenCompleted > 0 ? j.childrenCompleted : undefined,
|
|
54
|
+
lastHeartbeat: j.lastHeartbeat > 0 ? j.lastHeartbeat : undefined,
|
|
55
|
+
stallCount: j.stallCount > 0 ? j.stallCount : undefined,
|
|
56
|
+
stallTimeout: j.stallTimeout ?? undefined,
|
|
57
|
+
removeOnComplete: j.removeOnComplete || undefined,
|
|
58
|
+
removeOnFail: j.removeOnFail || undefined,
|
|
59
|
+
lifo: j.lifo || undefined,
|
|
60
|
+
backoffConfig: j.backoffConfig ?? undefined,
|
|
61
|
+
repeat: j.repeat ?? undefined,
|
|
62
|
+
stackTraceLimit: j.stackTraceLimit,
|
|
63
|
+
keepLogs: j.keepLogs ?? undefined,
|
|
64
|
+
sizeLimit: j.sizeLimit ?? undefined,
|
|
65
|
+
failParentOnFailure: j.failParentOnFailure || undefined,
|
|
66
|
+
removeDependencyOnFailure: j.removeDependencyOnFailure || undefined,
|
|
67
|
+
continueParentOnFailure: j.continueParentOnFailure || undefined,
|
|
68
|
+
ignoreDependencyOnFailure: j.ignoreDependencyOnFailure || undefined,
|
|
69
|
+
deduplicationTtl: j.deduplicationTtl ?? undefined,
|
|
70
|
+
deduplicationExtend: j.deduplicationExtend || undefined,
|
|
71
|
+
deduplicationReplace: j.deduplicationReplace || undefined,
|
|
72
|
+
debounceId: j.debounceId ?? undefined,
|
|
73
|
+
debounceTtl: j.debounceTtl ?? undefined,
|
|
74
|
+
timeline: j.timeline.length > 0 ? j.timeline : undefined,
|
|
33
75
|
};
|
|
34
76
|
}
|
|
35
77
|
/** All whitelisted commands */
|
|
@@ -248,6 +290,45 @@ export const COMMANDS = {
|
|
|
248
290
|
const ok = qm.webhookManager.setEnabled(cmd.webhookId ?? '', cmd.enabled ?? true);
|
|
249
291
|
return { updated: ok };
|
|
250
292
|
},
|
|
293
|
+
// --- List all jobs across all queues ---
|
|
294
|
+
'job:listAll': (qm, cmd) => {
|
|
295
|
+
const limit = cmd.limit ?? 50;
|
|
296
|
+
const offset = cmd.offset ?? 0;
|
|
297
|
+
const states = cmd.state
|
|
298
|
+
? cmd.state.split(',')
|
|
299
|
+
: ['waiting', 'active', 'delayed', 'completed', 'failed'];
|
|
300
|
+
const queueNames = qm.listQueues();
|
|
301
|
+
const allJobs = [];
|
|
302
|
+
for (const name of queueNames) {
|
|
303
|
+
const jobs = qm.getJobs(name, { state: states, start: 0, end: 999 });
|
|
304
|
+
for (const j of jobs)
|
|
305
|
+
allJobs.push(mapJob(j));
|
|
306
|
+
}
|
|
307
|
+
// Sort by createdAt descending
|
|
308
|
+
allJobs.sort((a, b) => b.timestamp - a.timestamp);
|
|
309
|
+
return { jobs: allJobs.slice(offset, offset + limit), total: allJobs.length, offset, limit };
|
|
310
|
+
},
|
|
311
|
+
// --- Queue list ---
|
|
312
|
+
'queue:list': (qm) => {
|
|
313
|
+
const queueNames = qm.listQueues();
|
|
314
|
+
const queues = queueNames.map((name) => {
|
|
315
|
+
const counts = qm.getQueueJobCounts(name);
|
|
316
|
+
return {
|
|
317
|
+
name,
|
|
318
|
+
waiting: counts.waiting,
|
|
319
|
+
prioritized: counts.prioritized,
|
|
320
|
+
delayed: counts.delayed,
|
|
321
|
+
active: counts.active,
|
|
322
|
+
completed: counts.completed,
|
|
323
|
+
failed: counts.failed,
|
|
324
|
+
'waiting-children': counts['waiting-children'],
|
|
325
|
+
paused: qm.isPaused(name),
|
|
326
|
+
totalCompleted: counts.totalCompleted,
|
|
327
|
+
totalFailed: counts.totalFailed,
|
|
328
|
+
};
|
|
329
|
+
});
|
|
330
|
+
return { queues };
|
|
331
|
+
},
|
|
251
332
|
// --- Stats & backup ---
|
|
252
333
|
'stats:refresh': (qm) => {
|
|
253
334
|
return qm.getStats();
|