{"version":3,"file":"Auth.mjs","sources":["../../src/Auth.ts"],"sourcesContent":["import { HTTP } from \"./HTTP\";\nimport { getItem, removeItem, setItem } from \"./Storage\";\nimport { createNanoEvents } from './core/nanoevents';\n\nexport interface AuthSettings {\n    path: string;\n    key: string;\n}\n\nexport interface PopupSettings {\n    prefix: string;\n    width: number;\n    height: number;\n}\n\nexport interface AuthData {\n    user: any;\n    token: string;\n}\n\nexport class Auth {\n    settings: AuthSettings = {\n        path: \"/auth\",\n        key: \"colyseus-auth-token\",\n    };\n\n    #_initialized = false;\n    #_initializationPromise: Promise<void>;\n    #_signInWindow = undefined;\n    #_events = createNanoEvents();\n\n    constructor(protected http: HTTP) {\n        getItem(this.settings.key, (token) => this.token = token);\n    }\n\n    public set token(token: string) {\n        this.http.authToken = token;\n    }\n\n    public get token(): string {\n        return this.http.authToken;\n    }\n\n    public onChange(callback: (response: AuthData) => void) {\n        const unbindChange = this.#_events.on(\"change\", callback);\n        if (!this.#_initialized) {\n            this.#_initializationPromise = new Promise<void>((resolve, reject) => {\n                this.getUserData().then((userData) => {\n                    this.emitChange({ ...userData, token: this.token });\n\n                }).catch((e) => {\n                    // user is not logged in, or service is down\n                    this.emitChange({ user: null, token: undefined });\n\n                }).finally(() => {\n                    resolve();\n                });\n            });\n        }\n        this.#_initialized = true;\n        return unbindChange;\n    }\n\n    public async getUserData() {\n        if (this.token) {\n            return (await this.http.get(`${this.settings.path}/userdata`)).data;\n        } else {\n            throw new Error(\"missing auth.token\");\n        }\n    }\n\n    public async registerWithEmailAndPassword(email: string, password: string, options?: any) {\n        const data = (await this.http.post(`${this.settings.path}/register`, {\n            body: { email, password, options, },\n        })).data;\n\n        this.emitChange(data);\n\n        return data;\n    }\n\n    public async signInWithEmailAndPassword(email: string, password: string) {\n        const data = (await this.http.post(`${this.settings.path}/login`, {\n            body: { email, password, },\n        })).data;\n\n        this.emitChange(data);\n\n        return data;\n    }\n\n    public async signInAnonymously(options?: any) {\n        const data = (await this.http.post(`${this.settings.path}/anonymous`, {\n            body: { options, }\n        })).data;\n\n        this.emitChange(data);\n\n        return data;\n    }\n\n    public async sendPasswordResetEmail(email: string) {\n        return (await this.http.post(`${this.settings.path}/forgot-password`, {\n            body: { email, }\n        })).data;\n    }\n\n    public async signInWithProvider(providerName: string, settings: Partial<PopupSettings> = {}) {\n        return new Promise((resolve, reject) => {\n            const w = settings.width || 480;\n            const h = settings.height || 768;\n\n            // forward existing token for upgrading\n            const upgradingToken = this.token ? `?token=${this.token}` : \"\";\n\n            // Capitalize first letter of providerName\n            const title = `Login with ${(providerName[0].toUpperCase() + providerName.substring(1))}`;\n            const url = this.http['client']['getHttpEndpoint'](`${(settings.prefix || `${this.settings.path}/provider`)}/${providerName}${upgradingToken}`);\n\n            const left = (screen.width / 2) - (w / 2);\n            const top = (screen.height / 2) - (h / 2);\n\n            this.#_signInWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);\n\n            const onMessage = (event: MessageEvent) => {\n                // TODO: it is a good idea to check if event.origin can be trusted!\n                // if (event.origin.indexOf(window.location.hostname) === -1) { return; }\n\n                // require 'user' and 'token' inside received data.\n                if (event.data.user === undefined && event.data.token === undefined) { return; }\n\n                clearInterval(rejectionChecker);\n                this.#_signInWindow.close();\n                this.#_signInWindow = undefined;\n\n                window.removeEventListener(\"message\", onMessage);\n\n                if (event.data.error !== undefined) {\n                    reject(event.data.error);\n\n                } else {\n                    resolve(event.data);\n                    this.emitChange(event.data);\n                }\n            }\n\n            const rejectionChecker = setInterval(() => {\n                if (!this.#_signInWindow || this.#_signInWindow.closed) {\n                    this.#_signInWindow = undefined;\n                    reject(\"cancelled\");\n                    window.removeEventListener(\"message\", onMessage);\n                }\n            }, 200);\n\n            window.addEventListener(\"message\", onMessage);\n        });\n    }\n\n    public async signOut() {\n        this.emitChange({ user: null, token: null });\n    }\n\n    private emitChange(authData: Partial<AuthData>) {\n        if (authData.token !== undefined) {\n            this.token = authData.token;\n\n            if (authData.token === null) {\n                removeItem(this.settings.key);\n\n            } else {\n                // store key in localStorage\n                setItem(this.settings.key, authData.token);\n            }\n        }\n\n        this.#_events.emit(\"change\", authData);\n    }\n\n}\n"],"names":[],"mappings":"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"}