rampway 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +31 -0
  2. package/build/src/velocious/auth.d.ts +17 -0
  3. package/build/src/velocious/auth.d.ts.map +1 -0
  4. package/build/src/velocious/auth.js +30 -0
  5. package/build/src/velocious/auth.js.map +1 -0
  6. package/build/src/velocious/control-plane.d.ts +177 -0
  7. package/build/src/velocious/control-plane.d.ts.map +1 -0
  8. package/build/src/velocious/control-plane.js +290 -0
  9. package/build/src/velocious/control-plane.js.map +1 -0
  10. package/build/src/velocious/controller.d.ts +58 -0
  11. package/build/src/velocious/controller.d.ts.map +1 -0
  12. package/build/src/velocious/controller.js +143 -0
  13. package/build/src/velocious/controller.js.map +1 -0
  14. package/build/src/velocious/executor.d.ts +55 -0
  15. package/build/src/velocious/executor.d.ts.map +1 -0
  16. package/build/src/velocious/executor.js +142 -0
  17. package/build/src/velocious/executor.js.map +1 -0
  18. package/build/src/velocious/index.d.ts +31 -0
  19. package/build/src/velocious/index.d.ts.map +1 -0
  20. package/build/src/velocious/index.js +144 -0
  21. package/build/src/velocious/index.js.map +1 -0
  22. package/build/src/velocious/path-matcher.d.ts +18 -0
  23. package/build/src/velocious/path-matcher.d.ts.map +1 -0
  24. package/build/src/velocious/path-matcher.js +48 -0
  25. package/build/src/velocious/path-matcher.js.map +1 -0
  26. package/build/src/velocious/registry.d.ts +25 -0
  27. package/build/src/velocious/registry.d.ts.map +1 -0
  28. package/build/src/velocious/registry.js +48 -0
  29. package/build/src/velocious/registry.js.map +1 -0
  30. package/build/src/velocious/run-store.d.ts +347 -0
  31. package/build/src/velocious/run-store.d.ts.map +1 -0
  32. package/build/src/velocious/run-store.js +569 -0
  33. package/build/src/velocious/run-store.js.map +1 -0
  34. package/build/src/velocious/sanitize.d.ts +23 -0
  35. package/build/src/velocious/sanitize.d.ts.map +1 -0
  36. package/build/src/velocious/sanitize.js +154 -0
  37. package/build/src/velocious/sanitize.js.map +1 -0
  38. package/build/src/velocious/worker.d.ts +48 -0
  39. package/build/src/velocious/worker.d.ts.map +1 -0
  40. package/build/src/velocious/worker.js +165 -0
  41. package/build/src/velocious/worker.js.map +1 -0
  42. package/docs/docker-development-environment.md +103 -0
  43. package/docs/velocious-deployment-api.md +226 -0
  44. package/package.json +22 -3
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Validates and canonicalizes the backend-owned worker bootstrap module.
3
+ *
4
+ * @param {unknown} value - Candidate module path.
5
+ * @returns {string} Immutable absolute module path.
6
+ */
7
+ export function validateWorkerBootstrapPath(value: unknown): string;
8
+ /**
9
+ * Creates a scheduler that launches Rampway's package-owned detached worker.
10
+ *
11
+ * @param {object} args - Scheduler dependencies.
12
+ * @param {any} args.configuration - Velocious configuration.
13
+ * @param {string} args.mountIdentifier - Stable mount identifier.
14
+ * @param {(payload: {context: string, error: unknown}) => void} [args.emitFrameworkError] - Failure reporter.
15
+ * @param {(file: string, args: string[], options: object) => import("node:child_process").ChildProcess} [args.spawnImpl] - Test seam.
16
+ * @param {string} args.workerBootstrapPath - Canonical backend bootstrap path.
17
+ * @param {string} [args.workerPath] - Canonical package worker entry path.
18
+ * @returns {(args: {onFailure?: (error: unknown) => Promise<void>, runId: string}) => Promise<void>} Detached scheduler.
19
+ */
20
+ export function createDetachedExecution({ configuration, emitFrameworkError, mountIdentifier, spawnImpl, workerBootstrapPath, workerPath }: {
21
+ configuration: any;
22
+ mountIdentifier: string;
23
+ emitFrameworkError?: ((payload: {
24
+ context: string;
25
+ error: unknown;
26
+ }) => void) | undefined;
27
+ spawnImpl?: ((file: string, args: string[], options: object) => import("node:child_process").ChildProcess) | undefined;
28
+ workerBootstrapPath: string;
29
+ workerPath?: string | undefined;
30
+ }): (args: {
31
+ onFailure?: (error: unknown) => Promise<void>;
32
+ runId: string;
33
+ }) => Promise<void>;
34
+ /** Immutable package worker entry path. */
35
+ export const packageWorkerPath: string;
36
+ /** Velocious HTTP adapter for Rampway's deployment control plane. */
37
+ export default class RampwayDeploymentApiController extends Controller {
38
+ /** @returns {Record<string, any>} Mount options. */
39
+ _mountOptions(): Record<string, any>;
40
+ /** @returns {DeploymentRunStore} Store. */
41
+ _store(): DeploymentRunStore;
42
+ deploymentRunStore: DeploymentRunStore | undefined;
43
+ /** @returns {DeploymentControlPlane<DeploymentRunStore>} Control plane. */
44
+ _controlPlane(): DeploymentControlPlane<DeploymentRunStore>;
45
+ /** @param {{context: string, error: unknown}} args - Failure. @returns {void} */
46
+ _emitFrameworkError({ context, error }: {
47
+ context: string;
48
+ error: unknown;
49
+ }): void;
50
+ /** @returns {Promise<void>} */
51
+ create(): Promise<void>;
52
+ /** @returns {Promise<void>} */
53
+ show(): Promise<void>;
54
+ }
55
+ import Controller from "velocious/build/src/controller.js";
56
+ import DeploymentRunStore from "./run-store.js";
57
+ import { DeploymentControlPlane } from "./control-plane.js";
58
+ //# sourceMappingURL=controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/velocious/controller.js"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH,mDAHW,OAAO,GACL,MAAM,CAYlB;AAED;;;;;;;;;;;GAWG;AACH,4IARG;IAAkB,aAAa,EAAvB,GAAG;IACU,eAAe,EAA5B,MAAM;IACsD,kBAAkB,cAApE;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAC,KAAK,IAAI;IACgD,SAAS,WAAtG,MAAM,QAAQ,MAAM,EAAE,WAAW,MAAM,KAAK,OAAO,oBAAoB,EAAE,YAAY;IAC/E,mBAAmB,EAAhC,MAAM;IACQ,UAAU;CAChC,GAAU,CAAC,IAAI,EAAE;IAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAkCnG;AAjED,2CAA2C;AAC3C,uCAAwG;AAkExG,qEAAqE;AACrE;IACE,oDAAoD;IACpD,iBADc,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAMhC;IAED,2CAA2C;IAC3C,UADc,kBAAkB,CAY/B;IARG,mDAKE;IAKN,2EAA2E;IAC3E,iBADc,sBAAsB,CAAC,kBAAkB,CAAC,CAYvD;IAED,iFAAiF;IACjF,wCADY;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAC,GAA4B,IAAI,CAQ5E;IAED,+BAA+B;IAC/B,UADc,OAAO,CAAC,IAAI,CAAC,CAO1B;IAED,+BAA+B;IAC/B,QADc,OAAO,CAAC,IAAI,CAAC,CAO1B;CACF;uBA1IsB,mCAAmC;+BAG3B,gBAAgB;uCADV,oBAAoB"}
@@ -0,0 +1,143 @@
1
+ // @ts-check
2
+ import { fileURLToPath, URL } from "node:url";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { spawn as nodeSpawn } from "node:child_process";
6
+ import Controller from "velocious/build/src/controller.js";
7
+ import { DeploymentControlPlane } from "./control-plane.js";
8
+ import DeploymentRunStore from "./run-store.js";
9
+ import { getDeploymentMount } from "./registry.js";
10
+ /** Immutable package worker entry path. */
11
+ export const packageWorkerPath = fs.realpathSync(fileURLToPath(new URL("./worker.js", import.meta.url)));
12
+ /**
13
+ * Validates and canonicalizes the backend-owned worker bootstrap module.
14
+ *
15
+ * @param {unknown} value - Candidate module path.
16
+ * @returns {string} Immutable absolute module path.
17
+ */
18
+ export function validateWorkerBootstrapPath(value) {
19
+ if (typeof value !== "string" || !path.isAbsolute(value))
20
+ throw new Error("Rampway worker bootstrap path must be absolute");
21
+ let resolved;
22
+ try {
23
+ resolved = fs.realpathSync(value);
24
+ }
25
+ catch (error) {
26
+ throw new Error(`Rampway worker bootstrap module is unavailable: ${value}`, { cause: error });
27
+ }
28
+ if (!fs.statSync(resolved).isFile())
29
+ throw new Error(`Rampway worker bootstrap path is not a file: ${value}`);
30
+ return resolved;
31
+ }
32
+ /**
33
+ * Creates a scheduler that launches Rampway's package-owned detached worker.
34
+ *
35
+ * @param {object} args - Scheduler dependencies.
36
+ * @param {any} args.configuration - Velocious configuration.
37
+ * @param {string} args.mountIdentifier - Stable mount identifier.
38
+ * @param {(payload: {context: string, error: unknown}) => void} [args.emitFrameworkError] - Failure reporter.
39
+ * @param {(file: string, args: string[], options: object) => import("node:child_process").ChildProcess} [args.spawnImpl] - Test seam.
40
+ * @param {string} args.workerBootstrapPath - Canonical backend bootstrap path.
41
+ * @param {string} [args.workerPath] - Canonical package worker entry path.
42
+ * @returns {(args: {onFailure?: (error: unknown) => Promise<void>, runId: string}) => Promise<void>} Detached scheduler.
43
+ */
44
+ export function createDetachedExecution({ configuration, emitFrameworkError = () => { }, mountIdentifier, spawnImpl = nodeSpawn, workerBootstrapPath, workerPath = packageWorkerPath }) {
45
+ return async ({ onFailure, runId }) => {
46
+ if (typeof runId !== "string" || runId.length === 0 || runId.length > 128)
47
+ throw new Error("Invalid detached deployment run identifier");
48
+ if (typeof mountIdentifier !== "string" || mountIdentifier.length !== 64)
49
+ throw new Error("Invalid detached deployment mount identifier");
50
+ const child = spawnImpl(process.execPath, [workerPath, workerBootstrapPath, mountIdentifier, runId], {
51
+ cwd: configuration.getDirectory(),
52
+ detached: true,
53
+ stdio: ["ignore", "ignore", "ignore"]
54
+ });
55
+ child.once("exit", (code, signal) => {
56
+ if (code !== 0) {
57
+ const failure = new Error(`Rampway deployment worker exited before completion (${signal ?? `code ${code}`})`);
58
+ if (onFailure)
59
+ onFailure(failure).catch((/** @type {unknown} */ error) => emitFrameworkError({ context: "rampway-deployment-api-worker-failure", error }));
60
+ }
61
+ });
62
+ await new Promise((resolve, reject) => {
63
+ let settled = false;
64
+ const fail = (/** @type {unknown} */ error) => {
65
+ if (settled)
66
+ return;
67
+ settled = true;
68
+ reject(error);
69
+ };
70
+ child.once("error", fail);
71
+ child.once("spawn", () => {
72
+ if (settled)
73
+ return;
74
+ settled = true;
75
+ child.unref();
76
+ resolve(undefined);
77
+ });
78
+ });
79
+ };
80
+ }
81
+ /** Velocious HTTP adapter for Rampway's deployment control plane. */
82
+ export default class RampwayDeploymentApiController extends Controller {
83
+ /** @returns {Record<string, any>} Mount options. */
84
+ _mountOptions() {
85
+ const at = /** @type {string} */ (this.params().rampwayDeploymentMountAt);
86
+ const options = getDeploymentMount(this.getConfiguration(), at);
87
+ if (!options)
88
+ throw new Error(`No Rampway deployment API mount registered at ${at}`);
89
+ return options;
90
+ }
91
+ /** @returns {DeploymentRunStore} Store. */
92
+ _store() {
93
+ if (!this.deploymentRunStore) {
94
+ const options = this._mountOptions();
95
+ this.deploymentRunStore = new DeploymentRunStore({
96
+ configuration: this.getConfiguration(),
97
+ databaseIdentifier: options.databaseIdentifier,
98
+ mountIdentifier: options.mountIdentifier,
99
+ staleRunTimeoutMs: options.staleRunTimeoutMs
100
+ });
101
+ }
102
+ return this.deploymentRunStore;
103
+ }
104
+ /** @returns {DeploymentControlPlane<DeploymentRunStore>} Control plane. */
105
+ _controlPlane() {
106
+ const options = /** @type {import('./control-plane.js').DeploymentMountOptions & {databaseIdentifier: string, executor: import('./executor.js').RampwayDeploymentExecutor}} */ (this._mountOptions());
107
+ const configuration = this.getConfiguration();
108
+ const emitFrameworkError = (/** @type {{context: string, error: unknown}} */ { context, error }) => this._emitFrameworkError({ context, error });
109
+ return new DeploymentControlPlane({
110
+ detachedExecution: createDetachedExecution({ configuration, mountIdentifier: options.mountIdentifier, workerBootstrapPath: options.workerBootstrapPath, workerPath: options.workerPath }),
111
+ emitFrameworkError,
112
+ executor: options.executor,
113
+ options,
114
+ store: this._store()
115
+ });
116
+ }
117
+ /** @param {{context: string, error: unknown}} args - Failure. @returns {void} */
118
+ _emitFrameworkError({ context, error }) {
119
+ const events = this.getConfiguration().getErrorEvents();
120
+ // Never attach the request: it retains the bearer header and would make
121
+ // unsafe framework reporters capable of serializing the credential.
122
+ const payload = { context, error };
123
+ events.emit("framework-error", payload);
124
+ events.emit("all-error", { ...payload, errorType: "framework-error" });
125
+ }
126
+ /** @returns {Promise<void>} */
127
+ async create() {
128
+ const response = await this._controlPlane().create({
129
+ authorization: this.request().header("authorization"),
130
+ input: this.params()
131
+ });
132
+ await this.render({ json: response.body, status: response.status });
133
+ }
134
+ /** @returns {Promise<void>} */
135
+ async show() {
136
+ const response = await this._controlPlane().show({
137
+ authorization: this.request().header("authorization"),
138
+ id: /** @type {string} */ (this.params().id)
139
+ });
140
+ await this.render({ json: response.body, status: response.status });
141
+ }
142
+ }
143
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/velocious/controller.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Reads bounded live state using Rampway's existing release layout.
3
+ *
4
+ * @param {{stage: import('#types').StageConfig, transport: import('#types').Transport}} args - Context.
5
+ * @returns {Promise<Record<string, any>>} Live state.
6
+ */
7
+ export function readDeploymentStatus({ stage, transport }: {
8
+ stage: import("#types").StageConfig;
9
+ transport: import("#types").Transport;
10
+ }): Promise<Record<string, any>>;
11
+ /**
12
+ * Creates the executor that translates a bounded target into Rampway's normal
13
+ * deploy, rollback, and status functions. Dependency overrides are test-only.
14
+ *
15
+ * @param {object} [deps] - Overrides.
16
+ * @param {typeof defaultCommandContext} [deps.commandContext] - Context loader.
17
+ * @param {typeof runDeploy} [deps.deploy] - Deploy lifecycle.
18
+ * @param {typeof readDeploymentStatus} [deps.readDeploymentStatus] - Status reader.
19
+ * @param {typeof runRollback} [deps.rollback] - Rollback lifecycle.
20
+ * @returns {RampwayDeploymentExecutor} Executor.
21
+ */
22
+ export function createRampwayDeploymentExecutor({ commandContext, deploy, readDeploymentStatus: statusReader, rollback }?: {
23
+ commandContext?: typeof defaultCommandContext | undefined;
24
+ deploy?: typeof runDeploy | undefined;
25
+ readDeploymentStatus?: typeof readDeploymentStatus | undefined;
26
+ rollback?: typeof runRollback | undefined;
27
+ }): RampwayDeploymentExecutor;
28
+ export type RampwayDeploymentTarget = {
29
+ configPath: string;
30
+ releaseBranch: string;
31
+ };
32
+ export type RampwayDeploymentExecutor = {
33
+ validateRevision: (args: {
34
+ project: string;
35
+ revision: string;
36
+ stage: string;
37
+ target: RampwayDeploymentTarget;
38
+ }) => Promise<boolean>;
39
+ deploy: (args: {
40
+ project: string;
41
+ revision: string;
42
+ runId: string;
43
+ stage: string;
44
+ target: RampwayDeploymentTarget;
45
+ }) => Promise<Record<string, any>>;
46
+ readStatus: (args: {
47
+ project: string;
48
+ stage: string;
49
+ target: RampwayDeploymentTarget;
50
+ }) => Promise<Record<string, any>>;
51
+ };
52
+ import { commandContext as defaultCommandContext } from "../commands/context.js";
53
+ import { deploy as runDeploy } from "../core/deploy-runner.js";
54
+ import { rollback as runRollback } from "../core/deploy-runner.js";
55
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/velocious/executor.js"],"names":[],"mappings":"AAuBA;;;;;GAKG;AACH,2DAHW;IAAC,KAAK,EAAE,OAAO,QAAQ,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,OAAO,QAAQ,EAAE,SAAS,CAAA;CAAC,GAC1E,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAaxC;AAED;;;;;;;;;;GAUG;AACH,2HANG;IAA4C,cAAc;IAC1B,MAAM;IACK,oBAAoB;IAC7B,QAAQ;CAC1C,GAAU,yBAAyB,CAiGrC;sCAtIY;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAC;;sBAE1C,CAAC,IAAI,EAAE;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,uBAAuB,CAAA;KAAC,KAAK,OAAO,CAAC,OAAO,CAAC;YAC/G,CAAC,IAAI,EAAE;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,uBAAuB,CAAA;KAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC1I,CAAC,IAAI,EAAE;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,uBAAuB,CAAA;KAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;;wDAbjE,wBAAwB;oCACnB,0BAA0B;wCAA1B,0BAA0B"}
@@ -0,0 +1,142 @@
1
+ // @ts-check
2
+ import path from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { commandContext as defaultCommandContext } from "../commands/context.js";
5
+ import { deploy as runDeploy, rollback as runRollback } from "../core/deploy-runner.js";
6
+ import { deployPaths } from "../core/paths.js";
7
+ import { currentReleaseId, previousRelease } from "../core/release-manager.js";
8
+ import { remoteGitRepoLabel } from "../core/git-source.js";
9
+ import { Reporter } from "../core/reporter.js";
10
+ import { shellQuote } from "../transports/ssh-transport.js";
11
+ /**
12
+ * @typedef {{configPath: string, releaseBranch: string}} RampwayDeploymentTarget
13
+ * @typedef {object} RampwayDeploymentExecutor
14
+ * @property {(args: {project: string, revision: string, stage: string, target: RampwayDeploymentTarget}) => Promise<boolean>} validateRevision
15
+ * @property {(args: {project: string, revision: string, runId: string, stage: string, target: RampwayDeploymentTarget}) => Promise<Record<string, any>>} deploy
16
+ * @property {(args: {project: string, stage: string, target: RampwayDeploymentTarget}) => Promise<Record<string, any>>} readStatus
17
+ */
18
+ const quietReporter = () => new Reporter({ lifecycle: false, streamCommands: false });
19
+ /**
20
+ * Reads bounded live state using Rampway's existing release layout.
21
+ *
22
+ * @param {{stage: import('#types').StageConfig, transport: import('#types').Transport}} args - Context.
23
+ * @returns {Promise<Record<string, any>>} Live state.
24
+ */
25
+ export async function readDeploymentStatus({ stage, transport }) {
26
+ const currentRelease = await currentReleaseId(transport, stage);
27
+ const previous = await previousRelease(transport, stage, currentRelease);
28
+ let activeRevision = null;
29
+ if (currentRelease) {
30
+ const revisionPath = path.join(deployPaths(stage).releasesPath, currentRelease, "REVISION");
31
+ if (await transport.exists(revisionPath))
32
+ activeRevision = (await transport.readFile(revisionPath)).trim();
33
+ }
34
+ return { activeRevision, currentRelease, previousRelease: previous ?? null };
35
+ }
36
+ /**
37
+ * Creates the executor that translates a bounded target into Rampway's normal
38
+ * deploy, rollback, and status functions. Dependency overrides are test-only.
39
+ *
40
+ * @param {object} [deps] - Overrides.
41
+ * @param {typeof defaultCommandContext} [deps.commandContext] - Context loader.
42
+ * @param {typeof runDeploy} [deps.deploy] - Deploy lifecycle.
43
+ * @param {typeof readDeploymentStatus} [deps.readDeploymentStatus] - Status reader.
44
+ * @param {typeof runRollback} [deps.rollback] - Rollback lifecycle.
45
+ * @returns {RampwayDeploymentExecutor} Executor.
46
+ */
47
+ export function createRampwayDeploymentExecutor({ commandContext = defaultCommandContext, deploy = runDeploy, readDeploymentStatus: statusReader = readDeploymentStatus, rollback = runRollback } = {}) {
48
+ /**
49
+ * @param {RampwayDeploymentTarget} target - Allowlisted target.
50
+ * @param {string} stageName - Allowlisted stage.
51
+ * @returns {Promise<{stage: import('#types').StageConfig, transport: import('#types').Transport}>} Rampway context.
52
+ */
53
+ async function contextFor(target, stageName) {
54
+ const context = await commandContext({ config: target.configPath }, stageName, { reporter: quietReporter() });
55
+ if (context.stage.strategy !== "remote-git") {
56
+ throw new Error(`Callable deployment target ${context.stage.application}/${stageName} must use the remote-git strategy`);
57
+ }
58
+ if (!context.stage.repo)
59
+ throw new Error(`Callable deployment target ${context.stage.application}/${stageName} requires a repository`);
60
+ return context;
61
+ }
62
+ return {
63
+ async validateRevision({ revision, stage, target }) {
64
+ const { stage: rampwayStage, transport } = await contextFor(target, stage);
65
+ const checkPath = path.join(rampwayStage.deployTo, `.rampway-revision-check-${randomUUID()}`);
66
+ const repository = /** @type {string} */ (rampwayStage.repo);
67
+ await transport.mkdirp(rampwayStage.deployTo);
68
+ try {
69
+ try {
70
+ await transport.run(`git init ${shellQuote(checkPath)}`);
71
+ await transport.run(`git -C ${shellQuote(checkPath)} remote add origin ${shellQuote(repository)}`);
72
+ await transport.run(`git -C ${shellQuote(checkPath)} fetch --no-tags origin ${shellQuote(`refs/heads/${target.releaseBranch}`)}`);
73
+ }
74
+ catch {
75
+ throw new Error(`Could not fetch approved branch ${target.releaseBranch} from ${remoteGitRepoLabel(repository)} for revision validation`);
76
+ }
77
+ try {
78
+ await transport.run(`git -C ${shellQuote(checkPath)} merge-base --is-ancestor ${shellQuote(revision)} FETCH_HEAD`);
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ finally {
86
+ await transport.rm(checkPath);
87
+ }
88
+ },
89
+ async deploy({ revision, stage, target }) {
90
+ const { stage: rampwayStage, transport } = await contextFor(target, stage);
91
+ const before = await statusReader({ stage: rampwayStage, transport });
92
+ try {
93
+ return /** @type {Record<string, any>} */ (await deploy({
94
+ branch: target.releaseBranch,
95
+ force: false,
96
+ reporter: quietReporter(),
97
+ revision,
98
+ stage: rampwayStage,
99
+ transport
100
+ }));
101
+ }
102
+ catch (error) {
103
+ const failure = error instanceof Error ? error : new Error(String(error));
104
+ /** @type {Record<string, any>} */
105
+ let recovery;
106
+ try {
107
+ const after = await statusReader({ stage: rampwayStage, transport });
108
+ const changed = after.currentRelease !== before.currentRelease;
109
+ if (changed && after.activeRevision === revision && before.currentRelease) {
110
+ const rollbackReport = await rollback({ stage: rampwayStage, to: before.currentRelease, transport });
111
+ recovery = {
112
+ activeRevision: before.activeRevision ?? null,
113
+ currentRelease: before.currentRelease ?? null,
114
+ restored: true,
115
+ rollback: rollbackReport
116
+ };
117
+ }
118
+ else {
119
+ recovery = {
120
+ activeRevision: after.activeRevision ?? null,
121
+ currentRelease: after.currentRelease ?? null,
122
+ restored: !changed
123
+ };
124
+ }
125
+ }
126
+ catch (recoveryError) {
127
+ recovery = {
128
+ message: recoveryError instanceof Error ? recoveryError.message : String(recoveryError),
129
+ restored: false
130
+ };
131
+ }
132
+ /** @type {Error & {recovery?: Record<string, any>}} */ (failure).recovery = recovery;
133
+ throw failure;
134
+ }
135
+ },
136
+ async readStatus({ stage, target }) {
137
+ const context = await contextFor(target, stage);
138
+ return await statusReader(context);
139
+ }
140
+ };
141
+ }
142
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/velocious/executor.js"],"names":[],"mappings":"AAAA,YAAY;AAEZ,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAA;AAEtC,OAAO,EAAC,cAAc,IAAI,qBAAqB,EAAC,MAAM,wBAAwB,CAAA;AAC9E,OAAO,EAAC,MAAM,IAAI,SAAS,EAAE,QAAQ,IAAI,WAAW,EAAC,MAAM,0BAA0B,CAAA;AACrF,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAC,gBAAgB,EAAE,eAAe,EAAC,MAAM,4BAA4B,CAAA;AAC5E,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAC,QAAQ,EAAC,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAC,UAAU,EAAC,MAAM,gCAAgC,CAAA;AAEzD;;;;;;GAMG;AAEH,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAC,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAC,CAAC,CAAA;AAEnF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,EAAC,KAAK,EAAE,SAAS,EAAC;IAC3D,MAAM,cAAc,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC/D,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAA;IACxE,IAAI,cAAc,GAAG,IAAI,CAAA;IAEzB,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,cAAc,EAAE,UAAU,CAAC,CAAA;QAC3F,IAAI,MAAM,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC;YAAE,cAAc,GAAG,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC5G,CAAC;IAED,OAAO,EAAC,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,IAAI,IAAI,EAAC,CAAA;AAC5E,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,+BAA+B,CAAC,EAC9C,cAAc,GAAG,qBAAqB,EACtC,MAAM,GAAG,SAAS,EAClB,oBAAoB,EAAE,YAAY,GAAG,oBAAoB,EACzD,QAAQ,GAAG,WAAW,EACvB,GAAG,EAAE;IACJ;;;;OAIG;IACH,KAAK,UAAU,UAAU,CAAC,MAAM,EAAE,SAAS;QACzC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAC,EAAE,SAAS,EAAE,EAAC,QAAQ,EAAE,aAAa,EAAE,EAAC,CAAC,CAAA;QACzG,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,SAAS,mCAAmC,CAAC,CAAA;QAC1H,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,SAAS,wBAAwB,CAAC,CAAA;QACtI,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,gBAAgB,CAAC,EAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAC;YAC9C,MAAM,EAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAC,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YACxE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,2BAA2B,UAAU,EAAE,EAAE,CAAC,CAAA;YAC7F,MAAM,UAAU,GAAG,qBAAqB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;YAC5D,MAAM,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;YAC7C,IAAI,CAAC;gBACH,IAAI,CAAC;oBACH,MAAM,SAAS,CAAC,GAAG,CAAC,YAAY,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;oBACxD,MAAM,SAAS,CAAC,GAAG,CAAC,UAAU,UAAU,CAAC,SAAS,CAAC,sBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;oBAClG,MAAM,SAAS,CAAC,GAAG,CAAC,UAAU,UAAU,CAAC,SAAS,CAAC,2BAA2B,UAAU,CAAC,cAAc,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;gBACnI,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,aAAa,SAAS,kBAAkB,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAA;gBAC3I,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,SAAS,CAAC,GAAG,CAAC,UAAU,UAAU,CAAC,SAAS,CAAC,6BAA6B,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;oBAClH,OAAO,IAAI,CAAA;gBACb,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAA;gBACd,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,EAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAC;YACpC,MAAM,EAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAC,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YACxE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAC,CAAC,CAAA;YACnE,IAAI,CAAC;gBACH,OAAO,kCAAkC,CAAC,CAAC,MAAM,MAAM,CAAC;oBACtD,MAAM,EAAE,MAAM,CAAC,aAAa;oBAC5B,KAAK,EAAE,KAAK;oBACZ,QAAQ,EAAE,aAAa,EAAE;oBACzB,QAAQ;oBACR,KAAK,EAAE,YAAY;oBACnB,SAAS;iBACV,CAAC,CAAC,CAAA;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBACzE,kCAAkC;gBAClC,IAAI,QAAQ,CAAA;gBACZ,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,EAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAC,CAAC,CAAA;oBAClE,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,KAAK,MAAM,CAAC,cAAc,CAAA;oBAC9D,IAAI,OAAO,IAAI,KAAK,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;wBAC1E,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,EAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,cAAc,EAAE,SAAS,EAAC,CAAC,CAAA;wBAClG,QAAQ,GAAG;4BACT,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;4BAC7C,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;4BAC7C,QAAQ,EAAE,IAAI;4BACd,QAAQ,EAAE,cAAc;yBACzB,CAAA;oBACH,CAAC;yBAAM,CAAC;wBACN,QAAQ,GAAG;4BACT,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;4BAC5C,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;4BAC5C,QAAQ,EAAE,CAAC,OAAO;yBACnB,CAAA;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,aAAa,EAAE,CAAC;oBACvB,QAAQ,GAAG;wBACT,OAAO,EAAE,aAAa,YAAY,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;wBACvF,QAAQ,EAAE,KAAK;qBAChB,CAAA;gBACH,CAAC;gBACD,uDAAuD,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAA;gBACrF,MAAM,OAAO,CAAA;YACf,CAAC;QACH,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,EAAC,KAAK,EAAE,MAAM,EAAC;YAC9B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YAC/C,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,CAAA;QACpC,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ /** Mountable Rampway-owned deployment control plane for Velocious routes. */
2
+ export default class RampwayVelociousDeploymentApi {
3
+ /**
4
+ * @param {object} args - Mount options.
5
+ * @param {unknown} args.accessTokens - Backend-held bearer tokens.
6
+ * @param {string} args.at - Route prefix.
7
+ * @param {any} args.configuration - Velocious configuration.
8
+ * @param {string} [args.databaseIdentifier] - Persistence database.
9
+ * @param {unknown} args.projects - Project/stage/config/branch allowlist.
10
+ * @param {number} [args.staleRunTimeoutMs] - Ownership lease.
11
+ * @param {string} args.workerBootstrapPath - Absolute backend module that reconstructs Velocious in a worker.
12
+ * @returns {void}
13
+ */
14
+ static mountInto({ accessTokens, at, configuration, databaseIdentifier, projects, staleRunTimeoutMs, workerBootstrapPath }: {
15
+ accessTokens: unknown;
16
+ at: string;
17
+ configuration: any;
18
+ databaseIdentifier?: string | undefined;
19
+ projects: unknown;
20
+ staleRunTimeoutMs?: number | undefined;
21
+ workerBootstrapPath: string;
22
+ }): void;
23
+ }
24
+ import { constantTimeEqual } from "./auth.js";
25
+ import { DeploymentControlPlane } from "./control-plane.js";
26
+ import { matchDeploymentApiPath } from "./path-matcher.js";
27
+ import { sanitizeAdapterValue } from "./sanitize.js";
28
+ import { sanitizeErrorPayload } from "./sanitize.js";
29
+ import { validateWorkerBootstrapPath } from "./controller.js";
30
+ export { constantTimeEqual, DeploymentControlPlane, matchDeploymentApiPath, sanitizeAdapterValue, sanitizeErrorPayload, validateWorkerBootstrapPath };
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/velocious/index.js"],"names":[],"mappings":"AA2GA,6EAA6E;AAC7E;IACE;;;;;;;;;;OAUG;IACH,4HATG;QAAsB,YAAY,EAA1B,OAAO;QACM,EAAE,EAAf,MAAM;QACI,aAAa,EAAvB,GAAG;QACW,kBAAkB;QAClB,QAAQ,EAAtB,OAAO;QACO,iBAAiB;QAClB,mBAAmB,EAAhC,MAAM;KACd,GAAU,IAAI,CA6BhB;CACF;kCAhJ+B,WAAW;uCACN,oBAAoB;uCAGE,mBAAmB;qCAErB,eAAe;qCAAf,eAAe;4CAJqB,iBAAiB"}
@@ -0,0 +1,144 @@
1
+ // @ts-check
2
+ import path from "node:path";
3
+ import { constantTimeEqual } from "./auth.js";
4
+ import { DeploymentControlPlane } from "./control-plane.js";
5
+ import RampwayDeploymentApiController, { packageWorkerPath, validateWorkerBootstrapPath } from "./controller.js";
6
+ import { createRampwayDeploymentExecutor } from "./executor.js";
7
+ import { matchDeploymentApiPath, normalizeMountPrefix } from "./path-matcher.js";
8
+ import { deploymentMountIdentifier, registerDeploymentMount } from "./registry.js";
9
+ import { sanitizeAdapterValue, sanitizeErrorPayload } from "./sanitize.js";
10
+ const IDENTIFIER_PATTERN = /^[a-z0-9][a-z0-9_-]*$/;
11
+ const BRANCH_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._-]*(\/[a-zA-Z0-9][a-zA-Z0-9._-]*)*$/;
12
+ const MAX_IDENTIFIER_LENGTH = 64;
13
+ const DEFAULT_STALE_RUN_TIMEOUT_MS = 60000;
14
+ /**
15
+ * Applies Git's branch-ref safety rules without deferring failure to deploy.
16
+ *
17
+ * @param {unknown} value - Configured release branch.
18
+ * @returns {value is string} Whether the branch is a valid heads ref.
19
+ */
20
+ function isValidReleaseBranch(value) {
21
+ if (typeof value !== "string" || !BRANCH_PATTERN.test(value))
22
+ return false;
23
+ const ref = `refs/heads/${value}`;
24
+ return !ref.includes("..")
25
+ && !ref.includes("@{")
26
+ && !ref.endsWith(".")
27
+ && !ref.split("/").some(component => component.endsWith(".lock"))
28
+ && !/[\u0000-\u0020\u007f~^:?*\\]/u.test(ref)
29
+ && !ref.includes("[");
30
+ }
31
+ /**
32
+ * @param {unknown} value - Value.
33
+ * @param {string} name - Label.
34
+ * @returns {string} Identifier.
35
+ */
36
+ function validateIdentifier(value, name) {
37
+ if (typeof value !== "string" || value.length > MAX_IDENTIFIER_LENGTH || !IDENTIFIER_PATTERN.test(value)) {
38
+ throw new Error(`Invalid ${name} identifier: ${String(value)}`);
39
+ }
40
+ return value;
41
+ }
42
+ /**
43
+ * @param {unknown} tokens - Tokens.
44
+ * @returns {string[]} Validated copy.
45
+ */
46
+ function validateAccessTokens(tokens) {
47
+ if (!Array.isArray(tokens) || tokens.length === 0 || tokens.some(token => typeof token !== "string" || token.length === 0)) {
48
+ throw new Error("Rampway deployment API requires at least one non-empty access token");
49
+ }
50
+ return [...tokens];
51
+ }
52
+ /**
53
+ * @param {unknown} rawProjects - Allowlist.
54
+ * @returns {Record<string, any>} Normalized allowlist.
55
+ */
56
+ function validateProjects(rawProjects) {
57
+ if (!rawProjects || typeof rawProjects !== "object" || Array.isArray(rawProjects)) {
58
+ throw new Error("Rampway deployment API requires a projects allowlist");
59
+ }
60
+ /** @type {Record<string, any>} */
61
+ const projects = Object.create(null);
62
+ for (const [project, rawProject] of Object.entries(rawProjects)) {
63
+ validateIdentifier(project, "project");
64
+ const stagesValue = rawProject && typeof rawProject === "object" ? /** @type {Record<string, any>} */ (rawProject).stages : null;
65
+ if (!stagesValue || typeof stagesValue !== "object" || Array.isArray(stagesValue) || Object.keys(stagesValue).length === 0) {
66
+ throw new Error(`Project ${project} must allowlist at least one stage`);
67
+ }
68
+ /** @type {Record<string, any>} */
69
+ const stages = Object.create(null);
70
+ for (const [stage, rawTarget] of Object.entries(stagesValue)) {
71
+ validateIdentifier(stage, "stage");
72
+ const target = rawTarget && typeof rawTarget === "object" ? /** @type {Record<string, unknown>} */ (rawTarget) : {};
73
+ if (typeof target.configPath !== "string" || !path.isAbsolute(target.configPath)) {
74
+ throw new Error(`Rampway config path for ${project}/${stage} must be absolute`);
75
+ }
76
+ if (!isValidReleaseBranch(target.releaseBranch)) {
77
+ throw new Error(`Invalid release branch for ${project}/${stage}: ${String(target.releaseBranch)}`);
78
+ }
79
+ stages[stage] = { configPath: target.configPath, releaseBranch: target.releaseBranch };
80
+ }
81
+ projects[project] = { stages };
82
+ }
83
+ if (Object.keys(projects).length === 0)
84
+ throw new Error("Rampway deployment API requires at least one allowlisted project");
85
+ return projects;
86
+ }
87
+ /**
88
+ * @param {unknown} value - Timeout.
89
+ * @returns {number} Timeout.
90
+ */
91
+ function validateStaleRunTimeout(value) {
92
+ if (value === undefined)
93
+ return DEFAULT_STALE_RUN_TIMEOUT_MS;
94
+ if (!Number.isSafeInteger(value) || /** @type {number} */ (value) < 4) {
95
+ throw new Error("Rampway deployment API staleRunTimeoutMs must be an integer of at least 4");
96
+ }
97
+ return /** @type {number} */ (value);
98
+ }
99
+ /** Mountable Rampway-owned deployment control plane for Velocious routes. */
100
+ export default class RampwayVelociousDeploymentApi {
101
+ /**
102
+ * @param {object} args - Mount options.
103
+ * @param {unknown} args.accessTokens - Backend-held bearer tokens.
104
+ * @param {string} args.at - Route prefix.
105
+ * @param {any} args.configuration - Velocious configuration.
106
+ * @param {string} [args.databaseIdentifier] - Persistence database.
107
+ * @param {unknown} args.projects - Project/stage/config/branch allowlist.
108
+ * @param {number} [args.staleRunTimeoutMs] - Ownership lease.
109
+ * @param {string} args.workerBootstrapPath - Absolute backend module that reconstructs Velocious in a worker.
110
+ * @returns {void}
111
+ */
112
+ static mountInto({ accessTokens, at, configuration, databaseIdentifier = "default", projects, staleRunTimeoutMs, workerBootstrapPath }) {
113
+ if (!configuration || typeof configuration.addRouteResolverHook !== "function")
114
+ throw new Error("No Velocious configuration given");
115
+ if (typeof databaseIdentifier !== "string" || databaseIdentifier.length === 0) {
116
+ throw new Error("Rampway deployment API databaseIdentifier must be a non-empty string");
117
+ }
118
+ const prefix = normalizeMountPrefix(at);
119
+ const options = {
120
+ accessTokens: validateAccessTokens(accessTokens),
121
+ databaseIdentifier,
122
+ executor: createRampwayDeploymentExecutor(),
123
+ mountIdentifier: deploymentMountIdentifier(prefix),
124
+ projects: validateProjects(projects),
125
+ staleRunTimeoutMs: validateStaleRunTimeout(staleRunTimeoutMs),
126
+ workerBootstrapPath: validateWorkerBootstrapPath(workerBootstrapPath),
127
+ workerPath: packageWorkerPath
128
+ };
129
+ registerDeploymentMount(configuration, prefix, options);
130
+ configuration.addRouteResolverHook((/** @type {{currentPath: string, request: {httpMethod: () => string}}} */ { currentPath, request }) => {
131
+ const match = matchDeploymentApiPath({ method: request.httpMethod(), path: currentPath, prefix });
132
+ if (!match)
133
+ return null;
134
+ return {
135
+ action: match.action,
136
+ controller: "rampwayDeploymentApi",
137
+ controllerClass: RampwayDeploymentApiController,
138
+ params: { ...match.params, rampwayDeploymentMountAt: prefix }
139
+ };
140
+ });
141
+ }
142
+ }
143
+ export { constantTimeEqual, DeploymentControlPlane, matchDeploymentApiPath, sanitizeAdapterValue, sanitizeErrorPayload, validateWorkerBootstrapPath };
144
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/velocious/index.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @param {string} at - Mount path.
3
+ * @returns {string} Normalized path.
4
+ */
5
+ export function normalizeMountPrefix(at: string): string;
6
+ /**
7
+ * @param {{prefix: string, path: string, method: string}} args - Request data.
8
+ * @returns {{action: string, params: Record<string, string>}|null} Match.
9
+ */
10
+ export function matchDeploymentApiPath({ prefix, path, method }: {
11
+ prefix: string;
12
+ path: string;
13
+ method: string;
14
+ }): {
15
+ action: string;
16
+ params: Record<string, string>;
17
+ } | null;
18
+ //# sourceMappingURL=path-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-matcher.d.ts","sourceRoot":"","sources":["../../../src/velocious/path-matcher.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,yCAHW,MAAM,GACJ,MAAM,CAQlB;AAaD;;;GAGG;AACH,iEAHW;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,GAC5C;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAC,GAAC,IAAI,CAmBjE"}