realtime-avatar 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +132 -0
- package/CLAUDE.md +17 -0
- package/LICENSE +21 -0
- package/README.md +254 -0
- package/dist/api-keys.d.ts +26 -0
- package/dist/api-keys.d.ts.map +1 -0
- package/dist/api-keys.js +88 -0
- package/dist/api-keys.js.map +1 -0
- package/dist/browser/audio.d.ts +65 -0
- package/dist/browser/audio.d.ts.map +1 -0
- package/dist/browser/audio.js +154 -0
- package/dist/browser/audio.js.map +1 -0
- package/dist/browser/boomerang.d.ts +38 -0
- package/dist/browser/boomerang.d.ts.map +1 -0
- package/dist/browser/boomerang.js +85 -0
- package/dist/browser/boomerang.js.map +1 -0
- package/dist/browser/index.d.ts +8 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +8 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/media-session.d.ts +43 -0
- package/dist/browser/media-session.d.ts.map +1 -0
- package/dist/browser/media-session.js +169 -0
- package/dist/browser/media-session.js.map +1 -0
- package/dist/browser/player.d.ts +162 -0
- package/dist/browser/player.d.ts.map +1 -0
- package/dist/browser/player.js +514 -0
- package/dist/browser/player.js.map +1 -0
- package/dist/browser/view.d.ts +47 -0
- package/dist/browser/view.d.ts.map +1 -0
- package/dist/browser/view.js +7 -0
- package/dist/browser/view.js.map +1 -0
- package/dist/browser/webrtc.d.ts +21 -0
- package/dist/browser/webrtc.d.ts.map +1 -0
- package/dist/browser/webrtc.js +149 -0
- package/dist/browser/webrtc.js.map +1 -0
- package/dist/browser/yuv-canvas.d.ts +13 -0
- package/dist/browser/yuv-canvas.d.ts.map +1 -0
- package/dist/browser/yuv-canvas.js +95 -0
- package/dist/browser/yuv-canvas.js.map +1 -0
- package/dist/client.d.ts +195 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +440 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +33 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +73 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated/openapi.d.ts +1523 -0
- package/dist/generated/openapi.d.ts.map +1 -0
- package/dist/generated/openapi.js +6 -0
- package/dist/generated/openapi.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/media.d.ts +40 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +4 -0
- package/dist/media.js.map +1 -0
- package/dist/mux.d.ts +104 -0
- package/dist/mux.d.ts.map +1 -0
- package/dist/mux.js +290 -0
- package/dist/mux.js.map +1 -0
- package/dist/platform.d.ts +163 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +5 -0
- package/dist/platform.js.map +1 -0
- package/dist/react/index.d.ts +5 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +5 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/provider.d.ts +37 -0
- package/dist/react/provider.d.ts.map +1 -0
- package/dist/react/provider.js +33 -0
- package/dist/react/provider.js.map +1 -0
- package/dist/react/realtime.d.ts +74 -0
- package/dist/react/realtime.d.ts.map +1 -0
- package/dist/react/realtime.js +105 -0
- package/dist/react/realtime.js.map +1 -0
- package/dist/react/session.d.ts +91 -0
- package/dist/react/session.d.ts.map +1 -0
- package/dist/react/session.js +322 -0
- package/dist/react/session.js.map +1 -0
- package/dist/react/stage.d.ts +23 -0
- package/dist/react/stage.d.ts.map +1 -0
- package/dist/react/stage.js +62 -0
- package/dist/react/stage.js.map +1 -0
- package/dist/schemas.d.ts +59 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +58 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +8 -0
- package/dist/server.js.map +1 -0
- package/dist/session-socket.d.ts +96 -0
- package/dist/session-socket.d.ts.map +1 -0
- package/dist/session-socket.js +299 -0
- package/dist/session-socket.js.map +1 -0
- package/dist/session.d.ts +107 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +192 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +24 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +94 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import { RealtimeAvatarApiError, RealtimeAvatarConfigError, RealtimeAvatarValidationError } from "./errors";
|
|
2
|
+
import { artifactStatusSchema, realtimePrepareResponseSchema, videoAvatarCacheManifestSchema, } from "./schemas";
|
|
3
|
+
import { readAvatarMux } from "./mux";
|
|
4
|
+
import { AvatarSession } from "./session";
|
|
5
|
+
import { RealtimeSessionSocket } from "./session-socket";
|
|
6
|
+
import { REALTIME_AVATAR_MODEL_IDS } from "./platform";
|
|
7
|
+
const MAX_MULTIPART_VIDEO_BYTES = 2 * 1024 * 1024;
|
|
8
|
+
export const DEFAULT_PLATFORM_BASE_URL = "https://realtimeavatar.ai";
|
|
9
|
+
export const platformEndpoints = {
|
|
10
|
+
artifacts: "/api/realtime-avatar/artifacts",
|
|
11
|
+
prepare: "/api/v1/realtime/prepare",
|
|
12
|
+
turn: "/api/v1/realtime/turn",
|
|
13
|
+
// No direct WS endpoint: the platform mints a short-lived token instead and
|
|
14
|
+
// the client dials the GPU runtime straight from wherever it runs.
|
|
15
|
+
session: "",
|
|
16
|
+
sessionToken: "/api/v1/realtime/session/token",
|
|
17
|
+
lipsync: "/api/v1/lipsync",
|
|
18
|
+
videoCachePlan: "/api/v1/realtime/video-cache/plan",
|
|
19
|
+
// On the platform, prepare() registers the cache; no direct endpoints.
|
|
20
|
+
videoCacheRegister: "",
|
|
21
|
+
videoCacheStatus: "",
|
|
22
|
+
};
|
|
23
|
+
export const modalEndpoints = {
|
|
24
|
+
artifacts: "/v1/artifacts",
|
|
25
|
+
prepare: "/v1/realtime/prepare",
|
|
26
|
+
turn: "/v1/realtime/pipecat-turn",
|
|
27
|
+
session: "/v1/realtime/session/ws",
|
|
28
|
+
sessionToken: "",
|
|
29
|
+
lipsync: "/v1/lipsync",
|
|
30
|
+
videoCachePlan: "/v1/realtime/video-cache/plan",
|
|
31
|
+
videoCacheRegister: "/v1/realtime/video-cache/register",
|
|
32
|
+
videoCacheStatus: "/v1/realtime/video-cache/{cache_id}",
|
|
33
|
+
};
|
|
34
|
+
export const webProxyEndpoints = {
|
|
35
|
+
artifacts: "/api/realtime-avatar/artifacts",
|
|
36
|
+
prepare: "/api/realtime/prepare",
|
|
37
|
+
turn: "/api/realtime/turn",
|
|
38
|
+
session: "",
|
|
39
|
+
// Cookie-authenticated mint endpoint; the browser then dials the GPU
|
|
40
|
+
// runtime directly with the returned `?token=` (no gateway in the path).
|
|
41
|
+
sessionToken: "/api/realtime/session/token",
|
|
42
|
+
lipsync: "/api/v1/lipsync",
|
|
43
|
+
videoCachePlan: "/api/realtime/video-cache/plan",
|
|
44
|
+
// The dashboard proxy registers caches through prepare(); no direct endpoints.
|
|
45
|
+
videoCacheRegister: "",
|
|
46
|
+
videoCacheStatus: "",
|
|
47
|
+
};
|
|
48
|
+
export class RealtimeTurnStream {
|
|
49
|
+
response;
|
|
50
|
+
constructor(response) {
|
|
51
|
+
this.response = response;
|
|
52
|
+
}
|
|
53
|
+
get events() {
|
|
54
|
+
if (!this.response.body) {
|
|
55
|
+
throw new RealtimeAvatarApiError("Realtime Avatar stream response has no body", this.response.status, null, this.response);
|
|
56
|
+
}
|
|
57
|
+
return readAvatarMux(this.response.body, this.readOptions);
|
|
58
|
+
}
|
|
59
|
+
readOptions = {};
|
|
60
|
+
withReadOptions(options) {
|
|
61
|
+
this.readOptions = options;
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @deprecated Renamed to {@link RealtimeTurnStream}. Kept as an alias for one
|
|
67
|
+
* release so existing imports keep working; prefer `RealtimeTurnStream`.
|
|
68
|
+
*/
|
|
69
|
+
export const AvatarTurnStream = RealtimeTurnStream;
|
|
70
|
+
export class RealtimeAvatarClient {
|
|
71
|
+
fetchImpl;
|
|
72
|
+
baseUrl;
|
|
73
|
+
apiKey;
|
|
74
|
+
endpoints;
|
|
75
|
+
headers;
|
|
76
|
+
sessionAuth;
|
|
77
|
+
constructor(options = {}) {
|
|
78
|
+
this.fetchImpl = options.fetch ?? globalThis.fetch?.bind(globalThis);
|
|
79
|
+
if (!this.fetchImpl)
|
|
80
|
+
throw new RealtimeAvatarConfigError("A fetch implementation is required");
|
|
81
|
+
this.baseUrl = normalizeBaseUrl(options.baseUrl ?? "");
|
|
82
|
+
this.apiKey = options.apiKey;
|
|
83
|
+
this.headers = options.headers;
|
|
84
|
+
this.endpoints = { ...platformEndpoints, ...options.endpoints };
|
|
85
|
+
this.sessionAuth = options.sessionAuth;
|
|
86
|
+
}
|
|
87
|
+
static modal(options) {
|
|
88
|
+
return new RealtimeAvatarClient({ ...options, endpoints: modalEndpoints });
|
|
89
|
+
}
|
|
90
|
+
static webProxy(options = {}) {
|
|
91
|
+
return new RealtimeAvatarClient({ ...options, endpoints: webProxyEndpoints });
|
|
92
|
+
}
|
|
93
|
+
static platform(options) {
|
|
94
|
+
return new RealtimeAvatarClient({
|
|
95
|
+
...options,
|
|
96
|
+
baseUrl: options.baseUrl ?? DEFAULT_PLATFORM_BASE_URL,
|
|
97
|
+
endpoints: platformEndpoints,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async health(options = {}) {
|
|
101
|
+
return this.getJson("/health", options);
|
|
102
|
+
}
|
|
103
|
+
async artifacts(options = {}) {
|
|
104
|
+
return this.getJson(this.endpoints.artifacts, options, artifactStatusSchema);
|
|
105
|
+
}
|
|
106
|
+
async creditBalance(options = {}) {
|
|
107
|
+
return this.getJson("/api/v1/credits/balance", options);
|
|
108
|
+
}
|
|
109
|
+
async listAvatars(options = {}) {
|
|
110
|
+
return this.getJson("/api/v1/avatars", options);
|
|
111
|
+
}
|
|
112
|
+
async createAvatar(input, options = {}) {
|
|
113
|
+
return this.postJson("/api/v1/avatars", input, options);
|
|
114
|
+
}
|
|
115
|
+
async getAvatar(avatarId, options = {}) {
|
|
116
|
+
return this.getJson(`/api/v1/avatars/${encodeURIComponent(avatarId)}`, options);
|
|
117
|
+
}
|
|
118
|
+
/** Customize avatar fields (display name, voice, persona via metadata.persona). Owner-scoped. */
|
|
119
|
+
async updateAvatar(avatarId, patch, options = {}) {
|
|
120
|
+
return this.requestJson("PATCH", `/api/v1/avatars/${encodeURIComponent(avatarId)}`, patch, options);
|
|
121
|
+
}
|
|
122
|
+
async deleteAvatar(avatarId, options = {}) {
|
|
123
|
+
const headers = await this.buildHeaders(options.headers);
|
|
124
|
+
const response = await this.fetchImpl(this.url(`/api/v1/avatars/${encodeURIComponent(avatarId)}`), {
|
|
125
|
+
method: "DELETE",
|
|
126
|
+
headers,
|
|
127
|
+
signal: options.signal,
|
|
128
|
+
});
|
|
129
|
+
if (!response.ok)
|
|
130
|
+
throw await RealtimeAvatarApiError.fromResponse(response);
|
|
131
|
+
}
|
|
132
|
+
async createImageAvatar(input, options = {}) {
|
|
133
|
+
const asset = await this.uploadAsset(input.image, { kind: "image", filename: input.filename }, options);
|
|
134
|
+
const avatar = await this.createAvatar({
|
|
135
|
+
displayName: input.displayName,
|
|
136
|
+
sourceKind: "image",
|
|
137
|
+
modelId: REALTIME_AVATAR_MODEL_IDS.live,
|
|
138
|
+
sourceAssetId: asset.id,
|
|
139
|
+
defaultVoiceId: input.defaultVoiceId,
|
|
140
|
+
settings: input.settings,
|
|
141
|
+
metadata: input.metadata,
|
|
142
|
+
}, options);
|
|
143
|
+
return { asset, avatar };
|
|
144
|
+
}
|
|
145
|
+
async createVideoAvatar(input, options = {}) {
|
|
146
|
+
if (input.video.size > MAX_MULTIPART_VIDEO_BYTES) {
|
|
147
|
+
throw new RealtimeAvatarConfigError("Local multipart video uploads are only for tiny smoke tests. Use createVideoAvatarFromUrl() so the platform streams video directly into R2.");
|
|
148
|
+
}
|
|
149
|
+
const asset = await this.uploadAsset(input.video, { kind: "video", filename: input.filename }, options);
|
|
150
|
+
return this.createVideoAvatarFromAsset(asset, input, options);
|
|
151
|
+
}
|
|
152
|
+
async createVideoAvatarFromUrl(input, options = {}) {
|
|
153
|
+
const asset = await this.createRemoteAsset({
|
|
154
|
+
kind: "video",
|
|
155
|
+
remoteUrl: input.videoUrl,
|
|
156
|
+
originalFilename: input.filename,
|
|
157
|
+
metadata: input.assetMetadata,
|
|
158
|
+
}, options);
|
|
159
|
+
return this.createVideoAvatarFromAsset(asset, input, options);
|
|
160
|
+
}
|
|
161
|
+
async createRemoteAsset(input, options = {}) {
|
|
162
|
+
return this.postJson("/api/v1/assets/remote", input, options);
|
|
163
|
+
}
|
|
164
|
+
async createVideoAvatarFromAsset(asset, input, options) {
|
|
165
|
+
const avatar = await this.createAvatar({
|
|
166
|
+
displayName: input.displayName,
|
|
167
|
+
sourceKind: "video",
|
|
168
|
+
modelId: REALTIME_AVATAR_MODEL_IDS.video,
|
|
169
|
+
sourceAssetId: asset.id,
|
|
170
|
+
defaultVoiceId: input.defaultVoiceId,
|
|
171
|
+
settings: input.settings,
|
|
172
|
+
metadata: input.metadata,
|
|
173
|
+
}, options);
|
|
174
|
+
const videoCache = input.planCache === false
|
|
175
|
+
? null
|
|
176
|
+
: await this.planAvatarVideoCache({ avatar_id: avatar.id, video_cache: input.videoCache }, options);
|
|
177
|
+
return { asset, avatar, videoCache };
|
|
178
|
+
}
|
|
179
|
+
async uploadAsset(file, uploadOptions = {}, requestOptions = {}) {
|
|
180
|
+
const form = new FormData();
|
|
181
|
+
form.set("file", file, uploadOptions.filename);
|
|
182
|
+
if (uploadOptions.kind)
|
|
183
|
+
form.set("kind", uploadOptions.kind);
|
|
184
|
+
return this.postForm("/api/v1/assets", form, requestOptions);
|
|
185
|
+
}
|
|
186
|
+
async prepare(input, options = {}) {
|
|
187
|
+
return this.postJson(this.endpoints.prepare, input, options, realtimePrepareResponseSchema);
|
|
188
|
+
}
|
|
189
|
+
async planVideoCache(input, options = {}) {
|
|
190
|
+
return this.postJson(this.endpoints.videoCachePlan, input, options);
|
|
191
|
+
}
|
|
192
|
+
async planAvatarVideoCache(input, options = {}) {
|
|
193
|
+
return this.postJson(this.endpoints.videoCachePlan, input, options);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Build (or load) the .avtrv source-video cache for a video URL, blocking
|
|
197
|
+
* until it is ready. Only available against the Modal runtime directly;
|
|
198
|
+
* platform/web-proxy clients register caches implicitly through prepare().
|
|
199
|
+
*/
|
|
200
|
+
async registerVideoCache(input, options = {}) {
|
|
201
|
+
return this.postJson(this.requireEndpoint("videoCacheRegister"), input, options, videoAvatarCacheManifestSchema);
|
|
202
|
+
}
|
|
203
|
+
/** Read a .avtrv cache manifest by id (Modal runtime only). */
|
|
204
|
+
async getVideoCache(cacheId, options = {}) {
|
|
205
|
+
const template = this.requireEndpoint("videoCacheStatus");
|
|
206
|
+
return this.getJson(template.replace("{cache_id}", encodeURIComponent(cacheId)), options, videoAvatarCacheManifestSchema);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Open a reusable session for one avatar. Carries the avatar id + render
|
|
210
|
+
* source so you don't repeat them per turn, and exposes `prepare`/`chat`/
|
|
211
|
+
* `speak`. Pair with `AvatarPlayer` (or the React `useAvatarSession` hook)
|
|
212
|
+
* for end-to-end playback.
|
|
213
|
+
*/
|
|
214
|
+
session(config) {
|
|
215
|
+
return new AvatarSession(this, config);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Open the low-latency single-socket realtime session: `prepare()` and every
|
|
219
|
+
* turn run on the SAME GPU container, skipping the per-request routing that
|
|
220
|
+
* can land an HTTP turn on a container that never saw the prepare.
|
|
221
|
+
*
|
|
222
|
+
* Works on every client flavor:
|
|
223
|
+
* - `platform()` / `webProxy()` mint a short-lived signed token from their
|
|
224
|
+
* `sessionToken` endpoint, then dial the GPU runtime directly — this is
|
|
225
|
+
* browser-safe (no headers on the WebSocket, no API key client-side).
|
|
226
|
+
* - `modal()` dials its `session` endpoint with auth headers (server-side
|
|
227
|
+
* runtimes only; browsers cannot set WebSocket headers).
|
|
228
|
+
* - A custom `sessionAuth` option overrides both.
|
|
229
|
+
*
|
|
230
|
+
* const live = await client.connectSession();
|
|
231
|
+
* await live.prepare({ source_kind: "source_video", source_video_url, avatar_id });
|
|
232
|
+
* for await (const event of live.turn({ mode: "speak_text", text }).events) { ... }
|
|
233
|
+
*
|
|
234
|
+
* Prefer `client.session(config).connect()` — it keeps the avatar/render
|
|
235
|
+
* config attached and falls back to HTTP turns transparently.
|
|
236
|
+
*/
|
|
237
|
+
async connectSession(options = {}) {
|
|
238
|
+
return this.openRealtimeSession(options);
|
|
239
|
+
}
|
|
240
|
+
/** Alias for callers that want the transport name to match the token-grant API. */
|
|
241
|
+
async connectRealtimeSession(options = {}) {
|
|
242
|
+
return this.openRealtimeSession(options);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Mint or build a reusable realtime session grant. Browser/web-proxy clients
|
|
246
|
+
* get a short-lived token plus optional media-plane plan; Modal direct clients
|
|
247
|
+
* get the direct WS URL and authenticate when `connectRealtimeSession()` opens it.
|
|
248
|
+
*/
|
|
249
|
+
async createSessionGrant(options = {}) {
|
|
250
|
+
if (this.sessionAuth) {
|
|
251
|
+
const grant = await this.sessionAuth({ signal: options.signal });
|
|
252
|
+
return this.assertSessionGrant(grant);
|
|
253
|
+
}
|
|
254
|
+
if (this.endpoints.sessionToken) {
|
|
255
|
+
const grant = await this.postJson(this.endpoints.sessionToken, {}, options);
|
|
256
|
+
return this.assertSessionGrant(grant);
|
|
257
|
+
}
|
|
258
|
+
const path = this.requireEndpoint("session");
|
|
259
|
+
return { url: this.url(path).replace(/^http/i, "ws") };
|
|
260
|
+
}
|
|
261
|
+
async openRealtimeSession(options = {}) {
|
|
262
|
+
if (options.grant) {
|
|
263
|
+
const grant = this.assertSessionGrant(options.grant);
|
|
264
|
+
const headers = grant.token ? undefined : await this.websocketHeaders(options.headers);
|
|
265
|
+
return RealtimeSessionSocket.connect({
|
|
266
|
+
url: grant.url,
|
|
267
|
+
token: grant.token,
|
|
268
|
+
headers,
|
|
269
|
+
WebSocketImpl: options.WebSocketImpl,
|
|
270
|
+
signal: options.signal,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
if (this.sessionAuth || this.endpoints.sessionToken) {
|
|
274
|
+
const grant = await this.createSessionGrant(options);
|
|
275
|
+
return RealtimeSessionSocket.connect({
|
|
276
|
+
url: grant.url,
|
|
277
|
+
token: grant.token,
|
|
278
|
+
WebSocketImpl: options.WebSocketImpl,
|
|
279
|
+
signal: options.signal,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
const path = this.requireEndpoint("session");
|
|
283
|
+
const url = this.url(path).replace(/^http/i, "ws");
|
|
284
|
+
return RealtimeSessionSocket.connect({
|
|
285
|
+
url,
|
|
286
|
+
headers: await this.websocketHeaders(options.headers),
|
|
287
|
+
WebSocketImpl: options.WebSocketImpl,
|
|
288
|
+
signal: options.signal,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* The lean conversational entrypoint: one user message (plus optional
|
|
293
|
+
* history) against an avatar id. The avatar's stored persona is applied
|
|
294
|
+
* server-side; pass a system message in `history` to override it.
|
|
295
|
+
*
|
|
296
|
+
* const stream = await client.chat({ avatarId, text: "who are you?" });
|
|
297
|
+
* for await (const event of stream.events) { ... }
|
|
298
|
+
*/
|
|
299
|
+
async chat(input, options = {}) {
|
|
300
|
+
const { avatarId, text, history, ...rest } = input;
|
|
301
|
+
return this.turn({
|
|
302
|
+
...rest,
|
|
303
|
+
mode: "chat",
|
|
304
|
+
avatar_id: avatarId,
|
|
305
|
+
messages: [...(history ?? []), { role: "user", content: text }],
|
|
306
|
+
}, options);
|
|
307
|
+
}
|
|
308
|
+
/** Speak literal text with the avatar (no LLM), e.g. for scripted lines. */
|
|
309
|
+
async speak(input, options = {}) {
|
|
310
|
+
const { avatarId, text, ...rest } = input;
|
|
311
|
+
return this.turn({ ...rest, mode: "speak_text", avatar_id: avatarId, text }, options);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Start a realtime turn. Returns a binary `application/x-avatar-mux` stream —
|
|
315
|
+
* decode with `readAvatarMux` or play with `AvatarPlayer`; never `res.json()`.
|
|
316
|
+
*/
|
|
317
|
+
async turn(input, options = {}) {
|
|
318
|
+
return this.postMux(this.endpoints.turn, input, options);
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Non-streaming lipsync: render `audioUrl` to a talking-head MP4 in one pass
|
|
322
|
+
* and resolve with the stored video URL. No LLM, no TTS, no streaming — ideal
|
|
323
|
+
* for backend/batch use after you've created an avatar.
|
|
324
|
+
*
|
|
325
|
+
* const { url } = await client.lipsync({ audioUrl, avatarId: "ava_..." });
|
|
326
|
+
*/
|
|
327
|
+
async lipsync(input, options = {}) {
|
|
328
|
+
if (!input.avatarId && !input.portraitUrl) {
|
|
329
|
+
throw new RealtimeAvatarConfigError("lipsync requires avatarId or portraitUrl");
|
|
330
|
+
}
|
|
331
|
+
return this.postJson(this.requireEndpoint("lipsync"), input, options);
|
|
332
|
+
}
|
|
333
|
+
requireEndpoint(name) {
|
|
334
|
+
const path = this.endpoints[name];
|
|
335
|
+
if (!path) {
|
|
336
|
+
throw new RealtimeAvatarConfigError(`The ${name} endpoint is not available for this client; use RealtimeAvatarClient.modal() or prepare()`);
|
|
337
|
+
}
|
|
338
|
+
return path;
|
|
339
|
+
}
|
|
340
|
+
assertSessionGrant(grant) {
|
|
341
|
+
if (!grant?.url) {
|
|
342
|
+
throw new RealtimeAvatarConfigError("Session token endpoint did not return a WebSocket url");
|
|
343
|
+
}
|
|
344
|
+
return grant;
|
|
345
|
+
}
|
|
346
|
+
async websocketHeaders(extra) {
|
|
347
|
+
const headers = await this.buildHeaders(extra);
|
|
348
|
+
const headerRecord = {};
|
|
349
|
+
headers.forEach((value, key) => {
|
|
350
|
+
headerRecord[key] = value;
|
|
351
|
+
});
|
|
352
|
+
return Object.keys(headerRecord).length > 0 ? headerRecord : undefined;
|
|
353
|
+
}
|
|
354
|
+
async getJson(path, options, validate) {
|
|
355
|
+
const response = await this.fetchImpl(this.url(path), {
|
|
356
|
+
method: "GET",
|
|
357
|
+
headers: await this.buildHeaders(options.headers),
|
|
358
|
+
signal: options.signal,
|
|
359
|
+
});
|
|
360
|
+
return this.readJsonResponse(response, validate);
|
|
361
|
+
}
|
|
362
|
+
async postJson(path, body, options, validate) {
|
|
363
|
+
return this.requestJson("POST", path, body, options, validate);
|
|
364
|
+
}
|
|
365
|
+
async requestJson(method, path, body, options, validate) {
|
|
366
|
+
const headers = await this.buildHeaders(options.headers);
|
|
367
|
+
headers.set("Content-Type", "application/json");
|
|
368
|
+
const response = await this.fetchImpl(this.url(path), {
|
|
369
|
+
method,
|
|
370
|
+
headers,
|
|
371
|
+
signal: options.signal,
|
|
372
|
+
body: JSON.stringify(body),
|
|
373
|
+
});
|
|
374
|
+
return this.readJsonResponse(response, validate);
|
|
375
|
+
}
|
|
376
|
+
async postForm(path, body, options) {
|
|
377
|
+
const response = await this.fetchImpl(this.url(path), {
|
|
378
|
+
method: "POST",
|
|
379
|
+
headers: await this.buildHeaders(options.headers),
|
|
380
|
+
signal: options.signal,
|
|
381
|
+
body,
|
|
382
|
+
});
|
|
383
|
+
return this.readJsonResponse(response);
|
|
384
|
+
}
|
|
385
|
+
async postMux(path, body, options) {
|
|
386
|
+
const headers = await this.buildHeaders(options.headers);
|
|
387
|
+
headers.set("Accept", "application/x-avatar-mux");
|
|
388
|
+
headers.set("Content-Type", "application/json");
|
|
389
|
+
const response = await this.fetchImpl(this.url(path), {
|
|
390
|
+
method: "POST",
|
|
391
|
+
headers,
|
|
392
|
+
signal: options.signal,
|
|
393
|
+
body: JSON.stringify(body),
|
|
394
|
+
});
|
|
395
|
+
if (!response.ok)
|
|
396
|
+
throw await RealtimeAvatarApiError.fromResponse(response);
|
|
397
|
+
if (!response.body) {
|
|
398
|
+
throw new RealtimeAvatarApiError("Realtime Avatar mux response has no body", response.status, null, response);
|
|
399
|
+
}
|
|
400
|
+
return new RealtimeTurnStream(response).withReadOptions({ signal: options.signal });
|
|
401
|
+
}
|
|
402
|
+
async readJsonResponse(response, validate) {
|
|
403
|
+
if (!response.ok)
|
|
404
|
+
throw await RealtimeAvatarApiError.fromResponse(response);
|
|
405
|
+
const data = await response.json();
|
|
406
|
+
if (!validate)
|
|
407
|
+
return data;
|
|
408
|
+
const result = validate.safeParse(data);
|
|
409
|
+
if (!result.success) {
|
|
410
|
+
throw new RealtimeAvatarValidationError(`Realtime Avatar response did not match the expected contract for ${response.url || "this endpoint"}`, result.error.issues, data);
|
|
411
|
+
}
|
|
412
|
+
return result.data;
|
|
413
|
+
}
|
|
414
|
+
url(path) {
|
|
415
|
+
if (/^https?:\/\//i.test(path))
|
|
416
|
+
return path;
|
|
417
|
+
if (!this.baseUrl)
|
|
418
|
+
return path;
|
|
419
|
+
return `${this.baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
|
|
420
|
+
}
|
|
421
|
+
async buildHeaders(extra) {
|
|
422
|
+
const headers = new Headers(await resolveHeaders(this.headers));
|
|
423
|
+
const apiKey = await resolveApiKey(this.apiKey);
|
|
424
|
+
if (apiKey && !headers.has("Authorization"))
|
|
425
|
+
headers.set("Authorization", `Bearer ${apiKey}`);
|
|
426
|
+
if (extra)
|
|
427
|
+
new Headers(extra).forEach((value, key) => headers.set(key, value));
|
|
428
|
+
return headers;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
function normalizeBaseUrl(baseUrl) {
|
|
432
|
+
return baseUrl.replace(/\/+$/, "");
|
|
433
|
+
}
|
|
434
|
+
async function resolveApiKey(apiKey) {
|
|
435
|
+
return typeof apiKey === "function" ? apiKey() : apiKey;
|
|
436
|
+
}
|
|
437
|
+
async function resolveHeaders(headers) {
|
|
438
|
+
return typeof headers === "function" ? headers() : headers;
|
|
439
|
+
}
|
|
440
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AAC5G,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAkD,MAAM,OAAO,CAAC;AACtF,OAAO,EAAE,aAAa,EAA4B,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAoEvD,MAAM,yBAAyB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAClD,MAAM,CAAC,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAErE,MAAM,CAAC,MAAM,iBAAiB,GAA8B;IAC1D,SAAS,EAAE,gCAAgC;IAC3C,OAAO,EAAE,0BAA0B;IACnC,IAAI,EAAE,uBAAuB;IAC7B,4EAA4E;IAC5E,mEAAmE;IACnE,OAAO,EAAE,EAAE;IACX,YAAY,EAAE,gCAAgC;IAC9C,OAAO,EAAE,iBAAiB;IAC1B,cAAc,EAAE,mCAAmC;IACnD,uEAAuE;IACvE,kBAAkB,EAAE,EAAE;IACtB,gBAAgB,EAAE,EAAE;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAA8B;IACvD,SAAS,EAAE,eAAe;IAC1B,OAAO,EAAE,sBAAsB;IAC/B,IAAI,EAAE,2BAA2B;IACjC,OAAO,EAAE,yBAAyB;IAClC,YAAY,EAAE,EAAE;IAChB,OAAO,EAAE,aAAa;IACtB,cAAc,EAAE,+BAA+B;IAC/C,kBAAkB,EAAE,mCAAmC;IACvD,gBAAgB,EAAE,qCAAqC;CACxD,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAA8B;IAC1D,SAAS,EAAE,gCAAgC;IAC3C,OAAO,EAAE,uBAAuB;IAChC,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,EAAE;IACX,qEAAqE;IACrE,yEAAyE;IACzE,YAAY,EAAE,6BAA6B;IAC3C,OAAO,EAAE,iBAAiB;IAC1B,cAAc,EAAE,gCAAgC;IAChD,+EAA+E;IAC/E,kBAAkB,EAAE,EAAE;IACtB,gBAAgB,EAAE,EAAE;CACrB,CAAC;AAqBF,MAAM,OAAO,kBAAkB;IACR;IAArB,YAAqB,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAE3C,IAAI,MAAM;QACR,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,sBAAsB,CAAC,6CAA6C,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7H,CAAC;QACD,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC;IAEO,WAAW,GAAyB,EAAE,CAAC;IAE/C,eAAe,CAAC,OAA6B;QAC3C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAInD,MAAM,OAAO,oBAAoB;IACd,SAAS,CAAY;IACrB,OAAO,CAAS;IAChB,MAAM,CAAiB;IACvB,SAAS,CAA4B;IACrC,OAAO,CAAiB;IACxB,WAAW,CAA8C;IAE1E,YAAY,UAAuC,EAAE;QACnD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,yBAAyB,CAAC,oCAAoC,CAAC,CAAC;QAC/F,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QAChE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,KAAK,CACV,OAAoG;QAEpG,OAAO,IAAI,oBAAoB,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,UAAqE,EAAE;QACrF,OAAO,IAAI,oBAAoB,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,OAAmF;QACjG,OAAO,IAAI,oBAAoB,CAAC;YAC9B,GAAG,OAAO;YACV,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,yBAAyB;YACrD,SAAS,EAAE,iBAAiB;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAwC,EAAE;QACrD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAAwC,EAAE;QACxD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,oBAAyD,CAAC,CAAC;IACpH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAwC,EAAE;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAwC,EAAE;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAkC,EAAE,UAAwC,EAAE;QAC/F,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,UAAwC,EAAE;QAC1E,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IAED,iGAAiG;IACjG,KAAK,CAAC,YAAY,CAChB,QAAgB,EAChB,KAAkC,EAClC,UAAwC,EAAE;QAE1C,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,mBAAmB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACtG,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,UAAwC,EAAE;QAC7E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YACjG,MAAM,EAAE,QAAQ;YAChB,OAAO;YACP,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,MAAM,sBAAsB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAA+B,EAAE,UAAwC,EAAE;QACjG,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QACxG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CACpC;YACE,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,UAAU,EAAE,OAAO;YACnB,OAAO,EAAE,yBAAyB,CAAC,IAAI;YACvC,aAAa,EAAE,KAAK,CAAC,EAAE;YACvB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,EACD,OAAO,CACR,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAA+B,EAAE,UAAwC,EAAE;QACjG,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,yBAAyB,EAAE,CAAC;YACjD,MAAM,IAAI,yBAAyB,CACjC,6IAA6I,CAC9I,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QACxG,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,KAAsC,EACtC,UAAwC,EAAE;QAE1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CACxC;YACE,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,KAAK,CAAC,QAAQ;YACzB,gBAAgB,EAAE,KAAK,CAAC,QAAQ;YAChC,QAAQ,EAAE,KAAK,CAAC,aAAa;SAC9B,EACD,OAAO,CACR,CAAC;QACF,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,KAAuC,EACvC,UAAwC,EAAE;QAE1C,OAAO,IAAI,CAAC,QAAQ,CAAC,uBAAuB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,0BAA0B,CACtC,KAAoB,EACpB,KAAkG,EAClG,OAAqC;QAErC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CACpC;YACE,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,UAAU,EAAE,OAAO;YACnB,OAAO,EAAE,yBAAyB,CAAC,KAAK;YACxC,aAAa,EAAE,KAAK,CAAC,EAAE;YACvB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,EACD,OAAO,CACR,CAAC;QACF,MAAM,UAAU,GACd,KAAK,CAAC,SAAS,KAAK,KAAK;YACvB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;QACxG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,WAAW,CACf,IAAU,EACV,gBAA4C,EAAE,EAC9C,iBAA+C,EAAE;QAEjD,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,aAAa,CAAC,IAAI;YAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAA6B,EAAE,UAAwC,EAAE;QACrF,OAAO,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,SAAS,CAAC,OAAO,EACtB,KAAK,EACL,OAAO,EACP,6BAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAA4B,EAAE,UAAwC,EAAE;QAC3F,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,KAA0C,EAC1C,UAAwC,EAAE;QAE1C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CACtB,KAA4B,EAC5B,UAAwC,EAAE;QAE1C,OAAO,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,EAC1C,KAAK,EACL,OAAO,EACP,8BAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,UAAwC,EAAE;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,OAAO,CACjB,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAC3D,OAAO,EACP,8BAA6E,CAC9E,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,MAA2B;QACjC,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,KAAK,CAAC,cAAc,CAClB,UAA2H,EAAE;QAE7H,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,sBAAsB,CAC1B,UAA2H,EAAE;QAE7H,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CAAC,UAA2D,EAAE;QACpF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAuB,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YAClG,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;IACzD,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,UAA2H,EAAE;QAE7H,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACvF,OAAO,qBAAqB,CAAC,OAAO,CAAC;gBACnC,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO;gBACP,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACrD,OAAO,qBAAqB,CAAC,OAAO,CAAC;gBACnC,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,qBAAqB,CAAC,OAAO,CAAC;YACnC,GAAG;YACH,OAAO,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;YACrD,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,CACR,KAAmH,EACnH,UAAwC,EAAE;QAE1C,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;QACnD,OAAO,IAAI,CAAC,IAAI,CACd;YACE,GAAG,IAAI;YACP,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SACzC,EACxB,OAAO,CACR,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,KAAK,CACT,KAAwE,EACxE,UAAwC,EAAE;QAE1C,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAyB,EAAE,OAAO,CAAC,CAAC;IAC/G,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,KAA0B,EAAE,UAAwC,EAAE;QAC/E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CAAC,KAAqB,EAAE,UAAwC,EAAE;QAC7E,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,IAAI,yBAAyB,CAAC,0CAA0C,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAEO,eAAe,CAAC,IAAkB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,yBAAyB,CACjC,OAAO,IAAI,2FAA2F,CACvG,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,kBAAkB,CAAC,KAA2B;QACpD,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,yBAAyB,CAAC,uDAAuD,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,KAAmB;QAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,YAAY,GAA2B,EAAE,CAAC;QAChD,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7B,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,OAAqC,EAAE,QAA+B;QAC3G,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACpD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;YACjD,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,gBAAgB,CAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,IAAY,EACZ,IAAa,EACb,OAAqC,EACrC,QAA+B;QAE/B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,MAAc,EACd,IAAY,EACZ,IAAa,EACb,OAAqC,EACrC,QAA+B;QAE/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACpD,MAAM;YACN,OAAO;YACP,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,gBAAgB,CAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAI,IAAY,EAAE,IAAc,EAAE,OAAqC;QAC3F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;YACjD,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI;SACL,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,gBAAgB,CAAI,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAa,EAAE,OAAqC;QACtF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO;YACP,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,MAAM,sBAAsB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,sBAAsB,CAAC,0CAA0C,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChH,CAAC;QACD,OAAO,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAI,QAAkB,EAAE,QAA+B;QACnF,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,MAAM,sBAAsB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAS,CAAC;QAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,6BAA6B,CACrC,oEAAoE,QAAQ,CAAC,GAAG,IAAI,eAAe,EAAE,EACrG,MAAM,CAAC,KAAK,CAAC,MAAM,EACnB,IAAI,CACL,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,IAAS,CAAC;IAC1B,CAAC;IAEO,GAAG,CAAC,IAAY;QACtB,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;IACtE,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,KAAmB;QAC5C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,MAAM,EAAE,CAAC,CAAC;QAC9F,IAAI,KAAK;YAAE,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/E,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAiC;IAC5D,OAAO,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,OAAkC;IAC9D,OAAO,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7D,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type RealtimeAvatarApiErrorBody = unknown;
|
|
2
|
+
type RealtimeAvatarApiErrorMetadata = {
|
|
3
|
+
code?: string;
|
|
4
|
+
retryable?: boolean;
|
|
5
|
+
billingUrl?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare class RealtimeAvatarApiError extends Error {
|
|
8
|
+
readonly status: number;
|
|
9
|
+
readonly body: RealtimeAvatarApiErrorBody;
|
|
10
|
+
readonly response: Response;
|
|
11
|
+
constructor(message: string, status: number, body: RealtimeAvatarApiErrorBody, response: Response, metadata?: RealtimeAvatarApiErrorMetadata);
|
|
12
|
+
readonly code?: string;
|
|
13
|
+
readonly retryable?: boolean;
|
|
14
|
+
readonly billingUrl?: string;
|
|
15
|
+
get isBillingRequired(): boolean;
|
|
16
|
+
static fromResponse(response: Response): Promise<RealtimeAvatarApiError>;
|
|
17
|
+
}
|
|
18
|
+
export declare class RealtimeAvatarConfigError extends Error {
|
|
19
|
+
constructor(message: string);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Thrown when a server response parses as JSON but does not match the expected
|
|
23
|
+
* contract (the generated OpenAPI schema). Surfaces the underlying issues so a
|
|
24
|
+
* drifted backend is caught at the boundary instead of flowing through as a
|
|
25
|
+
* blindly-cast value.
|
|
26
|
+
*/
|
|
27
|
+
export declare class RealtimeAvatarValidationError extends Error {
|
|
28
|
+
readonly issues: unknown;
|
|
29
|
+
readonly value: unknown;
|
|
30
|
+
constructor(message: string, issues: unknown, value: unknown);
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAEjD,KAAK,8BAA8B,GAAG;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,QAAQ;gBAH3B,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,0BAA0B,EAChC,QAAQ,EAAE,QAAQ,EAC3B,QAAQ,GAAE,8BAAmC;IAS/C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B,IAAI,iBAAiB,IAAI,OAAO,CAE/B;WAEY,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAc/E;AAED,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IAGpD,QAAQ,CAAC,MAAM,EAAE,OAAO;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO;gBAFvB,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,OAAO;CAK1B"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export class RealtimeAvatarApiError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
body;
|
|
4
|
+
response;
|
|
5
|
+
constructor(message, status, body, response, metadata = {}) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.status = status;
|
|
8
|
+
this.body = body;
|
|
9
|
+
this.response = response;
|
|
10
|
+
this.name = "RealtimeAvatarApiError";
|
|
11
|
+
this.code = metadata.code;
|
|
12
|
+
this.retryable = metadata.retryable;
|
|
13
|
+
this.billingUrl = metadata.billingUrl;
|
|
14
|
+
}
|
|
15
|
+
code;
|
|
16
|
+
retryable;
|
|
17
|
+
billingUrl;
|
|
18
|
+
get isBillingRequired() {
|
|
19
|
+
return this.status === 402 || this.code === "insufficient_credits" || this.code === "spend_limit_exceeded";
|
|
20
|
+
}
|
|
21
|
+
static async fromResponse(response) {
|
|
22
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
23
|
+
const body = contentType.includes("application/json")
|
|
24
|
+
? await response.clone().json().catch(() => null)
|
|
25
|
+
: await response.clone().text().catch(() => "");
|
|
26
|
+
const detail = (extractErrorMessage(body) ?? response.statusText) || "Realtime Avatar request failed";
|
|
27
|
+
return new RealtimeAvatarApiError(`Realtime Avatar API ${response.status}: ${detail}`, response.status, body, response, extractErrorMetadata(body));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export class RealtimeAvatarConfigError extends Error {
|
|
31
|
+
constructor(message) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = "RealtimeAvatarConfigError";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Thrown when a server response parses as JSON but does not match the expected
|
|
38
|
+
* contract (the generated OpenAPI schema). Surfaces the underlying issues so a
|
|
39
|
+
* drifted backend is caught at the boundary instead of flowing through as a
|
|
40
|
+
* blindly-cast value.
|
|
41
|
+
*/
|
|
42
|
+
export class RealtimeAvatarValidationError extends Error {
|
|
43
|
+
issues;
|
|
44
|
+
value;
|
|
45
|
+
constructor(message, issues, value) {
|
|
46
|
+
super(message);
|
|
47
|
+
this.issues = issues;
|
|
48
|
+
this.value = value;
|
|
49
|
+
this.name = "RealtimeAvatarValidationError";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function extractErrorMessage(body) {
|
|
53
|
+
if (!body || typeof body !== "object")
|
|
54
|
+
return typeof body === "string" && body ? body : null;
|
|
55
|
+
if ("detail" in body)
|
|
56
|
+
return String(body.detail);
|
|
57
|
+
if ("error" in body)
|
|
58
|
+
return String(body.error);
|
|
59
|
+
if ("message" in body)
|
|
60
|
+
return String(body.message);
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
function extractErrorMetadata(body) {
|
|
64
|
+
if (!body || typeof body !== "object")
|
|
65
|
+
return {};
|
|
66
|
+
const record = body;
|
|
67
|
+
return {
|
|
68
|
+
...(typeof record.code === "string" ? { code: record.code } : {}),
|
|
69
|
+
...(typeof record.retryable === "boolean" ? { retryable: record.retryable } : {}),
|
|
70
|
+
...(typeof record.billingUrl === "string" ? { billingUrl: record.billingUrl } : {}),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|