Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
5.3 kB · 158 lines
TypeScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159import * as Effect from "effect/Effect";import type { InstallationConfig } from "../configuration/customer.ts";import type { Artifact } from "./artifact-types.ts";import { ReauthorizationRequired, RecoveryRequired, ResourceConflict, type DeploymentFailure,} from "./deployment-errors.ts";import { eq } from "./deployment-values.ts";import type { Deployment } from "./deployment.ts";import type { RegistryFailure } from "./installation-errors.ts";import type { InstallationOperation } from "./operation.ts";import type { WorkerAPI } from "./worker-api.ts";
type WorkerOperations = Pick<Deployment, "observe"> & { worker: Pick< WorkerAPI, | "settings" | "configuration" | "activeDeployment" | "upload" | "verifyWorker" | "verifyContent" | "namespaces" >;};
interface WorkerUpload { artifact: Artifact; config: InstallationConfig; operation: InstallationOperation; bootstrapSecret: string | null; recordIntent: Effect.Effect<void, DeploymentFailure | RegistryFailure>;}
export function uploadWorker(api: WorkerOperations, input: WorkerUpload) { return Effect.gen(function* () { const { artifact, config, operation, bootstrapSecret, recordIntent } = input; const settings = yield* api.worker.settings(); const baseline = operation.upgrade; if (!baseline) { if (settings) { // Adoption requires the intent written before the original upload. if (!operation.workerIntent) return yield* new ResourceConflict(); yield* api.worker.verifyWorker(settings, config); yield* api.worker.verifyContent(artifact); return; } if (operation.workerIntent) return yield* new RecoveryRequired(); if (!bootstrapSecret) return yield* new ReauthorizationRequired(); yield* api.worker.upload( artifact, config, { kind: "bootstrap", secret: bootstrapSecret }, recordIntent, ); return; }
if (!settings) return yield* new ResourceConflict(); const existing = yield* api.worker.configuration(settings); if (existing.release?.artifactDigest === artifact.identity.artifactDigest) { if (!operation.workerIntent) return yield* new ResourceConflict(); const adopted = yield* api.observe( artifact, operation.workerIntent.operationId, operation.workerIntent.configDigest, ); if (adopted.fingerprint !== baseline.fingerprint) return yield* new ResourceConflict(); return; } const source = { ...artifact, identity: baseline.fromRelease }; const observeSource = () => api.observe(source, baseline.deployedOperationId, baseline.configDigest, { kind: "source", hash: baseline.sourceCodeHash, }); const observed = yield* observeSource(); if ( !eq( { versionId: observed.versionId, deploymentId: observed.deploymentId, fingerprint: observed.fingerprint, containerFingerprint: observed.containerFingerprint, sourceCodeHash: observed.codeHash, }, { versionId: baseline.versionId, deploymentId: baseline.deploymentId, fingerprint: baseline.fingerprint, containerFingerprint: baseline.containerFingerprint, sourceCodeHash: baseline.sourceCodeHash, }, ) ) return yield* new ResourceConflict(); if (operation.workerIntent) return yield* new RecoveryRequired();
// The native adapter stages assets before this callback and checks the // latest uploaded version again before PUT. Keep the intent at that boundary. const beforeUpload = Effect.gen(function* () { const checked = yield* observeSource(); if ( checked.fingerprint !== baseline.fingerprint || checked.containerFingerprint !== baseline.containerFingerprint || checked.deploymentId !== baseline.deploymentId || checked.versionId !== baseline.versionId ) return yield* new ResourceConflict(); yield* recordIntent; if ( !eq(yield* api.worker.activeDeployment(), { versionId: baseline.versionId, deploymentId: baseline.deploymentId, }) ) return yield* new ResourceConflict(); }); yield* api.worker.upload( artifact, config, { kind: "inherit", versionId: baseline.versionId, bindings: observed.settings.bindings, metadata: observed.metadata, }, beforeUpload, ); });}
export function verifyWorkerNamespaces( api: WorkerOperations, artifact: Artifact, config: InstallationConfig, operation: InstallationOperation,) { return Effect.gen(function* () { if (operation.upgrade) { if (!operation.workerIntent?.configDigest) return yield* new ResourceConflict(); const observed = yield* api.observe( artifact, operation.workerIntent.operationId, operation.workerIntent.configDigest, ); if (observed.fingerprint !== operation.upgrade.fingerprint) return yield* new ResourceConflict(); } yield* api.worker.verifyContent(artifact); return yield* api.worker.namespaces(config, artifact); });}