|
@@ -1,6 +1,6 @@
|
|
|
import { Socket } from "socket.io-client";
|
|
|
-import { IdMessage, getLocalStorageValue, storeClientId } from "../../src/context/utils";
|
|
|
-import { TAIPY_CLIENT_ID, WsMessage, sendWsMessage } from "../../src/context/wsUtils";
|
|
|
+import { IdMessage, storeClientId } from "../../src/context/utils";
|
|
|
+import { WsMessage, sendWsMessage } from "../../src/context/wsUtils";
|
|
|
import { TaipyApp } from "./app";
|
|
|
import { VariableManager, VariableModuleData } from "./variableManager";
|
|
|
|
|
@@ -9,15 +9,18 @@ interface MultipleUpdatePayload {
|
|
|
payload: { value: unknown };
|
|
|
}
|
|
|
|
|
|
+const initWsMessageTypes = ["ID", "AID", "GMC"];
|
|
|
+
|
|
|
export const initSocket = (socket: Socket, appManager: TaipyApp) => {
|
|
|
socket.on("connect", () => {
|
|
|
- const id = getLocalStorageValue(TAIPY_CLIENT_ID, "");
|
|
|
- sendWsMessage(socket, "ID", TAIPY_CLIENT_ID, id, id, undefined, false);
|
|
|
- if (id !== "") {
|
|
|
- appManager.clientId = id;
|
|
|
- appManager.updateContext(appManager.path);
|
|
|
+ if (appManager.clientId === "" || appManager.appId === "") {
|
|
|
+ appManager.init();
|
|
|
}
|
|
|
});
|
|
|
+ // Send a request to get App ID to verify that the app has not been reloaded
|
|
|
+ socket.io.on("reconnect", () => {
|
|
|
+ sendWsMessage(socket, "AID", "reconnect", appManager.appId, appManager.clientId, appManager.context);
|
|
|
+ });
|
|
|
// try to reconnect on connect_error
|
|
|
socket.on("connect_error", () => {
|
|
|
setTimeout(() => {
|
|
@@ -32,7 +35,7 @@ export const initSocket = (socket: Socket, appManager: TaipyApp) => {
|
|
|
});
|
|
|
// handle message data from backend
|
|
|
socket.on("message", (message: WsMessage) => {
|
|
|
- processIncomingMessage(message, appManager);
|
|
|
+ processWsMessage(message, appManager);
|
|
|
});
|
|
|
// only now does the socket tries to open/connect
|
|
|
if (!socket.connected) {
|
|
@@ -40,17 +43,17 @@ export const initSocket = (socket: Socket, appManager: TaipyApp) => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-export const processIncomingMessage = (message: WsMessage, appManager: TaipyApp) => {
|
|
|
+const processWsMessage = (message: WsMessage, appManager: TaipyApp) => {
|
|
|
if (message.type) {
|
|
|
if (message.type === "MU" && Array.isArray(message.payload)) {
|
|
|
for (const muPayload of message.payload as [MultipleUpdatePayload]) {
|
|
|
const encodedName = muPayload.name;
|
|
|
- const value = muPayload.payload.value;
|
|
|
+ const { value } = muPayload.payload;
|
|
|
appManager.variableManager?.update(encodedName, value);
|
|
|
appManager.onChange && appManager.onChange(appManager, encodedName, value);
|
|
|
}
|
|
|
} else if (message.type === "ID") {
|
|
|
- const id = (message as unknown as IdMessage).id;
|
|
|
+ const { id } = message as unknown as IdMessage;
|
|
|
storeClientId(id);
|
|
|
appManager.clientId = id;
|
|
|
appManager.updateContext(appManager.path);
|
|
@@ -58,15 +61,33 @@ export const processIncomingMessage = (message: WsMessage, appManager: TaipyApp)
|
|
|
const mc = (message.payload as Record<string, unknown>).data as string;
|
|
|
window.localStorage.setItem("ModuleContext", mc);
|
|
|
appManager.context = mc;
|
|
|
- sendWsMessage(appManager.socket, "GVS", "get_variables", {}, appManager.clientId, appManager.context);
|
|
|
} else if (message.type === "GVS") {
|
|
|
const variableData = (message.payload as Record<string, unknown>).data as VariableModuleData;
|
|
|
if (appManager.variableManager) {
|
|
|
- appManager.variableManager.resetInitData(variableData);
|
|
|
+ appManager.variableManager.init(variableData);
|
|
|
} else {
|
|
|
appManager.variableManager = new VariableManager(variableData);
|
|
|
appManager.onInit && appManager.onInit(appManager);
|
|
|
}
|
|
|
+ } else if (message.type === "AID") {
|
|
|
+ const payload = message.payload as Record<string, unknown>;
|
|
|
+ if (payload.name === "reconnect") {
|
|
|
+ return appManager.init();
|
|
|
+ }
|
|
|
+ appManager.appId = payload.id as string;
|
|
|
}
|
|
|
+ postWsMessageProcessing(message, appManager);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const postWsMessageProcessing = (message: WsMessage, appManager: TaipyApp) => {
|
|
|
+ // perform data population only when all necessary metadata is ready
|
|
|
+ if (
|
|
|
+ initWsMessageTypes.includes(message.type) &&
|
|
|
+ appManager.clientId !== "" &&
|
|
|
+ appManager.appId !== "" &&
|
|
|
+ appManager.context !== ""
|
|
|
+ ) {
|
|
|
+ sendWsMessage(appManager.socket, "GVS", "get_variables", {}, appManager.clientId, appManager.context);
|
|
|
}
|
|
|
};
|