@@ -18,8 +18,6 @@ import KickCode from "types/enum/kick-reason";
18
18
import type PlayerDataService from "./data/player-data-service" ;
19
19
import type PlayerRemovalService from "./player-removal-service" ;
20
20
21
- const MAX_REMOVING_TIMEOUT = 5 ;
22
-
23
21
export interface OnPlayerJoin {
24
22
/**
25
23
* Fires when a player joins the game and is fully initialized. The player
@@ -176,7 +174,7 @@ export default class PlayerService implements OnStart {
176
174
{
177
175
for ( const { id, event } of this . playerJoinEvents ) {
178
176
janitor
179
- . Add (
177
+ . AddPromise (
180
178
Promise . defer ( ( ) => {
181
179
debug . profilebegin ( id ) ;
182
180
event . onPlayerJoin ( playerEntity ) ;
@@ -226,37 +224,36 @@ export default class PlayerService implements OnStart {
226
224
debug . profilebegin ( "Lifecycle_Player_Leave" ) ;
227
225
{
228
226
for ( const { id, event } of this . playerLeaveEvents ) {
229
- promises . push (
230
- Promise . defer ( ( ) => {
231
- debug . profilebegin ( id ) ;
232
- return Promise . resolve ( event . onPlayerLeave ( playerEntity ) ) . await ( ) ;
233
- } ) ,
234
- ) ;
227
+ const promiseEvent = Promise . defer < void > ( ( resolve , reject ) => {
228
+ debug . profilebegin ( id ) ;
229
+ try {
230
+ const leaveEvent = async ( ) : Promise < void > => {
231
+ await event . onPlayerLeave ( playerEntity ) ;
232
+ } ;
233
+
234
+ const [ success , err ] = leaveEvent ( ) . await ( ) ;
235
+ if ( ! success ) {
236
+ reject ( err ) ;
237
+ return ;
238
+ }
239
+
240
+ resolve ( ) ;
241
+ } catch ( err ) {
242
+ this . logger . Error ( `Error in player lifecycle ${ id } : ${ err } ` ) ;
243
+ }
244
+ } ) ;
245
+
246
+ promises . push ( promiseEvent ) ;
235
247
}
236
248
}
237
249
238
250
debug . profileend ( ) ;
239
251
240
252
// We ensure that all lifecycle events are called before we continue
241
253
// since we may need to access player data in these events.
242
- const lifecycles = Promise . all ( promises ) . catch ( err => {
243
- this . logger . Error ( `Error in player leave lifecycle event:\n ${ err } ` ) ;
254
+ await Promise . all ( promises ) . finally ( ( ) => {
255
+ playerEntity . janitor . Destroy ( ) ;
244
256
} ) ;
245
-
246
- // If we're in development, we want to warn if the lifecycle events take
247
- // too long to complete. This is to ensure that we don't have any
248
- // blocking code in these events.
249
- if ( $NODE_ENV === "development" ) {
250
- lifecycles . timeout ( MAX_REMOVING_TIMEOUT ) . catch ( ( ) => {
251
- this . logger . Fatal (
252
- `Player lifecycle events for ${ playerEntity . userId } took too long. Please ` +
253
- `ensure that lifecycle events do not take too long to complete.` ,
254
- ) ;
255
- } ) ;
256
- }
257
-
258
- await lifecycles ;
259
- playerEntity . janitor . Destroy ( ) ;
260
257
}
261
258
262
259
private bindHoldServerOpen ( ) : void {
0 commit comments