t3-code-android-nightly/.repos/alchemy-effect/packages/alchemy/test/AWS/Secret/fixtures/handler.ts
Julius Marminge 6f9cea00ae
chore(refs): sync Effect and Alchemy references to 4.0.1 and beta.80 (#16170)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 13:22:30 -07:00

120 lines
4 KiB
TypeScript

import * as Lambda from "@/AWS/Lambda";
import * as Config from "effect/Config";
import * as Effect from "effect/Effect";
import * as Redacted from "effect/Redacted";
import { HttpServerRequest } from "effect/http/HttpServerRequest";
import * as HttpServerResponse from "effect/http/HttpServerResponse";
import path from "pathe";
const main = path.resolve(import.meta.dirname, "handler.ts");
/**
* Hard-coded values the integ test asserts against to prove the
* deploy-time bindings flow all the way through to the runtime.
*/
export const LITERAL_SECRET_VALUE = "sk-aws-literal-secret-abc";
export const STRING_VAR_VALUE = "plain-aws-string-value";
export const NUMBER_VAR_VALUE = 9090;
export const OBJECT_VAR_VALUE = {
region: "us-east-1",
flags: { canary: true },
};
/**
* Name of the deploy-time `process.env` variable the test populates
* before deploying — sourced via `Config.String(...)` inside the
* Lambda's init phase.
*/
export const CONFIG_SECRET_ENV_KEY = "ALCHEMY_AWS_SECRET_TEST_SOURCE";
export class SecretsTestFunction extends Lambda.Function<SecretsTestFunction>()(
"SecretsTestFunction",
) {}
export const SecretsTestFunctionLive = SecretsTestFunction.make(
{
main,
functionUrl: true,
},
Effect.gen(function* () {
// Secret from a literal — `Alchemy.Secret` coerces the literal to
// `Redacted` and the Lambda runtime accessor rebuilds the wrapper
// from the JSON marker stored in env.
const literalSecret = yield* Config.Redacted("LITERAL_SECRET").pipe(
Config.withDefault(Redacted.make(LITERAL_SECRET_VALUE)),
);
// Secret from a `Config` — resolved against the active
// `ConfigProvider` (process.env) at deploy time. The test populates
// `process.env[CONFIG_SECRET_ENV_KEY]` before deploying, so source
// from that same key (not a hard-coded literal).
const configSecret = yield* Config.Redacted(CONFIG_SECRET_ENV_KEY);
// Plain string variable — string round-trip.
const stringVar = yield* Config.String("STRING_VAR").pipe(
Config.withDefault(STRING_VAR_VALUE),
);
// Number variable — non-string values JSON.stringify on `set` and
// JSON.parse on the runtime accessor, so the accessor returns the
// original number.
const numberVar = yield* Config.Number("NUMBER_VAR").pipe(
Config.withDefault(NUMBER_VAR_VALUE),
);
// Object variable — same JSON round-trip as above for nested data.
const objectVar = yield* Config.String("OBJECT_VAR").pipe(
Config.withDefault(OBJECT_VAR_VALUE),
);
return {
fetch: Effect.gen(function* () {
const request = yield* HttpServerRequest;
const url = new URL(request.originalUrl);
const pathname = url.pathname;
switch (pathname) {
case "/ready":
return HttpServerResponse.text("ok");
case "/secret/literal": {
return yield* HttpServerResponse.json({
isRedacted: Redacted.isRedacted(literalSecret),
value: Redacted.value(literalSecret),
});
}
case "/secret/config": {
return yield* HttpServerResponse.json({
isRedacted: Redacted.isRedacted(configSecret),
value: Redacted.value(configSecret),
});
}
case "/var/string": {
return yield* HttpServerResponse.json({
type: typeof stringVar,
value: stringVar,
});
}
case "/var/number": {
return yield* HttpServerResponse.json({
type: typeof numberVar,
value: numberVar,
});
}
case "/var/object": {
return yield* HttpServerResponse.json({
type: typeof objectVar,
value: objectVar,
});
}
default:
return yield* HttpServerResponse.json(
{ error: "Not found", pathname },
{ status: 404 },
);
}
}).pipe(Effect.orDie),
};
}),
);
export default SecretsTestFunctionLive;