@colyseus/core 0.14.29 → 0.14.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/Room.js +1 -0
- package/build/Room.js.map +1 -1
- package/build/Room.mjs +1 -0
- package/build/Room.mjs.map +1 -1
- package/build/presence/LocalPresence.d.ts +3 -3
- package/build/presence/LocalPresence.js +3 -1
- package/build/presence/LocalPresence.js.map +1 -1
- package/build/presence/LocalPresence.mjs +3 -1
- package/build/presence/LocalPresence.mjs.map +1 -1
- package/build/presence/Presence.d.ts +1 -1
- package/build/utils/Utils.js +12 -0
- package/build/utils/Utils.js.map +2 -2
- package/build/utils/Utils.mjs +12 -0
- package/build/utils/Utils.mjs.map +2 -2
- package/package.json +2 -2
package/build/Room.js
CHANGED
|
@@ -314,6 +314,7 @@ class Room {
|
|
|
314
314
|
reconnection.
|
|
315
315
|
then((newClient) => {
|
|
316
316
|
newClient.auth = previousClient.auth;
|
|
317
|
+
newClient.userData = previousClient.userData;
|
|
317
318
|
previousClient.ref = newClient.ref; // swap "ref" for convenience
|
|
318
319
|
previousClient.state = Transport.ClientState.RECONNECTED;
|
|
319
320
|
clearTimeout(this.reservedSeatTimeouts[sessionId]);
|
package/build/Room.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Room.js","sources":["../src/Room.ts"],"sourcesContent":["import http from 'http';\nimport msgpack from 'notepack.io';\n\nimport { decode, Iterator, Schema } from '@colyseus/schema';\n\nimport Clock from '@gamestdio/timer';\nimport { EventEmitter } from 'events';\n\nimport { Presence } from './presence/Presence';\n\nimport { Serializer } from './serializer/Serializer';\nimport { NoneSerializer } from './serializer/NoneSerializer';\nimport { SchemaSerializer } from './serializer/SchemaSerializer';\n\nimport { ErrorCode, getMessageBytes, Protocol } from './Protocol';\nimport { Deferred, spliceOne } from './Utils';\n\nimport { debugAndPrintError, debugPatch } from './Debug';\nimport { ServerError } from './errors/ServerError';\nimport { Client, ClientState, ISendOptions } from './Transport';\nimport { RoomListingData } from './matchmaker/driver';\n\nconst DEFAULT_PATCH_RATE = 1000 / 20; // 20fps (50ms)\nconst DEFAULT_SIMULATION_INTERVAL = 1000 / 60; // 60fps (16.66ms)\nconst noneSerializer = new NoneSerializer();\n\nexport const DEFAULT_SEAT_RESERVATION_TIME = Number(process.env.COLYSEUS_SEAT_RESERVATION_TIME || 15);\n\nexport type SimulationCallback = (deltaTime: number) => void;\n\nexport type RoomConstructor<T= any> = new (presence?: Presence) => Room<T>;\n\nexport interface IBroadcastOptions extends ISendOptions {\n except?: Client;\n}\n\nexport enum RoomInternalState {\n CREATING = 0,\n CREATED = 1,\n DISCONNECTING = 2,\n}\n\nexport abstract class Room<State= any, Metadata= any> {\n\n public get locked() {\n return this._locked;\n }\n\n public get metadata() {\n return this.listing.metadata;\n }\n\n public listing: RoomListingData<Metadata>;\n public clock: Clock = new Clock();\n\n public roomId: string;\n public roomName: string;\n\n public maxClients: number = Infinity;\n public patchRate: number = DEFAULT_PATCH_RATE;\n public autoDispose: boolean = true;\n\n public state: State;\n public presence: Presence;\n\n public clients: Client[] = [];\n public internalState: RoomInternalState = RoomInternalState.CREATING;\n\n /** @internal */\n public _events = new EventEmitter();\n\n // seat reservation & reconnection\n protected seatReservationTime: number = DEFAULT_SEAT_RESERVATION_TIME;\n protected reservedSeats: { [sessionId: string]: any } = {};\n protected reservedSeatTimeouts: { [sessionId: string]: NodeJS.Timer } = {};\n\n protected reconnections: { [sessionId: string]: Deferred } = {};\n\n private onMessageHandlers: {[id: string]: (client: Client, message: any) => void} = {};\n\n private _serializer: Serializer<State> = noneSerializer;\n private _afterNextPatchQueue: Array<[string | Client, IArguments]> = [];\n\n private _simulationInterval: NodeJS.Timer;\n private _patchInterval: NodeJS.Timer;\n\n private _locked: boolean = false;\n private _lockedExplicitly: boolean = false;\n private _maxClientsReached: boolean = false;\n\n // this timeout prevents rooms that are created by one process, but no client\n // ever had success joining into it on the specified interval.\n private _autoDisposeTimeout: NodeJS.Timer;\n\n constructor(presence?: Presence) {\n this.presence = presence;\n\n this._events.once('dispose', async () => {\n try {\n await this._dispose();\n\n } catch (e) {\n debugAndPrintError(`onDispose error: ${(e && e.message || e || 'promise rejected')}`);\n }\n this._events.emit('disconnect');\n });\n\n this.setPatchRate(this.patchRate);\n // set default _autoDisposeTimeout\n this.resetAutoDisposeTimeout(this.seatReservationTime);\n }\n\n // Optional abstract methods\n public onCreate?(options: any): void | Promise<any>;\n public onJoin?(client: Client, options?: any, auth?: any): void | Promise<any>;\n public onLeave?(client: Client, consented?: boolean): void | Promise<any>;\n public onDispose?(): void | Promise<any>;\n public onAuth(client: Client, options: any, request?: http.IncomingMessage): any | Promise<any> {\n return true;\n }\n\n public hasReachedMaxClients(): boolean {\n return (this.clients.length + Object.keys(this.reservedSeats).length) >= this.maxClients;\n }\n\n public setSeatReservationTime(seconds: number) {\n this.seatReservationTime = seconds;\n return this;\n }\n\n public hasReservedSeat(sessionId: string): boolean {\n return this.reservedSeats[sessionId] !== undefined;\n }\n\n public setSimulationInterval(onTickCallback?: SimulationCallback, delay: number = DEFAULT_SIMULATION_INTERVAL): void {\n // clear previous interval in case called setSimulationInterval more than once\n if (this._simulationInterval) { clearInterval(this._simulationInterval); }\n\n if (onTickCallback) {\n this._simulationInterval = setInterval(() => {\n this.clock.tick();\n onTickCallback(this.clock.deltaTime);\n }, delay);\n }\n }\n\n public setPatchRate(milliseconds: number): void {\n this.patchRate = milliseconds;\n\n // clear previous interval in case called setPatchRate more than once\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (milliseconds !== null && milliseconds !== 0) {\n this._patchInterval = setInterval(() => this.broadcastPatch(), milliseconds);\n }\n }\n\n public setState(newState: State) {\n this.clock.start();\n\n if ('_definition' in newState) {\n this.setSerializer(new SchemaSerializer());\n }\n\n this._serializer.reset(newState);\n\n this.state = newState;\n }\n\n public setSerializer(serializer: Serializer<State>) {\n this._serializer = serializer;\n }\n\n public async setMetadata(meta: Partial<Metadata>) {\n if (!this.listing.metadata) {\n this.listing.metadata = meta as Metadata;\n\n } else {\n for (const field in meta) {\n if (!meta.hasOwnProperty(field)) { continue; }\n this.listing.metadata[field] = meta[field];\n }\n\n // `MongooseDriver` workaround: persit metadata mutations\n if ('markModified' in this.listing) {\n (this.listing as any).markModified('metadata');\n }\n }\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async setPrivate(bool: boolean = true) {\n this.listing.private = bool;\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async lock() {\n // rooms locked internally aren't explicit locks.\n this._lockedExplicitly = (arguments[0] === undefined);\n\n // skip if already locked.\n if (this._locked) { return; }\n\n this._locked = true;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('lock');\n }\n\n public async unlock() {\n // only internal usage passes arguments to this function.\n if (arguments[0] === undefined) {\n this._lockedExplicitly = false;\n }\n\n // skip if already locked\n if (!this._locked) { return; }\n\n this._locked = false;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('unlock');\n }\n\n public send(client: Client, type: string | number, message: any, options?: ISendOptions): void;\n public send(client: Client, message: Schema, options?: ISendOptions): void;\n public send(client: Client, messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions): void {\n console.warn('DEPRECATION WARNING: use client.send(...) instead of this.send(client, ...)');\n client.send(messageOrType, messageOrOptions, options);\n }\n\n public broadcast(type: string | number, message?: any, options?: IBroadcastOptions);\n public broadcast<T extends Schema>(message: T, options?: IBroadcastOptions);\n public broadcast(\n typeOrSchema: string | number | Schema,\n messageOrOptions?: any | IBroadcastOptions,\n options?: IBroadcastOptions,\n ) {\n const isSchema = (typeof(typeOrSchema) === 'object');\n const opts: IBroadcastOptions = ((isSchema) ? messageOrOptions : options);\n\n if (opts && opts.afterNextPatch) {\n delete opts.afterNextPatch;\n this._afterNextPatchQueue.push(['broadcast', arguments]);\n return;\n }\n\n if (isSchema) {\n this.broadcastMessageSchema(typeOrSchema as Schema, opts);\n\n } else {\n this.broadcastMessageType(typeOrSchema as string, messageOrOptions, opts);\n }\n }\n\n public broadcastPatch() {\n if (!this._simulationInterval) {\n this.clock.tick();\n }\n\n if (!this.state) {\n return false;\n }\n\n const hasChanges = this._serializer.applyPatches(this.clients, this.state);\n\n // broadcast messages enqueued for \"after patch\"\n this._dequeueAfterPatchMessages();\n\n return hasChanges;\n }\n\n public onMessage<T = any>(messageType: '*', callback: (client: Client, type: string | number, message: T) => void);\n public onMessage<T = any>(messageType: string | number, callback: (client: Client, message: T) => void);\n public onMessage<T = any>(messageType: '*' | string | number, callback: (...args: any[]) => void) {\n this.onMessageHandlers[messageType] = callback;\n // returns a method to unbind the callback\n return () => delete this.onMessageHandlers[messageType];\n }\n\n public async disconnect(): Promise<any> {\n this.internalState = RoomInternalState.DISCONNECTING;\n await this.listing.remove();\n\n this.autoDispose = true;\n\n const delayedDisconnection = new Promise<void>((resolve) =>\n this._events.once('disconnect', () => resolve()));\n\n for (const reconnection of Object.values(this.reconnections)) {\n reconnection.reject();\n }\n\n let numClients = this.clients.length;\n if (numClients > 0) {\n // clients may have `async onLeave`, room will be disposed after they're fulfilled\n while (numClients--) {\n this._forciblyCloseClient(this.clients[numClients], Protocol.WS_CLOSE_CONSENTED);\n }\n } else {\n // no clients connected, dispose immediately.\n this._events.emit('dispose');\n }\n\n return await delayedDisconnection;\n }\n\n public async ['_onJoin'](client: Client, req?: http.IncomingMessage) {\n const sessionId = client.sessionId;\n\n if (this.reservedSeatTimeouts[sessionId]) {\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n delete this.reservedSeatTimeouts[sessionId];\n }\n\n // clear auto-dispose timeout.\n if (this._autoDisposeTimeout) {\n clearTimeout(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // get seat reservation options and clear it\n const options = this.reservedSeats[sessionId];\n delete this.reservedSeats[sessionId];\n\n // share \"after next patch queue\" reference with every client.\n client._afterNextPatchQueue = this._afterNextPatchQueue;\n\n // bind clean-up callback when client connection closes\n client.ref['onleave'] = this._onLeave.bind(this, client);\n client.ref.once('close', client.ref['onleave']);\n\n this.clients.push(client);\n\n const reconnection = this.reconnections[sessionId];\n if (reconnection) {\n reconnection.resolve(client);\n\n } else {\n try {\n client.auth = await this.onAuth(client, options, req);\n\n if (!client.auth) {\n throw new ServerError(ErrorCode.AUTH_FAILED, 'onAuth failed');\n }\n\n if (this.onJoin) {\n await this.onJoin(client, options, client.auth);\n }\n } catch (e) {\n spliceOne(this.clients, this.clients.indexOf(client));\n\n // make sure an error code is provided.\n if (!e.code) {\n e.code = ErrorCode.APPLICATION_ERROR;\n }\n\n throw e;\n\n } finally {\n // remove seat reservation\n delete this.reservedSeats[sessionId];\n }\n }\n\n // emit 'join' to room handler\n this._events.emit('join', client);\n\n // allow client to send messages after onJoin has succeeded.\n client.ref.on('message', this._onMessage.bind(this, client));\n\n // confirm room id that matches the room name requested to join\n client.raw(getMessageBytes[Protocol.JOIN_ROOM](\n this._serializer.id,\n this._serializer.handshake && this._serializer.handshake(),\n ));\n }\n\n public allowReconnection(previousClient: Client, seconds: number = Infinity): Deferred<Client> {\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n this._disposeIfEmpty(); // gracefully shutting down\n throw new Error('disconnecting');\n }\n\n const sessionId = previousClient.sessionId;\n this._reserveSeat(sessionId, true, seconds, true);\n\n // keep reconnection reference in case the user reconnects into this room.\n const reconnection = new Deferred<Client>();\n this.reconnections[sessionId] = reconnection;\n\n if (seconds !== Infinity) {\n // expire seat reservation after timeout\n this.reservedSeatTimeouts[sessionId] = setTimeout(() =>\n reconnection.reject(false), seconds * 1000);\n }\n\n const cleanup = () => {\n delete this.reservedSeats[sessionId];\n delete this.reconnections[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n };\n\n reconnection.\n then((newClient) => {\n newClient.auth = previousClient.auth;\n previousClient.ref = newClient.ref; // swap \"ref\" for convenience\n previousClient.state = ClientState.RECONNECTED;\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n cleanup();\n }).\n catch(() => {\n cleanup();\n this.resetAutoDisposeTimeout();\n });\n\n return reconnection;\n }\n\n protected resetAutoDisposeTimeout(timeoutInSeconds: number = 1) {\n clearTimeout(this._autoDisposeTimeout);\n\n if (!this.autoDispose) {\n return;\n }\n\n this._autoDisposeTimeout = setTimeout(() => {\n this._autoDisposeTimeout = undefined;\n this._disposeIfEmpty();\n }, timeoutInSeconds * 1000);\n }\n\n private broadcastMessageSchema<T extends Schema>(message: T, options: IBroadcastOptions = {}) {\n const encodedMessage = getMessageBytes[Protocol.ROOM_DATA_SCHEMA](message);\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients[numClients];\n\n if (options.except !== client) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private broadcastMessageType(type: string, message?: any, options: IBroadcastOptions = {}) {\n const encodedMessage = getMessageBytes[Protocol.ROOM_DATA](type, message);\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients[numClients];\n\n if (options.except !== client) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private sendFullState(client: Client): void {\n client.enqueueRaw(getMessageBytes[Protocol.ROOM_STATE](this._serializer.getFullState(client)));\n }\n\n private _dequeueAfterPatchMessages() {\n const length = this._afterNextPatchQueue.length;\n\n if (length > 0) {\n for (let i = 0; i < length; i++) {\n const [target, args] = this._afterNextPatchQueue[i];\n\n if (target === \"broadcast\") {\n this.broadcast.apply(this, args);\n\n } else {\n (target as Client).raw.apply(target, args);\n }\n }\n\n // new messages may have been added in the meantime,\n // let's splice the ones that have been processed\n this._afterNextPatchQueue.splice(0, length);\n }\n }\n\n private async _reserveSeat(\n sessionId: string,\n joinOptions: any = true,\n seconds: number = this.seatReservationTime,\n allowReconnection: boolean = false,\n ) {\n if (!allowReconnection && this.hasReachedMaxClients()) {\n return false;\n }\n\n this.reservedSeats[sessionId] = joinOptions;\n\n if (!allowReconnection) {\n await this._incrementClientCount();\n\n this.reservedSeatTimeouts[sessionId] = setTimeout(async () => {\n delete this.reservedSeats[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n await this._decrementClientCount();\n }, seconds * 1000);\n\n this.resetAutoDisposeTimeout(seconds);\n }\n\n return true;\n }\n\n private _disposeIfEmpty() {\n const willDispose = (\n this.autoDispose &&\n this._autoDisposeTimeout === undefined &&\n this.clients.length === 0 &&\n Object.keys(this.reservedSeats).length === 0\n );\n\n if (willDispose) {\n this._events.emit('dispose');\n }\n\n return willDispose;\n }\n\n private async _dispose(): Promise<any> {\n let userReturnData;\n\n if (this.onDispose) {\n userReturnData = this.onDispose();\n }\n\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (this._simulationInterval) {\n clearInterval(this._simulationInterval);\n this._simulationInterval = undefined;\n }\n\n if (this._autoDisposeTimeout) {\n clearInterval(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // clear all timeouts/intervals + force to stop ticking\n this.clock.clear();\n this.clock.stop();\n\n return await (userReturnData || Promise.resolve());\n }\n\n private _onMessage(client: Client, bytes: number[]) {\n // skip if client is on LEAVING state.\n if (client.state === ClientState.LEAVING) { return; }\n\n const it: Iterator = { offset: 0 };\n const code = decode.uint8(bytes, it);\n\n if (!bytes) {\n debugAndPrintError(`${this.roomName} (${this.roomId}), couldn't decode message: ${bytes}`);\n return;\n }\n\n if (code === Protocol.ROOM_DATA) {\n const messageType = (decode.stringCheck(bytes, it))\n ? decode.string(bytes, it)\n : decode.number(bytes, it);\n\n let message;\n try {\n message = (bytes.length > it.offset)\n ? msgpack.decode(bytes.slice(it.offset, bytes.length))\n : undefined;\n } catch (e) {\n debugAndPrintError(e);\n return;\n }\n\n if (this.onMessageHandlers[messageType]) {\n this.onMessageHandlers[messageType](client, message);\n\n } else if (this.onMessageHandlers['*']) {\n (this.onMessageHandlers['*'] as any)(client, messageType, message);\n\n } else {\n debugAndPrintError(`onMessage for \"${messageType}\" not registered.`);\n }\n\n } else if (code === Protocol.JOIN_ROOM) {\n // join room has been acknowledged by the client\n client.state = ClientState.JOINED;\n\n // send current state when new client joins the room\n if (this.state) {\n this.sendFullState(client);\n }\n\n // dequeue messages sent before client has joined effectively (on user-defined `onJoin`)\n if (client._enqueuedMessages.length > 0) {\n client._enqueuedMessages.forEach((enqueued) => client.raw(enqueued));\n }\n delete client._enqueuedMessages;\n\n } else if (code === Protocol.LEAVE_ROOM) {\n this._forciblyCloseClient(client, Protocol.WS_CLOSE_CONSENTED);\n }\n\n }\n\n private _forciblyCloseClient(client: Client, closeCode: number) {\n // stop receiving messages from this client\n client.ref.removeAllListeners('message');\n\n // prevent \"onLeave\" from being called twice if player asks to leave\n client.ref.removeListener('close', client.ref['onleave']);\n\n // only effectively close connection when \"onLeave\" is fulfilled\n this._onLeave(client, closeCode).then(() => client.leave(Protocol.WS_CLOSE_NORMAL));\n }\n\n private async _onLeave(client: Client, code?: number): Promise<any> {\n const success = spliceOne(this.clients, this.clients.indexOf(client));\n\n // call 'onLeave' method only if the client has been successfully accepted.\n if (success && this.onLeave) {\n try {\n client.state = ClientState.LEAVING;\n await this.onLeave(client, (code === Protocol.WS_CLOSE_CONSENTED));\n\n } catch (e) {\n debugAndPrintError(`onLeave error: ${(e && e.message || e || 'promise rejected')}`);\n }\n }\n\n if (client.state !== ClientState.RECONNECTED) {\n // try to dispose immediatelly if client reconnection isn't set up.\n const willDispose = await this._decrementClientCount();\n\n this._events.emit('leave', client, willDispose);\n }\n }\n\n private async _incrementClientCount() {\n // lock automatically when maxClients is reached\n if (!this._locked && this.hasReachedMaxClients()) {\n this._maxClientsReached = true;\n this.lock.call(this, true);\n }\n\n await this.listing.updateOne({\n $inc: { clients: 1 },\n $set: { locked: this._locked },\n });\n }\n\n private async _decrementClientCount() {\n const willDispose = this._disposeIfEmpty();\n\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n return;\n }\n\n // unlock if room is available for new connections\n if (!willDispose) {\n if (this._maxClientsReached && !this._lockedExplicitly) {\n this._maxClientsReached = false;\n this.unlock.call(this, true);\n }\n\n // update room listing cache\n await this.listing.updateOne({\n $inc: { clients: -1 },\n $set: { locked: this._locked },\n });\n }\n\n return willDispose;\n }\n\n}\n"],"names":["NoneSerializer","RoomInternalState","Clock","EventEmitter","debugAndPrintError","SchemaSerializer","Protocol","ServerError","ErrorCode","spliceOne","getMessageBytes","Deferred","ClientState","decode","msgpack"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Room.js","sources":["../src/Room.ts"],"sourcesContent":["import http from 'http';\nimport msgpack from 'notepack.io';\n\nimport { decode, Iterator, Schema } from '@colyseus/schema';\n\nimport Clock from '@gamestdio/timer';\nimport { EventEmitter } from 'events';\n\nimport { Presence } from './presence/Presence';\n\nimport { Serializer } from './serializer/Serializer';\nimport { NoneSerializer } from './serializer/NoneSerializer';\nimport { SchemaSerializer } from './serializer/SchemaSerializer';\n\nimport { ErrorCode, getMessageBytes, Protocol } from './Protocol';\nimport { Deferred, spliceOne } from './Utils';\n\nimport { debugAndPrintError, debugPatch } from './Debug';\nimport { ServerError } from './errors/ServerError';\nimport { Client, ClientState, ISendOptions } from './Transport';\nimport { RoomListingData } from './matchmaker/driver';\n\nconst DEFAULT_PATCH_RATE = 1000 / 20; // 20fps (50ms)\nconst DEFAULT_SIMULATION_INTERVAL = 1000 / 60; // 60fps (16.66ms)\nconst noneSerializer = new NoneSerializer();\n\nexport const DEFAULT_SEAT_RESERVATION_TIME = Number(process.env.COLYSEUS_SEAT_RESERVATION_TIME || 15);\n\nexport type SimulationCallback = (deltaTime: number) => void;\n\nexport type RoomConstructor<T= any> = new (presence?: Presence) => Room<T>;\n\nexport interface IBroadcastOptions extends ISendOptions {\n except?: Client;\n}\n\nexport enum RoomInternalState {\n CREATING = 0,\n CREATED = 1,\n DISCONNECTING = 2,\n}\n\nexport abstract class Room<State= any, Metadata= any> {\n\n public get locked() {\n return this._locked;\n }\n\n public get metadata() {\n return this.listing.metadata;\n }\n\n public listing: RoomListingData<Metadata>;\n public clock: Clock = new Clock();\n\n public roomId: string;\n public roomName: string;\n\n public maxClients: number = Infinity;\n public patchRate: number = DEFAULT_PATCH_RATE;\n public autoDispose: boolean = true;\n\n public state: State;\n public presence: Presence;\n\n public clients: Client[] = [];\n public internalState: RoomInternalState = RoomInternalState.CREATING;\n\n /** @internal */\n public _events = new EventEmitter();\n\n // seat reservation & reconnection\n protected seatReservationTime: number = DEFAULT_SEAT_RESERVATION_TIME;\n protected reservedSeats: { [sessionId: string]: any } = {};\n protected reservedSeatTimeouts: { [sessionId: string]: NodeJS.Timer } = {};\n\n protected reconnections: { [sessionId: string]: Deferred } = {};\n\n private onMessageHandlers: {[id: string]: (client: Client, message: any) => void} = {};\n\n private _serializer: Serializer<State> = noneSerializer;\n private _afterNextPatchQueue: Array<[string | Client, IArguments]> = [];\n\n private _simulationInterval: NodeJS.Timer;\n private _patchInterval: NodeJS.Timer;\n\n private _locked: boolean = false;\n private _lockedExplicitly: boolean = false;\n private _maxClientsReached: boolean = false;\n\n // this timeout prevents rooms that are created by one process, but no client\n // ever had success joining into it on the specified interval.\n private _autoDisposeTimeout: NodeJS.Timer;\n\n constructor(presence?: Presence) {\n this.presence = presence;\n\n this._events.once('dispose', async () => {\n try {\n await this._dispose();\n\n } catch (e) {\n debugAndPrintError(`onDispose error: ${(e && e.message || e || 'promise rejected')}`);\n }\n this._events.emit('disconnect');\n });\n\n this.setPatchRate(this.patchRate);\n // set default _autoDisposeTimeout\n this.resetAutoDisposeTimeout(this.seatReservationTime);\n }\n\n // Optional abstract methods\n public onCreate?(options: any): void | Promise<any>;\n public onJoin?(client: Client, options?: any, auth?: any): void | Promise<any>;\n public onLeave?(client: Client, consented?: boolean): void | Promise<any>;\n public onDispose?(): void | Promise<any>;\n public onAuth(client: Client, options: any, request?: http.IncomingMessage): any | Promise<any> {\n return true;\n }\n\n public hasReachedMaxClients(): boolean {\n return (this.clients.length + Object.keys(this.reservedSeats).length) >= this.maxClients;\n }\n\n public setSeatReservationTime(seconds: number) {\n this.seatReservationTime = seconds;\n return this;\n }\n\n public hasReservedSeat(sessionId: string): boolean {\n return this.reservedSeats[sessionId] !== undefined;\n }\n\n public setSimulationInterval(onTickCallback?: SimulationCallback, delay: number = DEFAULT_SIMULATION_INTERVAL): void {\n // clear previous interval in case called setSimulationInterval more than once\n if (this._simulationInterval) { clearInterval(this._simulationInterval); }\n\n if (onTickCallback) {\n this._simulationInterval = setInterval(() => {\n this.clock.tick();\n onTickCallback(this.clock.deltaTime);\n }, delay);\n }\n }\n\n public setPatchRate(milliseconds: number): void {\n this.patchRate = milliseconds;\n\n // clear previous interval in case called setPatchRate more than once\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (milliseconds !== null && milliseconds !== 0) {\n this._patchInterval = setInterval(() => this.broadcastPatch(), milliseconds);\n }\n }\n\n public setState(newState: State) {\n this.clock.start();\n\n if ('_definition' in newState) {\n this.setSerializer(new SchemaSerializer());\n }\n\n this._serializer.reset(newState);\n\n this.state = newState;\n }\n\n public setSerializer(serializer: Serializer<State>) {\n this._serializer = serializer;\n }\n\n public async setMetadata(meta: Partial<Metadata>) {\n if (!this.listing.metadata) {\n this.listing.metadata = meta as Metadata;\n\n } else {\n for (const field in meta) {\n if (!meta.hasOwnProperty(field)) { continue; }\n this.listing.metadata[field] = meta[field];\n }\n\n // `MongooseDriver` workaround: persit metadata mutations\n if ('markModified' in this.listing) {\n (this.listing as any).markModified('metadata');\n }\n }\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async setPrivate(bool: boolean = true) {\n this.listing.private = bool;\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async lock() {\n // rooms locked internally aren't explicit locks.\n this._lockedExplicitly = (arguments[0] === undefined);\n\n // skip if already locked.\n if (this._locked) { return; }\n\n this._locked = true;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('lock');\n }\n\n public async unlock() {\n // only internal usage passes arguments to this function.\n if (arguments[0] === undefined) {\n this._lockedExplicitly = false;\n }\n\n // skip if already locked\n if (!this._locked) { return; }\n\n this._locked = false;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('unlock');\n }\n\n public send(client: Client, type: string | number, message: any, options?: ISendOptions): void;\n public send(client: Client, message: Schema, options?: ISendOptions): void;\n public send(client: Client, messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions): void {\n console.warn('DEPRECATION WARNING: use client.send(...) instead of this.send(client, ...)');\n client.send(messageOrType, messageOrOptions, options);\n }\n\n public broadcast(type: string | number, message?: any, options?: IBroadcastOptions);\n public broadcast<T extends Schema>(message: T, options?: IBroadcastOptions);\n public broadcast(\n typeOrSchema: string | number | Schema,\n messageOrOptions?: any | IBroadcastOptions,\n options?: IBroadcastOptions,\n ) {\n const isSchema = (typeof(typeOrSchema) === 'object');\n const opts: IBroadcastOptions = ((isSchema) ? messageOrOptions : options);\n\n if (opts && opts.afterNextPatch) {\n delete opts.afterNextPatch;\n this._afterNextPatchQueue.push(['broadcast', arguments]);\n return;\n }\n\n if (isSchema) {\n this.broadcastMessageSchema(typeOrSchema as Schema, opts);\n\n } else {\n this.broadcastMessageType(typeOrSchema as string, messageOrOptions, opts);\n }\n }\n\n public broadcastPatch() {\n if (!this._simulationInterval) {\n this.clock.tick();\n }\n\n if (!this.state) {\n return false;\n }\n\n const hasChanges = this._serializer.applyPatches(this.clients, this.state);\n\n // broadcast messages enqueued for \"after patch\"\n this._dequeueAfterPatchMessages();\n\n return hasChanges;\n }\n\n public onMessage<T = any>(messageType: '*', callback: (client: Client, type: string | number, message: T) => void);\n public onMessage<T = any>(messageType: string | number, callback: (client: Client, message: T) => void);\n public onMessage<T = any>(messageType: '*' | string | number, callback: (...args: any[]) => void) {\n this.onMessageHandlers[messageType] = callback;\n // returns a method to unbind the callback\n return () => delete this.onMessageHandlers[messageType];\n }\n\n public async disconnect(): Promise<any> {\n this.internalState = RoomInternalState.DISCONNECTING;\n await this.listing.remove();\n\n this.autoDispose = true;\n\n const delayedDisconnection = new Promise<void>((resolve) =>\n this._events.once('disconnect', () => resolve()));\n\n for (const reconnection of Object.values(this.reconnections)) {\n reconnection.reject();\n }\n\n let numClients = this.clients.length;\n if (numClients > 0) {\n // clients may have `async onLeave`, room will be disposed after they're fulfilled\n while (numClients--) {\n this._forciblyCloseClient(this.clients[numClients], Protocol.WS_CLOSE_CONSENTED);\n }\n } else {\n // no clients connected, dispose immediately.\n this._events.emit('dispose');\n }\n\n return await delayedDisconnection;\n }\n\n public async ['_onJoin'](client: Client, req?: http.IncomingMessage) {\n const sessionId = client.sessionId;\n\n if (this.reservedSeatTimeouts[sessionId]) {\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n delete this.reservedSeatTimeouts[sessionId];\n }\n\n // clear auto-dispose timeout.\n if (this._autoDisposeTimeout) {\n clearTimeout(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // get seat reservation options and clear it\n const options = this.reservedSeats[sessionId];\n delete this.reservedSeats[sessionId];\n\n // share \"after next patch queue\" reference with every client.\n client._afterNextPatchQueue = this._afterNextPatchQueue;\n\n // bind clean-up callback when client connection closes\n client.ref['onleave'] = this._onLeave.bind(this, client);\n client.ref.once('close', client.ref['onleave']);\n\n this.clients.push(client);\n\n const reconnection = this.reconnections[sessionId];\n if (reconnection) {\n reconnection.resolve(client);\n\n } else {\n try {\n client.auth = await this.onAuth(client, options, req);\n\n if (!client.auth) {\n throw new ServerError(ErrorCode.AUTH_FAILED, 'onAuth failed');\n }\n\n if (this.onJoin) {\n await this.onJoin(client, options, client.auth);\n }\n } catch (e) {\n spliceOne(this.clients, this.clients.indexOf(client));\n\n // make sure an error code is provided.\n if (!e.code) {\n e.code = ErrorCode.APPLICATION_ERROR;\n }\n\n throw e;\n\n } finally {\n // remove seat reservation\n delete this.reservedSeats[sessionId];\n }\n }\n\n // emit 'join' to room handler\n this._events.emit('join', client);\n\n // allow client to send messages after onJoin has succeeded.\n client.ref.on('message', this._onMessage.bind(this, client));\n\n // confirm room id that matches the room name requested to join\n client.raw(getMessageBytes[Protocol.JOIN_ROOM](\n this._serializer.id,\n this._serializer.handshake && this._serializer.handshake(),\n ));\n }\n\n public allowReconnection(previousClient: Client, seconds: number = Infinity): Deferred<Client> {\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n this._disposeIfEmpty(); // gracefully shutting down\n throw new Error('disconnecting');\n }\n\n const sessionId = previousClient.sessionId;\n this._reserveSeat(sessionId, true, seconds, true);\n\n // keep reconnection reference in case the user reconnects into this room.\n const reconnection = new Deferred<Client>();\n this.reconnections[sessionId] = reconnection;\n\n if (seconds !== Infinity) {\n // expire seat reservation after timeout\n this.reservedSeatTimeouts[sessionId] = setTimeout(() =>\n reconnection.reject(false), seconds * 1000);\n }\n\n const cleanup = () => {\n delete this.reservedSeats[sessionId];\n delete this.reconnections[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n };\n\n reconnection.\n then((newClient) => {\n newClient.auth = previousClient.auth;\n newClient.userData = previousClient.userData;\n previousClient.ref = newClient.ref; // swap \"ref\" for convenience\n previousClient.state = ClientState.RECONNECTED;\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n cleanup();\n }).\n catch(() => {\n cleanup();\n this.resetAutoDisposeTimeout();\n });\n\n return reconnection;\n }\n\n protected resetAutoDisposeTimeout(timeoutInSeconds: number = 1) {\n clearTimeout(this._autoDisposeTimeout);\n\n if (!this.autoDispose) {\n return;\n }\n\n this._autoDisposeTimeout = setTimeout(() => {\n this._autoDisposeTimeout = undefined;\n this._disposeIfEmpty();\n }, timeoutInSeconds * 1000);\n }\n\n private broadcastMessageSchema<T extends Schema>(message: T, options: IBroadcastOptions = {}) {\n const encodedMessage = getMessageBytes[Protocol.ROOM_DATA_SCHEMA](message);\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients[numClients];\n\n if (options.except !== client) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private broadcastMessageType(type: string, message?: any, options: IBroadcastOptions = {}) {\n const encodedMessage = getMessageBytes[Protocol.ROOM_DATA](type, message);\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients[numClients];\n\n if (options.except !== client) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private sendFullState(client: Client): void {\n client.enqueueRaw(getMessageBytes[Protocol.ROOM_STATE](this._serializer.getFullState(client)));\n }\n\n private _dequeueAfterPatchMessages() {\n const length = this._afterNextPatchQueue.length;\n\n if (length > 0) {\n for (let i = 0; i < length; i++) {\n const [target, args] = this._afterNextPatchQueue[i];\n\n if (target === \"broadcast\") {\n this.broadcast.apply(this, args);\n\n } else {\n (target as Client).raw.apply(target, args);\n }\n }\n\n // new messages may have been added in the meantime,\n // let's splice the ones that have been processed\n this._afterNextPatchQueue.splice(0, length);\n }\n }\n\n private async _reserveSeat(\n sessionId: string,\n joinOptions: any = true,\n seconds: number = this.seatReservationTime,\n allowReconnection: boolean = false,\n ) {\n if (!allowReconnection && this.hasReachedMaxClients()) {\n return false;\n }\n\n this.reservedSeats[sessionId] = joinOptions;\n\n if (!allowReconnection) {\n await this._incrementClientCount();\n\n this.reservedSeatTimeouts[sessionId] = setTimeout(async () => {\n delete this.reservedSeats[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n await this._decrementClientCount();\n }, seconds * 1000);\n\n this.resetAutoDisposeTimeout(seconds);\n }\n\n return true;\n }\n\n private _disposeIfEmpty() {\n const willDispose = (\n this.autoDispose &&\n this._autoDisposeTimeout === undefined &&\n this.clients.length === 0 &&\n Object.keys(this.reservedSeats).length === 0\n );\n\n if (willDispose) {\n this._events.emit('dispose');\n }\n\n return willDispose;\n }\n\n private async _dispose(): Promise<any> {\n let userReturnData;\n\n if (this.onDispose) {\n userReturnData = this.onDispose();\n }\n\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (this._simulationInterval) {\n clearInterval(this._simulationInterval);\n this._simulationInterval = undefined;\n }\n\n if (this._autoDisposeTimeout) {\n clearInterval(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // clear all timeouts/intervals + force to stop ticking\n this.clock.clear();\n this.clock.stop();\n\n return await (userReturnData || Promise.resolve());\n }\n\n private _onMessage(client: Client, bytes: number[]) {\n // skip if client is on LEAVING state.\n if (client.state === ClientState.LEAVING) { return; }\n\n const it: Iterator = { offset: 0 };\n const code = decode.uint8(bytes, it);\n\n if (!bytes) {\n debugAndPrintError(`${this.roomName} (${this.roomId}), couldn't decode message: ${bytes}`);\n return;\n }\n\n if (code === Protocol.ROOM_DATA) {\n const messageType = (decode.stringCheck(bytes, it))\n ? decode.string(bytes, it)\n : decode.number(bytes, it);\n\n let message;\n try {\n message = (bytes.length > it.offset)\n ? msgpack.decode(bytes.slice(it.offset, bytes.length))\n : undefined;\n } catch (e) {\n debugAndPrintError(e);\n return;\n }\n\n if (this.onMessageHandlers[messageType]) {\n this.onMessageHandlers[messageType](client, message);\n\n } else if (this.onMessageHandlers['*']) {\n (this.onMessageHandlers['*'] as any)(client, messageType, message);\n\n } else {\n debugAndPrintError(`onMessage for \"${messageType}\" not registered.`);\n }\n\n } else if (code === Protocol.JOIN_ROOM) {\n // join room has been acknowledged by the client\n client.state = ClientState.JOINED;\n\n // send current state when new client joins the room\n if (this.state) {\n this.sendFullState(client);\n }\n\n // dequeue messages sent before client has joined effectively (on user-defined `onJoin`)\n if (client._enqueuedMessages.length > 0) {\n client._enqueuedMessages.forEach((enqueued) => client.raw(enqueued));\n }\n delete client._enqueuedMessages;\n\n } else if (code === Protocol.LEAVE_ROOM) {\n this._forciblyCloseClient(client, Protocol.WS_CLOSE_CONSENTED);\n }\n\n }\n\n private _forciblyCloseClient(client: Client, closeCode: number) {\n // stop receiving messages from this client\n client.ref.removeAllListeners('message');\n\n // prevent \"onLeave\" from being called twice if player asks to leave\n client.ref.removeListener('close', client.ref['onleave']);\n\n // only effectively close connection when \"onLeave\" is fulfilled\n this._onLeave(client, closeCode).then(() => client.leave(Protocol.WS_CLOSE_NORMAL));\n }\n\n private async _onLeave(client: Client, code?: number): Promise<any> {\n const success = spliceOne(this.clients, this.clients.indexOf(client));\n\n // call 'onLeave' method only if the client has been successfully accepted.\n if (success && this.onLeave) {\n try {\n client.state = ClientState.LEAVING;\n await this.onLeave(client, (code === Protocol.WS_CLOSE_CONSENTED));\n\n } catch (e) {\n debugAndPrintError(`onLeave error: ${(e && e.message || e || 'promise rejected')}`);\n }\n }\n\n if (client.state !== ClientState.RECONNECTED) {\n // try to dispose immediatelly if client reconnection isn't set up.\n const willDispose = await this._decrementClientCount();\n\n this._events.emit('leave', client, willDispose);\n }\n }\n\n private async _incrementClientCount() {\n // lock automatically when maxClients is reached\n if (!this._locked && this.hasReachedMaxClients()) {\n this._maxClientsReached = true;\n this.lock.call(this, true);\n }\n\n await this.listing.updateOne({\n $inc: { clients: 1 },\n $set: { locked: this._locked },\n });\n }\n\n private async _decrementClientCount() {\n const willDispose = this._disposeIfEmpty();\n\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n return;\n }\n\n // unlock if room is available for new connections\n if (!willDispose) {\n if (this._maxClientsReached && !this._lockedExplicitly) {\n this._maxClientsReached = false;\n this.unlock.call(this, true);\n }\n\n // update room listing cache\n await this.listing.updateOne({\n $inc: { clients: -1 },\n $set: { locked: this._locked },\n });\n }\n\n return willDispose;\n }\n\n}\n"],"names":["NoneSerializer","RoomInternalState","Clock","EventEmitter","debugAndPrintError","SchemaSerializer","Protocol","ServerError","ErrorCode","spliceOne","getMessageBytes","Deferred","ClientState","decode","msgpack"],"mappings":"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"}
|
package/build/Room.mjs
CHANGED
|
@@ -305,6 +305,7 @@ class Room {
|
|
|
305
305
|
reconnection.
|
|
306
306
|
then((newClient) => {
|
|
307
307
|
newClient.auth = previousClient.auth;
|
|
308
|
+
newClient.userData = previousClient.userData;
|
|
308
309
|
previousClient.ref = newClient.ref; // swap "ref" for convenience
|
|
309
310
|
previousClient.state = ClientState.RECONNECTED;
|
|
310
311
|
clearTimeout(this.reservedSeatTimeouts[sessionId]);
|
package/build/Room.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Room.mjs","sources":["../src/Room.ts"],"sourcesContent":["import http from 'http';\nimport msgpack from 'notepack.io';\n\nimport { decode, Iterator, Schema } from '@colyseus/schema';\n\nimport Clock from '@gamestdio/timer';\nimport { EventEmitter } from 'events';\n\nimport { Presence } from './presence/Presence';\n\nimport { Serializer } from './serializer/Serializer';\nimport { NoneSerializer } from './serializer/NoneSerializer';\nimport { SchemaSerializer } from './serializer/SchemaSerializer';\n\nimport { ErrorCode, getMessageBytes, Protocol } from './Protocol';\nimport { Deferred, spliceOne } from './Utils';\n\nimport { debugAndPrintError, debugPatch } from './Debug';\nimport { ServerError } from './errors/ServerError';\nimport { Client, ClientState, ISendOptions } from './Transport';\nimport { RoomListingData } from './matchmaker/driver';\n\nconst DEFAULT_PATCH_RATE = 1000 / 20; // 20fps (50ms)\nconst DEFAULT_SIMULATION_INTERVAL = 1000 / 60; // 60fps (16.66ms)\nconst noneSerializer = new NoneSerializer();\n\nexport const DEFAULT_SEAT_RESERVATION_TIME = Number(process.env.COLYSEUS_SEAT_RESERVATION_TIME || 15);\n\nexport type SimulationCallback = (deltaTime: number) => void;\n\nexport type RoomConstructor<T= any> = new (presence?: Presence) => Room<T>;\n\nexport interface IBroadcastOptions extends ISendOptions {\n except?: Client;\n}\n\nexport enum RoomInternalState {\n CREATING = 0,\n CREATED = 1,\n DISCONNECTING = 2,\n}\n\nexport abstract class Room<State= any, Metadata= any> {\n\n public get locked() {\n return this._locked;\n }\n\n public get metadata() {\n return this.listing.metadata;\n }\n\n public listing: RoomListingData<Metadata>;\n public clock: Clock = new Clock();\n\n public roomId: string;\n public roomName: string;\n\n public maxClients: number = Infinity;\n public patchRate: number = DEFAULT_PATCH_RATE;\n public autoDispose: boolean = true;\n\n public state: State;\n public presence: Presence;\n\n public clients: Client[] = [];\n public internalState: RoomInternalState = RoomInternalState.CREATING;\n\n /** @internal */\n public _events = new EventEmitter();\n\n // seat reservation & reconnection\n protected seatReservationTime: number = DEFAULT_SEAT_RESERVATION_TIME;\n protected reservedSeats: { [sessionId: string]: any } = {};\n protected reservedSeatTimeouts: { [sessionId: string]: NodeJS.Timer } = {};\n\n protected reconnections: { [sessionId: string]: Deferred } = {};\n\n private onMessageHandlers: {[id: string]: (client: Client, message: any) => void} = {};\n\n private _serializer: Serializer<State> = noneSerializer;\n private _afterNextPatchQueue: Array<[string | Client, IArguments]> = [];\n\n private _simulationInterval: NodeJS.Timer;\n private _patchInterval: NodeJS.Timer;\n\n private _locked: boolean = false;\n private _lockedExplicitly: boolean = false;\n private _maxClientsReached: boolean = false;\n\n // this timeout prevents rooms that are created by one process, but no client\n // ever had success joining into it on the specified interval.\n private _autoDisposeTimeout: NodeJS.Timer;\n\n constructor(presence?: Presence) {\n this.presence = presence;\n\n this._events.once('dispose', async () => {\n try {\n await this._dispose();\n\n } catch (e) {\n debugAndPrintError(`onDispose error: ${(e && e.message || e || 'promise rejected')}`);\n }\n this._events.emit('disconnect');\n });\n\n this.setPatchRate(this.patchRate);\n // set default _autoDisposeTimeout\n this.resetAutoDisposeTimeout(this.seatReservationTime);\n }\n\n // Optional abstract methods\n public onCreate?(options: any): void | Promise<any>;\n public onJoin?(client: Client, options?: any, auth?: any): void | Promise<any>;\n public onLeave?(client: Client, consented?: boolean): void | Promise<any>;\n public onDispose?(): void | Promise<any>;\n public onAuth(client: Client, options: any, request?: http.IncomingMessage): any | Promise<any> {\n return true;\n }\n\n public hasReachedMaxClients(): boolean {\n return (this.clients.length + Object.keys(this.reservedSeats).length) >= this.maxClients;\n }\n\n public setSeatReservationTime(seconds: number) {\n this.seatReservationTime = seconds;\n return this;\n }\n\n public hasReservedSeat(sessionId: string): boolean {\n return this.reservedSeats[sessionId] !== undefined;\n }\n\n public setSimulationInterval(onTickCallback?: SimulationCallback, delay: number = DEFAULT_SIMULATION_INTERVAL): void {\n // clear previous interval in case called setSimulationInterval more than once\n if (this._simulationInterval) { clearInterval(this._simulationInterval); }\n\n if (onTickCallback) {\n this._simulationInterval = setInterval(() => {\n this.clock.tick();\n onTickCallback(this.clock.deltaTime);\n }, delay);\n }\n }\n\n public setPatchRate(milliseconds: number): void {\n this.patchRate = milliseconds;\n\n // clear previous interval in case called setPatchRate more than once\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (milliseconds !== null && milliseconds !== 0) {\n this._patchInterval = setInterval(() => this.broadcastPatch(), milliseconds);\n }\n }\n\n public setState(newState: State) {\n this.clock.start();\n\n if ('_definition' in newState) {\n this.setSerializer(new SchemaSerializer());\n }\n\n this._serializer.reset(newState);\n\n this.state = newState;\n }\n\n public setSerializer(serializer: Serializer<State>) {\n this._serializer = serializer;\n }\n\n public async setMetadata(meta: Partial<Metadata>) {\n if (!this.listing.metadata) {\n this.listing.metadata = meta as Metadata;\n\n } else {\n for (const field in meta) {\n if (!meta.hasOwnProperty(field)) { continue; }\n this.listing.metadata[field] = meta[field];\n }\n\n // `MongooseDriver` workaround: persit metadata mutations\n if ('markModified' in this.listing) {\n (this.listing as any).markModified('metadata');\n }\n }\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async setPrivate(bool: boolean = true) {\n this.listing.private = bool;\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async lock() {\n // rooms locked internally aren't explicit locks.\n this._lockedExplicitly = (arguments[0] === undefined);\n\n // skip if already locked.\n if (this._locked) { return; }\n\n this._locked = true;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('lock');\n }\n\n public async unlock() {\n // only internal usage passes arguments to this function.\n if (arguments[0] === undefined) {\n this._lockedExplicitly = false;\n }\n\n // skip if already locked\n if (!this._locked) { return; }\n\n this._locked = false;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('unlock');\n }\n\n public send(client: Client, type: string | number, message: any, options?: ISendOptions): void;\n public send(client: Client, message: Schema, options?: ISendOptions): void;\n public send(client: Client, messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions): void {\n console.warn('DEPRECATION WARNING: use client.send(...) instead of this.send(client, ...)');\n client.send(messageOrType, messageOrOptions, options);\n }\n\n public broadcast(type: string | number, message?: any, options?: IBroadcastOptions);\n public broadcast<T extends Schema>(message: T, options?: IBroadcastOptions);\n public broadcast(\n typeOrSchema: string | number | Schema,\n messageOrOptions?: any | IBroadcastOptions,\n options?: IBroadcastOptions,\n ) {\n const isSchema = (typeof(typeOrSchema) === 'object');\n const opts: IBroadcastOptions = ((isSchema) ? messageOrOptions : options);\n\n if (opts && opts.afterNextPatch) {\n delete opts.afterNextPatch;\n this._afterNextPatchQueue.push(['broadcast', arguments]);\n return;\n }\n\n if (isSchema) {\n this.broadcastMessageSchema(typeOrSchema as Schema, opts);\n\n } else {\n this.broadcastMessageType(typeOrSchema as string, messageOrOptions, opts);\n }\n }\n\n public broadcastPatch() {\n if (!this._simulationInterval) {\n this.clock.tick();\n }\n\n if (!this.state) {\n return false;\n }\n\n const hasChanges = this._serializer.applyPatches(this.clients, this.state);\n\n // broadcast messages enqueued for \"after patch\"\n this._dequeueAfterPatchMessages();\n\n return hasChanges;\n }\n\n public onMessage<T = any>(messageType: '*', callback: (client: Client, type: string | number, message: T) => void);\n public onMessage<T = any>(messageType: string | number, callback: (client: Client, message: T) => void);\n public onMessage<T = any>(messageType: '*' | string | number, callback: (...args: any[]) => void) {\n this.onMessageHandlers[messageType] = callback;\n // returns a method to unbind the callback\n return () => delete this.onMessageHandlers[messageType];\n }\n\n public async disconnect(): Promise<any> {\n this.internalState = RoomInternalState.DISCONNECTING;\n await this.listing.remove();\n\n this.autoDispose = true;\n\n const delayedDisconnection = new Promise<void>((resolve) =>\n this._events.once('disconnect', () => resolve()));\n\n for (const reconnection of Object.values(this.reconnections)) {\n reconnection.reject();\n }\n\n let numClients = this.clients.length;\n if (numClients > 0) {\n // clients may have `async onLeave`, room will be disposed after they're fulfilled\n while (numClients--) {\n this._forciblyCloseClient(this.clients[numClients], Protocol.WS_CLOSE_CONSENTED);\n }\n } else {\n // no clients connected, dispose immediately.\n this._events.emit('dispose');\n }\n\n return await delayedDisconnection;\n }\n\n public async ['_onJoin'](client: Client, req?: http.IncomingMessage) {\n const sessionId = client.sessionId;\n\n if (this.reservedSeatTimeouts[sessionId]) {\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n delete this.reservedSeatTimeouts[sessionId];\n }\n\n // clear auto-dispose timeout.\n if (this._autoDisposeTimeout) {\n clearTimeout(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // get seat reservation options and clear it\n const options = this.reservedSeats[sessionId];\n delete this.reservedSeats[sessionId];\n\n // share \"after next patch queue\" reference with every client.\n client._afterNextPatchQueue = this._afterNextPatchQueue;\n\n // bind clean-up callback when client connection closes\n client.ref['onleave'] = this._onLeave.bind(this, client);\n client.ref.once('close', client.ref['onleave']);\n\n this.clients.push(client);\n\n const reconnection = this.reconnections[sessionId];\n if (reconnection) {\n reconnection.resolve(client);\n\n } else {\n try {\n client.auth = await this.onAuth(client, options, req);\n\n if (!client.auth) {\n throw new ServerError(ErrorCode.AUTH_FAILED, 'onAuth failed');\n }\n\n if (this.onJoin) {\n await this.onJoin(client, options, client.auth);\n }\n } catch (e) {\n spliceOne(this.clients, this.clients.indexOf(client));\n\n // make sure an error code is provided.\n if (!e.code) {\n e.code = ErrorCode.APPLICATION_ERROR;\n }\n\n throw e;\n\n } finally {\n // remove seat reservation\n delete this.reservedSeats[sessionId];\n }\n }\n\n // emit 'join' to room handler\n this._events.emit('join', client);\n\n // allow client to send messages after onJoin has succeeded.\n client.ref.on('message', this._onMessage.bind(this, client));\n\n // confirm room id that matches the room name requested to join\n client.raw(getMessageBytes[Protocol.JOIN_ROOM](\n this._serializer.id,\n this._serializer.handshake && this._serializer.handshake(),\n ));\n }\n\n public allowReconnection(previousClient: Client, seconds: number = Infinity): Deferred<Client> {\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n this._disposeIfEmpty(); // gracefully shutting down\n throw new Error('disconnecting');\n }\n\n const sessionId = previousClient.sessionId;\n this._reserveSeat(sessionId, true, seconds, true);\n\n // keep reconnection reference in case the user reconnects into this room.\n const reconnection = new Deferred<Client>();\n this.reconnections[sessionId] = reconnection;\n\n if (seconds !== Infinity) {\n // expire seat reservation after timeout\n this.reservedSeatTimeouts[sessionId] = setTimeout(() =>\n reconnection.reject(false), seconds * 1000);\n }\n\n const cleanup = () => {\n delete this.reservedSeats[sessionId];\n delete this.reconnections[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n };\n\n reconnection.\n then((newClient) => {\n newClient.auth = previousClient.auth;\n previousClient.ref = newClient.ref; // swap \"ref\" for convenience\n previousClient.state = ClientState.RECONNECTED;\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n cleanup();\n }).\n catch(() => {\n cleanup();\n this.resetAutoDisposeTimeout();\n });\n\n return reconnection;\n }\n\n protected resetAutoDisposeTimeout(timeoutInSeconds: number = 1) {\n clearTimeout(this._autoDisposeTimeout);\n\n if (!this.autoDispose) {\n return;\n }\n\n this._autoDisposeTimeout = setTimeout(() => {\n this._autoDisposeTimeout = undefined;\n this._disposeIfEmpty();\n }, timeoutInSeconds * 1000);\n }\n\n private broadcastMessageSchema<T extends Schema>(message: T, options: IBroadcastOptions = {}) {\n const encodedMessage = getMessageBytes[Protocol.ROOM_DATA_SCHEMA](message);\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients[numClients];\n\n if (options.except !== client) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private broadcastMessageType(type: string, message?: any, options: IBroadcastOptions = {}) {\n const encodedMessage = getMessageBytes[Protocol.ROOM_DATA](type, message);\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients[numClients];\n\n if (options.except !== client) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private sendFullState(client: Client): void {\n client.enqueueRaw(getMessageBytes[Protocol.ROOM_STATE](this._serializer.getFullState(client)));\n }\n\n private _dequeueAfterPatchMessages() {\n const length = this._afterNextPatchQueue.length;\n\n if (length > 0) {\n for (let i = 0; i < length; i++) {\n const [target, args] = this._afterNextPatchQueue[i];\n\n if (target === \"broadcast\") {\n this.broadcast.apply(this, args);\n\n } else {\n (target as Client).raw.apply(target, args);\n }\n }\n\n // new messages may have been added in the meantime,\n // let's splice the ones that have been processed\n this._afterNextPatchQueue.splice(0, length);\n }\n }\n\n private async _reserveSeat(\n sessionId: string,\n joinOptions: any = true,\n seconds: number = this.seatReservationTime,\n allowReconnection: boolean = false,\n ) {\n if (!allowReconnection && this.hasReachedMaxClients()) {\n return false;\n }\n\n this.reservedSeats[sessionId] = joinOptions;\n\n if (!allowReconnection) {\n await this._incrementClientCount();\n\n this.reservedSeatTimeouts[sessionId] = setTimeout(async () => {\n delete this.reservedSeats[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n await this._decrementClientCount();\n }, seconds * 1000);\n\n this.resetAutoDisposeTimeout(seconds);\n }\n\n return true;\n }\n\n private _disposeIfEmpty() {\n const willDispose = (\n this.autoDispose &&\n this._autoDisposeTimeout === undefined &&\n this.clients.length === 0 &&\n Object.keys(this.reservedSeats).length === 0\n );\n\n if (willDispose) {\n this._events.emit('dispose');\n }\n\n return willDispose;\n }\n\n private async _dispose(): Promise<any> {\n let userReturnData;\n\n if (this.onDispose) {\n userReturnData = this.onDispose();\n }\n\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (this._simulationInterval) {\n clearInterval(this._simulationInterval);\n this._simulationInterval = undefined;\n }\n\n if (this._autoDisposeTimeout) {\n clearInterval(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // clear all timeouts/intervals + force to stop ticking\n this.clock.clear();\n this.clock.stop();\n\n return await (userReturnData || Promise.resolve());\n }\n\n private _onMessage(client: Client, bytes: number[]) {\n // skip if client is on LEAVING state.\n if (client.state === ClientState.LEAVING) { return; }\n\n const it: Iterator = { offset: 0 };\n const code = decode.uint8(bytes, it);\n\n if (!bytes) {\n debugAndPrintError(`${this.roomName} (${this.roomId}), couldn't decode message: ${bytes}`);\n return;\n }\n\n if (code === Protocol.ROOM_DATA) {\n const messageType = (decode.stringCheck(bytes, it))\n ? decode.string(bytes, it)\n : decode.number(bytes, it);\n\n let message;\n try {\n message = (bytes.length > it.offset)\n ? msgpack.decode(bytes.slice(it.offset, bytes.length))\n : undefined;\n } catch (e) {\n debugAndPrintError(e);\n return;\n }\n\n if (this.onMessageHandlers[messageType]) {\n this.onMessageHandlers[messageType](client, message);\n\n } else if (this.onMessageHandlers['*']) {\n (this.onMessageHandlers['*'] as any)(client, messageType, message);\n\n } else {\n debugAndPrintError(`onMessage for \"${messageType}\" not registered.`);\n }\n\n } else if (code === Protocol.JOIN_ROOM) {\n // join room has been acknowledged by the client\n client.state = ClientState.JOINED;\n\n // send current state when new client joins the room\n if (this.state) {\n this.sendFullState(client);\n }\n\n // dequeue messages sent before client has joined effectively (on user-defined `onJoin`)\n if (client._enqueuedMessages.length > 0) {\n client._enqueuedMessages.forEach((enqueued) => client.raw(enqueued));\n }\n delete client._enqueuedMessages;\n\n } else if (code === Protocol.LEAVE_ROOM) {\n this._forciblyCloseClient(client, Protocol.WS_CLOSE_CONSENTED);\n }\n\n }\n\n private _forciblyCloseClient(client: Client, closeCode: number) {\n // stop receiving messages from this client\n client.ref.removeAllListeners('message');\n\n // prevent \"onLeave\" from being called twice if player asks to leave\n client.ref.removeListener('close', client.ref['onleave']);\n\n // only effectively close connection when \"onLeave\" is fulfilled\n this._onLeave(client, closeCode).then(() => client.leave(Protocol.WS_CLOSE_NORMAL));\n }\n\n private async _onLeave(client: Client, code?: number): Promise<any> {\n const success = spliceOne(this.clients, this.clients.indexOf(client));\n\n // call 'onLeave' method only if the client has been successfully accepted.\n if (success && this.onLeave) {\n try {\n client.state = ClientState.LEAVING;\n await this.onLeave(client, (code === Protocol.WS_CLOSE_CONSENTED));\n\n } catch (e) {\n debugAndPrintError(`onLeave error: ${(e && e.message || e || 'promise rejected')}`);\n }\n }\n\n if (client.state !== ClientState.RECONNECTED) {\n // try to dispose immediatelly if client reconnection isn't set up.\n const willDispose = await this._decrementClientCount();\n\n this._events.emit('leave', client, willDispose);\n }\n }\n\n private async _incrementClientCount() {\n // lock automatically when maxClients is reached\n if (!this._locked && this.hasReachedMaxClients()) {\n this._maxClientsReached = true;\n this.lock.call(this, true);\n }\n\n await this.listing.updateOne({\n $inc: { clients: 1 },\n $set: { locked: this._locked },\n });\n }\n\n private async _decrementClientCount() {\n const willDispose = this._disposeIfEmpty();\n\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n return;\n }\n\n // unlock if room is available for new connections\n if (!willDispose) {\n if (this._maxClientsReached && !this._lockedExplicitly) {\n this._maxClientsReached = false;\n this.unlock.call(this, true);\n }\n\n // update room listing cache\n await this.listing.updateOne({\n $inc: { clients: -1 },\n $set: { locked: this._locked },\n });\n }\n\n return willDispose;\n }\n\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Room.mjs","sources":["../src/Room.ts"],"sourcesContent":["import http from 'http';\nimport msgpack from 'notepack.io';\n\nimport { decode, Iterator, Schema } from '@colyseus/schema';\n\nimport Clock from '@gamestdio/timer';\nimport { EventEmitter } from 'events';\n\nimport { Presence } from './presence/Presence';\n\nimport { Serializer } from './serializer/Serializer';\nimport { NoneSerializer } from './serializer/NoneSerializer';\nimport { SchemaSerializer } from './serializer/SchemaSerializer';\n\nimport { ErrorCode, getMessageBytes, Protocol } from './Protocol';\nimport { Deferred, spliceOne } from './Utils';\n\nimport { debugAndPrintError, debugPatch } from './Debug';\nimport { ServerError } from './errors/ServerError';\nimport { Client, ClientState, ISendOptions } from './Transport';\nimport { RoomListingData } from './matchmaker/driver';\n\nconst DEFAULT_PATCH_RATE = 1000 / 20; // 20fps (50ms)\nconst DEFAULT_SIMULATION_INTERVAL = 1000 / 60; // 60fps (16.66ms)\nconst noneSerializer = new NoneSerializer();\n\nexport const DEFAULT_SEAT_RESERVATION_TIME = Number(process.env.COLYSEUS_SEAT_RESERVATION_TIME || 15);\n\nexport type SimulationCallback = (deltaTime: number) => void;\n\nexport type RoomConstructor<T= any> = new (presence?: Presence) => Room<T>;\n\nexport interface IBroadcastOptions extends ISendOptions {\n except?: Client;\n}\n\nexport enum RoomInternalState {\n CREATING = 0,\n CREATED = 1,\n DISCONNECTING = 2,\n}\n\nexport abstract class Room<State= any, Metadata= any> {\n\n public get locked() {\n return this._locked;\n }\n\n public get metadata() {\n return this.listing.metadata;\n }\n\n public listing: RoomListingData<Metadata>;\n public clock: Clock = new Clock();\n\n public roomId: string;\n public roomName: string;\n\n public maxClients: number = Infinity;\n public patchRate: number = DEFAULT_PATCH_RATE;\n public autoDispose: boolean = true;\n\n public state: State;\n public presence: Presence;\n\n public clients: Client[] = [];\n public internalState: RoomInternalState = RoomInternalState.CREATING;\n\n /** @internal */\n public _events = new EventEmitter();\n\n // seat reservation & reconnection\n protected seatReservationTime: number = DEFAULT_SEAT_RESERVATION_TIME;\n protected reservedSeats: { [sessionId: string]: any } = {};\n protected reservedSeatTimeouts: { [sessionId: string]: NodeJS.Timer } = {};\n\n protected reconnections: { [sessionId: string]: Deferred } = {};\n\n private onMessageHandlers: {[id: string]: (client: Client, message: any) => void} = {};\n\n private _serializer: Serializer<State> = noneSerializer;\n private _afterNextPatchQueue: Array<[string | Client, IArguments]> = [];\n\n private _simulationInterval: NodeJS.Timer;\n private _patchInterval: NodeJS.Timer;\n\n private _locked: boolean = false;\n private _lockedExplicitly: boolean = false;\n private _maxClientsReached: boolean = false;\n\n // this timeout prevents rooms that are created by one process, but no client\n // ever had success joining into it on the specified interval.\n private _autoDisposeTimeout: NodeJS.Timer;\n\n constructor(presence?: Presence) {\n this.presence = presence;\n\n this._events.once('dispose', async () => {\n try {\n await this._dispose();\n\n } catch (e) {\n debugAndPrintError(`onDispose error: ${(e && e.message || e || 'promise rejected')}`);\n }\n this._events.emit('disconnect');\n });\n\n this.setPatchRate(this.patchRate);\n // set default _autoDisposeTimeout\n this.resetAutoDisposeTimeout(this.seatReservationTime);\n }\n\n // Optional abstract methods\n public onCreate?(options: any): void | Promise<any>;\n public onJoin?(client: Client, options?: any, auth?: any): void | Promise<any>;\n public onLeave?(client: Client, consented?: boolean): void | Promise<any>;\n public onDispose?(): void | Promise<any>;\n public onAuth(client: Client, options: any, request?: http.IncomingMessage): any | Promise<any> {\n return true;\n }\n\n public hasReachedMaxClients(): boolean {\n return (this.clients.length + Object.keys(this.reservedSeats).length) >= this.maxClients;\n }\n\n public setSeatReservationTime(seconds: number) {\n this.seatReservationTime = seconds;\n return this;\n }\n\n public hasReservedSeat(sessionId: string): boolean {\n return this.reservedSeats[sessionId] !== undefined;\n }\n\n public setSimulationInterval(onTickCallback?: SimulationCallback, delay: number = DEFAULT_SIMULATION_INTERVAL): void {\n // clear previous interval in case called setSimulationInterval more than once\n if (this._simulationInterval) { clearInterval(this._simulationInterval); }\n\n if (onTickCallback) {\n this._simulationInterval = setInterval(() => {\n this.clock.tick();\n onTickCallback(this.clock.deltaTime);\n }, delay);\n }\n }\n\n public setPatchRate(milliseconds: number): void {\n this.patchRate = milliseconds;\n\n // clear previous interval in case called setPatchRate more than once\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (milliseconds !== null && milliseconds !== 0) {\n this._patchInterval = setInterval(() => this.broadcastPatch(), milliseconds);\n }\n }\n\n public setState(newState: State) {\n this.clock.start();\n\n if ('_definition' in newState) {\n this.setSerializer(new SchemaSerializer());\n }\n\n this._serializer.reset(newState);\n\n this.state = newState;\n }\n\n public setSerializer(serializer: Serializer<State>) {\n this._serializer = serializer;\n }\n\n public async setMetadata(meta: Partial<Metadata>) {\n if (!this.listing.metadata) {\n this.listing.metadata = meta as Metadata;\n\n } else {\n for (const field in meta) {\n if (!meta.hasOwnProperty(field)) { continue; }\n this.listing.metadata[field] = meta[field];\n }\n\n // `MongooseDriver` workaround: persit metadata mutations\n if ('markModified' in this.listing) {\n (this.listing as any).markModified('metadata');\n }\n }\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async setPrivate(bool: boolean = true) {\n this.listing.private = bool;\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async lock() {\n // rooms locked internally aren't explicit locks.\n this._lockedExplicitly = (arguments[0] === undefined);\n\n // skip if already locked.\n if (this._locked) { return; }\n\n this._locked = true;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('lock');\n }\n\n public async unlock() {\n // only internal usage passes arguments to this function.\n if (arguments[0] === undefined) {\n this._lockedExplicitly = false;\n }\n\n // skip if already locked\n if (!this._locked) { return; }\n\n this._locked = false;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('unlock');\n }\n\n public send(client: Client, type: string | number, message: any, options?: ISendOptions): void;\n public send(client: Client, message: Schema, options?: ISendOptions): void;\n public send(client: Client, messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions): void {\n console.warn('DEPRECATION WARNING: use client.send(...) instead of this.send(client, ...)');\n client.send(messageOrType, messageOrOptions, options);\n }\n\n public broadcast(type: string | number, message?: any, options?: IBroadcastOptions);\n public broadcast<T extends Schema>(message: T, options?: IBroadcastOptions);\n public broadcast(\n typeOrSchema: string | number | Schema,\n messageOrOptions?: any | IBroadcastOptions,\n options?: IBroadcastOptions,\n ) {\n const isSchema = (typeof(typeOrSchema) === 'object');\n const opts: IBroadcastOptions = ((isSchema) ? messageOrOptions : options);\n\n if (opts && opts.afterNextPatch) {\n delete opts.afterNextPatch;\n this._afterNextPatchQueue.push(['broadcast', arguments]);\n return;\n }\n\n if (isSchema) {\n this.broadcastMessageSchema(typeOrSchema as Schema, opts);\n\n } else {\n this.broadcastMessageType(typeOrSchema as string, messageOrOptions, opts);\n }\n }\n\n public broadcastPatch() {\n if (!this._simulationInterval) {\n this.clock.tick();\n }\n\n if (!this.state) {\n return false;\n }\n\n const hasChanges = this._serializer.applyPatches(this.clients, this.state);\n\n // broadcast messages enqueued for \"after patch\"\n this._dequeueAfterPatchMessages();\n\n return hasChanges;\n }\n\n public onMessage<T = any>(messageType: '*', callback: (client: Client, type: string | number, message: T) => void);\n public onMessage<T = any>(messageType: string | number, callback: (client: Client, message: T) => void);\n public onMessage<T = any>(messageType: '*' | string | number, callback: (...args: any[]) => void) {\n this.onMessageHandlers[messageType] = callback;\n // returns a method to unbind the callback\n return () => delete this.onMessageHandlers[messageType];\n }\n\n public async disconnect(): Promise<any> {\n this.internalState = RoomInternalState.DISCONNECTING;\n await this.listing.remove();\n\n this.autoDispose = true;\n\n const delayedDisconnection = new Promise<void>((resolve) =>\n this._events.once('disconnect', () => resolve()));\n\n for (const reconnection of Object.values(this.reconnections)) {\n reconnection.reject();\n }\n\n let numClients = this.clients.length;\n if (numClients > 0) {\n // clients may have `async onLeave`, room will be disposed after they're fulfilled\n while (numClients--) {\n this._forciblyCloseClient(this.clients[numClients], Protocol.WS_CLOSE_CONSENTED);\n }\n } else {\n // no clients connected, dispose immediately.\n this._events.emit('dispose');\n }\n\n return await delayedDisconnection;\n }\n\n public async ['_onJoin'](client: Client, req?: http.IncomingMessage) {\n const sessionId = client.sessionId;\n\n if (this.reservedSeatTimeouts[sessionId]) {\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n delete this.reservedSeatTimeouts[sessionId];\n }\n\n // clear auto-dispose timeout.\n if (this._autoDisposeTimeout) {\n clearTimeout(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // get seat reservation options and clear it\n const options = this.reservedSeats[sessionId];\n delete this.reservedSeats[sessionId];\n\n // share \"after next patch queue\" reference with every client.\n client._afterNextPatchQueue = this._afterNextPatchQueue;\n\n // bind clean-up callback when client connection closes\n client.ref['onleave'] = this._onLeave.bind(this, client);\n client.ref.once('close', client.ref['onleave']);\n\n this.clients.push(client);\n\n const reconnection = this.reconnections[sessionId];\n if (reconnection) {\n reconnection.resolve(client);\n\n } else {\n try {\n client.auth = await this.onAuth(client, options, req);\n\n if (!client.auth) {\n throw new ServerError(ErrorCode.AUTH_FAILED, 'onAuth failed');\n }\n\n if (this.onJoin) {\n await this.onJoin(client, options, client.auth);\n }\n } catch (e) {\n spliceOne(this.clients, this.clients.indexOf(client));\n\n // make sure an error code is provided.\n if (!e.code) {\n e.code = ErrorCode.APPLICATION_ERROR;\n }\n\n throw e;\n\n } finally {\n // remove seat reservation\n delete this.reservedSeats[sessionId];\n }\n }\n\n // emit 'join' to room handler\n this._events.emit('join', client);\n\n // allow client to send messages after onJoin has succeeded.\n client.ref.on('message', this._onMessage.bind(this, client));\n\n // confirm room id that matches the room name requested to join\n client.raw(getMessageBytes[Protocol.JOIN_ROOM](\n this._serializer.id,\n this._serializer.handshake && this._serializer.handshake(),\n ));\n }\n\n public allowReconnection(previousClient: Client, seconds: number = Infinity): Deferred<Client> {\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n this._disposeIfEmpty(); // gracefully shutting down\n throw new Error('disconnecting');\n }\n\n const sessionId = previousClient.sessionId;\n this._reserveSeat(sessionId, true, seconds, true);\n\n // keep reconnection reference in case the user reconnects into this room.\n const reconnection = new Deferred<Client>();\n this.reconnections[sessionId] = reconnection;\n\n if (seconds !== Infinity) {\n // expire seat reservation after timeout\n this.reservedSeatTimeouts[sessionId] = setTimeout(() =>\n reconnection.reject(false), seconds * 1000);\n }\n\n const cleanup = () => {\n delete this.reservedSeats[sessionId];\n delete this.reconnections[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n };\n\n reconnection.\n then((newClient) => {\n newClient.auth = previousClient.auth;\n newClient.userData = previousClient.userData;\n previousClient.ref = newClient.ref; // swap \"ref\" for convenience\n previousClient.state = ClientState.RECONNECTED;\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n cleanup();\n }).\n catch(() => {\n cleanup();\n this.resetAutoDisposeTimeout();\n });\n\n return reconnection;\n }\n\n protected resetAutoDisposeTimeout(timeoutInSeconds: number = 1) {\n clearTimeout(this._autoDisposeTimeout);\n\n if (!this.autoDispose) {\n return;\n }\n\n this._autoDisposeTimeout = setTimeout(() => {\n this._autoDisposeTimeout = undefined;\n this._disposeIfEmpty();\n }, timeoutInSeconds * 1000);\n }\n\n private broadcastMessageSchema<T extends Schema>(message: T, options: IBroadcastOptions = {}) {\n const encodedMessage = getMessageBytes[Protocol.ROOM_DATA_SCHEMA](message);\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients[numClients];\n\n if (options.except !== client) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private broadcastMessageType(type: string, message?: any, options: IBroadcastOptions = {}) {\n const encodedMessage = getMessageBytes[Protocol.ROOM_DATA](type, message);\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients[numClients];\n\n if (options.except !== client) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private sendFullState(client: Client): void {\n client.enqueueRaw(getMessageBytes[Protocol.ROOM_STATE](this._serializer.getFullState(client)));\n }\n\n private _dequeueAfterPatchMessages() {\n const length = this._afterNextPatchQueue.length;\n\n if (length > 0) {\n for (let i = 0; i < length; i++) {\n const [target, args] = this._afterNextPatchQueue[i];\n\n if (target === \"broadcast\") {\n this.broadcast.apply(this, args);\n\n } else {\n (target as Client).raw.apply(target, args);\n }\n }\n\n // new messages may have been added in the meantime,\n // let's splice the ones that have been processed\n this._afterNextPatchQueue.splice(0, length);\n }\n }\n\n private async _reserveSeat(\n sessionId: string,\n joinOptions: any = true,\n seconds: number = this.seatReservationTime,\n allowReconnection: boolean = false,\n ) {\n if (!allowReconnection && this.hasReachedMaxClients()) {\n return false;\n }\n\n this.reservedSeats[sessionId] = joinOptions;\n\n if (!allowReconnection) {\n await this._incrementClientCount();\n\n this.reservedSeatTimeouts[sessionId] = setTimeout(async () => {\n delete this.reservedSeats[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n await this._decrementClientCount();\n }, seconds * 1000);\n\n this.resetAutoDisposeTimeout(seconds);\n }\n\n return true;\n }\n\n private _disposeIfEmpty() {\n const willDispose = (\n this.autoDispose &&\n this._autoDisposeTimeout === undefined &&\n this.clients.length === 0 &&\n Object.keys(this.reservedSeats).length === 0\n );\n\n if (willDispose) {\n this._events.emit('dispose');\n }\n\n return willDispose;\n }\n\n private async _dispose(): Promise<any> {\n let userReturnData;\n\n if (this.onDispose) {\n userReturnData = this.onDispose();\n }\n\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (this._simulationInterval) {\n clearInterval(this._simulationInterval);\n this._simulationInterval = undefined;\n }\n\n if (this._autoDisposeTimeout) {\n clearInterval(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // clear all timeouts/intervals + force to stop ticking\n this.clock.clear();\n this.clock.stop();\n\n return await (userReturnData || Promise.resolve());\n }\n\n private _onMessage(client: Client, bytes: number[]) {\n // skip if client is on LEAVING state.\n if (client.state === ClientState.LEAVING) { return; }\n\n const it: Iterator = { offset: 0 };\n const code = decode.uint8(bytes, it);\n\n if (!bytes) {\n debugAndPrintError(`${this.roomName} (${this.roomId}), couldn't decode message: ${bytes}`);\n return;\n }\n\n if (code === Protocol.ROOM_DATA) {\n const messageType = (decode.stringCheck(bytes, it))\n ? decode.string(bytes, it)\n : decode.number(bytes, it);\n\n let message;\n try {\n message = (bytes.length > it.offset)\n ? msgpack.decode(bytes.slice(it.offset, bytes.length))\n : undefined;\n } catch (e) {\n debugAndPrintError(e);\n return;\n }\n\n if (this.onMessageHandlers[messageType]) {\n this.onMessageHandlers[messageType](client, message);\n\n } else if (this.onMessageHandlers['*']) {\n (this.onMessageHandlers['*'] as any)(client, messageType, message);\n\n } else {\n debugAndPrintError(`onMessage for \"${messageType}\" not registered.`);\n }\n\n } else if (code === Protocol.JOIN_ROOM) {\n // join room has been acknowledged by the client\n client.state = ClientState.JOINED;\n\n // send current state when new client joins the room\n if (this.state) {\n this.sendFullState(client);\n }\n\n // dequeue messages sent before client has joined effectively (on user-defined `onJoin`)\n if (client._enqueuedMessages.length > 0) {\n client._enqueuedMessages.forEach((enqueued) => client.raw(enqueued));\n }\n delete client._enqueuedMessages;\n\n } else if (code === Protocol.LEAVE_ROOM) {\n this._forciblyCloseClient(client, Protocol.WS_CLOSE_CONSENTED);\n }\n\n }\n\n private _forciblyCloseClient(client: Client, closeCode: number) {\n // stop receiving messages from this client\n client.ref.removeAllListeners('message');\n\n // prevent \"onLeave\" from being called twice if player asks to leave\n client.ref.removeListener('close', client.ref['onleave']);\n\n // only effectively close connection when \"onLeave\" is fulfilled\n this._onLeave(client, closeCode).then(() => client.leave(Protocol.WS_CLOSE_NORMAL));\n }\n\n private async _onLeave(client: Client, code?: number): Promise<any> {\n const success = spliceOne(this.clients, this.clients.indexOf(client));\n\n // call 'onLeave' method only if the client has been successfully accepted.\n if (success && this.onLeave) {\n try {\n client.state = ClientState.LEAVING;\n await this.onLeave(client, (code === Protocol.WS_CLOSE_CONSENTED));\n\n } catch (e) {\n debugAndPrintError(`onLeave error: ${(e && e.message || e || 'promise rejected')}`);\n }\n }\n\n if (client.state !== ClientState.RECONNECTED) {\n // try to dispose immediatelly if client reconnection isn't set up.\n const willDispose = await this._decrementClientCount();\n\n this._events.emit('leave', client, willDispose);\n }\n }\n\n private async _incrementClientCount() {\n // lock automatically when maxClients is reached\n if (!this._locked && this.hasReachedMaxClients()) {\n this._maxClientsReached = true;\n this.lock.call(this, true);\n }\n\n await this.listing.updateOne({\n $inc: { clients: 1 },\n $set: { locked: this._locked },\n });\n }\n\n private async _decrementClientCount() {\n const willDispose = this._disposeIfEmpty();\n\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n return;\n }\n\n // unlock if room is available for new connections\n if (!willDispose) {\n if (this._maxClientsReached && !this._lockedExplicitly) {\n this._maxClientsReached = false;\n this.unlock.call(this, true);\n }\n\n // update room listing cache\n await this.listing.updateOne({\n $inc: { clients: -1 },\n $set: { locked: this._locked },\n });\n }\n\n return willDispose;\n }\n\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -33,15 +33,15 @@ export declare class LocalPresence implements Presence {
|
|
|
33
33
|
scard(key: string): number;
|
|
34
34
|
sinter(...keys: string[]): Promise<any[]>;
|
|
35
35
|
hset(key: string, field: string, value: string): void;
|
|
36
|
-
hincrby(key: string, field: string, value: number):
|
|
36
|
+
hincrby(key: string, field: string, value: number): number;
|
|
37
37
|
hget(key: string, field: string): Promise<string>;
|
|
38
38
|
hgetall(key: string): Promise<{
|
|
39
39
|
[key: string]: string;
|
|
40
40
|
}>;
|
|
41
41
|
hdel(key: string, field: any): void;
|
|
42
42
|
hlen(key: string): Promise<number>;
|
|
43
|
-
incr(key: string): Promise<
|
|
44
|
-
decr(key: string): Promise<
|
|
43
|
+
incr(key: string): Promise<number>;
|
|
44
|
+
decr(key: string): Promise<number>;
|
|
45
45
|
shutdown(): void;
|
|
46
46
|
}
|
|
47
47
|
export {};
|
|
@@ -117,7 +117,9 @@ class LocalPresence {
|
|
|
117
117
|
this.hash[key] = {};
|
|
118
118
|
}
|
|
119
119
|
const previousValue = Number(this.hash[key][field] || '0');
|
|
120
|
-
|
|
120
|
+
var incrby = (previousValue + value);
|
|
121
|
+
this.hash[key][field] = incrby.toString();
|
|
122
|
+
return incrby;
|
|
121
123
|
}
|
|
122
124
|
async hget(key, field) {
|
|
123
125
|
return this.hash[key] && this.hash[key][field];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalPresence.js","sources":["../../src/presence/LocalPresence.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { spliceOne } from '../Utils';\nimport { Presence } from './Presence';\n\ntype Callback = (...args: any[]) => void;\n\nexport class LocalPresence implements Presence {\n public channels = new EventEmitter();\n\n public data: {[roomName: string]: string[]} = {};\n public hash: {[roomName: string]: {[key: string]: string}} = {};\n\n public keys: {[name: string]: string | number} = {};\n\n protected subscriptions: {[id: string]: Callback[]} = {};\n private timeouts: {[name: string]: NodeJS.Timer} = {};\n\n public subscribe(topic: string, callback: (...args: any[]) => void) {\n if (!this.subscriptions[topic]) { this.subscriptions[topic] = []; }\n this.subscriptions[topic].push(callback);\n this.channels.on(topic, callback);\n return this;\n }\n\n public unsubscribe(topic: string, callback?: Callback) {\n const topicCallbacks = this.subscriptions[topic];\n if (!topicCallbacks) { return; }\n\n if (callback) {\n const idx = topicCallbacks.indexOf(callback);\n if (idx !== -1) {\n topicCallbacks.splice(idx, 1);\n this.channels.removeListener(topic, callback);\n }\n\n if (topicCallbacks.length === 0) {\n delete this.subscriptions[topic];\n }\n\n } else {\n topicCallbacks.forEach((cb) =>\n this.channels.removeListener(topic, cb));\n\n delete this.subscriptions[topic];\n }\n\n return this;\n }\n\n public publish(topic: string, data: any) {\n this.channels.emit(topic, data);\n return this;\n }\n\n public async exists(roomId: string): Promise<boolean> {\n return this.channels.listenerCount(roomId) > 0;\n }\n\n public setex(key: string, value: string, seconds: number) {\n // ensure previous timeout is clear before setting another one.\n if (this.timeouts[key]) {\n clearTimeout(this.timeouts[key]);\n }\n\n this.keys[key] = value;\n this.timeouts[key] = setTimeout(() => {\n delete this.keys[key];\n delete this.timeouts[key];\n }, seconds * 1000);\n }\n\n public get(key: string) {\n return this.keys[key];\n }\n\n public del(key: string) {\n delete this.keys[key];\n delete this.data[key];\n delete this.hash[key];\n }\n\n public sadd(key: string, value: any) {\n if (!this.data[key]) {\n this.data[key] = [];\n }\n\n if (this.data[key].indexOf(value) === -1) {\n this.data[key].push(value);\n }\n }\n\n public async smembers(key: string): Promise<string[]> {\n return this.data[key] || [];\n }\n\n public async sismember(key: string, field: string) {\n return this.data[key] && this.data[key].includes(field) ? 1 : 0;\n }\n\n public srem(key: string, value: any) {\n if (this.data[key]) {\n spliceOne(this.data[key], this.data[key].indexOf(value));\n }\n }\n\n public scard(key: string) {\n return (this.data[key] || []).length;\n }\n\n public async sinter(...keys: string[]) {\n const intersection: {[value: string]: number} = {};\n\n for (let i = 0, l = keys.length; i < l; i++) {\n (await this.smembers(keys[i])).forEach((member) => {\n if (!intersection[member]) {\n intersection[member] = 0;\n }\n\n intersection[member]++;\n });\n }\n\n return Object.keys(intersection).reduce((prev, curr) => {\n if (intersection[curr] > 1) {\n prev.push(curr);\n }\n return prev;\n }, []);\n }\n\n public hset(key: string, field: string, value: string) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n this.hash[key][field] = value;\n }\n\n public hincrby(key: string, field: string, value: number) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n const previousValue = Number(this.hash[key][field] || '0');\n this.hash[key][field] = (previousValue + value).toString();\n }\n\n public async hget(key: string, field: string) {\n return this.hash[key] && this.hash[key][field];\n }\n\n public async hgetall(key: string) {\n return this.hash[key] || {};\n }\n\n public hdel(key: string, field: any) {\n if (this.hash[key]) {\n delete this.hash[key][field];\n }\n }\n\n public async hlen(key: string) {\n return this.hash[key] && Object.keys(this.hash[key]).length || 0;\n }\n\n public async incr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)++;\n return this.keys[key];\n }\n\n public async decr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)--;\n return this.keys[key];\n }\n\n public shutdown() {\n // noop\n }\n\n}\n"],"names":["EventEmitter","spliceOne"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LocalPresence.js","sources":["../../src/presence/LocalPresence.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { spliceOne } from '../Utils';\nimport { Presence } from './Presence';\n\ntype Callback = (...args: any[]) => void;\n\nexport class LocalPresence implements Presence {\n public channels = new EventEmitter();\n\n public data: {[roomName: string]: string[]} = {};\n public hash: {[roomName: string]: {[key: string]: string}} = {};\n\n public keys: {[name: string]: string | number} = {};\n\n protected subscriptions: {[id: string]: Callback[]} = {};\n private timeouts: {[name: string]: NodeJS.Timer} = {};\n\n public subscribe(topic: string, callback: (...args: any[]) => void) {\n if (!this.subscriptions[topic]) { this.subscriptions[topic] = []; }\n this.subscriptions[topic].push(callback);\n this.channels.on(topic, callback);\n return this;\n }\n\n public unsubscribe(topic: string, callback?: Callback) {\n const topicCallbacks = this.subscriptions[topic];\n if (!topicCallbacks) { return; }\n\n if (callback) {\n const idx = topicCallbacks.indexOf(callback);\n if (idx !== -1) {\n topicCallbacks.splice(idx, 1);\n this.channels.removeListener(topic, callback);\n }\n\n if (topicCallbacks.length === 0) {\n delete this.subscriptions[topic];\n }\n\n } else {\n topicCallbacks.forEach((cb) =>\n this.channels.removeListener(topic, cb));\n\n delete this.subscriptions[topic];\n }\n\n return this;\n }\n\n public publish(topic: string, data: any) {\n this.channels.emit(topic, data);\n return this;\n }\n\n public async exists(roomId: string): Promise<boolean> {\n return this.channels.listenerCount(roomId) > 0;\n }\n\n public setex(key: string, value: string, seconds: number) {\n // ensure previous timeout is clear before setting another one.\n if (this.timeouts[key]) {\n clearTimeout(this.timeouts[key]);\n }\n\n this.keys[key] = value;\n this.timeouts[key] = setTimeout(() => {\n delete this.keys[key];\n delete this.timeouts[key];\n }, seconds * 1000);\n }\n\n public get(key: string) {\n return this.keys[key];\n }\n\n public del(key: string) {\n delete this.keys[key];\n delete this.data[key];\n delete this.hash[key];\n }\n\n public sadd(key: string, value: any) {\n if (!this.data[key]) {\n this.data[key] = [];\n }\n\n if (this.data[key].indexOf(value) === -1) {\n this.data[key].push(value);\n }\n }\n\n public async smembers(key: string): Promise<string[]> {\n return this.data[key] || [];\n }\n\n public async sismember(key: string, field: string) {\n return this.data[key] && this.data[key].includes(field) ? 1 : 0;\n }\n\n public srem(key: string, value: any) {\n if (this.data[key]) {\n spliceOne(this.data[key], this.data[key].indexOf(value));\n }\n }\n\n public scard(key: string) {\n return (this.data[key] || []).length;\n }\n\n public async sinter(...keys: string[]) {\n const intersection: {[value: string]: number} = {};\n\n for (let i = 0, l = keys.length; i < l; i++) {\n (await this.smembers(keys[i])).forEach((member) => {\n if (!intersection[member]) {\n intersection[member] = 0;\n }\n\n intersection[member]++;\n });\n }\n\n return Object.keys(intersection).reduce((prev, curr) => {\n if (intersection[curr] > 1) {\n prev.push(curr);\n }\n return prev;\n }, []);\n }\n\n public hset(key: string, field: string, value: string) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n this.hash[key][field] = value;\n }\n\n public hincrby(key: string, field: string, value: number) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n const previousValue = Number(this.hash[key][field] || '0');\n var incrby = (previousValue + value);\n this.hash[key][field] = incrby.toString();\n return incrby;\n }\n\n public async hget(key: string, field: string) {\n return this.hash[key] && this.hash[key][field];\n }\n\n public async hgetall(key: string) {\n return this.hash[key] || {};\n }\n\n public hdel(key: string, field: any) {\n if (this.hash[key]) {\n delete this.hash[key][field];\n }\n }\n\n public async hlen(key: string) {\n return this.hash[key] && Object.keys(this.hash[key]).length || 0;\n }\n\n public async incr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)++;\n return this.keys[key] as number;\n }\n\n public async decr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)--;\n return this.keys[key] as number;\n }\n\n public shutdown() {\n // noop\n }\n\n}\n"],"names":["EventEmitter","spliceOne"],"mappings":"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"}
|
|
@@ -113,7 +113,9 @@ class LocalPresence {
|
|
|
113
113
|
this.hash[key] = {};
|
|
114
114
|
}
|
|
115
115
|
const previousValue = Number(this.hash[key][field] || '0');
|
|
116
|
-
|
|
116
|
+
var incrby = (previousValue + value);
|
|
117
|
+
this.hash[key][field] = incrby.toString();
|
|
118
|
+
return incrby;
|
|
117
119
|
}
|
|
118
120
|
async hget(key, field) {
|
|
119
121
|
return this.hash[key] && this.hash[key][field];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalPresence.mjs","sources":["../../src/presence/LocalPresence.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { spliceOne } from '../Utils';\nimport { Presence } from './Presence';\n\ntype Callback = (...args: any[]) => void;\n\nexport class LocalPresence implements Presence {\n public channels = new EventEmitter();\n\n public data: {[roomName: string]: string[]} = {};\n public hash: {[roomName: string]: {[key: string]: string}} = {};\n\n public keys: {[name: string]: string | number} = {};\n\n protected subscriptions: {[id: string]: Callback[]} = {};\n private timeouts: {[name: string]: NodeJS.Timer} = {};\n\n public subscribe(topic: string, callback: (...args: any[]) => void) {\n if (!this.subscriptions[topic]) { this.subscriptions[topic] = []; }\n this.subscriptions[topic].push(callback);\n this.channels.on(topic, callback);\n return this;\n }\n\n public unsubscribe(topic: string, callback?: Callback) {\n const topicCallbacks = this.subscriptions[topic];\n if (!topicCallbacks) { return; }\n\n if (callback) {\n const idx = topicCallbacks.indexOf(callback);\n if (idx !== -1) {\n topicCallbacks.splice(idx, 1);\n this.channels.removeListener(topic, callback);\n }\n\n if (topicCallbacks.length === 0) {\n delete this.subscriptions[topic];\n }\n\n } else {\n topicCallbacks.forEach((cb) =>\n this.channels.removeListener(topic, cb));\n\n delete this.subscriptions[topic];\n }\n\n return this;\n }\n\n public publish(topic: string, data: any) {\n this.channels.emit(topic, data);\n return this;\n }\n\n public async exists(roomId: string): Promise<boolean> {\n return this.channels.listenerCount(roomId) > 0;\n }\n\n public setex(key: string, value: string, seconds: number) {\n // ensure previous timeout is clear before setting another one.\n if (this.timeouts[key]) {\n clearTimeout(this.timeouts[key]);\n }\n\n this.keys[key] = value;\n this.timeouts[key] = setTimeout(() => {\n delete this.keys[key];\n delete this.timeouts[key];\n }, seconds * 1000);\n }\n\n public get(key: string) {\n return this.keys[key];\n }\n\n public del(key: string) {\n delete this.keys[key];\n delete this.data[key];\n delete this.hash[key];\n }\n\n public sadd(key: string, value: any) {\n if (!this.data[key]) {\n this.data[key] = [];\n }\n\n if (this.data[key].indexOf(value) === -1) {\n this.data[key].push(value);\n }\n }\n\n public async smembers(key: string): Promise<string[]> {\n return this.data[key] || [];\n }\n\n public async sismember(key: string, field: string) {\n return this.data[key] && this.data[key].includes(field) ? 1 : 0;\n }\n\n public srem(key: string, value: any) {\n if (this.data[key]) {\n spliceOne(this.data[key], this.data[key].indexOf(value));\n }\n }\n\n public scard(key: string) {\n return (this.data[key] || []).length;\n }\n\n public async sinter(...keys: string[]) {\n const intersection: {[value: string]: number} = {};\n\n for (let i = 0, l = keys.length; i < l; i++) {\n (await this.smembers(keys[i])).forEach((member) => {\n if (!intersection[member]) {\n intersection[member] = 0;\n }\n\n intersection[member]++;\n });\n }\n\n return Object.keys(intersection).reduce((prev, curr) => {\n if (intersection[curr] > 1) {\n prev.push(curr);\n }\n return prev;\n }, []);\n }\n\n public hset(key: string, field: string, value: string) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n this.hash[key][field] = value;\n }\n\n public hincrby(key: string, field: string, value: number) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n const previousValue = Number(this.hash[key][field] || '0');\n this.hash[key][field] = (previousValue + value).toString();\n }\n\n public async hget(key: string, field: string) {\n return this.hash[key] && this.hash[key][field];\n }\n\n public async hgetall(key: string) {\n return this.hash[key] || {};\n }\n\n public hdel(key: string, field: any) {\n if (this.hash[key]) {\n delete this.hash[key][field];\n }\n }\n\n public async hlen(key: string) {\n return this.hash[key] && Object.keys(this.hash[key]).length || 0;\n }\n\n public async incr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)++;\n return this.keys[key];\n }\n\n public async decr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)--;\n return this.keys[key];\n }\n\n public shutdown() {\n // noop\n }\n\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LocalPresence.mjs","sources":["../../src/presence/LocalPresence.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { spliceOne } from '../Utils';\nimport { Presence } from './Presence';\n\ntype Callback = (...args: any[]) => void;\n\nexport class LocalPresence implements Presence {\n public channels = new EventEmitter();\n\n public data: {[roomName: string]: string[]} = {};\n public hash: {[roomName: string]: {[key: string]: string}} = {};\n\n public keys: {[name: string]: string | number} = {};\n\n protected subscriptions: {[id: string]: Callback[]} = {};\n private timeouts: {[name: string]: NodeJS.Timer} = {};\n\n public subscribe(topic: string, callback: (...args: any[]) => void) {\n if (!this.subscriptions[topic]) { this.subscriptions[topic] = []; }\n this.subscriptions[topic].push(callback);\n this.channels.on(topic, callback);\n return this;\n }\n\n public unsubscribe(topic: string, callback?: Callback) {\n const topicCallbacks = this.subscriptions[topic];\n if (!topicCallbacks) { return; }\n\n if (callback) {\n const idx = topicCallbacks.indexOf(callback);\n if (idx !== -1) {\n topicCallbacks.splice(idx, 1);\n this.channels.removeListener(topic, callback);\n }\n\n if (topicCallbacks.length === 0) {\n delete this.subscriptions[topic];\n }\n\n } else {\n topicCallbacks.forEach((cb) =>\n this.channels.removeListener(topic, cb));\n\n delete this.subscriptions[topic];\n }\n\n return this;\n }\n\n public publish(topic: string, data: any) {\n this.channels.emit(topic, data);\n return this;\n }\n\n public async exists(roomId: string): Promise<boolean> {\n return this.channels.listenerCount(roomId) > 0;\n }\n\n public setex(key: string, value: string, seconds: number) {\n // ensure previous timeout is clear before setting another one.\n if (this.timeouts[key]) {\n clearTimeout(this.timeouts[key]);\n }\n\n this.keys[key] = value;\n this.timeouts[key] = setTimeout(() => {\n delete this.keys[key];\n delete this.timeouts[key];\n }, seconds * 1000);\n }\n\n public get(key: string) {\n return this.keys[key];\n }\n\n public del(key: string) {\n delete this.keys[key];\n delete this.data[key];\n delete this.hash[key];\n }\n\n public sadd(key: string, value: any) {\n if (!this.data[key]) {\n this.data[key] = [];\n }\n\n if (this.data[key].indexOf(value) === -1) {\n this.data[key].push(value);\n }\n }\n\n public async smembers(key: string): Promise<string[]> {\n return this.data[key] || [];\n }\n\n public async sismember(key: string, field: string) {\n return this.data[key] && this.data[key].includes(field) ? 1 : 0;\n }\n\n public srem(key: string, value: any) {\n if (this.data[key]) {\n spliceOne(this.data[key], this.data[key].indexOf(value));\n }\n }\n\n public scard(key: string) {\n return (this.data[key] || []).length;\n }\n\n public async sinter(...keys: string[]) {\n const intersection: {[value: string]: number} = {};\n\n for (let i = 0, l = keys.length; i < l; i++) {\n (await this.smembers(keys[i])).forEach((member) => {\n if (!intersection[member]) {\n intersection[member] = 0;\n }\n\n intersection[member]++;\n });\n }\n\n return Object.keys(intersection).reduce((prev, curr) => {\n if (intersection[curr] > 1) {\n prev.push(curr);\n }\n return prev;\n }, []);\n }\n\n public hset(key: string, field: string, value: string) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n this.hash[key][field] = value;\n }\n\n public hincrby(key: string, field: string, value: number) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n const previousValue = Number(this.hash[key][field] || '0');\n var incrby = (previousValue + value);\n this.hash[key][field] = incrby.toString();\n return incrby;\n }\n\n public async hget(key: string, field: string) {\n return this.hash[key] && this.hash[key][field];\n }\n\n public async hgetall(key: string) {\n return this.hash[key] || {};\n }\n\n public hdel(key: string, field: any) {\n if (this.hash[key]) {\n delete this.hash[key][field];\n }\n }\n\n public async hlen(key: string) {\n return this.hash[key] && Object.keys(this.hash[key]).length || 0;\n }\n\n public async incr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)++;\n return this.keys[key] as number;\n }\n\n public async decr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)--;\n return this.keys[key] as number;\n }\n\n public shutdown() {\n // noop\n }\n\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ export interface Presence {
|
|
|
13
13
|
scard(key: string): any;
|
|
14
14
|
sinter(...keys: string[]): Promise<string[]>;
|
|
15
15
|
hset(key: string, field: string, value: string): any;
|
|
16
|
-
hincrby(key: string, field: string, value: number):
|
|
16
|
+
hincrby(key: string, field: string, value: number): number | Promise<number>;
|
|
17
17
|
hget(key: string, field: string): Promise<string>;
|
|
18
18
|
hgetall(key: string): Promise<{
|
|
19
19
|
[key: string]: string;
|
package/build/utils/Utils.js
CHANGED
|
@@ -32,9 +32,11 @@ __export(Utils_exports, {
|
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(Utils_exports);
|
|
34
34
|
var import_nanoid = __toESM(require("nanoid"));
|
|
35
|
+
var import_msgpackr = require("msgpackr");
|
|
35
36
|
var import_Debug = require("../Debug");
|
|
36
37
|
var import_events = require("events");
|
|
37
38
|
var import_Logger = require("../Logger");
|
|
39
|
+
var import_schema = require("@colyseus/schema");
|
|
38
40
|
const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2e3);
|
|
39
41
|
function generateId(length = 9) {
|
|
40
42
|
return (0, import_nanoid.default)(length);
|
|
@@ -212,6 +214,16 @@ class HybridArray {
|
|
|
212
214
|
}
|
|
213
215
|
class DummyServer extends import_events.EventEmitter {
|
|
214
216
|
}
|
|
217
|
+
(0, import_msgpackr.addExtension)({
|
|
218
|
+
Class: import_schema.Schema,
|
|
219
|
+
type: 0,
|
|
220
|
+
read(datum) {
|
|
221
|
+
return datum;
|
|
222
|
+
},
|
|
223
|
+
write(instance) {
|
|
224
|
+
return instance.toJSON();
|
|
225
|
+
}
|
|
226
|
+
});
|
|
215
227
|
// Annotate the CommonJS export names for ESM import in node:
|
|
216
228
|
0 && (module.exports = {
|
|
217
229
|
Deferred,
|
package/build/utils/Utils.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/Utils.ts"],
|
|
4
|
-
"sourcesContent": ["import nanoid from 'nanoid';\n\nimport { debugAndPrintError } from '../Debug';\nimport { EventEmitter } from \"events\";\nimport { ServerOpts, Socket } from \"net\";\nimport { logger } from '../Logger';\n\n// remote room call timeouts\nexport const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2000);\n\nexport function generateId(length: number = 9) {\n return nanoid(length);\n}\n\n//\n// nodemon sends SIGUSR2 before reloading\n// (https://github.com/remy/nodemon#controlling-shutdown-of-your-script)\n//\nconst signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGUSR2'];\n\nexport function registerGracefulShutdown(callback: (err?: Error) => void) {\n /**\n * Gracefully shutdown on uncaught errors\n */\n process.on('uncaughtException', (err) => {\n debugAndPrintError(err);\n callback(err);\n });\n\n signals.forEach((signal) =>\n process.once(signal, () => callback()));\n}\n\nexport function retry<T = any>(\n cb: Function,\n maxRetries: number = 3,\n errorWhiteList: any[] = [],\n retries: number = 0,\n) {\n return new Promise<T>((resolve, reject) => {\n cb()\n .then(resolve)\n .catch((e) => {\n if (\n errorWhiteList.indexOf(e.constructor) !== -1 &&\n retries++ < maxRetries\n ) {\n setTimeout(() => {\n retry<T>(cb, maxRetries, errorWhiteList, retries).\n then(resolve).\n catch((e2) => reject(e2));\n }, Math.floor(Math.random() * Math.pow(2, retries) * 400));\n\n } else {\n reject(e);\n }\n });\n });\n}\n\nexport function spliceOne(arr: any[], index: number): boolean {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n return true;\n}\n\nexport class Deferred<T= any> {\n public promise: Promise<T>;\n\n public resolve: Function;\n public reject: Function;\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n public then(func: (value: T) => any) {\n return this.promise.then.apply(this.promise, arguments);\n }\n\n public catch(func: (value: any) => any) {\n return this.promise.catch(func);\n }\n\n}\n\nexport function merge(a: any, ...objs: any[]): any {\n for (let i = 0, len = objs.length; i < len; i++) {\n const b = objs[i];\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n a[key] = b[key];\n }\n }\n }\n return a;\n}\n\nexport class HybridArray<T> {\n public uniqueProperty: string;\n public hashedArray: { [key: string]: T } = {};\n public array: T[] = [];\n\n constructor(uniquePropertyName: string, items?: T[]) {\n this.uniqueProperty = uniquePropertyName;\n if (items) {\n this.array = this.array.concat(items);\n for (const element of items) {\n this.hashedArray[element[this.uniqueProperty]] = element;\n }\n }\n }\n\n public get length(): number {\n return this.array.length;\n }\n\n public add(item: T) {\n if (!this.hashedArray[item[this.uniqueProperty]]) {\n this.array.push(item);\n this.hashedArray[item[this.uniqueProperty]] = item;\n\n } else {\n logger.warn(`.add(): element already exists:`, item[this.uniqueProperty]);\n }\n }\n\n public at(index: number): T | undefined {\n if (index >= this.array.length) {\n this._badIndexWarning(index);\n\n } else {\n return this.array[index];\n }\n }\n\n public concat(items: T[]) {\n if (items) {\n for (const item of items) {\n this.hashedArray[item[this.uniqueProperty]] = item;\n }\n this.array.concat(items);\n }\n return this;\n }\n\n public find<S extends T>(predicate: (this: void, value: T, index: number, obj: T[]) => value is S, thisArg?: any): S;\n public find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T;\n public find(predicate: any, thisArg?: any): T | undefined {\n return this.array.find(predicate, thisArg);\n }\n\n public filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[]\n public filter<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[] {\n return this.array.filter(predicate, thisArg);\n }\n\n public forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void {\n Array.prototype.forEach.call(this.array, callbackfn);\n }\n\n public get(key: string): T | undefined {\n return this.hashedArray[key];\n }\n\n public includes(element: T) {\n return this.hashedArray[element[this.uniqueProperty]] !== undefined;\n }\n\n public indexOf(element: T): number {\n return this.array.indexOf(element);\n }\n\n public map<U>(callback: (value: T, index: number, array: T[]) => U) {\n const result: U[] = [];\n for (let index = 0; index < this.array.length; index++) {\n result.push(callback(this.array[index], index, this.array));\n }\n return result;\n }\n\n public deleteAt(index: number) {\n if (index >= this.array.length) {\n this._badIndexWarning(index);\n return undefined;\n\n } else {\n const removable = this.spliceOne(index);\n delete this.hashedArray[removable[this.uniqueProperty]];\n return removable;\n }\n }\n\n public deleteByKey(key: string): T {\n if (!this.hashedArray[key]) {\n logger.error(`deleteByKey(): no such element for '${key}'.`);\n return undefined;\n } else {\n const removable = this.spliceOne(this.indexOf(this.hashedArray[key]));\n delete this.hashedArray[key];\n return removable;\n }\n }\n\n public delete(obj: T): T {\n if (this.hashedArray[obj[this.uniqueProperty]]) {\n return this.deleteByKey(obj[this.uniqueProperty]);\n\n } else if (this.indexOf(obj) != -1) {\n return this.deleteAt(this.indexOf(obj));\n\n } else {\n return undefined;\n }\n }\n\n private _badIndexWarning(index) {\n logger.warn(`Index out of range, index: ${index}`);\n }\n\n private spliceOne(index: number): T {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= this.array.length) {\n this._badIndexWarning(index);\n return undefined;\n }\n\n const itemRemoved = this.array[index];\n\n const len = this.array.length - 1;\n for (let i = index; i < len; i++) {\n this.array[i] = this.array[i + 1];\n }\n this.array.length = len;\n\n return itemRemoved;\n }\n}\n\nexport declare interface DummyServer {\n constructor(options?: ServerOpts, connectionListener?: (socket: Socket) => void);\n\n listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this;\n close(callback?: (err?: Error) => void): this;\n}\n\nexport class DummyServer extends EventEmitter {}"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAmB;
|
|
4
|
+
"sourcesContent": ["import nanoid from 'nanoid';\nimport { addExtension } from 'msgpackr';\n\nimport { debugAndPrintError } from '../Debug';\nimport { EventEmitter } from \"events\";\nimport { ServerOpts, Socket } from \"net\";\nimport { logger } from '../Logger';\nimport { Schema } from \"@colyseus/schema\";\n\n// remote room call timeouts\nexport const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2000);\n\nexport function generateId(length: number = 9) {\n return nanoid(length);\n}\n\n//\n// nodemon sends SIGUSR2 before reloading\n// (https://github.com/remy/nodemon#controlling-shutdown-of-your-script)\n//\nconst signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGUSR2'];\n\nexport function registerGracefulShutdown(callback: (err?: Error) => void) {\n /**\n * Gracefully shutdown on uncaught errors\n */\n process.on('uncaughtException', (err) => {\n debugAndPrintError(err);\n callback(err);\n });\n\n signals.forEach((signal) =>\n process.once(signal, () => callback()));\n}\n\nexport function retry<T = any>(\n cb: Function,\n maxRetries: number = 3,\n errorWhiteList: any[] = [],\n retries: number = 0,\n) {\n return new Promise<T>((resolve, reject) => {\n cb()\n .then(resolve)\n .catch((e) => {\n if (\n errorWhiteList.indexOf(e.constructor) !== -1 &&\n retries++ < maxRetries\n ) {\n setTimeout(() => {\n retry<T>(cb, maxRetries, errorWhiteList, retries).\n then(resolve).\n catch((e2) => reject(e2));\n }, Math.floor(Math.random() * Math.pow(2, retries) * 400));\n\n } else {\n reject(e);\n }\n });\n });\n}\n\nexport function spliceOne(arr: any[], index: number): boolean {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n return true;\n}\n\nexport class Deferred<T= any> {\n public promise: Promise<T>;\n\n public resolve: Function;\n public reject: Function;\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n public then(func: (value: T) => any) {\n return this.promise.then.apply(this.promise, arguments);\n }\n\n public catch(func: (value: any) => any) {\n return this.promise.catch(func);\n }\n\n}\n\nexport function merge(a: any, ...objs: any[]): any {\n for (let i = 0, len = objs.length; i < len; i++) {\n const b = objs[i];\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n a[key] = b[key];\n }\n }\n }\n return a;\n}\n\nexport class HybridArray<T> {\n public uniqueProperty: string;\n public hashedArray: { [key: string]: T } = {};\n public array: T[] = [];\n\n constructor(uniquePropertyName: string, items?: T[]) {\n this.uniqueProperty = uniquePropertyName;\n if (items) {\n this.array = this.array.concat(items);\n for (const element of items) {\n this.hashedArray[element[this.uniqueProperty]] = element;\n }\n }\n }\n\n public get length(): number {\n return this.array.length;\n }\n\n public add(item: T) {\n if (!this.hashedArray[item[this.uniqueProperty]]) {\n this.array.push(item);\n this.hashedArray[item[this.uniqueProperty]] = item;\n\n } else {\n logger.warn(`.add(): element already exists:`, item[this.uniqueProperty]);\n }\n }\n\n public at(index: number): T | undefined {\n if (index >= this.array.length) {\n this._badIndexWarning(index);\n\n } else {\n return this.array[index];\n }\n }\n\n public concat(items: T[]) {\n if (items) {\n for (const item of items) {\n this.hashedArray[item[this.uniqueProperty]] = item;\n }\n this.array.concat(items);\n }\n return this;\n }\n\n public find<S extends T>(predicate: (this: void, value: T, index: number, obj: T[]) => value is S, thisArg?: any): S;\n public find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T;\n public find(predicate: any, thisArg?: any): T | undefined {\n return this.array.find(predicate, thisArg);\n }\n\n public filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[]\n public filter<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[] {\n return this.array.filter(predicate, thisArg);\n }\n\n public forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void {\n Array.prototype.forEach.call(this.array, callbackfn);\n }\n\n public get(key: string): T | undefined {\n return this.hashedArray[key];\n }\n\n public includes(element: T) {\n return this.hashedArray[element[this.uniqueProperty]] !== undefined;\n }\n\n public indexOf(element: T): number {\n return this.array.indexOf(element);\n }\n\n public map<U>(callback: (value: T, index: number, array: T[]) => U) {\n const result: U[] = [];\n for (let index = 0; index < this.array.length; index++) {\n result.push(callback(this.array[index], index, this.array));\n }\n return result;\n }\n\n public deleteAt(index: number) {\n if (index >= this.array.length) {\n this._badIndexWarning(index);\n return undefined;\n\n } else {\n const removable = this.spliceOne(index);\n delete this.hashedArray[removable[this.uniqueProperty]];\n return removable;\n }\n }\n\n public deleteByKey(key: string): T {\n if (!this.hashedArray[key]) {\n logger.error(`deleteByKey(): no such element for '${key}'.`);\n return undefined;\n } else {\n const removable = this.spliceOne(this.indexOf(this.hashedArray[key]));\n delete this.hashedArray[key];\n return removable;\n }\n }\n\n public delete(obj: T): T {\n if (this.hashedArray[obj[this.uniqueProperty]]) {\n return this.deleteByKey(obj[this.uniqueProperty]);\n\n } else if (this.indexOf(obj) != -1) {\n return this.deleteAt(this.indexOf(obj));\n\n } else {\n return undefined;\n }\n }\n\n private _badIndexWarning(index) {\n logger.warn(`Index out of range, index: ${index}`);\n }\n\n private spliceOne(index: number): T {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= this.array.length) {\n this._badIndexWarning(index);\n return undefined;\n }\n\n const itemRemoved = this.array[index];\n\n const len = this.array.length - 1;\n for (let i = index; i < len; i++) {\n this.array[i] = this.array[i + 1];\n }\n this.array.length = len;\n\n return itemRemoved;\n }\n}\n\nexport declare interface DummyServer {\n constructor(options?: ServerOpts, connectionListener?: (socket: Socket) => void);\n\n listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this;\n close(callback?: (err?: Error) => void): this;\n}\n\nexport class DummyServer extends EventEmitter {}\n\n// Add msgpackr extension to avoid circular references when encoding\n// https://github.com/kriszyp/msgpackr#custom-extensions\naddExtension({\n Class: Schema,\n type: 0,\n\n read(datum: any): any {\n return datum;\n },\n\n write(instance: any): any {\n return instance.toJSON();\n }\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/build/utils/Utils.mjs
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import nanoid from "nanoid";
|
|
2
|
+
import { addExtension } from "msgpackr";
|
|
2
3
|
import { debugAndPrintError } from "../Debug";
|
|
3
4
|
import { EventEmitter } from "events";
|
|
4
5
|
import { logger } from "../Logger";
|
|
6
|
+
import { Schema } from "@colyseus/schema";
|
|
5
7
|
const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2e3);
|
|
6
8
|
function generateId(length = 9) {
|
|
7
9
|
return nanoid(length);
|
|
@@ -179,6 +181,16 @@ class HybridArray {
|
|
|
179
181
|
}
|
|
180
182
|
class DummyServer extends EventEmitter {
|
|
181
183
|
}
|
|
184
|
+
addExtension({
|
|
185
|
+
Class: Schema,
|
|
186
|
+
type: 0,
|
|
187
|
+
read(datum) {
|
|
188
|
+
return datum;
|
|
189
|
+
},
|
|
190
|
+
write(instance) {
|
|
191
|
+
return instance.toJSON();
|
|
192
|
+
}
|
|
193
|
+
});
|
|
182
194
|
export {
|
|
183
195
|
Deferred,
|
|
184
196
|
DummyServer,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/Utils.ts"],
|
|
4
|
-
"sourcesContent": ["import nanoid from 'nanoid';\n\nimport { debugAndPrintError } from '../Debug';\nimport { EventEmitter } from \"events\";\nimport { ServerOpts, Socket } from \"net\";\nimport { logger } from '../Logger';\n\n// remote room call timeouts\nexport const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2000);\n\nexport function generateId(length: number = 9) {\n return nanoid(length);\n}\n\n//\n// nodemon sends SIGUSR2 before reloading\n// (https://github.com/remy/nodemon#controlling-shutdown-of-your-script)\n//\nconst signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGUSR2'];\n\nexport function registerGracefulShutdown(callback: (err?: Error) => void) {\n /**\n * Gracefully shutdown on uncaught errors\n */\n process.on('uncaughtException', (err) => {\n debugAndPrintError(err);\n callback(err);\n });\n\n signals.forEach((signal) =>\n process.once(signal, () => callback()));\n}\n\nexport function retry<T = any>(\n cb: Function,\n maxRetries: number = 3,\n errorWhiteList: any[] = [],\n retries: number = 0,\n) {\n return new Promise<T>((resolve, reject) => {\n cb()\n .then(resolve)\n .catch((e) => {\n if (\n errorWhiteList.indexOf(e.constructor) !== -1 &&\n retries++ < maxRetries\n ) {\n setTimeout(() => {\n retry<T>(cb, maxRetries, errorWhiteList, retries).\n then(resolve).\n catch((e2) => reject(e2));\n }, Math.floor(Math.random() * Math.pow(2, retries) * 400));\n\n } else {\n reject(e);\n }\n });\n });\n}\n\nexport function spliceOne(arr: any[], index: number): boolean {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n return true;\n}\n\nexport class Deferred<T= any> {\n public promise: Promise<T>;\n\n public resolve: Function;\n public reject: Function;\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n public then(func: (value: T) => any) {\n return this.promise.then.apply(this.promise, arguments);\n }\n\n public catch(func: (value: any) => any) {\n return this.promise.catch(func);\n }\n\n}\n\nexport function merge(a: any, ...objs: any[]): any {\n for (let i = 0, len = objs.length; i < len; i++) {\n const b = objs[i];\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n a[key] = b[key];\n }\n }\n }\n return a;\n}\n\nexport class HybridArray<T> {\n public uniqueProperty: string;\n public hashedArray: { [key: string]: T } = {};\n public array: T[] = [];\n\n constructor(uniquePropertyName: string, items?: T[]) {\n this.uniqueProperty = uniquePropertyName;\n if (items) {\n this.array = this.array.concat(items);\n for (const element of items) {\n this.hashedArray[element[this.uniqueProperty]] = element;\n }\n }\n }\n\n public get length(): number {\n return this.array.length;\n }\n\n public add(item: T) {\n if (!this.hashedArray[item[this.uniqueProperty]]) {\n this.array.push(item);\n this.hashedArray[item[this.uniqueProperty]] = item;\n\n } else {\n logger.warn(`.add(): element already exists:`, item[this.uniqueProperty]);\n }\n }\n\n public at(index: number): T | undefined {\n if (index >= this.array.length) {\n this._badIndexWarning(index);\n\n } else {\n return this.array[index];\n }\n }\n\n public concat(items: T[]) {\n if (items) {\n for (const item of items) {\n this.hashedArray[item[this.uniqueProperty]] = item;\n }\n this.array.concat(items);\n }\n return this;\n }\n\n public find<S extends T>(predicate: (this: void, value: T, index: number, obj: T[]) => value is S, thisArg?: any): S;\n public find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T;\n public find(predicate: any, thisArg?: any): T | undefined {\n return this.array.find(predicate, thisArg);\n }\n\n public filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[]\n public filter<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[] {\n return this.array.filter(predicate, thisArg);\n }\n\n public forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void {\n Array.prototype.forEach.call(this.array, callbackfn);\n }\n\n public get(key: string): T | undefined {\n return this.hashedArray[key];\n }\n\n public includes(element: T) {\n return this.hashedArray[element[this.uniqueProperty]] !== undefined;\n }\n\n public indexOf(element: T): number {\n return this.array.indexOf(element);\n }\n\n public map<U>(callback: (value: T, index: number, array: T[]) => U) {\n const result: U[] = [];\n for (let index = 0; index < this.array.length; index++) {\n result.push(callback(this.array[index], index, this.array));\n }\n return result;\n }\n\n public deleteAt(index: number) {\n if (index >= this.array.length) {\n this._badIndexWarning(index);\n return undefined;\n\n } else {\n const removable = this.spliceOne(index);\n delete this.hashedArray[removable[this.uniqueProperty]];\n return removable;\n }\n }\n\n public deleteByKey(key: string): T {\n if (!this.hashedArray[key]) {\n logger.error(`deleteByKey(): no such element for '${key}'.`);\n return undefined;\n } else {\n const removable = this.spliceOne(this.indexOf(this.hashedArray[key]));\n delete this.hashedArray[key];\n return removable;\n }\n }\n\n public delete(obj: T): T {\n if (this.hashedArray[obj[this.uniqueProperty]]) {\n return this.deleteByKey(obj[this.uniqueProperty]);\n\n } else if (this.indexOf(obj) != -1) {\n return this.deleteAt(this.indexOf(obj));\n\n } else {\n return undefined;\n }\n }\n\n private _badIndexWarning(index) {\n logger.warn(`Index out of range, index: ${index}`);\n }\n\n private spliceOne(index: number): T {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= this.array.length) {\n this._badIndexWarning(index);\n return undefined;\n }\n\n const itemRemoved = this.array[index];\n\n const len = this.array.length - 1;\n for (let i = index; i < len; i++) {\n this.array[i] = this.array[i + 1];\n }\n this.array.length = len;\n\n return itemRemoved;\n }\n}\n\nexport declare interface DummyServer {\n constructor(options?: ServerOpts, connectionListener?: (socket: Socket) => void);\n\n listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this;\n close(callback?: (err?: Error) => void): this;\n}\n\nexport class DummyServer extends EventEmitter {}"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import nanoid from 'nanoid';\nimport { addExtension } from 'msgpackr';\n\nimport { debugAndPrintError } from '../Debug';\nimport { EventEmitter } from \"events\";\nimport { ServerOpts, Socket } from \"net\";\nimport { logger } from '../Logger';\nimport { Schema } from \"@colyseus/schema\";\n\n// remote room call timeouts\nexport const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2000);\n\nexport function generateId(length: number = 9) {\n return nanoid(length);\n}\n\n//\n// nodemon sends SIGUSR2 before reloading\n// (https://github.com/remy/nodemon#controlling-shutdown-of-your-script)\n//\nconst signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGUSR2'];\n\nexport function registerGracefulShutdown(callback: (err?: Error) => void) {\n /**\n * Gracefully shutdown on uncaught errors\n */\n process.on('uncaughtException', (err) => {\n debugAndPrintError(err);\n callback(err);\n });\n\n signals.forEach((signal) =>\n process.once(signal, () => callback()));\n}\n\nexport function retry<T = any>(\n cb: Function,\n maxRetries: number = 3,\n errorWhiteList: any[] = [],\n retries: number = 0,\n) {\n return new Promise<T>((resolve, reject) => {\n cb()\n .then(resolve)\n .catch((e) => {\n if (\n errorWhiteList.indexOf(e.constructor) !== -1 &&\n retries++ < maxRetries\n ) {\n setTimeout(() => {\n retry<T>(cb, maxRetries, errorWhiteList, retries).\n then(resolve).\n catch((e2) => reject(e2));\n }, Math.floor(Math.random() * Math.pow(2, retries) * 400));\n\n } else {\n reject(e);\n }\n });\n });\n}\n\nexport function spliceOne(arr: any[], index: number): boolean {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n return true;\n}\n\nexport class Deferred<T= any> {\n public promise: Promise<T>;\n\n public resolve: Function;\n public reject: Function;\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n public then(func: (value: T) => any) {\n return this.promise.then.apply(this.promise, arguments);\n }\n\n public catch(func: (value: any) => any) {\n return this.promise.catch(func);\n }\n\n}\n\nexport function merge(a: any, ...objs: any[]): any {\n for (let i = 0, len = objs.length; i < len; i++) {\n const b = objs[i];\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n a[key] = b[key];\n }\n }\n }\n return a;\n}\n\nexport class HybridArray<T> {\n public uniqueProperty: string;\n public hashedArray: { [key: string]: T } = {};\n public array: T[] = [];\n\n constructor(uniquePropertyName: string, items?: T[]) {\n this.uniqueProperty = uniquePropertyName;\n if (items) {\n this.array = this.array.concat(items);\n for (const element of items) {\n this.hashedArray[element[this.uniqueProperty]] = element;\n }\n }\n }\n\n public get length(): number {\n return this.array.length;\n }\n\n public add(item: T) {\n if (!this.hashedArray[item[this.uniqueProperty]]) {\n this.array.push(item);\n this.hashedArray[item[this.uniqueProperty]] = item;\n\n } else {\n logger.warn(`.add(): element already exists:`, item[this.uniqueProperty]);\n }\n }\n\n public at(index: number): T | undefined {\n if (index >= this.array.length) {\n this._badIndexWarning(index);\n\n } else {\n return this.array[index];\n }\n }\n\n public concat(items: T[]) {\n if (items) {\n for (const item of items) {\n this.hashedArray[item[this.uniqueProperty]] = item;\n }\n this.array.concat(items);\n }\n return this;\n }\n\n public find<S extends T>(predicate: (this: void, value: T, index: number, obj: T[]) => value is S, thisArg?: any): S;\n public find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T;\n public find(predicate: any, thisArg?: any): T | undefined {\n return this.array.find(predicate, thisArg);\n }\n\n public filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[]\n public filter<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[] {\n return this.array.filter(predicate, thisArg);\n }\n\n public forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void {\n Array.prototype.forEach.call(this.array, callbackfn);\n }\n\n public get(key: string): T | undefined {\n return this.hashedArray[key];\n }\n\n public includes(element: T) {\n return this.hashedArray[element[this.uniqueProperty]] !== undefined;\n }\n\n public indexOf(element: T): number {\n return this.array.indexOf(element);\n }\n\n public map<U>(callback: (value: T, index: number, array: T[]) => U) {\n const result: U[] = [];\n for (let index = 0; index < this.array.length; index++) {\n result.push(callback(this.array[index], index, this.array));\n }\n return result;\n }\n\n public deleteAt(index: number) {\n if (index >= this.array.length) {\n this._badIndexWarning(index);\n return undefined;\n\n } else {\n const removable = this.spliceOne(index);\n delete this.hashedArray[removable[this.uniqueProperty]];\n return removable;\n }\n }\n\n public deleteByKey(key: string): T {\n if (!this.hashedArray[key]) {\n logger.error(`deleteByKey(): no such element for '${key}'.`);\n return undefined;\n } else {\n const removable = this.spliceOne(this.indexOf(this.hashedArray[key]));\n delete this.hashedArray[key];\n return removable;\n }\n }\n\n public delete(obj: T): T {\n if (this.hashedArray[obj[this.uniqueProperty]]) {\n return this.deleteByKey(obj[this.uniqueProperty]);\n\n } else if (this.indexOf(obj) != -1) {\n return this.deleteAt(this.indexOf(obj));\n\n } else {\n return undefined;\n }\n }\n\n private _badIndexWarning(index) {\n logger.warn(`Index out of range, index: ${index}`);\n }\n\n private spliceOne(index: number): T {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= this.array.length) {\n this._badIndexWarning(index);\n return undefined;\n }\n\n const itemRemoved = this.array[index];\n\n const len = this.array.length - 1;\n for (let i = index; i < len; i++) {\n this.array[i] = this.array[i + 1];\n }\n this.array.length = len;\n\n return itemRemoved;\n }\n}\n\nexport declare interface DummyServer {\n constructor(options?: ServerOpts, connectionListener?: (socket: Socket) => void);\n\n listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this;\n close(callback?: (err?: Error) => void): this;\n}\n\nexport class DummyServer extends EventEmitter {}\n\n// Add msgpackr extension to avoid circular references when encoding\n// https://github.com/kriszyp/msgpackr#custom-extensions\naddExtension({\n Class: Schema,\n type: 0,\n\n read(datum: any): any {\n return datum;\n },\n\n write(instance: any): any {\n return instance.toJSON();\n }\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@colyseus/core",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.32",
|
|
4
4
|
"description": "Multiplayer Framework for Node.js.",
|
|
5
5
|
"input": "./src/index.ts",
|
|
6
6
|
"main": "./build/index.js",
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"publishConfig": {
|
|
45
45
|
"access": "public"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "26aa0621baa7e31f5f2737e7d7e89c2afadc90c9"
|
|
48
48
|
}
|