@t4h.framework/dev 0.14.2 → 0.15.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 +13 -0
- package/README.md +96 -45
- 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 +168 -0
- package/dist/Server.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 +134 -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 +28 -15
- package/dist/models/WorkflowRun.js +17 -8
- 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 +2 -3
- 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 +41 -6
- package/dist/repositories/WorkflowRun.repository.js +204 -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 +108 -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 +109 -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/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-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 +12 -0
- package/dist/tools/to-workflow-run-output.js +13 -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 +46 -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 +18 -7
- package/dist/use-cases/NextTickWorkflowRun.usecase.js +152 -128
- 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 +18 -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 +21 -0
- package/dist/use-cases/WorkflowRunFindById.usecase.js +46 -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 +14 -4
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/constants/server.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAA;AAEhC,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAA;AAEvC,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,GAAG,IAAI,CAAA;AAElD,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAA;AAE7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAA;AAE3C,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAA;AAElD,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAA;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAA;AAExC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,aAAa,EAAE,aAAa,CAAU,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { EventEmitter } from 'node:events';
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import type { AppProcess } from '../AppProcess.js';
|
|
4
|
+
import { type ProjectManifestVariables } from './middlewares/project-manifest.middleware.js';
|
|
5
|
+
import { type JsonBodyVariables } from './middlewares/read-json-body.middleware.js';
|
|
6
|
+
import { type WorkflowAuthorizationVariables } from './middlewares/workflow-authorization.middleware.js';
|
|
7
|
+
export interface CreateAppOptions {
|
|
8
|
+
appProcess: AppProcess;
|
|
9
|
+
events: EventEmitter;
|
|
10
|
+
projectDir: string;
|
|
11
|
+
}
|
|
12
|
+
type AppEnv = {
|
|
13
|
+
Variables: ProjectManifestVariables & JsonBodyVariables & WorkflowAuthorizationVariables;
|
|
14
|
+
};
|
|
15
|
+
export declare function createApp({ appProcess, events, projectDir, }: CreateAppOptions): Hono<AppEnv, import("hono/types").BlankSchema, "/">;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { cors } from 'hono/cors';
|
|
3
|
+
import { streamSSE } from 'hono/streaming';
|
|
4
|
+
import { toHttpError } from './helpers/to-http-error.js';
|
|
5
|
+
import { errorHandler } from './middlewares/error-handler.middleware.js';
|
|
6
|
+
import { projectManifest, } from './middlewares/project-manifest.middleware.js';
|
|
7
|
+
import { readJsonBody, } from './middlewares/read-json-body.middleware.js';
|
|
8
|
+
import { workflowAuthorization, } from './middlewares/workflow-authorization.middleware.js';
|
|
9
|
+
import { DEV_ROUTES_PREFIX, SSE_HEARTBEAT_INTERVAL_IN_MS, WORKFLOW_RUN_EVENTS, } from '../constants/server.js';
|
|
10
|
+
const WORKFLOW_PATH = '/projects/:projectId/workflows/:workflowId';
|
|
11
|
+
const SERVER_EVENTS = [
|
|
12
|
+
'manifest',
|
|
13
|
+
'build:status',
|
|
14
|
+
'build:fail',
|
|
15
|
+
'app:exit',
|
|
16
|
+
...WORKFLOW_RUN_EVENTS,
|
|
17
|
+
];
|
|
18
|
+
const FIND_QUERY_STRINGS = [
|
|
19
|
+
'status',
|
|
20
|
+
'workflow',
|
|
21
|
+
'id',
|
|
22
|
+
'parentRunId',
|
|
23
|
+
'parentActivityId',
|
|
24
|
+
];
|
|
25
|
+
const PAGE_QUERY_INTEGERS = ['limit', 'offset'];
|
|
26
|
+
const MAX_LIMIT = 50;
|
|
27
|
+
const FIND_QUERY_INTEGERS = [
|
|
28
|
+
'createdAfter',
|
|
29
|
+
'createdBefore',
|
|
30
|
+
...PAGE_QUERY_INTEGERS,
|
|
31
|
+
];
|
|
32
|
+
function toIntegers(query, names) {
|
|
33
|
+
const result = {};
|
|
34
|
+
for (const name of names) {
|
|
35
|
+
const value = Number.parseInt(query[name] ?? '', 10);
|
|
36
|
+
if (Number.isFinite(value))
|
|
37
|
+
result[name] = value;
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
function checkPage(page) {
|
|
42
|
+
if (page.limit !== undefined && (page.limit < 1 || page.limit > MAX_LIMIT))
|
|
43
|
+
throw toHttpError(400, `limit must be between 1 and ${MAX_LIMIT}`);
|
|
44
|
+
if (page.offset !== undefined && page.offset < 0)
|
|
45
|
+
throw toHttpError(400, 'offset must be 0 or more');
|
|
46
|
+
}
|
|
47
|
+
function toPageQuery(query) {
|
|
48
|
+
const page = toIntegers(query, PAGE_QUERY_INTEGERS);
|
|
49
|
+
checkPage(page);
|
|
50
|
+
return page;
|
|
51
|
+
}
|
|
52
|
+
function toFindQuery(query) {
|
|
53
|
+
const result = toIntegers(query, FIND_QUERY_INTEGERS);
|
|
54
|
+
checkPage(result);
|
|
55
|
+
for (const name of FIND_QUERY_STRINGS)
|
|
56
|
+
if (query[name])
|
|
57
|
+
result[name] = query[name];
|
|
58
|
+
if (query.rootOnly !== undefined)
|
|
59
|
+
result.rootOnly = query.rootOnly === 'true';
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
function toAdvancePayload(body) {
|
|
63
|
+
if (body !== undefined &&
|
|
64
|
+
(typeof body !== 'object' || body === null || Array.isArray(body)))
|
|
65
|
+
throw toHttpError(400, 'Body must be an object');
|
|
66
|
+
return body?.payload;
|
|
67
|
+
}
|
|
68
|
+
export function createApp({ appProcess, events, projectDir, }) {
|
|
69
|
+
const app = new Hono();
|
|
70
|
+
app.use(cors());
|
|
71
|
+
app.onError(errorHandler);
|
|
72
|
+
app.notFound(context => context.json({
|
|
73
|
+
statusCode: 404,
|
|
74
|
+
message: `Cannot ${context.req.method} ${context.req.path}`,
|
|
75
|
+
error: 'Not Found',
|
|
76
|
+
}, 404));
|
|
77
|
+
const manifest = projectManifest({ appProcess });
|
|
78
|
+
const authorization = workflowAuthorization({ projectDir });
|
|
79
|
+
app.get('/projects/:projectId/manifest.json', manifest, context => context.json(context.get('manifest')));
|
|
80
|
+
app.post(`${WORKFLOW_PATH}/runs`, readJsonBody, manifest, authorization, async (context) => {
|
|
81
|
+
const { id } = await appProcess.call('workflow.run', context.get('workflowId'), context.get('body'));
|
|
82
|
+
return context.json({ id }, 201);
|
|
83
|
+
});
|
|
84
|
+
app.patch(`${WORKFLOW_PATH}/runs/:runId/activities/:activityId`, readJsonBody, manifest, authorization, async (context) => {
|
|
85
|
+
const payload = toAdvancePayload(context.get('body'));
|
|
86
|
+
const activity = await appProcess.call('workflow.async-activities.advance', context.req.param('activityId'), payload);
|
|
87
|
+
return context.json({
|
|
88
|
+
id: activity.id,
|
|
89
|
+
type: activity.type,
|
|
90
|
+
status: activity.status,
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
const dev = new Hono();
|
|
94
|
+
dev.get('/manifest', async (context) => context.json(await appProcess.whenReady()));
|
|
95
|
+
dev.get('/state', context => context.json({ state: appProcess.state }));
|
|
96
|
+
dev.get('/runs', async (context) => context.json(await appProcess.call('workflow.runs.find', toFindQuery(context.req.query()))));
|
|
97
|
+
dev.get('/runs/:id', async (context) => context.json(await appProcess.call('workflow.runs.findById', context.req.param('id'))));
|
|
98
|
+
dev.get('/runs/:id/activities', async (context) => context.json(await appProcess.call('workflow.runs.activities.find', context.req.param('id'), toPageQuery(context.req.query()))));
|
|
99
|
+
dev.get('/runs/:id/activities/:activityId/pendings', async (context) => context.json(await appProcess.call('workflow.runs.activities.pendings.find', context.req.param('id'), context.req.param('activityId'), toPageQuery(context.req.query()))));
|
|
100
|
+
dev.get('/runs/:id/activities/:activityId', async (context) => context.json(await appProcess.call('workflow.runs.activities.findById', context.req.param('id'), context.req.param('activityId'))));
|
|
101
|
+
dev.get('/runs/:id/logs', async (context) => context.json(await appProcess.call('workflow.runs.logs.find', context.req.param('id'), toPageQuery(context.req.query()))));
|
|
102
|
+
dev.get('/activities/waiting', async (context) => context.json(await appProcess.call('workflow.async-activities.waiting.list', toPageQuery(context.req.query()))));
|
|
103
|
+
dev.post('/workflows/:workflowId/runs', readJsonBody, async (context) => {
|
|
104
|
+
const { id } = await appProcess.call('workflow.run', context.req.param('workflowId'), context.get('body'));
|
|
105
|
+
return context.json({ id }, 201);
|
|
106
|
+
});
|
|
107
|
+
dev.post('/activities/:activityId/advance', readJsonBody, async (context) => {
|
|
108
|
+
const payload = toAdvancePayload(context.get('body'));
|
|
109
|
+
const activity = await appProcess.call('workflow.async-activities.advance', context.req.param('activityId'), payload);
|
|
110
|
+
return context.json({
|
|
111
|
+
id: activity.id,
|
|
112
|
+
type: activity.type,
|
|
113
|
+
status: activity.status,
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
dev.get('/events', context => streamSSE(context, async (stream) => {
|
|
117
|
+
const send = (event, data) => stream.writeSSE({ event, data: JSON.stringify(data ?? null) });
|
|
118
|
+
const listeners = SERVER_EVENTS.map(event => {
|
|
119
|
+
const listener = (data) => void send(event, data);
|
|
120
|
+
events.on(event, listener);
|
|
121
|
+
return [event, listener];
|
|
122
|
+
});
|
|
123
|
+
const heartbeat = setInterval(() => void stream.writeSSE({ event: 'ping', data: '' }), SSE_HEARTBEAT_INTERVAL_IN_MS).unref();
|
|
124
|
+
if (appProcess.manifest)
|
|
125
|
+
await send('manifest', appProcess.manifest);
|
|
126
|
+
await new Promise(resolve => stream.onAbort(resolve));
|
|
127
|
+
clearInterval(heartbeat);
|
|
128
|
+
for (const [event, listener] of listeners)
|
|
129
|
+
events.off(event, listener);
|
|
130
|
+
}));
|
|
131
|
+
app.route(DEV_ROUTES_PREFIX, dev);
|
|
132
|
+
return app;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=create-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-app.js","sourceRoot":"","sources":["../../src/http/create-app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { HTTPException } from 'hono/http-exception';
|
|
2
|
+
import type { ContentfulStatusCode } from 'hono/utils/http-status';
|
|
3
|
+
export interface HttpErrorBody {
|
|
4
|
+
statusCode: number;
|
|
5
|
+
message: unknown;
|
|
6
|
+
error?: unknown;
|
|
7
|
+
}
|
|
8
|
+
export declare function toHttpError(statusCode: ContentfulStatusCode, message: unknown, error?: unknown): HTTPException;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { STATUS_CODES } from 'node:http';
|
|
2
|
+
import { HTTPException } from 'hono/http-exception';
|
|
3
|
+
export function toHttpError(statusCode, message, error = STATUS_CODES[statusCode]) {
|
|
4
|
+
return new HTTPException(statusCode, {
|
|
5
|
+
message: typeof message === 'string' ? message : String(error),
|
|
6
|
+
cause: { statusCode, message, error },
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=to-http-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-http-error.js","sourceRoot":"","sources":["../../../src/http/helpers/to-http-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AASnD,MAAM,UAAU,WAAW,CACzB,UAAgC,EAChC,OAAgB,EAChB,QAAiB,YAAY,CAAC,UAAU,CAAC;IAEzC,OAAO,IAAI,aAAa,CAAC,UAAU,EAAE;QACnC,OAAO,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9D,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAA0B;KAC9D,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { STATUS_CODES } from 'node:http';
|
|
2
|
+
import { HTTPException } from 'hono/http-exception';
|
|
3
|
+
import { AppProcessNotReadyError } from '../../AppProcess.js';
|
|
4
|
+
import { JSONRPCError } from '../../models/JSONRPCError.js';
|
|
5
|
+
export const errorHandler = (error, context) => {
|
|
6
|
+
if (error instanceof HTTPException) {
|
|
7
|
+
const body = error.cause ?? {
|
|
8
|
+
statusCode: error.status,
|
|
9
|
+
message: error.message,
|
|
10
|
+
error: STATUS_CODES[error.status],
|
|
11
|
+
};
|
|
12
|
+
return context.json(body, error.status);
|
|
13
|
+
}
|
|
14
|
+
if (error instanceof AppProcessNotReadyError)
|
|
15
|
+
return context.json({ statusCode: 503, message: 'App is not ready', error: error.message }, 503);
|
|
16
|
+
if (error instanceof JSONRPCError && error.data?.status) {
|
|
17
|
+
const statusCode = error.data.status;
|
|
18
|
+
return context.json({
|
|
19
|
+
statusCode,
|
|
20
|
+
message: error.data.details ?? error.message,
|
|
21
|
+
error: STATUS_CODES[statusCode],
|
|
22
|
+
}, statusCode);
|
|
23
|
+
}
|
|
24
|
+
console.error('[Server] unexpected error:', error);
|
|
25
|
+
return context.json({ statusCode: 500, message: 'Internal server error', error: String(error) }, 500);
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=error-handler.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.middleware.js","sourceRoot":"","sources":["../../../src/http/middlewares/error-handler.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAGxC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAG3D,MAAM,CAAC,MAAM,YAAY,GAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAC3D,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;QACnC,MAAM,IAAI,GAAI,KAAK,CAAC,KAAmC,IAAI;YACzD,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;SAClC,CAAA;QAED,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,MAA8B,CAAC,CAAA;IACjE,CAAC;IAED,IAAI,KAAK,YAAY,uBAAuB;QAC1C,OAAO,OAAO,CAAC,IAAI,CACjB,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EACtE,GAAG,CACJ,CAAA;IAEH,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAA8B,CAAA;QAE5D,OAAO,OAAO,CAAC,IAAI,CACjB;YACE,UAAU;YACV,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;YAC5C,KAAK,EAAE,YAAY,CAAC,UAAU,CAAC;SAChC,EACD,UAAU,CACX,CAAA;IACH,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAA;IAElD,OAAO,OAAO,CAAC,IAAI,CACjB,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,uBAAuB,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAC3E,GAAG,CACJ,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import type { AppManifest, AppProcess } from '../../AppProcess.js';
|
|
3
|
+
export type ProjectManifestVariables = {
|
|
4
|
+
manifest: AppManifest;
|
|
5
|
+
};
|
|
6
|
+
export interface ProjectManifestOptions {
|
|
7
|
+
appProcess: AppProcess;
|
|
8
|
+
}
|
|
9
|
+
export declare function projectManifest({ appProcess, }: ProjectManifestOptions): MiddlewareHandler<{
|
|
10
|
+
Variables: ProjectManifestVariables;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { toHttpError } from '../helpers/to-http-error.js';
|
|
2
|
+
export function projectManifest({ appProcess, }) {
|
|
3
|
+
return async (context, next) => {
|
|
4
|
+
const manifest = await appProcess.whenReady();
|
|
5
|
+
if (manifest.id !== context.req.param('projectId'))
|
|
6
|
+
throw toHttpError(404, 'Project not found');
|
|
7
|
+
context.set('manifest', manifest);
|
|
8
|
+
await next();
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=project-manifest.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-manifest.middleware.js","sourceRoot":"","sources":["../../../src/http/middlewares/project-manifest.middleware.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAQzD,MAAM,UAAU,eAAe,CAAC,EAC9B,UAAU,GACa;IAGvB,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAA;QAE7C,IAAI,QAAQ,CAAC,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;YAChD,MAAM,WAAW,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAA;QAE7C,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;QAEjC,MAAM,IAAI,EAAE,CAAA;IACd,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { bodyLimit } from 'hono/body-limit';
|
|
2
|
+
import { every } from 'hono/combine';
|
|
3
|
+
import { JSON_BODY_LIMIT_IN_BYTES } from '../../constants/server.js';
|
|
4
|
+
import { toHttpError } from '../helpers/to-http-error.js';
|
|
5
|
+
const JSON_CONTENT_TYPE = /^application\/([\w.-]+\+)?json/i;
|
|
6
|
+
const parseJsonBody = async (context, next) => {
|
|
7
|
+
const rawBody = await context.req.text();
|
|
8
|
+
context.set('rawBody', rawBody);
|
|
9
|
+
context.set('body', undefined);
|
|
10
|
+
const contentType = context.req.header('content-type') ?? '';
|
|
11
|
+
if (rawBody.length && JSON_CONTENT_TYPE.test(contentType)) {
|
|
12
|
+
try {
|
|
13
|
+
context.set('body', JSON.parse(rawBody));
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
throw toHttpError(400, error instanceof Error ? error.message : 'Invalid JSON body');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
await next();
|
|
20
|
+
};
|
|
21
|
+
export const readJsonBody = every(bodyLimit({ maxSize: JSON_BODY_LIMIT_IN_BYTES }), parseJsonBody);
|
|
22
|
+
//# sourceMappingURL=read-json-body.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-json-body.middleware.js","sourceRoot":"","sources":["../../../src/http/middlewares/read-json-body.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAEpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAIzD,MAAM,iBAAiB,GAAG,iCAAiC,CAAA;AAE3D,MAAM,aAAa,GAEd,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAC3B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IAExC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAE9B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;IAE5D,IAAI,OAAO,CAAC,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CACf,GAAG,EACH,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAC7D,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,EAAE,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAC/B,SAAS,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,EAChD,aAAa,CACd,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import type { ProjectManifestVariables } from './project-manifest.middleware.js';
|
|
3
|
+
import type { JsonBodyVariables } from './read-json-body.middleware.js';
|
|
4
|
+
export type WorkflowAuthorizationVariables = {
|
|
5
|
+
workflowId: string;
|
|
6
|
+
};
|
|
7
|
+
export interface WorkflowAuthorizationOptions {
|
|
8
|
+
projectDir: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function workflowAuthorization({ projectDir, }: WorkflowAuthorizationOptions): MiddlewareHandler<{
|
|
11
|
+
Variables: ProjectManifestVariables & JsonBodyVariables & WorkflowAuthorizationVariables;
|
|
12
|
+
}>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { WorkflowAuthorizationService } from '../../services/WorkflowAuthorization.service.js';
|
|
2
|
+
import { toHttpError } from '../helpers/to-http-error.js';
|
|
3
|
+
export function workflowAuthorization({ projectDir, }) {
|
|
4
|
+
const authorization = new WorkflowAuthorizationService(projectDir);
|
|
5
|
+
return async (context, next) => {
|
|
6
|
+
const manifest = context.get('manifest');
|
|
7
|
+
const workflowId = context.req.param('workflowId');
|
|
8
|
+
const workflow = manifest.workflows.find(workflow => workflow.id === workflowId);
|
|
9
|
+
if (!workflow?.id)
|
|
10
|
+
throw toHttpError(404, 'Workflow not found');
|
|
11
|
+
const url = new URL(context.req.url);
|
|
12
|
+
const authorized = await authorization.authorize(manifest, workflow.id, {
|
|
13
|
+
method: context.req.method,
|
|
14
|
+
url: `${url.pathname}${url.search}`,
|
|
15
|
+
path: url.pathname,
|
|
16
|
+
headers: Object.fromEntries(context.req.raw.headers.entries()),
|
|
17
|
+
params: context.req.param(),
|
|
18
|
+
query: context.req.query(),
|
|
19
|
+
rawBody: context.get('rawBody'),
|
|
20
|
+
body: context.get('body'),
|
|
21
|
+
});
|
|
22
|
+
if (!authorized)
|
|
23
|
+
throw toHttpError(401, 'Unauthorized');
|
|
24
|
+
context.set('workflowId', workflow.id);
|
|
25
|
+
await next();
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=workflow-authorization.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-authorization.middleware.js","sourceRoot":"","sources":["../../../src/http/middlewares/workflow-authorization.middleware.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iDAAiD,CAAA;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAQzD,MAAM,UAAU,qBAAqB,CAAC,EACpC,UAAU,GACmB;IAK7B,MAAM,aAAa,GAAG,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAA;IAElE,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAExC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAElD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CACtC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,CACvC,CAAA;QAED,IAAI,CAAC,QAAQ,EAAE,EAAE;YAAE,MAAM,WAAW,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAA;QAE/D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEpC,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE;YACtE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM;YAC1B,GAAG,EAAE,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE;YACnC,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC9D,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;YAC3B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;YAC1B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;YAC/B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;SAC1B,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU;YAAE,MAAM,WAAW,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;QAEvD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;QAEtC,MAAM,IAAI,EAAE,CAAA;IACd,CAAC,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export
|
|
4
|
-
export * from './models/claims/DevFileSystemClaim.js';
|
|
5
|
-
export * from './models/claims/DevGetActivityUniqueIdentifierClaim.js';
|
|
6
|
-
export * from './models/claims/DevGetProjectUniqueIdentifierClaim.js';
|
|
7
|
-
export * from './models/claims/DevGetProjectVersionUniqueIdentifierClaim.js';
|
|
8
|
-
export * from './models/claims/DevGetProjectVersionWorkflowUniqueIdentifierClaim.js';
|
|
9
|
-
export * from './models/claims/DevGetWorkflowUniqueIdentifierClaim.js';
|
|
10
|
-
export * from './models/claims/DevHttpClientRequestClaim.js';
|
|
11
|
-
export * from './models/claims/DevORMClaim.js';
|
|
12
|
-
export * from './models/claims/DevSmtpSendEmailClaim.js';
|
|
13
|
-
export * from './models/claims/DevWorkflowClaim.js';
|
|
14
|
-
export * from './tools/find-claim-by-constructor.js';
|
|
15
|
-
export * from './tools/is-workflow-waiting.js';
|
|
1
|
+
export * from './Server.js';
|
|
2
|
+
export * from './models/WorkflowAuthorizationMissingError.js';
|
|
3
|
+
export type { AppManifest, AppProcessState } from './AppProcess.js';
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,3 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './models/claims/DevCacheClaim.js';
|
|
4
|
-
export * from './models/claims/DevFileSystemClaim.js';
|
|
5
|
-
export * from './models/claims/DevGetActivityUniqueIdentifierClaim.js';
|
|
6
|
-
export * from './models/claims/DevGetProjectUniqueIdentifierClaim.js';
|
|
7
|
-
export * from './models/claims/DevGetProjectVersionUniqueIdentifierClaim.js';
|
|
8
|
-
export * from './models/claims/DevGetProjectVersionWorkflowUniqueIdentifierClaim.js';
|
|
9
|
-
export * from './models/claims/DevGetWorkflowUniqueIdentifierClaim.js';
|
|
10
|
-
export * from './models/claims/DevHttpClientRequestClaim.js';
|
|
11
|
-
export * from './models/claims/DevORMClaim.js';
|
|
12
|
-
export * from './models/claims/DevSmtpSendEmailClaim.js';
|
|
13
|
-
export * from './models/claims/DevWorkflowClaim.js';
|
|
14
|
-
export * from './tools/find-claim-by-constructor.js';
|
|
15
|
-
export * from './tools/is-workflow-waiting.js';
|
|
1
|
+
export * from './Server.js';
|
|
2
|
+
export * from './models/WorkflowAuthorizationMissingError.js';
|
|
16
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,+CAA+C,CAAA"}
|
|
@@ -3,9 +3,11 @@ export type JSONRPCClientSend = (message: string) => void | Promise<void>;
|
|
|
3
3
|
export declare class JSONRPCClient {
|
|
4
4
|
private readonly send;
|
|
5
5
|
private readonly listeners;
|
|
6
|
+
private readonly pending;
|
|
6
7
|
constructor(send: JSONRPCClientSend);
|
|
7
8
|
addListener(listener: (response: JSONRPCResponseFulfilled | JSONRPCResponseRejected) => void): () => void;
|
|
8
9
|
call(method: string, ...params: any[]): Promise<any>;
|
|
10
|
+
rejectPending(error: Error): void;
|
|
9
11
|
notify(method: string, ...params: any[]): Promise<void>;
|
|
10
12
|
handle(message: any): Promise<unknown>;
|
|
11
13
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { uuidv7 } from 'uuidv7';
|
|
2
|
+
import { JSONRPCError } from './JSONRPCError.js';
|
|
2
3
|
export class JSONRPCClient {
|
|
3
4
|
send;
|
|
4
5
|
listeners = [];
|
|
6
|
+
pending = new Set();
|
|
5
7
|
constructor(send) {
|
|
6
8
|
this.send = send;
|
|
7
9
|
}
|
|
@@ -15,19 +17,34 @@ export class JSONRPCClient {
|
|
|
15
17
|
const id = uuidv7();
|
|
16
18
|
const message = { jsonrpc: '2.0', id, method, params };
|
|
17
19
|
const promise = new Promise((resolve, reject) => {
|
|
20
|
+
const fail = (error) => {
|
|
21
|
+
off();
|
|
22
|
+
this.pending.delete(fail);
|
|
23
|
+
reject(error);
|
|
24
|
+
};
|
|
18
25
|
const off = this.addListener(response => {
|
|
19
26
|
if (response.id !== id)
|
|
20
27
|
return;
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
if ('result' in response) {
|
|
29
|
+
off();
|
|
30
|
+
this.pending.delete(fail);
|
|
23
31
|
resolve(response.result);
|
|
24
|
-
|
|
25
|
-
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
fail(new JSONRPCError(response.error.message, {
|
|
35
|
+
code: response.error.code,
|
|
36
|
+
data: response.error.data,
|
|
37
|
+
}));
|
|
26
38
|
});
|
|
39
|
+
this.pending.add(fail);
|
|
27
40
|
});
|
|
28
41
|
await this.send(JSON.stringify(message));
|
|
29
42
|
return promise;
|
|
30
43
|
}
|
|
44
|
+
rejectPending(error) {
|
|
45
|
+
for (const fail of [...this.pending])
|
|
46
|
+
fail(error);
|
|
47
|
+
}
|
|
31
48
|
async notify(method, ...params) {
|
|
32
49
|
const message = { jsonrpc: '2.0', method, params };
|
|
33
50
|
await this.send(JSON.stringify(message));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JSONRPCClient.js","sourceRoot":"","sources":["../../src/models/JSONRPCClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"JSONRPCClient.js","sourceRoot":"","sources":["../../src/models/JSONRPCClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface JSONRPCErrorData {
|
|
2
|
+
status?: number;
|
|
3
|
+
details?: unknown;
|
|
4
|
+
}
|
|
5
|
+
export interface JSONRPCErrorOptions {
|
|
6
|
+
code?: number;
|
|
7
|
+
data?: JSONRPCErrorData;
|
|
8
|
+
}
|
|
9
|
+
export declare class JSONRPCError extends Error {
|
|
10
|
+
readonly code: number;
|
|
11
|
+
readonly data: JSONRPCErrorData | undefined;
|
|
12
|
+
constructor(message: string, { code, data }?: JSONRPCErrorOptions);
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JSONRPCError.js","sourceRoot":"","sources":["../../src/models/JSONRPCError.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrB,IAAI,CAAQ;IACZ,IAAI,CAA8B;IAElD,YACE,OAAe,EACf,EAAE,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,KAA0B,EAAE;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAA;QAEd,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ValidateFunction } from 'ajv';
|
|
2
2
|
import Type from 'typebox';
|
|
3
|
+
import { type JSONRPCErrorData } from './JSONRPCError.js';
|
|
3
4
|
export interface JSONRPCServerServerMethodConfig<TSchema extends Type.TSchema | null = null> {
|
|
4
5
|
schema?: TSchema;
|
|
5
6
|
}
|
|
@@ -45,6 +46,7 @@ export type JSONRPCResponseRejected = {
|
|
|
45
46
|
error: {
|
|
46
47
|
code: number;
|
|
47
48
|
message: string;
|
|
49
|
+
data?: JSONRPCErrorData;
|
|
48
50
|
};
|
|
49
51
|
};
|
|
50
52
|
export type JSONRPCResponseNotification = {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Ajv } from 'ajv';
|
|
2
2
|
import Type from 'typebox';
|
|
3
|
+
import { JSONRPCError } from './JSONRPCError.js';
|
|
3
4
|
const ajv = new Ajv();
|
|
4
5
|
export class JSONRPCServerMethod {
|
|
5
6
|
name;
|
|
@@ -26,7 +27,10 @@ export class JSONRPCServerMethod {
|
|
|
26
27
|
return this.call([params]);
|
|
27
28
|
const isValid = this.validate.every((validate, index) => validate(params[index]));
|
|
28
29
|
if (!isValid)
|
|
29
|
-
throw new
|
|
30
|
+
throw new JSONRPCError('Invalid parameters', {
|
|
31
|
+
code: -32602,
|
|
32
|
+
data: { status: 400 },
|
|
33
|
+
});
|
|
30
34
|
return await this.fn(...params);
|
|
31
35
|
}
|
|
32
36
|
}
|
|
@@ -53,17 +57,21 @@ export class JSONRPCServer {
|
|
|
53
57
|
if (!method)
|
|
54
58
|
throw new Error(`Method ${message.method} not found`);
|
|
55
59
|
const result = (await method.call(message.params)) ?? null;
|
|
60
|
+
if (!('id' in message) || message.id === undefined)
|
|
61
|
+
return;
|
|
56
62
|
await this.send(JSON.stringify({ jsonrpc: '2.0', id: message.id, result }));
|
|
57
63
|
}
|
|
58
64
|
catch (error) {
|
|
59
65
|
if (!('id' in message) || message.id === undefined)
|
|
60
66
|
throw error;
|
|
67
|
+
const rpcError = error instanceof JSONRPCError ? error : null;
|
|
61
68
|
await this.send(JSON.stringify({
|
|
62
69
|
jsonrpc: '2.0',
|
|
63
70
|
id: message.id,
|
|
64
71
|
error: {
|
|
65
|
-
code: -32000,
|
|
72
|
+
code: rpcError?.code ?? -32000,
|
|
66
73
|
message: error instanceof Error ? error.message : String(error),
|
|
74
|
+
...(rpcError?.data ? { data: rpcError.data } : {}),
|
|
67
75
|
},
|
|
68
76
|
}));
|
|
69
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JSONRPCServer.js","sourceRoot":"","sources":["../../src/models/JSONRPCServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAyB,MAAM,KAAK,CAAA;AAChD,OAAO,IAAI,MAAM,SAAS,CAAA;AAE1B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;AAqCrB,MAAM,OAAO,mBAAmB;IAId,IAAI,CAAQ;IACZ,MAAM,CAAe;IACrB,QAAQ,CAA6C;IACrD,EAAE,CAAqD;IAWvE,YACE,IAAY,EACZ,UAEuD,EACvD,OAA6D;QAE7D,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC,MAAM,GAAG,EAA8B,CAAA;YAC5C,IAAI,CAAC,EAAE,GAAG,UAAU,CAAA;QACtB,CAAC;aAAM,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,IAAK,EAA+B,CAAA;YACnE,IAAI,CAAC,EAAE,GAAG,OAAO,CAAA;QACnB,CAAC;;YAAM,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;QAEvD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CACvC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CACsC,CAAA;IAC7D,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAW;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;QAEtD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CACtD,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CACxB,CAAA;QAED,IAAI,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"JSONRPCServer.js","sourceRoot":"","sources":["../../src/models/JSONRPCServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export class WorkflowAuthorizationMissingError extends Error {
|
|
2
|
+
workflowId;
|
|
3
|
+
name = 'WorkflowAuthorizationMissingError';
|
|
4
|
+
constructor(workflowId) {
|
|
5
|
+
super(`Workflow "${workflowId}" has no authorization and the app has no default one. Set app.authorization or workflow.authorization.`);
|
|
6
|
+
this.workflowId = workflowId;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=WorkflowAuthorizationMissingError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowAuthorizationMissingError.js","sourceRoot":"","sources":["../../src/models/WorkflowAuthorizationMissingError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IAG9B;IAFH,IAAI,GAAG,mCAAmC,CAAA;IAEnE,YAA4B,UAAkB;QAC5C,KAAK,CACH,aAAa,UAAU,yGAAyG,CACjI,CAAA;QAHyB,eAAU,GAAV,UAAU,CAAQ;IAI9C,CAAC;CACF"}
|