OverviewFilesCommitsIssuesDocsReleasesPeers

pear-git / scripts / old-apply / deploy-apply.js

78 lines · javascript ref:
/**
 * 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()
}