@bitbitpress/client 1.1.3 → 1.1.4
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/dist/generated/openapi.d.ts +420 -0
- package/dist/react/index.d.ts +76 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +110 -3
- package/dist/react/index.js.map +1 -1
- package/dist/react-native-expo/BitBitPiece.d.ts +64 -0
- package/dist/react-native-expo/BitBitPiece.d.ts.map +1 -0
- package/dist/react-native-expo/BitBitPiece.js +164 -0
- package/dist/react-native-expo/BitBitPiece.js.map +1 -0
- package/dist/react-native-expo/bootstrapHtml.d.ts +13 -0
- package/dist/react-native-expo/bootstrapHtml.d.ts.map +1 -1
- package/dist/react-native-expo/bootstrapHtml.js +108 -12
- package/dist/react-native-expo/bootstrapHtml.js.map +1 -1
- package/dist/react-native-expo/index.d.ts +1 -0
- package/dist/react-native-expo/index.d.ts.map +1 -1
- package/dist/react-native-expo/index.js +1 -0
- package/dist/react-native-expo/index.js.map +1 -1
- package/dist/runtime/index.d.ts +32 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +68 -2
- package/dist/runtime/index.js.map +1 -1
- package/dist/studio/BitBitMobilePreview.d.ts +33 -0
- package/dist/studio/BitBitMobilePreview.d.ts.map +1 -0
- package/dist/studio/BitBitMobilePreview.js +120 -0
- package/dist/studio/BitBitMobilePreview.js.map +1 -0
- package/dist/studio/index.d.ts +7 -0
- package/dist/studio/index.d.ts.map +1 -0
- package/dist/studio/index.js +7 -0
- package/dist/studio/index.js.map +1 -0
- package/dist/user/index.d.ts +27 -0
- package/dist/user/index.d.ts.map +1 -1
- package/dist/user/index.js +6 -1
- package/dist/user/index.js.map +1 -1
- package/dist/user/synthesisPiece.d.ts +38 -0
- package/dist/user/synthesisPiece.d.ts.map +1 -0
- package/dist/user/synthesisPiece.js +58 -0
- package/dist/user/synthesisPiece.js.map +1 -0
- package/dist/user/track-batch-manager.d.ts +10 -4
- package/dist/user/track-batch-manager.d.ts.map +1 -1
- package/dist/user/track-batch-manager.js +6 -5
- package/dist/user/track-batch-manager.js.map +1 -1
- package/dist/user/track.d.ts +9 -0
- package/dist/user/track.d.ts.map +1 -1
- package/dist/user/track.js +17 -0
- package/dist/user/track.js.map +1 -1
- package/package.json +5 -1
package/dist/runtime/index.d.ts
CHANGED
|
@@ -35,9 +35,40 @@ export interface BitBitViewContext {
|
|
|
35
35
|
onEvent(name: string, payload?: unknown): void;
|
|
36
36
|
/** Brand design tokens (also mirrored as CSS custom properties on the host). */
|
|
37
37
|
theme: Record<string, string>;
|
|
38
|
+
/** The color scheme the host wants the view rendered in. Optional — when
|
|
39
|
+
* omitted, a dual-mode view should fall back to the environment's
|
|
40
|
+
* `prefers-color-scheme`. Native hosts set it from the OS appearance (the
|
|
41
|
+
* WebView can't read it reliably); web hosts usually leave it unset. */
|
|
42
|
+
colorScheme?: 'light' | 'dark';
|
|
38
43
|
/** Navigate a link (web: location; native: linking/navigation). */
|
|
39
44
|
navigate?(href: string): void;
|
|
45
|
+
/** Resolve a playable HLS URL for the piece's spoken content, synthesized on demand. Omit
|
|
46
|
+
* `ref` for the WHOLE piece's spoken content; pass `{ field }` to scope to a top-level field,
|
|
47
|
+
* and/or `{ index }` for a single turn. The text lives in the piece, so you don't build turns
|
|
48
|
+
* — you just reference what to voice. An audio player calls this on play, then hands the URL
|
|
49
|
+
* to `ctx.playMedia`. Absent when the host provides no TTS (players should hide playback). */
|
|
50
|
+
tts?(ref?: BitBitTtsRef): Promise<string>;
|
|
51
|
+
/** Attach an on-demand media URL (from `ctx.tts`) to an `<audio>`/`<video>` element and play
|
|
52
|
+
* it on every platform. The URL is HLS, so this uses native HLS where the browser supports it
|
|
53
|
+
* (Safari/iOS) and loads hls.js on demand elsewhere. ALWAYS use this instead of setting
|
|
54
|
+
* `el.src` directly — a plain `<audio src>` of an HLS playlist only plays on Safari/iOS.
|
|
55
|
+
* Returns a teardown to detach. Absent only in older hosts (feature-detect and fall back). */
|
|
56
|
+
playMedia?(el: HTMLMediaElement, url: string): () => void;
|
|
40
57
|
}
|
|
58
|
+
/** What `ctx.tts(ref)` points at — a REFERENCE into the piece's spoken content, not the text:
|
|
59
|
+
* omit for the whole piece, `field` scopes to a top-level field, `index` picks a single turn. */
|
|
60
|
+
export interface BitBitTtsRef {
|
|
61
|
+
field?: string;
|
|
62
|
+
index?: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Attach an HLS URL (from `ctx.tts`) to a media element and make it play on every platform:
|
|
66
|
+
* native HLS where the browser supports it (Safari/iOS), else hls.js loaded on demand from the
|
|
67
|
+
* CDN (Chrome/Firefox/Android). Returns a teardown that detaches the source / destroys hls.js.
|
|
68
|
+
* This is the default `ctx.playMedia` for web (Shadow-DOM) hosts; the WebView/iframe hosts
|
|
69
|
+
* provide an equivalent inline in their bootstrap.
|
|
70
|
+
*/
|
|
71
|
+
export declare function attachHlsMedia(el: HTMLMediaElement, url: string): () => void;
|
|
41
72
|
/** Handle returned by a mounted view: push new props as `data` streams in,
|
|
42
73
|
* and tear down. */
|
|
43
74
|
export interface GeneratedUiViewHandle {
|
|
@@ -54,6 +85,7 @@ export interface GeneratedUiModule {
|
|
|
54
85
|
/**
|
|
55
86
|
* Load a generated bundle. `src` is either a URL to the ESM (served by the
|
|
56
87
|
* API/CDN) or the bundle source as a string (dynamic-imported via a Blob URL).
|
|
88
|
+
* Results are cached by `src`.
|
|
57
89
|
*/
|
|
58
90
|
export declare function loadGeneratedModule(src: string): Promise<GeneratedUiModule>;
|
|
59
91
|
export interface MountGeneratedViewOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;mCAEmC;AACnC,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,OAAO;IAClD;yEACqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC;CACT;AAED;;gEAEgE;AAChE,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,IAAI,EAAE,CAAC,CAAC;IACR;;6EAEyE;IACzE,OAAO,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,GAAG,EAAE,iBAAiB,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9C,+DAA+D;IAC/D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;mCAEmC;AACnC,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,OAAO;IAClD;yEACqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC;CACT;AAED;;gEAEgE;AAChE,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,IAAI,EAAE,CAAC,CAAC;IACR;;6EAEyE;IACzE,OAAO,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,GAAG,EAAE,iBAAiB,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9C,+DAA+D;IAC/D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B;;;6EAGyE;IACzE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,mEAAmE;IACnE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;;;;mGAI+F;IAC/F,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C;;;;mGAI+F;IAC/F,SAAS,CAAC,CAAC,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;CAC3D;AAED;kGACkG;AAClG,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,IAAI,CAqC5E;AAED;qBACqB;AACrB,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;0CAG0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,GAAG,qBAAqB,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;CACvF;AAeD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAQ3E;AA6BD,MAAM,WAAW,yBAAyB;IACxC;;mFAE+E;IAC/E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AASD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE,yBAA8B,GACtC,qBAAqB,CA0BvB"}
|
package/dist/runtime/index.js
CHANGED
|
@@ -8,17 +8,77 @@
|
|
|
8
8
|
* never shares a React instance with the bundle, sidestepping duplicate-React
|
|
9
9
|
* hook errors. The contract here is types + DOM glue only (no React import).
|
|
10
10
|
*/
|
|
11
|
+
/** Load an ES module from a runtime URL. Kept behind a parameter (not a literal import) so a
|
|
12
|
+
* bundler leaves it as a real dynamic import instead of trying to resolve the CDN URL at build. */
|
|
13
|
+
function importFromUrl(url) {
|
|
14
|
+
return import(/* @vite-ignore */ /* webpackIgnore: true */ url);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Attach an HLS URL (from `ctx.tts`) to a media element and make it play on every platform:
|
|
18
|
+
* native HLS where the browser supports it (Safari/iOS), else hls.js loaded on demand from the
|
|
19
|
+
* CDN (Chrome/Firefox/Android). Returns a teardown that detaches the source / destroys hls.js.
|
|
20
|
+
* This is the default `ctx.playMedia` for web (Shadow-DOM) hosts; the WebView/iframe hosts
|
|
21
|
+
* provide an equivalent inline in their bootstrap.
|
|
22
|
+
*/
|
|
23
|
+
export function attachHlsMedia(el, url) {
|
|
24
|
+
if (el.canPlayType('application/vnd.apple.mpegurl')) {
|
|
25
|
+
el.src = url;
|
|
26
|
+
return () => {
|
|
27
|
+
el.removeAttribute('src');
|
|
28
|
+
el.load();
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
let destroyed = false;
|
|
32
|
+
let hls = null;
|
|
33
|
+
void importFromUrl('https://esm.sh/hls.js@1')
|
|
34
|
+
.then((mod) => {
|
|
35
|
+
if (destroyed)
|
|
36
|
+
return;
|
|
37
|
+
const Hls = (mod.default ?? mod);
|
|
38
|
+
if (!Hls?.isSupported()) {
|
|
39
|
+
el.src = url; // last resort — better than silence
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const instance = new Hls();
|
|
43
|
+
hls = instance;
|
|
44
|
+
instance.loadSource(url);
|
|
45
|
+
instance.attachMedia(el);
|
|
46
|
+
})
|
|
47
|
+
.catch(() => {
|
|
48
|
+
if (!destroyed)
|
|
49
|
+
el.src = url;
|
|
50
|
+
});
|
|
51
|
+
return () => {
|
|
52
|
+
destroyed = true;
|
|
53
|
+
hls?.destroy();
|
|
54
|
+
};
|
|
55
|
+
}
|
|
11
56
|
function isGeneratedUiModule(value) {
|
|
12
57
|
return typeof value?.mount === 'function';
|
|
13
58
|
}
|
|
14
59
|
function toViewHandle(result) {
|
|
15
60
|
return typeof result === 'function' ? { update: () => { }, unmount: result } : result;
|
|
16
61
|
}
|
|
62
|
+
// Cache loaded modules by source so a remount (e.g. after an in-place edit) reuses the
|
|
63
|
+
// already-imported module instead of re-creating a Blob URL and re-importing — keeping
|
|
64
|
+
// the remount a near-instant re-render rather than an async reload flash.
|
|
65
|
+
const moduleCache = new Map();
|
|
17
66
|
/**
|
|
18
67
|
* Load a generated bundle. `src` is either a URL to the ESM (served by the
|
|
19
68
|
* API/CDN) or the bundle source as a string (dynamic-imported via a Blob URL).
|
|
69
|
+
* Results are cached by `src`.
|
|
20
70
|
*/
|
|
21
|
-
export
|
|
71
|
+
export function loadGeneratedModule(src) {
|
|
72
|
+
const cached = moduleCache.get(src);
|
|
73
|
+
if (cached)
|
|
74
|
+
return cached;
|
|
75
|
+
const promise = importGeneratedModule(src);
|
|
76
|
+
moduleCache.set(src, promise);
|
|
77
|
+
// Don't cache a failed load — let a later attempt retry.
|
|
78
|
+
promise.catch(() => moduleCache.delete(src));
|
|
79
|
+
return promise;
|
|
80
|
+
}
|
|
81
|
+
async function importGeneratedModule(src) {
|
|
22
82
|
const isUrl = /^(https?:|blob:|data:|\/)/.test(src);
|
|
23
83
|
let url = src;
|
|
24
84
|
let revoke;
|
|
@@ -75,7 +135,13 @@ export function mountGeneratedView(host, mod, props, options = {}) {
|
|
|
75
135
|
handle.update(next);
|
|
76
136
|
},
|
|
77
137
|
unmount: () => {
|
|
78
|
-
|
|
138
|
+
// The host app may edit the mounted DOM in place (e.g. contenteditable), which
|
|
139
|
+
// can break the bundle framework's own teardown reconciliation. Swallow that —
|
|
140
|
+
// removing the container below discards the whole subtree regardless.
|
|
141
|
+
try {
|
|
142
|
+
handle.unmount();
|
|
143
|
+
}
|
|
144
|
+
catch { }
|
|
79
145
|
if (root.contains(container))
|
|
80
146
|
root.removeChild(container);
|
|
81
147
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { BitBitTtsRef } from '../runtime/index.js';
|
|
2
|
+
export interface BitBitMobilePreviewProps {
|
|
3
|
+
/** The mobile bundle source (Preact ESM). */
|
|
4
|
+
code: string;
|
|
5
|
+
/** Field values passed to the bundle as `props.data`. */
|
|
6
|
+
data: unknown;
|
|
7
|
+
/** Render mode override (`ctx.colorScheme`). */
|
|
8
|
+
colorScheme?: 'light' | 'dark';
|
|
9
|
+
/** Brand tokens for `ctx.theme`. Bundles bake their own colors, so usually unused. */
|
|
10
|
+
theme?: Record<string, string>;
|
|
11
|
+
/** Resolve on-demand audio for an `<audio>` player (mint a streaming URL). */
|
|
12
|
+
onTts?: (ref?: BitBitTtsRef) => Promise<string>;
|
|
13
|
+
/** Emulated device logical size (CSS px). Defaults to iPhone 15 Pro Max (430×932). */
|
|
14
|
+
deviceWidth?: number;
|
|
15
|
+
deviceHeight?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Renders a MOBILE piece bundle inside an `<iframe>` so it runs against a real phone-sized
|
|
19
|
+
* viewport: `vw`/`vh`/`100dvh`, `position: fixed`, and safe-area insets all resolve to the
|
|
20
|
+
* frame, matching the native WebView. (A Shadow-DOM mount resolves them against the desktop
|
|
21
|
+
* window instead, rendering the UI ~2-3x oversized.) It reuses the native bootstrap HTML +
|
|
22
|
+
* message protocol; only the parent side of the bridge (data/scheme in, tts out) lives here.
|
|
23
|
+
*/
|
|
24
|
+
export declare function BitBitMobilePreview({ code, data, colorScheme, theme, onTts, deviceWidth, deviceHeight, }: BitBitMobilePreviewProps): import("react").DetailedReactHTMLElement<{
|
|
25
|
+
ref: import("react").RefObject<HTMLDivElement>;
|
|
26
|
+
style: {
|
|
27
|
+
position: "relative";
|
|
28
|
+
width: string;
|
|
29
|
+
height: string;
|
|
30
|
+
overflow: "hidden";
|
|
31
|
+
};
|
|
32
|
+
}, HTMLDivElement>;
|
|
33
|
+
//# sourceMappingURL=BitBitMobilePreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitBitMobilePreview.d.ts","sourceRoot":"","sources":["../../src/studio/BitBitMobilePreview.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD,MAAM,WAAW,wBAAwB;IACvC,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,IAAI,EAAE,OAAO,CAAC;IACd,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,IAAI,EACJ,WAAW,EACX,KAAK,EACL,KAAK,EACL,WAA0B,EAC1B,YAA4B,GAC7B,EAAE,wBAAwB;;;;;;;;mBAiI1B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { createElement, useEffect, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { buildBootstrapHtml } from '../react-native-expo/bootstrapHtml.js';
|
|
3
|
+
/** iPhone 15 Pro Max logical viewport (CSS px) — the emulated device. A `<meta viewport>`
|
|
4
|
+
* is ignored inside a desktop iframe, so the ONLY way the bundle sees a real phone-width
|
|
5
|
+
* viewport is to size the iframe to these exact dimensions and scale it down to fit. */
|
|
6
|
+
const DEVICE_WIDTH = 430;
|
|
7
|
+
const DEVICE_HEIGHT = 932;
|
|
8
|
+
/**
|
|
9
|
+
* Renders a MOBILE piece bundle inside an `<iframe>` so it runs against a real phone-sized
|
|
10
|
+
* viewport: `vw`/`vh`/`100dvh`, `position: fixed`, and safe-area insets all resolve to the
|
|
11
|
+
* frame, matching the native WebView. (A Shadow-DOM mount resolves them against the desktop
|
|
12
|
+
* window instead, rendering the UI ~2-3x oversized.) It reuses the native bootstrap HTML +
|
|
13
|
+
* message protocol; only the parent side of the bridge (data/scheme in, tts out) lives here.
|
|
14
|
+
*/
|
|
15
|
+
export function BitBitMobilePreview({ code, data, colorScheme, theme, onTts, deviceWidth = DEVICE_WIDTH, deviceHeight = DEVICE_HEIGHT, }) {
|
|
16
|
+
const iframeRef = useRef(null);
|
|
17
|
+
const wrapperRef = useRef(null);
|
|
18
|
+
const dataRef = useRef(data);
|
|
19
|
+
dataRef.current = data;
|
|
20
|
+
const onTtsRef = useRef(onTts);
|
|
21
|
+
onTtsRef.current = onTts;
|
|
22
|
+
const readyRef = useRef(false);
|
|
23
|
+
// Fit the fixed-resolution device into whatever space the frame gives us.
|
|
24
|
+
const [scale, setScale] = useState(1);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const el = wrapperRef.current;
|
|
27
|
+
if (!el)
|
|
28
|
+
return;
|
|
29
|
+
const measure = () => {
|
|
30
|
+
const { width, height } = el.getBoundingClientRect();
|
|
31
|
+
if (width > 0 && height > 0)
|
|
32
|
+
setScale(Math.min(width / deviceWidth, height / deviceHeight));
|
|
33
|
+
};
|
|
34
|
+
measure();
|
|
35
|
+
const observer = new ResizeObserver(measure);
|
|
36
|
+
observer.observe(el);
|
|
37
|
+
return () => observer.disconnect();
|
|
38
|
+
}, [deviceWidth, deviceHeight]);
|
|
39
|
+
// Rebuilt only when the bundle changes (which reloads the iframe). `colorScheme` is baked as
|
|
40
|
+
// the initial value and updated live via postMessage after, so a scheme toggle doesn't reload.
|
|
41
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: bake initial scheme/tts, update live
|
|
42
|
+
const srcDoc = useMemo(() => buildBootstrapHtml({
|
|
43
|
+
bundle: code,
|
|
44
|
+
theme: theme ?? {},
|
|
45
|
+
...(colorScheme ? { colorScheme } : {}),
|
|
46
|
+
enableTts: onTtsRef.current != null,
|
|
47
|
+
autoHeight: false,
|
|
48
|
+
}), [code]);
|
|
49
|
+
// A reload (new bundle) starts a fresh document — don't push to it until it re-signals ready.
|
|
50
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: code is a deliberate reset trigger — a new bundle reloads the iframe, so readyRef must clear until it re-signals ready.
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
readyRef.current = false;
|
|
53
|
+
}, [code]);
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
const send = (m) => iframeRef.current?.contentWindow?.postMessage(m, '*');
|
|
56
|
+
const onMessage = (e) => {
|
|
57
|
+
if (e.source !== iframeRef.current?.contentWindow)
|
|
58
|
+
return;
|
|
59
|
+
const m = e.data;
|
|
60
|
+
if (!m || typeof m !== 'object')
|
|
61
|
+
return;
|
|
62
|
+
if (m.kind === 'ready') {
|
|
63
|
+
readyRef.current = true;
|
|
64
|
+
send({ kind: 'update', data: dataRef.current });
|
|
65
|
+
}
|
|
66
|
+
else if (m.kind === 'tts') {
|
|
67
|
+
const fn = onTtsRef.current;
|
|
68
|
+
const id = m.id;
|
|
69
|
+
if (!fn) {
|
|
70
|
+
send({ kind: 'resolveTts', id, error: 'Audio unavailable' });
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
Promise.resolve(fn(m.ref)).then((url) => send({ kind: 'resolveTts', id, url }), (err) => send({
|
|
74
|
+
kind: 'resolveTts',
|
|
75
|
+
id,
|
|
76
|
+
error: err instanceof Error ? err.message : 'Could not load audio',
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
window.addEventListener('message', onMessage);
|
|
81
|
+
return () => window.removeEventListener('message', onMessage);
|
|
82
|
+
}, []);
|
|
83
|
+
// Push fresh field values once the iframe is ready, and on every change after.
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
if (readyRef.current)
|
|
86
|
+
iframeRef.current?.contentWindow?.postMessage({ kind: 'update', data }, '*');
|
|
87
|
+
}, [data]);
|
|
88
|
+
// Live light/dark without reloading.
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
if (readyRef.current)
|
|
91
|
+
iframeRef.current?.contentWindow?.postMessage({ kind: 'setColorScheme', scheme: colorScheme ?? null }, '*');
|
|
92
|
+
}, [colorScheme]);
|
|
93
|
+
// The iframe renders at the device's real resolution (so the bundle sees a 430px viewport);
|
|
94
|
+
// a centered scale() shrinks it to fit the frame without touching the internal layout.
|
|
95
|
+
return createElement('div', {
|
|
96
|
+
ref: wrapperRef,
|
|
97
|
+
style: {
|
|
98
|
+
position: 'relative',
|
|
99
|
+
width: '100%',
|
|
100
|
+
height: '100%',
|
|
101
|
+
overflow: 'hidden',
|
|
102
|
+
},
|
|
103
|
+
}, createElement('div', {
|
|
104
|
+
style: {
|
|
105
|
+
position: 'absolute',
|
|
106
|
+
top: '50%',
|
|
107
|
+
left: '50%',
|
|
108
|
+
width: deviceWidth,
|
|
109
|
+
height: deviceHeight,
|
|
110
|
+
transform: `translate(-50%, -50%) scale(${scale})`,
|
|
111
|
+
transformOrigin: 'center center',
|
|
112
|
+
},
|
|
113
|
+
}, createElement('iframe', {
|
|
114
|
+
ref: iframeRef,
|
|
115
|
+
srcDoc,
|
|
116
|
+
title: 'Mobile preview',
|
|
117
|
+
style: { width: '100%', height: '100%', border: '0', display: 'block' },
|
|
118
|
+
})));
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=BitBitMobilePreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitBitMobilePreview.js","sourceRoot":"","sources":["../../src/studio/BitBitMobilePreview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Studio-only entry (`@bitbitpress/client/studio`) — first-party authoring tools for the
|
|
3
|
+
* BitBit studio, NOT part of the customer-facing runtime. Kept in this package (not bitbit-web)
|
|
4
|
+
* so the mobile preview stays byte-faithful to the native WebView bootstrap it reuses.
|
|
5
|
+
*/
|
|
6
|
+
export { BitBitMobilePreview, type BitBitMobilePreviewProps, } from './BitBitMobilePreview.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/studio/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Studio-only entry (`@bitbitpress/client/studio`) — first-party authoring tools for the
|
|
3
|
+
* BitBit studio, NOT part of the customer-facing runtime. Kept in this package (not bitbit-web)
|
|
4
|
+
* so the mobile preview stays byte-faithful to the native WebView bootstrap it reuses.
|
|
5
|
+
*/
|
|
6
|
+
export { BitBitMobilePreview, } from './BitBitMobilePreview.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/studio/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,mBAAmB,GAEpB,MAAM,0BAA0B,CAAC"}
|
package/dist/user/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { type RecommendationsRequest, type RecommendationsResponse } from './rec
|
|
|
6
6
|
import { type ReportRequest, type ReportResponse } from './report.js';
|
|
7
7
|
import { type Signal, type SignalRequest, type SignalResponse } from './signal.js';
|
|
8
8
|
import { type CreateUserSubmissionRequest, type CreateUserSubmissionResponse, type ListUserSubmissionsRequest, type ListUserSubmissionsResponse, type SubmissionFeed, type SubmissionState, type SubmitRequest, type SubmitResponse } from './submissions.js';
|
|
9
|
+
import { type SynthesisPieceResponse, type SynthesisPieceTtsRef } from './synthesisPiece.js';
|
|
9
10
|
import { type SynthesizeEvent, type SynthesizeItemResponse } from './synthesize.js';
|
|
10
11
|
import { type SynthesizeOnStreamingData } from './synthesize-batch-manager.js';
|
|
11
12
|
import { type SynthesisUiStreamEvent, type SynthesizeUiEvent, type SynthesizeUiRequest, type SynthesizeUiRequestItem } from './synthesizeUi.js';
|
|
@@ -129,6 +130,13 @@ export interface UserMethods {
|
|
|
129
130
|
* @param event - Single event to record
|
|
130
131
|
*/
|
|
131
132
|
trackItem(event: TrackEvent): Promise<NonNullable<TrackResponse>>;
|
|
133
|
+
/**
|
|
134
|
+
* Record a single SynthesisPiece embed event (batched) — the piece counterpart of `trackItem`,
|
|
135
|
+
* posted to the dedicated piece-events endpoint so a shared keyName is never misattributed.
|
|
136
|
+
*
|
|
137
|
+
* @param event - Single event to record
|
|
138
|
+
*/
|
|
139
|
+
trackPieceItem(event: TrackEvent): Promise<NonNullable<TrackResponse>>;
|
|
132
140
|
/**
|
|
133
141
|
* Synthesize content items personalized to the user (streaming SSE).
|
|
134
142
|
*
|
|
@@ -180,6 +188,25 @@ export interface UserMethods {
|
|
|
180
188
|
* (bundles + theme) then per-item data events, index-matched to `items`.
|
|
181
189
|
*/
|
|
182
190
|
synthesizeUis(items: SynthesizeUiRequestItem[], platform?: SynthesizeUiRequest['platform']): Promise<AsyncIterable<SynthesizeUiEvent>>;
|
|
191
|
+
/**
|
|
192
|
+
* Resolve a published synthesis piece for embedding by `keyName` — its generated
|
|
193
|
+
* web bundle, current field values (incl. pre-generated `audioData.url`s), and
|
|
194
|
+
* deployment theme. This is the path `<BitBitPiece keyName>` uses under the hood.
|
|
195
|
+
*
|
|
196
|
+
* @param keyName - Stable identifier of the piece to embed
|
|
197
|
+
*/
|
|
198
|
+
getSynthesisPiece(keyName: string): Promise<SynthesisPieceResponse>;
|
|
199
|
+
/**
|
|
200
|
+
* Mint a short-lived streaming audio URL for a published piece's spoken turns — the
|
|
201
|
+
* on-demand TTS a rendered audio player calls on play. Pass one turn for a single narration,
|
|
202
|
+
* or several (each its own voice) for a multi-speaker dialogue synthesized as one clip. Every
|
|
203
|
+
* turn's `text` must be part of the piece (`keyName`). This is the path `<BitBitPiece
|
|
204
|
+
* keyName>` wires into `ctx.tts` under the hood.
|
|
205
|
+
*
|
|
206
|
+
* @param keyName - Stable identifier of the piece the turns belong to
|
|
207
|
+
* @param turns - The ordered turns to synthesize
|
|
208
|
+
*/
|
|
209
|
+
synthesisPieceTtsUrl(keyName: string, ref?: SynthesisPieceTtsRef): Promise<string>;
|
|
183
210
|
}
|
|
184
211
|
/**
|
|
185
212
|
* User-related API methods (uses shared auth store).
|
package/dist/user/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAE1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAE1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAa,MAAM,aAAa,CAAC;AACjF,OAAO,EAAgB,KAAK,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjG,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EAGjC,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAGhC,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,sBAAsB,EAAc,MAAM,iBAAiB,CAAC;AAChG,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAG7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAiB,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":"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"}
|
package/dist/user/index.js
CHANGED
|
@@ -8,6 +8,7 @@ const report_js_1 = require("./report.js");
|
|
|
8
8
|
const signal_js_1 = require("./signal.js");
|
|
9
9
|
const signal_batch_manager_js_1 = require("./signal-batch-manager.js");
|
|
10
10
|
const submissions_js_1 = require("./submissions.js");
|
|
11
|
+
const synthesisPiece_js_1 = require("./synthesisPiece.js");
|
|
11
12
|
const synthesize_js_1 = require("./synthesize.js");
|
|
12
13
|
const synthesize_batch_manager_js_1 = require("./synthesize-batch-manager.js");
|
|
13
14
|
const synthesizeUi_js_1 = require("./synthesizeUi.js");
|
|
@@ -21,7 +22,8 @@ function createUserMethods(authStore, config, synthesizeBatchTimeout = 250, sign
|
|
|
21
22
|
const getConfigWithToken = authStore.getConfigWithToken.bind(authStore);
|
|
22
23
|
const synthesizeBatchManager = new synthesize_batch_manager_js_1.SynthesizeBatchManager(getConfigWithToken, synthesizeBatchTimeout);
|
|
23
24
|
const signalBatchManager = new signal_batch_manager_js_1.SignalBatchManager(getConfigWithToken, signalBatchTimeout);
|
|
24
|
-
const trackBatchManager = new track_batch_manager_js_1.TrackBatchManager(getConfigWithToken, signalBatchTimeout);
|
|
25
|
+
const trackBatchManager = new track_batch_manager_js_1.TrackBatchManager(getConfigWithToken, signalBatchTimeout, track_js_1.recordEvents);
|
|
26
|
+
const pieceTrackBatchManager = new track_batch_manager_js_1.TrackBatchManager(getConfigWithToken, signalBatchTimeout, track_js_1.recordPieceEvents);
|
|
25
27
|
return {
|
|
26
28
|
authenticate: authStore.authenticate.bind(authStore),
|
|
27
29
|
token: (ssoToken) => (0, token_js_1.exchangeToken)(config, ssoToken),
|
|
@@ -38,12 +40,15 @@ function createUserMethods(authStore, config, synthesizeBatchTimeout = 250, sign
|
|
|
38
40
|
signalItem: (signal) => signalBatchManager.addSignal(signal),
|
|
39
41
|
track: (options) => getConfigWithToken().then((cfg) => (0, track_js_1.recordEvents)(cfg, options)),
|
|
40
42
|
trackItem: (event) => trackBatchManager.addEvent(event),
|
|
43
|
+
trackPieceItem: (event) => pieceTrackBatchManager.addEvent(event),
|
|
41
44
|
synthesize: (items, options) => getConfigWithToken().then((cfg) => (0, synthesize_js_1.synthesize)(cfg, items, options)),
|
|
42
45
|
synthesizeItem: (item, onStreamingData) => synthesizeBatchManager.addItem(item, onStreamingData),
|
|
43
46
|
interactions: (options) => getConfigWithToken().then((cfg) => (0, interaction_js_1.getInteractions)(cfg, options)),
|
|
44
47
|
respondToInteraction: (interactionId, options) => getConfigWithToken().then((cfg) => (0, interaction_js_1.respondToInteraction)(cfg, interactionId, options)),
|
|
45
48
|
synthesizeUi: (request) => getConfigWithToken().then((cfg) => (0, synthesizeUi_js_1.synthesizeUi)(cfg, request)),
|
|
46
49
|
synthesizeUis: (items, platform) => getConfigWithToken().then((cfg) => (0, synthesizeUi_js_1.synthesizeUis)(cfg, items, platform)),
|
|
50
|
+
getSynthesisPiece: (keyName) => getConfigWithToken().then((cfg) => (0, synthesisPiece_js_1.getSynthesisPiece)(cfg, keyName)),
|
|
51
|
+
synthesisPieceTtsUrl: (keyName, ref) => getConfigWithToken().then((cfg) => (0, synthesisPiece_js_1.synthesisPieceTtsUrl)(cfg, keyName, ref)),
|
|
47
52
|
};
|
|
48
53
|
}
|
|
49
54
|
//# sourceMappingURL=index.js.map
|
package/dist/user/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { paths } from '../generated/openapi.js';
|
|
2
|
+
import type { RequestConfig } from '../request.js';
|
|
3
|
+
/** A resolved published piece: its generated web bundle + current field values +
|
|
4
|
+
* deployment theme, ready to mount via `<BitBitPiece>`. */
|
|
5
|
+
export type SynthesisPieceResponse = {
|
|
6
|
+
uiWebCode: string;
|
|
7
|
+
fields: Record<string, unknown>;
|
|
8
|
+
theme: Record<string, string>;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Resolve a published synthesis piece for embedding by its `keyName`: the
|
|
12
|
+
* generated web bundle (`uiWebCode`), current field values (`fields`, including
|
|
13
|
+
* any pre-generated `audioData.url`s), and deployment `theme`. Used by
|
|
14
|
+
* `<BitBitPiece keyName>`. Hits the batch endpoint with a single item.
|
|
15
|
+
*
|
|
16
|
+
* @param config - Request configuration with base URL, timeout, fetch, and optional token
|
|
17
|
+
* @param keyName - Stable identifier of the piece to embed
|
|
18
|
+
* @returns Promise resolving with the piece's bundle, fields, and theme
|
|
19
|
+
*/
|
|
20
|
+
export declare function getSynthesisPiece(config: RequestConfig, keyName: string): Promise<SynthesisPieceResponse>;
|
|
21
|
+
type SynthesisPieceTtsBody = paths['/v1/user/synthesis-piece/tts']['post']['requestBody']['content']['application/json'];
|
|
22
|
+
/** A reference into a published piece's spoken content — omit for the whole piece, `field` scopes
|
|
23
|
+
* to a top-level field, `index` picks a single turn. The text lives in the piece. */
|
|
24
|
+
export type SynthesisPieceTtsRef = Pick<SynthesisPieceTtsBody, 'field' | 'index'>;
|
|
25
|
+
/**
|
|
26
|
+
* Mint a short-lived HLS URL for a published piece's spoken content — the on-demand TTS entry
|
|
27
|
+
* point a rendered audio player calls on play (via `ctx.tts`). The request REFERENCES the piece's
|
|
28
|
+
* content (omit `ref` for the whole piece, `field` to scope, `index` for a single turn); the
|
|
29
|
+
* server resolves the turns from the piece itself. Play the returned URL via `ctx.playMedia`.
|
|
30
|
+
*
|
|
31
|
+
* @param config - Request configuration with base URL, timeout, fetch, and optional token
|
|
32
|
+
* @param keyName - Stable identifier of the piece to voice
|
|
33
|
+
* @param ref - Optional reference into the piece's spoken content
|
|
34
|
+
* @returns Promise resolving with the playable streaming URL
|
|
35
|
+
*/
|
|
36
|
+
export declare function synthesisPieceTtsUrl(config: RequestConfig, keyName: string, ref?: SynthesisPieceTtsRef): Promise<string>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=synthesisPiece.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesisPiece.d.ts","sourceRoot":"","sources":["../../src/user/synthesisPiece.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAMnD;4DAC4D;AAC5D,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,sBAAsB,CAAC,CAgBjC;AAED,KAAK,qBAAqB,GACxB,KAAK,CAAC,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAI9F;sFACsF;AACtF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;AAElF;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,oBAAoB,GACzB,OAAO,CAAC,MAAM,CAAC,CAcjB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSynthesisPiece = getSynthesisPiece;
|
|
4
|
+
exports.synthesisPieceTtsUrl = synthesisPieceTtsUrl;
|
|
5
|
+
const request_js_1 = require("../request.js");
|
|
6
|
+
/**
|
|
7
|
+
* Resolve a published synthesis piece for embedding by its `keyName`: the
|
|
8
|
+
* generated web bundle (`uiWebCode`), current field values (`fields`, including
|
|
9
|
+
* any pre-generated `audioData.url`s), and deployment `theme`. Used by
|
|
10
|
+
* `<BitBitPiece keyName>`. Hits the batch endpoint with a single item.
|
|
11
|
+
*
|
|
12
|
+
* @param config - Request configuration with base URL, timeout, fetch, and optional token
|
|
13
|
+
* @param keyName - Stable identifier of the piece to embed
|
|
14
|
+
* @returns Promise resolving with the piece's bundle, fields, and theme
|
|
15
|
+
*/
|
|
16
|
+
async function getSynthesisPiece(config, keyName) {
|
|
17
|
+
const response = await (0, request_js_1.makeRequest)(config, {
|
|
18
|
+
method: 'POST',
|
|
19
|
+
path: '/v1/user/synthesis-piece',
|
|
20
|
+
body: { items: [{ keyName }] },
|
|
21
|
+
});
|
|
22
|
+
const item = response?.items?.[0];
|
|
23
|
+
if (!item || item.error || typeof item.uiWebCode !== 'string') {
|
|
24
|
+
throw new Error(item?.error ?? 'Failed to load piece: no data in response');
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
uiWebCode: item.uiWebCode,
|
|
28
|
+
fields: (item.fields ?? {}),
|
|
29
|
+
theme: response.theme,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Mint a short-lived HLS URL for a published piece's spoken content — the on-demand TTS entry
|
|
34
|
+
* point a rendered audio player calls on play (via `ctx.tts`). The request REFERENCES the piece's
|
|
35
|
+
* content (omit `ref` for the whole piece, `field` to scope, `index` for a single turn); the
|
|
36
|
+
* server resolves the turns from the piece itself. Play the returned URL via `ctx.playMedia`.
|
|
37
|
+
*
|
|
38
|
+
* @param config - Request configuration with base URL, timeout, fetch, and optional token
|
|
39
|
+
* @param keyName - Stable identifier of the piece to voice
|
|
40
|
+
* @param ref - Optional reference into the piece's spoken content
|
|
41
|
+
* @returns Promise resolving with the playable streaming URL
|
|
42
|
+
*/
|
|
43
|
+
async function synthesisPieceTtsUrl(config, keyName, ref) {
|
|
44
|
+
const response = await (0, request_js_1.makeRequest)(config, {
|
|
45
|
+
method: 'POST',
|
|
46
|
+
path: '/v1/user/synthesis-piece/tts',
|
|
47
|
+
body: {
|
|
48
|
+
keyName,
|
|
49
|
+
...(ref?.field != null ? { field: ref.field } : {}),
|
|
50
|
+
...(ref?.index != null ? { index: ref.index } : {}),
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
if (!response?.url) {
|
|
54
|
+
throw new Error(response?.error ?? 'Failed to synthesize audio');
|
|
55
|
+
}
|
|
56
|
+
return response.url;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=synthesisPiece.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesisPiece.js","sourceRoot":"","sources":["../../src/user/synthesisPiece.ts"],"names":[],"mappings":";;AAyBA,8CAmBC;AAsBD,oDAkBC;AAlFD,8CAA4C;AAa5C;;;;;;;;;GASG;AACI,KAAK,UAAU,iBAAiB,CACrC,MAAqB,EACrB,OAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAW,EAA0B,MAAM,EAAE;QAClE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;KAC/B,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,2CAA2C,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAA4B;QACtD,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CAAC;AACJ,CAAC;AAWD;;;;;;;;;;GAUG;AACI,KAAK,UAAU,oBAAoB,CACxC,MAAqB,EACrB,OAAe,EACf,GAA0B;IAE1B,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAW,EAAwB,MAAM,EAAE;QAChE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,8BAA8B;QACpC,IAAI,EAAE;YACJ,OAAO;YACP,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD;KACF,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,KAAK,IAAI,4BAA4B,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC;AACtB,CAAC"}
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
import type { RequestConfig } from '../request.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { TrackEvent, TrackResponse } from './track.js';
|
|
3
|
+
/** Sends a batch of events to a specific endpoint (UI `/events` or piece `/piece-events`). */
|
|
4
|
+
type RecordFn = (config: RequestConfig, options: {
|
|
5
|
+
events: TrackEvent[];
|
|
6
|
+
}) => Promise<NonNullable<TrackResponse>>;
|
|
3
7
|
/**
|
|
4
|
-
* Batch manager for `trackItem` — batches individual events and sends them
|
|
5
|
-
* together after the timeout. Mirrors SignalBatchManager.
|
|
8
|
+
* Batch manager for `trackItem` / `trackPieceItem` — batches individual events and sends them
|
|
9
|
+
* together after the timeout via the injected `record` function. Mirrors SignalBatchManager.
|
|
6
10
|
*/
|
|
7
11
|
export declare class TrackBatchManager {
|
|
8
12
|
private queue;
|
|
9
13
|
private timer;
|
|
10
14
|
private getConfig;
|
|
11
15
|
private batchTimeout;
|
|
12
|
-
|
|
16
|
+
private record;
|
|
17
|
+
constructor(getConfig: () => Promise<RequestConfig>, batchTimeout: number, record: RecordFn);
|
|
13
18
|
updateConfig(config: RequestConfig): void;
|
|
14
19
|
addEvent(event: TrackEvent): Promise<NonNullable<TrackResponse>>;
|
|
15
20
|
private flush;
|
|
16
21
|
}
|
|
22
|
+
export {};
|
|
17
23
|
//# sourceMappingURL=track-batch-manager.d.ts.map
|