diff --git a/database/backend.log b/database/backend.log index 6aea169..967d558 100644 --- a/database/backend.log +++ b/database/backend.log @@ -6968,3 +6968,1249 @@ Connected to MongoDB [2025-08-16T10:59:27.227Z] API: Deleted player shoptestplayer [2025-08-16T10:59:27.726Z] DB: getAllPlayers - start [2025-08-16T10:59:27.728Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:01:45.300Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T11:04:44.846Z] DB: getAllPlayers - start +[2025-08-16T11:04:44.848Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:05:41.191Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:05:41.193Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:05:41.193Z] DB: deletePlayer - start gmtest +[2025-08-16T11:05:41.193Z] DB: deletePlayer - changes 0 gmtest +[2025-08-16T11:05:41.242Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:05:41.243Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:41.243Z] DB: getPlayerByName - not found gmtest +[2025-08-16T11:05:41.425Z] DB: createPlayer - start gmtest +[2025-08-16T11:05:41.426Z] DB: createPlayer - done gmtest rowid 93 +[2025-08-16T11:05:41.426Z] API: Created player gmtest +[2025-08-16T11:05:41.445Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:05:41.445Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:05:41.446Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:41.446Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:05:41.447Z] DB: updatePlayer - start gmtest +[2025-08-16T11:05:41.447Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T11:05:41.447Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:41.448Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:05:41.448Z] API: Updated player gmtest +[2025-08-16T11:05:41.464Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:05:41.464Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:05:41.464Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:41.464Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:05:41.547Z] DB: updatePlayer - start gmtest +[2025-08-16T11:05:41.548Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T11:05:41.548Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:41.548Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:05:41.548Z] API: Updated player gmtest +[2025-08-16T11:05:41.564Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:41.564Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:05:41.644Z] DB: createSession - start b60955848b75efd424cff5aae6cfd22bc7a62f67850669fa507e60060dc7bb8e expiresAt 2025-08-17T11:05:41.644Z +[2025-08-16T11:05:41.645Z] DB: createSession - done b60955848b75efd424cff5aae6cfd22bc7a62f67850669fa507e60060dc7bb8e +[2025-08-16T11:05:41.645Z] API: Player login gmtest b60955848b75efd424cff5aae6cfd22bc7a62f67850669fa507e60060dc7bb8e +[2025-08-16T11:05:41.661Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:05:41.662Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:05:41.662Z] DB: deletePlayer - start gmtest +[2025-08-16T11:05:41.662Z] DB: deletePlayer - changes 1 gmtest +[2025-08-16T11:05:41.662Z] API: Deleted player gmtest +[2025-08-16T11:05:41.677Z] SESSION: GM bypass accepted GET /api/players +[2025-08-16T11:05:41.678Z] DB: getAllPlayers - start +[2025-08-16T11:05:41.679Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:05:41.679Z] API: Fetch all players (public) Found 7 players +[2025-08-16T11:05:42.118Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:05:42.119Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:05:42.119Z] DB: deletePlayer - start testplayer +[2025-08-16T11:05:42.119Z] DB: deletePlayer - changes 0 testplayer +[2025-08-16T11:05:42.136Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:05:42.136Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:42.136Z] DB: getPlayerByName - not found testplayer +[2025-08-16T11:05:42.217Z] DB: createPlayer - start testplayer +[2025-08-16T11:05:42.217Z] DB: createPlayer - done testplayer rowid 94 +[2025-08-16T11:05:42.217Z] API: Created player testplayer +[2025-08-16T11:05:42.235Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:42.236Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:05:42.316Z] DB: createSession - start f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe expiresAt 2025-08-17T11:05:42.316Z +[2025-08-16T11:05:42.317Z] DB: createSession - done f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe +[2025-08-16T11:05:42.317Z] API: Player login testplayer f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe +[2025-08-16T11:05:42.334Z] DB: getSession - start f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe +[2025-08-16T11:05:42.335Z] DB: getSession - ok f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe +[2025-08-16T11:05:42.335Z] SESSION: Valid f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe testplayer PUT /api/players/testplayer +[2025-08-16T11:05:42.335Z] DB: getSession - start f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe +[2025-08-16T11:05:42.335Z] DB: getSession - ok f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe +[2025-08-16T11:05:42.335Z] SESSION: Valid f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe testplayer PUT /api/players/testplayer +[2025-08-16T11:05:42.335Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:42.335Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:05:42.335Z] DB: updatePlayer - start testplayer +[2025-08-16T11:05:42.336Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T11:05:42.336Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:42.336Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:05:42.336Z] API: Updated player testplayer +[2025-08-16T11:05:42.352Z] DB: getSession - start f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe +[2025-08-16T11:05:42.353Z] DB: getSession - ok f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe +[2025-08-16T11:05:42.353Z] SESSION: Valid f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe testplayer PUT /api/players/testplayer +[2025-08-16T11:05:42.353Z] DB: getSession - start f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe +[2025-08-16T11:05:42.353Z] DB: getSession - ok f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe +[2025-08-16T11:05:42.353Z] SESSION: Valid f0da084fc561c480ddec76d8c668d623da717b55305abef2dcfefabee9596efe testplayer PUT /api/players/testplayer +[2025-08-16T11:05:42.353Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:42.353Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:05:42.353Z] DB: updatePlayer - start testplayer +[2025-08-16T11:05:42.354Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T11:05:42.354Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:42.354Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:05:42.354Z] API: Updated player testplayer +[2025-08-16T11:05:42.370Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:05:42.371Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:05:42.371Z] DB: deletePlayer - start testplayer +[2025-08-16T11:05:42.371Z] DB: deletePlayer - changes 1 testplayer +[2025-08-16T11:05:42.371Z] API: Deleted player testplayer +[2025-08-16T11:05:43.192Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:05:43.192Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:05:43.192Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T11:05:43.192Z] DB: deletePlayer - changes 0 shoptestplayer +[2025-08-16T11:05:43.206Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:05:43.206Z] DB: getPlayerByName - start shoptestplayer +[2025-08-16T11:05:43.206Z] DB: getPlayerByName - not found shoptestplayer +[2025-08-16T11:05:43.286Z] DB: createPlayer - start shoptestplayer +[2025-08-16T11:05:43.286Z] DB: createPlayer - done shoptestplayer rowid 95 +[2025-08-16T11:05:43.286Z] API: Created player shoptestplayer +[2025-08-16T11:05:43.299Z] SESSION: Missing sessionId GET /api/shop/inventory/shoptestplayer +[2025-08-16T11:05:43.312Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:05:43.312Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:05:43.312Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T11:05:43.313Z] DB: deletePlayer - changes 1 shoptestplayer +[2025-08-16T11:05:43.313Z] API: Deleted player shoptestplayer +[2025-08-16T11:05:45.065Z] DB: getAllPlayers - start +[2025-08-16T11:05:45.067Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:05:58.509Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:05:58.511Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:05:58.511Z] DB: deletePlayer - start gmtest +[2025-08-16T11:05:58.511Z] DB: deletePlayer - changes 0 gmtest +[2025-08-16T11:05:58.546Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:05:58.547Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:58.547Z] DB: getPlayerByName - not found gmtest +[2025-08-16T11:05:58.719Z] DB: createPlayer - start gmtest +[2025-08-16T11:05:58.720Z] DB: createPlayer - done gmtest rowid 96 +[2025-08-16T11:05:58.720Z] API: Created player gmtest +[2025-08-16T11:05:58.739Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:05:58.739Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:05:58.739Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:58.739Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:05:58.741Z] DB: updatePlayer - start gmtest +[2025-08-16T11:05:58.741Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T11:05:58.741Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:58.741Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:05:58.741Z] API: Updated player gmtest +[2025-08-16T11:05:58.757Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:05:58.757Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:05:58.757Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:58.757Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:05:58.839Z] DB: updatePlayer - start gmtest +[2025-08-16T11:05:58.839Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T11:05:58.840Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:58.840Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:05:58.840Z] API: Updated player gmtest +[2025-08-16T11:05:58.856Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:05:58.856Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:05:58.940Z] DB: createSession - start 2e78a050d627baab5e9472b93ca12ee6fe486ba73637c081129743e10a3c6b9b expiresAt 2025-08-17T11:05:58.939Z +[2025-08-16T11:05:58.940Z] DB: createSession - done 2e78a050d627baab5e9472b93ca12ee6fe486ba73637c081129743e10a3c6b9b +[2025-08-16T11:05:58.940Z] API: Player login gmtest 2e78a050d627baab5e9472b93ca12ee6fe486ba73637c081129743e10a3c6b9b +[2025-08-16T11:05:58.965Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:05:58.965Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:05:58.965Z] DB: deletePlayer - start gmtest +[2025-08-16T11:05:58.965Z] DB: deletePlayer - changes 1 gmtest +[2025-08-16T11:05:58.966Z] API: Deleted player gmtest +[2025-08-16T11:05:58.981Z] SESSION: GM bypass accepted GET /api/players +[2025-08-16T11:05:58.981Z] DB: getAllPlayers - start +[2025-08-16T11:05:58.983Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:05:58.983Z] API: Fetch all players (public) Found 7 players +[2025-08-16T11:05:59.324Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:05:59.325Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:05:59.325Z] DB: deletePlayer - start testplayer +[2025-08-16T11:05:59.325Z] DB: deletePlayer - changes 0 testplayer +[2025-08-16T11:05:59.341Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:05:59.341Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:59.342Z] DB: getPlayerByName - not found testplayer +[2025-08-16T11:05:59.422Z] DB: createPlayer - start testplayer +[2025-08-16T11:05:59.422Z] DB: createPlayer - done testplayer rowid 97 +[2025-08-16T11:05:59.423Z] API: Created player testplayer +[2025-08-16T11:05:59.441Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:59.441Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:05:59.522Z] DB: createSession - start 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b expiresAt 2025-08-17T11:05:59.522Z +[2025-08-16T11:05:59.522Z] DB: createSession - done 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b +[2025-08-16T11:05:59.522Z] API: Player login testplayer 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b +[2025-08-16T11:05:59.539Z] DB: getSession - start 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b +[2025-08-16T11:05:59.540Z] DB: getSession - ok 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b +[2025-08-16T11:05:59.540Z] SESSION: Valid 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b testplayer PUT /api/players/testplayer +[2025-08-16T11:05:59.540Z] DB: getSession - start 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b +[2025-08-16T11:05:59.540Z] DB: getSession - ok 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b +[2025-08-16T11:05:59.540Z] SESSION: Valid 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b testplayer PUT /api/players/testplayer +[2025-08-16T11:05:59.540Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:59.540Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:05:59.540Z] DB: updatePlayer - start testplayer +[2025-08-16T11:05:59.541Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T11:05:59.541Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:59.541Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:05:59.541Z] API: Updated player testplayer +[2025-08-16T11:05:59.557Z] DB: getSession - start 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b +[2025-08-16T11:05:59.558Z] DB: getSession - ok 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b +[2025-08-16T11:05:59.558Z] SESSION: Valid 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b testplayer PUT /api/players/testplayer +[2025-08-16T11:05:59.558Z] DB: getSession - start 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b +[2025-08-16T11:05:59.558Z] DB: getSession - ok 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b +[2025-08-16T11:05:59.558Z] SESSION: Valid 21d478a4969ad8c935ceab83c3ce74bc386d3b15afa945ab86198b866e6d2e5b testplayer PUT /api/players/testplayer +[2025-08-16T11:05:59.558Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:59.558Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:05:59.558Z] DB: updatePlayer - start testplayer +[2025-08-16T11:05:59.558Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T11:05:59.558Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:05:59.559Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:05:59.559Z] API: Updated player testplayer +[2025-08-16T11:05:59.575Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:05:59.575Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:05:59.575Z] DB: deletePlayer - start testplayer +[2025-08-16T11:05:59.576Z] DB: deletePlayer - changes 1 testplayer +[2025-08-16T11:05:59.576Z] API: Deleted player testplayer +[2025-08-16T11:06:00.079Z] DB: getAllPlayers - start +[2025-08-16T11:06:00.081Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:06:00.483Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:06:00.483Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:06:00.483Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T11:06:00.483Z] DB: deletePlayer - changes 0 shoptestplayer +[2025-08-16T11:06:00.497Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:06:00.497Z] DB: getPlayerByName - start shoptestplayer +[2025-08-16T11:06:00.497Z] DB: getPlayerByName - not found shoptestplayer +[2025-08-16T11:06:00.576Z] DB: createPlayer - start shoptestplayer +[2025-08-16T11:06:00.577Z] DB: createPlayer - done shoptestplayer rowid 98 +[2025-08-16T11:06:00.577Z] API: Created player shoptestplayer +[2025-08-16T11:06:00.590Z] SESSION: Missing sessionId GET /api/shop/inventory/shoptestplayer +[2025-08-16T11:06:00.603Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:06:00.604Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:06:00.604Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T11:06:00.604Z] DB: deletePlayer - changes 1 shoptestplayer +[2025-08-16T11:06:00.604Z] API: Deleted player shoptestplayer +[2025-08-16T11:13:49.819Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:13:49.821Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:13:49.821Z] DB: deletePlayer - start gmtest +[2025-08-16T11:13:49.822Z] DB: deletePlayer - changes 0 gmtest +[2025-08-16T11:13:49.870Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:13:49.871Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:13:49.871Z] DB: getPlayerByName - not found gmtest +[2025-08-16T11:13:50.040Z] DB: createPlayer - start gmtest +[2025-08-16T11:13:50.040Z] DB: createPlayer - done gmtest rowid 99 +[2025-08-16T11:13:50.040Z] API: Created player gmtest +[2025-08-16T11:13:50.059Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:13:50.060Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:13:50.060Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:13:50.060Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:13:50.062Z] DB: updatePlayer - start gmtest +[2025-08-16T11:13:50.062Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T11:13:50.062Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:13:50.062Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:13:50.063Z] API: Updated player gmtest +[2025-08-16T11:13:50.079Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:13:50.079Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:13:50.079Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:13:50.079Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:13:50.160Z] DB: updatePlayer - start gmtest +[2025-08-16T11:13:50.160Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T11:13:50.160Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:13:50.160Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:13:50.160Z] API: Updated player gmtest +[2025-08-16T11:13:50.179Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:13:50.180Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:13:50.260Z] DB: createSession - start 6513e68620cde0ea4e1b3b006ae3ce5a854a5c8ccd802566c90b0bb2e194575e expiresAt 2025-08-17T11:13:50.260Z +[2025-08-16T11:13:50.261Z] DB: createSession - done 6513e68620cde0ea4e1b3b006ae3ce5a854a5c8ccd802566c90b0bb2e194575e +[2025-08-16T11:13:50.261Z] API: Player login gmtest 6513e68620cde0ea4e1b3b006ae3ce5a854a5c8ccd802566c90b0bb2e194575e +[2025-08-16T11:13:50.278Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:13:50.278Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:13:50.278Z] DB: deletePlayer - start gmtest +[2025-08-16T11:13:50.278Z] DB: deletePlayer - changes 1 gmtest +[2025-08-16T11:13:50.278Z] API: Deleted player gmtest +[2025-08-16T11:13:50.295Z] SESSION: GM bypass accepted GET /api/players +[2025-08-16T11:13:50.295Z] DB: getAllPlayers - start +[2025-08-16T11:13:50.297Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:13:50.297Z] API: Fetch all players (public) Found 7 players +[2025-08-16T11:13:50.645Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:13:50.646Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:13:50.646Z] DB: deletePlayer - start testplayer +[2025-08-16T11:13:50.646Z] DB: deletePlayer - changes 0 testplayer +[2025-08-16T11:13:50.663Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:13:50.663Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:13:50.664Z] DB: getPlayerByName - not found testplayer +[2025-08-16T11:13:50.745Z] DB: createPlayer - start testplayer +[2025-08-16T11:13:50.745Z] DB: createPlayer - done testplayer rowid 100 +[2025-08-16T11:13:50.745Z] API: Created player testplayer +[2025-08-16T11:13:50.773Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:13:50.773Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:13:50.855Z] DB: createSession - start 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d expiresAt 2025-08-17T11:13:50.855Z +[2025-08-16T11:13:50.856Z] DB: createSession - done 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d +[2025-08-16T11:13:50.856Z] API: Player login testplayer 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d +[2025-08-16T11:13:50.873Z] DB: getSession - start 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d +[2025-08-16T11:13:50.873Z] DB: getSession - ok 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d +[2025-08-16T11:13:50.873Z] SESSION: Valid 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d testplayer PUT /api/players/testplayer +[2025-08-16T11:13:50.874Z] DB: getSession - start 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d +[2025-08-16T11:13:50.874Z] DB: getSession - ok 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d +[2025-08-16T11:13:50.874Z] SESSION: Valid 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d testplayer PUT /api/players/testplayer +[2025-08-16T11:13:50.874Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:13:50.874Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:13:50.874Z] DB: updatePlayer - start testplayer +[2025-08-16T11:13:50.874Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T11:13:50.874Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:13:50.874Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:13:50.874Z] API: Updated player testplayer +[2025-08-16T11:13:50.891Z] DB: getSession - start 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d +[2025-08-16T11:13:50.891Z] DB: getSession - ok 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d +[2025-08-16T11:13:50.891Z] SESSION: Valid 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d testplayer PUT /api/players/testplayer +[2025-08-16T11:13:50.891Z] DB: getSession - start 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d +[2025-08-16T11:13:50.891Z] DB: getSession - ok 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d +[2025-08-16T11:13:50.891Z] SESSION: Valid 3bce64bb61037c9ed953f1d83629bee501f908979a688d30d83a30ee9f3e080d testplayer PUT /api/players/testplayer +[2025-08-16T11:13:50.891Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:13:50.891Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:13:50.891Z] DB: updatePlayer - start testplayer +[2025-08-16T11:13:50.892Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T11:13:50.892Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:13:50.892Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:13:50.892Z] API: Updated player testplayer +[2025-08-16T11:13:50.909Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:13:50.909Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:13:50.909Z] DB: deletePlayer - start testplayer +[2025-08-16T11:13:50.909Z] DB: deletePlayer - changes 1 testplayer +[2025-08-16T11:13:50.909Z] API: Deleted player testplayer +[2025-08-16T11:13:51.293Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:13:51.293Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:13:51.293Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T11:13:51.293Z] DB: deletePlayer - changes 0 shoptestplayer +[2025-08-16T11:13:51.308Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:13:51.309Z] DB: getPlayerByName - start shoptestplayer +[2025-08-16T11:13:51.309Z] DB: getPlayerByName - not found shoptestplayer +[2025-08-16T11:13:51.389Z] DB: createPlayer - start shoptestplayer +[2025-08-16T11:13:51.390Z] DB: createPlayer - done shoptestplayer rowid 101 +[2025-08-16T11:13:51.390Z] API: Created player shoptestplayer +[2025-08-16T11:13:51.403Z] SESSION: Missing sessionId GET /api/shop/inventory/shoptestplayer +[2025-08-16T11:13:51.416Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:13:51.416Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:13:51.417Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T11:13:51.417Z] DB: deletePlayer - changes 1 shoptestplayer +[2025-08-16T11:13:51.417Z] API: Deleted player shoptestplayer +[2025-08-16T11:13:51.932Z] DB: getAllPlayers - start +[2025-08-16T11:13:51.935Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:14:06.041Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:14:06.043Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:14:06.043Z] DB: deletePlayer - start gmtest +[2025-08-16T11:14:06.043Z] DB: deletePlayer - changes 0 gmtest +[2025-08-16T11:14:06.080Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:14:06.081Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:14:06.081Z] DB: getPlayerByName - not found gmtest +[2025-08-16T11:14:06.249Z] DB: createPlayer - start gmtest +[2025-08-16T11:14:06.280Z] DB: createPlayer - done gmtest rowid 102 +[2025-08-16T11:14:06.281Z] API: Created player gmtest +[2025-08-16T11:14:06.299Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:14:06.300Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:14:06.300Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:14:06.301Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:14:06.302Z] DB: updatePlayer - start gmtest +[2025-08-16T11:14:06.316Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T11:14:06.316Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:14:06.317Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:14:06.317Z] API: Updated player gmtest +[2025-08-16T11:14:06.334Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:14:06.334Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:14:06.334Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:14:06.334Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:14:06.416Z] DB: updatePlayer - start gmtest +[2025-08-16T11:14:06.417Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T11:14:06.417Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:14:06.417Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:14:06.417Z] API: Updated player gmtest +[2025-08-16T11:14:06.444Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:14:06.444Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:14:06.524Z] DB: createSession - start d417e0750c0991c43176847586e187a9ac69ff0eb0442f8e2774be1fd6dcf75c expiresAt 2025-08-17T11:14:06.524Z +[2025-08-16T11:14:06.524Z] DB: createSession - done d417e0750c0991c43176847586e187a9ac69ff0eb0442f8e2774be1fd6dcf75c +[2025-08-16T11:14:06.524Z] API: Player login gmtest d417e0750c0991c43176847586e187a9ac69ff0eb0442f8e2774be1fd6dcf75c +[2025-08-16T11:14:06.541Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:14:06.541Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:14:06.541Z] DB: deletePlayer - start gmtest +[2025-08-16T11:14:06.542Z] DB: deletePlayer - changes 1 gmtest +[2025-08-16T11:14:06.542Z] API: Deleted player gmtest +[2025-08-16T11:14:06.557Z] SESSION: GM bypass accepted GET /api/players +[2025-08-16T11:14:06.558Z] DB: getAllPlayers - start +[2025-08-16T11:14:06.559Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:14:06.559Z] API: Fetch all players (public) Found 7 players +[2025-08-16T11:14:06.890Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:14:06.890Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:14:06.890Z] DB: deletePlayer - start testplayer +[2025-08-16T11:14:06.890Z] DB: deletePlayer - changes 0 testplayer +[2025-08-16T11:14:06.907Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:14:06.908Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:14:06.908Z] DB: getPlayerByName - not found testplayer +[2025-08-16T11:14:06.992Z] DB: createPlayer - start testplayer +[2025-08-16T11:14:06.992Z] DB: createPlayer - done testplayer rowid 103 +[2025-08-16T11:14:06.992Z] API: Created player testplayer +[2025-08-16T11:14:07.011Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:14:07.012Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:14:07.093Z] DB: createSession - start 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 expiresAt 2025-08-17T11:14:07.093Z +[2025-08-16T11:14:07.094Z] DB: createSession - done 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 +[2025-08-16T11:14:07.094Z] API: Player login testplayer 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 +[2025-08-16T11:14:07.111Z] DB: getSession - start 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 +[2025-08-16T11:14:07.111Z] DB: getSession - ok 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 +[2025-08-16T11:14:07.111Z] SESSION: Valid 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 testplayer PUT /api/players/testplayer +[2025-08-16T11:14:07.111Z] DB: getSession - start 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 +[2025-08-16T11:14:07.111Z] DB: getSession - ok 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 +[2025-08-16T11:14:07.111Z] SESSION: Valid 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 testplayer PUT /api/players/testplayer +[2025-08-16T11:14:07.111Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:14:07.111Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:14:07.111Z] DB: updatePlayer - start testplayer +[2025-08-16T11:14:07.112Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T11:14:07.112Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:14:07.112Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:14:07.112Z] API: Updated player testplayer +[2025-08-16T11:14:07.130Z] DB: getSession - start 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 +[2025-08-16T11:14:07.130Z] DB: getSession - ok 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 +[2025-08-16T11:14:07.130Z] SESSION: Valid 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 testplayer PUT /api/players/testplayer +[2025-08-16T11:14:07.130Z] DB: getSession - start 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 +[2025-08-16T11:14:07.130Z] DB: getSession - ok 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 +[2025-08-16T11:14:07.130Z] SESSION: Valid 129b199277c66b461abc644092e47ecf3c0266a971db00f3f24cc7b7c5c73482 testplayer PUT /api/players/testplayer +[2025-08-16T11:14:07.130Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:14:07.131Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:14:07.131Z] DB: updatePlayer - start testplayer +[2025-08-16T11:14:07.131Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T11:14:07.131Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:14:07.131Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:14:07.131Z] API: Updated player testplayer +[2025-08-16T11:14:07.147Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:14:07.147Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:14:07.147Z] DB: deletePlayer - start testplayer +[2025-08-16T11:14:07.148Z] DB: deletePlayer - changes 1 testplayer +[2025-08-16T11:14:07.148Z] API: Deleted player testplayer +[2025-08-16T11:14:07.648Z] DB: getAllPlayers - start +[2025-08-16T11:14:07.651Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:14:08.036Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:14:08.036Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:14:08.036Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T11:14:08.036Z] DB: deletePlayer - changes 0 shoptestplayer +[2025-08-16T11:14:08.050Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:14:08.050Z] DB: getPlayerByName - start shoptestplayer +[2025-08-16T11:14:08.050Z] DB: getPlayerByName - not found shoptestplayer +[2025-08-16T11:14:08.130Z] DB: createPlayer - start shoptestplayer +[2025-08-16T11:14:08.131Z] DB: createPlayer - done shoptestplayer rowid 104 +[2025-08-16T11:14:08.131Z] API: Created player shoptestplayer +[2025-08-16T11:14:08.147Z] SESSION: Missing sessionId GET /api/shop/inventory/shoptestplayer +[2025-08-16T11:14:08.161Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:14:08.162Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:14:08.162Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T11:14:08.162Z] DB: deletePlayer - changes 1 shoptestplayer +[2025-08-16T11:14:08.162Z] API: Deleted player shoptestplayer +[2025-08-16T11:48:36.029Z] DB: getAllPlayers - start +[2025-08-16T11:48:36.032Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:48:39.449Z] DB: getPlayerByName - start chris +[2025-08-16T11:48:39.449Z] DB: getPlayerByName - found chris +[2025-08-16T11:48:39.621Z] DB: createSession - start 136fa7e048654da0ae9bee0b988af8621cff2290857d3babb1e925c756f2fba0 expiresAt 2025-08-17T11:48:39.621Z +[2025-08-16T11:48:39.622Z] DB: createSession - done 136fa7e048654da0ae9bee0b988af8621cff2290857d3babb1e925c756f2fba0 +[2025-08-16T11:48:39.623Z] API: Player login chris 136fa7e048654da0ae9bee0b988af8621cff2290857d3babb1e925c756f2fba0 +[2025-08-16T11:48:39.635Z] DB: getSession - start 136fa7e048654da0ae9bee0b988af8621cff2290857d3babb1e925c756f2fba0 +[2025-08-16T11:48:39.635Z] DB: getSession - ok 136fa7e048654da0ae9bee0b988af8621cff2290857d3babb1e925c756f2fba0 +[2025-08-16T11:48:39.636Z] SESSION: Validate success 136fa7e048654da0ae9bee0b988af8621cff2290857d3babb1e925c756f2fba0 chris +[2025-08-16T11:52:29.510Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:52:29.512Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:52:29.512Z] DB: deletePlayer - start gmtest +[2025-08-16T11:52:29.512Z] DB: deletePlayer - changes 0 gmtest +[2025-08-16T11:52:29.548Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:52:29.549Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:52:29.549Z] DB: getPlayerByName - not found gmtest +[2025-08-16T11:52:29.726Z] DB: createPlayer - start gmtest +[2025-08-16T11:52:29.727Z] DB: createPlayer - done gmtest rowid 105 +[2025-08-16T11:52:29.727Z] API: Created player gmtest +[2025-08-16T11:52:29.746Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:52:29.746Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:52:29.746Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:52:29.747Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:52:29.747Z] DB: updatePlayer - start gmtest +[2025-08-16T11:52:29.748Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T11:52:29.748Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:52:29.748Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:52:29.748Z] API: Updated player gmtest +[2025-08-16T11:52:29.764Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:52:29.765Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T11:52:29.765Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:52:29.765Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:52:29.845Z] DB: updatePlayer - start gmtest +[2025-08-16T11:52:29.845Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T11:52:29.845Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:52:29.846Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:52:29.846Z] API: Updated player gmtest +[2025-08-16T11:52:29.863Z] DB: getPlayerByName - start gmtest +[2025-08-16T11:52:29.863Z] DB: getPlayerByName - found gmtest +[2025-08-16T11:52:29.943Z] DB: createSession - start bdd63b0e56ae612a327ea66d64b9569d391e45ebe76615a0ab0e41754d0061bf expiresAt 2025-08-17T11:52:29.943Z +[2025-08-16T11:52:29.944Z] DB: createSession - done bdd63b0e56ae612a327ea66d64b9569d391e45ebe76615a0ab0e41754d0061bf +[2025-08-16T11:52:29.944Z] API: Player login gmtest bdd63b0e56ae612a327ea66d64b9569d391e45ebe76615a0ab0e41754d0061bf +[2025-08-16T11:52:29.960Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:52:29.961Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T11:52:29.962Z] DB: deletePlayer - start gmtest +[2025-08-16T11:52:29.962Z] DB: deletePlayer - changes 1 gmtest +[2025-08-16T11:52:29.962Z] API: Deleted player gmtest +[2025-08-16T11:52:29.988Z] SESSION: GM bypass accepted GET /api/players +[2025-08-16T11:52:29.989Z] DB: getAllPlayers - start +[2025-08-16T11:52:29.990Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:52:29.990Z] API: Fetch all players (public) Found 7 players +[2025-08-16T11:52:30.331Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:52:30.332Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:52:30.332Z] DB: deletePlayer - start testplayer +[2025-08-16T11:52:30.332Z] DB: deletePlayer - changes 0 testplayer +[2025-08-16T11:52:30.349Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:52:30.349Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:52:30.349Z] DB: getPlayerByName - not found testplayer +[2025-08-16T11:52:30.429Z] DB: createPlayer - start testplayer +[2025-08-16T11:52:30.429Z] DB: createPlayer - done testplayer rowid 106 +[2025-08-16T11:52:30.429Z] API: Created player testplayer +[2025-08-16T11:52:30.447Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:52:30.447Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:52:30.527Z] DB: createSession - start 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 expiresAt 2025-08-17T11:52:30.527Z +[2025-08-16T11:52:30.528Z] DB: createSession - done 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 +[2025-08-16T11:52:30.528Z] API: Player login testplayer 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 +[2025-08-16T11:52:30.545Z] DB: getSession - start 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 +[2025-08-16T11:52:30.545Z] DB: getSession - ok 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 +[2025-08-16T11:52:30.545Z] SESSION: Valid 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 testplayer PUT /api/players/testplayer +[2025-08-16T11:52:30.545Z] DB: getSession - start 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 +[2025-08-16T11:52:30.545Z] DB: getSession - ok 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 +[2025-08-16T11:52:30.545Z] SESSION: Valid 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 testplayer PUT /api/players/testplayer +[2025-08-16T11:52:30.545Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:52:30.545Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:52:30.546Z] DB: updatePlayer - start testplayer +[2025-08-16T11:52:30.546Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T11:52:30.546Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:52:30.546Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:52:30.547Z] API: Updated player testplayer +[2025-08-16T11:52:30.563Z] DB: getSession - start 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 +[2025-08-16T11:52:30.563Z] DB: getSession - ok 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 +[2025-08-16T11:52:30.563Z] SESSION: Valid 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 testplayer PUT /api/players/testplayer +[2025-08-16T11:52:30.563Z] DB: getSession - start 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 +[2025-08-16T11:52:30.563Z] DB: getSession - ok 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 +[2025-08-16T11:52:30.563Z] SESSION: Valid 104c2215dd9790ccf9c2af2049cb62c4577efb91a23aa403e55331591219f843 testplayer PUT /api/players/testplayer +[2025-08-16T11:52:30.563Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:52:30.563Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:52:30.564Z] DB: updatePlayer - start testplayer +[2025-08-16T11:52:30.564Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T11:52:30.564Z] DB: getPlayerByName - start testplayer +[2025-08-16T11:52:30.564Z] DB: getPlayerByName - found testplayer +[2025-08-16T11:52:30.564Z] API: Updated player testplayer +[2025-08-16T11:52:30.581Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:52:30.581Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T11:52:30.581Z] DB: deletePlayer - start testplayer +[2025-08-16T11:52:30.582Z] DB: deletePlayer - changes 1 testplayer +[2025-08-16T11:52:30.582Z] API: Deleted player testplayer +[2025-08-16T11:52:30.957Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:52:30.957Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:52:30.957Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T11:52:30.957Z] DB: deletePlayer - changes 0 shoptestplayer +[2025-08-16T11:52:30.971Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T11:52:30.971Z] DB: getPlayerByName - start shoptestplayer +[2025-08-16T11:52:30.971Z] DB: getPlayerByName - not found shoptestplayer +[2025-08-16T11:52:31.050Z] DB: createPlayer - start shoptestplayer +[2025-08-16T11:52:31.051Z] DB: createPlayer - done shoptestplayer rowid 107 +[2025-08-16T11:52:31.051Z] API: Created player shoptestplayer +[2025-08-16T11:52:31.064Z] SESSION: Missing sessionId GET /api/shop/inventory/shoptestplayer +[2025-08-16T11:52:31.078Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:52:31.078Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T11:52:31.078Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T11:52:31.078Z] DB: deletePlayer - changes 1 shoptestplayer +[2025-08-16T11:52:31.078Z] API: Deleted player shoptestplayer +[2025-08-16T11:52:31.555Z] DB: getAllPlayers - start +[2025-08-16T11:52:31.557Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T11:54:39.307Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T12:14:07.561Z] DB: getAllPlayers - start +[2025-08-16T12:14:07.563Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T12:14:10.433Z] DB: getPlayerByName - start chris +[2025-08-16T12:14:10.433Z] DB: getPlayerByName - found chris +[2025-08-16T12:14:10.613Z] DB: createSession - start c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f expiresAt 2025-08-17T12:14:10.613Z +[2025-08-16T12:14:10.614Z] DB: createSession - done c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f +[2025-08-16T12:14:10.614Z] API: Player login chris c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f +[2025-08-16T12:14:10.668Z] DB: getSession - start c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f +[2025-08-16T12:14:10.668Z] DB: getSession - ok c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f +[2025-08-16T12:14:10.668Z] SESSION: Validate success c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f chris +[2025-08-16T12:15:34.212Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T12:15:34.228Z] DB: getAllPlayers - start +[2025-08-16T12:15:34.229Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T12:16:57.570Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:16:57.572Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:16:57.572Z] DB: deletePlayer - start gmtest +[2025-08-16T12:16:57.572Z] DB: deletePlayer - changes 0 gmtest +[2025-08-16T12:16:57.619Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:16:57.620Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:16:57.621Z] DB: getPlayerByName - not found gmtest +[2025-08-16T12:16:57.791Z] DB: createPlayer - start gmtest +[2025-08-16T12:16:57.792Z] DB: createPlayer - done gmtest rowid 108 +[2025-08-16T12:16:57.792Z] API: Created player gmtest +[2025-08-16T12:16:57.811Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:16:57.811Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:16:57.812Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:16:57.812Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:16:57.813Z] DB: updatePlayer - start gmtest +[2025-08-16T12:16:57.814Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T12:16:57.814Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:16:57.814Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:16:57.814Z] API: Updated player gmtest +[2025-08-16T12:16:57.830Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:16:57.830Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:16:57.830Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:16:57.830Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:16:57.911Z] DB: updatePlayer - start gmtest +[2025-08-16T12:16:57.911Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T12:16:57.911Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:16:57.911Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:16:57.911Z] API: Updated player gmtest +[2025-08-16T12:16:57.927Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:16:57.927Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:16:58.007Z] DB: createSession - start a31c4eebf90ecd0554c153186047fc61796ccb98c5cd399e86fe9623654350ea expiresAt 2025-08-17T12:16:58.007Z +[2025-08-16T12:16:58.008Z] DB: createSession - done a31c4eebf90ecd0554c153186047fc61796ccb98c5cd399e86fe9623654350ea +[2025-08-16T12:16:58.008Z] API: Player login gmtest a31c4eebf90ecd0554c153186047fc61796ccb98c5cd399e86fe9623654350ea +[2025-08-16T12:16:58.025Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:16:58.025Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:16:58.025Z] DB: deletePlayer - start gmtest +[2025-08-16T12:16:58.026Z] DB: deletePlayer - changes 1 gmtest +[2025-08-16T12:16:58.026Z] API: Deleted player gmtest +[2025-08-16T12:16:58.041Z] SESSION: GM bypass accepted GET /api/players +[2025-08-16T12:16:58.042Z] DB: getAllPlayers - start +[2025-08-16T12:16:58.043Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T12:16:58.043Z] API: Fetch all players (public) Found 7 players +[2025-08-16T12:16:58.406Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:16:58.406Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:16:58.406Z] DB: deletePlayer - start testplayer +[2025-08-16T12:16:58.406Z] DB: deletePlayer - changes 0 testplayer +[2025-08-16T12:16:58.423Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:16:58.424Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:16:58.424Z] DB: getPlayerByName - not found testplayer +[2025-08-16T12:16:58.504Z] DB: createPlayer - start testplayer +[2025-08-16T12:16:58.505Z] DB: createPlayer - done testplayer rowid 109 +[2025-08-16T12:16:58.506Z] API: Created player testplayer +[2025-08-16T12:16:58.534Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:16:58.535Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:16:58.616Z] DB: createSession - start f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 expiresAt 2025-08-17T12:16:58.616Z +[2025-08-16T12:16:58.616Z] DB: createSession - done f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 +[2025-08-16T12:16:58.616Z] API: Player login testplayer f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 +[2025-08-16T12:16:58.634Z] DB: getSession - start f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 +[2025-08-16T12:16:58.634Z] DB: getSession - ok f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 +[2025-08-16T12:16:58.634Z] SESSION: Valid f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 testplayer PUT /api/players/testplayer +[2025-08-16T12:16:58.634Z] DB: getSession - start f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 +[2025-08-16T12:16:58.634Z] DB: getSession - ok f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 +[2025-08-16T12:16:58.634Z] SESSION: Valid f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 testplayer PUT /api/players/testplayer +[2025-08-16T12:16:58.634Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:16:58.634Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:16:58.635Z] DB: updatePlayer - start testplayer +[2025-08-16T12:16:58.635Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T12:16:58.635Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:16:58.635Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:16:58.635Z] API: Updated player testplayer +[2025-08-16T12:16:58.652Z] DB: getSession - start f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 +[2025-08-16T12:16:58.653Z] DB: getSession - ok f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 +[2025-08-16T12:16:58.653Z] SESSION: Valid f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 testplayer PUT /api/players/testplayer +[2025-08-16T12:16:58.653Z] DB: getSession - start f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 +[2025-08-16T12:16:58.653Z] DB: getSession - ok f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 +[2025-08-16T12:16:58.653Z] SESSION: Valid f1bf14dab2c9d0a135e3ec7ee0ba28ebdf1d02299b5c74483a60f5cf35e2e282 testplayer PUT /api/players/testplayer +[2025-08-16T12:16:58.653Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:16:58.653Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:16:58.653Z] DB: updatePlayer - start testplayer +[2025-08-16T12:16:58.654Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T12:16:58.654Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:16:58.654Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:16:58.654Z] API: Updated player testplayer +[2025-08-16T12:16:58.670Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:16:58.670Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:16:58.670Z] DB: deletePlayer - start testplayer +[2025-08-16T12:16:58.672Z] DB: deletePlayer - changes 1 testplayer +[2025-08-16T12:16:58.672Z] API: Deleted player testplayer +[2025-08-16T12:16:59.168Z] DB: getAllPlayers - start +[2025-08-16T12:16:59.170Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T12:16:59.557Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:16:59.558Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:16:59.558Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T12:16:59.558Z] DB: deletePlayer - changes 0 shoptestplayer +[2025-08-16T12:16:59.572Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:16:59.572Z] DB: getPlayerByName - start shoptestplayer +[2025-08-16T12:16:59.572Z] DB: getPlayerByName - not found shoptestplayer +[2025-08-16T12:16:59.652Z] DB: createPlayer - start shoptestplayer +[2025-08-16T12:16:59.652Z] DB: createPlayer - done shoptestplayer rowid 110 +[2025-08-16T12:16:59.652Z] API: Created player shoptestplayer +[2025-08-16T12:16:59.667Z] SESSION: Missing sessionId GET /api/shop/inventory/shoptestplayer +[2025-08-16T12:16:59.679Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:16:59.680Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:16:59.680Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T12:16:59.680Z] DB: deletePlayer - changes 1 shoptestplayer +[2025-08-16T12:16:59.680Z] API: Deleted player shoptestplayer +[2025-08-16T12:20:28.034Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:20:28.035Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:20:28.036Z] DB: deletePlayer - start gmtest +[2025-08-16T12:20:28.036Z] DB: deletePlayer - changes 0 gmtest +[2025-08-16T12:20:28.072Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:20:28.072Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:20:28.073Z] DB: getPlayerByName - not found gmtest +[2025-08-16T12:20:28.238Z] DB: createPlayer - start gmtest +[2025-08-16T12:20:28.238Z] DB: createPlayer - done gmtest rowid 111 +[2025-08-16T12:20:28.239Z] API: Created player gmtest +[2025-08-16T12:20:28.260Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:20:28.261Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:20:28.261Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:20:28.261Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:20:28.262Z] DB: updatePlayer - start gmtest +[2025-08-16T12:20:28.262Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T12:20:28.263Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:20:28.263Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:20:28.263Z] API: Updated player gmtest +[2025-08-16T12:20:28.279Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:20:28.279Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:20:28.280Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:20:28.280Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:20:28.360Z] DB: updatePlayer - start gmtest +[2025-08-16T12:20:28.360Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T12:20:28.360Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:20:28.360Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:20:28.360Z] API: Updated player gmtest +[2025-08-16T12:20:28.377Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:20:28.377Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:20:28.457Z] DB: createSession - start a05f3b20f65da484ec880a27a92622061b0b3a0d9c8064d3e6d8a5f8ce0ff84f expiresAt 2025-08-17T12:20:28.457Z +[2025-08-16T12:20:28.458Z] DB: createSession - done a05f3b20f65da484ec880a27a92622061b0b3a0d9c8064d3e6d8a5f8ce0ff84f +[2025-08-16T12:20:28.458Z] API: Player login gmtest a05f3b20f65da484ec880a27a92622061b0b3a0d9c8064d3e6d8a5f8ce0ff84f +[2025-08-16T12:20:28.475Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:20:28.475Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:20:28.475Z] DB: deletePlayer - start gmtest +[2025-08-16T12:20:28.476Z] DB: deletePlayer - changes 1 gmtest +[2025-08-16T12:20:28.476Z] API: Deleted player gmtest +[2025-08-16T12:20:28.490Z] SESSION: GM bypass accepted GET /api/players +[2025-08-16T12:20:28.491Z] DB: getAllPlayers - start +[2025-08-16T12:20:28.492Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T12:20:28.492Z] API: Fetch all players (public) Found 7 players +[2025-08-16T12:20:28.845Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:20:28.846Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:20:28.846Z] DB: deletePlayer - start testplayer +[2025-08-16T12:20:28.846Z] DB: deletePlayer - changes 0 testplayer +[2025-08-16T12:20:28.865Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:20:28.865Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:20:28.865Z] DB: getPlayerByName - not found testplayer +[2025-08-16T12:20:28.948Z] DB: createPlayer - start testplayer +[2025-08-16T12:20:28.949Z] DB: createPlayer - done testplayer rowid 112 +[2025-08-16T12:20:28.949Z] API: Created player testplayer +[2025-08-16T12:20:28.968Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:20:28.968Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:20:29.049Z] DB: createSession - start 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb expiresAt 2025-08-17T12:20:29.049Z +[2025-08-16T12:20:29.087Z] DB: createSession - done 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb +[2025-08-16T12:20:29.087Z] API: Player login testplayer 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb +[2025-08-16T12:20:29.105Z] DB: getSession - start 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb +[2025-08-16T12:20:29.105Z] DB: getSession - ok 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb +[2025-08-16T12:20:29.106Z] SESSION: Valid 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb testplayer PUT /api/players/testplayer +[2025-08-16T12:20:29.106Z] DB: getSession - start 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb +[2025-08-16T12:20:29.106Z] DB: getSession - ok 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb +[2025-08-16T12:20:29.106Z] SESSION: Valid 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb testplayer PUT /api/players/testplayer +[2025-08-16T12:20:29.106Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:20:29.106Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:20:29.107Z] DB: updatePlayer - start testplayer +[2025-08-16T12:20:29.107Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T12:20:29.107Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:20:29.107Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:20:29.107Z] API: Updated player testplayer +[2025-08-16T12:20:29.124Z] DB: getSession - start 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb +[2025-08-16T12:20:29.124Z] DB: getSession - ok 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb +[2025-08-16T12:20:29.124Z] SESSION: Valid 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb testplayer PUT /api/players/testplayer +[2025-08-16T12:20:29.124Z] DB: getSession - start 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb +[2025-08-16T12:20:29.124Z] DB: getSession - ok 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb +[2025-08-16T12:20:29.124Z] SESSION: Valid 091d5e839225c114b01b728452a37cf0adecb20ca5d001eef74301c1171b68fb testplayer PUT /api/players/testplayer +[2025-08-16T12:20:29.124Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:20:29.124Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:20:29.125Z] DB: updatePlayer - start testplayer +[2025-08-16T12:20:29.125Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T12:20:29.125Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:20:29.125Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:20:29.125Z] API: Updated player testplayer +[2025-08-16T12:20:29.142Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:20:29.142Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:20:29.142Z] DB: deletePlayer - start testplayer +[2025-08-16T12:20:29.143Z] DB: deletePlayer - changes 1 testplayer +[2025-08-16T12:20:29.143Z] API: Deleted player testplayer +[2025-08-16T12:20:29.658Z] DB: getAllPlayers - start +[2025-08-16T12:20:29.660Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T12:20:30.052Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:20:30.052Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:20:30.052Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T12:20:30.052Z] DB: deletePlayer - changes 0 shoptestplayer +[2025-08-16T12:20:30.067Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:20:30.067Z] DB: getPlayerByName - start shoptestplayer +[2025-08-16T12:20:30.067Z] DB: getPlayerByName - not found shoptestplayer +[2025-08-16T12:20:30.148Z] DB: createPlayer - start shoptestplayer +[2025-08-16T12:20:30.148Z] DB: createPlayer - done shoptestplayer rowid 113 +[2025-08-16T12:20:30.148Z] API: Created player shoptestplayer +[2025-08-16T12:20:30.162Z] SESSION: Missing sessionId GET /api/shop/inventory/shoptestplayer +[2025-08-16T12:20:30.175Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:20:30.175Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:20:30.175Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T12:20:30.176Z] DB: deletePlayer - changes 1 shoptestplayer +[2025-08-16T12:20:30.176Z] API: Deleted player shoptestplayer +[2025-08-16T12:23:25.786Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:23:25.786Z] DB: getPlayerByName - not found testplayer +[2025-08-16T12:23:42.594Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:23:42.595Z] DB: getPlayerByName - not found testplayer +[2025-08-16T12:23:53.086Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:23:53.086Z] DB: getPlayerByName - not found testplayer +[2025-08-16T12:24:09.345Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:24:09.347Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:24:09.348Z] DB: getPlayerByName - not found testplayer +[2025-08-16T12:24:09.550Z] DB: createPlayer - start testplayer +[2025-08-16T12:24:09.551Z] DB: createPlayer - done testplayer rowid 114 +[2025-08-16T12:24:09.551Z] API: Created player testplayer +[2025-08-16T12:24:09.575Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:24:09.576Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:24:09.656Z] DB: createSession - start 738af3333406729b184d4fd052b7dfda7aa7247ae2dd6eb33f0a9679fd76cb62 expiresAt 2025-08-17T12:24:09.656Z +[2025-08-16T12:24:09.658Z] DB: createSession - done 738af3333406729b184d4fd052b7dfda7aa7247ae2dd6eb33f0a9679fd76cb62 +[2025-08-16T12:24:09.658Z] API: Player login testplayer 738af3333406729b184d4fd052b7dfda7aa7247ae2dd6eb33f0a9679fd76cb62 +[2025-08-16T12:24:09.723Z] DB: getSession - start 738af3333406729b184d4fd052b7dfda7aa7247ae2dd6eb33f0a9679fd76cb62 +[2025-08-16T12:24:09.723Z] DB: getSession - ok 738af3333406729b184d4fd052b7dfda7aa7247ae2dd6eb33f0a9679fd76cb62 +[2025-08-16T12:24:09.723Z] SESSION: Valid 738af3333406729b184d4fd052b7dfda7aa7247ae2dd6eb33f0a9679fd76cb62 testplayer GET /api/players +[2025-08-16T12:24:09.724Z] DB: getAllPlayers - start +[2025-08-16T12:24:09.726Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:24:09.726Z] API: Fetch all players (public) Found 8 players +[2025-08-16T12:24:09.828Z] DB: getAllPlayers - start +[2025-08-16T12:24:09.829Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:24:58.333Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:24:58.335Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:24:58.335Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:24:58.370Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:24:58.370Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:24:58.542Z] DB: createSession - start 99d7fbc95b381a190360bdbd4c1627980e5aafa29e02aa51f62380a432d3eeaa expiresAt 2025-08-17T12:24:58.542Z +[2025-08-16T12:24:58.543Z] DB: createSession - done 99d7fbc95b381a190360bdbd4c1627980e5aafa29e02aa51f62380a432d3eeaa +[2025-08-16T12:24:58.543Z] API: Player login testplayer 99d7fbc95b381a190360bdbd4c1627980e5aafa29e02aa51f62380a432d3eeaa +[2025-08-16T12:24:58.628Z] DB: getSession - start 99d7fbc95b381a190360bdbd4c1627980e5aafa29e02aa51f62380a432d3eeaa +[2025-08-16T12:24:58.629Z] DB: getSession - ok 99d7fbc95b381a190360bdbd4c1627980e5aafa29e02aa51f62380a432d3eeaa +[2025-08-16T12:24:58.629Z] SESSION: Valid 99d7fbc95b381a190360bdbd4c1627980e5aafa29e02aa51f62380a432d3eeaa testplayer GET /api/players +[2025-08-16T12:24:58.630Z] DB: getAllPlayers - start +[2025-08-16T12:24:58.631Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:24:58.632Z] API: Fetch all players (public) Found 8 players +[2025-08-16T12:24:58.724Z] DB: getAllPlayers - start +[2025-08-16T12:24:58.725Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:25:14.621Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:25:14.622Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:25:14.623Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:25:14.660Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:25:14.661Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:25:14.833Z] DB: createSession - start 354579339a3187eac16ea9852fa35c0dc99563eff10ccbe46c4843eb929641eb expiresAt 2025-08-17T12:25:14.833Z +[2025-08-16T12:25:14.834Z] DB: createSession - done 354579339a3187eac16ea9852fa35c0dc99563eff10ccbe46c4843eb929641eb +[2025-08-16T12:25:14.834Z] API: Player login testplayer 354579339a3187eac16ea9852fa35c0dc99563eff10ccbe46c4843eb929641eb +[2025-08-16T12:25:14.916Z] DB: getSession - start 354579339a3187eac16ea9852fa35c0dc99563eff10ccbe46c4843eb929641eb +[2025-08-16T12:25:14.917Z] DB: getSession - ok 354579339a3187eac16ea9852fa35c0dc99563eff10ccbe46c4843eb929641eb +[2025-08-16T12:25:14.917Z] SESSION: Valid 354579339a3187eac16ea9852fa35c0dc99563eff10ccbe46c4843eb929641eb testplayer GET /api/players +[2025-08-16T12:25:14.918Z] DB: getAllPlayers - start +[2025-08-16T12:25:14.920Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:25:14.920Z] API: Fetch all players (public) Found 8 players +[2025-08-16T12:25:15.027Z] DB: getAllPlayers - start +[2025-08-16T12:25:15.028Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:25:22.481Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:25:22.483Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:25:22.483Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:25:22.513Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:25:22.514Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:25:22.689Z] DB: createSession - start f38cc5264cc1da0088e4206bf63ebeceb24b0dbe048a83260467b06e384b073b expiresAt 2025-08-17T12:25:22.689Z +[2025-08-16T12:25:22.690Z] DB: createSession - done f38cc5264cc1da0088e4206bf63ebeceb24b0dbe048a83260467b06e384b073b +[2025-08-16T12:25:22.690Z] API: Player login testplayer f38cc5264cc1da0088e4206bf63ebeceb24b0dbe048a83260467b06e384b073b +[2025-08-16T12:25:41.766Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:25:41.768Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:25:41.768Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:25:41.803Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:25:41.803Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:25:41.969Z] DB: createSession - start 2eb49a82819f12c3e940693d1ad68c0533de2cfcb443d28f9b7aade1833b6ea2 expiresAt 2025-08-17T12:25:41.969Z +[2025-08-16T12:25:41.969Z] DB: createSession - done 2eb49a82819f12c3e940693d1ad68c0533de2cfcb443d28f9b7aade1833b6ea2 +[2025-08-16T12:25:41.969Z] API: Player login testplayer 2eb49a82819f12c3e940693d1ad68c0533de2cfcb443d28f9b7aade1833b6ea2 +[2025-08-16T12:25:42.056Z] DB: getAllPlayers - start +[2025-08-16T12:25:42.058Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:26:04.869Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:26:04.870Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:26:04.871Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:26:04.905Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:26:04.905Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:26:05.076Z] DB: createSession - start 9ce61036e2e1e63c80991738ecf3618d75561366c5147ef557b7f45a820f965d expiresAt 2025-08-17T12:26:05.076Z +[2025-08-16T12:26:05.078Z] DB: createSession - done 9ce61036e2e1e63c80991738ecf3618d75561366c5147ef557b7f45a820f965d +[2025-08-16T12:26:05.078Z] API: Player login testplayer 9ce61036e2e1e63c80991738ecf3618d75561366c5147ef557b7f45a820f965d +[2025-08-16T12:26:05.157Z] DB: getAllPlayers - start +[2025-08-16T12:26:05.159Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:26:25.171Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:26:25.174Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:26:25.174Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:26:42.098Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:26:42.098Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:26:42.293Z] DB: createSession - start b99ddcf98c9c1a862008b148e4653d06eb7ea187e93d7d196f2161651a384c9e expiresAt 2025-08-17T12:26:42.293Z +[2025-08-16T12:26:42.295Z] DB: createSession - done b99ddcf98c9c1a862008b148e4653d06eb7ea187e93d7d196f2161651a384c9e +[2025-08-16T12:26:42.295Z] API: Player login testplayer b99ddcf98c9c1a862008b148e4653d06eb7ea187e93d7d196f2161651a384c9e +[2025-08-16T12:26:50.086Z] DB: getSession - start b99ddcf98c9c1a862008b148e4653d06eb7ea187e93d7d196f2161651a384c9e +[2025-08-16T12:26:50.086Z] DB: getSession - ok b99ddcf98c9c1a862008b148e4653d06eb7ea187e93d7d196f2161651a384c9e +[2025-08-16T12:26:50.087Z] SESSION: Valid b99ddcf98c9c1a862008b148e4653d06eb7ea187e93d7d196f2161651a384c9e testplayer GET /api/players +[2025-08-16T12:26:50.088Z] DB: getAllPlayers - start +[2025-08-16T12:26:50.090Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:26:50.090Z] API: Fetch all players (public) Found 8 players +[2025-08-16T12:27:21.315Z] DB: getSession - start c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f +[2025-08-16T12:27:21.316Z] DB: getSession - ok c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f +[2025-08-16T12:27:21.316Z] SESSION: Validate success c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f chris +[2025-08-16T12:27:24.240Z] DB: deleteSession - start c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f +[2025-08-16T12:27:24.241Z] DB: deleteSession - changes 1 c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f +[2025-08-16T12:27:24.242Z] SESSION: Logout success c36d64f88e4f0aa7226f51b1810c3b686a936e42c419252a98c3869c757f1b2f +[2025-08-16T12:27:28.758Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T12:27:31.782Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T12:27:34.942Z] DB: getAllPlayers - start +[2025-08-16T12:27:34.943Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:27:38.395Z] DB: getPlayerByName - start phillip +[2025-08-16T12:27:38.395Z] DB: getPlayerByName - found phillip +[2025-08-16T12:27:38.476Z] DB: createSession - start 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 expiresAt 2025-08-17T12:27:38.476Z +[2025-08-16T12:27:38.478Z] DB: createSession - done 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 +[2025-08-16T12:27:38.478Z] API: Player login phillip 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 +[2025-08-16T12:27:38.516Z] DB: getSession - start 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 +[2025-08-16T12:27:38.517Z] DB: getSession - ok 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 +[2025-08-16T12:27:38.517Z] SESSION: Validate success 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 phillip +[2025-08-16T12:27:38.519Z] DB: getSession - start 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 +[2025-08-16T12:27:38.519Z] DB: getSession - ok 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 +[2025-08-16T12:27:38.519Z] SESSION: Valid 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 phillip GET /api/players +[2025-08-16T12:27:38.519Z] DB: getAllPlayers - start +[2025-08-16T12:27:38.520Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:27:38.520Z] API: Fetch all players (public) Found 8 players +[2025-08-16T12:28:03.188Z] DB: deleteSession - start 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 +[2025-08-16T12:28:03.189Z] DB: deleteSession - changes 1 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 +[2025-08-16T12:28:03.190Z] SESSION: Logout success 1e7cae3d1c40bd9f1fff8cc9d1cb8c21a3bad85abe3721a7a55a389fe70924f1 +[2025-08-16T12:28:03.230Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T12:28:07.078Z] DB: getPlayerByName - start anders +[2025-08-16T12:28:07.078Z] DB: getPlayerByName - found anders +[2025-08-16T12:28:07.158Z] DB: createSession - start 4caa0278088f75e524412f7d79d511363f65bd5e4fec30e20ede58deeefb4e4d expiresAt 2025-08-17T12:28:07.158Z +[2025-08-16T12:28:07.158Z] DB: createSession - done 4caa0278088f75e524412f7d79d511363f65bd5e4fec30e20ede58deeefb4e4d +[2025-08-16T12:28:07.158Z] API: Player login anders 4caa0278088f75e524412f7d79d511363f65bd5e4fec30e20ede58deeefb4e4d +[2025-08-16T12:28:07.213Z] DB: getSession - start 4caa0278088f75e524412f7d79d511363f65bd5e4fec30e20ede58deeefb4e4d +[2025-08-16T12:28:07.213Z] DB: getSession - ok 4caa0278088f75e524412f7d79d511363f65bd5e4fec30e20ede58deeefb4e4d +[2025-08-16T12:28:07.213Z] SESSION: Validate success 4caa0278088f75e524412f7d79d511363f65bd5e4fec30e20ede58deeefb4e4d anders +[2025-08-16T12:28:14.961Z] DB: deleteSession - start 4caa0278088f75e524412f7d79d511363f65bd5e4fec30e20ede58deeefb4e4d +[2025-08-16T12:28:14.963Z] DB: deleteSession - changes 1 4caa0278088f75e524412f7d79d511363f65bd5e4fec30e20ede58deeefb4e4d +[2025-08-16T12:28:14.963Z] SESSION: Logout success 4caa0278088f75e524412f7d79d511363f65bd5e4fec30e20ede58deeefb4e4d +[2025-08-16T12:28:15.008Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T12:33:43.484Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:33:43.484Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:33:43.593Z] DB: createSession - start 0621e57d463c2951f4fcee3badcf674aeb2fc3ca588a1a9894eb5a74583ff7ed expiresAt 2025-08-17T12:33:43.593Z +[2025-08-16T12:33:43.594Z] DB: createSession - done 0621e57d463c2951f4fcee3badcf674aeb2fc3ca588a1a9894eb5a74583ff7ed +[2025-08-16T12:33:43.594Z] API: Player login testplayer 0621e57d463c2951f4fcee3badcf674aeb2fc3ca588a1a9894eb5a74583ff7ed +[2025-08-16T12:34:00.650Z] DB: getSession - start 0621e57d463c2951f4fcee3badcf674aeb2fc3ca588a1a9894eb5a74583ff7ed +[2025-08-16T12:34:00.650Z] DB: getSession - ok 0621e57d463c2951f4fcee3badcf674aeb2fc3ca588a1a9894eb5a74583ff7ed +[2025-08-16T12:34:00.651Z] SESSION: Valid 0621e57d463c2951f4fcee3badcf674aeb2fc3ca588a1a9894eb5a74583ff7ed testplayer GET /api/players +[2025-08-16T12:34:00.651Z] DB: getAllPlayers - start +[2025-08-16T12:34:00.652Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:34:00.652Z] API: Fetch all players (public) Found 8 players +[2025-08-16T12:34:13.700Z] DB: getSession - start 0621e57d463c2951f4fcee3badcf674aeb2fc3ca588a1a9894eb5a74583ff7ed +[2025-08-16T12:34:13.700Z] DB: getSession - ok 0621e57d463c2951f4fcee3badcf674aeb2fc3ca588a1a9894eb5a74583ff7ed +[2025-08-16T12:34:13.700Z] SESSION: Valid 0621e57d463c2951f4fcee3badcf674aeb2fc3ca588a1a9894eb5a74583ff7ed testplayer GET /api/players/anders +[2025-08-16T12:34:13.701Z] DB: getPlayerByName - start anders +[2025-08-16T12:34:13.702Z] DB: getPlayerByName - found anders +[2025-08-16T12:34:13.702Z] API: Fetch player anders +[2025-08-16T12:34:46.603Z] DB: getAllPlayers - start +[2025-08-16T12:34:46.604Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:34:50.282Z] DB: getPlayerByName - start christoffer +[2025-08-16T12:34:50.282Z] DB: getPlayerByName - found christoffer +[2025-08-16T12:34:50.386Z] DB: createSession - start 91e121d9a863d97489a7c1c7761dcacd71db331c830319ffa41346b6b50b02b4 expiresAt 2025-08-17T12:34:50.386Z +[2025-08-16T12:34:50.388Z] DB: createSession - done 91e121d9a863d97489a7c1c7761dcacd71db331c830319ffa41346b6b50b02b4 +[2025-08-16T12:34:50.388Z] API: Player login christoffer 91e121d9a863d97489a7c1c7761dcacd71db331c830319ffa41346b6b50b02b4 +[2025-08-16T12:34:50.435Z] DB: getSession - start 91e121d9a863d97489a7c1c7761dcacd71db331c830319ffa41346b6b50b02b4 +[2025-08-16T12:34:50.435Z] DB: getSession - ok 91e121d9a863d97489a7c1c7761dcacd71db331c830319ffa41346b6b50b02b4 +[2025-08-16T12:34:50.435Z] SESSION: Validate success 91e121d9a863d97489a7c1c7761dcacd71db331c830319ffa41346b6b50b02b4 christoffer +[2025-08-16T12:35:00.384Z] DB: deleteSession - start 91e121d9a863d97489a7c1c7761dcacd71db331c830319ffa41346b6b50b02b4 +[2025-08-16T12:35:00.384Z] DB: deleteSession - changes 1 91e121d9a863d97489a7c1c7761dcacd71db331c830319ffa41346b6b50b02b4 +[2025-08-16T12:35:00.384Z] SESSION: Logout success 91e121d9a863d97489a7c1c7761dcacd71db331c830319ffa41346b6b50b02b4 +[2025-08-16T12:35:00.438Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T12:35:10.435Z] DB: getPlayerByName - start claes +[2025-08-16T12:35:10.436Z] DB: getPlayerByName - found claes +[2025-08-16T12:35:10.515Z] DB: createSession - start 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 expiresAt 2025-08-17T12:35:10.515Z +[2025-08-16T12:35:10.516Z] DB: createSession - done 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:35:10.516Z] API: Player login claes 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:35:10.553Z] DB: getSession - start 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:35:10.553Z] DB: getSession - ok 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:35:10.553Z] SESSION: Valid 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 claes GET /api/players +[2025-08-16T12:35:10.553Z] DB: getAllPlayers - start +[2025-08-16T12:35:10.554Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:35:10.554Z] API: Fetch all players (public) Found 8 players +[2025-08-16T12:35:10.561Z] DB: getSession - start 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:35:10.561Z] DB: getSession - ok 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:35:10.561Z] SESSION: Validate success 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 claes +[2025-08-16T12:41:47.684Z] DB: getSession - start 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:41:47.684Z] DB: getSession - ok 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:41:47.684Z] SESSION: Validate success 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 claes +[2025-08-16T12:45:22.358Z] DB: getSession - start 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:45:22.358Z] DB: getSession - ok 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:45:22.359Z] SESSION: Valid 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 claes GET /api/players +[2025-08-16T12:45:22.359Z] DB: getAllPlayers - start +[2025-08-16T12:45:22.359Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:45:22.359Z] API: Fetch all players (public) Found 8 players +[2025-08-16T12:45:29.081Z] DB: getSession - start 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:45:29.082Z] DB: getSession - ok 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:45:29.082Z] SESSION: Validate success 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 claes +[2025-08-16T12:45:30.290Z] DB: deleteSession - start 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:45:30.292Z] DB: deleteSession - changes 1 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:45:30.292Z] SESSION: Logout success 64fd4ca6b72775c9c30fbea0043ec7fb3359aed74aa0464141a26a51eeb37067 +[2025-08-16T12:45:32.183Z] DB: getAllPlayers - start +[2025-08-16T12:45:32.184Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:45:34.981Z] DB: getPlayerByName - start chris +[2025-08-16T12:45:34.982Z] DB: getPlayerByName - found chris +[2025-08-16T12:45:35.061Z] DB: createSession - start 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc expiresAt 2025-08-17T12:45:35.061Z +[2025-08-16T12:45:35.061Z] DB: createSession - done 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc +[2025-08-16T12:45:35.061Z] API: Player login chris 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc +[2025-08-16T12:45:35.103Z] DB: getSession - start 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc +[2025-08-16T12:45:35.103Z] DB: getSession - ok 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc +[2025-08-16T12:45:35.103Z] SESSION: Validate success 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc chris +[2025-08-16T12:49:41.809Z] DB: getSession - start 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc +[2025-08-16T12:49:41.809Z] DB: getSession - ok 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc +[2025-08-16T12:49:41.809Z] SESSION: Validate success 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc chris +[2025-08-16T12:49:49.106Z] DB: deleteSession - start 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc +[2025-08-16T12:49:49.109Z] DB: deleteSession - changes 1 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc +[2025-08-16T12:49:49.109Z] SESSION: Logout success 529d346fab4d363afe03a93a4ae61500c554ee5bf41a446fed93d9b142ea9ffc +[2025-08-16T12:49:49.146Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T12:49:51.096Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T12:49:52.463Z] DB: getAllPlayers - start +[2025-08-16T12:49:52.465Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:49:54.883Z] DB: getPlayerByName - start phillip +[2025-08-16T12:49:54.884Z] DB: getPlayerByName - found phillip +[2025-08-16T12:49:55.002Z] DB: createSession - start b97bb9a91f39155af22721889d4d5f8f4d43c24b129286e628d7d272b7d13261 expiresAt 2025-08-17T12:49:55.002Z +[2025-08-16T12:49:55.002Z] DB: createSession - done b97bb9a91f39155af22721889d4d5f8f4d43c24b129286e628d7d272b7d13261 +[2025-08-16T12:49:55.002Z] API: Player login phillip b97bb9a91f39155af22721889d4d5f8f4d43c24b129286e628d7d272b7d13261 +[2025-08-16T12:49:55.082Z] DB: getSession - start b97bb9a91f39155af22721889d4d5f8f4d43c24b129286e628d7d272b7d13261 +[2025-08-16T12:49:55.083Z] DB: getSession - ok b97bb9a91f39155af22721889d4d5f8f4d43c24b129286e628d7d272b7d13261 +[2025-08-16T12:49:55.083Z] SESSION: Validate success b97bb9a91f39155af22721889d4d5f8f4d43c24b129286e628d7d272b7d13261 phillip +[2025-08-16T12:54:02.298Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:54:02.299Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:54:02.300Z] DB: deletePlayer - start gmtest +[2025-08-16T12:54:02.300Z] DB: deletePlayer - changes 0 gmtest +[2025-08-16T12:54:02.347Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:54:02.348Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:54:02.348Z] DB: getPlayerByName - not found gmtest +[2025-08-16T12:54:02.522Z] DB: createPlayer - start gmtest +[2025-08-16T12:54:02.524Z] DB: createPlayer - done gmtest rowid 115 +[2025-08-16T12:54:02.525Z] API: Created player gmtest +[2025-08-16T12:54:02.544Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:54:02.545Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:54:02.545Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:54:02.545Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:54:02.546Z] DB: updatePlayer - start gmtest +[2025-08-16T12:54:02.546Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T12:54:02.547Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:54:02.547Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:54:02.547Z] API: Updated player gmtest +[2025-08-16T12:54:02.563Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:54:02.563Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T12:54:02.563Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:54:02.563Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:54:02.646Z] DB: updatePlayer - start gmtest +[2025-08-16T12:54:02.646Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T12:54:02.646Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:54:02.646Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:54:02.647Z] API: Updated player gmtest +[2025-08-16T12:54:02.663Z] DB: getPlayerByName - start gmtest +[2025-08-16T12:54:02.663Z] DB: getPlayerByName - found gmtest +[2025-08-16T12:54:02.744Z] DB: createSession - start 421c52f153fed049efa53d27ee53e9175da2856fea9bf53d46aa624453a22d85 expiresAt 2025-08-17T12:54:02.744Z +[2025-08-16T12:54:02.744Z] DB: createSession - done 421c52f153fed049efa53d27ee53e9175da2856fea9bf53d46aa624453a22d85 +[2025-08-16T12:54:02.745Z] API: Player login gmtest 421c52f153fed049efa53d27ee53e9175da2856fea9bf53d46aa624453a22d85 +[2025-08-16T12:54:02.760Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:54:02.760Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T12:54:02.761Z] DB: deletePlayer - start gmtest +[2025-08-16T12:54:02.762Z] DB: deletePlayer - changes 1 gmtest +[2025-08-16T12:54:02.762Z] API: Deleted player gmtest +[2025-08-16T12:54:02.778Z] SESSION: GM bypass accepted GET /api/players +[2025-08-16T12:54:02.778Z] DB: getAllPlayers - start +[2025-08-16T12:54:02.781Z] DB: getAllPlayers - resultCount 8 +[2025-08-16T12:54:02.781Z] API: Fetch all players (public) Found 8 players +[2025-08-16T12:54:03.142Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:54:03.142Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:54:03.142Z] DB: deletePlayer - start testplayer +[2025-08-16T12:54:03.143Z] DB: deletePlayer - changes 1 testplayer +[2025-08-16T12:54:03.143Z] API: Deleted player testplayer +[2025-08-16T12:54:03.159Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:54:03.160Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:54:03.160Z] DB: getPlayerByName - not found testplayer +[2025-08-16T12:54:03.241Z] DB: createPlayer - start testplayer +[2025-08-16T12:54:03.242Z] DB: createPlayer - done testplayer rowid 116 +[2025-08-16T12:54:03.242Z] API: Created player testplayer +[2025-08-16T12:54:03.269Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:54:03.269Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:54:03.350Z] DB: createSession - start c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d expiresAt 2025-08-17T12:54:03.350Z +[2025-08-16T12:54:03.351Z] DB: createSession - done c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d +[2025-08-16T12:54:03.351Z] API: Player login testplayer c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d +[2025-08-16T12:54:03.368Z] DB: getSession - start c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d +[2025-08-16T12:54:03.368Z] DB: getSession - ok c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d +[2025-08-16T12:54:03.368Z] SESSION: Valid c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d testplayer PUT /api/players/testplayer +[2025-08-16T12:54:03.368Z] DB: getSession - start c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d +[2025-08-16T12:54:03.369Z] DB: getSession - ok c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d +[2025-08-16T12:54:03.369Z] SESSION: Valid c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d testplayer PUT /api/players/testplayer +[2025-08-16T12:54:03.369Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:54:03.369Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:54:03.369Z] DB: updatePlayer - start testplayer +[2025-08-16T12:54:03.370Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T12:54:03.370Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:54:03.370Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:54:03.370Z] API: Updated player testplayer +[2025-08-16T12:54:03.386Z] DB: getSession - start c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d +[2025-08-16T12:54:03.386Z] DB: getSession - ok c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d +[2025-08-16T12:54:03.386Z] SESSION: Valid c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d testplayer PUT /api/players/testplayer +[2025-08-16T12:54:03.386Z] DB: getSession - start c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d +[2025-08-16T12:54:03.386Z] DB: getSession - ok c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d +[2025-08-16T12:54:03.386Z] SESSION: Valid c8c1fb3a2dadfdace411ed9e61fafaf199826f5e1a1de729f4b28ba4dac1021d testplayer PUT /api/players/testplayer +[2025-08-16T12:54:03.386Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:54:03.386Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:54:03.387Z] DB: updatePlayer - start testplayer +[2025-08-16T12:54:03.387Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T12:54:03.387Z] DB: getPlayerByName - start testplayer +[2025-08-16T12:54:03.387Z] DB: getPlayerByName - found testplayer +[2025-08-16T12:54:03.387Z] API: Updated player testplayer +[2025-08-16T12:54:03.404Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:54:03.404Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T12:54:03.404Z] DB: deletePlayer - start testplayer +[2025-08-16T12:54:03.405Z] DB: deletePlayer - changes 1 testplayer +[2025-08-16T12:54:03.405Z] API: Deleted player testplayer +[2025-08-16T12:54:03.881Z] DB: getAllPlayers - start +[2025-08-16T12:54:03.883Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T12:54:04.264Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:54:04.264Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:54:04.265Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T12:54:04.265Z] DB: deletePlayer - changes 0 shoptestplayer +[2025-08-16T12:54:04.279Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T12:54:04.279Z] DB: getPlayerByName - start shoptestplayer +[2025-08-16T12:54:04.279Z] DB: getPlayerByName - not found shoptestplayer +[2025-08-16T12:54:04.360Z] DB: createPlayer - start shoptestplayer +[2025-08-16T12:54:04.361Z] DB: createPlayer - done shoptestplayer rowid 117 +[2025-08-16T12:54:04.361Z] API: Created player shoptestplayer +[2025-08-16T12:54:04.376Z] SESSION: Missing sessionId GET /api/shop/inventory/shoptestplayer +[2025-08-16T12:54:04.389Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:54:04.389Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T12:54:04.389Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T12:54:04.389Z] DB: deletePlayer - changes 1 shoptestplayer +[2025-08-16T12:54:04.389Z] API: Deleted player shoptestplayer +[2025-08-16T13:00:58.601Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T13:01:23.767Z] DB: getAllPlayers - start +[2025-08-16T13:01:23.770Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T13:01:26.108Z] DB: getPlayerByName - start phillip +[2025-08-16T13:01:26.108Z] DB: getPlayerByName - found phillip +[2025-08-16T13:01:26.308Z] DB: createSession - start 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 expiresAt 2025-08-17T13:01:26.308Z +[2025-08-16T13:01:26.310Z] DB: createSession - done 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 +[2025-08-16T13:01:26.310Z] API: Player login phillip 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 +[2025-08-16T13:01:26.361Z] DB: getSession - start 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 +[2025-08-16T13:01:26.361Z] DB: getSession - ok 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 +[2025-08-16T13:01:26.362Z] SESSION: Validate success 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 phillip +[2025-08-16T13:01:26.364Z] DB: getSession - start 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 +[2025-08-16T13:01:26.364Z] DB: getSession - ok 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 +[2025-08-16T13:01:26.364Z] SESSION: Valid 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 phillip GET /api/players +[2025-08-16T13:01:26.365Z] DB: getAllPlayers - start +[2025-08-16T13:01:26.366Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T13:01:26.366Z] API: Fetch all players (public) Found 7 players +[2025-08-16T13:04:52.687Z] DB: deleteSession - start 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 +[2025-08-16T13:04:52.688Z] DB: deleteSession - changes 1 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 +[2025-08-16T13:04:52.688Z] SESSION: Logout success 5f1cada324f61d87daece67a2303ad66fcc73c883742621472c8bb93d4ae4282 +[2025-08-16T13:04:52.870Z] SESSION: Missing sessionId GET /api/players +[2025-08-16T13:11:09.215Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T13:11:09.217Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T13:11:09.217Z] DB: deletePlayer - start gmtest +[2025-08-16T13:11:09.217Z] DB: deletePlayer - changes 0 gmtest +[2025-08-16T13:11:09.265Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T13:11:09.266Z] DB: getPlayerByName - start gmtest +[2025-08-16T13:11:09.266Z] DB: getPlayerByName - not found gmtest +[2025-08-16T13:11:09.434Z] DB: createPlayer - start gmtest +[2025-08-16T13:11:09.435Z] DB: createPlayer - done gmtest rowid 118 +[2025-08-16T13:11:09.435Z] API: Created player gmtest +[2025-08-16T13:11:09.455Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T13:11:09.456Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T13:11:09.456Z] DB: getPlayerByName - start gmtest +[2025-08-16T13:11:09.456Z] DB: getPlayerByName - found gmtest +[2025-08-16T13:11:09.457Z] DB: updatePlayer - start gmtest +[2025-08-16T13:11:09.457Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T13:11:09.458Z] DB: getPlayerByName - start gmtest +[2025-08-16T13:11:09.458Z] DB: getPlayerByName - found gmtest +[2025-08-16T13:11:09.458Z] API: Updated player gmtest +[2025-08-16T13:11:09.475Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T13:11:09.475Z] SESSION: GM bypass accepted PUT /api/players/gmtest +[2025-08-16T13:11:09.475Z] DB: getPlayerByName - start gmtest +[2025-08-16T13:11:09.475Z] DB: getPlayerByName - found gmtest +[2025-08-16T13:11:09.557Z] DB: updatePlayer - start gmtest +[2025-08-16T13:11:09.557Z] DB: updatePlayer - changes 1 gmtest +[2025-08-16T13:11:09.557Z] DB: getPlayerByName - start gmtest +[2025-08-16T13:11:09.557Z] DB: getPlayerByName - found gmtest +[2025-08-16T13:11:09.557Z] API: Updated player gmtest +[2025-08-16T13:11:09.573Z] DB: getPlayerByName - start gmtest +[2025-08-16T13:11:09.574Z] DB: getPlayerByName - found gmtest +[2025-08-16T13:11:09.653Z] DB: createSession - start a9eb22d26e3a9685ebb34cbe1441097302c8932d305185d74512e340675b4805 expiresAt 2025-08-17T13:11:09.653Z +[2025-08-16T13:11:09.654Z] DB: createSession - done a9eb22d26e3a9685ebb34cbe1441097302c8932d305185d74512e340675b4805 +[2025-08-16T13:11:09.654Z] API: Player login gmtest a9eb22d26e3a9685ebb34cbe1441097302c8932d305185d74512e340675b4805 +[2025-08-16T13:11:09.670Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T13:11:09.670Z] SESSION: GM bypass accepted DELETE /api/players/gmtest +[2025-08-16T13:11:09.671Z] DB: deletePlayer - start gmtest +[2025-08-16T13:11:09.673Z] DB: deletePlayer - changes 1 gmtest +[2025-08-16T13:11:09.673Z] API: Deleted player gmtest +[2025-08-16T13:11:09.688Z] SESSION: GM bypass accepted GET /api/players +[2025-08-16T13:11:09.689Z] DB: getAllPlayers - start +[2025-08-16T13:11:09.690Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T13:11:09.690Z] API: Fetch all players (public) Found 7 players +[2025-08-16T13:11:10.045Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T13:11:10.045Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T13:11:10.045Z] DB: deletePlayer - start testplayer +[2025-08-16T13:11:10.045Z] DB: deletePlayer - changes 0 testplayer +[2025-08-16T13:11:10.062Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T13:11:10.062Z] DB: getPlayerByName - start testplayer +[2025-08-16T13:11:10.062Z] DB: getPlayerByName - not found testplayer +[2025-08-16T13:11:10.144Z] DB: createPlayer - start testplayer +[2025-08-16T13:11:10.145Z] DB: createPlayer - done testplayer rowid 119 +[2025-08-16T13:11:10.145Z] API: Created player testplayer +[2025-08-16T13:11:10.175Z] DB: getPlayerByName - start testplayer +[2025-08-16T13:11:10.175Z] DB: getPlayerByName - found testplayer +[2025-08-16T13:11:10.254Z] DB: createSession - start 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc expiresAt 2025-08-17T13:11:10.254Z +[2025-08-16T13:11:10.255Z] DB: createSession - done 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc +[2025-08-16T13:11:10.255Z] API: Player login testplayer 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc +[2025-08-16T13:11:10.272Z] DB: getSession - start 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc +[2025-08-16T13:11:10.272Z] DB: getSession - ok 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc +[2025-08-16T13:11:10.272Z] SESSION: Valid 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc testplayer PUT /api/players/testplayer +[2025-08-16T13:11:10.272Z] DB: getSession - start 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc +[2025-08-16T13:11:10.273Z] DB: getSession - ok 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc +[2025-08-16T13:11:10.273Z] SESSION: Valid 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc testplayer PUT /api/players/testplayer +[2025-08-16T13:11:10.273Z] DB: getPlayerByName - start testplayer +[2025-08-16T13:11:10.273Z] DB: getPlayerByName - found testplayer +[2025-08-16T13:11:10.273Z] DB: updatePlayer - start testplayer +[2025-08-16T13:11:10.274Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T13:11:10.274Z] DB: getPlayerByName - start testplayer +[2025-08-16T13:11:10.274Z] DB: getPlayerByName - found testplayer +[2025-08-16T13:11:10.274Z] API: Updated player testplayer +[2025-08-16T13:11:10.290Z] DB: getSession - start 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc +[2025-08-16T13:11:10.290Z] DB: getSession - ok 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc +[2025-08-16T13:11:10.290Z] SESSION: Valid 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc testplayer PUT /api/players/testplayer +[2025-08-16T13:11:10.290Z] DB: getSession - start 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc +[2025-08-16T13:11:10.290Z] DB: getSession - ok 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc +[2025-08-16T13:11:10.290Z] SESSION: Valid 46f8c261e225aaaf0313422ee6c3641ac2f3b83398af905c9361082b7dff05cc testplayer PUT /api/players/testplayer +[2025-08-16T13:11:10.290Z] DB: getPlayerByName - start testplayer +[2025-08-16T13:11:10.290Z] DB: getPlayerByName - found testplayer +[2025-08-16T13:11:10.291Z] DB: updatePlayer - start testplayer +[2025-08-16T13:11:10.291Z] DB: updatePlayer - changes 1 testplayer +[2025-08-16T13:11:10.291Z] DB: getPlayerByName - start testplayer +[2025-08-16T13:11:10.291Z] DB: getPlayerByName - found testplayer +[2025-08-16T13:11:10.291Z] API: Updated player testplayer +[2025-08-16T13:11:10.307Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T13:11:10.307Z] SESSION: GM bypass accepted DELETE /api/players/testplayer +[2025-08-16T13:11:10.307Z] DB: deletePlayer - start testplayer +[2025-08-16T13:11:10.308Z] DB: deletePlayer - changes 1 testplayer +[2025-08-16T13:11:10.308Z] API: Deleted player testplayer +[2025-08-16T13:11:10.687Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T13:11:10.687Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T13:11:10.687Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T13:11:10.687Z] DB: deletePlayer - changes 0 shoptestplayer +[2025-08-16T13:11:10.701Z] SESSION: GM bypass accepted POST /api/players +[2025-08-16T13:11:10.701Z] DB: getPlayerByName - start shoptestplayer +[2025-08-16T13:11:10.701Z] DB: getPlayerByName - not found shoptestplayer +[2025-08-16T13:11:10.785Z] DB: createPlayer - start shoptestplayer +[2025-08-16T13:11:10.786Z] DB: createPlayer - done shoptestplayer rowid 120 +[2025-08-16T13:11:10.786Z] API: Created player shoptestplayer +[2025-08-16T13:11:10.801Z] SESSION: Missing sessionId GET /api/shop/inventory/shoptestplayer +[2025-08-16T13:11:10.814Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T13:11:10.814Z] SESSION: GM bypass accepted DELETE /api/players/shoptestplayer +[2025-08-16T13:11:10.814Z] DB: deletePlayer - start shoptestplayer +[2025-08-16T13:11:10.816Z] DB: deletePlayer - changes 1 shoptestplayer +[2025-08-16T13:11:10.816Z] API: Deleted player shoptestplayer +[2025-08-16T13:11:11.311Z] DB: getAllPlayers - start +[2025-08-16T13:11:11.313Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T13:13:43.781Z] DB: getAllPlayers - start +[2025-08-16T13:13:43.784Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T13:13:47.161Z] DB: getAllPlayers - start +[2025-08-16T13:13:47.162Z] DB: getAllPlayers - resultCount 7 +[2025-08-16T13:13:49.399Z] DB: getPlayerByName - start claes +[2025-08-16T13:13:49.399Z] DB: getPlayerByName - found claes +[2025-08-16T13:13:49.598Z] DB: createSession - start 38b1f5081b39e5083eea500ca88fe16ce4839b8ce402c2c7145a09c8728c3450 expiresAt 2025-08-17T13:13:49.598Z +[2025-08-16T13:13:49.600Z] DB: createSession - done 38b1f5081b39e5083eea500ca88fe16ce4839b8ce402c2c7145a09c8728c3450 +[2025-08-16T13:13:49.600Z] API: Player login claes 38b1f5081b39e5083eea500ca88fe16ce4839b8ce402c2c7145a09c8728c3450 +[2025-08-16T13:13:49.647Z] DB: getSession - start 38b1f5081b39e5083eea500ca88fe16ce4839b8ce402c2c7145a09c8728c3450 +[2025-08-16T13:13:49.647Z] DB: getSession - ok 38b1f5081b39e5083eea500ca88fe16ce4839b8ce402c2c7145a09c8728c3450 +[2025-08-16T13:13:49.648Z] SESSION: Validate success 38b1f5081b39e5083eea500ca88fe16ce4839b8ce402c2c7145a09c8728c3450 claes +[2025-08-16T13:13:57.871Z] DB: deleteSession - start 38b1f5081b39e5083eea500ca88fe16ce4839b8ce402c2c7145a09c8728c3450 +[2025-08-16T13:13:57.873Z] DB: deleteSession - changes 1 38b1f5081b39e5083eea500ca88fe16ce4839b8ce402c2c7145a09c8728c3450 +[2025-08-16T13:13:57.873Z] SESSION: Logout success 38b1f5081b39e5083eea500ca88fe16ce4839b8ce402c2c7145a09c8728c3450 +[2025-08-16T13:13:57.913Z] SESSION: Missing sessionId GET /api/players diff --git a/database/routes/playerRoutes-sqlite.js b/database/routes/playerRoutes-sqlite.js index 3e4f092..68eaef6 100644 --- a/database/routes/playerRoutes-sqlite.js +++ b/database/routes/playerRoutes-sqlite.js @@ -252,7 +252,8 @@ router.post('/', async (req, res) => { router.put('/:name', requireSession, async (req, res) => { try { const { name } = req.params; - const updateData = req.body; + // Ensure updateData is an object to avoid runtime TypeErrors when fields are missing + const updateData = req.body || {}; // Check if player exists const existingPlayer = playerHelpers.getByName(name); @@ -270,9 +271,9 @@ router.put('/:name', requireSession, async (req, res) => { // Merge the data properly const mergedData = { - rollerInfo: { ...existingPlayer.rollerInfo, ...updateData.rollerInfo }, - shopInfo: { ...existingPlayer.shopInfo, ...updateData.shopInfo }, - tabInfo: { ...existingPlayer.tabInfo, ...updateData.tabInfo }, + rollerInfo: { ...existingPlayer.rollerInfo, ...(updateData.rollerInfo || {}) }, + shopInfo: { ...existingPlayer.shopInfo, ...(updateData.shopInfo || {}) }, + tabInfo: { ...existingPlayer.tabInfo, ...(updateData.tabInfo || {}) }, // Never carry forward plaintext pw into validation; keep pw empty and use pwHash pw: '', pwHash: updateData.pwHash || existingPlayer.pwHash diff --git a/database/scripts/pm2_smoke_test.sh b/database/scripts/pm2_smoke_test.sh old mode 100644 new mode 100755 diff --git a/database/server.js b/database/server.js index fcbef84..17adf77 100755 --- a/database/server.js +++ b/database/server.js @@ -25,14 +25,38 @@ app.use(cors()); // API Routes (before static files) console.log('Registering API routes...'); -app.use('/api/players', playerRoutes); -console.log('Players routes registered'); -app.use('/api/sessions', sessionRoutes); -console.log('Sessions routes registered'); -app.use('/api/shop', shopRoutes); -console.log('Shop routes registered'); -app.use('/api/rules', rulesRoutes); -console.log('Rules routes registered'); +try { + console.log('Registering /api/players'); + app.use('/api/players', playerRoutes); + console.log('Players routes registered'); +} catch (e) { + console.error('Error mounting /api/players:', e && e.stack ? e.stack : e); + throw e; +} +try { + console.log('Registering /api/sessions'); + app.use('/api/sessions', sessionRoutes); + console.log('Sessions routes registered'); +} catch (e) { + console.error('Error mounting /api/sessions:', e && e.stack ? e.stack : e); + throw e; +} +try { + console.log('Registering /api/shop'); + app.use('/api/shop', shopRoutes); + console.log('Shop routes registered'); +} catch (e) { + console.error('Error mounting /api/shop:', e && e.stack ? e.stack : e); + throw e; +} +try { + console.log('Registering /api/rules'); + app.use('/api/rules', rulesRoutes); + console.log('Rules routes registered'); +} catch (e) { + console.error('Error mounting /api/rules:', e && e.stack ? e.stack : e); + throw e; +} // Serve static files from build directory (React app) const buildDir = path.join(__dirname, '..', 'build'); @@ -66,16 +90,38 @@ process.on('SIGTERM', () => { process.exit(0); }); -// Root route for friendly message -app.get('/', (req, res) => { - res.send('Deathwatch Roller API is running with SQLite. Use /api/players for player data.'); -}); +// If a React build exists, serve it at root and fallback to index.html for client-side routing +const indexHtml = path.join(buildDir, 'index.html'); +if (fs.existsSync(indexHtml)) { + app.get('/', (req, res) => res.sendFile(indexHtml)); -// Use routes + // Catch-all for client-side routes (must be after API routes) + // Middleware fallback for client-side routing: serve index.html for non-API and non-avatar paths. + // Use a plain middleware (no path) to avoid route string parsing by path-to-regexp. + app.use((req, res, next) => { + if (req.path.startsWith('/api/') || req.path.startsWith('/avatars/')) return next(); + return res.sendFile(indexHtml); + }); +} else { + // Root route for friendly message when no build is present + app.get('/', (req, res) => { + res.send('Deathwatch Roller API is running with SQLite. Use /api/players for player data.'); + }); +} + +// Use routes (instrument mounts to debug invalid route patterns) +console.log('Mounting route: /api/shop'); app.use('/api/shop', shopRoutes); +console.log('Mounted /api/shop'); +console.log('Mounting route: /api/players'); app.use('/api/players', playerRoutes); +console.log('Mounted /api/players'); +console.log('Mounting route: /api/sessions'); app.use('/api/sessions', sessionRoutes); +console.log('Mounted /api/sessions'); +console.log('Mounting route: /api/rules'); app.use('/api/rules', rulesRoutes); +console.log('Mounted /api/rules'); // Start Server app.listen(PORT, '0.0.0.0', () => { diff --git a/database/sqlite/deathwatch.db b/database/sqlite/deathwatch.db index 9a2eb11..0af83a9 100644 Binary files a/database/sqlite/deathwatch.db and b/database/sqlite/deathwatch.db differ diff --git a/database/sqlite/deathwatch.db-shm b/database/sqlite/deathwatch.db-shm index 00338a4..7654dc3 100644 Binary files a/database/sqlite/deathwatch.db-shm and b/database/sqlite/deathwatch.db-shm differ diff --git a/database/sqlite/deathwatch.db-wal b/database/sqlite/deathwatch.db-wal index 91548cb..fb6bf7b 100644 Binary files a/database/sqlite/deathwatch.db-wal and b/database/sqlite/deathwatch.db-wal differ diff --git a/package-lock.json b/package-lock.json index 01552eb..77144bc 100755 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "eslint-config-prettier": "^10.1.8", "html-webpack-plugin": "^5.6.4", "node-fetch": "^2.7.0", + "pm2": "^5.2.0", "postcss": "^8.4.23", "prettier-eslint": "^16.4.2", "react-scripts": "^5.0.1", @@ -4464,6 +4465,230 @@ "node": ">=14" } }, + "node_modules/@pm2/agent": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.4.tgz", + "integrity": "sha512-n7WYvvTJhHLS2oBb1PjOtgLpMhgImOq8sXkPBw6smeg9LJBWZjiEgPKOpR8mn9UJZsB5P3W4V/MyvNnp31LKeA==", + "dev": true, + "dependencies": { + "async": "~3.2.0", + "chalk": "~3.0.0", + "dayjs": "~1.8.24", + "debug": "~4.3.1", + "eventemitter2": "~5.0.1", + "fast-json-patch": "^3.0.0-1", + "fclone": "~1.0.11", + "nssocket": "0.6.0", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.0", + "proxy-agent": "~6.3.0", + "semver": "~7.5.0", + "ws": "~7.5.10" + } + }, + "node_modules/@pm2/agent/node_modules/dayjs": { + "version": "1.8.36", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", + "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==", + "dev": true + }, + "node_modules/@pm2/agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@pm2/agent/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/agent/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/agent/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@pm2/io": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@pm2/io/-/io-6.0.1.tgz", + "integrity": "sha512-KiA+shC6sULQAr9mGZ1pg+6KVW9MF8NpG99x26Lf/082/Qy8qsTCtnJy+HQReW1A9Rdf0C/404cz0RZGZro+IA==", + "dev": true, + "dependencies": { + "async": "~2.6.1", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "require-in-the-middle": "^5.0.0", + "semver": "~7.5.4", + "shimmer": "^1.2.0", + "signal-exit": "^3.0.3", + "tslib": "1.9.3" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@pm2/io/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/@pm2/io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@pm2/io/node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "dev": true + }, + "node_modules/@pm2/io/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/io/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/io/node_modules/tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "node_modules/@pm2/io/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@pm2/js-api": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.8.0.tgz", + "integrity": "sha512-nmWzrA/BQZik3VBz+npRcNIu01kdBhWL0mxKmP1ciF/gTcujPTQqt027N9fc1pK9ERM8RipFhymw7RcmCyOEYA==", + "dev": true, + "dependencies": { + "async": "^2.6.3", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "extrareqp2": "^1.0.0", + "ws": "^7.0.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@pm2/js-api/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/@pm2/js-api/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@pm2/js-api/node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "dev": true + }, + "node_modules/@pm2/pm2-version-check": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", + "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==", + "dev": true, + "dependencies": { + "debug": "^4.3.1" + } + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.6.1.tgz", @@ -5027,6 +5252,12 @@ "node": ">= 6" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -6199,6 +6430,21 @@ "ajv": "^6.9.1" } }, + "node_modules/amp": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", + "integrity": "sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==", + "dev": true + }, + "node_modules/amp-message": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", + "integrity": "sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==", + "dev": true, + "dependencies": { + "amp": "0.3.1" + } + }, "node_modules/anser": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/anser/-/anser-2.3.2.tgz", @@ -6206,6 +6452,15 @@ "dev": true, "license": "MIT" }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -6568,6 +6823,18 @@ "dev": true, "license": "MIT" }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -7016,6 +7283,15 @@ } ] }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -7107,6 +7383,18 @@ "readable-stream": "^3.4.0" } }, + "node_modules/blessed": { + "version": "0.1.81", + "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", + "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==", + "dev": true, + "bin": { + "blessed": "bin/tput.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -7114,6 +7402,12 @@ "dev": true, "license": "MIT" }, + "node_modules/bodec": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz", + "integrity": "sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==", + "dev": true + }, "node_modules/body-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", @@ -7529,6 +7823,12 @@ "node": ">=10" } }, + "node_modules/charm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", + "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==", + "dev": true + }, "node_modules/check-types": { "version": "11.2.3", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", @@ -7875,6 +8175,18 @@ "node": ">=6" } }, + "node_modules/cli-tableau": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", + "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==", + "dev": true, + "dependencies": { + "chalk": "3.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -8272,6 +8584,12 @@ "node": ">=10" } }, + "node_modules/croner": { + "version": "4.1.97", + "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", + "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -8716,6 +9034,12 @@ "license": "MIT", "peer": true }, + "node_modules/culvert": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", + "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==", + "dev": true + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -8723,6 +9047,15 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -8792,6 +9125,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "dev": true + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -8981,6 +9320,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -9424,6 +9777,18 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -10341,6 +10706,12 @@ "node": ">= 0.6" } }, + "node_modules/eventemitter2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", + "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==", + "dev": true + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -10496,6 +10867,15 @@ "node": ">= 0.6" } }, + "node_modules/extrareqp2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extrareqp2/-/extrareqp2-1.0.0.tgz", + "integrity": "sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -10533,6 +10913,12 @@ "node": ">= 6" } }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "dev": true + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -10597,6 +10983,12 @@ "bser": "2.1.1" } }, + "node_modules/fclone": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", + "integrity": "sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==", + "dev": true + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -11284,6 +11676,32 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/git-node-fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", + "integrity": "sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==", + "dev": true + }, + "node_modules/git-sha1": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", + "integrity": "sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==", + "dev": true + }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -12117,7 +12535,7 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", - "optional": true, + "devOptional": true, "engines": { "node": ">= 12" } @@ -15713,6 +16131,18 @@ "jiti": "bin/jiti.js" } }, + "node_modules/js-git": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz", + "integrity": "sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==", + "dev": true, + "dependencies": { + "bodec": "^0.1.0", + "culvert": "^0.1.2", + "git-sha1": "^0.1.2", + "pako": "^0.2.5" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -15828,6 +16258,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "optional": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -15976,6 +16413,15 @@ "shell-quote": "^1.8.3" } }, + "node_modules/lazy": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", + "integrity": "sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -16757,6 +17203,12 @@ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "dev": true + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -16777,6 +17229,12 @@ "multicast-dns": "cli.js" } }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -16827,6 +17285,44 @@ "dev": true, "license": "MIT" }, + "node_modules/needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "dev": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/negotiator": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", @@ -16844,6 +17340,15 @@ "dev": true, "license": "MIT" }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -17108,6 +17613,25 @@ "set-blocking": "^2.0.0" } }, + "node_modules/nssocket": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", + "integrity": "sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w==", + "dev": true, + "dependencies": { + "eventemitter2": "~0.4.14", + "lazy": "~1.0.11" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/nssocket/node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -17478,6 +18002,87 @@ "node": ">=6" } }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -17485,6 +18090,12 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -17780,6 +18391,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidusage": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.2.tgz", + "integrity": "sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -17948,6 +18571,185 @@ "node": ">=4" } }, + "node_modules/pm2": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/pm2/-/pm2-5.4.3.tgz", + "integrity": "sha512-4/I1htIHzZk1Y67UgOCo4F1cJtas1kSds31N8zN0PybO230id1nigyjGuGFzUnGmUFPmrJ0On22fO1ChFlp7VQ==", + "dev": true, + "dependencies": { + "@pm2/agent": "~2.0.0", + "@pm2/io": "~6.0.1", + "@pm2/js-api": "~0.8.0", + "@pm2/pm2-version-check": "latest", + "async": "~3.2.0", + "blessed": "0.1.81", + "chalk": "3.0.0", + "chokidar": "^3.5.3", + "cli-tableau": "^2.0.0", + "commander": "2.15.1", + "croner": "~4.1.92", + "dayjs": "~1.11.5", + "debug": "^4.3.1", + "enquirer": "2.3.6", + "eventemitter2": "5.0.1", + "fclone": "1.0.11", + "js-yaml": "~4.1.0", + "mkdirp": "1.0.4", + "needle": "2.4.0", + "pidusage": "~3.0", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.1", + "pm2-deploy": "~1.0.2", + "pm2-multimeter": "^0.1.2", + "promptly": "^2", + "semver": "^7.2", + "source-map-support": "0.5.21", + "sprintf-js": "1.1.2", + "vizion": "~2.2.1" + }, + "bin": { + "pm2": "bin/pm2", + "pm2-dev": "bin/pm2-dev", + "pm2-docker": "bin/pm2-docker", + "pm2-runtime": "bin/pm2-runtime" + }, + "engines": { + "node": ">=12.0.0" + }, + "optionalDependencies": { + "pm2-sysmonit": "^1.2.8" + } + }, + "node_modules/pm2-axon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz", + "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==", + "dev": true, + "dependencies": { + "amp": "~0.3.1", + "amp-message": "~0.1.1", + "debug": "^4.3.1", + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-axon-rpc": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz", + "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==", + "dev": true, + "dependencies": { + "debug": "^4.3.1" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-deploy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz", + "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==", + "dev": true, + "dependencies": { + "run-series": "^1.1.8", + "tv4": "^1.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pm2-multimeter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", + "integrity": "sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==", + "dev": true, + "dependencies": { + "charm": "~0.1.1" + } + }, + "node_modules/pm2-sysmonit": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz", + "integrity": "sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==", + "dev": true, + "optional": true, + "dependencies": { + "async": "^3.2.0", + "debug": "^4.3.1", + "pidusage": "^2.0.21", + "systeminformation": "^5.7", + "tx2": "~1.0.4" + } + }, + "node_modules/pm2-sysmonit/node_modules/pidusage": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", + "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "dev": true, + "optional": true, + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pm2/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/pm2/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "node_modules/pm2/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/pm2/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pm2/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pm2/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -19731,6 +20533,15 @@ "node": ">= 4" } }, + "node_modules/promptly": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", + "integrity": "sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==", + "dev": true, + "dependencies": { + "read": "^1.0.4" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -19786,6 +20597,83 @@ "node": ">= 0.10" } }, + "node_modules/proxy-agent": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", + "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -20677,6 +21565,18 @@ } } }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -20925,6 +21825,20 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", + "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/require-relative": { "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", @@ -21210,6 +22124,26 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -21696,6 +22630,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "dev": true + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -21837,7 +22777,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "optional": true, + "devOptional": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -21859,7 +22799,7 @@ "version": "2.8.7", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "optional": true, + "devOptional": true, "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" @@ -22844,6 +23784,33 @@ "dev": true, "license": "MIT" }, + "node_modules/systeminformation": { + "version": "5.27.7", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.27.7.tgz", + "integrity": "sha512-saaqOoVEEFaux4v0K8Q7caiauRwjXC4XbD2eH60dxHXbpKxQ8kH9Rf7Jh+nryKpOUSEFxtCdBlSUx0/lO6rwRg==", + "dev": true, + "optional": true, + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, "node_modules/tailwindcss": { "version": "3.4.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", @@ -23361,6 +24328,25 @@ "node": "*" } }, + "node_modules/tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tx2": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz", + "integrity": "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==", + "dev": true, + "optional": true, + "dependencies": { + "json-stringify-safe": "^5.0.1" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -23814,6 +24800,30 @@ "node": ">= 0.8" } }, + "node_modules/vizion": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", + "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==", + "dev": true, + "dependencies": { + "async": "^2.6.3", + "git-node-fs": "^1.0.0", + "ini": "^1.3.5", + "js-git": "^0.7.8" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vizion/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, "node_modules/vue-eslint-parser": { "version": "9.4.3", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", diff --git a/package.json b/package.json index d01ce5e..181caf7 100755 --- a/package.json +++ b/package.json @@ -20,17 +20,21 @@ "scripts": { "start": "npm test && react-scripts start", "dev": "npm test && react-scripts start", - "build": "npm test && react-scripts build", - "test": "jest --runInBand --passWithNoTests", + "build": "npm run test:unit && npm run test:integration && react-scripts build && npm run test:unit", + "test-build-test": "npm run test:unit && npm run test:integration && npm run build && npm run test:unit", + "test": "jest --runInBand --passWithNoTests", + "test:unit": "jest --runInBand --passWithNoTests --testPathPattern=src/tests", + "test:integration": "npm run pm2:start && sleep 1 && jest --runInBand --passWithNoTests --testPathPattern=tests && npm run pm2:stop", + "deploy:build": "npm run build && npm run pm2:start && npm run pm2:reload", "eject": "react-scripts eject", "serve": "npm test && serve -s build", "extract:armoury": "node scripts/extract-armoury.js \"$PWD/Deathwatch-Core-Rulebook.pdf\" public/deathwatch-armoury.json", "server": "npm test && cd database && node server.js", "server:notest": "cd database && node server.js", "db:sqlite": "cd database && ./switch-db.sh sqlite", - "pm2:start": "cd database && pm2 start pm2.config.js --env production --update-env", - "pm2:stop": "pm2 stop deathwatch-server || true", - "pm2:reload": "cd database && pm2 reload pm2.config.js --env production --update-env", + "pm2:start": "cd database && pm2 start pm2.config.js --env production --update-env", + "pm2:stop": "pm2 stop deathwatch-server || true", + "pm2:reload": "cd database && pm2 reload pm2.config.js --env production --update-env", "prestart": "", "preserver": "" }, diff --git a/scripts/local-ci.sh b/scripts/local-ci.sh new file mode 100755 index 0000000..be66a26 --- /dev/null +++ b/scripts/local-ci.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Local CI/CD helper script +# Usage: +# ./scripts/local-ci.sh # run install, unit tests, integration tests, build +# ./scripts/local-ci.sh --deploy # run above then reload pm2 (calls npm run pm2:reload) + +echo "[local-ci] Starting local CI run" +ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT_DIR" + +echo "[local-ci] Running npm ci to ensure deterministic install" +if npm ci; then + echo "[local-ci] npm ci succeeded" +else + echo "[local-ci] npm ci failed — falling back to npm install (local dev mode)" + npm install +fi + +echo "[local-ci] Running unit tests" +npm run test:unit --silent + +echo "[local-ci] Running integration tests (this will start/stop PM2 as configured)" +# test:integration starts pm2, runs tests, and stops pm2 +npm run test:integration --silent + +echo "[local-ci] Building production bundle" +npm run build --silent + +if [ "${1:-}" = "--deploy" ]; then + echo "[local-ci] Deploy flag detected: reloading PM2" + npm run pm2:reload || (echo "[local-ci] npm run pm2:reload failed, attempting pm2 reload directly" && pm2 reload database/pm2.config.js || true) +fi + +echo "[local-ci] Finished successfully" diff --git a/src/components/DeathwatchRoller.jsx b/src/components/DeathwatchRoller.jsx index 2395bce..21d58dd 100755 --- a/src/components/DeathwatchRoller.jsx +++ b/src/components/DeathwatchRoller.jsx @@ -1122,3 +1122,6 @@ if (process.env.NODE_ENV === 'development') { } export default DeathwatchRoller; + +// Named export for reuse in other components +export { Tooltip }; diff --git a/src/components/PlayerTab.jsx b/src/components/PlayerTab.jsx index b07f9ec..93ae9c8 100755 --- a/src/components/PlayerTab.jsx +++ b/src/components/PlayerTab.jsx @@ -1,6 +1,7 @@ import { useState, useEffect, useMemo, useCallback } from 'react'; import axios from 'axios'; import logger, { debug, info, warn, logApiCall, logApiError, logUserAction } from '../utils/logger'; +import { Tooltip } from './DeathwatchRoller'; const STORAGE_SHOP_AUTHED = 'dw:shop:authedPlayer'; const STORAGE_SHOP_PLAYERS = 'dw:shop:players:v1'; @@ -29,6 +30,8 @@ const CHARACTERISTICS = [ { key: 'fel', label: 'Fellowship (Fel)' }, ] + + // Updated default skills to Space Marine skills const SKILLS = [ 'Acrobatics (Ag)', 'Awareness (Per)', 'Charm (Fel)', 'Climb (S)', 'Command (Fel)', @@ -67,7 +70,7 @@ function PlayerTab({ const [pastEvent, setPastEvent] = useState(''); const [personalDemeanour, setPersonalDemeanour] = useState(''); const [characteristics, setCharacteristics] = useState({}); - const [skills, setSkills] = useState([]); + const [skills, setSkills] = useState({}); const [weapons, setWeapons] = useState([]); const [armour, setArmour] = useState({}); const [talents, setTalents] = useState(''); @@ -89,6 +92,37 @@ function PlayerTab({ // Debug state const [showLogs, setShowLogs] = useState(false); const [logs, setLogs] = useState([]); + + // Ability descriptions (used as hover tooltips) + const SPACE_MARINE_ABILITIES = [ + { name: 'Secondary Heart', desc: 'Once per long rest, when reduced to 0 Wounds you remain at 1 Wound instead of falling unconscious (stunned 1 round).' }, + { name: "Larraman's Organ", desc: 'When stabilised or treated with basic medicae, regain an extra 1–3 Wounds (GM roll) or gain +10 to recovery checks.' }, + { name: 'Catalepsean Node', desc: 'Ignore penalties from lack of sleep for ~48 hours and reduce exhaustion effects; can grant allies advantage on vigilance checks during extended watches.' }, + { name: 'Preomnor', desc: 'Strong bonus to toxin-resistance tests (GM: auto-success or +20) and halve duration/effect of ingested poisons.' }, + { name: 'Omophagea', desc: 'On consuming a biological sample (GM permission), gain a one-time clue or +10 to lore/identification checks related to that subject.' }, + { name: 'Multi-lung', desc: 'Ignore breathing penalties in toxic/low-oxygen environments and avoid short-term inhalation damage.' }, + { name: 'Sus-an Membrane', desc: 'Can enter suspended animation to avoid bleeding out when gravely wounded; buys time for evacuation/treatment.' }, + { name: 'Oolitic Kidney', desc: 'Reduce toxin damage/effects by half once per exposure or gain advantage on resisting chemical effects.' }, + { name: 'Neuroglottis', desc: 'Automatic/strong bonus to checks identifying substances by taste; +10 to Tracking vs a target you have tasted.' }, + { name: 'Mucranoid', desc: 'Small resistance to disease and contaminants; +10 on disease-resistance and recovery rolls.' }, + { name: "Betcher's Gland", desc: 'One-use close toxin/venom attack per rest or apply a minor toxin effect on a successful melee strike (GM adjudication).' }, + { name: 'Progenoid Glands', desc: 'Store genetic material for Chapter preservation; may enable long-term resurrection rituals (GM process).' }, + { name: 'Melanochrome', desc: '+10 or advantage to perception in varied lighting and camouflage detection.' }, + { name: 'Occulobe', desc: 'Ignore low-light penalties; see in darkness to short range.' }, + { name: "Lyman's Ear", desc: 'Advantage on hearing/perception checks and ability to detect faint sounds.' } + ]; + + const POWER_ARMOUR_ABILITIES = [ + { name: 'Servo-Augmented Musculature', desc: '+20 Strength while wearing Power Armour.' }, + { name: 'Auto-senses', desc: 'Dark sight; immune to Photon Flash and Stun Grenades; Called Shots are Half Actions; +10 to sight and hearing Awareness Tests (stacks with Heightened Senses).' }, + { name: 'Built-in Vox Link', desc: 'Integrated communications — no external vox gear required.' }, + { name: 'Built-in Magboots', desc: 'Grip in zero-G or slippery conditions; avoid slipping/falling penalties.' }, + { name: 'Nutrient Recycling', desc: 'Operate up to two weeks without resupply.' }, + { name: 'Recoil Suppression', desc: 'May fire Basic weapons one-handed without penalty while in Power Armour.' }, + { name: 'Black Carapace / Size: Hulking', desc: 'Large frame, but Black Carapace prevents enemies gaining a size-based bonus to hit you while in Power Armour.' }, + { name: 'Poor Manual Dexterity', desc: 'Delicate tasks suffer a −10 penalty unless using Space Marine-specific tools.' }, + { name: 'Osmotic Gill Life Sustainer', desc: 'Extended underwater/contaminated atmosphere operation support.' } + ]; // Initialize GM state is now handled in App.js @@ -97,6 +131,10 @@ function PlayerTab({ if (showLogs) setLogs(logger.getLogs({ limit: 200 })); }, [showLogs]); + // GM helpers (define early so hooks using them can call safely) + const isGMLoggedIn = useCallback(() => authedPlayer === 'gm', [authedPlayer]); + const isGMOrShopAuthed = useCallback(() => isGMLoggedIn() || !!authedPlayer, [isGMLoggedIn, authedPlayer]); + // Remove localStorage cache for players except after backend fetch const currentPlayer = useMemo(() => { @@ -129,7 +167,7 @@ function PlayerTab({ setPastEvent(''); setPersonalDemeanour(''); setCharacteristics({}); - setSkills([]); + setSkills({}); setWeapons([]); setArmour({}); setTalents(''); @@ -162,7 +200,7 @@ function PlayerTab({ setPastEvent(tabInfo.pastEvent || ''); setPersonalDemeanour(tabInfo.personalDemeanour || ''); setCharacteristics(tabInfo.characteristics || {}); - setSkills(tabInfo.skills || []); + setSkills(normalizeIncomingSkills(tabInfo.skills || [])); setWeapons(tabInfo.weapons || []); setArmour(tabInfo.armour || {}); setPicture(tabInfo.picture || tabInfo.avatar || ''); @@ -337,7 +375,7 @@ function PlayerTab({ pastEvent: updatedPlayer.pastEvent, personalDemeanour: updatedPlayer.personalDemeanour, characteristics: updatedPlayer.characteristics, - skills: updatedPlayer.skills, + skills: serializeSkillsForSave(updatedPlayer.skills), weapons: updatedPlayer.weapons, armour: updatedPlayer.armour, talents: updatedPlayer.talents, @@ -432,9 +470,7 @@ function PlayerTab({ // Define shopAuthed for use in the component const shopAuthed = getShopAuthed(); - // Stable callbacks so hooks depending on them don't change each render - const isGMLoggedIn = useCallback(() => authedPlayer === 'gm', [authedPlayer]); - const isGMOrShopAuthed = useCallback(() => isGMLoggedIn() || !!authedPlayer, [isGMLoggedIn, authedPlayer]); + // Stable callbacks defined earlier // GM session is now managed in App.js @@ -695,6 +731,33 @@ function PlayerTab({ return headers; } + // Skills normalization helpers + function normalizeIncomingSkills(raw) { + // Backend stores skills as array of names; frontend expects an object map + if (Array.isArray(raw)) { + const obj = {}; + for (const s of raw) { + if (!s) continue; + obj[s] = { trained: true, plus10: false, plus20: false }; + } + return obj; + } + if (raw && typeof raw === 'object') return raw; + return {}; + } + + function serializeSkillsForSave(skillsObj) { + // Convert frontend skills object back to an array of skill names for backend + if (Array.isArray(skillsObj)) return skillsObj.filter(Boolean); + if (!skillsObj || typeof skillsObj !== 'object') return []; + const out = []; + for (const [k, v] of Object.entries(skillsObj)) { + if (!k) continue; + if (v && (v.trained || v.plus10 || v.plus20)) out.push(k); + } + return out; + } + function refreshLogs() { setLogs(logger.getLogs({ limit: 200 })); } function clearLogs() { logger.clearLogs(); setLogs([]); } @@ -901,11 +964,29 @@ function PlayerTab({ - {/* Space Marine Abilities */} + {/* Space Marine Abilities - hover tooltips */}
Space Marine Abilities
-
- Secondary Heart, Larraman’s Organ, Catalepsean Node, Preomnor, Omophagea, Multi-lung, Sus-an Membrane, Oolitic Kidney, Neuroglottis, Mucranoid, Betcher’s Gland, Progenoid Glands, Melanochrome, Occulobe, Lyman’s Ear +
+ {SPACE_MARINE_ABILITIES.map(a => ( +
+ {a.name} + ? +
+ ))} +
+
+ + {/* Power Armour Abilities - hover tooltips */} +
+
Power Armour Abilities (standard)
+
+ {POWER_ARMOUR_ABILITIES.map(a => ( +
+ {a.name} + ? +
+ ))}