@avaturn-live/web-sdk 0.1.6 → 0.1.8
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/main.cjs +1 -1
- package/dist/main.d.ts +7 -0
- package/dist/main.js +12 -3
- package/package.json +1 -1
package/dist/main.cjs
CHANGED
|
@@ -76,4 +76,4 @@ void main() {
|
|
|
76
76
|
// the same data for our texcoords.
|
|
77
77
|
v_texCoord = a_position;
|
|
78
78
|
}
|
|
79
|
-
`;function Ns(t,e,n){const r=t.createShader(n);if(!r)throw Error("Unable to create shader");if(t.shaderSource(r,e),t.compileShader(r),!t.getShaderParameter(r,t.COMPILE_STATUS)){const i=t.getShaderInfoLog(r);throw t.deleteShader(r),Error(i||"unknown error")}return r}function ad(t,e){const n=t.createProgram();if(!n)throw Error("Unable to create program");for(const r of e)t.attachShader(n,r);if(t.linkProgram(n),!t.getProgramParameter(n,t.LINK_STATUS)){const r=t.getProgramInfoLog(n);throw t.deleteProgram(n),Error(r||"unknown error")}return n}const Ko=new WeakMap;function cd(t){const e={antialias:!1,powerPreference:"low-power",depth:!1,premultipliedAlpha:!0},n=t.getContext("webgl2",e)??t.getContext("webgl",e);if(!n)throw Error("Couldn't create GL context");const r=Ns(n,sd,n.FRAGMENT_SHADER),i=Ns(n,od,n.VERTEX_SHADER),s=ad(n,[r,i]);n.useProgram(s);const a=n.getAttribLocation(s,"a_position"),c=n.getUniformLocation(s,"u_frame");n.uniform1i(c,0);const l=n.getUniformLocation(s,"u_matrix");Ko.set(n,n.getUniformLocation(s,"u_premultipliedAlpha")),ld(n);const p=n.createBuffer(),h=new Float32Array([0,0,1,0,0,1,0,1,1,0,1,1]);n.bindBuffer(n.ARRAY_BUFFER,p),n.bufferData(n.ARRAY_BUFFER,h,n.STATIC_DRAW),n.enableVertexAttribArray(a),n.vertexAttribPointer(a,2,n.FLOAT,!1,0,0),n.uniformMatrix3fv(l,!1,[2,0,0,0,-2,0,-1,1,1]);const f=n.createTexture();return n.bindTexture(n.TEXTURE_2D,f),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST),n}function ld(t,e){t.uniform1f(Ko.get(t),0)}function ud(t,e){const n=t.canvas,r=e.videoWidth,i=Math.floor(e.videoHeight/2);(n.width!==r||n.height!==i)&&(n.width=r,n.height=i,t.viewport(0,0,r,i)),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e),t.drawArrays(t.TRIANGLES,0,6)}const Qo="https://api.avaturn.live";class Xo{constructor(e,n){H(this,"inited",!1);H(this,"mediaStream");H(this,"session_id","");H(this,"uiConfig",{background:{transparent:!0}});H(this,"config");H(this,"shadow",null);H(this,"frameHandle",0);H(this,"rootElement");H(this,"abortController");H(this,"timeout",0);H(this,"keepAlive",!1);H(this,"fetcher");H(this,"call");H(this,"handlers",{});if(typeof window>"u")throw new Error("Unfortunately, SDK only works on the client side.");const[r,i]=this.parseConfig(e,n),{apiHost:s=Qo,sessionToken:a,preloadBundle:c,preconnect:l,keepAlive:p,audioSource:h=!1}=this.config=r;this.rootElement=i,this.abortController=new AbortController,this.fetcher=$.create({baseURL:`${s}/_sdk/v0`,headers:{"X-Session-Token":a},signal:this.abortController.signal}),this.keepAlive=!!p,this.mediaStream=new MediaStream,this.call=xl.createCallObject({videoSource:!1,audioSource:h,dailyConfig:{avoidEval:!0}}),c&&this.call.load(),l&&this.fetcher.post("/sessions/start_stream")}parseConfig(e,n){try{let r,i;if(e instanceof HTMLElement){if(r=e,!n)throw new Error("Options are required when providing a DOM element.");i=n}else i=e;return[i,r]}catch{throw new Error("Filed to parse configuration object. Bad configuration!")}}dispatch(e,n){var r;(r=this.handlers[e])==null||r.forEach(i=>i(n))}drawUI(){if(!this.rootElement||!this.inited)return;if(!this.shadow){const a=document.createElement("div");a.style.width="100%",a.style.height="100%",a.style.position="relative",a.style.overflow="hidden",this.rootElement.appendChild(a),this.shadow=a.attachShadow({mode:"closed"})}const e=this.shadow
|
|
79
|
+
`;function Ns(t,e,n){const r=t.createShader(n);if(!r)throw Error("Unable to create shader");if(t.shaderSource(r,e),t.compileShader(r),!t.getShaderParameter(r,t.COMPILE_STATUS)){const i=t.getShaderInfoLog(r);throw t.deleteShader(r),Error(i||"unknown error")}return r}function ad(t,e){const n=t.createProgram();if(!n)throw Error("Unable to create program");for(const r of e)t.attachShader(n,r);if(t.linkProgram(n),!t.getProgramParameter(n,t.LINK_STATUS)){const r=t.getProgramInfoLog(n);throw t.deleteProgram(n),Error(r||"unknown error")}return n}const Ko=new WeakMap;function cd(t){const e={antialias:!1,powerPreference:"low-power",depth:!1,premultipliedAlpha:!0},n=t.getContext("webgl2",e)??t.getContext("webgl",e);if(!n)throw Error("Couldn't create GL context");const r=Ns(n,sd,n.FRAGMENT_SHADER),i=Ns(n,od,n.VERTEX_SHADER),s=ad(n,[r,i]);n.useProgram(s);const a=n.getAttribLocation(s,"a_position"),c=n.getUniformLocation(s,"u_frame");n.uniform1i(c,0);const l=n.getUniformLocation(s,"u_matrix");Ko.set(n,n.getUniformLocation(s,"u_premultipliedAlpha")),ld(n);const p=n.createBuffer(),h=new Float32Array([0,0,1,0,0,1,0,1,1,0,1,1]);n.bindBuffer(n.ARRAY_BUFFER,p),n.bufferData(n.ARRAY_BUFFER,h,n.STATIC_DRAW),n.enableVertexAttribArray(a),n.vertexAttribPointer(a,2,n.FLOAT,!1,0,0),n.uniformMatrix3fv(l,!1,[2,0,0,0,-2,0,-1,1,1]);const f=n.createTexture();return n.bindTexture(n.TEXTURE_2D,f),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST),n}function ld(t,e){t.uniform1f(Ko.get(t),0)}function ud(t,e){const n=t.canvas,r=e.videoWidth,i=Math.floor(e.videoHeight/2);(n.width!==r||n.height!==i)&&(n.width=r,n.height=i,t.viewport(0,0,r,i)),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e),t.drawArrays(t.TRIANGLES,0,6)}const Qo="https://api.avaturn.live";class Xo{constructor(e,n){H(this,"inited",!1);H(this,"mediaStream");H(this,"session_id","");H(this,"uiConfig",{background:{transparent:!0}});H(this,"config");H(this,"shadow",null);H(this,"frameHandle",0);H(this,"rootElement");H(this,"abortController");H(this,"timeout",0);H(this,"keepAlive",!1);H(this,"fetcher");H(this,"call");H(this,"handlers",{});if(typeof window>"u")throw new Error("Unfortunately, SDK only works on the client side.");const[r,i]=this.parseConfig(e,n),{apiHost:s=Qo,sessionToken:a,preloadBundle:c,preconnect:l,keepAlive:p,audioSource:h=!1}=this.config=r;this.rootElement=i,this.abortController=new AbortController,this.fetcher=$.create({baseURL:`${s}/_sdk/v0`,headers:{"X-Session-Token":a},signal:this.abortController.signal}),this.keepAlive=!!p,this.mediaStream=new MediaStream,this.call=xl.createCallObject({videoSource:!1,audioSource:h,dailyConfig:{avoidEval:!0}}),c&&this.call.load(),l&&this.fetcher.post("/sessions/start_stream")}parseConfig(e,n){try{let r,i;if(e instanceof HTMLElement){if(r=e,!n)throw new Error("Options are required when providing a DOM element.");i=n}else i=e;return[i,r]}catch{throw new Error("Filed to parse configuration object. Bad configuration!")}}dispatch(e,n){var r;(r=this.handlers[e])==null||r.forEach(i=>i(n))}drawUI(){if(!this.rootElement||!this.inited)return;if(!this.shadow){const a=document.createElement("div");a.style.width="100%",a.style.height="100%",a.style.position="relative",a.style.overflow="hidden",this.rootElement.appendChild(a),this.shadow=a.attachShadow({mode:"closed"})}const e=this.shadow,n=document.createElement("video");if(n.srcObject=this.mediaStream,n.autoplay=!0,n.style.position="absolute",n.style.opacity="0",n.style.objectFit="cover",n.style.pointerEvents="none",n.playsInline=!0,e.appendChild(n),!this.uiConfig.background.transparent){n.style.width="100%",n.style.height="100%",n.style.opacity="1",n.style.pointerEvents="all";return}const r=document.createElement("canvas");r.style.width="100%",r.style.height="100%",r.style.objectFit="cover",e.appendChild(r);const i=cd(r),s=()=>{ud(i,n),this.frameHandle=requestAnimationFrame(s)};s()}startIdleTimeout(){this.timeout=setTimeout(()=>{var e;(e=this.handlers.idle)==null||e.forEach(n=>n({data:null})),this.keepAlive||(console.info("[SDK_IDLE]: Stream was terminated due to inactivity"),this.dispose())},5*60*1e3)}restartIdleTimeout(){clearTimeout(this.timeout),this.startIdleTimeout()}toggleLocalAudio(){const e=this.call.localAudio();this.call.setLocalAudio(!e),this.dispatch("local_audio_change",!e)}async cancelAllTasks(){const{data:e}=await this.fetcher.post("/sessions/cancel_all_speech_tasks");return e}async patchConfig(e){await this.fetcher.patch("/sessions/config",e)}async changeVoice(e){await this.patchConfig({conversation_engine:{type:"text-echo",tts:e}})}applyEventHandlers(e){return new Promise((n,r)=>{var a,c;const i=e!=null&&e.timeout&&e.timeout>0?e==null?void 0:e.timeout:3e4,s=e!=null&&e.timeout?setTimeout(()=>r("Connection timeout"),i):null;(a=this.call)==null||a.on("participant-updated",({participant:l})=>{var f,_;if(!l.owner)return;this.dispatch("local_audio_change",this.call.localAudio());const{video:p,audio:h}=l.tracks;p.persistentTrack&&(this.mediaStream.getVideoTracks().forEach(k=>this.mediaStream.removeTrack(k)),(f=this.mediaStream)==null||f.addTrack(p.persistentTrack)),h.persistentTrack&&(this.mediaStream.getAudioTracks().forEach(k=>this.mediaStream.removeTrack(k)),(_=this.mediaStream)==null||_.addTrack(h.persistentTrack)),s&&clearTimeout(s),p.persistentTrack&&(this.inited=!0,this.drawUI(),n())}),this.call.on("error",l=>{console.error("[SKD_ERROR]: ",l)}),(c=this.call)==null||c.on("app-message",({data:l})=>{var p;l.type&&((p=this.handlers[l.type])==null||p.forEach(h=>h(l)))})})}attachDOMNode(e){cancelAnimationFrame(this.frameHandle),this.rootElement&&(this.rootElement.innerHTML=""),this.rootElement=e,this.shadow=null,this.drawUI()}async init(e){if(this.inited)return;this.startIdleTimeout();const{data:n}=await this.fetcher.get("/sessions");return this.session_id=n.id,this.uiConfig.background.transparent=n.session_config.uses_stacked_alpha,this.abortController.signal.aborted||(await this.call.join({token:n.limited_access_token,url:n.room_url}),this.call.setLocalAudio(this.config.audioSource||!1)),this.applyEventHandlers(e)}async task(e){if(!this.session_id)throw new Error("It seems that the session is not initialized.");this.restartIdleTimeout();const{data:n}=await this.fetcher.post("/sessions/tasks",{text:e});return n}on(e,n){this.handlers[e]||(this.handlers[e]=[]),this.handlers[e].push(n)}off(e,n){this.handlers[e]&&(this.handlers[e]=this.handlers[e].filter(r=>r!==n))}async dispose(){this.inited=!1,this.mediaStream=new MediaStream,this.timeout&&clearTimeout(this.timeout),this.frameHandle&&cancelAnimationFrame(this.frameHandle),await this.call.destroy(),this.abortController.abort(),this.abortController=new AbortController,this.fetcher.defaults.signal=this.abortController.signal}}class dd extends Xo{constructor(n){super(n);H(this,"assistantSessionToken","");H(this,"assistantFetcher");H(this,"sessionToken","");this.assistantSessionToken=n.assistantSessionToken,this.sessionToken=n.sessionToken,this.assistantFetcher=$.create({baseURL:`${n.apiHost||Qo}/`,headers:{Authorization:`Bearer ${n.assistantSessionToken}`},signal:this.abortController.signal})}async task(n,r){if(!this.session_id)throw new Error("It seems that the session is not initialized.");this.restartIdleTimeout();const{data:i}=await this.assistantFetcher.post("/assistants/tasks",{text:n});return i}async dispose(){var n;this.inited=!1,this.mediaStream=new MediaStream,this.timeout&&clearTimeout(this.timeout),this.frameHandle&&cancelAnimationFrame(this.frameHandle),await((n=this.call)==null?void 0:n.destroy()),await this.assistantFetcher.delete("/assistants/sessions"),this.abortController.abort(),this.abortController=new AbortController,this.fetcher.defaults.signal=this.abortController.signal,this.assistantFetcher.defaults.signal=this.abortController.signal}}exports.AvaturnAssistantHead=dd;exports.AvaturnHead=Xo;
|
package/dist/main.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { DailyCall } from "@daily-co/daily-js";
|
|
2
2
|
import { Axios } from "axios";
|
|
3
3
|
import { AvaturnEventCallback, AvaturnHeadConfig, AvaturnHeadEvent, IAvaturnHead } from "./type";
|
|
4
|
+
interface TTSConfig {
|
|
5
|
+
engine: "elevenlabs" | "google";
|
|
6
|
+
voice_id: string;
|
|
7
|
+
}
|
|
4
8
|
export declare class AvaturnHead implements IAvaturnHead {
|
|
5
9
|
inited: boolean;
|
|
6
10
|
mediaStream: MediaStream;
|
|
@@ -42,6 +46,8 @@ export declare class AvaturnHead implements IAvaturnHead {
|
|
|
42
46
|
protected restartIdleTimeout(): void;
|
|
43
47
|
toggleLocalAudio(): void;
|
|
44
48
|
cancelAllTasks(): Promise<void>;
|
|
49
|
+
private patchConfig;
|
|
50
|
+
changeVoice(config: TTSConfig): Promise<void>;
|
|
45
51
|
protected applyEventHandlers(config?: {
|
|
46
52
|
timeout?: number;
|
|
47
53
|
}): Promise<void>;
|
|
@@ -66,3 +72,4 @@ export declare class AvaturnAssistantHead extends AvaturnHead {
|
|
|
66
72
|
}): Promise<any>;
|
|
67
73
|
dispose(): Promise<void>;
|
|
68
74
|
}
|
|
75
|
+
export {};
|
package/dist/main.js
CHANGED
|
@@ -7429,9 +7429,7 @@ class ud {
|
|
|
7429
7429
|
const a = document.createElement("div");
|
|
7430
7430
|
a.style.width = "100%", a.style.height = "100%", a.style.position = "relative", a.style.overflow = "hidden", this.rootElement.appendChild(a), this.shadow = a.attachShadow({ mode: "closed" });
|
|
7431
7431
|
}
|
|
7432
|
-
const e = this.shadow;
|
|
7433
|
-
this.shadow.innerHTML = "";
|
|
7434
|
-
const n = document.createElement("video");
|
|
7432
|
+
const e = this.shadow, n = document.createElement("video");
|
|
7435
7433
|
if (n.srcObject = this.mediaStream, n.autoplay = !0, n.style.position = "absolute", n.style.opacity = "0", n.style.objectFit = "cover", n.style.pointerEvents = "none", n.playsInline = !0, e.appendChild(n), !this.uiConfig.background.transparent) {
|
|
7436
7434
|
n.style.width = "100%", n.style.height = "100%", n.style.opacity = "1", n.style.pointerEvents = "all";
|
|
7437
7435
|
return;
|
|
@@ -7460,6 +7458,17 @@ class ud {
|
|
|
7460
7458
|
const { data: e } = await this.fetcher.post("/sessions/cancel_all_speech_tasks");
|
|
7461
7459
|
return e;
|
|
7462
7460
|
}
|
|
7461
|
+
async patchConfig(e) {
|
|
7462
|
+
await this.fetcher.patch("/sessions/config", e);
|
|
7463
|
+
}
|
|
7464
|
+
async changeVoice(e) {
|
|
7465
|
+
await this.patchConfig({
|
|
7466
|
+
conversation_engine: {
|
|
7467
|
+
type: "text-echo",
|
|
7468
|
+
tts: e
|
|
7469
|
+
}
|
|
7470
|
+
});
|
|
7471
|
+
}
|
|
7463
7472
|
applyEventHandlers(e) {
|
|
7464
7473
|
return new Promise((n, r) => {
|
|
7465
7474
|
var a, c;
|