@krainovsd/js-helpers 0.15.2 → 0.15.3

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 CHANGED
@@ -1330,7 +1330,7 @@ function generateConsoleMiddleware(options = {}) {
1330
1330
  }
1331
1331
 
1332
1332
  function generateConsolePostMiddleware(options = {}) {
1333
- return (response) => {
1333
+ return (request, response) => {
1334
1334
  return new Promise((resolve) => {
1335
1335
  void (async function logger() {
1336
1336
  try {
@@ -1380,13 +1380,8 @@ function generateConsolePostMiddleware(options = {}) {
1380
1380
  };
1381
1381
  }
1382
1382
 
1383
- let waiting = false;
1384
1383
  async function getOauthTokenFromOtherWindow(options) {
1385
- await waitUntil(() => waiting);
1386
- const expires = localStorage.getItem(options.expiresTokenStorageName);
1387
- if (expires != undefined && !Number.isNaN(+expires) && Date.now() < +expires)
1388
- return;
1389
- waiting = true;
1384
+ let waiting = true;
1390
1385
  const url = new URL(typeof options.refreshTokenWindowUrl === "function"
1391
1386
  ? options.refreshTokenWindowUrl()
1392
1387
  : (options.refreshTokenWindowUrl ?? window.origin));
@@ -1431,9 +1426,6 @@ async function getOauthTokenFromOtherWindow(options) {
1431
1426
  await waitUntil(() => waiting);
1432
1427
  }
1433
1428
  function getOauthToken(options) {
1434
- let expires = localStorage.getItem(options.expiresTokenStorageName);
1435
- if (!expires || Number.isNaN(+expires) || Date.now() > +expires)
1436
- expires = null;
1437
1429
  const queries = getQueryValues([
1438
1430
  options.expiresTokenQueryName,
1439
1431
  options.onlyRefreshTokenWindowQueryName,
@@ -1447,17 +1439,11 @@ function getOauthToken(options) {
1447
1439
  ? refreshQuery[refreshQuery.length - 1] === "true"
1448
1440
  : false;
1449
1441
  /** Expires token */
1450
- const expiresFromQuery = isString(expiresQuery)
1442
+ const expires = isString(expiresQuery)
1451
1443
  ? expiresQuery
1452
1444
  : isArray(expiresQuery)
1453
1445
  ? expiresQuery[expiresQuery.length - 1]
1454
1446
  : false;
1455
- /** Extract expires from query */
1456
- if (!expires && expiresFromQuery) {
1457
- expires = expiresFromQuery;
1458
- if (!expires || Number.isNaN(+expires) || Date.now() > +expires)
1459
- expires = null;
1460
- }
1461
1447
  /** OAuth flow if not expires */
1462
1448
  if (!expires) {
1463
1449
  window.location.replace(typeof options.oauthUrl === "function" ? options.oauthUrl() : options.oauthUrl);
@@ -1472,7 +1458,7 @@ function getOauthToken(options) {
1472
1458
  window.close();
1473
1459
  }
1474
1460
  /** Delete expires query */
1475
- if (expiresFromQuery) {
1461
+ if (expires) {
1476
1462
  const url = new URL(window.location.href);
1477
1463
  url.searchParams.delete(options.expiresTokenQueryName);
1478
1464
  window.location.replace(url.toString());
@@ -1553,14 +1539,34 @@ const generateOauthMiddleware = (options) => async (request) => {
1553
1539
  Authorization: `Bearer ${token}`,
1554
1540
  };
1555
1541
  };
1542
+ async function refetchAfterOauth(options, refetch) {
1543
+ isFetchingAccessToken = true;
1544
+ await getOauthTokenFromOtherWindow({
1545
+ onlyRefreshTokenWindowQueryName: options.onlyRefreshTokenWindowQueryName,
1546
+ onWindowOpenError: options.onWindowOpenError,
1547
+ refreshTokenWindowUrl: options.refreshTokenWindowUrl,
1548
+ wait: options.wait,
1549
+ expiresTokenStorageName: options.expiresTokenStorageName,
1550
+ closeObserveInterval: options.closeObserveInterval,
1551
+ });
1552
+ if (options.tokenRequest) {
1553
+ const token = await options.tokenRequest();
1554
+ if (token != undefined && options.tokenStorageName) {
1555
+ localStorage.setItem(options.tokenStorageName, token);
1556
+ }
1557
+ }
1558
+ isFetchingAccessToken = false;
1559
+ return await refetch();
1560
+ }
1556
1561
 
1557
- function generateMiddlewares(activeMiddlewares, middlewareOptions, customMiddlewares) {
1562
+ // eslint-disable-next-line max-params
1563
+ function generateMiddlewares(activeMiddlewares, middlewareOptions, oauthOptions, customMiddlewares) {
1558
1564
  const selectedMiddlewares = customMiddlewares;
1559
1565
  for (const key of activeMiddlewares) {
1560
1566
  switch (key) {
1561
1567
  case API_MIDDLEWARES.Oauth: {
1562
- if (middlewareOptions.oauth && (IS_BROWSER || IS_JEST))
1563
- selectedMiddlewares.push(generateOauthMiddleware(middlewareOptions.oauth));
1568
+ if (oauthOptions && (IS_BROWSER || IS_JEST))
1569
+ selectedMiddlewares.push(generateOauthMiddleware(oauthOptions));
1564
1570
  continue;
1565
1571
  }
1566
1572
  case API_MIDDLEWARES.Logger: {
@@ -1597,12 +1603,12 @@ function generatePostMiddlewares(activePostMiddlewares, postMiddlewaresOptions,
1597
1603
  }
1598
1604
  }
1599
1605
  }
1600
- return function executeMiddlewares(response) {
1606
+ return function executeMiddlewares(request, response) {
1601
1607
  return new Promise((resolve) => {
1602
1608
  void (async () => {
1603
1609
  for (const middleware of selectedMiddlewares) {
1604
1610
  // eslint-disable-next-line no-await-in-loop
1605
- await middleware(response);
1611
+ await middleware(request, response);
1606
1612
  }
1607
1613
  resolve(1);
1608
1614
  })();
@@ -1626,8 +1632,8 @@ class ResponseError extends Error {
1626
1632
  function createRequestClientInstance(options) {
1627
1633
  let executeMiddlewares;
1628
1634
  let executePostMiddlewares;
1629
- function setMiddlewares({ activeMiddlewares = [], middlewareOptions = {}, customMiddlewares = [], activePostMiddlewares = [], postMiddlewaresOptions = {}, customPostMiddlewares = [], } = {}) {
1630
- executeMiddlewares = generateMiddlewares(activeMiddlewares, middlewareOptions, customMiddlewares);
1635
+ function setMiddlewares({ activeMiddlewares = [], middlewareOptions = {}, customMiddlewares = [], activePostMiddlewares = [], postMiddlewaresOptions = {}, customPostMiddlewares = [], oauthOptions = undefined, } = {}) {
1636
+ executeMiddlewares = generateMiddlewares(activeMiddlewares, middlewareOptions, oauthOptions, customMiddlewares);
1631
1637
  executePostMiddlewares = generatePostMiddlewares(activePostMiddlewares, postMiddlewaresOptions, customPostMiddlewares);
1632
1638
  }
1633
1639
  setMiddlewares(options);
@@ -1645,7 +1651,7 @@ function createRequestClientInstance(options) {
1645
1651
  : transformedResult;
1646
1652
  }
1647
1653
  await executeMiddlewares(request);
1648
- const { method, body, path, params, headers = {} } = request;
1654
+ const { method, body, path, params, headers = {}, refetchNoAuth = true } = request;
1649
1655
  const url = createURLWithParams({ baseURL: path, params });
1650
1656
  const [, requestContentType] = Object.entries(headers).find(([header]) => header.toLowerCase() === "content-type") ?? [];
1651
1657
  let preparedBody = body;
@@ -1670,7 +1676,7 @@ function createRequestClientInstance(options) {
1670
1676
  headers: headers,
1671
1677
  signal: request.signal,
1672
1678
  });
1673
- await executePostMiddlewares(response);
1679
+ await executePostMiddlewares(request, response);
1674
1680
  if (!response) {
1675
1681
  throw new Error("hasn't response");
1676
1682
  }
@@ -1684,6 +1690,9 @@ function createRequestClientInstance(options) {
1684
1690
  }
1685
1691
  : undefined;
1686
1692
  }
1693
+ if (response.status === 401 && refetchNoAuth && options.oauthOptions) {
1694
+ return refetchAfterOauth(options.oauthOptions, () => handleRequest({ ...request, refetchNoAuth: false }, responseWithStatus));
1695
+ }
1687
1696
  if (request.defaultResponse) {
1688
1697
  const defaultResponse = typeof request.defaultResponse === "function"
1689
1698
  ? request.defaultResponse()