@t4h.framework/dev 0.0.0-experimental-20261006133319 → 0.0.0-experimental-20261007204009
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 +4 -41
- package/README.md +12 -67
- package/dist/AppProcess.d.ts +2 -14
- package/dist/AppProcess.js +4 -22
- package/dist/AppProcess.js.map +1 -1
- package/dist/Server.d.ts +0 -4
- package/dist/Server.js +0 -10
- package/dist/Server.js.map +1 -1
- package/dist/constants/server.d.ts +1 -9
- package/dist/constants/server.js +1 -9
- package/dist/constants/server.js.map +1 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.js +0 -5
- package/dist/index.js.map +1 -1
- package/dist/models/FrameworkConfig.d.ts +0 -11
- package/dist/models/FrameworkConfig.js +0 -1
- package/dist/models/FrameworkConfig.js.map +1 -1
- package/dist/models/claims/DevCacheClaim.d.ts +1 -2
- package/dist/models/claims/DevCacheClaim.js +6 -17
- package/dist/models/claims/DevCacheClaim.js.map +1 -1
- package/dist/models/claims/DevORMClaim.js +1 -6
- package/dist/models/claims/DevORMClaim.js.map +1 -1
- package/dist/services/CallbackToken.service.d.ts +1 -4
- package/dist/services/CallbackToken.service.js +3 -10
- package/dist/services/CallbackToken.service.js.map +1 -1
- package/dist/services/Database.service.d.ts +0 -8
- package/dist/services/Database.service.js +3 -18
- package/dist/services/Database.service.js.map +1 -1
- package/dist/services/WorkflowRunAsyncActivityFacade.service.d.ts +0 -2
- package/dist/services/WorkflowRunAsyncActivityFacade.service.js +0 -6
- package/dist/services/WorkflowRunAsyncActivityFacade.service.js.map +1 -1
- package/dist/services/WorkflowRunEvents.service.d.ts +0 -9
- package/dist/services/WorkflowRunEvents.service.js +2 -13
- package/dist/services/WorkflowRunEvents.service.js.map +1 -1
- package/dist/services/WorkflowRunFacade.service.d.ts +0 -1
- package/dist/services/WorkflowRunFacade.service.js +0 -3
- package/dist/services/WorkflowRunFacade.service.js.map +1 -1
- package/dist/transport/AppProcessJsonRpc.js +4 -17
- package/dist/transport/AppProcessJsonRpc.js.map +1 -1
- package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.d.ts +5 -3
- package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js +10 -6
- package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js.map +1 -1
- package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.d.ts +9 -3
- package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js +39 -7
- package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js.map +1 -1
- package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.d.ts +5 -5
- package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js +15 -29
- package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js.map +1 -1
- package/dist/use-cases/NextTickWorkflowRun.usecase.d.ts +1 -6
- package/dist/use-cases/NextTickWorkflowRun.usecase.js +3 -54
- package/dist/use-cases/NextTickWorkflowRun.usecase.js.map +1 -1
- package/dist/use-cases/ReceiveWorkflowEvent.usecase.d.ts +2 -10
- package/dist/use-cases/ReceiveWorkflowEvent.usecase.js +5 -35
- package/dist/use-cases/ReceiveWorkflowEvent.usecase.js.map +1 -1
- package/dist/workers/app-process.d.ts +0 -8
- package/dist/workers/app-process.js +14 -114
- package/dist/workers/app-process.js.map +1 -1
- package/package.json +2 -2
- package/dist/HeadlessApp.d.ts +0 -65
- package/dist/HeadlessApp.js +0 -163
- package/dist/HeadlessApp.js.map +0 -1
- package/dist/models/LocalWorkflowRunJobExecutor.d.ts +0 -10
- package/dist/models/LocalWorkflowRunJobExecutor.js +0 -23
- package/dist/models/LocalWorkflowRunJobExecutor.js.map +0 -1
- package/dist/models/RuntimeControlServer.d.ts +0 -32
- package/dist/models/RuntimeControlServer.js +0 -75
- package/dist/models/RuntimeControlServer.js.map +0 -1
- package/dist/models/RuntimeDebugLog.d.ts +0 -10
- package/dist/models/RuntimeDebugLog.js +0 -32
- package/dist/models/RuntimeDebugLog.js.map +0 -1
- package/dist/models/RuntimeEvent.d.ts +0 -95
- package/dist/models/RuntimeEvent.js +0 -2
- package/dist/models/RuntimeEvent.js.map +0 -1
- package/dist/models/WorkflowRunJob.d.ts +0 -95
- package/dist/models/WorkflowRunJob.js +0 -2
- package/dist/models/WorkflowRunJob.js.map +0 -1
- package/dist/models/WorkflowWorkerPool.d.ts +0 -39
- package/dist/models/WorkflowWorkerPool.js +0 -154
- package/dist/models/WorkflowWorkerPool.js.map +0 -1
- package/dist/services/RuntimeEvents.service.d.ts +0 -16
- package/dist/services/RuntimeEvents.service.js +0 -35
- package/dist/services/RuntimeEvents.service.js.map +0 -1
- package/dist/services/WorkflowRunScheduler.service.d.ts +0 -62
- package/dist/services/WorkflowRunScheduler.service.js +0 -278
- package/dist/services/WorkflowRunScheduler.service.js.map +0 -1
- package/dist/tools/format-runtime-event.d.ts +0 -3
- package/dist/tools/format-runtime-event.js +0 -51
- package/dist/tools/format-runtime-event.js.map +0 -1
- package/dist/tools/run-workflow-run-job.d.ts +0 -3
- package/dist/tools/run-workflow-run-job.js +0 -25
- package/dist/tools/run-workflow-run-job.js.map +0 -1
- package/dist/tools/runtime-control-client.d.ts +0 -15
- package/dist/tools/runtime-control-client.js +0 -54
- package/dist/tools/runtime-control-client.js.map +0 -1
- package/dist/tools/runtime-registry.d.ts +0 -26
- package/dist/tools/runtime-registry.js +0 -57
- package/dist/tools/runtime-registry.js.map +0 -1
- package/dist/tools/start-runtime-monitor.d.ts +0 -12
- package/dist/tools/start-runtime-monitor.js +0 -69
- package/dist/tools/start-runtime-monitor.js.map +0 -1
- package/dist/tools/to-runtime-config.d.ts +0 -3
- package/dist/tools/to-runtime-config.js +0 -13
- package/dist/tools/to-runtime-config.js.map +0 -1
- package/dist/use-cases/RejectAbandonedWorkflowRuns.usecase.d.ts +0 -14
- package/dist/use-cases/RejectAbandonedWorkflowRuns.usecase.js +0 -55
- package/dist/use-cases/RejectAbandonedWorkflowRuns.usecase.js.map +0 -1
- package/dist/workers/workflow-worker.d.ts +0 -1
- package/dist/workers/workflow-worker.js +0 -58
- package/dist/workers/workflow-worker.js.map +0 -1
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import type { AsyncActivityCallback } from '@t4h.framework/core';
|
|
2
|
-
import type { RuntimeEvent } from './RuntimeEvent.js';
|
|
3
|
-
/**
|
|
4
|
-
* Unit of work the scheduler hands to an executor. Jobs carrying a `runId`
|
|
5
|
-
* are serialized per run and pinned to the executor lane that first ran it,
|
|
6
|
-
* since activity constructors only live in the thread that pushed them.
|
|
7
|
-
*/
|
|
8
|
-
export type WorkflowRunJob = {
|
|
9
|
-
kind: 'run.tick';
|
|
10
|
-
runId: string;
|
|
11
|
-
} | {
|
|
12
|
-
kind: 'run.settle-parent';
|
|
13
|
-
runId: string;
|
|
14
|
-
childRunId: string;
|
|
15
|
-
} | {
|
|
16
|
-
kind: 'pending.execute';
|
|
17
|
-
runId: string;
|
|
18
|
-
pendingId: string;
|
|
19
|
-
} | {
|
|
20
|
-
kind: 'activity.advance';
|
|
21
|
-
runId?: string;
|
|
22
|
-
activityId: string;
|
|
23
|
-
payload: unknown;
|
|
24
|
-
} | {
|
|
25
|
-
kind: 'callback.create';
|
|
26
|
-
runId?: string;
|
|
27
|
-
activityId: string;
|
|
28
|
-
token: string;
|
|
29
|
-
request: AsyncActivityCallback.Delivery;
|
|
30
|
-
} | {
|
|
31
|
-
kind: 'event.deliver';
|
|
32
|
-
runId: string;
|
|
33
|
-
activityId: string;
|
|
34
|
-
pendingId: string;
|
|
35
|
-
delivery: AsyncActivityCallback.Delivery;
|
|
36
|
-
} | {
|
|
37
|
-
kind: 'event.correlate';
|
|
38
|
-
event: AsyncActivityCallback.Event;
|
|
39
|
-
};
|
|
40
|
-
export type WorkflowRunJobKind = WorkflowRunJob['kind'];
|
|
41
|
-
export interface SerializedJobError {
|
|
42
|
-
name: string;
|
|
43
|
-
message: string;
|
|
44
|
-
stack?: string;
|
|
45
|
-
code?: number;
|
|
46
|
-
data?: unknown;
|
|
47
|
-
}
|
|
48
|
-
/** Messages a workflow worker sends back to the coordinator thread. */
|
|
49
|
-
export type WorkflowWorkerMessage = {
|
|
50
|
-
type: 'ready';
|
|
51
|
-
} | {
|
|
52
|
-
type: 'boot-failed';
|
|
53
|
-
error: SerializedJobError;
|
|
54
|
-
} | {
|
|
55
|
-
type: 'job:fulfilled';
|
|
56
|
-
id: number;
|
|
57
|
-
value: unknown;
|
|
58
|
-
} | {
|
|
59
|
-
type: 'job:rejected';
|
|
60
|
-
id: number;
|
|
61
|
-
error: SerializedJobError;
|
|
62
|
-
} | {
|
|
63
|
-
type: 'queue:enqueue';
|
|
64
|
-
job: WorkflowRunJob;
|
|
65
|
-
} | {
|
|
66
|
-
type: 'timeout:schedule';
|
|
67
|
-
runId: string;
|
|
68
|
-
pendingId: string;
|
|
69
|
-
timeoutAt: number;
|
|
70
|
-
} | {
|
|
71
|
-
type: 'timeout:cancel';
|
|
72
|
-
pendingId: string;
|
|
73
|
-
} | {
|
|
74
|
-
type: 'events:run-created';
|
|
75
|
-
payload: unknown;
|
|
76
|
-
} | {
|
|
77
|
-
type: 'events:run-updated';
|
|
78
|
-
runId: string;
|
|
79
|
-
} | {
|
|
80
|
-
type: 'runtime:event';
|
|
81
|
-
event: RuntimeEvent;
|
|
82
|
-
};
|
|
83
|
-
/** Messages the coordinator thread sends to a workflow worker. */
|
|
84
|
-
export type WorkflowCoordinatorMessage = {
|
|
85
|
-
type: 'job';
|
|
86
|
-
id: number;
|
|
87
|
-
job: WorkflowRunJob;
|
|
88
|
-
};
|
|
89
|
-
export interface WorkflowWorkerData {
|
|
90
|
-
entrypoint: string;
|
|
91
|
-
env: [string, string][];
|
|
92
|
-
serverUrl: string | null;
|
|
93
|
-
databaseLocation: string;
|
|
94
|
-
callbackSecret: string;
|
|
95
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowRunJob.js","sourceRoot":"","sources":["../../src/models/WorkflowRunJob.ts"],"names":[],"mappings":""}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { SerializedJobError, WorkflowRunJob, WorkflowWorkerData, WorkflowWorkerMessage } from './WorkflowRunJob.js';
|
|
2
|
-
import type { WorkflowRunJobExecutor } from '../services/WorkflowRunScheduler.service.js';
|
|
3
|
-
type WorkerSignal = Exclude<WorkflowWorkerMessage, {
|
|
4
|
-
type: 'ready' | 'boot-failed' | 'job:fulfilled' | 'job:rejected';
|
|
5
|
-
}>;
|
|
6
|
-
export interface WorkflowWorkerPoolOptions {
|
|
7
|
-
size: number;
|
|
8
|
-
concurrency: number;
|
|
9
|
-
workerData: WorkflowWorkerData;
|
|
10
|
-
/** Work a worker hands back to the coordinator (queue, timeouts, events). */
|
|
11
|
-
onSignal: (signal: WorkerSignal) => void;
|
|
12
|
-
/** A worker died; its replacement starts with an empty activity registry. */
|
|
13
|
-
onLaneLost: (lane: number, error: Error) => void;
|
|
14
|
-
workerPath?: string;
|
|
15
|
-
readyTimeoutInMs?: number;
|
|
16
|
-
}
|
|
17
|
-
export declare function toSerializedJobError(error: unknown): SerializedJobError;
|
|
18
|
-
export declare function fromSerializedJobError(error: SerializedJobError): Error;
|
|
19
|
-
/** Runs workflow jobs on `size` worker threads, each with its own app copy. */
|
|
20
|
-
export declare class WorkflowWorkerPool implements WorkflowRunJobExecutor {
|
|
21
|
-
private readonly options;
|
|
22
|
-
readonly lanes: number;
|
|
23
|
-
readonly concurrency: number;
|
|
24
|
-
private readonly workerPath;
|
|
25
|
-
private readonly readyTimeoutInMs;
|
|
26
|
-
private readonly slots;
|
|
27
|
-
private readonly booting;
|
|
28
|
-
private nextJobId;
|
|
29
|
-
private closing;
|
|
30
|
-
constructor(options: WorkflowWorkerPoolOptions);
|
|
31
|
-
start(): Promise<void>;
|
|
32
|
-
execute(lane: number, job: WorkflowRunJob): Promise<unknown>;
|
|
33
|
-
broadcast(job: WorkflowRunJob): Promise<unknown[]>;
|
|
34
|
-
terminate(): Promise<void>;
|
|
35
|
-
private spawn;
|
|
36
|
-
private lose;
|
|
37
|
-
private failPending;
|
|
38
|
-
}
|
|
39
|
-
export {};
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { styleText } from 'node:util';
|
|
3
|
-
import { Worker } from 'node:worker_threads';
|
|
4
|
-
import { JSONRPCError } from './JSONRPCError.js';
|
|
5
|
-
import { WORKFLOW_WORKER_READY_TIMEOUT_IN_MS } from '../constants/server.js';
|
|
6
|
-
export function toSerializedJobError(error) {
|
|
7
|
-
if (!(error instanceof Error))
|
|
8
|
-
return { name: 'Error', message: String(error) };
|
|
9
|
-
return {
|
|
10
|
-
name: error.name,
|
|
11
|
-
message: error.message,
|
|
12
|
-
stack: error.stack,
|
|
13
|
-
...(error instanceof JSONRPCError
|
|
14
|
-
? { code: error.code, data: error.data }
|
|
15
|
-
: {}),
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
export function fromSerializedJobError(error) {
|
|
19
|
-
const restored = error.name === 'JSONRPCError'
|
|
20
|
-
? new JSONRPCError(error.message, {
|
|
21
|
-
code: error.code,
|
|
22
|
-
data: error.data,
|
|
23
|
-
})
|
|
24
|
-
: Object.assign(new Error(error.message), { name: error.name });
|
|
25
|
-
if (error.stack)
|
|
26
|
-
restored.stack = error.stack;
|
|
27
|
-
return restored;
|
|
28
|
-
}
|
|
29
|
-
/** Runs workflow jobs on `size` worker threads, each with its own app copy. */
|
|
30
|
-
export class WorkflowWorkerPool {
|
|
31
|
-
options;
|
|
32
|
-
lanes;
|
|
33
|
-
concurrency;
|
|
34
|
-
workerPath;
|
|
35
|
-
readyTimeoutInMs;
|
|
36
|
-
slots;
|
|
37
|
-
booting;
|
|
38
|
-
nextJobId = 0;
|
|
39
|
-
closing = false;
|
|
40
|
-
constructor(options) {
|
|
41
|
-
this.options = options;
|
|
42
|
-
this.lanes = options.size;
|
|
43
|
-
this.concurrency = options.concurrency;
|
|
44
|
-
this.workerPath =
|
|
45
|
-
options.workerPath ??
|
|
46
|
-
path.join(import.meta.dirname, '..', 'workers', 'workflow-worker.js');
|
|
47
|
-
this.readyTimeoutInMs =
|
|
48
|
-
options.readyTimeoutInMs ?? WORKFLOW_WORKER_READY_TIMEOUT_IN_MS;
|
|
49
|
-
this.slots = Array.from({ length: options.size }, () => null);
|
|
50
|
-
this.booting = Array.from({ length: options.size }, () => null);
|
|
51
|
-
}
|
|
52
|
-
async start() {
|
|
53
|
-
await Promise.all(this.slots.map((_, lane) => this.spawn(lane)));
|
|
54
|
-
}
|
|
55
|
-
async execute(lane, job) {
|
|
56
|
-
if (!this.slots[lane])
|
|
57
|
-
await this.booting[lane];
|
|
58
|
-
const slot = this.slots[lane];
|
|
59
|
-
if (!slot)
|
|
60
|
-
throw new Error(`Workflow worker ${lane} is not running`);
|
|
61
|
-
const id = this.nextJobId++;
|
|
62
|
-
const deferred = Promise.withResolvers();
|
|
63
|
-
slot.pending.set(id, deferred);
|
|
64
|
-
slot.worker.postMessage({
|
|
65
|
-
type: 'job',
|
|
66
|
-
id,
|
|
67
|
-
job,
|
|
68
|
-
});
|
|
69
|
-
return deferred.promise;
|
|
70
|
-
}
|
|
71
|
-
broadcast(job) {
|
|
72
|
-
return Promise.all(this.slots.map((_, lane) => this.execute(lane, job)));
|
|
73
|
-
}
|
|
74
|
-
async terminate() {
|
|
75
|
-
this.closing = true;
|
|
76
|
-
await Promise.all(this.slots.map(async (slot, lane) => {
|
|
77
|
-
this.slots[lane] = null;
|
|
78
|
-
if (!slot)
|
|
79
|
-
return;
|
|
80
|
-
this.failPending(slot, new Error('Workflow worker pool is closing'));
|
|
81
|
-
await slot.worker.terminate();
|
|
82
|
-
}));
|
|
83
|
-
}
|
|
84
|
-
spawn(lane) {
|
|
85
|
-
const worker = new Worker(this.workerPath, {
|
|
86
|
-
workerData: this.options.workerData,
|
|
87
|
-
});
|
|
88
|
-
const slot = { worker, pending: new Map() };
|
|
89
|
-
const ready = Promise.withResolvers();
|
|
90
|
-
const timer = setTimeout(() => ready.reject(new Error(`Workflow worker ${lane} did not become ready in ${this.readyTimeoutInMs}ms`)), this.readyTimeoutInMs);
|
|
91
|
-
let isReady = false;
|
|
92
|
-
worker.on('message', (message) => {
|
|
93
|
-
switch (message.type) {
|
|
94
|
-
case 'ready':
|
|
95
|
-
isReady = true;
|
|
96
|
-
this.slots[lane] = slot;
|
|
97
|
-
ready.resolve();
|
|
98
|
-
return;
|
|
99
|
-
case 'boot-failed':
|
|
100
|
-
return ready.reject(fromSerializedJobError(message.error));
|
|
101
|
-
case 'job:fulfilled':
|
|
102
|
-
slot.pending.get(message.id)?.resolve(message.value);
|
|
103
|
-
slot.pending.delete(message.id);
|
|
104
|
-
return;
|
|
105
|
-
case 'job:rejected':
|
|
106
|
-
slot.pending
|
|
107
|
-
.get(message.id)
|
|
108
|
-
?.reject(fromSerializedJobError(message.error));
|
|
109
|
-
slot.pending.delete(message.id);
|
|
110
|
-
return;
|
|
111
|
-
default:
|
|
112
|
-
this.options.onSignal(message);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
worker.on('error', (error) => {
|
|
116
|
-
const failure = error instanceof Error ? error : new Error(String(error));
|
|
117
|
-
if (!isReady)
|
|
118
|
-
ready.reject(failure);
|
|
119
|
-
this.lose(lane, slot, failure);
|
|
120
|
-
});
|
|
121
|
-
worker.on('exit', code => {
|
|
122
|
-
const error = new Error(`Workflow worker ${lane} exited with code ${code}`);
|
|
123
|
-
if (!isReady)
|
|
124
|
-
ready.reject(error);
|
|
125
|
-
this.lose(lane, slot, error);
|
|
126
|
-
});
|
|
127
|
-
const booting = ready.promise.finally(() => clearTimeout(timer));
|
|
128
|
-
this.booting[lane] = booting.catch(() => { });
|
|
129
|
-
return booting;
|
|
130
|
-
}
|
|
131
|
-
lose(lane, slot, error) {
|
|
132
|
-
if (this.slots[lane] !== slot)
|
|
133
|
-
return;
|
|
134
|
-
this.slots[lane] = null;
|
|
135
|
-
this.failPending(slot, error);
|
|
136
|
-
if (this.closing)
|
|
137
|
-
return;
|
|
138
|
-
console.error(styleText('red', `[Runtime] workflow worker ${lane} died:`, {
|
|
139
|
-
stream: process.stderr,
|
|
140
|
-
}), error);
|
|
141
|
-
this.options.onLaneLost(lane, error);
|
|
142
|
-
this.spawn(lane).catch(spawnError => {
|
|
143
|
-
console.error(styleText('red', `[Runtime] could not restart workflow worker ${lane}:`, {
|
|
144
|
-
stream: process.stderr,
|
|
145
|
-
}), spawnError);
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
failPending(slot, error) {
|
|
149
|
-
for (const deferred of slot.pending.values())
|
|
150
|
-
deferred.reject(error);
|
|
151
|
-
slot.pending.clear();
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
//# sourceMappingURL=WorkflowWorkerPool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowWorkerPool.js","sourceRoot":"","sources":["../../src/models/WorkflowWorkerPool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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,62 +0,0 @@
|
|
|
1
|
-
import { RuntimeEventsService } from './RuntimeEvents.service.js';
|
|
2
|
-
import { TimeoutSchedulerService } from './TimeoutScheduler.service.js';
|
|
3
|
-
import type { RuntimeJobSummary, RuntimeQueueSnapshot, RuntimeQueueStats } from '../models/RuntimeEvent.js';
|
|
4
|
-
import type { WorkflowRunJob } from '../models/WorkflowRunJob.js';
|
|
5
|
-
import { WorkflowRunRepository } from '../repositories/WorkflowRun.repository.js';
|
|
6
|
-
export interface WorkflowRunJobExecutor {
|
|
7
|
-
/** How many independent lanes (threads) jobs can be spread across. */
|
|
8
|
-
readonly lanes: number;
|
|
9
|
-
/** How many jobs a single lane runs at once. */
|
|
10
|
-
readonly concurrency: number;
|
|
11
|
-
execute(lane: number, job: WorkflowRunJob): Promise<unknown>;
|
|
12
|
-
broadcast(job: WorkflowRunJob): Promise<unknown[]>;
|
|
13
|
-
}
|
|
14
|
-
/** Where a worker thread sends the work it cannot schedule by itself. */
|
|
15
|
-
export interface WorkflowRunSchedulerForward {
|
|
16
|
-
enqueue(job: WorkflowRunJob): void;
|
|
17
|
-
scheduleTimeout(runId: string, pendingId: string, timeoutAt: Date): void;
|
|
18
|
-
cancelTimeout(pendingId: string): void;
|
|
19
|
-
}
|
|
20
|
-
export declare function toRuntimeJobSummary(job: WorkflowRunJob): RuntimeJobSummary;
|
|
21
|
-
export declare class WorkflowRunSchedulerService {
|
|
22
|
-
private readonly timeoutScheduler;
|
|
23
|
-
private readonly workflowRunRepository;
|
|
24
|
-
private readonly runtimeEvents;
|
|
25
|
-
private executor;
|
|
26
|
-
private forward;
|
|
27
|
-
private readonly urgent;
|
|
28
|
-
private readonly normal;
|
|
29
|
-
private readonly queuedTicks;
|
|
30
|
-
private readonly busyRuns;
|
|
31
|
-
private readonly laneByRun;
|
|
32
|
-
private inFlight;
|
|
33
|
-
private pinnedByLane;
|
|
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;
|
|
40
|
-
/** Runs jobs on `executor` instead of the current thread. */
|
|
41
|
-
use(executor: WorkflowRunJobExecutor): void;
|
|
42
|
-
/** Hands every job and timeout to the coordinator (worker threads). */
|
|
43
|
-
forwardTo(forward: WorkflowRunSchedulerForward): void;
|
|
44
|
-
/** Queues a job and returns at once; failures are logged. */
|
|
45
|
-
enqueue(job: WorkflowRunJob): void;
|
|
46
|
-
/** Queues a job ahead of background work and resolves with its result. */
|
|
47
|
-
request<T>(job: WorkflowRunJob): Promise<T>;
|
|
48
|
-
/** Runs a job once on every lane, outside the queue. */
|
|
49
|
-
broadcast<T>(job: WorkflowRunJob): Promise<T[]>;
|
|
50
|
-
scheduleTimeout(runId: string, pendingId: string, timeoutAt: Date): void;
|
|
51
|
-
cancelTimeout(pendingId: string): void;
|
|
52
|
-
/** Forgets the runs pinned to a lane whose thread is gone; returns them. */
|
|
53
|
-
releaseLane(lane: number): string[];
|
|
54
|
-
private getExecutor;
|
|
55
|
-
private drain;
|
|
56
|
-
private pickLane;
|
|
57
|
-
private dispatch;
|
|
58
|
-
private unpinIfSettled;
|
|
59
|
-
private isQueued;
|
|
60
|
-
private publishQueued;
|
|
61
|
-
private logFailure;
|
|
62
|
-
}
|