diff --git a/server/routers/newt/handleNewtPingMessage.ts b/server/routers/newt/handleNewtPingMessage.ts index 86489bd67..13052dcc1 100644 --- a/server/routers/newt/handleNewtPingMessage.ts +++ b/server/routers/newt/handleNewtPingMessage.ts @@ -5,8 +5,21 @@ import { Newt } from "@server/db"; import { eq } from "drizzle-orm"; import logger from "@server/logger"; import { sendNewtSyncMessage } from "./sync"; +import semver from "semver"; import { recordSitePing } from "./pingAccumulator"; +const NEWT_SUPPORTS_SYNC_VERSION = ">=1.14.0"; +const PONG = { + message: { + type: "pong", + data: { + timestamp: new Date().toISOString() + } + }, + broadcast: false, + excludeSender: false +}; + /** * Handles ping messages from newt clients. * @@ -37,6 +50,14 @@ export const handleNewtPingMessage: MessageHandler = async (context) => { // cross-region latency to the database. recordSitePing(newt.siteId); + if ( + newt.version && + !semver.satisfies(newt.version, NEWT_SUPPORTS_SYNC_VERSION) + ) { + // Newt does not support the sync message so not checking - stop here - + return PONG; + } + // Check config version and sync if stale. const configVersion = await getClientConfigVersion(newt.newtId); @@ -65,14 +86,5 @@ export const handleNewtPingMessage: MessageHandler = async (context) => { await sendNewtSyncMessage(newt, site); } - return { - message: { - type: "pong", - data: { - timestamp: new Date().toISOString() - } - }, - broadcast: false, - excludeSender: false - }; + return PONG; }; diff --git a/server/routers/newt/sync.ts b/server/routers/newt/sync.ts index 6c3ab0a0f..30e2d59f8 100644 --- a/server/routers/newt/sync.ts +++ b/server/routers/newt/sync.ts @@ -9,45 +9,45 @@ import { import { canCompress } from "@server/lib/clientVersionChecks"; export async function sendNewtSyncMessage(newt: Newt, site: Site) { - // const { - // tcpTargets, - // udpTargets, - // validHealthCheckTargets, - // browserGatewayTargets, - // remoteExitNodeSubnets - // } = await buildTargetConfigurationForNewtClient(site.siteId); - // let exitNode: ExitNode | undefined; - // if (site.exitNodeId) { - // [exitNode] = await db - // .select() - // .from(exitNodes) - // .where(eq(exitNodes.exitNodeId, site.exitNodeId)) - // .limit(1); - // } - // const { peers, targets } = await buildClientConfigurationForNewtClient( - // site, - // exitNode - // ); - // await sendToClient( - // newt.newtId, - // { - // type: "newt/sync", - // data: { - // proxyTargets: { - // udp: udpTargets, - // tcp: tcpTargets - // }, - // healthCheckTargets: validHealthCheckTargets, - // peers: peers, - // clientTargets: targets, - // browserGatewayTargets: browserGatewayTargets, - // remoteExitNodeSubnets: remoteExitNodeSubnets - // } - // }, - // { - // compress: canCompress(newt.version, "newt") - // } - // ).catch((error) => { - // logger.warn(`Error sending newt sync message:`, error); - // }); + const { + tcpTargets, + udpTargets, + validHealthCheckTargets, + browserGatewayTargets, + remoteExitNodeSubnets + } = await buildTargetConfigurationForNewtClient(site.siteId); + let exitNode: ExitNode | undefined; + if (site.exitNodeId) { + [exitNode] = await db + .select() + .from(exitNodes) + .where(eq(exitNodes.exitNodeId, site.exitNodeId)) + .limit(1); + } + const { peers, targets } = await buildClientConfigurationForNewtClient( + site, + exitNode + ); + await sendToClient( + newt.newtId, + { + type: "newt/sync", + data: { + proxyTargets: { + udp: udpTargets, + tcp: tcpTargets + }, + healthCheckTargets: validHealthCheckTargets, + peers: peers, + clientTargets: targets, + browserGatewayTargets: browserGatewayTargets, + remoteExitNodeSubnets: remoteExitNodeSubnets + } + }, + { + compress: canCompress(newt.version, "newt") + } + ).catch((error) => { + logger.warn(`Error sending newt sync message:`, error); + }); }