import { HeadersRecord } from "@durable-streams/client";
import { ChatTransport, UIMessage } from "ai";

//#region src/types.d.ts
type DurableStreamTarget = {
  writeUrl: string | URL;
  readUrl?: string | URL;
  headers?: HeadersRecord;
  contentType?: string;
  createIfMissing?: boolean;
};
type ToDurableStreamResponseMode = `immediate` | `await`;
type WaitUntil = (promise: Promise<unknown>) => void;
type ToDurableStreamResponseOptions = {
  source: AsyncIterable<unknown>;
  stream: DurableStreamTarget;
  mode?: ToDurableStreamResponseMode;
  waitUntil?: WaitUntil;
  exposeLocationHeader?: boolean;
};
type DurableChatTransportOptions = {
  api: string;
  reconnectApi?: string;
  headers?: HeadersInit;
  fetchClient?: typeof fetch;
};
type DurableChatTransport<UIMessageT extends UIMessage = UIMessage> = ChatTransport<UIMessageT>;

//#endregion
//#region src/client.d.ts
declare function createDurableChatTransport<UIMessageT extends UIMessage = UIMessage>({
  api,
  reconnectApi,
  headers,
  fetchClient
}: DurableChatTransportOptions): ChatTransport<UIMessageT>;

//#endregion
//#region src/server.d.ts
declare function toDurableStreamResponse(options: ToDurableStreamResponseOptions): Promise<Response>;

//#endregion
export { DurableChatTransport, DurableChatTransportOptions, DurableStreamTarget, ToDurableStreamResponseMode, ToDurableStreamResponseOptions, WaitUntil, createDurableChatTransport, toDurableStreamResponse };