@saumon-brule/ft.js
Version:
Aims to provide a usefull and easy way to use the 42 school's API.
1 lines • 38 kB
Source Map (JSON)
{"version":3,"sources":["../src/constants/FtApiBase.ts","../src/constants/FtApiErrors.ts","../src/generic/request/FtApiFetchError.ts","../src/typeguards/checkStatus.ts","../src/api/oauth/token.ts","../src/app/TokenManager/AppCredentials.ts","../src/app/TokenManager/AppCredentialsManager.ts","../src/user/UserCredential.ts","../src/generic/class/HttpClient.ts","../src/app/client/UserHttpClient.ts","../src/generic/request/handleResponse.ts","../src/generic/request/FtHeaders.ts","../src/api/me.ts","../src/user/User.ts","../src/app/server/serverResponsesHandler.ts","../src/app/UserManager/UserManager.ts","../src/app/client/AppHttpClient.ts","../src/app/App.ts","../src/structures/AuthenticatedRequest.ts"],"names":["ROUTE","EventEmitter","IncomingMessage"],"mappings":"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","file":"index.cjs","sourcesContent":["const API_BASE = \"https://api.intra.42.fr\";\n\nexport { API_BASE };\n","export const FtApiErrorMessages = {\n\t400: \"Bad request\",\n\t401: \"Unauthorized\",\n\t403: \"Forbidden\",\n\t404: \"Not found\",\n\t422: \"Unprocessable entity\",\n\t500: \"Server issue\"\n} as const;\n\nexport type FtApiStatus = keyof typeof FtApiErrorMessages;\n","import { FtApiErrorMessages, FtApiStatus } from \"~/constants/FtApiErrors\";\n\nexport class FtApiFetchError extends Error {\n\tstatus: FtApiStatus;\n\n\tconstructor(status: FtApiStatus) {\n\t\tsuper(FtApiErrorMessages[status]);\n\t\tthis.status = status;\n\t}\n}\n","import { FtApiStatus } from \"~/constants/FtApiErrors\";\n\nexport function checkStatus(status: number): status is FtApiStatus {\n\treturn (status === 400 || status === 401 || status === 403 || status === 404 || status === 422 || status === 500);\n}\n","import { resolvePtr } from \"node:dns/promises\";\nimport { API_BASE } from \"~/constants/FtApiBase\";\nimport { FtApiFetchError } from \"~/generic/request/FtApiFetchError\";\nimport { AppTokenData, UserTokenData } from \"~/structures/FtTokenData\";\nimport { OAuth2ClientConfig } from \"~/structures/OAuth2ClientConfig\";\nimport { checkStatus } from \"~/typeguards/checkStatus\";\n\nconst ROUTE = \"/oauth/token\";\n\nfunction appTokenResponseGuard(data: unknown): data is AppTokenData {\n\treturn data !== null && typeof data === \"object\"\n\t\t&& Object.keys(data).length === 6\n\t\t&& \"access_token\" in data && typeof data.access_token === \"string\"\n\t\t&& \"token_type\" in data && typeof data.token_type === \"string\"\n\t\t&& \"expires_in\" in data && typeof data.expires_in === \"number\"\n\t\t&& \"scope\" in data && typeof data.scope === \"string\"\n\t\t&& \"created_at\" in data && typeof data.created_at === \"number\"\n\t\t&& \"secret_valid_until\" in data && typeof data.secret_valid_until === \"number\";\n}\n\nexport async function fetchAppToken(uid: string, secret: string) {\n\tconst body = new URLSearchParams();\n\tbody.append(\"grant_type\", \"client_credentials\");\n\tbody.append(\"client_id\", uid);\n\tbody.append(\"client_secret\", secret);\n\n\tconst options: RequestInit = {\n\t\tmethod: \"POST\",\n\t\tbody\n\t};\n\n\treturn fetch(`${API_BASE}${ROUTE}`, options)\n\t\t.then(async (response) => {\n\t\t\tif (response.ok) {\n\t\t\t\tconst data: unknown = await response.json();\n\t\t\t\tif (appTokenResponseGuard(data)) {\n\t\t\t\t\treturn data as AppTokenData;\n\t\t\t\t}\n\t\t\t\tthrow new Error(ROUTE);\n\t\t\t}\n\t\t\tif (checkStatus(response.status)) {\n\t\t\t\tthrow new FtApiFetchError(response.status);\n\t\t\t}\n\t\t\tthrow new Error(`Unexpected status: ${response.status}`);\n\t\t});\n}\n\nfunction userTokenResponseGuard(data: unknown): data is UserTokenData {\n\treturn data !== null && typeof data === \"object\"\n\t\t&& Object.keys(data).length === 7\n\t\t&& \"access_token\" in data && typeof data.access_token === \"string\"\n\t\t&& \"token_type\" in data && typeof data.token_type === \"string\"\n\t\t&& \"expires_in\" in data && typeof data.expires_in === \"number\"\n\t\t&& \"refresh_token\" in data && typeof data.refresh_token === \"string\"\n\t\t&& \"scope\" in data && typeof data.scope === \"string\"\n\t\t&& \"created_at\" in data && typeof data.created_at === \"number\"\n\t\t&& \"secret_valid_until\" in data && typeof data.secret_valid_until === \"number\";\n}\n\nexport async function fetchUserToken(code: string, config: OAuth2ClientConfig) {\n\tconst body = new URLSearchParams();\n\tbody.append(\"grant_type\", \"authorization_code\");\n\tbody.append(\"code\", code);\n\tbody.append(\"client_id\", config.uid);\n\tbody.append(\"client_secret\", config.secret);\n\tbody.append(\"redirect_uri\", config.redirectURI);\n\tbody.append(\"scope\", \"identify\");\n\n\tconst options: RequestInit = {\n\t\tmethod: \"POST\",\n\t\tbody\n\t};\n\n\treturn fetch(`${API_BASE}${ROUTE}`, options).then(async (response) => {\n\t\tif (response.ok) {\n\t\t\tconst data: unknown = await response.json();\n\t\t\tif (userTokenResponseGuard(data)) {\n\t\t\t\treturn data as UserTokenData;\n\t\t\t}\n\t\t\tthrow new Error(ROUTE);\n\t\t}\n\t\tif (checkStatus(response.status)) {\n\t\t\tthrow new FtApiFetchError(response.status);\n\t\t}\n\t\tthrow new Error(`Unexpected status: ${response.status}`);\n\t});\n}\n\nexport async function fetchRefreshUserToken(refreshToken: string, config: OAuth2ClientConfig) {\n\tconst body = new URLSearchParams();\n\tbody.append(\"grant_type\", \"refresh_token\");\n\tbody.append(\"refresh_token\", refreshToken);\n\tbody.append(\"client_id\", config.uid);\n\tbody.append(\"client_secret\", config.secret);\n\n\tconst options: RequestInit = {\n\t\tmethod: \"POST\",\n\t\tbody\n\t};\n\n\treturn fetch(`${API_BASE}${ROUTE}`, options).then(async (response) => {\n\t\tif (response.ok) {\n\t\t\tconst data: unknown = await response.json();\n\t\t\tif (userTokenResponseGuard(data)) {\n\t\t\t\treturn data as UserTokenData;\n\t\t\t}\n\t\t\tthrow new Error(ROUTE);\n\t\t}\n\t\tif (checkStatus(response.status)) {\n\t\t\tthrow new FtApiFetchError(response.status);\n\t\t}\n\t\tthrow new Error(`Unexpected status: ${response.status}`);\n\t});\n}\n","import { fetchAppToken } from \"~/api/oauth/token\";\nimport { AppTokenData } from \"~/structures/FtTokenData\";\nimport { OAuth2ClientConfig } from \"~/structures/OAuth2ClientConfig\";\n\nexport class AppCredentials {\n\tprivate _tokenData: AppTokenData | null | undefined = undefined;\n\toauthConfig: OAuth2ClientConfig;\n\n\tprivate _refreshPromise: Promise<void> | null = null;\n\n\tconstructor(oauthConfig: OAuth2ClientConfig) {\n\t\tthis.oauthConfig = oauthConfig;\n\t\tthis.requestNewToken();\n\t}\n\n\tprivate get _data(): AppTokenData {\n\t\tif (this._tokenData === undefined) throw new Error(\"Uninitalized token: Cannot access data of uninitialized token\");\n\t\tif (this._tokenData === null) throw new Error(\"Invalid token: Token is invalid, try to get a new one\");\n\t\treturn this._tokenData;\n\t}\n\n\tget token(): string { return this._data.access_token; }\n\tget type(): string { return this._data.token_type; }\n\tget expiresIn(): number { return this._data.expires_in; }\n\tget createdAt(): number { return this._data.created_at; }\n\tget scope(): string { return this._data.scope; }\n\tget secretValidUntil(): number { return this._data.created_at; }\n\tget expiresAt(): number {\n\t\tconst data = this._data;\n\t\treturn data.created_at + data.expires_in;\n\t}\n\n\tasync requestNewToken() {\n\t\tif (this._refreshPromise) return this._refreshPromise;\n\n\t\tthis._refreshPromise = new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst tokenData = await fetchAppToken(this.oauthConfig.uid, this.oauthConfig.secret);\n\t\t\t\tthis._tokenData = tokenData;\n\t\t\t\tresolve();\n\t\t\t} catch (error) {\n\t\t\t\tthis._tokenData = null;\n\t\t\t\treject(error);\n\t\t\t} finally {\n\t\t\t\tthis._refreshPromise = null;\n\t\t\t}\n\t\t});\n\n\t\treturn this._refreshPromise;\n\t}\n\n\tget isValid() {\n\t\treturn Date.now() < this.expiresAt;\n\t}\n\n\tasync ensureTokenValidity() {\n\t\tif (!this._tokenData || !this.isValid)\n\t\t\treturn this.requestNewToken();\n\t}\n\n\tasync getAccessToken() {\n\t\tawait this.ensureTokenValidity();\n\t\treturn this.token;\n\t}\n}\n","import { AppCredentials } from \"./AppCredentials\";\nimport { OAuth2ClientConfig } from \"~/structures/OAuth2ClientConfig\";\n\n/*\nmissing :\nin the method `token` it would be great if a token isn't available, to get another one while its being fetched\na way to refresh every possible token\n\n*/\nexport class AppCredentialsManager {\n\tprotected _appCredentialsList: AppCredentials[];\n\tprotected _activeAppTokenIndex: number = 0;\n\n\tconstructor(configs: OAuth2ClientConfig[]) {\n\t\tthis._appCredentialsList = configs.map((config) => {\n\t\t\treturn new AppCredentials(config);\n\t\t});\n\t}\n\n\tprotected get _current() {\n\t\treturn this._appCredentialsList[this._activeAppTokenIndex];\n\t}\n\n\tprotected _shift(offset: number = 1) {\n\t\tthis._activeAppTokenIndex = (this._activeAppTokenIndex + offset) % this._appCredentialsList.length;\n\t}\n\n\tget credentials() {\n\t\tconst credentials = this._current;\n\t\tthis._shift();\n\t\treturn credentials;\n\t}\n\n\tget oauthConfig() {\n\t\tconst oauthConfig = this._current.oauthConfig;\n\t\tthis._shift();\n\t\treturn oauthConfig;\n\t}\n\n\tget token() {\n\t\tconst token = this._current.token;\n\t\tthis._shift();\n\t\treturn token;\n\t}\n\n\tget isValid() {\n\t\treturn this._current.isValid;\n\t}\n\n\tasync ensureTokenValidity() {\n\t\treturn this._current.ensureTokenValidity();\n\t}\n\n\tasync getAccessToken() {\n\t\tconst currentCredentials = this._current;\n\t\tthis._shift();\n\t\treturn currentCredentials.getAccessToken();\n\t}\n\n\tasync requestNewToken() {\n\t\tthis._current.requestNewToken();\n\t}\n\n\tasync requestNewTokens() {\n\t\tconst promiseList: Promise<void>[] = [];\n\t\tthis._appCredentialsList.forEach((appCredentials) => promiseList.push(appCredentials.requestNewToken()));\n\t\treturn Promise.all(promiseList);\n\t}\n\n\tgetCredentialByUid(uid: string) {\n\t\treturn this._appCredentialsList.find((appCredentials) => appCredentials.oauthConfig.uid === uid);\n\t}\n}\n","import { fetchRefreshUserToken } from \"~/api/oauth/token\";\nimport { UserTokenData } from \"~/structures/FtTokenData\";\nimport { OAuth2ClientConfig } from \"~/structures/OAuth2ClientConfig\";\n\nexport class UserCredential {\n\tprivate _tokenData: UserTokenData | null;\n\toauthConfig: OAuth2ClientConfig;\n\n\tprivate _refreshPromise: Promise<void> | null = null;\n\n\tconstructor(tokenDataInit: UserTokenData, oauthConfig: OAuth2ClientConfig) {\n\t\tthis._tokenData = tokenDataInit;\n\t\tthis.oauthConfig = oauthConfig;\n\t}\n\n\tprivate get _data(): UserTokenData {\n\t\tif (!this._tokenData) throw new Error(\"Invalid token: Token is invalid, try to get a new one\");\n\t\treturn this._tokenData;\n\t}\n\n\tget token(): string { return this._data.access_token; }\n\tget refreshToken(): string { return this._data.refresh_token; }\n\tget type(): string { return this._data.token_type; }\n\tget expiresIn(): number { return this._data.expires_in; }\n\tget createdAt(): number { return this._data.created_at; }\n\tget scope(): string { return this._data.scope; }\n\tget secretValidUntil(): number { return this._data.secret_valid_until; }\n\tget expiresAt(): number {\n\t\tconst data = this._data;\n\t\treturn data.created_at + data.expires_in;\n\t}\n\n\tasync requestNewToken() {\n\t\tif (this._refreshPromise) return this._refreshPromise;\n\n\t\tthis._refreshPromise = new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst tokenData = await fetchRefreshUserToken(this.refreshToken, this.oauthConfig);\n\t\t\t\tthis._tokenData = tokenData;\n\t\t\t\tresolve();\n\t\t\t} catch (error) {\n\t\t\t\tthis._tokenData = null;\n\t\t\t\treject(error);\n\t\t\t} finally {\n\t\t\t\tthis._refreshPromise = null;\n\t\t\t}\n\t\t});\n\n\t\treturn this._refreshPromise;\n\t}\n\n\tget isValid() {\n\t\treturn Date.now() < this.expiresAt;\n\t}\n\n\tasync ensureTokenValidity() {\n\t\tif (!this.isValid)\n\t\t\tawait this.requestNewToken();\n\t}\n\n\tasync getAccessToken() {\n\t\tawait this.ensureTokenValidity();\n\t\treturn this.token;\n\t}\n}\n","import { ApiRoute } from \"~/structures/ApiRoute\";\nimport { API_BASE } from \"~/constants/FtApiBase\";\nimport { Method } from \"~/structures/Method\";\n\nexport class FtHttpClient {\n\tprotected async _createFetchInit(method: Method, options: RequestInit): Promise<RequestInit> {\n\t\treturn {\n\t\t\t...options,\n\t\t\tmethod\n\t\t};\n\t}\n\n\tasync get(route: ApiRoute, options: RequestInit = {}) {\n\t\treturn fetch(API_BASE + route, await this._createFetchInit(\"GET\", options));\n\t}\n\n\tasync post(route: ApiRoute, options: RequestInit) {\n\t\treturn fetch(API_BASE + route, await this._createFetchInit(\"POST\", options));\n\t}\n}\n","import { FtHttpClient } from \"~/generic/class/HttpClient\";\nimport { User } from \"~/user/User\";\nimport { Method } from \"~/structures/Method\";\n\nexport class UserHttpClient extends FtHttpClient {\n\tuser: User;\n\n\tconstructor(user: User) {\n\t\tsuper();\n\t\tthis.user = user;\n\t}\n\n\tprotected async _createFetchInit(method: Method, options: RequestInit): Promise<RequestInit> {\n\t\tconst userToken = await this.user.credentials.getAccessToken();\n\t\tconst headers = new Headers();\n\t\tif (!headers.has(\"Authorization\")) {\n\t\t\theaders.append(\"Authorization\", `Bearer ${userToken}`);\n\t\t}\n\t\treturn {\n\t\t\t...options,\n\t\t\tmethod,\n\t\t\theaders\n\t\t};\n\t}\n}\n","import { FtApiFetchError } from \"~/generic/request/FtApiFetchError\";\nimport { checkStatus } from \"~/typeguards/checkStatus\";\n\nexport async function handleFtApiResponse<T>(route: string, response: Response, mapper: (...args: any[]) => T): Promise<T> {\n\tif (response.ok) {\n\t\tconst data: unknown = await response.json();\n\t\tif (data) {\n\t\t\treturn mapper(data);\n\t\t}\n\t\tthrow new Error(route);\n\t}\n\tif (checkStatus(response.status)) {\n\t\tthrow new FtApiFetchError(response.status);\n\t}\n\tthrow new Error(`Unexpected status: ${response.status}`);\n}\n","export default class FtApiHeaders extends Headers {\n\tconstructor(token: string)\n\tconstructor(headerInit: HeadersInit, token: string)\n\tconstructor(ftApiHeadersInit: HeadersInit | string, token?: string) {\n\t\tif (typeof ftApiHeadersInit === \"string\") {\n\t\t\tsuper();\n\t\t\tthis.append(\"Authorization\", `Bearer ${ftApiHeadersInit}`);\n\t\t} else {\n\t\t\tsuper(ftApiHeadersInit);\n\t\t\tif (token && !this.has(\"Authorization\")) {\n\t\t\t\tthis.append(\"Authorization\", `Bearer ${token}`);\n\t\t\t}\n\t\t}\n\n\t}\n}\n","// import z from \"zod\";\n// import { meSchema } from \"./me.schema\";\nimport { API_BASE } from \"~/constants/FtApiBase\";\nimport { checkStatus } from \"~/typeguards/checkStatus\";\nimport { FtApiFetchError } from \"~/generic/request/FtApiFetchError\";\nimport { handleFtApiResponse } from \"~/generic/request/handleResponse\";\nimport FtApiHeaders from \"~/generic/request/FtHeaders\";\n\nconst ROUTE = \"/v2/me\";\n\nexport async function fetchMe(token: string, options?: RequestInit): Promise<any>/*Promise<z.infer<typeof meSchema>>*/ {\n\tconst headers = new FtApiHeaders(token);\n\n\tconst usedOptions: RequestInit = {\n\t\theaders,\n\t\t...options\n\t};\n\n\treturn fetch(`${API_BASE}${ROUTE}`, usedOptions)\n\t\t.then((response) => handleFtApiResponse(ROUTE, response, (data) => data));\n}\n","import { FtApp } from \"~/app/App\";\nimport { UserCredential } from \"./UserCredential\";\nimport { UserHttpClient } from \"~/app/client/UserHttpClient\";\nimport { fetchMe } from \"~/api/me\";\nimport { OAuth2ClientConfig } from \"~/structures/OAuth2ClientConfig\";\nimport { UserTokenData } from \"~/structures/FtTokenData\";\n\n\nexport class User {\n\tid: number;\n\tftApp: FtApp;\n\tcredentials: UserCredential;\n\thttpClient: UserHttpClient;\n\n\tprivate constructor (ftApp: FtApp, credentials: UserCredential, data: any) {\n\t\tthis.ftApp = ftApp;\n\t\tthis.credentials = credentials;\n\t\tthis.httpClient = new UserHttpClient(this);\n\t\tthis.id = data.id;\n\t}\n\n\tstatic async create(ftApp: FtApp, userTokenData: UserTokenData, oauthConfig: OAuth2ClientConfig) {\n\t\tconst credentials = new UserCredential(userTokenData, oauthConfig);\n\t\tconst data = await fetchMe(await credentials.getAccessToken());\n\t\tif (!data.id) throw new Error(\"No user id after fetch\");\n\t\treturn new User(ftApp, credentials, data);\n\t}\n}\n","import { ServerResponse } from \"http\";\n\nexport function redirectResponse(res: ServerResponse, url: string) {\n\tres.statusCode = 302;\n\tres.setHeader(\"Location\", url);\n\tres.end();\n}\n\nexport function sendRawResponse(res: ServerResponse, code: number, message: string) {\n\tres.statusCode = code;\n\tres.write(message);\n\tres.end();\n}\n","import { User } from \"~/user/User\";\nimport { fetchUserToken } from \"~/api/oauth/token\";\nimport { FtApp } from \"../App\";\nimport { sendRawResponse, redirectResponse } from \"../server/serverResponsesHandler\";\nimport { IncomingMessage, ServerResponse } from \"node:http\";\nimport { AuthenticatedRequest } from \"~/structures/AuthenticatedRequest\";\nimport { UserTokenData } from \"~/structures/FtTokenData\";\nimport { OAuth2ClientConfig } from \"~/structures/OAuth2ClientConfig\";\n\nconst INTRA_OAUTH_URL = \"https://api.intra.42.fr/oauth/authorize\";\n\nexport class UserManager {\n\tusers: User[] = [];\n\tftApp: FtApp;\n\n\tconstructor(ftApp: FtApp) {\n\t\tthis.ftApp = ftApp;\n\t}\n\n\tgetUserById(id: number) {\n\t\treturn this.users.find((user) => user.id === id);\n\t}\n\n\tasync registerUser(userTokenData: UserTokenData, oauthConfig: OAuth2ClientConfig) {\n\t\tconst newUser = await User.create(this.ftApp, userTokenData, oauthConfig);\n\t\tlet user = this.getUserById(newUser.id);\n\t\tif (!user) {\n\t\t\tuser = newUser;\n\t\t}\n\t\tthis.users.push(newUser);\n\t\tthis.ftApp.events.emit(\"userAdd\", newUser);\n\t\treturn newUser;\n\t}\n\n\tauthenticate() {\n\t\treturn (_: IncomingMessage, res: ServerResponse) => {\n\t\t\tconst userConfig = this.ftApp.credentialsManager.oauthConfig;\n\t\t\tconst params = new URLSearchParams();\n\t\t\tparams.append(\"client_id\", userConfig.uid);\n\t\t\tparams.append(\"redirect_uri\", userConfig.redirectURI);\n\t\t\tparams.append(\"response_type\", \"code\");\n\t\t\tparams.append(\"state\", userConfig.uid);\n\n\t\t\tconst url = `${INTRA_OAUTH_URL}?${params.toString()}`;\n\t\t\tres.statusCode = 302;\n\t\t\tres.setHeader(\"Location\", url);\n\t\t\tres.end();\n\t\t};\n\t}\n\n\tcallback({ successPage, errorPage }: { successPage?: string, errorPage?: string } = {}) {\n\t\treturn async (req: IncomingMessage, res: ServerResponse, next?: any) => {\n\t\t\tconst isExpress = typeof next === \"function\";\n\n\t\t\tconst url = new URL(req.url ?? \"\", \"http://localhost:3042\");\n\n\t\t\tconst code = url.searchParams.get(\"code\");\n\t\t\tconst state = url.searchParams.get(\"state\");\n\t\t\tif (!code || !state) {\n\t\t\t\tif (errorPage) {\n\t\t\t\t\treturn redirectResponse(res, errorPage);\n\t\t\t\t}\n\t\t\t\treturn sendRawResponse(res, 400, \"Authentification Error\");\n\t\t\t}\n\n\t\t\tconst appCredentials = this.ftApp.credentialsManager.getCredentialByUid(state);\n\t\t\tif (appCredentials === undefined) {\n\t\t\t\tif (errorPage) {\n\t\t\t\t\treturn redirectResponse(res, errorPage);\n\t\t\t\t}\n\t\t\t\treturn sendRawResponse(res, 400, \"Authentification Error\");\n\t\t\t}\n\t\t\tconst oauthConfig = appCredentials.oauthConfig;\n\n\t\t\ttry {\n\t\t\t\tconst tokenData = await fetchUserToken(code, oauthConfig);\n\t\t\t\t(req as AuthenticatedRequest).user = await this.registerUser(tokenData, oauthConfig);\n\n\t\t\t\tif (isExpress) return next();\n\t\t\t\tif (successPage) {\n\t\t\t\t\treturn redirectResponse(res, successPage);\n\t\t\t\t}\n\t\t\t\treturn sendRawResponse(res, 200, \"Authentification Success\");\n\t\t\t} catch (error: any) {\n\t\t\t\tif (errorPage) {\n\t\t\t\t\tredirectResponse(res, errorPage);\n\t\t\t\t} else {\n\t\t\t\t\tsendRawResponse(res, 500, \"Server Error\");\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t};\n\t}\n}\n","import { FtHttpClient } from \"~/generic/class/HttpClient\";\nimport { FtApp } from \"../App\";\nimport { Method } from \"~/structures/Method\";\n\nexport class AppHttpClient extends FtHttpClient {\n\tftApp: FtApp;\n\n\tconstructor(ftApp: FtApp) {\n\t\tsuper();\n\t\tthis.ftApp = ftApp;\n\t}\n\n\tprotected async _createFetchInit(method: Method, options: RequestInit): Promise<RequestInit> {\n\t\tconst appToken = await this.ftApp.credentialsManager.getAccessToken();\n\t\tconst headers = new Headers();\n\t\theaders.append(\"Authorization\", `Bearer ${appToken}`);\n\n\t\treturn {\n\t\t\t...options,\n\t\t\tmethod,\n\t\t\theaders\n\t\t};\n\t}\n}\n","import { AppCredentialsManager } from \"./TokenManager/AppCredentialsManager\";\nimport { UserManager } from \"./UserManager/UserManager\";\nimport { OAuth2ClientConfig } from \"~/structures/OAuth2ClientConfig\";\nimport EventEmitter from \"events\";\nimport { FtEvent } from \"~/structures/Events\";\nimport { AppHttpClient } from \"./client/AppHttpClient\";\n\nexport type OAuth2ServerOptions = {\n\thostname?: string,\n\tport?: number,\n\tloginRoute?: string,\n\tcallbackRoute?: string,\n\tsuccessPage?: string | null,\n\terrorPage?: string | null\n}\n\nexport class FtApp {\n\tcredentialsManager: AppCredentialsManager;\n\tuserManager: UserManager;\n\thttpClient: AppHttpClient;\n\tevents: EventEmitter<FtEvent>;\n\n\tconstructor(configs: OAuth2ClientConfig[]) {\n\t\tthis.credentialsManager = new AppCredentialsManager(configs);\n\t\tthis.userManager = new UserManager(this);\n\t\tthis.httpClient = new AppHttpClient(this);\n\t\tthis.events = new EventEmitter<FtEvent>();\n\t}\n}\n","import { IncomingMessage } from \"node:http\";\nimport { User } from \"~/user/User\";\n\nexport class AuthenticatedRequest extends IncomingMessage {\n\tuser?: User;\n}\n"]}