1import { makeRandom } from "../Random.ts";
2
3/** Env var on the RPC host. Callers send it as {@link RPC_TOKEN_HEADER}. */
4export const RPC_TOKEN_ENV = "ALCHEMY_RPC_TOKEN";
5
6/** Request header the caller must send. Never accepted from the public edge. */
7export const RPC_TOKEN_HEADER = "x-alchemy-rpc-token";
8
9export const PRIVATE_HOST_SUFFIX = ".railway.internal";
10
11export const DEFAULT_RPC_PORT = 3000;
12
13/** Same prefix as `alchemy/Rpc` so Function canvas code does not import Rpc.ts. */
14export const RPC_PATH_PREFIX = "/__rpc__/";
15
16/** Same envelope tag as `alchemy/Rpc.ErrorTag`. */
17export const RPC_ERROR_TAG = "~alchemy/rpc/error";
18
19export const RPC_TOKEN_ATTR = "rpcToken";
20
21const envKey = (logicalId: string, suffix: string) =>
22 `RAILWAY_RPC_${logicalId.replaceAll(/[^a-zA-Z0-9]/g, "_").toUpperCase()}_${suffix}`;
23
24export const rpcEnvKeys = (logicalId: string) => ({
25 host: envKey(logicalId, "HOST"),
26 port: envKey(logicalId, "PORT"),
27 token: envKey(logicalId, "TOKEN"),
28});
29
30/**
31 * Child {@link makeRandom} for a Function/Service logical id. Generated
32 * once, persisted in alchemy state, reused on later deploys.
33 */
34export const mintRpcToken = (logicalId: string) =>
35 makeRandom(`${logicalId}RpcToken`);