@chidchanun/bcp 0.2.9 → 0.2.11
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 +196 -129
- package/docs/README.md +49 -43
- package/docs/api-manifest.json +15 -2
- package/docs/api-reference.md +113 -8
- package/docs/docs-web-manifest.json +7 -3
- package/docs/durable-jobs.md +359 -0
- package/docs/platform-manifest.json +26 -4
- package/docs/releases/0.2.10.md +148 -0
- package/docs/releases/0.2.11.md +180 -0
- package/docs/workflow-orchestration.md +374 -0
- package/package.json +6 -1
- package/packages/bundler/src/client-boundary.ts +1 -0
- package/packages/client/src/jobs.mjs +1310 -61
- package/packages/client/src/jobs.ts +17 -0
- package/packages/client/src/workflow.mjs +601 -0
- package/packages/client/src/workflow.ts +23 -0
- package/packages/server/src/jobs-redis.ts +1226 -0
- package/packages/server/src/jobs.ts +768 -128
- package/packages/server/src/workflow.ts +887 -0
package/README.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# BCP Framework
|
|
2
2
|
|
|
3
|
-
BCP Framework is a React full-stack framework for file-based routing, SSR, SPA navigation, server data loading, guarded application flows, API routes, authentication, authorization, database access, background jobs, recurring scheduling, observability, validation, uploads, storage and standalone Node.js production deployment.
|
|
3
|
+
BCP Framework is a React full-stack framework for file-based routing, SSR, SPA navigation, server data loading, guarded application flows, API routes, authentication, authorization, database access, background jobs, recurring scheduling, workflow orchestration, observability, validation, uploads, storage and standalone Node.js production deployment.
|
|
4
4
|
|
|
5
|
-
> **Development target:** `0.2.
|
|
5
|
+
> **Development target:** `0.2.11 — Workflow Orchestration`
|
|
6
6
|
>
|
|
7
|
-
> `0.2.
|
|
7
|
+
> `0.2.11` is an unreleased development target until local validation, RC checks, tagging and npm publication complete.
|
|
8
8
|
|
|
9
9
|
## 0.2 platform
|
|
10
10
|
|
|
11
|
-
`0.2.0` established the Framework Platform baseline, `0.2.1` added the Documentation Platform, `0.2.2` added Configuration & Environment v2, `0.2.3` added Database Platform v2, `0.2.4` added Application Packaging, `0.2.5` added Authentication Platform v2, `0.2.6` added Authorization & Security v2, `0.2.7` added Observability Platform v2, `0.2.8` added Background Jobs Platform,
|
|
11
|
+
`0.2.0` established the Framework Platform baseline, `0.2.1` added the Documentation Platform, `0.2.2` added Configuration & Environment v2, `0.2.3` added Database Platform v2, `0.2.4` added Application Packaging, `0.2.5` added Authentication Platform v2, `0.2.6` added Authorization & Security v2, `0.2.7` added Observability Platform v2, `0.2.8` added Background Jobs Platform, `0.2.9` added recurring scheduling, `0.2.10` added durable worker leases/DLQ/Redis adapters, and `0.2.11` adds persistent multi-step workflow orchestration.
|
|
12
12
|
|
|
13
13
|
Machine-readable platform contracts:
|
|
14
14
|
|
|
@@ -35,8 +35,10 @@ docs/api-manifest.json
|
|
|
35
35
|
| Authorization | Auth/guest/role/permission route guards, flat permissions and resource-aware policies |
|
|
36
36
|
| Request security | Same-origin validation and signed CSRF tokens for unsafe mutations |
|
|
37
37
|
| Middleware | Middleware System v2 with onion execution |
|
|
38
|
-
| Background jobs |
|
|
38
|
+
| Background jobs | Delayed jobs, retries/backoff, cancellation, concurrent workers, visibility leases, heartbeat, stale recovery and DLQ |
|
|
39
39
|
| Scheduling | Recurring interval jobs, UTC cron, schedule-store leases and deterministic scheduled run IDs |
|
|
40
|
+
| Durable jobs | Redis-compatible queue/schedule adapters, retention cleanup, requeue and queue statistics |
|
|
41
|
+
| Workflows | Sequential/parallel steps, retries, persisted delays, compensation, run leases and optional queue-backed execution |
|
|
40
42
|
| Observability | Structured logs, counters/gauges/histograms, Prometheus output, request metrics and health/readiness checks |
|
|
41
43
|
| Validation | Typed validators and structured validation errors |
|
|
42
44
|
| Error handling | HTTP error helpers and consistent error responses |
|
|
@@ -131,8 +133,6 @@ Read more:
|
|
|
131
133
|
|
|
132
134
|
## Database Platform v2 — 0.2.3
|
|
133
135
|
|
|
134
|
-
Application code uses one server-only database entrypoint across supported SQL providers:
|
|
135
|
-
|
|
136
136
|
```ts
|
|
137
137
|
import {
|
|
138
138
|
db,
|
|
@@ -148,16 +148,6 @@ postgresql
|
|
|
148
148
|
sqlite
|
|
149
149
|
```
|
|
150
150
|
|
|
151
|
-
Lifecycle control:
|
|
152
|
-
|
|
153
|
-
```ts
|
|
154
|
-
await db.connect();
|
|
155
|
-
|
|
156
|
-
// application work
|
|
157
|
-
|
|
158
|
-
await db.disconnect();
|
|
159
|
-
```
|
|
160
|
-
|
|
161
151
|
Migration CLI:
|
|
162
152
|
|
|
163
153
|
```bash
|
|
@@ -180,23 +170,10 @@ Create a fresh production build and deployment package:
|
|
|
180
170
|
bcp package
|
|
181
171
|
```
|
|
182
172
|
|
|
183
|
-
Output:
|
|
173
|
+
Output is written under:
|
|
184
174
|
|
|
185
175
|
```text
|
|
186
176
|
.bcp-framework/package/
|
|
187
|
-
├─ client/
|
|
188
|
-
├─ server/
|
|
189
|
-
│ └─ server.mjs
|
|
190
|
-
├─ public/ # when present
|
|
191
|
-
├─ manifest.json
|
|
192
|
-
├─ package.json
|
|
193
|
-
├─ package-lock.json # when a safe npm v3 production lock can be derived
|
|
194
|
-
├─ bcp.package.json
|
|
195
|
-
├─ bcp.deployment.json
|
|
196
|
-
├─ bcp.env.json
|
|
197
|
-
├─ Dockerfile
|
|
198
|
-
├─ .dockerignore
|
|
199
|
-
└─ README.md
|
|
200
177
|
```
|
|
201
178
|
|
|
202
179
|
Read more:
|
|
@@ -206,35 +183,17 @@ Read more:
|
|
|
206
183
|
|
|
207
184
|
## Authentication Platform v2 — 0.2.5
|
|
208
185
|
|
|
209
|
-
Stateless signed JWT-cookie authentication remains supported:
|
|
210
|
-
|
|
211
186
|
```ts
|
|
212
187
|
import {
|
|
213
188
|
auth,
|
|
214
|
-
login,
|
|
215
|
-
logout,
|
|
216
|
-
} from "bcp/auth";
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
Applications that need centralized revocation can add a server-side session store:
|
|
220
|
-
|
|
221
|
-
```ts
|
|
222
|
-
import {
|
|
223
189
|
createAuth,
|
|
224
190
|
createMemoryAuthSessionStore,
|
|
191
|
+
login,
|
|
192
|
+
logout,
|
|
225
193
|
} from "bcp/auth";
|
|
226
|
-
|
|
227
|
-
const sessionStore =
|
|
228
|
-
createMemoryAuthSessionStore();
|
|
229
|
-
|
|
230
|
-
export const appAuth =
|
|
231
|
-
createAuth({
|
|
232
|
-
store: sessionStore,
|
|
233
|
-
idleTimeout: 60 * 30,
|
|
234
|
-
});
|
|
235
194
|
```
|
|
236
195
|
|
|
237
|
-
|
|
196
|
+
Stateless signed JWT-cookie authentication remains supported. Applications that need centralized revocation can configure an `AuthSessionStore`.
|
|
238
197
|
|
|
239
198
|
Read more:
|
|
240
199
|
|
|
@@ -244,37 +203,12 @@ Read more:
|
|
|
244
203
|
|
|
245
204
|
## Authorization & Security v2 — 0.2.6
|
|
246
205
|
|
|
247
|
-
Use flat permissions directly from `bcp/auth`:
|
|
248
|
-
|
|
249
206
|
```ts
|
|
250
207
|
import {
|
|
208
|
+
authorize,
|
|
251
209
|
hasPermission,
|
|
252
210
|
requirePermission,
|
|
253
211
|
} from "bcp/auth";
|
|
254
|
-
|
|
255
|
-
hasPermission(
|
|
256
|
-
user,
|
|
257
|
-
"users.read"
|
|
258
|
-
);
|
|
259
|
-
|
|
260
|
-
await requirePermission(
|
|
261
|
-
[
|
|
262
|
-
"users.read",
|
|
263
|
-
"users.write",
|
|
264
|
-
],
|
|
265
|
-
{
|
|
266
|
-
match: "all",
|
|
267
|
-
}
|
|
268
|
-
);
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
Resource-aware policies:
|
|
272
|
-
|
|
273
|
-
```ts
|
|
274
|
-
import {
|
|
275
|
-
authorize,
|
|
276
|
-
defineAuthorizationPolicy,
|
|
277
|
-
} from "bcp/auth";
|
|
278
212
|
```
|
|
279
213
|
|
|
280
214
|
Request-security helpers are exposed from `bcp/server`:
|
|
@@ -303,8 +237,6 @@ Read more: [Observability Platform v2](docs/observability.md)
|
|
|
303
237
|
|
|
304
238
|
## Background Jobs Platform — 0.2.8
|
|
305
239
|
|
|
306
|
-
Create a server-side queue:
|
|
307
|
-
|
|
308
240
|
```ts
|
|
309
241
|
import {
|
|
310
242
|
createJobQueue,
|
|
@@ -314,7 +246,7 @@ export const jobs =
|
|
|
314
246
|
createJobQueue();
|
|
315
247
|
```
|
|
316
248
|
|
|
317
|
-
Register
|
|
249
|
+
Register work:
|
|
318
250
|
|
|
319
251
|
```ts
|
|
320
252
|
jobs.register<{
|
|
@@ -329,7 +261,7 @@ jobs.register<{
|
|
|
329
261
|
);
|
|
330
262
|
```
|
|
331
263
|
|
|
332
|
-
Enqueue
|
|
264
|
+
Enqueue work:
|
|
333
265
|
|
|
334
266
|
```ts
|
|
335
267
|
await jobs.enqueue(
|
|
@@ -344,24 +276,10 @@ await jobs.enqueue(
|
|
|
344
276
|
);
|
|
345
277
|
```
|
|
346
278
|
|
|
347
|
-
Start concurrent workers:
|
|
348
|
-
|
|
349
|
-
```ts
|
|
350
|
-
const worker =
|
|
351
|
-
jobs.startWorker({
|
|
352
|
-
concurrency: 4,
|
|
353
|
-
pollIntervalMs: 250,
|
|
354
|
-
});
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
The default memory adapter is process-local. Durable multi-process deployments should implement `JobQueueAdapter` against shared infrastructure.
|
|
358
|
-
|
|
359
279
|
Read more: [Background Jobs Platform](docs/background-jobs.md)
|
|
360
280
|
|
|
361
281
|
## Job Scheduling Platform — 0.2.9
|
|
362
282
|
|
|
363
|
-
Create a scheduler on top of the same queue:
|
|
364
|
-
|
|
365
283
|
```ts
|
|
366
284
|
import {
|
|
367
285
|
createJobScheduler,
|
|
@@ -398,29 +316,179 @@ await scheduler.schedule(
|
|
|
398
316
|
);
|
|
399
317
|
```
|
|
400
318
|
|
|
401
|
-
|
|
319
|
+
Read more: [Job Scheduling Platform](docs/job-scheduling.md)
|
|
402
320
|
|
|
403
|
-
|
|
404
|
-
|
|
321
|
+
## Durable Jobs Platform — 0.2.10
|
|
322
|
+
|
|
323
|
+
Workers support visibility leases, heartbeat renewal and stale-running recovery when the configured adapter implements those capabilities:
|
|
324
|
+
|
|
325
|
+
```ts
|
|
326
|
+
const worker =
|
|
327
|
+
jobs.startWorker({
|
|
328
|
+
workerId: "email-worker",
|
|
329
|
+
concurrency: 4,
|
|
330
|
+
visibilityTimeoutMs: 30_000,
|
|
331
|
+
heartbeatIntervalMs: 10_000,
|
|
332
|
+
pollIntervalMs: 250,
|
|
333
|
+
});
|
|
405
334
|
```
|
|
406
335
|
|
|
407
|
-
|
|
336
|
+
Retry-exhausted jobs can be inspected and requeued:
|
|
408
337
|
|
|
409
338
|
```ts
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
339
|
+
const failed =
|
|
340
|
+
await jobs.deadLetters();
|
|
341
|
+
|
|
342
|
+
await jobs.requeueDeadLetter(
|
|
343
|
+
failed[0].id,
|
|
344
|
+
{
|
|
345
|
+
delayMs: 5_000,
|
|
346
|
+
resetAttempts: true,
|
|
347
|
+
}
|
|
348
|
+
);
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Redis-compatible durable adapters:
|
|
352
|
+
|
|
353
|
+
```ts
|
|
354
|
+
import {
|
|
355
|
+
createJobQueue,
|
|
356
|
+
createJobScheduler,
|
|
357
|
+
createRedisJobQueueAdapter,
|
|
358
|
+
createRedisJobScheduleStore,
|
|
359
|
+
} from "bcp/jobs";
|
|
360
|
+
|
|
361
|
+
const queueAdapter =
|
|
362
|
+
createRedisJobQueueAdapter({
|
|
363
|
+
client: redisCommandClient,
|
|
364
|
+
namespace: "my-app:{jobs}",
|
|
414
365
|
});
|
|
415
366
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
367
|
+
export const jobs =
|
|
368
|
+
createJobQueue({
|
|
369
|
+
adapter: queueAdapter,
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
const scheduleStore =
|
|
373
|
+
createRedisJobScheduleStore({
|
|
374
|
+
client: redisCommandClient,
|
|
375
|
+
namespace: "my-app:{jobs}",
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
export const scheduler =
|
|
379
|
+
createJobScheduler({
|
|
380
|
+
queue: jobs,
|
|
381
|
+
store: scheduleStore,
|
|
382
|
+
ownerId: "scheduler-a",
|
|
383
|
+
});
|
|
419
384
|
```
|
|
420
385
|
|
|
421
|
-
|
|
386
|
+
BCP does not read `REDIS_URL` or own the Redis client connection lifecycle automatically.
|
|
422
387
|
|
|
423
|
-
Read more: [
|
|
388
|
+
Read more: [Durable Jobs Platform](docs/durable-jobs.md)
|
|
389
|
+
|
|
390
|
+
## Workflow Orchestration — 0.2.11
|
|
391
|
+
|
|
392
|
+
Create a server-only workflow with typed input:
|
|
393
|
+
|
|
394
|
+
```ts
|
|
395
|
+
import {
|
|
396
|
+
createWorkflow,
|
|
397
|
+
} from "bcp/workflow";
|
|
398
|
+
|
|
399
|
+
export const onboarding =
|
|
400
|
+
createWorkflow<{
|
|
401
|
+
userId: number;
|
|
402
|
+
}>(
|
|
403
|
+
"user.onboarding",
|
|
404
|
+
workflow => {
|
|
405
|
+
workflow.step(
|
|
406
|
+
"profile",
|
|
407
|
+
async ({ input }) => {
|
|
408
|
+
await createProfile(
|
|
409
|
+
input.userId
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
);
|
|
413
|
+
|
|
414
|
+
workflow.parallel(
|
|
415
|
+
"initialize",
|
|
416
|
+
parallel => {
|
|
417
|
+
parallel.step(
|
|
418
|
+
"preferences",
|
|
419
|
+
createPreferences
|
|
420
|
+
);
|
|
421
|
+
parallel.step(
|
|
422
|
+
"workspace",
|
|
423
|
+
createWorkspace
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
);
|
|
427
|
+
|
|
428
|
+
workflow.delay(
|
|
429
|
+
"cooldown",
|
|
430
|
+
1_000
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
);
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
Per-step retries:
|
|
437
|
+
|
|
438
|
+
```ts
|
|
439
|
+
workflow.step(
|
|
440
|
+
"charge-card",
|
|
441
|
+
chargeCard,
|
|
442
|
+
{
|
|
443
|
+
maxAttempts: 3,
|
|
444
|
+
retryDelayMs:
|
|
445
|
+
attempt =>
|
|
446
|
+
attempt * 1_000,
|
|
447
|
+
}
|
|
448
|
+
);
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
Saga-style compensation:
|
|
452
|
+
|
|
453
|
+
```ts
|
|
454
|
+
workflow.step(
|
|
455
|
+
"reserve-stock",
|
|
456
|
+
reserveStock,
|
|
457
|
+
{
|
|
458
|
+
compensate:
|
|
459
|
+
releaseStock,
|
|
460
|
+
}
|
|
461
|
+
);
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
A failed run can be compensated in reverse completion order:
|
|
465
|
+
|
|
466
|
+
```ts
|
|
467
|
+
await onboarding.compensate(
|
|
468
|
+
runId
|
|
469
|
+
);
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
For durable execution, supply an existing BCP job queue and a shared workflow store:
|
|
473
|
+
|
|
474
|
+
```ts
|
|
475
|
+
export const fulfillment =
|
|
476
|
+
createWorkflow(
|
|
477
|
+
"order.fulfillment",
|
|
478
|
+
defineWorkflow,
|
|
479
|
+
{
|
|
480
|
+
queue: jobs,
|
|
481
|
+
store:
|
|
482
|
+
workflowStore,
|
|
483
|
+
}
|
|
484
|
+
);
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
With a queue configured, `start()`, `retry()`, `resume()` and delay continuations execute through `bcp/jobs`. `WorkflowStore.claim()` is the atomic run-level concurrency boundary for multi-instance deployments.
|
|
488
|
+
|
|
489
|
+
The built-in `createMemoryWorkflowStore()` is intended for local development and tests. External side effects should remain idempotent because durable job delivery is at-least-once.
|
|
490
|
+
|
|
491
|
+
Read more: [Workflow Orchestration](docs/workflow-orchestration.md)
|
|
424
492
|
|
|
425
493
|
## Public entrypoints
|
|
426
494
|
|
|
@@ -436,6 +504,7 @@ bcp/error
|
|
|
436
504
|
bcp/database
|
|
437
505
|
bcp/auth
|
|
438
506
|
bcp/jobs
|
|
507
|
+
bcp/workflow
|
|
439
508
|
bcp/observability
|
|
440
509
|
bcp/server
|
|
441
510
|
bcp/server-only
|
|
@@ -485,27 +554,25 @@ bcp generate middleware
|
|
|
485
554
|
bcp generate migration create_users
|
|
486
555
|
```
|
|
487
556
|
|
|
488
|
-
##
|
|
557
|
+
## Production model
|
|
489
558
|
|
|
490
559
|
```text
|
|
491
|
-
Browser
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
↓
|
|
499
|
-
React SSR
|
|
500
|
-
↓
|
|
501
|
-
Hydration / SPA navigation
|
|
560
|
+
Browser / API clients
|
|
561
|
+
↓
|
|
562
|
+
security + middleware + auth
|
|
563
|
+
↓
|
|
564
|
+
loaders / actions / API routes
|
|
565
|
+
↓
|
|
566
|
+
SSR / application responses
|
|
502
567
|
|
|
503
568
|
Operational side channels:
|
|
504
|
-
|
|
569
|
+
workflow orchestration
|
|
570
|
+
↓
|
|
571
|
+
shared jobs + scheduler
|
|
572
|
+
↓
|
|
573
|
+
workers + structured logs + metrics + health/readiness
|
|
505
574
|
```
|
|
506
575
|
|
|
507
|
-
## Production build
|
|
508
|
-
|
|
509
576
|
Raw standalone build:
|
|
510
577
|
|
|
511
578
|
```bash
|
|
@@ -519,8 +586,6 @@ Deployment package:
|
|
|
519
586
|
bcp package
|
|
520
587
|
```
|
|
521
588
|
|
|
522
|
-
Both current targets remain Node.js `standalone-node` applications.
|
|
523
|
-
|
|
524
589
|
## Documentation Platform
|
|
525
590
|
|
|
526
591
|
The framework repository is the documentation source of truth.
|
|
@@ -547,7 +612,7 @@ npm run test:e2e
|
|
|
547
612
|
npm run rc:check
|
|
548
613
|
```
|
|
549
614
|
|
|
550
|
-
`0.2.
|
|
615
|
+
`0.2.11` adds Workflow Orchestration unit and prepared-package smoke checks covering sequential/parallel execution, retries, persisted delay/resume behavior, compensation, queue-backed continuation, run leases, browser boundary enforcement and the compiled `bcp/workflow` runtime.
|
|
551
616
|
|
|
552
617
|
Do not tag or publish until the final release commit passes the complete RC sequence.
|
|
553
618
|
|
|
@@ -571,12 +636,14 @@ Do not tag or publish until the final release commit passes the complete RC sequ
|
|
|
571
636
|
| `0.2.7` | Observability Platform v2 |
|
|
572
637
|
| `0.2.8` | Background Jobs Platform |
|
|
573
638
|
| `0.2.9` | Job Scheduling Platform |
|
|
639
|
+
| `0.2.10` | Durable Jobs Platform |
|
|
640
|
+
| `0.2.11` | Workflow Orchestration |
|
|
574
641
|
|
|
575
642
|
## Roadmap
|
|
576
643
|
|
|
577
|
-
`0.2.
|
|
644
|
+
`0.2.11 — Workflow Orchestration` establishes persistent multi-step backend workflows on top of the provider-neutral jobs foundation.
|
|
578
645
|
|
|
579
|
-
|
|
646
|
+
The next logical `0.2.x` milestone is transactional outbox/event delivery so a database change and later asynchronous workflow/job publication can be coordinated without pretending a Redis publish is part of the database transaction. Realtime, testing, plugin/module and broader deployment work remain later roadmap items. Native `.exe`, desktop and mobile compilation remain later roadmap work.
|
|
580
647
|
|
|
581
648
|
## License
|
|
582
649
|
|
package/docs/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
The `docs/` directory is the documentation source of truth for BCP Framework and is organized for **`bcp-docs-web`**.
|
|
4
4
|
|
|
5
|
-
> **Documentation target:** BCP Framework `0.2.
|
|
5
|
+
> **Documentation target:** BCP Framework `0.2.11 — Workflow Orchestration`
|
|
6
6
|
>
|
|
7
7
|
> **Release state:** unreleased development target until RC validation, tagging and npm publication complete.
|
|
8
8
|
|
|
@@ -37,51 +37,55 @@ Framework source and tests remain authoritative for runtime behavior.
|
|
|
37
37
|
| `0.2.7` | Observability Platform v2 |
|
|
38
38
|
| `0.2.8` | Background Jobs Platform |
|
|
39
39
|
| `0.2.9` | Job Scheduling Platform |
|
|
40
|
+
| `0.2.10` | Durable Jobs Platform |
|
|
41
|
+
| `0.2.11` | Workflow Orchestration |
|
|
40
42
|
|
|
41
|
-
## 0.2.
|
|
43
|
+
## 0.2.11 — Workflow Orchestration
|
|
42
44
|
|
|
43
|
-
`0.2.
|
|
45
|
+
`0.2.11` adds a new server-only `bcp/workflow` public entrypoint for persistent multi-step backend orchestration.
|
|
44
46
|
|
|
45
47
|
New/updated documentation sources:
|
|
46
48
|
|
|
47
49
|
| Source | Purpose |
|
|
48
50
|
| --- | --- |
|
|
49
|
-
| `
|
|
50
|
-
| `
|
|
51
|
-
| `api-reference.md` | Public
|
|
52
|
-
| `platform-manifest.json` |
|
|
53
|
-
| `api-manifest.json` | `bcp/
|
|
54
|
-
| `docs-web-manifest.json` |
|
|
55
|
-
| `releases/0.2.
|
|
51
|
+
| `workflow-orchestration.md` | Workflow definition, persistence, delays, retries, queue execution and compensation |
|
|
52
|
+
| `durable-jobs.md` | Durable execution layer used by queue-backed workflows |
|
|
53
|
+
| `api-reference.md` | Public `bcp/workflow` APIs |
|
|
54
|
+
| `platform-manifest.json` | Workflow capability flags and public entrypoint |
|
|
55
|
+
| `api-manifest.json` | `bcp/workflow` source/guide ownership |
|
|
56
|
+
| `docs-web-manifest.json` | Workflow docs navigation and `0.2.11` release route |
|
|
57
|
+
| `releases/0.2.11.md` | Workflow Orchestration release notes |
|
|
56
58
|
|
|
57
|
-
Primary
|
|
59
|
+
Primary APIs:
|
|
58
60
|
|
|
59
61
|
```ts
|
|
60
62
|
import {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
nextScheduleTime,
|
|
65
|
-
} from "bcp/jobs";
|
|
63
|
+
createMemoryWorkflowStore,
|
|
64
|
+
createWorkflow,
|
|
65
|
+
} from "bcp/workflow";
|
|
66
66
|
```
|
|
67
67
|
|
|
68
68
|
Runtime model:
|
|
69
69
|
|
|
70
70
|
```text
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
71
|
+
application / API
|
|
72
|
+
|
|
|
73
|
+
v
|
|
74
|
+
WorkflowStore
|
|
75
|
+
|
|
|
76
|
+
v
|
|
77
|
+
BCP Workflow
|
|
78
|
+
|
|
|
79
|
+
+--> sequential steps
|
|
80
|
+
+--> parallel groups
|
|
81
|
+
+--> retry / delay
|
|
82
|
+
+--> compensation
|
|
83
|
+
|
|
|
84
|
+
v
|
|
85
|
+
optional durable bcp/jobs queue
|
|
82
86
|
```
|
|
83
87
|
|
|
84
|
-
The
|
|
88
|
+
The memory workflow store is local-only. Multi-instance deployments should implement a shared durable `WorkflowStore` whose `claim()` method atomically leases one run to one executor.
|
|
85
89
|
|
|
86
90
|
## Update rule
|
|
87
91
|
|
|
@@ -98,8 +102,6 @@ When framework behavior or public surface changes:
|
|
|
98
102
|
|
|
99
103
|
## Docs-web navigation
|
|
100
104
|
|
|
101
|
-
`docs/docs-web-manifest.json` is the authoritative ordered navigation contract.
|
|
102
|
-
|
|
103
105
|
Important current routes:
|
|
104
106
|
|
|
105
107
|
| Website route | Markdown source |
|
|
@@ -109,10 +111,12 @@ Important current routes:
|
|
|
109
111
|
| `/docs/observability` | `observability.md` |
|
|
110
112
|
| `/docs/background-jobs` | `background-jobs.md` |
|
|
111
113
|
| `/docs/job-scheduling` | `job-scheduling.md` |
|
|
114
|
+
| `/docs/durable-jobs` | `durable-jobs.md` |
|
|
115
|
+
| `/docs/workflow-orchestration` | `workflow-orchestration.md` |
|
|
112
116
|
| `/docs/application-packaging` | `application-packaging.md` |
|
|
113
117
|
| `/docs/database` | `database.md` |
|
|
114
118
|
| `/docs/api-reference` | `api-reference.md` |
|
|
115
|
-
| `/releases/0.2.
|
|
119
|
+
| `/releases/0.2.11` | `releases/0.2.11.md` |
|
|
116
120
|
|
|
117
121
|
Every route/source pair is validated by unit tests.
|
|
118
122
|
|
|
@@ -130,6 +134,7 @@ bcp/error
|
|
|
130
134
|
bcp/database
|
|
131
135
|
bcp/auth
|
|
132
136
|
bcp/jobs
|
|
137
|
+
bcp/workflow
|
|
133
138
|
bcp/observability
|
|
134
139
|
bcp/server
|
|
135
140
|
bcp/server-only
|
|
@@ -140,7 +145,7 @@ The API-manifest entrypoint set must match the platform public-entrypoint set ex
|
|
|
140
145
|
|
|
141
146
|
## Release validation
|
|
142
147
|
|
|
143
|
-
Before publishing `0.2.
|
|
148
|
+
Before publishing `0.2.11`:
|
|
144
149
|
|
|
145
150
|
```bash
|
|
146
151
|
npm run typecheck
|
|
@@ -151,17 +156,18 @@ npm run test:e2e
|
|
|
151
156
|
npm run rc:check
|
|
152
157
|
```
|
|
153
158
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
-
|
|
157
|
-
-
|
|
158
|
-
-
|
|
159
|
-
-
|
|
160
|
-
-
|
|
161
|
-
-
|
|
162
|
-
-
|
|
163
|
-
-
|
|
164
|
-
-
|
|
159
|
+
Workflow Orchestration validation covers:
|
|
160
|
+
|
|
161
|
+
- sequential step execution,
|
|
162
|
+
- step retries,
|
|
163
|
+
- parallel child execution/state,
|
|
164
|
+
- persisted delay/resume behavior,
|
|
165
|
+
- manual retry,
|
|
166
|
+
- reverse-order compensation,
|
|
167
|
+
- queue-backed execution and delayed continuation,
|
|
168
|
+
- workflow store run leases,
|
|
169
|
+
- server-only client boundary enforcement,
|
|
170
|
+
- compiled `workflow.mjs` package execution,
|
|
165
171
|
- docs/platform/API version parity.
|
|
166
172
|
|
|
167
173
|
The final release tag must point to the exact commit that passed the complete RC sequence.
|
package/docs/api-manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"framework": "bcp",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.11",
|
|
5
5
|
"releaseState": "unreleased",
|
|
6
6
|
"coverage": "public-entrypoints",
|
|
7
7
|
"entrypoints": [
|
|
@@ -99,10 +99,23 @@
|
|
|
99
99
|
"source": "packages/client/src/jobs.ts",
|
|
100
100
|
"environment": "server",
|
|
101
101
|
"route": "/docs/api-reference#bcp-jobs",
|
|
102
|
-
"summary": "Background
|
|
102
|
+
"summary": "Background queues and schedules with visibility leases, heartbeats, stale recovery, DLQ maintenance and Redis-compatible durable adapters.",
|
|
103
103
|
"guides": [
|
|
104
104
|
"/docs/background-jobs",
|
|
105
105
|
"/docs/job-scheduling",
|
|
106
|
+
"/docs/durable-jobs",
|
|
107
|
+
"/docs/observability"
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"package": "bcp/workflow",
|
|
112
|
+
"source": "packages/client/src/workflow.ts",
|
|
113
|
+
"environment": "server",
|
|
114
|
+
"route": "/docs/api-reference#bcp-workflow",
|
|
115
|
+
"summary": "Persistent workflow orchestration with sequential and parallel steps, retries, delays, compensation, run leases and optional durable queue execution.",
|
|
116
|
+
"guides": [
|
|
117
|
+
"/docs/workflow-orchestration",
|
|
118
|
+
"/docs/durable-jobs",
|
|
106
119
|
"/docs/observability"
|
|
107
120
|
]
|
|
108
121
|
},
|