@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.
- package/dist/server.cjs.development.js +44 -36
- package/dist/server.cjs.development.js.map +1 -1
- package/dist/server.cjs.production.min.js +1 -1
- package/dist/server.cjs.production.min.js.map +1 -1
- package/dist/server.esm.js +45 -37
- package/dist/server.esm.js.map +1 -1
- package/dist/utils/Config/index.d.ts +1 -1
- package/package.json +2 -2
|
@@ -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":"okRAIwB,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,CCjImB,ICbdkC,EDuBCC,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,WA6DhB,OAAAT,GA9BD,SAAY9D,GAAoB,IAAAwE,EAAAnC,EAAAoC,EAAAR,KAAAA,KA9BhCtC,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,KAkDfY,UAAS,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,MAAG,SAAAC,EAAOlF,GAAoB,IAAAmF,EAAA/C,EAAAgD,EAAAhC,EAAAiC,EAAA9E,EAAAa,EAAA4B,EAAAS,EAAAd,EAAA2C,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAjB,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAKlB,GADfjD,EAAOF,EAHLkC,EAA0B,CAC9BpF,OAAAA,IAEgCqF,EACVtF,EAAOC,EAAQ,UAA/BO,EAAI8E,EAAJ9E,KAAMa,EAAKiE,EAALjE,QAEVgC,GAAQqB,EAAK9B,cAAgB8B,EAAKC,YAAU,CAAAyB,EAAAE,KAAA,EAAA,KAAA,CACF,OAA5C9F,EAAK,uCAAuC4F,EAAAG,OAAA,SACrC7B,GAAI,KAAA,EAWE,OARXzB,EAAWH,EAAYuC,GACrB3B,EAAOH,EAAU8B,GAEjBzC,EAAeD,EAAgB,CAAE1C,OAAAA,EAAQ0B,OAAQ,YACjD4D,EAAM,IAAIiB,IAAOvD,0BACnBL,GACF2C,EAAIkB,aAAanC,IAAI,eAAgB1B,GAEvCpC,EAAK+E,EAAImB,MAAMN,EAAAE,KAAA,GACGK,MAAMpB,EAAK,CAC3BqB,QAAS,CACPC,cAAa,WD5FSnF,EC4FiB,CAAEzB,OAAAA,GD3FrCwB,EAAYC,OAAQO,EAAYP,OC6FtC,KAAA,GAE+B,OAA3BgE,GANAF,EAAGY,EAAAU,MAMiBC,QAAOX,EAAAC,KAAA,GAAAD,EAAAE,KAAA,GAEFd,EAAIG,OAAM,KAAA,GAAjCA,EAAIS,EAAAU,KACS,MAAftB,EAAIwB,QACNxG,EAAK,2CAGLiF,EADEE,EAAKqB,QAA0B,UAAhBrB,EAAKqB,OACX,CAAEpB,QAAS,6BAEXD,EACZS,EAAAE,KAAA,GAAA,MAAA,KAAA,GAAA,OAAAF,EAAAC,KAAA,GAAAD,EAAAa,GAAAb,EAAA,MAAA,IAAAA,EAAAE,KAAA,GAEqBZ,EAAcwB,OAAM,KAAA,GAC1C7F,EADMuE,EAAOQ,EAAAU,MAEbrB,EAAW,CAAEG,QAAAA,GAAsB,KAAA,GAGF,GADnCpF,EAAK,qBAAsBiF,KAErB,YAAaA,GAAQ,CAAAW,EAAAE,KAAA,GAAA,KAAA,CAAA,KACnB,eAAgBb,GAAQ,CAAAW,EAAAE,KAAA,GAAA,KAAA,CACV,MAAhBjF,EAAMoE,GACA,IAAI0B,MAAM,0BAAyB,KAAA,GAAA,MAEnC,IAAIA,MACR,8GACD,KAAA,GAGmB,iBAAb1B,IACDK,GADwBD,EACMJ,GAA9BK,QAASC,EAAMF,EAANE,OAAQC,EAAIH,EAAJG,KACzBtB,EAAKC,WAD4BkB,EAAFuB,GAE/B1C,EAAK9B,aAAeoD,EACdC,EAAQ,IAAIO,IAAIT,GAChBG,EAAS,IAAIM,IAAIV,GACvBzC,EAAO4C,EAAM5C,KACbJ,EAAWiD,EAAOmB,QACnB,KAAA,GAewB,OAb3B3C,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,GAAEkE,EAAA,CACL1F,KAAM8C,EAAK9C,KACXM,SAAUwC,EAAKxC,SACfmB,KAAAA,EACAK,KAAAA,EACA+B,SAAUf,EAAK9B,cACW,iBAAf3C,MAAAA,OAAAA,EAAAA,EAAQmD,IAAkBnD,EAAOmD,GAAK,CAAE,GAErD5C,EAAK,eAAgBkE,GAAM0B,EAAAG,OAAA,SACpB7B,GAAI,KAAA,GAAA,IAAA,MAAA,OAAA0B,EAAAmB,ODpJc,IAAC7F,CCoJf,GAAAyD,EAAA,KAAA,CAAA,CAAA,GAAA,KACZ,KAAA,OAAA,SAAAqC,GAAA,OAAAzC,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CAhFQ,GA/BP,ID3EyBuB,EACnBzB,EAAQ0B,EAERnB,ECwEA6E,EAA0B,CAAEpF,OAAAA,GAElCiE,KAAKS,YD5EShD,GADWD,EC6EM2D,GD5EjB1D,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,IAAI0F,WACnC3F,QAAQC,IAAI0F,YCqEjBvD,KAAKtC,KAAOH,EAAY4D,GACxBnB,KAAKhC,SAAWD,EAAYoD,GAC5BnB,KAAKtB,aAAeD,EAAgB0C,GACpCnB,KAAKU,UDZkB,SAAClD,GAC1B,IAAQzB,EAAmByB,EAAnBzB,OAAQ0B,EAAWD,EAAXC,OACRnB,EAASR,EAAOC,EAAQ,cAAxBO,KACR,OAAU,MAANP,GAAAA,EAAQyH,UACV/F,GAAUnB,EAAKmB,EAAQ,SAAU1B,EAAOyH,UACjCzH,EAAOyH,UAGZ5F,QAAQC,IAAI4F,eACdhG,GAAUnB,EAAKmB,EAAQ,OAAQG,QAAQC,IAAI4F,eACpC7F,QAAQC,IAAI4F,eAGd,IACT,CCFqBC,CAAYvC,GAC7BnB,KAAKzD,MAAQoH,QAAQ5H,MAAAA,OAAAA,EAAAA,EAAQQ,OAC7ByD,KAAKW,QAAU5E,MAAAA,OAAAA,EAAAA,EAAQ6H,OAEvB,IAAM7E,EAAWH,EAAYuC,GACvBhC,EAAOF,EAAUkC,GACjB3B,EAAOH,EAAU8B,GAEvBnB,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,GAAEkE,EAAA,CACL1F,KAAMsC,KAAKtC,KACXM,SAAUgC,KAAKhC,SACfmB,KAAAA,EACAK,KAAAA,GAC0B,iBAAfzD,MAAAA,OAAAA,EAAAA,EAAQmD,IAAkBnD,EAAOmD,GAAK,CAAE,GAEjDc,KAAKtB,eACPsB,KAAKd,GAAGqC,SAAWvB,KAAKtB,aAE5B,GAAC,CAAA,CAAAwB,IAAA,WAAAC,IA9CD,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,GEpDNwD,EAEX,SAAYC,EAAwBC,GAAmB/D,KADvDgE,cAAQ,EAENhE,KAAKgE,SAAW,IAAIC,SAASH,EAAMC,EACrC,GDFF,SAAKpE,GACHA,EAAA,KAAA,SACAA,EAAA,OAAA,WACAA,EAAA,MAAA,QACAA,EAAA,UAAA,WACD,CALD,CAAKA,IAAAA,EAKJ,CAAA,IAAA,IA8BKuE,EAAU,IA7BH,WAEX,SAAAC,IAAAnE,KADAoE,YAAM,EAEJpE,KAAKoE,OAAS,EAChB,CAAC,IAAAC,EAAAF,EAAAG,UAqBA,OArBAD,EACDE,QAAA,SAAQC,EAAmBnE,GAEzB,IAAMoE,EAAezE,KAAKoE,OAAOI,GAGjC,GAAIC,EACF,IAAA,IAAmCC,EAAnCC,EAAAC,EAAuBH,KAAYC,EAAAC,KAAAE,OACjCC,EADiBJ,EAAArE,OACRA,EAGf,EACAgE,EACAU,UAAA,SAAUP,EAAmBM,GAEtB9E,KAAKoE,OAAOI,KACfxE,KAAKoE,OAAOI,GAAa,IAI3BxE,KAAKoE,OAAOI,GAAWQ,KAAKF,IAC7BX,CAAA,CAzBU,IA+BAc,EAAiB,SAACzB,GAC7BU,EAAQK,QAAQ5E,EAAOuF,OAAQ1B,EACjC,EAKa2B,EAAe,SAACvB,GAC3BM,EAAQK,QAAQ5E,EAAOyF,KAAMxB,EAC/B,EAIayB,EAAc,SAACC,GAC1BpB,EAAQK,QAAQ5E,EAAO4F,MAAOD,EAChC,EE7CaE,EAAgB,kBAChBC,EAAiB,gBAc9B,SAASC,EAAmBhD,EAAkB3C,GAAwB,IAAA4F,EAC9DC,SAAMD,EAAGjD,EAAQvC,IAAI,kBAAZwF,EAAuBE,MAAM,MACtCC,EAAmC,CAAA,EACzC,GAAIF,EACF,IAAA,IAA0BlB,EAA1BC,EAAAC,EAAoBgB,KAAMlB,EAAAC,KAAAE,MAAE,CAAA,IACpBkB,EADQrB,EAAArE,MACYwF,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,EAAA9F,MACYwF,MAAM,KAC1BG,EAAUD,EAAYE,MAAM,GAAGC,KAAK,KAE1CJ,EADaC,EAAY,IACRC,CACnB,CAEF,OAAIjG,EACK+F,EAAS/F,GAEX,IACT,CACgB,SAAAsG,EAAkB3D,EAAkB3G,GAAc,IAAA+D,EAC1DwG,EAAeZ,EAAmBhD,EAAS,YACjD,OAAkD,OAAlD5C,QAAOwG,EAAAA,EAAgB5D,MAAAA,OAAAA,EAAAA,EAASvC,IAAIqF,IAAc1F,EAAI/D,EAAOyH,QAC/D,CAEgB,SAAA+C,EAAgB7D,EAAkB3G,GAAc,IAAAyK,EACxDjI,EAAQmH,EAAmBhD,EAAS3G,EAAOuC,IAAIyB,WACrD,OAAIxB,EACUkI,YAAUlI,GACXmI,IAEsBF,OAAnCA,EAAc,MAAP9D,OAAO,EAAPA,EAASvC,IAAIsF,IAAee,EAAIzK,EAAO6H,MAChD,CAEA,SAAsB+C,EAAMrD,EAAAsD,EAAAC,GAAA,OAAAC,EAAAjK,MAAAmD,KAAA/D,UAAA,CAwG3B,SAAA6K,IAAA,OAAAA,EAAAhG,EAAAC,IAAAC,MAxGM,SAAAC,EACLlF,EACAgL,EACAC,GAAkB,IAAA7I,EAAAC,EAAA6I,EAAA7F,EAAA9E,EAAAa,EAAAkE,EAAAtB,EAAA2C,EAAAwE,EAAA3I,EAAAiF,EAAAI,EAAAuD,EAAAnD,EAAA1C,EAAA8F,EAAAC,EAAA3F,EAAA4F,EAAA,OAAAvG,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAsBG,GAtBHhB,EAEMtF,EAAOC,EAAQ,YAA/BO,EAAI8E,EAAJ9E,KAAMa,EAAKiE,EAALjE,MAERkE,EAAG,IAAgB,OAAhBlD,EAAMpC,EAAOuC,UAAG,EAAVH,EAAYY,UAAWgI,EAChChH,EAAsB,OAAb3B,EAAGrC,EAAOuC,UAAG,EAAVF,EAAY2B,UACxB2C,EAAU,IAAI6E,QAAQP,MAAAA,OAAAA,EAAAA,EAAMtE,UAC5BwE,EAAe,IAAIK,SACZnH,IAAI,eAAgB,mCACdsC,EAAQvC,IAAI,oBAEvB5B,EAAQmH,EAAmBhD,EAAS3C,IAExCmH,EAAa9G,IAAI,gBAAe,UAAY7B,GACnCL,EAAS,CAAEnC,OAAAA,KACpBmL,EAAa9G,IAAI,gBAAe,UAAYlC,EAAS,CAAEnC,OAAAA,MAIrDyH,EAAW6C,EAAkB3D,EAAS3G,GAC5CkJ,EAAezB,GACTI,EAAS2C,EAAgB7D,EAAS3G,GACxCoJ,EAAavB,IACTvC,EAAImG,SAAS,eAAkBhE,EAAQ,CAAAtB,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAG,OAAA,SAClC,IAAIwB,EAAc,kCAAmC,CAC1Df,OAAQ,OACR,KAAA,GAMwB,OAJtBqE,EAAa9F,EAChBoG,QAAQ,aAAcC,mBAAmB/J,OAAO6F,KAChDiE,QAAQ,WAAYC,mBAAmB/J,OAAOiG,KAEjDtH,EAAK,UAAW6K,GAAYjF,EAAAE,KAAA,GAELK,MAAM0E,EAAU/D,KAClC4D,EAAI,CACPtE,QAASwE,KACT,OAAO,SAACS,GACRxK,EAAM,UAAW,aAAcwK,EACjC,IAAE,KAAA,GALY,MAAR3D,EAAQ9B,EAAAU,OAOEoB,EAASlB,QAAU,KAAOkB,EAASlB,OAAS,KAAG,CAAAZ,EAAAE,KAAA,GAAA,KAAA,CAAA,GAC/B,mBAAnB4B,EAASnB,MAAoB,CAAAX,EAAAE,KAAA,GAAA,KAAA,CAClC,OADkCF,EAAAa,GACtCzG,EAAI4F,EAAAE,KAAA,GAAgC4B,EAASnB,QAAQpB,OAAM,KAAA,GAAAS,EAAA0F,GAAA1F,EAAAU,MAAA,EAAAV,EAAAa,IAAtD,UAAW,aAAYb,EAAA0F,IAAA,KAAA,GAAA,OAAA1F,EAAAG,OAAA,SAEvB2B,GAAQ,KAAA,GAML,OAFNoD,EACuB,mBAApBpD,MAAAA,OAAAA,EAAAA,EAAUnB,OAAuBmB,EAASnB,QAAU,KACzDwE,EAAM,GAAEnF,EAAAC,KAAA,GAAAD,EAAAE,KAAA,GAEG4B,MAAAA,OAAAA,EAAAA,EAAuBvC,OAAM,KAAA,GAA1CH,EAAGY,EAAAU,KAAAV,EAAAE,KAAA,GAAA,MAAA,KAAA,GAAA,GAAAF,EAAAC,KAAA,GAAAD,EAAA2F,GAAA3F,EAAA,MAAA,KAECkF,EAAY,CAAAlF,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,GACFgF,EAAapE,OAAM,KAAA,IAA/BqE,EAAGnF,EAAAU,OAEDzF,EAAM,UAAW,aAAY,YAAciK,EAAatE,OAAWuE,IAAAA,GACpE,KAAA,GAEEA,GACHlK,EAAM,UAAW,aAAY+E,EAAA2F,IAC9B,KAAA,GAAA,IAECR,EAAG,CAAAnF,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAG,OAAA,SACE,IAAIwB,EAAcwD,EAAK,CAAEvE,OAAQsE,MAAAA,OAAAA,EAAAA,EAActE,UAAS,KAAA,GAAA,IAG7DxB,KAAO,YAAaA,GAAG,CAAAY,EAAAE,KAAA,GAAA,KAAA,CAOvB,OALFjF,EACE,UACA,aACYiK,aAAAA,MAAAA,OAAAA,EAAAA,EAActE,QAC1BpB,IALMA,EAAYJ,EAAZI,SAMNQ,EAAAG,OAAA,SACK,IAAIwB,EAAcnC,EAAS,CAAEoB,OAAQ,OAAM,KAAA,GAAA,IAEhDxB,KAAO,WAAYA,GAAG,CAAAY,EAAAE,KAAA,GAAA,KAAA,CAStB,OALFjF,EACE,UACA,aACYiK,aAAAA,MAAAA,OAAAA,EAAAA,EAActE,QAC1BpB,IANSA,EACPJ,EADFwG,OAAgB,IAOhB5F,EAAAG,OAAA,SACK,IAAIwB,EAAcnC,EAAS,CAAEoB,OAAQ,OAAM,KAAA,GAQlD,OALF3F,EACE,UACA,aACYiK,aAAAA,MAAAA,OAAAA,EAAAA,EAActE,QAC1B,IAAA,mBACAZ,EAAAG,OAAA,SACK,IAAIwB,EAAc,KAAM,CAC7Bf,OAAsCmE,OAAhCA,EAAwB,MAArBjD,OAAqB,EAArBA,EAAuBlB,QAAMmE,EAAI,OAC1C,KAAA,GAAA,IAAA,MAAA,OAAA/E,EAAAmB,OAAA,GAAApC,EAAA,KAAA,CAAA,CAAA,GAAA,KACH,MAAApE,MAAAmD,KAAA/D,UAAA,CCrKgD,IAK5B8L,WAAaC,GAChC,SAAAD,EAAYhM,GAAc,IAAAyE,EAgHzB,OA/GCA,EAAAwH,EAAAC,KAAAjI,KAAMjE,IAAOiE,MAyFfkI,KAAI,WAAA,IAAApI,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACLkH,EACA9G,EACA0C,GAAkB,OAAAhD,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAAA,OAAAF,EAAAE,KAAA,EAEL5B,EAAK4H,QAAQ,OAAQ/G,EAAK8G,EAAKpE,GAAK,KAAA,EAAA,OAAA7B,EAAAG,OAAAH,SAAAA,EAAAU,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAV,EAAAmB,OAAA,GAAApC,EAClD,KAAA,OAAA,SAAAqC,EAAAsD,EAAAC,GAAA,OAAA/G,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CANG,GAMHuE,EAEDL,IAAG,WAAA,IAAAU,EAAAC,EAAAC,IAAAC,MAAG,SAAAqH,EACJF,EACA9G,EACA0C,GAAkB,OAAAhD,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EAAA,OAAAkG,EAAAlG,KAAA,EAEL5B,EAAK4H,QAAQ,MAAO/G,EAAK8G,EAAKpE,GAAK,KAAA,EAAA,OAAAuE,EAAAjG,OAAAiG,SAAAA,EAAA1F,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA0F,EAAAjF,OAAA,GAAAgF,EACjD,KAAA,OAAA,SAAAE,EAAAC,EAAAC,GAAA,OAAA5H,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CANE,GAMFuE,EAEDkI,IAAG,WAAA,IAAAC,EAAA7H,EAAAC,IAAAC,MAAG,SAAA4H,EACJT,EACA9G,EACA0C,GAAkB,OAAAhD,IAAAkB,MAAA,SAAA4G,GAAA,cAAAA,EAAA1G,KAAA0G,EAAAzG,MAAA,KAAA,EAAA,OAAAyG,EAAAzG,KAAA,EAEL5B,EAAK4H,QAAQ,MAAO/G,EAAK8G,EAAKpE,GAAK,KAAA,EAAA,OAAA8E,EAAAxG,OAAAwG,SAAAA,EAAAjG,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAiG,EAAAxF,OAAA,GAAAuF,EACjD,KAAA,OAAA,SAAAE,EAAAC,EAAAC,GAAA,OAAAL,EAAA9L,MAAAmD,KAAA/D,UAAA,CAAA,CANE,GAMFuE,CA9GD,CAACyI,EAAAlB,EAAAC,GAAA,IAAA3D,EAAA0D,EAAAzD,UAsFA,OAtFAD,EAEK6E,WAAU,WAAA,IAAAC,EAAArI,EAAAC,IAAAC,MAAhB,SAAAoI,EACEC,EACAhI,EACA0C,EACAD,GAAa,IAAAwF,EAAAhI,EAAA,OAAAP,IAAAkB,MAAA,SAAAsH,GAAA,cAAAA,EAAApH,KAAAoH,EAAAnH,MAAA,KAAA,EAKL,OAHFkH,EAAKlG,EAAA,CAAA,EACNW,EAAI,CACPD,KAAAA,EACAuF,OAAAA,IAAME,EAAAnH,KAAA,EAGUuE,EAAO3G,KAAMqB,EAAKiI,GAAM,KAAA,EAAjC,MAAHhI,EAAGiI,EAAA3G,gBAEUiB,GAAa,CAAA0F,EAAAnH,KAAA,EAAA,KAAA,CAAA,OAAAmH,EAAAlH,OACvBf,SAAAA,EAAI0C,UAAQ,KAAA,EAAA,OAAAuF,EAAAlH,OAAA,SAGdf,GAAG,KAAA,EAAA,IAAA,MAAA,OAAAiI,EAAAlG,OAAA,GAAA+F,EAAApJ,KACX,KAAA,OAAA,SAAAwJ,EAAAC,EAAAC,EAAAC,GAAA,OAAAR,EAAAtM,MAAAmD,KAAA/D,UAAA,CAAA,CAnBe,GAqBhBoI,EAWgB+D,QAAO,WAAA,IAAAwB,EAAA9I,EAAAC,IAAAC,MAAb,SAAA6I,EACRR,EACAhI,EACA8G,EACApE,GAAkB,IAAArB,EAAAc,EAAAoC,EAAAkE,EAAApJ,EAAAsF,EAAAlC,EAAAwF,EAAA,OAAAvI,IAAAkB,MAAA,SAAA8H,GAAA,cAAAA,EAAA5H,KAAA4H,EAAA3H,MAAA,KAAA,EA4BlB,GAzBMM,EAAU,IAAI6E,QAAQxD,EAAOA,MAAAA,OAAAA,EAAAA,EAAMrB,QAAU,CAAA,GAC/CyF,aAAeZ,SACX/D,EAAW2E,EAAIhI,IAAIqF,GACnBI,EAASuC,EAAIhI,IAAI,UACnBqD,GACFd,EAAQtC,IAAIoF,EAAehC,GAEzBoC,GACFlD,EAAQtC,IAAI,SAAUwF,IAEfuC,aAAe6B,UAElBF,EAAW,IAAIvC,QAAQY,MAAAA,OAAAA,EAAAA,EAAKzF,SAC5Bc,EAAWsG,EAAS3J,IAAIqF,GACxBI,EAASkE,EAAS3J,IAAI,UACxBqD,GACFd,EAAQtC,IAAIoF,EAAehC,GAEzBoC,GACFlD,EAAQtC,IAAI,SAAUwF,IAItB9B,EAA2BmG,KAAKC,UAAU/B,GAG/B,QAAXkB,EAAgB,CAAAU,EAAA3H,KAAA,EAAA,KAAA,CAClB0B,OAAOqG,EAAUJ,EAAA3H,KAAA,GAAA,MAAA,KAAA,EAAA,KACR+F,aAAe6B,SAAO,CAAAD,EAAA3H,KAAA,GAAA,KAAA,CAAA,OAAA2H,EAAA3H,KAAA,GAClB,IAAI6B,SAASkE,EAAIrE,MAAMd,OAAM,KAAA,GAA1Cc,EAAIiG,EAAAnH,KAAAmH,EAAA3H,KAAA,GAAA,MAAA,KAAA,IAGJ+F,aAAeZ,SACS,OAAxB0C,KAAKC,UAAU/B,IACdA,GAAsB,iBAARA,GAAkD,IAA9BiC,OAAOC,OAAOlC,GAAKjM,UAEtD4H,OAAOqG,GACR,KAAA,GAIQ,OAFHb,EAAKlG,EAAA,CAAA,EACNW,EAAI,CACPrB,QAAAA,IAAOqH,EAAA3H,KAAA,GAGIpC,KAAKkJ,WAAWG,EAAQhI,EAAKiI,EAAOxF,GAAK,KAAA,GAAA,OAAAiG,EAAA1H,OAAA0H,SAAAA,EAAAnH,MAAA,KAAA,GAAA,IAAA,MAAA,OAAAmH,EAAA1G,OAAA,GAAAwG,EAAA7J,KACvD,KAAA,OAAA,SAAAsK,EAAAC,EAAAC,EAAAC,GAAA,OAAAb,EAAA/M,MAAAmD,KAAA/D,UAAA,CAAA,CApDsB,GAoDtB8L,CAAA,EAzFuCzH,GCwBrBoK,WAAK1C,GACxB,SAAA0C,EAAY3O,GAAc,IAAAyE,EAoNzB,OAnNCA,EAAAwH,EAAAC,KAAAjI,KAAMjE,IAAOiE,MAMf2K,MAAK,WAAA,IAAA7K,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACNkH,EACApE,GAAkB,IAAArB,EAAAkI,EAAAC,EAAAC,EAAAxJ,EAAAyJ,EAAAxM,EAAAqH,EAAAoF,EAAAC,EAAAzH,EAAA,OAAAzC,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAUW,GARvBM,EAAU,IAAI6E,QAAQ,CAAE,eAAgB,qBACxCqD,EAAa,IAAI7C,EAASvH,GASpB,UANV2H,aAAe6B,QACX,IAAI1H,IAAI6F,EAAI9G,KAAKkB,aACjB,IAAI2I,iBAES/K,IAAI,OAEL,CAAA+B,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,EACU5B,EAAK2K,cAC5BhD,EAAgBtF,QACjBkB,GACD,KAAA,EAHgB,MAAX8G,EAAW3I,EAAAU,OAOfiI,EAAY/H,QAAU,KACtB+H,EAAY/H,OAAS,KAAG,CAAAZ,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,GAEA,IAAI6B,SAAS4G,EAAY/G,MAAMrC,OAAM,KAAA,GAA9C,MAATqJ,EAAS5I,EAAAU,MACD1G,OAAS,GAAC,CAAAgG,EAAAE,KAAA,GAAA,KAAA,CAAA,KAClB0I,EAAU5O,OAAS,GAAC,CAAAgG,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAG,OAAA,SACf,IAAI4B,SAASgG,KAAKC,UAAUY,GAAY,CAAEhI,OAAQ,OAAM,KAAA,GAUjE,OALAJ,EAAQtC,IAAIoF,EAAesF,EAAU,GAAGtH,UACxCd,EAAQ0I,OACN,aACYN,YAAAA,EAAU,GAAGtH,SAAQ,uBAEnCtB,EAAAG,OACO,SAAA,IAAI4B,SACTgG,KAAKC,UAAU,CACbmB,YAAW,GAAK7K,EAAKlC,IAAIS,SAAWyB,EAAK8K,YAAY,UAEvD,CAAExI,OAAQ,OACX,KAAA,GAAA,OAAAZ,EAAAE,KAAA,GAOWwI,EAAW1C,KAAKC,EAAK3H,EAAK+K,SAAUxH,GAAK,OAAO,SAAC4D,GAGjE,OADA/K,QAAQO,MAAMwK,GACPA,CACT,IAAE,KAAA,GAJO,MAAHrG,EAAGY,EAAAU,gBAKUiB,GAAa,CAAA3B,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAG,OACvBf,SAAAA,EAAI0C,UAAQ,KAAA,GAAA,KAEjB1C,GAAOA,EAAIwB,QAAU,KAAOxB,EAAIwB,OAAS,KAAG,CAAAZ,EAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,EAAAE,KAAA,GACPd,EAAIG,OAAM,KAAA,GAQpB,OAPvBmE,GAAoB,OAAdmF,EAAMvK,EAAKlC,UAAG,EAARyM,EAAUhL,WAAaxB,KADnCA,EAAK2D,EAAAU,MACoCrE,MAAMiN,IAAG,oCACxD9I,EAAQ0I,OAAO,aAAcxF,GAEvBqF,EAAgB,OADdD,EAAYzM,EAAZyM,cACc,EAAPA,EAASX,SAClB7G,EAAWyH,MAAAA,OAAAA,EAAAA,EAAQ7I,OAAO/B,MAChCqC,EAAQtC,IAAIoF,EAAehC,GAC3Bd,EAAQ0I,OAAO,aAA0B5H,YAAAA,yBACzC6B,EAAY9G,EAAMA,MAAMiN,KAAKtJ,EAAAG,OAAA,SAEtB,IAAI4B,SAASgG,KAAKC,UAAU3L,GAAQ,CAAEuE,OAAQ,IAAKJ,QAAAA,KAAU,KAAA,GAAA,OAAAR,EAAAE,KAAA,GAEnDd,EAAI0B,OAAM,KAAA,GAAnB,OAAAd,EAAAG,OAAA,SACH,IAAI4B,SADD/B,EAAAU,KACgB,CAAEE,OAAQxB,EAAIwB,UAAS,KAAA,GAAA,IAAA,MAAA,OAAAZ,EAAAmB,OAAA,GAAApC,EAClD,KAAA,OAAAqC,SAAAA,EAAAsD,GAAA,OAAA9G,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CA1EI,GA0EJuE,EAEDiL,SAAW,SAACC,GACV,IAAMC,EAAQ,WAAA,IAAA9K,EAAAC,EAAAC,IAAAC,MAAG,SAAAqH,EACfF,GAAyB,IAAAyD,EAAAlJ,EAAAoB,EAAA+H,EAAArI,EAAAoC,EAAA,OAAA7E,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EAEI,OAAvBM,EAAU,IAAI6E,QAASe,EAAAlG,KAAA,EACT+F,EAAgB2D,WAAU,KAAA,EAApC,OAAJhI,EAAIwE,EAAA1F,KAAA0F,EAAAlG,KAAA,EACiB0B,EAAK3D,IAAI,gBAAe,KAAA,EAAlC,OAAX0L,EAAWvD,EAAA1F,KAAA0F,EAAAlG,KAAA,EACO0B,EAAK3D,IAAI,YAAW,KAAA,EAMP,OAN/BqD,EAAQ8E,EAAA1F,KACRgD,GAAoB,OAAdgG,EAAMpL,EAAKlC,UAAG,EAARsN,EAAU7L,WAAS,IAAI8L,EAAW,oCACpDxG,EAAYwG,GACZnJ,EAAQ0I,OAAO,aAAcxF,GAC7BlD,EAAQtC,IAAIoF,EAAehC,GAC3Bd,EAAQ0I,OAAO,aAA0B5H,YAAAA,yBACzCd,EAAQtC,IAAI,WAAYsL,GAAapD,EAAAjG,OAAA,SAC9B,IAAI4B,SAAS,KAAM,CACxBvB,QAAAA,EACAI,OAAQ,OACR,KAAA,GAAA,IAAA,MAAA,OAAAwF,EAAAjF,OAAA,GAAAgF,EACH,KAAA,OAjBKsD,SAAQ9E,GAAA,OAAAhG,EAAAhE,MAAAmD,KAAA/D,UAAA,EAAA,GAkBd,OAAO0P,GACRnL,EAED8K,YAAc,SAACS,GAAoB,IAAAC,EACjC,MAAA,cAAqBtE,mBAAmBlH,EAAKC,YAAWuL,aACzC,OADyCA,EACtDxL,EAAKgD,UAAQwI,EAAI,sCACKD,EAAQ,UACjCvL,EAMDyL,OAAM,WAAA,IAAAtD,EAAA7H,EAAAC,IAAAC,MAAG,SAAA4H,EACPT,EACApE,GAAkB,IAAArB,EAAAkI,EAAAtJ,EAAA4K,EAAAC,EAAAC,EAAA7N,EAAAqH,EAAA1C,EAAA,OAAAnC,IAAAkB,MAAA,SAAA4G,GAAA,cAAAA,EAAA1G,KAAA0G,EAAAzG,MAAA,KAAA,EAGoB,OADhCM,EAAU,IAAI6E,QACdqD,EAAa,IAAI7C,EAASvH,GAAMqI,EAAAzG,KAAA,EACpBwI,EAAW1C,KAAKC,EAAK3H,EAAK6L,UAAWtI,GAAK,OAAO,SAAC4D,GAGlE,OADA/K,QAAQO,MAAMwK,GACPA,CACT,IAAE,KAAA,EAJO,MAAHrG,EAAGuH,EAAAjG,gBAKUiB,GAAa,CAAAgF,EAAAzG,KAAA,EAAA,KAAA,CAAA,OAAAyG,EAAAxG,OACvBf,SAAAA,EAAI0C,UAAQ,KAAA,EAAA,KAEjB1C,GAAOA,EAAIwB,QAAU,KAAOxB,EAAIwB,OAAS,KAAG,CAAA+F,EAAAzG,KAAA,GAAA,KAAA,CAAA,OAAAyG,EAAAzG,KAAA,GACPd,EAAIG,OAAM,KAAA,GAOe,OAN1DmE,UAAMsG,EAAM1L,EAAKlC,YAAL4N,EAAUnM,WAASoM,KAAIA,OAAJA,GAD/B5N,EAAKsK,EAAAjG,MACoCrE,YAAN4N,EAAAA,EAAaX,KAAG,oCACzD9I,EAAQ0I,OAAO,aAAcxF,GACrB1C,EAAO3E,EAAP2E,GACRmC,EAAY+G,OAADA,EAAC7N,EAAMA,YAAN6N,EAAAA,EAAaZ,KACzBrG,EAAajC,GACbR,EAAQtC,IAAIqF,EAAgBvC,GAC5BR,EAAQ0I,OAAO,aAAwBlI,UAAAA,yBAAyB2F,EAAAxG,OAAA,SACzD,IAAI4B,SAASgG,KAAKC,UAAU3L,GAAQ,CAAEuE,OAAQ,IAAKJ,QAAAA,KAAU,KAAA,GAAA,OAAAmG,EAAAzG,KAAA,GAEnDd,EAAI0B,OAAM,KAAA,GAAnB,OAAA6F,EAAAxG,OAAA,SACH,IAAI4B,SADD4E,EAAAjG,KACgB,CAAEE,OAAQxB,EAAIwB,UAAS,KAAA,GAAA,IAAA,MAAA,OAAA+F,EAAAxF,OAAA,GAAAuF,EAClD,KAAA,OAAAL,SAAAA,EAAAC,GAAA,OAAAG,EAAA9L,MAAAmD,KAAA/D,UAAA,CAAA,CA3BK,GA2BLuE,EAcD8L,oBAAmB,WAAA,IAAAC,EAAAzL,EAAAC,IAAAC,MAAG,SAAAoI,EACpBjB,EACApE,GAAkB,IAAA6G,EAAA,OAAA7J,IAAAkB,MAAA,SAAAsH,GAAA,cAAAA,EAAApH,KAAAoH,EAAAnH,MAAA,KAAA,EAEoB,OAAhCwI,EAAa,IAAI7C,EAASvH,GAAM+I,EAAAlH,OAAA,SAC/BuI,EAAWzK,IAAIgI,EAAK3H,EAAKgM,uBAAwBzI,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAwF,EAAAlG,OAAA,GAAA+F,EAC9D,KAAA,OAAAX,SAAAA,EAAAK,GAAA,OAAAyD,EAAA1P,MAAAmD,KAAA/D,UAAA,CAAA,CANkB,GAMlBuE,EAEDiM,eAAc,WAAA,IAAAC,EAAA5L,EAAAC,IAAAC,MAAG,SAAA6I,EACf1B,EACApE,GAAkB,IAAA6G,EAAA,OAAA7J,IAAAkB,MAAA,SAAA8H,GAAA,cAAAA,EAAA5H,KAAA4H,EAAA3H,MAAA,KAAA,EAGS,OADrBwI,EAAa,IAAI7C,EAASvH,GACLuJ,EAAA1H,gBACpBuI,EAAW1C,KAAKC,EAAK3H,EAAKmM,kBADZ,QAC6C5I,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAgG,EAAA1G,OAAA,GAAAwG,EACxE,KAAA,OAAAd,SAAAA,EAAAC,GAAA,OAAA0D,EAAA7P,MAAAmD,KAAA/D,UAAA,CAAA,CAPa,GAObuE,EAEDoM,eAAc,WAAA,IAAAC,EAAA/L,EAAAC,IAAAC,MAAG,SAAA8L,EACf3E,EACApE,GAAkB,IAAA6G,EAAA,OAAA7J,IAAAkB,MAAA,SAAA8K,GAAA,cAAAA,EAAA5K,KAAA4K,EAAA3K,MAAA,KAAA,EAGS,OADrBwI,EAAa,IAAI7C,EAASvH,GACLuM,EAAA1K,gBACpBuI,EAAWlC,IAAIP,EAAK3H,EAAKmM,kBADX,QAC4C5I,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAgJ,EAAA1J,OAAA,GAAAyJ,EACvE,KAAA,OAAAtD,SAAAA,EAAAC,GAAA,OAAAoD,EAAAhQ,MAAAmD,KAAA/D,UAAA,CAAA,CAPa,GAObuE,EAUD2K,cAAa,WAAA,IAAA6B,EAAAlM,EAAAC,IAAAC,MAAG,SAAAiM,EACd9E,EACApE,GAAkB,IAAAmJ,EAAAtC,EAAA9G,EAAA,OAAA/C,IAAAkB,MAAA,SAAAkL,GAAA,cAAAA,EAAAhL,KAAAgL,EAAA/K,MAAA,KAAA,EAEoB,GAAhCwI,EAAa,IAAI7C,EAASvH,IAG5B2H,KAAO,SAAUA,GAAG,CAAAgF,EAAA/K,KAAA,EAAA,KAAA,CAAA,OAAA+K,EAAA/K,KAAA,EACT,IAAI6B,SAASkE,EAAIrE,MAAkBrC,OAAM,KAAA,EAAtDqC,EAAIqJ,EAAAvK,KAAA,KAAA,EAAA,OAAAuK,EAAA9K,OAECuI,SAAAA,EAAWzK,IAAIgI,EAAK3H,EAAK4M,YAAYF,OAADA,EAACpJ,QAAAoJ,EAAAA,EAAMG,OAAQtJ,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAoJ,EAAA9J,OAAA,GAAA4J,EAChE,KAAA,OAAAvD,SAAAA,EAAAC,GAAA,OAAAqD,EAAAnQ,MAAAmD,KAAA/D,UAAA,CAAA,CAXY,GAWZuE,EAED8M,kBAAoB,SAACC,GACnB,IAAI/J,EAOJ,MANwB,iBAAbA,EACTA,EAAW+J,EACFA,aAAiBhG,UAC1B/D,EAAW6C,EAAkBkH,EAAK/M,IAGpC,cAAqBA,EAAKC,WAAU,YAAY+C,EAAQ,uBACzDhD,CAlND,CAACyI,EAAAyB,EAAA1C,GAAA,IAAA3D,EAAAqG,EAAApG,UA0LA,OA1LAD,EA8IDsI,kBAAA,SAAkBa,GAChB,MAAqB9F,cAAAA,mBAAmB1H,KAAKS,YAAW,aACtDT,KAAKwD,SAAWkE,mBAAmB1H,KAAKwD,UAAY,cAC9BkE,wBAAAA,mBAAmB8F,IAC5CnJ,EAkCD+I,YAAA,SAAYC,GACV,MAAA,cAAqB3F,mBACnB1H,KAAKS,YACN,gCACC4M,EAAK,UAAa3F,mBAAmB2F,GAAW,KAEnDxN,EAAA6K,EAAA,CAAA,CAAAxK,IAAA,WAAAC,IAzLD,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,YAAW,cAC1D,GAAC,CAAAP,IAAA,YAAAC,IA0GD,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,YAAW,QAC1D,GAAC,CAAAP,IAAA,yBAAAC,IAqCD,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,yBAC3CT,KAAKwD,SAAWkE,mBAAmB1H,KAAKwD,UAAY,cACtD,sBACF,IAAC,EA3J+BlD,GCIbmN,WAAMzF,GACzB,SAAAyF,EAAY1R,GAAc,IAAAyE,EA2DzB,OA1DCA,EAAAwH,EAAAC,KAAAjI,KAAMjE,IAAOiE,MAef0N,iBAAgB,WAAA,IAAA5N,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACjBkH,EACApE,GAAkB,IAAA6G,EAAA,OAAA7J,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAEoB,OAAhCwI,EAAa,IAAI7C,EAASvH,GAAM0B,EAAAE,KAAA,EACzBwI,EAAW1C,KAAKC,EAAK3H,EAAKmN,eAAgB5J,GAAK,KAAA,EAAA,OAAA7B,EAAAG,OAAAH,SAAAA,EAAAU,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAV,EAAAmB,OAAA,GAAApC,EAC7D,KAAA,OAAAqC,SAAAA,EAAAsD,GAAA,OAAA9G,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CANe,GAMfuE,EAEDoN,UAAS,WAAA,IAAA/M,EAAAC,EAAAC,IAAAC,MAAG,SAAAqH,EACVF,EACApE,GAAkB,IAAA6G,EAAA,OAAA7J,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EAEoB,OAAhCwI,EAAa,IAAI7C,EAASvH,GAAM8H,EAAAlG,KAAA,EACzBwI,EAAWzK,IAAIgI,EAAK3H,EAAKqN,SAAU9J,GAAK,KAAA,EAAA,OAAAuE,EAAAjG,OAAAiG,SAAAA,EAAA1F,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA0F,EAAAjF,OAAA,GAAAgF,EACtD,KAAA,OAAAxB,SAAAA,EAAA0B,GAAA,OAAA1H,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CANQ,GAMRuE,EAEDsN,WAAU,WAAA,IAAAnF,EAAA7H,EAAAC,IAAAC,MAAG,SAAA4H,EACXhF,EACAuE,EACApE,GAAkB,IAAA6G,EAAA,OAAA7J,IAAAkB,MAAA,SAAA4G,GAAA,cAAAA,EAAA1G,KAAA0G,EAAAzG,MAAA,KAAA,EAEoB,OAAhCwI,EAAa,IAAI7C,EAASvH,GAAMqI,EAAAzG,KAAA,EACzBwI,EAAWlC,IAAIP,EAAQ3H,EAAKqN,SAAQ,IAAIjK,EAAUG,GAAK,KAAA,EAAA,OAAA8E,EAAAxG,OAAAwG,SAAAA,EAAAjG,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAiG,EAAAxF,OAAA,GAAAuF,EACrE,KAAA,OAAA,SAAAJ,EAAAC,EAAAK,GAAA,OAAAH,EAAA9L,MAAAmD,KAAA/D,UAAA,CAAA,CAPS,GAOTuE,EAEDuN,gBAAe,WAAA,IAAAxB,EAAAzL,EAAAC,IAAAC,MAAG,SAAAoI,EAChBjB,EACApE,GAAkB,IAAA6G,EAAA,OAAA7J,IAAAkB,MAAA,SAAAsH,GAAA,cAAAA,EAAApH,KAAAoH,EAAAnH,MAAA,KAAA,EAEoB,OAAhCwI,EAAa,IAAI7C,EAASvH,GAAM+I,EAAAnH,KAAA,EACzBwI,EAAWzK,IAAIgI,EAAK3H,EAAKmN,eAAgB5J,GAAK,KAAA,EAAA,OAAAwF,EAAAlH,OAAAkH,SAAAA,EAAA3G,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA2G,EAAAlG,OAAA,GAAA+F,EAC5D,KAAA,OAAAL,SAAAA,EAAAC,GAAA,OAAAuD,EAAA1P,MAAAmD,KAAA/D,UAAA,CAAA,CANc,GAMduE,EAMDwN,GAAE,WAAA,IAAAtB,EAAA5L,EAAAC,IAAAC,MAAG,SAAA6I,EACH1B,EACApE,GAAkB,IAAA6G,EAAA,OAAA7J,IAAAkB,MAAA,SAAA8H,GAAA,cAAAA,EAAA5H,KAAA4H,EAAA3H,MAAA,KAAA,EAEoB,OAAhCwI,EAAa,IAAI7C,EAASvH,GAAMuJ,EAAA3H,KAAA,EACzBwI,EAAWzK,IAAIgI,EAAK3H,EAAKyN,MAAOlK,GAAK,KAAA,EAAA,OAAAgG,EAAA1H,OAAA0H,SAAAA,EAAAnH,MAAA,KAAA,EAAA,IAAA,MAAA,OAAAmH,EAAA1G,OAAA,GAAAwG,EACnD,KAAA,OAAAL,SAAAA,EAAAC,GAAA,OAAAiD,EAAA7P,MAAAmD,KAAA/D,UAAA,CAAA,CANC,GAMDuE,CAzDD,CAAC,OAAAyI,EAAAwE,EAAAzF,GAAAnI,EAAA4N,EAAA,CAAA,CAAAvN,IAAA,UAAAC,IAED,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,WAC/C,GAAC,CAAAP,IAAA,WAAAC,IAED,WACE,OAAUH,KAAKkO,QAAO,QACxB,GAAC,CAAAhO,IAAA,iBAAAC,IAED,WAAkB,IAAA6L,EAChB,OAAUhM,KAAKkO,QAAO,aAAyB,OAAzBlC,EAAYhM,KAAKwD,UAAQwI,EAAI,cAAY,QACjE,GAAC,CAAA9L,IAAA,QAAAC,IAmCD,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,YAAW,WAC1D,IAAC,EApDgCH,GC3Bd6N,WAAQnG,GAC3B,SAAAmG,EAAYpS,GAAc,IAAAyE,EA0BzB,OAzBCA,EAAAwH,EAAAC,KAAAjI,KAAMjE,IAAOiE,MAWfoO,aAAY,WAAA,IAAAtO,EAAAgB,EAAAC,IAAAC,MAAG,SAAAC,EACbkH,EACApE,GAAkB,IAAA6G,EAAA,OAAA7J,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAEoB,OAAhCwI,EAAa,IAAI7C,EAASvH,GAAM0B,EAAAG,OAAA,SAC/BuI,EAAW1C,KAAKC,EAAK3H,EAAK6N,WAAYtK,IAAK,KAAA,EAAA,IAAA,MAAA,OAAA7B,EAAAmB,OAAA,GAAApC,EACnD,KAAA,OAAAqC,SAAAA,EAAAsD,GAAA,OAAA9G,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAA,CANW,GAMXuE,EAED8N,UAAS,WAAA,IAAAzN,EAAAC,EAAAC,IAAAC,MAAG,SAAAqH,EACVF,EACApE,GAAkB,IAAA6G,EAAA,OAAA7J,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EAEoB,OAAhCwI,EAAa,IAAI7C,EAASvH,GAAM8H,EAAAjG,OAAA,SAC/BuI,EAAWzK,IAAIgI,EAAK3H,EAAK+N,UAAWxK,IAAK,KAAA,EAAA,IAAA,MAAA,OAAAuE,EAAAjF,OAAA,GAAAgF,EACjD,KAAA,OAAAxB,SAAAA,EAAA0B,GAAA,OAAA1H,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAA,CANQ,GAMRuE,CAxBD,CAAC,OAAAyI,EAAAkF,EAAAnG,GAAAnI,EAAAsO,EAAA,CAAA,CAAAjO,IAAA,aAAAC,IACD,WACE,MAAA,cAAqBuH,mBAAmB1H,KAAKS,YAAW,UAC1D,GAAC,CAAAP,IAAA,YAAAC,IACD,WAAa,IAAA6L,EACX,MAAA,cAAqBtE,mBAAmB1H,KAAKS,YAAW,aACzCuL,OADyCA,EACtDhM,KAAKwD,UAAQwI,EAAI,aAErB,IAAC,EAXkC1L,qBCE/BkO,EAAY,WAQhB,SAAAA,EAAYzS,EAAgBmH,GAAU,IAAA1C,EAAAR,KAAAA,KAPtCyO,UAAI,EAAAzO,KACJwD,cAAQ,EAAAxD,KACR4D,YAAM,EAAA5D,KACNkD,QAAE,EAAAlD,KACFjE,YAAM,EAAAiE,KACN0O,WAAK,EAGH,IAAAtN,EAAuBtF,EAAOC,EAAQ,kBAA9BgB,EAAIqE,EAAJrE,KAAMT,EAAI8E,EAAJ9E,KACd0D,KAAKkD,GAAKA,EACV,IAAMyL,EAAUvL,EAAA,CACdwL,IAAK,EACLC,IAAK,GACLC,kBAAmB,KAChB/S,EAAOmD,IAEJ6P,EAA8BJ,EAA9BI,YAAgBC,oIAASC,CAAKN,EAAUO,GAEhDnT,EAAOmD,GAAKyP,EACZ3O,KAAKjE,OAASA,EACdO,EAAK0D,KAAKjE,QAEViE,KAAKyO,KCzBO,SAAmBA,EAAY1S,GAC7C,IAAAqF,EAAwBtF,EAAOC,EAAQ,UAA/BO,EAAI8E,EAAJ9E,KAAMa,EAAKiE,EAALjE,MACd,OAAO,IAAIgS,MAAYV,EAAM,CAC3BtO,IAAGA,SAACiP,EAAkBC,GACpB,GAAiB,UAAbA,EAAsB,CAEnBtT,EAAOmD,GAAGoQ,mBACRvT,EAAO2B,MAAS3B,EAAOiC,SAIhBjC,EAAOmD,GAAGqC,UACpBpE,EACE,8FALFA,EACE,mHAQN,IAAMoS,EAASH,EAAOC,GACtB,OAAO,WAAgC,IAAA,IAAArT,EAAAC,UAAAC,OAAdQ,EAAcN,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAdK,EAAcL,GAAAJ,UAAAI,GAIrC,OAHAC,EAAIO,WAAIH,EAAAA,GAEO6S,EAAO1S,MAAMmD,KAAMtD,GAGtC,CACA,OAAO0S,EAAOC,EAChB,GAEJ,CDHgBG,CAAmB,IAAIC,EAAAA,KAAKT,GAAYhP,KAAKjE,QAE9B,mBAAhBgT,GACThS,EACE,+EAKJiD,KAAK0P,eACL1P,KAAKyO,KAAKkB,GAAG,UAAS,WAAA,IAAA7P,EAAAgB,EAAAC,IAAAC,MAAE,SAAAC,EAAO2O,GAAM,OAAA7O,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EACnC9F,EAAK,kBAC4BuT,EAAgB9T,EACjDgT,CAAYa,GAAQ,SAACE,EAAKC,GACpBD,GACFC,EAAQC,SAEZ,IACAxP,EAAKkP,eAAe,KAAA,EAAA,IAAA,MAAA,OAAAxN,EAAAmB,OAAA,GAAApC,EACrB,KAAA,OAAA,SAAAqC,GAAA,OAAAxD,EAAAjD,MAAAmD,KAAA/D,UAAA,CAAC,CAToB,IAUtB+D,KAAKyO,KAAKkB,GAAG,QAAO,WAAA,IAAA9O,EAAAC,EAAAC,IAAAC,MAAE,SAAAqH,EAAOV,GAAC,OAAA5G,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EAC5B9F,EAAK,cAAeqL,GAAG,KAAA,EAAA,IAAA,MAAA,OAAAW,EAAAjF,OAAA,GAAAgF,EACxB,KAAA,OAAA,SAAAzB,GAAA,OAAA/F,EAAAhE,MAAAmD,KAAA/D,UAAA,CAAC,CAFkB,GAGtB,CAUC,OAVAuS,EAAAlK,UAEDoL,aAAA,WAAY,IAAAO,EAAAjQ,KACNA,KAAK0O,OACPwB,aAAalQ,KAAK0O,OAEpB1O,KAAK0O,MAAQyB,WAAUrP,EAAAC,IAAAC,MAAC,SAAA4H,IAAA,OAAA7H,IAAAkB,MAAA,SAAA4G,GAAA,cAAAA,EAAA1G,KAAA0G,EAAAzG,MAAA,KAAA,EAAA,OAAAyG,EAAAzG,KAAA,EAChB6N,EAAKxB,KAAK2B,MAAK,KAAA,EPFzBlM,EAAQK,QAAQ5E,EAAO0Q,UOGTJ,EAAK/M,IAAI,KAAA,EAAA,IAAA,MAAA,OAAA2F,EAAAxF,OAAA,GAAAuF,EACpB,KAAE5I,KAAKjE,OAAOmD,GAAG4P,oBACnBN,CAAA,CAxDe,GA6DlB,SAASqB,EAAgB9T,GACvB,IAAAuU,EAAuBxU,EAAOC,EAAQ,iBAA9BgB,EAAIuT,EAAJvT,KAAMT,EAAIgU,EAAJhU,KACd,OAAO,SAACiU,EAAM1L,GAMZ,GALA0L,EAAKZ,GAAG,SAAS,SAAsBxS,GACrCJ,EAAK,sCAAuCI,GAC5C0H,EAAK1H,EAAOoT,EACd,IAEIxU,EAAOyH,SAAU,CACnB,IAAMgN,EAAQ,CAAA,yBAA0BzU,EAAOyH,SAAY,KACvDzH,EAAO6H,SACJ7H,EAAOyH,UACVzG,EAAK,0DAEPyT,EAAMxL,KAAI,uBAAwBjJ,EAAO6H,aAI3C2M,EAAKC,MAAMA,EAAMtK,KAAK,MAAM,SAAU4J,GAChC/T,EAAOyH,UACTlH,EAAK,cAAeP,EAAOyH,UAEzBzH,EAAO6H,QACTtH,EAAK,YAAaP,EAAO6H,QAE3BiB,EAAKiL,EAAKS,EACZ,GACF,CACA1L,EAAK,KAAM0L,GAEf,CE9F0C,IAErBE,EAAS,WAe5B,SAAAA,EAAY1U,GAAoB,IAAAyE,EAAAR,KAAAA,KAdhC0Q,iBAAW,EAeT,IAAQpU,EAASR,EAAOC,EAAQ,eAAxBO,KACR0D,KAAK0Q,YAAc,IAAIC,IAEvB,IT8B2BC,ES9BrB1N,EAAKlD,KAAK6Q,SAChBvU,EAAK,cAAe4G,GACpBlD,KAAK0Q,YAAYtQ,IAAI8C,EAAI,IAAIsL,EAAa,IAAIlO,EAAOvE,GAASmH,IT4BnC0N,ES3BZ,SAAC1N,GACVA,GAAM1C,EAAKkQ,YAAYI,IAAI5N,IAC7B1C,EAAKkQ,YAAkB,OAACxN,EAE5B,ETwBFgB,EAAQa,UAAUpF,EAAO0Q,UAAWO,ESvBpC,CAAC,IAAAvM,EAAAoM,EAAAnM,UAgBA,OAhBAD,EAxBOwM,OAAA,SACNrN,EACAI,GAEA,OAAIJ,GAAYI,EACJJ,MAAYI,EAEpBJ,EACF,GAAUA,EAEL,QACRa,EAeD0M,cAAA,SAAchV,GACZ,IAAQO,EAASR,EAAOC,EAAQ,eAAxBO,KACF4G,EAAKlD,KAAK6Q,OAAO9U,EAAOyH,SAAUzH,EAAO6H,QACzCoN,EAAWhR,KAAK0Q,YAAYvQ,IAAI+C,GAEtC,GADA5G,EAAK,kBAAmB0D,KAAK0Q,YAAYO,MACrCD,EAEF,OADA1U,EAAK,qBAAsB4G,GACpB8N,EAASvC,KAElB,IAAMyC,EAAS,IAAI1C,EAAa,IAAIlO,EAAOvE,GAASmH,GAIpD,OAHAlD,KAAK0Q,YAAYtQ,IAAI8C,EAAIgO,GACzB5U,EAAK,cAAe4G,GACpB5G,EAAK,kBAAmB0D,KAAK0Q,YAAYO,MAClCC,EAAOzC,MACfgC,CAAA,CA3C2B,GCFjBU,EAAe,SAACpV,GAC3B,OAAOqV,OAAOC,KAAKpH,KAAKC,UAAUnO,GAAS,UAAUuV,UACvD,ECQMvN,EAAO,SAAChI,GAIZ,MAAO,CACLwV,KAJW,IAAI7G,EAAK3O,GAKpByV,MAJY,IAAI/D,EAAM1R,GAKtBiP,QAJc,IAAImD,EAAQpS,GAM9B,EAEa0V,EAAM,WAMjB,SAAAA,EAAY1V,GAAqB,IAAAyE,EAAAR,KAAAA,KALjCjE,YAAM,EAAAiE,KACN1B,SAAG,EAAA0B,KACK0R,aAAO,EAAA1R,KACP2R,aAAO,EAGb3R,KAAKjE,OAAS,IAAIuE,EAAOvE,GACzBiE,KAAK2R,QAAU,IAAIhB,IACnB3Q,KAAK1B,IAAMyF,EAAK/D,KAAKjE,QACrBiE,KAAK0R,QAAU,IAAIE,EAAU5R,KAAKjE,QXMpCmI,EAAQa,UAAUpF,EAAOuF,QWJT,SAAC1B,GACbhD,EAAKgD,SAAWA,CAClB,IXQwCU,EAAQa,UAAUpF,EAAOyF,MWNrD,SAACxB,GACXpD,EAAKoD,OAASA,CAChB,IXUuCM,EAAQa,UAAUpF,EAAO4F,OWRrD,SAAChH,GACViC,EAAKjC,MAAQA,CACf,GACF,CAAC,IAAA8F,EAAAoN,EAAAnN,UAyGA,OAzGAD,EAEDwN,UAAA,SAAUrU,GACRwC,KAAKjE,OAAS,IAAIuE,EAAO9C,IAC1B6G,EAEKN,KAAI,WAAA,IAAA+N,EAAAhR,EAAAC,IAAAC,MAAV,SAAAC,EAAWzD,GAAY,IAAAuU,EAAA,OAAAhR,IAAAkB,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAAA,OAAAF,EAAAE,KAAA,EACOpC,KAAKjE,OAAO6E,UAASwC,EAC5C,CAAA,EAAApD,KAAKjE,OACLyB,IACH,KAAA,EAG6B,OAF/BwC,KAAK6R,UAJCE,EAAa7P,EAAAU,MAKnB5C,KAAK0R,QAAU,IAAIE,EAAU5R,KAAKjE,QAClCiE,KAAK1B,IAAMyF,EAAKgO,GAAe7P,EAAAG,OAAA,SACxBrC,MAAI,KAAA,EAAA,IAAA,MAAA,OAAAkC,EAAAmB,OAAA,GAAApC,EAAAjB,KACZ,KAAA,OAAA,SAAAsD,GAAA,OAAAwO,EAAAjV,MAAAmD,KAAA/D,UAAA,CAAA,CATS,GAsEVoI,EAMA2N,YAAA,SAAYjW,GACV,IAAMkW,EAAO7O,EAAA,CAAA,EAAQpD,KAAKjE,OAAWA,GAC/BmW,EDpIiB,SAACnW,GAC1B,IAAMyB,EAAM,IAAI8C,EAAOvE,GACvB,OAAOoV,EAAa3T,EACtB,CCiIqB2U,CAAYF,GAE7B,GAAIC,IADoBf,EAAanR,KAAKjE,QAExC,OAAOiE,KAET,IAAMgR,EAAWhR,KAAK2R,QAAQxR,IAAI+R,GAElC,GAAIlB,EAAU,CAEZ,IAAMe,EAAgB,IAAIzR,EAAO2R,GAOjC,OANAjB,EAASa,UAAUE,GAEnBf,EAASxN,SAAWuO,EAAcvO,SAClCwN,EAASpN,OAASmO,EAAcnO,OAChCoN,EAASzS,MAAQwT,EAAczT,IAAIC,MACnCyS,EAASvQ,WAAasR,EAActR,WAC7BuQ,CACT,CAGA,OADAhR,KAAK2R,QAAQvR,IAAI8R,EAAU,IAAIT,EAAOQ,IAC/BjS,KAAK2R,QAAQxR,IAAI+R,IACzBrS,EAAA4R,EAAA,CAAA,CAAAvR,IAAA,aAAAE,IAxFD,SAAekF,GACTA,IACFtF,KAAKjE,OAAO0E,WAAa6E,EACzBtF,KAAK1B,IAAIiT,KAAK9Q,WAAa6E,EAC3BtF,KAAK1B,IAAIkT,MAAM/Q,WAAa6E,EAC5BtF,KAAK1B,IAAI0M,QAAQvK,WAAa6E,EAElC,GAAC,CAAApF,IAAA,SAAAC,IAED,WACE,OAAOH,KAAKjE,OAAO6H,MACpB,EAAAxD,IAED,SAAWwD,GACT5D,KAAKS,WAAaT,KAAKjE,OAAO0E,WAE9BT,KAAKjE,OAAO6H,OAASA,EAEjB5D,KAAK1B,MACP0B,KAAK1B,IAAIiT,KAAK3N,OAAS5D,KAAKjE,OAAO6H,OACnC5D,KAAK1B,IAAIkT,MAAM5N,OAAS5D,KAAKjE,OAAO6H,OACpC5D,KAAK1B,IAAI0M,QAAQpH,OAAS5D,KAAKjE,OAAO6H,OAE1C,GAAC,CAAA1D,IAAA,WAAAC,IAED,WACE,OAAOH,KAAKjE,OAAOyH,QACpB,EAAApD,IAED,SAAaoD,GACXxD,KAAKS,WAAaT,KAAKjE,OAAO0E,WAC9BT,KAAKjE,OAAOyH,SAAWA,EAEnBxD,KAAK1B,MACP0B,KAAK1B,IAAIiT,KAAK/N,SAAWA,EACzBxD,KAAK1B,IAAIkT,MAAMhO,SAAWA,EAC1BxD,KAAK1B,IAAI0M,QAAQxH,SAAWA,EAEhC,GAAC,CAAAtD,IAAA,QAAAC,IAED,WAAS,IAAAiS,EACP,OAAkBA,OAAlBA,EAAOpS,KAAKjE,SAALqW,OAAWA,EAAXA,EAAa9T,UAAb8T,EAAAA,EAAkB7T,KAC1B,EAAA6B,IAED,SAAU7B,GACJA,IACFyB,KAAKjE,OAAOuC,IAAIC,MAAQA,EACpByB,KAAK1B,MACP0B,KAAK1B,IAAIiT,KAAKjT,IAAIC,MAAQA,EAC1ByB,KAAK1B,IAAIkT,MAAMlT,IAAIC,MAAQA,EAC3ByB,KAAK1B,IAAI0M,QAAQ1M,IAAIC,MAAQA,GAGnC,GAAC,CAAA2B,IAAA,KAAAC,IACD,WAEE,OAAOH,KAAK0R,QAAQX,cAAc/Q,KAAKjE,OACzC,IAAC,CAjGgB,GAmIGsW,SAAAA,EAAMzL,GAAA,OAAA0L,EAAAzV,MAAAmD,KAAA/D,UAAA,CAG3B,SAAAqW,IAAA,OAAAA,EAAAxR,EAAAC,IAAAC,MAHM,SAAAqH,EAAsBtM,GAAqB,IAAAwW,EAAA,OAAAxR,IAAAkB,MAAA,SAAAqG,GAAA,cAAAA,EAAAnG,KAAAmG,EAAAlG,MAAA,KAAA,EACf,OAA3BmQ,EAAS,IAAId,EAAO1V,GAAOuM,EAAAlG,KAAA,EACpBmQ,EAAOxO,OAAM,KAAA,EAAA,OAAAuE,EAAAjG,OAAAiG,SAAAA,EAAA1F,MAAA,KAAA,EAAA,IAAA,MAAA,OAAA0F,EAAAjF,OAAA,GAAAgF,EAC3B,MAAAxL,MAAAmD,KAAA/D,UAAA,CC3JDuW,OAAOC,QAAUJ"}
|
|
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":"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"}
|
package/dist/server.esm.js
CHANGED
|
@@ -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,
|
|
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 =
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
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
|
|
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 =
|
|
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
|
|
696
|
+
case 15:
|
|
693
697
|
res = _context.sent;
|
|
694
698
|
possibleError = res.clone();
|
|
695
|
-
_context.prev =
|
|
696
|
-
_context.next =
|
|
699
|
+
_context.prev = 17;
|
|
700
|
+
_context.next = 20;
|
|
697
701
|
return res.json();
|
|
698
|
-
case
|
|
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 =
|
|
714
|
+
_context.next = 32;
|
|
711
715
|
break;
|
|
712
|
-
case
|
|
713
|
-
_context.prev =
|
|
714
|
-
_context.t0 = _context["catch"](
|
|
715
|
-
_context.next =
|
|
716
|
+
case 25:
|
|
717
|
+
_context.prev = 25;
|
|
718
|
+
_context.t0 = _context["catch"](17);
|
|
719
|
+
_context.next = 29;
|
|
716
720
|
return possibleError.text();
|
|
717
|
-
case
|
|
721
|
+
case 29:
|
|
718
722
|
message = _context.sent;
|
|
719
723
|
error(message);
|
|
720
724
|
database = {
|
|
721
725
|
message: message
|
|
722
726
|
};
|
|
723
|
-
case
|
|
727
|
+
case 32:
|
|
724
728
|
info('[fetched database]', database);
|
|
725
729
|
if (!(process.env.NODE_ENV !== 'TEST')) {
|
|
726
|
-
_context.next =
|
|
730
|
+
_context.next = 42;
|
|
727
731
|
break;
|
|
728
732
|
}
|
|
729
733
|
if (!('message' in database)) {
|
|
730
|
-
_context.next =
|
|
734
|
+
_context.next = 41;
|
|
731
735
|
break;
|
|
732
736
|
}
|
|
733
737
|
if (!('statusCode' in database)) {
|
|
734
|
-
_context.next =
|
|
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
|
-
|
|
752
|
+
configuredHost = dburl.host;
|
|
749
753
|
basePath = apiurl.origin;
|
|
750
754
|
}
|
|
751
|
-
case
|
|
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:
|
|
763
|
-
port:
|
|
766
|
+
host: configuredHost,
|
|
767
|
+
port: configuredPort,
|
|
764
768
|
database: _this.databaseName
|
|
765
|
-
},
|
|
769
|
+
}, dbConfig);
|
|
766
770
|
info('[config set]', _this);
|
|
767
771
|
return _context.abrupt("return", _this);
|
|
768
|
-
case
|
|
772
|
+
case 46:
|
|
769
773
|
case "end":
|
|
770
774
|
return _context.stop();
|
|
771
775
|
}
|
|
772
|
-
}, _callee, null, [[
|
|
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
|
|
790
|
-
|
|
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:
|
|
802
|
-
port:
|
|
803
|
-
},
|
|
809
|
+
host: _configuredHost,
|
|
810
|
+
port: _configuredPort
|
|
811
|
+
}, _dbConfig);
|
|
804
812
|
if (this.databaseName) {
|
|
805
813
|
this.db.database = this.databaseName;
|
|
806
814
|
}
|