/** * * Agora Real Time Engagement * Created by Wei Hu in 2021-09. * Copyright (c) 2022 Agora IO. All rights reserved. * */ import { PUBLISH_EVENT_NAME, RteUiEventData } from '../common/common'; import { Cmd, CmdStatusValue, StatusCmd } from '../msg/cmd/cmd'; import { ImageFrame } from '../msg/image_frame/image_frame'; import { PcmFrame } from '../msg/pcm_frame/pcm_frame'; import rte_addon from '../rte_addon'; import { Value } from '../value/value'; type ResponseHandlerType = ( rte: RTE, statusCmd: Cmd ) => boolean | Promise; export class RTE { // RTE is not created from JS sendJson( json: Record, responseHandler?: ResponseHandlerType, ): Promise { return new Promise((resolve) => { let resolved = false; rte_addon.rte_nodejs_rte_send_json( this, JSON.stringify(json), async (rte: RTE, cmd: Cmd): Promise => { let consumed = true; if (responseHandler) { consumed = await responseHandler(rte, cmd); } rte_addon.rte_nodejs_rte_on_cmd_response_done( this, cmd.cmd_id, cmd.command, consumed, ); if (!resolved) { resolved = true; resolve(cmd.toJson() as CmdStatusValue); } }, ); }); } sendCmd( cmd: Cmd, responseHandler?: ResponseHandlerType, ): Promise { return new Promise((resolve) => { let resolved = false; rte_addon.rte_nodejs_rte_send_cmd( this, cmd, async (rte: RTE, cmd: Cmd): Promise => { let consumed = true; if (responseHandler) { consumed = await responseHandler(rte, cmd); } rte_addon.rte_nodejs_rte_on_cmd_response_done( this, cmd.cmd_id, cmd.command, consumed, ); if (!resolved) { resolved = true; resolve(cmd.toJson() as CmdStatusValue); } }, ); }); } sendData(data: ArrayBuffer): void { rte_addon.rte_nodejs_rte_send_data(this, data); } sendImageFrame(imageFrame: ImageFrame): void { rte_addon.rte_nodejs_rte_send_image_frame(this, imageFrame); } sendPcmFrame(pcmFrame: PcmFrame): void { rte_addon.rte_nodejs_rte_send_pcm_frame(this, pcmFrame); } returnText(status_code: string, text: string, cmd: Cmd): void { rte_addon.rte_nodejs_rte_return_text( this, status_code, text, cmd, undefined, ); } returnJson( status_code: string, json: Record | unknown[], cmd: Cmd, ): void { rte_addon.rte_nodejs_rte_return_json( this, status_code, JSON.stringify(json), cmd, undefined, ); } returnCmd(status_cmd: StatusCmd, request_cmd: Cmd): void { rte_addon.rte_nodejs_rte_return_cmd( this, status_cmd, request_cmd, undefined, ); } sendPublishEvent(user_data: RteUiEventData): Promise { // Pattern: ${extension_group_name}::${extension_name} const extension_unique_key = rte_addon.rte_nodejs_rte_extension_unique_name_in_graph(this) as string; const keys = extension_unique_key.split('::'); if (keys.length !== 2) { throw new Error( `Error to publish event, the extension_unique_name_in_graph (\ ${extension_unique_key}) is invalid.`, ); } const cmd = new Cmd({ command: PUBLISH_EVENT_NAME, extension_group: keys[0], extension: keys[1], }); // The user_data will be passed by reference. cmd.setProperty('userData', new Value(user_data)); return this.sendCmd(cmd); } getManifest(name: string): Value { return rte_addon.rte_nodejs_rte_get_manifest(this, name); } getProp(name: string): Value { return rte_addon.rte_nodejs_rte_get_prop(this, name); } setProp(name: string, value: Value): void { rte_addon.rte_nodejs_rte_set_prop(this, name, value); } isCmdConnected(cmd_or_name: string | Cmd): boolean { return rte_addon.rte_nodejs_rte_is_cmd_connected(this, cmd_or_name); } dumpDirtyProp(): string { return rte_addon.rte_nodejs_rte_dump_dirty_prop(this); } } rte_addon.rte_nodejs_rte_register_class(RTE);