@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.
Files changed (199) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +112 -58
  3. package/dist/AppProcess.d.ts +36 -0
  4. package/dist/AppProcess.js +126 -0
  5. package/dist/AppProcess.js.map +1 -0
  6. package/dist/Server.d.ts +41 -0
  7. package/dist/Server.js +177 -0
  8. package/dist/Server.js.map +1 -0
  9. package/dist/constants/panel-config.d.ts +2 -0
  10. package/dist/constants/panel-config.js +34 -0
  11. package/dist/constants/panel-config.js.map +1 -0
  12. package/dist/constants/server.d.ts +9 -0
  13. package/dist/constants/server.js +10 -0
  14. package/dist/constants/server.js.map +1 -0
  15. package/dist/http/create-app.d.ts +16 -0
  16. package/dist/http/create-app.js +138 -0
  17. package/dist/http/create-app.js.map +1 -0
  18. package/dist/http/helpers/to-http-error.d.ts +8 -0
  19. package/dist/http/helpers/to-http-error.js +9 -0
  20. package/dist/http/helpers/to-http-error.js.map +1 -0
  21. package/dist/http/middlewares/error-handler.middleware.d.ts +2 -0
  22. package/dist/http/middlewares/error-handler.middleware.js +27 -0
  23. package/dist/http/middlewares/error-handler.middleware.js.map +1 -0
  24. package/dist/http/middlewares/project-manifest.middleware.d.ts +11 -0
  25. package/dist/http/middlewares/project-manifest.middleware.js +11 -0
  26. package/dist/http/middlewares/project-manifest.middleware.js.map +1 -0
  27. package/dist/http/middlewares/read-json-body.middleware.d.ts +6 -0
  28. package/dist/http/middlewares/read-json-body.middleware.js +22 -0
  29. package/dist/http/middlewares/read-json-body.middleware.js.map +1 -0
  30. package/dist/http/middlewares/workflow-authorization.middleware.d.ts +12 -0
  31. package/dist/http/middlewares/workflow-authorization.middleware.js +28 -0
  32. package/dist/http/middlewares/workflow-authorization.middleware.js.map +1 -0
  33. package/dist/index.d.ts +3 -15
  34. package/dist/index.js +2 -15
  35. package/dist/index.js.map +1 -1
  36. package/dist/models/JSONRPCClient.d.ts +2 -0
  37. package/dist/models/JSONRPCClient.js +21 -4
  38. package/dist/models/JSONRPCClient.js.map +1 -1
  39. package/dist/models/JSONRPCError.d.ts +13 -0
  40. package/dist/models/JSONRPCError.js +11 -0
  41. package/dist/models/JSONRPCError.js.map +1 -0
  42. package/dist/models/JSONRPCServer.d.ts +2 -0
  43. package/dist/models/JSONRPCServer.js +10 -2
  44. package/dist/models/JSONRPCServer.js.map +1 -1
  45. package/dist/models/WorkflowAuthorizationMissingError.d.ts +5 -0
  46. package/dist/models/WorkflowAuthorizationMissingError.js +9 -0
  47. package/dist/models/WorkflowAuthorizationMissingError.js.map +1 -0
  48. package/dist/models/WorkflowRun.d.ts +20 -15
  49. package/dist/models/WorkflowRun.js +14 -9
  50. package/dist/models/WorkflowRun.js.map +1 -1
  51. package/dist/models/WorkflowRunActivity.d.ts +40 -27
  52. package/dist/models/WorkflowRunActivity.js +46 -34
  53. package/dist/models/WorkflowRunActivity.js.map +1 -1
  54. package/dist/models/claims/DevHttpClientRequestClaim.js +4 -5
  55. package/dist/models/claims/DevHttpClientRequestClaim.js.map +1 -1
  56. package/dist/models/claims/DevORMClaim.d.ts +15 -4
  57. package/dist/models/claims/DevORMClaim.js +128 -29
  58. package/dist/models/claims/DevORMClaim.js.map +1 -1
  59. package/dist/models/claims/DevWorkflowBatchClaim.js +3 -6
  60. package/dist/models/claims/DevWorkflowBatchClaim.js.map +1 -1
  61. package/dist/models/claims/DevWorkflowClaim.d.ts +1 -1
  62. package/dist/models/claims/DevWorkflowClaim.js +6 -11
  63. package/dist/models/claims/DevWorkflowClaim.js.map +1 -1
  64. package/dist/repositories/WorkflowRun.repository.d.ts +44 -6
  65. package/dist/repositories/WorkflowRun.repository.js +196 -11
  66. package/dist/repositories/WorkflowRun.repository.js.map +1 -1
  67. package/dist/repositories/WorkflowRunActivity.repository.d.ts +19 -6
  68. package/dist/repositories/WorkflowRunActivity.repository.js +73 -23
  69. package/dist/repositories/WorkflowRunActivity.repository.js.map +1 -1
  70. package/dist/repositories/WorkflowRunAsyncActivityPending.repository.d.ts +39 -0
  71. package/dist/repositories/WorkflowRunAsyncActivityPending.repository.js +160 -0
  72. package/dist/repositories/WorkflowRunAsyncActivityPending.repository.js.map +1 -0
  73. package/dist/services/ActivityRegistry.service.d.ts +7 -0
  74. package/dist/services/ActivityRegistry.service.js +32 -0
  75. package/dist/services/ActivityRegistry.service.js.map +1 -0
  76. package/dist/services/Database.service.d.ts +14 -0
  77. package/dist/services/Database.service.js +106 -0
  78. package/dist/services/Database.service.js.map +1 -0
  79. package/dist/services/TimeoutScheduler.service.js +9 -3
  80. package/dist/services/TimeoutScheduler.service.js.map +1 -1
  81. package/dist/services/WorkflowAuthorization.service.d.ts +19 -0
  82. package/dist/services/WorkflowAuthorization.service.js +75 -0
  83. package/dist/services/WorkflowAuthorization.service.js.map +1 -0
  84. package/dist/services/WorkflowRunAsyncActivityFacade.service.d.ts +8 -15
  85. package/dist/services/WorkflowRunAsyncActivityFacade.service.js +12 -26
  86. package/dist/services/WorkflowRunAsyncActivityFacade.service.js.map +1 -1
  87. package/dist/services/WorkflowRunEvents.service.d.ts +11 -0
  88. package/dist/services/WorkflowRunEvents.service.js +42 -0
  89. package/dist/services/WorkflowRunEvents.service.js.map +1 -0
  90. package/dist/services/WorkflowRunFacade.service.d.ts +106 -7
  91. package/dist/services/WorkflowRunFacade.service.js +65 -10
  92. package/dist/services/WorkflowRunFacade.service.js.map +1 -1
  93. package/dist/services/WorkflowRunLock.service.d.ts +6 -0
  94. package/dist/services/WorkflowRunLock.service.js +34 -0
  95. package/dist/services/WorkflowRunLock.service.js.map +1 -0
  96. package/dist/services/WorkflowRunSyncActivityFacade.service.d.ts +4 -4
  97. package/dist/services/WorkflowRunSyncActivityFacade.service.js +7 -7
  98. package/dist/services/WorkflowRunSyncActivityFacade.service.js.map +1 -1
  99. package/dist/tools/copy-additional-files.d.ts +0 -5
  100. package/dist/tools/copy-additional-files.js +0 -5
  101. package/dist/tools/copy-additional-files.js.map +1 -1
  102. package/dist/tools/find-free-port.d.ts +5 -0
  103. package/dist/tools/find-free-port.js +30 -0
  104. package/dist/tools/find-free-port.js.map +1 -0
  105. package/dist/tools/find-workflow-by-id.d.ts +2 -0
  106. package/dist/tools/find-workflow-by-id.js +9 -0
  107. package/dist/tools/find-workflow-by-id.js.map +1 -0
  108. package/dist/tools/format-routes.d.ts +10 -0
  109. package/dist/tools/format-routes.js +40 -0
  110. package/dist/tools/format-routes.js.map +1 -0
  111. package/dist/tools/replace.d.ts +1 -0
  112. package/dist/tools/replace.js +14 -0
  113. package/dist/tools/replace.js.map +1 -0
  114. package/dist/tools/to-rejected-reason.d.ts +5 -0
  115. package/dist/tools/to-rejected-reason.js +11 -0
  116. package/dist/tools/to-rejected-reason.js.map +1 -0
  117. package/dist/tools/to-workflow-run-activity-output.d.ts +24 -0
  118. package/dist/tools/to-workflow-run-activity-output.js +18 -0
  119. package/dist/tools/to-workflow-run-activity-output.js.map +1 -0
  120. package/dist/tools/to-workflow-run-output.d.ts +11 -0
  121. package/dist/tools/to-workflow-run-output.js +12 -0
  122. package/dist/tools/to-workflow-run-output.js.map +1 -0
  123. package/dist/transport/AppProcessJsonRpc.js +59 -0
  124. package/dist/transport/AppProcessJsonRpc.js.map +1 -0
  125. package/dist/use-cases/BuildWorkflowRunActivityHistory.usecase.d.ts +9 -0
  126. package/dist/use-cases/{WorkflowRunBuildHistory.usecase.js → BuildWorkflowRunActivityHistory.usecase.js} +18 -16
  127. package/dist/use-cases/BuildWorkflowRunActivityHistory.usecase.js.map +1 -0
  128. package/dist/use-cases/CreateWorkflowRun.usecase.d.ts +6 -6
  129. package/dist/use-cases/CreateWorkflowRun.usecase.js +20 -21
  130. package/dist/use-cases/CreateWorkflowRun.usecase.js.map +1 -1
  131. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.d.ts +9 -3
  132. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js +45 -39
  133. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js.map +1 -1
  134. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.d.ts +9 -0
  135. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js +43 -0
  136. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js.map +1 -0
  137. package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.d.ts +9 -0
  138. package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.js +47 -0
  139. package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.js.map +1 -0
  140. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.d.ts +22 -0
  141. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js +117 -0
  142. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js.map +1 -0
  143. package/dist/use-cases/NextTickWorkflowRun.usecase.d.ts +16 -7
  144. package/dist/use-cases/NextTickWorkflowRun.usecase.js +139 -130
  145. package/dist/use-cases/NextTickWorkflowRun.usecase.js.map +1 -1
  146. package/dist/use-cases/RunWorkflow.usecase.d.ts +10 -0
  147. package/dist/use-cases/RunWorkflow.usecase.js +46 -0
  148. package/dist/use-cases/RunWorkflow.usecase.js.map +1 -0
  149. package/dist/use-cases/WorkflowRunActivityFind.usecase.d.ts +34 -0
  150. package/dist/use-cases/WorkflowRunActivityFind.usecase.js +49 -0
  151. package/dist/use-cases/WorkflowRunActivityFind.usecase.js.map +1 -0
  152. package/dist/use-cases/WorkflowRunActivityFindById.usecase.d.ts +34 -0
  153. package/dist/use-cases/WorkflowRunActivityFindById.usecase.js +60 -0
  154. package/dist/use-cases/WorkflowRunActivityFindById.usecase.js.map +1 -0
  155. package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.d.ts +12 -4
  156. package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js +41 -27
  157. package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js.map +1 -1
  158. package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.d.ts +24 -0
  159. package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.js +56 -0
  160. package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.js.map +1 -0
  161. package/dist/use-cases/WorkflowRunFind.usecase.d.ts +17 -0
  162. package/dist/use-cases/WorkflowRunFind.usecase.js +28 -0
  163. package/dist/use-cases/WorkflowRunFind.usecase.js.map +1 -0
  164. package/dist/use-cases/WorkflowRunFindById.usecase.d.ts +19 -0
  165. package/dist/use-cases/WorkflowRunFindById.usecase.js +45 -0
  166. package/dist/use-cases/WorkflowRunFindById.usecase.js.map +1 -0
  167. package/dist/workers/app-process.js +10 -1
  168. package/dist/workers/app-process.js.map +1 -1
  169. package/package.json +15 -5
  170. package/.ai/skills/framework-dev/SKILL.md +0 -348
  171. package/dist/DevServer.d.ts +0 -24
  172. package/dist/DevServer.js +0 -87
  173. package/dist/DevServer.js.map +0 -1
  174. package/dist/models/InMemoryDatabase.d.ts +0 -20
  175. package/dist/models/InMemoryDatabase.js +0 -111
  176. package/dist/models/InMemoryDatabase.js.map +0 -1
  177. package/dist/services/BuildWorkflowRunResult.service.d.ts +0 -8
  178. package/dist/services/BuildWorkflowRunResult.service.js +0 -49
  179. package/dist/services/BuildWorkflowRunResult.service.js.map +0 -1
  180. package/dist/tools/is-workflow-waiting.d.ts +0 -4
  181. package/dist/tools/is-workflow-waiting.js +0 -12
  182. package/dist/tools/is-workflow-waiting.js.map +0 -1
  183. package/dist/transport/DevServerJsonRpc.js +0 -42
  184. package/dist/transport/DevServerJsonRpc.js.map +0 -1
  185. package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.d.ts +0 -14
  186. package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js +0 -64
  187. package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js.map +0 -1
  188. package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.d.ts +0 -8
  189. package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js +0 -40
  190. package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js.map +0 -1
  191. package/dist/use-cases/WorkflowRunAsyncActivity.usecase.d.ts +0 -7
  192. package/dist/use-cases/WorkflowRunAsyncActivity.usecase.js +0 -46
  193. package/dist/use-cases/WorkflowRunAsyncActivity.usecase.js.map +0 -1
  194. package/dist/use-cases/WorkflowRunBuildHistory.usecase.d.ts +0 -8
  195. package/dist/use-cases/WorkflowRunBuildHistory.usecase.js.map +0 -1
  196. package/dist/use-cases/WorkflowRunSyncActivity.usecase.d.ts +0 -4
  197. package/dist/use-cases/WorkflowRunSyncActivity.usecase.js +0 -28
  198. package/dist/use-cases/WorkflowRunSyncActivity.usecase.js.map +0 -1
  199. /package/dist/transport/{DevServerJsonRpc.d.ts → AppProcessJsonRpc.d.ts} +0 -0
package/dist/Server.js ADDED
@@ -0,0 +1,177 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import http from 'node:http';
3
+ import path from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { styleText } from 'node:util';
6
+ import { getRequestListener } from '@hono/node-server';
7
+ import { AppProcess } from './AppProcess.js';
8
+ import { PANEL_CONFIG } from './constants/panel-config.js';
9
+ import { DEFAULT_HOST, DEFAULT_PORT, DEV_ROUTES_PREFIX, PROJECTS_ROUTES_PREFIX, WORKFLOW_RUN_EVENTS, } from './constants/server.js';
10
+ import { createApp } from './http/create-app.js';
11
+ import { WorkflowAuthorizationMissingError } from './models/WorkflowAuthorizationMissingError.js';
12
+ import { findFreePort } from './tools/find-free-port.js';
13
+ import { formatRoutes } from './tools/format-routes.js';
14
+ import { mkdirOutDirProjectFromTsConfigPathAndJsonPackagePath } from './tools/mkdir-out-dir-project-from-ts-config-path-and-json-package-path.js';
15
+ import { resolvePackageJsonPath } from './tools/resolve-package-json-path.js';
16
+ import { resolveTsconfigFromPackageJsonPath } from './tools/resolve-tsconfig-path-from-package-json-path.js';
17
+ import { tsBuildWatch } from './tools/ts-build-watch.js';
18
+ function isApiPath(pathname) {
19
+ return [PROJECTS_ROUTES_PREFIX, DEV_ROUTES_PREFIX].some(prefix => pathname === prefix || pathname.startsWith(`${prefix}/`));
20
+ }
21
+ function notFound(res) {
22
+ res.statusCode = 404;
23
+ res.setHeader('content-type', 'text/plain; charset=utf-8');
24
+ res.end('Not Found');
25
+ }
26
+ export class Server extends EventEmitter {
27
+ options;
28
+ appProcess = new AppProcess();
29
+ logger;
30
+ routes = [];
31
+ tsBuildWatcher = null;
32
+ httpServer = null;
33
+ vite = null;
34
+ currentAddress = null;
35
+ packageJsonPath = null;
36
+ outDir = null;
37
+ constructor(options) {
38
+ super();
39
+ this.options = options;
40
+ this.logger = options.logger === false ? null : (options.logger ?? console);
41
+ this.appProcess.on('exit', code => {
42
+ if (code)
43
+ this.logger?.error(styleText('red', `[server] app exited with code ${code}`, {
44
+ stream: process.stderr,
45
+ }));
46
+ this.emit('app:exit', code);
47
+ });
48
+ for (const event of WORKFLOW_RUN_EVENTS)
49
+ this.appProcess.on(event, payload => this.emit(event, payload));
50
+ }
51
+ get manifest() {
52
+ return this.appProcess.manifest;
53
+ }
54
+ get address() {
55
+ if (!this.currentAddress)
56
+ throw new Error('Server is not listening');
57
+ return this.currentAddress;
58
+ }
59
+ async up() {
60
+ const { entrypoint, port = DEFAULT_PORT, host = DEFAULT_HOST, vite, } = this.options;
61
+ this.packageJsonPath = await resolvePackageJsonPath(entrypoint);
62
+ const tsConfigPath = await resolveTsconfigFromPackageJsonPath(this.packageJsonPath);
63
+ this.outDir = await mkdirOutDirProjectFromTsConfigPathAndJsonPackagePath(tsConfigPath, this.packageJsonPath);
64
+ const projectDir = path.dirname(this.packageJsonPath);
65
+ const app = createApp({
66
+ appProcess: this.appProcess,
67
+ events: this,
68
+ projectDir,
69
+ });
70
+ this.routes = app.routes;
71
+ const listener = getRequestListener(app.fetch);
72
+ const httpServer = http.createServer((req, res) => {
73
+ const pathname = (req.url ?? '/').split('?')[0] ?? '/';
74
+ if (isApiPath(pathname))
75
+ return void listener(req, res);
76
+ if (!this.vite)
77
+ return notFound(res);
78
+ this.vite.middlewares(req, res, () => notFound(res));
79
+ });
80
+ this.httpServer = httpServer;
81
+ if (vite !== false)
82
+ this.vite = await this.createVite(httpServer, projectDir, vite ?? {});
83
+ const freePort = await findFreePort(port, host);
84
+ if (freePort !== port)
85
+ this.logger?.log(`[server] port ${port} is in use, moving to ${freePort}`);
86
+ await new Promise((resolve, reject) => {
87
+ httpServer.once('error', reject);
88
+ httpServer.listen(freePort, host, resolve);
89
+ });
90
+ this.currentAddress = {
91
+ host,
92
+ port: freePort,
93
+ url: `http://${host}:${freePort}`,
94
+ };
95
+ this.logger?.log(`[server] listening on ${this.currentAddress.url}, waiting for the first build…`);
96
+ this.tsBuildWatcher = tsBuildWatch(tsConfigPath, {
97
+ outDir: path.join(this.outDir, 'dist'),
98
+ sourceMap: true,
99
+ declaration: false,
100
+ declarationMap: false,
101
+ }, {
102
+ onSuccess: () => this.onTsBuildSuccess(),
103
+ onFail: diagnostics => {
104
+ this.logger?.error(diagnostics);
105
+ this.emit('build:fail', diagnostics);
106
+ },
107
+ onStatus: status => {
108
+ this.logger?.log(status);
109
+ this.emit('build:status', status);
110
+ },
111
+ });
112
+ return this.currentAddress;
113
+ }
114
+ async down() {
115
+ this.tsBuildWatcher?.close();
116
+ this.tsBuildWatcher = null;
117
+ await this.appProcess.down();
118
+ await this.vite?.close();
119
+ this.vite = null;
120
+ const httpServer = this.httpServer;
121
+ if (httpServer)
122
+ await new Promise((resolve, reject) => {
123
+ httpServer.close(error => (error ? reject(error) : resolve()));
124
+ });
125
+ this.httpServer = null;
126
+ this.currentAddress = null;
127
+ }
128
+ async onTsBuildSuccess() {
129
+ if (!this.packageJsonPath || !this.outDir)
130
+ return;
131
+ const { default: packageJson } = await import(this.packageJsonPath, {
132
+ with: { type: 'json' },
133
+ });
134
+ if (typeof packageJson.main !== 'string')
135
+ throw new Error('Main is not a string');
136
+ const entrypoint = pathToFileURL(path.join(this.outDir, 'dist', packageJson.main)).href;
137
+ let manifest;
138
+ try {
139
+ manifest = await this.appProcess.up(entrypoint, this.options.env);
140
+ }
141
+ catch (error) {
142
+ this.logger?.error(styleText('red', '[server] app failed to start:', {
143
+ stream: process.stderr,
144
+ }), error);
145
+ return;
146
+ }
147
+ for (const workflow of manifest.workflows) {
148
+ if (workflow.authorization || manifest.authorization)
149
+ continue;
150
+ const error = new WorkflowAuthorizationMissingError(String(workflow.id));
151
+ this.logger?.error(styleText('red', `[server] ${error.message}`, {
152
+ stream: process.stderr,
153
+ }));
154
+ this.emit('error', error);
155
+ return;
156
+ }
157
+ this.emit('manifest', manifest);
158
+ if (this.logger && this.currentAddress)
159
+ this.logger.log(formatRoutes({
160
+ baseUrl: this.currentAddress.url,
161
+ manifest,
162
+ routes: this.routes,
163
+ }));
164
+ }
165
+ async createVite(httpServer, projectDir, { root = projectDir, configFile, plugins }) {
166
+ const { createServer } = await import('vite');
167
+ const { default: panel } = await import('@t4h.framework/vite-panel-plugin');
168
+ return createServer({
169
+ root,
170
+ configFile,
171
+ appType: 'custom',
172
+ server: { middlewareMode: true, hmr: { server: httpServer } },
173
+ plugins: [panel({ config: PANEL_CONFIG }), ...(plugins ?? [])],
174
+ });
175
+ }
176
+ }
177
+ //# sourceMappingURL=Server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Server.js","sourceRoot":"","sources":["../src/Server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { PanelConfig } from '@t4h.framework/vite-panel-plugin';
2
+ export declare const PANEL_CONFIG: PanelConfig;
@@ -0,0 +1,34 @@
1
+ import { DEV_ROUTES_PREFIX, PROJECTS_ROUTES_PREFIX } from './server.js';
2
+ export const PANEL_CONFIG = {
3
+ title: 'Framework Panel',
4
+ basePath: '',
5
+ apiUrl: DEV_ROUTES_PREFIX,
6
+ metadata: {},
7
+ fields: {},
8
+ api: {
9
+ manifest: '/manifest',
10
+ state: '/state',
11
+ runs: '/runs',
12
+ run: '/runs/:run',
13
+ runActivities: '/runs/:run/activities',
14
+ runActivity: '/runs/:run/activities/:activity',
15
+ runActivityPendings: '/runs/:run/activities/:activity/pendings',
16
+ runLogs: '/runs/:run/logs',
17
+ waitingActivities: '/activities/waiting',
18
+ runWorkflow: '/workflows/:workflow/runs',
19
+ advanceActivity: '/activities/:activity/advance',
20
+ events: '/events',
21
+ },
22
+ capabilities: { trigger: true, advance: true, events: true, rebuild: true },
23
+ routes: {
24
+ runs: {
25
+ method: 'POST',
26
+ path: `${PROJECTS_ROUTES_PREFIX}/:project/workflows/:workflow/runs`,
27
+ },
28
+ advance: {
29
+ method: 'PATCH',
30
+ path: `${PROJECTS_ROUTES_PREFIX}/:project/workflows/:workflow/runs/:run/activities/:activity`,
31
+ },
32
+ },
33
+ };
34
+ //# sourceMappingURL=panel-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-config.js","sourceRoot":"","sources":["../../src/constants/panel-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEvE,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,KAAK,EAAE,iBAAiB;IACxB,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,iBAAiB;IACzB,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,GAAG,EAAE;QACH,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,YAAY;QACjB,aAAa,EAAE,uBAAuB;QACtC,WAAW,EAAE,iCAAiC;QAC9C,mBAAmB,EAAE,0CAA0C;QAC/D,OAAO,EAAE,iBAAiB;QAC1B,iBAAiB,EAAE,qBAAqB;QACxC,WAAW,EAAE,2BAA2B;QACxC,eAAe,EAAE,+BAA+B;QAChD,MAAM,EAAE,SAAS;KAClB;IACD,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAC3E,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,GAAG,sBAAsB,oCAAoC;SACpE;QACD,OAAO,EAAE;YACP,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,GAAG,sBAAsB,8DAA8D;SAC9F;KACF;CACF,CAAA"}
@@ -0,0 +1,9 @@
1
+ export declare const DEFAULT_PORT = 3000;
2
+ export declare const DEFAULT_HOST = "localhost";
3
+ export declare const JSON_BODY_LIMIT_IN_BYTES: number;
4
+ export declare const APP_READY_TIMEOUT_IN_MS = 30000;
5
+ export declare const APP_KILL_TIMEOUT_IN_MS = 5000;
6
+ export declare const SSE_HEARTBEAT_INTERVAL_IN_MS = 15000;
7
+ export declare const PROJECTS_ROUTES_PREFIX = "/projects";
8
+ export declare const DEV_ROUTES_PREFIX = "/_dev";
9
+ export declare const WORKFLOW_RUN_EVENTS: readonly ["run:created", "run:updated"];
@@ -0,0 +1,10 @@
1
+ export const DEFAULT_PORT = 3000;
2
+ export const DEFAULT_HOST = 'localhost';
3
+ export const JSON_BODY_LIMIT_IN_BYTES = 150 * 1024;
4
+ export const APP_READY_TIMEOUT_IN_MS = 30_000;
5
+ export const APP_KILL_TIMEOUT_IN_MS = 5_000;
6
+ export const SSE_HEARTBEAT_INTERVAL_IN_MS = 15_000;
7
+ export const PROJECTS_ROUTES_PREFIX = '/projects';
8
+ export const DEV_ROUTES_PREFIX = '/_dev';
9
+ export const WORKFLOW_RUN_EVENTS = ['run:created', 'run:updated'];
10
+ //# sourceMappingURL=server.js.map
@@ -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,138 @@
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
+ 'parentRun',
23
+ 'parentActivity',
24
+ ];
25
+ const FIND_QUERY_DATES = ['createdAfter', 'createdBefore'];
26
+ const PAGE_QUERY_INTEGERS = ['limit', 'offset'];
27
+ const MAX_LIMIT = 50;
28
+ function toIntegers(query, names) {
29
+ const result = {};
30
+ for (const name of names) {
31
+ const value = Number.parseInt(query[name] ?? '', 10);
32
+ if (Number.isFinite(value))
33
+ result[name] = value;
34
+ }
35
+ return result;
36
+ }
37
+ function checkPage(page) {
38
+ if (page.limit !== undefined && (page.limit < 1 || page.limit > MAX_LIMIT))
39
+ throw toHttpError(400, `limit must be between 1 and ${MAX_LIMIT}`);
40
+ if (page.offset !== undefined && page.offset < 0)
41
+ throw toHttpError(400, 'offset must be 0 or more');
42
+ }
43
+ function toPageQuery(query) {
44
+ const page = toIntegers(query, PAGE_QUERY_INTEGERS);
45
+ checkPage(page);
46
+ return page;
47
+ }
48
+ function toFindQuery(query) {
49
+ const result = toIntegers(query, PAGE_QUERY_INTEGERS);
50
+ checkPage(result);
51
+ for (const name of FIND_QUERY_STRINGS)
52
+ if (query[name])
53
+ result[name] = query[name];
54
+ for (const name of FIND_QUERY_DATES) {
55
+ const value = query[name];
56
+ if (!value)
57
+ continue;
58
+ if (Number.isNaN(Date.parse(value)))
59
+ throw toHttpError(400, `${name} must be an ISO 8601 date`);
60
+ result[name] = value;
61
+ }
62
+ if (query.rootOnly !== undefined)
63
+ result.rootOnly = query.rootOnly === 'true';
64
+ return result;
65
+ }
66
+ function toAdvancePayload(body) {
67
+ if (body !== undefined &&
68
+ (typeof body !== 'object' || body === null || Array.isArray(body)))
69
+ throw toHttpError(400, 'Body must be an object');
70
+ return body?.payload;
71
+ }
72
+ export function createApp({ appProcess, events, projectDir, }) {
73
+ const app = new Hono();
74
+ app.use(cors());
75
+ app.onError(errorHandler);
76
+ app.notFound(context => context.json({
77
+ statusCode: 404,
78
+ message: `Cannot ${context.req.method} ${context.req.path}`,
79
+ error: 'Not Found',
80
+ }, 404));
81
+ const manifest = projectManifest({ appProcess });
82
+ const authorization = workflowAuthorization({ projectDir });
83
+ app.get('/projects/:projectId/manifest.json', manifest, context => context.json(context.get('manifest')));
84
+ app.post(`${WORKFLOW_PATH}/runs`, readJsonBody, manifest, authorization, async (context) => {
85
+ const { id } = await appProcess.call('workflow.run', context.get('workflowId'), context.get('body'));
86
+ return context.json({ id }, 201);
87
+ });
88
+ app.patch(`${WORKFLOW_PATH}/runs/:runId/activities/:activityId`, readJsonBody, manifest, authorization, async (context) => {
89
+ const payload = toAdvancePayload(context.get('body'));
90
+ const activity = await appProcess.call('workflow.async-activities.advance', context.req.param('activityId'), payload);
91
+ return context.json({
92
+ id: activity.id,
93
+ type: activity.type,
94
+ status: activity.status,
95
+ });
96
+ });
97
+ const dev = new Hono();
98
+ dev.get('/manifest', async (context) => context.json(await appProcess.whenReady()));
99
+ dev.get('/state', context => context.json({ state: appProcess.state }));
100
+ dev.get('/runs', async (context) => context.json(await appProcess.call('workflow.runs.find', toFindQuery(context.req.query()))));
101
+ dev.get('/runs/:id', async (context) => context.json(await appProcess.call('workflow.runs.findById', context.req.param('id'))));
102
+ dev.get('/runs/:id/activities', async (context) => context.json(await appProcess.call('workflow.runs.activities.find', context.req.param('id'), toPageQuery(context.req.query()))));
103
+ 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()))));
104
+ 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'))));
105
+ dev.get('/runs/:id/logs', async (context) => context.json(await appProcess.call('workflow.runs.logs.find', context.req.param('id'), toPageQuery(context.req.query()))));
106
+ dev.get('/activities/waiting', async (context) => context.json(await appProcess.call('workflow.async-activities.waiting.list', toPageQuery(context.req.query()))));
107
+ dev.post('/workflows/:workflowId/runs', readJsonBody, async (context) => {
108
+ const { id } = await appProcess.call('workflow.run', context.req.param('workflowId'), context.get('body'));
109
+ return context.json({ id }, 201);
110
+ });
111
+ dev.post('/activities/:activityId/advance', readJsonBody, async (context) => {
112
+ const payload = toAdvancePayload(context.get('body'));
113
+ const activity = await appProcess.call('workflow.async-activities.advance', context.req.param('activityId'), payload);
114
+ return context.json({
115
+ id: activity.id,
116
+ type: activity.type,
117
+ status: activity.status,
118
+ });
119
+ });
120
+ dev.get('/events', context => streamSSE(context, async (stream) => {
121
+ const send = (event, data) => stream.writeSSE({ event, data: JSON.stringify(data ?? null) });
122
+ const listeners = SERVER_EVENTS.map(event => {
123
+ const listener = (data) => void send(event, data);
124
+ events.on(event, listener);
125
+ return [event, listener];
126
+ });
127
+ const heartbeat = setInterval(() => void stream.writeSSE({ event: 'ping', data: '' }), SSE_HEARTBEAT_INTERVAL_IN_MS).unref();
128
+ if (appProcess.manifest)
129
+ await send('manifest', appProcess.manifest);
130
+ await new Promise(resolve => stream.onAbort(resolve));
131
+ clearInterval(heartbeat);
132
+ for (const [event, listener] of listeners)
133
+ events.off(event, listener);
134
+ }));
135
+ app.route(DEV_ROUTES_PREFIX, dev);
136
+ return app;
137
+ }
138
+ //# 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,2 @@
1
+ import type { ErrorHandler } from 'hono';
2
+ export declare const errorHandler: ErrorHandler;
@@ -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,6 @@
1
+ import type { MiddlewareHandler } from 'hono';
2
+ export type JsonBodyVariables = {
3
+ rawBody: string;
4
+ body: unknown;
5
+ };
6
+ export declare const readJsonBody: MiddlewareHandler;
@@ -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 './DevServer.js';
2
- export * from './claims.js';
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';
3
+ export type { AppManifest, AppProcessState } from './AppProcess.js';