@niledatabase/server 2.3.0-alpha.2 → 2.3.0-alpha.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs.production.min.js","sources":["../src/utils/Logger.ts","../src/utils/Config/envVars.ts","../src/utils/Config/index.ts","../src/utils/Event/index.ts","../src/utils/ResponseError.ts","../src/utils/fetch.ts","../src/utils/Requester/index.ts","../src/auth/index.ts","../src/users/index.ts","../src/tenants/index.ts","../src/db/NileInstance.ts","../src/db/PoolProxy.ts","../src/db/DBManager.ts","../src/utils/Server/index.ts","../src/Server.ts","../src/index.ts"],"sourcesContent":["import { ServerConfig } from '../types';\n\nimport { Config } from './Config';\n\nexport default function Logger(\n config: void | Config | ServerConfig,\n ...params: unknown[]\n) {\n return {\n info(...args: unknown[]) {\n if (config?.debug) {\n // eslint-disable-next-line no-console\n console.info('[niledb]', ...params, ...args);\n }\n },\n warn(...args: unknown[]) {\n if (config?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[niledb]', ...params, ...args);\n }\n },\n error(...args: unknown[]) {\n // eslint-disable-next-line no-console\n console.error('[niledb]', '[ERROR]', ...params, ...args);\n },\n };\n}\n","import 'dotenv/config';\nimport { ServerConfig } from '../../types';\nimport Logger from '../Logger';\n\nexport type EnvConfig = {\n logger?: string;\n config?: ServerConfig;\n};\n\nexport const getDatbaseId = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[databaseId]');\n if (config?.databaseId) {\n logger && info(logger, 'config', config.databaseId);\n return String(config?.databaseId);\n }\n logger && info(logger, 'env', process.env.NILEDB_ID);\n return process.env.NILEDB_ID;\n};\nexport const getUsername = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[username]');\n if (config?.user) {\n logger && info(logger, 'config', config.user);\n return String(config?.user);\n }\n logger && info(logger, '.env', process.env.NILEDB_USER);\n return process.env.NILEDB_USER;\n};\n\nexport const getPassword = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const log = logProtector(logger);\n const { info } = Logger(config, '[password]');\n if (config?.password) {\n log && info(logger, 'config', config.password);\n\n return String(config.password);\n }\n\n log && info(logger, '.env', process.env.NILEDB_PASSWORD);\n return process.env.NILEDB_PASSWORD;\n};\n\nexport const getInfoBearer = (cfg: EnvConfig) => {\n return `${getUsername(cfg)}:${getPassword(cfg)}`;\n};\n\nexport const getToken = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[token]');\n if (config?.api?.token) {\n logger && info(logger, 'config', config.api?.token);\n return String(config.api?.token);\n }\n if (process.env.NILEDB_TOKEN) {\n logger && info(logger, '.env', process.env.NILEDB_TOKEN);\n return process.env.NILEDB_TOKEN;\n }\n return undefined;\n};\n\nexport const getDatabaseName = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[databaseName]');\n if (config?.databaseName) {\n logger && info(logger, 'config', config.databaseName);\n return String(config.databaseName);\n }\n if (process.env.NILEDB_NAME) {\n logger && info(logger, 'config', process.env.NILEDB_NAME);\n return process.env.NILEDB_NAME;\n }\n return null;\n};\n\nexport const getTenantId = (cfg: EnvConfig): string | null => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[tenantId]');\n if (config?.tenantId) {\n logger && info(logger, 'config', config.tenantId);\n return config.tenantId;\n }\n\n if (process.env.NILEDB_TENANT) {\n logger && info(logger, '.env', process.env.NILEDB_TENANT);\n return process.env.NILEDB_TENANT;\n }\n\n return null;\n};\n\nexport const getBasePath = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[basePath]');\n const basePath = config?.api?.basePath;\n if (basePath) {\n logger && info(logger, 'config', config?.api?.basePath);\n return basePath;\n }\n\n if (process.env.NILEDB_API) {\n logger && info(logger, '.env', process.env.NILEDB_API);\n return `https://${process.env.NILEDB_API}`;\n }\n\n logger && info(logger, 'default', process.env.NILEDB_API);\n return 'https://api.thenile.dev';\n};\n\nexport function getDbHost(cfg: EnvConfig) {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.host]');\n\n if (config?.db && config.db.host) {\n logger && info(logger, 'config', config?.db.host);\n return config.db.host;\n }\n\n if (process.env.NILEDB_HOST) {\n logger && info(logger, '.env', process.env.NILEDB_HOST);\n return process.env.NILEDB_HOST;\n }\n\n logger && info(logger, 'default', 'db.thenile.dev');\n return 'db.thenile.dev';\n}\n\nexport function getDbPort(cfg: EnvConfig): number {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.port]');\n if (config?.db?.port && config.db.port != null) {\n logger && info(logger, 'config', config?.db.port);\n return Number(config.db?.port);\n }\n\n if (process.env.NILEDB_PORT) {\n logger && info(logger, 'config', process.env.NILEDB_PORT);\n return Number(process.env.NILEDB_PORT);\n }\n logger && info(logger, 'default', 5432);\n return 5432;\n}\n\n// don't let people accidentally log secrets to production\nconst logProtector = (logger?: string) => {\n return process.env.NODE_ENV === 'development' ||\n process.env.NODE_ENV === 'test'\n ? logger\n : null;\n};\n","import { NilePoolConfig, ServerConfig } from '../../types';\nimport Logger from '../Logger';\n\nimport {\n EnvConfig,\n getBasePath,\n getDatabaseName,\n getDatbaseId,\n getDbHost,\n getDbPort,\n getInfoBearer,\n getPassword,\n getTenantId,\n getToken,\n getUsername,\n} from './envVars';\n\ntype Database = {\n name: string;\n apiHost: string;\n dbHost: string;\n id: string;\n message?: string; // is actually an error\n status: 'READY' | string;\n};\nclass ApiConfig {\n public cookieKey?: string;\n public basePath?: string;\n private _token?: string;\n constructor({\n basePath,\n cookieKey,\n token,\n }: {\n basePath: string;\n cookieKey: string;\n token: string | undefined;\n }) {\n this.basePath = basePath;\n this.cookieKey = cookieKey;\n this._token = token;\n }\n\n public get token(): string | undefined {\n return this._token;\n }\n\n public set token(value: string | undefined) {\n this._token = value;\n }\n}\n\nexport class Config {\n user: string;\n password: string;\n databaseId: string;\n databaseName: string;\n\n debug: boolean;\n\n db: NilePoolConfig;\n\n api: ApiConfig;\n\n private _tenantId?: string | undefined | null;\n private _userId?: string | undefined | null;\n\n public get tenantId(): string | undefined | null {\n return this._tenantId;\n }\n\n public set tenantId(value: string | undefined | null) {\n this._tenantId = value;\n }\n\n public get userId(): string | undefined | null {\n return this._userId;\n }\n\n public set userId(value: string | undefined | null) {\n this._userId = value;\n }\n\n constructor(config: ServerConfig) {\n const envVarConfig: EnvConfig = { config };\n\n this.databaseId = getDatbaseId(envVarConfig) as string;\n this.user = getUsername(envVarConfig) as string;\n this.password = getPassword(envVarConfig) as string;\n this.databaseName = getDatabaseName(envVarConfig) as string;\n this._tenantId = getTenantId(envVarConfig);\n this.debug = Boolean(config?.debug);\n this._userId = config?.userId;\n\n const basePath = getBasePath(envVarConfig);\n const host = getDbHost(envVarConfig);\n const port = getDbPort(envVarConfig);\n\n this.api = new ApiConfig({\n basePath,\n cookieKey: config?.api?.cookieKey ?? 'token',\n token: getToken({ config }),\n });\n this.db = {\n user: this.user,\n password: this.password,\n host,\n port,\n ...(typeof config?.db === 'object' ? config.db : {}),\n };\n if (this.databaseName) {\n this.db.database = this.databaseName;\n }\n }\n\n configure = async (config: ServerConfig): Promise<Config> => {\n const envVarConfig: EnvConfig = {\n config,\n };\n let host = getDbHost(envVarConfig);\n const { info, error } = Logger(config, '[init]');\n\n if (host && this.databaseName && this.databaseId) {\n info('Alreaady configured, aborting fetch');\n return this;\n }\n\n let basePath = getBasePath(envVarConfig);\n const port = getDbPort(envVarConfig);\n\n const databaseName = getDatabaseName({ config, logger: 'getInfo' });\n const url = new URL(`${basePath}/databases/configure`);\n if (databaseName) {\n url.searchParams.set('databaseName', databaseName);\n }\n info(url.href);\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${getInfoBearer({ config })}`,\n },\n });\n let database: Database;\n const possibleError = res.clone();\n try {\n const json: Database = await res.json();\n if (res.status === 404) {\n info('is the configured databaseName correct?');\n }\n if (json.status && json.status !== 'READY') {\n database = { message: 'Database is not ready yet' } as Database;\n } else {\n database = json;\n }\n } catch (e) {\n const message = await possibleError.text();\n error(message);\n database = { message } as Database;\n }\n info('[fetched database]', database);\n if (process.env.NODE_ENV !== 'TEST') {\n if ('message' in database) {\n if ('statusCode' in database) {\n error(database);\n throw new Error('HTTP error has occured');\n } else {\n throw new Error(\n 'Unable to auto-configure. Please set or remove NILEDB_API, NILEDB_NAME, and NILEDB_HOST in your .env file.'\n );\n }\n }\n if (typeof database === 'object') {\n const { apiHost, dbHost, name, id } = database;\n this.databaseId = id;\n this.databaseName = name;\n const dburl = new URL(dbHost);\n const apiurl = new URL(apiHost);\n host = dburl.host;\n basePath = apiurl.origin;\n }\n }\n this.api = new ApiConfig({\n basePath,\n cookieKey: config?.api?.cookieKey ?? 'token',\n token: getToken({ config }),\n });\n this.db = {\n user: this.user,\n password: this.password,\n host,\n port,\n database: this.databaseName,\n ...(typeof config?.db === 'object' ? config.db : {}),\n };\n info('[config set]', this);\n return this;\n };\n}\n","type BusValues = undefined | null | string;\ntype EventFn = (params: BusValues) => void;\nenum Events {\n User = 'userId',\n Tenant = 'tenantId',\n Token = 'token',\n EvictPool = 'EvictPool',\n}\nclass Eventer {\n events: { [key: string]: EventFn[] };\n constructor() {\n this.events = {};\n }\n publish(eventName: string, value: BusValues) {\n // Get all the callback functions of the current event\n const callbackList = this.events[eventName];\n\n // execute each callback function\n if (callbackList) {\n for (const callback of callbackList) {\n callback(value);\n }\n }\n }\n // Subscribe to events\n subscribe(eventName: string, callback: EventFn) {\n // initialize this event\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n\n // store the callback function of the subscriber\n this.events[eventName].push(callback);\n }\n}\n\n// tenantId manager\nconst eventer = new Eventer();\n\nexport const updateTenantId = (tenantId: BusValues) => {\n eventer.publish(Events.Tenant, tenantId);\n};\n\nexport const watchTenantId = (cb: EventFn) =>\n eventer.subscribe(Events.Tenant, cb);\n\nexport const updateUserId = (userId: BusValues) => {\n eventer.publish(Events.User, userId);\n};\n\nexport const watchUserId = (cb: EventFn) => eventer.subscribe(Events.User, cb);\n\nexport const updateToken = (val: BusValues) => {\n eventer.publish(Events.Token, val);\n};\n\nexport const watchToken = (cb: EventFn) => eventer.subscribe(Events.Token, cb);\n\nexport const watchEvictPool = (cb: EventFn) =>\n eventer.subscribe(Events.EvictPool, cb);\nexport const evictPool = (val: BusValues) => {\n eventer.publish(Events.EvictPool, val);\n};\n","export class ResponseError {\n response: Response;\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this.response = new Response(body, init);\n }\n}\n","import { decodeJwt } from 'jose';\n\nimport { ResponseError } from './ResponseError';\nimport { Config } from './Config';\nimport { NileRequest } from './Requester';\nimport { updateTenantId, updateUserId } from './Event';\nimport { getToken } from './Config/envVars';\nimport Logger from './Logger';\n\nexport const X_NILE_TENANT = 'x-nile-tenantId';\nexport const X_NILE_USER_ID = 'x-nile-userId';\n\nexport function handleTenantId(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n req: NileRequest<any>,\n config: Config\n): ResponseError | void {\n // already set, no need to try and figure it out\n if (config.tenantId) {\n return;\n }\n return new ResponseError('tenant id needs to be set', { status: 400 });\n}\n\nfunction getTokenFromCookie(headers: Headers, cookieKey: void | string) {\n const cookie = headers.get('cookie')?.split('; ');\n const _cookies: Record<string, string> = {};\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n if (cookieKey) {\n return _cookies[cookieKey];\n }\n return null;\n}\nexport function getTenantFromHttp(headers: Headers, config: Config) {\n const cookieTenant = getTokenFromCookie(headers, 'tenantId');\n return cookieTenant ?? headers?.get(X_NILE_TENANT) ?? config.tenantId;\n}\n\nexport function getUserFromHttp(headers: Headers, config: Config) {\n const token = getTokenFromCookie(headers, config.api.cookieKey);\n if (token) {\n const jwt = decodeJwt(token);\n return jwt.sub;\n }\n return headers?.get(X_NILE_USER_ID) ?? config.userId;\n}\n\nexport async function _fetch(\n config: Config,\n path: string,\n opts?: RequestInit\n): Promise<Response | ResponseError> {\n const { info, error } = Logger(config, '[server]');\n\n const url = `${config.api?.basePath}${path}`;\n const cookieKey = config.api?.cookieKey;\n const headers = new Headers(opts?.headers);\n const basicHeaders = new Headers();\n basicHeaders.set('content-type', 'application/json; charset=utf-8');\n const authHeader = headers.get('Authorization');\n if (!authHeader) {\n const token = getTokenFromCookie(headers, cookieKey);\n if (token) {\n basicHeaders.set('Authorization', `Bearer ${token}`);\n } else if (getToken({ config })) {\n basicHeaders.set('Authorization', `Bearer ${getToken({ config })}`);\n }\n }\n\n const tenantId = getTenantFromHttp(headers, config);\n updateTenantId(tenantId);\n const userId = getUserFromHttp(headers, config);\n updateUserId(userId);\n if (url.includes('{tenantId}') && !tenantId) {\n return new ResponseError('tenantId is not set for request', {\n status: 400,\n });\n }\n const useableUrl = url\n .replace('{tenantId}', encodeURIComponent(String(tenantId)))\n .replace('{userId}', encodeURIComponent(String(userId)));\n\n info('[fetch]', useableUrl);\n\n const response = await fetch(useableUrl, {\n ...opts,\n headers: basicHeaders,\n }).catch((e) => {\n error('[fetch]', '[response]', e);\n });\n\n if (response && response.status >= 200 && response.status < 300) {\n if (typeof response.clone === 'function') {\n info('[fetch]', '[response]', await response.clone().json());\n }\n return response;\n }\n\n let res;\n const errorHandler =\n typeof response?.clone === 'function' ? response.clone() : null;\n let msg = '';\n try {\n res = await (response as Response)?.json();\n } catch (e) {\n if (errorHandler) {\n msg = await errorHandler.text();\n if (msg) {\n error('[fetch]', '[response]', `[status: ${errorHandler.status}]`, msg);\n }\n }\n if (!msg) {\n error('[fetch]', '[response]', e);\n }\n }\n if (msg) {\n return new ResponseError(msg, { status: errorHandler?.status });\n }\n\n if (res && 'message' in res) {\n const { message } = res;\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n message\n );\n return new ResponseError(message, { status: 400 });\n }\n if (res && 'errors' in res) {\n const {\n errors: [message],\n } = res;\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n message\n );\n return new ResponseError(message, { status: 400 });\n }\n\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n 'UNHANDLED ERROR'\n );\n return new ResponseError(null, {\n status: (response as Response)?.status ?? 500,\n });\n}\n","import { Config } from '../Config';\nimport { ResponseError } from '../ResponseError';\nimport { X_NILE_TENANT, _fetch } from '../fetch';\n\nexport { NileResponse, NileRequest } from './types';\n\ntype Methods = 'POST' | 'GET' | 'PUT';\nexport default class Requester<T> extends Config {\n constructor(config: Config) {\n super(config);\n }\n\n async rawRequest(\n method: Methods,\n url: string,\n init: RequestInit,\n body?: string\n ): Promise<Response> {\n const _init = {\n ...init,\n body,\n method,\n };\n\n const res = await _fetch(this, url, _init);\n\n if (res instanceof ResponseError) {\n return res.response;\n }\n\n return res;\n }\n\n /**\n * three optios here\n * 1) pass in headers for a server side request\n * 2) pass in the payload that matches the api\n * 3) pass in the request object sent by a browser\n * @param method\n * @param url\n * @param req\n * @param init\n * @returns\n */\n protected async request(\n method: Methods,\n url: string,\n req: T | Headers,\n init?: RequestInit\n ): Promise<Response> {\n // set the headers\n const headers = new Headers(init ? init?.headers : {});\n if (req instanceof Headers) {\n const tenantId = req.get(X_NILE_TENANT);\n const cookie = req.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n } else if (req instanceof Request) {\n // pass back the X_NILE_TENANT\n const _headers = new Headers(req?.headers);\n const tenantId = _headers.get(X_NILE_TENANT);\n const cookie = _headers.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n }\n // default the body - may be the actual payload for the API\n let body: string | undefined = JSON.stringify(req);\n\n // comes from next/some server\n if (method === 'GET') {\n body = undefined;\n } else if (req instanceof Request) {\n body = await new Response(req.body).text();\n } else if (\n // is just headers for a GET request\n req instanceof Headers ||\n JSON.stringify(req) === '{}' ||\n (req && typeof req === 'object' && Object.values(req).length === 0)\n ) {\n body = undefined;\n }\n\n const _init = {\n ...init,\n headers,\n };\n\n return await this.rawRequest(method, url, _init, body);\n }\n\n post = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('POST', url, req, init);\n };\n\n get = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('GET', url, req, init);\n };\n\n put = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('PUT', url, req, init);\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\nimport { ResponseError } from '../utils/ResponseError';\nimport {\n X_NILE_TENANT,\n X_NILE_USER_ID,\n getTenantFromHttp,\n} from '../utils/fetch';\nimport { updateToken, updateUserId } from '../utils/Event';\nimport { CreateBasicUserRequest, LoginUserResponse } from '../users';\n\nexport interface TenantSSORegistration {\n configUrl: string;\n clientId: string;\n clientSecret: string;\n redirectURI: string;\n emailDomains: Array<string>;\n enabled?: boolean;\n}\n\nexport interface SSOProvider {\n readonly id?: string;\n tenantId?: string;\n provider?: string;\n configUrl: string;\n clientSecret?: string;\n clientId: string;\n redirectURI: string;\n emailDomains?: Array<string>;\n enabled?: boolean;\n}\nexport default class Auth extends Config {\n constructor(config: Config) {\n super(config);\n }\n get loginUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users/login`;\n }\n\n login = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const headers = new Headers({ 'content-type': 'application/json' });\n const _requester = new Requester(this);\n\n const params =\n req instanceof Request\n ? new URL(req.url).searchParams\n : new URLSearchParams();\n\n const sso = params.get('sso');\n\n if (sso === 'true') {\n const providerRes = await this.listProviders(\n (req as Request).clone(),\n init\n );\n // if you have a provider, log them in\n if (\n providerRes &&\n providerRes.status >= 200 &&\n providerRes.status < 300\n ) {\n const providers = await new Response(providerRes.body).json();\n if (providers.length > 0) {\n if (providers.length > 1) {\n return new Response(JSON.stringify(providers), { status: 200 });\n // a user has to make a choice\n }\n\n // is there a way to do this? probably not.\n headers.set(X_NILE_TENANT, providers[0].tenantId);\n headers.append(\n 'set-cookie',\n `tenantId=${providers[0].tenantId}; path=/; httponly;`\n );\n // const ssoResp = await this.loginSSO(req);\n return new Response(\n JSON.stringify({\n redirectURI: `${this.api.basePath}${this.loginSSOUrl('okta')}`,\n }),\n { status: 200 }\n );\n // make it a client side redirect, because of the headers\n // if there is no provider, require a password.\n }\n }\n }\n\n const res = await _requester.post(req, this.loginUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { tenants } = token;\n const tenant = tenants?.values();\n const tenantId = tenant?.next().value;\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n updateToken(token.token.jwt);\n\n return new Response(JSON.stringify(token), { status: 200, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n loginSSO = (redirectUrl: string) => {\n const ssoLogin = async (\n req: NileRequest<unknown>\n ): NileResponse<Response> => {\n const headers = new Headers();\n const body = await (req as Request).formData();\n const accessToken = (await body.get('access_token')) as string;\n const tenantId = (await body.get('tenantId')) as string;\n const cookie = `${this.api?.cookieKey}=${accessToken}; path=/; samesite=lax; httponly;`;\n updateToken(accessToken);\n headers.append('set-cookie', cookie);\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n headers.set('Location', redirectUrl);\n return new Response(null, {\n headers,\n status: 303,\n });\n };\n return ssoLogin;\n };\n\n loginSSOUrl = (provider: string) => {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }/auth/oidc/providers/${provider}/login`;\n };\n\n get signUpUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users`;\n }\n\n signUp = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const headers = new Headers();\n const _requester = new Requester(this);\n const res = await _requester.post(req, this.signUpUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token?.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { id } = token;\n updateToken(token.token?.jwt);\n updateUserId(id);\n headers.set(X_NILE_USER_ID, id);\n headers.append('set-cookie', `userId=${id}; path=/; httponly;`);\n return new Response(JSON.stringify(token), { status: 201, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n updateProviderUrl(providerName: string) {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers/${encodeURIComponent(providerName)}`;\n }\n\n get listTenantProvidersUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers`;\n }\n\n listTenantProviders = async (\n req: NileRequest<void | Headers>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.listTenantProvidersUrl, init);\n };\n\n createProvider = async (\n req: NileRequest<SSOProvider>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.post(req, this.updateProviderUrl(providerName), init);\n };\n\n updateProvider = async (\n req: NileRequest<SSOProvider>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.put(req, this.updateProviderUrl(providerName), init);\n };\n\n providerUrl(email?: undefined | string) {\n return `/databases/${encodeURIComponent(\n this.databaseId\n )}/tenants/auth/oidc/providers${\n email ? `?email=${encodeURIComponent(email)}` : ''\n }`;\n }\n\n listProviders = async (\n req: NileRequest<void | CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n let body: { email: string } | undefined;\n // this is a get. Get the email from the response body so the request is filtered.\n if (req && 'body' in req) {\n body = await new Response(req.body as BodyInit).json();\n }\n return _requester.get(req, this.providerUrl(body?.email), init);\n };\n\n getSSOCallbackUrl = (param: Headers | string) => {\n let tenantId;\n if (typeof tenantId === 'string') {\n tenantId = param;\n } else if (param instanceof Headers) {\n tenantId = getTenantFromHttp(param, this);\n }\n\n return `/databases/${this.databaseId}/tenants/${tenantId}/auth/oidc/callback`;\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport interface CreateBasicUserRequest {\n email: string;\n password: string;\n preferredName?: string;\n newTenant?: string;\n}\nexport const LoginUserResponseTokenTypeEnum = {\n AccessToken: 'ACCESS_TOKEN',\n RefreshToken: 'REFRESH_TOKEN',\n IdToken: 'ID_TOKEN',\n} as const;\nexport type LoginUserResponseTokenTypeEnum =\n (typeof LoginUserResponseTokenTypeEnum)[keyof typeof LoginUserResponseTokenTypeEnum];\n\nexport interface LoginUserResponseToken {\n jwt: string;\n maxAge: number;\n type: LoginUserResponseTokenTypeEnum;\n}\nexport interface LoginUserResponse {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n id: string;\n token: LoginUserResponseToken;\n}\nexport interface User {\n id?: string;\n tenants?: Set<string>;\n email?: string;\n preferredName?: string;\n}\n\nexport default class Users extends Config {\n constructor(config: Config) {\n super(config);\n }\n\n get baseUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}`;\n }\n\n get usersUrl() {\n return `${this.baseUrl}/users`;\n }\n\n get tenantUsersUrl() {\n return `${this.baseUrl}/tenants/${this.tenantId ?? '{tenantId}'}/users`;\n }\n\n createTenantUser = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const _requester = new Requester(this);\n return await _requester.post(req, this.tenantUsersUrl, init);\n };\n\n listUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): NileResponse<User[]> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.usersUrl, init);\n };\n\n updateUser = async (\n userId: string,\n req: NileRequest<User>,\n init?: RequestInit\n ): NileResponse<User> => {\n const _requester = new Requester(this);\n return await _requester.put(req, `${this.usersUrl}/${userId}`, init);\n };\n\n listTenantUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): NileResponse<User[]> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.tenantUsersUrl, init);\n };\n\n get meUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users/me`;\n }\n\n me = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<User> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.meUrl, init);\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport interface Tenant {\n id: string;\n name?: string;\n}\n\nexport default class Tenants extends Config {\n constructor(config: Config) {\n super(config);\n }\n get tenantsUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants`;\n }\n get tenantUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }`;\n }\n\n createTenant = async (\n req: NileRequest<{ name: string }>,\n init?: RequestInit\n ): NileResponse<Tenant> => {\n const _requester = new Requester(this);\n return _requester.post(req, this.tenantsUrl, init);\n };\n\n getTenant = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<Tenant> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.tenantUrl, init);\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { evictPool } from '../utils/Event';\nimport { AfterCreate } from '../types';\nimport Logger from '../utils/Logger';\n\nimport { createProxyForPool } from './PoolProxy';\n\nclass NileDatabase {\n pool: Pool;\n tenantId?: undefined | null | string;\n userId?: undefined | null | string;\n id: string;\n config: Config;\n timer: NodeJS.Timeout | undefined;\n\n constructor(config: Config, id: string) {\n const { warn, info } = Logger(config, '[NileInstance]');\n this.id = id;\n const poolConfig = {\n min: 0,\n max: 10,\n idleTimeoutMillis: 30000,\n ...config.db,\n };\n const { afterCreate, ...remaining } = poolConfig;\n\n config.db = poolConfig;\n this.config = config;\n info(this.config);\n\n this.pool = createProxyForPool(new Pool(remaining), this.config);\n\n if (typeof afterCreate === 'function') {\n warn(\n 'Providing an pool configuration will stop automatic tenant context setting.'\n );\n }\n\n // start the timer for cleanup\n this.startTimeout();\n this.pool.on('connect', async (client) => {\n info('pool connected');\n const afterCreate: AfterCreate = makeAfterCreate(config);\n afterCreate(client, (err, _client) => {\n if (err) {\n _client.release();\n }\n });\n this.startTimeout();\n });\n this.pool.on('error', async (e) => {\n info('pool failed', e);\n });\n }\n\n startTimeout() {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(async () => {\n await this.pool.end();\n evictPool(this.id);\n }, this.config.db.idleTimeoutMillis);\n }\n}\n\nexport default NileDatabase;\n\nfunction makeAfterCreate(config: Config): AfterCreate {\n const { warn, info } = Logger(config, '[afterCreate]');\n return (conn, done) => {\n conn.on('error', function errorHandler(error: Error) {\n warn('Connection was terminated by server', error);\n done(error, conn);\n });\n\n if (config.tenantId) {\n const query = [`SET nile.tenant_id = '${config.tenantId}'`];\n if (config.userId) {\n if (!config.tenantId) {\n warn('A user id cannot be set in context without a tenant id');\n }\n query.push(`SET nile.user_id = '${config.userId}'`);\n }\n\n // in this example we use pg driver's connection API\n conn.query(query.join(';'), function (err: Error) {\n if (config.tenantId) {\n info('[tenant id]', config.tenantId);\n }\n if (config.userId) {\n info('[user id]', config.userId);\n }\n done(err, conn);\n });\n }\n done(null, conn);\n };\n}\n","import { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport Logger from '../utils/Logger';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AllowAny = any;\n\nexport function createProxyForPool(pool: Pool, config: Config): Pool {\n const { info, error } = Logger(config, '[pool]');\n return new Proxy<Pool>(pool, {\n get(target: AllowAny, property) {\n if (property === 'query') {\n // give connection string a pass for these problems\n if (!config.db.connectionString) {\n if (!config.user || !config.password) {\n error(\n 'Cannot connect to the database. User and/or password are missing. Generate them at https://console.thenile.dev'\n );\n } else if (!config.db.database) {\n error(\n 'Database name is missing from the config. Call `nile.init()` or set NILEDB_ID in your .env'\n );\n }\n }\n const caller = target[property];\n return function query(...args: AllowAny) {\n info(...args);\n // @ts-expect-error - not mine\n const called = caller.apply(this, args);\n return called;\n };\n }\n return target[property];\n },\n }) as Pool;\n}\n","import { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { watchEvictPool } from '../utils/Event';\nimport Logger from '../utils/Logger';\nimport { ServerConfig } from '../types';\n\nimport NileDatabase from './NileInstance';\n\nexport default class DBManager {\n connections: Map<string, NileDatabase>;\n\n private makeId(\n tenantId?: string | undefined | null,\n userId?: string | undefined | null\n ) {\n if (tenantId && userId) {\n return `${tenantId}:${userId}`;\n }\n if (tenantId) {\n return `${tenantId}`;\n }\n return 'base';\n }\n constructor(config: ServerConfig) {\n const { info } = Logger(config, '[DBManager]');\n this.connections = new Map();\n // add the base one, so you can at least query\n const id = this.makeId();\n info('constructor', id);\n this.connections.set(id, new NileDatabase(new Config(config), id));\n watchEvictPool((id) => {\n if (id && this.connections.has(id)) {\n this.connections.delete(id);\n }\n });\n }\n\n getConnection(config: ServerConfig): Pool {\n const { info } = Logger(config, '[DBManager]');\n const id = this.makeId(config.tenantId, config.userId);\n const existing = this.connections.get(id);\n info('# of instances:', this.connections.size);\n if (existing) {\n info('returning existing', id);\n return existing.pool;\n }\n const newOne = new NileDatabase(new Config(config), id);\n this.connections.set(id, newOne);\n info('created new', id);\n info('# of instances:', this.connections.size);\n return newOne.pool;\n }\n}\n","import { ServerConfig } from '../../types';\nimport { Config } from '../Config';\n\nexport const getServerId = (config: ServerConfig) => {\n const cfg = new Config(config);\n return makeServerId(cfg);\n};\nexport const makeServerId = (config: Config) => {\n return Buffer.from(JSON.stringify(config), 'base64').toString();\n};\n","import { Pool } from 'pg';\n\nimport { ServerConfig } from './types';\nimport { Config } from './utils/Config';\nimport Auth from './auth';\nimport Users from './users';\nimport Tenants from './tenants';\nimport { watchTenantId, watchToken, watchUserId } from './utils/Event';\nimport DbManager from './db';\nimport { getServerId, makeServerId } from './utils/Server';\n\ntype Api = {\n auth: Auth;\n users: Users;\n tenants: Tenants;\n};\n\nconst init = (config: Config): Api => {\n const auth = new Auth(config);\n const users = new Users(config);\n const tenants = new Tenants(config);\n return {\n auth,\n users,\n tenants,\n };\n};\n\nexport class Server {\n config: Config;\n api: Api;\n private manager: DbManager;\n private servers: Map<string, Server>;\n\n constructor(config?: ServerConfig) {\n this.config = new Config(config as ServerConfig);\n this.servers = new Map();\n this.api = init(this.config);\n this.manager = new DbManager(this.config);\n\n watchTenantId((tenantId) => {\n this.tenantId = tenantId;\n });\n\n watchUserId((userId) => {\n this.userId = userId;\n });\n\n watchToken((token) => {\n this.token = token;\n });\n }\n\n setConfig(cfg: Config) {\n this.config = new Config(cfg);\n }\n\n async init(cfg?: Config) {\n const updatedConfig = await this.config.configure({\n ...this.config,\n ...cfg,\n });\n this.setConfig(updatedConfig);\n this.manager = new DbManager(this.config);\n this.api = init(updatedConfig);\n return this;\n }\n\n set databaseId(val: string | void) {\n if (val) {\n this.config.databaseId = val;\n this.api.auth.databaseId = val;\n this.api.users.databaseId = val;\n this.api.tenants.databaseId = val;\n }\n }\n\n get userId(): string | undefined | null {\n return this.config.userId;\n }\n\n set userId(userId: string | undefined | null) {\n this.databaseId = this.config.databaseId;\n\n this.config.userId = userId;\n\n if (this.api) {\n this.api.auth.userId = this.config.userId;\n this.api.users.userId = this.config.userId;\n this.api.tenants.userId = this.config.userId;\n }\n }\n\n get tenantId(): string | undefined | null {\n return this.config.tenantId;\n }\n\n set tenantId(tenantId: string | undefined | null) {\n this.databaseId = this.config.databaseId;\n this.config.tenantId = tenantId;\n\n if (this.api) {\n this.api.auth.tenantId = tenantId;\n this.api.users.tenantId = tenantId;\n this.api.tenants.tenantId = tenantId;\n }\n }\n\n get token(): string | undefined | null {\n return this.config?.api?.token;\n }\n\n set token(token: string | undefined | null) {\n if (token) {\n this.config.api.token = token;\n if (this.api) {\n this.api.auth.api.token = token;\n this.api.users.api.token = token;\n this.api.tenants.api.token = token;\n }\n }\n }\n get db(): Pool {\n // only need to interact with the knex object\n return this.manager.getConnection(this.config);\n }\n\n /**\n * A utility function if you want to manage different NileDB instances yourself\n * returns the global Server object, an existing server that's already been configured,\n * or a new one if the config isn't in the cache\n */\n\n getInstance(config: ServerConfig): Server {\n const _config = { ...this.config, ...config };\n const serverId = getServerId(_config);\n const currentServerId = makeServerId(this.config);\n if (serverId === currentServerId) {\n return this;\n }\n const existing = this.servers.get(serverId);\n\n if (existing) {\n // be sure the config is up to date\n const updatedConfig = new Config(_config);\n existing.setConfig(updatedConfig);\n // propagage special config items\n existing.tenantId = updatedConfig.tenantId;\n existing.userId = updatedConfig.userId;\n existing.token = updatedConfig.api.token;\n existing.databaseId = updatedConfig.databaseId;\n return existing;\n }\n\n this.servers.set(serverId, new Server(_config));\n return this.servers.get(serverId) as unknown as Server;\n }\n}\n\nexport async function create(config?: ServerConfig): Promise<Server> {\n const server = new Server(config);\n return await server.init();\n}\n\nexport default create;\n","export * from './types';\nimport create from './Server';\n\nexport { Server } from './Server';\n\nexport default create;\n\nmodule.exports = create;\n"],"names":["Logger","config","_len","arguments","length","params","Array","_key","info","debug","_console","_len2","args","_key2","console","apply","concat","warn","_console2","_len3","_key3","error","_console3","_len4","_key4","getUsername","cfg","logger","user","String","process","env","NILEDB_USER","getPassword","password","NILEDB_PASSWORD","getToken","_config$api","_config$api2","_config$api3","api","token","NILEDB_TOKEN","getDatabaseName","databaseName","NILEDB_NAME","getBasePath","_config$api4","_config$api5","basePath","NILEDB_API","getDbHost","db","host","NILEDB_HOST","getDbPort","_config$db","_config$db2","port","Number","NILEDB_PORT","Events","ApiConfig","_createClass","_ref","cookieKey","this","_token","key","get","set","value","Config","_config$api$cookieKey2","_this","databaseId","_tenantId","_userId","configure","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_config$api$cookieKey","envVarConfig","_Logger","url","res","database","possibleError","json","message","_database","apiHost","dbHost","name","dburl","apiurl","wrap","_context","prev","next","abrupt","URL","searchParams","href","fetch","headers","Authorization","sent","clone","status","t0","text","Error","id","origin","_extends","stop","_x","NILEDB_ID","tenantId","NILEDB_TENANT","getTenantId","Boolean","userId","ResponseError","body","init","response","Response","eventer","Eventer","events","_proto","prototype","publish","eventName","callbackList","_step","_iterator","_createForOfIteratorHelperLoose","done","callback","subscribe","push","updateTenantId","Tenant","updateUserId","User","updateToken","val","Token","X_NILE_TENANT","X_NILE_USER_ID","getTokenFromCookie","_headers$get","cookie","split","_cookies","cookieParts","_cookie","slice","join","_step2","_iterator2","getTenantFromHttp","cookieTenant","getUserFromHttp","_headers$get2","decodeJwt","sub","_fetch","_x2","_x3","_fetch2","path","opts","_response$status","basicHeaders","useableUrl","errorHandler","msg","_message","Headers","includes","replace","encodeURIComponent","e","t1","t2","errors","Requester","_Config","call","post","req","request","_callee2","_context2","_x4","_x5","_x6","put","_ref3","_callee3","_context3","_x7","_x8","_x9","_inheritsLoose","rawRequest","_rawRequest","_callee4","method","_init","_context4","_x10","_x11","_x12","_x13","_request","_callee5","_headers","_context5","Request","JSON","stringify","undefined","Object","values","_x14","_x15","_x16","_x17","Auth","login","_requester","providerRes","providers","_this$api","tenants","tenant","URLSearchParams","listProviders","append","redirectURI","loginSSOUrl","loginUrl","jwt","loginSSO","redirectUrl","ssoLogin","_this$api2","accessToken","formData","provider","_this$tenantId","signUp","_this$api3","_token$token","_token$token2","signUpUrl","listTenantProviders","_ref4","listTenantProvidersUrl","createProvider","_ref5","updateProviderUrl","updateProvider","_ref6","_callee6","_context6","_ref7","_callee7","_body","_context7","providerUrl","email","getSSOCallbackUrl","param","providerName","Users","createTenantUser","tenantUsersUrl","listUsers","usersUrl","updateUser","listTenantUsers","me","meUrl","baseUrl","Tenants","createTenant","tenantsUrl","getTenant","tenantUrl","NileDatabase","pool","timer","poolConfig","min","max","idleTimeoutMillis","afterCreate","remaining","_objectWithoutPropertiesLoose","_excluded","Proxy","target","property","connectionString","caller","createProxyForPool","Pool","startTimeout","on","client","makeAfterCreate","err","_client","release","_this2","clearTimeout","setTimeout","end","EvictPool","_Logger2","conn","query","DBManager","connections","Map","cb","makeId","has","getConnection","existing","size","newOne","makeServerId","Buffer","from","toString","auth","users","Server","manager","servers","DbManager","setConfig","_init2","updatedConfig","getInstance","_config","serverId","getServerId","_this$config","create","_create","server","module","exports"],"mappings":"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"}
1
+ {"version":3,"file":"server.cjs.production.min.js","sources":["../src/utils/Logger.ts","../src/utils/Config/envVars.ts","../src/utils/Event/index.ts","../src/utils/Config/index.ts","../src/utils/ResponseError.ts","../src/utils/fetch.ts","../src/utils/Requester/index.ts","../src/auth/index.ts","../src/users/index.ts","../src/tenants/index.ts","../src/db/NileInstance.ts","../src/db/PoolProxy.ts","../src/db/DBManager.ts","../src/utils/Server/index.ts","../src/Server.ts","../src/index.ts"],"sourcesContent":["import { ServerConfig } from '../types';\n\nimport { Config } from './Config';\n\nexport default function Logger(\n config: void | Config | ServerConfig,\n ...params: unknown[]\n) {\n return {\n info(...args: unknown[]) {\n if (config?.debug) {\n // eslint-disable-next-line no-console\n console.info('[niledb]', ...params, ...args);\n }\n },\n warn(...args: unknown[]) {\n if (config?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[niledb]', ...params, ...args);\n }\n },\n error(...args: unknown[]) {\n // eslint-disable-next-line no-console\n console.error('[niledb]', '[ERROR]', ...params, ...args);\n },\n };\n}\n","import 'dotenv/config';\nimport { ServerConfig } from '../../types';\nimport Logger from '../Logger';\n\nexport type EnvConfig = {\n logger?: string;\n config?: ServerConfig;\n};\n\nexport const getDatbaseId = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[databaseId]');\n if (config?.databaseId) {\n logger && info(logger, 'config', config.databaseId);\n return String(config?.databaseId);\n }\n logger && info(logger, 'env', process.env.NILEDB_ID);\n return process.env.NILEDB_ID;\n};\nexport const getUsername = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[username]');\n if (config?.user) {\n logger && info(logger, 'config', config.user);\n return String(config?.user);\n }\n logger && info(logger, '.env', process.env.NILEDB_USER);\n return process.env.NILEDB_USER;\n};\n\nexport const getPassword = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const log = logProtector(logger);\n const { info } = Logger(config, '[password]');\n if (config?.password) {\n log && info(logger, 'config', config.password);\n\n return String(config.password);\n }\n\n log && info(logger, '.env', process.env.NILEDB_PASSWORD);\n return process.env.NILEDB_PASSWORD;\n};\n\nexport const getInfoBearer = (cfg: EnvConfig) => {\n return `${getUsername(cfg)}:${getPassword(cfg)}`;\n};\n\nexport const getToken = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[token]');\n if (config?.api?.token) {\n logger && info(logger, 'config', config.api?.token);\n return String(config.api?.token);\n }\n if (process.env.NILEDB_TOKEN) {\n logger && info(logger, '.env', process.env.NILEDB_TOKEN);\n return process.env.NILEDB_TOKEN;\n }\n return undefined;\n};\n\nexport const getDatabaseName = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[databaseName]');\n if (config?.databaseName) {\n logger && info(logger, 'config', config.databaseName);\n return String(config.databaseName);\n }\n if (process.env.NILEDB_NAME) {\n logger && info(logger, 'config', process.env.NILEDB_NAME);\n return process.env.NILEDB_NAME;\n }\n return null;\n};\n\nexport const getTenantId = (cfg: EnvConfig): string | null => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[tenantId]');\n if (config?.tenantId) {\n logger && info(logger, 'config', config.tenantId);\n return config.tenantId;\n }\n\n if (process.env.NILEDB_TENANT) {\n logger && info(logger, '.env', process.env.NILEDB_TENANT);\n return process.env.NILEDB_TENANT;\n }\n\n return null;\n};\n\nexport const getBasePath = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[basePath]');\n const basePath = config?.api?.basePath;\n if (basePath) {\n logger && info(logger, 'config', config?.api?.basePath);\n return basePath;\n }\n\n if (process.env.NILEDB_API) {\n logger && info(logger, '.env', process.env.NILEDB_API);\n return `https://${process.env.NILEDB_API}`;\n }\n\n logger && info(logger, 'default', process.env.NILEDB_API);\n return 'https://api.thenile.dev';\n};\n\nexport function getDbHost(cfg: EnvConfig) {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.host]');\n\n if (config?.db && config.db.host) {\n logger && info(logger, 'config', config?.db.host);\n return config.db.host;\n }\n\n if (process.env.NILEDB_HOST) {\n logger && info(logger, '.env', process.env.NILEDB_HOST);\n return process.env.NILEDB_HOST;\n }\n\n logger && info(logger, 'default', 'db.thenile.dev');\n return 'db.thenile.dev';\n}\n\nexport function getDbPort(cfg: EnvConfig): number {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.port]');\n if (config?.db?.port && config.db.port != null) {\n logger && info(logger, 'config', config?.db.port);\n return Number(config.db?.port);\n }\n\n if (process.env.NILEDB_PORT) {\n logger && info(logger, 'config', process.env.NILEDB_PORT);\n return Number(process.env.NILEDB_PORT);\n }\n logger && info(logger, 'default', 5432);\n return 5432;\n}\n\n// don't let people accidentally log secrets to production\nconst logProtector = (logger?: string) => {\n return process.env.NODE_ENV === 'development' ||\n process.env.NODE_ENV === 'test'\n ? logger\n : null;\n};\n","type BusValues = undefined | null | string;\ntype EventFn = (params: BusValues) => void;\nenum Events {\n User = 'userId',\n Tenant = 'tenantId',\n Token = 'token',\n EvictPool = 'EvictPool',\n}\nclass Eventer {\n events: { [key: string]: EventFn[] };\n constructor() {\n this.events = {};\n }\n publish(eventName: string, value: BusValues) {\n // Get all the callback functions of the current event\n const callbackList = this.events[eventName];\n\n // execute each callback function\n if (callbackList) {\n for (const callback of callbackList) {\n callback(value);\n }\n }\n }\n // Subscribe to events\n subscribe(eventName: string, callback: EventFn) {\n // initialize this event\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n\n // store the callback function of the subscriber\n this.events[eventName].push(callback);\n }\n}\n\n// tenantId manager\nconst eventer = new Eventer();\n\nexport const updateTenantId = (tenantId: BusValues) => {\n eventer.publish(Events.Tenant, tenantId);\n};\n\nexport const watchTenantId = (cb: EventFn) =>\n eventer.subscribe(Events.Tenant, cb);\n\nexport const updateUserId = (userId: BusValues) => {\n eventer.publish(Events.User, userId);\n};\n\nexport const watchUserId = (cb: EventFn) => eventer.subscribe(Events.User, cb);\n\nexport const updateToken = (val: BusValues) => {\n eventer.publish(Events.Token, val);\n};\n\nexport const watchToken = (cb: EventFn) => eventer.subscribe(Events.Token, cb);\n\nexport const watchEvictPool = (cb: EventFn) =>\n eventer.subscribe(Events.EvictPool, cb);\nexport const evictPool = (val: BusValues) => {\n eventer.publish(Events.EvictPool, val);\n};\n","import { NilePoolConfig, ServerConfig } from '../../types';\nimport Logger from '../Logger';\n\nimport {\n EnvConfig,\n getBasePath,\n getDatabaseName,\n getDatbaseId,\n getDbHost,\n getDbPort,\n getInfoBearer,\n getPassword,\n getTenantId,\n getToken,\n getUsername,\n} from './envVars';\n\ntype Database = {\n name: string;\n apiHost: string;\n dbHost: string;\n id: string;\n message?: string; // is actually an error\n status: 'READY' | string;\n};\nclass ApiConfig {\n public cookieKey?: string;\n public basePath?: string;\n private _token?: string;\n constructor({\n basePath,\n cookieKey,\n token,\n }: {\n basePath: string;\n cookieKey: string;\n token: string | undefined;\n }) {\n this.basePath = basePath;\n this.cookieKey = cookieKey;\n this._token = token;\n }\n\n public get token(): string | undefined {\n return this._token;\n }\n\n public set token(value: string | undefined) {\n this._token = value;\n }\n}\n\nexport class Config {\n user: string;\n password: string;\n databaseId: string;\n databaseName: string;\n\n debug: boolean;\n\n db: NilePoolConfig;\n\n api: ApiConfig;\n\n private _tenantId?: string | undefined | null;\n private _userId?: string | undefined | null;\n\n public get tenantId(): string | undefined | null {\n return this._tenantId;\n }\n\n public set tenantId(value: string | undefined | null) {\n this._tenantId = value;\n }\n\n public get userId(): string | undefined | null {\n return this._userId;\n }\n\n public set userId(value: string | undefined | null) {\n this._userId = value;\n }\n\n constructor(config?: ServerConfig) {\n const envVarConfig: EnvConfig = { config };\n\n this.databaseId = getDatbaseId(envVarConfig) as string;\n this.user = getUsername(envVarConfig) as string;\n this.password = getPassword(envVarConfig) as string;\n this.databaseName = getDatabaseName(envVarConfig) as string;\n this._tenantId = getTenantId(envVarConfig);\n this.debug = Boolean(config?.debug);\n this._userId = config?.userId;\n\n const basePath = getBasePath(envVarConfig);\n const { host, port, ...dbConfig } = config?.db ?? {};\n const configuredHost = host ?? getDbHost(envVarConfig);\n const configuredPort = port ?? getDbPort(envVarConfig);\n\n this.api = new ApiConfig({\n basePath,\n cookieKey: config?.api?.cookieKey ?? 'token',\n token: getToken({ config }),\n });\n this.db = {\n user: this.user,\n password: this.password,\n host: configuredHost,\n port: configuredPort,\n ...dbConfig,\n };\n if (this.databaseName) {\n this.db.database = this.databaseName;\n }\n }\n\n configure = async (config: ServerConfig): Promise<Config> => {\n const { info, error } = Logger(config, '[init]');\n\n const envVarConfig: EnvConfig = {\n config,\n };\n\n const { host, port, ...dbConfig } = config.db ?? {};\n let configuredHost = host ?? getDbHost(envVarConfig);\n const configuredPort = port ?? getDbPort(envVarConfig);\n if (configuredHost && this.databaseName && this.databaseId) {\n info('Alreaady configured, aborting fetch');\n return this;\n }\n\n let basePath = getBasePath(envVarConfig);\n\n const databaseName = getDatabaseName({ config, logger: 'getInfo' });\n const url = new URL(`${basePath}/databases/configure`);\n if (databaseName) {\n url.searchParams.set('databaseName', databaseName);\n }\n info(url.href);\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${getInfoBearer({ config })}`,\n },\n });\n let database: Database;\n const possibleError = res.clone();\n try {\n const json: Database = await res.json();\n if (res.status === 404) {\n info('is the configured databaseName correct?');\n }\n if (json.status && json.status !== 'READY') {\n database = { message: 'Database is not ready yet' } as Database;\n } else {\n database = json;\n }\n } catch (e) {\n const message = await possibleError.text();\n error(message);\n database = { message } as Database;\n }\n info('[fetched database]', database);\n if (process.env.NODE_ENV !== 'TEST') {\n if ('message' in database) {\n if ('statusCode' in database) {\n error(database);\n throw new Error('HTTP error has occured');\n } else {\n throw new Error(\n 'Unable to auto-configure. Please set or remove NILEDB_API, NILEDB_NAME, and NILEDB_HOST in your .env file.'\n );\n }\n }\n if (typeof database === 'object') {\n const { apiHost, dbHost, name, id } = database;\n this.databaseId = id;\n this.databaseName = name;\n const dburl = new URL(dbHost);\n const apiurl = new URL(apiHost);\n configuredHost = dburl.host;\n basePath = apiurl.origin;\n }\n }\n this.api = new ApiConfig({\n basePath,\n cookieKey: config?.api?.cookieKey ?? 'token',\n token: getToken({ config }),\n });\n this.db = {\n user: this.user,\n password: this.password,\n host: configuredHost,\n port: configuredPort,\n database: this.databaseName,\n ...dbConfig,\n };\n info('[config set]', this);\n return this;\n };\n}\n","export class ResponseError {\n response: Response;\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this.response = new Response(body, init);\n }\n}\n","import { decodeJwt } from 'jose';\n\nimport { ResponseError } from './ResponseError';\nimport { Config } from './Config';\nimport { NileRequest } from './Requester';\nimport { updateTenantId, updateUserId } from './Event';\nimport { getToken } from './Config/envVars';\nimport Logger from './Logger';\n\nexport const X_NILE_TENANT = 'x-nile-tenantId';\nexport const X_NILE_USER_ID = 'x-nile-userId';\n\nexport function handleTenantId(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n req: NileRequest<any>,\n config: Config\n): ResponseError | void {\n // already set, no need to try and figure it out\n if (config.tenantId) {\n return;\n }\n return new ResponseError('tenant id needs to be set', { status: 400 });\n}\n\nfunction getTokenFromCookie(headers: Headers, cookieKey: void | string) {\n const cookie = headers.get('cookie')?.split('; ');\n const _cookies: Record<string, string> = {};\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n if (cookieKey) {\n return _cookies[cookieKey];\n }\n return null;\n}\nexport function getTenantFromHttp(headers: Headers, config: Config) {\n const cookieTenant = getTokenFromCookie(headers, 'tenantId');\n return cookieTenant ?? headers?.get(X_NILE_TENANT) ?? config.tenantId;\n}\n\nexport function getUserFromHttp(headers: Headers, config: Config) {\n const token = getTokenFromCookie(headers, config.api.cookieKey);\n if (token) {\n const jwt = decodeJwt(token);\n return jwt.sub;\n }\n return headers?.get(X_NILE_USER_ID) ?? config.userId;\n}\n\nexport async function _fetch(\n config: Config,\n path: string,\n opts?: RequestInit\n): Promise<Response | ResponseError> {\n const { info, error } = Logger(config, '[server]');\n\n const url = `${config.api?.basePath}${path}`;\n const cookieKey = config.api?.cookieKey;\n const headers = new Headers(opts?.headers);\n const basicHeaders = new Headers();\n basicHeaders.set('content-type', 'application/json; charset=utf-8');\n const authHeader = headers.get('Authorization');\n if (!authHeader) {\n const token = getTokenFromCookie(headers, cookieKey);\n if (token) {\n basicHeaders.set('Authorization', `Bearer ${token}`);\n } else if (getToken({ config })) {\n basicHeaders.set('Authorization', `Bearer ${getToken({ config })}`);\n }\n }\n\n const tenantId = getTenantFromHttp(headers, config);\n updateTenantId(tenantId);\n const userId = getUserFromHttp(headers, config);\n updateUserId(userId);\n if (url.includes('{tenantId}') && !tenantId) {\n return new ResponseError('tenantId is not set for request', {\n status: 400,\n });\n }\n const useableUrl = url\n .replace('{tenantId}', encodeURIComponent(String(tenantId)))\n .replace('{userId}', encodeURIComponent(String(userId)));\n\n info('[fetch]', useableUrl);\n\n const response = await fetch(useableUrl, {\n ...opts,\n headers: basicHeaders,\n }).catch((e) => {\n error('[fetch]', '[response]', e);\n });\n\n if (response && response.status >= 200 && response.status < 300) {\n if (typeof response.clone === 'function') {\n info('[fetch]', '[response]', await response.clone().json());\n }\n return response;\n }\n\n let res;\n const errorHandler =\n typeof response?.clone === 'function' ? response.clone() : null;\n let msg = '';\n try {\n res = await (response as Response)?.json();\n } catch (e) {\n if (errorHandler) {\n msg = await errorHandler.text();\n if (msg) {\n error('[fetch]', '[response]', `[status: ${errorHandler.status}]`, msg);\n }\n }\n if (!msg) {\n error('[fetch]', '[response]', e);\n }\n }\n if (msg) {\n return new ResponseError(msg, { status: errorHandler?.status });\n }\n\n if (res && 'message' in res) {\n const { message } = res;\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n message\n );\n return new ResponseError(message, { status: 400 });\n }\n if (res && 'errors' in res) {\n const {\n errors: [message],\n } = res;\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n message\n );\n return new ResponseError(message, { status: 400 });\n }\n\n error(\n '[fetch]',\n '[response]',\n `[status: ${errorHandler?.status}]`,\n 'UNHANDLED ERROR'\n );\n return new ResponseError(null, {\n status: (response as Response)?.status ?? 500,\n });\n}\n","import { Config } from '../Config';\nimport { ResponseError } from '../ResponseError';\nimport { X_NILE_TENANT, _fetch } from '../fetch';\n\nexport { NileResponse, NileRequest } from './types';\n\ntype Methods = 'POST' | 'GET' | 'PUT';\nexport default class Requester<T> extends Config {\n constructor(config: Config) {\n super(config);\n }\n\n async rawRequest(\n method: Methods,\n url: string,\n init: RequestInit,\n body?: string\n ): Promise<Response> {\n const _init = {\n ...init,\n body,\n method,\n };\n\n const res = await _fetch(this, url, _init);\n\n if (res instanceof ResponseError) {\n return res.response;\n }\n\n return res;\n }\n\n /**\n * three optios here\n * 1) pass in headers for a server side request\n * 2) pass in the payload that matches the api\n * 3) pass in the request object sent by a browser\n * @param method\n * @param url\n * @param req\n * @param init\n * @returns\n */\n protected async request(\n method: Methods,\n url: string,\n req: T | Headers,\n init?: RequestInit\n ): Promise<Response> {\n // set the headers\n const headers = new Headers(init ? init?.headers : {});\n if (req instanceof Headers) {\n const tenantId = req.get(X_NILE_TENANT);\n const cookie = req.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n } else if (req instanceof Request) {\n // pass back the X_NILE_TENANT\n const _headers = new Headers(req?.headers);\n const tenantId = _headers.get(X_NILE_TENANT);\n const cookie = _headers.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n }\n // default the body - may be the actual payload for the API\n let body: string | undefined = JSON.stringify(req);\n\n // comes from next/some server\n if (method === 'GET') {\n body = undefined;\n } else if (req instanceof Request) {\n body = await new Response(req.body).text();\n } else if (\n // is just headers for a GET request\n req instanceof Headers ||\n JSON.stringify(req) === '{}' ||\n (req && typeof req === 'object' && Object.values(req).length === 0)\n ) {\n body = undefined;\n }\n\n const _init = {\n ...init,\n headers,\n };\n\n return await this.rawRequest(method, url, _init, body);\n }\n\n post = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('POST', url, req, init);\n };\n\n get = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('GET', url, req, init);\n };\n\n put = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('PUT', url, req, init);\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\nimport { ResponseError } from '../utils/ResponseError';\nimport {\n X_NILE_TENANT,\n X_NILE_USER_ID,\n getTenantFromHttp,\n} from '../utils/fetch';\nimport { updateToken, updateUserId } from '../utils/Event';\nimport { CreateBasicUserRequest, LoginUserResponse } from '../users';\n\nexport interface TenantSSORegistration {\n configUrl: string;\n clientId: string;\n clientSecret: string;\n redirectURI: string;\n emailDomains: Array<string>;\n enabled?: boolean;\n}\n\nexport interface SSOProvider {\n readonly id?: string;\n tenantId?: string;\n provider?: string;\n configUrl: string;\n clientSecret?: string;\n clientId: string;\n redirectURI: string;\n emailDomains?: Array<string>;\n enabled?: boolean;\n}\nexport default class Auth extends Config {\n constructor(config: Config) {\n super(config);\n }\n get loginUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users/login`;\n }\n\n login = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const headers = new Headers({ 'content-type': 'application/json' });\n const _requester = new Requester(this);\n\n const params =\n req instanceof Request\n ? new URL(req.url).searchParams\n : new URLSearchParams();\n\n const sso = params.get('sso');\n\n if (sso === 'true') {\n const providerRes = await this.listProviders(\n (req as Request).clone(),\n init\n );\n // if you have a provider, log them in\n if (\n providerRes &&\n providerRes.status >= 200 &&\n providerRes.status < 300\n ) {\n const providers = await new Response(providerRes.body).json();\n if (providers.length > 0) {\n if (providers.length > 1) {\n return new Response(JSON.stringify(providers), { status: 200 });\n // a user has to make a choice\n }\n\n // is there a way to do this? probably not.\n headers.set(X_NILE_TENANT, providers[0].tenantId);\n headers.append(\n 'set-cookie',\n `tenantId=${providers[0].tenantId}; path=/; httponly;`\n );\n // const ssoResp = await this.loginSSO(req);\n return new Response(\n JSON.stringify({\n redirectURI: `${this.api.basePath}${this.loginSSOUrl('okta')}`,\n }),\n { status: 200 }\n );\n // make it a client side redirect, because of the headers\n // if there is no provider, require a password.\n }\n }\n }\n\n const res = await _requester.post(req, this.loginUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { tenants } = token;\n const tenant = tenants?.values();\n const tenantId = tenant?.next().value;\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n updateToken(token.token.jwt);\n\n return new Response(JSON.stringify(token), { status: 200, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n loginSSO = (redirectUrl: string) => {\n const ssoLogin = async (\n req: NileRequest<unknown>\n ): NileResponse<Response> => {\n const headers = new Headers();\n const body = await (req as Request).formData();\n const accessToken = (await body.get('access_token')) as string;\n const tenantId = (await body.get('tenantId')) as string;\n const cookie = `${this.api?.cookieKey}=${accessToken}; path=/; samesite=lax; httponly;`;\n updateToken(accessToken);\n headers.append('set-cookie', cookie);\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n headers.set('Location', redirectUrl);\n return new Response(null, {\n headers,\n status: 303,\n });\n };\n return ssoLogin;\n };\n\n loginSSOUrl = (provider: string) => {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }/auth/oidc/providers/${provider}/login`;\n };\n\n get signUpUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users`;\n }\n\n signUp = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const headers = new Headers();\n const _requester = new Requester(this);\n const res = await _requester.post(req, this.signUpUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token?.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { id } = token;\n updateToken(token.token?.jwt);\n updateUserId(id);\n headers.set(X_NILE_USER_ID, id);\n headers.append('set-cookie', `userId=${id}; path=/; httponly;`);\n return new Response(JSON.stringify(token), { status: 201, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n updateProviderUrl(providerName: string) {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers/${encodeURIComponent(providerName)}`;\n }\n\n get listTenantProvidersUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers`;\n }\n\n listTenantProviders = async (\n req: NileRequest<void | Headers>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.listTenantProvidersUrl, init);\n };\n\n createProvider = async (\n req: NileRequest<SSOProvider>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.post(req, this.updateProviderUrl(providerName), init);\n };\n\n updateProvider = async (\n req: NileRequest<SSOProvider>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.put(req, this.updateProviderUrl(providerName), init);\n };\n\n providerUrl(email?: undefined | string) {\n return `/databases/${encodeURIComponent(\n this.databaseId\n )}/tenants/auth/oidc/providers${\n email ? `?email=${encodeURIComponent(email)}` : ''\n }`;\n }\n\n listProviders = async (\n req: NileRequest<void | CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n let body: { email: string } | undefined;\n // this is a get. Get the email from the response body so the request is filtered.\n if (req && 'body' in req) {\n body = await new Response(req.body as BodyInit).json();\n }\n return _requester.get(req, this.providerUrl(body?.email), init);\n };\n\n getSSOCallbackUrl = (param: Headers | string) => {\n let tenantId;\n if (typeof tenantId === 'string') {\n tenantId = param;\n } else if (param instanceof Headers) {\n tenantId = getTenantFromHttp(param, this);\n }\n\n return `/databases/${this.databaseId}/tenants/${tenantId}/auth/oidc/callback`;\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport interface CreateBasicUserRequest {\n email: string;\n password: string;\n preferredName?: string;\n newTenant?: string;\n}\nexport const LoginUserResponseTokenTypeEnum = {\n AccessToken: 'ACCESS_TOKEN',\n RefreshToken: 'REFRESH_TOKEN',\n IdToken: 'ID_TOKEN',\n} as const;\nexport type LoginUserResponseTokenTypeEnum =\n (typeof LoginUserResponseTokenTypeEnum)[keyof typeof LoginUserResponseTokenTypeEnum];\n\nexport interface LoginUserResponseToken {\n jwt: string;\n maxAge: number;\n type: LoginUserResponseTokenTypeEnum;\n}\nexport interface LoginUserResponse {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n id: string;\n token: LoginUserResponseToken;\n}\nexport interface User {\n id?: string;\n tenants?: Set<string>;\n email?: string;\n preferredName?: string;\n}\n\nexport default class Users extends Config {\n constructor(config: Config) {\n super(config);\n }\n\n get baseUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}`;\n }\n\n get usersUrl() {\n return `${this.baseUrl}/users`;\n }\n\n get tenantUsersUrl() {\n return `${this.baseUrl}/tenants/${this.tenantId ?? '{tenantId}'}/users`;\n }\n\n createTenantUser = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const _requester = new Requester(this);\n return await _requester.post(req, this.tenantUsersUrl, init);\n };\n\n listUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): NileResponse<User[]> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.usersUrl, init);\n };\n\n updateUser = async (\n userId: string,\n req: NileRequest<User>,\n init?: RequestInit\n ): NileResponse<User> => {\n const _requester = new Requester(this);\n return await _requester.put(req, `${this.usersUrl}/${userId}`, init);\n };\n\n listTenantUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): NileResponse<User[]> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.tenantUsersUrl, init);\n };\n\n get meUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/users/me`;\n }\n\n me = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<User> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.meUrl, init);\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport interface Tenant {\n id: string;\n name?: string;\n}\n\nexport default class Tenants extends Config {\n constructor(config: Config) {\n super(config);\n }\n get tenantsUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants`;\n }\n get tenantUrl() {\n return `/databases/${encodeURIComponent(this.databaseId)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }`;\n }\n\n createTenant = async (\n req: NileRequest<{ name: string }>,\n init?: RequestInit\n ): NileResponse<Tenant> => {\n const _requester = new Requester(this);\n return _requester.post(req, this.tenantsUrl, init);\n };\n\n getTenant = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<Tenant> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.tenantUrl, init);\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { evictPool } from '../utils/Event';\nimport { AfterCreate } from '../types';\nimport Logger from '../utils/Logger';\n\nimport { createProxyForPool } from './PoolProxy';\n\nclass NileDatabase {\n pool: Pool;\n tenantId?: undefined | null | string;\n userId?: undefined | null | string;\n id: string;\n config: Config;\n timer: NodeJS.Timeout | undefined;\n\n constructor(config: Config, id: string) {\n const { warn, info } = Logger(config, '[NileInstance]');\n this.id = id;\n const poolConfig = {\n min: 0,\n max: 10,\n idleTimeoutMillis: 30000,\n ...config.db,\n };\n const { afterCreate, ...remaining } = poolConfig;\n\n config.db = poolConfig;\n this.config = config;\n info(this.config);\n\n this.pool = createProxyForPool(new Pool(remaining), this.config);\n\n if (typeof afterCreate === 'function') {\n warn(\n 'Providing an pool configuration will stop automatic tenant context setting.'\n );\n }\n\n // start the timer for cleanup\n this.startTimeout();\n this.pool.on('connect', async (client) => {\n info('pool connected');\n const afterCreate: AfterCreate = makeAfterCreate(config);\n afterCreate(client, (err, _client) => {\n if (err) {\n _client.release();\n }\n });\n this.startTimeout();\n });\n this.pool.on('error', async (e) => {\n info('pool failed', e);\n });\n }\n\n startTimeout() {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(async () => {\n await this.pool.end();\n evictPool(this.id);\n }, this.config.db.idleTimeoutMillis);\n }\n}\n\nexport default NileDatabase;\n\nfunction makeAfterCreate(config: Config): AfterCreate {\n const { warn, info } = Logger(config, '[afterCreate]');\n return (conn, done) => {\n conn.on('error', function errorHandler(error: Error) {\n warn('Connection was terminated by server', error);\n done(error, conn);\n });\n\n if (config.tenantId) {\n const query = [`SET nile.tenant_id = '${config.tenantId}'`];\n if (config.userId) {\n if (!config.tenantId) {\n warn('A user id cannot be set in context without a tenant id');\n }\n query.push(`SET nile.user_id = '${config.userId}'`);\n }\n\n // in this example we use pg driver's connection API\n conn.query(query.join(';'), function (err: Error) {\n if (config.tenantId) {\n info('[tenant id]', config.tenantId);\n }\n if (config.userId) {\n info('[user id]', config.userId);\n }\n done(err, conn);\n });\n }\n done(null, conn);\n };\n}\n","import { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport Logger from '../utils/Logger';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AllowAny = any;\n\nexport function createProxyForPool(pool: Pool, config: Config): Pool {\n const { info, error } = Logger(config, '[pool]');\n return new Proxy<Pool>(pool, {\n get(target: AllowAny, property) {\n if (property === 'query') {\n // give connection string a pass for these problems\n if (!config.db.connectionString) {\n if (!config.user || !config.password) {\n error(\n 'Cannot connect to the database. User and/or password are missing. Generate them at https://console.thenile.dev'\n );\n } else if (!config.db.database) {\n error(\n 'Database name is missing from the config. Call `nile.init()` or set NILEDB_ID in your .env'\n );\n }\n }\n const caller = target[property];\n return function query(...args: AllowAny) {\n info(...args);\n // @ts-expect-error - not mine\n const called = caller.apply(this, args);\n return called;\n };\n }\n return target[property];\n },\n }) as Pool;\n}\n","import { Pool } from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { watchEvictPool } from '../utils/Event';\nimport Logger from '../utils/Logger';\nimport { ServerConfig } from '../types';\n\nimport NileDatabase from './NileInstance';\n\nexport default class DBManager {\n connections: Map<string, NileDatabase>;\n\n private makeId(\n tenantId?: string | undefined | null,\n userId?: string | undefined | null\n ) {\n if (tenantId && userId) {\n return `${tenantId}:${userId}`;\n }\n if (tenantId) {\n return `${tenantId}`;\n }\n return 'base';\n }\n constructor(config: ServerConfig) {\n const { info } = Logger(config, '[DBManager]');\n this.connections = new Map();\n // add the base one, so you can at least query\n const id = this.makeId();\n info('constructor', id);\n this.connections.set(id, new NileDatabase(new Config(config), id));\n watchEvictPool((id) => {\n if (id && this.connections.has(id)) {\n this.connections.delete(id);\n }\n });\n }\n\n getConnection(config: ServerConfig): Pool {\n const { info } = Logger(config, '[DBManager]');\n const id = this.makeId(config.tenantId, config.userId);\n const existing = this.connections.get(id);\n info('# of instances:', this.connections.size);\n if (existing) {\n info('returning existing', id);\n return existing.pool;\n }\n const newOne = new NileDatabase(new Config(config), id);\n this.connections.set(id, newOne);\n info('created new', id);\n info('# of instances:', this.connections.size);\n return newOne.pool;\n }\n}\n","import { ServerConfig } from '../../types';\nimport { Config } from '../Config';\n\nexport const getServerId = (config: ServerConfig) => {\n const cfg = new Config(config);\n return makeServerId(cfg);\n};\nexport const makeServerId = (config: Config) => {\n return Buffer.from(JSON.stringify(config), 'base64').toString();\n};\n","import { Pool } from 'pg';\n\nimport { ServerConfig } from './types';\nimport { Config } from './utils/Config';\nimport Auth from './auth';\nimport Users from './users';\nimport Tenants from './tenants';\nimport { watchTenantId, watchToken, watchUserId } from './utils/Event';\nimport DbManager from './db';\nimport { getServerId, makeServerId } from './utils/Server';\n\ntype Api = {\n auth: Auth;\n users: Users;\n tenants: Tenants;\n};\n\nconst init = (config: Config): Api => {\n const auth = new Auth(config);\n const users = new Users(config);\n const tenants = new Tenants(config);\n return {\n auth,\n users,\n tenants,\n };\n};\n\nexport class Server {\n config: Config;\n api: Api;\n private manager: DbManager;\n private servers: Map<string, Server>;\n\n constructor(config?: ServerConfig) {\n this.config = new Config(config as ServerConfig);\n this.servers = new Map();\n this.api = init(this.config);\n this.manager = new DbManager(this.config);\n\n watchTenantId((tenantId) => {\n this.tenantId = tenantId;\n });\n\n watchUserId((userId) => {\n this.userId = userId;\n });\n\n watchToken((token) => {\n this.token = token;\n });\n }\n\n setConfig(cfg: Config) {\n this.config = new Config(cfg);\n }\n\n async init(cfg?: Config) {\n const updatedConfig = await this.config.configure({\n ...this.config,\n ...cfg,\n });\n this.setConfig(updatedConfig);\n this.manager = new DbManager(this.config);\n this.api = init(updatedConfig);\n return this;\n }\n\n set databaseId(val: string | void) {\n if (val) {\n this.config.databaseId = val;\n this.api.auth.databaseId = val;\n this.api.users.databaseId = val;\n this.api.tenants.databaseId = val;\n }\n }\n\n get userId(): string | undefined | null {\n return this.config.userId;\n }\n\n set userId(userId: string | undefined | null) {\n this.databaseId = this.config.databaseId;\n\n this.config.userId = userId;\n\n if (this.api) {\n this.api.auth.userId = this.config.userId;\n this.api.users.userId = this.config.userId;\n this.api.tenants.userId = this.config.userId;\n }\n }\n\n get tenantId(): string | undefined | null {\n return this.config.tenantId;\n }\n\n set tenantId(tenantId: string | undefined | null) {\n this.databaseId = this.config.databaseId;\n this.config.tenantId = tenantId;\n\n if (this.api) {\n this.api.auth.tenantId = tenantId;\n this.api.users.tenantId = tenantId;\n this.api.tenants.tenantId = tenantId;\n }\n }\n\n get token(): string | undefined | null {\n return this.config?.api?.token;\n }\n\n set token(token: string | undefined | null) {\n if (token) {\n this.config.api.token = token;\n if (this.api) {\n this.api.auth.api.token = token;\n this.api.users.api.token = token;\n this.api.tenants.api.token = token;\n }\n }\n }\n get db(): Pool {\n // only need to interact with the knex object\n return this.manager.getConnection(this.config);\n }\n\n /**\n * A utility function if you want to manage different NileDB instances yourself\n * returns the global Server object, an existing server that's already been configured,\n * or a new one if the config isn't in the cache\n */\n\n getInstance(config: ServerConfig): Server {\n const _config = { ...this.config, ...config };\n const serverId = getServerId(_config);\n const currentServerId = makeServerId(this.config);\n if (serverId === currentServerId) {\n return this;\n }\n const existing = this.servers.get(serverId);\n\n if (existing) {\n // be sure the config is up to date\n const updatedConfig = new Config(_config);\n existing.setConfig(updatedConfig);\n // propagage special config items\n existing.tenantId = updatedConfig.tenantId;\n existing.userId = updatedConfig.userId;\n existing.token = updatedConfig.api.token;\n existing.databaseId = updatedConfig.databaseId;\n return existing;\n }\n\n this.servers.set(serverId, new Server(_config));\n return this.servers.get(serverId) as unknown as Server;\n }\n}\n\nexport async function create(config?: ServerConfig): Promise<Server> {\n const server = new Server(config);\n return await server.init();\n}\n\nexport default create;\n","export * from './types';\nimport create from './Server';\n\nexport { Server } from './Server';\n\nexport default create;\n\nmodule.exports = create;\n"],"names":["Logger","config","_len","arguments","length","params","Array","_key","info","debug","_console","_len2","args","_key2","console","apply","concat","warn","_console2","_len3","_key3","error","_console3","_len4","_key4","getUsername","cfg","logger","user","String","process","env","NILEDB_USER","getPassword","password","NILEDB_PASSWORD","getToken","_config$api","_config$api2","_config$api3","api","token","NILEDB_TOKEN","getDatabaseName","databaseName","NILEDB_NAME","getBasePath","_config$api4","_config$api5","basePath","NILEDB_API","getDbHost","db","host","NILEDB_HOST","getDbPort","_config$db","_config$db2","port","Number","NILEDB_PORT","Events","ApiConfig","_createClass","_ref","cookieKey","this","_token","key","get","set","value","Config","_config$api$cookieKey2","_this","databaseId","_tenantId","_userId","configure","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_config$api$cookieKey","_Logger","envVarConfig","_ref3","dbConfig","configuredHost","configuredPort","url","res","database","possibleError","json","message","_database","apiHost","dbHost","name","dburl","apiurl","wrap","_context","prev","next","_objectWithoutPropertiesLoose","_excluded","abrupt","URL","searchParams","href","fetch","headers","Authorization","sent","clone","status","t0","text","Error","id","origin","_extends","stop","_x","NILEDB_ID","tenantId","NILEDB_TENANT","getTenantId","Boolean","userId","_ref4","_excluded2","ResponseError","body","init","response","Response","eventer","Eventer","events","_proto","prototype","publish","eventName","callbackList","_step","_iterator","_createForOfIteratorHelperLoose","done","callback","subscribe","push","updateTenantId","Tenant","updateUserId","User","updateToken","val","Token","X_NILE_TENANT","X_NILE_USER_ID","getTokenFromCookie","_headers$get","cookie","split","_cookies","cookieParts","_cookie","slice","join","_step2","_iterator2","getTenantFromHttp","cookieTenant","getUserFromHttp","_headers$get2","decodeJwt","sub","_fetch","_x2","_x3","_fetch2","path","opts","_response$status","basicHeaders","useableUrl","errorHandler","msg","_message","Headers","includes","replace","encodeURIComponent","e","t1","t2","errors","Requester","_Config","call","post","req","request","_callee2","_context2","_x4","_x5","_x6","put","_callee3","_context3","_x7","_x8","_x9","_inheritsLoose","rawRequest","_rawRequest","_callee4","method","_init","_context4","_x10","_x11","_x12","_x13","_request","_callee5","_headers","_context5","Request","JSON","stringify","undefined","Object","values","_x14","_x15","_x16","_x17","Auth","login","_requester","providerRes","providers","_this$api","tenants","tenant","URLSearchParams","listProviders","append","redirectURI","loginSSOUrl","loginUrl","jwt","loginSSO","redirectUrl","ssoLogin","_this$api2","accessToken","formData","provider","_this$tenantId","signUp","_this$api3","_token$token","_token$token2","signUpUrl","listTenantProviders","listTenantProvidersUrl","createProvider","_ref5","updateProviderUrl","updateProvider","_ref6","_callee6","_context6","_ref7","_callee7","_body","_context7","providerUrl","email","getSSOCallbackUrl","param","providerName","Users","createTenantUser","tenantUsersUrl","listUsers","usersUrl","updateUser","listTenantUsers","me","meUrl","baseUrl","Tenants","createTenant","tenantsUrl","getTenant","tenantUrl","NileDatabase","pool","timer","poolConfig","min","max","idleTimeoutMillis","afterCreate","remaining","Proxy","target","property","connectionString","caller","createProxyForPool","Pool","startTimeout","on","client","makeAfterCreate","err","_client","release","_this2","clearTimeout","setTimeout","end","EvictPool","_Logger2","conn","query","DBManager","connections","Map","cb","makeId","has","getConnection","existing","size","newOne","makeServerId","Buffer","from","toString","auth","users","Server","manager","servers","DbManager","setConfig","_init2","updatedConfig","getInstance","_config","serverId","getServerId","_this$config","create","_create","server","module","exports"],"mappings":"wsRAIwB,SAAAA,EACtBC,GACoB,IAAAC,IAAAA,EAAAC,UAAAC,OAAjBC,MAAiBC,MAAAJ,EAAAA,EAAAA,OAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAjBF,EAAiBE,EAAAJ,GAAAA,UAAAI,GAEpB,MAAO,CACLC,KAAI,WACF,GAAU,MAANP,GAAAA,EAAQQ,MAAO,CAAA,IAAA,IAAAC,EAAAC,EAAAR,UAAAC,OADbQ,EAAeN,IAAAA,MAAAK,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAfD,EAAeC,GAAAV,UAAAU,IAGnBH,EAAAI,SAAQN,KAAIO,MAAAL,EAAA,CAAC,YAAUM,OAAKX,EAAWO,GACzC,CACD,EACDK,KAAI,WACF,GAAU,MAANhB,GAAAA,EAAQQ,MAAO,CAAA,IAAA,IAAAS,EAAAC,EAAAhB,UAAAC,OADbQ,EAAeN,IAAAA,MAAAa,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAfR,EAAeQ,GAAAjB,UAAAiB,IAGnBF,EAAAJ,SAAQG,KAAIF,MAAAG,EAAA,CAAC,YAAUF,OAAKX,EAAWO,GACzC,CACD,EACDS,MAAK,WAAmB,IAAA,IAAAC,EAAAC,EAAApB,UAAAC,OAAfQ,EAAeN,IAAAA,MAAAiB,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAfZ,EAAeY,GAAArB,UAAAqB,IAEtBF,EAAAR,SAAQO,MAAKN,MAAAO,GAAC,WAAY,WAASN,OAAKX,EAAWO,GACrD,EAEJ,CCjBO,IAWMa,EAAc,SAACC,GAC1B,IAAQzB,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OAERnB,EAASR,EAAOC,EAAQ,cAAxBO,KACR,OAAU,MAANP,GAAAA,EAAQ2B,MACVD,GAAUnB,EAAKmB,EAAQ,SAAU1B,EAAO2B,MACjCC,aAAO5B,SAAAA,EAAQ2B,QAExBD,GAAUnB,EAAKmB,EAAQ,OAAQG,QAAQC,IAAIC,aACpCF,QAAQC,IAAIC,YACrB,EAEaC,EAAc,SAACP,GAC1B,IAAQzB,EAAmByB,EAAnBzB,OAGR,OADiBD,EAAOC,EAAQ,cACtB,MAANA,GAAAA,EAAQiC,SAGHL,OAAO5B,EAAOiC,UAIhBJ,QAAQC,IAAII,eACrB,EAMaC,EAAW,SAACV,GAAkB,IAAAW,EAGjBC,EAAAC,EAFhBtC,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,WAAxBO,KACR,OAAU6B,MAANpC,GAAAoC,OAAMA,EAANpC,EAAQuC,MAARH,EAAaI,OACfd,GAAUnB,EAAKmB,EAAQ,SAAoB,OAAZW,EAAErC,EAAOuC,UAAG,EAAVF,EAAYG,OACtCZ,OAAOU,OAADA,EAACtC,EAAOuC,UAAPD,EAAAA,EAAYE,QAExBX,QAAQC,IAAIW,cACdf,GAAUnB,EAAKmB,EAAQ,OAAQG,QAAQC,IAAIW,cACpCZ,QAAQC,IAAIW,mBAFrB,CAKF,EAEaC,EAAkB,SAACjB,GAC9B,IAAQzB,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,kBAAxBO,KACR,OAAU,MAANP,GAAAA,EAAQ2C,cACVjB,GAAUnB,EAAKmB,EAAQ,SAAU1B,EAAO2C,cACjCf,OAAO5B,EAAO2C,eAEnBd,QAAQC,IAAIc,aACdlB,GAAUnB,EAAKmB,EAAQ,SAAUG,QAAQC,IAAIc,aACtCf,QAAQC,IAAIc,aAEd,IACT,EAkBaC,EAAc,SAACpB,GAAkB,IAAAqB,EAI9BC,EAHN/C,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,cAAxBO,KACFyC,EAAiB,MAANhD,GAAW,OAAL8C,EAAN9C,EAAQuC,UAAG,EAAXO,EAAaE,SAC9B,OAAIA,GACFtB,GAAUnB,EAAKmB,EAAQ,SAAgB,MAAN1B,UAAM+C,EAAN/C,EAAQuC,YAARQ,EAAaC,UACvCA,GAGLnB,QAAQC,IAAImB,YACdvB,GAAUnB,EAAKmB,EAAQ,OAAQG,QAAQC,IAAImB,YAC3C,WAAkBpB,QAAQC,IAAImB,aAGhCvB,GAAUnB,EAAKmB,EAAQ,UAAWG,QAAQC,IAAImB,YACvC,0BACT,EAEM,SAAUC,EAAUzB,GACxB,IAAQzB,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,aAAxBO,KAER,OAAIP,MAAAA,GAAAA,EAAQmD,IAAMnD,EAAOmD,GAAGC,MAC1B1B,GAAUnB,EAAKmB,EAAQ,SAAgB,MAAN1B,OAAM,EAANA,EAAQmD,GAAGC,MACrCpD,EAAOmD,GAAGC,MAGfvB,QAAQC,IAAIuB,aACd3B,GAAUnB,EAAKmB,EAAQ,OAAQG,QAAQC,IAAIuB,aACpCxB,QAAQC,IAAIuB,cAGrB3B,GAAUnB,EAAKmB,EAAQ,UAAW,kBAC3B,iBACT,CAEM,SAAU4B,EAAU7B,GAAc,IAAA8B,EAGUC,EAFxCxD,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,aAAxBO,KACR,OAAUgD,MAANvD,GAAAuD,OAAMA,EAANvD,EAAQmD,KAARI,EAAYE,MAA0B,MAAlBzD,EAAOmD,GAAGM,MAChC/B,GAAUnB,EAAKmB,EAAQ,SAAgB,MAAN1B,OAAM,EAANA,EAAQmD,GAAGM,MACrCC,OAAOF,OAADA,EAACxD,EAAOmD,SAAPK,EAAAA,EAAWC,OAGvB5B,QAAQC,IAAI6B,aACdjC,GAAUnB,EAAKmB,EAAQ,SAAUG,QAAQC,IAAI6B,aACtCD,OAAO7B,QAAQC,IAAI6B,eAE5BjC,GAAUnB,EAAKmB,EAAQ,UAAW,MAC3B,KACT,KC9IKkC,sCCuBCC,EAAS,WAgBZ,OAAAC,GAZD,SAAAC,GAQC,IAPCf,EAAQe,EAARf,SACAgB,EAASD,EAATC,UACAxB,EAAKuB,EAALvB,MAAKyB,KANAD,eAAS,EAAAC,KACTjB,cAAQ,EAAAiB,KACPC,YAAM,EAUZD,KAAKjB,SAAWA,EAChBiB,KAAKD,UAAYA,EACjBC,KAAKC,OAAS1B,CAChB,GAAC,CAAA,CAAA2B,IAAA,QAAAC,IAED,WACE,OAAOH,KAAKC,MACb,EAAAG,IAED,SAAiBC,GACfL,KAAKC,OAASI,CAChB,IAAC,CAxBY,GA2BFC,EAAM,WA8DhB,OAAAT,GA/BD,SAAY9D,GAAqB,IAAAwD,EAAAgB,EAAAnC,EAAAoC,EAAAR,KAAAA,KA9BjCtC,UAAI,EAAAsC,KACJhC,cAAQ,EAAAgC,KACRS,gBAAU,EAAAT,KACVtB,kBAAY,EAAAsB,KAEZzD,WAAK,EAAAyD,KAELd,QAAE,EAAAc,KAEF1B,SAAG,EAAA0B,KAEKU,eAAS,EAAAV,KACTW,aAAO,EAAAX,KAmDfY,UAAS,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,MAAG,SAAAC,EAAOlF,GAAoB,IAAAuD,EAAA4B,EAAA/C,EAAAgD,EAAA7E,EAAAa,EAAAiE,EAAAC,EAAAlC,EAAAK,EAAA8B,EAAAC,EAAAC,EAAAzC,EAAAL,EAAA+C,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAArB,IAAAsB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EASiB,GATjBrB,EACbrF,EAAOC,EAAQ,UAA/BO,EAAI6E,EAAJ7E,KAAMa,EAAKgE,EAALhE,MAERiE,EAA0B,CAC9BrF,OAAAA,GACDsF,EAE4C/B,OAF5CA,EAEmCvD,EAAOmD,IAAEI,EAAI,CAAA,EAAzCH,EAAIkC,EAAJlC,KAAMK,EAAI6B,EAAJ7B,KAAS8B,EAAQmB,EAAApB,EAAAqB,GAC3BnB,EAAiBpC,MAAAA,EAAAA,EAAQF,EAAUmC,GACjCI,EAAiBhC,MAAAA,EAAAA,EAAQH,EAAU+B,KACrCG,GAAkBf,EAAK9B,cAAgB8B,EAAKC,YAAU,CAAA6B,EAAAE,KAAA,EAAA,KAAA,CACZ,OAA5ClG,EAAK,uCAAuCgG,EAAAK,OAAA,SACrCnC,GAAI,KAAA,EAUE,OAPXzB,EAAWH,EAAYwC,GAErB1C,EAAeD,EAAgB,CAAE1C,OAAAA,EAAQ0B,OAAQ,YACjDgE,EAAM,IAAImB,IAAO7D,0BACnBL,GACF+C,EAAIoB,aAAazC,IAAI,eAAgB1B,GAEvCpC,EAAKmF,EAAIqB,MAAMR,EAAAE,KAAA,GACGO,MAAMtB,EAAK,CAC3BuB,QAAS,CACPC,cAAa,WF/FSzF,EE+FiB,CAAEzB,OAAAA,GF9FrCwB,EAAYC,OAAQO,EAAYP,OEgGtC,KAAA,GAE+B,OAA3BoE,GANAF,EAAGY,EAAAY,MAMiBC,QAAOb,EAAAC,KAAA,GAAAD,EAAAE,KAAA,GAEFd,EAAIG,OAAM,KAAA,GAAjCA,EAAIS,EAAAY,KACS,MAAfxB,EAAI0B,QACN9G,EAAK,2CAGLqF,EADEE,EAAKuB,QAA0B,UAAhBvB,EAAKuB,OACX,CAAEtB,QAAS,6BAEXD,EACZS,EAAAE,KAAA,GAAA,MAAA,KAAA,GAAA,OAAAF,EAAAC,KAAA,GAAAD,EAAAe,GAAAf,EAAA,MAAA,IAAAA,EAAAE,KAAA,GAEqBZ,EAAc0B,OAAM,KAAA,GAC1CnG,EADM2E,EAAOQ,EAAAY,MAEbvB,EAAW,CAAEG,QAAAA,GAAsB,KAAA,GAGF,GADnCxF,EAAK,qBAAsBqF,KAErB,YAAaA,GAAQ,CAAAW,EAAAE,KAAA,GAAA,KAAA,CAAA,KACnB,eAAgBb,GAAQ,CAAAW,EAAAE,KAAA,GAAA,KAAA,CACV,MAAhBrF,EAAMwE,GACA,IAAI4B,MAAM,0BAAyB,KAAA,GAAA,MAEnC,IAAIA,MACR,8GACD,KAAA,GAGmB,iBAAb5B,IACDK,GADwBD,EACMJ,GAA9BK,QAASC,EAAMF,EAANE,OAAQC,EAAIH,EAAJG,KACzB1B,EAAKC,WAD4BsB,EAAFyB,GAE/BhD,EAAK9B,aAAewD,EACdC,EAAQ,IAAIS,IAAIX,GAChBG,EAAS,IAAIQ,IAAIZ,GACvBT,EAAiBY,EAAMhD,KACvBJ,EAAWqD,EAAOqB,QACnB,KAAA,GAewB,OAb3BjD,EAAKlC,IAAM,IAAIsB,EAAU,CACvBb,SAAAA,EACAgB,UAAiCmB,OAAxBA,EAAQ,MAANnF,UAAMoC,EAANpC,EAAQuC,YAARH,EAAa4B,WAASmB,EAAI,QACrC3C,MAAOL,EAAS,CAAEnC,OAAAA,MAEpByE,EAAKtB,GAAEwE,EAAA,CACLhG,KAAM8C,EAAK9C,KACXM,SAAUwC,EAAKxC,SACfmB,KAAMoC,EACN/B,KAAMgC,EACNG,SAAUnB,EAAK9B,cACZ4C,GAELhF,EAAK,eAAgBkE,GAAM8B,EAAAK,OAAA,SACpBnC,GAAI,KAAA,GAAA,IAAA,MAAA,OAAA8B,EAAAqB,OFvJc,IAACnG,CEuJf,GAAAyD,EAAA,KAAA,CAAA,CAAA,GAAA,KACZ,KAAA,OAAA,SAAA2C,GAAA,OAAA/C,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CAlFQ,GAhCP,IF3EyBuB,EACnBzB,EAAQ0B,EAERnB,EEwEA8E,EAA0B,CAAErF,OAAAA,GAElCiE,KAAKS,YF5EShD,GADWD,EE6EM4D,GF5EjB3D,OAERnB,EAASR,EAFTC,EAAmByB,EAAnBzB,OAEwB,gBAAxBO,KACE,MAANP,GAAAA,EAAQ0E,YACVhD,GAAUnB,EAAKmB,EAAQ,SAAU1B,EAAO0E,YACjC9C,aAAO5B,SAAAA,EAAQ0E,cAExBhD,GAAUnB,EAAKmB,EAAQ,MAAOG,QAAQC,IAAIgG,WACnCjG,QAAQC,IAAIgG,YEqEjB7D,KAAKtC,KAAOH,EAAY6D,GACxBpB,KAAKhC,SAAWD,EAAYqD,GAC5BpB,KAAKtB,aAAeD,EAAgB2C,GACpCpB,KAAKU,UFZkB,SAAClD,GAC1B,IAAQzB,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,cAAxBO,KACR,OAAU,MAANP,GAAAA,EAAQ+H,UACVrG,GAAUnB,EAAKmB,EAAQ,SAAU1B,EAAO+H,UACjC/H,EAAO+H,UAGZlG,QAAQC,IAAIkG,eACdtG,GAAUnB,EAAKmB,EAAQ,OAAQG,QAAQC,IAAIkG,eACpCnG,QAAQC,IAAIkG,eAGd,IACT,CEFqBC,CAAY5C,GAC7BpB,KAAKzD,MAAQ0H,QAAQlI,MAAAA,OAAAA,EAAAA,EAAQQ,OAC7ByD,KAAKW,QAAU5E,MAAAA,OAAAA,EAAAA,EAAQmI,OAEvB,IAAMnF,EAAWH,EAAYwC,GAC7B+C,EAA8C,OAA9C5E,EAA0C,MAANxD,OAAM,EAANA,EAAQmD,IAAEK,EAAI,CAAE,EAA5CJ,EAAIgF,EAAJhF,KAAMK,EAAI2E,EAAJ3E,KAAS8B,EAAQmB,EAAA0B,EAAAC,GACzB7C,EAAqB,MAAJpC,EAAAA,EAAQF,EAAUmC,GACnCI,EAAqB,MAAJhC,EAAAA,EAAQH,EAAU+B,GAEzCpB,KAAK1B,IAAM,IAAIsB,EAAU,CACvBb,SAAAA,EACAgB,UAAiCQ,OAAxBA,EAAQ,MAANxE,UAAMqC,EAANrC,EAAQuC,YAARF,EAAa2B,WAASQ,EAAI,QACrChC,MAAOL,EAAS,CAAEnC,OAAAA,MAEpBiE,KAAKd,GAAEwE,EAAA,CACLhG,KAAMsC,KAAKtC,KACXM,SAAUgC,KAAKhC,SACfmB,KAAMoC,EACN/B,KAAMgC,GACHF,GAEDtB,KAAKtB,eACPsB,KAAKd,GAAGyC,SAAW3B,KAAKtB,aAE5B,GAAC,CAAA,CAAAwB,IAAA,WAAAC,IA/CD,WACE,OAAOH,KAAKU,SACb,EAAAN,IAED,SAAoBC,GAClBL,KAAKU,UAAYL,CACnB,GAAC,CAAAH,IAAA,SAAAC,IAED,WACE,OAAOH,KAAKW,OACb,EAAAP,IAED,SAAkBC,GAChBL,KAAKW,QAAUN,CACjB,IAAC,CA7BgB,GCpDNgE,EAEX,SAAYC,EAAwBC,GAAmBvE,KADvDwE,cAAQ,EAENxE,KAAKwE,SAAW,IAAIC,SAASH,EAAMC,EACrC,GFFF,SAAK5E,GACHA,EAAA,KAAA,SACAA,EAAA,OAAA,WACAA,EAAA,MAAA,QACAA,EAAA,UAAA,WACD,CALD,CAAKA,IAAAA,EAKJ,CAAA,IAAA,IA8BK+E,EAAU,IA7BH,WAEX,SAAAC,IAAA3E,KADA4E,YAAM,EAEJ5E,KAAK4E,OAAS,EAChB,CAAC,IAAAC,EAAAF,EAAAG,UAqBA,OArBAD,EACDE,QAAA,SAAQC,EAAmB3E,GAEzB,IAAM4E,EAAejF,KAAK4E,OAAOI,GAGjC,GAAIC,EACF,IAAA,IAAmCC,EAAnCC,EAAAC,EAAuBH,KAAYC,EAAAC,KAAAE,OACjCC,EADiBJ,EAAA7E,OACRA,EAGf,EACAwE,EACAU,UAAA,SAAUP,EAAmBM,GAEtBtF,KAAK4E,OAAOI,KACfhF,KAAK4E,OAAOI,GAAa,IAI3BhF,KAAK4E,OAAOI,GAAWQ,KAAKF,IAC7BX,CAAA,CAzBU,IA+BAc,EAAiB,SAAC3B,GAC7BY,EAAQK,QAAQpF,EAAO+F,OAAQ5B,EACjC,EAKa6B,EAAe,SAACzB,GAC3BQ,EAAQK,QAAQpF,EAAOiG,KAAM1B,EAC/B,EAIa2B,EAAc,SAACC,GAC1BpB,EAAQK,QAAQpF,EAAOoG,MAAOD,EAChC,EG7CaE,EAAgB,kBAChBC,EAAiB,gBAc9B,SAASC,EAAmBlD,EAAkBjD,GAAwB,IAAAoG,EAC9DC,SAAMD,EAAGnD,EAAQ7C,IAAI,kBAAZgG,EAAuBE,MAAM,MACtCC,EAAmC,CAAA,EACzC,GAAIF,EACF,IAAA,IAA0BlB,EAA1BC,EAAAC,EAAoBgB,KAAMlB,EAAAC,KAAAE,MAAE,CAAA,IACpBkB,EADQrB,EAAA7E,MACYgG,MAAM,KAC1BG,EAAUD,EAAYE,MAAM,GAAGC,KAAK,KAE1CJ,EADaC,EAAY,IACRC,CACnB,CAGF,GAAIJ,EACF,IAAA,IAA0BO,EAA1BC,EAAAxB,EAAoBgB,KAAMO,EAAAC,KAAAvB,MAAE,CAAA,IACpBkB,EADQI,EAAAtG,MACYgG,MAAM,KAC1BG,EAAUD,EAAYE,MAAM,GAAGC,KAAK,KAE1CJ,EADaC,EAAY,IACRC,CACnB,CAEF,OAAIzG,EACKuG,EAASvG,GAEX,IACT,CACgB,SAAA8G,EAAkB7D,EAAkBjH,GAAc,IAAA+D,EAC1DgH,EAAeZ,EAAmBlD,EAAS,YACjD,OAAkD,OAAlDlD,QAAOgH,EAAAA,EAAgB9D,MAAAA,OAAAA,EAAAA,EAAS7C,IAAI6F,IAAclG,EAAI/D,EAAO+H,QAC/D,CAEgB,SAAAiD,EAAgB/D,EAAkBjH,GAAc,IAAAiL,EACxDzI,EAAQ2H,EAAmBlD,EAASjH,EAAOuC,IAAIyB,WACrD,OAAIxB,EACU0I,YAAU1I,GACX2I,IAEsBF,OAAnCA,EAAc,MAAPhE,OAAO,EAAPA,EAAS7C,IAAI8F,IAAee,EAAIjL,EAAOmI,MAChD,CAEA,SAAsBiD,EAAMvD,EAAAwD,EAAAC,GAAA,OAAAC,EAAAzK,MAAAmD,KAAA/D,UAAA,CAwG3B,SAAAqL,IAAA,OAAAA,EAAAxG,EAAAC,IAAAC,MAxGM,SAAAC,EACLlF,EACAwL,EACAC,GAAkB,IAAArJ,EAAAC,EAAAqJ,EAAAtG,EAAA7E,EAAAa,EAAAsE,EAAA1B,EAAAiD,EAAA0E,EAAAnJ,EAAAuF,EAAAI,EAAAyD,EAAAnD,EAAA9C,EAAAkG,EAAAC,EAAA/F,EAAAgG,EAAA,OAAA/G,IAAAsB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAsBG,GAtBHrB,EAEMrF,EAAOC,EAAQ,YAA/BO,EAAI6E,EAAJ7E,KAAMa,EAAKgE,EAALhE,MAERsE,EAAG,IAAgB,OAAhBtD,EAAMpC,EAAOuC,UAAG,EAAVH,EAAYY,UAAWwI,EAChCxH,EAAsB,OAAb3B,EAAGrC,EAAOuC,UAAG,EAAVF,EAAY2B,UACxBiD,EAAU,IAAI+E,QAAQP,MAAAA,OAAAA,EAAAA,EAAMxE,UAC5B0E,EAAe,IAAIK,SACZ3H,IAAI,eAAgB,mCACd4C,EAAQ7C,IAAI,oBAEvB5B,EAAQ2H,EAAmBlD,EAASjD,IAExC2H,EAAatH,IAAI,gBAAe,UAAY7B,GACnCL,EAAS,CAAEnC,OAAAA,KACpB2L,EAAatH,IAAI,gBAAe,UAAYlC,EAAS,CAAEnC,OAAAA,MAIrD+H,EAAW+C,EAAkB7D,EAASjH,GAC5C0J,EAAe3B,GACTI,EAAS6C,EAAgB/D,EAASjH,GACxC4J,EAAazB,IACTzC,EAAIuG,SAAS,eAAkBlE,EAAQ,CAAAxB,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAK,OAAA,SAClC,IAAI0B,EAAc,kCAAmC,CAC1DjB,OAAQ,OACR,KAAA,GAMwB,OAJtBuE,EAAalG,EAChBwG,QAAQ,aAAcC,mBAAmBvK,OAAOmG,KAChDmE,QAAQ,WAAYC,mBAAmBvK,OAAOuG,KAEjD5H,EAAK,UAAWqL,GAAYrF,EAAAE,KAAA,GAELO,MAAM4E,EAAUjE,KAClC8D,EAAI,CACPxE,QAAS0E,KACT,OAAO,SAACS,GACRhL,EAAM,UAAW,aAAcgL,EACjC,IAAE,KAAA,GALY,MAAR3D,EAAQlC,EAAAY,OAOEsB,EAASpB,QAAU,KAAOoB,EAASpB,OAAS,KAAG,CAAAd,EAAAE,KAAA,GAAA,KAAA,CAAA,GAC/B,mBAAnBgC,EAASrB,MAAoB,CAAAb,EAAAE,KAAA,GAAA,KAAA,CAClC,OADkCF,EAAAe,GACtC/G,EAAIgG,EAAAE,KAAA,GAAgCgC,EAASrB,QAAQtB,OAAM,KAAA,GAAAS,EAAA8F,GAAA9F,EAAAY,MAAA,EAAAZ,EAAAe,IAAtD,UAAW,aAAYf,EAAA8F,IAAA,KAAA,GAAA,OAAA9F,EAAAK,OAAA,SAEvB6B,GAAQ,KAAA,GAML,OAFNoD,EACuB,mBAApBpD,MAAAA,OAAAA,EAAAA,EAAUrB,OAAuBqB,EAASrB,QAAU,KACzD0E,EAAM,GAAEvF,EAAAC,KAAA,GAAAD,EAAAE,KAAA,GAEGgC,MAAAA,OAAAA,EAAAA,EAAuB3C,OAAM,KAAA,GAA1CH,EAAGY,EAAAY,KAAAZ,EAAAE,KAAA,GAAA,MAAA,KAAA,GAAA,GAAAF,EAAAC,KAAA,GAAAD,EAAA+F,GAAA/F,EAAA,MAAA,KAECsF,EAAY,CAAAtF,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,GACFoF,EAAatE,OAAM,KAAA,IAA/BuE,EAAGvF,EAAAY,OAED/F,EAAM,UAAW,aAAY,YAAcyK,EAAaxE,OAAWyE,IAAAA,GACpE,KAAA,GAEEA,GACH1K,EAAM,UAAW,aAAYmF,EAAA+F,IAC9B,KAAA,GAAA,IAECR,EAAG,CAAAvF,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAK,OAAA,SACE,IAAI0B,EAAcwD,EAAK,CAAEzE,OAAQwE,MAAAA,OAAAA,EAAAA,EAAcxE,UAAS,KAAA,GAAA,IAG7D1B,KAAO,YAAaA,GAAG,CAAAY,EAAAE,KAAA,GAAA,KAAA,CAOvB,OALFrF,EACE,UACA,aACYyK,aAAAA,MAAAA,OAAAA,EAAAA,EAAcxE,QAC1BtB,IALMA,EAAYJ,EAAZI,SAMNQ,EAAAK,OAAA,SACK,IAAI0B,EAAcvC,EAAS,CAAEsB,OAAQ,OAAM,KAAA,GAAA,IAEhD1B,KAAO,WAAYA,GAAG,CAAAY,EAAAE,KAAA,GAAA,KAAA,CAStB,OALFrF,EACE,UACA,aACYyK,aAAAA,MAAAA,OAAAA,EAAAA,EAAcxE,QAC1BtB,IANSA,EACPJ,EADF4G,OAAgB,IAOhBhG,EAAAK,OAAA,SACK,IAAI0B,EAAcvC,EAAS,CAAEsB,OAAQ,OAAM,KAAA,GAQlD,OALFjG,EACE,UACA,aACYyK,aAAAA,MAAAA,OAAAA,EAAAA,EAAcxE,QAC1B,IAAA,mBACAd,EAAAK,OAAA,SACK,IAAI0B,EAAc,KAAM,CAC7BjB,OAAsCqE,OAAhCA,EAAwB,MAArBjD,OAAqB,EAArBA,EAAuBpB,QAAMqE,EAAI,OAC1C,KAAA,GAAA,IAAA,MAAA,OAAAnF,EAAAqB,OAAA,GAAA1C,EAAA,KAAA,CAAA,CAAA,GAAA,KACH,MAAApE,MAAAmD,KAAA/D,UAAA,CCrKgD,IAK5BsM,WAAaC,GAChC,SAAAD,EAAYxM,GAAc,IAAAyE,EAgHzB,OA/GCA,EAAAgI,EAAAC,KAAAzI,KAAMjE,IAAOiE,MAyFf0I,KAAI,WAAA,IAAA5I,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACL0H,EACAlH,EACA8C,GAAkB,OAAAxD,IAAAsB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAAA,OAAAF,EAAAE,KAAA,EAELhC,EAAKoI,QAAQ,OAAQnH,EAAKkH,EAAKpE,GAAK,KAAA,EAAA,OAAAjC,EAAAK,OAAAL,SAAAA,EAAAY,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAZ,EAAAqB,OAAA,GAAA1C,EAClD,KAAA,OAAA,SAAA2C,EAAAwD,EAAAC,GAAA,OAAAvH,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CANG,GAMHuE,EAEDL,IAAG,WAAA,IAAAU,EAAAC,EAAAC,IAAAC,MAAG,SAAA6H,EACJF,EACAlH,EACA8C,GAAkB,OAAAxD,IAAAsB,MAAA,SAAAyG,GAAA,cAAAA,EAAAvG,KAAAuG,EAAAtG,MAAA,KAAA,EAAA,OAAAsG,EAAAtG,KAAA,EAELhC,EAAKoI,QAAQ,MAAOnH,EAAKkH,EAAKpE,GAAK,KAAA,EAAA,OAAAuE,EAAAnG,OAAAmG,SAAAA,EAAA5F,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA4F,EAAAnF,OAAA,GAAAkF,EACjD,KAAA,OAAA,SAAAE,EAAAC,EAAAC,GAAA,OAAApI,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CANE,GAMFuE,EAED0I,IAAG,WAAA,IAAA7H,EAAAP,EAAAC,IAAAC,MAAG,SAAAmI,EACJR,EACAlH,EACA8C,GAAkB,OAAAxD,IAAAsB,MAAA,SAAA+G,GAAA,cAAAA,EAAA7G,KAAA6G,EAAA5G,MAAA,KAAA,EAAA,OAAA4G,EAAA5G,KAAA,EAELhC,EAAKoI,QAAQ,MAAOnH,EAAKkH,EAAKpE,GAAK,KAAA,EAAA,OAAA6E,EAAAzG,OAAAyG,SAAAA,EAAAlG,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAkG,EAAAzF,OAAA,GAAAwF,EACjD,KAAA,OAAA,SAAAE,EAAAC,EAAAC,GAAA,OAAAlI,EAAAxE,MAAAmD,KAAA/D,UAAA,CAAA,CANE,GAMFuE,CA9GD,CAACgJ,EAAAjB,EAAAC,GAAA,IAAA3D,EAAA0D,EAAAzD,UAsFA,OAtFAD,EAEK4E,WAAU,WAAA,IAAAC,EAAA5I,EAAAC,IAAAC,MAAhB,SAAA2I,EACEC,EACAnI,EACA8C,EACAD,GAAa,IAAAuF,EAAAnI,EAAA,OAAAX,IAAAsB,MAAA,SAAAyH,GAAA,cAAAA,EAAAvH,KAAAuH,EAAAtH,MAAA,KAAA,EAKL,OAHFqH,EAAKnG,EAAA,CAAA,EACNa,EAAI,CACPD,KAAAA,EACAsF,OAAAA,IAAME,EAAAtH,KAAA,EAGU2E,EAAOnH,KAAMyB,EAAKoI,GAAM,KAAA,EAAjC,MAAHnI,EAAGoI,EAAA5G,gBAEUmB,GAAa,CAAAyF,EAAAtH,KAAA,EAAA,KAAA,CAAA,OAAAsH,EAAAnH,OACvBjB,SAAAA,EAAI8C,UAAQ,KAAA,EAAA,OAAAsF,EAAAnH,OAAA,SAGdjB,GAAG,KAAA,EAAA,IAAA,MAAA,OAAAoI,EAAAnG,OAAA,GAAAgG,EAAA3J,KACX,KAAA,OAAA,SAAA+J,EAAAC,EAAAC,EAAAC,GAAA,OAAAR,EAAA7M,MAAAmD,KAAA/D,UAAA,CAAA,CAnBe,GAqBhB4I,EAWgB+D,QAAO,WAAA,IAAAuB,EAAArJ,EAAAC,IAAAC,MAAb,SAAAoJ,EACRR,EACAnI,EACAkH,EACApE,GAAkB,IAAAvB,EAAAc,EAAAsC,EAAAiE,EAAA3J,EAAA8F,EAAAlC,EAAAuF,EAAA,OAAA9I,IAAAsB,MAAA,SAAAiI,GAAA,cAAAA,EAAA/H,KAAA+H,EAAA9H,MAAA,KAAA,EA4BlB,GAzBMQ,EAAU,IAAI+E,QAAQxD,EAAOA,MAAAA,OAAAA,EAAAA,EAAMvB,QAAU,CAAA,GAC/C2F,aAAeZ,SACXjE,EAAW6E,EAAIxI,IAAI6F,GACnBI,EAASuC,EAAIxI,IAAI,UACnB2D,GACFd,EAAQ5C,IAAI4F,EAAelC,GAEzBsC,GACFpD,EAAQ5C,IAAI,SAAUgG,IAEfuC,aAAe4B,UAElBF,EAAW,IAAItC,QAAQY,MAAAA,OAAAA,EAAAA,EAAK3F,SAC5Bc,EAAWuG,EAASlK,IAAI6F,GACxBI,EAASiE,EAASlK,IAAI,UACxB2D,GACFd,EAAQ5C,IAAI4F,EAAelC,GAEzBsC,GACFpD,EAAQ5C,IAAI,SAAUgG,IAItB9B,EAA2BkG,KAAKC,UAAU9B,GAG/B,QAAXiB,EAAgB,CAAAU,EAAA9H,KAAA,EAAA,KAAA,CAClB8B,OAAOoG,EAAUJ,EAAA9H,KAAA,GAAA,MAAA,KAAA,EAAA,KACRmG,aAAe4B,SAAO,CAAAD,EAAA9H,KAAA,GAAA,KAAA,CAAA,OAAA8H,EAAA9H,KAAA,GAClB,IAAIiC,SAASkE,EAAIrE,MAAMhB,OAAM,KAAA,GAA1CgB,EAAIgG,EAAApH,KAAAoH,EAAA9H,KAAA,GAAA,MAAA,KAAA,IAGJmG,aAAeZ,SACS,OAAxByC,KAAKC,UAAU9B,IACdA,GAAsB,iBAARA,GAAkD,IAA9BgC,OAAOC,OAAOjC,GAAKzM,UAEtDoI,OAAOoG,GACR,KAAA,GAIQ,OAFHb,EAAKnG,EAAA,CAAA,EACNa,EAAI,CACPvB,QAAAA,IAAOsH,EAAA9H,KAAA,GAGIxC,KAAKyJ,WAAWG,EAAQnI,EAAKoI,EAAOvF,GAAK,KAAA,GAAA,OAAAgG,EAAA3H,OAAA2H,SAAAA,EAAApH,MAAA,KAAA,GAAA,IAAA,MAAA,OAAAoH,EAAA3G,OAAA,GAAAyG,EAAApK,KACvD,KAAA,OAAA,SAAA6K,EAAAC,EAAAC,EAAAC,GAAA,OAAAb,EAAAtN,MAAAmD,KAAA/D,UAAA,CAAA,CApDsB,GAoDtBsM,CAAA,EAzFuCjI,GCwBrB2K,WAAKzC,GACxB,SAAAyC,EAAYlP,GAAc,IAAAyE,EAoNzB,OAnNCA,EAAAgI,EAAAC,KAAAzI,KAAMjE,IAAOiE,MAMfkL,MAAK,WAAA,IAAApL,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACN0H,EACApE,GAAkB,IAAAvB,EAAAmI,EAAAC,EAAAC,EAAA3J,EAAA4J,EAAA/M,EAAA6H,EAAAmF,EAAAC,EAAA1H,EAAA,OAAA/C,IAAAsB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAUW,GARvBQ,EAAU,IAAI+E,QAAQ,CAAE,eAAgB,qBACxCoD,EAAa,IAAI5C,EAAS/H,GASpB,UANVmI,aAAe4B,QACX,IAAI3H,IAAI+F,EAAIlH,KAAKoB,aACjB,IAAI4I,iBAEStL,IAAI,OAEL,CAAAmC,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,EACUhC,EAAKkL,cAC5B/C,EAAgBxF,QACjBoB,GACD,KAAA,EAHgB,MAAX6G,EAAW9I,EAAAY,OAOfkI,EAAYhI,QAAU,KACtBgI,EAAYhI,OAAS,KAAG,CAAAd,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,GAEA,IAAIiC,SAAS2G,EAAY9G,MAAMzC,OAAM,KAAA,GAA9C,MAATwJ,EAAS/I,EAAAY,MACDhH,OAAS,GAAC,CAAAoG,EAAAE,KAAA,GAAA,KAAA,CAAA,KAClB6I,EAAUnP,OAAS,GAAC,CAAAoG,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAK,OAAA,SACf,IAAI8B,SAAS+F,KAAKC,UAAUY,GAAY,CAAEjI,OAAQ,OAAM,KAAA,GAUjE,OALAJ,EAAQ5C,IAAI4F,EAAeqF,EAAU,GAAGvH,UACxCd,EAAQ2I,OACN,aACYN,YAAAA,EAAU,GAAGvH,SAAQ,uBAEnCxB,EAAAK,OACO,SAAA,IAAI8B,SACT+F,KAAKC,UAAU,CACbmB,YAAW,GAAKpL,EAAKlC,IAAIS,SAAWyB,EAAKqL,YAAY,UAEvD,CAAEzI,OAAQ,OACX,KAAA,GAAA,OAAAd,EAAAE,KAAA,GAOW2I,EAAWzC,KAAKC,EAAKnI,EAAKsL,SAAUvH,GAAK,OAAO,SAAC4D,GAGjE,OADAvL,QAAQO,MAAMgL,GACPA,CACT,IAAE,KAAA,GAJO,MAAHzG,EAAGY,EAAAY,gBAKUmB,GAAa,CAAA/B,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAK,OACvBjB,SAAAA,EAAI8C,UAAQ,KAAA,GAAA,KAEjB9C,GAAOA,EAAI0B,QAAU,KAAO1B,EAAI0B,OAAS,KAAG,CAAAd,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,GACPd,EAAIG,OAAM,KAAA,GAQpB,OAPvBuE,GAAoB,OAAdkF,EAAM9K,EAAKlC,UAAG,EAARgN,EAAUvL,WAAaxB,KADnCA,EAAK+D,EAAAY,MACoC3E,MAAMwN,IAAG,oCACxD/I,EAAQ2I,OAAO,aAAcvF,GAEvBoF,EAAgB,OADdD,EAAYhN,EAAZgN,cACc,EAAPA,EAASX,SAClB9G,EAAW0H,MAAAA,OAAAA,EAAAA,EAAQhJ,OAAOnC,MAChC2C,EAAQ5C,IAAI4F,EAAelC,GAC3Bd,EAAQ2I,OAAO,aAA0B7H,YAAAA,yBACzC+B,EAAYtH,EAAMA,MAAMwN,KAAKzJ,EAAAK,OAAA,SAEtB,IAAI8B,SAAS+F,KAAKC,UAAUlM,GAAQ,CAAE6E,OAAQ,IAAKJ,QAAAA,KAAU,KAAA,GAAA,OAAAV,EAAAE,KAAA,GAEnDd,EAAI4B,OAAM,KAAA,GAAnB,OAAAhB,EAAAK,OAAA,SACH,IAAI8B,SADDnC,EAAAY,KACgB,CAAEE,OAAQ1B,EAAI0B,UAAS,KAAA,GAAA,IAAA,MAAA,OAAAd,EAAAqB,OAAA,GAAA1C,EAClD,KAAA,OAAA2C,SAAAA,EAAAwD,GAAA,OAAAtH,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CA1EI,GA0EJuE,EAEDwL,SAAW,SAACC,GACV,IAAMC,EAAQ,WAAA,IAAArL,EAAAC,EAAAC,IAAAC,MAAG,SAAA6H,EACfF,GAAyB,IAAAwD,EAAAnJ,EAAAsB,EAAA8H,EAAAtI,EAAAsC,EAAA,OAAArF,IAAAsB,MAAA,SAAAyG,GAAA,cAAAA,EAAAvG,KAAAuG,EAAAtG,MAAA,KAAA,EAEI,OAAvBQ,EAAU,IAAI+E,QAASe,EAAAtG,KAAA,EACTmG,EAAgB0D,WAAU,KAAA,EAApC,OAAJ/H,EAAIwE,EAAA5F,KAAA4F,EAAAtG,KAAA,EACiB8B,EAAKnE,IAAI,gBAAe,KAAA,EAAlC,OAAXiM,EAAWtD,EAAA5F,KAAA4F,EAAAtG,KAAA,EACO8B,EAAKnE,IAAI,YAAW,KAAA,EAMP,OAN/B2D,EAAQgF,EAAA5F,KACRkD,GAAoB,OAAd+F,EAAM3L,EAAKlC,UAAG,EAAR6N,EAAUpM,WAAS,IAAIqM,EAAW,oCACpDvG,EAAYuG,GACZpJ,EAAQ2I,OAAO,aAAcvF,GAC7BpD,EAAQ5C,IAAI4F,EAAelC,GAC3Bd,EAAQ2I,OAAO,aAA0B7H,YAAAA,yBACzCd,EAAQ5C,IAAI,WAAY6L,GAAanD,EAAAnG,OAAA,SAC9B,IAAI8B,SAAS,KAAM,CACxBzB,QAAAA,EACAI,OAAQ,OACR,KAAA,GAAA,IAAA,MAAA,OAAA0F,EAAAnF,OAAA,GAAAkF,EACH,KAAA,OAjBKqD,SAAQ7E,GAAA,OAAAxG,EAAAhE,MAAAmD,KAAA/D,UAAA,EAAA,GAkBd,OAAOiQ,GACR1L,EAEDqL,YAAc,SAACS,GAAoB,IAAAC,EACjC,MAAA,cAAqBrE,mBAAmB1H,EAAKC,YAAW8L,aACzC,OADyCA,EACtD/L,EAAKsD,UAAQyI,EAAI,sCACKD,EAAQ,UACjC9L,EAMDgM,OAAM,WAAA,IAAAnL,EAAAP,EAAAC,IAAAC,MAAG,SAAAmI,EACPR,EACApE,GAAkB,IAAAvB,EAAAmI,EAAAzJ,EAAA+K,EAAAC,EAAAC,EAAApO,EAAA6H,EAAA5C,EAAA,OAAAzC,IAAAsB,MAAA,SAAA+G,GAAA,cAAAA,EAAA7G,KAAA6G,EAAA5G,MAAA,KAAA,EAGoB,OADhCQ,EAAU,IAAI+E,QACdoD,EAAa,IAAI5C,EAAS/H,GAAM4I,EAAA5G,KAAA,EACpB2I,EAAWzC,KAAKC,EAAKnI,EAAKoM,UAAWrI,GAAK,OAAO,SAAC4D,GAGlE,OADAvL,QAAQO,MAAMgL,GACPA,CACT,IAAE,KAAA,EAJO,MAAHzG,EAAG0H,EAAAlG,gBAKUmB,GAAa,CAAA+E,EAAA5G,KAAA,EAAA,KAAA,CAAA,OAAA4G,EAAAzG,OACvBjB,SAAAA,EAAI8C,UAAQ,KAAA,EAAA,KAEjB9C,GAAOA,EAAI0B,QAAU,KAAO1B,EAAI0B,OAAS,KAAG,CAAAgG,EAAA5G,KAAA,GAAA,KAAA,CAAA,OAAA4G,EAAA5G,KAAA,GACPd,EAAIG,OAAM,KAAA,GAOe,OAN1DuE,UAAMqG,EAAMjM,EAAKlC,YAALmO,EAAU1M,WAAS2M,KAAIA,OAAJA,GAD/BnO,EAAK6K,EAAAlG,MACoC3E,YAANmO,EAAAA,EAAaX,KAAG,oCACzD/I,EAAQ2I,OAAO,aAAcvF,GACrB5C,EAAOjF,EAAPiF,GACRqC,EAAY8G,OAADA,EAACpO,EAAMA,YAANoO,EAAAA,EAAaZ,KACzBpG,EAAanC,GACbR,EAAQ5C,IAAI6F,EAAgBzC,GAC5BR,EAAQ2I,OAAO,aAAwBnI,UAAAA,yBAAyB4F,EAAAzG,OAAA,SACzD,IAAI8B,SAAS+F,KAAKC,UAAUlM,GAAQ,CAAE6E,OAAQ,IAAKJ,QAAAA,KAAU,KAAA,GAAA,OAAAoG,EAAA5G,KAAA,GAEnDd,EAAI4B,OAAM,KAAA,GAAnB,OAAA8F,EAAAzG,OAAA,SACH,IAAI8B,SADD2E,EAAAlG,KACgB,CAAEE,OAAQ1B,EAAI0B,UAAS,KAAA,GAAA,IAAA,MAAA,OAAAgG,EAAAzF,OAAA,GAAAwF,EAClD,KAAA,OAAAJ,SAAAA,EAAAC,GAAA,OAAA3H,EAAAxE,MAAAmD,KAAA/D,UAAA,CAAA,CA3BK,GA2BLuE,EAcDqM,oBAAmB,WAAA,IAAA1I,EAAArD,EAAAC,IAAAC,MAAG,SAAA2I,EACpBhB,EACApE,GAAkB,IAAA4G,EAAA,OAAApK,IAAAsB,MAAA,SAAAyH,GAAA,cAAAA,EAAAvH,KAAAuH,EAAAtH,MAAA,KAAA,EAEoB,OAAhC2I,EAAa,IAAI5C,EAAS/H,GAAMsJ,EAAAnH,OAAA,SAC/BwI,EAAWhL,IAAIwI,EAAKnI,EAAKsM,uBAAwBvI,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAuF,EAAAnG,OAAA,GAAAgG,EAC9D,KAAA,OAAAV,SAAAA,EAAAI,GAAA,OAAAlF,EAAAtH,MAAAmD,KAAA/D,UAAA,CAAA,CANkB,GAMlBuE,EAEDuM,eAAc,WAAA,IAAAC,EAAAlM,EAAAC,IAAAC,MAAG,SAAAoJ,EACfzB,EACApE,GAAkB,IAAA4G,EAAA,OAAApK,IAAAsB,MAAA,SAAAiI,GAAA,cAAAA,EAAA/H,KAAA+H,EAAA9H,MAAA,KAAA,EAGS,OADrB2I,EAAa,IAAI5C,EAAS/H,GACL8J,EAAA3H,gBACpBwI,EAAWzC,KAAKC,EAAKnI,EAAKyM,kBADZ,QAC6C1I,IAAK,KAAA,EAAA,IAAA,MAAA,OAAA+F,EAAA3G,OAAA,GAAAyG,EACxE,KAAA,OAAAd,SAAAA,EAAAC,GAAA,OAAAyD,EAAAnQ,MAAAmD,KAAA/D,UAAA,CAAA,CAPa,GAObuE,EAED0M,eAAc,WAAA,IAAAC,EAAArM,EAAAC,IAAAC,MAAG,SAAAoM,EACfzE,EACApE,GAAkB,IAAA4G,EAAA,OAAApK,IAAAsB,MAAA,SAAAgL,GAAA,cAAAA,EAAA9K,KAAA8K,EAAA7K,MAAA,KAAA,EAGS,OADrB2I,EAAa,IAAI5C,EAAS/H,GACL6M,EAAA1K,gBACpBwI,EAAWjC,IAAIP,EAAKnI,EAAKyM,kBADX,QAC4C1I,IAAK,KAAA,EAAA,IAAA,MAAA,OAAA8I,EAAA1J,OAAA,GAAAyJ,EACvE,KAAA,OAAArD,SAAAA,EAAAC,GAAA,OAAAmD,EAAAtQ,MAAAmD,KAAA/D,UAAA,CAAA,CAPa,GAObuE,EAUDkL,cAAa,WAAA,IAAA4B,EAAAxM,EAAAC,IAAAC,MAAG,SAAAuM,EACd5E,EACApE,GAAkB,IAAAiJ,EAAArC,EAAA7G,EAAA,OAAAvD,IAAAsB,MAAA,SAAAoL,GAAA,cAAAA,EAAAlL,KAAAkL,EAAAjL,MAAA,KAAA,EAEoB,GAAhC2I,EAAa,IAAI5C,EAAS/H,IAG5BmI,KAAO,SAAUA,GAAG,CAAA8E,EAAAjL,KAAA,EAAA,KAAA,CAAA,OAAAiL,EAAAjL,KAAA,EACT,IAAIiC,SAASkE,EAAIrE,MAAkBzC,OAAM,KAAA,EAAtDyC,EAAImJ,EAAAvK,KAAA,KAAA,EAAA,OAAAuK,EAAA9K,OAECwI,SAAAA,EAAWhL,IAAIwI,EAAKnI,EAAKkN,YAAYF,OAADA,EAAClJ,QAAAkJ,EAAAA,EAAMG,OAAQpJ,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAkJ,EAAA9J,OAAA,GAAA4J,EAChE,KAAA,OAAAtD,SAAAA,EAAAC,GAAA,OAAAoD,EAAAzQ,MAAAmD,KAAA/D,UAAA,CAAA,CAXY,GAWZuE,EAEDoN,kBAAoB,SAACC,GACnB,IAAI/J,EAOJ,MANwB,iBAAbA,EACTA,EAAW+J,EACFA,aAAiB9F,UAC1BjE,EAAW+C,EAAkBgH,EAAKrN,IAGpC,cAAqBA,EAAKC,WAAU,YAAYqD,EAAQ,uBACzDtD,CAlND,CAACgJ,EAAAyB,EAAAzC,GAAA,IAAA3D,EAAAoG,EAAAnG,UA0LA,OA1LAD,EA8IDoI,kBAAA,SAAkBa,GAChB,MAAqB5F,cAAAA,mBAAmBlI,KAAKS,YAAW,aACtDT,KAAK8D,SAAWoE,mBAAmBlI,KAAK8D,UAAY,cAC9BoE,wBAAAA,mBAAmB4F,IAC5CjJ,EAkCD6I,YAAA,SAAYC,GACV,MAAA,cAAqBzF,mBACnBlI,KAAKS,YACN,gCACCkN,EAAK,UAAazF,mBAAmByF,GAAW,KAEnD9N,EAAAoL,EAAA,CAAA,CAAA/K,IAAA,WAAAC,IAzLD,WACE,MAAA,cAAqB+H,mBAAmBlI,KAAKS,YAAW,cAC1D,GAAC,CAAAP,IAAA,YAAAC,IA0GD,WACE,MAAA,cAAqB+H,mBAAmBlI,KAAKS,YAAW,QAC1D,GAAC,CAAAP,IAAA,yBAAAC,IAqCD,WACE,MAAA,cAAqB+H,mBAAmBlI,KAAKS,yBAC3CT,KAAK8D,SAAWoE,mBAAmBlI,KAAK8D,UAAY,cACtD,sBACF,IAAC,EA3J+BxD,GCIbyN,WAAMvF,GACzB,SAAAuF,EAAYhS,GAAc,IAAAyE,EA2DzB,OA1DCA,EAAAgI,EAAAC,KAAAzI,KAAMjE,IAAOiE,MAefgO,iBAAgB,WAAA,IAAAlO,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACjB0H,EACApE,GAAkB,IAAA4G,EAAA,OAAApK,IAAAsB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAEoB,OAAhC2I,EAAa,IAAI5C,EAAS/H,GAAM8B,EAAAE,KAAA,EACzB2I,EAAWzC,KAAKC,EAAKnI,EAAKyN,eAAgB1J,GAAK,KAAA,EAAA,OAAAjC,EAAAK,OAAAL,SAAAA,EAAAY,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAZ,EAAAqB,OAAA,GAAA1C,EAC7D,KAAA,OAAA2C,SAAAA,EAAAwD,GAAA,OAAAtH,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CANe,GAMfuE,EAED0N,UAAS,WAAA,IAAArN,EAAAC,EAAAC,IAAAC,MAAG,SAAA6H,EACVF,EACApE,GAAkB,IAAA4G,EAAA,OAAApK,IAAAsB,MAAA,SAAAyG,GAAA,cAAAA,EAAAvG,KAAAuG,EAAAtG,MAAA,KAAA,EAEoB,OAAhC2I,EAAa,IAAI5C,EAAS/H,GAAMsI,EAAAtG,KAAA,EACzB2I,EAAWhL,IAAIwI,EAAKnI,EAAK2N,SAAU5J,GAAK,KAAA,EAAA,OAAAuE,EAAAnG,OAAAmG,SAAAA,EAAA5F,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA4F,EAAAnF,OAAA,GAAAkF,EACtD,KAAA,OAAAxB,SAAAA,EAAA0B,GAAA,OAAAlI,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CANQ,GAMRuE,EAED4N,WAAU,WAAA,IAAA/M,EAAAP,EAAAC,IAAAC,MAAG,SAAAmI,EACXjF,EACAyE,EACApE,GAAkB,IAAA4G,EAAA,OAAApK,IAAAsB,MAAA,SAAA+G,GAAA,cAAAA,EAAA7G,KAAA6G,EAAA5G,MAAA,KAAA,EAEoB,OAAhC2I,EAAa,IAAI5C,EAAS/H,GAAM4I,EAAA5G,KAAA,EACzB2I,EAAWjC,IAAIP,EAAQnI,EAAK2N,SAAQ,IAAIjK,EAAUK,GAAK,KAAA,EAAA,OAAA6E,EAAAzG,OAAAyG,SAAAA,EAAAlG,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAkG,EAAAzF,OAAA,GAAAwF,EACrE,KAAA,OAAA,SAAAH,EAAAC,EAAAI,GAAA,OAAAhI,EAAAxE,MAAAmD,KAAA/D,UAAA,CAAA,CAPS,GAOTuE,EAED6N,gBAAe,WAAA,IAAAlK,EAAArD,EAAAC,IAAAC,MAAG,SAAA2I,EAChBhB,EACApE,GAAkB,IAAA4G,EAAA,OAAApK,IAAAsB,MAAA,SAAAyH,GAAA,cAAAA,EAAAvH,KAAAuH,EAAAtH,MAAA,KAAA,EAEoB,OAAhC2I,EAAa,IAAI5C,EAAS/H,GAAMsJ,EAAAtH,KAAA,EACzB2I,EAAWhL,IAAIwI,EAAKnI,EAAKyN,eAAgB1J,GAAK,KAAA,EAAA,OAAAuF,EAAAnH,OAAAmH,SAAAA,EAAA5G,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA4G,EAAAnG,OAAA,GAAAgG,EAC5D,KAAA,OAAAL,SAAAA,EAAAC,GAAA,OAAApF,EAAAtH,MAAAmD,KAAA/D,UAAA,CAAA,CANc,GAMduE,EAMD8N,GAAE,WAAA,IAAAtB,EAAAlM,EAAAC,IAAAC,MAAG,SAAAoJ,EACHzB,EACApE,GAAkB,IAAA4G,EAAA,OAAApK,IAAAsB,MAAA,SAAAiI,GAAA,cAAAA,EAAA/H,KAAA+H,EAAA9H,MAAA,KAAA,EAEoB,OAAhC2I,EAAa,IAAI5C,EAAS/H,GAAM8J,EAAA9H,KAAA,EACzB2I,EAAWhL,IAAIwI,EAAKnI,EAAK+N,MAAOhK,GAAK,KAAA,EAAA,OAAA+F,EAAA3H,OAAA2H,SAAAA,EAAApH,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAoH,EAAA3G,OAAA,GAAAyG,EACnD,KAAA,OAAAL,SAAAA,EAAAC,GAAA,OAAAgD,EAAAnQ,MAAAmD,KAAA/D,UAAA,CAAA,CANC,GAMDuE,CAzDD,CAAC,OAAAgJ,EAAAuE,EAAAvF,GAAA3I,EAAAkO,EAAA,CAAA,CAAA7N,IAAA,UAAAC,IAED,WACE,MAAA,cAAqB+H,mBAAmBlI,KAAKS,WAC/C,GAAC,CAAAP,IAAA,WAAAC,IAED,WACE,OAAUH,KAAKwO,QAAO,QACxB,GAAC,CAAAtO,IAAA,iBAAAC,IAED,WAAkB,IAAAoM,EAChB,OAAUvM,KAAKwO,QAAO,aAAyB,OAAzBjC,EAAYvM,KAAK8D,UAAQyI,EAAI,cAAY,QACjE,GAAC,CAAArM,IAAA,QAAAC,IAmCD,WACE,MAAA,cAAqB+H,mBAAmBlI,KAAKS,YAAW,WAC1D,IAAC,EApDgCH,GC3BdmO,WAAQjG,GAC3B,SAAAiG,EAAY1S,GAAc,IAAAyE,EA0BzB,OAzBCA,EAAAgI,EAAAC,KAAAzI,KAAMjE,IAAOiE,MAWf0O,aAAY,WAAA,IAAA5O,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACb0H,EACApE,GAAkB,IAAA4G,EAAA,OAAApK,IAAAsB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAEoB,OAAhC2I,EAAa,IAAI5C,EAAS/H,GAAM8B,EAAAK,OAAA,SAC/BwI,EAAWzC,KAAKC,EAAKnI,EAAKmO,WAAYpK,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAjC,EAAAqB,OAAA,GAAA1C,EACnD,KAAA,OAAA2C,SAAAA,EAAAwD,GAAA,OAAAtH,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CANW,GAMXuE,EAEDoO,UAAS,WAAA,IAAA/N,EAAAC,EAAAC,IAAAC,MAAG,SAAA6H,EACVF,EACApE,GAAkB,IAAA4G,EAAA,OAAApK,IAAAsB,MAAA,SAAAyG,GAAA,cAAAA,EAAAvG,KAAAuG,EAAAtG,MAAA,KAAA,EAEoB,OAAhC2I,EAAa,IAAI5C,EAAS/H,GAAMsI,EAAAnG,OAAA,SAC/BwI,EAAWhL,IAAIwI,EAAKnI,EAAKqO,UAAWtK,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAuE,EAAAnF,OAAA,GAAAkF,EACjD,KAAA,OAAAxB,SAAAA,EAAA0B,GAAA,OAAAlI,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CANQ,GAMRuE,CAxBD,CAAC,OAAAgJ,EAAAiF,EAAAjG,GAAA3I,EAAA4O,EAAA,CAAA,CAAAvO,IAAA,aAAAC,IACD,WACE,MAAA,cAAqB+H,mBAAmBlI,KAAKS,YAAW,UAC1D,GAAC,CAAAP,IAAA,YAAAC,IACD,WAAa,IAAAoM,EACX,MAAA,cAAqBrE,mBAAmBlI,KAAKS,YAAW,aACzC8L,OADyCA,EACtDvM,KAAK8D,UAAQyI,EAAI,aAErB,IAAC,EAXkCjM,qBCE/BwO,EAAY,WAQhB,SAAAA,EAAY/S,EAAgByH,GAAU,IAAAhD,EAAAR,KAAAA,KAPtC+O,UAAI,EAAA/O,KACJ8D,cAAQ,EAAA9D,KACRkE,YAAM,EAAAlE,KACNwD,QAAE,EAAAxD,KACFjE,YAAM,EAAAiE,KACNgP,WAAK,EAGH,IAAA7N,EAAuBrF,EAAOC,EAAQ,kBAA9BgB,EAAIoE,EAAJpE,KAAMT,EAAI6E,EAAJ7E,KACd0D,KAAKwD,GAAKA,EACV,IAAMyL,EAAUvL,EAAA,CACdwL,IAAK,EACLC,IAAK,GACLC,kBAAmB,KAChBrT,EAAOmD,IAEJmQ,EAA8BJ,EAA9BI,YAAgBC,EAAS7M,EAAKwM,EAAUvM,GAEhD3G,EAAOmD,GAAK+P,EACZjP,KAAKjE,OAASA,EACdO,EAAK0D,KAAKjE,QAEViE,KAAK+O,KCzBO,SAAmBA,EAAYhT,GAC7C,IAAAoF,EAAwBrF,EAAOC,EAAQ,UAA/BO,EAAI6E,EAAJ7E,KAAMa,EAAKgE,EAALhE,MACd,OAAO,IAAIoS,MAAYR,EAAM,CAC3B5O,IAAGA,SAACqP,EAAkBC,GACpB,GAAiB,UAAbA,EAAsB,CAEnB1T,EAAOmD,GAAGwQ,mBACR3T,EAAO2B,MAAS3B,EAAOiC,SAIhBjC,EAAOmD,GAAGyC,UACpBxE,EACE,8FALFA,EACE,mHAQN,IAAMwS,EAASH,EAAOC,GACtB,OAAO,WAAgC,IAAA,IAAAzT,EAAAC,UAAAC,OAAdQ,EAAcN,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAdK,EAAcL,GAAAJ,UAAAI,GAIrC,OAHAC,EAAIO,WAAIH,EAAAA,GAEOiT,EAAO9S,MAAMmD,KAAMtD,GAGtC,CACA,OAAO8S,EAAOC,EAChB,GAEJ,CDHgBG,CAAmB,IAAIC,EAAAA,KAAKP,GAAYtP,KAAKjE,QAE9B,mBAAhBsT,GACTtS,EACE,+EAKJiD,KAAK8P,eACL9P,KAAK+O,KAAKgB,GAAG,UAAS,WAAA,IAAAjQ,EAAAgB,EAAAC,IAAAC,MAAE,SAAAC,EAAO+O,GAAM,OAAAjP,IAAAsB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EACnClG,EAAK,kBAC4B2T,EAAgBlU,EACjDsT,CAAYW,GAAQ,SAACE,EAAKC,GACpBD,GACFC,EAAQC,SAEZ,IACA5P,EAAKsP,eAAe,KAAA,EAAA,IAAA,MAAA,OAAAxN,EAAAqB,OAAA,GAAA1C,EACrB,KAAA,OAAA,SAAA2C,GAAA,OAAA9D,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAC,CAToB,IAUtB+D,KAAK+O,KAAKgB,GAAG,QAAO,WAAA,IAAAlP,EAAAC,EAAAC,IAAAC,MAAE,SAAA6H,EAAOV,GAAC,OAAApH,IAAAsB,MAAA,SAAAyG,GAAA,cAAAA,EAAAvG,KAAAuG,EAAAtG,MAAA,KAAA,EAC5BlG,EAAK,cAAe6L,GAAG,KAAA,EAAA,IAAA,MAAA,OAAAW,EAAAnF,OAAA,GAAAkF,EACxB,KAAA,OAAA,SAAAzB,GAAA,OAAAvG,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAC,CAFkB,GAGtB,CAUC,OAVA6S,EAAAhK,UAEDgL,aAAA,WAAY,IAAAO,EAAArQ,KACNA,KAAKgP,OACPsB,aAAatQ,KAAKgP,OAEpBhP,KAAKgP,MAAQuB,WAAUzP,EAAAC,IAAAC,MAAC,SAAAmI,IAAA,OAAApI,IAAAsB,MAAA,SAAA+G,GAAA,cAAAA,EAAA7G,KAAA6G,EAAA5G,MAAA,KAAA,EAAA,OAAA4G,EAAA5G,KAAA,EAChB6N,EAAKtB,KAAKyB,MAAK,KAAA,ERFzB9L,EAAQK,QAAQpF,EAAO8Q,UQGTJ,EAAK7M,IAAI,KAAA,EAAA,IAAA,MAAA,OAAA4F,EAAAzF,OAAA,GAAAwF,EACpB,KAAEnJ,KAAKjE,OAAOmD,GAAGkQ,oBACnBN,CAAA,CAxDe,GA6DlB,SAASmB,EAAgBlU,GACvB,IAAA2U,EAAuB5U,EAAOC,EAAQ,iBAA9BgB,EAAI2T,EAAJ3T,KAAMT,EAAIoU,EAAJpU,KACd,OAAO,SAACqU,EAAMtL,GAMZ,GALAsL,EAAKZ,GAAG,SAAS,SAAsB5S,GACrCJ,EAAK,sCAAuCI,GAC5CkI,EAAKlI,EAAOwT,EACd,IAEI5U,EAAO+H,SAAU,CACnB,IAAM8M,EAAQ,CAAA,yBAA0B7U,EAAO+H,SAAY,KACvD/H,EAAOmI,SACJnI,EAAO+H,UACV/G,EAAK,0DAEP6T,EAAMpL,KAAI,uBAAwBzJ,EAAOmI,aAI3CyM,EAAKC,MAAMA,EAAMlK,KAAK,MAAM,SAAUwJ,GAChCnU,EAAO+H,UACTxH,EAAK,cAAeP,EAAO+H,UAEzB/H,EAAOmI,QACT5H,EAAK,YAAaP,EAAOmI,QAE3BmB,EAAK6K,EAAKS,EACZ,GACF,CACAtL,EAAK,KAAMsL,GAEf,CE9F0C,IAErBE,EAAS,WAe5B,SAAAA,EAAY9U,GAAoB,IAAAyE,EAAAR,KAAAA,KAdhC8Q,iBAAW,EAeT,IAAQxU,EAASR,EAAOC,EAAQ,eAAxBO,KACR0D,KAAK8Q,YAAc,IAAIC,IAEvB,IV8B2BC,EU9BrBxN,EAAKxD,KAAKiR,SAChB3U,EAAK,cAAekH,GACpBxD,KAAK8Q,YAAY1Q,IAAIoD,EAAI,IAAIsL,EAAa,IAAIxO,EAAOvE,GAASyH,IV4BnCwN,EU3BZ,SAACxN,GACVA,GAAMhD,EAAKsQ,YAAYI,IAAI1N,IAC7BhD,EAAKsQ,YAAkB,OAACtN,EAE5B,EVwBFkB,EAAQa,UAAU5F,EAAO8Q,UAAWO,EUvBpC,CAAC,IAAAnM,EAAAgM,EAAA/L,UAgBA,OAhBAD,EAxBOoM,OAAA,SACNnN,EACAI,GAEA,OAAIJ,GAAYI,EACJJ,MAAYI,EAEpBJ,EACF,GAAUA,EAEL,QACRe,EAeDsM,cAAA,SAAcpV,GACZ,IAAQO,EAASR,EAAOC,EAAQ,eAAxBO,KACFkH,EAAKxD,KAAKiR,OAAOlV,EAAO+H,SAAU/H,EAAOmI,QACzCkN,EAAWpR,KAAK8Q,YAAY3Q,IAAIqD,GAEtC,GADAlH,EAAK,kBAAmB0D,KAAK8Q,YAAYO,MACrCD,EAEF,OADA9U,EAAK,qBAAsBkH,GACpB4N,EAASrC,KAElB,IAAMuC,EAAS,IAAIxC,EAAa,IAAIxO,EAAOvE,GAASyH,GAIpD,OAHAxD,KAAK8Q,YAAY1Q,IAAIoD,EAAI8N,GACzBhV,EAAK,cAAekH,GACpBlH,EAAK,kBAAmB0D,KAAK8Q,YAAYO,MAClCC,EAAOvC,MACf8B,CAAA,CA3C2B,GCFjBU,EAAe,SAACxV,GAC3B,OAAOyV,OAAOC,KAAKjH,KAAKC,UAAU1O,GAAS,UAAU2V,UACvD,ECQMnN,EAAO,SAACxI,GAIZ,MAAO,CACL4V,KAJW,IAAI1G,EAAKlP,GAKpB6V,MAJY,IAAI7D,EAAMhS,GAKtBwP,QAJc,IAAIkD,EAAQ1S,GAM9B,EAEa8V,EAAM,WAMjB,SAAAA,EAAY9V,GAAqB,IAAAyE,EAAAR,KAAAA,KALjCjE,YAAM,EAAAiE,KACN1B,SAAG,EAAA0B,KACK8R,aAAO,EAAA9R,KACP+R,aAAO,EAGb/R,KAAKjE,OAAS,IAAIuE,EAAOvE,GACzBiE,KAAK+R,QAAU,IAAIhB,IACnB/Q,KAAK1B,IAAMiG,EAAKvE,KAAKjE,QACrBiE,KAAK8R,QAAU,IAAIE,EAAUhS,KAAKjE,QZMpC2I,EAAQa,UAAU5F,EAAO+F,QYJT,SAAC5B,GACbtD,EAAKsD,SAAWA,CAClB,IZQwCY,EAAQa,UAAU5F,EAAOiG,MYNrD,SAAC1B,GACX1D,EAAK0D,OAASA,CAChB,IZUuCQ,EAAQa,UAAU5F,EAAOoG,OYRrD,SAACxH,GACViC,EAAKjC,MAAQA,CACf,GACF,CAAC,IAAAsG,EAAAgN,EAAA/M,UAyGA,OAzGAD,EAEDoN,UAAA,SAAUzU,GACRwC,KAAKjE,OAAS,IAAIuE,EAAO9C,IAC1BqH,EAEKN,KAAI,WAAA,IAAA2N,EAAApR,EAAAC,IAAAC,MAAV,SAAAC,EAAWzD,GAAY,IAAA2U,EAAA,OAAApR,IAAAsB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAAA,OAAAF,EAAAE,KAAA,EACOxC,KAAKjE,OAAO6E,UAAS8C,EAC5C,CAAA,EAAA1D,KAAKjE,OACLyB,IACH,KAAA,EAG6B,OAF/BwC,KAAKiS,UAJCE,EAAa7P,EAAAY,MAKnBlD,KAAK8R,QAAU,IAAIE,EAAUhS,KAAKjE,QAClCiE,KAAK1B,IAAMiG,EAAK4N,GAAe7P,EAAAK,OAAA,SACxB3C,MAAI,KAAA,EAAA,IAAA,MAAA,OAAAsC,EAAAqB,OAAA,GAAA1C,EAAAjB,KACZ,KAAA,OAAA,SAAA4D,GAAA,OAAAsO,EAAArV,MAAAmD,KAAA/D,UAAA,CAAA,CATS,GAsEV4I,EAMAuN,YAAA,SAAYrW,GACV,IAAMsW,EAAO3O,EAAA,CAAA,EAAQ1D,KAAKjE,OAAWA,GAC/BuW,EDpIiB,SAACvW,GAC1B,IAAMyB,EAAM,IAAI8C,EAAOvE,GACvB,OAAOwV,EAAa/T,EACtB,CCiIqB+U,CAAYF,GAE7B,GAAIC,IADoBf,EAAavR,KAAKjE,QAExC,OAAOiE,KAET,IAAMoR,EAAWpR,KAAK+R,QAAQ5R,IAAImS,GAElC,GAAIlB,EAAU,CAEZ,IAAMe,EAAgB,IAAI7R,EAAO+R,GAOjC,OANAjB,EAASa,UAAUE,GAEnBf,EAAStN,SAAWqO,EAAcrO,SAClCsN,EAASlN,OAASiO,EAAcjO,OAChCkN,EAAS7S,MAAQ4T,EAAc7T,IAAIC,MACnC6S,EAAS3Q,WAAa0R,EAAc1R,WAC7B2Q,CACT,CAGA,OADApR,KAAK+R,QAAQ3R,IAAIkS,EAAU,IAAIT,EAAOQ,IAC/BrS,KAAK+R,QAAQ5R,IAAImS,IACzBzS,EAAAgS,EAAA,CAAA,CAAA3R,IAAA,aAAAE,IAxFD,SAAe0F,GACTA,IACF9F,KAAKjE,OAAO0E,WAAaqF,EACzB9F,KAAK1B,IAAIqT,KAAKlR,WAAaqF,EAC3B9F,KAAK1B,IAAIsT,MAAMnR,WAAaqF,EAC5B9F,KAAK1B,IAAIiN,QAAQ9K,WAAaqF,EAElC,GAAC,CAAA5F,IAAA,SAAAC,IAED,WACE,OAAOH,KAAKjE,OAAOmI,MACpB,EAAA9D,IAED,SAAW8D,GACTlE,KAAKS,WAAaT,KAAKjE,OAAO0E,WAE9BT,KAAKjE,OAAOmI,OAASA,EAEjBlE,KAAK1B,MACP0B,KAAK1B,IAAIqT,KAAKzN,OAASlE,KAAKjE,OAAOmI,OACnClE,KAAK1B,IAAIsT,MAAM1N,OAASlE,KAAKjE,OAAOmI,OACpClE,KAAK1B,IAAIiN,QAAQrH,OAASlE,KAAKjE,OAAOmI,OAE1C,GAAC,CAAAhE,IAAA,WAAAC,IAED,WACE,OAAOH,KAAKjE,OAAO+H,QACpB,EAAA1D,IAED,SAAa0D,GACX9D,KAAKS,WAAaT,KAAKjE,OAAO0E,WAC9BT,KAAKjE,OAAO+H,SAAWA,EAEnB9D,KAAK1B,MACP0B,KAAK1B,IAAIqT,KAAK7N,SAAWA,EACzB9D,KAAK1B,IAAIsT,MAAM9N,SAAWA,EAC1B9D,KAAK1B,IAAIiN,QAAQzH,SAAWA,EAEhC,GAAC,CAAA5D,IAAA,QAAAC,IAED,WAAS,IAAAqS,EACP,OAAkBA,OAAlBA,EAAOxS,KAAKjE,SAALyW,OAAWA,EAAXA,EAAalU,UAAbkU,EAAAA,EAAkBjU,KAC1B,EAAA6B,IAED,SAAU7B,GACJA,IACFyB,KAAKjE,OAAOuC,IAAIC,MAAQA,EACpByB,KAAK1B,MACP0B,KAAK1B,IAAIqT,KAAKrT,IAAIC,MAAQA,EAC1ByB,KAAK1B,IAAIsT,MAAMtT,IAAIC,MAAQA,EAC3ByB,KAAK1B,IAAIiN,QAAQjN,IAAIC,MAAQA,GAGnC,GAAC,CAAA2B,IAAA,KAAAC,IACD,WAEE,OAAOH,KAAK8R,QAAQX,cAAcnR,KAAKjE,OACzC,IAAC,CAjGgB,GAmIG0W,SAAAA,EAAMrL,GAAA,OAAAsL,EAAA7V,MAAAmD,KAAA/D,UAAA,CAG3B,SAAAyW,IAAA,OAAAA,EAAA5R,EAAAC,IAAAC,MAHM,SAAA6H,EAAsB9M,GAAqB,IAAA4W,EAAA,OAAA5R,IAAAsB,MAAA,SAAAyG,GAAA,cAAAA,EAAAvG,KAAAuG,EAAAtG,MAAA,KAAA,EACf,OAA3BmQ,EAAS,IAAId,EAAO9V,GAAO+M,EAAAtG,KAAA,EACpBmQ,EAAOpO,OAAM,KAAA,EAAA,OAAAuE,EAAAnG,OAAAmG,SAAAA,EAAA5F,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA4F,EAAAnF,OAAA,GAAAkF,EAC3B,MAAAhM,MAAAmD,KAAA/D,UAAA,CC3JD2W,OAAOC,QAAUJ"}
@@ -615,6 +615,8 @@ var logProtector = function logProtector(logger) {
615
615
  return process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test' ? logger : null;
616
616
  };
617
617
 
618
+ var _excluded$1 = ["host", "port"],
619
+ _excluded2 = ["host", "port"];
618
620
  var ApiConfig = /*#__PURE__*/function () {
619
621
  function ApiConfig(_ref) {
620
622
  var basePath = _ref.basePath,
@@ -640,6 +642,7 @@ var ApiConfig = /*#__PURE__*/function () {
640
642
  var Config = /*#__PURE__*/function () {
641
643
  function Config(_config) {
642
644
  var _this = this,
645
+ _config$db2,
643
646
  _config$api$cookieKey2,
644
647
  _config$api2;
645
648
  this.user = void 0;
@@ -653,25 +656,26 @@ var Config = /*#__PURE__*/function () {
653
656
  this._userId = void 0;
654
657
  this.configure = /*#__PURE__*/function () {
655
658
  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(config) {
656
- var _config$api$cookieKey, _config$api;
657
- var envVarConfig, host, _Logger, info, error, basePath, port, databaseName, url, res, database, possibleError, json, message, _database, apiHost, dbHost, name, id, dburl, apiurl;
659
+ var _config$db, _config$api$cookieKey, _config$api;
660
+ var _Logger, info, error, envVarConfig, _ref3, host, port, dbConfig, configuredHost, configuredPort, basePath, databaseName, url, res, database, possibleError, json, message, _database, apiHost, dbHost, name, id, dburl, apiurl;
658
661
  return _regeneratorRuntime().wrap(function _callee$(_context) {
659
662
  while (1) switch (_context.prev = _context.next) {
660
663
  case 0:
664
+ _Logger = Logger(config, '[init]'), info = _Logger.info, error = _Logger.error;
661
665
  envVarConfig = {
662
666
  config: config
663
667
  };
664
- host = getDbHost(envVarConfig);
665
- _Logger = Logger(config, '[init]'), info = _Logger.info, error = _Logger.error;
666
- if (!(host && _this.databaseName && _this.databaseId)) {
667
- _context.next = 6;
668
+ _ref3 = (_config$db = config.db) != null ? _config$db : {}, host = _ref3.host, port = _ref3.port, dbConfig = _objectWithoutPropertiesLoose(_ref3, _excluded$1);
669
+ configuredHost = host != null ? host : getDbHost(envVarConfig);
670
+ configuredPort = port != null ? port : getDbPort(envVarConfig);
671
+ if (!(configuredHost && _this.databaseName && _this.databaseId)) {
672
+ _context.next = 8;
668
673
  break;
669
674
  }
670
675
  info('Alreaady configured, aborting fetch');
671
676
  return _context.abrupt("return", _this);
672
- case 6:
677
+ case 8:
673
678
  basePath = getBasePath(envVarConfig);
674
- port = getDbPort(envVarConfig);
675
679
  databaseName = getDatabaseName({
676
680
  config: config,
677
681
  logger: 'getInfo'
@@ -681,7 +685,7 @@ var Config = /*#__PURE__*/function () {
681
685
  url.searchParams.set('databaseName', databaseName);
682
686
  }
683
687
  info(url.href);
684
- _context.next = 14;
688
+ _context.next = 15;
685
689
  return fetch(url, {
686
690
  headers: {
687
691
  Authorization: "Bearer " + getInfoBearer({
@@ -689,13 +693,13 @@ var Config = /*#__PURE__*/function () {
689
693
  })
690
694
  }
691
695
  });
692
- case 14:
696
+ case 15:
693
697
  res = _context.sent;
694
698
  possibleError = res.clone();
695
- _context.prev = 16;
696
- _context.next = 19;
699
+ _context.prev = 17;
700
+ _context.next = 20;
697
701
  return res.json();
698
- case 19:
702
+ case 20:
699
703
  json = _context.sent;
700
704
  if (res.status === 404) {
701
705
  info('is the configured databaseName correct?');
@@ -707,48 +711,48 @@ var Config = /*#__PURE__*/function () {
707
711
  } else {
708
712
  database = json;
709
713
  }
710
- _context.next = 31;
714
+ _context.next = 32;
711
715
  break;
712
- case 24:
713
- _context.prev = 24;
714
- _context.t0 = _context["catch"](16);
715
- _context.next = 28;
716
+ case 25:
717
+ _context.prev = 25;
718
+ _context.t0 = _context["catch"](17);
719
+ _context.next = 29;
716
720
  return possibleError.text();
717
- case 28:
721
+ case 29:
718
722
  message = _context.sent;
719
723
  error(message);
720
724
  database = {
721
725
  message: message
722
726
  };
723
- case 31:
727
+ case 32:
724
728
  info('[fetched database]', database);
725
729
  if (!(process.env.NODE_ENV !== 'TEST')) {
726
- _context.next = 41;
730
+ _context.next = 42;
727
731
  break;
728
732
  }
729
733
  if (!('message' in database)) {
730
- _context.next = 40;
734
+ _context.next = 41;
731
735
  break;
732
736
  }
733
737
  if (!('statusCode' in database)) {
734
- _context.next = 39;
738
+ _context.next = 40;
735
739
  break;
736
740
  }
737
741
  error(database);
738
742
  throw new Error('HTTP error has occured');
739
- case 39:
740
- throw new Error('Unable to auto-configure. Please set or remove NILEDB_API, NILEDB_NAME, and NILEDB_HOST in your .env file.');
741
743
  case 40:
744
+ throw new Error('Unable to auto-configure. Please set or remove NILEDB_API, NILEDB_NAME, and NILEDB_HOST in your .env file.');
745
+ case 41:
742
746
  if (typeof database === 'object') {
743
747
  _database = database, apiHost = _database.apiHost, dbHost = _database.dbHost, name = _database.name, id = _database.id;
744
748
  _this.databaseId = id;
745
749
  _this.databaseName = name;
746
750
  dburl = new URL(dbHost);
747
751
  apiurl = new URL(apiHost);
748
- host = dburl.host;
752
+ configuredHost = dburl.host;
749
753
  basePath = apiurl.origin;
750
754
  }
751
- case 41:
755
+ case 42:
752
756
  _this.api = new ApiConfig({
753
757
  basePath: basePath,
754
758
  cookieKey: (_config$api$cookieKey = config == null || (_config$api = config.api) == null ? void 0 : _config$api.cookieKey) != null ? _config$api$cookieKey : 'token',
@@ -759,17 +763,17 @@ var Config = /*#__PURE__*/function () {
759
763
  _this.db = _extends({
760
764
  user: _this.user,
761
765
  password: _this.password,
762
- host: host,
763
- port: port,
766
+ host: configuredHost,
767
+ port: configuredPort,
764
768
  database: _this.databaseName
765
- }, typeof (config == null ? void 0 : config.db) === 'object' ? config.db : {});
769
+ }, dbConfig);
766
770
  info('[config set]', _this);
767
771
  return _context.abrupt("return", _this);
768
- case 45:
772
+ case 46:
769
773
  case "end":
770
774
  return _context.stop();
771
775
  }
772
- }, _callee, null, [[16, 24]]);
776
+ }, _callee, null, [[17, 25]]);
773
777
  }));
774
778
  return function (_x) {
775
779
  return _ref2.apply(this, arguments);
@@ -786,8 +790,12 @@ var Config = /*#__PURE__*/function () {
786
790
  this.debug = Boolean(_config == null ? void 0 : _config.debug);
787
791
  this._userId = _config == null ? void 0 : _config.userId;
788
792
  var _basePath = getBasePath(_envVarConfig);
789
- var _host = getDbHost(_envVarConfig);
790
- var _port = getDbPort(_envVarConfig);
793
+ var _ref4 = (_config$db2 = _config == null ? void 0 : _config.db) != null ? _config$db2 : {},
794
+ _host = _ref4.host,
795
+ _port = _ref4.port,
796
+ _dbConfig = _objectWithoutPropertiesLoose(_ref4, _excluded2);
797
+ var _configuredHost = _host != null ? _host : getDbHost(_envVarConfig);
798
+ var _configuredPort = _port != null ? _port : getDbPort(_envVarConfig);
791
799
  this.api = new ApiConfig({
792
800
  basePath: _basePath,
793
801
  cookieKey: (_config$api$cookieKey2 = _config == null || (_config$api2 = _config.api) == null ? void 0 : _config$api2.cookieKey) != null ? _config$api$cookieKey2 : 'token',
@@ -798,9 +806,9 @@ var Config = /*#__PURE__*/function () {
798
806
  this.db = _extends({
799
807
  user: this.user,
800
808
  password: this.password,
801
- host: _host,
802
- port: _port
803
- }, typeof (_config == null ? void 0 : _config.db) === 'object' ? _config.db : {});
809
+ host: _configuredHost,
810
+ port: _configuredPort
811
+ }, _dbConfig);
804
812
  if (this.databaseName) {
805
813
  this.db.database = this.databaseName;
806
814
  }