This is a component library for 3DCAT
- LauncherUI
- LauncherPrivateUI
- Loading Component
- ImeSwitchComponent
- VirtualKeyboardComponent
- FakeImeInputComponent
- KeepActiveHelper
- live-cat v1.1.8
- Svelte v3.57.0
- Rollup v2.78.0
- Typescript v4.9.5
interface BaseOptionsType {
address: string; // address
appId?: string; // appId
appKey?: string; // appKey
appSecret?: string; // appSecret
startType?: StartType;
castScreenMaxQty?: number;
castScreenNickname?: string;
castScreenPwd?: string;
isCastScreenMaster?: boolean;
serverIp?: string; //for coturn server
joinType?: ScreenJoinType; //only screen
optionalParam?: string; // command line parameters
exeParameter?: string; // command line parameters for privatization
enableVirtualCamera?: boolean; // setup camera enable
}Options detail to see live-cat
type UIOptions = Options & loadingOptions & ExtendUIOptions;
interface loadingOptions {
loadingImage: string | HTMLImageElement;
loadingBgImage: { portrait: string; landscape: string };
loadingBarImage: string | HTMLImageElement;
showDefaultLoading: boolean;
showFakePercent: boolean;
phaseChanged: boolean;
percentChanged: boolean;
}
interface ExtendUIOptions {
onChange: (cb: OnChange) => void;
onQueue: (rank: number) => void;
onLoadingError: (err: LoadingError) => void;
onTaskId: (taskId: number) => void;
onShowUserList: (showCastScreenUsers: boolean) => void;
onRunningOptions: (opt: OnRunningOptions) => void;
}
interface OnChange {
phase: Phase;
fakePercent: number;
deltaTime: number;
}
type Phase =
| "initial"
| "signaling-connected"
| "node-ready"
| "end-candidate"
| "peer-connection-connected"
| "data-channel-open"
| "streaming-ready"
| "loaded-metadata"
| "streaming-playing";
interface LoadingError {
code: number | string;
type: "app" | "task" | "connection" | "reConnection";
reason: string | ErrorState;
}
type ErrorState = "disconnect" | "afk" | "kick" | "hangup";
interface OnRunningOptions {
token: string;
coturns: RTCIceServer[];
signaling: string;
}
enum StartType {
NormalMode = 1,
ScreenMode = 3,
}
enum ScreenJoinType {
Secret = 1,
Link,
}//when terminal is ios and wechat
onPhaseChange: (phase: Phase, deltaTime: number) => {
if (phase === "data-channel-open") {
/* NOTE: Autoplay video need user activation gesture
* @see https://html.spec.whatwg.org/multipage/interaction.html#user-activation-processing-model
*/
someTriggerElement.addEventListener("click", () =>
launcher?.launcherBase?.resumeVideoStream()
);
}
};//Microphone
//Start capture audio to node
onPhaseChange: (phase: Phase, deltaTime: number) => {
if (phase === "data-channel-open") {
launcher?.launcherBase?.openMicrophone();
}
};
//Stop
launcher?.launcherBase?.closeMicrophone();//Camera
const baseOptionsType = {
address: "xxxx",
appKey: "xxxx",
startType: 1,
enableVirtualCamera: true,
};
let launcher = new LauncherUI(baseOptionsType, container);
//Start capture video to node
onPhaseChange: (phase: Phase, deltaTime: number) => {
if (phase === "data-channel-open") {
launcher?.launcherBase?.openCamera();
}
};
//Stop
launcher?.launcherBase?.closeCamera();// Public Cloud
import { LauncherUI } from "live-cat-library";
const container = document.querySelector("body");
document.querySelector("body").style.width = "100%";
document.querySelector("body").style.height = "100%";
const baseOptionsType = {
address: "https://app.3dcat.live",
appKey: "xxxx",
startType: 1,
};
const uiOptions = {
loadingImage: "",
};
let launcher = new LauncherUI(baseOptionsType, container, uiOptions);
window.addEventListener("DOMContentLoaded", () => {
if (
navigator.userAgent.includes("miniProgram") ||
navigator.userAgent.includes("MicroMessenger")
) {
//wechat
document.addEventListener("WeixinJSBridgeReady", bootstrap, false);
} else {
bootstrap();
}
});// Private Cloud
import { LauncherPrivateUI } from "live-cat-library";
const container = document.querySelector("body");
document.querySelector("body").style.width = "100%";
document.querySelector("body").style.height = "100%";
const baseOptionsType = {
address: "xxxxx",
appKey: "xxxx",
startType: 1,
};
const uiOptions = {
loadingImage: "",
};
let launcher = new LauncherPrivateUI(baseOptionsType, container, uiOptions);
window.addEventListener("DOMContentLoaded", () => {
if (
navigator.userAgent.includes("miniProgram") ||
navigator.userAgent.includes("MicroMessenger")
) {
//wechat
document.addEventListener("WeixinJSBridgeReady", bootstrap, false);
} else {
bootstrap();
}
});MIT