← Docs

SDK API reference

Generated from the built declarations of the local package. Contract aniviewz.sdk.v1. Not published to npm or a CDN.

43 of 43 declarations

export declare const APP_EVENTS_CONTRACT: "aniviewz.app-events.v1";
export interface QueueStorage {
  load(): Promise<string | null>;
  save(v: string): Promise<void>;
  clear(): Promise<void>;
}
export interface AppEvent {
  type: "placement_rendered" | "placement_click";
  placementId: string;
  idempotencyKey: string;
  createdAt: number;
}
export type Send = (
  e: AppEvent,
  signal: AbortSignal,
) => Promise<"ACCEPTED" | "DUPLICATE" | "RETRY" | "DROP">;
export declare function createAppQueue(o: {
  storage: QueueStorage;
  send: Send;
  max?: number;
  maxAgeMs?: number;
  now?: () => number;
}): {
  setConsent(v: boolean): Promise<void>;
  enqueue(e: Omit<AppEvent, "createdAt">): Promise<boolean>;
  /** Called when online / app foregrounded or backgrounded. Stops on RETRY, keeps order. */
  flush(): Promise<{
    sent: number;
    remaining: number;
  }>;
  cancel(): void;
  teardown(): Promise<void>;
};
/** Strict validator for one app event (debugger + native parity). Returns a list of problems. */
export declare function validateAppEvent(raw: unknown): string[];
export declare const EVENT_TYPES: readonly [
  "placement_rendered",
  "placement_click",
  "page_view",
  "declared_outcome",
];
export type EventType = (typeof EVENT_TYPES)[number];
export type EventClassName = "EXPOSURE" | "INTERACTION" | "PAGE_VIEW" | "DECLARED_OUTCOME";
export declare const EVENT_CLASS: Record<EventType, EventClassName>;
export declare const OUTCOME_TYPES: readonly [
  "lead_submitted",
  "signup",
  "add_to_cart",
  "purchase_declared",
  "download",
  "contact_request",
];
/** Developer namespace: x.<namespace>.<name>, lower-case. */
export declare const CUSTOM_OUTCOME: RegExp;
/** Value/currency allowed only for these outcome kinds (and custom ones). */
export declare const VALUE_OUTCOMES: Set<string>;
export declare const isOutcomeType: (t: string) => boolean;
export declare const valueAllowed: (t: string) => boolean;
export declare const SAFE_ID: RegExp;
export declare const PAGE_REF: RegExp;
export declare const MAX_PAGE_REF = 120;
/**
 * Normalises a caller-declared page path/template: strips query and hash, rejects full URLs,
 * PII-like characters and long digit runs. Returns null when it cannot be made safe.
 */
export declare function cleanPageRef(input: string): string | null;
export declare const SDK_VERSION: "0.1.0-local";
export declare const CONTRACT: "aniviewz.sdk.v1";
export type Scope = "READ_ONLY" | "EVENT_INGEST";
export type Environment = "TEST_ONLY" | "PRODUCTION";
export type ErrorCode =
  | "INVALID_CONFIG"
  | "SECRET_IN_PUBLIC_CONFIG"
  | "NOT_INITIALIZED"
  | "TORN_DOWN"
  | "CONSENT_REQUIRED"
  | "SCOPE_DENIED"
  | "PRODUCTION_INGEST_NOT_ACTIVATED"
  | "CAPABILITY_UNSUPPORTED"
  | "CONTRACT_MISMATCH"
  | "ABORTED"
  | "NETWORK"
  | "HTTP_4XX"
  | "HTTP_5XX"
  | "RETRIES_EXHAUSTED"
  | "SERVICE_NOT_ISSUED";
export declare class AniViewzError extends Error {
  readonly code: ErrorCode;
  readonly requestId: string | null;
  readonly status: number | null;
  /** Server error code, when the server sent one (e.g. ORIGIN_NOT_ALLOWED). */
  readonly detail: string | null;
  constructor(
    code: ErrorCode,
    requestId?: string | null,
    status?: number | null,
    /** Server error code, when the server sent one (e.g. ORIGIN_NOT_ALLOWED). */
    detail?: string | null,
  );
}
export interface Config {
  publicId: string;
  environment: Environment;
  scopes: Scope[];
  baseUrl: string;
  capabilities?: string[];
  consent?: {
    measurement: boolean;
    purpose: string;
    policyVersion: string;
  } | null;
  retry?: {
    attempts: number;
    baseDelayMs: number;
    maxDelayMs: number;
  };
  fetch?: typeof fetch;
  sleep?: (ms: number) => Promise<void>;
  newId?: () => string;
}
export declare function validateConfig(c: Config): ErrorCode | null;
export interface Placement {
  placementId: string;
  revision: number;
  testOnly: boolean;
}
export interface PlacementEvent {
  type: "placement_rendered" | "placement_click";
  placementId: string;
  idempotencyKey?: string;
}
/** Opt-in page view: caller-declared path/template only (query/hash stripped). */
export interface PageViewEvent {
  type: "page_view";
  page: string;
  optIn: true;
  idempotencyKey?: string;
}
/** Self-reported outcome declared by the site. Never a verified conversion. */
export interface DeclaredOutcomeEvent {
  type: "declared_outcome";
  outcomeType: string;
  value?: {
    amount: number;
    currency: string;
  };
  placementId?: string;
  idempotencyKey?: string;
}
export type SdkEvent = PlacementEvent | PageViewEvent | DeclaredOutcomeEvent;
export interface Client {
  readonly requestLog: readonly string[];
  negotiate(signal?: AbortSignal): Promise<{
    contract: string;
    capabilities: string[];
    status: string;
  }>;
  getPlacement(placementId: string, signal?: AbortSignal): Promise<Placement>;
  track(
    e: SdkEvent,
    signal?: AbortSignal,
  ): Promise<{
    accepted: boolean;
    idempotencyKey: string;
  }>;
  /** Ask the server to delete this client's already-sent TEST_ONLY events (consent withdrawal). */
  withdraw(
    idempotencyKeys: string[],
    requestKey?: string,
    signal?: AbortSignal,
  ): Promise<{
    deleted: number;
    replay: boolean;
  }>;
  setConsent(c: Config["consent"]): void;
  teardown(): void;
}
export declare function init(config: Config): Client;
import { type Client } from "./index";
export interface PixelOptions {
  client: Client;
  maxQueue?: number;
  newKey?: () => string;
}
export declare function createPixel(o: PixelOptions): {
  readonly debugLog: readonly string[];
  readonly queued: number;
  readonly pageViewsEnabled: boolean;
  grantConsent(policyVersion: string): void;
  /** Withdrawal: stop immediately, disable page views and discard anything not yet sent. */
  revokeConsent(): void;
  /** Explicit opt-in for page_view (still requires consent). Off by default. */
  enablePageViews(): void;
  disablePageViews(): void;
  /** Keys of events the server accepted (needed for a withdrawal deletion request). */
  readonly sentKeys: readonly string[];
  /** Withdrawal + server deletion: purge the local queue, then delete already-sent TEST_ONLY events. */
  withdrawAndDelete(
    requestKey?: string | undefined,
    signal?: AbortSignal | undefined,
  ): Promise<{
    deleted: number;
    replay: boolean;
  }>;
  placementRendered: (id: string) => boolean;
  placementClick: (id: string) => boolean;
  /** Opt-in page view of a caller-declared path/template (e.g. "/listing/:id"). Query/hash stripped. */
  pageView(page: string): boolean;
  /** Self-reported outcome. Classified DECLARED_OUTCOME — never a verified conversion. */
  declareOutcome(
    outcomeType: string,
    opts?: {
      value?:
        | {
            amount: number;
            currency: string;
          }
        | undefined;
      placementId?: string | undefined;
    },
  ): boolean;
  flush(signal?: AbortSignal | undefined): Promise<
    {
      key: string;
      accepted: boolean;
      error?: string | undefined;
    }[]
  >;
};
import { type ReactNode } from "react";
import { type Client, type Config, type ErrorCode, type Placement } from "./index";
export declare function AniViewzProvider(props: {
  config: Config;
  children?: ReactNode;
}): import("react").FunctionComponentElement<import("react").ProviderProps<Client | null>> | null;
export declare function useAniViewzClient(): Client;
export type PlacementState =
  | {
      status: "loading";
    }
  | {
      status: "ready";
      placement: Placement;
    }
  | {
      status: "error";
      code: ErrorCode;
      httpStatus: number | null;
      serverCode: string | null;
    };
export declare function usePlacement(placementId: string): PlacementState;
export interface ServerVerifierOptions {
  publicId: string;
  /** Origin registered on the public ID allowlist (e.g. https://partner.example). */
  origin: string;
  baseUrl: string;
  fetch?: typeof fetch;
  newId?: () => string;
  timeoutMs?: number;
}
export interface VerifiedPlacement {
  placementId: string;
  title: string;
  revision: number;
  testOnly: boolean;
  requestId: string;
}
export declare function createServerVerifier(o: ServerVerifierOptions): {
  verifyPlacement(
    placementId: string,
    signal?: AbortSignal | undefined,
  ): Promise<VerifiedPlacement>;
};