@niledatabase/server 1.0.0-alpha.199 → 1.0.0-alpha.200

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs.production.min.js","sources":["../src/utils/Event/index.ts","../src/utils/Config.ts","../src/utils/ResponseError.ts","../src/utils/fetch.ts","../src/utils/Requester/index.ts","../src/auth/index.ts","../src/users/index.ts","../src/tenants/index.ts","../src/db/NileInstance.ts","../src/db/DBManager.ts","../src/utils/Server/index.ts","../src/Server.ts","../src/index.ts"],"sourcesContent":["type BusValues = undefined | null | string;\ntype EventFn = (params: BusValues) => void;\nenum Events {\n User = 'userId',\n Tenant = 'tenantId',\n Token = 'token',\n EvictPool = 'EvictPool',\n}\nclass Eventer {\n events: { [key: string]: EventFn[] };\n constructor() {\n this.events = {};\n }\n publish(eventName: string, value: BusValues) {\n // Get all the callback functions of the current event\n const callbackList = this.events[eventName];\n\n // execute each callback function\n if (callbackList) {\n for (const callback of callbackList) {\n callback(value);\n }\n }\n }\n // Subscribe to events\n subscribe(eventName: string, callback: EventFn) {\n // initialize this event\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n\n // store the callback function of the subscriber\n this.events[eventName].push(callback);\n }\n}\n\n// tenantId manager\nconst eventer = new Eventer();\n\nexport const updateTenantId = (tenantId: BusValues) => {\n eventer.publish(Events.Tenant, tenantId);\n};\n\nexport const watchTenantId = (cb: EventFn) =>\n eventer.subscribe(Events.Tenant, cb);\n\nexport const updateUserId = (userId: BusValues) => {\n eventer.publish(Events.User, userId);\n};\n\nexport const watchUserId = (cb: EventFn) => eventer.subscribe(Events.User, cb);\n\nexport const updateToken = (val: BusValues) => {\n eventer.publish(Events.Token, val);\n};\n\nexport const watchToken = (cb: EventFn) => eventer.subscribe(Events.Token, cb);\n\nexport const watchEvictPool = (cb: EventFn) =>\n eventer.subscribe(Events.EvictPool, cb);\nexport const evictPool = (val: BusValues) => {\n eventer.publish(Events.EvictPool, val);\n};\n","import { PgConnectionConfig, ServerConfig } from '../types';\n\nclass ApiConfig {\n public cookieKey?: string;\n public basePath?: string;\n private _token?: string;\n constructor({\n basePath,\n cookieKey,\n token,\n }: {\n basePath: string;\n cookieKey: string;\n token: string | undefined;\n }) {\n this.basePath = basePath;\n this.cookieKey = cookieKey;\n this._token = token;\n }\n\n public get token(): string | undefined {\n return this._token;\n }\n\n public set token(value: string | undefined) {\n this._token = value;\n }\n}\n\nconst niledatabase_url = 'thenile.dev';\n\ntype DBConfig = {\n connection: PgConnectionConfig;\n // eslint-disable-next-line @typescript-eslint/ban-types\n pool?: undefined | { afterCreate?: Function };\n};\nexport class Config {\n database: string;\n workspace: string;\n\n db: DBConfig;\n\n api: ApiConfig;\n\n private _tenantId?: string | undefined | null;\n private _userId?: string | undefined | null;\n\n public get tenantId(): string | undefined | null {\n return this._tenantId;\n }\n\n public set tenantId(value: string | undefined | null) {\n this._tenantId = value;\n }\n\n public get userId(): string | undefined | null {\n return this._userId;\n }\n\n public set userId(value: string | undefined | null) {\n this._userId = value;\n }\n\n constructor(_config?: ServerConfig) {\n // always provided\n this.database = String(_config?.database);\n this.workspace = String(_config?.workspace);\n\n // set the context\n this._tenantId = _config?.tenantId;\n this._userId = _config?.userId;\n\n // api config\n this.api = new ApiConfig({\n basePath: _config?.api?.basePath ?? `https://api.${niledatabase_url}`,\n cookieKey: _config?.api?.cookieKey ?? 'token',\n token: _config?.api?.token,\n });\n\n // db config\n const host: string =\n _config?.db &&\n _config.db.connection &&\n typeof _config.db?.connection !== 'string' &&\n 'host' in _config.db.connection\n ? String(_config.db.connection.host)\n : `db.${niledatabase_url}`;\n\n const port: number =\n _config?.db?.connection &&\n typeof _config.db?.connection !== 'string' &&\n 'port' in _config.db.connection\n ? Number(_config.db?.connection?.port)\n : 5432;\n\n const connection = {\n host,\n port,\n database: _config?.database,\n ...(typeof _config?.db?.connection === 'object'\n ? _config.db.connection\n : {}),\n } as PgConnectionConfig;\n\n this.db = {\n ..._config?.db,\n connection,\n };\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';\n\nexport const X_NILE_TENANT = 'x-nile-tenantId';\nexport const X_NILE_USER_ID = 'x-nile-userId';\n\nexport function handleTenantId(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n req: NileRequest<any>,\n config: Config\n): ResponseError | void {\n // already set, no need to try and figure it out\n if (config.tenantId) {\n return;\n }\n return new ResponseError('tenant id needs to be set', { status: 400 });\n}\n\nfunction getTokenFromCookie(headers: Headers, cookieKey: void | string) {\n const cookie = headers.get('cookie')?.split('; ');\n const _cookies: Record<string, string> = {};\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n if (cookieKey) {\n return _cookies[cookieKey];\n }\n return null;\n}\nexport function getTenantFromHttp(headers: Headers, config: Config) {\n const cookieTenant = getTokenFromCookie(headers, 'tenantId');\n return cookieTenant ?? headers?.get(X_NILE_TENANT) ?? config.tenantId;\n}\n\nexport function getUserFromHttp(headers: Headers, config: Config) {\n const token = getTokenFromCookie(headers, config.api.cookieKey);\n if (token) {\n const jwt = decodeJwt(token);\n return jwt.sub;\n }\n return headers?.get(X_NILE_USER_ID) ?? config.userId;\n}\n\nexport async function _fetch(\n config: Config,\n path: string,\n opts?: RequestInit\n): Promise<Response | ResponseError> {\n const url = `${config.api?.basePath}${path}`;\n const cookieKey = config.api?.cookieKey;\n const headers = new Headers(opts?.headers);\n const basicHeaders = new Headers();\n basicHeaders.set('content-type', 'application/json; charset=utf-8');\n const authHeader = headers.get('Authorization');\n if (!authHeader) {\n const token = getTokenFromCookie(headers, cookieKey);\n if (token) {\n basicHeaders.set('Authorization', `Bearer ${token}`);\n } else if (config.api?.token) {\n basicHeaders.set('Authorization', `Bearer ${config.api?.token}`);\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 const response = await fetch(useableUrl, {\n ...opts,\n headers: basicHeaders,\n }).catch((e) => {\n // eslint-disable-next-line no-console\n console.log(e);\n });\n\n if (response && response.status >= 200 && response.status < 300) {\n return response;\n }\n\n let res;\n try {\n res = await (response as Response)?.json();\n } catch (e) {\n /* do the default */\n }\n if (res && 'message' in res) {\n const { message } = res;\n return new ResponseError(message, { status: 400 });\n }\n if (res && 'errors' in res) {\n const {\n errors: [message],\n } = res;\n return new ResponseError(message, { status: 400 });\n }\n\n return new ResponseError(null, {\n status: (response as Response)?.status ?? 500,\n });\n}\n","import isEmpty from 'lodash/isEmpty';\nimport isObject from 'lodash/isObject';\n\nimport { Config } from '../Config';\nimport { ResponseError } from '../ResponseError';\nimport { X_NILE_TENANT, _fetch } from '../fetch';\n\nexport { NileResponse, NileRequest } from './types';\n\ntype Methods = 'POST' | 'GET' | 'PUT';\nexport default class Requester<T> extends Config {\n constructor(config: Config) {\n super(config);\n }\n\n async rawRequest(\n method: Methods,\n url: string,\n init: RequestInit,\n body?: string\n ): Promise<Response> {\n const _init = {\n ...init,\n body,\n method,\n };\n\n const res = await _fetch(this, url, _init);\n\n if (res instanceof ResponseError) {\n return res.response;\n }\n\n return res;\n }\n\n /**\n * three optios here\n * 1) pass in headers for a server side request\n * 2) pass in the payload that matches the api\n * 3) pass in the request object sent by a browser\n * @param method\n * @param url\n * @param req\n * @param init\n * @returns\n */\n protected async request(\n method: Methods,\n url: string,\n req: T | Headers,\n init?: RequestInit\n ): Promise<Response> {\n // set the headers\n const headers = new Headers(init ? init?.headers : {});\n if (req instanceof Headers) {\n const tenantId = req.get(X_NILE_TENANT);\n const cookie = req.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n } else if (req instanceof Request) {\n // pass back the X_NILE_TENANT\n const _headers = new Headers(req?.headers);\n const tenantId = _headers.get(X_NILE_TENANT);\n const cookie = _headers.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n }\n // default the body - may be the actual payload for the API\n let body: string | undefined = JSON.stringify(req);\n\n // comes from next/some server\n if (method === 'GET') {\n body = undefined;\n } else if (req instanceof Request) {\n body = await new Response(req.body).text();\n } else if (\n // is just headers for a GET request\n req instanceof Headers ||\n isEmpty(req) ||\n (isObject(req) && Object.values(req).length === 0)\n ) {\n body = undefined;\n }\n\n const _init = {\n ...init,\n headers,\n };\n\n return await this.rawRequest(method, url, _init, body);\n }\n\n post = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('POST', url, req, init);\n };\n\n get = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('GET', url, req, init);\n };\n\n put = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('PUT', url, req, init);\n };\n}\n","import { RestModels } from '@niledatabase/js';\n\nimport { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\nimport { ResponseError } from '../utils/ResponseError';\nimport {\n X_NILE_TENANT,\n X_NILE_USER_ID,\n getTenantFromHttp,\n} from '../utils/fetch';\nimport { updateToken, updateUserId } from '../utils/Event';\n\nexport default class Auth extends Config {\n constructor(config: Config) {\n super(config);\n }\n get loginUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/users/login`;\n }\n\n login = async (\n req: NileRequest<RestModels.CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<RestModels.LoginUserResponse> => {\n const headers = new Headers({ 'content-type': 'application/json' });\n const _requester = new Requester(this);\n\n const params =\n req instanceof Request\n ? new URL(req.url).searchParams\n : new URLSearchParams();\n\n const sso = params.get('sso');\n\n if (sso === 'true') {\n const providerRes = await this.listProviders(\n (req as Request).clone(),\n init\n );\n // if you have a provider, log them in\n if (\n providerRes &&\n providerRes.status >= 200 &&\n providerRes.status < 300\n ) {\n const providers = await new Response(providerRes.body).json();\n if (providers.length > 0) {\n if (providers.length > 1) {\n return new Response(JSON.stringify(providers), { status: 200 });\n // a user has to make a choice\n }\n\n // is there a way to do this? probably not.\n headers.set(X_NILE_TENANT, providers[0].tenantId);\n headers.append(\n 'set-cookie',\n `tenantId=${providers[0].tenantId}; path=/; httponly;`\n );\n // const ssoResp = await this.loginSSO(req);\n return new Response(\n JSON.stringify({\n redirectURI: `${this.api.basePath}${this.loginSSOUrl('okta')}`,\n }),\n { status: 200 }\n );\n // make it a client side redirect, because of the headers\n // if there is no provider, require a password.\n }\n }\n }\n\n const res = await _requester.post(req, this.loginUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: RestModels.LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { tenants } = token;\n const tenant = tenants?.values();\n const tenantId = tenant?.next().value;\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n updateToken(token.token.jwt);\n\n return new Response(JSON.stringify(token), { status: 200, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n loginSSO = (redirectUrl: string) => {\n const ssoLogin = async (\n req: NileRequest<unknown>\n ): NileResponse<RestModels.TenantSSORegistration[]> => {\n const headers = new Headers();\n const body = await (req as Request).formData();\n const accessToken = (await body.get('access_token')) as string;\n const tenantId = (await body.get('tenantId')) as string;\n const cookie = `${this.api?.cookieKey}=${accessToken}; path=/; samesite=lax; httponly;`;\n updateToken(accessToken);\n headers.append('set-cookie', cookie);\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n headers.set('Location', redirectUrl);\n return new Response(null, {\n headers,\n status: 303,\n });\n };\n return ssoLogin;\n };\n\n loginSSOUrl = (provider: string) => {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }/auth/oidc/providers/${provider}/login`;\n };\n\n get signUpUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/users`;\n }\n\n signUp = async (\n req: NileRequest<RestModels.CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<RestModels.LoginUserResponse> => {\n const headers = new Headers();\n const _requester = new Requester(this);\n const res = await _requester.post(req, this.signUpUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: RestModels.LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token?.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { id } = token;\n updateToken(token.token?.jwt);\n updateUserId(id);\n headers.set(X_NILE_USER_ID, id);\n headers.append('set-cookie', `userId=${id}; path=/; httponly;`);\n return new Response(JSON.stringify(token), { status: 201, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n updateProviderUrl(providerName: string) {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers/${encodeURIComponent(providerName)}`;\n }\n\n get listTenantProvidersUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers`;\n }\n\n listTenantProviders = async (\n req: NileRequest<void | Headers>,\n init?: RequestInit\n ): NileResponse<RestModels.TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.listTenantProvidersUrl, init);\n };\n\n createProvider = async (\n req: NileRequest<RestModels.RegisterTenantSSORequest>,\n init?: RequestInit\n ): NileResponse<RestModels.TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.post(req, this.updateProviderUrl(providerName), init);\n };\n\n updateProvider = async (\n req: NileRequest<RestModels.RegisterTenantSSORequest>,\n init?: RequestInit\n ): NileResponse<RestModels.TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.put(req, this.updateProviderUrl(providerName), init);\n };\n\n providerUrl(email?: undefined | string) {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(\n this.database\n )}/tenants/auth/oidc/providers${\n email ? `?email=${encodeURIComponent(email)}` : ''\n }`;\n }\n\n listProviders = async (\n req: NileRequest<void | RestModels.CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<RestModels.TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n let body: { email: string } | undefined;\n // this is a get. Get the email from the response body so the request is filtered.\n if (req && 'body' in req) {\n body = await new Response(req.body as BodyInit).json();\n }\n return _requester.get(req, this.providerUrl(body?.email), init);\n };\n\n getSSOCallbackUrl = (param: Headers | string) => {\n let tenantId;\n if (typeof tenantId === 'string') {\n tenantId = param;\n } else if (param instanceof Headers) {\n tenantId = getTenantFromHttp(param, this);\n }\n\n return `${this.api.basePath}/workspaces/${this.workspace}/databases/${this.database}/tenants/${tenantId}/auth/oidc/callback`;\n };\n}\n","import { RestModels } from '@niledatabase/js';\n\nimport { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport default class Users extends Config {\n constructor(config: Config) {\n super(config);\n }\n get tenantUsersUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }/users`;\n }\n\n createTenantUser = async (\n req: NileRequest<RestModels.CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<RestModels.LoginUserResponse> => {\n const _requester = new Requester(this);\n return await _requester.post(req, this.tenantUsersUrl, init);\n };\n\n listTenantUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): NileResponse<RestModels.User[]> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.tenantUsersUrl, init);\n };\n\n get meUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/users/me`;\n }\n\n me = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<RestModels.User> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.meUrl, init);\n };\n}\n","import { RestModels } from '@niledatabase/js';\n\nimport { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport default class Tenants extends Config {\n constructor(config: Config) {\n super(config);\n }\n get tenantsUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants`;\n }\n get tenantUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }`;\n }\n\n createTenant = async (\n req: NileRequest<{ name: string }>,\n init?: RequestInit\n ): NileResponse<RestModels.Tenant> => {\n const _requester = new Requester(this);\n return _requester.post(req, this.tenantsUrl, init);\n };\n\n getTenant = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<RestModels.Tenant> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.tenantUrl, init);\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport knex, { Knex } from 'knex';\n\nimport { Config } from '../utils/Config';\nimport { evictPool } from '../utils/Event';\n\n// doing this now, to provide flexibility later\nclass NileDatabase {\n knex: Knex;\n // db: Knex;\n tenantId?: undefined | null | string;\n userId?: undefined | null | string;\n id: string;\n config: any;\n timer: NodeJS.Timeout | undefined;\n\n constructor(config: Config, id: string) {\n this.id = id;\n let poolConfig = {};\n const afterCreate = (\n conn: {\n on: any;\n query: (query: string, cb: (err: unknown) => void) => void;\n },\n done: (err: unknown, conn: unknown) => void\n ) => {\n const query = [`SET nile.tenant_id = '${config.tenantId}'`];\n if (config.userId) {\n if (!config.tenantId) {\n // eslint-disable-next-line no-console\n console.warn(\n 'A user id cannot be set in context without a tenant id'\n );\n }\n query.push(`SET nile.user_id = '${config.userId}'`);\n }\n // in this example we use pg driver's connection API\n conn.query(query.join(';'), function (err: unknown) {\n done(err, conn);\n });\n };\n if (config.tenantId) {\n if (config.db.pool?.afterCreate) {\n // eslint-disable-next-line no-console\n console.log(\n 'Providing an pool configuration will stop automatic tenant context setting.'\n );\n } else if (config.db.pool) {\n poolConfig = {\n ...config.db.pool,\n afterCreate,\n };\n } else if (!config.db.pool) {\n poolConfig = {\n afterCreate,\n };\n }\n }\n\n this.config = {\n ...config,\n db: {\n ...config.db,\n connection: {\n ...config.db.connection,\n database: config.db.connection.database ?? config.database,\n },\n pool: poolConfig,\n },\n };\n const knexConfig = { ...this.config.db, client: 'pg' };\n\n // start the timer for cleanup\n this.startTimeout();\n\n this.knex = knex(knexConfig);\n this.knex.on('query', () => {\n this.startTimeout();\n });\n }\n\n startTimeout() {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n this.knex.destroy();\n evictPool(this.id);\n }, this.config.db.pool.idleTimeoutMillis ?? 30000);\n }\n}\n\nexport type NileDatabaseI = (table?: string) => Knex;\nexport default NileDatabase;\n","import { Config } from '../utils/Config';\nimport { watchEvictPool } from '../utils/Event';\n\nimport NileDatabase, { NileDatabaseI } from './NileInstance';\n\nexport default class DBManager {\n connections: Map<string, NileDatabase>;\n\n private makeId(\n tenantId?: string | undefined | null,\n userId?: string | undefined | null\n ) {\n if (tenantId && userId) {\n return `${tenantId}:${userId}`;\n }\n if (tenantId) {\n return `${tenantId}`;\n }\n return 'base';\n }\n constructor(config: Config) {\n this.connections = new Map();\n // add the base one, so you can at least query\n const id = this.makeId();\n this.connections.set(id, new NileDatabase(new Config(config), id));\n watchEvictPool((id) => {\n if (id && this.connections.has(id)) {\n this.connections.delete(id);\n }\n });\n }\n\n getConnection(config: Config): NileDatabaseI {\n const id = this.makeId(config.tenantId, config.userId);\n const existing = this.connections.get(id);\n if (existing) {\n return existing as unknown as NileDatabaseI;\n }\n this.connections.set(id, new NileDatabase(new Config(config), id));\n return this.connections.get(id) as unknown as NileDatabaseI;\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 { InstanceConfig, ServerConfig } from './types';\nimport { Config } from './utils/Config';\nimport Auth from './auth';\nimport Users from './users';\nimport Tenants from './tenants';\nimport { watchTenantId, watchToken, watchUserId } from './utils/Event';\nimport DbManager, { NileDatabaseI } from './db';\nimport DBManager from './db/DBManager';\nimport { getServerId, makeServerId } from './utils/Server';\n\ntype Api = {\n auth: Auth;\n users: Users;\n tenants: Tenants;\n};\n\nconst init = (config: Config): [Api] => {\n const auth = new Auth(config);\n const users = new Users(config);\n const tenants = new Tenants(config);\n return [\n {\n auth,\n users,\n tenants,\n },\n ];\n};\n\nclass 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);\n this.servers = new Map();\n const [api] = init(this.config);\n this.api = api;\n this.manager = new DBManager(this.config);\n\n watchTenantId((tenantId) => {\n this.tenantId = tenantId;\n });\n watchUserId((userId) => {\n this.userId = userId;\n });\n watchToken((token) => {\n this.token = token;\n });\n }\n\n setConfig(cfg: Config) {\n this.config = new Config(cfg);\n }\n\n set database(val: string | void) {\n if (val) {\n this.config.database = val;\n this.config.db.connection.database = val;\n this.api.auth.database = val;\n this.api.users.database = val;\n this.api.tenants.database = val;\n }\n }\n\n set workspace(val: string | void) {\n if (val) {\n this.config.workspace = val;\n this.api.auth.workspace = val;\n this.api.users.workspace = val;\n this.api.tenants.workspace = 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.database = this.config.database;\n\n this.config.userId = userId;\n\n if (this.api) {\n this.api.auth.userId = this.config.userId;\n this.api.users.userId = this.config.userId;\n this.api.tenants.userId = this.config.userId;\n }\n }\n\n get tenantId(): string | undefined | null {\n return this.config.tenantId;\n }\n\n set tenantId(tenantId: string | undefined | null) {\n this.database = this.config.database;\n this.config.tenantId = tenantId;\n\n if (this.api) {\n this.api.auth.tenantId = tenantId;\n this.api.users.tenantId = tenantId;\n this.api.tenants.tenantId = tenantId;\n }\n }\n\n get token(): string | undefined | null {\n return this.config?.api?.token;\n }\n\n set token(token: string | undefined | null) {\n if (token) {\n this.config.api.token = token;\n if (this.api) {\n this.api.auth.api.token = token;\n this.api.users.api.token = token;\n this.api.tenants.api.token = token;\n }\n }\n }\n get db(): NileDatabaseI {\n // only need to interact with the knex object\n //@ts-expect-error - because that's where it is in the proxy\n return this.manager.getConnection(this.config).knex;\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: InstanceConfig): 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 if (existing) {\n return existing;\n }\n this.servers.set(serverId, new Server(_config));\n return this.servers.get(serverId) as unknown as Server;\n }\n}\n\n// export default Server;\nexport default function Nile(config: ServerConfig) {\n const server = new Server(config);\n server.setConfig(new Config(config as ServerConfig));\n return server;\n}\n","import { default as Server } from './Server';\n\nmodule.exports = Server;\nexport default Server;\n"],"names":["Events","ApiConfig","_ref","cookieKey","token","this","basePath","_token","_createClass","key","get","set","value","Config","_config","database","String","workspace","_tenantId","tenantId","_userId","userId","api","_config$api$basePath","_config$api","_config$api$cookieKey","_config$api2","_config$api3","connection","_extends","host","db","_config$db","port","_config$db2","_config$db3","Number","_config$db4","_config$db5","ResponseError","body","init","response","Response","eventer","Eventer","events","_proto","prototype","publish","eventName","callbackList","_step","_iterator","_createForOfIteratorHelperLoose","done","callback","subscribe","push","updateTenantId","Tenant","updateUserId","User","updateToken","val","Token","getTokenFromCookie","headers","cookie","_headers$get","split","_cookies","cookieParts","_cookie","slice","join","_step2","_iterator2","getTenantFromHttp","config","cookieTenant","getUserFromHttp","decodeJwt","sub","_headers$get2","_fetch","_x","_x2","_x3","_fetch2","apply","arguments","_asyncToGenerator","_regeneratorRuntime","mark","_callee","path","opts","_response$status","url","basicHeaders","_config$api4","useableUrl","res","wrap","_context","prev","next","Headers","includes","abrupt","status","replace","encodeURIComponent","fetch","e","console","log","sent","json","t0","message","errors","stop","Requester","_Config","_this","call","req","request","_ref2","_callee2","_context2","_x4","_x5","_x6","_ref3","_callee3","_context3","_x7","_x8","_x9","_inheritsLoose","rawRequest","_rawRequest","_callee4","method","_init","_context4","_x10","_x11","_x12","_x13","_request","_callee5","_headers","_context5","Request","JSON","stringify","undefined","text","isEmpty","isObject","Object","values","length","_x14","_x15","_x16","_x17","Auth","_requester","providerRes","providers","_this$api","tenants","tenant","content-type","_assertThisInitialized","URL","searchParams","URLSearchParams","listProviders","clone","append","redirectURI","loginSSOUrl","post","loginUrl","error","jwt","redirectUrl","_this$api2","accessToken","formData","provider","_this$tenantId","_this$api3","_token$token","_token$token2","id","signUpUrl","_ref4","listTenantProvidersUrl","_ref5","updateProviderUrl","_ref6","_callee6","_context6","put","_ref7","_callee7","_body","_context7","providerUrl","email","param","providerName","Users","tenantUsersUrl","meUrl","Tenants","tenantsUrl","tenantUrl","NileDatabase","_config$db$pool","poolConfig","afterCreate","conn","query","warn","err","pool","_config$db$connection","knexConfig","client","startTimeout","knex","on","timer","clearTimeout","setTimeout","_this2","destroy","EvictPool","_this$config$db$pool$","idleTimeoutMillis","DBManager","connections","Map","makeId","has","getConnection","makeServerId","Buffer","from","toString","Server","servers","auth","users","manager","setConfig","cfg","getInstance","serverId","getServerId","_this$config","Nile","server","module","exports"],"mappings":"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"}
1
+ {"version":3,"file":"server.cjs.production.min.js","sources":["../src/utils/Event/index.ts","../src/utils/Config.ts","../src/utils/ResponseError.ts","../src/utils/fetch.ts","../src/utils/Requester/index.ts","../src/auth/index.ts","../src/users/index.ts","../src/tenants/index.ts","../src/db/NileInstance.ts","../src/db/DBManager.ts","../src/utils/Server/index.ts","../src/Server.ts","../src/index.ts"],"sourcesContent":["type BusValues = undefined | null | string;\ntype EventFn = (params: BusValues) => void;\nenum Events {\n User = 'userId',\n Tenant = 'tenantId',\n Token = 'token',\n EvictPool = 'EvictPool',\n}\nclass Eventer {\n events: { [key: string]: EventFn[] };\n constructor() {\n this.events = {};\n }\n publish(eventName: string, value: BusValues) {\n // Get all the callback functions of the current event\n const callbackList = this.events[eventName];\n\n // execute each callback function\n if (callbackList) {\n for (const callback of callbackList) {\n callback(value);\n }\n }\n }\n // Subscribe to events\n subscribe(eventName: string, callback: EventFn) {\n // initialize this event\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n\n // store the callback function of the subscriber\n this.events[eventName].push(callback);\n }\n}\n\n// tenantId manager\nconst eventer = new Eventer();\n\nexport const updateTenantId = (tenantId: BusValues) => {\n eventer.publish(Events.Tenant, tenantId);\n};\n\nexport const watchTenantId = (cb: EventFn) =>\n eventer.subscribe(Events.Tenant, cb);\n\nexport const updateUserId = (userId: BusValues) => {\n eventer.publish(Events.User, userId);\n};\n\nexport const watchUserId = (cb: EventFn) => eventer.subscribe(Events.User, cb);\n\nexport const updateToken = (val: BusValues) => {\n eventer.publish(Events.Token, val);\n};\n\nexport const watchToken = (cb: EventFn) => eventer.subscribe(Events.Token, cb);\n\nexport const watchEvictPool = (cb: EventFn) =>\n eventer.subscribe(Events.EvictPool, cb);\nexport const evictPool = (val: BusValues) => {\n eventer.publish(Events.EvictPool, val);\n};\n","import { PgConnectionConfig, PoolConfig, ServerConfig } from '../types';\n\nclass ApiConfig {\n public cookieKey?: string;\n public basePath?: string;\n private _token?: string;\n constructor({\n basePath,\n cookieKey,\n token,\n }: {\n basePath: string;\n cookieKey: string;\n token: string | undefined;\n }) {\n this.basePath = basePath;\n this.cookieKey = cookieKey;\n this._token = token;\n }\n\n public get token(): string | undefined {\n return this._token;\n }\n\n public set token(value: string | undefined) {\n this._token = value;\n }\n}\n\nconst niledatabase_url = 'thenile.dev';\ntype DBConfig = {\n connection: PgConnectionConfig;\n pool?: PoolConfig;\n};\nexport class Config {\n database: string;\n workspace: string;\n\n db: DBConfig;\n\n api: ApiConfig;\n\n private _tenantId?: string | undefined | null;\n private _userId?: string | undefined | null;\n\n public get tenantId(): string | undefined | null {\n return this._tenantId;\n }\n\n public set tenantId(value: string | undefined | null) {\n this._tenantId = value;\n }\n\n public get userId(): string | undefined | null {\n return this._userId;\n }\n\n public set userId(value: string | undefined | null) {\n this._userId = value;\n }\n\n constructor(_config?: ServerConfig) {\n // always provided\n this.database = String(_config?.database);\n this.workspace = String(_config?.workspace);\n\n // set the context\n this._tenantId = _config?.tenantId;\n this._userId = _config?.userId;\n\n // api config\n this.api = new ApiConfig({\n basePath: _config?.api?.basePath ?? `https://api.${niledatabase_url}`,\n cookieKey: _config?.api?.cookieKey ?? 'token',\n token: _config?.api?.token,\n });\n\n // db config\n const host: string =\n _config?.db &&\n _config.db.connection &&\n typeof _config.db?.connection !== 'string' &&\n 'host' in _config.db.connection\n ? String(_config.db.connection.host)\n : `db.${niledatabase_url}`;\n\n const port: number =\n _config?.db?.connection &&\n typeof _config.db?.connection !== 'string' &&\n 'port' in _config.db.connection\n ? Number(_config.db?.connection?.port)\n : 5432;\n\n const connection = {\n host,\n port,\n database: _config?.database,\n ...(typeof _config?.db?.connection === 'object'\n ? _config.db.connection\n : {}),\n } as PgConnectionConfig;\n\n this.db = {\n ..._config?.db,\n connection,\n };\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';\n\nexport const X_NILE_TENANT = 'x-nile-tenantId';\nexport const X_NILE_USER_ID = 'x-nile-userId';\n\nexport function handleTenantId(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n req: NileRequest<any>,\n config: Config\n): ResponseError | void {\n // already set, no need to try and figure it out\n if (config.tenantId) {\n return;\n }\n return new ResponseError('tenant id needs to be set', { status: 400 });\n}\n\nfunction getTokenFromCookie(headers: Headers, cookieKey: void | string) {\n const cookie = headers.get('cookie')?.split('; ');\n const _cookies: Record<string, string> = {};\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n if (cookieKey) {\n return _cookies[cookieKey];\n }\n return null;\n}\nexport function getTenantFromHttp(headers: Headers, config: Config) {\n const cookieTenant = getTokenFromCookie(headers, 'tenantId');\n return cookieTenant ?? headers?.get(X_NILE_TENANT) ?? config.tenantId;\n}\n\nexport function getUserFromHttp(headers: Headers, config: Config) {\n const token = getTokenFromCookie(headers, config.api.cookieKey);\n if (token) {\n const jwt = decodeJwt(token);\n return jwt.sub;\n }\n return headers?.get(X_NILE_USER_ID) ?? config.userId;\n}\n\nexport async function _fetch(\n config: Config,\n path: string,\n opts?: RequestInit\n): Promise<Response | ResponseError> {\n const url = `${config.api?.basePath}${path}`;\n const cookieKey = config.api?.cookieKey;\n const headers = new Headers(opts?.headers);\n const basicHeaders = new Headers();\n basicHeaders.set('content-type', 'application/json; charset=utf-8');\n const authHeader = headers.get('Authorization');\n if (!authHeader) {\n const token = getTokenFromCookie(headers, cookieKey);\n if (token) {\n basicHeaders.set('Authorization', `Bearer ${token}`);\n } else if (config.api?.token) {\n basicHeaders.set('Authorization', `Bearer ${config.api?.token}`);\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 const response = await fetch(useableUrl, {\n ...opts,\n headers: basicHeaders,\n }).catch((e) => {\n // eslint-disable-next-line no-console\n console.log(e);\n });\n\n if (response && response.status >= 200 && response.status < 300) {\n return response;\n }\n\n let res;\n try {\n res = await (response as Response)?.json();\n } catch (e) {\n /* do the default */\n }\n if (res && 'message' in res) {\n const { message } = res;\n return new ResponseError(message, { status: 400 });\n }\n if (res && 'errors' in res) {\n const {\n errors: [message],\n } = res;\n return new ResponseError(message, { status: 400 });\n }\n\n return new ResponseError(null, {\n status: (response as Response)?.status ?? 500,\n });\n}\n","import isEmpty from 'lodash/isEmpty';\nimport isObject from 'lodash/isObject';\n\nimport { Config } from '../Config';\nimport { ResponseError } from '../ResponseError';\nimport { X_NILE_TENANT, _fetch } from '../fetch';\n\nexport { NileResponse, NileRequest } from './types';\n\ntype Methods = 'POST' | 'GET' | 'PUT';\nexport default class Requester<T> extends Config {\n constructor(config: Config) {\n super(config);\n }\n\n async rawRequest(\n method: Methods,\n url: string,\n init: RequestInit,\n body?: string\n ): Promise<Response> {\n const _init = {\n ...init,\n body,\n method,\n };\n\n const res = await _fetch(this, url, _init);\n\n if (res instanceof ResponseError) {\n return res.response;\n }\n\n return res;\n }\n\n /**\n * three optios here\n * 1) pass in headers for a server side request\n * 2) pass in the payload that matches the api\n * 3) pass in the request object sent by a browser\n * @param method\n * @param url\n * @param req\n * @param init\n * @returns\n */\n protected async request(\n method: Methods,\n url: string,\n req: T | Headers,\n init?: RequestInit\n ): Promise<Response> {\n // set the headers\n const headers = new Headers(init ? init?.headers : {});\n if (req instanceof Headers) {\n const tenantId = req.get(X_NILE_TENANT);\n const cookie = req.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n } else if (req instanceof Request) {\n // pass back the X_NILE_TENANT\n const _headers = new Headers(req?.headers);\n const tenantId = _headers.get(X_NILE_TENANT);\n const cookie = _headers.get('cookie');\n if (tenantId) {\n headers.set(X_NILE_TENANT, tenantId);\n }\n if (cookie) {\n headers.set('cookie', cookie);\n }\n }\n // default the body - may be the actual payload for the API\n let body: string | undefined = JSON.stringify(req);\n\n // comes from next/some server\n if (method === 'GET') {\n body = undefined;\n } else if (req instanceof Request) {\n body = await new Response(req.body).text();\n } else if (\n // is just headers for a GET request\n req instanceof Headers ||\n isEmpty(req) ||\n (isObject(req) && Object.values(req).length === 0)\n ) {\n body = undefined;\n }\n\n const _init = {\n ...init,\n headers,\n };\n\n return await this.rawRequest(method, url, _init, body);\n }\n\n post = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('POST', url, req, init);\n };\n\n get = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('GET', url, req, init);\n };\n\n put = async (\n req: T | Headers,\n url: string,\n init?: RequestInit\n ): Promise<Response> => {\n return await this.request('PUT', url, req, init);\n };\n}\n","import { RestModels } from '@niledatabase/js';\n\nimport { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\nimport { ResponseError } from '../utils/ResponseError';\nimport {\n X_NILE_TENANT,\n X_NILE_USER_ID,\n getTenantFromHttp,\n} from '../utils/fetch';\nimport { updateToken, updateUserId } from '../utils/Event';\n\nexport default class Auth extends Config {\n constructor(config: Config) {\n super(config);\n }\n get loginUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/users/login`;\n }\n\n login = async (\n req: NileRequest<RestModels.CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<RestModels.LoginUserResponse> => {\n const headers = new Headers({ 'content-type': 'application/json' });\n const _requester = new Requester(this);\n\n const params =\n req instanceof Request\n ? new URL(req.url).searchParams\n : new URLSearchParams();\n\n const sso = params.get('sso');\n\n if (sso === 'true') {\n const providerRes = await this.listProviders(\n (req as Request).clone(),\n init\n );\n // if you have a provider, log them in\n if (\n providerRes &&\n providerRes.status >= 200 &&\n providerRes.status < 300\n ) {\n const providers = await new Response(providerRes.body).json();\n if (providers.length > 0) {\n if (providers.length > 1) {\n return new Response(JSON.stringify(providers), { status: 200 });\n // a user has to make a choice\n }\n\n // is there a way to do this? probably not.\n headers.set(X_NILE_TENANT, providers[0].tenantId);\n headers.append(\n 'set-cookie',\n `tenantId=${providers[0].tenantId}; path=/; httponly;`\n );\n // const ssoResp = await this.loginSSO(req);\n return new Response(\n JSON.stringify({\n redirectURI: `${this.api.basePath}${this.loginSSOUrl('okta')}`,\n }),\n { status: 200 }\n );\n // make it a client side redirect, because of the headers\n // if there is no provider, require a password.\n }\n }\n }\n\n const res = await _requester.post(req, this.loginUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: RestModels.LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { tenants } = token;\n const tenant = tenants?.values();\n const tenantId = tenant?.next().value;\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n updateToken(token.token.jwt);\n\n return new Response(JSON.stringify(token), { status: 200, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n loginSSO = (redirectUrl: string) => {\n const ssoLogin = async (\n req: NileRequest<unknown>\n ): NileResponse<RestModels.TenantSSORegistration[]> => {\n const headers = new Headers();\n const body = await (req as Request).formData();\n const accessToken = (await body.get('access_token')) as string;\n const tenantId = (await body.get('tenantId')) as string;\n const cookie = `${this.api?.cookieKey}=${accessToken}; path=/; samesite=lax; httponly;`;\n updateToken(accessToken);\n headers.append('set-cookie', cookie);\n headers.set(X_NILE_TENANT, tenantId);\n headers.append('set-cookie', `tenantId=${tenantId}; path=/; httponly;`);\n headers.set('Location', redirectUrl);\n return new Response(null, {\n headers,\n status: 303,\n });\n };\n return ssoLogin;\n };\n\n loginSSOUrl = (provider: string) => {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }/auth/oidc/providers/${provider}/login`;\n };\n\n get signUpUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/users`;\n }\n\n signUp = async (\n req: NileRequest<RestModels.CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<RestModels.LoginUserResponse> => {\n const headers = new Headers();\n const _requester = new Requester(this);\n const res = await _requester.post(req, this.signUpUrl, init).catch((e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n return e;\n });\n if (res instanceof ResponseError) {\n return res.response;\n }\n if (res && res.status >= 200 && res.status < 300) {\n const token: RestModels.LoginUserResponse = await res.json();\n const cookie = `${this.api?.cookieKey}=${token.token?.jwt}; path=/; samesite=lax; httponly;`;\n headers.append('set-cookie', cookie);\n const { id } = token;\n updateToken(token.token?.jwt);\n updateUserId(id);\n headers.set(X_NILE_USER_ID, id);\n headers.append('set-cookie', `userId=${id}; path=/; httponly;`);\n return new Response(JSON.stringify(token), { status: 201, headers });\n }\n const text = await res.text();\n return new Response(text, { status: res.status });\n };\n\n updateProviderUrl(providerName: string) {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers/${encodeURIComponent(providerName)}`;\n }\n\n get listTenantProvidersUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants/${\n this.tenantId ? encodeURIComponent(this.tenantId) : '{tenantId}'\n }/auth/oidc/providers`;\n }\n\n listTenantProviders = async (\n req: NileRequest<void | Headers>,\n init?: RequestInit\n ): NileResponse<RestModels.TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.listTenantProvidersUrl, init);\n };\n\n createProvider = async (\n req: NileRequest<RestModels.RegisterTenantSSORequest>,\n init?: RequestInit\n ): NileResponse<RestModels.TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.post(req, this.updateProviderUrl(providerName), init);\n };\n\n updateProvider = async (\n req: NileRequest<RestModels.RegisterTenantSSORequest>,\n init?: RequestInit\n ): NileResponse<RestModels.TenantSSORegistration> => {\n const _requester = new Requester(this);\n const providerName = 'okta';\n return _requester.put(req, this.updateProviderUrl(providerName), init);\n };\n\n providerUrl(email?: undefined | string) {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(\n this.database\n )}/tenants/auth/oidc/providers${\n email ? `?email=${encodeURIComponent(email)}` : ''\n }`;\n }\n\n listProviders = async (\n req: NileRequest<void | RestModels.CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<RestModels.TenantSSORegistration[]> => {\n const _requester = new Requester(this);\n let body: { email: string } | undefined;\n // this is a get. Get the email from the response body so the request is filtered.\n if (req && 'body' in req) {\n body = await new Response(req.body as BodyInit).json();\n }\n return _requester.get(req, this.providerUrl(body?.email), init);\n };\n\n getSSOCallbackUrl = (param: Headers | string) => {\n let tenantId;\n if (typeof tenantId === 'string') {\n tenantId = param;\n } else if (param instanceof Headers) {\n tenantId = getTenantFromHttp(param, this);\n }\n\n return `${this.api.basePath}/workspaces/${this.workspace}/databases/${this.database}/tenants/${tenantId}/auth/oidc/callback`;\n };\n}\n","import { RestModels } from '@niledatabase/js';\n\nimport { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport default class Users extends Config {\n constructor(config: Config) {\n super(config);\n }\n get tenantUsersUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }/users`;\n }\n\n createTenantUser = async (\n req: NileRequest<RestModels.CreateBasicUserRequest>,\n init?: RequestInit\n ): NileResponse<RestModels.LoginUserResponse> => {\n const _requester = new Requester(this);\n return await _requester.post(req, this.tenantUsersUrl, init);\n };\n\n listTenantUsers = async (\n req: NileRequest<void> | Headers,\n init?: RequestInit\n ): NileResponse<RestModels.User[]> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.tenantUsersUrl, init);\n };\n\n get meUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/users/me`;\n }\n\n me = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<RestModels.User> => {\n const _requester = new Requester(this);\n return await _requester.get(req, this.meUrl, init);\n };\n}\n","import { RestModels } from '@niledatabase/js';\n\nimport { Config } from '../utils/Config';\nimport Requester, { NileRequest, NileResponse } from '../utils/Requester';\n\nexport default class Tenants extends Config {\n constructor(config: Config) {\n super(config);\n }\n get tenantsUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants`;\n }\n get tenantUrl() {\n return `/workspaces/${encodeURIComponent(\n this.workspace\n )}/databases/${encodeURIComponent(this.database)}/tenants/${\n this.tenantId ?? '{tenantId}'\n }`;\n }\n\n createTenant = async (\n req: NileRequest<{ name: string }>,\n init?: RequestInit\n ): NileResponse<RestModels.Tenant> => {\n const _requester = new Requester(this);\n return _requester.post(req, this.tenantsUrl, init);\n };\n\n getTenant = async (\n req: NileRequest<void>,\n init?: RequestInit\n ): NileResponse<RestModels.Tenant> => {\n const _requester = new Requester(this);\n return _requester.get(req, this.tenantUrl, init);\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport knex, { Knex } from 'knex';\n\nimport { Config } from '../utils/Config';\nimport { evictPool } from '../utils/Event';\nimport { AfterCreate, PgConnectionConfig, PoolConfig } from '../types';\n\n// doing this now, to provide flexibility later\nclass NileDatabase {\n knex: Knex;\n // db: Knex;\n tenantId?: undefined | null | string;\n userId?: undefined | null | string;\n id: string;\n config: any;\n timer: NodeJS.Timeout | undefined;\n\n constructor(config: Config, id: string) {\n this.id = id;\n let poolConfig: PoolConfig = {\n min: 0,\n ...config.db.pool,\n };\n const afterCreate: AfterCreate = (conn, done) => {\n const query = [`SET nile.tenant_id = '${config.tenantId}'`];\n if (config.userId) {\n if (!config.tenantId) {\n // eslint-disable-next-line no-console\n console.warn(\n 'A user id cannot be set in context without a tenant id'\n );\n }\n query.push(`SET nile.user_id = '${config.userId}'`);\n }\n // in this example we use pg driver's connection API\n conn.query(query.join(';'), function (err: unknown) {\n done(err, conn);\n });\n };\n if (config.tenantId) {\n if (config.db.pool?.afterCreate) {\n // eslint-disable-next-line no-console\n console.log(\n 'Providing an pool configuration will stop automatic tenant context setting.'\n );\n } else if (config.db.pool) {\n poolConfig = {\n ...config.db.pool,\n afterCreate,\n };\n } else if (!config.db.pool) {\n poolConfig = {\n afterCreate,\n };\n }\n }\n\n this.config = {\n ...config,\n db: {\n ...config.db,\n connection: {\n ...(config.db.connection as PgConnectionConfig),\n database:\n (config.db.connection as PgConnectionConfig)?.database ??\n config.database,\n },\n pool: poolConfig,\n },\n };\n const knexConfig = { ...this.config.db, client: 'pg' };\n\n // start the timer for cleanup\n this.startTimeout();\n\n this.knex = knex(knexConfig);\n this.knex.on('query', () => {\n this.startTimeout();\n });\n }\n\n startTimeout() {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(async () => {\n await this.knex.destroy();\n evictPool(this.id);\n }, this.config.db.pool.idleTimeoutMillis ?? 30000);\n }\n}\n\nexport type NileDatabaseI = (table?: string) => Knex;\nexport default NileDatabase;\n","import { Config } from '../utils/Config';\nimport { watchEvictPool } from '../utils/Event';\n\nimport NileDatabase, { NileDatabaseI } from './NileInstance';\n\nexport default class DBManager {\n connections: Map<string, NileDatabase>;\n\n private makeId(\n tenantId?: string | undefined | null,\n userId?: string | undefined | null\n ) {\n if (tenantId && userId) {\n return `${tenantId}:${userId}`;\n }\n if (tenantId) {\n return `${tenantId}`;\n }\n return 'base';\n }\n constructor(config: Config) {\n this.connections = new Map();\n // add the base one, so you can at least query\n const id = this.makeId();\n this.connections.set(id, new NileDatabase(new Config(config), id));\n watchEvictPool((id) => {\n if (id && this.connections.has(id)) {\n this.connections.delete(id);\n }\n });\n }\n\n getConnection(config: Config): NileDatabaseI {\n const id = this.makeId(config.tenantId, config.userId);\n const existing = this.connections.get(id);\n if (existing) {\n return existing as unknown as NileDatabaseI;\n }\n this.connections.set(id, new NileDatabase(new Config(config), id));\n return this.connections.get(id) as unknown as NileDatabaseI;\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 { InstanceConfig, PgConnectionConfig, ServerConfig } from './types';\nimport { Config } from './utils/Config';\nimport Auth from './auth';\nimport Users from './users';\nimport Tenants from './tenants';\nimport { watchTenantId, watchToken, watchUserId } from './utils/Event';\nimport DbManager, { NileDatabaseI } from './db';\nimport DBManager from './db/DBManager';\nimport { getServerId, makeServerId } from './utils/Server';\n\ntype Api = {\n auth: Auth;\n users: Users;\n tenants: Tenants;\n};\n\nconst init = (config: Config): [Api] => {\n const auth = new Auth(config);\n const users = new Users(config);\n const tenants = new Tenants(config);\n return [\n {\n auth,\n users,\n tenants,\n },\n ];\n};\n\nclass 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);\n this.servers = new Map();\n const [api] = init(this.config);\n this.api = api;\n this.manager = new DBManager(this.config);\n\n watchTenantId((tenantId) => {\n this.tenantId = tenantId;\n });\n watchUserId((userId) => {\n this.userId = userId;\n });\n watchToken((token) => {\n this.token = token;\n });\n }\n\n setConfig(cfg: Config) {\n this.config = new Config(cfg);\n }\n\n set database(val: string | void) {\n if (val) {\n this.config.database = val;\n (this.config.db.connection as PgConnectionConfig).database = val;\n this.api.auth.database = val;\n this.api.users.database = val;\n this.api.tenants.database = val;\n }\n }\n\n set workspace(val: string | void) {\n if (val) {\n this.config.workspace = val;\n this.api.auth.workspace = val;\n this.api.users.workspace = val;\n this.api.tenants.workspace = 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.database = this.config.database;\n\n this.config.userId = userId;\n\n if (this.api) {\n this.api.auth.userId = this.config.userId;\n this.api.users.userId = this.config.userId;\n this.api.tenants.userId = this.config.userId;\n }\n }\n\n get tenantId(): string | undefined | null {\n return this.config.tenantId;\n }\n\n set tenantId(tenantId: string | undefined | null) {\n this.database = this.config.database;\n this.config.tenantId = tenantId;\n\n if (this.api) {\n this.api.auth.tenantId = tenantId;\n this.api.users.tenantId = tenantId;\n this.api.tenants.tenantId = tenantId;\n }\n }\n\n get token(): string | undefined | null {\n return this.config?.api?.token;\n }\n\n set token(token: string | undefined | null) {\n if (token) {\n this.config.api.token = token;\n if (this.api) {\n this.api.auth.api.token = token;\n this.api.users.api.token = token;\n this.api.tenants.api.token = token;\n }\n }\n }\n get db(): NileDatabaseI {\n // only need to interact with the knex object\n //@ts-expect-error - because that's where it is in the proxy\n return this.manager.getConnection(this.config).knex;\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: InstanceConfig): Server {\n const _config = { ...this.config, ...config };\n const serverId = getServerId(_config);\n const currentServerId = makeServerId(this.config);\n if (serverId === currentServerId) {\n return this;\n }\n const existing = this.servers.get(serverId);\n\n if (existing) {\n // be sure the config is up to date\n const updatedConfig = new Config(_config);\n existing.setConfig(updatedConfig);\n // propagage special config items\n existing.tenantId = updatedConfig.tenantId;\n existing.userId = updatedConfig.userId;\n existing.token = updatedConfig.api.token;\n existing.workspace = updatedConfig.workspace;\n existing.database = updatedConfig.database;\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\n// export default Server;\nexport default function Nile(config: ServerConfig) {\n const server = new Server(config);\n server.setConfig(new Config(config as ServerConfig));\n return server;\n}\n","import { default as Server } from './Server';\n\nmodule.exports = Server;\nexport default Server;\n"],"names":["Events","ApiConfig","_ref","cookieKey","token","this","basePath","_token","_createClass","key","get","set","value","Config","_config","database","String","workspace","_tenantId","tenantId","_userId","userId","api","_config$api$basePath","_config$api","_config$api$cookieKey","_config$api2","_config$api3","connection","_extends","host","db","_config$db","port","_config$db2","_config$db3","Number","_config$db4","_config$db5","ResponseError","body","init","response","Response","eventer","Eventer","events","_proto","prototype","publish","eventName","callbackList","_step","_iterator","_createForOfIteratorHelperLoose","done","callback","subscribe","push","updateTenantId","Tenant","updateUserId","User","updateToken","val","Token","getTokenFromCookie","headers","cookie","_headers$get","split","_cookies","cookieParts","_cookie","slice","join","_step2","_iterator2","getTenantFromHttp","config","cookieTenant","getUserFromHttp","decodeJwt","sub","_headers$get2","_fetch","_x","_x2","_x3","_fetch2","apply","arguments","_asyncToGenerator","_regeneratorRuntime","mark","_callee","path","opts","_response$status","url","basicHeaders","_config$api4","useableUrl","res","wrap","_context","prev","next","Headers","includes","abrupt","status","replace","encodeURIComponent","fetch","e","console","log","sent","json","t0","message","errors","stop","Requester","_Config","_this","call","req","request","_ref2","_callee2","_context2","_x4","_x5","_x6","_ref3","_callee3","_context3","_x7","_x8","_x9","_inheritsLoose","rawRequest","_rawRequest","_callee4","method","_init","_context4","_x10","_x11","_x12","_x13","_request","_callee5","_headers","_context5","Request","JSON","stringify","undefined","text","isEmpty","isObject","Object","values","length","_x14","_x15","_x16","_x17","Auth","_requester","providerRes","providers","_this$api","tenants","tenant","content-type","_assertThisInitialized","URL","searchParams","URLSearchParams","listProviders","clone","append","redirectURI","loginSSOUrl","post","loginUrl","error","jwt","redirectUrl","_this$api2","accessToken","formData","provider","_this$tenantId","_this$api3","_token$token","_token$token2","id","signUpUrl","_ref4","listTenantProvidersUrl","_ref5","updateProviderUrl","_ref6","_callee6","_context6","put","_ref7","_callee7","_body","_context7","providerUrl","email","param","providerName","Users","tenantUsersUrl","meUrl","Tenants","tenantsUrl","tenantUrl","NileDatabase","_config$db$pool","poolConfig","min","pool","afterCreate","conn","query","warn","err","_config$db$connection","_config$db$connection2","knexConfig","client","startTimeout","knex","on","timer","clearTimeout","setTimeout","_this2","destroy","EvictPool","_this$config$db$pool$","idleTimeoutMillis","DBManager","connections","Map","makeId","has","getConnection","makeServerId","Buffer","from","toString","Server","servers","auth","users","manager","setConfig","cfg","getInstance","serverId","getServerId","existing","updatedConfig","_this$config","Nile","server","module","exports"],"mappings":"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"}
@@ -1367,9 +1367,12 @@ var Tenants = /*#__PURE__*/function (_Config) {
1367
1367
  var NileDatabase = /*#__PURE__*/function () {
1368
1368
  function NileDatabase(config, id) {
1369
1369
  var _config$db$connection,
1370
+ _config$db$connection2,
1370
1371
  _this = this;
1371
1372
  this.id = id;
1372
- var poolConfig = {};
1373
+ var poolConfig = _extends({
1374
+ min: 0
1375
+ }, config.db.pool);
1373
1376
  var afterCreate = function afterCreate(conn, done) {
1374
1377
  var query = ["SET nile.tenant_id = '" + config.tenantId + "'"];
1375
1378
  if (config.userId) {
@@ -1402,7 +1405,7 @@ var NileDatabase = /*#__PURE__*/function () {
1402
1405
  this.config = _extends({}, config, {
1403
1406
  db: _extends({}, config.db, {
1404
1407
  connection: _extends({}, config.db.connection, {
1405
- database: (_config$db$connection = config.db.connection.database) != null ? _config$db$connection : config.database
1408
+ database: (_config$db$connection = (_config$db$connection2 = config.db.connection) == null ? void 0 : _config$db$connection2.database) != null ? _config$db$connection : config.database
1406
1409
  }),
1407
1410
  pool: poolConfig
1408
1411
  })
@@ -1424,10 +1427,20 @@ var NileDatabase = /*#__PURE__*/function () {
1424
1427
  if (this.timer) {
1425
1428
  clearTimeout(this.timer);
1426
1429
  }
1427
- this.timer = setTimeout(function () {
1428
- _this2.knex.destroy();
1429
- evictPool(_this2.id);
1430
- }, (_this$config$db$pool$ = this.config.db.pool.idleTimeoutMillis) != null ? _this$config$db$pool$ : 30000);
1430
+ this.timer = setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
1431
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
1432
+ while (1) switch (_context.prev = _context.next) {
1433
+ case 0:
1434
+ _context.next = 2;
1435
+ return _this2.knex.destroy();
1436
+ case 2:
1437
+ evictPool(_this2.id);
1438
+ case 3:
1439
+ case "end":
1440
+ return _context.stop();
1441
+ }
1442
+ }, _callee);
1443
+ })), (_this$config$db$pool$ = this.config.db.pool.idleTimeoutMillis) != null ? _this$config$db$pool$ : 30000);
1431
1444
  };
1432
1445
  return NileDatabase;
1433
1446
  }();
@@ -1522,6 +1535,15 @@ var Server = /*#__PURE__*/function () {
1522
1535
  }
1523
1536
  var existing = this.servers.get(serverId);
1524
1537
  if (existing) {
1538
+ // be sure the config is up to date
1539
+ var updatedConfig = new Config(_config);
1540
+ existing.setConfig(updatedConfig);
1541
+ // propagage special config items
1542
+ existing.tenantId = updatedConfig.tenantId;
1543
+ existing.userId = updatedConfig.userId;
1544
+ existing.token = updatedConfig.api.token;
1545
+ existing.workspace = updatedConfig.workspace;
1546
+ existing.database = updatedConfig.database;
1525
1547
  return existing;
1526
1548
  }
1527
1549
  this.servers.set(serverId, new Server(_config));