@niledatabase/client 5.0.0-alpha.7 → 5.0.0-alpha.9
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/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -305,8 +305,14 @@ var Authorizer = class {
|
|
|
305
305
|
if (res?.ok) {
|
|
306
306
|
const data = await res.json();
|
|
307
307
|
this.state.loading = false;
|
|
308
|
-
if (!res.ok) throw data;
|
|
309
308
|
return Object.keys(data).length > 0 ? data : void 0;
|
|
309
|
+
} else {
|
|
310
|
+
const error = await errorHandler?.text();
|
|
311
|
+
if (error) {
|
|
312
|
+
const updatedUrl = new URL(url);
|
|
313
|
+
updatedUrl.searchParams.set("error", error);
|
|
314
|
+
return { url: updatedUrl.toString() };
|
|
315
|
+
}
|
|
310
316
|
}
|
|
311
317
|
} catch (error) {
|
|
312
318
|
if (error instanceof Error) {
|
|
@@ -318,10 +324,9 @@ var Authorizer = class {
|
|
|
318
324
|
} else {
|
|
319
325
|
const error2 = await errorHandler?.text();
|
|
320
326
|
if (error2) {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
}
|
|
327
|
+
const updatedUrl = new URL(url);
|
|
328
|
+
updatedUrl.searchParams.set("error", error2);
|
|
329
|
+
return { url: updatedUrl.toString() };
|
|
325
330
|
}
|
|
326
331
|
}
|
|
327
332
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/logger.ts","../src/broadcast.ts","../src/observable.ts","../src/Authorizer.ts","../src/status.ts"],"sourcesContent":["export {\n auth,\n getSession,\n getCsrfToken,\n signOut,\n signIn,\n signUp,\n resetPassword,\n getProviders,\n default as Authorizer,\n} from './Authorizer';\nexport { getStatus } from './status';\nexport { broadcast } from './broadcast';\nexport * from './types';\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport Authorizer from './Authorizer';\n\n/* eslint-disable no-console */\nexport class UnknownError extends Error {\n code: string;\n constructor(error: Error | string) {\n // Support passing error or string\n super((error as Error)?.message ?? error);\n this.name = 'UnknownError';\n this.code = (error as any).code;\n if (error instanceof Error) {\n this.stack = error.stack;\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n };\n }\n}\n\n// TODO: better typing\n/** Makes sure that error is always serializable */\nfunction formatError(o: unknown): unknown {\n if (o instanceof Error && !(o instanceof UnknownError)) {\n return JSON.stringify({ message: o.message, stack: o.stack, name: o.name });\n }\n if (hasErrorProperty(o)) {\n o.error = formatError(o.error) as Error;\n o.message = o.message ?? o.error.message;\n }\n return o;\n}\n\nfunction hasErrorProperty(\n x: unknown\n): x is { error: Error; [key: string]: unknown } {\n return !!(x as any)?.error;\n}\n\nexport type WarningCode =\n | 'NEXTAUTH_URL'\n | 'NO_SECRET'\n | 'TWITTER_OAUTH_2_BETA'\n | 'DEBUG_ENABLED';\n\n/**\n * Override any of the methods, and the rest will use the default logger.\n *\n * [Documentation](https://next-auth.js.org/configuration/options#logger)\n */\nexport interface LoggerInstance extends Record<string, (...args: any) => any> {\n warn: (code: WarningCode) => void;\n error: (\n code: string,\n /**\n * Either an instance of (JSON serializable) Error\n * or an object that contains some debug information.\n * (Error is still available through `metadata.error`)\n */\n metadata: Error | { error: Error; [key: string]: unknown }\n ) => void;\n debug: (code: string, metadata: unknown) => void;\n}\n\nconst _logger: LoggerInstance = {\n error(code, metadata) {\n metadata = formatError(metadata) as Error;\n console.error(`[nile-auth][error][${code}]`, metadata.message, metadata);\n },\n warn(code) {\n console.warn(`[nile-auth][warn][${code}]`);\n },\n debug(code, metadata) {\n console.log(`[next-auth][debug][${code}]`, metadata);\n },\n};\n\n/**\n * Override the built-in logger with user's implementation.\n * Any `undefined` level will use the default logger.\n */\nexport function setLogger(\n newLogger: Partial<LoggerInstance> = {},\n debug?: boolean\n) {\n // Turn off debug logging if `debug` isn't set to `true`\n if (!debug) _logger.debug = () => undefined;\n\n if (newLogger.error) _logger.error = newLogger.error;\n if (newLogger.warn) _logger.warn = newLogger.warn;\n if (newLogger.debug) _logger.debug = newLogger.debug;\n}\n\nexport default _logger;\n\n/** Serializes client-side log messages and sends them to the server */\nexport function proxyLogger(\n logger: LoggerInstance = _logger,\n authorizer: Authorizer\n): LoggerInstance {\n try {\n if (typeof window === 'undefined') {\n return logger;\n }\n\n const clientLogger: Record<string, unknown> = {};\n for (const level in logger) {\n clientLogger[level] = (code: string, metadata: Error) => {\n _logger[level](code, metadata); // Logs to console\n\n if (level === 'error') {\n metadata = formatError(metadata) as Error;\n }\n (metadata as any).client = true;\n const url = `${authorizer.state.basePath}/_log`;\n const body = new URLSearchParams({ level, code, ...(metadata as any) });\n if (navigator.sendBeacon) {\n return navigator.sendBeacon(url, body);\n }\n return fetch(url, { method: 'POST', body, keepalive: true });\n };\n }\n return clientLogger as unknown as LoggerInstance;\n } catch {\n return _logger;\n }\n}\n\nexport const logger = (authorizer: Authorizer) =>\n proxyLogger(_logger, authorizer);\n","/** Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC. */\nexport function now() {\n return Math.floor(Date.now() / 1000);\n}\n\nexport interface BroadcastMessage {\n event?: 'session';\n data?: { trigger?: 'signout' | 'getSession' };\n clientId: string;\n timestamp: number;\n}\n\n/**\n * Inspired by [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)\n * Only not using it directly, because Safari does not support it.\n *\n * https://caniuse.com/?search=broadcastchannel\n */\nexport function BroadcastChannel(name = 'nextauth.message') {\n return {\n /** Get notified by other tabs/windows. */\n receive(onReceive: (message: BroadcastMessage) => void) {\n const handler = (event: StorageEvent) => {\n if (event.key !== name) return;\n const message: BroadcastMessage = JSON.parse(event.newValue ?? '{}');\n if (message?.event !== 'session' || !message?.data) return;\n\n onReceive(message);\n };\n window.addEventListener('storage', handler);\n return () => window.removeEventListener('storage', handler);\n },\n /** Notify other tabs/windows. */\n post(message: Record<string, unknown>) {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(\n name,\n JSON.stringify({ ...message, timestamp: now() })\n );\n } catch {\n /**\n * The localStorage API isn't always available.\n * It won't work in private mode prior to Safari 11 for example.\n * Notifications are simply dropped if an error is encountered.\n */\n }\n },\n };\n}\n\nexport const broadcast = BroadcastChannel();\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction isEqual(a: any, b: any): boolean {\n if (a === b) return true; // Same reference or primitive value\n\n if (\n typeof a !== 'object' ||\n typeof b !== 'object' ||\n a === null ||\n b === null\n ) {\n return false; // If one of them is not an object (or is null), return false\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false; // One is an array, the other isn't\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false; // Different number of keys\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !isEqual(a[key], b[key])) {\n return false; // Key missing or values are not deeply equal\n }\n }\n\n return true;\n}\n\nimport { Listener } from './types';\n\nexport function createObservableObject<T = Record<string, unknown>>(\n obj: T,\n listenerKeys = ['loading', 'session'],\n eventName = 'objectChange'\n) {\n const eventTarget = new EventTarget();\n const listeners = new Map();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: ProxyHandler<any> = {\n set(target, key, value) {\n const prev = target[key];\n target[key] = value;\n if (isEqual(prev, value)) return true;\n\n // only fire on these two for now\n if (listenerKeys.includes(String(key))) {\n eventTarget.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { key, prev, next: value },\n })\n );\n }\n return true;\n },\n };\n\n return {\n proxy: new Proxy(obj, handler),\n eventTarget,\n addListener(callback: Listener) {\n if (listeners.has(callback)) {\n return;\n }\n const wrappedCallback = (e: Event) => callback((e as CustomEvent).detail);\n listeners.set(callback, wrappedCallback);\n\n eventTarget.addEventListener(eventName, wrappedCallback);\n },\n removeListener(callback: Listener) {\n const wrappedCallback = listeners.get(callback);\n if (wrappedCallback) {\n eventTarget.removeEventListener(eventName, wrappedCallback);\n listeners.delete(callback);\n }\n },\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n ActiveSession,\n AuthConfig,\n AuthState,\n Config,\n CtxOrReq,\n BuiltInProviderType,\n RedirectableProviderType,\n ClientSafeProvider,\n SignInAuthorizationParams,\n SignInOptions,\n LiteralUnion,\n SignInResponse,\n Listener,\n NonErrorSession,\n PartialAuthorizer,\n SignOutParams,\n SignOutResponse,\n} from './types';\nimport { logger, LoggerInstance } from './logger';\nimport { broadcast, now } from './broadcast';\nimport { createObservableObject } from './observable';\n\nexport type GetSessionParams = CtxOrReq & {\n event?: 'storage' | 'timer' | 'hidden' | string;\n triggerEvent?: boolean;\n broadcast?: boolean;\n baseUrl?: string;\n init?: RequestInit;\n};\n\nenum State {\n SESSION = 'getSession',\n}\n\nexport default class Authorizer {\n state: AuthState;\n #logger: LoggerInstance;\n requestInit?: RequestInit;\n addListener: (cb: Listener) => void;\n removeListener: (cb: Listener) => void;\n status: null | State;\n constructor(config?: AuthConfig) {\n const { proxy, addListener, removeListener } =\n createObservableObject<AuthState>(\n {\n basePath: parseUrl(config?.basePath).path,\n baseUrl: parseUrl(config?.baseUrl).origin,\n lastSync: 0,\n getSession: () => undefined,\n session: undefined,\n loading: true,\n },\n config?.listenerKeys,\n 'auth'\n );\n this.state = proxy;\n this.addListener = addListener;\n this.removeListener = removeListener;\n this.#logger = logger(this);\n this.status = null;\n }\n\n async sync(\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange'\n ) {\n try {\n const storageEvent = event === 'storage';\n if (storageEvent || !this.state.session) {\n this.state.getSession = await this.getSession;\n this.state.lastSync = now();\n }\n if (!event || this.state.session == null || now() < this.state.lastSync) {\n return;\n }\n this.state.lastSync = Date.now();\n this.state.session = await this.getSession();\n } catch (error) {\n this.#logger.error('CLIENT_SESSION_ERROR', error as Error);\n }\n }\n\n set baseUrl(val: string) {\n this.state.baseUrl = val;\n this.#logger = logger(this);\n }\n\n get baseUrl() {\n this.#logger = logger(this);\n return this.state.baseUrl;\n }\n\n configure(config?: Config) {\n if (config?.basePath) this.state.basePath = parseUrl(config?.basePath).path;\n if (config?.baseUrl) this.baseUrl = config.baseUrl;\n if (config?.init) this.requestInit = config.init;\n\n return this;\n }\n sanitize(): PartialAuthorizer {\n return {\n state: {\n baseUrl: this.baseUrl,\n session: {\n user: {\n email: (this.state.session as ActiveSession)?.user?.email,\n },\n },\n },\n requestInit: this.requestInit,\n };\n }\n\n async initialize(params?: {\n baseUrl?: string;\n session?: NonErrorSession | null | undefined;\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';\n }) {\n const { baseUrl, session, event } = params ?? {};\n\n if (baseUrl) this.baseUrl = baseUrl;\n\n const hasInitialSession = session !== undefined;\n\n this.state.loading = !hasInitialSession;\n this.state.lastSync = hasInitialSession ? now() : 0;\n this.state.session = session;\n\n await this.sync(event);\n }\n\n get apiBaseUrl() {\n return `${this.baseUrl}${this.state.basePath}`;\n }\n\n async #sendData(\n url: string,\n init?: RequestInit\n ): Promise<Response | undefined> {\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n\n const filledUrl = !url.startsWith('http')\n ? `${window.location.origin}${url}`\n : url;\n\n const res = await fetch(filledUrl, options);\n this.state.loading = false;\n return res;\n } catch (error) {\n this.#logger.error('CLIENT_FETCH_ERROR', { error: error as Error, url });\n return undefined;\n }\n }\n async #fetchData<T = any>(\n url: string,\n init?: RequestInit\n ): Promise<T | undefined> {\n const options: RequestInit = {\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n const res = await this.#sendData(url, options);\n\n const errorHandler = res?.clone();\n try {\n if (res?.ok) {\n const data = await res.json();\n this.state.loading = false;\n if (!res.ok) throw data;\n return Object.keys(data).length > 0 ? data : undefined;\n }\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n } else {\n const error = await errorHandler?.text();\n if (error) {\n if (errorHandler) {\n const urlSearchParams = new URLSearchParams({ error });\n return { url: `${url}?${urlSearchParams}` } as T;\n }\n }\n }\n }\n return undefined;\n }\n }\n async #fetchFormData<T = { url: string }>(\n url: string,\n init: RequestInit\n ): Promise<\n | {\n data: T;\n status: number;\n ok: boolean;\n url: string;\n }\n | undefined\n > {\n try {\n const res = await fetch(url, {\n ...this.requestInit,\n ...init,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n if (res) {\n if (res.ok) {\n return {\n data: (await res.json()) as T,\n status: res.status,\n ok: res.ok,\n url: res.url,\n };\n }\n const { url: responseUrl } = await res.json();\n return {\n data: {} as T,\n status: res.status,\n ok: res?.ok,\n url: responseUrl,\n };\n }\n throw new Error(`Unable to fetch ${url}`);\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n }\n }\n return undefined;\n }\n }\n\n async getProviders(url?: string) {\n return await this.#fetchData<\n Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider>\n >(url ?? `${this.apiBaseUrl}/auth/providers`);\n }\n\n async getCsrfToken(url?: string) {\n const response = await this.#fetchData<{ csrfToken: string }>(\n url ?? `${this.apiBaseUrl}/auth/csrf`\n );\n return response?.csrfToken;\n }\n\n async getSession(params?: GetSessionParams): Promise<NonErrorSession> {\n if (this.status === State.SESSION) {\n return;\n }\n this.status = State.SESSION;\n if (params?.init) {\n this.requestInit = params.init;\n }\n\n if (params?.baseUrl) {\n this.baseUrl = params.baseUrl;\n }\n\n if (this.state.session && now() < this.state.lastSync) {\n this.status = null;\n return this.state.session;\n }\n this.state.loading = true;\n\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.status = null;\n if (session) {\n this.state.session = session;\n await this.sync('storage');\n return { ...session, loading: this.state.loading };\n }\n return { loading: this.state.loading } as NonErrorSession;\n }\n\n async refreshSession() {\n this.state.loading = true;\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.state.session = session;\n await this.sync('storage');\n return session;\n }\n async signOut<R extends boolean = true>(\n options?: SignOutParams<R> & {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n fetchUrl?: string;\n basePath?: string;\n }\n ): Promise<R extends true ? undefined : SignOutResponse> {\n const {\n callbackUrl = window.location.href,\n baseUrl,\n auth,\n fetchUrl,\n basePath,\n } = options ?? {};\n\n if (basePath) {\n this.state.basePath = basePath;\n }\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n this.requestInit = auth.requestInit;\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n const baseFetch = fetchUrl ?? `${this.apiBaseUrl}/auth/signout`;\n const fetchOptions: RequestInit = {\n method: 'post',\n body: new URLSearchParams({\n csrfToken: String(await this.getCsrfToken()),\n callbackUrl,\n json: String(true),\n }),\n };\n const res = await this.#fetchFormData<SignOutResponse>(\n baseFetch,\n fetchOptions\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'signout' } });\n\n // in the case you are going x-origin, we don't want to trust the nile.callback-url, so we will not redirect and just refresh the page\n if (this.requestInit?.credentials) {\n window.location.href = callbackUrl;\n if (callbackUrl.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n if (options?.redirect ?? true) {\n const url = res?.data?.url ?? callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n\n await this.state.getSession({ event: 'storage' });\n\n return res?.data as R extends true ? undefined : SignOutResponse;\n }\n async signIn<P extends RedirectableProviderType | undefined = undefined>(\n provider?: LiteralUnion<\n P extends RedirectableProviderType\n ? P | BuiltInProviderType\n : BuiltInProviderType\n >,\n options?: SignInOptions & {\n baseUrl?: string;\n providersUrl?: string;\n csrfUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n resetUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n },\n authorizationParams?: SignInAuthorizationParams\n ): Promise<\n P extends RedirectableProviderType ? SignInResponse | undefined : undefined\n > {\n const {\n callbackUrl = window.location.href,\n resetUrl = window.location.href,\n providersUrl,\n csrfUrl,\n baseUrl,\n fetchUrl,\n init,\n auth,\n redirect = true,\n ...remaining\n } = options ?? {};\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n if (init) {\n this.requestInit = init;\n }\n\n const providers = await this.getProviders(providersUrl);\n\n if (!providers) {\n return { error: 'No providers enabled' } as any;\n }\n if (!provider || !(provider in providers)) {\n return { error: `Provider ${provider} not enabled` } as any;\n }\n\n const isCredentials = providers[provider].type === 'credentials';\n const isEmail = providers[provider].type === 'email';\n const isSupportingReturn = isCredentials || isEmail;\n\n const baseFetch = `${this.apiBaseUrl}/auth`;\n const signInUrl =\n fetchUrl ??\n `${baseFetch}/${isCredentials ? 'callback' : 'signin'}/${provider}`;\n\n const _signInUrl = `${signInUrl}${\n authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ''\n }`;\n\n const data = await this.#fetchFormData(_signInUrl, {\n method: 'post',\n body: new URLSearchParams({\n ...remaining,\n csrfToken: String(await this.getCsrfToken(csrfUrl)),\n callbackUrl,\n json: String(true),\n resetUrl,\n }),\n });\n\n if (data?.ok && this.requestInit?.credentials && isSupportingReturn) {\n window.location.reload();\n return;\n }\n\n if (data?.ok && (redirect || !isSupportingReturn)) {\n const url = data?.data.url ?? callbackUrl;\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (data?.ok) {\n await this.initialize();\n await this.getSession({ event: 'storage' });\n }\n return {\n error,\n status: data?.status,\n ok: data?.ok,\n url: error ? null : data?.url,\n } as any;\n }\n async signUp(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n newTenantName?: string;\n createTenant?: string | boolean;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n tenantId?: string;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const {\n password,\n tenantId,\n fetchUrl,\n newTenantName,\n createTenant,\n baseUrl,\n init,\n email,\n auth,\n callbackUrl = window.location.href,\n } = options;\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n\n const searchParams = new URLSearchParams();\n\n if (newTenantName) {\n searchParams.set('newTenantName', newTenantName);\n } else if (createTenant) {\n if (typeof createTenant === 'boolean') {\n searchParams.set('newTenantName', email);\n } else if (typeof createTenant === 'string') {\n searchParams.set('newTenantName', createTenant);\n }\n }\n if (tenantId) {\n searchParams.set('tenantId', tenantId);\n }\n\n let signUpUrl = fetchUrl ?? `${this.apiBaseUrl}/signup`;\n if (searchParams.size > 0) {\n signUpUrl += `?${searchParams}`;\n }\n const data = await this.#fetchData(signUpUrl, {\n method: 'post',\n body: JSON.stringify({ email, password }),\n });\n\n const error = data?.url\n ? new URL(data.url).searchParams.get('error')\n : null;\n\n if (!error) {\n if (data) {\n await this.initialize({ event: 'storage' });\n await this.getSession({ event: 'storage' });\n }\n if (this.requestInit?.credentials) {\n window.location.reload();\n return;\n }\n\n if (options?.redirect ?? true) {\n const url = callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n }\n }\n\n return {\n data,\n error,\n } as any;\n }\n async resetPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, email, redirect, callbackUrl } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'post',\n body: JSON.stringify({\n email,\n password,\n redirectUrl: resetPasswordUrl,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n if (redirect === false) {\n const json = await data?.json();\n const { url: urlWithParams } = json;\n resetPasswordWithParams = `${urlWithParams}&redirect=false`;\n await this.#sendData(resetPasswordWithParams);\n\n return await this.#sendData(resetPasswordWithParams, {\n method: password ? 'put' : 'post',\n body: JSON.stringify({ email, password }),\n });\n }\n }\n\n #configureFetch(params: {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n init?: RequestInit;\n }) {\n const { baseUrl, init, auth } = params;\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n }\n}\nexport interface InternalUrl {\n /** @default \"http://localhost:3000\" */\n origin: string;\n /** @default \"localhost:3000\" */\n host: string;\n /** @default \"/api/auth\" */\n path: string;\n /** @default \"http://localhost:3000/api/auth\" */\n base: string;\n /** @default \"http://localhost:3000/api/auth\" */\n toString: () => string;\n}\n\nfunction parseUrl(url?: string): InternalUrl {\n let defaultUrl = new URL('http://localhost:3000');\n if (typeof window !== 'undefined') {\n defaultUrl = new URL(`${window.location.origin}/api`);\n }\n\n if (url && !url.startsWith('http')) {\n url = `https://${url}`;\n }\n\n const _url = new URL(url ?? defaultUrl);\n const path = (_url.pathname === '/' ? defaultUrl.pathname : _url.pathname)\n // Remove trailing slash\n .replace(/\\/$/, '');\n\n const base = `${_url.origin}${path}`;\n\n return {\n origin: _url.origin,\n host: _url.host,\n path,\n base,\n toString: () => base,\n };\n}\n\nexport const authorizer = new Authorizer();\n\nconst _auth = () => {\n return authorizer;\n};\n\nexport const auth: Authorizer = _auth();\n\nexport const getSession = async function getSession(params?: GetSessionParams) {\n return await auth.getSession(params);\n};\n\nexport const getCsrfToken = async function getCsrfToken(url?: string) {\n return auth.getCsrfToken(url);\n};\n\nexport const getProviders = async function getProviders() {\n return auth.getProviders();\n};\n\nexport const signOut: typeof authorizer.signOut = async function signOut(\n options\n) {\n return auth.signOut(options);\n};\nexport const signIn: typeof authorizer.signIn = async function signOut(\n provider,\n options,\n authParams\n) {\n return auth.signIn(provider, options, authParams);\n};\n\nexport const signUp: typeof authorizer.signUp = async function signUp(options) {\n return auth.signUp(options);\n};\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(options);\n };\n","import { NonErrorSession } from './types';\n\nexport function getStatus(\n load: boolean,\n sess: NonErrorSession | null | undefined\n) {\n if (load) {\n return 'loading';\n }\n if (sess) {\n return 'authenticated';\n }\n return 'unauthenticated';\n}\n"],"mappings":"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","names":["logger","authorizer","error","auth","getSession","getCsrfToken","getProviders","signOut","signUp","resetPassword"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/logger.ts","../src/broadcast.ts","../src/observable.ts","../src/Authorizer.ts","../src/status.ts"],"sourcesContent":["export {\n auth,\n getSession,\n getCsrfToken,\n signOut,\n signIn,\n signUp,\n resetPassword,\n getProviders,\n default as Authorizer,\n} from './Authorizer';\nexport { getStatus } from './status';\nexport { broadcast } from './broadcast';\nexport * from './types';\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport Authorizer from './Authorizer';\n\n/* eslint-disable no-console */\nexport class UnknownError extends Error {\n code: string;\n constructor(error: Error | string) {\n // Support passing error or string\n super((error as Error)?.message ?? error);\n this.name = 'UnknownError';\n this.code = (error as any).code;\n if (error instanceof Error) {\n this.stack = error.stack;\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n };\n }\n}\n\n// TODO: better typing\n/** Makes sure that error is always serializable */\nfunction formatError(o: unknown): unknown {\n if (o instanceof Error && !(o instanceof UnknownError)) {\n return JSON.stringify({ message: o.message, stack: o.stack, name: o.name });\n }\n if (hasErrorProperty(o)) {\n o.error = formatError(o.error) as Error;\n o.message = o.message ?? o.error.message;\n }\n return o;\n}\n\nfunction hasErrorProperty(\n x: unknown\n): x is { error: Error; [key: string]: unknown } {\n return !!(x as any)?.error;\n}\n\nexport type WarningCode =\n | 'NEXTAUTH_URL'\n | 'NO_SECRET'\n | 'TWITTER_OAUTH_2_BETA'\n | 'DEBUG_ENABLED';\n\n/**\n * Override any of the methods, and the rest will use the default logger.\n *\n * [Documentation](https://next-auth.js.org/configuration/options#logger)\n */\nexport interface LoggerInstance extends Record<string, (...args: any) => any> {\n warn: (code: WarningCode) => void;\n error: (\n code: string,\n /**\n * Either an instance of (JSON serializable) Error\n * or an object that contains some debug information.\n * (Error is still available through `metadata.error`)\n */\n metadata: Error | { error: Error; [key: string]: unknown }\n ) => void;\n debug: (code: string, metadata: unknown) => void;\n}\n\nconst _logger: LoggerInstance = {\n error(code, metadata) {\n metadata = formatError(metadata) as Error;\n console.error(`[nile-auth][error][${code}]`, metadata.message, metadata);\n },\n warn(code) {\n console.warn(`[nile-auth][warn][${code}]`);\n },\n debug(code, metadata) {\n console.log(`[next-auth][debug][${code}]`, metadata);\n },\n};\n\n/**\n * Override the built-in logger with user's implementation.\n * Any `undefined` level will use the default logger.\n */\nexport function setLogger(\n newLogger: Partial<LoggerInstance> = {},\n debug?: boolean\n) {\n // Turn off debug logging if `debug` isn't set to `true`\n if (!debug) _logger.debug = () => undefined;\n\n if (newLogger.error) _logger.error = newLogger.error;\n if (newLogger.warn) _logger.warn = newLogger.warn;\n if (newLogger.debug) _logger.debug = newLogger.debug;\n}\n\nexport default _logger;\n\n/** Serializes client-side log messages and sends them to the server */\nexport function proxyLogger(\n logger: LoggerInstance = _logger,\n authorizer: Authorizer\n): LoggerInstance {\n try {\n if (typeof window === 'undefined') {\n return logger;\n }\n\n const clientLogger: Record<string, unknown> = {};\n for (const level in logger) {\n clientLogger[level] = (code: string, metadata: Error) => {\n _logger[level](code, metadata); // Logs to console\n\n if (level === 'error') {\n metadata = formatError(metadata) as Error;\n }\n (metadata as any).client = true;\n const url = `${authorizer.state.basePath}/_log`;\n const body = new URLSearchParams({ level, code, ...(metadata as any) });\n if (navigator.sendBeacon) {\n return navigator.sendBeacon(url, body);\n }\n return fetch(url, { method: 'POST', body, keepalive: true });\n };\n }\n return clientLogger as unknown as LoggerInstance;\n } catch {\n return _logger;\n }\n}\n\nexport const logger = (authorizer: Authorizer) =>\n proxyLogger(_logger, authorizer);\n","/** Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC. */\nexport function now() {\n return Math.floor(Date.now() / 1000);\n}\n\nexport interface BroadcastMessage {\n event?: 'session';\n data?: { trigger?: 'signout' | 'getSession' };\n clientId: string;\n timestamp: number;\n}\n\n/**\n * Inspired by [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)\n * Only not using it directly, because Safari does not support it.\n *\n * https://caniuse.com/?search=broadcastchannel\n */\nexport function BroadcastChannel(name = 'nextauth.message') {\n return {\n /** Get notified by other tabs/windows. */\n receive(onReceive: (message: BroadcastMessage) => void) {\n const handler = (event: StorageEvent) => {\n if (event.key !== name) return;\n const message: BroadcastMessage = JSON.parse(event.newValue ?? '{}');\n if (message?.event !== 'session' || !message?.data) return;\n\n onReceive(message);\n };\n window.addEventListener('storage', handler);\n return () => window.removeEventListener('storage', handler);\n },\n /** Notify other tabs/windows. */\n post(message: Record<string, unknown>) {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(\n name,\n JSON.stringify({ ...message, timestamp: now() })\n );\n } catch {\n /**\n * The localStorage API isn't always available.\n * It won't work in private mode prior to Safari 11 for example.\n * Notifications are simply dropped if an error is encountered.\n */\n }\n },\n };\n}\n\nexport const broadcast = BroadcastChannel();\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction isEqual(a: any, b: any): boolean {\n if (a === b) return true; // Same reference or primitive value\n\n if (\n typeof a !== 'object' ||\n typeof b !== 'object' ||\n a === null ||\n b === null\n ) {\n return false; // If one of them is not an object (or is null), return false\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false; // One is an array, the other isn't\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false; // Different number of keys\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !isEqual(a[key], b[key])) {\n return false; // Key missing or values are not deeply equal\n }\n }\n\n return true;\n}\n\nimport { Listener } from './types';\n\nexport function createObservableObject<T = Record<string, unknown>>(\n obj: T,\n listenerKeys = ['loading', 'session'],\n eventName = 'objectChange'\n) {\n const eventTarget = new EventTarget();\n const listeners = new Map();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: ProxyHandler<any> = {\n set(target, key, value) {\n const prev = target[key];\n target[key] = value;\n if (isEqual(prev, value)) return true;\n\n // only fire on these two for now\n if (listenerKeys.includes(String(key))) {\n eventTarget.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { key, prev, next: value },\n })\n );\n }\n return true;\n },\n };\n\n return {\n proxy: new Proxy(obj, handler),\n eventTarget,\n addListener(callback: Listener) {\n if (listeners.has(callback)) {\n return;\n }\n const wrappedCallback = (e: Event) => callback((e as CustomEvent).detail);\n listeners.set(callback, wrappedCallback);\n\n eventTarget.addEventListener(eventName, wrappedCallback);\n },\n removeListener(callback: Listener) {\n const wrappedCallback = listeners.get(callback);\n if (wrappedCallback) {\n eventTarget.removeEventListener(eventName, wrappedCallback);\n listeners.delete(callback);\n }\n },\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n ActiveSession,\n AuthConfig,\n AuthState,\n Config,\n CtxOrReq,\n BuiltInProviderType,\n RedirectableProviderType,\n ClientSafeProvider,\n SignInAuthorizationParams,\n SignInOptions,\n LiteralUnion,\n SignInResponse,\n Listener,\n NonErrorSession,\n PartialAuthorizer,\n SignOutParams,\n SignOutResponse,\n} from './types';\nimport { logger, LoggerInstance } from './logger';\nimport { broadcast, now } from './broadcast';\nimport { createObservableObject } from './observable';\n\nexport type GetSessionParams = CtxOrReq & {\n event?: 'storage' | 'timer' | 'hidden' | string;\n triggerEvent?: boolean;\n broadcast?: boolean;\n baseUrl?: string;\n init?: RequestInit;\n};\n\nenum State {\n SESSION = 'getSession',\n}\n\nexport default class Authorizer {\n state: AuthState;\n #logger: LoggerInstance;\n requestInit?: RequestInit;\n addListener: (cb: Listener) => void;\n removeListener: (cb: Listener) => void;\n status: null | State;\n constructor(config?: AuthConfig) {\n const { proxy, addListener, removeListener } =\n createObservableObject<AuthState>(\n {\n basePath: parseUrl(config?.basePath).path,\n baseUrl: parseUrl(config?.baseUrl).origin,\n lastSync: 0,\n getSession: () => undefined,\n session: undefined,\n loading: true,\n },\n config?.listenerKeys,\n 'auth'\n );\n this.state = proxy;\n this.addListener = addListener;\n this.removeListener = removeListener;\n this.#logger = logger(this);\n this.status = null;\n }\n\n async sync(\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange'\n ) {\n try {\n const storageEvent = event === 'storage';\n if (storageEvent || !this.state.session) {\n this.state.getSession = await this.getSession;\n this.state.lastSync = now();\n }\n if (!event || this.state.session == null || now() < this.state.lastSync) {\n return;\n }\n this.state.lastSync = Date.now();\n this.state.session = await this.getSession();\n } catch (error) {\n this.#logger.error('CLIENT_SESSION_ERROR', error as Error);\n }\n }\n\n set baseUrl(val: string) {\n this.state.baseUrl = val;\n this.#logger = logger(this);\n }\n\n get baseUrl() {\n this.#logger = logger(this);\n return this.state.baseUrl;\n }\n\n configure(config?: Config) {\n if (config?.basePath) this.state.basePath = parseUrl(config?.basePath).path;\n if (config?.baseUrl) this.baseUrl = config.baseUrl;\n if (config?.init) this.requestInit = config.init;\n\n return this;\n }\n sanitize(): PartialAuthorizer {\n return {\n state: {\n baseUrl: this.baseUrl,\n session: {\n user: {\n email: (this.state.session as ActiveSession)?.user?.email,\n },\n },\n },\n requestInit: this.requestInit,\n };\n }\n\n async initialize(params?: {\n baseUrl?: string;\n session?: NonErrorSession | null | undefined;\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';\n }) {\n const { baseUrl, session, event } = params ?? {};\n\n if (baseUrl) this.baseUrl = baseUrl;\n\n const hasInitialSession = session !== undefined;\n\n this.state.loading = !hasInitialSession;\n this.state.lastSync = hasInitialSession ? now() : 0;\n this.state.session = session;\n\n await this.sync(event);\n }\n\n get apiBaseUrl() {\n return `${this.baseUrl}${this.state.basePath}`;\n }\n\n async #sendData(\n url: string,\n init?: RequestInit\n ): Promise<Response | undefined> {\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n\n const filledUrl = !url.startsWith('http')\n ? `${window.location.origin}${url}`\n : url;\n\n const res = await fetch(filledUrl, options);\n this.state.loading = false;\n return res;\n } catch (error) {\n this.#logger.error('CLIENT_FETCH_ERROR', { error: error as Error, url });\n return undefined;\n }\n }\n async #fetchData<T = any>(\n url: string,\n init?: RequestInit\n ): Promise<T | undefined> {\n const options: RequestInit = {\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n const res = await this.#sendData(url, options);\n\n const errorHandler = res?.clone();\n try {\n if (res?.ok) {\n const data = await res.json();\n this.state.loading = false;\n return Object.keys(data).length > 0 ? data : undefined;\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n }\n return undefined;\n }\n }\n async #fetchFormData<T = { url: string }>(\n url: string,\n init: RequestInit\n ): Promise<\n | {\n data: T;\n status: number;\n ok: boolean;\n url: string;\n }\n | undefined\n > {\n try {\n const res = await fetch(url, {\n ...this.requestInit,\n ...init,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n if (res) {\n if (res.ok) {\n return {\n data: (await res.json()) as T,\n status: res.status,\n ok: res.ok,\n url: res.url,\n };\n }\n const { url: responseUrl } = await res.json();\n return {\n data: {} as T,\n status: res.status,\n ok: res?.ok,\n url: responseUrl,\n };\n }\n throw new Error(`Unable to fetch ${url}`);\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n }\n }\n return undefined;\n }\n }\n\n async getProviders(url?: string) {\n return await this.#fetchData<\n Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider>\n >(url ?? `${this.apiBaseUrl}/auth/providers`);\n }\n\n async getCsrfToken(url?: string) {\n const response = await this.#fetchData<{ csrfToken: string }>(\n url ?? `${this.apiBaseUrl}/auth/csrf`\n );\n return response?.csrfToken;\n }\n\n async getSession(params?: GetSessionParams): Promise<NonErrorSession> {\n if (this.status === State.SESSION) {\n return;\n }\n this.status = State.SESSION;\n if (params?.init) {\n this.requestInit = params.init;\n }\n\n if (params?.baseUrl) {\n this.baseUrl = params.baseUrl;\n }\n\n if (this.state.session && now() < this.state.lastSync) {\n this.status = null;\n return this.state.session;\n }\n this.state.loading = true;\n\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.status = null;\n if (session) {\n this.state.session = session;\n await this.sync('storage');\n return { ...session, loading: this.state.loading };\n }\n return { loading: this.state.loading } as NonErrorSession;\n }\n\n async refreshSession() {\n this.state.loading = true;\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.state.session = session;\n await this.sync('storage');\n return session;\n }\n async signOut<R extends boolean = true>(\n options?: SignOutParams<R> & {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n fetchUrl?: string;\n basePath?: string;\n }\n ): Promise<R extends true ? undefined : SignOutResponse> {\n const {\n callbackUrl = window.location.href,\n baseUrl,\n auth,\n fetchUrl,\n basePath,\n } = options ?? {};\n\n if (basePath) {\n this.state.basePath = basePath;\n }\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n this.requestInit = auth.requestInit;\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n const baseFetch = fetchUrl ?? `${this.apiBaseUrl}/auth/signout`;\n const fetchOptions: RequestInit = {\n method: 'post',\n body: new URLSearchParams({\n csrfToken: String(await this.getCsrfToken()),\n callbackUrl,\n json: String(true),\n }),\n };\n const res = await this.#fetchFormData<SignOutResponse>(\n baseFetch,\n fetchOptions\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'signout' } });\n\n // in the case you are going x-origin, we don't want to trust the nile.callback-url, so we will not redirect and just refresh the page\n if (this.requestInit?.credentials) {\n window.location.href = callbackUrl;\n if (callbackUrl.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n if (options?.redirect ?? true) {\n const url = res?.data?.url ?? callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n\n await this.state.getSession({ event: 'storage' });\n\n return res?.data as R extends true ? undefined : SignOutResponse;\n }\n async signIn<P extends RedirectableProviderType | undefined = undefined>(\n provider?: LiteralUnion<\n P extends RedirectableProviderType\n ? P | BuiltInProviderType\n : BuiltInProviderType\n >,\n options?: SignInOptions & {\n baseUrl?: string;\n providersUrl?: string;\n csrfUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n resetUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n },\n authorizationParams?: SignInAuthorizationParams\n ): Promise<\n P extends RedirectableProviderType ? SignInResponse | undefined : undefined\n > {\n const {\n callbackUrl = window.location.href,\n resetUrl = window.location.href,\n providersUrl,\n csrfUrl,\n baseUrl,\n fetchUrl,\n init,\n auth,\n redirect = true,\n ...remaining\n } = options ?? {};\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n if (init) {\n this.requestInit = init;\n }\n\n const providers = await this.getProviders(providersUrl);\n\n if (!providers) {\n return { error: 'No providers enabled' } as any;\n }\n if (!provider || !(provider in providers)) {\n return { error: `Provider ${provider} not enabled` } as any;\n }\n\n const isCredentials = providers[provider].type === 'credentials';\n const isEmail = providers[provider].type === 'email';\n const isSupportingReturn = isCredentials || isEmail;\n\n const baseFetch = `${this.apiBaseUrl}/auth`;\n const signInUrl =\n fetchUrl ??\n `${baseFetch}/${isCredentials ? 'callback' : 'signin'}/${provider}`;\n\n const _signInUrl = `${signInUrl}${\n authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ''\n }`;\n\n const data = await this.#fetchFormData(_signInUrl, {\n method: 'post',\n body: new URLSearchParams({\n ...remaining,\n csrfToken: String(await this.getCsrfToken(csrfUrl)),\n callbackUrl,\n json: String(true),\n resetUrl,\n }),\n });\n\n if (data?.ok && this.requestInit?.credentials && isSupportingReturn) {\n window.location.reload();\n return;\n }\n\n if (data?.ok && (redirect || !isSupportingReturn)) {\n const url = data?.data.url ?? callbackUrl;\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (data?.ok) {\n await this.initialize();\n await this.getSession({ event: 'storage' });\n }\n return {\n error,\n status: data?.status,\n ok: data?.ok,\n url: error ? null : data?.url,\n } as any;\n }\n async signUp(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n newTenantName?: string;\n createTenant?: string | boolean;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n tenantId?: string;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const {\n password,\n tenantId,\n fetchUrl,\n newTenantName,\n createTenant,\n baseUrl,\n init,\n email,\n auth,\n callbackUrl = window.location.href,\n } = options;\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n\n const searchParams = new URLSearchParams();\n\n if (newTenantName) {\n searchParams.set('newTenantName', newTenantName);\n } else if (createTenant) {\n if (typeof createTenant === 'boolean') {\n searchParams.set('newTenantName', email);\n } else if (typeof createTenant === 'string') {\n searchParams.set('newTenantName', createTenant);\n }\n }\n if (tenantId) {\n searchParams.set('tenantId', tenantId);\n }\n\n let signUpUrl = fetchUrl ?? `${this.apiBaseUrl}/signup`;\n if (searchParams.size > 0) {\n signUpUrl += `?${searchParams}`;\n }\n const data = await this.#fetchData(signUpUrl, {\n method: 'post',\n body: JSON.stringify({ email, password }),\n });\n\n const error = data?.url\n ? new URL(data.url).searchParams.get('error')\n : null;\n\n if (!error) {\n if (data) {\n await this.initialize({ event: 'storage' });\n await this.getSession({ event: 'storage' });\n }\n if (this.requestInit?.credentials) {\n window.location.reload();\n return;\n }\n\n if (options?.redirect ?? true) {\n const url = callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n }\n }\n\n return {\n data,\n error,\n } as any;\n }\n async resetPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, email, redirect, callbackUrl } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'post',\n body: JSON.stringify({\n email,\n password,\n redirectUrl: resetPasswordUrl,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n if (redirect === false) {\n const json = await data?.json();\n const { url: urlWithParams } = json;\n resetPasswordWithParams = `${urlWithParams}&redirect=false`;\n await this.#sendData(resetPasswordWithParams);\n\n return await this.#sendData(resetPasswordWithParams, {\n method: password ? 'put' : 'post',\n body: JSON.stringify({ email, password }),\n });\n }\n }\n\n #configureFetch(params: {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n init?: RequestInit;\n }) {\n const { baseUrl, init, auth } = params;\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n }\n}\nexport interface InternalUrl {\n /** @default \"http://localhost:3000\" */\n origin: string;\n /** @default \"localhost:3000\" */\n host: string;\n /** @default \"/api/auth\" */\n path: string;\n /** @default \"http://localhost:3000/api/auth\" */\n base: string;\n /** @default \"http://localhost:3000/api/auth\" */\n toString: () => string;\n}\n\nfunction parseUrl(url?: string): InternalUrl {\n let defaultUrl = new URL('http://localhost:3000');\n if (typeof window !== 'undefined') {\n defaultUrl = new URL(`${window.location.origin}/api`);\n }\n\n if (url && !url.startsWith('http')) {\n url = `https://${url}`;\n }\n\n const _url = new URL(url ?? defaultUrl);\n const path = (_url.pathname === '/' ? defaultUrl.pathname : _url.pathname)\n // Remove trailing slash\n .replace(/\\/$/, '');\n\n const base = `${_url.origin}${path}`;\n\n return {\n origin: _url.origin,\n host: _url.host,\n path,\n base,\n toString: () => base,\n };\n}\n\nexport const authorizer = new Authorizer();\n\nconst _auth = () => {\n return authorizer;\n};\n\nexport const auth: Authorizer = _auth();\n\nexport const getSession = async function getSession(params?: GetSessionParams) {\n return await auth.getSession(params);\n};\n\nexport const getCsrfToken = async function getCsrfToken(url?: string) {\n return auth.getCsrfToken(url);\n};\n\nexport const getProviders = async function getProviders() {\n return auth.getProviders();\n};\n\nexport const signOut: typeof authorizer.signOut = async function signOut(\n options\n) {\n return auth.signOut(options);\n};\nexport const signIn: typeof authorizer.signIn = async function signOut(\n provider,\n options,\n authParams\n) {\n return auth.signIn(provider, options, authParams);\n};\n\nexport const signUp: typeof authorizer.signUp = async function signUp(options) {\n return auth.signUp(options);\n};\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(options);\n };\n","import { NonErrorSession } from './types';\n\nexport function getStatus(\n load: boolean,\n sess: NonErrorSession | null | undefined\n) {\n if (load) {\n return 'loading';\n }\n if (sess) {\n return 'authenticated';\n }\n return 'unauthenticated';\n}\n"],"mappings":"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","names":["logger","authorizer","error","auth","getSession","getCsrfToken","getProviders","signOut","signUp","resetPassword"]}
|
package/dist/index.mjs
CHANGED
|
@@ -269,8 +269,14 @@ var Authorizer = class {
|
|
|
269
269
|
if (res?.ok) {
|
|
270
270
|
const data = await res.json();
|
|
271
271
|
this.state.loading = false;
|
|
272
|
-
if (!res.ok) throw data;
|
|
273
272
|
return Object.keys(data).length > 0 ? data : void 0;
|
|
273
|
+
} else {
|
|
274
|
+
const error = await errorHandler?.text();
|
|
275
|
+
if (error) {
|
|
276
|
+
const updatedUrl = new URL(url);
|
|
277
|
+
updatedUrl.searchParams.set("error", error);
|
|
278
|
+
return { url: updatedUrl.toString() };
|
|
279
|
+
}
|
|
274
280
|
}
|
|
275
281
|
} catch (error) {
|
|
276
282
|
if (error instanceof Error) {
|
|
@@ -282,10 +288,9 @@ var Authorizer = class {
|
|
|
282
288
|
} else {
|
|
283
289
|
const error2 = await errorHandler?.text();
|
|
284
290
|
if (error2) {
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
}
|
|
291
|
+
const updatedUrl = new URL(url);
|
|
292
|
+
updatedUrl.searchParams.set("error", error2);
|
|
293
|
+
return { url: updatedUrl.toString() };
|
|
289
294
|
}
|
|
290
295
|
}
|
|
291
296
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/logger.ts","../src/broadcast.ts","../src/observable.ts","../src/Authorizer.ts","../src/status.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport Authorizer from './Authorizer';\n\n/* eslint-disable no-console */\nexport class UnknownError extends Error {\n code: string;\n constructor(error: Error | string) {\n // Support passing error or string\n super((error as Error)?.message ?? error);\n this.name = 'UnknownError';\n this.code = (error as any).code;\n if (error instanceof Error) {\n this.stack = error.stack;\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n };\n }\n}\n\n// TODO: better typing\n/** Makes sure that error is always serializable */\nfunction formatError(o: unknown): unknown {\n if (o instanceof Error && !(o instanceof UnknownError)) {\n return JSON.stringify({ message: o.message, stack: o.stack, name: o.name });\n }\n if (hasErrorProperty(o)) {\n o.error = formatError(o.error) as Error;\n o.message = o.message ?? o.error.message;\n }\n return o;\n}\n\nfunction hasErrorProperty(\n x: unknown\n): x is { error: Error; [key: string]: unknown } {\n return !!(x as any)?.error;\n}\n\nexport type WarningCode =\n | 'NEXTAUTH_URL'\n | 'NO_SECRET'\n | 'TWITTER_OAUTH_2_BETA'\n | 'DEBUG_ENABLED';\n\n/**\n * Override any of the methods, and the rest will use the default logger.\n *\n * [Documentation](https://next-auth.js.org/configuration/options#logger)\n */\nexport interface LoggerInstance extends Record<string, (...args: any) => any> {\n warn: (code: WarningCode) => void;\n error: (\n code: string,\n /**\n * Either an instance of (JSON serializable) Error\n * or an object that contains some debug information.\n * (Error is still available through `metadata.error`)\n */\n metadata: Error | { error: Error; [key: string]: unknown }\n ) => void;\n debug: (code: string, metadata: unknown) => void;\n}\n\nconst _logger: LoggerInstance = {\n error(code, metadata) {\n metadata = formatError(metadata) as Error;\n console.error(`[nile-auth][error][${code}]`, metadata.message, metadata);\n },\n warn(code) {\n console.warn(`[nile-auth][warn][${code}]`);\n },\n debug(code, metadata) {\n console.log(`[next-auth][debug][${code}]`, metadata);\n },\n};\n\n/**\n * Override the built-in logger with user's implementation.\n * Any `undefined` level will use the default logger.\n */\nexport function setLogger(\n newLogger: Partial<LoggerInstance> = {},\n debug?: boolean\n) {\n // Turn off debug logging if `debug` isn't set to `true`\n if (!debug) _logger.debug = () => undefined;\n\n if (newLogger.error) _logger.error = newLogger.error;\n if (newLogger.warn) _logger.warn = newLogger.warn;\n if (newLogger.debug) _logger.debug = newLogger.debug;\n}\n\nexport default _logger;\n\n/** Serializes client-side log messages and sends them to the server */\nexport function proxyLogger(\n logger: LoggerInstance = _logger,\n authorizer: Authorizer\n): LoggerInstance {\n try {\n if (typeof window === 'undefined') {\n return logger;\n }\n\n const clientLogger: Record<string, unknown> = {};\n for (const level in logger) {\n clientLogger[level] = (code: string, metadata: Error) => {\n _logger[level](code, metadata); // Logs to console\n\n if (level === 'error') {\n metadata = formatError(metadata) as Error;\n }\n (metadata as any).client = true;\n const url = `${authorizer.state.basePath}/_log`;\n const body = new URLSearchParams({ level, code, ...(metadata as any) });\n if (navigator.sendBeacon) {\n return navigator.sendBeacon(url, body);\n }\n return fetch(url, { method: 'POST', body, keepalive: true });\n };\n }\n return clientLogger as unknown as LoggerInstance;\n } catch {\n return _logger;\n }\n}\n\nexport const logger = (authorizer: Authorizer) =>\n proxyLogger(_logger, authorizer);\n","/** Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC. */\nexport function now() {\n return Math.floor(Date.now() / 1000);\n}\n\nexport interface BroadcastMessage {\n event?: 'session';\n data?: { trigger?: 'signout' | 'getSession' };\n clientId: string;\n timestamp: number;\n}\n\n/**\n * Inspired by [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)\n * Only not using it directly, because Safari does not support it.\n *\n * https://caniuse.com/?search=broadcastchannel\n */\nexport function BroadcastChannel(name = 'nextauth.message') {\n return {\n /** Get notified by other tabs/windows. */\n receive(onReceive: (message: BroadcastMessage) => void) {\n const handler = (event: StorageEvent) => {\n if (event.key !== name) return;\n const message: BroadcastMessage = JSON.parse(event.newValue ?? '{}');\n if (message?.event !== 'session' || !message?.data) return;\n\n onReceive(message);\n };\n window.addEventListener('storage', handler);\n return () => window.removeEventListener('storage', handler);\n },\n /** Notify other tabs/windows. */\n post(message: Record<string, unknown>) {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(\n name,\n JSON.stringify({ ...message, timestamp: now() })\n );\n } catch {\n /**\n * The localStorage API isn't always available.\n * It won't work in private mode prior to Safari 11 for example.\n * Notifications are simply dropped if an error is encountered.\n */\n }\n },\n };\n}\n\nexport const broadcast = BroadcastChannel();\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction isEqual(a: any, b: any): boolean {\n if (a === b) return true; // Same reference or primitive value\n\n if (\n typeof a !== 'object' ||\n typeof b !== 'object' ||\n a === null ||\n b === null\n ) {\n return false; // If one of them is not an object (or is null), return false\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false; // One is an array, the other isn't\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false; // Different number of keys\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !isEqual(a[key], b[key])) {\n return false; // Key missing or values are not deeply equal\n }\n }\n\n return true;\n}\n\nimport { Listener } from './types';\n\nexport function createObservableObject<T = Record<string, unknown>>(\n obj: T,\n listenerKeys = ['loading', 'session'],\n eventName = 'objectChange'\n) {\n const eventTarget = new EventTarget();\n const listeners = new Map();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: ProxyHandler<any> = {\n set(target, key, value) {\n const prev = target[key];\n target[key] = value;\n if (isEqual(prev, value)) return true;\n\n // only fire on these two for now\n if (listenerKeys.includes(String(key))) {\n eventTarget.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { key, prev, next: value },\n })\n );\n }\n return true;\n },\n };\n\n return {\n proxy: new Proxy(obj, handler),\n eventTarget,\n addListener(callback: Listener) {\n if (listeners.has(callback)) {\n return;\n }\n const wrappedCallback = (e: Event) => callback((e as CustomEvent).detail);\n listeners.set(callback, wrappedCallback);\n\n eventTarget.addEventListener(eventName, wrappedCallback);\n },\n removeListener(callback: Listener) {\n const wrappedCallback = listeners.get(callback);\n if (wrappedCallback) {\n eventTarget.removeEventListener(eventName, wrappedCallback);\n listeners.delete(callback);\n }\n },\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n ActiveSession,\n AuthConfig,\n AuthState,\n Config,\n CtxOrReq,\n BuiltInProviderType,\n RedirectableProviderType,\n ClientSafeProvider,\n SignInAuthorizationParams,\n SignInOptions,\n LiteralUnion,\n SignInResponse,\n Listener,\n NonErrorSession,\n PartialAuthorizer,\n SignOutParams,\n SignOutResponse,\n} from './types';\nimport { logger, LoggerInstance } from './logger';\nimport { broadcast, now } from './broadcast';\nimport { createObservableObject } from './observable';\n\nexport type GetSessionParams = CtxOrReq & {\n event?: 'storage' | 'timer' | 'hidden' | string;\n triggerEvent?: boolean;\n broadcast?: boolean;\n baseUrl?: string;\n init?: RequestInit;\n};\n\nenum State {\n SESSION = 'getSession',\n}\n\nexport default class Authorizer {\n state: AuthState;\n #logger: LoggerInstance;\n requestInit?: RequestInit;\n addListener: (cb: Listener) => void;\n removeListener: (cb: Listener) => void;\n status: null | State;\n constructor(config?: AuthConfig) {\n const { proxy, addListener, removeListener } =\n createObservableObject<AuthState>(\n {\n basePath: parseUrl(config?.basePath).path,\n baseUrl: parseUrl(config?.baseUrl).origin,\n lastSync: 0,\n getSession: () => undefined,\n session: undefined,\n loading: true,\n },\n config?.listenerKeys,\n 'auth'\n );\n this.state = proxy;\n this.addListener = addListener;\n this.removeListener = removeListener;\n this.#logger = logger(this);\n this.status = null;\n }\n\n async sync(\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange'\n ) {\n try {\n const storageEvent = event === 'storage';\n if (storageEvent || !this.state.session) {\n this.state.getSession = await this.getSession;\n this.state.lastSync = now();\n }\n if (!event || this.state.session == null || now() < this.state.lastSync) {\n return;\n }\n this.state.lastSync = Date.now();\n this.state.session = await this.getSession();\n } catch (error) {\n this.#logger.error('CLIENT_SESSION_ERROR', error as Error);\n }\n }\n\n set baseUrl(val: string) {\n this.state.baseUrl = val;\n this.#logger = logger(this);\n }\n\n get baseUrl() {\n this.#logger = logger(this);\n return this.state.baseUrl;\n }\n\n configure(config?: Config) {\n if (config?.basePath) this.state.basePath = parseUrl(config?.basePath).path;\n if (config?.baseUrl) this.baseUrl = config.baseUrl;\n if (config?.init) this.requestInit = config.init;\n\n return this;\n }\n sanitize(): PartialAuthorizer {\n return {\n state: {\n baseUrl: this.baseUrl,\n session: {\n user: {\n email: (this.state.session as ActiveSession)?.user?.email,\n },\n },\n },\n requestInit: this.requestInit,\n };\n }\n\n async initialize(params?: {\n baseUrl?: string;\n session?: NonErrorSession | null | undefined;\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';\n }) {\n const { baseUrl, session, event } = params ?? {};\n\n if (baseUrl) this.baseUrl = baseUrl;\n\n const hasInitialSession = session !== undefined;\n\n this.state.loading = !hasInitialSession;\n this.state.lastSync = hasInitialSession ? now() : 0;\n this.state.session = session;\n\n await this.sync(event);\n }\n\n get apiBaseUrl() {\n return `${this.baseUrl}${this.state.basePath}`;\n }\n\n async #sendData(\n url: string,\n init?: RequestInit\n ): Promise<Response | undefined> {\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n\n const filledUrl = !url.startsWith('http')\n ? `${window.location.origin}${url}`\n : url;\n\n const res = await fetch(filledUrl, options);\n this.state.loading = false;\n return res;\n } catch (error) {\n this.#logger.error('CLIENT_FETCH_ERROR', { error: error as Error, url });\n return undefined;\n }\n }\n async #fetchData<T = any>(\n url: string,\n init?: RequestInit\n ): Promise<T | undefined> {\n const options: RequestInit = {\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n const res = await this.#sendData(url, options);\n\n const errorHandler = res?.clone();\n try {\n if (res?.ok) {\n const data = await res.json();\n this.state.loading = false;\n if (!res.ok) throw data;\n return Object.keys(data).length > 0 ? data : undefined;\n }\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n } else {\n const error = await errorHandler?.text();\n if (error) {\n if (errorHandler) {\n const urlSearchParams = new URLSearchParams({ error });\n return { url: `${url}?${urlSearchParams}` } as T;\n }\n }\n }\n }\n return undefined;\n }\n }\n async #fetchFormData<T = { url: string }>(\n url: string,\n init: RequestInit\n ): Promise<\n | {\n data: T;\n status: number;\n ok: boolean;\n url: string;\n }\n | undefined\n > {\n try {\n const res = await fetch(url, {\n ...this.requestInit,\n ...init,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n if (res) {\n if (res.ok) {\n return {\n data: (await res.json()) as T,\n status: res.status,\n ok: res.ok,\n url: res.url,\n };\n }\n const { url: responseUrl } = await res.json();\n return {\n data: {} as T,\n status: res.status,\n ok: res?.ok,\n url: responseUrl,\n };\n }\n throw new Error(`Unable to fetch ${url}`);\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n }\n }\n return undefined;\n }\n }\n\n async getProviders(url?: string) {\n return await this.#fetchData<\n Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider>\n >(url ?? `${this.apiBaseUrl}/auth/providers`);\n }\n\n async getCsrfToken(url?: string) {\n const response = await this.#fetchData<{ csrfToken: string }>(\n url ?? `${this.apiBaseUrl}/auth/csrf`\n );\n return response?.csrfToken;\n }\n\n async getSession(params?: GetSessionParams): Promise<NonErrorSession> {\n if (this.status === State.SESSION) {\n return;\n }\n this.status = State.SESSION;\n if (params?.init) {\n this.requestInit = params.init;\n }\n\n if (params?.baseUrl) {\n this.baseUrl = params.baseUrl;\n }\n\n if (this.state.session && now() < this.state.lastSync) {\n this.status = null;\n return this.state.session;\n }\n this.state.loading = true;\n\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.status = null;\n if (session) {\n this.state.session = session;\n await this.sync('storage');\n return { ...session, loading: this.state.loading };\n }\n return { loading: this.state.loading } as NonErrorSession;\n }\n\n async refreshSession() {\n this.state.loading = true;\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.state.session = session;\n await this.sync('storage');\n return session;\n }\n async signOut<R extends boolean = true>(\n options?: SignOutParams<R> & {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n fetchUrl?: string;\n basePath?: string;\n }\n ): Promise<R extends true ? undefined : SignOutResponse> {\n const {\n callbackUrl = window.location.href,\n baseUrl,\n auth,\n fetchUrl,\n basePath,\n } = options ?? {};\n\n if (basePath) {\n this.state.basePath = basePath;\n }\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n this.requestInit = auth.requestInit;\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n const baseFetch = fetchUrl ?? `${this.apiBaseUrl}/auth/signout`;\n const fetchOptions: RequestInit = {\n method: 'post',\n body: new URLSearchParams({\n csrfToken: String(await this.getCsrfToken()),\n callbackUrl,\n json: String(true),\n }),\n };\n const res = await this.#fetchFormData<SignOutResponse>(\n baseFetch,\n fetchOptions\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'signout' } });\n\n // in the case you are going x-origin, we don't want to trust the nile.callback-url, so we will not redirect and just refresh the page\n if (this.requestInit?.credentials) {\n window.location.href = callbackUrl;\n if (callbackUrl.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n if (options?.redirect ?? true) {\n const url = res?.data?.url ?? callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n\n await this.state.getSession({ event: 'storage' });\n\n return res?.data as R extends true ? undefined : SignOutResponse;\n }\n async signIn<P extends RedirectableProviderType | undefined = undefined>(\n provider?: LiteralUnion<\n P extends RedirectableProviderType\n ? P | BuiltInProviderType\n : BuiltInProviderType\n >,\n options?: SignInOptions & {\n baseUrl?: string;\n providersUrl?: string;\n csrfUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n resetUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n },\n authorizationParams?: SignInAuthorizationParams\n ): Promise<\n P extends RedirectableProviderType ? SignInResponse | undefined : undefined\n > {\n const {\n callbackUrl = window.location.href,\n resetUrl = window.location.href,\n providersUrl,\n csrfUrl,\n baseUrl,\n fetchUrl,\n init,\n auth,\n redirect = true,\n ...remaining\n } = options ?? {};\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n if (init) {\n this.requestInit = init;\n }\n\n const providers = await this.getProviders(providersUrl);\n\n if (!providers) {\n return { error: 'No providers enabled' } as any;\n }\n if (!provider || !(provider in providers)) {\n return { error: `Provider ${provider} not enabled` } as any;\n }\n\n const isCredentials = providers[provider].type === 'credentials';\n const isEmail = providers[provider].type === 'email';\n const isSupportingReturn = isCredentials || isEmail;\n\n const baseFetch = `${this.apiBaseUrl}/auth`;\n const signInUrl =\n fetchUrl ??\n `${baseFetch}/${isCredentials ? 'callback' : 'signin'}/${provider}`;\n\n const _signInUrl = `${signInUrl}${\n authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ''\n }`;\n\n const data = await this.#fetchFormData(_signInUrl, {\n method: 'post',\n body: new URLSearchParams({\n ...remaining,\n csrfToken: String(await this.getCsrfToken(csrfUrl)),\n callbackUrl,\n json: String(true),\n resetUrl,\n }),\n });\n\n if (data?.ok && this.requestInit?.credentials && isSupportingReturn) {\n window.location.reload();\n return;\n }\n\n if (data?.ok && (redirect || !isSupportingReturn)) {\n const url = data?.data.url ?? callbackUrl;\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (data?.ok) {\n await this.initialize();\n await this.getSession({ event: 'storage' });\n }\n return {\n error,\n status: data?.status,\n ok: data?.ok,\n url: error ? null : data?.url,\n } as any;\n }\n async signUp(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n newTenantName?: string;\n createTenant?: string | boolean;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n tenantId?: string;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const {\n password,\n tenantId,\n fetchUrl,\n newTenantName,\n createTenant,\n baseUrl,\n init,\n email,\n auth,\n callbackUrl = window.location.href,\n } = options;\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n\n const searchParams = new URLSearchParams();\n\n if (newTenantName) {\n searchParams.set('newTenantName', newTenantName);\n } else if (createTenant) {\n if (typeof createTenant === 'boolean') {\n searchParams.set('newTenantName', email);\n } else if (typeof createTenant === 'string') {\n searchParams.set('newTenantName', createTenant);\n }\n }\n if (tenantId) {\n searchParams.set('tenantId', tenantId);\n }\n\n let signUpUrl = fetchUrl ?? `${this.apiBaseUrl}/signup`;\n if (searchParams.size > 0) {\n signUpUrl += `?${searchParams}`;\n }\n const data = await this.#fetchData(signUpUrl, {\n method: 'post',\n body: JSON.stringify({ email, password }),\n });\n\n const error = data?.url\n ? new URL(data.url).searchParams.get('error')\n : null;\n\n if (!error) {\n if (data) {\n await this.initialize({ event: 'storage' });\n await this.getSession({ event: 'storage' });\n }\n if (this.requestInit?.credentials) {\n window.location.reload();\n return;\n }\n\n if (options?.redirect ?? true) {\n const url = callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n }\n }\n\n return {\n data,\n error,\n } as any;\n }\n async resetPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, email, redirect, callbackUrl } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'post',\n body: JSON.stringify({\n email,\n password,\n redirectUrl: resetPasswordUrl,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n if (redirect === false) {\n const json = await data?.json();\n const { url: urlWithParams } = json;\n resetPasswordWithParams = `${urlWithParams}&redirect=false`;\n await this.#sendData(resetPasswordWithParams);\n\n return await this.#sendData(resetPasswordWithParams, {\n method: password ? 'put' : 'post',\n body: JSON.stringify({ email, password }),\n });\n }\n }\n\n #configureFetch(params: {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n init?: RequestInit;\n }) {\n const { baseUrl, init, auth } = params;\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n }\n}\nexport interface InternalUrl {\n /** @default \"http://localhost:3000\" */\n origin: string;\n /** @default \"localhost:3000\" */\n host: string;\n /** @default \"/api/auth\" */\n path: string;\n /** @default \"http://localhost:3000/api/auth\" */\n base: string;\n /** @default \"http://localhost:3000/api/auth\" */\n toString: () => string;\n}\n\nfunction parseUrl(url?: string): InternalUrl {\n let defaultUrl = new URL('http://localhost:3000');\n if (typeof window !== 'undefined') {\n defaultUrl = new URL(`${window.location.origin}/api`);\n }\n\n if (url && !url.startsWith('http')) {\n url = `https://${url}`;\n }\n\n const _url = new URL(url ?? defaultUrl);\n const path = (_url.pathname === '/' ? defaultUrl.pathname : _url.pathname)\n // Remove trailing slash\n .replace(/\\/$/, '');\n\n const base = `${_url.origin}${path}`;\n\n return {\n origin: _url.origin,\n host: _url.host,\n path,\n base,\n toString: () => base,\n };\n}\n\nexport const authorizer = new Authorizer();\n\nconst _auth = () => {\n return authorizer;\n};\n\nexport const auth: Authorizer = _auth();\n\nexport const getSession = async function getSession(params?: GetSessionParams) {\n return await auth.getSession(params);\n};\n\nexport const getCsrfToken = async function getCsrfToken(url?: string) {\n return auth.getCsrfToken(url);\n};\n\nexport const getProviders = async function getProviders() {\n return auth.getProviders();\n};\n\nexport const signOut: typeof authorizer.signOut = async function signOut(\n options\n) {\n return auth.signOut(options);\n};\nexport const signIn: typeof authorizer.signIn = async function signOut(\n provider,\n options,\n authParams\n) {\n return auth.signIn(provider, options, authParams);\n};\n\nexport const signUp: typeof authorizer.signUp = async function signUp(options) {\n return auth.signUp(options);\n};\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(options);\n };\n","import { NonErrorSession } from './types';\n\nexport function getStatus(\n load: boolean,\n sess: NonErrorSession | null | undefined\n) {\n if (load) {\n return 'loading';\n }\n if (sess) {\n return 'authenticated';\n }\n return 'unauthenticated';\n}\n"],"mappings":"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","names":["logger","authorizer","error","auth","getSession","getCsrfToken","getProviders","signOut","signUp","resetPassword"]}
|
|
1
|
+
{"version":3,"sources":["../src/logger.ts","../src/broadcast.ts","../src/observable.ts","../src/Authorizer.ts","../src/status.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport Authorizer from './Authorizer';\n\n/* eslint-disable no-console */\nexport class UnknownError extends Error {\n code: string;\n constructor(error: Error | string) {\n // Support passing error or string\n super((error as Error)?.message ?? error);\n this.name = 'UnknownError';\n this.code = (error as any).code;\n if (error instanceof Error) {\n this.stack = error.stack;\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n };\n }\n}\n\n// TODO: better typing\n/** Makes sure that error is always serializable */\nfunction formatError(o: unknown): unknown {\n if (o instanceof Error && !(o instanceof UnknownError)) {\n return JSON.stringify({ message: o.message, stack: o.stack, name: o.name });\n }\n if (hasErrorProperty(o)) {\n o.error = formatError(o.error) as Error;\n o.message = o.message ?? o.error.message;\n }\n return o;\n}\n\nfunction hasErrorProperty(\n x: unknown\n): x is { error: Error; [key: string]: unknown } {\n return !!(x as any)?.error;\n}\n\nexport type WarningCode =\n | 'NEXTAUTH_URL'\n | 'NO_SECRET'\n | 'TWITTER_OAUTH_2_BETA'\n | 'DEBUG_ENABLED';\n\n/**\n * Override any of the methods, and the rest will use the default logger.\n *\n * [Documentation](https://next-auth.js.org/configuration/options#logger)\n */\nexport interface LoggerInstance extends Record<string, (...args: any) => any> {\n warn: (code: WarningCode) => void;\n error: (\n code: string,\n /**\n * Either an instance of (JSON serializable) Error\n * or an object that contains some debug information.\n * (Error is still available through `metadata.error`)\n */\n metadata: Error | { error: Error; [key: string]: unknown }\n ) => void;\n debug: (code: string, metadata: unknown) => void;\n}\n\nconst _logger: LoggerInstance = {\n error(code, metadata) {\n metadata = formatError(metadata) as Error;\n console.error(`[nile-auth][error][${code}]`, metadata.message, metadata);\n },\n warn(code) {\n console.warn(`[nile-auth][warn][${code}]`);\n },\n debug(code, metadata) {\n console.log(`[next-auth][debug][${code}]`, metadata);\n },\n};\n\n/**\n * Override the built-in logger with user's implementation.\n * Any `undefined` level will use the default logger.\n */\nexport function setLogger(\n newLogger: Partial<LoggerInstance> = {},\n debug?: boolean\n) {\n // Turn off debug logging if `debug` isn't set to `true`\n if (!debug) _logger.debug = () => undefined;\n\n if (newLogger.error) _logger.error = newLogger.error;\n if (newLogger.warn) _logger.warn = newLogger.warn;\n if (newLogger.debug) _logger.debug = newLogger.debug;\n}\n\nexport default _logger;\n\n/** Serializes client-side log messages and sends them to the server */\nexport function proxyLogger(\n logger: LoggerInstance = _logger,\n authorizer: Authorizer\n): LoggerInstance {\n try {\n if (typeof window === 'undefined') {\n return logger;\n }\n\n const clientLogger: Record<string, unknown> = {};\n for (const level in logger) {\n clientLogger[level] = (code: string, metadata: Error) => {\n _logger[level](code, metadata); // Logs to console\n\n if (level === 'error') {\n metadata = formatError(metadata) as Error;\n }\n (metadata as any).client = true;\n const url = `${authorizer.state.basePath}/_log`;\n const body = new URLSearchParams({ level, code, ...(metadata as any) });\n if (navigator.sendBeacon) {\n return navigator.sendBeacon(url, body);\n }\n return fetch(url, { method: 'POST', body, keepalive: true });\n };\n }\n return clientLogger as unknown as LoggerInstance;\n } catch {\n return _logger;\n }\n}\n\nexport const logger = (authorizer: Authorizer) =>\n proxyLogger(_logger, authorizer);\n","/** Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC. */\nexport function now() {\n return Math.floor(Date.now() / 1000);\n}\n\nexport interface BroadcastMessage {\n event?: 'session';\n data?: { trigger?: 'signout' | 'getSession' };\n clientId: string;\n timestamp: number;\n}\n\n/**\n * Inspired by [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)\n * Only not using it directly, because Safari does not support it.\n *\n * https://caniuse.com/?search=broadcastchannel\n */\nexport function BroadcastChannel(name = 'nextauth.message') {\n return {\n /** Get notified by other tabs/windows. */\n receive(onReceive: (message: BroadcastMessage) => void) {\n const handler = (event: StorageEvent) => {\n if (event.key !== name) return;\n const message: BroadcastMessage = JSON.parse(event.newValue ?? '{}');\n if (message?.event !== 'session' || !message?.data) return;\n\n onReceive(message);\n };\n window.addEventListener('storage', handler);\n return () => window.removeEventListener('storage', handler);\n },\n /** Notify other tabs/windows. */\n post(message: Record<string, unknown>) {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(\n name,\n JSON.stringify({ ...message, timestamp: now() })\n );\n } catch {\n /**\n * The localStorage API isn't always available.\n * It won't work in private mode prior to Safari 11 for example.\n * Notifications are simply dropped if an error is encountered.\n */\n }\n },\n };\n}\n\nexport const broadcast = BroadcastChannel();\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction isEqual(a: any, b: any): boolean {\n if (a === b) return true; // Same reference or primitive value\n\n if (\n typeof a !== 'object' ||\n typeof b !== 'object' ||\n a === null ||\n b === null\n ) {\n return false; // If one of them is not an object (or is null), return false\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false; // One is an array, the other isn't\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false; // Different number of keys\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !isEqual(a[key], b[key])) {\n return false; // Key missing or values are not deeply equal\n }\n }\n\n return true;\n}\n\nimport { Listener } from './types';\n\nexport function createObservableObject<T = Record<string, unknown>>(\n obj: T,\n listenerKeys = ['loading', 'session'],\n eventName = 'objectChange'\n) {\n const eventTarget = new EventTarget();\n const listeners = new Map();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: ProxyHandler<any> = {\n set(target, key, value) {\n const prev = target[key];\n target[key] = value;\n if (isEqual(prev, value)) return true;\n\n // only fire on these two for now\n if (listenerKeys.includes(String(key))) {\n eventTarget.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { key, prev, next: value },\n })\n );\n }\n return true;\n },\n };\n\n return {\n proxy: new Proxy(obj, handler),\n eventTarget,\n addListener(callback: Listener) {\n if (listeners.has(callback)) {\n return;\n }\n const wrappedCallback = (e: Event) => callback((e as CustomEvent).detail);\n listeners.set(callback, wrappedCallback);\n\n eventTarget.addEventListener(eventName, wrappedCallback);\n },\n removeListener(callback: Listener) {\n const wrappedCallback = listeners.get(callback);\n if (wrappedCallback) {\n eventTarget.removeEventListener(eventName, wrappedCallback);\n listeners.delete(callback);\n }\n },\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n ActiveSession,\n AuthConfig,\n AuthState,\n Config,\n CtxOrReq,\n BuiltInProviderType,\n RedirectableProviderType,\n ClientSafeProvider,\n SignInAuthorizationParams,\n SignInOptions,\n LiteralUnion,\n SignInResponse,\n Listener,\n NonErrorSession,\n PartialAuthorizer,\n SignOutParams,\n SignOutResponse,\n} from './types';\nimport { logger, LoggerInstance } from './logger';\nimport { broadcast, now } from './broadcast';\nimport { createObservableObject } from './observable';\n\nexport type GetSessionParams = CtxOrReq & {\n event?: 'storage' | 'timer' | 'hidden' | string;\n triggerEvent?: boolean;\n broadcast?: boolean;\n baseUrl?: string;\n init?: RequestInit;\n};\n\nenum State {\n SESSION = 'getSession',\n}\n\nexport default class Authorizer {\n state: AuthState;\n #logger: LoggerInstance;\n requestInit?: RequestInit;\n addListener: (cb: Listener) => void;\n removeListener: (cb: Listener) => void;\n status: null | State;\n constructor(config?: AuthConfig) {\n const { proxy, addListener, removeListener } =\n createObservableObject<AuthState>(\n {\n basePath: parseUrl(config?.basePath).path,\n baseUrl: parseUrl(config?.baseUrl).origin,\n lastSync: 0,\n getSession: () => undefined,\n session: undefined,\n loading: true,\n },\n config?.listenerKeys,\n 'auth'\n );\n this.state = proxy;\n this.addListener = addListener;\n this.removeListener = removeListener;\n this.#logger = logger(this);\n this.status = null;\n }\n\n async sync(\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange'\n ) {\n try {\n const storageEvent = event === 'storage';\n if (storageEvent || !this.state.session) {\n this.state.getSession = await this.getSession;\n this.state.lastSync = now();\n }\n if (!event || this.state.session == null || now() < this.state.lastSync) {\n return;\n }\n this.state.lastSync = Date.now();\n this.state.session = await this.getSession();\n } catch (error) {\n this.#logger.error('CLIENT_SESSION_ERROR', error as Error);\n }\n }\n\n set baseUrl(val: string) {\n this.state.baseUrl = val;\n this.#logger = logger(this);\n }\n\n get baseUrl() {\n this.#logger = logger(this);\n return this.state.baseUrl;\n }\n\n configure(config?: Config) {\n if (config?.basePath) this.state.basePath = parseUrl(config?.basePath).path;\n if (config?.baseUrl) this.baseUrl = config.baseUrl;\n if (config?.init) this.requestInit = config.init;\n\n return this;\n }\n sanitize(): PartialAuthorizer {\n return {\n state: {\n baseUrl: this.baseUrl,\n session: {\n user: {\n email: (this.state.session as ActiveSession)?.user?.email,\n },\n },\n },\n requestInit: this.requestInit,\n };\n }\n\n async initialize(params?: {\n baseUrl?: string;\n session?: NonErrorSession | null | undefined;\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';\n }) {\n const { baseUrl, session, event } = params ?? {};\n\n if (baseUrl) this.baseUrl = baseUrl;\n\n const hasInitialSession = session !== undefined;\n\n this.state.loading = !hasInitialSession;\n this.state.lastSync = hasInitialSession ? now() : 0;\n this.state.session = session;\n\n await this.sync(event);\n }\n\n get apiBaseUrl() {\n return `${this.baseUrl}${this.state.basePath}`;\n }\n\n async #sendData(\n url: string,\n init?: RequestInit\n ): Promise<Response | undefined> {\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n\n const filledUrl = !url.startsWith('http')\n ? `${window.location.origin}${url}`\n : url;\n\n const res = await fetch(filledUrl, options);\n this.state.loading = false;\n return res;\n } catch (error) {\n this.#logger.error('CLIENT_FETCH_ERROR', { error: error as Error, url });\n return undefined;\n }\n }\n async #fetchData<T = any>(\n url: string,\n init?: RequestInit\n ): Promise<T | undefined> {\n const options: RequestInit = {\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n const res = await this.#sendData(url, options);\n\n const errorHandler = res?.clone();\n try {\n if (res?.ok) {\n const data = await res.json();\n this.state.loading = false;\n return Object.keys(data).length > 0 ? data : undefined;\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n }\n return undefined;\n }\n }\n async #fetchFormData<T = { url: string }>(\n url: string,\n init: RequestInit\n ): Promise<\n | {\n data: T;\n status: number;\n ok: boolean;\n url: string;\n }\n | undefined\n > {\n try {\n const res = await fetch(url, {\n ...this.requestInit,\n ...init,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n if (res) {\n if (res.ok) {\n return {\n data: (await res.json()) as T,\n status: res.status,\n ok: res.ok,\n url: res.url,\n };\n }\n const { url: responseUrl } = await res.json();\n return {\n data: {} as T,\n status: res.status,\n ok: res?.ok,\n url: responseUrl,\n };\n }\n throw new Error(`Unable to fetch ${url}`);\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n }\n }\n return undefined;\n }\n }\n\n async getProviders(url?: string) {\n return await this.#fetchData<\n Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider>\n >(url ?? `${this.apiBaseUrl}/auth/providers`);\n }\n\n async getCsrfToken(url?: string) {\n const response = await this.#fetchData<{ csrfToken: string }>(\n url ?? `${this.apiBaseUrl}/auth/csrf`\n );\n return response?.csrfToken;\n }\n\n async getSession(params?: GetSessionParams): Promise<NonErrorSession> {\n if (this.status === State.SESSION) {\n return;\n }\n this.status = State.SESSION;\n if (params?.init) {\n this.requestInit = params.init;\n }\n\n if (params?.baseUrl) {\n this.baseUrl = params.baseUrl;\n }\n\n if (this.state.session && now() < this.state.lastSync) {\n this.status = null;\n return this.state.session;\n }\n this.state.loading = true;\n\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.status = null;\n if (session) {\n this.state.session = session;\n await this.sync('storage');\n return { ...session, loading: this.state.loading };\n }\n return { loading: this.state.loading } as NonErrorSession;\n }\n\n async refreshSession() {\n this.state.loading = true;\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.state.session = session;\n await this.sync('storage');\n return session;\n }\n async signOut<R extends boolean = true>(\n options?: SignOutParams<R> & {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n fetchUrl?: string;\n basePath?: string;\n }\n ): Promise<R extends true ? undefined : SignOutResponse> {\n const {\n callbackUrl = window.location.href,\n baseUrl,\n auth,\n fetchUrl,\n basePath,\n } = options ?? {};\n\n if (basePath) {\n this.state.basePath = basePath;\n }\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n this.requestInit = auth.requestInit;\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n const baseFetch = fetchUrl ?? `${this.apiBaseUrl}/auth/signout`;\n const fetchOptions: RequestInit = {\n method: 'post',\n body: new URLSearchParams({\n csrfToken: String(await this.getCsrfToken()),\n callbackUrl,\n json: String(true),\n }),\n };\n const res = await this.#fetchFormData<SignOutResponse>(\n baseFetch,\n fetchOptions\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'signout' } });\n\n // in the case you are going x-origin, we don't want to trust the nile.callback-url, so we will not redirect and just refresh the page\n if (this.requestInit?.credentials) {\n window.location.href = callbackUrl;\n if (callbackUrl.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n if (options?.redirect ?? true) {\n const url = res?.data?.url ?? callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n\n await this.state.getSession({ event: 'storage' });\n\n return res?.data as R extends true ? undefined : SignOutResponse;\n }\n async signIn<P extends RedirectableProviderType | undefined = undefined>(\n provider?: LiteralUnion<\n P extends RedirectableProviderType\n ? P | BuiltInProviderType\n : BuiltInProviderType\n >,\n options?: SignInOptions & {\n baseUrl?: string;\n providersUrl?: string;\n csrfUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n resetUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n },\n authorizationParams?: SignInAuthorizationParams\n ): Promise<\n P extends RedirectableProviderType ? SignInResponse | undefined : undefined\n > {\n const {\n callbackUrl = window.location.href,\n resetUrl = window.location.href,\n providersUrl,\n csrfUrl,\n baseUrl,\n fetchUrl,\n init,\n auth,\n redirect = true,\n ...remaining\n } = options ?? {};\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n if (init) {\n this.requestInit = init;\n }\n\n const providers = await this.getProviders(providersUrl);\n\n if (!providers) {\n return { error: 'No providers enabled' } as any;\n }\n if (!provider || !(provider in providers)) {\n return { error: `Provider ${provider} not enabled` } as any;\n }\n\n const isCredentials = providers[provider].type === 'credentials';\n const isEmail = providers[provider].type === 'email';\n const isSupportingReturn = isCredentials || isEmail;\n\n const baseFetch = `${this.apiBaseUrl}/auth`;\n const signInUrl =\n fetchUrl ??\n `${baseFetch}/${isCredentials ? 'callback' : 'signin'}/${provider}`;\n\n const _signInUrl = `${signInUrl}${\n authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ''\n }`;\n\n const data = await this.#fetchFormData(_signInUrl, {\n method: 'post',\n body: new URLSearchParams({\n ...remaining,\n csrfToken: String(await this.getCsrfToken(csrfUrl)),\n callbackUrl,\n json: String(true),\n resetUrl,\n }),\n });\n\n if (data?.ok && this.requestInit?.credentials && isSupportingReturn) {\n window.location.reload();\n return;\n }\n\n if (data?.ok && (redirect || !isSupportingReturn)) {\n const url = data?.data.url ?? callbackUrl;\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (data?.ok) {\n await this.initialize();\n await this.getSession({ event: 'storage' });\n }\n return {\n error,\n status: data?.status,\n ok: data?.ok,\n url: error ? null : data?.url,\n } as any;\n }\n async signUp(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n newTenantName?: string;\n createTenant?: string | boolean;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n tenantId?: string;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const {\n password,\n tenantId,\n fetchUrl,\n newTenantName,\n createTenant,\n baseUrl,\n init,\n email,\n auth,\n callbackUrl = window.location.href,\n } = options;\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n\n const searchParams = new URLSearchParams();\n\n if (newTenantName) {\n searchParams.set('newTenantName', newTenantName);\n } else if (createTenant) {\n if (typeof createTenant === 'boolean') {\n searchParams.set('newTenantName', email);\n } else if (typeof createTenant === 'string') {\n searchParams.set('newTenantName', createTenant);\n }\n }\n if (tenantId) {\n searchParams.set('tenantId', tenantId);\n }\n\n let signUpUrl = fetchUrl ?? `${this.apiBaseUrl}/signup`;\n if (searchParams.size > 0) {\n signUpUrl += `?${searchParams}`;\n }\n const data = await this.#fetchData(signUpUrl, {\n method: 'post',\n body: JSON.stringify({ email, password }),\n });\n\n const error = data?.url\n ? new URL(data.url).searchParams.get('error')\n : null;\n\n if (!error) {\n if (data) {\n await this.initialize({ event: 'storage' });\n await this.getSession({ event: 'storage' });\n }\n if (this.requestInit?.credentials) {\n window.location.reload();\n return;\n }\n\n if (options?.redirect ?? true) {\n const url = callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n }\n }\n\n return {\n data,\n error,\n } as any;\n }\n async resetPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, email, redirect, callbackUrl } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'post',\n body: JSON.stringify({\n email,\n password,\n redirectUrl: resetPasswordUrl,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n if (redirect === false) {\n const json = await data?.json();\n const { url: urlWithParams } = json;\n resetPasswordWithParams = `${urlWithParams}&redirect=false`;\n await this.#sendData(resetPasswordWithParams);\n\n return await this.#sendData(resetPasswordWithParams, {\n method: password ? 'put' : 'post',\n body: JSON.stringify({ email, password }),\n });\n }\n }\n\n #configureFetch(params: {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n init?: RequestInit;\n }) {\n const { baseUrl, init, auth } = params;\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n }\n}\nexport interface InternalUrl {\n /** @default \"http://localhost:3000\" */\n origin: string;\n /** @default \"localhost:3000\" */\n host: string;\n /** @default \"/api/auth\" */\n path: string;\n /** @default \"http://localhost:3000/api/auth\" */\n base: string;\n /** @default \"http://localhost:3000/api/auth\" */\n toString: () => string;\n}\n\nfunction parseUrl(url?: string): InternalUrl {\n let defaultUrl = new URL('http://localhost:3000');\n if (typeof window !== 'undefined') {\n defaultUrl = new URL(`${window.location.origin}/api`);\n }\n\n if (url && !url.startsWith('http')) {\n url = `https://${url}`;\n }\n\n const _url = new URL(url ?? defaultUrl);\n const path = (_url.pathname === '/' ? defaultUrl.pathname : _url.pathname)\n // Remove trailing slash\n .replace(/\\/$/, '');\n\n const base = `${_url.origin}${path}`;\n\n return {\n origin: _url.origin,\n host: _url.host,\n path,\n base,\n toString: () => base,\n };\n}\n\nexport const authorizer = new Authorizer();\n\nconst _auth = () => {\n return authorizer;\n};\n\nexport const auth: Authorizer = _auth();\n\nexport const getSession = async function getSession(params?: GetSessionParams) {\n return await auth.getSession(params);\n};\n\nexport const getCsrfToken = async function getCsrfToken(url?: string) {\n return auth.getCsrfToken(url);\n};\n\nexport const getProviders = async function getProviders() {\n return auth.getProviders();\n};\n\nexport const signOut: typeof authorizer.signOut = async function signOut(\n options\n) {\n return auth.signOut(options);\n};\nexport const signIn: typeof authorizer.signIn = async function signOut(\n provider,\n options,\n authParams\n) {\n return auth.signIn(provider, options, authParams);\n};\n\nexport const signUp: typeof authorizer.signUp = async function signUp(options) {\n return auth.signUp(options);\n};\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(options);\n };\n","import { NonErrorSession } from './types';\n\nexport function getStatus(\n load: boolean,\n sess: NonErrorSession | null | undefined\n) {\n if (load) {\n return 'loading';\n }\n if (sess) {\n return 'authenticated';\n }\n return 'unauthenticated';\n}\n"],"mappings":"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","names":["logger","authorizer","error","auth","getSession","getCsrfToken","getProviders","signOut","signUp","resetPassword"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@niledatabase/client",
|
|
3
|
-
"version": "5.0.0-alpha.
|
|
3
|
+
"version": "5.0.0-alpha.9",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -58,5 +58,5 @@
|
|
|
58
58
|
"tsup": "^8.3.0",
|
|
59
59
|
"typescript": "^5.3.2"
|
|
60
60
|
},
|
|
61
|
-
"gitHead": "
|
|
61
|
+
"gitHead": "0a9e4f3a9099ec5c76f55535b17c9dd32c5cc030"
|
|
62
62
|
}
|