@t4h.framework/dev 0.0.0-experimental-20261006121555 → 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 +16 -1
- package/README.md +7 -0
- package/dist/AppProcess.d.ts +7 -1
- package/dist/AppProcess.js +5 -2
- package/dist/AppProcess.js.map +1 -1
- package/dist/HeadlessApp.d.ts +3 -1
- package/dist/HeadlessApp.js +2 -2
- package/dist/HeadlessApp.js.map +1 -1
- package/dist/Server.d.ts +3 -0
- package/dist/Server.js +5 -0
- 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 +5 -0
- package/dist/index.js +4 -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/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 +31 -16
- 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,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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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RuntimeInfo, RuntimeStatus } from './runtime-registry.js';
|
|
2
|
+
import type { RuntimeEvent } from '../models/RuntimeEvent.js';
|
|
3
|
+
export interface RuntimeWatcher {
|
|
4
|
+
/** Resolves when the runtime closes the connection (or `close()` is called). */
|
|
5
|
+
readonly closed: Promise<void>;
|
|
6
|
+
close(): void;
|
|
7
|
+
}
|
|
8
|
+
export interface RuntimeWatchHandlers {
|
|
9
|
+
onStatus?: (status: RuntimeStatus) => void;
|
|
10
|
+
onEvent: (event: RuntimeEvent) => void;
|
|
11
|
+
}
|
|
12
|
+
/** Reads the queue and run counts of a running app process. */
|
|
13
|
+
export declare function requestRuntimeStatus(runtime: Pick<RuntimeInfo, 'socket'>): Promise<RuntimeStatus>;
|
|
14
|
+
/** Follows the events of a running app process until it closes. */
|
|
15
|
+
export declare function watchRuntime(runtime: Pick<RuntimeInfo, 'socket'>, { onStatus, onEvent }: RuntimeWatchHandlers): RuntimeWatcher;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import net from 'node:net';
|
|
2
|
+
const toStatus = ({ runtime, queue, runs }) => ({
|
|
3
|
+
runtime,
|
|
4
|
+
queue,
|
|
5
|
+
runs,
|
|
6
|
+
});
|
|
7
|
+
function connect(runtime, request, onMessage) {
|
|
8
|
+
const socket = net.createConnection(runtime.socket);
|
|
9
|
+
const closed = Promise.withResolvers();
|
|
10
|
+
let buffer = '';
|
|
11
|
+
socket.setEncoding('utf8');
|
|
12
|
+
socket.on('connect', () => socket.write(`${JSON.stringify(request)}\n`));
|
|
13
|
+
socket.on('data', (chunk) => {
|
|
14
|
+
buffer += chunk;
|
|
15
|
+
let end;
|
|
16
|
+
while ((end = buffer.indexOf('\n')) !== -1) {
|
|
17
|
+
const line = buffer.slice(0, end);
|
|
18
|
+
buffer = buffer.slice(end + 1);
|
|
19
|
+
if (line)
|
|
20
|
+
onMessage(JSON.parse(line));
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
socket.on('error', closed.reject);
|
|
24
|
+
socket.on('close', () => closed.resolve());
|
|
25
|
+
return { socket, closed: closed.promise };
|
|
26
|
+
}
|
|
27
|
+
/** Reads the queue and run counts of a running app process. */
|
|
28
|
+
export async function requestRuntimeStatus(runtime) {
|
|
29
|
+
let status = null;
|
|
30
|
+
let failure = null;
|
|
31
|
+
const { closed } = connect(runtime, { method: 'status' }, message => {
|
|
32
|
+
if (message.type === 'status')
|
|
33
|
+
status = toStatus(message);
|
|
34
|
+
if (message.type === 'error')
|
|
35
|
+
failure = message.message;
|
|
36
|
+
});
|
|
37
|
+
await closed;
|
|
38
|
+
if (failure)
|
|
39
|
+
throw new Error(failure);
|
|
40
|
+
if (!status)
|
|
41
|
+
throw new Error('The runtime closed without a status');
|
|
42
|
+
return status;
|
|
43
|
+
}
|
|
44
|
+
/** Follows the events of a running app process until it closes. */
|
|
45
|
+
export function watchRuntime(runtime, { onStatus, onEvent }) {
|
|
46
|
+
const { socket, closed } = connect(runtime, { method: 'watch' }, message => {
|
|
47
|
+
if (message.type === 'status')
|
|
48
|
+
onStatus?.(toStatus(message));
|
|
49
|
+
if (message.type === 'event')
|
|
50
|
+
onEvent(message.event);
|
|
51
|
+
});
|
|
52
|
+
return { closed, close: () => socket.end() };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=runtime-control-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-control-client.js","sourceRoot":"","sources":["../../src/tools/runtime-control-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { RuntimeQueueSnapshot } from '../models/RuntimeEvent.js';
|
|
2
|
+
export type RuntimeKind = 'dev' | 'headless' | 'app';
|
|
3
|
+
/** What a running app process advertises about itself. */
|
|
4
|
+
export interface RuntimeInfo {
|
|
5
|
+
pid: number;
|
|
6
|
+
/** The `framework dev` / `framework workflows` process that forked it. */
|
|
7
|
+
parentPid: number;
|
|
8
|
+
kind: RuntimeKind;
|
|
9
|
+
projectDir: string | null;
|
|
10
|
+
entrypoint: string;
|
|
11
|
+
socket: string;
|
|
12
|
+
startedAt: string;
|
|
13
|
+
}
|
|
14
|
+
export interface RuntimeStatus {
|
|
15
|
+
runtime: RuntimeInfo;
|
|
16
|
+
queue: RuntimeQueueSnapshot;
|
|
17
|
+
runs: {
|
|
18
|
+
running: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Per-user directory where running app processes register. */
|
|
22
|
+
export declare function runtimeRegistryDir(): string;
|
|
23
|
+
export declare function runtimeRegistryFile(pid: number): string;
|
|
24
|
+
export declare function runtimeSocketPath(pid: number): string;
|
|
25
|
+
/** Runtimes still running, oldest first; leftovers of dead ones are removed. */
|
|
26
|
+
export declare function listRuntimes(): Promise<RuntimeInfo[]>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
/** Per-user directory where running app processes register. */
|
|
5
|
+
export function runtimeRegistryDir() {
|
|
6
|
+
return path.join(os.tmpdir(), 't4h-framework', 'runtimes');
|
|
7
|
+
}
|
|
8
|
+
export function runtimeRegistryFile(pid) {
|
|
9
|
+
return path.join(runtimeRegistryDir(), `${pid}.json`);
|
|
10
|
+
}
|
|
11
|
+
export function runtimeSocketPath(pid) {
|
|
12
|
+
if (process.platform === 'win32')
|
|
13
|
+
return `\\\\.\\pipe\\t4h-framework-runtime-${pid}`;
|
|
14
|
+
return path.join(runtimeRegistryDir(), `${pid}.sock`);
|
|
15
|
+
}
|
|
16
|
+
function isAlive(pid) {
|
|
17
|
+
try {
|
|
18
|
+
process.kill(pid, 0);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
return error.code === 'EPERM';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Runtimes still running, oldest first; leftovers of dead ones are removed. */
|
|
26
|
+
export async function listRuntimes() {
|
|
27
|
+
const dir = runtimeRegistryDir();
|
|
28
|
+
let names;
|
|
29
|
+
try {
|
|
30
|
+
names = await fs.promises.readdir(dir);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
const runtimes = [];
|
|
36
|
+
for (const name of names) {
|
|
37
|
+
if (!name.endsWith('.json'))
|
|
38
|
+
continue;
|
|
39
|
+
const file = path.join(dir, name);
|
|
40
|
+
let info;
|
|
41
|
+
try {
|
|
42
|
+
info = JSON.parse(await fs.promises.readFile(file, 'utf8'));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (isAlive(info.pid)) {
|
|
48
|
+
runtimes.push(info);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
await fs.promises.rm(file, { force: true });
|
|
52
|
+
if (process.platform !== 'win32')
|
|
53
|
+
await fs.promises.rm(info.socket, { force: true });
|
|
54
|
+
}
|
|
55
|
+
return runtimes.sort((a, b) => a.startedAt.localeCompare(b.startedAt));
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=runtime-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-registry.js","sourceRoot":"","sources":["../../src/tools/runtime-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAwB5B,+DAA+D;AAC/D,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,UAAU,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC9B,OAAO,sCAAsC,GAAG,EAAE,CAAA;IAEpD,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,CAAA;AACvD,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAEpB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAQ,KAA+B,CAAC,IAAI,KAAK,OAAO,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAA;IAEhC,IAAI,KAAe,CAAA;IAEnB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,QAAQ,GAAkB,EAAE,CAAA;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAQ;QAErC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAEjC,IAAI,IAAiB,CAAA;QAErB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAEnB,SAAQ;QACV,CAAC;QAED,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAE3C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC9B,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;AACxE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type RuntimeKind } from './runtime-registry.js';
|
|
2
|
+
export interface RuntimeMonitorOptions {
|
|
3
|
+
kind: RuntimeKind;
|
|
4
|
+
projectDir: string | null;
|
|
5
|
+
entrypoint: string;
|
|
6
|
+
/** `-` (stderr), a file path (NDJSON) or `null` for no debug log. */
|
|
7
|
+
debugLog: string | null;
|
|
8
|
+
}
|
|
9
|
+
/** Turns run events into runtime events and opens the debug log. */
|
|
10
|
+
export declare function startRuntimeEvents(debugLog: string | null): void;
|
|
11
|
+
/** Registers this app process so `framework runtime` can find and watch it. */
|
|
12
|
+
export declare function startRuntimeControl({ kind, projectDir, entrypoint, }: Omit<RuntimeMonitorOptions, 'debugLog'>): Promise<void>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { styleText } from 'node:util';
|
|
2
|
+
import { container } from 'pleroma';
|
|
3
|
+
import { runtimeSocketPath, } from './runtime-registry.js';
|
|
4
|
+
import { RuntimeControlServer } from '../models/RuntimeControlServer.js';
|
|
5
|
+
import { RuntimeDebugLog } from '../models/RuntimeDebugLog.js';
|
|
6
|
+
import { RuntimeEventsService } from '../services/RuntimeEvents.service.js';
|
|
7
|
+
import { WorkflowRunEventsService } from '../services/WorkflowRunEvents.service.js';
|
|
8
|
+
import { WorkflowRunFacade } from '../services/WorkflowRunFacade.service.js';
|
|
9
|
+
import { WorkflowRunSchedulerService } from '../services/WorkflowRunScheduler.service.js';
|
|
10
|
+
/** Turns run events into runtime events and opens the debug log. */
|
|
11
|
+
export function startRuntimeEvents(debugLog) {
|
|
12
|
+
const runtimeEvents = container.resolve(RuntimeEventsService);
|
|
13
|
+
const runEvents = container.resolve(WorkflowRunEventsService);
|
|
14
|
+
const settled = new Set();
|
|
15
|
+
runEvents.on('run:created', (run) => runtimeEvents.publish({
|
|
16
|
+
type: 'run:created',
|
|
17
|
+
runId: run.id,
|
|
18
|
+
workflow: run.workflow,
|
|
19
|
+
parentRunId: run.parentWorkflowRun,
|
|
20
|
+
}));
|
|
21
|
+
runEvents.on('run:updated', (run) => {
|
|
22
|
+
if (run.status === 'running' || settled.has(run.id))
|
|
23
|
+
return;
|
|
24
|
+
settled.add(run.id);
|
|
25
|
+
runtimeEvents.publish({
|
|
26
|
+
type: 'run:settled',
|
|
27
|
+
runId: run.id,
|
|
28
|
+
workflow: run.workflow,
|
|
29
|
+
status: run.status,
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
if (!debugLog)
|
|
33
|
+
return;
|
|
34
|
+
const log = new RuntimeDebugLog(debugLog);
|
|
35
|
+
runtimeEvents.on('event', log.write);
|
|
36
|
+
process.once('exit', () => log.close());
|
|
37
|
+
}
|
|
38
|
+
/** Registers this app process so `framework runtime` can find and watch it. */
|
|
39
|
+
export async function startRuntimeControl({ kind, projectDir, entrypoint, }) {
|
|
40
|
+
const scheduler = container.resolve(WorkflowRunSchedulerService);
|
|
41
|
+
const info = {
|
|
42
|
+
pid: process.pid,
|
|
43
|
+
parentPid: process.ppid,
|
|
44
|
+
kind,
|
|
45
|
+
projectDir,
|
|
46
|
+
entrypoint,
|
|
47
|
+
socket: runtimeSocketPath(process.pid),
|
|
48
|
+
startedAt: new Date().toISOString(),
|
|
49
|
+
};
|
|
50
|
+
const control = new RuntimeControlServer(info, async () => ({
|
|
51
|
+
runtime: info,
|
|
52
|
+
queue: scheduler.snapshot(),
|
|
53
|
+
runs: {
|
|
54
|
+
running: (await container
|
|
55
|
+
.resolve(WorkflowRunFacade)
|
|
56
|
+
.find({ status: 'running', limit: 1 })).count,
|
|
57
|
+
},
|
|
58
|
+
}), container.resolve(RuntimeEventsService));
|
|
59
|
+
try {
|
|
60
|
+
await control.start();
|
|
61
|
+
process.once('exit', () => control.close());
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.warn(styleText('yellow', '[runtime] control socket unavailable:', {
|
|
65
|
+
stream: process.stderr,
|
|
66
|
+
}), error);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=start-runtime-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-runtime-monitor.js","sourceRoot":"","sources":["../../src/tools/start-runtime-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { WorkflowRunActivityRepository } from '../repositories/WorkflowRunActivi
|
|
|
4
4
|
import { WorkflowRunAsyncActivityPendingRepository } from '../repositories/WorkflowRunAsyncActivityPending.repository.js';
|
|
5
5
|
import { ActivityRegistryService } from '../services/ActivityRegistry.service.js';
|
|
6
6
|
import { RuntimeContextService } from '../services/RuntimeContext.service.js';
|
|
7
|
+
import { RuntimeEventsService } from '../services/RuntimeEvents.service.js';
|
|
7
8
|
import { WorkflowRunEventsService } from '../services/WorkflowRunEvents.service.js';
|
|
8
9
|
import { WorkflowRunLockService } from '../services/WorkflowRunLock.service.js';
|
|
9
10
|
import { WorkflowRunSchedulerService } from '../services/WorkflowRunScheduler.service.js';
|
|
@@ -19,6 +20,7 @@ export declare class ExecuteWorkflowRunAsyncActivity {
|
|
|
19
20
|
private readonly lock;
|
|
20
21
|
private readonly context;
|
|
21
22
|
private readonly events;
|
|
22
|
-
|
|
23
|
+
private readonly runtimeEvents;
|
|
24
|
+
constructor(workflowRunRepository: WorkflowRunRepository, workflowRunActivityRepository: WorkflowRunActivityRepository, workflowRunAsyncActivityPendingRepository: WorkflowRunAsyncActivityPendingRepository, activityRegistry: ActivityRegistryService, scheduler: WorkflowRunSchedulerService, lock: WorkflowRunLockService, context: RuntimeContextService, events: WorkflowRunEventsService, runtimeEvents: RuntimeEventsService);
|
|
23
25
|
execute(pendingId: string, { context }?: ExecuteWorkflowRunAsyncActivityOptions): Promise<void>;
|
|
24
26
|
}
|