@kcuf/fetcher-interceptor-login 0.2.9 → 0.3.1

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/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ## 前提
8
8
 
9
- 拦截器内部会判断 `error.name` 和 `error.code`,只有业务错误才会继续处理登录逻辑,因此需要 `@kcuf/fetcher-interceptor-biz`。
9
+ 拦截器内部使用 `error.code` 判断是否需要拦截。
10
10
 
11
11
  ## 使用
12
12
 
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.MESSAGE_TYPE_LOGIN_SUCCESS = exports.MESSAGE_TYPE_LOGIN_ERROR = void 0;
7
+ var MESSAGE_TYPE_LOGIN_SUCCESS = exports.MESSAGE_TYPE_LOGIN_SUCCESS = 'fetcher-interceptor-login:success';
8
+ var MESSAGE_TYPE_LOGIN_ERROR = exports.MESSAGE_TYPE_LOGIN_ERROR = 'fetcher-interceptor-login:error';
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ Object.defineProperty(exports, "messageListenInterceptorLogin", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _messageListenInterceptorLogin.default;
11
+ }
12
+ });
13
+ var _messageListenInterceptorLogin = _interopRequireDefault(require("./message-listen-interceptor-login"));
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = messageListenInterceptorLogin;
8
+ var _messenger = _interopRequireDefault(require("@kcuf/messenger"));
9
+ var _const = require("../const");
10
+ /**
11
+ * 通常情况下,我们不需要这个,但如果一个应用里有两个不同实例的 fetcher,两个可能同时被调用,就有可能同时触发登录,
12
+ * 这时候就需要用它在登录动作中使用 messageListenInterceptorLogin 来自动触发登录的返回
13
+ */
14
+ function messageListenInterceptorLogin(callback) {
15
+ var offSuccess = _messenger.default.on(_const.MESSAGE_TYPE_LOGIN_SUCCESS, function (payload) {
16
+ return callback(true, payload);
17
+ });
18
+ var offError = _messenger.default.on(_const.MESSAGE_TYPE_LOGIN_ERROR, function (payload) {
19
+ return callback(false, payload);
20
+ });
21
+ return function () {
22
+ offSuccess();
23
+ offError();
24
+ };
25
+ }
package/dist/cjs/index.js CHANGED
@@ -4,10 +4,23 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ var _exportNames = {};
7
8
  Object.defineProperty(exports, "default", {
8
9
  enumerable: true,
9
10
  get: function get() {
10
11
  return _intercept.default;
11
12
  }
12
13
  });
13
- var _intercept = _interopRequireDefault(require("./util/intercept"));
14
+ var _intercept = _interopRequireDefault(require("./util/intercept"));
15
+ var _helper = require("./helper");
16
+ Object.keys(_helper).forEach(function (key) {
17
+ if (key === "default" || key === "__esModule") return;
18
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
19
+ if (key in exports && exports[key] === _helper[key]) return;
20
+ Object.defineProperty(exports, key, {
21
+ enumerable: true,
22
+ get: function get() {
23
+ return _helper[key];
24
+ }
25
+ });
26
+ });
@@ -5,8 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = createInterceptorResponseRejected;
8
- var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
9
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
8
  var _fetcher = require("@kcuf/fetcher");
11
9
  var _singletonPromise = _interopRequireDefault(require("./singleton-promise"));
12
10
  function createInterceptorResponseRejected(_ref) {
@@ -14,36 +12,20 @@ function createInterceptorResponseRejected(_ref) {
14
12
  doLogin = _ref.doLogin,
15
13
  headerKeys = _ref.headerKeys;
16
14
  var singletonLogin = (0, _singletonPromise.default)(doLogin);
17
- return /*#__PURE__*/function () {
18
- var _ref2 = (0, _asyncToGenerator2.default)(/*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(error, fetcherConfig, _, requestByInterceptor) {
19
- var _error$code;
20
- return (0, _regeneratorRuntime2.default)().wrap(function (_context) {
21
- while (1) switch (_context.prev = _context.next) {
22
- case 0:
23
- if (needLogin((_error$code = error.code) !== null && _error$code !== void 0 ? _error$code : '', error)) {
24
- _context.next = 1;
25
- break;
26
- }
27
- throw error;
28
- case 1:
29
- return _context.abrupt("return", singletonLogin().then(function () {
30
- if (headerKeys) {
31
- (0, _fetcher.deleteConfigHeaders)(fetcherConfig, headerKeys);
32
- }
33
- return requestByInterceptor(fetcherConfig); // 登录完成,重新发起原请求
34
- }, function () {
35
- // 一般登录弹窗在登录成功之前是不应该被关闭或取消的,但若真允许取消,这里需要修改错误为「取消登录」
36
- error.name = _fetcher.FetcherErrorName.LOGIN_CANCELLED;
37
- throw error; // 以新的 name 继续抛错
38
- }));
39
- case 2:
40
- case "end":
41
- return _context.stop();
42
- }
43
- }, _callee);
44
- }));
45
- return function (_x, _x2, _x3, _x4) {
46
- return _ref2.apply(this, arguments);
47
- };
48
- }();
15
+ return function (error, fetcherConfig, _, requestByInterceptor) {
16
+ var _error$code;
17
+ if (!needLogin((_error$code = error.code) !== null && _error$code !== void 0 ? _error$code : '', error)) {
18
+ throw error;
19
+ }
20
+ return singletonLogin().then(function () {
21
+ if (headerKeys) {
22
+ (0, _fetcher.deleteConfigHeaders)(fetcherConfig, headerKeys);
23
+ }
24
+ return requestByInterceptor(fetcherConfig); // 登录完成,重新发起原请求
25
+ }, function () {
26
+ // 一般登录弹窗在登录成功之前是不应该被关闭或取消的,但若真允许取消,这里需要修改错误为「取消登录」
27
+ error.name = _fetcher.FetcherErrorName.LOGIN_CANCELLED;
28
+ throw error; // 以新的 name 继续抛错
29
+ });
30
+ };
49
31
  }
@@ -1,19 +1,23 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.default = singletonPromise;
7
8
  var _fetcher = require("@kcuf/fetcher");
9
+ var _messenger = _interopRequireDefault(require("@kcuf/messenger"));
10
+ var _const = require("../const");
8
11
  function singletonPromise(fn) {
9
12
  var queue = null;
10
- function resolveQueue(data) {
13
+ function resolveQueue(responseData) {
11
14
  if (queue) {
12
15
  queue.forEach(function (v) {
13
- v.resolve((0, _fetcher.cloneResponseData)(data));
16
+ v.resolve((0, _fetcher.cloneResponseData)(responseData));
14
17
  });
15
18
  queue = null;
16
19
  }
20
+ _messenger.default.emit(_const.MESSAGE_TYPE_LOGIN_SUCCESS, responseData);
17
21
  }
18
22
  function rejectQueue(err) {
19
23
  if (queue) {
@@ -22,6 +26,7 @@ function singletonPromise(fn) {
22
26
  });
23
27
  queue = null;
24
28
  }
29
+ _messenger.default.emit(_const.MESSAGE_TYPE_LOGIN_ERROR, err);
25
30
  }
26
31
  return function () {
27
32
  if (!queue) {
@@ -0,0 +1,3 @@
1
+ export var MESSAGE_TYPE_LOGIN_SUCCESS = 'fetcher-interceptor-login:success';
2
+ export var MESSAGE_TYPE_LOGIN_ERROR = 'fetcher-interceptor-login:error';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["MESSAGE_TYPE_LOGIN_SUCCESS","MESSAGE_TYPE_LOGIN_ERROR"],"sources":["../../../src/const/index.ts"],"sourcesContent":["export const MESSAGE_TYPE_LOGIN_SUCCESS = 'fetcher-interceptor-login:success';\nexport const MESSAGE_TYPE_LOGIN_ERROR = 'fetcher-interceptor-login:error';\n"],"mappings":"AAAA,OAAO,IAAMA,0BAA0B,GAAG,mCAAmC;AAC7E,OAAO,IAAMC,wBAAwB,GAAG,iCAAiC","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export { default as messageListenInterceptorLogin } from './message-listen-interceptor-login';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["default","messageListenInterceptorLogin"],"sources":["../../../src/helper/index.ts"],"sourcesContent":["export { default as messageListenInterceptorLogin } from './message-listen-interceptor-login';\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,6BAA6B,QAAQ,oCAAoC","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ import messenger from '@kcuf/messenger';
2
+ import { MESSAGE_TYPE_LOGIN_SUCCESS, MESSAGE_TYPE_LOGIN_ERROR } from '../const';
3
+
4
+ /**
5
+ * 通常情况下,我们不需要这个,但如果一个应用里有两个不同实例的 fetcher,两个可能同时被调用,就有可能同时触发登录,
6
+ * 这时候就需要用它在登录动作中使用 messageListenInterceptorLogin 来自动触发登录的返回
7
+ */
8
+ export default function messageListenInterceptorLogin(callback) {
9
+ var offSuccess = messenger.on(MESSAGE_TYPE_LOGIN_SUCCESS, function (payload) {
10
+ return callback(true, payload);
11
+ });
12
+ var offError = messenger.on(MESSAGE_TYPE_LOGIN_ERROR, function (payload) {
13
+ return callback(false, payload);
14
+ });
15
+ return function () {
16
+ offSuccess();
17
+ offError();
18
+ };
19
+ }
20
+ //# sourceMappingURL=message-listen-interceptor-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-listen-interceptor-login.js","names":["messenger","MESSAGE_TYPE_LOGIN_SUCCESS","MESSAGE_TYPE_LOGIN_ERROR","messageListenInterceptorLogin","callback","offSuccess","on","payload","offError"],"sources":["../../../src/helper/message-listen-interceptor-login.ts"],"sourcesContent":["import messenger from '@kcuf/messenger';\n\nimport {\n MESSAGE_TYPE_LOGIN_SUCCESS,\n MESSAGE_TYPE_LOGIN_ERROR\n} from '../const';\n\n/**\n * 通常情况下,我们不需要这个,但如果一个应用里有两个不同实例的 fetcher,两个可能同时被调用,就有可能同时触发登录,\n * 这时候就需要用它在登录动作中使用 messageListenInterceptorLogin 来自动触发登录的返回\n */\nexport default function messageListenInterceptorLogin(callback: (logged: boolean, payload?: unknown) => void): () => void {\n const offSuccess = messenger.on(MESSAGE_TYPE_LOGIN_SUCCESS, payload => callback(true, payload));\n const offError = messenger.on(MESSAGE_TYPE_LOGIN_ERROR, payload => callback(false, payload));\n \n return () => {\n offSuccess();\n offError();\n };\n}\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,iBAAiB;AAEvC,SACEC,0BAA0B,EAC1BC,wBAAwB,QACnB,UAAU;;AAEjB;AACA;AACA;AACA;AACA,eAAe,SAASC,6BAA6BA,CAACC,QAAsD,EAAc;EACxH,IAAMC,UAAU,GAAGL,SAAS,CAACM,EAAE,CAACL,0BAA0B,EAAE,UAAAM,OAAO;IAAA,OAAIH,QAAQ,CAAC,IAAI,EAAEG,OAAO,CAAC;EAAA,EAAC;EAC/F,IAAMC,QAAQ,GAAGR,SAAS,CAACM,EAAE,CAACJ,wBAAwB,EAAE,UAAAK,OAAO;IAAA,OAAIH,QAAQ,CAAC,KAAK,EAAEG,OAAO,CAAC;EAAA,EAAC;EAE5F,OAAO,YAAM;IACXF,UAAU,CAAC,CAAC;IACZG,QAAQ,CAAC,CAAC;EACZ,CAAC;AACH","ignoreList":[]}
package/dist/esm/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { default } from './util/intercept';
2
+ export * from './helper';
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["default"],"sources":["../../src/index.ts"],"sourcesContent":["export { default } from './util/intercept';\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,kBAAkB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["default"],"sources":["../../src/index.ts"],"sourcesContent":["export { default } from './util/intercept';\n\nexport * from './helper';\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,kBAAkB;AAE1C,cAAc,UAAU","ignoreList":[]}
@@ -1,5 +1,3 @@
1
- import _regeneratorRuntime from "@babel/runtime/helpers/regeneratorRuntime";
2
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
1
  import { FetcherErrorName, deleteConfigHeaders } from '@kcuf/fetcher';
4
2
  import singletonPromise from './singleton-promise';
5
3
  export default function createInterceptorResponseRejected(_ref) {
@@ -7,37 +5,21 @@ export default function createInterceptorResponseRejected(_ref) {
7
5
  doLogin = _ref.doLogin,
8
6
  headerKeys = _ref.headerKeys;
9
7
  var singletonLogin = singletonPromise(doLogin);
10
- return /*#__PURE__*/function () {
11
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(error, fetcherConfig, _, requestByInterceptor) {
12
- var _error$code;
13
- return _regeneratorRuntime().wrap(function (_context) {
14
- while (1) switch (_context.prev = _context.next) {
15
- case 0:
16
- if (needLogin((_error$code = error.code) !== null && _error$code !== void 0 ? _error$code : '', error)) {
17
- _context.next = 1;
18
- break;
19
- }
20
- throw error;
21
- case 1:
22
- return _context.abrupt("return", singletonLogin().then(function () {
23
- if (headerKeys) {
24
- deleteConfigHeaders(fetcherConfig, headerKeys);
25
- }
26
- return requestByInterceptor(fetcherConfig); // 登录完成,重新发起原请求
27
- }, function () {
28
- // 一般登录弹窗在登录成功之前是不应该被关闭或取消的,但若真允许取消,这里需要修改错误为「取消登录」
29
- error.name = FetcherErrorName.LOGIN_CANCELLED;
30
- throw error; // 以新的 name 继续抛错
31
- }));
32
- case 2:
33
- case "end":
34
- return _context.stop();
35
- }
36
- }, _callee);
37
- }));
38
- return function (_x, _x2, _x3, _x4) {
39
- return _ref2.apply(this, arguments);
40
- };
41
- }();
8
+ return function (error, fetcherConfig, _, requestByInterceptor) {
9
+ var _error$code;
10
+ if (!needLogin((_error$code = error.code) !== null && _error$code !== void 0 ? _error$code : '', error)) {
11
+ throw error;
12
+ }
13
+ return singletonLogin().then(function () {
14
+ if (headerKeys) {
15
+ deleteConfigHeaders(fetcherConfig, headerKeys);
16
+ }
17
+ return requestByInterceptor(fetcherConfig); // 登录完成,重新发起原请求
18
+ }, function () {
19
+ // 一般登录弹窗在登录成功之前是不应该被关闭或取消的,但若真允许取消,这里需要修改错误为「取消登录」
20
+ error.name = FetcherErrorName.LOGIN_CANCELLED;
21
+ throw error; // 以新的 name 继续抛错
22
+ });
23
+ };
42
24
  }
43
25
  //# sourceMappingURL=create-interceptor-response-rejected.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-interceptor-response-rejected.js","names":["FetcherErrorName","deleteConfigHeaders","singletonPromise","createInterceptorResponseRejected","_ref","needLogin","doLogin","headerKeys","singletonLogin","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","error","fetcherConfig","_","requestByInterceptor","_error$code","wrap","_context","prev","next","code","abrupt","then","name","LOGIN_CANCELLED","stop","_x","_x2","_x3","_x4","apply","arguments"],"sources":["../../../src/util/create-interceptor-response-rejected.ts"],"sourcesContent":["import {\n FetcherErrorName,\n FetcherConfig,\n FetcherError,\n FetcherResponse,\n FetcherCallRequest,\n FetcherInterceptResponseRejected,\n deleteConfigHeaders\n} from '@kcuf/fetcher';\n\nimport {\n ICreateInterceptorOptions\n} from '../types';\n\nimport singletonPromise from './singleton-promise';\n\nexport default function createInterceptorResponseRejected({\n needLogin,\n doLogin,\n headerKeys\n}: ICreateInterceptorOptions): FetcherInterceptResponseRejected {\n const singletonLogin = singletonPromise(doLogin);\n \n return async (error: FetcherError, fetcherConfig: FetcherConfig, _: FetcherResponse | undefined, requestByInterceptor: FetcherCallRequest) => {\n if (!needLogin(error.code ?? '', error)) {\n throw error;\n }\n \n return singletonLogin().then(() => {\n if (headerKeys) {\n deleteConfigHeaders(fetcherConfig, headerKeys);\n }\n \n return requestByInterceptor(fetcherConfig); // 登录完成,重新发起原请求\n }, () => {\n // 一般登录弹窗在登录成功之前是不应该被关闭或取消的,但若真允许取消,这里需要修改错误为「取消登录」\n error.name = FetcherErrorName.LOGIN_CANCELLED;\n \n throw error; // 以新的 name 继续抛错\n });\n };\n}\n"],"mappings":";;AAAA,SACEA,gBAAgB,EAMhBC,mBAAmB,QACd,eAAe;AAMtB,OAAOC,gBAAgB,MAAM,qBAAqB;AAElD,eAAe,SAASC,iCAAiCA,CAAAC,IAAA,EAIO;EAAA,IAH9DC,SAAS,GAAAD,IAAA,CAATC,SAAS;IACTC,OAAO,GAAAF,IAAA,CAAPE,OAAO;IACPC,UAAU,GAAAH,IAAA,CAAVG,UAAU;EAEV,IAAMC,cAAc,GAAGN,gBAAgB,CAACI,OAAO,CAAC;EAEhD;IAAA,IAAAG,KAAA,GAAAC,iBAAA,cAAAC,mBAAA,GAAAC,IAAA,CAAO,SAAAC,QAAOC,KAAmB,EAAEC,aAA4B,EAAEC,CAA8B,EAAEC,oBAAwC;MAAA,IAAAC,WAAA;MAAA,OAAAP,mBAAA,GAAAQ,IAAA,WAAAC,QAAA;QAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;UAAA;YAAA,IAClIjB,SAAS,EAAAa,WAAA,GAACJ,KAAK,CAACS,IAAI,cAAAL,WAAA,cAAAA,WAAA,GAAI,EAAE,EAAEJ,KAAK,CAAC;cAAAM,QAAA,CAAAE,IAAA;cAAA;YAAA;YAAA,MAC/BR,KAAK;UAAA;YAAA,OAAAM,QAAA,CAAAI,MAAA,WAGNhB,cAAc,CAAC,CAAC,CAACiB,IAAI,CAAC,YAAM;cACjC,IAAIlB,UAAU,EAAE;gBACdN,mBAAmB,CAACc,aAAa,EAAER,UAAU,CAAC;cAChD;cAEA,OAAOU,oBAAoB,CAACF,aAAa,CAAC,CAAC,CAAC;YAC9C,CAAC,EAAE,YAAM;cACP;cACAD,KAAK,CAACY,IAAI,GAAG1B,gBAAgB,CAAC2B,eAAe;cAE7C,MAAMb,KAAK,CAAC,CAAC;YACf,CAAC,CAAC;UAAA;UAAA;YAAA,OAAAM,QAAA,CAAAQ,IAAA;QAAA;MAAA,GAAAf,OAAA;IAAA,CACH;IAAA,iBAAAgB,EAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA;MAAA,OAAAvB,KAAA,CAAAwB,KAAA,OAAAC,SAAA;IAAA;EAAA;AACH","ignoreList":[]}
1
+ {"version":3,"file":"create-interceptor-response-rejected.js","names":["FetcherErrorName","deleteConfigHeaders","singletonPromise","createInterceptorResponseRejected","_ref","needLogin","doLogin","headerKeys","singletonLogin","error","fetcherConfig","_","requestByInterceptor","_error$code","code","then","name","LOGIN_CANCELLED"],"sources":["../../../src/util/create-interceptor-response-rejected.ts"],"sourcesContent":["import {\n FetcherErrorName,\n FetcherConfig,\n FetcherError,\n FetcherResponse,\n FetcherCallRequest,\n FetcherInterceptResponseRejected,\n deleteConfigHeaders\n} from '@kcuf/fetcher';\n\nimport {\n ICreateInterceptorOptions\n} from '../types';\n\nimport singletonPromise from './singleton-promise';\n\nexport default function createInterceptorResponseRejected({\n needLogin,\n doLogin,\n headerKeys\n}: ICreateInterceptorOptions): FetcherInterceptResponseRejected {\n const singletonLogin = singletonPromise(doLogin);\n \n return (error: FetcherError, fetcherConfig: FetcherConfig, _: FetcherResponse | undefined, requestByInterceptor: FetcherCallRequest) => {\n if (!needLogin(error.code ?? '', error)) {\n throw error;\n }\n \n return singletonLogin().then(() => {\n if (headerKeys) {\n deleteConfigHeaders(fetcherConfig, headerKeys);\n }\n \n return requestByInterceptor(fetcherConfig); // 登录完成,重新发起原请求\n }, () => {\n // 一般登录弹窗在登录成功之前是不应该被关闭或取消的,但若真允许取消,这里需要修改错误为「取消登录」\n error.name = FetcherErrorName.LOGIN_CANCELLED;\n \n throw error; // 以新的 name 继续抛错\n });\n };\n}\n"],"mappings":"AAAA,SACEA,gBAAgB,EAMhBC,mBAAmB,QACd,eAAe;AAMtB,OAAOC,gBAAgB,MAAM,qBAAqB;AAElD,eAAe,SAASC,iCAAiCA,CAAAC,IAAA,EAIO;EAAA,IAH9DC,SAAS,GAAAD,IAAA,CAATC,SAAS;IACTC,OAAO,GAAAF,IAAA,CAAPE,OAAO;IACPC,UAAU,GAAAH,IAAA,CAAVG,UAAU;EAEV,IAAMC,cAAc,GAAGN,gBAAgB,CAACI,OAAO,CAAC;EAEhD,OAAO,UAACG,KAAmB,EAAEC,aAA4B,EAAEC,CAA8B,EAAEC,oBAAwC,EAAK;IAAA,IAAAC,WAAA;IACtI,IAAI,CAACR,SAAS,EAAAQ,WAAA,GAACJ,KAAK,CAACK,IAAI,cAAAD,WAAA,cAAAA,WAAA,GAAI,EAAE,EAAEJ,KAAK,CAAC,EAAE;MACvC,MAAMA,KAAK;IACb;IAEA,OAAOD,cAAc,CAAC,CAAC,CAACO,IAAI,CAAC,YAAM;MACjC,IAAIR,UAAU,EAAE;QACdN,mBAAmB,CAACS,aAAa,EAAEH,UAAU,CAAC;MAChD;MAEA,OAAOK,oBAAoB,CAACF,aAAa,CAAC,CAAC,CAAC;IAC9C,CAAC,EAAE,YAAM;MACP;MACAD,KAAK,CAACO,IAAI,GAAGhB,gBAAgB,CAACiB,eAAe;MAE7C,MAAMR,KAAK,CAAC,CAAC;IACf,CAAC,CAAC;EACJ,CAAC;AACH","ignoreList":[]}
@@ -1,13 +1,16 @@
1
1
  import { cloneResponseData } from '@kcuf/fetcher';
2
+ import messenger from '@kcuf/messenger';
3
+ import { MESSAGE_TYPE_LOGIN_SUCCESS, MESSAGE_TYPE_LOGIN_ERROR } from '../const';
2
4
  export default function singletonPromise(fn) {
3
5
  var queue = null;
4
- function resolveQueue(data) {
6
+ function resolveQueue(responseData) {
5
7
  if (queue) {
6
8
  queue.forEach(function (v) {
7
- v.resolve(cloneResponseData(data));
9
+ v.resolve(cloneResponseData(responseData));
8
10
  });
9
11
  queue = null;
10
12
  }
13
+ messenger.emit(MESSAGE_TYPE_LOGIN_SUCCESS, responseData);
11
14
  }
12
15
  function rejectQueue(err) {
13
16
  if (queue) {
@@ -16,6 +19,7 @@ export default function singletonPromise(fn) {
16
19
  });
17
20
  queue = null;
18
21
  }
22
+ messenger.emit(MESSAGE_TYPE_LOGIN_ERROR, err);
19
23
  }
20
24
  return function () {
21
25
  if (!queue) {
@@ -1 +1 @@
1
- {"version":3,"file":"singleton-promise.js","names":["cloneResponseData","singletonPromise","fn","queue","resolveQueue","data","forEach","v","resolve","rejectQueue","err","reject","promise","Promise","_queue","push","length","then"],"sources":["../../../src/util/singleton-promise.ts"],"sourcesContent":["import {\n cloneResponseData\n} from '@kcuf/fetcher';\n\ninterface IPromiseQueueItem<T = void, E extends Error = Error> {\n resolve(data: T): void;\n reject(err: E): void;\n}\n\nexport default function singletonPromise<T>(fn: () => Promise<T>): () => Promise<T> {\n let queue: IPromiseQueueItem<T>[] | null = null;\n \n function resolveQueue(data: T): void {\n if (queue) {\n queue.forEach(v => {\n v.resolve(cloneResponseData(data));\n });\n \n queue = null;\n }\n }\n \n function rejectQueue(err: Error): void {\n if (queue) {\n queue.forEach(v => {\n v.reject(err);\n });\n \n queue = null;\n }\n }\n \n return (): Promise<T> => {\n if (!queue) {\n queue = [];\n }\n \n const promise = new Promise<T>((resolve, reject) => {\n queue?.push({\n resolve,\n reject\n });\n });\n \n if (queue.length === 1) {\n fn().then(data => resolveQueue(data), err => rejectQueue(err));\n }\n \n return promise;\n };\n}\n"],"mappings":"AAAA,SACEA,iBAAiB,QACZ,eAAe;AAOtB,eAAe,SAASC,gBAAgBA,CAAIC,EAAoB,EAAoB;EAClF,IAAIC,KAAoC,GAAG,IAAI;EAE/C,SAASC,YAAYA,CAACC,IAAO,EAAQ;IACnC,IAAIF,KAAK,EAAE;MACTA,KAAK,CAACG,OAAO,CAAC,UAAAC,CAAC,EAAI;QACjBA,CAAC,CAACC,OAAO,CAACR,iBAAiB,CAACK,IAAI,CAAC,CAAC;MACpC,CAAC,CAAC;MAEFF,KAAK,GAAG,IAAI;IACd;EACF;EAEA,SAASM,WAAWA,CAACC,GAAU,EAAQ;IACrC,IAAIP,KAAK,EAAE;MACTA,KAAK,CAACG,OAAO,CAAC,UAAAC,CAAC,EAAI;QACjBA,CAAC,CAACI,MAAM,CAACD,GAAG,CAAC;MACf,CAAC,CAAC;MAEFP,KAAK,GAAG,IAAI;IACd;EACF;EAEA,OAAO,YAAkB;IACvB,IAAI,CAACA,KAAK,EAAE;MACVA,KAAK,GAAG,EAAE;IACZ;IAEA,IAAMS,OAAO,GAAG,IAAIC,OAAO,CAAI,UAACL,OAAO,EAAEG,MAAM,EAAK;MAAA,IAAAG,MAAA;MAClD,CAAAA,MAAA,GAAAX,KAAK,cAAAW,MAAA,eAALA,MAAA,CAAOC,IAAI,CAAC;QACVP,OAAO,EAAPA,OAAO;QACPG,MAAM,EAANA;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,IAAIR,KAAK,CAACa,MAAM,KAAK,CAAC,EAAE;MACtBd,EAAE,CAAC,CAAC,CAACe,IAAI,CAAC,UAAAZ,IAAI;QAAA,OAAID,YAAY,CAACC,IAAI,CAAC;MAAA,GAAE,UAAAK,GAAG;QAAA,OAAID,WAAW,CAACC,GAAG,CAAC;MAAA,EAAC;IAChE;IAEA,OAAOE,OAAO;EAChB,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"singleton-promise.js","names":["cloneResponseData","messenger","MESSAGE_TYPE_LOGIN_SUCCESS","MESSAGE_TYPE_LOGIN_ERROR","singletonPromise","fn","queue","resolveQueue","responseData","forEach","v","resolve","emit","rejectQueue","err","reject","promise","Promise","_queue","push","length","then","data"],"sources":["../../../src/util/singleton-promise.ts"],"sourcesContent":["import {\n cloneResponseData\n} from '@kcuf/fetcher';\nimport messenger from '@kcuf/messenger';\n\nimport {\n MESSAGE_TYPE_LOGIN_SUCCESS,\n MESSAGE_TYPE_LOGIN_ERROR\n} from '../const';\n\ninterface IPromiseQueueItem<T = void, E extends Error = Error> {\n resolve(data: T): void;\n reject(err: E): void;\n}\n\nexport default function singletonPromise<T>(fn: () => Promise<T>): () => Promise<T> {\n let queue: IPromiseQueueItem<T>[] | null = null;\n \n function resolveQueue(responseData: T): void {\n if (queue) {\n queue.forEach(v => {\n v.resolve(cloneResponseData(responseData));\n });\n \n queue = null;\n }\n \n messenger.emit(MESSAGE_TYPE_LOGIN_SUCCESS, responseData);\n }\n \n function rejectQueue(err: Error): void {\n if (queue) {\n queue.forEach(v => {\n v.reject(err);\n });\n \n queue = null;\n }\n \n messenger.emit(MESSAGE_TYPE_LOGIN_ERROR, err);\n }\n \n return (): Promise<T> => {\n if (!queue) {\n queue = [];\n }\n \n const promise = new Promise<T>((resolve, reject) => {\n queue?.push({\n resolve,\n reject\n });\n });\n \n if (queue.length === 1) {\n fn().then(data => resolveQueue(data), (err: unknown) => rejectQueue(err as Error));\n }\n \n return promise;\n };\n}\n"],"mappings":"AAAA,SACEA,iBAAiB,QACZ,eAAe;AACtB,OAAOC,SAAS,MAAM,iBAAiB;AAEvC,SACEC,0BAA0B,EAC1BC,wBAAwB,QACnB,UAAU;AAOjB,eAAe,SAASC,gBAAgBA,CAAIC,EAAoB,EAAoB;EAClF,IAAIC,KAAoC,GAAG,IAAI;EAE/C,SAASC,YAAYA,CAACC,YAAe,EAAQ;IAC3C,IAAIF,KAAK,EAAE;MACTA,KAAK,CAACG,OAAO,CAAC,UAAAC,CAAC,EAAI;QACjBA,CAAC,CAACC,OAAO,CAACX,iBAAiB,CAACQ,YAAY,CAAC,CAAC;MAC5C,CAAC,CAAC;MAEFF,KAAK,GAAG,IAAI;IACd;IAEAL,SAAS,CAACW,IAAI,CAACV,0BAA0B,EAAEM,YAAY,CAAC;EAC1D;EAEA,SAASK,WAAWA,CAACC,GAAU,EAAQ;IACrC,IAAIR,KAAK,EAAE;MACTA,KAAK,CAACG,OAAO,CAAC,UAAAC,CAAC,EAAI;QACjBA,CAAC,CAACK,MAAM,CAACD,GAAG,CAAC;MACf,CAAC,CAAC;MAEFR,KAAK,GAAG,IAAI;IACd;IAEAL,SAAS,CAACW,IAAI,CAACT,wBAAwB,EAAEW,GAAG,CAAC;EAC/C;EAEA,OAAO,YAAkB;IACvB,IAAI,CAACR,KAAK,EAAE;MACVA,KAAK,GAAG,EAAE;IACZ;IAEA,IAAMU,OAAO,GAAG,IAAIC,OAAO,CAAI,UAACN,OAAO,EAAEI,MAAM,EAAK;MAAA,IAAAG,MAAA;MAClD,CAAAA,MAAA,GAAAZ,KAAK,cAAAY,MAAA,eAALA,MAAA,CAAOC,IAAI,CAAC;QACVR,OAAO,EAAPA,OAAO;QACPI,MAAM,EAANA;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,IAAIT,KAAK,CAACc,MAAM,KAAK,CAAC,EAAE;MACtBf,EAAE,CAAC,CAAC,CAACgB,IAAI,CAAC,UAAAC,IAAI;QAAA,OAAIf,YAAY,CAACe,IAAI,CAAC;MAAA,GAAE,UAACR,GAAY;QAAA,OAAKD,WAAW,CAACC,GAAY,CAAC;MAAA,EAAC;IACpF;IAEA,OAAOE,OAAO;EAChB,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export declare const MESSAGE_TYPE_LOGIN_SUCCESS = "fetcher-interceptor-login:success";
2
+ export declare const MESSAGE_TYPE_LOGIN_ERROR = "fetcher-interceptor-login:error";
@@ -0,0 +1 @@
1
+ export { default as messageListenInterceptorLogin } from './message-listen-interceptor-login';
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 通常情况下,我们不需要这个,但如果一个应用里有两个不同实例的 fetcher,两个可能同时被调用,就有可能同时触发登录,
3
+ * 这时候就需要用它在登录动作中使用 messageListenInterceptorLogin 来自动触发登录的返回
4
+ */
5
+ export default function messageListenInterceptorLogin(callback: (logged: boolean, payload?: unknown) => void): () => void;
@@ -1 +1,2 @@
1
1
  export { default } from './util/intercept';
2
+ export * from './helper';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kcuf/fetcher-interceptor-login",
3
- "version": "0.2.9",
3
+ "version": "0.3.1",
4
4
  "description": "Fetcher interceptor seamless login and redo request.",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -22,24 +22,25 @@
22
22
  "access": "public"
23
23
  },
24
24
  "devDependencies": {
25
- "@babel/cli": "^7.28.3",
26
- "@babel/core": "^7.28.5",
25
+ "@babel/cli": "^7.28.6",
26
+ "@babel/core": "^7.28.6",
27
27
  "@babel/plugin-transform-runtime": "^7.28.5",
28
- "@babel/preset-env": "^7.28.5",
28
+ "@babel/preset-env": "^7.28.6",
29
29
  "@babel/preset-typescript": "^7.28.5",
30
- "@vitest/coverage-v8": "^4.0.13",
30
+ "@vitest/coverage-v8": "^4.0.18",
31
31
  "fetch-mock": "^12.6.0",
32
- "jsdom": "^27.2.0",
32
+ "jsdom": "^27.4.0",
33
33
  "rimraf": "^6.1.2",
34
34
  "typescript": "^5.9.3",
35
- "vitest": "^4.0.13",
36
- "@kcuf/ts-config": "^0.0.1"
35
+ "vitest": "^4.0.18",
36
+ "@kcuf/ts-config": "^0.1.0"
37
37
  },
38
38
  "peerDependencies": {
39
- "@babel/runtime": "^7.x"
39
+ "@babel/runtime": ">=7.0.0"
40
40
  },
41
41
  "dependencies": {
42
- "@kcuf/fetcher": "^0.2.9"
42
+ "@kcuf/fetcher": "^0.2.9",
43
+ "@kcuf/messenger": "^0.0.2"
43
44
  },
44
45
  "scripts": {
45
46
  "build:clean": "rimraf dist",