(tableId: string, rowId: string)
| 13 | * ownership of a row's full workflow-group cascade — only the owner advances |
| 14 | * the row through its eligible groups. */ |
| 15 | export function cascadeLockKey(tableId: string, rowId: string): string { |
| 16 | return `table:cascade:${tableId}:${rowId}` |
| 17 | } |
| 18 | |
| 19 | /** |
| 20 | * Run `fn` while holding the row's cascade lock, with a heartbeat extending |