Skip to content
Corven Email SDK
Esc
↑↓navigate↵open⌘Jpreview
On this page

Native job defaults

Apply Loops variables and Iterable data/metadata defaults without changing the native service contract.

Loops and Iterable use native jobs rather than the common literal-message envelope. Their defaults live in separate entrypoints.

Loops

import type { Layer } from "effect";
import { Effect } from "effect";
import { defaultedLoopsTransactionalLayer } from "@corven/email-sdk/loops-defaults";
import { LoopsTransactionalEmail } from "@corven/email-sdk/loops";

export const fictionalDefaultedLoopsSubmission = <E, R>(
  account: Layer.Layer<LoopsTransactionalEmail, E, R>,
) =>
  Effect.gen(function* sendDefaultedLoopsNotification() {
    const loops = yield* LoopsTransactionalEmail;

    return yield* loops.send(
      {
        dataVariables: { items: [{ amount: 0, title: "Fictional item" }] },
        email: "recipient@fictional.invalid",
        transactionalId: "host_selected_published_template",
      },
      { idempotencyKey: "caller-owned-logical-event" },
    );
  }).pipe(
    Effect.provide(
      defaultedLoopsTransactionalLayer(account, {
        dataVariables: { application: "Fictional application" },
        idempotencyKeyPrefix: "fictional-application/",
      }),
    ),
  );

defaultedLoopsTransactionalLayer supplies default dataVariables and an optional caller-key prefix. The application still selects the published template and recipient. It does not transform a native template into common Email content.

Iterable

import { Effect, Redacted } from "effect";
import { defaultedIterableCampaignLayer } from "@corven/email-sdk/iterable-defaults";
import { IterableCampaignEmail, iterableCampaignLayer } from "@corven/email-sdk/iterable";

export const defaultedCampaignLayer = defaultedIterableCampaignLayer(
  iterableCampaignLayer({
    apiKey: Redacted.make("fictional-key"),
    campaignAuthority: "AuthorizeProviderManagedCampaign",
    contactWrites: "AuthorizeProfileCreation",
    dataRetention: "AuthorizePersistedSendData",
    projectIdentity: "EmailBased",
    region: "US",
    tracking: "AuthorizeCampaignTracking",
  }),
  { dataFields: { application: "fictional" }, metadata: { workflow: "fictional" } },
);

export const previewDefaultedCampaign = Effect.gen(function* previewDefaultedCampaign() {
  return yield* (yield* IterableCampaignEmail).validate({
    campaignId: 123,
    dataFields: { application: "operation override", enabled: false },
    recipientEmail: "recipient@fictional.invalid",
  });
});

defaultedIterableCampaignLayer merges default data fields and metadata. Caller values take precedence. The resulting job still passes native campaign validation, including project identity and scheduling constraints.

The examples leave HTTP transport to the application. Configuration attestations retain their original meaning after wrapping: defaults do not inspect remote templates, enable attachments, disable tracking or acquire profile-write permission.

See Loops and Iterable for the native input and replay boundaries.