socket setup

This commit is contained in:
2026-02-20 16:54:01 -06:00
parent 880902c478
commit 326c2e125c
9 changed files with 147 additions and 74 deletions

View File

@@ -1,23 +0,0 @@
import { io } from "socket.io-client";
// NOTE: we assume "accessToken" was already obtained earlier via a call to '/auth/login'.
// get the
const accessToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI3MTkyNTQyZS01NzQ5LTRlZTgtYjdjZS0zNTQ4ZjA0NGQwOWIiLCJqdGkiOiI1NzE5ZmQ2OS02NTVkLTQ1MjctYTJjOC1hZWNhMjU0MTQ2MDEiLCJpZCI6IjcxOTI1NDJlLTU3NDktNGVlOC1iN2NlLTM1NDhmMDQ0ZDA5YiIsImVtYWlsIjoiYmxha2UubWF0dGhlc0BhbHBsYS5jb20iLCJvcmdJZCI6IjI2YTE4NjlmLTYwNDktNDM3Mi04ZWMzLTVkZDZlNDIzZjJmNiIsImNvbXBhbnlJZCI6bnVsbCwicm9sZSI6InJvbGVfb3duZXIiLCJpc0VtYWlsVmVyaWZpZWQiOnRydWUsImludmFsaWRMb2dpbkF0dGVtcHRzIjpudWxsLCJpYXQiOjE3NzA4MTE5MTEsImV4cCI6MTc3MTA3MTExMX0.jLHOSIF5RHUGjwq8WvycYxD9HK8_677O6sgRUZeYdUQ";
const baseSubspaceUrl = "wss://subspace.opendock.com";
const url = `${baseSubspaceUrl}?token=${accessToken}`;
const socket = io(url, { transports: ["websocket"] }); // Enforce 'websocket' transport only.
// socket.on("heartbeat", (data) => {
// console.log(data);
// });
socket.on("connection", () => {
console.log("Connected");
});
socket.on("create-Appointment", (data) => {
console.log("appt create:", data);
});

View File

@@ -14,6 +14,7 @@ import { createCronJob } from "../utils/croner.utils.js";
import { delay } from "../utils/delay.utils.js";
import { returnFunc } from "../utils/returnHelper.utils.js";
import { tryCatch } from "../utils/trycatch.utils.js";
import { getToken, odToken } from "./opendock.utils.js";
let lastCheck = formatInTimeZone(
new Date().toISOString(),
@@ -36,21 +37,12 @@ type Releases = {
CustomerReleaseNumber: string;
};
type ODToken = {
odToken: string | null;
tokenDate: Date | null;
};
let odToken: ODToken = {
odToken: null,
tokenDate: new Date(),
};
const TWENTY_FOUR_HOURS = 24 * 60 * 60 * 1000;
const log = createLogger({ module: "opendock", subModule: "releaseMonitor" });
const postRelease = async (release: Releases) => {
if (!odToken.odToken) {
log.info("Getting Auth Token");
log.info({}, "Getting Auth Token");
await getToken();
}
@@ -58,7 +50,7 @@ const postRelease = async (release: Releases) => {
new Date(odToken.tokenDate || Date.now()).getTime() <
Date.now() - TWENTY_FOUR_HOURS
) {
log.info("Refreshing Auth Token");
log.info({}, "Refreshing Auth Token");
await getToken();
}
/**
@@ -120,7 +112,7 @@ const postRelease = async (release: Releases) => {
name: "intPallet Count",
type: "int",
label: "Pallet Count",
value: parseInt(release.LoadingUnits, 10),
value: parseInt(release.LoadingUnits, 10), // do we really want to update this if its partial load as it should have been the full amount?
description: "How many pallets",
placeholder: "22",
dropDownValues: [],
@@ -207,13 +199,17 @@ const postRelease = async (release: Releases) => {
})
.returning();
log.info(`${release.ReleaseNumber} was updated`);
log.info({}, `${release.ReleaseNumber} was updated`);
} catch (e) {
log.error(e);
log.error({ error: e }, "Error updating the release");
}
// biome-ignore lint/suspicious/noExplicitAny: to many possibilities
} catch (e: any) {
//console.info(newDockApt);
log.error(e.response.data);
log.error(
{ error: e.response.data },
"An error has occurred during patching of the release",
);
return;
}
@@ -225,7 +221,7 @@ const postRelease = async (release: Releases) => {
{
headers: {
"content-type": "application/json; charset=utf-8",
Authorization: `Bearer ${odToken}`,
Authorization: `Bearer ${odToken.odToken}`,
},
},
);
@@ -234,7 +230,7 @@ const postRelease = async (release: Releases) => {
// this will be utilized when we are listening for the changes to the apts. that way we can update the state to arrived. we will run our own checks on this guy during the incoming messages.
if (response.status === 400) {
log.error(response.data.data.message);
log.error({}, response.data.data.message);
return;
}
@@ -255,12 +251,16 @@ const postRelease = async (release: Releases) => {
})
.returning();
log.info(`${release.ReleaseNumber} was created`);
log.info({}, `${release.ReleaseNumber} was created`);
} catch (e) {
log.error(e);
log.error({ error: e }, "Error creating new release");
}
// biome-ignore lint/suspicious/noExplicitAny: to many possibilities
} catch (e: any) {
log.error(e.response.data);
log.error(
{ error: e?.response?.data },
"Error posting new release to opendock",
);
return;
}
@@ -312,8 +312,11 @@ export const monitorReleaseChanges = async () => {
}
}
} catch (e) {
console.error(e);
log.error({ error: e }, "Monitor error");
console.error(
{ error: e },
"Error occurred while running the monitor job",
);
log.error({ error: e }, "Error occurred while running the monitor job");
}
});
}
@@ -349,28 +352,6 @@ export const monitorReleaseChanges = async () => {
// }
};
const getToken = async () => {
try {
const { status, data } = await axios.post(
`${process.env.OPENDOCK_URL}/auth/login`,
{
email: "blake.matthes@alpla.com",
password: process.env.OPENDOCK_PASSWORD,
},
);
if (status === 400) {
log.error(data.message);
return;
}
odToken = { odToken: data.access_token, tokenDate: new Date() };
log.info("Token added");
} catch (e) {
log.error(e);
}
};
// export const monitorReleaseChanges = async () => {
// console.log("Starting release monitor", lastCheck);
// setInterval(async () => {

View File

@@ -0,0 +1,35 @@
import axios from "axios";
import { createLogger } from "../logger/logger.controller.js";
type ODToken = {
odToken: string | null;
tokenDate: Date | null;
};
export let odToken: ODToken = {
odToken: null,
tokenDate: new Date(),
};
export const getToken = async () => {
const log = createLogger({ module: "opendock", subModule: "releaseMonitor" });
try {
const { status, data } = await axios.post(
`${process.env.OPENDOCK_URL}/auth/login`,
{
email: "blake.matthes@alpla.com",
password: process.env.OPENDOCK_PASSWORD,
},
);
if (status === 400) {
log.error(data.message);
return;
}
odToken = { odToken: data.access_token, tokenDate: new Date() };
log.info({}, "Token added");
} catch (e) {
log.error({ error: e }, "Error getting/refreshing token");
}
};

View File

@@ -1,6 +1,5 @@
import { desc, lte, sql } from "drizzle-orm";
import { desc, gte, sql } from "drizzle-orm";
import { Router } from "express";
import { open } from "inspector/promises";
import { db } from "../db/db.controller.js";
import { opendockApt } from "../db/schema/opendock.schema.js";
import { apiReturn } from "../utils/returnHelper.utils.js";
@@ -11,11 +10,18 @@ const r = Router();
r.get("/", async (_, res) => {
//const limit
const { data, error } = await tryCatch(
const daysCreated = 30;
const { data } = await tryCatch(
db
.select()
.from(opendockApt)
.where(lte(opendockApt.createdAt, sql.raw(`NOW() - INTERVAL '30 days'`)))
.where(
gte(
opendockApt.createdAt,
sql.raw(`NOW() - INTERVAL '${daysCreated} days'`),
),
)
.orderBy(desc(opendockApt.createdAt))
.limit(500),
);
@@ -25,7 +31,7 @@ r.get("/", async (_, res) => {
level: "info",
module: "opendock",
subModule: "apt",
message: "The first x Apt",
message: `The first ${data?.length} Apt(s) that were created in the last ${daysCreated} `,
data: data ?? [],
status: 200,
});

View File

@@ -0,0 +1,63 @@
import { io, type Socket } from "socket.io-client";
import { createLogger } from "../logger/logger.controller.js";
import { getToken, odToken } from "./opendock.utils.js";
const log = createLogger({ module: "opendock", subModule: "releaseMonitor" });
const TWENTY_FOUR_HOURS = 24 * 60 * 60 * 1000;
let socket: Socket | null = null;
export const opendockSocketMonitor = async () => {
if (!odToken.odToken) {
log.info({}, "Getting Auth Token");
await getToken();
}
if (
new Date(odToken.tokenDate || Date.now()).getTime() <
Date.now() - TWENTY_FOUR_HOURS
) {
log.info({}, "Refreshing Auth Token");
await getToken();
}
const baseSubspaceUrl = "wss://subspace.staging.opendock.com";
const url = `${baseSubspaceUrl}?token=${odToken.odToken}`;
socket = io(url, { transports: ["websocket"] }); // Enforce 'websocket' transport only.
socket.on("connect", () => {
console.log("Connected");
});
// socket.on("heartbeat", (data) => {
// console.log(data);
// });
socket.on("create-Appointment", (data) => {
console.log("appt create:", data);
});
socket.on("update-Appointment", (data) => {
console.log("appt update:", data);
});
socket.on("error", (data) => {
console.log("Error:", data);
});
// socket.onAny((event, ...args) => {
// console.log("Received event:", event, args);
// });
};
export const killOpendockSocket = () => {
if (!socket) {
console.log("No active socket to kill");
return;
}
console.log("🛑 Killing socket connection...");
socket.removeAllListeners(); // optional but clean
socket.disconnect();
socket = null;
console.log("✅ Socket killed");
};