import { DurableStream, HeadersRecord } from "@durable-streams/client";

//#region src/types.d.ts
type TanStackChunk = any;
type DurableSessionConnection = {
  subscribe: (abortSignal?: AbortSignal) => AsyncIterable<TanStackChunk>;
  send: (messages: Array<unknown>, data?: unknown, abortSignal?: AbortSignal) => Promise<void>;
};
type DurableStreamConnection = DurableSessionConnection;
type DurableStreamConnectionOptions = {
  sendUrl: string;
  readUrl?: string;
  initialOffset?: string;
  emitSnapshotOnSubscribe?: boolean;
  headers?: HeadersInit;
  fetchClient?: typeof fetch;
};
type DurableStreamTarget = {
  writeUrl: string | URL;
  readUrl?: string | URL;
  headers?: HeadersRecord;
  contentType?: string;
  createIfMissing?: boolean;
};
type DurableChatSessionStreamTarget = Pick<DurableStreamTarget, `writeUrl` | `headers` | `createIfMissing`>;
type ToDurableStreamResponseMode = `immediate` | `await`;
type WaitUntil = (promise: Promise<unknown>) => void;
type ToDurableStreamResponseOptions = {
  stream: DurableStreamTarget;
  mode?: ToDurableStreamResponseMode;
  waitUntil?: WaitUntil;
  exposeLocationHeader?: boolean;
};
type DurableSessionMessagePart = {
  type?: string;
  content?: string;
  text?: string;
};
type DurableSessionMessage = {
  id?: string;
  role?: string;
  parts?: Array<DurableSessionMessagePart>;
};
type ToDurableChatSessionResponseOptions = {
  stream: DurableChatSessionStreamTarget;
  newMessages: Array<DurableSessionMessage>;
  responseStream: AsyncIterable<TanStackChunk>;
  mode?: ToDurableStreamResponseMode;
  waitUntil?: WaitUntil;
};

//#endregion
//#region src/client.d.ts
declare function durableStreamConnection(options: DurableStreamConnectionOptions): DurableStreamConnection;
declare function sanitizeChunkForStorage<TChunk extends TanStackChunk>(chunk: TChunk): TChunk;
declare function materializeSnapshotFromDurableStream(options: {
  readUrl: string;
  headers?: HeadersInit;
  offset?: string;
}): Promise<{
  messages: Array<any>;
  offset?: string;
}>;

//#endregion
//#region src/server.d.ts
declare function ensureDurableChatSessionStream(streamTarget: DurableStreamTarget): Promise<DurableStream>;
declare function toMessageEchoChunks(message: {
  id?: string;
  role?: string;
  parts?: Array<{
    type?: string;
    content?: string;
    text?: string;
  }>;
}): Array<TanStackChunk>;
declare function appendSanitizedChunksToStream(stream: DurableStream, chunks: ReadonlyArray<TanStackChunk>, contentType?: string): Promise<void>;
declare function pipeSanitizedChunksToStream(source: AsyncIterable<TanStackChunk>, stream: DurableStream, contentType?: string): Promise<void>;
declare function toDurableStreamResponse(source: AsyncIterable<unknown>, options: ToDurableStreamResponseOptions): Promise<Response>;
declare function toDurableChatSessionResponse(options: ToDurableChatSessionResponseOptions): Promise<Response>;

//#endregion
export { DurableChatSessionStreamTarget, DurableSessionConnection, DurableSessionMessage, DurableSessionMessagePart, DurableStreamConnection, DurableStreamConnectionOptions, DurableStreamTarget, TanStackChunk, ToDurableChatSessionResponseOptions, ToDurableStreamResponseMode, ToDurableStreamResponseOptions, WaitUntil, appendSanitizedChunksToStream, durableStreamConnection, ensureDurableChatSessionStream, materializeSnapshotFromDurableStream, pipeSanitizedChunksToStream, sanitizeChunkForStorage, toDurableChatSessionResponse, toDurableStreamResponse, toMessageEchoChunks };