Session.undo ​Contract 2.0.0 · package sha256
a857eca95b35921109faf997094bb4192f12527d9d0fcd4be7e97f06425bad6e· generated fromconfigurator-runtime.d.tsbyservices/onsite-scripter/scripts/build-contract-docs.mjs; edit the source, not this file.
Method of Session · inherited by testing.FakeSession · stable · since 2.0.0 · called as session.undo
undo(options?: WriteOptions): Promise<Report>;
Undoes the last committed step (recorded). In the write queue: it runs after the writes called
before it. An undo that needs no load commits before the next frame. It ends an open
history.group() at its call, so at its turn it undoes the group's whole step.
Outcome: 'committed', or 'refused' with reason 'empty'. It always moves the history pointer:
a step whose change is look-only commits look-only; a step whose result equals the current
state (its owner was disposed) resolves 'committed' with changed: false, lists
'owner-disposed' in problems and fires only
'history:changed' (spec section 6.1, O9). A reload that fails is not equal: the undo commits
with the node back in the model, unloaded, and 'asset-failed' in problems (spec section 6.4).
The one exception: when applying it fails inside the runtime, it resolves 'rolled-back' with
reason 'internal-error' and the pointer and the step stay where they were (spec section 6.4).
Errors: never rejects for an empty history (that is 'refused' / 'empty'); rejects AbortError
when signal aborts first.
| Option | Type | Default | What it does |
|---|---|---|---|
actor |
Actor |
the expectGroup's actor when one is given, else 'app' |
Who made the write. |
dryRun |
boolean |
false | Runs and reports, then rolls back by design ('dry-run'). |
expectGroup |
HistoryGroup |
undefined | A guard, checked at the call: this write belongs to the undo group you are running. |
expectRevision |
number |
undefined (no check) | If-match on session.revision. |
origin |
string |
null | Your tag, echoed unchanged in Report.origin and cause.origin. |
signal |
AbortSignal |
undefined | Cancels this call; the member's JSDoc says what an abort does. |
supersede |
boolean |
false (the write is queued behind the transaction and applies after it closes) | While a transaction is open: roll it back (it resolves 'superseded'); the writes queued behind it apply in call order, then this one, which supersedes an… |
undo |
'rebase' | (string & {}) |
a recorded-state change gets one step labelled 'Change'; a look-only write gets none; the session's first model (cause 'load') gets none, whatever the label: it is the floor of history | An undo label makes this write one undo step. |
signal) ​This call is a write (SignalOption.signal, the kinds of call).
A write: before the commit point it rolls back and rejects AbortError; after it, no effect, except that a running camera move stops where the last frame drew it (
CameraMoveOptions).Through a
txthe commit point is the transaction's: aborting a write still loading rejects AbortError and stages nothing (catch it: unobserved, it rolls the transaction back, spec section 6.1, O6); aborting one already staged unstages it, its paths keeping the latest other write to them as after a failed savepoint (O7), and its Promise stays resolved 'staged'.
Imports: values (has, validate, the Holo*Error classes, the pure helpers) from @holostep-configurators/runtime-client, types from @holostep-configurators/runtime-client/contract, /math and /testing names from those entries; boot from the runtime module the root's loadRuntimeAtFloor resolves to. A type your page defines is your app's: declare it there, never import it from the package.
Compiled under the contract's strict settings (examples/declaration/05-Session.undo.ts):
import type { Session } from '@holostep-configurators/runtime-client/contract';
declare const session: Session;
declare const signal: AbortSignal;
declare const undoButton: HTMLButtonElement;
undoButton.addEventListener('click', () => {
// 'refused' / 'empty' when there is nothing to undo
void session.undo({ actor: 'shopper', origin: 'undo-button' });
}, { signal });
session.on('history:changed', ({ canUndo, undoLabel }) => {
undoButton.disabled = !canUndo;
undoButton.title = undoLabel ? `Undo ${undoLabel}` : '';
}, { signal });
| Rule | Result |
|---|---|
| 1. Neutral name | pass: undo names no product |
| 2. A precedent | pass: ProseMirror history (addToHistory) (row K62); Unity Undo (row K62) |
| 3. Two apps, or labs | pass: 20 apps (ledger: app-04c2774145, app-4762caacdc, app-f9a32142f1; fleet cross-check: app-04c2774145, app-37356bf09f, app-4762caacdc, app-4fd23bc869, app-822bb9d6aa, app-8675b3225c, app-b362a81c85, app-bcb7ef21da and 12 more) |
| 4. The cheaper fix first | decided per need in Appendix B: rows K62 at tier stable (a member only where no rule, data, asset or app code serves the need) |