@niledatabase/server 3.0.0-alpha.2 → 3.0.0-alpha.21
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/Api.d.ts +22 -0
- package/dist/Server.d.ts +2 -25
- package/dist/api/routes/auth/callback.d.ts +2 -1
- package/dist/api/routes/auth/csrf.d.ts +2 -1
- package/dist/api/routes/auth/error.d.ts +2 -1
- package/dist/api/routes/auth/providers.d.ts +2 -1
- package/dist/api/routes/auth/signin.d.ts +2 -1
- package/dist/api/routes/auth/signout.d.ts +2 -1
- package/dist/api/routes/tenants/GET.d.ts +3 -2
- package/dist/api/routes/tenants/POST.d.ts +3 -3
- package/dist/api/routes/tenants/[tenantId]/DELETE.d.ts +3 -3
- package/dist/api/routes/tenants/[tenantId]/GET.d.ts +37 -0
- package/dist/api/routes/tenants/[tenantId]/PUT.d.ts +38 -0
- package/dist/api/routes/tenants/[tenantId]/users/GET.d.ts +3 -3
- package/dist/api/routes/tenants/[tenantId]/users/POST.d.ts +3 -2
- package/dist/api/routes/tenants/[tenantId]/users/PUT.d.ts +4 -5
- package/dist/api/routes/tenants/[tenantId]/users/[userId]/DELETE.d.ts +5 -5
- package/dist/api/routes/users/GET.d.ts +3 -2
- package/dist/api/routes/users/POST.d.ts +3 -3
- package/dist/api/routes/users/[userId]/PUT.d.ts +3 -2
- package/dist/api/utils/request.d.ts +1 -1
- package/dist/api/utils/routes/apiRoutes.d.ts +2 -1
- package/dist/api/utils/routes/makeRestUrl.d.ts +2 -1
- package/dist/api/utils/routes/proxyRoutes.d.ts +2 -1
- package/dist/db/DBManager.d.ts +1 -0
- package/dist/db/NileInstance.d.ts +1 -1
- package/dist/server.cjs.development.js +2790 -2485
- 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 +2791 -2486
- package/dist/server.esm.js.map +1 -1
- package/dist/tenants/index.d.ts +7 -3
- package/dist/types.d.ts +8 -0
- package/dist/users/index.d.ts +7 -7
- package/dist/utils/Config/envVars.d.ts +1 -2
- package/dist/utils/Config/index.d.ts +8 -8
- package/dist/utils/Event/index.d.ts +0 -1
- package/dist/utils/Logger.d.ts +5 -4
- package/dist/utils/Requester/index.d.ts +5 -5
- package/dist/utils/Requester/types.d.ts +1 -1
- package/package.json +2 -2
- package/dist/utils/Server/index.d.ts +0 -4
|
@@ -1 +1 @@
|
|
|
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/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/auth/index.ts","../src/api/utils/routes/defaultRoutes.ts","../src/api/utils/routes/makeRestUrl.ts","../src/api/utils/routes/apiRoutes.ts","../src/api/utils/routes/urlMatches.ts","../src/api/utils/request.ts","../src/api/routes/me/index.ts","../src/api/utils/auth.ts","../src/api/routes/users/POST.ts","../src/api/routes/users/GET.ts","../src/api/routes/users/[userId]/PUT.ts","../src/api/routes/users/index.ts","../src/api/routes/tenants/[tenantId]/users/GET.ts","../src/api/routes/tenants/[tenantId]/users/POST.ts","../src/api/routes/tenants/[tenantId]/users/[userId]/DELETE.ts","../src/api/routes/tenants/[tenantId]/users/PUT.ts","../src/api/routes/tenants/[tenantId]/users/index.ts","../src/api/routes/tenants/GET.ts","../src/api/routes/tenants/[tenantId]/DELETE.ts","../src/api/routes/tenants/POST.ts","../src/api/routes/tenants/index.ts","../src/api/utils/routes/proxyRoutes.ts","../src/api/routes/auth/signin.ts","../src/api/routes/auth/session.ts","../src/api/routes/auth/providers.ts","../src/api/routes/auth/csrf.ts","../src/api/routes/auth/callback.ts","../src/api/routes/auth/signout.ts","../src/api/routes/auth/error.ts","../src/Server.ts","../src/api/handlers/index.ts","../src/api/handlers/GET.ts","../src/api/handlers/POST.ts","../src/api/handlers/DELETE.ts","../src/api/handlers/PUT.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 getDatabaseId = (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 if (process.env.NILEDB_POSTGRES_URL) {\n const pgUrl = new URL(process.env.NILEDB_POSTGRES_URL);\n return pgUrl.pathname.substring(1);\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, 'NILEDB_USER', 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, 'NILEDB_PASSWORD', 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, 'NILEDB_TOKEN', 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, 'NILEDB_NAME', 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, 'NILEDB_TENANT', process.env.NILEDB_TENANT);\n return process.env.NILEDB_TENANT;\n }\n\n return null;\n};\n\nexport const getLocal = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n if (process.env.NILEDB_LOCAL) {\n const { info } = Logger(config, '[local]');\n logger && info(logger, 'NILEDB_LOCAL', process.env.NILEDB_LOCAL);\n const apiUrl = new URL(process.env.NILEDB_LOCAL);\n return apiUrl.href;\n }\n return 'http://localhost:3000';\n};\n/**\n * @param cfg various overrides\n * @returns the url for REST to use\n */\nexport const getBasePath = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[basePath]');\n const basePath = config?.api?.basePath;\n let version = '';\n if (!/\\/v\\d\\//.test(String(basePath))) {\n version =\n config?.api?.version === 1 ? '' : `/v${config?.api?.version ?? 2}`;\n }\n if (basePath) {\n logger && info(logger, 'config', basePath);\n return `${basePath}${version}`;\n }\n\n if (process.env.NILEDB_API_URL) {\n logger && info(logger, 'NILEDB_API_URL', process.env.NILEDB_API_URL);\n const apiUrl = new URL(process.env.NILEDB_API_URL);\n return apiUrl.href;\n }\n\n throw new Error('NILEDB_API_URL is missing.');\n};\n\nexport const getControlPlane = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[basePath]');\n\n if (process.env.NILEDB_CONFIGURE) {\n logger && info(logger, 'NILEDB_CONFIGURE', process.env.NILEDB_CONFIGURE);\n return process.env.NILEDB_CONFIGURE;\n }\n\n logger && info(logger, 'default', process.env.NILEDB_CONFIGURE);\n return 'https://global.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_POSTGRES_URL) {\n const pgUrl = new URL(process.env.NILEDB_POSTGRES_URL);\n logger && info(logger, 'NILEDB_POSTGRES_URL', pgUrl.host);\n return pgUrl.host;\n }\n\n if (process.env.NILEDB_HOST) {\n logger && info(logger, 'NILEDB_HOST', 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 unsubscribe(eventName: string, callback: EventFn) {\n const toRemove = this.events[eventName].findIndex((cb) => cb === callback);\n if (toRemove !== -1) {\n this.events[eventName].splice(toRemove, 1);\n }\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);\n\nexport const closeEvictPool = (cb: EventFn) =>\n eventer.unsubscribe(Events.EvictPool, cb);\n\nexport const evictPool = (val: BusValues) => {\n eventer.publish(Events.EvictPool, val);\n};\n","import { Database, NilePoolConfig, ServerConfig } from '../../types';\nimport Logger from '../Logger';\n\nimport {\n EnvConfig,\n getBasePath,\n getControlPlane,\n getDatabaseName,\n getDatabaseId,\n getDbHost,\n getDbPort,\n getInfoBearer,\n getPassword,\n getTenantId,\n getToken,\n getUsername,\n getLocal,\n} from './envVars';\n\nexport type ConfigRoutes = {\n SIGNIN?: string;\n SESSION?: string;\n PROVIDERS?: string;\n CSRF?: string;\n CALLBACK?: string;\n SIGNOUT?: string;\n ME?: string;\n ERROR?: string;\n};\n\nclass ApiConfig {\n public cookieKey?: string;\n public basePath?: string;\n public version?: number;\n public localPath?: string;\n private _token?: string;\n constructor({\n basePath,\n cookieKey,\n token,\n version,\n localPath,\n }: {\n basePath: string;\n cookieKey: string;\n token: string | undefined;\n version: number;\n localPath: string;\n }) {\n this.basePath = basePath;\n this.cookieKey = cookieKey;\n this.version = version;\n this._token = token;\n this.localPath = localPath ?? 'http://localhost:3000';\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 routePrefix?: string;\n routes?: ConfigRoutes;\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, logger?: string) {\n const envVarConfig: EnvConfig = { config, logger };\n this.user = getUsername(envVarConfig) as string;\n this.password = getPassword(envVarConfig) as string;\n if (process.env.NODE_ENV !== 'TEST') {\n if (!this.user) {\n throw new Error(\n 'User is required. Set NILEDB_USER as an environment variable or set `user` in the config options.'\n );\n }\n if (!this.password) {\n throw new Error(\n 'Password is required. Set NILEDB_PASSWORD as an environment variable or set `password` in the config options.'\n );\n }\n }\n\n this.databaseId = getDatabaseId(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 version: config?.api?.version ?? 2,\n localPath: getLocal(envVarConfig),\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('Already configured, aborting fetch');\n return this;\n }\n\n let basePath = getBasePath(envVarConfig);\n const cp = getControlPlane(envVarConfig);\n\n const databaseName = getDatabaseName({ config, logger: 'getInfo' });\n const url = new URL(`${cp}/databases/configure`);\n if (databaseName) {\n url.searchParams.set('databaseName', databaseName);\n }\n info('configuring from', 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 occurred');\n } else {\n throw new Error(\n 'Unable to auto-configure. Please remove NILEDB_NAME, NILEDB_API_URL, NILEDB_POSTGRES_URL, and/or NILEDB_HOST from your environment variables.'\n );\n }\n }\n if (typeof database === 'object') {\n const { apiHost, dbHost, name, id } = database;\n const duckApiHost = getBasePath(envVarConfig) || apiHost; // this needs changed in the control plane response\n this.databaseId = id;\n this.databaseName = name;\n const dburl = new URL(dbHost);\n configuredHost = dburl.host;\n basePath = duckApiHost;\n }\n }\n delete envVarConfig.config?.api?.basePath;\n basePath = getBasePath(envVarConfig);\n this.api = new ApiConfig({\n basePath,\n cookieKey: config?.api?.cookieKey ?? 'token',\n token: getToken({ config }),\n version: config?.api?.version ?? 2,\n localPath: getLocal(envVarConfig),\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 = 'niledb-tenant-id';\nexport const X_NILE_USER_ID = 'niledb-user-id';\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, X_NILE_TENANT);\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(opts?.headers);\n basicHeaders.set('content-type', 'application/json; charset=utf-8');\n\n const creds = Buffer.from(\n `${process.env.NILEDB_USER}:${process.env.NILEDB_PASSWORD}`,\n 'utf8'\n ).toString('base64');\n\n basicHeaders.set('niledb-creds', creds);\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 try {\n info('[fetch]', '[response]', await response.clone().json());\n } catch (e) {\n info('[fetch]', '[response]', await response.clone().text());\n }\n }\n return response;\n }\n if (response?.status === 401) {\n return new ResponseError('Unauthorized', { status: 401 });\n }\n if (response?.status === 405) {\n return new ResponseError('Method not allowed', { status: 405 });\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 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 = 'DELETE' | '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 delete = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('DELETE', url, req, init);\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 headers?: Headers;\n constructor(config: Config, headers?: Headers) {\n super(config);\n this.headers = headers;\n }\n\n get usersUrl() {\n return '/users';\n }\n\n get tenantUsersUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}/users`;\n }\n handleHeaders(init?: RequestInit) {\n if (this.headers) {\n if (init) {\n init.headers = new Headers({ ...this.headers, ...init?.headers });\n return init;\n } else {\n init = {\n headers: this.headers,\n };\n return init;\n }\n }\n return undefined;\n }\n\n createUser = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<LoginUserResponse> => {\n const _requester = new Requester(this);\n\n const _init = this.handleHeaders(init);\n return await _requester.post(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 const _init = this.handleHeaders(init);\n return await _requester.put(req, `${this.usersUrl}/${userId}`, _init);\n };\n\n listUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): NileResponse<User[]> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return await _requester.get(req, this.tenantUsersUrl, _init);\n };\n\n linkUser = async (\n req: NileRequest<{ id: string }> | Headers,\n init?: RequestInit\n ): NileResponse<User[]> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return await _requester.put(req, this.tenantUsersUrl, _init);\n };\n\n tenantUsersDeleteUrl = (userId?: string) => {\n return `/tenants/${this.tenantId ?? '{tenantId}'}/users/${\n userId ?? '{userId}'\n }`;\n };\n\n getUserId = async (req: Headers | NileRequest<{ id: string }>) => {\n if (req instanceof Request) {\n const body = await new Response(req?.body).json();\n if (body) {\n return body.id;\n }\n }\n if ('id' in req) {\n return req.id;\n }\n return null;\n };\n\n unlinkUser = async (\n req: NileRequest<{ id: string }> | Headers,\n init?: RequestInit\n ): NileResponse<User[]> => {\n const _requester = new Requester(this);\n const userId = await this.getUserId(req);\n const _init = this.handleHeaders(init);\n return await _requester.delete(\n req,\n this.tenantUsersDeleteUrl(userId),\n _init\n );\n };\n\n get meUrl() {\n return '/me';\n }\n\n me = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<User> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\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 headers?: Headers;\n constructor(config: Config, headers?: Headers) {\n super(config);\n this.headers = headers;\n }\n handleHeaders(init?: RequestInit) {\n if (this.headers) {\n if (init) {\n init.headers = new Headers({ ...this.headers, ...init?.headers });\n return init;\n } else {\n init = {\n headers: this.headers,\n };\n return init;\n }\n }\n return undefined;\n }\n get tenantsUrl() {\n return '/tenants';\n }\n get tenantUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}`;\n }\n\n createTenant = async (\n req: NileRequest<{ name: string }>,\n init?: RequestInit\n ): NileResponse<Tenant> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\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 const _init = this.handleHeaders(init);\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.db);\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) => {\n const { error } = Logger(config, '[after create callback]');\n if (err) {\n error('after create failed', err);\n evictPool(this.id);\n }\n });\n\n this.startTimeout();\n });\n this.pool.on('error', async (e) => {\n info('pool failed', e);\n if (this.timer) {\n clearTimeout(this.timer);\n }\n evictPool(this.id);\n });\n }\n\n startTimeout() {\n const { info } = Logger(this.config, '[NileInstance]');\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(async () => {\n info(\n 'Pool reached idleTimeoutMillis.',\n this.id,\n 'evicted after',\n this.config.db.idleTimeoutMillis,\n 'ms'\n );\n await this.pool.end(() => {\n info('Pool end called');\n // something odd going on here. Without the callback, pool.end() is flakey\n });\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 { closeEvictPool, 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 cleared: boolean;\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.cleared = false;\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(this.poolWatcher(config));\n }\n poolWatcher = (config: ServerConfig) => (id: undefined | null | string) => {\n const { info } = Logger(config, '[DBManager]');\n if (id && this.connections.has(id)) {\n info('Removing', id, 'from db connection pool.');\n this.connections.delete(id);\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 existing.startTimeout();\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 // resume listening to the evict pool if a connection is requested.\n if (this.cleared) {\n this.cleared = false;\n watchEvictPool(this.poolWatcher(config));\n }\n return newOne.pool;\n };\n\n clear = (config: ServerConfig) => {\n const { info } = Logger(config, '[DBManager]');\n info('Clearing all connections', this.connections.size);\n closeEvictPool(this.poolWatcher(config));\n this.cleared = true;\n this.connections.clear();\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 { Config } from '../utils/Config';\n\n/**\n * a helper function to log in server side.\n */\nexport default function serverAuth(\n config: Config,\n handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n }\n) {\n return async function login({\n email,\n password,\n }: {\n email: string;\n password: string;\n }) {\n const sessionUrl = new URL(`${config.api.localPath}/api/auth/providers`);\n const sessionReq = new Request(sessionUrl, {\n method: 'GET',\n headers: new Headers({\n host: sessionUrl.host,\n }),\n });\n const sessionRes = await handlers.POST(sessionReq);\n const providers = await sessionRes?.json();\n\n const csrf = new URL(`${config.api.localPath}/api/auth/csrf`);\n const csrfReq = new Request(csrf, {\n method: 'GET',\n headers: new Headers({\n host: sessionUrl.host,\n }),\n });\n const csrfRes = await handlers.POST(csrfReq);\n\n const { csrfToken } = (await csrfRes?.json()) ?? {};\n const { credentials } = providers;\n\n const csrfCookie = csrfRes?.headers.get('set-cookie');\n expect(csrfCookie).toContain('nile.csrf-token=');\n\n const signInUrl = new URL(credentials.callbackUrl);\n\n if (!csrfCookie) {\n throw new Error('unable to authenticate REST');\n }\n const postReq = new Request(signInUrl, {\n method: 'POST',\n headers: new Headers({\n 'content-type': 'application/json',\n cookie: csrfCookie,\n }),\n body: JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n }),\n });\n const loginRes = await handlers.POST(postReq);\n const authCookie = loginRes?.headers.get('set-cookie');\n if (!authCookie) {\n throw new Error('authentication failed');\n }\n expect(authCookie).toContain('nile.session-token=');\n const [, token] = /(nile\\.session-token=.+?);/.exec(authCookie) ?? [];\n return new Headers({\n cookie: [token, csrfCookie].join('; '),\n });\n };\n}\n","import { Routes } from '../../types';\n\nexport const appRoutes = (prefix = '/api'): Routes => ({\n SIGNIN: `${prefix}/auth/signin`,\n PROVIDERS: `${prefix}/auth/providers`,\n SESSION: `${prefix}/auth/session`,\n CSRF: `${prefix}/auth/csrf`,\n CALLBACK: `${prefix}/auth/callback`,\n SIGNOUT: `${prefix}/auth/signout`,\n ERROR: `${prefix}/auth/error`,\n ME: `${prefix}/me`,\n USERS: `${prefix}/users`,\n TENANTS: `${prefix}/tenants`,\n TENANT_USER: `${prefix}/tenants/{tenantId}/users/{userId}`,\n TENANT_USERS: `${prefix}/tenants/{tenantId}/users`,\n SIGNUP: `${prefix}/signup`,\n});\n","const NILEDB_API_URL = process.env.NILEDB_API_URL;\n\nexport function makeRestUrl(path: string, qp?: Record<string, string>) {\n if (!NILEDB_API_URL) {\n throw new Error('An API url is required. Set it via NILEDB_API_URL.');\n }\n const params = new URLSearchParams(qp);\n return `${[NILEDB_API_URL, path.substring(1, path.length)].join('/')}${\n qp ? `?${params.toString()}` : ''\n }`;\n}\n","import { makeRestUrl } from './makeRestUrl';\n\ntype ApiRouteKeys = keyof typeof apiRoutes;\nexport type ApiRoutePaths = (typeof apiRoutes)[ApiRouteKeys];\nexport const apiRoutes = {\n ME: makeRestUrl('/me'),\n USERS: (tenantId?: string) =>\n makeRestUrl('/users', tenantId ? { tenantId } : undefined),\n USER: (userId: string) => makeRestUrl(`/users/${userId}`),\n TENANTS: makeRestUrl('/tenants'),\n TENANT: (tenantId: string) => makeRestUrl(`/tenants/${tenantId}`),\n SIGNUP: makeRestUrl('/signup'),\n TENANT_USERS: (tenantId: string) => makeRestUrl(`/tenants/${tenantId}/users`),\n TENANT_USER: (tenantId: string, userId: string) =>\n makeRestUrl(`/tenants/${tenantId}/users/${userId}`),\n USER_TENANTS: (userId: string) => makeRestUrl(`/users/${userId}/tenants`),\n};\n","export default function urlMatches(requestUrl: string, route: string) {\n const url = new URL(requestUrl);\n return url.pathname.startsWith(route);\n}\n","const { log } = console;\nimport { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nexport default async function request(\n url: string,\n _init: RequestInit & { request: Request },\n config?: Config\n) {\n const { info, error } = Logger(\n { ...config, debug: config?.debug },\n '[REQUEST]',\n `[${url}]`\n );\n const { request, ...init } = _init;\n const requestUrl = new URL(request.url);\n const updatedHeaders = new Headers(request.headers);\n\n updatedHeaders.set('host', requestUrl.host);\n updatedHeaders.set('niledb-origin', requestUrl.origin);\n updatedHeaders.set(\n 'niledb-creds',\n Buffer.from(\n `${process.env.NILEDB_USER}:${process.env.NILEDB_PASSWORD}`\n ).toString('base64')\n );\n const params = { ...init, headers: updatedHeaders };\n if (params.method === 'POST' || params.method === 'PUT') {\n params.body = init.body ?? request.body;\n // @ts-expect-error - its there\n params.duplex = 'half';\n }\n\n log(`[${params.method ?? 'GET'}]`, url);\n const res = await fetch(url, { ...params }).catch((e) => {\n error('An error has occurred in the fetch', e);\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n });\n const loggingRes = typeof res?.clone === 'function' ? res?.clone() : null;\n info('[Response]', res?.status, res?.statusText, await loggingRes?.text());\n return res;\n}\n","import Logger from '../../../utils/Logger';\nimport { Routes } from '../../types';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\n\nconst key = 'ME';\nconst url = apiRoutes[key];\n\n/**\n * @swagger\n * /api/me:\n * get:\n * summary: Identify the principal\n * description: Returns information about the principal associated with the session\n * provided\n * operationId: me\n * responses:\n * \"200\":\n * description: Identified user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nasync function GET(\n init: RequestInit & { request: Request },\n log: (...args: string[]) => void\n) {\n log('[GET]', url);\n const res = await request(url, init);\n return res;\n}\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug },\n '[ROUTES]',\n `[${key}]`\n );\n\n switch (request.method) {\n case 'GET':\n return await GET({ request }, info);\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nimport request from './request';\n\nexport type ActiveSession = {\n id: string;\n email: string;\n expires: Date;\n user?: {\n id: string;\n name: string;\n image: string;\n email: string;\n emailVerified: void | Date;\n };\n};\nexport default async function auth(\n req: Request,\n config: Config\n): Promise<void | ActiveSession> {\n const { info } = Logger({ ...config, debug: config.debug }, '[nileauth]');\n info('checking auth');\n\n const sessionUrl = `${config.api.basePath}/auth/session`;\n info('using session', sessionUrl);\n // handle the pass through with posts\n req.headers.delete('content-length');\n\n const res = await request(sessionUrl, { request: req });\n if (!res) {\n info('no session found');\n return undefined;\n }\n info('session active');\n return await new Response(res.body).json();\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport { ActiveSession } from '../../utils/auth';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n/**\n * @swagger\n * /api/users:\n * post:\n * tags:\n * - users\n * summary: Creates a user\n * description: Creates a user in the database\n * operationId: createUser\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function POST(\n session: void | ActiveSession,\n init: RequestInit & { request: Request },\n log?: (...args: string[]) => void\n) {\n if (!session) {\n return new Response(null, { status: 401 });\n }\n init.body = init.request.body;\n init.method = 'POST';\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n const url = apiRoutes.USERS(tenant ? tenant : undefined);\n log && log('[POST]', url);\n\n return await request(url, init);\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/users:\n * get:\n * tags:\n * - users\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided. You can also pass the a `niledb-tenant-id` in the header or in a cookie.\n * operationId: listUsers\n * parameters:\n * - name: tenantId\n * in: query\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/TenantUser'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n init: RequestInit & { request: Request },\n log: (...args: string[]) => void\n) {\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n if (!tenant) {\n log('[GET]', '[ERROR]', 'No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n const url = apiRoutes.TENANT_USERS(tenant);\n log('[GET]', url);\n init.method = 'GET';\n return await request(url, init);\n}\n","import { apiRoutes } from '../../../utils/routes/apiRoutes';\nimport fetch from '../../../utils/request';\nimport { ActiveSession } from '../../../utils/auth';\n\n/**\n * @swagger\n * /api/users/{userid}:\n * put:\n * tags:\n * - users\n * summary: update a user\n * description: updates a user within the tenant\n * operationId: updateUser\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * Update a user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/UpdateUserRequest'\n * responses:\n * \"200\":\n * description: An updated user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n session: void | ActiveSession,\n init: RequestInit & { request: Request },\n log: (...args: string[]) => void\n) {\n if (!session) {\n return new Response(null, { status: 401 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n\n // update the user\n\n const [userId] = new URL(init.request.url).pathname.split('/').reverse();\n\n const url = apiRoutes.USER(userId);\n\n log('[PUT]', url);\n\n return await fetch(url, init);\n}\n","import { Routes } from '../../types';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport auth from '../../utils/auth';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\n\nimport { POST } from './POST';\nimport { GET } from './GET';\nimport { PUT } from './[userId]/PUT';\n\nconst key = 'USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug },\n '[ROUTES]',\n `[${key}]`\n );\n const session = await auth(request, config);\n\n switch (request.method) {\n case 'GET':\n return await GET({ request }, info);\n case 'POST':\n return await POST(session, { request }, info);\n case 'PUT':\n return await PUT(session, { request }, info);\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { apiRoutes } from '../../../../utils/routes/apiRoutes';\nimport { ActiveSession } from '../../../../utils/auth';\nimport request from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * get:\n * tags:\n * - users\n * summary: List tenant users\n * description: Lists users that are associated with the specified tenant.\n * operationId: listTenantUsers\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: Users found\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/User'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n session: ActiveSession,\n init: RequestInit & { request: Request },\n log: (...args: string[]) => void\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n const url = `${apiRoutes.TENANT_USERS(tenantId)}`;\n log('[GET]', '[TENANT_USERS]', url);\n return await request(url, init);\n}\n","import { ActiveSession } from '../../../../utils/auth';\nimport fetch from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * post:\n * tags:\n * - users\n * summary: Create a user in a tenant\n * description: Creates a new user and associates that user with the specified\n * tenant.\n * operationId: createTenantUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n */\nexport async function POST(\n session: ActiveSession,\n init: RequestInit & { request: Request },\n log: (...args: string[]) => void\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n init.body = JSON.stringify({ email: session.email });\n init.method = 'PUT';\n const url = apiRoutes.TENANT_USERS(tenantId);\n log('[PUT]', url);\n\n return await fetch(url, init);\n}\n","import { apiRoutes } from '../../../../../utils/routes/apiRoutes';\nimport fetch from '../../../../../utils/request';\nimport { ActiveSession } from '../../../../../utils/auth';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{userId}:\n * delete:\n * tags:\n * - tenants\n * summary: removes a user from a tenant\n * description: removes an associated user from a specified\n * tenant.\n * operationId: unlinkUser \n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * - name: userId \n * in: path\n * required: true\n * schema:\n * type: string\n \n * responses:\n * \"204\":\n * description: User removed\n */\n\nexport async function DELETE(\n session: ActiveSession,\n init: RequestInit & { request: Request },\n log: (...args: string[]) => void\n) {\n const yurl = new URL(init.request.url);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [userId, _, tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'DELETE';\n const url = `${apiRoutes.TENANT_USER(tenantId, userId)}`;\n log('[DELETE]', url);\n\n return await fetch(url, init);\n}\n","import { apiRoutes } from '../../../../utils/routes/apiRoutes';\nimport fetch from '../../../../utils/request';\nimport { ActiveSession } from '../../../../utils/auth';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * put:\n * tags:\n * - tenants\n * summary: associates an existing user with the tenant\n * operationId: linkUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/AssociateUserRequest'\n * responses:\n * \"201\":\n * description: add user to tenant\n */\n\nexport async function PUT(\n session: ActiveSession,\n init: RequestInit & { request: Request },\n log: (...args: string[]) => void\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'PUT';\n const url = `${apiRoutes.TENANT_USERS(tenantId)}`;\n log('[PUT]', url);\n\n return await fetch(url, init);\n}\n","import { Config } from '../../../../../utils/Config';\nimport urlMatches from '../../../../utils/routes/urlMatches';\nimport { Routes } from '../../../../types';\nimport auth from '../../../../utils/auth';\nimport Logger from '../../../../../utils/Logger';\n\nimport { GET } from './GET';\nimport { POST } from './POST';\nimport { DELETE } from './[userId]/DELETE';\nimport { PUT } from './PUT';\n\nconst key = 'TENANT_USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug },\n '[ROUTES]',\n `[${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n\n switch (request.method) {\n case 'GET':\n return await GET(session, { request }, info);\n case 'POST':\n return await POST(session, { request }, info);\n case 'PUT':\n return await PUT(session, { request }, info);\n case 'DELETE':\n return await DELETE(session, { request }, info);\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [userId, possibleTenantId, tenantId] = url.pathname\n .split('/')\n .reverse();\n let route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{userId}', userId);\n if (userId === 'users') {\n route = configRoutes[key].replace('{tenantId}', possibleTenantId);\n }\n return urlMatches(request.url, route);\n}\n","import { ActiveSession } from '../../utils/auth';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants:\n * get:\n * tags:\n * - tenants\n * summary: list tenants by user\n * description: Creates a user in the database\n * operationId: listTenants\n * responses:\n * \"200\":\n * description: a list of tenants\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: \"#/components/schemas/Tenant\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n session: ActiveSession,\n init: RequestInit & { request: Request },\n log: (...args: string[]) => void\n) {\n let url = `${apiRoutes.USER_TENANTS(session.id)}`;\n if (typeof session === 'object' && 'user' in session && session.user) {\n url = `${apiRoutes.USER_TENANTS(session.user.id)}`;\n }\n log('[GET]', url);\n\n const res = await request(url, init);\n return res;\n}\n","import { ActiveSession } from '../../../utils/auth';\nimport fetch from '../../../utils/request';\nimport { apiRoutes } from '../../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * delete:\n * tags:\n * - tenants\n * summary: Deletes a tenant.\n * operationId: deleteTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"204\":\n * description: Tenant deleted\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function DELETE(\n session: ActiveSession,\n init: RequestInit & { request: Request },\n log: (...args: string[]) => void\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'DELETE';\n const url = `${apiRoutes.TENANT(tenantId)}`;\n log('[DELETE]', url);\n\n return await fetch(url, init);\n}\n","import { ActiveSession } from '../../utils/auth';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants:\n * post:\n * tags:\n * - tenants\n * summary: Create a tenant\n * description: Creates a new tenant in a database.\n * operationId: createTenant\n * requestBody:\n * description: A wrapper for the tenant name.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateTenantRequest'\n * examples:\n * Create Tenant Request:\n * summary: Creates a named tenant\n * description: Create Tenant Request\n * value:\n * name: My Sandbox\n * responses:\n * \"201\":\n * description: Tenant created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Database not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function POST(\n session: ActiveSession,\n init: RequestInit & { request: Request },\n log: (...args: string[]) => void\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes.TENANTS}`;\n log('[POST]', url);\n\n return await request(url, init);\n}\n","import { Config } from '../../../utils/Config';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\nimport auth from '../../utils/auth';\nimport Logger from '../../../utils/Logger';\n\nimport { GET } from './GET';\nimport { DELETE } from './[tenantId]/DELETE';\nimport { POST } from './POST';\n\nconst key = 'TENANTS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug },\n '[ROUTES]',\n `[${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n\n switch (request.method) {\n case 'GET':\n return await GET(session, { request }, info);\n case 'POST':\n return await POST(session, { request }, info);\n case 'DELETE':\n return await DELETE(session, { request }, info);\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { makeRestUrl } from './makeRestUrl';\n\nexport const proxyRoutes = {\n SIGNIN: makeRestUrl('/auth/signin'),\n PROVIDERS: makeRestUrl('/auth/providers'),\n SESSION: makeRestUrl('/auth/session'),\n CSRF: makeRestUrl('/auth/csrf'),\n CALLBACK: makeRestUrl('/auth/callback'),\n SIGNOUT: makeRestUrl('/auth/signout'),\n ERROR: makeRestUrl('/auth/error'),\n};\n\ntype ProxyKeys = keyof typeof proxyRoutes;\n\nexport type ProxyPaths = (typeof proxyRoutes)[ProxyKeys];\n","/**\n * @swagger\n * /api/auth/signin:\n * get:\n * tags:\n * - authentication\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided\n * operationId: signin\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nimport { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\n\nconst key = 'SIGNIN';\n\nexport default async function route(req: Request) {\n let url = proxyRoutes[key];\n\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n };\n if (req.method === 'POST') {\n if (typeof req.clone === 'function') {\n init.body = req.clone().body;\n }\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n\n url = `${proxyRoutes[key]}/${provider}`;\n }\n\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n\n url = `${url}${params.toString() !== '' ? `?${params.toString()}` : ''}`;\n\n const res = await request(url, { ...init, request: req });\n\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes.SESSION,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.SESSION);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\n\nexport default async function route(req: Request) {\n return request(proxyRoutes.PROVIDERS, {\n method: req.method,\n request: req,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PROVIDERS);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\n\nexport default async function route(req: Request) {\n return request(proxyRoutes.CSRF, {\n method: req.method,\n request: req,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CSRF);\n}\n","import { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport fetch from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\n\nconst { log, error } = console;\nexport default async function route(request: Request) {\n const [provider] = new URL(request.url).pathname.split('/').reverse();\n const passThroughUrl = new URL(request.url);\n const params = new URLSearchParams(passThroughUrl.search);\n const url = `${proxyRoutes.CALLBACK}/${provider}${\n params.toString() !== '' ? `?${params.toString()}` : ''\n }`;\n\n const res = await fetch(url, {\n request,\n method: request.method,\n }).catch((e) => {\n error('an error has occurred in callback');\n log(e);\n });\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CALLBACK);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport fetch from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\n\nconst key = 'SIGNOUT';\nexport default async function route(request: Request) {\n let url = proxyRoutes[key];\n\n const init: RequestInit = {\n method: request.method,\n };\n if (request.method === 'POST') {\n init.body = request.body;\n const [provider] = new URL(request.url).pathname.split('/').reverse();\n url = `${proxyRoutes[key]}/${provider}`;\n }\n\n const res = await fetch(url, { ...init, request });\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\n\nconst key = 'ERROR';\nexport default async function route(req: Request) {\n return request(proxyRoutes[key], {\n method: req.method,\n request: req,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Pool } from 'pg';\n\nimport { ServerConfig } from './types';\nimport { Config } from './utils/Config';\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';\nimport serverAuth from './auth';\nimport { appRoutes } from './api/utils/routes/defaultRoutes';\nimport Handlers from './api/handlers';\nimport { Routes } from './api/types';\n\nclass Api {\n config: Config;\n users: Users;\n tenants: Tenants;\n routes: Routes;\n handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n };\n constructor(config: Config) {\n this.config = config;\n this.users = new Users(config);\n this.tenants = new Tenants(config);\n this.routes = {\n ...appRoutes(config?.routePrefix),\n ...config?.routes,\n };\n this.handlers = Handlers(this.routes, config);\n }\n\n set headers(headers: Headers) {\n this.users = new Users(this.config, headers);\n this.tenants = new Tenants(this.config, headers);\n }\n async login(payload: { email: string; password: string }) {\n this.headers = await serverAuth(this.config, this.handlers)(payload);\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, '[initial config]');\n this.servers = new Map();\n this.api = new Api(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\n this.manager.clear(this.config);\n this.manager = new DbManager(this.config);\n this.api = new Api(this.config);\n return this;\n }\n\n set databaseId(val: string | void) {\n if (val) {\n this.config.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.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.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.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 // propagate 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","import { Config } from '../../utils/Config';\nimport { Routes } from '../types';\n\nimport getter from './GET';\nimport poster from './POST';\nimport deleter from './DELETE';\nimport puter from './PUT';\n\nexport default function Handlers(configRoutes: Routes, config: Config) {\n const GET = getter(configRoutes, config);\n const POST = poster(configRoutes, config);\n const DELETE = deleter(configRoutes, config);\n const PUT = puter(configRoutes, config);\n return {\n GET,\n POST,\n DELETE,\n PUT,\n };\n}\n","import me, { matches as matchesMe } from '../routes/me';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport { Routes } from '../types';\nimport * as authRoutes from '../routes/auth';\nimport { Config } from '../../utils/Config';\n\nexport default function GETTER(configRoutes: Routes, config: Config) {\n return async function GET(req: Request) {\n if (matchesMe(configRoutes, req)) {\n return me(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n return users(req, config);\n }\n\n if (matchesTenantUsers(configRoutes, req)) {\n return tenantUsers(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n return authRoutes.handleSignIn(req);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n return authRoutes.handleProviders(req);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n return authRoutes.handleCsrf(req);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n return authRoutes.handleCallback(req);\n }\n if (authRoutes.matchSignOut(configRoutes, req)) {\n return authRoutes.handleSignOut(req);\n }\n if (authRoutes.matchError(configRoutes, req)) {\n return authRoutes.handleError(req);\n }\n return new Response(null, { status: 404 });\n };\n}\n","import users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\nimport * as authRoutes from '../routes/auth';\n\nexport default function POSTER(configRoutes: Routes, config: Config) {\n return async function POST(req: Request) {\n // order matters for tenantUsers\n if (matchesTenantUsers(configRoutes, req)) {\n return tenantUsers(req, config);\n }\n\n if (matchesUsers(configRoutes, req)) {\n return users(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n return authRoutes.handleSignIn(req);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n return authRoutes.handleProviders(req);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n return authRoutes.handleCsrf(req);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n return authRoutes.handleCallback(req);\n }\n if (authRoutes.matchSignOut(configRoutes, req)) {\n return authRoutes.handleSignOut(req);\n }\n return new Response(null, { status: 404 });\n };\n}\n","import tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantsUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function DELETER(configRoutes: Routes, config: Config) {\n return async function DELETE(req: Request) {\n if (matchesTenantsUsers(configRoutes, req)) {\n return tenantUsers(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n return tenants(req, config);\n }\n return new Response(null, { status: 404 });\n };\n}\n","import users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function PUTER(configRoutes: Routes, config: Config) {\n return async function PUT(req: Request) {\n if (matchesTenantUsers(configRoutes, req)) {\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n return users(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n return tenants(req, config);\n }\n return new Response(null, { status: 404 });\n };\n}\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","getLocal","NILEDB_LOCAL","_Logger7","URL","href","getBasePath","_config$api4","_config$api5","_config$api$version","_config$api6","basePath","version","test","NILEDB_API_URL","Error","getControlPlane","NILEDB_CONFIGURE","getDbHost","db","host","NILEDB_POSTGRES_URL","pgUrl","NILEDB_HOST","getDbPort","_config$db","_config$db2","port","Number","NILEDB_PORT","Events","ApiConfig","_createClass","_ref","cookieKey","localPath","this","_token","key","get","set","value","Config","_config$api$cookieKey2","_config$api$version2","_this","databaseId","routePrefix","routes","_tenantId","_userId","configure","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_envVarConfig$config","_config$api$cookieKey","_Logger","envVarConfig","_ref3","dbConfig","configuredHost","configuredPort","cp","url","res","database","possibleError","json","message","_database","apiHost","dbHost","name","id","duckApiHost","dburl","wrap","_context","prev","next","_objectWithoutPropertiesLoose","_excluded","abrupt","searchParams","fetch","headers","Authorization","sent","clone","status","t0","text","_extends","stop","_x","pathname","substring","NILEDB_ID","getDatabaseId","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","unsubscribe","toRemove","findIndex","cb","splice","updateTenantId","Tenant","updateUserId","User","watchEvictPool","EvictPool","evictPool","val","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","creds","useableUrl","errorHandler","msg","_message","Headers","Buffer","from","toString","includes","replace","encodeURIComponent","e","t1","t2","t3","t4","t5","errors","Requester","_Config","call","post","req","request","_callee2","_context2","_x4","_x5","_x6","put","_callee3","_context3","_x7","_x8","_x9","_callee4","_context4","_x10","_x11","_x12","_inheritsLoose","rawRequest","_rawRequest","_callee5","method","_init","_context5","_x13","_x14","_x15","_x16","_request","_callee6","_headers","_context6","Request","JSON","stringify","undefined","Object","values","_x17","_x18","_x19","_x20","Users","createUser","_requester","handleHeaders","usersUrl","updateUser","listUsers","tenantUsersUrl","linkUser","tenantUsersDeleteUrl","_this$tenantId","getUserId","_ref5","unlinkUser","_ref6","me","_ref7","_callee7","_context7","meUrl","_init2","_this$tenantId2","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","_Logger2","clearTimeout","_this2","setTimeout","end","_Logger4","conn","query","DBManager","connections","cleared","poolWatcher","has","getConnection","makeId","existing","size","newOne","clear","Map","makeServerId","serverAuth","handlers","_login","_yield$csrfRes$json","_exec","email","sessionUrl","sessionReq","sessionRes","providers","csrf","csrfReq","csrfRes","csrfToken","credentials","csrfCookie","signInUrl","postReq","loginRes","authCookie","POST","expect","toContain","callbackUrl","exec","makeRestUrl","qp","URLSearchParams","apiRoutes","ME","USERS","USER","TENANTS","TENANT","SIGNUP","TENANT_USERS","TENANT_USER","USER_TENANTS","urlMatches","requestUrl","route","startsWith","log","_params$method","updatedHeaders","_init$body","loggingRes","origin","duplex","statusText","GET","_GET","_route","matches","configRoutes","auth","_auth","_POST","session","yurl","tenant","PUT","_PUT","_URL$pathname$split$r","reverse","_yurl$pathname$split$","DELETE","_DELETE","_","_url$pathname$split$r","possibleTenantId","proxyRoutes","SIGNIN","PROVIDERS","SESSION","CSRF","CALLBACK","SIGNOUT","ERROR","passThroughUrl","search","provider","Api","prefix","users","tenants","appRoutes","matchesMe","matchesUsers","matchesTenantUsers","tenantUsers","matchesTenants","authRoutes","getter","poster","matchesTenantsUsers","deleter","puter","Handlers","login","payload","Server","manager","servers","DbManager","Token","_proto2","setConfig","getInstance","_config","serverId","getServerId","updatedConfig","_this$config","create","_create","server"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.cjs.production.min.js","sources":["../src/utils/Logger.ts","../src/utils/Config/envVars.ts","../src/utils/Event/index.ts","../src/utils/Config/index.ts","../src/db/NileInstance.ts","../src/db/PoolProxy.ts","../src/db/DBManager.ts","../src/api/utils/routes/makeRestUrl.ts","../src/api/utils/routes/apiRoutes.ts","../src/api/utils/routes/urlMatches.ts","../src/api/utils/request.ts","../src/api/routes/me/index.ts","../src/api/utils/auth.ts","../src/utils/ResponseError.ts","../src/utils/fetch.ts","../src/api/routes/users/POST.ts","../src/api/routes/users/GET.ts","../src/api/routes/users/[userId]/PUT.ts","../src/api/routes/users/index.ts","../src/api/routes/tenants/[tenantId]/users/GET.ts","../src/api/routes/tenants/[tenantId]/users/POST.ts","../src/api/routes/tenants/[tenantId]/users/[userId]/DELETE.ts","../src/api/routes/tenants/[tenantId]/users/PUT.ts","../src/api/routes/tenants/[tenantId]/users/index.ts","../src/api/routes/tenants/GET.ts","../src/api/routes/tenants/[tenantId]/GET.ts","../src/api/routes/tenants/[tenantId]/DELETE.ts","../src/api/routes/tenants/[tenantId]/PUT.ts","../src/api/routes/tenants/POST.ts","../src/api/routes/tenants/index.ts","../src/api/utils/routes/proxyRoutes.ts","../src/api/routes/auth/signin.ts","../src/api/routes/auth/session.ts","../src/api/routes/auth/providers.ts","../src/api/routes/auth/csrf.ts","../src/api/routes/auth/callback.ts","../src/api/routes/auth/signout.ts","../src/api/routes/auth/error.ts","../src/api/utils/routes/defaultRoutes.ts","../src/auth/index.ts","../src/utils/Requester/index.ts","../src/Server.ts","../src/tenants/index.ts","../src/users/index.ts","../src/Api.ts","../src/api/handlers/index.ts","../src/api/handlers/GET.ts","../src/api/handlers/POST.ts","../src/api/handlers/DELETE.ts","../src/api/handlers/PUT.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { ServerConfig } from '../types';\n\nimport { Config } from './Config';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[33m';\nconst reset = '\\x1b[0m';\n\nconst baseLogger = (config: void | ServerConfig, ...params: unknown[]) => ({\n info(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.info(\n `[niledb][DEBUG]${params.join('')} ${message}`,\n meta ? `\\n${JSON.stringify(meta, null, 2)}` : ''\n );\n }\n },\n debug(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.debug(\n `[niledb][DEBUG]${params.join('')} ${message}`,\n meta ? `\\n${JSON.stringify(meta, null, 2)}` : ''\n );\n }\n },\n warn(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.warn(\n `${yellow}[niledb][WARN]${reset}${params.join('')} ${message}`,\n JSON.stringify(meta, null, 2)\n );\n }\n },\n error(message: string | unknown, meta?: Record<string, unknown>) {\n console.error(\n `${red}[niledb][ERROR]${reset}${params.join('')} ${message}`,\n meta\n );\n },\n});\n\nexport default function Logger(\n config?: Config | ServerConfig,\n ...params: unknown[]\n) {\n const base = baseLogger(config, params);\n const info = config?.logger?.info ?? base.info;\n const debug = config?.logger?.debug ?? base.debug;\n const warn = config?.logger?.warn ?? base.warn;\n const error = config?.logger?.error ?? base.error;\n return { info, warn, error, debug };\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 getDatabaseId = (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 if (process.env.NILEDB_POSTGRES_URL) {\n const pgUrl = new URL(process.env.NILEDB_POSTGRES_URL);\n return pgUrl.pathname.substring(1);\n }\n logger && info(`${logger}[NILEDB_ID] ${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}[NILEDB_USER] ${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 logger && info(`${logger}[NILEDB_PASSWORD] ${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}[NILEDB_TOKEN] ${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}[NILEDB_NAME] ${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}[NILEDB_TENANT] ${process.env.NILEDB_TENANT}`);\n return process.env.NILEDB_TENANT;\n }\n\n return null;\n};\n\n/**\n * @param cfg various overrides\n * @returns the url for REST to use\n */\nexport const getBasePath = (cfg: EnvConfig): undefined | string => {\n const { config, logger } = cfg;\n const { warn, info } = Logger(config, '[basePath]');\n const basePath = config?.api?.basePath;\n if (basePath) {\n logger && info(`${logger}[config] ${basePath}`);\n return basePath;\n }\n\n if (process.env.NILEDB_API_URL) {\n logger && info(`${logger}[NILEDB_API_URL] ${process.env.NILEDB_API_URL}`);\n const apiUrl = new URL(process.env.NILEDB_API_URL);\n return apiUrl.href;\n }\n\n warn('not set. Must run auto-configuration');\n return undefined;\n};\n\nexport const getControlPlane = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[basePath]');\n\n if (config?.configureUrl) {\n logger && info(`${logger}[config] ${config.configureUrl}`);\n return config.configureUrl;\n }\n\n if (process.env.NILEDB_CONFIGURE) {\n logger &&\n info(`${logger}[NILEDB_CONFIGURE] ${process.env.NILEDB_CONFIGURE}`);\n // backwards compatible, but not really\n if (!process.env.NILEDB_CONFIGURE.startsWith('http')) {\n return `https://${process.env.NILEDB_CONFIGURE}`;\n }\n return process.env.NILEDB_CONFIGURE;\n }\n\n logger && info(`${logger}[default] https://global.thenile.dev`);\n return 'https://global.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_POSTGRES_URL) {\n const pgUrl = new URL(process.env.NILEDB_POSTGRES_URL);\n logger && info(`${logger}[NILEDB_POSTGRES_URL] ${pgUrl.host}`);\n return pgUrl.host;\n }\n\n if (process.env.NILEDB_HOST) {\n logger && info(`${logger}[NILEDB_HOST] ${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}[NILEDB_PORT] ${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 private events: { [key: string]: EventFn[] } = {};\n\n // Publish event and notify all subscribers\n publish(eventName: string, value: BusValues) {\n const callbackList = this.events[eventName];\n if (callbackList) {\n for (const callback of callbackList) {\n callback(value);\n }\n }\n }\n\n // Subscribe to events\n subscribe(eventName: string, callback: EventFn) {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(callback);\n }\n\n // Unsubscribe from an event\n unsubscribe(eventName: string, callback: EventFn) {\n const callbackList = this.events[eventName];\n\n if (!callbackList) {\n return; // Early exit if no event exists\n }\n\n const index = callbackList.indexOf(callback);\n if (index !== -1) {\n callbackList.splice(index, 1); // Remove the callback\n }\n\n // If there are no more listeners, clean up the event\n if (callbackList.length === 0) {\n delete this.events[eventName];\n }\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);\n\nexport const evictPool = (val: BusValues) => {\n eventer.publish(Events.EvictPool, val);\n};\n","import {\n Database,\n LoggerType,\n NilePoolConfig,\n ServerConfig,\n} from '../../types';\nimport Logger from '../Logger';\n\nimport {\n EnvConfig,\n getBasePath,\n getControlPlane,\n getDatabaseName,\n getDatabaseId,\n getDbHost,\n getDbPort,\n getInfoBearer,\n getPassword,\n getTenantId,\n getToken,\n getUsername,\n} from './envVars';\n\nexport type ConfigRoutes = {\n SIGNIN?: string;\n SESSION?: string;\n PROVIDERS?: string;\n CSRF?: string;\n CALLBACK?: string;\n SIGNOUT?: string;\n ME?: string;\n ERROR?: string;\n TENANTS?: string;\n TENANT_USERS?: string;\n USERS?: string;\n};\n\nclass ApiConfig {\n public cookieKey?: string;\n public basePath?: string | undefined;\n private _token?: string;\n constructor({\n basePath,\n cookieKey,\n token,\n }: {\n basePath?: string | undefined;\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 routePrefix?: string;\n routes?: ConfigRoutes;\n logger?: LoggerType;\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, logger?: string) {\n const envVarConfig: EnvConfig = { config, logger };\n this.user = getUsername(envVarConfig) as string;\n this.logger = config?.logger;\n this.password = getPassword(envVarConfig) as string;\n if (process.env.NODE_ENV !== 'TEST') {\n if (!this.user) {\n throw new Error(\n 'User is required. Set NILEDB_USER as an environment variable or set `user` in the config options.'\n );\n }\n if (!this.password) {\n throw new Error(\n 'Password is required. Set NILEDB_PASSWORD as an environment variable or set `password` in the config options.'\n );\n }\n }\n\n this.databaseId = getDatabaseId(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, debug } = 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 let basePath = getBasePath(envVarConfig);\n if (configuredHost && this.databaseName && this.databaseId && basePath) {\n info('Already configured, aborting fetch');\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]', { db: this.db, api: this.api });\n return this;\n }\n\n const cp = getControlPlane(envVarConfig);\n\n const databaseName = getDatabaseName({ config, logger: 'getInfo' });\n const url = new URL(`${cp}/databases/configure`);\n if (databaseName) {\n url.searchParams.set('databaseName', databaseName);\n }\n info(`configuring from ${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 debug('Unable to auto-configure');\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 occurred');\n } else {\n throw new Error(\n 'Unable to auto-configure. Please remove NILEDB_NAME, NILEDB_API_URL, NILEDB_POSTGRES_URL, and/or NILEDB_HOST from your environment variables.'\n );\n }\n }\n if (typeof database === 'object') {\n const { apiHost, dbHost, name, id } = database;\n basePath = basePath || apiHost;\n this.databaseId = id;\n this.databaseName = name;\n const dburl = new URL(dbHost);\n configuredHost = dburl.host;\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]', { db: this.db, api: this.api });\n return this;\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, debug } = 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 debug(JSON.stringify(this.config.db));\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 debug('pool connected');\n this.startTimeout();\n const afterCreate: AfterCreate = makeAfterCreate(\n config,\n `${this.id}-${this.timer}`\n );\n afterCreate(client, (err) => {\n const { error } = Logger(config, '[after create callback]');\n if (err) {\n clearTimeout(this.timer);\n error('after create failed', {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n }\n });\n });\n this.pool.on('error', (err) => {\n clearTimeout(this.timer);\n info(`pool ${this.id} failed`, {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n });\n }\n\n startTimeout() {\n const { debug } = Logger(this.config, '[NileInstance]');\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n debug(\n `Pool reached idleTimeoutMillis. ${this.id} evicted after ${\n Number(this.config.db.idleTimeoutMillis) ?? 30000\n }ms`\n );\n this.pool.end(() => {\n clearTimeout(this.timer);\n evictPool(this.id);\n });\n }, Number(this.config.db.idleTimeoutMillis) ?? 30000);\n }\n shutdown() {\n const { debug } = Logger(this.config, '[NileInstance]');\n debug(`attempting to shut down ${this.id}`);\n clearTimeout(this.timer);\n this.pool.end(() => {\n debug(`${this.id} has been shut down`);\n });\n }\n}\n\nexport default NileDatabase;\n\nfunction makeAfterCreate(config: Config, id: string): AfterCreate {\n const { error, warn, debug } = Logger(config, '[afterCreate]');\n return (conn, done) => {\n conn.on('error', function errorHandler(e: Error) {\n error(`Connection ${id} was terminated by server`, {\n message: e.message,\n stack: e.stack,\n });\n done(e, 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 (query.length === 1) {\n debug(`connection context set: tenantId=${config.tenantId}`);\n }\n if (query.length === 2) {\n debug(\n `connection context set: tenantId=${config.tenantId} userId=${config.userId}`\n );\n }\n if (err) {\n error('query connection failed', {\n cause: err.cause,\n stack: err.stack,\n message: err.message,\n name: err.name,\n id,\n });\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('query', ...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 cleared: boolean;\n private poolWatcherFn: (id: undefined | null | string) => void;\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 this.cleared = false;\n this.connections = new Map();\n this.poolWatcherFn = this.poolWatcher(config);\n watchEvictPool(this.poolWatcherFn);\n }\n poolWatcher = (config: ServerConfig) => (id: undefined | null | string) => {\n const { info, warn } = Logger(config, '[DBManager]');\n if (id && this.connections.has(id)) {\n info(`Removing ${id} from db connection pool.`);\n const connection = this.connections.get(id);\n connection?.shutdown();\n this.connections.delete(id);\n } else {\n warn(`missed eviction of ${id}`);\n }\n };\n\n getConnection = (config: ServerConfig): Pool => {\n const { info } = Logger(config, '[DBManager]');\n const id = this.makeId(config.tenantId, config.userId);\n\n const existing = this.connections.get(id);\n info(`# of instances: ${this.connections.size}`);\n if (existing) {\n info(`returning existing ${id}`);\n existing.startTimeout();\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 if (this.cleared) {\n this.cleared = false;\n }\n return newOne.pool;\n };\n\n clear = (config: ServerConfig) => {\n const { info } = Logger(config, '[DBManager]');\n info(`Clearing all connections ${this.connections.size}`);\n this.cleared = true;\n this.connections.clear();\n };\n}\n","import { Config } from '../../../utils/Config';\n\nconst NILEDB_API_URL = process.env.NILEDB_API_URL;\n\nexport function makeRestUrl(\n config: Config,\n path: string,\n qp?: Record<string, string>\n) {\n const url = config.api.basePath || NILEDB_API_URL;\n if (!url) {\n throw new Error(\n 'An API url is required. Set it via NILEDB_API_URL. Was auto configuration run?'\n );\n }\n const params = new URLSearchParams(qp);\n return `${[url, path.substring(1, path.length)].join('/')}${\n qp ? `?${params.toString()}` : ''\n }`;\n}\n","import { Config } from '../../../utils/Config';\n\nimport { makeRestUrl } from './makeRestUrl';\n\ntype ApiRouteKeys = keyof typeof apiRoutes;\nexport type ApiRoutePaths = (typeof apiRoutes)[ApiRouteKeys];\nexport const apiRoutes = (config: Config) => ({\n ME: makeRestUrl(config, '/me'),\n USERS: (tenantId?: string) =>\n makeRestUrl(config, '/users', tenantId ? { tenantId } : undefined),\n USER: (userId: string) => makeRestUrl(config, `/users/${userId}`),\n TENANTS: makeRestUrl(config, '/tenants'),\n TENANT: (tenantId: string) => makeRestUrl(config, `/tenants/${tenantId}`),\n SIGNUP: makeRestUrl(config, '/signup'),\n TENANT_USERS: (tenantId: string) =>\n makeRestUrl(config, `/tenants/${tenantId}/users`),\n TENANT_USER: (tenantId: string, userId: string) =>\n makeRestUrl(config, `/tenants/${tenantId}/users/${userId}`),\n USER_TENANTS: (userId: string) =>\n makeRestUrl(config, `/users/${userId}/tenants`),\n});\n","export default function urlMatches(requestUrl: string, route: string) {\n const url = new URL(requestUrl);\n return url.pathname.startsWith(route);\n}\n","import { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nexport default async function request(\n url: string,\n _init: RequestInit & { request: Request },\n config: Config\n) {\n const { info, error } = Logger(config, '[REQUEST]');\n const { request, ...init } = _init;\n const requestUrl = new URL(request.url);\n const updatedHeaders = new Headers(request.headers);\n\n updatedHeaders.set('host', requestUrl.host);\n updatedHeaders.set('niledb-origin', requestUrl.origin);\n const params = { ...init, headers: updatedHeaders };\n if (params.method === 'POST' || params.method === 'PUT') {\n params.body = init.body ?? request.body;\n // @ts-expect-error - its there\n params.duplex = 'half';\n }\n\n const res = await fetch(url, { ...params }).catch((e) => {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n });\n const loggingRes = typeof res?.clone === 'function' ? res?.clone() : null;\n info(`[${params.method ?? 'GET'}] ${url}`, {\n status: res?.status,\n statusText: res?.statusText,\n text: await loggingRes?.text(),\n });\n return res;\n}\n","import { Routes } from '../../types';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\n\nconst key = 'ME';\n\n/**\n * @swagger\n * /api/me:\n * get:\n * summary: Identify the principal\n * description: Returns information about the principal associated with the session\n * provided\n * operationId: me\n * responses:\n * \"200\":\n * description: Identified user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nasync function GET(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n const res = await request(url, init, config);\n return res;\n}\n\nexport default async function route(request: Request, config: Config) {\n const url = apiRoutes(config)[key];\n\n switch (request.method) {\n case 'GET':\n return await GET(url, { request }, config);\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nimport request from './request';\n\nexport type ActiveSession = {\n id: string;\n email: string;\n expires: Date;\n user?: {\n id: string;\n name: string;\n image: string;\n email: string;\n emailVerified: void | Date;\n };\n};\nexport default async function auth(\n req: Request,\n config: Config\n): Promise<void | ActiveSession> {\n const { info, error } = Logger(config, '[nileauth]');\n info('checking auth');\n\n const sessionUrl = `${config.api.basePath}/auth/session`;\n info(`using session${sessionUrl}`);\n // handle the pass through with posts\n req.headers.delete('content-length');\n\n const res = await request(sessionUrl, { request: req }, config);\n if (!res) {\n info('no session found');\n return undefined;\n }\n info('session active');\n try {\n return await new Response(res.body).json();\n } catch (e) {\n error(e);\n return undefined;\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 = 'niledb-tenant-id';\nexport const X_NILE_USER_ID = 'niledb-user-id';\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, X_NILE_TENANT);\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(opts?.headers);\n basicHeaders.set('content-type', 'application/json; charset=utf-8');\n\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]', { message: e.message, stack: e.stack });\n });\n\n if (response && response.status >= 200 && response.status < 300) {\n if (typeof response.clone === 'function') {\n try {\n info(`[fetch][response] ${await response.clone().json()}`);\n } catch (e) {\n info(`[fetch][response] ${await response.clone().text()}`, { e });\n }\n }\n return response;\n }\n if (response?.status === 404) {\n return new ResponseError('Not found', { status: 404 });\n }\n\n if (response?.status === 401) {\n return new ResponseError('Unauthorized', { status: 401 });\n }\n if (response?.status === 405) {\n return new ResponseError('Method not allowed', { status: 405 });\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}]`, {\n message: msg,\n });\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(`[fetch][response] status: ${errorHandler?.status}] ${message}`);\n return new ResponseError(message, { status: 400 });\n }\n if (res && 'errors' in res) {\n const {\n errors: [message],\n } = res;\n error(`[fetch][response] status: ${errorHandler?.status}] ${message}`);\n return new ResponseError(message, { status: 400 });\n }\n error(`[fetch][response] status: ${errorHandler?.status}] UNHANDLED ERROR`, {\n res,\n });\n return new ResponseError(null, {\n status: (response as Response)?.status ?? 500,\n });\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\nimport { Config } from '../../../utils/Config';\n/**\n * @swagger\n * /api/users:\n * post:\n * tags:\n * - users\n * summary: Creates a user\n * description: Creates a user in the database\n * operationId: createUser\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n const url = apiRoutes(config).USERS(tenant ? tenant : undefined);\n\n return await request(url, init, config);\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\nimport { Config } from '../../../utils/Config';\n\n/**\n * @swagger\n * /api/users:\n * get:\n * tags:\n * - users\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided. You can also pass the a `niledb-tenant-id` in the header or in a cookie.\n * operationId: listUsers\n * parameters:\n * - name: tenantId\n * in: query\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/TenantUser'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n if (!tenant) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n const url = apiRoutes(config).TENANT_USERS(tenant);\n init.method = 'GET';\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes/apiRoutes';\nimport fetch from '../../../utils/request';\nimport { ActiveSession } from '../../../utils/auth';\nimport { Config } from '../../../../utils/Config';\n\n/**\n * @swagger\n * /api/users/{userid}:\n * put:\n * tags:\n * - users\n * summary: update a user\n * description: updates a user within the tenant\n * operationId: updateUser\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * Update a user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/UpdateUserRequest'\n * responses:\n * \"200\":\n * description: An updated user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n config: Config,\n session: void | ActiveSession,\n init: RequestInit & { request: Request }\n) {\n if (!session) {\n return new Response(null, { status: 401 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n\n // update the user\n\n const [userId] = new URL(init.request.url).pathname.split('/').reverse();\n\n const url = apiRoutes(config).USER(userId);\n\n return await fetch(url, init, config);\n}\n","import { Routes } from '../../types';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport auth from '../../utils/auth';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\n\nimport { POST } from './POST';\nimport { GET } from './GET';\nimport { PUT } from './[userId]/PUT';\n\nconst key = 'USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request }, info);\n case 'POST':\n return await POST(config, { request });\n case 'PUT':\n return await PUT(config, session, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { apiRoutes } from '../../../../utils/routes/apiRoutes';\nimport { Config } from '../../../../../utils/Config';\nimport request from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * get:\n * tags:\n * - users\n * summary: List tenant users\n * description: Lists users that are associated with the specified tenant.\n * operationId: listTenantUsers\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: Users found\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/User'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n const url = `${apiRoutes(config).TENANT_USERS(tenantId)}`;\n return await request(url, init, config);\n}\n","import { ActiveSession } from '../../../../utils/auth';\nimport fetch from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes/apiRoutes';\nimport { Config } from '../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * post:\n * tags:\n * - users\n * summary: Create a user in a tenant\n * description: Creates a new user and associates that user with the specified\n * tenant.\n * operationId: createTenantUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n */\nexport async function POST(\n config: Config,\n session: ActiveSession,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n init.body = JSON.stringify({ email: session.email });\n init.method = 'PUT';\n const url = apiRoutes(config).TENANT_USERS(tenantId);\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../../../utils/routes/apiRoutes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{email}:\n * delete:\n * tags:\n * - tenants\n * summary: removes a user from a tenant\n * description: removes an associated user from a specified\n * tenant.\n * operationId: unlinkUser \n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * - name: email \n * in: path\n * required: true\n * schema:\n * type: string\n \n * responses:\n * \"204\":\n * description: User removed\n */\n\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [userId, _, tenantId] = yurl.pathname.split('/').reverse();\n\n init.method = 'DELETE';\n init.body = JSON.stringify({ email: userId });\n const url = `${apiRoutes(config).TENANT_USER(tenantId, userId)}`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../../utils/routes/apiRoutes';\nimport fetch from '../../../../utils/request';\nimport { Config } from '../../../../../utils/Config';\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * put:\n * tags:\n * - tenants\n * summary: associates an existing user with the tenant\n * operationId: linkUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |\n * The email of the user you want to add to a tenant.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/AssociateUserRequest'\n * responses:\n * \"201\":\n * description: add user to tenant\n */\n\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT_USERS(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../utils/Config';\nimport urlMatches from '../../../../utils/routes/urlMatches';\nimport { Routes } from '../../../../types';\nimport auth from '../../../../utils/auth';\nimport Logger from '../../../../../utils/Logger';\n\nimport { GET } from './GET';\nimport { POST } from './POST';\nimport { DELETE } from './[userId]/DELETE';\nimport { PUT } from './PUT';\n\nconst key = 'TENANT_USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const yurl = new URL(request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n if (!tenantId) {\n info('No tenant id found in path');\n return new Response(null, { status: 404 });\n }\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request });\n case 'POST':\n return await POST(config, session, { request });\n case 'PUT':\n return await PUT(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [userId, possibleTenantId, tenantId] = url.pathname\n .split('/')\n .reverse();\n let route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{userId}', userId);\n if (userId === 'users') {\n route = configRoutes[key].replace('{tenantId}', possibleTenantId);\n }\n return urlMatches(request.url, route);\n}\n","import { Config } from '../../../utils/Config';\nimport { ActiveSession } from '../../utils/auth';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants:\n * get:\n * tags:\n * - tenants\n * summary: list tenants by user\n * description: Creates a user in the database\n * operationId: listTenants\n * responses:\n * \"200\":\n * description: a list of tenants\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: \"#/components/schemas/Tenant\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n session: ActiveSession,\n init: RequestInit & { request: Request }\n) {\n let url = `${apiRoutes(config).USER_TENANTS(session.id)}`;\n if (typeof session === 'object' && 'user' in session && session.user) {\n url = `${apiRoutes(config).USER_TENANTS(session.user.id)}`;\n }\n\n const res = await request(url, init, config);\n return res;\n}\n","import { Config } from '../../../../utils/Config';\nimport request from '../../../utils/request';\nimport { apiRoutes } from '../../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * get:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: getTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: the desired tenant\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n\n init.method = 'GET';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\nimport { apiRoutes } from '../../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * delete:\n * tags:\n * - tenants\n * summary: Deletes a tenant.\n * operationId: deleteTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"204\":\n * description: Tenant deleted\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\nimport { apiRoutes } from '../../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * put:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: updateTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"201\":\n * description: update an existing tenant\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes/apiRoutes';\n\n/**\n * @swagger\n * /api/tenants:\n * post:\n * tags:\n * - tenants\n * summary: Create a tenant\n * description: Creates a new tenant in a database.\n * operationId: createTenant\n * requestBody:\n * description: A wrapper for the tenant name.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateTenantRequest'\n * examples:\n * Create Tenant Request:\n * summary: Creates a named tenant\n * description: Create Tenant Request\n * value:\n * name: My Sandbox\n * responses:\n * \"201\":\n * description: Tenant created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Database not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes(config).TENANTS}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\nimport auth from '../../utils/auth';\nimport Logger from '../../../utils/Logger';\n\nimport { GET } from './GET';\nimport { GET as TENANT_GET } from './[tenantId]/GET';\nimport { DELETE } from './[tenantId]/DELETE';\nimport { PUT } from './[tenantId]/PUT';\nimport { POST } from './POST';\n\nfunction isUUID(value: string | null | undefined) {\n if (!value) {\n return false;\n }\n // is any UUID\n const regex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5|7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\n\n return regex.test(value);\n}\n\nconst key = 'TENANTS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const [possibleTenantId] = request.url.split('/').reverse();\n\n switch (request.method) {\n case 'GET':\n if (isUUID(possibleTenantId)) {\n return await TENANT_GET(config, { request }, info);\n }\n return await GET(config, session, { request });\n case 'POST':\n return await POST(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n case 'PUT':\n return await PUT(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Config } from '../../../utils/Config';\n\nimport { makeRestUrl } from './makeRestUrl';\n\nexport const proxyRoutes = (config: Config) => ({\n SIGNIN: makeRestUrl(config, '/auth/signin'),\n PROVIDERS: makeRestUrl(config, '/auth/providers'),\n SESSION: makeRestUrl(config, '/auth/session'),\n CSRF: makeRestUrl(config, '/auth/csrf'),\n CALLBACK: makeRestUrl(config, '/auth/callback'),\n SIGNOUT: makeRestUrl(config, '/auth/signout'),\n ERROR: makeRestUrl(config, '/auth/error'),\n});\n\ntype ProxyKeys = keyof typeof proxyRoutes;\n\nexport type ProxyPaths = (typeof proxyRoutes)[ProxyKeys];\n","/**\n * @swagger\n * /api/auth/signin:\n * get:\n * tags:\n * - authentication\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided\n * operationId: signin\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\n\nconst key = 'SIGNIN';\n\nexport default async function route(req: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n };\n if (req.method === 'POST') {\n if (typeof req.clone === 'function') {\n init.body = req.clone().body;\n }\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n\n url = `${proxyRoutes(config)[key]}/${provider}`;\n }\n\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n\n url = `${url}${params.toString() !== '' ? `?${params.toString()}` : ''}`;\n\n const res = await request(url, { ...init, request: req }, config);\n\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).SESSION,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.SESSION);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).PROVIDERS,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PROVIDERS);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).CSRF,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CSRF);\n}\n","import { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport fetch from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\n\nconst key = 'CALLBACK';\n\nexport default async function route(request: Request, config: Config) {\n const { error } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const [provider] = new URL(request.url).pathname.split('/').reverse();\n const passThroughUrl = new URL(request.url);\n const params = new URLSearchParams(passThroughUrl.search);\n const url = `${proxyRoutes(config).CALLBACK}/${provider}${\n params.toString() !== '' ? `?${params.toString()}` : ''\n }`;\n\n const res = await fetch(\n url,\n {\n request,\n method: request.method,\n },\n config\n ).catch((e) => {\n error('an error as occurred', e);\n });\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CALLBACK);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport fetch from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'SIGNOUT';\nexport default async function route(request: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: request.method,\n };\n if (request.method === 'POST') {\n init.body = request.body;\n const [provider] = new URL(request.url).pathname.split('/').reverse();\n url = `${proxyRoutes(config)[key]}/${provider}`;\n }\n\n const res = await fetch(url, { ...init, request }, config);\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { proxyRoutes } from '../../utils/routes/proxyRoutes';\nimport request from '../../utils/request';\nimport urlMatches from '../../utils/routes/urlMatches';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'ERROR';\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config)[key],\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\n\nexport const appRoutes = (prefix = '/api'): Routes => ({\n SIGNIN: `${prefix}/auth/signin`,\n PROVIDERS: `${prefix}/auth/providers`,\n SESSION: `${prefix}/auth/session`,\n CSRF: `${prefix}/auth/csrf`,\n CALLBACK: `${prefix}/auth/callback`,\n SIGNOUT: `${prefix}/auth/signout`,\n ERROR: `${prefix}/auth/error`,\n ME: `${prefix}/me`,\n USERS: `${prefix}/users`,\n TENANTS: `${prefix}/tenants`,\n TENANT_USER: `${prefix}/tenants/{tenantId}/users/{userId}`,\n TENANT_USERS: `${prefix}/tenants/{tenantId}/users`,\n SIGNUP: `${prefix}/signup`,\n});\n","import { appRoutes } from '../api/utils/routes/defaultRoutes';\nimport { Config } from '../utils/Config';\nimport Logger from '../utils/Logger';\n\n// url host does not matter, we only match on the 1st leg by path\nconst ORIGIN = 'https://us-west-2.api.dev.thenile.dev';\n/**\n * a helper function to log in server side.\n */\nexport default function serverAuth(\n config: Config,\n handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n }\n) {\n const { info, error } = Logger(config, '[server side login]');\n const routes = appRoutes(config.routePrefix);\n return async function login({\n email,\n password,\n }: {\n email: string;\n password: string;\n }) {\n if (!email || !password) {\n throw new Error('Server side login requires a user email and password.');\n }\n\n const sessionUrl = new URL(`${ORIGIN}${routes.PROVIDERS}`);\n const baseHeaders = {\n host: sessionUrl.host,\n 'niledb-origin': ORIGIN,\n };\n info(`Obtaining providers for ${email}`);\n const sessionReq = new Request(sessionUrl, {\n method: 'GET',\n ...baseHeaders,\n });\n const sessionRes = await handlers.POST(sessionReq);\n\n if (sessionRes?.status === 404) {\n throw new Error('Unable to login, cannot find region api.');\n }\n\n let providers;\n try {\n providers = await sessionRes?.json();\n } catch (e) {\n info(sessionUrl, { sessionRes });\n error(e);\n }\n\n info('Obtaining csrf');\n const csrf = new URL(`${ORIGIN}${routes.CSRF}`);\n const csrfReq = new Request(csrf, {\n method: 'GET',\n headers: new Headers({\n ...baseHeaders,\n }),\n });\n const csrfRes = await handlers.POST(csrfReq);\n let csrfToken;\n try {\n const json = (await csrfRes?.json()) ?? {};\n csrfToken = json?.csrfToken;\n } catch (e) {\n info(sessionUrl, { csrfRes });\n error(e, { csrfRes });\n }\n\n const { credentials } = providers ?? {};\n\n const csrfCookie = csrfRes?.headers.get('set-cookie');\n\n if (!credentials) {\n throw new Error(\n 'Unable to obtain credential provider. Aborting server side login.'\n );\n }\n const signInUrl = new URL(credentials.callbackUrl);\n\n if (!csrfCookie) {\n throw new Error('Unable to authenticate REST');\n }\n info(`Attempting sign in with email ${email}`);\n const postReq = new Request(signInUrl, {\n method: 'POST',\n headers: new Headers({\n 'content-type': 'application/json',\n cookie: csrfCookie,\n ...baseHeaders,\n }),\n body: JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n }),\n });\n const loginRes = await handlers.POST(postReq);\n const authCookie = loginRes?.headers.get('set-cookie');\n if (!authCookie) {\n throw new Error('authentication failed');\n }\n const [, token] =\n /((__Secure-)?nile\\.session-token=.+?);/.exec(authCookie) ?? [];\n if (!token) {\n throw new Error('Server login failed');\n }\n info('Server login successful', { authCookie, csrfCookie });\n return new Headers({\n cookie: [token, csrfCookie].join('; '),\n ...baseHeaders,\n });\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 = 'DELETE' | '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 options 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 async post<R = JSON>(\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response | R> {\n const response = await this.request('POST', url, req, init);\n if (response && response.status >= 200 && response.status < 300) {\n return response.json();\n }\n return response;\n }\n\n async get<R = JSON>(\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response | R> {\n const response = await this.request('GET', url, req, init);\n if (response && response.status >= 200 && response.status < 300) {\n return response.json();\n }\n return response;\n }\n\n async put<R = JSON>(\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response | R> {\n const response = await this.request('PUT', url, req, init);\n if (response && response.status >= 200 && response.status < 300) {\n return response.json();\n }\n return response;\n }\n\n async delete<R = JSON>(\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response | R> {\n const response = await this.request('DELETE', url, req, init);\n if (response && response.status >= 200 && response.status < 300) {\n return response.json();\n }\n return response;\n }\n}\n","import { Pool } from 'pg';\n\nimport { ServerConfig } from './types';\nimport { Config } from './utils/Config';\nimport { watchTenantId, watchToken, watchUserId } from './utils/Event';\nimport DbManager from './db';\nimport { Api } from './Api';\n\nexport class Server {\n config: Config;\n api: Api;\n private manager!: DbManager;\n\n constructor(config?: ServerConfig) {\n this.config = new Config(config as ServerConfig, '[initial config]');\n this.api = new Api(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\n this.api = new Api(this.config);\n return this;\n }\n\n set databaseId(val: string | void) {\n if (val) {\n this.config.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.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.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.users.api.token = token;\n this.api.tenants.api.token = token;\n }\n }\n }\n get db(): Pool {\n return this.manager.getConnection(this.config);\n }\n\n /**\n * A convenience function that applies a config and ensures whatever was passed is set properly\n */\n\n getInstance(config: ServerConfig): Server {\n const _config = { ...this.config, ...config };\n\n // be sure the config is up to date\n const updatedConfig = new Config(_config);\n this.setConfig(updatedConfig);\n // propagate special config items\n this.tenantId = updatedConfig.tenantId;\n this.userId = updatedConfig.userId;\n this.token = updatedConfig.api.token;\n this.databaseId = updatedConfig.databaseId;\n\n return this;\n }\n}\n\nlet server: Server;\nexport async function create(config?: ServerConfig): Promise<Server> {\n if (!server) {\n server = new Server(config);\n }\n return await server.init();\n}\n\nexport default create;\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest } from '../utils/Requester';\n\nexport interface Tenant {\n id: string;\n name?: string;\n}\n\nexport default class Tenants extends Config {\n headers?: Headers;\n constructor(config: Config, headers?: Headers) {\n super(config);\n this.headers = headers;\n }\n handleHeaders(init?: RequestInit) {\n if (this.headers) {\n if (init) {\n init.headers = new Headers({ ...this.headers, ...init?.headers });\n return init;\n } else {\n init = {\n headers: this.headers,\n };\n return init;\n }\n }\n return undefined;\n }\n get tenantsUrl() {\n return '/tenants';\n }\n get tenantUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}`;\n }\n\n createTenant = async (\n req: NileRequest<{ name: string }> | Headers | string,\n init?: RequestInit\n ): Promise<Tenant | Response> => {\n let _req;\n if (typeof req === 'string') {\n _req = new Request(`${this.api.basePath}${this.tenantsUrl}`, {\n body: JSON.stringify({ name: req }),\n method: 'POST',\n });\n } else {\n _req = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.post(_req, this.tenantsUrl, _init);\n };\n\n getTenant = async (\n req: NileRequest<{ id: string }> | Headers | string | void,\n init?: RequestInit\n ): Promise<Tenant | Response> => {\n if (typeof req === 'string') {\n this.tenantId = req;\n }\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.get<Tenant>(req, this.tenantUrl, _init);\n };\n\n get tenantListUrl() {\n return `/users/${this.userId ?? '{userId}'}/tenants`;\n }\n\n listTenants = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<Tenant[] | Response> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return _requester.get<Tenant[]>(req, this.tenantListUrl, _init);\n };\n}\n","import { Config } from '../utils/Config';\nimport Requester, { NileRequest } 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 headers?: Headers;\n constructor(config: Config, headers?: Headers) {\n super(config);\n this.headers = headers;\n }\n\n get usersUrl() {\n return '/users';\n }\n\n get tenantUsersUrl() {\n return `/tenants/${this.tenantId ?? '{tenantId}'}/users`;\n }\n handleHeaders(init?: RequestInit) {\n if (this.headers) {\n if (init) {\n init.headers = new Headers({ ...this.headers, ...init?.headers });\n return init;\n } else {\n init = {\n headers: this.headers,\n };\n return init;\n }\n }\n return undefined;\n }\n\n createUser = async (\n req: NileRequest<CreateBasicUserRequest>,\n init?: RequestInit\n ): Promise<User | Response> => {\n const _requester = new Requester(this);\n\n const _init = this.handleHeaders(init);\n return await _requester.post(req, this.usersUrl, _init);\n };\n\n updateUser = async (\n userId: string,\n req: NileRequest<User>,\n init?: RequestInit\n ): Promise<User | Response> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return await _requester.put(req, `${this.usersUrl}/${userId}`, _init);\n };\n\n listUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<User[] | Response> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return await _requester.get(req, this.tenantUsersUrl, _init);\n };\n\n linkUser = async (\n req: NileRequest<{ id: string }> | Headers,\n init?: RequestInit\n ): Promise<User | Response> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return await _requester.put(req, this.tenantUsersUrl, _init);\n };\n\n tenantUsersDeleteUrl = (userId?: string) => {\n return `/tenants/${this.tenantId ?? '{tenantId}'}/users/${\n userId ?? '{userId}'\n }`;\n };\n\n getUserId = async (req: Headers | NileRequest<{ id: string }>) => {\n if (req instanceof Request) {\n const body = await new Response(req?.body).json();\n if (body) {\n return body.id;\n }\n }\n if ('id' in req) {\n return req.id;\n }\n return null;\n };\n\n unlinkUser = async (\n req: NileRequest<{ id: string }> | Headers,\n init?: RequestInit\n ): Promise<User[] | Response> => {\n const _requester = new Requester(this);\n const userId = await this.getUserId(req);\n const _init = this.handleHeaders(init);\n return await _requester.delete(\n req,\n this.tenantUsersDeleteUrl(userId),\n _init\n );\n };\n\n get meUrl() {\n return '/me';\n }\n\n me = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): Promise<User | Response> => {\n const _requester = new Requester(this);\n const _init = this.handleHeaders(init);\n return await _requester.get(req, this.meUrl, _init);\n };\n}\n","import Handlers from './api/handlers';\nimport { Routes } from './api/types';\nimport { appRoutes } from './api/utils/routes/defaultRoutes';\nimport serverAuth from './auth';\nimport Tenants from './tenants';\nimport Users from './users';\nimport { Config } from './utils/Config';\n\nexport class Api {\n config: Config;\n users: Users;\n tenants: Tenants;\n routes: Routes;\n handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n };\n constructor(config: Config) {\n this.config = config;\n this.users = new Users(config);\n this.tenants = new Tenants(config);\n this.routes = {\n ...appRoutes(config?.routePrefix),\n ...config?.routes,\n };\n this.handlers = Handlers(this.routes, config);\n }\n\n set headers(headers: Headers) {\n this.users = new Users(this.config, headers);\n this.tenants = new Tenants(this.config, headers);\n }\n async login(payload: { email: string; password: string }) {\n this.headers = await serverAuth(this.config, this.handlers)(payload);\n }\n}\n","import { Config } from '../../utils/Config';\nimport { Routes } from '../types';\n\nimport getter from './GET';\nimport poster from './POST';\nimport deleter from './DELETE';\nimport puter from './PUT';\n\nexport default function Handlers(configRoutes: Routes, config: Config) {\n const GET = getter(configRoutes, config);\n const POST = poster(configRoutes, config);\n const DELETE = deleter(configRoutes, config);\n const PUT = puter(configRoutes, config);\n return {\n GET,\n POST,\n DELETE,\n PUT,\n };\n}\n","import Logger from '../../utils/Logger';\nimport me, { matches as matchesMe } from '../routes/me';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport { Routes } from '../types';\nimport * as authRoutes from '../routes/auth';\nimport { Config } from '../../utils/Config';\n\nexport default function GETTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[GET MATCHER]');\n return async function GET(req: Request) {\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n if (authRoutes.matchError(configRoutes, req)) {\n info('matches error');\n return authRoutes.handleError(req, config);\n }\n warn('No GET routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import Logger from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\nimport * as authRoutes from '../routes/auth';\n\nexport default function POSTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[POST MATCHER]');\n return async function POST(req: Request) {\n // order matters for tenantUsers\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n warn('No POST routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import Logger from '../../utils/Logger';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantsUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function DELETER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[DELETE MATCHER]');\n return async function DELETE(req: Request) {\n if (matchesTenantsUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n warn('No DELETE routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import Logger from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function PUTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[PUT MATCHER]');\n return async function PUT(req: Request) {\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n warn('No PUT routes matched');\n return new Response(null, { status: 404 });\n };\n}\n"],"names":["reset","Logger","config","_config$logger$info","_config$logger","_config$logger$debug","_config$logger2","_config$logger$warn","_config$logger3","_config$logger$error","_config$logger4","_len2","arguments","length","params","Array","_key2","base","_len","_key","info","message","meta","debug","console","join","JSON","stringify","warn","yellow","error","red","baseLogger","logger","getUsername","cfg","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","_Logger7","basePath","NILEDB_API_URL","URL","href","getControlPlane","configureUrl","NILEDB_CONFIGURE","startsWith","getDbHost","db","host","NILEDB_POSTGRES_URL","pgUrl","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$cookieKey3","_this","databaseId","routePrefix","routes","_tenantId","_userId","configure","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_config$api$cookieKey2","_Logger","envVarConfig","_ref3","dbConfig","configuredHost","configuredPort","_config$api$cookieKey","cp","url","res","database","possibleError","json","_database","apiHost","dbHost","name","dburl","wrap","_context","prev","next","_objectWithoutPropertiesLoose","_excluded","_extends","abrupt","searchParams","fetch","headers","Authorization","sent","clone","status","t0","text","Error","id","stop","_x","apply","pathname","substring","NILEDB_ID","getDatabaseId","tenantId","NILEDB_TENANT","getTenantId","Boolean","userId","_ref4","_excluded2","eventer","Eventer","events","_proto","prototype","publish","eventName","callbackList","_step","_iterator","_createForOfIteratorHelperLoose","done","callback","subscribe","push","unsubscribe","index","indexOf","splice","updateTenantId","Tenant","updateUserId","User","evictPool","val","EvictPool","NileDatabase","pool","timer","poolConfig","min","max","idleTimeoutMillis","afterCreate","remaining","Proxy","target","property","connectionString","caller","args","concat","createProxyForPool","Pool","startTimeout","on","client","makeAfterCreate","err","clearTimeout","stack","_Number2","_this2","setTimeout","_Number","end","shutdown","_this3","_Logger5","conn","e","query","cause","DBManager","connections","cleared","poolWatcherFn","poolWatcher","has","connection","getConnection","makeId","existing","size","newOne","clear","Map","makeRestUrl","path","qp","URLSearchParams","toString","apiRoutes","ME","USERS","undefined","USER","TENANTS","TENANT","SIGNUP","TENANT_USERS","TENANT_USER","USER_TENANTS","urlMatches","requestUrl","route","request","_x2","_x3","_request","_init","_params$method","init","updatedHeaders","_init$body","loggingRes","Headers","origin","method","body","duplex","Response","t1","t2","t3","statusText","t4","t5","GET","_GET","_x4","_x5","_route","_callee2","_context2","matches","configRoutes","auth","_auth","req","sessionUrl","ResponseError","response","X_NILE_TENANT","getTokenFromCookie","_headers$get","cookie","split","_cookies","cookieParts","_cookie","slice","_step2","_iterator2","getTenantFromHttp","cookieTenant","getUserFromHttp","_headers$get2","decodeJwt","sub","_fetch","_fetch2","opts","_response$status","basicHeaders","useableUrl","errorHandler","msg","_message","includes","replace","encodeURIComponent","t6","t7","t8","errors","POST","_POST","yurl","tenant","log","PUT","_PUT","session","_URL$pathname$split$r","reverse","_yurl$pathname$split$","email","DELETE","_DELETE","_","_url$pathname$split$r","possibleTenantId","_request$url$split$re","test","TENANT_GET","proxyRoutes","SIGNIN","PROVIDERS","SESSION","CSRF","CALLBACK","SIGNOUT","ERROR","provider","passThroughUrl","search","appRoutes","prefix","ORIGIN","serverAuth","handlers","_login","_providers","_exec","baseHeaders","sessionReq","sessionRes","providers","csrf","csrfReq","csrfRes","csrfToken","_yield$csrfRes$json","credentials","csrfCookie","signInUrl","postReq","loginRes","authCookie","Request","callbackUrl","exec","server","Requester","_Config","call","_inheritsLoose","rawRequest","_rawRequest","_headers","Object","values","_x6","_x7","_x8","post","_post","_callee3","_context3","_x9","_x10","_x11","_get","_callee4","_context4","_x12","_x13","_x14","put","_put","_callee5","_context5","_x15","_x16","_x17","_delete2","_callee6","_context6","_x18","_x19","_x20","Tenants","createTenant","_req","_requester","tenantsUrl","handleHeaders","getTenant","tenantUrl","listTenants","tenantListUrl","_init2","_this$tenantId","_this$userId","Users","createUser","usersUrl","updateUser","listUsers","tenantUsersUrl","linkUser","tenantUsersDeleteUrl","getUserId","_ref5","unlinkUser","_ref6","me","_ref7","_callee7","_context7","meUrl","_this$tenantId2","Api","users","tenants","matchesMe","matchesTenantUsers","tenantUsers","matchesUsers","matchesTenants","authRoutes","getter","poster","matchesTenantsUsers","deleter","puter","Handlers","login","payload","Server","manager","DbManager","Token","setConfig","getInstance","_config","updatedConfig","_this$config","create","_create"],"mappings":"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"}
|