{"version":3,"file":"Auth.cjs","sources":["../src/Auth.ts"],"sourcesContent":["import { HTTP } from \"./HTTP.ts\";\nimport { getItem, removeItem, setItem } from \"./Storage.ts\";\nimport { createNanoEvents } from './core/nanoevents.ts';\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\n/**\n * Response from getUserData()\n */\nexport interface UserDataResponse<UserData = any> {\n    user: UserData;\n}\n\n/**\n * Response from authentication methods (login, register, anonymous, OAuth)\n */\nexport interface AuthResponse<UserData = any> {\n    user: UserData;\n    token: string;\n}\n\n/**\n * Response from sendPasswordResetEmail()\n */\nexport type ForgotPasswordResponse = boolean | unknown;\n\n/**\n * @deprecated Use AuthResponse instead\n */\nexport type AuthData<UserData = any> = AuthResponse<UserData>;\n\nexport class Auth<UserData = any> {\n    settings: AuthSettings = {\n        path: \"/auth\",\n        key: \"colyseus-auth-token\",\n    };\n\n    #_initialized = false;\n    #_signInWindow: WindowProxy | null = null;\n    #_events = createNanoEvents<{\n        change: (response: AuthResponse) => void;\n    }>();\n\n    protected http: HTTP<any>;\n\n    constructor(http: HTTP<any>) {\n        this.http = http;\n        getItem(this.settings.key, (token: string) => this.token = token);\n    }\n\n    public set token(token: string) {\n        this.http.authToken = token;\n    }\n\n    public get token(): string | undefined {\n        return this.http.authToken;\n    }\n\n    public onChange<U = UserData>(callback: (response: AuthResponse<U | null>) => void) {\n        const unbindChange = this.#_events.on(\"change\", callback);\n        if (!this.#_initialized) {\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        }\n        this.#_initialized = true;\n        return unbindChange;\n    }\n\n    public async getUserData<U = UserData>(): Promise<UserDataResponse<U>> {\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<U = UserData>(\n        email: string,\n         password: string,\n        options?: any\n    ): Promise<AuthResponse<U>> {\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<U = UserData>(\n        email: string,\n        password: string\n    ): Promise<AuthResponse<U>> {\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<U = UserData>(options?: any): Promise<AuthResponse<U>> {\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): Promise<ForgotPasswordResponse> {\n        return (await this.http.post(`${this.settings.path}/forgot-password`, {\n            body: { email, }\n        })).data;\n    }\n\n    public async signInWithProvider<U = UserData>(\n        providerName: string,\n        settings: Partial<PopupSettings> = {}\n    ): Promise<AuthResponse<U>> {\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['sdk']['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 = null;\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 = null;\n                    reject(\"cancelled\");\n                    window.removeEventListener(\"message\", onMessage);\n                }\n            }, 200);\n\n            window.addEventListener(\"message\", onMessage);\n        });\n    }\n\n    public async signOut(): Promise<void> {\n        this.emitChange({ user: null, token: null });\n    }\n\n    private emitChange(authData: AuthResponse<UserData | null>) {\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":["createNanoEvents","getItem","__classPrivateFieldGet","__classPrivateFieldSet","removeItem","setItem"],"mappings":"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"}