@adonis-agora/durable 0.21.0 → 0.22.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 +54 -0
- package/dist/assets/spa/assets/index-BpH1yTMa.js +81 -0
- package/dist/assets/spa/assets/index-BpH1yTMa.js.map +1 -0
- package/dist/assets/spa/assets/index-CTsYsi6p.css +1 -0
- package/dist/assets/spa/index.html +19 -0
- package/dist/providers/dashboard_provider.d.ts +51 -52
- package/dist/providers/dashboard_provider.d.ts.map +1 -1
- package/dist/providers/dashboard_provider.js +234 -121
- package/dist/providers/dashboard_provider.js.map +1 -1
- package/dist/providers/durable_provider.d.ts.map +1 -1
- package/dist/providers/durable_provider.js +5 -2
- package/dist/providers/durable_provider.js.map +1 -1
- package/dist/src/dashboard/attr-filter.d.ts +8 -0
- package/dist/src/dashboard/attr-filter.d.ts.map +1 -0
- package/dist/src/dashboard/attr-filter.js +35 -0
- package/dist/src/dashboard/attr-filter.js.map +1 -0
- package/dist/src/dashboard/auth.d.ts +55 -10
- package/dist/src/dashboard/auth.d.ts.map +1 -1
- package/dist/src/dashboard/auth.js +50 -11
- package/dist/src/dashboard/auth.js.map +1 -1
- package/dist/src/dashboard/gateway-adapter.d.ts +52 -5
- package/dist/src/dashboard/gateway-adapter.d.ts.map +1 -1
- package/dist/src/dashboard/gateway-adapter.js +48 -6
- package/dist/src/dashboard/gateway-adapter.js.map +1 -1
- package/dist/src/dashboard/handlers.d.ts +56 -8
- package/dist/src/dashboard/handlers.d.ts.map +1 -1
- package/dist/src/dashboard/handlers.js +116 -14
- package/dist/src/dashboard/handlers.js.map +1 -1
- package/dist/src/dashboard/index.d.ts +4 -4
- package/dist/src/dashboard/index.d.ts.map +1 -1
- package/dist/src/dashboard/index.js +3 -3
- package/dist/src/dashboard/index.js.map +1 -1
- package/dist/src/dashboard/spa.d.ts +22 -0
- package/dist/src/dashboard/spa.d.ts.map +1 -0
- package/dist/src/dashboard/spa.js +43 -0
- package/dist/src/dashboard/spa.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/transports/queue-mock-adapter.d.ts +1 -0
- package/dist/src/transports/queue-mock-adapter.d.ts.map +1 -1
- package/dist/src/transports/queue-mock-adapter.js +1 -0
- package/dist/src/transports/queue-mock-adapter.js.map +1 -1
- package/dist/src/workflow-discovery.d.ts +15 -3
- package/dist/src/workflow-discovery.d.ts.map +1 -1
- package/dist/src/workflow-discovery.js +13 -6
- package/dist/src/workflow-discovery.js.map +1 -1
- package/dist/stubs/config/durable_dashboard.stub +19 -0
- package/package.json +18 -17
|
@@ -2,19 +2,26 @@ import { readdir } from 'node:fs/promises';
|
|
|
2
2
|
import { extname, join } from 'node:path';
|
|
3
3
|
import { pathToFileURL } from 'node:url';
|
|
4
4
|
import { workflowMeta, workflowSchedules } from './workflow-ref.js';
|
|
5
|
+
function defaultWorkflowFactory(ctor) {
|
|
6
|
+
return new ctor();
|
|
7
|
+
}
|
|
5
8
|
/**
|
|
6
9
|
* Register a single workflow class on the engine — a `BaseWorkflow` subclass (its `static workflow`
|
|
7
10
|
* config), resolved via {@link workflowMeta}. Instantiates it once and binds its `run(ctx, input)`
|
|
8
11
|
* as the workflow body via `engine.register`. The low-level `engine.register(name, version, fn)`
|
|
9
12
|
* stays the escape hatch — this is the convenience the `app/workflows` convention builds on. No-op
|
|
10
13
|
* (returns `false`) for a non-workflow class (no `static workflow` config).
|
|
14
|
+
*
|
|
15
|
+
* `factory` lets the host resolve the instance via the IoC container (constructor injection); when
|
|
16
|
+
* omitted, the class is instantiated directly with `new Ctor()` (no args). The factory may be async
|
|
17
|
+
* (the Adonis container's `make` resolves async), so this function is async.
|
|
11
18
|
*/
|
|
12
|
-
export function registerWorkflowClass(engine, cls) {
|
|
19
|
+
export async function registerWorkflowClass(engine, cls, factory = defaultWorkflowFactory) {
|
|
13
20
|
const meta = workflowMeta(cls);
|
|
14
21
|
if (!meta)
|
|
15
22
|
return false;
|
|
16
23
|
const Ctor = cls;
|
|
17
|
-
const instance =
|
|
24
|
+
const instance = await factory(Ctor);
|
|
18
25
|
engine.register(meta.name, meta.version, (ctx, input) => Promise.resolve(instance.run(ctx, input)), {
|
|
19
26
|
...(meta.tags ? { tags: meta.tags } : {}),
|
|
20
27
|
...(meta.executionTimeout !== undefined ? { executionTimeout: meta.executionTimeout } : {}),
|
|
@@ -111,10 +118,10 @@ export async function discoverWorkflows(dir) {
|
|
|
111
118
|
* engine. Returns the registered metadata so the caller can log what was wired.
|
|
112
119
|
* Best-effort over a missing directory.
|
|
113
120
|
*/
|
|
114
|
-
export async function registerWorkflowsFromDir(engine, dir) {
|
|
121
|
+
export async function registerWorkflowsFromDir(engine, dir, factory) {
|
|
115
122
|
const discovered = await discoverWorkflows(dir);
|
|
116
123
|
for (const { cls } of discovered)
|
|
117
|
-
registerWorkflowClass(engine, cls);
|
|
124
|
+
await registerWorkflowClass(engine, cls, factory);
|
|
118
125
|
return discovered.map((d) => d.meta);
|
|
119
126
|
}
|
|
120
127
|
/**
|
|
@@ -125,7 +132,7 @@ export async function registerWorkflowsFromDir(engine, dir) {
|
|
|
125
132
|
* re-exported from several modules is safe. Returns the registered metadata so the caller can log
|
|
126
133
|
* what was wired.
|
|
127
134
|
*/
|
|
128
|
-
export async function registerWorkflowsFromBarrel(engine, barrel) {
|
|
135
|
+
export async function registerWorkflowsFromBarrel(engine, barrel, factory) {
|
|
129
136
|
const registered = [];
|
|
130
137
|
const seen = new Set();
|
|
131
138
|
for (const load of Object.values(barrel)) {
|
|
@@ -137,7 +144,7 @@ export async function registerWorkflowsFromBarrel(engine, barrel) {
|
|
|
137
144
|
if (!meta)
|
|
138
145
|
continue;
|
|
139
146
|
seen.add(exported);
|
|
140
|
-
registerWorkflowClass(engine, exported);
|
|
147
|
+
await registerWorkflowClass(engine, exported, factory);
|
|
141
148
|
registered.push(meta);
|
|
142
149
|
}
|
|
143
150
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-discovery.js","sourceRoot":"","sources":["../../src/workflow-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAqB,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-discovery.js","sourceRoot":"","sources":["../../src/workflow-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,9 +9,28 @@ import { defineConfig } from '@adonis-agora/durable/dashboard'
|
|
|
9
9
|
* By default the dashboard is open OUTSIDE production, and in production it
|
|
10
10
|
* requires a bearer token equal to `DURABLE_DASHBOARD_TOKEN` (deny if unset).
|
|
11
11
|
* Replace `authorize` with your own guard (session, role, IP allow-list, …).
|
|
12
|
+
*
|
|
13
|
+
* `dashboardAuth` is an ADDITIVE, optional session gate on top of `authorize` —
|
|
14
|
+
* a signed cookie minted via a built-in login page (Mode B: `login`) and/or a
|
|
15
|
+
* "open the console from your app" endpoint (Mode A: `session`). At least one
|
|
16
|
+
* of the two is required when `dashboardAuth` is set; either or both may be
|
|
17
|
+
* configured. See `docs/observability/dashboard-auth.mdx`.
|
|
12
18
|
*/
|
|
13
19
|
export default defineConfig({
|
|
14
20
|
// enabled: true,
|
|
15
21
|
// path: '/durable',
|
|
16
22
|
// authorize: (ctx) => ctx.auth.user?.isAdmin === true,
|
|
23
|
+
// dashboardAuth: {
|
|
24
|
+
// secret: env.get('DURABLE_DASHBOARD_SECRET'),
|
|
25
|
+
// ttl: '8h',
|
|
26
|
+
// // Mode B — standalone login page.
|
|
27
|
+
// login: async (username, password) => {
|
|
28
|
+
// if (username === 'admin' && password === env.get('DURABLE_DASHBOARD_PASSWORD')) {
|
|
29
|
+
// return { id: 'admin', name: 'Admin' }
|
|
30
|
+
// }
|
|
31
|
+
// return null
|
|
32
|
+
// },
|
|
33
|
+
// // Mode A — mint a session for an already-authenticated host request.
|
|
34
|
+
// // session: async (request) => (request.user?.isAdmin ? { id: request.user.id } : null),
|
|
35
|
+
// },
|
|
17
36
|
})
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adonis-agora/durable",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "Durable cross-app workflows for AdonisJS — deterministic replay engine, AdonisJS binding, ace commands, dashboard, OpenTelemetry, Telescope, testing harness and Redis admission, all in one package. Part of the Agora ecosystem.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
],
|
|
107
107
|
"sideEffects": false,
|
|
108
108
|
"dependencies": {
|
|
109
|
-
"zod": "
|
|
109
|
+
"zod": "3.25.76"
|
|
110
110
|
},
|
|
111
111
|
"peerDependencies": {
|
|
112
112
|
"@adonisjs/assembler": "^8.4.0",
|
|
@@ -151,22 +151,23 @@
|
|
|
151
151
|
},
|
|
152
152
|
"devDependencies": {
|
|
153
153
|
"@adonisjs/assembler": "^8.4.0",
|
|
154
|
-
"@adonisjs/core": "
|
|
155
|
-
"@adonisjs/lucid": "
|
|
156
|
-
"@adonisjs/queue": "
|
|
154
|
+
"@adonisjs/core": "7.4.0",
|
|
155
|
+
"@adonisjs/lucid": "22.4.2",
|
|
156
|
+
"@adonisjs/queue": "0.6.2",
|
|
157
157
|
"@adonisjs/redis": "^9.2.0",
|
|
158
|
-
"@opentelemetry/api": "
|
|
159
|
-
"@opentelemetry/context-async-hooks": "
|
|
160
|
-
"@opentelemetry/sdk-trace-base": "
|
|
161
|
-
"@types/better-sqlite3": "
|
|
162
|
-
"@types/node": "
|
|
163
|
-
"better-sqlite3": "
|
|
164
|
-
"bullmq": "
|
|
158
|
+
"@opentelemetry/api": "1.9.1",
|
|
159
|
+
"@opentelemetry/context-async-hooks": "1.30.1",
|
|
160
|
+
"@opentelemetry/sdk-trace-base": "1.30.1",
|
|
161
|
+
"@types/better-sqlite3": "7.6.13",
|
|
162
|
+
"@types/node": "20.19.43",
|
|
163
|
+
"better-sqlite3": "11.10.0",
|
|
164
|
+
"bullmq": "5.81.3",
|
|
165
165
|
"cron-parser": "^4.9.0",
|
|
166
|
-
"ioredis": "
|
|
167
|
-
"typescript": "
|
|
168
|
-
"vitest": "
|
|
169
|
-
"zod": "
|
|
166
|
+
"ioredis": "5.11.1",
|
|
167
|
+
"typescript": "5.9.3",
|
|
168
|
+
"vitest": "3.2.7",
|
|
169
|
+
"zod": "3.25.76",
|
|
170
|
+
"@adonis-agora/durable-dashboard": "0.2.0"
|
|
170
171
|
},
|
|
171
172
|
"engines": {
|
|
172
173
|
"node": ">=20.6.0 <23"
|
|
@@ -188,7 +189,7 @@
|
|
|
188
189
|
"build": "pnpm run clean && tsc -p tsconfig.build.json && pnpm run copy:stubs && pnpm run check:dist",
|
|
189
190
|
"check:dist": "node ../../scripts/assert-build-output.mjs dist src/index.js",
|
|
190
191
|
"clean": "rm -rf dist",
|
|
191
|
-
"copy:stubs": "mkdir -p dist/stubs/config dist/stubs/database/migrations dist/stubs/make/workflow dist/assets && cp stubs/config/durable.stub dist/stubs/config/durable.stub && cp stubs/config/durable_dashboard.stub dist/stubs/config/durable_dashboard.stub && cp -r stubs/database/migrations/. dist/stubs/database/migrations/ && cp stubs/make/workflow/main.stub dist/stubs/make/workflow/main.stub && cp assets/dashboard.html dist/assets/dashboard.html",
|
|
192
|
+
"copy:stubs": "mkdir -p dist/stubs/config dist/stubs/database/migrations dist/stubs/make/workflow dist/assets && cp stubs/config/durable.stub dist/stubs/config/durable.stub && cp stubs/config/durable_dashboard.stub dist/stubs/config/durable_dashboard.stub && cp -r stubs/database/migrations/. dist/stubs/database/migrations/ && cp stubs/make/workflow/main.stub dist/stubs/make/workflow/main.stub && cp assets/dashboard.html dist/assets/dashboard.html && rm -rf dist/assets/spa && cp -r ../dashboard/dist/spa dist/assets/spa",
|
|
192
193
|
"test": "vitest run --passWithNoTests",
|
|
193
194
|
"test:watch": "vitest",
|
|
194
195
|
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.tests.json"
|