@forestadmin/workflow-executor 1.8.0 → 1.9.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/README.md +57 -10
- package/dist/cli-core.js +7 -5
- package/dist/tracing.d.ts +1 -0
- package/dist/tracing.js +41 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -8,33 +8,53 @@ client data ever leaves your infrastructure.
|
|
|
8
8
|
|
|
9
9
|
## Prerequisites
|
|
10
10
|
|
|
11
|
-
Make sure you are on the latest version of your Forest Admin agent (Node.js/JS or Ruby), then
|
|
11
|
+
Make sure you are on the latest version of your Forest Admin agent (Node.js/JS or Ruby), then point your agent at the executor with `workflowExecutorUrl`:
|
|
12
12
|
|
|
13
13
|
```js
|
|
14
14
|
createAgent({
|
|
15
15
|
// ...
|
|
16
|
-
workflowExecutorUrl:
|
|
16
|
+
workflowExecutorUrl: process.env.WORKFLOW_EXECUTOR_URL, // e.g. http://localhost:3400
|
|
17
17
|
})
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
+
This is **required** for the executor to work: when `workflowExecutorUrl` is set, the agent mounts the route that forwards workflow requests to the executor (and relays the JWT for auth). If it is left unset, the agent returns `404` on those routes and the executor never receives any work.
|
|
21
|
+
|
|
22
|
+
Drive it from an environment variable (`WORKFLOW_EXECUTOR_URL` above) so each deployment can target its own executor. The URL is where the agent reaches the executor — its HTTP server (default port `3400`). When the agent and executor run on separate hosts behind a private network (e.g. an internal load balancer), use the executor's internal address, and make sure the agent can reach the executor's HTTP port.
|
|
23
|
+
|
|
20
24
|
---
|
|
21
25
|
|
|
22
|
-
##
|
|
26
|
+
## Docker (recommended)
|
|
27
|
+
|
|
28
|
+
### Quick start
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
cp .env.example .env # fill in your secrets
|
|
32
|
+
docker compose up
|
|
33
|
+
```
|
|
23
34
|
|
|
24
|
-
|
|
35
|
+
The `docker-compose.yml` at the root of this package starts a single executor instance. See `.env.example` for the full list of environment variables and their descriptions.
|
|
25
36
|
|
|
26
|
-
|
|
37
|
+
### Run directly
|
|
27
38
|
|
|
28
39
|
```bash
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
40
|
+
docker run -d \
|
|
41
|
+
-e FOREST_ENV_SECRET="your-env-secret" \
|
|
42
|
+
-e FOREST_AUTH_SECRET="your-auth-secret" \
|
|
43
|
+
-e AGENT_URL="http://host.docker.internal:3351" \
|
|
44
|
+
-e DATABASE_URL="postgres://user:pass@host.docker.internal:5432/mydb" \
|
|
45
|
+
-p 3400:3400 \
|
|
46
|
+
ghcr.io/forestadmin/workflow-executor:latest
|
|
33
47
|
```
|
|
34
48
|
|
|
49
|
+
> **Note:** When the executor runs in Docker and your agent runs on the host machine, use `host.docker.internal` instead of `localhost` in `AGENT_URL` and `DATABASE_URL`.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Without Docker
|
|
54
|
+
|
|
35
55
|
### With a database
|
|
36
56
|
|
|
37
|
-
|
|
57
|
+
Requires Node.js ≥ 22.12.0 and a Postgres database:
|
|
38
58
|
|
|
39
59
|
```bash
|
|
40
60
|
FOREST_ENV_SECRET="your-env-secret" \
|
|
@@ -49,3 +69,30 @@ npx @forestadmin/workflow-executor
|
|
|
49
69
|
Both values are already in your agent's environment variables. `FOREST_ENV_SECRET` can also be found in [app.forestadmin.com](https://app.forestadmin.com) → **Settings** → **Environments** → click your environment. `FOREST_AUTH_SECRET` is defined on your side only and is not available in the Forest Admin UI.
|
|
50
70
|
|
|
51
71
|
`AGENT_URL` is the URL where your Forest Admin agent is running (e.g. `http://localhost:3351`).
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Testing only
|
|
76
|
+
|
|
77
|
+
The following modes skip the database requirement but are **not suitable for production** — state is lost on restart.
|
|
78
|
+
|
|
79
|
+
### Docker
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
docker run --rm \
|
|
83
|
+
-e FOREST_ENV_SECRET="your-env-secret" \
|
|
84
|
+
-e FOREST_AUTH_SECRET="your-auth-secret" \
|
|
85
|
+
-e AGENT_URL="http://host.docker.internal:3351" \
|
|
86
|
+
-p 3400:3400 \
|
|
87
|
+
ghcr.io/forestadmin/workflow-executor:latest \
|
|
88
|
+
node packages/workflow-executor/dist/cli.js --in-memory --json
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Without Docker
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
FOREST_ENV_SECRET="your-env-secret" \
|
|
95
|
+
FOREST_AUTH_SECRET="your-auth-secret" \
|
|
96
|
+
AGENT_URL="https://your-agent-url" \
|
|
97
|
+
npx @forestadmin/workflow-executor --in-memory
|
|
98
|
+
```
|
package/dist/cli-core.js
CHANGED
|
@@ -39,9 +39,9 @@ function parseLoggerLevelEnv(raw) {
|
|
|
39
39
|
}
|
|
40
40
|
const TRUTHY = ['true', '1', 'yes', 'on'];
|
|
41
41
|
const FALSY = ['false', '0', 'no', 'off'];
|
|
42
|
-
function parseBooleanEnv(name, raw) {
|
|
42
|
+
function parseBooleanEnv(name, raw, defaultValue = false) {
|
|
43
43
|
if (!raw)
|
|
44
|
-
return
|
|
44
|
+
return defaultValue;
|
|
45
45
|
const value = raw.trim().toLowerCase();
|
|
46
46
|
if (TRUTHY.includes(value))
|
|
47
47
|
return true;
|
|
@@ -145,7 +145,9 @@ function readEnvConfig(env, args) {
|
|
|
145
145
|
return {
|
|
146
146
|
executorOptions,
|
|
147
147
|
databaseUrl: env.DATABASE_URL,
|
|
148
|
-
|
|
148
|
+
// Defaults to true: managed Postgres (RDS, Supabase, Railway…) requires TLS.
|
|
149
|
+
// Set DATABASE_SSL=false for a local/dev database without TLS.
|
|
150
|
+
databaseSsl: parseBooleanEnv('DATABASE_SSL', env.DATABASE_SSL, true),
|
|
149
151
|
mode: args.inMemory ? 'in-memory' : 'database',
|
|
150
152
|
};
|
|
151
153
|
}
|
|
@@ -168,7 +170,7 @@ Required environment variables:
|
|
|
168
170
|
DATABASE_URL Postgres connection string (not needed with --in-memory)
|
|
169
171
|
|
|
170
172
|
Optional environment variables:
|
|
171
|
-
DATABASE_SSL
|
|
173
|
+
DATABASE_SSL Connect to the database over TLS (default: true; set "false" for a local DB without TLS)
|
|
172
174
|
HTTP_PORT Default: ${defaults_1.DEFAULT_HTTP_PORT}
|
|
173
175
|
FOREST_SERVER_URL Default: ${defaults_1.DEFAULT_FOREST_SERVER_URL}
|
|
174
176
|
POLLING_INTERVAL_S Default: ${defaults_1.DEFAULT_POLLING_INTERVAL_S}
|
|
@@ -259,4 +261,4 @@ async function runCli(argv, env, factories) {
|
|
|
259
261
|
throw error;
|
|
260
262
|
}
|
|
261
263
|
}
|
|
262
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWNvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtCQUErQjs7Ozs7QUErRi9CLDhCQWtDQztBQUlELGdDQVNDO0FBNkJELHNDQTBDQztBQUVELDhCQXVDQztBQUVELG9DQUVDO0FBRUQsZ0NBc0JDO0FBRUQsd0JBdURDO0FBOVVELDZCQUF3QjtBQUV4QiwrRUFBNEQ7QUFDNUQsNkVBQTBEO0FBTTFELHlDQVVvQjtBQUNwQixxQ0FBbUU7QUFFbkUsTUFBTSxZQUFZLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN4RCxNQUFNLG1CQUFtQixHQUFHLE9BQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBRXZFLFNBQVMsbUJBQW1CLENBQUMsSUFBWSxFQUFFLEdBQXVCO0lBQ2hFLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFM0IsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUzQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSwyQkFBa0IsQ0FBQyxHQUFHLElBQUkscUNBQXFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztBQUNyQixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxHQUF1QjtJQUNsRCxJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRTNCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFD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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=tracing.d.ts.map
|
package/dist/tracing.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Loaded via --require before cli.js to ensure instrumentation patches run first.
|
|
2
|
+
// Initialises the OpenTelemetry SDK only when OTEL_EXPORTER_OTLP_ENDPOINT is set.
|
|
3
|
+
// All configuration is handled via standard OTel environment variables:
|
|
4
|
+
// OTEL_EXPORTER_OTLP_ENDPOINT OTLP receiver (e.g. http://localhost:4318)
|
|
5
|
+
// OTEL_SERVICE_NAME default: forestadmin-workflow-executor
|
|
6
|
+
// OTEL_SDK_DISABLED set to "true" to force-disable
|
|
7
|
+
// OTEL_RESOURCE_ATTRIBUTES e.g. deployment.environment=production,version=1.7.0
|
|
8
|
+
//
|
|
9
|
+
// The OTel packages are installed only into the Docker image's isolated deps
|
|
10
|
+
// (see packages/workflow-executor/docker/), never shipped to npm consumers of
|
|
11
|
+
// the CLI — hence the dynamic require guarded by a try/catch.
|
|
12
|
+
if (process.env.OTEL_EXPORTER_OTLP_ENDPOINT && process.env.OTEL_SDK_DISABLED !== 'true') {
|
|
13
|
+
try {
|
|
14
|
+
/* eslint-disable global-require, @typescript-eslint/no-var-requires, import/no-extraneous-dependencies */
|
|
15
|
+
const { NodeSDK } = require('@opentelemetry/sdk-node');
|
|
16
|
+
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
|
|
17
|
+
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
|
|
18
|
+
/* eslint-enable global-require, @typescript-eslint/no-var-requires, import/no-extraneous-dependencies */
|
|
19
|
+
const sdk = new NodeSDK({
|
|
20
|
+
serviceName: process.env.OTEL_SERVICE_NAME || 'forestadmin-workflow-executor',
|
|
21
|
+
traceExporter: new OTLPTraceExporter(),
|
|
22
|
+
instrumentations: [getNodeAutoInstrumentations()],
|
|
23
|
+
});
|
|
24
|
+
sdk.start();
|
|
25
|
+
// Flush buffered spans on graceful shutdown. We must NOT call process.exit
|
|
26
|
+
// here: the executor's own SIGTERM/SIGINT handler drains in-flight steps
|
|
27
|
+
// (up to stopTimeoutMs) and owns the exit. We only flush in parallel — once
|
|
28
|
+
// the SDK shutdown and the drain both settle, the event loop empties and the
|
|
29
|
+
// process exits naturally (the executor keeps its own force-exit safety net).
|
|
30
|
+
const flush = () => {
|
|
31
|
+
void sdk.shutdown();
|
|
32
|
+
};
|
|
33
|
+
process.once('SIGTERM', flush);
|
|
34
|
+
process.once('SIGINT', flush);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// eslint-disable-next-line no-console
|
|
38
|
+
console.warn('[tracing] OpenTelemetry packages not available, skipping APM initialisation');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90cmFjaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtGQUFrRjtBQUNsRixrRkFBa0Y7QUFDbEYsd0VBQXdFO0FBQ3hFLDZFQUE2RTtBQUM3RSwwRUFBMEU7QUFDMUUsa0VBQWtFO0FBQ2xFLHdGQUF3RjtBQUN4RixFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSw4REFBOEQ7QUFDOUQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEtBQUssTUFBTSxFQUFFLENBQUM7SUFDeEYsSUFBSSxDQUFDO1FBQ0gsMEdBQTBHO1FBQzFHLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN2RCxNQUFNLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxPQUFPLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUM3RixNQUFNLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxPQUFPLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUNqRix5R0FBeUc7UUFFekcsTUFBTSxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUM7WUFDdEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksK0JBQStCO1lBQzdFLGFBQWEsRUFBRSxJQUFJLGlCQUFpQixFQUFFO1lBQ3RDLGdCQUFnQixFQUFFLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztTQUNsRCxDQUFDLENBQUM7UUFFSCxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFWiwyRUFBMkU7UUFDM0UseUVBQXlFO1FBQ3pFLDRFQUE0RTtRQUM1RSw2RUFBNkU7UUFDN0UsOEVBQThFO1FBQzlFLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRTtZQUNqQixLQUFLLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUM7UUFFRixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asc0NBQXNDO1FBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkVBQTZFLENBQUMsQ0FBQztJQUM5RixDQUFDO0FBQ0gsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/workflow-executor",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"bin": {
|
|
6
6
|
"forest-workflow-executor": "dist/cli.js"
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"jsonwebtoken": "^9.0.3",
|
|
38
38
|
"koa": "^3.0.1",
|
|
39
39
|
"koa-jwt": "^4.0.4",
|
|
40
|
+
"pg": "^8.8.0",
|
|
40
41
|
"picocolors": "^1.1.1",
|
|
41
42
|
"sequelize": "^6.37.8",
|
|
42
43
|
"umzug": "^3.8.2",
|
|
@@ -47,7 +48,6 @@
|
|
|
47
48
|
"@types/koa": "^2.13.5",
|
|
48
49
|
"@types/koa__router": "^12.0.4",
|
|
49
50
|
"@types/sequelize": "^6.12.0",
|
|
50
|
-
"pg": "^8.8.0",
|
|
51
51
|
"sqlite3": "^6.0.1",
|
|
52
52
|
"supertest": "^7.1.3"
|
|
53
53
|
}
|