openai
Version:
The official TypeScript library for the OpenAI API
90 lines (74 loc) • 2.56 kB
text/typescript
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
import * as ResponsesAPI from './responses';
import { OpenAI } from '../../client';
import { EventEmitter } from '../../core/EventEmitter';
import { OpenAIError } from '../../core/error';
export class WebSocketError extends OpenAIError {
/**
* The error data that the API sent back in an error event.
*/
error?: ResponsesAPI.ResponseErrorEvent | undefined;
constructor(message: string, event: ResponsesAPI.ResponseErrorEvent | null) {
super(message);
this.error = event ?? undefined;
}
}
type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};
type WebsocketEvents = Simplify<
{
event: (event: ResponsesAPI.ResponsesServerEvent) => void;
error: (error: WebSocketError) => void;
} & {
[EventType in Exclude<NonNullable<ResponsesAPI.ResponsesServerEvent['type']>, 'error'>]: (
event: Extract<ResponsesAPI.ResponsesServerEvent, { type?: EventType }>,
) => unknown;
}
>;
export abstract class ResponsesEmitter extends EventEmitter<WebsocketEvents> {
/**
* Send an event to the API.
*/
abstract send(event: ResponsesAPI.ResponsesClientEvent): void;
/**
* Close the websocket connection.
*/
abstract close(props?: { code: number; reason: string }): void;
protected _onError(event: null, message: string, cause: any): void;
protected _onError(event: ResponsesAPI.ResponseErrorEvent, message?: string | undefined): void;
protected _onError(
event: ResponsesAPI.ResponseErrorEvent | null,
message?: string | undefined,
cause?: any,
): void {
message = message ?? safeJSONStringify(event) ?? 'unknown error';
if (!this._hasListener('error')) {
const error = new WebSocketError(
message +
`\n\nTo resolve these unhandled rejection errors you should bind an \`error\` callback, e.g. \`ws.on('error', (error) => ...)\` `,
event,
);
// @ts-ignore
error.cause = cause;
Promise.reject(error);
return;
}
const error = new WebSocketError(message, event);
// @ts-ignore
error.cause = cause;
this._emit('error', error);
}
}
export function buildURL(client: OpenAI): URL {
const path = '/responses';
const baseURL = client.baseURL;
const url = new URL(baseURL + (baseURL.endsWith('/') ? path.slice(1) : path));
url.protocol = 'wss';
return url;
}
function safeJSONStringify(value: unknown): string | null {
try {
return JSON.stringify(value);
} catch {
return null;
}
}