1.0.7 โ€ข Published 9 months ago

@diptabose/chat-client v1.0.7

Weekly downloads
-
License
-
Repository
github
Last release
9 months ago

๐Ÿ“ฆ Streaming Client Transport SDK

A TypeScript SDK for streaming server responses in various transport modes such as WebSockets, Server-Sent Events (SSE), and Streaming HTTP. It provides a unified Client interface to simplify communication with backend systems that support streamable responses.


โœจ Features

  • ๐Ÿ”„ Unified streaming interface
  • โš™๏ธ Pluggable transport layer (WebSocket, SSE, HTTP)
  • ๐Ÿง  Support for object and text streaming
  • โŒ Graceful abort & close handling
  • ๐Ÿ”Œ Easy transport switching

๐Ÿ“ฆ Installation

npm install @diptabose/chat-client

๐Ÿ“ TypeScript Types

export type StreamResponse = {
  response: Promise<Response>;
  readableStream: ReadableStream;
};

export type ObjectStreamResponse = {
  response: Promise<Response>;
  readableStream: ReadableStream<any>;
};

export type ContentResponse = {
  response: Promise<Response>;
  content: string;
};

export type SendReturnType<
  Options extends { stream: boolean; objectMode: boolean }
> = Options["stream"] extends false
  ? ContentResponse
  : Options["objectMode"] extends true
  ? ObjectStreamResponse
  : StreamResponse;

๐Ÿš€ Usage

1. Create a Transport

You can use one of the following transports:

  • WebSocketTransport
  • SSETransport
  • StreambleHttpTransport
import { WebSocketTransport } from "@diptabose/chat-client/transports/websocket";

const wsTransport = new WebSocketTransport("ws://localhost:4000", {
  eventName: "message",
});

2. Create a Client

import { Client } from "@diptabose/chat-client/client/client";

const client = new Client(wsTransport, {
  stream: true,
  objectMode: false,
});

3. Send Request

const result = await client.send("/api/chat", { message: "hello" });

const reader = result.readableStream.getReader();
while (true) {
  const { value, done } = await reader.read();
  if (done) break;
  console.log("Chunk:", value);
}

๐ŸŒ Transports

โœ… WebSocketTransport

  • Listens for server-side events via WebSocket.
  • Sends an HTTP POST to initiate the stream.
new WebSocketTransport("ws://localhost:4000", { eventName: "message" });

โœ… SSETransport

  • Uses EventSource to listen to SSE streams.
new SSETransport("/events", { eventName: "data" });

โœ… StreambleHttpTransport

  • Sends an HTTP POST and receives text/event-stream over fetch().
new StreambleHttpTransport("/stream");

๐Ÿ”ง API Reference

Client

new Client(transport: Transport, options: { stream: boolean, objectMode: boolean })

send(url?: string, data?: object, options?: RequestInit)

  • Returns a response + stream object
  • Respects AbortSignal

transport(newTransport: Transport)

  • Dynamically switch transport at runtime

๐Ÿ“ค Streaming Modes

streamobjectModeOutput Type
false-ContentResponse
truefalseStreamResponse
truetrueObjectStreamResponse

โŒ Graceful Aborting

All transports support AbortSignal to cancel ongoing requests and close streams.

const controller = new AbortController();
client.send("/api", {}, { signal: controller.signal });
controller.abort();

๐Ÿงช Example

const transport = new SSETransport("/events", { eventName: "data" });
const client = new Client(transport, { stream: true, objectMode: false });

const { readableStream } = await client.send("/chat", { prompt: "hi" });
const reader = readableStream.getReader();

while (true) {
  const { value, done } = await reader.read();
  if (done) break;
  console.log("Chunk:", value);
}

๐Ÿ› ๏ธ Utilities Used

  • Streamable - wraps ReadableStream with controller
  • TransformableReadableStream - transforms stream data
  • parseEventStream - parses SSE chunked data

๐Ÿงฉ Extending

You can build your own transport by implementing:

export interface Transport {
  send(
    url: string,
    data?: Record<string, unknown>,
    options?: Omit<RequestInit, "body">
  ): Promise<{
    response: Promise<Response>;
    readableStream: ReadableStream | null;
  }>;
  transportUrl: () => string | URL;
  close(): void;
}

๐Ÿงพ License

MIT


๐Ÿ‘จโ€๐Ÿ’ป Author

Developed by [Dipta Bose] โ€” Contributions are welcome!

1.0.7

9 months ago

1.0.6

9 months ago

1.0.5

9 months ago

1.0.4

9 months ago

1.0.3

9 months ago

1.0.2

9 months ago

1.0.1

9 months ago

1.0.0

9 months ago