@connextar/house 0.11.0 → 0.12.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 +162 -19
- package/dist/jobs/health.d.ts +17 -4
- package/dist/jobs/health.d.ts.map +1 -1
- package/dist/jobs/health.js +10 -7
- package/dist/jobs/health.js.map +1 -1
- package/dist/jobs/index.d.ts +4 -3
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js +3 -2
- package/dist/jobs/index.js.map +1 -1
- package/dist/jobs/job-health-list.d.ts +15 -3
- package/dist/jobs/job-health-list.d.ts.map +1 -1
- package/dist/jobs/job-health-list.js +11 -7
- package/dist/jobs/job-health-list.js.map +1 -1
- package/dist/jobs/prune.d.ts +45 -0
- package/dist/jobs/prune.d.ts.map +1 -0
- package/dist/jobs/prune.js +58 -0
- package/dist/jobs/prune.js.map +1 -0
- package/dist/jobs/registry.d.ts +19 -4
- package/dist/jobs/registry.d.ts.map +1 -1
- package/dist/jobs/registry.js +16 -1
- package/dist/jobs/registry.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +12 -1
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +24 -9
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/jobs/store.d.ts +26 -1
- package/dist/jobs/store.d.ts.map +1 -1
- package/dist/jobs/store.js +35 -4
- package/dist/jobs/store.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -67,7 +67,10 @@ caller's own organisation — and both printed a job's result as its variable
|
|
|
67
67
|
names, so production read "0 chargesRaised · 0 totalOutstanding", with an amount
|
|
68
68
|
of money shown as a number of things. The module is their union, with that
|
|
69
69
|
made impossible rather than fixed: a count reaches the screen only through a
|
|
70
|
-
declaration that says its words and its kind.
|
|
70
|
+
declaration that says its words and its kind. 0.12.0 lets a job offer Run now
|
|
71
|
+
to owners and operators both — Quickie's operators could not re-run a failed
|
|
72
|
+
overnight sweep of a per-organisation job — and prunes the ledger without ever
|
|
73
|
+
deleting a row health is read from.
|
|
71
74
|
|
|
72
75
|
## Modules
|
|
73
76
|
|
|
@@ -763,7 +766,7 @@ got wrong:
|
|
|
763
766
|
| A run in progress | Shown as **Errored** (`ok` is false until it finishes); one cut off stays so, with no reason | The same | Running inside its timeout; past it, Failed — "never finished, probably cut off" |
|
|
764
767
|
| Staleness | Last OK older than `maxAgeMs` (strictly) | The same — and a tenant's Run now reset it for everyone | Last successful _whole_ run older than the threshold; healthy exactly at it |
|
|
765
768
|
| Pause / resume | Per job, who and when, audited; harvest's switch shared with its own screen | None | Per job, who and when; platform authority; audit in the adapter's transaction; tick says it skipped |
|
|
766
|
-
| Run now | `runJobNow` exists but has no caller, and every job is `global`, so it would refuse them all | Owner-only, scoped to the caller's organisation; no cool-down, and `force` skips reminder throttles | `tenant
|
|
769
|
+
| Run now | `runJobNow` exists but has no caller, and every job is `global`, so it would refuse them all | Owner-only, scoped to the caller's organisation; no cool-down, and `force` skips reminder throttles | `tenant`, `platform` or both; refused outside it, while paused, while running, in its cool-down |
|
|
767
770
|
| Jobs on their own clock | Harvest (10 min) and imports (1 min): switchable, but record no runs, so no health | — | `schedule: "own"` + `runOwn`: the switch and the ledger, with or without a window |
|
|
768
771
|
| Errors | Message stored; shown to administrators | Message stored; shown to **every** organisation's owner, whoever's data it came from | Message stored; a tenant viewer sees whether a sweep failed, not its words or its numbers |
|
|
769
772
|
| `CRON_SECRET` | Bearer or `?secret=`; `timingSafeEqual` after a length check | Bearer (prefix optional) or `?secret=`; SHA-256 digests; dev secret refused in production | Bearer required; digests; dev secret refused; `?secret=` only when a route asks |
|
|
@@ -805,9 +808,11 @@ export const jobs = defineJobs([
|
|
|
805
808
|
cadence: "Daily, from 09:00",
|
|
806
809
|
window: daily({ from: 9 }),
|
|
807
810
|
staleAfterMs: 26 * HOUR,
|
|
808
|
-
|
|
811
|
+
// An owner sweeps their own organisation, and nobody else's; an operator re-runs the sweep over all of them.
|
|
812
|
+
// One scope — `{ scope: "tenant" }` — is declared as before.
|
|
813
|
+
runNow: { scope: ["tenant", "platform"] },
|
|
809
814
|
counts: { remindersSent: { label: { one: "reminder sent", other: "reminders sent" } } },
|
|
810
|
-
// `tenantId` is null for the schedule's sweep and always set for an owner's
|
|
815
|
+
// `tenantId` is null for the schedule's sweep and a platform Run now, and always set for an owner's.
|
|
811
816
|
run: async ({ now, tenantId }) => {
|
|
812
817
|
const { remindersSent } = await sendPaymentReminders(now, { organizationId: tenantId ?? undefined });
|
|
813
818
|
return { remindersSent };
|
|
@@ -854,6 +859,7 @@ const outcome = await scheduler.runNow(body.job, {
|
|
|
854
859
|
actor: { id: user.id, name: user.name },
|
|
855
860
|
platform: user.platformAdmin,
|
|
856
861
|
tenantId: user.organizationId,
|
|
862
|
+
scope: body.scope, // the button pressed, on a job that offers both; optional
|
|
857
863
|
});
|
|
858
864
|
if (outcome.status === "refused") return apiError(outcome.message, refusalStatus(outcome.reason));
|
|
859
865
|
if (outcome.status === "failed") return apiError(outcome.message, 500);
|
|
@@ -884,7 +890,8 @@ import { JobHealthList } from "@connextar/house/jobs/react";
|
|
|
884
890
|
onSwitch={async (job, on) => {
|
|
885
891
|
await commitApi("/api/admin/cron", { job, action: on ? "resume" : "pause" });
|
|
886
892
|
}}
|
|
887
|
-
onRunNow={(job) => commitApi("/api/cron/run", { job })}
|
|
893
|
+
onRunNow={(job, scope) => commitApi("/api/cron/run", { job, scope })}
|
|
894
|
+
runNowWords={{ tenant: "your organisation", platform: "every organisation" }}
|
|
888
895
|
onSettled={router.refresh}
|
|
889
896
|
extra={(job) => (job.id === "harvest" ? <Link href={routes.harvest}>What it searches next</Link> : null)}
|
|
890
897
|
/>;
|
|
@@ -897,10 +904,14 @@ refusal puts both back and reports the reason through the
|
|
|
897
904
|
`ActionFeedbackProvider`. No other row is disabled while one saves. Run now is
|
|
898
905
|
`useKeyedAction`: that row's button is busy (`data-busy`), the route's message is
|
|
899
906
|
said, and the screen refreshes whether the run worked or not, since a failure is
|
|
900
|
-
on the ledger too.
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
907
|
+
on the ledger too. A row draws one button per scope the view offers
|
|
908
|
+
(`runNowScopes`) and hands `onRunNow` the one pressed; nearly every viewer holds
|
|
909
|
+
one — an operator the platform run, an owner their own — and sees "Run now". A
|
|
910
|
+
viewer who holds both sees two, "Run for every account" and "Run for your
|
|
911
|
+
account", in the app's words through `runNowWords`. Dates are drawn in
|
|
912
|
+
`timeZone` (default `Europe/London`), never the runtime's own — the server
|
|
913
|
+
draws the list in UTC and the browser again in BST, and two times in one
|
|
914
|
+
element is a hydration error. `classNames` replaces any part's look.
|
|
904
915
|
|
|
905
916
|
The rules it keeps:
|
|
906
917
|
|
|
@@ -933,9 +944,21 @@ The rules it keeps:
|
|
|
933
944
|
needs one; `platform` sweeps everything and needs platform authority. It is
|
|
934
945
|
refused while the job is off, while a run it would overlap is in flight (the
|
|
935
946
|
schedule's sweep covers the caller's tenant too), and within its cool-down
|
|
936
|
-
(default ten minutes, per job and scope
|
|
937
|
-
second press would otherwise send the whole
|
|
938
|
-
job's hour gates; a per-recipient throttle
|
|
947
|
+
(default ten minutes, per job and scope, and per tenant for tenant runs) — a
|
|
948
|
+
manual run sets `force`, so a second press would otherwise send the whole
|
|
949
|
+
batch again. `force` is for a job's hour gates; a per-recipient throttle
|
|
950
|
+
should stay on.
|
|
951
|
+
- **A job may offer both** — `runNow: { scope: ["tenant", "platform"] }` —
|
|
952
|
+
and a single scope is declared as it always was. The caller's `scope` says
|
|
953
|
+
which was pressed; left out, it is the caller's tenant when they have one and
|
|
954
|
+
every tenant when they do not, and it never grants anything `platform` and
|
|
955
|
+
`tenantId` do not. The scopes are fenced from each other: separate
|
|
956
|
+
cool-downs, and neither starts while the other is in flight — a tenant run
|
|
957
|
+
waits for a platform run, and a platform run waits for any tenant's
|
|
958
|
+
(`JobStore.latestUnfinishedRun`, which `createScheduler` requires the moment
|
|
959
|
+
one job offers both). A platform Run now is a run over every tenant, so it
|
|
960
|
+
resets the job's health for everyone, as the schedule's does; a tenant's never
|
|
961
|
+
does. `outcome.scope` says which ran, for the app's audit entry.
|
|
939
962
|
- **A tenant sees their own.** To a tenant viewer, a sweep over every tenant
|
|
940
963
|
shows whether it ran and when, but not its numbers (which are everyone's) or
|
|
941
964
|
its error (which may name another organisation's data). Their own Run now
|
|
@@ -953,7 +976,11 @@ The rules it keeps:
|
|
|
953
976
|
`allowQuery: true`, because an address lands in request logs.
|
|
954
977
|
|
|
955
978
|
**Storage.** The package owns no schema. The app implements `JobStore` — claim,
|
|
956
|
-
finish, latest run, read switches, write a switch
|
|
979
|
+
finish, latest run, read switches, write a switch, and, since 0.12.0, the latest
|
|
980
|
+
unfinished run over any tenant (for a job with both Run now scopes) and pruning
|
|
981
|
+
— over its own tables. The two new methods are optional in the type, so an
|
|
982
|
+
0.11.0 adapter still compiles; `createScheduler` and `pruneJobRuns` say by name
|
|
983
|
+
what is missing when a feature needs one. This is
|
|
957
984
|
the reference model; both apps' existing `cron_run` tables are it minus two
|
|
958
985
|
nullable columns, so every row they hold maps across as it is:
|
|
959
986
|
|
|
@@ -1030,10 +1057,38 @@ export const jobStore: JobStore = {
|
|
|
1030
1057
|
...(ok ? { ok: true } : {}),
|
|
1031
1058
|
...(manualOnly ? { windowKey: { startsWith: "manual:" } } : {}),
|
|
1032
1059
|
},
|
|
1033
|
-
|
|
1060
|
+
// `id` breaks a tie the way `pruneRuns` does, so the row read as latest is the row kept as latest.
|
|
1061
|
+
orderBy: [{ startedAt: "desc" }, { id: "desc" }],
|
|
1034
1062
|
});
|
|
1035
1063
|
return row && { ...row, by: row.triggeredBy };
|
|
1036
1064
|
},
|
|
1065
|
+
// Since 0.12.0 — needed once a job's Run now offers both scopes.
|
|
1066
|
+
async latestUnfinishedRun(job) {
|
|
1067
|
+
const row = await prisma.cronRun.findFirst({
|
|
1068
|
+
where: { job, finishedAt: null }, // any tenant: a platform run must wait for every tenant's
|
|
1069
|
+
orderBy: [{ startedAt: "desc" }, { id: "desc" }],
|
|
1070
|
+
});
|
|
1071
|
+
return row && { ...row, by: row.triggeredBy };
|
|
1072
|
+
},
|
|
1073
|
+
// Since 0.12.0 — `pruneJobRuns` calls it from the housekeeping job. One statement, at most `limit` rows, oldest
|
|
1074
|
+
// first. `PARTITION BY` groups every NULL tenant together, which is exactly "the runs over every tenant".
|
|
1075
|
+
async pruneRuns({ startedBefore, limit }) {
|
|
1076
|
+
return prisma.$executeRaw`
|
|
1077
|
+
DELETE FROM "cron_run" WHERE "id" IN (
|
|
1078
|
+
SELECT "id" FROM (
|
|
1079
|
+
SELECT "id", "ok", "started_at", "finished_at",
|
|
1080
|
+
ROW_NUMBER() OVER (PARTITION BY "job", "tenant_id" ORDER BY "started_at" DESC, "id" DESC) AS "nth",
|
|
1081
|
+
ROW_NUMBER() OVER (PARTITION BY "job", "tenant_id", "ok" ORDER BY "started_at" DESC, "id" DESC) AS "nth_of_kind"
|
|
1082
|
+
FROM "cron_run"
|
|
1083
|
+
) AS "ranked"
|
|
1084
|
+
WHERE "started_at" < ${startedBefore}
|
|
1085
|
+
AND "finished_at" IS NOT NULL -- never a run still under way
|
|
1086
|
+
AND "nth" > 1 -- never the latest run of a job for its tenant
|
|
1087
|
+
AND NOT ("ok" AND "nth_of_kind" = 1) -- nor its latest success
|
|
1088
|
+
ORDER BY "started_at", "id"
|
|
1089
|
+
LIMIT ${limit}
|
|
1090
|
+
)`;
|
|
1091
|
+
},
|
|
1037
1092
|
async readSwitches() {
|
|
1038
1093
|
const rows = await prisma.cronSwitch.findMany();
|
|
1039
1094
|
return new Map(rows.map((r) => [r.job, { paused: r.paused, at: r.switchedAt, by: r.switchedByName }]));
|
|
@@ -1060,11 +1115,49 @@ export const jobStore: JobStore = {
|
|
|
1060
1115
|
};
|
|
1061
1116
|
```
|
|
1062
1117
|
|
|
1063
|
-
`createMemoryJobStore()` is the same contract in memory, unique index
|
|
1064
|
-
for the app's own tests of its binding.
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1118
|
+
`createMemoryJobStore()` is the same contract in memory, unique index and
|
|
1119
|
+
pruning rules included, for the app's own tests of its binding.
|
|
1120
|
+
|
|
1121
|
+
**Pruning the ledger.** Every tick and every own-clock call writes a row —
|
|
1122
|
+
AltEd about 150 a day — and a Run now row keeps the name of whoever pressed it.
|
|
1123
|
+
`pruneJobRuns(store, { now, retentionDays, batchLimit })` deletes the old ones
|
|
1124
|
+
through `JobStore.pruneRuns`, from the app's **own housekeeping job**, and
|
|
1125
|
+
reports what it removed as a declared count:
|
|
1126
|
+
|
|
1127
|
+
```ts
|
|
1128
|
+
import { JOB_RUN_PRUNE_COUNTS, pruneJobRuns } from "@connextar/house/jobs";
|
|
1129
|
+
|
|
1130
|
+
defineJob({
|
|
1131
|
+
id: "rate-limit-prune",
|
|
1132
|
+
label: "Housekeeping",
|
|
1133
|
+
// …
|
|
1134
|
+
counts: { windowsPruned: { label: "…" }, ...JOB_RUN_PRUNE_COUNTS }, // "12 old job runs removed"
|
|
1135
|
+
run: async ({ now }) => ({ windowsPruned: await pruneRateLimits(), ...(await pruneJobRuns(jobStore, { now })) }),
|
|
1136
|
+
});
|
|
1137
|
+
```
|
|
1138
|
+
|
|
1139
|
+
- **Retention** is 90 days by default, in days (at least 1), so a number cannot
|
|
1140
|
+
be read as milliseconds and empty the ledger. A run exactly at the boundary is
|
|
1141
|
+
kept.
|
|
1142
|
+
- **Always kept, however old:** per job, the latest run and the latest
|
|
1143
|
+
successful run — once for the runs over every tenant (the schedule's and
|
|
1144
|
+
platform Run nows), and once for each tenant's own. Health, the Last run and
|
|
1145
|
+
Last success lines and an owner's own view are read from exactly these, so a
|
|
1146
|
+
monthly job that last ran 120 days ago still says so rather than "Never run",
|
|
1147
|
+
and a job whose last run failed still shows when it last worked.
|
|
1148
|
+
- **Never a run still under way** — an unfinished row is never deleted. (A run
|
|
1149
|
+
cut off by the platform stays as the evidence; there are few.)
|
|
1150
|
+
- **Bounded:** at most `batchLimit` rows a call (default 1,000), oldest first, in
|
|
1151
|
+
one statement, so a housekeeping run never holds the table. What is left goes
|
|
1152
|
+
the next day; calling it again straight away deletes only that. A long
|
|
1153
|
+
history is caught up a batch a day — or raise `batchLimit` for the first run.
|
|
1154
|
+
|
|
1155
|
+
Choosing the retention: keep it longer than the longest window (a monthly job's
|
|
1156
|
+
33 days), so the ledger holds a whole period of every job to investigate; and
|
|
1157
|
+
where the privacy policy names a period for operator activity, use that — the
|
|
1158
|
+
`triggered_by` names are why it matters. The rows always kept outlive it, name
|
|
1159
|
+
included; a quiet job's single last run is the price of its health staying
|
|
1160
|
+
true.
|
|
1068
1161
|
|
|
1069
1162
|
**What should not be a scheduled job.**
|
|
1070
1163
|
|
|
@@ -1177,6 +1270,56 @@ older row is history, not state.
|
|
|
1177
1270
|
8. **The guide** (`docs/guides/automation.md`): Errored is now Failed, a run in
|
|
1178
1271
|
progress says Running, and the counts read as words.
|
|
1179
1272
|
|
|
1273
|
+
**Upgrading to 0.12.0 — both Run now scopes, and pruning.** A job declared
|
|
1274
|
+
with one scope behaves exactly as in 0.11.0, and an 0.11.0 adapter compiles
|
|
1275
|
+
unchanged. Each app then adds pruning to its housekeeping, and Quickie makes
|
|
1276
|
+
its per-organisation jobs that are safe to re-sweep dual.
|
|
1277
|
+
|
|
1278
|
+
- **AltEd** — no dual jobs: it is single-tenant, and every job that offers Run
|
|
1279
|
+
now already sweeps everything (`platform`). In `lib/jobs/store.ts` add
|
|
1280
|
+
`pruneRuns` from the adapter above (`latestUnfinishedRun` is not needed
|
|
1281
|
+
until a job offers both), and add `{ id: "desc" }` to `latestRun`'s
|
|
1282
|
+
`orderBy`. In `lib/jobs/index.ts`, Housekeeping (`rate-limit-prune`) takes
|
|
1283
|
+
`...JOB_RUN_PRUNE_COUNTS` in its counts and
|
|
1284
|
+
`...(await pruneJobRuns(jobStore, { now }))` in its result. The harvest's
|
|
1285
|
+
144 rows a day are most of the ledger; whatever history has built up beyond
|
|
1286
|
+
90 days is caught up at a thousand rows a day. Test the SQL in
|
|
1287
|
+
`store.db.test.ts` with runs dated before 2000 under the test's own job ids
|
|
1288
|
+
and `startedBefore` in 2000, so no real row is old enough to go.
|
|
1289
|
+
- **Quickie** — make these dual, `runNow: { scope: ["tenant", "platform"] }`,
|
|
1290
|
+
because a second sweep sends nobody anything twice: **payment reminders**
|
|
1291
|
+
(the per-invoice throttle, which Run now does not lift), **booking
|
|
1292
|
+
reminders** (a booking's `REMINDER` message), **review requests** (`PENDING`
|
|
1293
|
+
becomes `SENT`), **bank consent check** (`expiryNoticeAt`) and **budget
|
|
1294
|
+
alerts** (`BudgetAlert`, one per budget, category and month). Keep these
|
|
1295
|
+
tenant-only: the **follow-up** and **weekly finance digests** —
|
|
1296
|
+
`ignoreHour: force` would email every opted-in organisation at once, and
|
|
1297
|
+
nothing stops a second digest the same day; the **monthly report** — nothing
|
|
1298
|
+
records that an organisation's report went, so re-running a sweep that failed
|
|
1299
|
+
half-way emails the first half again (make it dual once it does); and the
|
|
1300
|
+
**bank feed sync** — `force` lifts each connection's six-hour hold, so a
|
|
1301
|
+
platform run would call every bank for every organisation, and the next
|
|
1302
|
+
window recovers anyway (if it is ever made dual, pass
|
|
1303
|
+
`force && tenantId !== null`). In `lib/repos/cron.repo.ts` add
|
|
1304
|
+
`latestUnfinishedRun` — `createScheduler` refuses a dual job without it — and
|
|
1305
|
+
`pruneRuns`. No route changes: `/api/admin/cron` already calls `runNow` with
|
|
1306
|
+
`platform: true, tenantId: null`, which on a dual job is the platform run,
|
|
1307
|
+
and `/api/cron/run` with `platform: false` and the organisation, which is the
|
|
1308
|
+
tenant run; the admin panel now shows Run now on the dual jobs, and owners see
|
|
1309
|
+
what they saw. Reword the admin route's and panel's "only for the jobs that
|
|
1310
|
+
sweep shared tables", and the automation guide, to say an operator can re-run
|
|
1311
|
+
a failed sweep. Housekeeping (`rate-limit-prune`, `lib/services/cron.service.ts`)
|
|
1312
|
+
prunes through `cronJobStore`. The old `unrecorded` Run now rows age out like
|
|
1313
|
+
any tenant's, the latest per job kept; no screen reads them.
|
|
1314
|
+
- **senco** — no dual jobs: retention and housekeeping are sweeps over every
|
|
1315
|
+
school, and a school's Run now is refused on purpose (`lib/jobs/index.ts`).
|
|
1316
|
+
In `lib/jobs/store.ts` add `pruneRuns` and `{ id: "desc" }` in `latestRun`'s
|
|
1317
|
+
`orderBy`; Housekeeping (`rate-limit-prune`, `lib/jobs/index.ts`) takes the
|
|
1318
|
+
counts and `pruneJobRuns(jobStore, { now })`. `CronSwitchChange` is the
|
|
1319
|
+
switches' audit record, not ledger, and is not pruned. Retention enforcement
|
|
1320
|
+
is a promise to schools about how long evidence is kept; say the ledger's 90
|
|
1321
|
+
days in the same place.
|
|
1322
|
+
|
|
1180
1323
|
### Styles — `@connextar/house/house.css`
|
|
1181
1324
|
|
|
1182
1325
|
What the components need that utility classes cannot say: rich text, the editor's
|
package/dist/jobs/health.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type CountFormatOptions, type CountLine } from "./counts.js";
|
|
2
|
-
import type
|
|
2
|
+
import { type AnyJob, type RunNowScope } from "./registry.js";
|
|
3
3
|
import type { JobRunRecord, JobSwitchState } from "./store.js";
|
|
4
4
|
/**
|
|
5
5
|
* A job's health — derived every time it is shown, never stored.
|
|
@@ -22,7 +22,9 @@ import type { JobRunRecord, JobSwitchState } from "./store.js";
|
|
|
22
22
|
* run exactly at the threshold is still healthy). A tenant's own Run now
|
|
23
23
|
* sweeps one tenant, so it proves nothing about the schedule and does not
|
|
24
24
|
* reset the clock — in Quickie it did, so one owner's click made a job look
|
|
25
|
-
* healthy to everyone.
|
|
25
|
+
* healthy to everyone. A platform Run now sweeps every tenant, as the
|
|
26
|
+
* schedule does, so it counts: an operator re-running a failed sweep puts
|
|
27
|
+
* the job right for everyone.
|
|
26
28
|
* 6. **healthy**.
|
|
27
29
|
*/
|
|
28
30
|
export type JobHealthState = "paused" | "never-run" | "running" | "failed" | "stale" | "healthy";
|
|
@@ -108,8 +110,17 @@ export interface JobView {
|
|
|
108
110
|
switchedBy: string | null;
|
|
109
111
|
/** This viewer may switch it. */
|
|
110
112
|
canSwitch: boolean;
|
|
111
|
-
/**
|
|
113
|
+
/**
|
|
114
|
+
* This viewer may press Run now, and what it would sweep — the first of
|
|
115
|
+
* `runNowScopes`, or `null` when there are none.
|
|
116
|
+
*/
|
|
112
117
|
runNow: RunNowScope | null;
|
|
118
|
+
/**
|
|
119
|
+
* Every Run now this viewer may press, narrowest first. One scope for almost
|
|
120
|
+
* everyone: on a job that offers both, an operator (platform, no tenant) gets
|
|
121
|
+
* `["platform"]` and an owner `["tenant"]`; only a viewer holding both gets two.
|
|
122
|
+
*/
|
|
123
|
+
runNowScopes: RunNowScope[];
|
|
113
124
|
lastRun: JobRunView | null;
|
|
114
125
|
lastSuccess: JobRunView | null;
|
|
115
126
|
}
|
|
@@ -124,7 +135,9 @@ export interface JobViewOptions extends CountFormatOptions {
|
|
|
124
135
|
now: Date;
|
|
125
136
|
}
|
|
126
137
|
export declare function effectiveTimeout(job: AnyJob, fallback: number): number;
|
|
127
|
-
/**
|
|
138
|
+
/** Every Run now this viewer may press on this job, narrowest first: a tenant run needs a tenant, a platform run platform authority. */
|
|
139
|
+
export declare function runNowScopesFor(job: AnyJob, audience: JobAudience): RunNowScope[];
|
|
140
|
+
/** Whether this viewer may press Run now on this job, and over whom — the narrowest scope they hold. */
|
|
128
141
|
export declare function runNowFor(job: AnyJob, audience: JobAudience): RunNowScope | null;
|
|
129
142
|
export declare function buildJobView(job: AnyJob, facts: JobFacts, audience: JobAudience, options: JobViewOptions & {
|
|
130
143
|
timeoutMs: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/jobs/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAChG,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/jobs/health.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs/health.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { countLines, describeSpan } from "./counts.js";
|
|
2
|
+
import { runNowScopes } from "./registry.js";
|
|
2
3
|
import { isManualKey } from "./windows.js";
|
|
3
4
|
export function deriveHealth(input) {
|
|
4
5
|
const { latest, lastWholeSuccess, now } = input;
|
|
@@ -29,13 +30,13 @@ export function deriveHealth(input) {
|
|
|
29
30
|
export function effectiveTimeout(job, fallback) {
|
|
30
31
|
return job.timeoutMs ?? fallback;
|
|
31
32
|
}
|
|
32
|
-
/**
|
|
33
|
+
/** Every Run now this viewer may press on this job, narrowest first: a tenant run needs a tenant, a platform run platform authority. */
|
|
34
|
+
export function runNowScopesFor(job, audience) {
|
|
35
|
+
return runNowScopes(job.runNow).filter((scope) => scope === "tenant" ? Boolean(audience.tenantId) : audience.platform);
|
|
36
|
+
}
|
|
37
|
+
/** Whether this viewer may press Run now on this job, and over whom — the narrowest scope they hold. */
|
|
33
38
|
export function runNowFor(job, audience) {
|
|
34
|
-
|
|
35
|
-
return null;
|
|
36
|
-
if (job.runNow.scope === "tenant")
|
|
37
|
-
return audience.tenantId ? "tenant" : null;
|
|
38
|
-
return audience.platform ? "platform" : null;
|
|
39
|
+
return runNowScopesFor(job, audience)[0] ?? null;
|
|
39
40
|
}
|
|
40
41
|
function runView(job, run, audience, options) {
|
|
41
42
|
const withheld = !audience.platform && run.tenantId === null;
|
|
@@ -54,6 +55,7 @@ function runView(job, run, audience, options) {
|
|
|
54
55
|
export function buildJobView(job, facts, audience, options) {
|
|
55
56
|
const switchable = job.switchable ?? true;
|
|
56
57
|
const paused = switchable && Boolean(facts.switch?.paused);
|
|
58
|
+
const runNowScopes = runNowScopesFor(job, audience);
|
|
57
59
|
const lastRun = facts.latest ? runView(job, facts.latest, audience, options) : null;
|
|
58
60
|
const input = {
|
|
59
61
|
latest: facts.latest,
|
|
@@ -77,7 +79,8 @@ export function buildJobView(job, facts, audience, options) {
|
|
|
77
79
|
switchedAt: switchable ? (facts.switch?.at?.toISOString() ?? null) : null,
|
|
78
80
|
switchedBy: switchable ? (facts.switch?.by ?? null) : null,
|
|
79
81
|
canSwitch: switchable && audience.platform,
|
|
80
|
-
runNow:
|
|
82
|
+
runNow: runNowScopes[0] ?? null,
|
|
83
|
+
runNowScopes,
|
|
81
84
|
lastRun,
|
|
82
85
|
lastSuccess: facts.lastVisibleSuccess ? runView(job, facts.lastVisibleSuccess, audience, options) : null,
|
|
83
86
|
};
|
package/dist/jobs/health.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/jobs/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAA2C,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/jobs/health.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs/index.d.ts
CHANGED
|
@@ -18,9 +18,10 @@
|
|
|
18
18
|
*/
|
|
19
19
|
export { checkCronRequest, type CronAuthOptions, type CronAuthResult } from "./cron-auth.js";
|
|
20
20
|
export { countLines, countsSummary, declaredCounts, describeSpan, formatCount, formatDuration, formatMoney, type CountDeclaration, type CountDeclarations, type CountFormatOptions, type CountKind, type CountLabel, type CountLine, type CountValues, } from "./counts.js";
|
|
21
|
-
export { buildJobView, deriveHealth, describeHealth, describeRun, describeSwitch, formatDay, formatWhen, runNowFor, type HealthInput, type HealthWords, type JobAudience, type JobFacts, type JobHealth, type JobHealthState, type JobRunView, type JobView, type RunFacts, type WhenOptions, } from "./health.js";
|
|
22
|
-
export { DEFAULT_COOLDOWN_MS, DEFAULT_TIMEOUT_MS, MAX_JOB_ID, MAX_WINDOW_KEY, defineJob, defineJobs, jobDefinitionProblems, type AnyJob, type JobActor, type JobContext, type JobDefinition, type RunNowRule, type RunNowScope, } from "./registry.js";
|
|
21
|
+
export { buildJobView, deriveHealth, describeHealth, describeRun, describeSwitch, formatDay, formatWhen, runNowFor, runNowScopesFor, type HealthInput, type HealthWords, type JobAudience, type JobFacts, type JobHealth, type JobHealthState, type JobRunView, type JobView, type RunFacts, type WhenOptions, } from "./health.js";
|
|
22
|
+
export { DEFAULT_COOLDOWN_MS, DEFAULT_TIMEOUT_MS, MAX_JOB_ID, MAX_WINDOW_KEY, defineJob, defineJobs, jobDefinitionProblems, runNowScopes, type AnyJob, type JobActor, type JobContext, type JobDefinition, type RunNowRule, type RunNowScope, } from "./registry.js";
|
|
23
|
+
export { DEFAULT_JOB_RUN_PRUNE_BATCH, DEFAULT_JOB_RUN_RETENTION_DAYS, JOB_RUN_PRUNE_COUNTS, pruneJobRuns, type JobRunPruneCounts, type PruneJobRunsOptions, } from "./prune.js";
|
|
23
24
|
export { createScheduler, refusalStatus, summariseTick, type RunNowCaller, type RunNowOutcome, type RunNowRefusal, type Scheduler, type SchedulerOptions, type SwitchCaller, type SwitchOutcome, type SwitchRefusal, type TickResult, type TickStatus, } from "./scheduler.js";
|
|
24
|
-
export { createMemoryJobStore, pausedFromStored, type JobRunClaim, type JobRunOutcome, type JobRunQuery, type JobRunRecord, type JobStore, type JobSwitchChange, type JobSwitchState, } from "./store.js";
|
|
25
|
+
export { createMemoryJobStore, pausedFromStored, type JobRunClaim, type JobRunOutcome, type JobRunPrune, type JobRunQuery, type JobRunRecord, type JobStore, type JobSwitchChange, type JobSwitchState, } from "./store.js";
|
|
25
26
|
export { MANUAL_KEY_PREFIX, daily, everyHours, hourly, isManualKey, monthly, weekly, type CalendarWindowOptions, type JobWindow, } from "./windows.js";
|
|
26
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/jobs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,WAAW,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,KAAK,EACL,UAAU,EACV,MAAM,EACN,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,qBAAqB,EAC1B,KAAK,SAAS,GACf,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,WAAW,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,SAAS,EACT,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,EAC9B,oBAAoB,EACpB,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,KAAK,EACL,UAAU,EACV,MAAM,EACN,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,qBAAqB,EAC1B,KAAK,SAAS,GACf,MAAM,cAAc,CAAC"}
|
package/dist/jobs/index.js
CHANGED
|
@@ -18,8 +18,9 @@
|
|
|
18
18
|
*/
|
|
19
19
|
export { checkCronRequest } from "./cron-auth.js";
|
|
20
20
|
export { countLines, countsSummary, declaredCounts, describeSpan, formatCount, formatDuration, formatMoney, } from "./counts.js";
|
|
21
|
-
export { buildJobView, deriveHealth, describeHealth, describeRun, describeSwitch, formatDay, formatWhen, runNowFor, } from "./health.js";
|
|
22
|
-
export { DEFAULT_COOLDOWN_MS, DEFAULT_TIMEOUT_MS, MAX_JOB_ID, MAX_WINDOW_KEY, defineJob, defineJobs, jobDefinitionProblems, } from "./registry.js";
|
|
21
|
+
export { buildJobView, deriveHealth, describeHealth, describeRun, describeSwitch, formatDay, formatWhen, runNowFor, runNowScopesFor, } from "./health.js";
|
|
22
|
+
export { DEFAULT_COOLDOWN_MS, DEFAULT_TIMEOUT_MS, MAX_JOB_ID, MAX_WINDOW_KEY, defineJob, defineJobs, jobDefinitionProblems, runNowScopes, } from "./registry.js";
|
|
23
|
+
export { DEFAULT_JOB_RUN_PRUNE_BATCH, DEFAULT_JOB_RUN_RETENTION_DAYS, JOB_RUN_PRUNE_COUNTS, pruneJobRuns, } from "./prune.js";
|
|
23
24
|
export { createScheduler, refusalStatus, summariseTick, } from "./scheduler.js";
|
|
24
25
|
export { createMemoryJobStore, pausedFromStored, } from "./store.js";
|
|
25
26
|
export { MANUAL_KEY_PREFIX, daily, everyHours, hourly, isManualKey, monthly, weekly, } from "./windows.js";
|
package/dist/jobs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,gBAAgB,EAA6C,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,GAQZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,WAAW,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,gBAAgB,EAA6C,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,GAQZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,WAAW,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,SAAS,EACT,eAAe,GAWhB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,YAAY,GAOb,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,EAC9B,oBAAoB,EACpB,YAAY,GAGb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,GAWd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GASjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,KAAK,EACL,UAAU,EACV,MAAM,EACN,WAAW,EACX,OAAO,EACP,MAAM,GAGP,MAAM,cAAc,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { type JobView, type WhenOptions } from "./health.js";
|
|
3
|
+
import type { RunNowScope } from "./registry.js";
|
|
3
4
|
/** Every element the list draws. Each value replaces the default for that part. */
|
|
4
5
|
export interface JobHealthClassNames {
|
|
5
6
|
list: string;
|
|
@@ -38,10 +39,21 @@ export interface JobHealthListProps extends WhenOptions {
|
|
|
38
39
|
* `ActionFeedbackProvider`. Without it no switch is drawn.
|
|
39
40
|
*/
|
|
40
41
|
onSwitch?: (jobId: string, on: boolean) => Promise<void>;
|
|
41
|
-
/**
|
|
42
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Run a job now, over `scope` — the button pressed. Resolve with the route's
|
|
44
|
+
* `message` to have it said; throw to refuse. Send the scope to the route and
|
|
45
|
+
* on to `scheduler.runNow` as the caller's `scope`: on a job that offers both,
|
|
46
|
+
* it is what tells the two buttons apart.
|
|
47
|
+
*/
|
|
48
|
+
onRunNow?: (jobId: string, scope: RunNowScope) => Promise<{
|
|
43
49
|
message?: string;
|
|
44
50
|
} | void>;
|
|
51
|
+
/**
|
|
52
|
+
* What each Run now sweeps, in the app's words, for a row that offers this
|
|
53
|
+
* viewer both — "Run for every organisation", "Run for yours". A row with one
|
|
54
|
+
* says only "Run now". Default "every account" and "your account".
|
|
55
|
+
*/
|
|
56
|
+
runNowWords?: Partial<Record<RunNowScope, string>>;
|
|
45
57
|
/** After a switch lands or a run finishes — usually `router.refresh()`. */
|
|
46
58
|
onSettled?: () => void;
|
|
47
59
|
/** Anything of the app's own under a row: AltEd's link to the harvest's screen. */
|
|
@@ -62,5 +74,5 @@ export interface JobHealthListProps extends WhenOptions {
|
|
|
62
74
|
* Draws plain elements on the theme tokens, like the wizard; there is still no
|
|
63
75
|
* `Button` in this package. The app wraps it in its own card and heading.
|
|
64
76
|
*/
|
|
65
|
-
export declare function JobHealthList({ jobs, onSwitch, onRunNow, onSettled, extra, emptyText, className, classNames, locale, timeZone, }: JobHealthListProps): React.JSX.Element;
|
|
77
|
+
export declare function JobHealthList({ jobs, onSwitch, onRunNow, onSettled, runNowWords, extra, emptyText, className, classNames, locale, timeZone, }: JobHealthListProps): React.JSX.Element;
|
|
66
78
|
//# sourceMappingURL=job-health-list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-health-list.d.ts","sourceRoot":"","sources":["../../src/jobs/job-health-list.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"job-health-list.d.ts","sourceRoot":"","sources":["../../src/jobs/job-health-list.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,mFAAmF;AACnF,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,kDAAkD;AAClD,eAAO,MAAM,sBAAsB,EAAE,mBA2BpC,CAAC;AAWF,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,sDAAsD;IACtD,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACvF;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,mFAAmF;IACnF,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1C,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,WAAW,EACX,KAAK,EACL,SAAgC,EAChC,SAAS,EACT,UAAU,EACV,MAAM,EACN,QAAQ,GACT,EAAE,kBAAkB,qBAsBpB"}
|
|
@@ -54,13 +54,14 @@ const ICONS = {
|
|
|
54
54
|
* Draws plain elements on the theme tokens, like the wizard; there is still no
|
|
55
55
|
* `Button` in this package. The app wraps it in its own card and heading.
|
|
56
56
|
*/
|
|
57
|
-
export function JobHealthList({ jobs, onSwitch, onRunNow, onSettled, extra, emptyText = "No scheduled jobs.", className, classNames, locale, timeZone, }) {
|
|
57
|
+
export function JobHealthList({ jobs, onSwitch, onRunNow, onSettled, runNowWords, extra, emptyText = "No scheduled jobs.", className, classNames, locale, timeZone, }) {
|
|
58
58
|
const c = { ...JOB_HEALTH_CLASS_NAMES, ...classNames };
|
|
59
59
|
const actions = useKeyedAction();
|
|
60
60
|
if (jobs.length === 0)
|
|
61
61
|
return _jsx("p", { className: c.empty, children: emptyText });
|
|
62
|
-
return (_jsx("ul", { className: cx(c.list, className), children: jobs.map((job) => (_jsx(JobRow, { job: job, c: c, actions: actions, onSwitch: onSwitch, onRunNow: onRunNow, onSettled: onSettled, extra: extra, when: { locale, timeZone } }, job.id))) }));
|
|
62
|
+
return (_jsx("ul", { className: cx(c.list, className), children: jobs.map((job) => (_jsx(JobRow, { job: job, c: c, actions: actions, onSwitch: onSwitch, onRunNow: onRunNow, onSettled: onSettled, scopeWords: { ...RUN_NOW_WORDS, ...runNowWords }, extra: extra, when: { locale, timeZone } }, job.id))) }));
|
|
63
63
|
}
|
|
64
|
+
const RUN_NOW_WORDS = { tenant: "your account", platform: "every account" };
|
|
64
65
|
function toneClass(c, words) {
|
|
65
66
|
switch (words.tone) {
|
|
66
67
|
case "good":
|
|
@@ -73,7 +74,7 @@ function toneClass(c, words) {
|
|
|
73
74
|
return c.badgeNeutral;
|
|
74
75
|
}
|
|
75
76
|
}
|
|
76
|
-
function JobRow({ job, c, actions, onSwitch, onRunNow, onSettled, extra, when, }) {
|
|
77
|
+
function JobRow({ job, c, actions, onSwitch, onRunNow, onSettled, scopeWords, extra, when, }) {
|
|
77
78
|
const on = useOptimisticValue(!job.paused, { onSettled });
|
|
78
79
|
// Health with the switch as the screen shows it, not as the server last said.
|
|
79
80
|
const health = on.value ? job.healthIfOn : { state: "paused" };
|
|
@@ -96,10 +97,11 @@ function JobRow({ job, c, actions, onSwitch, onRunNow, onSettled, extra, when, }
|
|
|
96
97
|
await onSwitch(job.id, next);
|
|
97
98
|
}, { error: next ? `Couldn't turn ${job.label} back on` : `Couldn't pause ${job.label}` });
|
|
98
99
|
};
|
|
99
|
-
const runNow = () => {
|
|
100
|
+
const runNow = (scope) => {
|
|
100
101
|
if (!onRunNow)
|
|
101
102
|
return;
|
|
102
|
-
|
|
103
|
+
// Keyed on the job, not the scope: while one of its runs is under way, neither button starts another.
|
|
104
|
+
void actions.run(job.id, () => onRunNow(job.id, scope), {
|
|
103
105
|
success: (result) => (result && result.message) || `Ran ${job.label}.`,
|
|
104
106
|
error: `Couldn't run ${job.label}`,
|
|
105
107
|
// A failed run is on the ledger too, so the screen has something new to show either way.
|
|
@@ -109,7 +111,9 @@ function JobRow({ job, c, actions, onSwitch, onRunNow, onSettled, extra, when, }
|
|
|
109
111
|
};
|
|
110
112
|
const running = actions.isPending(job.id);
|
|
111
113
|
const showSwitch = job.canSwitch && Boolean(onSwitch);
|
|
112
|
-
|
|
113
|
-
|
|
114
|
+
// `runNow` null is the last word: a view an app narrowed by hand offers nothing.
|
|
115
|
+
const scopes = !onRunNow || job.runNow === null ? [] : job.runNowScopes.length ? job.runNowScopes : [job.runNow];
|
|
116
|
+
const showRunNow = scopes.length > 0;
|
|
117
|
+
return (_jsxs("li", { className: c.row, "data-job": job.id, "data-health": health.state, children: [_jsxs("div", { className: c.body, children: [_jsxs("div", { className: c.heading, children: [_jsx("span", { className: c.label, children: job.label }), _jsxs("span", { className: cx(c.badge, toneClass(c, words)), children: [_jsx(Icon, { "aria-hidden": "true" }), words.label] })] }), _jsxs("p", { className: c.meta, children: [job.cadence, run ? ` · ${describeRun(run, "Last run", when)}` : ""] }), detail ? _jsx("p", { className: health.state === "failed" ? c.error : c.detail, children: detail }) : null, countsLine ? _jsx("p", { className: c.counts, children: countsLine }) : null, switchLine ? _jsx("p", { className: c.switched, children: switchLine }) : null, extra?.(job)] }), showSwitch || showRunNow ? (_jsxs("div", { className: c.actions, children: [scopes.map((scope) => (_jsxs("button", { type: "button", className: c.runNow, onClick: () => runNow(scope), disabled: running || !on.value, title: on.value ? undefined : "Switched off — turn it back on to run it", "data-busy": running ? "true" : undefined, "data-scope": scope, "aria-label": scopes.length > 1 ? `Run ${job.label} now for ${scopeWords[scope]}` : `Run ${job.label} now`, children: [_jsx(Play, { "aria-hidden": "true" }), scopes.length > 1 ? `Run for ${scopeWords[scope]}` : "Run now"] }, scope))), showSwitch ? (_jsx("button", { type: "button", role: "switch", "aria-checked": on.value, "aria-label": job.label, "aria-busy": on.pending || undefined, className: cx(c.switch, on.value ? c.switchOn : c.switchOff), onClick: toggle, children: _jsx("span", { className: cx(c.thumb, on.value ? c.thumbOn : c.thumbOff) }) })) : null] })) : null] }));
|
|
114
118
|
}
|
|
115
119
|
//# sourceMappingURL=job-health-list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-health-list.js","sourceRoot":"","sources":["../../src/jobs/job-health-list.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,KAAK,EACL,YAAY,EACZ,IAAI,EACJ,aAAa,GAEd,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAoB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,WAAW,EACX,cAAc,GAKf,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"job-health-list.js","sourceRoot":"","sources":["../../src/jobs/job-health-list.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { CountValues } from "./counts.js";
|
|
2
|
+
import type { JobStore } from "./store.js";
|
|
3
|
+
/** How long a run is kept, unless it is one health reads. */
|
|
4
|
+
export declare const DEFAULT_JOB_RUN_RETENTION_DAYS = 90;
|
|
5
|
+
/** At most this many rows a call, so one housekeeping run never holds the table for long. */
|
|
6
|
+
export declare const DEFAULT_JOB_RUN_PRUNE_BATCH = 1000;
|
|
7
|
+
/**
|
|
8
|
+
* What `pruneJobRuns` reports, declared so it reads "12 old job runs removed".
|
|
9
|
+
* Spread it into the housekeeping job's `counts`, and the result into what its
|
|
10
|
+
* `run` returns.
|
|
11
|
+
*/
|
|
12
|
+
export declare const JOB_RUN_PRUNE_COUNTS: {
|
|
13
|
+
readonly jobRunsPruned: {
|
|
14
|
+
readonly label: {
|
|
15
|
+
readonly one: "old job run removed";
|
|
16
|
+
readonly other: "old job runs removed";
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export type JobRunPruneCounts = CountValues<typeof JOB_RUN_PRUNE_COUNTS>;
|
|
21
|
+
export interface PruneJobRunsOptions {
|
|
22
|
+
/** The clock. The housekeeping job passes its `now`. */
|
|
23
|
+
now?: Date;
|
|
24
|
+
/**
|
|
25
|
+
* Keep every run for this many days. Default 90. At least 1 — a day, not a
|
|
26
|
+
* millisecond count, so `90` cannot be mistaken for 90 ms and empty the ledger.
|
|
27
|
+
*/
|
|
28
|
+
retentionDays?: number;
|
|
29
|
+
/** Delete at most this many rows in the call. Default 1000. Whatever is left goes next time. */
|
|
30
|
+
batchLimit?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Delete runs older than the retention period — never the latest run or the
|
|
34
|
+
* latest successful run of a job (per tenant, for tenants' own runs, and once
|
|
35
|
+
* for the runs over every tenant), and never one that has not finished — at
|
|
36
|
+
* most `batchLimit` of them, oldest first. Running it again straight away
|
|
37
|
+
* deletes only what the first call's limit left.
|
|
38
|
+
*
|
|
39
|
+
* ```ts
|
|
40
|
+
* counts: { windowsPruned: { label: "…" }, ...JOB_RUN_PRUNE_COUNTS },
|
|
41
|
+
* run: async ({ now }) => ({ windowsPruned: await pruneRateLimits(), ...(await pruneJobRuns(jobStore, { now })) }),
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function pruneJobRuns(store: JobStore, options?: PruneJobRunsOptions): Promise<JobRunPruneCounts>;
|
|
45
|
+
//# sourceMappingURL=prune.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../src/jobs/prune.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,WAAW,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAkB3C,6DAA6D;AAC7D,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD,6FAA6F;AAC7F,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;CAEK,CAAC;AAEvC,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,GAAG,CAAC,EAAE,IAAI,CAAC;IACX;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gGAAgG;IAChG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkBjH"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pruning the ledger — from the app's own housekeeping job, a bounded batch a
|
|
3
|
+
* day.
|
|
4
|
+
*
|
|
5
|
+
* The ledger grows without end (AltEd writes about 150 rows a day), and a Run
|
|
6
|
+
* now row keeps the name of whoever pressed it. Old rows are history, not
|
|
7
|
+
* state — with two exceptions, which are the whole of the care here. Health is
|
|
8
|
+
* read from the latest run and the latest successful run of each job (and, for
|
|
9
|
+
* a tenant's own Run now, of each job for that tenant). Delete those and a
|
|
10
|
+
* monthly job that last ran 120 days ago reads **Never run**; delete an
|
|
11
|
+
* unfinished one and a run under way loses its row. So those are never
|
|
12
|
+
* deleted, however old, and everything else past the retention period is.
|
|
13
|
+
*/
|
|
14
|
+
const DAY = 24 * 60 * 60 * 1000;
|
|
15
|
+
/** How long a run is kept, unless it is one health reads. */
|
|
16
|
+
export const DEFAULT_JOB_RUN_RETENTION_DAYS = 90;
|
|
17
|
+
/** At most this many rows a call, so one housekeeping run never holds the table for long. */
|
|
18
|
+
export const DEFAULT_JOB_RUN_PRUNE_BATCH = 1000;
|
|
19
|
+
/**
|
|
20
|
+
* What `pruneJobRuns` reports, declared so it reads "12 old job runs removed".
|
|
21
|
+
* Spread it into the housekeeping job's `counts`, and the result into what its
|
|
22
|
+
* `run` returns.
|
|
23
|
+
*/
|
|
24
|
+
export const JOB_RUN_PRUNE_COUNTS = {
|
|
25
|
+
jobRunsPruned: { label: { one: "old job run removed", other: "old job runs removed" } },
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Delete runs older than the retention period — never the latest run or the
|
|
29
|
+
* latest successful run of a job (per tenant, for tenants' own runs, and once
|
|
30
|
+
* for the runs over every tenant), and never one that has not finished — at
|
|
31
|
+
* most `batchLimit` of them, oldest first. Running it again straight away
|
|
32
|
+
* deletes only what the first call's limit left.
|
|
33
|
+
*
|
|
34
|
+
* ```ts
|
|
35
|
+
* counts: { windowsPruned: { label: "…" }, ...JOB_RUN_PRUNE_COUNTS },
|
|
36
|
+
* run: async ({ now }) => ({ windowsPruned: await pruneRateLimits(), ...(await pruneJobRuns(jobStore, { now })) }),
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export async function pruneJobRuns(store, options = {}) {
|
|
40
|
+
const retentionDays = options.retentionDays ?? DEFAULT_JOB_RUN_RETENTION_DAYS;
|
|
41
|
+
const limit = options.batchLimit ?? DEFAULT_JOB_RUN_PRUNE_BATCH;
|
|
42
|
+
if (!(Number.isFinite(retentionDays) && retentionDays >= 1)) {
|
|
43
|
+
throw new RangeError(`The job run retention is a number of days, at least 1 (got ${retentionDays}).`);
|
|
44
|
+
}
|
|
45
|
+
if (!(Number.isInteger(limit) && limit >= 1)) {
|
|
46
|
+
throw new RangeError(`The job run prune batch is a whole number of rows, at least 1 (got ${limit}).`);
|
|
47
|
+
}
|
|
48
|
+
if (typeof store.pruneRuns !== "function") {
|
|
49
|
+
throw new Error("This JobStore can't prune old runs: add pruneRuns to the adapter (the README has it).");
|
|
50
|
+
}
|
|
51
|
+
const now = options.now ?? new Date();
|
|
52
|
+
const deleted = await store.pruneRuns({ startedBefore: new Date(now.getTime() - retentionDays * DAY), limit });
|
|
53
|
+
if (!(Number.isInteger(deleted) && deleted >= 0)) {
|
|
54
|
+
throw new Error(`The JobStore's pruneRuns didn't say how many runs it deleted (got ${String(deleted)}).`);
|
|
55
|
+
}
|
|
56
|
+
return { jobRunsPruned: deleted };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=prune.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/jobs/prune.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AAEH,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEhC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAEhD;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE;CACnD,CAAC;AAgBvC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAe,EAAE,UAA+B,EAAE;IACnF,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,8BAA8B,CAAC;IAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,IAAI,2BAA2B,CAAC;IAChE,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,IAAI,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,UAAU,CAAC,8DAA8D,aAAa,IAAI,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,UAAU,CAAC,sEAAsE,KAAK,IAAI,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,aAAa,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/G,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,qEAAqE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
|
package/dist/jobs/registry.d.ts
CHANGED
|
@@ -17,14 +17,29 @@ export interface JobActor {
|
|
|
17
17
|
*/
|
|
18
18
|
export type RunNowScope = "tenant" | "platform";
|
|
19
19
|
export interface RunNowRule {
|
|
20
|
-
scope: RunNowScope;
|
|
21
20
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
21
|
+
* Over whom Run now may sweep: one scope, or both.
|
|
22
|
+
*
|
|
23
|
+
* `["tenant", "platform"]` — Quickie's per-organisation jobs: an owner re-runs
|
|
24
|
+
* their own organisation, and an operator re-runs the sweep over every
|
|
25
|
+
* organisation when the overnight one failed. The two are fenced from each
|
|
26
|
+
* other: each has its own cool-down (a tenant's per tenant), neither starts
|
|
27
|
+
* while the other is in flight, and only the platform run counts for the
|
|
28
|
+
* job's health. Offering both needs `JobStore.latestUnfinishedRun`.
|
|
29
|
+
*/
|
|
30
|
+
scope: RunNowScope | readonly RunNowScope[];
|
|
31
|
+
/**
|
|
32
|
+
* How soon the same scope may run it again — per tenant for a tenant run.
|
|
33
|
+
* Default ten minutes. A manual run skips the job's hour gates, so without
|
|
34
|
+
* this a second press sends the whole batch again. `0` turns it off.
|
|
25
35
|
*/
|
|
26
36
|
cooldownMs?: number;
|
|
27
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* The scopes a rule offers, narrowest first, each once: `["tenant"]`,
|
|
40
|
+
* `["platform"]` or `["tenant", "platform"]`. Nothing when Run now is off.
|
|
41
|
+
*/
|
|
42
|
+
export declare function runNowScopes(rule: false | RunNowRule | undefined): RunNowScope[];
|
|
28
43
|
/** What a run is handed. */
|
|
29
44
|
export interface JobContext {
|
|
30
45
|
now: Date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/jobs/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,gGAAgG;AAChG,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/jobs/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs/registry.js
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
const SCOPE_ORDER = ["tenant", "platform"];
|
|
2
|
+
/**
|
|
3
|
+
* The scopes a rule offers, narrowest first, each once: `["tenant"]`,
|
|
4
|
+
* `["platform"]` or `["tenant", "platform"]`. Nothing when Run now is off.
|
|
5
|
+
*/
|
|
6
|
+
export function runNowScopes(rule) {
|
|
7
|
+
if (!rule)
|
|
8
|
+
return [];
|
|
9
|
+
const declared = Array.isArray(rule.scope) ? rule.scope : [rule.scope];
|
|
10
|
+
return SCOPE_ORDER.filter((scope) => declared.includes(scope));
|
|
11
|
+
}
|
|
1
12
|
/**
|
|
2
13
|
* A job's definition, checked against its own counts at compile time: `run`
|
|
3
14
|
* must report every count `counts` declares, and nothing it does not — a
|
|
@@ -43,9 +54,13 @@ export function jobDefinitionProblems(jobs) {
|
|
|
43
54
|
if (job.timeoutMs !== undefined && !positive(job.timeoutMs))
|
|
44
55
|
problems.push(`"${name}" has a timeout that is not positive.`);
|
|
45
56
|
if (job.runNow) {
|
|
46
|
-
|
|
57
|
+
const declared = Array.isArray(job.runNow.scope) ? job.runNow.scope : [job.runNow.scope];
|
|
58
|
+
if (declared.length === 0 || declared.some((scope) => scope !== "tenant" && scope !== "platform")) {
|
|
47
59
|
problems.push(`"${name}" offers Run now without saying over whom — "tenant" or "platform".`);
|
|
48
60
|
}
|
|
61
|
+
else if (new Set(declared).size !== declared.length) {
|
|
62
|
+
problems.push(`"${name}" offers Run now over the same scope twice.`);
|
|
63
|
+
}
|
|
49
64
|
const cooldown = job.runNow.cooldownMs;
|
|
50
65
|
if (cooldown !== undefined && !(Number.isFinite(cooldown) && cooldown >= 0)) {
|
|
51
66
|
problems.push(`"${name}" has a Run now cool-down that is not zero or more.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/jobs/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/jobs/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs/scheduler.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type CountFormatOptions, type CountLine } from "./counts.js";
|
|
2
2
|
import { type JobAudience, type JobView } from "./health.js";
|
|
3
|
-
import { type AnyJob, type JobActor } from "./registry.js";
|
|
3
|
+
import { type AnyJob, type JobActor, type RunNowScope } from "./registry.js";
|
|
4
4
|
import type { JobStore } from "./store.js";
|
|
5
5
|
/** What the tick did with one job. */
|
|
6
6
|
export type TickStatus = "ran" | "failed" | "already-ran" | "not-due" | "paused";
|
|
@@ -14,15 +14,18 @@ export interface TickResult {
|
|
|
14
14
|
message: string;
|
|
15
15
|
}
|
|
16
16
|
export type RunNowRefusal = "unknown" | "not-runnable" | "out-of-scope" | "paused" | "running" | "too-soon";
|
|
17
|
+
/** `scope` on a run says what it swept — the app's audit entry says "for every organisation" or not by it. */
|
|
17
18
|
export type RunNowOutcome = {
|
|
18
19
|
status: "ran";
|
|
19
20
|
job: string;
|
|
21
|
+
scope: RunNowScope;
|
|
20
22
|
windowKey: string;
|
|
21
23
|
counts: CountLine[];
|
|
22
24
|
message: string;
|
|
23
25
|
} | {
|
|
24
26
|
status: "failed";
|
|
25
27
|
job: string;
|
|
28
|
+
scope: RunNowScope;
|
|
26
29
|
windowKey: string;
|
|
27
30
|
error: string;
|
|
28
31
|
message: string;
|
|
@@ -47,6 +50,14 @@ export type SwitchOutcome = {
|
|
|
47
50
|
/** Who pressed Run now, and what they may reach. The app has already checked they are signed in and may use the screen. */
|
|
48
51
|
export interface RunNowCaller extends JobAudience {
|
|
49
52
|
actor: JobActor;
|
|
53
|
+
/**
|
|
54
|
+
* Which Run now was pressed, on a job that offers both — the list hands it
|
|
55
|
+
* to `onRunNow`. Left out, a job with one scope runs over that one (as in
|
|
56
|
+
* 0.11.0), and a job with both runs over the caller's own tenant when they
|
|
57
|
+
* have one, and over every tenant when they do not. It is a request, never
|
|
58
|
+
* an authority: `platform` and `tenantId` still decide whether it is allowed.
|
|
59
|
+
*/
|
|
60
|
+
scope?: RunNowScope;
|
|
50
61
|
}
|
|
51
62
|
export interface SwitchCaller {
|
|
52
63
|
actor: JobActor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/jobs/scheduler.ts"],"names":[],"mappings":"AACA,OAAO,EAA6C,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACjH,OAAO,EAA8C,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AACzG,OAAO,
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/jobs/scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs/scheduler.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { errorMessage } from "../ux/errors.js";
|
|
2
2
|
import { countLines, countsSummary, declaredCounts } from "./counts.js";
|
|
3
3
|
import { buildJobView, effectiveTimeout, formatWhen } from "./health.js";
|
|
4
|
-
import { DEFAULT_COOLDOWN_MS, DEFAULT_TIMEOUT_MS, MAX_WINDOW_KEY, } from "./registry.js";
|
|
4
|
+
import { DEFAULT_COOLDOWN_MS, DEFAULT_TIMEOUT_MS, MAX_WINDOW_KEY, runNowScopes, } from "./registry.js";
|
|
5
5
|
import { MANUAL_KEY_PREFIX } from "./windows.js";
|
|
6
6
|
const MAX_ERROR = 1000;
|
|
7
7
|
function messageOf(error) {
|
|
@@ -21,6 +21,11 @@ const minutes = (ms) => {
|
|
|
21
21
|
*/
|
|
22
22
|
export function createScheduler(options) {
|
|
23
23
|
const { jobs, store } = options;
|
|
24
|
+
const dual = jobs.filter((job) => runNowScopes(job.runNow).length > 1).map((job) => `"${job.id}"`);
|
|
25
|
+
if (dual.length && typeof store.latestUnfinishedRun !== "function") {
|
|
26
|
+
throw new Error(`${dual.join(", ")} ${dual.length === 1 ? "offers" : "offer"} Run now over both scopes, which needs ` +
|
|
27
|
+
"JobStore.latestUnfinishedRun: a run over every tenant must not start while one tenant's is in flight.");
|
|
28
|
+
}
|
|
24
29
|
const clock = options.clock ?? (() => new Date());
|
|
25
30
|
const fallbackTimeout = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
26
31
|
const format = { locale: options.locale };
|
|
@@ -140,21 +145,30 @@ export function createScheduler(options) {
|
|
|
140
145
|
message,
|
|
141
146
|
});
|
|
142
147
|
const rule = job.runNow;
|
|
143
|
-
|
|
148
|
+
const offered = runNowScopes(rule);
|
|
149
|
+
if (!rule || offered.length === 0)
|
|
144
150
|
return refuse("not-runnable", `${job.label} runs on its schedule only.`);
|
|
145
|
-
|
|
151
|
+
const scope = caller.scope ?? (offered.length === 1 ? offered[0] : caller.tenantId ? "tenant" : "platform");
|
|
152
|
+
if (!offered.includes(scope)) {
|
|
153
|
+
return refuse("out-of-scope", scope === "platform"
|
|
154
|
+
? `${job.label} can only be run for one organisation at a time, not across every account.`
|
|
155
|
+
: `${job.label} runs across every account only; it can't be run for one organisation.`);
|
|
156
|
+
}
|
|
157
|
+
if (scope === "tenant" && !caller.tenantId) {
|
|
146
158
|
return refuse("out-of-scope", `${job.label} can only be run for your own organisation, and you aren't in one.`);
|
|
147
159
|
}
|
|
148
|
-
if (
|
|
160
|
+
if (scope === "platform" && !caller.platform) {
|
|
149
161
|
return refuse("out-of-scope", `${job.label} runs across every account, so only a platform administrator can run it.`);
|
|
150
162
|
}
|
|
151
|
-
const tenantId =
|
|
163
|
+
const tenantId = scope === "tenant" ? caller.tenantId : null;
|
|
152
164
|
if ((job.switchable ?? true) && (await store.readSwitches()).get(job.id)?.paused) {
|
|
153
165
|
return refuse("paused", `${job.label} is switched off. Turn it back on to run it.`);
|
|
154
166
|
}
|
|
155
|
-
// Nothing in flight that this run could overlap: the schedule's
|
|
156
|
-
|
|
157
|
-
const latest =
|
|
167
|
+
// Nothing in flight that this run could overlap: a sweep over every tenant (the schedule's, or a platform
|
|
168
|
+
// Run now) covers this tenant too; and on a job with both scopes, a platform run covers every tenant's.
|
|
169
|
+
const latest = tenantId === null && offered.length > 1
|
|
170
|
+
? await store.latestUnfinishedRun(job.id)
|
|
171
|
+
: await store.latestRun({ job: job.id, tenants: tenantId === null ? [null] : [null, tenantId] });
|
|
158
172
|
const timeout = effectiveTimeout(job, fallbackTimeout);
|
|
159
173
|
if (latest && !latest.finishedAt && now.getTime() - latest.startedAt.getTime() <= timeout) {
|
|
160
174
|
return refuse("running", `${job.label} is running now — it started ${formatWhen(latest.startedAt.toISOString())}.`);
|
|
@@ -178,13 +192,14 @@ export function createScheduler(options) {
|
|
|
178
192
|
const context = { now, trigger: "manual", tenantId, force: true, windowKey, by: caller.actor };
|
|
179
193
|
const { counts, error } = await execute(job, runId, context);
|
|
180
194
|
if (error !== null) {
|
|
181
|
-
return { status: "failed", job: job.id, windowKey, error, message: `${job.label} failed: ${error}` };
|
|
195
|
+
return { status: "failed", job: job.id, scope, windowKey, error, message: `${job.label} failed: ${error}` };
|
|
182
196
|
}
|
|
183
197
|
const lines = countLines(job.counts, counts, format);
|
|
184
198
|
const summary = countsSummary(lines);
|
|
185
199
|
return {
|
|
186
200
|
status: "ran",
|
|
187
201
|
job: job.id,
|
|
202
|
+
scope,
|
|
188
203
|
windowKey,
|
|
189
204
|
counts: lines,
|
|
190
205
|
message: `Ran ${job.label}${summary ? ` — ${summary}` : ""}.`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/jobs/scheduler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/jobs/scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs/store.d.ts
CHANGED
|
@@ -45,6 +45,18 @@ export interface JobRunQuery {
|
|
|
45
45
|
/** Run now runs only (their key starts `manual:`). */
|
|
46
46
|
manualOnly?: true;
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Old runs to delete: finished ones that started before `startedBefore`,
|
|
50
|
+
* oldest first, at most `limit` of them — **never** one that is the latest
|
|
51
|
+
* run, or the latest successful run, of its job for its tenant (`null`, the
|
|
52
|
+
* runs over every tenant, counting as one tenant of its own). Health is read
|
|
53
|
+
* from exactly those rows, so a monthly job last run 120 days ago keeps its
|
|
54
|
+
* last run and its last success and does not turn into "never run".
|
|
55
|
+
*/
|
|
56
|
+
export interface JobRunPrune {
|
|
57
|
+
startedBefore: Date;
|
|
58
|
+
limit: number;
|
|
59
|
+
}
|
|
48
60
|
/** Whether a job is switched off, and the latest change. No entry means on. */
|
|
49
61
|
export interface JobSwitchState {
|
|
50
62
|
paused: boolean;
|
|
@@ -68,6 +80,19 @@ export interface JobStore {
|
|
|
68
80
|
claimRun(claim: JobRunClaim): Promise<string | null>;
|
|
69
81
|
finishRun(id: string, outcome: JobRunOutcome): Promise<void>;
|
|
70
82
|
latestRun(query: JobRunQuery): Promise<JobRunRecord | null>;
|
|
83
|
+
/**
|
|
84
|
+
* The most recently started run of this job **over any tenant** that has not
|
|
85
|
+
* finished, or `null`. Only a job whose Run now offers both scopes needs it —
|
|
86
|
+
* a platform run must not start while one tenant's run is in flight — and
|
|
87
|
+
* `createScheduler` refuses such a job on a store without it.
|
|
88
|
+
*/
|
|
89
|
+
latestUnfinishedRun?(job: string): Promise<JobRunRecord | null>;
|
|
90
|
+
/**
|
|
91
|
+
* Delete old runs by the rules of `JobRunPrune`, in one bounded statement, and
|
|
92
|
+
* resolve with how many were deleted. Only `pruneJobRuns` calls it — from the
|
|
93
|
+
* app's own housekeeping job — and it throws on a store without it.
|
|
94
|
+
*/
|
|
95
|
+
pruneRuns?(prune: JobRunPrune): Promise<number>;
|
|
71
96
|
readSwitches(): Promise<ReadonlyMap<string, JobSwitchState>>;
|
|
72
97
|
/**
|
|
73
98
|
* Record a switch. **Write the audit entry here too, in the same
|
|
@@ -86,7 +111,7 @@ export declare function pausedFromStored(value: unknown): boolean;
|
|
|
86
111
|
* The whole contract in memory — for tests, the app's included. It keeps the
|
|
87
112
|
* unique `(job, windowKey)` rule exactly as the database would.
|
|
88
113
|
*/
|
|
89
|
-
export declare function createMemoryJobStore(): JobStore & {
|
|
114
|
+
export declare function createMemoryJobStore(): Required<JobStore> & {
|
|
90
115
|
runs: JobRunRecord[];
|
|
91
116
|
switches: Map<string, JobSwitchState>;
|
|
92
117
|
switchLog: JobSwitchChange[];
|
package/dist/jobs/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/jobs/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C;;;;;;;;GAQG;AAEH,wHAAwH;AACxH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,6DAA6D;IAC7D,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,IAAI,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACtC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,kHAAkH;AAClH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACpC,4BAA4B;IAC5B,EAAE,CAAC,EAAE,IAAI,CAAC;IACV,sDAAsD;IACtD,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB;AAED,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC;IAChB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,IAAI,CAAC;IACT,EAAE,EAAE,QAAQ,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5D,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7D;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKxD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,QAAQ,GAAG;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/jobs/store.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs/store.js
CHANGED
|
@@ -37,12 +37,39 @@ export function createMemoryJobStore() {
|
|
|
37
37
|
Object.assign(run, outcome);
|
|
38
38
|
},
|
|
39
39
|
async latestRun(query) {
|
|
40
|
-
|
|
40
|
+
return latestOf(runs.filter((run) => run.job === query.job &&
|
|
41
41
|
query.tenants.includes(run.tenantId) &&
|
|
42
42
|
(!query.ok || run.ok) &&
|
|
43
|
-
(!query.manualOnly || isManualKey(run.windowKey)));
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
(!query.manualOnly || isManualKey(run.windowKey))));
|
|
44
|
+
},
|
|
45
|
+
async latestUnfinishedRun(job) {
|
|
46
|
+
return latestOf(runs.filter((run) => run.job === job && run.finishedAt === null));
|
|
47
|
+
},
|
|
48
|
+
async pruneRuns({ startedBefore, limit }) {
|
|
49
|
+
// What health reads: per job and tenant, the latest run and the latest success.
|
|
50
|
+
const kept = new Set();
|
|
51
|
+
const groups = new Map();
|
|
52
|
+
for (const run of runs) {
|
|
53
|
+
const key = JSON.stringify([run.job, run.tenantId]);
|
|
54
|
+
groups.set(key, [...(groups.get(key) ?? []), run]);
|
|
55
|
+
}
|
|
56
|
+
for (const group of groups.values()) {
|
|
57
|
+
for (const latest of [latestOf(group), latestOf(group.filter((run) => run.ok))]) {
|
|
58
|
+
if (latest)
|
|
59
|
+
kept.add(latest.id);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const doomed = runs
|
|
63
|
+
.map((run, index) => ({ run, index }))
|
|
64
|
+
.filter(({ run }) => run.finishedAt !== null && run.startedAt.getTime() < startedBefore.getTime() && !kept.has(run.id))
|
|
65
|
+
.sort((a, b) => a.run.startedAt.getTime() - b.run.startedAt.getTime() || a.index - b.index)
|
|
66
|
+
.slice(0, limit)
|
|
67
|
+
.map(({ run }) => run.id);
|
|
68
|
+
const gone = new Set(doomed);
|
|
69
|
+
for (let i = runs.length - 1; i >= 0; i--)
|
|
70
|
+
if (gone.has(runs[i].id))
|
|
71
|
+
runs.splice(i, 1);
|
|
72
|
+
return gone.size;
|
|
46
73
|
},
|
|
47
74
|
async readSwitches() {
|
|
48
75
|
return new Map(switches);
|
|
@@ -53,4 +80,8 @@ export function createMemoryJobStore() {
|
|
|
53
80
|
},
|
|
54
81
|
};
|
|
55
82
|
}
|
|
83
|
+
/** Latest by start; on a tie, the one inserted last — what a database's `ORDER BY started_at DESC, id DESC` gives. */
|
|
84
|
+
function latestOf(runs) {
|
|
85
|
+
return runs.reduce((latest, run) => (!latest || run.startedAt.getTime() >= latest.startedAt.getTime() ? run : latest), null);
|
|
86
|
+
}
|
|
56
87
|
//# sourceMappingURL=store.js.map
|
package/dist/jobs/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/jobs/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/jobs/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAiH3C;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAQ,KAA8B,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACtG,OAAQ,KAA6B,CAAC,MAAM,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAKlC,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IACnD,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,SAAS;QACT,KAAK,CAAC,QAAQ,CAAC,KAAK;YAClB,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChG,MAAM,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,KAAK;YACnB,OAAO,QAAQ,CACb,IAAI,CAAC,MAAM,CACT,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;gBACrB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACpC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;gBACrB,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CACpD,CACF,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,mBAAmB,CAAC,GAAG;YAC3B,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE;YACtC,gFAAgF;YAChF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;YACjD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACpD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACpC,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChF,IAAI,MAAM;wBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,IAAI;iBAChB,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;iBACrC,MAAM,CACL,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CACV,GAAG,CAAC,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CACpG;iBACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;iBAC1F,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;iBACf,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;YAC7B,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAAE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxF,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,KAAK,CAAC,YAAY;YAChB,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,MAAM;YACtB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YACvF,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,sHAAsH;AACtH,SAAS,QAAQ,CAAC,IAA6B;IAC7C,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAClG,IAAI,CACL,CAAC;AACJ,CAAC"}
|