cbcore-ts
Version:
CBCore is a library to build web applications using pure Typescript.
383 lines (382 loc) • 15 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var CBSocketClient_exports = {};
__export(CBSocketClient_exports, {
CBSocketClient: () => CBSocketClient,
IS_NOT_SOCKET_ERROR: () => IS_NOT_SOCKET_ERROR,
IS_SOCKET_ERROR: () => IS_SOCKET_ERROR,
SocketClient: () => SocketClient
});
module.exports = __toCommonJS(CBSocketClient_exports);
var import_socket = require("socket.io-client");
var import_uicore_ts = require("../../uicore-ts");
var import_CBCore = require("./CBCore");
var import_CBSocketCallbackHolder = require("./CBSocketCallbackHolder");
function IS_SOCKET_ERROR(object) {
const result = (0, import_uicore_ts.IS)(object) && object._isCBSocketErrorMessage;
return result;
}
function IS_NOT_SOCKET_ERROR(object) {
return !IS_SOCKET_ERROR(object);
}
const _CBSocketClient = class _CBSocketClient extends import_uicore_ts.UIObject {
constructor(core) {
super();
this._socket = (0, import_socket.io)();
this._isConnectionEstablished = import_uicore_ts.NO;
this._collectMessagesToSendLater = import_uicore_ts.NO;
this._messagesToBeSent = [];
this._subscribedKeys = {};
this._callbackHolder = new import_CBSocketCallbackHolder.CBSocketCallbackHolder(this);
this._core = core;
this.socket.on("connect", () => {
var _a, _b;
console.log("Socket.io connected to server. clientID = ", this.socket, " socketID = ", this.socket);
const isInstanceIdentifierAllowed = localStorage.getItem("IsInstanceIdentifierAllowed") == "true";
let instanceIdentifier = (0, import_uicore_ts.IF)(isInstanceIdentifierAllowed)(
() => localStorage.getItem("InstanceIdentifier")
).ELSE(
() => ""
);
if ((0, import_uicore_ts.IS_NOT)(instanceIdentifier) && isInstanceIdentifierAllowed) {
instanceIdentifier = (0, import_uicore_ts.MAKE_ID)();
localStorage.setItem("InstanceIdentifier", instanceIdentifier);
}
const handshakeMessage = {
accessToken: (_a = localStorage.getItem("CBUserAccessToken")) != null ? _a : void 0,
userID: (_b = this._core.userProfile) == null ? void 0 : _b._id,
inquiryAccessKey: void 0,
instanceIdentifier
};
this.socket.emit("CBSocketHandshakeInitMessage", {
identifier: (0, import_uicore_ts.MAKE_ID)(),
messageData: handshakeMessage
});
});
this.socket.on(
"CBSocketHandshakeResponseMessage",
(message) => {
var _a;
this._isConnectionEstablished = message.messageData.accepted;
if (!message.messageData.accepted) {
console.log("SocketIO connection failed.");
this._core.dialogViewShowerClass.alert(
"Failed to establish connection to server.",
() => {
}
);
} else {
console.log("SocketIO connection handshake completed.");
this._callbackHolder = new import_CBSocketCallbackHolder.CBSocketCallbackHolder(this, this._callbackHolder);
core.userProfile = (_a = message.messageData.userProfile) != null ? _a : {};
this.sendUnsentMessages();
}
}
);
this.socket.on("disconnect", () => {
console.log("Socket.io disconnected from server. clientID = ", this.socket);
this._isConnectionEstablished = import_uicore_ts.NO;
this._callbackHolder.isValid = import_uicore_ts.NO;
this._callbackHolder.triggerDisconnectHandlers();
});
this.socket.on("CBPerformReconnect", (message) => {
console.log("Performing socket reconnection.");
core.reloadSocketConnection();
if (message) {
this._core.dialogViewShowerClass.alert(message);
}
});
this._socket.on(
_CBSocketClient.responseMessageKey,
(message) => {
this.didReceiveMessageForKey(_CBSocketClient.responseMessageKey, message);
}
);
this._socket.on(
_CBSocketClient.multipleMessageKey,
(message) => {
console.log("Received " + message.messageData.length + " messages.");
this.didReceiveMessageForKey(_CBSocketClient.multipleMessageKey, message);
}
);
}
get socket() {
return this._socket;
}
cancelUnsentMessages(messagesToCancel) {
this._messagesToBeSent = this._messagesToBeSent.filter((messageObject, index, array) => !messagesToCancel.contains(messageObject));
}
sendUnsentMessages(receiveResponsesTogether = import_uicore_ts.NO, completion) {
if (!this._isConnectionEstablished || this._collectMessagesToSendLater) {
return;
}
const groupedMessages = [];
const didSendFunctions = [];
this._messagesToBeSent.copy().forEach((messageToBeSentObject) => {
if (this._isConnectionEstablished) {
var message = messageToBeSentObject.message;
if ((0, import_uicore_ts.IS_NOT)(message)) {
message = "";
}
const identifier = (0, import_uicore_ts.MAKE_ID)();
const completion2 = messageToBeSentObject.completion;
const messageObject2 = {
messageData: message,
identifier,
keepWaitingForResponses: messageToBeSentObject.keepWaitingForResponses,
inResponseToIdentifier: messageToBeSentObject.inResponseToMessage.identifier,
completionPolicy: messageToBeSentObject.completionPolicy
};
const shouldSendMessage = this._callbackHolder.socketShouldSendMessage(
messageToBeSentObject.key,
messageObject2,
messageToBeSentObject.completionPolicy,
completion2
);
if (shouldSendMessage) {
groupedMessages.push({
key: messageToBeSentObject.key,
message: messageObject2
});
}
didSendFunctions.push(messageToBeSentObject.didSendFunction);
}
});
this._messagesToBeSent = [];
if ((0, import_uicore_ts.IS_NOT)(groupedMessages.length)) {
return;
}
if (groupedMessages.length == 1) {
console.log("sending 1 unsent message.");
} else {
console.log("Sending " + groupedMessages.length + " unsent messages.");
}
const messageObject = {
messageData: groupedMessages,
identifier: (0, import_uicore_ts.MAKE_ID)(),
completionPolicy: _CBSocketClient.completionPolicy.all,
shouldGroupResponses: receiveResponsesTogether
};
this._callbackHolder.socketWillSendMultipleMessage(messageObject, completion);
this.socket.emit(_CBSocketClient.multipleMessageKey, messageObject);
didSendFunctions.forEach((didSendFunction, index, array) => {
didSendFunction();
});
}
sendUserBoundMessageForKeyWithPolicy(key, message, completionPolicy, completion) {
this._sendMessageForKey(key, message, void 0, import_uicore_ts.NO, completionPolicy, import_uicore_ts.YES, import_uicore_ts.nil, completion);
}
sendUserBoundMessageForKey(key, message, completion) {
this._sendMessageForKey(key, message, void 0, import_uicore_ts.NO, void 0, import_uicore_ts.YES, import_uicore_ts.nil, completion);
}
sendMessageForKeyWithPolicy(key, message, completionPolicy, completion) {
this._sendMessageForKey(key, message, void 0, import_uicore_ts.NO, completionPolicy, import_uicore_ts.NO, import_uicore_ts.nil, completion);
}
sendMessageForKey(key, message, completion) {
this._sendMessageForKey(key, message, void 0, import_uicore_ts.NO, void 0, import_uicore_ts.NO, import_uicore_ts.nil, completion);
}
resultForMessageForKey(key, message, completionPolicy, isUserBound = import_uicore_ts.NO) {
const result = new Promise((resolve, reject) => {
this._sendMessageForKey(
key,
message,
void 0,
import_uicore_ts.NO,
completionPolicy,
isUserBound,
import_uicore_ts.nil,
(responseMessage, respondWithMessage) => resolve({
responseMessage,
result: (0, import_uicore_ts.IF)(IS_NOT_SOCKET_ERROR(responseMessage))(() => responseMessage).ELSE((0, import_uicore_ts.RETURNER)(void 0)),
errorResult: (0, import_uicore_ts.IF)(IS_SOCKET_ERROR(responseMessage))(() => responseMessage).ELSE((0, import_uicore_ts.RETURNER)(void 0)),
respondWithMessage
})
);
});
return result;
}
_sendMessageForKey(key, message, inResponseToMessage = {}, keepMessageConnectionOpen = import_uicore_ts.NO, completionPolicy = _CBSocketClient.completionPolicy.directOnly, isUserBound = import_uicore_ts.NO, didSendFunction = import_uicore_ts.nil, completion = import_uicore_ts.nil) {
if ((0, import_uicore_ts.IS_NIL)(message)) {
message = "";
}
if (this._isConnectionEstablished && !this._collectMessagesToSendLater) {
const identifier = (0, import_uicore_ts.MAKE_ID)();
const messageObject = {
messageData: message,
identifier,
keepWaitingForResponses: keepMessageConnectionOpen,
inResponseToIdentifier: inResponseToMessage.identifier,
completionPolicy
};
const shouldSendMessage = this._callbackHolder.socketShouldSendMessage(
key,
messageObject,
completionPolicy,
completion
);
if (shouldSendMessage) {
this.socket.emit(key, messageObject);
}
didSendFunction();
} else {
this._messagesToBeSent.push({
key,
message,
inResponseToMessage,
keepWaitingForResponses: keepMessageConnectionOpen,
completionPolicy,
isBoundToUserWithID: (0, import_uicore_ts.IF)(isUserBound)((0, import_uicore_ts.RETURNER)((0, import_uicore_ts.FIRST_OR_NIL)(import_CBCore.CBCore.sharedInstance.userProfile._id)))(),
didSendFunction,
completion
});
return this._messagesToBeSent.lastElement;
}
}
sendMessagesAsGroup(functionToCall) {
const collectMessagesToSendLater = this._collectMessagesToSendLater;
this._collectMessagesToSendLater = import_uicore_ts.YES;
var result = functionToCall();
this._collectMessagesToSendLater = collectMessagesToSendLater;
this.sendUnsentMessages();
return result;
}
sendAndReceiveMessagesAsGroup(functionToCall, completion) {
const collectMessagesToSendLater = this._collectMessagesToSendLater;
this._collectMessagesToSendLater = import_uicore_ts.YES;
var result = functionToCall();
this._collectMessagesToSendLater = collectMessagesToSendLater;
this.sendUnsentMessages(import_uicore_ts.YES, completion);
return result;
}
didReceiveMessageForKey(key, message) {
const sendResponseFunction = function(responseMessage, completion) {
this._sendMessageForKey(
_CBSocketClient.responseMessageKey,
responseMessage,
message,
import_uicore_ts.NO,
void 0,
import_uicore_ts.NO,
import_uicore_ts.nil,
completion
);
}.bind(this);
sendResponseFunction.sendIntermediateResponse = function(updateMessage, completion) {
this._sendMessageForKey(
_CBSocketClient.responseMessageKey,
updateMessage,
message,
import_uicore_ts.YES,
void 0,
import_uicore_ts.NO,
import_uicore_ts.nil,
completion
);
}.bind(this);
const sendUserBoundResponseFunction = function(responseMessage, completion) {
this._sendMessageForKey(
_CBSocketClient.responseMessageKey,
responseMessage,
message,
import_uicore_ts.NO,
void 0,
import_uicore_ts.YES,
import_uicore_ts.nil,
completion
);
}.bind(this);
sendUserBoundResponseFunction.sendIntermediateResponse = function(updateMessage, completion) {
this._sendMessageForKey(
_CBSocketClient.responseMessageKey,
updateMessage,
message,
import_uicore_ts.YES,
void 0,
import_uicore_ts.YES,
import_uicore_ts.nil,
completion
);
}.bind(this);
if (IS_SOCKET_ERROR(message.messageData)) {
console.log("CBSocketClient did receive error message.");
console.log(message.messageData);
}
this._callbackHolder.socketDidReceiveMessageForKey(key, message, sendResponseFunction);
}
addTargetForMessagesForKeys(keys, handlerFunction) {
keys.forEach(function(key, index, array) {
this.addTargetForMessagesForKey(key, handlerFunction);
}.bind(this));
}
addTargetForMessagesForKey(key, handlerFunction) {
this._callbackHolder.registerHandler(key, handlerFunction);
if ((0, import_uicore_ts.IS_NOT)(this._subscribedKeys[key])) {
this._socket.on(key, function(message) {
this.didReceiveMessageForKey(key, message);
}.bind(this));
this._subscribedKeys[key] = true;
}
}
addTargetForOneMessageForKey(key, handlerFunction) {
this._callbackHolder.registerOnetimeHandler(key, handlerFunction);
if ((0, import_uicore_ts.IS_NOT)(this._subscribedKeys[key])) {
this._socket.on(key, function(message) {
this.didReceiveMessageForKey(key, message);
}.bind(this));
this._subscribedKeys[key] = true;
}
}
};
_CBSocketClient.responseMessageKey = "CBSocketResponseMessage";
_CBSocketClient.multipleMessageKey = "CBSocketMultipleMessage";
_CBSocketClient.disconnectionMessage = {
_isCBSocketErrorMessage: import_uicore_ts.YES,
messageData: "Server disconnected"
};
_CBSocketClient.completionPolicy = {
"all": "all",
"allDifferent": "allDifferent",
"first": "first",
"last": "last",
"firstAndLast": "firstAndLast",
"firstAndLastIfDifferent": "firstAndLastIfDifferent",
"directOnly": "directOnly",
"firstOnly": "firstOnly",
"storedOrFirst": "storedOrFirst"
};
let CBSocketClient = _CBSocketClient;
const SocketClient = new Proxy({ "name": "SocketClient" }, {
get(target, key) {
const result = (messageData, completionPolicy, isUserBound) => import_CBCore.CBCore.sharedInstance.socketClient.resultForMessageForKey(
key,
messageData,
completionPolicy,
isUserBound
);
return result;
}
});
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
CBSocketClient,
IS_NOT_SOCKET_ERROR,
IS_SOCKET_ERROR,
SocketClient
});
//# sourceMappingURL=CBSocketClient.js.map