1import * as rum from "@distilled.cloud/aws/rum";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import type { AppMonitor } from "./AppMonitor.ts";
5import { bindRumAppMonitorPolicy } from "./BindingHttp.ts";
6import { PutRumEvents, type PutRumEventsRequest } from "./PutRumEvents.ts";
7
8/**
9 * Bespoke (not `makeRumAppMonitorHttpBinding`): `PutRumEvents` addresses the
10 * data-plane endpoint by monitor *id* (not name) and defaults the
11 * `AppMonitorDetails` envelope from the bound monitor.
12 */
13export const PutRumEventsHttp = Layer.effect(
14 PutRumEvents,
15 Effect.gen(function* () {
16 const op = yield* rum.putRumEvents;
17
18 return Effect.fn(function* (monitor: AppMonitor) {
19 const monitorId = yield* monitor.appMonitorId;
20 const monitorName = yield* monitor.appMonitorName;
21 yield* bindRumAppMonitorPolicy({
22 tag: "AWS.RUM.PutRumEvents",
23 monitor,
24 actions: ["rum:PutRumEvents"],
25 });
26 return Effect.fn(`AWS.RUM.PutRumEvents(${monitor.LogicalId})`)(function* (
27 request: PutRumEventsRequest,
28 ) {
29 const Id = yield* monitorId;
30 return yield* op({
31 ...request,
32 Id,
33 AppMonitorDetails: request.AppMonitorDetails ?? {
34 name: yield* monitorName,
35 id: Id,
36 },
37 });
38 });
39 });
40 }),
41);