@sponson/core 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/engine/action.d.ts +22 -0
  2. package/dist/engine/action.js +55 -0
  3. package/dist/engine/action.js.map +1 -0
  4. package/dist/engine/apply.js +203 -22
  5. package/dist/engine/apply.js.map +1 -1
  6. package/dist/engine/destroy.js +42 -10
  7. package/dist/engine/destroy.js.map +1 -1
  8. package/dist/engine/index.d.ts +1 -1
  9. package/dist/engine/inspect.d.ts +7 -1
  10. package/dist/engine/inspect.js +68 -8
  11. package/dist/engine/inspect.js.map +1 -1
  12. package/dist/engine/lease.d.ts +39 -7
  13. package/dist/engine/lease.js +85 -20
  14. package/dist/engine/lease.js.map +1 -1
  15. package/dist/engine/manual.d.ts +47 -0
  16. package/dist/engine/manual.js +124 -0
  17. package/dist/engine/manual.js.map +1 -0
  18. package/dist/engine/once.d.ts +26 -0
  19. package/dist/engine/once.js +48 -0
  20. package/dist/engine/once.js.map +1 -0
  21. package/dist/engine/plan.js +24 -5
  22. package/dist/engine/plan.js.map +1 -1
  23. package/dist/engine/prepare.d.ts +1 -1
  24. package/dist/engine/prepare.js +71 -11
  25. package/dist/engine/prepare.js.map +1 -1
  26. package/dist/engine/run-context.d.ts +8 -2
  27. package/dist/engine/run-context.js +11 -2
  28. package/dist/engine/run-context.js.map +1 -1
  29. package/dist/engine/types.d.ts +33 -2
  30. package/dist/errors.d.ts +11 -1
  31. package/dist/errors.js +10 -0
  32. package/dist/errors.js.map +1 -1
  33. package/dist/receipts/git-workdir.d.ts +5 -0
  34. package/dist/receipts/git-workdir.js +9 -2
  35. package/dist/receipts/git-workdir.js.map +1 -1
  36. package/dist/receipts/git.d.ts +4 -0
  37. package/dist/receipts/git.js +35 -1
  38. package/dist/receipts/git.js.map +1 -1
  39. package/dist/receipts/layout.d.ts +8 -0
  40. package/dist/receipts/layout.js +11 -0
  41. package/dist/receipts/layout.js.map +1 -1
  42. package/dist/receipts/local.d.ts +4 -0
  43. package/dist/receipts/local.js +15 -1
  44. package/dist/receipts/local.js.map +1 -1
  45. package/dist/resolve.d.ts +19 -2
  46. package/dist/resolve.js +12 -3
  47. package/dist/resolve.js.map +1 -1
  48. package/dist/testing/fake.d.ts +15 -2
  49. package/dist/testing/fake.js +69 -3
  50. package/dist/testing/fake.js.map +1 -1
  51. package/dist/types.d.ts +190 -8
  52. package/dist/types.js.map +1 -1
  53. package/package.json +5 -1
@@ -1,5 +1,7 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { Lease } from "./lease.js";
2
+ import { SponsonError } from "../errors.js";
3
+ import { Lease, withParentLock } from "./lease.js";
4
+ import { destroyManual } from "./manual.js";
3
5
  import { prepare, requireApproval } from "./prepare.js";
4
6
  import { receiptSkeleton, rereadLine, toRecord } from "./receipt.js";
5
7
  import { RunContext } from "./run-context.js";
@@ -26,14 +28,17 @@ export async function destroyRun(opts) {
26
28
  receipt.finishedAt = now().toISOString();
27
29
  return { receipt, drift: [], warnings: rc.warnings };
28
30
  }
31
+ checkUndoConfirm(rc, prepared);
29
32
  await locateIntents(rc, prepared);
33
+ const todos = [];
30
34
  for (const group of groups(rc.ledger).reverse())
31
- await destroyGroup(rc, prepared, receipt, group);
35
+ todos.push(...(await destroyGroup(rc, prepared, receipt, group, lease.holder, now().toISOString())));
32
36
  receipt.ledger = rc.ledger.toJSON();
33
- receipt.status = Object.values(receipt.lines).some((l) => l.status === "destroy_failed") ? "failed" : "complete";
37
+ const statuses = Object.values(receipt.lines).map((l) => l.status);
38
+ receipt.status = statuses.includes("destroy_failed") ? "failed" : statuses.includes("waiting") ? "partial" : "complete";
34
39
  receipt.finishedAt = now().toISOString();
35
40
  await lease.write(receipt);
36
- return { receipt, drift: [], warnings: rc.warnings };
41
+ return { receipt, drift: [], warnings: rc.warnings, ...(todos.length ? { manual: todos.reverse() } : {}) };
37
42
  }
38
43
  finally {
39
44
  const warning = await lease.release();
@@ -45,10 +50,17 @@ export async function destroyRun(opts) {
45
50
  * Destroy one line's resources: what Sponson created is deleted, adopted ones are forgotten, and an intent
46
51
  * nobody could locate fails the line (it may exist, and only a human can tell).
47
52
  */
48
- async function destroyGroup(rc, prepared, receipt, group) {
53
+ async function destroyGroup(rc, prepared, receipt, group, holder, at) {
49
54
  const head = group[0];
50
55
  const line = receipt.lines[head.line] ?? { id: head.line, adapter: head.adapter, op: head.op, status: "destroyed", createdBy: "sponson", resources: [], outputs: head.outputs ?? {} };
51
56
  receipt.lines[head.line] = line;
57
+ // Manual steps (ADR 0021): a person undoes them; there is nothing to delete at a provider.
58
+ const manual = group.filter((e) => e.createdBy === "sponson" && e.manual);
59
+ if (manual.length) {
60
+ const todos = destroyManual(rc, line, manual, at);
61
+ line.resources = rc.ledger.all().filter((x) => x.line === head.line).map(toRecord);
62
+ return todos;
63
+ }
52
64
  const ours = group.filter((e) => e.createdBy === "sponson");
53
65
  const adopted = group.filter((e) => e.createdBy === "adopted");
54
66
  const unknown = group.filter((e) => e.createdBy === "intent");
@@ -66,18 +78,38 @@ async function destroyGroup(rc, prepared, receipt, group) {
66
78
  line.status = "skipped";
67
79
  line.error = adopted.length ? "skipped: adopted resources are never destroyed" : "skipped: nothing created by Sponson";
68
80
  }
69
- return;
81
+ return [];
70
82
  }
71
- await deleteOurs(rc, prepared, line, head, ours);
83
+ await deleteOurs(rc, prepared, line, head, ours, holder);
72
84
  line.resources = rc.ledger.all().filter((x) => x.line === head.line).map(toRecord);
85
+ return [];
73
86
  }
74
- /** Delete what Sponson created for one line; a failure is recorded on the line, never thrown. */
75
- async function deleteOurs(rc, prepared, line, head, ours) {
87
+ /**
88
+ * `confirm` on destroy names manual steps whose undo a person did: lines of manual steps in the ledger (a line the
89
+ * plan no longer has included). It needs the person's name.
90
+ */
91
+ function checkUndoConfirm(rc, prepared) {
92
+ const confirm = rc.opts.confirm ?? [];
93
+ if (confirm.length === 0)
94
+ return;
95
+ if (!(rc.opts.confirmedBy ?? "").trim())
96
+ throw new SponsonError("USAGE", `Confirming the undo of ${confirm.map((l) => `\`${l}\``).join(", ")} needs the name of the person who did it (confirmedBy).`, { confirm });
97
+ const manual = new Set([...rc.ledger.all().filter((e) => e.manual).map((e) => e.line), ...prepared.ordered.filter((c) => prepared.ops.get(c.id).manual).map((c) => c.id)]);
98
+ const wrong = confirm.filter((id) => !manual.has(id));
99
+ if (wrong.length)
100
+ throw new SponsonError("USAGE", `Cannot confirm ${wrong.map((id) => `\`${id}\``).join(", ")}: only manual steps can be confirmed. Manual steps here: ${[...manual].join(", ") || "(none)"}`, { confirm: wrong });
101
+ }
102
+ /**
103
+ * Delete what Sponson created for one line; a failure is recorded on the line, never thrown. Resources inside a
104
+ * shared parent object are removed holding its lease (ADR 0019), found from the ledger, not the plan.
105
+ */
106
+ async function deleteOurs(rc, prepared, line, head, ours, holder) {
76
107
  try {
77
108
  const op = rc.opts.registry.op(head.adapter, head.op);
78
109
  const actx = rc.adapterContext(head.adapter, head.provider);
79
110
  actx.log(`destroy ${head.line}`);
80
- await op.destroy(actx, ours.map(toRecord));
111
+ const parent = ours.find((e) => e.parent)?.parent;
112
+ await withParentLock(rc.opts, holder, parent, rc.warnings, () => op.destroy(actx, ours.map(toRecord)));
81
113
  for (const e of ours)
82
114
  rc.ledger.delete(e);
83
115
  const survivors = await stillPresent(rc, prepared, head, ours);
@@ -1 +1 @@
1
- {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/engine/destroy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/engine/destroy.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@ export { planRun } from "./plan.js";
2
2
  export { applyRun } from "./apply.js";
3
3
  export { destroyRun } from "./destroy.js";
4
4
  export { Ledger, identity } from "./ledger.js";
5
- export type { RunOptions, PlanLine, PlanLineStatus, PlanResult, ApplyResultSummary } from "./types.js";
5
+ export type { RunOptions, PlanLine, PlanLineStatus, PlanResult, ApplyResultSummary, ManualTodo } from "./types.js";
6
6
  export { staleness, type AncestryCheck, type Staleness } from "./history.js";
@@ -1,9 +1,11 @@
1
1
  import { type LineOutputs, type ResolveResult } from "../resolve.js";
2
2
  import type { Change, Drift, LiveState, OpSpec, ResourceDiff } from "../types.js";
3
+ import { type ActionState } from "./action.js";
4
+ import { type ManualState } from "./manual.js";
3
5
  import type { RunContext } from "./run-context.js";
4
6
  /** Why apply would refuse a line, before writing anything. */
5
7
  export interface Refusal {
6
- code: "DRIFT_CHANGED" | "OWNED_BY_OTHER_SCOPE" | "SECRET_UNRESOLVED";
8
+ code: "DRIFT_CHANGED" | "OWNED_BY_OTHER_SCOPE" | "SECRET_UNRESOLVED" | "OUTPUT_UNAVAILABLE";
7
9
  message: string;
8
10
  }
9
11
  /** Everything known about one line without writing: the single source for both plan and apply. */
@@ -18,6 +20,10 @@ export interface Inspection {
18
20
  drift: Drift[];
19
21
  /** Keys this line declares (whatever exists live). */
20
22
  desired: Set<string>;
23
+ /** For a manual step whose inputs are known (ADR 0021): the step, and whether it is done. */
24
+ manual?: ManualState;
25
+ /** For a one-off action whose trigger is known (ADR 0022): its ledger key, trigger hash, and whether it runs. */
26
+ action?: ActionState;
21
27
  }
22
28
  /**
23
29
  * Read one line's live state and judge it against the ledger.
@@ -1,21 +1,28 @@
1
+ import { isSponsonError } from "../errors.js";
1
2
  import { resolveParams } from "../resolve.js";
3
+ import { inspectAction } from "./action.js";
4
+ import { inspectManual } from "./manual.js";
5
+ import { holdsCurrentValue } from "./once.js";
2
6
  /**
3
7
  * Read one line's live state and judge it against the ledger.
4
8
  * Secrets were resolved up front, so diffs compare real values (a rotated secret shows as an update).
5
9
  */
6
10
  export async function inspectLine(rc, change, op, params, outputs) {
7
- const provider = rc.provider(change.adapter);
8
- const resolved = resolveParams(params, outputs, rc.secrets.values);
11
+ const provider = rc.provider(change);
12
+ const resolved = resolveParams(params, outputs, rc.secrets.values, (ref, line, output) => holdsCurrentValue(rc.ledger.all(), change.id, ref, line, output));
13
+ if (op.manual)
14
+ return inspectManual(rc, change, op, provider, resolved);
15
+ if (op.action)
16
+ return withSecretRefusal(rc, inspectAction(rc, change, op, provider, resolved));
9
17
  const live = await op.read(rc.adapterContext(change.adapter, provider), resolved.params);
10
18
  if (live)
11
19
  rc.guardOutputs(live.outputs, op.outputs);
12
- const diffs = op.diff(live, resolved.params).map((d) => scrubDiff(rc, d));
20
+ const spent = diffOrSpent(change, op, live, resolved, changedOutside(rc, change, provider, live));
21
+ const diffs = spent.diffs.map((d) => scrubDiff(rc, d));
13
22
  const inspection = { change, op, provider, resolved, live, diffs, drift: [], desired: new Set(diffs.map((d) => d.key)) };
14
- const missingSecret = resolved.secrets.find((s) => rc.secrets.failures.has(s.ref));
15
- if (missingSecret) {
16
- // The one place a secret failure gets its reference: sources throw the reason only, so it is never named twice.
17
- inspection.refusal = { code: "SECRET_UNRESOLVED", message: `${missingSecret.ref}: ${rc.secrets.failures.get(missingSecret.ref)}` };
18
- }
23
+ if (spent.refusal)
24
+ inspection.refusal = spent.refusal;
25
+ withSecretRefusal(rc, inspection);
19
26
  const byKey = new Map((live?.resources ?? []).map((r) => [r.key, r]));
20
27
  for (const d of diffs) {
21
28
  const verdict = judge(rc, change, provider, d, byKey.get(d.key));
@@ -27,6 +34,59 @@ export async function inspectLine(rc, change, op, params, outputs) {
27
34
  }
28
35
  return inspection;
29
36
  }
37
+ /** Refuse the line (SECRET_UNRESOLVED) when a secret it uses could not be resolved. */
38
+ function withSecretRefusal(rc, inspection) {
39
+ const missingSecret = inspection.resolved.secrets.find((s) => rc.secrets.failures.has(s.ref));
40
+ if (missingSecret) {
41
+ // The one place a secret failure gets its reference: sources throw the reason only, so it is never named twice.
42
+ inspection.refusal = { code: "SECRET_UNRESOLVED", message: `${missingSecret.ref}: ${rc.secrets.failures.get(missingSecret.ref)}` };
43
+ }
44
+ return inspection;
45
+ }
46
+ /**
47
+ * The line's diffs. A spent `once` output reaches the line as `{ keep: true }` only when the ledger shows the line
48
+ * holds the current value (`holdsCurrentValue`). The line is refused, naming the output, when it cannot be shown to
49
+ * hold it (added later, or the producer was adopted), was edited outside Sponson since (keep would accept the edit),
50
+ * or would have to write the value (its resource is missing, or its adapter rejects the keep marker as
51
+ * PARAM_INVALID, as `diffValue` does): no later run has the value.
52
+ */
53
+ function diffOrSpent(change, op, live, resolved, edited) {
54
+ const spent = resolved.spent[0];
55
+ if (!spent)
56
+ return { diffs: op.diff(live, resolved.params) };
57
+ const refuse = (why, diffs = []) => ({ diffs, refusal: outputUnavailable(change, spent, why) });
58
+ const unproven = resolved.spent.find((s) => !s.kept);
59
+ if (unproven)
60
+ return { diffs: op.diff(live, resolved.params), refusal: outputUnavailable(change, unproven, "this line was not written with the current value") };
61
+ if (edited)
62
+ return refuse("this line was changed outside Sponson since it was written with it, so keeping what is there would keep the edit");
63
+ if (!live)
64
+ return refuse("this line's resource does not exist and would have to be written with it");
65
+ try {
66
+ const diffs = op.diff(live, resolved.params);
67
+ return diffs.some((d) => d.kind === "create") ? refuse("this line would have to create a resource with it", diffs) : { diffs };
68
+ }
69
+ catch (e) {
70
+ if (!isSponsonError(e) || e.code !== "PARAM_INVALID")
71
+ throw e;
72
+ return refuse("this line would have to be written with it");
73
+ }
74
+ }
75
+ function outputUnavailable(change, spent, why) {
76
+ return {
77
+ code: "OUTPUT_UNAVAILABLE",
78
+ message: `\`${change.id}\` needs \`${spent.ref}\`, which the provider reveals only when \`${spent.line}\` creates its resource, and that happened in an earlier run; ${why}. ` +
79
+ `Nothing was written. To pass a new value on, make \`${spent.line}\` create a new one: recreate it (recreate), delete it in the provider (the next apply re-creates it) or give it a new name in the plan. ` +
80
+ `Or keep the value in a secret manager and reference it with \`{ secret: … }\`.`,
81
+ };
82
+ }
83
+ /** Whether a resource of the line was changed outside Sponson since it was last written (its hash moved). */
84
+ function changedOutside(rc, change, provider, live) {
85
+ return (live?.resources ?? []).some((r) => {
86
+ const e = rc.ledger.get(change.adapter, provider, r.key);
87
+ return e !== undefined && e.createdBy !== "intent" && e.hash !== "" && rc.ledger.keyed(r.hash) !== e.hash;
88
+ });
89
+ }
30
90
  /**
31
91
  * Judge one resource of a line: `d` is its diff, `live` what exists now (undefined: nothing does). Pure: reads
32
92
  * the ledger and the run's options, writes nothing.
@@ -1 +1 @@
1
- {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/engine/inspect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/engine/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAwC,MAAM,eAAe,CAAC;AAEpF,OAAO,EAAE,aAAa,EAAoB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAoB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AA2B9C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAc,EAAE,MAAc,EAAE,EAAU,EAAE,MAA+B,EAAE,OAAiC;IAC9I,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5J,IAAI,EAAE,CAAC,MAAM;QAAE,OAAO,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxE,IAAI,EAAE,CAAC,MAAM;QAAE,OAAO,iBAAiB,CAAC,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzF,IAAI,IAAI;QAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAClG,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,UAAU,GAAe,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IACrI,IAAI,KAAK,CAAC,OAAO;QAAE,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IACtD,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAElC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAyB,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,KAAK;YAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD,2FAA2F;QAC3F,IAAI,OAAO,CAAC,OAAO;YAAE,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC;IAC9D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,uFAAuF;AACvF,SAAS,iBAAiB,CAAC,EAAc,EAAE,UAAsB;IAC/D,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9F,IAAI,aAAa,EAAE,CAAC;QAClB,gHAAgH;QAChH,UAAU,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,GAAG,KAAK,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACrI,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,MAAc,EAAE,EAAU,EAAE,IAAsB,EAAE,QAAuB,EAAE,MAAe;IAC/G,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IAC7D,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,QAAwB,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACxH,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,kDAAkD,CAAC,EAAE,CAAC;IACjK,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,kHAAkH,CAAC,CAAC;IAC9I,IAAI,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC,0EAA0E,CAAC,CAAC;IACrG,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,mDAAmD,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IACjI,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe;YAAE,MAAM,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,4CAA4C,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,KAAqC,EAAE,GAAW;IAC3F,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EACL,KAAK,MAAM,CAAC,EAAE,cAAc,KAAK,CAAC,GAAG,8CAA8C,KAAK,CAAC,IAAI,iEAAiE,GAAG,IAAI;YACrK,uDAAuD,KAAK,CAAC,IAAI,2IAA2I;YAC5M,gFAAgF;KACnF,CAAC;AACJ,CAAC;AAED,6GAA6G;AAC7G,SAAS,cAAc,CAAC,EAAc,EAAE,MAAc,EAAE,QAAiC,EAAE,IAAsB;IAC/G,OAAO,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACxC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACzD,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;IAC5G,CAAC,CAAC,CAAC;AACL,CAAC;AAQD;;;GAGG;AACH,SAAS,KAAK,CAAC,EAAc,EAAE,MAAc,EAAE,QAAiC,EAAE,CAAe,EAAE,IAAgC;IACjI,8FAA8F;IAC9F,MAAM,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACrF,IAAI,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,0BAA0B,OAAO,8CAA8C,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,EAAE,CAAC;IAC3L,CAAC;IAED,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;IACjC,MAAM,EAAE,GAAG,CAAC,EAAsB,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3H,MAAM,MAAM,GAAG,CAAC,OAAe,EAAW,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAExH,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,qEAAqE,EAAE,EAAE,CAAC;IAC7I,CAAC;IACD,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,8JAA8J,EAAE;YAC3O,GAAG,MAAM,CAAC,GAAG,KAAK,0HAA0H,CAAC;SAC9I,CAAC;IACJ,CAAC;IACD,oGAAoG;IACpG,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9E,OAAO;YACL,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,uGAAuG,EAAE;YACpK,GAAG,MAAM,CAAC,GAAG,KAAK,uHAAuH,CAAC;SAC3I,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,EAAc,EAAE,CAAe;IAChD,MAAM,KAAK,GAAG,CAAC,IAA0B,EAAwB,EAAE,CACjE,IAAI,EAAE,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACpI,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACtI,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,SAAS,CAAC,UAAsB,EAAE,GAAwB;IACxE,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,yDAAyD;IACnG,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,IAAI,EAAE,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACrH,CAAC"}
@@ -1,16 +1,34 @@
1
- import { type LockInfo, type Receipt } from "../types.js";
1
+ import { type LockInfo, type Receipt, type ReceiptStore } from "../types.js";
2
2
  import type { RunOptions } from "./types.js";
3
+ /** What a lease locks: the run's scope, or a shared parent object (ADR 0019). Same semantics, different key. */
4
+ export interface LockTarget {
5
+ /** For messages: `preview/pr-42`, or `parent object auth0:acme:client:abc`. */
6
+ readonly label: string;
7
+ /** Set for a parent-object lock: its identity. */
8
+ readonly parent?: string;
9
+ acquire(holder: string, ttlMs: number): Promise<LockInfo | null>;
10
+ renew(holder: string, ttlMs: number): Promise<void>;
11
+ release(holder: string): Promise<void>;
12
+ }
13
+ /** The scope lock of the run. */
14
+ export declare function scopeTarget(opts: RunOptions): LockTarget;
15
+ /**
16
+ * The lock of a shared parent object, across every scope and environment. A store that does not implement the
17
+ * parent-lock methods gets them from its scope-lock methods under the reserved environment (the same layout).
18
+ */
19
+ export declare function parentTarget(store: ReceiptStore, parent: string): LockTarget;
3
20
  /**
4
- * The scope lock held as a lease: renewed in the background while the run works, and
5
- * every receipt write is fenced on it. A run that lost its lease stops before writing.
21
+ * A lock held as a lease (the scope's, or a parent object's): renewed in the background while the run works, and
22
+ * every receipt write is fenced on the scope's lease. A run that lost its lease stops before writing.
6
23
  *
7
24
  * The holder also keeps its own view of when the lease runs out (measured from when each
8
25
  * acquire/renew was *sent*). Once a slow store has let that get close, the holder stops on its
9
26
  * own: another run may legitimately take an expired lock, and the store's verdict on a late
10
- * renewal arrives too late to prevent two runs writing to the same scope.
27
+ * renewal arrives too late to prevent two runs writing to the same scope (or parent object).
11
28
  */
12
29
  export declare class Lease {
13
30
  private readonly opts;
31
+ private readonly target;
14
32
  readonly holder: string;
15
33
  readonly preempted: LockInfo | null;
16
34
  private readonly ttl;
@@ -20,7 +38,13 @@ export declare class Lease {
20
38
  /** Local deadline after which another run may have taken the lock. */
21
39
  private validUntil;
22
40
  private constructor();
23
- static acquire(opts: RunOptions, holder: string): Promise<Lease>;
41
+ /**
42
+ * Take the lock of `target` (the run's scope by default) or fail with LOCK_HELD; when `wait` (by default the
43
+ * run's `wait` option), poll until it is free or the wait times out.
44
+ */
45
+ static acquire(opts: RunOptions, holder: string, target?: LockTarget, wait?: boolean): Promise<Lease>;
46
+ /** The parent object this lease locks; undefined for the scope lock. */
47
+ get parent(): string | undefined;
24
48
  /**
25
49
  * Renewal paces itself: the next renewal is scheduled only after the previous one finished.
26
50
  * A fixed interval would queue renewals faster than a slow store (a git push under load) can
@@ -28,7 +52,7 @@ export declare class Lease {
28
52
  */
29
53
  private startRenewing;
30
54
  /**
31
- * Guard for writes to PROVIDERS, which cannot be fenced: throw LOCK_LOST when another run took the scope, or
55
+ * Guard for writes to PROVIDERS, which cannot be fenced: throw LOCK_LOST when another run took the lock, or
32
56
  * could have by now because our renewals stopped getting through (the holder's own deadline).
33
57
  */
34
58
  assertHeld(): void;
@@ -42,8 +66,16 @@ export declare class Lease {
42
66
  writeIfStillHeld(receipt: Receipt): Promise<boolean>;
43
67
  /**
44
68
  * Stop renewing and release the lock, retrying a failed release a few times. Returns a warning when it still
45
- * failed: the scope then stays locked until the lease expires, and the user must be told, not left to find out
69
+ * failed: the lock then stays held until the lease expires, and the user must be told, not left to find out
46
70
  * from the next run's LOCK_HELD.
47
71
  */
48
72
  release(): Promise<string | undefined>;
49
73
  }
74
+ /**
75
+ * Run `fn` holding the lease of the shared parent object `parent` (ADR 0019), or without any when `parent` is
76
+ * undefined. The lease is released in every case; a release that keeps failing becomes a warning, as for the scope
77
+ * lock. `wait` defaults to the run's `wait` option.
78
+ */
79
+ export declare function withParentLock<T>(opts: RunOptions, holder: string, parent: string | undefined, warnings: string[], fn: (lease: Lease | null) => Promise<T>, wait?: boolean): Promise<T>;
80
+ /** True for the LOCK_LOST of a parent-object lease: the line stops, the scope (and its receipt) is still ours. */
81
+ export declare function isParentLockLoss(e: unknown): boolean;
@@ -1,17 +1,43 @@
1
1
  import { setTimeout as sleep } from "node:timers/promises";
2
2
  import { SponsonError } from "../errors.js";
3
+ import { PARENT_LOCKS_ENVIRONMENT, parentLockScope } from "../receipts/layout.js";
3
4
  import { LockHeldError, LockLostError } from "../types.js";
5
+ /** The scope lock of the run. */
6
+ export function scopeTarget(opts) {
7
+ const { store, ctx } = opts;
8
+ return {
9
+ label: `${ctx.env}/${ctx.scope}`,
10
+ acquire: (holder, ttl) => store.acquireLock(ctx.env, ctx.scope, holder, ttl),
11
+ renew: (holder, ttl) => store.renewLock(ctx.env, ctx.scope, holder, ttl),
12
+ release: (holder) => store.releaseLock(ctx.env, ctx.scope, holder),
13
+ };
14
+ }
15
+ /**
16
+ * The lock of a shared parent object, across every scope and environment. A store that does not implement the
17
+ * parent-lock methods gets them from its scope-lock methods under the reserved environment (the same layout).
18
+ */
19
+ export function parentTarget(store, parent) {
20
+ const scope = parentLockScope(parent);
21
+ return {
22
+ label: `parent object ${parent}`,
23
+ parent,
24
+ acquire: (holder, ttl) => (store.acquireParentLock ? store.acquireParentLock(parent, holder, ttl) : store.acquireLock(PARENT_LOCKS_ENVIRONMENT, scope, holder, ttl)),
25
+ renew: (holder, ttl) => (store.renewParentLock ? store.renewParentLock(parent, holder, ttl) : store.renewLock(PARENT_LOCKS_ENVIRONMENT, scope, holder, ttl)),
26
+ release: (holder) => (store.releaseParentLock ? store.releaseParentLock(parent, holder) : store.releaseLock(PARENT_LOCKS_ENVIRONMENT, scope, holder)),
27
+ };
28
+ }
4
29
  /**
5
- * The scope lock held as a lease: renewed in the background while the run works, and
6
- * every receipt write is fenced on it. A run that lost its lease stops before writing.
30
+ * A lock held as a lease (the scope's, or a parent object's): renewed in the background while the run works, and
31
+ * every receipt write is fenced on the scope's lease. A run that lost its lease stops before writing.
7
32
  *
8
33
  * The holder also keeps its own view of when the lease runs out (measured from when each
9
34
  * acquire/renew was *sent*). Once a slow store has let that get close, the holder stops on its
10
35
  * own: another run may legitimately take an expired lock, and the store's verdict on a late
11
- * renewal arrives too late to prevent two runs writing to the same scope.
36
+ * renewal arrives too late to prevent two runs writing to the same scope (or parent object).
12
37
  */
13
38
  export class Lease {
14
39
  opts;
40
+ target;
15
41
  holder;
16
42
  preempted;
17
43
  ttl;
@@ -20,34 +46,46 @@ export class Lease {
20
46
  released = false;
21
47
  /** Local deadline after which another run may have taken the lock. */
22
48
  validUntil;
23
- constructor(opts, holder, preempted, ttl, sentAt) {
49
+ constructor(opts, target, holder, preempted, ttl, sentAt) {
24
50
  this.opts = opts;
51
+ this.target = target;
25
52
  this.holder = holder;
26
53
  this.preempted = preempted;
27
54
  this.ttl = ttl;
28
55
  this.validUntil = sentAt + ttl;
29
56
  }
30
- static async acquire(opts, holder) {
57
+ /**
58
+ * Take the lock of `target` (the run's scope by default) or fail with LOCK_HELD; when `wait` (by default the
59
+ * run's `wait` option), poll until it is free or the wait times out.
60
+ */
61
+ static async acquire(opts, holder, target = scopeTarget(opts), wait = opts.wait === true) {
31
62
  const ttl = opts.lockTtlMs ?? 15 * 60 * 1000;
32
63
  const deadline = Date.now() + (opts.waitTimeoutMs ?? 10 * 60 * 1000);
33
64
  for (;;) {
34
65
  try {
35
66
  const sentAt = Date.now();
36
- const preempted = await opts.store.acquireLock(opts.ctx.env, opts.ctx.scope, holder, ttl);
37
- const lease = new Lease(opts, holder, preempted, ttl, sentAt);
67
+ const preempted = await target.acquire(holder, ttl);
68
+ const lease = new Lease(opts, target, holder, preempted, ttl, sentAt);
38
69
  lease.startRenewing();
39
70
  return lease;
40
71
  }
41
72
  catch (e) {
42
73
  if (!(e instanceof LockHeldError))
43
74
  throw e;
44
- if (!opts.wait || Date.now() > deadline) {
45
- throw new SponsonError("LOCK_HELD", `Another run (${e.lock.holder}) holds the lock for ${opts.ctx.env}/${opts.ctx.scope} until ${e.lock.expiresAt}. Wait for it, or run again with waiting enabled (wait).`, { lock: e.lock });
75
+ if (!wait || Date.now() > deadline) {
76
+ throw new SponsonError("LOCK_HELD", `Another run (${e.lock.holder}) holds the lock for ${target.label} until ${e.lock.expiresAt}. Wait for it, or run again with waiting enabled (wait).`, {
77
+ lock: e.lock,
78
+ ...(target.parent ? { parent: target.parent } : {}),
79
+ });
46
80
  }
47
81
  await sleep(opts.pollIntervalMs ?? 2000);
48
82
  }
49
83
  }
50
84
  }
85
+ /** The parent object this lease locks; undefined for the scope lock. */
86
+ get parent() {
87
+ return this.target.parent;
88
+ }
51
89
  /**
52
90
  * Renewal paces itself: the next renewal is scheduled only after the previous one finished.
53
91
  * A fixed interval would queue renewals faster than a slow store (a git push under load) can
@@ -58,8 +96,8 @@ export class Lease {
58
96
  const tick = () => {
59
97
  this.timer = setTimeout(() => {
60
98
  const sentAt = Date.now();
61
- this.opts.store
62
- .renewLock(this.opts.ctx.env, this.opts.ctx.scope, this.holder, this.ttl)
99
+ this.target
100
+ .renew(this.holder, this.ttl)
63
101
  .then(() => {
64
102
  this.validUntil = sentAt + this.ttl;
65
103
  })
@@ -77,15 +115,15 @@ export class Lease {
77
115
  tick();
78
116
  }
79
117
  /**
80
- * Guard for writes to PROVIDERS, which cannot be fenced: throw LOCK_LOST when another run took the scope, or
118
+ * Guard for writes to PROVIDERS, which cannot be fenced: throw LOCK_LOST when another run took the lock, or
81
119
  * could have by now because our renewals stopped getting through (the holder's own deadline).
82
120
  */
83
121
  assertHeld() {
84
122
  if (this.lost)
85
- throw lockLost(this.lost);
123
+ throw lockLost(this.lost, this.target);
86
124
  const margin = this.ttl / 5;
87
125
  if (Date.now() >= this.validUntil - margin) {
88
- throw lockLost(new LockLostError(this.holder, null), "the lease was about to expire because renewals were not getting through");
126
+ throw lockLost(new LockLostError(this.holder, null), this.target, `the lease${this.target.parent ? ` on ${this.target.label}` : ""} was about to expire because renewals were not getting through`);
89
127
  }
90
128
  }
91
129
  /**
@@ -95,13 +133,13 @@ export class Lease {
95
133
  */
96
134
  async write(receipt) {
97
135
  if (this.lost)
98
- throw lockLost(this.lost);
136
+ throw lockLost(this.lost, this.target);
99
137
  try {
100
138
  await this.opts.store.write(receipt, { holder: this.holder });
101
139
  }
102
140
  catch (e) {
103
141
  if (e instanceof LockLostError)
104
- throw lockLost(e);
142
+ throw lockLost(e, this.target);
105
143
  throw e;
106
144
  }
107
145
  }
@@ -117,7 +155,7 @@ export class Lease {
117
155
  }
118
156
  /**
119
157
  * Stop renewing and release the lock, retrying a failed release a few times. Returns a warning when it still
120
- * failed: the scope then stays locked until the lease expires, and the user must be told, not left to find out
158
+ * failed: the lock then stays held until the lease expires, and the user must be told, not left to find out
121
159
  * from the next run's LOCK_HELD.
122
160
  */
123
161
  async release() {
@@ -127,7 +165,7 @@ export class Lease {
127
165
  let last;
128
166
  for (let attempt = 0; attempt < 3; attempt++) {
129
167
  try {
130
- await this.opts.store.releaseLock(this.opts.ctx.env, this.opts.ctx.scope, this.holder);
168
+ await this.target.release(this.holder);
131
169
  return undefined;
132
170
  }
133
171
  catch (e) {
@@ -136,10 +174,37 @@ export class Lease {
136
174
  }
137
175
  }
138
176
  const until = new Date(this.validUntil).toISOString();
139
- return `Could not release the lock for ${this.opts.ctx.env}/${this.opts.ctx.scope} (${last instanceof Error ? last.message : String(last)}); it stays held until about ${until}, and runs on this scope get LOCK_HELD until then.`;
177
+ const who = this.target.parent ? "runs writing this parent object" : "runs on this scope";
178
+ return `Could not release the lock for ${this.target.label} (${last instanceof Error ? last.message : String(last)}); it stays held until about ${until}, and ${who} get LOCK_HELD until then.`;
140
179
  }
141
180
  }
142
- function lockLost(e, why) {
181
+ /**
182
+ * Run `fn` holding the lease of the shared parent object `parent` (ADR 0019), or without any when `parent` is
183
+ * undefined. The lease is released in every case; a release that keeps failing becomes a warning, as for the scope
184
+ * lock. `wait` defaults to the run's `wait` option.
185
+ */
186
+ export async function withParentLock(opts, holder, parent, warnings, fn, wait) {
187
+ if (!parent)
188
+ return fn(null);
189
+ const lease = await Lease.acquire(opts, holder, parentTarget(opts.store, parent), wait);
190
+ try {
191
+ return await fn(lease);
192
+ }
193
+ finally {
194
+ const warning = await lease.release();
195
+ if (warning)
196
+ warnings.push(warning);
197
+ }
198
+ }
199
+ /** True for the LOCK_LOST of a parent-object lease: the line stops, the scope (and its receipt) is still ours. */
200
+ export function isParentLockLoss(e) {
201
+ return e instanceof SponsonError && e.code === "LOCK_LOST" && typeof e.details.parent === "string";
202
+ }
203
+ function lockLost(e, target, why) {
204
+ if (target.parent) {
205
+ const what = why ? `This line stopped: ${why}` : `The lock for ${target.label} is no longer held by ${e.holder}${e.current ? ` (now ${e.current.holder})` : ""}`;
206
+ return new SponsonError("LOCK_LOST", `${what}. The line stopped before writing further.`, { holder: e.holder, current: e.current, parent: target.parent });
207
+ }
143
208
  const what = why ? `This run stopped: ${why}` : e.message;
144
209
  return new SponsonError("LOCK_LOST", `${what}. This run stopped without writing further; the other run's receipt is authoritative. Re-run plan to see the current state.`, {
145
210
  holder: e.holder,
@@ -1 +1 @@
1
- {"version":3,"file":"lease.js","sourceRoot":"","sources":["../../src/engine/lease.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lease.js","sourceRoot":"","sources":["../../src/engine/lease.ts"],"names":[],"mappings":"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"}