/**
* Deterministic Apply Function for SharedDeployRegistry Autobase
*
* Processes linearized operations and updates the Hyperbee view.
* This function MUST be fully deterministic — it may be called
* multiple times as Autobase reorders causal forks.
*
* View schema (Hyperbee keys):
* app:{repoName} → { repoName, channel, commitHash, branch, deployedBy, deployedAt }
* deploy-log:{repoName}:{timestamp} → { repoName, serverKey, commitHash, branch, channel, timestamp }
* server:{serverKey} → { serverKey, instanceUrl, status, registeredAt }
*/
import { decodeOp } from './deploy-operations.js'
/**
* Apply function for Autobase
*
* @param {Array} nodes - Linearized operation nodes
* @param {Hyperbee} view - Hyperbee view to update
* @param {Object} host - Autobase host (for addWriter/removeWriter)
*/
export async function apply (nodes, view, host) {
const batch = view.batch()
for (const node of nodes) {
const op = decodeOp(node.value)
switch (op.type) {
case 'register-server': {
await batch.put(`server:${op.serverKey}`, {
serverKey: op.serverKey,
instanceUrl: op.instanceUrl || null,
hostname: op.hostname || null,
status: 'active',
registeredAt: op.timestamp || 0
})
break
}
case 'deploy-complete': {
// Update current app state (last-writer-wins via Autobase linearization)
await batch.put(`app:${op.repoName}`, {
repoName: op.repoName,
channel: op.channel || op.repoName,
commitHash: op.commitHash,
branch: op.branch,
deployedBy: op.serverKey || null,
deployedAt: op.timestamp || 0
})
// Append to deploy log (immutable history)
const ts = op.timestamp || 0
await batch.put(`deploy-log:${op.repoName}:${ts}`, {
repoName: op.repoName,
serverKey: op.serverKey || null,
commitHash: op.commitHash,
branch: op.branch,
channel: op.channel || op.repoName,
timestamp: ts
})
break
}
case 'add-writer': {
try {
await host.addWriter(Buffer.from(op.writerKey, 'hex'), { indexer: true })
} catch (err) {
console.error(`[Deploy:apply] add-writer failed for ${op.writerKey.slice(0, 16)}...: ${err.message}`)
}
break
}
}
}
await batch.flush()
}