import { EventEmitterSlug } from './event-emitter-types'; import type { JSONSchema4 } from 'json-schema'; import { Action, ActionDefinition, ActionHookDefinition, ActionHookType, hookTypeStrings, ActionHookResponse, BaseActionDefinition, RequestFn, ExecuteDynamicFieldInput } from './action'; import { JSONLikeObject, JSONObject } from '../json-object'; import { SegmentEvent } from '../segment-event'; import { fieldsToJsonSchema, MinimalInputField } from './fields-to-jsonschema'; import { RequestClient, ResponseError } from '../create-request-client'; import type { ModifiedResponse } from '../types'; import type { GlobalSetting, RequestExtension, ExecuteInput, Result, Deletion, DynamicFieldResponse, ResultMultiStatusNode } from './types'; import type { AllRequestOptions } from '../request-client'; import { AuthTokens } from './parse-settings'; import { Features } from '../mapping-kit'; import { HTTPError } from '..'; export type { BaseActionDefinition, ActionDefinition, ActionHookDefinition, ActionHookResponse, ActionHookType, ExecuteInput, RequestFn, Result }; export { hookTypeStrings }; export type { MinimalInputField }; export { fieldsToJsonSchema }; export interface SubscriptionStats { duration: number; destination: string; action: string; subscribe: string; input: JSONLikeObject; output: Result[] | null; } interface PartnerActions { [key: string]: Action; } export interface BaseDefinition { name: string; mode: 'cloud' | 'device' | 'warehouse'; description?: string; slug?: string; actions: Record; presets?: Preset[]; } export type AudienceResult = { externalId: string; }; export type AudienceMode = { type: 'realtime'; } | { type: 'synced'; full_audience_sync: boolean; }; export type Personas = { computation_id: string; computation_key: string; namespace: string; [key: string]: unknown; }; export type CreateAudienceInput = { settings: Settings; audienceSettings?: AudienceSettings; personas?: Personas; audienceName: string; statsContext?: StatsContext; features?: Features; }; export type GetAudienceInput = { settings: Settings; audienceSettings?: AudienceSettings; externalId: string; statsContext?: StatsContext; features?: Features; }; export interface AudienceDestinationConfiguration { mode: AudienceMode; } export interface AudienceDestinationConfigurationWithCreateGet extends AudienceDestinationConfiguration { createAudience(request: RequestClient, createAudienceInput: CreateAudienceInput): Promise; getAudience(request: RequestClient, getAudienceInput: GetAudienceInput): Promise; } export interface AudienceDestinationDefinition extends DestinationDefinition { audienceConfig: AudienceDestinationConfigurationWithCreateGet | AudienceDestinationConfiguration; audienceFields: Record; actions: Record>; } export interface DestinationDefinition extends BaseDefinition { mode: 'cloud'; actions: Record>; extendRequest?: RequestExtension; authentication?: AuthenticationScheme; onDelete?: Deletion; } export interface WarehouseDestinationDefinition extends BaseDefinition { mode: 'warehouse'; actions: Record>; settings: Record; onDelete?: Deletion; } interface AutomaticPreset extends Subscription { type: 'automatic'; } interface SpecificEventPreset extends Omit { type: 'specificEvent'; eventSlug: EventEmitterSlug; } export type Preset = AutomaticPreset | SpecificEventPreset; export interface Subscription { name?: string; partnerAction: string; subscribe: string; mapping?: JSONObject; ActionID?: string; ConfigID?: string; ID?: string; ProjectID?: string; } export interface OAuth2ClientCredentials extends AuthTokens { clientId: string; clientSecret: string; } export interface RefreshAccessTokenResult { accessToken: string; refreshToken?: string; } interface AuthSettings { settings: Settings; auth: AuthTokens; } interface RefreshAuthSettings { settings: Settings; auth: OAuth2ClientCredentials; } interface Authentication { scheme: 'basic' | 'custom' | 'oauth2' | 'oauth-managed'; fields: Record; testAuthentication?: (request: RequestClient, input: AuthSettings) => Promise | unknown; } export interface CustomAuthentication extends Authentication { scheme: 'custom'; } export interface BasicAuthentication extends Authentication { scheme: 'basic'; } export interface OAuth2Authentication extends Authentication { scheme: 'oauth2'; refreshAccessToken?: (request: RequestClient, input: RefreshAuthSettings) => Promise; } export interface OAuthManagedAuthentication extends Authentication { scheme: 'oauth-managed'; refreshAccessToken?: (request: RequestClient, input: RefreshAuthSettings) => Promise; } export type AuthenticationScheme = BasicAuthentication | CustomAuthentication | OAuth2Authentication | OAuthManagedAuthentication; export type SubscriptionMetadata = { actionConfigId?: string; destinationConfigId?: string; actionId?: string; sourceId?: string; }; interface EventInput { readonly event: SegmentEvent; readonly mapping: JSONObject; readonly settings: Settings; readonly auth?: AuthTokens; readonly features?: Features; readonly statsContext?: StatsContext; readonly logger?: Logger; readonly engageDestinationCache?: EngageDestinationCache; readonly transactionContext?: TransactionContext; readonly stateContext?: StateContext; readonly subscriptionMetadata?: SubscriptionMetadata; readonly signal?: AbortSignal; } interface BatchEventInput { readonly events: SegmentEvent[]; readonly mapping: JSONObject; readonly settings: Settings; readonly auth?: AuthTokens; readonly features?: Features; readonly statsContext?: StatsContext; readonly logger?: Logger; readonly engageDestinationCache?: EngageDestinationCache; readonly transactionContext?: TransactionContext; readonly stateContext?: StateContext; readonly subscriptionMetadata?: SubscriptionMetadata; readonly signal?: AbortSignal; } export interface DecoratedResponse extends ModifiedResponse { request: Request; options: AllRequestOptions; } interface OnEventOptions { onTokenRefresh?: (tokens: RefreshAccessTokenResult) => Promise; onComplete?: (stats: SubscriptionStats) => void; features?: Features; statsContext?: StatsContext; logger?: Logger; readonly engageDestinationCache?: EngageDestinationCache; transactionContext?: TransactionContext; stateContext?: StateContext; synchronizeRefreshAccessToken?: () => Promise; signal?: AbortSignal; } export interface TransactionContext { transaction: Record; setTransaction: (key: string, value: string) => void; } export interface StateContext { getRequestContext(key: string, cb?: (res?: string) => any): any; setResponseContext(key: string, value: string, ttl: { hour?: number; minute?: number; second?: number; }): void; } export interface StatsClient { observe: (metric: any) => any; _name(name: string): string; _tags(tags?: string[]): string[]; incr(name: string, value?: number, tags?: string[]): void; set(name: string, value: number, tags?: string[]): void; histogram(name: string, value?: number, tags?: string[]): void; } export interface StatsContext { statsClient: StatsClient; tags: string[]; } export interface Logger { level: string; name: string; debug(...message: string[]): void; info(...message: string[]): void; warn(...message: string[]): void; error(...message: string[]): void; crit(...message: string[]): void; log(...message: string[]): void; withTags(extraTags: any): void; } export interface EngageDestinationCache { getByKey: (key: string) => Promise; readonly maxExpirySeconds: number; readonly maxValueSizeBytes: number; setByKey: (key: string, value: string, expiryInSeconds?: number) => Promise; setByKeyNX: (key: string, value: string, expiryInSeconds?: number) => Promise; delByKey: (key: string) => Promise; } export declare class Destination { readonly definition: DestinationDefinition; readonly name: string; readonly authentication?: AuthenticationScheme; readonly extendRequest?: RequestExtension; readonly actions: PartnerActions; readonly responses: DecoratedResponse[]; readonly settingsSchema?: JSONSchema4; onDelete?: (event: SegmentEvent, settings: JSONObject, options?: OnEventOptions) => Promise; constructor(destination: DestinationDefinition); validateSettings(settings: Settings): void; createAudience(createAudienceInput: CreateAudienceInput): Promise; getAudience(getAudienceInput: GetAudienceInput): Promise; testAuthentication(settings: Settings): Promise; refreshAccessToken(settings: Settings, oauthData: OAuth2ClientCredentials, synchronizeRefreshAccessToken?: () => Promise): Promise; private partnerAction; protected executeAction(actionSlug: string, { event, mapping, subscriptionMetadata, settings, auth, features, statsContext, logger, engageDestinationCache, transactionContext, stateContext, signal }: EventInput): Promise; executeBatch(actionSlug: string, { events, mapping, subscriptionMetadata, settings, auth, features, statsContext, logger, engageDestinationCache, transactionContext, stateContext, signal }: BatchEventInput): Promise; executeDynamicField(actionSlug: string, fieldKey: string, data: ExecuteDynamicFieldInput, dynamicFn?: RequestFn): Promise; private onSubscription; onEvent(event: SegmentEvent, settings: JSONObject, options?: OnEventOptions): Promise; onBatch(events: SegmentEvent[], settings: JSONObject, options?: OnEventOptions): Promise; private _onDelete; private onSubscriptions; private getSubscriptions; private getDestinationSettings; handleError(error: ResponseError | HTTPError, settings: JSONObject, options?: OnEventOptions): Promise; handleAuthError(settings: JSONObject, options?: OnEventOptions): Promise; refreshTokenAndGetNewToken(settings: JSONObject, options?: OnEventOptions): Promise; }