@t4h.framework/dev 0.0.0-experimental-20261006120135 → 0.0.0-experimental-20261006133319
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/CHANGELOG.md +27 -1
- package/README.md +29 -0
- package/dist/AppProcess.d.ts +11 -2
- package/dist/AppProcess.js +16 -4
- package/dist/AppProcess.js.map +1 -1
- package/dist/HeadlessApp.d.ts +65 -0
- package/dist/HeadlessApp.js +163 -0
- package/dist/HeadlessApp.js.map +1 -0
- package/dist/Server.d.ts +3 -0
- package/dist/Server.js +6 -11
- package/dist/Server.js.map +1 -1
- package/dist/constants/server.d.ts +4 -0
- package/dist/constants/server.js +4 -0
- package/dist/constants/server.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/models/RuntimeControlServer.d.ts +32 -0
- package/dist/models/RuntimeControlServer.js +75 -0
- package/dist/models/RuntimeControlServer.js.map +1 -0
- package/dist/models/RuntimeDebugLog.d.ts +10 -0
- package/dist/models/RuntimeDebugLog.js +32 -0
- package/dist/models/RuntimeDebugLog.js.map +1 -0
- package/dist/models/RuntimeEvent.d.ts +95 -0
- package/dist/models/RuntimeEvent.js +2 -0
- package/dist/models/RuntimeEvent.js.map +1 -0
- package/dist/models/WorkflowRunJob.d.ts +4 -0
- package/dist/services/RuntimeEvents.service.d.ts +16 -0
- package/dist/services/RuntimeEvents.service.js +35 -0
- package/dist/services/RuntimeEvents.service.js.map +1 -0
- package/dist/services/WorkflowRunScheduler.service.d.ts +11 -1
- package/dist/services/WorkflowRunScheduler.service.js +93 -3
- package/dist/services/WorkflowRunScheduler.service.js.map +1 -1
- package/dist/tools/format-runtime-event.d.ts +3 -0
- package/dist/tools/format-runtime-event.js +51 -0
- package/dist/tools/format-runtime-event.js.map +1 -0
- package/dist/tools/runtime-control-client.d.ts +15 -0
- package/dist/tools/runtime-control-client.js +54 -0
- package/dist/tools/runtime-control-client.js.map +1 -0
- package/dist/tools/runtime-registry.d.ts +26 -0
- package/dist/tools/runtime-registry.js +57 -0
- package/dist/tools/runtime-registry.js.map +1 -0
- package/dist/tools/start-runtime-monitor.d.ts +12 -0
- package/dist/tools/start-runtime-monitor.js +69 -0
- package/dist/tools/start-runtime-monitor.js.map +1 -0
- package/dist/tools/to-runtime-config.d.ts +3 -0
- package/dist/tools/to-runtime-config.js +13 -0
- package/dist/tools/to-runtime-config.js.map +1 -0
- package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.d.ts +3 -1
- package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js +20 -2
- package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js.map +1 -1
- package/dist/use-cases/NextTickWorkflowRun.usecase.d.ts +3 -1
- package/dist/use-cases/NextTickWorkflowRun.usecase.js +40 -3
- package/dist/use-cases/NextTickWorkflowRun.usecase.js.map +1 -1
- package/dist/workers/app-process.js +34 -17
- package/dist/workers/app-process.js.map +1 -1
- package/dist/workers/workflow-worker.js +4 -0
- package/dist/workers/workflow-worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { RuntimeEvent } from './RuntimeEvent.js';
|
|
2
|
+
import type { RuntimeEventsService } from '../services/RuntimeEvents.service.js';
|
|
3
|
+
import { type RuntimeInfo, type RuntimeStatus } from '../tools/runtime-registry.js';
|
|
4
|
+
/** First line a client sends; the server answers with NDJSON lines. */
|
|
5
|
+
export interface RuntimeControlRequest {
|
|
6
|
+
method: 'status' | 'watch';
|
|
7
|
+
}
|
|
8
|
+
export type RuntimeControlMessage = ({
|
|
9
|
+
type: 'status';
|
|
10
|
+
} & RuntimeStatus) | {
|
|
11
|
+
type: 'event';
|
|
12
|
+
event: RuntimeEvent;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'error';
|
|
15
|
+
message: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Local socket (named pipe on Windows) through which `framework runtime`
|
|
19
|
+
* reads the status of this app process and follows its events.
|
|
20
|
+
*/
|
|
21
|
+
export declare class RuntimeControlServer {
|
|
22
|
+
private readonly info;
|
|
23
|
+
private readonly status;
|
|
24
|
+
private readonly events;
|
|
25
|
+
private readonly server;
|
|
26
|
+
constructor(info: RuntimeInfo, status: () => Promise<RuntimeStatus>, events: RuntimeEventsService);
|
|
27
|
+
start(): Promise<void>;
|
|
28
|
+
/** Synchronous so it can run in a process `exit` handler. */
|
|
29
|
+
close(): void;
|
|
30
|
+
private onConnection;
|
|
31
|
+
private handle;
|
|
32
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import net from 'node:net';
|
|
3
|
+
import { runtimeRegistryDir, runtimeRegistryFile, } from '../tools/runtime-registry.js';
|
|
4
|
+
const send = (socket, message) => socket.write(`${JSON.stringify(message)}\n`);
|
|
5
|
+
/**
|
|
6
|
+
* Local socket (named pipe on Windows) through which `framework runtime`
|
|
7
|
+
* reads the status of this app process and follows its events.
|
|
8
|
+
*/
|
|
9
|
+
export class RuntimeControlServer {
|
|
10
|
+
info;
|
|
11
|
+
status;
|
|
12
|
+
events;
|
|
13
|
+
server;
|
|
14
|
+
constructor(info, status, events) {
|
|
15
|
+
this.info = info;
|
|
16
|
+
this.status = status;
|
|
17
|
+
this.events = events;
|
|
18
|
+
this.server = net.createServer(socket => this.onConnection(socket));
|
|
19
|
+
}
|
|
20
|
+
async start() {
|
|
21
|
+
fs.mkdirSync(runtimeRegistryDir(), { recursive: true, mode: 0o700 });
|
|
22
|
+
if (process.platform !== 'win32')
|
|
23
|
+
fs.rmSync(this.info.socket, { force: true });
|
|
24
|
+
await new Promise((resolve, reject) => {
|
|
25
|
+
this.server.once('error', reject);
|
|
26
|
+
this.server.listen(this.info.socket, () => {
|
|
27
|
+
this.server.off('error', reject);
|
|
28
|
+
resolve();
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
fs.writeFileSync(runtimeRegistryFile(this.info.pid), JSON.stringify(this.info, null, 2));
|
|
32
|
+
}
|
|
33
|
+
/** Synchronous so it can run in a process `exit` handler. */
|
|
34
|
+
close() {
|
|
35
|
+
this.server.close();
|
|
36
|
+
fs.rmSync(runtimeRegistryFile(this.info.pid), { force: true });
|
|
37
|
+
if (process.platform !== 'win32')
|
|
38
|
+
fs.rmSync(this.info.socket, { force: true });
|
|
39
|
+
}
|
|
40
|
+
onConnection(socket) {
|
|
41
|
+
let buffer = '';
|
|
42
|
+
socket.setEncoding('utf8');
|
|
43
|
+
socket.on('error', () => socket.destroy());
|
|
44
|
+
const onData = (chunk) => {
|
|
45
|
+
buffer += chunk;
|
|
46
|
+
const end = buffer.indexOf('\n');
|
|
47
|
+
if (end === -1)
|
|
48
|
+
return;
|
|
49
|
+
socket.off('data', onData);
|
|
50
|
+
void this.handle(socket, buffer.slice(0, end));
|
|
51
|
+
};
|
|
52
|
+
socket.on('data', onData);
|
|
53
|
+
}
|
|
54
|
+
async handle(socket, line) {
|
|
55
|
+
let request;
|
|
56
|
+
try {
|
|
57
|
+
request = JSON.parse(line);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
send(socket, { type: 'error', message: 'Invalid request' });
|
|
61
|
+
return void socket.end();
|
|
62
|
+
}
|
|
63
|
+
if (request.method !== 'status' && request.method !== 'watch') {
|
|
64
|
+
send(socket, { type: 'error', message: 'Unknown method' });
|
|
65
|
+
return void socket.end();
|
|
66
|
+
}
|
|
67
|
+
send(socket, { type: 'status', ...(await this.status()) });
|
|
68
|
+
if (request.method === 'status')
|
|
69
|
+
return void socket.end();
|
|
70
|
+
const forward = (event) => send(socket, { type: 'event', event });
|
|
71
|
+
this.events.on('event', forward);
|
|
72
|
+
socket.once('close', () => this.events.off('event', forward));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=RuntimeControlServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeControlServer.js","sourceRoot":"","sources":["../../src/models/RuntimeControlServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RuntimeEvent } from './RuntimeEvent.js';
|
|
2
|
+
/** `-` writes readable lines to stderr; a path appends NDJSON to that file. */
|
|
3
|
+
export declare const DEBUG_LOG_STDERR = "-";
|
|
4
|
+
export declare class RuntimeDebugLog {
|
|
5
|
+
private readonly toStderr;
|
|
6
|
+
private fd;
|
|
7
|
+
constructor(target: string);
|
|
8
|
+
readonly write: (event: RuntimeEvent) => void;
|
|
9
|
+
close(): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { formatRuntimeEvent } from '../tools/format-runtime-event.js';
|
|
4
|
+
/** `-` writes readable lines to stderr; a path appends NDJSON to that file. */
|
|
5
|
+
export const DEBUG_LOG_STDERR = '-';
|
|
6
|
+
export class RuntimeDebugLog {
|
|
7
|
+
toStderr;
|
|
8
|
+
// Written synchronously: the app process may exit right after an event.
|
|
9
|
+
fd = null;
|
|
10
|
+
constructor(target) {
|
|
11
|
+
this.toStderr = target === DEBUG_LOG_STDERR;
|
|
12
|
+
if (this.toStderr)
|
|
13
|
+
return;
|
|
14
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
15
|
+
this.fd = fs.openSync(target, 'a');
|
|
16
|
+
}
|
|
17
|
+
write = (event) => {
|
|
18
|
+
if (this.toStderr) {
|
|
19
|
+
process.stderr.write(`[runtime] ${formatRuntimeEvent(event)}\n`);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (this.fd !== null)
|
|
23
|
+
fs.writeSync(this.fd, `${JSON.stringify(event)}\n`);
|
|
24
|
+
};
|
|
25
|
+
close() {
|
|
26
|
+
if (this.fd === null)
|
|
27
|
+
return;
|
|
28
|
+
fs.closeSync(this.fd);
|
|
29
|
+
this.fd = null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=RuntimeDebugLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeDebugLog.js","sourceRoot":"","sources":["../../src/models/RuntimeDebugLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AAErE,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAEnC,MAAM,OAAO,eAAe;IACT,QAAQ,CAAS;IAElC,wEAAwE;IAChE,EAAE,GAAkB,IAAI,CAAA;IAEhC,YAAY,MAAc;QACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,KAAK,gBAAgB,CAAA;QAE3C,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAM;QAEzB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEvD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;IAEe,KAAK,GAAG,CAAC,KAAmB,EAAQ,EAAE;QACpD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAEhE,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI;YAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC3E,CAAC,CAAA;IAEM,KAAK;QACV,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI;YAAE,OAAM;QAE5B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAErB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { WorkflowRunJobKind } from './WorkflowRunJob.js';
|
|
2
|
+
/** A job as runtime events describe it: what it is, never its payload. */
|
|
3
|
+
export interface RuntimeJobSummary {
|
|
4
|
+
kind: WorkflowRunJobKind;
|
|
5
|
+
runId: string | null;
|
|
6
|
+
/** The activity, pending or child run the job is about, when there is one. */
|
|
7
|
+
target: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface RuntimeLaneStats {
|
|
10
|
+
lane: number;
|
|
11
|
+
inFlight: number;
|
|
12
|
+
pinnedRuns: number;
|
|
13
|
+
}
|
|
14
|
+
export interface RuntimeQueueStats {
|
|
15
|
+
workers: number;
|
|
16
|
+
concurrency: number;
|
|
17
|
+
capacity: number;
|
|
18
|
+
queued: number;
|
|
19
|
+
urgent: number;
|
|
20
|
+
inFlight: number;
|
|
21
|
+
lanes: RuntimeLaneStats[];
|
|
22
|
+
}
|
|
23
|
+
export interface RuntimeRunningJob extends RuntimeJobSummary {
|
|
24
|
+
lane: number;
|
|
25
|
+
startedAt: string;
|
|
26
|
+
}
|
|
27
|
+
export interface RuntimeQueueSnapshot extends RuntimeQueueStats {
|
|
28
|
+
running: RuntimeRunningJob[];
|
|
29
|
+
waiting: RuntimeJobSummary[];
|
|
30
|
+
}
|
|
31
|
+
/** Something the runtime did, published on the coordinator. */
|
|
32
|
+
export type RuntimeEventBody = {
|
|
33
|
+
type: 'job:queued';
|
|
34
|
+
job: RuntimeJobSummary;
|
|
35
|
+
queue: RuntimeQueueStats;
|
|
36
|
+
} | {
|
|
37
|
+
type: 'job:started';
|
|
38
|
+
job: RuntimeJobSummary;
|
|
39
|
+
lane: number;
|
|
40
|
+
queue: RuntimeQueueStats;
|
|
41
|
+
} | {
|
|
42
|
+
type: 'job:finished';
|
|
43
|
+
job: RuntimeJobSummary;
|
|
44
|
+
lane: number;
|
|
45
|
+
durationInMs: number;
|
|
46
|
+
error: string | null;
|
|
47
|
+
queue: RuntimeQueueStats;
|
|
48
|
+
} | {
|
|
49
|
+
type: 'run:created';
|
|
50
|
+
runId: string;
|
|
51
|
+
workflow: string;
|
|
52
|
+
parentRunId: string | null;
|
|
53
|
+
} | {
|
|
54
|
+
type: 'run:settled';
|
|
55
|
+
runId: string;
|
|
56
|
+
workflow: string;
|
|
57
|
+
status: 'fulfilled' | 'rejected';
|
|
58
|
+
} | {
|
|
59
|
+
type: 'activity:started';
|
|
60
|
+
runId: string;
|
|
61
|
+
activityId: string;
|
|
62
|
+
activityType: string;
|
|
63
|
+
kind: 'sync' | 'async';
|
|
64
|
+
} | {
|
|
65
|
+
type: 'activity:waiting';
|
|
66
|
+
runId: string;
|
|
67
|
+
activityId: string;
|
|
68
|
+
activityType: string;
|
|
69
|
+
timeoutAt: string | null;
|
|
70
|
+
} | {
|
|
71
|
+
type: 'activity:settled';
|
|
72
|
+
runId: string;
|
|
73
|
+
activityId: string;
|
|
74
|
+
activityType: string;
|
|
75
|
+
status: 'fulfilled' | 'rejected';
|
|
76
|
+
/** Why a sync activity or a bootstrap threw, when it did. */
|
|
77
|
+
error?: string;
|
|
78
|
+
} | {
|
|
79
|
+
type: 'timeout:scheduled';
|
|
80
|
+
runId: string;
|
|
81
|
+
pendingId: string;
|
|
82
|
+
timeoutAt: string;
|
|
83
|
+
} | {
|
|
84
|
+
type: 'timeout:fired';
|
|
85
|
+
runId: string;
|
|
86
|
+
pendingId: string;
|
|
87
|
+
} | {
|
|
88
|
+
type: 'worker:lost';
|
|
89
|
+
lane: number;
|
|
90
|
+
error: string;
|
|
91
|
+
};
|
|
92
|
+
export type RuntimeEvent = RuntimeEventBody & {
|
|
93
|
+
at: string;
|
|
94
|
+
};
|
|
95
|
+
export type RuntimeEventType = RuntimeEvent['type'];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeEvent.js","sourceRoot":"","sources":["../../src/models/RuntimeEvent.ts"],"names":[],"mappings":""}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AsyncActivityCallback } from '@t4h.framework/core';
|
|
2
|
+
import type { RuntimeEvent } from './RuntimeEvent.js';
|
|
2
3
|
/**
|
|
3
4
|
* Unit of work the scheduler hands to an executor. Jobs carrying a `runId`
|
|
4
5
|
* are serialized per run and pinned to the executor lane that first ran it,
|
|
@@ -75,6 +76,9 @@ export type WorkflowWorkerMessage = {
|
|
|
75
76
|
} | {
|
|
76
77
|
type: 'events:run-updated';
|
|
77
78
|
runId: string;
|
|
79
|
+
} | {
|
|
80
|
+
type: 'runtime:event';
|
|
81
|
+
event: RuntimeEvent;
|
|
78
82
|
};
|
|
79
83
|
/** Messages the coordinator thread sends to a workflow worker. */
|
|
80
84
|
export type WorkflowCoordinatorMessage = {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { RuntimeEvent, RuntimeEventBody } from '../models/RuntimeEvent.js';
|
|
3
|
+
/**
|
|
4
|
+
* Publishes what the runtime does (jobs, runs, activities, timeouts) for the
|
|
5
|
+
* debug log and `framework runtime watch`. Worker threads forward their
|
|
6
|
+
* events to the coordinator, which is the only one with listeners.
|
|
7
|
+
*/
|
|
8
|
+
export declare class RuntimeEventsService extends EventEmitter<{
|
|
9
|
+
event: [RuntimeEvent];
|
|
10
|
+
}> {
|
|
11
|
+
private forward;
|
|
12
|
+
forwardTo(forward: (event: RuntimeEvent) => void): void;
|
|
13
|
+
publish(body: RuntimeEventBody): void;
|
|
14
|
+
/** Re-emits an event that already happened elsewhere (a worker). */
|
|
15
|
+
dispatch(event: RuntimeEvent): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { EventEmitter } from 'node:events';
|
|
8
|
+
import { Injectable } from 'pleroma';
|
|
9
|
+
/**
|
|
10
|
+
* Publishes what the runtime does (jobs, runs, activities, timeouts) for the
|
|
11
|
+
* debug log and `framework runtime watch`. Worker threads forward their
|
|
12
|
+
* events to the coordinator, which is the only one with listeners.
|
|
13
|
+
*/
|
|
14
|
+
let RuntimeEventsService = class RuntimeEventsService extends EventEmitter {
|
|
15
|
+
forward = null;
|
|
16
|
+
forwardTo(forward) {
|
|
17
|
+
this.forward = forward;
|
|
18
|
+
}
|
|
19
|
+
publish(body) {
|
|
20
|
+
if (!this.forward && this.listenerCount('event') === 0)
|
|
21
|
+
return;
|
|
22
|
+
this.dispatch({ ...body, at: new Date().toISOString() });
|
|
23
|
+
}
|
|
24
|
+
/** Re-emits an event that already happened elsewhere (a worker). */
|
|
25
|
+
dispatch(event) {
|
|
26
|
+
if (this.forward)
|
|
27
|
+
return this.forward(event);
|
|
28
|
+
this.emit('event', event);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
RuntimeEventsService = __decorate([
|
|
32
|
+
Injectable()
|
|
33
|
+
], RuntimeEventsService);
|
|
34
|
+
export { RuntimeEventsService };
|
|
35
|
+
//# sourceMappingURL=RuntimeEvents.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeEvents.service.js","sourceRoot":"","sources":["../../src/services/RuntimeEvents.service.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAIpC;;;;GAIG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,YAExC;IACQ,OAAO,GAA2C,IAAI,CAAA;IAEvD,SAAS,CAAC,OAAsC;QACrD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAEM,OAAO,CAAC,IAAsB;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAM;QAE9D,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED,oEAAoE;IAC7D,QAAQ,CAAC,KAAmB;QACjC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAE5C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC3B,CAAC;CACF,CAAA;AArBY,oBAAoB;IADhC,UAAU,EAAE;GACA,oBAAoB,CAqBhC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { RuntimeEventsService } from './RuntimeEvents.service.js';
|
|
1
2
|
import { TimeoutSchedulerService } from './TimeoutScheduler.service.js';
|
|
3
|
+
import type { RuntimeJobSummary, RuntimeQueueSnapshot, RuntimeQueueStats } from '../models/RuntimeEvent.js';
|
|
2
4
|
import type { WorkflowRunJob } from '../models/WorkflowRunJob.js';
|
|
3
5
|
import { WorkflowRunRepository } from '../repositories/WorkflowRun.repository.js';
|
|
4
6
|
export interface WorkflowRunJobExecutor {
|
|
@@ -15,9 +17,11 @@ export interface WorkflowRunSchedulerForward {
|
|
|
15
17
|
scheduleTimeout(runId: string, pendingId: string, timeoutAt: Date): void;
|
|
16
18
|
cancelTimeout(pendingId: string): void;
|
|
17
19
|
}
|
|
20
|
+
export declare function toRuntimeJobSummary(job: WorkflowRunJob): RuntimeJobSummary;
|
|
18
21
|
export declare class WorkflowRunSchedulerService {
|
|
19
22
|
private readonly timeoutScheduler;
|
|
20
23
|
private readonly workflowRunRepository;
|
|
24
|
+
private readonly runtimeEvents;
|
|
21
25
|
private executor;
|
|
22
26
|
private forward;
|
|
23
27
|
private readonly urgent;
|
|
@@ -27,7 +31,12 @@ export declare class WorkflowRunSchedulerService {
|
|
|
27
31
|
private readonly laneByRun;
|
|
28
32
|
private inFlight;
|
|
29
33
|
private pinnedByLane;
|
|
30
|
-
|
|
34
|
+
private readonly running;
|
|
35
|
+
constructor(timeoutScheduler: TimeoutSchedulerService, workflowRunRepository: WorkflowRunRepository, runtimeEvents: RuntimeEventsService);
|
|
36
|
+
/** Counts of the queue and of every lane. */
|
|
37
|
+
stats(): RuntimeQueueStats;
|
|
38
|
+
/** `stats()` plus the jobs running and the first ones waiting. */
|
|
39
|
+
snapshot(): RuntimeQueueSnapshot;
|
|
31
40
|
/** Runs jobs on `executor` instead of the current thread. */
|
|
32
41
|
use(executor: WorkflowRunJobExecutor): void;
|
|
33
42
|
/** Hands every job and timeout to the coordinator (worker threads). */
|
|
@@ -48,5 +57,6 @@ export declare class WorkflowRunSchedulerService {
|
|
|
48
57
|
private dispatch;
|
|
49
58
|
private unpinIfSettled;
|
|
50
59
|
private isQueued;
|
|
60
|
+
private publishQueued;
|
|
51
61
|
private logFailure;
|
|
52
62
|
}
|
|
@@ -9,13 +9,26 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
9
9
|
};
|
|
10
10
|
import { styleText } from 'node:util';
|
|
11
11
|
import { Inject, Injectable } from 'pleroma';
|
|
12
|
+
import { RuntimeEventsService } from './RuntimeEvents.service.js';
|
|
12
13
|
import { TimeoutSchedulerService } from './TimeoutScheduler.service.js';
|
|
13
14
|
import { LocalWorkflowRunJobExecutor } from '../models/LocalWorkflowRunJobExecutor.js';
|
|
14
15
|
import { WorkflowRunRepository } from '../repositories/WorkflowRun.repository.js';
|
|
15
16
|
const jobRunId = (job) => 'runId' in job ? job.runId : undefined;
|
|
17
|
+
const SNAPSHOT_WAITING_LIMIT = 50;
|
|
18
|
+
export function toRuntimeJobSummary(job) {
|
|
19
|
+
const target = 'pendingId' in job
|
|
20
|
+
? job.pendingId
|
|
21
|
+
: 'activityId' in job
|
|
22
|
+
? job.activityId
|
|
23
|
+
: 'childRunId' in job
|
|
24
|
+
? job.childRunId
|
|
25
|
+
: null;
|
|
26
|
+
return { kind: job.kind, runId: jobRunId(job) ?? null, target };
|
|
27
|
+
}
|
|
16
28
|
let WorkflowRunSchedulerService = class WorkflowRunSchedulerService {
|
|
17
29
|
timeoutScheduler;
|
|
18
30
|
workflowRunRepository;
|
|
31
|
+
runtimeEvents;
|
|
19
32
|
executor = null;
|
|
20
33
|
forward = null;
|
|
21
34
|
urgent = [];
|
|
@@ -25,9 +38,39 @@ let WorkflowRunSchedulerService = class WorkflowRunSchedulerService {
|
|
|
25
38
|
laneByRun = new Map();
|
|
26
39
|
inFlight = [];
|
|
27
40
|
pinnedByLane = [];
|
|
28
|
-
|
|
41
|
+
running = new Set();
|
|
42
|
+
constructor(timeoutScheduler, workflowRunRepository, runtimeEvents) {
|
|
29
43
|
this.timeoutScheduler = timeoutScheduler;
|
|
30
44
|
this.workflowRunRepository = workflowRunRepository;
|
|
45
|
+
this.runtimeEvents = runtimeEvents;
|
|
46
|
+
}
|
|
47
|
+
/** Counts of the queue and of every lane. */
|
|
48
|
+
stats() {
|
|
49
|
+
const { lanes, concurrency } = this.getExecutor();
|
|
50
|
+
const inFlight = this.inFlight.reduce((sum, count) => sum + count, 0);
|
|
51
|
+
return {
|
|
52
|
+
workers: lanes,
|
|
53
|
+
concurrency,
|
|
54
|
+
capacity: lanes * concurrency,
|
|
55
|
+
queued: this.urgent.length + this.normal.length,
|
|
56
|
+
urgent: this.urgent.length,
|
|
57
|
+
inFlight,
|
|
58
|
+
lanes: this.inFlight.map((count, lane) => ({
|
|
59
|
+
lane,
|
|
60
|
+
inFlight: count,
|
|
61
|
+
pinnedRuns: this.pinnedByLane[lane] ?? 0,
|
|
62
|
+
})),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** `stats()` plus the jobs running and the first ones waiting. */
|
|
66
|
+
snapshot() {
|
|
67
|
+
return {
|
|
68
|
+
...this.stats(),
|
|
69
|
+
running: [...this.running].map(job => ({ ...job })),
|
|
70
|
+
waiting: [...this.urgent, ...this.normal]
|
|
71
|
+
.slice(0, SNAPSHOT_WAITING_LIMIT)
|
|
72
|
+
.map(entry => toRuntimeJobSummary(entry.job)),
|
|
73
|
+
};
|
|
31
74
|
}
|
|
32
75
|
/** Runs jobs on `executor` instead of the current thread. */
|
|
33
76
|
use(executor) {
|
|
@@ -54,6 +97,7 @@ let WorkflowRunSchedulerService = class WorkflowRunSchedulerService {
|
|
|
54
97
|
resolve: () => { },
|
|
55
98
|
reject: error => this.logFailure(job, error),
|
|
56
99
|
});
|
|
100
|
+
this.publishQueued(job);
|
|
57
101
|
this.drain();
|
|
58
102
|
}
|
|
59
103
|
/** Queues a job ahead of background work and resolves with its result. */
|
|
@@ -66,6 +110,7 @@ let WorkflowRunSchedulerService = class WorkflowRunSchedulerService {
|
|
|
66
110
|
resolve: value => resolve(value),
|
|
67
111
|
reject,
|
|
68
112
|
});
|
|
113
|
+
this.publishQueued(job);
|
|
69
114
|
this.drain();
|
|
70
115
|
});
|
|
71
116
|
}
|
|
@@ -76,7 +121,16 @@ let WorkflowRunSchedulerService = class WorkflowRunSchedulerService {
|
|
|
76
121
|
scheduleTimeout(runId, pendingId, timeoutAt) {
|
|
77
122
|
if (this.forward)
|
|
78
123
|
return this.forward.scheduleTimeout(runId, pendingId, timeoutAt);
|
|
79
|
-
this.timeoutScheduler.schedule(pendingId, timeoutAt, () =>
|
|
124
|
+
this.timeoutScheduler.schedule(pendingId, timeoutAt, () => {
|
|
125
|
+
this.runtimeEvents.publish({ type: 'timeout:fired', runId, pendingId });
|
|
126
|
+
this.enqueue({ kind: 'pending.execute', runId, pendingId });
|
|
127
|
+
});
|
|
128
|
+
this.runtimeEvents.publish({
|
|
129
|
+
type: 'timeout:scheduled',
|
|
130
|
+
runId,
|
|
131
|
+
pendingId,
|
|
132
|
+
timeoutAt: timeoutAt.toISOString(),
|
|
133
|
+
});
|
|
80
134
|
}
|
|
81
135
|
cancelTimeout(pendingId) {
|
|
82
136
|
if (this.forward)
|
|
@@ -147,11 +201,39 @@ let WorkflowRunSchedulerService = class WorkflowRunSchedulerService {
|
|
|
147
201
|
}
|
|
148
202
|
}
|
|
149
203
|
this.inFlight[lane] += 1;
|
|
204
|
+
const summary = toRuntimeJobSummary(job);
|
|
205
|
+
const startedAt = Date.now();
|
|
206
|
+
const running = {
|
|
207
|
+
...summary,
|
|
208
|
+
lane,
|
|
209
|
+
startedAt: new Date(startedAt).toISOString(),
|
|
210
|
+
};
|
|
211
|
+
this.running.add(running);
|
|
212
|
+
this.runtimeEvents.publish({
|
|
213
|
+
type: 'job:started',
|
|
214
|
+
job: summary,
|
|
215
|
+
lane,
|
|
216
|
+
queue: this.stats(),
|
|
217
|
+
});
|
|
218
|
+
let failure = null;
|
|
150
219
|
this.getExecutor()
|
|
151
220
|
.execute(lane, job)
|
|
221
|
+
.catch(error => {
|
|
222
|
+
failure = error instanceof Error ? error.message : String(error);
|
|
223
|
+
throw error;
|
|
224
|
+
})
|
|
152
225
|
.then(resolve, reject)
|
|
153
226
|
.finally(() => {
|
|
154
227
|
this.inFlight[lane] -= 1;
|
|
228
|
+
this.running.delete(running);
|
|
229
|
+
this.runtimeEvents.publish({
|
|
230
|
+
type: 'job:finished',
|
|
231
|
+
job: summary,
|
|
232
|
+
lane,
|
|
233
|
+
durationInMs: Date.now() - startedAt,
|
|
234
|
+
error: failure,
|
|
235
|
+
queue: this.stats(),
|
|
236
|
+
});
|
|
155
237
|
if (runId) {
|
|
156
238
|
this.busyRuns.delete(runId);
|
|
157
239
|
void this.unpinIfSettled(runId);
|
|
@@ -174,6 +256,13 @@ let WorkflowRunSchedulerService = class WorkflowRunSchedulerService {
|
|
|
174
256
|
isQueued(runId) {
|
|
175
257
|
return [...this.urgent, ...this.normal].some(entry => jobRunId(entry.job) === runId);
|
|
176
258
|
}
|
|
259
|
+
publishQueued(job) {
|
|
260
|
+
this.runtimeEvents.publish({
|
|
261
|
+
type: 'job:queued',
|
|
262
|
+
job: toRuntimeJobSummary(job),
|
|
263
|
+
queue: this.stats(),
|
|
264
|
+
});
|
|
265
|
+
}
|
|
177
266
|
logFailure(job, error) {
|
|
178
267
|
const target = jobRunId(job);
|
|
179
268
|
console.error(styleText('red', `[Runtime] ${job.kind} failed${target ? ` for run ${target}` : ''}:`, { stream: process.stderr }), error);
|
|
@@ -182,7 +271,8 @@ let WorkflowRunSchedulerService = class WorkflowRunSchedulerService {
|
|
|
182
271
|
WorkflowRunSchedulerService = __decorate([
|
|
183
272
|
Injectable(),
|
|
184
273
|
__param(0, Inject(() => TimeoutSchedulerService)),
|
|
185
|
-
__param(1, Inject(() => WorkflowRunRepository))
|
|
274
|
+
__param(1, Inject(() => WorkflowRunRepository)),
|
|
275
|
+
__param(2, Inject(() => RuntimeEventsService))
|
|
186
276
|
], WorkflowRunSchedulerService);
|
|
187
277
|
export { WorkflowRunSchedulerService };
|
|
188
278
|
//# sourceMappingURL=WorkflowRunScheduler.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowRunScheduler.service.js","sourceRoot":"","sources":["../../src/services/WorkflowRunScheduler.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAE5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAA;
|
|
1
|
+
{"version":3,"file":"WorkflowRunScheduler.service.js","sourceRoot":"","sources":["../../src/services/WorkflowRunScheduler.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const time = (at) => at.slice(11, 23);
|
|
2
|
+
const job = ({ kind, runId, target }) => [
|
|
3
|
+
kind,
|
|
4
|
+
...(runId ? [`run=${runId}`] : []),
|
|
5
|
+
...(target ? [`target=${target}`] : []),
|
|
6
|
+
].join(' ');
|
|
7
|
+
const queue = ({ queued, inFlight, capacity }) => `queue=${queued} running=${inFlight}/${capacity}`;
|
|
8
|
+
function describe(event) {
|
|
9
|
+
switch (event.type) {
|
|
10
|
+
case 'job:queued':
|
|
11
|
+
return `${job(event.job)} | ${queue(event.queue)}`;
|
|
12
|
+
case 'job:started':
|
|
13
|
+
return `${job(event.job)} lane=${event.lane} | ${queue(event.queue)}`;
|
|
14
|
+
case 'job:finished':
|
|
15
|
+
return [
|
|
16
|
+
`${job(event.job)} lane=${event.lane} ${event.durationInMs}ms`,
|
|
17
|
+
event.error ? `failed: ${event.error}` : 'ok',
|
|
18
|
+
`| ${queue(event.queue)}`,
|
|
19
|
+
].join(' ');
|
|
20
|
+
case 'run:created':
|
|
21
|
+
return [
|
|
22
|
+
`${event.workflow} run=${event.runId}`,
|
|
23
|
+
...(event.parentRunId ? [`parent=${event.parentRunId}`] : []),
|
|
24
|
+
].join(' ');
|
|
25
|
+
case 'run:settled':
|
|
26
|
+
return `${event.workflow} run=${event.runId} ${event.status}`;
|
|
27
|
+
case 'activity:started':
|
|
28
|
+
return `${event.activityType} (${event.kind}) run=${event.runId} activity=${event.activityId}`;
|
|
29
|
+
case 'activity:waiting':
|
|
30
|
+
return [
|
|
31
|
+
`${event.activityType} run=${event.runId} activity=${event.activityId}`,
|
|
32
|
+
...(event.timeoutAt ? [`timeout=${event.timeoutAt}`] : []),
|
|
33
|
+
].join(' ');
|
|
34
|
+
case 'activity:settled':
|
|
35
|
+
return [
|
|
36
|
+
`${event.activityType} ${event.status} run=${event.runId} activity=${event.activityId}`,
|
|
37
|
+
...(event.error ? [`error: ${event.error}`] : []),
|
|
38
|
+
].join(' ');
|
|
39
|
+
case 'timeout:scheduled':
|
|
40
|
+
return `run=${event.runId} pending=${event.pendingId} at=${event.timeoutAt}`;
|
|
41
|
+
case 'timeout:fired':
|
|
42
|
+
return `run=${event.runId} pending=${event.pendingId}`;
|
|
43
|
+
case 'worker:lost':
|
|
44
|
+
return `lane=${event.lane} ${event.error}`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** One human-readable line per event, for the terminal. */
|
|
48
|
+
export function formatRuntimeEvent(event) {
|
|
49
|
+
return `${time(event.at)} ${event.type.padEnd(17)} ${describe(event)}`;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=format-runtime-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-runtime-event.js","sourceRoot":"","sources":["../../src/tools/format-runtime-event.ts"],"names":[],"mappings":"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"}
|