@krainovsd/js-helpers 0.19.0-beta.1 → 0.19.0-beta.10

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,12 +1,13 @@
1
1
  const RESPONSE_DATA_SYMBOL = Symbol("response data");
2
2
  const REQUEST_ERROR = {
3
- HTTP_ERROR: "http",
4
- NETWORK_ERROR: "network",
5
- TIMEOUT_ERROR: "timeout",
6
- ABORT_ERROR: "abort",
7
- VALIDATION_ERROR: "validation",
8
- CACHE_ERROR: "cache",
9
- UNKNOWN_ERROR: "unknown",
3
+ Http: "http",
4
+ Network: "network",
5
+ Timeout: "timeout",
6
+ Abort: "abort",
7
+ Validation: "validation",
8
+ Cache: "cache",
9
+ Unknown: "unknown",
10
+ Disabled: "disabled",
10
11
  };
11
12
  class OauthState {
12
13
  _fetching = false;
@@ -1 +1 @@
1
- {"version":3,"file":"api.constants.js","sources":["../../../src/api/api.constants.ts"],"sourcesContent":["export const RESPONSE_DATA_SYMBOL = Symbol(\"response data\");\nexport const REQUEST_ERROR = {\n HTTP_ERROR: \"http\",\n NETWORK_ERROR: \"network\",\n TIMEOUT_ERROR: \"timeout\",\n ABORT_ERROR: \"abort\",\n VALIDATION_ERROR: \"validation\",\n CACHE_ERROR: \"cache\",\n UNKNOWN_ERROR: \"unknown\",\n} as const;\n\nclass OauthState {\n private _fetching: boolean = false;\n\n get fetching() {\n return this._fetching;\n }\n\n set fetching(value: boolean) {\n this._fetching = value;\n }\n}\nexport const OAUTH_STATE = new OauthState();\nexport const OAUTH_TOKEN_STORAGE_NAME = \"session_token\";\nexport const OAUTH_TOKEN_EXPIRES_STORAGE_NAME = \"session_token_expires\";\nexport const OAUTH_REFRESH_QUERY = \"only_session_refresh\";\nexport const OAUTH_ERROR_PAGE_URL = \"/error\";\nexport const OAUTH_CLEAR_PAGE_URL = \"/clear\";\nexport const OAUTH_LOGOUT_PAGE_URL = \"/logout\";\n"],"names":[],"mappings":"MAAa,oBAAoB,GAAG,MAAM,CAAC,eAAe;AAC7C,MAAA,aAAa,GAAG;AAC3B,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,aAAa,EAAE,SAAS;AACxB,IAAA,aAAa,EAAE,SAAS;AACxB,IAAA,WAAW,EAAE,OAAO;AACpB,IAAA,gBAAgB,EAAE,YAAY;AAC9B,IAAA,WAAW,EAAE,OAAO;AACpB,IAAA,aAAa,EAAE,SAAS;;AAG1B,MAAM,UAAU,CAAA;IACN,SAAS,GAAY,KAAK;AAElC,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;;IAGvB,IAAI,QAAQ,CAAC,KAAc,EAAA;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;;AAEzB;AACY,MAAA,WAAW,GAAG,IAAI,UAAU;AAClC,MAAM,wBAAwB,GAAG;AACjC,MAAM,gCAAgC,GAAG;AACzC,MAAM,mBAAmB,GAAG;AAC5B,MAAM,oBAAoB,GAAG;AAC7B,MAAM,oBAAoB,GAAG;AAC7B,MAAM,qBAAqB,GAAG;;;;"}
1
+ {"version":3,"file":"api.constants.js","sources":["../../../src/api/api.constants.ts"],"sourcesContent":["export const RESPONSE_DATA_SYMBOL = Symbol(\"response data\");\nexport const REQUEST_ERROR = {\n Http: \"http\",\n Network: \"network\",\n Timeout: \"timeout\",\n Abort: \"abort\",\n Validation: \"validation\",\n Cache: \"cache\",\n Unknown: \"unknown\",\n Disabled: \"disabled\",\n} as const;\n\nclass OauthState {\n private _fetching: boolean = false;\n\n get fetching() {\n return this._fetching;\n }\n\n set fetching(value: boolean) {\n this._fetching = value;\n }\n}\nexport const OAUTH_STATE = new OauthState();\nexport const OAUTH_TOKEN_STORAGE_NAME = \"session_token\";\nexport const OAUTH_TOKEN_EXPIRES_STORAGE_NAME = \"session_token_expires\";\nexport const OAUTH_REFRESH_QUERY = \"only_session_refresh\";\nexport const OAUTH_ERROR_PAGE_URL = \"/error\";\nexport const OAUTH_CLEAR_PAGE_URL = \"/clear\";\nexport const OAUTH_LOGOUT_PAGE_URL = \"/logout\";\n"],"names":[],"mappings":"MAAa,oBAAoB,GAAG,MAAM,CAAC,eAAe;AAC7C,MAAA,aAAa,GAAG;AAC3B,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,UAAU,EAAE,YAAY;AACxB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,QAAQ,EAAE,UAAU;;AAGtB,MAAM,UAAU,CAAA;IACN,SAAS,GAAY,KAAK;AAElC,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;;IAGvB,IAAI,QAAQ,CAAC,KAAc,EAAA;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;;AAEzB;AACY,MAAA,WAAW,GAAG,IAAI,UAAU;AAClC,MAAM,wBAAwB,GAAG;AACjC,MAAM,gCAAgC,GAAG;AACzC,MAAM,mBAAmB,GAAG;AAC5B,MAAM,oBAAoB,GAAG;AAC7B,MAAM,oBAAoB,GAAG;AAC7B,MAAM,qBAAqB,GAAG;;;;"}
@@ -17,6 +17,7 @@ function createFetchClient(options) {
17
17
  let retries = options.retries;
18
18
  let timeout = options.timeout;
19
19
  let refetchAfterAuthGlobal = options.refetchAfterAuth;
20
+ let enabled = options.enabled ?? true;
20
21
  function recreate(options) {
21
22
  if ("client" in options) {
22
23
  client = options.client;
@@ -36,8 +37,18 @@ function createFetchClient(options) {
36
37
  if ("refetchAfterAuth" in options) {
37
38
  refetchAfterAuthGlobal = options.refetchAfterAuth;
38
39
  }
40
+ if ("enabled" in options) {
41
+ enabled = options.enabled ?? true;
42
+ }
39
43
  }
40
44
  async function handleRequest(request) {
45
+ if (!enabled) {
46
+ return {
47
+ response: null,
48
+ data: new ResponseError({ message: "requests disabled", status: 0 }),
49
+ error: REQUEST_ERROR.Disabled,
50
+ };
51
+ }
41
52
  const timeoutController = new AbortController();
42
53
  const requestController = new AbortController();
43
54
  const requestTimeout = request.timeout ?? timeout;
@@ -146,12 +157,12 @@ function createFetchClient(options) {
146
157
  if (!response.ok) {
147
158
  if (response.status === 304) {
148
159
  const error = new ResponseError({
149
- message: REQUEST_ERROR.CACHE_ERROR,
160
+ message: REQUEST_ERROR.Cache,
150
161
  status: response.status,
151
162
  headers: Object.fromEntries(response.headers.entries()),
152
163
  });
153
- request.onError?.(REQUEST_ERROR.CACHE_ERROR, error);
154
- return { data: error, error: REQUEST_ERROR.CACHE_ERROR, response };
164
+ request.onError?.(REQUEST_ERROR.Cache, error);
165
+ return { data: error, error: REQUEST_ERROR.Cache, response };
155
166
  }
156
167
  /** if you need observe other than only 401 status, you can override some statuses in after handler middleware to 401 */
157
168
  if (response.status === 401 && refetchAfterAuth) {
@@ -194,14 +205,14 @@ function createFetchClient(options) {
194
205
  catch { }
195
206
  const error = new ResponseError({
196
207
  status: response.status,
197
- message: REQUEST_ERROR.HTTP_ERROR,
208
+ message: REQUEST_ERROR.Http,
198
209
  description: result,
199
210
  headers: Object.fromEntries(response.headers.entries()),
200
211
  });
201
- request.onError?.(REQUEST_ERROR.HTTP_ERROR, error);
212
+ request.onError?.(REQUEST_ERROR.Http, error);
202
213
  return {
203
214
  data: error,
204
- error: REQUEST_ERROR.HTTP_ERROR,
215
+ error: REQUEST_ERROR.Http,
205
216
  response,
206
217
  };
207
218
  }
@@ -270,36 +281,36 @@ function createFetchClient(options) {
270
281
  }
271
282
  if (err instanceof TypeError) {
272
283
  const error = new ResponseError({
273
- message: REQUEST_ERROR.NETWORK_ERROR,
284
+ message: REQUEST_ERROR.Network,
274
285
  status: 0,
275
286
  description: String(err.message),
276
287
  });
277
- request.onError?.(REQUEST_ERROR.NETWORK_ERROR, error);
278
- return { data: error, error: REQUEST_ERROR.NETWORK_ERROR, response: null };
288
+ request.onError?.(REQUEST_ERROR.Network, error);
289
+ return { data: error, error: REQUEST_ERROR.Network, response: null };
279
290
  }
280
291
  if (err instanceof Error && err.name === "AbortError") {
281
292
  if (timeoutController.signal.aborted) {
282
293
  const error = new ResponseError({
283
- message: REQUEST_ERROR.TIMEOUT_ERROR,
294
+ message: REQUEST_ERROR.Timeout,
284
295
  status: 0,
285
296
  });
286
- request.onError?.(REQUEST_ERROR.TIMEOUT_ERROR, error);
287
- return { data: error, error: REQUEST_ERROR.TIMEOUT_ERROR, response: null };
297
+ request.onError?.(REQUEST_ERROR.Timeout, error);
298
+ return { data: error, error: REQUEST_ERROR.Timeout, response: null };
288
299
  }
289
300
  const error = new ResponseError({
290
- message: REQUEST_ERROR.ABORT_ERROR,
301
+ message: REQUEST_ERROR.Abort,
291
302
  status: 0,
292
303
  });
293
- request.onError?.(REQUEST_ERROR.ABORT_ERROR, error);
294
- return { data: error, error: REQUEST_ERROR.ABORT_ERROR, response: null };
304
+ request.onError?.(REQUEST_ERROR.Abort, error);
305
+ return { data: error, error: REQUEST_ERROR.Abort, response: null };
295
306
  }
296
307
  const error = new ResponseError({
297
- message: REQUEST_ERROR.UNKNOWN_ERROR,
308
+ message: REQUEST_ERROR.Unknown,
298
309
  status: 0,
299
310
  description: String(err),
300
311
  });
301
- request.onError?.(REQUEST_ERROR.UNKNOWN_ERROR, error);
302
- return { data: error, error: REQUEST_ERROR.UNKNOWN_ERROR, response: null };
312
+ request.onError?.(REQUEST_ERROR.Unknown, error);
313
+ return { data: error, error: REQUEST_ERROR.Unknown, response: null };
303
314
  }
304
315
  finally {
305
316
  requestController.abort();
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sources":["../../../src/api/api.ts"],"sourcesContent":["import type {\n HeadersInit,\n BodyInit as NodeBodyInit,\n RequestInfo as NodeRequestInfo,\n RequestInit as NodeRequestInit,\n Response as NodeResponse,\n} from \"node-fetch\";\nimport { IS_BROWSER, ResponseError } from \"../constants\";\nimport { createURLWithQueries, downloadFile, isArray, isString, wait } from \"../lib\";\nimport { REQUEST_ERROR, RESPONSE_DATA_SYMBOL } from \"./api.constants\";\nimport type {\n AfterHandler,\n BeforeHandler,\n CreateRequestClientInstance,\n RefetchAfterAuthFn,\n RequestError,\n RequestInterface,\n} from \"./api.types\";\n\nexport function createFetchClient(options: CreateRequestClientInstance) {\n let client:\n | ((url: URL | NodeRequestInfo, init?: NodeRequestInit) => Promise<NodeResponse>)\n | typeof fetch = options.client;\n let beforeHandlers: BeforeHandler[] | undefined = options.beforeHandlers;\n let afterHandlers: AfterHandler[] | undefined = options.afterHandlers;\n let retries: number[] | undefined = options.retries;\n let timeout: number | undefined = options.timeout;\n let refetchAfterAuthGlobal: RefetchAfterAuthFn | undefined = options.refetchAfterAuth;\n\n function recreate(options: CreateRequestClientInstance) {\n if (\"client\" in options) {\n client = options.client;\n }\n if (\"beforeHandlers\" in options) {\n beforeHandlers = options.beforeHandlers;\n }\n if (\"afterHandlers\" in options) {\n afterHandlers = options.afterHandlers;\n }\n if (\"retries\" in options) {\n retries = options.retries;\n }\n if (\"timeout\" in options) {\n timeout = options.timeout;\n }\n if (\"refetchAfterAuth\" in options) {\n refetchAfterAuthGlobal = options.refetchAfterAuth;\n }\n }\n\n async function handleRequest<\n IncomingApi = unknown,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<\n | {\n data: ResponseError;\n error: RequestError;\n response: Response | NodeResponse | null;\n }\n | { data: Incoming; error: null; response: Response | NodeResponse | null }\n > {\n const timeoutController = new AbortController();\n const requestController = new AbortController();\n const requestTimeout = request.timeout ?? timeout;\n const requestRetries = request.retries ?? retries;\n\n try {\n if (request.delay) {\n await wait(request.delay);\n }\n if (request.mock) {\n const mock: unknown =\n typeof request.mock === \"function\" ? (request.mock as () => Incoming)() : request.mock;\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(mock as IncomingApi)\n : (mock as Incoming);\n\n return { data: transformedResult, error: null, response: null };\n }\n\n if (requestTimeout != undefined && requestTimeout != 0) {\n setTimeout(() => {\n if (requestController.signal.aborted) return;\n timeoutController.abort();\n }, requestTimeout);\n timeoutController.signal.addEventListener(\"abort\", () => requestController.abort(), {\n once: true,\n signal: requestController.signal,\n });\n }\n if (request.signal) {\n request.signal.addEventListener(\"abort\", () => requestController.abort(), {\n once: true,\n signal: requestController.signal,\n });\n }\n\n {\n let handlers: BeforeHandler[] = [];\n if (request.beforeHandlers) {\n handlers = request.beforeHandlers;\n } else if (beforeHandlers) {\n handlers = beforeHandlers;\n }\n if (request.additionalBeforeHandlers) {\n handlers = handlers.concat(request.additionalBeforeHandlers);\n }\n\n if (handlers.length > 0) {\n await executeBeforeHandlers(handlers, request);\n }\n }\n\n const { method, body, path, queries, headers = {} } = request;\n let refetchAfterAuth: RefetchAfterAuthFn | undefined = refetchAfterAuthGlobal;\n if (\"refetchAfterAuth\" in request) {\n refetchAfterAuth = request.refetchAfterAuth;\n }\n\n const url = createURLWithQueries({ baseURL: path, params: queries });\n let [, requestContentType] =\n Object.entries(headers).find(([header]) => header.toLowerCase() === \"content-type\") ?? [];\n if (isArray(requestContentType)) {\n requestContentType = requestContentType[0];\n }\n\n let preparedBody: OutcomingApi = body as OutcomingApi;\n if (request.transformOutcomingData) {\n preparedBody = request.transformOutcomingData(body as Outcoming);\n }\n\n if (\n requestContentType == undefined &&\n !(preparedBody instanceof FormData) &&\n preparedBody !== undefined &&\n !isString(preparedBody)\n ) {\n headers[\"content-type\"] = \"application/json; charset=UTF-8\";\n }\n\n if (\n ((requestContentType == undefined && !isString(preparedBody)) ||\n requestContentType?.toLowerCase()?.includes(\"json\")) &&\n preparedBody !== undefined &&\n !(preparedBody instanceof FormData)\n ) {\n preparedBody = JSON.stringify(preparedBody) as OutcomingApi;\n }\n const response: Response | NodeResponse | undefined = await client(url, {\n method,\n body: preparedBody as ((BodyInit | null) & NodeBodyInit) | undefined,\n headers: headers as globalThis.HeadersInit & HeadersInit,\n signal: requestController.signal as\n | (AbortSignal & NodeRequestInit[\"signal\"])\n | null\n | undefined,\n cache: request.cache,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n priority: request.priority,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n compress: request.compress,\n follow: request.follow,\n });\n\n {\n let handlers: AfterHandler[] = [];\n if (request.afterHandlers) {\n handlers = request.afterHandlers;\n } else if (afterHandlers) {\n handlers = afterHandlers;\n }\n if (request.additionalAfterHandlers) {\n handlers = handlers.concat(request.additionalAfterHandlers);\n }\n\n if (handlers.length > 0) {\n await executeAfterHandlers(handlers, request, response);\n }\n }\n\n if (!response.ok) {\n if (response.status === 304) {\n const error = new ResponseError({\n message: REQUEST_ERROR.CACHE_ERROR,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n });\n request.onError?.(REQUEST_ERROR.CACHE_ERROR, error);\n\n return { data: error, error: REQUEST_ERROR.CACHE_ERROR, response };\n }\n /** if you need observe other than only 401 status, you can override some statuses in after handler middleware to 401 */\n if (response.status === 401 && refetchAfterAuth) {\n const newRequest = await refetchAfterAuth(request);\n\n return await handleRequest({ ...newRequest, refetchAfterAuth: false });\n }\n\n if (request.defaultResponse) {\n const defaultResponse: unknown =\n typeof request.defaultResponse === \"function\"\n ? (request.defaultResponse as () => Incoming)()\n : request.defaultResponse;\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(defaultResponse as IncomingApi)\n : (defaultResponse as Incoming);\n\n return {\n data: transformedResult,\n error: null,\n response: null,\n };\n }\n if (requestRetries && requestRetries.length > 0) {\n await wait(requestRetries[0]);\n\n return await handleRequest({ ...request, retries: requestRetries.slice(1) });\n }\n\n let result;\n try {\n const contentType = response.headers.get(\"content-type\");\n\n if (RESPONSE_DATA_SYMBOL in response) {\n result = response[RESPONSE_DATA_SYMBOL];\n } else if (contentType?.includes?.(\"text\")) {\n result = await response.text();\n } else if (contentType?.includes?.(\"json\")) {\n result = await response.json();\n } else {\n result = await response.blob();\n }\n } catch {}\n\n const error = new ResponseError({\n status: response.status,\n message: REQUEST_ERROR.HTTP_ERROR,\n description: result,\n headers: Object.fromEntries(response.headers.entries()),\n });\n request.onError?.(REQUEST_ERROR.HTTP_ERROR, error);\n\n return {\n data: error,\n error: REQUEST_ERROR.HTTP_ERROR,\n response,\n };\n }\n\n if (request.download) {\n const data = await response.blob();\n const mimeType = response.headers.get(\"content-type\");\n const fileName = response.headers.get(\"content-disposition\");\n\n if (!mimeType) {\n console.warn(\"couldn't download file because content-type header is not exist\");\n } else if (!fileName) {\n console.warn(\"couldn't download file because content-disposition header is not exist\");\n }\n\n if (IS_BROWSER && mimeType && fileName)\n downloadFile({\n data: data as Blob,\n fileName,\n mimeType,\n });\n\n return {\n data: data as Incoming,\n error: null,\n response,\n };\n }\n\n const contentType = response.headers.get(\"content-type\");\n let result: Incoming | IncomingApi = undefined as Incoming | IncomingApi;\n\n if (RESPONSE_DATA_SYMBOL in response) {\n result = response[RESPONSE_DATA_SYMBOL] as Incoming | IncomingApi;\n } else if (contentType?.includes?.(\"text\")) {\n result = (await response.text()) as Incoming | IncomingApi;\n } else if (contentType?.includes?.(\"json\")) {\n result = (await response.json()) as Incoming | IncomingApi;\n } else {\n result = (await response.blob()) as Incoming | IncomingApi;\n }\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(result as IncomingApi)\n : (result as Incoming);\n\n return {\n data: transformedResult,\n error: null,\n response,\n };\n } catch (err: unknown) {\n if (request.defaultResponse) {\n const defaultResponse: unknown =\n typeof request.defaultResponse === \"function\"\n ? (request.defaultResponse as () => Incoming)()\n : request.defaultResponse;\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(defaultResponse as IncomingApi)\n : (defaultResponse as Incoming);\n\n return {\n data: transformedResult,\n error: null,\n response: null,\n };\n }\n if (requestRetries && requestRetries.length > 0 && request?.signal?.aborted !== true) {\n await wait(requestRetries[0]);\n\n return await handleRequest({ ...request, retries: requestRetries.slice(1) });\n }\n\n if (err instanceof TypeError) {\n const error = new ResponseError({\n message: REQUEST_ERROR.NETWORK_ERROR,\n status: 0,\n description: String(err.message),\n });\n request.onError?.(REQUEST_ERROR.NETWORK_ERROR, error);\n\n return { data: error, error: REQUEST_ERROR.NETWORK_ERROR, response: null };\n }\n\n if (err instanceof Error && err.name === \"AbortError\") {\n if (timeoutController.signal.aborted) {\n const error = new ResponseError({\n message: REQUEST_ERROR.TIMEOUT_ERROR,\n status: 0,\n });\n request.onError?.(REQUEST_ERROR.TIMEOUT_ERROR, error);\n\n return { data: error, error: REQUEST_ERROR.TIMEOUT_ERROR, response: null };\n }\n\n const error = new ResponseError({\n message: REQUEST_ERROR.ABORT_ERROR,\n status: 0,\n });\n request.onError?.(REQUEST_ERROR.ABORT_ERROR, error);\n\n return { data: error, error: REQUEST_ERROR.ABORT_ERROR, response: null };\n }\n\n const error = new ResponseError({\n message: REQUEST_ERROR.UNKNOWN_ERROR,\n status: 0,\n description: String(err),\n });\n request.onError?.(REQUEST_ERROR.UNKNOWN_ERROR, error);\n\n return { data: error, error: REQUEST_ERROR.UNKNOWN_ERROR, response: null };\n } finally {\n requestController.abort();\n }\n }\n\n async function requestWithArrayResponse<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<\n | [ResponseError, RequestError, Response | NodeResponse | null]\n | [Incoming, null, Response | NodeResponse | null]\n > {\n const response = await handleRequest(request);\n\n return [response.data, response.error, response.response] as\n | [ResponseError, RequestError, Response | NodeResponse | null]\n | [Incoming, null, Response | NodeResponse | null];\n }\n\n async function requestWithObjectResponse<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<\n | {\n data: ResponseError;\n error: RequestError;\n response: Response | NodeResponse | null;\n }\n | { data: Incoming; error: null; response: Response | NodeResponse | null }\n > {\n return handleRequest(request);\n }\n\n return {\n requestWithArrayResponse,\n requestWithObjectResponse,\n recreate,\n };\n}\n\nfunction executeBeforeHandlers<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n>(\n handlers: BeforeHandler[],\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n) {\n return new Promise((resolve) => {\n void (async () => {\n for (const handler of handlers) {\n await handler(request);\n }\n\n resolve(1);\n })();\n });\n}\n\nfunction executeAfterHandlers<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n>(\n handlers: AfterHandler[],\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n response: Response | NodeResponse | undefined,\n) {\n return new Promise((resolve) => {\n void (async () => {\n for (const handler of handlers) {\n await handler(request, response);\n }\n\n resolve(1);\n })();\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sources":["../../../src/api/api.ts"],"sourcesContent":["import type {\n HeadersInit,\n BodyInit as NodeBodyInit,\n RequestInfo as NodeRequestInfo,\n RequestInit as NodeRequestInit,\n Response as NodeResponse,\n} from \"node-fetch\";\nimport { IS_BROWSER, ResponseError } from \"../constants\";\nimport { createURLWithQueries, downloadFile, isArray, isString, wait } from \"../lib\";\nimport { REQUEST_ERROR, RESPONSE_DATA_SYMBOL } from \"./api.constants\";\nimport type {\n AfterHandler,\n BeforeHandler,\n CreateRequestClientInstance,\n RefetchAfterAuthFn,\n RequestError,\n RequestInterface,\n} from \"./api.types\";\n\nexport function createFetchClient(options: CreateRequestClientInstance) {\n let client:\n | ((url: URL | NodeRequestInfo, init?: NodeRequestInit) => Promise<NodeResponse>)\n | typeof fetch = options.client;\n let beforeHandlers: BeforeHandler[] | undefined = options.beforeHandlers;\n let afterHandlers: AfterHandler[] | undefined = options.afterHandlers;\n let retries: number[] | undefined = options.retries;\n let timeout: number | undefined = options.timeout;\n let refetchAfterAuthGlobal: RefetchAfterAuthFn | undefined = options.refetchAfterAuth;\n let enabled: boolean = options.enabled ?? true;\n\n function recreate(options: CreateRequestClientInstance) {\n if (\"client\" in options) {\n client = options.client;\n }\n if (\"beforeHandlers\" in options) {\n beforeHandlers = options.beforeHandlers;\n }\n if (\"afterHandlers\" in options) {\n afterHandlers = options.afterHandlers;\n }\n if (\"retries\" in options) {\n retries = options.retries;\n }\n if (\"timeout\" in options) {\n timeout = options.timeout;\n }\n if (\"refetchAfterAuth\" in options) {\n refetchAfterAuthGlobal = options.refetchAfterAuth;\n }\n if (\"enabled\" in options) {\n enabled = options.enabled ?? true;\n }\n }\n\n async function handleRequest<\n IncomingApi = unknown,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<\n | {\n data: ResponseError;\n error: RequestError;\n response: Response | NodeResponse | null;\n }\n | { data: Incoming; error: null; response: Response | NodeResponse | null }\n > {\n if (!enabled) {\n return {\n response: null,\n data: new ResponseError({ message: \"requests disabled\", status: 0 }),\n error: REQUEST_ERROR.Disabled,\n };\n }\n\n const timeoutController = new AbortController();\n const requestController = new AbortController();\n const requestTimeout = request.timeout ?? timeout;\n const requestRetries = request.retries ?? retries;\n\n try {\n if (request.delay) {\n await wait(request.delay);\n }\n if (request.mock) {\n const mock: unknown =\n typeof request.mock === \"function\" ? (request.mock as () => Incoming)() : request.mock;\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(mock as IncomingApi)\n : (mock as Incoming);\n\n return { data: transformedResult, error: null, response: null };\n }\n\n if (requestTimeout != undefined && requestTimeout != 0) {\n setTimeout(() => {\n if (requestController.signal.aborted) return;\n timeoutController.abort();\n }, requestTimeout);\n timeoutController.signal.addEventListener(\"abort\", () => requestController.abort(), {\n once: true,\n signal: requestController.signal,\n });\n }\n if (request.signal) {\n request.signal.addEventListener(\"abort\", () => requestController.abort(), {\n once: true,\n signal: requestController.signal,\n });\n }\n\n {\n let handlers: BeforeHandler[] = [];\n if (request.beforeHandlers) {\n handlers = request.beforeHandlers;\n } else if (beforeHandlers) {\n handlers = beforeHandlers;\n }\n if (request.additionalBeforeHandlers) {\n handlers = handlers.concat(request.additionalBeforeHandlers);\n }\n\n if (handlers.length > 0) {\n await executeBeforeHandlers(handlers, request);\n }\n }\n\n const { method, body, path, queries, headers = {} } = request;\n let refetchAfterAuth: RefetchAfterAuthFn | undefined = refetchAfterAuthGlobal;\n if (\"refetchAfterAuth\" in request) {\n refetchAfterAuth = request.refetchAfterAuth;\n }\n\n const url = createURLWithQueries({ baseURL: path, params: queries });\n let [, requestContentType] =\n Object.entries(headers).find(([header]) => header.toLowerCase() === \"content-type\") ?? [];\n if (isArray(requestContentType)) {\n requestContentType = requestContentType[0];\n }\n\n let preparedBody: OutcomingApi = body as OutcomingApi;\n if (request.transformOutcomingData) {\n preparedBody = request.transformOutcomingData(body as Outcoming);\n }\n\n if (\n requestContentType == undefined &&\n !(preparedBody instanceof FormData) &&\n preparedBody !== undefined &&\n !isString(preparedBody)\n ) {\n headers[\"content-type\"] = \"application/json; charset=UTF-8\";\n }\n\n if (\n ((requestContentType == undefined && !isString(preparedBody)) ||\n requestContentType?.toLowerCase()?.includes(\"json\")) &&\n preparedBody !== undefined &&\n !(preparedBody instanceof FormData)\n ) {\n preparedBody = JSON.stringify(preparedBody) as OutcomingApi;\n }\n const response: Response | NodeResponse | undefined = await client(url, {\n method,\n body: preparedBody as ((BodyInit | null) & NodeBodyInit) | undefined,\n headers: headers as globalThis.HeadersInit & HeadersInit,\n signal: requestController.signal as\n | (AbortSignal & NodeRequestInit[\"signal\"])\n | null\n | undefined,\n cache: request.cache,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n priority: request.priority,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n compress: request.compress,\n follow: request.follow,\n });\n\n {\n let handlers: AfterHandler[] = [];\n if (request.afterHandlers) {\n handlers = request.afterHandlers;\n } else if (afterHandlers) {\n handlers = afterHandlers;\n }\n if (request.additionalAfterHandlers) {\n handlers = handlers.concat(request.additionalAfterHandlers);\n }\n\n if (handlers.length > 0) {\n await executeAfterHandlers(handlers, request, response);\n }\n }\n\n if (!response.ok) {\n if (response.status === 304) {\n const error = new ResponseError({\n message: REQUEST_ERROR.Cache,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n });\n request.onError?.(REQUEST_ERROR.Cache, error);\n\n return { data: error, error: REQUEST_ERROR.Cache, response };\n }\n /** if you need observe other than only 401 status, you can override some statuses in after handler middleware to 401 */\n if (response.status === 401 && refetchAfterAuth) {\n const newRequest = await refetchAfterAuth(request);\n\n return await handleRequest({ ...newRequest, refetchAfterAuth: false });\n }\n\n if (request.defaultResponse) {\n const defaultResponse: unknown =\n typeof request.defaultResponse === \"function\"\n ? (request.defaultResponse as () => Incoming)()\n : request.defaultResponse;\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(defaultResponse as IncomingApi)\n : (defaultResponse as Incoming);\n\n return {\n data: transformedResult,\n error: null,\n response: null,\n };\n }\n if (requestRetries && requestRetries.length > 0) {\n await wait(requestRetries[0]);\n\n return await handleRequest({ ...request, retries: requestRetries.slice(1) });\n }\n\n let result;\n try {\n const contentType = response.headers.get(\"content-type\");\n\n if (RESPONSE_DATA_SYMBOL in response) {\n result = response[RESPONSE_DATA_SYMBOL];\n } else if (contentType?.includes?.(\"text\")) {\n result = await response.text();\n } else if (contentType?.includes?.(\"json\")) {\n result = await response.json();\n } else {\n result = await response.blob();\n }\n } catch {}\n\n const error = new ResponseError({\n status: response.status,\n message: REQUEST_ERROR.Http,\n description: result,\n headers: Object.fromEntries(response.headers.entries()),\n });\n request.onError?.(REQUEST_ERROR.Http, error);\n\n return {\n data: error,\n error: REQUEST_ERROR.Http,\n response,\n };\n }\n\n if (request.download) {\n const data = await response.blob();\n const mimeType = response.headers.get(\"content-type\");\n const fileName = response.headers.get(\"content-disposition\");\n\n if (!mimeType) {\n console.warn(\"couldn't download file because content-type header is not exist\");\n } else if (!fileName) {\n console.warn(\"couldn't download file because content-disposition header is not exist\");\n }\n\n if (IS_BROWSER && mimeType && fileName)\n downloadFile({\n data: data as Blob,\n fileName,\n mimeType,\n });\n\n return {\n data: data as Incoming,\n error: null,\n response,\n };\n }\n\n const contentType = response.headers.get(\"content-type\");\n let result: Incoming | IncomingApi = undefined as Incoming | IncomingApi;\n\n if (RESPONSE_DATA_SYMBOL in response) {\n result = response[RESPONSE_DATA_SYMBOL] as Incoming | IncomingApi;\n } else if (contentType?.includes?.(\"text\")) {\n result = (await response.text()) as Incoming | IncomingApi;\n } else if (contentType?.includes?.(\"json\")) {\n result = (await response.json()) as Incoming | IncomingApi;\n } else {\n result = (await response.blob()) as Incoming | IncomingApi;\n }\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(result as IncomingApi)\n : (result as Incoming);\n\n return {\n data: transformedResult,\n error: null,\n response,\n };\n } catch (err: unknown) {\n if (request.defaultResponse) {\n const defaultResponse: unknown =\n typeof request.defaultResponse === \"function\"\n ? (request.defaultResponse as () => Incoming)()\n : request.defaultResponse;\n\n const transformedResult = request.transformIncomingData\n ? request.transformIncomingData(defaultResponse as IncomingApi)\n : (defaultResponse as Incoming);\n\n return {\n data: transformedResult,\n error: null,\n response: null,\n };\n }\n if (requestRetries && requestRetries.length > 0 && request?.signal?.aborted !== true) {\n await wait(requestRetries[0]);\n\n return await handleRequest({ ...request, retries: requestRetries.slice(1) });\n }\n\n if (err instanceof TypeError) {\n const error = new ResponseError({\n message: REQUEST_ERROR.Network,\n status: 0,\n description: String(err.message),\n });\n request.onError?.(REQUEST_ERROR.Network, error);\n\n return { data: error, error: REQUEST_ERROR.Network, response: null };\n }\n\n if (err instanceof Error && err.name === \"AbortError\") {\n if (timeoutController.signal.aborted) {\n const error = new ResponseError({\n message: REQUEST_ERROR.Timeout,\n status: 0,\n });\n request.onError?.(REQUEST_ERROR.Timeout, error);\n\n return { data: error, error: REQUEST_ERROR.Timeout, response: null };\n }\n\n const error = new ResponseError({\n message: REQUEST_ERROR.Abort,\n status: 0,\n });\n request.onError?.(REQUEST_ERROR.Abort, error);\n\n return { data: error, error: REQUEST_ERROR.Abort, response: null };\n }\n\n const error = new ResponseError({\n message: REQUEST_ERROR.Unknown,\n status: 0,\n description: String(err),\n });\n request.onError?.(REQUEST_ERROR.Unknown, error);\n\n return { data: error, error: REQUEST_ERROR.Unknown, response: null };\n } finally {\n requestController.abort();\n }\n }\n\n async function requestWithArrayResponse<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<\n | [ResponseError, RequestError, Response | NodeResponse | null]\n | [Incoming, null, Response | NodeResponse | null]\n > {\n const response = await handleRequest(request);\n\n return [response.data, response.error, response.response] as\n | [ResponseError, RequestError, Response | NodeResponse | null]\n | [Incoming, null, Response | NodeResponse | null];\n }\n\n async function requestWithObjectResponse<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<\n | {\n data: ResponseError;\n error: RequestError;\n response: Response | NodeResponse | null;\n }\n | { data: Incoming; error: null; response: Response | NodeResponse | null }\n > {\n return handleRequest(request);\n }\n\n return {\n requestWithArrayResponse,\n requestWithObjectResponse,\n recreate,\n };\n}\n\nfunction executeBeforeHandlers<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n>(\n handlers: BeforeHandler[],\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n) {\n return new Promise((resolve) => {\n void (async () => {\n for (const handler of handlers) {\n await handler(request);\n }\n\n resolve(1);\n })();\n });\n}\n\nfunction executeAfterHandlers<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n>(\n handlers: AfterHandler[],\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n response: Response | NodeResponse | undefined,\n) {\n return new Promise((resolve) => {\n void (async () => {\n for (const handler of handlers) {\n await handler(request, response);\n }\n\n resolve(1);\n })();\n });\n}\n"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { waitUntil } from '../lib/utils/wait-until.js';
3
3
  import 'dayjs';
4
4
  import { isArray } from '../lib/typings/is-array.js';
5
5
  import { isString } from '../lib/typings/is-string.js';
6
+ import { wait } from '../lib/utils/wait.js';
6
7
  import '../lib/lodash/get-by-path.js';
7
8
  import '../lib/lodash/set-by-path.js';
8
9
  import { startWith } from '../lib/utils/start-with.js';
@@ -10,18 +11,48 @@ import { getQueryValues } from '../lib/browser/get-query-values.js';
10
11
  import { OAUTH_CLEAR_PAGE_URL, OAUTH_ERROR_PAGE_URL, OAUTH_LOGOUT_PAGE_URL, OAUTH_TOKEN_EXPIRES_STORAGE_NAME, OAUTH_TOKEN_STORAGE_NAME, OAUTH_REFRESH_QUERY } from './api.constants.js';
11
12
 
12
13
  function createOauthProvider(opts = {}) {
13
- const { refreshTokenWindowUrl = window.origin, closeObserveSubWindowInterval = 500, waitSubWindow = 8000, loginUrl = undefined, logoutUrl = undefined, clearPageUrl = OAUTH_CLEAR_PAGE_URL, errorPageUrl = OAUTH_ERROR_PAGE_URL, logoutPageUrl = OAUTH_LOGOUT_PAGE_URL, afterClearPageUrl = "/", expiresTokenQueryName = OAUTH_TOKEN_EXPIRES_STORAGE_NAME, tokenStorageName = OAUTH_TOKEN_STORAGE_NAME, expiresTokenStorageName = OAUTH_TOKEN_EXPIRES_STORAGE_NAME, tokenRequest = undefined, forceSetToken = false, } = opts;
14
+ const { refreshTokenWindowUrl = window.origin, closeObserveSubWindowInterval = 500, waitSubWindow = 15000, loginUrl = undefined, logoutUrl = undefined, clearPageUrl = OAUTH_CLEAR_PAGE_URL, errorPageUrl = OAUTH_ERROR_PAGE_URL, logoutPageUrl = OAUTH_LOGOUT_PAGE_URL, afterClearPageUrl = "/", expiresTokenQueryName = OAUTH_TOKEN_EXPIRES_STORAGE_NAME, tokenStorageName = OAUTH_TOKEN_STORAGE_NAME, expiresTokenStorageName = OAUTH_TOKEN_EXPIRES_STORAGE_NAME, tokenRequest = undefined, forceSetToken = false, subWindow = true, refreshToken = false, } = opts;
14
15
  let processing = false;
16
+ function getExpiresDate(expires) {
17
+ return Date.now() + (expires - 30) * 1000;
18
+ }
19
+ function checkExpires(expires) {
20
+ return expires != undefined && !Number.isNaN(+expires) && Date.now() < +expires;
21
+ }
15
22
  async function refetchAfterRefreshFlow(request) {
16
23
  if (processing) {
17
- await beforeHandler(request);
24
+ await beforeHandlerSetToken(request);
25
+ return request;
26
+ }
27
+ processing = true;
28
+ if (refreshToken && tokenRequest) {
29
+ const tokenInfo = await startRefreshFlow();
30
+ if (tokenInfo == undefined) {
31
+ if (subWindow) {
32
+ await startLoginFlowInSubWindow();
33
+ }
34
+ else {
35
+ await startLoginFlow();
36
+ }
37
+ processing = false;
38
+ await beforeHandlerSetToken(request);
39
+ return request;
40
+ }
41
+ processing = false;
42
+ await beforeHandlerSetToken(request);
18
43
  return request;
19
44
  }
20
- void startRefreshFlowInSubWindow();
21
- await beforeHandler(request);
45
+ if (subWindow) {
46
+ await startLoginFlowInSubWindow();
47
+ }
48
+ else {
49
+ await startLoginFlow();
50
+ }
51
+ processing = false;
52
+ await beforeHandlerSetToken(request);
22
53
  return request;
23
54
  }
24
- async function startRefreshFlowInSubWindow() {
55
+ async function startLoginFlowInSubWindow() {
25
56
  processing = true;
26
57
  let waiting = true;
27
58
  const url = new URL(typeof refreshTokenWindowUrl === "function" ? refreshTokenWindowUrl() : refreshTokenWindowUrl);
@@ -63,7 +94,7 @@ function createOauthProvider(opts = {}) {
63
94
  if ("onSubWindowOpenError" in opts)
64
95
  opts.onSubWindowOpenError?.();
65
96
  else {
66
- startLoginFlow();
97
+ await startLoginFlow();
67
98
  }
68
99
  waiting = false;
69
100
  return;
@@ -72,21 +103,34 @@ function createOauthProvider(opts = {}) {
72
103
  processing = false;
73
104
  }
74
105
  // Trigger an oauth flow through some proxy server
75
- function startLoginFlow(loginUrlArg = loginUrl) {
106
+ async function startLoginFlow(loginUrlArg = loginUrl, delay = 2000) {
76
107
  loginUrlArg ??= `/api/v1/auth?frontend_protocol=${window.location.protocol.replace(":", "")}&frontend_host=${window.location.host}&comeback_path=${window.location.pathname}${encodeURIComponent(window.location.search)}`;
77
108
  window.location.replace(typeof loginUrlArg === "function" ? loginUrlArg() : loginUrlArg);
109
+ await wait(delay);
78
110
  return null;
79
111
  }
80
112
  // Trigger an oauth flow through some proxy server
81
- function startLogoutFlow(logoutUrlArg = logoutUrl) {
82
- logoutUrlArg ??= `/api/v1/auth/logout?frontend_protocol=${window.location.protocol.replace(":", "")}&frontend_host=${window.location.host}&comeback_path=${window.location.pathname}${encodeURIComponent(window.location.search)}`;
113
+ async function startLogoutFlow(logoutUrlArg = logoutUrl, delay = 2000) {
114
+ logoutUrlArg ??= `/api/v1/auth/logout?frontend_protocol=${window.location.protocol.replace(":", "")}&frontend_host=${window.location.host}`;
83
115
  window.location.replace(typeof logoutUrlArg === "function" ? logoutUrlArg() : logoutUrlArg);
116
+ await wait(delay);
84
117
  return null;
85
118
  }
119
+ async function startRefreshFlow() {
120
+ const tokenInfo = await tokenRequest?.();
121
+ if (tokenInfo) {
122
+ localStorage.setItem(tokenStorageName, tokenInfo.token);
123
+ if (tokenInfo.expires !== 0) {
124
+ tokenInfo.expires = getExpiresDate(tokenInfo.expires);
125
+ localStorage.setItem(expiresTokenStorageName, String(tokenInfo.expires));
126
+ }
127
+ }
128
+ return tokenInfo;
129
+ }
86
130
  // Processing an oauth flow: extract expires, get token, close sub windows, check if logout/clear/error url
87
131
  async function register() {
88
132
  if (window.location.pathname === logoutPageUrl) {
89
- startLogoutFlow();
133
+ await startLogoutFlow();
90
134
  return false;
91
135
  }
92
136
  if (window.location.pathname === clearPageUrl) {
@@ -110,30 +154,29 @@ function createOauthProvider(opts = {}) {
110
154
  ? refreshQuery[refreshQuery.length - 1] === "true"
111
155
  : false;
112
156
  /** Expires token */
113
- const expires = isString(expiresQuery)
157
+ const expiresStr = isString(expiresQuery)
114
158
  ? expiresQuery
115
159
  : isArray(expiresQuery)
116
160
  ? expiresQuery[expiresQuery.length - 1]
117
- : false;
118
- if (expires && !Number.isNaN(+expires) && Date.now() < +expires) {
119
- localStorage.setItem(expiresTokenStorageName, expires);
161
+ : null;
162
+ const expires = expiresStr ? getExpiresDate(+expiresStr) : null;
163
+ if (checkExpires(expires)) {
164
+ localStorage.setItem(expiresTokenStorageName, String(expires));
120
165
  if (tokenRequest) {
121
- const token = await tokenRequest();
122
- if (token != undefined && tokenStorageName) {
123
- localStorage.setItem(tokenStorageName, token);
166
+ const tokenInfo = await tokenRequest();
167
+ if (tokenInfo != undefined) {
168
+ localStorage.setItem(tokenStorageName, tokenInfo.token);
124
169
  }
125
170
  }
126
- }
127
- /** Close if OnlyRefresh window */
128
- if (isRefresh) {
129
- const channel = new BroadcastChannel(OAUTH_REFRESH_QUERY);
130
- channel.postMessage(true);
131
- channel.close();
132
- window.close();
133
- return false;
134
- }
135
- /** Delete expires query */
136
- if (expires) {
171
+ /** Close if OnlyRefresh window */
172
+ if (isRefresh) {
173
+ const channel = new BroadcastChannel(OAUTH_REFRESH_QUERY);
174
+ channel.postMessage(true);
175
+ channel.close();
176
+ window.close();
177
+ return false;
178
+ }
179
+ /** Delete expires query */
137
180
  const url = new URL(window.location.href);
138
181
  url.searchParams.delete(expiresTokenQueryName);
139
182
  window.location.replace(url.toString());
@@ -141,7 +184,14 @@ function createOauthProvider(opts = {}) {
141
184
  }
142
185
  return true;
143
186
  }
144
- async function beforeHandler(request) {
187
+ async function beforeHandlerCheckExpires(request) {
188
+ const expires = localStorage.getItem(expiresTokenStorageName);
189
+ if (checkExpires(expires)) {
190
+ return;
191
+ }
192
+ await refetchAfterRefreshFlow(request);
193
+ }
194
+ async function beforeHandlerSetToken(request) {
145
195
  if (processing)
146
196
  await waitUntil(() => processing);
147
197
  const token = request.token ?? localStorage.getItem(tokenStorageName);
@@ -153,12 +203,17 @@ function createOauthProvider(opts = {}) {
153
203
  };
154
204
  }
155
205
  return {
156
- startRefreshFlowInSubWindow,
206
+ startRefreshFlow,
207
+ startLoginFlowInSubWindow,
157
208
  startLoginFlow,
158
209
  startLogoutFlow,
159
- register,
160
210
  refetchAfterRefreshFlow,
161
- beforeHandler,
211
+ beforeHandlerSetToken,
212
+ beforeHandlerCheckExpires,
213
+ register,
214
+ get isServicePage() {
215
+ return [errorPageUrl, clearPageUrl, logoutPageUrl].some((u) => document.location.pathname === u);
216
+ },
162
217
  get processing() {
163
218
  return processing;
164
219
  },
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.js","sources":["../../../src/api/oauth.ts"],"sourcesContent":["import { getQueryValues, isArray, isString, startWith, waitUntil } from \"../lib\";\nimport {\n OAUTH_CLEAR_PAGE_URL,\n OAUTH_ERROR_PAGE_URL,\n OAUTH_LOGOUT_PAGE_URL,\n OAUTH_REFRESH_QUERY,\n OAUTH_TOKEN_EXPIRES_STORAGE_NAME,\n OAUTH_TOKEN_STORAGE_NAME,\n} from \"./api.constants\";\nimport type { OauthOptions, RequestInterface } from \"./api.types\";\n\nexport function createOauthProvider(opts: OauthOptions = {}) {\n const {\n refreshTokenWindowUrl = window.origin,\n closeObserveSubWindowInterval = 500,\n waitSubWindow = 8000,\n loginUrl = undefined,\n logoutUrl = undefined,\n clearPageUrl = OAUTH_CLEAR_PAGE_URL,\n errorPageUrl = OAUTH_ERROR_PAGE_URL,\n logoutPageUrl = OAUTH_LOGOUT_PAGE_URL,\n afterClearPageUrl = \"/\",\n expiresTokenQueryName = OAUTH_TOKEN_EXPIRES_STORAGE_NAME,\n tokenStorageName = OAUTH_TOKEN_STORAGE_NAME,\n expiresTokenStorageName = OAUTH_TOKEN_EXPIRES_STORAGE_NAME,\n tokenRequest = undefined,\n forceSetToken = false,\n } = opts;\n let processing = false;\n\n async function refetchAfterRefreshFlow<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>> {\n if (processing) {\n await beforeHandler(request);\n return request;\n }\n void startRefreshFlowInSubWindow();\n await beforeHandler(request);\n return request;\n }\n\n async function startRefreshFlowInSubWindow() {\n processing = true;\n let waiting = true;\n const url = new URL(\n typeof refreshTokenWindowUrl === \"function\" ? refreshTokenWindowUrl() : refreshTokenWindowUrl,\n );\n // added only refresh tag to autoclose window after flow\n url.searchParams.append(OAUTH_REFRESH_QUERY, \"true\");\n\n // try open window with both of action\n let windowInstance = window.open(\n url.toString(),\n \"_blank\",\n \"width=800,height=600,left=100,top=100\",\n );\n windowInstance ??= window.open(url.toString(), \"_blank\");\n\n if (windowInstance) {\n const channel = new BroadcastChannel(OAUTH_REFRESH_QUERY);\n const windowCloseObserver = setInterval(() => {\n if (windowInstance.closed) {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n }\n }, closeObserveSubWindowInterval);\n channel.onmessage = () => {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n };\n setTimeout(() => {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n if (windowInstance && !windowInstance.closed) {\n windowInstance.close();\n }\n }, waitSubWindow);\n } else {\n if (\"onSubWindowOpenError\" in opts) opts.onSubWindowOpenError?.();\n else {\n startLoginFlow();\n }\n waiting = false;\n\n return;\n }\n\n await waitUntil(() => waiting);\n processing = false;\n }\n\n // Trigger an oauth flow through some proxy server\n function startLoginFlow(loginUrlArg: (() => string) | string | undefined = loginUrl) {\n loginUrlArg ??= `/api/v1/auth?frontend_protocol=${window.location.protocol.replace(\":\", \"\")}&frontend_host=${window.location.host}&comeback_path=${window.location.pathname}${encodeURIComponent(window.location.search)}`;\n window.location.replace(typeof loginUrlArg === \"function\" ? loginUrlArg() : loginUrlArg);\n return null;\n }\n\n // Trigger an oauth flow through some proxy server\n function startLogoutFlow(logoutUrlArg: (() => string) | string | undefined = logoutUrl) {\n logoutUrlArg ??= `/api/v1/auth/logout?frontend_protocol=${window.location.protocol.replace(\":\", \"\")}&frontend_host=${window.location.host}&comeback_path=${window.location.pathname}${encodeURIComponent(window.location.search)}`;\n window.location.replace(typeof logoutUrlArg === \"function\" ? logoutUrlArg() : logoutUrlArg);\n return null;\n }\n\n // Processing an oauth flow: extract expires, get token, close sub windows, check if logout/clear/error url\n async function register(): Promise<boolean> {\n if (window.location.pathname === logoutPageUrl) {\n startLogoutFlow();\n return false;\n }\n if (window.location.pathname === clearPageUrl) {\n localStorage.removeItem(expiresTokenStorageName);\n localStorage.removeItem(tokenStorageName);\n window.location.replace(afterClearPageUrl);\n return false;\n }\n if (window.location.pathname === errorPageUrl) {\n localStorage.removeItem(expiresTokenStorageName);\n localStorage.removeItem(tokenStorageName);\n return false;\n }\n\n const queries = getQueryValues([expiresTokenQueryName, OAUTH_REFRESH_QUERY]);\n\n const refreshQuery = queries?.[OAUTH_REFRESH_QUERY];\n const expiresQuery = queries?.[expiresTokenQueryName];\n\n /** Is OnlyRefresh window */\n const isRefresh = isString(refreshQuery)\n ? refreshQuery === \"true\"\n : isArray(refreshQuery)\n ? refreshQuery[refreshQuery.length - 1] === \"true\"\n : false;\n /** Expires token */\n const expires = isString(expiresQuery)\n ? expiresQuery\n : isArray(expiresQuery)\n ? expiresQuery[expiresQuery.length - 1]\n : false;\n\n if (expires && !Number.isNaN(+expires) && Date.now() < +expires) {\n localStorage.setItem(expiresTokenStorageName, expires);\n if (tokenRequest) {\n const token = await tokenRequest();\n if (token != undefined && tokenStorageName) {\n localStorage.setItem(tokenStorageName, token);\n }\n }\n }\n\n /** Close if OnlyRefresh window */\n if (isRefresh) {\n const channel = new BroadcastChannel(OAUTH_REFRESH_QUERY);\n channel.postMessage(true);\n channel.close();\n window.close();\n return false;\n }\n /** Delete expires query */\n if (expires) {\n const url = new URL(window.location.href);\n url.searchParams.delete(expiresTokenQueryName);\n window.location.replace(url.toString());\n return false;\n }\n return true;\n }\n\n async function beforeHandler<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>): Promise<void> {\n if (processing) await waitUntil(() => processing);\n\n const token = request.token ?? localStorage.getItem(tokenStorageName);\n const isSameOrigin =\n request.path.includes(window.location.origin) || !startWith(request.path, \"http\");\n if ((!isSameOrigin || forceSetToken) && token)\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${token}`,\n };\n }\n\n return {\n startRefreshFlowInSubWindow,\n startLoginFlow,\n startLogoutFlow,\n register,\n refetchAfterRefreshFlow,\n beforeHandler,\n get processing() {\n return processing;\n },\n get token() {\n return localStorage.getItem(tokenStorageName);\n },\n get expires() {\n const expires = localStorage.getItem(expiresTokenStorageName);\n return expires == undefined ? null : Number.isNaN(+expires) ? null : +expires;\n },\n get expired() {\n const expiresStr = localStorage.getItem(expiresTokenStorageName);\n const expires =\n expiresStr == undefined ? null : Number.isNaN(+expiresStr) ? null : +expiresStr;\n return expires == undefined ? true : Date.now() > expires;\n },\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oauth.js","sources":["../../../src/api/oauth.ts"],"sourcesContent":["import { getQueryValues, isArray, isString, startWith, wait, waitUntil } from \"../lib\";\nimport {\n OAUTH_CLEAR_PAGE_URL,\n OAUTH_ERROR_PAGE_URL,\n OAUTH_LOGOUT_PAGE_URL,\n OAUTH_REFRESH_QUERY,\n OAUTH_TOKEN_EXPIRES_STORAGE_NAME,\n OAUTH_TOKEN_STORAGE_NAME,\n} from \"./api.constants\";\nimport type { OauthOptions, RequestInterface } from \"./api.types\";\n\nexport function createOauthProvider(opts: OauthOptions = {}) {\n const {\n refreshTokenWindowUrl = window.origin,\n closeObserveSubWindowInterval = 500,\n waitSubWindow = 15000,\n loginUrl = undefined,\n logoutUrl = undefined,\n clearPageUrl = OAUTH_CLEAR_PAGE_URL,\n errorPageUrl = OAUTH_ERROR_PAGE_URL,\n logoutPageUrl = OAUTH_LOGOUT_PAGE_URL,\n afterClearPageUrl = \"/\",\n expiresTokenQueryName = OAUTH_TOKEN_EXPIRES_STORAGE_NAME,\n tokenStorageName = OAUTH_TOKEN_STORAGE_NAME,\n expiresTokenStorageName = OAUTH_TOKEN_EXPIRES_STORAGE_NAME,\n tokenRequest = undefined,\n forceSetToken = false,\n subWindow = true,\n refreshToken = false,\n } = opts;\n let processing = false;\n\n function getExpiresDate(expires: number) {\n return Date.now() + (expires - 30) * 1000;\n }\n function checkExpires(expires: null | undefined | string | number): expires is number | string {\n return expires != undefined && !Number.isNaN(+expires) && Date.now() < +expires;\n }\n\n async function refetchAfterRefreshFlow<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(\n request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>,\n ): Promise<RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>> {\n if (processing) {\n await beforeHandlerSetToken(request);\n return request;\n }\n processing = true;\n if (refreshToken && tokenRequest) {\n const tokenInfo = await startRefreshFlow();\n if (tokenInfo == undefined) {\n if (subWindow) {\n await startLoginFlowInSubWindow();\n } else {\n await startLoginFlow();\n }\n processing = false;\n await beforeHandlerSetToken(request);\n return request;\n }\n processing = false;\n await beforeHandlerSetToken(request);\n return request;\n }\n if (subWindow) {\n await startLoginFlowInSubWindow();\n } else {\n await startLoginFlow();\n }\n processing = false;\n await beforeHandlerSetToken(request);\n return request;\n }\n\n async function startLoginFlowInSubWindow() {\n processing = true;\n let waiting = true;\n const url = new URL(\n typeof refreshTokenWindowUrl === \"function\" ? refreshTokenWindowUrl() : refreshTokenWindowUrl,\n );\n // added only refresh tag to autoclose window after flow\n url.searchParams.append(OAUTH_REFRESH_QUERY, \"true\");\n\n // try open window with both of action\n let windowInstance = window.open(\n url.toString(),\n \"_blank\",\n \"width=800,height=600,left=100,top=100\",\n );\n windowInstance ??= window.open(url.toString(), \"_blank\");\n\n if (windowInstance) {\n const channel = new BroadcastChannel(OAUTH_REFRESH_QUERY);\n const windowCloseObserver = setInterval(() => {\n if (windowInstance.closed) {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n }\n }, closeObserveSubWindowInterval);\n channel.onmessage = () => {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n };\n setTimeout(() => {\n if (waiting) {\n waiting = false;\n channel.close();\n clearInterval(windowCloseObserver);\n }\n if (windowInstance && !windowInstance.closed) {\n windowInstance.close();\n }\n }, waitSubWindow);\n } else {\n if (\"onSubWindowOpenError\" in opts) opts.onSubWindowOpenError?.();\n else {\n await startLoginFlow();\n }\n waiting = false;\n\n return;\n }\n\n await waitUntil(() => waiting);\n processing = false;\n }\n\n // Trigger an oauth flow through some proxy server\n async function startLoginFlow(\n loginUrlArg: (() => string) | string | undefined = loginUrl,\n delay: number = 2000,\n ) {\n loginUrlArg ??= `/api/v1/auth?frontend_protocol=${window.location.protocol.replace(\":\", \"\")}&frontend_host=${window.location.host}&comeback_path=${window.location.pathname}${encodeURIComponent(window.location.search)}`;\n window.location.replace(typeof loginUrlArg === \"function\" ? loginUrlArg() : loginUrlArg);\n await wait(delay);\n return null;\n }\n\n // Trigger an oauth flow through some proxy server\n async function startLogoutFlow(\n logoutUrlArg: (() => string) | string | undefined = logoutUrl,\n delay: number = 2000,\n ) {\n logoutUrlArg ??= `/api/v1/auth/logout?frontend_protocol=${window.location.protocol.replace(\":\", \"\")}&frontend_host=${window.location.host}`;\n window.location.replace(typeof logoutUrlArg === \"function\" ? logoutUrlArg() : logoutUrlArg);\n await wait(delay);\n return null;\n }\n\n async function startRefreshFlow() {\n const tokenInfo = await tokenRequest?.();\n if (tokenInfo) {\n localStorage.setItem(tokenStorageName, tokenInfo.token);\n if (tokenInfo.expires !== 0) {\n tokenInfo.expires = getExpiresDate(tokenInfo.expires);\n localStorage.setItem(expiresTokenStorageName, String(tokenInfo.expires));\n }\n }\n return tokenInfo;\n }\n\n // Processing an oauth flow: extract expires, get token, close sub windows, check if logout/clear/error url\n async function register(): Promise<boolean> {\n if (window.location.pathname === logoutPageUrl) {\n await startLogoutFlow();\n return false;\n }\n if (window.location.pathname === clearPageUrl) {\n localStorage.removeItem(expiresTokenStorageName);\n localStorage.removeItem(tokenStorageName);\n window.location.replace(afterClearPageUrl);\n return false;\n }\n if (window.location.pathname === errorPageUrl) {\n localStorage.removeItem(expiresTokenStorageName);\n localStorage.removeItem(tokenStorageName);\n return false;\n }\n\n const queries = getQueryValues([expiresTokenQueryName, OAUTH_REFRESH_QUERY]);\n\n const refreshQuery = queries?.[OAUTH_REFRESH_QUERY];\n const expiresQuery = queries?.[expiresTokenQueryName];\n\n /** Is OnlyRefresh window */\n const isRefresh = isString(refreshQuery)\n ? refreshQuery === \"true\"\n : isArray(refreshQuery)\n ? refreshQuery[refreshQuery.length - 1] === \"true\"\n : false;\n /** Expires token */\n const expiresStr = isString(expiresQuery)\n ? expiresQuery\n : isArray(expiresQuery)\n ? expiresQuery[expiresQuery.length - 1]\n : null;\n const expires = expiresStr ? getExpiresDate(+expiresStr) : null;\n\n if (checkExpires(expires)) {\n localStorage.setItem(expiresTokenStorageName, String(expires));\n if (tokenRequest) {\n const tokenInfo = await tokenRequest();\n if (tokenInfo != undefined) {\n localStorage.setItem(tokenStorageName, tokenInfo.token);\n }\n }\n\n /** Close if OnlyRefresh window */\n if (isRefresh) {\n const channel = new BroadcastChannel(OAUTH_REFRESH_QUERY);\n channel.postMessage(true);\n channel.close();\n window.close();\n return false;\n }\n\n /** Delete expires query */\n const url = new URL(window.location.href);\n url.searchParams.delete(expiresTokenQueryName);\n window.location.replace(url.toString());\n return false;\n }\n\n return true;\n }\n\n async function beforeHandlerCheckExpires<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>): Promise<void> {\n const expires = localStorage.getItem(expiresTokenStorageName);\n if (checkExpires(expires)) {\n return;\n }\n await refetchAfterRefreshFlow(request);\n }\n\n async function beforeHandlerSetToken<\n IncomingApi,\n Incoming = IncomingApi,\n Outcoming = unknown,\n OutcomingApi = Outcoming,\n >(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>): Promise<void> {\n if (processing) await waitUntil(() => processing);\n\n const token = request.token ?? localStorage.getItem(tokenStorageName);\n const isSameOrigin =\n request.path.includes(window.location.origin) || !startWith(request.path, \"http\");\n if ((!isSameOrigin || forceSetToken) && token)\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${token}`,\n };\n }\n\n return {\n startRefreshFlow,\n startLoginFlowInSubWindow,\n startLoginFlow,\n startLogoutFlow,\n refetchAfterRefreshFlow,\n beforeHandlerSetToken,\n beforeHandlerCheckExpires,\n register,\n get isServicePage() {\n return [errorPageUrl, clearPageUrl, logoutPageUrl].some(\n (u) => document.location.pathname === u,\n );\n },\n get processing() {\n return processing;\n },\n get token() {\n return localStorage.getItem(tokenStorageName);\n },\n get expires() {\n const expires = localStorage.getItem(expiresTokenStorageName);\n return expires == undefined ? null : Number.isNaN(+expires) ? null : +expires;\n },\n get expired() {\n const expiresStr = localStorage.getItem(expiresTokenStorageName);\n const expires =\n expiresStr == undefined ? null : Number.isNaN(+expiresStr) ? null : +expiresStr;\n return expires == undefined ? true : Date.now() > expires;\n },\n };\n}\n"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -61,13 +61,14 @@ declare function transformRGBAtoRGB(rgba: string): string;
61
61
 
62
62
  declare const RESPONSE_DATA_SYMBOL: unique symbol;
63
63
  declare const REQUEST_ERROR: {
64
- readonly HTTP_ERROR: "http";
65
- readonly NETWORK_ERROR: "network";
66
- readonly TIMEOUT_ERROR: "timeout";
67
- readonly ABORT_ERROR: "abort";
68
- readonly VALIDATION_ERROR: "validation";
69
- readonly CACHE_ERROR: "cache";
70
- readonly UNKNOWN_ERROR: "unknown";
64
+ readonly Http: "http";
65
+ readonly Network: "network";
66
+ readonly Timeout: "timeout";
67
+ readonly Abort: "abort";
68
+ readonly Validation: "validation";
69
+ readonly Cache: "cache";
70
+ readonly Unknown: "unknown";
71
+ readonly Disabled: "disabled";
71
72
  };
72
73
  declare class OauthState {
73
74
  private _fetching;
@@ -153,6 +154,7 @@ type RequestTransformIncoming<IncomingApi, Incoming> = IsEqual<Incoming, Incomin
153
154
  transformIncomingData: (data: IncomingApi) => Incoming;
154
155
  };
155
156
  type CreateRequestClientInstance = {
157
+ enabled?: boolean;
156
158
  client: ((url: URL | RequestInfo, init?: RequestInit) => Promise<Response$1>) | typeof fetch;
157
159
  beforeHandlers?: BeforeHandler[];
158
160
  afterHandlers?: AfterHandler[];
@@ -167,6 +169,10 @@ type RequestInstance = {
167
169
  type RefetchAfterAuthFn = <IncomingApi, Incoming = IncomingApi, Outcoming = unknown, OutcomingApi = Outcoming>(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>) => Promise<RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>>;
168
170
  type BeforeHandler = <IncomingApi, Incoming = IncomingApi, Outcoming = unknown, OutcomingApi = Outcoming>(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>) => Promise<void> | void;
169
171
  type AfterHandler = <IncomingApi, Incoming = IncomingApi, Outcoming = unknown, OutcomingApi = Outcoming>(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>, response: Response | Response$1 | undefined) => Promise<void> | void;
172
+ type OauthToken = {
173
+ token: string;
174
+ expires: number;
175
+ };
170
176
  type OauthOptions = {
171
177
  /** An url of start oauth login flow through proxy */
172
178
  loginUrl?: (() => string) | string;
@@ -195,9 +201,13 @@ type OauthOptions = {
195
201
  /** A name of token in local storage */
196
202
  tokenStorageName?: string;
197
203
  /** A request for update token */
198
- tokenRequest?: () => Promise<string | null | undefined>;
204
+ tokenRequest?: () => Promise<OauthToken | null | undefined>;
199
205
  /** Set token to request headers event if it is same origin */
200
206
  forceSetToken?: boolean;
207
+ /** Set to update token flow in sub window, by default true */
208
+ subWindow?: boolean;
209
+ /** Set to use refresh token flow, by default false */
210
+ refreshToken?: boolean;
201
211
  };
202
212
 
203
213
  declare function createFetchClient(options: CreateRequestClientInstance): {
@@ -215,12 +225,15 @@ declare function createFetchClient(options: CreateRequestClientInstance): {
215
225
  };
216
226
 
217
227
  declare function createOauthProvider(opts?: OauthOptions): {
218
- startRefreshFlowInSubWindow: () => Promise<void>;
219
- startLoginFlow: (loginUrlArg?: (() => string) | string | undefined) => null;
220
- startLogoutFlow: (logoutUrlArg?: (() => string) | string | undefined) => null;
221
- register: () => Promise<boolean>;
228
+ startRefreshFlow: () => Promise<OauthToken | null | undefined>;
229
+ startLoginFlowInSubWindow: () => Promise<void>;
230
+ startLoginFlow: (loginUrlArg?: (() => string) | string | undefined, delay?: number) => Promise<null>;
231
+ startLogoutFlow: (logoutUrlArg?: (() => string) | string | undefined, delay?: number) => Promise<null>;
222
232
  refetchAfterRefreshFlow: <IncomingApi, Incoming = IncomingApi, Outcoming = unknown, OutcomingApi = Outcoming>(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>) => Promise<RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>>;
223
- beforeHandler: <IncomingApi, Incoming = IncomingApi, Outcoming = unknown, OutcomingApi = Outcoming>(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>) => Promise<void>;
233
+ beforeHandlerSetToken: <IncomingApi, Incoming = IncomingApi, Outcoming = unknown, OutcomingApi = Outcoming>(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>) => Promise<void>;
234
+ beforeHandlerCheckExpires: <IncomingApi, Incoming = IncomingApi, Outcoming = unknown, OutcomingApi = Outcoming>(request: RequestInterface<IncomingApi, Incoming, Outcoming, OutcomingApi>) => Promise<void>;
235
+ register: () => Promise<boolean>;
236
+ readonly isServicePage: boolean;
224
237
  readonly processing: boolean;
225
238
  readonly token: string | null;
226
239
  readonly expires: number | null;
@@ -457,4 +470,4 @@ declare function throttle<TArgs extends any[]>(func: (...args: TArgs) => any, in
457
470
  declare function type(value: unknown): string;
458
471
 
459
472
  export { COLOR_FORMATS, DATE_TYPES, FIELD_TYPES, IS_BROWSER, IS_BUN, IS_DENO, IS_JEST, IS_NODE, IS_WEB_WORKER, OAUTH_CLEAR_PAGE_URL, OAUTH_ERROR_PAGE_URL, OAUTH_LOGOUT_PAGE_URL, OAUTH_REFRESH_QUERY, OAUTH_STATE, OAUTH_TOKEN_EXPIRES_STORAGE_NAME, OAUTH_TOKEN_STORAGE_NAME, REQUEST_ERROR, RESPONSE_DATA_SYMBOL, ResponseError, arrayToMapByKey, asyncLoop, buildQueryString, checkType, cloneDeep, copyToClipboard, createFetchClient, createGlobalId, createLocalIdGenerator, createOauthProvider, createURLWithQueries, dateDifference, dateFormat, debounce, declination, difference, differenceBy, differenceWith, downloadFile, downloadJson, execAnimation, extractQueries, fieldViewFormat, getByPath, getCallerFunctionName, getColorFormat, getDateByRules, getFileNameFromHeader, getQueryValues, getRandomColor, getToday, getVisiblePosition, isArray, isBoolean, isDate, isEqual, isId, isNull, isNullable, isNumber, isObject, isPrimitive, isString, isToday, isUndefined, joinPaths, jsonParse, limitStreamOfRequests, loggerAfterHandler, loggerBeforeHandler, randomBase64, randomHex, randomNumber, randomString, readFile, setByPath, speedTest, startWith, syncObjectValues, takeOpacityColors, throttle, transformHEXtoRGB, transformRGBAtoRGB, transformRGBtoRGBA, transformToColor, transformToDayjs, transformToNumber, translit, trimUrl, type, wait, waitUntil };
460
- export type { AfterHandler, BeforeHandler, ColorFormat, CreateRequestClientInstance, DateGetterRule, DateType, DayJS, FieldType, IsEqual, LoggerAfterHandlerOptions, LoggerBeforeHandlerOptions, Maybe, OauthOptions, PositionPlacements, RefetchAfterAuthFn, RequestError, RequestHeader, RequestInstance, RequestInterface, RequestMethod, RequestQuery, RequestQueryValue, RequestTransformIncoming, RequestTransformOutcoming, ValueOf, VisiblePosition };
473
+ export type { AfterHandler, BeforeHandler, ColorFormat, CreateRequestClientInstance, DateGetterRule, DateType, DayJS, FieldType, IsEqual, LoggerAfterHandlerOptions, LoggerBeforeHandlerOptions, Maybe, OauthOptions, OauthToken, PositionPlacements, RefetchAfterAuthFn, RequestError, RequestHeader, RequestInstance, RequestInterface, RequestMethod, RequestQuery, RequestQueryValue, RequestTransformIncoming, RequestTransformOutcoming, ValueOf, VisiblePosition };