@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.
- package/lib/cjs/index.cjs +123 -57
- package/lib/cjs/index.cjs.map +1 -1
- package/lib/esm/api/api.constants.js +8 -7
- package/lib/esm/api/api.constants.js.map +1 -1
- package/lib/esm/api/api.js +29 -18
- package/lib/esm/api/api.js.map +1 -1
- package/lib/esm/api/oauth.js +87 -32
- package/lib/esm/api/oauth.js.map +1 -1
- package/lib/index.d.ts +27 -14
- package/package.json +1 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
const RESPONSE_DATA_SYMBOL = Symbol("response data");
|
|
2
2
|
const REQUEST_ERROR = {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
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;;;;"}
|
package/lib/esm/api/api.js
CHANGED
|
@@ -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.
|
|
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.
|
|
154
|
-
return { data: error, error: REQUEST_ERROR.
|
|
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.
|
|
208
|
+
message: REQUEST_ERROR.Http,
|
|
198
209
|
description: result,
|
|
199
210
|
headers: Object.fromEntries(response.headers.entries()),
|
|
200
211
|
});
|
|
201
|
-
request.onError?.(REQUEST_ERROR.
|
|
212
|
+
request.onError?.(REQUEST_ERROR.Http, error);
|
|
202
213
|
return {
|
|
203
214
|
data: error,
|
|
204
|
-
error: REQUEST_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.
|
|
284
|
+
message: REQUEST_ERROR.Network,
|
|
274
285
|
status: 0,
|
|
275
286
|
description: String(err.message),
|
|
276
287
|
});
|
|
277
|
-
request.onError?.(REQUEST_ERROR.
|
|
278
|
-
return { data: error, error: REQUEST_ERROR.
|
|
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.
|
|
294
|
+
message: REQUEST_ERROR.Timeout,
|
|
284
295
|
status: 0,
|
|
285
296
|
});
|
|
286
|
-
request.onError?.(REQUEST_ERROR.
|
|
287
|
-
return { data: error, error: REQUEST_ERROR.
|
|
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.
|
|
301
|
+
message: REQUEST_ERROR.Abort,
|
|
291
302
|
status: 0,
|
|
292
303
|
});
|
|
293
|
-
request.onError?.(REQUEST_ERROR.
|
|
294
|
-
return { data: error, error: REQUEST_ERROR.
|
|
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.
|
|
308
|
+
message: REQUEST_ERROR.Unknown,
|
|
298
309
|
status: 0,
|
|
299
310
|
description: String(err),
|
|
300
311
|
});
|
|
301
|
-
request.onError?.(REQUEST_ERROR.
|
|
302
|
-
return { data: error, error: REQUEST_ERROR.
|
|
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();
|
package/lib/esm/api/api.js.map
CHANGED
|
@@ -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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"}
|
package/lib/esm/api/oauth.js
CHANGED
|
@@ -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 =
|
|
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
|
|
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
|
-
|
|
21
|
-
|
|
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
|
|
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}
|
|
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
|
|
157
|
+
const expiresStr = isString(expiresQuery)
|
|
114
158
|
? expiresQuery
|
|
115
159
|
: isArray(expiresQuery)
|
|
116
160
|
? expiresQuery[expiresQuery.length - 1]
|
|
117
|
-
:
|
|
118
|
-
|
|
119
|
-
|
|
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
|
|
122
|
-
if (
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
|
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
|
-
|
|
206
|
+
startRefreshFlow,
|
|
207
|
+
startLoginFlowInSubWindow,
|
|
157
208
|
startLoginFlow,
|
|
158
209
|
startLogoutFlow,
|
|
159
|
-
register,
|
|
160
210
|
refetchAfterRefreshFlow,
|
|
161
|
-
|
|
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
|
},
|
package/lib/esm/api/oauth.js.map
CHANGED
|
@@ -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
|
|
65
|
-
readonly
|
|
66
|
-
readonly
|
|
67
|
-
readonly
|
|
68
|
-
readonly
|
|
69
|
-
readonly
|
|
70
|
-
readonly
|
|
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<
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
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 };
|