返回提交历史
Modified
src/controllers/api/artifactsController.ts
+2
-1
Modified
src/controllers/api/deleteSessionController.ts
+2
-1
Modified
src/controllers/api/focusController.ts
+2
-1
Modified
src/controllers/api/hostSessionController.ts
+2
-1
Modified
src/controllers/api/inboxController.ts
+2
-1
Modified
src/controllers/api/infestedFoundryController.ts
+2
-3
Modified
src/controllers/api/inventoryController.ts
+14
-11
Modified
src/controllers/api/loginController.ts
+15
-18
Modified
src/controllers/api/setGuildMotdController.ts
+2
-1
Modified
src/controllers/api/upgradesController.ts
+2
-1
Modified
src/controllers/dynamic/worldStateController.ts
+2
-1
Modified
src/controllers/pay/getSkuCatalogController.ts
+2
-1
Modified
src/helpers/inventoryHelpers.ts
+2
-1
Modified
src/helpers/nemesisHelpers.ts
+12
-11
Modified
src/services/guildService.ts
+2
-1
Modified
src/services/inventoryService.ts
+3
-2
Modified
src/services/itemDataService.ts
+2
-1
Modified
src/services/missionInventoryUpdateService.ts
+2
-1
Modified
src/services/saveLoadoutService.ts
+4
-3
Modified
src/services/worldStateService.ts
+13
-12
Added
static/fixed_responses/gameToBuildVersion.json
+38
-0
XFEstudio/XFESpaceNinjaServer
chore: add gameToBuildVersion (#3104)
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3104 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
f40724d4
代码差异
21 个文件
+127
-73
@@ -9,6 +9,7 @@ import type {
9
9
import { addMods, getInventory } from "../../services/inventoryService.ts";
10
10
import { broadcastInventoryUpdate } from "../../services/wsService.ts";
11
11
import { fromOid, version_compare } from "../../helpers/inventoryHelpers.ts";
12
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
12
13
13
14
export const artifactsController: RequestHandler = async (req, res) => {
14
15
const account = await getAccountForRequest(req);
@@ -24,7 +25,7 @@ export const artifactsController: RequestHandler = async (req, res) => {
24
25
if (
25
26
"ignoreBuildLabel" in req.query ||
26
27
!account.BuildLabel ||
27
version_compare(account.BuildLabel, "2016.08.19.17.12") >= 0
28
version_compare(account.BuildLabel, gameToBuildVersion["18.18.0"]) >= 0
28
29
) {
29
30
const safeUpgradeFingerprint = UpgradeFingerprint || '{"lvl":0}';
30
31
const parsedUpgradeFingerprint = JSON.parse(safeUpgradeFingerprint) as { lvl: number };
@@ -2,11 +2,12 @@ import type { RequestHandler } from "express";
2
2
import { deleteSession } from "../../managers/sessionManager.ts";
3
3
import { getAccountForRequest } from "../../services/loginService.ts";
4
4
import { version_compare } from "../../helpers/inventoryHelpers.ts";
5
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
5
6
6
7
const deleteSessionController: RequestHandler = async (_req, res) => {
7
8
const account = await getAccountForRequest(_req);
8
9
deleteSession(_req.query.sessionId as string);
9
if (account.BuildLabel && version_compare(account.BuildLabel, "2016.07.08.16.56") < 0) {
10
if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["18.16.0"]) < 0) {
10
11
// Pre-Specters of the Rail
11
12
res.send(_req.query.sessionId as string); // Unsure if this is correct, but the client is chill with it
12
13
} else {
@@ -7,12 +7,13 @@ import { logger } from "../../utils/logger.ts";
7
7
import { ExportFocusUpgrades } from "warframe-public-export-plus";
8
8
import { Inventory } from "../../models/inventoryModels/inventoryModel.ts";
9
9
import { version_compare } from "../../helpers/inventoryHelpers.ts";
10
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
10
11
11
12
export const focusController: RequestHandler = async (req, res) => {
12
13
const account = await getAccountForRequest(req);
13
14
14
15
let op = req.query.op as string;
15
const focus2 = account.BuildLabel && version_compare(account.BuildLabel, "2022.04.29.12.53") < 0;
16
const focus2 = account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["31.5.0"]) < 0;
16
17
if (focus2) {
17
18
// Focus 2.0
18
19
switch (req.query.op) {
@@ -5,6 +5,7 @@ import { logger } from "../../utils/logger.ts";
5
5
import type { ISession } from "../../types/session.ts";
6
6
import { JSONParse } from "json-with-bigint";
7
7
import { toOid2, version_compare } from "../../helpers/inventoryHelpers.ts";
8
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
8
9
9
10
const hostSessionController: RequestHandler = async (req, res) => {
10
11
const account = await getAccountForRequest(req);
@@ -13,7 +14,7 @@ const hostSessionController: RequestHandler = async (req, res) => {
13
14
const session = createNewSession(hostSessionRequest, account._id);
14
15
logger.debug(`New Session Created`, { session });
15
16
16
if (account.BuildLabel && version_compare(account.BuildLabel, "2016.07.08.16.56") < 0) {
17
if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["18.16.0"]) < 0) {
17
18
// Pre-Specters of the Rail
18
19
res.send(session.sessionId.toString());
19
20
} else {
@@ -26,6 +26,7 @@ import { unixTimesInMs } from "../../constants/timeConstants.ts";
26
26
import { config } from "../../services/configService.ts";
27
27
import { Types } from "mongoose";
28
28
import { version_compare } from "../../helpers/inventoryHelpers.ts";
29
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
29
30
30
31
export const inboxController: RequestHandler = async (req, res) => {
31
32
const { deleteId, lastMessage: latestClientMessageId, messageId } = req.query;
@@ -150,7 +151,7 @@ const createNewEventMessages = async (req: Request): Promise<void> => {
150
151
const baroEnd = baroStart + unixTimesInMs.day * 14;
151
152
const baroActualStart = baroStart + unixTimesInMs.day * (config.worldState?.baroAlwaysAvailable ? 0 : 12);
152
153
const evilBaroStage =
153
account.BuildLabel && version_compare(account.BuildLabel, "2025.10.14.16.10") < 0
154
account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["40.0.0"]) < 0
154
155
? 0
155
156
: (config.worldState?.evilBaroStage ?? 0);
156
157
const evilBaroTransmission = [
@@ -21,6 +21,7 @@ import {
21
21
handleSubsumeCompletion
22
22
} from "../../services/infestedFoundryService.ts";
23
23
import { sendWsBroadcastToGame } from "../../services/wsService.ts";
24
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
24
25
25
26
export const infestedFoundryController: RequestHandler = async (req, res) => {
26
27
const account = await getAccountForRequest(req);
@@ -76,12 +77,10 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
76
77
if (!inventory.infiniteHelminthMaterials) {
77
78
let type: string;
78
79
let count: number;
79
if (account.BuildLabel && version_compare(account.BuildLabel, "2025.05.20.10.18") < 0) {
80
// < 38.6.0
80
if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["38.6.0"]) < 0) {
81
81
type = "/Lotus/Types/Items/InfestedFoundry/HelminthBile";
82
82
count = 300;
83
83
} else {
84
// >= 38.6.0
85
84
type =
86
85
archonCrystalRemovalResource[
87
86
suit.ArchonCrystalUpgrades![request.Slot].Color!.replace("_MYTHIC", "")
@@ -45,6 +45,7 @@ import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
45
45
import { generateRewardSeed } from "../../services/rngService.ts";
46
46
import { getInvasionByOid, getWorldState } from "../../services/worldStateService.ts";
47
47
import { createMessage } from "../../services/inboxService.ts";
48
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
48
49
49
50
export const inventoryController: RequestHandler = async (request, response) => {
50
51
const account = await getAccountForRequest(request);
@@ -465,7 +466,7 @@ export const getInventoryResponse = async (
465
466
inventoryResponse.Nemesis = undefined;
466
467
}
467
468
468
if (version_compare(buildLabel, "2019.03.07.20.21") < 0) {
469
if (version_compare(buildLabel, gameToBuildVersion["24.4.0"]) < 0) {
469
470
// Builds before U24.4.0 handle equipment features differently
470
471
for (const category of equipmentKeys) {
471
472
for (const item of inventoryResponse[category]) {
@@ -481,25 +482,25 @@ export const getInventoryResponse = async (
481
482
}
482
483
}
483
484
484
if (version_compare(buildLabel, "2018.02.22.14.34") < 0) {
485
if (version_compare(buildLabel, gameToBuildVersion["22.13.4"]) < 0) {
485
486
const personalRoomsDb = await getPersonalRooms(inventory.accountOwnerId.toString());
486
487
const personalRooms = personalRoomsDb.toJSON<IPersonalRoomsClient>();
487
488
inventoryResponse.Ship = personalRooms.Ship;
488
489
489
if (version_compare(buildLabel, "2016.12.21.19.13") <= 0) {
490
if (version_compare(buildLabel, gameToBuildVersion["19.5.0"]) <= 0) {
490
491
// U19.5 and below use $id instead of $oid
491
492
for (const category of equipmentKeys) {
492
493
for (const item of inventoryResponse[category]) {
493
494
toLegacyOid(item.ItemId);
494
if (version_compare(buildLabel, "2015.05.14.16.29") < 0) {
495
if (version_compare(buildLabel, gameToBuildVersion["16.5.5"]) < 0) {
495
496
// Appearance config format is different for versions before U16.5
496
497
for (const config of item.Configs) {
497
if (version_compare(buildLabel, "2015.03.21.08.17") < 0) {
498
if (version_compare(buildLabel, gameToBuildVersion["16.0.2"]) < 0) {
498
499
config.Customization = {
499
500
Colors: convertIColorToLegacyColorsWithAtt(config.pricol, config.attcol),
500
501
Skins: config.Skins ?? []
501
502
};
502
} else if (version_compare(buildLabel, "2015.03.21.08.17") >= 0) {
503
} else if (version_compare(buildLabel, gameToBuildVersion["16.0.2"]) >= 0) {
503
504
config.Colors = convertIColorToLegacyColorsWithAtt(
504
505
config.pricol,
505
506
config.attcol
@@ -551,7 +552,7 @@ export const getInventoryResponse = async (
551
552
552
553
for (const upgrade of inventoryResponse.Upgrades) {
553
554
toLegacyOid(upgrade.ItemId);
554
if (version_compare(buildLabel, "2016.08.19.17.12") < 0) {
555
if (version_compare(buildLabel, gameToBuildVersion["18.18.0"]) < 0) {
555
556
// Pre-U18.18 builds use a different UpgradeFingerprint format
556
557
let rank: number = 0;
557
558
if (upgrade.UpgradeFingerprint) {
@@ -563,7 +564,7 @@ export const getInventoryResponse = async (
563
564
);
564
565
}
565
566
upgrade.UpgradeFingerprint = `lvl=${rank}|`;
566
if (version_compare(buildLabel, "2014.04.10.17.47") < 0) {
567
if (version_compare(buildLabel, gameToBuildVersion["13.0.0"]) < 0) {
567
568
// Pre-U10 builds
568
569
if (
569
570
!upgrade.AmountRemaining ||
@@ -623,7 +624,7 @@ export const getInventoryResponse = async (
623
624
inventoryResponse.CurrentLoadOutIds.length > 0 &&
624
625
inventoryResponse.LoadOutPresets.NORMAL.length > 0
625
626
) {
626
if (version_compare(buildLabel, "2014.07.21.18.38") >= 0) {
627
if (version_compare(buildLabel, gameToBuildVersion["14.0.0"]) >= 0) {
627
628
// U14-U15 expect a different response than any other version, where the client is pulling loadout data from has not been found yet
628
629
// As such, loading loadouts is currently unsupported for these versions
629
630
logger.warn("Loadouts are currently unsupported in U14-U15, loadouts will be undefined");
@@ -682,7 +683,9 @@ const mapLegacyLoadoutConfig = (
682
683
const l = normPreset.l?.ItemId?.$oid ? inventory.LongGuns.id(normPreset.l.ItemId.$oid) : null;
683
684
const m = normPreset.m?.ItemId?.$oid ? inventory.Melee.id(normPreset.m.ItemId.$oid) : null;
684
685
const loadoutConfig = {
685
ItemId: { $id: version_compare(buildLabel, "2014.07.21.18.38") < 0 ? "Current" : normPreset.ItemId.$oid },
686
ItemId: {
687
$id: version_compare(buildLabel, gameToBuildVersion["14.0.0"]) < 0 ? "Current" : normPreset.ItemId.$oid
688
},
686
689
Name: normPreset.n ?? "Default Loadout",
687
690
Presets: [
688
691
{
@@ -791,7 +794,7 @@ const mapLegacyLoadoutConfig = (
791
794
}
792
795
}
793
796
794
if (version_compare(buildLabel, "2014.10.24.08.24") >= 0) {
797
if (version_compare(buildLabel, gameToBuildVersion["15.0.0"]) >= 0) {
795
798
if (inventory.CurrentLoadOutIds.length > 2 && loadoutPresets.ARCHWING.length > 0) {
796
799
const archPreset = loadoutPresets.ARCHWING.find(
797
800
x => x.ItemId.$oid == inventory.CurrentLoadOutIds[2].toString()
@@ -14,6 +14,7 @@ import { createMessage } from "../../services/inboxService.ts";
14
14
import { fromStoreItem } from "../../services/itemDataService.ts";
15
15
import { getTokenForClient, getTunablesForClient } from "../../services/tunablesService.ts";
16
16
import type { AddressInfo } from "node:net";
17
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
17
18
18
19
export const loginController: RequestHandler = async (request, response) => {
19
20
const loginRequest = JSON.parse(String(request.body)) as ILoginRequest; // parse octet stream of json data to json object
@@ -71,7 +72,7 @@ export const loginController: RequestHandler = async (request, response) => {
71
72
72
73
if (account.Nonce && account.ClientType != "webui" && !account.Dropped && !loginRequest.kick) {
73
74
// U17 seems to handle "nonce still set" like a login failure.
74
if (version_compare(buildLabel, "2015.12.05.18.07") >= 0) {
75
if (version_compare(buildLabel, gameToBuildVersion["18.0.2"]) >= 0) {
75
76
response.status(400).send({ error: "nonce still set" });
76
77
return;
77
78
}
@@ -119,7 +120,7 @@ const createLoginResponse = (request: Request, account: IDatabaseAccountJson, bu
119
120
Nonce: account.Nonce,
120
121
BuildLabel: buildLabel
121
122
};
122
if (version_compare(buildLabel, "2014.04.10.17.47") >= 0) {
123
if (version_compare(buildLabel, gameToBuildVersion["13.0.0"]) >= 0) {
123
124
// U13 and up
124
125
resp.CountryCode = account.CountryCode;
125
126
} else {
@@ -128,33 +129,29 @@ const createLoginResponse = (request: Request, account: IDatabaseAccountJson, bu
128
129
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
129
130
resp.SteamId = "0";
130
131
}
131
if (version_compare(buildLabel, "2015.02.13.10.41") >= 0) {
132
if (version_compare(buildLabel, gameToBuildVersion["15.14.1"]) >= 0) {
132
133
resp.NRS = [config.nrsAddress ?? myAddress];
133
134
}
134
if (version_compare(buildLabel, "2015.05.14.16.29") >= 0) {
135
// U17 and up
135
if (version_compare(buildLabel, gameToBuildVersion["16.5.5"]) >= 0) {
136
136
resp.IRC = [config.ircAddress ?? myAddress];
137
137
}
138
if (version_compare(buildLabel, "2018.11.08.14.45") >= 0) {
139
// U24 and up
138
if (version_compare(buildLabel, gameToBuildVersion["24.0.0"]) >= 0) {
140
139
resp.ConsentNeeded = account.ConsentNeeded;
141
140
resp.TrackedSettings = account.TrackedSettings;
142
141
}
143
if (version_compare(buildLabel, "2019.08.29.20.01") >= 0) {
144
// U25.7 and up
142
if (version_compare(buildLabel, gameToBuildVersion["25.7.0"]) >= 0) {
145
143
resp.ForceLogoutVersion = account.ForceLogoutVersion;
146
144
}
147
if (version_compare(buildLabel, "2019.10.31.22.42") >= 0) {
148
// U26 and up
145
if (version_compare(buildLabel, gameToBuildVersion["26.0.0"]) >= 0) {
149
146
resp.Groups = [];
150
147
}
151
if (version_compare(buildLabel, "2021.04.13.19.58") >= 0) {
148
if (version_compare(buildLabel, gameToBuildVersion["30.0.0"]) >= 0) {
152
149
resp.DTLS = config.dtls ?? 0; // bit 0 enables DTLS. if enabled, additional bits can be set, e.g. bit 2 to enable logging. on live, the value is 99.
153
150
}
154
if (version_compare(buildLabel, "2022.04.29.12.53") >= 0) {
151
if (version_compare(buildLabel, gameToBuildVersion["31.5.0"]) >= 0) {
155
152
resp.ClientType = account.ClientType;
156
153
}
157
if (version_compare(buildLabel, "2022.09.06.19.24") >= 0) {
154
if (version_compare(buildLabel, gameToBuildVersion["32.0.0"]) >= 0) {
158
155
resp.CrossPlatformAllowed = account.CrossPlatformAllowed;
159
156
resp.HUB = `${myUrlBase}/api/`;
160
157
@@ -168,11 +165,11 @@ const createLoginResponse = (request: Request, account: IDatabaseAccountJson, bu
168
165
minute
169
166
).toString();
170
167
}
171
if (version_compare(buildLabel, "2023.04.25.23.40") >= 0) {
172
if (version_compare(buildLabel, "2025.10.14.16.10") >= 0) {
168
if (version_compare(buildLabel, gameToBuildVersion["33.0.0"]) >= 0) {
169
if (version_compare(buildLabel, gameToBuildVersion["40.0.0"]) >= 0) {
173
170
// U40 is when they changed this from content.warframe.com/dynamic/ to api.warframe.com/cdn/
174
171
resp.platformCDNs = [`${myUrlBase}/cdn/`];
175
} else if (version_compare(buildLabel, "2025.08.26.09.49") >= 0) {
172
} else if (version_compare(buildLabel, gameToBuildVersion["39.1.0"]) >= 0) {
176
173
// U39.1 is when they made dynamic/ explicit
177
174
resp.platformCDNs = [`${myUrlBase}/dynamic/`];
178
175
} else {
@@ -188,7 +185,7 @@ const createLoginResponse = (request: Request, account: IDatabaseAccountJson, bu
188
185
version_compare(clientMod.substring(21), "0.12.0") >= 0
189
186
) {
190
187
const tunables = getTunablesForClient((request.socket.address() as AddressInfo).address);
191
if (version_compare(buildLabel, "2015.05.14.16.29") < 0) {
188
if (version_compare(buildLabel, gameToBuildVersion["16.5.5"]) < 0) {
192
189
tunables.irc = config.ircAddress ?? myAddress;
193
190
}
194
191
raw += "\t" + JSON.stringify(tunables);
@@ -6,6 +6,7 @@ import { getAccountForRequest, getSuffixedName } from "../../services/loginServi
6
6
import type { ILongMOTD } from "../../types/guildTypes.ts";
7
7
import { GuildPermission } from "../../types/guildTypes.ts";
8
8
import type { RequestHandler } from "express";
9
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
9
10
10
11
export const setGuildMotdController: RequestHandler = async (req, res) => {
11
12
const account = await getAccountForRequest(req);
@@ -57,7 +58,7 @@ export const setGuildMotdController: RequestHandler = async (req, res) => {
57
58
await guild.save();
58
59
}
59
60
60
if (!account.BuildLabel || version_compare(account.BuildLabel, "2020.11.04.18.58") > 0) {
61
if (!account.BuildLabel || version_compare(account.BuildLabel, gameToBuildVersion["29.3.1"]) > 0) {
61
62
res.json({ IsLongMOTD, MOTD });
62
63
} else {
63
64
res.send(MOTD).end();
@@ -12,6 +12,7 @@ import { sendWsBroadcastTo } from "../../services/wsService.ts";
12
12
import type { IEquipmentDatabase } from "../../types/equipmentTypes.ts";
13
13
import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
14
14
import { Types } from "mongoose";
15
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
15
16
16
17
export const upgradesController: RequestHandler = async (req, res) => {
17
18
const account = await getAccountForRequest(req);
@@ -19,7 +20,7 @@ export const upgradesController: RequestHandler = async (req, res) => {
19
20
const inventory = await getInventory(accountId);
20
21
const inventoryChanges: IInventoryChanges = {};
21
22
22
if (account.BuildLabel && version_compare(account.BuildLabel, "2019.03.07.20.21") < 0) {
23
if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["24.4.0"]) < 0) {
23
24
// Builds before U24.4.0 have a different request format
24
25
const payload = JSON.parse(String(req.body)) as IUpgradesRequestLegacy;
25
26
const itemId = fromOid(payload.Weapon.ItemId);
@@ -1,6 +1,7 @@
1
1
import type { RequestHandler } from "express";
2
2
import { getWorldState, populateDailyDeal, populateFissures } from "../../services/worldStateService.ts";
3
3
import { version_compare } from "../../helpers/inventoryHelpers.ts";
4
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
4
5
5
6
export const worldStateController: RequestHandler = async (req, res) => {
6
7
const buildLabel = req.query.buildLabel as string | undefined;
@@ -9,7 +10,7 @@ export const worldStateController: RequestHandler = async (req, res) => {
9
10
const populatePromises = [populateDailyDeal(worldState)];
10
11
11
12
// Omitting void fissures for versions prior to Dante Unbound to avoid script errors.
12
if (!buildLabel || version_compare(buildLabel, "2024.03.24.20.00") >= 0) {
13
if (!buildLabel || version_compare(buildLabel, gameToBuildVersion["35.5.0"]) >= 0) {
13
14
populatePromises.push(populateFissures(worldState));
14
15
}
15
16
@@ -1,10 +1,11 @@
1
1
import type { RequestHandler } from "express";
2
2
import { getAccountForRequest } from "../../services/loginService.ts";
3
3
import { version_compare } from "../../helpers/inventoryHelpers.ts";
4
import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
4
5
5
6
export const getSkuCatalogController: RequestHandler = async (req, res) => {
6
7
const account = await getAccountForRequest(req);
7
if (!account.BuildLabel || version_compare(account.BuildLabel, "2025.10.14.16.10") >= 0) {
8
if (!account.BuildLabel || version_compare(account.BuildLabel, gameToBuildVersion["40.0.0"]) >= 0) {
8
9
res.sendFile("static/fixed_responses/getSkuCatalogU40.json", { root: "./" });
9
10
} else {
10
11
res.sendFile("static/fixed_responses/getSkuCatalog.json", { root: "./" });