(assetId, deps, prepared)
| 693 | } |
| 694 | |
| 695 | function markHubProvenance(assetId, deps, prepared) { |
| 696 | if (!assetId) throw new ContractError('internal_error', 'provenance write failed'); |
| 697 | const target = prepared || prepareHubProvenance(deps); |
| 698 | const line = JSON.stringify({ |
| 699 | assetId, |
| 700 | source: 'hub', |
| 701 | trusted: false, |
| 702 | at: new Date().toISOString(), |
| 703 | }) + '\n'; |
| 704 | try { |
| 705 | fs.appendFileSync(target.file, line, 'utf8'); |
| 706 | target.entry = line; |
| 707 | } catch (_) { |
| 708 | throw new ContractError('internal_error', 'provenance write failed'); |
| 709 | } |
| 710 | } |
| 711 | |
| 712 | function rollbackHubProvenance(prepared) { |
| 713 | if (!prepared || !prepared.file) return; |
no test coverage detected