@t4h.framework/dev 0.14.2 → 0.16.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/CHANGELOG.md +24 -0
- package/README.md +112 -58
- package/dist/AppProcess.d.ts +36 -0
- package/dist/AppProcess.js +126 -0
- package/dist/AppProcess.js.map +1 -0
- package/dist/Server.d.ts +41 -0
- package/dist/Server.js +177 -0
- package/dist/Server.js.map +1 -0
- package/dist/constants/panel-config.d.ts +2 -0
- package/dist/constants/panel-config.js +34 -0
- package/dist/constants/panel-config.js.map +1 -0
- package/dist/constants/server.d.ts +9 -0
- package/dist/constants/server.js +10 -0
- package/dist/constants/server.js.map +1 -0
- package/dist/http/create-app.d.ts +16 -0
- package/dist/http/create-app.js +138 -0
- package/dist/http/create-app.js.map +1 -0
- package/dist/http/helpers/to-http-error.d.ts +8 -0
- package/dist/http/helpers/to-http-error.js +9 -0
- package/dist/http/helpers/to-http-error.js.map +1 -0
- package/dist/http/middlewares/error-handler.middleware.d.ts +2 -0
- package/dist/http/middlewares/error-handler.middleware.js +27 -0
- package/dist/http/middlewares/error-handler.middleware.js.map +1 -0
- package/dist/http/middlewares/project-manifest.middleware.d.ts +11 -0
- package/dist/http/middlewares/project-manifest.middleware.js +11 -0
- package/dist/http/middlewares/project-manifest.middleware.js.map +1 -0
- package/dist/http/middlewares/read-json-body.middleware.d.ts +6 -0
- package/dist/http/middlewares/read-json-body.middleware.js +22 -0
- package/dist/http/middlewares/read-json-body.middleware.js.map +1 -0
- package/dist/http/middlewares/workflow-authorization.middleware.d.ts +12 -0
- package/dist/http/middlewares/workflow-authorization.middleware.js +28 -0
- package/dist/http/middlewares/workflow-authorization.middleware.js.map +1 -0
- package/dist/index.d.ts +3 -15
- package/dist/index.js +2 -15
- package/dist/index.js.map +1 -1
- package/dist/models/JSONRPCClient.d.ts +2 -0
- package/dist/models/JSONRPCClient.js +21 -4
- package/dist/models/JSONRPCClient.js.map +1 -1
- package/dist/models/JSONRPCError.d.ts +13 -0
- package/dist/models/JSONRPCError.js +11 -0
- package/dist/models/JSONRPCError.js.map +1 -0
- package/dist/models/JSONRPCServer.d.ts +2 -0
- package/dist/models/JSONRPCServer.js +10 -2
- package/dist/models/JSONRPCServer.js.map +1 -1
- package/dist/models/WorkflowAuthorizationMissingError.d.ts +5 -0
- package/dist/models/WorkflowAuthorizationMissingError.js +9 -0
- package/dist/models/WorkflowAuthorizationMissingError.js.map +1 -0
- package/dist/models/WorkflowRun.d.ts +20 -15
- package/dist/models/WorkflowRun.js +14 -9
- package/dist/models/WorkflowRun.js.map +1 -1
- package/dist/models/WorkflowRunActivity.d.ts +40 -27
- package/dist/models/WorkflowRunActivity.js +46 -34
- package/dist/models/WorkflowRunActivity.js.map +1 -1
- package/dist/models/claims/DevHttpClientRequestClaim.js +4 -5
- package/dist/models/claims/DevHttpClientRequestClaim.js.map +1 -1
- package/dist/models/claims/DevORMClaim.d.ts +15 -4
- package/dist/models/claims/DevORMClaim.js +128 -29
- package/dist/models/claims/DevORMClaim.js.map +1 -1
- package/dist/models/claims/DevWorkflowBatchClaim.js +3 -6
- package/dist/models/claims/DevWorkflowBatchClaim.js.map +1 -1
- package/dist/models/claims/DevWorkflowClaim.d.ts +1 -1
- package/dist/models/claims/DevWorkflowClaim.js +6 -11
- package/dist/models/claims/DevWorkflowClaim.js.map +1 -1
- package/dist/repositories/WorkflowRun.repository.d.ts +44 -6
- package/dist/repositories/WorkflowRun.repository.js +196 -11
- package/dist/repositories/WorkflowRun.repository.js.map +1 -1
- package/dist/repositories/WorkflowRunActivity.repository.d.ts +19 -6
- package/dist/repositories/WorkflowRunActivity.repository.js +73 -23
- package/dist/repositories/WorkflowRunActivity.repository.js.map +1 -1
- package/dist/repositories/WorkflowRunAsyncActivityPending.repository.d.ts +39 -0
- package/dist/repositories/WorkflowRunAsyncActivityPending.repository.js +160 -0
- package/dist/repositories/WorkflowRunAsyncActivityPending.repository.js.map +1 -0
- package/dist/services/ActivityRegistry.service.d.ts +7 -0
- package/dist/services/ActivityRegistry.service.js +32 -0
- package/dist/services/ActivityRegistry.service.js.map +1 -0
- package/dist/services/Database.service.d.ts +14 -0
- package/dist/services/Database.service.js +106 -0
- package/dist/services/Database.service.js.map +1 -0
- package/dist/services/TimeoutScheduler.service.js +9 -3
- package/dist/services/TimeoutScheduler.service.js.map +1 -1
- package/dist/services/WorkflowAuthorization.service.d.ts +19 -0
- package/dist/services/WorkflowAuthorization.service.js +75 -0
- package/dist/services/WorkflowAuthorization.service.js.map +1 -0
- package/dist/services/WorkflowRunAsyncActivityFacade.service.d.ts +8 -15
- package/dist/services/WorkflowRunAsyncActivityFacade.service.js +12 -26
- package/dist/services/WorkflowRunAsyncActivityFacade.service.js.map +1 -1
- package/dist/services/WorkflowRunEvents.service.d.ts +11 -0
- package/dist/services/WorkflowRunEvents.service.js +42 -0
- package/dist/services/WorkflowRunEvents.service.js.map +1 -0
- package/dist/services/WorkflowRunFacade.service.d.ts +106 -7
- package/dist/services/WorkflowRunFacade.service.js +65 -10
- package/dist/services/WorkflowRunFacade.service.js.map +1 -1
- package/dist/services/WorkflowRunLock.service.d.ts +6 -0
- package/dist/services/WorkflowRunLock.service.js +34 -0
- package/dist/services/WorkflowRunLock.service.js.map +1 -0
- package/dist/services/WorkflowRunSyncActivityFacade.service.d.ts +4 -4
- package/dist/services/WorkflowRunSyncActivityFacade.service.js +7 -7
- package/dist/services/WorkflowRunSyncActivityFacade.service.js.map +1 -1
- package/dist/tools/copy-additional-files.d.ts +0 -5
- package/dist/tools/copy-additional-files.js +0 -5
- package/dist/tools/copy-additional-files.js.map +1 -1
- package/dist/tools/find-free-port.d.ts +5 -0
- package/dist/tools/find-free-port.js +30 -0
- package/dist/tools/find-free-port.js.map +1 -0
- package/dist/tools/find-workflow-by-id.d.ts +2 -0
- package/dist/tools/find-workflow-by-id.js +9 -0
- package/dist/tools/find-workflow-by-id.js.map +1 -0
- package/dist/tools/format-routes.d.ts +10 -0
- package/dist/tools/format-routes.js +40 -0
- package/dist/tools/format-routes.js.map +1 -0
- package/dist/tools/replace.d.ts +1 -0
- package/dist/tools/replace.js +14 -0
- package/dist/tools/replace.js.map +1 -0
- package/dist/tools/to-rejected-reason.d.ts +5 -0
- package/dist/tools/to-rejected-reason.js +11 -0
- package/dist/tools/to-rejected-reason.js.map +1 -0
- package/dist/tools/to-workflow-run-activity-output.d.ts +24 -0
- package/dist/tools/to-workflow-run-activity-output.js +18 -0
- package/dist/tools/to-workflow-run-activity-output.js.map +1 -0
- package/dist/tools/to-workflow-run-output.d.ts +11 -0
- package/dist/tools/to-workflow-run-output.js +12 -0
- package/dist/tools/to-workflow-run-output.js.map +1 -0
- package/dist/transport/AppProcessJsonRpc.js +59 -0
- package/dist/transport/AppProcessJsonRpc.js.map +1 -0
- package/dist/use-cases/BuildWorkflowRunActivityHistory.usecase.d.ts +9 -0
- package/dist/use-cases/{WorkflowRunBuildHistory.usecase.js → BuildWorkflowRunActivityHistory.usecase.js} +18 -16
- package/dist/use-cases/BuildWorkflowRunActivityHistory.usecase.js.map +1 -0
- package/dist/use-cases/CreateWorkflowRun.usecase.d.ts +6 -6
- package/dist/use-cases/CreateWorkflowRun.usecase.js +20 -21
- package/dist/use-cases/CreateWorkflowRun.usecase.js.map +1 -1
- package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.d.ts +9 -3
- package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js +45 -39
- package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js.map +1 -1
- package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.d.ts +9 -0
- package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js +43 -0
- package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js.map +1 -0
- package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.d.ts +9 -0
- package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.js +47 -0
- package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.js.map +1 -0
- package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.d.ts +22 -0
- package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js +117 -0
- package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js.map +1 -0
- package/dist/use-cases/NextTickWorkflowRun.usecase.d.ts +16 -7
- package/dist/use-cases/NextTickWorkflowRun.usecase.js +139 -130
- package/dist/use-cases/NextTickWorkflowRun.usecase.js.map +1 -1
- package/dist/use-cases/RunWorkflow.usecase.d.ts +10 -0
- package/dist/use-cases/RunWorkflow.usecase.js +46 -0
- package/dist/use-cases/RunWorkflow.usecase.js.map +1 -0
- package/dist/use-cases/WorkflowRunActivityFind.usecase.d.ts +34 -0
- package/dist/use-cases/WorkflowRunActivityFind.usecase.js +49 -0
- package/dist/use-cases/WorkflowRunActivityFind.usecase.js.map +1 -0
- package/dist/use-cases/WorkflowRunActivityFindById.usecase.d.ts +34 -0
- package/dist/use-cases/WorkflowRunActivityFindById.usecase.js +60 -0
- package/dist/use-cases/WorkflowRunActivityFindById.usecase.js.map +1 -0
- package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.d.ts +12 -4
- package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js +41 -27
- package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js.map +1 -1
- package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.d.ts +24 -0
- package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.js +56 -0
- package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.js.map +1 -0
- package/dist/use-cases/WorkflowRunFind.usecase.d.ts +17 -0
- package/dist/use-cases/WorkflowRunFind.usecase.js +28 -0
- package/dist/use-cases/WorkflowRunFind.usecase.js.map +1 -0
- package/dist/use-cases/WorkflowRunFindById.usecase.d.ts +19 -0
- package/dist/use-cases/WorkflowRunFindById.usecase.js +45 -0
- package/dist/use-cases/WorkflowRunFindById.usecase.js.map +1 -0
- package/dist/workers/app-process.js +10 -1
- package/dist/workers/app-process.js.map +1 -1
- package/package.json +15 -5
- package/.ai/skills/framework-dev/SKILL.md +0 -348
- package/dist/DevServer.d.ts +0 -24
- package/dist/DevServer.js +0 -87
- package/dist/DevServer.js.map +0 -1
- package/dist/models/InMemoryDatabase.d.ts +0 -20
- package/dist/models/InMemoryDatabase.js +0 -111
- package/dist/models/InMemoryDatabase.js.map +0 -1
- package/dist/services/BuildWorkflowRunResult.service.d.ts +0 -8
- package/dist/services/BuildWorkflowRunResult.service.js +0 -49
- package/dist/services/BuildWorkflowRunResult.service.js.map +0 -1
- package/dist/tools/is-workflow-waiting.d.ts +0 -4
- package/dist/tools/is-workflow-waiting.js +0 -12
- package/dist/tools/is-workflow-waiting.js.map +0 -1
- package/dist/transport/DevServerJsonRpc.js +0 -42
- package/dist/transport/DevServerJsonRpc.js.map +0 -1
- package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.d.ts +0 -14
- package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js +0 -64
- package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js.map +0 -1
- package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.d.ts +0 -8
- package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js +0 -40
- package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js.map +0 -1
- package/dist/use-cases/WorkflowRunAsyncActivity.usecase.d.ts +0 -7
- package/dist/use-cases/WorkflowRunAsyncActivity.usecase.js +0 -46
- package/dist/use-cases/WorkflowRunAsyncActivity.usecase.js.map +0 -1
- package/dist/use-cases/WorkflowRunBuildHistory.usecase.d.ts +0 -8
- package/dist/use-cases/WorkflowRunBuildHistory.usecase.js.map +0 -1
- package/dist/use-cases/WorkflowRunSyncActivity.usecase.d.ts +0 -4
- package/dist/use-cases/WorkflowRunSyncActivity.usecase.js +0 -28
- package/dist/use-cases/WorkflowRunSyncActivity.usecase.js.map +0 -1
- /package/dist/transport/{DevServerJsonRpc.d.ts → AppProcessJsonRpc.d.ts} +0 -0
|
@@ -4,33 +4,83 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
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
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { Inject, Injectable } from 'pleroma';
|
|
11
|
+
import { WorkflowRunActivity, } from '../models/WorkflowRunActivity.js';
|
|
12
|
+
import { DatabaseService } from '../services/Database.service.js';
|
|
8
13
|
let WorkflowRunActivityRepository = class WorkflowRunActivityRepository {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
14
|
+
database;
|
|
15
|
+
constructor(database) {
|
|
16
|
+
this.database = database;
|
|
17
|
+
}
|
|
18
|
+
get db() {
|
|
19
|
+
return this.database.db;
|
|
20
|
+
}
|
|
21
|
+
async create(activity) {
|
|
22
|
+
this.db
|
|
23
|
+
.prepare(`INSERT INTO workflow_run_activities (
|
|
24
|
+
id, run_id, position, type, kind, status, input, output, completed_at, created_at
|
|
25
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
26
|
+
.run(activity.id, activity.runId, activity.position, activity.type, activity.kind, activity.status, await this.database.encode(activity.input), await this.database.encode(activity.output), activity.completedAt?.getTime() ?? null, activity.createdAt.getTime());
|
|
27
|
+
}
|
|
28
|
+
async findById(id) {
|
|
29
|
+
const row = this.db
|
|
30
|
+
.prepare('SELECT * FROM workflow_run_activities WHERE id = ?')
|
|
31
|
+
.get(id);
|
|
32
|
+
return row && (await this.toModel(row));
|
|
33
|
+
}
|
|
34
|
+
async findByRunId(runId) {
|
|
35
|
+
const rows = this.db
|
|
36
|
+
.prepare('SELECT * FROM workflow_run_activities WHERE run_id = ? ORDER BY position')
|
|
37
|
+
.all(runId);
|
|
38
|
+
return Promise.all(rows.map(row => this.toModel(row)));
|
|
39
|
+
}
|
|
40
|
+
async findPageByRunId(runId, { limit = 25, offset = 0 } = {}) {
|
|
41
|
+
const rows = this.db
|
|
42
|
+
.prepare(`SELECT * FROM workflow_run_activities WHERE run_id = ?
|
|
43
|
+
ORDER BY position DESC LIMIT ? OFFSET ?`)
|
|
44
|
+
.all(runId, limit, offset);
|
|
45
|
+
return {
|
|
46
|
+
count: this.countByRunId(runId),
|
|
47
|
+
activities: await Promise.all(rows.map(row => this.toModel(row))),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
countByRunId(runId) {
|
|
51
|
+
const row = this.db
|
|
52
|
+
.prepare('SELECT COUNT(*) AS count FROM workflow_run_activities WHERE run_id = ?')
|
|
53
|
+
.get(runId);
|
|
54
|
+
return row.count;
|
|
55
|
+
}
|
|
56
|
+
async complete(id, output) {
|
|
57
|
+
this.db
|
|
58
|
+
.prepare(`UPDATE workflow_run_activities
|
|
59
|
+
SET output = ?, completed_at = ?, status = 'fulfilled'
|
|
60
|
+
WHERE id = ?`)
|
|
61
|
+
.run(await this.database.encode(output), Date.now(), id);
|
|
62
|
+
}
|
|
63
|
+
async fail(id, output) {
|
|
64
|
+
this.db
|
|
65
|
+
.prepare(`UPDATE workflow_run_activities
|
|
66
|
+
SET output = ?, completed_at = ?, status = 'rejected'
|
|
67
|
+
WHERE id = ?`)
|
|
68
|
+
.run(await this.database.encode(output), Date.now(), id);
|
|
69
|
+
}
|
|
70
|
+
async toModel(row) {
|
|
71
|
+
return new WorkflowRunActivity(row.run_id, row.position, row.type, row.kind, {
|
|
72
|
+
id: row.id,
|
|
73
|
+
status: row.status,
|
|
74
|
+
input: await this.database.decode(row.input),
|
|
75
|
+
output: await this.database.decode(row.output),
|
|
76
|
+
completedAt: row.completed_at === null ? undefined : new Date(row.completed_at),
|
|
77
|
+
createdAt: new Date(row.created_at),
|
|
78
|
+
});
|
|
30
79
|
}
|
|
31
80
|
};
|
|
32
81
|
WorkflowRunActivityRepository = __decorate([
|
|
33
|
-
Injectable()
|
|
82
|
+
Injectable(),
|
|
83
|
+
__param(0, Inject(() => DatabaseService))
|
|
34
84
|
], WorkflowRunActivityRepository);
|
|
35
85
|
export { WorkflowRunActivityRepository };
|
|
36
86
|
//# sourceMappingURL=WorkflowRunActivity.repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowRunActivity.repository.js","sourceRoot":"","sources":["../../src/repositories/WorkflowRunActivity.repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WorkflowRunActivity.repository.js","sourceRoot":"","sources":["../../src/repositories/WorkflowRunActivity.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type Type from 'typebox';
|
|
2
|
+
import { WorkflowRunAsyncActivityPending, type AsyncActivityPendingStatus } from '../models/WorkflowRunActivity.js';
|
|
3
|
+
import { DatabaseService } from '../services/Database.service.js';
|
|
4
|
+
export interface PageQuery {
|
|
5
|
+
limit?: number;
|
|
6
|
+
offset?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface WaitingAsyncActivitiesPage {
|
|
9
|
+
count: number;
|
|
10
|
+
activities: WaitingAsyncActivity[];
|
|
11
|
+
}
|
|
12
|
+
export interface WaitingAsyncActivity {
|
|
13
|
+
id: string;
|
|
14
|
+
pending: string;
|
|
15
|
+
run: string;
|
|
16
|
+
workflowId: string;
|
|
17
|
+
type: string;
|
|
18
|
+
schema: Type.TSchema | undefined;
|
|
19
|
+
timeoutAt: Date | undefined;
|
|
20
|
+
}
|
|
21
|
+
export declare class WorkflowRunAsyncActivityPendingRepository {
|
|
22
|
+
private readonly database;
|
|
23
|
+
constructor(database: DatabaseService);
|
|
24
|
+
private get db();
|
|
25
|
+
create(pending: WorkflowRunAsyncActivityPending): Promise<void>;
|
|
26
|
+
findById(id: string): Promise<WorkflowRunAsyncActivityPending | undefined>;
|
|
27
|
+
findByActivityId(activityId: string): Promise<WorkflowRunAsyncActivityPending[]>;
|
|
28
|
+
findPageByActivityId(activityId: string, { limit, offset }?: PageQuery): Promise<{
|
|
29
|
+
count: number;
|
|
30
|
+
pendings: WorkflowRunAsyncActivityPending[];
|
|
31
|
+
}>;
|
|
32
|
+
findLastByActivityId(activityId: string): Promise<WorkflowRunAsyncActivityPending | undefined>;
|
|
33
|
+
findLastStatusByActivityIds(activityIds: readonly string[]): Map<string, AsyncActivityPendingStatus>;
|
|
34
|
+
findRootByActivityId(activityId: string): Promise<WorkflowRunAsyncActivityPending | undefined>;
|
|
35
|
+
updateStatus(id: string, status: AsyncActivityPendingStatus): void;
|
|
36
|
+
setPayload(id: string, payload: unknown): Promise<void>;
|
|
37
|
+
findWaiting({ limit, offset, }?: PageQuery): WaitingAsyncActivitiesPage;
|
|
38
|
+
private toModel;
|
|
39
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { Inject, Injectable } from 'pleroma';
|
|
11
|
+
import { WorkflowRunAsyncActivityPending, } from '../models/WorkflowRunActivity.js';
|
|
12
|
+
import { DatabaseService } from '../services/Database.service.js';
|
|
13
|
+
const WAITING_PAGE_SIZE = 25;
|
|
14
|
+
const WAITING_FROM_WHERE = `
|
|
15
|
+
FROM workflow_run_async_activity_pendings
|
|
16
|
+
JOIN workflow_run_activities
|
|
17
|
+
ON workflow_run_activities.id = workflow_run_async_activity_pendings.activity_id
|
|
18
|
+
JOIN workflow_runs
|
|
19
|
+
ON workflow_runs.id = workflow_run_activities.run_id
|
|
20
|
+
WHERE workflow_run_async_activity_pendings.status = 'pending'
|
|
21
|
+
AND workflow_runs.status = 'running'
|
|
22
|
+
AND workflow_run_async_activity_pendings.position = (
|
|
23
|
+
SELECT MAX(last_pending.position)
|
|
24
|
+
FROM workflow_run_async_activity_pendings AS last_pending
|
|
25
|
+
WHERE last_pending.activity_id = workflow_run_async_activity_pendings.activity_id
|
|
26
|
+
)`;
|
|
27
|
+
let WorkflowRunAsyncActivityPendingRepository = class WorkflowRunAsyncActivityPendingRepository {
|
|
28
|
+
database;
|
|
29
|
+
constructor(database) {
|
|
30
|
+
this.database = database;
|
|
31
|
+
}
|
|
32
|
+
get db() {
|
|
33
|
+
return this.database.db;
|
|
34
|
+
}
|
|
35
|
+
async create(pending) {
|
|
36
|
+
this.db
|
|
37
|
+
.prepare(`INSERT INTO workflow_run_async_activity_pendings (
|
|
38
|
+
id, activity_id, position, previous_id, status, schema, timeout_at,
|
|
39
|
+
result, payload, created_at, updated_at
|
|
40
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
41
|
+
.run(pending.id, pending.activityId, pending.position, pending.previousId ?? null, pending.status, pending.schema ? JSON.stringify(pending.schema) : null, pending.timeoutAt?.getTime() ?? null, await this.database.encode(pending.result), await this.database.encode(pending.payload), pending.createdAt.getTime(), pending.updatedAt.getTime());
|
|
42
|
+
}
|
|
43
|
+
async findById(id) {
|
|
44
|
+
const row = this.db
|
|
45
|
+
.prepare('SELECT * FROM workflow_run_async_activity_pendings WHERE id = ?')
|
|
46
|
+
.get(id);
|
|
47
|
+
return row && (await this.toModel(row));
|
|
48
|
+
}
|
|
49
|
+
async findByActivityId(activityId) {
|
|
50
|
+
const rows = this.db
|
|
51
|
+
.prepare(`SELECT * FROM workflow_run_async_activity_pendings
|
|
52
|
+
WHERE activity_id = ? ORDER BY position`)
|
|
53
|
+
.all(activityId);
|
|
54
|
+
return Promise.all(rows.map(row => this.toModel(row)));
|
|
55
|
+
}
|
|
56
|
+
async findPageByActivityId(activityId, { limit = 25, offset = 0 } = {}) {
|
|
57
|
+
const { count } = this.db
|
|
58
|
+
.prepare(`SELECT COUNT(*) AS count FROM workflow_run_async_activity_pendings
|
|
59
|
+
WHERE activity_id = ?`)
|
|
60
|
+
.get(activityId);
|
|
61
|
+
const rows = this.db
|
|
62
|
+
.prepare(`SELECT * FROM workflow_run_async_activity_pendings
|
|
63
|
+
WHERE activity_id = ? ORDER BY position DESC LIMIT ? OFFSET ?`)
|
|
64
|
+
.all(activityId, limit, offset);
|
|
65
|
+
return {
|
|
66
|
+
count,
|
|
67
|
+
pendings: await Promise.all(rows.map(row => this.toModel(row))),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
async findLastByActivityId(activityId) {
|
|
71
|
+
const row = this.db
|
|
72
|
+
.prepare(`SELECT * FROM workflow_run_async_activity_pendings
|
|
73
|
+
WHERE activity_id = ? ORDER BY position DESC LIMIT 1`)
|
|
74
|
+
.get(activityId);
|
|
75
|
+
return row && (await this.toModel(row));
|
|
76
|
+
}
|
|
77
|
+
findLastStatusByActivityIds(activityIds) {
|
|
78
|
+
if (activityIds.length === 0)
|
|
79
|
+
return new Map();
|
|
80
|
+
const rows = this.db
|
|
81
|
+
.prepare(`SELECT activity_id, status FROM workflow_run_async_activity_pendings
|
|
82
|
+
WHERE activity_id IN (${activityIds.map(() => '?').join(', ')})
|
|
83
|
+
AND position = (
|
|
84
|
+
SELECT MAX(last_pending.position)
|
|
85
|
+
FROM workflow_run_async_activity_pendings AS last_pending
|
|
86
|
+
WHERE last_pending.activity_id = workflow_run_async_activity_pendings.activity_id
|
|
87
|
+
)`)
|
|
88
|
+
.all(...activityIds);
|
|
89
|
+
return new Map(rows.map(row => [row.activity_id, row.status]));
|
|
90
|
+
}
|
|
91
|
+
async findRootByActivityId(activityId) {
|
|
92
|
+
const row = this.db
|
|
93
|
+
.prepare(`SELECT * FROM workflow_run_async_activity_pendings
|
|
94
|
+
WHERE activity_id = ? AND position = 0`)
|
|
95
|
+
.get(activityId);
|
|
96
|
+
return row && (await this.toModel(row));
|
|
97
|
+
}
|
|
98
|
+
updateStatus(id, status) {
|
|
99
|
+
this.db
|
|
100
|
+
.prepare(`UPDATE workflow_run_async_activity_pendings
|
|
101
|
+
SET status = ?, updated_at = ? WHERE id = ?`)
|
|
102
|
+
.run(status, Date.now(), id);
|
|
103
|
+
}
|
|
104
|
+
async setPayload(id, payload) {
|
|
105
|
+
this.db
|
|
106
|
+
.prepare(`UPDATE workflow_run_async_activity_pendings
|
|
107
|
+
SET payload = ?, updated_at = ? WHERE id = ?`)
|
|
108
|
+
.run(await this.database.encode(payload), Date.now(), id);
|
|
109
|
+
}
|
|
110
|
+
findWaiting({ limit = WAITING_PAGE_SIZE, offset = 0, } = {}) {
|
|
111
|
+
const { count } = this.db
|
|
112
|
+
.prepare(`SELECT COUNT(*) AS count ${WAITING_FROM_WHERE}`)
|
|
113
|
+
.get();
|
|
114
|
+
const rows = this.db
|
|
115
|
+
.prepare(`SELECT workflow_run_activities.id AS activity_id,
|
|
116
|
+
workflow_run_async_activity_pendings.id AS pending_id,
|
|
117
|
+
workflow_run_activities.run_id,
|
|
118
|
+
workflow_runs.workflow_id,
|
|
119
|
+
workflow_run_activities.type,
|
|
120
|
+
workflow_run_async_activity_pendings.schema,
|
|
121
|
+
workflow_run_async_activity_pendings.timeout_at
|
|
122
|
+
${WAITING_FROM_WHERE}
|
|
123
|
+
ORDER BY workflow_runs.created_at DESC, workflow_runs.id DESC, workflow_run_activities.position
|
|
124
|
+
LIMIT ? OFFSET ?`)
|
|
125
|
+
.all(limit, offset);
|
|
126
|
+
return {
|
|
127
|
+
count,
|
|
128
|
+
activities: rows.map(row => ({
|
|
129
|
+
id: row.activity_id,
|
|
130
|
+
pending: row.pending_id,
|
|
131
|
+
run: row.run_id,
|
|
132
|
+
workflowId: row.workflow_id,
|
|
133
|
+
type: row.type,
|
|
134
|
+
schema: row.schema
|
|
135
|
+
? JSON.parse(row.schema)
|
|
136
|
+
: undefined,
|
|
137
|
+
timeoutAt: row.timeout_at === null ? undefined : new Date(row.timeout_at),
|
|
138
|
+
})),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
async toModel(row) {
|
|
142
|
+
return new WorkflowRunAsyncActivityPending(row.activity_id, row.position, {
|
|
143
|
+
id: row.id,
|
|
144
|
+
previousId: row.previous_id ?? undefined,
|
|
145
|
+
status: row.status,
|
|
146
|
+
schema: row.schema ? JSON.parse(row.schema) : undefined,
|
|
147
|
+
timeoutAt: row.timeout_at === null ? undefined : new Date(row.timeout_at),
|
|
148
|
+
result: await this.database.decode(row.result),
|
|
149
|
+
payload: await this.database.decode(row.payload),
|
|
150
|
+
createdAt: new Date(row.created_at),
|
|
151
|
+
updatedAt: new Date(row.updated_at),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
WorkflowRunAsyncActivityPendingRepository = __decorate([
|
|
156
|
+
Injectable(),
|
|
157
|
+
__param(0, Inject(() => DatabaseService))
|
|
158
|
+
], WorkflowRunAsyncActivityPendingRepository);
|
|
159
|
+
export { WorkflowRunAsyncActivityPendingRepository };
|
|
160
|
+
//# sourceMappingURL=WorkflowRunAsyncActivityPending.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowRunAsyncActivityPending.repository.js","sourceRoot":"","sources":["../../src/repositories/WorkflowRunAsyncActivityPending.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ActivityConstructor, type AnyActivity } from '@t4h.framework/core';
|
|
2
|
+
export declare class ActivityRegistryService {
|
|
3
|
+
private readonly activities;
|
|
4
|
+
constructor();
|
|
5
|
+
add(Activity: ActivityConstructor<AnyActivity>): void;
|
|
6
|
+
getActivityConstructor(name: string): ActivityConstructor<AnyActivity>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
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 { StartManyWorkflowsActivity, StartWorkflowActivity, } from '@t4h.framework/core';
|
|
8
|
+
import { Injectable } from 'pleroma';
|
|
9
|
+
let ActivityRegistryService = class ActivityRegistryService {
|
|
10
|
+
activities = new Map();
|
|
11
|
+
constructor() {
|
|
12
|
+
this.add(StartWorkflowActivity);
|
|
13
|
+
this.add(StartManyWorkflowsActivity);
|
|
14
|
+
}
|
|
15
|
+
add(Activity) {
|
|
16
|
+
const current = this.activities.get(Activity.name);
|
|
17
|
+
if (current && current !== Activity)
|
|
18
|
+
console.warn(`[server] activity "${Activity.name}" registered twice with different classes; the latest wins`);
|
|
19
|
+
this.activities.set(Activity.name, Activity);
|
|
20
|
+
}
|
|
21
|
+
getActivityConstructor(name) {
|
|
22
|
+
const Activity = this.activities.get(name);
|
|
23
|
+
if (!Activity)
|
|
24
|
+
throw new Error(`Unknown activity: ${name}`);
|
|
25
|
+
return Activity;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
ActivityRegistryService = __decorate([
|
|
29
|
+
Injectable()
|
|
30
|
+
], ActivityRegistryService);
|
|
31
|
+
export { ActivityRegistryService };
|
|
32
|
+
//# sourceMappingURL=ActivityRegistry.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityRegistry.service.js","sourceRoot":"","sources":["../../src/services/ActivityRegistry.service.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,GAGtB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAG7B,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IACjB,UAAU,GAAG,IAAI,GAAG,EAGlC,CAAA;IAEH;QACE,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;QAC/B,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IACtC,CAAC;IAEM,GAAG,CAAC,QAA0C;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAElD,IAAI,OAAO,IAAI,OAAO,KAAK,QAAQ;YACjC,OAAO,CAAC,IAAI,CACV,sBAAsB,QAAQ,CAAC,IAAI,4DAA4D,CAChG,CAAA;QAEH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC9C,CAAC;IAEM,sBAAsB,CAC3B,IAAY;QAEZ,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAE1C,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAA;QAE3D,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF,CAAA;AA/BY,uBAAuB;IADnC,UAAU,EAAE;GACA,uBAAuB,CA+BnC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory SQLite. Every app process boot starts from an empty schema on
|
|
4
|
+
* purpose: the dev server does not carry migrations, durability belongs to
|
|
5
|
+
* the production runtime.
|
|
6
|
+
*/
|
|
7
|
+
export declare class DatabaseService {
|
|
8
|
+
readonly db: DatabaseSync;
|
|
9
|
+
constructor();
|
|
10
|
+
transaction<T>(fn: () => T): T;
|
|
11
|
+
encode(value: unknown): Promise<string | null>;
|
|
12
|
+
decode(text: string | null): Promise<unknown>;
|
|
13
|
+
close(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
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 { DatabaseSync } from 'node:sqlite';
|
|
8
|
+
import { Injectable } from 'pleroma';
|
|
9
|
+
import { jsonCodec } from '../tools/json-codec.js';
|
|
10
|
+
const SCHEMA = `
|
|
11
|
+
CREATE TABLE workflow_runs (
|
|
12
|
+
id TEXT PRIMARY KEY,
|
|
13
|
+
workflow_id TEXT NOT NULL,
|
|
14
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'fulfilled', 'rejected')),
|
|
15
|
+
input TEXT,
|
|
16
|
+
output TEXT,
|
|
17
|
+
parent_run_id TEXT,
|
|
18
|
+
parent_activity_id TEXT,
|
|
19
|
+
batch_index INTEGER,
|
|
20
|
+
batch_size INTEGER,
|
|
21
|
+
created_at INTEGER NOT NULL,
|
|
22
|
+
updated_at INTEGER NOT NULL
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
CREATE INDEX workflow_runs_parent_activity_idx
|
|
26
|
+
ON workflow_runs (parent_activity_id);
|
|
27
|
+
|
|
28
|
+
CREATE TABLE workflow_run_activities (
|
|
29
|
+
id TEXT PRIMARY KEY,
|
|
30
|
+
run_id TEXT NOT NULL REFERENCES workflow_runs (id) ON DELETE CASCADE,
|
|
31
|
+
position INTEGER NOT NULL,
|
|
32
|
+
type TEXT NOT NULL,
|
|
33
|
+
kind TEXT NOT NULL CHECK (kind IN ('sync', 'async')),
|
|
34
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'fulfilled', 'rejected')) DEFAULT 'running',
|
|
35
|
+
input TEXT,
|
|
36
|
+
output TEXT,
|
|
37
|
+
completed_at INTEGER,
|
|
38
|
+
created_at INTEGER NOT NULL,
|
|
39
|
+
UNIQUE (run_id, position)
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
CREATE TABLE workflow_run_async_activity_pendings (
|
|
43
|
+
id TEXT PRIMARY KEY,
|
|
44
|
+
activity_id TEXT NOT NULL REFERENCES workflow_run_activities (id) ON DELETE CASCADE,
|
|
45
|
+
position INTEGER NOT NULL,
|
|
46
|
+
previous_id TEXT,
|
|
47
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'fulfilled', 'rejected')),
|
|
48
|
+
schema TEXT,
|
|
49
|
+
timeout_at INTEGER,
|
|
50
|
+
result TEXT,
|
|
51
|
+
payload TEXT,
|
|
52
|
+
created_at INTEGER NOT NULL,
|
|
53
|
+
updated_at INTEGER NOT NULL,
|
|
54
|
+
UNIQUE (activity_id, position)
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
CREATE TABLE workflow_run_logs (
|
|
58
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
59
|
+
run_id TEXT NOT NULL REFERENCES workflow_runs (id) ON DELETE CASCADE,
|
|
60
|
+
level TEXT NOT NULL,
|
|
61
|
+
args TEXT NOT NULL,
|
|
62
|
+
at INTEGER NOT NULL
|
|
63
|
+
);
|
|
64
|
+
`;
|
|
65
|
+
/**
|
|
66
|
+
* In-memory SQLite. Every app process boot starts from an empty schema on
|
|
67
|
+
* purpose: the dev server does not carry migrations, durability belongs to
|
|
68
|
+
* the production runtime.
|
|
69
|
+
*/
|
|
70
|
+
let DatabaseService = class DatabaseService {
|
|
71
|
+
db = new DatabaseSync(':memory:');
|
|
72
|
+
constructor() {
|
|
73
|
+
this.db.exec('PRAGMA foreign_keys = ON');
|
|
74
|
+
this.db.exec(SCHEMA);
|
|
75
|
+
}
|
|
76
|
+
transaction(fn) {
|
|
77
|
+
this.db.exec('BEGIN');
|
|
78
|
+
try {
|
|
79
|
+
const result = fn();
|
|
80
|
+
this.db.exec('COMMIT');
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
this.db.exec('ROLLBACK');
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async encode(value) {
|
|
89
|
+
if (value === undefined)
|
|
90
|
+
return null;
|
|
91
|
+
return await jsonCodec.stringify(value, {});
|
|
92
|
+
}
|
|
93
|
+
async decode(text) {
|
|
94
|
+
if (text === null)
|
|
95
|
+
return undefined;
|
|
96
|
+
return await jsonCodec.parse(text, {});
|
|
97
|
+
}
|
|
98
|
+
close() {
|
|
99
|
+
this.db.close();
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
DatabaseService = __decorate([
|
|
103
|
+
Injectable()
|
|
104
|
+
], DatabaseService);
|
|
105
|
+
export { DatabaseService };
|
|
106
|
+
//# sourceMappingURL=Database.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Database.service.js","sourceRoot":"","sources":["../../src/services/Database.service.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDd,CAAA;AAED;;;;GAIG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAe;IACV,EAAE,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAA;IAEjD;QACE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QAExC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtB,CAAC;IAEM,WAAW,CAAI,EAAW;QAC/B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAErB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,EAAE,CAAA;YAEnB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAEtB,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAExB,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,KAAc;QAChC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAA;QAEpC,OAAO,MAAM,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC7C,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAAmB;QACrC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,SAAS,CAAA;QAEnC,OAAO,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACxC,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;IACjB,CAAC;CACF,CAAA;AAxCY,eAAe;IAD3B,UAAU,EAAE;GACA,eAAe,CAwC3B"}
|
|
@@ -4,18 +4,24 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
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
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
+
import { styleText } from 'node:util';
|
|
7
8
|
import { Injectable } from 'pleroma';
|
|
9
|
+
const MAX_TIMEOUT_DELAY_IN_MS = 2 ** 31 - 1;
|
|
8
10
|
let TimeoutSchedulerService = class TimeoutSchedulerService {
|
|
9
11
|
timers = new Map();
|
|
10
12
|
schedule(id, timeoutAt, fn) {
|
|
11
13
|
this.cancel(id);
|
|
12
|
-
const
|
|
14
|
+
const delayInMs = Math.min(Math.max(timeoutAt.getTime() - Date.now(), 0), MAX_TIMEOUT_DELAY_IN_MS);
|
|
13
15
|
const timer = setTimeout(() => {
|
|
14
16
|
this.timers.delete(id);
|
|
17
|
+
if (timeoutAt.getTime() > Date.now())
|
|
18
|
+
return this.schedule(id, timeoutAt, fn);
|
|
15
19
|
Promise.resolve(fn()).catch(error => {
|
|
16
|
-
console.error('[
|
|
20
|
+
console.error(styleText('red', '[server] timeout handler failed:', {
|
|
21
|
+
stream: process.stderr,
|
|
22
|
+
}), error);
|
|
17
23
|
});
|
|
18
|
-
},
|
|
24
|
+
}, delayInMs);
|
|
19
25
|
this.timers.set(id, timer);
|
|
20
26
|
}
|
|
21
27
|
cancel(id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeoutScheduler.service.js","sourceRoot":"","sources":["../../src/services/TimeoutScheduler.service.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"TimeoutScheduler.service.js","sourceRoot":"","sources":["../../src/services/TimeoutScheduler.service.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,MAAM,uBAAuB,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AAGpC,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IACjB,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAA;IAEpD,QAAQ,CAAC,EAAU,EAAE,SAAe,EAAE,EAA8B;QACzE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAEf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAC7C,uBAAuB,CACxB,CAAA;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAEtB,IAAI,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;gBAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;YAEzC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBAClC,OAAO,CAAC,KAAK,CACX,SAAS,CAAC,KAAK,EAAE,kCAAkC,EAAE;oBACnD,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC,EACF,KAAK,CACN,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,EAAE,SAAS,CAAC,CAAA;QAEb,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;IAC5B,CAAC;IAEM,MAAM,CAAC,EAAU;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAEjC,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,YAAY,CAAC,KAAK,CAAC,CAAA;QAEnB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACxB,CAAC;CACF,CAAA;AAvCY,uBAAuB;IADnC,UAAU,EAAE;GACA,uBAAuB,CAuCnC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AppManifest } from '../AppProcess.js';
|
|
2
|
+
export interface WorkflowAuthorizationRequest {
|
|
3
|
+
method: string;
|
|
4
|
+
url: string;
|
|
5
|
+
path: string;
|
|
6
|
+
headers: Record<string, string>;
|
|
7
|
+
params: Record<string, string>;
|
|
8
|
+
query: Record<string, string>;
|
|
9
|
+
rawBody: string;
|
|
10
|
+
body: unknown;
|
|
11
|
+
}
|
|
12
|
+
export declare class WorkflowAuthorizationService {
|
|
13
|
+
private readonly projectDir;
|
|
14
|
+
constructor(projectDir: string);
|
|
15
|
+
authorize(manifest: AppManifest, workflowId: string, request: WorkflowAuthorizationRequest): Promise<boolean>;
|
|
16
|
+
private importModule;
|
|
17
|
+
private resolve;
|
|
18
|
+
private replace;
|
|
19
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
import { WorkflowAuthorizationMissingError } from '../models/WorkflowAuthorizationMissingError.js';
|
|
4
|
+
import { replace } from '../tools/replace.js';
|
|
5
|
+
const SUPPORTED_BARE_SPECIFIERS = [
|
|
6
|
+
'@t4h.framework/hmac/authorize',
|
|
7
|
+
'@t4h.framework/jwks/authorize',
|
|
8
|
+
'@t4h.framework/oidc/authorize',
|
|
9
|
+
];
|
|
10
|
+
export class WorkflowAuthorizationService {
|
|
11
|
+
projectDir;
|
|
12
|
+
constructor(projectDir) {
|
|
13
|
+
this.projectDir = projectDir;
|
|
14
|
+
}
|
|
15
|
+
async authorize(manifest, workflowId, request) {
|
|
16
|
+
const workflow = manifest.workflows.find(workflow => workflow.id === workflowId);
|
|
17
|
+
if (!workflow)
|
|
18
|
+
throw new Error('Cannot get workflow manifest');
|
|
19
|
+
const authorization = workflow.authorization || manifest.authorization;
|
|
20
|
+
if (!authorization)
|
|
21
|
+
throw new WorkflowAuthorizationMissingError(workflowId);
|
|
22
|
+
const module = await this.importModule(authorization.pathToModule);
|
|
23
|
+
try {
|
|
24
|
+
const result = authorization.context
|
|
25
|
+
? await module.default(this.replace(authorization.context, request))
|
|
26
|
+
: await module.default();
|
|
27
|
+
return !!result;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error(error);
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async importModule(pathToModule) {
|
|
35
|
+
let module;
|
|
36
|
+
try {
|
|
37
|
+
module = (await import(this.resolve(pathToModule)));
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const isNotFound = error instanceof Error &&
|
|
41
|
+
'code' in error &&
|
|
42
|
+
error.code === 'ERR_MODULE_NOT_FOUND';
|
|
43
|
+
if (!isNotFound)
|
|
44
|
+
throw error;
|
|
45
|
+
throw new Error(`Cannot resolve authorization module "${pathToModule}". The dev server supports ${SUPPORTED_BARE_SPECIFIERS.join(', ')}`, { cause: error });
|
|
46
|
+
}
|
|
47
|
+
if (typeof module.default !== 'function')
|
|
48
|
+
throw new Error(`Authorization module "${pathToModule}" has no default export function`);
|
|
49
|
+
return module;
|
|
50
|
+
}
|
|
51
|
+
resolve(pathToModule) {
|
|
52
|
+
if (pathToModule.startsWith('file:'))
|
|
53
|
+
return pathToModule;
|
|
54
|
+
if (path.isAbsolute(pathToModule))
|
|
55
|
+
return pathToFileURL(pathToModule).href;
|
|
56
|
+
if (pathToModule.startsWith('./') || pathToModule.startsWith('../'))
|
|
57
|
+
return pathToFileURL(path.resolve(this.projectDir, pathToModule)).href;
|
|
58
|
+
return pathToModule;
|
|
59
|
+
}
|
|
60
|
+
replace(value, context) {
|
|
61
|
+
if (value === null || value === undefined)
|
|
62
|
+
return value;
|
|
63
|
+
if (typeof value === 'string')
|
|
64
|
+
return replace(value, context);
|
|
65
|
+
if (Array.isArray(value))
|
|
66
|
+
return value.map(item => this.replace(item, context));
|
|
67
|
+
if (typeof value === 'object')
|
|
68
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [
|
|
69
|
+
key,
|
|
70
|
+
this.replace(item, context),
|
|
71
|
+
]));
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=WorkflowAuthorization.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowAuthorization.service.js","sourceRoot":"","sources":["../../src/services/WorkflowAuthorization.service.ts"],"names":[],"mappings":"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"}
|