{"version":3,"file":"Room.mjs","sources":["../../src/Room.ts"],"sourcesContent":["import * as msgpack from \"./msgpack\";\n\nimport { Connection } from \"./Connection\";\nimport { Serializer, getSerializer } from \"./serializer/Serializer\";\nimport { Protocol, utf8Read, utf8Length } from \"./Protocol\";\n\n// The unused imports here are important for better `.d.ts` file generation\n// (Later merged with `dts-bundle-generator`)\n// import { createNanoEvents, DefaultEvents, Emitter } from 'nanoevents';\nimport { createSignal, EventEmitter } from \"./core/signal\";\n\nimport {\n    SchemaSerializer,\n    SchemaConstructor,\n} from \"./serializer/SchemaSerializer\";\nimport { Context, Schema, encode, decode } from \"@colyseus/schema\";\n\nlet createNanoEvents = () => ({\n    events: {},\n    emit(event, ...args) {\n        (this.events[event] || []).forEach((i) => i(...args));\n    },\n    on(event, cb) {\n        (this.events[event] = this.events[event] || []).push(cb);\n        return () =>\n            (this.events[event] = (this.events[event] || []).filter(\n                (i) => i !== cb\n            ));\n    },\n});\n\nexport interface RoomAvailable<Metadata = any> {\n    roomId: string;\n    clients: number;\n    maxClients: number;\n    metadata?: Metadata;\n}\n\nexport class Room<State = any> {\n    public roomId: string;\n    public sessionId: string;\n\n    public name: string;\n    public connection: Connection;\n\n    // Public signals\n    public onStateChange = createSignal<(state: State) => void>();\n    public onError = createSignal<(code: number, message?: string) => void>();\n    public onLeave = createSignal<(code: number) => void>();\n    protected onJoin = createSignal();\n\n    public serializerId: string;\n    protected serializer: Serializer<State>;\n\n    protected hasJoined: boolean = false;\n\n    // TODO: remove me on 1.0.0\n    protected rootSchema: SchemaConstructor<State>;\n\n    // protected onMessageHandlers = createNanoEvents();\n\n    protected onMessageHandlers = createNanoEvents();\n\n    constructor(name: string, rootSchema?: SchemaConstructor<State>) {\n        this.roomId = null;\n        this.name = name;\n\n        if (rootSchema) {\n            this.serializer = new (getSerializer(\"schema\"))();\n            this.rootSchema = rootSchema;\n            (this.serializer as SchemaSerializer).state = new rootSchema();\n        }\n\n        this.onError((code, message) =>\n            console.warn(`colyseus.js - onError => (${code}) ${message}`)\n        );\n        this.onLeave(() => this.removeAllListeners());\n    }\n\n    // TODO: deprecate me on version 1.0\n    get id() {\n        return this.roomId;\n    }\n\n    public connect(endpoint: string) {\n        this.connection = new Connection();\n        this.connection.events.onmessage = this.onMessageCallback.bind(this);\n        this.connection.events.onclose = (e: CloseEvent) => {\n            if (!this.hasJoined) {\n                console.warn(\n                    `Room connection was closed unexpectedly (${e.code}): ${e.reason}`\n                );\n                this.onError.invoke(e.code, e.reason);\n                return;\n            }\n\n            this.onLeave.invoke(e.code);\n            this.destroy();\n        };\n        this.connection.events.onerror = (e: CloseEvent) => {\n            console.warn(`Room, onError (${e.code}): ${e.reason}`);\n            this.onError.invoke(e.code, e.reason);\n        };\n        this.connection.connect(endpoint);\n    }\n\n    public leave(consented: boolean = true): Promise<number> {\n        return new Promise((resolve) => {\n            this.onLeave((code) => resolve(code));\n\n            if (this.connection) {\n                if (consented) {\n                    this.connection.send([Protocol.LEAVE_ROOM]);\n                } else {\n                    this.connection.close();\n                }\n            } else {\n                this.onLeave.invoke(4000); // \"consented\" code\n            }\n        });\n    }\n\n    public onMessage<T = any>(\n        type: \"*\",\n        callback: (type: string | number | Schema, message: T) => void\n    );\n    public onMessage<T extends typeof Schema & (new (...args: any[]) => any)>(\n        type: T,\n        callback: (message: InstanceType<T>) => void\n    );\n    public onMessage<T = any>(\n        type: string | number,\n        callback: (message: T) => void\n    );\n    public onMessage(\n        type: \"*\" | string | number | typeof Schema,\n        callback: (...args: any[]) => void\n    ) {\n        return this.onMessageHandlers.on(\n            this.getMessageHandlerKey(type),\n            callback\n        );\n    }\n\n    public send(type: string | number, message?: any): void {\n        const initialBytes: number[] = [Protocol.ROOM_DATA];\n\n        if (typeof type === \"string\") {\n            encode.string(initialBytes, type);\n        } else {\n            encode.number(initialBytes, type);\n        }\n\n        let arr: Uint8Array;\n\n        if (message !== undefined) {\n            const encoded = msgpack.encode(message);\n            arr = new Uint8Array(initialBytes.length + encoded.byteLength);\n            arr.set(new Uint8Array(initialBytes), 0);\n            arr.set(new Uint8Array(encoded), initialBytes.length);\n        } else {\n            arr = new Uint8Array(initialBytes);\n        }\n\n        this.connection.send(arr.buffer);\n    }\n\n    public get state(): State {\n        return this.serializer.getState();\n    }\n\n    public removeAllListeners() {\n        this.onJoin.clear();\n        this.onStateChange.clear();\n        this.onError.clear();\n        this.onLeave.clear();\n        this.onMessageHandlers.events = {};\n    }\n\n    protected onMessageCallback(event: MessageEvent) {\n        const bytes = Array.from(new Uint8Array(event.data));\n        const code = bytes[0];\n\n        if (code === Protocol.JOIN_ROOM) {\n            let offset = 1;\n\n            this.serializerId = utf8Read(bytes, offset);\n            offset += utf8Length(this.serializerId);\n\n            // Instantiate serializer if not locally available.\n            if (!this.serializer) {\n                const serializer = getSerializer(this.serializerId);\n                this.serializer = new serializer();\n            }\n\n            if (bytes.length > offset && this.serializer.handshake) {\n                this.serializer.handshake(bytes, { offset });\n            }\n\n            this.hasJoined = true;\n            this.onJoin.invoke();\n\n            // acknowledge successfull JOIN_ROOM\n            this.connection.send([Protocol.JOIN_ROOM]);\n        } else if (code === Protocol.ERROR) {\n            const it: decode.Iterator = { offset: 1 };\n\n            const code = decode.number(bytes, it);\n            const message = decode.string(bytes, it);\n\n            this.onError.invoke(code, message);\n        } else if (code === Protocol.LEAVE_ROOM) {\n            this.leave();\n        } else if (code === Protocol.ROOM_DATA_SCHEMA) {\n            const it = { offset: 1 };\n\n            const context: Context = (this.serializer.getState() as any)\n                .constructor._context;\n            const type = context.get(decode.number(bytes, it));\n\n            const message: Schema = new (type as any)();\n            message.decode(bytes, it);\n\n            this.dispatchMessage(type, message);\n        } else if (code === Protocol.ROOM_STATE) {\n            bytes.shift(); // drop `code` byte\n            this.setState(bytes);\n        } else if (code === Protocol.ROOM_STATE_PATCH) {\n            bytes.shift(); // drop `code` byte\n            this.patch(bytes);\n        } else if (code === Protocol.ROOM_DATA) {\n            const it: decode.Iterator = { offset: 1 };\n\n            const type = decode.stringCheck(bytes, it)\n                ? decode.string(bytes, it)\n                : decode.number(bytes, it);\n\n            const message =\n                bytes.length > it.offset\n                    ? msgpack.decode(event.data, it.offset)\n                    : undefined;\n\n            this.dispatchMessage(type, message);\n        }\n    }\n\n    protected setState(encodedState: number[]): void {\n        this.serializer.setState(encodedState);\n        this.onStateChange.invoke(this.serializer.getState());\n    }\n\n    protected patch(binaryPatch: number[]) {\n        this.serializer.patch(binaryPatch);\n        this.onStateChange.invoke(this.serializer.getState());\n    }\n\n    private dispatchMessage(\n        type: string | number | typeof Schema,\n        message: any\n    ) {\n        const messageType = this.getMessageHandlerKey(type);\n\n        if (this.onMessageHandlers.events[messageType]) {\n            this.onMessageHandlers.emit(messageType, message);\n        } else if (this.onMessageHandlers.events[\"*\"]) {\n            this.onMessageHandlers.emit(\"*\", type, message);\n        } else {\n            console.warn(\n                `colyseus.js: onMessage() not registered for type '${type}'.`\n            );\n        }\n    }\n\n    private destroy() {\n        if (this.serializer) {\n            this.serializer.teardown();\n        }\n    }\n\n    private getMessageHandlerKey(\n        type: string | number | typeof Schema\n    ): string {\n        switch (typeof type) {\n            // typeof Schema\n            case \"function\":\n                return `$${(type as typeof Schema)._typeid}`;\n\n            // string\n            case \"string\":\n                return type;\n\n            // number\n            case \"number\":\n                return `i${type}`;\n\n            default:\n                throw new Error(\"invalid message type.\");\n        }\n    }\n}\n"],"names":["msgpack.encode","msgpack.decode"],"mappings":"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"}