@niledatabase/server 5.1.0 → 5.2.0-alpha.0

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,"sources":["../src/types.ts","../src/users/types.ts","../src/utils/constants.ts","../src/api/utils/routes/index.ts","../src/utils/Logger.ts","../src/api/utils/extensions.ts","../src/api/utils/request-context.ts","../src/api/utils/request.ts","../src/api/utils/auth.ts","../src/api/routes/me/index.ts","../src/utils/fetch.ts","../src/api/routes/users/POST.ts","../src/api/routes/users/GET.ts","../src/api/routes/users/%5BuserId%5D/PUT.ts","../src/api/routes/users/index.ts","../src/api/routes/tenants/%5BtenantId%5D/users/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/users/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/index.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/PUT.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/index.ts","../src/api/routes/tenants/%5BtenantId%5D/invites/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/invites/index.ts","../src/api/routes/tenants/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/PUT.ts","../src/api/routes/tenants/POST.ts","../src/api/routes/tenants/index.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/routes/auth/verify-request.ts","../src/api/routes/auth/password-reset.ts","../src/api/routes/auth/verify-email.ts","../src/api/handlers/GET.ts","../src/api/routes/signup/POST.ts","../src/api/routes/signup/index.tsx","../src/api/handlers/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/PUT.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/index.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/%5BinviteId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/%5BinviteId%5D/index.ts","../src/api/handlers/DELETE.ts","../src/api/handlers/PUT.ts","../src/api/handlers/index.ts","../src/utils/Config/envVars.ts","../src/utils/Config/index.ts","../src/utils/Event/index.ts","../src/db/PoolProxy.ts","../src/db/NileInstance.ts","../src/db/DBManager.ts","../src/auth/index.ts","../src/auth/obtainCsrf.ts","../src/utils/qualifyDomain.ts","../src/users/index.ts","../src/tenants/index.ts","../src/api/handlers/withContext/index.ts","../src/Server.ts"],"names":["ExtensionState","route","warn","silly","request","create","key","ctx","GET","PUT","matches","POST","DELETE","pg","afterCreate","body","csrfToken","fQUrl","defaultCallbackUrl"],"mappings":"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","file":"index.mjs","sourcesContent":["import { PoolClient, PoolConfig } from 'pg';\n\nimport { Routes } from './api/types';\nimport { Server } from './Server';\nimport { LogReturn } from './utils/Logger';\n\nexport type Opts = {\n basePath?: string;\n fetch?: typeof fetch;\n};\n\nexport type Context = {\n headers: Headers;\n tenantId: string | undefined | null;\n userId: string | undefined | null;\n};\n\n// you can set headers to null, which will reset the them, keeping everything else\n// this is important for \"resetting\" after internal auth (like sign up user 1, then sign up user 2 and use that context for a while)\nexport type PartialContext = {\n headers?: null | Headers;\n tenantId?: string | undefined | null;\n userId?: string | undefined | null;\n useLastContext?: boolean;\n};\n\nexport type CTX = {\n run: <T>(ctx: Partial<Context>, fn: () => T) => T;\n get: () => Context;\n set: (partial: Partial<PartialContext>) => void;\n // mostly for convenience and testing.\n getLastUsed: () => Context;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\ntype Any = any;\nexport type ExtensionResult<TParams> = {\n id: string;\n withContext?: (ctx: CTX) => Promise<void>;\n // Called before request is handled\n onRequest?: (params: TParams, ctx: CTX) => void | Promise<void | RequestInit>;\n\n // Called after response is generated - probably a response\n onResponse?: (params: TParams, ctx: CTX) => void | Promise<void>;\n\n // called before requests to nile-auth, before onRequest\n // used for making sure the request is an actual `Request` object (or handles otherwise)\n onHandleRequest?: (params?: TParams) => RouteReturn | Promise<RouteReturn>;\n\n // allow runtime configurations by extensions\n onConfigure?: (params?: TParams) => void;\n\n // sets the context for the user id\n withUserId?: () => string;\n\n // sets the context for the tenant id\n withTenantId?: () => string;\n\n replace?: {\n handlers: (handlers: NileHandlers) => Any;\n };\n};\nexport type NileHandlers = RouteFunctions & {\n withContext: CTXHandlerType;\n};\n\nexport type Extension<TParams = Any> = (\n instance: Server\n) => ExtensionResult<TParams>;\nexport enum ExtensionState {\n onHandleRequest = 'onHandleRequest',\n onRequest = 'onRequest',\n onResponse = 'onResponse',\n withContext = 'withContext',\n withTenantId = 'withTenantId',\n withUserId = 'withUserId',\n}\nexport type NilePoolConfig = PoolConfig & { afterCreate?: AfterCreate };\nexport type LoggerType = {\n info: (args: unknown | unknown[]) => void;\n warn: (args: unknown | unknown[]) => void;\n error: (args: unknown | unknown[]) => void;\n debug: (args: unknown | unknown[]) => void;\n};\n\n/**\n * Configuration options used by the {@link Server} class.\n * Most values can be provided via environment variables if not set here.\n */\nexport type NileConfig = {\n /**\n * Unique ID of the database.\n * If omitted, the value is derived from `NILEDB_API_URL`.\n * Environment variable: `NILEDB_ID`.\n */\n databaseId?: string;\n\n /**\n * Database user used for authentication.\n * Environment variable: `NILEDB_USER`.\n */\n user?: string;\n\n /**\n * Password for the configured user.\n * Environment variable: `NILEDB_PASSWORD`.\n */\n password?: string;\n\n /**\n * Database name. Defaults to the name parsed from\n * `NILEDB_POSTGRES_URL` when not provided.\n * Environment variable: `NILEDB_NAME`.\n */\n databaseName?: string;\n\n /**\n * Tenant context used for scoping API and DB calls.\n * Environment variable: `NILEDB_TENANT`.\n */\n tenantId?: string | null | undefined;\n\n /**\n * Optional user identifier to apply when interacting with the database.\n * In most cases nile-auth injects the logged in user automatically so this\n * value rarely needs to be specified directly. It can be useful when\n * performing administrative actions on behalf of another user.\n */\n userId?: string | null | undefined;\n /** Enable verbose logging of SDK behaviour. */\n debug?: boolean;\n\n /**\n * Optional Postgres connection configuration.\n * Environment variables will be used for any values not set here.\n */\n db?: NilePoolConfig;\n\n /** Custom logger implementation. */\n logger?: LogReturn;\n\n /**\n * Base URL for nile-auth requests.\n * Environment variable: `NILEDB_API_URL`.\n */\n apiUrl?: string | undefined;\n\n /**\n * Override the client provided callback URL during authentication.\n * Environment variable: `NILEDB_CALLBACK_URL`.\n */\n callbackUrl?: string | undefined;\n\n /** Override default API routes. */\n routes?: Partial<Routes>;\n\n /** Prefix applied to all generated routes. */\n routePrefix?: string | undefined;\n\n /**\n * Force usage of secure cookies when communicating with nile-auth.\n * Defaults to `true` when `NODE_ENV` is `production`.\n * Environment variable: `NILEDB_SECURECOOKIES`.\n */\n secureCookies?: boolean;\n\n /**\n * Origin for requests made to nile-auth. This controls where users are\n * redirected after authentication. For single-page apps running on a\n * different port than the API, set this to the front-end origin\n * (e.g. `http://localhost:3001`). In a full-stack setup the value defaults\n * to the `host` header of the incoming request. When using secure cookies on\n * server-to-server calls, explicitly setting the origin ensures nile-auth\n * knows whether TLS is being used and which cookies to send.\n */\n origin?: null | undefined | string;\n\n /**\n * Additional headers sent with every API request.\n * Include a `cookie` header to forward session information.\n */\n headers?: null | Headers | Record<string, string>;\n /** Hooks executed before and after each request. */\n extensions?: Extension[];\n\n /**\n * Re-use the last set context\n */\n useLastContext?: boolean;\n};\n\nexport type NileDb = NilePoolConfig & { tenantId?: string };\n\nexport type AfterCreate = (\n conn: PoolClient,\n done: (err: null | Error, conn: PoolClient) => void\n) => void;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// taken from ts lib dom\ninterface NileBody<R, B> {\n readonly body: ReadableStream<Uint8Array> | null | B;\n readonly bodyUsed: boolean;\n arrayBuffer(): Promise<ArrayBuffer>;\n blob(): Promise<Blob>;\n formData(): Promise<FormData>;\n json(): Promise<R>;\n text(): Promise<string>;\n}\n\ninterface NResponse<T> extends NileBody<T, any> {\n readonly headers: Headers;\n readonly ok: boolean;\n readonly redirected: boolean;\n readonly status: number;\n readonly statusText: string;\n readonly type: ResponseType;\n readonly url: string;\n clone(): Response;\n}\n\ninterface NRequest<T> extends NileBody<any, T> {\n /** Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */\n readonly cache: RequestCache;\n /** Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. */\n readonly credentials: RequestCredentials;\n /** Returns the kind of resource requested by request, e.g., \"document\" or \"script\". */\n readonly destination: RequestDestination;\n /** Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the \"Host\" header. */\n readonly headers: Headers;\n /** Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] */\n readonly integrity: string;\n /** Returns a boolean indicating whether or not request can outlive the global in which it was created. */\n readonly keepalive: boolean;\n /** Returns request's HTTP method, which is \"GET\" by default. */\n readonly method: string;\n /** Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. */\n readonly mode: RequestMode;\n /** Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. */\n readonly redirect: RequestRedirect;\n /** Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and \"about:client\" when defaulting to the global's default. This is used during fetching to determine the value of the `Referer` header of the request being made. */\n readonly referrer: string;\n /** Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. */\n readonly referrerPolicy: ReferrerPolicy;\n /** Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. */\n readonly signal: AbortSignal;\n /** Returns the URL of request as a string. */\n readonly url: string;\n clone(): Request;\n}\n\nexport type NileRequest<T> = NRequest<T> | T;\n\nexport const APIErrorErrorCodeEnum = {\n InternalError: 'internal_error',\n BadRequest: 'bad_request',\n EntityNotFound: 'entity_not_found',\n DuplicateEntity: 'duplicate_entity',\n InvalidCredentials: 'invalid_credentials',\n UnknownOidcProvider: 'unknown_oidc_provider',\n ProviderAlreadyExists: 'provider_already_exists',\n ProviderConfigError: 'provider_config_error',\n ProviderMismatch: 'provider_mismatch',\n ProviderUpdateError: 'provider_update_error',\n SessionStateMissing: 'session_state_missing',\n SessionStateMismatch: 'session_state_mismatch',\n OidcCodeMissing: 'oidc_code_missing',\n} as const;\nexport type APIErrorErrorCodeEnum =\n (typeof APIErrorErrorCodeEnum)[keyof typeof APIErrorErrorCodeEnum];\n\nexport interface APIError {\n [key: string]: any | any;\n /**\n *\n * @type {string}\n * @memberof APIError\n */\n errorCode: APIErrorErrorCodeEnum;\n /**\n *\n * @type {string}\n * @memberof APIError\n */\n message: string;\n /**\n *\n * @type {number}\n * @memberof APIError\n */\n statusCode: number;\n}\n\nexport type NileResponse<T> = Promise<T | NResponse<T & APIError>>;\n\ntype ExtensionConfig = { disableExtensions: string[] };\ntype DefaultRouteReturn = Request | Response | ExtensionState;\nexport type RouteReturn<T = unknown> = void | T | Promise<void | T>;\n\nexport type RouteFunctions<T = DefaultRouteReturn> = {\n GET: (\n req: Request,\n config?: ExtensionConfig,\n ...args: unknown[]\n ) => RouteReturn<T>;\n POST: (\n req: Request,\n config?: ExtensionConfig,\n ...args: unknown[]\n ) => RouteReturn<T>;\n DELETE: (\n req: Request,\n config?: ExtensionConfig,\n ...args: unknown[]\n ) => RouteReturn<T>;\n PUT: (\n req: Request,\n config?: ExtensionConfig,\n ...args: unknown[]\n ) => RouteReturn<T>;\n};\n\nexport type ContextReturn<T = Response> = {\n response: T;\n nile: Server;\n};\n\nexport type CTXHandlerType = {\n GET: <T = Response>(req: Request) => Promise<ContextReturn<T>>;\n POST: <T = Response>(req: Request) => Promise<ContextReturn<T>>;\n DELETE: <T = Response>(req: Request) => Promise<ContextReturn<T>>;\n PUT: <T = Response>(req: Request) => Promise<ContextReturn<T>>;\n};\n","export interface CreateBasicUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: string;\n // create a tenant for the new user to an existing tenant\n newTenantName?: string;\n // add the new user to an existing tenant\n tenantId?: string;\n}\nexport interface CreateTenantUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: 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 email: string;\n name?: string | null;\n familyName?: string | null;\n givenName?: string | null;\n picture?: string | null;\n created: string;\n updated?: string;\n emailVerified?: string | null;\n tenants: string[];\n}\n","// these two are a pass though\nexport const TENANT_COOKIE = 'nile.tenant-id';\nexport const USER_COOKIE = 'nile.user-id';\nexport const HEADER_ORIGIN = 'nile-origin';\n// this one is not\nexport const HEADER_SECURE_COOKIES = 'nile-secure-cookies';\n","import { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst NILEDB_API_URL = process.env.NILEDB_API_URL;\nexport const DEFAULT_PREFIX = '/api';\n\nexport enum DefaultNileAuthRoutes {\n SIGNUP = '/signup',\n TENANTS = '/tenants',\n TENANT = '/tenants/{tenantId}',\n USER_TENANTS = '/users/{userId}/tenants',\n TENANT_USER = '/tenants/{tenantId}/users/{userId}',\n TENANT_USERS = '/tenants/{tenantId}/users',\n USER = '/users/{userId}',\n USERS = '/users',\n ME = '/me',\n INVITES = '/tenants/{tenantId}/invites',\n INVITE = '/tenants/{tenantId}/invite',\n}\n\nexport enum NileAuthRoutes {\n CSRF = '/auth/csrf',\n PROVIDERS = '/auth/providers',\n SESSION = '/auth/session',\n SIGNIN = '/auth/signin',\n CALLBACK = '/auth/callback',\n SIGNOUT = '/auth/signout',\n PASSWORD_RESET = '/auth/reset-password',\n VERIFY_EMAIL = '/auth/verify-email',\n}\n\n// these map to the developer app\nexport const appRoutes = (prefix = DEFAULT_PREFIX): Routes => ({\n SIGNIN: `${prefix}${NileAuthRoutes.SIGNIN}`,\n PROVIDERS: `${prefix}${NileAuthRoutes.PROVIDERS}`,\n SESSION: `${prefix}${NileAuthRoutes.SESSION}`,\n CSRF: `${prefix}${NileAuthRoutes.CSRF}`,\n CALLBACK: `${prefix}${NileAuthRoutes.CALLBACK}`,\n SIGNOUT: `${prefix}${NileAuthRoutes.SIGNOUT}`,\n ERROR: `${prefix}/auth/error`,\n VERIFY_REQUEST: `${prefix}/auth/verify-request`,\n VERIFY_EMAIL: `${prefix}${NileAuthRoutes.VERIFY_EMAIL}`,\n PASSWORD_RESET: `${prefix}${NileAuthRoutes.PASSWORD_RESET}`,\n ME: `${prefix}${DefaultNileAuthRoutes.ME}`,\n USERS: `${prefix}${DefaultNileAuthRoutes.USERS}`,\n USER_TENANTS: `${prefix}${DefaultNileAuthRoutes.USER_TENANTS}`,\n TENANTS: `${prefix}${DefaultNileAuthRoutes.TENANTS}`,\n TENANT: `${prefix}${DefaultNileAuthRoutes.TENANT}`,\n TENANT_USER: `${prefix}${DefaultNileAuthRoutes.TENANT_USER}`,\n TENANT_USERS: `${prefix}${DefaultNileAuthRoutes.TENANT_USERS}`,\n SIGNUP: `${prefix}${DefaultNileAuthRoutes.SIGNUP}`,\n INVITES: `${prefix}${DefaultNileAuthRoutes.INVITES}`,\n INVITE: `${prefix}${DefaultNileAuthRoutes.INVITE}`,\n LOG: `${prefix}/_log`,\n});\n\n// these map to nile-auth\nexport const apiRoutes = (apiUrl: string) => ({\n ME: makeRestUrl(apiUrl, '/me'),\n USERS: (qp: { tenantId?: null | string; newTenantName?: null | string }) =>\n makeRestUrl(apiUrl, '/users', qp),\n USER: (userId: string) => makeRestUrl(apiUrl, `/users/${userId}`),\n TENANTS: makeRestUrl(apiUrl, '/tenants'),\n TENANT: (tenantId: string) => makeRestUrl(apiUrl, `/tenants/${tenantId}`),\n SIGNUP: makeRestUrl(apiUrl, '/signup'),\n TENANT_USERS: (tenantId: string) =>\n makeRestUrl(apiUrl, `/tenants/${tenantId}/users`),\n INVITES: (tenantId: string) =>\n makeRestUrl(apiUrl, `/tenants/${tenantId}/invites`),\n INVITE: (tenantId: string) =>\n makeRestUrl(apiUrl, `/tenants/${tenantId}/invite`),\n TENANT_USER: (tenantId: string, userId: string) =>\n makeRestUrl(apiUrl, `/tenants/${tenantId}/users/${userId}`),\n USER_TENANTS: (userId: string) =>\n makeRestUrl(apiUrl, `/users/${userId}/tenants`),\n});\ntype ApiRouteKeys = keyof typeof apiRoutes;\nexport type ApiRoutePaths = (typeof apiRoutes)[ApiRouteKeys];\n\n// these map to nile-auth\nexport const proxyRoutes = (config: string) => ({\n SIGNIN: makeRestUrl(config, NileAuthRoutes.SIGNIN),\n PROVIDERS: makeRestUrl(config, NileAuthRoutes.PROVIDERS),\n SESSION: makeRestUrl(config, NileAuthRoutes.SESSION),\n CSRF: makeRestUrl(config, NileAuthRoutes.CSRF),\n CALLBACK: makeRestUrl(config, NileAuthRoutes.CALLBACK),\n SIGNOUT: makeRestUrl(config, NileAuthRoutes.SIGNOUT),\n ERROR: makeRestUrl(config, '/auth/error'),\n VERIFY_REQUEST: makeRestUrl(config, '/auth/verify-request'),\n PASSWORD_RESET: makeRestUrl(config, NileAuthRoutes.PASSWORD_RESET),\n VERIFY_EMAIL: makeRestUrl(config, NileAuthRoutes.VERIFY_EMAIL),\n});\ntype ProxyKeys = keyof typeof proxyRoutes;\nexport type ProxyPaths = (typeof proxyRoutes)[ProxyKeys];\n\nfunction filterNullUndefined(\n obj?: Record<string, string | null>\n): { [k: string]: string | null } | undefined {\n if (!obj) {\n return undefined;\n }\n return Object.fromEntries(\n Object.entries(obj).filter(\n ([, value]) => value !== null && value !== undefined\n )\n );\n}\n\nexport function makeRestUrl(\n apiUrl: string,\n path: string,\n qp?: Record<string, string | null>\n) {\n const url = apiUrl || 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(\n filterNullUndefined(qp) as Record<string, string>\n );\n const strParams = params.toString();\n return `${[url, path.substring(1, path.length)].join('/')}${\n strParams ? `?${strParams}` : ''\n }`;\n}\n\nexport function urlMatches(requestUrl: string, route: string) {\n const url = new URL(requestUrl);\n return url.pathname.startsWith(route);\n}\nexport function prefixAppRoute(config: Config) {\n return `${config.serverOrigin}${config.routePrefix}`;\n}\n\nexport function 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","/* eslint-disable no-console */\nimport { Routes } from '../api/types';\nimport { urlMatches } from '../api/utils/routes';\nimport { NileConfig } from '../types';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[38;2;255;255;0m';\nconst purple = '\\x1b[38;2;200;160;255m';\nconst orange = '\\x1b[38;2;255;165;0m';\nconst reset = '\\x1b[0m';\n\nconst baseLogger = (config: void | NileConfig, ...params: unknown[]) => ({\n silly(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug && process.env.LOG_LEVEL === 'silly') {\n console.log(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n info(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.info(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n debug(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.log(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n warn(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.warn(\n `${orange}[niledb]${reset}${yellow}[WARN]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? JSON.stringify(meta) : ''\n );\n }\n },\n error(message: string | unknown, meta?: Record<string, unknown>) {\n console.error(\n `${orange}[niledb]${reset}${red}[ERROR]${reset}${params.join(\n ''\n )}${red} ${message}`,\n meta ? meta : '',\n `${reset}`\n );\n },\n});\n\nexport type LogFunction = (\n message: string | unknown,\n meta?: Record<string, unknown>\n) => void;\n\nexport type Loggable = {\n info: LogFunction;\n debug: LogFunction;\n warn: LogFunction;\n error: LogFunction;\n silly: LogFunction;\n};\nexport type LogReturn = (prefixes?: string | string[]) => Loggable;\n\nexport default function Logger(config?: NileConfig): LogReturn {\n return (prefixes) => {\n const { info, debug, warn, error, silly } =\n config && typeof config?.logger === 'function'\n ? config.logger(prefixes)\n : baseLogger(config, prefixes);\n\n return {\n info,\n debug,\n warn,\n error,\n silly,\n };\n };\n}\n\nexport function matchesLog(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.LOG);\n}\n","import { ExtensionState } from '../../types';\nimport { Server } from '../../Server';\nimport { Config, ExtensionCtx, ExtensionReturns } from '../../utils/Config';\nimport { TENANT_COOKIE } from '../../utils/constants';\n\nimport { ctx } from './request-context';\n\nexport function getRequestConfig(params: unknown[]): Record<string, string> {\n if (typeof params[1] === 'object') {\n return params[1] as Record<string, string>;\n }\n return {};\n}\n\n// onHandleRequest -> onRequest -> onResponse\nexport function bindRunExtensions(instance: Server) {\n return async function runExtensions<T = ExtensionReturns>(\n toRun: ExtensionState,\n config: Config,\n params?: unknown | unknown[],\n _init?: RequestInit & { request: Request }\n ): Promise<T> {\n const { debug } = config.logger('[EXTENSIONS]');\n const extensionConfig = getRequestConfig(\n Array.isArray(params) ? params : [null, params]\n );\n\n if (config.extensions) {\n for (const create of config.extensions) {\n if (typeof create !== 'function') {\n continue;\n }\n const ext = create(instance);\n\n if (extensionConfig.disableExtensions?.includes(ext.id)) {\n continue;\n }\n\n if (ext.withTenantId && toRun === ExtensionState.withTenantId) {\n ctx.set({\n tenantId: await ext.withTenantId(),\n });\n }\n\n if (ext.withUserId && toRun === ExtensionState.withUserId) {\n ctx.set({ userId: await ext.withUserId() });\n }\n\n if (ext.withContext && toRun === ExtensionState.withContext) {\n await ext.withContext(ctx);\n }\n\n if (ext.onHandleRequest && toRun === ExtensionState.onHandleRequest) {\n const result = await ext.onHandleRequest(\n Array.isArray(params) ? params : [params]\n );\n debug(`${ext.id ?? create.name} ran onHandleRequest`);\n if (result != null) {\n return result as T;\n }\n }\n\n const [param] = Array.isArray(params) ? params : [params];\n\n // need to know when to call these, they are all just blindly called all the time.\n\n if (ext.onRequest && toRun === ExtensionState.onRequest) {\n // in the case where we have an existing server with headers (when handlersWithContext is used)\n // we need to merge previous headers with incoming headers, preferring the server headers in the case of a context.\n const { ...previousContext } = ctx.get();\n\n if (!_init) {\n // this isn't strictly possible, since it was called from the sdk.\n // the divergence between `onRequest` and `onHandleRequest` causes this\n continue;\n }\n\n const previousHeaders = new Headers(previousContext.headers);\n await ext.onRequest(_init.request, ctx);\n const updatedContext = ctx.get();\n if (updatedContext?.headers) {\n const cookie = updatedContext.headers.get('cookie');\n if (cookie && param.headers) {\n const updatedCookies = mergeCookies(\n previousHeaders?.get('cookie'),\n updatedContext.headers.get('cookie')\n );\n param.headers.set('cookie', updatedCookies);\n }\n\n if (updatedContext.tenantId && param.headers) {\n param.headers.set(\n TENANT_COOKIE,\n String(updatedContext.headers.get(TENANT_COOKIE))\n );\n }\n\n ctx.set({ headers: param.headers });\n }\n debug(`${ext.id ?? create.name} ran onRequest`);\n }\n\n if (ext.onResponse && toRun === ExtensionState.onResponse) {\n const result = await ext.onResponse(param, ctx);\n\n debug(`${ext.id ?? create.name} ran onResponse`);\n if (result != null) {\n return result as T;\n }\n }\n }\n }\n return undefined as T;\n };\n}\n\nexport function buildExtensionConfig(instance: Server): ExtensionCtx {\n return {\n runExtensions: bindRunExtensions(instance),\n };\n}\nfunction mergeCookies(...cookieStrings: (string | null | undefined)[]) {\n const cookieMap = new Map<string, string>();\n for (const str of cookieStrings) {\n if (!str) continue;\n for (const part of str.split(';')) {\n const [key, value] = part.split('=').map((s) => s.trim());\n if (key && value) cookieMap.set(key, value);\n }\n }\n return [...cookieMap.entries()].map(([k, v]) => `${k}=${v}`).join('; ');\n}\n\n//just makes typing faster\ntype ExtensionRunOptions = {\n skipWithContext?: boolean;\n};\n\nexport async function runExtensionContext(\n config: Config,\n options?: ExtensionRunOptions\n) {\n if (!options?.skipWithContext) {\n await config?.extensionCtx?.runExtensions(\n ExtensionState.withContext,\n config\n );\n }\n\n await config?.extensionCtx?.runExtensions(\n ExtensionState.withTenantId,\n config\n );\n await config?.extensionCtx?.runExtensions(ExtensionState.withUserId, config);\n}\n","import { AsyncLocalStorage } from 'async_hooks';\n\nimport { Config } from '@niledatabase/server/utils/Config';\n\nimport Logger from '../../utils/Logger';\nimport { CTX, Context, ExtensionState } from '../../types';\n\nimport { runExtensionContext } from './extensions';\n\nconst { warn, silly } = Logger({ debug: true })('[REQUEST CONTEXT]');\nconst storage = new AsyncLocalStorage<Context>();\n\nexport const defaultContext: Context = {\n headers: new Headers(),\n tenantId: undefined,\n userId: undefined,\n};\n\nlet lastUsedContext: Context = defaultContext;\n\nexport const ctx: CTX = {\n run(ctx, fn) {\n const merged: Context = {\n ...defaultContext,\n ...ctx,\n headers:\n ctx.headers instanceof Headers ? ctx.headers : new Headers(ctx.headers),\n };\n lastUsedContext = merged;\n return storage.run(merged, fn);\n },\n\n get: () => {\n const ctx = storage.getStore();\n if (!ctx) {\n return { ...defaultContext }; // return a throwaway object\n }\n silly(`[GET] ${serializeContext(ctx)}`);\n return ctx;\n },\n\n /**\n * This is a mirror of Server.getContext, but only for requests. We keep only the request\n * information around, everything else is :above_my_pay_grade:\n * @param partial A partial context to override\n */\n set: (partial) => {\n const store = storage.getStore();\n if (!store) {\n // ⚠️ There's no active context to mutate. You MUST be inside a .run()\n warn('ctx.set() called outside of ctx.run(). This will not persist.');\n return;\n }\n\n // setting headers blows everything away. Surgically updating does not\n if (partial.headers === null) {\n store.headers = new Headers();\n } else if (partial.headers && store.headers instanceof Headers) {\n for (const [key, value] of new Headers(partial.headers).entries()) {\n if (key.toLowerCase() === 'cookie') {\n const existingCookies = parseCookieHeader(\n store.headers.get('cookie') || ''\n );\n const newCookies = parseCookieHeader(value);\n const mergedCookies = { ...existingCookies, ...newCookies };\n store.headers.set('cookie', serializeCookies(mergedCookies));\n } else {\n store.headers.set(key, value);\n }\n }\n }\n\n if ('tenantId' in partial) store.tenantId = partial.tenantId;\n if ('userId' in partial) store.userId = partial.userId;\n\n silly(`[SET] ${serializeContext(store)}`);\n lastUsedContext = { ...store };\n },\n // for convenience only\n getLastUsed: () => lastUsedContext,\n};\n\nexport async function withNileContext<T>(\n config: Config,\n fn: () => Promise<T>,\n name = 'unknown'\n): Promise<T> {\n const initialContext = config.context;\n const existing = ctx.get();\n const { overrides: extensionOverrides, ran: extensionRan } =\n await resolveExtensionOverrides(config, existing);\n\n let mergedHeaders = new Headers(existing.headers);\n let tenantId = existing.tenantId;\n let userId = existing.userId;\n\n if (initialContext instanceof Request) {\n initialContext.headers.forEach((value, key) => {\n mergedHeaders.set(key, value);\n });\n } else {\n if (initialContext.headers === null) {\n mergedHeaders = new Headers();\n } else if (initialContext.headers) {\n const incoming =\n initialContext.headers instanceof Headers\n ? initialContext.headers\n : new Headers(initialContext.headers as HeadersInit);\n incoming.forEach((value, key) => {\n mergedHeaders.set(key, value);\n });\n }\n\n if ('tenantId' in initialContext) {\n tenantId = initialContext.tenantId;\n }\n if ('userId' in initialContext) {\n userId = initialContext.userId;\n }\n }\n\n if (extensionOverrides?.headers) {\n for (const key of extensionOverrides.headers.removed) {\n mergedHeaders.delete(key);\n }\n for (const [key, value] of extensionOverrides.headers.set) {\n mergedHeaders.set(key, value);\n }\n }\n\n if (extensionOverrides?.tenantId) {\n tenantId = extensionOverrides.tenantId.value;\n }\n\n if (extensionOverrides?.userId) {\n userId = extensionOverrides.userId.value;\n }\n\n const context = {\n headers: mergedHeaders,\n tenantId,\n userId,\n };\n\n silly(`${name} [INITIAL] ${serializeContext(context)}`);\n return ctx.run(context, async () => {\n await runExtensionContext(config, { skipWithContext: extensionRan });\n return fn();\n });\n}\n\nfunction serializeContext(context: Context): string {\n const headers: Record<string, string> = {};\n const rawHeaders = new Headers(context.headers);\n rawHeaders.forEach((value, key) => {\n headers[key] = value;\n });\n\n return JSON.stringify({\n headers,\n tenantId: context.tenantId,\n userId: context.userId,\n });\n}\n\nfunction parseCookieHeader(header: string): Record<string, string> {\n return header\n .split(';')\n .map((c) => c.trim())\n .filter(Boolean)\n .reduce((acc, curr) => {\n const [key, ...val] = curr.split('=');\n if (key) acc[key] = val.join('=');\n return acc;\n }, {} as Record<string, string>);\n}\n\nfunction serializeCookies(cookies: Record<string, string>): string {\n return Object.entries(cookies)\n .map(([k, v]) => `${k}=${v}`)\n .join('; ');\n}\n\ntype HeaderDiff = {\n set: Array<[string, string]>;\n removed: string[];\n};\n\ntype ExtensionOverrides = {\n headers?: HeaderDiff;\n tenantId?: { value: Context['tenantId'] };\n userId?: { value: Context['userId'] };\n};\n\nasync function resolveExtensionOverrides(\n config: Config,\n existing: Context\n): Promise<{ overrides?: ExtensionOverrides; ran: boolean }> {\n if (!config.extensions?.length || !config.extensionCtx) {\n return { ran: false };\n }\n\n let updated: Context | undefined;\n await ctx.run(\n {\n headers: new Headers(existing.headers),\n tenantId: existing.tenantId,\n userId: existing.userId,\n },\n async () => {\n await config.extensionCtx?.runExtensions(\n ExtensionState.withContext,\n config\n );\n updated = ctx.get();\n }\n );\n\n if (!updated) {\n return { ran: true };\n }\n\n const diff = diffContext(existing, updated);\n return { overrides: diff, ran: true };\n}\n\nfunction diffContext(\n before: Context,\n after: Context\n): ExtensionOverrides | undefined {\n const headers = diffHeaders(before.headers, after.headers);\n const tenantChanged = before.tenantId !== after.tenantId;\n const userChanged = before.userId !== after.userId;\n\n if (!headers && !tenantChanged && !userChanged) {\n return undefined;\n }\n\n const overrides: ExtensionOverrides = {};\n if (headers) {\n overrides.headers = headers;\n }\n if (tenantChanged) {\n overrides.tenantId = { value: after.tenantId };\n }\n if (userChanged) {\n overrides.userId = { value: after.userId };\n }\n return overrides;\n}\n\nfunction diffHeaders(before: Headers, after: Headers): HeaderDiff | undefined {\n const beforeMap = headersToMap(before);\n const afterMap = headersToMap(after);\n const set: Array<[string, string]> = [];\n const removed: string[] = [];\n\n for (const [key, value] of afterMap.entries()) {\n if (beforeMap.get(key) !== value) {\n set.push([key, value]);\n }\n }\n\n for (const key of beforeMap.keys()) {\n if (!afterMap.has(key)) {\n removed.push(key);\n }\n }\n\n if (set.length === 0 && removed.length === 0) {\n return undefined;\n }\n\n return { set, removed };\n}\n\nfunction headersToMap(headers: Headers): Map<string, string> {\n const map = new Map<string, string>();\n headers.forEach((value, key) => {\n map.set(key.toLowerCase(), value);\n });\n return map;\n}\n","import { ExtensionState } from '../../types';\nimport {\n HEADER_ORIGIN,\n HEADER_SECURE_COOKIES,\n TENANT_COOKIE,\n} from '../../utils/constants';\nimport { Config } from '../../utils/Config';\n\nimport { DEFAULT_PREFIX } from './routes';\nimport { ctx } from './request-context';\n\nexport default async function request(\n url: string,\n _init: RequestInit & { request: Request },\n config: Config\n) {\n const { debug, info, error } = config.logger('[REQUEST]');\n const { request, ...init } = _init;\n const requestUrl = new URL(request.url);\n const updatedHeaders = new Headers({});\n if (request.headers.get('cookie')) {\n updatedHeaders.set('cookie', String(request.headers.get('cookie')));\n }\n if (request.headers.get(TENANT_COOKIE)) {\n updatedHeaders.set(\n TENANT_COOKIE,\n String(request.headers.get(TENANT_COOKIE))\n );\n }\n // sets secure cookies for production\n if (config.secureCookies != null) {\n updatedHeaders.set(HEADER_SECURE_COOKIES, String(config.secureCookies));\n } else {\n updatedHeaders.set(\n HEADER_SECURE_COOKIES,\n process.env.NODE_ENV === 'production' ? 'true' : 'false'\n );\n }\n\n updatedHeaders.set('host', requestUrl.host);\n\n if (config.callbackUrl) {\n const cbUrl = new URL(config.callbackUrl);\n debug(`Obtained origin from config.callbackUrl ${config.callbackUrl}`);\n updatedHeaders.set(HEADER_ORIGIN, cbUrl.origin);\n // this origin may be overridden, but when SDK requests are made, we want to ignore it\n } else if (config.origin) {\n debug(`Obtained origin from config.origin ${config.origin}`);\n updatedHeaders.set(HEADER_ORIGIN, config.origin);\n } else {\n const passedOrigin = request.headers.get(HEADER_ORIGIN);\n if (passedOrigin) {\n updatedHeaders.set(HEADER_ORIGIN, passedOrigin);\n } else {\n // REST requests won't have a context\n const { headers } = ctx.get();\n const host = headers.get('host');\n if (host) {\n const serverSideOrigin = `${getProtocolFromHeaders(headers)}://${host}`;\n updatedHeaders.set(HEADER_ORIGIN, serverSideOrigin);\n\n debug(`Obtained origin from server side headers ${serverSideOrigin}`);\n } else {\n const reqOrigin =\n config.routePrefix !== DEFAULT_PREFIX\n ? `${requestUrl.origin}${config.routePrefix}`\n : requestUrl.origin;\n\n updatedHeaders.set(HEADER_ORIGIN, reqOrigin);\n debug(`Obtained origin from request ${reqOrigin}`);\n }\n }\n }\n const params = { ...init };\n\n if (\n params.method?.toLowerCase() === 'post' ||\n params.method?.toLowerCase() === 'put'\n ) {\n try {\n updatedHeaders.set('content-type', 'application/json');\n\n const bodyStream = _init.body ?? _init.request?.body ?? request.body;\n\n const bodyText = await new Response(bodyStream).text();\n\n // try to parse JSON, fallback to text if not\n try {\n params.body = JSON.stringify(JSON.parse(bodyText));\n } catch {\n updatedHeaders.set('content-type', 'application/x-www-form-urlencoded');\n params.body = bodyText;\n }\n } catch (e) {\n error('Failed to parse request body');\n }\n }\n params.headers = updatedHeaders;\n const fullUrl = `${url}${requestUrl.search}`;\n\n if (config.debug) {\n // something going on with `fetch` in nextjs, possibly other places\n // hot-reloading does not always give back `set-cookie` from fetchCSRF\n // cURL seems to always do it (and in a real app, you don't have hot reloading),\n // so add a cache bypass to stop the annoying failure reloads that actually work\n params.headers.set('request-id', crypto.randomUUID());\n params.cache = 'no-store';\n }\n\n await config.extensionCtx?.runExtensions(\n ExtensionState.onRequest,\n config,\n params,\n _init\n );\n try {\n const res: Response | void = await fetch(fullUrl, {\n ...params,\n }).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'}] ${fullUrl}`, {\n status: res?.status,\n statusText: res?.statusText,\n text: await loggingRes?.text(),\n });\n const updatedRes =\n await config.extensionCtx?.runExtensions<Response | void>(\n ExtensionState.onResponse,\n config,\n { ...params, response: res }\n );\n\n if (updatedRes) {\n return updatedRes;\n }\n return res;\n } catch (e) {\n if (e instanceof Error) {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n }\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n }\n}\n\nfunction getProtocolFromHeaders(\n headers: Headers | Record<string, string>\n): string {\n const get = (key: string) =>\n headers instanceof Headers ? headers.get(key) : headers[key.toLowerCase()];\n\n // Check x-forwarded-proto\n const xfp = get('x-forwarded-proto');\n if (xfp) return xfp.toLowerCase();\n\n // Check Forwarded header\n const forwarded = get('forwarded');\n if (forwarded) {\n const match = forwarded.match(/proto=(https?)/i);\n if (match) return match[1].toLowerCase();\n }\n\n // Check referer or origin\n const ref = get('referer') || get('origin');\n if (ref && ref.startsWith('https')) return 'https';\n\n return 'http'; // fallback\n}\n","import { Config } from '../../utils/Config';\n\nimport request from './request';\n\nexport type ProviderName =\n | 'discord'\n | 'github'\n | 'google'\n | 'hubspot'\n | 'linkedin'\n | 'slack'\n | 'twitter'\n | 'email' // magic link\n | 'credentials' // email + password\n | 'azure';\n\nexport type Providers = {\n [providerName in ProviderName]: Provider;\n};\nexport type Provider = {\n id: string;\n name: string;\n type: string;\n signinUrl: string;\n callbackUrl: string;\n};\n\nexport type JWT = {\n email: string;\n sub: string;\n id: string;\n iat: number;\n exp: number;\n jti: string;\n};\n\nexport type ActiveSession = {\n id: string;\n email: string;\n expires: string;\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<null | undefined | ActiveSession> {\n const { info, error } = config.logger('[nileauth]');\n info('checking auth');\n\n const sessionUrl = `${config.apiUrl}/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 const cloned = res.clone();\n try {\n const session = await new Response(res.body).json();\n if (Object.keys(session).length === 0) {\n info('no session found');\n return undefined;\n }\n info('session active');\n return session;\n } catch {\n error(cloned.text());\n return undefined;\n }\n}\n","import { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport {\n urlMatches,\n apiRoutes,\n DefaultNileAuthRoutes,\n} from '../../utils/routes';\nimport auth from '../../utils/auth';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'ME';\n\nexport default async function route(request: Request, config: Config) {\n const url = apiRoutes(config.apiUrl)[key];\n\n if (request.method === 'GET') {\n return await GET(url, { request }, config);\n }\n if (request.method === 'PUT') {\n return await PUT(url, { request }, config);\n }\n if (request.method === 'DELETE') {\n const session = await auth(request, config);\n if (!session) {\n return new Response(null, { status: 401 });\n }\n return await DELETE(url, { request }, config);\n }\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\nexport async function fetchMe(\n config: Config,\n method?: 'DELETE' | 'PUT',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.ME}`;\n const { headers } = ctx.get();\n const init: RequestInit = {\n headers,\n method: method ?? 'GET',\n };\n if (method === 'PUT') {\n init.body = body;\n }\n\n const req = new Request(clientUrl, init);\n if (method === 'DELETE') {\n return (await config.handlers.DELETE(req)) as Response;\n }\n if (method === 'PUT') {\n return (await config.handlers.PUT(req)) as Response;\n }\n return (await config.handlers.GET(req)) as Response;\n}\n\n/**\n * @swagger\n * /api/me:\n * delete:\n * tags:\n * - users\n * summary: soft deletes a user\n * description: marks the current user for deletion. Can only be done by the current user for the current user\n * operationId: removeSelf\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: success if the user was deleted\n * content: {}\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function DELETE(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n init.method = 'DELETE';\n\n return await request(url, init, config);\n}\n/**\n * @swagger\n * /api/me:\n * put:\n * tags:\n * - users\n * summary: updates the current user\n * description: changes the data for the current user\n * operationId: updateSelf\n * responses:\n * \"200\":\n * description: success if the user was deleted\n * content: {}\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n init.method = 'PUT';\n\n return await request(url, init, config);\n}\n\n/**\n * @swagger\n * /api/me:\n * get:\n * tags:\n * - users\n * summary: Identify the principal\n * description: Returns information about the principal associated with the session\n * provided\n * operationId: getSelf\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","import { PartialContext } from '../types';\n\nimport { TENANT_COOKIE, USER_COOKIE } from './constants';\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, context?: PartialContext) {\n const cookieTenant = getTokenFromCookie(headers, TENANT_COOKIE);\n\n return cookieTenant ? cookieTenant : context?.tenantId;\n}\n\n// do we do this any more?\nexport function getUserFromHttp(headers: Headers, context?: PartialContext) {\n const userHeader = headers?.get(USER_COOKIE);\n return userHeader ? userHeader : context?.userId;\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\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 newTenantName = yurl.searchParams.get('newTenantName');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n const url = apiRoutes(config.apiUrl).USERS({\n tenantId: tenant,\n newTenantName,\n });\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';\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 `nile.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 =\n tenantId ?? getTenantFromHttp(init.request.headers, config.context);\n\n if (!tenant) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n init.method = 'GET'; // for testing\n const url = apiRoutes(config.apiUrl).TENANT_USERS(tenant);\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport fetch from '../../../utils/request';\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 init: RequestInit & { request: Request }\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.apiUrl).USER(userId);\n\n return await fetch(url, init, config);\n}\n","import { Routes } from '../../types';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n prefixAppRoute,\n urlMatches,\n} from '../../utils/routes';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\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 } = config.logger(`[ROUTES][${key}]`);\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, { 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\nexport async function fetchUser(config: Config, method: 'PUT') {\n let clientUrl = `${prefixAppRoute(config)}${DefaultNileAuthRoutes.USERS}`;\n const { userId, headers } = ctx.get();\n\n if (method === 'PUT')\n if (!userId) {\n throw new Error(\n 'Unable to update user, the userId context is missing. Call nile.setContext({ userId }), set nile.userId = \"userId\", or add it to the function call'\n );\n } else {\n clientUrl = `${prefixAppRoute(\n config\n )}${DefaultNileAuthRoutes.USER.replace('{userId}', userId)}`;\n }\n if (!isUUID(userId)) {\n config\n .logger('[fetchUser]')\n .warn(\n 'nile.userId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n\n const init: RequestInit = {\n method,\n headers,\n };\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[method](req)) as Response;\n}\n","import { apiRoutes } from '../../../../utils/routes';\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.apiUrl).TENANT_USERS(tenantId)}`;\n return await request(url, init, config);\n}\n","import auth from '../../../../utils/auth';\nimport fetch from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes';\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 init: RequestInit & { request: Request }\n) {\n const session = await auth(init.request, config);\n\n if (!session) {\n return new Response(null, { status: 401 });\n }\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n init.body = JSON.stringify({ email: session.email });\n init.method = 'POST';\n const url = apiRoutes(config.apiUrl).TENANT_USERS(tenantId);\n\n return await fetch(url, init, config);\n}\n","import { ctx } from '../../../../utils/request-context';\nimport { Config } from '../../../../../utils/Config';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n urlMatches,\n} from '../../../../utils/routes';\nimport { Routes } from '../../../../types';\n\nimport { GET } from './GET';\nimport { POST } from './POST';\n\nconst key = 'TENANT_USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = config.logger(`[ROUTES][${key}]`);\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, { 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\nexport async function fetchTenantUsers(\n config: Config,\n method: 'GET' | 'POST',\n payload?: {\n body?: string;\n params?: { newTenantName?: string; tenantId?: string };\n }\n) {\n const { body, params } = payload ?? {};\n const { tenantId, headers } = ctx.get();\n if (!tenantId) {\n throw new Error(\n \"Unable to fetch the user's tenants, the tenantId context is missing. Call nile.setContext({ tenantId })\"\n );\n }\n if (!isUUID(tenantId)) {\n config\n .logger('fetchTenantUsers')\n .warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const q = new URLSearchParams();\n if (params?.newTenantName) {\n q.set('newTenantName', params.newTenantName);\n }\n if (params?.tenantId) {\n q.set('tenantId', params.tenantId);\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT_USERS.replace('{tenantId}', tenantId)}`;\n\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers,\n };\n // I don't think post works\n if (method === 'POST') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n","import { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\nimport request from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/invite:\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 // this came as a get request, convert it to a put\n if (yurl.searchParams.size > 0) {\n init.body = new URLSearchParams(yurl.searchParams).toString();\n }\n init.method = 'PUT';\n const url = `${apiRoutes(config.apiUrl).INVITE(tenantId)}`;\n\n const res = await request(url, init, config);\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}\n","import { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\nimport fetch from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/invite:\n * post:\n * tags:\n * - tenants\n * summary: Create an invite for a user in a tenant.\n * operationId: invite\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"201\":\n * description: An email was sent to the user, inviting them to join the 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 POST(\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 = 'POST';\n init.body = init.request.body;\n const url = `${apiRoutes(config.apiUrl).INVITE(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../utils/Config';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n urlMatches,\n} from '../../../../utils/routes';\nimport { Routes } from '../../../../types';\nimport { ctx } from '../../../../utils/request-context';\n\nimport { PUT } from './PUT';\nimport { POST } from './POST';\n\nconst key = 'INVITE';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n // the browser is a GET, but we need to PUT it into nile-auth\n // server side, this is a put\n case 'GET':\n case 'PUT':\n return await PUT(config, { request });\n case 'POST':\n return await POST(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 [, tenantId] = url.pathname.split('/').reverse();\n const route = configRoutes[key].replace('{tenantId}', tenantId);\n return urlMatches(request.url, route);\n}\n\nexport async function fetchInvite(\n config: Config,\n method?: 'POST' | 'PUT' | 'DELETE',\n body?: string\n) {\n const { headers, tenantId } = ctx.get();\n if (!tenantId) {\n throw new Error(\n 'Unable to fetch the invite for the tenant, the tenantId context is missing. Call nile.setContext({ tenantId })'\n );\n }\n if (!isUUID(tenantId)) {\n config\n .logger('fetchInvite')\n .warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n let clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.INVITE.replace('{tenantId}', tenantId)}`;\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers,\n };\n if (method === 'POST' || method === 'PUT') {\n init.body = body;\n }\n if (method === 'DELETE') {\n clientUrl = `${clientUrl}/${body}`;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n","import request from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\n/**\n * @swagger\n * /api/tenants/{tenantId}/invites:\n * get:\n * tags:\n * - tenants\n * summary: Lists invites for a tenant.\n * operationId: listInvites\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 tenant invites\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) {\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 = 'GET';\n const url = `${apiRoutes(config.apiUrl).INVITES(tenantId)}`;\n\n return await request(url, init, config);\n}\n","import { ctx } from '../../../../utils/request-context';\nimport { Config } from '../../../../../utils/Config';\nimport { DefaultNileAuthRoutes, isUUID } from '../../../../utils/routes';\nimport { Routes } from '../../../../types';\n\nimport { GET } from './GET';\n\nconst key = 'INVITES';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'GET':\n return await GET(config, { request });\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 [, tenantId] = url.pathname.split('/').reverse();\n const route = configRoutes[key].replace('{tenantId}', tenantId);\n return url.pathname.endsWith(route);\n}\n\nexport async function fetchInvites(config: Config) {\n const { tenantId, headers } = ctx.get();\n if (!tenantId) {\n throw new Error(\n 'Unable to fetch invites for the tenant, the tenantId context is missing. Call nile.setContext({ tenantId })'\n );\n }\n if (!isUUID(tenantId)) {\n config\n .logger('fetchInvites')\n .warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.INVITES.replace('{tenantId}', tenantId)}`;\n\n const req = new Request(clientUrl, { headers });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Config } from '../../../utils/Config';\nimport { ActiveSession } from '../../utils/auth';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\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.apiUrl).USER_TENANTS(session.id)}`;\n if (typeof session === 'object' && 'user' in session && session.user) {\n url = `${apiRoutes(config.apiUrl).USER_TENANTS(session.user.id)}`;\n }\n\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport request from '../../../utils/request';\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 * 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 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.apiUrl).TENANT(tenantId)}`;\n\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\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.apiUrl).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\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.apiUrl).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';\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.apiUrl).TENANTS}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport { Routes } from '../../types';\nimport auth from '../../utils/auth';\nimport { urlMatches, DefaultNileAuthRoutes, isUUID } from '../../utils/routes';\nimport { ctx } from '../../utils/request-context';\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\nconst key = 'TENANTS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = config.logger(`[ROUTES][${key}]`);\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\nexport async function fetchTenants(\n config: Config,\n method: 'POST' | 'GET',\n body?: string\n): Promise<Response> {\n const { headers } = ctx.get();\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.TENANTS}`;\n\n const init: RequestInit = {\n method,\n headers,\n };\n if (method === 'POST') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers.POST(req)) as Response;\n}\n\nexport async function fetchTenant(\n config: Config,\n method: 'GET' | 'DELETE' | 'PUT',\n body?: string\n) {\n const { headers, tenantId } = ctx.get();\n if (!tenantId) {\n throw new Error(\n 'Unable to fetch tenants, the tenantId context is missing. Call nile.setContext({ tenantId })'\n );\n }\n if (!isUUID(tenantId)) {\n config\n .logger('fetch tenant')\n .warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT.replace('{tenantId}', tenantId)}`;\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers,\n };\n if (m === 'PUT') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n\nexport async function fetchTenantsByUser(config: Config) {\n const { warn } = config.logger(' fetchTenantsByUser ');\n const { userId, headers } = ctx.get();\n if (!userId) {\n warn(\n 'nile.userId is not set. The call will still work for the API, but the database context is not set properly and may lead to unexpected behavior in your application.'\n );\n } else if (!isUUID(userId)) {\n warn(\n 'nile.userId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.TENANTS}`;\n const req = new Request(clientUrl, { headers });\n\n return (await config.handlers.GET(req)) as Response;\n}\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 { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'SIGNIN';\n\nexport default async function route(req: Request, config: Config) {\n let url = proxyRoutes(config.apiUrl)[key];\n\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n };\n if (req.method === 'POST') {\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n\n url = `${proxyRoutes(config.apiUrl)[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\n// this is not for the the credential provider STILL NEED TO FIGURE THIS OUT I THINK? or remove.\nexport async function fetchSignIn(\n config: Config,\n provider: string,\n body: URLSearchParams\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SIGNIN}/${provider}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'POST',\n body,\n headers,\n });\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config.apiUrl).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\nexport async function fetchSession(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SESSION}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'GET',\n headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config.apiUrl).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\nexport async function fetchProviders(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.PROVIDERS}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'GET',\n headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config.apiUrl).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\nexport async function fetchCsrf(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.CSRF}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'GET',\n headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport { ProviderName } from '../../utils/auth';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'CALLBACK';\n\nexport default async function route(req: Request, config: Config) {\n const { error } = config.logger(`[ROUTES][${key}]`);\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n try {\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n const url = `${proxyRoutes(config.apiUrl)[key]}/${provider}${\n params.toString() !== '' ? `?${params.toString()}` : ''\n }`;\n\n const res = await request(\n url,\n {\n request: req,\n method: req.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 } catch (e) {\n error(e);\n }\n return new Response('An unexpected error has occurred.', { status: 400 });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CALLBACK);\n}\n\n// this is for the the credential provider, among other things\nexport async function fetchCallback(\n config: Config,\n provider: ProviderName,\n body?: string,\n request?: Request,\n method: 'POST' | 'GET' = 'POST'\n): Promise<Response> {\n const { headers } = ctx.get();\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n NileAuthRoutes.CALLBACK\n }/${provider}${request ? `?${new URL(request.url).searchParams}` : ''}`;\n const req = new Request(clientUrl, {\n method,\n headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport fetch from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'SIGNOUT';\nexport default async function route(request: Request, config: Config) {\n let url = proxyRoutes(config.apiUrl)[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.apiUrl)[key]}${\n provider !== 'signout' ? `/${provider}` : ''\n }`;\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\nexport async function fetchSignOut(\n config: Config,\n body: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SIGNOUT}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'POST',\n body,\n headers,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'ERROR';\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config.apiUrl)[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 { urlMatches, proxyRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'VERIFY_REQUEST';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config.apiUrl)[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';\nimport { urlMatches, proxyRoutes, NileAuthRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'PASSWORD_RESET';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config.apiUrl)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\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.PASSWORD_RESET);\n}\n\nexport async function fetchResetPassword(\n config: Config,\n method: 'POST' | 'GET' | 'PUT',\n body: null | string,\n params?: URLSearchParams,\n useJson = true\n) {\n const authParams = new URLSearchParams(params ?? {});\n if (useJson) {\n authParams?.set('json', 'true');\n }\n const { headers } = ctx.get();\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n NileAuthRoutes.PASSWORD_RESET\n }?${authParams?.toString()}`;\n const init: RequestInit = {\n method,\n headers,\n };\n if (body && method !== 'GET') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n return (await config.handlers[method](req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes, NileAuthRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'VERIFY_EMAIL';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config.apiUrl)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\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[key]);\n}\n\nexport async function fetchVerifyEmail(\n config: Config,\n method: 'POST' | 'GET',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.VERIFY_EMAIL}`;\n const { headers } = ctx.get();\n const init: RequestInit = {\n method,\n headers,\n };\n if (body) {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[method](req)) as Response;\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 invite, {\n matches as matchesInvite,\n} from '../routes/tenants/[tenantId]/invite';\nimport invites, {\n matches as matchesInvites,\n} from '../routes/tenants/[tenantId]/invites';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport { Routes } from '../types';\nimport * as authRoutes from '../routes/auth';\nimport { Config } from '../../utils/Config';\nimport { ExtensionState } from '../../types';\n\nexport default function GETTER(configRoutes: Routes, config: Config) {\n const { error, info, warn } = config.logger('[GET MATCHER]');\n return async function GET(...params: unknown[]) {\n const handledRequest = await config.extensionCtx?.runExtensions(\n ExtensionState.onHandleRequest,\n config,\n params\n );\n // if this has been overridden, we don't do anything else.\n // for express, when you do this, make a new internal instance that does not have\n // `onHandleRequest`\n if (handledRequest) {\n return handledRequest;\n }\n\n // the default\n const req = params[0] instanceof Request ? params[0] : null;\n if (!req) {\n error('Proxy requests failed, a Request object was not passed.');\n return;\n }\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n // order matters for invites (matches against tenants and invite)\n if (matchesInvites(configRoutes, req)) {\n info('matches tenant invites');\n return invites(req, config);\n }\n\n if (matchesInvite(configRoutes, req)) {\n info('matches invite');\n return invite(req, config);\n }\n\n if (matchesTenantUsers(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\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(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.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n\n if (authRoutes.matchesVerifyRequest(configRoutes, req)) {\n info('matches verify-request');\n return authRoutes.handleVerifyRequest(req, config);\n }\n\n if (authRoutes.matchesVerifyEmail(configRoutes, req)) {\n info('matches verify-email');\n return authRoutes.handleVerifyEmail(req, config);\n }\n\n if (authRoutes.matchError(configRoutes, req)) {\n info('matches error');\n return authRoutes.handleError(req, config);\n }\n warn(`No GET routes matched ${req.url}`);\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\n\n/**\n * @swagger\n * /api/signup:\n * post:\n * tags:\n * - users\n * summary: signs a user up\n * description: signs a user up and logs them in. Expects a email and password combo\n * operationId: signUp\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 and session 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 */\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.apiUrl).SIGNUP}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport { Routes } from '../../types';\nimport { ctx } from '../../utils/request-context';\nimport { urlMatches, DefaultNileAuthRoutes } from '../../utils/routes';\n\nimport { POST } from './POST';\n\nconst key = 'SIGNUP';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'POST':\n return await POST(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\nexport async function fetchSignUp(\n config: Config,\n payload: {\n body?: string;\n params?: { newTenantName?: string; tenantId?: string };\n }\n): Promise<Response> {\n const { body, params } = payload ?? {};\n const q = new URLSearchParams();\n if (params?.newTenantName) {\n q.set('newTenantName', params.newTenantName);\n }\n if (params?.tenantId) {\n q.set('tenantId', params.tenantId);\n }\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n DefaultNileAuthRoutes.SIGNUP\n }${q.size > 0 ? `?${q}` : ''}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'POST',\n headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { matchesLog } from '../../utils/Logger';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport signup, { matches as matchesSignup } from '../routes/signup';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport inviteUsers, {\n matches as matchesInviteUsers,\n} from '../routes/tenants/[tenantId]/invite';\nimport { Routes } from '../types';\nimport { ExtensionState } 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, error } = config.logger('[POST MATCHER]');\n return async function POST(...params: unknown[]) {\n // convert whatever `req` we are getting to something that will work with express.\n const handledRequest = await config.extensionCtx?.runExtensions(\n ExtensionState.onHandleRequest,\n config,\n params\n );\n // if this has been overridden, we don't do anything else.\n // for express, when you do this, make a new internal instance that does not have\n // `onHandleRequest`\n if (handledRequest) {\n return handledRequest;\n }\n // the default\n const req = params[0] instanceof Request ? params[0] : null;\n if (!req) {\n error('Proxy requests failed, a Request object was not passed.');\n return;\n }\n // special case for logging client errors\n if (matchesLog(configRoutes, req)) {\n try {\n const json = await req.clone().json();\n error(req.body && json);\n } catch {\n error(await req.text());\n }\n return new Response(null, { status: 200 });\n }\n // order matters for tenantUsers\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n // order matters for tenantInvites\n if (matchesInviteUsers(configRoutes, req)) {\n info('matches tenant invite');\n return inviteUsers(req, config);\n }\n\n if (matchesSignup(configRoutes, req)) {\n info('matches signup');\n return signup(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 if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(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.matchesVerifyEmail(configRoutes, req)) {\n info('matches verify-email');\n return authRoutes.handleVerifyEmail(req, config);\n }\n\n warn(`No POST routes matched ${req.url}`);\n return new Response(null, { status: 404 });\n };\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{userId}/link:\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: leaveTenant \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 * - 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\n const [, userId, , tenantId] = yurl.pathname.split('/').reverse();\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config.apiUrl).TENANT_USER(tenantId, userId)}/link`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{userId}/link:\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 * - name: userId \n * in: path\n * required: true\n * schema:\n * type: string\n \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\n const [, userId, , tenantId] = yurl.pathname.split('/').reverse();\n\n init.method = 'PUT';\n const url = `${apiRoutes(config.apiUrl).TENANT_USER(tenantId, userId)}/link`;\n\n return await fetch(url, init, config);\n}\n","import { ctx } from '../../../../../utils/request-context';\nimport { Config } from '../../../../../../utils/Config';\nimport { DefaultNileAuthRoutes, urlMatches } from '../../../../../utils/routes';\nimport { Routes } from '../../../../../types';\nimport auth from '../../../../../utils/auth';\n\nimport { DELETE } from './DELETE';\nimport { PUT } from './PUT';\n\nconst key = 'TENANT_USER';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = config.logger(`[ROUTES][${key}]`);\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 [, userId] = yurl.pathname.split('/').reverse();\n\n if (!userId) {\n info('No tenant id found in path');\n return new Response(null, { status: 404 });\n }\n\n switch (request.method) {\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 // `link` may be on the end of this.\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\nexport async function fetchTenantUser(\n config: Config,\n method: 'DELETE' | 'PUT'\n) {\n const { headers, tenantId, userId } = ctx.get();\n const action = method === 'PUT' ? 'add' : 'delete';\n if (!tenantId) {\n throw new Error(\n `Unable to ${action} user to the tenant, the tenantId context is missing. Use nile.withContext({ tenantId })`\n );\n }\n\n if (!userId) {\n throw new Error(\n `Unable to ${action} user to tenant. The userId context is missing. Use nile.withContext({ userId })`\n );\n }\n\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT_USER.replace('{tenantId}', tenantId).replace(\n '{userId}',\n userId\n )}/link`;\n const req = new Request(clientUrl, {\n headers,\n method,\n });\n\n return (await config.handlers[method](req)) as Response;\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport { Config } from '../../../../../../utils/Config';\nimport fetch from '../../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/invite/{inviteId}:\n * delete:\n * tags:\n * - tenants\n * summary: Deletes an invite on a tenant.\n * operationId: deleteInvite\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"204\":\n * description: Tenant invite 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 [inviteId, , 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.apiUrl).INVITE(tenantId)}/${inviteId}`;\n\n return await fetch(url, init, config);\n}\n","import { urlMatches } from '../../../../../utils/routes';\nimport { Routes } from '../../../../../types';\nimport { Config } from '../../../../../../utils/Config';\n\nimport { DELETE } from './DELETE';\n\nconst key = 'INVITE';\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'DELETE':\n return await DELETE(config, { request });\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [inviteId, , tenantId] = url.pathname.split('/').reverse();\n const route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{inviteId}', inviteId);\n return urlMatches(request.url, route);\n}\n","import { ExtensionState } from '../../types';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport me, { matches as matchesMe } from '../routes/me';\nimport tenantUser, {\n matches as matchesTenantUser,\n} from '../routes/tenants/[tenantId]/users/[userId]';\nimport invite, {\n matches as matchesInvite,\n} from '../routes/tenants/[tenantId]/invite/[inviteId]';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function DELETER(configRoutes: Routes, config: Config) {\n const { error, info, warn } = config.logger('[DELETE MATCHER]');\n return async function DELETE(...params: unknown[]) {\n // convert whatever `req` we are getting to something that will work with express.\n const handledRequest = await config.extensionCtx?.runExtensions(\n ExtensionState.onHandleRequest,\n config,\n params\n );\n // if this has been overridden, we don't do anything else.\n // for express, when you do this, make a new internal instance that does not have\n // `onHandleRequest`\n if (handledRequest) {\n return handledRequest;\n }\n // the default\n const req = params[0] instanceof Request ? params[0] : null;\n if (!req) {\n error('Proxy requests failed, a Request object was not passed.');\n return;\n }\n // order matters for tenantInvites\n if (matchesInvite(configRoutes, req)) {\n info('matches tenant invite id');\n return invite(req, config);\n }\n\n if (matchesTenantUser(configRoutes, req)) {\n info('matches tenant user');\n return tenantUser(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n\n warn('No DELETE routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import tenants, { matches as matchesTenants } from '../routes/tenants';\nimport me, { matches as matchesMe } from '../routes/me';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport tenantUser, {\n matches as matchesTenantUser,\n} from '../routes/tenants/[tenantId]/users/[userId]';\nimport invite, {\n matches as matchesInvite,\n} from '../routes/tenants/[tenantId]/invite';\nimport { handlePasswordReset, matchesPasswordReset } from '../routes/auth';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\nimport { ExtensionState } from '../../types';\n\nexport default function PUTER(configRoutes: Routes, config: Config) {\n const { error, info, warn } = config.logger('[PUT MATCHER]');\n return async function PUT(...params: unknown[]) {\n const handledRequest = await config.extensionCtx?.runExtensions(\n ExtensionState.onHandleRequest,\n config,\n params\n );\n // if this has been overridden, we don't do anything else.\n // for express, when you do this, make a new internal instance that does not have\n // `onHandleRequest`\n if (handledRequest) {\n return handledRequest;\n }\n\n // the default\n const req = params[0] instanceof Request ? params[0] : null;\n if (!req) {\n error('Proxy requests failed, a Request object was not passed.');\n return;\n }\n\n // order matters for tenantInvites\n if (matchesInvite(configRoutes, req)) {\n info('matches tenant invite');\n return invite(req, config);\n }\n\n if (matchesTenantUser(configRoutes, req)) {\n info('matches tenant user');\n return tenantUser(req, config);\n }\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesPasswordReset(configRoutes, req)) {\n info('matches reset password');\n return handlePasswordReset(req, config);\n }\n warn('No PUT routes matched');\n return new Response(null, { status: 404 });\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 'dotenv/config';\nimport { NileConfig } from '../../types';\nimport { LogReturn } from '../Logger';\n\nexport type EnvConfig = {\n config: NileConfig & { logger: LogReturn };\n};\n\nexport const getApiUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (config?.apiUrl != null) {\n return config?.apiUrl;\n }\n if (stringCheck(process.env.NILEDB_API_URL)) {\n return process.env.NILEDB_API_URL;\n }\n\n throw new Error(\n 'A connection to nile-auth is required. Set NILEDB_API_URL as an environment variable.'\n );\n};\n\nexport const getCallbackUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (stringCheck(config?.callbackUrl)) {\n return config?.callbackUrl;\n }\n return process.env.NILEDB_CALLBACK_URL;\n};\n\nexport const getSecureCookies = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (config?.secureCookies != null) {\n return config?.secureCookies;\n }\n if (stringCheck(process.env.NILEDB_SECURECOOKIES)) {\n return Boolean(process.env.NILEDB_SECURECOOKIES);\n }\n return undefined;\n};\n\nexport const getUsername = (cfg: EnvConfig) => {\n const { config } = cfg;\n const logger = config.logger;\n\n const { info } = logger();\n if (config?.user) {\n info(`[config] ${config.user}`);\n return String(config?.user);\n }\n const user = stringCheck(process.env.NILEDB_USER);\n if (user) {\n info(`[NILEDB_USER] ${user}`);\n return user;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.username) {\n return url.username;\n }\n } catch (e) {\n //ok to fail\n }\n }\n throw new Error(\n 'A database user is required. Set NILEDB_USER as an environment variable.'\n );\n};\n\nexport const getPassword = (cfg: EnvConfig) => {\n const { config } = cfg;\n const logger = config.logger;\n const log = logProtector(logger);\n if (stringCheck(config?.password)) {\n log && log('[config]').info('***');\n return String(config?.password);\n }\n\n const pass = stringCheck(process.env.NILEDB_PASSWORD);\n if (pass) {\n logger('[NILEDB_PASSWORD]').info('***');\n\n return pass;\n }\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.password) {\n return url.password;\n }\n } catch (e) {\n // ok to fail\n }\n }\n throw new Error(\n 'A database password is required. Set NILEDB_PASSWORD as an environment variable.'\n );\n};\n\nexport const getDatabaseName = (cfg: EnvConfig) => {\n const { config } = cfg;\n const { info } = config.logger('[databaseName]');\n if (stringCheck(config?.databaseName)) {\n info(`[config] ${config?.databaseName}`);\n return String(config?.databaseName);\n }\n const name = stringCheck(process.env.NILEDB_NAME);\n if (name) {\n info(`[NILEDB_NAME] ${name}`);\n return name;\n }\n\n if (process.env.NILEDB_POSTGRES_URL) {\n try {\n const pgUrl = new URL(process.env.NILEDB_POSTGRES_URL);\n return pgUrl.pathname.substring(1);\n } catch (e) {\n // ok to fail\n }\n }\n throw new Error(\n 'A database name is required. Set NILEDB_PASSWORD as an environment variable.'\n );\n};\n\nexport const getTenantId = (cfg: EnvConfig): string | null => {\n const { config } = cfg;\n const { info } = config.logger('[tenantId]');\n if (stringCheck(config?.tenantId)) {\n info(`[config] ${config?.tenantId}`);\n return String(config?.tenantId);\n }\n\n if (stringCheck(process.env.NILEDB_TENANT)) {\n info(`[NILEDB_TENANT] ${process.env.NILEDB_TENANT}`);\n return String(process.env.NILEDB_TENANT);\n }\n\n return null;\n};\n\nexport function getDbHost(cfg: EnvConfig) {\n const { config } = cfg;\n const logger = config.logger;\n const { info } = logger('[db.host]');\n\n if (stringCheck(config?.db && config.db.host)) {\n info(`[config] ${config?.db?.host}`);\n return String(config?.db?.host);\n }\n\n if (stringCheck(process.env.NILEDB_HOST)) {\n info(`[NILEDB_HOST] ${process.env.NILEDB_HOST}`);\n return process.env.NILEDB_HOST;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n info(`[NILEDB_POSTGRES_URL] ${pgUrl.hostname}`);\n return pgUrl.hostname;\n } catch (e) {\n // ok to fail\n }\n }\n\n info('[default] db.thenile.dev');\n return 'db.thenile.dev';\n}\n\nexport function getDbPort(cfg: EnvConfig): number {\n const { config } = cfg;\n const logger = config.logger;\n const { info } = logger('[db.port]');\n if (config?.db?.port && config.db.port != null) {\n info(`[config] ${config?.db.port}`);\n return Number(config.db?.port);\n }\n\n if (stringCheck(process.env.NILEDB_PORT)) {\n info(`[NILEDB_PORT] ${process.env.NILEDB_PORT}`);\n return Number(process.env.NILEDB_PORT);\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n if (pgUrl.port) {\n return Number(pgUrl.port);\n }\n } catch (e) {\n // ok to fail\n }\n }\n info('[default] 5432');\n return 5432;\n}\n\n// don't let people accidentally log secrets to production\nconst logProtector = (logger: LogReturn) => {\n return process.env.NODE_ENV === 'development' ||\n process.env.NODE_ENV === 'test'\n ? logger\n : null;\n};\n\nconst stringCheck = (str: string | null | undefined) => {\n if (str && str !== '') {\n return str;\n }\n return;\n};\n","import Handlers from '../../api/handlers';\nimport { appRoutes } from '../../api/utils/routes';\nimport { Routes } from '../../api/types';\nimport {\n NilePoolConfig,\n NileConfig,\n Extension,\n ExtensionState,\n RouteFunctions,\n PartialContext,\n} from '../../types';\nimport Logger, { LogReturn } from '../Logger';\n\nexport type ConfigurablePaths = {\n get: string[];\n post: string[];\n delete: string[];\n put: string[];\n};\nexport type ExtensionReturns = void | Response | Request | ExtensionState;\nexport type ExtensionCtx = {\n runExtensions: <T = ExtensionReturns>(\n toRun: ExtensionState,\n config: Config,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n params?: any,\n _init?: RequestInit & { request: Request }\n ) => Promise<T>;\n};\ntype ConfigConstructor = NileConfig & { extensionCtx?: ExtensionCtx };\n\nimport {\n EnvConfig,\n getDatabaseName,\n getDbHost,\n getDbPort,\n getPassword,\n getUsername,\n getSecureCookies,\n getCallbackUrl,\n getApiUrl,\n} from './envVars';\n\nexport class Config {\n routes: Routes;\n handlers: RouteFunctions;\n paths: ConfigurablePaths;\n extensionCtx: ExtensionCtx;\n extensions?: Extension[];\n logger: LogReturn;\n context: PartialContext;\n\n /**\n * The nile-auth url\n */\n apiUrl: string;\n\n origin?: string | undefined | null;\n\n /**\n * important for separating the `origin` config value from a default in order to make requests\n */\n serverOrigin: string;\n\n debug?: boolean;\n /**\n * To use secure cookies or not in the fetch\n */\n secureCookies?: boolean;\n\n callbackUrl?: string;\n /**\n * change the starting route\n */\n routePrefix: string;\n\n db: NilePoolConfig;\n\n constructor(config?: ConfigConstructor) {\n this.routePrefix = config?.routePrefix ?? '/api';\n this.debug = config?.debug;\n this.origin = config?.origin;\n this.extensions = config?.extensions;\n this.extensionCtx = config?.extensionCtx as ExtensionCtx;\n this.serverOrigin = config?.origin ?? 'http://localhost:3000';\n\n this.logger = Logger(config);\n const envVarConfig: EnvConfig = {\n config: { ...config, logger: this.logger },\n };\n this.secureCookies = getSecureCookies(envVarConfig);\n this.callbackUrl = getCallbackUrl(envVarConfig);\n\n // this four throw because its the only way to get it\n this.apiUrl = getApiUrl(envVarConfig) as string;\n const user = getUsername(envVarConfig) as string;\n const password = getPassword(envVarConfig) as string;\n const databaseName = getDatabaseName(envVarConfig) as string;\n\n const { host, port, ...dbConfig } = config?.db ?? {};\n const configuredHost = host ?? getDbHost(envVarConfig);\n const configuredPort = port ?? getDbPort(envVarConfig);\n\n this.db = {\n user,\n password,\n host: configuredHost,\n port: configuredPort,\n ...dbConfig,\n };\n if (databaseName) {\n this.db.database = databaseName;\n }\n\n // If you configured nile globally, we keep these to be sure they are honored per-request\n this.context = {\n tenantId: config?.tenantId,\n userId: config?.userId,\n headers: config?.headers ? new Headers(config.headers) : new Headers(),\n };\n\n this.routes = {\n ...appRoutes(config?.routePrefix),\n ...config?.routes,\n };\n\n this.handlers = Handlers(this.routes as Routes, this);\n\n this.paths = {\n get: [\n this.routes.ME,\n this.routes.TENANT_USERS,\n this.routes.TENANTS,\n this.routes.TENANT,\n this.routes.SESSION,\n this.routes.SIGNIN,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n this.routes.PASSWORD_RESET,\n this.routes.CALLBACK,\n this.routes.SIGNOUT,\n this.routes.VERIFY_REQUEST,\n this.routes.ERROR,\n ],\n post: [\n this.routes.TENANT_USERS,\n this.routes.SIGNUP,\n this.routes.USERS,\n this.routes.TENANTS,\n this.routes.SESSION,\n `${this.routes.SIGNIN}/{provider}`,\n this.routes.PASSWORD_RESET,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n `${this.routes.CALLBACK}/{provider}`,\n this.routes.SIGNOUT,\n ],\n put: [\n this.routes.TENANT_USERS,\n this.routes.USERS,\n this.routes.TENANT,\n this.routes.PASSWORD_RESET,\n ],\n delete: [this.routes.TENANT_USER, this.routes.TENANT],\n };\n }\n}\n","// Define a map of event names to value types\ntype EventMap = {\n [Events.User]: string | null | undefined;\n [Events.Tenant]: string | null | undefined;\n [Events.Token]: string | null | undefined;\n [Events.EvictPool]: string | null | undefined;\n [Events.Headers]: Headers | null | undefined;\n};\n\n// Generic EventFn now uses the EventMap\ntype EventFn<K extends keyof EventMap = keyof EventMap> = (\n params: EventMap[K]\n) => void;\n\nenum Events {\n User = 'userId',\n Tenant = 'tenantId',\n Token = 'token',\n EvictPool = 'EvictPool',\n Headers = 'headers',\n}\n\nclass Eventer<E extends Record<string, unknown>> {\n private events: { [K in keyof E]?: Array<(value: E[K]) => void> } = {};\n\n publish<K extends keyof E>(eventName: K, value: E[K]) {\n const callbacks = this.events[eventName];\n if (callbacks) {\n for (const callback of callbacks) {\n callback(value);\n }\n }\n }\n\n subscribe<K extends keyof E>(eventName: K, callback: (value: E[K]) => void) {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(callback);\n }\n\n unsubscribe<K extends keyof E>(\n eventName: K,\n callback: (value: E[K]) => void\n ) {\n const callbacks = this.events[eventName];\n if (!callbacks) return;\n\n const index = callbacks.indexOf(callback);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n\n if (callbacks.length === 0) {\n delete this.events[eventName];\n }\n }\n}\n\nconst eventer = new Eventer<EventMap>();\n\nexport const updateTenantId = (tenantId: EventMap[Events.Tenant]) => {\n eventer.publish(Events.Tenant, tenantId);\n};\nexport const watchTenantId = (cb: EventFn<Events.Tenant>) =>\n eventer.subscribe(Events.Tenant, cb);\n\nexport const updateUserId = (userId: EventMap[Events.User]) => {\n eventer.publish(Events.User, userId);\n};\nexport const watchUserId = (cb: EventFn<Events.User>) =>\n eventer.subscribe(Events.User, cb);\n\nexport const updateToken = (token: EventMap[Events.Token]) => {\n eventer.publish(Events.Token, token);\n};\n\nexport const evictPool = (val: EventMap[Events.EvictPool]) => {\n eventer.publish(Events.EvictPool, val);\n};\nexport const watchEvictPool = (cb: EventFn<Events.EvictPool>) =>\n eventer.subscribe(Events.EvictPool, cb);\n\nexport const updateHeaders = (val: EventMap[Events.Headers]) => {\n eventer.publish(Events.Headers, val);\n};\nexport const watchHeaders = (cb: EventFn<Events.Headers>) =>\n eventer.subscribe(Events.Headers, cb);\n","import pg from 'pg';\n\nimport { NilePoolConfig } from '../types';\nimport { LogReturn } from '../utils/Logger';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AllowAny = any;\n\nexport function createProxyForPool(\n pool: pg.Pool,\n config: NilePoolConfig,\n logger: LogReturn,\n context: string[]\n): pg.Pool {\n const { info, error } = logger('[pool]');\n return new Proxy<pg.Pool>(pool, {\n get(target: AllowAny, property) {\n if (property === 'query') {\n // give connection string a pass for these problems\n if (!config.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.database) {\n error(\n 'Unable to obtain database name. Is process.env.NILEDB_POSTGRES_URL set?'\n );\n }\n }\n const caller = target[property];\n return function query(...args: AllowAny) {\n let log = '[QUERY]';\n const [tenantId, userId] = context;\n if (tenantId) {\n log = `${log}[TENANT:${tenantId}]`;\n }\n if (userId) {\n log = `${log}[USER:${userId}]`;\n }\n info(log, ...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 pg.Pool;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport pg, { PoolConfig } from 'pg';\n\nimport { evictPool } from '../utils/Event';\nimport { AfterCreate, NilePoolConfig } from '../types';\nimport { Loggable, LogReturn } from '../utils/Logger';\n\nimport { createProxyForPool } from './PoolProxy';\n\nclass NileDatabase {\n pool: pg.Pool;\n tenantId?: undefined | null | string;\n userId?: undefined | null | string;\n id: string;\n logger: Loggable;\n timer: NodeJS.Timeout | undefined;\n config: PoolConfig;\n constructor(config: NilePoolConfig, logger: LogReturn, id: string) {\n this.logger = logger('[NileInstance]');\n this.id = id;\n const poolConfig = {\n min: 0,\n max: 10,\n idleTimeoutMillis: 30000,\n ...config,\n };\n const { afterCreate, ...remaining } = poolConfig;\n\n this.config = remaining;\n\n const cloned = { ...config };\n cloned.password = '***';\n this.logger.debug(`Connection pool config ${JSON.stringify(cloned)}`);\n\n this.pool = createProxyForPool(\n new pg.Pool(remaining),\n this.config,\n logger,\n id === 'base' ? [] : id.split(':')\n );\n\n if (typeof afterCreate === 'function') {\n this.logger.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 this.logger.debug(`pool connected ${this.id}`);\n this.startTimeout();\n const afterCreate: AfterCreate = makeAfterCreate(\n logger,\n `${this.id}|${this.timer}`\n );\n afterCreate(client, (err) => {\n const { error } = logger('[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 this.logger.info(`pool ${this.id} failed`, {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n });\n this.pool.on('release', (destroy) => {\n if (destroy) {\n clearTimeout(this.timer);\n evictPool(this.id);\n this.logger.debug(`destroying pool ${this.id}`);\n }\n });\n }\n\n startTimeout() {\n const { debug } = this.logger;\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.idleTimeoutMillis) ?? 30000\n }ms`\n );\n this.pool.end(() => {\n clearTimeout(this.timer);\n evictPool(this.id);\n });\n }, Number(this.config.idleTimeoutMillis) ?? 30000);\n }\n shutdown() {\n const { debug } = this.logger;\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(logger: LogReturn, id: string): AfterCreate {\n const { error, warn, debug } = logger('[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 const [context] = id.split('|');\n // the main ctx may mutate independent of this, the config at instantiation is the source of truth\n const [tenantId, userId] = context.split(':');\n if (tenantId !== 'base') {\n const query = [`SET nile.tenant_id = '${tenantId}'`];\n if (userId) {\n if (!tenantId) {\n warn('A user id cannot be set in context without a tenant id');\n }\n query.push(`SET nile.user_id = '${userId}'`);\n }\n\n // in this example we use pg driver's connection API\n conn.query(query.join(';'), function (err: Error) {\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 } else {\n if (query.length === 1) {\n debug(`connection context set: tenantId=${tenantId}`);\n }\n if (query.length === 2) {\n debug(\n `connection context set: tenantId=${tenantId} userId=${userId}`\n );\n }\n }\n\n done(err, conn);\n });\n }\n done(null, conn);\n };\n}\n","import pg from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { watchEvictPool } from '../utils/Event';\nimport Logger from '../utils/Logger';\nimport { ctx } from '../api/utils/request-context';\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: Config) {\n this.cleared = false;\n this.connections = new Map();\n this.poolWatcherFn = this.poolWatcher(config);\n watchEvictPool(this.poolWatcherFn);\n }\n poolWatcher = (config: Config) => (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: Config, noContext = false): pg.Pool => {\n const { info } = Logger(config)('[DBManager]');\n const { tenantId, userId } = noContext ? {} : ctx.getLastUsed();\n const id = this.makeId(tenantId, 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(config.db, config.logger, 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: Config) => {\n const { info } = Logger(config)('[DBManager]');\n info(`Clearing all connections ${this.connections.size}`);\n this.cleared = true;\n this.connections.forEach((connection) => {\n connection.shutdown();\n });\n this.connections.clear();\n };\n}\n","import { fetchCallback } from '../api/routes/auth/callback';\nimport { fetchResetPassword } from '../api/routes/auth/password-reset';\nimport { fetchProviders } from '../api/routes/auth/providers';\nimport { fetchSession } from '../api/routes/auth/session';\nimport { fetchSignIn } from '../api/routes/auth/signin';\nimport { fetchSignOut } from '../api/routes/auth/signout';\nimport { fetchSignUp } from '../api/routes/signup';\nimport { ActiveSession, JWT, Provider, ProviderName } from '../api/utils/auth';\nimport { ctx, withNileContext } from '../api/utils/request-context';\nimport { NileAuthRoutes } from '../api/utils/routes';\nimport { User } from '../users/types';\nimport { Config } from '../utils/Config';\nimport { updateHeaders, updateTenantId } from '../utils/Event';\nimport { Loggable } from '../utils/Logger';\n\nimport obtainCsrf from './obtainCsrf';\n\ntype SignUpPayload = {\n email: string;\n password: string;\n tenantId?: string;\n newTenantName?: string;\n};\n/**\n * Utility class that wraps the server side authentication endpoints.\n *\n * The methods in this class call the `fetch*` helpers which are generated\n * from the OpenAPI specification. Those helpers interact with routes under\n * the `/api/auth` prefix such as `/session`, `/signin`, `/signout` and others.\n * By reusing them here we provide a higher level interface for frameworks to\n * manage user authentication.\n */\nexport default class Auth {\n #logger: Loggable;\n #config: Config;\n /**\n * Create an Auth helper.\n *\n * @param config - runtime configuration used by the underlying fetch helpers\n * such as `serverOrigin`, `routePrefix` and default headers.\n */\n constructor(config: Config) {\n this.#config = config;\n this.#logger = config.logger('[auth]');\n }\n /**\n * Retrieve the currently active session from the API.\n *\n * Internally this issues a `GET` request to `/api/auth/session` via\n * {@link fetchSession}. If `rawResponse` is `true` the raw {@link Response}\n * object is returned instead of the parsed JSON.\n *\n * @template T Return type for the parsed session.\n * @param rawResponse - set to `true` to get the raw {@link Response} object.\n */\n getSession<T = JWT | ActiveSession | undefined>(\n rawResponse?: false\n ): Promise<T>;\n getSession(rawResponse: true): Promise<Response>;\n async getSession<T = JWT | ActiveSession | Response | undefined>(\n rawResponse = false\n ): Promise<T | Response> {\n return withNileContext(this.#config, async () => {\n const res = await fetchSession(this.#config);\n if (rawResponse) {\n return res;\n }\n try {\n const session = await res.clone().json();\n if (Object.keys(session).length === 0) {\n return undefined as T;\n }\n return session as T;\n } catch {\n return res;\n }\n });\n }\n /**\n * Acquire a CSRF token for subsequent authenticated requests.\n *\n * Issues a `GET` to `/api/auth/csrf` via {@link obtainCsrf}. When the call\n * succeeds the returned headers are merged into the current configuration so\n * future requests include the appropriate cookies.\n *\n * @param rawResponse - when `true`, skip JSON parsing and return the raw\n * {@link Response}.\n */\n async getCsrf<T = Response | JSON>(rawResponse?: false): Promise<T>;\n async getCsrf(rawResponse: true): Promise<Response>;\n async getCsrf<T = Response | JSON>(rawResponse = false) {\n return withNileContext(this.#config, async () => {\n return await obtainCsrf<T>(this.#config, rawResponse);\n });\n }\n /**\n * List all configured authentication providers.\n *\n * This calls `/api/auth/providers` using {@link fetchProviders} to retrieve\n * the available provider configuration. Providers are returned as an object\n * keyed by provider name.\n *\n * @param rawResponse - when true, return the {@link Response} instead of the\n * parsed JSON.\n */\n async listProviders(rawResponse: true): Promise<Response>;\n async listProviders<T = { [key: string]: Provider }>(\n rawResponse?: false\n ): Promise<T>;\n async listProviders<T = { [key: string]: Provider }>(\n rawResponse = false\n ): Promise<T | Response> {\n return withNileContext(this.#config, async () => {\n const res = await fetchProviders(this.#config);\n if (rawResponse) {\n return res;\n }\n try {\n return (await res.clone().json()) as T;\n } catch {\n return res;\n }\n });\n }\n /**\n * Sign the current user out by calling `/api/auth/signout`.\n *\n * The CSRF token is fetched automatically and the stored cookies are cleared\n * from the internal configuration once the request completes.\n */\n async signOut(): Promise<Response> {\n return withNileContext(\n this.#config,\n async () => {\n // check for csrf header, maybe its already there?\n const csrfRes = await this.getCsrf();\n if (!('csrfToken' in csrfRes)) {\n throw new Error('Unable to obtain CSRF token. Sign out failed.');\n }\n\n const body = JSON.stringify({\n csrfToken: csrfRes.csrfToken,\n json: true,\n });\n const res = await fetchSignOut(this.#config, body);\n\n updateHeaders(new Headers({}));\n ctx.set({ headers: null });\n\n return res;\n },\n 'signout'\n );\n }\n\n /**\n * Create a new user account and start a session.\n *\n * This method posts to the `/api/signup` endpoint using\n * {@link fetchSignUp}. Only the credential provider is supported; a valid\n * email and password must be supplied. On success the returned session token\n * is stored in the headers used for subsequent requests.\n *\n * @param payload - email and password along with optional tenant\n * information.\n * @param rawResponse - when `true` return the raw {@link Response} rather\n * than the parsed {@link User} object.\n */\n async signUp(payload: SignUpPayload, rawResponse: true): Promise<Response>;\n async signUp<T = User | Response>(payload: SignUpPayload): Promise<T>;\n async signUp<T = User | Response | undefined>(\n payload: SignUpPayload,\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(\n this.#config,\n async () => {\n // be sure its fresh\n ctx.set({ headers: null });\n const { email, password, ...params } = payload;\n if (!email || !password) {\n throw new Error(\n 'Server side sign up requires a user email and password.'\n );\n }\n\n const providers = await this.listProviders();\n const { credentials } = providers ?? {};\n if (!credentials) {\n throw new Error(\n 'Unable to obtain credential provider. Aborting server side sign up.'\n );\n }\n\n const csrf = await obtainCsrf(this.#config);\n\n let csrfToken;\n if ('csrfToken' in csrf) {\n csrfToken = csrf.csrfToken;\n } else {\n throw new Error('Unable to obtain parse CSRF. Request blocked.');\n }\n\n const body = JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n });\n\n const res = await fetchSignUp(this.#config, { body, params });\n if (res.status > 299) {\n this.#logger.error(await res.clone().text());\n return undefined as T;\n }\n const token = parseToken(res.headers);\n if (!token) {\n throw new Error(\n 'Server side sign up failed. Session token not found'\n );\n }\n const { headers } = ctx.get();\n headers?.append('cookie', token);\n ctx.set({ headers });\n // this will globally set headers for everyone, so how\n // do you make it so you can chain these together? or at least\n // call them sequentially safely? you gotta use the `withContext` callback\n updateHeaders(headers);\n if (rawResponse) {\n return res as T;\n }\n try {\n const json = (await res.clone().json()) as T;\n if (json && typeof json === 'object' && 'tenants' in json) {\n const tenantId = (json as unknown as User).tenants[0];\n if (tenantId) {\n updateTenantId(tenantId);\n }\n }\n return json;\n } catch {\n return res as T;\n }\n },\n 'signup'\n );\n }\n\n /**\n * Request a password reset email.\n *\n * Sends a `POST` to `/api/auth/password-reset` with the provided email and\n * optional callback information. The endpoint responds with a redirect URL\n * which is returned as a {@link Response} object.\n */\n async forgotPassword(req: {\n email: string;\n callbackUrl?: string;\n redirectUrl?: string;\n }): Promise<Response> {\n return withNileContext(this.#config, async () => {\n let email = '';\n const defaults = defaultCallbackUrl(this.#config);\n let callbackUrl = defaults.callbackUrl;\n let redirectUrl = defaults.redirectUrl;\n\n if ('email' in req) {\n email = req.email;\n }\n\n if ('callbackUrl' in req) {\n callbackUrl = fQUrl(req.callbackUrl ?? '', this.#config);\n }\n if ('redirectUrl' in req) {\n redirectUrl = fQUrl(req.redirectUrl ?? '', this.#config);\n }\n const body = JSON.stringify({\n email,\n redirectUrl,\n callbackUrl,\n });\n\n // we need a default\n const data = await fetchResetPassword(\n this.#config,\n 'POST',\n body,\n new URLSearchParams(),\n false\n );\n return data;\n });\n }\n\n /**\n * Complete a password reset.\n *\n * This workflow expects a token obtained from {@link forgotPassword}. The\n * function performs a POST/GET/PUT sequence against\n * `/api/auth/password-reset` as described in the OpenAPI specification.\n *\n * @param req - either a {@link Request} with a JSON body or an object\n * containing the necessary fields.\n */\n async resetPassword(\n req:\n | Request\n | {\n email: string;\n password: string;\n callbackUrl?: string;\n redirectUrl?: string;\n }\n ): Promise<Response> {\n return withNileContext(this.#config, async () => {\n let email = '';\n let password = '';\n const defaults = defaultCallbackUrl(this.#config);\n let callbackUrl = defaults.callbackUrl;\n let redirectUrl = defaults.redirectUrl;\n if (req instanceof Request) {\n const body = await req.json();\n email = body.email;\n password = body.password;\n const cbFromHeaders = parseCallback(req.headers);\n if (cbFromHeaders) {\n callbackUrl = cbFromHeaders;\n }\n if (body.callbackUrl) {\n callbackUrl = body.callbackUrl;\n }\n if (body.redirectUrl) {\n redirectUrl = body.redirectUrl;\n }\n } else {\n if ('email' in req) {\n email = req.email;\n }\n if ('password' in req) {\n password = req.password;\n }\n if ('callbackUrl' in req) {\n callbackUrl = req.callbackUrl ? req.callbackUrl : null;\n }\n if ('redirectUrl' in req) {\n redirectUrl = req.redirectUrl ? req.redirectUrl : null;\n }\n }\n // we need a default\n await this.getCsrf();\n const body = JSON.stringify({\n email,\n password,\n redirectUrl,\n callbackUrl,\n });\n let urlWithParams;\n try {\n const data = await fetchResetPassword(this.#config, 'POST', body);\n const cloned = data.clone();\n if (data.status === 400) {\n const text = await cloned.text();\n this.#logger.error(text);\n return data;\n }\n\n const { url } = await data.json();\n urlWithParams = url;\n } catch {\n // failed\n }\n let token;\n try {\n const worthyParams = new URL(urlWithParams).searchParams;\n const answer = await fetchResetPassword(\n this.#config,\n 'GET',\n null,\n worthyParams\n );\n token = parseResetToken(answer.headers);\n } catch {\n this.#logger.warn(\n 'Unable to parse reset password url. Password not reset.'\n );\n }\n\n // this only needs to happen on the local config\n const { headers } = ctx.get();\n const cookie = headers?.get('cookie')?.split('; ');\n if (token) {\n cookie?.push(token);\n } else {\n throw new Error(\n 'Unable to reset password, reset token is missing from response'\n );\n }\n if (cookie) {\n headers?.set('cookie', cookie?.join('; '));\n ctx.set({\n headers,\n });\n }\n const res = await fetchResetPassword(this.#config, 'PUT', body);\n // remove the token\n cookie?.pop();\n const cleaned: string[] =\n cookie?.filter((c) => !c.includes('nile.session')) ?? [];\n cleaned.push(String(parseToken(res.headers)));\n const updatedHeaders = new Headers({ cookie: cleaned.join('; ') });\n updateHeaders(updatedHeaders);\n\n return res;\n });\n }\n /**\n * Low level helper used by {@link signIn} to complete provider flows.\n *\n * Depending on the provider this issues either a GET or POST request to\n * `/api/auth/callback/{provider}` via {@link fetchCallback}.\n */\n async callback(provider: ProviderName, body?: string | Request) {\n if (body instanceof Request) {\n ctx.set({\n headers: body.headers,\n });\n return await fetchCallback(\n this.#config,\n provider,\n undefined,\n body,\n 'GET'\n );\n }\n return await fetchCallback(this.#config, provider, body);\n }\n /**\n * Sign a user in with one of the configured providers.\n *\n * Internally this posts to `/api/auth/signin/{provider}` and follows the\n * provider callback flow as documented in the OpenAPI spec. When using the\n * credential provider an email and password must be supplied.\n *\n * @param payload - request body or credential object\n * @param rawResponse - return the raw {@link Response} instead of parsed JSON\n */\n async signIn<T = Response>(\n provider: ProviderName,\n payload?: Request | { email: string; password: string },\n rawResponse?: true\n ): Promise<T>;\n async signIn<T = Response | undefined>(\n provider: ProviderName,\n payload?: Request | { email: string; password: string },\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n if (payload instanceof Request) {\n const body = new URLSearchParams(await payload.text());\n const origin = new URL(payload.url).origin;\n\n const payloadUrl = body?.get('callbackUrl');\n const csrfToken = body?.get('csrfToken');\n\n const callbackUrl = `${\n !payloadUrl?.startsWith('http') ? origin : ''\n }${payloadUrl}`;\n if (!csrfToken) {\n throw new Error(\n 'CSRF token in missing from request. Request it by the client before calling sign in'\n );\n }\n\n const updatedHeaders = new Headers(payload.headers);\n updatedHeaders.set('Content-Type', 'application/x-www-form-urlencoded');\n\n ctx.set({ headers: updatedHeaders });\n\n const params = new URLSearchParams({\n csrfToken,\n json: String(true),\n });\n if (payloadUrl) {\n params.set('callbackUrl', callbackUrl);\n }\n return (await fetchSignIn(this.#config, provider, params)) as T;\n }\n\n ctx.set({ headers: null });\n\n const { info, error } = this.#logger;\n\n const providers = await this.listProviders();\n info('Obtaining csrf');\n const csrf = await obtainCsrf(this.#config);\n\n let csrfToken;\n if ('csrfToken' in csrf) {\n csrfToken = csrf.csrfToken;\n // const parsedCookie = csrf.headers.get('cookie');\n // if (parsedCookie) {\n // this.#config.context.headers.set('cookie', parsedCookie);\n // }\n } else {\n throw new Error('Unable to obtain parse CSRF. Request blocked.');\n }\n\n const { credentials } = providers ?? {};\n\n if (!credentials) {\n throw new Error(\n 'Unable to obtain credential provider. Aborting server side sign in.'\n );\n }\n\n const { email, password } = payload ?? {};\n if (provider === 'email' && (!email || !password)) {\n throw new Error(\n 'Server side sign in requires a user email and password.'\n );\n }\n\n info(`Obtaining providers for ${email}`);\n info(`Attempting sign in with email ${email}`);\n if (!email) {\n throw new Error('Email missing from payload, unable to sign in');\n }\n const body = JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n });\n\n const signInRes = await this.callback(provider, body);\n\n const authCookie = signInRes?.headers.get('set-cookie');\n if (!authCookie) {\n throw new Error('authentication failed');\n }\n\n const token = parseToken(signInRes?.headers);\n const possibleError = signInRes?.headers.get('location');\n if (possibleError) {\n let urlError;\n try {\n urlError = new URL(possibleError).searchParams.get('error');\n } catch {\n //noop\n }\n if (urlError) {\n error('Unable to log user in', { error: urlError });\n return new Response(urlError, { status: signInRes.status }) as T;\n }\n }\n if (!token) {\n error('Unable to obtain auth token', {\n authCookie,\n signInRes,\n });\n throw new Error('Server login failed');\n }\n info('Server sign in successful', { authCookie });\n\n // last thing to do is be sure the next call is up to date with good headers\n const setCookie = signInRes.headers.get('set-cookie');\n const { headers } = ctx.get();\n if (setCookie) {\n const cookie = [\n parseCSRF(headers),\n parseCallback(signInRes.headers),\n parseToken(signInRes.headers),\n ]\n .filter(Boolean)\n .join('; ');\n const uHeaders = new Headers({ cookie });\n updateHeaders(uHeaders);\n ctx.set({ headers: uHeaders });\n } else {\n error('Unable to set context after sign in', {\n headers: signInRes.headers,\n });\n }\n\n if (rawResponse) {\n return signInRes as T;\n }\n try {\n return (await signInRes.clone().json()) as T;\n } catch {\n return signInRes as T;\n }\n });\n }\n}\n\n/**\n * Extract the CSRF cookie from a set of headers.\n */\nexport function parseCSRF(headers?: Headers) {\n let cookie = headers?.get('set-cookie');\n if (!cookie) {\n cookie = headers?.get('cookie');\n }\n if (!cookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.csrf-token=[^;]+)/.exec(cookie) ?? [];\n return token;\n}\n\n/**\n * Extract the callback cookie from a set of headers.\n */\nexport function parseCallback(headers?: Headers) {\n let cookie = headers?.get('set-cookie');\n if (!cookie) {\n cookie = headers?.get('cookie');\n }\n if (!cookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.callback-url=[^;]+)/.exec(cookie) ?? [];\n return token;\n}\n\n/**\n * Extract the session token cookie from a set of headers.\n */\nexport function parseToken(headers?: Headers) {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] =\n /((__Secure-)?nile\\.session-token=[^;]+)/.exec(authCookie) ?? [];\n return token;\n}\n/**\n * Internal helper for the password reset flow.\n */\nexport function parseResetToken(headers: Headers | void): string | void {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.reset=[^;]+)/.exec(authCookie) ?? [];\n return token;\n}\n\n/**\n * Extract the tenantId cookie from a set of headers.\n */\nexport function parseTenantId(headers?: Headers) {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] =\n /((__Secure-)?nile\\.tenant-id=[^;]+)/.exec(authCookie) ?? [];\n if (token) {\n const [, tenantId] = token.split('=');\n return tenantId;\n }\n return null;\n}\n\n/**\n * Determine the default callback and redirect URLs from the configured\n * headers. These are used during password reset flows when no explicit\n * callback is provided.\n */\nexport function defaultCallbackUrl(config: Config) {\n let cb = null;\n let redirect = null;\n const { headers } = ctx.get();\n const fallbackCb = parseCallback(headers);\n if (fallbackCb) {\n const [, value] = fallbackCb.split('=');\n cb = decodeURIComponent(value);\n if (value) {\n redirect = `${new URL(cb).origin}${config.routePrefix}${\n NileAuthRoutes.PASSWORD_RESET\n }`;\n }\n }\n return { callbackUrl: cb, redirectUrl: redirect };\n}\n\nfunction fQUrl(path: string, config: Config) {\n if (path.startsWith('/')) {\n const { callbackUrl } = defaultCallbackUrl(config);\n if (callbackUrl) {\n const { origin } = new URL(callbackUrl);\n return `${origin}${path}`;\n }\n }\n try {\n new URL(path);\n } catch {\n throw new Error('An invalid URL has been passed.');\n }\n return path;\n}\n","import { fetchCsrf } from '../api/routes/auth/csrf';\nimport { updateHeaders } from '../utils/Event';\nimport { Config } from '../utils/Config';\nimport { ctx } from '../api/utils/request-context';\n\nimport { parseCallback, parseCSRF, parseToken } from '.';\n\nexport default async function obtainCsrf<T = Response | { csrfToken: string }>(\n config: Config,\n rawResponse = false\n) {\n const { headers } = ctx.get();\n const res = await fetchCsrf(config);\n // we're gonna use it, so set the headers now.\n const csrfCook = parseCSRF(res.headers);\n\n // prefer the csrf from the headers over the saved one\n if (csrfCook) {\n const [, value] = csrfCook.split('=');\n const [token] = decodeURIComponent(value).split('|');\n\n const setCookie = res.headers.get('set-cookie');\n if (setCookie) {\n const cookie = [\n csrfCook,\n parseCallback(res.headers),\n parseToken(res.headers),\n ]\n .filter(Boolean)\n .join('; ');\n headers.set('cookie', cookie);\n ctx.set({ headers });\n updateHeaders(headers);\n }\n if (!rawResponse) {\n return { csrfToken: token };\n }\n } else {\n // for csrf, preserve the existing cookies\n const existingCookie = headers.get('cookie');\n const cookieParts = [];\n if (existingCookie) {\n cookieParts.push(parseToken(headers), parseCallback(headers));\n }\n if (csrfCook) {\n cookieParts.push(csrfCook);\n } else {\n // use the one tha tis already there\n cookieParts.push(parseCSRF(headers));\n }\n const cookie = cookieParts.filter(Boolean).join('; ');\n\n // we need to do it in both places in case its the very first time\n headers.set('cookie', cookie);\n ctx.set({ headers });\n updateHeaders(new Headers({ cookie }));\n }\n if (rawResponse) {\n return res as T;\n }\n try {\n return (await res.clone().json()) as T;\n } catch {\n return res as T;\n }\n}\n","export function fQUrl(callbackUrl: null | string, path: string) {\n if (path.startsWith('/')) {\n if (callbackUrl) {\n const { origin } = new URL(callbackUrl);\n return `${origin}${path}`;\n }\n }\n try {\n new URL(path);\n } catch {\n throw new Error('An invalid URL has been passed.');\n }\n return path;\n}\n","import { fetchMe } from '../api/routes/me';\nimport { Config } from '../utils/Config';\nimport { updateHeaders } from '../utils/Event';\nimport { fetchVerifyEmail } from '../api/routes/auth/verify-email';\nimport getCsrf from '../auth/obtainCsrf';\nimport { Loggable } from '../utils/Logger';\nimport { parseCallback } from '../auth';\nimport { ctx, withNileContext } from '../api/utils/request-context';\nimport { fQUrl } from '../utils/qualifyDomain';\n\nimport { User } from './types';\n\n/**\n * Convenience wrapper around the user endpoints.\n *\n * Requests are issued via {@link fetchMe} against `/api/me`. The Swagger\n * definitions for these APIs live in\n * `packages/server/src/api/routes/me/index.ts`.\n */\nexport default class Users {\n #config: Config;\n #logger: Loggable;\n /**\n * Create a new Users helper.\n * @param config - The configuration used for requests.\n */\n constructor(config: Config) {\n this.#config = config;\n this.#logger = config.logger('[me]');\n }\n\n /**\n * Update the current user via `PUT /api/me`.\n *\n * The OpenAPI description for this endpoint can be found in\n * `packages/server/src/api/routes/me/index.ts` under `updateSelf`.\n *\n * @param req - Partial user fields to send.\n * @param [rawResponse] - When `true`, return the raw {@link Response}.\n */\n async updateSelf<T = User[] | Response>(\n req: Partial<\n Omit<\n User,\n 'email' | 'tenants' | 'created' | 'updated' | 'emailVerified'\n > & { emailVerified: boolean }\n >,\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n const res = await fetchMe(this.#config, 'PUT', JSON.stringify(req));\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n });\n }\n\n /**\n * Remove the current user using `DELETE /api/me`.\n *\n * After the request the authentication headers are cleared with\n * {@link updateHeaders}. The OpenAPI docs for this route are in\n * `packages/server/src/api/routes/me/index.ts` under `removeSelf`.\n */\n async removeSelf(): Promise<Response> {\n return withNileContext(this.#config, async () => {\n const me = await this.getSelf();\n if ('id' in me) {\n const userId = (me as unknown as User).id;\n ctx.set({ userId });\n }\n const res = await fetchMe(this.#config, 'DELETE');\n updateHeaders(new Headers());\n return res;\n });\n }\n\n /**\n * Retrieve the current user with `GET /api/me`.\n *\n * OpenAPI for this endpoint resides in\n * `packages/server/src/api/routes/me/index.ts` (`getSelf`).\n *\n * @param [rawResponse] - When `true` return the raw {@link Response}.\n */\n async getSelf<T = User | Response>(rawResponse?: false): Promise<T>;\n async getSelf(rawResponse: true): Promise<Response>;\n async getSelf<T = User | Response>(rawResponse?: boolean): Promise<T> {\n return withNileContext(\n this.#config,\n async () => {\n const res = await fetchMe(this.#config);\n\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n },\n 'getSelf'\n );\n }\n\n /**\n * Initiate an email verification flow.\n *\n * The current user is fetched and then `/auth/verify-email` is called.\n * In development or when `bypassEmail` is set, the user's\n * `emailVerified` field is updated instead of sending an email.\n * See `packages/server/src/api/routes/auth/verify-email.ts` for the\n * underlying request.\n *\n * @param [options] - Flags controlling bypass behaviour and callback URL.\n * @param [rawResponse] - When `true` return the raw {@link Response}.\n */\n async verifySelf<T = void>(): Promise<T>;\n async verifySelf(rawResponse: true): Promise<Response>;\n async verifySelf<T = Response | User>(\n options: {\n bypassEmail?: boolean;\n callbackUrl?: string;\n },\n rawResponse?: true\n ): Promise<T>;\n async verifySelf<T = void | Response>(\n options?: true | { bypassEmail?: boolean; callbackUrl?: string },\n rawResponse = false\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n const bypassEmail =\n typeof options === 'object' && options?.bypassEmail === true;\n const callbackUrl = fQUrl(\n defaultCallbackUrl().callbackUrl,\n typeof options === 'object' ? String(options.callbackUrl) : '/'\n );\n\n let res;\n\n try {\n const me = await this.getSelf();\n if (me instanceof Response) {\n return me as T;\n }\n res = await verifyEmailAddress(this.#config, me, String(callbackUrl));\n return res as T;\n } catch (e) {\n if (!bypassEmail) {\n let message = 'Unable to verify email.';\n if (e instanceof Error) {\n message = e.message;\n }\n this.#logger?.error(\n `${message} you can bypass this message by setting bypassEmail: true when calling 'verifySelf'`\n );\n res = new Response(message, { status: 400 });\n }\n }\n\n if (bypassEmail) {\n this.#logger?.info(\n 'bypassing email requirements for email verification'\n );\n res = this.updateSelf({ emailVerified: true }, rawResponse);\n }\n\n return res as T;\n });\n }\n}\n\n/**\n * Issue a POST to `/auth/verify-email` for the supplied user.\n *\n * @internal This helper is shared by {@link verifySelf}.\n * @param config - Active configuration.\n * @param user - The user to verify.\n * @param callback - Callback URL to include in the request body.\n */\nasync function verifyEmailAddress(\n config: Config,\n user: User,\n callback: string\n) {\n const { headers } = ctx.get();\n headers?.set('content-type', 'application/x-www-form-urlencoded');\n ctx.set({ headers });\n const { csrfToken } = await getCsrf<{ csrfToken: string }>(config);\n const defaults = defaultCallbackUrl();\n const callbackUrl = callback ?? String(defaults.callbackUrl);\n const res = await fetchVerifyEmail(\n config,\n 'POST',\n new URLSearchParams({\n csrfToken,\n email: user.email,\n callbackUrl,\n }).toString()\n );\n if (res.status > 299) {\n throw new Error(await res.text());\n }\n return res;\n}\n\n/**\n * Derive the `callbackUrl` from the `nile.callback-url` cookie if present.\n *\n * @param config - Configuration whose headers may contain the cookie.\n * @returns An object with the parsed `callbackUrl` or `null`.\n */\nexport function defaultCallbackUrl() {\n let cb = null;\n const { headers } = ctx.get();\n const fallbackCb = parseCallback(headers);\n if (fallbackCb) {\n const [, value] = fallbackCb.split('=');\n cb = decodeURIComponent(value);\n }\n return { callbackUrl: cb };\n}\n","import { fetchMe } from '../api/routes/me';\nimport {\n fetchTenant,\n fetchTenants,\n fetchTenantsByUser,\n} from '../api/routes/tenants';\nimport { fetchInvite } from '../api/routes/tenants/[tenantId]/invite';\nimport { fetchInvites } from '../api/routes/tenants/[tenantId]/invites';\nimport { fetchTenantUsers } from '../api/routes/tenants/[tenantId]/users';\nimport { fetchTenantUser } from '../api/routes/tenants/[tenantId]/users/[userId]';\nimport { ctx, withNileContext } from '../api/utils/request-context';\nimport { DefaultNileAuthRoutes } from '../api/utils/routes';\nimport { parseCallback } from '../auth';\nimport obtainCsrf from '../auth/obtainCsrf';\nimport { NileRequest } from '../types';\nimport { User } from '../users/types';\nimport { Config } from '../utils/Config';\nimport { fQUrl } from '../utils/qualifyDomain';\n\nimport { Invite, Tenant } from './types';\n\n/**\n * Convenience wrapper around the tenant endpoints. These methods call\n * the `fetch*` helpers in `packages/server/src/api/routes/tenants` which\n * in turn hit routes such as `/api/tenants` and `/api/tenants/{tenantId}`.\n * See those files for the Swagger definitions.\n */\n\ntype ReqContext = { userId?: string; tenantId?: string };\ntype JoinTenantRequest = string | ReqContext | { id: string };\n\nexport default class Tenants {\n #config: Config;\n constructor(config: Config) {\n this.#config = config;\n }\n\n create(name: string, rawResponse: true): Promise<Response>;\n create<T = Tenant | Response>(\n name: string,\n rawResponse?: boolean\n ): Promise<T>;\n create<T = Tenant | Response>(\n payload: {\n name: string;\n id?: string;\n },\n rawResponse?: boolean\n ): Promise<T>;\n /**\n * Create a new tenant using `POST /api/tenants`.\n * See `packages/server/src/api/routes/tenants/POST.ts` for the\n * `createTenant` operation definition.\n */\n async create<T = Tenant | Response | undefined>(\n req: { name: string; id?: string } | string,\n rawResponse?: boolean\n ): Promise<T | Response | undefined> {\n return withNileContext(this.#config, async () => {\n let res;\n if (typeof req === 'string') {\n res = await fetchTenants(\n this.#config,\n 'POST',\n JSON.stringify({ name: req })\n );\n } else if (typeof req === 'object' && ('name' in req || 'id' in req)) {\n res = await fetchTenants(this.#config, 'POST', JSON.stringify(req));\n }\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n });\n }\n\n /**\n * Delete a tenant using `DELETE /api/tenants/{tenantId}`.\n * The OpenAPI operation is defined in\n * `packages/server/src/api/routes/tenants/[tenantId]/DELETE.ts`.\n */\n delete<T = Response>(id?: string): Promise<T>;\n /**\n * Delete a tenant using `DELETE /api/tenants/{tenantId}`.\n * See `packages/server/src/api/routes/tenants/[tenantId]/DELETE.ts`.\n */\n delete<T = Response>(payload: { id: string }): Promise<T>;\n /**\n * Remove a tenant via `DELETE /api/tenants/{tenantId}`.\n *\n * @param req - The tenant to remove or context containing the id.\n */\n async delete<T = Response>(\n req: NileRequest<void> | { id?: string } | string | Tenant\n ): Promise<T | Response> {\n return withNileContext(this.#config, async () => {\n if (typeof req === 'string') {\n ctx.set({ tenantId: req });\n }\n if (typeof req === 'object' && 'id' in req) {\n ctx.set({ tenantId: req.id });\n }\n const res = await fetchTenant(this.#config, 'DELETE');\n return res;\n });\n }\n\n get<T = Tenant | Response>(): Promise<T>;\n get<T = Tenant | Response>(id: string, rawResponse?: boolean): Promise<T>;\n get(rawResponse: true): Promise<Response>;\n get<T = Tenant | Response>(\n payload: { id: string },\n rawResponse?: boolean\n ): Promise<T>;\n /**\n * Fetch details for a tenant using `GET /api/tenants/{tenantId}`.\n *\n * @param req - Tenant identifier or context.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n async get<T = Tenant | Response>(\n req: boolean | { id: string } | string | void,\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n if (typeof req === 'string') {\n ctx.set({ tenantId: req });\n } else if (typeof req === 'object' && 'id' in req) {\n ctx.set({ tenantId: req.id });\n }\n const res = await fetchTenant(this.#config, 'GET');\n if (rawResponse === true || req === true) {\n return res as T;\n }\n\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n });\n }\n\n async update(req: Partial<Tenant>, rawResponse: true): Promise<Response>;\n /**\n * Modify a tenant using `PUT /api/tenants/{tenantId}`.\n *\n * @param req - Tenant data to update. Can include an id.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n update<T = Tenant | Response | undefined>(\n req: Partial<Tenant>,\n rawResponse?: boolean\n ): Promise<T>;\n async update<T = Tenant | Response | undefined>(\n req: Partial<Tenant>,\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n let res;\n if (typeof req === 'object' && ('name' in req || 'id' in req)) {\n const { id, ...remaining } = req;\n if (id) {\n ctx.set({ tenantId: id });\n }\n res = await fetchTenant(this.#config, 'PUT', JSON.stringify(remaining));\n }\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n });\n }\n\n list<T = Tenant[] | Response>(): Promise<T>;\n list(rawResponse: true): Promise<Response>;\n /**\n * List tenants for the current user via `GET /api/tenants`.\n * See `packages/server/src/api/routes/tenants/GET.ts` for details.\n */\n async list<T = Tenant[] | Response>(\n req: boolean | NileRequest<void> | Headers\n ): Promise<T | Response | undefined> {\n return withNileContext(\n this.#config,\n async () => {\n const res = await fetchTenantsByUser(this.#config);\n if (req === true) {\n return res;\n }\n\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n },\n 'listTenants'\n );\n }\n /**\n * Leave the current tenant using `DELETE /api/tenants/{tenantId}/users/{userId}`.\n *\n * @param [req] - Optionally specify the tenant id to leave.\n */\n async leaveTenant<T = Response>(\n req?: string | { tenantId: string }\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n const me = await fetchMe(this.#config);\n try {\n const json = await me.json();\n if ('id' in json) {\n ctx.set({ userId: json.id });\n }\n } catch {\n // maybe there's already a context, let `fetchTenantUser` deal with it\n }\n if (typeof req === 'string') {\n ctx.set({ tenantId: req });\n } else {\n this.#handleContext(req);\n }\n return (await fetchTenantUser(this.#config, 'DELETE')) as T;\n });\n }\n\n addMember(req: JoinTenantRequest, rawResponse: true): Promise<Response>;\n /**\n * Add a user to a tenant via `PUT /api/tenants/{tenantId}/users/{userId}`.\n *\n * @param req - User and tenant identifiers or context.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n addMember<T = User | Response>(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<T>;\n async addMember<T = User | Response>(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n if (typeof req === 'string') {\n ctx.set({ userId: req });\n } else {\n this.#handleContext(req);\n }\n const res = await fetchTenantUser(this.#config, 'PUT');\n return responseHandler(res, rawResponse);\n });\n }\n\n /**\n * Remove a user from a tenant with `DELETE /api/tenants/{tenantId}/users/{userId}`.\n *\n * @param req - User and tenant identifiers or context.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n async removeMember(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<Response> {\n return withNileContext(this.#config, async () => {\n this.#handleContext(req);\n if (typeof req === 'string') {\n ctx.set({ userId: req });\n }\n const res = await fetchTenantUser(this.#config, 'DELETE');\n return responseHandler(res, rawResponse);\n });\n }\n /**\n * List users for a tenant via `GET /api/tenants/{tenantId}/users`.\n *\n * @param [req] - Tenant identifier or context.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n users<T = User[] | Response>(\n req?: boolean | { tenantId?: string },\n rawResponse?: boolean\n ): Promise<T>;\n users(req: true): Promise<Response>;\n async users<T>(\n req?: boolean | { tenantId?: string },\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(\n this.#config,\n async () => {\n this.#handleContext(req);\n const res = await fetchTenantUsers(this.#config, 'GET');\n return responseHandler(\n res,\n rawResponse || (typeof req === 'boolean' && req)\n ) as T;\n },\n 'users'\n );\n }\n\n /**\n * List invites for the current tenant via `GET /api/tenants/{tenantId}/invites`.\n */\n async invites<T = Invite[] | Response>(): Promise<T> {\n return withNileContext(\n this.#config,\n async () => {\n const res = await fetchInvites(this.#config);\n\n return responseHandler(res);\n },\n 'invites'\n );\n }\n\n /**\n * Send an invitation via `POST /api/tenants/{tenantId}/invite`.\n *\n * @param req - Email and optional callback/redirect URLs.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n async invite<T = Response | Invite>(\n req: string | { email: string; callbackUrl?: string; redirectUrl?: string },\n rawResponse?: boolean\n ): Promise<T>;\n async invite(\n req: string | { email: string; callbackUrl?: string; redirectUrl?: string },\n rawResponse: true\n ): Promise<Response>;\n async invite<T = Response | Invite>(\n req: string | { email: string; callbackUrl?: string; redirectUrl?: string },\n rawResponse?: boolean\n ): Promise<T> {\n // if we are going to call this, as *soon* as we do, we need to execute extensions\n return withNileContext(\n this.#config,\n async () => {\n // need to get rid of the headers every where in favor of the context\n const { csrfToken } = await obtainCsrf<{ csrfToken: string }>(\n this.#config\n );\n const defaults = defaultCallbackUrl(this.#config);\n let identifier: string = req as string;\n let callbackUrl: string = defaults.callbackUrl as string;\n let redirectUrl: string = defaults.redirectUrl as string;\n\n if (typeof req === 'object') {\n if ('email' in req) {\n identifier = req.email;\n }\n\n const { callbackUrl: cbUrl } = defaultCallbackUrl(this.#config);\n if ('callbackUrl' in req) {\n callbackUrl = fQUrl(cbUrl, req.callbackUrl ?? '/');\n }\n if ('redirectUrl' in req) {\n redirectUrl = fQUrl(cbUrl, req.redirectUrl ?? '/');\n }\n }\n\n const { headers } = ctx.get();\n headers?.set('Content-Type', 'application/x-www-form-urlencoded');\n ctx.set({ headers });\n const res = await fetchInvite(\n this.#config,\n 'POST',\n new URLSearchParams({\n identifier,\n csrfToken,\n callbackUrl,\n redirectUrl,\n }).toString()\n );\n return responseHandler(res, rawResponse);\n },\n 'invites'\n );\n }\n\n /**\n * Accept an invite using `PUT /api/tenants/{tenantId}/invite`.\n *\n * @param req - Identifier and token from the invite email.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n async acceptInvite<T = Response>(\n req?: { identifier: string; token: string; callbackUrl?: string },\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n if (!req) {\n throw new Error('The identifier and token are required.');\n }\n const { identifier, token } = req;\n const { callbackUrl: cbUrl } = defaultCallbackUrl(this.#config);\n const callbackUrl = fQUrl(cbUrl, req?.callbackUrl ?? '/');\n\n const res = await fetchInvite(\n this.#config,\n 'PUT',\n new URLSearchParams({\n identifier,\n token,\n callbackUrl,\n }).toString()\n );\n return responseHandler(res, rawResponse);\n });\n }\n\n /**\n * Delete a pending invite using `DELETE /api/tenants/{tenantId}/invite/{inviteId}`.\n *\n * @param req - Identifier of the invite to remove.\n */\n async deleteInvite<T = Response>(req: string | { id: string }): Promise<T> {\n return withNileContext(this.#config, async () => {\n let id = '';\n if (typeof req === 'object') {\n id = req.id;\n } else {\n id = req;\n }\n\n if (!id) {\n throw new Error('An invite id is required.');\n }\n\n const res = await fetchInvite(this.#config, 'DELETE', id);\n return responseHandler(res, true);\n });\n }\n\n #handleContext(req: JoinTenantRequest | boolean | undefined) {\n if (typeof req === 'object') {\n if ('tenantId' in req) {\n ctx.set({ tenantId: req.tenantId });\n }\n if ('userId' in req) {\n ctx.set({ userId: req.userId });\n }\n }\n }\n}\n\n/**\n * Handle the fetch response, optionally parsing JSON.\n *\n * @param res - Response from fetch.\n * @param [rawResponse] - When true, return the response untouched.\n */\nasync function responseHandler(res: Response, rawResponse?: boolean) {\n if (rawResponse) {\n return res;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n}\n\n/**\n * Parse the `nile.callback-url` cookie to determine a callback and redirect.\n *\n * @param config - Configuration whose headers may contain the cookie.\n * @returns Parsed callback and redirect URLs.\n */\nexport function defaultCallbackUrl(config: Config) {\n let cb = null;\n let redirect = null;\n const { headers, tenantId } = ctx.get();\n const fallbackCb = parseCallback(headers);\n if (fallbackCb) {\n const [, value] = fallbackCb.split('=');\n cb = decodeURIComponent(value);\n if (value) {\n redirect = `${new URL(cb).origin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.INVITE.replace('{tenantId}', String(tenantId))}`;\n }\n }\n return { callbackUrl: cb, redirectUrl: redirect };\n}\n","import { Server } from '../../../Server';\nimport {\n ContextReturn,\n CTXHandlerType,\n NileConfig,\n RouteReturn,\n} from '../../../types';\nimport { Config } from '../../../utils/Config';\nimport getter from '../GET';\nimport poster from '../POST';\nimport deleter from '../DELETE';\nimport puter from '../PUT';\n\nexport function handlersWithContext(config: Config): CTXHandlerType {\n const GET = getter(config.routes, config);\n const POST = poster(config.routes, config);\n const DELETE = deleter(config.routes, config);\n const PUT = puter(config.routes, config);\n\n return {\n GET: async <T = Response>(req: Request): Promise<ContextReturn<T>> => {\n const response = await GET(req);\n const updatedConfig = updateConfig(response, config);\n return { response: response as T, nile: new Server(updatedConfig) };\n },\n POST: async <T = Response>(req: Request): Promise<ContextReturn<T>> => {\n const response = await POST(req);\n const updatedConfig = updateConfig(response, config);\n return { response: response as T, nile: new Server(updatedConfig) };\n },\n DELETE: async <T = Response>(req: Request): Promise<ContextReturn<T>> => {\n const response = await DELETE(req);\n const updatedConfig = updateConfig(response, config);\n return { response: response as T, nile: new Server(updatedConfig) };\n },\n PUT: async <T = Response>(req: Request): Promise<ContextReturn<T>> => {\n const response = await PUT(req);\n const updatedConfig = updateConfig(response, config);\n return { response: response as T, nile: new Server(updatedConfig) };\n },\n };\n}\n\nexport function updateConfig(\n response: RouteReturn,\n config: Config\n): NileConfig {\n let origin = 'http://localhost:3000';\n let headers: Headers | null = null;\n\n if (response instanceof Response) {\n if (response?.status === 302) {\n const location = response.headers.get('location');\n if (location) {\n const urlLocation = new URL(location);\n origin = urlLocation.origin;\n }\n }\n\n const setCookies: string[] = [];\n\n // Headers are iterable\n if (response?.headers) {\n for (const [key, value] of response.headers) {\n if (key.toLowerCase() === 'set-cookie') {\n setCookies.push(value);\n }\n }\n }\n if (setCookies.length > 0) {\n const cookieHeader = setCookies\n .map((cookieStr) => cookieStr.split(';')[0])\n .join('; ');\n\n headers = new Headers({ cookie: cookieHeader });\n }\n }\n\n return {\n ...config,\n origin,\n headers: headers ?? undefined,\n useLastContext: true,\n };\n}\n","import pg, { Pool } from 'pg';\n\nimport {\n Context,\n Extension,\n ExtensionState,\n NileConfig,\n NileHandlers,\n PartialContext,\n} from './types';\nimport { Config, ConfigurablePaths } from './utils/Config';\nimport { watchHeaders, watchTenantId, watchUserId } from './utils/Event';\nimport DbManager from './db';\nimport Users from './users';\nimport Tenants from './tenants';\nimport Auth from './auth';\nimport { HEADER_ORIGIN, HEADER_SECURE_COOKIES } from './utils/constants';\nimport { handlersWithContext } from './api/handlers/withContext';\nimport { buildExtensionConfig } from './api/utils/extensions';\nimport {\n ctx,\n defaultContext,\n withNileContext,\n} from './api/utils/request-context';\nimport { getTenantId } from './utils/Config/envVars';\n\nexport class Server {\n users: Users;\n tenants: Tenants;\n auth: Auth;\n #config: Config;\n #handlers: NileHandlers;\n #manager: DbManager;\n\n constructor(config?: NileConfig) {\n this.#config = new Config({\n ...config,\n extensionCtx: buildExtensionConfig(this),\n });\n\n // watch first, they may mutate first\n // unsure if this is still useful, with `ctx` around\n watchTenantId((tenantId) => {\n if (tenantId !== this.#config.context.tenantId) {\n this.#config.context.tenantId = String(tenantId);\n this.#reset();\n }\n });\n\n watchUserId((userId) => {\n if (userId !== this.#config.context.userId) {\n this.#config.context.userId = String(userId);\n this.#reset();\n }\n });\n\n watchHeaders((headers) => {\n if (headers) {\n // internally we can call this for sign in, among other things. Be sure the next request still works.\n this.#config.context.headers = new Headers(headers);\n this.#reset();\n }\n });\n\n this.#handlers = {\n ...this.#config.handlers,\n withContext: handlersWithContext(this.#config),\n };\n\n this.#config.context.tenantId = getTenantId({ config: this.#config });\n\n this.#manager = new DbManager(this.#config);\n\n // headers first, so instantiation is right the first time\n this.#handleHeaders(config);\n\n this.users = new Users(this.#config);\n this.tenants = new Tenants(this.#config);\n this.auth = new Auth(this.#config);\n\n // for `onConfigure`, we run it, but after the full config is already made\n if (config?.extensions) {\n for (const create of config.extensions) {\n if (typeof create !== 'function') {\n continue;\n }\n const ext = create(this);\n // we can only run this after config has a value, so we must wait, but we can't.\n if (ext.onConfigure) {\n ext.onConfigure();\n }\n\n if (ext?.replace?.handlers) {\n this.#config\n .logger('[EXTENSION]')\n .debug(`${ext.id} replacing handlers`);\n // if you replace these handlers, you can't call the original ones, so we need to \"replace\" our headers within the request.\n this.#handlers = ext.replace.handlers({\n ...this.#config.handlers,\n withContext: handlersWithContext(this.#config),\n });\n }\n }\n }\n }\n\n /**\n * Query the database with the current context\n */\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n query: Pool['query'] = (queryStream: any, values?: any) => {\n this.#config.context = { ...this.getContext() };\n const pool = this.#manager.getConnection(this.#config);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return pool.query(queryStream as any, values);\n };\n\n /**\n * Return a db object that can be used to talk to the database\n * Does not have a context by default\n */\n get db(): pg.Pool & { clearConnections: () => void } {\n const pool = this.#manager.getConnection(this.#config, true);\n\n return Object.assign(pool, {\n clearConnections: () => {\n this.#manager.clear(this.#config);\n },\n });\n }\n\n get logger() {\n return this.#config.logger;\n }\n\n get extensions() {\n return {\n remove: async (id: string) => {\n if (!this.#config.extensions) return;\n\n const resolved = this.#config.extensions.map((ext) => ext(this));\n const index = resolved.findIndex((ext) => ext.id === id);\n if (index !== -1) {\n this.#config.extensions.splice(index, 1);\n }\n return resolved;\n },\n add: (extension: Extension) => {\n if (!this.#config.extensions) {\n this.#config.extensions = [];\n }\n this.#config.extensions.push(extension);\n },\n };\n }\n\n get handlers() {\n return this.#handlers;\n }\n\n get paths(): ConfigurablePaths {\n return this.#config.paths;\n }\n\n set paths(paths: ConfigurablePaths) {\n this.#config.paths = paths;\n }\n\n /**\n * Sets the context for a particular set of requests or db calls to be sure the context is fully managed for the entire lifecycle\n */\n async withContext(): Promise<this>;\n async withContext<T>(\n context: PartialContext,\n fn: AsyncCallback<this, T>\n ): Promise<T>;\n async withContext(context: PartialContext): Promise<this>;\n async withContext<T>(fn: AsyncCallback<this, T>): Promise<T>;\n async withContext<T>(\n contextOrFn?: PartialContext | AsyncCallback<this, T>,\n maybeFn?: AsyncCallback<this, T>\n ): Promise<T | this> {\n const isFn = typeof contextOrFn === 'function';\n\n const context = isFn ? {} : contextOrFn ?? {};\n const fn = isFn ? (contextOrFn as AsyncCallback<this, T>) : maybeFn;\n\n const preserve =\n 'useLastContext' in context ? context.useLastContext : true;\n\n let hydrated: Context | undefined;\n if (preserve) {\n hydrated = await this.#hydrateContextFromExtensions();\n const base = hydrated ?? this.#config.context;\n this.#config.context = { ...base, ...context };\n } else {\n this.#config.context = { ...defaultContext, ...context };\n }\n return withNileContext(this.#config, async () => {\n return fn ? fn(this) : this;\n });\n }\n\n /**\n * Creates a context without a user id and a tenant id, but keeps the headers around for auth at least.\n * This is useful for DDL/DML, since most extensions will set the context by default\n */\n async noContext(): Promise<this>;\n async noContext<T>(fn: (sdk: this) => Promise<T>): Promise<T>;\n async noContext<T>(fn?: (sdk: this) => Promise<T>): Promise<T | this> {\n this.#config.context.tenantId = undefined;\n this.#config.context.userId = undefined;\n\n return withNileContext(this.#config, async () => {\n // there are some cases where you need to \"override\" stuff, and the extension context\n // is going to keep adding it back. For instance, nextjs is always going to set a tenant_id from the cookie\n // we need to honor the incoming config over the extension, else you can never just \"call\" things.\n ctx.set({ userId: undefined, tenantId: undefined });\n\n if (fn) {\n return fn(this);\n }\n return this;\n });\n }\n /**\n *\n * @returns the last used (basically global) context object, useful for debugging or making your own context\n */\n getContext(): Context {\n return ctx.getLastUsed();\n }\n\n /**\n * Merge headers together\n * Saves them in a singleton for use in a request later. It's basically the \"default\" value\n * Internally, passed a NileConfig, externally, should be using Headers\n */\n\n #handleHeaders(\n config?: NileConfig | void | Headers | Record<string, string> | null\n ) {\n const updates: [string, string][] = [];\n let headers;\n this.#config.context.headers = new Headers();\n\n if (config instanceof Headers) {\n headers = config;\n } else if (config?.headers) {\n // handle a config object internally,\n headers = config?.headers;\n if (config && config.origin) {\n // DO SOMETHING TO SURFACE A WARNING?\n this.#config.context.headers.set(HEADER_ORIGIN, config.origin);\n }\n if (config && config.secureCookies != null) {\n this.#config.context.headers.set(\n HEADER_SECURE_COOKIES,\n String(config.secureCookies)\n );\n }\n }\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n updates.push([key.toLowerCase(), value]);\n });\n } else {\n for (const [key, value] of Object.entries(headers ?? {})) {\n updates.push([key.toLowerCase(), value]);\n }\n }\n\n const merged: Record<string, string> = {};\n\n // if we do have a cookie, grab anything useful before it is destroyed.\n // this.#config.tenantId = getTenantFromHttp(this.#headers, this.#config);\n\n this.#config.context.headers?.forEach((value, key) => {\n // It is expected that if the 'cookie' is missing when you set headers, it should be removed.\n if (key.toLowerCase() !== 'cookie') {\n merged[key.toLowerCase()] = value;\n }\n });\n\n for (const [key, value] of updates) {\n merged[key] = value;\n }\n\n for (const [key, value] of Object.entries(merged)) {\n this.#config.context.headers.set(key, value);\n }\n\n this.#config.logger('[handleHeaders]').debug(JSON.stringify(merged));\n }\n\n async #hydrateContextFromExtensions(): Promise<Context | undefined> {\n if (!this.#config.extensions || this.#config.extensions.length === 0) {\n return undefined;\n }\n\n let updated: Context | undefined;\n\n await ctx.run({}, async () => {\n await this.#config.extensionCtx?.runExtensions(\n ExtensionState.withContext,\n this.#config\n );\n updated = ctx.get();\n });\n\n if (!updated) {\n return undefined;\n }\n\n const hydrated: Context = {\n headers: new Headers(updated.headers),\n tenantId: updated.tenantId,\n userId: updated.userId,\n };\n\n this.#config.context.headers = new Headers(hydrated.headers);\n this.#config.context.tenantId = hydrated.tenantId;\n this.#config.context.userId = hydrated.userId;\n\n return hydrated;\n }\n\n /**\n * Allow some internal mutations to reset our config + headers\n */\n #reset = () => {\n this.#config.extensionCtx = buildExtensionConfig(this);\n this.users = new Users(this.#config);\n this.tenants = new Tenants(this.#config);\n this.auth = new Auth(this.#config);\n };\n}\n\nlet server: unknown;\nexport function create<T = Server>(config?: NileConfig): T {\n if (!server) {\n server = new Server(config) as T;\n }\n\n return server as T;\n}\ntype AsyncCallback<TInstance, TResult> = (sdk: TInstance) => Promise<TResult>;\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/users/types.ts","../src/utils/constants.ts","../src/api/utils/routes/index.ts","../src/utils/Logger.ts","../src/api/utils/extensions.ts","../src/api/utils/request-context.ts","../src/api/utils/request.ts","../src/api/utils/auth.ts","../src/api/routes/me/index.ts","../src/utils/fetch.ts","../src/api/routes/users/POST.ts","../src/api/routes/users/GET.ts","../src/api/routes/users/%5BuserId%5D/PUT.ts","../src/api/routes/users/index.ts","../src/api/routes/tenants/%5BtenantId%5D/users/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/users/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/index.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/PUT.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/index.ts","../src/api/routes/tenants/%5BtenantId%5D/invites/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/invites/index.ts","../src/api/routes/tenants/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/PUT.ts","../src/api/routes/tenants/POST.ts","../src/api/routes/tenants/index.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/routes/auth/verify-request.ts","../src/api/routes/auth/password-reset.ts","../src/api/routes/auth/verify-email.ts","../src/api/routes/auth/mfa.ts","../src/api/handlers/GET.ts","../src/api/routes/signup/POST.ts","../src/api/routes/signup/index.tsx","../src/api/handlers/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/PUT.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/index.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/%5BinviteId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/%5BinviteId%5D/index.ts","../src/api/handlers/DELETE.ts","../src/api/handlers/PUT.ts","../src/api/handlers/index.ts","../src/utils/Config/envVars.ts","../src/utils/Config/index.ts","../src/utils/Event/index.ts","../src/db/PoolProxy.ts","../src/db/NileInstance.ts","../src/db/DBManager.ts","../src/auth/index.ts","../src/auth/obtainCsrf.ts","../src/utils/qualifyDomain.ts","../src/users/index.ts","../src/tenants/index.ts","../src/api/handlers/withContext/index.ts","../src/Server.ts"],"names":["ExtensionState","route","warn","silly","request","create","key","ctx","GET","PUT","matches","POST","DELETE","pg","afterCreate","body","csrfToken","fQUrl","defaultCallbackUrl"],"mappings":"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","file":"index.mjs","sourcesContent":["import { PoolClient, PoolConfig } from 'pg';\n\nimport { Routes } from './api/types';\nimport { Server } from './Server';\nimport { LogReturn } from './utils/Logger';\n\nexport type Opts = {\n basePath?: string;\n fetch?: typeof fetch;\n};\n\nexport type Context = {\n headers: Headers;\n tenantId: string | undefined | null;\n userId: string | undefined | null;\n};\n\n// you can set headers to null, which will reset the them, keeping everything else\n// this is important for \"resetting\" after internal auth (like sign up user 1, then sign up user 2 and use that context for a while)\nexport type PartialContext = {\n headers?: null | Headers;\n tenantId?: string | undefined | null;\n userId?: string | undefined | null;\n useLastContext?: boolean;\n};\n\nexport type CTX = {\n run: <T>(ctx: Partial<Context>, fn: () => T) => T;\n get: () => Context;\n set: (partial: Partial<PartialContext>) => void;\n // mostly for convenience and testing.\n getLastUsed: () => Context;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\ntype Any = any;\nexport type ExtensionResult<TParams> = {\n id: string;\n withContext?: (ctx: CTX) => Promise<void>;\n // Called before request is handled\n onRequest?: (params: TParams, ctx: CTX) => void | Promise<void | RequestInit>;\n\n // Called after response is generated - probably a response\n onResponse?: (params: TParams, ctx: CTX) => void | Promise<void>;\n\n // called before requests to nile-auth, before onRequest\n // used for making sure the request is an actual `Request` object (or handles otherwise)\n onHandleRequest?: (params?: TParams) => RouteReturn | Promise<RouteReturn>;\n\n // allow runtime configurations by extensions\n onConfigure?: (params?: TParams) => void;\n\n // sets the context for the user id\n withUserId?: () => string;\n\n // sets the context for the tenant id\n withTenantId?: () => string;\n\n replace?: {\n handlers: (handlers: NileHandlers) => Any;\n };\n};\nexport type NileHandlers = RouteFunctions & {\n withContext: CTXHandlerType;\n};\n\nexport type Extension<TParams = Any> = (\n instance: Server\n) => ExtensionResult<TParams>;\nexport enum ExtensionState {\n onHandleRequest = 'onHandleRequest',\n onRequest = 'onRequest',\n onResponse = 'onResponse',\n withContext = 'withContext',\n withTenantId = 'withTenantId',\n withUserId = 'withUserId',\n}\nexport type NilePoolConfig = PoolConfig & { afterCreate?: AfterCreate };\nexport type LoggerType = {\n info: (args: unknown | unknown[]) => void;\n warn: (args: unknown | unknown[]) => void;\n error: (args: unknown | unknown[]) => void;\n debug: (args: unknown | unknown[]) => void;\n};\n\n/**\n * Configuration options used by the {@link Server} class.\n * Most values can be provided via environment variables if not set here.\n */\nexport type NileConfig = {\n /**\n * Unique ID of the database.\n * If omitted, the value is derived from `NILEDB_API_URL`.\n * Environment variable: `NILEDB_ID`.\n */\n databaseId?: string;\n\n /**\n * Database user used for authentication.\n * Environment variable: `NILEDB_USER`.\n */\n user?: string;\n\n /**\n * Password for the configured user.\n * Environment variable: `NILEDB_PASSWORD`.\n */\n password?: string;\n\n /**\n * Database name. Defaults to the name parsed from\n * `NILEDB_POSTGRES_URL` when not provided.\n * Environment variable: `NILEDB_NAME`.\n */\n databaseName?: string;\n\n /**\n * Tenant context used for scoping API and DB calls.\n * Environment variable: `NILEDB_TENANT`.\n */\n tenantId?: string | null | undefined;\n\n /**\n * Optional user identifier to apply when interacting with the database.\n * In most cases nile-auth injects the logged in user automatically so this\n * value rarely needs to be specified directly. It can be useful when\n * performing administrative actions on behalf of another user.\n */\n userId?: string | null | undefined;\n /** Enable verbose logging of SDK behaviour. */\n debug?: boolean;\n\n /**\n * Optional Postgres connection configuration.\n * Environment variables will be used for any values not set here.\n */\n db?: NilePoolConfig;\n\n /** Custom logger implementation. */\n logger?: LogReturn;\n\n /**\n * Base URL for nile-auth requests.\n * Environment variable: `NILEDB_API_URL`.\n */\n apiUrl?: string | undefined;\n\n /**\n * Override the client provided callback URL during authentication.\n * Environment variable: `NILEDB_CALLBACK_URL`.\n */\n callbackUrl?: string | undefined;\n\n /** Override default API routes. */\n routes?: Partial<Routes>;\n\n /** Prefix applied to all generated routes. */\n routePrefix?: string | undefined;\n\n /**\n * Force usage of secure cookies when communicating with nile-auth.\n * Defaults to `true` when `NODE_ENV` is `production`.\n * Environment variable: `NILEDB_SECURECOOKIES`.\n */\n secureCookies?: boolean;\n\n /**\n * Origin for requests made to nile-auth. This controls where users are\n * redirected after authentication. For single-page apps running on a\n * different port than the API, set this to the front-end origin\n * (e.g. `http://localhost:3001`). In a full-stack setup the value defaults\n * to the `host` header of the incoming request. When using secure cookies on\n * server-to-server calls, explicitly setting the origin ensures nile-auth\n * knows whether TLS is being used and which cookies to send.\n */\n origin?: null | undefined | string;\n\n /**\n * Additional headers sent with every API request.\n * Include a `cookie` header to forward session information.\n */\n headers?: null | Headers | Record<string, string>;\n /** Hooks executed before and after each request. */\n extensions?: Extension[];\n\n /**\n * Re-use the last set context\n */\n useLastContext?: boolean;\n};\n\nexport type NileDb = NilePoolConfig & { tenantId?: string };\n\nexport type AfterCreate = (\n conn: PoolClient,\n done: (err: null | Error, conn: PoolClient) => void\n) => void;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// taken from ts lib dom\ninterface NileBody<R, B> {\n readonly body: ReadableStream<Uint8Array> | null | B;\n readonly bodyUsed: boolean;\n arrayBuffer(): Promise<ArrayBuffer>;\n blob(): Promise<Blob>;\n formData(): Promise<FormData>;\n json(): Promise<R>;\n text(): Promise<string>;\n}\n\ninterface NResponse<T> extends NileBody<T, any> {\n readonly headers: Headers;\n readonly ok: boolean;\n readonly redirected: boolean;\n readonly status: number;\n readonly statusText: string;\n readonly type: ResponseType;\n readonly url: string;\n clone(): Response;\n}\n\ninterface NRequest<T> extends NileBody<any, T> {\n /** Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */\n readonly cache: RequestCache;\n /** Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. */\n readonly credentials: RequestCredentials;\n /** Returns the kind of resource requested by request, e.g., \"document\" or \"script\". */\n readonly destination: RequestDestination;\n /** Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the \"Host\" header. */\n readonly headers: Headers;\n /** Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] */\n readonly integrity: string;\n /** Returns a boolean indicating whether or not request can outlive the global in which it was created. */\n readonly keepalive: boolean;\n /** Returns request's HTTP method, which is \"GET\" by default. */\n readonly method: string;\n /** Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. */\n readonly mode: RequestMode;\n /** Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. */\n readonly redirect: RequestRedirect;\n /** Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and \"about:client\" when defaulting to the global's default. This is used during fetching to determine the value of the `Referer` header of the request being made. */\n readonly referrer: string;\n /** Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. */\n readonly referrerPolicy: ReferrerPolicy;\n /** Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. */\n readonly signal: AbortSignal;\n /** Returns the URL of request as a string. */\n readonly url: string;\n clone(): Request;\n}\n\nexport type NileRequest<T> = NRequest<T> | T;\n\nexport const APIErrorErrorCodeEnum = {\n InternalError: 'internal_error',\n BadRequest: 'bad_request',\n EntityNotFound: 'entity_not_found',\n DuplicateEntity: 'duplicate_entity',\n InvalidCredentials: 'invalid_credentials',\n UnknownOidcProvider: 'unknown_oidc_provider',\n ProviderAlreadyExists: 'provider_already_exists',\n ProviderConfigError: 'provider_config_error',\n ProviderMismatch: 'provider_mismatch',\n ProviderUpdateError: 'provider_update_error',\n SessionStateMissing: 'session_state_missing',\n SessionStateMismatch: 'session_state_mismatch',\n OidcCodeMissing: 'oidc_code_missing',\n} as const;\nexport type APIErrorErrorCodeEnum =\n (typeof APIErrorErrorCodeEnum)[keyof typeof APIErrorErrorCodeEnum];\n\nexport interface APIError {\n [key: string]: any | any;\n /**\n *\n * @type {string}\n * @memberof APIError\n */\n errorCode: APIErrorErrorCodeEnum;\n /**\n *\n * @type {string}\n * @memberof APIError\n */\n message: string;\n /**\n *\n * @type {number}\n * @memberof APIError\n */\n statusCode: number;\n}\n\nexport type NileResponse<T> = Promise<T | NResponse<T & APIError>>;\n\ntype ExtensionConfig = { disableExtensions: string[] };\ntype DefaultRouteReturn = Request | Response | ExtensionState;\nexport type RouteReturn<T = unknown> = void | T | Promise<void | T>;\n\nexport type RouteFunctions<T = DefaultRouteReturn> = {\n GET: (\n req: Request,\n config?: ExtensionConfig,\n ...args: unknown[]\n ) => RouteReturn<T>;\n POST: (\n req: Request,\n config?: ExtensionConfig,\n ...args: unknown[]\n ) => RouteReturn<T>;\n DELETE: (\n req: Request,\n config?: ExtensionConfig,\n ...args: unknown[]\n ) => RouteReturn<T>;\n PUT: (\n req: Request,\n config?: ExtensionConfig,\n ...args: unknown[]\n ) => RouteReturn<T>;\n};\n\nexport type ContextReturn<T = Response> = {\n response: T;\n nile: Server;\n};\n\nexport type CTXHandlerType = {\n GET: <T = Response>(req: Request) => Promise<ContextReturn<T>>;\n POST: <T = Response>(req: Request) => Promise<ContextReturn<T>>;\n DELETE: <T = Response>(req: Request) => Promise<ContextReturn<T>>;\n PUT: <T = Response>(req: Request) => Promise<ContextReturn<T>>;\n};\n","export interface CreateBasicUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: string;\n // create a tenant for the new user to an existing tenant\n newTenantName?: string;\n // add the new user to an existing tenant\n tenantId?: string;\n}\nexport interface CreateTenantUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: 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 email: string;\n name?: string | null;\n familyName?: string | null;\n givenName?: string | null;\n picture?: string | null;\n created: string;\n updated?: string;\n emailVerified?: string | null;\n multiFactor?: string | null;\n tenants: string[];\n}\n","// these two are a pass though\nexport const TENANT_COOKIE = 'nile.tenant-id';\nexport const USER_COOKIE = 'nile.user-id';\nexport const HEADER_ORIGIN = 'nile-origin';\n// this one is not\nexport const HEADER_SECURE_COOKIES = 'nile-secure-cookies';\n","import { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst NILEDB_API_URL = process.env.NILEDB_API_URL;\nexport const DEFAULT_PREFIX = '/api';\n\nexport enum DefaultNileAuthRoutes {\n SIGNUP = '/signup',\n TENANTS = '/tenants',\n TENANT = '/tenants/{tenantId}',\n USER_TENANTS = '/users/{userId}/tenants',\n TENANT_USER = '/tenants/{tenantId}/users/{userId}',\n TENANT_USERS = '/tenants/{tenantId}/users',\n USER = '/users/{userId}',\n USERS = '/users',\n ME = '/me',\n INVITES = '/tenants/{tenantId}/invites',\n INVITE = '/tenants/{tenantId}/invite',\n}\n\nexport enum NileAuthRoutes {\n CSRF = '/auth/csrf',\n PROVIDERS = '/auth/providers',\n SESSION = '/auth/session',\n SIGNIN = '/auth/signin',\n CALLBACK = '/auth/callback',\n SIGNOUT = '/auth/signout',\n PASSWORD_RESET = '/auth/reset-password',\n VERIFY_EMAIL = '/auth/verify-email',\n MULTI_FACTOR = '/auth/mfa',\n}\n\n// these map to the developer app\nexport const appRoutes = (prefix = DEFAULT_PREFIX): Routes => ({\n SIGNIN: `${prefix}${NileAuthRoutes.SIGNIN}`,\n PROVIDERS: `${prefix}${NileAuthRoutes.PROVIDERS}`,\n SESSION: `${prefix}${NileAuthRoutes.SESSION}`,\n CSRF: `${prefix}${NileAuthRoutes.CSRF}`,\n CALLBACK: `${prefix}${NileAuthRoutes.CALLBACK}`,\n SIGNOUT: `${prefix}${NileAuthRoutes.SIGNOUT}`,\n MULTI_FACTOR: `${prefix}${NileAuthRoutes.MULTI_FACTOR}`,\n ERROR: `${prefix}/auth/error`,\n VERIFY_REQUEST: `${prefix}/auth/verify-request`,\n VERIFY_EMAIL: `${prefix}${NileAuthRoutes.VERIFY_EMAIL}`,\n PASSWORD_RESET: `${prefix}${NileAuthRoutes.PASSWORD_RESET}`,\n ME: `${prefix}${DefaultNileAuthRoutes.ME}`,\n USERS: `${prefix}${DefaultNileAuthRoutes.USERS}`,\n USER_TENANTS: `${prefix}${DefaultNileAuthRoutes.USER_TENANTS}`,\n TENANTS: `${prefix}${DefaultNileAuthRoutes.TENANTS}`,\n TENANT: `${prefix}${DefaultNileAuthRoutes.TENANT}`,\n TENANT_USER: `${prefix}${DefaultNileAuthRoutes.TENANT_USER}`,\n TENANT_USERS: `${prefix}${DefaultNileAuthRoutes.TENANT_USERS}`,\n SIGNUP: `${prefix}${DefaultNileAuthRoutes.SIGNUP}`,\n INVITES: `${prefix}${DefaultNileAuthRoutes.INVITES}`,\n INVITE: `${prefix}${DefaultNileAuthRoutes.INVITE}`,\n LOG: `${prefix}/_log`,\n});\n\n// these map to nile-auth\nexport const apiRoutes = (apiUrl: string) => ({\n ME: makeRestUrl(apiUrl, '/me'),\n USERS: (qp: { tenantId?: null | string; newTenantName?: null | string }) =>\n makeRestUrl(apiUrl, '/users', qp),\n USER: (userId: string) => makeRestUrl(apiUrl, `/users/${userId}`),\n TENANTS: makeRestUrl(apiUrl, '/tenants'),\n TENANT: (tenantId: string) => makeRestUrl(apiUrl, `/tenants/${tenantId}`),\n SIGNUP: makeRestUrl(apiUrl, '/signup'),\n TENANT_USERS: (tenantId: string) =>\n makeRestUrl(apiUrl, `/tenants/${tenantId}/users`),\n INVITES: (tenantId: string) =>\n makeRestUrl(apiUrl, `/tenants/${tenantId}/invites`),\n INVITE: (tenantId: string) =>\n makeRestUrl(apiUrl, `/tenants/${tenantId}/invite`),\n TENANT_USER: (tenantId: string, userId: string) =>\n makeRestUrl(apiUrl, `/tenants/${tenantId}/users/${userId}`),\n USER_TENANTS: (userId: string) =>\n makeRestUrl(apiUrl, `/users/${userId}/tenants`),\n});\ntype ApiRouteKeys = keyof typeof apiRoutes;\nexport type ApiRoutePaths = (typeof apiRoutes)[ApiRouteKeys];\n\n// these map to nile-auth\nexport const proxyRoutes = (config: string) => ({\n SIGNIN: makeRestUrl(config, NileAuthRoutes.SIGNIN),\n PROVIDERS: makeRestUrl(config, NileAuthRoutes.PROVIDERS),\n SESSION: makeRestUrl(config, NileAuthRoutes.SESSION),\n CSRF: makeRestUrl(config, NileAuthRoutes.CSRF),\n CALLBACK: makeRestUrl(config, NileAuthRoutes.CALLBACK),\n SIGNOUT: makeRestUrl(config, NileAuthRoutes.SIGNOUT),\n ERROR: makeRestUrl(config, '/auth/error'),\n VERIFY_REQUEST: makeRestUrl(config, '/auth/verify-request'),\n PASSWORD_RESET: makeRestUrl(config, NileAuthRoutes.PASSWORD_RESET),\n VERIFY_EMAIL: makeRestUrl(config, NileAuthRoutes.VERIFY_EMAIL),\n MULTI_FACTOR: makeRestUrl(config, NileAuthRoutes.MULTI_FACTOR),\n});\ntype ProxyKeys = keyof typeof proxyRoutes;\nexport type ProxyPaths = (typeof proxyRoutes)[ProxyKeys];\n\nfunction filterNullUndefined(\n obj?: Record<string, string | null>\n): { [k: string]: string | null } | undefined {\n if (!obj) {\n return undefined;\n }\n return Object.fromEntries(\n Object.entries(obj).filter(\n ([, value]) => value !== null && value !== undefined\n )\n );\n}\n\nexport function makeRestUrl(\n apiUrl: string,\n path: string,\n qp?: Record<string, string | null>\n) {\n const url = apiUrl || 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(\n filterNullUndefined(qp) as Record<string, string>\n );\n const strParams = params.toString();\n return `${[url, path.substring(1, path.length)].join('/')}${\n strParams ? `?${strParams}` : ''\n }`;\n}\n\nexport function urlMatches(requestUrl: string, route: string) {\n const url = new URL(requestUrl);\n return url.pathname.startsWith(route);\n}\nexport function prefixAppRoute(config: Config) {\n return `${config.serverOrigin}${config.routePrefix}`;\n}\n\nexport function 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","/* eslint-disable no-console */\nimport { Routes } from '../api/types';\nimport { urlMatches } from '../api/utils/routes';\nimport { NileConfig } from '../types';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[38;2;255;255;0m';\nconst purple = '\\x1b[38;2;200;160;255m';\nconst orange = '\\x1b[38;2;255;165;0m';\nconst reset = '\\x1b[0m';\n\nconst baseLogger = (config: void | NileConfig, ...params: unknown[]) => ({\n silly(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug && process.env.LOG_LEVEL === 'silly') {\n console.log(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n info(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.info(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n debug(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.log(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n warn(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.warn(\n `${orange}[niledb]${reset}${yellow}[WARN]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? JSON.stringify(meta) : ''\n );\n }\n },\n error(message: string | unknown, meta?: Record<string, unknown>) {\n console.error(\n `${orange}[niledb]${reset}${red}[ERROR]${reset}${params.join(\n ''\n )}${red} ${message}`,\n meta ? meta : '',\n `${reset}`\n );\n },\n});\n\nexport type LogFunction = (\n message: string | unknown,\n meta?: Record<string, unknown>\n) => void;\n\nexport type Loggable = {\n info: LogFunction;\n debug: LogFunction;\n warn: LogFunction;\n error: LogFunction;\n silly: LogFunction;\n};\nexport type LogReturn = (prefixes?: string | string[]) => Loggable;\n\nexport default function Logger(config?: NileConfig): LogReturn {\n return (prefixes) => {\n const { info, debug, warn, error, silly } =\n config && typeof config?.logger === 'function'\n ? config.logger(prefixes)\n : baseLogger(config, prefixes);\n\n return {\n info,\n debug,\n warn,\n error,\n silly,\n };\n };\n}\n\nexport function matchesLog(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.LOG);\n}\n","import { ExtensionState } from '../../types';\nimport { Server } from '../../Server';\nimport { Config, ExtensionCtx, ExtensionReturns } from '../../utils/Config';\nimport { TENANT_COOKIE } from '../../utils/constants';\n\nimport { ctx } from './request-context';\n\nexport function getRequestConfig(params: unknown[]): Record<string, string> {\n if (typeof params[1] === 'object') {\n return params[1] as Record<string, string>;\n }\n return {};\n}\n\n// onHandleRequest -> onRequest -> onResponse\nexport function bindRunExtensions(instance: Server) {\n return async function runExtensions<T = ExtensionReturns>(\n toRun: ExtensionState,\n config: Config,\n params?: unknown | unknown[],\n _init?: RequestInit & { request: Request }\n ): Promise<T> {\n const { debug } = config.logger('[EXTENSIONS]');\n const extensionConfig = getRequestConfig(\n Array.isArray(params) ? params : [null, params]\n );\n\n if (config.extensions) {\n for (const create of config.extensions) {\n if (typeof create !== 'function') {\n continue;\n }\n const ext = create(instance);\n\n if (extensionConfig.disableExtensions?.includes(ext.id)) {\n continue;\n }\n\n if (ext.withTenantId && toRun === ExtensionState.withTenantId) {\n ctx.set({\n tenantId: await ext.withTenantId(),\n });\n }\n\n if (ext.withUserId && toRun === ExtensionState.withUserId) {\n ctx.set({ userId: await ext.withUserId() });\n }\n\n if (ext.withContext && toRun === ExtensionState.withContext) {\n await ext.withContext(ctx);\n }\n\n if (ext.onHandleRequest && toRun === ExtensionState.onHandleRequest) {\n const result = await ext.onHandleRequest(\n Array.isArray(params) ? params : [params]\n );\n debug(`${ext.id ?? create.name} ran onHandleRequest`);\n if (result != null) {\n return result as T;\n }\n }\n\n const [param] = Array.isArray(params) ? params : [params];\n\n // need to know when to call these, they are all just blindly called all the time.\n\n if (ext.onRequest && toRun === ExtensionState.onRequest) {\n // in the case where we have an existing server with headers (when handlersWithContext is used)\n // we need to merge previous headers with incoming headers, preferring the server headers in the case of a context.\n const { ...previousContext } = ctx.get();\n\n if (!_init) {\n // this isn't strictly possible, since it was called from the sdk.\n // the divergence between `onRequest` and `onHandleRequest` causes this\n continue;\n }\n\n const previousHeaders = new Headers(previousContext.headers);\n try {\n await ext.onRequest(_init.request, ctx);\n } catch {\n // noop\n }\n const updatedContext = ctx.get();\n if (updatedContext?.headers) {\n const cookie = updatedContext.headers.get('cookie');\n if (cookie && param.headers) {\n const updatedCookies = mergeCookies(\n previousHeaders?.get('cookie'),\n updatedContext.headers.get('cookie')\n );\n param.headers.set('cookie', updatedCookies);\n }\n\n if (updatedContext.tenantId && param.headers) {\n param.headers.set(\n TENANT_COOKIE,\n String(updatedContext.headers.get(TENANT_COOKIE))\n );\n }\n\n ctx.set({ headers: param.headers });\n }\n debug(`${ext.id ?? create.name} ran onRequest`);\n }\n\n if (ext.onResponse && toRun === ExtensionState.onResponse) {\n const result = await ext.onResponse(param, ctx);\n\n debug(`${ext.id ?? create.name} ran onResponse`);\n if (result != null) {\n return result as T;\n }\n }\n }\n }\n return undefined as T;\n };\n}\n\nexport function buildExtensionConfig(instance: Server): ExtensionCtx {\n return {\n runExtensions: bindRunExtensions(instance),\n };\n}\nfunction mergeCookies(...cookieStrings: (string | null | undefined)[]) {\n const cookieMap = new Map<string, string>();\n for (const str of cookieStrings) {\n if (!str) continue;\n for (const part of str.split(';')) {\n const [key, value] = part.split('=').map((s) => s.trim());\n if (key && value) cookieMap.set(key, value);\n }\n }\n return [...cookieMap.entries()].map(([k, v]) => `${k}=${v}`).join('; ');\n}\n\n//just makes typing faster\ntype ExtensionRunOptions = {\n skipWithContext?: boolean;\n};\n\nexport async function runExtensionContext(\n config: Config,\n options?: ExtensionRunOptions\n) {\n if (!options?.skipWithContext) {\n await config?.extensionCtx?.runExtensions(\n ExtensionState.withContext,\n config\n );\n }\n\n await config?.extensionCtx?.runExtensions(\n ExtensionState.withTenantId,\n config\n );\n await config?.extensionCtx?.runExtensions(ExtensionState.withUserId, config);\n}\n","import { AsyncLocalStorage } from 'async_hooks';\n\nimport { Config } from '@niledatabase/server/utils/Config';\n\nimport Logger from '../../utils/Logger';\nimport { CTX, Context, ExtensionState } from '../../types';\n\nimport { runExtensionContext } from './extensions';\n\nconst { warn, silly } = Logger({ debug: true })('[REQUEST CONTEXT]');\nconst storage = new AsyncLocalStorage<Context>();\n\nexport const defaultContext: Context = {\n headers: new Headers(),\n tenantId: undefined,\n userId: undefined,\n};\n\nlet lastUsedContext: Context = defaultContext;\n\nexport const ctx: CTX = {\n run(ctx, fn) {\n const merged: Context = {\n ...defaultContext,\n ...ctx,\n headers:\n ctx.headers instanceof Headers ? ctx.headers : new Headers(ctx.headers),\n };\n lastUsedContext = merged;\n return storage.run(merged, fn);\n },\n\n get: () => {\n const ctx = storage.getStore();\n if (!ctx) {\n return { ...defaultContext }; // return a throwaway object\n }\n silly(`[GET] ${serializeContext(ctx)}`);\n return ctx;\n },\n\n /**\n * This is a mirror of Server.getContext, but only for requests. We keep only the request\n * information around, everything else is :above_my_pay_grade:\n * @param partial A partial context to override\n */\n set: (partial) => {\n const store = storage.getStore();\n if (!store) {\n // ⚠️ There's no active context to mutate. You MUST be inside a .run()\n warn('ctx.set() called outside of ctx.run(). This will not persist.');\n return;\n }\n\n // setting headers blows everything away. Surgically updating does not\n if (partial.headers === null) {\n store.headers = new Headers();\n } else if (partial.headers && store.headers instanceof Headers) {\n for (const [key, value] of new Headers(partial.headers).entries()) {\n if (key.toLowerCase() === 'cookie') {\n const existingCookies = parseCookieHeader(\n store.headers.get('cookie') || ''\n );\n const newCookies = parseCookieHeader(value);\n const mergedCookies = { ...existingCookies, ...newCookies };\n store.headers.set('cookie', serializeCookies(mergedCookies));\n } else {\n store.headers.set(key, value);\n }\n }\n }\n\n if ('tenantId' in partial) store.tenantId = partial.tenantId;\n if ('userId' in partial) store.userId = partial.userId;\n\n silly(`[SET] ${serializeContext(store)}`);\n lastUsedContext = { ...store };\n },\n // for convenience only\n getLastUsed: () => lastUsedContext,\n};\n\nexport async function withNileContext<T>(\n config: Config,\n fn: () => Promise<T>,\n name = 'unknown'\n): Promise<T> {\n const initialContext = config.context;\n const existing = ctx.get();\n const { overrides: extensionOverrides, ran: extensionRan } =\n await resolveExtensionOverrides(config, existing);\n\n let mergedHeaders = new Headers(existing.headers);\n let tenantId = existing.tenantId;\n let userId = existing.userId;\n\n if (initialContext instanceof Request) {\n initialContext.headers.forEach((value, key) => {\n mergedHeaders.set(key, value);\n });\n } else {\n if (initialContext.headers === null) {\n mergedHeaders = new Headers();\n } else if (initialContext.headers) {\n const incoming =\n initialContext.headers instanceof Headers\n ? initialContext.headers\n : new Headers(initialContext.headers as HeadersInit);\n incoming.forEach((value, key) => {\n mergedHeaders.set(key, value);\n });\n }\n\n if ('tenantId' in initialContext) {\n tenantId = initialContext.tenantId;\n }\n if ('userId' in initialContext) {\n userId = initialContext.userId;\n }\n }\n\n if (extensionOverrides?.headers) {\n for (const key of extensionOverrides.headers.removed) {\n mergedHeaders.delete(key);\n }\n for (const [key, value] of extensionOverrides.headers.set) {\n mergedHeaders.set(key, value);\n }\n }\n\n if (extensionOverrides?.tenantId) {\n tenantId = extensionOverrides.tenantId.value;\n }\n\n if (extensionOverrides?.userId) {\n userId = extensionOverrides.userId.value;\n }\n\n const context = {\n headers: mergedHeaders,\n tenantId,\n userId,\n };\n\n silly(`${name} [INITIAL] ${serializeContext(context)}`);\n return ctx.run(context, async () => {\n await runExtensionContext(config, { skipWithContext: extensionRan });\n return fn();\n });\n}\n\nfunction serializeContext(context: Context): string {\n const headers: Record<string, string> = {};\n const rawHeaders = new Headers(context.headers);\n rawHeaders.forEach((value, key) => {\n headers[key] = value;\n });\n\n return JSON.stringify({\n headers,\n tenantId: context.tenantId,\n userId: context.userId,\n });\n}\n\nfunction parseCookieHeader(header: string): Record<string, string> {\n return header\n .split(';')\n .map((c) => c.trim())\n .filter(Boolean)\n .reduce((acc, curr) => {\n const [key, ...val] = curr.split('=');\n if (key) acc[key] = val.join('=');\n return acc;\n }, {} as Record<string, string>);\n}\n\nfunction serializeCookies(cookies: Record<string, string>): string {\n return Object.entries(cookies)\n .map(([k, v]) => `${k}=${v}`)\n .join('; ');\n}\n\ntype HeaderDiff = {\n set: Array<[string, string]>;\n removed: string[];\n};\n\ntype ExtensionOverrides = {\n headers?: HeaderDiff;\n tenantId?: { value: Context['tenantId'] };\n userId?: { value: Context['userId'] };\n};\n\nasync function resolveExtensionOverrides(\n config: Config,\n existing: Context\n): Promise<{ overrides?: ExtensionOverrides; ran: boolean }> {\n if (!config.extensions?.length || !config.extensionCtx) {\n return { ran: false };\n }\n\n let updated: Context | undefined;\n await ctx.run(\n {\n headers: new Headers(existing.headers),\n tenantId: existing.tenantId,\n userId: existing.userId,\n },\n async () => {\n await config.extensionCtx?.runExtensions(\n ExtensionState.withContext,\n config\n );\n updated = ctx.get();\n }\n );\n\n if (!updated) {\n return { ran: true };\n }\n\n const diff = diffContext(existing, updated);\n return { overrides: diff, ran: true };\n}\n\nfunction diffContext(\n before: Context,\n after: Context\n): ExtensionOverrides | undefined {\n const headers = diffHeaders(before.headers, after.headers);\n const tenantChanged = before.tenantId !== after.tenantId;\n const userChanged = before.userId !== after.userId;\n\n if (!headers && !tenantChanged && !userChanged) {\n return undefined;\n }\n\n const overrides: ExtensionOverrides = {};\n if (headers) {\n overrides.headers = headers;\n }\n if (tenantChanged) {\n overrides.tenantId = { value: after.tenantId };\n }\n if (userChanged) {\n overrides.userId = { value: after.userId };\n }\n return overrides;\n}\n\nfunction diffHeaders(before: Headers, after: Headers): HeaderDiff | undefined {\n const beforeMap = headersToMap(before);\n const afterMap = headersToMap(after);\n const set: Array<[string, string]> = [];\n const removed: string[] = [];\n\n for (const [key, value] of afterMap.entries()) {\n if (beforeMap.get(key) !== value) {\n set.push([key, value]);\n }\n }\n\n for (const key of beforeMap.keys()) {\n if (!afterMap.has(key)) {\n removed.push(key);\n }\n }\n\n if (set.length === 0 && removed.length === 0) {\n return undefined;\n }\n\n return { set, removed };\n}\n\nfunction headersToMap(headers: Headers): Map<string, string> {\n const map = new Map<string, string>();\n headers.forEach((value, key) => {\n map.set(key.toLowerCase(), value);\n });\n return map;\n}\n","import { ExtensionState } from '../../types';\nimport {\n HEADER_ORIGIN,\n HEADER_SECURE_COOKIES,\n TENANT_COOKIE,\n} from '../../utils/constants';\nimport { Config } from '../../utils/Config';\n\nimport { DEFAULT_PREFIX } from './routes';\nimport { ctx } from './request-context';\n\nexport default async function request(\n url: string,\n _init: RequestInit & { request: Request },\n config: Config\n) {\n const { debug, info, error } = config.logger('[REQUEST]');\n const { request, ...init } = _init;\n const requestUrl = new URL(request.url);\n const updatedHeaders = new Headers({});\n if (request.headers.get('cookie')) {\n updatedHeaders.set('cookie', String(request.headers.get('cookie')));\n }\n if (request.headers.get(TENANT_COOKIE)) {\n updatedHeaders.set(\n TENANT_COOKIE,\n String(request.headers.get(TENANT_COOKIE))\n );\n }\n // sets secure cookies for production\n if (config.secureCookies != null) {\n updatedHeaders.set(HEADER_SECURE_COOKIES, String(config.secureCookies));\n } else {\n updatedHeaders.set(\n HEADER_SECURE_COOKIES,\n process.env.NODE_ENV === 'production' ? 'true' : 'false'\n );\n }\n\n updatedHeaders.set('host', requestUrl.host);\n\n if (config.callbackUrl) {\n const cbUrl = new URL(config.callbackUrl);\n debug(`Obtained origin from config.callbackUrl ${config.callbackUrl}`);\n updatedHeaders.set(HEADER_ORIGIN, cbUrl.origin);\n // this origin may be overridden, but when SDK requests are made, we want to ignore it\n } else if (config.origin) {\n debug(`Obtained origin from config.origin ${config.origin}`);\n updatedHeaders.set(HEADER_ORIGIN, config.origin);\n } else {\n const passedOrigin = request.headers.get(HEADER_ORIGIN);\n if (passedOrigin) {\n updatedHeaders.set(HEADER_ORIGIN, passedOrigin);\n } else {\n // REST requests won't have a context\n const { headers } = ctx.get();\n const host = headers.get('host');\n if (host) {\n const serverSideOrigin = `${getProtocolFromHeaders(headers)}://${host}`;\n updatedHeaders.set(HEADER_ORIGIN, serverSideOrigin);\n\n debug(`Obtained origin from server side headers ${serverSideOrigin}`);\n } else {\n const reqOrigin =\n config.routePrefix !== DEFAULT_PREFIX\n ? `${requestUrl.origin}${config.routePrefix}`\n : requestUrl.origin;\n\n updatedHeaders.set(HEADER_ORIGIN, reqOrigin);\n debug(`Obtained origin from request ${reqOrigin}`);\n }\n }\n }\n const params = { ...init };\n\n if (\n params.method?.toLowerCase() === 'post' ||\n params.method?.toLowerCase() === 'put'\n ) {\n try {\n updatedHeaders.set('content-type', 'application/json');\n\n const bodyStream = _init.body ?? _init.request?.body ?? request.body;\n\n const bodyText = await new Response(bodyStream).text();\n\n // try to parse JSON, fallback to text if not\n try {\n params.body = JSON.stringify(JSON.parse(bodyText));\n } catch {\n updatedHeaders.set('content-type', 'application/x-www-form-urlencoded');\n params.body = bodyText;\n }\n } catch (e) {\n error('Failed to parse request body');\n }\n }\n params.headers = updatedHeaders;\n const fullUrl = `${url}${requestUrl.search}`;\n\n if (config.debug) {\n // something going on with `fetch` in nextjs, possibly other places\n // hot-reloading does not always give back `set-cookie` from fetchCSRF\n // cURL seems to always do it (and in a real app, you don't have hot reloading),\n // so add a cache bypass to stop the annoying failure reloads that actually work\n params.headers.set('request-id', crypto.randomUUID());\n params.cache = 'no-store';\n }\n\n await config.extensionCtx?.runExtensions(\n ExtensionState.onRequest,\n config,\n params,\n _init\n );\n try {\n const res: Response | void = await fetch(fullUrl, {\n ...params,\n }).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'}] ${fullUrl}`, {\n status: res?.status,\n statusText: res?.statusText,\n text: await loggingRes?.text(),\n });\n const updatedRes =\n await config.extensionCtx?.runExtensions<Response | void>(\n ExtensionState.onResponse,\n config,\n { ...params, response: res }\n );\n\n if (updatedRes) {\n return updatedRes;\n }\n return res;\n } catch (e) {\n if (e instanceof Error) {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n }\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n }\n}\n\nfunction getProtocolFromHeaders(\n headers: Headers | Record<string, string>\n): string {\n const get = (key: string) =>\n headers instanceof Headers ? headers.get(key) : headers[key.toLowerCase()];\n\n // Check x-forwarded-proto\n const xfp = get('x-forwarded-proto');\n if (xfp) return xfp.toLowerCase();\n\n // Check Forwarded header\n const forwarded = get('forwarded');\n if (forwarded) {\n const match = forwarded.match(/proto=(https?)/i);\n if (match) return match[1].toLowerCase();\n }\n\n // Check referer or origin\n const ref = get('referer') || get('origin');\n if (ref && ref.startsWith('https')) return 'https';\n\n return 'http'; // fallback\n}\n","import { Config } from '../../utils/Config';\n\nimport request from './request';\n\nexport type ProviderName =\n | 'discord'\n | 'github'\n | 'google'\n | 'hubspot'\n | 'linkedin'\n | 'slack'\n | 'twitter'\n | 'email' // magic link\n | 'credentials' // email + password\n | 'azure';\n\nexport type Providers = {\n [providerName in ProviderName]: Provider;\n};\nexport type Provider = {\n id: string;\n name: string;\n type: string;\n signinUrl: string;\n callbackUrl: string;\n};\n\nexport type JWT = {\n email: string;\n sub: string;\n id: string;\n iat: number;\n exp: number;\n jti: string;\n};\n\nexport type ActiveSession = {\n id: string;\n email: string;\n expires: string;\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<null | undefined | ActiveSession> {\n const { info, error } = config.logger('[nileauth]');\n info('checking auth');\n\n const sessionUrl = `${config.apiUrl}/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 const cloned = res.clone();\n try {\n const session = await new Response(res.body).json();\n if (Object.keys(session).length === 0) {\n info('no session found');\n return undefined;\n }\n info('session active');\n return session;\n } catch {\n error(cloned.text());\n return undefined;\n }\n}\n","import { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport {\n urlMatches,\n apiRoutes,\n DefaultNileAuthRoutes,\n} from '../../utils/routes';\nimport auth from '../../utils/auth';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'ME';\n\nexport default async function route(request: Request, config: Config) {\n const url = apiRoutes(config.apiUrl)[key];\n\n if (request.method === 'GET') {\n return await GET(url, { request }, config);\n }\n if (request.method === 'PUT') {\n return await PUT(url, { request }, config);\n }\n if (request.method === 'DELETE') {\n const session = await auth(request, config);\n if (!session) {\n return new Response(null, { status: 401 });\n }\n return await DELETE(url, { request }, config);\n }\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\nexport async function fetchMe(\n config: Config,\n method?: 'DELETE' | 'PUT',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.ME}`;\n const { headers } = ctx.get();\n const init: RequestInit = {\n headers,\n method: method ?? 'GET',\n };\n if (method === 'PUT') {\n init.body = body;\n }\n\n const req = new Request(clientUrl, init);\n if (method === 'DELETE') {\n return (await config.handlers.DELETE(req)) as Response;\n }\n if (method === 'PUT') {\n return (await config.handlers.PUT(req)) as Response;\n }\n return (await config.handlers.GET(req)) as Response;\n}\n\n/**\n * @swagger\n * /api/me:\n * delete:\n * tags:\n * - users\n * summary: soft deletes a user\n * description: marks the current user for deletion. Can only be done by the current user for the current user\n * operationId: removeSelf\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: success if the user was deleted\n * content: {}\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function DELETE(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n init.method = 'DELETE';\n\n return await request(url, init, config);\n}\n/**\n * @swagger\n * /api/me:\n * put:\n * tags:\n * - users\n * summary: updates the current user\n * description: changes the data for the current user\n * operationId: updateSelf\n * responses:\n * \"200\":\n * description: success if the user was deleted\n * content: {}\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n init.method = 'PUT';\n\n return await request(url, init, config);\n}\n\n/**\n * @swagger\n * /api/me:\n * get:\n * tags:\n * - users\n * summary: Identify the principal\n * description: Returns information about the principal associated with the session\n * provided\n * operationId: getSelf\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","import { PartialContext } from '../types';\n\nimport { TENANT_COOKIE, USER_COOKIE } from './constants';\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, context?: PartialContext) {\n const cookieTenant = getTokenFromCookie(headers, TENANT_COOKIE);\n\n return cookieTenant ? cookieTenant : context?.tenantId;\n}\n\n// do we do this any more?\nexport function getUserFromHttp(headers: Headers, context?: PartialContext) {\n const userHeader = headers?.get(USER_COOKIE);\n return userHeader ? userHeader : context?.userId;\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\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 newTenantName = yurl.searchParams.get('newTenantName');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n const url = apiRoutes(config.apiUrl).USERS({\n tenantId: tenant,\n newTenantName,\n });\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';\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 `nile.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 =\n tenantId ?? getTenantFromHttp(init.request.headers, config.context);\n\n if (!tenant) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n init.method = 'GET'; // for testing\n const url = apiRoutes(config.apiUrl).TENANT_USERS(tenant);\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport fetch from '../../../utils/request';\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 init: RequestInit & { request: Request }\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.apiUrl).USER(userId);\n\n return await fetch(url, init, config);\n}\n","import { Routes } from '../../types';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n prefixAppRoute,\n urlMatches,\n} from '../../utils/routes';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\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 } = config.logger(`[ROUTES][${key}]`);\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, { 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\nexport async function fetchUser(config: Config, method: 'PUT') {\n let clientUrl = `${prefixAppRoute(config)}${DefaultNileAuthRoutes.USERS}`;\n const { userId, headers } = ctx.get();\n\n if (method === 'PUT')\n if (!userId) {\n throw new Error(\n 'Unable to update user, the userId context is missing. Call nile.setContext({ userId }), set nile.userId = \"userId\", or add it to the function call'\n );\n } else {\n clientUrl = `${prefixAppRoute(\n config\n )}${DefaultNileAuthRoutes.USER.replace('{userId}', userId)}`;\n }\n if (!isUUID(userId)) {\n config\n .logger('[fetchUser]')\n .warn(\n 'nile.userId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n\n const init: RequestInit = {\n method,\n headers,\n };\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[method](req)) as Response;\n}\n","import { apiRoutes } from '../../../../utils/routes';\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.apiUrl).TENANT_USERS(tenantId)}`;\n return await request(url, init, config);\n}\n","import auth from '../../../../utils/auth';\nimport fetch from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes';\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 init: RequestInit & { request: Request }\n) {\n const session = await auth(init.request, config);\n\n if (!session) {\n return new Response(null, { status: 401 });\n }\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n init.body = JSON.stringify({ email: session.email });\n init.method = 'POST';\n const url = apiRoutes(config.apiUrl).TENANT_USERS(tenantId);\n\n return await fetch(url, init, config);\n}\n","import { ctx } from '../../../../utils/request-context';\nimport { Config } from '../../../../../utils/Config';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n urlMatches,\n} from '../../../../utils/routes';\nimport { Routes } from '../../../../types';\n\nimport { GET } from './GET';\nimport { POST } from './POST';\n\nconst key = 'TENANT_USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = config.logger(`[ROUTES][${key}]`);\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, { 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\nexport async function fetchTenantUsers(\n config: Config,\n method: 'GET' | 'POST',\n payload?: {\n body?: string;\n params?: { newTenantName?: string; tenantId?: string };\n }\n) {\n const { body, params } = payload ?? {};\n const { tenantId, headers } = ctx.get();\n if (!tenantId) {\n throw new Error(\n \"Unable to fetch the user's tenants, the tenantId context is missing. Call nile.setContext({ tenantId })\"\n );\n }\n if (!isUUID(tenantId)) {\n config\n .logger('fetchTenantUsers')\n .warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const q = new URLSearchParams();\n if (params?.newTenantName) {\n q.set('newTenantName', params.newTenantName);\n }\n if (params?.tenantId) {\n q.set('tenantId', params.tenantId);\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT_USERS.replace('{tenantId}', tenantId)}`;\n\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers,\n };\n // I don't think post works\n if (method === 'POST') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n","import { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\nimport request from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/invite:\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 // this came as a get request, convert it to a put\n if (yurl.searchParams.size > 0) {\n init.body = new URLSearchParams(yurl.searchParams).toString();\n }\n init.method = 'PUT';\n const url = `${apiRoutes(config.apiUrl).INVITE(tenantId)}`;\n\n const res = await request(url, init, config);\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}\n","import { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\nimport fetch from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/invite:\n * post:\n * tags:\n * - tenants\n * summary: Create an invite for a user in a tenant.\n * operationId: invite\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"201\":\n * description: An email was sent to the user, inviting them to join the 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 POST(\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 = 'POST';\n init.body = init.request.body;\n const url = `${apiRoutes(config.apiUrl).INVITE(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../utils/Config';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n urlMatches,\n} from '../../../../utils/routes';\nimport { Routes } from '../../../../types';\nimport { ctx } from '../../../../utils/request-context';\n\nimport { PUT } from './PUT';\nimport { POST } from './POST';\n\nconst key = 'INVITE';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n // the browser is a GET, but we need to PUT it into nile-auth\n // server side, this is a put\n case 'GET':\n case 'PUT':\n return await PUT(config, { request });\n case 'POST':\n return await POST(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 [, tenantId] = url.pathname.split('/').reverse();\n const route = configRoutes[key].replace('{tenantId}', tenantId);\n return urlMatches(request.url, route);\n}\n\nexport async function fetchInvite(\n config: Config,\n method?: 'POST' | 'PUT' | 'DELETE',\n body?: string\n) {\n const { headers, tenantId } = ctx.get();\n if (!tenantId) {\n throw new Error(\n 'Unable to fetch the invite for the tenant, the tenantId context is missing. Call nile.setContext({ tenantId })'\n );\n }\n if (!isUUID(tenantId)) {\n config\n .logger('fetchInvite')\n .warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n let clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.INVITE.replace('{tenantId}', tenantId)}`;\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers,\n };\n if (method === 'POST' || method === 'PUT') {\n init.body = body;\n }\n if (method === 'DELETE') {\n clientUrl = `${clientUrl}/${body}`;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n","import request from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\n/**\n * @swagger\n * /api/tenants/{tenantId}/invites:\n * get:\n * tags:\n * - tenants\n * summary: Lists invites for a tenant.\n * operationId: listInvites\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 tenant invites\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) {\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 = 'GET';\n const url = `${apiRoutes(config.apiUrl).INVITES(tenantId)}`;\n\n return await request(url, init, config);\n}\n","import { ctx } from '../../../../utils/request-context';\nimport { Config } from '../../../../../utils/Config';\nimport { DefaultNileAuthRoutes, isUUID } from '../../../../utils/routes';\nimport { Routes } from '../../../../types';\n\nimport { GET } from './GET';\n\nconst key = 'INVITES';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'GET':\n return await GET(config, { request });\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 [, tenantId] = url.pathname.split('/').reverse();\n const route = configRoutes[key].replace('{tenantId}', tenantId);\n return url.pathname.endsWith(route);\n}\n\nexport async function fetchInvites(config: Config) {\n const { tenantId, headers } = ctx.get();\n if (!tenantId) {\n throw new Error(\n 'Unable to fetch invites for the tenant, the tenantId context is missing. Call nile.setContext({ tenantId })'\n );\n }\n if (!isUUID(tenantId)) {\n config\n .logger('fetchInvites')\n .warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.INVITES.replace('{tenantId}', tenantId)}`;\n\n const req = new Request(clientUrl, { headers });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Config } from '../../../utils/Config';\nimport { ActiveSession } from '../../utils/auth';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\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.apiUrl).USER_TENANTS(session.id)}`;\n if (typeof session === 'object' && 'user' in session && session.user) {\n url = `${apiRoutes(config.apiUrl).USER_TENANTS(session.user.id)}`;\n }\n\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport request from '../../../utils/request';\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 * 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 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.apiUrl).TENANT(tenantId)}`;\n\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\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.apiUrl).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\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.apiUrl).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';\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.apiUrl).TENANTS}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport { Routes } from '../../types';\nimport auth from '../../utils/auth';\nimport { urlMatches, DefaultNileAuthRoutes, isUUID } from '../../utils/routes';\nimport { ctx } from '../../utils/request-context';\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\nconst key = 'TENANTS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = config.logger(`[ROUTES][${key}]`);\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\nexport async function fetchTenants(\n config: Config,\n method: 'POST' | 'GET',\n body?: string\n): Promise<Response> {\n const { headers } = ctx.get();\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.TENANTS}`;\n\n const init: RequestInit = {\n method,\n headers,\n };\n if (method === 'POST') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers.POST(req)) as Response;\n}\n\nexport async function fetchTenant(\n config: Config,\n method: 'GET' | 'DELETE' | 'PUT',\n body?: string\n) {\n const { headers, tenantId } = ctx.get();\n if (!tenantId) {\n throw new Error(\n 'Unable to fetch tenants, the tenantId context is missing. Call nile.setContext({ tenantId })'\n );\n }\n if (!isUUID(tenantId)) {\n config\n .logger('fetch tenant')\n .warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT.replace('{tenantId}', tenantId)}`;\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers,\n };\n if (m === 'PUT') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n\nexport async function fetchTenantsByUser(config: Config) {\n const { warn } = config.logger(' fetchTenantsByUser ');\n const { userId, headers } = ctx.get();\n if (!userId) {\n warn(\n 'nile.userId is not set. The call will still work for the API, but the database context is not set properly and may lead to unexpected behavior in your application.'\n );\n } else if (!isUUID(userId)) {\n warn(\n 'nile.userId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.TENANTS}`;\n const req = new Request(clientUrl, { headers });\n\n return (await config.handlers.GET(req)) as Response;\n}\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 { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'SIGNIN';\n\nexport default async function route(req: Request, config: Config) {\n let url = proxyRoutes(config.apiUrl)[key];\n\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n };\n if (req.method === 'POST') {\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n\n url = `${proxyRoutes(config.apiUrl)[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\n// this is not for the the credential provider STILL NEED TO FIGURE THIS OUT I THINK? or remove.\nexport async function fetchSignIn(\n config: Config,\n provider: string,\n body: URLSearchParams\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SIGNIN}/${provider}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'POST',\n body,\n headers,\n });\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config.apiUrl).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\nexport async function fetchSession(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SESSION}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'GET',\n headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config.apiUrl).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\nexport async function fetchProviders(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.PROVIDERS}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'GET',\n headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config.apiUrl).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\nexport async function fetchCsrf(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.CSRF}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'GET',\n headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport { ProviderName } from '../../utils/auth';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'CALLBACK';\n\nexport default async function route(req: Request, config: Config) {\n const { error } = config.logger(`[ROUTES][${key}]`);\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n try {\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n const url = `${proxyRoutes(config.apiUrl)[key]}/${provider}${\n params.toString() !== '' ? `?${params.toString()}` : ''\n }`;\n\n const res = await request(\n url,\n {\n request: req,\n method: req.method,\n },\n config\n ).catch((e) => {\n error('an error as occurred', e);\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\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n } catch (e) {\n error(e);\n }\n return new Response('An unexpected error has occurred.', { status: 400 });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CALLBACK);\n}\n\n// this is for the the credential provider, among other things\nexport async function fetchCallback(\n config: Config,\n provider: ProviderName,\n body?: string,\n request?: Request,\n method: 'POST' | 'GET' = 'POST'\n): Promise<Response> {\n const { headers } = ctx.get();\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n NileAuthRoutes.CALLBACK\n }/${provider}${request ? `?${new URL(request.url).searchParams}` : ''}`;\n const req = new Request(clientUrl, {\n method,\n headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport fetch from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'SIGNOUT';\nexport default async function route(request: Request, config: Config) {\n let url = proxyRoutes(config.apiUrl)[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.apiUrl)[key]}${\n provider !== 'signout' ? `/${provider}` : ''\n }`;\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\nexport async function fetchSignOut(\n config: Config,\n body: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SIGNOUT}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'POST',\n body,\n headers,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'ERROR';\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config.apiUrl)[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 { urlMatches, proxyRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'VERIFY_REQUEST';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config.apiUrl)[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';\nimport { urlMatches, proxyRoutes, NileAuthRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'PASSWORD_RESET';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config.apiUrl)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\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.PASSWORD_RESET);\n}\n\nexport async function fetchResetPassword(\n config: Config,\n method: 'POST' | 'GET' | 'PUT',\n body: null | string,\n params?: URLSearchParams,\n useJson = true\n) {\n const authParams = new URLSearchParams(params ?? {});\n if (useJson) {\n authParams?.set('json', 'true');\n }\n const { headers } = ctx.get();\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n NileAuthRoutes.PASSWORD_RESET\n }?${authParams?.toString()}`;\n const init: RequestInit = {\n method,\n headers,\n };\n if (body && method !== 'GET') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n return (await config.handlers[method](req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes, NileAuthRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'VERIFY_EMAIL';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config.apiUrl)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\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[key]);\n}\n\nexport async function fetchVerifyEmail(\n config: Config,\n method: 'POST' | 'GET',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.VERIFY_EMAIL}`;\n const { headers } = ctx.get();\n const init: RequestInit = {\n method,\n headers,\n };\n if (body) {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[method](req)) as Response;\n}\n","import { urlMatches, proxyRoutes, NileAuthRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport { ctx } from '../../utils/request-context';\n\nconst key = 'MULTI_FACTOR';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config.apiUrl)[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\nexport async function fetchMfa(\n config: Config,\n method: 'DELETE' | 'PUT' | 'POST',\n body: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.MULTI_FACTOR}`;\n const { headers } = ctx.get();\n const init: RequestInit = {\n headers,\n method,\n body,\n };\n\n const req = new Request(clientUrl, init);\n return (await config.handlers[method](req)) as Response;\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 invite, {\n matches as matchesInvite,\n} from '../routes/tenants/[tenantId]/invite';\nimport invites, {\n matches as matchesInvites,\n} from '../routes/tenants/[tenantId]/invites';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport { Routes } from '../types';\nimport * as authRoutes from '../routes/auth';\nimport { Config } from '../../utils/Config';\nimport { ExtensionState } from '../../types';\n\nexport default function GETTER(configRoutes: Routes, config: Config) {\n const { error, info, warn } = config.logger('[GET MATCHER]');\n return async function GET(...params: unknown[]) {\n const handledRequest = await config.extensionCtx?.runExtensions(\n ExtensionState.onHandleRequest,\n config,\n params\n );\n // if this has been overridden, we don't do anything else.\n // for express, when you do this, make a new internal instance that does not have\n // `onHandleRequest`\n if (handledRequest) {\n return handledRequest;\n }\n\n // the default\n const req = params[0] instanceof Request ? params[0] : null;\n if (!req) {\n error('Proxy requests failed, a Request object was not passed.');\n return;\n }\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n // order matters for invites (matches against tenants and invite)\n if (matchesInvites(configRoutes, req)) {\n info('matches tenant invites');\n return invites(req, config);\n }\n\n if (matchesInvite(configRoutes, req)) {\n info('matches invite');\n return invite(req, config);\n }\n\n if (matchesTenantUsers(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\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(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.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n\n if (authRoutes.matchesVerifyRequest(configRoutes, req)) {\n info('matches verify-request');\n return authRoutes.handleVerifyRequest(req, config);\n }\n\n if (authRoutes.matchesVerifyEmail(configRoutes, req)) {\n info('matches verify-email');\n return authRoutes.handleVerifyEmail(req, config);\n }\n\n if (authRoutes.matchError(configRoutes, req)) {\n info('matches error');\n return authRoutes.handleError(req, config);\n }\n warn(`No GET routes matched ${req.url}`);\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\n\n/**\n * @swagger\n * /api/signup:\n * post:\n * tags:\n * - users\n * summary: signs a user up\n * description: signs a user up and logs them in. Expects a email and password combo\n * operationId: signUp\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 and session 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 */\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.apiUrl).SIGNUP}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport { Routes } from '../../types';\nimport { ctx } from '../../utils/request-context';\nimport { urlMatches, DefaultNileAuthRoutes } from '../../utils/routes';\n\nimport { POST } from './POST';\n\nconst key = 'SIGNUP';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'POST':\n return await POST(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\nexport async function fetchSignUp(\n config: Config,\n payload: {\n body?: string;\n params?: { newTenantName?: string; tenantId?: string };\n }\n): Promise<Response> {\n const { body, params } = payload ?? {};\n const q = new URLSearchParams();\n if (params?.newTenantName) {\n q.set('newTenantName', params.newTenantName);\n }\n if (params?.tenantId) {\n q.set('tenantId', params.tenantId);\n }\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n DefaultNileAuthRoutes.SIGNUP\n }${q.size > 0 ? `?${q}` : ''}`;\n const { headers } = ctx.get();\n const req = new Request(clientUrl, {\n method: 'POST',\n headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { matchesLog } from '../../utils/Logger';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport signup, { matches as matchesSignup } from '../routes/signup';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport inviteUsers, {\n matches as matchesInviteUsers,\n} from '../routes/tenants/[tenantId]/invite';\nimport { Routes } from '../types';\nimport { ExtensionState } 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, error } = config.logger('[POST MATCHER]');\n return async function POST(...params: unknown[]) {\n // convert whatever `req` we are getting to something that will work with express.\n const handledRequest = await config.extensionCtx?.runExtensions(\n ExtensionState.onHandleRequest,\n config,\n params\n );\n // if this has been overridden, we don't do anything else.\n // for express, when you do this, make a new internal instance that does not have\n // `onHandleRequest`\n if (handledRequest) {\n return handledRequest;\n }\n // the default\n const req = params[0] instanceof Request ? params[0] : null;\n if (!req) {\n error('Proxy requests failed, a Request object was not passed.');\n return;\n }\n // special case for logging client errors\n if (matchesLog(configRoutes, req)) {\n try {\n const json = await req.clone().json();\n error(req.body && json);\n } catch {\n error(await req.text());\n }\n return new Response(null, { status: 200 });\n }\n // order matters for tenantUsers\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n // order matters for tenantInvites\n if (matchesInviteUsers(configRoutes, req)) {\n info('matches tenant invite');\n return inviteUsers(req, config);\n }\n\n if (matchesSignup(configRoutes, req)) {\n info('matches signup');\n return signup(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 if (authRoutes.matchesMfa(configRoutes, req)) {\n info('matches mfa');\n return authRoutes.handleMfa(req, config);\n }\n if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(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.matchesVerifyEmail(configRoutes, req)) {\n info('matches verify-email');\n return authRoutes.handleVerifyEmail(req, config);\n }\n\n warn(`No POST routes matched ${req.url}`);\n return new Response(null, { status: 404 });\n };\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{userId}/link:\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: leaveTenant \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 * - 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\n const [, userId, , tenantId] = yurl.pathname.split('/').reverse();\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config.apiUrl).TENANT_USER(tenantId, userId)}/link`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{userId}/link:\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 * - name: userId \n * in: path\n * required: true\n * schema:\n * type: string\n \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\n const [, userId, , tenantId] = yurl.pathname.split('/').reverse();\n\n init.method = 'PUT';\n const url = `${apiRoutes(config.apiUrl).TENANT_USER(tenantId, userId)}/link`;\n\n return await fetch(url, init, config);\n}\n","import { ctx } from '../../../../../utils/request-context';\nimport { Config } from '../../../../../../utils/Config';\nimport { DefaultNileAuthRoutes, urlMatches } from '../../../../../utils/routes';\nimport { Routes } from '../../../../../types';\nimport auth from '../../../../../utils/auth';\n\nimport { DELETE } from './DELETE';\nimport { PUT } from './PUT';\n\nconst key = 'TENANT_USER';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = config.logger(`[ROUTES][${key}]`);\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 [, userId] = yurl.pathname.split('/').reverse();\n\n if (!userId) {\n info('No tenant id found in path');\n return new Response(null, { status: 404 });\n }\n\n switch (request.method) {\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 // `link` may be on the end of this.\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\nexport async function fetchTenantUser(\n config: Config,\n method: 'DELETE' | 'PUT'\n) {\n const { headers, tenantId, userId } = ctx.get();\n const action = method === 'PUT' ? 'add' : 'delete';\n if (!tenantId) {\n throw new Error(\n `Unable to ${action} user to the tenant, the tenantId context is missing. Use nile.withContext({ tenantId })`\n );\n }\n\n if (!userId) {\n throw new Error(\n `Unable to ${action} user to tenant. The userId context is missing. Use nile.withContext({ userId })`\n );\n }\n\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT_USER.replace('{tenantId}', tenantId).replace(\n '{userId}',\n userId\n )}/link`;\n const req = new Request(clientUrl, {\n headers,\n method,\n });\n\n return (await config.handlers[method](req)) as Response;\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport { Config } from '../../../../../../utils/Config';\nimport fetch from '../../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/invite/{inviteId}:\n * delete:\n * tags:\n * - tenants\n * summary: Deletes an invite on a tenant.\n * operationId: deleteInvite\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"204\":\n * description: Tenant invite 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 [inviteId, , 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.apiUrl).INVITE(tenantId)}/${inviteId}`;\n\n return await fetch(url, init, config);\n}\n","import { urlMatches } from '../../../../../utils/routes';\nimport { Routes } from '../../../../../types';\nimport { Config } from '../../../../../../utils/Config';\n\nimport { DELETE } from './DELETE';\n\nconst key = 'INVITE';\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'DELETE':\n return await DELETE(config, { request });\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [inviteId, , tenantId] = url.pathname.split('/').reverse();\n const route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{inviteId}', inviteId);\n return urlMatches(request.url, route);\n}\n","import { ExtensionState } from '../../types';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport me, { matches as matchesMe } from '../routes/me';\nimport tenantUser, {\n matches as matchesTenantUser,\n} from '../routes/tenants/[tenantId]/users/[userId]';\nimport invite, {\n matches as matchesInvite,\n} from '../routes/tenants/[tenantId]/invite/[inviteId]';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\nimport { matchesMfa, handleMfa } from '../routes/auth';\n\nexport default function DELETER(configRoutes: Routes, config: Config) {\n const { error, info, warn } = config.logger('[DELETE MATCHER]');\n return async function DELETE(...params: unknown[]) {\n // convert whatever `req` we are getting to something that will work with express.\n const handledRequest = await config.extensionCtx?.runExtensions(\n ExtensionState.onHandleRequest,\n config,\n params\n );\n // if this has been overridden, we don't do anything else.\n // for express, when you do this, make a new internal instance that does not have\n // `onHandleRequest`\n if (handledRequest) {\n return handledRequest;\n }\n // the default\n const req = params[0] instanceof Request ? params[0] : null;\n if (!req) {\n error('Proxy requests failed, a Request object was not passed.');\n return;\n }\n // order matters for tenantInvites\n if (matchesInvite(configRoutes, req)) {\n info('matches tenant invite id');\n return invite(req, config);\n }\n\n if (matchesMfa(configRoutes, req)) {\n info('matches MFA');\n return handleMfa(req, config);\n }\n\n if (matchesTenantUser(configRoutes, req)) {\n info('matches tenant user');\n return tenantUser(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n\n warn('No DELETE routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import tenants, { matches as matchesTenants } from '../routes/tenants';\nimport me, { matches as matchesMe } from '../routes/me';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport tenantUser, {\n matches as matchesTenantUser,\n} from '../routes/tenants/[tenantId]/users/[userId]';\nimport invite, {\n matches as matchesInvite,\n} from '../routes/tenants/[tenantId]/invite';\nimport {\n handlePasswordReset,\n matchesPasswordReset,\n handleMfa,\n matchesMfa,\n} from '../routes/auth';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\nimport { ExtensionState } from '../../types';\n\nexport default function PUTER(configRoutes: Routes, config: Config) {\n const { error, info, warn } = config.logger('[PUT MATCHER]');\n return async function PUT(...params: unknown[]) {\n const handledRequest = await config.extensionCtx?.runExtensions(\n ExtensionState.onHandleRequest,\n config,\n params\n );\n // if this has been overridden, we don't do anything else.\n // for express, when you do this, make a new internal instance that does not have\n // `onHandleRequest`\n if (handledRequest) {\n return handledRequest;\n }\n\n // the default\n const req = params[0] instanceof Request ? params[0] : null;\n if (!req) {\n error('Proxy requests failed, a Request object was not passed.');\n return;\n }\n\n // order matters for tenantInvites\n if (matchesInvite(configRoutes, req)) {\n info('matches tenant invite');\n return invite(req, config);\n }\n\n if (matchesTenantUser(configRoutes, req)) {\n info('matches tenant user');\n return tenantUser(req, config);\n }\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesPasswordReset(configRoutes, req)) {\n info('matches reset password');\n return handlePasswordReset(req, config);\n }\n if (matchesMfa(configRoutes, req)) {\n info('matches mfa');\n return handleMfa(req, config);\n }\n warn('No PUT routes matched');\n return new Response(null, { status: 404 });\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 'dotenv/config';\nimport { NileConfig } from '../../types';\nimport { LogReturn } from '../Logger';\n\nexport type EnvConfig = {\n config: NileConfig & { logger: LogReturn };\n};\n\nexport const getApiUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (config?.apiUrl != null) {\n return config?.apiUrl;\n }\n if (stringCheck(process.env.NILEDB_API_URL)) {\n return process.env.NILEDB_API_URL;\n }\n\n throw new Error(\n 'A connection to nile-auth is required. Set NILEDB_API_URL as an environment variable.'\n );\n};\n\nexport const getCallbackUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (stringCheck(config?.callbackUrl)) {\n return config?.callbackUrl;\n }\n return process.env.NILEDB_CALLBACK_URL;\n};\n\nexport const getSecureCookies = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (config?.secureCookies != null) {\n return config?.secureCookies;\n }\n if (stringCheck(process.env.NILEDB_SECURECOOKIES)) {\n return Boolean(process.env.NILEDB_SECURECOOKIES);\n }\n return undefined;\n};\n\nexport const getUsername = (cfg: EnvConfig) => {\n const { config } = cfg;\n const logger = config.logger;\n\n const { info } = logger();\n if (config?.user) {\n info(`[config] ${config.user}`);\n return String(config?.user);\n }\n const user = stringCheck(process.env.NILEDB_USER);\n if (user) {\n info(`[NILEDB_USER] ${user}`);\n return user;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.username) {\n return url.username;\n }\n } catch (e) {\n //ok to fail\n }\n }\n throw new Error(\n 'A database user is required. Set NILEDB_USER as an environment variable.'\n );\n};\n\nexport const getPassword = (cfg: EnvConfig) => {\n const { config } = cfg;\n const logger = config.logger;\n const log = logProtector(logger);\n if (stringCheck(config?.password)) {\n log && log('[config]').info('***');\n return String(config?.password);\n }\n\n const pass = stringCheck(process.env.NILEDB_PASSWORD);\n if (pass) {\n logger('[NILEDB_PASSWORD]').info('***');\n\n return pass;\n }\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.password) {\n return url.password;\n }\n } catch (e) {\n // ok to fail\n }\n }\n throw new Error(\n 'A database password is required. Set NILEDB_PASSWORD as an environment variable.'\n );\n};\n\nexport const getDatabaseName = (cfg: EnvConfig) => {\n const { config } = cfg;\n const { info } = config.logger('[databaseName]');\n if (stringCheck(config?.databaseName)) {\n info(`[config] ${config?.databaseName}`);\n return String(config?.databaseName);\n }\n const name = stringCheck(process.env.NILEDB_NAME);\n if (name) {\n info(`[NILEDB_NAME] ${name}`);\n return name;\n }\n\n if (process.env.NILEDB_POSTGRES_URL) {\n try {\n const pgUrl = new URL(process.env.NILEDB_POSTGRES_URL);\n return pgUrl.pathname.substring(1);\n } catch (e) {\n // ok to fail\n }\n }\n throw new Error(\n 'A database name is required. Set NILEDB_PASSWORD as an environment variable.'\n );\n};\n\nexport const getTenantId = (cfg: EnvConfig): string | null => {\n const { config } = cfg;\n const { info } = config.logger('[tenantId]');\n if (stringCheck(config?.tenantId)) {\n info(`[config] ${config?.tenantId}`);\n return String(config?.tenantId);\n }\n\n if (stringCheck(process.env.NILEDB_TENANT)) {\n info(`[NILEDB_TENANT] ${process.env.NILEDB_TENANT}`);\n return String(process.env.NILEDB_TENANT);\n }\n\n return null;\n};\n\nexport function getDbHost(cfg: EnvConfig) {\n const { config } = cfg;\n const logger = config.logger;\n const { info } = logger('[db.host]');\n\n if (stringCheck(config?.db && config.db.host)) {\n info(`[config] ${config?.db?.host}`);\n return String(config?.db?.host);\n }\n\n if (stringCheck(process.env.NILEDB_HOST)) {\n info(`[NILEDB_HOST] ${process.env.NILEDB_HOST}`);\n return process.env.NILEDB_HOST;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n info(`[NILEDB_POSTGRES_URL] ${pgUrl.hostname}`);\n return pgUrl.hostname;\n } catch (e) {\n // ok to fail\n }\n }\n\n info('[default] db.thenile.dev');\n return 'db.thenile.dev';\n}\n\nexport function getDbPort(cfg: EnvConfig): number {\n const { config } = cfg;\n const logger = config.logger;\n const { info } = logger('[db.port]');\n if (config?.db?.port && config.db.port != null) {\n info(`[config] ${config?.db.port}`);\n return Number(config.db?.port);\n }\n\n if (stringCheck(process.env.NILEDB_PORT)) {\n info(`[NILEDB_PORT] ${process.env.NILEDB_PORT}`);\n return Number(process.env.NILEDB_PORT);\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n if (pgUrl.port) {\n return Number(pgUrl.port);\n }\n } catch (e) {\n // ok to fail\n }\n }\n info('[default] 5432');\n return 5432;\n}\n\n// don't let people accidentally log secrets to production\nconst logProtector = (logger: LogReturn) => {\n return process.env.NODE_ENV === 'development' ||\n process.env.NODE_ENV === 'test'\n ? logger\n : null;\n};\n\nconst stringCheck = (str: string | null | undefined) => {\n if (str && str !== '') {\n return str;\n }\n return;\n};\n","import Handlers from '../../api/handlers';\nimport { appRoutes } from '../../api/utils/routes';\nimport { Routes } from '../../api/types';\nimport {\n NilePoolConfig,\n NileConfig,\n Extension,\n ExtensionState,\n RouteFunctions,\n PartialContext,\n} from '../../types';\nimport Logger, { LogReturn } from '../Logger';\n\nexport type ConfigurablePaths = {\n get: string[];\n post: string[];\n delete: string[];\n put: string[];\n};\nexport type ExtensionReturns = void | Response | Request | ExtensionState;\nexport type ExtensionCtx = {\n runExtensions: <T = ExtensionReturns>(\n toRun: ExtensionState,\n config: Config,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n params?: any,\n _init?: RequestInit & { request: Request }\n ) => Promise<T>;\n};\ntype ConfigConstructor = NileConfig & { extensionCtx?: ExtensionCtx };\n\nimport {\n EnvConfig,\n getDatabaseName,\n getDbHost,\n getDbPort,\n getPassword,\n getUsername,\n getSecureCookies,\n getCallbackUrl,\n getApiUrl,\n} from './envVars';\n\nexport class Config {\n routes: Routes;\n handlers: RouteFunctions;\n paths: ConfigurablePaths;\n extensionCtx: ExtensionCtx;\n extensions?: Extension[];\n logger: LogReturn;\n context: PartialContext;\n\n /**\n * The nile-auth url\n */\n apiUrl: string;\n\n origin?: string | undefined | null;\n\n /**\n * important for separating the `origin` config value from a default in order to make requests\n */\n serverOrigin: string;\n\n debug?: boolean;\n /**\n * To use secure cookies or not in the fetch\n */\n secureCookies?: boolean;\n\n callbackUrl?: string;\n /**\n * change the starting route\n */\n routePrefix: string;\n\n db: NilePoolConfig;\n\n constructor(config?: ConfigConstructor) {\n this.routePrefix = config?.routePrefix ?? '/api';\n this.debug = config?.debug;\n this.origin = config?.origin;\n this.extensions = config?.extensions;\n this.extensionCtx = config?.extensionCtx as ExtensionCtx;\n this.serverOrigin = config?.origin ?? 'http://localhost:3000';\n\n this.logger = Logger(config);\n const envVarConfig: EnvConfig = {\n config: { ...config, logger: this.logger },\n };\n this.secureCookies = getSecureCookies(envVarConfig);\n this.callbackUrl = getCallbackUrl(envVarConfig);\n\n // this four throw because its the only way to get it\n this.apiUrl = getApiUrl(envVarConfig) as string;\n const user = getUsername(envVarConfig) as string;\n const password = getPassword(envVarConfig) as string;\n const databaseName = getDatabaseName(envVarConfig) as string;\n\n const { host, port, ...dbConfig } = config?.db ?? {};\n const configuredHost = host ?? getDbHost(envVarConfig);\n const configuredPort = port ?? getDbPort(envVarConfig);\n\n this.db = {\n user,\n password,\n host: configuredHost,\n port: configuredPort,\n ...dbConfig,\n };\n if (databaseName) {\n this.db.database = databaseName;\n }\n\n // If you configured nile globally, we keep these to be sure they are honored per-request\n this.context = {\n tenantId: config?.tenantId,\n userId: config?.userId,\n headers: config?.headers ? new Headers(config.headers) : new Headers(),\n };\n\n this.routes = {\n ...appRoutes(config?.routePrefix),\n ...config?.routes,\n };\n\n this.handlers = Handlers(this.routes as Routes, this);\n\n this.paths = {\n get: [\n this.routes.ME,\n this.routes.TENANT_USERS,\n this.routes.TENANTS,\n this.routes.TENANT,\n this.routes.SESSION,\n this.routes.SIGNIN,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n this.routes.PASSWORD_RESET,\n this.routes.CALLBACK,\n this.routes.SIGNOUT,\n this.routes.VERIFY_REQUEST,\n this.routes.ERROR,\n ],\n post: [\n this.routes.TENANT_USERS,\n this.routes.SIGNUP,\n this.routes.USERS,\n this.routes.TENANTS,\n this.routes.SESSION,\n `${this.routes.SIGNIN}/{provider}`,\n this.routes.PASSWORD_RESET,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n `${this.routes.CALLBACK}/{provider}`,\n this.routes.SIGNOUT,\n ],\n put: [\n this.routes.TENANT_USERS,\n this.routes.USERS,\n this.routes.TENANT,\n this.routes.PASSWORD_RESET,\n ],\n delete: [this.routes.TENANT_USER, this.routes.TENANT],\n };\n }\n}\n","// Define a map of event names to value types\ntype EventMap = {\n [Events.User]: string | null | undefined;\n [Events.Tenant]: string | null | undefined;\n [Events.Token]: string | null | undefined;\n [Events.EvictPool]: string | null | undefined;\n [Events.Headers]: Headers | null | undefined;\n};\n\n// Generic EventFn now uses the EventMap\ntype EventFn<K extends keyof EventMap = keyof EventMap> = (\n params: EventMap[K]\n) => void;\n\nenum Events {\n User = 'userId',\n Tenant = 'tenantId',\n Token = 'token',\n EvictPool = 'EvictPool',\n Headers = 'headers',\n}\n\nclass Eventer<E extends Record<string, unknown>> {\n private events: { [K in keyof E]?: Array<(value: E[K]) => void> } = {};\n\n publish<K extends keyof E>(eventName: K, value: E[K]) {\n const callbacks = this.events[eventName];\n if (callbacks) {\n for (const callback of callbacks) {\n callback(value);\n }\n }\n }\n\n subscribe<K extends keyof E>(eventName: K, callback: (value: E[K]) => void) {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(callback);\n }\n\n unsubscribe<K extends keyof E>(\n eventName: K,\n callback: (value: E[K]) => void\n ) {\n const callbacks = this.events[eventName];\n if (!callbacks) return;\n\n const index = callbacks.indexOf(callback);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n\n if (callbacks.length === 0) {\n delete this.events[eventName];\n }\n }\n}\n\nconst eventer = new Eventer<EventMap>();\n\nexport const updateTenantId = (tenantId: EventMap[Events.Tenant]) => {\n eventer.publish(Events.Tenant, tenantId);\n};\nexport const watchTenantId = (cb: EventFn<Events.Tenant>) =>\n eventer.subscribe(Events.Tenant, cb);\n\nexport const updateUserId = (userId: EventMap[Events.User]) => {\n eventer.publish(Events.User, userId);\n};\nexport const watchUserId = (cb: EventFn<Events.User>) =>\n eventer.subscribe(Events.User, cb);\n\nexport const updateToken = (token: EventMap[Events.Token]) => {\n eventer.publish(Events.Token, token);\n};\n\nexport const evictPool = (val: EventMap[Events.EvictPool]) => {\n eventer.publish(Events.EvictPool, val);\n};\nexport const watchEvictPool = (cb: EventFn<Events.EvictPool>) =>\n eventer.subscribe(Events.EvictPool, cb);\n\nexport const updateHeaders = (val: EventMap[Events.Headers]) => {\n eventer.publish(Events.Headers, val);\n};\nexport const watchHeaders = (cb: EventFn<Events.Headers>) =>\n eventer.subscribe(Events.Headers, cb);\n","import pg from 'pg';\n\nimport { NilePoolConfig } from '../types';\nimport { LogReturn } from '../utils/Logger';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AllowAny = any;\n\nexport function createProxyForPool(\n pool: pg.Pool,\n config: NilePoolConfig,\n logger: LogReturn,\n context: string[]\n): pg.Pool {\n const { info, error } = logger('[pool]');\n return new Proxy<pg.Pool>(pool, {\n get(target: AllowAny, property) {\n if (property === 'query') {\n // give connection string a pass for these problems\n if (!config.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.database) {\n error(\n 'Unable to obtain database name. Is process.env.NILEDB_POSTGRES_URL set?'\n );\n }\n }\n const caller = target[property];\n return function query(...args: AllowAny) {\n let log = '[QUERY]';\n const [tenantId, userId] = context;\n if (tenantId) {\n log = `${log}[TENANT:${tenantId}]`;\n }\n if (userId) {\n log = `${log}[USER:${userId}]`;\n }\n info(log, ...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 pg.Pool;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport pg, { PoolConfig } from 'pg';\n\nimport { evictPool } from '../utils/Event';\nimport { AfterCreate, NilePoolConfig } from '../types';\nimport { Loggable, LogReturn } from '../utils/Logger';\n\nimport { createProxyForPool } from './PoolProxy';\n\nclass NileDatabase {\n pool: pg.Pool;\n tenantId?: undefined | null | string;\n userId?: undefined | null | string;\n id: string;\n logger: Loggable;\n timer: NodeJS.Timeout | undefined;\n config: PoolConfig;\n constructor(config: NilePoolConfig, logger: LogReturn, id: string) {\n this.logger = logger('[NileInstance]');\n this.id = id;\n const poolConfig = {\n min: 0,\n max: 10,\n idleTimeoutMillis: 30000,\n ...config,\n };\n const { afterCreate, ...remaining } = poolConfig;\n\n this.config = remaining;\n\n const cloned = { ...config };\n cloned.password = '***';\n this.logger.debug(`Connection pool config ${JSON.stringify(cloned)}`);\n\n this.pool = createProxyForPool(\n new pg.Pool(remaining),\n this.config,\n logger,\n id === 'base' ? [] : id.split(':')\n );\n\n if (typeof afterCreate === 'function') {\n this.logger.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 this.logger.debug(`pool connected ${this.id}`);\n this.startTimeout();\n const afterCreate: AfterCreate = makeAfterCreate(\n logger,\n `${this.id}|${this.timer}`\n );\n afterCreate(client, (err) => {\n const { error } = logger('[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 this.logger.info(`pool ${this.id} failed`, {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n });\n this.pool.on('release', (destroy) => {\n if (destroy) {\n clearTimeout(this.timer);\n evictPool(this.id);\n this.logger.debug(`destroying pool ${this.id}`);\n }\n });\n }\n\n startTimeout() {\n const { debug } = this.logger;\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.idleTimeoutMillis) ?? 30000\n }ms`\n );\n this.pool.end(() => {\n clearTimeout(this.timer);\n evictPool(this.id);\n });\n }, Number(this.config.idleTimeoutMillis) ?? 30000);\n }\n shutdown() {\n const { debug } = this.logger;\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(logger: LogReturn, id: string): AfterCreate {\n const { error, warn, debug } = logger('[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 const [context] = id.split('|');\n // the main ctx may mutate independent of this, the config at instantiation is the source of truth\n const [tenantId, userId] = context.split(':');\n if (tenantId !== 'base') {\n const query = [`SET nile.tenant_id = '${tenantId}'`];\n if (userId) {\n if (!tenantId) {\n warn('A user id cannot be set in context without a tenant id');\n }\n query.push(`SET nile.user_id = '${userId}'`);\n }\n\n // in this example we use pg driver's connection API\n conn.query(query.join(';'), function (err: Error) {\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 } else {\n if (query.length === 1) {\n debug(`connection context set: tenantId=${tenantId}`);\n }\n if (query.length === 2) {\n debug(\n `connection context set: tenantId=${tenantId} userId=${userId}`\n );\n }\n }\n\n done(err, conn);\n });\n }\n done(null, conn);\n };\n}\n","import pg from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { watchEvictPool } from '../utils/Event';\nimport Logger from '../utils/Logger';\nimport { ctx } from '../api/utils/request-context';\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: Config) {\n this.cleared = false;\n this.connections = new Map();\n this.poolWatcherFn = this.poolWatcher(config);\n watchEvictPool(this.poolWatcherFn);\n }\n poolWatcher = (config: Config) => (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: Config, noContext = false): pg.Pool => {\n const { info } = Logger(config)('[DBManager]');\n const { tenantId, userId } = noContext ? {} : ctx.getLastUsed();\n const id = this.makeId(tenantId, 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(config.db, config.logger, 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: Config) => {\n const { info } = Logger(config)('[DBManager]');\n info(`Clearing all connections ${this.connections.size}`);\n this.cleared = true;\n this.connections.forEach((connection) => {\n connection.shutdown();\n });\n this.connections.clear();\n };\n}\n","import { fetchCallback } from '../api/routes/auth/callback';\nimport { fetchMfa } from '../api/routes/auth/mfa';\nimport { fetchResetPassword } from '../api/routes/auth/password-reset';\nimport { fetchProviders } from '../api/routes/auth/providers';\nimport { fetchSession } from '../api/routes/auth/session';\nimport { fetchSignIn } from '../api/routes/auth/signin';\nimport { fetchSignOut } from '../api/routes/auth/signout';\nimport { fetchSignUp } from '../api/routes/signup';\nimport { ActiveSession, JWT, Provider, ProviderName } from '../api/utils/auth';\nimport { ctx, withNileContext } from '../api/utils/request-context';\nimport { NileAuthRoutes } from '../api/utils/routes';\nimport { User } from '../users/types';\nimport { Config } from '../utils/Config';\nimport { updateHeaders, updateTenantId } from '../utils/Event';\nimport { Loggable } from '../utils/Logger';\n\nimport obtainCsrf from './obtainCsrf';\n\ntype MfaPayload = {\n token?: string;\n scope?: 'setup' | 'challenge';\n method?: 'authenticator' | 'email';\n code?: string;\n remove?: boolean;\n};\ntype SignUpPayload = {\n email: string;\n password: string;\n tenantId?: string;\n newTenantName?: string;\n};\n/**\n * Utility class that wraps the server side authentication endpoints.\n *\n * The methods in this class call the `fetch*` helpers which are generated\n * from the OpenAPI specification. Those helpers interact with routes under\n * the `/api/auth` prefix such as `/session`, `/signin`, `/signout` and others.\n * By reusing them here we provide a higher level interface for frameworks to\n * manage user authentication.\n */\nexport default class Auth {\n #logger: Loggable;\n #config: Config;\n /**\n * Create an Auth helper.\n *\n * @param config - runtime configuration used by the underlying fetch helpers\n * such as `serverOrigin`, `routePrefix` and default headers.\n */\n constructor(config: Config) {\n this.#config = config;\n this.#logger = config.logger('[auth]');\n }\n /**\n * Retrieve the currently active session from the API.\n *\n * Internally this issues a `GET` request to `/api/auth/session` via\n * {@link fetchSession}. If `rawResponse` is `true` the raw {@link Response}\n * object is returned instead of the parsed JSON.\n *\n * @template T Return type for the parsed session.\n * @param rawResponse - set to `true` to get the raw {@link Response} object.\n */\n getSession<T = JWT | ActiveSession | undefined>(\n rawResponse?: false\n ): Promise<T>;\n getSession(rawResponse: true): Promise<Response>;\n async getSession<T = JWT | ActiveSession | Response | undefined>(\n rawResponse = false\n ): Promise<T | Response> {\n return withNileContext(this.#config, async () => {\n const res = await fetchSession(this.#config);\n if (rawResponse) {\n return res;\n }\n try {\n const session = await res.clone().json();\n if (Object.keys(session).length === 0) {\n return undefined as T;\n }\n return session as T;\n } catch {\n return res;\n }\n });\n }\n /**\n * Acquire a CSRF token for subsequent authenticated requests.\n *\n * Issues a `GET` to `/api/auth/csrf` via {@link obtainCsrf}. When the call\n * succeeds the returned headers are merged into the current configuration so\n * future requests include the appropriate cookies.\n *\n * @param rawResponse - when `true`, skip JSON parsing and return the raw\n * {@link Response}.\n */\n async getCsrf<T = Response | JSON>(rawResponse?: false): Promise<T>;\n async getCsrf(rawResponse: true): Promise<Response>;\n async getCsrf<T = Response | JSON>(rawResponse = false) {\n return withNileContext(this.#config, async () => {\n return await obtainCsrf<T>(this.#config, rawResponse);\n });\n }\n /**\n * List all configured authentication providers.\n *\n * This calls `/api/auth/providers` using {@link fetchProviders} to retrieve\n * the available provider configuration. Providers are returned as an object\n * keyed by provider name.\n *\n * @param rawResponse - when true, return the {@link Response} instead of the\n * parsed JSON.\n */\n async listProviders(rawResponse: true): Promise<Response>;\n async listProviders<T = { [key: string]: Provider }>(\n rawResponse?: false\n ): Promise<T>;\n async listProviders<T = { [key: string]: Provider }>(\n rawResponse = false\n ): Promise<T | Response> {\n return withNileContext(this.#config, async () => {\n const res = await fetchProviders(this.#config);\n if (rawResponse) {\n return res;\n }\n try {\n return (await res.clone().json()) as T;\n } catch {\n return res;\n }\n });\n }\n /**\n * Sign the current user out by calling `/api/auth/signout`.\n *\n * The CSRF token is fetched automatically and the stored cookies are cleared\n * from the internal configuration once the request completes.\n */\n async signOut(): Promise<Response> {\n return withNileContext(\n this.#config,\n async () => {\n // check for csrf header, maybe its already there?\n const csrfRes = await this.getCsrf();\n if (!('csrfToken' in csrfRes)) {\n throw new Error('Unable to obtain CSRF token. Sign out failed.');\n }\n\n const body = JSON.stringify({\n csrfToken: csrfRes.csrfToken,\n json: true,\n });\n const res = await fetchSignOut(this.#config, body);\n\n updateHeaders(new Headers({}));\n ctx.set({ headers: null });\n\n return res;\n },\n 'signout'\n );\n }\n\n /**\n * Create a new user account and start a session.\n *\n * This method posts to the `/api/signup` endpoint using\n * {@link fetchSignUp}. Only the credential provider is supported; a valid\n * email and password must be supplied. On success the returned session token\n * is stored in the headers used for subsequent requests.\n *\n * @param payload - email and password along with optional tenant\n * information.\n * @param rawResponse - when `true` return the raw {@link Response} rather\n * than the parsed {@link User} object.\n */\n async signUp(payload: SignUpPayload, rawResponse: true): Promise<Response>;\n async signUp<T = User | Response>(payload: SignUpPayload): Promise<T>;\n async signUp<T = User | Response | undefined>(\n payload: SignUpPayload,\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(\n this.#config,\n async () => {\n // be sure its fresh\n ctx.set({ headers: null });\n const { email, password, ...params } = payload;\n if (!email || !password) {\n throw new Error(\n 'Server side sign up requires a user email and password.'\n );\n }\n\n const providers = await this.listProviders();\n const { credentials } = providers ?? {};\n if (!credentials) {\n throw new Error(\n 'Unable to obtain credential provider. Aborting server side sign up.'\n );\n }\n\n const csrf = await obtainCsrf(this.#config);\n\n let csrfToken;\n if ('csrfToken' in csrf) {\n csrfToken = csrf.csrfToken;\n } else {\n throw new Error('Unable to obtain parse CSRF. Request blocked.');\n }\n\n const body = JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n });\n\n const res = await fetchSignUp(this.#config, { body, params });\n if (res.status > 299) {\n this.#logger.error(await res.clone().text());\n return undefined as T;\n }\n const token = parseToken(res.headers);\n if (!token) {\n throw new Error(\n 'Server side sign up failed. Session token not found'\n );\n }\n const { headers } = ctx.get();\n headers?.append('cookie', token);\n ctx.set({ headers });\n // this will globally set headers for everyone, so how\n // do you make it so you can chain these together? or at least\n // call them sequentially safely? you gotta use the `withContext` callback\n updateHeaders(headers);\n if (rawResponse) {\n return res as T;\n }\n try {\n const json = (await res.clone().json()) as T;\n if (json && typeof json === 'object' && 'tenants' in json) {\n const tenantId = (json as unknown as User).tenants[0];\n if (tenantId) {\n updateTenantId(tenantId);\n }\n }\n return json;\n } catch {\n return res as T;\n }\n },\n 'signup'\n );\n }\n\n /**\n * Request a password reset email.\n *\n * Sends a `POST` to `/api/auth/password-reset` with the provided email and\n * optional callback information. The endpoint responds with a redirect URL\n * which is returned as a {@link Response} object.\n */\n async forgotPassword(req: {\n email: string;\n callbackUrl?: string;\n redirectUrl?: string;\n }): Promise<Response> {\n return withNileContext(this.#config, async () => {\n let email = '';\n const defaults = defaultCallbackUrl(this.#config);\n let callbackUrl = defaults.callbackUrl;\n let redirectUrl = defaults.redirectUrl;\n\n if ('email' in req) {\n email = req.email;\n }\n\n if ('callbackUrl' in req) {\n callbackUrl = fQUrl(req.callbackUrl ?? '', this.#config);\n }\n if ('redirectUrl' in req) {\n redirectUrl = fQUrl(req.redirectUrl ?? '', this.#config);\n }\n const body = JSON.stringify({\n email,\n redirectUrl,\n callbackUrl,\n });\n\n // we need a default\n const data = await fetchResetPassword(\n this.#config,\n 'POST',\n body,\n new URLSearchParams(),\n false\n );\n return data;\n });\n }\n\n /**\n * Complete a password reset.\n *\n * This workflow expects a token obtained from {@link forgotPassword}. The\n * function performs a POST/GET/PUT sequence against\n * `/api/auth/password-reset` as described in the OpenAPI specification.\n *\n * @param req - either a {@link Request} with a JSON body or an object\n * containing the necessary fields.\n */\n async resetPassword(\n req:\n | Request\n | {\n email: string;\n password: string;\n callbackUrl?: string;\n redirectUrl?: string;\n }\n ): Promise<Response> {\n return withNileContext(this.#config, async () => {\n let email = '';\n let password = '';\n const defaults = defaultCallbackUrl(this.#config);\n let callbackUrl = defaults.callbackUrl;\n let redirectUrl = defaults.redirectUrl;\n if (req instanceof Request) {\n const body = await req.json();\n email = body.email;\n password = body.password;\n const cbFromHeaders = parseCallback(req.headers);\n if (cbFromHeaders) {\n callbackUrl = cbFromHeaders;\n }\n if (body.callbackUrl) {\n callbackUrl = body.callbackUrl;\n }\n if (body.redirectUrl) {\n redirectUrl = body.redirectUrl;\n }\n } else {\n if ('email' in req) {\n email = req.email;\n }\n if ('password' in req) {\n password = req.password;\n }\n if ('callbackUrl' in req) {\n callbackUrl = req.callbackUrl ? req.callbackUrl : null;\n }\n if ('redirectUrl' in req) {\n redirectUrl = req.redirectUrl ? req.redirectUrl : null;\n }\n }\n // we need a default\n await this.getCsrf();\n const body = JSON.stringify({\n email,\n password,\n redirectUrl,\n callbackUrl,\n });\n let urlWithParams;\n try {\n const data = await fetchResetPassword(this.#config, 'POST', body);\n const cloned = data.clone();\n if (data.status === 400) {\n const text = await cloned.text();\n this.#logger.error(text);\n return data;\n }\n\n const { url } = await data.json();\n urlWithParams = url;\n } catch {\n // failed\n }\n let token;\n try {\n const worthyParams = new URL(urlWithParams).searchParams;\n const answer = await fetchResetPassword(\n this.#config,\n 'GET',\n null,\n worthyParams\n );\n token = parseResetToken(answer.headers);\n } catch {\n this.#logger.warn(\n 'Unable to parse reset password url. Password not reset.'\n );\n }\n\n // this only needs to happen on the local config\n const { headers } = ctx.get();\n const cookie = headers?.get('cookie')?.split('; ');\n if (token) {\n cookie?.push(token);\n } else {\n throw new Error(\n 'Unable to reset password, reset token is missing from response'\n );\n }\n if (cookie) {\n headers?.set('cookie', cookie?.join('; '));\n ctx.set({\n headers,\n });\n }\n const res = await fetchResetPassword(this.#config, 'PUT', body);\n // remove the token\n cookie?.pop();\n const cleaned: string[] =\n cookie?.filter((c) => !c.includes('nile.session')) ?? [];\n cleaned.push(String(parseToken(res.headers)));\n const updatedHeaders = new Headers({ cookie: cleaned.join('; ') });\n updateHeaders(updatedHeaders);\n\n return res;\n });\n }\n /**\n * Low level helper used by {@link signIn} to complete provider flows.\n *\n * Depending on the provider this issues either a GET or POST request to\n * `/api/auth/callback/{provider}` via {@link fetchCallback}.\n */\n async callback(provider: ProviderName, body?: string | Request) {\n if (body instanceof Request) {\n ctx.set({\n headers: body.headers,\n });\n return await fetchCallback(\n this.#config,\n provider,\n undefined,\n body,\n 'GET'\n );\n }\n return await fetchCallback(this.#config, provider, body);\n }\n /**\n * Sign a user in with one of the configured providers.\n *\n * Internally this posts to `/api/auth/signin/{provider}` and follows the\n * provider callback flow as documented in the OpenAPI spec. When using the\n * credential provider an email and password must be supplied.\n *\n * @param payload - request body or credential object\n * @param rawResponse - return the raw {@link Response} instead of parsed JSON\n */\n async signIn<T = Response>(\n provider: ProviderName,\n payload?: Request | { email: string; password: string },\n rawResponse?: true\n ): Promise<T>;\n async signIn<T = Response | undefined>(\n provider: ProviderName,\n payload?: Request | { email: string; password: string },\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n if (payload instanceof Request) {\n const body = new URLSearchParams(await payload.text());\n const origin = new URL(payload.url).origin;\n\n const payloadUrl = body?.get('callbackUrl');\n const csrfToken = body?.get('csrfToken');\n\n const callbackUrl = `${\n !payloadUrl?.startsWith('http') ? origin : ''\n }${payloadUrl}`;\n if (!csrfToken) {\n throw new Error(\n 'CSRF token in missing from request. Request it by the client before calling sign in'\n );\n }\n\n const updatedHeaders = new Headers(payload.headers);\n updatedHeaders.set('Content-Type', 'application/x-www-form-urlencoded');\n\n ctx.set({ headers: updatedHeaders });\n\n const params = new URLSearchParams({\n csrfToken,\n json: String(true),\n });\n if (payloadUrl) {\n params.set('callbackUrl', callbackUrl);\n }\n return (await fetchSignIn(this.#config, provider, params)) as T;\n }\n\n ctx.set({ headers: null });\n\n const { info, error } = this.#logger;\n\n const providers = await this.listProviders();\n info('Obtaining csrf');\n const csrf = await obtainCsrf(this.#config);\n\n let csrfToken;\n if ('csrfToken' in csrf) {\n csrfToken = csrf.csrfToken;\n // const parsedCookie = csrf.headers.get('cookie');\n // if (parsedCookie) {\n // this.#config.context.headers.set('cookie', parsedCookie);\n // }\n } else {\n throw new Error('Unable to obtain parse CSRF. Request blocked.');\n }\n\n const { credentials } = providers ?? {};\n\n if (!credentials) {\n throw new Error(\n 'Unable to obtain credential provider. Aborting server side sign in.'\n );\n }\n\n const { email, password } = payload ?? {};\n if (provider === 'email' && (!email || !password)) {\n throw new Error(\n 'Server side sign in requires a user email and password.'\n );\n }\n\n info(`Obtaining providers for ${email}`);\n info(`Attempting sign in with email ${email}`);\n if (!email) {\n throw new Error('Email missing from payload, unable to sign in');\n }\n const body = JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n });\n\n const signInRes = await this.callback(provider, body);\n\n // check the shape of what came back for 2fa\n const twoFactor = await is2FA(signInRes);\n if (twoFactor) {\n if (rawResponse) {\n return signInRes as T;\n }\n try {\n return (await signInRes.clone().json()) as T;\n } catch {\n return signInRes as T;\n }\n }\n\n const authCookie = signInRes?.headers.get('set-cookie');\n // in the case of 2fa, this is actually acceptable, so what do I do with this?\n if (!authCookie) {\n throw new Error('authentication failed');\n }\n\n const token = parseToken(signInRes?.headers);\n const possibleError = signInRes?.headers.get('location');\n if (possibleError) {\n let urlError;\n try {\n urlError = new URL(possibleError).searchParams.get('error');\n } catch {\n //noop\n }\n if (urlError) {\n error('Unable to log user in', { error: urlError });\n return new Response(urlError, { status: signInRes.status }) as T;\n }\n }\n if (!token) {\n error('Unable to obtain auth token', {\n authCookie,\n signInRes,\n });\n throw new Error('Server login failed');\n }\n info('Server sign in successful', { authCookie });\n\n // last thing to do is be sure the next call is up to date with good headers\n const setCookie = signInRes.headers.get('set-cookie');\n const { headers } = ctx.get();\n if (setCookie) {\n const cookie = [\n parseCSRF(headers),\n parseCallback(signInRes.headers),\n parseToken(signInRes.headers),\n ]\n .filter(Boolean)\n .join('; ');\n const uHeaders = new Headers({ cookie });\n updateHeaders(uHeaders);\n ctx.set({ headers: uHeaders });\n } else {\n error('Unable to set context after sign in', {\n headers: signInRes.headers,\n });\n }\n\n if (rawResponse) {\n return signInRes as T;\n }\n try {\n return (await signInRes.clone().json()) as T;\n } catch {\n return signInRes as T;\n }\n });\n }\n async mfa<T = Response>(params: MfaPayload, rawResponse?: true): Promise<T>;\n async mfa<T = Response | undefined>(\n params: MfaPayload,\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n // for a `challenge`, it must be POST, with token\n let method: 'POST' | 'PUT' | 'DELETE' = 'POST';\n if (params.scope === 'setup') {\n method = 'PUT';\n }\n if (params.remove) {\n method = 'DELETE';\n }\n\n const res = await fetchMfa(\n this.#config,\n method,\n JSON.stringify({ ...params, method: params.method ?? 'authenticator' })\n );\n if (rawResponse) {\n return res as T;\n }\n try {\n return (await res.clone().json()) as T;\n } catch {\n return res as T;\n }\n });\n }\n}\n\n/**\n * Extract the CSRF cookie from a set of headers.\n */\nexport function parseCSRF(headers?: Headers) {\n let cookie = headers?.get('set-cookie');\n if (!cookie) {\n cookie = headers?.get('cookie');\n }\n if (!cookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.csrf-token=[^;]+)/.exec(cookie) ?? [];\n return token;\n}\n\n/**\n * Extract the callback cookie from a set of headers.\n */\nexport function parseCallback(headers?: Headers) {\n let cookie = headers?.get('set-cookie');\n if (!cookie) {\n cookie = headers?.get('cookie');\n }\n if (!cookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.callback-url=[^;]+)/.exec(cookie) ?? [];\n return token;\n}\n\n/**\n * Extract the session token cookie from a set of headers.\n */\nexport function parseToken(headers?: Headers) {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] =\n /((__Secure-)?nile\\.session-token=[^;]+)/.exec(authCookie) ?? [];\n return token;\n}\n/**\n * Internal helper for the password reset flow.\n */\nexport function parseResetToken(headers: Headers | void): string | void {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.reset=[^;]+)/.exec(authCookie) ?? [];\n return token;\n}\n\n/**\n * Extract the tenantId cookie from a set of headers.\n */\nexport function parseTenantId(headers?: Headers) {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] =\n /((__Secure-)?nile\\.tenant-id=[^;]+)/.exec(authCookie) ?? [];\n if (token) {\n const [, tenantId] = token.split('=');\n return tenantId;\n }\n return null;\n}\n\n/**\n * Determine the default callback and redirect URLs from the configured\n * headers. These are used during password reset flows when no explicit\n * callback is provided.\n */\nexport function defaultCallbackUrl(config: Config) {\n let cb = null;\n let redirect = null;\n const { headers } = ctx.get();\n const fallbackCb = parseCallback(headers);\n if (fallbackCb) {\n const [, value] = fallbackCb.split('=');\n cb = decodeURIComponent(value);\n if (value) {\n redirect = `${new URL(cb).origin}${config.routePrefix}${\n NileAuthRoutes.PASSWORD_RESET\n }`;\n }\n }\n return { callbackUrl: cb, redirectUrl: redirect };\n}\n\nfunction fQUrl(path: string, config: Config) {\n if (path.startsWith('/')) {\n const { callbackUrl } = defaultCallbackUrl(config);\n if (callbackUrl) {\n const { origin } = new URL(callbackUrl);\n return `${origin}${path}`;\n }\n }\n try {\n new URL(path);\n } catch {\n throw new Error('An invalid URL has been passed.');\n }\n return path;\n}\n\nasync function is2FA(signInRes: Response) {\n try {\n const cloned = await signInRes.clone();\n const json = await cloned.json();\n if ('method' in json && 'secret' in json) {\n return signInRes;\n }\n } catch {\n // noop\n }\n return null;\n}\n","import { fetchCsrf } from '../api/routes/auth/csrf';\nimport { updateHeaders } from '../utils/Event';\nimport { Config } from '../utils/Config';\nimport { ctx } from '../api/utils/request-context';\n\nimport { parseCallback, parseCSRF, parseToken } from '.';\n\nexport default async function obtainCsrf<T = Response | { csrfToken: string }>(\n config: Config,\n rawResponse = false\n) {\n const { headers } = ctx.get();\n const res = await fetchCsrf(config);\n // we're gonna use it, so set the headers now.\n const csrfCook = parseCSRF(res.headers);\n\n // prefer the csrf from the headers over the saved one\n if (csrfCook) {\n const [, value] = csrfCook.split('=');\n const [token] = decodeURIComponent(value).split('|');\n\n const setCookie = res.headers.get('set-cookie');\n if (setCookie) {\n const cookie = [\n csrfCook,\n parseCallback(res.headers),\n parseToken(res.headers),\n ]\n .filter(Boolean)\n .join('; ');\n headers.set('cookie', cookie);\n ctx.set({ headers });\n updateHeaders(headers);\n }\n if (!rawResponse) {\n return { csrfToken: token };\n }\n } else {\n // for csrf, preserve the existing cookies\n const existingCookie = headers.get('cookie');\n const cookieParts = [];\n if (existingCookie) {\n cookieParts.push(parseToken(headers), parseCallback(headers));\n }\n if (csrfCook) {\n cookieParts.push(csrfCook);\n } else {\n // use the one tha tis already there\n cookieParts.push(parseCSRF(headers));\n }\n const cookie = cookieParts.filter(Boolean).join('; ');\n\n // we need to do it in both places in case its the very first time\n headers.set('cookie', cookie);\n ctx.set({ headers });\n updateHeaders(new Headers({ cookie }));\n }\n if (rawResponse) {\n return res as T;\n }\n try {\n return (await res.clone().json()) as T;\n } catch {\n return res as T;\n }\n}\n","export function fQUrl(callbackUrl: null | string, path: string) {\n if (path.startsWith('/')) {\n if (callbackUrl) {\n const { origin } = new URL(callbackUrl);\n return `${origin}${path}`;\n }\n }\n try {\n new URL(path);\n } catch {\n throw new Error('An invalid URL has been passed.');\n }\n return path;\n}\n","import { fetchMe } from '../api/routes/me';\nimport { Config } from '../utils/Config';\nimport { updateHeaders } from '../utils/Event';\nimport { fetchVerifyEmail } from '../api/routes/auth/verify-email';\nimport getCsrf from '../auth/obtainCsrf';\nimport { Loggable } from '../utils/Logger';\nimport { parseCallback } from '../auth';\nimport { ctx, withNileContext } from '../api/utils/request-context';\nimport { fQUrl } from '../utils/qualifyDomain';\n\nimport { User } from './types';\n\n/**\n * Convenience wrapper around the user endpoints.\n *\n * Requests are issued via {@link fetchMe} against `/api/me`. The Swagger\n * definitions for these APIs live in\n * `packages/server/src/api/routes/me/index.ts`.\n */\nexport default class Users {\n #config: Config;\n #logger: Loggable;\n /**\n * Create a new Users helper.\n * @param config - The configuration used for requests.\n */\n constructor(config: Config) {\n this.#config = config;\n this.#logger = config.logger('[me]');\n }\n\n /**\n * Update the current user via `PUT /api/me`.\n *\n * The OpenAPI description for this endpoint can be found in\n * `packages/server/src/api/routes/me/index.ts` under `updateSelf`.\n *\n * @param req - Partial user fields to send.\n * @param [rawResponse] - When `true`, return the raw {@link Response}.\n */\n async updateSelf<T = User[] | Response>(\n req: Partial<\n Omit<\n User,\n 'email' | 'tenants' | 'created' | 'updated' | 'emailVerified'\n > & { emailVerified: boolean }\n >,\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n const res = await fetchMe(this.#config, 'PUT', JSON.stringify(req));\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n });\n }\n\n /**\n * Remove the current user using `DELETE /api/me`.\n *\n * After the request the authentication headers are cleared with\n * {@link updateHeaders}. The OpenAPI docs for this route are in\n * `packages/server/src/api/routes/me/index.ts` under `removeSelf`.\n */\n async removeSelf(): Promise<Response> {\n return withNileContext(this.#config, async () => {\n const me = await this.getSelf();\n if ('id' in me) {\n const userId = (me as unknown as User).id;\n ctx.set({ userId });\n }\n const res = await fetchMe(this.#config, 'DELETE');\n updateHeaders(new Headers());\n return res;\n });\n }\n\n /**\n * Retrieve the current user with `GET /api/me`.\n *\n * OpenAPI for this endpoint resides in\n * `packages/server/src/api/routes/me/index.ts` (`getSelf`).\n *\n * @param [rawResponse] - When `true` return the raw {@link Response}.\n */\n async getSelf<T = User | Response>(rawResponse?: false): Promise<T>;\n async getSelf(rawResponse: true): Promise<Response>;\n async getSelf<T = User | Response>(rawResponse?: boolean): Promise<T> {\n return withNileContext(\n this.#config,\n async () => {\n const res = await fetchMe(this.#config);\n\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n },\n 'getSelf'\n );\n }\n\n /**\n * Initiate an email verification flow.\n *\n * The current user is fetched and then `/auth/verify-email` is called.\n * In development or when `bypassEmail` is set, the user's\n * `emailVerified` field is updated instead of sending an email.\n * See `packages/server/src/api/routes/auth/verify-email.ts` for the\n * underlying request.\n *\n * @param [options] - Flags controlling bypass behaviour and callback URL.\n * @param [rawResponse] - When `true` return the raw {@link Response}.\n */\n async verifySelf<T = void>(): Promise<T>;\n async verifySelf(rawResponse: true): Promise<Response>;\n async verifySelf<T = Response | User>(\n options: {\n bypassEmail?: boolean;\n callbackUrl?: string;\n },\n rawResponse?: true\n ): Promise<T>;\n async verifySelf<T = void | Response>(\n options?: true | { bypassEmail?: boolean; callbackUrl?: string },\n rawResponse = false\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n const bypassEmail =\n typeof options === 'object' && options?.bypassEmail === true;\n const callbackUrl = fQUrl(\n defaultCallbackUrl().callbackUrl,\n typeof options === 'object' ? String(options.callbackUrl) : '/'\n );\n\n let res;\n\n try {\n const me = await this.getSelf();\n if (me instanceof Response) {\n return me as T;\n }\n res = await verifyEmailAddress(this.#config, me, String(callbackUrl));\n return res as T;\n } catch (e) {\n if (!bypassEmail) {\n let message = 'Unable to verify email.';\n if (e instanceof Error) {\n message = e.message;\n }\n this.#logger?.error(\n `${message} you can bypass this message by setting bypassEmail: true when calling 'verifySelf'`\n );\n res = new Response(message, { status: 400 });\n }\n }\n\n if (bypassEmail) {\n this.#logger?.info(\n 'bypassing email requirements for email verification'\n );\n res = this.updateSelf({ emailVerified: true }, rawResponse);\n }\n\n return res as T;\n });\n }\n}\n\n/**\n * Issue a POST to `/auth/verify-email` for the supplied user.\n *\n * @internal This helper is shared by {@link verifySelf}.\n * @param config - Active configuration.\n * @param user - The user to verify.\n * @param callback - Callback URL to include in the request body.\n */\nasync function verifyEmailAddress(\n config: Config,\n user: User,\n callback: string\n) {\n const { headers } = ctx.get();\n headers?.set('content-type', 'application/x-www-form-urlencoded');\n ctx.set({ headers });\n const { csrfToken } = await getCsrf<{ csrfToken: string }>(config);\n const defaults = defaultCallbackUrl();\n const callbackUrl = callback ?? String(defaults.callbackUrl);\n const res = await fetchVerifyEmail(\n config,\n 'POST',\n new URLSearchParams({\n csrfToken,\n email: user.email,\n callbackUrl,\n }).toString()\n );\n if (res.status > 299) {\n throw new Error(await res.text());\n }\n return res;\n}\n\n/**\n * Derive the `callbackUrl` from the `nile.callback-url` cookie if present.\n *\n * @param config - Configuration whose headers may contain the cookie.\n * @returns An object with the parsed `callbackUrl` or `null`.\n */\nexport function defaultCallbackUrl() {\n let cb = null;\n const { headers } = ctx.get();\n const fallbackCb = parseCallback(headers);\n if (fallbackCb) {\n const [, value] = fallbackCb.split('=');\n cb = decodeURIComponent(value);\n }\n return { callbackUrl: cb };\n}\n","import { fetchMe } from '../api/routes/me';\nimport {\n fetchTenant,\n fetchTenants,\n fetchTenantsByUser,\n} from '../api/routes/tenants';\nimport { fetchInvite } from '../api/routes/tenants/[tenantId]/invite';\nimport { fetchInvites } from '../api/routes/tenants/[tenantId]/invites';\nimport { fetchTenantUsers } from '../api/routes/tenants/[tenantId]/users';\nimport { fetchTenantUser } from '../api/routes/tenants/[tenantId]/users/[userId]';\nimport { ctx, withNileContext } from '../api/utils/request-context';\nimport { DefaultNileAuthRoutes } from '../api/utils/routes';\nimport { parseCallback } from '../auth';\nimport obtainCsrf from '../auth/obtainCsrf';\nimport { NileRequest } from '../types';\nimport { User } from '../users/types';\nimport { Config } from '../utils/Config';\nimport { fQUrl } from '../utils/qualifyDomain';\n\nimport { Invite, Tenant } from './types';\n\n/**\n * Convenience wrapper around the tenant endpoints. These methods call\n * the `fetch*` helpers in `packages/server/src/api/routes/tenants` which\n * in turn hit routes such as `/api/tenants` and `/api/tenants/{tenantId}`.\n * See those files for the Swagger definitions.\n */\n\ntype ReqContext = { userId?: string; tenantId?: string };\ntype JoinTenantRequest = string | ReqContext | { id: string };\n\nexport default class Tenants {\n #config: Config;\n constructor(config: Config) {\n this.#config = config;\n }\n\n create(name: string, rawResponse: true): Promise<Response>;\n create<T = Tenant | Response>(\n name: string,\n rawResponse?: boolean\n ): Promise<T>;\n create<T = Tenant | Response>(\n payload: {\n name: string;\n id?: string;\n },\n rawResponse?: boolean\n ): Promise<T>;\n /**\n * Create a new tenant using `POST /api/tenants`.\n * See `packages/server/src/api/routes/tenants/POST.ts` for the\n * `createTenant` operation definition.\n */\n async create<T = Tenant | Response | undefined>(\n req: { name: string; id?: string } | string,\n rawResponse?: boolean\n ): Promise<T | Response | undefined> {\n return withNileContext(this.#config, async () => {\n let res;\n if (typeof req === 'string') {\n res = await fetchTenants(\n this.#config,\n 'POST',\n JSON.stringify({ name: req })\n );\n } else if (typeof req === 'object' && ('name' in req || 'id' in req)) {\n res = await fetchTenants(this.#config, 'POST', JSON.stringify(req));\n }\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n });\n }\n\n /**\n * Delete a tenant using `DELETE /api/tenants/{tenantId}`.\n * The OpenAPI operation is defined in\n * `packages/server/src/api/routes/tenants/[tenantId]/DELETE.ts`.\n */\n delete<T = Response>(id?: string): Promise<T>;\n /**\n * Delete a tenant using `DELETE /api/tenants/{tenantId}`.\n * See `packages/server/src/api/routes/tenants/[tenantId]/DELETE.ts`.\n */\n delete<T = Response>(payload: { id: string }): Promise<T>;\n /**\n * Remove a tenant via `DELETE /api/tenants/{tenantId}`.\n *\n * @param req - The tenant to remove or context containing the id.\n */\n async delete<T = Response>(\n req: NileRequest<void> | { id?: string } | string | Tenant\n ): Promise<T | Response> {\n return withNileContext(this.#config, async () => {\n if (typeof req === 'string') {\n ctx.set({ tenantId: req });\n }\n if (typeof req === 'object' && 'id' in req) {\n ctx.set({ tenantId: req.id });\n }\n const res = await fetchTenant(this.#config, 'DELETE');\n return res;\n });\n }\n\n get<T = Tenant | Response>(): Promise<T>;\n get<T = Tenant | Response>(id: string, rawResponse?: boolean): Promise<T>;\n get(rawResponse: true): Promise<Response>;\n get<T = Tenant | Response>(\n payload: { id: string },\n rawResponse?: boolean\n ): Promise<T>;\n /**\n * Fetch details for a tenant using `GET /api/tenants/{tenantId}`.\n *\n * @param req - Tenant identifier or context.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n async get<T = Tenant | Response>(\n req: boolean | { id: string } | string | void,\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n if (typeof req === 'string') {\n ctx.set({ tenantId: req });\n } else if (typeof req === 'object' && 'id' in req) {\n ctx.set({ tenantId: req.id });\n }\n const res = await fetchTenant(this.#config, 'GET');\n if (rawResponse === true || req === true) {\n return res as T;\n }\n\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n });\n }\n\n async update(req: Partial<Tenant>, rawResponse: true): Promise<Response>;\n /**\n * Modify a tenant using `PUT /api/tenants/{tenantId}`.\n *\n * @param req - Tenant data to update. Can include an id.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n update<T = Tenant | Response | undefined>(\n req: Partial<Tenant>,\n rawResponse?: boolean\n ): Promise<T>;\n async update<T = Tenant | Response | undefined>(\n req: Partial<Tenant>,\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n let res;\n if (typeof req === 'object' && ('name' in req || 'id' in req)) {\n const { id, ...remaining } = req;\n if (id) {\n ctx.set({ tenantId: id });\n }\n res = await fetchTenant(this.#config, 'PUT', JSON.stringify(remaining));\n }\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n });\n }\n\n list<T = Tenant[] | Response>(): Promise<T>;\n list(rawResponse: true): Promise<Response>;\n /**\n * List tenants for the current user via `GET /api/tenants`.\n * See `packages/server/src/api/routes/tenants/GET.ts` for details.\n */\n async list<T = Tenant[] | Response>(\n req: boolean | NileRequest<void> | Headers\n ): Promise<T | Response | undefined> {\n return withNileContext(\n this.#config,\n async () => {\n const res = await fetchTenantsByUser(this.#config);\n if (req === true) {\n return res;\n }\n\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n },\n 'listTenants'\n );\n }\n /**\n * Leave the current tenant using `DELETE /api/tenants/{tenantId}/users/{userId}`.\n *\n * @param [req] - Optionally specify the tenant id to leave.\n */\n async leaveTenant<T = Response>(\n req?: string | { tenantId: string }\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n const me = await fetchMe(this.#config);\n try {\n const json = await me.json();\n if ('id' in json) {\n ctx.set({ userId: json.id });\n }\n } catch {\n // maybe there's already a context, let `fetchTenantUser` deal with it\n }\n if (typeof req === 'string') {\n ctx.set({ tenantId: req });\n } else {\n this.#handleContext(req);\n }\n return (await fetchTenantUser(this.#config, 'DELETE')) as T;\n });\n }\n\n addMember(req: JoinTenantRequest, rawResponse: true): Promise<Response>;\n /**\n * Add a user to a tenant via `PUT /api/tenants/{tenantId}/users/{userId}`.\n *\n * @param req - User and tenant identifiers or context.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n addMember<T = User | Response>(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<T>;\n async addMember<T = User | Response>(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n if (typeof req === 'string') {\n ctx.set({ userId: req });\n } else {\n this.#handleContext(req);\n }\n const res = await fetchTenantUser(this.#config, 'PUT');\n return responseHandler(res, rawResponse);\n });\n }\n\n /**\n * Remove a user from a tenant with `DELETE /api/tenants/{tenantId}/users/{userId}`.\n *\n * @param req - User and tenant identifiers or context.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n async removeMember(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<Response> {\n return withNileContext(this.#config, async () => {\n this.#handleContext(req);\n if (typeof req === 'string') {\n ctx.set({ userId: req });\n }\n const res = await fetchTenantUser(this.#config, 'DELETE');\n return responseHandler(res, rawResponse);\n });\n }\n /**\n * List users for a tenant via `GET /api/tenants/{tenantId}/users`.\n *\n * @param [req] - Tenant identifier or context.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n users<T = User[] | Response>(\n req?: boolean | { tenantId?: string },\n rawResponse?: boolean\n ): Promise<T>;\n users(req: true): Promise<Response>;\n async users<T>(\n req?: boolean | { tenantId?: string },\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(\n this.#config,\n async () => {\n this.#handleContext(req);\n const res = await fetchTenantUsers(this.#config, 'GET');\n return responseHandler(\n res,\n rawResponse || (typeof req === 'boolean' && req)\n ) as T;\n },\n 'users'\n );\n }\n\n /**\n * List invites for the current tenant via `GET /api/tenants/{tenantId}/invites`.\n */\n async invites<T = Invite[] | Response>(): Promise<T> {\n return withNileContext(\n this.#config,\n async () => {\n const res = await fetchInvites(this.#config);\n\n return responseHandler(res);\n },\n 'invites'\n );\n }\n\n /**\n * Send an invitation via `POST /api/tenants/{tenantId}/invite`.\n *\n * @param req - Email and optional callback/redirect URLs.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n async invite<T = Response | Invite>(\n req: string | { email: string; callbackUrl?: string; redirectUrl?: string },\n rawResponse?: boolean\n ): Promise<T>;\n async invite(\n req: string | { email: string; callbackUrl?: string; redirectUrl?: string },\n rawResponse: true\n ): Promise<Response>;\n async invite<T = Response | Invite>(\n req: string | { email: string; callbackUrl?: string; redirectUrl?: string },\n rawResponse?: boolean\n ): Promise<T> {\n // if we are going to call this, as *soon* as we do, we need to execute extensions\n return withNileContext(\n this.#config,\n async () => {\n // need to get rid of the headers every where in favor of the context\n const { csrfToken } = await obtainCsrf<{ csrfToken: string }>(\n this.#config\n );\n const defaults = defaultCallbackUrl(this.#config);\n let identifier: string = req as string;\n let callbackUrl: string = defaults.callbackUrl as string;\n let redirectUrl: string = defaults.redirectUrl as string;\n\n if (typeof req === 'object') {\n if ('email' in req) {\n identifier = req.email;\n }\n\n const { callbackUrl: cbUrl } = defaultCallbackUrl(this.#config);\n if ('callbackUrl' in req) {\n callbackUrl = fQUrl(cbUrl, req.callbackUrl ?? '/');\n }\n if ('redirectUrl' in req) {\n redirectUrl = fQUrl(cbUrl, req.redirectUrl ?? '/');\n }\n }\n\n const { headers } = ctx.get();\n headers?.set('Content-Type', 'application/x-www-form-urlencoded');\n ctx.set({ headers });\n const res = await fetchInvite(\n this.#config,\n 'POST',\n new URLSearchParams({\n identifier,\n csrfToken,\n callbackUrl,\n redirectUrl,\n }).toString()\n );\n return responseHandler(res, rawResponse);\n },\n 'invites'\n );\n }\n\n /**\n * Accept an invite using `PUT /api/tenants/{tenantId}/invite`.\n *\n * @param req - Identifier and token from the invite email.\n * @param [rawResponse] - When true, return the raw {@link Response}.\n */\n async acceptInvite<T = Response>(\n req?: { identifier: string; token: string; callbackUrl?: string },\n rawResponse?: boolean\n ): Promise<T> {\n return withNileContext(this.#config, async () => {\n if (!req) {\n throw new Error('The identifier and token are required.');\n }\n const { identifier, token } = req;\n const { callbackUrl: cbUrl } = defaultCallbackUrl(this.#config);\n const callbackUrl = fQUrl(cbUrl, req?.callbackUrl ?? '/');\n\n const res = await fetchInvite(\n this.#config,\n 'PUT',\n new URLSearchParams({\n identifier,\n token,\n callbackUrl,\n }).toString()\n );\n return responseHandler(res, rawResponse);\n });\n }\n\n /**\n * Delete a pending invite using `DELETE /api/tenants/{tenantId}/invite/{inviteId}`.\n *\n * @param req - Identifier of the invite to remove.\n */\n async deleteInvite<T = Response>(req: string | { id: string }): Promise<T> {\n return withNileContext(this.#config, async () => {\n let id = '';\n if (typeof req === 'object') {\n id = req.id;\n } else {\n id = req;\n }\n\n if (!id) {\n throw new Error('An invite id is required.');\n }\n\n const res = await fetchInvite(this.#config, 'DELETE', id);\n return responseHandler(res, true);\n });\n }\n\n #handleContext(req: JoinTenantRequest | boolean | undefined) {\n if (typeof req === 'object') {\n if ('tenantId' in req) {\n ctx.set({ tenantId: req.tenantId });\n }\n if ('userId' in req) {\n ctx.set({ userId: req.userId });\n }\n }\n }\n}\n\n/**\n * Handle the fetch response, optionally parsing JSON.\n *\n * @param res - Response from fetch.\n * @param [rawResponse] - When true, return the response untouched.\n */\nasync function responseHandler(res: Response, rawResponse?: boolean) {\n if (rawResponse) {\n return res;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n}\n\n/**\n * Parse the `nile.callback-url` cookie to determine a callback and redirect.\n *\n * @param config - Configuration whose headers may contain the cookie.\n * @returns Parsed callback and redirect URLs.\n */\nexport function defaultCallbackUrl(config: Config) {\n let cb = null;\n let redirect = null;\n const { headers, tenantId } = ctx.get();\n const fallbackCb = parseCallback(headers);\n if (fallbackCb) {\n const [, value] = fallbackCb.split('=');\n cb = decodeURIComponent(value);\n if (value) {\n redirect = `${new URL(cb).origin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.INVITE.replace('{tenantId}', String(tenantId))}`;\n }\n }\n return { callbackUrl: cb, redirectUrl: redirect };\n}\n","import { Server } from '../../../Server';\nimport {\n ContextReturn,\n CTXHandlerType,\n NileConfig,\n RouteReturn,\n} from '../../../types';\nimport { Config } from '../../../utils/Config';\nimport getter from '../GET';\nimport poster from '../POST';\nimport deleter from '../DELETE';\nimport puter from '../PUT';\n\nexport function handlersWithContext(config: Config): CTXHandlerType {\n const GET = getter(config.routes, config);\n const POST = poster(config.routes, config);\n const DELETE = deleter(config.routes, config);\n const PUT = puter(config.routes, config);\n\n return {\n GET: async <T = Response>(req: Request): Promise<ContextReturn<T>> => {\n const response = await GET(req);\n const updatedConfig = updateConfig(response, config);\n return { response: response as T, nile: new Server(updatedConfig) };\n },\n POST: async <T = Response>(req: Request): Promise<ContextReturn<T>> => {\n const response = await POST(req);\n const updatedConfig = updateConfig(response, config);\n return { response: response as T, nile: new Server(updatedConfig) };\n },\n DELETE: async <T = Response>(req: Request): Promise<ContextReturn<T>> => {\n const response = await DELETE(req);\n const updatedConfig = updateConfig(response, config);\n return { response: response as T, nile: new Server(updatedConfig) };\n },\n PUT: async <T = Response>(req: Request): Promise<ContextReturn<T>> => {\n const response = await PUT(req);\n const updatedConfig = updateConfig(response, config);\n return { response: response as T, nile: new Server(updatedConfig) };\n },\n };\n}\n\nexport function updateConfig(\n response: RouteReturn,\n config: Config\n): NileConfig {\n let origin = 'http://localhost:3000';\n let headers: Headers | null = null;\n\n if (response instanceof Response) {\n if (response?.status === 302) {\n const location = response.headers.get('location');\n if (location) {\n const urlLocation = new URL(location);\n origin = urlLocation.origin;\n }\n }\n\n const setCookies: string[] = [];\n\n // Headers are iterable\n if (response?.headers) {\n for (const [key, value] of response.headers) {\n if (key.toLowerCase() === 'set-cookie') {\n setCookies.push(value);\n }\n }\n }\n if (setCookies.length > 0) {\n const cookieHeader = setCookies\n .map((cookieStr) => cookieStr.split(';')[0])\n .join('; ');\n\n headers = new Headers({ cookie: cookieHeader });\n }\n }\n\n return {\n ...config,\n origin,\n headers: headers ?? undefined,\n useLastContext: true,\n };\n}\n","import pg, { Pool } from 'pg';\n\nimport {\n Context,\n Extension,\n ExtensionState,\n NileConfig,\n NileHandlers,\n PartialContext,\n} from './types';\nimport { Config, ConfigurablePaths } from './utils/Config';\nimport { watchHeaders, watchTenantId, watchUserId } from './utils/Event';\nimport DbManager from './db';\nimport Users from './users';\nimport Tenants from './tenants';\nimport Auth from './auth';\nimport { HEADER_ORIGIN, HEADER_SECURE_COOKIES } from './utils/constants';\nimport { handlersWithContext } from './api/handlers/withContext';\nimport { buildExtensionConfig } from './api/utils/extensions';\nimport {\n ctx,\n defaultContext,\n withNileContext,\n} from './api/utils/request-context';\nimport { getTenantId } from './utils/Config/envVars';\n\nexport class Server {\n users: Users;\n tenants: Tenants;\n auth: Auth;\n #config: Config;\n #handlers: NileHandlers;\n #manager: DbManager;\n\n constructor(config?: NileConfig) {\n this.#config = new Config({\n ...config,\n extensionCtx: buildExtensionConfig(this),\n });\n\n // watch first, they may mutate first\n // unsure if this is still useful, with `ctx` around\n watchTenantId((tenantId) => {\n if (tenantId !== this.#config.context.tenantId) {\n this.#config.context.tenantId = String(tenantId);\n this.#reset();\n }\n });\n\n watchUserId((userId) => {\n if (userId !== this.#config.context.userId) {\n this.#config.context.userId = String(userId);\n this.#reset();\n }\n });\n\n watchHeaders((headers) => {\n if (headers) {\n // internally we can call this for sign in, among other things. Be sure the next request still works.\n this.#config.context.headers = new Headers(headers);\n this.#reset();\n }\n });\n\n this.#handlers = {\n ...this.#config.handlers,\n withContext: handlersWithContext(this.#config),\n };\n\n this.#config.context.tenantId = getTenantId({ config: this.#config });\n\n this.#manager = new DbManager(this.#config);\n\n // headers first, so instantiation is right the first time\n this.#handleHeaders(config);\n\n this.users = new Users(this.#config);\n this.tenants = new Tenants(this.#config);\n this.auth = new Auth(this.#config);\n\n // for `onConfigure`, we run it, but after the full config is already made\n if (config?.extensions) {\n for (const create of config.extensions) {\n if (typeof create !== 'function') {\n continue;\n }\n const ext = create(this);\n // we can only run this after config has a value, so we must wait, but we can't.\n if (ext.onConfigure) {\n ext.onConfigure();\n }\n\n if (ext?.replace?.handlers) {\n this.#config\n .logger('[EXTENSION]')\n .debug(`${ext.id} replacing handlers`);\n // if you replace these handlers, you can't call the original ones, so we need to \"replace\" our headers within the request.\n this.#handlers = ext.replace.handlers({\n ...this.#config.handlers,\n withContext: handlersWithContext(this.#config),\n });\n }\n }\n }\n }\n\n /**\n * Query the database with the current context\n */\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n query: Pool['query'] = (queryStream: any, values?: any) => {\n this.#config.context = { ...this.getContext() };\n const pool = this.#manager.getConnection(this.#config);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return pool.query(queryStream as any, values);\n };\n\n /**\n * Return a db object that can be used to talk to the database\n * Does not have a context by default\n */\n get db(): pg.Pool & { clearConnections: () => void } {\n const pool = this.#manager.getConnection(this.#config, true);\n\n return Object.assign(pool, {\n clearConnections: () => {\n this.#manager.clear(this.#config);\n },\n });\n }\n\n get logger() {\n return this.#config.logger;\n }\n\n get extensions() {\n return {\n remove: async (id: string) => {\n if (!this.#config.extensions) return;\n\n const resolved = this.#config.extensions.map((ext) => ext(this));\n const index = resolved.findIndex((ext) => ext.id === id);\n if (index !== -1) {\n this.#config.extensions.splice(index, 1);\n }\n return resolved;\n },\n add: (extension: Extension) => {\n if (!this.#config.extensions) {\n this.#config.extensions = [];\n }\n this.#config.extensions.push(extension);\n },\n };\n }\n\n get handlers() {\n return this.#handlers;\n }\n\n get paths(): ConfigurablePaths {\n return this.#config.paths;\n }\n\n set paths(paths: ConfigurablePaths) {\n this.#config.paths = paths;\n }\n\n /**\n * Sets the context for a particular set of requests or db calls to be sure the context is fully managed for the entire lifecycle\n */\n async withContext(): Promise<this>;\n async withContext<T>(\n context: PartialContext,\n fn: AsyncCallback<this, T>\n ): Promise<T>;\n async withContext(context: PartialContext): Promise<this>;\n async withContext<T>(fn: AsyncCallback<this, T>): Promise<T>;\n async withContext<T>(\n contextOrFn?: PartialContext | AsyncCallback<this, T>,\n maybeFn?: AsyncCallback<this, T>\n ): Promise<T | this> {\n const isFn = typeof contextOrFn === 'function';\n\n const context = isFn ? {} : contextOrFn ?? {};\n const fn = isFn ? (contextOrFn as AsyncCallback<this, T>) : maybeFn;\n\n const preserve =\n 'useLastContext' in context ? context.useLastContext : true;\n\n let hydrated: Context | undefined;\n if (preserve) {\n hydrated = await this.#hydrateContextFromExtensions();\n const base = hydrated ?? this.#config.context;\n this.#config.context = { ...base, ...context };\n } else {\n this.#config.context = { ...defaultContext, ...context };\n }\n return withNileContext(this.#config, async () => {\n return fn ? fn(this) : this;\n });\n }\n\n /**\n * Creates a context without a user id and a tenant id, but keeps the headers around for auth at least.\n * This is useful for DDL/DML, since most extensions will set the context by default\n */\n async noContext(): Promise<this>;\n async noContext<T>(fn: (sdk: this) => Promise<T>): Promise<T>;\n async noContext<T>(fn?: (sdk: this) => Promise<T>): Promise<T | this> {\n this.#config.context.tenantId = undefined;\n this.#config.context.userId = undefined;\n\n return withNileContext(this.#config, async () => {\n // there are some cases where you need to \"override\" stuff, and the extension context\n // is going to keep adding it back. For instance, nextjs is always going to set a tenant_id from the cookie\n // we need to honor the incoming config over the extension, else you can never just \"call\" things.\n ctx.set({ userId: undefined, tenantId: undefined });\n\n if (fn) {\n return fn(this);\n }\n return this;\n });\n }\n /**\n *\n * @returns the last used (basically global) context object, useful for debugging or making your own context\n */\n getContext(): Context {\n return ctx.getLastUsed();\n }\n\n /**\n * Merge headers together\n * Saves them in a singleton for use in a request later. It's basically the \"default\" value\n * Internally, passed a NileConfig, externally, should be using Headers\n */\n\n #handleHeaders(\n config?: NileConfig | void | Headers | Record<string, string> | null\n ) {\n const updates: [string, string][] = [];\n let headers;\n this.#config.context.headers = new Headers();\n\n if (config instanceof Headers) {\n headers = config;\n } else if (config?.headers) {\n // handle a config object internally,\n headers = config?.headers;\n if (config && config.origin) {\n // DO SOMETHING TO SURFACE A WARNING?\n this.#config.context.headers.set(HEADER_ORIGIN, config.origin);\n }\n if (config && config.secureCookies != null) {\n this.#config.context.headers.set(\n HEADER_SECURE_COOKIES,\n String(config.secureCookies)\n );\n }\n }\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n updates.push([key.toLowerCase(), value]);\n });\n } else {\n for (const [key, value] of Object.entries(headers ?? {})) {\n updates.push([key.toLowerCase(), value]);\n }\n }\n\n const merged: Record<string, string> = {};\n\n // if we do have a cookie, grab anything useful before it is destroyed.\n // this.#config.tenantId = getTenantFromHttp(this.#headers, this.#config);\n\n this.#config.context.headers?.forEach((value, key) => {\n // It is expected that if the 'cookie' is missing when you set headers, it should be removed.\n if (key.toLowerCase() !== 'cookie') {\n merged[key.toLowerCase()] = value;\n }\n });\n\n for (const [key, value] of updates) {\n merged[key] = value;\n }\n\n for (const [key, value] of Object.entries(merged)) {\n this.#config.context.headers.set(key, value);\n }\n\n this.#config.logger('[handleHeaders]').debug(JSON.stringify(merged));\n }\n\n async #hydrateContextFromExtensions(): Promise<Context | undefined> {\n if (!this.#config.extensions || this.#config.extensions.length === 0) {\n return undefined;\n }\n\n let updated: Context | undefined;\n\n await ctx.run({}, async () => {\n await this.#config.extensionCtx?.runExtensions(\n ExtensionState.withContext,\n this.#config\n );\n updated = ctx.get();\n });\n\n if (!updated) {\n return undefined;\n }\n\n const hydrated: Context = {\n headers: new Headers(updated.headers),\n tenantId: updated.tenantId,\n userId: updated.userId,\n };\n\n this.#config.context.headers = new Headers(hydrated.headers);\n this.#config.context.tenantId = hydrated.tenantId;\n this.#config.context.userId = hydrated.userId;\n\n return hydrated;\n }\n\n /**\n * Allow some internal mutations to reset our config + headers\n */\n #reset = () => {\n this.#config.extensionCtx = buildExtensionConfig(this);\n this.users = new Users(this.#config);\n this.tenants = new Tenants(this.#config);\n this.auth = new Auth(this.#config);\n };\n}\n\nlet server: unknown;\nexport function create<T = Server>(config?: NileConfig): T {\n if (!server) {\n server = new Server(config) as T;\n }\n\n return server as T;\n}\ntype AsyncCallback<TInstance, TResult> = (sdk: TInstance) => Promise<TResult>;\n"]}