{"version":3,"file":"Auth.mjs","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":[],"mappings":"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"}