lavva.exalushome
Version:
Library implementing communication and abstraction layers for ExalusHome system
226 lines • 9.21 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { Api } from "../../../../Api";
import { DataFrame, Method, Status } from "../../../../DataFrame";
import { DependencyContainer } from "../../../../DependencyContainer";
import { ExalusConnectionService } from "../../../ExalusConnectionService";
import { ResponseResult } from "../../../FieldChangeResult";
import { ChatService, ChatServiceErrorCode } from "../../ChatService";
import { ControllerChatSender, ControllerMessageActions, ControllerMessageSource, ControllerMessageType } from "./IControllerChat";
export class ControllerChat {
constructor() {
this._chatSubscriptions = [];
this._connection = Api.Get(ExalusConnectionService.ServiceName);
let removeSubCallback = this._connection.SubscribeTo("/homemessaging/notify/message/new", (frame) => {
const data = frame.Data;
//messages for 'family' chat
if (data.RecipientUserGuid == null && data.MessageType == ControllerMessageType.Message)
return;
const res = new ControllerChatMessage();
res.DateTime = data.DateTime;
res.Guid = data.Guid;
res.MessageSource = data.MessageSource;
res.MessageText = data.MessageText;
res.MessageType = data.MessageType;
res.RecipientUserGuid = data.RecipientUserGuid ? data.RecipientUserGuid : "n/a";
res.Sender = data.Sender;
res.SenderName = data.SenderName ? data.SenderName : "n/a";
res.SenderUserGuid = data.SenderUserGuid ? data.SenderUserGuid : "n/a";
res.TextToSpeechMessage = data.TextToSpeechMessage ? data.TextToSpeechMessage : "";
for (let [k, v] of Object.entries(data.MessageActions))
res.MessageActions.set(ControllerMessageActions[k], v);
for (let [k, v] of Object.entries(data.MessageActionsData))
res.MessageActionsData.set(k, v);
this._chatSubscriptions.forEach(handler => {
handler(res);
});
});
}
GetCachedMessagesAsync() {
return __awaiter(this, void 0, void 0, function* () {
try {
const resp = yield this._connection.SendAndWaitForResponseAsync(new GetMessagesRequest(), 12000, false);
if (resp == null)
return new ResponseResult(ChatServiceErrorCode.OtherError, `Cannot get messages - response is null.`);
if (resp.Status != Status.OK)
return new ResponseResult(ChatServiceErrorCode.OtherError, `Cannot get messages - controller responded with response code ${resp.Status}.`);
if (resp.Data == null)
return new ResponseResult(ChatServiceErrorCode.NoData, `Cannot get messages - controller responded with status OK, but response does not contain data!`);
const result = [];
resp.Data.forEach(d => {
//messages for 'family' chat
if (d.RecipientUserGuid == null && d.MessageType == ControllerMessageType.Message)
return;
const res = new ControllerChatMessage();
res.DateTime = d.DateTime;
res.Guid = d.Guid;
res.MessageSource = d.MessageSource;
res.MessageText = d.MessageText;
res.MessageType = d.MessageType;
res.RecipientUserGuid = d.RecipientUserGuid ? d.RecipientUserGuid : "n/a";
res.Sender = d.Sender;
res.SenderName = d.SenderName ? d.SenderName : "n/a";
res.SenderUserGuid = d.SenderUserGuid ? d.SenderUserGuid : "n/a";
res.TextToSpeechMessage = d.TextToSpeechMessage ? d.TextToSpeechMessage : "";
for (let [k, v] of Object.entries(d.MessageActions))
res.MessageActions.set(ControllerMessageActions[k], v);
for (let [k, v] of Object.entries(d.MessageActionsData))
res.MessageActionsData.set(k, v);
result.push(res);
});
return result;
}
catch (error) {
return new ResponseResult(ChatServiceErrorCode.FatalError, `Cannot get messages - exception occurred ${error}`);
}
});
}
SendMessageAsync(message) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
try {
const result = yield this._connection.SendAndWaitForResponseAsync(new SendMessagesRequest(`recipient:home ${message}`), 8000, false);
if (result == null || result.Status == null)
return Status.FatalError;
return result.Status;
}
catch (error) {
(_a = DependencyContainer.Log) === null || _a === void 0 ? void 0 : _a.Error(ChatService.ServiceName, `Cannot send message! ${error}`);
return Status.FatalError;
}
});
}
SubscribeToMessages(messageHandler) {
this._chatSubscriptions.push(messageHandler);
}
UnsubscribeFromMessages(messageHandler) {
if (this._chatSubscriptions)
this._chatSubscriptions = this._chatSubscriptions.filter(h => h !== messageHandler);
}
}
class ControllerChatMessageResponse {
constructor() {
this.Guid = "";
this.Sender = ControllerChatSender.Controller;
this.MessageType = ControllerMessageType.Info;
this.MessageSource = ControllerMessageSource.Other;
this.SenderUserGuid = "";
this.RecipientUserGuid = "";
this.MessageText = "";
this.TextToSpeechMessage = "";
this.SenderName = "";
this.DateTime = new Date().toDateString();
}
}
class ControllerChatMessage {
constructor() {
this._sender = ControllerChatSender.Controller;
this._messageType = ControllerMessageType.Info;
this._messageSource = ControllerMessageSource.Other;
this._senderUserGuid = "";
this._recipientUserGuid = "";
this._textToSpeechMessage = "";
this._messageActions = new Map();
this._messageActionsData = new Map();
this._guid = "";
this._senderName = "";
this._messageText = "";
this._dateTime = new Date().toDateString();
}
get Sender() {
return this._sender;
}
get MessageType() {
return this._messageType;
}
get MessageSource() {
return this._messageSource;
}
get SenderUserGuid() {
return this._senderUserGuid;
}
get RecipientUserGuid() {
return this._recipientUserGuid;
}
get TextToSpeechMessage() {
return this._textToSpeechMessage;
}
get MessageActions() {
return this._messageActions;
}
get MessageActionsData() {
return this._messageActionsData;
}
get Guid() {
return this._guid;
}
get SenderName() {
return this._senderName;
}
get MessageText() {
return this._messageText;
}
get DateTime() {
return this._dateTime;
}
set Sender(value) {
this._sender = value;
}
set MessageType(value) {
this._messageType = value;
}
set MessageSource(value) {
this._messageSource = value;
}
set SenderUserGuid(value) {
this._senderUserGuid = value;
}
set RecipientUserGuid(value) {
this._recipientUserGuid = value;
}
set TextToSpeechMessage(value) {
this._textToSpeechMessage = value;
}
set MessageActions(value) {
this._messageActions = value;
}
set MessageActionsData(value) {
this._messageActionsData = value;
}
set Guid(value) {
this._guid = value;
}
set SenderName(value) {
this._senderName = value;
}
set MessageText(value) {
this._messageText = value;
}
set DateTime(value) {
this._dateTime = value;
}
}
//Requests
class GetMessagesRequest extends DataFrame {
constructor() {
super();
this.Resource = "/homemessaging/messages";
this.Method = Method.Get;
}
}
class SendMessagesRequest extends DataFrame {
constructor(message) {
super();
this.Resource = "/homemessaging/message";
this.Method = Method.Put;
this.Data = message;
}
}
//# sourceMappingURL=ControllerChat.js.map