import { BaseConnector } from '../../base/base.connector'; import type { IPushOptions, IPushProvider, ISendMessageSuccessResponse, WithPassthrough, PushSendResult, IPushConnector } from '../../types'; import { ChannelTypeEnum } from '../../types'; import type { ExpoConfig } from './expo.config'; import type { ExpoNarrowedInput } from './expo.types'; export declare class ExpoPushConnector extends BaseConnector implements IPushProvider, IPushConnector { private config; readonly id = "expo"; readonly channelType: ChannelTypeEnum.PUSH; constructor(config: ExpoConfig, fetchImpl?: typeof fetch); /** * Thinwrap-native send. Implements `IPushConnector`. * Builds a JSON body in camelCase wire shape (Expo's API is camelCase * native — no casing transform needed), optionally adds Bearer auth, and * POSTs to the single Expo push endpoint. * * Single-recipient by design — multi-target batching is not exposed on the * unified surface. Consumers needing batched sends use the Novu-compatible * `sendMessage()` surface or pass an array via `_passthrough.body`. * * Expo emits HTTP 200 even for soft errors — `data.status` is inspected * after the HTTP layer; `status: 'error'` is mapped via * `EXPO_TICKET_ERROR_TO_PROVIDER_CODE` to a canonical `ConnectorError`. */ send(input: ExpoNarrowedInput): Promise; /** * Body-layer mapping: HTTP 200 with `data.status === 'error'`. Expo * ticket-level rate-limit errors (`MessageRateExceeded`) arrive on HTTP 200 * with no `Retry-After` header — that's an HTTP-layer concern handled in * `mapVendorError`. */ private mapTicketError; /** * HTTP-layer mapping. Parses `Retry-After` and embeds * the parsed seconds in `providerMessage` text; raw header value is attached * to `cause.retryAfter`. No structured `retryAfterSeconds` field per * Retry is consumer policy (no retryAfterSeconds field) — the wrapper performs no retry. */ private mapVendorError; sendMessage(options: IPushOptions, bridgeProviderData?: WithPassthrough>): Promise; }