diff --git a/src/controllers/handleDropPiece.ts b/src/controllers/handleDropPiece.ts index 6a3df1d..d266053 100644 --- a/src/controllers/handleDropPiece.ts +++ b/src/controllers/handleDropPiece.ts @@ -98,7 +98,7 @@ export const handleDropPiece = async (req: Request, res: Response) => { const gameText = droppedAssets[0]; if (!shouldUpdateGame) { - if (gameText) gameText.updateCustomTextAsset({}, text); + if (gameText) await gameText.updateCustomTextAsset({}, text); throw text; } diff --git a/src/index.ts b/src/index.ts index 0bc4b18..eb7652f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,6 +21,21 @@ app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use("/api", router); +// Prevent crashes from unhandled promise rejections (e.g., API timeouts after response sent) +process.on("unhandledRejection", (reason, promise) => { + console.error("Unhandled Rejection:", reason); +}); + +process.on("uncaughtException", (error) => { + // ERR_HTTP_HEADERS_SENT is non-fatal — response was already sent, just log it + if ((error as any).code === "ERR_HTTP_HEADERS_SENT") { + console.error("Caught ERR_HTTP_HEADERS_SENT (response already sent):", error.message); + return; + } + console.error("Uncaught Exception:", error); + process.exit(1); +}); + const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server listening on ${PORT}`); diff --git a/src/utils/droppedAssets/initializeDroppedAssetDataObject.ts b/src/utils/droppedAssets/initializeDroppedAssetDataObject.ts index d1cb955..369c274 100644 --- a/src/utils/droppedAssets/initializeDroppedAssetDataObject.ts +++ b/src/utils/droppedAssets/initializeDroppedAssetDataObject.ts @@ -17,6 +17,7 @@ export const initializeDroppedAssetDataObject = async (droppedAsset, sceneDropId }, { lock: { lockId, releaseLock: true } }, ); + await droppedAsset.fetchDataObject(); } return wasDataObjectInitialized; diff --git a/src/utils/errorHandler.ts b/src/utils/errorHandler.ts index 5abc85b..e84a93e 100644 --- a/src/utils/errorHandler.ts +++ b/src/utils/errorHandler.ts @@ -12,30 +12,31 @@ export const errorHandler = ({ res?: any; }) => { try { - if (process.env.NODE_ENV === "development") console.log("❌ Error:", error); - else { - const reqQueryParams = req?.query; - if (reqQueryParams?.interactiveNonce) delete reqQueryParams.interactiveNonce; + if (process.env.NODE_ENV === "development") console.error("❌ Error:", error); - console.error( - JSON.stringify({ - errorContext: { - message, - functionName, - }, - requestContext: { - requestId: req?.id, - reqQueryParams, - reqBody: req?.body, - }, - error: JSON.stringify(error, Object.getOwnPropertyNames(error)), - }), - ); - } - if (res) return res.status(error.status || 500).send({ error, message, success: false }); + const reqQueryParams = req?.query; + if (reqQueryParams?.interactiveNonce) delete reqQueryParams.interactiveNonce; + + console.error( + JSON.stringify({ + errorContext: { + message, + functionName, + }, + requestContext: { + requestId: req?.id, + reqQueryParams, + reqBody: req?.body, + }, + error: JSON.stringify(error, Object.getOwnPropertyNames(error)), + }), + ); + + if (res && !res.headersSent) return res.status(error.status || 500).send({ error, message, success: false }); return { error }; } catch (e) { console.error("❌ Error printing the logs", e); - return res.status(500).send({ error: e, message, success: false }); + if (res && !res.headersSent) return res.status(500).send({ error: e, message, success: false }); + return { error: e }; } };